Day t/m 6p1 done

This commit is contained in:
Jos van Goor 2024-12-14 14:51:40 +01:00
parent 7ed2746251
commit aecb2f2278
42 changed files with 3188 additions and 34 deletions

View file

@ -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"

View file

@ -4,3 +4,4 @@ version = "0.1.0"
edition = "2021"
[dependencies]
paste = "1.0.15"

View file

@ -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::<i32>().unwrap())

View file

@ -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::<i32>().unwrap())

View file

@ -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<i32>) -> 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::<i32>().unwrap()).collect::<Vec<_>>())
.collect::<Vec<_>>();

View file

@ -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<i32>) -> 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<i32>) -> 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::<Vec<_>>();
let copy = report.iter().enumerate().filter(|&(idx, _)| (idx != skipped)).map(|(_, v)| *v).collect::<Vec<_>>();
if ReportType::from_report(&copy).is_safe() {
return true;
}
@ -58,7 +55,7 @@ pub fn problem_dampener(report: &Vec<i32>) -> 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::<i32>().unwrap()).collect::<Vec<_>>())
.collect::<Vec<_>>();

View file

@ -0,0 +1,6 @@
},;who()^>',mul(594,203)~ ~*$'*select()mul(693,99)*>&()+{%{mul(225,584)when()why()#]}&mul(287,918)<from(332,448)<^:mul(296,804)'@why()'when(),do()(+%:(who(309,257)mul(402,955):-')]</how()'{mul(462,541)who()^'{]-mul(677,297):*)-)]mul(997,185)mul(159,913);where()'+>}^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(890,548)+'mul(887,354)&$why()select()where()$[]'do()[mul(526,27)/:^~how()mul(184,719)~?%,mul(706,502)where()from(668,399)^$mul(952,705) (,}when()<mul(525,685)}/+-what()&+^mul(461,816)} mul(15,833)!){(why():}mul(452,37){,~mul(661,869)$what()]$ [do()[@[> >]mul(862,653),>/@)[:what()?mul(579,120)#<when()mul(611,837) from()!/mul(697,303)>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)<mul(871,637),[*#-mul(876,861): @^@mul(687,724)[^-?don't()+>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)?,,]:<why()[#mul(238,568)+#select()when()(what()[mul(288,92)+&mul(935,678)(-+mul(646,366)^when()from()#&where()>;]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();<what()/>[*)how()?mul(670,136) select()select(){>>]+mul(838,443)why()< [how()where()why()mul(122,722)where()!#?mul(500,988)~:>#mul(231,76);when()@?<what()+mul(375,131)%mul(142,344)+?;/do()!~who(){mul(798,493)^]]{mul(760,519)#;]who() {mul(731,849)$(::-don't();{[+%mul(92,201)when(463,392)mul(555,452)select()how()where(236,738)?-^-'where()mul(830,999)mul(275,204):&:')$mul(649,43)when()'];select()&don't()}!mul(61,760)+[&where()-! !)'mul(986,940) where()why()::^;+)mul(170,843)<[mul(80,442):){mul(844,466)why(599,707)*^@-@where()*don't();how();##how()->*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),( @!-{<mul(862,207)&}%from()mul(959,624)what()??select()mul(727,721)<mul(597,447)mul(380,969);mul(718,644)>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)<do()mul(263,610)%!$when()mul(795,738)when()&+select()[mul(193,857)what()^ ~^what()where()from(440,495)mul(180,738)don't()why(){mul(72,22);[^!&']}mul(796,290)']mul(117,806)mul(584~who()/]{%?$$['mul(902,609)@-#^'^where()-mul(482,194)mul(476what()!from()?+what(){$ ;<mul(685,45)what()?,who()'!$,why()mul(241,772);-select(167,72)select()when()?mul(447,333)when()*({:$>{ 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)':#('<select()-mul(628,432)what()+:don't()mul(621,550)&,mul(936,206)!when(823,958)mul(421,850)what()how() do()$]mul(479,729){~+'!when(){who()don't()[&}+?%~</mul(135,326)%~)({mul(664,774),<^;+;}select()mul(94,609)&select()when()mul(953,750)</!+^*(mul(192,73) when();don't()*}//why()>when()who()~mul~@:;mul(55,655)how()&)+'%<>mul(862,203)what()<who(),why()?/?~mul(948,366)%what())how()? mul(248,555)>>;)&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(837,19)*why(689,440),*/?)mul(202,275)do():,<$from()(from()(mul(461,612)where()what()[)]%#mul(172,865)@select()*[<{#@mul(109,57))mul(868,620)$)+!mul(403,491):?(:&)from()(mul(678,566)'mul(591,957)>^mul(853,288)()'*++%<>mul(914,566)$>when()mul(15,420)&(mul(223,567why()?where()mul(448,495)mul(139,496)]/*,<mul(10,674)what())!,,do()]>!};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))</~[from()select()/{mul(562,631)[mul(15,267)mul(501,382)(^(-!mul(669,954)--why()-mul(53,4)({when(){,/?don't())from():{~/,{/;mul(960,812)select()don't()?()]-mulwhy()/]:?mul(343,50)[mul(458,913)mul(761,672)]%when()don't()%>$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)[<from(930,22)where()?select()]where()when(34,121)/mul(795,773when()>>][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(534,159)$/when())^;mul(211,383)>[:[(?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()<where()]select();mul^why(922,140)]+{?!<when()<^mul(221,231)who()>~mul(997,348)}(select()$-;what()^mul(208,506)who()*;<when(508,605)who()^select()when()-mul]'mul(702,347)from()don't()where()+(who()+/~mul(938,262)>)->: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)<where())])&~<$mul(433,395)/''-/*how()'?,mul(279select(410,45)+what(328,292)from()&do()mul(330,600)#{who()(--mul(821,674)[where();(don't()how()@/mul(138,856)!]:(~mul(178,997)/mul(739,585)?mul(344,362)]from()mul(446,222)^:from()~where()?<['?mul(930,705)from()&mul(274,695)~,<where()%};*mul(956,469)[-?mul(75,189)*-:mul(966,410))[where()]!mul(774,528)when(424,975)mul(138,384)>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()*@[}<how()mul(93,798)@mul(73,369)#%mul(213,737))'where():*:mulfrom()#from()&~[why()$;^mul(83,27)where()>&@what()<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);/<how()mul(490,823),(@!$}mul(67,164);-;who()mul(367,10),&from()$*mul(720,826)@{mul(788,673)]'}$when()[)-mul;<don't()@how()>&{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)<don't()-<'?^'&~{where(710,453)mul(82,79)~what()when()/why(581,164)+don't()who()[where()/who(){>~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()<how()mul(818,694)>[,<mul(577,893)when()select()how())*do()[from() ,what()~mul(97,535);~mul(526,845)/[~}mul(827,275)how()mul(852,966)})]when()-'$mul(894,978)'['>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(65,148)~%'/mul(591,992)how()mul(897,219):+<$:where()select()>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)<mul(852,830)*what()[why(551,344)!'}<mul(133,373)([-*/^!mul(250,837)]-who(519,492)mul(142,16)who())&>/!-;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):]^{<mul(680,7)mulwhere()]mul(608,134)*''^#^mul(309,898)mul(711,574)<+*]}~do()'&-> 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)#^><what();~-do()select()~~from()>}mul(372,283)>%why()/<mul(423,194)%mul;[*where()+-)why()mul(573,554)$]/mul(936,543)what()why()-mul(999,520)'@;where()mul(71,216)*mul(344,530:who()*(-+*,mul(74,631)${mul(182,864):^when()~[+mul(618,708)]~mul(634,370))#:#-'/>mul&]]don't()<!mul(609,585)(?(}{<who()/(*mul(301,299):*(,@$:mul(651,306),$why():where()(#];(mul(164,471)* where()who(845,413)select()%,[+>mul(400,866)#]$/(mul(599,385)from()mul(64,766)!:++}!*]mul(256,981)^/:mul(255,258)why()what(940,608);<what()mul(371,4)mul(432,574)select(){mul(921,277)@how()from()mul(913,482),?!@who(),who()&what(23,993)>mul(769,112)*](&'/?%?mul(616,557)/mul(297,516)'why()where()mul(541,625]*@*~<when()<mul(28,891){/when()@-from()@how()mul(38how()'*;mul(909,877)mul(233,412){why()where()% ?+]'where()mul(771,811)+where()(!},?mul(826,359):;mul(604,139))?(how()why()%/;@@mul(686,118)what()who();{}-mul(484,258)when(329,846)}~why() &mul(758,786)/]where()~don't()!why()?[why()mul(909,661)mul(401,973)mul(657,33)what()~$-who()>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()<what()/mul(685,901){;who()!'from()>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()>*!<why()mul(661,782)mul(153,516)~$^]select()+mul(108$from()how()what()^^what()]))^mul(416,177)%;<who()>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(237,518)-$]%>;)%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()~&>^[<mul(999what()!select()[$what()*mul(697,639)what()>'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()<mul(353,321)how():$(mul(243,816):@ >,'%?+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)]</!where()+;?mul(574,850){+}from()when()[#?%{mul(46,799)from()(who();from()->!mul(572,718)mul(342,541)@^<select(),mul(318,874?how()mul(243,7)}{mul(187,691@}-what()mul(85,522)~who()<*>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()<don't()when()-how();<(;mul(514,498)%^?,mul#-+]how()select()mul(533,235)#>{,{@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);}<select(){$*[who()/don't() %;mul(473,606)where()%mulwhy()&~&from():>how()@,mul(971,397),!<<<,mul(144,69))what()![what(727,164) (do(){>{#when()/<what()mul(285,888)'+mul(447,749)@[?~how()<#$where()how(895,368)don't()'[%-where()mul(344,170)&@mul(46,591)~ <mul(286,814)select()what()*{#;+*$mul(228,816)from()+',,!what()mul(92,171);'$[~) why()&mul(446,63)+,/+,@>how())mul(720,811)mul(956,682)who()/]$:'%mul(546,971)# why()%&select()[@mul(771,523)'&<when(583,355)mul(172,15)why()^&)what()when()?do()how()mul(600,918)mul(680,387)#mul(701,292)}mul(274,158)who()[+when()mul(731,356)}^,]%:mul(540,292)~ from()mul(142,102)from()/$why() +%mul(141,804)mul(170,292)'mul(907,634)[;;from()how()from()@&mul(46,510)%what(321,677)who()-#@mul(237,342)where()select()@@@#mul(301,339) ^from(718,589)}+/mul(467,190):-mul(392,342)select()^ '*%(mul(259,466)don't()who()?{select()+@what()!*mul(414,247)]>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()<from()mul(308,353)where()+mul(613,527)mul(519,836)'why()mul(943,763)~^when(){,{how()~*mul(15,244)mul(291,737)how()when()&<[)mul(109,238)@where(232,971)where()@why())?~select()mul(48,671)(>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()<?mul(920,871);+}select(260,714)%:/why()[ don't()->@''[when()mul(424,209)]>>:mul(225,552)when()-select()select()}@[ ]mul(249,678)@# {what()mul(494,553)<from()) who(724,789);/select(839,622)'mul(563,373)]mul(675,891)what()mul(73,441)+?$?!?how()';how()mul(182,313)(]what()

View file

@ -0,0 +1,3 @@
pub mod part1;
pub mod part2;

View file

@ -0,0 +1,114 @@
use core::str;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
enum Token {
Mul,
Number(i32),
ParenOpen,
Comma,
ParenClose,
Invalid,
}
struct MulNotFound;
type Result<T> = std::result::Result<T, MulNotFound>;
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::<i32>().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<Token> {
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);
}

View file

@ -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<T> = std::result::Result<T, MulNotFound>;
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::<i32>().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<Token> {
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);
}

