From 2c7df54f755aa95aacccfa271244127df3468b4b Mon Sep 17 00:00:00 2001 From: Kenneth Gitere Date: Tue, 1 Dec 2020 17:33:32 +0300 Subject: [PATCH] Add submission for Day 1 --- day-1/.gitignore | 10 +++ day-1/day_1.txt | 200 ++++++++++++++++++++++++++++++++++++++++++++++ day-1/src/main.rs | 56 ++++++++++++- 3 files changed, 265 insertions(+), 1 deletion(-) create mode 100644 day-1/.gitignore create mode 100644 day-1/day_1.txt diff --git a/day-1/.gitignore b/day-1/.gitignore new file mode 100644 index 0000000..088ba6b --- /dev/null +++ b/day-1/.gitignore @@ -0,0 +1,10 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk diff --git a/day-1/day_1.txt b/day-1/day_1.txt new file mode 100644 index 0000000..734029f --- /dev/null +++ b/day-1/day_1.txt @@ -0,0 +1,200 @@ +1833 +1949 +1745 +1863 +1422 +1980 +1695 +1233 +1407 +1971 +1486 +1922 +1802 +1689 +214 +1864 +1091 +1395 +1772 +1901 +1542 +1730 +1782 +1815 +1818 +1236 +1604 +1219 +1834 +1813 +1532 +1963 +2003 +1149 +1577 +1408 +1871 +1417 +1727 +1155 +1953 +1287 +1259 +1548 +1126 +1927 +1225 +1172 +11 +1301 +1869 +1808 +1238 +1989 +1027 +321 +1564 +636 +1847 +1877 +1716 +1275 +1738 +1054 +1966 +1019 +1256 +1940 +1821 +1914 +1556 +1389 +1020 +1293 +1935 +1804 +1945 +508 +1856 +1674 +1721 +1541 +1435 +1852 +1394 +2006 +1366 +1473 +1274 +623 +1701 +1842 +1954 +1999 +1195 +1246 +1967 +1153 +1851 +1294 +1152 +1812 +1732 +1030 +1956 +1132 +1948 +1865 +1835 +1231 +1975 +1759 +1843 +1379 +1657 +1267 +1062 +1850 +1817 +1543 +1805 +1252 +1974 +1161 +876 +1647 +1796 +1634 +1177 +1519 +1527 +1249 +1158 +2007 +1702 +1714 +1040 +1826 +1837 +1361 +1814 +1858 +1828 +1951 +1140 +1845 +1476 +1337 +1262 +1923 +1397 +1025 +1412 +1930 +1164 +1300 +1369 +1777 +1591 +1919 +1874 +1482 +2010 +1957 +1897 +1854 +1992 +1735 +1786 +1661 +1404 +1254 +1803 +1794 +1614 +1711 +1007 +1979 +1928 +1505 +2001 +1094 +2005 +1297 +1933 +1976 +1104 +1279 +1012 +1943 +1679 +1958 +1841 +1623 +1809 +1800 +919 +1620 +1936 +1209 diff --git a/day-1/src/main.rs b/day-1/src/main.rs index e7a11a9..3dcb4e9 100644 --- a/day-1/src/main.rs +++ b/day-1/src/main.rs @@ -1,3 +1,57 @@ +use std::collections::HashSet; +use std::fs::File; +use std::io::prelude::*; +use std::iter::FromIterator; fn main() { - println!("Hello, world!"); + let mut file = File::open("day_1.txt").expect("Unable to open input file"); + let mut contents = String::new(); + file.read_to_string(&mut contents) + .expect("Unable to read file contents"); + let expenses = contents + .lines() + .map(|line| line.parse::().expect("Unable to parse value to i32")) + .collect(); + let expense = find_expenses(&expenses, 2020); + if let Some(val) = expense { + println!("{}", val); + } else { + println!("No 2 expenses found summing to 2020") + } + + if let Some(val) = find_expenses_3(&expenses, 2020) { + println!("{}", val) + } else { + println!("No 3 expenses found summing to 2020") + } +} + +fn find_expenses(expenses: &Vec, limit: i32) -> Option { + let mut part_exps: HashSet = HashSet::new(); + let mut res: Option = None; + for expense in expenses { + let part_exp = limit - expense; + if part_exps.contains(&part_exp) { + res = Some(part_exp * expense); + break; + } else { + part_exps.insert(*expense); + } + } + res +} + +fn find_expenses_3(expenses: &Vec, limit: i32) -> Option { + let expenses_set: HashSet<&i32> = HashSet::from_iter(expenses.iter()); + let slash_expenses: Vec = expenses.iter().map(|exp| limit - exp).collect(); + let mut res: Option = None; + for expense in expenses { + for slash_expense in &slash_expenses { + let diff = slash_expense - expense; + if expenses_set.contains(&diff) { + res = Some(diff * expense * (limit - slash_expense)); + return res; + } + } + } + res }