From 3dc05c1b9d776a468c34b8db23f87ffb9db21cce Mon Sep 17 00:00:00 2001 From: Lennard Brinkhaus Date: Sun, 3 Dec 2023 12:32:13 +0100 Subject: [PATCH] feat: implement day03 --- src/day03.rs | 445 ++++++++++++++++++++++++++++++++++++++ src/input/day03/input.txt | 140 ++++++++++++ src/main.rs | 6 +- 3 files changed, 590 insertions(+), 1 deletion(-) create mode 100644 src/day03.rs create mode 100644 src/input/day03/input.txt diff --git a/src/day03.rs b/src/day03.rs new file mode 100644 index 0000000..14b6607 --- /dev/null +++ b/src/day03.rs @@ -0,0 +1,445 @@ + +pub fn execute_task01(content: &str) { + let sum_of_machine_parts = solve_01(content); + + + + println!("Day03 - Task01 - Sum of Machine-Parts: {}", sum_of_machine_parts) +} + +pub fn execute_task02(content: &str) { + let sum_of_machine_parts = solve_02(content); + + println!("Day03 - Task02 - Sum of Machine-Gears: {}", sum_of_machine_parts) +} + +pub fn solve_01(content: &str) -> i32 { + let map: Vec> = content.lines().map(|line| line.chars().collect()).collect(); + + let (machine_parts, _) = parse_to_parts(map); + + return machine_parts.iter().map(|number| number.parse::().unwrap()).sum(); +} + +pub fn solve_02(content: &str) -> i32 { + let map: Vec> = content.lines().map(|line| line.chars().collect()).collect(); + + let mut data = 0; + + for (row_index, row) in map.iter().enumerate() { + for (col_index, char) in row.iter().enumerate() { + if char == &'*' { + let numbers = get_numbers_around(&map, row_index, col_index); + + if numbers.len() <= 1 { + continue + } + data += numbers + .iter() + .map(|data| data.parse::().unwrap()).product::(); + } + } + } + + return data; +} + +fn get_numbers_around(map: &Vec>, row: usize, col: usize) -> Vec { + let mut nums = vec![]; + + let mut data = String::new(); + + if row > 0 { + let row_data = map.get(row - 1).unwrap(); + let mut data = String::new(); + if col > 0 { + if row_data.get(col - 1).unwrap().is_ascii_digit() { + data.push(row_data.get(col - 1).unwrap().clone()); + + let mut i = 2; + while (col as i32 - i as i32) >= 0 { + if let Some(char) = row_data.get(col - i) { + if char.is_ascii_digit() { + data = char.to_string() + data.as_str(); + } else { + break; + } + } else { + break; + } + + i += 1; + } + } + } + + if row_data.get(col).unwrap().is_ascii_digit() { + data.push(row_data.get(col).unwrap().clone()) + } else { + if data.len() > 0 { + nums.push(data); + data = String::new() + } + } + + if row_data.len() - 1 > col { + if row_data.get(col + 1).unwrap().is_ascii_digit() { + data.push(row_data.get(col + 1).unwrap().clone()); + + let mut i = 2; + while (col + i) < row_data.len() { + if let Some(char) = row_data.get(col + i) { + if char.is_ascii_digit() { + data.push(char.clone()) + } else { + break; + } + } else { + break; + } + + i += 1; + } + } + } + + if data.len() > 0 { + nums.push(data); + data = String::new() + } + } + + let row_data = map.get(row).unwrap(); + if col > 0 { + if row_data.get(col - 1).unwrap().is_ascii_digit() { + data.push(row_data.get(col - 1).unwrap().clone()); + + let mut i = 2; + while (col as i32 - i as i32) >= 0 { + if let Some(char) = row_data.get(col - i) { + if char.is_ascii_digit() { + data = char.to_string() + data.as_str(); + } else { + break; + } + } else { + break; + } + + i += 1; + } + } + } + + if data.len() > 0 { + nums.push(data); + data = String::new() + } + + if row_data.len() - 1 > col { + if row_data.get(col + 1).unwrap().is_ascii_digit() { + data.push(row_data.get(col + 1).unwrap().clone()); + + let mut i = 2; + while (col + i) < row_data.len() { + if let Some(char) = row_data.get(col + i) { + if char.is_ascii_digit() { + data.push(char.clone()) + } else { + break; + } + } else { + break; + } + + i += 1; + } + } + } + + if data.len() > 0 { + nums.push(data); + data = String::new() + } + + if map.len() - 1 > row { + let row_data = map.get(row + 1).unwrap(); + let mut data = String::new(); + if col > 0 { + if row_data.get(col - 1).unwrap().is_ascii_digit() { + data.push(row_data.get(col - 1).unwrap().clone()); + + let mut i = 2; + while (col as i32 - i as i32) >= 0 { + if let Some(char) = row_data.get(col - i) { + if char.is_ascii_digit() { + data = char.to_string() + data.as_str(); + } else { + break; + } + } else { + break; + } + + i += 1; + } + } + } + + if row_data.get(col).unwrap().is_ascii_digit() { + data.push(row_data.get(col).unwrap().clone()) + } else { + if data.len() > 0 { + nums.push(data); + data = String::new() + } + } + + if row_data.len() - 1 > col { + if row_data.get(col + 1).unwrap().is_ascii_digit() { + data.push(row_data.get(col + 1).unwrap().clone()); + + let mut i = 2; + while (col + i) < row_data.len() { + if let Some(char) = row_data.get(col + i) { + if char.is_ascii_digit() { + data.push(char.clone()) + } else { + break; + } + } else { + break; + } + + i += 1; + } + } + } + + if data.len() > 0 { + nums.push(data); + data = String::new() + } + } + + return nums; +} + +fn get_cords_around(row: usize, col: usize, max_row: usize, max_col: usize) -> Vec<(usize, usize)> { + let mut cords = vec![]; + if row > 0 { + if col > 0 { + cords.push((row - 1, col - 1)); + } + cords.push((row - 1, col)); + if max_col - 1 > col { + cords.push((row - 1, col + 1)); + } + } + + if col > 0 { + cords.push((row, col - 1)); + } + + if max_col - 1 > col { + cords.push((row, col + 1)); + } + + if max_row - 1 > row { + if col > 0 { + cords.push((row + 1, col - 1)); + } + cords.push((row + 1, col)); + if max_col - 1 > col { + cords.push((row + 1, col + 1)); + } + } + + return cords; +} + +fn parse_to_parts(map: Vec>) -> (Vec, Vec) { + let mut machine_part = vec![]; + let mut non_machine_part = vec![]; + + for (row_index, row) in map.iter().enumerate() { + let mut machine = String::new(); + let mut is_machine = false; + + for (col_index, char) in row.iter().enumerate() { + if !char.is_ascii_digit() { + if machine.len() == 0 { + continue + } + + if is_machine { + machine_part.push(machine) + } else { + non_machine_part.push(machine) + } + machine = String::new(); + is_machine = false; + continue + } + + machine.push(char.clone()); + if has_symbol_around(&map, row_index, col_index) { + is_machine = true + } + } + + if machine.len() > 0 { + if is_machine { + machine_part.push(machine) + } else { + non_machine_part.push(machine) + } + } + } + + return (machine_part, non_machine_part) +} + +fn has_symbol_around(map: &Vec>, row: usize, col: usize) -> bool { + if row > 0 { + let row_data = map.get(row - 1).unwrap(); + if col > 0 { + let character = row_data.get(col - 1).unwrap(); + if is_symbol(character) { + return true + } + } + + let character = row_data.get(col).unwrap(); + if is_symbol(character) { + return true + } + + if row_data.len() - 1 > col { + let character = row_data.get(col + 1).unwrap(); + if is_symbol(character) { + return true + } + } + } + + let row_data = map.get(row).unwrap(); + if col > 0 { + let character = row_data.get(col - 1).unwrap(); + if is_symbol(character) { + return true + } + } + + if row_data.len() - 1 > col { + let character = row_data.get(col + 1).unwrap(); + if is_symbol(character) { + return true + } + } + + if map.len() - 1 > row { + let row_data = map.get(row + 1).unwrap(); + if col > 0 { + let character = row_data.get(col - 1).unwrap(); + if is_symbol(character) { + return true + } + } + + let character = row_data.get(col).unwrap(); + if is_symbol(character) { + return true + } + + if row_data.len() - 1 > col { + let character = row_data.get(col + 1).unwrap(); + if is_symbol(character) { + return true + } + } + } + + return false +} + +pub fn is_symbol(character: &char) -> bool { + let result = match character { + '.' => false, + '0'..='9' => false, + _ => true + }; + + return result; +} + + +#[test] +fn test_solve_01() { + let test_input = r#"467..114.. +...*...... +..35..633. +......#... +617*...... +.....+.58. +..592..... +......755. +...$.*.... +.664.598.."#; + + let solution = solve_01(test_input); + + assert_eq!(4361, solution); +} + +#[test] +fn test_solve_02() { + let test_input = r#"467..114.. +...*...... +..35..633. +......#... +617*...... +.....+.58. +..592..... +......755. +...$.*.... +.664.598.."#; + + let solution = solve_02(test_input); + + assert_eq!(467835, solution); +} + +#[test] +fn test_solve_01_2() { + let test_input = r#"....... +.12*34. +......."#; + + let solution = solve_01(test_input); + + assert_eq!(46, solution); +} + +#[test] +fn test1() { + let data = vec![ + vec!['.','.','.','#','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','#','.','#','.','1'], + vec!['.','1','.','.','2','.','#','3','.','.','4','.','.','5','.','6','.','.','7','#','.','8','.','.','9','.','2'], + vec!['.','.','.','.','.','.','.','.','.','#','.','.','.','#','.','.','#','.','.','.','.','.','.','.','.','.','3'] + + ]; + + assert_eq!(false, has_symbol_around(&data, 1, 1)); + assert_eq!(true, has_symbol_around(&data, 1, 4)); + assert_eq!(true, has_symbol_around(&data, 1, 7)); + assert_eq!(true, has_symbol_around(&data, 1, 10)); + assert_eq!(true, has_symbol_around(&data, 1, 13)); + assert_eq!(true, has_symbol_around(&data, 1, 15)); + assert_eq!(true, has_symbol_around(&data, 1, 18)); + assert_eq!(true, has_symbol_around(&data, 1, 21)); + assert_eq!(true, has_symbol_around(&data, 1, 24)); + assert_eq!(false, has_symbol_around(&data, 0, 26)); + assert_eq!(false, has_symbol_around(&data, 1, 26)); + assert_eq!(false, has_symbol_around(&data, 2, 26)); +} \ No newline at end of file diff --git a/src/input/day03/input.txt b/src/input/day03/input.txt new file mode 100644 index 0000000..4c9a7f3 --- /dev/null +++ b/src/input/day03/input.txt @@ -0,0 +1,140 @@ +48.................501....33.....622..............763.........331.................161.683......................................980.......... +...491.842.....948*..................338.....*......=...........-...309.......633*....*....................*990...706...452......*..+....... +...*...*....................426........*..408.........................*............659...............250.........&.......*.....767...403.... +363.....961...959#.508*223......843.406..........690................%..479.....................398.../....*............458.................. +......=.........................................*....@946........767.........907=.................@....158.850..+670..............10*790.... +.......39.306...679.%113...............665....874....................597...................861.........................840...855............ +.................*.........864.....154*....#..............1*......4..........341..................731*..........783.....#.......*204........ +..919...........706.....*......891........840..%473.........379....*149........-..115..519............668..........*423..................... +...*.................398.190......$.............................#.......=.%530......$..*..............................................475... +.543...@.............................834..729.&.........146......789.189........511...17........455*308..662.............530................ +.....142....437....138*755..&53.....*..........783........./.......................*......................................./....674..315.... +..........-./.......................826...%.....................752........414......480.................276.952...................-...*..... +.......131.......*654..590.................819..........$..........-.347*..................294.....776...&...*........741.....830....230.... +..586%.....968...........+..........319..............628......516............933..........&........+..........600.....*........*............ +............*...................-..*.........................%........................726...876..........772..........99......145......785.. +...........710...............352...842..941...802.....133............474.&235.................*.............*561..........#...........*..... +.......................................=...............*........=...................642.......774......*.........67..@921.374.......165..... +..250........................8..........................968...375........224...#.......*............497.833........-........................ +...$.....................584..*978..107&....471...............................486....408......................................@241.-555..... +......662$........%......&.....................*..#186...550........=309............................76.......399............................ +................281.........808....666.......207.........-...615.................59=....569.....197*...42...%...........572....+231...%..... +....758.$777................%.....*...............433................646.834.............@.............*.........543...................769.. +....*................995...........628...............*..................*..............=..........341...583.112+...*.......74..=341......... +.....775.................................744...278.128.......................126...940.839....=.....*............385.499...*............302. +..........*177...574.............+.......+......*................561#...590.*......$.........231...586....................212...........#... +.......418....................954..433.......484...........526...........*..643......-......................&..778...............701........ +.414..............493.....566.....*......=..................*....236...748..........543...593...*745.......57.........&.........*........... +....*................*.....*....46....659..%.&980..........66....................36...........87...................994.......218...443...... +226.241.893%..........257..312............69........792............/...........+...................$257..................790........./...184 +................................................854*.............909.139..*276.680..&.........432............580....248.................*... +....136*755...@.950......................173.............95..........+...............2.877.......*668......+..+.........918*.......62....571 +............333.*....812...$.428.................*496..................903@...258&.............-........650.................281......+...... +......500.......6....*...719.+......285.......955.....712*12..561.497..............667...&.843..777.................427................@.... +.....&............506..................=..359................#....................*.....24.../.........544.436..........492=........272..... +.........377..........=............41-......+...........229........761...540....391..............*565.....*......449..........665.......#... +.887....*.....906..141.....357...$.................%......*.................#.............-..874......811...9.....*....$113......*.967...628 +......406............../.......637.551....223....162.......251...........................702.*......%......*....&.905.........747........... +....*...........321.....801............=.....-.#...............390........845..12............399...126....283.566.....124*102......&........ +..447..+....935...-..............41.68.87.92...105....178=....*..........*.......*..92..............................................21...... +......505...................................*................614....948..237..512......108.58..162...454@...........395.......5............. +...........454..10.../............101........885.......................*..................*...*....................*........................ +..........%....*....534......114.*................../.95......427.210..674.......371.903......81....................922.....231...346....... +...525........887...........#........162....211..166..@......*.....*.......281......*....................835.635............*.....*.....828. +.....*..............571...............+........-.............933.629./25..*...........977........*............*...........178.....749..*.... +..993.........-................516/................394...56................477....545.*.......251.858......499....435.........&.........170. +.......967..73.....&.....35.........656....842.....*......*........................*...749............%..........#...........622............ +......+...........366.86..*...........#.....=.....162...332.............-..........859............102..488.........................717...... +347.........32........#....393.................*.................252...262....951.......823...................784...358.603.......*.....515. +......917..*.....$..........................642.394..195...*..................*....$......*.448.519................*......*....302..870.*... +...-..*...674.....780.547....287....................*....504...................803.688.831....*..*...........617......./..476........*...9.. +.286..738................#.......-511..11.....581..268.....................439.............523..459...............69..373............887.... +......................*...................555*.........45....638...964.......-...$..........................................88*............. +.........802...+805.77.648.....66.676........................&..../....26......708...+.-981...239%........953..................672.......... +......./.....#.............11.+......*....=...........756.............*.....-......298..................=...*..751.......433.........727.... +....553.......659....907...@......@..530.218.............*......259..821...716.980..........89..851...793.614.......943....*.....961*....... +........*339........$..........373...............................*...............$.....667..$......*..........149.....+..613................ +..987..................*...................670...105.....347....383.605..................@....447...124..........*737...........562..15*445. +........-.....595*7..215.839.781.............*..*...........$.............810....*............*...........350....................*.......... +.........929.............*......*...362@...890...975....#..........2....../...252.576.......78...........+........685.240......695.......... +.................475......598.152........................841.&880..#......................&....693....=.............=.....28........&384.... +............472..*.......................$..320.412*...................304...=.-.........395......=.113....601.............................. +..324.738.........968...................755..*......101.......476..........90..342........................*.....638..182/...........704..139 +.........*..610*......601...................356.../.......633*....971..........................806.....#...240...*...................../.... +........683.....326.....*..@........749.........390.........................163@....800..483..*........792.....94........................... +...600................957..741...../....376............817..899.......194........50.....@....96.368..................@.......+600....-...... +..........338%..........................*...............#....#.........*....304..+....*...........*...................236............284.... +..423........................&763.............947.................371.187..*.......356.441......201.......................285............... +............75................................*....................*......696........................#...............................670.... +...*..........*.........426.......635..-....449.758*.......314.......*..............................246.........*................58..*...... +574.322........937.......*........#...116...........40.......*.@752..400........180....@......918.........195.49......983....559*.....82.... +...........*.........527..842.............................817...................../.270...445..*............*............................... +........622.235..869*..........922*...............125*610..............*459...............&....455...........21.......964................... +...................................465..%542.........................47......272............+..........775.............*.....328.....@...... +.................732*........51.&..........................853.222.........................672....148....+.........572..499.+....*....12.... +....125..............581....*...909.787.......720*263......*....$..881%....623*891..515..........=..................*.........726.78........ +.....%..........715......935.........*....650............874.......................*.........127....................923..................... +................$.............330*..444....$....653............%....345..915.....960.395...........823.706..734.341...............295...342. +.............................................99..-...........465...&......*.............*416......*..........@....*...@......630.....*...... +.....@.........356.......................399.+......+.....................349..................542..............853.375.......=.......132... +....77...=719.@.......*...../662...........*...233...781..............................&687................%................................. +.....................791..................933.*..........931.....884*...........-...................../...112..%601..........857............ +583.....*292...................................438...................424......603.416.........484...104.....................*.......706..... +.............................452.......549.............24...997....................*............*.........767...379..........192............ +........413.................&.....#......*....*.......*.........523.........443.412.....546......859..138*........&..66.576................. +..................../...........348....816.106.391......................447.........../...*..895.......................*................595. +...........#......771.675..................................673............*........176...856..=...627*308..696...............658............ +....489..51...174......%..676......$..........*........332.*.............373.350................-..........*.................*.....*........ +181.*........*...............*822.136..888.642.202.......*..65....958........*........358........510.....*..504..747...993....339..764...... +...........540........................................308...........@.895..942.506......*....791.......166......#...../..../...........668.. +...................452............-....631..............................*........&.....253..../............897......*....602................ +..748....249.24............21...847...&.....194...@...............@...865................................=....*.....550..................... +....*.......*.....658...................573*.......679.....760/..431.................481..........907....130.912...............240...998.... +.605...............*.......25.......#..................................726..646....#..........607..*................698..........*...+...... +...........301&.572........#.....101...................148........55...........*.122........./........953..........-.....602.321.929.....998 +511.870...............@....................808.........*........*............257.......206............@........685..........*............... +.............903...398.....588......114.......*...990...677.....182.10$...........%.........%.................%........................2*... +................*...........*...490...........987....=......803.........98......485.493.868..945.805......-........89............=944....296 +......640.......669.........630..*.......................-....&..582.......341.........*.........*.........939......*....................... +.........*34....................557.....130....265.....21........*...625..$...............*796..690................997...489....293......... +....917.......916............@.................*.................948..&...........148...67..................833........./..........-...943.. +....$........*......849...4$..300..217........58..........................643.170........................................................... +.........511..853......*..............*...........355.............35-.....-....@..636.....=...595..131...496..........................=687.. +............%........&..476......452...435.....%...*.....700..........391........*.....418.........*.........39*.&.......................... +.16...=.............500.....................426...469.....*.............&.....#..522.............939..............395.660................... +...*.696.....*869........995.....413...................864.................991.......598......42.........................@..806..386........ +337.......983.....610........104*.......100*......................-............$79....@...461*....*685...270................*...*........240 +......................207...........311.....741..................337.........*.................381.......*........979.....712.374.879....... +.......@.....554.........*.....485.....................853.............*..276.230...........7...........740...755*..................-....... +....927.../.....#...#...46........*466...........=.................=.531...........593......*..%....................961.....@............... +..........65......294..........................30..339..856.....966...........904..........791..841..........438.......#...747.............. +..419...................614................972.......*...............131.......=.......................716..........21...................... +.....=.79..............................&....*......76.....243..............115.......757...364..870....&...890......+...840..........55..... +....................383....*48...571...124...749............*................-..&.....*......*...*........@.....................201./....... +......752.....470.......+..........*........................964.......452........776...413...9..791...257.......687.....84......*........... +.........*502.*......873..850..573..729....@.....197....................*...798.........................@......*........&.....65...200..357. +...............307.............*..........597.....*...473.....=.......332....*..311..861*399...................472..................*.../... +.820.....................65....754.............713......*.....739...........622...............768/..................................967..... +....*.......180..........*...*.........218...............260......................519...933..........271.....36....132.....147.............. +.935..4......@..254...815..58.689.......*..........................159..............$...*..........*....&...$.......*......../.414*164...... +.......-.388.......%....................284...........833...770...*...........705.....697.......466.239.......332....489.................... +....#.....*...........@.......288............972.........-.*......723.....*....*................................*............=..........592. +...535..........*.267..193.......*..367.....*..............132............509..776.790..@....466..........715.758...*115.....608............ +.............979..*..........8.353.....*...329...@544.913..........................*.....759.*......704..%............................712... +...................52..170...*......459................/...#.......161........813.510.........207......@..........581..................*.... +............#...........*..978...........581.9*815..........450...............*.......................................604.......308...725... +............16.........269............../.............195........217*216......890......................534.....84......-......-............. +....339...........................459.......644..........*.........................636.....113...%154...*....................127.....#348... +349...*.............402...735......@................182.121...134........%255.276...%...&.../............460....#......79................... +....503....22.............#.....$............38.....+...........*....-11.......*......326...../....*853.........216......*.../180.....16.... +..........*......92.............456..619......*..-...........=...103..........190..........353..982......25*........465.209................. +...485.350..........949...994.......*....379..3.22........972.........713.734.........262...........$.......846.......*.............333-.... +....................*..../....*121.729..+............325.............*.......*..........*........374..............+..769.....811............ +......-..............788...488....................................851....679......*......487.....................368.........*........*..... +....612..528...255.................364.....................130.................317..251...............................665.206..972.957.184.. +..........*..../.......337..475*......&..391...347...795....*.........................*......722..666...............@....................... +........823.$.....+.../.........716......*........*....*.....247......329...........697......*.....*....%.....168....624.........592........ +...98*.......916..915......245............277..&..353...719..........$.....................846.601.37...47......................*......519.. +......91..............720..*........$985......976......................834...........461.........*...........................266....#...*... +68....................*....45..............&...........79*888.250*461.*.......%................574..........3*....408..380........383.192... +...........836......383...........557.....672..........................764.....944............................827........................... \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 7d56f66..03d7296 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,11 @@ mod day01; mod utils; mod day02; +mod day03; const CONTENT01: &'static str = include_str!("input/day01/input.txt"); const CONTENT02: &'static str = include_str!("input/day02/input.txt"); +const CONTENT03: &'static str = include_str!("input/day03/input.txt"); fn main() { day01::execute_task01(CONTENT01); @@ -11,5 +13,7 @@ fn main() { println!(); day02::execute_task01(CONTENT02); day02::execute_task02(CONTENT02); - + println!(); + day03::execute_task01(CONTENT03); + day03::execute_task02(CONTENT03); }