From aecb2f227841155c4be849fdd2e88032d76c04de Mon Sep 17 00:00:00 2001 From: Jos van Goor Date: Sat, 14 Dec 2024 14:51:40 +0100 Subject: [PATCH] Day t/m 6p1 done --- advent_of_code_2024/Cargo.lock | 9 + advent_of_code_2024/Cargo.toml | 1 + advent_of_code_2024/src/day1/part1.rs | 2 +- advent_of_code_2024/src/day1/part2.rs | 2 +- advent_of_code_2024/src/day2/part1.rs | 13 +- advent_of_code_2024/src/day2/part2.rs | 17 +- advent_of_code_2024/src/day3/input.txt | 6 + advent_of_code_2024/src/day3/mod.rs | 3 + advent_of_code_2024/src/day3/part1.rs | 114 ++ advent_of_code_2024/src/day3/part2.rs | 141 ++ advent_of_code_2024/src/day3/test.txt | 1 + advent_of_code_2024/src/day4/input.txt | 140 ++ advent_of_code_2024/src/day4/mod.rs | 3 + advent_of_code_2024/src/day4/part1.rs | 36 + advent_of_code_2024/src/day4/part2.rs | 27 + advent_of_code_2024/src/day4/test.txt | 10 + advent_of_code_2024/src/day5/input.txt | 1369 +++++++++++++++++ advent_of_code_2024/src/day5/mod.rs | 3 + advent_of_code_2024/src/day5/part1.rs | 45 + advent_of_code_2024/src/day5/part2.rs | 66 + advent_of_code_2024/src/day5/test.txt | 28 + advent_of_code_2024/src/day6/input.txt | 130 ++ advent_of_code_2024/src/day6/mod.rs | 3 + advent_of_code_2024/src/day6/part1.rs | 42 + advent_of_code_2024/src/day6/part2.rs | 4 + advent_of_code_2024/src/day6/test.txt | 10 + advent_of_code_2024/src/day7/input.txt | 850 ++++++++++ advent_of_code_2024/src/day7/mod.rs | 3 + advent_of_code_2024/src/day7/part1.rs | 4 + advent_of_code_2024/src/day7/part2.rs | 4 + advent_of_code_2024/src/day8/input.txt | 50 + advent_of_code_2024/src/day8/mod.rs | 3 + advent_of_code_2024/src/day8/part1.rs | 3 + advent_of_code_2024/src/day8/part2.rs | 4 + advent_of_code_2024/src/day9/input.txt | 1 + advent_of_code_2024/src/day9/mod.rs | 3 + advent_of_code_2024/src/day9/part1.rs | 3 + advent_of_code_2024/src/day9/part2.rs | 4 + advent_of_code_2024/src/main.rs | 28 +- .../src/utility/inputstring.rs | 5 + advent_of_code_2024/src/utility/mod.rs | 6 +- advent_of_code_2024/src/utility/solveday.rs | 26 + 42 files changed, 3188 insertions(+), 34 deletions(-) create mode 100644 advent_of_code_2024/src/day3/input.txt create mode 100644 advent_of_code_2024/src/day3/mod.rs create mode 100644 advent_of_code_2024/src/day3/part1.rs create mode 100644 advent_of_code_2024/src/day3/part2.rs create mode 100644 advent_of_code_2024/src/day3/test.txt create mode 100644 advent_of_code_2024/src/day4/input.txt create mode 100644 advent_of_code_2024/src/day4/mod.rs create mode 100644 advent_of_code_2024/src/day4/part1.rs create mode 100644 advent_of_code_2024/src/day4/part2.rs create mode 100644 advent_of_code_2024/src/day4/test.txt create mode 100644 advent_of_code_2024/src/day5/input.txt create mode 100644 advent_of_code_2024/src/day5/mod.rs create mode 100644 advent_of_code_2024/src/day5/part1.rs create mode 100644 advent_of_code_2024/src/day5/part2.rs create mode 100644 advent_of_code_2024/src/day5/test.txt create mode 100644 advent_of_code_2024/src/day6/input.txt create mode 100644 advent_of_code_2024/src/day6/mod.rs create mode 100644 advent_of_code_2024/src/day6/part1.rs create mode 100644 advent_of_code_2024/src/day6/part2.rs create mode 100644 advent_of_code_2024/src/day6/test.txt create mode 100644 advent_of_code_2024/src/day7/input.txt create mode 100644 advent_of_code_2024/src/day7/mod.rs create mode 100644 advent_of_code_2024/src/day7/part1.rs create mode 100644 advent_of_code_2024/src/day7/part2.rs create mode 100644 advent_of_code_2024/src/day8/input.txt create mode 100644 advent_of_code_2024/src/day8/mod.rs create mode 100644 advent_of_code_2024/src/day8/part1.rs create mode 100644 advent_of_code_2024/src/day8/part2.rs create mode 100644 advent_of_code_2024/src/day9/input.txt create mode 100644 advent_of_code_2024/src/day9/mod.rs create mode 100644 advent_of_code_2024/src/day9/part1.rs create mode 100644 advent_of_code_2024/src/day9/part2.rs create mode 100644 advent_of_code_2024/src/utility/solveday.rs diff --git a/advent_of_code_2024/Cargo.lock b/advent_of_code_2024/Cargo.lock index a2a296e..6a5c370 100644 --- a/advent_of_code_2024/Cargo.lock +++ b/advent_of_code_2024/Cargo.lock @@ -5,3 +5,12 @@ version = 3 [[package]] name = "advent_of_code_2024" version = "0.1.0" +dependencies = [ + "paste", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" diff --git a/advent_of_code_2024/Cargo.toml b/advent_of_code_2024/Cargo.toml index 57d6f63..0cf809e 100644 --- a/advent_of_code_2024/Cargo.toml +++ b/advent_of_code_2024/Cargo.toml @@ -4,3 +4,4 @@ version = "0.1.0" edition = "2021" [dependencies] + paste = "1.0.15" \ No newline at end of file diff --git a/advent_of_code_2024/src/day1/part1.rs b/advent_of_code_2024/src/day1/part1.rs index 6b7ba6d..f5e81f8 100644 --- a/advent_of_code_2024/src/day1/part1.rs +++ b/advent_of_code_2024/src/day1/part1.rs @@ -1,5 +1,5 @@ -pub fn solve(input: &String) { +pub fn solve(input: &str) { let all_numbers = input.split_whitespace() .filter(|str| !str.is_empty()) .map(|str| str.parse::().unwrap()) diff --git a/advent_of_code_2024/src/day1/part2.rs b/advent_of_code_2024/src/day1/part2.rs index d20ffcb..da8e2d3 100644 --- a/advent_of_code_2024/src/day1/part2.rs +++ b/advent_of_code_2024/src/day1/part2.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; -pub fn solve(input: &String) { +pub fn solve(input: &str) { let all_numbers = input.split_whitespace() .filter(|str| !str.is_empty()) .map(|str| str.parse::().unwrap()) diff --git a/advent_of_code_2024/src/day2/part1.rs b/advent_of_code_2024/src/day2/part1.rs index 07c242e..e306777 100644 --- a/advent_of_code_2024/src/day2/part1.rs +++ b/advent_of_code_2024/src/day2/part1.rs @@ -18,19 +18,16 @@ impl ReportType { } pub fn is_safe(&self) -> bool { - match self { - ReportType::Increasing | ReportType::Decreasing => true, - _ => false - } + matches!(self, ReportType::Increasing | ReportType::Decreasing) } - pub fn from_report(report: &Vec) -> ReportType { + pub fn from_report(report: &[i32]) -> ReportType { let mut report_type = ReportType::Unknown; for idx in 0..(report.len() - 1) { let step = match report[idx] - report[idx + 1] { - -3 | -2 | -1 => ReportType::Decreasing, - 1 | 2 | 3 => ReportType::Increasing, + -3..=-1 => ReportType::Decreasing, + 1..=3 => ReportType::Increasing, _ => return ReportType::Unsafe }; @@ -42,7 +39,7 @@ impl ReportType { } -pub fn solve(input: &String) { +pub fn solve(input: &str) { let reports = input.split("\r\n") .map(|line| line.split_whitespace().map(|str| str.parse::().unwrap()).collect::>()) .collect::>(); diff --git a/advent_of_code_2024/src/day2/part2.rs b/advent_of_code_2024/src/day2/part2.rs index 14d25c7..5abcb86 100644 --- a/advent_of_code_2024/src/day2/part2.rs +++ b/advent_of_code_2024/src/day2/part2.rs @@ -18,19 +18,16 @@ impl ReportType { } pub fn is_safe(&self) -> bool { - match self { - ReportType::Increasing | ReportType::Decreasing => true, - _ => false - } + matches!(self, ReportType::Increasing | ReportType::Decreasing) } - pub fn from_report(report: &Vec) -> ReportType { + pub fn from_report(report: &[i32]) -> ReportType { let mut report_type = ReportType::Unknown; for idx in 0..(report.len() - 1) { let step = match report[idx] - report[idx + 1] { - -3 | -2 | -1 => ReportType::Decreasing, - 1 | 2 | 3 => ReportType::Increasing, + -3..=-1 => ReportType::Decreasing, + 1..=3 => ReportType::Increasing, _ => return ReportType::Unsafe }; @@ -42,14 +39,14 @@ impl ReportType { } -pub fn problem_dampener(report: &Vec) -> bool { +pub fn problem_dampener(report: &[i32]) -> bool { // check default if ReportType::from_report(report).is_safe() { return true; } for skipped in 0..report.len() { - let copy = report.iter().enumerate().filter_map(|(idx, v)| (idx != skipped).then(|| *v)).collect::>(); + let copy = report.iter().enumerate().filter(|&(idx, _)| (idx != skipped)).map(|(_, v)| *v).collect::>(); if ReportType::from_report(©).is_safe() { return true; } @@ -58,7 +55,7 @@ pub fn problem_dampener(report: &Vec) -> bool { false } -pub fn solve(input: &String) { +pub fn solve(input: &str) { let reports = input.split("\r\n") .map(|line| line.split_whitespace().map(|str| str.parse::().unwrap()).collect::>()) .collect::>(); diff --git a/advent_of_code_2024/src/day3/input.txt b/advent_of_code_2024/src/day3/input.txt new file mode 100644 index 0000000..53eb54d --- /dev/null +++ b/advent_of_code_2024/src/day3/input.txt @@ -0,0 +1,6 @@ +},;who()^>',mul(594,203)~ ~*$'*select()mul(693,99)*>&()+{%{mul(225,584)when()why()#]}&mul(287,918)}^mul(368,284)!>mul(943,865){who() /mul(482,561)don't()<,}>what()why();why()mul(407,849)@-mul(516,359))%:*<~&,}from()do()how()^+#^]when()%why()mul(604,810)when()from()mul(688,243)< ?[-]-who()mul(321,988)<:(%~!>[how()mul(477,536)how()!;~'mul(151,994)};mul(980,874))mul(439,349)what()]%(!%+%mul(915,912)where()~~?[mul(260,395)-mul(232,933)?why()<-&,#do()^select()'why();where()why()when()<+mul(681,169)>{#:$who()mul(667,451)mul(808,838)mul(737,381) where()how(847,856)-$):why()mul(337,590)%*)from()/what()%)]who()don't()'+[}mul(169,314)#from()/mul(936,343)why()&^mul(635,808)what()#who()$!~mul(721,645)what()!$&mul(508,537)/'>;[select()mul(570,587)when()where()/why();@/}]>don't()how(),why()mul(832,893) >]mul(862,653),>/@)[:what()?mul(579,120)#mul(972,506)>!$why()'-#+mul(837,98)from(156,299)why()why()select()*where() from()mul(244,480)/when()mul(89,666)-mul(18,187))^?)/mul(581,521)what(632,250)}]where()what()$mul(255,85)%mul(63,827)@*&select(),+from()mul(588,403)#[# how():^from()mul(87,601)mul(894,913))+mul(999,830)^how()&who()when()mul(63,360)~:)'mul(886,820)#+when(637,501)when(),mul(826,841)when()-who()mul(590,783)mul(964,976){>what()>mul(13,712):@]']from()where()who()::mulhow()+'~{;who()mul(79,750)@mul(59,645-mul(117,5)!*how()+mul(934,599)&mul(259,433)!$who()who(173,704)mul(622,219)mul(799,40))%-&/]-mul(964,29)/'who() how(),mul(640,513);where()why()-((?select()what()mul(337,730)from()when()why(){from()?mul(89,919)<~'(~@-where()mul(307,659)?select()what()select(233,108)('~%mul(257,371)what()who()}[]?where()who()mul(678,224);'-~@why()$*~from()mul(93,137))why(526,42)!'{select()what()what()when()+mul(487,383)':mul(101,242)/how():]%why()what()[:-do()-*#]^,]'@#mul(274,908)*:where(385,486)++how(658,16) ('mulwho()~#)!,what()%how()when(),mul(82,590)~when()where()mul(675,232)from()~how()~~$@*!mul(374,877)?,,]:;]mul(525{what()]when()what()<@'#~mul(218,321)why()[mul(7,149))]when()'mul(602,958)from()~]/>, mul(185,660)$select(),('}@mul(858,378)who()]>+mul(994,816)![^when()/why(311,783)>+mul(477,340)[what(),[who()%mul(295,109)/+~who()from()% mul(470,357))}@',*%how()how(132,604)}mul(592,563)who(464,432)+>where();who()[)where()mul(21,898)where()how()where()) how()how()-mul(853,634)%what()who()?mul(104,46),when()mul(425,445)how()select()where()mul(812,255,-'mul(326,218)+from()%^mul(326,896)-@mul(459,929)'mul-&where()where()[%}where()when()-mul(385,422);)^what()#mul(452,336)<:why()^ mul(486,292)$-select()select()mul(271,185)mul(839,107)mul(428,910)?;select()/-~)$mul(227,340)who()[[:select()how()^{where()%mul(589,539) +^]%mul(381,668)don't();[*)how()?mul(670,136) select()select(){>>]+mul(838,443)why()< [how()where()why()mul(122,722)where()!#?mul(500,988)~:>#mul(231,76);when()@?*mul(263,91){mul(681,948)[where()mul(405,666)<,mul(593,738)?:++]&from()select()~mul(124,503)what()]@-$!mul(628,744)+&@who(),>@[]mul(522,713)]#select()?why()when())$,~mul(262,399){from()/^ #mul(893,939)$^:/what()mul(190,162),@where()(@&why(768,548)~mul(486,353)>*(!why(762,229)^who()-*#mul(332,970)(;+^#select()/when()mul(340,741)mul(798,465)what()]when(415,81){@mul(878,392)-what()why(301,507))? (mul(368,530),( @!-{why()mul(648]who() ^where()+>&why(){+mul(629,258) ;how()when()where()when(543,323)#>)!mul(874,15)what()when()>{;]where()mul(698,403))?!@*?where(288,133)why():mul(710,643)'^why()why()*){mul(53,898)@!(*/??{@-mul(929,921)mul(346,179));@],^[@mul(135,728)select()$@*']mul(617,892)%^who()>;*-%@mul(32,615)from()>-don't()% ~what()where()mul(857,690)[@&what()[%<&from()+mul(264,50)(''';mul(603,221)$&*,{+mul(779,669)mul(111,444)!)*(select()$@mul(340,10)(!~don't())-$where()who()~/from()$#mul(363,956),$^%mul(425,73); @)@{)@mul(927,538){ how()mul(541,949+]><)([mul(627,334)?#select()^:mul(838,568)[?where()'+>/don't()mul(225,275)how()]who()mul(674,310)mul(388,186)from()select(415,201)':#('when()who()~mul~@:;mul(55,655)how()&)+'%<>mul(862,203)what()>;)&mul(196,780)>*mul(8,530)<(<#?%>!mul(963*$!+when()where(),what()~what(402,657)why()mul(282,587)mul(760who()&+-&^ #mul(163,582))where()#;(?%do(){}who()what())mul(437,16)*(when()^mul(58,667)!from();:& -]@^mul(853,288)()'*++%<>mul(914,566)$>when()mul(15,420)&(mul(223,567why()?where()mul(448,495)mul(139,496)]/*,!};mul(177,399)%mul(39,651)]:$[}?do()!>why()mul(417,729)}$-from()mul(520,450)mul(265,783){^/mul(772,557){{who();from()mul(493,714)[(mul(35,779!&?(&mul(569,865) +}where()'$:^,mul(786,269),% )^mul(879,113'how()@(/$%@/^mul(116,775)>'mul(982,672)$]when()]*mul(837]from()($@#@;how()why()mul(886,777)what()%who()when()who()&mul(21,661):&from()^select()--who()mul(853,286)mul(400,239)(^{}mul(831,506)mul(863,343)%don't()+]!@where(),from()mul(231,737)}:select()^!]}when(52,692)*~mul(370,465)-([select()%&select()mul(469,210){@,&{$mul(175,116)mul(609,363)':),@>[(,,mul(399,62)who();;what(470,862)when()mul(976,776)from()mul(7,424)$+(mul(196,54))>'why(),why()(''mul(401,800),@-what()!;}mul(571,161)<{~how()from()mul(578,181)mul(656,101)?%,where()why()mul(994,308)^select()@'&mul(326,809)}select()%what()%who()mul(905,918)(-?@mul(607,194))$who()when()[mul(400,976)%when()$[~mul(177,579)when()?what())why()what()*]select()mul(151,60)++mul(128,963)mul(139,337){mul(590,594)mul(103,702)>*&]##?mul(871,345)when()-/when(942,63)why()/mul(633,445)mul(847,599)??+:@&when()mul(646,120)[>][select()mul(743,178)(~mul(684,203)who()?}why()*mul(229,310)*~$how()@when()-mul(701where()'when()how()(from()}>mul(641,487)$+:]mul(956,874)why()mul(353,956)mul(983,116what()+@who()don't()!where()from())),('mul(193,660)how()what()>%(( ([:[(?mul(682,785)]!@from()mul?{(>:^when()mul(544,177)$when(),/from()/why(216,114)(how()mul(548,300)who()$[from()where()/mul(842,217)why()<#when()/)< mul(20,214)?-')[how()*how()select()mul(762,33)~}mul(104,195) $)from()mul(752,787)select()~who()how()/mul(592,312)[{mul(19,834)from()when()&mul(429,262)&[[%mul(403,815);?,<$mul(585,835)%select()/'mul(487,715)]{>~,+who()from()what(230,638);mul(120,525)how()mul(357,111)who()%mul(348,302)mul(49,57)when()/:)}+;{mul(454,979)where()mul(592,663)mul(629,69){[)}/select()mul(937,214)~select(175,966)how()[~when():$mul(256,835)select()why(366,997)/({mul(968,356)),mul(911,215)&&:}why()*mul(817,467) $'] )-mul(539,632)[>mul(150,228)(& when()from()'mul(513,805){@*mul(386,351)-'?)where()(/$from()mulwhen(){mul(565,559)!$;} mul(584,177)'* who(779,974)-,where()mul(696,100)!!mul(905,665)$$what():'?$'}mul(244,781)'from(562,990)?what()~mul(997,348)}(select()$-;what()^mul(208,506)who()*;)->:mul(175,377)>?%-})?$-what()mul(274,842)select()&!,+ what()$:select()mul(624,649)do()*~mul(24'{mul(607,613))mul(847,392)why()'[]+who()*from(35,544)do()'#@[!,what()mul(936,485)@]}why(487,34)<'why()why()!mul(507,185)(*>@}from()when()how()mul(126,880),#:from()mul(37,739)+;select()#mul(33,245)from()%)+mul(553}what(297,97),&why()why()#!/usr/bin/perl who()who()mul(252,413)} ;when()*what():#mul(178,525) +!,!%*mul(247,765)'from()how()how()/mul(37,480)>who(774,403)^why()why()>{%?;mul(765,805):[%]'mul(555,863),*from(551,599){@mul(680,850)(:@,from()when()!mul$why()*@[}&@what()!/mul(857,84)mul(954,860)]:)what()<}select()#>who()mul(847,874(#who()?, >$/,mul(648,867)!mul(743,614)when()where()from()),where()what()+mul(771,994);/&{select()mul(185,672)$?what()?-[mul(462,251)why()['!where()~)why(223,838)do()why()(?];-) mul(320,138)mul(693,135)$from();{%how(){when())mul(641,922)mul(936,690)~where()mul(405,51):mul(230,693)#^where()[,~%what()mul(847,625)>+:+mul(417,751)what()select()?#$~what()~:mul(136++(;,select()mul(84,993)(%:<{where()mul(804,257),where()(^;mul(699,405)@ {#}what(971,750)][mul(303,720)]how()who()%~who()(!*mul(159,290))*]what()when()!who()?+mul(431,69)>@why()&from()}mul(635,147)^};[mul(751,946)>}mul(750,619)mul(934,728)](where()(])!,>mul(948,935)^what()mul(635,611)mul(154,203)!]${mul(848,181)where()<:'%/why()from()^mul(58,506)mul(289,102)&}mul(219,217)why()mul(815,547)@??~<-?:mul(379,469)where()mul(892,520)@mul(684,138)who(618,612));]how()!select();(mul(620~$:don't()&mul(410,854)[[<@/select()[,mul(99,314)don't()@:+/how():mul(681,615)%@^'why()why()'*#mul(830,208)who()/<;mul(658,189what()what()mul(830,308)+%; !]!+){mul(545,809)~%when()*)what()/how()mul(113,677)-what()@*mul(881,322)-'mul(676,641)from()mul(793,567)/&+*% '[mul(707,603),what()&what()'$^how()mul(373,428)&]#*%*!when(251,472))how()mul(113,620)&[how(750,572),?+}why()'mul(439,649))-$&{!mul(567,585)how()??mul(342,193)]mul(939,929){(how()mul(101,869)];^when()*]}^^:mul(490,241)mul(664,51)when()# }~mul(633,172)@,:>#;>mulfrom()mul(205,672){,#>&mul(102,476)'when()mul(555,446)(:&//[where()/mul(201[when()mul(597,255)/!-;why()mul(530,146)mul(12,488)%when()~why()?mul(397,506)^>(who(620,254)who(190,64)&]mul(244,996)*where())-*?* :-mul(89,560);#how()*%}}mul(854,585)what()~mul(670,166)*~mul(995,990)how()select()*^where()+~mul(805,731 :$mul(357,136)mul(512,13)~@&)mul(972,955)why()what()}select()how()+))mul(709,220){what()&:*^mul(430,726)!@#++-who()mul(41,47)&,}where(799,279);mul(61,691)+>mul(903,891)}!mul(826,623){>select()^what()><[mul}<^{[what()~}[select();mul(675,405)when()&where()- +?mul(485,232)(where()mul(375,359):]^{ why()mul(755,634)select()?[who()!where(698,921)*select()where()mul(111,473)when()&}mul(616/%[what()^from()how()^>mul(511,223)select()*when()/-,+what()why()don't()>why()}(+)how()where()when()mul#where()mul(310,171)when()why(){%$>)how()+mul(535,384)['how()^/mul(157,599)]mul(916,257)@when()from(){don't()when()who();; where()^what()how()~mul(668,57) +%+mul(923,967)&(who()from(101,122)why()^mul(327($where()/;/+mul(817,835)?(mul(863,760)#mul(254,722)}+why()mul(399,61)$who()from()where()who()mul(533,810)>:+what(394,757) $mul(252,667)}what()+$mul(342,546)*)*>don't()from(), how()<]^who();mul(629,290)what()mul(234,255)!when(292,811)#from()##why()what()who()don't();mul(869,294)#^>}mul(372,283)>%why()/mul&]]don't()mul(400,866)#]$/(mul(599,385)from()mul(64,766)!:++}!*]mul(256,981)^/:mul(255,258)why()what(940,608);mul(769,112)*](&'/?%?mul(616,557)/mul(297,516)'why()where()mul(541,625]*@*~select()!how()'mul(111,141)!)mul(829,517)#why(103,740)+/mul(147,862)&} ]?what()mul(626,774)?who()when())@(mul(442,344)&select(818,275)where()^*;&mul(935,876)when();what()$/mul(314,497)#)-how()]mul(983,427)why()^how()~~ {mul(864,428)why()where()mul(218,171)select()who()why()do():~ ~;*:{*mul*select()from(984,969)mul(377,382),'how()-?!>mulwho(),who()how()#mul(479,732)$<;*from()who() mul(371,96)$;(>mul(987,681)who()from())why()do()>who()$-mul(315,10)((:from()*where()@)+mul(279,804)-where(){%when()*mul(680,426)>/@do();mul(68,45) +#(-!#mul(630,936)select()mul(370,414)'-#how(612,677)}don't()),'when()[^?mul(278,179)''^!mul(68,583);&where()[from()''mul(761,143) ~'/ [(@mul,]who()'mul(439,429)>select(508,507)[} mul(585,145){from()>*!from()why(){mul(427,492)select()mul(460,379)/+where()~;>!,:^mul(8,427)mul(589,356)how(),(@do()from()+when()mul(753,641)~{ +mul(817,120)~;'?>from()%'what()mul(497,124)[)where()$ don't()+what()>+mul(344,301)mul(226,559);)%where()(mul(153,377)'$/*,[*mul(399,320)mul(157,435),^%- >what()@!from()mul(988,920)[@how())where()}$mul(825,518);mul(277,441)select()&from()(?{mul(727,849)< how(226,741)#select()#from()[,'mul(377,916)mul(498,335)[?mul(162,204),;select()~&>^['what()#where()when()mul(602,837);why()who()) select()[%mul(26,319)$'&why()+mul(566,508)}?what()>how()@]why()mul(268,280) ;mul(349how()-who())}where():don't()when())mul(261,23)where(629,189)+)~}from()^mul(805,908)from())[::&(:[mul(559,179)$how();how(424,854)?mul(497,761^?}+# mul(73,724)mul(893,324)mul(33,500)@^select()select()%mul(902,772)^do()>]&'* *,mul(531,698+)#where()who()(from()@;}mul(336,925)$what()~why()mul(672,818)who()^from():?[@what(),'%?+from()mul(710,158)when()?+mul(692,848)+what()/mul(771,109?}how():):from(),>$,don't()?)-when() }mul^who()mul(142,49);select()#mul(36,734)mul(387,920)'%where(821,671)}]mul(639,17)[::select()>>from()mul(335,905){:what(371,338))mul(707,318) +[mul(319,265)<)from()>mul(213,849why()where()-&~{from()where(442,708)how()mul(31,535)mul(835,301)from()-where()/mul(410,971)mul(597,302'~mul(185,542)<@,;select(227,573){[where()mul(781,451),%?who()mul(497,786)<#}select()when(212,649)'mul(633,547)}'+-*~*mul(368,344);>/why()++mul(18,249)>/:[[[{mul(769,663)(;#^*-{who()mul(33,6)@;!&]:<[%mul(984,664)how()where()/$ )mul(163,741)mul(107,247)&]<}^,*$<~mul(475,905)>,>mul(405,913)mul(187,32)mul(505,579)mul(460,119)#^'(mul(478,778){: /?from(13,647){mul'<**mul(505,984)]!mul(572,718)mul(342,541)@^mul(335,642)':*{&,don't():what()[* ?who()!mul(202,20),@select()!where(501,423)/mul(986,590)don't()where()when()-where()mul(390,246)when()#!]where()>/%mul(552,289)<$who(){,{@select(251,685)mul(589(~why() ]how()mul(824,521)-!{from()+]who()select()^mul(401,951):+/&$^'[+mul(712,16)&]<}what()&+!~*mul(844,796) }from())mul(122,632>{what()<< what()mul(247,660)(,mul(224,511)<)how();[select()#,mul(389,90)$$&<%where()do()mul(478,963);}how()@,mul(971,397),!<<<,mul(144,69))what()![what(727,164) (do(){>{#when()/how())mul(720,811)mul(956,682)who()/]$:'%mul(546,971)# why()%&select()[@mul(771,523)'&when()when(195,262)*select()>~who()#mul(407,675)&#^,;who()@who()mul(559,443)-:how();,-mul(154,187)-}-what() mul(943,730)$'*/mul(77,492)^mul(67,185)+when()@!where()~$why()mul(30,846);why()@what() {[$mul(228,712))select(888,963)select()-mul(480,617)mul(478,853){, don't()%what(312,885)mul(157,252)/-< %#{[&mul(178,154)#>do())@*how()*mul(567,367)]'what()@mul(949,266))^]what()how()*mul(242,661)$who()mul(77,610)what()where()do();:mul(244,428)mul(924,113)what()~mul(326,797)mul(829,720)/:&who()+@mul(580,849)who(561,730)mul(713,682)from()~;<*$mul(183,921)>^how()who()why()+from()+mul(357,475)*><;}what()'}mul(328,637)> do()@''[when()mul(424,209)]>>:mul(225,552)when()-select()select()}@[ ]mul(249,678)@# {what()mul(494,553) = std::result::Result; + +fn parse_number(input: &str, caret: usize) -> (usize, Token) { + let mut end = caret + 1; + let bytes = input.as_bytes(); + + while end < input.len() && bytes[end].is_ascii_digit() { + end += 1; + } + + let slice = str::from_utf8(&bytes[caret..end]).unwrap(); + (end - 1, Token::Number(slice.parse::().unwrap())) +} + +fn parse_mul(input: &str, caret: usize) -> (usize, Token) { + if input.len() <= (caret + 2) { + return (caret, Token::Invalid); + } + + let bytes = input.as_bytes(); + if bytes[caret] == b'm' && bytes[caret + 1] == b'u' && bytes[caret + 2] == b'l' { + return (caret + 2, Token::Mul); + } + + (caret, Token::Invalid) +} + +fn tokenize(input: &str) -> Vec { + let mut tokens = Vec::new(); + let mut caret: usize = 0; + + while caret < input.len() { + match input.as_bytes()[caret] { + b'(' => tokens.push(Token::ParenOpen), + b')' => tokens.push(Token::ParenClose), + b',' => tokens.push(Token::Comma), + b'0'..=b'9' => { + let (new_caret, token) = parse_number(input, caret); + caret = new_caret; + tokens.push(token); + } + b'm' => { + let (new_caret, token) = parse_mul(input, caret); + caret = new_caret; + tokens.push(token); + } + _ => tokens.push(Token::Invalid), + } + caret += 1; + } + + tokens +} + +fn calculate_mul(tokens: &[Token], caret: usize) -> Result<(i32, usize)> { + if tokens.len() <= caret + 5 { + return Err(MulNotFound); + } + + if tokens[caret] != Token::Mul { + return Err(MulNotFound); + } + if tokens[caret + 1] != Token::ParenOpen { + return Err(MulNotFound); + } + let lhs = match tokens[caret + 2] { + Token::Number(num) => num, + _ => return Err(MulNotFound) + }; + if tokens[caret + 3] != Token::Comma { + return Err(MulNotFound); + } + let rhs = match tokens[caret + 4] { + Token::Number(num) => num, + _ => return Err(MulNotFound) + }; + if tokens[caret + 5] != Token::ParenClose { + return Err(MulNotFound); + }; + + Ok((lhs * rhs, caret + 5)) +} + +pub fn solve(input: &str) { + let tokens = tokenize(input); + let mut caret = 0; + let mut sum_of_mul = 0; + + while caret < (tokens.len() - 5) { + let (value, new_caret) = match calculate_mul(&tokens, caret) { + Ok((v, c)) => (v, c), + Err(_) => (0, caret + 1), + }; + + sum_of_mul += value; + caret = new_caret; + } + + println!("Sum of Mul: {}", sum_of_mul); + +} diff --git a/advent_of_code_2024/src/day3/part2.rs b/advent_of_code_2024/src/day3/part2.rs new file mode 100644 index 0000000..cef9064 --- /dev/null +++ b/advent_of_code_2024/src/day3/part2.rs @@ -0,0 +1,141 @@ +use core::str; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum Token { + Mul, + Number(i32), + ParenOpen, + Comma, + ParenClose, + Invalid, + Do, + Dont +} + +struct MulNotFound; +type Result = std::result::Result; + +fn parse_number(input: &str, caret: usize) -> (usize, Token) { + let mut end = caret + 1; + let bytes = input.as_bytes(); + + while end < input.len() && bytes[end].is_ascii_digit() { + end += 1; + } + + let slice = str::from_utf8(&bytes[caret..end]).unwrap(); + (end - 1, Token::Number(slice.parse::().unwrap())) +} + +fn parse_word(input: &str, caret: usize, word: &str, token: Token) -> (usize, Token) { + if (input.len() - caret) < word.len() { + return (caret, Token::Invalid) + } + + let in_bytes = input.as_bytes(); + let test_bytes = word.as_bytes(); + + for idx in 0..test_bytes.len() { + if in_bytes[caret + idx] != test_bytes[idx] { + return (caret + 1, Token::Invalid); + } + } + + (caret + word.len() - 1, token) +} + +fn tokenize(input: &str) -> Vec { + let mut tokens = Vec::new(); + let mut caret: usize = 0; + + while caret < input.len() { + match input.as_bytes()[caret] { + b'(' => tokens.push(Token::ParenOpen), + b')' => tokens.push(Token::ParenClose), + b',' => tokens.push(Token::Comma), + b'0'..=b'9' => { + let (new_caret, token) = parse_number(input, caret); + caret = new_caret; + tokens.push(token); + } + b'm' => { + let (new_caret, token) = parse_word(input, caret, "mul", Token::Mul); + caret = new_caret; + tokens.push(token); + }, + b'd' => { + let (mut new_caret, mut token) = parse_word(input, caret, "do()", Token::Do); + if token == Token::Invalid { + (new_caret, token) = parse_word(input, caret, "don't()", Token::Dont); + } + caret = new_caret; + tokens.push(token); + } + _ => tokens.push(Token::Invalid), + } + caret += 1; + } + + tokens +} + +fn calculate_mul(tokens: &[Token], caret: usize) -> Result<(i32, usize)> { + if tokens.len() <= caret + 5 { + return Err(MulNotFound); + } + + if tokens[caret] != Token::Mul { + return Err(MulNotFound); + } + if tokens[caret + 1] != Token::ParenOpen { + return Err(MulNotFound); + } + let lhs = match tokens[caret + 2] { + Token::Number(num) => num, + _ => return Err(MulNotFound) + }; + if tokens[caret + 3] != Token::Comma { + return Err(MulNotFound); + } + let rhs = match tokens[caret + 4] { + Token::Number(num) => num, + _ => return Err(MulNotFound) + }; + if tokens[caret + 5] != Token::ParenClose { + return Err(MulNotFound); + }; + + Ok((lhs * rhs, caret + 5)) +} + +pub fn solve(input: &str) { + let tokens = tokenize(input); + let mut caret = 0; + let mut sum_of_mul = 0; + let mut enabled = true; + + while caret < (tokens.len() - 5) { + match tokens[caret] { + Token::Mul => { + if enabled { + let (value, new_caret) = match calculate_mul(&tokens, caret) { + Ok((v, c)) => (v, c), + Err(_) => (0, caret + 1), + }; + + sum_of_mul += value; + caret = new_caret; + continue; + } + }, + Token::Do => enabled = true, + Token::Dont => enabled = false, + _ => (), + } + + caret += 1; + } + + println!("Sum of Mul: {}", sum_of_mul); + +} diff --git a/advent_of_code_2024/src/day3/test.txt b/advent_of_code_2024/src/day3/test.txt new file mode 100644 index 0000000..2e1a90a --- /dev/null +++ b/advent_of_code_2024/src/day3/test.txt @@ -0,0 +1 @@ +xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5)) \ No newline at end of file diff --git a/advent_of_code_2024/src/day4/input.txt b/advent_of_code_2024/src/day4/input.txt new file mode 100644 index 0000000..dec2125 --- /dev/null +++ b/advent_of_code_2024/src/day4/input.txt @@ -0,0 +1,140 @@ +MAMAMASXXXSAMXSSSSSXMXMAMMSXMASAMXMXSSXMXXXXMSMSSMXXSAXMMSSSMSXMMXSMMMMSSMMMAMMMMSMMSXMAXMASMMSXASXSAMXXAAMXMXMAMXMAAXMASXSMXSSSSSSSSXMXSAMX +MSMMMMSXAAAMSMMAAMMMMAMASXMASAMMSXAXXMAMSMMMMXAMAMXAMMXSAAAAASASMASXAAMXAAXSAMAMMAAXXAMXMMSMMXMAMSAMXMMMSMMAXXXMXSMSMSMASMSMAMAAAAAAXXSASAAX +XAAXMAMMSMMMSAMMMMXAMAMXAAXAMXSAMAMXMSXMAASASMSMAMMXXAAMXMSMMSAMMAMXMXSXSMMMASMXSSMMMAMAAMAAASXSAMXMAXSAAAMSSSMMAAAASAMXXAMMAMAMMMMMMMMASMMS +SSXMMAXAAXMASMMXSXSMSSSSSXMSSMMXSAMXXAAXSMSASAMAMXXMMMXXAMXXXMXMMSXMSAXMAMXSXMXAAMXSASMMSXXMMAAXMXXSAXMMMSAAAXAASMMMSXSSMSMSASXSMXAXASMMMMAX +XXASMSSSMMMMSAMAMAXMAAMAMXMAAXAAMMMMMSSMAAMMMMMSSSSXSAASMSAXSAMXXXAAMAMSAMXSXAMMMMASAMAXMMMSAMXMSAMASXAAAMMMMMAMMAXXXAAAAMASASXAMSMSMSXXAMXM +MSXMAAAAXMSAMAMXSAMAMSMSMMXSMMMXSAXAAAXXMMMXMXMAAXAAMMXSAAMSMAMSAMMMMAMSASAMMSMSAMXSASXMSAAAAXSXMASAAXSMXMMASMMSSSMXMMMSSMAMAMMMMSAAXMAMSXSA +ASMMMMAMAXMASMMMMASMXAXAMXAAAXMASXSMSXSSXSAMXAMMSMMMMSMMXMMMXAMXXSAMSSMXAMMSMXASMSASAMXXMMSSSMMXSXMASMXMSMSASAAXMASXXXAAXMAXAASXMMSMSMXSAAAS +AXAXAMAXMMSXMASXSXMXSXSXXMXSAMXMSMMAXMAMASXASXSXAMAAAAASXMSXSXSASAAXAMMMSXXAMMMMAMASXMXMSXMAAAXASASAXXMASAMXSMMMMMMMSMMSSSMMSMMXXAXMXMSAMXMM +AMXSMSMXSAMAMSAAMMMMSMMXXAAXAXMAMAMAMMAMXMAXXMAXSSSMSSSMAAMXMMMMMMSMSMSAAMSSSXSSSMMMMMXMMAMXMMMAXAMASAMXMMMMMMSMSMAAAAMAMAMXXAMSMXXSAMXMAAXS +XAMMAMAAMMMAMAMXXAAAXAAMMMMXMMMMSSMSXMASASMSAMMMMAAAXXXXMMMAAAXASXMAXAMMMMAAXAXMASXAAXAMSMMASMSXMAMXSMMAXAAMXAAXAMMSSSMXSAMASAMAAASMMMAXMMMA +SSSMAMMMSASMSSXSSSSSSMXSXAAASAXMAMAMXMMXAXAXMASAXXSMMMMASASMMXXASAMSMAMAASXMMSMSAMMSMSMXAAXMSAAXSXMXMAXAMSSSMSSSSSMMAAMAMAMASAMMMMXAASMMSAAM +AAAMXSXXMASXAXXXAAAXAMAMMMMXMASMSMSMMSAMSMMMSXSXSAMAAAAMSAAAASMMMAMAAAMSMSAXAXAMMSMAMAMSSSMXMMMXMAAASXMSXAAXAXMAMSXMMAMASAMASMMXAMMMMSXASMSX +MSMMMSXSMSMMMMMMSMMMAMASASMSMXMXMAXAAMAMXAMASXSAMMSSMSMXMMXMASAXMAMXXAXMXSMMMSSXMAMAMAMMAXXAXAXASMMMSAAMMMMMSMMAMSXXMASASASXMXMMAXASAMMXMMMM +XMAAAMMMSAAAASXAXMSSXSASAXAAXMSMMMMMMSMMSXMAXAMAMXAAXMXSXMASXSAMXXMMSSXMASAMXAXXSSXSSSSMAMMSXSXMMSSXMMSMAXMXMAXASXAASXMMSXMASASXSSMSAAXMXMAS +XMSMXSAXMSSMXMMXSAXAAMASAMSMMMSAAXAAXAAMXMMXSASMMMSSMMASASXSAMMMXMAAAAAMAMAMMXMMMAAMAMMMASXXAXXAAAXXXAXXSMXMASMXSMMMSXAMSASMMASXXAXSAMXXXMAS +SMXSASAMMAMXAXAAXMMMXMXMMMXAXASMMSSSSSSMSXAMSAMMAXMAMMASXSAMXMAAASMMXSMMAXASMSXAMMMMAXMXXSAMAMSMMSSMMMSMMMXSAMMMMMXAXMXMMAMAMXMMXXMSASXMSAMX +AAAMMSASMMSSSSXMMXAXXMMAXXXMMMSAMXAXMAXAMMSXMAMMXSSXMMAXMXMMMMMSXSAAAXMXSSMSASXSMSXXMMMMMMAMAMXMAAAAAXAAAAMMXMASAAMXSMMSSSSSMMXMSMASAMXAMSMM +SMMSMMXMAAAAAAAAASXMMSAMXMSXMXSMSMSMMMMSMAMMXXMSMMMMAMXSAMMAAAXXASMMMSAAAAAMAMSMAMAMSASAAMAXAMAMMSSSSXSSMSXXMASMMXSAAAAAAMAXSAAMAAXMAMMXMASX +MAMMXMASMMMXMXMMMMSAAAMXSMMAXMMAAAAMAAAMMXSAMSXSMAMASXMAXAMSMSSMMMAAAXMMSMXMAMAMAMAMSASMSSSSSSXSMAAAAAMXMMMAXXXXXAMXSMMMSMSMSSMMASMSSMSAMXMM +MAMXASMSASMMSAMXMAMMMMXASXSAMSMSMSMMSSMMXMMASMAMSAMSAMXSMSAMAMXMASXMXMXMXXASASMSSSSXMMMAXAXAASASMMXMMXMAMXAMMMMMSAMXXAMXXXXAMMMMAXAXAASXMAMX +SSSSMSXXXAAAMXSAMSMSXXMASMMAAMMXMXMAMAMSMMMSAMXMMXXAMMXXAXXMMMASASAMXMAAASASASXSAMXAASMMMXMSMMXMAXMMXXXAMXSXAAAXAMMMXSAMXAMSMASMAMXMMMMMSXSA +SAAAAXAMMXMMMASMMXAMAAXMMXMMMMXAMMSXMAASAXXXXMSSSMSSXSXMMMMMXSXMAXXMAMXSMSXMMMXMMMSSMMAASMMAMXMMMMMSAMSASXMSSSSSSSSSMXAMMMMAMAMMXMXAXXMAASAM +MMSMMMAXSMSAMMSXAMAMMMMMMAXXAMSMSAAXMSMSSMMMXSAAAAXMAMASASAMXMAMMMSSSSXMAXMXSXASXMAXASMMSASMSAAAMXXAAMSSMMMAMAAAAAAAMSMMAXAMMASMMMMSSSMMMSXA +MAMXXXMASAMAMSSMMXAMAAAAMSXMAXAMMMXMMAMXMMAMSMMSMXMMAMASMSSSMSMMMXAAAMAMMMMMMSMMAAAXMSAASXMAXXSMSASMSMXMMMXMMMMMSMSXMAAXMMSXMAXAAXAAAAASASMS +MSSMMXSAMAMXSAMAMSXSSXMXXAASXMMSASAMMMSMXSMSAXMAMMXSXSXSASMMMAMAMXMSMMAMXAAAMMMSAMXSXSMMMAMXMMMMAMXAXMAXAAASXMAXXXXMMXSMAAMXMSSSMMMSSSMMASAX +XXAAXAMASAMXMASAMSMMAMSSMMMMXAXSASMMAAAAMSXMASXSXSMXMSXMXMAAMAXSSSMAXSXSXSSXSAAXAMAMXXMAXXMXMAXMXAMXMMSSMMMMAAXMMMMAAAXAMMSMMMAXMXAAMXXMMMAM +MSSMMMSAMAMASAMXXSAMXMAAAMMMSMMMXMASMSMSMXASMMMMAAXAAMSXXSSMSSSXAASAMSMSAAAAMMMSAMASXMSSMSXXSSSMSSSSXAAMASMSSMSXAMAMMXSAMAXAASMSMSMSSXXXAMXM +AXAXAXMMSASASXXMASAMXMXSMMAMXMASAMMMXAXXXMMMAAAMAMSMMAMMMMXMAMMMSMMMSXAMMMMXMSASXSAXAAAXASMASASAAXAAMMMSAMXAAMAMMMXASASAMXSXMMXAAAAMXMASXSSM +XXMXSXMASXSAMXMAMXSMASAMXSAXAXXSXSXMSSMMAAXSSMMXAXAXSSXXAAXMASXAAAASXMMMXAMXAXAMAMASXSSMAMAXXAMMMMXMAAAMXSMXMMMSSSMAMAMAMXSASXSMSMXMAMMMAAAS +SXMAXAMXSXMAXMASMMMMAMMSXSAMSMMMMSAMXXAMXSXXAAMSMSAXXMMSMSSSSSXSSSMSXAXMSMMMMSAMXMMMMAMXMAMAMSMMSMXSMMXMXSMMMXXXAAMXMXMSSMSAMAXAAXASMSAXMSMM +AASASAMAXASAMAXXSAAMXSAMXMAMXASMASMMAMSMAMMMMXMAMMXMAXXAMAAMMMMXXXAXXMAAXAAAXSAXXSXMMMMAXXSAMXAAAAAMAXMMAXMASMSMSMMMMMMMAAMMMSMSMSXSASASXMXA +SMMASMMMSMMMXMSASXXSAMXSMMSMSAMAXSAMMMXMSXMAMAMXSMSSMMSASMMMAAMMAMAMMSMMSSMMMSXMASAXAASMSXAXAXMMMMSSSMAMSSSMSAAAXMAXXAASXMMSAAXAAXAMAMAMAXSA +MXMMMMAAXMASAAMXMAMMXSXMASAXMMMXMSXMMMSAXASASXSXMAAMAASMMXMSSSSMXMAXMAAXMASMMMASAMXMMMMSAMSMMSSSXAXAMXMAMXMAMXMMMSMSSSMSMAAMSMSMSMMMMMSMXMAS +SXXAASMXMSASMMMSXSXMAMAMSSMSMXMAXMMSAAMXMASASAXMMMMSMMSSXAMXAAAASXMMAXMMXAXMMSAMASMSXSSSMMAAAAAXMXMSMXXXMMMXSSSSXXAAAMASMMMXMMXXXXAXASXMASXM +MXSMXXMSMMXSAAMSAXSMASMMAXXAXAAXXMASMMMMMXMAMMMSXXXXMASMSMSMMMMMMASXMSSMMXXAMMMMXMAAASAMXSSSMMSMMMXMAMSMMAMXAAAMAMMMSMASAMXASXMASMSSMSASXMAS +XMAMXSAAMMSSXMXMAMXSMSXMMSSSSMSSXMMSMSMSMSMXXAASMMMXMXMAAMAMASXXMAMAAAMMAMXMMAXMXXXMSMASAMXAAAMAMAAMAMAASASXMMMMXMAXXMAMMMMMSASXXAASXSXMASAM +SMSAMMXMMSXMASAMSMAMMMAAAMXAMAAMXMAXAAAMASMMMMAMMAAAMAMSMSASMSAMMSSMMMXMMSAXSXMMMMXXXAXMAMSSMMSAMSXSASMXSAXXXAXAASXSXMASXMXXMAMMMMMMMSASXMXS +XAMXMASMXSAMASXSAMXSASMMSSMMMMMSSSMXSMSMAMAMAMXSMMSXSAMMXSXSXXXMAAAASXXMAMMMMXXAAAXMSMMMXMXAMXMAMXASMSXMMXMAMASXXSMAMAXAMASMXSXSAXMAASASXAMM +MXMSMASAASAMMSXSAXMXASAMMAMXMXMAMAAMMMMMXSMMAXAXAMXXSXXSAMXMASMAMMSMMSMMSXXAMXSSMSSXMASXSXMAMAXXMMMMAMXMAMMAMMMMAMAMMSSMMAMSAMAMSSSMXSAMMSSM +ASMXMAXMMSXMAMMXMMSMMMMXXXMAXXSMSSMMAAMMMMASAMSMAMMASAXMASXMMMASMMMMAMXAAASXSAXAAAAMAMXAMAMSSSXSASAXMSMMAMSASXXMAMMXAAAXMASMMMAMAMAMAMAMMMAM +XMASMSXSASAMASXXSASASXMSSXSXXXAXAXMSXSMMASMMMAMSMMXAMMMSMMXMMXSAMAMMSSMXSMAAMMSMMMSMMXMMMMMAAAAMASMSAAAMAMSAMXXSASMMMSSMMXSASMSMMSAMXSSMASMM +XSXMAXAMXXAMXMMAMASXMAAXSAXAMAMMXSXSMAXSMXXAMAXASXMXMXMAMXASAMMAMXMAMAMAAXMXMAMAASAMMASXSXSMMMXMXMMXMSSMMXXAXMMSASXXAAMASXMAASAAXSASXSXSAMXM +MXXSAMAMSSSMAMMSMAMASMMMMSMMMMMMXSAMXSASAMSXMSSMMSMAMMMSMSXMAMMAMXMXSAMXMMSMMMSMMSAMSAMXAAMXSXAXMAMAAMAAMAXMASAMAMXMMSXSAXMMMXMSMSAMMMMMSMMM +SAMXMXAXMAMAASAMSASAXASXMAMMAXASAMXMAMXMAMSAXMAXAAMASMAMXMASAMASMSMAMXSXMAXXAMXMAMAMMXMSMMMAASMXMAMMSMSMMAXSAMXMAMASMXXXMXXXXXXXAMXMAXAAAXAA +MMSMMMMMMAMMMMAMSMMMSAMXXMMSASMSAMSMXSSMMMMAMSMMSMSASMAMASAMXSMAAXMAMAXAMASXSMSAXXMMMSMMXAXXXXMASASXAAXXMAMMMMASASAXMMMMXXMSMMMMSMASASMSXMXM +XMAMSASXMXMMASXMXSAAMAMMXMASAXXXXMAMAMXASMSMAMXMAXMXXMAMXMAXXSMMXMMSSMMMMXSAMSMMSAMXXAAXSSMMSMSASASMMMMAXXAMAXXSAMXXAAAMAXMAMAXAAMXMAXAAMSMS +MSAXSASASMASASASAMMSMSAMXMAMMMXSAXAASMSXMAAXSXAXMMSXSMXSAMSMMSASAAXXAMMAMAMXMAMXMXASMMSMXAASAMMXMXMXMMSMMMXSSXXMMMMASMSSMMSSSXMMMXSMMMMMSAAA +AMXMMXMAMXXMASMMMSXXMAMXXSSSSSXAMSXMXAMXMMMMMSMSMAAMMASMMMAAXSAMMMMSAMSXMMMASXMAXASXMAXAMSMMASXSMASMMAAAAAMAMXSMSAXXMAXAMAAXAMSMSAXASXMXSMSX +MSMMXMASMXMXXXAXAMAXXXXSAAAAXSAMXMAMSMMMSXMXXAMAMMSAMMMAXSSMMMMMASXMAMXMMXMAXAXSSXMAXAMSMMXSSMAMSAMAMSSSMSMMMXMASMSMMXSAMMMMMMMAAXXMMAXXXMAM +AAAXSAAASXMSMSMMSMAMXSAMMMMMMMSXASAMAAAASAMXMSSXXXAXSSMXMMXMAAAXMSASASMSMAMSMSXMAMSSMSSXAXXSAMXMASXSMMXXAXMXSAMAMMAXAAMASXMAAAMAMMSSSXMASMMM +SSSMAMSSSMASAMXAAXMASMAXXXSXAMASAMAXSMMXXAMAAXMASMMMMAXSXXASMSMSAXASASAAMSMMAMXMXMXAAXAMMMMMMMAAXXXMASMMSMMXSASASMMMMXMAMAMSSMSAXXXAAXMAXXAM +XMMMMAMAMXAMMMMSSXMSXXMMSMAMSXMSMSSMXXXSMSSXSXSAAXAAXMMSMSXMAAMMMMXMMMXMMAAMXMAMXMSMMMMMAXAAAMSMMSSMMMXAAAXXSMMMAAXSAAMSSSMAXMSMSSMMMMMAMSAX +MASXXAMAMMXSXSMMXXXAMASAMASXMAXSAAXASMMXAXSAAAXASXSSSXAXAMMMMSMSMSMAMASXSMMSASASAMMAXAXSXMSXSXXAMASAMSMSSSXAXAAMSAMSMMSMAAMAMAXMXXAAMAXAMMSA +MAMASXSASXMMAMAAXSMASAMAXSAAMAMSMMMSMSAMXMMMMXMXMAAAAMSSXMASAMMAAAMAMMSAAXXSASXXASXMSSXMSMXAXAMXMASXMAMMAXMMMSXXMXMXXXXMXMMAAXMSMSSMSMMMXAMX +MASXMASXSASMSSMMSMAMMASXMMMSMAAXAXXXAMMXAAAMMXSAMXMXMAMAXSXMASMMSMSSSMMMMMAMMMMSXMMMAXAAXMMMMMMSMMSXSASAMASXMMSMMASMMSMMSSSMMAAAAXXMAXAMMAMX +SASXSASXSAMAAMAMAAXMSMMXMAAAMXSMSMSMAMAXSSMSSXMASXXSXSSMXMAMMMXAMAAAXMAXXXAMAAXMAXAMSSMMMXSXSAAXAASXSASAAAXMAAXMSASAAXAAAXAMMSSMSMSSSSXMAAMX +MAMAMAXMMAMMMSSSSSMXXXMASMSXSXXAMAAMAMMXMAXAXASAMXXSAAAXSSSMMSMMMSMMMMSSXMASMMSAMMSMMAAMAMXAMXSSMMSAMASXMSSSMMMXMASMMXMMSSXMMAAXMAXAAXMASASA +MSMSMAMSSSMXAAXAAAMXMAMXMAXXSAMAMSMSSSMASMMMSMMAXSAMXMMMXAAMAMAMXAXXAXMAXSXMXAMAMAMXMSXMSSMMMAMAMAMAMAMXMAXAAXXXMMSXSXAAXXMASXMMMXMXMASXXAAX +MXXMAXMMAXXMMMMMMMAAMAMXMSSMMAMAMMAAAAAXMXMAAMSSMMMSXXXSMMMMMSSMSMSSMSMAMMSMMMSAMXMAXAXSAAASMMXAMXXAMASXMASXMSMAXXMAMXMXMAAXAAAAMAMMSAMXMSMS +MSASMMSMMMMAXXAXAXSMASXSAAAXAMXSMMMMSMMMSXMSXXAMASAMMXAXAMXMMAAXXXAASXMASASXMXSXXAMAMXXMMMMMAMXMSXSASAMXAAMXAXMAMMMAMMSSSXSAAMSSSMSAMASMMAXA +ASAMXXXAAXASMMSSMXAMXMAMMSSMSAMXMSXMAMMAXMAXMMSSMMASAXMSSMASMSMMXMMMMXSXMASAXXMMXSMMASMSMSSMSMASAMXMMASXMASMXMAMMXSASAAXAAXXXXAMMASMSAMAMAXM +XMXMASXSMMXAXSAMXAAXAMXMAAAXMAMAMXAASXMSSMSSXAMAXSSMMMASXMASAXAXMMSMMAMXMAMMMAAMAMASXMAAASXAASXMAMMMSASAMXXMASAMMMSAMMMMMMMMMMMSXMXAMMSAMSMX +SMSSXXMMASMXSMMXSSSMSSSMSSSMXMSMXXSMMXMAXAXSMMSMMXXAAMMMAMSMAMXMMAAAMASAXMAMMXXMASAMXMXMSMMMMMSAMXSAMAMMXMXSASAMSAMXXSMAAXAXAAAMAXMMMMAMXAAM +SAAXXMASAMXXMASAAXXXAAXAMXXXAAAXMMXAMXSAMMMMXASMSMMSMSXSAMAMMMSSMSMXMXSXSSMSMSMMXMMMMMSMXXAASXSMSMMASXSSSMASAMXMMAMSAMXSAMMSSMSSXMAXSSMSSMSA +MMMSMSMMMMXMSAMXSMSMMSMXMXSSMSASXSXAMAMXXSASMMXAAMAAXMMSAXAMXAXXAMASMMXAAXMAMAASXXMAAXAXASXMMAXXAASAMMMAAMASXMASMMMSAAAMMSMAXMAAAMMMXAXXAAAX +SMXMASAAMMMXMAMMXAXXMAMAMXMAAMXXAMSMMAXMASASXSMSMMSASXAXSSSSMXSMMMAAASMMMXSMSMSMMMSSXSMSAMXAMAMSSXMMSAMSMMASASXSASASXMXMAAMMSMMASXSSSMMSMMMS +AMAMXSSMSASASMSSMXMAXAMASAMMXMXMAMAXXMXSAMAMAMAMAAXXMASMMMAAMAXAAMSSSMAXSAMXXXXAMAAMMSXMXMXXMAAXXXAXSMXASMAXXMASAMASMAXMSSSXXXXAMAAASXAMXMAX +SXXSXMXMXMSASAAAMASASXSMSASAXAASASMSXAASXMAMXMAMMMSMXAXMAASAMXSSMMAXAXSMMMMAMMSMMMXSASMSASXSSSSSMSMMXMXXMMMMMMXMXMAMXMXXMAXMASMMSMMMMMSMAMSM +MSMMAAMMSXMAMMXMXASASMAASAMASXMSAMAXMMMSASMSMMSSMAAXMASXMMMAMXMAXXXMSMXAXAMAXXAXMAMMMSAXASAMAMAAXXMMXXMAXASASASMXMAMMMSSMAMMAMXAAXAAXAAMAMAA +MAXSMMMASAMXMSASMASAXAMAMAXAMXXMXMSMMSASXMMAAAXAMXSSSXMXSXXMASMSMSXAXXXXSXSAMXXMXSXAXMXMAMAMXMXSMSASMAXMSXSASASAMXSMAAAXMASMXSXSXSSXSSMSSSMS +SXXMXSMMSAAMXXAXMXMAMSXSSSMSMXXSSMMAMSASAMXSMMSXMXXAXAXAMMSSMMAAAMMSMMSMMMMAMSAMXMXMSAMXXSXMXSXAAMAAMSAMXMMAMAMAMAXSMMSMSAMMAMAMXAXXAMXAXAXX +XSAXAMAXXAMXMMSMSXMAMMAAXAAXMMSAAMMAMMAMMMAXAMXXMXMASXMXAAXASMXMAMMXAAAASAMAMXAMASAMAXXSMAAXAMSMSMSMAXAMASMMMXMXMSMXMAMXMASAMMAMXAMXMMMMMSMS +SAMXASMMSMMAAAMAMMMAXMXMXMMMXMASMMSMMSAMXMASAMMMMSMAMXAXMMSMMXXXSASMMSSSMSMSXXAMAMASASMAMSXMAMMXMAAAMSXSASAMSAMXMAAAMASXMASAXSAMXASAASXSXAAX +SMSMXAMAAASMSSMAMAMSXSAMMSAMXMAMXXSAAAASXMXSAMMAXAAASMSMMAAAASMAMAMAXAMXMXMAAMSMMSAMAXXAMXAMXMAASMSSMAASXSAMXSMAMMXSSXMAMASAMMMSAAMASMAMSMMM +XXXMSXMXXMMMAMMAMXMXAXMMAMXSXMAXXSMMMSXMASAMAMSSSXSMAXXAMSXSAMMAMAMSMASASAMMSMMAXMAMASXSSMSMAXSMXXAAMMMMMMMMXMXAMXAXAMSXMAMAAAAXMXMSMMSMAXAA +SAMXMSSMSMMMASXMMAXMAMSSSSXMXSASMXXXAXASAMXMSAMXMMMMXMMMMAAAXSSMSSSXXMMASMSAMAMXMSAMXMAXAAAMXMXXXSSMMSAXXAAAAMSSSMXSAMXXMXSMSMSSXXXAAXMSXMAS +MXSAMXSAAAXSMSASMXMMSMAAXAAMXXMAMSXMSMMMXSAAXMMMXAMMSMASMMMMXAAXAMXAMMMXMXMAXXMAAMXMAMMMMSMSSSMMMMAAXSAASMSSMXAMAAAMAMXMXXAAXAAXAASMSMMASXXM +SMSASAMXMMMMAMAMXAXAXMMSMSMMASMSAMMMXASXMAAXXMAMMMXAMXAXMSMXMSMMSSSMSASMSMSSMSSSSSSMMSXAXXMAMAAAASXMMMXMMXAAXMASMMMSMMSAMMSMMMMMMMXAAAMAMMMM +AAXXMMSMSSSMAMXMSXMASXSAAAAXXSAAAXSMSAMAMXMMMSMSSSMSSMSSMAXSAXAAAAAASXMAAAXMAMAAAAAAASMMMXMASXSMMXASXSXXXMAMMMMMMAXSXAXXMAAAAXMASMSMXSMMSAAX +MSMAMAMMAAMSAMXAMASASMMMSSMMXMMMSMMAMXSAMASAAAXAAAXMAXMAMASMSSMMMSMMMAMSMSMMAMMMMSMMMXASXMSAMAAMAMXSXMASXSSXSSMMSMSXMMSMSSSXMMSMSAAAXMXMAXSX +AXMXMAMMMSMMMSMASXMASAXXAMASMSAAAAMXMASASAMMSSSMSMMSSMMAMXXAMXMMAMAAXSXXAXASXSASXMASXSMMAAMASMMMSXMMAMAMXAMXXAXMAXSMMSAMAAMASMMMMMMSMMAMSAXX +MMMXMAMAXAMXAAMXMXMAMMMMASMMASMMSSXAMMSXMASAMXAMAXXMMSMMSSSMMASMMSSMMXAMAMMXAXMMXMAMMAMSMMMAMAAXMAXSAMASXXMASMMMMSMAXSASMMSAMAAMMXMXAMAMXAMM +SAMAXAMMSMSMSSSXMXMXSXMSXMXMXMXMMXXXXMXAXMAMXMSSXSMMAMXSMMAASAMAXAMXXMAMAMXMSMMSAMAMSAMXSASXSMMMSMMSXSXXXXSXSMAMSAMSMSAMXMMAMSMMXAMMSMMXMXMA +SSMMSXSAAXSAMXAMMAMMMAMXAMXSAMMSXAMMXMXMMMAMAMAMXMMMXSMMAASXMASXMASMMMMSMMSAXAAXMMMMXAXAMXSMXXMAAXXXMAMMSXSASXAXXAMMMMMMASMSMMSSSMMAAXXSMMSS +MMSMAAMMMMSSSXMASASXSMMSMMASAXAXMAMAAMXSASASXMASXMAXMAMSAMMXSASASMMAASXAASMAMMAXXAMXMSSSMMSAMSMMSXXASAAMAAMAMMMXSAMAMAASMMAAAMAMAAMSSMMXSAAM +XAAMMMMAXXXAXMAXSAXAAAXAMXAMXMMSASMXSXASAXASXSASXMAXSAMXASMMMAMAMAMSMSMMXMMXMMSASASAAXAAXAMXMAMXMXSXMASMMXMAMAMMAXSXSSXSMMSMMMAMMMMAAAXAMMSM +MSSMXAMSXSMMMMSMMMMSMMSMSMMSASMAMXMAXMMMXMXMXMAXASMASXMSAMXAMAMAMMMMMSXSMMXXXAMMXAXMXMSMMMSASASASMSASAMXSXSMSSMSAMXAXMASXAAAASXXSAMXSMMXSXMM +MMAAMSMXAMXMAMAAMXAAAMXAAASAAMSMXSMASAXMXMSAMXAXAMMAXAMMAMXMSXSMMSAAXMASAMSAMMSSMMSXSXXXMASMSXSAXASAMMXAMASAAAAAXAMXMMMXMAXSMXSAXAMXXAXXSMMM +SSMSMXAMMMAMAXSMMMXXXMSMSMSMMMXXSXMASMSSMSASXMASMXMXMMMSMMSMAAAAASMSAMAMAAMSXSAXAXAASAMASAMXMAMXMXXMASXMMAXMMMMSXSXMXSMMMSMMAXMSMSASXSMAXAAX +AXXMAMAMASAMSXMAXAMSSMSAXAMXSXMSSXAMMAMAMXAXXSXAXAXAAXMXSAAMMSMMMMXXAMXXXMSAMAXSMMMMMAMASMSSSXSAXSAMASXXMMMXAXAMAMMSAMAXAAAMSMAMXXSXMXSSXSMS +MXMMMMMMAMASMASAMXAMAAMAMXMAXAMAMMSXMAMAMMXMXMASMMSMSMMAMMSSXMAXMMSSMMSMSXMASMAXAAXASXMASXAMAAMAXSAMASXSASAMMMSMMMAMASAMSSXMXMSAMXMXXAAXXXAM +XAAASAAMSSMAMAMASMSSMMMMMMMMXAMMSAXXSSSSMSASAMXAMXAAAAMXSAMXXSXSXAXAXAAXXASAMXAMSMSASAMXSMXSMXMXMXAMMSASAXMAXAAAAMXSAMMMAAMSXMXXMAXAMXSSMMAM +SXXXXMXXMAMMMMSAMAXAXMSMAMXSAMMXMXMMAAXAASASMSSSMSMSSSXAMMSXMAASMSSMMSSSSMMASMSXXASASMMMMAMAASMXMSMMXMXMMMXMSMSXMXAMXAXMMSMXAMAMXASXSAMAXAAS +SMMSSMSXXAMXMASASMSAMXAMMMAXMASXMASXMMMMMMXMAMMMMXAXAXMASAMMAMXMAAAAMMMAAXASMMXAMXMXMMSMMAXAXAXXAAXXAXASAMAAXMMASMMSASMSXXMSSMASAMMAMASXMXSS +XASAAAAMSMMXXMMASAMXASMSSMMSXASXMASAXXAAXMXSXMASXMMMASMMMASXSSSMSMMMMAMMMMXMAXSSMSMSMAXSSSSSMSAMSMSSMSASASXMSASAMXSAMMAXAXAAXMAMMXSXSXMAASAX +XSMSMMMAAASMSSMAMMSMMMSAMXXSMXMAMASXMSSSXMMMASAMMAXSAMAAMAMAAAAAXXMSSMMMXSXSXMAAAXAAMAMXSAAXAMXXAAXAXMAMAMAAMXMXMXMMXMXMXMMMSMSSXASMMAXXSXSX +SXAAMASXSSMAAAMSSMAAAMMMSXMXXXSAMMSMMXMAXSASAMMMXXXMASMMMSMMMMMAXAXAAAXSAMMMSMSMMMXMASMMMMMXXXXSMSMSMMAMXMMMMMMSMAXMASMSMMAAAXAAMXSASMSXXAMS +AMMMSASMXAMMMXSAAXSXMMAASASMMXAXSASXXAMXMSAXASXSAXMSXMASAXXXSXXMMMMSSMMMASAAAXAXMXMXMMAAXASXMSMXMAAAMXXXXXSMAAAMMASMMSAAAMMXSSMXMASAMASAMAMS +MSXXMASAXXMSMXMMMMMXSMMMSAMXAAMMMASASXSSMMSMAXAAMXMAXSAMSAMXMXMMSAAXMMMSAMMSSSMSSMMAMAMMMMSAMAAAXXSMSMSASAAMSMSSMMSASMXMMXSMMXXAMXMAMMMMMSMX +XAMMMMMXMXMXXXAMSMAASAMAMXMMSMXAMAMMMXAAXAXMSMSMXSXAXMXXMXMASASASMMMAMXMASAMXXMAAXSXSASMXAMAMSSXSXMXSAAAMMXMXSAMXMSMMAMXSAXAXASXXMXMAMXXXAMX +SMAXXAAAXAMAMMMAAMMMSAMXXAMAASASMSSMSMMMSASAAAAAMAMXSSMMXASASAMASASMXMASAMXMSMMSSMMASASXMMSAMAAASXSAMXMXMASMMAMSAMXAXXMAXMSMMMXMXSAMASMSSMSS +AXSXSMSXSASAXAMMMSAAMAMXMMMSMSXMAAMASAXMXAMMMSMSMSMMAAASMXSAMXMXMAMAMSASAXAXAAAAAAMAMXMXAASAMMMMMAMSSSXMSAAAXMXSASMMMSMMMMAXXMASAAAMXSAASMAX +SMMASAMXMASMSXSAXSMSXSMSXMAMMSAMMMSASAMAMSMMXMAMAAMMMSMMAAMMMXMXMXMAMMASXMXSMSMSSMMXSAMMSMSXMAMAMXMAMAAXMMSAMXMSMMXXAAASASMSASXMASMMXMMMMMSS +XAMXMXMASXMAAAMAMMAXAAAXASASASXMAMMXSAXMAXAMXMAMSSXSXMXAMXMAMASASASXXMAMXAXMMMXMAXSASAXAAXXMSSSMSSMSSSMMXMXMMMMXXSMMSSSMAMASMAMXXAAXMAMAAMAS +SMMSMASASAMMMSMSXMAMMMMMXMAMAMASXSMASAMMMMMMAMXMAMAXASXSMMSASXSASASMSMXMXXMSXMASMXMASAMSMSXMAMAXAAXAAMAAAMXMASMSXSAAXMAMXMAMSSSMSMXMXAMSMSAS +SMAAMXMASAMASAMMAMSXXAXMAMXMXMMAMAAMXXXAAAAXMSSMAXMSAMXAAXSASAMXMAMAAMMSMMXSASAMMASAMMMXAMXMASAMSSMMSMSSXSAXXAAMASXMMMMMSMSXMXAAXXAASMMMAMXS +MMSSSMSASAMXMAMSAMXMSMSMSXXXSSSMSSMMMMSMSSXSASXMSMXXAXXSMMMMMXMAMAMMAXMAMXASAMASXMSAMXAMAMASMMMAMXAXAAAAAMMSXMAMMMMXMAAMAAMMASMMMMMXASAMXMMM +SMMMAAMASAMASMMSASAAAAMAXXMASAXXXXAXXAAXMAXMMMAAMSMMMAXMSAMXXAXASXMSASMASMASASASAASXMMSSXSAMXSXMXMASXSMMMMASASAMSAMXSMSSMSMAAMMAAXSMMSXMMSAM +MAAMMMMAMAMAXAAMASXSMSMAMAMMMMMMMSXMMSMSXMMXSSMMXAXAXMXMAXSXSMSASAXMAMXAMMXSAMASXMMMXAAXAMMXMMAMSAXXXAXXMMASXMASXMMMSAAXAXMMMXXMSXMAXMAMMXAS +SSMMMAMXSXXXMMMMAMMMAMMXXAMAAXAAXXAXXMASMAAAMXMXSMXSAASXSMSAAMMAMMMMMMMSXMXMXMXMAMMXMMSXMMSAXSAMXSMASXMASMXMMSXMMAAAMXMMMMXASMSXXAMMMSAMSSMM +XAAXSSSMMMMMAAAXXXXMMMMSSMSSSMSSSSMMAMMMAMMXXAXAMXAXMASAAAXMMMMSMXAAXAAMASAXMMXSMMSAMXXXAASMMMSXSAMAXXXXXSAAXMAMSSMSSXXAASMMSAMASXMSAXXXAAMX +SMMAAAAXAAMSSSSSSSMMAAMXAXMAMAAAMASAMXXASMSASMMXMMSSXAMMMMXXAXMAASXSSMMXAXASAXAXMASASAMMMMSXSAXXSAMASMXMASMXMXAMXAXXXXSMXSASMAMXMASAAMSMSAMX +XAMMSSMMSSMMAAAMXMAMSSMMAMXAMMMMMAMMMSAMXAMAMSAMXAMAMSSXSMSSSSXSXMMMMXSMMSMMAMMSMMMXMMSMMASAMAMASXMASAXMAXMSSSMXAMXMSMMSASXMMAMAXXMMSSXAMXMA +XXXAAAAXAMAMXMMMMXSMAAXSMMMMSXAMMXSAAXAMMSMAMAXAMXXAMXMASAXMASAXMAXAAAXXAAAXSASAMXSMAAAAXASXMXMXMASAXMXMSSXAAAASXSAAXAAAMSXSSSSSMAXXXMAXMAXS +MMMMSSMMASXMSXMASAXMMMMAAAXMAMXMAAMMMSMMMMAASMXSXSAMXMMAMMMSAMXMMXMMMSMMSMXMMMSAMXASMSSSMMSAAXMASMMXSAAXAMMMSMMAXSMSSMMMXMAMAXAAXAMXMASASMMM +SAAAMAMXAXAMXASASAMXAAXSSMSSMSSMMSSMXXMAAXSMSXMMASMXAXMAXMAXAMSSMMSXMAAXAXSAMASAMMMMMAXXAXSMMMSASAAASXMSASXAXAXMXSAMXAAAAMMMSMSMSMSMXAMMMAAX +SASMSASMXSAMSXMASAASMMXMXMXAAAXAXMAMMMSMSMMMXMAMXMAXMSMMSMXSAMAAAAXAMMSMASMAMMMXSAXAMMXSSMSASAMMXMMXSAMXXMMMMMMXAMAMSSMSXSXAXAMAAAAAMSSSSMMM +MAMXMASAASMMXXMASMXSMSAMXMSMMMSMMSXMXAMMXAMXAAMXMSSMAAASAXAXAMSSMMXSMSAMMMXAMXMAXXSSMSAXMASAMSSMSMSMMAMXXMXSASMMXSAMMMMXAXMASMMSMSMSMMAMAAXX +MAMXMMMMMSAXMAXXMMMSASMSAAMASXAMAXXMSSMASXMSAMSAMAAXXSXMAMMSSMAMAAAMXSASAAXXSAMMSMMXAMXSMAMMMXSAAXAASAMXXMASMSXMAMAXAMSMSAMXSMMXXMMXXMSMSMSA +MAXXMXAXXXMMSASXXSSMMMXSAMXMMSMMSSMXAAMAMMXSAMSAMXSAMXXMAMXAXMASMMMSAMAMMMSMMASAAAMMSMSXMASASAMSMMXXMAXMXMAXMSAMXSSXXMAAMAMXMAXXAXASAXMAAAMA +SSSMMSXSMSMMXAAXASXSMXXXAXMAASXAAAXMXSMSXSAMAMMXSAMMXMAXSAMXSSMSXMMMXMXMXAAAXSMXMMMAXXMASAXXMAXXXMSSSSMAMMXSASXSAAAASXMMMMMASXMMMMMMAMMMMXMM +MMAXAXAXMASXMMMMXMAXXASMSMSMASMMSSMSMMMXAMAXXMAAMASMASXMXMASXAXMASAAMMSMMSXSXXAXMMMMSXXAMXMSSSMSAXAXAAXXMAAMXMASMMMAMAXASASAXMMAAXAAXMASMSSM +MMAMMSMAMAXMASAMMMSMAXAAAXAMMSAMXMAAMAXMMMSMAMMMSASXMXASAMXMSSMSASMMSAAAAXAMAMMMMAAXAXMXSASAAAAXMMSSMMSSMMSMMAMXXASAMXMXMAMXSSMSXSMSSXXAXAAS +SMSXMAXXMSMSAMAMSAASMSMSMSXSAXXAMMSMSMXAAAAMXMAAMAMXSMMMMXXXAMAMAMXAMXSMMSMMAMAASMSMMMAAXMAMSMMMXAXAAXAAAAAXMSMMSXMAMSXSMSMMXMAXAMAAXMMXMSMM +XAAASXSXAAAMMMSMMMMSXAXMASAMASXMAMMMAMMSMSSSSMMSSXMASAXSXSMMSMSMSSSXSAXMMMASXSMXMXAMXASXSXMXMMSAMMSSMMMSMAMAXMAMXSMAXMASAXXAAMAMAMMXSXMAXAMX +SMSXMASMXMXMXAMAMXSMMMMMMMSMAMMXSASMMSAXAXAAAXAAMAMASAMXAAAMAAAAMAAAMASMAXMMMXMAXSAMXXXAAMXXAAMAMXAMXSXMXXXMXSXMASXMAMAMMMASXMXXXMXAMASXSASM +XAXMMXMAMXMMMMSAMXAASXAXMAXMAXMXXAMAAAXMMMMMMMMXMAMXSXAMSMSSMSMXMMMMMMXXSSMAMSMMMSAXXXMMMMASXMSAMMASASAMXSSMAAAMXMASXMAXAMAMXMSXSSMMSAMXXXMA +MXMASAXXAMAXAXAMXMMMMASXMXSSMXSMMAMMMMMAXAXAXAMMSSSXXMSAMAXAAMXAMXAXXMMXMAXSMSASASXSMSMXAMASXAMASMSMMSAMAXAMMSSMMSAMMXSMSAMXASAMXAAAMASXMSSS +XAXSMMXXSXSXSSSXSAMXMXMASMXMMASASXMXXAASMMSMSXSAAMAMXAXXMXSMMMSXSAASAMAMSMMMASAMMMASAAASXMASMXMASXXAXSAMASMXMAMAXMSXSAMMMMSXMMMSSSMMSAAAAAXM +SMSMMASXMAMSAAMAMMXXXAMXXMASMASAMXAASMSMAXSXSAMMSSMMXSXASAMXSXSAXMXMAXSAAXAMXMAMXAAMMMMSAMXXXAMAXASMMSXSAMXSMXSSMMAXMASASASXXAAXAMXMMMSMMMSS +MXMAAAMAMAMMMMMAMMAMSASAMXXMMXSAXMMMMMAMSMMAMXMAMMMSXAXXMASAXMXMMXASAMXSXMASXMASAMXSXXXSAMXXSXSSSMMAXMAXAMAXMXXMAMXSMAMXMAMMSMSMSMASXMMAMAAX +SASMMXSXMAMMXMMXSMAXSAMMMMSXMASMSMSMMSAMXAMAMAMMXAASMMAMMXMAMMASMXXXXXMASMAMXXAXXXAXXXAXXAXMMAAMAMXXMASMSMXMAMXSAMMXMAMXMAMAAAAXXSASAMMAMMSS +SASMSAAMAXXMAXXSAMXMMMMASAMAMASXAAAAAMAXSAMXXXSASMMSASMSSSMMASASMASMXXMAXMAMAMMSMMSSSSMMSSXMMSMMXMASAAXAMASAMMXSASAASASASMSSMSMXAMXXMMXASXMA +MAMAMMSAAMMSASXAASXSAXSASXSAMMXXMSMSMSAMSAMMSMSASAAMXMAAXXAXAXAMXAAMAMMMMSAMSMMAAXAAXXAAAXASAMAMAMXSMMMAMAMMXSXSAMMXXMXASAAMXMASXSXMASXXSMSS +MAMXMXAXXAXAAAMSAMXSAMMASASMMSXXXAXXXMAMSXMAAAMASMMSSMMMMSSMSSSXMAMSASASXSAAAAMSMMMXMMMMSSXMASMMAXMXAXSXMASXSMAMAXMSXMSAMMMSSMAXMAMSASMASAMX +SMSSXXXMMSXMSMAMASMXXAMXMXMAASMSSMSXMAXXMMMSSSMAMXAXAXXMXAXXAAAXXXMSXSASXSMMXSMAXXSMSAMXAMAMAMMMSSSMMMXAMASXAASMSMAMAMMAMXAAAMASMSMMASMSMMXA +MMAMAMAMAMAAXXXSXMAMMSAMXAMMMMAXXAAMASXSMAMMAMMMMMMMXMXSMMXMMXMXMMMMAMMMXXXMAXMMMXSASASMASAMXXSAXXAASXSSMAXXASMAXMXMAMSAMMMMSMMXAXAMAMXXASMS +SMXSASAMSSMMSSMMMMAMSXMASMSMSMSMMMMMMMAASMMMXMASMMMSXSAMAXSASAXMAAASXSSSMSMMMSAMSAMMMAMXMXMASAMMSSSMMMMMMSSMSAMXMMXSSXSMSXSAAXMMSMMMSSMSMMAA +AAASMSASAXAAAXAAXSASXAXMASAXMAMAAAXAAMSMMXASAMMSAASAAMASAMSAMXMASXMSAAASAMXAASAMMAAXMXMASAMXMAAXMAMAAAAAMMAMXAAAAXAAXAMAMAMSSMXXMASAAAMMAMSM +MMMSAMXMXSXMSSMMMSXSMSMAXSSMMXMSSSSMSMMXXSSSMSXSMMMXSSMMMMMAMMMMXSMMMMMMSMSMMSMMSAMXAXSXSMXXASXXMASXSSSSSSXMSSMASMSSMMMMMXMAXMSMSSMMSSMSAMXX \ No newline at end of file diff --git a/advent_of_code_2024/src/day4/mod.rs b/advent_of_code_2024/src/day4/mod.rs new file mode 100644 index 0000000..a757ea7 --- /dev/null +++ b/advent_of_code_2024/src/day4/mod.rs @@ -0,0 +1,3 @@ + +pub mod part1; +pub mod part2; \ No newline at end of file diff --git a/advent_of_code_2024/src/day4/part1.rs b/advent_of_code_2024/src/day4/part1.rs new file mode 100644 index 0000000..18bc97f --- /dev/null +++ b/advent_of_code_2024/src/day4/part1.rs @@ -0,0 +1,36 @@ + +pub fn solve(input: &str) { + let directions = [(0, 1), (0, -1), (1, 0), (-1, 0), (-1, 1), (1, 1), (-1, -1), (1, -1)]; + let grid = input.lines().map(|str| str.as_bytes()).collect::>(); + let width = grid[0].len() as i32; + let height = grid.len() as i32; + let word = "XMAS".as_bytes(); + + let mut matches = 0; + + for xpos in 0..width { + for ypos in 0..height { + 'dir: for direction in directions.iter() { + let mut x = xpos; + let mut y = ypos; + + for letter in word { + if x < 0 || x >= width || y < 0 || y >= height { + continue 'dir; + } + + if grid[x as usize][y as usize] != *letter { + continue 'dir; + } + + x += direction.0; + y += direction.1; + } + + matches += 1; + } + } + } + + println!("matches: {}", matches); +} \ No newline at end of file diff --git a/advent_of_code_2024/src/day4/part2.rs b/advent_of_code_2024/src/day4/part2.rs new file mode 100644 index 0000000..436008d --- /dev/null +++ b/advent_of_code_2024/src/day4/part2.rs @@ -0,0 +1,27 @@ +pub fn solve(input: &str) { + let grid = input.lines().map(|str| str.as_bytes()).collect::>(); + let width = grid[0].len() as i32; + let height = grid.len() as i32; + let words = ((b'M', b'A', b'S'), (b'S', b'A', b'M')); + + let mut matches = 0; + + for xpos in 1..(width - 1) { + for ypos in 1..(height - 1) { + if grid[xpos as usize][ypos as usize] == b'A' { + let left = (grid[(xpos - 1) as usize][(ypos - 1) as usize], + grid[(xpos) as usize][(ypos) as usize], + grid[(xpos + 1) as usize][(ypos + 1) as usize]); + let right = (grid[(xpos + 1) as usize][(ypos - 1) as usize], + grid[(xpos) as usize][(ypos) as usize], + grid[(xpos - 1) as usize][(ypos + 1) as usize]); + + if (left == words.0 || left == words.1) && (right == words.0 || right == words.1) { + matches += 1; + } + } + } + } + + println!("matches: {}", matches); +} diff --git a/advent_of_code_2024/src/day4/test.txt b/advent_of_code_2024/src/day4/test.txt new file mode 100644 index 0000000..c41c5ea --- /dev/null +++ b/advent_of_code_2024/src/day4/test.txt @@ -0,0 +1,10 @@ +MMMSXXMASM +MSAMXMSMSA +AMXSXMAAMM +MSAMASMSMX +XMASAMXAMM +XXAMMXXAMA +SMSMSASXSS +SAXAMASAAA +MAMMMXMMMM +MXMXAXMASX \ No newline at end of file diff --git a/advent_of_code_2024/src/day5/input.txt b/advent_of_code_2024/src/day5/input.txt new file mode 100644 index 0000000..d79d752 --- /dev/null +++ b/advent_of_code_2024/src/day5/input.txt @@ -0,0 +1,1369 @@ +66|22 +76|63 +76|38 +88|43 +88|76 +88|83 +38|98 +38|77 +38|22 +38|75 +12|82 +12|73 +12|93 +12|56 +12|41 +67|26 +67|43 +67|47 +67|92 +67|66 +67|86 +62|56 +62|66 +62|24 +62|41 +62|58 +62|36 +62|79 +54|82 +54|66 +54|93 +54|14 +54|15 +54|58 +54|83 +54|26 +15|41 +15|72 +15|71 +15|65 +15|75 +15|98 +15|67 +15|38 +15|19 +65|44 +65|88 +65|71 +65|78 +65|74 +65|19 +65|36 +65|77 +65|98 +65|38 +73|26 +73|86 +73|22 +73|88 +73|74 +73|44 +73|89 +73|78 +73|19 +73|43 +73|77 +63|23 +63|62 +63|12 +63|67 +63|44 +63|42 +63|85 +63|43 +63|11 +63|83 +63|26 +63|54 +22|11 +22|88 +22|75 +22|69 +22|43 +22|86 +22|78 +22|72 +22|47 +22|85 +22|54 +22|42 +22|23 +46|85 +46|57 +46|76 +46|24 +46|38 +46|62 +46|37 +46|93 +46|79 +46|65 +46|15 +46|12 +46|48 +46|11 +69|79 +69|48 +69|56 +69|24 +69|98 +69|58 +69|36 +69|37 +69|76 +69|63 +69|95 +69|89 +69|38 +69|65 +69|57 +23|69 +23|74 +23|78 +23|58 +23|48 +23|57 +23|86 +23|83 +23|14 +23|88 +23|47 +23|82 +23|92 +23|12 +23|11 +23|62 +33|23 +33|79 +33|98 +33|19 +33|86 +33|88 +33|42 +33|41 +33|36 +33|56 +33|67 +33|78 +33|73 +33|65 +33|77 +33|75 +33|37 +92|83 +92|15 +92|82 +92|76 +92|95 +92|79 +92|47 +92|74 +92|66 +92|57 +92|48 +92|33 +92|12 +92|46 +92|85 +92|69 +92|62 +92|14 +72|83 +72|86 +72|78 +72|85 +72|47 +72|11 +72|23 +72|57 +72|69 +72|62 +72|74 +72|67 +72|54 +72|75 +72|92 +72|44 +72|88 +72|46 +72|42 +98|23 +98|63 +98|43 +98|78 +98|54 +98|75 +98|92 +98|74 +98|86 +98|71 +98|67 +98|72 +98|77 +98|83 +98|89 +98|42 +98|88 +98|11 +98|12 +98|46 +77|26 +77|54 +77|75 +77|42 +77|14 +77|47 +77|62 +77|12 +77|74 +77|69 +77|67 +77|86 +77|11 +77|22 +77|46 +77|92 +77|85 +77|78 +77|44 +77|88 +77|23 +56|72 +56|92 +56|74 +56|26 +56|67 +56|78 +56|75 +56|44 +56|63 +56|88 +56|46 +56|89 +56|83 +56|42 +56|98 +56|14 +56|71 +56|19 +56|23 +56|86 +56|43 +56|54 +14|82 +14|66 +14|38 +14|95 +14|15 +14|41 +14|69 +14|85 +14|47 +14|12 +14|62 +14|37 +14|24 +14|79 +14|11 +14|57 +14|36 +14|48 +14|76 +14|33 +14|73 +14|58 +14|65 +86|12 +86|58 +86|62 +86|95 +86|76 +86|14 +86|15 +86|92 +86|85 +86|54 +86|47 +86|66 +86|82 +86|83 +86|46 +86|26 +86|69 +86|43 +86|74 +86|24 +86|57 +86|78 +86|11 +86|48 +41|86 +41|72 +41|36 +41|89 +41|78 +41|98 +41|43 +41|42 +41|19 +41|23 +41|56 +41|92 +41|63 +41|73 +41|67 +41|37 +41|88 +41|44 +41|75 +41|65 +41|22 +41|71 +41|38 +41|77 +11|93 +11|57 +11|41 +11|58 +11|95 +11|69 +11|15 +11|38 +11|73 +11|37 +11|85 +11|82 +11|56 +11|65 +11|76 +11|24 +11|33 +11|79 +11|62 +11|48 +11|36 +11|47 +11|19 +11|66 +82|63 +82|71 +82|19 +82|65 +82|41 +82|44 +82|73 +82|95 +82|79 +82|38 +82|37 +82|98 +82|93 +82|56 +82|36 +82|77 +82|33 +82|75 +82|24 +82|15 +82|72 +82|48 +82|89 +82|22 +79|22 +79|88 +79|86 +79|38 +79|63 +79|42 +79|72 +79|67 +79|23 +79|56 +79|98 +79|77 +79|43 +79|71 +79|41 +79|36 +79|44 +79|73 +79|37 +79|75 +79|89 +79|78 +79|19 +79|65 +58|89 +58|65 +58|98 +58|63 +58|93 +58|95 +58|24 +58|33 +58|15 +58|77 +58|71 +58|48 +58|82 +58|41 +58|19 +58|38 +58|66 +58|79 +58|73 +58|57 +58|56 +58|36 +58|76 +58|37 +85|58 +85|15 +85|36 +85|38 +85|41 +85|76 +85|57 +85|95 +85|82 +85|33 +85|71 +85|66 +85|93 +85|24 +85|56 +85|37 +85|79 +85|48 +85|19 +85|73 +85|69 +85|98 +85|47 +85|65 +19|98 +19|86 +19|78 +19|83 +19|22 +19|14 +19|63 +19|72 +19|42 +19|23 +19|74 +19|67 +19|44 +19|26 +19|54 +19|71 +19|77 +19|89 +19|12 +19|43 +19|92 +19|75 +19|88 +19|46 +74|66 +74|24 +74|14 +74|93 +74|46 +74|83 +74|48 +74|47 +74|15 +74|82 +74|41 +74|58 +74|62 +74|54 +74|57 +74|26 +74|85 +74|11 +74|33 +74|95 +74|12 +74|79 +74|69 +74|76 +71|63 +71|11 +71|22 +71|67 +71|46 +71|14 +71|74 +71|89 +71|86 +71|72 +71|12 +71|77 +71|42 +71|92 +71|78 +71|23 +71|62 +71|88 +71|83 +71|26 +71|75 +71|44 +71|43 +71|54 +42|78 +42|85 +42|14 +42|48 +42|26 +42|74 +42|46 +42|69 +42|47 +42|54 +42|57 +42|62 +42|66 +42|76 +42|43 +42|92 +42|86 +42|15 +42|12 +42|58 +42|11 +42|95 +42|82 +42|83 +83|57 +83|36 +83|46 +83|24 +83|79 +83|82 +83|93 +83|47 +83|48 +83|95 +83|26 +83|14 +83|58 +83|12 +83|69 +83|33 +83|85 +83|66 +83|15 +83|41 +83|62 +83|65 +83|76 +83|11 +57|56 +57|95 +57|65 +57|89 +57|33 +57|38 +57|98 +57|93 +57|24 +57|48 +57|82 +57|63 +57|19 +57|79 +57|37 +57|66 +57|73 +57|22 +57|71 +57|77 +57|41 +57|36 +57|76 +57|15 +24|93 +24|63 +24|23 +24|88 +24|75 +24|98 +24|56 +24|73 +24|79 +24|36 +24|77 +24|42 +24|72 +24|44 +24|65 +24|33 +24|41 +24|37 +24|19 +24|71 +24|38 +24|22 +24|89 +24|67 +48|63 +48|93 +48|19 +48|73 +48|67 +48|36 +48|22 +48|38 +48|33 +48|56 +48|44 +48|24 +48|77 +48|72 +48|37 +48|79 +48|98 +48|71 +48|95 +48|15 +48|41 +48|75 +48|89 +48|65 +95|33 +95|19 +95|24 +95|44 +95|72 +95|79 +95|22 +95|65 +95|37 +95|67 +95|63 +95|73 +95|89 +95|23 +95|38 +95|75 +95|41 +95|88 +95|71 +95|98 +95|56 +95|77 +95|93 +95|36 +78|76 +78|69 +78|62 +78|15 +78|43 +78|47 +78|92 +78|24 +78|46 +78|48 +78|85 +78|95 +78|93 +78|54 +78|11 +78|66 +78|12 +78|83 +78|58 +78|82 +78|74 +78|14 +78|26 +78|57 +44|88 +44|26 +44|78 +44|47 +44|86 +44|67 +44|92 +44|57 +44|12 +44|11 +44|85 +44|76 +44|14 +44|42 +44|75 +44|69 +44|23 +44|46 +44|43 +44|62 +44|54 +44|58 +44|83 +44|74 +43|12 +43|82 +43|92 +43|14 +43|85 +43|74 +43|76 +43|62 +43|33 +43|95 +43|11 +43|66 +43|46 +43|15 +43|69 +43|47 +43|24 +43|26 +43|57 +43|83 +43|48 +43|58 +43|93 +43|54 +47|65 +47|38 +47|24 +47|73 +47|58 +47|98 +47|56 +47|89 +47|48 +47|93 +47|36 +47|76 +47|41 +47|71 +47|95 +47|66 +47|33 +47|57 +47|79 +47|15 +47|37 +47|82 +47|69 +47|19 +37|38 +37|23 +37|74 +37|98 +37|73 +37|88 +37|89 +37|75 +37|77 +37|44 +37|71 +37|86 +37|43 +37|42 +37|22 +37|19 +37|83 +37|72 +37|54 +37|78 +37|56 +37|63 +37|67 +37|92 +26|66 +26|95 +26|65 +26|82 +26|85 +26|48 +26|15 +26|37 +26|69 +26|47 +26|57 +26|58 +26|62 +26|46 +26|24 +26|79 +26|14 +26|33 +26|76 +26|41 +26|12 +26|36 +26|93 +26|11 +93|56 +93|22 +93|44 +93|65 +93|71 +93|88 +93|38 +93|75 +93|36 +93|72 +93|86 +93|63 +93|79 +93|67 +93|23 +93|73 +93|41 +93|19 +93|37 +93|33 +93|77 +93|42 +93|98 +93|89 +75|86 +75|11 +75|46 +75|14 +75|76 +75|54 +75|26 +75|67 +75|85 +75|74 +75|69 +75|42 +75|66 +75|92 +75|47 +75|83 +75|23 +75|88 +75|78 +75|57 +75|43 +75|62 +75|12 +75|58 +89|92 +89|77 +89|63 +89|86 +89|78 +89|12 +89|67 +89|46 +89|85 +89|74 +89|26 +89|44 +89|54 +89|72 +89|22 +89|43 +89|83 +89|14 +89|88 +89|11 +89|75 +89|62 +89|42 +89|23 +36|43 +36|23 +36|22 +36|72 +36|71 +36|54 +36|73 +36|74 +36|56 +36|78 +36|63 +36|89 +36|38 +36|37 +36|19 +36|77 +36|88 +36|42 +36|98 +36|67 +36|92 +36|44 +36|86 +36|75 +66|44 +66|65 +66|33 +66|77 +66|95 +66|89 +66|63 +66|71 +66|56 +66|82 +66|98 +66|36 +66|79 +66|15 +66|19 +66|73 +66|72 +66|48 +66|37 +66|41 +66|24 +66|38 +66|93 +76|36 +76|48 +76|73 +76|56 +76|24 +76|93 +76|33 +76|77 +76|19 +76|95 +76|66 +76|41 +76|98 +76|71 +76|22 +76|37 +76|65 +76|15 +76|82 +76|79 +76|72 +76|89 +88|47 +88|69 +88|26 +88|78 +88|82 +88|62 +88|14 +88|86 +88|66 +88|74 +88|48 +88|11 +88|85 +88|15 +88|58 +88|12 +88|92 +88|57 +88|46 +88|54 +88|42 +38|23 +38|92 +38|44 +38|43 +38|54 +38|63 +38|26 +38|19 +38|73 +38|42 +38|71 +38|78 +38|88 +38|56 +38|74 +38|86 +38|72 +38|89 +38|83 +38|67 +12|33 +12|76 +12|62 +12|66 +12|85 +12|95 +12|69 +12|11 +12|38 +12|57 +12|79 +12|58 +12|15 +12|24 +12|48 +12|65 +12|37 +12|36 +12|47 +67|23 +67|85 +67|12 +67|82 +67|88 +67|58 +67|78 +67|57 +67|42 +67|46 +67|14 +67|11 +67|54 +67|69 +67|62 +67|76 +67|83 +67|74 +62|33 +62|76 +62|95 +62|19 +62|15 +62|85 +62|82 +62|38 +62|93 +62|37 +62|73 +62|69 +62|65 +62|57 +62|48 +62|98 +62|47 +54|76 +54|79 +54|48 +54|12 +54|47 +54|33 +54|24 +54|62 +54|46 +54|57 +54|65 +54|11 +54|95 +54|69 +54|85 +54|41 +15|44 +15|73 +15|63 +15|89 +15|93 +15|22 +15|36 +15|24 +15|56 +15|37 +15|33 +15|77 +15|95 +15|79 +15|23 +65|92 +65|72 +65|43 +65|63 +65|86 +65|75 +65|73 +65|89 +65|22 +65|42 +65|67 +65|23 +65|56 +65|37 +73|98 +73|67 +73|72 +73|83 +73|42 +73|56 +73|75 +73|54 +73|92 +73|71 +73|63 +73|23 +73|46 +63|14 +63|77 +63|22 +63|74 +63|47 +63|78 +63|46 +63|72 +63|92 +63|88 +63|86 +63|75 +22|26 +22|14 +22|74 +22|92 +22|46 +22|58 +22|62 +22|83 +22|44 +22|67 +22|12 +46|36 +46|47 +46|58 +46|14 +46|41 +46|66 +46|69 +46|82 +46|95 +46|33 +69|66 +69|93 +69|15 +69|33 +69|73 +69|82 +69|19 +69|71 +69|41 +23|76 +23|46 +23|42 +23|85 +23|26 +23|66 +23|54 +23|43 +33|63 +33|44 +33|89 +33|71 +33|72 +33|22 +33|38 +92|11 +92|54 +92|24 +92|58 +92|26 +92|93 +72|14 +72|12 +72|26 +72|43 +72|58 +98|44 +98|26 +98|14 +98|22 +77|43 +77|83 +77|72 +56|77 +56|22 +14|93 + +11,62,85,47,69,58,57,76,66,82,48,15,95,24,93,33,79,41,65,36,37,38,56 +42,86,69,46,92,76,43,62,11,54,57,74,47,85,12,66,26,83,48,14,78 +77,22,75,67,23,88,78,92,83,26,14,11,62 +19,44,98,65,56,41,36,24,33,22,38,48,77,75,73,15,63 +54,83,11,62,47,69,66,82,48,93,41 +95,33,79,36,38,98,89,63,77,72,23 +85,47,76,82,48,79,65,36,38,73,19 +33,24,65,41,98,85,37,79,19,15,38,48,76,82,56,95,57 +46,14,12,11,62,85,47,69,58,57,76,82,15,24,93,33,79,41,65,36,37 +33,79,41,73,98,71,22,44,75,67,23,88,86 +58,57,76,66,82,48,15,95,24,41,65,37,38,73,56,98,71,89,63 +41,62,69,12,38,14,76 +23,38,73,72,89,71,88,37,42,41,22,86,44,63,43,75,19,77,56 +15,48,62,58,47,66,69,78,11,82,83,76,46,95,26 +95,24,93,33,79,41,65,36,38,56,19,98,71,89,77,22,72,44,75,67,23 +71,73,57,38,66,93,24,77,19 +73,43,89,75,98,63,72,36,42,41,38,67,19,78,23 +95,15,24,65,58,36,85,46,14,33,82 +11,83,92,66,15,47,86,46,54,48,26,78,57,74,82,85,62,69,14 +75,78,54,83,67,74,88,72,62,22,86,85,46,26,43,42,44,77,14,47,12 +67,23,88,42,86,78,43,92,74,54,83,26,46,14,12,62,85,69,57,76,66 +75,19,63,86,83,92,88,44,77,72,14 +58,76,38,57,98,82,73,48,41,95,85,93,36,56,15,79,66,65,47 +98,89,44,22,23,79,36,77,41,71,38,56,65,37,75,33,88,67,72 +75,88,56,41,72,89,24 +48,15,95,24,33,79,41,36,37,38,73,71,77,22,72,44,75 +89,63,77,22,72,44,75,67,23,88,42,86,43,92,74,83,46,14,12,11,62 +82,48,93,79,56 +65,36,38,73,56,19,71,89,63,44,88,42,92 +67,38,65,19,63,77,71,89,42,22,73,44,72,56,37,41,36,98,33,88,23 +63,22,75,88,42,86,78,26,46,14,11 +76,66,82,48,95,24,79,41,37,38,73,56,19,98,71,89,63,77,22 +41,71,44,73,19,79,98,24,37,82,72,22,89,33,65 +54,56,23,77,75,44,92,73,26,78,67,19,74 +71,12,11,63,26,46,42,88,83,78,44 +57,15,73,24,12,48,85 +44,75,86,92,46,12,69,58,57 +79,23,73,38,42,72,19,86,41,36,77,33,63,67,37 +65,98,73,43,86,72,22,56,88,36,63,41,42,71,37 +72,44,88,42,54,26,46,14,12,62,47,69,58 +24,93,79,41,38,73,56,98,63,77,22,72,75,67,88 +44,65,67,36,92,78,22 +75,23,83,12,62,57,76 +24,79,41,65,73,56,71,77,72 +15,82,71,48,66,79,63,72,38 +76,95,33,79,41,73,89,63,22 +85,76,15,79,65 +79,41,65,36,37,38,73,56,19,98,89,63,77,22,72,75,67,23,88,86,78 +85,47,69,58,57,76,66,82,48,15,95,24,93,79,41,37,38,73,56,19,98 +63,77,72,44,75,67,23,88,42,86,78,43,92,74,54,83,26,46,14,12,11,62,85 +92,47,58,66,14,69,15,33,24 +26,48,93,69,24 +22,75,26,19,71,98,74,23,63,43,44,88,89,92,78,56,72,54,67,83,73 +78,43,46,85,69,76,24 +22,23,56,83,44,38,92,77,43,98,54,74,89,72,63,19,42 +67,23,88,43,74,54,14,47,69,57,66 +66,82,88,74,47,83,43,62,26,92,78,86,42,54,23,14,85,58,12,11,76 +89,63,77,22,72,44,75,23,88,42,86,78,43,92,74,54,83,26,46,14,12,11,62 +36,73,71,89,22 +48,82,62,76,43,54,88 +33,15,58,57,92,74,93 +19,89,69,37,57,58,36,73,98 +15,79,41,73,19,98,71,89,77,22,44,75,67 +58,15,24,65,36 +93,33,79,41,37,38,19,98,89,63,77,22,72,44,67,88,42 +41,65,36,73,98,89,63,77,72,44,75,67,42,78,43 +78,92,83,12,11,48,95 +69,44,75,26,47,14,83,67,11,57,46 +71,48,56,36,19,72,15,33,79,38,75 +12,79,66,58,95,93,82,15,73,48,85,41,24,47,33,69,62 +72,36,71,89,33,38,44,79,37,65,93,67,63,77,98,19,41,24,75,73,15,56,95 +33,38,15,66,56,19,79,41,62,37,82,57,58 +86,78,43,92,74,54,83,26,46,14,11,62,85,47,69,58,57,76,66,82,48,15,95 +72,38,71,89,77,75,36,19,67,63,88,73,37,43,22,98,41,65,23,44,42 +38,93,14,58,48,15,57,65,62,69,76,82,47,79,36 +79,65,36,73,56,19,63,22,75 +89,36,72,38,23,73,71,63,37,98,65,22,33,19,79,77,44,67,93,24,56,41,88 +54,23,44,74,72,56,67,83,75,77,22,92,38 +86,44,85,83,22,67,63,77,92,72,78,74,14,54,88 +83,26,46,12,62,85,47,69,58,57,76,66,82,48,15,95,93,33,79,41,65 +69,58,57,76,48,24,33,79,65,19,89 +79,38,82,11,69,12,36,66,15,41,95,33,76,85,24,58,57 +72,67,71,19,22,41,77,63,37,42,33,65,56,44,75,89,88 +57,76,66,48,15,95,24,93,33,79,41,65,36,37,38,73,56,19,98,71,89,63,77 +67,83,92,19,23,71,44,63,56,74,77,54,22,46,89,75,86,98,78 +93,33,79,41,65,36,37,73,56,19,98,71,89,63,77,22,72,44,75,67,23,88,42 +19,75,44,77,83,72,22,73,54,26,78,89,63,56,86 +62,85,66,48,15,36,38,56,19 +71,75,67,42,78,92,14 +48,12,47,24,65,41,76,57,95,82,85,62,79,58,15,66,73 +65,37,89,23,22,78,42,86,77,67,79,88,72 +37,76,47,33,62,57,19,79,95 +19,63,75,23,78,43,26,46,14 +78,22,65,38,19,98,89 +65,66,82,98,48,15,95,73,24,69,37,58,76,93,57,47,79,41,85 +12,43,75,42,54,58,92,47,11,86,83 +38,73,98,71,63,77,22,72,44,67,88,42,78,92,74 +71,89,63,75,88,42,78,92,12 +33,82,38,72,89,22,98,66,19,65,48,41,77,73,15 +71,57,38,73,47,58,48,41,37,79,24,15,33 +98,71,63,77,22,75,88,86,43,92,74,54,83,26,46,14,12 +43,92,54,83,26,46,12,11,62,85,47,69,58,57,76,66,82,48,95,24,93 +23,56,22,86,88,19,72,75,71,65,77 +67,23,88,42,86,78,43,92,74,54,83,26,46,14,11,62,85,47,69,58,57,76,66 +47,69,57,15,36,19,98 +89,22,44,75,23,88,86,78,43,92,54,26,46,14,12,11,62 +22,37,19,36,74,42,88,23,77,72,56,98,38,73,78 +58,57,76,82,15,24,41,65,36,37,73,19,71 +42,86,43,92,54,83,46,14,11,62,58,57,76,66,82 +46,75,63,86,56,72,71 +77,71,46,22,44,72,67,14,78,12,89 +75,63,12,88,62,77,72,86,92,22,23,89,78,11,42,54,83,14,46 +73,33,37,67,72,42,36,44,23,98,19,88,41,89,79,77,65,75,56,93,38 +78,63,43,75,42,92,71,77,72,12,44 +12,48,85,36,38,11,37,76,95,65,15,24,41,14,62,33,82,47,66 +58,85,57,65,11,24,37,48,33,12,82,76,79 +44,56,36,82,48,95,63,33,98,37,65 +85,47,58,57,82,48,79,65,73,19,98 +46,14,11,62,85,69,58,66,82,95,24,93,41,36,37 +26,43,71,83,67,23,22,86,78,74,75,73,98,88,19,77,56 +58,57,76,66,82,48,15,95,24,93,33,79,41,65,36,37,38,56,19,98,71,89,63 +15,95,79,41,36,37,38,73,19,98,71,77,72,75,67 +43,98,54,86,72,92,14,63,46,23,26,74,77,89,19 +85,65,93,76,79,41,58,47,69,11,24,33,95,15,82,83,14,48,26,57,46,66,62 +77,73,63,67,86,22,56,41,89,19,65,43,37 +76,24,93,38,95,66,82,65,69,56,89,37,79,57,36 +67,88,42,78,43,92,74,54,83,26,46,14,12,11,62,85,47,69,57,76,66 +92,66,82,93,85,12,58,11,48,43,47,74,24 +69,95,11,12,47,54,86,82,43 +15,24,77,72,44 +89,71,88,73,75,86,41,19,37,63,65,38,33,56,67,42,44 +36,37,38,19,71,89,63,77,72,44,67,23,42,92,74 +67,88,86,43,92,74,54,83,46,14,12,11,62,85,47,69,57,76,66 +85,76,83,95,14,74,86,46,57,62,92,78,12,47,58 +66,82,15,24,93,33,79,41,65,36,37,38,73,56,89 +22,72,44,75,67,23,88,42,86,78,43,92,74,54,83,26,46,14,12,11,62,85,69 +65,75,23,93,33,41,37,77,79,88,72,19,56,38,44,67,89 +69,58,57,76,66,82,15,95,24,93,33,79,41,65,36,37,73,56,98,71,89 +43,92,74,83,26,46,14,12,11,62,85,47,69,58,57,76,66,82,48,15,95,24,93 +36,65,37,38,57,48,85,41,19,56,79,58,66,24,15,33,82,62,73 +98,63,77,22,67,88,86,92,74,83,26,14,12 +26,66,48,83,93,12,62,79,14,57,82,33,69,24,74 +33,22,23,79,63,95,75,71,36,93,72,24,56,67,98 +57,82,48,15,93,33,79,41,36,37,56,71,77 +41,46,93,57,58,36,15,62,69,65,37,11,33 +69,58,76,66,82,48,95,24,33,79,37,38,19,98,71 +42,12,78,83,43,74,86,58,76,69,46,48,26,82,11,14,85,92,47 +24,33,79,41,65,36,73,56,98,89,77,22,72,44,88 +19,22,73,65,33,63,36,48,15,93,71,66,89,77,72,37,82 +36,11,62,41,93,82,66,79,47,24,15,57,95,65,56,38,58 +95,14,93,46,74,48,58,62,11,83,33,66,92 +83,38,88,71,22,89,78,86,56 +66,82,48,95,24,33,41,65,36,37,38,19,98,71,77,22,72 +85,33,93,95,14,62,47,57,48,76,58,69,12,82,38,24,11 +19,98,71,89,63,77,22,44,75,23,88,42,78,92,74,54,83,26,14 +14,26,92,44,86,42,78,74,89,22,75,62,67,11,77,12,43 +85,47,69,58,57,76,66,82,48,15,95,24,93,33,79,41,65,36,37,38,73,56,19 +43,22,73,88,78,38,72,86,71,67,98,63,92,77,74,23,19,36,56 +42,86,78,43,74,54,83,26,46,14,12,11,62,85,47,69,58,57,76,48,15 +62,33,85,82,66,12,95,24,26,92,83,58,76,69,93,57,46 +67,78,74,46,11,69,76 +66,79,24,65,12,83,57,62,58,46,69,93,76,33,14 +19,83,77,54,42,38,98,89,75,86,92 +93,62,37,11,65,41,38,12,15,69,47,58,66,48,24,33,76,14,36,85,79 +57,93,79,56,11,48,38 +77,22,75,67,23,88,78,43,74,83,26,14,47 +24,79,41,38,73,56,19,71,89,77,72,44,67,23,88 +57,12,85,62,92,76,26,47,69 +65,37,38,56,19,98,71,63,72,44,67,23,42 +63,33,37,19,77,98,79,48,75 +23,88,42,86,78,43,92,74,54,83,26,46,14,11,62,85,47,69,57,66,82 +56,73,72,83,43,38,71,77,44,92,75,67,88 +79,75,41,56,36,98,93,44,63,19,24,38,77,65,33,72,22,95,71,73,67,23,37 +14,42,85,47,43 +89,43,74,63,78,92,42,77,88,86,22,83,72,67,56,73,26,23,98 +56,19,98,71,72,44,75,23,78,43,92,74,54,26,46 +83,85,11,12,54,82,93,62,79,57,76,46,24,69,14,74,66,48,15 +54,22,83,77,67,75,23,26,14,44,11,78,63,72,43,12,92,46,86,89,71 +73,19,98,71,89,63,77,22,72,44,75,67,23,88,42,86,78,43,92,74,54,83,26 +86,83,67,88,73,38,23 +54,62,58,78,74,11,48,14,66,76,57,88,69,46,12,43,47,26,42,83,86,82,85 +12,62,58,82,95,41,73 +83,14,12,11,62,76,66,48,15,95,93,79,65 +69,15,33,79,65,36,37,73,89 +77,19,24,89,48,71,33,98,37,79,95,65,22,93,82,41,76 +19,93,38,56,44,89,37,79,48,36,22,63,82,98,41,33,73,15,77 +47,86,69,12,72,26,62,85,23,11,42,22,54,67,43,44,75,46,83 +62,47,65,58,76,24,36,33,57,41,12,14,82 +43,42,86,88,44,89,72,67,19,74,23,54,92,63,71,78,14,77,75,22,26 +72,75,42,78,43,83,46,69,58 +23,88,62,47,69,66,82 +22,98,75,38,72,37,23,19,92 \ No newline at end of file diff --git a/advent_of_code_2024/src/day5/mod.rs b/advent_of_code_2024/src/day5/mod.rs new file mode 100644 index 0000000..a757ea7 --- /dev/null +++ b/advent_of_code_2024/src/day5/mod.rs @@ -0,0 +1,3 @@ + +pub mod part1; +pub mod part2; \ No newline at end of file diff --git a/advent_of_code_2024/src/day5/part1.rs b/advent_of_code_2024/src/day5/part1.rs new file mode 100644 index 0000000..dfa1193 --- /dev/null +++ b/advent_of_code_2024/src/day5/part1.rs @@ -0,0 +1,45 @@ +use std::collections::{HashMap, HashSet}; + + +pub fn solve(input: &str) { + let lines = input.lines().collect::>(); + + let mut ordering: HashMap> = HashMap::new(); + let mut updates = Vec::new(); + let mut index = 0; + + loop { + if lines[index].is_empty() { + index += 1; + break; + } + + let order = lines[index].split_once("|").unwrap(); + ordering.entry(order.0.parse::().unwrap()).or_default().insert(order.1.parse::().unwrap()); + index += 1; + } + + // we reverse the lists, so we can keep a set of numbers that may not occur. I.e. if we see them after it means + // they occur before so the input is invalid + for line in lines[index..].iter() { + let mut update = line.split(',').map(|num| num.parse::().unwrap()).collect::>(); + update.reverse(); + updates.push(update); + } + + let mut update_score = 0; + 'upd: for update in updates { + let mut naughty_list: HashSet = HashSet::new(); + + for num in update.iter() { + if naughty_list.contains(num) { + continue 'upd; + } + + naughty_list.extend(ordering.entry(*num).or_default().iter()); + } + update_score += update[update.len() / 2]; + } + + println!("update score: {}", update_score); +} \ No newline at end of file diff --git a/advent_of_code_2024/src/day5/part2.rs b/advent_of_code_2024/src/day5/part2.rs new file mode 100644 index 0000000..b510779 --- /dev/null +++ b/advent_of_code_2024/src/day5/part2.rs @@ -0,0 +1,66 @@ +use std::cmp::Ordering; +use std::collections::{HashMap, HashSet}; + +pub fn update_valid(ordering: &HashMap>, update: &[i32]) -> bool { + let mut naughty_list = HashSet::::new(); + + for num in update.iter() { + if naughty_list.contains(num) { + return false; + } + naughty_list.extend(ordering[num].iter()); + } + + true +} + +pub fn solve(input: &str) { + let lines = input.lines().collect::>(); + + let mut ordering: HashMap> = HashMap::new(); + let mut updates = Vec::new(); + let mut index = 0; + + loop { + if lines[index].is_empty() { + index += 1; + break; + } + + let order = lines[index].split_once("|").unwrap(); + ordering.entry(order.0.parse::().unwrap()).or_default().insert(order.1.parse::().unwrap()); + index += 1; + } + + // we reverse the lists, so we can keep a set of numbers that may not occur. I.e. if we see them after it means + // they occur before so the input is invalid + for line in lines[index..].iter() { + let mut update = line.split(',').map(|num| num.parse::().unwrap()).collect::>(); + update.reverse(); + updates.push(update); + } + + let mut invalid_updates: Vec> = Vec::new(); + for update in updates { + if !update_valid(&ordering, &update) { + invalid_updates.push(update.clone()); + } + } + + let mut update_score = 0; + for update in invalid_updates.iter_mut() { + update.sort_by(|lhs, rhs| { + if *lhs == *rhs { + return Ordering::Equal; + } + if ordering.entry(*lhs).or_default().contains(rhs) { + return Ordering::Less; + } + Ordering::Greater + }); + + update_score += update[update.len() / 2]; + } + + println!("updates core for invalid updates: {}", update_score); +} diff --git a/advent_of_code_2024/src/day5/test.txt b/advent_of_code_2024/src/day5/test.txt new file mode 100644 index 0000000..d4d4441 --- /dev/null +++ b/advent_of_code_2024/src/day5/test.txt @@ -0,0 +1,28 @@ +47|53 +97|13 +97|61 +97|47 +75|29 +61|13 +75|53 +29|13 +97|29 +53|29 +61|53 +97|53 +61|29 +47|13 +75|47 +97|75 +47|61 +75|61 +47|29 +75|13 +53|13 + +75,47,61,53,29 +97,61,53,29,13 +75,29,13 +75,97,47,61,53 +61,13,29 +97,13,75,29,47 \ No newline at end of file diff --git a/advent_of_code_2024/src/day6/input.txt b/advent_of_code_2024/src/day6/input.txt new file mode 100644 index 0000000..f60adc3 --- /dev/null +++ b/advent_of_code_2024/src/day6/input.txt @@ -0,0 +1,130 @@ +.............#........................................................#...#...........................................#........... +.....#...............................#.........................................#...#...............#........##...............#.#.. +..................................#..................#.......................................#...#................................ +.........................................#................#....#..............................................#................#.# +........#.........................................................#...........#.......#..............................#............ +........................#.............................#.......................#.......#.......................#........#.........# +................................#.......#............................................#...........................................# +...........#........#...#..#...........................#..................#.............#.......#..........................#...... +............................................#........#.......#..#......#..............................#..#................##...... +............#..#...#......#.........................................##.......#..........#.......#...................#............. +.....................................................................................#.....#...................................... +.......................................................#................#.....................................#................... +...........#.....#.#....................................#.......#.#...........#................#.......#.................#........ +............#.............#....................#....#............................#.........................................#...... +.#..........#......#................#........................#............#..#..............#..................................... +..................#....#...........................................#.....#.....#.........................................#.#...... +.............#..............#..#...........................#..#..........#...............................#........................ +.................................................................................................#................................ +.......................................................#..............#..............................................#..#......... +......#............................#.......................#................................................................#..... +..........#.........#..................#....#....#...#......#.........#.................................#........................# +..#...#............................#............#.......###.................................#.............................#...#... +.................#....#...................#........................................................................#..........#... +....#..........................#......................................................................#.....#......#.............. +.#........................................................................#..........#............#..................#............ +...................##.#.......................#....#.#........................................#.........##........................ +#...........................................................#..........#........#.#..................................#............ +.......#...#.........................................#.......#........#...............##..#....................................... +......................#....#...............................#......................................................#..#............ +......#.....................................................#...............................#......................#..#........... +.........................#.#...................................................................................................... +.......................................#...............#...................#................#..........#.#......................#. +.......#......#...#...........................#.........................#...............#..#...............#.............##....... +.....#..#..#..................#............#......................................................#...#.........................#. +#.#...............#...........#................#...................................................#..........#................... +..........................................................................#...............................................#....... +.........#.......#..........................#.##.............................#..##...#.......................................#.... +....#...............#..........#........................................#.....#.........................................#......... +...........#................................................#....##...................................................#..#........ +........................#........#...........#...#............................................#......................##........... +......#........................................#...#.............................................#................................ +#.....#......#..................................#.............#..#...............................#................................ +..................#......................#..........#...................#............................................#....#....... +.................#.............................................................................#.......#.......................... +......#........................................................................................#...#....................#......... +....#......................#..................##..................#.......#.......................#...........#.........#..#...... +............................................................#......##.............................#.#.....#............#.......... +..............#.......................#...^.....................................#.....................................#........... +..............#...##......#..#.....#..........................................................................#.......#.........#. +.#................................................................#........##......#....#.......#................................. +....#.....................#........#...........#.............................................#........#................#......#..# +...................#.............#.........#.........................#...........#..................#...................#....#.... +.#...............................................#.....#..#...#................................................................... +........................##............#.....................................#........#..................................#......... +..............#................................#.....................................#...................................#........ +...........#..........#...........#........#...................#..#..........................#.................................... +.#..............................................................#....#.......#.....................................#.............. +.....................#........#......#................#.............#........................#.......................#........#... +.........................#..............#...#....#..................#............................................................. +..#............................##.........................................................#...........................#.#..#...... +.....#............#...##........#..........#....#......#................................#.................#...............#....#.. +.....#...............#.............................#............#......#....#........................................#............ +...#..........#.........#.....................##.......#.....#...................#................................................ +.................................#...........................................#.................#...........................#...... +..........................................................#........................#.......#.................................#...# +..#......#......................................#...#..#....................#...........#....#.............................#...... +..#........#.............#......................#...#.....#....#........................#..#...................................... +.........#...........#.......................................................................#.........#....#...#................. +..................................#....#.............##....#.......#.........#.........................................#.......... +....#.................................................#.......#...........#.......................................##.....#........ +..............................#.........................................................#.....#........................#.......... +...#........#...........#..#..................................................#..............#.............................#...... +................................................#...............................................................#.....#..#.....#.. +...............#.........................#..#...................#....................................#................#........... +............................#...........................................................................................#......... +.....#.........................#.......#..#..##.............................#................##.......##............#............. +.........#........................................................................................................................ +.........................#............................#........................#.....#..........#.....................#...#..#.... +.......#........#..............................#..........................#...#.................#............#.................... +#...#..#...............................#..........................................#...#...#.........................#............. +...........................................................#..............#..........#..................#......................... +...........................................................#..............................................................#....#.. +...........#.......................#................#......#.....................................#..................#.....#....... +.....#.................................#........................#.#...................#.....#............#........................ +...........................#.#............#..............#..............#..#...#..........................#................#...... +.........#...................#........................#......#..#..................................................#.............. +.............................................#.................................................................#.......#.......#.. +#.......................#...............#.......................#...........#................................#.................... +......................................#............#....................................................##...................#.... +#...............#...........................................#......#....................................#...............#......... +...#...............#.................................#..................................#..#............#......................... +......................#..#............#..#..............................................#......#....#...............#............. +..................#.....................#.....#...................#..#................#....#..........#......#..........#......... +.......................#.....#..............#..........................#............#...................#.#....................... +......#...........#..............#........#........................................#......................................#....... +............#................#..##....................................................................#........................#.. +...........#....................................#.............................#.....#....#...#.#......................#........... +...................................................#...............................#....................#.........#............... +........#......#..#................#..................................................................#.................#......... +.............................#................................................#...........#.....#....#............................ +........#.............#.........#............#....#.....................#........#...............#................................ +..#................................#................................#..#......#.............................................#..... +.........#...........................................#..................................#....#..#.....................#........... +.....................................................#.........................................................#.................. +.........#...#.#.....#.......##................................#...#..........................#........#.......................... +......................##...............................#.......................................................................... +.........#...#.....#........................................#................#........#............#........#..................... +...............#............#.................................................................#................................#.. +......#..............#...................................................#............#.....................#..................... +.........#.........#.............................................................................................................. +.#........#...............#..##......#..............................#...........#..#.........#...........................#........ +...................#................................................................................#...............#............. +..............................................................................#........................#................#......... +...........#.....#..#.#....................................................#......#......#..#................##................... +....#......#...................................................................#..............#.....#.........#..................# +..#...........#...#...........#.......##..........##......................#......................................................# +..................#................................................#.#............................................................ +#................................................................#............#...##..........................................#... +......#............................................#.......#.#.................................................#.................. +..............................#..............#.#....#............#..........................#..................................... +............................#..................................#.................#..#...........................................#. +.........................................#................#..................#...#............................#..#......#........# +....................#..............................................................#..............................#..........##... +...#......................................#...........#..#............................................#.....#....#................ +................#..#....#......................................................................................................... +...................................#...................#...............................#................................#.......#. +..........#.................#.............#..................#...............................................................#.... +.....#...........#........#................#.........................................#..........................#......##......... +..........................#................#..............................................................#....................... +........#.................................................................#......................#.#..........................#... \ No newline at end of file diff --git a/advent_of_code_2024/src/day6/mod.rs b/advent_of_code_2024/src/day6/mod.rs new file mode 100644 index 0000000..a757ea7 --- /dev/null +++ b/advent_of_code_2024/src/day6/mod.rs @@ -0,0 +1,3 @@ + +pub mod part1; +pub mod part2; \ No newline at end of file diff --git a/advent_of_code_2024/src/day6/part1.rs b/advent_of_code_2024/src/day6/part1.rs new file mode 100644 index 0000000..d54ba0b --- /dev/null +++ b/advent_of_code_2024/src/day6/part1.rs @@ -0,0 +1,42 @@ +use std::collections::HashSet; + +fn find_start(grid: &[&[u8]]) -> (i64, i64) { + for (ypos, row) in grid.iter().enumerate() { + let Some(xpos) = row.iter().position(|ch| *ch == b'^') else { + continue; + }; + return (xpos as i64, ypos as i64); + } + + panic!("No starting position found"); +} + +pub fn solve(input: &str) { + let grid = input.lines().map(|line| line.as_bytes()).collect::>(); + let width = grid[0].len() as i64; + let height = grid.len() as i64; + + let mut position = find_start(&grid); + let mut positions: HashSet<(i64, i64)> = HashSet::new(); + let mut direction = 0; // up + let directions = [(0, -1), (1, 0), (0, 1), (-1, 0)]; // up right down left + + loop { + positions.insert(position); + let new_pos = (position.0 + directions[direction].0, position.1 + directions[direction].1); + + if new_pos.0 < 0 || new_pos.0 >= width || new_pos.1 < 0 || new_pos.1 >= height { + break; + } + + if grid[new_pos.1 as usize][new_pos.0 as usize] == b'#' { + direction = (direction + 1) % directions.len(); + } else { + position = new_pos; + } + // print_grid(&grid, position); + } + + println!("We have seen {} unique positions for the guard", positions.len()); + +} diff --git a/advent_of_code_2024/src/day6/part2.rs b/advent_of_code_2024/src/day6/part2.rs new file mode 100644 index 0000000..6197ad3 --- /dev/null +++ b/advent_of_code_2024/src/day6/part2.rs @@ -0,0 +1,4 @@ + +pub fn solve(input: &str) { + +} \ No newline at end of file diff --git a/advent_of_code_2024/src/day6/test.txt b/advent_of_code_2024/src/day6/test.txt new file mode 100644 index 0000000..b60e466 --- /dev/null +++ b/advent_of_code_2024/src/day6/test.txt @@ -0,0 +1,10 @@ +....#..... +.........# +.......... +..#....... +.......#.. +.......... +.#..^..... +........#. +#......... +......#... \ No newline at end of file diff --git a/advent_of_code_2024/src/day7/input.txt b/advent_of_code_2024/src/day7/input.txt new file mode 100644 index 0000000..f617be2 --- /dev/null +++ b/advent_of_code_2024/src/day7/input.txt @@ -0,0 +1,850 @@ +9151: 132 1 8 714 972 5 21 1 +740: 136 4 40 1 85 71 +1959240: 61 84 4 6 563 +9619353: 62 7 1 9 92 19 44 17 3 4 +85383: 141 8 4 6 9 5 49 +468373294: 7 25 841 46 101 329 4 +634495747544: 83 6 5 5 5 8 95 8 3 7 542 +1473921: 18 1 54 270 8 1 +191617: 9 2 3 78 617 +105545: 1 49 5 1 209 +3074260824: 89 4 90 5 9 4 3 62 452 9 +7871304: 9 3 6 7 96 456 3 1 9 6 8 +113179142: 7 7 96 6 70 6 6 4 49 3 2 7 +65190: 79 7 3 7 246 +111675278: 3 856 13 5 11 9 1 69 7 1 +18232286011544: 911 6 143 5 4 11 544 +2525217842: 2 9 9 8 5 1 4 8 6 4 310 3 +2754: 4 5 8 51 7 4 6 +9742: 77 15 27 6 8 6 81 7 80 +996566149: 674 4 12 668 45 22 1 7 +161036550888: 71 12 27 7 8 550 880 7 +6631527185: 7 5 98 5 9 764 1 7 185 +626: 72 3 379 8 23 +339047997: 914 3 409 904 88 +91402: 115 786 951 60 1 +2463205322: 9 2 8 60 5 821 1 6 8 5 2 +11096244: 24 9 2 43 508 +2761679223799: 8 8 8 5 1 8 490 1 22 799 +9228832: 43 19 8 4 353 +27049036274445: 8 9 5 4 9 791 5 34 3 8 4 2 +1366911546: 793 7 22 123 91 +123461: 53 1 9 5 38 5 338 88 +3822: 63 7 6 +18091789: 1 697 8 7 951 83 785 4 +7714: 469 92 1 13 408 +30391973: 8 593 8 6 1 2 3 8 5 7 6 71 +353583: 6 41 6 29 7 83 +198733471: 66 244 3 595 876 +358201: 6 49 29 7 6 5 47 57 +986380800: 148 51 7 24 64 85 +101112: 931 72 22 29 37 724 +743680946: 7 9 7 5 38 34 23 9 3 49 7 +115585260: 6 6 92 6 5 25 894 +15917620: 1 4 414 140 272 180 +28029104911: 84 15 3 278 4 114 8 +1123377777: 2 50 299 7 5 176 4 4 4 +108274258: 39 209 8 80 65 4 527 2 +6517: 7 7 40 1 3 9 2 5 7 3 144 1 +34114050: 4 8 38 57 9 8 43 123 5 1 +116285217: 10 9 322 2 88 1 4 9 4 15 +57634: 1 496 99 1 6 15 4 4 4 4 2 +26014: 986 9 26 55 89 +9106125640: 956 3 6 1 8 496 522 5 8 +721: 6 60 361 +4047586935: 59 61 1 679 32 +44558521: 856 72 52 859 49 1 +560032830: 10 1 2 1 915 8 7 20 85 6 +1855165370808: 8 7 5 4 1 76 1 4 370 80 8 +1146142: 7 578 3 7 48 94 +329511: 469 7 2 10 11 +420024: 2 73 6 4 516 +126044109: 61 9 6 729 91 25 9 +48703404994: 408 9 3 8 54 6 397 79 4 +5979: 8 7 9 731 88 8 7 3 9 7 3 +10432490441: 939 853 2 4 5 3 37 41 +119418127: 2 64 3 3 1 1 7 5 60 1 2 7 +87128064: 4 39 44 4 8 696 +2130168: 1 5 8 6 9 757 8 7 329 1 9 +97426804: 75 36 97 372 4 +806038: 1 26 6 24 69 3 536 686 +1313845: 26 19 8 6 9 5 +22504: 7 9 6 962 940 400 +3587483330: 92 39 874 4 286 +874581: 8 7 458 3 +8216470392: 3 7 74 81 2 8 3 314 5 9 4 +139797569: 4 1 9 8 1 7 268 71 5 61 8 +50791720425: 7 4 25 2 1 48 76 80 8 4 9 +946998094001: 721 7 46 130 93 994 7 +173645680: 310 56 4 5 680 +34416111: 956 45 8 64 49 +3093564117903: 66 72 42 781 80 155 4 +60037497240: 670 4 1 8 5 9 5 63 30 7 4 +310072: 738 2 35 18 4 +47077801344: 9 966 18 476 632 +126008: 453 669 9 669 70 8 +264843: 20 1 3 6 1 4 51 4 45 +81426920: 9 9 426 1 9 20 +466206: 19 5 178 38 2 2 9 9 1 3 6 +752675046: 858 6 35 3 2 6 5 78 62 6 +4462816920: 59 823 27 746 978 +84744: 6 2 844 9 11 +11830537: 1 3 3 6 44 8 7 19 7 1 39 +63332543: 623 9 60 1 71 527 5 9 +194775: 7 330 4 19 1 12 1 6 5 15 +394568496: 494 85 42 651 976 +24439099581: 41 73 887 9 907 +174366325623: 6 900 722 95 35 624 +444: 66 7 41 1 80 247 +837: 67 1 3 330 69 367 +196056917: 88 2 8 1 147 7 9 2 908 8 +409060: 6 615 82 86 30 94 8 4 +47090: 9 164 1 3 2 33 4 7 2 80 4 +7175: 64 2 823 8 66 7 +20344478588: 3 405 972 2 53 513 2 +659821815620: 613 343 263 5 69 620 +802485555: 2 444 5 7 6 88 16 5 535 +102625677: 1 8 65 2 608 7 3 4 5 +51268162: 879 90 529 80 62 +1662663653: 40 9 6 653 6 6 9 4 46 1 5 +1749: 3 6 89 1 769 +2104465: 6 9 7 49 7 1 9 7 1 1 2 243 +39785040: 3 975 678 4 3 5 +325326: 463 7 9 49 64 3 +505443247: 3 6 3 4 31 2 3 9 322 2 8 1 +6685230840: 84 5 8 1 8 35 79 13 841 +555959866: 3 47 111 2 7 5 98 68 1 +1232050199: 943 6 6 4 7 864 6 1 2 20 +24433540629540: 82 5 83 718 629 541 1 +139844572: 834 9 31 601 286 +352024115: 81 457 8 1 6 294 7 95 +466754400: 72 51 3 9 224 63 +1956636464: 397 89 61 66 463 4 +179284672885: 40 8 82 86 796 56 8 85 +12195470: 7 7 3 710 95 1 38 4 3 +1450501930: 9 5 2 1 7 95 19 1 4 28 5 5 +214898: 8 406 2 96 9 4 4 7 16 2 +27864: 6 966 4 +34977: 4 7 6 6 30 +1128443492504: 8 37 9 749 46 25 2 2 +7965: 13 4 17 9 9 +7258: 1 8 50 7 7 5 8 +9527870: 3 451 8 118 7 46 +9428848: 7 543 125 5 91 +4401902: 5 5 3 1 53 4 3 5 9 2 146 2 +14286283265: 26 996 54 98 65 +2644109705: 279 32 16 2 413 808 +2068932: 61 7 5 969 7 92 9 7 2 +20472203604: 1 9 3 6 2 2 7 3 37 760 1 4 +58617495: 2 171 3 9 177 104 214 +398838423580: 301 18 8 8 92 235 80 +18786839: 26 8 7 1 7 64 919 9 +6278462: 3 956 655 389 1 +9088797: 36 17 3 5 1 5 99 3 +2974506427701: 493 1 2 8 8 737 754 1 +19231: 5 9 420 4 5 271 24 27 +2350420985703: 3 7 1 23 5 6 7 7 53 9 877 +2736: 334 1 8 63 1 +2231907992: 9 149 18 81 509 248 +1118593: 86 1 13 483 106 4 +420262: 68 123 545 571 6 +1386900: 2 67 5 21 516 1 2 2 1 5 5 +26430: 5 522 50 12 68 +1832437: 277 35 189 80 +27477720: 8 66 48 6 48 15 1 508 +789621523: 4 983 8 1 2 1 515 8 +49684854: 77 5 6 9 8 252 90 5 84 +2088517152: 4 3 90 63 7 2 876 53 +4067837: 763 8 42 567 5 +844082: 43 7 7 5 76 29 2 2 9 512 +54108: 67 9 8 56 1 81 +54075944: 870 92 47 4 299 +7776679: 89 5 7 48 71 66 7 1 8 +819893: 3 98 9 3 4 9 2 800 8 693 +1052: 5 1 7 25 +794511615: 18 49 79 9 613 +5775164984242: 765 937 754 42 4 2 +166105353: 2 8 1 1 557 8 994 +449204: 8 9 959 556 2 1 28 +1307419: 1 2 2 4 4 8 4 9 8 178 5 7 +136481: 1 2 21 2 780 3 5 5 7 6 89 +2845449257: 284 5 449 257 +147060: 4 3 2 9 190 +1154: 6 3 8 8 2 +8713340202: 2 3 8 1 567 66 49 749 2 +285498: 154 269 672 495 747 +93244906260: 257 48 31 5 59 60 33 +199254: 9 362 8 51 3 22 +52132: 5 6 8 3 9 6 3 85 990 5 7 +81110: 4 912 157 16 6 +217141: 75 4 7 71 41 +243480250794: 6 67 8 6 7 4 6 744 1 7 7 4 +1461781: 90 66 6 42 9 1 1 +17748024: 7 7 80 926 5 4 10 87 24 +3203786001678: 46 7 4 1 45 85 8 1 678 +202847059: 7 1 943 2 470 59 +19485111: 39 9 575 2 496 5 146 +112166340: 701 2 8 60 2 74 69 +2188134198: 51 3 7 4 1 341 1 6 82 +10944961: 9 5 7 161 89 9 10 6 3 3 6 +42331808802: 2 1 4 5 7 65 37 2 746 6 2 +5325792196: 8 9 374 2 40 1 2 7 2 7 9 +12021872: 51 614 23 393 1 1 2 +4767141: 611 17 2 39 15 +3718357725: 7 1 1 5 1 5 5 5 44 2 5 417 +7646335: 41 4 41 889 84 851 +40469: 8 5 1 3 67 +615330: 643 26 918 300 888 +50260150: 359 700 5 2 8 8 6 5 +125520: 5 5 963 73 120 +647346227: 6 437 8 76 87 295 34 +29711242851815: 70 474 259 897 47 4 1 +5548803: 5 2 32 7 66 332 87 +450: 19 3 23 5 9 +132343: 8 54 40 4 2 3 52 4 3 4 27 +1179858960: 6 70 333 5 7 74 18 +497886150: 199 444 805 7 4 86 +141950: 4 7 8 1 7 8 46 543 4 6 9 4 +149735820035: 153 5 752 975 35 +100199700585: 91 94 765 708 1 583 +1044062784: 2 3 1 755 4 8 661 4 1 16 +5204633552: 5 5 52 4 63 22 7 5 1 5 5 +3620: 1 4 28 6 94 3 45 +295284: 3 41 40 60 84 +48248907: 902 19 8 938 3 5 4 9 3 +615145: 2 1 209 29 84 +2709056: 443 8 5 6 56 +54847043762: 2 7 704 3 746 4 5 5 5 1 8 +1120898: 56 6 6 556 +106037568094: 89 6 770 442 40 36 9 4 +19146429617: 32 28 7 2 7 1 6 959 7 53 +15963224760: 2 248 993 7 4 5 6 212 +776736688: 211 9 63 5 31 87 688 +364586: 18 346 49 9 6 +14059350: 8 2 363 6 8 6 785 +8619: 4 2 619 +16720759: 636 291 710 9 4 9 6 +798569985: 637 928 823 5 51 +210270837: 964 1 7 862 3 541 3 7 2 +2778624710: 231 10 2 4 9 4 8 7 1 2 1 +2153: 387 13 26 1 3 5 +3148076678: 314 807 667 6 1 +16220433195: 9 9 6 3 45 275 1 899 46 +29050653: 7 7 4 29 9 64 7 3 3 +4504999: 8 9 3 9 7 91 2 2 6 8 501 7 +24476553: 2 610 799 84 7 25 553 +960837415277: 24 68 388 213 26 4 77 +362770: 58 781 28 8 5 15 142 +98892626: 120 44 67 9 626 +56: 2 1 53 +264046: 4 970 7 5 53 +362427305: 6 2 9 423 84 4 6 15 7 +319715433: 8 928 7 9 259 8 7 69 69 +227299: 415 3 3 7 1 2 1 6 9 3 4 80 +2284578: 8 660 4 242 784 2 +2808058480: 90 390 731 8 2 +516: 22 1 22 5 464 2 +992: 4 39 50 31 7 7 3 8 99 5 2 +289123: 141 2 17 694 8 3 +564264010: 9 159 96 17 44 14 +485047: 67 740 4 598 69 +3790642776: 984 6 2 21 207 642 +95881: 604 2 1 3 9 52 877 +593105029510: 920 969 644 993 511 +24022618098: 1 5 3 9 3 9 8 5 972 4 7 94 +58556544: 30 4 1 5 794 218 6 32 +253136185: 506 270 5 11 26 57 +5474366: 741 6 246 414 4 3 8 96 +16587427068: 729 79 72 304 767 4 3 +50874781: 6 96 883 139 7 9 +5895: 75 7 130 9 +242279046: 13 9 6 520 4 52 8 80 6 +2242: 4 559 8 +11592154: 1 89 1 268 1 1 664 490 +16020118: 6 709 400 62 1 56 646 +1299962: 20 47 80 98 27 7 16 4 +295680: 1 3 5 40 52 800 5 8 +10464417: 9 2 6 27 3 3 34 83 +34462664411: 78 5 3 1 5 666 4 38 3 2 +8555: 96 88 59 44 4 +1169280986289: 9 4 35 928 9 86 289 +276164011: 119 444 60 49 14 1 +318180816: 53 6 175 5 814 +2591: 2 5 75 2 58 8 3 +32533493: 6 6 5 7 3 55 9 30 53 3 23 +229398: 266 4 1 45 1 5 9 16 663 +1728893159421: 8 1 28 9 8 566 69 11 1 8 +76054443206: 7 7 1 3 54 28 4 7 8 6 58 7 +35589: 20 57 66 1 7 1 1 14 +1253928: 74 5 65 64 52 +13626929426: 2 90 700 2 147 26 +17809524054: 51 5 1 97 4 5 72 54 +224832107: 93 68 3 8 107 +71645285: 98 143 73 89 5 +1030424: 4 6 5 87 596 4 5 92 7 5 +14471016: 516 57 82 52 6 +172454: 4 9 9 2 266 78 8 +855653: 5 2 82 8 65 287 366 +1226600: 7 37 1 473 5 58 8 7 979 +447240: 3 64 833 8 323 426 +15238243461: 21 7 39 2 69 9 730 2 +1071922335: 7 7 4 3 2 96 116 5 2 5 +229848187: 3 241 942 149 38 +45344183: 3 3 77 42 308 3 651 81 +4901: 888 7 5 2 424 +46609776: 568 1 34 82 589 6 +47824041: 469 33 515 6 108 3 +4985084: 1 912 5 34 2 13 +93130324833: 4 3 8 9 2 71 28 9 2 4 67 3 +149374: 30 1 118 37 4 +1027499: 6 55 3 7 100 248 3 34 1 +1019443816: 5 5 94 393 92 7 892 +148406254: 4 2 397 86 89 +1046424933: 5 48 276 19 5 40 9 837 +789121218468: 394 17 64 3 12 184 68 +24606: 394 61 1 26 531 8 6 +32826875: 5 3 24 35 2 7 449 8 75 +78610925642: 4 61 99 8 7 14 9 256 40 +563129: 19 9 9 1 939 5 501 1 3 2 +1185206173: 469 9 41 824 5 3 2 5 4 9 +88615648: 9 7 3 2 94 806 3 6 9 7 21 +3541: 44 3 74 8 55 +104271660: 3 487 26 633 6 8 15 3 +20881: 32 651 3 2 44 +1876729: 4 168 9 780 748 +28509624384: 996 8 4 286 3 84 +1026553844795: 74 92 52 5 527 4 72 7 5 +29043744111: 6 437 2 2 6 47 8 5 2 9 1 +1722468804: 9 2 4 636 9 6 142 1 866 +270229300: 6 6 890 10 4 3 48 5 92 +3004099: 894 6 28 6 8 2 78 45 +3616992: 3 60 600 8 1 5 51 1 4 9 2 +214643388: 39 55 73 70 388 +914715656: 7 1 20 11 3 352 9 4 8 8 +21106475520: 119 1 213 6 1 130 2 32 +53262303: 68 2 8 5 780 5 +507716: 498 7 81 85 60 45 6 +19438755840: 4 3 6 9 96 28 16 5 558 +684865: 66 7 18 52 71 9 78 5 +50379008: 2 9 8 843 83 261 2 5 6 7 +1751841: 125 36 403 9 3 +411768738: 9 65 20 73 78 92 231 6 +25: 5 8 12 +69387321: 69 3 8 731 8 +74878624: 1 20 379 7 8 1 2 6 7 4 4 +17592: 8 9 5 8 9 +55543298: 7 822 1 9 710 +52244409: 884 985 6 4 5 +27014: 270 1 4 +290549879: 538 3 5 83 360 +57134: 9 693 9 1 79 965 +1602647: 6 9 68 23 7 +2542: 24 47 1 7 88 +1341748: 134 167 7 1 8 +49167143: 3 79 37 108 38 12 336 +1229666510: 17 376 391 45 3 1 4 2 4 +918: 9 1 7 54 +1066482049: 2 2 7 7 6 3 7 53 6 9 535 9 +401582160: 340 7 86 6 327 +11328164873: 3 77 9 1 54 5 7 9 34 2 4 1 +4608: 6 5 719 6 6 78 +523320: 27 6 9 81 602 534 +5810: 8 70 8 84 9 109 +678988872: 9 3 99 4 126 8 56 4 4 9 +3745560: 28 7 546 35 2 +10516660: 3 3 53 9 34 26 3 8 7 70 2 +255469822776: 7 87 7 3 48 79 95 4 3 9 8 +69634: 2 298 5 3 26 74 +16699318278: 9 277 3 99 30 1 6 5 6 5 4 +18603: 69 8 5 3 8 +67053055690: 1 2 515 434 4 1 569 3 +141888: 733 6 1 3 64 +873288345622: 15 161 19 6 6 96 6 2 3 +112480808: 8 15 6 61 8 64 628 1 4 4 +8506730: 69 70 93 658 766 +10772735: 8 3 624 8 26 +29935635: 36 8 22 85 1 5 811 +870: 46 85 22 1 715 +96866: 8 1 260 7 5 2 5 2 1 9 8 7 +21406467537232: 37 24 2 35 5 8 376 482 +24602893: 72 8 2 2 8 8 2 96 3 873 7 +140909724814: 297 27 7 9 158 5 1 1 3 4 +3454011: 575 49 2 3 354 3 +286400393: 706 86 89 57 53 +18063592456: 9 808 6 56 511 767 +27428489: 421 83 2 544 9 +1796674401: 9 11 4 7 6 72 2 326 5 4 9 +337021994: 6 311 29 9 692 2 +7026159: 78 8 53 8 59 6 159 +443282: 382 16 45 1 68 34 7 73 +1046899268800: 466 6 9 779 4 1 7 880 4 +3651: 346 8 7 30 74 +572386770216: 6 8 69 7 7 50 55 6 486 +21346403103: 981 207 3 40 876 57 6 +2463381202: 7 4 6 3 3 8 52 77 55 3 94 +30407481: 9 5 621 318 4 +13515323217: 681 1 592 6 49 33 +1087609539: 332 9 2 90 431 416 +410953440: 9 91 93 5 987 955 485 +171585054: 124 6 72 1 256 174 9 +28973728: 25 3 1 96 5 1 8 6 83 4 7 8 +345430: 60 2 55 269 778 +2723562: 7 1 7 9 5 5 5 2 37 5 8 2 +24545063129: 6 6 3 3 4 2 9 43 20 1 930 +189356832874: 4 836 2 2 3 6 2 786 874 +1664708: 3 1 79 2 2 523 +3234: 566 1 4 9 66 8 879 6 +51568806: 978 8 44 9 4 97 91 8 2 +21978100: 17 65 67 525 4 +516143: 6 309 278 731 +1604981961: 862 1 4 8 5 7 7 6 69 8 4 9 +230: 9 21 2 7 1 31 +29711: 3 981 22 6 55 +7387441984: 52 2 76 2 557 839 +2497700061: 2 7 26 37 81 29 9 +283450487882: 9 446 7 3 5 8 4 9 596 5 6 +4611600047: 823 5 160 35 47 +18762785: 3 101 90 688 60 965 +6039720: 6 4 9 699 1 2 7 1 5 5 25 4 +18778179043: 7 9 81 3 6 8 7 528 3 1 13 +107610050: 8 50 7 4 952 8 13 6 7 3 2 +322506: 930 55 36 95 270 9 9 +112567: 1 3 874 8 8 72 1 2 12 27 +2187945065478: 6 853 342 5 2 6 5 9 6 5 +378542670168571: 94 635 6 67 542 4 571 +95370: 36 20 2 5 66 +60925172439: 572 3 202 5 2 710 19 +1864083431: 11 65 2 8 83 429 +130006538: 3 49 5 50 6 4 1 1 93 45 +45205660: 3 44 5 7 2 98 20 9 6 1 4 +4473939: 5 8 902 6 79 885 9 +9229836: 3 4 6 5 5 811 9 194 80 6 +126846796: 4 1 4 3 783 79 6 +354965538790: 3 48 6 965 5 3 878 1 2 +1523: 8 561 881 2 71 +2911951343: 41 157 34 5 9 1 343 +3411360640: 3 5 1 885 2 103 6 3 641 +8384: 90 5 11 3 8 +58070691758: 9 796 988 626 6 +4606: 38 79 56 669 2 +1855761377: 1 2 4 177 57 6 12 95 82 +8785483574: 6 27 5 2 1 5 53 8 2 82 1 7 +12108: 70 32 969 889 58 6 +14567: 1 6 12 78 7 4 480 237 +150941: 5 7 5 90 941 +786264: 6 788 1 989 396 602 +51732: 39 781 63 2 70 +4021802: 7 718 7 8 6 436 +307443454: 482 30 405 76 6 +6876720: 68 767 1 6 1 +3775473626: 94 38 684 4 26 +477729: 96 211 222 93 7 +186422884169: 1 2 86 92 6 2 8 6 4 16 9 +10320797: 130 8 4 992 29 +5947214674: 5 94 72 146 74 +75017587536: 75 10 1 758 753 6 +87977: 28 7 80 579 93 +595019375: 3 2 736 1 199 7 976 63 +5401506: 68 355 82 223 +423147: 6 7 23 6 2 38 9 +37519365: 9 8 92 5 360 98 5 8 5 +153574577: 86 21 7 172 8 829 670 +749: 292 79 378 +1322409: 397 871 46 8 409 +1616671693: 9 6 3 4 4 43 2 6 9 9 2 469 +8395504261: 2 4 39 542 3 5 4 2 63 +1485870: 6 2 9 8 9 7 35 847 4 722 +1438: 4 13 880 463 3 40 +272444064: 7 3 3 5 33 7 7 2 6 1 944 6 +463128200: 92 625 6 40 5 +17757: 5 62 57 81 7 +223440: 6 94 9 264 3 9 95 2 +17536: 183 3 337 22 8 +159298: 73 85 491 802 5 +7217725681: 3 1 88 3 3 2 94 7 7 40 46 +9102004482: 8 6 20 37 4 99 8 1 143 2 +73: 6 8 11 9 5 +522: 73 14 6 +2317: 3 88 75 6 654 +45537732: 7 1 1 58 95 2 1 5 9 5 2 6 +292143828: 683 6 801 6 89 972 +26166150: 82 7 25 7 6 2 95 8 6 3 75 +524161499002: 73 825 563 24 71 +535311: 89 675 7 90 65 356 +912: 4 6 866 +26016: 796 8 89 47 4 +1953265: 8 8 8 3 5 8 5 64 3 9 7 370 +184602403: 18 10 3 32 62 40 403 +16262943763: 146 8 88 2 90 6 8 29 6 2 +102402849: 328 214 8 39 81 +28237920: 1 5 575 902 14 2 4 267 +823891: 85 2 736 8 94 +146882851: 706 25 9 885 94 919 +5015: 9 1 3 412 71 1 +39960936: 2 5 365 2 85 6 92 184 +149149800: 79 4 7 41 47 860 +245273298: 272 525 6 1 7 7 5 9 +36014801803: 3 5 1 9 2 296 5 180 2 +9268771223: 122 92 8 754 23 +3879: 1 7 5 97 +6366882079: 5 280 25 1 73 5 4 3 2 5 9 +22651880: 4 566 2 2 376 5 +416: 397 2 17 +7522024: 666 3 8 7 7 644 36 76 +12054942: 1 16 48 872 6 125 13 3 +1804617: 8 77 14 505 4 2 16 +4979592: 1 684 479 62 69 +13230: 7 7 5 6 9 +188694006: 260 7 955 1 68 74 +664824301: 76 399 783 4 7 925 +99691298: 7 72 2 989 98 +2957: 40 58 8 516 52 61 +20566962720: 48 3 2 704 221 2 4 6 54 +768427128109: 8 50 10 3 904 810 7 +6527661: 8 36 61 9 1 993 2 9 2 4 +28558016: 237 908 7 738 4 3 17 4 +5416190: 6 9 136 814 7 3 611 4 5 +3058632: 384 4 2 895 7 59 92 +13389382: 8 7 1 2 759 7 295 1 7 2 +162903312071: 6 520 30 6 586 9 55 68 +1105: 4 2 86 1 184 +156: 83 34 5 2 32 +75682: 2 97 759 5 79 +738707: 7 4 7 9 54 916 7 +181872944: 2 6 48 511 3 339 93 9 5 +6916941511: 3 688 6 9 3 83 1 8 24 11 +215342: 3 3 7 2 534 69 1 67 540 +399338: 7 114 8 7 956 +2973648: 9 333 992 84 7 533 +3201299426: 1 2 3 5 1 8 43 2 57 2 3 23 +522701569: 5 22 58 3 9 15 5 2 1 6 8 2 +303731392: 5 1 9 9 930 84 35 63 6 8 +34897940825: 610 13 46 89 44 8 25 +29346: 8 3 49 67 6 +60466566943: 4 6 3 3 3 29 91 68 438 9 +3078173: 276 237 6 164 9 +1526065: 61 5 316 3 2 44 73 +1346: 382 814 9 45 96 +9683184: 9 2 5 537 16 7 7 +47632853: 79 363 25 6 54 +18427387459263: 2 9 42 7 385 2 4 592 62 +72445: 1 1 76 9 93 +354603: 9 3 8 2 29 4 893 975 +30207570456: 21 449 202 83 84 +1601402382: 623 34 56 7 6 47 18 +805: 51 5 618 89 42 +453218: 453 156 52 2 8 +2454691634: 3 7 52 4 58 67 7 16 34 +4249375: 376 8 3 2 5 4 44 8 7 18 4 +11202362: 466 76 1 5 24 +13890175488: 495 575 352 9 778 36 +77784300: 82 512 5 97 15 6 3 +3417: 17 5 91 3 3 2 46 16 2 3 3 +158868604400: 295 538 158 604 400 +14794788: 7 3 3 10 469 72 734 6 +496329: 55 9 51 2 1 90 726 +49702: 5 967 66 69 2 +5820848128: 65 789 227 5 1 8 611 +9911: 900 9 905 +2116507855: 939 7 7 46 926 920 9 +678377763: 7 35 8 866 57 3 8 1 9 6 1 +15252661: 8 7 25 265 8 +432963: 6 1 16 8 1 9 4 395 8 1 4 7 +462883134: 2 314 4 1 5 5 4 9 5 5 989 +20394944733: 2 40 259 72 280 1 93 +25449007500: 56 3 875 82 630 +673: 4 6 6 9 98 35 +433234809674: 481 369 3 45 2 962 5 4 +2231307: 932 1 1 5 239 +5496: 421 29 8 1 1 12 +361056486: 95 38 527 33 4 86 +14832: 2 119 7 +55377: 355 66 256 9 58 2 9 +3672207430366: 64 290 1 229 9 7 33 96 +924506: 8 1 8 7 7 307 4 825 72 7 +585727992: 406 75 29 24 2 5 72 +4464: 4 3 50 9 8 +969362: 2 30 8 420 +91356570230: 3 6 6 34 2 9 92 9 3 6 2 28 +21019: 41 38 543 7 +24076855887: 481 53 2 3 2 1 17 7 5 2 +5655436: 4 1 5 666 6 62 8 5 22 3 3 +2196815: 6 1 6 6 742 76 +197984593: 394 39 502 4 806 +225: 7 3 3 1 9 +54870: 914 4 1 6 +966: 25 9 641 93 7 +37809635: 53 269 851 87 321 2 3 +3735230: 18 717 5 43 1 36 995 +514763246: 3 8 21 10 76 3 23 1 7 1 9 +203727: 7 6 82 79 720 9 +17269915: 8 7 15 4 4 2 95 6 69 2 65 +10989115532: 7 8 1 650 6 4 6 2 3 11 3 5 +42746579602: 70 422 7 607 2 86 414 +128541973: 67 37 954 2 1 4 +2255236: 5 80 424 931 61 5 +335089472: 6 10 5 904 5 6 68 478 +342735588: 17 14 40 433 36 +9159: 9 21 35 27 5 384 +955712: 6 199 64 8 +429600: 1 96 52 29 4 100 +16629466: 870 9 41 38 70 4 46 7 1 +428326080: 2 8 6 715 4 6 2 6 4 65 6 +11696320: 36 547 4 40 8 +3480960: 60 14 8 74 7 +9707101: 995 6 975 +1408: 2 510 386 +82190387178: 821 871 32 8 7 1 81 +3057975750: 765 3 47 3 7 9 8 8 4 5 5 6 +1089290533: 3 4 3 5 1 603 7 69 533 +4645808: 451 2 133 771 37 +1875141773: 24 353 997 74 34 6 3 5 +1485138665414: 3 99 28 74 6 95 47 414 +37584: 87 9 6 8 +54241847: 3 530 6 7 341 +831532886240: 7 3 8 3 525 1 827 140 8 +2269440: 34 64 2 97 15 768 +3335: 5 3 8 6 92 24 3 640 +1607: 9 5 1 35 +926184: 88 19 82 7 7 84 +211117960879: 9 5 8 20 866 7 67 691 7 +9035504: 8 36 1 7 193 2 8 +1081599840165: 4 7 30 8 782 9 34 33 5 +1193940730: 958 47 18 66 7 30 +655320: 6 551 71 9 28 94 17 +2132901: 8 6 2 3 9 6 9 3 7 10 277 7 +6688892: 1 667 88 83 3 6 +5173437: 14 87 8 35 64 +29980: 23 13 54 26 +78634578: 65 55 8 3 34 6 803 +51202768: 420 4 2 878 2 359 409 +329599694594: 533 1 258 84 32 23 +419178834: 4 41 5 2 9 2 8 1 2 5 9 246 +203412475243: 4 168 6 5 2 6 47 4 5 7 4 1 +27075: 7 2 1 3 62 852 +416831779: 8 533 5 399 91 7 7 +3976787: 52 2 9 7 865 9 +240484: 70 1 885 5 48 8 2 1 236 +1959168: 573 4 2 4 223 9 3 8 4 8 3 +13400405953: 7 403 5 392 181 +54686971: 6 6 3 12 1 9 479 3 559 1 +15780086: 8 2 4 24 4 8 9 2 94 8 80 4 +5328139588: 877 15 9 50 9 7 1 9 6 13 +103650: 7 9 9 6 3 4 14 2 51 984 6 +1132504: 3 47 906 5 5 4 +1325436: 64 445 1 4 651 +522368033: 985 59 53 53 36 +17934048: 5 4 6 748 74 +32923: 8 80 5 92 3 +1684403: 68 375 9 66 64 2 734 9 +111745: 89 91 7 88 411 2 452 +13263230: 163 3 131 62 4 +3868986962: 6 42 362 167 98 72 8 5 +11345670: 3 43 145 63 27 +319239004896: 50 6 72 85 768 16 8 63 +3034544540: 3 5 867 4 33 12 4 3 +40627: 4 51 4 9 +47169937111206: 47 1 69 937 111 208 +112164822847: 5 804 2 7 7 66 3 84 5 2 1 +5803503559: 7 7 904 7 6 868 88 2 6 +11634120945: 947 6 29 4 306 943 +34851742: 913 7 9 3 63 55 98 +6297303600: 8 72 2 2 653 5 4 6 5 490 +9669310775124: 869 94 1 629 308 611 +4741903666: 6 1 9 6 182 6 77 1 6 4 2 6 +1410872158446: 7 5 271 80 3 958 7 4 98 +343116238185: 10 359 7 898 36 92 9 +400086541453: 837 478 54 1 453 +6515098: 63 25 7 270 254 +348: 30 4 6 +239609608: 1 1 6 19 5 33 607 28 53 +7414288540: 49 42 859 3 5 4 10 +96771: 6 200 1 8 43 1 37 56 3 +1894118717: 281 674 2 176 68 3 7 +6310857469: 80 8 6 160 6 3 5 11 7 6 9 +6182479: 6 72 92 77 2 +1032: 925 2 57 48 1 +1091687: 8 8 2 736 2 6 915 2 999 +543443: 92 1 59 3 49 +165718061: 2 7 6 22 24 445 5 6 5 +610745: 754 9 9 1 5 +5361319385: 8 8 2 3 777 193 76 9 +6159: 191 1 4 907 61 5 339 +493628437516: 7 421 75 9 5 9 3 7 1 886 +15757062: 104 293 147 2 9 9 3 51 +11216: 79 480 142 2 8 +6822: 23 13 3 7 543 +3388859842: 5 8 555 43 87 25 170 +8334: 25 77 9 75 9 +2250866676: 8 7 29 9 3 9 42 5 7 86 7 4 +89826408460: 4 411 863 36 6 457 +153485: 23 922 642 7 437 112 +36262905: 3 4 4 61 2 571 1 5 13 5 5 +22502497: 970 280 2 9 2 498 +2331369: 84 70 3 5 900 5 734 27 +22804091: 54 711 60 593 869 +24912366556: 76 4 88 3 700 607 7 44 +781102: 324 8 7 20 39 24 +341021: 41 9 881 3 51 46 118 1 +125012160: 48 14 56 952 36 45 2 +8601135: 928 45 3 6 9 20 971 17 +580850: 29 5 40 96 712 44 +26137464000: 61 1 95 10 860 4 129 +86455555: 868 9 199 1 5 +353502837: 5 11 261 66 969 86 9 +1766966: 243 665 65 2 908 +40398720: 8 59 727 795 64 +15777929: 1 36 6 6 886 8 6 35 +26640: 12 14 9 26 7 52 2 7 7 1 9 +6825793: 8 245 8 578 6 2 4 759 4 +7785132: 64 310 18 2 7 7 8 9 3 +5165452178: 239 350 658 34 633 +41027: 607 6 4 50 406 7 +109810788: 3 1 6 860 2 4 9 95 7 1 1 3 +3302: 87 63 8 60 27 226 7 5 +9182593: 1 5 274 62 98 2 9 2 5 73 +111608008784: 5 9 702 6 213 8 6 3 688 +82474315: 4 407 77 8 591 20 51 7 +3266534: 4 211 645 9 27 6 6 2 +235297: 806 22 7 5 5 8 7 26 71 +2902992: 12 32 5 8 67 1 36 38 8 +757673: 39 75 7 37 98 +5392: 852 6 13 26 241 +30316819: 606 5 1 15 799 21 +84160936096: 8 9 153 530 4 944 +18573: 2 2 9 7 72 29 397 3 +3400587: 339 9 6 9 88 +59117080933: 6 58 4 707 23 7 3 8 5 8 1 +709244949: 7 164 99 8 7 6 8 5 5 8 +256666: 631 3 4 3 380 5 30 278 +149736926: 594 4 77 5 3 21 6 96 2 +51400927: 8 69 782 45 853 +24013402569: 7 9 3 614 54 584 98 9 +41468325: 2 74 88 3 8 15 382 769 +80871091: 36 3 720 1 18 25 1 2 8 3 +437200704: 4 10 7 860 4 131 5 49 +52531364: 52 53 136 5 2 1 +1159045536329: 60 1 95 2 276 79 2 5 29 +30401139: 3 36 415 44 92 1 5 654 +855593039661: 7 8 4 7 1 3 6 328 2 6 2 66 +19362670: 1 314 442 87 98 3 124 +9366020992: 124 88 15 31 5 8 541 2 +79281216: 411 66 28 742 8 +2185054238: 79 63 8 343 2 61 7 40 +53587566: 6 918 47 69 78 3 +356106996: 4 5 8 7 96 92 9 175 7 7 4 +5372: 71 8 68 +42886097: 561 8 78 6 67 140 737 +2103466457: 4 72 14 60 9 73 +724634064: 8 2 2 599 2 8 6 4 26 2 72 +8940017483: 73 575 5 39 9 135 98 +734376: 2 4 62 455 888 +54967: 24 21 7 8 214 86 787 +25455: 2 3 8 467 8 925 3 3 3 2 3 +1706: 792 13 901 +16791586: 6 3 582 4 4 27 26 9 75 +1710311: 85 9 85 4 13 92 8 98 2 +178: 90 81 7 +2750345348: 5 7 298 853 8 4 4 3 2 3 2 +14913758: 9 271 33 16 264 9 58 1 +26509773: 4 6 104 10 192 13 771 +317152: 4 8 13 8 748 +54215093: 541 1 150 92 1 +14652360: 24 4 2 6 1 297 61 2 +147456741: 46 37 318 72 68 +135995340: 755 18 9 530 2 38 +5483610: 41 568 288 2 9 +265251335: 7 7 9 9 7 3 34 64 2 4 3 5 +444155: 38 74 566 78 75 +126994861: 23 4 157 3 17 4 861 +5528579: 6 5 3 8 8 1 3 7 7 7 34 624 +2198016422: 646 2 1 8 424 424 +16522: 5 7 9 9 51 +159183412: 320 141 392 9 52 +650538326: 6 46 7 1 26 8 4 3 824 8 6 +77169: 237 65 8 7 5 69 +49257063: 584 1 842 56 7 +51989200: 553 94 6 9 56 4 10 4 56 +636276292: 357 69 1 7 9 9 41 +5011587678720: 51 320 643 32 7 678 +62832226: 9 87 2 6 35 364 3 226 +324973544: 1 4 6 9 54 9 735 44 +43107424: 6 62 423 63 93 4 +1329: 3 7 11 1 921 +8127180: 4 5 2 35 1 5 9 43 55 5 3 +1646401: 6 276 1 7 2 1 7 6 8 800 1 +15569384: 37 40 4 763 1 597 787 +553222: 2 78 2 5 349 57 +667200: 91 610 24 66 12 +516301112: 573 630 6 365 9 1 721 +1375256534: 764 9 28 267 2 +24960320: 229 2 5 23 494 14 40 4 +54337879040: 7 2 37 3 3 37 878 98 5 7 +194164: 57 85 4 6 30 4 +214404579: 127 55 5 7 877 4 +91527: 3 6 73 5 2 7 +2551884: 287 616 314 9 6 +48941720325: 6 7 9 74 6 40 4 6 2 9 2 9 +9203: 16 575 5 +14256435294: 348 5 681 409 4 +3318458: 83 563 71 697 2 +36500: 52 7 32 6 62 +16233851004: 143 9 4 6 4 18 157 2 7 +130073: 73 9 22 8 9 +41452: 7 1 7 7 893 8 8 4 4 6 54 +29730573: 81 4 8 6 6 5 82 6 509 73 +451552: 27 147 928 2 2 292 8 +3607962: 5 67 97 3 6 37 1 784 8 3 +26553: 9 4 8 5 5 3 4 653 4 6 33 +99871: 3 26 67 3 871 +7974822: 79 7 431 6 506 +1065219: 42 1 44 12 48 771 +5804229: 602 964 37 58 1 +583501: 1 53 20 3 8 19 8 +8588035: 8 1 556 80 38 1 6 5 +2580648233: 9 7 2 8 1 6 727 8 6 9 9 69 +4013: 8 7 47 541 177 657 3 +4153099: 3 4 4 2 3 1 15 3 6 3 615 4 +232804: 539 972 51 533 5 3 7 +2309375607: 68 6 3 1 5 74 7 195 1 8 +769560: 3 90 7 40 458 8 1 6 2 8 4 +1016784: 78 7 6 6 307 +1178617147: 864 3 489 278 3 5 +38149143: 6 69 282 57 69 +665229: 98 7 5 67 9 580 +4130590464: 406 987 78 33 192 6 +447: 4 86 357 +3914899837: 4 2 156 4 4 66 3 1 1 3 1 6 +56259883189: 3 48 8 2 6 92 2 2 7 28 6 9 +2622: 12 7 4 2 74 +194536: 97 268 2 +31098614: 921 6 97 72 8 78 3 58 +948415: 4 4 8 8 96 8 527 67 2 4 5 +2672: 752 90 680 554 596 +476795: 45 8 6 6 9 6 4 6 5 9 4 412 +20759512: 2 6 8 8 4 938 8 869 840 +88817568: 97 6 7 6 2 668 9 6 1 8 12 +670085900344: 351 76 350 7 8 1 4 49 4 +755086: 4 3 7 840 59 730 9 2 4 +432946594: 432 946 1 49 396 46 +620888945040: 79 8 6 3 49 7 510 4 91 6 +9711: 856 9 839 168 135 +194558935285: 2 2 772 237 63 4 285 +758: 7 750 2 +6280922826: 4 32 9 3 3 7 6 5 7 81 9 +138895: 8 322 4 68 95 +1025917474: 6 30 395 917 47 4 +164811353: 4 3 67 35 66 1 356 +75636042382: 9 950 7 38 88 42 379 6 +3167998: 619 12 29 960 5 +1481204467: 5 2 5 8 4 175 2 4 38 8 8 1 +9923388: 2 515 47 23 8 51 12 +541863871: 541 86 38 7 2 +56829631: 3 5 7 676 9 144 632 1 1 +3465276611: 5 5 2 9 21 11 25 1 613 +10455518: 2 9 163 4 221 8 +45296160: 99 681 3 3 7 85 6 7 16 +142800: 8 6 7 34 2 971 1 8 5 50 +91872: 30 3 30 498 24 +55018317: 16 95 832 472 39 546 +4901324998: 919 5 77 83 53 8 \ No newline at end of file diff --git a/advent_of_code_2024/src/day7/mod.rs b/advent_of_code_2024/src/day7/mod.rs new file mode 100644 index 0000000..a757ea7 --- /dev/null +++ b/advent_of_code_2024/src/day7/mod.rs @@ -0,0 +1,3 @@ + +pub mod part1; +pub mod part2; \ No newline at end of file diff --git a/advent_of_code_2024/src/day7/part1.rs b/advent_of_code_2024/src/day7/part1.rs new file mode 100644 index 0000000..5fd3dba --- /dev/null +++ b/advent_of_code_2024/src/day7/part1.rs @@ -0,0 +1,4 @@ + +pub fn solve(input: &str) { + +} diff --git a/advent_of_code_2024/src/day7/part2.rs b/advent_of_code_2024/src/day7/part2.rs new file mode 100644 index 0000000..6197ad3 --- /dev/null +++ b/advent_of_code_2024/src/day7/part2.rs @@ -0,0 +1,4 @@ + +pub fn solve(input: &str) { + +} \ No newline at end of file diff --git a/advent_of_code_2024/src/day8/input.txt b/advent_of_code_2024/src/day8/input.txt new file mode 100644 index 0000000..32509b9 --- /dev/null +++ b/advent_of_code_2024/src/day8/input.txt @@ -0,0 +1,50 @@ +...............................s.................. +..................s..............q.............p.. +.....a............................................ +........c......Y.......Q.......................... +............................................4..... +........Y.........y............m..........4....... +......................Y...s..........S............ +.........................................S........ +...............N.............y.................... +...........a.......y..................1........... +................................................S. +...c........k.............q....t............S..... +.............................qM................... +........a......................................... +.................................................. +.................................................. +..c..........k...Q..q....P........................ +5.................Q...................8........... +......yc.......................................... +........................E............4............ +.........6........................u..p.....4...... +.........5.............P..n......1.........N...... +6..............................1.........J.t...... +..6..................................3.u..t.....p. +....5...k..........................u.............. +.......................E..................u....x.. +..................E.................x............. +...k..................P.............3............. +...........0.....9.5...........E.........31e....N. +......0.................................N......... +.................CU.....................t....x.... +......7....................e...................... +....0..........K......C........................... +.....6....j......M............................J... +......K.................................p......... +.....9........................U................... +............................3....n................ +.............K.........2.....C..................x. +....................P........UJ................... +.....0......X...C.........T..............U........ +.......M.....8j....7.............2........Q....... +9...............K................................. +....e.....8.........................2.A.m......... +..e......8.........s...n.......................... +.....................................T..nm........ +...................X............2.........m......A +......................X..j....................T... +.........7..M......j.............T................ +....9...7....................................A.... +..........................................A....... \ No newline at end of file diff --git a/advent_of_code_2024/src/day8/mod.rs b/advent_of_code_2024/src/day8/mod.rs new file mode 100644 index 0000000..a757ea7 --- /dev/null +++ b/advent_of_code_2024/src/day8/mod.rs @@ -0,0 +1,3 @@ + +pub mod part1; +pub mod part2; \ No newline at end of file diff --git a/advent_of_code_2024/src/day8/part1.rs b/advent_of_code_2024/src/day8/part1.rs new file mode 100644 index 0000000..8876943 --- /dev/null +++ b/advent_of_code_2024/src/day8/part1.rs @@ -0,0 +1,3 @@ +pub fn solve(input: &str) { + +} \ No newline at end of file diff --git a/advent_of_code_2024/src/day8/part2.rs b/advent_of_code_2024/src/day8/part2.rs new file mode 100644 index 0000000..6197ad3 --- /dev/null +++ b/advent_of_code_2024/src/day8/part2.rs @@ -0,0 +1,4 @@ + +pub fn solve(input: &str) { + +} \ No newline at end of file diff --git a/advent_of_code_2024/src/day9/input.txt b/advent_of_code_2024/src/day9/input.txt new file mode 100644 index 0000000..cf6fc72 --- /dev/null +++ b/advent_of_code_2024/src/day9/input.txt @@ -0,0 +1 @@ +1420246358115615159448658011444034495988947721324334285442101229872348312916304522703197195345597061772498605363984239553957302482663677272169494831829416248712671165699481784932213134289985741163494280789480479566522614248850258942381644783457519121322691625912162966151573446347716888172178835864207415862988675063532764201551877739539780656275351285822099801016985868354345143852172578669575251095812923575441842416751934692375928613673089902851511854338578603039415599771176117175225571201228261021752018208031608164823996213963751160129384296870382454451252975639885818448121584462462423691177228380776690488310495836869661942368339135556430555519746538388990398225583467258510344391474773468611572681443149442135549575213556246042284042718563921893348430454242939927932771507883136474815797505777306180654149942843738320431255218813199662731416966422433693905463654151183292889587802152844435264889768933495873809367868768364350748862158480666660439389802019531176214064326822731886882340748097731171958624497428803293956951988943755317512235729227683040988980796972587276164636243939913281668472626017911675661796847234657111626675637011356917382164631462841924506584655242774444825331117416699059989984271782723797405879607052478958401256663368423341925734509962558156409927509152243841364932184341567110578193311666357321583116298085795045224983174545521666718615821114618990275712427511143939243740737832839392854511609161537215747275113555443411529476289661744326821035264492127551951114517383908866582171567310446743764856482080844561498270495184494590404132431630913354845048549025914174812788965949279926438880869364255976332982739734468485832732685645602768955676445825678398575257105422519550191782348242617978302732909774763751143314899837865630733451927556917617754768126230768453658921645313899437435537592394103876919180255131824117889510308861935148617546785982652435763342524427551872589658297392116253919820634919263740521953136653228245492133308523954433154011885995539589114794194084504792499286541442397317118367608895697628647452677975783881808651853437533684834336694641407967312888598326303555872185785368737959969585361263251390183578212649239446154731565868903919645646492371242936497077419110765896276830537444368793119074596190624057924796698495999050478258303876328219794587103036697448576254969116175019313867198357236558746867789534391423878176352160191498532672812648236463811915342988345083659925471936517128453286685061181612416367469481807921688681857234535981552321613739501127923618472172618087955132369554754074932725974332514617723947402620338322363565947361447544131336855954579648511776573729811331594890432475632346995134986318579626758812843017298662189360368350486313755749822583127122652695463699171544713532639563393481591524624357385963803126177784432249778943549048821054307180798931871582467857445310285997654575334951348323531124935046362043442083702279911822843573769013859176608579706932994048133621167172595781616181679456871992969876374469521461269235906997502859843434996061928192352975157134996794699385837186712676321512714290169542989134971770354543567751279692255370599797776673475330942148988158841096424041653170329959576254158525543165529828983949658137281696206455435780297120539841202565907467892113712491538288304431542551928893971063997395127243435352541828223395641694417577214440396750311610701196896484658138329984467559899033988265516568477978429556275586689057148864108951192660958337831355834644614077813978724378596857336136958374175327875378946572777334453552558741315234226224775228208274679888421160341478801315185214887463654542581221845133809889801478493181345830385082584793943976943780277668716663684794389862832325943116785725936223833215315810746118137498625420463672186650508638492136815147772033106760934472228557794949987428155526192819236061693972505454629125365556235954195272207918619269803955771513604155899231436452139366262496542611399439305398803271706090478175737334417937922783226932549577422964796540941829553615159550605129294744393765978693552310715946819984593765361970802451149161535562786832882372481558758154174551709472404897556154886199527776127921174262403629506998166457985336604095636551639016935052437858862383504316322410775528616557928777102191936194837349606854789552439241178744607361833631776714269765621252659479685740292245782956706666766524561171746179624251711732966421435541696670625621339885873264598736475679727964933860189239167685225049219787652461556810682066437116395045404354301017219667967956113683731493998353363697778848686353768290967819681891784857966078428522475614175266799281595010497669522337563952687982142725801585625436938710697851496948443838865444268183736243553210741867446338624746471690891736747075849843925760176955566919826548966854656151649112309893647127392546618090246477991626587287269683606637711267387258561482712981263735598358244470224719123756309996961620263616459235629760153083474428584920308349182628635267812322117013571019599135949264108295134998635783184390242759624957262539717936755221825091317776216382942528314321296854135020351588544599714348182778341613298878403726554664733198668560603477729755642051261592584095493179869877411792946391855333781777607827716499345441421598753822862136226595902372154830777228111045756448854496757629391949494472689310341080978645507962421582761070727042388258958463876636338723231083205816158835731015859341528553452449538297728058105979613997406715282199657960622899243898237555255392175676211317371049157851923659782486749292795226425426674710279948933978306282994742397213902643143497492652697921106075131089837025785836826079223120728962633088105939763627341087417546581876446648237565396049872385567854477314952130481717459279308763805121443487117688108725545250506181314754393587564629697623538478318439709781682111145830595184539195113175246524517717743584495949214253843825688993775081355036314390143685154439432689925952876760118361959592204547174191662954328988976379326978856733829265573340251964965024611391942832718828535961665657124755769986884022722576908646549357251710492186775830848434123730837655452918929425681815716512812540823127443789402436741972185620125715749749297683419779675142881053327067539217767512251469892850696121716588293897112276405090412483245859427411829964522723787550208272787010592591979096598676672676512726108248507958133517617798866698362932328789556416601795355343648337725554686455674863208696112499843583881637498282329358665227771578359599585921707169544991451280641431548039203339879339742152733130603170762578877676524029124668822183335341457876365090974662893519266429465265698761722333934737255345583340576469121019663064825168726217933753592818198792746353544544714651857963871888111117415813254420994582869032512720904643706517963120546268394762337428127842243777303047565513609483938335174077712198978463725448927666207935402366964065965311707026168567964329667035643123442256627527386313258053104479951236413889746694863214741270256016769719831197334526846777317383576045568159501813209655561724207486527532258773919828317668376799381526428339987856289142683639194986186397684287441311797372376634285071795670586493788268275176892738566523161478164180643980226463319541992963379794165274917695868315612628775158687140637145903871483973169840532893833765325449816922828089105564835452163477564956851824411829534013504350875540362381295922411725336065678784979346506060196735363738295639921011796118311286874359464314581034423329608337116621793017546671745534217586669011555898983682957659557752914468662973735017206425102964479587671710281612817822602313915615271130615984104549887890553968483558425233476166727049949034347389784471435150594739432196866710516389728060186637183371519834203027701839667592789785113743657889862667825428994171108558643443281747866027918989619968936957597549227960998312138227273854643423972877266963288659676240275292178881178031768486541841137672507146806093535674108264587494412535526975798633414650983960976222235430304555396599756673494734174973391151188453507792114318764028648695445523298524985565778763623691441046781584634312302944781256459871619829148844657555736884461436806825395185788657612511918892101273146463197539125542418115626133561718777142328663902441632785314858353363336824558334231163965197651443536512835058212892452990447745567611545577881596414443125052403564444785397264512446912070592741628583337575892749587420287359757696183428459518387897771863565941185792285542248526328990862941653354795528359835758316564452361655644142318889232588815594861367795044188717253363192874516351816693682230985991801589613286265362445723751360411543761890746057666919585274225663556425978510531871697578409712593886814359248537843635882172963014178727349558721430969993536442312247162280831666815559908242483416101341755491423842193467442623171431706759591886666129722775105137617545502015109987533334573883828630265063658444465288991986601053105473227284608891915240949782486842695176889131805539816148522376852454341422529656245065441937162783785150609677301483693668583662985273321242995157798468264942972282998787784952748376431239844663696993733186288746524194808251528423925323857042282181683013891798186254636364391664705742612479304793229953263795647897379563117891103188565558183892571312279056133824253416399371639452601790637918919536955429319053364141692677482013552445986511416945636317569359919313985647398736139682638331335886479129458328279222602767981774162182638866478321548138481954175256321363116320133922282066555542539387958718369610435915399914399648395415851226439818469488816868942690881769825218482558986936579340392522198915799569573869189312889294809671806418755284768370934642702644794657225575488123877082206490724494989948334975382315793337879230706719347879714735756325942585894331933380728864325227567688643625106932131811844987816262143396759885978691152710602927421567458092683327732572128025191315267434518659647112609750227895419229665824143741467158781393187220608557727986382631132870409536397172591315799263938172972183607078329638561415977117581110235937216460453422724246686718554952516384363011373549106660929599235945612343794470824130381095401756916170322235147250391370865230356995478149204624673041396120127173999699235923642466109751393181569629435249846942418225701636596734191029479246234553263549937967553189397656783925631233104660647537745371224646586246266842497923517528688697384970836838463053903845338067346363381461643065997116279317872137708496393449736097717247959148761064635782848058624089232040115023545531885132763117909038941419864788137958232040637257837070619145909513863957587675959534296661314340178931787299884633678041548575729726212423748076256763257761403825395612148522139336149566662015552444642820278789197876616025835141737897747063749787906040739789658524767463524125588772211492159976829383728566541474583983874383306039782976756659333346173734845724694835407665492443457561373340354537769175609729667373299665541341444241954972925499618658684640623423635716293531362373962969819715851540377829394987372036802230192932255329363249205554238365762831655450455178322082382665287956398139246784431077402161661866205761372241265813852935475984477128906419544799732918891436308557504737197849766140612036418990125132251327307974305537905177527442707664894278955919173922114499667950633361361837987596568572326984131623236356371826218298492278152557485232726264217518219617755446566153129552162985819529594489557831641937577156377933222055848441726348893010383177335853955013221221796252297795361212682559956330477961289090715116757634422370932653864016646460997595632421187489973666391639287422686484274337637275894850547945882267552194561764526643617386994165826168122747134883594987714763735351136229739279859419903019364121489119461495601057612275452438604773356472194115869195637121424867147785182133417460755060563825856344445453908735568664388073224755869870387613599468962319585255975230436344132736747723819738407483612692668796283542979586261331194622265493851459921123376884614186592576365638253124925141802514209493504789855338346851507136717336571350456943924929477359992151477661466361401174893748538318215756684783868043466237866687345616836542874454948913839196445322211290487613766241693610705337798593471326623724524361675277459910857986716628511859891162858689954564951531182050715737108761756039704835787673557628536845592459392398159896773144704285179875569458238133968246824416551122778390752057452289497613275465147066236325814551834152203339351677232289342344431271251244757332373629384943267258237219396373903884784074227368895122205987807344943172155753609394293345138216568320755361722516803277856644202572325890531383969633918679881495802520739297716127304854508516555590591175443438921588129036131215373941398119735326703440959664124549882494346311297458433799869220363442274529467334934779164072794826972081282172934937941547508310681455179140924761924297779313242566686213189714599224701146392236859699518832913028414027786196558028264098338398894248269199945863564586841979364243197724502169172379778934837558569958624070904180947938666481938594865279296116931612575736875422629558256448366222113972252740918693657897169591365335237767382385361869805627671719899878631418754721605130186762847189128131603083874372611182578326724033942428367697218199937180774877103590488315946499294762243079472858624592432349972170614481853030374432838333457464584571833416246842551345259456308810638037157285868399774398566853492777831310293121363943478954793125529864746038193997901580737456789220351953905024847765259183215773703877963540239556975650325591881170582367824595763515647292898090376691613581627596658089383747291380484996751869949841443227963322435334375831233561674573323291259088844627719336776833302015319080229527114476695448565348328552316454174662355257812595479896279431161846879751485896778497388515295241138369952529662756604399663919657677593346251177308780116590847836718024724491331155321419373278812324486522446255956384211058588066352446929637778815558455373618316523878725506048136178102889626456566696944082308025743115314125398937463141423646306336935424211568384744303532573711883013923174152923731867951199514096375826481378929866358384884853864375825368411887412588923920394644294070592260458974212937633244369176635823632758666858288319594114229015838076482760948642425221356669249067343716128872887470663867854764865229664873192662927529132867246641304435472171434058747987366327829713717378977298401694639342693190214515742622271165949121516319264277113535234412328834732938406648121963825753275480442344927051527654211749242327352492686963965689676262329697139968287784705130436518131797648533936387117871952725369657266084536053718856922214157239355994297076582869713392707362182122445446795170424292911060132783569665634654132742669383634910253835123043579623168618417964233639435941478757226258239596899396501371506697901844812215925061514236128547536222412170825273438053103494437627895033726628861128272749255012839030775760214033934080975426559590738943594227823468145646359775763459772151637842758587458671417627183222612777526724814252966611562055287357925442316972176376582266422529746561629641673332981894836628878145343673225186266343311488418447834178123892453057724052141417839078362280806027541726105084575430203199929930345811453991199137793445671224228144563861357281251177223823264877703636381388177097721935408179183069911388153559457333719950713642262678682471569841235089992626573275186772153339742636596954441183815440992252682019769695723956151737575963287483642772537750674916896651586727738015744134614282363538598789491979939234548878776568358566544046515312151096987138378283845390859017785744648068828289269417195574776879363319633465914437811963907895314472348161401558425785483364614629191155313529908762591197745719769348697088587813237118656432546565767379681997355720812879675597381390181562755735884131568012672184889837459576205247712381671491716164189661592868536220878550212541457554721010717592236596445866131763668227786016431039372193373974441195875331357937887315832962793093555198117576507754132782527087575319394687317033724157932516605158246495308711329547423681497740949452526770163368945323893955487259934043776084245287397976719551321716318715713145305533742961953850531023369689131317364839202623721764622341327659502758974089963190554942649211116524426328313964652792324816299751945165436269996766616834271510212513458083587957946636874789917353708948553977171366353380804464651919637548926834101661878514119456886621341871931473599133805128806045766950145155505920365484174155618267936229552221256391182689286761726486216835441132808414597163432735781338949554469678472977715031298099749134997289621976208771453220267372589182283239451688998313267144569350902240294432988753894470295264687520424681938373562583255087728048259486239828201011689362408993151923485059166515678355491249203839723542685231672355317887701364357364291057925358382213233115998588502139439254819724365210803961716361637539643043423872465444912088997045124130908128257743473852809588466519438540878296825324489791766863851416985322919434475852941289437076454457289368459781608231466229811171669040558273597389503773367069235930616934594894961644595413259263846682536050914225489073921278301285287954384979131443443160904191271570259579463165846837435638169486932322767274184410973194617423866270644184119489885043109983413936815116951075127142958587241370845153495134672682965494716774598495653618359060457055474614846939855341795562979229875696693615849190718214803264443365555989802281265585716036477169484550368999708869656620915978174811749686273833742215429246928335134973616515181471387410209869106639888222281911802797104175102675132653156178464879134467294066757528578262652940622847851259646956963630968171433379914681375198178433612219973564165898511978383347875765575457987625524955411012808126233358866488574062442868717020343860199479835222176175761443691778659298981522446553836113225794899491951510594320683094766166919227419357671472817844706336785121777294724923785873928745584314102095172047187418403191691385578313608048919245673414549041176038133693431134526410248938729310451149102827617021943978507196705728102023546813604387158811377033877564395769648034809735725295504136591337159267437978807282239283794037144494805951788851397035267913754771464488191599396486218395445482719113287323615771898397109494321892386889637169802258299549859468199348185562192591632631754744509994475040452073993287177379141176649319639551445596241579766687376132489914242595548143696839387884965284259285417764994419843138837410237666442751643280853825773164907823603879294177304828483889294518353849741466622511699639282528753081971025679059684139621580777095535071665360195392182338452355456325162494112163704582961090789956618294461621183165312012479971818266781133902743264075584598852476181696428115822270792156614162327397253668556680558847128638979119257039153621696172449580508466643582525932856254648092971728523580594883843762631791394775222511139561981663278692757947397710692890676374549346494947554118916642868131604328267111246319248681869188106257323960383726753049618841475259118344315171229062565073611988469446636358642631244852895995712674263476244959332342419456972371545783542585463680672898319262681988976290329434971665767764812813239143469134712365698849924813752866945770404360409590222442934070511212675868453399902633234396957788254664471017743955489859253164198729519529126271123062375274655655658823412220584311234842422182425177618798753752356293808648295847997585108235874317255216557592221764772915913935596776543461204274235751557587966151396590256874632199884125895050694345104663433065639540683465626089252043238261305597498210971620486645442193609163392269961811809267582273395278917044741924125254872395423736798078861933707673975793627837826662928895577044965024401275454875647251476140548455105693954641417 \ No newline at end of file diff --git a/advent_of_code_2024/src/day9/mod.rs b/advent_of_code_2024/src/day9/mod.rs new file mode 100644 index 0000000..a757ea7 --- /dev/null +++ b/advent_of_code_2024/src/day9/mod.rs @@ -0,0 +1,3 @@ + +pub mod part1; +pub mod part2; \ No newline at end of file diff --git a/advent_of_code_2024/src/day9/part1.rs b/advent_of_code_2024/src/day9/part1.rs new file mode 100644 index 0000000..8876943 --- /dev/null +++ b/advent_of_code_2024/src/day9/part1.rs @@ -0,0 +1,3 @@ +pub fn solve(input: &str) { + +} \ No newline at end of file diff --git a/advent_of_code_2024/src/day9/part2.rs b/advent_of_code_2024/src/day9/part2.rs new file mode 100644 index 0000000..6197ad3 --- /dev/null +++ b/advent_of_code_2024/src/day9/part2.rs @@ -0,0 +1,4 @@ + +pub fn solve(input: &str) { + +} \ No newline at end of file diff --git a/advent_of_code_2024/src/main.rs b/advent_of_code_2024/src/main.rs index d15148c..5e9e243 100644 --- a/advent_of_code_2024/src/main.rs +++ b/advent_of_code_2024/src/main.rs @@ -1,17 +1,21 @@ +use paste::paste; + mod day1; mod day2; +mod day3; +mod day4; +mod day5; +mod day6; +mod day7; +mod day8; +mod day9; mod utility; pub fn main() { - let mut input = String::new(); - - println!("-- Day 1 --"); - input = utility::get_input_string(1); - day1::part1::solve(&input); - day1::part2::solve(&input); - - println!("-- Day 2 --"); - input = utility::get_input_string(2); - day2::part1::solve(&input); - day2::part2::solve(&input); -} \ No newline at end of file + solve_day!(1); + solve_day!(2); + solve_day!(3); + solve_day!(4); + solve_day!(5); + solve_day!(6); +} diff --git a/advent_of_code_2024/src/utility/inputstring.rs b/advent_of_code_2024/src/utility/inputstring.rs index 572b054..e9653ef 100644 --- a/advent_of_code_2024/src/utility/inputstring.rs +++ b/advent_of_code_2024/src/utility/inputstring.rs @@ -2,4 +2,9 @@ use std::fs::read_to_string; pub fn get_input_string(day: u8) -> String { read_to_string(format!("src/day{}/input.txt", day)).expect("Failed to read input file.") +} + +pub fn get_test_string(day: u8, file: Option<&str>) -> String { + let filename = file.unwrap_or("test.txt"); + read_to_string(format!("src/day{}/{}", day, filename)).expect("Failed to read input file.") } \ No newline at end of file diff --git a/advent_of_code_2024/src/utility/mod.rs b/advent_of_code_2024/src/utility/mod.rs index 2ada802..cd9db7a 100644 --- a/advent_of_code_2024/src/utility/mod.rs +++ b/advent_of_code_2024/src/utility/mod.rs @@ -1,4 +1,6 @@ - +#![allow(unused)] mod inputstring; -pub use inputstring::get_input_string; \ No newline at end of file +pub use inputstring::{get_input_string, get_test_string}; + +mod solveday; \ No newline at end of file diff --git a/advent_of_code_2024/src/utility/solveday.rs b/advent_of_code_2024/src/utility/solveday.rs new file mode 100644 index 0000000..c711b6a --- /dev/null +++ b/advent_of_code_2024/src/utility/solveday.rs @@ -0,0 +1,26 @@ + +#[macro_export] +macro_rules! solve_day { + ( $day:literal ) => {{ + println!("-- Day {} --", $day); + let input = utility::get_input_string($day); + paste!{ [] ::part1::solve(&input) }; + paste!{ [] ::part2::solve(&input) }; + }} +} + +#[macro_export] +macro_rules! test_day { + ( $day:literal ) => {{ + println!("-- Day {} --", $day); + let input = utility::get_test_string($day, None); + paste!{ [] ::part1::solve(&input) }; + paste!{ [] ::part2::solve(&input) }; + }}; + ( $day:literal, $filename:literal ) => {{ + println!("-- Day {} --", $day); + let input = utility::get_test_string($day, Some($filename)); + paste!{ [] ::part1::solve(&input) }; + paste!{ [] ::part2::solve(&input) }; + }} +} \ No newline at end of file