View file

@ -0,0 +1 @@
xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))

View file

@ -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

View file

@ -0,0 +1,3 @@
pub mod part1;
pub mod part2;

View file

@ -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::<Vec<_>>();
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);
}

View file

@ -0,0 +1,27 @@
pub fn solve(input: &str) {
let grid = input.lines().map(|str| str.as_bytes()).collect::<Vec<_>>();
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);
}

View file

@ -0,0 +1,10 @@
MMMSXXMASM
MSAMXMSMSA
AMXSXMAAMM
MSAMASMSMX
XMASAMXAMM
XXAMMXXAMA
SMSMSASXSS
SAXAMASAAA
MAMMMXMMMM
MXMXAXMASX

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,3 @@
pub mod part1;
pub mod part2;

View file

@ -0,0 +1,45 @@
use std::collections::{HashMap, HashSet};
pub fn solve(input: &str) {
let lines = input.lines().collect::<Vec<_>>();
let mut ordering: HashMap<i32, HashSet<i32>> = 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::<i32>().unwrap()).or_default().insert(order.1.parse::<i32>().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::<i32>().unwrap()).collect::<Vec<_>>();
update.reverse();
updates.push(update);
}
let mut update_score = 0;
'upd: for update in updates {
let mut naughty_list: HashSet<i32> = 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);
}

