Compare commits
14 Commits
d72675c53b
...
4619bc7775
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4619bc7775 | ||
|
|
305ce52a98 | ||
|
|
a5b1227979 | ||
|
|
53557adddb | ||
|
|
5b8676f6e0 | ||
|
|
ee128f3aa8 | ||
|
|
d93049c434 | ||
|
|
507cb1a907 | ||
|
|
a64c3ef3c4 | ||
|
|
2c9b7766e3 | ||
|
|
ae293fe5a2 | ||
|
|
c1c89faef8 | ||
| b1a4969f6d | |||
|
|
e2ab6dce9a |
49
2024/gareth/day03/day03.go
Normal file
49
2024/gareth/day03/day03.go
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
package day03
|
||||||
|
|
||||||
|
import (
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
total := 0
|
||||||
|
|
||||||
|
regex := regexp.MustCompile(`mul\((\d+),(\d+)\)`)
|
||||||
|
matches := regex.FindAllStringSubmatch(input, -1)
|
||||||
|
|
||||||
|
for _, match := range matches {
|
||||||
|
if len(match) == 3 {
|
||||||
|
x, _ := strconv.Atoi(match[1])
|
||||||
|
y, _ := strconv.Atoi(match[2])
|
||||||
|
total += x * y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
total := 0
|
||||||
|
isEnabled := true
|
||||||
|
|
||||||
|
mulRegex := regexp.MustCompile(`mul\((\d+),(\d+)\)`)
|
||||||
|
doRegex := regexp.MustCompile(`do\(\)`)
|
||||||
|
dontRegex := regexp.MustCompile(`don't\(\)`)
|
||||||
|
|
||||||
|
tokenizeRegex := regexp.MustCompile(`(mul\(\d+,\d+\)|do\(\)|don't\(\))`)
|
||||||
|
tokens := tokenizeRegex.FindAllString(input, -1)
|
||||||
|
|
||||||
|
for _, token := range tokens {
|
||||||
|
if doRegex.MatchString(token) {
|
||||||
|
isEnabled = true
|
||||||
|
} else if dontRegex.MatchString(token) {
|
||||||
|
isEnabled = false
|
||||||
|
} else if mulRegex.MatchString(token) && isEnabled {
|
||||||
|
mulMatch := mulRegex.FindStringSubmatch(token)
|
||||||
|
x, _ := strconv.Atoi(mulMatch[1])
|
||||||
|
y, _ := strconv.Atoi(mulMatch[2])
|
||||||
|
total += x * y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return total
|
||||||
|
}
|
||||||
17
2024/gareth/day03/day03_test.go
Normal file
17
2024/gareth/day03/day03_test.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package day03
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))`)
|
||||||
|
assert.Equal(t, 161, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))`)
|
||||||
|
assert.Equal(t, 48, r)
|
||||||
|
}
|
||||||
6
2024/gareth/day03/input.txt
Normal file
6
2024/gareth/day03/input.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
-:-]what()(+/mul(957,396)?mul(550,844)%+why())-? #}from()mul(488,628)%} ~**mul(770,931)$~mul(791,733)<{mul(985,350)<#why()don't()what()select()$what())]what()who()mul(327,185))<^^mul(542,68)#?who()<from()';^how()mul(619,952)/where(){(!);'@,mul(551,161)select()>when()do()from()mul(51,291)[where()!{]/}'@?mul(233,511)@what()]mul(311,967))&who()how()mul(839,578)^who()]}mul(266,735){mul(176,670)mul(154,710)*select()](':^,mul(531,801)# *why()why()mul(30,325)~,where();select()select()}-/when()mul(512,729)+where();[mul(720,339)[~*when()mul(722,867)!);{+mul(582,286)^:)what()@mul(604,485) (who()why()who()from()[mul(128,295)how()?!%~~<what()mul(156,267)'how(689,161):where()mul(206,221) mul(835,81);] %mul(562,798)^{%where()mul(38,166)#!what()mul(185,550)^! ?,+;}}mul(685,101)select()mul(316,869)>[~}{[&;mul(548,186))(%];mul(841,290)when()where()'?mul(646,803)mul(553,782)how()when()-mul(569,604)@ ++:/%why()]select()mul(257,598)#mul(897,819)how()what()from()how()]when()~/!}mul(856,271)+&why(){}why()>who()mul(373,408)-who()^&%>';,when()mul(54,88)what()!mul(663,711)$#(?;^from()mul(898,810)when()from()%@mul(776,102)why()mul(303,842)!/,%<^;mul(840,791){[@mul(909,714)don't()>who()why()from(545,686)%~mul(483,956)^'why()from()where()$>*:mul(931,649) mul(800,313)):mul(31,69)mul(549,670)$;mul(327,976)@who()^mul(627,907)/[@what(925,706) ;^who()!mul(629,813)when(){$&where(){#mul(504,147)?mul(222,429)#who()*/!select()<what()mul(310,934)])^/$]mul(917,911)-%how()?[;,mul(823,273)*[~select()/select()~%mul(703,815)what()where()?what():'?[who()mul(966,52)how()&-~(%[(^mul(913,694)mul(190,570),&<%'from()where()what(979,309):+mul(662,926)/<!when()'select(),/&*mul(655,410) how()}mul(386,934)where()[mul(159,595)@']from()when()#?@mul(356,559)&)>?$ mul(439,336)?from()*select()*}when()]who()mul(148,356)(who()+mul(271,905)mul(564,172)@?(~mul(628,470)#} mul(301,170)?@,^don't();&:^&how(605,264))(what()'mul(896,108),$mul(413,431):<>where();how()>!}when()do()!}/&:when()>mul(754,737)~:#:* mul(962,620)}mul(26,490)!~,mul(450,234){/]who() <;{mul(938,932)?--#%};}mul(140,314)(-}/,[mul(202,839)^why()-!},mul(459,716),mul(600,932)}when()]who()}who())&mul(752,142$mul(174,573)mul(231,182)from()mul(308,661)what()} mul(178,99)&^*[(mul(858,730)~}from()^mul(17,545)what()~{~*^what(90,714)how(),mul(63,969)-]mul(364,49);mul(130,598<:&why()select(879,794)mul(46,169)>&how()%mul(564,506)/what(255,868)mul(415,375)':@who()mul(525,772)<$mul(277,787)[~mul(314,321)'&@$^%mul(741,325)?(%#;*mul(459,703)why()~what()mul(250,38)what()<-$)when()%(don't()mul(296 ',mul(673,933)?#<@who()from()^?mul(831,912)?/*mul(407,853)mul(119what()why()>mul(816,762) how()<}~from()how()/@:mul(792,799)()@?%:$:mul(289,264)
|
||||||
|
why(),'*),from()mul(767,350):>~mul(123,684)@from()>mul(722,338)<'<select()what()}*select()mul(993,866)where()[;'select()what()select()?why()mul(357,705)what(){+&mul(590,928)how()[why()how()+what()><why()how()mul(417,421)/[?where()mul(298,609)*%who()#where()}why()(~+mul(233,280)when()mul(740,13)where()#why()!/mul(702,342)@;mul(945,10)[}!#mul(758<mul(969,595)+how()from(573,280)what()mul(351,944)what()where()]+<how()&[^mul(211,333)what(590,707)<'mul(579,209)do()^what(324,278):<+)!mul(482,641,^why()/<$from()select()mul(302,432);$where(){*mul(58,633)#]+,select()'$mul(534,736)@+~@what()/mul(492,990)'mul(606,447)~}, #@$)$/mul(878,726)'++'who()!where()what(777,25)why()mul]@>mul(252,529)do()%)%^when()!mul(731,123)mul(582,378)-mul(934,355}where()what()how()@%<[>;<do()(mul(709,553)])?&~mul(936,634)when()who(),do()#$$mul(917,683)select()when()+mul(858,234)!mul(828,850)@(?)^)mul(244,230)*^/%what()[^$who()@mul(716,56)from()/mul(312,20)!)mul(333,734)select()from()from():$how()+$${mul(443,208) &when()&$-&:mul(4,320):*;&#~~mul(261,16)&select()'@who()~^+mul(597,905)]]()who()(mul(273,2)who()how()#+?when(263,200)/mul(699,563)$don't()why()]!mul(744,844)>:mul(5,63) who()!mul(946,479)+}select()$@mul(478,71)~<()-#mul(500,398)'from(612,869)select(98,846)!!<]:select()mul(785,98)',select()//:-mul(192,182):{ why(){;mul(910,471)&^+&who(424,579)/:select()[mul(217,829)where()how(423,674)$*mul(318,444)[!?~mul(254,793)who()select(521,861)how()mul(54,186)why()[:^;-mul(109,234)mul(465,266)+?([-mul(518,485)^mul(403,383)mul(726:how()when()#mul(344,785)/}+?mul(97,996)+@'mul(637,749)how()-%+mul(302,591)don't()%^]}!)]mul(524,902)$[]/*mul(839,651)}^)$when()'what()mul(270,805)#mul(566,750){ how()/mul(716,302)/&*>@-what()>when()what()mul(602,574)+where(619,83)mul(235,585)?where()[%select()+>where(){]mul(209,404)~where(),why()how()-/-mul(123,125)^'how()who()$}/;mul(851,629)how()who()'#;$ do():select()!when()[>+>mul(576,669)what()!,'?from()&mul(423,260) how()-mul(910,922)?<@'->(mul(274,173)why()}<~from(601,667)mul(282,816)<how()when()when()' ^from()mul(939,359)mul(385,79)who()&when()-^?-^don't()how()+*/mul~@, @/!$mul(526,30)}(:~from()do()who()$/!~)what():%mul(366,255)(*+>from(953,125)~mul(98,837)&[how()[what()mul^%} '$from()^-;mul(439,801)mul(761,498))>$'-why()<</mul(557,979)[mul(224,700)*mul(917,173)[-(~;mul(44,236)%select()what()( ![(who()mul(153,275?how()(!/mul(627,465)%/>who():mul(109,723)from()who()mul(391,416)& -how()>mul(496,170)^'${mul(657,96)why(611,959)why())from()%+mul(62,175)>}~,%from() >mul(92,927)mul(17,279)!why(){+where()}how()mul(939,286){;mul(744,904) from()?''who()&who()how()mul(170,192)@,mul(499,985)';from()})!{+who(){mul(572,653)#:why()mul(720,626who()from()(%:mul(676,779)!why() when(58,261)^ *mul +from(){)')@!*mul(802,646)how()(-+[;#when() {mul(742,576)<where()>]* ;mul(38,717)?what()}'how(184,130)mul(126,115)]@>mul(512,978)/where()+*why()mul(705,242)?{$how();when()mul(173,898)'(~who()mul(536,621)&^from()select()when()?@mul(52,680)] -%@;][mul(971,573)^mul(879,466)
|
||||||
|
mul[!-,why()(?mul(770,624)~:mul(197,580){{(%mul(678,337)what()mul(951,457)'<#mul(679,253)?do()who();& who()select()mul(105,231)+{&!when()who()how()!')mul(262,609)):,{'from()/?@}don't()*:mul(471,462):([(@;from()mul(734,965)/&/where()mul(885,324)why(){>/#<:mul(390,818)!mul(684,730)*>>{[!what()what()mul(824,893)mul(801,597/why()!when()how() '>from()%mul(165,825)who(837,795)?? why(187,949)mul(703,551) when()'mul(759,898)select()#$$ where()where()mul(694,292)%(who()%#}mul(884,767)^<mul(900,512)^what(862,782)%*}mul(484,385)]where()where()mul(593@{what()?{{@&who()^*mul(511,975)+%from(193,630)@-~how()/<mul(161,30)mul(462,217)mul(283,656)when()mul(733,613)what()^what()why()/where()what()^!mul(777,858)^select()mul(732,203)how()<mul(574,457)select()where()$who()when()~where()#}mul(525,448)*mul(5,230)mul(347,280)<from()#what()mul(613,165)@who(609,769)@~/,%#;*mul(298,242)what()+~when():($-(mul(118,981)mul(72,529)$^~select(306,809),!/(mul(864,257))what()-?mul(308,631)? //*&,/!don't())>:$mul(945,214) where()how(837,748)(mul(537,489)(%{mul(594,245)who()from()from()%}!)])why()mul(832,704)^~mul(902,18)how()what()who()/#'-#mul(345}who()when()?]&^mul(873,161)^mul(81,518)]$mul(875,700)how()where()(mul(735,369)/-< why()@>mul(703,274)-<mul(949,449)what()+(>from()when()**,)mul(204,896)]+mul(28,596);why()#select()'#]mul(774,171< why() !from()mul(29,711)mul(28,600)}when()!@(^why()~{mul(555,761)%}do()from()-mul(139,179){how()'?mul(294,354)}where()mul(317,957)]select()#;where() where()^@from()mul(461,831)~who(75,120)%who()@-&;,)mul(563,131)mul(607,401)select())from())&,mul(26,412)select(726,797)&)how()@select()mul(416,615)(what()select()!()<<what()who(299,911)mul(628,777){mul(712,971)(*]what()from()<>#;&mul(921,158)>- mul(245,598)select()what()*({mul(468,522)]^select(574,638)]@};do()from(799,930)%who()#:[how()mul(413,674)[how()*mul(327,432)%?@'mul(486,644)}~>-mul(637,16)how(254,818){%where()#where()who():who()mul(431,749)$$where(228,303)<!why(109,819) ]mul(693,21) where(396,89)[mul(60,538){mul(738,595))-&why()how()why()(mul(698,770))*>,%+&mul(593,337)}#:where(){why()[+&!mul(520,180)^mul(723,959)mul(492,739){/?mul(327,463)?-select()-<,mul(102,950)!#do()@when()-when()},select()/mul(274,979/from())who()(~)!^$mul(78,739)why()@{~mul(819~?~+]>@mul(824,208)}mul(338,41)where() &*;;&what()mul(888,646)from(),$:-who(263,596)!!-from()mul(396,204)>{)>{?(%{mul(885,937);!what()&%!<mul(178,507)mul(833,974)^mul(842,332)>from()}mul(207,417)(<;what()mul(187,893)((&&}&why()*)-mul(589,985)^how(310,10)when(),]:mul(989,534)$where()mul(552,604;(!;select(){){where()#mul(152,511)+/$!;+/<+]mul@select()::when()who()how()!what()mul(446,994)from()<}what()select()'why(244,102)+<select()mul(516,369)]&mul(707,483):@}%?what()from()don't()mul(407,712)$:{&:,,,?mul(112,3)-~- what()>)%}who()mul(693,903)?*/}select()mul(282,115)[];why(){mul(925,276)how()&{what()&$when()&-!mul(191,385)*)mul(446,703)[>what()?*}what()^who()*mul(997,718)!>$)@,^*)mul(788,724)from()#&]~/<,)how()mul(181,531)[(why()[mul(409,206)what(604,231) when()why(921,229)]>where()//mul(199,96)when()why()#!/usr/bin/perl~%>~ &:mul(239,884)
|
||||||
|
what())[$^+why()mul(118,89)mul(689,203)#,,what()what()mul(633,394)from();~from()!where()*?@mul(568,753)/[+when()?%:mul(828,475)what()don't()-;@ mul(509,544)[when()};<+'(mul(235,757)<+:%select():mul(241,373)$mulselect() (%where()where()]-)mul(306,62)from()what()mul(285,414)!*&&>who()#mul(543,866)/~select()[+don't()/><why()from() ~#mul(983,515)#mul(731,258)mul(894,831){>)where()!when(),'mul(701,189)/';!:]+how(902,507)-^mul(847,104)mul(883,112){'~}&mul(697,190)what()%-mul(220,860)+^mul(765,74)select(),$who()<mul(685,855)!what()where()why()#{,-;mul(302+^(who()]from()~<?where():mul(383,623)::~(>,@mul(639,551);(mul(26,80)why(480,988)^why():? <[mul(672,116@mul(316,879)}mul(498,582) @,:{'why(589,887)mul(39;]mul(855,31)^from()?mul(93,510)mulwho(){@-what()<where()~select()mul(225,679) 'mul(305,662)/:,mul(887,727)?:~:&/select()#:<mul(755,830)^#}+@)how()?^mul(14,79)-mul(433,926)what()'mul(458,711)>from();where()from()~:(mul(688,799)~when()>from()-select()who()~<mul(71,560)( who()? +#^who()[mul(70,477)}>#+{ >mul(275,916)#?-mul(359,865)where(441,672)'}what()[from()when()<>who()mul(909,227)$:!'mul(330,478)!?[;(+#what(919,466)&/mul(73,181)[{how()mul(403,182);mul(249,968):!from()?!{#-mul(661,975)!-;}'mul(999,285)select(565,140)+>@,$:from(47,825)~!mul(599,436))<when(603,518)@mul(567,365)?(}}where()<{:who()?mul(755,613) <*who()mul(448,608)$$mul(507,887)mulwhen()]when()^$+@();+mul(846,707)]mul(932,511)who()}}where()#mul(122,316)#>+ [>%!mul(959,617)mul(5,150)where()@;&mul(630,775)<select(686,710)who()/';[*%select()mul(859,837)'mul(451,3)(when()($/+mul(499,794){]mul(194,78)from()'?don't();mul(47,314){who()~/]mul(526,464)why(666,133)#}/;]:mul(223,721)how()><&-:;mul(114,820[don't()when()#how()mul(976,290;+-from()where()]mul(338,47)when()what()where()%]mul*who() #+what()mul(679,324)mul(859,321)%'mul(446,297),#select();<mul(797,938)who()mul(531,845)}*select()@{mul(661,677)/)'*mul(837,800)<who()select()<]}<@mul(844,594))when()where():'mul(75,307)mul(676,67)(]what()<select()?mul(851,92)+&)mul(683,41)?<,/:~'mul(179where()from()~<mul(674,897)/!how(529,298) *[}from(),mul(362,131)}! % $mul(168,955)mul(517,218)[(,mul(740,567)}~[)$@from(),do();]mul%/%]why()mul(777,920)what()what()$;<what()mul(307,462)-+from()what()/$select()select()do()<select()&from()why()why()&mul(522,562))<how()-!+when(413,672)&)mul(621~(?select()<*-why()mul(372,852)}]~mul(668,335)mul(512,514){%mul(873,547)[*(mul(887,814)]>';from()mul(206,301)why()-'mul(87,734)<where()+:mul(844,819){#^^mul(130,409)[('@what() ;mul(916,629)@@who()-?}mul(320,288)what()?mul(184,677)[@#select()+::-select(929,36)/mul(329,568)
|
||||||
|
{^mul(75)<:from(){select()select()mul(833,211):[-'mul(702when()who(21,237)+)&!>mul(735,118)] {/what()*@^what()where()mul(685,883)when()what()mul(91,84)}]<select()why(795,767)@why()]}$mul(711,291)select()--+<*who()mul(898,469^how()>-~where(){when(374,912)$do()>~,' how()mul(67,939),)&~@where()(mul(923,997)~,*$when()[from()from()mul(699,705)~/when()+}mul(214,775)'%mul(715,142)-;mul(290,853)from()$why()what()select()-@-mul(682,729)+^$}, !mul(197,39)mul(269,573)@^mul(819,945)/select()-do()%$~'#select() 'mul(64,956)[who()*who()@,)>+}mul(519,356);*/%>why()[[)mul(184,666)what()mul(892,160)+*&where(764,214)--]?(>mul(996,338)>when()what()]))&?mul(865,864))?@[::when()>what()>mul(218,296)&)%:<?mul(903,712),+mul(102,86)' ^,[>[~why()how(416,393)mul(118,100)from()select()#: $mul(7,742)how()&~how()>who()^mul(667,218)?/mul(218,898)!:$from()>mul(746,995)(+select()] when()}mul(971,429), !,&mul(505,165):!-)?-how()from()%mul(921,456)@mul(491,404)#how()-mul(284,834)#?(mul(667,960)]where():how()what(963,920)% what()don't())mul(236,336) why()why()select()where()^mul(33,901)mul(253,866)<#>$]%-mul(216,512),)from()what()what(464,183)where()select()@'}mul(98,640)' :)what()$%~#/mul(283,893)(mul(520,959)#^?{>@*when()when()]mul(80,420)where()mul(751,106)when()when()! how()mul(148,813)@><^[mul(740,246) how()where()!!/mul(242,262) who()who()%,mul(308(#/when()$mul(359,332)from()why()from()~$$^where()@mul(270,445)why()}%mul(623,449)where()how()?& />mul(759,849)-} (mul(84,200),$;who()[!mul(934,76)(@^:where()why()/'mul(650,46)[mul(105,265):)when()+ &'what()^mul(334,290)] $what()/mul(930,226,>^!%don't()mul(243,460){'#/what()+/mul(437,684)mul(501,579)/mul(243,174)mul(988( +<#where(206,306)where()[,from()mul(331,170)(?^~}#mul(940,949)>(,*+mul(925,961)^*from()select()^--^)(mul(994,182)+'+mul(153,816)~<!?[mul(31,276)don't()how():/!*] !^~mul(404,438)from()<]?)})>&mul(260,998)~:],],who()why(348,109)why()<don't()]#?)select()<<where(999,395)mul(342,366);what()select()~&~mul(120,353)when()]mul(198,41)][;(]:select()-[mul(947,937)$$when()-{mul(672,675);/!mul(14,647)>who()when(290,863)why(735,89)!from()@ >#mul(205,831)'$ %'mul(981,644)!<mul(100,956):{#select()#*mul(168,493)who()-%)#;{don't()^]who()~~ *mul(47,958)mul(130,976)how()~how()?what();mul(983who()(why()/)},]*:/mul(374,969)>#,*>mul(910,535))[who()#mul(220,934)how(271,592)-,*$,+mul(11,63)mul(783,580)^&*}~<mul(677,425))select()when()/how()mul(181,298)??why()how()&/mul(670,720)/@!when()where()#mul(403,306)]from()(from()why()*why()don't()^~from()[select()who()select()mul(516,37)what())}-*>(;from(){mul(21,444$what(274,202)<where(),}mul(706,78);select(275,134)]{&}why())@mul(302,87)[@[who()!when())mul(196,98)mul(918,675):,>how()mul(293,78)mul(189,814)#{}why(80,738)}from()mul(456,691)*@{(,[%mul(916,89)how())(]@mul(524,412)];:(mul(374,851)where()[mul(473,999)select()$what()}don't();];(}mul(327,69)%&+;:/what()don't()-%,'()mul(377,536)mul(31,322))@what()^select()mul(719,58)$why()~&what()']}mul(39,890)(+<#who(){how()!<mul(559,894);-&what()from()#$do()mul(256,3)where()^how()when()$:<what() mul(664^-from()}mul(469,922)from()>mul(299,824)(]](+mul(205,11)
|
||||||
|
{mul(602,646)!% ^mul(384,953)do()&&:]<<select()#<mul(766,701)&@(what()who()+>mul(228,736){({}don't()-when()@*>-mul(278,494))/&<mul(596,290)select()when()),{ ~mul(563,584)mul(351,221)how():#where()[{%what(128,820)[ mul(754,363)!{)how()&''from()mul(388,712)?;'>?><(select()mul(916,219)select(),:{(<*mul(360,209)why();~}where()-(,mul~when()when()!where()@:;:#/do()select()select()!,how(972,480)~-how()who()mul(726,867):>mul(549,954)](how(802,821)select()how()[+^mul(535#select()}why()[what()]why()*{#mul(72,525)mul(809,41who()!~where(82,230)}mul(961,563)}who()what(417,588)<how()mul(756,106)!)when() [mul(733,591)how()[why(),<+@,mul(889,603)when()when()mul(60,212)mul(955,930)]~&)/!}-}&mul(206,66)where(882,366)~/<{mul(745,261)'<where()<why();select()(how()mul(74,146)where():~who()what()>&*mul}{,+?%^[when(34,108)who()mul(71,111)$+,}#~-<mul(265,932)]$what();^mul(775,136)mul(192,60)how(){)mul(212,476<who()?mul(264,266)[,^&/how(215,234)mul(447,79)!!+;,who()@{mul(897,924)^what()-%((don't()mul(259,393)who()when(956,639)&where()]@{,mul(637,712)%(mul#'select()!~<+<do(),#&<:% -{)mul(914,330)when()-)?@]{where(240,411)*select()mul(191,984),%?-what()+{mul(623,7)+mul(899,145)</why()select()what()<{~mul(849,743)!where() mul(43,318)when()!~$)mul(607,51)!?<mul(123,500)<]how()!what(){(mul(380,536),mul(367,657)~{,why()?-*$mul(589,520)(#mul(568,853)!-how()'^what()}'^mul(924,205),};'/^!!@mul(765,625)*!+where()[@select()-~do()!!,who()+%mul(369,495)()/mul(530,282)mul(148,870)]*where()mul(668,764)%who()how()how()&![who()mul(678,727)>^]@ when(){:@mul(545,335) &how()from()<:mul(958,59)$ (what()mul(886,155)how()&+mul(525,132)<&}who(502,340)select()when()#^mul(339,398)who(),(how())@@how()$$mul(831,852)when()don't()>mul(935,45) select(930,598)!:select()mul(693,62)(mul(681,508)how()^@*;)mul(235,731)who(468,32)#~>don't()#:what()where()when()~<who()-/mul(137,827)!who()!why()mul(806,939)from()mul(492,899)why()^),who()]#from()$ mul(384,731)>~^>@#{mul(2,62)mul(866,617),>% mul(806,586)how():{/mul(669,407)!/mul(457,522)mul(40,474)>)]select()who()}mul(451,794)]#mul(115,471)~mul(331,456)@^who(){#when()mul(672,70)where()who())(#how()what()!mul(438,748)-/mul(605,224)mul(46,34)~?'</'$#how()&mul(278,426) mul(710,864)mul(296,109);mul(481,73)&<,]mul(650,979) mul(575,478)how()$@%#;mul(319,368)][select()where()/ /,:when()mul(399,630)from()mul(9,26)~'do()mul(953,316)%''%{>mul(650,523)?mul(871,731)?%from(966,980)>when()mul(790,779) from()#$:,'mul(428,763)@# why()mul(724,6)select() ,mul(208,11)why()how()mul(287,562)$[:select()},?mul(531,36)/mul(12,351)#$+,:#:$when():mul(941,380)-[from()!)?-select()mul(102,544)when();~{select()~^;-do() ]who()from(),<who()]/>mul(959,599)>why()/,<%-,!mul(517,558)%])$mul(945,968)mul(854,265)?<when()mul(98,913)<&&}]+mul(830,92)where()]why(132,949)why()from()when()'when();{mul(615,131)(,;}^~!mul(973,226)how()^}){}mul(45,238) where()#)'!~ <
|
||||||
91
2024/gareth/day04/day04.go
Normal file
91
2024/gareth/day04/day04.go
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
package day04
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var directions = [8][2]int{
|
||||||
|
{0, 1},
|
||||||
|
{0, -1},
|
||||||
|
{1, 0},
|
||||||
|
{-1, 0},
|
||||||
|
{1, 1},
|
||||||
|
{1, -1},
|
||||||
|
{-1, 1},
|
||||||
|
{-1, -1},
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
grid := parseInput(input)
|
||||||
|
return countXMAS(grid)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
grid := parseInput(input)
|
||||||
|
return countXMASPatterns(grid)
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) [][]rune {
|
||||||
|
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||||
|
grid := make([][]rune, len(lines))
|
||||||
|
for i, line := range lines {
|
||||||
|
grid[i] = []rune(line)
|
||||||
|
}
|
||||||
|
return grid
|
||||||
|
}
|
||||||
|
|
||||||
|
func countXMAS(grid [][]rune) int {
|
||||||
|
rows := len(grid)
|
||||||
|
cols := len(grid[0])
|
||||||
|
target := "XMAS"
|
||||||
|
total := 0
|
||||||
|
|
||||||
|
for r := 0; r < rows; r++ {
|
||||||
|
for c := 0; c < cols; c++ {
|
||||||
|
for _, d := range directions {
|
||||||
|
dr, dc := d[0], d[1]
|
||||||
|
found := true
|
||||||
|
|
||||||
|
for k := 0; k < len(target); k++ {
|
||||||
|
nr := r + k*dr
|
||||||
|
nc := c + k*dc
|
||||||
|
if nr < 0 || nr >= rows || nc < 0 || nc >= cols || grid[nr][nc] != rune(target[k]) {
|
||||||
|
found = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if found {
|
||||||
|
total++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func countXMASPatterns(grid [][]rune) int {
|
||||||
|
rows := len(grid)
|
||||||
|
cols := len(grid[0])
|
||||||
|
total := 0
|
||||||
|
|
||||||
|
for r := 1; r < rows-1; r++ {
|
||||||
|
for c := 1; c < cols-1; c++ {
|
||||||
|
|
||||||
|
topLeft := grid[r-1][c-1]
|
||||||
|
topRight := grid[r-1][c+1]
|
||||||
|
center := grid[r][c]
|
||||||
|
bottomLeft := grid[r+1][c-1]
|
||||||
|
bottomRight := grid[r+1][c+1]
|
||||||
|
|
||||||
|
if center == 'A' && ((topLeft == 'S' && topRight == 'S' && bottomLeft == 'M' && bottomRight == 'M') ||
|
||||||
|
(topLeft == 'S' && topRight == 'M' && bottomLeft == 'S' && bottomRight == 'M') ||
|
||||||
|
(topLeft == 'M' && topRight == 'M' && bottomLeft == 'S' && bottomRight == 'S') ||
|
||||||
|
(topLeft == 'M' && topRight == 'S' && bottomLeft == 'M' && bottomRight == 'S')) {
|
||||||
|
total++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return total
|
||||||
|
}
|
||||||
35
2024/gareth/day04/day04_test.go
Normal file
35
2024/gareth/day04/day04_test.go
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package day04
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`MMMSXXMASM
|
||||||
|
MSAMXMSMSA
|
||||||
|
AMXSXMAAMM
|
||||||
|
MSAMASMSMX
|
||||||
|
XMASAMXAMM
|
||||||
|
XXAMMXXAMA
|
||||||
|
SMSMSASXSS
|
||||||
|
SAXAMASAAA
|
||||||
|
MAMMMXMMMM
|
||||||
|
MXMXAXMASX`)
|
||||||
|
assert.Equal(t, 18, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`MMMSXXMASM
|
||||||
|
MSAMXMSMSA
|
||||||
|
AMXSXMAAMM
|
||||||
|
MSAMASMSMX
|
||||||
|
XMASAMXAMM
|
||||||
|
XXAMMXXAMA
|
||||||
|
SMSMSASXSS
|
||||||
|
SAXAMASAAA
|
||||||
|
MAMMMXMMMM
|
||||||
|
MXMXAXMASX`)
|
||||||
|
assert.Equal(t, 9, r)
|
||||||
|
}
|
||||||
140
2024/gareth/day04/input.txt
Normal file
140
2024/gareth/day04/input.txt
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
XASXMAXXMSXXSMMSXMMSMXSMXMSSMSSSMMSMAMXMXSMMMMAXAMXSASXSSMMSSMXAMXMSAMXMMXAXXXSAMXXXXXMMXSXMXXSMASAMXMXAXXMASAMXXXMAMMMSXSXMXMMMSAASXSMSSMMS
|
||||||
|
XASAMSSMAMMMAMAAAMASMAMAAXMASAAASAAMAMAMAAAAASMSSSSMAXAAAXASASMMMMMMXMASXMAMXXXXSMSMSXSAAXAMXMASMXMMSMSAXSXMMSXSMMAAMXAMAAMMAAAAXMXSAAAAXAAM
|
||||||
|
MXSXMAAMXAAAXMMSSMAXMASXSSSSMMSMMSXSASMSMSSMMMAAAXXXXMMMMMXXAMMAAAASMMAAAXMASMXXXAAASAMMXSASASMMMAMXSASASASMAXXMAMSSSMSSMMAXSMMSXMMMMMMMXAMX
|
||||||
|
SAMMMSSMMXXSXXXAAMSMSASXAAXMXXAAXXXMAXAAAXXMASMMMMMMXMXXXXSMXMSSMSASASMMXMMXMAAMASMSMSMAASXSAAAASAXAMAMXAAXMASMSSMXAMMMAMXSAMAMAASXMMSSMSAMX
|
||||||
|
MASAAAAMSMMMMMMSMMMAMAXMMMMMXMSSMMXMSMMMMMAMXASAXAASXMMASAAXAXAXMXMXMXAASXMAMSXSAMMXMMMMMSAMXMSMSMSMMAMSMXMMASAMXAMMSASAMMXASAMSXMAMXAAXSAMA
|
||||||
|
SSMXMSMAAMAAXXAMXASMMSMAMXSXSAMXXMAAAAXSXSAMXMASMSXMASXAMSAMXMMMSASMXMXMMAMSMXAMASXMXAASXMMMMXMMXAAXXAMXXAAMAMAMXXXASXSASXMMSAMMASXMMMMMMMMS
|
||||||
|
XXXXMAMMMSSSMXSXSASXAXSXMASAMXSMXMASMSMSXMASXXMMXMXSAMMXMAXAMAXXSXSAASMASXMXAMXMMMAASMXXAMXMMAXMXMSMSAMSSMSMMSSSSMMMSXMXMASXSMMXAXAXSSSMXAAX
|
||||||
|
MMXSSXSMXAMAMAAAMSXMXMMXMASXMMSAMXXAAMXSASAMMXXSXMXMASXSSSMXSSMXXMXMMSAXMASMMMSMASAMXMASXSAMSSMSMAAAMAMAXAMAMAMXAXAXSAMXMXAXMMSMMSXMAAAMSAMX
|
||||||
|
AXMXMASMMASAMXSXMMXSAMAAMXMMMAXMMSMMXMASAMXSXMXMAAMAMSAMAAAMSAMMSXMXSXMXAXMASAMXAXMASXMAMMAMAAASMMMSSSMSSMXSAMXSMSMXXAMXSSMASAMAMMASMMMASMMM
|
||||||
|
XMAMSXSASASASMXXMAMMAASXSAAAMMXAAXXAMMMMSMSMXMAXMXMAMXAMSMMMSAMASAMXSAMMMMXMMAMMSXXAMAXXAMSMMSMMAXXXMAAAAMAMAXXAMXXSMSAXAAXAMMMAMSXMAXXMSASX
|
||||||
|
MSSMXASAMXSMMMAXASMSMMAXMAMSASXMAXMMSAXSASAAASMXMASMSSMMMAAXSAMMSAMAMAMMSAMSSSMSAMMSSSMSMXMAXXASXMMMMMMMSMASASXSXMASAXXMSSMMXMXMMMMSAMMXSAMX
|
||||||
|
MAMMMMMMMMMASAMMMXAAXXMASAAXASMMSXMAXMXSMSMSMSXAMMXXAMXASXMXXAMASAMSSXAAMAMAAMXMASAAAAAAXSSSMMAMASASXXXXMMXSASAXXAAMAMAXXMXSASASAMASAMXAMAMX
|
||||||
|
MASXAXAMXXSAMMAAXMSMMXMAMXXMMMAAMMMSXMMSXMXAAXXMSAMMSSMMSMMMMAMASAMAXMASXMMMSXAXXMMMSMMMAXAAXXSSMSASMMSAMXXMAMAMXSSMSMSMAMAXXSXSASXMSSMXSAMM
|
||||||
|
SXMXMSSSMMMASMSMSMAAMASXMMXSASMMXXAMXXASASMMXMAMAAXAMAMAXAASXMMXMMSMXXAXMSXMAXXSSSXAXAAXMMMMMMXAXMMMXAAMAMMMXMAMAMXAMAXAAMASAMASAMXMAMMXSASA
|
||||||
|
MMMXMXXAXAMAMMAAAMSMMAXAASASAXXXSMSSSMAMXMAMXXASXSMMSMMXSMMXAXSXMAXAMMMXXMAMSAMXAAMSSSMMXAAAAXSAMXXAASMXAASMASXMSSMAMAMMXSAAAMAMAMSMAXSAXAMM
|
||||||
|
SASASMXMMSXSXSMSMMXSMXXXMMASAXSXMAXAAMMMSSMMMXASXMXMAAXMXMMMXMSAMXSXSASMASAMMSSMMMMAAAXMSSSSMXXAMXMAXXXMSMSAAMAMAMAMMMMXXMMSSMMXAMXXAXMASXSM
|
||||||
|
MASMMAMSAMMMMAMMXSAMXSMSAMXMMMAAMAMXMAMAMAAAAMSMXSASMXMAAAXSAMXAMAAMSAMSAMXSAMMASAMXSSMMMAMMXXMSMMXMSSMMXAMMXSAMMSAAAAMXAAMAXASXSMSMMSMAMAAX
|
||||||
|
MMMMMSMMAMXAAMMAAMMXAMMAAAXAXSSXMAMXMAMASMMMXMAAXSASAMSSMSASASXMMMSXMAMXXMMMMXMAMAXAMXAXXSAAASAAAXXXAAMAMAMAAXAMXSASMXSASXMSSMMAMASAMSMMMSXM
|
||||||
|
SAAMAMAMAMSSSXMMXSSMSSSSSMSSXAAMSXSXSASASAMAMSMSMMMMXAAXAXMSAMASXSMMXSMSMSXSSSMMXMMXSSSMAXMXSXMMAMXMSXMASMMMXSAMAXAXMASMMMMASAMXMAMAMXAXAMXA
|
||||||
|
SSSMASXMMXMAMXMMAMXAAAAMMAAXAASMSXAAXAMASMMAXAMAAMSAMMMMSMMMXSAMXMAAMXAMAAXMAAXAAMMXMAMMAMMXXAXMAXSAAXSXSXXAASAMAMSMMMXXMXMMSMMSMXSXMSXMXMMS
|
||||||
|
XAMMAMAMXMMSMMSMAXMMMSMMSMMXMAMAXXMSMSMMMXXMMSSSSMMXMAAAMAXXMMMSXMMMSMAMSMMMSMMSXXASMAMMASMMMAMSSMASMXSAXXMMMXXXMXMXXAMMSASMMMAXMXMXAMXSAMXA
|
||||||
|
MMXMXSAMMXAXAXMSMSXXAAAAAMSMMXMAMXXAAMASMSXSAAXXAAMAMSSSSSMSXAAXMSMXAMXMAMAMXAMASXXMMMSMMMAMMSMMAMMAXAMAMSXSSMSSMMMASAXASMXAAMXSXAMXMAMXASMS
|
||||||
|
AXMSMSXXAMXSMMMMXAMMMSMMMSAASAMMMSSMSSXMAAAMXSMXSSMAMMAMMAASXMMSAAXSXSSSSSSMMAMASXAXXASXSSMXAMAXAMXAMMMSMMASXAAXAASAMXMMXXSSMMSMMXSAMSMSMMMA
|
||||||
|
SMAAAMASXMMSMMXMMMMXAAXASMMMMASXAAAXAXAMSMMMAAAXXAMXXMAMSMMMAXSMMMMMSAAAAAXAXSMMSMMMSAMAXXXMSSMSSSMMSAAXAMSMMMMXSMSASXXSXMMXAXMAAXXASMAAXASM
|
||||||
|
XMSMSMAMAAAMMSASAAAMSSSXSAMXSAMMMSSMMSMMAMAXSXSXSAMAXSAMXMMSSMXAAXASMMMMMSMMXMAXMASASAMSMMSAMXXMXAAASMSSMMASAAXAXASAMAMMASMXSMSMMSSMMMSMSMSX
|
||||||
|
MXXMAXASMMSSXMASMMMAMXMAMXMAMAMXAAXMMAAXMSAXMSMASMMSASAXSMAAXAMXMSXXSMXSAAMMAMAMXMMXSAMXMAXMASMSMMMMSMXAMAMXSMSXMAMXMXASMMSAAAMXAXXASAMXAASA
|
||||||
|
MMSXMMMXMAAXMMXMMMSSMMMAMSMSMSMMSSSSSSMMXSXSMAMAMXAXASMMSMMSSSMSMAXMXSAMXSASASXSSXMASMMSXMMSMMAMXSAXXMXMAXXMAXSAMAMMAMXXSAMXMMMMMSSMMAXSMMMS
|
||||||
|
MASMSASXMMMSSMAAAAMAAXSSMSAAAAXXAAMAAAMSXMASMXMASMMMMMAAMAMMXXMASMAMAMMSMXAMAMAAXXSASAXMASMASMMMASXXAXMSMSSSMAXMXSMSAXMAMXMSMSXXMAMASXMASAAX
|
||||||
|
MXXAXAXMXAAMASXXMSSSMMMMAXSMSMSAMXMMMMMSAMAMAMAMXXAASAMXXAMMSSSMSXAMAMXAAMXMSMMMMXMAMXMSXASAMXSMAMMSSMXAAMAAXAXSAMXSASMSMAXAAMSAXASMMASAMMSM
|
||||||
|
MAMSMSMSXMXSAMXASMMMAMAMMMMXXXAMXAMAMAXSAMASAMSSSSSSSMAMSMSAAAAAMXMSASXMSMSAXXXXMAMXXSMXSXMMSMSMSXMAMASMSMSMMSAMXSXMAMAMSSXMXMXXMAXXXAMASAXM
|
||||||
|
MASAAMAAXSAMXSSXMASMMMAMXAMAXMMMSMXAMSXSAMAXAMXAAAXMXMAXAMXMMMMMMSXXMAXMMMSASXSMSMMMMSAMAXMAAAXAAMMMXMXXAMXMAXXMASAMMMXMAXXMSSMMASXMMSSXMASX
|
||||||
|
MXSMMMMMXMASAXAMSAMAASMMSASXSAXAAAMSXMASMMSMSSMMMMMMXSSSXSMMSSMXXSAMXMSMAAMAMAXAAMSSMXAMMSASMSMSMAASMSMMSSSMMSAMXXAMXSSMAMXSASAMXXAXAAMAMAXA
|
||||||
|
XMXMAXXAXSAMMXSAMAMXMMAAXAAASMMSXSXXAMAMXXMAAAMSAMASMAXAMMMXAAMSAXSAMXSMMSSSMMMSMAAAMSMMXMAXAXAXMSMMAAAXMAXAXSXXAMSMMAAMMMXXAXMMAMSMMMSAMASM
|
||||||
|
MAASXXMMXMAXSXMXMASMMMMMMXMAMMAXXMAMSMXMAAMMMSXMASAXMMMMMAAMSSMSAXXXMXMAXAAMXAAMXMMSMAAASMMMSMAMAXAMSSSMMMMSMMMSMMXAMSXMASMMSMAMXSXXXXSXXAXX
|
||||||
|
AMXMSXAMMMSMXMSMSASAXAXXMMMMSMMSSMAMMMMSMSXAAMMSMMXSAAASXXXXAAXMMMSMMASAMMSMMMMXAMAMXMXMMAAAMMXMAMXMXAMXMXMAAAAXXASXMAMSXSAAAMAMXAXXSAMXMXSM
|
||||||
|
XXAAMSSMAAMXAAAAMXSMMSAMXAAXAAASASXMAAMAAAXMMSAXAAAXXMSSMAXMSSMSAMXASMSMSMMMSMMMSMAXAXSASXMSSXSMMSXSXMSAMSSSSMMXMXSAXXAMAMMSSSMMSMSMSXSASAAX
|
||||||
|
MSMSMAMXMSSSXSMSSMMXMMXMSSSSMSMSAMXSSXSMSMMXAMXSMMSXXXAXMSMMXMASMSSXMAXMAMAAAAMAXMMMAXMAMAAAMXMAXXMMAXSASMMMXMXSAAXMMMSMAMXAXAMMAAAASAAASXSM
|
||||||
|
XAAXMMSXMAXXAXMAMAMMMXMXAXMXAMXMAMXAMXSXXXSAMXMXMAMMAMMMXAMMAMAMXXXASXMSMSMXSXMXSAXMSMMASMMMSMSSMMMSXMSSMASMMAAMMSMMSAAMSSMASMMSMSMSMSMAMAXX
|
||||||
|
MMMMAAMMXSMMSMMASAMAAASMMSSMXMMMAMXAXXSASAMXMASASASAAMAAXMMSASMXSAMMMAAXMAMXMXSXMAMSAMSAXAXMAXAMSAMMAMXXSAMAMMXSAXXAMXXSAMAAMXAXAMMXXXXAMMMS
|
||||||
|
MASMMMMXAXMAMASASXSMSXSAMAMXMMMSSMSMMXMAMMMSSMSAMXSXMMXSSXASXSMMMMSSSMMXXAMASAMXMAMMAXMXSSMMSMMSMSXMAMMMMXSXMAMMMXMSXSXMMSSMMXSSXMASMSMMMXAX
|
||||||
|
MAXAMXSMAXMAMMAMXASAMXSXMAMSXSAAAMAAXAMXMXAAAMMXMMMAMSAMXMMMAXAXSAMMAXAMSSXSAMXASXSMXMXAXAAAAAXXAAMASXMAMXSXMASAMSAXASXAXAXAXXMXMMXMASASMMMS
|
||||||
|
MSSMMAMMMMSSSMASMMMAMXXASMMSAMMXSASMMMSSSMMSSMAXMASAMMXMXMMSMSMMMASXSMXXAMXXAMXXSASAASMSSSMMSMMMMMSAMASASMXASXXAXSAMAMSSMMSXMSSSMMAMSMAMAAXX
|
||||||
|
XAAXMASASMMAAXSMMSMSMMSMMSAMXMAMAAAAAASMXMMMAMASMMMMSAMXMAAAXAAXSAMAXAXMMMAMAMMSMAMSMMAXAXXMAMMAMXMASXSAAASAMMMSMMAMMMMXXXMASAAAXMASMMASXMMM
|
||||||
|
ASMMSXSXMAMSMMMAMXSAAMASMMMSXXAMMMMSMMSAASASXMASMASAXMASMMSXSXSMMXMSMSMMXMMSMMMXMAMXXMSMXMASMMXSMMSAMMMMMMMAMAXXASXMSAMXMMMXMMSMMMXXAXAXAMXM
|
||||||
|
MXXAXXMASMMXSASAMXSSXSASXAXMASXSXMMXXSMMMSASAMAMXAMXSSXXAAXASAMXSAMAXAASMXXAMAMASMSMSXXAMAMAAMAXAMSAMXAMXMSSMMSSMMMMSASMSASXSAMAMSMMSMSSMMAM
|
||||||
|
MSSMMXSASAASMMSSMAMAXMAXMMSXXMXAAMAAMXXAXMAMXMSSMXSAMXMSMMMAMAMXSASMSSSMAMSASASMXMAASAMSASXSAMAMAMMASMASMXAXAAXASAAXSAMXMMAMMXXAMASAXAMXXSAS
|
||||||
|
XAAAAAMXSMMSSXXMMXSXMASMSXMASMMSSMMSSMSSSSXSAXXMXAMXXAMASAMXMAMMSAMXMMAMSXXASAMXSMMMMAMXSMAXAMMSMMSAMMXMAMXSMSSMMSAMMMSXSAASXMSSMMMXSAMAASAS
|
||||||
|
MSSMMSSMXXAMAXMXXAXAMXXAXASMAAXAMMXAAAMAXAASMMSMXMMSSMSASMMMSMSAMMSXMSAMXMMXMXMXAAXAMXMXXXAMASAAAMMASXMMSAMXXAAAXMXSXAXMASXSXAMAAXXAXAMXMMAM
|
||||||
|
AXAXMXAXSMSSMSMMMMSMMMXXSAMSMMMSSSSSMMMMMMMMXAAXXAAAAAMXMAMAAMMXMAMAXXMXAMAXMASXSMMSSMMXSMSSXMXSMMMAMAAAMXXXASXMMMAMMSMMAMMMASMAMMMMSSMMXSAS
|
||||||
|
SMSMSXMMMAMXXSAMAAAXAMSAMXAXXMAMXMAAMXAXXSAMMSSMSMMSMMMXSAMMXSAMXAXMMSMSAMXAXXMAMAAMAAAXXAXMASAMMSMMSMMSSSMMMMSAAMAMAMAMASASAMXXMAXAAAAAXSAM
|
||||||
|
XAXASASAMSMMMSAMSSXSAMASXMAXXMAXSMSMMSMSXSASAMAMXXXAXAXXMAXMAMASXMSAAAXMMMXSMXMAMMMSSSMXMSMMMMXSAAAXXXXAAAXSAAMMSMMXXXAMAXAMXXMXSXXMSXMMXMAM
|
||||||
|
MAMAMSMXSAAAASAMAMAMMSMXXXMASMXSAAAXXMASXXXMMSXMSMMXSSSSSSSMMSXMAAAMMMSSSSMAAASASAXXAAXAXXMASMMMXSSMMMMMSMMSMXSXMMSAXXSMXMXXXAXAASXXAMMMASXM
|
||||||
|
MXMAMASXSXXMXSAMAMXMXAMMASMMSASAMSMSSSMXASXSAMXMASAMXAAAAAAMAMXSMMMSXXAAAASMSMSSSXSMMXSXMAXASXAXXMAMAXAXAAXXMASAMAMMSAXAMSAMMAMSAMXMMASMXMMM
|
||||||
|
MSSXSASXMAXSXSXMAMXXXAXSASAAMMMMMAXSAAMAMAAMAMXXAMMAMMMMMMMMAXXSAMAMXSXMSAMXXMXMMMXAMAMAMSMMSMSMAMSXMXSXXAMXXAMAMXAAMXMAAMASAXMMMSXASAMXAAAX
|
||||||
|
MXXXMAMAMAXSAMXSXXMXSSMMASMMXAMXSXMMSMMAXMSXMMSMSXSSXXAAXSASXSASXMXSAMXXMASMSMAXAAXMMAXAAAAXXAASMMAASAMASMXMMXSAMSMXSXMAMSAMMSSXMAXMMMSSSMMA
|
||||||
|
XMXMASMMMXMMAMXXAASXXXAMAMAMSMSMMAAMMXXXMXXAMXAAAASAMSMSSMAMAAMMXMMMXSMXSAMAXMASXSSSSSSMXSSMMSMAMMXAMAMMASAXXMXMAMXASASAXMASAXAMAMMXAMXAAASX
|
||||||
|
SAXASXAXMAASXMMMXMMAAXXMMXXMAXAAMXSMMSSSMASMMSMSMMMAMAMMMMAMAMXMAMSSXAAAMMMSMMAMAAAAAAAAAXAMAAMMXSAMSMMSAMMMSAMXSAMXMAMMXMMMXMXXAMXXMMSMSMMA
|
||||||
|
XXAXAMXMSSXMASAMASXMMMSAMSSMSSSXSAMAMXASMAMMASAXMASXMASMASASAXXSAAAMSMXMXSXMXMSSMMMMMMMMMXAASXSAAMAMXMAMAMAAMAMAMAAMMSMMASAAMSASXXSAXAXXAAXS
|
||||||
|
MMSSSMSXAXAMASASMMAMMXMAMAAAAAMXMXSAMMMMMSSMAMMMMXAXSAXMAMXSXMXAMMXXXMAXXAASXXXAMXMASXMASMMMMASAMSSMMMAXSAMXSMMSXSMSAXAMAAMMSAASAASXMAXXXMXM
|
||||||
|
SXAAAAAMSSMMAXMMMSAMMXSMMSSMMMMXSXSXMAXMXMAMMSMXMAMXMAMMMMXSAMXXXMXMASXSMMMMMSSMMXMASASMMASMMAMAMAMAAXASAXXXMASMAMSMASXMXSXXXMMMMMMXMASMAMAS
|
||||||
|
AMMSMXMAMAXMXMSAMMXMMAMMMMAMXXSMMASMSSSMASXMAMXAXSXMSXSAXSAMAMASMMMXAMXMXAMAAAAXAAMMSXMXSMMMMSXXMAMSMSSMMMSMSXMMAMAMMXMXAMXMMXXSXAXMAAAMAMAS
|
||||||
|
MXXXMAXMMAMXSXMASMSMMASAXSAMXAMAMAMMAAAXAMMMASMMXXAMAASAMMASAMAXAAAMSSMMXSSMMSMMSASASXMXSAMAAMXSMMXAMXAAXAXAXMAMSSMMMAMMSSMAAXXMAMXSMXXMXMXS
|
||||||
|
XXSASXSSMSSXMXSAMXAASASXXAMXXMSSMMSMMMMMMXASAMMMAMMMMXMMMSAMAMSSMMMSAAAASMXXMAXAAMMMMAMAXAXMMSXMASXMSSSMMXMAMAXMAMAAMXSAMAASMMSMXAAXMAXMAAAX
|
||||||
|
MMSASAAAAAXMSAMASXXMMAXMXMSASXAXAAMASXXMASMMMSSMMSSMMSAAAMASXMAAMMSMMXMMSXAXSSMMMXAAMMMAXSMSASAMAMAAXMAMSAMXSMXMAXMMSAMXSXMAAASXAMASXAAAXMMS
|
||||||
|
MAMXMMSMMMSAMXSAMAMSSSXSAAAMAMXSAMXASXXMASAAAAMAAAAAAXXMXSAMMSXMMXAAXSAMXMAMMXMAXMSSSSMMMMAMASAMASMMMXSASXSAXMASMXSAMASXMMMMMMMAMSAAMMSXSAXX
|
||||||
|
MXSXSXAXAMAXXXMAXAAXAAAAMSMMMSXMAAMXSXXMASXMMSSMMSMMMSMMMMASASAXXSXSMAMSSMMXSAMMXMAAMMASAMXMMMXMMXXMASMMMXMMMSMSAXXAMSXMAAXAXXSMMMXSXAAAMAMX
|
||||||
|
AMAXMXMSSSMSMMMSXSSMMMMMXAASXMASMMSXMMMSAMAAXXXXXMAXMAMAAXMMASAMXMMXMXMAXMAMXASAXXMXMMASMSMSMMXSMSSSSXXAMMXSAMMMXMSAMXASMMSXMXSXSXMAAMMSMMXX
|
||||||
|
MMMXSAXMAAAAAAMMAMXMXXSXSSSMASMMMAMAAAMMMSXMAMMAMSMMSSSSSSMMAMMMAAAAMAMXSMMSSMMMSSXAXMAXXMAAXXAASAAXMAXAMSAMXSXMXAMXMSAMXASXSMMMMXXMXXAMASMA
|
||||||
|
XAAAXMMMMMSMSSSMSMASMASXXXAXAMXAMAXMXMMAMAAMXAAMXSAAAXMXMAMMAXAXXMMAMSXXSAAXAXAMXMASXSMMMMSMSMXSMMSMMMMMAMXSAMAMMMSAMXSMMXXMAAAAMXSXMAXSSMAX
|
||||||
|
SMMSMXAAXMAXXXXAMXAMMAMXASXMSMSSSSSXSXSMSSXMASXSXSMMSXSMSAMSMMSAMXXSAMXASAMXMSXSAMXMAXAASXMAXXMMXSAMXASAAXASASASAAMASAMXMMMAXSMSAAMASMXMXASX
|
||||||
|
XAXMASXSMAMMSMMXMMSMMASXMMSMMAAAAAMAXMMMAXXMXXASAMXXMAMAMSMXMAXXMAMXASAMXAXXXAMMAMAMXMSASAMMMSSSSSXMMASMSMMMMAAMMSMASXSAAAAMXAMXMXXMAMAMXSMX
|
||||||
|
MAMMMMAAMXAXAAXAXAMASMAXMASMMMMSMMMMSASMMSSMAMSMSMAXMAMXAMMAMAMXXSAMXMXMXMMAMMMSAMXXXMMMSMMMXMAMAMMSMXMAMAXAAMXXXXMAMAMXSXSXMMMMMSMSASAXSAMX
|
||||||
|
MMSXMMSMMSASMSSSMASXMAAXMASMAMXXAXAAMXMAXAAXXMMAMSMSSXMMSXSAMASMMMXMXMASXXSMMSASASMSMXAAXXASXMAMAXAAMAMXXMSSXXAASMMAAAXXXAMMAMXAXAAMAMAXSASM
|
||||||
|
XMAAXAMAMXMSXAAXMXMAAMMSMSMMAMSSMMMSSMSXMXSMXMMMMAXAMXXAAAXMSASAAAAMAMXSMAMMAMASAMXAMSAMASXSASXSMSSMASXMXMAXAMXMMXSXSASAMAMXXASMSMSMSMSMSAMA
|
||||||
|
XAMMMAXAMAAMMMMMSXSMMMAXXAMMSMMAAMAMAXMAMAXAMXAAMXMSSMMMXSXXMMSMSMMXASAMMMMMASMMMMSSXXAXXMASAMMXMAXXXMASXMAXXSAMSAMXMASMSAMASXXMAAAXMXXAMXMX
|
||||||
|
MMSSXMSMMSMMASXMXASMSMXSMXXAXMXSMMAXSMSAMMXXAMXXSSMAAXMAAXMSMASAMASMMMASXMAXMXAXXXAXMXMXXXXMASAAMSSSMSXMMMMXASAXXAXXMXMXSXSMMMASMSMXSAMXMMAM
|
||||||
|
XAAMAXAMAAASASAXMXMASAXAAMMSSMAMASXMXAMASAAXSSXXAMMSMMMMXSAMMASASASASXMMASMSSSMMMMXMXXMASXMSXAAXMXAAASMAMASMAMMMMAMXSXMXMASAASAMXAAAAASAMXAM
|
||||||
|
MMMSXMAMSMMMASAMSMMXMXMMSMAAAMASAMXASMMAMMSMMAMMAMAMAAXAAMAMXAXXMASMMAAMMMAAAAXAXMASMMMAMXAAXMASXMMMMMAXMAMMMMSMASXMAXMASXMMMMASMMXMSAAXXMMS
|
||||||
|
XMXMAMXMXXMMXMAMAASAMXSXMMSSSMAMAXMMMSMXMMAAMAMSAMASAMXMSXMMMSMMMAMMSSMMSMMMMMXSASMMAAMMSMMMSXXMXMXMMMSXMAXSAAAAMXAXMMXASASXXSAMXMMXXXMSMSMS
|
||||||
|
MXAMSMAXMAMXSSXMSSMAMAAAMAAMXMSSMMSMAXSXXXSMMSXSXSXAXMAXXAASAMAAMMAAXXMAMMXMAXXMAXXSSMSMAAMSXMAMMXMSAAAXSAAMMMXXXXMMXSMMMAAAMMXMAXMAXMXAAAAX
|
||||||
|
SSMSMMSASAMXMAMMXMMSSMMSMSMMSXMAMAMMMMMMSMAAXXAMXMAXAASASXMMSSSMSSMXSMMASXSMMMSMAMMXMASMMSSMAMAMAAASMSSMMMSXSASMSMXMASAMMSMMMSMXMAMXXAXMSMSM
|
||||||
|
XASAMXMAAASXMSSSSMMXAAXAAXXMXASAMXMAAAMAAMSMMMAMMMMSSSMAAXMXXMAAAMMMMXMSAMXAAAAMMXMAMMMAMMMMSMAMSSXXMAAMXAAAMAMAAXXSASAMAAAXSAAASXSAASXMMXAA
|
||||||
|
SMMMSAMMMMAAXMAXAASXSMMMMMAMMAMXSXSSSSSSSXXXASAMAXXAXXMXMSMSSMMMMXASAAXAAASXMSMMXAMMSXMAMMAAMXAMXXMAMSMMMSSXMAMMMMXMMMAMSMSXSMXMSASAMMAASMSS
|
||||||
|
AXAASASAAMSMMMMSSMMAXAAXASAMXSMASAMXAMAAMASMMSASXSMMXSAAXAMAMXSASAMXASMSAMXXXXXSSMMMAMSMSMMMSMSMSASXMXAMAMXAMMSAAAMSXSAMMXXAMXSAMMMASXMMMAAM
|
||||||
|
MMMMXXMXXMASAXXAMAMSMSASMXSMMXAXMASMMMMMMAMXMXXMMXASASMSXSMSXMMASAXXXMAMXSMXSAXMASAMAXAMMMMSXAAAXAMMAMAMSSSXMAXXMXAAXMASXMMAMSAXMASAMXASMMMX
|
||||||
|
XMSMSSSMMSASMSMMSSMAAMMMXMAXAMMMSSXMXAMXASXMMSXMXSXMASAMAXAMXSMMMMMSSSMSAMXMMMMSAMXMMXMXAAMXMMMSMMAXMSSMXAXMXMSAMMMSAAAMAXMAMXMXSXXAMXMXAXAS
|
||||||
|
XSAAXAAAAMMMMXAXAASMSMSAASXMMMAMXMASXXSAAMAAASAMAMXMXMASXMAMAXAAAXXAAAAMMMAMAMXMASAMSASXSSSMAMMXAMAXMAAXMMMSAMAMXXMAMMAMAMSMMXXMMMSMMMMSSMAM
|
||||||
|
MSMSMSMMMSSMSMSMSXMXXAMSMSXAASMSMSAMXAMXXMXMAXAMSSSMXMXMASAMXSXMSSMMXMMMMMMMAMASXMAXAAMAMAMMAMXMAMAXMMSMASAMASMSAMSAMSXMXXAXMSSMAAAMMXAAXMAM
|
||||||
|
AMAMAXXXAAAMAAAAXXMSMMMMMSMSMSAAXMASMSMAMSMMXSAMXMAMMSMMMMMSMMMAMMMSAAAXSASXXMAMMXSXMSMAMAMMXSSXSMSXXXMMMMASAMXMAMSAMAASXSXMAAAMXSSSXMMSXSSS
|
||||||
|
MMAMXMMMMMSMMMMMMMMXAMXAASMMAMMMMMSMXMAMMAXAMXXMASAMMASAMMAMAAAXXSAMMMMXMASAMMSMMAXAMMMXSXSMSMMAMAMXMASAMSXMXSAMAMSAMSMXAMAMMSSMMMMAXMAMASMM
|
||||||
|
XSMSSSMMSAMXXXSSMMSSSMSMMSAMSMXSAMXMXMAMSSMMMAMSAXAMSASMXSASMMSMXMXXASMMSAMAMAXAMASXMAMXMMAXMAMAMAMXAMMXMXAAMSASAMSXMMAMSSMMAAMMAAXMAMMSXMAS
|
||||||
|
AXAMXXAAMAMSSXMAAAAXAAAXAMAMMMMMAMAMMMMMXXAAMAMMXXAMMAMMASAXXMAMXSSSMSAAMXMXMAXAMXSAMASAMSMMMAMXSXMMSSMASXMMMSAMMXMAMMAMAAXMMSSSSSSXSAASASAM
|
||||||
|
MMMMMSMMXAMXXASXMMXMMMMMXSMMMAASASASMSASASMMSASXSAMSMSMMXSAMSSMSAMXAMSMMSMMSMSSMSAMXSMSXMAMASASXAAAAAAMMMMSAMMAMXAXMASASMMMMSXAAAXAAMMXXAMMS
|
||||||
|
MAAAAAMMMSSMSXMXXXSMSAXXAAAASMMSASAMASASXAXASASAMSMAAAAXAMAMXAAMMSSSMSAAXAXSAXAAAMMMMAMMSXSAAMAMMMMMMSAMSASASXMAMMMSXSASMMMXAXMMSSMXMSSMAXMX
|
||||||
|
SSMSSSXSAAAAXMSAMXAXAASMMSSMSMMMMMMMMMAMMMSXSAMXMAMMMMXMMSAMXMMMAMAAASMMSSMMAMMMMXAMSMSASAMXXSAMXAMMMMASMASXMASMXSASMMAMAASMMXSAAAXSXAXMMMMM
|
||||||
|
MMAAXAAMMSMMMXSXAXMASMMMXAXXXXMAMAAMMMMMAXMAMMMXSSMSASAAMMASXMXMMSMMMMMAMAXMAXSSXMXXAAMXMXXSMMAMSASAAMSMMMMMMMMAAMAMXMSMSMSAXAMMXMMMMXXAMAAA
|
||||||
|
AMXMSMMMXAXAXAXXXAXAMAAXMASXMMSMSSSMXAMMSAMSMMMAMAASASMSMMMMAAXSMMXXAXMASMSSSSXXAMAMMSMSAMXMASAMXAXMMSXMAMXSASMMMMAMAAXAXMSAMXSAASMMAMSXSASX
|
||||||
|
XXAXAMXXSMMMMMSMSMMMSMMMMMMXMAAMMMAASAMAXXXAAAMXSMMMAMMMMASMMMMSAMASMXSASAAAXAMXAMAAMMMMAAAXMMAMMSMSMXMSMSAXAXSAMXXASAMXMASASAMMXMAMMXAAXAAM
|
||||||
|
MSMMMSXMXXMSAMAMAXMASXMAXAXXMSSSMMMMMAMMSMSSSMXASMSMXMAMSAXAAMAXAMMSMAMAMAMXMAASXSSSMAASXSMSXSSMAAAXMAMAAMMSMSAMXASXMXSASAMXMASMSSMMSMMMMXMA
|
||||||
|
MAXXAMMMAAXASXSSSMMASASMSMXSAAAAXSMXSXMXMAXMAMMASAAMXSAMMSSSMMSSXMXXMAMSMSMAAXAAAXMAXMMSXAMAMAXMSMMMMMMMMMXAXMAMXMMXMMXMASXMMXXAAMAXSAMXSAXM
|
||||||
|
SASMAMSMMSMXMMMAXXMAXMMAAASMMMSMMSMAXSMAMSMXAXMAMXAMAMXXAAMASAMAMSXSMMSAAAMMSSMMXMSAMMMMXXMASMMMMAAAXAXMASXMMSASAMXAXAMSAMSAXAMMMSSMSAMAXAMX
|
||||||
|
MASXMAAXAAMASMMAMXMSSMMMMMMAAMAXAMMMXMMASAMMAMMXSSSMXSAMMMSAMXMAMMAAASXMSMSMXMASMAMASMAMXXXAMMAAMMSMSXSAAXAAAXXXXMXAXSMSAAASMXSMAAAMSXMXSMSS
|
||||||
|
XMXAMSSSSMSASAMMXAAAAASMSMSMMSAMXSASASMMSAMSSMSSMAMMAXMXSXMXSAMMXMMMMMAMAAAMMXMSAMSAMMAMMSMSSSSXSAAXXAAMASMMMSSXSMSSXXASMXSXMAXMMSMMMMSXAAAX
|
||||||
|
MMMXMXAAMXMXXMSASMMMSMMAMAAXXMASXSASASAXMMMMAAXAMAMMMSMXSAMAXMASMMSAXXSMMSXMXSXXMAMXSSMSAAAXAAAMMMMSMXMMASAXMXMAMAAXAMAXAXXAMSMMXMXSAAXSMMMS
|
||||||
|
AXMASMMXMMSSMXXMAMXAAAMSMMMXXXAMXSXMAMMSAXSSMMMASXSXMSAAMAMXSXAAAASXSMXXXMAMSMSAMXAAXAMMXSMMMMXMASXSXMXSASMMSAMAMMMSXMSMMMXAMAAXAMASMSXMMAMA
|
||||||
|
XSMMXXMMMXAASAMXMMSSSMMAMXSAMSSXMSAMXMXMXMXXAMSXSAAAMXMASXMMMXAMMMMASMXMXMAMAAAMXSXMMXMAXMAASASMAXXXAXXMASMASAMXMAAMAMMAMASXMSMMXSAXMMAMXMXA
|
||||||
|
MSASMMXAXMSMMXMAXXAAMASXSAMAMAMMMSAMXSASAMXSXMMAMMMSXMXMAMAASASMXMMXMMAXASASMSMMAAAXXSMSSSMMSASMMXSSMMMMAMMMSAMSSMMSAMMXMMMAAAMAMMMXMSAMMSMX
|
||||||
|
ASAMXAXSSXMASMSSSMMSMAMAMMMAMASXAXXMASASASAXAMMXMSAMASXMAMXMAAXAAXSMMSSMXSASAMAMXSAMAAAMXXXAMAMAAAXXSASMAMXAMAMAAAASMSMSMSSMSMMMSAMAAXAMXAAM
|
||||||
|
XMAMMSMAAMSAMAAAAXXXMAMMMXSXSASMMSXSAMXMAMXMMMAAAMAXAMXMASMXMAMSXMSAMAAAMMXMMSAMAXAMXMXMASMMMSSMMMSASXSSXSAXSMMSSMMMXAMXAMAXMAMMSASXSMMSSMSX
|
||||||
|
MSAMAAMMMMMSSSMSMMMMSXSAMAAAMASAAAMMXSSSSXSXMAXMSSSMSSXMMSAASXMMMXSSMMMMSAAXAMMSMXXMAMXMMSAMXXAXAXMXMAXAMMMMXMMAMMXSSMSMMMMXMAMXMXMAAAXAAMAX
|
||||||
|
XSAMSXSAXSAAXAAXXSAAXASMSSSXMASMMSMXMAXAAAMASMSMAAMAMXMXMSMMXAAMXAMXSXAAXXMSMSMXMAMXASXMASMMMMMMMMMAMSMMMAMSAXMXXSAMMAXMXSXSXXXAXMMSSMMSSMAS
|
||||||
|
ASAMXXXASMMXSXMMASAMSAMXAMAXMASMAAASMMMMMMMAMAAMMMMAMMMSMMXXSSMAMMSAMSMSMMMXXAMAMAMSAMAMASXMAAXAXXXAXASMMAMMXXMXMMASMMXMASXSAXSMSAMAMAAXXMAS
|
||||||
|
MMXXXMSMMAAMMXXMAMAXMMMMSSMSMMSMMXAXAAAXAAMASXSMXSSSMSAXAXSAXASAAXMAXXMAMAMXSAXAXAMXAMXMASAMSXSAASMMSAMSMSMMSSXMASAMAXAMAXAMXMAAXAMXMSMMAMAS
|
||||||
|
XAXSMAAMMXMAAASMXSAMXSAMXAXSAMXMAXSSMSAMMXMMXAAAAAAXAMMSXMMMSAMMSAXMMXXAXMSAMMSSSSMSSMXSASMXAAMXMXAAMMMSMXAMXAASXMMSAAXMMSXSASMMMSXMAMASXMAS
|
||||||
|
MMSMASMXXAXMXMXAAXASASASXSMSAMAMMSMAXMASMSSSMSMMMSMMSMXXMAAAAXXAAAASASXSSMMASAAAAAAXMAXMASXMMMMAXMMMMXXMASXMMSMMAMMXMASMXAMMASMMMAASASAMXMAX
|
||||||
|
MXAXMAMXSMSAMXMMMSMMASAMXXAXAMXAMMXMMMMAAAAXMAMXXXXAAMXSAXASMSASMXMMASMMAMSAMXSMXMMMASXMAMMXAASXSXAXMXXMXMXSXAXSXMAAXMAMMXSMAMAAMMAMAMXMXMMM
|
||||||
|
SSSSXSXMAAAMAAMAXXAMAMMMMMAMSMSSSMASASASMMMMSMSSXAMSSSMMSXAAAXMAMAXMAMASAMXXMAXXXSSSMAMSXSAMSXMAMXMMSMASAXXXXMMMMSSSSMAMXSXMASMMSXAMXMAMAAAA
|
||||||
|
XAXMAMSAMXMSSXSAXXMMXSMMASAMAAAXAXMSASAXMSSMSXAMAMXMAMAAXMMMXMXXXMMMMAMXXMASMASXAMAAXMMMAMXXMAMXMMSAAAMSASXSMSAAAMAAXXASXMAMAAAXMMMMAMAMXXAS
|
||||||
|
MAMAASAMXSXAMAMXSMMAXAASASAXXMMXSMMMMMXMASAASMAXAMXXAMSMMAXAMSMSASMSMSXSAMXXMASXMMXMMXAMAXMXMAAXMAMMXSAMAMXSASMMSSMSMSMSAMAMSSMASXMSSSSSMSAA
|
||||||
|
MXASXSASAXMASMAMAAMMSSMMXSMMSASXAMSSSMSAXSMMMSASMXSMXXAASAMXSAAMAMAAAAXAMXSXMXSASXSSXSASAMXMSASMMSSMSXMMAMXMAMAXAAXMASAMXSMMAAAAAAAAXAAAAXAM
|
||||||
|
MXMMASAMXMAXAAAAXXMAAAMMMXMASAMSMMAAAAMSXMXXAMXXAASAMSSMMSMXMMSMSMXMMMSXMASMMAMAMAAXMMAMXAMXMSAAXMAMSAXSXSASASAMSSMSSXAXAAXMSMMMSMMMSMMMMXAX
|
||||||
|
XMMMMMMMAASAMSSSSMMMSXXXXXMXMAMMXMMSMMMMMMAMXSSMMMMAMMAMAAXXMXAXMASXXAAAMAMAMXMSMMMMXAAMXSAMXMXSMSSMSXMXMSMSAMMXXMAXMMMMMSSXXXMAXXXXAXMMSSMM
|
||||||
|
MAXSSXMSXSMMXMAAAXXXMMSMSMXXSAMXXMXMAXXAAMXSAAMMXXMSMMAMMSMMSMSMSMAMMMSXMSMSAMXXAXMSSMXSAMXMXSAMXMXAMMXAMMAMMMSXXMSMSMMAXAXAMXMMSMMXMMMAAAAX
|
||||||
|
ASMXSAAXMXMASMMSMMXMAXAAMSAXMXMASXMXMASMMSAMMSMMXSXXASMMXAXMAAAAAAAXAXMMMXAAMMMSMMSAMAMMXMAXAMMXXMMSMMSSSMAMAXXAXXAAXMASXXMSMXSAAAASMSMMSSSM
|
||||||
|
MXMMSMMSXSMAMSAXAMXMSSMMMXXSMAMAMAMSSMSAAMXMMMAMASMAMMAASAXMAXMSMSMSMXMAAMXMMAXAAXMAMSMAAMMMMSSMSMAAAXSAMXMMAMXMMSMSMMAXAMXAXAMSSSMMAAMAMAMA
|
||||||
|
ASAMXMASMMMSSMSSSSSMAAMSMMMAMAMAMAMMAXXMXMMMAXXMAMMAMAXMMASXSMAXAAAAASXSMSMSSXSMSXSXMAMSMSASAAAXXMSSSMMAMXXMMSAXMXXAAMXSAMXMMMMMXAMMXMMMMMMA
|
||||||
|
XSAMAMAXAXMMAAASAAAMSSMAAAAMSAXSXSMXMSMSAMSSMXAMXSMXMXSMXXMAMXAMSMSMSMAAXMAMXAXXMASMSXMAXMAMMSMSAMAAMASXMASXMSASXMMSSMMAMMAXAAAMSMMSMMMXASXS
|
||||||
|
ASAMXMAXSMMSMMMMMSMMMAXSSMMXMAXXAMSMXAMXASXAAASXAMASXMMAXMAMXAXAXMXXMMSMMMMMXXSSMMMXMXAMMMSMMAXSAMMSMXAMMAXMAMAMXAAAAAXXMSXMXXXXAMXAAXASXSAM
|
||||||
|
XSAMXMMMMAXSXSSXXAMAMXAMXAASMMSMAMASMASXMMXMMMXAMMAMAASMXXMMXSSSXMMXMAMXMSAMXXMAMSXMAMXAMMXASMXSAMXXMMMAMASXXMMMSMMSSSMMASXSASXMSAMMSMMXMMAM
|
||||||
|
MSAMMAMASXMXAAMXMSMMSMMSMSMSAAXMXMAMXAMXMAMXAXAMXMSSSMMMMSMMAMAMAAAAMXSAASASMXSAMMAMAASXSMSMMXMSXMXXAAXXSASMASMAMAMAMXAXAXAMASMAAMAMMXMAAMXM
|
||||||
|
ASMMAXSASAMMSMMSMASAAXXAAAASMMMSMMMSAMXAMASMMMMMXSAMXMAXAAAMXSMSXMSXXAMXMMXAAXAASAMXMXMAAASMSMMMAMASMMSXMAMMAMMAMMMSMMSMMSMMAMMSMXSXMASXMXAX
|
||||||
|
XXMASXMXSAMMAXAAXMASMSAMXMXMASXMAXAXAMSSXXXAMASAMXMXASMMSSSMAMXMMMAAMSAMXMSSSMMXMAMXSAMXMAMAXXASAMXXAAMAMAMMXSXMXSAMAAXMXSXAMXAXXAMMSMMAMSXM
|
||||||
|
AAXXAMMASXSSMMSSXSAAXMAXXXAAXMASAMSSSMAMMSSXMASAASXMXSAAAMAMSMAMAMMXMAAAXAAAXMXSSMMASASAMSMXMSXSMXSXMMMXMAMMMSAAXMASMMXSAMASXMASMXXMAMMAXMAM
|
||||||
|
SXMASAMASAMAAAAAAMSMSAMXSSMXSXXMAMMAMMXMAMAXMMSMMSAXMSMMMSXMAAMMSSXASXMMMMXSMMAAAAMMSAMXSXSAASAMMASMAAXXMXSAAXMMMMMMAMSMMSAMAMSXMAXSMXSMXMAA
|
||||||
|
XMAAAXMASMSSMMMMMMMXSAMXAXMASMSSSMMAMSMMSSMXXMXMXSAMAMXMASASMMXAAMXXMAAXXMAMAMXSSMMMMMMXMASMAMAMMASASMSMSASMSSXMASASAMAAAMASXMXAMSXMXXAMXSXM
|
||||||
|
MAMXXXSXSXMMXAMASXMASAMXMXSAXAMAAXMAMMMAMAXSMMMMMMSAMXAXMXXAXAMSSSSSSSMMAMAMSMMXMASAAAMAMXMMASAMMMSAXAXXMAMAAXMXMSASXSMMMSAMXSMMMXAMASASMMSM
|
||||||
|
ASMMSASAMMMMSXSASAXXXMAXXMMAMSMSMSSSMSMSXMMMAAXMAAAMMXMSMSMMMMMAAMAXAXMSASXSAMMASXMMSMSMSMXSASASXXMAMXMMMSMMMSSMMMXMAXXAXMASAXXXAMAMXSAMMAAX
|
||||||
|
MXAASAMAMAAXMXMASMMMSAMXMSSSMAMMAMAMASAMASMSSMSSMXMMSAAXAASAAMMMSMMMASXMASXAAXMASAXAMXAAMAXMMSAMXAMMMASAAXASAMXASXSMSMSMSSMMMMXMSSSMXMAMMSSX
|
||||||
|
XSMMMASMMSSXSAMXMAAMASXXMAAASXMMSMAMMMASAMXAASAXXXSASMMMSMSMSSXXAMXMXMASXMASMMMASXMASXMMMXSAAMAMSMAAAASMXSAMSSSMMASAAAAMMAXMAMXAXAAMAMAMXAXX
|
||||||
|
AXXXSXMAXXMXSSSMSSMSXMSSMMSMMMXXXAMXSMXMXMMSSMSMSAMXSAMXXXXMMMMAMXXXSSXMXSAMXXMXMXAXXMASXMSMMSMMSXSAMMSXMMMSXMAXMAMXMSMXSAMSXSXSMSMMXSASMASX
|
||||||
134
2024/gareth/day05/day05.go
Normal file
134
2024/gareth/day05/day05.go
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
package day05
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Rule struct {
|
||||||
|
X, Y int
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseInput(input string) ([]Rule, [][]int) {
|
||||||
|
sections := strings.Split(input, "\n\n")
|
||||||
|
|
||||||
|
ruleLines := strings.Split(strings.TrimSpace(sections[0]), "\n")
|
||||||
|
var rules []Rule
|
||||||
|
for _, ruleLine := range ruleLines {
|
||||||
|
parts := strings.Split(ruleLine, "|")
|
||||||
|
x, _ := strconv.Atoi(parts[0])
|
||||||
|
y, _ := strconv.Atoi(parts[1])
|
||||||
|
rules = append(rules, Rule{X: x, Y: y})
|
||||||
|
}
|
||||||
|
|
||||||
|
updateLines := strings.Split(strings.TrimSpace(sections[1]), "\n")
|
||||||
|
var updates [][]int
|
||||||
|
for _, updateLine := range updateLines {
|
||||||
|
parts := strings.Split(updateLine, ",")
|
||||||
|
var update []int
|
||||||
|
for _, part := range parts {
|
||||||
|
page, _ := strconv.Atoi(part)
|
||||||
|
update = append(update, page)
|
||||||
|
}
|
||||||
|
updates = append(updates, update)
|
||||||
|
}
|
||||||
|
|
||||||
|
return rules, updates
|
||||||
|
}
|
||||||
|
|
||||||
|
func ValidateUpdate(update []int, rules []Rule) bool {
|
||||||
|
indexMap := make(map[int]int)
|
||||||
|
for i, page := range update {
|
||||||
|
indexMap[page] = i
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, rule := range rules {
|
||||||
|
pageX, indexX := indexMap[rule.X]
|
||||||
|
pageY, indexY := indexMap[rule.Y]
|
||||||
|
if indexX && indexY && pageX > pageY {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func FindMiddle(update []int) int {
|
||||||
|
n := len(update)
|
||||||
|
return update[n/2]
|
||||||
|
}
|
||||||
|
|
||||||
|
func SortUpdate(update []int, rules []Rule) []int {
|
||||||
|
depen := make(map[int][]int)
|
||||||
|
for _, rule := range rules {
|
||||||
|
depen[rule.Y] = append(depen[rule.Y], rule.X)
|
||||||
|
}
|
||||||
|
|
||||||
|
visited := make(map[int]bool)
|
||||||
|
var sorted []int
|
||||||
|
|
||||||
|
for _, page := range update {
|
||||||
|
if !visited[page] {
|
||||||
|
sorted = Visit(page, depen, visited, update, sorted)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sorted
|
||||||
|
}
|
||||||
|
|
||||||
|
func Visit(page int, depen map[int][]int, visited map[int]bool, update []int, sorted []int) []int {
|
||||||
|
if visited[page] {
|
||||||
|
return sorted
|
||||||
|
}
|
||||||
|
visited[page] = true
|
||||||
|
|
||||||
|
for _, d := range depen[page] {
|
||||||
|
if contains(update, d) {
|
||||||
|
sorted = Visit(d, depen, visited, update, sorted)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sorted = append(sorted, page)
|
||||||
|
return sorted
|
||||||
|
}
|
||||||
|
|
||||||
|
func contains(slice []int, element int) bool {
|
||||||
|
for _, item := range slice {
|
||||||
|
if item == element {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
rules, updates := ParseInput(input)
|
||||||
|
total := 0
|
||||||
|
|
||||||
|
for _, update := range updates {
|
||||||
|
if ValidateUpdate(update, rules) {
|
||||||
|
total += FindMiddle(update)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
rules, updates := ParseInput(input)
|
||||||
|
var invalidUpdates [][]int
|
||||||
|
total := 0
|
||||||
|
|
||||||
|
for _, update := range updates {
|
||||||
|
if !ValidateUpdate(update, rules) {
|
||||||
|
invalidUpdates = append(invalidUpdates, update)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, update := range invalidUpdates {
|
||||||
|
sortedUpdate := SortUpdate(update, rules)
|
||||||
|
total += FindMiddle(sortedUpdate)
|
||||||
|
}
|
||||||
|
|
||||||
|
return total
|
||||||
|
}
|
||||||
71
2024/gareth/day05/day05_test.go
Normal file
71
2024/gareth/day05/day05_test.go
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
package day05
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`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`)
|
||||||
|
assert.Equal(t, 143, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`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`)
|
||||||
|
assert.Equal(t, 123, r)
|
||||||
|
}
|
||||||
1377
2024/gareth/day05/input.txt
Normal file
1377
2024/gareth/day05/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
142
2024/gareth/day06/day06.go
Normal file
142
2024/gareth/day06/day06.go
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
package day06
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Point struct {
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
direction int
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
Up = 0
|
||||||
|
Right = 1
|
||||||
|
Down = 2
|
||||||
|
Left = 3
|
||||||
|
)
|
||||||
|
|
||||||
|
var rows, cols int
|
||||||
|
|
||||||
|
var moves = []Point{
|
||||||
|
{-1, 0, Up},
|
||||||
|
{0, 1, Up},
|
||||||
|
{1, 0, Up},
|
||||||
|
{0, -1, Up},
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
grid, start, direction := ParseInput(input)
|
||||||
|
total := PredictPath(grid, start, direction)
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
grid, start, direction := ParseInput(input)
|
||||||
|
total := FindLoopingPositions(grid, start, direction)
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseInput(input string) ([][]rune, Point, int) {
|
||||||
|
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||||
|
rows = len(lines)
|
||||||
|
cols = len(lines[0])
|
||||||
|
grid := make([][]rune, rows)
|
||||||
|
|
||||||
|
var start Point
|
||||||
|
var direction int
|
||||||
|
|
||||||
|
for i := 0; i < rows; i++ {
|
||||||
|
grid[i] = []rune(lines[i])
|
||||||
|
for j, char := range lines[i] {
|
||||||
|
if char == '^' {
|
||||||
|
start = Point{i, j, Up}
|
||||||
|
direction = Up
|
||||||
|
} else if char == '>' {
|
||||||
|
start = Point{i, j, Right}
|
||||||
|
direction = Right
|
||||||
|
} else if char == 'v' {
|
||||||
|
start = Point{i, j, Down}
|
||||||
|
direction = Down
|
||||||
|
} else if char == '<' {
|
||||||
|
start = Point{i, j, Left}
|
||||||
|
direction = Left
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return grid, start, direction
|
||||||
|
}
|
||||||
|
|
||||||
|
func PredictPath(grid [][]rune, start Point, direction int) int {
|
||||||
|
visited := make(map[Point]bool)
|
||||||
|
current := start
|
||||||
|
|
||||||
|
visited[current] = true
|
||||||
|
|
||||||
|
// do while
|
||||||
|
for {
|
||||||
|
next := Point{current.x + moves[direction].x, current.y + moves[direction].y, Up}
|
||||||
|
|
||||||
|
if next.x < 0 || next.x >= rows || next.y < 0 || next.y >= cols {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
if grid[next.x][next.y] == '#' {
|
||||||
|
direction = (direction + 1) % 4
|
||||||
|
} else {
|
||||||
|
current = next
|
||||||
|
visited[current] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return len(visited)
|
||||||
|
}
|
||||||
|
|
||||||
|
func FindLoopingPositions(grid [][]rune, start Point, direction int) int {
|
||||||
|
possiblePositions := 0
|
||||||
|
|
||||||
|
for i := 0; i < rows; i++ {
|
||||||
|
for j := 0; j < cols; j++ {
|
||||||
|
if grid[i][j] != '.' || (i == start.x && j == start.y) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
grid[i][j] = '#'
|
||||||
|
if IsLooping(grid, start, direction) {
|
||||||
|
possiblePositions++
|
||||||
|
}
|
||||||
|
grid[i][j] = '.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return possiblePositions
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsLooping(grid [][]rune, start Point, direction int) bool {
|
||||||
|
visited := make(map[Point]int)
|
||||||
|
current := start
|
||||||
|
|
||||||
|
step := 0
|
||||||
|
for {
|
||||||
|
step++
|
||||||
|
next := Point{current.x + moves[direction].x, current.y + moves[direction].y, direction}
|
||||||
|
|
||||||
|
if next.x < 0 || next.x >= rows || next.y < 0 || next.y >= cols {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if grid[next.x][next.y] == '#' {
|
||||||
|
direction = (direction + 1) % 4
|
||||||
|
} else {
|
||||||
|
current = next
|
||||||
|
|
||||||
|
if visitStep, ok := visited[current]; ok && step-visitStep > 4 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
visited[current] = step
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
35
2024/gareth/day06/day06_test.go
Normal file
35
2024/gareth/day06/day06_test.go
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package day06
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`....#.....
|
||||||
|
.........#
|
||||||
|
..........
|
||||||
|
..#.......
|
||||||
|
.......#..
|
||||||
|
..........
|
||||||
|
.#..^.....
|
||||||
|
........#.
|
||||||
|
#.........
|
||||||
|
......#...`)
|
||||||
|
assert.Equal(t, 41, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`....#.....
|
||||||
|
.........#
|
||||||
|
..........
|
||||||
|
..#.......
|
||||||
|
.......#..
|
||||||
|
..........
|
||||||
|
.#..^.....
|
||||||
|
........#.
|
||||||
|
#.........
|
||||||
|
......#...`)
|
||||||
|
assert.Equal(t, 6, r)
|
||||||
|
}
|
||||||
130
2024/gareth/day06/input.txt
Normal file
130
2024/gareth/day06/input.txt
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
#.............#.#...........................................................#..........#...........................#..........#...
|
||||||
|
............#......................#.......#..#.........#...................##....................................................
|
||||||
|
..............#...........#..#.......#.........#.#...........................#................................#......#............
|
||||||
|
.....#......................................#......#..#...................#....................#......................#...........
|
||||||
|
...#............................#................................#................................................................
|
||||||
|
..........#..................#.....#......................................................#.......................................
|
||||||
|
..#........#.......#.#...............................................................#......#.................................#...
|
||||||
|
.#....#................#................#.....#...................#...............................................#..#............
|
||||||
|
.......................................................................................#...#.#....#........##......#........#.#.##
|
||||||
|
............................................#.................#.....................#..........................#..................
|
||||||
|
....#..........##......................#.................................................................................#........
|
||||||
|
......#.............##.........#.......#.........#.......#.............#...#.......#..............................................
|
||||||
|
.#............................................................................#..........#....#...................................
|
||||||
|
...#..#....#..............................#...........................................................................#...........
|
||||||
|
.............#....................................................................................................................
|
||||||
|
................................#..................##...................................#...............................#......#..
|
||||||
|
..........#.........#.................#..........###...........................................#............#...#.................
|
||||||
|
.............#....................................#.......#.#.#............#............................................#.........
|
||||||
|
......#.#..............................................................................................#.........................#
|
||||||
|
...#...#.........#.........#..#......#................##.................#........................................................
|
||||||
|
.................................#......................#........#................#........................#......................
|
||||||
|
.......................##..............#................#................#..............................#.........................
|
||||||
|
.......#...#.....#.....##........................#..................##.....#......................................................
|
||||||
|
.............................................#...........................#..........................................#.....#.......
|
||||||
|
.........................#...............#....#..............#.......#...............#.#.................#.................#......
|
||||||
|
...........................................................#....#..................................#..............................
|
||||||
|
..........................#.................................................#............................##....#..................
|
||||||
|
.................#...#.........................................................#........................#.....#..#................
|
||||||
|
.........................#....#................................................#...#.....................#....#...........#.......
|
||||||
|
................................................##.......#.#....................................#.......##........................
|
||||||
|
..........##...#.......................#....#..#....................#........................#....................................
|
||||||
|
#......#.......................#............#.....................................................................#...............
|
||||||
|
.......#.......#...#..#..........#.......................................#.............#......#...................................
|
||||||
|
...............#............#..................#.................................................................................#
|
||||||
|
.......#...........#.......................##.....#.........#...........#...................#......#.........#.............##....#
|
||||||
|
...................#.........................#......#..........................................#..........#.........#......#......
|
||||||
|
.....#............#..............#...#......#....................#.............#..................................................
|
||||||
|
................................................#........#.....#...................#.....................................#.....#..
|
||||||
|
......................#.#...##......................##...............................................#.................#..........
|
||||||
|
#...................#.........................#...........#.....#................#.....................#...................#......
|
||||||
|
....#................#.....#.............#.....................................#....#...#.................................#.......
|
||||||
|
.........#.....................................................................................................#.#.......#........
|
||||||
|
.........#..........##..............................#............................#.#.............................#................
|
||||||
|
#....#.#..............................................##...#...#...............#.............#....................................
|
||||||
|
........#..#.#...................#.......................................................................#.............#..#.#...#.
|
||||||
|
.................................................................................................................#.......#........
|
||||||
|
............................................#..#...............##........#..........#.......................................#....#
|
||||||
|
........#...........................#............................#.....#........................#..........#...#..........#.......
|
||||||
|
.#...........#...................................................#...........................................#................#.#.
|
||||||
|
............#...............................#........#...........#..........#...........#.#..............#........................
|
||||||
|
...............................................................................##.#................#..............................
|
||||||
|
.#.......................#.#...........#..................................#.......................................................
|
||||||
|
..#..............................................##................#.......#....#..............#.....................#...#........
|
||||||
|
...................#.....#................................................#..........#.........#.........#.....................#..
|
||||||
|
........#................#................................................................................#......#................
|
||||||
|
...................#...#....#.........................#.........................#....................#..........................#.
|
||||||
|
.................#.......................................................#................................................#.......
|
||||||
|
..#...........................##.#.............#..#............................................#.......................#.#........
|
||||||
|
..#......#.........................................................................#.......................#......................
|
||||||
|
...........................................................................................................#............#......#..
|
||||||
|
............................................................^..........................................#..........#...............
|
||||||
|
..#.........#....................#..........................................#........#.........................................#..
|
||||||
|
........#...............#....#.............#......#.........................................................................#.....
|
||||||
|
.........#......#.....#..............#...........................................................#..............#.................
|
||||||
|
.........#...................................................#...###...........#.......#.##.......................................
|
||||||
|
.....................##.................#.........##.....................#................#................#.........#............
|
||||||
|
.......................................................................#..............#..............#.................#..........
|
||||||
|
.##.........#..........................................................................#....................................#.....
|
||||||
|
.........................#.............................#........................................................................#.
|
||||||
|
........#.............................................#......#....#.....................................#....................#....
|
||||||
|
........#...#..............................................................................#.........#............................
|
||||||
|
..............................#................................#..........#..............#..................................#.....
|
||||||
|
........##..#...................................#................................#.................#.........#......#..#........#.
|
||||||
|
..................#......#...................................................................#....................................
|
||||||
|
..........#.............#..............#........#............#...............#..#..........#..............#.#...#............#....
|
||||||
|
............................##....#..............#......................................................................#.........
|
||||||
|
...............................................#.....#...........#.....##...............#..#......................................
|
||||||
|
.........................#.......#...............................#...........#.........#...........#....#.........................
|
||||||
|
.#............#...#...............#..............................................................#..........................#....#
|
||||||
|
#...........#......................................................#.............................#......#.........................
|
||||||
|
..................................................#....#...............#.........................#................................
|
||||||
|
................................................#..........................#.......#..............................#....##.......#.
|
||||||
|
........#......#..#............#................#............................#......#.##.........#....................#..#........
|
||||||
|
.......................................................#..#.#....................#..#......................................#......
|
||||||
|
.....................#.......................................................................#............#.......................
|
||||||
|
.....................##........................#...................#.....................#........................................
|
||||||
|
..........................#...........................................................................................#...........
|
||||||
|
..#..........#...................#..............##..#.....................#...................#..............#...........#........
|
||||||
|
#................................#....##......#.............#..............#.......................#.........#...........#........
|
||||||
|
..................#................#...............................#.....#..........#................#..............#.............
|
||||||
|
................#.#.........#.....##...............................................................#..............#...............
|
||||||
|
..#...............................................................................................#...............................
|
||||||
|
..........#.................#...........#.......#.........................#...#.......#...........................................
|
||||||
|
..##....#......................................#.#.......................................#.................#......................
|
||||||
|
.......................#..#...#.##......................................................................#.........#...#...........
|
||||||
|
...............#.........#..............#.....................................................#...................#...............
|
||||||
|
......#.................#............#......#...................#..#.........................#........................#........#..
|
||||||
|
......................................................................#...........................#........#......................
|
||||||
|
..........#..........#........................#.............##....................................................................
|
||||||
|
....#................................................#.......................#................#...............#...................
|
||||||
|
.................#....................................................#......#....................................................
|
||||||
|
.#........#.......................................................................................................................
|
||||||
|
......##..................#....#......#.................#....................#.....................#..#...........#...............
|
||||||
|
#...#...#...#..............#........#.......................#.#..........#...............................#......#.................
|
||||||
|
#...#...................#.............#........#..........#...............................................................#...#...
|
||||||
|
..#................................#...#.........................#...................#......#.....................................
|
||||||
|
...#...###..........#............#...............................................................#..........#.....................
|
||||||
|
............#..............#.......#.....#..........#.....#.........................................................#............#
|
||||||
|
..#......................#..#...#................................#......#.......#.....#..................#.........#..............
|
||||||
|
....##......#.......................................................#..............................................#..............
|
||||||
|
...............................#.....#....#.................................................#.......#............#................
|
||||||
|
..........#....#......................#........#..........................#......#................................................
|
||||||
|
......#.............................#...........#..................#...........................#................................#.
|
||||||
|
...........................##..........................................#.....#.#.....................#................#...........
|
||||||
|
..#..............#.........................................................#........................#.........#.................#.
|
||||||
|
#.....#.....#......................#....................#........................................#...........#...........#......#.
|
||||||
|
.......................................#..#................................#.........#.......#..#.....#..........................#
|
||||||
|
..........#..............##...............#..........................................................#......#......#......#....#..
|
||||||
|
.............#..............#..#......#........#..#......##.......................#...........#.......#...........................
|
||||||
|
......................#.......................................#.......#..#.....................................#.........#...##...
|
||||||
|
...........................#...........................#......#....#.............................#.............................#..
|
||||||
|
..................#............................#....#........##.........................#..............#.............#............
|
||||||
|
.......#....................#.....#........#.......#.#...#...............#.....#.#.........................#.......#.#............
|
||||||
|
.....#.........#.......#..........#.................#..#...#..................................................##..................
|
||||||
|
................#........................................................#........................................................
|
||||||
|
....##......#........#..................#.........................#...................................#...#...................#...
|
||||||
|
..............#....................#.......#.......................#.............#......#..............#..........................
|
||||||
|
...........................#..............#.....#............#.....................#........#....#.......................#........
|
||||||
|
........#..##................#.....#.#..............#..............................#........................#.........#...........
|
||||||
|
.........................................................#...........................##..........#........#.##....................
|
||||||
90
2024/gareth/day07/day07.go
Normal file
90
2024/gareth/day07/day07.go
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
package day07
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
total := 0
|
||||||
|
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||||
|
|
||||||
|
for i := 0; i < len(lines); i++ {
|
||||||
|
target, numbers := parseLine(lines[i])
|
||||||
|
if validLinePart1(numbers, 1, numbers[0], target) {
|
||||||
|
total += target
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
total := 0
|
||||||
|
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||||
|
|
||||||
|
for i := 0; i < len(lines); i++ {
|
||||||
|
target, numbers := parseLine(lines[i])
|
||||||
|
if validLinePart2(numbers, 1, numbers[0], target) {
|
||||||
|
total += target
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseLine(line string) (int, []int) {
|
||||||
|
parts := strings.Split(line, ":")
|
||||||
|
target, _ := strconv.Atoi(strings.TrimSpace(parts[0]))
|
||||||
|
numberStrings := strings.Fields(parts[1])
|
||||||
|
|
||||||
|
numbers := make([]int, len(numberStrings))
|
||||||
|
for i := 0; i < len(numberStrings); i++ {
|
||||||
|
numbers[i], _ = strconv.Atoi(strings.TrimSpace(numberStrings[i]))
|
||||||
|
}
|
||||||
|
|
||||||
|
return target, numbers
|
||||||
|
}
|
||||||
|
|
||||||
|
func validLinePart1(numbers []int, index int, currentValue int, target int) bool {
|
||||||
|
if index == len(numbers) {
|
||||||
|
return currentValue == target
|
||||||
|
}
|
||||||
|
|
||||||
|
sum := currentValue + numbers[index]
|
||||||
|
if validLinePart1(numbers, index+1, sum, target) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
product := currentValue * numbers[index]
|
||||||
|
if validLinePart1(numbers, index+1, product, target) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func validLinePart2(numbers []int, index int, currentValue int, target int) bool {
|
||||||
|
if index == len(numbers) {
|
||||||
|
return currentValue == target
|
||||||
|
}
|
||||||
|
|
||||||
|
sum := currentValue + numbers[index]
|
||||||
|
if validLinePart2(numbers, index+1, sum, target) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
product := currentValue * numbers[index]
|
||||||
|
if validLinePart2(numbers, index+1, product, target) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Turns 12 || 34 into 1234
|
||||||
|
concatenated, _ := strconv.Atoi(strings.TrimSpace(fmt.Sprintf("%d%d", currentValue, numbers[index])))
|
||||||
|
if validLinePart2(numbers, index+1, concatenated, target) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
33
2024/gareth/day07/day07_test.go
Normal file
33
2024/gareth/day07/day07_test.go
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
package day07
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`190: 10 19
|
||||||
|
3267: 81 40 27
|
||||||
|
83: 17 5
|
||||||
|
156: 15 6
|
||||||
|
7290: 6 8 6 15
|
||||||
|
161011: 16 10 13
|
||||||
|
192: 17 8 14
|
||||||
|
21037: 9 7 18 13
|
||||||
|
292: 11 6 16 20`)
|
||||||
|
assert.Equal(t, 3749, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`190: 10 19
|
||||||
|
3267: 81 40 27
|
||||||
|
83: 17 5
|
||||||
|
156: 15 6
|
||||||
|
7290: 6 8 6 15
|
||||||
|
161011: 16 10 13
|
||||||
|
192: 17 8 14
|
||||||
|
21037: 9 7 18 13
|
||||||
|
292: 11 6 16 20`)
|
||||||
|
assert.Equal(t, 11387, r)
|
||||||
|
}
|
||||||
850
2024/gareth/day07/input.txt
Normal file
850
2024/gareth/day07/input.txt
Normal file
@@ -0,0 +1,850 @@
|
|||||||
|
31084: 8 67 8 735 38
|
||||||
|
40541461584: 5 81 9 4 32 43 283 228
|
||||||
|
6208: 915 6 2 539 148 29
|
||||||
|
306501986: 6 3 630 45 536 64 6
|
||||||
|
21276000: 8 5 5 91 6 5 8 6 8 985 2 8
|
||||||
|
1432991: 3 403 4 821 591 2 236
|
||||||
|
17115994: 69 321 254 764 3 99
|
||||||
|
19961295: 5 311 84 6 63
|
||||||
|
22953531: 22 95 35 2 8
|
||||||
|
18894343830: 90 5 3 2 65 7 159 2 91 1
|
||||||
|
4312695565: 158 8 716 615 95 59
|
||||||
|
391: 1 326 64
|
||||||
|
25202: 8 5 62 1 401
|
||||||
|
5324514: 6 8 466 59 169
|
||||||
|
658234: 3 83 592 97 57 4
|
||||||
|
26804472776473: 7 61 1 447 29 496 71 9
|
||||||
|
1503368: 653 23 18 824 625
|
||||||
|
24803314445: 5 2 4 4 417 1 987 4 447
|
||||||
|
1021069871: 7 3 2 7 9 37 2 2 8 5 58
|
||||||
|
1614: 63 645 4 3 31 868
|
||||||
|
4258805: 68 532 78 91 5
|
||||||
|
4495130022: 583 78 275 37 77
|
||||||
|
45111648: 47 98 45 855 998 46 6
|
||||||
|
2964501691711: 9 672 76 9 754 7 4 65
|
||||||
|
90685578359: 906 855 782 33 126
|
||||||
|
13608006: 3 5 7 7 3 602 7 4 7 720 6
|
||||||
|
4645623: 66 863 5 615 8
|
||||||
|
2569495: 443 74 7 71 5
|
||||||
|
134484: 68 55 4 77 9 2 327 4
|
||||||
|
1143450000: 24 750 35 264 5 1
|
||||||
|
5449: 4 2 907 7
|
||||||
|
23061783: 854 9 5 6 1 1 7 3 2 76 5
|
||||||
|
2930: 18 6 7 555 5
|
||||||
|
2115475: 9 194 8 54 42 5 31
|
||||||
|
19449: 6 1 9 4 4 769 8 1 79 905
|
||||||
|
4595553: 298 3 4 257 5 3 345 45
|
||||||
|
208314087: 7 3 877 815 9 9 3 2 6 51
|
||||||
|
2905504: 46 58 514 626 763
|
||||||
|
963368: 48 425 484 6 370
|
||||||
|
9980664: 1 98 80 5 98 68
|
||||||
|
652568: 7 197 871 290 68
|
||||||
|
45827: 15 3 665 9 154
|
||||||
|
722: 2 21 337 5 357
|
||||||
|
27652464029930: 7 829 9 700 7 9 3 7 4 1 8
|
||||||
|
6868809: 45 2 9 848 9
|
||||||
|
1175: 7 5 98
|
||||||
|
2133: 17 2 5 36 5
|
||||||
|
528: 55 1 5 8 9 31
|
||||||
|
8206806: 1 4 9 4 99 6 24 97 2 5 6 5
|
||||||
|
37530658373: 1 2 8 5 8 4 5 7 3 946 373
|
||||||
|
65484738025: 47 5 4 43 8 6 43 7 7 26 5
|
||||||
|
2157: 8 2 1 93 8 568
|
||||||
|
23082508: 7 5 3 3 2 5 8 477 2 3 1 1
|
||||||
|
29090880: 45 28 37 8 78
|
||||||
|
1262763: 1 1 27 729 93 16 2 75
|
||||||
|
1409848204234: 7 87 622 84 820 42 34
|
||||||
|
3304: 6 55 4
|
||||||
|
1196013120: 8 340 179 35 192
|
||||||
|
124278235: 4 4 69 225 78 235
|
||||||
|
2735190615: 273 2 3 1 906 1 5
|
||||||
|
52192: 104 89 6 45 10 72
|
||||||
|
573777850: 680 31 807 8 50
|
||||||
|
35694425: 82 38 921 61 871 84 2
|
||||||
|
658877085778: 7 86 55 156 10 977 8
|
||||||
|
20860682976: 546 3 7 930 7 954 42 6
|
||||||
|
224616: 441 46 8 36 73 8 3 45 7
|
||||||
|
358087: 7 236 9 45 2 9 3 9 6 4 2 5
|
||||||
|
6354432: 55 792 7 153 639 7
|
||||||
|
1923524: 177 175 9 3 3 528 21
|
||||||
|
117340: 9 82 159
|
||||||
|
1234059: 64 357 9 45 6
|
||||||
|
2651349895: 8 526 4 7 9 1 6 42 9 89 5
|
||||||
|
3884759: 737 251 3 5 7
|
||||||
|
633925731: 346 4 3 5 472 9 7 9 4 8 9
|
||||||
|
43555: 37 4 60 25 53 77
|
||||||
|
4230519: 2 2 12 8 9 9 91 41 2 5 2 3
|
||||||
|
5489: 69 8 9 515 6
|
||||||
|
82630872: 33 1 2 19 81 9 4 5 6 6 33
|
||||||
|
203340489: 181 55 1 4 112 9
|
||||||
|
72068: 7 197 4 5 9
|
||||||
|
168389664: 1 683 84 5 667
|
||||||
|
30367442: 2 657 6 4 384 5 673 49
|
||||||
|
2846739576: 4 8 743 9 3 9 829 719 6
|
||||||
|
78401: 77 4 9 93 5
|
||||||
|
627886555182: 1 61 78 8 65 4 57 94 82
|
||||||
|
53361: 85 3 592 1 63
|
||||||
|
154268: 48 43 3 892 4 8 3 8 1
|
||||||
|
525075263: 656 34 4 8 6 6
|
||||||
|
248294606: 6 896 24 1 83 9 4 1 7 75
|
||||||
|
9082152: 182 66 9 8 6 7 7 2 195 2
|
||||||
|
1657909631: 8 5 76 7 5 95 2 9 22 544
|
||||||
|
484430: 2 5 64 7 49 961 83 3
|
||||||
|
11192683920: 6 26 7 8 5 8 6 3 8 372 1 1
|
||||||
|
52887178: 4 863 61 118 60
|
||||||
|
896861: 88 9 7 671 4 187
|
||||||
|
721710054179: 135 891 60 541 81
|
||||||
|
12403134: 92 6 34 58 6 5 7 9 6 6
|
||||||
|
33615296: 312 44 55 9 3 1 572
|
||||||
|
183192: 35 8 5 5 612 28 71 3 4 8
|
||||||
|
1244794661146: 6 4 9 6 1 6 4 57 7 685 8 6
|
||||||
|
362827266: 86 643 395 8 738 813
|
||||||
|
1477891785: 86 6 2 8 13 2 91 7 1 8 8
|
||||||
|
5983: 3 888 5 291 2 57 6
|
||||||
|
73739569: 668 6 687 89 6 69
|
||||||
|
902757501: 855 24 627 1 63 26 9
|
||||||
|
177442819: 6 9 401 2 4 52 256 4 3
|
||||||
|
87403263: 95 920 3 191 7 65
|
||||||
|
223398085: 57 3 1 8 11 50 45 8 9 85
|
||||||
|
76471: 81 472 2 1 6
|
||||||
|
102739: 1 284 1 8 9 1
|
||||||
|
98723250300: 79 119 1 1 2 143 5 7 21
|
||||||
|
37813543: 28 4 5 813 540
|
||||||
|
21449386021: 185 4 9 9 3 6 4 46 7 1 3 8
|
||||||
|
355140846: 39 4 6 90 845
|
||||||
|
25511824797: 3 7 4 746 48 55 3 15
|
||||||
|
11681963: 5 76 9 67 1 35 3 8 50 3 2
|
||||||
|
10812636790: 3 778 3 954 790
|
||||||
|
144: 90 14 40
|
||||||
|
2954988: 6 3 3 16 4 95 2 1 7 3 9 3
|
||||||
|
1666626: 282 573 74 39 1 46
|
||||||
|
380854191760: 2 7 24 5 54 177 5 5 664
|
||||||
|
20485976: 47 155 643 323 3 8
|
||||||
|
562264400: 8 1 3 1 5 74 3 67 309 88
|
||||||
|
5054: 67 3 55 599 604
|
||||||
|
5790: 8 6 4 3 7 43 1 9 8 4 17 6
|
||||||
|
1423: 232 6 23 2 6
|
||||||
|
2214885600: 1 5 2 1 3 50 183 41 82 3
|
||||||
|
586061: 507 69 31 975 3
|
||||||
|
68594249: 2 9 373 9 50 340 3 32 6
|
||||||
|
380980: 95 4 980
|
||||||
|
7510: 5 4 825 4 71 9
|
||||||
|
451918: 90 50 18 11 106
|
||||||
|
16294: 29 134 8 65 4 1 455 3
|
||||||
|
10536237: 6 6 3 9 1 1 4 724 4 5 1 97
|
||||||
|
24566372: 1 34 8 3 90 592 85 87
|
||||||
|
284990: 5 5 5 91 7 5 88 5
|
||||||
|
1108832032: 80 93 29 3 727 88
|
||||||
|
215422984: 63 82 417 8 70 1
|
||||||
|
37636247: 3 875 3 39 615 6 73 5 2
|
||||||
|
511718662: 3 505 3 718 23 42 9
|
||||||
|
172674894: 6 76 9 6 7 5 6 6 7 7 22 2
|
||||||
|
2494298: 21 8 468 606 6
|
||||||
|
1164891: 12 97 891
|
||||||
|
1303421387: 8 604 17 5 6 48 95 87
|
||||||
|
113169: 242 889 55 7 6
|
||||||
|
28083319654: 7 1 6 2 780 4 8 9 9 3 8 7
|
||||||
|
689769: 2 479 72 6
|
||||||
|
664006: 603 60 997 9
|
||||||
|
383810: 312 123 4 7
|
||||||
|
278838736: 254 851 15 86 76
|
||||||
|
35266920: 4 8 65 481 94
|
||||||
|
2342060: 5 55 2 43 99 710
|
||||||
|
61499384: 760 4 83 423 2 4
|
||||||
|
1337677: 769 562 5 67 3 9 13
|
||||||
|
20708670: 1 7 8 1 9 9 6 70 6 1 3 57
|
||||||
|
22607703347: 23 6 7 6 7 67 80 39 44
|
||||||
|
422584: 1 6 185 2 95 23 1 878
|
||||||
|
16961283369: 7 614 720 9 609 1 9
|
||||||
|
7743900: 12 80 8 38 33 75 525
|
||||||
|
5198: 5 14 5 5 3
|
||||||
|
7706: 5 765 6
|
||||||
|
60799047884: 9 6 5 331 7 2 2 6 3 3 5 87
|
||||||
|
373279812855: 74 65 5 946 16 571 5
|
||||||
|
273426612: 519 24 87 2 656 3 958
|
||||||
|
449: 250 94 8 9 88
|
||||||
|
69949442: 8 92 4 1 15 33 8 3 1 2 2
|
||||||
|
2540247614: 578 3 346 73 29 5 5 9 2
|
||||||
|
72710790952: 99 4 87 255 85 7 4
|
||||||
|
43727113667: 3 1 333 66 106 71 2 4 7
|
||||||
|
74125836117: 4 5 52 6 25 35 9 3 521
|
||||||
|
527906: 54 9 9 931 29
|
||||||
|
139782: 11 33 6 526 918
|
||||||
|
19218: 704 402 9 522 284 8
|
||||||
|
8668810: 40 8 6 3 6 2 84 2 2 75 7 3
|
||||||
|
1487663526: 9 9 517 70 2 6 2 5 94 8 4
|
||||||
|
20610: 1 152 3 2 45
|
||||||
|
359112: 323 5 47 54 7 6 3 8 4 2 4
|
||||||
|
3198: 1 7 8 8 24 7 1 4 41 7 27
|
||||||
|
41189: 13 9 3 624 5
|
||||||
|
4720776758223: 47 20 776 758 222
|
||||||
|
195264: 4 2 339 36 2
|
||||||
|
16012371600: 6 9 6 3 6 3 95 3 76 4 185
|
||||||
|
3864074: 3 4 426 84 73
|
||||||
|
45674415: 42 4 9 7 82 410 5
|
||||||
|
1175718380: 6 340 5 911 746
|
||||||
|
51156: 3 4 4 540 87
|
||||||
|
4831584: 2 43 8 2 55 5 7 5 69 96
|
||||||
|
874516400: 874 5 16 368 32
|
||||||
|
220190: 7 974 32 38 1 7 4 172 4
|
||||||
|
429894584: 1 9 5 7 5 98 94 9 6 9 58 4
|
||||||
|
114640: 3 7 31 52 7 6 1 772 299
|
||||||
|
10759: 23 1 6 12 7 2 1 4 81 28 7
|
||||||
|
360390945715: 2 431 696 27 213 20 5
|
||||||
|
3140056: 783 9 5 1 43 9 8 864
|
||||||
|
15606936: 96 6 40 639 172
|
||||||
|
1134226: 9 824 46 152 2
|
||||||
|
640: 5 32 2 2
|
||||||
|
46339061240: 7 20 9 987 5 715 618
|
||||||
|
35646030: 42 1 885 137 7
|
||||||
|
271367519: 7 45 964 127 96 893
|
||||||
|
495104: 1 960 8 56 64
|
||||||
|
3480: 7 1 12 3 1 40
|
||||||
|
2608290: 91 95 46 3 3 30
|
||||||
|
55890251: 1 65 7 9 4 81 454 3 582
|
||||||
|
541872: 774 7 46 2 27
|
||||||
|
309960637: 8 43 4 90 640
|
||||||
|
14270: 44 8 875 1 9 6 1 8 3 5 5
|
||||||
|
2461824: 1 4 1 9 7 12 61 71 1 4 1 8
|
||||||
|
53575: 6 73 9 7 118 3
|
||||||
|
3128658: 93 9 2 2 20 8 94 331 7
|
||||||
|
223592: 5 43 381 5 9 4 5 884 8
|
||||||
|
12112807054: 870 119 7 61 15 274 4
|
||||||
|
27775914: 6 1 781 1 9 18 4 3 5 889
|
||||||
|
279477744: 33 3 9 411 87 763
|
||||||
|
9896932013: 647 3 331 353 343 46
|
||||||
|
8127207475: 8 1 2 720 3 4 29 9 4 91 3
|
||||||
|
3683665: 981 751 5 5 8
|
||||||
|
7203976: 3 51 7 5 629 3 5 9 9 8 5 4
|
||||||
|
12182439609: 5 57 9 9 9 7 9 8 4 320 3 3
|
||||||
|
6547981: 9 727 2 47 84
|
||||||
|
269451007: 9 262 62 4 992
|
||||||
|
1760418: 99 34 1 5 99 96 4 27 6
|
||||||
|
4881246: 5 3 46 2 4 67 57 8
|
||||||
|
104401: 68 69 8 72 1
|
||||||
|
57612060: 6 270 53 61 11
|
||||||
|
65336211: 92 71 912 169 540 1
|
||||||
|
1056886344323: 8 990 3 9 1 6 18 695 64
|
||||||
|
431112: 3 19 108 92 69
|
||||||
|
1497953467: 1 640 5 8 6 9 38 65
|
||||||
|
20122455: 24 76 903 9
|
||||||
|
112719469: 32 80 7 13 6 456 4 6
|
||||||
|
1178483161: 18 8 6 29 75 754 4 3 4
|
||||||
|
119908723232: 48 39 7 5 3 73 8 64 30
|
||||||
|
21106565: 350 1 37 4 966 2 1 7 2 2
|
||||||
|
70193: 4 53 9 2 7 701 59 746 4
|
||||||
|
3034: 21 45 68 816 3
|
||||||
|
3005: 2 89 24 92 7 58
|
||||||
|
81430304: 124 4 989 2 83
|
||||||
|
22260548: 7 15 212 54 7
|
||||||
|
494808: 87 6 665 6 8
|
||||||
|
6723: 4 81 13 457 13
|
||||||
|
463069864051: 995 8 4 91 7 465 10
|
||||||
|
913887: 3 6 7 2 752 9 5 1 36 5 2 1
|
||||||
|
824408862: 82 43 9 86 8 94 6 5
|
||||||
|
3431928092169: 5 3 67 76 755 15 362 6
|
||||||
|
502132176: 9 109 624 964 702
|
||||||
|
83412526: 1 4 7 2 27 405 3 1 721 8
|
||||||
|
407094: 27 7 60 433 7 5
|
||||||
|
701412: 2 5 84 648 97 836 8
|
||||||
|
25707842242: 311 3 2 3 711 8 8 2 2 42
|
||||||
|
505119: 1 44 41 7 40
|
||||||
|
295936440: 9 27 963 89 272 4 38
|
||||||
|
59813: 595 97 657 457 984
|
||||||
|
297534: 348 61 1 1 2 7 296 46
|
||||||
|
143500: 618 32 8 31 19 1 82 7
|
||||||
|
138312966147: 5 29 5 3 2 2 7 50 4 8 96 2
|
||||||
|
311740: 5 76 5 37 1 1 597 3 20
|
||||||
|
4908292: 9 785 31 59 5
|
||||||
|
6141663: 204 7 25 3 5 1 7 2 9 6 2 2
|
||||||
|
746258: 1 3 61 6 48 21 4 11 81 5
|
||||||
|
310680: 6 7 59 782 9 45 8
|
||||||
|
170615594: 447 3 7 74 35 7 7 6 6 6 2
|
||||||
|
160656040: 75 78 105 603 7
|
||||||
|
5577322182: 47 49 942 2 24 5 7 1 2 7
|
||||||
|
48328: 3 7 4 7 9 149 9 456 7 3 7
|
||||||
|
155259452737: 56 746 874 2 8 342
|
||||||
|
35341: 5 76 93 1
|
||||||
|
22236341: 3 381 88 641 5 1
|
||||||
|
44989863673: 96 6 5 6 71 2 3 381 7 3 3
|
||||||
|
606: 4 80 50 4 70
|
||||||
|
12733: 65 9 2 86 5
|
||||||
|
22463298: 24 88 3 5 80 1 4 89 8
|
||||||
|
377019478: 6 748 5 1 3 4 1 9 7 2 3 8
|
||||||
|
19642752: 696 5 7 544 51
|
||||||
|
702511961: 887 792 1 7 961
|
||||||
|
6024648: 8 86 75 47 168
|
||||||
|
104509650: 5 1 482 62 72 597 7 70
|
||||||
|
1135227: 2 218 25 27 45 5 5
|
||||||
|
224: 2 4 6 2 86 100
|
||||||
|
173902: 99 277 462 89 4 99
|
||||||
|
823929: 9 9 8 5 929
|
||||||
|
25781529: 60 9 8 4 7 65 9 2 4 213 9
|
||||||
|
15984006: 38 6 5 9 727 7 6 4 96 1 5
|
||||||
|
911: 7 6 1 868 1
|
||||||
|
1319338035: 7 6 1 7 6 438 1 448 5 87
|
||||||
|
281978: 561 4 9 5 5 56 1 4 1 9 5 3
|
||||||
|
26739745316256: 3 772 8 21 75 45 5 75 5
|
||||||
|
804636: 50 6 26 542 927
|
||||||
|
4368: 9 87 1 8 42
|
||||||
|
1339970241787: 2 6 8 17 4 82 9 29 4 95 2
|
||||||
|
27896197888: 8 8 849 619 66 521
|
||||||
|
1624907806241: 9 270 3 9 649 18 9 44 1
|
||||||
|
804053256: 531 30 7 9 25 91 6
|
||||||
|
19887: 394 48 682 27 264
|
||||||
|
576579196: 34 7 5 75 6 8 1 5 5 5 91 9
|
||||||
|
4075638918: 886 5 23 97 1 5 4 7 48
|
||||||
|
1242184922: 7 4 5 7 88 9 393 4 925
|
||||||
|
816: 5 2 5 6 45 6
|
||||||
|
16640: 34 60 177
|
||||||
|
55047199922: 5 674 9 97 58 8 985 7 1
|
||||||
|
202: 1 57 3 8 1 4 28 2
|
||||||
|
128584480: 34 6 835 650 94 8
|
||||||
|
14447: 166 3 28 420 83
|
||||||
|
302594: 5 6 2 511 83
|
||||||
|
100153: 4 389 35 70 60 43 450
|
||||||
|
2185551: 38 3 43 19 3
|
||||||
|
6746: 4 6 583 93 784 39
|
||||||
|
3486469538: 8 47 3 40 786 7 9 1 19
|
||||||
|
2105210: 7 4 8 2 6 9 8 31 7 56 3 2
|
||||||
|
47524069: 6 4 610 811 106 4 85 8
|
||||||
|
24206: 25 599 13 2 19
|
||||||
|
83444222: 309 3 9 96 1 8 38 21
|
||||||
|
1157600: 383 930 42 92 800
|
||||||
|
135424: 274 494 29 6 33
|
||||||
|
41759168088: 63 4 91 3 77 2 33 9 94
|
||||||
|
912: 6 1 9 58 1 838
|
||||||
|
1483426560: 4 6 1 69 801 406 692 6
|
||||||
|
1291767304: 41 475 889 4 88 65 8
|
||||||
|
4740630: 941 32 56 2 87
|
||||||
|
145255683: 6 928 2 270 96 3 3
|
||||||
|
2804256: 2 563 36 41 6 91 8
|
||||||
|
3662: 592 6 91 11 8
|
||||||
|
2070609492: 9 460 7 1 66 352 9 8 5
|
||||||
|
58896: 73 2 5 17 5 15 8
|
||||||
|
161664199: 5 9 8 9 746 32 2 1 9 8
|
||||||
|
28767133: 6 69 10 43 37 96
|
||||||
|
321150750: 6 3 33 7 6 191 1 74 355
|
||||||
|
32221373185: 931 4 3 78 56 33 8
|
||||||
|
125188150: 1 84 8 299 7 6 3 623 38
|
||||||
|
529: 1 2 63 54 350
|
||||||
|
371329981: 53 730 8 78 760 4 57 1
|
||||||
|
8636010413: 34 6 1 516 8 4 4 82 1 1 1
|
||||||
|
16436: 8 8 36 7 70
|
||||||
|
2610384: 6 74 93 329 8 42
|
||||||
|
2511598: 21 497 80 7 10 12 5
|
||||||
|
2051303: 68 6 53 523 6 91
|
||||||
|
3583491: 58 3 3 8 852 79 4 5 5 46
|
||||||
|
2567: 5 3 32 4 3
|
||||||
|
37412197: 63 94 238 46 197
|
||||||
|
660996: 61 61 7 43 18
|
||||||
|
772595115: 1 7 2 25 4 2 314 72 5 8 6
|
||||||
|
1125072: 6 82 64 2 3 7 444 2 3 48
|
||||||
|
40030036: 9 68 7 66 646
|
||||||
|
26483808: 5 6 9 862 16 33 96
|
||||||
|
89503594: 2 91 80 112 72 61
|
||||||
|
34849136: 7 14 6 1 9 857 68 88
|
||||||
|
1052469452651: 5 94 9 5 5 5 9 870 8 8 3 8
|
||||||
|
2333026: 2 9 1 8 36 9 5 5 75 1 7 9
|
||||||
|
2142047: 55 2 6 1 60 3 9 40 6 5
|
||||||
|
18329059: 1 7 398 2 523 11 1
|
||||||
|
1515: 1 5 216 3 1 214
|
||||||
|
636751072: 65 7 58 3 967 7 759 9 4
|
||||||
|
65121: 3 648 21
|
||||||
|
1203384: 855 2 9 12 7
|
||||||
|
1231: 567 1 29 21 1 612
|
||||||
|
5830477499: 416 2 925 357 7
|
||||||
|
39904736: 2 2 987 58 51 2 1 8
|
||||||
|
7192: 4 881 3 11 8
|
||||||
|
984797352: 86 84 99 3 1 459
|
||||||
|
4330380: 444 3 8 3 797 7 6 9 1 5 6
|
||||||
|
174675: 8 41 206 75 824 530
|
||||||
|
644000: 2 4 89 4 17 7 92 14 1 4
|
||||||
|
275310: 6 11 31 58 888 4 2 9 2
|
||||||
|
2980025: 29 72 7 96 4 61
|
||||||
|
1100140: 3 8 9 91 3 9 466 5 6 8 3 9
|
||||||
|
26416153: 5 3 64 9 4 764 7 7 5 4 6 7
|
||||||
|
392307: 644 22 589 2 30
|
||||||
|
1703108: 23 789 9 532 7 8
|
||||||
|
84496967641: 9 8 7 71 696 158 605 9
|
||||||
|
4926: 5 47 3 5 2 6 60
|
||||||
|
1238: 7 20 5 8 75
|
||||||
|
4166368: 4 8 393 74 22 7
|
||||||
|
264286: 5 5 2 6 11 26 80 115 8 6
|
||||||
|
5390070: 38 5 77 813 35 3 54 8 6
|
||||||
|
7109213251: 798 2 5 88 89 50
|
||||||
|
11479038526: 245 1 5 7 333 456 3 7 9
|
||||||
|
35577532: 71 155 500 25 5
|
||||||
|
516: 7 4 6 4 1 70 9 66 1 5 39 2
|
||||||
|
12159: 9 6 1 225 9
|
||||||
|
593081: 1 92 6 4 343 2 6 8 3 41
|
||||||
|
52698: 89 592 7
|
||||||
|
36739952992513: 9 4 779 4 627 92 4 8 3 7
|
||||||
|
2006: 22 8 90 75 5 8
|
||||||
|
83601: 68 30 8 5 1 56 3 1 3 7
|
||||||
|
478266: 1 4 8 6 3 724 612 8 286
|
||||||
|
297000: 49 50 820 9 90 6 88
|
||||||
|
1229910807: 262 102 46 6 600 807
|
||||||
|
185356128: 44 5 401 7 82 115 48
|
||||||
|
246521: 787 6 4 6 307
|
||||||
|
86285202: 25 96 42 856 402
|
||||||
|
23586: 70 1 3 52 9 5
|
||||||
|
18086584: 46 6 144 8 27 534 7
|
||||||
|
33690: 4 69 4 56 89
|
||||||
|
46311716: 12 3 41 18 619 6
|
||||||
|
214023: 5 793 66 7 53 9
|
||||||
|
6755: 270 2 799 12 5
|
||||||
|
14223284: 9 9 7 5 7 8 2 111 1 45 4 8
|
||||||
|
2291081: 3 2 632 725 81
|
||||||
|
284789717303: 605 3 9 3 960 30 47 49
|
||||||
|
17262: 105 4 3 1 3 9 3 240 2 7 1
|
||||||
|
157051: 9 7 6 181 6 9 3 3 451 81
|
||||||
|
1349805670: 59 4 874 26 71
|
||||||
|
2361910101: 5 623 7 3 38 6 8 1 3 1 8 2
|
||||||
|
45459840: 8 42 71 1 3 8 4 9 8 9 384
|
||||||
|
644841302: 7 658 2 70 62 68 2
|
||||||
|
196349: 69 6 192 81 2 4
|
||||||
|
25233495: 14 6 1 3 34 83 14
|
||||||
|
2502364627: 9 73 7 1 76 4 7 95 8 5 27
|
||||||
|
891841251: 79 62 560 2 63 6 51
|
||||||
|
526: 95 9 4 1 417
|
||||||
|
46610701: 46 605 5 697 4
|
||||||
|
101160: 5 5 6 5 9 4 873 8 4 3 3 63
|
||||||
|
74700: 86 2 765 47 83
|
||||||
|
487499: 9 52 6 6 85 502
|
||||||
|
12930315: 4 77 3 9 48 9 1 5
|
||||||
|
818480: 3 4 8 966 10 3 7 1 4 5 4 1
|
||||||
|
8956575: 6 8 827 5 676 864 35
|
||||||
|
6467920693: 5 8 5 48 652 1 8 8 1 3 8 5
|
||||||
|
877: 71 10 689 32 75
|
||||||
|
53325209060: 554 965 941 2 53
|
||||||
|
23291024284082: 9 42 193 47 6 9 515 48
|
||||||
|
929424926: 3 6 29 42 492 5
|
||||||
|
17829266: 6 56 4 53 63
|
||||||
|
12276: 2 5 55 3 66
|
||||||
|
181712606: 595 74 75 412 6
|
||||||
|
8831966: 2 56 30 2 2 39 65 2 9 8 7
|
||||||
|
661454663997: 231 3 453 350 8 10 78
|
||||||
|
237094: 3 3 311 50 646 12
|
||||||
|
5707220457: 71 82 86 966 4 920 55
|
||||||
|
152255376595: 76 17 40 820 65 163
|
||||||
|
1347305: 9 4 8 65 664 3 4 3 701 9
|
||||||
|
70155: 91 2 88 257 706 58 1
|
||||||
|
60468016: 640 1 23 5 27 726 812
|
||||||
|
408075824: 40 74 6 758 22
|
||||||
|
149767280436: 1 221 860 788 436
|
||||||
|
1581985302: 83 9 258 3 8 38 72 3 6
|
||||||
|
157694208: 94 8 52 3 5 15 56 1 3 8
|
||||||
|
3814512: 5 6 4 8 8 5 6 5 5 37 9
|
||||||
|
4548610: 66 9 3 3 7 57 50 1 9
|
||||||
|
21119484: 38 822 28 29 876
|
||||||
|
5946398: 661 589 67 71 91 57
|
||||||
|
151648362: 894 75 5 9 93 54 317
|
||||||
|
10321152: 99 807 712 2 8
|
||||||
|
114489: 6 5 4 8 31 84 37 9
|
||||||
|
145909: 75 70 909
|
||||||
|
106820010: 722 269 10 2 55
|
||||||
|
1480075: 44 2 198 9 3 71 691 6 7
|
||||||
|
28827: 19 1 5 7 6 9 78 1 8 849 3
|
||||||
|
7566: 7 244 8 141 62 23 5 83
|
||||||
|
5508361: 495 4 214 13 1
|
||||||
|
4988516: 5 33 55 12 568 66 2 97
|
||||||
|
184373: 1 9 7 9 5 1 1 33 9 11 20
|
||||||
|
199283931852: 3 5 8 4 158 6 3 539 855
|
||||||
|
1666857472580: 77 654 23 180 331
|
||||||
|
14487733: 557 891 68 9 9 5 828
|
||||||
|
1198391800: 231 965 8 84 2 93 1 4 2
|
||||||
|
126143604: 86 2 6 463 88 55 5 3
|
||||||
|
153392452209: 6 482 7 3 939 11 5 4 9 7
|
||||||
|
12681: 5 7 2 9 4 7 44 2 5 65 4 9
|
||||||
|
989: 1 9 99
|
||||||
|
93840: 98 38 46 15
|
||||||
|
217780: 419 3 516 23 5
|
||||||
|
33264: 447 87 973 5 22
|
||||||
|
7178025: 995 9 5 2 87 7 527 20 5
|
||||||
|
9028: 3 83 7 5 3
|
||||||
|
12935: 711 5 6 3 47
|
||||||
|
3659499181: 365 925 6 229 9 5 181
|
||||||
|
701521: 9 4 3 64 7 61 8 26 67 53
|
||||||
|
340704429: 52 78 84 319 7 7 99
|
||||||
|
62241150: 7 176 842 8 77 6
|
||||||
|
112424: 5 1 8 936 82 8 183 92
|
||||||
|
723672: 347 67 1 2 874
|
||||||
|
3066: 51 5 8 8 8 898
|
||||||
|
1274880: 23 52 542 9 87
|
||||||
|
2517506958: 37 68 780 726 9 59
|
||||||
|
110283391: 3 52 3 53 8 3 8 6 3 903 1
|
||||||
|
4536: 83 5 81 9 747 2
|
||||||
|
87466: 19 46 6 3
|
||||||
|
605783111392: 404 91 601 37 741 4
|
||||||
|
58853775: 4 485 79 4 384 399
|
||||||
|
47889063: 516 64 89 984 999 29
|
||||||
|
23241016: 7 3 5 5 6 1 3 819 27 9 9 1
|
||||||
|
27260572330: 9 9 7 9 28 57 2 3 8 2 5 5
|
||||||
|
233756964: 61 958 6 5 1 5 26 8 314
|
||||||
|
781268: 376 6 743 4 692 1
|
||||||
|
69945120: 7 4 539 5 113 5 6 4 7 73
|
||||||
|
267715242: 92 8 663 9 4 3 632 3 1 2
|
||||||
|
1896465174: 976 920 1 4 651 72
|
||||||
|
2800123: 203 8 17 9 384 23
|
||||||
|
206464: 3 7 3 186 1
|
||||||
|
127766017: 74 12 9 35 714 1 24 1
|
||||||
|
24: 7 5 1 9 3
|
||||||
|
10510918116: 59 46 109 181 15
|
||||||
|
3621981: 2 248 954 2 1 3 9 78
|
||||||
|
7258534: 70 96 523 840 898
|
||||||
|
12932425: 928 6 43 57 8 54 1 3 9 7
|
||||||
|
40426441: 6 8 7 7 3 8 1 2 1 18 509 9
|
||||||
|
258400: 70 120 34 40
|
||||||
|
895: 81 303 38 2 51
|
||||||
|
80809920: 932 69 727 47 995
|
||||||
|
21779938: 9 411 92 64 226
|
||||||
|
1613: 4 401 4 7
|
||||||
|
43158803498: 36 222 9 7 26 39 6 9 9 1
|
||||||
|
4366703135: 57 7 93 7 2 70 982 8 6
|
||||||
|
167694750: 9 89 350 76 598
|
||||||
|
1913663802: 64 299 63 6 2 10 2
|
||||||
|
1444191: 556 9 11 4 6 5 1 41 83 7
|
||||||
|
1003880435: 19 82 746 977 863
|
||||||
|
4155: 72 810 13 4 575
|
||||||
|
96614034: 15 6 361 72 6 2 3 6 59
|
||||||
|
1688: 5 9 1 5 3 8 8
|
||||||
|
41338714328: 41 338 639 75 328
|
||||||
|
9197318140: 2 59 6 1 690 8 1 5 227 4
|
||||||
|
46479360: 61 7 4 2 9 7 39 272 6 5 8
|
||||||
|
404048233: 951 7 8 576 2 4 235
|
||||||
|
11494468882: 3 187 5 9 1 3 24 2 6 7 5 7
|
||||||
|
1922: 6 233 457 6 61
|
||||||
|
6955: 9 7 8 4 5 7 4 2 4 5 202 5
|
||||||
|
31285182: 23 136 506 7 63 52
|
||||||
|
8117862: 437 1 6 921 2 381 46 6
|
||||||
|
47589: 9 94 374 39 7
|
||||||
|
2256037: 60 376 39
|
||||||
|
2527024499: 4 3 1 7 8 10 3 1 6 51 91
|
||||||
|
37690: 3 720 52 6 1 88 1
|
||||||
|
4175256007: 4 8 5 39 20 2 34 2 23
|
||||||
|
380247474471: 2 4 2 45 497 88 5 7 2 7 1
|
||||||
|
21474: 9 9 9 1 17 4 784 8 4 39 9
|
||||||
|
3277745: 18 2 5 4 414 89 271
|
||||||
|
20611117618: 3 3 2 4 8 1 4 9 39 76 19
|
||||||
|
6706090709: 799 2 3 1 8 9 8 4 7 872
|
||||||
|
5792: 618 29 68 8 3 69
|
||||||
|
410827821: 4 927 73 453 16 409
|
||||||
|
233173828: 3 74 634 6 896 3 4 7 5 6
|
||||||
|
187959: 119 32 2 556 23
|
||||||
|
486043544: 3 230 57 52 54 74 62 7
|
||||||
|
2347696: 4 1 35 40 19 769 8
|
||||||
|
4278588041013: 44 7 29 4 7 456 7 4 684
|
||||||
|
5637600: 58 9 54 25 8
|
||||||
|
4977330: 9 7 6 79 3 9 8 838 3 4 7 6
|
||||||
|
22497: 82 79 983 1 1 3 9 102
|
||||||
|
35382699154: 77 617 2 14 2 46 554
|
||||||
|
16502056: 8 6 58 319 488 5 819
|
||||||
|
756793: 88 3 3 944 192 3 1 72
|
||||||
|
4214: 6 697 1 5 27
|
||||||
|
12450094: 2 2 2 6 3 629 9 857 5 9 4
|
||||||
|
1618088: 76 4 6 1 7 7 62 90 5 1 8
|
||||||
|
1060491: 3 361 14 906 66 1
|
||||||
|
266689086: 3 2 17 83 5 6 8 42 6 5 3 3
|
||||||
|
68560832: 3 1 82 6 8 5 3 308 2 1 2
|
||||||
|
1326: 423 846 4 1 8 44
|
||||||
|
68085: 674 6 78 7
|
||||||
|
1840707: 85 9 62 6 804 4 3
|
||||||
|
13403416: 2 1 3 5 4 65 7 8 7 3 933
|
||||||
|
2093: 56 6 868 26 614 9 8
|
||||||
|
12213922: 73 703 14 1 17
|
||||||
|
224283: 640 7 4 5 8 4
|
||||||
|
97770: 1 214 7 27 1 8 378
|
||||||
|
25990: 6 5 5 87 2 7 767 6 92 4
|
||||||
|
299184551: 325 2 92 544 7
|
||||||
|
63062194: 70 9 605 7 46 123 825
|
||||||
|
68322843482: 28 244 28 434 82
|
||||||
|
37380255: 80 1 935 87 493 4 5
|
||||||
|
305472677: 509 6 7 267 7
|
||||||
|
46: 1 45 2
|
||||||
|
2250: 29 1 75 6 69
|
||||||
|
191773: 19 176 5 8
|
||||||
|
91083792: 4 7 236 878 7 5 6 4 3 1 1
|
||||||
|
335524376: 8 53 51 68 668 158
|
||||||
|
29640281671: 7 8 4 6 3 5 7 44 7 8 8 90
|
||||||
|
497340: 9 3 762 7 3 6 3 5 6
|
||||||
|
279527: 402 67 149 4 1 3
|
||||||
|
279694: 1 935 96 765 97
|
||||||
|
224785469: 2 1 9 5 68 10 2 3 9 3 7 23
|
||||||
|
10732502: 15 5 477 5 60
|
||||||
|
7497250: 8 936 1 9 249
|
||||||
|
56971: 4 76 9 79 91
|
||||||
|
41393070: 2 53 5 781 70
|
||||||
|
12168228431496: 64 3 8 2 161 9 7 831 3
|
||||||
|
117142318737: 3 6 6 9 2 60 436 3 9 6 9 3
|
||||||
|
158260: 9 45 5 4 78
|
||||||
|
2363212870: 2 363 212 4 52 420
|
||||||
|
447325: 463 2 795 355 25
|
||||||
|
4751: 11 48 9
|
||||||
|
841: 81 9 97 2 13
|
||||||
|
3346211520: 3 9 858 11 522
|
||||||
|
697352492: 67 1 4 4 18 3 455 69 9 5
|
||||||
|
7319280640: 61 45 7 709 7 656 80
|
||||||
|
27260: 7 9 344 79 5
|
||||||
|
10737320581: 7 8 5 5 55 7 8 6 294 70
|
||||||
|
17943: 9 839 921 18 6 9 4
|
||||||
|
35412: 6 724 1 9 8 580
|
||||||
|
6453: 161 1 475 81 9
|
||||||
|
840798: 975 287 52 3 647 517
|
||||||
|
17854: 3 32 69 42 7 655
|
||||||
|
1735468803: 3 86 8 5 9 91 68 3 26 80
|
||||||
|
1955340326: 54 8 292 2 54 5 327
|
||||||
|
7614444: 86 7 718 824 7 88 7 19
|
||||||
|
108369902185: 3 9 115 814 7 9 5 7 1 8 6
|
||||||
|
139223: 8 3 53 2 77 38 6 3 2 7 4
|
||||||
|
2142640: 49 43 35 566 72
|
||||||
|
266228026: 3 80 51 8 597 5 62 24
|
||||||
|
68870224: 6 62 870 22 4
|
||||||
|
393281: 5 4 109 9 32 77 2 22 9
|
||||||
|
22257035: 29 25 685 5 6 3 597 3 5
|
||||||
|
1480: 679 67 130 537 9 58
|
||||||
|
11720991: 1 8 23 7 364 5 5 5 59 7
|
||||||
|
156699: 663 9 301 5 5
|
||||||
|
1292069: 17 760 21 42 6
|
||||||
|
83229203: 100 1 4 7 1 808 321 9 2
|
||||||
|
15899250: 986 375 43
|
||||||
|
80808: 40 4 521 212 104
|
||||||
|
10465625002: 9 77 71 47 50 1 425 2
|
||||||
|
819408192: 31 68 991 7 3 87
|
||||||
|
667: 8 8 2 7
|
||||||
|
26860: 200 45 23 56 4
|
||||||
|
49480468: 43 29 90 127
|
||||||
|
5186813940000: 504 967 5 825 5 86 2 3
|
||||||
|
19174057: 6 7 652 7 51 7
|
||||||
|
72691616664: 991 7 733 662 6 38
|
||||||
|
18573243: 343 360 489 9 900 6
|
||||||
|
3883810560: 6 88 2 8 4 438 8 980 6
|
||||||
|
19738: 5 2 508 38 54
|
||||||
|
703764: 13 8 48 495 20 77 23 6
|
||||||
|
273920: 7 629 987 89 8 20
|
||||||
|
911: 7 5 9 4 592
|
||||||
|
33029: 50 644 822 7
|
||||||
|
524702: 7 153 24 79 7 3 95 17
|
||||||
|
109342: 84 130 3 3 2 2 80
|
||||||
|
35742400: 8 1 706 7 51 174 6 6 9 7
|
||||||
|
1483641: 2 64 70 737 153
|
||||||
|
7397: 364 5 8 4 85
|
||||||
|
10622451329: 5 80 3 7 1 4 7 879 3 1 2
|
||||||
|
1513454743: 69 31 8 732 963 91
|
||||||
|
87816030: 47 1 7 80 3 8 1 6 417 1
|
||||||
|
2957777379: 30 265 7 777 379
|
||||||
|
279602: 759 1 23 4 4 274 9 7
|
||||||
|
2793723: 2 10 66 1 6 24 2 723
|
||||||
|
13426560: 36 37 180 8 7
|
||||||
|
72281484: 8 25 758 6 17 9 36
|
||||||
|
15157818475: 26 124 1 5 7 818 475
|
||||||
|
1726473: 857 5 41 9 819 2
|
||||||
|
69102877793: 9 997 2 91 7 17 711 7 5
|
||||||
|
1182849: 2 249 31 38 4 129 8
|
||||||
|
81125766: 7 2 670 17 308 3 789
|
||||||
|
20198: 8 6 3 396 2
|
||||||
|
130416799: 10 27 483 6 7 9 6 4
|
||||||
|
29969: 7 62 38 7 91 5 4 907
|
||||||
|
4071: 3 10 4 7 23
|
||||||
|
3447616557: 858 111 362 9 54
|
||||||
|
31720: 38 59 43 63 4 2
|
||||||
|
10386966: 1 3 8 612 2 96 5 7 8 4 6 3
|
||||||
|
2515969: 2 768 9 906 8
|
||||||
|
2085272: 18 65 114 297 25
|
||||||
|
245966149: 96 3 146 5 6 4 2 2 3 731
|
||||||
|
936628: 57 38 19 887 90 88
|
||||||
|
434515299: 905 64 9 8 56 99
|
||||||
|
7751781085279: 8 7 900 819 9 389 11
|
||||||
|
6523: 4 61 26 151 28
|
||||||
|
507242778: 6 822 69 44 4 459 1 6 7
|
||||||
|
4557: 2 48 3 9 169 3
|
||||||
|
6172533: 37 9 207 43 7 9 7 7 12 9
|
||||||
|
4528512: 7 27 871 689 5 6 63
|
||||||
|
35178: 1 682 81 46 80
|
||||||
|
40198: 67 4 25 6
|
||||||
|
12418780: 54 7 6 8 351 6 164 11
|
||||||
|
37440: 24 9 8 12 870 247 32
|
||||||
|
7303307255: 35 695 324 6 64 8 52
|
||||||
|
42929: 9 124 38 5 516
|
||||||
|
101311: 2 99 31 1 3
|
||||||
|
3786723: 1 685 92 6 3 3
|
||||||
|
757762: 76 997 1 3 38
|
||||||
|
728: 567 6 23 42 90
|
||||||
|
19126995: 593 1 70 65 59 58 458
|
||||||
|
83647: 8 828 47
|
||||||
|
1250549: 24 939 1 71 50
|
||||||
|
9778: 9 173 39 15 5 3 39 262
|
||||||
|
18714: 89 265 5 13 4 43 1 3
|
||||||
|
10446534727248: 61 465 74 62 990 8 6
|
||||||
|
4136: 12 289 668
|
||||||
|
986: 919 65 2
|
||||||
|
382284584: 655 1 7 1 144 578 7 1
|
||||||
|
2087668: 521 7 75 94 48 4
|
||||||
|
13551: 62 69 8 36 9
|
||||||
|
54736659: 504 52 8 38 17 261
|
||||||
|
46609728: 5 9 6 5 78 8 818 9 3 1 5 6
|
||||||
|
8001: 55 7 6 9 7 3
|
||||||
|
2164: 20 62 3 7 8 8 76
|
||||||
|
34288954: 174 227 512 141 854
|
||||||
|
149143039: 568 157 839 4 4 8 745
|
||||||
|
858002: 715 600 1 2 2
|
||||||
|
355275: 3 550 5 22 6
|
||||||
|
1161901609: 9 3 7 1 9 5 8 2 99 9 492 4
|
||||||
|
14265505: 7 4 77 237 684
|
||||||
|
93906: 1 23 457 4 78
|
||||||
|
280258704: 396 16 217 528 81
|
||||||
|
2447: 237 9 217 9 88
|
||||||
|
21103892: 688 2 139 4 3 64 55 7
|
||||||
|
572320: 571 889 7 8 7
|
||||||
|
22940: 74 1 31 10
|
||||||
|
453933144: 884 1 7 2 8 75 164 94 9
|
||||||
|
9387402762: 447 7 134 3 70 3 57 2
|
||||||
|
628: 2 96 5 6 10
|
||||||
|
58729373: 53 4 53 29 373
|
||||||
|
16162243: 2 3 90 75 92 139 927
|
||||||
|
1806271: 4 319 283 5 13 718
|
||||||
|
1908: 72 26 16 8 9
|
||||||
|
87108518916: 8 349 61 129 729 4
|
||||||
|
1120226562: 81 8 1 54 7 89 8 5 2 32
|
||||||
|
5619463232: 7 860 2 3 9 3 24 29
|
||||||
|
28275666: 4 35 65 440 227
|
||||||
|
57418552: 8 96 4 18 9 6 4 142
|
||||||
|
337848089754: 893 778 54 82 7 9 5
|
||||||
|
101244761: 2 8 4 1 222 8 1 631 6 4 5
|
||||||
|
31091: 2 94 6 323 9 4 4 53 8 3
|
||||||
|
9551142: 2 7 4 4 92 9 87 2 54
|
||||||
|
431798: 2 827 32 904 554 96
|
||||||
|
368064: 62 5 31 10 568 6
|
||||||
|
641856: 80 23 1 2 8
|
||||||
|
356332: 848 13 8 38 853 4
|
||||||
|
1530148: 107 13 11 13 33
|
||||||
|
10595: 4 93 3 71 524
|
||||||
|
13825: 37 88 128 73 4
|
||||||
|
485809: 9 597 19 6 996 5
|
||||||
|
6598799: 541 2 674 617 6 5 3 1 1
|
||||||
|
15595884486: 6 36 560 69 8 961
|
||||||
|
655845: 5 5 2 512 8 298 7 115
|
||||||
|
167578404: 716 3 162 9 916 19
|
||||||
|
539849: 3 7 1 594 25
|
||||||
|
3430232: 9 15 29 9 2 700 7 56 4 8
|
||||||
|
4196: 951 77 9 8 4 4
|
||||||
|
24625387: 9 6 8 6 9 37 846 38 3 8 8
|
||||||
|
4318272002: 10 7 2 3 80 6 5 2 7 306 2
|
||||||
|
49392736: 80 63 4 72 34 2 944 2
|
||||||
|
97244751876: 3 45 6 3 7 293 8 5 9 2 3 1
|
||||||
|
2827209446: 384 6 35 4 9 6 7 3 441 5
|
||||||
|
773376516: 7 73 37 651 5
|
||||||
|
466781: 21 76 5 364 782
|
||||||
|
314242938: 77 30 223 22 610 218
|
||||||
|
654638167: 14 95 6 631 7 169
|
||||||
|
11952: 76 23 69 7 50 439 18
|
||||||
|
7579925: 860 37 435 47 5
|
||||||
|
1618: 80 4 7 711 59
|
||||||
|
33287: 1 822 40 354 48 2 3
|
||||||
|
126232779: 6 3 841 9 5 4 77 8 34 9 3
|
||||||
|
155627: 1 6 99 989 54 95 13 99
|
||||||
|
713339897: 9 7 5 8 9 30 430
|
||||||
|
131670050047: 231 19 75 12 5 1 4 8
|
||||||
|
7727322: 2 795 9 753 513
|
||||||
|
349733: 615 8 637 271 4 6 28
|
||||||
|
2481710424: 1 58 9 49 1 3 96 5 9 3 8 3
|
||||||
|
261963659: 9 7 4 7 2 308 655 650 9
|
||||||
|
51571974: 7 5 579 7 848 1 1 3
|
||||||
|
20290: 3 85 3 467 36 1 1 6 196
|
||||||
|
2626: 2 6 96 545 2
|
||||||
|
22878: 2 2 80 275 4 21 3 9
|
||||||
|
575535: 54 4 14 18 10 8 73 6 3
|
||||||
|
477517: 43 3 4 5 8 46 7 50
|
||||||
|
1384703: 4 401 6 7 738 51
|
||||||
|
891003337: 86 6 12 4 825 3 3 39
|
||||||
|
90028742465: 608 3 1 37 4 3 4 2 4 6 2 1
|
||||||
|
231588050: 35 3 1 586 1 2 8 1 3 65 5
|
||||||
|
1072: 7 9 995 9 5
|
||||||
|
11381395: 73 4 974 2 36 2 435 7
|
||||||
|
3841: 847 4 87 358 8
|
||||||
|
88734868: 3 6 9 8 9 2 7 5 4 838 725
|
||||||
|
280240227: 2 981 23 1 48 94
|
||||||
|
343965: 6 35 67 885 23
|
||||||
|
14417393: 9 4 7 2 63 6 38 35 90
|
||||||
|
227912: 8 183 31 19 3 72 9 8 1
|
||||||
|
2511501082: 1 946 88 2 430 3 7 6 2 4
|
||||||
|
9770975: 2 207 7 58 9 4 36 33 5
|
||||||
|
181098129983: 36 3 6 1 3 399 7 9 8 1 8 6
|
||||||
|
5511886: 749 92 63 2 9 4 104 94
|
||||||
|
11912: 3 167 581 43 15
|
||||||
|
54194003: 24 5 7 50 632
|
||||||
|
40135618285: 5 5 5 4 8 7 7 38 182 8 3 5
|
||||||
|
8817032: 460 2 2 6 4 4 7 2 57 728
|
||||||
|
236071: 566 414 610 196 941
|
||||||
|
1699: 874 26 799
|
||||||
|
9082: 59 85 7 9 10
|
||||||
|
14399715: 7 6 5 84 32 1 9 9 8 756 7
|
||||||
|
957922: 5 76 282 265 853
|
||||||
|
519850: 854 1 1 608 8
|
||||||
|
494598: 8 8 8 9 1 2 4 1 3 4 17 78
|
||||||
|
717301: 769 92 138 844 1
|
||||||
|
79732051: 8 1 7 80 45 5 221 629 8
|
||||||
|
193315: 5 329 577 536 60
|
||||||
|
443120: 71 7 62 5 764 4
|
||||||
|
799531202: 320 693 332 72 50 2
|
||||||
|
25055194: 241 48 900 7 194
|
||||||
|
148742749564: 341 93 73 435 240 65
|
||||||
|
2975722: 802 811 6 919 2
|
||||||
|
69614316: 3 9 65 34 9 9 6 3 1 96 59
|
||||||
|
9211672: 92 116 51 20
|
||||||
|
1384: 5 687 2
|
||||||
|
2227754259: 312 1 75 78 952
|
||||||
|
1980: 6 46 5 70 6
|
||||||
|
1051: 74 41 921 7 8
|
||||||
|
7224: 69 9 6 405 7
|
||||||
|
100058717: 58 44 628 7 145 31 9 8
|
||||||
|
13325842: 86 4 981 7 534 49 5 9
|
||||||
|
135606016: 86 1 1 7 2 4 8 877 96 8
|
||||||
|
188416: 4 8 735 32 8
|
||||||
|
13081748: 306 58 2 737
|
||||||
|
3408461: 654 396 4 34 348 94 9
|
||||||
|
19518: 2 1 8 9 1 54 9 25 9 616 2
|
||||||
|
31719: 65 6 9 78 597
|
||||||
|
246572: 26 98 9 4 393 9 81 2 8
|
||||||
|
127805458: 40 71 9 1 5 457
|
||||||
|
7811: 198 16 5 7 31 1 4 794 6
|
||||||
|
1168319105: 5 2 1 2 4 44 8 93 9 12 8 8
|
||||||
|
7211685: 411 5 7 562 8 554 93 5
|
||||||
|
4028985022: 77 86 48 505 604
|
||||||
|
127755655140: 73 70 5 3 8 31 5 140
|
||||||
|
208269903: 3 75 267 990 3
|
||||||
|
956027222: 455 20 5 10 4 3 5 7
|
||||||
|
332644: 63 1 8 660 4
|
||||||
|
739903: 8 744 1 67 3 630 9 1 5
|
||||||
|
449841: 8 6 3 1 9 9 4 9 608 73 88
|
||||||
|
3162: 88 4 6 9 7 3 53 7 9 17
|
||||||
|
123780: 961 528 514 51 9 60
|
||||||
|
397: 88 299 1 1 9
|
||||||
|
20327221321: 10 40 83 98 1 460 7 6
|
||||||
|
22759444: 366 7 6 3 241 6
|
||||||
|
1397068088398: 419 2 5 161 5 6 4 414 1
|
||||||
|
5172: 6 431 2
|
||||||
|
7637: 251 9 85 746 7
|
||||||
|
1812: 908 35 789 3 77
|
||||||
|
1120: 7 9 1 68 9 2 4
|
||||||
|
770138283: 11 6 57 1 3 8 947 9 1 3 3
|
||||||
|
163644: 610 32 344 63 156
|
||||||
|
6168: 137 5 9
|
||||||
|
507: 41 9 2 76 60
|
||||||
|
593693: 77 77 16 765 9
|
||||||
|
1214074355: 9 4 5 3 9 73 5 7 8 4 855 8
|
||||||
|
607244471: 6 3 7 3 1 83 2 510 2 4 6 8
|
||||||
|
275: 26 2 9 2 2
|
||||||
|
250040507: 24 9 455 585 504
|
||||||
|
5137920095731: 44 7 438 78 3 23 573 2
|
||||||
|
282926819: 6 4 827 26 812 42 3 32
|
||||||
|
80952: 37 2 6 948 2
|
||||||
|
8890436: 635 2 7 43 8
|
||||||
|
10600: 2 1 8 8 6 6 8 3 91 541 6 5
|
||||||
|
23840: 5 86 1 9 4 1 7 511 57 5
|
||||||
|
283368: 3 8 8 322 8
|
||||||
|
1123947090: 49 3 877 8 1 323 9 342
|
||||||
|
25775616: 8 8 6 97 692
|
||||||
|
243687944: 650 5 815 32 92
|
||||||
|
2855764: 2 1 912 730 1
|
||||||
|
2736185924: 835 66 2 53 8 3 31 3 2 2
|
||||||
80
2024/gareth/day08/day08.go
Normal file
80
2024/gareth/day08/day08.go
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
package day08
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Coordinate struct {
|
||||||
|
Row int
|
||||||
|
Col int
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
grid, antennaMap := parseInput(input)
|
||||||
|
result := findAntinodes(grid, antennaMap, true)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
grid, antennaMap := parseInput(input)
|
||||||
|
result := findAntinodes(grid, antennaMap, false)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) ([][]rune, map[rune][]Coordinate) {
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
rowCount := len(lines)
|
||||||
|
colCount := len(lines[0])
|
||||||
|
grid := make([][]rune, rowCount)
|
||||||
|
antennaMap := make(map[rune][]Coordinate)
|
||||||
|
|
||||||
|
for row := 0; row < rowCount; row++ {
|
||||||
|
grid[row] = []rune(lines[row])
|
||||||
|
for col := 0; col < colCount; col++ {
|
||||||
|
frequency := grid[row][col]
|
||||||
|
if frequency != '.' {
|
||||||
|
antennaMap[frequency] = append(antennaMap[frequency], Coordinate{Row: row, Col: col})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return grid, antennaMap
|
||||||
|
}
|
||||||
|
|
||||||
|
func findAntinodes(grid [][]rune, antennaMap map[rune][]Coordinate, onlySpecial bool) int {
|
||||||
|
rowCount := len(grid)
|
||||||
|
colCount := len(grid[0])
|
||||||
|
uniqueAntinodes := make(map[Coordinate]struct{})
|
||||||
|
|
||||||
|
for row := 0; row < rowCount; row++ {
|
||||||
|
for col := 0; col < colCount; col++ {
|
||||||
|
for _, antennaPositions := range antennaMap {
|
||||||
|
for i, firstAntenna := range antennaPositions {
|
||||||
|
for j, secondAntenna := range antennaPositions {
|
||||||
|
//I know I know thats too many for loops
|
||||||
|
if i != j {
|
||||||
|
distance1 := int(math.Abs(float64(row-firstAntenna.Row)) + math.Abs(float64(col-firstAntenna.Col)))
|
||||||
|
distance2 := int(math.Abs(float64(row-secondAntenna.Row)) + math.Abs(float64(col-secondAntenna.Col)))
|
||||||
|
|
||||||
|
rowDiff1 := row - firstAntenna.Row
|
||||||
|
rowDiff2 := row - secondAntenna.Row
|
||||||
|
colDiff1 := col - firstAntenna.Col
|
||||||
|
colDiff2 := col - secondAntenna.Col
|
||||||
|
|
||||||
|
if rowDiff1*colDiff2 == rowDiff2*colDiff1 {
|
||||||
|
if (distance1 == 2*distance2 || distance1*2 == distance2) && onlySpecial {
|
||||||
|
uniqueAntinodes[Coordinate{Row: row, Col: col}] = struct{}{}
|
||||||
|
} else if !onlySpecial {
|
||||||
|
uniqueAntinodes[Coordinate{Row: row, Col: col}] = struct{}{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return len(uniqueAntinodes)
|
||||||
|
}
|
||||||
39
2024/gareth/day08/day08_test.go
Normal file
39
2024/gareth/day08/day08_test.go
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
package day08
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`............
|
||||||
|
........0...
|
||||||
|
.....0......
|
||||||
|
.......0....
|
||||||
|
....0.......
|
||||||
|
......A.....
|
||||||
|
............
|
||||||
|
............
|
||||||
|
........A...
|
||||||
|
.........A..
|
||||||
|
............
|
||||||
|
............`)
|
||||||
|
assert.Equal(t, 14, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`............
|
||||||
|
........0...
|
||||||
|
.....0......
|
||||||
|
.......0....
|
||||||
|
....0.......
|
||||||
|
......A.....
|
||||||
|
............
|
||||||
|
............
|
||||||
|
........A...
|
||||||
|
.........A..
|
||||||
|
............
|
||||||
|
............`)
|
||||||
|
assert.Equal(t, 11387, r)
|
||||||
|
}
|
||||||
50
2024/gareth/day08/input.txt
Normal file
50
2024/gareth/day08/input.txt
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
........................E...j......W..........L...
|
||||||
|
............................O........E.........L..
|
||||||
|
..q......O...........l....................K.......
|
||||||
|
............q...................HM......W.........
|
||||||
|
................................1..H...........IW.
|
||||||
|
....................5.............................
|
||||||
|
..........k........M...wl............6............
|
||||||
|
.....O.......w...k.....5.8..l......K.........o.6..
|
||||||
|
.......k....w.........5.........R.....o........K..
|
||||||
|
.....q..X..............j........E...I.........K...
|
||||||
|
............O..........E........................H.
|
||||||
|
................Mn.h2.w.p....................H....
|
||||||
|
..................p.......a............j.....L....
|
||||||
|
.....X...l.p.....................m.........W..6...
|
||||||
|
..Xq................A..................R..m.......
|
||||||
|
.........................i..........a..........R..
|
||||||
|
...........u.....................a........I.....2.
|
||||||
|
k..............A..n.........R.................o...
|
||||||
|
................n.................Qo..............
|
||||||
|
..........u.A.........h........2..................
|
||||||
|
...5.......Y.....p...............iN...............
|
||||||
|
1...x.....................i.......................
|
||||||
|
........M..............2.....Qi...................
|
||||||
|
...............................I..e...............
|
||||||
|
......u......A...........m..........h.............
|
||||||
|
.......1...........U.............Qm.......j.......
|
||||||
|
.......X.......................................9..
|
||||||
|
.....u........U.......Y...........................
|
||||||
|
.............................h.e..................
|
||||||
|
..................4....e......Q.....L....N........
|
||||||
|
.1..................4.......................y8....
|
||||||
|
.........Y................................8.N.....
|
||||||
|
............P.0J...........3..........8y..........
|
||||||
|
....V3P..........J................................
|
||||||
|
............U..P...7x...........e.................
|
||||||
|
....................J...............r...9.........
|
||||||
|
.........0.V......Y...............................
|
||||||
|
...............V.4................................
|
||||||
|
..........V..........................n............
|
||||||
|
..............v........7..........................
|
||||||
|
...........U..........J.......7...................
|
||||||
|
.....v........7..........................a........
|
||||||
|
.......................................r..........
|
||||||
|
...........0.......x................y.............
|
||||||
|
............6..v.x.....................N..........
|
||||||
|
...........P......................................
|
||||||
|
........3.......................r......4..........
|
||||||
|
..............3......................y............
|
||||||
|
................................................9.
|
||||||
|
.................................................9
|
||||||
104
2024/gareth/day09/day09.go
Normal file
104
2024/gareth/day09/day09.go
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
package day09
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
files, gaps, lengthOfFinalFile := parseInput(input)
|
||||||
|
checksum := compactFiles(files, gaps, lengthOfFinalFile)
|
||||||
|
return checksum
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
files, freeSpaces := parseInputPart2(input)
|
||||||
|
checksum := calculateChecksum(files, freeSpaces)
|
||||||
|
return checksum
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) ([]int, []int, int) {
|
||||||
|
var files []int
|
||||||
|
var gaps []int
|
||||||
|
lengthOfFinalFile := 0
|
||||||
|
for i, char := range input {
|
||||||
|
if i%2 == 0 {
|
||||||
|
files = append(files, int(char-'0'))
|
||||||
|
lengthOfFinalFile += int(char - '0')
|
||||||
|
} else {
|
||||||
|
gaps = append(gaps, int(char-'0'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return files, gaps, lengthOfFinalFile
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInputPart2(input string) ([][]int, [][]int) {
|
||||||
|
files, freeSpaces, position := [][]int{}, [][]int{}, 0
|
||||||
|
for index, char := range input {
|
||||||
|
length := int(char - '0')
|
||||||
|
if index%2 == 0 {
|
||||||
|
files = append(files, generateRange(position, position+length))
|
||||||
|
} else {
|
||||||
|
freeSpaces = append(freeSpaces, generateRange(position, position+length))
|
||||||
|
}
|
||||||
|
position += length
|
||||||
|
}
|
||||||
|
return files, freeSpaces
|
||||||
|
}
|
||||||
|
|
||||||
|
func compactFiles(files []int, gaps []int, lengthOfFinalFile int) int {
|
||||||
|
fileIndex := len(files) - 1
|
||||||
|
gapIndex := 0
|
||||||
|
position := files[0]
|
||||||
|
checksum := 0
|
||||||
|
fileID := files[0]
|
||||||
|
|
||||||
|
for lengthOfFinalFile != position {
|
||||||
|
// If there's a gap and a file to move then move the file
|
||||||
|
if gaps[gapIndex] > 0 && files[fileIndex] > 0 {
|
||||||
|
files[fileIndex]--
|
||||||
|
gaps[gapIndex]--
|
||||||
|
checksum += fileIndex * position
|
||||||
|
position++
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this file is fully moved go to next file
|
||||||
|
if files[fileIndex] == 0 {
|
||||||
|
fileIndex--
|
||||||
|
fileID++
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update gapIndex if this gap is filled
|
||||||
|
if gaps[gapIndex] == 0 {
|
||||||
|
gapIndex++
|
||||||
|
for f := 0; f < files[gapIndex]; f++ {
|
||||||
|
checksum += gapIndex * position
|
||||||
|
position++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return checksum
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateRange(start, end int) []int {
|
||||||
|
rangeList := make([]int, end-start)
|
||||||
|
for i := range rangeList {
|
||||||
|
rangeList[i] = start + i
|
||||||
|
}
|
||||||
|
return rangeList
|
||||||
|
}
|
||||||
|
|
||||||
|
func calculateChecksum(files, freeSpaces [][]int) int {
|
||||||
|
checksum := 0
|
||||||
|
for fileIndex := len(files) - 1; fileIndex >= 0; fileIndex-- {
|
||||||
|
for spaceIndex := 0; spaceIndex < len(freeSpaces); spaceIndex++ {
|
||||||
|
if len(freeSpaces[spaceIndex]) >= len(files[fileIndex]) && files[fileIndex][0] > freeSpaces[spaceIndex][0] {
|
||||||
|
files[fileIndex] = freeSpaces[spaceIndex][:len(files[fileIndex])]
|
||||||
|
freeSpaces[spaceIndex] = freeSpaces[spaceIndex][len(files[fileIndex]):]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for fileID, file := range files {
|
||||||
|
for _, block := range file {
|
||||||
|
checksum += fileID * block
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return checksum
|
||||||
|
}
|
||||||
22
2024/gareth/day09/day09_test.go
Normal file
22
2024/gareth/day09/day09_test.go
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
package day09
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`12345`)
|
||||||
|
assert.Equal(t, 60, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart1Long(t *testing.T) {
|
||||||
|
r := Part1(`2333133121414131402`)
|
||||||
|
assert.Equal(t, 1928, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`2333133121414131402`)
|
||||||
|
assert.Equal(t, 2858, r)
|
||||||
|
}
|
||||||
1
2024/gareth/day09/input.txt
Normal file
1
2024/gareth/day09/input.txt
Normal file
File diff suppressed because one or more lines are too long
141
2024/gareth/day10/day10.go
Normal file
141
2024/gareth/day10/day10.go
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
package day10
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var directions = [][2]int{
|
||||||
|
{-1, 0},
|
||||||
|
{1, 0},
|
||||||
|
{0, -1},
|
||||||
|
{0, 1},
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
grid := ParseInput(input)
|
||||||
|
return CalculateTotalTrailheadScore(grid)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
grid := ParseInput(input)
|
||||||
|
return CalculateTotalTrailheadRating(grid)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseInput(input string) [][]int {
|
||||||
|
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||||
|
grid := make([][]int, len(lines))
|
||||||
|
for i, line := range lines {
|
||||||
|
grid[i] = make([]int, len(line))
|
||||||
|
for j, char := range line {
|
||||||
|
grid[i][j] = int(char - '0')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return grid
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsValidPosition(x, y, rows, cols int) bool {
|
||||||
|
return x >= 0 && x < rows && y >= 0 && y < cols
|
||||||
|
}
|
||||||
|
|
||||||
|
func DFS(grid [][]int, x, y, prevHeight int, visited [][]bool, reached9 map[[2]int]bool) {
|
||||||
|
rows := len(grid)
|
||||||
|
cols := len(grid[0])
|
||||||
|
if !IsValidPosition(x, y, rows, cols) || visited[x][y] || grid[x][y] != prevHeight+1 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if grid[x][y] == 9 {
|
||||||
|
reached9[[2]int{x, y}] = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
visited[x][y] = true
|
||||||
|
for _, dir := range directions {
|
||||||
|
nx, ny := x+dir[0], y+dir[1]
|
||||||
|
DFS(grid, nx, ny, grid[x][y], visited, reached9)
|
||||||
|
}
|
||||||
|
visited[x][y] = false
|
||||||
|
}
|
||||||
|
|
||||||
|
func CalculateTrailheadScore(grid [][]int, x, y int) int {
|
||||||
|
rows := len(grid)
|
||||||
|
cols := len(grid[0])
|
||||||
|
visited := make([][]bool, rows)
|
||||||
|
for i := range visited {
|
||||||
|
visited[i] = make([]bool, cols)
|
||||||
|
}
|
||||||
|
|
||||||
|
reached9 := make(map[[2]int]bool)
|
||||||
|
DFS(grid, x, y, -1, visited, reached9)
|
||||||
|
return len(reached9)
|
||||||
|
}
|
||||||
|
|
||||||
|
func DFSForRatings(grid [][]int, x, y, prevHeight int, visited [][]bool, trailCache map[[3]int]int) int {
|
||||||
|
rows := len(grid)
|
||||||
|
cols := len(grid[0])
|
||||||
|
if !IsValidPosition(x, y, rows, cols) || visited[x][y] || grid[x][y] != prevHeight+1 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if grid[x][y] == 9 {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
cacheKey := [3]int{x, y, grid[x][y]}
|
||||||
|
if count, exists := trailCache[cacheKey]; exists {
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
visited[x][y] = true
|
||||||
|
totalTrails := 0
|
||||||
|
for _, dir := range directions {
|
||||||
|
nx, ny := x+dir[0], y+dir[1]
|
||||||
|
totalTrails += DFSForRatings(grid, nx, ny, grid[x][y], visited, trailCache)
|
||||||
|
}
|
||||||
|
visited[x][y] = false
|
||||||
|
|
||||||
|
trailCache[cacheKey] = totalTrails
|
||||||
|
return totalTrails
|
||||||
|
}
|
||||||
|
|
||||||
|
func CalculateTrailheadRating(grid [][]int, x, y int) int {
|
||||||
|
rows := len(grid)
|
||||||
|
cols := len(grid[0])
|
||||||
|
visited := make([][]bool, rows)
|
||||||
|
for i := range visited {
|
||||||
|
visited[i] = make([]bool, cols)
|
||||||
|
}
|
||||||
|
|
||||||
|
trailCache := make(map[[3]int]int)
|
||||||
|
return DFSForRatings(grid, x, y, -1, visited, trailCache)
|
||||||
|
}
|
||||||
|
|
||||||
|
func CalculateTotalTrailheadScore(grid [][]int) int {
|
||||||
|
rows := len(grid)
|
||||||
|
cols := len(grid[0])
|
||||||
|
totalScore := 0
|
||||||
|
for i := 0; i < rows; i++ {
|
||||||
|
for j := 0; j < cols; j++ {
|
||||||
|
if grid[i][j] == 0 {
|
||||||
|
score := CalculateTrailheadScore(grid, i, j)
|
||||||
|
totalScore += score
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return totalScore
|
||||||
|
}
|
||||||
|
|
||||||
|
func CalculateTotalTrailheadRating(grid [][]int) int {
|
||||||
|
rows := len(grid)
|
||||||
|
cols := len(grid[0])
|
||||||
|
totalRating := 0
|
||||||
|
for i := 0; i < rows; i++ {
|
||||||
|
for j := 0; j < cols; j++ {
|
||||||
|
if grid[i][j] == 0 {
|
||||||
|
rating := CalculateTrailheadRating(grid, i, j)
|
||||||
|
totalRating += rating
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return totalRating
|
||||||
|
}
|
||||||
31
2024/gareth/day10/day10_test.go
Normal file
31
2024/gareth/day10/day10_test.go
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package day10
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`89010123
|
||||||
|
78121874
|
||||||
|
87430965
|
||||||
|
96549874
|
||||||
|
45678903
|
||||||
|
32019012
|
||||||
|
01329801
|
||||||
|
10456732`)
|
||||||
|
assert.Equal(t, 36, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`89010123
|
||||||
|
78121874
|
||||||
|
87430965
|
||||||
|
96549874
|
||||||
|
45678903
|
||||||
|
32019012
|
||||||
|
01329801
|
||||||
|
10456732`)
|
||||||
|
assert.Equal(t, 81, r)
|
||||||
|
}
|
||||||
45
2024/gareth/day10/input.txt
Normal file
45
2024/gareth/day10/input.txt
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
987123434330121232101001234730123456781067632
|
||||||
|
876076576521010345692340349823212347892398701
|
||||||
|
945087689432105676787659856714503210987445610
|
||||||
|
332196576587654989801456787609654502376530923
|
||||||
|
211543210298923215432321098128778901430121894
|
||||||
|
300692340147210106523543210039569876589836765
|
||||||
|
456781678236103267015693016543410231276745650
|
||||||
|
576890549345234178106782187612320140345654321
|
||||||
|
985098432100125089235493498109876056034765012
|
||||||
|
834127102345456978340362569018765487123876678
|
||||||
|
123236221976347869651251078729034398101985589
|
||||||
|
014545340889298958707867897430120987012834432
|
||||||
|
105965456770107843216950956541231276543124501
|
||||||
|
896872378761016930345441019876501345678023670
|
||||||
|
787901069654325321210332398545432330589012981
|
||||||
|
107821543213034321089206787638901421432103210
|
||||||
|
215430694102123475670115896129876548901210349
|
||||||
|
126989780210014984308924925014578037654321458
|
||||||
|
037878921001235675217833210123669123109452367
|
||||||
|
549865438901045102346542106548754321278501476
|
||||||
|
678954987432696201256430087239689870347699985
|
||||||
|
230143006501787349961021298101236787656788014
|
||||||
|
123272112981010458872787034010345691875107623
|
||||||
|
054387623472129867763698125676210010961234510
|
||||||
|
565694502561036789854567012980387121250129878
|
||||||
|
676783411051045672343218763901296030343278569
|
||||||
|
989872123432345891050109654812345145467303450
|
||||||
|
012763094321056700891760345765432256958912341
|
||||||
|
103450185789763211709851236876301967843211032
|
||||||
|
814321276656854345612345654954101878701208983
|
||||||
|
923434434565956745678036783063210989870345674
|
||||||
|
874532345410345832989123192178981876781456564
|
||||||
|
265101654323234901808765013265432185692387565
|
||||||
|
103216765432101267814554323476501094501893474
|
||||||
|
232109856321011876923601098789678923432102985
|
||||||
|
343898707896540945498712367765672310567891078
|
||||||
|
456789010987231234321203456894581455454986569
|
||||||
|
556776125670102343100157654503490166303890432
|
||||||
|
543895434894321765212348983212321876212761201
|
||||||
|
432104898765010894301054581200110955211654300
|
||||||
|
301256567656987105498765690341034567300563212
|
||||||
|
434567430547896234787654785652123498456767843
|
||||||
|
321798121032345375696543098743096567877854952
|
||||||
|
210899021121036789781232143456787656928923761
|
||||||
|
326765430110145678710123232109876543210010890
|
||||||
89
2024/gareth/day11/day11.go
Normal file
89
2024/gareth/day11/day11.go
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
package day11
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
stones := ParseInput(input)
|
||||||
|
return len(blinkTimes(stones, 25))
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
stones := ParseInput(input)
|
||||||
|
return getNumStones(stones, 75)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseInput(input string) []int {
|
||||||
|
strStones := strings.Split(strings.TrimSpace(input), " ")
|
||||||
|
stones := make([]int, 0, len(strStones))
|
||||||
|
for _, s := range strStones {
|
||||||
|
num, _ := strconv.Atoi(s)
|
||||||
|
stones = append(stones, num)
|
||||||
|
}
|
||||||
|
return stones
|
||||||
|
}
|
||||||
|
|
||||||
|
// Part 1 initial thought of recursion
|
||||||
|
func blinkTimes(stones []int, times int) []int {
|
||||||
|
if times <= 0 {
|
||||||
|
return stones
|
||||||
|
}
|
||||||
|
result := blink(stones)
|
||||||
|
return blinkTimes(result, times-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func blink(stones []int) []int {
|
||||||
|
result := make([]int, 0)
|
||||||
|
for _, stone := range stones {
|
||||||
|
strStone := strconv.Itoa(stone)
|
||||||
|
if stone == 0 {
|
||||||
|
result = append(result, 1)
|
||||||
|
} else if len(strStone)%2 == 0 {
|
||||||
|
mid := len(strStone) / 2
|
||||||
|
firstHalf, _ := strconv.Atoi(strStone[:mid])
|
||||||
|
secondHalf, _ := strconv.Atoi(strStone[mid:])
|
||||||
|
result = append(result, firstHalf, secondHalf)
|
||||||
|
} else {
|
||||||
|
result = append(result, stone*2024)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Part 2 with maps since blinkTimes(75) would set my computer on fire
|
||||||
|
func getNumStones(s []int, times int) int {
|
||||||
|
stoneMap := make(map[int]int)
|
||||||
|
for _, stone := range s {
|
||||||
|
stoneMap[stone] = stoneMap[stone] + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < times; i++ {
|
||||||
|
stoneMap2 := make(map[int]int)
|
||||||
|
for stone, count := range stoneMap {
|
||||||
|
stones := make([]int, 0)
|
||||||
|
strStone := strconv.Itoa(stone)
|
||||||
|
if stone == 0 {
|
||||||
|
stones = append(stones, 1)
|
||||||
|
} else if len(strStone)%2 == 0 {
|
||||||
|
mid := len(strStone) / 2
|
||||||
|
firstHalf, _ := strconv.Atoi(strStone[:mid])
|
||||||
|
secondHalf, _ := strconv.Atoi(strStone[mid:])
|
||||||
|
stones = append(stones, firstHalf, secondHalf)
|
||||||
|
} else {
|
||||||
|
stones = append(stones, stone*2024)
|
||||||
|
}
|
||||||
|
for _, newStone := range stones {
|
||||||
|
stoneMap2[newStone] = stoneMap2[newStone] + count
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stoneMap = stoneMap2
|
||||||
|
}
|
||||||
|
|
||||||
|
result := 0
|
||||||
|
for _, count := range stoneMap {
|
||||||
|
result += count
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
12
2024/gareth/day11/day11_test.go
Normal file
12
2024/gareth/day11/day11_test.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package day11
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`125 17`)
|
||||||
|
assert.Equal(t, 55312, r)
|
||||||
|
}
|
||||||
1
2024/gareth/day11/input.txt
Normal file
1
2024/gareth/day11/input.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
965842 9159 3372473 311 0 6 86213 48
|
||||||
76
2024/gareth/day13/day13.go
Normal file
76
2024/gareth/day13/day13.go
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
package day13
|
||||||
|
|
||||||
|
import (
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ClawMachine struct {
|
||||||
|
Ax, Ay int
|
||||||
|
Bx, By int
|
||||||
|
Px, Py int
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
clawMachines := parseInput(input)
|
||||||
|
total := 0
|
||||||
|
for _, c := range clawMachines {
|
||||||
|
x, y := solveSimEquations(c.Ax, c.Bx, c.Px, c.Ay, c.By, c.Py)
|
||||||
|
total += x*3 + y
|
||||||
|
}
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
clawMachines := parseInput(input)
|
||||||
|
total := 0
|
||||||
|
for _, c := range clawMachines {
|
||||||
|
prizeX, prizeY := c.Px+10000000000000, c.Py+10000000000000
|
||||||
|
det, x, y := c.Ax*c.By-c.Bx*c.Ay, prizeX*c.By-c.Bx*prizeY, c.Ax*prizeY-prizeX*c.Ay
|
||||||
|
if det != 0 && x == (x/det)*det && y == (y/det)*det {
|
||||||
|
total += (x/det)*3 + (y / det)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) []ClawMachine {
|
||||||
|
clawMachines := strings.Split(strings.TrimSpace(input), "\n\n")
|
||||||
|
output := make([]ClawMachine, 0, len(clawMachines))
|
||||||
|
for _, c := range clawMachines {
|
||||||
|
var clawMachine ClawMachine
|
||||||
|
line := strings.Split(strings.TrimSpace(c), "\n")
|
||||||
|
|
||||||
|
re := regexp.MustCompile(`X\+(\d+), Y\+(\d+)`)
|
||||||
|
matches := re.FindStringSubmatch(line[0])
|
||||||
|
clawMachine.Ax, _ = strconv.Atoi(matches[1])
|
||||||
|
clawMachine.Ay, _ = strconv.Atoi(matches[2])
|
||||||
|
|
||||||
|
matches = re.FindStringSubmatch(line[1])
|
||||||
|
clawMachine.Bx, _ = strconv.Atoi(matches[1])
|
||||||
|
clawMachine.By, _ = strconv.Atoi(matches[2])
|
||||||
|
|
||||||
|
re = regexp.MustCompile(`X=(\d+), Y=(\d+)`)
|
||||||
|
matches = re.FindStringSubmatch(line[2])
|
||||||
|
clawMachine.Px, _ = strconv.Atoi(matches[1])
|
||||||
|
clawMachine.Py, _ = strconv.Atoi(matches[2])
|
||||||
|
|
||||||
|
output = append(output, clawMachine)
|
||||||
|
}
|
||||||
|
return output
|
||||||
|
}
|
||||||
|
|
||||||
|
func solveSimEquations(a1, b1, c1, a2, b2, c2 int) (int, int) {
|
||||||
|
det := a1*b2 - a2*b1
|
||||||
|
if det == 0 || (c1*b2-c2*b1)%det != 0 || (a1*c2-a2*c1)%det != 0 {
|
||||||
|
return 0, 0
|
||||||
|
}
|
||||||
|
x := (c1*b2 - c2*b1) / det
|
||||||
|
y := (a1*c2 - a2*c1) / det
|
||||||
|
if x < 0 || x > 100 || y < 0 || y > 100 {
|
||||||
|
return 0, 0
|
||||||
|
}
|
||||||
|
return x, y
|
||||||
|
}
|
||||||
45
2024/gareth/day13/day13_test.go
Normal file
45
2024/gareth/day13/day13_test.go
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
package day13
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`Button A: X+94, Y+34
|
||||||
|
Button B: X+22, Y+67
|
||||||
|
Prize: X=8400, Y=5400
|
||||||
|
|
||||||
|
Button A: X+26, Y+66
|
||||||
|
Button B: X+67, Y+21
|
||||||
|
Prize: X=12748, Y=12176
|
||||||
|
|
||||||
|
Button A: X+17, Y+86
|
||||||
|
Button B: X+84, Y+37
|
||||||
|
Prize: X=7870, Y=6450
|
||||||
|
|
||||||
|
Button A: X+69, Y+23
|
||||||
|
Button B: X+27, Y+71
|
||||||
|
Prize: X=18641, Y=10279`)
|
||||||
|
assert.Equal(t, 480, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`Button A: X+94, Y+34
|
||||||
|
Button B: X+22, Y+67
|
||||||
|
Prize: X=8400, Y=5400
|
||||||
|
|
||||||
|
Button A: X+26, Y+66
|
||||||
|
Button B: X+67, Y+21
|
||||||
|
Prize: X=12748, Y=12176
|
||||||
|
|
||||||
|
Button A: X+17, Y+86
|
||||||
|
Button B: X+84, Y+37
|
||||||
|
Prize: X=7870, Y=6450
|
||||||
|
|
||||||
|
Button A: X+69, Y+23
|
||||||
|
Button B: X+27, Y+71
|
||||||
|
Prize: X=18641, Y=10279`)
|
||||||
|
assert.Equal(t, 0, r)
|
||||||
|
}
|
||||||
1279
2024/gareth/day13/input.txt
Normal file
1279
2024/gareth/day13/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
172
2024/gareth/day14/day14.go
Normal file
172
2024/gareth/day14/day14.go
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
package day14
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Robot struct {
|
||||||
|
px, py int // position
|
||||||
|
vx, vy int // velocity
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
// Parse the input
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
var robots []Robot
|
||||||
|
for _, line := range lines {
|
||||||
|
robot := ParseRobot(line)
|
||||||
|
robots = append(robots, robot)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define grid size
|
||||||
|
gridWidth := 101
|
||||||
|
gridHeight := 103
|
||||||
|
|
||||||
|
// Update robot positions for 100 seconds
|
||||||
|
for i := 0; i < 100; i++ {
|
||||||
|
for j := range robots {
|
||||||
|
robots[j].UpdatePosition(gridWidth, gridHeight)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Count the robots in each quadrant
|
||||||
|
q1, q2, q3, q4 := CountRobotsInQuadrants(robots, gridWidth, gridHeight)
|
||||||
|
fmt.Printf("Quadrant counts: Q1=%d, Q2=%d, Q3=%d, Q4=%d\n", q1, q2, q3, q4)
|
||||||
|
|
||||||
|
// Calculate the safety factor
|
||||||
|
safetyFactor := CalculateSafetyFactor(q1, q2, q3, q4)
|
||||||
|
fmt.Printf("Safety Factor: %d\n", safetyFactor)
|
||||||
|
return safetyFactor
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
// Parse the input
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
var robots []Robot
|
||||||
|
for _, line := range lines {
|
||||||
|
robot := ParseRobot(line)
|
||||||
|
robots = append(robots, robot)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define grid size
|
||||||
|
gridWidth := 101
|
||||||
|
gridHeight := 103
|
||||||
|
|
||||||
|
// Update robot positions for 100 seconds
|
||||||
|
for i := 0; i < 6285; i++ {
|
||||||
|
for j := range robots {
|
||||||
|
robots[j].UpdatePosition(gridWidth, gridHeight)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DisplayGrid(robots, gridWidth, gridHeight)
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParseRobot takes a line of input and converts it to a Robot struct
|
||||||
|
func ParseRobot(line string) Robot {
|
||||||
|
parts := strings.Split(line, " ")
|
||||||
|
posParts := strings.Split(parts[0][2:], ",") // Extract p=x,y and split
|
||||||
|
velParts := strings.Split(parts[1][2:], ",") // Extract v=x,y and split
|
||||||
|
|
||||||
|
px, _ := strconv.Atoi(posParts[0])
|
||||||
|
py, _ := strconv.Atoi(posParts[1])
|
||||||
|
vx, _ := strconv.Atoi(velParts[0])
|
||||||
|
vy, _ := strconv.Atoi(velParts[1])
|
||||||
|
|
||||||
|
return Robot{px, py, vx, vy}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdatePosition updates the position of a robot, considering the wrap-around
|
||||||
|
func (r *Robot) UpdatePosition(gridWidth, gridHeight int) {
|
||||||
|
r.px = (r.px + r.vx + gridWidth) % gridWidth
|
||||||
|
r.py = (r.py + r.vy + gridHeight) % gridHeight
|
||||||
|
}
|
||||||
|
|
||||||
|
// CountRobotsInQuadrants counts the number of robots in each of the four quadrants
|
||||||
|
func CountRobotsInQuadrants(robots []Robot, width, height int) (int, int, int, int) {
|
||||||
|
midX := width / 2
|
||||||
|
midY := height / 2
|
||||||
|
|
||||||
|
q1, q2, q3, q4 := 0, 0, 0, 0
|
||||||
|
|
||||||
|
for _, r := range robots {
|
||||||
|
if r.px == midX || r.py == midY {
|
||||||
|
// Skip robots on the middle line
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if r.px < midX && r.py < midY {
|
||||||
|
q1++ // Top-left quadrant
|
||||||
|
} else if r.px > midX && r.py < midY {
|
||||||
|
q2++ // Top-right quadrant
|
||||||
|
} else if r.px < midX && r.py > midY {
|
||||||
|
q3++ // Bottom-left quadrant
|
||||||
|
} else if r.px > midX && r.py > midY {
|
||||||
|
q4++ // Bottom-right quadrant
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return q1, q2, q3, q4
|
||||||
|
}
|
||||||
|
|
||||||
|
// CalculateSafetyFactor multiplies the number of robots in each quadrant
|
||||||
|
func CalculateSafetyFactor(q1, q2, q3, q4 int) int {
|
||||||
|
return q1 * q2 * q3 * q4
|
||||||
|
}
|
||||||
|
|
||||||
|
// DisplayGrid displays the current state of the grid
|
||||||
|
func DisplayGrid(robots []Robot, width, height int) {
|
||||||
|
grid := make([][]rune, height)
|
||||||
|
for i := range grid {
|
||||||
|
grid[i] = make([]rune, width)
|
||||||
|
for j := range grid[i] {
|
||||||
|
grid[i][j] = '.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, r := range robots {
|
||||||
|
grid[r.py][r.px] = '#'
|
||||||
|
}
|
||||||
|
for _, row := range grid {
|
||||||
|
fmt.Println(string(row))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindEasterEgg determines the fewest number of seconds that must elapse for the robots to display the Easter egg
|
||||||
|
func FindEasterEgg(robots []Robot, width, height int) int {
|
||||||
|
smallestArea := width * height
|
||||||
|
bestTime := 0
|
||||||
|
for t := 6285; t < 6286; t++ { // Large upper limit to search
|
||||||
|
// Update robot positions
|
||||||
|
for i := range robots {
|
||||||
|
robots[i].UpdatePosition(width, height)
|
||||||
|
}
|
||||||
|
// Calculate the bounding box of all robot positions
|
||||||
|
minX, minY := width, height
|
||||||
|
maxX, maxY := 0, 0
|
||||||
|
for _, r := range robots {
|
||||||
|
if r.px < minX {
|
||||||
|
minX = r.px
|
||||||
|
}
|
||||||
|
if r.px > maxX {
|
||||||
|
maxX = r.px
|
||||||
|
}
|
||||||
|
if r.py < minY {
|
||||||
|
minY = r.py
|
||||||
|
}
|
||||||
|
if r.py > maxY {
|
||||||
|
maxY = r.py
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
area := (maxX - minX + 1) * (maxY - minY + 1)
|
||||||
|
if area < smallestArea {
|
||||||
|
smallestArea = area
|
||||||
|
bestTime = t + 1
|
||||||
|
fmt.Printf("Time: %d\n", bestTime)
|
||||||
|
DisplayGrid(robots, width, height)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bestTime
|
||||||
|
}
|
||||||
23
2024/gareth/day14/day14_test.go
Normal file
23
2024/gareth/day14/day14_test.go
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package day14
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`p=0,4 v=3,-3
|
||||||
|
p=6,3 v=-1,-3
|
||||||
|
p=10,3 v=-1,2
|
||||||
|
p=2,0 v=2,-1
|
||||||
|
p=0,0 v=1,3
|
||||||
|
p=3,0 v=-2,-2
|
||||||
|
p=7,6 v=-1,-3
|
||||||
|
p=3,0 v=-1,-2
|
||||||
|
p=9,3 v=2,3
|
||||||
|
p=7,3 v=-1,2
|
||||||
|
p=2,4 v=2,-3
|
||||||
|
p=9,5 v=-3,-3`)
|
||||||
|
assert.Equal(t, 12, r)
|
||||||
|
}
|
||||||
500
2024/gareth/day14/input.txt
Normal file
500
2024/gareth/day14/input.txt
Normal file
@@ -0,0 +1,500 @@
|
|||||||
|
p=38,76 v=-61,88
|
||||||
|
p=28,22 v=-43,-40
|
||||||
|
p=76,78 v=-98,87
|
||||||
|
p=39,56 v=10,96
|
||||||
|
p=38,0 v=79,-15
|
||||||
|
p=6,44 v=-88,53
|
||||||
|
p=40,80 v=-83,31
|
||||||
|
p=11,2 v=28,-31
|
||||||
|
p=41,91 v=-86,-48
|
||||||
|
p=8,55 v=-81,95
|
||||||
|
p=77,19 v=3,-90
|
||||||
|
p=94,73 v=-59,42
|
||||||
|
p=51,53 v=35,48
|
||||||
|
p=12,52 v=72,6
|
||||||
|
p=62,61 v=96,47
|
||||||
|
p=78,62 v=47,-57
|
||||||
|
p=39,54 v=53,50
|
||||||
|
p=1,43 v=-64,-46
|
||||||
|
p=9,21 v=28,-36
|
||||||
|
p=92,79 v=67,-47
|
||||||
|
p=6,15 v=-58,-48
|
||||||
|
p=54,67 v=99,-38
|
||||||
|
p=96,99 v=-55,30
|
||||||
|
p=90,44 v=-10,-8
|
||||||
|
p=23,84 v=20,77
|
||||||
|
p=5,84 v=28,88
|
||||||
|
p=55,20 v=-31,-36
|
||||||
|
p=84,43 v=-37,-41
|
||||||
|
p=12,75 v=-38,30
|
||||||
|
p=39,2 v=-12,-29
|
||||||
|
p=74,14 v=56,-81
|
||||||
|
p=63,53 v=22,-53
|
||||||
|
p=51,28 v=9,-90
|
||||||
|
p=53,72 v=48,-61
|
||||||
|
p=33,42 v=-43,23
|
||||||
|
p=75,18 v=-89,-37
|
||||||
|
p=38,83 v=27,38
|
||||||
|
p=69,31 v=61,80
|
||||||
|
p=73,3 v=-45,74
|
||||||
|
p=39,29 v=92,17
|
||||||
|
p=78,45 v=-23,-47
|
||||||
|
p=48,59 v=-57,38
|
||||||
|
p=2,41 v=-71,-93
|
||||||
|
p=30,13 v=36,-82
|
||||||
|
p=37,57 v=25,13
|
||||||
|
p=51,73 v=56,-98
|
||||||
|
p=76,78 v=38,91
|
||||||
|
p=56,49 v=22,55
|
||||||
|
p=34,47 v=10,84
|
||||||
|
p=83,93 v=81,-16
|
||||||
|
p=14,70 v=71,-50
|
||||||
|
p=97,74 v=-4,70
|
||||||
|
p=33,8 v=93,-35
|
||||||
|
p=39,70 v=-2,19
|
||||||
|
p=94,63 v=20,44
|
||||||
|
p=86,4 v=-33,19
|
||||||
|
p=17,67 v=26,44
|
||||||
|
p=39,2 v=-70,-25
|
||||||
|
p=47,56 v=-79,-55
|
||||||
|
p=5,98 v=86,-75
|
||||||
|
p=53,21 v=79,-89
|
||||||
|
p=53,85 v=61,73
|
||||||
|
p=46,32 v=66,54
|
||||||
|
p=30,75 v=49,-73
|
||||||
|
p=44,81 v=-61,-69
|
||||||
|
p=82,66 v=-72,-6
|
||||||
|
p=89,76 v=-13,98
|
||||||
|
p=57,87 v=30,36
|
||||||
|
p=12,41 v=59,-40
|
||||||
|
p=36,56 v=10,-61
|
||||||
|
p=60,80 v=48,39
|
||||||
|
p=50,75 v=-44,42
|
||||||
|
p=66,56 v=-93,-1
|
||||||
|
p=57,96 v=83,-79
|
||||||
|
p=98,88 v=-15,-16
|
||||||
|
p=0,63 v=59,44
|
||||||
|
p=90,27 v=29,-40
|
||||||
|
p=21,60 v=-86,2
|
||||||
|
p=85,13 v=11,61
|
||||||
|
p=92,77 v=24,-34
|
||||||
|
p=16,24 v=80,4
|
||||||
|
p=47,8 v=-79,-49
|
||||||
|
p=1,28 v=-82,-48
|
||||||
|
p=80,55 v=6,-72
|
||||||
|
p=60,94 v=-67,-15
|
||||||
|
p=83,90 v=-98,78
|
||||||
|
p=3,75 v=46,-66
|
||||||
|
p=93,40 v=15,11
|
||||||
|
p=52,37 v=48,7
|
||||||
|
p=23,4 v=-47,25
|
||||||
|
p=46,43 v=57,-98
|
||||||
|
p=23,12 v=-98,-36
|
||||||
|
p=11,42 v=-83,50
|
||||||
|
p=80,33 v=25,54
|
||||||
|
p=59,95 v=-1,36
|
||||||
|
p=55,67 v=-44,-60
|
||||||
|
p=90,80 v=83,-39
|
||||||
|
p=57,61 v=-1,96
|
||||||
|
p=51,79 v=31,39
|
||||||
|
p=28,89 v=85,35
|
||||||
|
p=12,98 v=28,-80
|
||||||
|
p=25,61 v=-95,-50
|
||||||
|
p=77,84 v=-37,78
|
||||||
|
p=50,80 v=66,89
|
||||||
|
p=93,32 v=-15,-45
|
||||||
|
p=30,4 v=-96,-29
|
||||||
|
p=81,95 v=14,-66
|
||||||
|
p=23,3 v=42,-16
|
||||||
|
p=33,69 v=-96,-10
|
||||||
|
p=28,23 v=-43,68
|
||||||
|
p=77,25 v=-45,-41
|
||||||
|
p=27,96 v=-69,-32
|
||||||
|
p=41,15 v=-53,-35
|
||||||
|
p=66,81 v=-22,5
|
||||||
|
p=5,15 v=13,-95
|
||||||
|
p=88,1 v=-59,-26
|
||||||
|
p=48,41 v=16,-19
|
||||||
|
p=88,75 v=33,46
|
||||||
|
p=21,9 v=-64,-86
|
||||||
|
p=36,4 v=-16,-95
|
||||||
|
p=68,22 v=-5,65
|
||||||
|
p=8,43 v=-34,46
|
||||||
|
p=71,68 v=-49,-59
|
||||||
|
p=37,92 v=-48,-18
|
||||||
|
p=59,43 v=-21,-10
|
||||||
|
p=69,31 v=30,58
|
||||||
|
p=90,77 v=46,-74
|
||||||
|
p=42,42 v=-76,20
|
||||||
|
p=58,34 v=78,55
|
||||||
|
p=18,10 v=33,2
|
||||||
|
p=23,92 v=45,-69
|
||||||
|
p=23,45 v=-32,27
|
||||||
|
p=63,50 v=39,-96
|
||||||
|
p=8,72 v=-34,85
|
||||||
|
p=22,102 v=-69,26
|
||||||
|
p=73,14 v=-45,-38
|
||||||
|
p=65,54 v=-51,68
|
||||||
|
p=99,29 v=-16,67
|
||||||
|
p=29,60 v=15,-19
|
||||||
|
p=85,76 v=-54,80
|
||||||
|
p=21,23 v=-3,-47
|
||||||
|
p=9,37 v=94,-44
|
||||||
|
p=99,77 v=48,80
|
||||||
|
p=48,47 v=18,56
|
||||||
|
p=26,61 v=36,-57
|
||||||
|
p=80,58 v=56,90
|
||||||
|
p=37,6 v=53,-90
|
||||||
|
p=47,15 v=53,60
|
||||||
|
p=4,79 v=70,52
|
||||||
|
p=35,8 v=31,12
|
||||||
|
p=18,8 v=25,-30
|
||||||
|
p=80,38 v=33,45
|
||||||
|
p=23,26 v=-69,61
|
||||||
|
p=10,35 v=-78,-96
|
||||||
|
p=53,17 v=48,-34
|
||||||
|
p=24,45 v=72,-2
|
||||||
|
p=65,75 v=-1,-38
|
||||||
|
p=5,72 v=-49,39
|
||||||
|
p=63,87 v=-27,-16
|
||||||
|
p=0,46 v=-34,73
|
||||||
|
p=14,46 v=55,-15
|
||||||
|
p=28,70 v=45,92
|
||||||
|
p=29,30 v=89,10
|
||||||
|
p=98,31 v=-46,-89
|
||||||
|
p=1,85 v=-77,82
|
||||||
|
p=30,79 v=-43,28
|
||||||
|
p=29,70 v=-81,65
|
||||||
|
p=51,97 v=13,-25
|
||||||
|
p=76,19 v=-23,18
|
||||||
|
p=36,83 v=-17,91
|
||||||
|
p=52,34 v=-39,-98
|
||||||
|
p=35,46 v=-43,55
|
||||||
|
p=97,13 v=-99,-26
|
||||||
|
p=40,26 v=27,13
|
||||||
|
p=18,38 v=89,57
|
||||||
|
p=45,57 v=-79,-52
|
||||||
|
p=86,76 v=-54,-64
|
||||||
|
p=12,38 v=28,55
|
||||||
|
p=6,56 v=-86,97
|
||||||
|
p=85,100 v=-41,-22
|
||||||
|
p=4,34 v=28,-95
|
||||||
|
p=89,33 v=-4,-73
|
||||||
|
p=82,20 v=-33,-15
|
||||||
|
p=98,5 v=31,43
|
||||||
|
p=85,81 v=73,88
|
||||||
|
p=13,42 v=-90,-49
|
||||||
|
p=93,60 v=-91,-64
|
||||||
|
p=56,7 v=-5,64
|
||||||
|
p=9,5 v=45,76
|
||||||
|
p=61,4 v=74,86
|
||||||
|
p=23,53 v=-7,3
|
||||||
|
p=89,21 v=-38,-74
|
||||||
|
p=13,44 v=-86,10
|
||||||
|
p=96,62 v=-11,96
|
||||||
|
p=5,98 v=-22,3
|
||||||
|
p=26,26 v=-73,-93
|
||||||
|
p=52,95 v=-5,42
|
||||||
|
p=62,50 v=-57,-7
|
||||||
|
p=11,2 v=41,-77
|
||||||
|
p=23,73 v=-2,-97
|
||||||
|
p=34,77 v=-47,-71
|
||||||
|
p=91,58 v=99,43
|
||||||
|
p=41,74 v=-53,42
|
||||||
|
p=75,102 v=55,-81
|
||||||
|
p=89,95 v=30,8
|
||||||
|
p=76,28 v=-80,12
|
||||||
|
p=82,27 v=-43,77
|
||||||
|
p=62,63 v=-97,21
|
||||||
|
p=94,73 v=-58,14
|
||||||
|
p=13,35 v=-47,-46
|
||||||
|
p=56,0 v=61,25
|
||||||
|
p=94,39 v=11,8
|
||||||
|
p=96,53 v=77,-53
|
||||||
|
p=23,78 v=-43,-7
|
||||||
|
p=24,51 v=-74,-86
|
||||||
|
p=77,33 v=60,8
|
||||||
|
p=84,71 v=-76,19
|
||||||
|
p=78,96 v=82,3
|
||||||
|
p=61,92 v=-58,-30
|
||||||
|
p=9,75 v=94,-34
|
||||||
|
p=89,13 v=7,-26
|
||||||
|
p=16,67 v=-25,96
|
||||||
|
p=95,43 v=-25,-54
|
||||||
|
p=39,62 v=18,-40
|
||||||
|
p=41,36 v=17,-65
|
||||||
|
p=2,42 v=86,-10
|
||||||
|
p=29,54 v=55,-2
|
||||||
|
p=51,74 v=-44,92
|
||||||
|
p=75,40 v=-36,-96
|
||||||
|
p=60,15 v=-93,-84
|
||||||
|
p=44,33 v=44,8
|
||||||
|
p=88,51 v=85,-94
|
||||||
|
p=26,60 v=43,62
|
||||||
|
p=94,22 v=-81,-98
|
||||||
|
p=4,50 v=-94,-96
|
||||||
|
p=87,47 v=-55,3
|
||||||
|
p=15,80 v=33,-14
|
||||||
|
p=4,48 v=-24,-48
|
||||||
|
p=57,36 v=-18,-98
|
||||||
|
p=87,12 v=76,63
|
||||||
|
p=53,17 v=-91,-81
|
||||||
|
p=17,96 v=53,6
|
||||||
|
p=91,40 v=95,-46
|
||||||
|
p=23,28 v=-55,55
|
||||||
|
p=81,7 v=-54,16
|
||||||
|
p=62,102 v=-97,-77
|
||||||
|
p=42,31 v=80,-41
|
||||||
|
p=99,53 v=-72,57
|
||||||
|
p=17,29 v=98,58
|
||||||
|
p=24,57 v=84,-48
|
||||||
|
p=98,101 v=-33,-30
|
||||||
|
p=77,82 v=-36,-25
|
||||||
|
p=44,8 v=83,18
|
||||||
|
p=27,35 v=-27,16
|
||||||
|
p=95,58 v=-29,52
|
||||||
|
p=87,40 v=60,-91
|
||||||
|
p=66,1 v=17,24
|
||||||
|
p=17,11 v=63,21
|
||||||
|
p=67,77 v=-23,-11
|
||||||
|
p=91,30 v=-59,64
|
||||||
|
p=22,34 v=7,84
|
||||||
|
p=55,90 v=48,29
|
||||||
|
p=45,45 v=31,50
|
||||||
|
p=12,34 v=65,-86
|
||||||
|
p=40,48 v=18,-1
|
||||||
|
p=39,42 v=75,11
|
||||||
|
p=28,27 v=63,-49
|
||||||
|
p=93,44 v=-81,3
|
||||||
|
p=8,78 v=-51,-15
|
||||||
|
p=6,37 v=-51,-42
|
||||||
|
p=73,89 v=-45,23
|
||||||
|
p=2,80 v=-23,50
|
||||||
|
p=93,37 v=55,-44
|
||||||
|
p=16,52 v=-54,35
|
||||||
|
p=15,17 v=-33,74
|
||||||
|
p=84,37 v=-6,-48
|
||||||
|
p=13,47 v=50,-48
|
||||||
|
p=88,34 v=-79,-39
|
||||||
|
p=16,68 v=50,94
|
||||||
|
p=20,78 v=-99,29
|
||||||
|
p=100,20 v=77,64
|
||||||
|
p=79,2 v=-91,30
|
||||||
|
p=52,0 v=-95,-86
|
||||||
|
p=4,84 v=79,35
|
||||||
|
p=13,74 v=19,-66
|
||||||
|
p=57,55 v=-9,-63
|
||||||
|
p=21,30 v=19,-94
|
||||||
|
p=50,37 v=-66,4
|
||||||
|
p=9,56 v=94,95
|
||||||
|
p=91,59 v=55,-65
|
||||||
|
p=77,15 v=34,-33
|
||||||
|
p=5,100 v=81,-26
|
||||||
|
p=26,96 v=-34,83
|
||||||
|
p=36,64 v=-44,94
|
||||||
|
p=37,65 v=-70,51
|
||||||
|
p=74,6 v=25,-93
|
||||||
|
p=33,78 v=-17,-48
|
||||||
|
p=0,33 v=-6,-39
|
||||||
|
p=3,55 v=-11,96
|
||||||
|
p=32,19 v=-8,-33
|
||||||
|
p=60,53 v=-5,-55
|
||||||
|
p=75,62 v=56,45
|
||||||
|
p=74,71 v=12,-66
|
||||||
|
p=50,74 v=-53,91
|
||||||
|
p=24,90 v=-19,-57
|
||||||
|
p=58,53 v=31,5
|
||||||
|
p=13,95 v=-33,20
|
||||||
|
p=30,98 v=41,-70
|
||||||
|
p=54,78 v=71,-43
|
||||||
|
p=78,73 v=26,53
|
||||||
|
p=66,30 v=-49,60
|
||||||
|
p=81,87 v=-24,-15
|
||||||
|
p=28,27 v=-31,11
|
||||||
|
p=75,18 v=-89,10
|
||||||
|
p=76,82 v=-89,-66
|
||||||
|
p=44,65 v=-17,98
|
||||||
|
p=17,42 v=-7,-5
|
||||||
|
p=75,92 v=-54,32
|
||||||
|
p=95,10 v=-28,-76
|
||||||
|
p=20,36 v=-22,-62
|
||||||
|
p=100,0 v=11,21
|
||||||
|
p=37,39 v=5,-46
|
||||||
|
p=80,50 v=-63,7
|
||||||
|
p=77,28 v=-98,2
|
||||||
|
p=61,41 v=-1,-40
|
||||||
|
p=88,78 v=95,-17
|
||||||
|
p=83,1 v=47,-30
|
||||||
|
p=47,67 v=-30,-9
|
||||||
|
p=14,81 v=-38,82
|
||||||
|
p=40,97 v=-31,76
|
||||||
|
p=76,27 v=37,-70
|
||||||
|
p=25,73 v=80,35
|
||||||
|
p=88,84 v=-33,77
|
||||||
|
p=60,71 v=83,35
|
||||||
|
p=14,93 v=-3,-25
|
||||||
|
p=40,45 v=-35,4
|
||||||
|
p=34,35 v=15,19
|
||||||
|
p=87,100 v=90,-66
|
||||||
|
p=20,90 v=-42,-68
|
||||||
|
p=90,44 v=50,-52
|
||||||
|
p=43,77 v=31,89
|
||||||
|
p=99,81 v=33,-12
|
||||||
|
p=28,35 v=58,-37
|
||||||
|
p=37,52 v=57,6
|
||||||
|
p=48,65 v=-66,23
|
||||||
|
p=63,21 v=39,-35
|
||||||
|
p=91,77 v=-15,-70
|
||||||
|
p=27,28 v=93,-94
|
||||||
|
p=18,61 v=-99,38
|
||||||
|
p=56,36 v=-98,81
|
||||||
|
p=90,75 v=-72,-67
|
||||||
|
p=86,21 v=-13,-46
|
||||||
|
p=20,88 v=89,-74
|
||||||
|
p=17,41 v=-82,-98
|
||||||
|
p=28,65 v=45,-72
|
||||||
|
p=85,15 v=35,41
|
||||||
|
p=39,43 v=-2,-36
|
||||||
|
p=93,72 v=-94,91
|
||||||
|
p=90,73 v=-64,77
|
||||||
|
p=83,43 v=-94,-99
|
||||||
|
p=50,59 v=-49,51
|
||||||
|
p=58,25 v=13,-36
|
||||||
|
p=25,102 v=-44,-54
|
||||||
|
p=100,86 v=16,-23
|
||||||
|
p=45,42 v=21,-90
|
||||||
|
p=9,29 v=-13,18
|
||||||
|
p=24,41 v=1,-47
|
||||||
|
p=69,33 v=-58,55
|
||||||
|
p=80,52 v=52,-2
|
||||||
|
p=82,77 v=82,-11
|
||||||
|
p=86,78 v=-41,-69
|
||||||
|
p=89,58 v=69,-13
|
||||||
|
p=12,91 v=-55,-65
|
||||||
|
p=69,40 v=-93,59
|
||||||
|
p=8,26 v=2,19
|
||||||
|
p=21,47 v=19,3
|
||||||
|
p=38,20 v=25,-83
|
||||||
|
p=20,99 v=54,31
|
||||||
|
p=20,74 v=-14,-30
|
||||||
|
p=51,83 v=-40,24
|
||||||
|
p=61,30 v=-27,-94
|
||||||
|
p=84,19 v=-28,69
|
||||||
|
p=28,33 v=-65,3
|
||||||
|
p=58,91 v=-93,-18
|
||||||
|
p=33,78 v=22,92
|
||||||
|
p=86,53 v=63,-43
|
||||||
|
p=53,79 v=-26,-42
|
||||||
|
p=83,16 v=94,56
|
||||||
|
p=21,0 v=-64,-35
|
||||||
|
p=48,80 v=-97,79
|
||||||
|
p=62,18 v=29,71
|
||||||
|
p=17,13 v=-69,-36
|
||||||
|
p=1,93 v=19,75
|
||||||
|
p=7,75 v=41,93
|
||||||
|
p=65,61 v=-45,65
|
||||||
|
p=56,71 v=92,-63
|
||||||
|
p=71,102 v=-53,-21
|
||||||
|
p=64,79 v=96,49
|
||||||
|
p=40,13 v=-74,-84
|
||||||
|
p=28,71 v=93,91
|
||||||
|
p=43,68 v=-39,-6
|
||||||
|
p=10,40 v=63,55
|
||||||
|
p=73,0 v=-97,-82
|
||||||
|
p=26,38 v=85,-27
|
||||||
|
p=27,94 v=36,-79
|
||||||
|
p=1,99 v=-82,-30
|
||||||
|
p=66,96 v=-23,31
|
||||||
|
p=78,21 v=96,16
|
||||||
|
p=10,93 v=-51,-76
|
||||||
|
p=76,87 v=78,80
|
||||||
|
p=13,20 v=-38,68
|
||||||
|
p=31,42 v=-43,5
|
||||||
|
p=56,10 v=-53,-33
|
||||||
|
p=76,61 v=34,-4
|
||||||
|
p=73,2 v=-36,74
|
||||||
|
p=93,83 v=15,-19
|
||||||
|
p=76,50 v=20,-51
|
||||||
|
p=27,53 v=36,-51
|
||||||
|
p=93,97 v=50,72
|
||||||
|
p=59,22 v=87,21
|
||||||
|
p=95,22 v=-29,66
|
||||||
|
p=56,35 v=79,10
|
||||||
|
p=60,38 v=17,-94
|
||||||
|
p=67,41 v=-5,6
|
||||||
|
p=97,71 v=-73,35
|
||||||
|
p=26,10 v=-73,74
|
||||||
|
p=74,71 v=5,64
|
||||||
|
p=36,91 v=84,-17
|
||||||
|
p=38,91 v=67,33
|
||||||
|
p=19,64 v=41,-9
|
||||||
|
p=89,15 v=-59,66
|
||||||
|
p=5,94 v=94,-27
|
||||||
|
p=92,21 v=7,-87
|
||||||
|
p=87,64 v=-28,-5
|
||||||
|
p=22,6 v=-95,25
|
||||||
|
p=59,42 v=-51,-7
|
||||||
|
p=50,95 v=88,29
|
||||||
|
p=59,91 v=73,-21
|
||||||
|
p=52,42 v=-75,56
|
||||||
|
p=10,39 v=-30,7
|
||||||
|
p=88,79 v=29,-62
|
||||||
|
p=31,89 v=-21,-82
|
||||||
|
p=43,60 v=4,52
|
||||||
|
p=2,76 v=-68,-15
|
||||||
|
p=13,71 v=-38,97
|
||||||
|
p=93,38 v=1,-95
|
||||||
|
p=53,99 v=10,16
|
||||||
|
p=94,72 v=-98,30
|
||||||
|
p=1,3 v=37,-82
|
||||||
|
p=68,78 v=55,18
|
||||||
|
p=1,78 v=42,-7
|
||||||
|
p=80,84 v=52,-26
|
||||||
|
p=75,46 v=-87,-20
|
||||||
|
p=71,27 v=95,-39
|
||||||
|
p=90,18 v=73,11
|
||||||
|
p=99,3 v=62,52
|
||||||
|
p=39,88 v=-80,-93
|
||||||
|
p=85,32 v=69,-40
|
||||||
|
p=72,23 v=-28,-75
|
||||||
|
p=22,59 v=98,-7
|
||||||
|
p=69,76 v=12,93
|
||||||
|
p=56,59 v=30,50
|
||||||
|
p=80,92 v=-49,-80
|
||||||
|
p=4,40 v=-77,-50
|
||||||
|
p=90,60 v=40,-28
|
||||||
|
p=6,79 v=9,56
|
||||||
|
p=63,47 v=57,-59
|
||||||
|
p=33,62 v=22,37
|
||||||
|
p=74,27 v=78,70
|
||||||
|
p=26,101 v=-43,-49
|
||||||
|
p=1,24 v=-29,-38
|
||||||
|
p=73,90 v=56,79
|
||||||
|
p=5,90 v=-20,-75
|
||||||
|
p=16,35 v=94,8
|
||||||
|
p=96,93 v=4,58
|
||||||
|
p=61,43 v=4,4
|
||||||
|
p=13,68 v=76,94
|
||||||
|
p=5,29 v=86,-95
|
||||||
|
p=32,81 v=39,-85
|
||||||
|
p=94,42 v=-37,55
|
||||||
|
p=80,20 v=60,22
|
||||||
|
p=43,94 v=57,-19
|
||||||
|
p=93,4 v=51,-26
|
||||||
|
p=12,4 v=62,-58
|
||||||
|
p=87,74 v=-98,-64
|
||||||
|
p=81,41 v=-26,69
|
||||||
|
p=30,54 v=-30,-13
|
||||||
|
p=73,4 v=21,-30
|
||||||
|
p=68,35 v=-49,-44
|
||||||
|
p=47,2 v=19,-70
|
||||||
|
p=92,100 v=33,79
|
||||||
|
p=81,11 v=73,-83
|
||||||
|
p=46,75 v=-62,-69
|
||||||
|
p=48,56 v=-13,-56
|
||||||
|
p=7,84 v=15,30
|
||||||
|
p=92,10 v=28,69
|
||||||
|
p=15,31 v=-87,61
|
||||||
|
p=95,0 v=33,79
|
||||||
|
p=3,61 v=-37,-50
|
||||||
|
p=73,95 v=96,20
|
||||||
156
2024/gareth/day18/day18.go
Normal file
156
2024/gareth/day18/day18.go
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
package day18
|
||||||
|
|
||||||
|
import (
|
||||||
|
"container/heap"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Point struct {
|
||||||
|
x, y int
|
||||||
|
}
|
||||||
|
|
||||||
|
// Item represents a node in the priority queue.
|
||||||
|
type Item struct {
|
||||||
|
point Point
|
||||||
|
distance int
|
||||||
|
index int
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
grid := parseInput(input, 1024)
|
||||||
|
_, distance := dijkstra(grid)
|
||||||
|
return distance
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||||
|
numLines := len(lines)
|
||||||
|
for i := 1; i <= numLines; i++ {
|
||||||
|
grid := parseInput(input, i)
|
||||||
|
_, distance := dijkstra(grid)
|
||||||
|
if distance == -1 {
|
||||||
|
println(lines[i-1])
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string, upToLine int) [][]rune {
|
||||||
|
grid := make([][]rune, 71)
|
||||||
|
for i := range grid {
|
||||||
|
grid[i] = make([]rune, 71)
|
||||||
|
for j := range grid[i] {
|
||||||
|
grid[i][j] = '.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||||
|
|
||||||
|
for index, line := range lines {
|
||||||
|
if index == upToLine {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
cords := strings.Split(strings.TrimSpace(line), ",")
|
||||||
|
x, _ := strconv.Atoi(cords[0])
|
||||||
|
y, _ := strconv.Atoi(cords[1])
|
||||||
|
grid[x][y] = '#'
|
||||||
|
}
|
||||||
|
return grid
|
||||||
|
}
|
||||||
|
|
||||||
|
// PriorityQueue implements a priority queue for Dijkstra's algorithm.
|
||||||
|
type PriorityQueue []*Item
|
||||||
|
|
||||||
|
func (pq PriorityQueue) Len() int { return len(pq) }
|
||||||
|
func (pq PriorityQueue) Less(i, j int) bool {
|
||||||
|
return pq[i].distance < pq[j].distance
|
||||||
|
}
|
||||||
|
func (pq PriorityQueue) Swap(i, j int) {
|
||||||
|
pq[i], pq[j] = pq[j], pq[i]
|
||||||
|
pq[i].index = i
|
||||||
|
pq[j].index = j
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pq *PriorityQueue) Push(x interface{}) {
|
||||||
|
n := len(*pq)
|
||||||
|
item := x.(*Item)
|
||||||
|
item.index = n
|
||||||
|
*pq = append(*pq, item)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pq *PriorityQueue) Pop() interface{} {
|
||||||
|
old := *pq
|
||||||
|
n := len(old)
|
||||||
|
item := old[n-1]
|
||||||
|
item.index = -1
|
||||||
|
*pq = old[0 : n-1]
|
||||||
|
return item
|
||||||
|
}
|
||||||
|
|
||||||
|
func isValid(grid [][]rune, x, y int) bool {
|
||||||
|
return x >= 0 && x < len(grid) && y >= 0 && y < len(grid[0]) && grid[x][y] == '.'
|
||||||
|
}
|
||||||
|
|
||||||
|
func dijkstra(grid [][]rune) ([][]rune, int) {
|
||||||
|
directions := []Point{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}
|
||||||
|
rows, cols := len(grid), len(grid[0])
|
||||||
|
|
||||||
|
// Validate start and end points
|
||||||
|
if grid[0][0] != '.' || grid[rows-1][cols-1] != '.' {
|
||||||
|
return grid, -1 // No path if start or end is not valid
|
||||||
|
}
|
||||||
|
|
||||||
|
dist := make([][]int, rows)
|
||||||
|
for i := range dist {
|
||||||
|
dist[i] = make([]int, cols)
|
||||||
|
for j := range dist[i] {
|
||||||
|
dist[i][j] = 1 << 30
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pq := &PriorityQueue{}
|
||||||
|
heap.Init(pq)
|
||||||
|
heap.Push(pq, &Item{point: Point{0, 0}, distance: 0})
|
||||||
|
dist[0][0] = 0
|
||||||
|
|
||||||
|
path := make([][]Point, rows)
|
||||||
|
for i := range path {
|
||||||
|
path[i] = make([]Point, cols)
|
||||||
|
}
|
||||||
|
|
||||||
|
for pq.Len() > 0 {
|
||||||
|
item := heap.Pop(pq).(*Item)
|
||||||
|
x, y := item.point.x, item.point.y
|
||||||
|
if x == rows-1 && y == cols-1 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
for _, dir := range directions {
|
||||||
|
nx, ny := x+dir.x, y+dir.y
|
||||||
|
if isValid(grid, nx, ny) {
|
||||||
|
newDist := dist[x][y] + 1
|
||||||
|
if newDist < dist[nx][ny] {
|
||||||
|
dist[nx][ny] = newDist
|
||||||
|
heap.Push(pq, &Item{point: Point{nx, ny}, distance: newDist})
|
||||||
|
path[nx][ny] = Point{x, y}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if no path exists
|
||||||
|
if dist[rows-1][cols-1] == 1<<30 {
|
||||||
|
return grid, -1 // No path found
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reconstruct the path
|
||||||
|
x, y := rows-1, cols-1
|
||||||
|
for x != 0 || y != 0 {
|
||||||
|
grid[x][y] = 'O'
|
||||||
|
x, y = path[x][y].x, path[x][y].y
|
||||||
|
}
|
||||||
|
grid[0][0] = 'O'
|
||||||
|
|
||||||
|
return grid, dist[rows-1][cols-1]
|
||||||
|
}
|
||||||
65
2024/gareth/day18/day18_test.go
Normal file
65
2024/gareth/day18/day18_test.go
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
package day18
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`5,4
|
||||||
|
4,2
|
||||||
|
4,5
|
||||||
|
3,0
|
||||||
|
2,1
|
||||||
|
6,3
|
||||||
|
2,4
|
||||||
|
1,5
|
||||||
|
0,6
|
||||||
|
3,3
|
||||||
|
2,6
|
||||||
|
5,1
|
||||||
|
1,2
|
||||||
|
5,5
|
||||||
|
2,5
|
||||||
|
6,5
|
||||||
|
1,4
|
||||||
|
0,4
|
||||||
|
6,4
|
||||||
|
1,1
|
||||||
|
6,1
|
||||||
|
1,0
|
||||||
|
0,5
|
||||||
|
1,6
|
||||||
|
2,0`)
|
||||||
|
assert.Equal(t, 22, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`5,4
|
||||||
|
4,2
|
||||||
|
4,5
|
||||||
|
3,0
|
||||||
|
2,1
|
||||||
|
6,3
|
||||||
|
2,4
|
||||||
|
1,5
|
||||||
|
0,6
|
||||||
|
3,3
|
||||||
|
2,6
|
||||||
|
5,1
|
||||||
|
1,2
|
||||||
|
5,5
|
||||||
|
2,5
|
||||||
|
6,5
|
||||||
|
1,4
|
||||||
|
0,4
|
||||||
|
6,4
|
||||||
|
1,1
|
||||||
|
6,1
|
||||||
|
1,0
|
||||||
|
0,5
|
||||||
|
1,6
|
||||||
|
2,0`)
|
||||||
|
assert.Equal(t, 0, r)
|
||||||
|
}
|
||||||
3450
2024/gareth/day18/input.txt
Normal file
3450
2024/gareth/day18/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
90
2024/gareth/day19/day19.go
Normal file
90
2024/gareth/day19/day19.go
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
package day19
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
towelPatterns, designs := parseInput(input)
|
||||||
|
result := countPossibleDesigns(towelPatterns, designs)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
towelPatterns, designs := parseInput(input)
|
||||||
|
result := totalArrangements(towelPatterns, designs)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInput(input string) ([]string, []string) {
|
||||||
|
parts := strings.SplitN(input, "\n\n", 2)
|
||||||
|
towels := strings.Split(strings.ReplaceAll(parts[0], " ", ""), ",")
|
||||||
|
patterns := strings.Split(strings.TrimSpace(parts[1]), "\n")
|
||||||
|
return towels, patterns
|
||||||
|
}
|
||||||
|
|
||||||
|
func countPossibleDesigns(towelPatterns []string, designs []string) int {
|
||||||
|
memo := make(map[string]bool)
|
||||||
|
count := 0
|
||||||
|
|
||||||
|
for _, design := range designs {
|
||||||
|
if canConstruct(design, towelPatterns, memo) {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
func canConstruct(design string, patterns []string, memo map[string]bool) bool {
|
||||||
|
if design == "" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if val, found := memo[design]; found {
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, pattern := range patterns {
|
||||||
|
if strings.HasPrefix(design, pattern) {
|
||||||
|
remaining := design[len(pattern):]
|
||||||
|
if canConstruct(remaining, patterns, memo) {
|
||||||
|
memo[design] = true
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memo[design] = false
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func totalArrangements(towelPatterns []string, designs []string) int {
|
||||||
|
memo := make(map[string]int)
|
||||||
|
total := 0
|
||||||
|
|
||||||
|
for _, design := range designs {
|
||||||
|
total += countWays(design, towelPatterns, memo)
|
||||||
|
}
|
||||||
|
|
||||||
|
return total
|
||||||
|
}
|
||||||
|
|
||||||
|
func countWays(design string, patterns []string, memo map[string]int) int {
|
||||||
|
if design == "" {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
if val, found := memo[design]; found {
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
|
||||||
|
totalWays := 0
|
||||||
|
for _, pattern := range patterns {
|
||||||
|
if strings.HasPrefix(design, pattern) {
|
||||||
|
remaining := design[len(pattern):]
|
||||||
|
totalWays += countWays(remaining, patterns, memo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memo[design] = totalWays
|
||||||
|
return totalWays
|
||||||
|
}
|
||||||
35
2024/gareth/day19/day19_test.go
Normal file
35
2024/gareth/day19/day19_test.go
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package day19
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`r, wr, b, g, bwu, rb, gb, br
|
||||||
|
|
||||||
|
brwrr
|
||||||
|
bggr
|
||||||
|
gbbr
|
||||||
|
rrbgbr
|
||||||
|
ubwu
|
||||||
|
bwurrg
|
||||||
|
brgr
|
||||||
|
bbrgwb`)
|
||||||
|
assert.Equal(t, 6, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`r, wr, b, g, bwu, rb, gb, br
|
||||||
|
|
||||||
|
brwrr
|
||||||
|
bggr
|
||||||
|
gbbr
|
||||||
|
rrbgbr
|
||||||
|
ubwu
|
||||||
|
bwurrg
|
||||||
|
brgr
|
||||||
|
bbrgwb`)
|
||||||
|
assert.Equal(t, 16, r)
|
||||||
|
}
|
||||||
402
2024/gareth/day19/input.txt
Normal file
402
2024/gareth/day19/input.txt
Normal file
@@ -0,0 +1,402 @@
|
|||||||
|
rrgbg, rgguubg, rbru, rb, rrrw, wbu, gbgb, uururg, ubru, rugb, bbru, b, rggurg, wgru, bgrwb, rrgubg, ubrrbg, wgurru, rrrrw, rbrwu, wubwb, wrbbr, bgbu, brrww, brg, gbwu, wrubuur, gur, grbr, gruwrrbg, bgwr, wgugbgb, rwbru, wuwr, rrg, ruwg, rgwgr, ubu, wbr, bwg, gbu, bgrwrb, wwrw, bb, gr, rug, grr, ubwb, rbruwbu, guggug, ugu, rwbuu, bbur, wbrww, wubw, br, gruu, gwr, wrrwwu, wug, bgu, bgb, wugb, grb, rbbg, grgbwgb, rwu, bwrbb, uwrbbru, bbu, wrg, rwg, ggbgbg, wbwru, wrgrw, bburr, bgr, rgbg, bwwwugrb, uwu, rwuwrg, gguburu, uwubwu, wb, wgguug, ugrbw, rbgu, rwwu, ggbbgb, gw, wgg, rrw, uurg, uubg, bgurgb, uwgbr, wbrwu, rrbb, rww, bwgb, uugru, ggrbub, wubgw, rwwugr, uuwur, burbrg, bbr, ggb, wgr, gwbgw, rrbu, wuwwrwb, rbbr, uubw, buuu, ubbwggu, brr, urguww, uggwwgw, ugw, ug, rub, grrrwu, wurburgg, wwww, ruu, wrb, rrur, urggr, bwbwwwrg, wwbu, bbg, uwb, ggugu, gbbr, rbrgw, bg, bbuu, uwrgrg, ggbwrgw, wwgwugr, wgbwuwb, gbrwg, bbw, wwrgu, rgrwrbwb, wwwg, gugbgbg, bwrwub, rw, gbb, ggw, rrb, urrbbwb, urbu, grg, rbugggb, bruwg, uubgwgw, bw, uubgu, rru, rwww, gu, wrbrg, guu, wgu, ruuru, wubrrg, brugrg, uuggb, wrurg, rgb, rbu, urg, buw, grwbg, gwuw, grbbg, wuwu, gbgbbw, uugrwrww, wbguub, grrgbug, u, uug, uwr, wrwb, gbg, bru, wwg, bbwur, bbbbbbbw, bugbb, rwurrgr, wwb, ugbbw, bug, grgg, bgwgrrb, uggu, rurguru, wwr, rbw, ubwwgw, wrrw, rrbg, g, rgrbub, gruggw, bur, ubgb, bgg, uwur, ur, bbbwb, gwbu, wuww, uruuuubb, wbru, ugggg, gbuu, rgg, wwwug, gbrwgg, guwgr, urw, wbur, bu, rur, rrubr, ugb, ubrgrb, rbbgg, rbwrg, rggw, rguug, wwu, uur, wrrguggu, brbb, bwwwbr, guw, gugw, wgubwu, rrr, ub, ru, brrbbruw, bwwgrrbb, rubgu, uggwwg, wbb, rwr, r, ruuu, wbggg, wwwu, grbrb, rrrrr, ruwb, wuuw, rbbb, ugg, wbg, rguwr, wbw, wbuwg, ubbgrbb, urugu, rbubw, wrgwuuwu, grw, ubbbu, bwurb, rwuu, rgbbwur, urbuu, uww, wuw, bwurgu, wur, wuwwrbur, wwuu, wbgw, grbbbw, wuub, urb, wuuguuwg, wg, gwrgr, gbug, gbrbw, rwgg, brbbu, bwww, wrbbbu, wwgbggb, burug, gww, ubgrrb, bgw, rgbb, brb, wbuu, brw, ggrbrbwg, uwruw, wrgurrbb, guwrgu, rr, ugggrbr, bgrgg, urgbrbrb, wrw, wwubggu, ugurwg, grrg, bwrb, rrgwuuw, rrru, wurg, bgurwu, rgurbb, uuub, uuwb, rrrg, wrgrrrww, uwg, bgbguu, wrgwb, wwwru, rg, rrurwur, urrbb, bww, rrwwbbb, ubr, wgrbu, gru, ubg, gb, ggr, gbwbwru, uuw, rbb, gugwrg, gwb, bbb, rgrggw, uw, wggbbg, rwgubgb, gwbw, brrr, gugbwu, rwrr, uuuwbb, ugrrr, rgu, wubrwr, wrr, bwb, bwbgurb, rrrub, wub, rwgrug, rurb, gwrgrbr, rbrwbb, wwrgbg, urr, bwu, bwgu, rbuuw, bbub, wbbwubu, ggg, wbwwgwb, buwbg, wwwuru, rbg, gubugg, gbwb, www, rbr, ubur, grbbw, wgw, gbw, wgrw, rguuuu, rwb, gbrw, bbbb, gururbb, rbggwu, bub, bgbr, gurb, rrbgrb, rurwb, ugr, wgwrg, ruw, bgrr, gwu, gbr, uwugwru, wru, wr, ugbruw, grbubb, gwg, gwggurg, gugbr, ugubbgb, uwrw, uru, bwr, rgr, rbgrwg, buuw, ugbur, urgub, wurrrgww, rgguuwru, burr, rgw, rbruw, rwbwbbr, bwguw, uub, wgb, rgur, ubb, urwg, rwgww, wgub, rwwrgu, gg, rgug, gub, bggr, uuu, uu, rbug
|
||||||
|
|
||||||
|
bubrbbwggggbuuwbbrwwbbgbwrruugwbwgbwugbugrgu
|
||||||
|
wugwgwggbgubuuwugugrugwbrrwrbwwguburbbbggw
|
||||||
|
wbbrrwwbgwbgrrbwuuwrbbrwuwburgbwgwwuruwgbggubwug
|
||||||
|
ubrwbrbrggrwgbwbwwuwwguurbubwrbgwwrubbrwuwururwrr
|
||||||
|
gggrwbgwbwuwrubrguwggruubrggwgbrbguwrbrgwuurbwggrggrwwwrb
|
||||||
|
wuurugububruuwuggwuuwgbwwbrbwgrrrubwbuuwu
|
||||||
|
grrrwrwgwuwrburruuwwubgubwwwrrrwbwwbggrbrgr
|
||||||
|
gugrrubugrgrwgggggrbrbrwgguurrwurgrbuggrrbbwgwwwbuu
|
||||||
|
wubuwgwuwrrubbwuwwrburrwbrrubgurbggbbubrwrguwururgww
|
||||||
|
ubbrgurrbgbrbwguggugwrrrurwwwugbgrwwbuwrbggrgwwrgwbrwwuugb
|
||||||
|
bgwbwwwrrgugwwwugruwrbgrbrwbwbrwurbgruwgrggwruururb
|
||||||
|
guwurburwrguurwbggrrwwugurguwbubbrggrggrubrbbbrwwbgw
|
||||||
|
wgwuurwrgubguugbbgrrwbwgrwbwrwgbwrwburggrgbbuuw
|
||||||
|
grbgrruuwrgwwuburwggbubbbgwwrgrbubggwrwbuurwwbuubuwrgwb
|
||||||
|
bbwuubwuuwwubrwrwgbbrgwwurwbbwwburwuwwwubwrubguubggruwbbg
|
||||||
|
rrugrwurbugrrbggburwurbbgbuugwwrgbwrbrwbgbgrbwbuuww
|
||||||
|
gubwuubuwrrwgbuwbwguubuwwbwwrrwgbwbuwgguguwuwbwu
|
||||||
|
rrbbubrrrwubrrwwbrrbwrbwugbrbrggwbgrwgugwuugg
|
||||||
|
uurwrgruuwbwuubbrwubrwuuwwgubwgrwbbwgbwwwrbgugrbwururgurb
|
||||||
|
rbwbbrguggubguurrrrburuwrrubgbgrwrbugrrrgruburwb
|
||||||
|
grggbggwrubwwwwgrurwgbwuubguwrrrbgubruguub
|
||||||
|
rrbgbggwbwbrbrrwwgbbggrruwgggurgbrbrwubwuurrbbbwgrbrgrurr
|
||||||
|
gububbuuguwgbgrwgwgruburwrgwgbbrbrruururrrubrgggwwrbgb
|
||||||
|
ruurrgggbwbrggwggrurgrwgwbgburwwuwgubggubru
|
||||||
|
rbrrwgrgrrwrbwbrbggbwrwwuwrbwuwuuwbgbrwrgrwwgbuugbugg
|
||||||
|
wwbwrrbrrruuwrrwgggruwbubrrwrwuwwurwurbrbrrrw
|
||||||
|
wbguwwwwwguuuwuubrwgrgwguugrbrruwwrwgugbbb
|
||||||
|
rrggwbububgbgbguggwwgurbgbwuwwrwrgwuuwruggu
|
||||||
|
rbguubrrbrgwwgwbgrwrbrggwuwguuuwbwbwwbuwgr
|
||||||
|
wgbrrguuurgggrwgwgbrbguugrururubruugrrrrgbrgugbg
|
||||||
|
bgurwgugurwwbuugwurrgurwwrgwgubgrrgururubguuuwugbg
|
||||||
|
rwbbuwuwbgwbbwurbubwwugbgrbugrbuurbwwbrrwruwrrrwww
|
||||||
|
rbrburwwbwugrggwrrrruwwgbrgurbwwrrburbbggugbwbu
|
||||||
|
burgwubggburuuguuwrwbbgbuguguwwburububwrrgw
|
||||||
|
gggubgbgbwgrggrbrbrgguruurwbrrwubbrbruwgwbu
|
||||||
|
wggruwwgbwgguwgbgbggrbggbbbwbwwwrgrwwggwrgguuwwgwubgru
|
||||||
|
bbrwwruugwwbbbwububuuwruburbwbbgrwbburrgbbrub
|
||||||
|
gwggggwgguuburrgrgugrwgwrbbggggurgugugrgrgwwbr
|
||||||
|
gggbbugwgbwgwugrrgbwrrwurrgugburrggrruugurbrugrbbbg
|
||||||
|
gbwrwggbuggurrgubuguubrbgwbrubgwgrbrwubbgrr
|
||||||
|
bwuwgurrrgwwgguubggwwuurbbrbbwgwggwuwgbbwrwrburgr
|
||||||
|
wgrwwubbbwbbrggrgugwggbubwwburubwwuwgbbubbrrrrguubguwbuuu
|
||||||
|
rguuurgbrbrbuubgbuuggrwrwgrwugwrwgbwbbwbbgg
|
||||||
|
uugbgwguuggwgwrrggggwrbrgbguuguwrbrgwgbwwuubgugwwug
|
||||||
|
rbuuwwwrrrurgrgbrbbbrrbbwwwgwgwuwgbwggrbbwbruwwwwbg
|
||||||
|
wwgwuurrurrbbgwuwwbgrbbrbruugwwgugbrbrgguuwrugwuguurbgwrru
|
||||||
|
wrgwrrbrgugrrwguuguwburwuguuggguwwgbguwrbrbgubrg
|
||||||
|
wbrugwbubuggrruggbruwrgrwgugwgbwugugbwguwwuubbrwwubggw
|
||||||
|
grbgrrbrwggurbbrwugrwbbrurwrwbruuggwrggrrgrgwwbuwbgurb
|
||||||
|
gwwurrbwrgrgurwuugwbwrgrrrwwwrwguwbrbrrurwbwbuggrwb
|
||||||
|
wubguubgbbwuwbwgwwrrrgbuggwbwwwugrbbgrwubbrgurbuwwrgbur
|
||||||
|
uurgwruubgrbgubbwrubbggrububgrwwrubwwbrgbbu
|
||||||
|
uruuwrrbwbbugbbbrwguwbwuguurbwrurugwuwwguwbgb
|
||||||
|
wurbgrggbggbwwgwwbbgbbrurrrwggrwwrbrbrwrbg
|
||||||
|
ggwwrrbbwgubrgrgrgwuububrbrggbwwbubgbbgwubrgwrbururu
|
||||||
|
grrgubuwgwuwuururwwrbgwrgrurrbbrwbgruggrbggbwubrb
|
||||||
|
grbbrwbrgwgrgubuwbuwbrwuwugrbwuwwguwrbwbwwbuurgbwgw
|
||||||
|
uuguwrwggruurrggurrbgurbwgggugbgrrguugggwurgrrgubugbugugg
|
||||||
|
wrwugwwuwwbrubwwuruuwuwrugugbwwgugrrbuuguwggbrguuugwgwbw
|
||||||
|
uuggwbgurgurbgruruwwrrgubbuwwruruwrurbwugguwbwbgrgg
|
||||||
|
urwbggurwbwguurugbrbwbrbgwrgrbbrubrubburuwrburww
|
||||||
|
wbbrbwwwwrbruubggwrurgugbgbbuwgrrrrwugbwwwr
|
||||||
|
ubugrwubbgbrrrrgguugurgbubwgruuwrrgrbguuuw
|
||||||
|
rrruwrgwrggwburgugwbwwwbggubuwbwuuurrggwwbwrgwgwggbguubw
|
||||||
|
rgrgbrguruguwrggbrgruwrrbgbbbwugbrbgrbrrrggrubwuubwwbguw
|
||||||
|
rbggwgugrbwbrbwurbrugrwbbbwuuuwrwgbbbrwbuwgbwrgggurbwug
|
||||||
|
rgbuuwurbrwwuwbrugbggwbgbrrwguguwbubrubwguubbubgrgrwu
|
||||||
|
gwwwgbrguruuwggwugguuwwrbwgbgwuwuuwrgruguwrbugurrwruw
|
||||||
|
ubbgwurbrwrwggwubggugrgugwurwwbbbrbwbwgubw
|
||||||
|
wurggrrwbwgbwuguurgwgurgugwbguuurrubuwwggwgggwg
|
||||||
|
ugbrrwbgurbugwwwbggggggrugububwbguurruggrgrubuuwgurrwbbu
|
||||||
|
rbrurrwuuugbwwgubugbuugruwwurwrbrrbrbgwurwuuu
|
||||||
|
rrurrrwrwrrrbbbwguuwrruwguwuggbgguurrbbgggbwruurugurgb
|
||||||
|
rurwwgugrrrrwbwurugwrugbgwwbuwrbwuwuguggub
|
||||||
|
ubbgbrgggbuwggwgrgbgrgwbwggrrwbrggwgubuwgrwrbwrg
|
||||||
|
wggruuggrwbwrwrugwgbuwggwbgrbuggrgguggubbrbruuu
|
||||||
|
ggurbuwwbbubrguuubgwugugrgrguwrwbrubrgbwwrg
|
||||||
|
rgrgbbbbwwruubwuwguwgububwgruwgruggbgggbuggwwgwuwwgu
|
||||||
|
guwugugbrrbrruggwrbwbbgbburubwuuurbugubwrrug
|
||||||
|
grurwuuwrbguuwgruubwwbuubwbuurgugrgrwbggggwugbgruuurww
|
||||||
|
wuugguggwrrgruwgbbrrgbwbruubgrbbrburgugurgwggwgggrrur
|
||||||
|
grgbbrwuwwrrgggwwwuubuggwrbgrgbwrwwrrwrwguwggw
|
||||||
|
bwuuguwwrbbgrwubbbrwwwrrururbwgbrrrrwbrbgrbgbbu
|
||||||
|
urggrwbggwubgggrwwgwgbwbggwggrwrrrbgwrruwbbrbguuwrw
|
||||||
|
bubruuwrrbbruwbbugwuuwbwwbwbbuwubgrububwwrgwubgrggrruwggg
|
||||||
|
rurgwubgbwrrwuwuuggrrrwwgwrgburbggwwrubuwwuwgwruwurugw
|
||||||
|
wgbgururuggrbrugbwrguruugguubrgwrgguwgwruwbgrrr
|
||||||
|
uubwrbrgggrugurgbrwuugrwrwwwrgbrgwwugbwubwgrr
|
||||||
|
bggugwwurguwbgbwbwbuwwbrruubbgbbrbwbburugrr
|
||||||
|
wrwbrbgbbrwugrwbbwgbgggbrwurgrwubuggwurrrugu
|
||||||
|
grrwbgubrrwruubuugguurrrbrbubbrwgrbbguguub
|
||||||
|
uburuugrwbrurguwgrgwbrrrgrbbgbrbuwrrbugrgbrbbug
|
||||||
|
wgbuwuuwuruwuwuuwuwgggrbugburubggbgubwgbuuggbur
|
||||||
|
wuugrbbwuguwuwwuuruwrwbgurrbbwbwwrwuugbwgbuugbgwwrwwwgw
|
||||||
|
uruburbbbrwbuwrrbrbguuggbguruwwrruburwgwggr
|
||||||
|
rurbbururbwuwuwrrrbbbwbuuwwwuwrrggurgrrurgruggwuubwrww
|
||||||
|
wrbrwwggubwbugrrrgbugubgruggurwwrwuwwwrgbrrugbbbubwgwb
|
||||||
|
gwruggbrbbrwubgbuwwwrugwbubgugwuuugggurwuuwrururugg
|
||||||
|
bwgububwrrgruwubrrubwwubrwrbgrurwgrrrwbrwbubggw
|
||||||
|
urwrbwwrubbuwrbbwgugrbrburrgbbuugbbubbbugb
|
||||||
|
buggwggugwuwwwugggbrrrbbggwwuguguubugbrugu
|
||||||
|
wbrwwbwuwbwgrubbuurbuurgwubrwwwuruwuurbrubbugwuw
|
||||||
|
bbrbggbgwuguburwrgrbgrbrbugrgwbwubgwwuwbwbwrbwrwbgb
|
||||||
|
wuugrubwgggbugrbwgwgurgwuubuubrbrrbbruwbwrwgguwrrrwbwgbbw
|
||||||
|
wuugwgbwrrgugguwwgbwgbbwgbbgbgwuugbbuuwgrburuuurwbggwgrugu
|
||||||
|
wgrrwwugbugbbrrrrburgwbgrgubbguuwbbwwrbbbwuurrwbruruugrg
|
||||||
|
uwwgbwbuuwgwbbbggbwrrbwugwbruruwbbwrrwurwgbgw
|
||||||
|
gruwuruuuuuurwurwgbbggrubrubbgbrwubrbuwbruwgb
|
||||||
|
wuugrbubwrbrgwubrggugwbrgbggbbgwurrwgwrwu
|
||||||
|
grurbbbgbbubgurrrbrrrwwgggguuubuwgbwgwrguwu
|
||||||
|
ggwgbrwwwgrwgrgubrbugwuwwrbgwwgwwgurrbgburuwrgg
|
||||||
|
urwbwbbbuurubwgwrwbgrgruugwuuubgbbwwrurwwrbgugwgwbwggrbgub
|
||||||
|
wwwguggbrbrubgwggbrbbrgbuuuwubbwrbugbbbgruwbwwurggg
|
||||||
|
wuuurrguggwugbggggwbwbrrwurrbgwgwgbuwubgwubuuwbugwbwbwwwrguw
|
||||||
|
uwrgubwbrbbbgrwruwgrggbgbrwgubguuuuugwuwgwuubbgrgbgub
|
||||||
|
uuggugwuwrwgbrwwgrwgwggrbuuwruuwgbrbwrbugururuww
|
||||||
|
rwwrwurbrgwubbgwgggugbwwrubuggrgggurbrgwrwrwrrbwrwuu
|
||||||
|
rwbubuwrrgwggrrgrbwwgrgbgurrbrbrggrbuwwbrggwwrwgubrwgub
|
||||||
|
gurbbwuubbrrgbrurbwrggwuwwbrbuurwbubwwwrubggbwwgbwbrg
|
||||||
|
uwbuurrwbrgrgrurggwbwgrrwgwrbuwwwuburugugbugwuwwbrrubwu
|
||||||
|
rbbrwgwrrbbgwbgrwbrrrwwuuugrwbggrugrbburgbugburggbw
|
||||||
|
uggbgrgruubgggwbrugrgrbbbbwbwbgrbrrgrwbwrgguuwruwrwr
|
||||||
|
uwbbbuurggrbrurwgubrrrbuwgrgrrrrbwubrwrbbg
|
||||||
|
wuuurrbwrgwrguuwgrrgbuwggrbbwbuwbgugrwubwugwbrbg
|
||||||
|
gbrggbbwgurgrrbrugwrbuwgbrwbbbubgwggrurgurrw
|
||||||
|
rruwuwuuuuugwwbwbrrbbggrruwbgwuuuwgugwurwrg
|
||||||
|
gugrrbwrbrubuubgggbwbwwugugwrgwguurugbwbwwggrggbgrgrrbrw
|
||||||
|
ubbubwbuwrugrguggwwrwbbwbrbwrgwwbguwuwgwwwbwwbggbrwb
|
||||||
|
bbruguwgwbggbuubbgwugubrwbuwuwbgrgwwguwwwggruwgbb
|
||||||
|
grbugrrgwgbrgbuwrwbbgwbrrbrubrgwurbwwrwruugg
|
||||||
|
ruuruwbubugrgrbggrgubggbgrwrgwgrgbbubuwwwurbgguwr
|
||||||
|
rrwbbugbrurwgwbwwbgurgurwwwguugguwrwguwuggwgwb
|
||||||
|
wwuwgwgburubbbwggrrbbbbwbgbubguwrgbrrwubguurwwgrbgurg
|
||||||
|
urwbbbruggrwwgbuguuwubgubrbgwubwgwwrwwgubggwwrgbww
|
||||||
|
gbuurrwrgggwurrwuggbruwurrugrwrrbuwrggbwgugrwrwurwruwu
|
||||||
|
buuwrwuuuwgwwggbrbgbguuuruuuubbguwgbbbwgwgbuuwrrgbr
|
||||||
|
ggrrburrbbwrrwbwwubuugrgbugubwubrugbgwugrgu
|
||||||
|
uuubbwrbrwgrwugugbbgbgwwrrbuguuuburgrruugbwbbrwrbrbbwbrb
|
||||||
|
uuuuwrubrruguuwbwwugrrruwwburgbbggrgrgwbggubuuwu
|
||||||
|
wwgrubrrubrwrbgwrwgbguwgbbrgrrubbwbubbburbwgrrrub
|
||||||
|
bgwrgbrbbbuguugguguuubuugwbrwwurwuubrguwrruuuw
|
||||||
|
wuugbbbwuuguuwgrrwrwgwwwwwrbwgwrbwguwbrbgugubr
|
||||||
|
rgruurbggrbubwwbuwwuwuwwrbbgbgbguwrbbrwubgwrbr
|
||||||
|
uuurrubugrwwuuguwrwwwggubbbrbbbuwbbrggwuggru
|
||||||
|
wuuuurwgrwggwrruuuwubwubggrbrbwgbrwbgbwwurgbrwu
|
||||||
|
wuurggrwwbgwuwwrburuwrwrruruubgggbrugwwrwgbuwrbwgbur
|
||||||
|
ggrubgbbwruggbuuuwgrbwruwgurbwbubwuurubugbwg
|
||||||
|
rwwggbubrwurgwrbrwuwugbrrwwubuwrwbgguuuuwuwgwurgbwguw
|
||||||
|
wwbubuubgwwrrgbruubgggrrbuuwrugwbubrwgwbggbgwu
|
||||||
|
bwwgrrbbubbwrwwwguwbuuwgbbwgbbubrguwbbbgrugubrwg
|
||||||
|
wgubbgguwgbrbrgrggubrrwwgrrrwugruggrurrbubuugwbgwuuwwwwgr
|
||||||
|
wwbgwuwggugubgbggwuwgwggrrurrbbrrrrbbbgurwrrbuggg
|
||||||
|
rubguwgwuwwbuguguggurgwrwgbrbwubgugrurbwwwwbbuwu
|
||||||
|
rrwrgrwggubrwgwrwwuugrgbbrgrubgwrwuugrgbbgugbgrburrrrrugwu
|
||||||
|
bbgwugrgwbggrwwwrgbwburrwrwurbwgugwgwgrbuugwwuuwgburggggg
|
||||||
|
uuwbwguuwrbbuggbwggbgrbuwbgugwuurrurrgbrbuurwbwurrr
|
||||||
|
wurbwrgrgrrbgbwbwwuuggwuwuwbbwwuwgwgrwggubbgrwggbrrggur
|
||||||
|
wugrrubbggwurburggurrgggwuwwuguugrggurrgburrbrbrwgwbuwbg
|
||||||
|
wrugrbrwuwrugrbwurgwruggwrgwuwrgwuuwbwwggwubbgrwggwguwww
|
||||||
|
grbwguwbbbrwuwggbgurgbgbbwbgwwbwrrwbubrgubbgubgwwurggwbrbg
|
||||||
|
uubrubgurbgrgruwbwwugbuwgugburuubwuubbbrbbgbuggbbu
|
||||||
|
bbgbrwbwrwgbwrwwbbbrrugrwgbwbbruugurgggbbrgrguwurubgwbw
|
||||||
|
wwugrubrwrwburubwwuubbuubgburbbrrrruugbbwwgwbrrbubgbgbuwu
|
||||||
|
bwugrruubwwrbwbrrrbrrrbbgwrruwwbrgubugrgbwgbbrbgrwgwwwggr
|
||||||
|
wgugrrbbubgbgrrbbrwguwgbbgbwggwuuurrwgwbwrgwwuuw
|
||||||
|
wururbruwwwwurwgurwbwbuburrgruuwrbuguggwgubrgrruwwgwbbg
|
||||||
|
ugrwrrrwguwgrgwruwurbrrgruwubbubrwbwuwwrbbwbbggggr
|
||||||
|
rwuuguburgwruwrgbbuwggugbwrwuubrugrrruuwgggubbuwbrugrwuu
|
||||||
|
bgwubwuurwurbgugbuugbgrrugwrbwgrwrrwbgwwwgrguwwububuwbg
|
||||||
|
urbgbbgrrbuwrrguwrwuwrbbwgubwurugguwugururwruuubbgurrbg
|
||||||
|
grruugrurgwwbbrgugbburrwrrgwwrggwwrbwwbbwururwrbgguu
|
||||||
|
uubrwgwuubgbbgwgwuggbuggwguggwgrguwbugwwuubwwb
|
||||||
|
bbgubwurgurgguwrwrbbubbggwubwgbbwggwuuwugbg
|
||||||
|
guwbbwguurgwurbrgugwbwwbgugbgwwugubbggwugwrwgrb
|
||||||
|
wrruwbubwgwgbrwrbbbwuuuuurbwrbgwubrrugubwwrugb
|
||||||
|
gbuwwbubrrbggrrbugrgruwbrruurrburrgbggwbgwgbbggwggggbgrg
|
||||||
|
rwrbbbwbggrubuwgrugggbrbgbuwgrbrrbrrbwgwgrbuubgw
|
||||||
|
burbgruuwbbwuburbgrbuuuuurbuwbububgwwgwbrguubrguugwbbwbw
|
||||||
|
ubrrrgubrgrgbuuwgrrrwwbruuugbrrwbgbrwgrgww
|
||||||
|
uuuubwwwuwwbguwwbwgbwrwuwrwgrggrbgrbugbwgbrggwgruwrw
|
||||||
|
grwgruggbrrwuwrwbggwwgbrrwrwruuggbrurrbubur
|
||||||
|
uggbrrggwbwbrbwgurbbbrbbgwbrgbgwrbwubrurgw
|
||||||
|
ururbbrwrrwwbgubrbbuurguuwwgruwgruuurwbbwruurggru
|
||||||
|
grbwbrubbrgrwgbwubgbuwwuuwwrubruugwwwugguwrgurgrgu
|
||||||
|
wbwwugggwwurwrbugbbbrrgbgbuwggrggbbgrburbguurb
|
||||||
|
brwbbgwbgbrbbgwbrruwugwbguurubgwwgurubgrwuwrbguwuwrrgbwubu
|
||||||
|
rwugwrbgguwuggwgwgrbwbwwgwbwrrgrbbbwubgwggwrwurgwrwb
|
||||||
|
urrbwwgrruwwwrbrbwrgbrggwbggwrbbwwrggrgbbg
|
||||||
|
wurwwgwuurbwwgrrbbubbbbgugwwurrggrurbwrbuurbbbb
|
||||||
|
wggwrgurburuurwgrrurgrbubgrrgbbbwwrgwrurwrwwrgubuugwur
|
||||||
|
wrgubgbbwbbwruwrrgwgbrruubwgrurgwgrbugbgbggguwbrwuu
|
||||||
|
bgrwuwbggwwgrwbbugwuuwwwbrgugbbrubgugwbgugrbuwgrrbbubbwrrr
|
||||||
|
bwuwgwgugggrbwgruugbwruruwwbguggrbgggrggggwwuuuwugbuwuwgu
|
||||||
|
ruuugrurrrbrrbwuwbubrugwrrbgugbrwuurruwuwrbrbrwubwbwgur
|
||||||
|
rwugrbuwgwrwrbubggwugbrrgwwubbguuwbgbwuggrrrrggwrbrr
|
||||||
|
wbbrrruwuwubrgbrgbggrbgbburbugbwrrrubbbbggrurrrwb
|
||||||
|
ggruwrgubbururbrggurburuwrrwubwbuwwruruwbwuubwbrwwwrwr
|
||||||
|
wwuurwuwrwbwguuwwrbwgbuurgbbrgrbgwgwggwrgwgwwuuwgrwbuwrgbu
|
||||||
|
wuburbrwbgwrruurbrrrgwgbgrwgbwwwbbgrugubbrwuwububbrgbw
|
||||||
|
gwbwwwgrubwrguugbrbrbggguguuuugggwrbgwguwbrwwuuwggw
|
||||||
|
ubrbruwbururrrgwurrrbrrubbgbwrrggubbuburgwruwggurbrwb
|
||||||
|
rbrbrwwgwwurburubwgugwwbwuubuwbrwrrgugguwrbrrgbrrbrbw
|
||||||
|
grgubrrwbbwwwbrbbwbwwbgbbwrwrggbrrrbwwbwgbrgugguwuwubub
|
||||||
|
rurbrbrggruurgwguugugrrwrbuuwbwrubbbuburrwgruubu
|
||||||
|
ubrwguwgruuwwbbuwbrubugrgrurwrbwbwgbwrbubrgg
|
||||||
|
uuwgubuugwrbggbrrwurbbuwrurbubbbruwgrrrbrbwwwg
|
||||||
|
ububuuwuwwrugrrwrrbgurbrrrggwuwrubbgwwwurbb
|
||||||
|
bwugrrrgwurwgrbrwurbbbwbrurrwwgwwugbgbwgwuu
|
||||||
|
bbwgugurwurwbugugrgwburggurwrbbbbgwwbuubububurwuurggwubg
|
||||||
|
wuugbgbbwuubbbrrgbgubbgrrrbrgugrbwguuwgburrwrguuwgrbg
|
||||||
|
urbguwwwuugbgwwubwurubrrwbruwwugrgwwburrugugwbwbbu
|
||||||
|
uguugwgrgwburrrugbwuwgwrbwurgbbbbbwurbbgubwr
|
||||||
|
wuwrrrwwwwbwburbuburrrbgwuuubbwggrbwuwwgbrbrbwrw
|
||||||
|
wwbwbuwggbrgbrbwrwgguggwbugggrbwgwrgrgbgrrgbuurwubbr
|
||||||
|
rugbgwgugrgrugwwgwruurwbrwuwggbbrbrrggwwgwbubbug
|
||||||
|
wwrgubrgbwbbbrbuubuurbwbgbuugbwgguwrwbugbwrbwuwwrgb
|
||||||
|
bbrrwurbggbguwgwggrwbbgguubuuurbruwwrwuburbrrg
|
||||||
|
wuurugrubwrrbbrbbwbubbgburrrbugwuwwrgrrrwwbwg
|
||||||
|
uwgbugbuugrrwrwwuuuwwwrrgbubwugruubrwburgbbbbruwwgubrugb
|
||||||
|
wrwwuuwguruwrgrwgurwgrurwggubugrrugwggrbgbuu
|
||||||
|
guguugwrruwurugwgrbbwrbwwurwgggubugrugruuwrubbbgggwuubgrrr
|
||||||
|
gwuggrwbrgwuuurrbgbwbwrbrggguuwbubbrbrurwwuwugrubrwrwubwgw
|
||||||
|
ggrrwwrrggwuguuwgbgbgrbbbbgbwrrgguwgwggurubbugbgw
|
||||||
|
rbggurrgrrgrrbrbrgrbuggwubwwburrrrgbbwuuuuuwrbwbbgbrbwbwwb
|
||||||
|
bwugwbwububgbgwrbuuuwrruwgubbgruggburwburbrrwg
|
||||||
|
urrrbrwbguugwgbwrubguwwrruuguuwrbgwgwrbugwbrggbgrbuguubb
|
||||||
|
ururrgbbruuuwuubugubugbgwgwbruwgwwgwbrbgbubgwwgurgwb
|
||||||
|
wbwbrbgwurbgwbuwwbbbrrbbbuwrrgbwgurwugwburrrruwrgb
|
||||||
|
bbrrbgrrwbwuuuwwruwurwwuwgrwbgwugbgwrrwwwuubggrgrgrgrbwbrb
|
||||||
|
guguguwguwbggubbgurbugrwruguururuuuuggbrgrwguwubbwww
|
||||||
|
gwgurbrwguubuuuggwgwrurruwbuwrgwuuwugrrgrgrwrwurubuuuwgwg
|
||||||
|
rbuguuubrgwwugurgugbuugrrgwbbgubuuurguurruwrurbrrgwgrurrw
|
||||||
|
bgbbgrbgggwggbwwuggbrrbbgguurgrwuwurwrgwgugwbwwgrgubbb
|
||||||
|
rrrurgbggwgrrugurbrubbgwwrwuugwuurgrwurwrwbuugwuurgggwbrww
|
||||||
|
bburbwwrrwuuwuwuwubbwurwbwwrbwrubwugruruguwbu
|
||||||
|
rwbrwugruuruuwgugbbrrgwurrrburwrbugrubbbrg
|
||||||
|
rurugubuggrugbwrwwuwrggbrwruuggurrrgwgbgbwugrgbrurr
|
||||||
|
rrbuuruwrgubbubbgbruubgrrgwrrwwwgubwbuuburwurgurruwwrbbrw
|
||||||
|
gbggubwgrwwgwbgugbwrwgbwgubbbugggwwwrrbbggbwbwr
|
||||||
|
uruuugbubwuwrubwgbbrggrwwbguurgwgugbuwrgwbbwru
|
||||||
|
wuurrrwburwbbugubwwrgruwrrbgrwrrwwbwbbrruggbwuug
|
||||||
|
bggrwbgbwbbbbwwrurgwbrwuuuubwwbbububrbrgwgrwbrrrbrugrrrgrw
|
||||||
|
bguguurrgbugrrrwugrgggrbguwgruuwbuwubrurrrgb
|
||||||
|
ggwgrgbwrrrwuugbwbgbwgbbbburbrwbrwbrrrwggurbwrrrbbbgrbwuu
|
||||||
|
uugggwruuuururgrggbrwuggruwbgbuguuwwubrbbgwbrgubrgubrgbbww
|
||||||
|
uubwuuwrgbbrbwrbrbbugbbrbgwwrwwgwggbubwwgwuguwububgbu
|
||||||
|
gugbwwrwuuwrwrgrubwrwgbrgrguburwbrwwrbbgwuuggwggu
|
||||||
|
wwwwubbgrbubbwuwgbrgbgwubwubwgrrurwgrrggbgubburwgurgwb
|
||||||
|
grrrrwugwurbgrgwubbgrwrwbbuwguwgbbggbwuuguuwggrubwwuwggg
|
||||||
|
rrugggwburrwgbrbwbgwgwuwbubugwwrrwugwrrrwwbub
|
||||||
|
rbrbgwuwbggggwrbgwgwbgburwgurguguurbguguguwguuwggwgwr
|
||||||
|
wbbgrwbrrrrrbrurgrbugbuwrubwuwrgrwgurbgruuggurrrw
|
||||||
|
wrgrgbggrwgugbggrrgwuurrwbgrwgbubrbwrrubrggbrbgrrwuu
|
||||||
|
wuurbbrgubwrgurrugbwubbrbubruwbugrrbrwuwbbbbbbbwuwuw
|
||||||
|
wwrggrbbrgbuwgrrgwbugrubguuggugurgwbuuwgbguurgrr
|
||||||
|
wbwrgugurrwuuwbrrguwbgwurwwbbbgbgrgrwgbbuuwurburrbub
|
||||||
|
ggrbgwuubgrbgwbbbubugwruubuwwwrbgbwrggggggbubgrbwrw
|
||||||
|
bugrwrrgbwgugrgbrwburgrgbwbbrrwbgguwrbgwug
|
||||||
|
wwbrbbrruuwbgwrurgwrrguugwgrbbgbgguugubuwbgwubuwgbruuburw
|
||||||
|
gbugbuggrggbuwruuwbwbbrggrbubwbbwrrrbwgrguburrbwguwugu
|
||||||
|
ubgwggubbgguugguruubbugwuuwrbwgugbuuruwgwgwubugr
|
||||||
|
rguwbrgwbubwggbuubrrwgggggruwuuggwbbrwbgwg
|
||||||
|
ggbugubrbbrbwbruwwrguwbgruruuuwruugwbuwgwrgwurgwugwwbggub
|
||||||
|
gwuwburguwwgbrgbguguwwrbwgwurbbgruuuubwuubbwubgbu
|
||||||
|
bguwwrugrgbbuguwbwrbubbrwbbubuggwbgbbwwwrugbrgwrbwggu
|
||||||
|
wwwrbuuwuwgwrbwruwuggubrgbgwbuwwrrgguugbruuubrwg
|
||||||
|
wuuuugrgugugguwwrgurwurbbbrwbwwrgwuuwubgwru
|
||||||
|
uruuwrwrugrwwwwwrgbbwgbgbrwrwgrwrbbbrggurrrw
|
||||||
|
bggbbggbrbbrrgrgwurggrwbggrgggwbrbwwuguugb
|
||||||
|
bbrugbgrurwugwbgbbgrwggbrgbuwubgbrrwbbubwbrb
|
||||||
|
uruwbbugbwrrrgggbwbrrwgrrbwrgwgbgurrbbgwrrgwbuwgw
|
||||||
|
wrrrrugwbrgrgwbguwrbbubrwubwbwwwwwwbburbuwgwwbubrugbwguug
|
||||||
|
wuugrwrwwrwbbgwgugugurrwbbwwwwugwwbuuurbwgwrbbggugwwwwbgur
|
||||||
|
uuubbrbrrubwgbwbugguwrwbgwrubwbgbbubgrwugbgrwurubgrgbwrr
|
||||||
|
rbuguwurbrgwbubwwuwggrwuwgrbgburgubrggrgrbwwwbwbu
|
||||||
|
grrbgwgrbwbrwwbbwgbgbbgrbguurbrwwwgugrgubububbwwbuwugrbbr
|
||||||
|
wggguwwbwrrburbuwbwgbwbugbwgrurrrbrgubwbwug
|
||||||
|
uuwugrrwwbguuugrbrrrbuwuubrguwwgrggwrgubbb
|
||||||
|
ugrbwwgruwbrwbbbrwrruwbwgggugbrrbwwurbggwururgrgurwuw
|
||||||
|
rwgurbrbgwgugwuuuuwbggwwbbgrwrgrbgwuruuubgu
|
||||||
|
bgbrwuuuwrrgbbuuwuwwrgrgbrbrubbbbbrwubbwrbgbuuurbrubuwuurb
|
||||||
|
bwgrbrugwggubgrrgbbrugwbbubwwbwwgwrbgwgrurrrbugwguruwu
|
||||||
|
ugbggrbwrrwwbbrwuurbgwwbuggwggbugbgrrgwbrurrguwwubgwrgw
|
||||||
|
uruuwuwwugubwgrugurbggwgrwuuugrgwrrwuwgrrbwrg
|
||||||
|
wbgwuwbgbwuburguwbugwgggrrurgbgugggrrbwugugrrbbbwuguuuurbg
|
||||||
|
wgurrbuwuruguurgwgwbgugbruruwwggubwrwuuubgwrwwww
|
||||||
|
wguwuwugurbrwwuwrgurrbbrwggrrrbruuwbgrwbgwgubuwuwg
|
||||||
|
gbgugrbgruuwgbgwbgwwbwruwgbrgbggrrgrwrbubrgrbgbr
|
||||||
|
wuurbbwggrbbgwrgurbwwbuwggrurgrwrbwbrrbwbugubw
|
||||||
|
wburgrurggrugrbuuggrrbgwrgwbgububgrwbrbugggwrwrgr
|
||||||
|
ubwwgrubrrrbbwwrgrrubggubrrbgggwwrrrguggbugubrubburubw
|
||||||
|
uwwururrbubugbwugwrbuwruwwwrwurbrbwrrgguubgguubww
|
||||||
|
urbrrruwwrrrwgbwwuwubuuwuuwgubbguubwubgurwwgg
|
||||||
|
gbrbgbbrrrbgbgbgwbbgwgggbwbrwbbuugrgrbuuuwubrgbggrrgwuubw
|
||||||
|
gububrggbugrrrwrbguggwwwbwuurwggrrbgbgwwru
|
||||||
|
bbgbbgbuwrwrrubrrurgguwurbwurrbugbwbrrugrwgwbrwrggbbrwww
|
||||||
|
wuugrbgguuuuubruurgbrbrbubuuwwguwguwurrbbgruubburwwbbrb
|
||||||
|
grgrgrruwbuuubrurwwwugrrggbbrugwrwgruugburu
|
||||||
|
rrbbbbrguwrwgrwgwgrbwurgwrrwwbbgbgburbgwgggwb
|
||||||
|
rwgwbrwwgwbguguwurgwurbwwbrbgrbgbruuwbuwwrgug
|
||||||
|
wuugwwuubrwrubrbgbrwururuuburwggrurrgbwubwuggubbwbruuuwrwg
|
||||||
|
ubbgwbugrwwbuwrggrgwgrrwrwwgggurrrgbrwgrwubrwrur
|
||||||
|
bwububgwwbuugrwrggggrruguwrugwrgbguwrrbgbbbwburruwrgwrurg
|
||||||
|
rruwguuwwgrgburwrbrbubwgbugwggrurgrwbubrguwuwbbwgrbuww
|
||||||
|
rrbbrwwbrgwwuwrbwggbubbuwwwwwrbrwbrggrubwg
|
||||||
|
wrwbwwrbuubwwuubwrwrrbruuwwbwubbbgbgwguwburwuubbg
|
||||||
|
ururgrwggrgugugbwrbggwgugbrbugrwwgubugbrgburrurbrggg
|
||||||
|
gwwuwuurwrbbwuubrururruggrgrgwurrrgbrbrbguwrr
|
||||||
|
rgwwwrwbwrggruuburuugbruuugbgbgwgugwbugubuwwgrrrru
|
||||||
|
wwrgrbwugurbgrgwgruwrbwuubbwgwggrrggubbwugbwwrrrgbbwuu
|
||||||
|
gbwurggwgrrguurgwwgrggggbbbwgburwbgrgwwwwbr
|
||||||
|
ggbbgrbbwbbgwburgggwgwububrbwbguuurggbubuuuwbwggugu
|
||||||
|
bwbrwuwuuggbubggrwgguwugbgbubuurubwrugubwrurrugguuwrbr
|
||||||
|
ubrrgrbbrrugubuuubbwuwrwbggrbrbwgrrubbuubwg
|
||||||
|
uurbbubwuugwguwrbrgwrbbrrruwwgbwwubrgrwubguugrgwuwrg
|
||||||
|
wugbrwbrgbwugubwrrgurrrgurgwguubwgrwrbggurrbgg
|
||||||
|
wubwgrugruuuwuugwwrugwgbbgwwruuwuggurwwbrruw
|
||||||
|
bwrgruurugbwwwwbwrbrrrbrggwbburrwwugrruurbbwwggurbbbr
|
||||||
|
burrrgurrwrggbuwruwgrwwbwbgugwwwggwwurrbuwbuubbrrrwr
|
||||||
|
wrrrgrwgwwwrwgrbgrrwuuuwgwrguwwurrrubguwurgbrb
|
||||||
|
uwgwurwrwgwgbuwbgrrbubwwbrbuurubbrbbrrurubwb
|
||||||
|
wbrggubgbwbbwgrrurwwburbwruuruwugrbguwrwbuwuwbwwbuwbu
|
||||||
|
rgurgrwrurbwbwbrruuwgbwrwwbgwuubgwrugwbrwwbwbguwwbgrgrugw
|
||||||
|
rbggubugwbbggguugrwwbrwgwbgburggrgrbruubwbrbrbrbugguwwrgb
|
||||||
|
wruuggrbwgwwrgrwggugburwwgwgbrurwwgbgwuubrwbrgugubrwgbwgu
|
||||||
|
bggwurruuwwrggwbgwuburrwbrwrbwwrrggwuggrburgwguu
|
||||||
|
uwrrguugbwburwubwbuwbwrwgbgbwurguubbwbubbwbgrrrruub
|
||||||
|
rugguugbgrgbwrruurrbwbrbrgururrrwguurgrbrwgwu
|
||||||
|
bggbgrwgruwbugwrugwbwbubbwgubgubwbwwwwbgwrwrgwrwruwgwbuw
|
||||||
|
gurururrwguwuwbggbggbbrbbwbwgububrrubbrggrwgu
|
||||||
|
uugwubgugburrgrwurrrgwwgwwwrwubgbgurwrwuwuggbbguwrgugbgu
|
||||||
|
urbwgbbugrbrruwwwrwgbbbwggrwbbuugurwgwguug
|
||||||
|
rbrwwwrbrgwrbwbbugwugbguuggbbgbrgbuwwrgbugr
|
||||||
|
rbrubgwbwbubbgbubwwwrbgrwggbbguugwuguwwgwbbbbu
|
||||||
|
bwbgurbrbgugwrrbgbuggbrrbwwbrrgbwggrrwubbwbrgwg
|
||||||
|
grwuggugggurrbwbuuwrrwbgggwbruwwrbwugrrwrgguwwwrbgbu
|
||||||
|
rguwbbbrgbgrgbbuwurwuwbbgwburuwbugubrwgubrrbbruwbrr
|
||||||
|
uruwrbruruwbubbrgwwrruwrurbgwrurwwgwrruggrbguwurggggg
|
||||||
|
bbgbwwbwgbrggrgbgggrgrrwgwgggwgggwuuugrbwrrwbwb
|
||||||
|
grbrbbgubgbgwuwwgwrbgguuwugbrurwbbugrrbwrru
|
||||||
|
wgwwgbwgrurgwgruwugrbbbbrgbgbbugwgubwubgwwwur
|
||||||
|
wgurubbgbbguuwggwgrwbrgwbruwggrbrrwwuugbgwgwbbgggwg
|
||||||
|
uubbwggugwrwurbwwwuubgrwbbbbwbguwbgbbuwgrrburrwguguuwuuu
|
||||||
|
urwrgbrgubwwubwurwwrrbwwwgbwwrbuguuguuugrubwbbwwwubr
|
||||||
|
wwgwuurbburbwbwwwugrbwggugrrwgwugbugubububuurur
|
||||||
|
rugbwwgwwuwbbwbrguguggugrruubbwrwbrurwwwgwubbrrwwb
|
||||||
|
wuuuwrgbwruwwurrrgwwrgugwwbubgbbgbggrbrgg
|
||||||
|
wugbuwgbugwrrrgbbbgrbuuwwuugrbgbgwrgubugggrgrbugbggggwrr
|
||||||
|
wurwwwgwgbuwggbggwrwbwuwuwuguwwbgggwgrbgwbbbbg
|
||||||
|
gugrrrrrbrgwubwruwrgbruwwwbbguruggbubrwugwbwwbugbuwww
|
||||||
|
bbwgrbrggbuburgrwrbwbbbgbwurrruguggurbwbgrwwrr
|
||||||
|
uguwbbgwugbguggrruggbbrrubuugurgugwuubwbwwr
|
||||||
|
rwgbuwwbwuwwwbguwgugwgrbbuggubgwrurgrbwgbuugbrwr
|
||||||
|
wurbubbrgburwguwrrwuggwbrrrugbwbuuruubrrgrguuwwuururwrbww
|
||||||
|
rbubgwuubrrruubrbwbwuugugurrwugurwgwbwrurb
|
||||||
|
bbgrwuwwubruuwbwwgrwrbrgruruuwubuguwugbgrbgrwugrwrgbugburu
|
||||||
|
wuuuwwgrgurbgbwbwbgrrugbrwggrbrrubgwurwurgrbbrbu
|
||||||
|
rwbbuugrbbwubwubwrurggwwuurbbwggbwuurubrburuguwrrrrw
|
||||||
|
bgbgugwwubguuuwbuugrbbgwwwgbuwurbrgrgbuwug
|
||||||
|
wuugwbwgwwubwuuuwuwgwurburggbwwbrwwrwguuruwubwbguuwgw
|
||||||
|
grrbgrbbugwguwbrburrbrrwgbbrgrruwwurubbuwbgubbwgruwbgbb
|
||||||
|
bwuuwwururgugbrruugrrrugrgugugbggbbgbbguurrg
|
||||||
|
rgurgugrwurgbwwbuuwubruwgrwbububuuwruwggwrbbbbbbbwwbb
|
||||||
|
wuugrbgwwwgburbwrwgugrrgbbbgrgbrwwrgurrbbwbwuugugrgbubbrrrrg
|
||||||
|
ubrbgrwbuugrgwuurgrwbbbbrurubgurrgwubruubggwwgg
|
||||||
|
rwwubuuwrrrrwwwbruruuwbuwurwbubrbgrruuuwrwrwg
|
||||||
|
rggbgubbrgbgrrbgwwwrgwubrubwruugbwrwbbgguugubrubuwg
|
||||||
|
gbwbwwgubuubgurruwwwuwrrbuurgggurbbbbubbrbgw
|
||||||
|
gubggbgrbgwbbuwguggwuwgbwrrwwgbrwrrrgwwbgug
|
||||||
|
wuuruwgubbwuugbbburrugbggwwuruuuubbgruwbrr
|
||||||
|
gwgwruugwuurubburrrwrbgrurrwrwbbbbbwuuwbugrw
|
||||||
|
bgbwuwururguwuwbuubwbubugbwbuurwurbwbwgrgbwwwgwbuwubru
|
||||||
|
bruuwbugbbgrgubrggbggbgwuwbwwwrbwuwwwuuwgwgugrgwbbuwubbguu
|
||||||
|
wurrbbwuguuugrgurwwbwbgwbbbwbbuuwbbgurwrrbubwbbbbwubb
|
||||||
|
bwuubrguububbgrubbrgbgwwbgbbbgwbrrgwggwgggurgbwwwwuur
|
||||||
|
wgwuwbgrrurbwgwugwruwbubwgrrrwbbgrbuwubgbgw
|
||||||
|
rrbbrrbbwbbubbwrwgwrbrwwbbbbgwbguwgburwgbggr
|
||||||
|
wuugbbuguruwugwrgwbbuggbwbwwbbuwwuuugwbguwugbwggrbrr
|
||||||
|
gwgbburbguwuurrrgwbuwrurrbuwugwrgbgwrgwwwwurubbgbwr
|
||||||
|
wubugurgrbrbbbwrrwurwuuugwuwrbbbwwbrgbbrurrg
|
||||||
|
wrwugbwwbbbrguwuwugbwwuwgwubbbgrrbrwguuububbggbwwbwwrwbg
|
||||||
|
bugwuwrwuwwggwwuwrwrbruggrurgwwurrguwugwrwg
|
||||||
|
rbrgrwbwrurwbubrugwwgguwrrgwgwuwwbrrgrbrgwruwgbgbrbbru
|
||||||
|
rwwwrwruruuubwgwbgubrbgbgrwwuugruurugbrwbwuuwgbwubggugg
|
||||||
|
uuwugbbwrwbgrgwubgwwgrubbwrbbwwwbbwbbrbwrrugrgggw
|
||||||
|
wggubrrbgrggrwgguwggubwwrbrbgbgrrgugbggbgg
|
||||||
|
uwbuwrrgwguwurbwbbgbrbbrgguuggrrugrwrwbgrrurru
|
||||||
|
grrrgurgwububbuguwrguuuwrwwurbbwrwwguwwwrggbrbr
|
||||||
|
wubbgwbwbrbrgbggurgbrwgrubrurbrrrwrurgbbrwurgrrgugbwurrbg
|
||||||
|
wruwwrwgwrbwubrbwubbbrbuurwwwugwugubuubwgbbbubgrrgbrgbw
|
||||||
|
rwrrbgwurrgrbgrrrguugwwbgwwugbbgwwwuuuwgugwuwuwuubuw
|
||||||
|
rgwwugwwurgubwgrbwbwwgbbbubbrggbgrugguuubuuuugbgbgug
|
||||||
|
gruuruwbwbuururbwrwrgrwuububgwgruggwbwrgwbub
|
||||||
|
gbbwrurugbbwrurwwbgrruwgbrbrbrrgrwrbbgbgwbgwgwuwrwgrgu
|
||||||
|
wugwwgrwbgugurwurbggbrwruwuuwurwrbrwgruuubuurur
|
||||||
|
wgbuwbrbwrgrbwuwggugggguuwgbrbwgrgwrurrurbrgugrgwrb
|
||||||
|
ggwubgbwwwgrwwbbggwwrrggwguubuggubggguuwbwuwgwuuugrgbuubbb
|
||||||
|
rguuugwbrbrbwbgrggbubwrwwrrrubwwuugugwgrbuu
|
||||||
|
ggugbrggwbuwrwgrgwugurrbgruurruwwgrbwwubbuubr
|
||||||
|
ubgwwggbwbuwbbbbbbggbwrgrbgrgugurwggrubburrubrwrrggrgg
|
||||||
@@ -1,13 +1,19 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"aoc2024/day02"
|
"aoc2024/day09"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data, _ := os.ReadFile("day02/input.txt")
|
start := time.Now()
|
||||||
fmt.Printf("part 1: %d\n", day02.Part1(string(data)))
|
data, _ := os.ReadFile("day09/input.txt")
|
||||||
fmt.Printf("part 2: %d\n", day02.Part2(string(data)))
|
fmt.Printf("part 1: %d\n", day09.Part1(string(data)))
|
||||||
|
fmt.Printf("part 2: %d\n", day09.Part2(string(data)))
|
||||||
|
elapsed := time.Since(start)
|
||||||
|
fmt.Printf("Execution time: %s\n", elapsed)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 6320029754031
|
||||||
|
|||||||
59
2024/go/day04/day04.go
Normal file
59
2024/go/day04/day04.go
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
package day04
|
||||||
|
|
||||||
|
import (
|
||||||
|
"adventofcode2024/utils/grid2d"
|
||||||
|
"adventofcode2024/utils/inputs"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
val := 0
|
||||||
|
grid := inputs.ToGrid2D(input, "\n", "", '.', func(c string) rune { return rune(c[0])})
|
||||||
|
directions := [][]int{{0,1},{0,-1},{1,0},{-1,0},{-1,1},{1,1},{-1,-1},{1,-1}}
|
||||||
|
for j := 0; j < grid.SizeY(); j++ {
|
||||||
|
for i := 0; i < grid.SizeX(); i++ {
|
||||||
|
if !checkChar(i, j, grid, 'X') { continue }
|
||||||
|
for _, dir := range directions {
|
||||||
|
x := i + dir[0]
|
||||||
|
y := j + dir[1]
|
||||||
|
if !checkChar(x, y, grid, 'M') { continue }
|
||||||
|
x = x + dir[0]
|
||||||
|
y = y + dir[1]
|
||||||
|
if !checkChar(x, y, grid, 'A') { continue }
|
||||||
|
x = x + dir[0]
|
||||||
|
y = y + dir[1]
|
||||||
|
if !checkChar(x, y, grid, 'S') { continue }
|
||||||
|
val++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
val := 0
|
||||||
|
grid := inputs.ToGrid2D(input, "\n", "", '.', func(c string) rune { return rune(c[0])})
|
||||||
|
dir1 := [][]int{{-1,1},{1,-1},}
|
||||||
|
dir2 := [][]int{{1,1},{-1,-1}}
|
||||||
|
for j := 0; j < grid.SizeY(); j++ {
|
||||||
|
for i := 0; i < grid.SizeX(); i++ {
|
||||||
|
if !checkChar(i, j, grid, 'A') { continue }
|
||||||
|
if
|
||||||
|
(checkChar(i + dir1[0][0], j + dir1[0][1], grid, 'M') && checkChar(i + dir1[1][0], j + dir1[1][1], grid, 'S') ||
|
||||||
|
checkChar(i + dir1[0][0], j + dir1[0][1], grid, 'S') && checkChar(i + dir1[1][0], j + dir1[1][1], grid, 'M')) &&
|
||||||
|
(checkChar(i + dir2[0][0], j + dir2[0][1], grid, 'M') && checkChar(i + dir2[1][0], j + dir2[1][1], grid, 'S') ||
|
||||||
|
checkChar(i + dir2[0][0], j + dir2[0][1], grid, 'S') && checkChar(i + dir2[1][0], j + dir2[1][1], grid, 'M') ) {
|
||||||
|
val++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return val}
|
||||||
|
|
||||||
|
func checkChar(x int, y int, grid *grid2d.Grid[rune], c rune) bool {
|
||||||
|
if x < 0 || x >= grid.SizeX() || y < 0 || y >= grid.SizeY() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if grid.Get(x, y) == c {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
35
2024/go/day04/day04_test.go
Normal file
35
2024/go/day04/day04_test.go
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package day04
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`MMMSXXMASM
|
||||||
|
MSAMXMSMSA
|
||||||
|
AMXSXMAAMM
|
||||||
|
MSAMASMSMX
|
||||||
|
XMASAMXAMM
|
||||||
|
XXAMMXXAMA
|
||||||
|
SMSMSASXSS
|
||||||
|
SAXAMASAAA
|
||||||
|
MAMMMXMMMM
|
||||||
|
MXMXAXMASX`)
|
||||||
|
require.Equal(t, 18, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`MMMSXXMASM
|
||||||
|
MSAMXMSMSA
|
||||||
|
AMXSXMAAMM
|
||||||
|
MSAMASMSMX
|
||||||
|
XMASAMXAMM
|
||||||
|
XXAMMXXAMA
|
||||||
|
SMSMSASXSS
|
||||||
|
SAXAMASAAA
|
||||||
|
MAMMMXMMMM
|
||||||
|
MXMXAXMASX`)
|
||||||
|
require.Equal(t, 9, r)
|
||||||
|
}
|
||||||
140
2024/go/day04/input.txt
Normal file
140
2024/go/day04/input.txt
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
MSAMXXMASXSXMMSASXMASMXMASXSXSSMSSSMMMSSSSMSAMXASAMXXAXMSMMMAXMAMSAMXAMXMXXMXMASMXSAXMXMAMXSXSXXMSSXMSSMMSSMMMMXSXAXMXMAMMASMSXSXSSXMSSMSSMM
|
||||||
|
MSASASAAXSMAMMSAMXSXXMAMXSASAAAASMSASAASAAAMMMSXXMMMSMMXAAASMMMMSAMXSAXASMMSSMMXAXXMSSXXMSMMASMXMASXAAXAAAAAAMAASXSAMAXSMSMMASAXAXAAAAAMAAAS
|
||||||
|
ASAMASMMMASXMAMAMXXAXSMSAMAMMMMMMAMMMMXXMMMMSASXXMAXAASXSSMSASAMXMSAMXSASAMAASAMXMAAAMXMASAMAMXMMASMMMSMMSSMMMMMSAAASMSMAAMSAMAMXMXMMXSMXXMM
|
||||||
|
MMAMAMAAAMAMMASMMXMMMXAAMMXMMXXXMXSXASXSMSXXMASAMSSSMSMAAMASXMASAAMASXSAMXMSSMMXSMMMXSAXAXAMSSMAMASXMASXMAMMSMMASAMXMMAMMMMMXSXMSMXMASMXSASA
|
||||||
|
XSAMAXSMSXAMSASASXMAAXSSMXXXAXMXSAAXXSAAASASMAMAXAXAMXMSMMMMMSAMMMSXMMMAMXAXAAAAMXMSAXMSSMSMASASMAMXMASXMAXAAAMMSAXXSSXMXSXMXXAMXMMMSMAASMMS
|
||||||
|
MSXMMXMXXMMMMASAMMSMXXAAXXSASMMAMAMMXMMMMMAMMASAMMSAMSXMASXXXSAXSXSMSAMASXMSSMMSXAXMASMXMAXMMXSAMSSSMXSASAMXSSMXSASAMXMAXMASMSSMASAXAMMMSMAM
|
||||||
|
XMAMSAMMSAMXMMMMMAASMMSAMXXMMAMASMXSAMASXMXMXASASXAAASASAMMMASXMSXMASXSASAMAMXAMMSMMXMXAMAMAMSMMSAMAAMSAMXSAAXMASAMXMXMASMXMASASASXSMAXAXMAS
|
||||||
|
SMAMXASAMAMXMMXAMSSSXAMASXXXXXSASAAXASASXMAXMXXXMMXMXSAMXSXAXSMMMAMAMAMMSXMMSMASAAAMXSSMMXSXMAAXMASMMMMAMAMMMMMXSXXAAASAMXAXXSAMXSAMXSMMXSAS
|
||||||
|
XSXSSMMXSAMXMMMMMMAMMXSAMMMMSXMAMMMSAMASASMSSSXAXMAMXMMMMMXSAMAAXAMASXSAMXXSAMXMMSMMAXASAAMASXSMSMMMAAXAMSMSAMSASXSMSMSAMSMMMMMMSMMMAMASXMAS
|
||||||
|
MAMXAAAAXMMAMAAMAMSMSXMASAAAAAMXMAASXMMMMMAAAXSXASAXMXMAXSAMXSSMSSSXSXMXSAXXMSAMXXXMXSAMMMSAMAAAAMASXMXMMMAMAMSAMAXAMASMMAMASAMXAAAMAMAMAMAM
|
||||||
|
SAAMSMMSSXXAXSMSAXXASXMXSXMMSAMXMMMSXSXSAMMMSMMSMMAXSASASMAMAXAAAAAAMMSXMXSXASMSAMAMAMAMXAMAXXXMAMASAMASAMAMMAMAMSMMMAMASXSASASAMSMSMSSSSMAM
|
||||||
|
SXMAAXXAAMSXXAASMMMMMAXMSAMXXAMXXMXMXXAXAXXMAAMXXMSMSASXXMSMMSAMMSMAMAMAMAMMXMXMAXAMASAMMMXSMXMASMMSASASASXSMMMMAAAXMASMSAMXXAMMXAXAMXMAMSAS
|
||||||
|
SAASAXSMXMAMMMMMMAXASXMASMMMSAMMSMAMSMSMSMAMSXXASMMAMMMMSMMAMSXXAXXXMMSAMASASXSXMMXMAMASAMAAMMMAAAASXMASMMXXXXAASXXMXAAXMMMSMMSAMXSMSSMAMSXS
|
||||||
|
SAMAAMSXSMMSMAAXMMSMMMAMSXAAXSMSASASXAAAMSSMMMSXSAMXMAMASASAMXMMMSAMXAMASXXASMSAMSSMSSXMAMSSSXMXSMMSXXXSAMXAXMMMMASXSMMXXSAMXAAAMAAXAXMAXXAM
|
||||||
|
MAXXSXSAMMXAXMSSMMMXMMSMMMSSXXXSAXXXMXMXMAXXAXMASMMSSSMASMMAMAAMAXAMMSSMMXMMMAMAMAAAAXAMMMXAMMMMXXAMXMMSAMMMMAMSMAMAAAMMMMAMMXSMMMXMASMMSMAM
|
||||||
|
XMMMXMMAMSSMSXAXMAASMAXAXAAXMMMMSMASXXSAMAMSMSMAMXSXAAMAMMXMSSMSMSAMAAXAAXMASMSAMSMMMXMMAXMAMAAMMMXXAAAXXMAMMAXXMASMMMMAMMAMSMMAAXSAMXXAAMXM
|
||||||
|
AMAXAMSMMMAASMMSXMXMMAMMMSXMAAAAMMMMAASASAAAAAMXXXMMMMMSMSAMXMAAXSAMMSSMMSSMMAXXMAMASAXMMMSAXMSSMAAXSXMSASXSMMXSAMXMXSXSMMAMXASXMSXXMAMXXSXM
|
||||||
|
XXAMXMAAASMMMAMAMSMSMSSXAXMASXMSMMXMXMXASASMSMSSXSMSXSAXXXASAMXMMMAMAMXAXAMXMASXSMSASXSAAXSMSMXAMMSXMAXXMAMAAAMAMXASXSAXAMMSMXMAXXMSMSSSSMAX
|
||||||
|
MXSXMMSSMSAMXSMMMAASAXMMXSAMAAMAXSAMXXMAMAXAXAAXAXAAAMXSMSMMASAMXSXMASXSMSMXMMSAAAMASASMMMMAAXMXMMMAMXMASMSSMSSSMSXSAMAMMXMAMXXMMSMSAAAMXSMM
|
||||||
|
SAMAAAAAXSXMAXAXSMSMXMASMSXSXXMAXSASMSXMMSMAMMMMMMMMSMMXMAMXAMASAAXSSSMMAMAAMXMMMMMAMXMAAASXMMXMMXMXMSMXAAAAAXAMXXAMAMAMXXSASMMXAMAMAMSAAAMA
|
||||||
|
MASXMMXSMMMMMSXMASXMMAAXASAMXSXSASAMMXXAAAASXMMXMXMAXAAASASMASXMXSXXAXAMAMSSSSSXMAMAMAXSMXXAASMASAXMXAXAXXMXSMSMXMSMASXSAXMASAAASMXMXXXMSSMS
|
||||||
|
MAMMXSAMASXAMXASMMMASMSMMMXMMMAMMMAMAMSMSSXXAXSAMMSMMSSMSASXXSMSAMMMMMSSXXAMMAXMMMXAXXXXMMSMMAASMXXAXMSMSXSAMMXSXXXSMSAMMSMAMMMSMAMXXMSXMAXA
|
||||||
|
MMSMAMXMXMMMMMAMAXMAXMAMXSXSAMMMXSAMAMXAMXASAMSASAMXAXAMXXMASMAMMMMAXXXMMMASMSMMXMASMSXSAAXASMSMSMMXAXAXMXMASXAAMXMMMMXMSXMXMMXXXXSXASMASMMM
|
||||||
|
MSAMMSMSSSXSAAAXXMMAMSAMASASAMMSXMXSAMMAMMMMMXSAMXAMXSAMXMXXXMSMXXMMSMSMXSSMAXAXAMAMAXAXMMSXMXAMAMASASMXSAXMMMMSMASAMXAXXAMASMMSMMSXMXSXMXAX
|
||||||
|
MXASAAAXAAASXXMXSAMXAMASXMMMXSSMMSASAXSSMSXASMMXMMXMMSAMMXSMMMXMAXSAAAAAAMAMMMMSASXMSMSMMAXXXMXSAXMAMXMASMMMXAMAXXSXSXMASAMASAAAAAMAMMMMMSSM
|
||||||
|
SSMMXXSMMMMMAMSASXSMMSASXMAMMMXAASMMSMAAXASAXASXSMSXASASAMXAMSAXAMMSMSMSXXAAMXXMAXAAMMMAMXSSSSMSMXMAMAMMMXAXSXSASMSAMXXAMAXASMMMSMXAMAAAXAAS
|
||||||
|
XAMXMMMAXXXMXMMASAXAAMXMASMSASMMMSXAXMSMMMAXSAMXSAXMXSAMMMSXMXMXASAXXAAAXSSSMXXXMMMMMASAMXAAMSASASXSSSSMSMMXAAMASXSAXAMMSSMMSMSXMMSSSSSSMMSM
|
||||||
|
SAMXSASXSXSMMXMAMAMMMSASXMASMSAAAMMSSMXAMXAAMAMAMXMMMXXMAMXSAAMSXMASXMSMMMMAMXMMMASXSMSASXMXMMXMAMAAXAAAAASMXMMXMASXMMSMAMAXMAMAXMAMXMAMXXAM
|
||||||
|
MMSMMMSASAMXAXMASXSXSAMXAMMMXSXMMXAXAAXMAXMXMAMASAMMASASXXAAXMMASMAMAXXXAASAMASASASAXXXXMAXSMSMMMMMMMSMMMAMAAXMSAMXMXAAMMSSMMAXMMMASMMSMSMMS
|
||||||
|
MAAXAXMAMXMASXMXMMXMAXXSAMXSMSMMMMXXMMMSSSMXXASAXXXAMXAXAMSSMSXASMXSXMXASMXASMSASAMXMMSMSXMMAAXAXXXMAXXXMASMMSAMMMAXMASMMMASXAASASASMAMASAMX
|
||||||
|
MSSMMSXXAAMXXXMAAMMSSXMMXXMSAXMAASMSMXXAAAASMMMMSMSSSMXMMMMAAXMASXMAMXMMMXMAMXMMMMXMSXAASXSMSMSMSSMMSMMXMAXMASASXSMSXAXAASAMXXSAAMASMXMASAMM
|
||||||
|
XAMAXMMXSXSASMMSSMAAMXMAASAMMMMSXMAAXAMMSMMMAXMXAAXAAXMAMASMMMMXMASXSXXSAXXAMXSXASAAMMMMMASAMASAAAMMAAMSSMMAMSXMAMSSXMMSMMASMMMMAMXMXAMAMASX
|
||||||
|
MAXSASXAMAMMSSMXAMMSSXMAMMAMXXAXAMSMSXXAMAXSXMASMSMSMMMXSASASAXASXMAMAMMASAAMAXSAMMSMMAAXAMAMAMMSSMSMSMAAAXSXSAMMMASASAXXSAMXSASMSAMSMSMSAMX
|
||||||
|
MMMMAXMMMAMASAXSAMAMMMMXSSSMMMMSMMAAMAMASMMMMMXXAMAMAMSAMMSASMSASAMAMAMXAMMSMAMSMSMXASMSMASXMAMMAMAXAAXSSMMMASMMXMASXMASAMSSMSASASAMSXAMMASX
|
||||||
|
SASMSMAAMXMXSAMSAMXXAAAMMAMMMAMAASMMMAAXMAMAAXMMXMASAMMASAMMMAXAMAMXSMSMSSXMMXXMAAASAMAAMAXXSXXMAMSMSMXMMMAMXMXMXMASAMAMAMMXMMXMMSAMMMSXSMMM
|
||||||
|
MASAXSSMXSMAMMMMXAXSSXXAMAMXSSSSMMAMSMSSSXSSSSMSASXSASMXMMSAMSMMSASASXAXAMAXMMMMSMXMSMSMSMSASAXSXMMMMMMSXSASXXAMSMMSAMXMXMMMSXSAXMAMAAXMMSAS
|
||||||
|
MSMMMMMSAAMXXAAMAMXXMAXSSMSMMMAMXMAMAMAAXAMXAXAMMSXSXMASXXMAAMAMSAMASXMMMMMMMAXAXXSAMXXAMAMAMXMMAMXAASAAASASAMASXAXMXXSXSMSAMAMXMSSMMMSAMMXM
|
||||||
|
SAAXXAAMSSMMSSSSSMXMMMMMAMXAMMSMASXSSSSMMSMMSMSMXMAXASAMMASAMMAMMAMAMAMAXAAMXXMASAMXMXMAMSMAMMMSAMXSSSMMMMXMMSMXXMMASMSAMAAXMSMAMAXAMAMAMAAM
|
||||||
|
ASMMSMXMAMXAAAAAMXAMAXASXMMSXAAMXSAAAAMXAXASXAAXMASXXMASMMMSMSMXSAMXXAMXMSMSASMMSAMXSXSXMXSAXAMSXMXMAMAMSMSSXAMMMSMMMAMSMAMSMAXAMMSMMAMXMSAS
|
||||||
|
MMMXXXXAASMSMMMMMMXSMSASAAAMMSMSAMMMMMMMSXMMMSMSMAMXMXXMAAAMMAAXMMXXXASAMMASMXAASXMXSAMAMAMMMSMMMSMMAMAAAAXASASAASAMMMAAXAMAMMSMMXAXMSSMXMAA
|
||||||
|
XMMXMASMXSAXMXMXSAMAAMXSXMXSAXAMMXXASXSAXAMXAAMAMXMAMMSMSMMXSMMMAMAXMMMMXSASXMMMMAMAMAMAMSSMAAAAAXXMASMSMMMMSXMAMSAMAMSSSXSXXXAXASMSMMAMAMXM
|
||||||
|
AMXMSAAXAMXMSXSASAXXXXXXMSMMMMAMSSMXSAMASAMSSMSXSASASAXAASMMSAXSSMSMXAAXAMXMAXSXSAMMSMSMSXAMSSSMSSXAMAMXAMSXMASXMSAMXMXAXASAMSAMXSXAMSAMAMMX
|
||||||
|
SAAMMSSMMSASXSMASMMSSMMSAMXAMSSMMAMAMXMASAMAXXAMSASASMMSMXSAMXMMAAAASXMMMSAMXMAASXSXAAAMMMAMXMMAXMAXSAMXSAXMAMXMASXMXXMMMMMAMMMMMMMAXMXMAMXM
|
||||||
|
MXMMAMXAXSXSXAMAMAXAAAAASMMAXAXXXAMXSXSASXMASXSMMAMAMXAAAXMMMAAXMMMMMAAMASXSMAMXMMMXMSMSAMMSMSMMMSAXSASAMMMSAMAAMMMMXMMMSMMMMMAAASXMMSMMAMAA
|
||||||
|
SAMMSMXAMXMMXAMASMMSXMXSMMMSMASMSMSASMMASMSAMXMAMSMMMMASAMXSMXSXSMXXXSMMASXMAXMXMAAAXMAMXSAAMMASAMXMSAMXSXAXAMSSXAASAAAASAAAAXMXMMAAAAMMSSXS
|
||||||
|
SAMMAASXMSAXSXXXAMAXXMMXASAAMAMMAXMASAMAMMXXMASAMAAAXMAMAXAXSAXMASXMAXAMXMAXXASXSMSSSMAMAMXXSSMMXSXMMMMMSMMSSXMXMSSXMMMXSAMSASXSSSSMMXXMXAMX
|
||||||
|
SAMMMMMAASMMXASMXMASAMXXAMSMMSXSXSMMMXMXSSSMSASMXSSMAMASMMSSMXXAMXMAMXAXSSSMMMAAXMAXXMAMMXSXAAXAXSMMAAAMXAAAMXAMMMAMMASAMXMMXXAAAMXXSMSXMASX
|
||||||
|
SMMXSASMMMAMMMMXAMAXAMXMSMMXAXAXAMXSAXXSMAMAMXMAAXAMXSXSXAMAXSMSXXXASMSMAAMXASMAMMMSSSXMSASMSMMMSMASXSSSSMMSSMMMAXMASASASMXXMMMMMMMAAAAXSAMM
|
||||||
|
SAMXSAXAASAMAMASXMASXSSXAASMMMXMASAMXSMMMAMSMAMMMXAMASASMSSMMSAMASMAMAAMMMMSASAAMAMMAMAAMAMAAAMMMMMMAAAMAASXMAXSMSXAMASAMAAXXAAAAAXXMXMMMASA
|
||||||
|
SAMXMAMSMSSXXMMAMXXMAAASMSMASAMSMMASMMXMAMMXMXSASXMMMMMXAXMAAMAMAMMSMSMMMAASXSXMMAXSAMXMMMMSSMMMAMXMXXSXSMMASMMMASXMMAMAMSMSMMMXXSSXMXSASAMX
|
||||||
|
SSMXMAMAAXAXSMSMSMMMMMMXMXMAMMMAAXXMAXMAASMSXMXXMASMSMXMSMXMMSAMXSAAAAXMXMXMAMXSSSXSASMSASAAAAMMAXXXMXMAMXMXMAMMAMAXMAXXMAMSASMSMAMXMAXMXMAS
|
||||||
|
SAXMMMSXSMMMXAAAAAASXSASMAMMMASXSMSSSMASMSAMASXMSMMAAMAMAMXXMXASMMMSSMXSAMXMSMAXAMASAMAAAMMSSMMSSSMASAMXMSSMSMMMASMMSASAMXXSAMAAMAMMMASMXSSM
|
||||||
|
SMMSAMXMMAXAMSMSMSMSASAMMXSASMSAXAXXXAXXAMMSAMMAAMMSMSXXAXXMSSMMAMMMAXAMAXMMMAMMMMMMAMMMMMAMXXMAMAAMMASMAAAAAAASXMXMXMAXMMASMMXMSMXSMASMAMAM
|
||||||
|
SXASMSAMSSMSAMAMAXAMXMAMAXSXSAMMMXMXMSMMMMAMASXMASAXXAASMSMAAXMASAASXMMSAMSASAMAAAXSAMASXMASMMAMMMMXMAMMMMMSMSMSAMXMAMAAXSASMSMXMMAXMXMMAXMM
|
||||||
|
XMAMXMAMAXAXMMAMXSAXXAMMMXMASASMSAAXAAXAXMXSMMAMMMXSXMAMAAMMMMXAASAMXAMMMMSASMMXMXXSASAMASXSAMMMASXMSSXXAXXXMMASAMAMAMXMMMAXAASAAMMSSMMSSSXS
|
||||||
|
SSMMSSSMMSXMASXMASAMSSMAXASASAMAMXXXSSSMXAMXXMMSAAAXAXMMSAMXSMMMMMSSMSAXAAMMMAASXMMSMMXSXMASMMASMSAMAMASMSMAMMMMSSMSMSAXMMSMSMSMSAAMAAXAASMS
|
||||||
|
AAAXAAXMAXAAXXAMXMAMAAXXMAMXMMMAMMMMAAAMMSASAMAMMSMMMMXAMASAMXAMXAAXXAMMMMXAMXAAAAMXMAXXAMAMASAMXSAMAMXMAAMAMAMMASMAASAMXAMXMAXAMMXSSMMMSMXX
|
||||||
|
SXMMMMMMMSSSXSXXXMAMMSMXAAMAAAXAXSAAXMAMAAMSAMASXMXAMXMAMAMASMSSMMSSSMXAAMSMSMSMSXMAMMMSMMASXMMSMMXMAMAXXMSSSMSMAXSMXMMMMAMAMMMMMAXMASASAMMS
|
||||||
|
MASAMXAXXAAXXAMXSMMMAAAXMASMXMSMSAMMMXMMSSMSAMXXAAMMSAXXMSSMMAMXMAMXMXAXMXAAXXXAXMMXSAAAASASMSMAASMSSSSMMXMXAAAMSMXXMASXXAMSMSAMMSMMASXSASAX
|
||||||
|
SAMASXMMMMSMSXMASAAMSSSMSMXMXXAMAMSXSAXAAAAXXAMSMMMXMASXXAAAMSSSSSSSSXSSSSMSXMMSMMSAMMMSMMASAAXMXMAAXSAASMXSMMMAMASXMXAAMMMXASXSAAMMXSMSMMXS
|
||||||
|
MXSAMMSAAXMAMXMAXAMXXAXAXXAMXMASAXAAMAMMSMMMSXMAMASXMASXMMSXMMAAXAAAXAXAAXMMAMMAASXSMAXXAMXMMMXSAMMMMSSMMMASXMXASMMAMXMMAAAMXMMMMSSMXSAMAMAS
|
||||||
|
MMMMSASXSMMAMMMMSSXSSMMMMMSMSSMMMMXMMAXMAXSAXAMMSASAMSMMAXAAMMMMMMMMMXMMSMASAMSMSMAMMXMXAMMMMSAMMXXMXMAXAMASASMMSXXAMAXXSMMSMMXSAMXMAMSMAMAS
|
||||||
|
AAAMMASXXASAMMAMXMAXAXAXSAAAAMSAXMMMSXSMXMMMSSMMMMXAMAAXSMMSMMASAMAXAMXXXMASXMAXAMXMSSSSSMAAAMAXSAMSMMMSMMASMMAMSMMMMXMMXMXXAMASAMXMMMAXSXMS
|
||||||
|
SMSSMSXMMAMAXSXSAMSMXMMMAXMXMMSMMSAMAMXMAMXMAMAXAMSSSMSMAMAAMMASASXMXAXSXMASASAXMAMXSAXAAXXMXXXMMASAAAAAAMAXMSSMMAASMMXSAMXSSMASMSMMMMMSMAAX
|
||||||
|
XAMXMMAMSSXMAAASMXAAASXSSSSXXXXAASXSSSMSSSMMASMMSAAAMAMXAMSSSMASAMXXASAMAMAMMMMSXAASMMMSMMSMSMAMSMMXSMSSSMSSXAXMMMMMAAAMASMAXMASAAAAAASAMAMS
|
||||||
|
MAMAMSMMAXAMXMXMASMSMSAXMAMMMSMMMSAXXAMXAAAMAMAAMMSMSMSSXXXAMMAMASAXMMASAMMMSAASMSMMAXAXMXAAASXMAXMAMMMAMAMAMMSMMSMSMMMSAMMMMMAMMMSMSXSAXSSM
|
||||||
|
AXSAMAMMMMXMMMMSMMXAAMMMMAMAAXAASMMMSMMMSMMMASMXMAMASAAMXMMMMMMSAMMMXSAMASXAXMXSAXAMXMMSSSMMMSXMMMMMMXMAMSMXMXAMXAAAAMXMMMAMXMSXXMAXXMMMMXAX
|
||||||
|
SASMSXSAAMSMMAASXSSMSMSXSXSMSSSMSAAMMAMMMMXSXSXXMMSAMMMMAMMXSAMMASXMAMMSXMMXSXMMMMMASMMAAAASXMAMAASXMASXMAMMXMAMSMSMMSAMSSSXMAMAAASAMXASXSSM
|
||||||
|
XXSXMMSMSMSAXMMXAAAAAAMXXMSAMAAAMXMMSAMMAMASAMAXSMMASXMXMSAASAMSAMAMASAAXSMXAXMAXSMAAAMMSMMMAAXMAMSAXXSASXSAAMXMSXMAAMXXAXMAMAMSMMMXSSSSXAXX
|
||||||
|
MMSAMASMMAMAMSMMSMMSMSMAXAMAMSMMMAMMSXMMAXAMAMMMSASAMXSAMMMXSAMMSSXMXSMMMAMMMXXAAXMAXXXAXMASMMMAMSMXMAMASAMMXSAMXAMMMSMSMSSXMAXAAASAMMMMMMMM
|
||||||
|
AAMXMASAMMMSMMAAXAXXAMAMXSMMMMXAMAXAXSSSSMSXMMMXSAMASAMMSXMMMXMAMMMSAMXXSAMAAMASXMSSMMMSSSMMMASXMAAAMXMSMAMAMSASMSMSXAAAXAAXSSSSSMSAMXAMAAAX
|
||||||
|
SSMAMAMMXSAXAMMMSMMMSMMXAXAXXXMMMSMMMMMAXAMXSAMMMMSXMASAMXSSXMMMSAAMAXXASMSMMSAMAMAAAAXAAXAXSASXSMSMSXMAMXMAXSAMAAAMAMXMMMMMAMXXMASAMXMXSSSX
|
||||||
|
AAXSMXMXXMASXMSXSXMAXAMMMSSMMAASAXASXAAAMXMAXASMAAAAMAMMSAAMSMAAMMMSAMSXMXAXMMASXMMSMMMMSMMMMASXMXXAMMXAMMSXMXMMSMSMXMAAAAXXXXAMXASXMASAMAMX
|
||||||
|
SSMMAMSMSMAMAMSAMXSASAMSMAMXASMSASAMXMMXMAMMSMXMMXSAMASXMMMMASMSSMAMAXMASXMSXSAMXSXXXAXXAAXXXMSAMAMASMSXMAXSXAMXXAXMASXSMSSSMMSSMXMASASAMAMM
|
||||||
|
MMAMXMAASMSXSMMAMAMXSXMXMASMXXAXAMAMXSAXSAMXAMSMMMXMXMXAXSXSAMSAXMXMXAXXMAAAXMASAASMSSSMMSMSAMXAMMSAMMAXASMMSXMAMMMMXAMXMXAAXAAAXSMMSMMMMMSS
|
||||||
|
MMMMSSMSMAXSMASXMXSASAASMXSAMMMMMMXXXAAXMMSSMXAAAAMAAMXMMMAMASAMXASXMMSSSMMMSXAXXAMXAASAAMASMASAMXMASMSMMXAMSMSXSASXSMSASASMMMSSMSAMMAXMSAAA
|
||||||
|
MAAAAXXMMAMAXXMXAAMASXMAXMXXMAXMSAMXSMMMMAAMMSSSMSSSMXAAAXSMMMMXXMASAAAAMMMXXMMSMXAMMSSSMMAMMMAAXAXXMAXXXSAMXASXSASXAASMSAAXMAMAASMXMSMAXMAS
|
||||||
|
SSSMMSSMMSSMMSMXMXMAMASXSSSMSSSXMASAXXSXMSSMAAMXAAAAAXSXMSMMSAXSASASMMMMMASASXAAASMSMAMAMMXMASMMMSMAMMMMMSXMASMAMMMMMMMAMMMMMMSMMMXMSMAMAXSM
|
||||||
|
XAAXXAMAAXAXAAXAMSMMSAMMAAAAAAMXSAMXSAMXAAAMMSXXMMXMMMMASAMAMASXXMASXSXXMAXMXMMXMAAAMAMAXXMMXMAMAXMASAAAMXMAMAMXMASAMMMMMMXAAMXXXMAMAASXMSAS
|
||||||
|
MSMMMASMMSMMSSSXSAAXMASAMSMMMXMAMXMAMXAMMMSMMAXXASXAMSSMMAMXMMSAMXXMASMMMSSMAMSSMXMMSSSXSAXXASAMXXSASMSSSMXMMSMXSASMSAAMAXSXMSASMSSSSSMAMAMX
|
||||||
|
AAXMAMMXMAXAXXMXAXXMMXMXMXMXMAMAMAMSSSXSAAXMMSSMAMXSXAAXSAMXSMMMSSMMXMSXAAAXASAAXSXXMAAASMMMXSXSAAMXSAMAAAASXXAAMMSXSXSSMXSASMAMAXMAMXMXMMXX
|
||||||
|
XSAMXMXSMMSMMMXXMAMMMXXAMAMASASASAMAAXAMMMMAAAAMAMMMMSSMSASXSAAAXMAMXXAMMSXMMMXSMMASMMMMMXSXMMMSXXXAMXMSMSMSASMMSXMASXMAMAMMMAMMSMMSAMXMXXXX
|
||||||
|
MXXMASASAMMMAMMMXSAASMSASASMSXSMSASMSMMMSMSMMSMSASXAAXAMXXMASMMMSSSMSSMSAMMSXAAMAMAMAXXXXAXAAAAXAXMXSAAXAXXMXMASXASAMASXMASAMXMAXXXMMMAMXMMM
|
||||||
|
MMSMXMASXMSMXSASAMSMAASASASASAMASAMAXXXXAAAXXMASASXMSSMSAAMXMASXMAAAMMXMAMASMMXSAMASXMSXMASXMMSMMXMASMSMSMXXASMMSXMAMXMAMXMXXSMXXSXMASAMXASX
|
||||||
|
AAAAAMXMMXSAASMMXMASMAMAMXMXMMMAMMMSMMMAMSMMAMXMAMAMXMASXXSASAMAMSMMMXMMAMMMAAAXASASAMXAMASASMXAXASAMAAAAXMXXMSAMXMSSMMSMMMSMMMMMSASASAXSAMX
|
||||||
|
MMSSXSMMSAMMMMMSMXMSXAMSMSMSMXMXSXAAAAXXXMMSSSMMXSAMXMXMMMSXMASAMAMSMAXSAMXSMMSSMMASMMASMASMMAMMXMMAXSMSMMMSMMMMSAMAAXAAMAAAAAAAXSAMAMXXMASX
|
||||||
|
SXMMASAXMMSMXAXXASMMXSSXAXAAMASMMMSSSMSXAXAAAAXSASASXMMAAAXMAMXMXMXAMAMSASXSXAMAXMMMASAXXXMMMSMSSMMSMXAMXSASAAAASAMXSMSSXMSSXSSSMMMMMMSXMMSA
|
||||||
|
XAASAMSXXXMXSMSMXMXAAXMMMMSMSASAXXAAXAMMMMMMMSMSASAMASMXMXSAMXXMASXMXSASAMAMMMSMMMXSAMMSMMSMXMAMAAAMAXXMXMAXSMMMSAMXXAXAAXAMAMAMAMXMSAMASAMM
|
||||||
|
SXMMAMMMMSXAMSAXASMXMMXAAXXAMMSXMMMXMXMAXAXMMXASXMAMAMMMSAMXMXMMAXAXXMAMAMAMSAAMASAMSSMAMMAMMMAMXMMSSMXAXMSMXMSAXMSSMMMSMMASXMAMASAXMASXMASX
|
||||||
|
AMSXSMAAAAMXSAMSXSAAMMMSMSMAMASASXXXAASASXSXAMAMAMXMAXAMXXMASAAMXSSMSMAMXSSXMSAXAMASAXXASXASXSMMXSAMAMMXSAMXAXMMMMSXASAMXMMMMSMSAMXSXAXASAMA
|
||||||
|
SASAXXSMSXAXAXMAAXXSAAAAXMMMMMSAMAMMSMMMAMMMXMAMAMXXMSMSMMSASMSMMXMAMSASAMXAMMXMASMMMMMMMMAMXAMXAMXSAMMMSAMMMSASXMXXAMXAAXAAXAAMMSMMMMSMMMSS
|
||||||
|
MAMAMAXAMXSASXMSSMMXAMSSSMSMMMMMMXMAAXMMMXAMAXSMSMSMAAMAAAMASAXXAAMAMMXSAMSMMAAXMMXAAAASXSASXSAMXSAMASAAXAMXAXAXMASMSSMSMSMSSSSMAAAXAMAMAXAA
|
||||||
|
MXMSMSMSAAXSMAXAAAXSSXAMMAAAAAMMSXMSSXMASMSSSXMAXASMSMSMMMSASASASMXMXSXMXMAMMMXAAASXMSAXXMAMAMMXMXMSMSMSSSMXMMSSMXMAMAMXXXXAXAMMXXXXMMMMXSSM
|
||||||
|
MXMXAXAMMMSASMMSSMMMMMXSMSMXMXXASAMXAMSSMAAAMAMXMXMAXAXXXXSAXAAMXMASAAAAMSXMAAMMMMSAMMMMMMSMMMMSMMXAMXAAAAAXXAAAAXMMSSMXXSMSSMXMSSSSMXSAMXAX
|
||||||
|
MXMMMMXMMXMMAMXAXAMXXMMMAMAMSSMMSAMMMMXAMXMAMMMXAXMXMXMMSMMMMMMXMSXMASXMAMMSMXSXAAMMXAAMMAAAASAAAXSMSMMMSMXSMMSSMMSAAXMXMMAAXXXMAAAXAAMAMXMX
|
||||||
|
SXMAMSMXXMMMSAMXSXMXAMXSMMAMAAAMMAMMXMSXMASMXAMXSAMASAXMAXAMXAXAXXAMAMXAXXAAXAXXMMMXXMMMMSMSMSXSMMXXAAAAXAAAMAMAAASMSMSAMMMMSSSMMSMMMMMAAAMM
|
||||||
|
AMMAMMXXASMAMXSXMASMMAAXMSXMSSMMSSMSAMXAMASAMXAMXMSASMSSMXXSSSSMASAMSSMSMMSSMMMAMXXSXXAXMMMMASAXMSSSXSMSSMMXMASMMMXAAMMAMXMASMAAAAXXXAXSSMSA
|
||||||
|
MSSMSAAMSMMMSMMASAMASAMXMMMMAAAXAMASXSXSMMSMAMAXAXMXSAXAMSMXMMAMMAMMMAAMXXAMXXAMXSMSASMMMAAMAMAXMAAMMMXMXMSXSASXSMMMMSSSMMMSSSSMMMXAMMXMAMAX
|
||||||
|
XMAMXMASXAAAAAXXMASXMMMAAXSSSMXSAMXMASAMAMXXMASMMXSAMXMAMAAAMSXMMMXAXAMXXMSMASXMMXAMAMAASMMSAMXMMMSMASAXMXMAMAMAAXMAXXAAAMSMMXXAXXMXXMAMAMMS
|
||||||
|
SMMMSXMAXXMMXMXSSMMASASXSMAAAXASAMXAASASMMSXMAMAMXMMSXSAMMSSXMASXXSXXSAMXSAMXXAAMXMMAMXMMAASAMXSMMMXAMAXXSMMMXMSMSXMXMXMMMMAMXSXMXMASMMSMSAS
|
||||||
|
MAAAXMAMAMSXSMXMAASMMAAAMMMMMMASAMXMAMAMAXXAMASAMMSXXAXAXXMAXSAMMXMASMAAXSMSXSSMMMASXSASMXMSAMAAAAAMMXSASAAXXMAMAAXAMSAMXMXAMMMSAXMXXAAXAMAM
|
||||||
|
SAMSSXXXMAMAAXAMMMMXMSMAMAAMXSASXXXXXXSSMMMXMASAMASAMXMMMSAMXXSXXAMXMSMSMMXAAXMASXMMASASAMASXMASMMSSMAMXAXMMMSAMXMXXAXMXASMXSAXXSXSMSMMMMMSM
|
||||||
|
MXAAMMMXMAMXMSXSXMASAMXXMXMSASAMXSMMMMMAMMSAMXSAMSXMXAXMAXXXMMMMSSSSXMXAAMMMMMSXMAXMAMASAMXMXMAXAAAXMXMSXXSXMASAXSMSSXMMMXAASXMXMXMAAXMXSAMX
|
||||||
|
MMMASXSSSSSSXAASXSAMASXSSMAMAXAMAMMAAAXXMASASASXMAMXSMSMSSXXMASASAAMMSMSXMAAAAXMMXMMXSASXMSSMXAXMMSMMSXMAXXAMXMMSXAAXAMASMMMMXMASAMXMSAXMASA
|
||||||
|
XASAMAMAAXAAMMSMAMXSAMAAAMAMMXMMXXASMMSAMXXMMMMXSSMXAAXXMXMXMSSSMMMMAXMMMMSSMSSSMSAXAMAMAAAAAMSSXAMAAXAMXMSSMMAXMMMMSXSAMAAMXSMMSASAAMMMMXMX
|
||||||
|
SXMMMAMMMMMMXSAMXMMMXMMSMMMSMXSASAAXAXMASAXSASXMAMASXAMXAAAXMAMMMMMMSSXSAXAXXAAAASXMMSSSMMMMMMMAMSSMMSSMXMAMASXXAAAXXMMMSSMSAAMAXAMMXMXASAMX
|
||||||
|
MMSASXSAMXMMXMXXXSXMXSAMXSAXAAMAMMXMMMSAMXMMASMMAXAAXAAMSMSMMASAAMAMXMASXMMSAMMMMMXSXAAAAMXMAXXAXXAAXAMXXMXXMSMSSSSSMXAMAXXMASMSSMMMMMSXXASX
|
||||||
|
AAXAMASMSMSMMMSSMMAMASAMXMMMMMSASXXMXAMXSSSMAMXSMMSSSMSMMMAASMSMSMSSMMAMAMAXMXSXXXSAMSSXMMXXAMSXMSXMMSSMMMSXXMAXAAXAXSSSMSMSXXAMXXAXAAMXSAMA
|
||||||
|
MMSAMXMXAAAXXAAAASXMASAMXXAAAASXSASAMXSXMAAMMMXAXAMAMXAAXSSXMMSXMAXXAMXSAMXXXASXMMXMAXMASMSMXXMAMAASAMAAAAXXAMXMMMMSMMXAXSAMXMAMXSSSXSAAMAMX
|
||||||
|
XXAXXXMSMSMSMMSSMMAMXXXAMXSMMMSMMAMSAMXAMXMMMSSMMMMMAXXMMXXXMASAMMMSMMXSMSMSMMMAXAAXMXMASAAXMASXMSSMASMMMSSXSMMXXXAAAXSXMMSMXSAMXMXSAMXXSAMM
|
||||||
|
XMASMAMMXMXXXAXXMSXSMSXMXAAMMAMAMXMXXMXAMAXAXAAASASXSSSSXMAXSXMMMAAAAAAMXMAAMXSMMSMMSASAMXMMSAMXXXAMXMXMSAMAXASXSMSSSMXASAMXMSXSMSAMXMSASASM
|
||||||
|
MXAXMAMMMSXMMMMMXXAAXMASMSSXMASXMMSXXMASXMSMSSSMMASAAAAXMXSXMAXAMXMMSMXXAMSMSMMSAAMAXXXASXMAMMSSXXMMSMAMMAMMXAMMAAMMXMSSMMSSMMXMAMAXSAMXSAMX
|
||||||
|
SXMSSMXSAAAAASASMMMMAMXMAAAASXMXMASXMASXAXAAMMMAMSMMMMMMAAXASMSMSXSAXXXXMXAMXMAASXMASMSMMAMXSXAXASAMXMASMXMXMSMMMXMMAMXMASAMAXSMASMMXXSAMXMX
|
||||||
|
SASAMXAMMXXMAMASMAAXSSSMSMSMMASXMASMAXMSMMMMMASAMAMSMMMSMMSAMAAXAAMMMXSAMSAMAMXMXXMAMXAMXXSSMMXSMAAMXSMSAASXMAAXXMASASMSMMMSMMAXAXXAMMMXSMSS
|
||||||
|
SXMASMMXXXSXSMAMMSSMMAMAAXMASAMAAXSMMMMXXAAASXXMMAXMAAAAAXMXMMMMMSMSAMXAMAASMSMSSXMXSSMMSMMAAMAMXAAXMSAMMMSASMXMSSMMAMMAXAAAXAMMSXSAAASXMMAS
|
||||||
|
SMSAMAXMSMMAMMXMAXXASAMMMMSAMMSMMMMXAAMSMXSMSAMXMMSMMMXXSMMASXSAXAAMSSMSMMXMAAAXMXSAAAXAAAMSXMXSMSSXAXXXXXSMMSAAAMXMSMSSMMSXSSXAMMSXSMSASMAM
|
||||||
|
SAMXSSMMSAMXMASMMSSXMAMXAMMASASMSMAXMSMAMMMAMMMAASAMXXSAMXSXSAASXMXMMXAXMAXMSMMMMAMMSMMSSMMMSMMXMAMMSMSMSMXSAXMMMSAMXASAAAAXSXMXSAMMXASAMMSS
|
||||||
|
MAMXAXMASMMMAMMAAXMMSAMSSMMAMXMAXMMSMAXXSAMAMAMSSMASAAMMMXMMMMMMMMMXMMSMAXXMXXMXMASAMXXMAASAMXAAMASMAXAAAXMMSSMSXSASXMMSMMSSMAMAMMMAMMMXMAMX
|
||||||
|
SAMMMXMAMAMMAMSMMSAAMAXMAAMSSSMSMMAAXMASMMSSMMXMAMAMMSMAMSASXSXAAAXMMAXXASMMAXAASXMASMSMSMMASMSXSAXXMMMSMMSAAMXMASMMAMXXXXXXMAMASXMXSXMSMSMM
|
||||||
|
XAXASXMASAMSAXAAMMMMSMMMMXMAAXAMAMSMSMMAMXAAXXASXMXSXAXAXSAMAMXMSMSASAMSXSASAMSASAMXXAXXMASAMXMAMMSMSAAAAAMMMSAMMMAMAMAMMASMXXSAXAMAMAAMAAMA
|
||||||
|
SMSMSASASAMSXSMSMXAAXAAXXSAMXMAMSMMAAXXMMMMSMSXSAMXMXMMMXMSMSMAMAMSXMAMAAMMMXXXAMMSSMMMMXMAMXAMAMSAASMSMMMSAXSXSMSSMASASXASASXMMSMMASAMMMMSS
|
||||||
|
AXAAXAMXSXMSAXMMMMMSSSMSAMAXMMXMAAMSMMXXAAMXAMXMAMASAXASAMXMAXMMAMMXSXMMMMASXSMSMAAXAAASAMMMMMXAMMMMMAAXXXMMXMXSXAXXXMAAMAMXAXSAAASASXXSAAXX
|
||||||
|
MSMSMXMXSMMMXMAMSASAMXAAASAMXSASMSMMXMSMSMSMSMSSMSASASASASXSMSXSXMXAMMMSXSAMAMAMMMMSSMXXASXMASMMSXMAMMMXSMMSXMASMMMMMMSMMASAMXMMSXMASXAXMXMX
|
||||||
|
XAXAAXMASAXAMMXAAMMSSMMSMMMMXSASAMXMAMAMMAMAXXMAMSXSXMASMMAAAAXAXSMSXSAAXMASAMAMASMMMSMSMMMMXSAAAASXSMXAAAAXAMASXXAAMAXXMASAXAXMMMMXMMMXMAAX
|
||||||
|
SSSMSXSAXXMMMSAMMXMAXAXMASXSMMAXXAAMSSSXSAMAMXSXMMAMXMXMXMSMMMSMSMAMAMMSSMXAMSASASASAMXAXAMSASMMMMMMAAMSSMMSAMXSMMMSMASXSMSMSMSMAAAAXAXAXXSA
|
||||||
|
MAMAMMMAXSAMASXXAAMXXSASMXAAXMAMMSXAAAMASASMMASMMMAMMMMSAMXMAMAXAMAMXMAXAXMAXAXXXSAMXSSMXMSMASASXXAMMMMXAXAAASAMASAAMXMASAMAMXAMMMXMMMMAASMX
|
||||||
|
MAMAMAMAMXAMASXMSXSMMMASXMSMMXXMMAAMMSMASMMAMAXAASASAASMMMXSAXSSSMSSSMSSSMSAMXMXMMMMXMXXAMAMXMASMSSSXXSXMMXXXMAMAMSSSSMMMAMAMMSSMSAMSSSMMXAX
|
||||||
|
SXMAXMMASXMMMXMAAAXAAMAMAXXAAAMSXMMSAXMASMSASMSSMSASMSMMXSAXMSMAAAXAMAMAMAXMAAMAAAAMSMSAMMAMXSAXMAXMAMSXSASMSSSMAMAMAAASMXMXSXAAAMASAAAXXMXM
|
||||||
|
SMSMSASAMAMAMSXXMSMMSSMSSMMSXXAAAAAMXXMXSASXMAXMASXXMMXXSMAXSAMMMMMAMXMAMMMMMSSMSSXSAAXASXSMMMASMMXSMMMXMASAAAMAXMASMXMMAAXAMMMMMSSMMSMASMMM
|
||||||
|
MAAAAAMMMASASAAMXMAXAAXAMXAXMASXSMMSMSMXMAMAMXMMMMMSXMASMMMMMASMMSMSMMSAMMASAMAXAAMMMXMAMAAMSMMMMMASAXSAMAMMMMSSMSMMXSMXXMMASAXXAXAAMAMAXXAX
|
||||||
|
MXMSMMMSSXMXXMXAAXXMSSMSSMMSSMXAMMMAAAAMMXMMSMAMMAAXAAXAMASXSMMAMSAAAASAMSAMASXMMSSMASAMMSMMXAXSAMMSAMMAMXSAMXAAAXXSAMSAAMSAXMSMMXMXSASMSSSS
|
||||||
|
XSXXXXAXMMSSSXSSSSMMXMAMAXMAASMMMMXMSMSAMXMAAXMMSMSSSMSMSASAAXMAMMMMMMSAMMASAMAAXAMXMMMSAMAXSMMSASAMAMSXMAXAMXSMMXXMAMXSSMMMSXAASAXMSXSAAXAA
|
||||||
|
MAAMAMXXAXAAAAAXMAMMAMMMAXMSMMXMASAMXMAXXAMXMMSAAXXAMAAXMASMMMSSSMSSSMXAMSMMMXSXMMSMSMXMASMMMAASXMMSMMAMMSSMMMXAMAMSSMAMXMASAMXMMASAMXMMMMMM
|
||||||
|
AMXSMMXSMMMSMMMMMAMXAMAMASXMAAMMASASAMXMSMSSXAMXSSMMMMMMSASASAXAAMAAMASAMXMAMMMASXMAAAASMMXAXSMSMMAMAXMXAAXAAASAMXAAXXXMASXMXSSSSXMXXMMAXASX
|
||||||
|
SXAAXMAAAAMAAAXAMSSSXSXSSMMSMMSMASAMXMAMXAAXMMMXXMAXAXSXMASXMAMMMMSSMMMXMASASMSAMMMMMSMMSASMMXAXAMAXMMXMMSXXMXSMASMSXMMMMMSMXAAXAXAXMMSAMXSS
|
||||||
|
MMXMAMSSSMSSSMXSXXAMAAXSAMAXAAXMAMXMASXMMMMXSAAMSSMMMXMAMXMASXMSXAAXAXMASMSASAMXMASXMMAAMMMMSMSMSSMSAMXAAMMSMMMXAXXMASASAAMXMMXMMMXSXAMXMMXX
|
||||||
|
MSMSMAAXAXMXMMSMMMAMXMXSAMSMMMMMAMXXAMAXXMAASAAXXAXMMASAMASAMAASMMSSMAXASAMXMAMXSAMXSSMMMSAAAAAAAAXSAMXMXSAXAAAMMSMXMMASMXMAXXASXSMAMXMSAMXM
|
||||||
|
SAAAAMMSMMSAMXAAASAMAXAXXMAMASASMSSMSSMMSMMXSMSXSAMXSASASMSAMMMMAMMAMAMSMMMXSXMMMXSMXASAAMMSSSMSMSMMAMAMMMASMMMMSAAAMSASASMSMMASAMAMSMAMXMSM
|
||||||
|
SMSMSMAAXAMASXSSMSASXMMSMSMSASXSAAMAMAXAAASAXAAXXMAMMASAMXSAMXAASMXAMASAAAMAMAAASAMXSAMMMSAAAAAXMAXSASASAMXMMAAXSMSMXAAXASAMXMAMAMSXXMASAXAX
|
||||||
|
XMAXXMMSMMSXMXMAXSXMXXXAXSXMXSXMMMMASXMASAMXMXMMAXSAMXMXMASAMSSSXASXSXSMSMMXSMMSMXSAMXMSAAMMSMMMXAASXSXSXSMMSMMMMXAXAMXMXMAMXMASAMAXXMASXSAS
|
||||||
@@ -10,6 +10,8 @@ import (
|
|||||||
"adventofcode2024/day01"
|
"adventofcode2024/day01"
|
||||||
"adventofcode2024/day02"
|
"adventofcode2024/day02"
|
||||||
"adventofcode2024/day03"
|
"adventofcode2024/day03"
|
||||||
|
"adventofcode2024/day04"
|
||||||
|
|
||||||
)
|
)
|
||||||
// Usage: go run main.go <NN>
|
// Usage: go run main.go <NN>
|
||||||
// assumes input is in day<NN>/input.txt
|
// assumes input is in day<NN>/input.txt
|
||||||
@@ -27,6 +29,9 @@ func main() {
|
|||||||
case 3:
|
case 3:
|
||||||
fmt.Printf("part 1: %d\n", day03.Part1(utils.Readfile(d)))
|
fmt.Printf("part 1: %d\n", day03.Part1(utils.Readfile(d)))
|
||||||
fmt.Printf("part 2: %d\n", day03.Part2(utils.Readfile(d)))
|
fmt.Printf("part 2: %d\n", day03.Part2(utils.Readfile(d)))
|
||||||
|
case 4:
|
||||||
|
fmt.Printf("part 1: %d\n", day04.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day04.Part2(utils.Readfile(d)))
|
||||||
default:
|
default:
|
||||||
panic(fmt.Errorf("no such day: %d", d))
|
panic(fmt.Errorf("no such day: %d", d))
|
||||||
}
|
}
|
||||||
@@ -34,7 +39,7 @@ func main() {
|
|||||||
|
|
||||||
// Reads day from os.Args.
|
// Reads day from os.Args.
|
||||||
func day() int {
|
func day() int {
|
||||||
latest := 2
|
latest := 3
|
||||||
if len(os.Args) == 1 {
|
if len(os.Args) == 1 {
|
||||||
return latest
|
return latest
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,9 +19,20 @@ func ToInts(input string, sep string) []int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ToGrid2D[T any](input, rowSep, colSep string, empty T, conv func(string) T) *grid2d.Grid[T] {
|
func ToGrid2D[T any](input, rowSep, colSep string, empty T, conv func(string) T) *grid2d.Grid[T] {
|
||||||
lines := strings.Split(input, rowSep)
|
|
||||||
|
|
||||||
grid := grid2d.NewGrid(len(lines[0]) - strings.Count(lines[0], colSep), len(lines), empty)
|
var width int
|
||||||
|
|
||||||
|
lines := strings.Split(input, rowSep)
|
||||||
|
|
||||||
|
if colSep == "" {
|
||||||
|
// If no colSep, width is the length of each line
|
||||||
|
width = len(lines[0])
|
||||||
|
} else {
|
||||||
|
// Use colSep to determine the width of the grid
|
||||||
|
width = len(strings.Split(lines[0], colSep))
|
||||||
|
}
|
||||||
|
|
||||||
|
grid := grid2d.NewGrid(width, len(lines), empty)
|
||||||
for y, line := range lines {
|
for y, line := range lines {
|
||||||
for x, v := range strings.Split(line, colSep) {
|
for x, v := range strings.Split(line, colSep) {
|
||||||
grid.Set(x, y, conv(v))
|
grid.Set(x, y, conv(v))
|
||||||
|
|||||||
Reference in New Issue
Block a user