From 5e016298c7e87d9383241d9d78921e4d8079b880 Mon Sep 17 00:00:00 2001 From: itsscb Date: Sun, 15 Dec 2024 19:46:18 +0100 Subject: [PATCH] day03 --- Cargo.toml | 2 + src/day03/input.txt | 6 ++ src/day03/mod.rs | 212 ++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/main.rs | 18 +++- 5 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 src/day03/input.txt create mode 100644 src/day03/mod.rs diff --git a/Cargo.toml b/Cargo.toml index d8e887f..55fa809 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,3 +5,5 @@ edition = "2024" [dependencies] clap = "4.5.23" +nom = "7.1.3" +regex = "1.11.1" diff --git a/src/day03/input.txt b/src/day03/input.txt new file mode 100644 index 0000000..1dcf842 --- /dev/null +++ b/src/day03/input.txt @@ -0,0 +1,6 @@ +!mul(417,528)why();what()?how()from()who()where() ~mul(215,18){} ])/from()*do(),)* ##select()mul(89,59):*select(805,600)*mul(709,138)-!how()$+*why(747,290)>mul(548,826)^@-^%@,@mul(103,952)^why():mul(322,877)select()+who()%?[mul(378,598)<;[&(-*' mul(695,169)??where()mul(12,677){$?:(}*why()mul(911,924) *+/select()*/?,from(952,471)mul(12,238))who()(,'^when()mul(462,732)]when()%what()*%${)/mul(66,827)/ where()@!*&@do()}mul(87,111)),:select()mul(891,433)>mul(87,681)]mul(753,736)mul(469,856)@why()}{mul(51,85)why()'@: :,[*do()how()!$[who()mul(877,991)$:'}select()!mul(127,485),}%@,do()@ #{&(select();mul(41,26)}who()!why()^mul(780,997)mul(155,624)/?!, mul(181,7)@?%how()mul(742,580)>(&what()mul(370,366)#[[from()]%where()how()mul(437,895)+@mul(556,541)what()select()(##mul(742,271)<#'select()}}+(%*do()select();>]from()>mul(495,834)(who()why()}^-~:mul(623,691){}where()]mul(755,380):{[ { ;&mul(496,505)*-@();>mul(447,864)select();who()mul(672,810)where()%^;mul(631,935)]don't()*#}#}mul(441,758)>&${@how():[mul(871,857);^,-])**mul(149,63)<*what()mul(159,555)what(){/mul(942,324)({@when()[!mul(484,36)who()!mul(850,799)/^,#/@,@mul(329,433)+)what()why()%how(){mul(444,542)mul(656,517)&~ mul(205,556)what()&']@%;/-,mul(388,422)select()who()]how();{(mul(556,273)when()>&-how()mul(6,7);, [mul(240,752)%@@^do()*&what()mul{/who()where(502,158)select();>mul(332,237)%select();#%)<#mul(726,568)don't()^#!#+ 'mul(507,419):$why()mul(537,103)@>don't()select()+)(*<>+ mul(722,320)(^'?%select()+how()]?mul(881,762)[{where()},don't(),}when()^how(408,817)who()mul(933,318)why()/from()@what()%,//mul(307,701):#^';who(133,506){mul(487when()(mul(487,49)}/mul(509,654)^>mul(307,525)mul(186,292)select()}how()!!;mul(935,682-~>!~' mul(566,401)'-<:select()+$']?mul(179,671)(!mul(111,997)why()when(126,237)^,'@['^mul(258,627)^<%mul(92,748)what()*who()select(657,821)^]^mul(544,427)!?&!from(),(#?mul(90,159){$when()/;/when()mul(81,407)-$}from()when()?how()&-mul(427,159){;[mul(797,616)]how()(@mul(480,791)}]-mul(772,510)-why(462,891)mul(347,567)~<[*mul(717,474)do()$how()mul(905,578)(where()';do()%mul(38,555)$% from(680,344))%~select()mul(62,626)mul(82who()! who()?$:$:,mul(653,287)^;mul(526,575)[/)%[>?>![mul(853,659)why()^ mul(60,505)mul(253,318)mul(933,174)~!why(514,940)how()from(),mul(572,64)who()who()mul(73,528)+who()>#/}$why()select()#mul(911,546who(8,112)]mul(319,153);&-+who()%what()when()select()-mul(84,761)&mul(84,908),!mul(218,854)+#don't()mul(708,742) +?;*(select()&why()mul(902,999)select();-when()[from()mul(423,377)+{ %) ^,why()mul(246,928)who()}mul(927,70)-{how()!,$@where()$who()[@&]@do()'why(138,562),# what()]mul(713,202)<--,)where();{mul(233,873),,don't()-why()mul(61,301),+why()mul(223'/*when()/($mul(847,175)how()?what(),<;^$how();mul(976,577))from()>}mul(302,245)->mul(446,538)@select()#//mul(422,22):$what()]+who()]-;mul(856,262)]mul(881,439)what();/$from()*:mul(758,296)^where()?#@mul(716,279)mul(104,52)]from()where()?(mul(365]mul(59,16)how(997,442)where(844,176)mul(205,444)why():{when()why(381,541):*)+mul(636,976)++&~}#mul(519,587);[<*+how()who()^mul(717,515)from()mul&&$$mul(180,63)!$^mul(797,465)(who()-}what()mul(988,210)select()@where()select()how()!)when()@do()from(767,729)~>what()}mul(864,883)mul(361,638)how()mul(703,895)/;% ,mul(149,597)mul(788,875)^?{what()$&mul(569,626){'where())mulwhere()~from(921,224)/!,':mul(97,835) mul(446,114)$)(,&;who()}']mul(101,565)&*;&}]+mul(611,566)mul(650,460)from()?~-^who(523,336)do()where(961,22)mul;what()-;:;^&$>mul(710,177)mul(301,438)mul(315,413)@}~when()what(451,582)what()where()*from()who()mul(458,465)what()mul(848,195)when()who(676,932)< }*mul(580,113)where(535,4)/-when()select()^why()when()mul(271,737)how()^( ;mul(31,415)?;mul(915,200)<+ where()>^mul(519,208){select(288,908)]where();*who()who()mul(9,52):mul(450,463)what()^>:select()'mul(773,234)*!@>} :mul(764,767)who(),~select()#!:what()]mul(849,737)mul(112,47)&mul(942,605)what()from()mul(207,293)(how(938,318)&]]{'mul(400,524)>what(653,663)]who(481,311)%)(~,+mul(849,23)mul(535,809)where()how()^:? where()mul(688,711)-where()&, '-%^*!mul(614,499)%):~$~%^do()-){%mul(75,117)@why())~what()@,where()mul(514,255),mul(281,798)%?$/why()mul(468,659)why()select()!{why(){}mul(57,359)how()']how()select()}^>why():mul(568,428)when()from()*,(#mul(203,107)'@/$!what():where()^@mul(991,672) ;what(602,659)//mul(285,658)!~<@)/&+<%mul(361,464)@what()why()why()}^ *#mul(658,997) +mul(874,358)'who()?>$!mul(664,429)$;#select()@-~why()-&+@mul(670,732)mul(250,629)*!why()how()why()^!where()mul(160,358)!@?-mul(340,875)select()select()select()why(390,853)++@<(mul(446,277)#how()#!mul(934,452):}@why(),mul(878,762):why(512,389)^select();/what()mul(734,359){$*,$mul(807,660)how()%where()^mul(863,221)do()^#mul(139,324)mul(657,162)select()^^$>(}]},mul(145,462)why()>who()}who(762,591)mul(455,843)/mul(450,804))when();:/ mul(718,128):%$~how()]#mul(855,492)mul(630,688)where()~/+how()}?>mul(946,971):mul(88,670)$-*@[/mul(193,928)why(){when()how()what()mul#[%why()from()}mul(776,879)'how(486,894)>?$^; &/mul(725,446)where(159,316) ]mul(135,955);when()when()+){@where()mul(545,478))mul(593,322)mul(996,385) 'when()]where()when()@{mul(116,9))/,who()#?()$why()mul(716,812)how()%mul(185,170)?who()]:(mul(489,880)-*mul(615,9)<>{who()+?~<'when()mulhow()($[!,}where()do()* why() why()%@mul(831,430);mul(884,837)$?how()mul(971,593)@mul(11,968):*;]]%<+@who()do();'mul(195,287):select()what() '%;?>who()mul(829,334)^#$mul(691,485)select()*where()#(&{:(mul(67,42))+mul(994,216),/;mul(573,201?&?[%what()select()from()mul(923,522)<,mul(582,635)-{how()@^what()#]mul(540,272)&where()<$<]^mul(892,661)~-what()~)/+select()mul-/mul(395,677)-~) ^[mul(283,439)~[&%;!select()how()select()mul(306,827);$what();;mul(715,794){),don't()^+,[},when()^mul(981,859){?where()?+why()#}&mul(760,505)^who()from()' ^)@~mul(5from()how()*don't()%why()%why()select()@mul(366,566)select()#}?how()#mul(880,748)where():select()*don't(),what()when(){'mul(490,454)(mul(184,597)+#who()#who()mul(740,687)]-when()&(~ {&*mul(29,176)mul(391,330)[#[?&$mul(873,461),?*mul?mul(347,627)-who()'!'(/ ,mul(743,456)how(746,704)*#;?+what()do()what()![}why(805,995)mul(476,619)>)+[?mul:[<}>-mul(558,189)what()mul(898,431)~*mul(272,96))@^# mul(114,12)when(855,691){%how()select(288,35)mul(140,45):*mul(618,246)?,*-how()+where(256,285)>'(mul(699,148)~who()mul(576,716)+where())how()mul(194,425)<}!,]$$^why())mul(904,315)what()/mul(576,266)~!mul(760,106)*(who()#]'from()from()mul(238,430)mul(297,50)who()from(62,855)^why()^:who()~ &mul(508,388)-$from()where()select()mul(918,677)!}mul(861,43)mul(364,143))select()+:&>mul(545,492)why()#,when()how())#mul(752,636)(?[#/mul(134,628) -}select()#/select())]mul(739,697)'/@^where()when()#mul(671,108):&mul(537,520)mul(782,162)@~what()?mul(632,411)mul(183,400) +#:how()#!/usr/bin/perlwhy()';!when(707,218)%select()%mul(863,599)who()~ (~mul(259,757),}>~mul(46,54)mul(229,76)];{~ ^what()#{mul(387,490))? ^-#mul(601,351):mul(77,47)^),@$~&@<$don't()from()[;,~@{mul(962,583)what()mul(679,260)* % !$mul(670,236)>what()]select()how()@&where()mul(146,945)why()}*(:mul(597,821))why()%:,[]&mul(789,718who(){'what()@*}mul(987,310)how()#who()-mul(393,516)(,why());;mul(537,865)!:mul(877,754)don't()how()(';select()where()!(@what()mul(946,172)[)}from()where()?how()from()from()who()mul(94,833)%^?&{why()+<]who(275,344)mul(19,81){;} :mul(659,792)-~,mul(422,489),##!mul(167,933)>](mul(547,286)from()@-(~why():!from()mul(26,168)*' ~%&,mul(59,711)#~;mul(954,295)where()don't()- #%where()from()>)+where()mulselect()where()'-where(262,993){%(from(){mul(184,154)?mul(497,2)why()mul(315,343)from()from()*,who(296,797){@mul(140,640)when()who()-who()? %don't()select()who()who(700,153)mul(82,354)('@#?don't()mul(43-what()*^]mul(720,519)%from()mul(290,756)select(){how()mul(22,792)mul(930,773)^+mul<}where()mul(74,878)do()}$,~*&'when()#-mul(884,120)}]^mul(437,916))what())/~don't())]+mul(877,622)~&#,'mul(273,208)when()?how()mul(359,850)?:mul(107,183)mul(2,8)mul(842,948)who()how()[mul(528,204)don't()#~select()when()select()?-mul(107,594)mul(468,837)who()&}, ;^mul(950,280)>%where()how()where()/*mul(651,115)*:}~)from()~#@}mul(309,996)(mul(32,243)who()+(~, */;mul(94,65)>select();&:from()@;what()*mul(620,136)mul(260,479)&why()+?/**{]mul(632,798:[select()*mul(268,303)[&]-^who())!-mul(741,47)~select()when()@why()}^?mul(938,627)what(423,839)-&why(570,484)mul(126,61){/&$-mul(7,354)from()what())do()/; {+mul(110,879)%;#mul(423,374):how()how(142,360)why()*mul(700^~>mul(557,663)}when()mul(751,856)*~mul(504,359)}]@from()*$what():,mul(129,586)where())where(722,43)how()]&&mul(616,487)+who()#^where()^/mul(197,217)when()how()how()#,[,from()^?mul(119,634)+when()who(643,73)mul(555,656)!why()mul(844,315):{/ ('mul(861,130)why(),[who()<[!mul(503,343)mul(572,6)mul(639,136)% why()[where(),mul(840,873)$)don't();:mul(791,309)(where()/)mul(505,475),who())mul(670,413)#+-{who()mul(928,244)when(){#select()where() mul}>! (mul(715,624)*what()!{[}#mul(729,805)'&],[&~($mul(884,813)mul(245,381)&mul(903,569)&from()how(670,55)how()>mul(991,520)}from()~+[?what(260,603)mul(824,70),why(),from(360,613)mul(339,428)when()[,select()?,mul(554,291)@$when(576,686)+mul(258,620)~(>how()mul(847,507)+?'mul(928,901)~}%/when()'mul(17,668)#;don't()()*)&-what()-when()mul(868,538)*(:)mul(604,236)$]mul(235,215) +why()}do()*:/%select(492,745)#*how()mul(103,86)&*#mulhow()mul(205,551)&//%$]why()-/where(63,224)mul(511,903)*$>*who()^%/mul(926,40)'mul(501,105)}~mul(810,253)[ $!^@#! why()mul(189,604) :[don't():[&(select()mul(581,332)who(523,711)}mul(509,879)}+,(]!!{how(332,10)mul(76,822),when()how()~''$what()mul(578,738)+!where()when()*@mul(305,987)^how()mul(206,528)+{,['>mul(558,134)?how()'{-;mul(379,225)how():;> mul(597,224)from()>[how()@ -%#mul(27,716)~%;-}how()where(){mul(524,894)from()<>!&mul(883,525)mul(914,895)from()who()~when()>:-mul(866,183))how()mul(129select()+how()where()~from()%!&)@mul(294,652)@~what()mul(763,956)?mul(830,845)# @[don't()*//<^<&mul(519,852)#+select()when()don't();-when()mul(632,901)'?mul(551,799)]+^^;who()/from()mul(727,533)*>- !where(537,328){mul(909,933)why()?&!)^mul(107,746)--,what()+ mul(153,207)who()-(where()mul(518,977)mul(569,966)mul(8,736)(-}>'mul(325,957)^&?when()mul(638,27)&[*%?what(606,492)where()^mul-mul(759,906)+[}+when()how() 'mul(603,79)<} where()(/[mul(191,666)select()when(),<@:where(950,986)'mul(395,206]who()~how()mul(904,618)-;$&#~(:mul(887,833)?'&how(){:do()}when(616,671)why()/?how(){mul(949,622)]why()$;!why()!mul(895,650)#>/where()}$^?^mul(280,116)'{mul(118,570)*why():}mul(103,762)[(mul(602,859)&mul(637,550)!]where()}:%(mul(661,868)^!select()?when(548,101)when()(mul(978,457)why()mul(421,976)how(714,794)mul(79,487)<*{[+[what()where(425,881)'mul(775,827):mul(260,742)^:~mul(614,982)[$(mulwhen()!%)&mul(271,715)()+;what()&) mul(722,687);*why()^'(,how()from()mul(934,463)-#mul(895,822)why()!];mul(879,833)[-;mul(750,443)':who()?;}why()##mul(214,657)why()+from()&$(mul(509,725)}$why()@when(822,113)!&'when()who()mul(911,719)[; mul(441,647)]<$:mul(714,781)%&@mul(506,291);why(52,660)(mul(471,954)mul(487,853)>*'mul(117,603)mul(26,939)@(^+select()why()select()where()mul(905,612){mul(479,266)how()**where()where()mul(451,254)(select()%{select()-@when() do()when()how()}how()how()mul{' how()&<>]mul(672,957)where()who()select()mul(460,110) -)mul(696,661)how()}how()how() &+do()]!$mul%)%when()}$*>^mul(276,105)~how();what()mul(634,101)who()]why();>$why()[##mul(72,130)''{why()mul(145,383$<,])'how()*why()>?mul(462,95)/}from()select(24,983)-??do()/%>when()how()where()why()(mul(446,844)what()?#;:$mul(539>+^why()!/mul(481,966)~+()#mul(657,897) +^>}^!why()*mul(840,962)what();what(608,116) %?^mul(605,595)<[from()(mul(599,814why()-how()~mul(680,773):+from()~do()#what()when()mul(858,458)(who()select()@;$mul(416,54),why()#^-mul(578,930?*mul(564,323)%:from(79,481)*where()%$mul(604,687)how(239,166)%,where()what();~why()@mul(198,935)@??{why()who()@{mul(43,352)$^!!>{}>#?mul(49,571)when()when()('when()]%mul(296,622)who()*,mul~ how()'*'+,mul(677,166)]#}do()^select())$^+)%mul(242,920);^*where()!?!;(#mul(654,14)who()%* ^~from()}mul(395,534)],~select())-%>when()mul(970,894)^ ?'+,where()where(966,268)how()where()mul(605,722)mul(455,920)(->[[;]mul(977,500)!select()(>?mul(238,178)why()mul'#from()why(757,62)mul(200,544) mul(779,866)@+mul(998,603)#*>+[^where()who()where()?from()/mul(887,533)^%+'^#+/mul(608,818)!when())[select()-select()when() [mul(113,25)~(from()from()mul(56,67)~(;select()what()!{don't()when()[^mul(853,126)*?why(477,36)+mul(963,155)mul(590,355)-#;~mul(546,331))why()@when()mul(337,684)^from()mul(43,674)how();-mul(287,386)from()from() 'how()~]select(857,28)mul(854,565)who()/when()from(848,721)select()who()+mul(899,106){-where()mul(252,283)don't()who()~&]who(){&mul(171,684)%,&mul(649,615);where()[where()from();mul(976,418) -where()-do()'[when()why()&(mul(945,948)when()@-how() ^!}mul(756,439);what()how()^mul(381,579)/mul(654,823)] $>%when()>-why()mul(448,211)^%mul(865,203)$&what()::- mul(536,351)-;mul(792,598)who(329,965)when()mul(669,121)~who()<;@ ~^*mul(382,343)mul(620,103)( Result<(i32, i32), Box> { + let content = fs::read_to_string(path)?; + + let multiplications = extract_multiplications(&content); + let part_one = multiplications.iter().map(|x| multiply(*x)).sum::(); + let multiplications = parse_multiplications_with_rules(&content); + let part_two = multiplications.iter().map(|x| multiply(*x)).sum::(); + Ok((part_one, part_two)) +} + +fn parse_i32_pair(input: &str) -> IResult<&str, (i32, i32)> { + let (input, first) = nom::character::complete::digit1(input)?; + let (input, _) = char(',')(input)?; + let (input, second) = nom::character::complete::digit1(input)?; + Ok((input, (first.parse().unwrap(), second.parse().unwrap()))) +} + +fn parse_mul(input: &str) -> IResult<&str, (i32, i32)> { + delimited(tag("mul("), parse_i32_pair, char(')'))(input) +} + +fn ignore_until_mul(input: &str) -> (&str, &str) { + let pos = input.find("mul(").unwrap_or(input.len()); + (&input[pos..], &input[..pos]) +} + +fn parse_mul_ignore_prefix(input: &str) -> IResult<&str, (i32, i32)> { + let (input, _) = ignore_until_mul(input); + parse_mul(input) +} + +fn get_index_mul_and_stop(input: &str) -> (Option, Option) { + let pos_mul = input.find("mul("); + let pos_stop = input.find("don't()"); + (pos_mul, pos_stop) +} + +fn get_index_start(input: &str) -> Option { + input.find("do()") +} + +fn parse_multiplications_with_rules(input: &str) -> Vec<(i32, i32)> { + let mut results = Vec::new(); + let mut remaining = input; + + let mut parse = true; + + loop { + if parse { + let (pos_mul, pos_stop) = get_index_mul_and_stop(remaining); + match (pos_mul, pos_stop) { + (Some(pos_mul), Some(pos_stop)) => { + if pos_mul < pos_stop { + match parse_mul_ignore_prefix(remaining) { + Ok((next_input, result)) => { + results.push(result); + remaining = next_input; + } + Err(e) => match e { + nom::Err::Error(_) => { + remaining = &remaining[1..]; + continue; + } + e => { + dbg!("Error: {:?}", e); + break; + } + }, + } + } else { + parse = false; + } + } + (Some(_), None) => match parse_mul_ignore_prefix(remaining) { + Ok((next_input, result)) => { + results.push(result); + remaining = next_input; + } + Err(e) => match e { + nom::Err::Error(_) => { + remaining = &remaining[1..]; + continue; + } + e => { + dbg!("Error: {:?}", e); + break; + } + }, + }, + (None, _) => { + break; + } + } + } else { + let pos_start = get_index_start(remaining); + match pos_start { + Some(pos_start) => { + remaining = &remaining[pos_start..]; + parse = true; + } + None => { + break; + } + } + } + } + + results +} + +#[allow(dead_code)] +fn parse_multiplications(input: &str) -> Vec<(i32, i32)> { + let mut results = Vec::new(); + let mut remaining = input; + + loop { + match parse_mul_ignore_prefix(remaining) { + Ok((next_input, result)) => { + results.push(result); + remaining = next_input; + } + Err(e) => match e { + nom::Err::Error(_) => { + remaining = &remaining[1..]; + continue; + } + e => { + dbg!("Error: {:?}", e); + break; + } + }, + } + + // If no 'mul(' is found in the remaining input, break the loop + if !remaining.contains("mul(") { + break; + } + } + + results +} + +#[allow(dead_code)] +fn extract_multiplications(input: &str) -> Vec<(i32, i32)> { + let re = Regex::new("mul\\(\\d{1,3},\\d{1,3}\\)").unwrap(); + + re.captures_iter(input) + .filter_map(|cap| cap.get(0)) + .map(|cap| { + // dbg!(&cap.as_str()); + let m = cap.as_str(); + let m = m.trim_start_matches("mul("); + let m = m.trim_end_matches(')'); + let (a, b) = m.split_once(',').unwrap(); + let a: i32 = a.parse().unwrap(); + let b: i32 = b.parse().unwrap(); + (a, b) + }) + .collect() +} + +#[allow(dead_code)] +const fn multiply(input: (i32, i32)) -> i32 { + input.0 * input.1 +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_day03_part_one() { + let input = "xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))"; + let result_regex = extract_multiplications(input); + + assert_eq!(4, result_regex.len()); + + let want = 161; + let got = result_regex.iter().map(|x| multiply(*x)).sum::(); + assert_eq!(want, got); + + let result = parse_multiplications(input); + assert_eq!(4, result.len()); + assert_eq!(result_regex, result); + } + + #[test] + fn test_day03_part_two() { + let input = "xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))"; + let want = 48; + let result = parse_multiplications_with_rules(input); + + dbg!(&result); + let got = result.iter().map(|x| multiply(*x)).sum::(); + + assert_eq!(want, got); + } +} diff --git a/src/lib.rs b/src/lib.rs index 28326d5..89345b1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1,3 @@ pub mod day01; pub mod day02; +pub mod day03; diff --git a/src/main.rs b/src/main.rs index 218de46..6cf1d95 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use adventofcode_24::{day01::solve_day01, day02::solve_day02}; +use adventofcode_24::{day01::solve_day01, day02::solve_day02, day03::solve_day03}; use clap::{Arg, Command}; fn main() { @@ -16,6 +16,11 @@ fn main() { .short('2') .help("Path to Day 02 Input file"), ) + .arg( + Arg::new("day03") + .short('3') + .help("Path to Day 03 Input file"), + ) .get_matches(); if let Some(file) = matches.get_one::("day01") { @@ -35,4 +40,15 @@ fn main() { Err(e) => eprintln!("{e}"), } } + + if let Some(file) = matches.get_one::("day03") { + match solve_day03(file) { + Ok((r1, r2)) => { + println!( + "Result of Day 02:\nSum of uncorrupted memory multiplications: {r1}\nSum of uncorrupted and enabled memory multiplications: {r2}" + ); + } + Err(e) => eprintln!("{e}"), + } + } }