View file

@ -0,0 +1,66 @@
use std::cmp::Ordering;
use std::collections::{HashMap, HashSet};
pub fn update_valid(ordering: &HashMap<i32, HashSet<i32>>, update: &[i32]) -> bool {
let mut naughty_list = HashSet::<i32>::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::<Vec<_>>();
let mut ordering: HashMap<i32, HashSet<i32>> = 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::<i32>().unwrap()).or_default().insert(order.1.parse::<i32>().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::<i32>().unwrap()).collect::<Vec<_>>();
update.reverse();
updates.push(update);
}
let mut invalid_updates: Vec<Vec<i32>> = 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);
}

View file

@ -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

View file

@ -0,0 +1,130 @@
.............#........................................................#...#...........................................#...........
.....#...............................#.........................................#...#...............#........##...............#.#..
..................................#..................#.......................................#...#................................
.........................................#................#....#..............................................#................#.#
........#.........................................................#...........#.......#..............................#............
........................#.............................#.......................#.......#.......................#........#.........#
................................#.......#............................................#...........................................#
...........#........#...#..#...........................#..................#.............#.......#..........................#......
............................................#........#.......#..#......#..............................#..#................##......
............#..#...#......#.........................................##.......#..........#.......#...................#.............
.....................................................................................#.....#......................................
.......................................................#................#.....................................#...................
...........#.....#.#....................................#.......#.#...........#................#.......#.................#........
............#.............#....................#....#............................#.........................................#......
.#..........#......#................#........................#............#..#..............#.....................................
..................#....#...........................................#.....#.....#.........................................#.#......
.............#..............#..#...........................#..#..........#...............................#........................
.................................................................................................#................................
.......................................................#..............#..............................................#..#.........
......#............................#.......................#................................................................#.....
..........#.........#..................#....#....#...#......#.........#.................................#........................#
..#...#............................#............#.......###.................................#.............................#...#...
.................#....#...................#........................................................................#..........#...
....#..........................#......................................................................#.....#......#..............
.#........................................................................#..........#............#..................#............
...................##.#.......................#....#.#........................................#.........##........................
#...........................................................#..........#........#.#..................................#............
.......#...#.........................................#.......#........#...............##..#.......................................
......................#....#...............................#......................................................#..#............
......#.....................................................#...............................#......................#..#...........
.........................#.#......................................................................................................
.......................................#...............#...................#................#..........#.#......................#.
.......#......#...#...........................#.........................#...............#..#...............#.............##.......
.....#..#..#..................#............#......................................................#...#.........................#.
#.#...............#...........#................#...................................................#..........#...................
..........................................................................#...............................................#.......
.........#.......#..........................#.##.............................#..##...#.......................................#....
....#...............#..........#........................................#.....#.........................................#.........
...........#................................................#....##...................................................#..#........
........................#........#...........#...#............................................#......................##...........
......#........................................#...#.............................................#................................
#.....#......#..................................#.............#..#...............................#................................
..................#......................#..........#...................#............................................#....#.......
.................#.............................................................................#.......#..........................
......#........................................................................................#...#....................#.........
....#......................#..................##..................#.......#.......................#...........#.........#..#......
............................................................#......##.............................#.#.....#............#..........
..............#.......................#...^.....................................#.....................................#...........
..............#...##......#..#.....#..........................................................................#.......#.........#.
.#................................................................#........##......#....#.......#.................................
....#.....................#........#...........#.............................................#........#................#......#..#
...................#.............#.........#.........................#...........#..................#...................#....#....
.#...............................................#.....#..#...#...................................................................
........................##............#.....................................#........#..................................#.........
..............#................................#.....................................#...................................#........
...........#..........#...........#........#...................#..#..........................#....................................
.#..............................................................#....#.......#.....................................#..............
.....................#........#......#................#.............#........................#.......................#........#...
.........................#..............#...#....#..................#.............................................................
..#............................##.........................................................#...........................#.#..#......
.....#............#...##........#..........#....#......#................................#.................#...............#....#..
.....#...............#.............................#............#......#....#........................................#............
...#..........#.........#.....................##.......#.....#...................#................................................
.................................#...........................................#.................#...........................#......
..........................................................#........................#.......#.................................#...#
..#......#......................................#...#..#....................#...........#....#.............................#......
..#........#.............#......................#...#.....#....#........................#..#......................................
.........#...........#.......................................................................#.........#....#...#.................
..................................#....#.............##....#.......#.........#.........................................#..........
....#.................................................#.......#...........#.......................................##.....#........
..............................#.........................................................#.....#........................#..........
...#........#...........#..#..................................................#..............#.............................#......
................................................#...............................................................#.....#..#.....#..
...............#.........................#..#...................#....................................#................#...........
............................#...........................................................................................#.........
.....#.........................#.......#..#..##.............................#................##.......##............#.............
.........#........................................................................................................................
.........................#............................#........................#.....#..........#.....................#...#..#....
.......#........#..............................#..........................#...#.................#............#....................
#...#..#...............................#..........................................#...#...#.........................#.............
...........................................................#..............#..........#..................#.........................
...........................................................#..............................................................#....#..
...........#.......................#................#......#.....................................#..................#.....#.......
.....#.................................#........................#.#...................#.....#............#........................
...........................#.#............#..............#..............#..#...#..........................#................#......
.........#...................#........................#......#..#..................................................#..............
.............................................#.................................................................#.......#.......#..
#.......................#...............#.......................#...........#................................#....................
......................................#............#....................................................##...................#....
#...............#...........................................#......#....................................#...............#.........
...#...............#.................................#..................................#..#............#.........................
......................#..#............#..#..............................................#......#....#...............#.............
..................#.....................#.....#...................#..#................#....#..........#......#..........#.........
.......................#.....#..............#..........................#............#...................#.#.......................
......#...........#..............#........#........................................#......................................#.......
............#................#..##....................................................................#........................#..
...........#....................................#.............................#.....#....#...#.#......................#...........
...................................................#...............................#....................#.........#...............
........#......#..#................#..................................................................#.................#.........
.............................#................................................#...........#.....#....#............................
........#.............#.........#............#....#.....................#........#...............#................................
..#................................#................................#..#......#.............................................#.....
.........#...........................................#..................................#....#..#.....................#...........
.....................................................#.........................................................#..................
.........#...#.#.....#.......##................................#...#..........................#........#..........................
......................##...............................#..........................................................................
.........#...#.....#........................................#................#........#............#........#.....................
...............#............#.................................................................#................................#..
......#..............#...................................................#............#.....................#.....................
.........#.........#..............................................................................................................
.#........#...............#..##......#..............................#...........#..#.........#...........................#........
...................#................................................................................#...............#.............
..............................................................................#........................#................#.........
...........#.....#..#.#....................................................#......#......#..#................##...................
....#......#...................................................................#..............#.....#.........#..................#
..#...........#...#...........#.......##..........##......................#......................................................#
..................#................................................#.#............................................................
#................................................................#............#...##..........................................#...
......#............................................#.......#.#.................................................#..................
..............................#..............#.#....#............#..........................#.....................................
............................#..................................#.................#..#...........................................#.
.........................................#................#..................#...#............................#..#......#........#
....................#..............................................................#..............................#..........##...
...#......................................#...........#..#............................................#.....#....#................
................#..#....#.........................................................................................................
...................................#...................#...............................#................................#.......#.
..........#.................#.............#..................#...............................................................#....
.....#...........#........#................#.........................................#..........................#......##.........
..........................#................#..............................................................#.......................
........#.................................................................#......................#.#..........................#...

