diff --git a/day-1/.gitignore b/day-1/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/day-1/.gitignore @@ -0,0 +1 @@ +/target diff --git a/day-1/Cargo.lock b/day-1/Cargo.lock new file mode 100644 index 0000000..8eabdbb --- /dev/null +++ b/day-1/Cargo.lock @@ -0,0 +1,94 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "day-1" +version = "0.1.0" +dependencies = [ + "indoc", + "itertools", +] + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "indoc" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47741a8bc60fb26eb8d6e0238bbb26d8575ff623fdc97b1a2c00c050b9684ed8" +dependencies = [ + "indoc-impl", + "proc-macro-hack", +] + +[[package]] +name = "indoc-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce046d161f000fffde5f432a0d034d0341dc152643b2598ed5bfce44c4f3a8f0" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", + "unindent", +] + +[[package]] +name = "itertools" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +dependencies = [ + "either", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + +[[package]] +name = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "1.0.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8833e20724c24de12bbaba5ad230ea61c3eafb05b881c7c9d3cfe8638b187e68" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "unindent" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7" diff --git a/day-1/Cargo.toml b/day-1/Cargo.toml new file mode 100644 index 0000000..d36fd62 --- /dev/null +++ b/day-1/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "day-1" +version = "0.1.0" +authors = ["Tristan Daniƫl Maat "] +edition = "2018" + +[dependencies] +indoc = "0.3" +itertools = "0.9" diff --git a/day-1/input b/day-1/input new file mode 100644 index 0000000..f0f6d00 --- /dev/null +++ b/day-1/input @@ -0,0 +1,200 @@ +1429 +1368 +1661 +1687 +1593 +1495 +1565 +1500 +1635 +1845 +1645 +1999 +1415 +1054 +1930 +1774 +1405 +1993 +1757 +1623 +1675 +1665 +631 +1950 +1702 +1311 +1509 +1790 +1643 +1884 +226 +1455 +1679 +1746 +1284 +1342 +1684 +1543 +1396 +1806 +1523 +1363 +1011 +1577 +1767 +1287 +1885 +1517 +1556 +1722 +1260 +1624 +1466 +1263 +1162 +1688 +1202 +1913 +1964 +1385 +1970 +1976 +1431 +858 +1748 +1544 +1438 +1300 +1926 +1587 +1376 +1939 +1039 +1639 +1539 +1491 +1631 +1521 +1564 +1507 +1637 +1534 +1713 +1533 +1118 +1356 +2003 +282 +1079 +1837 +1259 +1941 +1836 +1903 +1433 +1467 +1027 +1441 +1048 +1742 +1087 +1872 +1476 +1657 +1361 +1182 +1494 +1529 +1822 +1444 +1330 +1514 +1723 +1432 +1683 +1997 +1443 +1474 +1932 +1504 +1313 +1765 +19 +1784 +1619 +992 +1560 +1680 +1626 +1558 +1899 +1293 +1676 +1161 +1140 +1341 +1597 +1628 +1611 +1302 +1269 +1241 +1952 +1591 +1726 +428 +1703 +1289 +1109 +1478 +1002 +1817 +1849 +1838 +1319 +1641 +583 +1920 +1453 +1411 +1870 +1763 +1469 +1646 +1719 +1213 +1462 +1545 +1682 +1711 +18 +2004 +1252 +1620 +1559 +1315 +781 +1656 +1987 +1436 +1630 +1985 +1897 +1551 +1296 +1282 +1735 +1320 +1659 +1271 +1380 +1274 +1876 +1492 +1298 +1399 +1692 +1265 +1555 +1337 diff --git a/day-1/src/main.rs b/day-1/src/main.rs new file mode 100644 index 0000000..5bed2dd --- /dev/null +++ b/day-1/src/main.rs @@ -0,0 +1,71 @@ +use std::fs; + +use itertools::Itertools; + +fn main() -> Result<(), Box> { + let input = fs::read_to_string("input")?; + let input = parse_number_list(input)?; + let numbers = find_2020_numbers(input, 3)?; + println!("{}", numbers.iter().product::()); + Ok(()) +} + +fn parse_number_list(input: String) -> Result, std::num::ParseIntError> { + input.lines().map(|line| line.parse::()).collect() +} + +fn find_2020_numbers(input: Vec, sum_number: usize) -> Result, String> { + input + .into_iter() + .combinations(sum_number) + .find(|i| i.iter().sum::() == 2020) + .ok_or("Could not find 2020.".to_string()) +} + +#[cfg(test)] +mod tests { + use super::*; + use indoc::indoc; + + #[test] + fn test_first_example() -> Result<(), Box> { + let example = indoc!( + " + 1721 + 979 + 366 + 299 + 675 + 1456 + " + ); + + let example = parse_number_list(example.to_string())?; + let numbers = find_2020_numbers(example, 2)?; + + assert_eq!(numbers.iter().product::(), 514579); + + Ok(()) + } + + #[test] + fn test_second_example() -> Result<(), Box> { + let example = indoc!( + " + 1721 + 979 + 366 + 299 + 675 + 1456 + " + ); + + let example = parse_number_list(example.to_string())?; + let numbers = find_2020_numbers(example, 3)?; + + assert_eq!(numbers.iter().to_owned().product::(), 241861950); + + Ok(()) + } +}