View file

@ -0,0 +1,3 @@
pub mod part1;
pub mod part2;

View file

@ -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::<Vec<_>>();
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());
}

View file

@ -0,0 +1,4 @@
pub fn solve(input: &str) {
}

View file

@ -0,0 +1,10 @@
....#.....
.........#
..........
..#.......
.......#..
..........
.#..^.....
........#.
#.........
......#...

View file

@ -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

View file

@ -0,0 +1,3 @@
pub mod part1;
pub mod part2;

View file

@ -0,0 +1,4 @@
pub fn solve(input: &str) {
}

View file

@ -0,0 +1,4 @@
pub fn solve(input: &str) {
}

View file

@ -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.......

View file

@ -0,0 +1,3 @@
pub mod part1;
pub mod part2;

View file

@ -0,0 +1,3 @@
pub fn solve(input: &str) {
}

View file

@ -0,0 +1,4 @@
pub fn solve(input: &str) {
}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,3 @@
pub mod part1;
pub mod part2;

View file

@ -0,0 +1,3 @@
pub fn solve(input: &str) {
}

View file

@ -0,0 +1,4 @@
pub fn solve(input: &str) {
}

View file

@ -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);
solve_day!(1);
solve_day!(2);
solve_day!(3);
solve_day!(4);
solve_day!(5);
solve_day!(6);
}

View file

@ -3,3 +3,8 @@ 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.")
}

View file

@ -1,4 +1,6 @@
#![allow(unused)]
mod inputstring;
pub use inputstring::get_input_string;
pub use inputstring::{get_input_string, get_test_string};
mod solveday;

View file

@ -0,0 +1,26 @@
#[macro_export]
macro_rules! solve_day {
( $day:literal ) => {{
println!("-- Day {} --", $day);
let input = utility::get_input_string($day);
paste!{ [<day $day>] ::part1::solve(&input) };
paste!{ [<day $day>] ::part2::solve(&input) };
}}
}
#[macro_export]
macro_rules! test_day {
( $day:literal ) => {{
println!("-- Day {} --", $day);
let input = utility::get_test_string($day, None);
paste!{ [<day $day>] ::part1::solve(&input) };
paste!{ [<day $day>] ::part2::solve(&input) };
}};
( $day:literal, $filename:literal ) => {{
println!("-- Day {} --", $day);
let input = utility::get_test_string($day, Some($filename));
paste!{ [<day $day>] ::part1::solve(&input) };
paste!{ [<day $day>] ::part2::solve(&input) };
}}
}