From f6f5a102701fd902fce1566420469859c32a98e8 Mon Sep 17 00:00:00 2001 From: Gareth Date: Tue, 3 Dec 2024 11:15:43 +0000 Subject: [PATCH 01/11] Day 03 --- 2024/gareth/day03/day03.go | 49 +++++++++++++++++++++++++++++++++ 2024/gareth/day03/day03_test.go | 17 ++++++++++++ 2024/gareth/day03/input.txt | 6 ++++ 2024/gareth/main.go | 8 +++--- 4 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 2024/gareth/day03/day03.go create mode 100644 2024/gareth/day03/day03_test.go create mode 100644 2024/gareth/day03/input.txt diff --git a/2024/gareth/day03/day03.go b/2024/gareth/day03/day03.go new file mode 100644 index 0000000..52e36bf --- /dev/null +++ b/2024/gareth/day03/day03.go @@ -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 +} diff --git a/2024/gareth/day03/day03_test.go b/2024/gareth/day03/day03_test.go new file mode 100644 index 0000000..4ae2e98 --- /dev/null +++ b/2024/gareth/day03/day03_test.go @@ -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) +} diff --git a/2024/gareth/day03/input.txt b/2024/gareth/day03/input.txt new file mode 100644 index 0000000..b468808 --- /dev/null +++ b/2024/gareth/day03/input.txt @@ -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()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()?!%~~[~}{[&;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()?$ 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)<'mul(252,529)do()%)%^when()!mul(731,123)mul(582,378)-mul(934,355}where()what()how()@%<[>;: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)from(953,125)~mul(98,837)&[how()[what()mul^%} '$from()^-;mul(439,801)mul(761,498))>$'-why()<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)]* ;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(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)-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()!()<#;&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),%+&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()&%!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)+)%}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()/>)where()!when(),'mul(701,189)/';!:]+how(902,507)-^mul(847,104)mul(883,112){'~}&mul(697,190)what()%![!(why()@^where()who()mul(843,4)%what()&-%mul(945,389)#<)select()mul(690,755):mul(774,780)}mul(940,623)%where() ?where()(}^!mul(34,627)mul(479,281)#}>what(157,964)select(){how()why()+who(640,716),mul(117,249)mul(395,14)-]( ~(how()-mul(220,860)+^mul(765,74)select(),$who(),@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()from();where()from()~:(mul(688,799)~when()>from()-select()who()~#+{ >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))+ [>%!mul(959,617)mul(5,150)where()@;&mul(630,775)<&-:;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();';from()mul(206,301)why()-'mul(87,734)mul(735,118)] {/what()*@^what()where()mul(685,883)when()what()mul(91,84)}]-~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)&)%:[~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(260,998)~:],],who()why(348,109)why()who()when(290,863)why(735,89)!from()@ >#mul(205,831)'$ %'mul(981,644)!#,*>mul(910,535))[who()#mul(220,934)how(271,592)-,*$,+mul(11,63)mul(783,580)^&*}~(;from(){mul(21,444$what(274,202)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(299,824)(]](+mul(205,11) +{mul(602,646)!% ^mul(384,953)do()&&:]<mul(228,736){({}don't()-when()@*>-mul(278,494))/&?><(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)&*mul}{,+?%^[when(34,108)who()mul(71,111)$+,}#~-^]@ 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()~~^>@#{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)~?'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(),mul(959,599)>why()/,<%-,!mul(517,558)%])$mul(945,968)mul(854,265)? Date: Wed, 4 Dec 2024 09:03:27 +0000 Subject: [PATCH 02/11] day4 --- 2024/go/day04/day04.go | 59 ++++++++++++++ 2024/go/day04/day04_test.go | 35 +++++++++ 2024/go/day04/input.txt | 140 +++++++++++++++++++++++++++++++++ 2024/go/main.go | 7 +- 2024/go/utils/inputs/inputs.go | 15 +++- 5 files changed, 253 insertions(+), 3 deletions(-) create mode 100644 2024/go/day04/day04.go create mode 100644 2024/go/day04/day04_test.go create mode 100644 2024/go/day04/input.txt diff --git a/2024/go/day04/day04.go b/2024/go/day04/day04.go new file mode 100644 index 0000000..ecc8ec5 --- /dev/null +++ b/2024/go/day04/day04.go @@ -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 +} \ No newline at end of file diff --git a/2024/go/day04/day04_test.go b/2024/go/day04/day04_test.go new file mode 100644 index 0000000..b9c47e8 --- /dev/null +++ b/2024/go/day04/day04_test.go @@ -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) +} diff --git a/2024/go/day04/input.txt b/2024/go/day04/input.txt new file mode 100644 index 0000000..6eccfd7 --- /dev/null +++ b/2024/go/day04/input.txt @@ -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 diff --git a/2024/go/main.go b/2024/go/main.go index 3c8c20d..46934c6 100644 --- a/2024/go/main.go +++ b/2024/go/main.go @@ -10,6 +10,8 @@ import ( "adventofcode2024/day01" "adventofcode2024/day02" "adventofcode2024/day03" + "adventofcode2024/day04" + ) // Usage: go run main.go // assumes input is in day/input.txt @@ -27,6 +29,9 @@ func main() { case 3: fmt.Printf("part 1: %d\n", day03.Part1(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: panic(fmt.Errorf("no such day: %d", d)) } @@ -34,7 +39,7 @@ func main() { // Reads day from os.Args. func day() int { - latest := 2 + latest := 3 if len(os.Args) == 1 { return latest } diff --git a/2024/go/utils/inputs/inputs.go b/2024/go/utils/inputs/inputs.go index d67a30b..cf7457c 100644 --- a/2024/go/utils/inputs/inputs.go +++ b/2024/go/utils/inputs/inputs.go @@ -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] { - 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 x, v := range strings.Split(line, colSep) { grid.Set(x, y, conv(v)) From 88938a86272fc99213bee03f7341cc65110f1ca2 Mon Sep 17 00:00:00 2001 From: Gareth Date: Thu, 5 Dec 2024 13:39:33 +0000 Subject: [PATCH 03/11] Day05 --- 2024/gareth/day05/day05.go | 134 +++ 2024/gareth/day05/day05_test.go | 71 ++ 2024/gareth/day05/input.txt | 1377 +++++++++++++++++++++++++++++++ 2024/gareth/main.go | 8 +- 4 files changed, 1586 insertions(+), 4 deletions(-) create mode 100644 2024/gareth/day05/day05.go create mode 100644 2024/gareth/day05/day05_test.go create mode 100644 2024/gareth/day05/input.txt diff --git a/2024/gareth/day05/day05.go b/2024/gareth/day05/day05.go new file mode 100644 index 0000000..3c3b9eb --- /dev/null +++ b/2024/gareth/day05/day05.go @@ -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 +} diff --git a/2024/gareth/day05/day05_test.go b/2024/gareth/day05/day05_test.go new file mode 100644 index 0000000..374349b --- /dev/null +++ b/2024/gareth/day05/day05_test.go @@ -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) +} diff --git a/2024/gareth/day05/input.txt b/2024/gareth/day05/input.txt new file mode 100644 index 0000000..05006d9 --- /dev/null +++ b/2024/gareth/day05/input.txt @@ -0,0 +1,1377 @@ +99|31 +26|21 +26|69 +69|35 +69|75 +69|95 +59|58 +59|73 +59|87 +59|94 +82|72 +82|99 +82|62 +82|91 +82|49 +65|73 +65|86 +65|59 +65|69 +65|37 +65|11 +49|71 +49|69 +49|66 +49|16 +49|31 +49|29 +49|13 +18|37 +18|27 +18|86 +18|57 +18|17 +18|14 +18|91 +18|12 +72|37 +72|66 +72|39 +72|49 +72|21 +72|11 +72|31 +72|59 +72|16 +67|81 +67|12 +67|82 +67|35 +67|99 +67|53 +67|76 +67|72 +67|37 +67|27 +11|81 +11|35 +11|94 +11|97 +11|39 +11|24 +11|15 +11|75 +11|67 +11|82 +11|17 +16|82 +16|95 +16|45 +16|17 +16|67 +16|46 +16|18 +16|85 +16|94 +16|39 +16|91 +16|15 +35|49 +35|57 +35|45 +35|78 +35|36 +35|91 +35|59 +35|12 +35|37 +35|86 +35|72 +35|62 +35|99 +87|71 +87|73 +87|95 +87|58 +87|81 +87|94 +87|46 +87|97 +87|67 +87|21 +87|35 +87|24 +87|11 +87|18 +53|13 +53|78 +53|58 +53|54 +53|16 +53|93 +53|73 +53|21 +53|11 +53|94 +53|49 +53|59 +53|66 +53|97 +53|39 +46|24 +46|18 +46|36 +46|95 +46|27 +46|67 +46|85 +46|94 +46|71 +46|54 +46|81 +46|35 +46|29 +46|17 +46|57 +46|62 +29|36 +29|62 +29|27 +29|53 +29|17 +29|65 +29|82 +29|57 +29|85 +29|37 +29|99 +29|45 +29|12 +29|86 +29|59 +29|26 +29|35 +85|65 +85|62 +85|59 +85|77 +85|91 +85|69 +85|31 +85|57 +85|17 +85|14 +85|78 +85|72 +85|49 +85|53 +85|99 +85|86 +85|27 +85|36 +78|24 +78|21 +78|39 +78|81 +78|97 +78|69 +78|77 +78|87 +78|66 +78|31 +78|29 +78|15 +78|75 +78|93 +78|94 +78|54 +78|71 +78|46 +78|95 +17|72 +17|99 +17|76 +17|69 +17|59 +17|49 +17|26 +17|66 +17|86 +17|65 +17|13 +17|77 +17|78 +17|12 +17|27 +17|62 +17|14 +17|91 +17|53 +17|87 +37|31 +37|21 +37|11 +37|75 +37|53 +37|39 +37|95 +37|54 +37|46 +37|73 +37|66 +37|59 +37|24 +37|78 +37|58 +37|69 +37|15 +37|49 +37|16 +37|77 +37|94 +91|78 +91|86 +91|27 +91|77 +91|36 +91|59 +91|57 +91|13 +91|62 +91|14 +91|66 +91|76 +91|37 +91|21 +91|49 +91|69 +91|31 +91|26 +91|72 +91|12 +91|99 +91|65 +66|46 +66|18 +66|21 +66|82 +66|15 +66|58 +66|73 +66|95 +66|67 +66|97 +66|24 +66|39 +66|45 +66|11 +66|94 +66|71 +66|93 +66|54 +66|85 +66|16 +66|75 +66|29 +66|35 +57|69 +57|21 +57|66 +57|99 +57|72 +57|59 +57|13 +57|65 +57|12 +57|26 +57|31 +57|16 +57|75 +57|87 +57|53 +57|76 +57|11 +57|37 +57|49 +57|73 +57|86 +57|77 +57|14 +57|78 +36|14 +36|49 +36|57 +36|72 +36|87 +36|16 +36|99 +36|65 +36|59 +36|12 +36|37 +36|21 +36|11 +36|31 +36|75 +36|69 +36|86 +36|13 +36|66 +36|26 +36|53 +36|78 +36|77 +36|76 +93|72 +93|91 +93|71 +93|12 +93|17 +93|37 +93|86 +93|27 +93|29 +93|36 +93|14 +93|45 +93|57 +93|81 +93|26 +93|65 +93|82 +93|18 +93|67 +93|85 +93|35 +93|99 +93|76 +93|62 +14|75 +14|73 +14|16 +14|69 +14|37 +14|72 +14|77 +14|95 +14|15 +14|46 +14|26 +14|31 +14|99 +14|49 +14|78 +14|21 +14|66 +14|87 +14|12 +14|59 +14|53 +14|58 +14|13 +14|11 +73|95 +73|58 +73|81 +73|67 +73|46 +73|24 +73|27 +73|18 +73|91 +73|15 +73|71 +73|39 +73|62 +73|85 +73|45 +73|17 +73|82 +73|29 +73|35 +73|97 +73|36 +73|54 +73|93 +73|94 +94|86 +94|45 +94|17 +94|36 +94|57 +94|67 +94|72 +94|35 +94|91 +94|81 +94|27 +94|14 +94|71 +94|85 +94|54 +94|93 +94|82 +94|65 +94|76 +94|18 +94|62 +94|26 +94|29 +94|24 +15|62 +15|45 +15|54 +15|57 +15|94 +15|85 +15|35 +15|39 +15|67 +15|18 +15|76 +15|65 +15|71 +15|81 +15|93 +15|36 +15|82 +15|27 +15|17 +15|29 +15|24 +15|86 +15|97 +15|91 +24|86 +24|54 +24|12 +24|71 +24|82 +24|72 +24|85 +24|17 +24|76 +24|18 +24|57 +24|14 +24|93 +24|91 +24|27 +24|45 +24|81 +24|65 +24|29 +24|26 +24|62 +24|67 +24|36 +24|35 +12|69 +12|31 +12|58 +12|75 +12|49 +12|13 +12|53 +12|59 +12|11 +12|46 +12|78 +12|97 +12|21 +12|99 +12|95 +12|16 +12|94 +12|66 +12|87 +12|37 +12|15 +12|77 +12|39 +12|73 +58|54 +58|81 +58|94 +58|45 +58|36 +58|18 +58|82 +58|15 +58|17 +58|62 +58|57 +58|95 +58|93 +58|24 +58|35 +58|97 +58|71 +58|67 +58|85 +58|29 +58|65 +58|39 +58|91 +58|27 +95|81 +95|85 +95|29 +95|93 +95|71 +95|76 +95|15 +95|27 +95|91 +95|97 +95|57 +95|62 +95|65 +95|24 +95|35 +95|18 +95|94 +95|39 +95|45 +95|36 +95|82 +95|67 +95|17 +95|54 +54|17 +54|86 +54|99 +54|67 +54|26 +54|35 +54|81 +54|76 +54|18 +54|27 +54|91 +54|85 +54|36 +54|65 +54|57 +54|14 +54|71 +54|45 +54|12 +54|72 +54|93 +54|82 +54|62 +54|29 +31|67 +31|81 +31|29 +31|16 +31|21 +31|46 +31|54 +31|75 +31|24 +31|93 +31|71 +31|73 +31|95 +31|87 +31|58 +31|15 +31|39 +31|82 +31|66 +31|35 +31|97 +31|69 +31|11 +31|94 +75|91 +75|85 +75|93 +75|97 +75|24 +75|17 +75|46 +75|35 +75|29 +75|39 +75|18 +75|95 +75|54 +75|27 +75|62 +75|15 +75|73 +75|67 +75|94 +75|81 +75|45 +75|58 +75|71 +75|82 +39|14 +39|45 +39|94 +39|57 +39|27 +39|54 +39|81 +39|85 +39|86 +39|35 +39|36 +39|76 +39|91 +39|71 +39|93 +39|17 +39|97 +39|65 +39|67 +39|29 +39|62 +39|18 +39|82 +39|24 +86|11 +86|53 +86|77 +86|12 +86|26 +86|95 +86|75 +86|46 +86|58 +86|73 +86|37 +86|72 +86|21 +86|13 +86|16 +86|99 +86|87 +86|31 +86|69 +86|49 +86|66 +86|78 +86|59 +86|14 +62|65 +62|13 +62|72 +62|69 +62|59 +62|21 +62|66 +62|77 +62|12 +62|36 +62|53 +62|86 +62|76 +62|26 +62|37 +62|16 +62|11 +62|99 +62|14 +62|57 +62|87 +62|49 +62|78 +62|31 +76|12 +76|59 +76|49 +76|87 +76|14 +76|72 +76|11 +76|73 +76|66 +76|69 +76|86 +76|77 +76|13 +76|99 +76|21 +76|46 +76|31 +76|78 +76|26 +76|75 +76|58 +76|37 +76|53 +76|16 +81|36 +81|82 +81|45 +81|37 +81|85 +81|72 +81|49 +81|76 +81|26 +81|99 +81|35 +81|86 +81|14 +81|62 +81|13 +81|59 +81|12 +81|27 +81|65 +81|53 +81|91 +81|57 +81|18 +81|17 +21|45 +21|29 +21|94 +21|17 +21|71 +21|24 +21|82 +21|93 +21|67 +21|97 +21|11 +21|75 +21|85 +21|95 +21|54 +21|58 +21|46 +21|39 +21|35 +21|81 +21|73 +21|16 +21|15 +21|18 +27|57 +27|66 +27|59 +27|21 +27|87 +27|62 +27|69 +27|76 +27|65 +27|14 +27|36 +27|77 +27|11 +27|53 +27|72 +27|86 +27|13 +27|78 +27|37 +27|12 +27|31 +27|99 +27|26 +27|49 +45|36 +45|99 +45|14 +45|12 +45|77 +45|65 +45|85 +45|31 +45|69 +45|72 +45|27 +45|78 +45|17 +45|86 +45|26 +45|49 +45|57 +45|76 +45|37 +45|53 +45|59 +45|62 +45|13 +45|91 +13|58 +13|46 +13|73 +13|78 +13|66 +13|21 +13|29 +13|95 +13|31 +13|93 +13|16 +13|11 +13|94 +13|77 +13|67 +13|39 +13|71 +13|54 +13|24 +13|69 +13|97 +13|75 +13|87 +13|15 +77|46 +77|71 +77|93 +77|15 +77|73 +77|67 +77|54 +77|95 +77|11 +77|87 +77|82 +77|69 +77|81 +77|24 +77|21 +77|94 +77|29 +77|31 +77|66 +77|75 +77|97 +77|58 +77|39 +77|16 +71|45 +71|76 +71|67 +71|65 +71|14 +71|57 +71|29 +71|37 +71|35 +71|99 +71|82 +71|72 +71|53 +71|12 +71|27 +71|81 +71|86 +71|18 +71|85 +71|36 +71|17 +71|91 +71|62 +71|26 +97|81 +97|27 +97|67 +97|14 +97|94 +97|36 +97|62 +97|71 +97|57 +97|35 +97|54 +97|82 +97|45 +97|65 +97|91 +97|86 +97|24 +97|76 +97|72 +97|17 +97|85 +97|93 +97|29 +97|18 +99|87 +99|37 +99|75 +99|49 +99|95 +99|39 +99|66 +99|21 +99|53 +99|77 +99|24 +99|69 +99|16 +99|78 +99|46 +99|59 +99|97 +99|58 +99|94 +99|15 +99|13 +99|73 +99|11 +26|97 +26|59 +26|13 +26|66 +26|58 +26|78 +26|77 +26|73 +26|53 +26|15 +26|11 +26|39 +26|49 +26|37 +26|46 +26|87 +26|99 +26|12 +26|16 +26|75 +26|95 +26|31 +69|93 +69|29 +69|81 +69|94 +69|82 +69|58 +69|71 +69|21 +69|39 +69|11 +69|46 +69|16 +69|15 +69|24 +69|97 +69|73 +69|54 +69|66 +69|18 +69|87 +69|67 +59|77 +59|69 +59|66 +59|78 +59|16 +59|93 +59|46 +59|95 +59|15 +59|24 +59|13 +59|49 +59|11 +59|21 +59|75 +59|31 +59|54 +59|97 +59|39 +59|71 +82|12 +82|26 +82|76 +82|18 +82|85 +82|35 +82|59 +82|86 +82|45 +82|36 +82|17 +82|53 +82|27 +82|57 +82|78 +82|37 +82|14 +82|13 +82|65 +65|75 +65|31 +65|46 +65|26 +65|21 +65|13 +65|78 +65|77 +65|12 +65|66 +65|76 +65|53 +65|72 +65|49 +65|14 +65|99 +65|87 +65|16 +49|11 +49|94 +49|93 +49|54 +49|46 +49|78 +49|95 +49|73 +49|15 +49|58 +49|24 +49|77 +49|75 +49|87 +49|39 +49|97 +49|21 +18|31 +18|72 +18|49 +18|99 +18|45 +18|77 +18|53 +18|78 +18|26 +18|85 +18|13 +18|76 +18|59 +18|62 +18|65 +18|36 +72|75 +72|73 +72|53 +72|78 +72|13 +72|69 +72|87 +72|12 +72|15 +72|99 +72|77 +72|26 +72|46 +72|95 +72|58 +67|14 +67|17 +67|45 +67|65 +67|49 +67|36 +67|62 +67|18 +67|59 +67|85 +67|91 +67|26 +67|57 +67|86 +11|73 +11|16 +11|46 +11|95 +11|54 +11|85 +11|58 +11|71 +11|29 +11|18 +11|45 +11|93 +11|91 +16|93 +16|29 +16|97 +16|73 +16|54 +16|27 +16|58 +16|24 +16|75 +16|81 +16|71 +16|35 +35|17 +35|14 +35|18 +35|27 +35|26 +35|53 +35|85 +35|77 +35|13 +35|65 +35|76 +87|66 +87|15 +87|39 +87|45 +87|82 +87|16 +87|54 +87|29 +87|75 +87|93 +53|95 +53|77 +53|24 +53|69 +53|87 +53|75 +53|46 +53|15 +53|31 +46|15 +46|45 +46|93 +46|97 +46|58 +46|39 +46|91 +46|82 +29|72 +29|67 +29|18 +29|14 +29|76 +29|81 +29|91 +85|26 +85|87 +85|37 +85|13 +85|12 +85|76 +78|16 +78|67 +78|11 +78|73 +78|58 +17|37 +17|36 +17|31 +17|57 +37|13 +37|97 +37|87 +91|53 +91|87 +66|81 + +75,94,71,16,31,95,11,73,97,77,81 +17,91,62,86,14,26,12,99,37,59,49,13,77 +62,36,12,37,49,78,77,31,87,21,11 +59,13,31,16,75,58,95,15,39,24,54 +95,15,39,97,94,24,54,93,67,81,82,35,18,45,85,17,91,27,62,36,65 +36,53,67,14,62,26,99,35,81,65,29,82,76,17,57,27,37,18,72,86,91 +46,15,39,71,81,82,35,45,85,91,36 +16,91,15,29,46,17,67 +49,77,31,46,53,58,73,95,75,78,99,21,15,13,59 +73,46,95,15,97,54,71,81,45,85,62 +14,72,26,12,99,59,49,78,77,31,69,87,21,11,16,75,95 +54,93,71,29,67,81,82,35,18,85,17,91,62,36,57,65,76,86,14,72,26 +93,85,67,57,36,72,35,65,45,18,76,24,86,82,94,29,54,14,17,62,71 +13,78,77,31,69,87,66,21,11,16,73,46,58,15,39,97,94,24,54,71,29 +53,75,31,49,73,14,77,11,21,26,76,72,86,87,46,13,16,78,69,37,12,99,66 +87,66,11,16,75,46,58,95,15,97,94,24,54,93,29,67,82,35,18 +99,53,31,16,37,58,12,66,46,49,87,75,59,26,39,73,13 +17,91,27,62,36,57,76,86,14,72,26,12,99,37,53,59,13,78,77,31,69 +13,78,77,31,21,11,16,75,73,46,58,15,39,97,24,54,93,71,29 +94,54,93,29,81,45,85,62,57,65,76,14,72 +93,81,82,45,17,27,62,36,57,76,86,14,72,26,99 +24,93,71,35,45,17,62,36,76 +14,66,87,73,75,46,26,99,21,72,77,12,53,49,59,37,69,16,11,86,78 +65,76,86,72,99,53,13,77,69,21,11,75,73 +59,45,62,27,36,72,78,18,85,65,12,99,76,77,14 +65,14,26,37,53,13,87,75,73 +53,59,13,78,77,31,87,66,21,11,75,73,46,58,95,15,97,94,54 +21,75,58,24,71,35,85 +37,76,18,26,57,14,12,45,27,53,99,17,86,35,62,29,67,85,91 +76,45,26,57,77,85,36,17,13,59,53,27,62 +87,11,16,73,46,15,97,54,82,35,18 +13,78,77,31,69,87,66,21,16,75,73,46,15,39,97,94,24,71,29 +29,93,71,58,11,16,21,94,54,75,97,81,67,15,87,18,35,73,39,82,24,66,95 +36,17,29,71,27,62,45,81,18,91,54 +31,69,21,16,73,24,93 +97,66,54,71,15,29,24,45,75,67,94 +75,73,58,94,18 +75,58,15,97,54,93,71,82,35,18,27 +85,26,17,93,86,81,72,45,12,14,76,36,65,27,91,35,67,71,57,18,62,82,29 +24,54,93,71,29,67,81,82,18,45,85,17,91,27,62,36,57,65,76,86,14,72,26 +54,24,97,85,93,17,29,45,58,35,75,27,73,46,39,71,15,91,67,82,81,94,95 +12,13,69,77,11,72,86,53,78,62,26,66,14,49,59,57,99 +15,39,97,94,24,54,93,71,29,67,81,35,18,45,85,17,91,27,62,36,57,65,76 +16,75,73,46,58,39,97,94,24,54,93,71,29,67,81,82,35,18,45,17,91 +81,82,35,18,45,85,17,91,27,36,57,65,76,26,99,37,53 +37,11,87,14,99,59,69,57,77,76,13,86,31,72,49,78,12,16,65,66,26,53,21 +58,95,15,39,94,24,54,93,71,29,67,81,82,35,18,45,85,17,91,27,62,36,57 +81,16,73,39,21,15,46 +69,87,66,11,75,95,15,94,54,93,81,82,35 +12,36,53,76,14,59,77,72,69,27,31,65,91,85,13,86,99 +14,72,26,12,99,37,53,59,49,13,31,69,87,66,21,11,16,75,73,58,95 +24,45,39,97,85,15,75,17,73,95,46,71,11,93,94,29,82,35,16 +86,14,72,26,12,99,37,53,59,49,13,78,31,69,87,66,21,11,75,46,58 +78,77,66,11,16,75,73,46,58,95,15,97,24,54,93,29,67 +12,37,53,13,77,69,87,21,11,46,58,15,97 +17,91,27,62,36,57,65,76,86,14,26,12,99,37,53,59,49,78,31,69,87 +31,66,58,15,24,67,82 +45,85,62,14,72,12,99,37,53,59,49,13,78 +69,78,24,73,31,58,67,11,94,71,54,75,93,66,21,87,97,16,15,39,29,95,77 +78,65,14,27,66,21,76,31,57,26,13,37,99,53,12,36,72,59,49,62,86 +39,97,94,24,54,93,71,29,81,82,35,18,45,85,17,91,27,62,36,57,65,76,86 +93,29,18,82,73,24,81,11,16 +12,37,53,49,13,78,31,66,21,73,58,95,97 +97,35,15,11,58,16,21,75,39,29,54,45,18,46,85,94,73 +73,95,15,97,24,54,93,29,82,35,45,17,91,27,62 +15,95,53,99,37,73,87,59,66,12,97 +18,45,85,27,36,65,76,86,14,72,26,99,37,59,77 +97,87,49,75,11,13,54,15,73,78,31,53,21 +53,77,21,46,16,13,87,58,26,37,31,99,49,78,12,95,11,72,73,59,66,15,69 +53,66,75,46,97,24,54 +73,16,31,24,21,97,95,87,13,58,54,11,75,39,69,94,77,49,66,15,46 +66,15,93,82,35,18,45 +78,26,73,37,59,49,99,31,39,46,58,15,21,69,12,87,11,16,77 +91,76,62,67,35,36,27,17,81,86,57,24,29,97,71,45,39,54,94,18,65 +15,59,72,53,77,99,69,21,16 +35,54,94,27,82,46,67,24,15 +82,91,29,14,76,24,36,35,26,57,17,93,54,67,85,65,18,27,45,72,71,81,62 +71,87,15,29,95,39,16,75,24,11,13,73,31,46,21,58,69,77,94,66,54,78,93 +46,78,37,49,53,26,69,73,99,31,13,11,77,58,12,87,16 +76,86,14,72,26,12,99,59,49,78,77,31,69,87,66,21,11,16,75,73,46 +97,24,93,29,67,35,18,45,85,17,91,62,36,57,65,86,14 +39,97,54,71,29,67,82,35,18,45,85,17,57 +72,86,76,31,87,46,59,66,11,53,16,21,73,37,26,69,78 +71,45,91,27,57,99,37 +59,49,31,21,73,58,95,97,93 +21,11,16,46,97,94,71,67,35,45,85 +29,24,75,35,11,45,95,66,97,21,73,16,82,58,67 +17,36,31,91,14,57,59,53,87,65,77,49,99,62,26 +67,94,45,58,11,17,81,39,71 +75,53,97,49,69,39,21,58,37,12,87,15,77 +77,93,58,75,66,73,46,15,81 +37,53,59,49,13,77,31,69,87,66,21,11,16,75,73,46,58,95,15,39,97,94,24 +87,66,21,11,16,75,73,46,58,15,39,97,94,24,54,93,71,29,67,81,82,35,18 +62,26,91,45,35,82,67 +45,82,35,29,58,73,95,93,16,91,15,85,94,75,67,18,46,71,17 +54,91,94,71,18,45,17,82,67,24,27,81,36,14,35,57,93,76,62,29,85,65,86 +29,67,35,18,45,91,76,86,12,37,53 +71,24,15,16,18,46,97,29,39,54,35,21,67,45,82,75,58,94,93,81,11,73,85 +45,24,82,27,17,67,71,62,18,26,35,72,54,81,76,57,29 +67,81,35,85,17,27,62,57,65,76,12 +15,91,57,97,24,27,81,85,94,65,95,17,82 +67,45,35,46,15,16,82,71,85,17,18,94,58,54,91 +46,58,95,15,94,24,54,71,29,35,18,45,17,91,27,62,36 +31,65,59,69,26,76,12,77,17,91,86,57,37,85,13 +65,86,35,78,27,85,59,99,76,91,14 +36,57,76,72,53,49,13,31,69,87,66,21,16 +75,93,91,95,46,94,16,24,54,67,35,39,58,85,45,73,18,82,97,29,71,81,17 +26,12,59,13,69,16,46 +24,93,59,94,49,31,66 +94,24,54,93,71,29,67,81,35,18,45,85,17,91,27,62,36,57,65,76,86,14,72 +14,72,37,59,13,78,77,69,11,16,46,58,95 +86,69,66,78,21,49,87,27,76,37,36,72,65,57,26 +72,26,16,73,46,95,15 +97,91,54,17,35,82,62,18,58,94,57,39,95,29,93 +45,62,36,57,37 +54,78,69,75,58,46,21,24,53 +53,62,57,13,17,14,65,49,12,36,86,18,26,59,76,91,77,45,78 +37,53,59,78,77,31,87,16,75,73,15,39,97,94,24 +94,24,54,93,67,17,27,36,14 +73,46,58,97,54,29,35 +91,62,65,72,12,37,69 +58,69,59,16,78,77,12,73,37,97,13,87,39,21,99,11,75 +62,36,65,86,12,99,37,53,31,87,21 +15,97,24,54,93,71,29,81,82,35,18,45,85,17,27,36,57,65,76 +76,86,14,26,12,99,37,59,49,78,77,31,69,66,21,11,16,73,46 +49,13,78,69,66,11,16,46,58,97,94,93,71 +24,54,73,91,58,15,97,29,17,62,95,93,82,67,81,85,46 +73,46,58,95,15,39,24,54,29,67,81,35,18,45,17,27,62 +91,27,36,12,37,49,78,31,66 +95,66,15,75,78,99,58,26,39,77,16,46,11 +67,82,35,45,85,17,62,65,76,86,14,72,37,53,59 +35,18,45,85,17,91,27,36,57,76,86,72,26,12,99,37,53,49,13 +82,35,18,45,85,17,91,27,62,36,57,65,76,86,14,72,12,99,37,53,59,49,13 +53,59,49,13,77,31,87,66,11,16,75,46,58,95,39,97,94,24,54 +27,62,36,57,76,86,14,72,26,12,37,49,13,78,77,31,87,66,21 +72,26,49,13,87,75,73 +16,75,73,39,54,71,29,35,18,45,17 +97,94,71,29,67,35,27,62,14 +57,65,76,86,14,26,12,99,37,53,49,13,77,69,87,16,75 +78,77,31,69,87,66,11,16,75,73,46,58,95,15,94,24,54,93,71,29,67 +57,86,72,26,12,49,77,69,87,66,75 +78,77,31,69,87,66,11,75,73,46,58,15,97,94,24,71,29 +77,87,66,21,75,95,97,24,81 +59,13,78,77,31,69,87,66,75,95,39,97,24,54,93 +77,31,69,87,66,21,11,16,75,73,46,58,95,15,39,94,24,54,93,71,29,67,81 +14,72,26,99,13,78,77,31,87,16,75,46,95 +27,62,36,57,65,76,86,14,72,26,12,99,37,59,49,13,78,77,31,69,87,66,21 +69,87,66,21,11,16,75,73,46,58,39,94,24,93,71,29,67,81,35 +76,37,53,13,31,66,21,11,46 +59,76,62,26,67,27,36 +65,69,37,59,86,26,27,78,13,36,31,21,77,99,62,14,72 +66,37,58,13,78,95,12,69,39,53,46,75,26,31,99,73,16 +81,67,14,18,82,85,91,27,26,72,36,65,24,17,29,57,62,86,93,76,71 +14,72,12,99,37,53,59,49,78,77,31,69,87,66,21,11,75,73,46,58,95 +49,13,78,77,31,69,66,21,11,16,75,73,46,58,95,15,39,97,94,24,54,93,71 +13,78,69,66,73,95,94,24,54,93,71 +14,53,57,86,37,49,17,62,85,26,72,27,91 +39,97,94,24,54,93,71,29,67,81,82,35,18,45,85,17,91,27,62,36,57,65,76 +97,16,71,29,94,35,69,66,46,39,24,67,95 +82,35,18,45,85,17,91,27,62,36,57,65,76,86,14,72,12,99,37,53,59,49,13 +65,14,26,99,53,13,78,77,11,16,73 +82,46,71,94,81,93,67,62,36,54,17,29,91 +29,67,81,82,35,18,45,85,17,91,27,62,36,57,65,76,86,14,72,26,12,37,53 +21,75,73,93,54,94,97,87,66 +11,21,35,46,16,87,67,66,95,18,97,81,82 +81,82,35,18,45,17,91,27,62,36,57,65,76,14,72,12,99,37,53,59,49 +26,37,71,76,35,62,91,57,67,65,86,18,99 +31,16,75,73,58,93,67 +46,75,21,15,66,87,39,73,94,59,99,13,31,58,16,77,49 +85,81,17,76,71,86,57,72,27,62,67,26,36,18,14,91,12 +69,16,54,71,95 +94,82,27,71,85,46,45,15,93,18,54,39,97,91,95,81,29,24,62 +26,37,53,59,49,13,78,87,66,21,16,75,73,58,95,15,39 +66,16,58,95,39,97,54,71,45 +37,53,49,77,31,69,87,66,21,46,58,94,24 +35,75,73,54,15,66,69,67,39 +21,75,73,58,95,15,39,97,94,54,93,71,67,81,35,45,85 +69,87,21,16,93,71,29,67,81,82,35 +18,85,91,62,36,57,86,14,26,12,53,13,77 +18,36,12,77,78,86,59 +13,77,69,75,73,46,95,94,24,54,71 +29,67,18,85,17,91,27,62,65,76,86,26,53 +87,65,11,57,53,21,13,49,12,86,76 +91,57,29,27,12,81,67,93,26,65,36,76,18,17,14,85,62,35,71,54,72 +54,93,81,45,85,17,91,27,62,36,76,14,72,26,12 +66,21,39,93,71,67,35 +59,27,26,14,76,72,37,35,62,65,12,78,13 +94,24,66,93,39,59,16,97,11,15,31 +26,12,53,49,13,78,77,31,66,21,11,95,39 +17,86,14,72,12,49,13,78,77,69,87 +67,35,93,87,15,58,97,16,21,69,81,46,11,29,75,94,71,54,82 +78,77,86,49,13,12,87,72,53,16,69,21,99,36,76,59,14,31,57,65,11 +21,16,75,73,46,58,95,39,97,54,93,71,82,35,18,45,85 +45,57,37,14,59,17,36,78,35,12,13,62,18,91,76,53,86,72,49,26,85 +54,93,85,27,57,76,72,26,12 +95,15,97,94,24,71,29,35,18,91,27 +37,36,86,27,62 +31,69,87,66,21,11,75,73,46,58,95,94,24,71,67,81,82 +45,91,82,17,36,58,71,81,39,18,54,15,27 +59,27,36,87,99,12,49,31,77,72,76,78,53,62,69,17,26,91,57 \ No newline at end of file diff --git a/2024/gareth/main.go b/2024/gareth/main.go index 2193377..fc2a0f4 100644 --- a/2024/gareth/main.go +++ b/2024/gareth/main.go @@ -1,13 +1,13 @@ package main import ( - "aoc2024/day03" + "aoc2024/day05" "fmt" "os" ) func main() { - data, _ := os.ReadFile("day03/input.txt") - fmt.Printf("part 1: %d\n", day03.Part1(string(data))) - fmt.Printf("part 2: %d\n", day03.Part2(string(data))) + data, _ := os.ReadFile("day05/input.txt") + fmt.Printf("part 1: %d\n", day05.Part1(string(data))) + fmt.Printf("part 2: %d\n", day05.Part2(string(data))) } From 360ae5edbd82a25d897565f1fcce1879b2a2609d Mon Sep 17 00:00:00 2001 From: Gareth Date: Fri, 6 Dec 2024 16:56:58 +0000 Subject: [PATCH 04/11] Day06 --- 2024/gareth/day06/day06.go | 142 ++++++++++++++++++++++++++++++++ 2024/gareth/day06/day06_test.go | 35 ++++++++ 2024/gareth/day06/input.txt | 130 +++++++++++++++++++++++++++++ 2024/gareth/main.go | 12 ++- 4 files changed, 315 insertions(+), 4 deletions(-) create mode 100644 2024/gareth/day06/day06.go create mode 100644 2024/gareth/day06/day06_test.go create mode 100644 2024/gareth/day06/input.txt diff --git a/2024/gareth/day06/day06.go b/2024/gareth/day06/day06.go new file mode 100644 index 0000000..08e95bc --- /dev/null +++ b/2024/gareth/day06/day06.go @@ -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 + } + } +} diff --git a/2024/gareth/day06/day06_test.go b/2024/gareth/day06/day06_test.go new file mode 100644 index 0000000..f4a30da --- /dev/null +++ b/2024/gareth/day06/day06_test.go @@ -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) +} diff --git a/2024/gareth/day06/input.txt b/2024/gareth/day06/input.txt new file mode 100644 index 0000000..b2491bc --- /dev/null +++ b/2024/gareth/day06/input.txt @@ -0,0 +1,130 @@ +#.............#.#...........................................................#..........#...........................#..........#... +............#......................#.......#..#.........#...................##.................................................... +..............#...........#..#.......#.........#.#...........................#................................#......#............ +.....#......................................#......#..#...................#....................#......................#........... +...#............................#................................#................................................................ +..........#..................#.....#......................................................#....................................... +..#........#.......#.#...............................................................#......#.................................#... +.#....#................#................#.....#...................#...............................................#..#............ +.......................................................................................#...#.#....#........##......#........#.#.## +............................................#.................#.....................#..........................#.................. +....#..........##......................#.................................................................................#........ +......#.............##.........#.......#.........#.......#.............#...#.......#.............................................. +.#............................................................................#..........#....#................................... +...#..#....#..............................#...........................................................................#........... +.............#.................................................................................................................... +................................#..................##...................................#...............................#......#.. +..........#.........#.................#..........###...........................................#............#...#................. +.............#....................................#.......#.#.#............#............................................#......... +......#.#..............................................................................................#.........................# +...#...#.........#.........#..#......#................##.................#........................................................ +.................................#......................#........#................#........................#...................... +.......................##..............#................#................#..............................#......................... +.......#...#.....#.....##........................#..................##.....#...................................................... +.............................................#...........................#..........................................#.....#....... +.........................#...............#....#..............#.......#...............#.#.................#.................#...... +...........................................................#....#..................................#.............................. +..........................#.................................................#............................##....#.................. +.................#...#.........................................................#........................#.....#..#................ +.........................#....#................................................#...#.....................#....#...........#....... +................................................##.......#.#....................................#.......##........................ +..........##...#.......................#....#..#....................#........................#.................................... +#......#.......................#............#.....................................................................#............... +.......#.......#...#..#..........#.......................................#.............#......#................................... +...............#............#..................#.................................................................................# +.......#...........#.......................##.....#.........#...........#...................#......#.........#.............##....# +...................#.........................#......#..........................................#..........#.........#......#...... +.....#............#..............#...#......#....................#.............#.................................................. +................................................#........#.....#...................#.....................................#.....#.. +......................#.#...##......................##...............................................#.................#.......... +#...................#.........................#...........#.....#................#.....................#...................#...... +....#................#.....#.............#.....................................#....#...#.................................#....... +.........#.....................................................................................................#.#.......#........ +.........#..........##..............................#............................#.#.............................#................ +#....#.#..............................................##...#...#...............#.............#.................................... +........#..#.#...................#.......................................................................#.............#..#.#...#. +.................................................................................................................#.......#........ +............................................#..#...............##........#..........#.......................................#....# +........#...........................#............................#.....#........................#..........#...#..........#....... +.#...........#...................................................#...........................................#................#.#. +............#...............................#........#...........#..........#...........#.#..............#........................ +...............................................................................##.#................#.............................. +.#.......................#.#...........#..................................#....................................................... +..#..............................................##................#.......#....#..............#.....................#...#........ +...................#.....#................................................#..........#.........#.........#.....................#.. +........#................#................................................................................#......#................ +...................#...#....#.........................#.........................#....................#..........................#. +.................#.......................................................#................................................#....... +..#...........................##.#.............#..#............................................#.......................#.#........ +..#......#.........................................................................#.......................#...................... +...........................................................................................................#............#......#.. +............................................................^..........................................#..........#............... +..#.........#....................#..........................................#........#.........................................#.. +........#...............#....#.............#......#.........................................................................#..... +.........#......#.....#..............#...........................................................#..............#................. +.........#...................................................#...###...........#.......#.##....................................... +.....................##.................#.........##.....................#................#................#.........#............ +.......................................................................#..............#..............#.................#.......... +.##.........#..........................................................................#....................................#..... +.........................#.............................#........................................................................#. +........#.............................................#......#....#.....................................#....................#.... +........#...#..............................................................................#.........#............................ +..............................#................................#..........#..............#..................................#..... +........##..#...................................#................................#.................#.........#......#..#........#. +..................#......#...................................................................#.................................... +..........#.............#..............#........#............#...............#..#..........#..............#.#...#............#.... +............................##....#..............#......................................................................#......... +...............................................#.....#...........#.....##...............#..#...................................... +.........................#.......#...............................#...........#.........#...........#....#......................... +.#............#...#...............#..............................................................#..........................#....# +#...........#......................................................#.............................#......#......................... +..................................................#....#...............#.........................#................................ +................................................#..........................#.......#..............................#....##.......#. +........#......#..#............#................#............................#......#.##.........#....................#..#........ +.......................................................#..#.#....................#..#......................................#...... +.....................#.......................................................................#............#....................... +.....................##........................#...................#.....................#........................................ +..........................#...........................................................................................#........... +..#..........#...................#..............##..#.....................#...................#..............#...........#........ +#................................#....##......#.............#..............#.......................#.........#...........#........ +..................#................#...............................#.....#..........#................#..............#............. +................#.#.........#.....##...............................................................#..............#............... +..#...............................................................................................#............................... +..........#.................#...........#.......#.........................#...#.......#........................................... +..##....#......................................#.#.......................................#.................#...................... +.......................#..#...#.##......................................................................#.........#...#........... +...............#.........#..............#.....................................................#...................#............... +......#.................#............#......#...................#..#.........................#........................#........#.. +......................................................................#...........................#........#...................... +..........#..........#........................#.............##.................................................................... +....#................................................#.......................#................#...............#................... +.................#....................................................#......#.................................................... +.#........#....................................................................................................................... +......##..................#....#......#.................#....................#.....................#..#...........#............... +#...#...#...#..............#........#.......................#.#..........#...............................#......#................. +#...#...................#.............#........#..........#...............................................................#...#... +..#................................#...#.........................#...................#......#..................................... +...#...###..........#............#...............................................................#..........#..................... +............#..............#.......#.....#..........#.....#.........................................................#............# +..#......................#..#...#................................#......#.......#.....#..................#.........#.............. +....##......#.......................................................#..............................................#.............. +...............................#.....#....#.................................................#.......#............#................ +..........#....#......................#........#..........................#......#................................................ +......#.............................#...........#..................#...........................#................................#. +...........................##..........................................#.....#.#.....................#................#........... +..#..............#.........................................................#........................#.........#.................#. +#.....#.....#......................#....................#........................................#...........#...........#......#. +.......................................#..#................................#.........#.......#..#.....#..........................# +..........#..............##...............#..........................................................#......#......#......#....#.. +.............#..............#..#......#........#..#......##.......................#...........#.......#........................... +......................#.......................................#.......#..#.....................................#.........#...##... +...........................#...........................#......#....#.............................#.............................#.. +..................#............................#....#........##.........................#..............#.............#............ +.......#....................#.....#........#.......#.#...#...............#.....#.#.........................#.......#.#............ +.....#.........#.......#..........#.................#..#...#..................................................##.................. +................#........................................................#........................................................ +....##......#........#..................#.........................#...................................#...#...................#... +..............#....................#.......#.......................#.............#......#..............#.......................... +...........................#..............#.....#............#.....................#........#....#.......................#........ +........#..##................#.....#.#..............#..............................#........................#.........#........... +.........................................................#...........................##..........#........#.##.................... \ No newline at end of file diff --git a/2024/gareth/main.go b/2024/gareth/main.go index fc2a0f4..7c66f1b 100644 --- a/2024/gareth/main.go +++ b/2024/gareth/main.go @@ -1,13 +1,17 @@ package main import ( - "aoc2024/day05" + "aoc2024/day06" "fmt" "os" + "time" ) func main() { - data, _ := os.ReadFile("day05/input.txt") - fmt.Printf("part 1: %d\n", day05.Part1(string(data))) - fmt.Printf("part 2: %d\n", day05.Part2(string(data))) + start := time.Now() + data, _ := os.ReadFile("day06/input.txt") + fmt.Printf("part 1: %d\n", day06.Part1(string(data))) + fmt.Printf("part 2: %d\n", day06.Part2(string(data))) + elapsed := time.Since(start) + fmt.Printf("Execution time: %s\n", elapsed) } From 616618c7e2ec53023619eb4eb342b0bd7c23fe8a Mon Sep 17 00:00:00 2001 From: Gareth Date: Wed, 4 Dec 2024 14:00:00 +0000 Subject: [PATCH 05/11] Day04 --- 2024/gareth/day04/day04.go | 91 +++++++++++++++++++++ 2024/gareth/day04/day04_test.go | 35 ++++++++ 2024/gareth/day04/input.txt | 140 ++++++++++++++++++++++++++++++++ 2024/gareth/main.go | 8 +- 4 files changed, 270 insertions(+), 4 deletions(-) create mode 100644 2024/gareth/day04/day04.go create mode 100644 2024/gareth/day04/day04_test.go create mode 100644 2024/gareth/day04/input.txt diff --git a/2024/gareth/day04/day04.go b/2024/gareth/day04/day04.go new file mode 100644 index 0000000..143a575 --- /dev/null +++ b/2024/gareth/day04/day04.go @@ -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 +} diff --git a/2024/gareth/day04/day04_test.go b/2024/gareth/day04/day04_test.go new file mode 100644 index 0000000..2ab9462 --- /dev/null +++ b/2024/gareth/day04/day04_test.go @@ -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) +} diff --git a/2024/gareth/day04/input.txt b/2024/gareth/day04/input.txt new file mode 100644 index 0000000..42fdeef --- /dev/null +++ b/2024/gareth/day04/input.txt @@ -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 \ No newline at end of file diff --git a/2024/gareth/main.go b/2024/gareth/main.go index 7c66f1b..99d93ff 100644 --- a/2024/gareth/main.go +++ b/2024/gareth/main.go @@ -1,7 +1,7 @@ package main import ( - "aoc2024/day06" + "aoc2024/day04" "fmt" "os" "time" @@ -9,9 +9,9 @@ import ( func main() { start := time.Now() - data, _ := os.ReadFile("day06/input.txt") - fmt.Printf("part 1: %d\n", day06.Part1(string(data))) - fmt.Printf("part 2: %d\n", day06.Part2(string(data))) + data, _ := os.ReadFile("day04/input.txt") + fmt.Printf("part 1: %d\n", day04.Part1(string(data))) + fmt.Printf("part 2: %d\n", day04.Part2(string(data))) elapsed := time.Since(start) fmt.Printf("Execution time: %s\n", elapsed) } From 19c4afdc98e33e4cce9e8fb880023b33ee8c7cd1 Mon Sep 17 00:00:00 2001 From: Alan R Evans Date: Sun, 8 Dec 2024 20:48:48 +0000 Subject: [PATCH 06/11] days --- 2024/go/day06/day06.go | 291 ++++++++++++ 2024/go/day06/day06_test.go | 35 ++ 2024/go/day06/input.txt | 130 ++++++ 2024/go/day07/day07.go | 140 ++++++ 2024/go/day07/day07_test.go | 47 ++ 2024/go/day07/input.txt | 850 ++++++++++++++++++++++++++++++++++++ 2024/go/day08/day08.go | 168 +++++++ 2024/go/day08/day08_test.go | 39 ++ 2024/go/day08/input.txt | 50 +++ 2024/go/go.mod | 2 +- 2024/go/main.go | 22 +- 11 files changed, 1770 insertions(+), 4 deletions(-) create mode 100644 2024/go/day06/day06.go create mode 100644 2024/go/day06/day06_test.go create mode 100644 2024/go/day06/input.txt create mode 100644 2024/go/day07/day07.go create mode 100644 2024/go/day07/day07_test.go create mode 100644 2024/go/day07/input.txt create mode 100644 2024/go/day08/day08.go create mode 100644 2024/go/day08/day08_test.go create mode 100644 2024/go/day08/input.txt diff --git a/2024/go/day06/day06.go b/2024/go/day06/day06.go new file mode 100644 index 0000000..d0388f4 --- /dev/null +++ b/2024/go/day06/day06.go @@ -0,0 +1,291 @@ +package day06 + +import ( + "adventofcode2024/utils/grid2d" + "adventofcode2024/utils/inputs" + "fmt" + _ "strings" +) + +type Direction int + +const ( + _ Direction = iota + Up + Down + Left + Right +) + +type Pos struct { + x int + y int +} +type Loc struct { + dir Direction + pos Pos + count int +} + +type Point struct { + dirs []Direction + display string +} + +func (d Direction) String() string { + return [...]string{"-", "Up", "Down", "Left", "Right"}[d] +} + +func (l Loc) String() string { + return fmt.Sprintf("Direction: %s, Position: %d %d", l.dir, l.pos.x, l.pos.y) +} + +func Part1(input string) int { + var loc Loc + grid := inputs.ToGrid2D(input, "\n", "", "", func(c string) string { return c }) + for x := 0; x < grid.SizeX(); x++ { + for y := 0; y < grid.SizeY(); y++ { + if grid.Get(x, y) == "^" { + loc = Loc{dir: Up, pos: Pos{x: x, y: y}} + } + if grid.Get(x, y) == "v" { + loc = Loc{dir: Down, pos: Pos{x: x, y: y}} + } + if grid.Get(x, y) == ">" { + loc = Loc{dir: Right, pos: Pos{x: x, y: y}} + } + if grid.Get(x, y) == "<" { + loc = Loc{dir: Left, pos: Pos{x: x, y: y}} + } + } + } + fmt.Println(grid.Matrix()) + fmt.Printf("%v\n", loc) + grid.Set(loc.pos.x, loc.pos.y, "X") + loc.count = 1 + move1(&loc, grid) + return loc.count +} + +func Part2(input string) int { + var loc Loc + grid := inputs.ToGrid2D(input, "\n", "", Point{}, func(c string) Point { return Point{dirs: make([]Direction, 1), display: c} }) + for x := 0; x < grid.SizeX(); x++ { + for y := 0; y < grid.SizeY(); y++ { + if grid.Get(x, y).display == "^" { + loc = Loc{dir: Up, pos: Pos{x: x, y: y}} + } + if grid.Get(x, y).display == "v" { + loc = Loc{dir: Down, pos: Pos{x: x, y: y}} + } + if grid.Get(x, y).display == ">" { + loc = Loc{dir: Right, pos: Pos{x: x, y: y}} + } + if grid.Get(x, y).display == "<" { + loc = Loc{dir: Left, pos: Pos{x: x, y: y}} + } + } + } + fmt.Println(grid.Matrix()) + fmt.Printf("%v\n", loc) + point := grid.Get(loc.pos.x, loc.pos.y) + grid.Set(loc.pos.x, loc.pos.y, Point{dirs: append(point.dirs, Up), display: "X"}) + for x := 0; x < grid.SizeX(); x++ { + for y := 0; y < grid.SizeY(); y++ { + grid = inputs.ToGrid2D(input, "\n", "", Point{}, func(c string) Point { return Point{dirs: make([]Direction, 1), display: c} }) + p := grid.Get(x, y) + if p.display == "." { + grid.Set(x, y, Point{dirs: p.dirs, display: "#"}) + l := loc + if isLoop(&l, grid) { + loc.count++ + } + grid.Set(x, y, Point{dirs: p.dirs, display: "."}) + } + } + } + return loc.count +} + +func isLoop(loc *Loc, grid *grid2d.Grid[Point]) bool { + for { + _, _, err := move2(loc, grid) + if err != nil { return false } + if contains(loc.dir, grid.Get(loc.pos.x, loc.pos.y)) { + return true + } else { + p := grid.Get(loc.pos.x, loc.pos.y) + grid.Set(loc.pos.x, loc.pos.y, Point{dirs: append(p.dirs, loc.dir), display: "X"}) + } + } +} + +func Part2b(input string) int { + var loc Loc + grid := inputs.ToGrid2D(input, "\n", "", Point{}, func(c string) Point { return Point{dirs: make([]Direction, 1), display: c} }) + for x := 0; x < grid.SizeX(); x++ { + for y := 0; y < grid.SizeY(); y++ { + if grid.Get(x, y).display == "^" { + loc = Loc{dir: Up, pos: Pos{x: x, y: y}} + } + if grid.Get(x, y).display == "v" { + loc = Loc{dir: Down, pos: Pos{x: x, y: y}} + } + if grid.Get(x, y).display == ">" { + loc = Loc{dir: Right, pos: Pos{x: x, y: y}} + } + if grid.Get(x, y).display == "<" { + loc = Loc{dir: Left, pos: Pos{x: x, y: y}} + } + } + } + fmt.Println(grid.Matrix()) + fmt.Printf("%v\n", loc) + point := grid.Get(loc.pos.x, loc.pos.y) + grid.Set(loc.pos.x, loc.pos.y, Point{dirs: append(point.dirs, Up), display: "X"}) + loc.count = 0 + for { + _, _, err := move2(&loc, grid) + if err != nil { + break + } + if contains(loc.dir, grid.Get(loc.pos.x, loc.pos.y)) { + loc.count++ + break + } + } + return loc.count +} + +func move1(loc *Loc, grid *grid2d.Grid[string]) int { + return -1 +} + +func move2(loc *Loc, grid *grid2d.Grid[Point]) (int, int, error) { + x, y, err := doMove(loc, grid) + if err != nil { + return x, y, err + } + if x == loc.pos.x && y == loc.pos.y { + move2(loc, grid) + } + return x, y, nil +} + +func canBlock(loc *Loc, point Point) bool { + val := false + switch loc.dir { + case Up: + if contains(Right, point) { + val = true + } + case Down: + if contains(Left, point) { + val = true + } + case Left: + if contains(Up, point) { + val = true + } + case Right: + if contains(Down, point) { + val = true + } + } + return val +} + +func contains(v Direction, point Point) bool { + for _, d := range point.dirs { + if d == v { + return true + } + } + return false +} + +func checkMove(loc *Loc, grid *grid2d.Grid[string]) bool { + switch loc.dir { + case Down: + if loc.pos.y+1 >= grid.SizeY() { + return false + } + if grid.Get(loc.pos.x, loc.pos.y+1) == "#" { + loc.dir = Left + } else { + loc.pos.y++ + } + case Up: + if loc.pos.y-1 < 0 { + return false + } + if grid.Get(loc.pos.x, loc.pos.y-1) == "#" { + loc.dir = Right + } else { + loc.pos.y-- + } + case Left: + if loc.pos.x-1 < 0 { + return false + } + if grid.Get(loc.pos.x-1, loc.pos.y) == "#" { + loc.dir = Up + } else { + loc.pos.x-- + } + case Right: + if loc.pos.x+1 >= grid.SizeX() { + return false + } + if grid.Get(loc.pos.x+1, loc.pos.y) == "#" { + loc.dir = Down + } else { + loc.pos.x++ + } + } + return true +} + +func doMove(loc *Loc, grid *grid2d.Grid[Point]) (int, int, error) { + x := loc.pos.x + y := loc.pos.y + switch loc.dir { + case Down: + if loc.pos.y+1 >= grid.SizeY() { + return x, y, fmt.Errorf("outside") + } + if grid.Get(loc.pos.x, loc.pos.y+1).display == "#" { + loc.dir = Left + } else { + loc.pos.y++ + } + case Up: + if loc.pos.y-1 < 0 { + return x, y, fmt.Errorf("outside") + } + if grid.Get(loc.pos.x, loc.pos.y-1).display == "#" { + loc.dir = Right + } else { + loc.pos.y-- + } + case Left: + if loc.pos.x-1 < 0 { + return x, y, fmt.Errorf("outside") + } + if grid.Get(loc.pos.x-1, loc.pos.y).display == "#" { + loc.dir = Up + } else { + loc.pos.x-- + } + case Right: + if loc.pos.x+1 >= grid.SizeX() { + return x, y, fmt.Errorf("outside") + } + if grid.Get(loc.pos.x+1, loc.pos.y).display == "#" { + loc.dir = Down + } else { + loc.pos.x++ + } + } + return x, y, nil +} diff --git a/2024/go/day06/day06_test.go b/2024/go/day06/day06_test.go new file mode 100644 index 0000000..8d3a4c3 --- /dev/null +++ b/2024/go/day06/day06_test.go @@ -0,0 +1,35 @@ +package day06 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`....#..... +.........# +.......... +..#....... +.......#.. +.......... +.#..^..... +........#. +#......... +......#...`) + require.Equal(t, 41, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`....#..... +.........# +.......... +..#....... +.......#.. +.......... +.#..^..... +........#. +#......... +......#...`) + require.Equal(t, 6, r) +} diff --git a/2024/go/day06/input.txt b/2024/go/day06/input.txt new file mode 100644 index 0000000..86fc58b --- /dev/null +++ b/2024/go/day06/input.txt @@ -0,0 +1,130 @@ +...#..................#...................#......................#..............................#.............................#... +....#.......................#........#.#..............##...........#.....#..........#..........................#.................. +.............#........................................................................#.........#.#..#..#..........#.............. +..........#.......#..........#..................#........##...................#..............#.................................... +....................#..........................................................#..#.....................................#......... +....#............................#..............................................#.....................#..........##....#.......... +.......#.............#......................................................................#.............#.........#............. +....###......................#....#...........#.....#................................#..........................#................. +..........#..#...........#..#........................................................#.....#...........#................#......... +..#....#......#....#....#...................................................................#..................................... +....................#............#............................................#......#....#...............................#....... +..........#.......#.........#.......#............................................................................................. +.......#...#.......................................#...................#.......................................................... +.......#........#............................#.....#.......#..............................................#..................#...# +.....................#.................................#................#...#...............#.....#.#..........................#.. +.....#..........................................#......................#.............##..............................#........#... +.....#......#.........................#..........................#..........................................................#..#.. +.#......#.............#......#.................................................#.....#...................##......#................ +.............................................................................##................................................... +........................................#.......................................#........#.............................#.#.......# +...........#.....................................#.............................#......#......#..#....................#..#......... +.............................................#.......................#..................##....#.....#............................. +........................#..............................................................#.......................................... +#..............#.........................#........#...#...............#..............#..................#....................##... +...#...#.............................#.......#................................................#........................#....#..... +.....#.........................#..#.......................#..........#.....................#..................#.#.....#........... +..................#........#..#.......#...................................................................................#....#.. +..#...#...............................................#.#..#........................................................#....#......#. +...............#...............#..........................#............................#..........#.............#................. +............#.....#........#.........................................................#........#........#.....#........#......#.... +............................#.........#....#........#.....#...#.............#.................................#................... +........#..................#....#..........................................................#.#.#.................................. +....................................................................................................................#............. +#............#.............#..................#......................................................................#............ +...............................#....#..........#...........##........................................................#.........#.# +................#.........................................#.................................................#........#............ +..............................................#............#................#........#........................#................... +..................#.........#..........................#.............#...............#............#....................#.......... +........................#...#...............................................#..............#.....#.....................#.......... +...........#.......................................#..............................#..................#....#...##.................. +#...............#..................#...............................#...............................#.....................#........ +.............#...............................................................##................................................... +.................#.............#.......................#...#............#.#....#................................#...........#..... +#......#......#..................................##.................#.#...............................#........................... +.#...............#..........#...............................................#...#..........#..........#........................... +.....................................#............................#....#.............................................#...#........ +......#...#.............#.#....................#.........#..........##.................................#..........#..........#.... +.............................#..................#....#..............##.......................#.#.....#........#................... +.................................................#.#......................................................#................#...... +......................................#..........................................#......#......................................... +#....................#...........................................................#..................#............................. +.....#.........#...................................................#....#.#....#.#.........#...................................... +........#..........#......#.............#................................#.....#................#................................. +...........#................................#...........#..........#......#.............#........................#................ +.......#...............#....................#..#................................................#................................. +.....................#.........#..#............#..........#...........#...........#...............................#............... +................#...#........#...........#..........................................................#..#...................#...... +.........................................................#.....................#...#......................#.#....................# +................#......#....#.#..............#............#....................................................................... +..........#.....................................#......................................................................#.......... +#......................................#.......#.....##..#.....................#.........#.......#................................ +........#...#..............#....................#................................#..............................................#. +.##............................................................................#......#................................#.......... +.#........................#..............#..............................................#........#.....#.......#.................. +#......................................#.....................#...................................................................# +............................#.....#.....#............#...............#...#.......#.........#...................................... +.#.........................#.......................#.........#.......#.................#............................#..#.......... +.............................................................................................................#........##.......... +...........#...#...#.#................#.....................................#........#............................................ +......#.......................#..........#.......#................................................................#............... +........#....#........#..................#....##.....#............#..............................#...........#...........#..#..... +..................................#...............................................................................#............... +.....................#.#.......................#....................................#............................................. +........................................................................................#.........#.................#.........#... +..........................#..........#....#..........................................#.......................#............#.#..... +...............................................#.#....#...............................#...................#......................# +.....#...........#........#.#.......#.............................#..................#............................................ +...............#.........................................................#....................#.................#.............#... +#....................................##..........#................................................................#............... +...............#.................#...#..............#......................................................#..............#....... +...................#......#.............................................#......................................................#.# +..#.............#.......#......#....#..#..#....................................................................................... +.........#....................................................#.....................................#..............#.............. +..............#..............#................................................................#.......................#........... +..........................#.................#.......................................................##...................#.#...... +...............#..#...................................................................................................#.......###. +...#.....................#..#........#..........#..................................................................##............. +.................#.......................................###..............#.........................#............................. +...#.....................................................#.......#..........................#................#..#................. +...................................................#..................#.........................................................#. +.....#.............#...................#...................#.....................................#................................ +.....................#.........................#......#........................................................................... +...........#...............#......#.....##...#...#.............................................#........#.#...............#...#... +..............#..............##...........#.......................#..#.^.......................................................... +...................#.............................................................................................................. +..................#.......#..........#.......#..................#..........#...................................#.................. +..............................................................................................#..................................# +......................................................#................#......................#................................... +..............#.........#..............................#.....................#......................#............................. +#................#.........#................#.............................#......................#..#...#..............#.......... +.#..#........#................#...............#..................#........#.....................#............#........#........... +.....................................................#.#.........#......................#.............................#........#.. +......................#.....................#..#......#..........................#............................#......#............ +......................#.........................#..#..................................#.......................#..............#.... +..........................#..................#.............#......................................................#............... +..........................#....#........................................#..#...#....#.................#........................... +.......#...........#.......................#............##........#....................................................#.......... +#..........................................................................#...........#.......................................... +............................................................#.................#..#........................................##...... +..#...............................................#....#.................................................##.....#...##.....#...... +...#.....##..............................#.........................................................#............#................. +.....#....##............................#....##..........#...#.................................................................... +..................................................#..........................#.........##.......#.......................#......... +.........#.....#..........#........#........................#.##..#............#.......................................#.......... +.....#...............#.......#..........#.#..........#.....................#.....................................#.....#.......... +....#......#............................................................................................##...#.#.#.........#...... +...........#........................#.....#....................#..................#.#........#.................................... +....................................................#................#.#................................................#......... +..........#..............#.......................#.................#...................................#.............#.#......##.. +................##......................................................#.................#.......#.#....................#........ +................#......................................................#.............##...............#.....#......#.......#...... +..............................#............................#..........#...........#............................................... +.......#.............#....................................................................#..............................#.#...... +...#.....................#.#...............................................................#...#..#....#.......................... +....#.........##......#..............................................................................#..................#......... +....#..........................................#......#...................#........##............#................................ +..#.......#......#............#........#...#.#...........................#.......#................................................ +..........................#...#....................#...............#...#......#.#...#...#...............#.#.#..................... +....##.#....................................................................#...#.....##........................#.##.............. +.............................................#.................................................................................... diff --git a/2024/go/day07/day07.go b/2024/go/day07/day07.go new file mode 100644 index 0000000..6f4c336 --- /dev/null +++ b/2024/go/day07/day07.go @@ -0,0 +1,140 @@ +package day07 + +import ( + "adventofcode2024/utils" + "fmt" + "strconv" + "strings" +) + +type Op int + +const ( + Add Op = iota + Mul + Conc +) + +func Part1(input string) int { + val := 0 + lines := strings.Split(input, "\n") + for _, line := range lines { + parts := strings.Split(line, ":") + result := utils.MustAtoi(parts[0]) + numStrings := strings.Fields(parts[1]) + var numbers []int + for _, numStr := range numStrings { + num := utils.MustAtoi(numStr) + numbers = append(numbers, num) + } + bitmask := 1 << (len(numbers) - 1) + for i := 0; i < bitmask; i++ { + calc := 0 + switch isNthBitSet(i, 0) { + case true: + calc = numbers[0] + numbers[1] + case false: + calc = numbers[0] * numbers[1] + } + + for n := 1; n < len(numbers)-1; n++ { + switch isNthBitSet(i, n) { + case true: + calc = calc + numbers[n+1] + case false: + calc = calc * numbers[n+1] + } + } + if calc == result { + fmt.Printf("result: %v numbers:%v count: %d\n", result, numbers, bitmask) + val += result + break + } + } + } + return val +} + +func Part2(input string) int { + val := 0 + lines := strings.Split(input, "\n") + for _, line := range lines { + parts := strings.Split(line, ":") + result := utils.MustAtoi(parts[0]) + numStrings := strings.Fields(parts[1]) + var numbers []int + for _, numStr := range numStrings { + num := utils.MustAtoi(numStr) + numbers = append(numbers, num) + } + operations := []Op{Add, Mul, Conc} + results := [][]Op{} + generatePermutations(operations, len(numbers)-1, []Op{}, &results) + for _, op := range results { + calc := 0 + switch op[0] { + case Add: + calc = numbers[0] + numbers[1] + case Mul: + calc = numbers[0] * numbers[1] + case Conc: + calc = concat(numbers[0], numbers[1]) + } + + for n := 1; n < len(numbers)-1; n++ { + switch op[n] { + case Add: + calc = calc + numbers[n+1] + case Mul: + calc = calc * numbers[n+1] + case Conc: + calc = concat(calc, numbers[n+1]) + } + } + if calc == result { + fmt.Printf("result: %v numbers:%v\n", result, numbers) + val += result + break + } + } + } + return val +} + +func isNthBitSet(num, n int) bool { + return num&(1< 0 { + antinodes++ + } + } + } + return antinodes +} + +func Part2(input string) int { + grid := inputs.ToGrid2D(input, "\n", "", pt{display: '.'}, func(c string) pt { return pt{display: rune(c[0]), paired: make(map[loc]pt), visited: make(map[rune]bool)}}) + for x1 := 0; x1 < grid.SizeX(); x1++ { + for y1 := 0; y1 < grid.SizeY(); y1++ { + pt1 := grid.Get(x1, y1) + if pt1.display != '.' { + for x2 := 0; x2 < grid.SizeX(); x2++ { + for y2 := 0; y2 < grid.SizeY(); y2++ { + pt2 := grid.Get(x2, y2) + if x1 != x2 && y1 != y2 && pt1.display == pt2.display && !isPaired(x1, y1, pt1, pt2) { + pt1.paired[loc{x: x2, y: y2}] = pt2 + pt2.paired[loc{x: x1, y: y1}] = pt1 + pt1.antinodes++ + pt2.antinodes++ + grid.Set(x1, y1, pt1) + grid.Set(x2, y2, pt2) + } + } + } + } + } + } + for x := 0; x < grid.SizeX(); x++ { + for y := 0; y < grid.SizeY(); y++ { + pt1 := grid.Get(x, y) + if pt1.display != '.' { + for ploc := range pt1.paired { + addAntiNodes_p2(pt1.display, x, y, ploc.x, ploc.y, grid) + } + } + } + } + antinodes := 0 + fmt.Printf("%v\n", grid.StringWithFormatter(formatter)) + for x := 0; x < grid.SizeX(); x++ { + for y := 0; y < grid.SizeY(); y++ { + pt := grid.Get(x, y) + if pt.antinodes > 0 { + antinodes++ + } else { + if pt.display != '.' { antinodes++ } + } + } + } + return antinodes +} + +func formatter(p pt, x int, y int) string { + if p.antinodes > 0 { + return "#" + } + return "." +} + +func isPaired(x int, y int, p1 pt, pt2 pt) bool { + return p1.paired[loc{x: x, y: y}].display == pt2.display +} + +func addAntiNodes(x1 int, y1 int, x2 int, y2 int, grid *grid2d.Grid[pt]) { + px1, py1, px2, py2 := offsetPoints(x1, y1, x2, y2) + + if px1 < 0 || px1 >= grid.SizeX() || py1 < 0 || py1 >= grid.SizeY() { + return + } + pt1 := grid.Get(px1, py1) + pt1.antinodes++ + grid.Set(px1, py1, pt1) + if px2 < 0 || px2 >= grid.SizeX() || py2 < 0 || py2 >= grid.SizeY() { + return + } + pt2 := grid.Get(px2, py2) + pt2.antinodes++ + grid.Set(px2, py2, pt2) +} + +func addAntiNodes_p2(frequency rune, x1 int, y1 int, x2 int, y2 int, grid *grid2d.Grid[pt]) { + px1, py1, px2, py2 := offsetPoints(x1, y1, x2, y2) + if !(px1 < 0 || px1 >= grid.SizeX() || py1 < 0 || py1 >= grid.SizeY()) { + pt1 := grid.Get(px1, py1) + if !pt1.visited[frequency] { + pt1.antinodes++ + pt1.visited[frequency] = true + grid.Set(px1, py1, pt1) + addAntiNodes_p2(frequency, x1, y1, px1, py1, grid) + } + } + if !(px2 < 0 || px2 >= grid.SizeX() || py2 < 0 || py2 >= grid.SizeY()) { + pt2 := grid.Get(px2, py2) + if !pt2.visited[frequency] { + pt2.antinodes++ + pt2.visited[frequency] = true + grid.Set(px2, py2, pt2) + addAntiNodes_p2(frequency, x2, y2, px2, py2, grid) + } + } +} + +// Function to calculate two points symmetrically placed above and below the line +func offsetPoints(x1, y1, x2, y2 int) (int, int, int, int) { + dx := x1 - x2 + dy := y1 - y2 + + p1x := x1 + dx + p1y := y1 + dy + p2x := x2 - dx + p2y := y2 - dy + return p1x, p1y, p2x, p2y +} diff --git a/2024/go/day08/day08_test.go b/2024/go/day08/day08_test.go new file mode 100644 index 0000000..7ed15be --- /dev/null +++ b/2024/go/day08/day08_test.go @@ -0,0 +1,39 @@ +package day08 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`............ +........0... +.....0...... +.......0.... +....0....... +......A..... +............ +............ +........A... +.........A.. +............ +............`) + require.Equal(t, 14, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`............ +........0... +.....0...... +.......0.... +....0....... +......A..... +............ +............ +........A... +.........A.. +............ +............`) + require.Equal(t, 34, r) +} diff --git a/2024/go/day08/input.txt b/2024/go/day08/input.txt new file mode 100644 index 0000000..701cc7a --- /dev/null +++ b/2024/go/day08/input.txt @@ -0,0 +1,50 @@ +.....y..........................p................r +........I......................................... +......................4.s......................... +..........4....................................... +....y............................................. +......................................p.........r. +..........0..s......N..................1.....p.... +..y........4.......................p.............. +...............0.................................. +..............0....t....N....h.................... +.............N.................................... +......j...................s............H...l..O... +..........q.................H................O.... +..f...e.qj.....y...0.............................. +...........t..........................k..Q..r..... +.........6................Q..s...x......W......... +....2..b...e....t..4.........c.....xW.j........... +...e....................w................1.....O.. +..e..j..5...........................c............. +.........B..2...............MK................H... +...2......b...g..X...q..........h...............O. +...q...2..........m....k...i...............QV.x... +...................i.........W.k.............HQ... +........b...X...............D..........c...N...... +................................l..........h.....I +.m...........g......l.......c.............3......V +....X.......m........g...V.K...7......F.d......... +.........b.X...U..........................C....... +.....................l..............o.1....C...... +............u.............K..............3...d.... +......................i.T....f................V... +..............................1.k................. +.B.....E......9..m....K..5.M...................... +...P...............M...95....o..i........I........ +...............................S......3......wI... +.....EP...........9........5..T.R................. +.P..........v..9......f.............R.Co..w3...... +..........h...SG..v.E...7..f.T.................... +..........6..........L.................Y.......d.. +..........B...............U........D.............. +....B................U.....8..M....n...J.......... +.........................L................Fw...... +....L6E.P.................7.UG....J.....Y.D....... +........t........v...SJ........n..d............... +......................8v.....uG................... +..................L.....n......................... +...............T..............n......D............ +..............o.........8................J.Y.R.... +..................S...............u....F.......R.. +........6..............u.....7.8..........Y..F.... diff --git a/2024/go/go.mod b/2024/go/go.mod index d7d05a2..1ff1c1b 100644 --- a/2024/go/go.mod +++ b/2024/go/go.mod @@ -7,6 +7,6 @@ require golang.org/x/exp v0.0.0-20221208152030-732eee02a75a require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/stretchr/testify v1.10.0 // indirect + github.com/stretchr/testify v1.10.0 // direct gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/2024/go/main.go b/2024/go/main.go index 46934c6..0c51cbd 100644 --- a/2024/go/main.go +++ b/2024/go/main.go @@ -10,8 +10,11 @@ import ( "adventofcode2024/day01" "adventofcode2024/day02" "adventofcode2024/day03" - "adventofcode2024/day04" - + "adventofcode2024/day04" + "adventofcode2024/day05" + "adventofcode2024/day06" + "adventofcode2024/day07" + "adventofcode2024/day08" ) // Usage: go run main.go // assumes input is in day/input.txt @@ -32,6 +35,19 @@ func main() { case 4: fmt.Printf("part 1: %d\n", day04.Part1(utils.Readfile(d))) fmt.Printf("part 2: %d\n", day04.Part2(utils.Readfile(d))) + case 5: + fmt.Printf("part 1: %d\n", day05.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day05.Part2(utils.Readfile(d))) + case 6: + fmt.Printf("part 1: %d\n", day06.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day06.Part2(utils.Readfile(d))) + case 7: + fmt.Printf("part 1: %d\n", day07.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day07.Part2(utils.Readfile(d))) + case 8: + fmt.Printf("part 1: %d\n", day08.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day08.Part2(utils.Readfile(d))) + default: panic(fmt.Errorf("no such day: %d", d)) } @@ -39,7 +55,7 @@ func main() { // Reads day from os.Args. func day() int { - latest := 3 + latest := 7 if len(os.Args) == 1 { return latest } From f8c29be7ef5db1a48a0b32187bff3552f5e3b8bc Mon Sep 17 00:00:00 2001 From: Alan R Evans Date: Mon, 9 Dec 2024 16:46:10 +0000 Subject: [PATCH 07/11] day9 --- 2024/go/day09/day09.go | 117 ++++++++++++++++++++++++++++++++++++ 2024/go/day09/day09_test.go | 17 ++++++ 2024/go/day09/input.txt | 1 + 3 files changed, 135 insertions(+) create mode 100644 2024/go/day09/day09.go create mode 100644 2024/go/day09/day09_test.go create mode 100644 2024/go/day09/input.txt diff --git a/2024/go/day09/day09.go b/2024/go/day09/day09.go new file mode 100644 index 0000000..64ddd3d --- /dev/null +++ b/2024/go/day09/day09.go @@ -0,0 +1,117 @@ +package day09 + +import ( + "adventofcode2024/utils" + "fmt" +) + +func Part1(input string) int { + disk := []int{} + file_id := 0 + for i := 0; i <= len(input); i++ { + for x := 0; x < utils.MustAtoi(string(input[i])); x++ { + disk = append(disk, file_id) + } + i++ + if i < len(input) { + for x := 0; x < utils.MustAtoi(string(input[i])); x++ { + disk = append(disk, -1) + } + } + file_id++ + } + + printDisk(disk) + + for i:=len(disk)-1;i>0;i--{ + if disk[i] != -1 { + id := disk[i] + disk[i] = -1 + for j:=0;j<=len(disk);j++ { + if disk[j] == -1 { + disk[j] = id + break + } + } + } + } + printDisk(disk) + + checksum := 0 + for i:=0;i0;i--{ + size := 0 + if disk[i] != -1 { + id := disk[i] + for { + if i-size > 0 && disk[i-size] == id { + size++ + } else { + break + } + } + free := 0 + j := 0 + found := false + for ;j Date: Mon, 13 Jan 2025 18:44:06 +0000 Subject: [PATCH 08/11] updates --- 2024/go/day10/day10.go | 103 + 2024/go/day10/day10_test.go | 31 + 2024/go/day10/input.txt | 56 + 2024/go/day11/day11.go | 76 + 2024/go/day11/day11_test.go | 17 + 2024/go/day11/input.txt | 1 + 2024/go/day12/day12.go | 146 + 2024/go/day12/day12_test.go | 29 + 2024/go/day12/input.txt | 140 + 2024/go/day13/day13.go | 58 + 2024/go/day13/day13_test.go | 45 + 2024/go/day13/input.txt | 1279 ++++++ 2024/go/day14/day14.go | 149 + 2024/go/day14/day14_test.go | 527 +++ 2024/go/day14/input.txt | 500 +++ 2024/go/day15/day15.go | 119 + 2024/go/day15/day15_test.go | 57 + 2024/go/day15/input.txt | 71 + 2024/go/day16/day16.go | 225 + 2024/go/day16/day16_test.go | 47 + 2024/go/day16/input.txt | 141 + 2024/go/day17/day17.go | 91 + 2024/go/day17/day17_test.go | 25 + 2024/go/day17/input.txt | 5 + 2024/go/day18/day18.go | 126 + 2024/go/day18/day18_test.go | 6915 ++++++++++++++++++++++++++++++ 2024/go/day18/input.txt | 3450 +++++++++++++++ 2024/go/day19/day19.go | 87 + 2024/go/day19/day19_test.go | 42 + 2024/go/day19/input.txt | 402 ++ 2024/go/go.mod | 8 +- 2024/go/go.sum | 11 +- 2024/go/main.go | 77 +- 2024/go/utils/dijkstra/graph.go | 242 ++ 2024/go/utils/dijkstra/object.go | 35 + 2024/go/utils/dijkstra/queue.go | 65 + 36 files changed, 15386 insertions(+), 12 deletions(-) create mode 100644 2024/go/day10/day10.go create mode 100644 2024/go/day10/day10_test.go create mode 100644 2024/go/day10/input.txt create mode 100644 2024/go/day11/day11.go create mode 100644 2024/go/day11/day11_test.go create mode 100644 2024/go/day11/input.txt create mode 100644 2024/go/day12/day12.go create mode 100644 2024/go/day12/day12_test.go create mode 100644 2024/go/day12/input.txt create mode 100644 2024/go/day13/day13.go create mode 100644 2024/go/day13/day13_test.go create mode 100644 2024/go/day13/input.txt create mode 100644 2024/go/day14/day14.go create mode 100644 2024/go/day14/day14_test.go create mode 100644 2024/go/day14/input.txt create mode 100644 2024/go/day15/day15.go create mode 100644 2024/go/day15/day15_test.go create mode 100644 2024/go/day15/input.txt create mode 100644 2024/go/day16/day16.go create mode 100644 2024/go/day16/day16_test.go create mode 100644 2024/go/day16/input.txt create mode 100644 2024/go/day17/day17.go create mode 100644 2024/go/day17/day17_test.go create mode 100644 2024/go/day17/input.txt create mode 100644 2024/go/day18/day18.go create mode 100644 2024/go/day18/day18_test.go create mode 100644 2024/go/day18/input.txt create mode 100644 2024/go/day19/day19.go create mode 100644 2024/go/day19/day19_test.go create mode 100644 2024/go/day19/input.txt create mode 100644 2024/go/utils/dijkstra/graph.go create mode 100644 2024/go/utils/dijkstra/object.go create mode 100644 2024/go/utils/dijkstra/queue.go diff --git a/2024/go/day10/day10.go b/2024/go/day10/day10.go new file mode 100644 index 0000000..b52a587 --- /dev/null +++ b/2024/go/day10/day10.go @@ -0,0 +1,103 @@ +package day10 + +import ( + "adventofcode2024/utils" + "adventofcode2024/utils/grid2d" + "adventofcode2024/utils/inputs" + "fmt" +) + +type Position struct { + height int + summit bool +} + +func Part1(input string) int { + score := 0 + i := 0 + grid := inputs.ToGrid2D(input, "\n", "", Position{height: -1}, func(c string) Position { return Position{summit: false, height: utils.MustAtoi(c)} }) + fmt.Println(grid.StringWithFormatter(formatter)) + for y := 0; y < grid.SizeY(); y++ { + for x := 0; x < grid.SizeX(); x++ { + position := grid.Get(x, y) + if position.height != 0 { + continue + } + wipe_summit(grid) + score += getScore(x, y, 0, 0, grid) + fmt.Printf("Trailhead %d (%d,%d) paths: %d\n", i, x, y, score) + i++ + } + } + return score +} + +func Part2(input string) int { + score := 0 + i := 0 + grid := inputs.ToGrid2D(input, "\n", "", Position{height: -1}, func(c string) Position { return Position{summit: false, height: utils.MustAtoi(c)} }) + fmt.Println(grid.StringWithFormatter(formatter)) + for y := 0; y < grid.SizeY(); y++ { + for x := 0; x < grid.SizeX(); x++ { + position := grid.Get(x, y) + if position.height != 0 { + continue + } + wipe_summit(grid) + score += getScore2(x, y, 0, 0, grid) + fmt.Printf("Trailhead %d (%d,%d) paths: %d\n", i, x, y, score) + i++ + } + } + return score +} + +func formatter(p Position, x int, y int) string { + return fmt.Sprintf("%v", p.height) +} + +func wipe_summit(grid *grid2d.Grid[Position]) { + for y := 0; y < grid.SizeY(); y++ { + for x := 0; x < grid.SizeX(); x++ { + pos := grid.Get(x, y) + if pos.height == 9 && pos.summit { + pos.summit = false + grid.Set(x, y, pos) + } + } + } +} + +func getScore(x, y, level, score int, grid *grid2d.Grid[Position]) int { + directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}} + for _, dir := range directions { + x1 := x + dir[0] + y1 := y + dir[1] + nposition := grid.Get(x1, y1) + if level == 8 && nposition.height == 9 { + score++ + } + if nposition.height != level+1 { + continue + } + score = getScore(x1, y1, nposition.height, score, grid) + } + return score +} + +func getScore2(x, y, level, score int, grid *grid2d.Grid[Position]) int { + directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}} + for _, dir := range directions { + x1 := x + dir[0] + y1 := y + dir[1] + nposition := grid.Get(x1, y1) + if level == 8 && nposition.height == 9 { + score++ + } + if nposition.height != level+1 { + continue + } + score = getScore2(x1, y1, nposition.height, score, grid) + } + return score +} diff --git a/2024/go/day10/day10_test.go b/2024/go/day10/day10_test.go new file mode 100644 index 0000000..5b8f7a2 --- /dev/null +++ b/2024/go/day10/day10_test.go @@ -0,0 +1,31 @@ +package day10 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`89010123 +78121874 +87430965 +96549874 +45678903 +32019012 +01329801 +10456732`) + require.Equal(t, 36, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`89010123 +78121874 +87430965 +96549874 +45678903 +32019012 +01329801 +10456732`) + require.Equal(t, 81, r) +} diff --git a/2024/go/day10/input.txt b/2024/go/day10/input.txt new file mode 100644 index 0000000..df5bfc9 --- /dev/null +++ b/2024/go/day10/input.txt @@ -0,0 +1,56 @@ +43217654309879876104563234589896761012345656543098901001 +34108903212368123233472105676787851299856567832187812652 +45677814301457014312986345589876940387765678943046543743 +56789325100876525800345276430105432456566589858956769821 +65438456912963436901236187621234501223455410767349874430 +74321067803451107898547093412012982016764323101210143561 +89412210987430210789698892102123673107895214589723652678 +78601521856521345678721743089034543212345605679854781789 +66789430545678934505430654898745672212236765434765690878 +55676545038943213216765989601654981300129870121012345969 +46543216127657804389834808762347690456789983498141456452 +65454307233456934870126712354878765565210012507230987321 +54567898332110125961015645403969234674323215616546576010 +65658983021001876854324106912452128789321308723455678901 +76543212137892965348933217832141089873410419678964987652 +89862901236543501267018363101033210565566566569873788543 +89871876544345652106529854892123521454479877654012699830 +78100703454278743212434763763014672343287778943210581021 +65210212565189858906763212654985785650198961212101432010 +54321056876012567875898708783476698763267890303215678321 +87012567988703489874345679692676543294986725456574329478 +96543498589876530365210189501987650187675216987687610569 +01234567651010921234501076401236501010564307678596789876 +10389830532329854376542345321545692323403018789455430965 +21456721013456765289031234980098783410912129670320121054 +92505432565421010109120345671107654567823451061210120123 +87615443478302341018750134543234541050765962552121234984 +34322342189219650129665234789432132021894873443010965673 +45451056077828743234574343276543032134703210523457876532 +51069987456943104545987650167898749865612309610765454101 +32678678345652210698092156756547056764303458779890363232 +43010589232781306787183045876532178965210569888211274321 +56923432101090458989254234923421369878934678898302989430 +87889211078764567876360143010030450767125986567401276589 +96676305669653478985478652102141341458076803456564345676 +45435434734522780340349760123456232349883712678178737894 +80127821821011091211299854354987101016792103549069016323 +92346940910329654304587121267807652345013401232108925412 +81055432101458765643671010871018947654324589543987432101 +76567789023467010782532346965425638945695678654986540012 +05498654110567821891047897212334721032786014345678901098 +12387013223489932346156598101549889821012823216765212387 +03456323016576542345692367210678710701296954907854323456 +12345465437895431016781450123467623654387867878985401501 +21089870124326528701670101874345634565676541045621032012 +32189210065017019632543210965236730120545632456734548743 +43498349876298903545450143050159821321234012349895699654 +34567658389101232123469052101567634489234510106786789985 +99876501276788943016578769872498105672105621215021058876 +87035432365897654107689898763343234321678789334134567655 +70129641034781089898791099854232145690569245493254321567 +63238701123654178718982387763156056781410126787655010498 +54345652321073265001073456012047189872328901098546710327 +34568543434589874132569895145438976987437812361239891210 +21879654898678013203456701236327805456546521450967890123 +30968745467654320112345210987610112345545430567856543234 diff --git a/2024/go/day11/day11.go b/2024/go/day11/day11.go new file mode 100644 index 0000000..c040fb0 --- /dev/null +++ b/2024/go/day11/day11.go @@ -0,0 +1,76 @@ +package day11 + +import ( + "adventofcode2024/utils" + "fmt" + "strconv" + "strings" +) + +func Part1(input string) int { + stones := strings.Fields(input) + for i := 0; i < 25; i++ { + n_stones := []string{} + for _, stone := range stones { + switch { + case stone == "0": + n_stones = append(n_stones, "1") + case len(stone)%2 == 0: + d1 := strconv.Itoa(utils.MustAtoi(stone[0 : len(stone)/2])) + d2 := strconv.Itoa(utils.MustAtoi(stone[len(stone)/2:])) + n_stones = append(n_stones, d1) + n_stones = append(n_stones, d2) + + default: + n_stones = append(n_stones, fmt.Sprintf("%d", utils.MustAtoi(stone)*2024)) + } + } + stones = n_stones + } + return len(stones) +} + +func Part2(input string) int { + stones := strings.Fields(input) + smap := make(map[string]int) + smap2 := make(map[string]int) + + for _, stone := range stones { + smap[stone] = 1 + } + for i:=0;i<75;i++ { + for k, v := range smap { + switch { + case k == "0": + smap2["1"] = smap2["1"] + v + case len(k)%2 == 0: + d1 := strconv.Itoa(utils.MustAtoi(k[0 : len(k)/2])) + d2 := strconv.Itoa(utils.MustAtoi(k[len(k)/2:])) + smap2[d1] += v + smap2[d2] += v + default: + k2 := fmt.Sprintf("%d", utils.MustAtoi(k)*2024) + smap2[k2] += v + } + } + smap = CopyMap(smap2) + smap2 = make(map[string]int) + } + count := 0 + for _, v := range smap { + count += v + } + return count +} + +func CopyMap(original map[string]int) map[string]int { + // Create a new map to hold the copy + copied := make(map[string]int) + + // Copy each key-value pair from the original map to the new map + for key, value := range original { + copied[key] = value + } + + return copied +} diff --git a/2024/go/day11/day11_test.go b/2024/go/day11/day11_test.go new file mode 100644 index 0000000..ed2a8c3 --- /dev/null +++ b/2024/go/day11/day11_test.go @@ -0,0 +1,17 @@ +package day11 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1("125 17") + require.Equal(t, 55312, r) +} + +func TestPart2(t *testing.T) { + r := Part2("125 17") + require.Equal(t, 55312, r) +} diff --git a/2024/go/day11/input.txt b/2024/go/day11/input.txt new file mode 100644 index 0000000..c42d5d7 --- /dev/null +++ b/2024/go/day11/input.txt @@ -0,0 +1 @@ +3 386358 86195 85 1267 3752457 0 741 diff --git a/2024/go/day12/day12.go b/2024/go/day12/day12.go new file mode 100644 index 0000000..447d522 --- /dev/null +++ b/2024/go/day12/day12.go @@ -0,0 +1,146 @@ +package day12 + +import ( + "adventofcode2024/utils/grid2d" + "adventofcode2024/utils/inputs" + "fmt" + +) + +type Plot struct { + crop string + visited bool + region int + x int + y int +} + +type Region struct { + plots []Plot + crop string + id int + area int + perimteter int + sides int +} + +func Part1(input string) int { + var val int + region_id := 0 + regions := make(map[int]Region) + grid := inputs.ToGrid2D(input, "\n", "", Plot{}, func(c string) Plot { return Plot{crop: c, region: -1} }) + fmt.Println(grid.StringWithFormatter(formatter)) + for y := 0; y < grid.SizeY(); y++ { + for x := 0; x < grid.SizeX(); x++ { + var region Region + plot := grid.Get(x, y) + if plot.visited { + continue + } + + region_id++ + region = Region{id: region_id, area: 1, crop: plot.crop, sides: 4} + plot.region = region_id + plot.visited = true + plot.x = x + plot.y = y + grid.Set(x, y, plot) + region.plots = append(region.plots, plot) + regions[region_id] = region + + try_neighours(grid, ®ion, x, y) + regions[region.id] = region + } + } + for _, region := range regions { + val += region.area * region.perimteter + } + return val +} + +func Part2(input string) int { + var val int + region_id := 0 + regions := make(map[int]Region) + grid := inputs.ToGrid2D(input, "\n", "", Plot{}, func(c string) Plot { return Plot{crop: c, region: -1} }) + fmt.Println(grid.StringWithFormatter(formatter)) + for y := 0; y < grid.SizeY(); y++ { + for x := 0; x < grid.SizeX(); x++ { + var region Region + plot := grid.Get(x, y) + if plot.visited { + continue + } + + region_id++ + region = Region{id: region_id, area: 1, crop: plot.crop} + plot.region = region_id + plot.visited = true + plot.x = x + plot.y = y + grid.Set(x, y, plot) + region.plots = append(region.plots, plot) + regions[region_id] = region + + try_neighours(grid, ®ion, x, y) + regions[region.id] = region + } + } + for _, region := range regions { + val += region.area * get_sides(grid, region) + } + return val +} + +func formatter(p Plot, x int, y int) string { + return fmt.Sprintf("%v", p.crop) +} + +func try_neighours(grid *grid2d.Grid[Plot], region *Region, x int, y int) { + + directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}} + plot := grid.Get(x, y) + perimeters := 0 + + for _, dir := range directions { + x1 := x + dir[0] + y1 := y + dir[1] + nplot := grid.Get(x1, y1) + + if nplot.crop == plot.crop { + if !nplot.visited { + region.area++ + nplot.visited = true + nplot.region = plot.region + nplot.x = x1 + nplot.y = y1 + grid.Set(x1, y1, nplot) + region.plots = append(region.plots, nplot) + try_neighours(grid, region, x1, y1) + } + } else { + perimeters++ + } + } +} + +func get_sides(grid *grid2d.Grid[Plot], region Region) int { + sides := 0 + corners := [][][]int{{{-1, 0}, {0, -1}, {-1, -1}}, + {{+1, 0}, {0, -1}, {+1, -1}}, + {{-1, 0}, {0, +1}, {-1, +1}}, + {{+1, 0}, {0, +1}, {+1, +1}}} + for _, plot := range region.plots { + for _, o_corners := range corners { + c1 := grid.Get(plot.x + o_corners[0][0], plot.y + o_corners[0][1]) + c2 := grid.Get(plot.x + o_corners[1][0], plot.y + o_corners[1][1]) + c3 := grid.Get(plot.x + o_corners[2][0], plot.y + o_corners[2][1]) + if c1.crop != region.crop && c2.crop != region.crop { + sides++ + } else if c1.crop == region.crop && c2.crop == region.crop && c3.crop != region.crop { + sides++ + } + } + } + return sides +} \ No newline at end of file diff --git a/2024/go/day12/day12_test.go b/2024/go/day12/day12_test.go new file mode 100644 index 0000000..1602d7c --- /dev/null +++ b/2024/go/day12/day12_test.go @@ -0,0 +1,29 @@ +package day12 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`RRRRIICCFF +RRRRIICCCF +VVRRRCCFFF +VVRCCCJFFF +VVVVCJJCFE +VVIVCCJJEE +VVIIICJJEE +MIIIIIJJEE +MIIISIJEEE +MMMISSJEEE`) + require.Equal(t, 1930, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`AAAA +BBCD +BBCC +EEEC`) + require.Equal(t, 80, r) +} diff --git a/2024/go/day12/input.txt b/2024/go/day12/input.txt new file mode 100644 index 0000000..d0b3daa --- /dev/null +++ b/2024/go/day12/input.txt @@ -0,0 +1,140 @@ +UUUUUUUUUUUUUUUUUUUDQQQQQQQOOOOOHHSSSSSYYYYYYYYGGGGNNNNNNNNTTTTTTTTTTTTTTDDDDDDDDDDDDDDDDDDNNNCCNJJJJOOHHHDDDDDDDDDDDDDDDDDDXXMBBBBMMCCCCCCC +UUUKUUUUUUUUUUUUUDDDDDDDQQQOOOOOOOOOSSSSSYYYYYYYYGGGGGNNNNTTTTTTTTTTTTTTTTTTTTDDDDDDIIDDDNNNNNCCNJJJOOOHDDDDDDDDDDXDDDDDDDMMMXMMMMMMMMCCCCCC +UUUKKUUUUUUWUUUUUUDDDDDDDDDROOOOOOOWWSSSSYYYYYYYGGGGGGGQNTTTTTTTTTTTTTTTTTTTTTDDDDDDDIDIINNNNLNNNNOOOOODDDDDDDDDDXXDDDDDDDMMMMMMMMMMMMCCCCCC +UUKKUUKKXUUUUUUUUDDDDDDDDDDDDOOOOOOOOYSSSSSYYYYYGGGGGGQQNNTTTTTTTTTTTTTTTTTTTTDDDDDIDIIIINNNNNNNNNNOOOODDDDDDDXDDXXDDDDDDDMMMMMMMMMMMMMMCCCC +UUKKUKKKXXUQQQQUUDDDDDDDDDDDDOOOOOOOOYYYYYYYYYYYGGGGGQQIINTTTTITTTTTTTTTTTTTTTTDDDIIIIIIIINNNNNNNNNOOODDDDDDDDXXXXXXDDDDDMMMMMMMMMMMMFFFFCCC +UKKKKKKKXKAWWWWWDDDDDDDDDDDDDOOOOUUOYYYYYYYYYYYYGGGGQQQQIIDITIIIITTTTTTTTTTTTTDDDDIIIIIIINNNNNNNNLLLLODDDDDDXXXXXXXXDXDDDMMMMMMMMMMMMFFFFCCC +KKKKKKKKKKKWWWWKDPPDDDDDDDWWWOOOOOUUYYYYYYYYYYYYYGRQQQQQIIIIIIIIITTTTTTTTTTTDDDDDDIIIIIIIIINNNNNNNLLLLLDDDDDXXXXXXXXXXDDDDDMMMMMMMMMMFFFCCCC +KKKKKKKKKKWWWWWWDDDDDDDDDSWWWOWOOOOUYYAYYYYYYYYYYYQQQQQIIIIIIIIOIITTTTTTTTTTDDDDIIIIIIIIIIINNNNNLNNNLLLDDDDDDXXXXIXYDDDDDDDMMMMMMMMMMFFFCFCC +KKKKKKKKWWWWWWWWSSDSDDDDDSSWWWWOOOOUYYAYYYYYYYYYYQQQQQQIIIIIIIIIITTTTTTTTTTDDDIIIIIIIIIIIINNNNNNLLLLLLLDDDDDDXXXXIXYDDDQDDDMMMMMMMUMFFFFFFFC +KKKKKKKWWWWWWWWWSSSSDSDSSSSWWWWWOOOUYYYYYYYYYYYYYYQQQQIIIIIIIIIIIIIXXXXXTTTTDIIIIIIIIIIIKINNLNNNLLLLZLLLLDDVDXXXXXYYDDQQDDTMMYYYMMUUUFFFFFCC +KKKKKKKKWWWWWWWWWWSSSSSSSSSSWWWWWWOUYPPPPPYYYYYYQQPQQQQAIIIIIIIIISSXXXXXXXTTDIIIIIIIIIIIIIIILLLLLLLLZZLLLDDDXXXXXXXYYDXXXYMMMYYYYMPUUFFFFFFC +KKKKKKKKWWWWWWWWWWBBBBSSSSSWWWWWWWSSPPPPWWWWWWAYPPPPQAAAAITTIIIIIXXXXXXXUTTXXXIIIIIIIIIIIIIOLLLLLLLLZZLLLLLLLLXXXXYYXXXXXXXXRPPPPPPPPPFFCCFC +KKKKKKDWWWWWWWWWWWDDBBBSSSSWWWWWWWWSSPPPPWWWWWWWPPPPPAAAAIIIIIIIIXXXXXXXXXDXXIIIIIIIIIIIIIIOLLLLLLLZZZZZZLLLLNXNNXNYYYXXXXXXPPPPPPPPPPFFCCCC +KKKKKKWWWWWWWWWWWWBBBBBBBSSSWWWWWWWSSSSPPWWWWWWWPPPPPAAAAAAIIIIIIIXXUUUUUUXXXXIIIIIIIIIIIIIILLLLLLLZZZZZZZLLLNNNNNNYYYXXXXXXPPPPPPPPPPCFCCCC +KTKQQKWWWWWWWWWWBWBBBBBBBSBSWWWWWSSSSSPPPWWWWWWWWPPPPPPAAFAIIYYYUUUUUUUUUUUXXXQQQIIIXXXXXXXXXXLLLLLZZZZZZZZZLNNNNNNYYXXXXXXXPPPPPPPPPPCCCCCC +QQKAQQWWWWWWWWWWBWBBBBBBBBBSWWWSSSSSSSSPPWWWWWWWPPPPPPPPPPYYYYYYUUUUUUUUUUUQXQQQQQQIXXXXXXXXXXLZLLEZZZZZZZZZLNNPNNNYYXXXXXPXPPPPPPPPPPPCCCCC +QQQQQQQWWWWWWWWWBBBBBBBBBBVWWWDDSSSSSSSSSPWWWPPPPPPPPPPPPPYYYYYYUUUUUUUUUUUUUUUUQQIIXXXXXXXXXXLZZZZZZZZZZZZLLUUUUUUUUXXXXXPPPPPPPPPPPPCCCCCC +QQQQQQQQWWWWWWWWBBBBMMMBBBMWWWDSSSSSSSSSSPPPPPPPPPPPPPPPYYYYYYYBYYXXXXXUUUUUUUUUOIIIIZZZZZLLLZZZZZZZZZZZZZZZZIIIIUUUUUXPPXPPPPPPPPPPYYCCCCCC +QQQQQQQQQWWZZZWMMMMMMMMMBMMWWDDSSSSSSSSSSSPPPPPPPPPPPPPPYYYYYYYYYXXXXXXUUUUUUUUUOOIIIZZZZLLLLLZZZZZFFFFFFFFFHHHIUUUUUPPPPPPPYPPYPPPYYYCCCCCC +QQQQQQLQQQWWZZZMMMMMMMMMMMHHWSSSSSSSSSSSPPPPPPPPPPPPPPYYYYYYYYYYXXXXXXXUUUUUUUUUOIIIIIZLLLLLLZZZZZZFFFFFFFFFHHHIUMUUUPPPPPPPYYYYYYYYYYYCCCYC +QQQQQLLQLLZZZZMMMMMMMMMMMMMMWSSSSSSSSSSSPPPPPPPPPBYPPPYYYYYYYYYYYYXXXXXUUUUUUUUUIIIIIIIILLZZZZZZZZZFFFFFFFFFHHFFFFQUULLPPPPPQYYYYYRYYYYYYYYY +QQQLLLLLLLLZZZMMMMMMMMMMMMMMNMSSSSSSSSSSVVPPPPPPBBYYYYYYYYYYYYYYYYYXXXXUUUUUUUUUOIIIIILLLLZZZZZZZZZFFFFFFFFFFFFFFFFUUMMPPPPPYYYYYYYYYYYYYYAA +QQQLLLLLLLLZZZZMMMMMMMMMMMMMMMSSSSSSSSSSVVPPPBBBBBBYYYGGGGGGGGGYYYYYYYYUUUUUUUUUIIIIILLLLZZZZZZZZZZFFFFFFFFFFFFFFFFMMMOPPPPGYYYYYYYYYYYYYYYA +QQLLLLLLLLZZZZMMMMMMMMMMMMMMMSSSSSSSSRRSVVVVVVBBBBBYYYGGGGGGGGGYYYYYYYXUUUUUUUUUIIIIILLLLLZZZZZZZZZZZHHZZHHFFFFFFFFMMMMMPPPYYYYYYYYYYYYYYYYY +QQLLLLLLLLLZZZMMMMMMMMMMMMMMMSSSSSSRRRRSVVVVVBBBBBBBYYGGGGGGGGGYYYYYYEEUUUUUUUUUIIIIILLLLLBZZZZZZZZZZHHHHHHFFFFFFFFMMMMMMPIIYYYYYYYYYYYYYYYY +QQQLLLLLLZZZZZZMMMMMMMMMMMMMFSSSSSSRRRRRRVVVVVVVVBBYGGGGGGGGGGGYYXYYYEEEEEEEEEEEIEIILLLLLLZZZZZZZZZZZZHHHHHFFFFFFFFMMMMMMPPIIYYYYYYYYYUUYYYU +QQQQQQGLLLLPPPMMMMMMMMMMMMMMMSRSSSRRRRRRVVVVVVVVBBBQGGGGGGGGGGGGGGYXXXEEEEEEEEEEEEELLLLLHZZZZZZZZZZZXZHHHHHFFFFFFFFMMMMIIIIIYYYYYYYYYYUUUUYU +QQQQQQQQQLKPPPPIIMMMMMMMMMUUUURRSRRRURRRVVVVVVVVVBQQGGGGGGGGGGGGGGXXXXXEEEEEEEEEJEELLLHHHHHHHHHZZDDZZZHHHHHFFFFFFFFQMMMQQIIIIYUUUUYYYYUUUUUU +JJQQQTQQQKKKPPPPPQQMUUMUUUUUURRRSRUUURRRUUUVVVUVVVQQGGGGGGGGGGGGGGXXXXXEEEEEEEEEJJJLLHHTTHHHHHHYYYDDDZHHHHHFFFFFFFFQMMMQQQQQUUUUUUUUUUUUUUUU +JJJJQTTQKKKPPPPPPQQQUUUUUUUCURRRRRRUUURRUUUVUUUUVVQQGGGGGGGGGGGGGGXXXXZEEEEEEEEEJJJJJHTTTTHHHHHHYDDDDHHHHHHMMQQQHQQQQMQQQQQUUUUUUUUUUUUUUUUU +JJJJJTTTPKKPPPPPPPQUUUUUUUUUUURRRRRRUUUUUUUVUUUUUVVQGGGGGGGGGGGGGGXXXXZEZZZZEEEJJJJJTTTTTTTTHHHHYYYMMHHHMHHMMMQQQQQQQQQQQQQUUUUUUUUUUUVUUUUU +JJJJJTTPPPPPPPPPPPPUUUUUUUUUURRRRRRUUUUUUUUUUUUUUVVUGGGGGGGGGGGGGGXXRRZZZZZZEEDDDJJTTTTTTTTHHHHHYMMMMHMHMMMMMMMQLLLQLQQQQQQUUUUUUUUUVUVVUUUU +JJJJJJJPPPPPPPPPPPUUUUUUUUUUURRRRPRRRUUUUUUUUUUUUVVUGGGGGGGGGGGGGGZRRRRRRRDDDDDDDJJJZTTTTTTTHHYYYYMMMMMHHMMMMMLLLLLLLLQQSQQSSUUUUBBBVVVVVUUU +JJJJJBBPPPPPPPPPPPUUUUUUUUUUUURRRPPCCUUUUUUUUUUUUUUUGGGGGGGGGGGGZZRRRRRRRBDDDDDDDJJJTTTTTTTTYHYYYYYYUMMMHMMMMLLLLLLLLLLLSSSSUUUUBVVVVVVZVUUU +JJJJBBBBPPPPPPPPPPUUUUUUUUUUUURRPPPCCGUUUUUUUUUUUUUUUGGGGGGGGGGGZZZRRRRRRRYDDDDDDJJTTTTTTTTTYYYYYYYYYMMMMMMMMMMMLLLLLLLSSSSSSUUUBVVVVVVVVVUU +JJJJBBBBPPPPPPPPPPUUUUUUUUUUUURUPPPCCCCCCUUUUUUUUUUUUGGGGGGGGGGGZZZRRRRRRRRRRRRDDDJTTTTTTTTYYYYYYYYYMMMMMMMMMMMLLLLLLLLSSSSSSSSSEEEEVVVVVVVU +JJJJBBBBQQQPPPPPPPUUUUUUUUUUUUUUPPCCCCCCCUUUUUUUUUUUUGGGGGGGGGGGZZZRRRRRRRRRRRRDDDTTTTTTTTTTYYYYYYYOYMMMMMMMMMMMMMLLLLLLSSSSSSEEUEEEVEEVQQVQ +JJJJJBBBBQQQPPPPUUUUUUUUUUUUUUPPPPCCCCCCCCCFFUUUUUUUQGGGGGGEEKKKKZZRRRRRRRRRDDDDHDTTTTTTTTTTTTYYYYYYYMMMMMMMMMMMMMMMSSSSSSSSSSEEEEEEEEQQQQQQ +JJJJBBBBBQQQQQPPUHHWUUUUUUUUUUPPPPCCCCCCCCCFFUUEUUMUQGGGGGGEEEKKKZRRRRRRRRRRRHDDHDDDTTBTTTTTTTYYYYYYYYMMMMMMMMMMMMSSSSSSSSSSSEEEEEEEEEEQQQQQ +JJHBBBBBQQQQQPPPPHHWWUUUUUUUUPPPPPCCCCCCCCCCAUUEUUUUQGGGGGGEKKKKPRRRRRRRRRRRRHHHHHDTTTTTNTTTTTTTXYYAAYYMMMMMMMMMMMGGSGGGOOOSOOOEEEEEEEEEQQQQ +JHHHBBBBQQQQQPPPPHHWWUUUWWWUPPPPPPPPCCCCCCAAAAAEEEUUUGGGGGGCKKKKKKKRRRRRRRRRRHHHHHDTWWTTNNNTTTXXXYAAAAMMMMMMMMMMMGGGGGGJOOOOOOEEEEEEEEEEQQQE +HHHHBBBUQQQQQPPPPWHWWWUWWWWUPPPPPPPPPPCCCCAAAAAEEEEEEGGGGGGCKKKKKKKRRRRRRRRRGGHHHHHHWWNNNNNNTXXXXXXAAAAAMMMMMMMMGGGGGGJJOOOOOOEEEEEEEEEEEQEE +HHHHHBBBBQQQPPPPWWWWWWWWWWWWWPPPPPPPPPCCCAAAAAEEEEEECCCCCCCCKKKUKKRRRRRRRRRRRGHHHHHWWDDDNNNNTTXNNNNVAAAAAMWMMMMMGGGGGGJJOOOODEEEEEEEEEEEEEEE +HHHHHHHHUQQUPPPPWWBWWWWWWWWWWPPPPPPPPPCCAAAAAAAEEEEECCCCCCCCCKKKKRRRRRRRREKKKKKDHHHWDDDDNNNNNNNNNNNNNAAAAAMMMMPMMEGGGEOOOOOOEEEEEEEEEEEEEEEE +HHHHUHHHUQQUUPPPSUUWWWWWWWWWWPPPPPPPPPPCJPBAATTTTTEEEERRCCCCRRKKKKRRRRRRRRKKKKKKNHHWDDDDDNNNNNNNNFFNNAAAAAAAAMPMEEGGGEOOOOOOVVVEEEEEEEEEEEEE +HHHHUUUUUUUUUUVVUUWWWWWWWWWWWPPPPPPPPPPPPPAATTTTTTEEEERRUCCCCRKKKKKKRRRKKKKKKDDJDDDWDDDDDNNNNNNNNNNNAAAAAAAAAMMAEEEGGEEOOOOOOVVSESSSSEEEEEEE +HHHHHUUUUUUUUUUUUUWWWWWWWWWWWPPPPPLTTPPPPPPTTTTTTTTTEERRRCCCCRRKKKKKRRKKKKKKKDDDDDDDDDDDDDDNNNNNNNNNAAAAAAAAMMAAEEEEGEEEEEOOVVSSSSSSSEEEEEEE +HHHHHHHHHUUUUUUUUUWWWWWWWWWWLLLLLLLTTPPPPPPTTTTTTTTTEERRPCERRRRRKKKKKKKKKKKMKLDDDEDDDBBBBBBBNNNNNNNNNAAAAAAAAAAAAAEEEEEEEEOOVVSSSSSSSSSSEGGE +HHHHHHHUUUUUUUUUXUWWWWWWWWWWLLLLLLLTTTPPPTTTTTTTTTTTERRRRRRRRRRRRKKKKKKKKMKMLLLDDDDDDBBBBBBBNNNNNNANAAAAAAAAAAAAAAEEEEEEEEEESSFSSSSSSSSSESGG +HHHHHHHUUUUUUUUXXXXWWWWWWLLLLLLLLLTTTTTTTTQTTTTTTTTTTRRRRRRRRRRRKKMMKKKKKMMMMMLLDDDDDBBBBBBBNNNNNNNAAAAAAAAAAAAAAAKKEEEEEEEESSSSSSSSSSSSSSGG +HHHHHUUUUUUUUUUXXXXXWWWXLLLLLLLLLLTTTTTQQQQTTTTTTTTTTTRRRRRRRRRRRKMMMKKKKMMMMMMDDDDDDBBBBBBBNNNNNNNNNAAAAAAAAAKKKKKKEEEEEEEEESSSSSSSSSQSNQGG +HHHKKUUUUKUUUWWXXXXXXXXXLLLLLLLLLLQQQTTQQHQTQQQTTTTTTRRRRRRRRRRRRMMMMKKKKMMMMMMDDDDDDBBBBBBBDNNNNNNNBBBBBBBAAAAKKKKKKKEEEEEEEESSSSSSSSQQQQGG +HHHHKKLKAKKUWWWXXXXXXXXXLLLLLLLLLLQQQTTQQHQQQQTTTTTTTRRRRRRRRRRRRMMMMMKMMMMMMMMQQDDDDBBBBBBBNNNNNNNNBBBBBBBAAAAKKKKKKEEEEEEEESSSSSSSSSQGQQGG +HHHHHKKKKKKUWWWWWXXXXXXXXLLLLLLLLLQVQQQQQQQQQQQTTTTTRRRRRRRRRRRNNMMMMMMMMMMMMMMQQZDDDBBBBBBBBBBBBBNABBBBBBBAAAAKKKKKKEEEEEENEESSSSSSQSQQQQGQ +HHHHKKKKKKKRWWWWWWXXXXXXXLLLLLLIILIQQQQQQQQQQQQQTTTTRRRRRRRRRRRNMMMMMMMMMMMMMMMQQZDDDBBBBBBBBBBBBBBBBBBBBBBAAAAKKKKKKEEEENNNNSSSSSSSQQQQQQQQ +HMHHKKKKKKKRWWWWWXXXXXXXXLLLLLLIIIIQQQQQQQQQQQQQTTTRRRGRRRRRRRRNMMMMMMMMMMMMMMZQZZDDDBBBBBBBBBBBBBBBBBBBBBBAAAAAAKKKKEEENNNNNSSSNSSSQQQQQQQQ +MMKKKKKKKKKWWWWWWXXXXXXXXLLLLLLLLIIIQQQQQQQQQQQQQQTRRRRKKRRRRRNNMMMMMMMMMMMMBBZZZZZZDBBBBBBBBBBBBBBBBBBBBBBAAIIAKKKKKKKENNNNNNNSNSSUUQQQQQQQ +NMMMMKKKKKKWWWWWWWXXXXXLLLLLLLLLLLLIIQQQQQQQQQQQQEEERRIIKRRRRNNNMMMMMMMMMMMMMBZZZZZZZBBBBBBBBBBBBBBBBBBBBBBNIIIKKKKKKKKKKNNNNNNNNSUUQVQQQQQQ +MMMKKKKKKKKWWWWWWXXXXXXXXRRRRJXXXLIIQQAQQQQQQQQQQEEEEEIIIIINNNNNNMMMMMMMMMMMBBZZZZZZZDSSBBBBBBBBBBBBBBBNNNEEIIIKKKKKIKKNNNNNNNNNNNQQQQQQQQQQ +MFMIFFKKKKKKWWWWWWXXXXXXRRRRJJJXXQQQQQQQQQQQQQQQQEEEEEEEIINNNNNNNNNNMMMMMMMBBBBBZZZZZDZZBBBBBBBBBBBBBBBNNNIIIIIKKKIKIINNNNNNNNNNNQQQQQQQQQQQ +FFBIFFFKKKKKWWWWWWXXXXXXWWRRRJJXXXXQQQQQQQQQQQQQQEEEEEIIIINNNNNNNNNNNMMMMMMMBBBCBZZZZZZZBBBBBBBBBBBNNNNNNIIIIIIIIIIIIINNNNNNNNNNNNNQQQQQQQQQ +FFBBBFFFFKKKYWWWXXXXXXVWWWRRRJXXXXXXXQQQQIQQQUQQUUEUEEIIIIIIINNINNNNMMMMMBBBBBBBBBZZZZZZZZBBBBBBBBBIINNNNIIIIIIIIIIIIIIINNNNNNNNNNNNNHQQQQQQ +FBBBBFFFFFFFFWWWXXXXXXXWWWRWWXXXXXXDDPPPQQUUUUUQUUUUIIIIIIIIIIIINNNNMMMMMBBBBBBBBBZZZZZZZZBBBBBBBBBINNNNNIIIEIIIIIIIIIIIINNNNNWNNNNNNHQZQQQQ +BBBBBFFFFFFFEEEQXXXXXXXXWWWWWXWXXXXDDPPZZUUUUUUUUUUUIIIIIIIIIIIINNNNNNMBBBBBBBBBBBBZZZZZZZBBBBBBBBBIIIIEEEEEEIIIIIIIIIIIWWWWWUWWNWNNNNQZZDDD +BBBBBFFFFFEEEEEQXNNXXXWWWWWWWWWWXDDDDQQUUUUUUUUUUUHBIIIIIIIIIIIBNNNNNNBBBBBBBBBBBBZZZZZZZZBBBBBBBBBIIIIIEEEEEIIIIIIIIIIIWWWWUWWWWWNNNNNZDDDD +BBBBBBFFFFFEEEEEENNNNWWWWWXXXXXXXXXXDDDDDDDUUUUUUBBBIIIIIIIIIIIBNNNNNBBBBBBBBBBBBDBBZZZZZZBBBBBBBBBIIIIEEEEEEEEEIIIIIIIWWWWWWWWWWWNNNZZZDDDD +BBBBBBBEFFFEEEEEENENNNWWWWXXXXXXXXXXDDDDDDDDUUUUBBBBBIIIIIIIILBBBNBNNNNBBBBBBBBBBBBZZZZZZZBBBBBIIIIIIEEEEEEEEEEEIIIIIIIWWWWWWWWWWWZZZZZZDDDD +BBBBBBEEEYEEEEEELEEENNWWWWXXXXXXXXXXDDDDDDUUUUUUUBBBBIIIIIIIIIBBBBBBBBBBBBBBBBBBBBBBZZZZZZHHHUUUIIIIIENEEEEEEEEEIIIIMMMWWWWWWWWWWWZZZZZZZZDD +BBBBBBBEEEEEEEEEEEEENWWWWWXXXXXXXXXXDDDDDDDUUUUUUBBBBIIIIIEIIBBBBBBBTTBBBBBBBBBBBBBZZZZZZZHUUUUUUUIIEEEEEEEEEEEEEMMMMMMMWWWWXXXXXWZZIJZZZZDZ +BBBBBBBBBEEEEEEEEEEEELXXXXXXXXXXXXXXDDDDDDUUUUUUUBTUBIIIIIIIBBBBBBBBTBBBBBBBBBBBBBZZZZZZZZUUUUUUUUIIIELEEEEEEEEEEMMMLWWMWXXXXXXXXXZIIIIIZZDZ +BBBBBBBBBEEEEEEEEEEEEEXXXXXXXXXXXXXXDRRDZAUUUUUUUUUUUNNNNIMBBBBBBBBBBBBBBBBBBBBOOBZZZZZZZZZUUUUUUUUUEEEEEEEEEEEEEMMMLLWWWXXXXXXXXXZIIPIZZZZZ +BBBBBBBBBBEEEEEEEEEEEWXXXXXXXXXXXXXXDRRDAAAUUUUUUUUMMMNMNNMBBBBBBBBBBBRNBBBBBVNOZZZZZZZZUUUUUUUUUUUUUEEEEEEEELELLMMLLLWWWXXXXXXXXXZIIIIIIZZZ +BBBBBBLLLLLLEEEEEEEEEEXXXXXXXXXXXXXXWVVAAARAUUUUUUUMMMMMMMMBBBBBBBBBBBRNNBBNNNNOOZZZNNZUUUUUUUUUUUUUUUUEEEEEELLLLMLLLLWWWXXXXXXXXXZIIIIIIZZZ +BBBBBBLLLLLLEEEEEEEEEEXXXXXXXXXXXXXXWVVAAAAAAUUUUUUMMMMMMMMBBBBBBBBBBRRNNNNNNNNOONZZNNZUUUUUUUUUUUUUZEEEEEEEELLLLLLLLVWWWXXXXXXXXXIIIIIIIIIZ +BBBBBBLLLLLLLLXXEEEVEKXXXXXXXXXXXXXXWVVVVVVAAAAUUUUMMMMMMMMBBMBBBBBBBBRNNNNNNNNNNNNNNUUUUUUUUUUUUUUUEEEEEEEEELLLLLLLLLLLWXXXXXXXXXIIIJZZZZZZ +BBBBBBLLLLLLLGLLEEEEEKXXXXXZZZZZZZWWVVVVVVVVVUUUUUMMMMMMMMMMMMBBBBBBBBNNNNNNNNNNINNNNUUUUUUUUUUUUUUJEEEEEEEELLLLLLLLLLLWWXXXXXXXXXJJJJJJJZZZ +BBBBBBLLLLLLLLLLLLLLLLXXXXXXXXXXXXXWVVVVVVVVVUUUUUMMMMMMMMMMMMBBBBBBBBBNNNNNNNNNNNNNNUUUUUUUUUUUUVVICCELEEEELLLLLLLLLLDDWXXXXXXXXXWWJJJJZZZZ +BLLLLLLLOOOLLLLLLLLLLLXXXXXXXXXXXXXWVVVVVVVVVVURRUFRMMMMMMMMMBBBBBBBBNNNNNNVKKNNNNNNNNNNNUUUUIVVVVVICCCEEEEELLLLLLLLLDDDDXXXXXXXXXJJJJJJJZZZ +BLLLLLLLOOOLLLLLLLLLLLCZZZXXXXXXXXXZVVVVVVVVVVRRRRRRRRMMMMMMMIIIBBBBBBBBVVVVVKYNNNNNNNNNNNUIIIIVVVIIIIEEEEELLLLLLLLLLDDDDDDXXXJJJJJJJJJJJZZZ +BLLLLLLLOOOLLLLLLLLLLLLLZZXXXXXXXXXZVVVVVVVVVRRRRRRRRRRRTTTIIIIIIIBBBYYVFVVVVVYYNNNNNNNINNNIIIIVVIIIIEEEEEEEELVLLLLGLLDDDDDXXXJJJJJJJJJJJJJZ +LLLLLLLLOOOLLLLLLLLLLLLNZZXXXXXXXXXZVVVVVVVVRRRRRRRRRRRRRRRNIIIIIBBBBYYVVVVVYYYYYYNNNNNIIIBIIIIVIIIIIBEEEDDKELVVDLLLLDDDDDDDDDJJJJJJJJJJJJJZ +LLLLLLLLOOOLLLLLLLLLLALNZZXXXXXXXXXZVVVVVVVVKRRRRRRRRRRRRRRRRIIIIBBBBBYYYYVVYYYYYYNNNIIDIIIIIIIIIIIIIIDREDVDEVVVDLLDLDDDDDDDDJJJJJJJJJJJJJJJ +LLLLLLLLOOOLLLLBBBLLAAZZZZZZZZZZZZZMVVVVVVVRRRRRRRRRRRRRRXRRIIIIIIIIBYYYYYVVYYYYYYNNNIIIIIIIIIIIIIIIIIDDDDDDDVVDDDDDDDDDDDQDDDJJJJJJJJJJTJJC +LLLLLLLLOOOLLLBBBBLLLAAAAAMZZZZMZZMMMVVVVVVRCCCRRRRRRRRRRRRRIIIIIKKYYYYYYYYYYYYYYYYYNNIIIIIIIIIIIIIIIIDDDDDDDVDDDDDDDDDDDQQDDDJJJJJJJJJTTTJC +LLLLLLLLOOOLLLLBBBLQLAAAAAMMMZZMZMMMVVVVVVVRCCCCCRRRRRRIIIRRRIIIIKKYYYYYYYYYYYYYYYYYYIIIIIIIIIIIIIIISIDDDDDDDVVDDDDDDDDDQQQDQQGJJJJJJJJGGGCC +LLLLLLLLOOOLLLBBBBBBAAAAAAMMMMMMMMMMMVVVVVVCCCCCCRRRRRRIIIIIIIIIIIKYYYYYYYYYYYYYYYOOOIIIIIIIIIIIIIIIGIDDDDDDDDDDDDWWQQQQQQQQQQGJTJJWWWWGGGCC +LLLLLLLLOOOLLLBBBBBBAAAAAAAMMMMMMMMMXXVVVVVCCCCCCCEEERJJJIIIIIIIIKKKKYYYYYYYYYYIIIIIIIIIIIIIIIIIIIIGGGDDDDDDDDDDIWWGQQQQQQQQTTJJTTGGGGWGGGGC +TLLLLLLLLLLLLLBBBBBBBAAAAAAMMMMMMMMXXXVVXVVCCCCCCCEEEEAAAAAIIIIIIKKKKYYYYYYYYYYIIIIIIIGIIIIIIIIIIFGGGGDDDDDDDSDWWWGGQQQQQQQQTTTTTGGGGGGGGCCC +TLLLLLLLLLLLLLCBBBBBBBACAAAMMMMMMMMXXXXXXXCCCCCCCCEEECAUUUUUUIIIIKKKYYYYYYYYYIIIIIIIIIGIIIIIIFFFFFGGGGDDDDDDSSSSWWWGGQQQQQQQTTTTGGGGGGGGGCCC +ZLLLLLLEELLLLLBBBBBBBUCCCMMMMMMMMMMMXXXXXCCCCIIIIIIIIIIUUUUUUHIIKKKKYYYYYYYYYYGXIIIIIIGIIIIIIGGFFFGGGGGDDDDDSSSSSGGGGGQQQQQTTTTGGGGGGGGCCCCC +ZZLLLZZLLLLLLLBBBSBBBBBCMMMMMMMMMMXXXXXXXXCCCIIIIIIIIIIUUUUUUHIIIIKKJYYYYYYYYGGGIIIIIGGGGIIIQGGFGGGGGGGSSSSSSSSSSSSGGQQQQQTTQTTTTGGGGGGCCCCC +ZZZEZZZZZLLRLLCCKCBBCCCCMMMMMMMMMMMXXXXXXXCCCIIIIIIIIIIUUUUUUHHHIIKKJYYYGGAGGGGGGFGIWGGGGIIGGGGGSSSSSSSSSSSSSSSSSSGGGQQQQQQQQQTTGGGGGGGCCCCC +ZZZZZZZZZZLLLLSCCCCCCCCCCMNNMMMMMEEXXXXXXXXCCIIIIIIIIIIUUUUUUHQHHHJJJJJYGGGGGGGGGFGGGGGGGGGGGGGGSSSSSSSSSSSSSSSSSWWWGWQQQQQQQQQTGGGGGGCCCCCC +ZZZZZZZZSSLLLSSSCCCCCCCCMMNMMMMMMMMXXXXXXCCCTIIIIIIIIIIUUUUUUHQHHJJJJJJGGGGGGGGGGGGGGGGGGGGGGGGGSSSSSSSSSSSSSWWWWWWWWWQWQQQQWQTTGGGGGGGGCCCC +ZZZZZZZZSSSSSSSSSCCCCCMMMMMMMMMMMMMXXXXXXCXXCIIIIIIIIIIQQQQQQQQQAJJJJJJJJJGGGGGGGGGGGGGGGGGGGGGGGGGGGGGSSSSSSSSWWWWWWWWWWQWWWQQGGGGGGGGGCCCC +ZZZZZZZSSSSSSSSSSCCCCCMMMMMMMMMMMMMXXXXXXXXXXIIIIIIIIIIIIQQQQQQAAEAJJJJJJJGGGGGGGGGGGGGGGGGGGGGGGGGGDDDSSSSSSSSWWWWWWWWWWWWQQQQQGOGGGGGGCCQC +ZZZZZZZZSTTTSSSSSCCCCCCCMMMMMMMMMMXXXXXXXXXXXXXWWIIIWAIIIQQAPQQAAAAAJJJJGGGGGGMGGGGGGGGGGGGGGGGGGGGGDDDDSSSSSSSAWHWHWWWWWWWQQQQQGGGQQGGGGCQQ +ZZZZZZZZZTTTSSSTSSCCHCCMMMMMMEMMMAXXXXXXXXXXXXWWWIIIIIIIIIAAPPPAAAAAJJJMGGGGGGMMMGGGGGGGGGBBGGGEGGGGDDBDSSSSSSSHHHHHWWWWYWWQQQQQQQQQQQQGQQQQ +ZZZZZZZOZTTTTTTTTSCCHCHMMMEEEEEMAAXXXXXXXXXXXXWIIIIIIIIIIIAUAPAAAAAAJJJMGGGMMGMMMGGGGGGGGGGGGGEEGGGGSSSSSSSSSSSHHHHHWWWYYQQQQQQQQQQQQQQQQQQX +ZZZZZZZOZZTTTTTTTTTHHHHHMEEEEEEEEAAXXGXJXXXXXXWIIIIIIIIIIIAAAAAAAAAAAMMMMMMMMMMMGGGGGGGGGGGGGWEEEEEESSSSSSSSSSSHHHHHHHWHHHHQQQQQQQQQQQQQQQQQ +ZZZZZOOOTTTTTTTTTTTTTTEHEEEEEEEEAAXXXXXJXCXXXIIIIIIIIIIIIIAAAAAAAAAAMMMMMMMMMMMMGGGGGGGGGGGGGWEEEEEESSSSSSSSSSSHHHHHHHHHHHHQQQQQQQQQQQQQQQQQ +ZZZZZOOOTTTTTTTTTTTTTTEEEEEEEEEEEAXXAAAJACCCCIIIIIIIIIIIIIAAAAAAAAAAAAMMMMMMMMMMMMMGGGGGGGGGGEEEEEEESSSSSSSSSSSHHHHHHHHHHHHQKKQQQQQQQQQQQQQQ +OOOOOOOOOOTTTTTTTTTTTUUESSSSSSSEAAAAAAAAACCCCIIIIIIIIIIIIIFAAAAAAAAAAAMMMMMMMMMMMGGGGGGUGGGEGEEEEEEESSSSSSSSHHHHHHHHHHHHHHHHKKKKQQQQQQQQQQQQ +OOOOOOOOOOTTTTTTTTTTUUUESSSSSSSEAAAAAAAAACCCCIIIIIIIIIIIIIAAAAAAAAAAAMMMMMMMMMMMMMGGGGGGGEEEEEEEEEEESSSSSSSSXXHHHHHHHHHHHHHHKKKQQQQQQQQHQQQQ +OOOOOOOOOOOTTTTTTTTTCCCESSSSSSSZEAAAAAAAEEECCSIIIIIIIIIISSAAAAAAAAAAMMMMMMMMMMMMMMGGGGOOEEEEEEEEEEEESSSSSSSSXXXHHHHHHHHHQHHHHKNPPIQQQQQHQHHH +OOOOOOOOOOTTTTTTTTTTCCCCSSSSSSSEEEAAAACEEEESSSIIIIIIIIIISSAAAMMAAAAAMMMMMMMMMMMMMMXXGGJEEEEEEEEEEEXBSSSSSSSSXXXXHHHHHHHQQHHKKKNNPIIIQIIHHHHH +OOOYYYYYOOTTTTTTTTTTBCCCSSSSSSSEHHHAAAEEEEESSSIIIIIIIIIITGGAMMMAAAMMMMMMMMMMMMVVVMXXXJJJJEEEEEEEEEXXSSSSSSSSXXXXXHHHHHHHHHKKKKKNNIIIIIIHHHHH +OOYYYYYYOTTTTTTTTTUTCCCCSSSSSSSEHHHAAAEEEEEESSIIIIIIIIIITGGAMMMAAAAAMDMMMMMMMMVVXXXXXJJJJEEEEERRREXXSSSSSSSSXXXXXHHTHTKKHHKKKKKNNTIIIIIHHHHH +OOYYYYYYOYTTTTTTTCUCCCCCSSSSSSSYYHIIIIIEEEEESSIIIIIIIIIITTTTMMMMAAADDDDMMMMMMMVVVVXXXJJJJJEEEERRRXXXBBBXXXXXXXXXHHHTTTTKKKKKKKNNNTIIIIIIHHHH +YYYYYYYYYYTTTTTTTCCCCCCCSSSSSSSYYHIIIIIIEEEEESSSSSSSSSTTTTTJTYYYAADDDDDDVVMVVVVVVVJJJJJJJJEEEEERRXXXBBXXXXXXXXXXGGGTTTTTKKKNNNNNIIIIIIIIIHHH +YYYYYYYYYYYYTTTYYYCCCCCCSSSSSSSSSPIIIIIEEEEEESSSSSSSTSTTTTTTTTYYYADDDDDDVVVVVVVVVVJJJJJJJJEEEERRRXXXXXXXXXXXVXVVVVGTTTUTKNNNNNNNIIIIIIIIIHHH +YYYYYYYYIIYYYYYYYCCCCCCCCCSSSSSSSIIIIIIIEEEEEEESSSSSTTTTTTTTTTTYYYDDDDDDVVVVVVVVVVVVVJJJJJEEERRRRRRXXXXXXXXXVVVVVGGTTTTMNNNNNNNNIIIIIIIIIHHH +YYYYYYYYHHHHHHYYYYCCCCCCCCSSSSSSSIIIIIIEEEEESESSSSSSTJTTTTTTTTYYYYYDDDDDDVVVVVVVVVVJJJJJJJEEERRRRRRRRXXXXXXXVVVVVVVVATTNNNNNNNNNIIIIIIIIHHHH +YYYYYYYYYHHHHHHYYYCCCCCCCCSSSSSSSIIIIIGEEEEESSSSSSSSSYTTYTYYYYYYYYYDDDDDDDDVVVVVVVVJVVVVJEEERRRRRRRRRXRRXXXXVVVVVVVVAAAANNNNNNNNNIIIIIIIIHHH +YYYYYYYDYHHHHHYYYYCCCCCCCCSSSSSSSIIIGGGEEEEEESSSSSSSSYYYYYYYYYDDDYYYDDDDSDDDVVVVVVVVVVVVVEEERRRRRRRRRRRRXXXXVVVVVVVVAAAANNNNNNNNNNIIIIUUIIHH +YYYYYYYYHHHHHYYYYYCCCCCCCCSSSSSSSIIIIIIIPEEEEESSSSSYYYYYYYYYYYDDDDSSDSSSSVVVVVVVVVVVVVVVEEEERRRRRRRRRREEXXXVVNVVVVVVAAAANNNNNNNNNNIIIUUUUUHH +SYSSSSYYHHHHHHYYYYCCCYCHCCSSSSSSSSSSSIHPPEEEEEEESSSYYYYYYYYDDYDDDDSSSSSSSSSVVVVVVVVVVVMMMMMMKMRRRRRRRRTEXXXXTVVVVVVAAAAAANNNNNNNNNNUIUUUUUUH +SYSSSSYYHHHHHHYYYYYYCYIHHCSSSSSSSSSSSHHHHEEEEEESSSSAYYYYYYYDDDDDDDFSSSSSSSSSVVVVSVVMMMMMMMMMKMMRRRRRRTTEETTTTTTVVVAAAAAAANNNNNNNNNNUUUUUUUUU +SSSSSSSSSHHHHHYYYYYYYYYHHHHSSSSSSSSSSHHHHEEEEEEAASSSHYYYYYYDDDDDFFFSSSSSSSSSSVVVSVVMMMMMMMMMMMMRTRRRRTTTTTTTTTTVAAAAAAAAANNNNNNNNNNUUUUUUUMU +SSSSSSSHHHHHHHHHYYYYYYYYHHHSSSSHHIIIHHHHEEEEEAAAAASHHHHSYYYDDDFFFFSSSSSSSSSSSSSSSVVMMMMMMMMMMMAATRRRTTTTTTTTTTUVAAAAAAAANNNNNNNNNNNUUUUUUUUF +SSASSSSSSHHHNHHHZZJJYTYHHHHHHHHHHHIIHHHHHHEEEAAAAAAATHXXXYYADDFFFFSSRSSSSSSSSSSSVVVMMMMMMMMMMMAATTTTTTTTTTTTTTTAAAAAAAAAAUNNNNNUNUUUUUUUBBBF +SSASSSSSSHHHHJHZZJJJYYYHHHHHHHHHHHHHHHHHHHGEEAAAAAAAAXXXXYYAAAAAAAASASSSSSSSSSSSSSVVMMMMMMMMMAATTTTTTTTTTTTTTTAAAAAAAAAAUUNNUNUUUUUUUUUBBBBB +SAAAASSSSBHHVJHHJJJJYYHHHHHHHYYHHHHHHHHHHHGAAAAAAAAAAXXXXXYYAAAAAAAAAAASSSSSSSSSVVVMMMMMMMMMMAATTTTDTTTTTTTTTTTAAAAAAAAAUUUUUNUUUUUUUUBBBBBB +SAAAAASBBBBJJJJHJJJJYYHHHHHHYYYYYHHHHHHHHAAAAAAAAAAAAXKXXXIRAAAAAAAAASSSSSGASSSSVVVTMMMMMMMMAAAATTMDTTTTTTTXZTTAAAAAAVAAVVUUUUUXUXUUUUUHHBBH +AAAAAASSSBJJJJJJJJJHHHHHHHHYYYYYYYYYHHHHHAAAAAAAAAAAAXXXNIIRRAAAAAAAAAAAASSAASSSSVTTMSMMMMMMMAAATTMMMMTTTXTXXTXAAAAAAVVVVEUUUUUXXXUUUUUUHHHH +AAAAAJRJJJJJJJJJJJJHHHHHHHYYYYYYYYYYHHHHHAAAAAAAAAAAAJIIIIIRAAAAAAAAAAAAAASAAATSRVTTMMMMMMMXXXAAATPMMMKXXXXXXXXXAAAAAVVVVUUUUUXXXXXXXUUUHHHH +AAAAARRTTJAAJJJJJJJJHHHHHHHYYYYYYYYYHHHAAAAAAAAAAAAAAJIIIIIIIIIAAAAAAAAAAAAAATTTVVTTMMMGMZZXXXXAAMMMMXXXXXXXXXXXAAAVVVVVVUUUUXXXXXXXXXHHHHHH +AAAAARRRJJAJJJJJJJJJHHHUUUUUYYYYYYYYYYEAAAAAAAAAAAAAAAYYIIIIIIIIAAAAAAAAAAAAAATTTTTTWMMMMZZXXXAAAAMMMXXXXXXXXXXXAAAVVVVVVUVVUXXXXXXXXXXHHHHH +AAAAAAARJAAJJJJJJJJJMPPUUUUUYYYYYYYYYYAAAAAAAAAAAAAAAAAAIIIIIIIAAAAAAAAAAAAAAATTTTTWWDDDMXXXXXXXAAAXXXXXXXXXXXXXAAVVVVVVVVVVUXXXXXXXXHHHHHHH +AAAAAARRRAAAJJJJJJJJPPPUUUUUYYYYYYYYYYAANNAAAAAAAAAAAIAIIIIIIIIAAISAIIIAAAATAATWWTWWWWDDXXXXXXXXXXXXXXXXXXXXXKKKAAVVVVVVVVVVUXXXXXXXXHHHHHHH +AAAAAGGRRAAAAAJJPPPJJPPUUUUUYYYYYYYYYYYOOOOROSSAAAIAAIIIIIIIIFIIAIIIIIIAAOOOAATTWWWWWWWXXXXXXXXXXXXXXXXXXXXXXXKAAKVVVVVVVVVVVTXXXXXIIXXHHHHH +AAAAAGGGRRRAAAAAAPPPPPPPPPYYYYYYYYYYYYOOOOOOOSSSSAGGGGGIIIIIFFIIIIIIIIAAOOOOOOTTWWWWWWWXXXXXXXXXXXXXXXXXXXXXXXKKKKKKVVVVVVVVVVXXXXXXXEXXHHHH +AAAAAGGARAAAAAAPPPPPPPPPPPPPYYYYYYOYYYOOOOOOOSSSSGGGGGIIIIIIIFIIIIIIIIAAOOOOOOOOWWWWWWIIXHXXXXXXXXXXXXXXXXXXXXKVVVVVVVVVVVVVVVXXXXXXXEXXHHHH +AAAAAGGAAAAAAAAPPPPPPPPPPPPPPPYYOOOOOYOOOOOOOOOSSGGGGGGIIIIIIIIIIIIIIIOOOOOOHHHHWWWWWWIIXHXXXXXXXXXLXXXXXXXXXXXZZVVVVVVVVVVVVVVXXXXXXXXXHHHH +AAAGGGAAAAAAAAPPPPPPNNNPPPPPPPPPPOOOOOOOOOOOOOCGGGGGGGGGIIIIIIIIIIIIIIIQIOOOHHHHHWWWWWWIJHHXXXXXXXXXXXXXXXXXXHXZZVVVVVVVVVVVVVVXXXXXYYXXHHHH +GAAGGGGAAAAAAAAAPJJNNNNPNPPPPPPPNOOOOOOOOOOOOOCGGGGGGGGGGGIIIIIIIIIIIIIIIOHHHHHHHWIWIIIIJHHXXXXXXXXXXXXXXXZZXXZZZVVVVVVVVVVVVVVYXYYYYYYYEEHH +GGGGGGGGAAAAAAAAAJJNNNNNNPPPPPPPPOOOOOOOOOOUOOOGGGGGGGGGGINIIIIIIIIIIIIIIIIHHHHHHHIIIIJJJHHXXXXXXJXXXXXXXXXZZZZZVVVVVSSSZVVZVVVYYYYYYEEEEHHH +GGGGGGGGGAAAAAAAAJJNNNNNNPPPPPPPPPPOOOOOOOOUUUGGGGGGGGGGGIIIIIIIIIIIIIIIIHHHHHHHHIIIIIIJJJHXXXXXXXWXXFXXXXZZZZZZVZZVVVVVZZZZZVYYYYEYYEEAEHHH +GGGGGGGGAAAAAAAAAAJNNNNNNNPNPPPPXXXOOOOOOOOOUUGGGGGGGGGGGGIIIIIIIIIIIIHHIIHHHHHHHHHIIIIJJJHXXXXXXXWXFFFXXXXZZZZZZZZZZZVZZZZZZZYYYYEEEEEEHHHH +GGGGGGGGGGGAAAJJJJJNNNNNNNNNPPPXXXXOOXXOOOOOGGGGGGGGGGGGGGGGIIIIIIIIIIIHHHHHHHHHHHHHHHHHHHHHXXXXXXXXXFFFFXXZZZZZZZZZZZZZZZZZZZZZYYEEEEEHHHHH diff --git a/2024/go/day13/day13.go b/2024/go/day13/day13.go new file mode 100644 index 0000000..5f90897 --- /dev/null +++ b/2024/go/day13/day13.go @@ -0,0 +1,58 @@ +package day13 + +import ( + "adventofcode2024/utils" + _ "adventofcode2024/utils/grid2d" + _ "adventofcode2024/utils/inputs" + "regexp" + _ "fmt" + "strings" +) + +func Part1(input string) int { + val := 0 + machines := strings.Split(input, "\n\n") + pattern := `Button A: X\+(\d+), Y\+(\d+)\sButton B: X\+(\d+), Y\+(\d+)\sPrize: X=(\d+), Y=(\d+)` + re := regexp.MustCompile(pattern) + for _, machine := range machines { + matches := re.FindStringSubmatch(machine) + a := utils.MustAtoi(matches[1]) + b := utils.MustAtoi(matches[2]) + c := utils.MustAtoi(matches[3]) + d := utils.MustAtoi(matches[4]) + X := utils.MustAtoi(matches[5]) + Y := utils.MustAtoi(matches[6]) +// fmt.Println(matches) + B := (Y*a - X*b)/(a*d - c*b) + A := (X - c*B)/a +// fmt.Printf("A: %d B: %d\n", A, B) + if (A*a + B*c == X && A*b + B*d == Y) { + val += A*3 + B + } + } + return val +} + +func Part2(input string) int { + val := 0 + machines := strings.Split(input, "\n\n") + pattern := `Button A: X\+(\d+), Y\+(\d+)\sButton B: X\+(\d+), Y\+(\d+)\sPrize: X=(\d+), Y=(\d+)` + re := regexp.MustCompile(pattern) + for _, machine := range machines { + matches := re.FindStringSubmatch(machine) + a := utils.MustAtoi(matches[1]) + b := utils.MustAtoi(matches[2]) + c := utils.MustAtoi(matches[3]) + d := utils.MustAtoi(matches[4]) + X := utils.MustAtoi(matches[5]) + 10000000000000 + Y := utils.MustAtoi(matches[6]) + 10000000000000 +// fmt.Println(matches) + B := (Y*a - X*b)/(a*d - c*b) + A := (X - c*B)/a +// fmt.Printf("A: %d B: %d\n", A, B) + if (A*a + B*c == X && A*b + B*d == Y) { + val += A*3 + B + } + } + return val +} \ No newline at end of file diff --git a/2024/go/day13/day13_test.go b/2024/go/day13/day13_test.go new file mode 100644 index 0000000..5778833 --- /dev/null +++ b/2024/go/day13/day13_test.go @@ -0,0 +1,45 @@ +package day13 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +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`) + require.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`) + require.Equal(t, 480, r) +} diff --git a/2024/go/day13/input.txt b/2024/go/day13/input.txt new file mode 100644 index 0000000..3b53baf --- /dev/null +++ b/2024/go/day13/input.txt @@ -0,0 +1,1279 @@ +Button A: X+17, Y+68 +Button B: X+62, Y+15 +Prize: X=4507, Y=17764 + +Button A: X+19, Y+95 +Button B: X+59, Y+23 +Prize: X=6550, Y=10174 + +Button A: X+20, Y+58 +Button B: X+60, Y+11 +Prize: X=3140, Y=4691 + +Button A: X+92, Y+31 +Button B: X+49, Y+87 +Prize: X=6599, Y=2717 + +Button A: X+46, Y+72 +Button B: X+29, Y+12 +Prize: X=18754, Y=13304 + +Button A: X+42, Y+33 +Button B: X+19, Y+81 +Prize: X=3531, Y=6144 + +Button A: X+80, Y+13 +Button B: X+20, Y+75 +Prize: X=1860, Y=3818 + +Button A: X+79, Y+14 +Button B: X+56, Y+66 +Prize: X=6740, Y=3830 + +Button A: X+18, Y+85 +Button B: X+70, Y+36 +Prize: X=5358, Y=5861 + +Button A: X+42, Y+44 +Button B: X+52, Y+14 +Prize: X=6310, Y=4870 + +Button A: X+56, Y+90 +Button B: X+88, Y+41 +Prize: X=9208, Y=8572 + +Button A: X+95, Y+67 +Button B: X+13, Y+71 +Prize: X=3065, Y=6799 + +Button A: X+70, Y+22 +Button B: X+13, Y+57 +Prize: X=17469, Y=5153 + +Button A: X+36, Y+65 +Button B: X+79, Y+27 +Prize: X=5764, Y=4394 + +Button A: X+20, Y+46 +Button B: X+67, Y+29 +Prize: X=4637, Y=10139 + +Button A: X+47, Y+72 +Button B: X+42, Y+20 +Prize: X=1495, Y=10984 + +Button A: X+37, Y+96 +Button B: X+70, Y+53 +Prize: X=3563, Y=6029 + +Button A: X+20, Y+59 +Button B: X+62, Y+13 +Prize: X=5550, Y=18133 + +Button A: X+16, Y+52 +Button B: X+70, Y+61 +Prize: X=2400, Y=5136 + +Button A: X+70, Y+32 +Button B: X+22, Y+53 +Prize: X=320, Y=18668 + +Button A: X+47, Y+78 +Button B: X+78, Y+17 +Prize: X=6317, Y=6323 + +Button A: X+48, Y+33 +Button B: X+20, Y+89 +Prize: X=4296, Y=7017 + +Button A: X+17, Y+53 +Button B: X+43, Y+14 +Prize: X=19634, Y=5590 + +Button A: X+41, Y+95 +Button B: X+78, Y+30 +Prize: X=6816, Y=6900 + +Button A: X+14, Y+75 +Button B: X+65, Y+12 +Prize: X=10103, Y=12239 + +Button A: X+84, Y+69 +Button B: X+23, Y+95 +Prize: X=6178, Y=11620 + +Button A: X+57, Y+88 +Button B: X+70, Y+33 +Prize: X=4926, Y=6479 + +Button A: X+84, Y+34 +Button B: X+29, Y+78 +Prize: X=6138, Y=2882 + +Button A: X+32, Y+60 +Button B: X+62, Y+29 +Prize: X=13264, Y=10848 + +Button A: X+81, Y+69 +Button B: X+13, Y+61 +Prize: X=7893, Y=11217 + +Button A: X+98, Y+12 +Button B: X+85, Y+85 +Prize: X=8352, Y=3708 + +Button A: X+22, Y+91 +Button B: X+73, Y+39 +Prize: X=1457, Y=4186 + +Button A: X+38, Y+56 +Button B: X+97, Y+16 +Prize: X=9339, Y=3480 + +Button A: X+46, Y+13 +Button B: X+36, Y+71 +Prize: X=14918, Y=17793 + +Button A: X+27, Y+74 +Button B: X+64, Y+13 +Prize: X=11637, Y=3584 + +Button A: X+18, Y+58 +Button B: X+35, Y+16 +Prize: X=13544, Y=2948 + +Button A: X+32, Y+99 +Button B: X+99, Y+16 +Prize: X=7159, Y=4441 + +Button A: X+86, Y+49 +Button B: X+12, Y+49 +Prize: X=13188, Y=6269 + +Button A: X+19, Y+72 +Button B: X+37, Y+27 +Prize: X=1001, Y=3114 + +Button A: X+80, Y+39 +Button B: X+36, Y+55 +Prize: X=3848, Y=4797 + +Button A: X+32, Y+77 +Button B: X+82, Y+21 +Prize: X=4120, Y=4977 + +Button A: X+41, Y+64 +Button B: X+41, Y+16 +Prize: X=1829, Y=5360 + +Button A: X+67, Y+45 +Button B: X+13, Y+29 +Prize: X=19806, Y=5416 + +Button A: X+84, Y+13 +Button B: X+37, Y+55 +Prize: X=2852, Y=3792 + +Button A: X+70, Y+37 +Button B: X+21, Y+52 +Prize: X=8089, Y=10953 + +Button A: X+16, Y+57 +Button B: X+81, Y+38 +Prize: X=18875, Y=17714 + +Button A: X+91, Y+87 +Button B: X+24, Y+97 +Prize: X=3019, Y=5182 + +Button A: X+48, Y+60 +Button B: X+75, Y+17 +Prize: X=3267, Y=937 + +Button A: X+78, Y+26 +Button B: X+54, Y+95 +Prize: X=10638, Y=9706 + +Button A: X+21, Y+90 +Button B: X+65, Y+18 +Prize: X=5264, Y=4320 + +Button A: X+14, Y+58 +Button B: X+41, Y+33 +Prize: X=931, Y=983 + +Button A: X+22, Y+45 +Button B: X+55, Y+23 +Prize: X=18987, Y=18336 + +Button A: X+24, Y+61 +Button B: X+75, Y+29 +Prize: X=5127, Y=5758 + +Button A: X+49, Y+84 +Button B: X+38, Y+11 +Prize: X=3463, Y=3446 + +Button A: X+32, Y+75 +Button B: X+54, Y+11 +Prize: X=10780, Y=933 + +Button A: X+18, Y+84 +Button B: X+75, Y+31 +Prize: X=2577, Y=2137 + +Button A: X+16, Y+53 +Button B: X+66, Y+24 +Prize: X=12502, Y=7650 + +Button A: X+46, Y+75 +Button B: X+46, Y+20 +Prize: X=7598, Y=5780 + +Button A: X+97, Y+57 +Button B: X+40, Y+75 +Prize: X=6896, Y=6936 + +Button A: X+87, Y+49 +Button B: X+17, Y+61 +Prize: X=2245, Y=5687 + +Button A: X+89, Y+43 +Button B: X+38, Y+88 +Prize: X=8665, Y=7181 + +Button A: X+39, Y+94 +Button B: X+34, Y+26 +Prize: X=2237, Y=5112 + +Button A: X+57, Y+12 +Button B: X+40, Y+71 +Prize: X=5110, Y=6395 + +Button A: X+92, Y+13 +Button B: X+29, Y+88 +Prize: X=6278, Y=4411 + +Button A: X+94, Y+81 +Button B: X+13, Y+64 +Prize: X=3211, Y=5882 + +Button A: X+49, Y+34 +Button B: X+14, Y+65 +Prize: X=1939, Y=3778 + +Button A: X+32, Y+73 +Button B: X+50, Y+12 +Prize: X=12774, Y=12247 + +Button A: X+34, Y+97 +Button B: X+78, Y+59 +Prize: X=1364, Y=1602 + +Button A: X+13, Y+44 +Button B: X+70, Y+41 +Prize: X=13681, Y=7491 + +Button A: X+72, Y+44 +Button B: X+13, Y+56 +Prize: X=1078, Y=1716 + +Button A: X+56, Y+30 +Button B: X+27, Y+58 +Prize: X=3425, Y=5100 + +Button A: X+99, Y+18 +Button B: X+40, Y+83 +Prize: X=9389, Y=6175 + +Button A: X+44, Y+14 +Button B: X+17, Y+66 +Prize: X=7836, Y=16974 + +Button A: X+16, Y+58 +Button B: X+79, Y+29 +Prize: X=1201, Y=18041 + +Button A: X+60, Y+19 +Button B: X+52, Y+73 +Prize: X=5560, Y=5718 + +Button A: X+13, Y+51 +Button B: X+69, Y+26 +Prize: X=7423, Y=7244 + +Button A: X+40, Y+14 +Button B: X+42, Y+60 +Prize: X=6320, Y=5836 + +Button A: X+73, Y+29 +Button B: X+20, Y+54 +Prize: X=12274, Y=12544 + +Button A: X+12, Y+64 +Button B: X+89, Y+95 +Prize: X=8072, Y=9640 + +Button A: X+26, Y+49 +Button B: X+70, Y+26 +Prize: X=2276, Y=3442 + +Button A: X+68, Y+47 +Button B: X+29, Y+69 +Prize: X=7480, Y=8499 + +Button A: X+13, Y+28 +Button B: X+86, Y+21 +Prize: X=1826, Y=1141 + +Button A: X+97, Y+85 +Button B: X+25, Y+88 +Prize: X=5021, Y=6647 + +Button A: X+24, Y+50 +Button B: X+85, Y+17 +Prize: X=1952, Y=2786 + +Button A: X+21, Y+71 +Button B: X+59, Y+21 +Prize: X=18503, Y=12693 + +Button A: X+94, Y+58 +Button B: X+42, Y+85 +Prize: X=12332, Y=12395 + +Button A: X+93, Y+49 +Button B: X+13, Y+40 +Prize: X=9332, Y=7370 + +Button A: X+58, Y+44 +Button B: X+32, Y+84 +Prize: X=6696, Y=10216 + +Button A: X+18, Y+77 +Button B: X+56, Y+51 +Prize: X=2952, Y=5840 + +Button A: X+13, Y+76 +Button B: X+46, Y+11 +Prize: X=14558, Y=6711 + +Button A: X+46, Y+20 +Button B: X+45, Y+70 +Prize: X=6149, Y=5750 + +Button A: X+92, Y+39 +Button B: X+54, Y+97 +Prize: X=10056, Y=10488 + +Button A: X+25, Y+48 +Button B: X+80, Y+50 +Prize: X=2260, Y=1542 + +Button A: X+12, Y+52 +Button B: X+39, Y+20 +Prize: X=2225, Y=10452 + +Button A: X+25, Y+62 +Button B: X+42, Y+15 +Prize: X=2596, Y=12552 + +Button A: X+11, Y+39 +Button B: X+67, Y+17 +Prize: X=2192, Y=12338 + +Button A: X+90, Y+59 +Button B: X+19, Y+57 +Prize: X=5277, Y=7602 + +Button A: X+50, Y+34 +Button B: X+33, Y+80 +Prize: X=1245, Y=1710 + +Button A: X+11, Y+63 +Button B: X+83, Y+12 +Prize: X=4173, Y=15554 + +Button A: X+52, Y+97 +Button B: X+91, Y+13 +Prize: X=13091, Y=10469 + +Button A: X+23, Y+57 +Button B: X+69, Y+36 +Prize: X=8771, Y=6614 + +Button A: X+21, Y+40 +Button B: X+67, Y+40 +Prize: X=15512, Y=5120 + +Button A: X+20, Y+47 +Button B: X+66, Y+22 +Prize: X=9426, Y=16922 + +Button A: X+15, Y+37 +Button B: X+49, Y+14 +Prize: X=2334, Y=3915 + +Button A: X+25, Y+51 +Button B: X+44, Y+17 +Prize: X=4718, Y=4386 + +Button A: X+77, Y+30 +Button B: X+16, Y+78 +Prize: X=7755, Y=7758 + +Button A: X+55, Y+87 +Button B: X+64, Y+15 +Prize: X=10939, Y=9456 + +Button A: X+64, Y+17 +Button B: X+24, Y+78 +Prize: X=312, Y=3577 + +Button A: X+15, Y+68 +Button B: X+73, Y+12 +Prize: X=708, Y=6800 + +Button A: X+71, Y+66 +Button B: X+12, Y+42 +Prize: X=7143, Y=8028 + +Button A: X+70, Y+24 +Button B: X+22, Y+66 +Prize: X=1930, Y=10706 + +Button A: X+52, Y+28 +Button B: X+29, Y+47 +Prize: X=19597, Y=3007 + +Button A: X+11, Y+24 +Button B: X+51, Y+24 +Prize: X=2230, Y=1200 + +Button A: X+23, Y+80 +Button B: X+55, Y+15 +Prize: X=2251, Y=1130 + +Button A: X+20, Y+42 +Button B: X+75, Y+48 +Prize: X=15760, Y=14762 + +Button A: X+63, Y+12 +Button B: X+32, Y+77 +Prize: X=1622, Y=1319 + +Button A: X+11, Y+20 +Button B: X+54, Y+22 +Prize: X=10462, Y=1050 + +Button A: X+24, Y+72 +Button B: X+53, Y+12 +Prize: X=5360, Y=10304 + +Button A: X+99, Y+52 +Button B: X+12, Y+52 +Prize: X=8937, Y=5928 + +Button A: X+62, Y+25 +Button B: X+57, Y+95 +Prize: X=10249, Y=10110 + +Button A: X+40, Y+99 +Button B: X+91, Y+13 +Prize: X=3050, Y=1182 + +Button A: X+26, Y+60 +Button B: X+71, Y+38 +Prize: X=9324, Y=9448 + +Button A: X+60, Y+88 +Button B: X+73, Y+32 +Prize: X=8559, Y=7824 + +Button A: X+59, Y+21 +Button B: X+59, Y+75 +Prize: X=4602, Y=2070 + +Button A: X+14, Y+48 +Button B: X+47, Y+19 +Prize: X=4601, Y=3977 + +Button A: X+64, Y+22 +Button B: X+29, Y+65 +Prize: X=12970, Y=19186 + +Button A: X+28, Y+19 +Button B: X+18, Y+43 +Prize: X=2002, Y=2005 + +Button A: X+24, Y+17 +Button B: X+12, Y+30 +Prize: X=14612, Y=12593 + +Button A: X+34, Y+54 +Button B: X+88, Y+12 +Prize: X=9576, Y=2688 + +Button A: X+22, Y+35 +Button B: X+51, Y+17 +Prize: X=6367, Y=4806 + +Button A: X+28, Y+53 +Button B: X+91, Y+44 +Prize: X=5194, Y=3932 + +Button A: X+31, Y+11 +Button B: X+30, Y+69 +Prize: X=14791, Y=1482 + +Button A: X+46, Y+94 +Button B: X+26, Y+17 +Prize: X=3028, Y=3514 + +Button A: X+79, Y+29 +Button B: X+13, Y+52 +Prize: X=16594, Y=6031 + +Button A: X+76, Y+36 +Button B: X+32, Y+80 +Prize: X=5908, Y=3836 + +Button A: X+20, Y+41 +Button B: X+59, Y+28 +Prize: X=4243, Y=10632 + +Button A: X+72, Y+32 +Button B: X+22, Y+58 +Prize: X=15972, Y=11444 + +Button A: X+53, Y+28 +Button B: X+28, Y+58 +Prize: X=3946, Y=10646 + +Button A: X+19, Y+69 +Button B: X+61, Y+22 +Prize: X=9244, Y=17018 + +Button A: X+20, Y+71 +Button B: X+64, Y+18 +Prize: X=17356, Y=9567 + +Button A: X+28, Y+89 +Button B: X+69, Y+50 +Prize: X=5623, Y=5174 + +Button A: X+62, Y+17 +Button B: X+11, Y+73 +Prize: X=1851, Y=10184 + +Button A: X+60, Y+22 +Button B: X+18, Y+38 +Prize: X=3728, Y=6252 + +Button A: X+58, Y+32 +Button B: X+28, Y+94 +Prize: X=5286, Y=6844 + +Button A: X+53, Y+80 +Button B: X+58, Y+14 +Prize: X=8236, Y=5886 + +Button A: X+15, Y+49 +Button B: X+46, Y+18 +Prize: X=11211, Y=18229 + +Button A: X+21, Y+96 +Button B: X+27, Y+29 +Prize: X=2448, Y=7697 + +Button A: X+42, Y+85 +Button B: X+93, Y+37 +Prize: X=5364, Y=5412 + +Button A: X+56, Y+32 +Button B: X+16, Y+31 +Prize: X=3368, Y=3389 + +Button A: X+14, Y+66 +Button B: X+81, Y+66 +Prize: X=7042, Y=11088 + +Button A: X+12, Y+54 +Button B: X+76, Y+37 +Prize: X=5280, Y=15420 + +Button A: X+37, Y+24 +Button B: X+12, Y+44 +Prize: X=4537, Y=5804 + +Button A: X+55, Y+14 +Button B: X+24, Y+85 +Prize: X=4477, Y=3743 + +Button A: X+70, Y+92 +Button B: X+73, Y+17 +Prize: X=5044, Y=2840 + +Button A: X+13, Y+51 +Button B: X+40, Y+38 +Prize: X=2505, Y=5665 + +Button A: X+63, Y+24 +Button B: X+22, Y+55 +Prize: X=6942, Y=6141 + +Button A: X+30, Y+75 +Button B: X+62, Y+22 +Prize: X=14496, Y=6211 + +Button A: X+87, Y+43 +Button B: X+30, Y+75 +Prize: X=3153, Y=6312 + +Button A: X+77, Y+37 +Button B: X+14, Y+45 +Prize: X=11197, Y=3283 + +Button A: X+48, Y+25 +Button B: X+49, Y+96 +Prize: X=1254, Y=1076 + +Button A: X+14, Y+77 +Button B: X+53, Y+55 +Prize: X=1972, Y=5170 + +Button A: X+32, Y+19 +Button B: X+18, Y+39 +Prize: X=3720, Y=3681 + +Button A: X+36, Y+13 +Button B: X+39, Y+75 +Prize: X=5181, Y=6196 + +Button A: X+34, Y+23 +Button B: X+11, Y+35 +Prize: X=14981, Y=13421 + +Button A: X+83, Y+28 +Button B: X+11, Y+47 +Prize: X=5038, Y=15145 + +Button A: X+44, Y+98 +Button B: X+78, Y+26 +Prize: X=7832, Y=4444 + +Button A: X+18, Y+11 +Button B: X+19, Y+44 +Prize: X=15969, Y=15082 + +Button A: X+14, Y+81 +Button B: X+39, Y+34 +Prize: X=1722, Y=1914 + +Button A: X+29, Y+94 +Button B: X+75, Y+55 +Prize: X=9696, Y=14311 + +Button A: X+41, Y+79 +Button B: X+58, Y+19 +Prize: X=4374, Y=5367 + +Button A: X+47, Y+14 +Button B: X+35, Y+66 +Prize: X=17301, Y=1534 + +Button A: X+68, Y+29 +Button B: X+21, Y+98 +Prize: X=6996, Y=5833 + +Button A: X+16, Y+61 +Button B: X+72, Y+15 +Prize: X=10896, Y=9927 + +Button A: X+69, Y+16 +Button B: X+17, Y+99 +Prize: X=4411, Y=2924 + +Button A: X+16, Y+73 +Button B: X+43, Y+42 +Prize: X=2463, Y=4299 + +Button A: X+54, Y+16 +Button B: X+21, Y+43 +Prize: X=4187, Y=10273 + +Button A: X+49, Y+13 +Button B: X+49, Y+83 +Prize: X=6076, Y=4902 + +Button A: X+40, Y+19 +Button B: X+17, Y+31 +Prize: X=18121, Y=6893 + +Button A: X+22, Y+89 +Button B: X+62, Y+33 +Prize: X=3470, Y=2929 + +Button A: X+24, Y+51 +Button B: X+51, Y+11 +Prize: X=13013, Y=7760 + +Button A: X+40, Y+72 +Button B: X+94, Y+29 +Prize: X=10730, Y=8799 + +Button A: X+85, Y+18 +Button B: X+64, Y+86 +Prize: X=3858, Y=4222 + +Button A: X+99, Y+11 +Button B: X+18, Y+71 +Prize: X=1530, Y=722 + +Button A: X+69, Y+12 +Button B: X+93, Y+98 +Prize: X=11136, Y=9792 + +Button A: X+95, Y+75 +Button B: X+21, Y+96 +Prize: X=917, Y=1677 + +Button A: X+22, Y+57 +Button B: X+46, Y+17 +Prize: X=7332, Y=17866 + +Button A: X+55, Y+19 +Button B: X+27, Y+67 +Prize: X=8606, Y=17118 + +Button A: X+42, Y+92 +Button B: X+77, Y+50 +Prize: X=3416, Y=2736 + +Button A: X+13, Y+64 +Button B: X+92, Y+86 +Prize: X=5175, Y=6030 + +Button A: X+56, Y+18 +Button B: X+20, Y+46 +Prize: X=4068, Y=5212 + +Button A: X+78, Y+11 +Button B: X+19, Y+79 +Prize: X=6081, Y=10602 + +Button A: X+19, Y+87 +Button B: X+84, Y+35 +Prize: X=3342, Y=3765 + +Button A: X+57, Y+33 +Button B: X+19, Y+43 +Prize: X=8062, Y=8686 + +Button A: X+93, Y+60 +Button B: X+14, Y+72 +Prize: X=1229, Y=2556 + +Button A: X+55, Y+24 +Button B: X+14, Y+94 +Prize: X=1871, Y=6002 + +Button A: X+13, Y+19 +Button B: X+37, Y+15 +Prize: X=11560, Y=7340 + +Button A: X+97, Y+92 +Button B: X+68, Y+14 +Prize: X=12918, Y=8566 + +Button A: X+64, Y+16 +Button B: X+19, Y+58 +Prize: X=15227, Y=15866 + +Button A: X+12, Y+62 +Button B: X+63, Y+17 +Prize: X=11813, Y=12953 + +Button A: X+72, Y+28 +Button B: X+20, Y+52 +Prize: X=1284, Y=4264 + +Button A: X+76, Y+17 +Button B: X+23, Y+38 +Prize: X=8199, Y=4101 + +Button A: X+84, Y+38 +Button B: X+17, Y+47 +Prize: X=7592, Y=6422 + +Button A: X+76, Y+26 +Button B: X+33, Y+61 +Prize: X=7100, Y=3622 + +Button A: X+53, Y+45 +Button B: X+14, Y+48 +Prize: X=3495, Y=4737 + +Button A: X+14, Y+57 +Button B: X+95, Y+13 +Prize: X=2193, Y=4817 + +Button A: X+91, Y+24 +Button B: X+39, Y+44 +Prize: X=8905, Y=4776 + +Button A: X+36, Y+95 +Button B: X+54, Y+14 +Prize: X=6570, Y=8985 + +Button A: X+47, Y+26 +Button B: X+27, Y+45 +Prize: X=9856, Y=1870 + +Button A: X+70, Y+23 +Button B: X+33, Y+80 +Prize: X=6705, Y=3932 + +Button A: X+93, Y+22 +Button B: X+72, Y+97 +Prize: X=13317, Y=8748 + +Button A: X+68, Y+56 +Button B: X+12, Y+82 +Prize: X=3792, Y=5070 + +Button A: X+91, Y+19 +Button B: X+50, Y+58 +Prize: X=7149, Y=4917 + +Button A: X+17, Y+85 +Button B: X+62, Y+56 +Prize: X=6472, Y=11278 + +Button A: X+71, Y+18 +Button B: X+16, Y+75 +Prize: X=7574, Y=7170 + +Button A: X+13, Y+78 +Button B: X+64, Y+76 +Prize: X=3350, Y=6856 + +Button A: X+65, Y+14 +Button B: X+16, Y+42 +Prize: X=8942, Y=19674 + +Button A: X+37, Y+19 +Button B: X+20, Y+33 +Prize: X=15445, Y=3074 + +Button A: X+12, Y+40 +Button B: X+76, Y+26 +Prize: X=1848, Y=19728 + +Button A: X+86, Y+16 +Button B: X+11, Y+96 +Prize: X=7116, Y=9216 + +Button A: X+62, Y+14 +Button B: X+49, Y+69 +Prize: X=5138, Y=6722 + +Button A: X+44, Y+63 +Button B: X+42, Y+17 +Prize: X=10920, Y=3470 + +Button A: X+51, Y+26 +Button B: X+35, Y+55 +Prize: X=11198, Y=1063 + +Button A: X+85, Y+11 +Button B: X+11, Y+72 +Prize: X=507, Y=16765 + +Button A: X+50, Y+17 +Button B: X+28, Y+55 +Prize: X=2500, Y=4978 + +Button A: X+17, Y+41 +Button B: X+60, Y+38 +Prize: X=11731, Y=5537 + +Button A: X+31, Y+41 +Button B: X+91, Y+36 +Prize: X=9013, Y=6353 + +Button A: X+62, Y+21 +Button B: X+15, Y+59 +Prize: X=1794, Y=13288 + +Button A: X+41, Y+14 +Button B: X+26, Y+49 +Prize: X=7670, Y=3910 + +Button A: X+24, Y+99 +Button B: X+95, Y+54 +Prize: X=8639, Y=10971 + +Button A: X+13, Y+80 +Button B: X+93, Y+52 +Prize: X=4898, Y=7248 + +Button A: X+97, Y+73 +Button B: X+31, Y+83 +Prize: X=6926, Y=10702 + +Button A: X+21, Y+86 +Button B: X+90, Y+65 +Prize: X=7887, Y=8317 + +Button A: X+37, Y+42 +Button B: X+83, Y+27 +Prize: X=7887, Y=3105 + +Button A: X+19, Y+68 +Button B: X+67, Y+25 +Prize: X=3042, Y=7375 + +Button A: X+30, Y+51 +Button B: X+80, Y+15 +Prize: X=2140, Y=2670 + +Button A: X+87, Y+22 +Button B: X+49, Y+91 +Prize: X=6983, Y=3338 + +Button A: X+74, Y+42 +Button B: X+14, Y+40 +Prize: X=8560, Y=1180 + +Button A: X+98, Y+11 +Button B: X+53, Y+87 +Prize: X=4734, Y=3125 + +Button A: X+36, Y+60 +Button B: X+94, Y+15 +Prize: X=6512, Y=2070 + +Button A: X+36, Y+11 +Button B: X+33, Y+57 +Prize: X=15008, Y=16375 + +Button A: X+79, Y+51 +Button B: X+18, Y+46 +Prize: X=12284, Y=18892 + +Button A: X+25, Y+63 +Button B: X+66, Y+18 +Prize: X=12741, Y=16919 + +Button A: X+11, Y+54 +Button B: X+76, Y+33 +Prize: X=4920, Y=6683 + +Button A: X+23, Y+71 +Button B: X+55, Y+17 +Prize: X=15713, Y=18075 + +Button A: X+92, Y+85 +Button B: X+72, Y+14 +Prize: X=11088, Y=6988 + +Button A: X+90, Y+31 +Button B: X+15, Y+41 +Prize: X=8280, Y=5217 + +Button A: X+16, Y+52 +Button B: X+72, Y+24 +Prize: X=15496, Y=13792 + +Button A: X+17, Y+24 +Button B: X+76, Y+16 +Prize: X=8548, Y=3760 + +Button A: X+21, Y+42 +Button B: X+56, Y+20 +Prize: X=3955, Y=3034 + +Button A: X+57, Y+15 +Button B: X+16, Y+20 +Prize: X=3915, Y=1125 + +Button A: X+64, Y+16 +Button B: X+25, Y+70 +Prize: X=12199, Y=10666 + +Button A: X+13, Y+57 +Button B: X+36, Y+13 +Prize: X=12196, Y=1889 + +Button A: X+50, Y+70 +Button B: X+29, Y+13 +Prize: X=19005, Y=11065 + +Button A: X+58, Y+87 +Button B: X+76, Y+34 +Prize: X=6738, Y=7227 + +Button A: X+79, Y+62 +Button B: X+24, Y+88 +Prize: X=2126, Y=1876 + +Button A: X+29, Y+89 +Button B: X+70, Y+22 +Prize: X=7399, Y=4003 + +Button A: X+61, Y+36 +Button B: X+12, Y+47 +Prize: X=7624, Y=15339 + +Button A: X+16, Y+27 +Button B: X+43, Y+14 +Prize: X=15461, Y=6925 + +Button A: X+53, Y+14 +Button B: X+17, Y+53 +Prize: X=1833, Y=2085 + +Button A: X+12, Y+46 +Button B: X+76, Y+33 +Prize: X=17232, Y=7631 + +Button A: X+23, Y+15 +Button B: X+11, Y+32 +Prize: X=2079, Y=2051 + +Button A: X+14, Y+61 +Button B: X+79, Y+31 +Prize: X=19076, Y=19749 + +Button A: X+67, Y+97 +Button B: X+95, Y+39 +Prize: X=12736, Y=11344 + +Button A: X+14, Y+23 +Button B: X+35, Y+11 +Prize: X=6444, Y=17109 + +Button A: X+14, Y+40 +Button B: X+32, Y+17 +Prize: X=5020, Y=6220 + +Button A: X+53, Y+14 +Button B: X+14, Y+42 +Prize: X=17332, Y=3966 + +Button A: X+43, Y+16 +Button B: X+12, Y+25 +Prize: X=2577, Y=12758 + +Button A: X+26, Y+12 +Button B: X+24, Y+47 +Prize: X=17828, Y=3061 + +Button A: X+99, Y+66 +Button B: X+43, Y+91 +Prize: X=6135, Y=8391 + +Button A: X+13, Y+41 +Button B: X+63, Y+12 +Prize: X=6296, Y=12458 + +Button A: X+18, Y+42 +Button B: X+88, Y+22 +Prize: X=2486, Y=1034 + +Button A: X+35, Y+80 +Button B: X+52, Y+37 +Prize: X=5416, Y=8041 + +Button A: X+81, Y+32 +Button B: X+21, Y+50 +Prize: X=3750, Y=1690 + +Button A: X+90, Y+27 +Button B: X+17, Y+82 +Prize: X=3355, Y=6005 + +Button A: X+35, Y+14 +Button B: X+35, Y+48 +Prize: X=13850, Y=6312 + +Button A: X+94, Y+82 +Button B: X+14, Y+41 +Prize: X=4962, Y=6027 + +Button A: X+18, Y+86 +Button B: X+36, Y+31 +Prize: X=2826, Y=8849 + +Button A: X+24, Y+42 +Button B: X+57, Y+26 +Prize: X=4289, Y=16742 + +Button A: X+15, Y+59 +Button B: X+76, Y+27 +Prize: X=12775, Y=18008 + +Button A: X+64, Y+27 +Button B: X+20, Y+65 +Prize: X=19348, Y=11874 + +Button A: X+27, Y+55 +Button B: X+85, Y+14 +Prize: X=2653, Y=1903 + +Button A: X+90, Y+12 +Button B: X+47, Y+90 +Prize: X=681, Y=342 + +Button A: X+13, Y+29 +Button B: X+18, Y+13 +Prize: X=2527, Y=8550 + +Button A: X+71, Y+34 +Button B: X+25, Y+59 +Prize: X=10411, Y=6369 + +Button A: X+78, Y+26 +Button B: X+61, Y+98 +Prize: X=7284, Y=3360 + +Button A: X+49, Y+78 +Button B: X+47, Y+11 +Prize: X=8090, Y=8347 + +Button A: X+65, Y+29 +Button B: X+23, Y+59 +Prize: X=3886, Y=2806 + +Button A: X+13, Y+58 +Button B: X+82, Y+33 +Prize: X=17126, Y=1844 + +Button A: X+15, Y+46 +Button B: X+52, Y+29 +Prize: X=14512, Y=8557 + +Button A: X+51, Y+19 +Button B: X+17, Y+57 +Prize: X=4573, Y=2565 + +Button A: X+16, Y+84 +Button B: X+43, Y+29 +Prize: X=2326, Y=2374 + +Button A: X+21, Y+80 +Button B: X+52, Y+12 +Prize: X=2872, Y=11268 + +Button A: X+16, Y+56 +Button B: X+42, Y+20 +Prize: X=1218, Y=17444 + +Button A: X+43, Y+14 +Button B: X+25, Y+38 +Prize: X=2364, Y=11092 + +Button A: X+34, Y+16 +Button B: X+42, Y+65 +Prize: X=19300, Y=16358 + +Button A: X+12, Y+47 +Button B: X+68, Y+29 +Prize: X=17592, Y=3390 + +Button A: X+38, Y+11 +Button B: X+55, Y+70 +Prize: X=4021, Y=1867 + +Button A: X+33, Y+13 +Button B: X+14, Y+52 +Prize: X=8642, Y=16058 + +Button A: X+74, Y+27 +Button B: X+12, Y+54 +Prize: X=5318, Y=5265 + +Button A: X+28, Y+44 +Button B: X+38, Y+11 +Prize: X=11126, Y=12365 + +Button A: X+34, Y+56 +Button B: X+44, Y+20 +Prize: X=14102, Y=5556 + +Button A: X+75, Y+85 +Button B: X+53, Y+16 +Prize: X=6607, Y=5549 + +Button A: X+81, Y+20 +Button B: X+35, Y+57 +Prize: X=2908, Y=3281 + +Button A: X+13, Y+30 +Button B: X+41, Y+19 +Prize: X=10899, Y=10340 + +Button A: X+11, Y+25 +Button B: X+64, Y+22 +Prize: X=18766, Y=8966 + +Button A: X+57, Y+15 +Button B: X+17, Y+42 +Prize: X=14691, Y=8777 + +Button A: X+19, Y+29 +Button B: X+72, Y+16 +Prize: X=7014, Y=3194 + +Button A: X+22, Y+57 +Button B: X+44, Y+21 +Prize: X=15632, Y=19217 + +Button A: X+48, Y+94 +Button B: X+86, Y+37 +Prize: X=11514, Y=11115 + +Button A: X+11, Y+53 +Button B: X+57, Y+22 +Prize: X=8712, Y=5709 + +Button A: X+92, Y+23 +Button B: X+12, Y+81 +Prize: X=7868, Y=7661 + +Button A: X+52, Y+79 +Button B: X+63, Y+22 +Prize: X=5604, Y=2322 + +Button A: X+20, Y+51 +Button B: X+95, Y+41 +Prize: X=9500, Y=8125 + +Button A: X+24, Y+85 +Button B: X+68, Y+46 +Prize: X=7808, Y=9339 + +Button A: X+16, Y+58 +Button B: X+83, Y+72 +Prize: X=2007, Y=4300 + +Button A: X+86, Y+16 +Button B: X+31, Y+75 +Prize: X=7780, Y=5186 + +Button A: X+21, Y+59 +Button B: X+89, Y+41 +Prize: X=2578, Y=3062 + +Button A: X+62, Y+13 +Button B: X+34, Y+86 +Prize: X=5006, Y=6334 + +Button A: X+75, Y+86 +Button B: X+80, Y+11 +Prize: X=6665, Y=1749 + +Button A: X+20, Y+55 +Button B: X+59, Y+47 +Prize: X=2643, Y=3004 diff --git a/2024/go/day14/day14.go b/2024/go/day14/day14.go new file mode 100644 index 0000000..2ed2ef6 --- /dev/null +++ b/2024/go/day14/day14.go @@ -0,0 +1,149 @@ +package day14 + +import ( + "adventofcode2024/utils" + grid "adventofcode2024/utils/grid2d" + "fmt" + "regexp" + "strings" +) + +type Robot struct { + velocity [2]int +} + +const SIZE_X = 101 +const SIZE_Y = 103 + +func Part1(input string) int { + grid := grid.NewGrid(SIZE_X, SIZE_Y, []Robot{}) + pattern := `p=(-?\d+),(-?\d+) v=(-?\d+),(-?\d+)` + re := regexp.MustCompile(pattern) + lines := strings.Split(input, "\n") + for _, line := range lines { + matches := re.FindStringSubmatch(line) + fmt.Println(matches) + x := utils.MustAtoi(matches[1]) + y := utils.MustAtoi(matches[2]) + x1 := utils.MustAtoi(matches[3]) + y1 := utils.MustAtoi(matches[4]) + robots := grid.Get(x, y) + grid.Set(x, y, append(robots, Robot{velocity: [2]int{x1, y1}})) + } + fmt.Println(grid.StringWithFormatter(formatter)) + ng := ticks(grid, 100) + fmt.Println(ng.StringWithFormatter(formatter)) + + return get_saftey(ng) +} + +func Part2(input string) int { + min_safe := 240096000 + min_i := 0 + max_safe := 0 + max_i := 0 + grid := grid.NewGrid(SIZE_X, SIZE_Y, []Robot{}) + pattern := `p=(-?\d+),(-?\d+) v=(-?\d+),(-?\d+)` + re := regexp.MustCompile(pattern) + lines := strings.Split(input, "\n") + for _, line := range lines { + matches := re.FindStringSubmatch(line) + fmt.Println(matches) + x := utils.MustAtoi(matches[1]) + y := utils.MustAtoi(matches[2]) + x1 := utils.MustAtoi(matches[3]) + y1 := utils.MustAtoi(matches[4]) + robots := grid.Get(x, y) + grid.Set(x, y, append(robots, Robot{velocity: [2]int{x1, y1}})) + } + fmt.Println(grid.StringWithFormatter(formatter)) + max_safe = get_saftey(grid) + for i:=0;i<7380;i++ { + ng := ticks(grid, 1) + safe := get_saftey(ng) + if safe > max_safe { + max_safe = safe + max_i = i + } + if safe < min_safe { + min_safe = safe + min_i = i + } + grid = ng + } + for i:=7380;i<7390;i++{ + ng := ticks(grid, 1) + fmt.Println(ng.StringWithFormatter(formatter)) + grid = ng + } + fmt.Println(grid.StringWithFormatter(formatter)) + fmt.Printf("max_safe: %d max_i: %d min_safe: %d min_i:%d", max_safe, max_i, min_safe, min_i) + return get_saftey(grid) +} + +func formatter(robots []Robot, x int, y int) string { + if len(robots) == 0 { + return " " + } + return "*" +} + +func ticks(g *grid.Grid[[]Robot], seconds int) *grid.Grid[[]Robot] { + ng := grid.NewGrid(SIZE_X, SIZE_Y, []Robot{}) + for y := 0; y < g.SizeY(); y++ { + for x := 0; x < g.SizeX(); x++ { + for _, robot := range g.Get(x, y) { + nx := x + ((robot.velocity[0] * seconds) % SIZE_X) + if nx < 0 { + nx = g.SizeX() + nx + } + if nx >= g.SizeX() { + nx = nx - g.SizeX() + } + ny := y + ((robot.velocity[1] * seconds) % SIZE_Y) + if ny < 0 { + ny = g.SizeY() + ny + } + if ny >= g.SizeY() { + ny = ny - g.SizeY() + } + robots := ng.Get(nx, ny) + ng.Set(nx, ny, append(robots, robot)) + } + } + } + return ng +} + +func get_saftey(grid *grid.Grid[[]Robot]) int { + robots := 0 + val := 1 + for y := 0; y < grid.SizeY()/2; y++ { + for x := 0; x < grid.SizeX()/2; x++ { + robots += len(grid.Get(x, y)) + } + } + val *= robots + robots = 0 + for y := 0; y < grid.SizeY()/2; y++ { + for x := grid.SizeX()/2 + 1; x < grid.SizeX(); x++ { + robots += len(grid.Get(x, y)) + } + } + val *= robots + robots = 0 + for y := grid.SizeY()/2 + 1; y < grid.SizeY(); y++ { + for x := grid.SizeX()/2 + 1; x < grid.SizeX(); x++ { + robots += len(grid.Get(x, y)) + } + } + val *= robots + robots = 0 + for y := grid.SizeY()/2 + 1; y < grid.SizeY(); y++ { + for x := 0; x < grid.SizeX()/2; x++ { + robots += len(grid.Get(x, y)) + } + } + val *= robots + return val +} \ No newline at end of file diff --git a/2024/go/day14/day14_test.go b/2024/go/day14/day14_test.go new file mode 100644 index 0000000..791e1d9 --- /dev/null +++ b/2024/go/day14/day14_test.go @@ -0,0 +1,527 @@ +package day14 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +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`) + require.Equal(t, 12, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`p=80,75 v=69,72 +p=88,10 v=-28,-23 +p=79,61 v=79,59 +p=37,102 v=92,-43 +p=12,22 v=-5,-95 +p=60,13 v=-30,-42 +p=3,59 v=-96,-88 +p=85,33 v=-43,-41 +p=44,14 v=63,45 +p=6,6 v=-34,-86 +p=47,102 v=12,42 +p=36,88 v=-88,-93 +p=78,27 v=-18,52 +p=96,64 v=-62,-34 +p=49,99 v=-78,-15 +p=57,31 v=-80,21 +p=25,57 v=8,-84 +p=69,20 v=81,61 +p=80,5 v=-11,-30 +p=2,35 v=-85,77 +p=9,12 v=-4,36 +p=37,68 v=12,-69 +p=47,88 v=-8,-90 +p=72,68 v=59,-86 +p=55,38 v=-68,-94 +p=60,58 v=41,37 +p=76,87 v=-1,-18 +p=89,9 v=38,92 +p=100,67 v=17,-53 +p=83,73 v=80,32 +p=77,19 v=-54,-20 +p=10,86 v=-65,36 +p=13,88 v=-64,-84 +p=50,29 v=-17,-29 +p=79,38 v=89,-57 +p=55,57 v=-68,22 +p=71,82 v=-80,52 +p=37,83 v=-68,-43 +p=25,5 v=81,-22 +p=83,54 v=-32,-75 +p=27,95 v=-77,-55 +p=70,97 v=-72,-4 +p=3,84 v=-60,-60 +p=16,29 v=-35,99 +p=39,39 v=37,-38 +p=76,94 v=90,60 +p=18,21 v=-86,-26 +p=22,84 v=-16,66 +p=45,83 v=-40,-43 +p=35,52 v=54,3 +p=30,21 v=14,36 +p=69,61 v=69,-66 +p=52,22 v=-28,33 +p=9,21 v=-85,-73 +p=87,32 v=79,52 +p=28,85 v=-35,85 +p=32,58 v=-49,89 +p=22,75 v=85,44 +p=45,19 v=-88,61 +p=97,59 v=98,-75 +p=70,81 v=82,7 +p=97,102 v=-23,-8 +p=92,68 v=89,72 +p=24,42 v=-63,-97 +p=21,64 v=-45,-47 +p=58,3 v=-69,51 +p=33,68 v=19,-20 +p=27,6 v=-89,-21 +p=28,81 v=-67,-8 +p=59,83 v=-66,-82 +p=3,14 v=-3,-1 +p=19,65 v=15,-25 +p=57,37 v=53,-29 +p=36,84 v=-4,-84 +p=55,96 v=82,-21 +p=68,101 v=51,51 +p=68,8 v=-90,-30 +p=78,51 v=-51,-63 +p=4,55 v=-63,97 +p=100,60 v=76,-13 +p=7,91 v=-96,-73 +p=97,17 v=-54,33 +p=85,60 v=69,-3 +p=20,39 v=96,-85 +p=24,12 v=86,-84 +p=34,7 v=-7,-36 +p=30,69 v=-67,97 +p=65,17 v=20,33 +p=39,101 v=-7,-83 +p=38,51 v=-90,-4 +p=99,61 v=-13,59 +p=30,1 v=-67,-96 +p=1,89 v=-85,-83 +p=8,1 v=68,4 +p=89,89 v=-52,85 +p=81,5 v=-55,71 +p=99,60 v=-94,-72 +p=68,70 v=-10,78 +p=81,18 v=89,-95 +p=47,61 v=-39,56 +p=91,71 v=85,59 +p=28,66 v=44,-28 +p=10,64 v=-59,-4 +p=84,10 v=-32,-11 +p=29,52 v=-37,34 +p=78,43 v=-92,12 +p=85,3 v=-71,4 +p=37,85 v=-46,-84 +p=56,21 v=21,-32 +p=17,17 v=15,17 +p=26,87 v=45,-93 +p=57,21 v=-6,40 +p=95,48 v=-33,59 +p=38,59 v=65,-72 +p=59,85 v=-50,-99 +p=17,21 v=86,-45 +p=53,3 v=-28,-46 +p=1,40 v=-54,-91 +p=61,13 v=-40,83 +p=33,35 v=-72,-96 +p=40,14 v=33,-8 +p=29,89 v=53,-59 +p=74,0 v=-22,-42 +p=12,32 v=-65,-4 +p=82,89 v=-12,20 +p=35,71 v=-40,20 +p=14,5 v=95,83 +p=46,44 v=39,92 +p=25,54 v=-66,-47 +p=91,78 v=64,53 +p=14,9 v=25,67 +p=39,29 v=-29,8 +p=20,100 v=95,51 +p=59,41 v=92,-82 +p=15,92 v=93,-73 +p=42,93 v=3,-86 +p=82,93 v=-21,-96 +p=50,9 v=12,-39 +p=81,22 v=-13,99 +p=72,81 v=-51,-93 +p=88,19 v=-72,-14 +p=8,93 v=-85,-15 +p=54,2 v=61,8 +p=44,81 v=66,41 +p=78,10 v=90,8 +p=19,53 v=68,4 +p=80,43 v=9,46 +p=11,38 v=-66,88 +p=31,3 v=4,-2 +p=49,28 v=-74,21 +p=27,15 v=54,-88 +p=96,87 v=-50,-67 +p=94,94 v=-5,-97 +p=16,89 v=73,23 +p=93,32 v=-53,93 +p=47,17 v=-29,92 +p=10,78 v=16,35 +p=55,33 v=-60,-17 +p=55,73 v=-68,-22 +p=100,62 v=17,-69 +p=67,91 v=-49,45 +p=68,53 v=-42,-41 +p=35,73 v=54,47 +p=20,63 v=-85,-12 +p=23,16 v=-87,33 +p=70,55 v=50,-16 +p=92,6 v=41,-59 +p=9,97 v=-37,47 +p=48,48 v=42,40 +p=96,37 v=-90,32 +p=66,13 v=-60,91 +p=62,46 v=-50,18 +p=11,15 v=98,77 +p=42,78 v=1,47 +p=10,40 v=15,-48 +p=88,44 v=7,-75 +p=27,53 v=-70,-9 +p=21,7 v=-56,96 +p=92,81 v=-22,69 +p=57,65 v=92,-34 +p=85,63 v=77,11 +p=92,2 v=-30,21 +p=59,16 v=73,-70 +p=16,11 v=86,-89 +p=82,16 v=80,-36 +p=41,30 v=-49,19 +p=13,6 v=14,73 +p=67,99 v=-91,51 +p=37,20 v=-65,-37 +p=85,16 v=99,-14 +p=1,39 v=-44,56 +p=37,29 v=74,5 +p=44,51 v=-18,93 +p=43,9 v=-55,-84 +p=5,10 v=-65,26 +p=51,90 v=-59,-96 +p=55,98 v=-9,23 +p=0,94 v=88,-49 +p=91,43 v=-14,-72 +p=93,43 v=-69,-94 +p=84,100 v=-12,54 +p=23,46 v=85,78 +p=79,37 v=39,-10 +p=1,23 v=99,-79 +p=73,50 v=-51,84 +p=78,58 v=-31,-16 +p=75,44 v=69,71 +p=27,5 v=-87,14 +p=95,91 v=-33,63 +p=22,94 v=-5,-37 +p=36,11 v=-5,-60 +p=18,3 v=-64,-27 +p=44,14 v=24,-92 +p=96,40 v=65,-92 +p=47,1 v=84,25 +p=93,22 v=68,-48 +p=14,32 v=-24,37 +p=99,17 v=78,-89 +p=53,36 v=10,58 +p=44,44 v=-78,-60 +p=15,28 v=-96,-20 +p=96,61 v=-81,-45 +p=58,87 v=-9,7 +p=20,43 v=84,-22 +p=50,42 v=-18,68 +p=74,23 v=-12,42 +p=12,57 v=-94,-94 +p=49,49 v=-89,40 +p=47,98 v=-67,-8 +p=84,17 v=-62,11 +p=31,6 v=-57,-42 +p=28,67 v=66,-81 +p=0,3 v=-88,-13 +p=51,76 v=82,76 +p=67,81 v=87,-14 +p=84,78 v=39,41 +p=39,74 v=72,35 +p=30,10 v=64,-77 +p=10,31 v=11,-4 +p=6,90 v=-4,76 +p=90,24 v=-2,-23 +p=8,39 v=-57,-27 +p=31,69 v=93,-25 +p=79,38 v=39,-35 +p=69,31 v=70,30 +p=1,16 v=7,73 +p=46,9 v=-99,-70 +p=53,16 v=-94,-84 +p=32,60 v=33,-69 +p=62,22 v=-99,-4 +p=66,3 v=98,20 +p=4,76 v=46,-75 +p=50,71 v=-90,22 +p=57,12 v=31,-15 +p=59,84 v=-50,-65 +p=33,0 v=76,-48 +p=58,76 v=-30,44 +p=6,69 v=6,35 +p=74,91 v=-61,-43 +p=36,92 v=-58,60 +p=2,78 v=-48,-98 +p=43,91 v=53,76 +p=34,101 v=-77,79 +p=40,44 v=-68,28 +p=71,64 v=47,-48 +p=54,7 v=84,15 +p=54,75 v=-60,-31 +p=14,40 v=86,12 +p=80,29 v=-92,-26 +p=8,47 v=-33,-69 +p=2,41 v=12,-9 +p=39,60 v=-38,59 +p=13,22 v=86,-20 +p=25,12 v=-57,11 +p=60,47 v=96,96 +p=50,51 v=-48,-82 +p=85,40 v=89,74 +p=99,4 v=-94,-21 +p=75,7 v=29,-73 +p=28,58 v=-80,24 +p=46,94 v=-9,56 +p=24,65 v=-76,62 +p=50,2 v=-20,70 +p=85,55 v=-5,66 +p=38,11 v=43,36 +p=53,54 v=53,24 +p=18,45 v=65,96 +p=94,22 v=16,80 +p=79,28 v=75,-69 +p=30,38 v=-15,-29 +p=5,23 v=-4,49 +p=8,98 v=96,-99 +p=7,60 v=-14,47 +p=96,17 v=88,-73 +p=48,23 v=-41,35 +p=17,31 v=-26,-23 +p=13,52 v=66,37 +p=58,19 v=41,55 +p=25,9 v=-77,-89 +p=3,92 v=55,-80 +p=74,95 v=20,-77 +p=26,70 v=43,72 +p=54,4 v=96,-18 +p=63,8 v=-97,49 +p=23,51 v=87,-75 +p=24,18 v=85,36 +p=8,52 v=6,-13 +p=97,50 v=17,-72 +p=47,66 v=-25,6 +p=38,78 v=3,-93 +p=62,6 v=5,77 +p=56,74 v=-70,-6 +p=94,99 v=9,34 +p=19,92 v=-18,26 +p=35,54 v=-47,-69 +p=92,8 v=-13,42 +p=47,86 v=12,-90 +p=12,83 v=-68,2 +p=0,18 v=-75,-89 +p=11,99 v=-99,14 +p=88,20 v=62,21 +p=27,53 v=53,-47 +p=17,44 v=-5,-91 +p=57,10 v=66,-65 +p=66,95 v=-71,-12 +p=38,21 v=23,95 +p=68,69 v=-31,35 +p=87,71 v=50,72 +p=98,12 v=47,33 +p=94,21 v=66,51 +p=53,97 v=-16,-93 +p=59,35 v=6,39 +p=12,88 v=-86,88 +p=85,16 v=39,8 +p=38,85 v=35,80 +p=44,9 v=-48,11 +p=71,18 v=-82,39 +p=85,14 v=-74,-73 +p=88,22 v=-42,36 +p=8,6 v=-58,38 +p=21,58 v=-66,9 +p=25,17 v=-68,95 +p=89,16 v=-34,-86 +p=33,54 v=64,-88 +p=57,8 v=54,51 +p=40,18 v=-98,58 +p=91,22 v=-34,-53 +p=75,81 v=-70,26 +p=89,70 v=-2,69 +p=62,6 v=-1,-92 +p=78,24 v=-82,-42 +p=47,7 v=-75,83 +p=86,8 v=-63,95 +p=80,64 v=-36,-79 +p=69,95 v=-30,29 +p=46,86 v=85,20 +p=76,35 v=-82,-51 +p=33,15 v=-17,55 +p=40,58 v=-2,-11 +p=76,31 v=39,2 +p=46,82 v=-15,-45 +p=14,53 v=36,-16 +p=98,66 v=68,-3 +p=83,38 v=35,-87 +p=41,9 v=53,70 +p=35,33 v=-68,-68 +p=53,66 v=62,97 +p=75,80 v=49,-62 +p=66,70 v=-50,47 +p=78,80 v=7,64 +p=82,16 v=85,-81 +p=58,25 v=11,-70 +p=36,72 v=33,72 +p=66,92 v=-91,10 +p=24,52 v=-98,22 +p=74,7 v=-36,-79 +p=46,26 v=-61,-90 +p=52,24 v=53,-88 +p=92,26 v=31,78 +p=60,52 v=80,-81 +p=82,78 v=-81,-49 +p=10,3 v=-15,-55 +p=91,31 v=99,77 +p=75,50 v=-91,40 +p=49,71 v=93,91 +p=1,94 v=-54,54 +p=96,50 v=39,18 +p=0,3 v=-53,33 +p=34,9 v=-17,-8 +p=96,28 v=68,-63 +p=25,4 v=66,21 +p=94,74 v=82,-89 +p=47,66 v=-17,87 +p=58,23 v=63,83 +p=13,82 v=-74,75 +p=29,85 v=40,79 +p=57,7 v=50,83 +p=7,88 v=-37,-16 +p=81,61 v=-10,34 +p=6,32 v=33,-60 +p=63,7 v=1,98 +p=59,29 v=-31,-85 +p=85,91 v=19,-18 +p=22,39 v=21,90 +p=25,13 v=75,89 +p=14,100 v=-27,30 +p=33,6 v=97,-53 +p=84,83 v=-22,38 +p=100,69 v=77,-38 +p=2,67 v=-14,-25 +p=71,71 v=-53,73 +p=9,43 v=-52,98 +p=55,76 v=-60,94 +p=49,91 v=-35,-95 +p=77,68 v=26,12 +p=41,91 v=-17,-15 +p=1,69 v=-44,72 +p=32,61 v=4,59 +p=94,12 v=-33,30 +p=1,35 v=96,49 +p=72,64 v=-61,-53 +p=76,93 v=38,-37 +p=97,9 v=33,61 +p=60,32 v=80,18 +p=16,68 v=15,-29 +p=99,72 v=66,44 +p=99,18 v=56,99 +p=42,11 v=-88,11 +p=57,69 v=-2,-2 +p=39,57 v=26,-51 +p=34,15 v=73,42 +p=56,55 v=-61,-75 +p=89,1 v=67,-27 +p=21,100 v=5,70 +p=85,11 v=-35,63 +p=16,35 v=47,-63 +p=98,0 v=93,-2 +p=51,89 v=-9,85 +p=50,32 v=84,-42 +p=29,63 v=78,-76 +p=92,86 v=89,10 +p=27,11 v=-77,51 +p=65,21 v=-59,68 +p=84,68 v=20,-50 +p=19,2 v=-24,-36 +p=25,78 v=25,-85 +p=90,92 v=59,-87 +p=70,100 v=10,-52 +p=48,78 v=3,54 +p=85,81 v=30,44 +p=53,65 v=41,-67 +p=13,95 v=82,-29 +p=5,19 v=95,75 +p=37,96 v=-68,26 +p=83,16 v=-5,-9 +p=31,17 v=4,-20 +p=83,34 v=-83,-76 +p=50,88 v=93,-5 +p=66,36 v=-30,58 +p=11,29 v=-44,83 +p=31,31 v=-77,-51 +p=26,85 v=14,-18 +p=8,76 v=65,69 +p=60,70 v=-40,47 +p=69,70 v=22,64 +p=85,53 v=18,12 +p=97,93 v=-58,-57 +p=52,83 v=92,-9 +p=20,92 v=30,50 +p=88,73 v=32,3 +p=83,16 v=-42,-14 +p=57,89 v=-29,20 +p=50,19 v=73,8 +p=8,101 v=-94,-68 +p=12,77 v=-4,-84 +p=63,28 v=-84,91 +p=46,25 v=13,-95 +p=93,21 v=88,-26 +p=10,54 v=-24,72 +p=69,16 v=-92,-30 +p=26,68 v=21,97 +p=56,30 v=-90,-51 +p=62,69 v=-1,-50 +p=7,6 v=55,-39 +p=63,78 v=76,92 +p=57,55 v=-51,-19 +p=70,62 v=18,37 +p=88,26 v=-61,82 +p=80,50 v=-73,99 +p=40,1 v=-78,86 +p=35,85 v=81,-12 +p=17,74 v=56,47 +p=36,99 v=64,-15 +p=56,18 v=-29,-14 +p=42,44 v=-18,46 +p=84,4 v=-63,-2 +p=97,75 v=27,-62 +p=47,71 v=54,-50 +p=26,101 v=-67,-83 +p=30,74 v=-57,66`) + require.Equal(t, 0, r) +} diff --git a/2024/go/day14/input.txt b/2024/go/day14/input.txt new file mode 100644 index 0000000..179e1e7 --- /dev/null +++ b/2024/go/day14/input.txt @@ -0,0 +1,500 @@ +p=80,75 v=69,72 +p=88,10 v=-28,-23 +p=79,61 v=79,59 +p=37,102 v=92,-43 +p=12,22 v=-5,-95 +p=60,13 v=-30,-42 +p=3,59 v=-96,-88 +p=85,33 v=-43,-41 +p=44,14 v=63,45 +p=6,6 v=-34,-86 +p=47,102 v=12,42 +p=36,88 v=-88,-93 +p=78,27 v=-18,52 +p=96,64 v=-62,-34 +p=49,99 v=-78,-15 +p=57,31 v=-80,21 +p=25,57 v=8,-84 +p=69,20 v=81,61 +p=80,5 v=-11,-30 +p=2,35 v=-85,77 +p=9,12 v=-4,36 +p=37,68 v=12,-69 +p=47,88 v=-8,-90 +p=72,68 v=59,-86 +p=55,38 v=-68,-94 +p=60,58 v=41,37 +p=76,87 v=-1,-18 +p=89,9 v=38,92 +p=100,67 v=17,-53 +p=83,73 v=80,32 +p=77,19 v=-54,-20 +p=10,86 v=-65,36 +p=13,88 v=-64,-84 +p=50,29 v=-17,-29 +p=79,38 v=89,-57 +p=55,57 v=-68,22 +p=71,82 v=-80,52 +p=37,83 v=-68,-43 +p=25,5 v=81,-22 +p=83,54 v=-32,-75 +p=27,95 v=-77,-55 +p=70,97 v=-72,-4 +p=3,84 v=-60,-60 +p=16,29 v=-35,99 +p=39,39 v=37,-38 +p=76,94 v=90,60 +p=18,21 v=-86,-26 +p=22,84 v=-16,66 +p=45,83 v=-40,-43 +p=35,52 v=54,3 +p=30,21 v=14,36 +p=69,61 v=69,-66 +p=52,22 v=-28,33 +p=9,21 v=-85,-73 +p=87,32 v=79,52 +p=28,85 v=-35,85 +p=32,58 v=-49,89 +p=22,75 v=85,44 +p=45,19 v=-88,61 +p=97,59 v=98,-75 +p=70,81 v=82,7 +p=97,102 v=-23,-8 +p=92,68 v=89,72 +p=24,42 v=-63,-97 +p=21,64 v=-45,-47 +p=58,3 v=-69,51 +p=33,68 v=19,-20 +p=27,6 v=-89,-21 +p=28,81 v=-67,-8 +p=59,83 v=-66,-82 +p=3,14 v=-3,-1 +p=19,65 v=15,-25 +p=57,37 v=53,-29 +p=36,84 v=-4,-84 +p=55,96 v=82,-21 +p=68,101 v=51,51 +p=68,8 v=-90,-30 +p=78,51 v=-51,-63 +p=4,55 v=-63,97 +p=100,60 v=76,-13 +p=7,91 v=-96,-73 +p=97,17 v=-54,33 +p=85,60 v=69,-3 +p=20,39 v=96,-85 +p=24,12 v=86,-84 +p=34,7 v=-7,-36 +p=30,69 v=-67,97 +p=65,17 v=20,33 +p=39,101 v=-7,-83 +p=38,51 v=-90,-4 +p=99,61 v=-13,59 +p=30,1 v=-67,-96 +p=1,89 v=-85,-83 +p=8,1 v=68,4 +p=89,89 v=-52,85 +p=81,5 v=-55,71 +p=99,60 v=-94,-72 +p=68,70 v=-10,78 +p=81,18 v=89,-95 +p=47,61 v=-39,56 +p=91,71 v=85,59 +p=28,66 v=44,-28 +p=10,64 v=-59,-4 +p=84,10 v=-32,-11 +p=29,52 v=-37,34 +p=78,43 v=-92,12 +p=85,3 v=-71,4 +p=37,85 v=-46,-84 +p=56,21 v=21,-32 +p=17,17 v=15,17 +p=26,87 v=45,-93 +p=57,21 v=-6,40 +p=95,48 v=-33,59 +p=38,59 v=65,-72 +p=59,85 v=-50,-99 +p=17,21 v=86,-45 +p=53,3 v=-28,-46 +p=1,40 v=-54,-91 +p=61,13 v=-40,83 +p=33,35 v=-72,-96 +p=40,14 v=33,-8 +p=29,89 v=53,-59 +p=74,0 v=-22,-42 +p=12,32 v=-65,-4 +p=82,89 v=-12,20 +p=35,71 v=-40,20 +p=14,5 v=95,83 +p=46,44 v=39,92 +p=25,54 v=-66,-47 +p=91,78 v=64,53 +p=14,9 v=25,67 +p=39,29 v=-29,8 +p=20,100 v=95,51 +p=59,41 v=92,-82 +p=15,92 v=93,-73 +p=42,93 v=3,-86 +p=82,93 v=-21,-96 +p=50,9 v=12,-39 +p=81,22 v=-13,99 +p=72,81 v=-51,-93 +p=88,19 v=-72,-14 +p=8,93 v=-85,-15 +p=54,2 v=61,8 +p=44,81 v=66,41 +p=78,10 v=90,8 +p=19,53 v=68,4 +p=80,43 v=9,46 +p=11,38 v=-66,88 +p=31,3 v=4,-2 +p=49,28 v=-74,21 +p=27,15 v=54,-88 +p=96,87 v=-50,-67 +p=94,94 v=-5,-97 +p=16,89 v=73,23 +p=93,32 v=-53,93 +p=47,17 v=-29,92 +p=10,78 v=16,35 +p=55,33 v=-60,-17 +p=55,73 v=-68,-22 +p=100,62 v=17,-69 +p=67,91 v=-49,45 +p=68,53 v=-42,-41 +p=35,73 v=54,47 +p=20,63 v=-85,-12 +p=23,16 v=-87,33 +p=70,55 v=50,-16 +p=92,6 v=41,-59 +p=9,97 v=-37,47 +p=48,48 v=42,40 +p=96,37 v=-90,32 +p=66,13 v=-60,91 +p=62,46 v=-50,18 +p=11,15 v=98,77 +p=42,78 v=1,47 +p=10,40 v=15,-48 +p=88,44 v=7,-75 +p=27,53 v=-70,-9 +p=21,7 v=-56,96 +p=92,81 v=-22,69 +p=57,65 v=92,-34 +p=85,63 v=77,11 +p=92,2 v=-30,21 +p=59,16 v=73,-70 +p=16,11 v=86,-89 +p=82,16 v=80,-36 +p=41,30 v=-49,19 +p=13,6 v=14,73 +p=67,99 v=-91,51 +p=37,20 v=-65,-37 +p=85,16 v=99,-14 +p=1,39 v=-44,56 +p=37,29 v=74,5 +p=44,51 v=-18,93 +p=43,9 v=-55,-84 +p=5,10 v=-65,26 +p=51,90 v=-59,-96 +p=55,98 v=-9,23 +p=0,94 v=88,-49 +p=91,43 v=-14,-72 +p=93,43 v=-69,-94 +p=84,100 v=-12,54 +p=23,46 v=85,78 +p=79,37 v=39,-10 +p=1,23 v=99,-79 +p=73,50 v=-51,84 +p=78,58 v=-31,-16 +p=75,44 v=69,71 +p=27,5 v=-87,14 +p=95,91 v=-33,63 +p=22,94 v=-5,-37 +p=36,11 v=-5,-60 +p=18,3 v=-64,-27 +p=44,14 v=24,-92 +p=96,40 v=65,-92 +p=47,1 v=84,25 +p=93,22 v=68,-48 +p=14,32 v=-24,37 +p=99,17 v=78,-89 +p=53,36 v=10,58 +p=44,44 v=-78,-60 +p=15,28 v=-96,-20 +p=96,61 v=-81,-45 +p=58,87 v=-9,7 +p=20,43 v=84,-22 +p=50,42 v=-18,68 +p=74,23 v=-12,42 +p=12,57 v=-94,-94 +p=49,49 v=-89,40 +p=47,98 v=-67,-8 +p=84,17 v=-62,11 +p=31,6 v=-57,-42 +p=28,67 v=66,-81 +p=0,3 v=-88,-13 +p=51,76 v=82,76 +p=67,81 v=87,-14 +p=84,78 v=39,41 +p=39,74 v=72,35 +p=30,10 v=64,-77 +p=10,31 v=11,-4 +p=6,90 v=-4,76 +p=90,24 v=-2,-23 +p=8,39 v=-57,-27 +p=31,69 v=93,-25 +p=79,38 v=39,-35 +p=69,31 v=70,30 +p=1,16 v=7,73 +p=46,9 v=-99,-70 +p=53,16 v=-94,-84 +p=32,60 v=33,-69 +p=62,22 v=-99,-4 +p=66,3 v=98,20 +p=4,76 v=46,-75 +p=50,71 v=-90,22 +p=57,12 v=31,-15 +p=59,84 v=-50,-65 +p=33,0 v=76,-48 +p=58,76 v=-30,44 +p=6,69 v=6,35 +p=74,91 v=-61,-43 +p=36,92 v=-58,60 +p=2,78 v=-48,-98 +p=43,91 v=53,76 +p=34,101 v=-77,79 +p=40,44 v=-68,28 +p=71,64 v=47,-48 +p=54,7 v=84,15 +p=54,75 v=-60,-31 +p=14,40 v=86,12 +p=80,29 v=-92,-26 +p=8,47 v=-33,-69 +p=2,41 v=12,-9 +p=39,60 v=-38,59 +p=13,22 v=86,-20 +p=25,12 v=-57,11 +p=60,47 v=96,96 +p=50,51 v=-48,-82 +p=85,40 v=89,74 +p=99,4 v=-94,-21 +p=75,7 v=29,-73 +p=28,58 v=-80,24 +p=46,94 v=-9,56 +p=24,65 v=-76,62 +p=50,2 v=-20,70 +p=85,55 v=-5,66 +p=38,11 v=43,36 +p=53,54 v=53,24 +p=18,45 v=65,96 +p=94,22 v=16,80 +p=79,28 v=75,-69 +p=30,38 v=-15,-29 +p=5,23 v=-4,49 +p=8,98 v=96,-99 +p=7,60 v=-14,47 +p=96,17 v=88,-73 +p=48,23 v=-41,35 +p=17,31 v=-26,-23 +p=13,52 v=66,37 +p=58,19 v=41,55 +p=25,9 v=-77,-89 +p=3,92 v=55,-80 +p=74,95 v=20,-77 +p=26,70 v=43,72 +p=54,4 v=96,-18 +p=63,8 v=-97,49 +p=23,51 v=87,-75 +p=24,18 v=85,36 +p=8,52 v=6,-13 +p=97,50 v=17,-72 +p=47,66 v=-25,6 +p=38,78 v=3,-93 +p=62,6 v=5,77 +p=56,74 v=-70,-6 +p=94,99 v=9,34 +p=19,92 v=-18,26 +p=35,54 v=-47,-69 +p=92,8 v=-13,42 +p=47,86 v=12,-90 +p=12,83 v=-68,2 +p=0,18 v=-75,-89 +p=11,99 v=-99,14 +p=88,20 v=62,21 +p=27,53 v=53,-47 +p=17,44 v=-5,-91 +p=57,10 v=66,-65 +p=66,95 v=-71,-12 +p=38,21 v=23,95 +p=68,69 v=-31,35 +p=87,71 v=50,72 +p=98,12 v=47,33 +p=94,21 v=66,51 +p=53,97 v=-16,-93 +p=59,35 v=6,39 +p=12,88 v=-86,88 +p=85,16 v=39,8 +p=38,85 v=35,80 +p=44,9 v=-48,11 +p=71,18 v=-82,39 +p=85,14 v=-74,-73 +p=88,22 v=-42,36 +p=8,6 v=-58,38 +p=21,58 v=-66,9 +p=25,17 v=-68,95 +p=89,16 v=-34,-86 +p=33,54 v=64,-88 +p=57,8 v=54,51 +p=40,18 v=-98,58 +p=91,22 v=-34,-53 +p=75,81 v=-70,26 +p=89,70 v=-2,69 +p=62,6 v=-1,-92 +p=78,24 v=-82,-42 +p=47,7 v=-75,83 +p=86,8 v=-63,95 +p=80,64 v=-36,-79 +p=69,95 v=-30,29 +p=46,86 v=85,20 +p=76,35 v=-82,-51 +p=33,15 v=-17,55 +p=40,58 v=-2,-11 +p=76,31 v=39,2 +p=46,82 v=-15,-45 +p=14,53 v=36,-16 +p=98,66 v=68,-3 +p=83,38 v=35,-87 +p=41,9 v=53,70 +p=35,33 v=-68,-68 +p=53,66 v=62,97 +p=75,80 v=49,-62 +p=66,70 v=-50,47 +p=78,80 v=7,64 +p=82,16 v=85,-81 +p=58,25 v=11,-70 +p=36,72 v=33,72 +p=66,92 v=-91,10 +p=24,52 v=-98,22 +p=74,7 v=-36,-79 +p=46,26 v=-61,-90 +p=52,24 v=53,-88 +p=92,26 v=31,78 +p=60,52 v=80,-81 +p=82,78 v=-81,-49 +p=10,3 v=-15,-55 +p=91,31 v=99,77 +p=75,50 v=-91,40 +p=49,71 v=93,91 +p=1,94 v=-54,54 +p=96,50 v=39,18 +p=0,3 v=-53,33 +p=34,9 v=-17,-8 +p=96,28 v=68,-63 +p=25,4 v=66,21 +p=94,74 v=82,-89 +p=47,66 v=-17,87 +p=58,23 v=63,83 +p=13,82 v=-74,75 +p=29,85 v=40,79 +p=57,7 v=50,83 +p=7,88 v=-37,-16 +p=81,61 v=-10,34 +p=6,32 v=33,-60 +p=63,7 v=1,98 +p=59,29 v=-31,-85 +p=85,91 v=19,-18 +p=22,39 v=21,90 +p=25,13 v=75,89 +p=14,100 v=-27,30 +p=33,6 v=97,-53 +p=84,83 v=-22,38 +p=100,69 v=77,-38 +p=2,67 v=-14,-25 +p=71,71 v=-53,73 +p=9,43 v=-52,98 +p=55,76 v=-60,94 +p=49,91 v=-35,-95 +p=77,68 v=26,12 +p=41,91 v=-17,-15 +p=1,69 v=-44,72 +p=32,61 v=4,59 +p=94,12 v=-33,30 +p=1,35 v=96,49 +p=72,64 v=-61,-53 +p=76,93 v=38,-37 +p=97,9 v=33,61 +p=60,32 v=80,18 +p=16,68 v=15,-29 +p=99,72 v=66,44 +p=99,18 v=56,99 +p=42,11 v=-88,11 +p=57,69 v=-2,-2 +p=39,57 v=26,-51 +p=34,15 v=73,42 +p=56,55 v=-61,-75 +p=89,1 v=67,-27 +p=21,100 v=5,70 +p=85,11 v=-35,63 +p=16,35 v=47,-63 +p=98,0 v=93,-2 +p=51,89 v=-9,85 +p=50,32 v=84,-42 +p=29,63 v=78,-76 +p=92,86 v=89,10 +p=27,11 v=-77,51 +p=65,21 v=-59,68 +p=84,68 v=20,-50 +p=19,2 v=-24,-36 +p=25,78 v=25,-85 +p=90,92 v=59,-87 +p=70,100 v=10,-52 +p=48,78 v=3,54 +p=85,81 v=30,44 +p=53,65 v=41,-67 +p=13,95 v=82,-29 +p=5,19 v=95,75 +p=37,96 v=-68,26 +p=83,16 v=-5,-9 +p=31,17 v=4,-20 +p=83,34 v=-83,-76 +p=50,88 v=93,-5 +p=66,36 v=-30,58 +p=11,29 v=-44,83 +p=31,31 v=-77,-51 +p=26,85 v=14,-18 +p=8,76 v=65,69 +p=60,70 v=-40,47 +p=69,70 v=22,64 +p=85,53 v=18,12 +p=97,93 v=-58,-57 +p=52,83 v=92,-9 +p=20,92 v=30,50 +p=88,73 v=32,3 +p=83,16 v=-42,-14 +p=57,89 v=-29,20 +p=50,19 v=73,8 +p=8,101 v=-94,-68 +p=12,77 v=-4,-84 +p=63,28 v=-84,91 +p=46,25 v=13,-95 +p=93,21 v=88,-26 +p=10,54 v=-24,72 +p=69,16 v=-92,-30 +p=26,68 v=21,97 +p=56,30 v=-90,-51 +p=62,69 v=-1,-50 +p=7,6 v=55,-39 +p=63,78 v=76,92 +p=57,55 v=-51,-19 +p=70,62 v=18,37 +p=88,26 v=-61,82 +p=80,50 v=-73,99 +p=40,1 v=-78,86 +p=35,85 v=81,-12 +p=17,74 v=56,47 +p=36,99 v=64,-15 +p=56,18 v=-29,-14 +p=42,44 v=-18,46 +p=84,4 v=-63,-2 +p=97,75 v=27,-62 +p=47,71 v=54,-50 +p=26,101 v=-67,-83 +p=30,74 v=-57,66 diff --git a/2024/go/day15/day15.go b/2024/go/day15/day15.go new file mode 100644 index 0000000..349865b --- /dev/null +++ b/2024/go/day15/day15.go @@ -0,0 +1,119 @@ +package day15 + +import ( + _ "adventofcode2024/utils" + _ "adventofcode2024/utils/grid2d" + _ "adventofcode2024/utils/grid2d" + "adventofcode2024/utils/inputs" + "fmt" + _ "regexp" + "strings" + + _ "github.com/deckarep/golang-set/v2" +) + +type Loc struct { + x int + y int +} + +type Queue struct { + elements []Loc +} + +// Push adds an element to the end of the queue +func (q *Queue) Push(value Loc) { + q.elements = append(q.elements, value) +} + +// Pop removes an element from the front of the queue +func (q *Queue) Pop() (Loc, bool) { + if len(q.elements) == 0 { + return Loc{}, false // Return zero and false if the queue is empty + } + value := q.elements[0] + q.elements = q.elements[1:] // Remove the first element + return value, true +} + +// IsEmpty checks if the queue is empty +func (q *Queue) IsEmpty() bool { + return len(q.elements) == 0 +} + +func Part1(input string) int { + var val int + var rloc Loc + in := strings.Split(input, "\n\n") + dirs := map[rune][2]int{ + '<': {-1, 0}, + '>': {1, 0}, + '^': {0, -1}, + 'v': {0, 1}, + } + grid := inputs.ToGrid2D(in[0], "\n", "", ',', func(c string) rune { return rune(c[0]) }) + directions := strings.ReplaceAll(in[1], "\n", "") + fmt.Printf("%v\n", grid.StringWithFormatter(formatter)) + fmt.Printf("%v\n", directions) + found := false + for x := 0; x < grid.SizeX(); x++ { + if found { + break + } + for y := 0; y < grid.SizeY(); y++ { + if grid.Get(x, y) == '@' { + rloc = Loc{x: x, y: y} + found = true + break + } + } + } + fmt.Printf("Robot: %v\n", rloc) + for _, dir := range directions { + q := &Queue{} + x := rloc.x + y := rloc.y + Loop: + for { + x += dirs[dir][0] + y += dirs[dir][1] + switch grid.Get(x, y) { + case 'O': + q.Push(Loc{x: x, y: y}) + case '.': + for !q.IsEmpty() { + grid.Set(x, y, 'O') + loc, _ := q.Pop() + fmt.Printf("%d,%d\n", loc.x, loc.y) + // grid.Set(loc.x, loc.y, 'O') + x -= dirs[dir][0] + y -= dirs[dir][1] + } + grid.Set(rloc.x, rloc.y, '.') + rloc.x = x + rloc.y = y + grid.Set(rloc.x, rloc.y, '@') + break Loop + case '#': + break Loop + } + } + // fmt.Printf("%v\n", grid.StringWithFormatter(formatter)) + } + for x := 0; x < grid.SizeX(); x++ { + for y := 0; y < grid.SizeY(); y++ { + if grid.Get(x, y) == 'O' { + val += (100 * y) + x + } + } + } + return val +} + +func Part2(input string) int { + return 0 +} + +func formatter(p rune, x int, y int) string { + return string(p) +} diff --git a/2024/go/day15/day15_test.go b/2024/go/day15/day15_test.go new file mode 100644 index 0000000..3abc33f --- /dev/null +++ b/2024/go/day15/day15_test.go @@ -0,0 +1,57 @@ +package day15 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`########## +#..O..O.O# +#......O.# +#.OO..O.O# +#..O@..O.# +#O#..O...# +#O..O..O.# +#.OO.O.OO# +#....O...# +########## + +^v>^vv^v>v<>v^v<<><>>v^v^>^<<<><^ +vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<^<^^>>>^<>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^v^^<^^vv< +<>^^^^>>>v^<>vvv^>^^^vv^^>v<^^^^v<>^>vvvv><>>v^<<^^^^^ +^><^><>>><>^^<<^^v>>><^^>v>>>^v><>^v><<<>vvvv>^<><<>^>< +^>><>^v<><^vvv<^^<><^v<<<><<<^^<^>>^<<<^>>^v^>>^v>vv>^<<^v<>><<><<>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^ +<><^^>^^^<>^vv<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<> +^^>vv<^v^v^<>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<>< +v^^>>><<^^<>>^v^v^<<>^<^v^v><^<<<><<^vv>>v>v^<<^`) + require.Equal(t, 10092, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`########## +#..O..O.O# +#......O.# +#.OO..O.O# +#..O@..O.# +#O#..O...# +#O..O..O.# +#.OO.O.OO# +#....O...# +########## + +^v>^vv^v>v<>v^v<<><>>v^v^>^<<<><^ +vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<^<^^>>>^<>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^v^^<^^vv< +<>^^^^>>>v^<>vvv^>^^^vv^^>v<^^^^v<>^>vvvv><>>v^<<^^^^^ +^><^><>>><>^^<<^^v>>><^^>v>>>^v><>^v><<<>vvvv>^<><<>^>< +^>><>^v<><^vvv<^^<><^v<<<><<<^^<^>>^<<<^>>^v^>>^v>vv>^<<^v<>><<><<>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^ +<><^^>^^^<>^vv<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<> +^^>vv<^v^v^<>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<>< +v^^>>><<^^<>>^v^v^<<>^<^v^v><^<<<><<^vv>>v>v^<<^`) + require.Equal(t, 0, r) +} diff --git a/2024/go/day15/input.txt b/2024/go/day15/input.txt new file mode 100644 index 0000000..923444c --- /dev/null +++ b/2024/go/day15/input.txt @@ -0,0 +1,71 @@ +################################################## +#...O.#..O....##O..OO.#O..#.#.......OO...#O.#OO..# +#O#..OO...O..O.O.....O.O.O....OO#.....O#.O.OO..O.# +#........O....#...O......O.OO...#..O.O.#O#....O..# +#..O.OO..O..O.#..O.O.OO.O...O...O......#O.....O..# +#..OO.....O.OO.O#.......O.........O.....O.O.O....# +#.O.#.O.O#......OO........O.O.....OO..O.O.O.#.#O.# +#........#.....#.##O....O.O..OOO.......OOO.#O....# +#.O#.#...OO.....#.......O...O...#O.O.......OO..OO# +#.O...O..#O...#O..O.........O.O..OO..O.......O.OO# +#O.O......O.OO..O.O.......O.OO#O.##...#....#O.O.O# +#.O...O.OO.O....O..O.O...O...#.O....OO..O.O#O#OO.# +#.....O.O..#O.....O.O..##O.O#OO...O...O.O.O......# +##..O...O..OO.O.O.O..OO........#.##.........O.O..# +#..O...O.OO..OOO.O...#..#.........#.O....OO......# +#O....OOO.OO...O##.O.OO..O.O.....O.O.OOO....O.O.O# +#O.O..OO.O..OO............O....O....O..OO...OO..## +#.O...O.O.O.....O..O.O...O.#.......OOO...........# +#O.O...O.....#..O..#O...O.O.O....O#...#.###.....O# +#.O...O.O..#O.#.OO.......O.OO.O...O...........O..# +##O.#O....O.#............O..O..O.....O..O..OO....# +##..#.OO.O.OO.#.O....O...#........#........O.O...# +#..O.OO...O....#..OO.O...........OOOO#..OO#O.....# +#OO.O#...#..#...O#........O.OOO...OO....#O.OO#OOO# +#...OOO............#O.#.@...O.....O#.#.O...O..O..# +#...O...OO.#..O......O..............#OOO......OOO# +#..#OO...O.#O......O..OO.O#...O....OO..O...O.O#O.# +#.#.##...#O........#.O.....#O#.O.OO..OOO..#..O...# +#.#....#...O..O#O..OOO.....#....#......O...O...#.# +#....O....O......O.O.O..........O.O..O.O......O..# +#.#OO#O.OO............O##.##O.O#.O...O#.........O# +##.O.#..........#......#OOOO.OO.#.O.O.O.....O..#.# +#O.....#OO.....O..............#...O.O..O.....OO#.# +#O.O.O..O#OO.O.O....O..O......O..O........OO.....# +##O....O...............................#.O.....O## +##..O...#...O.........O#...#O...O.OO......OO.O..O# +#O..OO.....OOOO.#......O.#OO..O.O...O.O...O.O.O#.# +#..O.....O.O........O.....O.....O#....OO##OOO..#O# +#O..##....OOO..O#.O....O.#...O.....O.O.O......O.O# +#..OO.#O.......O.OO.O#O.O.....O.....OO..OO.OOOO..# +#.#.#OO.O..O.O........O#.#...#..O.O.O.#.O..OO.O.O# +#..O#.OO.O.#.....O...O..OO#..O...O.O#...O.....#.O# +#.OO.OO....O.O..O..#OO.....#......#.#OO..#.#O.O#.# +#...O....#..#......O....O..O#O...O....OO.......O.# +#.#.....O#.......O..O..#O.OOOO..........O.O......# +#.O.O.....OO.O.O.O..#O.O.O..O.OO....O....##.....## +#O..#.OOO##....O.O..OOOO.O...O..O#..........O....# +##.O##...O.O.....O.O#...O.........#...........OOO# +#O#O.....#..O.OOO...O..OO.....OOO............#O..# +################################################## + +^^<^>^^<<^v>^><^^^^^<><^v>v<^vv>^v<^>>v>^vv<>>>>>v^>v>^>^v<^v^>^^>v<<>>^v^v>^>v^>^^^<^^v>>v>^>v<^^vvv<>vvv<^v<>v><><^^<>v^^<^><>>^^>v^>^<><<^><<>v>>vvv<^^v^v^>>v^^>^vv<^<^<^<><>>>^>>^<><^v<^<^v<^^>^<><<^<<^vv^^v^<^^vv>>^v>^v>^<^>^><>^v<>v>^^^<^vv^^<^v><^^^v<<>>>^<^^>^v>>^^<^^>^>><<^>>vv<>v^^<<>^<><>^^v<^v<<>vv><^>><^<^>>^^>v<^>v^>^<<^^^^v^<>^>^v^^vv<><<vv^v>>>v>>>>>^v>^<><<<><>v<>^vv>v<>^v^<>>v>>v^>^vv^vvv^^<<>vv>^>^v>>v^^vv<^v>^^vv<>^v>^>v^^<>^^>^^v<>^^^<^^<>^>^v><<>>^<>>v>>^><^>v<>v^v<>^<<>>v>^v<>^v<^>^^v>v>>^<^^^<<<<>vvv^v><<^^^v^^^>v><<^^v>vv^v>^>^v<>>vv<<^v<>v><^><>>^vv><>><><<>>v>><>v^^<^v<>^<^<^>v^^^>>v<^^<^^^>^^>^>^>^^<>v>vvv^v^>^<^<>v>^^>v<^>v>v>><> +^vv>>>^vv><^v^<>v>^><^^^>^v>><>>^>^<<^^v^^vv>^v^<^v^>vv<<>^>vvv>v>^vvv>>vv^>v^^v^^vv^^<><<<^^><<^>>>^<>v>>^v>v>><>v><<^v^><>v>v>^>>^^><>v>^>^v>^>><<<^vv<>^<<^><^<<><>vv^^v<<>v>v^vvv>^>^>^<>v<>vv>^>>v^^v<>><>>v<>>^^<>v^vvv<><^^v^>vv<^^>>>v>^>^^><<^v>^^>>^^>v<<<><<><>vv^>v>v^>vv><^<>><<>^>vv<<>v><^^^>v^^<^v>v^<>^<<>^^vvv>vvv><<><^><>>><<>>^><^>^><><^^vv<^>^vvv<^>>><<^>><^v<<^>v>^v>v>>^vv^>>><^>v^<>>v>v^v^><^v^v^<^v<>^><^>>v^^>v<^^^v>v>^^^<^^><><^>>v<>v<^v>^^<>v^>^vv<<^<^v^^^>v^vv<>vv>^^<<><^>><<^v<^>v>>^>><<^<>vv^>v><>^vv^^v>v<<>^<><^^>^^><^>>^v>vvvv>^>v><<^^><^v^<^v><^>vvv><^v<>><<^^>^<^<<<v>^v^>^>vv^<><><>^^<^v^^>^^^^^vv<<<^vv<<<>><>v>vv>^^^<^><><<><<>><^vv^^<v<>^^^^<><^^^<>^^<><<>>>^<>v^^>^^>>^v>v^ +^>>v<><<<<v<<<<^v<>v<<^vv<^vv<^^>>v^>^v^>^<>>>v<^<<^^>>vv^^<^^^>^><>>>vv<>vv<>^^>vv^vvvvvv^v>^^<<^<<<>v>^<^v>vv<>^^>^>><^^^v<>^<^v>^><><<<^><>^>^^vv^>^<<<^>^v>^v<<<>^^<^^<<^<^^<>^<<<^v^<>^>vvv><<<^vv^<^><>><><>v^^>v<^<^vv<>><^>v>^v<><>>^v^^^^v^<<><^^v>><>^v^<>>^v>v^^v<^v><>>v><^^<<^v<>v<<^^>><<<^>>vv>^<^>^<^v^<^v>>>>>><^vv<^>v>>v^>>vvv^vvvvvvv>^^>>>^v<>><>^<<<>^><^^v^v<>><^>^>v><>>v^>^<^<^><<^<>vv^^v^<>v<<<^>>vvv^>><<^<^^><^^>>>v>^^^>^vv^<<>^^^<^v>><>>>>v^<>>^^^<>v^^v^>><<>v>>^>^vvv><>^v>vv^v>>^><>^>v<<^>><^^v><^>^^>^>vv><<<^vvvvv<^<^<^<^^<>v^^>^v<^^v<>v>^>^>vv^>v>^^<^<^^v><^<^^v^v<>>^>v^v<^v>>><^v<^<<^v<^vv^^><>^v<><^>v<>vvv^^^>^^^^^v<^^^^v<><<>>>v^v<>v^^^>^vv>v>v>>><>v>vvvv>v>>vvv>^v<>^^v^<^vv^^>^^>>vv<><^vv>^<^>><<>>v>vv^vv<^<<<<>^v<<>>^v<>>>^v><<<><^<^><>>>>v^>v<><^v>v^>^^v^^>v<v<^v^^<<<^v^^vv^vv>vv^>^^vv^<^^<^>>>>^><<>^>^v^<^v>v^v><<>v^<>>v^^^><<^>^>^<^vvv>>^<^><^v>^^<><^^^>^><^^>>v^vvv><^<v>>^<<<<>^vv^>^<^<<>><^>vvv>v>>v^><><>vv>>^vv>>vv<^<>^^^>^>v>^v><^v^>v^^v^>^>vvvvvv<<^^<^<>^^^v><>><<<^^<>v<>vv<^<^v^v>v>v^vv^v<^v^<<<<^^<<>v<<<<<>v<^vv<>^<>><><^<^^<^<>v<>^<<<>vv<^vv<>^^<>v><><<<^<^>v^vv>vvvv^>v<^^^v<<<>>^>>^>>vv>>>v>v^<<>^^v>v^>^<^^<^^>><^^>v>v>^^>v>>>^<>^^v^v>^^<^v>^v><<v^>v^vvv><<^>>v^^>>>^vvvv^>^^v^^>vvv>^v^^^v^<^>v>>>^^<><>vv>^vvv<<>>v^<>^<^<vv^<v>v><^^>^>vv<^^<^^v<>^vvv^^v^vv>>^>v>v<^^<>vv>^<<>^^^>^<^<^>v>vv^^><>^>^v>>^<> +^<^^<^>v<^<^>^^>><<<>v<^^><>>^^<^^>^v^^><^v^^<^vv><>>v<^v^>>>^<>>^>^>^<>^^^<^v<>vv^v^^<^>v>^>><<>>v<><^<<<>v>>^<>>>>v>^v^<<<>^vv<<^>vv>vv>><^><><<>v><^<>v>>>><><>^vv<^v^vv><<^>v>v<<><>^>^v<^>v>v<>v<<>^vv>v><>><<<>>^^^<^^^^<>^>>vv>^v<^>>vv>^^v>^vv^^^v>v>>><<<>>>v>vv<^>^v>vv^^^<><>v<^>><^vv>^<<^<>><<<<^^>^^<><>v><<^v<<<<<^v>v<^^v<<^<>^><<<>>v<<^v>v>>>v<>>v><><^vv<^^<v>vv^<>^^>>>><<<>^^^^v>v>>>>^v><<^^>v^<v<>>^^v>^><^v>^>^^vvvvv>^>v>v>v>v^^^>^<><<^^^^<>^<^v>^>>>>vv>>>v^>^><^^v>>^>>vv<^^<>>vv^^v^<>>>vvv<>^>vv^<<^<^<>vv>^>v>v<^<<><^v^<^^^<^^^^vv^>^^>^^>><>^<^>v>v<^>>^^^^>^^><>vv><^^>v>^^^^v>^v>^v<^v^>v>^>^^^>v>v^^v^v>^v<^^^>^>vv^^vv>vv>v^v<^<^vv^>^^v>^vvvv<>^^v<>><<v<^>><><^><>>^< +^><^v>v^>vvv^^v^vv<>>>v>>vv^^>v^><^^<>v^><>^v^>v>^^>><<^><>v><^v>>>><<<>v^><<<>><<>^v^^^^<^^><><>^^vv^<^v^>>^>^><>vv^>>>>v^<>vv^>>v^<>vv>>><^><^>^vvvv><<^vvv^<>>v^v>><^^^><>>v^>^<^^><<<>vvv^^^v>^v<>v^>v<>v>v<>^v>vvvv<^>^^^v^^<>^<^^v>>^^^><>v^>><^>vv>><^^^v>><^<<^><<>^>^<>vv>vv^^^^<^>^v<>>^v>>>^v<>v<^v<<^v^v<<<^>>v^v^v<<^^v>vv^>v><>v>^vv>^v>>^<<^><>v>^>v>^<<^<>>^^v<>^>v^<>^v>vvv<><<>>^<^^>^<<>^<>vv^^v^^<<>v<<><^<^^<>>><<^v<<^>v<>vv>^>>>>>vv<<><^^vv^>v^<>v<<<>^>^v>vv^^<^v>v<^<>>^vv>v^<>^v^<>^>><><>v>>v>^><^><^>v><<>>^^^<<^v>v>^vv^>>>^^<>v<^<^>>^v^>v<><^>>>vvv^^^^>vv>^>>>><^<>^>v^v>v<^>>>><^^vv><<>vv<>v<>>^>^^<>>vv>>><<>vvv<<>>vv>^<^^v>>v>^<<<><^v^v^>^v^><<>^v><>>^^>v>>>^^>>v<>>>^v>^v^<<^<<<><>vv^>vvv>^^v>v<^v^v^><^v<>^v>^<>><<^v>vv^ +^>v<>>^vvv>>v^vvv>>v^><>><^v<>vv^>^^><<>><^<^>^v<>v>>v^<>>^<<^vv<^^<>^v><<>>^^<<^vv^v>^>^<>v>>>^<^<^<>v<^><<^><<>>vv><<><>^>>v^^>>>^v<^^<v><>><^<<^v>>^vv^v<>^>><>>>^<>>v><>>^^v>>^><^^^>^^>^>^>^vvvvv<^^>>>>v>vv>v>^vv^v<^v>^>^>vv>v<>v<><<>v^v<>><<<v<<>^v^><>v<><^v>^>^><^^^>v<>vvv<<^^v>^vv^<^>v>>>v>^^><^>^v>^v^^>^^v><>>^<^><^^v^^vv<^>^^>^>>vv<^>vv<<<>><><<^^v><^<^<>v^v>^v^<<v^<<<<v^<>v<^^<<^>^v<<><>><><<<^^>v>^^<^^>v>v<^v>^>>v>>v>v><^v^v<^v>^vv^><^v>><<^<^^^^^^>>v>v^<>v>>v<>v^>v><<<^v^<^<^<>^>>v>>>v>^vv>^^<>v^v>v><^v^>v>>^<^v>>>v>v>vv>^^^>vvvv^><^>^^^v<^><>^^<<^<<^^<^^>^<>^<^<^^v<^^<<>>>^v>^^^^^^^^<>v><^<^v><^>^v^^v>v^^<>vv^<^^v<>v^>^v>v<<<<>><>^<^<^<<><>>^<><<^^<>v^>>^vvv^<^^v^^v<<><^>vv>>^v<^^>^^>^>> +^>vv>^^>v^>>^><>>^<>v><<>v>v^^^>>v>>vv^^<<<>v^^v<<>v>>^<>^v<^^^<><^<<>^<>>v^vvv^v^<^>v^<^^<<^^<<^v<><^v^^v^v^v^^>v^><^>vv>>^><^<v>v>><>^v>^^<^>>v^<<>v<v^>vv>vv^>v^vvv^<>^v><<<>v^vv>vv<>^><^<><^v>>v<<^^^><^>^<>v^^v^^><^^>>v^^<>v>><>v<<^^^^^<<><>^vv^<><<>v>>>^><<^<><>^^v^vv>>v^vvv<>><><>^vv^v>^<^<^v>>>><^>>v>^v><<>^^<>^v^<>vv^<^<>^<<>v><^<^^^^>^<>^^^^<^^>v<<<v>v>>^vv>vvv^>v^vv>v^>vv^v<>>>vv>^>>^^^>><^^v^^<^^>vv<^v>v^vv<<^^<>^vv<^vv>vv<>>^<<>^<<>v<<>v<>v^^<>vv>^^>^vv^v>^<>v^v^>vv^^^>^>><>v><>>>v>>>v>v^v^v>v<^>^<^^>v<>>^><^^<^^<^v^v>vvv<^vv<^<><>^<v^>vv^^^>^>^>><<^>>^v^>v^^^v<^^^<^>>v^v<>^<><v><^^v^<^>>^^v^>>^<<<>v<^^^^<<^^v^^^^^>vv^>>v<^><<<>v^<>v>^ +^^<<>^<^<<<>v^^v>v>>^^^^^^<><^^<<^^v<>^^<^>^v>>>><><<<^^v^<><<<><<^v<<^v>vvv>><^>^>^><^>^>>>v^<<<<^>>v^><^^vv>vv<^>><^^v^^vv<>^^v<>^>>^^vv^^>>v^>>><v<^v^vvv>vvv>^v>^^^<><>v>v><<><^v>>>^<<^vv^^>>^<^^v^>v^<><<^>v>^v^<<><><>v^>>>v>><<^^v^vv^v<><^vvvv^>^><>>>>v^>>^vvv^<><^v>vv<>^><><^>v>vvvv>^^>vvv><^>^v>>^>v>^v<>>>>^^>^>v>^^>^^>>><^<^^v^^^^>^v>v<v^vvv>>v^<^v^v<^v^v<^<<>^v^<>>v>v>^^vv>^v><>^^<<<>v<>v>v><<<<^vv>^>>v><v<^v>v<<>><<>^><<^>>vvvv^<^v^^>>vv>><^vv<^^^>>>v^>^v>vvvv^>>v^><<^<^>^>^>v><><<<^<^vv^<<<>^<<^^<<>v<>><<<>>>>^>v>^^><>^><v>^>^v<^v^v>^<^v^^><<<>v>>v^vv>^^^^v><^>><><<^^<>vv^v^<>^>^<>v<^^>>>^>^>><<<><^>>^v><<>vv>><<>v^^>v>vv<^v<^>v^v>>^v<><<<>^v^<><^v<<vv>>^>^>^>>v>^<^v<<<>^v^v>^v<>v>v>><^<<><>v^^^v^<<^v>>><^^^v>vv>v<>v<>^^> +>^^<^v>v<<^<>^^>^<>vv>v^>^<^v^^>^>vv^<>><<>^v>^>v^v<^^^>v<>v>>>vvv<>^^^vv<^v<^v^<^<>>v<>^><<^<^><^<vv^>><<>>^vv>vv^^>v^^vv<>><>^vv^>v>>^^<^^v^>^^v<>^<<<<^v^^v>>v^^v>^^<^<^>>v^v>^<^v<>>^vvv<^vv>^<<<>^^^<^^^vv^^^<>^^v>>>><^>vvv<^><>^<><>^^>>^<<^>^^<>vv^vv<>v<^>vvv><^<^v>vv<^^^>v>>vv<>><^^v^^vv>^<<^<<^>v^>v^<>^<>v^v<>v><^>>^^<><>>v^vv^^<^>v<>>>^>>><<><>>^v>^^>>v><<^^v<>^<<><>>>>^>><><^>>>v^vvv^^^<><>^<^v<>>v^>>vvv>^<>^vv<>^v>><>><>v^v>^^>vv<^<<^^^v<><^<^v>vv>^<>v<<^vv^^vvv>><>>v<>v^^vv^>^<<^^v<^>v<^^<<^vv><>>^v>^^vvvv>^<^v^^vv><^^^v<>>v^v^^>v^^^^^^^>^v<<><<<^vv<<^vv^<<^<<>>><<><<><>vv>>^^>>>>^^v^^v<<>>^<>>>^^<>>>vv><<>>>^<^<>vv>>v^>v>^>>>^>^>>>>>>^>>><^^v><<><^vvv^>^v^>^>>^v>v^v<>^><^>v +^^^<^vv>^<<^<<><^<<>v^<^^vv><^<>^v>v<>^v^^vvv<^<>vvv^>><^vvv<>^>><>>^>v<>>>>>v^^<^<>^>^<^<<^^<>^>^>^v^v<<>v>^v>>>>^>v>>^v<>><>^>^>v<^<^<^<^<<<>^^>>^<>vvv<<>><>^>vv^>^^v^^>v<^^>>>v^v<><^^vvv>v<<^<^>^^<<^v>>><^^<^^v<>v^><>^v^<<>v>>v>^^>><^<<<^><^^vvv^>^>v<^v^>^><<^v<>>^><>^<>>vv<><>v^<>v^<^>>vv><^v^v<<<>v>^<^v^v<<<^<>>vv^<^^>>^v^<v<^vvv<>v^v>><^v>>^v^^^><<^<^<^>^vvvv<^v>^>>>^v<<><<^>><^^v^^^v^>vvv^^>^v<^>vv^^^v>><<>vv>>^^<>^v>v^v<<^^^>>^vv<>>v>vvv<^v<<>^^v<^>v>^>v>^<>v^v<>>>^vvv^v^<>>>>^v^<<>>>>v<>>^^^^><<^^^^<>^>^<>><<^<<>>^>>vvvvvv^><^^>^^^>^>v<^^^^>>v>v<><^<^^>>^>>^v>vv^vv^v<>>v<<<><vv^<^v>v><>^v>v<^<>>^>>v<<<>^vvv>v^<<^^>^<>vv><>^^^v>v^>vv<^^<>^<>v>vvv<^><<<>^>>^^>v^v<<>^v>> +v^^v<v>>><<>^>^>^v><^^v<^^^^^v^^<>><>>>^<<><^<<^>^<^^^<>>>>v<<>>>vvvv^v^<>v^^>>^>>^<^^v^>v<>^>vv<>>>>vvv>v^v^vv>v<>>vv^<>v^<>>v<<>vv<<>^>vv<>v>^<><^v^>>^<^<<>v^<<^><><>^^><><<>>v<^vv<>^>>v<><^>^<<>^>v^><><>^v>^<>v<^>^v>^>>^>^<<><<^>^><><^v^><^vvvv><>^v>^>vv<^v><^^^^>><^v<<><>v^^^^^^^vvv>^<<<<>v^<<^><<^>vv<^><^vv^>^vvv^>>>><<<^^vv><^><^>>v^^>^^><^vvv<<^vv^^<^>^>v^vv<><^>v>v><>>^>>^^^^^v<>^^>v^>^>^^<^<^^vv^^vv^>vv>vvvv<>v^>^<^^v>^>^vv>v^v<<><^v>>>vvv^^<<>><^^>^vvv^>v<^>v>>^<>^<>v><^<>><<<>><<<^>>>v>vvv^>><>>>>^>v>>v>^>^>>><>^><<^<^>v^^v^>^^>^>^<>^v^>^v<>v^<<>v^v>v><^>>v>><<>v><<>vvv>><^^v<>>v>v^>>vv>^<^>^<>v<<^vv<^>v^v<^<<^<^v<^v><^vvv>^<>^vv^>>><^^<^v<^^<^v^vv<<<>^v>v<<>v>>< +<>>vv^v>v<^<^^v^v^<^>>><^^<<<^<<^<^<<>v^^^^^<^>v^>vvv^>><^<<>>v^<><><<^^<^^><<>>v^v^v>><^^>>v>v<^<><^^><<>^<^v^^v>^^<^v^^v^<^v>^<><>^>^^^^<><^^<<>v>^<><^<><^v^^<^^<^><^<<^^^>v<<>^>>>>>>v>^>^>><^^>>^v>^v>><^vv^v<<^^^<^v^v^>v^v>^<<^vvvv>v>^^>><<<<>^v^v^><><><<<>><^<^^^^vv<>>>>>^v>>>>>v^<^<>vv^<^^v^^>>^^<^<^<><>>^><^>^<^^>v<^^>><^<^vv^v^<<^>>>v<<^>><<^v<^<^<>v<^vv^^^v<^v<^^vv>^vv>>>v^^^>><>v^>><<>v>^^^<^^<<>><>v>>v^v<^>vvvv^^^^vv><>v>^v>v^v><<>^vv^v>>^<>^^^^^v^v>^^vv>v>>>v>^^^vvvv^^>^^><^vv><><>^v^>>v>v^><><^^^^<^vv>^^v>^^>^vvv^^>^>^^v^<^>v^vv<>vv^<<><>^>vv^^v>vv^^<<>>^v^^<<^>^><>v>>^<<v>^v<<<<>^v>^^^>>v<^^v>>v^>v>>>^vv^>><<><><^^^v<^>>vv>>>^^^vv>>v><^^>v><>>^>v>v^<>vv<<^vv>>^>^vv>vvv^>>vv^^<>><>v^>^v>v^v>^>>v<^v^<><>^v<>>><<>^v><>v^vvv>vvvv>^<< +^^><<<^^v>^v<<^<^v<^v^v><^v<^>^v<><^^<<^>><>vv^vvv^v>v<>v<<>vv><>vvv<><^vv^^<<^<^v<>^<^<><<>^>>^v>>^v^>><^>^><^vv>>>>^>vv^v^<<>^^<^v^<v>>^<v^v>v>v><^>^vv>v<^v^vv<>>^>>^>v^^^^^><<>vv^vv<^^>^>^<<^^^>v<>vv<^^<^v>^>>><^<<>^<>^v<<>^>v^>vv^^^<>^^<>^>>^^v^v>vv<<<^>>>v>>^^^>^^v^<^^>^>^>>>><^^>^<^^>v<<^v>^^^v>^^^>^<^^>v<<^v>vv>v^^>^>v>^vv>>v^v<<<>^<^^v><^^<^^v<<^vv>>v>vvv>^v>vvv>^<><>^><<<^v^^^^v^^>v>^>v<^v<<^>^vv^^<>>^<^<v>^<^^<>>><>><v<>><^vvv>v>>>^>v<^^>v^^vv>v^^<><^vv^^v><^^<>^>v>>vv<>>^<<^^vv>vv<^^vv^<<^v<>>v<>>>>^^v>v>>^<^v>vv<^>^<<><<^<>>^<^><>^>v^<>^^<^<>v^v<>v><<>^<^^^v>^<^<^>>>><>^><v>^^<^>^<>v>^^<<^v^<><^v<>^v<<<<<<^^<^>v<<>^v^>^v^v>^<^>^<^>v<v^v>^v>>^v<>v<^vv<>>^^^<>v><><>><>v>^>v^v +vv<<>>vv<^>^^<<^>v>^v<<^^<<^^>^>>vv<<>^v><>>>^^<<^vv>vvv<<><<>v^v>v>vv^>v>^v^>^>>^v>><>^<^><<><>>>vv<>>v>><>vv<<>>vv>^^vv<>^^<<<^^v<>v^^<<<><>v<^^>v<>^vv>^v>>^^^<><<^^^<<>>^v^>vvv^v>v<^v<<>>^v^^v^<^<>^^<>v><>><><<^v<v<^<<>>><>>vv^>^<<>^^v>^>^<<^v>^>v^>^vv<^v><^^v^<>v^<^>>^v<^^^^^v^^>^<v<><^><^v<^<>v<^v^v>^>v><^><><^v^<<>^>^>^^v^<^<>^>vvvv^v^v^v^v><><><>v^^v^<>>vvv^<>^<^^vv^^<<<^v^>>>>>^^>>^>>^^>^v>vvv<^^v>^^v^v^^<<^>>v>v>^^>^<<^><>>^v^><>^^>v>^<<>^^><^v>^>>^^^<>>><<^^^<>>v^<><><>v^v>><^<^<^v^>v^vvvv^v>>vv^>v<<^^^<<>>^<>vv><^>^v>v^<^^^v^>v^>^<>^v^v^v<<<^>^<>^>v<^>>>vv<<>>^vv<>^>^vvvv>v<v^v<^vv<^^^v<^<>^><>>v>^><<^<>><^^>^v^^<^^vv^<<>>v<^v>>><<^^v>^<^v^^^v>^^^^<^^^<^>v<^<>>^<^>vvv<^><>v<^^>><^><^v<><<<^^v^^><^v<<>v +^vv<>v>^v>^<>^v><>><><^>^^^^<v^<>^><>^v<<vv>>v^<>v><>v>v^^<<<>>^v>^vvv<^^^><^v>>v^vv<<>><>v<>>v<<<^<<<^<><<<<<>>^v^vvvvvv^v^<>v<v<>vv<><<^v><>>><^v^v>v>v>>v><^v><>^vv>v^v^^>>>v>v^v>vvv<<<>>>v^v><<<>v>>^><<^vv<>><^>^vvv>v<<<<>^>v<^^<><^<^>>^vv<^v>^v^>^^>^^><^vv<<^<><<<^<<^v^v^>^>>>^v^><<>>^^v^<<^<>>v^>vv><>^^<^>^^v^v<<>^^^v<>>><<^^^<>^^>^>v^^>^v^^<^>^^>vv>vvvv<^v>v^v<>^v<<^>>v>>^^v>^^v>v><^^v<<<vv^<>><<>vv^<<><^<<^^^v>^<<<<^>v>^v^^><>^<^vv>v>>^^>>^><^>^<^v^>^>>^>v<<>><^^<<>vv><^<<<>v>^^v>vvvv>v<>>><^^>^>^vvvv^vvvv<>v<^v^^^^v<>^^>v^^<^^<<^<>^v<^v>>v^<<^<>v^^v^^<^>>v<>^<>>^<><^^^>><>v^<^><^v^^>>v<^<>v^<>^vv>v<^^<^vv<>vv>>^vv>^v<<^>>^^>vv^><^>><^>^>v^v^vv>v<^>><^>v>v>v><>>^<<><^v<^^>v>>>^v><<>^v>>v>^ +>^^>^><<<>v>>^><<><>^<><>>^>>>v^vv^<<>^>^v<>>>>v<v<>v^>>v<<<<>vv^v^<v^>^>>vvv<>>^vv>^v^><^^^v<>>v^vv^v^<^^v>>>v<>^v^<^vvv<><>>vv^>v<<<<>>vv<>^v>><^><^^^>v<<>>>v>^v^<^>v^^<v>v>>>v>^>^v<^<^^<^vv>^<>^v>vv>^^>><^v^v>v<<>v^^^>^^>^<>^>v>>v>>>>vv><>>^v^>>v^^v^><>^><>^^>>>v^<>>>v^>v^^>>>>v>v<^v>>^v^><>^^<>^<<<>^<>>>>>v><>^v^v^<<<^<<<<>v<^^^v><><>^^v^v<^^^^>^<^^^<>vvv<^v^>^v><>v^v^^<>>^v><<<vv^^>v<^^<><<<>>>>><<<^<>>^v>vvv<>v<<^>>v>v<>>^>^^v>><^<^<^^^vv^<><^^v<^<^<>^>^v>vv^v>^v<>v^^<<<^^<>^v<>^<^v^><>v<>^v>^vv^v^>>v>^v<<^>v<<^^v^v>^v<^^>>>>v><>^>vv>^vv<^v>^>v>v<^^<>v^>^v^>>v^^>^v^>v<^vv^^^v<><>^^^>v^^>^<^^><^v^>><^^v>^^^v^>>><><<<>><<<<>v>^>>>^^^v<^^^><<>>>^v<><>v<^vvvv>^<><>^<<<>v^^v^^>vv +<><^>^v^>v^^^<>^^^<><>>>>vv<^v>v>^^><<>v>^<^v^vv^<>>^^^^^v^>vv^><^>>^v^v^^vvvv>><<vvv><><^^>v^>><>^<>^^v^^v>^>^^v^^>v^><^^v<^><>vv^<^^^>>vv^^<<<>>^^v^>v<^<^v>>>v>>><<>><>v^^v<>v>^v<<^^vv^<>v^v>^<<<>>v^<>v^>vv>v^^>v<>v>v>><>^<<^v^<^<^<^vv>>^>vv^^>>^<><>^>>vvv^>v^^>vv^vv<<>v><vv><<>>>^<^v<<<>v^<<>^<>>>v<>>^<^<^v^<^v>>v<v^<<<^<>^v<^^>v>^v<^^>v^v^>>v>v<<^>v^>v^>^^<<^^v<<^v<<^vvv^>^^>>><>^>^^>><v>>>^v>^>>v<^^v<>^vvv>^^>>>v^>v<<^<^v><^v>^^>^v>^<>v^^<>vv>v><><^v^>^^<<<<>><<>^^<<>v^>^^>^^vv<^^v^^>^>vv>>^<>v><v>v^^^vv^vv>vvv^>vv>vv^>>>v<^^><^>>vv>^><<><^><v>><>vv^<><<^<^<>^>v>v^v<<>v^><^^v<>^>vv^v>>>^^^v>>>^><<<^<^<^^v<<<>><>^^vvv>^vv>>^v<><^v<>v>^v^><>^v<v^^^><^>v^vv<<vv>v><^v<^^^><^^ +<^<^v>vvv^v<^v^^>vv^><><>vvv><>vv^^^>^<^^<<^v^v>^v^<<^>>v<^^<><^v^<>>>>^<<>^v^<<>><^<^><<>v^>^>v>vv^<vv^^^^vv>^>vv>^^v<^<>>><>vv>>vvv><^v>^v^v^<^>^vv><^<^>^><^<><<^^vv>>^>v^^^v<><^v^<><^>>v^^v<^>v>^^<>v<<^vv^v><^v^v<^vv^><><^^<>v^<<^^vv^<<>^v^^^<<<><<>>^>^>v><<>v^<<>v<^v^<><<^^<>vv>^vv^^v^v>^><^vvvv^v^>^<^^vvvv^<^v<^<<<>v>><>>^v^^><>^v>^v><<<^^^^^<<^><v^>v>v>v^^^^v><^>>^>^><>v>vv<<>>^><>v<><^<>>^^<^>^^^v^^<<>>vv>><^<<<<>^v<<^v^v<<>^>^vv>><>v<^^<>v^>v>>vv<^vv>>>>v<<>v><><^<<^<^><<<<>v>>v><>v<>v<^vv><<>v>>v>vv><^>><>>>^^^>v>^<>v<>v^<^v<>v^^^vvv^^v^vvv>vvv^v>>^<^>^v<^>>>^<>>^v<<>v<^<<^><>>>^<><^v^^><>><^>vv>^>vv<^v^>v^^v^>^<^>^vvv>>vv^^vv^><^^<<><^>^v^v>>^<^<^^^<<^>v>>^vvv>v>><^>^<^v><^v>^v^^<<^>^^<<>>vv^^<^ +<<<^<^v<^v>>v^^>><><^>vv>^^^vvv<<>^>v>^><<<<^vv^v>^>><<^vv>^^<>v>>>>><><^vv<>v<^><^>>>v<^>>v^<^>>>^>^>v^>vv>^>^vv<^^<^vv^<^><^<^^v^<><<^><^>>^^<^>^>^^<^v^>><^>>><><^^>v^v>vv^^v>^><<^<<<><<<^v>>>><<<>v<>^>^v^<>^><>^>><<<>>^v^vv^v^<^<<>^^<<^^>^^v<>^vv>v>v^^v^>^v<^^v>^<^v><<>^<^^v<^^v^<><<>^^<v>vv>><^>v>v<>^v>v<<<>v^<>vv<>^<^>vv^^<^<^>>><v^^vv><<^<>^<<<>v>vv^><^>><>><^^><^v>v>><>>v>>v^^<<>>v>vv^>^v>v<^>><>>vvv<^>^>^^^>^>^>^><>v><^>>vv><^v>>^>>v^<^<<>>v<>v>v^^v^<>><>><>^>v><^<>^><>v><<<^v<<>>^^<^^>v^>^>^>>v^v^>^^v>vv^v<vvv><>^^>vvv^>vvvv>^^^>^<^^>v<^vvv<<>^<<<>^>^v>v>v^><><^>>>>^>^<^^^><>vvvvv^vv>^>^>>v^v^vv^>^>>v>>^^v>>^^><>v<^<<>>^>>^^><^>>v><^>v^^><^>v^<<>^><^^>>^><vv>>^^<<>>>^><<^v>v<v^>v<<>v diff --git a/2024/go/day16/day16.go b/2024/go/day16/day16.go new file mode 100644 index 0000000..cbf3814 --- /dev/null +++ b/2024/go/day16/day16.go @@ -0,0 +1,225 @@ +package day16 + +import ( + "adventofcode2024/utils/dijkstra" + "adventofcode2024/utils/grid2d" + "adventofcode2024/utils/inputs" + "fmt" + _ "strings" +) + +type ( + Vec struct{ x, y int } + Dir struct{ x, y int } + Cell rune + Move struct { + p Vec + d Dir + } + Maze struct { + height, width int + start Vec + end Vec + grid *grid2d.Grid[Cell] + } +) + +const ( + WALL Cell = '#' + CORRIDOR Cell = '.' + START Cell = 'S' + END Cell = 'E' + PATH Cell = '*' +) + +var ( + NORTH = Dir{0, -1} + EAST = Dir{1, 0} + SOUTH = Dir{0, 1} + WEST = Dir{-1, 0} + DIRECTIONS = []Dir{NORTH, EAST, SOUTH, WEST} +) + +func Part1(input string) int { + maze := Maze{}.Parse(input) + fmt.Println(maze) + data := inputGraph(*maze) + graph := dijkstra.CreateGraph(data) + data.From.Label = "EAST" + path, dist := dijkstra.GetShortestPath(data.From, data.To, graph) + for _, p := range path { + maze.grid.Set(p.X, p.Y, PATH) + } + fmt.Println(maze) + return dist +} +func Part2(input string) int { + maze := Maze{}.Parse(input) + fmt.Println(maze) + data := inputGraph(*maze) + graph := dijkstra.CreateGraph(data) + data.From.Label = "START" + data.To.Label = "NORTH" + paths, _ := dijkstra.GetAllShortestPaths(data.From, data.To, graph) + bestPaths := make(map[Vec]struct{}) + for _, path := range paths { + for _, node := range path { + bestPaths[Vec{x: node.X, y: node.Y}] = struct{}{} + } + } + return len(bestPaths) +} + +func inputGraph(maze Maze) dijkstra.InputGraph { + data := dijkstra.InputGraph{} + data.From = dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"} + data.To = dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"} + for y := 0; y < maze.height; y++ { + for x := 0; x < maze.width; x++ { + if maze.grid.Get(x, y) == WALL { + continue + } + for _, dir := range DIRECTIONS { + nx, ny := x+dir.x, y+dir.y + if nx < 0 || ny < 0 || nx >= maze.width || ny >= maze.height { + continue + } + if maze.grid.Get(nx, ny) == WALL { + continue + } + for _, d := range getAllowedDirections(dir) { + ss := dirToString(dir) + ds := dirToString(d) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: x, Y: y, Label: ss}, + Destination: dijkstra.Point{X: nx, Y: ny, Label: ds}, + Weight: func() int { + if dir == d { + return 1 + } else { + return 1001 + } + }(), + }) + } + } + } + } + + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"}, + Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(EAST)}, + Weight: 0, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"}, + Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(WEST)}, + Weight: 0, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"}, + Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(NORTH)}, + Weight: 0, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"}, + Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(SOUTH)}, + Weight: 0, + }) + + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"}, + Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(EAST)}, + Weight: 0, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"}, + Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(WEST)}, + Weight: 2000, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"}, + Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(NORTH)}, + Weight: 1000, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"}, + Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(SOUTH)}, + Weight: 1000, + }) + + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "EAST"}, + Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "NORTH"}, + Weight: 1000, + }) + + return data +} + +func dirToString(dir Dir) string { + switch dir { + case NORTH: + return "NORTH" + case EAST: + return "EAST" + case SOUTH: + return "SOUTH" + case WEST: + return "WEST" + default: + return "UNKNOWN" + } +} + +func getAllowedDirections(direction Dir) []Dir { + switch direction { + case NORTH: + return []Dir{NORTH, EAST, WEST} + case SOUTH: + return []Dir{SOUTH, EAST, WEST} + case WEST: + return []Dir{WEST, NORTH, SOUTH} + case EAST: + return []Dir{EAST, NORTH, SOUTH} + } + return []Dir{} +} + +func (m Maze) Parse(input string) *Maze { + m.grid = inputs.ToGrid2D(input, "\n", "", '?', func(c string) Cell { return Cell(c[0]) }) + m.height, m.width = m.grid.SizeY(), m.grid.SizeX() + for y := 0; y < m.height; y++ { + for x := 0; x < m.width; x++ { + c := m.grid.Get(x, y) + switch c { + case WALL, CORRIDOR: + m.grid.Set(x, y, c) + case START: + m.grid.Set(x, y, CORRIDOR) + m.start = Vec{x, y} + case END: + m.grid.Set(x, y, CORRIDOR) + m.end = Vec{x, y} + } + } + } + return &m +} + +func (m *Maze) String() string { + s := "" + for y := 0; y < m.height; y++ { + for x := 0; x < m.width; x++ { + if y == m.start.y && x == m.start.x { + s += string(START) + } else if y == m.end.y && x == m.end.x { + s += string(END) + } else { + s += string(m.grid.Get(x, y)) + } + } + s += "\n" + } + return s +} diff --git a/2024/go/day16/day16_test.go b/2024/go/day16/day16_test.go new file mode 100644 index 0000000..426b7b5 --- /dev/null +++ b/2024/go/day16/day16_test.go @@ -0,0 +1,47 @@ +package day16 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`############### +#.......#....E# +#.#.###.#.###.# +#.....#.#...#.# +#.###.#####.#.# +#.#.#.......#.# +#.#.#####.###.# +#...........#.# +###.#.#####.#.# +#...#.....#.#.# +#.#.#.###.#.#.# +#.....#...#.#.# +#.###.#.#.#.#.# +#S..#.....#...# +###############`) + require.Equal(t, 7036, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`################# +#...#...#...#..E# +#.#.#.#.#.#.#.#.# +#.#.#.#...#...#.# +#.#.#.#.###.#.#.# +#...#.#.#.....#.# +#.#.#.#.#.#####.# +#.#...#.#.#.....# +#.#.#####.#.###.# +#.#.#.......#...# +#.#.###.#####.### +#.#.#...#.....#.# +#.#.#.#####.###.# +#.#.#.........#.# +#.#.#.#########.# +#S#.............# +#################`) + require.Equal(t, 64, r) +} diff --git a/2024/go/day16/input.txt b/2024/go/day16/input.txt new file mode 100644 index 0000000..67000f9 --- /dev/null +++ b/2024/go/day16/input.txt @@ -0,0 +1,141 @@ +############################################################################################################################################# +#.....#.....#...#.................#...#.......#.........#...#.......#...#.......#.......#...#...#.....#...#.......................#...#....E# +#.###.#.#.#.###.#.###.###.#######.#.#.#.#.###.#.###.###.#.#.#.###.#.###.#.#.#####.###.#.###.#.#.#.#.#.#.#.#.#####.#.###.#.#######.#.#.#.###.# +#...#.#.#.#...#.....#...#.#.....#...#...#.#...#.#...#...#.#.#...#.#...#.#.#...#...#...#.....#.#.#.#.#...#...#.....#.#.#.....#.....#.#.#...#.# +#.#.###.#.###.#.#####.#.#.###.###########.#.#####.###.###.###.###.###.#.#.#.#.#.###.#######.#.#.#.#.#########.#####.#.#.#####.#####.#.###.#.# +#.#.....#.#.#.#...#...#.#...#.....#.....#.#.....#.#.#.#.........................#.#.......#.#.#...#.....#...#.#...#.....#...#.#...#.#.....#.# +#.#######.#.#.#.###.#.#.###.#.#.#.#.#.###.#####.#.#.#.#.###.###.###.#.###.#.#.#.#.#######.###.#.#####.#.#.#.#.###.###.#.#.#.#.#.#.#.#######.# +#...#...#.#...#.#...#.#...#.#.#.#...#.#.......#...#...#...#...#.#.....#...#.#...#.......#...#...#.....#...#.#.....#...#...#...#.#.........#.# +###.#.###.#.#####.###.###.#.###.#.#####.###.#.#####.###.#.###.#.###.###.###.#####.#########.#.#.###.#.###.#.#####.#.###.#######.###########.# +#...#...#.#.#.....#...#...#.#...#.#...#.#...#.#...#...#.#.....#...#...#.#...........#.........#.#...#.#...#.........#.#.#.......#...........# +#.#####.#.#.#.#######.#.###.#.###.#.#.#.#.###.#.#####.#########.#.#.###.#.#####.###.#.#####.#.#.#.###.###.###.#####.#.#.#.#######.#########.# +#.#.....#.#...#.......#...#.#.#.....#.#...#.#.#...............................#...#.#...#...#...#.#.#.....#.#.....#...#.#.#.....#.......#...# +#.#.###.#.#####.#.###.###.#.#.#.#.###.#.###.#.###############.#.#.#.#.#####.#.#####.###.#####.#.#.#.#####.#.#####.###.#.#.#.###.#######.###.# +#.#...#.#.....#.#.....#...#...#.#...#.#.....#.#.....#.................................#...#...#...#...#...................#...#...#...#...#.# +#.###.#.#####.###.#.#.#.#####.#.#.#.#.#######.#.###.#.#######.###.#.#.#.#.###.#.#########.#.#.#.#.#.###.#.#####.#.###.#.#.###.#.#.###.###.#.# +#.#...............#.#...#...#.#...#.........#.....#.#.#.......#...#.#.#.#.#...#.#.....#...#.#.....#.....#.....#.#.....#.#.#...#.#...#...#...# +#.#.#####.#.#####.#.#####.#.#.###.#########.#.#####.#.#.#######.###.#.###.#.###.#.###.#.#.#.#.#########.#.###.#########.#.#####.###.###.###.# +#.#.#.....#.....#.#.#.....#.....#.....#...#.#.#.....#.#.#.......#.#.#.....#.#...#.#...#.#.#.#.........#...#.#.........#.#.........#...#...#.# +#.#.#.#####.#####.#.###.#######.#####.###.#.###.#####.#.#####.###.#.#######.#.#.#.#.#.#.###.#.#######.#.###.###.#.###.#.#########.###.#.#.#.# +#.#.......#...#...#...#...#...#.....#...#.#.#...#.#.....#.....#.....#...#...#.#...#.#.#.....#.#.......#.#.......#...#.#.....#.......#.#.....# +#.#######.###.#.#####.#.###.#.#########.#.#.#.###.#.#####.###.#######.#.#.#########.#.###.###.#.#######.#.#####.###.#.#####.#.###.###.#.#.#.# +#.....#...#...#...#.#.#.#...#.#.........#.#...#...#...#...#.#.#.......#...#.......#.#.#.......#.........#.........#.#...#.#.#...#.....#.#.#.# +#####.###.#.#.###.#.#.###.###.#.#########.#####.#####.#.#.#.#.#.#############.###.#.#.###########.#######.#######.#.#.#.#.#.###.#######.#.#.# +#...#...#.#.#.#...#.......#.#.#.#.......#.......#.....#.#.#...#.............#.#...#.#...#.......#.........#...#...#...#...#...#...#.....#.#.# +#.#.###.#.#.#.#.###########.#.#.###.###.#.#.#####.#####.#.#####.#.#########.#.#.###.###.#.###.#.###########.###.#####.###.#.#####.#.#####.#.# +#.#.#.#.#.#.#.#.....#.....#...#...#.#.....#.#.....#.#...#.....#.#.#.......#.#.#...#.#.....#...#.#.....#.....#...#.......#.#.................# +#.#.#.#.###.#.#####.#.###.#.#####.#.#######.#.#####.#.#####.#.#.#.#####.###.#.###.#.#########.#.#.###.#.###.#.###.#####.#.###.###.###.#.###.# +#.....#.#...#.....#...#...#...#...#.#.....#.#...#.#...#.....#...#.#.....#...#.#...#...#.......#...#...#...#.#.#...#.....#.#.#.........#...#.# +#.#####.#.#######.#####.#####.#.###.#.###.#####.#.#.#####.#.#####.#.#####.###.#.#####.#.###.#######.#######.#.###.#.#####.#.###############.# +#.#.....#...#...#...#...#.....#.#...#.#.#.......#.#.......#.....#.#.....#.#...#.......#.#...#.......#.....#.#.....#.....#.......#.........#.# +#.#.#######.#.#.###.#.#######.#.#.###.#.#########.#############.#.#.###.#.#.###.#########.#.#.#########.#.#.#####.#####.#####.###.#######.#.# +#...#.....#...#...#.#.......#...#...#...#.........#.......#...#...#...#.#.#...#.#...#...#.#.#.#.....#...#.#.....#.....#.....#.#...#.....#...# +#.###.#.#.#.#####.#########.###.###.###.###.###.#.#.###.#.#.#.#########.#.#.#.###.#.#.#.#.###.#.###.#.###.#.#.#######.#####.#.#.###.#.#####.# +#.#.....#.#.#...#...#.......#.............#.#.#.#.#.#...#...#.#.........#.#.#.....#.#.#.#.#.....#.....#.#.#.#...........#...#.#...#.#.#...#.# +#.#.#.###.###.#.###.#.#########.#####.###.#.#.#.#.#.#.#########.#.#####.#.#########.#.#.#.#.#######.###.#.###########.###.###.###.#.###.#.#.# +#...#...#.....#.....#.#.........#.....#...#.....#.#.#.#.....#...#.#...#.#.#.......#...#.#...#.#...#...#...#.............#.#...#...#.....#.#.# +#####.#.#######.#####.#.#.#############.#####.#.###.#.#.###.#.###.#.#.###.#.#####.#####.#.###.#.#.#.#.#.###.###########.#.###.#.###.#####.#.# +#.#...#.......#.#.....#.#.#...#.............#.#.#...#.....#.....#...#...#.#...#.#...#...#.#...#.#.#.#.#...#.#...#.....#.#.#.....#...#...#...# +#.#.#.###.#####.#.#####.###.#.#.###########.###.#.#############.#######.#.###.#.###.#.###.#.###.#.#.#.#.#.#.#.#.#.#####.#.#.#.###.###.#.##### +#...#...#...#...#.#.#.......#.#.#.......#.....#.....#.........#.........#...#.#.....#...#...#...#.#.#.#.....#.#.#.........#.#.#...#...#.#...# +#.###.#.###.#.###.#.#.#######.#.#.#####.#####.#.#####.#######.#.#####.#.###.#.#.#######.###.#.###.#.###.###.#.#.#.#########.#.#.#####.#.#.#.# +#.......#...#...#.#.........#...#...#.#.....#.#...#...#.#.....#.#.....#...#...#...#...#.....#...#.#.....#.....#.#.#.........#.#.......#.#.#.# +#.###.#.#.###.#.#.###.#########.###.#.#####.#.#####.###.#.#######.#######.#######.#.#.#.###.###.#.#.#####.#####.#.#.#########.#########.#.### +#.#.....#.....#.#...#.#.......#.#...#.....#.#.......#.....#.......#...#.....#...#...#.#.#...#...#.#.#.....#...#.#.#.#.........#.....#...#...# +#.#.#.#######.#.#.#.###.#.###.###.###.#####.#.#.###.#.#########.#.#.#.#.#####.#.###.#.###.#.#.###.###.#####.#.#.###.#.#####.###.###.#.###.#.# +#.#.#.....#...#.#.#.#...#...#.#...#.....#...#.........#.........#.#.#.#.#.....#.....#.#...#...#.#...........#.#...#.#.#...#.......#.#...#.#.# +#.#.#.###.#.#.#.#.#.#.#####.#.#.#######.#.###.#########.#.###.#####.#.###.#####.#####.#.###.###.#######.#########.#.###.#.#####.#.#.###.###.# +#.#.#.....#.#.#.#.#.#.......#.#.#...#...#.#.#...#.#.....#.#...#.........#...#...#...#.#.#...#...#.....#.#.....#...#.....#.#.....#.#.........# +#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#.###.#.#.#####.#####.###.###.###.#.###.#.#.#.#.###.#.#.###.###.###.#.#.#####.#.#.###.#.#########.# +#.#.......#.#.#...#.#.#.#.#.#.#...#.#.#...#.#...#...#...#.#...#...#...#...#.#.....#.#.#.#.#...#.#.#...#...#.#.#.#.........#...#.#.....#...#.# +#.#######.#.#.###.#.#.#.#.###.#####.#.#.###.#.#####.#.#.#.#.#.###.###.###.#.#######.#.#.#.#.#####.#.###.###.#.#.#####.#.#####.#.#######.#.#.# +#.#.......#.#...#.#.#...#...#.#.......#.#...#.....#.#.#...#.#...#.....#.#.#.......#...#.....#.....#...#.#.....#.....#.#.#.....#.........#.#.# +#.#.#####.#.###.#.#.#.#.###.#.#.#######.#.#.#####.#.#.###.#.###.#.###.#.#.#######.###########.#######.#.#.#########.###.#.###############.#.# +#.#...#...#.#...#.#...#.#...#...#.#.....#.#.#.....#.#.#...#...#.........#...................#.#.....#.#.#.........#...#...#.......#.......#.# +#.###.#.#.#.#####.###.###.#.#####.#.#####.#.#.#####.#.#.#####.#########.###################.#.#.#####.#.###.###.#.###.#####.#######.#######.# +#...#...#...#.....#.......#.....#.#.#.....#...#.........#...#...#.....#...#...........#.#.....#.......#...#.....#.......#...#.....#.#.....#.# +###.###.#.###.#####.###########.#.#.#.###########.#.#####.#.###.#.###.###.#.#########.#.#.#######.#####.#.###########.#.#.#.#.###.#.###.###.# +#...#...#...........#.#.....#.....#.#.#.......#...#.#.....#.....#.#.#.#...#.#.#.....#.#.....#...#.....#.#.................#.#.#.#.#...#.....# +#.#.#.#####.###.#####.#.###.#.###.#.#.###.###.#.#####.#######.###.#.#.#####.#.#.#.###.#.#####.#.#####.#####.#########.#####.#.#.#.#.#.###.### +#.#.#.#...#.#.......#.....#.....#.#.#.#...#.#.#.......#.....#...#.#.#...#.......#.....#...#...#.#...#.....#.........#...#...#.#...#.#...#...# +#.###.#.#.###.###.#.###########.#.#.#.#.###.#.#.#.#####.###.###.#.#.###.#.#########.#######.###.###.#####.#########.###.#.###.#.#######.##### +#.#...#.#.....#...#.#.........#...#.#...#...#.#.....#...#...#...#.#.#...#.........#.........#.#.#...#...#...#.....#...#.#...#.#...#...#.....# +#.#.###.#.#####.#.#.#.#######.#.###.#####.###.#.###.#.###.#######.#.#.###.#######.###########.#.#.###.#.###.#.#####.###.#####.###.#.#.#.###.# +#...#...#.....#.#...#.#.....#.#.#...#.....#...#.....#...#.........#.#.#.........#.......#...#...#.....#...#.#...........#...#...#...#.......# +#####.###.#.###.#####.#.#.###.###.###.#####.#######.###.###.#######.#.#########.#.#.###.###.#.#########.###.#########.###.#.###.#######.###.# +#.....#...#.....#.....#.#.......................#...#...#.........#.#.......#...#.#...#...#.#.......#...#...#.........#...#...#.......#.....# +#.#####.#.#######.#################.#########.#.#.###.###.#####.#.#.#######.#####.###.###.#.#.#.###.#.#.#.###.###.#####.#####.#######.#.##### +#.#.#...#...#.................#.#...#.........#.......#.#.#.#...#...#...#...#...#.......#.#.#.#...#...#.#.....#...#...#...#.........#.......# +#.#.#.#.#.###.###.###########.#.#.###.#################.#.#.#.#####.#.#.#.###.#.#########.#.#.###.#####.#######.###.#.###.#########.###.###.# +#.#.#...#.........#.....#.....#.#.#.....#...#.............#.#.#.....#.#.......#.........#.#.#...#.........#.......#.#...#...#.....#.#.....#.# +#.#.###.#.#######.#####.#.#####.#.#.###.#.#.###.###.###.#.#.#.#######.#################.#.#.###.#.#.#####.#.#######.###.###.#.###.#.#.###.#.# +#.#...#.#.....#.........#.#.....#.#.#...#.#...#...#...#.#.....#.......#.........#.......#.#...#.#.#.....#.#.#...#...#...#...#...#.#...#.#.#.# +#.#.###.#.###.###########.#.###.#.###.###.###.#######.###.#.#.#.###############.#.#######.#.#.#.###.###.#.#.#.#.#.###.#.#.#####.#.#####.#.#.# +#.#.....#.#...............#.#...#...#...#...#.#.....#.......#...........#.....#.#.#.......#.#.#.....#.#.#.#...#.#.#.......#.....#.......#...# +#.#.###.#.#.#################.###.#.#.#.###.#.#.###.#######.###########.#.###.#.#.#.###.#.###.###.#.#.#.###.#####.#.###########.#.#####.###.# +#.#...#...#.#...#...#.........#...#.#.#...#.#...#.#.#.....#.#.....#...#.#...#...#...#.#...#...#...#...#.....#.....#.....#.......#.....#...#.# +#.###.#.#####.#.#.#.#####.#.###.#.#.###.#.#.#####.#.#.###.###.###.#.#.#.###.#########.#####.#.#.#####.###.#.#.#######.###.#####.#####.###.#.# +#.#...#.......#.#.#...#...#.#...#...#.....#...#...#...#.#.....#.#...#.#...#.#.#.......#.......#.....#.......#.#.#.....#...#...#.#.....#...#.# +#.#.###.###.###.#.###.#.###.#.#######.#.#####.#.#.#####.#######.#####.###.#.#.#.###.#.#.#####.#####.#########.#.#.#####.###.#.#.###.###.#.#.# +#.#.#.....#.....#.#.....#.#.#.........#.......#.#.........#.............#.#.#.....#.#.#.#.....#.....#.......#.#...#...#.#...#.#...#...#.#.#.# +#.#.#.#.#.#.#####.#######.#.#####.#####.#.#########.###.#.#.#####.#####.#.#.#######.#.###.###.#.#.###.#####.#.###.#.#.#.###.#.#.#.#.#.#.#.#.# +#.#...#.#...#...............#...#.#...#.#.#.......#...#.#.#...#.......#.#.#.#.......#.#...#.#.#.#.......#...#.......#.......#...#.#.#...#.#.# +#.#####.#.#.###.#######.#####.#.#.#.#.###.#.#####.#####.#.#.#.#.#.###.#.#.#.#.#######.#.###.#.#.#######.#.###.###########.#####.#.#.#######.# +#.....#...#...#.#...#...#.....#...#.#.#...#.#...........#.#...#.#...#.#.#.#.#...#...#...#.#...#.........#.#.....#...#.............#.#.......# +#.#.#.#.###.#.###.#.#.###.#.#######.#.#.###.#.#.#########.#.#.#.###.#.#.#.#.#.#.#.#.#####.#.#########.###.#.#####.#.#.#########.###.#.####### +#.#.#.......#.#...#.#.....#.......#.#...#...#.#.#.......#...#.#.#...#...#.#...#...#.#.........#.......#...#...#...#.#.#...#.....#...#...#...# +#.#.###.#####.#.###.#.#########.###.#######.#.###.#####.###.###.#.###.#######.#####.#.#######.###.#.###.#####.#.###.#.#.###.###.#.#.###.###.# +#...#...........#.#.#...........#...#.......#.........#.....#...#...#.#.....#.....#.......#...#...#.#...#.....#.#.....#...#...#.#.#...#.....# +#.###.#.###.#.#.#.#.###########.#.###.#.#################.###.#####.#.#.###.#####.#.#####.#.###.###.#.#####.###.#######.#.###.#.#.###.#####.# +#.....#.....#.....#.......#.....#...#.#...#.............#...#.....#.#.#...#.....#.#.....#.#.....#...#.#...#...#.....#...#.....#.#.#.#.....#.# +#.#######.###########.###.#.#######.#.###.#.###.#.#####.#########.#.#.###.###.#.#.###.###.#######.###.#.#.#.#######.#.#########.#.#.###.#.#.# +#.#.....#.......#...#...#.#...#.........#...#.#...#...#...........#.....#...#.....#...#...#.........#...#.#.#.......#.#.#.....#...#...#.#.#.# +#.#.###.#########.#.###.#.###.#.#######.#####.#.###.#########.#.#.#########.#######.###.###.#######.#####.###.#######.#.#.###.#.###.#.#.###.# +#.#.#.#...........#.#...#.#...#...#...#...........#.....#...#.#.#...#.....#.....#.....#.#.....#...#.#...#.....#.....#.#.....#.......#.#.#...# +#.#.#.#############.#####.#.#####.#.###.#.#########.###.#.#.#.#####.#.#.#####.#.#######.###.###.#.#.#.#.#######.###.#.#############.###.#.### +#.#.#...#...#.......#.....#.#.#...#.#...#.......#.....#.#.#.#.....#...#.....#...#.....#.....#...#.#...#...#.....#...#.............#...#...#.# +###.#.###.#.#.#######.#####.#.#.#.#.#.#####.###.#.###.#.#.#.#.#.#########.#.#.###.###.###.#.#.###.#.#####.###.###.###############.###.#####.# +#...#...#.#.#...#...#.........#.#.........#...#...#...#.#.#.#.#.............#.....#.#...#.#...#...#.#...#.....#...#.......#.....#...#.......# +#.###.#.#.#.#.#.#.#.###.#####.#.#########.#.#.#####.#.#.#.#.#######.###.#.#########.###.#.#####.#.###.#.#######.###.#####.#.#.#.###.#.#####.# +#.................#...#.....#.#.....#.#...#.#.....#.#.#.#.#.........#...#.....#.......#.#.#.....#.#...#.#.........#.....#.#...#.#.#...#...#.# +#.#.#.#.#####.#.#.###.#####.#######.#.#.###.#####.#.#.#.#.#########.#######.#.#.#####.#.#.#.#####.#.###.#.#.#####.#####.###.#.#.#.#####.###.# +#...........#...#.#.........#...#...#.#...#.....#...#.#.#...#.....#.#.....#.#...#.#...#.#.#.#.....#.#.#.#.#.#...............#.#.......#.....# +#.###.#.###.#.###.#########.#.#.#.###.###.#####.#####.#.###.#####.#.#.###.#.###.#.#.#.#.#.#.#.#####.#.#.###.#.###########.###.#########.##### +#.#.........#.....#.........#.#.#.#.#.....#...#...#.#.....#.....#...#.#...#.#.....#...#.#.#.#.#.....#.#...#.#.#...#.......#.#...#.......#...# +#.###.#.#.###.###.#.#####.###.#.#.#.#.#####.#.#.#.#.#####.#####.#.###.#.###.#.###.###.#.###.#.#.#####.###.#.#.#.###.#######.###.#.#########.# +#.......#...#.......#...#.#...#.#.#...#.....#.#.#.#.....#.#...#.#...#.#.#...#...#...#.#...#.#.#.#.......#.#.....#...#.....#...#...#.#.......# +#####.#.###.#.#####.#.###.#.###.#.###.###.###.###.#.###.#.#.#.#.###.#.#.###.###.#####.###.#.#.#.#.#.###.#.#######.#####.#.###.#####.#.###.#.# +#.......#.....#.....#...#.#.#...#...#.....#.#.#...#...#.#.#.#.#.#...#.#.......#.#.....#...#.#.#.#.#...#.#...#.....#.....#...#...#.......#...# +#.#####.#######.#####.#.#.#.#.#####.#######.#.#.#####.#.#.###.#.#####.#.#.###.#.#.#####.###.###.###.#.#.###.#.#####.#######.#.###.#########.# +#.#.....#.......#.....#.#.#.#.......#...........#...#.#.#.....#.....#...#.....#.#.....#.#.#...#.....#.....#.........#.....#.#.....#.....#...# +#.#.###.#.#######.#.###.#.#.#########.###########.#.#.#.#####.#####.###.#######.#.#####.#.#.#.#######.#####.###.#.###.#.###.#.#.###.###.#.#.# +#.#.#.....#.....#.#...#.#.#.....#...#...#...#.#...#.#.#.....#.#.......#.....#.....#...#.#.#.#.........#.....#.#.#...#.#.....#...#...#.#...#.# +#.#.#.#.###.#####.#.#.#.#.#####.#.#.#####.#.#.#.###.#.###.###.#.###.#.#####.#######.#.#.#.#.###.#####.#.###.#.#.#.#.#.###.#.###.#.###.#####.# +#.#.#.#.....#...#...#.#.#.....#...#.......#.#.#.#.#.#.#.#.....#.#.......#.#.#.....#.#.....#.#.......#.#.#...#.#.#...#...#.#...#...#.......#.# +#.#.#.#.#####.#.#.#.#.#.###.###.###########.#.#.#.#.#.#.#######.#.#####.#.#.#.###.#.#####.#.#.#####.#.#.#.###.#.#.#.#####.###.#.###.#####.#.# +#...#.#.......#.#...#.#.....#...#.........#.#.#...#.#.......#.#.#.#...#...#...#...#...#...#.#.....#...#.#.....#.#.#.....#...#...#.#.#.......# +#.###.#.#######.#####.###.#.#.#.#.#####.###.#.###.#.#######.#.#.###.#.###.#####.#.###.#.#.#.###.#.###.#.#####.#.#.#####.#.#.###.#.#.#.#.###.# +#.#...#.#...#...#...#...#.#...#.#.....#.....#.....#.......#...#.....#.#.#.#.....#...#.#.#...#...#.#.......#...#.#.....#.#.........#.#.#.....# +#.#.###.#.#.#.#.#.#.###.#.#####.#.#.#.#######.#####.#.#####.#.#######.#.#.#.#########.#.#####.#.#.#.#####.#.#.#.#####.#.###.#.#.###.#.#####.# +#.#.#...#.#.#.#.#.#.....#...#...#...#.#.......#...#.#.#.....#...#...#.#...#.....#...#.#.......#.#.........#.#.#.......#...#.#...#...#.......# +#.#.#.###.#.#.#.#.#######.###.#.#####.#########.#.###.#.#####.#.###.#.#########.#.#.#.###.#.#####.#########.#.#######.#.#.#####.#.#########.# +#...#.....#.#.#.#...#...#...#.#.....#.........#.#...#.#.#.....#.....#.#.........#.#...#.#.#.....#.#...#.....#.......#.#.#...#...#.#.....#...# +###########.#.#.###.#.#.###.#.###.###########.#.###.#.#.#.#######.###.#.#######.#.#####.#.#.###.#.#.###.###.#######.#.#.###.#.#.#.#.#.#.#.#.# +#.#.......#.#.#...#.#.#...#.#.....#.......#.#.#.......#.#.........#...#.........#.....#...#.#.....#.#.....#.......#.#.#...#.#.#...#.#.#.#.#.# +#.#.#####.#.#.###.#.#.#.#.#.#####.#.#.###.#.#.#.#.###.#.###.###.#.#.#.#######.#####.#.#.###.###.###.#.#####.#####.#.#.###.#.#.#.#####.#.#.#.# +#.......#.#.#...#.#.#.#.#.#...#.....#...#...#.#.#.#...#...#...#...#.#.#.....#.#.........#.#...........#...#...#.#...#.#...#.#.......#.#...#.# +#########.#.###.#.#.#.#.#.#.#.#.#####.#.#.###.#.#.#######.#.#.#####.#.#.#.###.#.#####.###.#####.#######.#.###.#.#####.#.###.#######.#.#####.# +#.......#...#...#.#.#.#.#.#.#.........#...#...#.#.#...#...#.#.....#.#.#.#...#...#...#.#...#...#.......#.#.#.........#.#...#...#.#...........# +#.#####.#####.###.#.#.#.###.#########.###.#.#####.#.#.#.#########.#.#.#.###.#####.#.#.#.#.#.#.#.#####.#.#.###########.#######.#.#.###.#.##### +#...#.........#...#.#.#...#.#.......#...#...#.....#.#...#.........#.#.#...#.#.....#.#.#.#.#.#.......#.#.#.........#...#.....#.#.............# +#.#.###########.###.###.#.#.#######.#.#.#####.#####.#####.#######.#.#.#.#.#.#.###.#.#.#.#.#.#######.#.#.#########.#.###.###.#.#.#.#####.###.# +#.#.#.......#.............#.....#...#.....#.......#.#.....#...#...#.#.#...........#.#.#.#.#.#...#...#...#.#.......#.#...#.......#.........#.# +###.#.#####.###.#.###.###.###.#.#.###.#.###.#####.#.#.###.#.#.#.###.#.#.#######.###.#.###.#.###.#.#######.#.#######.#.#.#######.#######.#.#.# +#...#.....#...#.....#.#...#...#.#.....#...#...#...#.#.#...#.#.#...#.#.#...#.#...#...#...#.#.....#.....#.......................#...#.....#.#.# +#.#######.###.#.###.#.#.#.#.#.#.#.###.#.#.###.#.###.#.#.###.#.###.#.#.###.#.#.#########.#.###.#####.#.###.#.#.###.#.#########.#.#.#.###.#.#.# +#.......#.#.#...#...#...#...........................#.#.#...#.#...#.#...#...#.....#...#.#.....#.....#...#.#.#...................#.#.#...#...# +#.#.###.#.#.###.#.#.#########.#.###.#.#.###.#.#########.#.#.###.###.#######.#####.#.#.#.#.#####.#######.#.#.###.#.#########.#.#.###.#.#.###.# +#.#.#.#...#...#.#.#.......................#.#.#.........#.#.#...#.#.#.....#.#...#...#...#...#...#.......#.#.....#...#.......#.#.#...#.....#.# +#.#.#.#####.#.#.###.###########.#########.#.#.#####.#####.#.#.###.#.#.#.###.#.#.#############.###.#######.#########.#.#######.#.#.#####.#.#.# +#S..........#.#...........................#.........#.....#.......#...#.......#...............#...................#...........#.........#...# +############################################################################################################################################# diff --git a/2024/go/day17/day17.go b/2024/go/day17/day17.go new file mode 100644 index 0000000..312b2d7 --- /dev/null +++ b/2024/go/day17/day17.go @@ -0,0 +1,91 @@ +package day17 + +import ( + "encoding/json" + "fmt" + "regexp" + "strings" + "golang.org/x/exp/slices" + + + "adventofcode2024/utils" + +) + +type Opcode int + +const ( + adv Opcode = 0 + bxl Opcode = 1 + bst Opcode = 2 + jnx Opcode = 3 + bxc Opcode = 4 + out Opcode = 5 + bdv Opcode = 6 + cdv Opcode = 7 + +) + +func Part1(input string) string { + m := regexp.MustCompile(`[\d,]+`).FindAllString(input, -1) + a := utils.MustAtoi(m[0]) + b := utils.MustAtoi(m[1]) + c := utils.MustAtoi(m[2]) + + var pgm []int + json.Unmarshal([]byte("["+m[3]+"]"), &pgm) + + fmt.Printf("%d %d %d %v\n", a, b, c, pgm) + out := fmt.Sprint(run(a, b, c, pgm)) + out = fmt.Sprint(strings.Trim(strings.ReplaceAll(out, " ", ","), "[]")) + return out +} + +func Part2(input string) int { + m := regexp.MustCompile(`[\d,]+`).FindAllString(input, -1) + b := utils.MustAtoi(m[1]) + c := utils.MustAtoi(m[2]) + + var pgm []int + json.Unmarshal([]byte("["+m[3]+"]"), &pgm) + + fmt.Printf("%d %d %v\n", b, c, pgm) + + a := 0 + for n := len(pgm) - 1; n >= 0; n-- { + a <<= 3 + for !slices.Equal(run(a, b, c, pgm), pgm[n:]) { + a++ + } + } + return a +} + +func run(a, b, c int, pgm []int) (output []int) { + for ip := 0; ip < len(pgm); ip += 2 { + operand := pgm[ip+1] + combo := []int{0, 1, 2, 3, a, b, c}[operand] + + switch pgm[ip] { + case int(adv): + a >>= combo + case int(bxl): + b ^= operand + case int(bst): + b = combo % 8 + case int(jnx): + if a != 0 { + ip = operand - 2 + } + case int(bxc): + b ^= c + case int(out): + output = append(output, combo%8) + case int(bdv): + b = a >> combo + case int(cdv): + c = a >> combo + } + } + return output +} \ No newline at end of file diff --git a/2024/go/day17/day17_test.go b/2024/go/day17/day17_test.go new file mode 100644 index 0000000..ba2ffcc --- /dev/null +++ b/2024/go/day17/day17_test.go @@ -0,0 +1,25 @@ +package day17 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`Register A: 729 +Register B: 0 +Register C: 0 + +Program: 0,1,5,4,3,0`) + require.Equal(t, "4,6,3,5,6,3,5,2,1,0", r) +} + +func TestPart2(t *testing.T) { + r := Part2(`Register A: 2024 +Register B: 0 +Register C: 0 + +Program: 0,3,5,4,3,0`) + require.Equal(t, 117440, r) +} diff --git a/2024/go/day17/input.txt b/2024/go/day17/input.txt new file mode 100644 index 0000000..9d9d9cd --- /dev/null +++ b/2024/go/day17/input.txt @@ -0,0 +1,5 @@ +Register A: 61156655 +Register B: 0 +Register C: 0 + +Program: 2,4,1,5,7,5,4,3,1,6,0,3,5,5,3,0 diff --git a/2024/go/day18/day18.go b/2024/go/day18/day18.go new file mode 100644 index 0000000..9faee97 --- /dev/null +++ b/2024/go/day18/day18.go @@ -0,0 +1,126 @@ +package day18 + +import ( + "adventofcode2024/utils" + "adventofcode2024/utils/dijkstra" + "adventofcode2024/utils/grid2d" + "fmt" + "strings" +) + +type ( + Vec struct{ x, y int } + Dir struct{ x, y int } + Cell rune + Move struct { + p Vec + d Dir + } + Maze struct { + height, width int + start Vec + end Vec + grid *grid2d.Grid[Cell] + } +) + +const ( + WALL Cell = '#' + CORRIDOR Cell = '.' + START Cell = 'S' + END Cell = 'E' + PATH Cell = '*' +) + +var ( + NORTH = Dir{0, -1} + EAST = Dir{1, 0} + SOUTH = Dir{0, 1} + WEST = Dir{-1, 0} + DIRECTIONS = []Dir{NORTH, EAST, SOUTH, WEST} +) + +func Part1(input string) int { + maze := Maze{}.Parse(input, 1024) + fmt.Println(maze) + data := inputGraph(*maze) + graph := dijkstra.CreateGraph(data) + path, dist := dijkstra.GetShortestPath(data.From, data.To, graph) + for _, p := range path { + maze.grid.Set(p.X, p.Y, PATH) + } + fmt.Println(maze) + return dist +} +func Part2(input string) int { + maze := Maze{}.Parse(input, 2877) + fmt.Println(maze) + data := inputGraph(*maze) + graph := dijkstra.CreateGraph(data) + _, count := dijkstra.GetShortestPath(data.From, data.To, graph) + return count +} + +func inputGraph(maze Maze) dijkstra.InputGraph { + data := dijkstra.InputGraph{} + data.From = dijkstra.Point{X: maze.start.x, Y: maze.start.y} + data.To = dijkstra.Point{X: maze.end.x, Y: maze.end.y} + for y := 0; y < maze.height; y++ { + for x := 0; x < maze.width; x++ { + if maze.grid.Get(x, y) == WALL { + continue + } + for _, dir := range DIRECTIONS { + nx, ny := x+dir.x, y+dir.y + if nx < 0 || ny < 0 || nx >= maze.width || ny >= maze.height { + continue + } + if maze.grid.Get(nx, ny) == WALL { + continue + } + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: x, Y: y}, + Destination: dijkstra.Point{X: nx, Y: ny}, + Weight: 1, + }) + } + } + } + + return data +} + +func (m Maze) Parse(input string, bytes int) *Maze { + m.grid = grid2d.NewGrid(71, 71, CORRIDOR) + for _, line := range strings.Split(input, "\n") { + if bytes == 0 { + break + } + in := strings.Split(line, ",") + x := utils.MustAtoi(in[0]) + y := utils.MustAtoi(in[1]) + m.grid.Set(x, y, WALL) + bytes-- + } + m.start = Vec{0, 0} + m.end = Vec{70, 70} + m.height, m.width = m.grid.SizeY(), m.grid.SizeX() + return &m +} + +func (m *Maze) String() string { + s := "" + for y := 0; y < m.height; y++ { + for x := 0; x < m.width; x++ { + if y == m.start.y && x == m.start.x { + s += string(START) + } else if y == m.end.y && x == m.end.x { + s += string(END) + } else { + s += string(m.grid.Get(x, y)) + } + } + s += "\n" + } + return s +} diff --git a/2024/go/day18/day18_test.go b/2024/go/day18/day18_test.go new file mode 100644 index 0000000..aec55d5 --- /dev/null +++ b/2024/go/day18/day18_test.go @@ -0,0 +1,6915 @@ +package day18 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`2,5 +20,1 +63,59 +21,29 +37,59 +33,63 +14,33 +70,15 +21,34 +62,5 +45,54 +45,60 +48,53 +33,58 +23,35 +22,3 +33,0 +63,62 +44,67 +52,55 +5,19 +42,55 +45,0 +57,3 +15,45 +41,62 +1,39 +63,19 +39,59 +39,3 +48,7 +61,65 +31,1 +54,51 +11,14 +53,62 +67,68 +65,16 +17,45 +21,24 +55,3 +30,15 +4,39 +69,19 +69,57 +41,57 +43,24 +19,11 +18,27 +3,48 +8,13 +41,66 +67,67 +61,62 +5,37 +18,19 +29,64 +13,14 +42,57 +33,67 +0,19 +67,53 +47,59 +19,3 +51,54 +53,69 +42,5 +7,26 +59,65 +50,69 +3,27 +26,9 +43,3 +17,7 +15,11 +12,31 +43,5 +50,65 +9,5 +29,3 +21,6 +65,15 +43,57 +15,37 +50,53 +67,51 +29,1 +47,7 +55,54 +52,51 +47,54 +17,26 +12,43 +65,51 +1,27 +15,22 +63,15 +7,37 +69,49 +57,59 +7,36 +60,7 +66,7 +18,35 +13,36 +21,19 +15,3 +46,9 +30,3 +53,7 +8,7 +66,3 +49,69 +35,65 +48,5 +33,6 +1,31 +26,5 +44,59 +68,13 +45,67 +9,16 +51,55 +57,5 +2,33 +57,64 +31,2 +1,19 +5,12 +19,37 +40,67 +10,19 +21,12 +3,31 +51,1 +4,29 +52,65 +47,5 +17,19 +70,47 +11,19 +57,10 +54,55 +39,53 +61,56 +49,55 +28,37 +21,30 +9,45 +43,69 +57,19 +29,10 +60,63 +19,32 +66,5 +53,45 +53,49 +47,57 +26,1 +17,34 +65,7 +7,28 +41,63 +6,1 +69,69 +0,13 +5,28 +10,1 +38,67 +37,13 +3,7 +39,12 +2,15 +54,65 +35,53 +63,20 +13,30 +52,47 +13,3 +69,55 +55,61 +37,4 +7,35 +57,4 +35,69 +5,3 +63,64 +40,69 +59,5 +32,61 +66,61 +43,64 +40,1 +49,3 +68,65 +3,38 +21,4 +49,56 +18,29 +23,12 +7,11 +16,29 +8,11 +10,25 +39,67 +59,60 +3,19 +26,31 +7,9 +51,58 +49,67 +53,65 +65,59 +67,9 +43,58 +55,51 +69,7 +6,39 +49,59 +10,37 +4,43 +54,5 +3,28 +69,16 +67,7 +4,37 +37,1 +27,2 +62,59 +45,70 +25,35 +65,53 +31,7 +53,59 +1,10 +67,10 +65,67 +30,67 +17,1 +67,59 +31,61 +59,59 +65,69 +51,59 +61,66 +13,15 +29,65 +27,1 +65,65 +68,53 +53,11 +5,17 +20,35 +43,68 +3,30 +59,7 +3,39 +45,63 +7,31 +3,13 +51,5 +23,39 +20,3 +67,0 +37,3 +46,61 +65,70 +15,1 +17,11 +66,63 +32,23 +51,0 +3,1 +17,3 +13,6 +59,3 +19,31 +1,24 +41,3 +4,49 +40,57 +63,6 +16,17 +22,25 +39,60 +11,34 +56,7 +38,57 +55,53 +35,66 +1,11 +64,19 +50,3 +9,38 +19,8 +64,61 +3,17 +8,33 +13,1 +5,9 +50,7 +1,34 +41,65 +48,57 +14,13 +17,31 +56,1 +6,15 +24,25 +23,2 +69,13 +45,52 +15,23 +15,27 +27,28 +60,3 +31,30 +19,35 +42,53 +19,27 +61,1 +65,50 +53,2 +52,61 +15,20 +42,7 +67,20 +11,23 +29,54 +6,17 +41,53 +47,63 +68,51 +21,21 +19,6 +53,61 +23,29 +53,9 +19,29 +21,10 +2,41 +10,3 +49,9 +42,59 +12,1 +45,7 +19,28 +3,35 +69,6 +43,4 +17,21 +47,3 +52,7 +65,22 +45,62 +16,5 +51,3 +48,11 +7,33 +40,3 +26,35 +37,63 +49,68 +11,26 +54,67 +64,23 +21,17 +5,49 +63,65 +23,13 +58,1 +61,54 +69,56 +47,60 +11,7 +9,35 +57,58 +45,66 +1,23 +7,21 +17,12 +11,17 +34,3 +25,25 +22,35 +57,65 +17,17 +1,5 +12,33 +36,63 +19,15 +7,38 +53,55 +21,25 +42,1 +17,23 +35,67 +33,3 +56,63 +56,59 +3,2 +42,67 +65,56 +45,5 +5,33 +21,22 +9,42 +3,14 +21,14 +59,53 +64,53 +33,25 +11,35 +9,1 +63,16 +47,49 +53,60 +47,55 +39,1 +63,60 +35,63 +9,31 +55,68 +57,57 +68,15 +11,39 +62,69 +41,45 +55,57 +5,13 +9,14 +1,32 +17,5 +19,19 +19,30 +1,29 +55,56 +6,35 +21,8 +13,0 +4,25 +16,33 +69,9 +53,67 +67,17 +52,67 +41,59 +24,1 +51,7 +54,7 +3,22 +7,13 +41,61 +45,3 +21,33 +37,53 +11,13 +45,8 +48,1 +43,13 +17,46 +1,33 +41,69 +22,19 +19,38 +19,12 +45,57 +53,6 +15,36 +35,68 +9,21 +43,65 +5,41 +7,7 +68,61 +60,1 +7,23 +21,28 +23,34 +63,69 +7,40 +51,64 +66,51 +43,61 +49,63 +69,11 +50,51 +53,13 +17,24 +47,65 +32,67 +4,15 +38,1 +58,63 +23,21 +61,59 +15,21 +11,27 +33,65 +2,1 +20,25 +11,3 +55,67 +5,31 +43,53 +63,66 +3,29 +65,55 +36,69 +64,1 +3,23 +11,6 +52,57 +61,4 +63,17 +61,69 +3,33 +65,4 +21,16 +27,11 +1,3 +5,39 +69,54 +63,47 +1,36 +27,27 +33,61 +25,37 +61,14 +15,26 +55,1 +7,17 +29,11 +11,12 +2,19 +66,55 +45,59 +29,29 +26,39 +8,17 +45,65 +11,37 +2,39 +0,29 +5,27 +16,31 +67,65 +68,63 +26,25 +9,30 +3,36 +48,65 +59,51 +63,1 +7,41 +23,28 +1,15 +18,1 +4,41 +43,63 +21,27 +67,22 +52,69 +7,18 +68,49 +3,12 +18,17 +9,41 +19,13 +1,17 +3,26 +59,61 +57,66 +53,63 +39,69 +3,3 +67,69 +50,57 +9,19 +1,13 +55,58 +49,6 +7,3 +47,1 +12,37 +59,63 +61,67 +8,45 +41,1 +8,1 +39,63 +8,27 +15,19 +1,25 +61,57 +47,66 +46,5 +0,39 +4,3 +67,8 +9,43 +64,67 +49,47 +63,14 +51,57 +0,47 +8,3 +21,15 +63,57 +46,3 +5,21 +15,31 +57,12 +13,18 +21,23 +67,15 +21,7 +23,14 +67,55 +63,63 +21,13 +67,58 +51,49 +25,26 +2,31 +56,51 +32,69 +55,7 +31,62 +65,57 +55,65 +5,24 +7,20 +11,15 +19,14 +65,21 +5,1 +67,5 +67,63 +67,49 +68,57 +19,21 +37,65 +11,1 +47,61 +33,7 +28,3 +12,21 +47,68 +41,70 +65,1 +69,23 +5,25 +47,11 +49,61 +1,35 +59,57 +1,37 +33,1 +53,57 +59,1 +49,65 +27,15 +60,11 +61,63 +5,34 +69,15 +9,20 +66,65 +49,62 +35,3 +55,5 +4,19 +21,20 +47,67 +59,68 +24,27 +41,5 +67,3 +21,3 +47,9 +65,17 +9,47 +23,3 +41,67 +65,63 +15,29 +55,49 +3,6 +69,17 +22,17 +48,51 +33,64 +51,65 +9,27 +58,55 +25,21 +69,24 +9,22 +64,63 +19,1 +9,36 +17,27 +54,49 +38,69 +8,5 +46,67 +60,57 +68,11 +0,7 +19,17 +39,65 +27,3 +9,40 +64,57 +17,25 +3,25 +19,9 +47,8 +58,61 +23,22 +21,11 +41,7 +18,9 +11,45 +51,67 +52,3 +8,43 +9,25 +69,8 +67,11 +2,27 +63,51 +65,61 +53,5 +7,19 +18,3 +67,18 +45,9 +55,63 +15,15 +47,64 +54,3 +13,31 +19,5 +41,64 +15,16 +37,67 +53,52 +12,9 +15,4 +25,34 +43,59 +2,17 +23,33 +57,8 +16,15 +57,67 +29,0 +66,69 +19,7 +42,61 +66,15 +67,61 +51,63 +36,7 +1,16 +2,23 +66,59 +67,2 +61,64 +56,65 +56,5 +15,2 +19,33 +15,28 +49,53 +5,35 +12,3 +65,18 +69,53 +11,33 +37,2 +47,69 +57,69 +11,5 +34,7 +3,45 +63,5 +15,33 +35,1 +17,20 +23,11 +6,31 +17,35 +50,61 +51,4 +64,3 +62,55 +3,9 +49,60 +13,35 +68,69 +21,37 +44,63 +2,9 +15,7 +49,5 +67,13 +9,39 +9,33 +9,24 +2,11 +5,23 +46,55 +17,22 +9,23 +48,3 +45,13 +47,58 +60,59 +5,18 +14,3 +24,11 +56,69 +43,55 +57,63 +55,10 +17,33 +53,47 +36,3 +13,16 +5,32 +64,7 +32,3 +51,51 +10,17 +13,37 +40,59 +11,31 +13,19 +19,10 +49,1 +34,1 +10,27 +42,9 +61,2 +58,57 +13,33 +25,3 +43,2 +23,31 +24,37 +59,66 +12,29 +7,10 +31,65 +19,23 +39,64 +22,39 +18,5 +55,62 +23,18 +39,62 +53,50 +21,31 +40,55 +58,5 +23,40 +67,66 +69,59 +23,25 +39,61 +1,7 +21,1 +21,5 +57,61 +51,53 +53,51 +5,29 +69,47 +30,27 +5,14 +10,45 +18,23 +7,29 +55,60 +40,7 +49,7 +14,31 +15,25 +68,19 +57,49 +12,23 +7,30 +60,49 +50,9 +16,1 +22,9 +57,55 +15,24 +65,49 +69,25 +59,69 +28,69 +4,21 +23,36 +58,69 +69,61 +23,8 +5,8 +43,1 +9,37 +55,69 +3,11 +66,53 +70,59 +14,19 +15,17 +9,13 +59,55 +36,65 +69,67 +8,23 +23,32 +3,8 +65,3 +69,65 +29,5 +9,15 +61,61 +13,34 +1,1 +3,4 +68,45 +45,56 +33,69 +67,48 +38,65 +6,21 +0,3 +63,68 +50,67 +15,13 +63,58 +9,34 +67,1 +48,63 +60,69 +69,51 +57,47 +70,67 +51,47 +59,54 +57,7 +43,67 +4,45 +59,67 +45,2 +67,57 +62,1 +69,52 +31,63 +69,21 +31,15 +27,9 +3,37 +19,25 +63,55 +6,3 +53,3 +20,21 +13,17 +23,30 +6,23 +43,7 +17,29 +57,2 +21,32 +51,69 +7,1 +44,5 +57,1 +33,66 +45,69 +59,8 +9,3 +13,23 +11,22 +65,5 +1,9 +24,17 +61,3 +49,57 +12,19 +13,28 +69,12 +10,51 +53,53 +13,47 +31,69 +24,43 +69,63 +20,17 +67,21 +44,55 +33,68 +7,15 +45,1 +39,55 +39,4 +69,60 +23,27 +45,61 +51,61 +25,1 +63,3 +37,69 +33,5 +17,15 +9,32 +7,39 +63,54 +65,47 +29,19 +53,43 +60,33 +57,45 +5,6 +47,27 +39,25 +48,47 +53,36 +43,18 +49,21 +41,21 +23,19 +52,35 +39,45 +55,17 +29,39 +57,51 +55,45 +54,27 +33,26 +40,19 +44,17 +57,20 +37,45 +27,64 +31,13 +41,13 +5,7 +9,57 +10,69 +23,47 +1,51 +0,69 +49,12 +3,58 +15,9 +21,53 +53,27 +45,11 +63,42 +27,56 +6,11 +27,12 +27,31 +23,41 +35,41 +15,61 +61,27 +21,43 +41,43 +17,56 +11,66 +41,28 +51,37 +41,27 +38,59 +39,47 +59,41 +11,41 +26,59 +59,16 +29,35 +1,45 +33,41 +55,29 +65,39 +47,50 +28,5 +39,43 +35,21 +54,25 +43,16 +51,43 +31,17 +23,53 +37,21 +43,22 +22,55 +57,17 +15,49 +36,57 +11,48 +56,27 +36,39 +53,35 +8,51 +29,46 +61,29 +67,37 +31,35 +42,47 +63,41 +37,18 +43,36 +52,21 +63,9 +57,48 +29,36 +39,27 +35,59 +55,41 +25,53 +45,47 +19,66 +29,44 +61,5 +49,23 +14,59 +27,59 +19,58 +16,13 +44,51 +29,24 +13,7 +26,19 +37,20 +41,40 +28,27 +65,38 +41,47 +47,19 +49,49 +46,39 +38,55 +13,65 +53,44 +31,49 +36,5 +68,5 +42,45 +3,5 +4,63 +59,23 +23,56 +15,59 +37,52 +67,35 +11,11 +1,63 +11,25 +19,47 +31,33 +61,36 +27,46 +35,44 +46,21 +9,56 +5,59 +27,41 +35,37 +28,13 +39,20 +61,23 +36,15 +35,9 +7,8 +52,15 +14,39 +51,21 +65,25 +35,12 +58,15 +66,35 +23,7 +35,62 +63,25 +68,1 +23,64 +68,33 +65,28 +44,29 +19,67 +29,43 +47,51 +25,67 +2,45 +55,21 +37,43 +32,21 +58,51 +69,33 +13,29 +41,11 +47,23 +65,35 +23,45 +31,64 +41,50 +1,65 +25,39 +42,39 +44,47 +67,39 +32,35 +43,38 +51,29 +9,6 +41,24 +3,67 +57,31 +41,44 +53,19 +19,41 +14,61 +15,41 +46,49 +39,35 +62,51 +51,23 +32,9 +23,60 +1,47 +49,27 +57,36 +19,52 +43,49 +49,35 +21,50 +49,39 +53,38 +51,19 +21,57 +43,45 +33,38 +45,41 +1,56 +39,22 +21,63 +48,49 +47,30 +37,39 +4,61 +34,13 +26,51 +47,39 +19,45 +31,59 +3,52 +17,54 +69,45 +15,35 +49,11 +17,69 +55,13 +64,39 +57,33 +45,40 +28,21 +11,9 +64,29 +33,19 +21,60 +32,19 +47,25 +57,53 +31,4 +17,61 +69,5 +19,39 +46,15 +60,51 +9,50 +27,40 +63,29 +59,36 +11,55 +25,61 +30,55 +35,25 +27,69 +23,1 +9,65 +43,37 +27,42 +19,49 +56,45 +13,49 +35,7 +33,47 +43,11 +38,33 +35,49 +63,39 +41,20 +13,48 +1,60 +43,30 +7,45 +55,19 +65,19 +53,15 +33,53 +29,49 +51,45 +13,50 +34,23 +20,55 +10,11 +12,39 +17,53 +11,65 +27,37 +8,53 +65,24 +65,45 +61,45 +7,65 +59,37 +27,21 +39,39 +31,67 +45,23 +53,10 +59,22 +25,42 +1,57 +54,45 +13,10 +43,23 +37,51 +51,13 +40,35 +48,45 +36,27 +1,59 +39,51 +57,32 +31,5 +35,5 +8,69 +25,29 +39,9 +19,53 +29,40 +61,43 +7,62 +39,17 +3,54 +27,57 +67,43 +23,49 +53,17 +29,47 +25,41 +9,62 +61,35 +27,38 +23,9 +67,38 +41,49 +22,45 +43,15 +25,17 +13,69 +31,52 +29,68 +29,37 +30,37 +7,63 +37,27 +55,39 +65,13 +50,23 +59,11 +25,11 +25,65 +26,15 +55,37 +47,18 +20,69 +12,69 +8,47 +61,17 +53,12 +54,41 +9,69 +33,59 +57,37 +47,47 +61,39 +40,13 +69,3 +18,55 +22,47 +65,41 +31,45 +21,9 +38,27 +61,30 +61,55 +3,57 +51,11 +20,57 +41,51 +61,15 +40,37 +53,23 +49,38 +22,69 +1,61 +16,59 +20,65 +17,63 +51,17 +26,45 +24,31 +61,49 +38,41 +22,51 +29,16 +11,52 +34,35 +30,61 +37,33 +58,19 +9,29 +29,17 +61,9 +2,51 +7,59 +49,51 +35,55 +8,59 +29,41 +37,47 +23,67 +30,53 +15,69 +33,27 +49,31 +69,29 +59,43 +3,41 +43,10 +59,19 +35,27 +61,11 +27,25 +49,30 +28,57 +15,53 +39,29 +45,46 +16,41 +28,9 +27,61 +37,15 +29,18 +15,47 +17,57 +25,19 +37,25 +11,64 +45,12 +61,46 +14,67 +6,51 +19,65 +32,17 +21,65 +46,29 +51,28 +25,6 +19,51 +35,61 +47,41 +45,45 +39,49 +36,25 +19,59 +32,25 +25,47 +30,41 +62,19 +39,50 +41,41 +44,43 +53,37 +33,14 +40,51 +62,47 +19,48 +55,43 +63,13 +68,43 +65,29 +53,25 +23,59 +39,11 +54,17 +59,35 +63,53 +13,11 +35,58 +12,5 +63,21 +25,20 +45,37 +34,47 +24,55 +3,53 +11,67 +46,33 +25,31 +56,23 +36,43 +8,65 +61,19 +37,41 +41,31 +31,27 +37,23 +64,49 +6,67 +9,17 +11,40 +17,13 +26,11 +67,41 +23,57 +13,52 +50,17 +21,35 +33,51 +59,40 +27,5 +36,33 +3,62 +35,60 +58,43 +13,56 +24,67 +17,37 +29,53 +63,23 +20,51 +24,39 +13,12 +2,55 +62,41 +28,49 +39,44 +20,47 +52,27 +35,39 +59,25 +35,32 +49,29 +65,31 +35,52 +54,47 +29,51 +37,9 +13,13 +53,31 +45,39 +9,7 +39,13 +17,65 +37,31 +24,5 +30,5 +2,65 +28,7 +49,17 +55,55 +37,24 +13,5 +3,68 +49,13 +56,15 +21,49 +41,37 +43,26 +57,25 +3,47 +29,21 +47,43 +29,42 +55,11 +35,19 +6,55 +53,34 +23,17 +31,12 +4,69 +15,43 +66,33 +59,33 +13,57 +17,42 +10,67 +59,13 +50,37 +33,45 +35,40 +38,7 +21,41 +9,63 +53,1 +33,37 +13,66 +50,15 +1,55 +19,36 +18,47 +61,26 +49,25 +59,38 +5,43 +37,62 +11,61 +22,67 +61,18 +33,55 +18,61 +25,9 +62,49 +56,29 +65,44 +59,29 +33,39 +55,9 +49,37 +13,55 +35,22 +41,39 +48,19 +30,21 +13,9 +21,39 +37,61 +29,15 +27,52 +19,55 +47,35 +51,33 +8,55 +63,7 +35,46 +11,54 +29,69 +15,52 +31,46 +25,62 +63,43 +41,26 +61,41 +7,64 +43,35 +47,33 +40,33 +45,36 +57,41 +57,23 +57,27 +11,29 +5,69 +63,37 +7,25 +34,9 +57,24 +23,5 +59,18 +23,55 +48,41 +11,47 +16,57 +60,25 +60,23 +20,53 +66,47 +56,33 +30,11 +15,46 +26,33 +64,33 +51,10 +35,13 +5,55 +33,21 +10,55 +35,11 +9,53 +23,44 +63,11 +69,1 +21,45 +6,47 +42,17 +32,41 +17,49 +61,12 +35,45 +31,51 +55,20 +31,25 +7,51 +41,15 +45,31 +31,8 +29,13 +3,43 +27,70 +59,21 +43,41 +67,45 +59,46 +56,43 +5,66 +18,39 +39,10 +1,22 +68,25 +15,48 +68,41 +2,67 +37,46 +15,44 +25,69 +43,47 +61,28 +61,31 +43,20 +48,37 +19,44 +24,9 +27,16 +37,29 +51,40 +38,25 +62,31 +31,23 +47,21 +13,53 +12,61 +37,8 +5,47 +17,67 +49,44 +31,19 +25,57 +13,67 +3,65 +63,8 +3,69 +29,63 +11,63 +27,60 +31,37 +29,61 +25,27 +32,13 +1,53 +52,31 +57,35 +36,35 +67,32 +33,30 +4,57 +23,43 +39,31 +46,47 +5,61 +43,51 +51,9 +10,43 +5,63 +69,41 +7,60 +53,21 +45,35 +34,25 +37,35 +33,40 +64,9 +37,7 +9,49 +13,59 +70,43 +11,46 +43,34 +36,49 +29,9 +46,13 +31,38 +41,23 +65,33 +47,28 +54,37 +23,58 +33,33 +1,43 +7,67 +6,43 +63,33 +27,17 +49,41 +15,40 +43,21 +50,1 +61,21 +5,5 +51,48 +37,10 +44,49 +1,64 +55,31 +13,54 +47,31 +31,57 +45,49 +57,50 +52,25 +48,33 +61,13 +27,29 +31,28 +19,69 +23,15 +45,20 +65,42 +24,63 +55,47 +61,20 +40,29 +45,55 +11,59 +48,35 +25,5 +33,29 +15,10 +59,44 +41,29 +24,23 +43,27 +69,31 +37,38 +45,15 +51,15 +65,11 +5,46 +41,33 +62,37 +62,35 +53,20 +59,31 +9,67 +31,44 +46,37 +22,59 +27,19 +41,16 +25,4 +11,8 +31,9 +16,7 +28,61 +49,45 +45,21 +57,15 +50,25 +30,7 +14,69 +43,14 +33,49 +42,33 +67,36 +21,62 +51,38 +37,49 +62,9 +58,13 +35,43 +1,49 +57,46 +25,43 +5,67 +31,53 +59,9 +8,67 +13,63 +43,32 +33,42 +30,49 +0,63 +1,50 +21,59 +19,63 +36,55 +23,37 +67,27 +10,61 +5,56 +31,31 +47,13 +20,45 +28,31 +1,67 +15,62 +34,19 +55,40 +62,23 +2,47 +67,31 +39,5 +7,57 +15,70 +33,57 +28,53 +55,27 +7,5 +66,25 +47,22 +11,51 +23,51 +53,28 +61,33 +23,69 +65,37 +11,53 +31,3 +64,45 +7,69 +13,42 +31,34 +4,65 +68,21 +55,15 +41,55 +15,56 +39,33 +45,34 +25,15 +19,61 +21,67 +37,48 +24,53 +7,49 +37,30 +43,31 +5,15 +37,36 +31,41 +27,65 +25,13 +0,53 +37,57 +45,43 +15,65 +25,45 +33,48 +15,42 +15,38 +45,51 +3,55 +29,7 +39,23 +13,39 +20,63 +31,56 +45,27 +64,31 +27,39 +33,16 +25,14 +61,25 +21,55 +55,23 +43,39 +18,65 +15,67 +43,9 +30,59 +26,29 +41,17 +60,15 +25,23 +57,9 +24,15 +10,57 +17,59 +65,27 +52,45 +58,29 +70,31 +15,39 +55,35 +43,33 +17,55 +29,45 +55,14 +9,59 +53,16 +31,43 +15,5 +17,43 +62,43 +17,47 +59,28 +10,29 +67,29 +61,37 +69,36 +22,53 +43,43 +29,57 +48,15 +29,67 +61,47 +33,35 +51,31 +35,23 +27,13 +34,55 +27,18 +25,49 +25,63 +34,37 +39,38 +60,39 +55,25 +31,32 +53,39 +37,17 +39,21 +33,50 +68,27 +50,47 +26,53 +56,41 +15,51 +51,42 +11,43 +21,47 +35,33 +50,41 +31,11 +45,32 +31,29 +33,28 +15,57 +69,28 +23,63 +35,47 +55,22 +29,27 +29,59 +62,15 +27,67 +13,43 +53,24 +6,5 +29,50 +44,41 +10,63 +36,37 +1,58 +59,27 +39,37 +26,23 +25,33 +39,16 +15,50 +60,21 +3,63 +45,19 +46,41 +42,11 +5,57 +5,45 +4,53 +42,49 +49,33 +10,59 +21,69 +3,61 +30,19 +28,33 +21,42 +30,23 +69,37 +16,37 +33,17 +65,23 +38,53 +54,13 +43,19 +16,9 +34,61 +70,3 +38,49 +39,7 +37,42 +31,47 +15,54 +70,41 +50,21 +15,55 +61,44 +47,29 +54,9 +13,24 +18,69 +25,55 +45,10 +17,51 +52,13 +3,59 +27,53 +22,43 +45,25 +5,53 +39,19 +32,7 +13,51 +33,11 +13,61 +33,15 +59,39 +54,31 +63,31 +30,33 +50,35 +28,29 +22,65 +14,7 +13,64 +13,41 +35,30 +37,14 +27,63 +21,51 +23,23 +57,26 +66,29 +29,48 +35,50 +27,49 +51,35 +13,45 +69,35 +27,44 +13,27 +20,61 +37,19 +2,61 +33,9 +53,32 +61,53 +65,43 +44,13 +51,39 +35,17 +24,47 +27,55 +56,53 +31,36 +50,45 +51,30 +17,68 +29,33 +59,48 +47,45 +34,53 +41,19 +42,29 +45,44 +7,43 +63,45 +34,17 +51,25 +3,51 +37,12 +29,31 +3,42 +63,61 +66,13 +7,48 +27,43 +61,32 +59,49 +15,63 +3,15 +40,47 +35,31 +29,55 +26,57 +1,69 +65,10 +5,11 +24,21 +57,21 +41,25 +38,15 +37,5 +51,27 +41,30 +11,57 +63,26 +67,25 +29,23 +39,18 +17,39 +52,41 +57,39 +51,41 +25,50 +21,61 +35,15 +9,51 +69,30 +56,39 +49,20 +61,51 +27,23 +25,51 +49,16 +67,19 +63,35 +17,41 +56,17 +65,46 +63,40 +6,53 +37,28 +7,47 +32,53 +47,37 +59,45 +70,21 +49,32 +25,7 +26,67 +25,60 +65,26 +59,17 +9,55 +6,45 +11,21 +18,13 +25,68 +39,40 +11,50 +67,46 +45,33 +37,54 +7,58 +35,29 +55,33 +29,14 +23,61 +21,38 +57,11 +15,66 +38,45 +25,59 +40,43 +37,37 +51,18 +67,47 +18,51 +56,35 +49,43 +7,27 +13,44 +46,17 +31,39 +27,33 +5,51 +13,46 +68,39 +61,7 +39,26 +45,53 +43,29 +34,33 +39,15 +7,53 +33,44 +69,39 +62,11 +23,65 +59,15 +41,42 +55,59 +27,7 +50,33 +69,43 +32,59 +58,23 +29,58 +41,36 +49,24 +45,17 +55,34 +33,31 +16,61 +7,55 +31,21 +23,48 +46,45 +6,63 +41,14 +4,59 +35,57 +59,47 +49,28 +57,38 +63,27 +41,22 +13,21 +5,50 +47,26 +57,43 +53,22 +36,17 +57,13 +9,61 +66,39 +55,30 +16,67 +46,25 +13,25 +43,17 +9,11 +53,33 +35,20 +37,55 +58,33 +10,9 +44,23 +45,29 +33,10 +37,11 +63,67 +1,41 +64,35 +33,23 +19,43 +53,29 +47,17 +31,55 +13,58 +33,13 +59,42 +6,69 +43,25 +11,69 +47,15 +41,9 +25,64 +27,47 +47,42 +17,64 +47,53 +17,9 +20,67 +18,59 +13,26 +53,41 +29,26 +59,30 +33,56 +44,27 +26,47 +27,66 +3,21 +49,26 +29,66 +12,59 +41,35 +25,48 +33,32 +27,35 +39,57 +15,64 +37,22 +39,6 +5,65 +11,49 +65,9 +29,25 +49,15 +9,9 +66,41 +55,18 +41,52 +38,31 +59,52 +69,34 +27,51 +27,45 +59,10 +3,49 +29,22 +7,61 +35,35 +32,49 +67,33 +63,48 +20,41 +19,40 +1,21 +1,44 +57,29 +64,13 +49,14 +17,44 +40,9 +19,57 +69,27 +67,23 +63,49 +62,25 +47,24 +17,50 +35,51 +50,11 +32,47 +33,43 +49,19 +39,41 +67,30 +61,34 +43,60 +12,46 +70,22 +38,20 +14,44 +41,38 +22,52 +12,67 +2,7 +58,46 +34,30 +34,70 +6,46 +20,68 +7,24 +9,18 +33,20 +60,42 +67,24 +37,6 +0,61 +12,18 +20,10 +39,54 +69,0 +16,65 +40,63 +14,10 +34,21 +54,56 +16,21 +62,12 +23,24 +48,61 +70,29 +30,16 +0,66 +70,6 +6,52 +30,62 +35,14 +62,36 +48,58 +13,8 +28,60 +22,26 +66,17 +62,54 +40,53 +12,53 +23,54 +61,40 +43,66 +0,34 +15,68 +32,66 +22,10 +42,48 +28,6 +38,38 +55,28 +46,23 +16,68 +52,54 +5,52 +4,64 +57,42 +2,49 +38,12 +64,38 +28,52 +68,31 +68,52 +21,70 +16,16 +8,31 +9,66 +4,55 +11,68 +36,14 +42,16 +32,39 +54,64 +18,58 +52,46 +68,22 +7,0 +29,62 +0,44 +35,8 +18,67 +23,52 +58,42 +26,2 +32,57 +8,66 +30,20 +0,30 +12,6 +46,1 +49,2 +34,56 +16,52 +2,2 +48,24 +25,38 +41,34 +46,28 +32,26 +53,48 +34,69 +11,28 +3,64 +62,8 +12,48 +19,22 +4,11 +24,30 +22,31 +32,45 +19,68 +12,60 +7,32 +22,38 +25,58 +55,42 +47,70 +18,28 +66,62 +34,41 +44,57 +4,10 +53,64 +38,34 +12,22 +37,70 +0,42 +30,31 +35,54 +61,48 +58,34 +36,38 +66,43 +54,52 +39,66 +43,62 +60,52 +37,44 +42,22 +53,0 +70,25 +18,40 +69,20 +53,58 +21,18 +25,12 +0,67 +25,44 +22,14 +48,32 +48,38 +18,15 +52,30 +34,15 +52,43 +52,52 +46,63 +2,22 +10,21 +22,64 +37,58 +10,31 +21,64 +6,40 +0,58 +36,42 +24,2 +65,20 +0,1 +2,58 +21,26 +0,68 +62,26 +8,32 +38,17 +11,56 +19,18 +31,20 +43,70 +0,5 +3,10 +14,38 +14,37 +32,33 +18,44 +62,53 +6,29 +70,30 +42,21 +18,37 +23,38 +14,60 +46,59 +34,22 +10,48 +8,63 +68,20 +50,58 +44,32 +4,67 +40,14 +22,34 +6,25 +38,52 +38,48 +32,30 +38,54 +26,49 +5,30 +34,48 +45,28 +56,58 +17,60 +10,38 +44,70 +24,49 +7,12 +42,38 +38,13 +52,48 +40,2 +52,59 +20,52 +21,68 +44,44 +2,70 +10,6 +24,52 +40,48 +48,20 +70,20 +36,23 +36,58 +20,27 +58,4 +2,8 +26,38 +4,38 +36,60 +12,57 +34,49 +30,29 +48,50 +18,60 +22,21 +64,62 +31,50 +20,37 +20,33 +5,40 +34,46 +12,12 +17,32 +2,29 +44,28 +58,45 +32,63 +54,30 +12,42 +16,28 +8,16 +66,42 +12,49 +12,63 +26,68 +18,25 +44,21 +17,6 +34,34 +36,67 +2,13 +26,3 +70,0 +39,58 +17,14 +18,12 +43,50 +16,25 +2,34 +8,50 +62,6 +26,41 +50,40 +30,56 +18,49 +4,32 +16,60 +22,8 +15,6 +21,36 +4,58 +29,28 +47,40 +36,62 +34,14 +33,60 +8,44 +43,8 +60,55 +39,30 +24,24 +36,11 +47,48 +38,32 +22,58 +31,10 +38,60 +16,46 +10,5 +23,50 +0,14 +4,60 +10,64 +20,22 +66,37 +28,51 +27,26 +38,21 +30,43 +19,20 +0,28 +16,54 +40,46 +34,5 +56,42 +8,34 +41,68 +61,8 +50,63 +27,14 +36,8 +26,36 +30,70 +36,20 +70,33 +41,2 +70,19 +5,22 +38,10 +10,40 +28,42 +42,41 +46,42 +0,23 +70,46 +24,40 +16,39 +38,56 +26,50 +22,5 +40,56 +34,57 +52,64 +46,70 +8,26 +3,34 +32,52 +70,44 +12,24 +8,10 +28,50 +14,16 +20,56 +9,60 +8,20 +37,34 +49,22 +27,24 +17,10 +68,30 +22,62 +22,15 +58,35 +69,44 +14,20 +48,22 +48,25 +51,2 +26,21 +6,30 +12,26 +33,12 +5,60 +60,56 +0,70 +4,56 +56,50 +58,47 +46,0 +50,22 +52,68 +4,4 +32,36 +34,60 +30,17 +36,56 +62,42 +28,23 +3,50 +35,28 +39,34 +38,3 +30,12 +20,7 +18,57 +52,60 +6,50 +52,49 +4,13 +56,56 +8,70 +44,8 +70,1 +28,62 +42,42 +60,12 +50,28 +47,38 +60,43 +50,54 +51,50 +55,12 +31,18 +47,32 +18,16 +16,6 +62,32 +24,69 +2,54 +62,27 +40,32 +38,68 +8,36 +59,70 +52,16 +68,37 +24,18 +53,8 +14,70 +31,60 +32,4 +33,36 +64,14 +52,22 +31,22 +12,51 +16,38 +30,1 +48,40 +57,56 +69,40 +25,32 +50,60 +49,4 +30,64 +46,22 +28,48 +42,56 +2,43 +46,6 +6,41 +43,46 +20,59 +54,6 +58,64 +0,59 +41,10 +54,42 +62,63 +30,57 +4,17 +22,40 +60,44 +52,42 +28,30 +7,2 +0,15 +22,27 +70,38 +30,68 +5,64 +35,38 +0,20 +17,62 +55,70 +5,4 +56,60 +34,42 +60,61 +40,27 +38,44 +5,16 +14,51 +18,26 +46,46 +69,26 +48,14 +32,43 +10,28 +27,22 +54,20 +14,48 +67,26 +57,0 +4,70 +59,12 +51,6 +40,10 +59,20 +32,8 +34,2 +20,18 +62,44 +64,46 +20,58 +56,31 +54,69 +28,14 +0,17 +22,12 +52,0 +20,44 +34,8 +32,29 +65,30 +56,3 +26,52 +4,47 +22,1 +13,38 +62,65 +0,31 +44,42 +42,15 +42,10 +24,38 +10,62 +26,64 +48,64 +48,21 +43,56 +8,46 +4,7 +9,0 +30,14 +56,61 +68,34 +56,55 +13,40 +50,62 +8,2 +50,39 +18,68 +0,37 +4,5 +47,36 +14,24 +44,58 +56,25 +24,62 +6,13 +11,2 +20,5 +18,11 +51,16 +56,6 +53,70 +32,0 +34,51 +37,56 +18,41 +42,70 +24,20 +22,44 +28,46 +20,38 +36,34 +10,56 +43,44 +0,60 +1,70 +37,0 +58,12 +68,17 +66,14 +70,40 +61,58 +53,40 +60,19 +14,4 +3,20 +6,38 +53,18 +24,8 +14,43 +42,43 +50,4 +57,30 +7,50 +37,40 +64,65 +36,47 +66,34 +16,27 +70,34 +20,14 +60,27 +32,31 +66,48 +43,28 +64,28 +67,54 +13,70 +50,38 +42,58 +52,26 +24,29 +20,48 +17,30 +66,67 +68,64 +68,9 +14,68 +70,24 +38,5 +60,47 +11,60 +67,12 +0,43 +1,12 +56,16 +38,22 +24,68 +51,8 +38,63 +60,22 +36,54 +38,61 +66,45 +46,27 +48,8 +6,0 +27,30 +8,40 +32,60 +5,62 +62,67 +64,32 +52,37 +60,5 +70,64 +10,18 +63,52 +18,20 +34,39 +1,62 +51,34 +40,49 +28,38 +51,62 +8,54 +45,58 +5,10 +12,15 +68,8 +26,22 +35,34 +58,32 +32,34 +10,10 +6,7 +38,42 +62,57 +52,6 +40,22 +62,70 +58,6 +50,48 +41,46 +52,18 +60,2 +25,70 +5,0 +50,6 +39,2 +2,4 +62,45 +48,23 +57,34 +55,66 +18,14 +9,52 +24,22 +54,60 +49,52 +12,54 +54,14 +63,44 +56,64 +4,0 +20,50 +18,64 +1,18 +14,41 +16,35 +29,2 +66,52 +12,50 +42,68 +34,24 +56,57 +66,32 +57,60 +28,8 +22,66 +32,32 +52,58 +50,42 +4,36 +16,32 +65,58 +56,20 +42,0 +17,4 +34,68 +49,36 +32,58 +68,50 +19,16 +6,70 +40,38 +60,37 +50,49 +34,40 +51,70 +1,38 +13,32 +53,66 +6,32 +65,32 +32,22 +14,55 +38,30 +44,26 +66,8 +50,30 +48,31 +5,36 +52,19 +29,30 +24,50 +55,36 +46,69 +64,18 +44,0 +27,10 +68,32 +60,13 +12,17 +10,34 +18,18 +70,52 +10,8 +12,38 +16,70 +8,9 +58,65 +64,21 +70,4 +5,48 +22,49 +36,2 +18,30 +41,6 +10,44 +48,48 +60,14 +23,42 +46,36 +18,56 +40,18 +36,40 +24,59 +64,64 +40,11 +59,50 +14,57 +25,46 +65,0 +32,16 +24,4 +40,34 +50,36 +38,50 +20,30 +66,38 +14,40 +70,62 +6,58 +12,28 +62,60 +68,28 +36,29 +58,37 +45,68 +22,22 +40,65 +49,64 +24,65 +40,8 +0,12 +40,64 +70,66 +23,62 +66,49 +28,32 +47,44 +10,12 +29,8 +26,18 +28,16 +49,50 +7,6 +30,54 +52,10 +32,10 +1,0 +40,28 +7,52 +18,54 +5,42 +58,10 +54,40 +41,4 +10,22 +24,56 +44,36 +39,14 +12,2 +65,48 +20,16 +10,4 +56,66 +40,68 +16,19 +45,42 +20,43 +50,18 +40,15 +0,6 +18,62 +14,2 +51,44 +35,48 +54,68 +7,4 +30,25 +27,36 +48,9 +42,46 +57,54 +68,55 +34,59 +58,16 +70,65 +70,14 +24,12 +46,12 +30,39 +55,2 +38,8 +62,22 +3,70 +60,40 +7,44 +9,44 +16,58 +64,2 +22,46 +40,45 +23,0 +62,30 +46,18 +23,6 +27,48 +31,66 +66,30 +52,9 +29,20 +36,21 +69,10 +24,41 +8,38 +44,34 +37,66 +68,4 +34,28 +21,44 +28,70 +42,30 +35,42 +46,16 +6,8 +36,48 +8,61 +14,26 +62,0 +28,45 +46,7 +7,68 +32,40 +61,24 +32,1 +40,12 +58,2 +62,58 +0,2 +42,60 +13,68 +48,59 +6,18 +36,28 +61,0 +63,28 +58,8 +44,33 +59,6 +64,6 +12,62 +30,32 +39,56 +70,32 +67,44 +56,11 +38,6 +2,36 +60,50 +55,26 +58,66 +55,8 +48,17 +56,2 +64,0 +60,41 +64,24 +42,52 +30,13 +16,20 +30,44 +1,26 +47,34 +24,54 +56,8 +16,0 +2,32 +62,38 +70,56 +18,50 +9,28 +63,38 +30,18 +10,70 +44,25 +57,40 +28,26 +54,0 +36,12 +32,24 +44,62 +52,23 +19,54 +45,30 +51,68 +8,8 +48,62 +40,60 +48,6 +48,69 +22,36 +61,10 +62,28 +51,66 +14,18 +53,56 +29,52 +63,4 +46,50 +26,69 +52,56 +21,54`) + require.Equal(t, 304, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`2,5 +20,1 +63,59 +21,29 +37,59 +33,63 +14,33 +70,15 +21,34 +62,5 +45,54 +45,60 +48,53 +33,58 +23,35 +22,3 +33,0 +63,62 +44,67 +52,55 +5,19 +42,55 +45,0 +57,3 +15,45 +41,62 +1,39 +63,19 +39,59 +39,3 +48,7 +61,65 +31,1 +54,51 +11,14 +53,62 +67,68 +65,16 +17,45 +21,24 +55,3 +30,15 +4,39 +69,19 +69,57 +41,57 +43,24 +19,11 +18,27 +3,48 +8,13 +41,66 +67,67 +61,62 +5,37 +18,19 +29,64 +13,14 +42,57 +33,67 +0,19 +67,53 +47,59 +19,3 +51,54 +53,69 +42,5 +7,26 +59,65 +50,69 +3,27 +26,9 +43,3 +17,7 +15,11 +12,31 +43,5 +50,65 +9,5 +29,3 +21,6 +65,15 +43,57 +15,37 +50,53 +67,51 +29,1 +47,7 +55,54 +52,51 +47,54 +17,26 +12,43 +65,51 +1,27 +15,22 +63,15 +7,37 +69,49 +57,59 +7,36 +60,7 +66,7 +18,35 +13,36 +21,19 +15,3 +46,9 +30,3 +53,7 +8,7 +66,3 +49,69 +35,65 +48,5 +33,6 +1,31 +26,5 +44,59 +68,13 +45,67 +9,16 +51,55 +57,5 +2,33 +57,64 +31,2 +1,19 +5,12 +19,37 +40,67 +10,19 +21,12 +3,31 +51,1 +4,29 +52,65 +47,5 +17,19 +70,47 +11,19 +57,10 +54,55 +39,53 +61,56 +49,55 +28,37 +21,30 +9,45 +43,69 +57,19 +29,10 +60,63 +19,32 +66,5 +53,45 +53,49 +47,57 +26,1 +17,34 +65,7 +7,28 +41,63 +6,1 +69,69 +0,13 +5,28 +10,1 +38,67 +37,13 +3,7 +39,12 +2,15 +54,65 +35,53 +63,20 +13,30 +52,47 +13,3 +69,55 +55,61 +37,4 +7,35 +57,4 +35,69 +5,3 +63,64 +40,69 +59,5 +32,61 +66,61 +43,64 +40,1 +49,3 +68,65 +3,38 +21,4 +49,56 +18,29 +23,12 +7,11 +16,29 +8,11 +10,25 +39,67 +59,60 +3,19 +26,31 +7,9 +51,58 +49,67 +53,65 +65,59 +67,9 +43,58 +55,51 +69,7 +6,39 +49,59 +10,37 +4,43 +54,5 +3,28 +69,16 +67,7 +4,37 +37,1 +27,2 +62,59 +45,70 +25,35 +65,53 +31,7 +53,59 +1,10 +67,10 +65,67 +30,67 +17,1 +67,59 +31,61 +59,59 +65,69 +51,59 +61,66 +13,15 +29,65 +27,1 +65,65 +68,53 +53,11 +5,17 +20,35 +43,68 +3,30 +59,7 +3,39 +45,63 +7,31 +3,13 +51,5 +23,39 +20,3 +67,0 +37,3 +46,61 +65,70 +15,1 +17,11 +66,63 +32,23 +51,0 +3,1 +17,3 +13,6 +59,3 +19,31 +1,24 +41,3 +4,49 +40,57 +63,6 +16,17 +22,25 +39,60 +11,34 +56,7 +38,57 +55,53 +35,66 +1,11 +64,19 +50,3 +9,38 +19,8 +64,61 +3,17 +8,33 +13,1 +5,9 +50,7 +1,34 +41,65 +48,57 +14,13 +17,31 +56,1 +6,15 +24,25 +23,2 +69,13 +45,52 +15,23 +15,27 +27,28 +60,3 +31,30 +19,35 +42,53 +19,27 +61,1 +65,50 +53,2 +52,61 +15,20 +42,7 +67,20 +11,23 +29,54 +6,17 +41,53 +47,63 +68,51 +21,21 +19,6 +53,61 +23,29 +53,9 +19,29 +21,10 +2,41 +10,3 +49,9 +42,59 +12,1 +45,7 +19,28 +3,35 +69,6 +43,4 +17,21 +47,3 +52,7 +65,22 +45,62 +16,5 +51,3 +48,11 +7,33 +40,3 +26,35 +37,63 +49,68 +11,26 +54,67 +64,23 +21,17 +5,49 +63,65 +23,13 +58,1 +61,54 +69,56 +47,60 +11,7 +9,35 +57,58 +45,66 +1,23 +7,21 +17,12 +11,17 +34,3 +25,25 +22,35 +57,65 +17,17 +1,5 +12,33 +36,63 +19,15 +7,38 +53,55 +21,25 +42,1 +17,23 +35,67 +33,3 +56,63 +56,59 +3,2 +42,67 +65,56 +45,5 +5,33 +21,22 +9,42 +3,14 +21,14 +59,53 +64,53 +33,25 +11,35 +9,1 +63,16 +47,49 +53,60 +47,55 +39,1 +63,60 +35,63 +9,31 +55,68 +57,57 +68,15 +11,39 +62,69 +41,45 +55,57 +5,13 +9,14 +1,32 +17,5 +19,19 +19,30 +1,29 +55,56 +6,35 +21,8 +13,0 +4,25 +16,33 +69,9 +53,67 +67,17 +52,67 +41,59 +24,1 +51,7 +54,7 +3,22 +7,13 +41,61 +45,3 +21,33 +37,53 +11,13 +45,8 +48,1 +43,13 +17,46 +1,33 +41,69 +22,19 +19,38 +19,12 +45,57 +53,6 +15,36 +35,68 +9,21 +43,65 +5,41 +7,7 +68,61 +60,1 +7,23 +21,28 +23,34 +63,69 +7,40 +51,64 +66,51 +43,61 +49,63 +69,11 +50,51 +53,13 +17,24 +47,65 +32,67 +4,15 +38,1 +58,63 +23,21 +61,59 +15,21 +11,27 +33,65 +2,1 +20,25 +11,3 +55,67 +5,31 +43,53 +63,66 +3,29 +65,55 +36,69 +64,1 +3,23 +11,6 +52,57 +61,4 +63,17 +61,69 +3,33 +65,4 +21,16 +27,11 +1,3 +5,39 +69,54 +63,47 +1,36 +27,27 +33,61 +25,37 +61,14 +15,26 +55,1 +7,17 +29,11 +11,12 +2,19 +66,55 +45,59 +29,29 +26,39 +8,17 +45,65 +11,37 +2,39 +0,29 +5,27 +16,31 +67,65 +68,63 +26,25 +9,30 +3,36 +48,65 +59,51 +63,1 +7,41 +23,28 +1,15 +18,1 +4,41 +43,63 +21,27 +67,22 +52,69 +7,18 +68,49 +3,12 +18,17 +9,41 +19,13 +1,17 +3,26 +59,61 +57,66 +53,63 +39,69 +3,3 +67,69 +50,57 +9,19 +1,13 +55,58 +49,6 +7,3 +47,1 +12,37 +59,63 +61,67 +8,45 +41,1 +8,1 +39,63 +8,27 +15,19 +1,25 +61,57 +47,66 +46,5 +0,39 +4,3 +67,8 +9,43 +64,67 +49,47 +63,14 +51,57 +0,47 +8,3 +21,15 +63,57 +46,3 +5,21 +15,31 +57,12 +13,18 +21,23 +67,15 +21,7 +23,14 +67,55 +63,63 +21,13 +67,58 +51,49 +25,26 +2,31 +56,51 +32,69 +55,7 +31,62 +65,57 +55,65 +5,24 +7,20 +11,15 +19,14 +65,21 +5,1 +67,5 +67,63 +67,49 +68,57 +19,21 +37,65 +11,1 +47,61 +33,7 +28,3 +12,21 +47,68 +41,70 +65,1 +69,23 +5,25 +47,11 +49,61 +1,35 +59,57 +1,37 +33,1 +53,57 +59,1 +49,65 +27,15 +60,11 +61,63 +5,34 +69,15 +9,20 +66,65 +49,62 +35,3 +55,5 +4,19 +21,20 +47,67 +59,68 +24,27 +41,5 +67,3 +21,3 +47,9 +65,17 +9,47 +23,3 +41,67 +65,63 +15,29 +55,49 +3,6 +69,17 +22,17 +48,51 +33,64 +51,65 +9,27 +58,55 +25,21 +69,24 +9,22 +64,63 +19,1 +9,36 +17,27 +54,49 +38,69 +8,5 +46,67 +60,57 +68,11 +0,7 +19,17 +39,65 +27,3 +9,40 +64,57 +17,25 +3,25 +19,9 +47,8 +58,61 +23,22 +21,11 +41,7 +18,9 +11,45 +51,67 +52,3 +8,43 +9,25 +69,8 +67,11 +2,27 +63,51 +65,61 +53,5 +7,19 +18,3 +67,18 +45,9 +55,63 +15,15 +47,64 +54,3 +13,31 +19,5 +41,64 +15,16 +37,67 +53,52 +12,9 +15,4 +25,34 +43,59 +2,17 +23,33 +57,8 +16,15 +57,67 +29,0 +66,69 +19,7 +42,61 +66,15 +67,61 +51,63 +36,7 +1,16 +2,23 +66,59 +67,2 +61,64 +56,65 +56,5 +15,2 +19,33 +15,28 +49,53 +5,35 +12,3 +65,18 +69,53 +11,33 +37,2 +47,69 +57,69 +11,5 +34,7 +3,45 +63,5 +15,33 +35,1 +17,20 +23,11 +6,31 +17,35 +50,61 +51,4 +64,3 +62,55 +3,9 +49,60 +13,35 +68,69 +21,37 +44,63 +2,9 +15,7 +49,5 +67,13 +9,39 +9,33 +9,24 +2,11 +5,23 +46,55 +17,22 +9,23 +48,3 +45,13 +47,58 +60,59 +5,18 +14,3 +24,11 +56,69 +43,55 +57,63 +55,10 +17,33 +53,47 +36,3 +13,16 +5,32 +64,7 +32,3 +51,51 +10,17 +13,37 +40,59 +11,31 +13,19 +19,10 +49,1 +34,1 +10,27 +42,9 +61,2 +58,57 +13,33 +25,3 +43,2 +23,31 +24,37 +59,66 +12,29 +7,10 +31,65 +19,23 +39,64 +22,39 +18,5 +55,62 +23,18 +39,62 +53,50 +21,31 +40,55 +58,5 +23,40 +67,66 +69,59 +23,25 +39,61 +1,7 +21,1 +21,5 +57,61 +51,53 +53,51 +5,29 +69,47 +30,27 +5,14 +10,45 +18,23 +7,29 +55,60 +40,7 +49,7 +14,31 +15,25 +68,19 +57,49 +12,23 +7,30 +60,49 +50,9 +16,1 +22,9 +57,55 +15,24 +65,49 +69,25 +59,69 +28,69 +4,21 +23,36 +58,69 +69,61 +23,8 +5,8 +43,1 +9,37 +55,69 +3,11 +66,53 +70,59 +14,19 +15,17 +9,13 +59,55 +36,65 +69,67 +8,23 +23,32 +3,8 +65,3 +69,65 +29,5 +9,15 +61,61 +13,34 +1,1 +3,4 +68,45 +45,56 +33,69 +67,48 +38,65 +6,21 +0,3 +63,68 +50,67 +15,13 +63,58 +9,34 +67,1 +48,63 +60,69 +69,51 +57,47 +70,67 +51,47 +59,54 +57,7 +43,67 +4,45 +59,67 +45,2 +67,57 +62,1 +69,52 +31,63 +69,21 +31,15 +27,9 +3,37 +19,25 +63,55 +6,3 +53,3 +20,21 +13,17 +23,30 +6,23 +43,7 +17,29 +57,2 +21,32 +51,69 +7,1 +44,5 +57,1 +33,66 +45,69 +59,8 +9,3 +13,23 +11,22 +65,5 +1,9 +24,17 +61,3 +49,57 +12,19 +13,28 +69,12 +10,51 +53,53 +13,47 +31,69 +24,43 +69,63 +20,17 +67,21 +44,55 +33,68 +7,15 +45,1 +39,55 +39,4 +69,60 +23,27 +45,61 +51,61 +25,1 +63,3 +37,69 +33,5 +17,15 +9,32 +7,39 +63,54 +65,47 +29,19 +53,43 +60,33 +57,45 +5,6 +47,27 +39,25 +48,47 +53,36 +43,18 +49,21 +41,21 +23,19 +52,35 +39,45 +55,17 +29,39 +57,51 +55,45 +54,27 +33,26 +40,19 +44,17 +57,20 +37,45 +27,64 +31,13 +41,13 +5,7 +9,57 +10,69 +23,47 +1,51 +0,69 +49,12 +3,58 +15,9 +21,53 +53,27 +45,11 +63,42 +27,56 +6,11 +27,12 +27,31 +23,41 +35,41 +15,61 +61,27 +21,43 +41,43 +17,56 +11,66 +41,28 +51,37 +41,27 +38,59 +39,47 +59,41 +11,41 +26,59 +59,16 +29,35 +1,45 +33,41 +55,29 +65,39 +47,50 +28,5 +39,43 +35,21 +54,25 +43,16 +51,43 +31,17 +23,53 +37,21 +43,22 +22,55 +57,17 +15,49 +36,57 +11,48 +56,27 +36,39 +53,35 +8,51 +29,46 +61,29 +67,37 +31,35 +42,47 +63,41 +37,18 +43,36 +52,21 +63,9 +57,48 +29,36 +39,27 +35,59 +55,41 +25,53 +45,47 +19,66 +29,44 +61,5 +49,23 +14,59 +27,59 +19,58 +16,13 +44,51 +29,24 +13,7 +26,19 +37,20 +41,40 +28,27 +65,38 +41,47 +47,19 +49,49 +46,39 +38,55 +13,65 +53,44 +31,49 +36,5 +68,5 +42,45 +3,5 +4,63 +59,23 +23,56 +15,59 +37,52 +67,35 +11,11 +1,63 +11,25 +19,47 +31,33 +61,36 +27,46 +35,44 +46,21 +9,56 +5,59 +27,41 +35,37 +28,13 +39,20 +61,23 +36,15 +35,9 +7,8 +52,15 +14,39 +51,21 +65,25 +35,12 +58,15 +66,35 +23,7 +35,62 +63,25 +68,1 +23,64 +68,33 +65,28 +44,29 +19,67 +29,43 +47,51 +25,67 +2,45 +55,21 +37,43 +32,21 +58,51 +69,33 +13,29 +41,11 +47,23 +65,35 +23,45 +31,64 +41,50 +1,65 +25,39 +42,39 +44,47 +67,39 +32,35 +43,38 +51,29 +9,6 +41,24 +3,67 +57,31 +41,44 +53,19 +19,41 +14,61 +15,41 +46,49 +39,35 +62,51 +51,23 +32,9 +23,60 +1,47 +49,27 +57,36 +19,52 +43,49 +49,35 +21,50 +49,39 +53,38 +51,19 +21,57 +43,45 +33,38 +45,41 +1,56 +39,22 +21,63 +48,49 +47,30 +37,39 +4,61 +34,13 +26,51 +47,39 +19,45 +31,59 +3,52 +17,54 +69,45 +15,35 +49,11 +17,69 +55,13 +64,39 +57,33 +45,40 +28,21 +11,9 +64,29 +33,19 +21,60 +32,19 +47,25 +57,53 +31,4 +17,61 +69,5 +19,39 +46,15 +60,51 +9,50 +27,40 +63,29 +59,36 +11,55 +25,61 +30,55 +35,25 +27,69 +23,1 +9,65 +43,37 +27,42 +19,49 +56,45 +13,49 +35,7 +33,47 +43,11 +38,33 +35,49 +63,39 +41,20 +13,48 +1,60 +43,30 +7,45 +55,19 +65,19 +53,15 +33,53 +29,49 +51,45 +13,50 +34,23 +20,55 +10,11 +12,39 +17,53 +11,65 +27,37 +8,53 +65,24 +65,45 +61,45 +7,65 +59,37 +27,21 +39,39 +31,67 +45,23 +53,10 +59,22 +25,42 +1,57 +54,45 +13,10 +43,23 +37,51 +51,13 +40,35 +48,45 +36,27 +1,59 +39,51 +57,32 +31,5 +35,5 +8,69 +25,29 +39,9 +19,53 +29,40 +61,43 +7,62 +39,17 +3,54 +27,57 +67,43 +23,49 +53,17 +29,47 +25,41 +9,62 +61,35 +27,38 +23,9 +67,38 +41,49 +22,45 +43,15 +25,17 +13,69 +31,52 +29,68 +29,37 +30,37 +7,63 +37,27 +55,39 +65,13 +50,23 +59,11 +25,11 +25,65 +26,15 +55,37 +47,18 +20,69 +12,69 +8,47 +61,17 +53,12 +54,41 +9,69 +33,59 +57,37 +47,47 +61,39 +40,13 +69,3 +18,55 +22,47 +65,41 +31,45 +21,9 +38,27 +61,30 +61,55 +3,57 +51,11 +20,57 +41,51 +61,15 +40,37 +53,23 +49,38 +22,69 +1,61 +16,59 +20,65 +17,63 +51,17 +26,45 +24,31 +61,49 +38,41 +22,51 +29,16 +11,52 +34,35 +30,61 +37,33 +58,19 +9,29 +29,17 +61,9 +2,51 +7,59 +49,51 +35,55 +8,59 +29,41 +37,47 +23,67 +30,53 +15,69 +33,27 +49,31 +69,29 +59,43 +3,41 +43,10 +59,19 +35,27 +61,11 +27,25 +49,30 +28,57 +15,53 +39,29 +45,46 +16,41 +28,9 +27,61 +37,15 +29,18 +15,47 +17,57 +25,19 +37,25 +11,64 +45,12 +61,46 +14,67 +6,51 +19,65 +32,17 +21,65 +46,29 +51,28 +25,6 +19,51 +35,61 +47,41 +45,45 +39,49 +36,25 +19,59 +32,25 +25,47 +30,41 +62,19 +39,50 +41,41 +44,43 +53,37 +33,14 +40,51 +62,47 +19,48 +55,43 +63,13 +68,43 +65,29 +53,25 +23,59 +39,11 +54,17 +59,35 +63,53 +13,11 +35,58 +12,5 +63,21 +25,20 +45,37 +34,47 +24,55 +3,53 +11,67 +46,33 +25,31 +56,23 +36,43 +8,65 +61,19 +37,41 +41,31 +31,27 +37,23 +64,49 +6,67 +9,17 +11,40 +17,13 +26,11 +67,41 +23,57 +13,52 +50,17 +21,35 +33,51 +59,40 +27,5 +36,33 +3,62 +35,60 +58,43 +13,56 +24,67 +17,37 +29,53 +63,23 +20,51 +24,39 +13,12 +2,55 +62,41 +28,49 +39,44 +20,47 +52,27 +35,39 +59,25 +35,32 +49,29 +65,31 +35,52 +54,47 +29,51 +37,9 +13,13 +53,31 +45,39 +9,7 +39,13 +17,65 +37,31 +24,5 +30,5 +2,65 +28,7 +49,17 +55,55 +37,24 +13,5 +3,68 +49,13 +56,15 +21,49 +41,37 +43,26 +57,25 +3,47 +29,21 +47,43 +29,42 +55,11 +35,19 +6,55 +53,34 +23,17 +31,12 +4,69 +15,43 +66,33 +59,33 +13,57 +17,42 +10,67 +59,13 +50,37 +33,45 +35,40 +38,7 +21,41 +9,63 +53,1 +33,37 +13,66 +50,15 +1,55 +19,36 +18,47 +61,26 +49,25 +59,38 +5,43 +37,62 +11,61 +22,67 +61,18 +33,55 +18,61 +25,9 +62,49 +56,29 +65,44 +59,29 +33,39 +55,9 +49,37 +13,55 +35,22 +41,39 +48,19 +30,21 +13,9 +21,39 +37,61 +29,15 +27,52 +19,55 +47,35 +51,33 +8,55 +63,7 +35,46 +11,54 +29,69 +15,52 +31,46 +25,62 +63,43 +41,26 +61,41 +7,64 +43,35 +47,33 +40,33 +45,36 +57,41 +57,23 +57,27 +11,29 +5,69 +63,37 +7,25 +34,9 +57,24 +23,5 +59,18 +23,55 +48,41 +11,47 +16,57 +60,25 +60,23 +20,53 +66,47 +56,33 +30,11 +15,46 +26,33 +64,33 +51,10 +35,13 +5,55 +33,21 +10,55 +35,11 +9,53 +23,44 +63,11 +69,1 +21,45 +6,47 +42,17 +32,41 +17,49 +61,12 +35,45 +31,51 +55,20 +31,25 +7,51 +41,15 +45,31 +31,8 +29,13 +3,43 +27,70 +59,21 +43,41 +67,45 +59,46 +56,43 +5,66 +18,39 +39,10 +1,22 +68,25 +15,48 +68,41 +2,67 +37,46 +15,44 +25,69 +43,47 +61,28 +61,31 +43,20 +48,37 +19,44 +24,9 +27,16 +37,29 +51,40 +38,25 +62,31 +31,23 +47,21 +13,53 +12,61 +37,8 +5,47 +17,67 +49,44 +31,19 +25,57 +13,67 +3,65 +63,8 +3,69 +29,63 +11,63 +27,60 +31,37 +29,61 +25,27 +32,13 +1,53 +52,31 +57,35 +36,35 +67,32 +33,30 +4,57 +23,43 +39,31 +46,47 +5,61 +43,51 +51,9 +10,43 +5,63 +69,41 +7,60 +53,21 +45,35 +34,25 +37,35 +33,40 +64,9 +37,7 +9,49 +13,59 +70,43 +11,46 +43,34 +36,49 +29,9 +46,13 +31,38 +41,23 +65,33 +47,28 +54,37 +23,58 +33,33 +1,43 +7,67 +6,43 +63,33 +27,17 +49,41 +15,40 +43,21 +50,1 +61,21 +5,5 +51,48 +37,10 +44,49 +1,64 +55,31 +13,54 +47,31 +31,57 +45,49 +57,50 +52,25 +48,33 +61,13 +27,29 +31,28 +19,69 +23,15 +45,20 +65,42 +24,63 +55,47 +61,20 +40,29 +45,55 +11,59 +48,35 +25,5 +33,29 +15,10 +59,44 +41,29 +24,23 +43,27 +69,31 +37,38 +45,15 +51,15 +65,11 +5,46 +41,33 +62,37 +62,35 +53,20 +59,31 +9,67 +31,44 +46,37 +22,59 +27,19 +41,16 +25,4 +11,8 +31,9 +16,7 +28,61 +49,45 +45,21 +57,15 +50,25 +30,7 +14,69 +43,14 +33,49 +42,33 +67,36 +21,62 +51,38 +37,49 +62,9 +58,13 +35,43 +1,49 +57,46 +25,43 +5,67 +31,53 +59,9 +8,67 +13,63 +43,32 +33,42 +30,49 +0,63 +1,50 +21,59 +19,63 +36,55 +23,37 +67,27 +10,61 +5,56 +31,31 +47,13 +20,45 +28,31 +1,67 +15,62 +34,19 +55,40 +62,23 +2,47 +67,31 +39,5 +7,57 +15,70 +33,57 +28,53 +55,27 +7,5 +66,25 +47,22 +11,51 +23,51 +53,28 +61,33 +23,69 +65,37 +11,53 +31,3 +64,45 +7,69 +13,42 +31,34 +4,65 +68,21 +55,15 +41,55 +15,56 +39,33 +45,34 +25,15 +19,61 +21,67 +37,48 +24,53 +7,49 +37,30 +43,31 +5,15 +37,36 +31,41 +27,65 +25,13 +0,53 +37,57 +45,43 +15,65 +25,45 +33,48 +15,42 +15,38 +45,51 +3,55 +29,7 +39,23 +13,39 +20,63 +31,56 +45,27 +64,31 +27,39 +33,16 +25,14 +61,25 +21,55 +55,23 +43,39 +18,65 +15,67 +43,9 +30,59 +26,29 +41,17 +60,15 +25,23 +57,9 +24,15 +10,57 +17,59 +65,27 +52,45 +58,29 +70,31 +15,39 +55,35 +43,33 +17,55 +29,45 +55,14 +9,59 +53,16 +31,43 +15,5 +17,43 +62,43 +17,47 +59,28 +10,29 +67,29 +61,37 +69,36 +22,53 +43,43 +29,57 +48,15 +29,67 +61,47 +33,35 +51,31 +35,23 +27,13 +34,55 +27,18 +25,49 +25,63 +34,37 +39,38 +60,39 +55,25 +31,32 +53,39 +37,17 +39,21 +33,50 +68,27 +50,47 +26,53 +56,41 +15,51 +51,42 +11,43 +21,47 +35,33 +50,41 +31,11 +45,32 +31,29 +33,28 +15,57 +69,28 +23,63 +35,47 +55,22 +29,27 +29,59 +62,15 +27,67 +13,43 +53,24 +6,5 +29,50 +44,41 +10,63 +36,37 +1,58 +59,27 +39,37 +26,23 +25,33 +39,16 +15,50 +60,21 +3,63 +45,19 +46,41 +42,11 +5,57 +5,45 +4,53 +42,49 +49,33 +10,59 +21,69 +3,61 +30,19 +28,33 +21,42 +30,23 +69,37 +16,37 +33,17 +65,23 +38,53 +54,13 +43,19 +16,9 +34,61 +70,3 +38,49 +39,7 +37,42 +31,47 +15,54 +70,41 +50,21 +15,55 +61,44 +47,29 +54,9 +13,24 +18,69 +25,55 +45,10 +17,51 +52,13 +3,59 +27,53 +22,43 +45,25 +5,53 +39,19 +32,7 +13,51 +33,11 +13,61 +33,15 +59,39 +54,31 +63,31 +30,33 +50,35 +28,29 +22,65 +14,7 +13,64 +13,41 +35,30 +37,14 +27,63 +21,51 +23,23 +57,26 +66,29 +29,48 +35,50 +27,49 +51,35 +13,45 +69,35 +27,44 +13,27 +20,61 +37,19 +2,61 +33,9 +53,32 +61,53 +65,43 +44,13 +51,39 +35,17 +24,47 +27,55 +56,53 +31,36 +50,45 +51,30 +17,68 +29,33 +59,48 +47,45 +34,53 +41,19 +42,29 +45,44 +7,43 +63,45 +34,17 +51,25 +3,51 +37,12 +29,31 +3,42 +63,61 +66,13 +7,48 +27,43 +61,32 +59,49 +15,63 +3,15 +40,47 +35,31 +29,55 +26,57 +1,69 +65,10 +5,11 +24,21 +57,21 +41,25 +38,15 +37,5 +51,27 +41,30 +11,57 +63,26 +67,25 +29,23 +39,18 +17,39 +52,41 +57,39 +51,41 +25,50 +21,61 +35,15 +9,51 +69,30 +56,39 +49,20 +61,51 +27,23 +25,51 +49,16 +67,19 +63,35 +17,41 +56,17 +65,46 +63,40 +6,53 +37,28 +7,47 +32,53 +47,37 +59,45 +70,21 +49,32 +25,7 +26,67 +25,60 +65,26 +59,17 +9,55 +6,45 +11,21 +18,13 +25,68 +39,40 +11,50 +67,46 +45,33 +37,54 +7,58 +35,29 +55,33 +29,14 +23,61 +21,38 +57,11 +15,66 +38,45 +25,59 +40,43 +37,37 +51,18 +67,47 +18,51 +56,35 +49,43 +7,27 +13,44 +46,17 +31,39 +27,33 +5,51 +13,46 +68,39 +61,7 +39,26 +45,53 +43,29 +34,33 +39,15 +7,53 +33,44 +69,39 +62,11 +23,65 +59,15 +41,42 +55,59 +27,7 +50,33 +69,43 +32,59 +58,23 +29,58 +41,36 +49,24 +45,17 +55,34 +33,31 +16,61 +7,55 +31,21 +23,48 +46,45 +6,63 +41,14 +4,59 +35,57 +59,47 +49,28 +57,38 +63,27 +41,22 +13,21 +5,50 +47,26 +57,43 +53,22 +36,17 +57,13 +9,61 +66,39 +55,30 +16,67 +46,25 +13,25 +43,17 +9,11 +53,33 +35,20 +37,55 +58,33 +10,9 +44,23 +45,29 +33,10 +37,11 +63,67 +1,41 +64,35 +33,23 +19,43 +53,29 +47,17 +31,55 +13,58 +33,13 +59,42 +6,69 +43,25 +11,69 +47,15 +41,9 +25,64 +27,47 +47,42 +17,64 +47,53 +17,9 +20,67 +18,59 +13,26 +53,41 +29,26 +59,30 +33,56 +44,27 +26,47 +27,66 +3,21 +49,26 +29,66 +12,59 +41,35 +25,48 +33,32 +27,35 +39,57 +15,64 +37,22 +39,6 +5,65 +11,49 +65,9 +29,25 +49,15 +9,9 +66,41 +55,18 +41,52 +38,31 +59,52 +69,34 +27,51 +27,45 +59,10 +3,49 +29,22 +7,61 +35,35 +32,49 +67,33 +63,48 +20,41 +19,40 +1,21 +1,44 +57,29 +64,13 +49,14 +17,44 +40,9 +19,57 +69,27 +67,23 +63,49 +62,25 +47,24 +17,50 +35,51 +50,11 +32,47 +33,43 +49,19 +39,41 +67,30 +61,34 +43,60 +12,46 +70,22 +38,20 +14,44 +41,38 +22,52 +12,67 +2,7 +58,46 +34,30 +34,70 +6,46 +20,68 +7,24 +9,18 +33,20 +60,42 +67,24 +37,6 +0,61 +12,18 +20,10 +39,54 +69,0 +16,65 +40,63 +14,10 +34,21 +54,56 +16,21 +62,12 +23,24 +48,61 +70,29 +30,16 +0,66 +70,6 +6,52 +30,62 +35,14 +62,36 +48,58 +13,8 +28,60 +22,26 +66,17 +62,54 +40,53 +12,53 +23,54 +61,40 +43,66 +0,34 +15,68 +32,66 +22,10 +42,48 +28,6 +38,38 +55,28 +46,23 +16,68 +52,54 +5,52 +4,64 +57,42 +2,49 +38,12 +64,38 +28,52 +68,31 +68,52 +21,70 +16,16 +8,31 +9,66 +4,55 +11,68 +36,14 +42,16 +32,39 +54,64 +18,58 +52,46 +68,22 +7,0 +29,62 +0,44 +35,8 +18,67 +23,52 +58,42 +26,2 +32,57 +8,66 +30,20 +0,30 +12,6 +46,1 +49,2 +34,56 +16,52 +2,2 +48,24 +25,38 +41,34 +46,28 +32,26 +53,48 +34,69 +11,28 +3,64 +62,8 +12,48 +19,22 +4,11 +24,30 +22,31 +32,45 +19,68 +12,60 +7,32 +22,38 +25,58 +55,42 +47,70 +18,28 +66,62 +34,41 +44,57 +4,10 +53,64 +38,34 +12,22 +37,70 +0,42 +30,31 +35,54 +61,48 +58,34 +36,38 +66,43 +54,52 +39,66 +43,62 +60,52 +37,44 +42,22 +53,0 +70,25 +18,40 +69,20 +53,58 +21,18 +25,12 +0,67 +25,44 +22,14 +48,32 +48,38 +18,15 +52,30 +34,15 +52,43 +52,52 +46,63 +2,22 +10,21 +22,64 +37,58 +10,31 +21,64 +6,40 +0,58 +36,42 +24,2 +65,20 +0,1 +2,58 +21,26 +0,68 +62,26 +8,32 +38,17 +11,56 +19,18 +31,20 +43,70 +0,5 +3,10 +14,38 +14,37 +32,33 +18,44 +62,53 +6,29 +70,30 +42,21 +18,37 +23,38 +14,60 +46,59 +34,22 +10,48 +8,63 +68,20 +50,58 +44,32 +4,67 +40,14 +22,34 +6,25 +38,52 +38,48 +32,30 +38,54 +26,49 +5,30 +34,48 +45,28 +56,58 +17,60 +10,38 +44,70 +24,49 +7,12 +42,38 +38,13 +52,48 +40,2 +52,59 +20,52 +21,68 +44,44 +2,70 +10,6 +24,52 +40,48 +48,20 +70,20 +36,23 +36,58 +20,27 +58,4 +2,8 +26,38 +4,38 +36,60 +12,57 +34,49 +30,29 +48,50 +18,60 +22,21 +64,62 +31,50 +20,37 +20,33 +5,40 +34,46 +12,12 +17,32 +2,29 +44,28 +58,45 +32,63 +54,30 +12,42 +16,28 +8,16 +66,42 +12,49 +12,63 +26,68 +18,25 +44,21 +17,6 +34,34 +36,67 +2,13 +26,3 +70,0 +39,58 +17,14 +18,12 +43,50 +16,25 +2,34 +8,50 +62,6 +26,41 +50,40 +30,56 +18,49 +4,32 +16,60 +22,8 +15,6 +21,36 +4,58 +29,28 +47,40 +36,62 +34,14 +33,60 +8,44 +43,8 +60,55 +39,30 +24,24 +36,11 +47,48 +38,32 +22,58 +31,10 +38,60 +16,46 +10,5 +23,50 +0,14 +4,60 +10,64 +20,22 +66,37 +28,51 +27,26 +38,21 +30,43 +19,20 +0,28 +16,54 +40,46 +34,5 +56,42 +8,34 +41,68 +61,8 +50,63 +27,14 +36,8 +26,36 +30,70 +36,20 +70,33 +41,2 +70,19 +5,22 +38,10 +10,40 +28,42 +42,41 +46,42 +0,23 +70,46 +24,40 +16,39 +38,56 +26,50 +22,5 +40,56 +34,57 +52,64 +46,70 +8,26 +3,34 +32,52 +70,44 +12,24 +8,10 +28,50 +14,16 +20,56 +9,60 +8,20 +37,34 +49,22 +27,24 +17,10 +68,30 +22,62 +22,15 +58,35 +69,44 +14,20 +48,22 +48,25 +51,2 +26,21 +6,30 +12,26 +33,12 +5,60 +60,56 +0,70 +4,56 +56,50 +58,47 +46,0 +50,22 +52,68 +4,4 +32,36 +34,60 +30,17 +36,56 +62,42 +28,23 +3,50 +35,28 +39,34 +38,3 +30,12 +20,7 +18,57 +52,60 +6,50 +52,49 +4,13 +56,56 +8,70 +44,8 +70,1 +28,62 +42,42 +60,12 +50,28 +47,38 +60,43 +50,54 +51,50 +55,12 +31,18 +47,32 +18,16 +16,6 +62,32 +24,69 +2,54 +62,27 +40,32 +38,68 +8,36 +59,70 +52,16 +68,37 +24,18 +53,8 +14,70 +31,60 +32,4 +33,36 +64,14 +52,22 +31,22 +12,51 +16,38 +30,1 +48,40 +57,56 +69,40 +25,32 +50,60 +49,4 +30,64 +46,22 +28,48 +42,56 +2,43 +46,6 +6,41 +43,46 +20,59 +54,6 +58,64 +0,59 +41,10 +54,42 +62,63 +30,57 +4,17 +22,40 +60,44 +52,42 +28,30 +7,2 +0,15 +22,27 +70,38 +30,68 +5,64 +35,38 +0,20 +17,62 +55,70 +5,4 +56,60 +34,42 +60,61 +40,27 +38,44 +5,16 +14,51 +18,26 +46,46 +69,26 +48,14 +32,43 +10,28 +27,22 +54,20 +14,48 +67,26 +57,0 +4,70 +59,12 +51,6 +40,10 +59,20 +32,8 +34,2 +20,18 +62,44 +64,46 +20,58 +56,31 +54,69 +28,14 +0,17 +22,12 +52,0 +20,44 +34,8 +32,29 +65,30 +56,3 +26,52 +4,47 +22,1 +13,38 +62,65 +0,31 +44,42 +42,15 +42,10 +24,38 +10,62 +26,64 +48,64 +48,21 +43,56 +8,46 +4,7 +9,0 +30,14 +56,61 +68,34 +56,55 +13,40 +50,62 +8,2 +50,39 +18,68 +0,37 +4,5 +47,36 +14,24 +44,58 +56,25 +24,62 +6,13 +11,2 +20,5 +18,11 +51,16 +56,6 +53,70 +32,0 +34,51 +37,56 +18,41 +42,70 +24,20 +22,44 +28,46 +20,38 +36,34 +10,56 +43,44 +0,60 +1,70 +37,0 +58,12 +68,17 +66,14 +70,40 +61,58 +53,40 +60,19 +14,4 +3,20 +6,38 +53,18 +24,8 +14,43 +42,43 +50,4 +57,30 +7,50 +37,40 +64,65 +36,47 +66,34 +16,27 +70,34 +20,14 +60,27 +32,31 +66,48 +43,28 +64,28 +67,54 +13,70 +50,38 +42,58 +52,26 +24,29 +20,48 +17,30 +66,67 +68,64 +68,9 +14,68 +70,24 +38,5 +60,47 +11,60 +67,12 +0,43 +1,12 +56,16 +38,22 +24,68 +51,8 +38,63 +60,22 +36,54 +38,61 +66,45 +46,27 +48,8 +6,0 +27,30 +8,40 +32,60 +5,62 +62,67 +64,32 +52,37 +60,5 +70,64 +10,18 +63,52 +18,20 +34,39 +1,62 +51,34 +40,49 +28,38 +51,62 +8,54 +45,58 +5,10 +12,15 +68,8 +26,22 +35,34 +58,32 +32,34 +10,10 +6,7 +38,42 +62,57 +52,6 +40,22 +62,70 +58,6 +50,48 +41,46 +52,18 +60,2 +25,70 +5,0 +50,6 +39,2 +2,4 +62,45 +48,23 +57,34 +55,66 +18,14 +9,52 +24,22 +54,60 +49,52 +12,54 +54,14 +63,44 +56,64 +4,0 +20,50 +18,64 +1,18 +14,41 +16,35 +29,2 +66,52 +12,50 +42,68 +34,24 +56,57 +66,32 +57,60 +28,8 +22,66 +32,32 +52,58 +50,42 +4,36 +16,32 +65,58 +56,20 +42,0 +17,4 +34,68 +49,36 +32,58 +68,50 +19,16 +6,70 +40,38 +60,37 +50,49 +34,40 +51,70 +1,38 +13,32 +53,66 +6,32 +65,32 +32,22 +14,55 +38,30 +44,26 +66,8 +50,30 +48,31 +5,36 +52,19 +29,30 +24,50 +55,36 +46,69 +64,18 +44,0 +27,10 +68,32 +60,13 +12,17 +10,34 +18,18 +70,52 +10,8 +12,38 +16,70 +8,9 +58,65 +64,21 +70,4 +5,48 +22,49 +36,2 +18,30 +41,6 +10,44 +48,48 +60,14 +23,42 +46,36 +18,56 +40,18 +36,40 +24,59 +64,64 +40,11 +59,50 +14,57 +25,46 +65,0 +32,16 +24,4 +40,34 +50,36 +38,50 +20,30 +66,38 +14,40 +70,62 +6,58 +12,28 +62,60 +68,28 +36,29 +58,37 +45,68 +22,22 +40,65 +49,64 +24,65 +40,8 +0,12 +40,64 +70,66 +23,62 +66,49 +28,32 +47,44 +10,12 +29,8 +26,18 +28,16 +49,50 +7,6 +30,54 +52,10 +32,10 +1,0 +40,28 +7,52 +18,54 +5,42 +58,10 +54,40 +41,4 +10,22 +24,56 +44,36 +39,14 +12,2 +65,48 +20,16 +10,4 +56,66 +40,68 +16,19 +45,42 +20,43 +50,18 +40,15 +0,6 +18,62 +14,2 +51,44 +35,48 +54,68 +7,4 +30,25 +27,36 +48,9 +42,46 +57,54 +68,55 +34,59 +58,16 +70,65 +70,14 +24,12 +46,12 +30,39 +55,2 +38,8 +62,22 +3,70 +60,40 +7,44 +9,44 +16,58 +64,2 +22,46 +40,45 +23,0 +62,30 +46,18 +23,6 +27,48 +31,66 +66,30 +52,9 +29,20 +36,21 +69,10 +24,41 +8,38 +44,34 +37,66 +68,4 +34,28 +21,44 +28,70 +42,30 +35,42 +46,16 +6,8 +36,48 +8,61 +14,26 +62,0 +28,45 +46,7 +7,68 +32,40 +61,24 +32,1 +40,12 +58,2 +62,58 +0,2 +42,60 +13,68 +48,59 +6,18 +36,28 +61,0 +63,28 +58,8 +44,33 +59,6 +64,6 +12,62 +30,32 +39,56 +70,32 +67,44 +56,11 +38,6 +2,36 +60,50 +55,26 +58,66 +55,8 +48,17 +56,2 +64,0 +60,41 +64,24 +42,52 +30,13 +16,20 +30,44 +1,26 +47,34 +24,54 +56,8 +16,0 +2,32 +62,38 +70,56 +18,50 +9,28 +63,38 +30,18 +10,70 +44,25 +57,40 +28,26 +54,0 +36,12 +32,24 +44,62 +52,23 +19,54 +45,30 +51,68 +8,8 +48,62 +40,60 +48,6 +48,69 +22,36 +61,10 +62,28 +51,66 +14,18 +53,56 +29,52 +63,4 +46,50 +26,69 +52,56 +21,54`) + require.Equal(t, 0, r) +} diff --git a/2024/go/day18/input.txt b/2024/go/day18/input.txt new file mode 100644 index 0000000..3b8f63e --- /dev/null +++ b/2024/go/day18/input.txt @@ -0,0 +1,3450 @@ +2,5 +20,1 +63,59 +21,29 +37,59 +33,63 +14,33 +70,15 +21,34 +62,5 +45,54 +45,60 +48,53 +33,58 +23,35 +22,3 +33,0 +63,62 +44,67 +52,55 +5,19 +42,55 +45,0 +57,3 +15,45 +41,62 +1,39 +63,19 +39,59 +39,3 +48,7 +61,65 +31,1 +54,51 +11,14 +53,62 +67,68 +65,16 +17,45 +21,24 +55,3 +30,15 +4,39 +69,19 +69,57 +41,57 +43,24 +19,11 +18,27 +3,48 +8,13 +41,66 +67,67 +61,62 +5,37 +18,19 +29,64 +13,14 +42,57 +33,67 +0,19 +67,53 +47,59 +19,3 +51,54 +53,69 +42,5 +7,26 +59,65 +50,69 +3,27 +26,9 +43,3 +17,7 +15,11 +12,31 +43,5 +50,65 +9,5 +29,3 +21,6 +65,15 +43,57 +15,37 +50,53 +67,51 +29,1 +47,7 +55,54 +52,51 +47,54 +17,26 +12,43 +65,51 +1,27 +15,22 +63,15 +7,37 +69,49 +57,59 +7,36 +60,7 +66,7 +18,35 +13,36 +21,19 +15,3 +46,9 +30,3 +53,7 +8,7 +66,3 +49,69 +35,65 +48,5 +33,6 +1,31 +26,5 +44,59 +68,13 +45,67 +9,16 +51,55 +57,5 +2,33 +57,64 +31,2 +1,19 +5,12 +19,37 +40,67 +10,19 +21,12 +3,31 +51,1 +4,29 +52,65 +47,5 +17,19 +70,47 +11,19 +57,10 +54,55 +39,53 +61,56 +49,55 +28,37 +21,30 +9,45 +43,69 +57,19 +29,10 +60,63 +19,32 +66,5 +53,45 +53,49 +47,57 +26,1 +17,34 +65,7 +7,28 +41,63 +6,1 +69,69 +0,13 +5,28 +10,1 +38,67 +37,13 +3,7 +39,12 +2,15 +54,65 +35,53 +63,20 +13,30 +52,47 +13,3 +69,55 +55,61 +37,4 +7,35 +57,4 +35,69 +5,3 +63,64 +40,69 +59,5 +32,61 +66,61 +43,64 +40,1 +49,3 +68,65 +3,38 +21,4 +49,56 +18,29 +23,12 +7,11 +16,29 +8,11 +10,25 +39,67 +59,60 +3,19 +26,31 +7,9 +51,58 +49,67 +53,65 +65,59 +67,9 +43,58 +55,51 +69,7 +6,39 +49,59 +10,37 +4,43 +54,5 +3,28 +69,16 +67,7 +4,37 +37,1 +27,2 +62,59 +45,70 +25,35 +65,53 +31,7 +53,59 +1,10 +67,10 +65,67 +30,67 +17,1 +67,59 +31,61 +59,59 +65,69 +51,59 +61,66 +13,15 +29,65 +27,1 +65,65 +68,53 +53,11 +5,17 +20,35 +43,68 +3,30 +59,7 +3,39 +45,63 +7,31 +3,13 +51,5 +23,39 +20,3 +67,0 +37,3 +46,61 +65,70 +15,1 +17,11 +66,63 +32,23 +51,0 +3,1 +17,3 +13,6 +59,3 +19,31 +1,24 +41,3 +4,49 +40,57 +63,6 +16,17 +22,25 +39,60 +11,34 +56,7 +38,57 +55,53 +35,66 +1,11 +64,19 +50,3 +9,38 +19,8 +64,61 +3,17 +8,33 +13,1 +5,9 +50,7 +1,34 +41,65 +48,57 +14,13 +17,31 +56,1 +6,15 +24,25 +23,2 +69,13 +45,52 +15,23 +15,27 +27,28 +60,3 +31,30 +19,35 +42,53 +19,27 +61,1 +65,50 +53,2 +52,61 +15,20 +42,7 +67,20 +11,23 +29,54 +6,17 +41,53 +47,63 +68,51 +21,21 +19,6 +53,61 +23,29 +53,9 +19,29 +21,10 +2,41 +10,3 +49,9 +42,59 +12,1 +45,7 +19,28 +3,35 +69,6 +43,4 +17,21 +47,3 +52,7 +65,22 +45,62 +16,5 +51,3 +48,11 +7,33 +40,3 +26,35 +37,63 +49,68 +11,26 +54,67 +64,23 +21,17 +5,49 +63,65 +23,13 +58,1 +61,54 +69,56 +47,60 +11,7 +9,35 +57,58 +45,66 +1,23 +7,21 +17,12 +11,17 +34,3 +25,25 +22,35 +57,65 +17,17 +1,5 +12,33 +36,63 +19,15 +7,38 +53,55 +21,25 +42,1 +17,23 +35,67 +33,3 +56,63 +56,59 +3,2 +42,67 +65,56 +45,5 +5,33 +21,22 +9,42 +3,14 +21,14 +59,53 +64,53 +33,25 +11,35 +9,1 +63,16 +47,49 +53,60 +47,55 +39,1 +63,60 +35,63 +9,31 +55,68 +57,57 +68,15 +11,39 +62,69 +41,45 +55,57 +5,13 +9,14 +1,32 +17,5 +19,19 +19,30 +1,29 +55,56 +6,35 +21,8 +13,0 +4,25 +16,33 +69,9 +53,67 +67,17 +52,67 +41,59 +24,1 +51,7 +54,7 +3,22 +7,13 +41,61 +45,3 +21,33 +37,53 +11,13 +45,8 +48,1 +43,13 +17,46 +1,33 +41,69 +22,19 +19,38 +19,12 +45,57 +53,6 +15,36 +35,68 +9,21 +43,65 +5,41 +7,7 +68,61 +60,1 +7,23 +21,28 +23,34 +63,69 +7,40 +51,64 +66,51 +43,61 +49,63 +69,11 +50,51 +53,13 +17,24 +47,65 +32,67 +4,15 +38,1 +58,63 +23,21 +61,59 +15,21 +11,27 +33,65 +2,1 +20,25 +11,3 +55,67 +5,31 +43,53 +63,66 +3,29 +65,55 +36,69 +64,1 +3,23 +11,6 +52,57 +61,4 +63,17 +61,69 +3,33 +65,4 +21,16 +27,11 +1,3 +5,39 +69,54 +63,47 +1,36 +27,27 +33,61 +25,37 +61,14 +15,26 +55,1 +7,17 +29,11 +11,12 +2,19 +66,55 +45,59 +29,29 +26,39 +8,17 +45,65 +11,37 +2,39 +0,29 +5,27 +16,31 +67,65 +68,63 +26,25 +9,30 +3,36 +48,65 +59,51 +63,1 +7,41 +23,28 +1,15 +18,1 +4,41 +43,63 +21,27 +67,22 +52,69 +7,18 +68,49 +3,12 +18,17 +9,41 +19,13 +1,17 +3,26 +59,61 +57,66 +53,63 +39,69 +3,3 +67,69 +50,57 +9,19 +1,13 +55,58 +49,6 +7,3 +47,1 +12,37 +59,63 +61,67 +8,45 +41,1 +8,1 +39,63 +8,27 +15,19 +1,25 +61,57 +47,66 +46,5 +0,39 +4,3 +67,8 +9,43 +64,67 +49,47 +63,14 +51,57 +0,47 +8,3 +21,15 +63,57 +46,3 +5,21 +15,31 +57,12 +13,18 +21,23 +67,15 +21,7 +23,14 +67,55 +63,63 +21,13 +67,58 +51,49 +25,26 +2,31 +56,51 +32,69 +55,7 +31,62 +65,57 +55,65 +5,24 +7,20 +11,15 +19,14 +65,21 +5,1 +67,5 +67,63 +67,49 +68,57 +19,21 +37,65 +11,1 +47,61 +33,7 +28,3 +12,21 +47,68 +41,70 +65,1 +69,23 +5,25 +47,11 +49,61 +1,35 +59,57 +1,37 +33,1 +53,57 +59,1 +49,65 +27,15 +60,11 +61,63 +5,34 +69,15 +9,20 +66,65 +49,62 +35,3 +55,5 +4,19 +21,20 +47,67 +59,68 +24,27 +41,5 +67,3 +21,3 +47,9 +65,17 +9,47 +23,3 +41,67 +65,63 +15,29 +55,49 +3,6 +69,17 +22,17 +48,51 +33,64 +51,65 +9,27 +58,55 +25,21 +69,24 +9,22 +64,63 +19,1 +9,36 +17,27 +54,49 +38,69 +8,5 +46,67 +60,57 +68,11 +0,7 +19,17 +39,65 +27,3 +9,40 +64,57 +17,25 +3,25 +19,9 +47,8 +58,61 +23,22 +21,11 +41,7 +18,9 +11,45 +51,67 +52,3 +8,43 +9,25 +69,8 +67,11 +2,27 +63,51 +65,61 +53,5 +7,19 +18,3 +67,18 +45,9 +55,63 +15,15 +47,64 +54,3 +13,31 +19,5 +41,64 +15,16 +37,67 +53,52 +12,9 +15,4 +25,34 +43,59 +2,17 +23,33 +57,8 +16,15 +57,67 +29,0 +66,69 +19,7 +42,61 +66,15 +67,61 +51,63 +36,7 +1,16 +2,23 +66,59 +67,2 +61,64 +56,65 +56,5 +15,2 +19,33 +15,28 +49,53 +5,35 +12,3 +65,18 +69,53 +11,33 +37,2 +47,69 +57,69 +11,5 +34,7 +3,45 +63,5 +15,33 +35,1 +17,20 +23,11 +6,31 +17,35 +50,61 +51,4 +64,3 +62,55 +3,9 +49,60 +13,35 +68,69 +21,37 +44,63 +2,9 +15,7 +49,5 +67,13 +9,39 +9,33 +9,24 +2,11 +5,23 +46,55 +17,22 +9,23 +48,3 +45,13 +47,58 +60,59 +5,18 +14,3 +24,11 +56,69 +43,55 +57,63 +55,10 +17,33 +53,47 +36,3 +13,16 +5,32 +64,7 +32,3 +51,51 +10,17 +13,37 +40,59 +11,31 +13,19 +19,10 +49,1 +34,1 +10,27 +42,9 +61,2 +58,57 +13,33 +25,3 +43,2 +23,31 +24,37 +59,66 +12,29 +7,10 +31,65 +19,23 +39,64 +22,39 +18,5 +55,62 +23,18 +39,62 +53,50 +21,31 +40,55 +58,5 +23,40 +67,66 +69,59 +23,25 +39,61 +1,7 +21,1 +21,5 +57,61 +51,53 +53,51 +5,29 +69,47 +30,27 +5,14 +10,45 +18,23 +7,29 +55,60 +40,7 +49,7 +14,31 +15,25 +68,19 +57,49 +12,23 +7,30 +60,49 +50,9 +16,1 +22,9 +57,55 +15,24 +65,49 +69,25 +59,69 +28,69 +4,21 +23,36 +58,69 +69,61 +23,8 +5,8 +43,1 +9,37 +55,69 +3,11 +66,53 +70,59 +14,19 +15,17 +9,13 +59,55 +36,65 +69,67 +8,23 +23,32 +3,8 +65,3 +69,65 +29,5 +9,15 +61,61 +13,34 +1,1 +3,4 +68,45 +45,56 +33,69 +67,48 +38,65 +6,21 +0,3 +63,68 +50,67 +15,13 +63,58 +9,34 +67,1 +48,63 +60,69 +69,51 +57,47 +70,67 +51,47 +59,54 +57,7 +43,67 +4,45 +59,67 +45,2 +67,57 +62,1 +69,52 +31,63 +69,21 +31,15 +27,9 +3,37 +19,25 +63,55 +6,3 +53,3 +20,21 +13,17 +23,30 +6,23 +43,7 +17,29 +57,2 +21,32 +51,69 +7,1 +44,5 +57,1 +33,66 +45,69 +59,8 +9,3 +13,23 +11,22 +65,5 +1,9 +24,17 +61,3 +49,57 +12,19 +13,28 +69,12 +10,51 +53,53 +13,47 +31,69 +24,43 +69,63 +20,17 +67,21 +44,55 +33,68 +7,15 +45,1 +39,55 +39,4 +69,60 +23,27 +45,61 +51,61 +25,1 +63,3 +37,69 +33,5 +17,15 +9,32 +7,39 +63,54 +65,47 +29,19 +53,43 +60,33 +57,45 +5,6 +47,27 +39,25 +48,47 +53,36 +43,18 +49,21 +41,21 +23,19 +52,35 +39,45 +55,17 +29,39 +57,51 +55,45 +54,27 +33,26 +40,19 +44,17 +57,20 +37,45 +27,64 +31,13 +41,13 +5,7 +9,57 +10,69 +23,47 +1,51 +0,69 +49,12 +3,58 +15,9 +21,53 +53,27 +45,11 +63,42 +27,56 +6,11 +27,12 +27,31 +23,41 +35,41 +15,61 +61,27 +21,43 +41,43 +17,56 +11,66 +41,28 +51,37 +41,27 +38,59 +39,47 +59,41 +11,41 +26,59 +59,16 +29,35 +1,45 +33,41 +55,29 +65,39 +47,50 +28,5 +39,43 +35,21 +54,25 +43,16 +51,43 +31,17 +23,53 +37,21 +43,22 +22,55 +57,17 +15,49 +36,57 +11,48 +56,27 +36,39 +53,35 +8,51 +29,46 +61,29 +67,37 +31,35 +42,47 +63,41 +37,18 +43,36 +52,21 +63,9 +57,48 +29,36 +39,27 +35,59 +55,41 +25,53 +45,47 +19,66 +29,44 +61,5 +49,23 +14,59 +27,59 +19,58 +16,13 +44,51 +29,24 +13,7 +26,19 +37,20 +41,40 +28,27 +65,38 +41,47 +47,19 +49,49 +46,39 +38,55 +13,65 +53,44 +31,49 +36,5 +68,5 +42,45 +3,5 +4,63 +59,23 +23,56 +15,59 +37,52 +67,35 +11,11 +1,63 +11,25 +19,47 +31,33 +61,36 +27,46 +35,44 +46,21 +9,56 +5,59 +27,41 +35,37 +28,13 +39,20 +61,23 +36,15 +35,9 +7,8 +52,15 +14,39 +51,21 +65,25 +35,12 +58,15 +66,35 +23,7 +35,62 +63,25 +68,1 +23,64 +68,33 +65,28 +44,29 +19,67 +29,43 +47,51 +25,67 +2,45 +55,21 +37,43 +32,21 +58,51 +69,33 +13,29 +41,11 +47,23 +65,35 +23,45 +31,64 +41,50 +1,65 +25,39 +42,39 +44,47 +67,39 +32,35 +43,38 +51,29 +9,6 +41,24 +3,67 +57,31 +41,44 +53,19 +19,41 +14,61 +15,41 +46,49 +39,35 +62,51 +51,23 +32,9 +23,60 +1,47 +49,27 +57,36 +19,52 +43,49 +49,35 +21,50 +49,39 +53,38 +51,19 +21,57 +43,45 +33,38 +45,41 +1,56 +39,22 +21,63 +48,49 +47,30 +37,39 +4,61 +34,13 +26,51 +47,39 +19,45 +31,59 +3,52 +17,54 +69,45 +15,35 +49,11 +17,69 +55,13 +64,39 +57,33 +45,40 +28,21 +11,9 +64,29 +33,19 +21,60 +32,19 +47,25 +57,53 +31,4 +17,61 +69,5 +19,39 +46,15 +60,51 +9,50 +27,40 +63,29 +59,36 +11,55 +25,61 +30,55 +35,25 +27,69 +23,1 +9,65 +43,37 +27,42 +19,49 +56,45 +13,49 +35,7 +33,47 +43,11 +38,33 +35,49 +63,39 +41,20 +13,48 +1,60 +43,30 +7,45 +55,19 +65,19 +53,15 +33,53 +29,49 +51,45 +13,50 +34,23 +20,55 +10,11 +12,39 +17,53 +11,65 +27,37 +8,53 +65,24 +65,45 +61,45 +7,65 +59,37 +27,21 +39,39 +31,67 +45,23 +53,10 +59,22 +25,42 +1,57 +54,45 +13,10 +43,23 +37,51 +51,13 +40,35 +48,45 +36,27 +1,59 +39,51 +57,32 +31,5 +35,5 +8,69 +25,29 +39,9 +19,53 +29,40 +61,43 +7,62 +39,17 +3,54 +27,57 +67,43 +23,49 +53,17 +29,47 +25,41 +9,62 +61,35 +27,38 +23,9 +67,38 +41,49 +22,45 +43,15 +25,17 +13,69 +31,52 +29,68 +29,37 +30,37 +7,63 +37,27 +55,39 +65,13 +50,23 +59,11 +25,11 +25,65 +26,15 +55,37 +47,18 +20,69 +12,69 +8,47 +61,17 +53,12 +54,41 +9,69 +33,59 +57,37 +47,47 +61,39 +40,13 +69,3 +18,55 +22,47 +65,41 +31,45 +21,9 +38,27 +61,30 +61,55 +3,57 +51,11 +20,57 +41,51 +61,15 +40,37 +53,23 +49,38 +22,69 +1,61 +16,59 +20,65 +17,63 +51,17 +26,45 +24,31 +61,49 +38,41 +22,51 +29,16 +11,52 +34,35 +30,61 +37,33 +58,19 +9,29 +29,17 +61,9 +2,51 +7,59 +49,51 +35,55 +8,59 +29,41 +37,47 +23,67 +30,53 +15,69 +33,27 +49,31 +69,29 +59,43 +3,41 +43,10 +59,19 +35,27 +61,11 +27,25 +49,30 +28,57 +15,53 +39,29 +45,46 +16,41 +28,9 +27,61 +37,15 +29,18 +15,47 +17,57 +25,19 +37,25 +11,64 +45,12 +61,46 +14,67 +6,51 +19,65 +32,17 +21,65 +46,29 +51,28 +25,6 +19,51 +35,61 +47,41 +45,45 +39,49 +36,25 +19,59 +32,25 +25,47 +30,41 +62,19 +39,50 +41,41 +44,43 +53,37 +33,14 +40,51 +62,47 +19,48 +55,43 +63,13 +68,43 +65,29 +53,25 +23,59 +39,11 +54,17 +59,35 +63,53 +13,11 +35,58 +12,5 +63,21 +25,20 +45,37 +34,47 +24,55 +3,53 +11,67 +46,33 +25,31 +56,23 +36,43 +8,65 +61,19 +37,41 +41,31 +31,27 +37,23 +64,49 +6,67 +9,17 +11,40 +17,13 +26,11 +67,41 +23,57 +13,52 +50,17 +21,35 +33,51 +59,40 +27,5 +36,33 +3,62 +35,60 +58,43 +13,56 +24,67 +17,37 +29,53 +63,23 +20,51 +24,39 +13,12 +2,55 +62,41 +28,49 +39,44 +20,47 +52,27 +35,39 +59,25 +35,32 +49,29 +65,31 +35,52 +54,47 +29,51 +37,9 +13,13 +53,31 +45,39 +9,7 +39,13 +17,65 +37,31 +24,5 +30,5 +2,65 +28,7 +49,17 +55,55 +37,24 +13,5 +3,68 +49,13 +56,15 +21,49 +41,37 +43,26 +57,25 +3,47 +29,21 +47,43 +29,42 +55,11 +35,19 +6,55 +53,34 +23,17 +31,12 +4,69 +15,43 +66,33 +59,33 +13,57 +17,42 +10,67 +59,13 +50,37 +33,45 +35,40 +38,7 +21,41 +9,63 +53,1 +33,37 +13,66 +50,15 +1,55 +19,36 +18,47 +61,26 +49,25 +59,38 +5,43 +37,62 +11,61 +22,67 +61,18 +33,55 +18,61 +25,9 +62,49 +56,29 +65,44 +59,29 +33,39 +55,9 +49,37 +13,55 +35,22 +41,39 +48,19 +30,21 +13,9 +21,39 +37,61 +29,15 +27,52 +19,55 +47,35 +51,33 +8,55 +63,7 +35,46 +11,54 +29,69 +15,52 +31,46 +25,62 +63,43 +41,26 +61,41 +7,64 +43,35 +47,33 +40,33 +45,36 +57,41 +57,23 +57,27 +11,29 +5,69 +63,37 +7,25 +34,9 +57,24 +23,5 +59,18 +23,55 +48,41 +11,47 +16,57 +60,25 +60,23 +20,53 +66,47 +56,33 +30,11 +15,46 +26,33 +64,33 +51,10 +35,13 +5,55 +33,21 +10,55 +35,11 +9,53 +23,44 +63,11 +69,1 +21,45 +6,47 +42,17 +32,41 +17,49 +61,12 +35,45 +31,51 +55,20 +31,25 +7,51 +41,15 +45,31 +31,8 +29,13 +3,43 +27,70 +59,21 +43,41 +67,45 +59,46 +56,43 +5,66 +18,39 +39,10 +1,22 +68,25 +15,48 +68,41 +2,67 +37,46 +15,44 +25,69 +43,47 +61,28 +61,31 +43,20 +48,37 +19,44 +24,9 +27,16 +37,29 +51,40 +38,25 +62,31 +31,23 +47,21 +13,53 +12,61 +37,8 +5,47 +17,67 +49,44 +31,19 +25,57 +13,67 +3,65 +63,8 +3,69 +29,63 +11,63 +27,60 +31,37 +29,61 +25,27 +32,13 +1,53 +52,31 +57,35 +36,35 +67,32 +33,30 +4,57 +23,43 +39,31 +46,47 +5,61 +43,51 +51,9 +10,43 +5,63 +69,41 +7,60 +53,21 +45,35 +34,25 +37,35 +33,40 +64,9 +37,7 +9,49 +13,59 +70,43 +11,46 +43,34 +36,49 +29,9 +46,13 +31,38 +41,23 +65,33 +47,28 +54,37 +23,58 +33,33 +1,43 +7,67 +6,43 +63,33 +27,17 +49,41 +15,40 +43,21 +50,1 +61,21 +5,5 +51,48 +37,10 +44,49 +1,64 +55,31 +13,54 +47,31 +31,57 +45,49 +57,50 +52,25 +48,33 +61,13 +27,29 +31,28 +19,69 +23,15 +45,20 +65,42 +24,63 +55,47 +61,20 +40,29 +45,55 +11,59 +48,35 +25,5 +33,29 +15,10 +59,44 +41,29 +24,23 +43,27 +69,31 +37,38 +45,15 +51,15 +65,11 +5,46 +41,33 +62,37 +62,35 +53,20 +59,31 +9,67 +31,44 +46,37 +22,59 +27,19 +41,16 +25,4 +11,8 +31,9 +16,7 +28,61 +49,45 +45,21 +57,15 +50,25 +30,7 +14,69 +43,14 +33,49 +42,33 +67,36 +21,62 +51,38 +37,49 +62,9 +58,13 +35,43 +1,49 +57,46 +25,43 +5,67 +31,53 +59,9 +8,67 +13,63 +43,32 +33,42 +30,49 +0,63 +1,50 +21,59 +19,63 +36,55 +23,37 +67,27 +10,61 +5,56 +31,31 +47,13 +20,45 +28,31 +1,67 +15,62 +34,19 +55,40 +62,23 +2,47 +67,31 +39,5 +7,57 +15,70 +33,57 +28,53 +55,27 +7,5 +66,25 +47,22 +11,51 +23,51 +53,28 +61,33 +23,69 +65,37 +11,53 +31,3 +64,45 +7,69 +13,42 +31,34 +4,65 +68,21 +55,15 +41,55 +15,56 +39,33 +45,34 +25,15 +19,61 +21,67 +37,48 +24,53 +7,49 +37,30 +43,31 +5,15 +37,36 +31,41 +27,65 +25,13 +0,53 +37,57 +45,43 +15,65 +25,45 +33,48 +15,42 +15,38 +45,51 +3,55 +29,7 +39,23 +13,39 +20,63 +31,56 +45,27 +64,31 +27,39 +33,16 +25,14 +61,25 +21,55 +55,23 +43,39 +18,65 +15,67 +43,9 +30,59 +26,29 +41,17 +60,15 +25,23 +57,9 +24,15 +10,57 +17,59 +65,27 +52,45 +58,29 +70,31 +15,39 +55,35 +43,33 +17,55 +29,45 +55,14 +9,59 +53,16 +31,43 +15,5 +17,43 +62,43 +17,47 +59,28 +10,29 +67,29 +61,37 +69,36 +22,53 +43,43 +29,57 +48,15 +29,67 +61,47 +33,35 +51,31 +35,23 +27,13 +34,55 +27,18 +25,49 +25,63 +34,37 +39,38 +60,39 +55,25 +31,32 +53,39 +37,17 +39,21 +33,50 +68,27 +50,47 +26,53 +56,41 +15,51 +51,42 +11,43 +21,47 +35,33 +50,41 +31,11 +45,32 +31,29 +33,28 +15,57 +69,28 +23,63 +35,47 +55,22 +29,27 +29,59 +62,15 +27,67 +13,43 +53,24 +6,5 +29,50 +44,41 +10,63 +36,37 +1,58 +59,27 +39,37 +26,23 +25,33 +39,16 +15,50 +60,21 +3,63 +45,19 +46,41 +42,11 +5,57 +5,45 +4,53 +42,49 +49,33 +10,59 +21,69 +3,61 +30,19 +28,33 +21,42 +30,23 +69,37 +16,37 +33,17 +65,23 +38,53 +54,13 +43,19 +16,9 +34,61 +70,3 +38,49 +39,7 +37,42 +31,47 +15,54 +70,41 +50,21 +15,55 +61,44 +47,29 +54,9 +13,24 +18,69 +25,55 +45,10 +17,51 +52,13 +3,59 +27,53 +22,43 +45,25 +5,53 +39,19 +32,7 +13,51 +33,11 +13,61 +33,15 +59,39 +54,31 +63,31 +30,33 +50,35 +28,29 +22,65 +14,7 +13,64 +13,41 +35,30 +37,14 +27,63 +21,51 +23,23 +57,26 +66,29 +29,48 +35,50 +27,49 +51,35 +13,45 +69,35 +27,44 +13,27 +20,61 +37,19 +2,61 +33,9 +53,32 +61,53 +65,43 +44,13 +51,39 +35,17 +24,47 +27,55 +56,53 +31,36 +50,45 +51,30 +17,68 +29,33 +59,48 +47,45 +34,53 +41,19 +42,29 +45,44 +7,43 +63,45 +34,17 +51,25 +3,51 +37,12 +29,31 +3,42 +63,61 +66,13 +7,48 +27,43 +61,32 +59,49 +15,63 +3,15 +40,47 +35,31 +29,55 +26,57 +1,69 +65,10 +5,11 +24,21 +57,21 +41,25 +38,15 +37,5 +51,27 +41,30 +11,57 +63,26 +67,25 +29,23 +39,18 +17,39 +52,41 +57,39 +51,41 +25,50 +21,61 +35,15 +9,51 +69,30 +56,39 +49,20 +61,51 +27,23 +25,51 +49,16 +67,19 +63,35 +17,41 +56,17 +65,46 +63,40 +6,53 +37,28 +7,47 +32,53 +47,37 +59,45 +70,21 +49,32 +25,7 +26,67 +25,60 +65,26 +59,17 +9,55 +6,45 +11,21 +18,13 +25,68 +39,40 +11,50 +67,46 +45,33 +37,54 +7,58 +35,29 +55,33 +29,14 +23,61 +21,38 +57,11 +15,66 +38,45 +25,59 +40,43 +37,37 +51,18 +67,47 +18,51 +56,35 +49,43 +7,27 +13,44 +46,17 +31,39 +27,33 +5,51 +13,46 +68,39 +61,7 +39,26 +45,53 +43,29 +34,33 +39,15 +7,53 +33,44 +69,39 +62,11 +23,65 +59,15 +41,42 +55,59 +27,7 +50,33 +69,43 +32,59 +58,23 +29,58 +41,36 +49,24 +45,17 +55,34 +33,31 +16,61 +7,55 +31,21 +23,48 +46,45 +6,63 +41,14 +4,59 +35,57 +59,47 +49,28 +57,38 +63,27 +41,22 +13,21 +5,50 +47,26 +57,43 +53,22 +36,17 +57,13 +9,61 +66,39 +55,30 +16,67 +46,25 +13,25 +43,17 +9,11 +53,33 +35,20 +37,55 +58,33 +10,9 +44,23 +45,29 +33,10 +37,11 +63,67 +1,41 +64,35 +33,23 +19,43 +53,29 +47,17 +31,55 +13,58 +33,13 +59,42 +6,69 +43,25 +11,69 +47,15 +41,9 +25,64 +27,47 +47,42 +17,64 +47,53 +17,9 +20,67 +18,59 +13,26 +53,41 +29,26 +59,30 +33,56 +44,27 +26,47 +27,66 +3,21 +49,26 +29,66 +12,59 +41,35 +25,48 +33,32 +27,35 +39,57 +15,64 +37,22 +39,6 +5,65 +11,49 +65,9 +29,25 +49,15 +9,9 +66,41 +55,18 +41,52 +38,31 +59,52 +69,34 +27,51 +27,45 +59,10 +3,49 +29,22 +7,61 +35,35 +32,49 +67,33 +63,48 +20,41 +19,40 +1,21 +1,44 +57,29 +64,13 +49,14 +17,44 +40,9 +19,57 +69,27 +67,23 +63,49 +62,25 +47,24 +17,50 +35,51 +50,11 +32,47 +33,43 +49,19 +39,41 +67,30 +61,34 +43,60 +12,46 +70,22 +38,20 +14,44 +41,38 +22,52 +12,67 +2,7 +58,46 +34,30 +34,70 +6,46 +20,68 +7,24 +9,18 +33,20 +60,42 +67,24 +37,6 +0,61 +12,18 +20,10 +39,54 +69,0 +16,65 +40,63 +14,10 +34,21 +54,56 +16,21 +62,12 +23,24 +48,61 +70,29 +30,16 +0,66 +70,6 +6,52 +30,62 +35,14 +62,36 +48,58 +13,8 +28,60 +22,26 +66,17 +62,54 +40,53 +12,53 +23,54 +61,40 +43,66 +0,34 +15,68 +32,66 +22,10 +42,48 +28,6 +38,38 +55,28 +46,23 +16,68 +52,54 +5,52 +4,64 +57,42 +2,49 +38,12 +64,38 +28,52 +68,31 +68,52 +21,70 +16,16 +8,31 +9,66 +4,55 +11,68 +36,14 +42,16 +32,39 +54,64 +18,58 +52,46 +68,22 +7,0 +29,62 +0,44 +35,8 +18,67 +23,52 +58,42 +26,2 +32,57 +8,66 +30,20 +0,30 +12,6 +46,1 +49,2 +34,56 +16,52 +2,2 +48,24 +25,38 +41,34 +46,28 +32,26 +53,48 +34,69 +11,28 +3,64 +62,8 +12,48 +19,22 +4,11 +24,30 +22,31 +32,45 +19,68 +12,60 +7,32 +22,38 +25,58 +55,42 +47,70 +18,28 +66,62 +34,41 +44,57 +4,10 +53,64 +38,34 +12,22 +37,70 +0,42 +30,31 +35,54 +61,48 +58,34 +36,38 +66,43 +54,52 +39,66 +43,62 +60,52 +37,44 +42,22 +53,0 +70,25 +18,40 +69,20 +53,58 +21,18 +25,12 +0,67 +25,44 +22,14 +48,32 +48,38 +18,15 +52,30 +34,15 +52,43 +52,52 +46,63 +2,22 +10,21 +22,64 +37,58 +10,31 +21,64 +6,40 +0,58 +36,42 +24,2 +65,20 +0,1 +2,58 +21,26 +0,68 +62,26 +8,32 +38,17 +11,56 +19,18 +31,20 +43,70 +0,5 +3,10 +14,38 +14,37 +32,33 +18,44 +62,53 +6,29 +70,30 +42,21 +18,37 +23,38 +14,60 +46,59 +34,22 +10,48 +8,63 +68,20 +50,58 +44,32 +4,67 +40,14 +22,34 +6,25 +38,52 +38,48 +32,30 +38,54 +26,49 +5,30 +34,48 +45,28 +56,58 +17,60 +10,38 +44,70 +24,49 +7,12 +42,38 +38,13 +52,48 +40,2 +52,59 +20,52 +21,68 +44,44 +2,70 +10,6 +24,52 +40,48 +48,20 +70,20 +36,23 +36,58 +20,27 +58,4 +2,8 +26,38 +4,38 +36,60 +12,57 +34,49 +30,29 +48,50 +18,60 +22,21 +64,62 +31,50 +20,37 +20,33 +5,40 +34,46 +12,12 +17,32 +2,29 +44,28 +58,45 +32,63 +54,30 +12,42 +16,28 +8,16 +66,42 +12,49 +12,63 +26,68 +18,25 +44,21 +17,6 +34,34 +36,67 +2,13 +26,3 +70,0 +39,58 +17,14 +18,12 +43,50 +16,25 +2,34 +8,50 +62,6 +26,41 +50,40 +30,56 +18,49 +4,32 +16,60 +22,8 +15,6 +21,36 +4,58 +29,28 +47,40 +36,62 +34,14 +33,60 +8,44 +43,8 +60,55 +39,30 +24,24 +36,11 +47,48 +38,32 +22,58 +31,10 +38,60 +16,46 +10,5 +23,50 +0,14 +4,60 +10,64 +20,22 +66,37 +28,51 +27,26 +38,21 +30,43 +19,20 +0,28 +16,54 +40,46 +34,5 +56,42 +8,34 +41,68 +61,8 +50,63 +27,14 +36,8 +26,36 +30,70 +36,20 +70,33 +41,2 +70,19 +5,22 +38,10 +10,40 +28,42 +42,41 +46,42 +0,23 +70,46 +24,40 +16,39 +38,56 +26,50 +22,5 +40,56 +34,57 +52,64 +46,70 +8,26 +3,34 +32,52 +70,44 +12,24 +8,10 +28,50 +14,16 +20,56 +9,60 +8,20 +37,34 +49,22 +27,24 +17,10 +68,30 +22,62 +22,15 +58,35 +69,44 +14,20 +48,22 +48,25 +51,2 +26,21 +6,30 +12,26 +33,12 +5,60 +60,56 +0,70 +4,56 +56,50 +58,47 +46,0 +50,22 +52,68 +4,4 +32,36 +34,60 +30,17 +36,56 +62,42 +28,23 +3,50 +35,28 +39,34 +38,3 +30,12 +20,7 +18,57 +52,60 +6,50 +52,49 +4,13 +56,56 +8,70 +44,8 +70,1 +28,62 +42,42 +60,12 +50,28 +47,38 +60,43 +50,54 +51,50 +55,12 +31,18 +47,32 +18,16 +16,6 +62,32 +24,69 +2,54 +62,27 +40,32 +38,68 +8,36 +59,70 +52,16 +68,37 +24,18 +53,8 +14,70 +31,60 +32,4 +33,36 +64,14 +52,22 +31,22 +12,51 +16,38 +30,1 +48,40 +57,56 +69,40 +25,32 +50,60 +49,4 +30,64 +46,22 +28,48 +42,56 +2,43 +46,6 +6,41 +43,46 +20,59 +54,6 +58,64 +0,59 +41,10 +54,42 +62,63 +30,57 +4,17 +22,40 +60,44 +52,42 +28,30 +7,2 +0,15 +22,27 +70,38 +30,68 +5,64 +35,38 +0,20 +17,62 +55,70 +5,4 +56,60 +34,42 +60,61 +40,27 +38,44 +5,16 +14,51 +18,26 +46,46 +69,26 +48,14 +32,43 +10,28 +27,22 +54,20 +14,48 +67,26 +57,0 +4,70 +59,12 +51,6 +40,10 +59,20 +32,8 +34,2 +20,18 +62,44 +64,46 +20,58 +56,31 +54,69 +28,14 +0,17 +22,12 +52,0 +20,44 +34,8 +32,29 +65,30 +56,3 +26,52 +4,47 +22,1 +13,38 +62,65 +0,31 +44,42 +42,15 +42,10 +24,38 +10,62 +26,64 +48,64 +48,21 +43,56 +8,46 +4,7 +9,0 +30,14 +56,61 +68,34 +56,55 +13,40 +50,62 +8,2 +50,39 +18,68 +0,37 +4,5 +47,36 +14,24 +44,58 +56,25 +24,62 +6,13 +11,2 +20,5 +18,11 +51,16 +56,6 +53,70 +32,0 +34,51 +37,56 +18,41 +42,70 +24,20 +22,44 +28,46 +20,38 +36,34 +10,56 +43,44 +0,60 +1,70 +37,0 +58,12 +68,17 +66,14 +70,40 +61,58 +53,40 +60,19 +14,4 +3,20 +6,38 +53,18 +24,8 +14,43 +42,43 +50,4 +57,30 +7,50 +37,40 +64,65 +36,47 +66,34 +16,27 +70,34 +20,14 +60,27 +32,31 +66,48 +43,28 +64,28 +67,54 +13,70 +50,38 +42,58 +52,26 +24,29 +20,48 +17,30 +66,67 +68,64 +68,9 +14,68 +70,24 +38,5 +60,47 +11,60 +67,12 +0,43 +1,12 +56,16 +38,22 +24,68 +51,8 +38,63 +60,22 +36,54 +38,61 +66,45 +46,27 +48,8 +6,0 +27,30 +8,40 +32,60 +5,62 +62,67 +64,32 +52,37 +60,5 +70,64 +10,18 +63,52 +18,20 +34,39 +1,62 +51,34 +40,49 +28,38 +51,62 +8,54 +45,58 +5,10 +12,15 +68,8 +26,22 +35,34 +58,32 +32,34 +10,10 +6,7 +38,42 +62,57 +52,6 +40,22 +62,70 +58,6 +50,48 +41,46 +52,18 +60,2 +25,70 +5,0 +50,6 +39,2 +2,4 +62,45 +48,23 +57,34 +55,66 +18,14 +9,52 +24,22 +54,60 +49,52 +12,54 +54,14 +63,44 +56,64 +4,0 +20,50 +18,64 +1,18 +14,41 +16,35 +29,2 +66,52 +12,50 +42,68 +34,24 +56,57 +66,32 +57,60 +28,8 +22,66 +32,32 +52,58 +50,42 +4,36 +16,32 +65,58 +56,20 +42,0 +17,4 +34,68 +49,36 +32,58 +68,50 +19,16 +6,70 +40,38 +60,37 +50,49 +34,40 +51,70 +1,38 +13,32 +53,66 +6,32 +65,32 +32,22 +14,55 +38,30 +44,26 +66,8 +50,30 +48,31 +5,36 +52,19 +29,30 +24,50 +55,36 +46,69 +64,18 +44,0 +27,10 +68,32 +60,13 +12,17 +10,34 +18,18 +70,52 +10,8 +12,38 +16,70 +8,9 +58,65 +64,21 +70,4 +5,48 +22,49 +36,2 +18,30 +41,6 +10,44 +48,48 +60,14 +23,42 +46,36 +18,56 +40,18 +36,40 +24,59 +64,64 +40,11 +59,50 +14,57 +25,46 +65,0 +32,16 +24,4 +40,34 +50,36 +38,50 +20,30 +66,38 +14,40 +70,62 +6,58 +12,28 +62,60 +68,28 +36,29 +58,37 +45,68 +22,22 +40,65 +49,64 +24,65 +40,8 +0,12 +40,64 +70,66 +23,62 +66,49 +28,32 +47,44 +10,12 +29,8 +26,18 +28,16 +49,50 +7,6 +30,54 +52,10 +32,10 +1,0 +40,28 +7,52 +18,54 +5,42 +58,10 +54,40 +41,4 +10,22 +24,56 +44,36 +39,14 +12,2 +65,48 +20,16 +10,4 +56,66 +40,68 +16,19 +45,42 +20,43 +50,18 +40,15 +0,6 +18,62 +14,2 +51,44 +35,48 +54,68 +7,4 +30,25 +27,36 +48,9 +42,46 +57,54 +68,55 +34,59 +58,16 +70,65 +70,14 +24,12 +46,12 +30,39 +55,2 +38,8 +62,22 +3,70 +60,40 +7,44 +9,44 +16,58 +64,2 +22,46 +40,45 +23,0 +62,30 +46,18 +23,6 +27,48 +31,66 +66,30 +52,9 +29,20 +36,21 +69,10 +24,41 +8,38 +44,34 +37,66 +68,4 +34,28 +21,44 +28,70 +42,30 +35,42 +46,16 +6,8 +36,48 +8,61 +14,26 +62,0 +28,45 +46,7 +7,68 +32,40 +61,24 +32,1 +40,12 +58,2 +62,58 +0,2 +42,60 +13,68 +48,59 +6,18 +36,28 +61,0 +63,28 +58,8 +44,33 +59,6 +64,6 +12,62 +30,32 +39,56 +70,32 +67,44 +56,11 +38,6 +2,36 +60,50 +55,26 +58,66 +55,8 +48,17 +56,2 +64,0 +60,41 +64,24 +42,52 +30,13 +16,20 +30,44 +1,26 +47,34 +24,54 +56,8 +16,0 +2,32 +62,38 +70,56 +18,50 +9,28 +63,38 +30,18 +10,70 +44,25 +57,40 +28,26 +54,0 +36,12 +32,24 +44,62 +52,23 +19,54 +45,30 +51,68 +8,8 +48,62 +40,60 +48,6 +48,69 +22,36 +61,10 +62,28 +51,66 +14,18 +53,56 +29,52 +63,4 +46,50 +26,69 +52,56 +21,54 \ No newline at end of file diff --git a/2024/go/day19/day19.go b/2024/go/day19/day19.go new file mode 100644 index 0000000..e4e19bd --- /dev/null +++ b/2024/go/day19/day19.go @@ -0,0 +1,87 @@ +package day19 + +import ( + "sort" + "strings" +) + +func Part1(input string) int { + in := strings.Split(input, "\n\n") + towels := strings.Split(in[0], ", ") + patterns := strings.Split(in[1], "\n") + // fmt.Println(towels, patterns) + count := 0 + not_possibles := make(map[string]bool) + for _, pattern := range patterns { + if isPossible(towels, pattern, not_possibles) { + // fmt.Println(count, pattern) + count++ + } + } + return count +} + +func Part2(input string) int { + in := strings.Split(input, "\n\n") + towels := strings.Split(in[0], ", ") + sort.Strings(towels) + patterns := strings.Split(in[1], "\n") + // fmt.Println(towels, patterns) + count := 0 + memo := make(map[string]int) + for _, pattern := range patterns { + count += countPossible(sortStringsByPrefix(towels), pattern, memo) + } + return count +} + +func isPossible(towels []string, pattern string, not_possibles map[string]bool) bool { + if pattern == "" { + return true + } + if not_possibles[pattern] { + return false + } + for _, towel := range towels { + if strings.HasPrefix(pattern, towel) { + if isPossible(towels, pattern[len(towel):], not_possibles) { + return true + } + } + } + not_possibles[pattern] = true + return false +} + +func countPossible(towels map[byte][]string, pattern string, memo map[string]int) int { + if pattern == "" { + return 1 + } + + //If memo has key + if val, ok := memo[pattern]; ok { + return val + } + + count := 0 + for _, towel := range towels[pattern[0]] { + if strings.HasPrefix(pattern, towel) { + count += countPossible(towels, pattern[len(towel):], memo) + } + } + + memo[pattern] = count + + return count +} + +func sortStringsByPrefix(slice []string) map[byte][]string { + result := make(map[byte][]string) + for _, str := range slice { + result[str[0]] = append(result[str[0]], str) + } + for _, t := range result { + sort.Strings(t) + } + return result +} diff --git a/2024/go/day19/day19_test.go b/2024/go/day19/day19_test.go new file mode 100644 index 0000000..fa99ba2 --- /dev/null +++ b/2024/go/day19/day19_test.go @@ -0,0 +1,42 @@ +package day19 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`r, wr, b, g, bwu, rb, gb, br + +brwrr +bggr +gbbr +rrbgbr +ubwu +bwurrg +brgr +bbrgwb`) + require.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`) + require.Equal(t, 16, r) +} + +func TestPart2Long(t *testing.T) { + r := Part2(`rrgwru, gwubwg, wgbbw, bwb, ugrgw, uwgguuw, wuggb, bgwb, ubrr, grruuub, rwbwgbub, wwwggg, uuw, gubuu, urwb, bubg, bubb, rruruuu, ubgr, uw, urugg, wubuu, brwb, buw, bgug, wgbwwrb, rwrgrr, gwgr, rrwrg, wwbwgbw, gguu, rgg, bwg, ruurrwg, wbu, ggg, wrw, brbw, wbb, rrbgg, gbb, gwwrubwu, rwgu, grgwwu, wguu, rwg, wbwug, rbur, gwg, wbrugu, wbwwgu, wbbuw, rwrg, rgru, rgb, bwwrg, bwur, rrubwu, gwb, ugwur, wbguwb, rbu, ubrwgw, ruwbr, wbbu, rrbwbg, rgub, rwgb, urwg, bbw, bugg, rugwg, rwbrwww, wuru, guu, brwbg, ug, ruuwruw, bguww, wwrgrurg, rrbgr, uubwurb, brrrwgg, bur, urg, rbg, wruw, gr, ugb, wwrbgrg, wbuuw, bbugu, uug, rrbb, rrbw, bgr, wwwru, rgu, urr, rg, wbgbru, brrgu, gubu, rurgr, wwbrgg, ruurwgwg, rbb, rbrugwb, gwwrbg, bwuuwrg, wu, b, bgwrb, uwggr, rgbb, rww, wgwb, gwgwr, uwbb, uww, gu, ubwuu, wbwwwug, rurwru, rr, rrg, uggr, bgwu, wbgbu, urggw, br, gubgugr, wgrb, bbgrrbu, brbg, wrg, bgrb, rwbwwur, uwr, bubu, grwb, ubb, wr, bbbgwr, bug, uwgwuwu, grb, bgw, uuu, ugr, wgbbgu, gbg, bgwub, urbgrw, rbruwg, gb, bbwgwur, uwbgwrr, ggrb, wbrrwrbu, gbbugrb, ub, rwb, gwr, ruwu, gurgu, rru, uuwwgwuw, bw, ruwbbb, rbgrgu, wuwu, grrugr, wgr, rbbr, rugr, rrrrbww, bwrr, wrbbr, uuwgr, gug, wwb, rgur, brbrr, gguw, grwubrg, rrrr, uwb, wuwwrrwg, gwbggr, rwrub, wuur, gub, rbgb, urrbubrr, uwubu, brbb, bwbr, bww, ruuubwu, ugbbbr, bub, rrug, wub, gruu, uu, bbu, gbbr, urrg, buwu, grw, grbbbu, bgb, ugubg, uwww, urw, wwubruww, buurb, www, bguurr, wwgu, wgb, ruwub, wggggbg, urrb, gbwuw, ubrrg, wrr, gbubgg, gw, wuw, wuug, wwrb, wgg, rgugrru, rgwrbr, guurrg, bgu, rurgb, gwggb, bwgbbw, ggwb, ubwgw, bbg, rbr, wgru, urwr, brr, rgbr, rgr, wwg, guwuru, uuggg, rrw, buu, urb, guwg, ugwwbuwb, rubb, brbuww, rwugru, ubu, wwub, bgwgb, wrug, rug, w, brgg, wwugwruw, ggrwb, bbwuwuu, uub, rrr, ggbrr, wbur, wurbru, wgu, brb, urbbb, gburbww, wbrgruru, rbugr, gubw, wgwgg, rwr, ugw, gggg, gwrwrg, rrub, gbwgg, grg, uwuur, gbwbbb, guw, gbwbb, uwu, ruw, bwr, rwgub, rbw, ggbwr, u, gwu, rrurrb, gwgg, uugwrbr, brw, ugburg, rwu, wwu, wbr, ruwgr, gbwbur, rwgr, rwbww, rbgr, rgbub, rbbuw, ruu, bwgw, bbwg, ubr, gurr, wwr, wwwguu, gbw, ggw, gru, wug, rubwrbrr, wbrrrr, uru, wbgw, wgur, uurgg, bbb, rbwgwbur, wwbwur, bbgubw, gww, brg, ugu, rgrgw, wwrrgugu, rrrwuww, uwwrb, wrb, rrgg, wubgrrb, bwwgrbww, gbr, gwrwu, brgwwbu, urrwub, rbru, bwrgrr, brwuwrb, guuur, wb, bbrb, brww, wuwrww, bu, rgw, rwbwug, bbug, urrgr, bg, bgg, wbgwbgru, wbrru, uwbbr, wbg, gwwur, gur, ubwb, gubbb, bb, wrugr, grur, rb, uwubrg, bwgrw, gbug, g, wuwubgw, ubw, urgu, rrrg, uwg, bbww, uwgrug, ww, ggu, gwbuwu, rgggwgr, wugw, gbrrg, ugg, bwu, ubuur, uurrw, uwwug, bgww, ubg, rw, gwgbwrg, wuu, rbgbg, buwbur, rub, ugbwwrgu, gbww, wbw, gurbwu, bruw, rggrbrgw, wguwu, ubwbwr, ru, uwur, ggb, uurwg, wguubgr, wru, rbrbr, rbwr, wwwrbb, urww, rur, bru, bbbwrw, uwrwrr, ruww, ububbgr, rrb, bggrwg, bbr, wrwrb, bwgwrbg, grbuwg, gg, ubuurwg, uur, guguwb, rugurgbw, bbuwbb + +wrbwgruugbbgwwurggwrgrrrurbgwbgggwbbgwgbrwggwur`) + require.Equal(t, 16, r) +} diff --git a/2024/go/day19/input.txt b/2024/go/day19/input.txt new file mode 100644 index 0000000..f06b5fa --- /dev/null +++ b/2024/go/day19/input.txt @@ -0,0 +1,402 @@ +rrgwru, gwubwg, wgbbw, bwb, ugrgw, uwgguuw, wuggb, bgwb, ubrr, grruuub, rwbwgbub, wwwggg, uuw, gubuu, urwb, bubg, bubb, rruruuu, ubgr, uw, urugg, wubuu, brwb, buw, bgug, wgbwwrb, rwrgrr, gwgr, rrwrg, wwbwgbw, gguu, rgg, bwg, ruurrwg, wbu, ggg, wrw, brbw, wbb, rrbgg, gbb, gwwrubwu, rwgu, grgwwu, wguu, rwg, wbwug, rbur, gwg, wbrugu, wbwwgu, wbbuw, rwrg, rgru, rgb, bwwrg, bwur, rrubwu, gwb, ugwur, wbguwb, rbu, ubrwgw, ruwbr, wbbu, rrbwbg, rgub, rwgb, urwg, bbw, bugg, rugwg, rwbrwww, wuru, guu, brwbg, ug, ruuwruw, bguww, wwrgrurg, rrbgr, uubwurb, brrrwgg, bur, urg, rbg, wruw, gr, ugb, wwrbgrg, wbuuw, bbugu, uug, rrbb, rrbw, bgr, wwwru, rgu, urr, rg, wbgbru, brrgu, gubu, rurgr, wwbrgg, ruurwgwg, rbb, rbrugwb, gwwrbg, bwuuwrg, wu, b, bgwrb, uwggr, rgbb, rww, wgwb, gwgwr, uwbb, uww, gu, ubwuu, wbwwwug, rurwru, rr, rrg, uggr, bgwu, wbgbu, urggw, br, gubgugr, wgrb, bbgrrbu, brbg, wrg, bgrb, rwbwwur, uwr, bubu, grwb, ubb, wr, bbbgwr, bug, uwgwuwu, grb, bgw, uuu, ugr, wgbbgu, gbg, bgwub, urbgrw, rbruwg, gb, bbwgwur, uwbgwrr, ggrb, wbrrwrbu, gbbugrb, ub, rwb, gwr, ruwu, gurgu, rru, uuwwgwuw, bw, ruwbbb, rbgrgu, wuwu, grrugr, wgr, rbbr, rugr, rrrrbww, bwrr, wrbbr, uuwgr, gug, wwb, rgur, brbrr, gguw, grwubrg, rrrr, uwb, wuwwrrwg, gwbggr, rwrub, wuur, gub, rbgb, urrbubrr, uwubu, brbb, bwbr, bww, ruuubwu, ugbbbr, bub, rrug, wub, gruu, uu, bbu, gbbr, urrg, buwu, grw, grbbbu, bgb, ugubg, uwww, urw, wwubruww, buurb, www, bguurr, wwgu, wgb, ruwub, wggggbg, urrb, gbwuw, ubrrg, wrr, gbubgg, gw, wuw, wuug, wwrb, wgg, rgugrru, rgwrbr, guurrg, bgu, rurgb, gwggb, bwgbbw, ggwb, ubwgw, bbg, rbr, wgru, urwr, brr, rgbr, rgr, wwg, guwuru, uuggg, rrw, buu, urb, guwg, ugwwbuwb, rubb, brbuww, rwugru, ubu, wwub, bgwgb, wrug, rug, w, brgg, wwugwruw, ggrwb, bbwuwuu, uub, rrr, ggbrr, wbur, wurbru, wgu, brb, urbbb, gburbww, wbrgruru, rbugr, gubw, wgwgg, rwr, ugw, gggg, gwrwrg, rrub, gbwgg, grg, uwuur, gbwbbb, guw, gbwbb, uwu, ruw, bwr, rwgub, rbw, ggbwr, u, gwu, rrurrb, gwgg, uugwrbr, brw, ugburg, rwu, wwu, wbr, ruwgr, gbwbur, rwgr, rwbww, rbgr, rgbub, rbbuw, ruu, bwgw, bbwg, ubr, gurr, wwr, wwwguu, gbw, ggw, gru, wug, rubwrbrr, wbrrrr, uru, wbgw, wgur, uurgg, bbb, rbwgwbur, wwbwur, bbgubw, gww, brg, ugu, rgrgw, wwrrgugu, rrrwuww, uwwrb, wrb, rrgg, wubgrrb, bwwgrbww, gbr, gwrwu, brgwwbu, urrwub, rbru, bwrgrr, brwuwrb, guuur, wb, bbrb, brww, wuwrww, bu, rgw, rwbwug, bbug, urrgr, bg, bgg, wbgwbgru, wbrru, uwbbr, wbg, gwwur, gur, ubwb, gubbb, bb, wrugr, grur, rb, uwubrg, bwgrw, gbug, g, wuwubgw, ubw, urgu, rrrg, uwg, bbww, uwgrug, ww, ggu, gwbuwu, rgggwgr, wugw, gbrrg, ugg, bwu, ubuur, uurrw, uwwug, bgww, ubg, rw, gwgbwrg, wuu, rbgbg, buwbur, rub, ugbwwrgu, gbww, wbw, gurbwu, bruw, rggrbrgw, wguwu, ubwbwr, ru, uwur, ggb, uurwg, wguubgr, wru, rbrbr, rbwr, wwwrbb, urww, rur, bru, bbbwrw, uwrwrr, ruww, ububbgr, rrb, bggrwg, bbr, wrwrb, bwgwrbg, grbuwg, gg, ubuurwg, uur, guguwb, rugurgbw, bbuwbb + +wrbwgruugbbgwwurggwrgrrrurbgwbgggwbbgwgbrwggwur +bururbrguwurbguwrubbbbbuburuuuwbgbgrwggbugrwrwurwwbrb +wgwgwbwuggbbwbrbgrwwgwbrbwbrbggrrgburbubwwur +wguwuugubwggburwwbbbbwrgwbrwuubgbbrugrbrrbrrugwuwguwrwwwur +rubwururuggurrgbgrburbrgbuuuuurwgubbbrbuwwbgbwgwrb +rwrwguwuwgbruwurgbwbgrugwgrggwwrrgrbwrurrrrgbrgbbgwggwb +buggrbwwurwuwbwrrwgubuwgburrrwbwubugugwurrbwgwburwubuurwbb +ggwgwrrwbrbgggbubwgwgguurbwwwggbuwbrubuubrrwur +uugugbrwbbwuugwwuwugurbuugbrugrrgbwgugggrgggrgrur +bwrubgugbuugbwrwbbubbgbugbbgruubwrwgubwguubbbugu +wrgrwwgbgubrrwbbgbwuurgbbwrrgwrrwuugrgubwrgrwbwbbbwrgrbb +rwbwwwgrgbrbgwurwbwwrrguwbrbwgrubrubguwurg +rbggguwguwrbgbbruruwgguuwwwrwbugwbbbbrrwgwb +wburgubbbrbgugwurbgrrwgbbuggbrggbrbubrwbrrwur +wgwrwurgrbwgwwuwrgwwbubwbubwbubggwbwgbwwgr +bgbbbgwwgbggrububrubbwwwguruurbbwwububwugwwuburgwurgrwr +rugwgbugbwbbrbgbwrbgwgurbuuwbbwbwbwbguugruwbrrrugwwu +rwbgruguuurwbubwrbrbwwrwurguwuwbbgggrurbgbgbwwwggwu +ubwubgbbrgbbbbgwwurgbuwuubgurwrggrrrgrbbbgggbrbb +wuuruwbwubrwgwuurugbrbwgubruuwwurwgwrbrugwrrbuuuww +ugwgbwrggrwwuwbgwwrubwuubrbrbwgbbwgbubburuguwguww +grbguwwuwgrburgggguugubwwgwguuwbwuwuwgugwggggwurrubwgbbwrb +buwbuwubrrugrrurwrwwbbbrugurgwguwugwwbrurrwbrgrg +gwwgggurwbwggwwbwrrgwwgurubrubbrbuuruurwur +rruguggbrrgwgwgrwbwwwugrbrubgruugrgwgubrgwbubwbrw +grbbbwrrugwrwwurwguugugguwuwggruubrgubguuurubrgrrruwub +wwrwguwwurbwuwwrrwgwggbgwruugbbrgruubwrwur +bgbwwwbbubrugwgubbgbggburrwggbbggbrbgwrrrbrgurwur +gwbwurgrwwbrgrubwgruubbrugbruruwuwgrubugwg +uguugbrbuuugbwwrgubrwgwrgggwrrgbrrbwbuwwwwbgbuwurbrbr +ugbggbwuwrgwugurggrugbrgwbwwbgbrwugubgrwrbuuwgrurwgguugwwwur +uwrwuggbuwwbururwgbrggwgwubburwwggguwwrrggwu +grrwwwrugbwuubrggrwgrwuuuwgwrwrbugrrrwubgwggwbguurbw +rgbuuwbgwgwuwurrgwrgugruwgwbgggbuugugbbwwrwugwrurubwr +gwguwrwgbbruuwrbbubburwgrrrrrwburrwuwrwgwgwur +bgbbuuguggrgrwugruwrbuuuuurwgbwbbubwrrggwrbw +rwwurubruwuwbrbwugrwbgwwuwwuuwuwurwwgwbrwgubgrruuurugwgg +wbwguwbrruruuwubggrbggwggugurgwgbrbugbwwbrbwuguuugr +uguuwrrbrwugrwwbbuwwrgbrwgbwubbubgwwbuuwgrwuwggbwr +wguwwrbbggrugbwrugbububgurrubggbwwugubbubuuguggrwur +uuurbwwwguurrbrgrrrbwgbwuuuwurwbuwgurwguugwrwggb +urrgwwwbuuwrwugrurgwgggrgbwuugruruuwwubruwwbru +wugugbguguwugbwgrgbrugrwwgrbwrgwwubruwwrggggwur +brubbgbwubwugbrruwububuuwbbwbrugwrbbrrggrgwrugrrwbbrrub +gwwruubbrrbbrwuubrwrrgwuwrgbuuwgggbburgwurrwbuuuub +wbugwuwbbwwwggrwwbgwuggbwuuwwgwuwbrubwrgubwurwwrguur +urgrgwrurbwggguubwuuwrbbwrgggggugurgggbbwbbwgwuu +wwgubrruggbgrwbggwbrubwggbwuuuwbbrwgbgbbbrbwruwwwwurw +wuurrggguwwbgbgubugrbwgwgggrwbwgbubuwwbbrwbuurwgwguwgurwur +rgrggggggbwrrbgggguurbbbubugbururrgrrrbbgwugbwrbgubb +rbburbururrbrurrwgrwrruwubwbgrrurgrubuwwur +bgguburbbruwugrurubbubgbggwgbgrrgwgwbguguwgubrrgwrbrwur +rrrwrbgwwrubwuwurgrrwbruwuwbgwbuguurgbrbrgwur +rrgbbgrurgrgrbrwggbubbbubbwgbuuwwugbrwgwrgwbru +bwggrguguburbbrwurrbgrgbgwwrwrrrwuwgwgbggwrggubwbgubbwurbb +gbwuwwgggrgwbbrrbuuruwubwrubgubwwbgwbgrbgurbg +bbwgrbbgwurwbrgbggwbwgwurburbburgugurbbbwbbbggrbu +urwgrwgguuuwruuwrbuggggwurbrbgwrbwbggwur +wbgrurwuwgugbuwgrwrwbbgrbbburwggugugrrgbrbbwrbbrruuwgwur +ubbuggwrwrgggrugwuwwuwrgruwwbrwruuugwgrrurgurrrbbugbr +uuugrwugwuuwurgwbrgwgugrrwbrrwrbuururubguuwrbwugrbbrgwur +ubrwgrruuugwgbrgbgwgugrbwwurgbwrbgwuubbuwrbgwwwwur +gguubbgggggwwwwrrrbwwubggwuggubguuuubwwugrrrgguwrbwrwwrwur +bgwuuuggwgbbbgwugwuuuwububgurgbwbbwbuwrbuwgrgg +buwwrrurugrgbgbubuwbgwgurbrrguwuwwurwwgrurrwrbwggrrbrrgrg +urggwurbbubbrubrggwgbbwbuubgggbggrwbwrrwburubg +rbuurgbbrrgbuwwrwgurrbgbrurwgbbrrbgbwbgbbwwuwwb +ugbggurgguuurggguuubgurrgurbuwrrgbgwwgbwwbwwrgbggrwwrbrbrb +wbwbubbrwubwggwuugrgubbuguwgurruugrrbwbbuwbgb +ubuggruwrwgwbubuuuubuwwgwrbuurbuwgwgruwgrgrurwrrrwgwbuwg +bwuuwubuwrwbwbubwgbwwwbwubgugugrugwrrrwgwbgw +ruwurrbgbuwrwrbwrbguwbgrbrrubugbubbwugrrbgubggbrugw +wggrwwgwurbgggbgubgrwggwbwbrbggwwbrrurwbbguwurgb +bwbgbbuwwruggbgrrrbbwbgrbbuwuuuugbwgggwwwgbwbbbwubwu +wrrbgbbbguwgrwrrrgbbugrruuuwbgwgbgwurbbuwrugg +bggrbrgwgrurwgubgwwwwuwbbuururugwwrbrgrbubwwur +ubbwwrwrwurwgbwrwwggwgggburbgggbuwrwbbwrubrubgugbrwwuw +rbguwwbrgrrbbwuuwwgurbwbrwbbbuuubrwrggwwubbgrrwgrrwuwu +wurrurgbwbgbwbrrubbrggbwgbwrwbuubgrbuwuwrbgrgrbw +rrbgbrurwrwugbgwwrggbrgbwugurwrbwwrubugubwru +guwbrgbuuurrguurgugwgwwrwwbrgbgwwwgbbgguwwwur +gggbrwguwguwgwurrgurruuuubrruggwrgbubugurrbububgrw +ggrburwwubbwwrwgbgggurrbgggwgrrbrbbbbwugbwrbrwubur +bbbgrugwwgwggbruwrgwwbgrbbuubuguwbggwwugbuugwbwrubgguuwwg +guwgwbggruuwgrwgrbwgrrwurwgbgwwurgubrubgbuubrwwwuw +rguwrbbrbubuguurbgwburguwbwbwgwggbgwgwwuwubrwruu +uguggubuwrwrugrwwuuuguguwwrwrbgwbwbwwggurbbggbrbguwwgubwwur +bggwbuuwurgbwbrbwbbrrgwwgugrrugubbrbggbrrwug +bwrruwuguwwgbwwrrbbgrrrrrrgugbwwrrgbuuwuwrwr +bgwbugbuwwrwwrwburwwgbgbwubrbrwgbugrruuugbbbrgurbwub +ruguuwgbrrguuuwbbwwbgbgrbwgwgbwbwwrbruubrw +rguwwwggbrwbruuwwbubbbbgbbwgrwgwggggrggwbgg +ruwrugwwbuwbwwwbrwbggwburrwwururguruuguguwgrbu +bgugbrbgggbbwugwbwuurbubruwwbrbbbgrgwrgrgggrbwrg +wbrgrgbrwbwbrwuuwbrbbwrwrrwbgwggubrbrbwrrgrbuwwr +grwuwgugrwbgrgwwbwwbggwgrwrgubgrrruuburrurwwrwbrrggwgwwbgwur +ubwbwbrrbgrgwuuwgwubgggrgurwuwbrwggurrgrgurrwubrubbw +rbrgwuwggbbubruruuuubbggwrgurrwrwwuwrgguurr +urgurgubgrgubwgugwrbuugrwrgwbgwwwwubrwwbguggrrrrrb +grrurbuubrwguguurrbrguwrrggwwwgburgrrrwbgwwbbrwrwrwgwub +uruwwwbgbbbbggbbbbuwwgubburwwuugburguurwur +gwurgwwwrgrurgbbrrrwrbggbgrwgbrgugruruuwwgrgwwwwrwuwubugbu +rugguwwgwrruurwbgwuguuruuuwbgbgubbubrrrbgwbwwwwbbbb +wbbwgwrgbwwburuurgrugbwggrwbgrgubbrbwurggbggbwwwrgggbr +ugrrurbugbwwrguugwugggrrugwgururwbbubgbrwrwur +rugbrrbwbbrrwbrgwuwbgugggruuubburgbrbububrrbubwuurub +wgurrbuugubgwwbruubrrwbwwubbgrububguwgbrrwwuwuwuuw +ubrruwbuguurgbbrrrwuggbggwbrrgwgubgwbruugwuuurgubrbwugwwb +wuwrrbuwuwbburgwurwggwugggbgrwrwgburgurgbg +uwwburubuwrrubbuwgwbugwrwbgugwgbbggwbugbwuwwbruggwur +bgrubrbwruwuuuwwrgrwubrggbbgbuubbgugubrrburbgu +bgrgrgbugrurwburwbbrruwrwbburwbwbggguwburrrwuggurbbrbgrbu +bguwuggrguwbrgruuuguwwgrbgrwbuugwrbrbgburwbwwbwrb +wggbwwbwwwbbggggurbbwuubgrbrgbbrrwuuwburrugwwubgru +rbgburuuggwwwguwwrbrggbrwuwgbrgbrwwbgrugwuubguwbu +gbrbuububuububrbgrgwurbbwbuugwbrwrururgugwgbwwgggbbgbwurgwur +ruurwgwggwbbwrbgrrurguwgwwrurgrgggrgguubgguwuwrw +uwbubgwguuubbbgbrrgwwrbbrururwgurrgbbrbgubwwgbgwuguuwurub +wrwrugugguwbuwwwwgrwrbgrbwuwburbbwwgubugwuguwuwwur +urbrbwwuggwurgwbrrbgrbwrbugbugbbbwuuguwrrwurrwur +rbrbubrrruggbrrwrwbruwburrwuwgwrrwgubbgguug +gubrurwwgwwuwbrrgurggrgbwwrrgbbruurgbuubrwgr +bbrwuugubuugwwwwgbrgubbbrgbrrguwrggrurrwgbrggbugbbwwbwrrgu +uugbbwwwgwgurgggrugubgbrwwrwrwrrurugrwwur +guwgwbwgrbwbrrwrbugbbwuugwbbwgwwbrwrwubbbrb +bbbrurugrugbwuguuwwrgbrbwbwwuwwbrwbrwurgbgbggrgruuuru +ubuubgbgbuwugugurbbwuubrrgbwwubuggwbururggrrrgr +ubgwwbgurbruggwwrubwggubbuubggbggbwwwwwwgubwgu +gburuwbbrrrbwwbgbugugguugbbbwbubbguwrbrgbbgwgburrugr +gbgwbgruwrgwrrurwuugrwugruwrgubwbrrbugubugugbbwu +burbubrgbwgrwwrwbbrbuururggwbwubugrwruruuwbuuggrwbgb +bbbwgubrburwbubwwbruubguugrgwrgguuruubbwbb +guwggggrgrrugrbbrwururugbbrwrurwgbwgrrrguwwrrbbbwuwuug +bgwrrrgwruwrbbuwgbrugruugwrrrugwwuubbugubbubgggubrrrwwg +bbgbrwrwrbwbbrgwwgbugugugrrbwbbbbrbgguwrbugrbwgwrbru +rrbwwggrgwurbuwbwbggbrrbggurugwgubgggbrrbwwrugrwgurbugur +ggburugbwruugbburgrbugrgrwbbwbruubgubgbgubugubbbgrrbrgrg +rwuwrgbwgwubwubrrbgbrrbwrrwgugwgguubbrbbwguwwwwur +wuwwgbbbwrgwrrbrrgwbwwubbwrwrrrwwuuburuubwbuubuwwbbgg +wbbgwrgbrbubwggbuwwuwwggrugwwrugrgwuubbwuugrggbbrgubwrrgu +burrbwgrgbrgrruugwbwruugwbbbburwbbuwgrwuguwrbgwur +bbwbwuwwwbwbrgwwwrrwggbwgruurrbrgwggbrbbbrrbgbbgrrrwrugg +wwwbbgwgbwwrbugurgugrrggbuguugrbbgwrguugggbwwugrugu +gurbrggwrwugwgrggrbrgwugbrbuugrwurrwgrbwurwuuruwuggwruwr +guuwgguwwubrbwwguubugurbwbrrwwwbbwgggrwururgg +wubuuuurbuwbrrrurbggbgrwbbwrbuwwbwwbrbrggrwgggwwwur +wgwrwugbrwgubguguuugwbubuwbbrwgbbgrgubrruuuuuuu +wbrgwggwruuwruwwrbruubuwgwwwbuuugbwububbgwbgwbgbg +wwwwgwwwugrwgrgrgwbbuwgbgruwugrrwuugbrbrurrrguubwwur +bgbubwrwwrgrwrbuwgurrguwbruuwgguwrurwrurrwgugggbwrbwwggw +rwwurgwuwgbbwggwwuurbwbbwrwrbwbrwrgbrbbrwbr +wrugbbrgbbugrrwbrwgwuggrbrwwwgbgbbuuurwuwubbggubbg +grrwurgburgruuurgrbuurgwgwurubgbbubbubuwwwbwbuuubbbrrwur +uguuguurrwbbwgwrwgruubgguubgwggbburbuwwgbrwruururwbgrgrrgu +gugbrwwwbguggrubbuwbbbwggbgurruruwubrwggruurwbggrrruurwbb +grgrbwuurwwwuwuwwwgbuubwbuuruwwwgguubwbruggbrgub +gwruurrugubbwbbwrggrgurbwuugbgbgbubbugbgugbwbwuu +wuubwrgrruwwrurwgwwurbugrgbrbuggbuwwbwrrrbrwr +urwbwrrbbgbbwwuwbwubrbruwgubruuuguguwubguwugurubr +rrwbbrwrbbuwbwrwwwrrguwrbgrwbubwuurugurgbwrru +wwrbgbubrrruubrggbrrgugbwuwgrbgbburbbgwur +gwuwggbbrbgbbgubgbwburbguuggugrrwrbubruuurggwrw +rurruwgrrrurwwwbbuuuwbrbrbrugrgwgrrrwbbgrgwguguubg +bwgwrwggwggrwbwbbrbbbrgrwbbuubrugbwbrbwggbwb +bwwwbugwbgubgrruwrbubggwurwwuuggbrugrrururggrbwbbggbrwgug +uugwuuggrrbgugbwuubwwugwruubbbrrwbwgbbruuggggwuurgrw +bwrururgwugwrwuwbbrgwgugrurwgrwbwwwwrbgwur +ugrrrurbggwwugubwrggwgrggrrbuggrurbbbrrugwurubbbguruwbuwb +uwbgubgrrwrbgrgurubgrurrrguwbbuurbuwbgwbgruwrggwur +rwurbubbwububgbbubbugubrbbuuwwwuuuruwwrwruwwbwbwwgwbrggbg +bwgrguuruwwbwrbubwrbbbbuburwwugwbwurggwguurguguurww +wwruuguwbgurrgwrubbbwurgubguuuwrwgwugwgrrwwwrgurrurrbgrbrwur +grurwwuwwububrrggbwrgrgbuggrwrbruubwbggggrbbwrwbwwrugr +brbuguuwuubuuwurrrburrgbbuwgwbwwwrrgwrwwuwuwbguurbrr +wgrbuurrbubrrgbgbbbbbrrwrurrwgbgwbrrrwrbubruubuubwrbbbwwur +wruuuggbrburwrbbwrwbwrbwrbrurbbgggggguuwgbbgrguggwruuuww +bgubgggbruwwrggrwubbbgbrbbrwrgbruugwruggguwwur +bbgrbgruburguuwwruubrbbbwwrrrgugbgururgbgwggrbwrwur +ubwubwwubbuurwuuruwrgwwwwwbbwgwrggbwrwbbubwgubbuwru +bbuguuwuuwururbgubrruruguwwwugwruwbwgwrwbgwur +wuwrugbugwbubwwwrrugbbrruwgwgruuugbgrurbwwrwg +ubgwwwwgrbbrrgwwwbugrubwwwrurbbgbbwrbbgubwbruurbuurwr +gguggugrbwrwuubgrurbgbgrgugbgrurbuwguburbuwbrwbrwgubgu +uubgrwbgwuurrwwuubwburbruwgrrrgubuwwwwrgwu +wwrbwwwgubgubrguugrwbubwgrbuuurrgrwruwbgubwuuwuwggwububrgwur +brgrgwbgrbbbgwgbugwwubgruruubgguuwrwuwwrwbbbgbururw +rrgwguwuuubrurwwwrrugbwugrubrrwurrbrrrbggrb +ugwgwbbbrggbwugbrrbruuubrggwugruguugugwbggwrgrw +wurbrrgbbwwrwgwwgugwwbbbgbwwbrwbbggrgbggbwru +ubwwwrurbubbwbggbbwrwbrrwgwwubguggwwggbggwur +bgwgwwuurwgbbrugrgrgubrguwwrugwwwgrbuuwbrbwbrwgwwwbwurwg +wrrbubuuguruwrbggbugbgwwruuwgbwubwbruwgbwwwwrguwbwwur +urrrrbugwrwrurgubrwubbrrwbrgwuururbuwrgrggugrw +gggubrggugbbbwbwgrgwwruwwwbuwbuwgggbbbgwubuguuurwbgu +uruuruugbrggruwbuguwbggbrgwbbburuwbwwuwrgbw +bwwuwgrggrgrurwwbbbbgwwuwbwwrwwbggrrguugbgruuuubwuwugu +gwbububrubrgwubrbwrwgwubrgrwrwbrrubggwbgbuuwrwubrwwwrggg +wbggbrrbrggbuwwwbrurbbgrbuuuwrrbuguruwurwgr +brubbuwubbbwgbgrwuggbgggbrbbguuwuuwrgubbrugbbbgugrrwur +gruuubwuggbbggugrbbgbwrwgwwgwgwuwwbruuugbugrrru +wwbwwuwrguubrwugrbrgggbwuwwgbrbwguurbrbwguuwwrbgwwubwwuwbu +grrbgrwwwugbwbguwgrgrrbubgwrwwgrggwuwuwrgggbugrbugg +wuuwgbggburgggrgubbrugbgrbruubruwguuggwwuwbgggwuwwgu +wurubwgrgurrgbgrgbbwbgggwwuwbbgbrruugggruguggbwruwru +gbrugrbuwrgwrrurrrurrwuwgwgbbgwrwgugwbwrbbwrrbrrub +ugbwrugbruwwurwwrwgbuwrgrrgwrugbruggrrbwbuwbburwur +guuuwuwbuurggburbbuugwgwrgguugrguguubbbbuug +rrgubrbbwuggurbrrgrbbbwwwrgrrbgwgubruwguruurwgwgbwgbrwur +wuggruwburuwbubuwuwbwwrrwrbwgwwubuwrugbggwgbwbuuwg +wwrrbwgubbrrwuwbggrwwrbubbuggwrrwwrrgugurguurwrrwbbwgbw +grggruubbgubugwgugbwgbuuwugrwwrrwrggwurwuguuurgrwuwrbwrwwr +wrguwwubrgrgbuuurggwubbwgwubgbgrrburbgwururbbgwrburr +gwbgguuwwgrbbbrwbuwgrrgwubwgurbwrruwrggbugrwwwur +wrbrwrgrurrugwuggbbrrurburubwrrbuugubrrrrbugwrrwgbuwrgbbr +rbuggurgwgwwuuwuuwubbbrguugbubrurwrrwuuwugubwugrugbrrwur +brgwburbwbrbrwgwruwwggbbgrwrbguguugugubgrgwgwwr +wrbbbrwgwbrgggrrwbwgbbwbrggrwrburrbgbgrbbuugwg +uggbwubwrwwbrgrwwruuwwrggbwrbuwurwgurgbuguwuugbwbg +brgwbgbuggbbgrguggbwggrgrwrubururuwubrgwwbbgwrwugwugwr +buruuuuwgugwbgbrwrbururbrurwwbburuurbwuuugbbbwwuwrugugbrg +rrgrrrgwggguuwugrwwguubbbuggrwrbruuuguwgwg +ugbgruuwruwbwbgrgggbwugbwbbwurugwgwuurbuwrg +bwuwugbbubggwwrwubuubwgrrbrrbugrurubrrguwrbr +rguwwugwruwrgbwwgbgugrwubrwrbbwwrbggubugubwgwrbrwuuubu +wgbwggggrgrgrbgurwbuugwuwwrbwbbbugruwgubwwgrrgwur +ugrgwgguuuwbrgrgrugbruwrbbbrguwuurgurgugurrgbubuwgubuwbwu +ggwwwbgwgwguwrrruwuubwgbrubgruuurrrubuurrrgbguurw +grwrwuubrwwurbwgbggwrwuuruwguuurrgbwguwubwbuurgwbgugwuwbwr +bbwuuwrrwgrrbgrgbruurguuubuwrwguwuwbbggwrubbug +rrbbruwbbrbbrbbbwbubbgwurrbubrrbrrubbwugubr +burrubrururbguwwgrubwwbgwugrrwgbbgwgrwbubgurgug +wuwubwwburgugwwbgwurbbwwgrwguguwwbgwggubgbwbbrgrurrbbr +buruwbrugwrwbrgruurbrwbbrggbwgugwbuwgrgbwwwruugrggrg +wrgurwwgwwrbrubuwrbrruurrbbgggwuwgugwwurbwgurgwbbbrwr +buubbgbrrbwgwwwbgwrubwrugruurgggwrbugubrgwrrgbu +bwrbbuguugbgurbruwgbbruuwubwbggbrbrbugggubbbwwwbbguggwwgrg +burggrbrgwrwbwwbrbuwuguwwwwbrbbrbrbbwwur +uwbrggwrbwuruubggbwuurubrrbwubrwwgugwruwgugguu +grbgggbwbbwwuwbrggrurwwgbrruwgbwgbruwwruwubrruwwbbwuuw +wbrrgrrguwbuuugbrrrgggurbrwbwwgwrwbrurwggubbuwuwgwgwbbbbb +brbgubgrwrbbuwwwbwrguwwwuggurrubrugruwrguuwwubgru +rrbbrguwrrugwuubrwgwwrubrubuwbuwbrgwbrwuruuguwuuwrgrgur +rgwrbggrbwuwwwggrggrgrwwgwgrbbgrubuwugbrrwrbgwb +wwwugwuggbgwwrrbuwwrrwuuguggbgbwwrrbggwrbwwguur +ugugbrwrgwbrrrbbrwrrrbuugubrwgwrrgugwbwgbguuwwwruguwgrwg +gwgrbgguuurbwbwbwuuguubgbrgrrguwrbubgwwrug +gubwwbrwrruwbwwrwwwbrgwbugrrbuwubruuwbrwbbwubrw +uggwgbwrguwwubbugbgrwurgubggugwwwwbwuburwgub +uwrrgwrrrwrwbgwruuugbwbgwggwrrrwwgurrrrrgurwwwgruruwgw +urrubgggbbwgbbrbrbwrrwgrwwgrggwbbbrrurgrrurgubwbwu +grurubrburbbwwuuwrubbbbwrwbbwrgwrbggwgguwuuwwur +bwbbwbrgrbwrwbbwugrugurruruububburwuwgugguwrwur +rbrrbgubwbgwuwuuwwwrubgggwwuuugggubbrrbbggwrwb +gbwrugrgubwbrwwurbbgwgrrbuubrrubuwubguuuwgu +bggbwuuubgwrgwuwbbuguwrburrrurbbubrgwrwrwgrg +wgurrrrbbggwbbruwbwbrbguuubwwrbuurbrurrurwur +gwbgbgwbruuruwuurrrrurrwbgrbbwguwgbgrwgrrwuwwwgbbrr +rubburrrwggbwuwrbggrubrgurgwbgwbwurgbgwrbgwg +uubuwbubrggrwwwuurgburbuguuugrbguuwugubwbgwrgrggu +uwurgbguubbuuwrubbgubggurrgrrbbrrrwwugwruwr +uwwgwugguugrugbubbrwwgubwubbwrwguwbwguwggrgugrwguggubrwb +bgrbggwgbbgrggwwrbbubwwugbwgrurrurbuuurbrbburbruur +rubwrbrrwwgwuwbbbubrguggwwbuwrrguwbwrgggwburbwuurwb +rrgbbwwwbwbubwbwrugbugguwbuwrubuwrubbgwbgwgwrbgurrurruu +gbuwwwwgrguwgwbgrugrrwbwuuguubgrbbugbbgrgbrgbb +rwrwbgruwbrbgbrbgwwrbwubbwwuwbrbbbburuwrugggr +buubbrbubwwuggurrwwuguuuwbrbwbrgggrubwbbrgbwurugrwgrrwwgb +rrgbuwbwuuwwwbwuugrurggwbrbwwuruwwwuruwur +grrbrwwbguwbbggguuwwugugrugrgwwwbrgrgbguggwrr +rbgrwugbgggbubugwrburgggrbwbrruuuubrrrguugruwwrbgrbwg +urgrbrrrgwuwwgguwuwuuubwwrugwrgbwrbuwuwbgwbwurwwwrgbrrggb +rgrwwwwwugbgugbugrgbuwrgwrwgburuwrrgrbwbuubwguwwwugbrg +wbbbggwwuuwwgwwuguuuwuwwugrwwwubgugurrrugubwgw +brbuwwwgwgurwgbwrrbrgruguwgbrbwububbrgrbuwrugrwwur +uubuuggbguurwbrwgrburbbbwburubgurguugbbruruur +grrrwbuwuwruwgbwwwgbbgwbbguwbwurrugwwbuwbuuurrurwur +ruruwrwuuwbrgbugwwgwgbrbwwrrrwrbrburrgruwrwwbbbugubwwgrbww +bgwruugguuwuurbubgwgrgruwbuwwwwguwwwrbgrwrurwbggrguw +wuwwwwuuburggurgwrgruuwggbguurwbggrwbuugrwbggurbgrgb +rugwbbuwrgruubgggwuwwrggbgwwbuubrguwugbburrbgrrbwrru +gubgwgwuubwuubrbrbbwwbwrbguruuurgrgrggurbuguwbgr +ubbwgruubgbuwuurrguwrbuwwgubbrgwrruggurbuguwrbrbbwgur +wgggurbbwuubrbwrgwuurrbwgwburrwrbuuwbwurwur +gwgbwwrubwugbrgrwbgwbgruwugbwubbbbbwubbubg +ugubrbguubwgbgwugbwgwrrgruugbbbbruwugwrurugrgrwwrbw +urgurgubwuugbgbgurbbrrgggggwuwgrwbwgbubwuruuwbub +rrrruwwgwgubwbubbggrbruuururugbwwgwwugwgggwguggg +uggbbuubrurwubuuwrurrbwwuuwubrbgwrbrrrrwbrbgwggwuruur +rbbbwbgrurugbbwguurrugubrbgbgggrbuguwrgwwbgrrw +wrgwrugruwbgrwbgbbguwgubwwbugubrgbrgwgburguubbbbuwrwwur +rwbuurbrbgrgrgbgbbbrgbrrgggrbbrgrruuubrguubbrgrwwwwuwrubgr +bubwrwwbrruwrbuuugggrrrruuwrbwwbggwrwbuuguwwbgurgbu +uwwrwwgbbwrugruuuuruuwuwgrwbwrbgubwwrbbwgbgbgwg +buuwrguuuurguwbrbrrwguubrrubgggwwrbbwgbgrr +uuwwgwuwgbgwruwuuubrrbwuwrrurrwbgwbuwbwurwur +ubgurwwbwgwruurwwubrwuwrbugggruurwugurruwguwgbrgrugr +uguuguwubgrgbrbgbwgwuwwwubbwrgrbuguuugrwur +rrwbrrrbuwwgwgrggwrwbrrubwrbrrbbwubrrwwur +ubugrwwbbrgugburbgrrwwwuugbwrugbgurgrwrgubur +bgwbgguwrgwruwgwwrwrugurrugbrggubwbbgwwwwrbwwrugggbrwggrrw +wurrguggggwgbuwwguwbbbbgwburwwbrrwrrgwur +gbrwwgrguuwwrrgugubwbgwuuugwgrwbbwrwbgurugruurwuuubrwur +rrrwugwrrwwruwbggwrruuwgrbuwbbgbbggruwwbgruwggburwg +brbwwggbgwwbgruwubbbbggwwubrgubbuwububuwurwbbwwbwu +gbbggrbwwuuwuugrwuugwbrurrruububggwrwggrgurwwur +rgbwwrruugbgruruwuburgrwrwbbuwgrggguugugurwggwggrgugggrg +brbbwrruuubuwurrrwburbrbwgwurrbrgbrwrbgguruuwuuurbgbbg +gwbrwbguugbbwrgrgrbgbruwgwruwbrwugrrgbwwgb +wuurgwugrugguwwwbwwubwuubgwubuuubrwuuububrugwbgggrruggrrr +rggbuwwggruugruwugggrgrbwbwrggrgugwubrrgrwgwrwuru +uguguwwwgugrgbrwgbubwwuurbgguwubrrugrruruwrgrwwubgwg +gbbbrwurrubrugwrgwrbugwggugrwuubuwbgrurbuwbgbbbgw +wrgwuwbwrbbrgrbwbrbuggbuwbrgurwggwbbgrwwuwbbgwrrrgrubbb +bbubbrgwrgbbbrgguurggrurwuwubgwuwubburbgwrgw +urggrwbgbggrwbwburbbubggbrgbgwbrururrgwgbbuwbu +urggbbbrbubbwubbbbrbgubrwrrwbuwbbbbrguwrubbuwuwgg +ugugbubbugggwwbbruggwwrugbrurguugbrwbgwuuwbbwuguggb +wrbwrrbgrurbuwwrwwwrrrbrbuuwbuwbggwgggwuuwwuwbrwwrwbrrrrrwur +ggubgbruuuwbgrubwbbubgruwwwuurbrwbgwrrwbrbrgu +bwbbrgwgburwwbgrrwgbururwrwggguwgbwwbgwuuggwuggrbg +ugwwgugbuwruuggugggwrbuguuugggwbrwrbubguuuubwbwgwg +buugrgrruurbbrbgguubgbgbbuuuwuwgwbrrgwur +gwbbguuwwbburguugubrwgwwwubbubrgwruurwwruruwu +guuwbugrurwbbugrbrwuwbgwbrgruruwugwwbrrgrwgrwrugggbwwur +grurbgrrubwwwbwrrurwbwbgurwuwgwruwwwurwrwwrrugw +bwgbuwurrugwwrurbrurwgwubrrrrbuwwbruuggwbrubbrgur +ugwuwgrubrrgbbrwwgwggbwubgrbrbwwbgwbgrbuwuwwrrwg +ubbuwubugwwrgwrrwwubguurgbgwrbubwwbrwrwbbburuuruuurbuubu +wrbrgwubgrruuwbgguwbubwbbggrbgwbwrgwwrrgrgrbgbugubwg +wrugubgwbruwgrgrbgrugggwwwrwrwuwbururgrwrggwwrubuwbbbggbu +wugubugbbrrwwwrguburwrguwrugubwgugrbbguwrgwwwbgggubrrwgbgwur +rwrbgwguwurbrrbbbrrwrugrbggggwruubwruwbgbwrrrwbg +brrgrrugggggwgurgububrgbuuwgubugbgbgbuggwbburbgugugbw +gbbugurwwrbrbwbwwgbbrrruuwbubwwwgrbubuwgrw +wgubburbrubrwwugugwrburrbgurbgbruuurwgubgwb +ubwubwbgwrgwwuwbugbrwgbgrwgrwuwbrbububguguwrgwrwwwur +uwgwrwguwrbrgguwbgubrbwrurrwubbwbggbwbbbwburrruwbruugu +bwbwwbrwwwuwrrbugrgrrbwwgrugurwuubwbwgguwgbwwgwuwrbrb +wurrwgubuuwrrbbbuggwbwugrbgwwbrurwwuwwuruur +wgggrgrurbbbrbuurubgububwuwrgbbuuugbwwwbgurbruwbugubr +rurrubrwrwubrgurbbbgwrrbubwggbwwbbwgguugwrwwubuw +wwuggububbrrbbwrbwrwburwbrgwwgwugguwgrbwuwbuurrwwugbwr +ggrwbrwrbwwbwwwbgbgbbgwurrbwwbgubwbgrgubugr +rbbbbgrggurwuguurugugrruugwrwgrwgrbwbbwgrbrurggr +wrubwggwbuwrbggwbuwggwbwgwrruguwrbubrggbrwur +gwgbwrwugbwuwubwwwgrbrrbwubbwbwrubbbrwuuuwuw +bgwgubbuuugurwrbubrurburggwbrguwbggbgbbbbg +gwurgbbburbrrubgwwruwrwugbwwwwruuggwgguwuuuwuuurubgru +bgrwbuugwwrgggrggwrgrbbggrgbwrrwubwububurrrbgwggg +bbwuwrurwgbrrurguggrgwgggwuurbrrrurguwurrwgwruwbbgb +guwugbwrwwbgrrrugwuwurubwbwurgbwubwubbrwgwugb +uwrurbgwubuwruuggburburggwguwwbwgggwgbrgrwwrrrgww +ggwwbgrbuwrruurugggwrbwwgrgrwburgrwwwwrwbrbrrwrgurggrgwur +wurbwgrugbwugrbugbrrwugruwrgubuuwuwgrgbwgggb +wwuubuuuwrguuwwugbuwuububwubbguubgbubgrrbugbrgrwrbwrb +wwbrbwgbggbuubrwwgrguubbrbbwbbuwurbggubrrrrw +ggrugurgbwggwwwrwwbbgbuubuuubbwrurbubwbgbrwur +wgbrwgurwwgbbwwurugwgwugrggwurgrgbbbbrrbrbrgwuur +urwrbrgrwgwuurgubugbburugbgbguwbubgbwugbuubu +bwgwwuugrrrgrbwbggwuuwwurugbwbwgubgbwrubwgrw +brurrbbgubrrrurwwwwbubbgwgwgrugubbggwbggwubuuug +uwbwgrubgbbgrrrrubrgrgrbrbgurrbrgwrrbwgrwrgrgwgrrubbuuwu +wgbbrwurubuuwgruwgubrwwwubgbggrburruggbbrrwwruwwwwur +uwurruwrugbgbwrrbgwrwuwwuubruwrubrwwbwrwgggwugbrrrrwur +bbuggwgbbruurubuuwgbbwbrbrrbggggrrbuubrububbubugu +brbguwururwguwbrgrrwbbbwbgrgbgwgwgwgrrggrwrbbrburrur +gwbbrrwwrggwrrgwwrwwwurrggbuugubbrwbbggwur +rgguburbuggbbbrgurrwrwrggbrgrbuwbrgwwbwrurbugbbbu +buwuwwbuwugrrgrwuugbrgwurwwgguwgbggrrurbwgrurrwur +uugubgwggruuuggwgrbuwbrbuuwbgugwbuugwbgbgwuuuwgruwu +rwwubbrgwbuwbbguugwgbwburrwubruubbuwwwwwgbbbbruwuuurwur +rrrrwwguwgrurbubgbrgbrurwwgubwuuwuwbbwruwwur +bbubuubgbwgbruwugggurrwguggbwbbbbbgrbwggubwgwubgbwrwur +bubgwubbwrrbbwgurwrubrrubgurwwgrubbbugrgub +rbwgrbubbubwwrbgbgbwgrbubguurwwgguwgubbrrbubwr +guugbrgwbubububrbrwurrgwurbwrggbgbrbwwrbbuggugwgubrwrwbbbb +grrbguguwwwuwurruubggguububgwurbubrrurwrwguggbrwrwgugb +rgbgbugubuwrbbrwwuwubbububgwbugwurruwrbrgwg +bwbwgubgwbwwurrubgbrgurugugwwrwrrbwwbbwggrb +uuwwrgrurgbwgruuuubbugrrwbwgrbggwbubwbwbwgwuubugbrwur +bbwrbrwrrrrwwbbguwrbruwgbbrwurwrwuugbwgugurwwugrrurgugubu +urgwrrgrgggrguggbgrbggwuuburbwrwgwgrgbwrgg +ruuuwrwubrwwuguurrwgbrbbgggrrrgrbuwuuwwrrguu +grwwrrrrggbuwurwbugugugrrwwuwwgggrbrwwrbwuwbwgw +rrwbbruwuwwwuggwrwbrgwwgggrbrrgwrbgbwbbrwrbubgrrggwrwgrg +uwwwbwwuurrguuwwubwrbbuubbwwgrbwwbbwwwurwbuuwrwrwggwur +grrgwbgubwrbubrwubguburrggbbugwwwwruuwwuggbg +grbwwuwubbgggwbbuggrgwburwwrruruugrgwwwgwwwrgrbuwbrgb +ggrggrrgbgggrrgrbrurwgbgrrwbgruwwbbggbgwwbubwrggwgr +wgrubwrwbbrgbwuurwbwwuubwgbuubbwrugugurbgwrbwrbuwgguurww +rbwbwbgwuubrrrgrrubbbbburbbwuwwubbbguubgwwwur +buuuwrwwbuuguurwwbuwwgrgrgrrrugwrggbggwbgubw +wwuwwwwbrrwbwgwuuwwwgwguwgwubuwwgwuggrbwbrr +gbbgbwbbrbrgwrwburbrbwrburrgwwuguruubrgubgrgrwugb +urbgbwwrrwguurugruurbuwbruwrguuburguwwuuruwbggbwuwggb +bwrwwuurugugggwuuwrbrgbuugbuwbuubrgrrrrbwgbgwgbu +ubwrugrgrwruwggbwruuggbubwguguubwrrbggbgwggrww +uwbubuuwbgbuwbguwuwwgbggugwwubrbubgbuwrrbuwbuwrwbubgbrgru +bbruurgrwuwbrgruruwwuwbwuugwurbbrwgugrrrurbubgrgw +wbgwwrrwgwrugwurgbggbgwwgbwrbrbwwrrwugwrwbuuugguww diff --git a/2024/go/go.mod b/2024/go/go.mod index d7d05a2..14e4a5c 100644 --- a/2024/go/go.mod +++ b/2024/go/go.mod @@ -2,7 +2,13 @@ module adventofcode2024 go 1.19 -require golang.org/x/exp v0.0.0-20221208152030-732eee02a75a +require ( + github.com/deckarep/golang-set/v2 v2.7.0 + github.com/luxedo/esb_fireplace-go v0.3.0 + golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c +) + +require github.com/spf13/pflag v1.0.5 // indirect require ( github.com/davecgh/go-spew v1.1.1 // indirect diff --git a/2024/go/go.sum b/2024/go/go.sum index b858da8..7ec55ac 100644 --- a/2024/go/go.sum +++ b/2024/go/go.sum @@ -1,11 +1,18 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set/v2 v2.7.0 h1:gIloKvD7yH2oip4VLhsv3JyLLFnC0Y2mlusgcvJYW5k= +github.com/deckarep/golang-set/v2 v2.7.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/luxedo/esb_fireplace-go v0.3.0 h1:zhpWG9AJfWEzqiaYsPjlBAwIMa1IF1gWoQoM4zvdLxI= +github.com/luxedo/esb_fireplace-go v0.3.0/go.mod h1:L8zIvYDHIKTHc3g3VACvjS0qBHvKmt31KRjWLP5ftkU= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -golang.org/x/exp v0.0.0-20221208152030-732eee02a75a h1:4iLhBPcpqFmylhnkbY3W0ONLUYYkDAW9xMFLfxgsvCw= -golang.org/x/exp v0.0.0-20221208152030-732eee02a75a/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY= +golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/2024/go/main.go b/2024/go/main.go index 46934c6..be5c3e7 100644 --- a/2024/go/main.go +++ b/2024/go/main.go @@ -2,23 +2,39 @@ package main import ( "fmt" -// "math/rand" + "time" + + // "math/rand" "os" -// "strings" -// "time" - "adventofcode2024/utils" + // "strings" + // "time" "adventofcode2024/day01" "adventofcode2024/day02" "adventofcode2024/day03" "adventofcode2024/day04" - + "adventofcode2024/day06" + "adventofcode2024/day07" + "adventofcode2024/day08" + "adventofcode2024/day09" + "adventofcode2024/day10" + "adventofcode2024/day11" + "adventofcode2024/day12" + "adventofcode2024/day13" + "adventofcode2024/day14" + "adventofcode2024/day15" + "adventofcode2024/day16" + "adventofcode2024/day17" + "adventofcode2024/day18" + "adventofcode2024/day19" + "adventofcode2024/utils" ) + // Usage: go run main.go // assumes input is in day/input.txt func main() { d := day() fmt.Printf("Running day %02d\n", d) - + start := time.Now() switch d { case 1: fmt.Printf("part 1: %d\n", day01.Part1(utils.Readfile(d))) @@ -32,14 +48,58 @@ func main() { case 4: fmt.Printf("part 1: %d\n", day04.Part1(utils.Readfile(d))) fmt.Printf("part 2: %d\n", day04.Part2(utils.Readfile(d))) + case 6: + fmt.Printf("part 1: %d\n", day06.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day06.Part2(utils.Readfile(d))) + case 7: + fmt.Printf("part 1: %d\n", day07.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day07.Part2(utils.Readfile(d))) + case 8: + fmt.Printf("part 1: %d\n", day08.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day08.Part2(utils.Readfile(d))) + case 9: + fmt.Printf("part 1: %d\n", day09.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day09.Part2(utils.Readfile(d))) + case 10: + fmt.Printf("part 1: %d\n", day10.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day10.Part2(utils.Readfile(d))) + case 11: + fmt.Printf("part 1: %d\n", day11.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day11.Part2(utils.Readfile(d))) + case 12: + fmt.Printf("part 1: %d\n", day12.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day12.Part2(utils.Readfile(d))) + case 13: + fmt.Printf("part 1: %d\n", day13.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day13.Part2(utils.Readfile(d))) + case 14: + fmt.Printf("part 1: %d\n", day14.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day14.Part2(utils.Readfile(d))) + case 15: + fmt.Printf("part 1: %d\n", day15.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day15.Part2(utils.Readfile(d))) + case 16: + fmt.Printf("part 1: %d\n", day16.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day16.Part2(utils.Readfile(d))) + case 17: + fmt.Printf("part 1: %s\n", day17.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day17.Part2(utils.Readfile(d))) + case 18: + fmt.Printf("part 1: %d\n", day18.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day18.Part2(utils.Readfile(d))) + case 19: + fmt.Printf("part 1: %d\n", day19.Part1(utils.Readfile(d))) + fmt.Printf("part 2: %d\n", day19.Part2(utils.Readfile(d))) default: panic(fmt.Errorf("no such day: %d", d)) } + elapsed := time.Since(start) + fmt.Printf("Execution time: %s\n", elapsed) } // Reads day from os.Args. func day() int { - latest := 3 + latest := 18 if len(os.Args) == 1 { return latest } @@ -52,7 +112,6 @@ func day() int { return day } - func genNext(n int) { os.Mkdir(fmt.Sprintf("day%02d", n), 0755) f, err := os.Create(fmt.Sprintf("day%02d/day%02d.go", n, n)) @@ -94,4 +153,4 @@ func TestPart2(t *testing.T) { fmt.Printf("wrote day%02d/day%02d_test.go\n", n, n) utils.GenInputFile(n) -} \ No newline at end of file +} diff --git a/2024/go/utils/dijkstra/graph.go b/2024/go/utils/dijkstra/graph.go new file mode 100644 index 0000000..7b2554e --- /dev/null +++ b/2024/go/utils/dijkstra/graph.go @@ -0,0 +1,242 @@ +package dijkstra + +import ( + "fmt" + "math" + "sync" +) + +type ItemGraph struct { + Nodes []*Node + Edges map[Node][]*Edge + lock sync.RWMutex +} + +// AddNode adds a node to the graph +func (g *ItemGraph) AddNode(n *Node) { + g.lock.Lock() + g.Nodes = append(g.Nodes, n) + g.lock.Unlock() +} + +// AddEdge adds an edge to the graph +func (g *ItemGraph) AddEdge(n1, n2 *Node, weight int) { + g.lock.Lock() + if g.Edges == nil { + g.Edges = make(map[Node][]*Edge) + } + ed1 := Edge{ + Node: n2, + Weight: weight, + } + + ed2 := Edge{ + Node: n1, + Weight: weight, + } + g.Edges[*n1] = append(g.Edges[*n1], &ed1) + g.Edges[*n2] = append(g.Edges[*n2], &ed2) + g.lock.Unlock() +} + +// dijkstra implement +func getShortestPath(startNode *Node, endNode *Node, g *ItemGraph) ([]Point, int) { + visited := make(map[Point]bool) + dist := make(map[Point]int) + prev := make(map[Point]Point) + //pq := make(PriorityQueue, 1) + //heap.Init(&pq) + q := NodeQueue{} + pq := q.NewQ() + start := Vertex{ + Node: startNode, + Distance: 0, + } + for _, nval := range g.Nodes { + dist[nval.Value] = math.MaxInt64 + } + dist[startNode.Value] = start.Distance + pq.Enqueue(start) + //im := 0 + for !pq.IsEmpty() { + v := pq.Dequeue() + if visited[v.Node.Value] { + continue + } + visited[v.Node.Value] = true + near := g.Edges[*v.Node] + + for _, val := range near { + if !visited[val.Node.Value] { + if dist[v.Node.Value]+val.Weight < dist[val.Node.Value] { + store := Vertex{ + Node: val.Node, + Distance: dist[v.Node.Value] + val.Weight, + } + dist[val.Node.Value] = dist[v.Node.Value] + val.Weight + //prev[val.Node.Value] = fmt.Sprintf("->%s", v.Node.Value) + prev[val.Node.Value] = v.Node.Value + pq.Enqueue(store) + } + //visited[val.Node.value] = true + } + } + } + // fmt.Println(dist) + // fmt.Println(prev) + pathval := prev[endNode.Value] + var finalArr []Point + finalArr = append(finalArr, endNode.Value) + for pathval != startNode.Value { + finalArr = append(finalArr, pathval) + pathval = prev[pathval] + } + finalArr = append(finalArr, pathval) + fmt.Println(finalArr) + for i, j := 0, len(finalArr)-1; i < j; i, j = i+1, j-1 { + finalArr[i], finalArr[j] = finalArr[j], finalArr[i] + } + return finalArr, dist[endNode.Value] + +} + +func getAllShortestPaths(startNode *Node, endNode *Node, g *ItemGraph) ([][]Point, int) { + visited := make(map[Point]bool) + dist := make(map[Point]int) + prev := make(map[Point][]Point) // Store multiple predecessors for each node + q := NodeQueue{} + pq := q.NewQ() + + start := Vertex{ + Node: startNode, + Distance: 0, + } + + for _, n := range g.Nodes { + dist[n.Value] = math.MaxInt64 + } + dist[startNode.Value] = start.Distance + pq.Enqueue(start) + + // Perform Dijkstra's algorithm + for !pq.IsEmpty() { + v := pq.Dequeue() + if visited[v.Node.Value] { + continue + } + visited[v.Node.Value] = true + near := g.Edges[*v.Node] + + for _, edge := range near { + alt := dist[v.Node.Value] + edge.Weight + + // Case 1: Found a shorter path + if alt < dist[edge.Node.Value] { + dist[edge.Node.Value] = alt + prev[edge.Node.Value] = []Point{v.Node.Value} // Reset predecessors + pq.Enqueue(Vertex{ + Node: edge.Node, + Distance: alt, + }) + } + + // Case 2: Found an equally short path + if alt == dist[edge.Node.Value] { + // Add the current node as a valid predecessor if not already present + found := false + for _, p := range prev[edge.Node.Value] { + if p == v.Node.Value { + found = true + break + } + } + if !found { + prev[edge.Node.Value] = append(prev[edge.Node.Value], v.Node.Value) + } + } + } + } + + // Iteratively reconstruct all paths + var paths [][]Point + stack := []struct { + node Point + path []Point + }{ + {node: endNode.Value, path: []Point{}}, + } + + for len(stack) > 0 { + // Pop the top item from the stack + current := stack[len(stack)-1] + stack = stack[:len(stack)-1] + + // Prepend the current node to the path + newPath := append([]Point{current.node}, current.path...) + + // If we've reached the start node, save the path + if current.node.X == startNode.Value.X && current.node.Y == startNode.Value.Y { + paths = append(paths, newPath) + continue + } + + // Push all predecessors onto the stack + for _, predecessor := range prev[current.node] { + if !Contains(newPath, predecessor) { + stack = append(stack, struct { + node Point + path []Point + }{ + node: predecessor, + path: newPath, + }) + } + } + } + + return paths, dist[endNode.Value] +} + +func Contains(slice []Point, value Point) bool { + for _, v := range slice { + if v == value { // Compare values + return true + } + } + return false +} + +func CreateGraph(data InputGraph) *ItemGraph { + var g ItemGraph + nodes := make(map[Point]*Node) + for _, v := range data.Graph { + if _, found := nodes[v.Source]; !found { + nA := Node{v.Source} + nodes[v.Source] = &nA + g.AddNode(&nA) + } + if _, found := nodes[v.Destination]; !found { + nA := Node{v.Destination} + nodes[v.Destination] = &nA + g.AddNode(&nA) + } + g.AddEdge(nodes[v.Source], nodes[v.Destination], v.Weight) + } + return &g +} + +func GetShortestPath(from, to Point, g *ItemGraph) ([]Point, int) { + nA := &Node{from} + nB := &Node{to} + + path, distance := getShortestPath(nA, nB, g) + return path, distance +} + +func GetAllShortestPaths(from, to Point, g *ItemGraph) ([][]Point, int) { + nA := &Node{from} + nB := &Node{to} + + paths, distance := getAllShortestPaths(nA, nB, g) + return paths, distance +} diff --git a/2024/go/utils/dijkstra/object.go b/2024/go/utils/dijkstra/object.go new file mode 100644 index 0000000..689635f --- /dev/null +++ b/2024/go/utils/dijkstra/object.go @@ -0,0 +1,35 @@ +package dijkstra + +type Point struct { + X int + Y int + Label string +} + +type Node struct { + Value Point +} + +type Edge struct { + Node *Node + Weight int +} + +type Vertex struct { + Node *Node + Distance int +} + +type PriorityQueue []*Vertex + +type InputGraph struct { + Graph []InputData + From Point + To Point +} + +type InputData struct { + Source Point + Destination Point + Weight int +} \ No newline at end of file diff --git a/2024/go/utils/dijkstra/queue.go b/2024/go/utils/dijkstra/queue.go new file mode 100644 index 0000000..c893e01 --- /dev/null +++ b/2024/go/utils/dijkstra/queue.go @@ -0,0 +1,65 @@ +package dijkstra + +import "sync" + +type NodeQueue struct { + Items []Vertex + lock sync.RWMutex +} + +// Enqueue adds an Node to the end of the queue +func (s *NodeQueue) Enqueue(t Vertex) { + s.lock.Lock() + defer s.lock.Unlock() + + if len(s.Items) == 0 { + s.Items = append(s.Items, t) + return + } + var insertFlag bool + for k, v := range s.Items { + // add vertex distance less than travers's vertex distance + if t.Distance < v.Distance { + s.Items = append(s.Items[:k+1], s.Items[k:]...) + s.Items[k] = t + insertFlag = true + } + if insertFlag { + break + } + } + if !insertFlag { + s.Items = append(s.Items, t) + } +} + +// Dequeue removes an Node from the start of the queue +func (s *NodeQueue) Dequeue() *Vertex { + s.lock.Lock() + defer s.lock.Unlock() + item := s.Items[0] + s.Items = s.Items[1:len(s.Items)] + return &item +} + +//NewQ Creates New Queue +func (s *NodeQueue) NewQ() *NodeQueue { + s.lock.Lock() + defer s.lock.Unlock() + s.Items = []Vertex{} + return s +} + +// IsEmpty returns true if the queue is empty +func (s *NodeQueue) IsEmpty() bool { + s.lock.RLock() + defer s.lock.RUnlock() + return len(s.Items) == 0 +} + +// Size returns the number of Nodes in the queue +func (s *NodeQueue) Size() int { + s.lock.RLock() + defer s.lock.RUnlock() + return len(s.Items) +} \ No newline at end of file From 08b38c2bd37ec7e22e27b3f5d529ea35d8f7a0af Mon Sep 17 00:00:00 2001 From: Alan R Evans Date: Mon, 13 Jan 2025 23:48:55 +0000 Subject: [PATCH 09/11] fix missing --- 2024/gareth/day07/day07.go | 90 + 2024/gareth/day07/day07_test.go | 33 + 2024/gareth/day07/input.txt | 850 ++++ 2024/gareth/day08/day08.go | 80 + 2024/gareth/day08/day08_test.go | 39 + 2024/gareth/day08/input.txt | 50 + 2024/gareth/day09/day09.go | 104 + 2024/gareth/day09/day09_test.go | 22 + 2024/gareth/day09/input.txt | 1 + 2024/gareth/day10/day10.go | 141 + 2024/gareth/day10/day10_test.go | 31 + 2024/gareth/day10/input.txt | 45 + 2024/gareth/day11/day11.go | 89 + 2024/gareth/day11/day11_test.go | 12 + 2024/gareth/day11/input.txt | 1 + 2024/gareth/day13/day13.go | 76 + 2024/gareth/day13/day13_test.go | 45 + 2024/gareth/day13/input.txt | 1279 ++++++ 2024/gareth/day14/day14.go | 172 + 2024/gareth/day14/day14_test.go | 23 + 2024/gareth/day14/input.txt | 500 +++ 2024/gareth/day18/day18.go | 156 + 2024/gareth/day18/day18_test.go | 65 + 2024/gareth/day18/input.txt | 3450 +++++++++++++++ 2024/gareth/day19/day19.go | 90 + 2024/gareth/day19/day19_test.go | 35 + 2024/gareth/day19/input.txt | 402 ++ 2024/gareth/main.go | 10 +- 2024/go/day10/day10.go | 103 + 2024/go/day10/day10_test.go | 31 + 2024/go/day10/input.txt | 56 + 2024/go/day11/day11.go | 76 + 2024/go/day11/day11_test.go | 17 + 2024/go/day11/input.txt | 1 + 2024/go/day12/day12.go | 146 + 2024/go/day12/day12_test.go | 29 + 2024/go/day12/input.txt | 140 + 2024/go/day13/day13.go | 58 + 2024/go/day13/day13_test.go | 45 + 2024/go/day13/input.txt | 1279 ++++++ 2024/go/day14/day14.go | 149 + 2024/go/day14/day14_test.go | 527 +++ 2024/go/day14/input.txt | 500 +++ 2024/go/day15/day15.go | 119 + 2024/go/day15/day15_test.go | 57 + 2024/go/day15/input.txt | 71 + 2024/go/day16/day16.go | 225 + 2024/go/day16/day16_test.go | 47 + 2024/go/day16/input.txt | 141 + 2024/go/day17/day17.go | 91 + 2024/go/day17/day17_test.go | 25 + 2024/go/day17/input.txt | 5 + 2024/go/day18/day18.go | 126 + 2024/go/day18/day18_test.go | 6915 +++++++++++++++++++++++++++++++ 2024/go/day18/input.txt | 3450 +++++++++++++++ 2024/go/day19/day19.go | 87 + 2024/go/day19/day19_test.go | 42 + 2024/go/day19/input.txt | 402 ++ 2024/go/go.mod | 2 +- 59 files changed, 22848 insertions(+), 5 deletions(-) create mode 100644 2024/gareth/day07/day07.go create mode 100644 2024/gareth/day07/day07_test.go create mode 100644 2024/gareth/day07/input.txt create mode 100644 2024/gareth/day08/day08.go create mode 100644 2024/gareth/day08/day08_test.go create mode 100644 2024/gareth/day08/input.txt create mode 100644 2024/gareth/day09/day09.go create mode 100644 2024/gareth/day09/day09_test.go create mode 100644 2024/gareth/day09/input.txt create mode 100644 2024/gareth/day10/day10.go create mode 100644 2024/gareth/day10/day10_test.go create mode 100644 2024/gareth/day10/input.txt create mode 100644 2024/gareth/day11/day11.go create mode 100644 2024/gareth/day11/day11_test.go create mode 100644 2024/gareth/day11/input.txt create mode 100644 2024/gareth/day13/day13.go create mode 100644 2024/gareth/day13/day13_test.go create mode 100644 2024/gareth/day13/input.txt create mode 100644 2024/gareth/day14/day14.go create mode 100644 2024/gareth/day14/day14_test.go create mode 100644 2024/gareth/day14/input.txt create mode 100644 2024/gareth/day18/day18.go create mode 100644 2024/gareth/day18/day18_test.go create mode 100644 2024/gareth/day18/input.txt create mode 100644 2024/gareth/day19/day19.go create mode 100644 2024/gareth/day19/day19_test.go create mode 100644 2024/gareth/day19/input.txt create mode 100644 2024/go/day10/day10.go create mode 100644 2024/go/day10/day10_test.go create mode 100644 2024/go/day10/input.txt create mode 100644 2024/go/day11/day11.go create mode 100644 2024/go/day11/day11_test.go create mode 100644 2024/go/day11/input.txt create mode 100644 2024/go/day12/day12.go create mode 100644 2024/go/day12/day12_test.go create mode 100644 2024/go/day12/input.txt create mode 100644 2024/go/day13/day13.go create mode 100644 2024/go/day13/day13_test.go create mode 100644 2024/go/day13/input.txt create mode 100644 2024/go/day14/day14.go create mode 100644 2024/go/day14/day14_test.go create mode 100644 2024/go/day14/input.txt create mode 100644 2024/go/day15/day15.go create mode 100644 2024/go/day15/day15_test.go create mode 100644 2024/go/day15/input.txt create mode 100644 2024/go/day16/day16.go create mode 100644 2024/go/day16/day16_test.go create mode 100644 2024/go/day16/input.txt create mode 100644 2024/go/day17/day17.go create mode 100644 2024/go/day17/day17_test.go create mode 100644 2024/go/day17/input.txt create mode 100644 2024/go/day18/day18.go create mode 100644 2024/go/day18/day18_test.go create mode 100644 2024/go/day18/input.txt create mode 100644 2024/go/day19/day19.go create mode 100644 2024/go/day19/day19_test.go create mode 100644 2024/go/day19/input.txt diff --git a/2024/gareth/day07/day07.go b/2024/gareth/day07/day07.go new file mode 100644 index 0000000..694c09a --- /dev/null +++ b/2024/gareth/day07/day07.go @@ -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 +} diff --git a/2024/gareth/day07/day07_test.go b/2024/gareth/day07/day07_test.go new file mode 100644 index 0000000..73ff38b --- /dev/null +++ b/2024/gareth/day07/day07_test.go @@ -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) +} diff --git a/2024/gareth/day07/input.txt b/2024/gareth/day07/input.txt new file mode 100644 index 0000000..23117ba --- /dev/null +++ b/2024/gareth/day07/input.txt @@ -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 \ No newline at end of file diff --git a/2024/gareth/day08/day08.go b/2024/gareth/day08/day08.go new file mode 100644 index 0000000..ce5a1cd --- /dev/null +++ b/2024/gareth/day08/day08.go @@ -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) +} diff --git a/2024/gareth/day08/day08_test.go b/2024/gareth/day08/day08_test.go new file mode 100644 index 0000000..f744f8f --- /dev/null +++ b/2024/gareth/day08/day08_test.go @@ -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) +} diff --git a/2024/gareth/day08/input.txt b/2024/gareth/day08/input.txt new file mode 100644 index 0000000..d4fb9a8 --- /dev/null +++ b/2024/gareth/day08/input.txt @@ -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 \ No newline at end of file diff --git a/2024/gareth/day09/day09.go b/2024/gareth/day09/day09.go new file mode 100644 index 0000000..c2e12df --- /dev/null +++ b/2024/gareth/day09/day09.go @@ -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 +} diff --git a/2024/gareth/day09/day09_test.go b/2024/gareth/day09/day09_test.go new file mode 100644 index 0000000..b9de485 --- /dev/null +++ b/2024/gareth/day09/day09_test.go @@ -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) +} diff --git a/2024/gareth/day09/input.txt b/2024/gareth/day09/input.txt new file mode 100644 index 0000000..b5ab7ba --- /dev/null +++ b/2024/gareth/day09/input.txt @@ -0,0 +1 @@ +2529414994631170149953136311659836486767499011295895209013255645858553884990631239857180407026188318789536626883964672136355273919115442427552799046486996326836721848461142184774852462365260634524991545439574418977718911375256991472764810705999392318631748622830142133467261617273937356141415707425753674415292503537471415868114655290826112291685289736371370794189785878486831872016564126976522727423616247825525582235815348304183161672962553208063528051403895878511223754541942753550948843423236569890488336109548241119404580493982516632107654275399605468301782552884515594818174546445227869897726454296218318628664159728961325374033515263746610627048519411977781695595794535515064703636952079774826159321748816186679411826696063348134165468188023619726476382843216866261777484681339754899174368188722709816794137754761792646555351973887495359649411363814901253642493312614366531222370302156743751318251941645822081602872738751283687336339884876543218141359765134733663492093416431535012445097595649165971493028986240575597653688523974288772307034632638625633187731811281922665421327836218203214749354406959408680793080389496978212945419775978249165443961189137588895163095106088317084441298272395387540452384597822868485507235641120715625515459853525688110756198615289287578182442456417904668154987527729122473963550517916127294526771821425495935972610686448528932482912141732519954383661982334932650248353682615255120545729895022211147836848115341454584957926805633627964276847999330476526354279332512826717133230773157324347402953953927527665567153253315399378748818468678693837961867951860312379276017805343355247963052974232165110245254232287194847722340532410286385821556192322832743937519209173458985571983132531839983977272421739138970811391464140682379139824407889378619871180297441298829669070809895586794531431857864567433873076723053603435662419381934421712102617472739137385638576101831848842655652454165101290255871526232351950556852421166861327615244371495542266229753205035804540174131698192768395814389388644268086405515537752706254391829761337527891677215356747115182964429255822243039588914805260924016257466777195552352949478722191539771342551122847825532233481813754983169379785489050221270707365696021932483631432414437351963685012191132618360937331778186804479417765518124878796421456944742103810878239437117576013394324571182139571294073653266958694952196425926136893533164132575492817488096489046378492654888421055756213119857493249964822944119957868459016171356769871756326614598659835681980344267978612918689166116244890339182206315282146134018964798226159212449309744905320227743183143823029572839434660354034213549817535283713791522376277984037586413688061535089165885822732145890396647843158478710908866936938249064552772794146522586525741963899855122516857695592581647685180705089559981833535136560929145755880975051188152909463771689906499581149643227497130528722407033493481913346162338161479763710736884142797715949788465814349438278276580443850194834256818985090856559827988358562352513349995775225726210788843511763845149583787943127203914501053994685329347167183832489402915704644923353246710121286566284592170886447519167319529279269987190217074136145686633506883865816354097504356778652208815894272748631452119193048574123409114138145899637632260879694921946816524934021101560398222255429352486691681551047543735741549497410302274971744428279371337924012804528976512947630763820698984176515394115387633878375905835504237195317411954949167209227352725803951402765353945194611408966745723441976996218446199527123935043173695744261353026652837718730465094774015112912204943556343544443281354456239347083976280589560844610218264355879457283812993459560733867541611553150662275879650464596329710741282407824297149262230995875542027136495131087189327597974108634582334863989876019159315756949473828329795289481447823671037856645639327923091353712977682847527747453192825951029198856408367633596597492822338202150779572581027413328459951408278317191453930802581727739778818584413762281675934513970122072971459927778838048533780518220295897149947836136418279345115765461984365627774424287416673159950719867353137466421928859527059578264892347829281782530312247822394516573966472975576956366988127608160989564458910184313229420889926896085859813973174764072952774397898954466591163388550598972604976663611761341337996196531364142244786437084508236507637471411333734425822787974289912567133635377856417676855417510459720787516351248865028922683834152246383211823927644303075529444473819826470587213904655264647936061755076265634169417988091507859331696695769284314334936986135269574142089267669916879509927751857594745155933587016723848953951677257844971196014883326232861968441712070642663307777867467921814283324529951996933555279335439351793773832376425489790347097348422593969642852779022169223143874617495449982708614991877319989495996341617318379612350708842715884444940298963514595995861202572539578968229889314943042379386975825399714472598998896275717317789252230862580831911698693607072779348639733637062376388618751532446287461907975694698138498743674524764675433752075968423109396213318302547126063612015531374816351905283436220886375995812865645649141134191501727367893497583962867563365886828824519512052627638939237741386617227974759779067369889518684846439526033282876841617462042442269987069773717961312365584922658887661807898123591715763889589721296117827774775908347857384569976642759537833152357239422302577182823786591653840885394638914438832962054492810589492861554891063532026219355884515583221127034332875159922409584108748275365712893384120529451631561844113821693951354569460739871304131148640197459796332329932481346758171451932293326231949729390343088517175979578399524493432135176233172553180593570434837191336643916833176559150318999731314923242823710603792571853876371181271567758677297726678746261485567172587397114357927481587588546685557202136685993376096227650548253591779513552553924641735665178743045792684921252441476943956138343342153965395174258165333143368244033705373906479283944601437469850534960435315251028392311693555987024759239405319995026991252746572267189531323531240726621262588875681413577157821855759361879662876199816456269408159192440157511974546254551552112837961332772366597688970625124776783129518443867948213402053698231624310479198241337516740542547528657576074569664283634947780873287845510856376975280329234895920361046864061638397742281498357239959407484853642241734938160807663532164878623998830956790996098256839394229567714123932563931773235189019543369113372644947855499733915242264161245168769962351632553241194171382308165896772152271462743716484197248784950479730116542401564881257731654274033215711596287275930853493403887128663418582562837826832168965813950579887467061403834136842595975531188795065866894841959715210245747786292922145987543385430557218605063544754162850197295523292787872151070389787421074127480979667155282908461632832688958559343982661121567427116199232372744447250876255842217334096361787578921133673471226504829932937435162951056248417288221392613501749757484922179762626734566329696681235101999163642723350107832851532326160957591154631213496682013446738936344824599467110178333272612434182583726759394461671638880234884483742665765867162858753905079626655457570366587407816437486477441464926871135787479692260276680512056289567185812166261926597168235395791874272491337975719533018634929555681852889654725246766427836868339678299888070467361418118189185887849937415133033914434276167236373773242317889396972266762417210188295313421108175673291946914346531348630218711871325557857622725614288216914324142176149347966536219563474327432727315874397694491365159904382779931668771605155113377709491935019345329841640515393223388938398282814804018387757388269801688686119747960177369204228904719749989835059126010153088386468907469927142349124434852117714543516719911402832634829925120206332742825132621443526525038458970937574866527656658817482173683851272254888471587388799605651435266467029242546257288474665612035773117775755683493605435355451292552972838536749176269563218506210641949288225781671776376732626121854927620421599755763586241659734169460198471917986486743522513185299196496888657338493297625141871835456782744552777179870472819335930524451412227158567606324777065304544224274548895676217717154302827468454448617961547129915827072347777646166273473351079158780484188286332909954245091842872889126836863984182843435306389397411631977474322671629434756137663563618752317648357694644226485694945599174259688668187274661887191493082457995761881593446127225317165293022501952319497336932322767788699429262191752563263922892838047925172188196504853449214629551296665581145158670239512849396537147485663544045742782496673348490857554903925836698569925609944374774653511741831657175125137496038822182603950587691483262191235208463325762778839662856282217234530369627147973868822827010148030165632441653194425421050232513106040447451846676359089671531796362678717767988124162979694506496784054812360567782399784865135388690294642683171216974766986396576975490105318559373424698787437688557877158218371278457789860311029563277546383544892577698264626845017579266981747732354379074878361114767608950934590211375765721348048884340909970805539267593105416844391682494919095598134249119368133359819757379212389438096743567758051275829118265143278801797638476563062925356262417553725967577142813708467847887655547416511553757847121804935843837784184545722793051823734246648646452287876584949575494315249845695325028189443292761891979237563826779898665181091654818647159185643608485305387963626224565928489378619444981923468579667968346377691534172934755957294709524397313443796384252591052707013952490768483528934175481704189152762162211298817663343485942147260512852528849838755724259418851669671598937513426823917485262305387796586297250551618388512339573624195264377407617827265294187259151294042519881542927279134235990229478796182765494193011192529599466449484487736567431126378487357537211408016478927122161197418944499364646411439156188812657659057274751477567475479836151955744708965869356819072204223903818202714564693184141171455129739674233312746984353853673975679277422414589723884364055569015124470343548823363192038946382122535898741553564885030261230488670409813686864388051132153324436708452844556148980927437241868332788438436634578876696742551928297793057289492146014478268681653366058565496734095904157615382536916912880508895357980811744463551872854337213632877945616938728611968899069416832219319264918987045779598529743253653729623391460482983259834966541864633785212981315586379697984194168364339675053787966329947131876867391118287634731671236868794137657415848338165177860813946763329597892791846106916246165157787333462409543784419585539868247783516923034381310458279709742708571821071597884146240884743628171457667686192573119798348994886418635727348836793913966419121819538427523585050341284172143209454318938299629713522699382881471164623839496246929753762186223896414982817796548399273461731797862527790617851192259229068723173591179947263952488681098333066867061403077834543413647619652285790488368491330257022614855462914813418496334698360298890977253499690182691378151647998867282767275147356601673269337114933275033361763477777327319657889664111264293916799147973231610405711368633275341825337629973362314465218134291874541119265441641325965383489444932957497211982434423247696121722833394918883766470873350703970871023839028395037172370843315285469767290177132558647268362894144737545542038543444326848886920491119779813203419559399587340303127918720857376772641801270168616802661393363597267548380882130511796448246378086751479931092975214946844455177376047631427628232643039145923562453584976937176864628584340132716635333833468614764566940837086345727807372153256379129817956745919253421978943303191964484576435667240425071512984142417757658878650324473919977471882477144698189544341706848156784755021389523767151202493163382509560121311875219924649812452873976707628227820632820739257169016537896842144442495561161711243947054753082906874578195333626412299754020937251566533744223342995987474144817277213873632741755679846976852884229374282621294461537863047549490727134294218613747912747684785411267652467495199481996163375674940915462324184284088111423992371895230408480857930131266845763228223598440796634564969707066156452295089288777649277556013195871949271376495896088399085111576956820871784768372833888472937351118942457391847395757728767643727465020313980359554748836956333726494842729481765977351583238212696488790762185727885446331169472632080216273482057861829471778875450927772519954192552374349244223288897401148744834795092241162595178262946332893829021521296928856767232999222429392929724231276538533162498199713755661745720188685621372609635783747372243441353383311216763858812142622337755866549154717988836991149157056679744351490452357525326895036498352158193214564873889188822172336593194139584162523761462788035946956594849555358833582551834963214195228681216846935144898711024858025684423272687674547243741279359721575796724717376598366601669371589483213985131383414752627927723557070944997926173415173724037987866907042694413604737826114832744647489791567315380453572501087819757772371789536942057356056834340224775282111235470393566669227791979483123856082711161352084954631189797986652655943733985175613773658602334372343281879567914308267183638153184823726724566396110569430372769759269198217761169106040842690481473942285616714699962893391327592143644558856814994338618558544845832538562737478613796728913775260514678619912268081237650253842478140275339735790247579151915741082626354947213262785324994159099206320675914582810964666394819689639747759292899828544111124815030245345989832397773681057556125975939588428612540904269995936848226157958545165614127438731257823974789789811341898208715245826579965389778646581252045654084858253831882371812399318389060736043917199945624964579799041907783207825824399623327318161397052456683102527646058649444143050285876779192592564613330951083466466502517598764917022923845789672152239786235482764779660924680725767294573227498398795537592791385536149221689312957148544603085491049136359461311252913228854582995985553121163751021405540196625412868938130782435662350157030738948966344462633246063731083604516377127533931273840604693967751118249227536484769582931637926753549825338488847403822703910596122894485916477281041683480916174998749199321157023909665156323107760293576617787344728487416299641705594226185974385776878853444481736797141554985434667491845948847953989684619984662615950661342432494176354605213197243564389207529919259276511378044254880809886939188541479568484884436932410235652754259366920219999509354482025651582522873161276536036926662659835546646737470146247178441633174105497918161793946529556639276345920313138156847186466769956195522594258387664807758424387523222864982562133457388503184838382627283787760769617306330925889844668863338639486313032367972343946232599962147372284593149426277978221664943956749342273165518778795246230308036222172627794688092688374417660859628207682432230585335997646518451283753855632283563461248551782801478427171182044233235333689246344142349195527326218614546934096196395919249796094979048404911418569849992205723919588352868267022792715638089365555469933109745505983854555716754389359943836287587882385792117865937135819373743166117166634263438428256662492501874434630605897748134639549891548337076632976438735725457809789651163712698574923324917873193176394253438473564844581103495857314944695524838936319331387739355914148379720413456597618841520611034261711463157755783229893234042737345213852299940451380776112897760259714232379641391851693292843105245934282976949556542441355827670265534643431928527265926343029236454344667976639992684351387822888527390635595276038301338842760967882862050784988835946425019497961696974179371653976645268358674107934849749506388444356928590662862962050795631898627636338248381123892379795127315579693901181929965611971192592687949777296569359557275288711591621995840581068823650967232971011659247646069542710526291704853263490729512519956325623226321378177893166585121321844383090608885395624666032711317364698202572312567906283314163458748239810969511193451358948754518893542546920874788249278615074638584873548987858714494329655139886301026184321619953857896988815757599456453288089384482348062264715136844338148275555332016145254409076549132309660707222523960779157687563959995652343137132357989488445389210161565559326941817131277456063109683808335235724285164251890294027516524798351723588853355353337971087914066811666802940771578915136967538512688114939848293447517254942203619344534653241641455922596502420724020646461452575937427301251575826383828208412638471853768861468933955412839852493704967123787276736464624867167589648486712784155602554687837309060812180409563389019256718323094324035663674751022144535804524703362643625738220613356196193181182676491217180161232783738874760412587743291935496788956644846291471646968263250985566956040196438494715221043223627487440104551507183612184648040516627433067117696278659536799656067988833855035232022299588322565596270969486416635211995476318621946902994605967253960603347503394665843208333927524282996905694719826813772238273901570383296399220481911621780582786776577412022235016458129677157872539206116436944159412168664414826399628808910403233937791491571647325359066778280479961443674664081892572998374821221625140159133847469139499164637247539935712522260797025385033319534455526189365428960343483535542217665664726812024901773776917146114487248538687624319891318957441316967777576473049372764251177564480132356638412215697295025474413357622434690359746759335827523317492439392733713486952142988665231215292633669259725952646192054369364385068652199241664604763346882699186751576467924189378159018354145172419751388786241999187995825214531719054494111317922957862687780948371339841473610663867992514545614484648353581399073723231208154211012754251288542144223701493275358165119283458504117789158274734615196369367194387631995881697342191189572599029142212195690231476735929641029888887177840149796788522677992162737116597478484646056525174271255454122623685275569419714652921746041168099595295681399824887713226447050238817675317501956458571484291876187918049171175574175502991341121445870531814272148263064565282627514101123843723926654728619217784377581691964745248742935414089789490199119901853209347556262769030686033849925415671401323286071689986625384437097242386402070752539733644425362302761512360586910688334224486608461723197915563788036646327757479361026187821836868569836296615936497363657906673652749883673425570236496307020577955277693605582949958448529747175845572891755706137581334391327675010162978597060117322524120484736867193209235686848993575189277991753559513785257361183538376296615746462283343218369316121978319455552454193795487287969913691192354711363702111845346793736812589899096354127506081808036655441412958509547693761145119798696819510255490727798714511824497435990268786605521723282914729916771733149511360747625614267243964173121895462317598271534507061376766169942297795745526178562494180322753378246586130222089701041133920185272225395134511116953644349679488869173479735531687619476132528769768498069807465749939773067771825171055452073763268712329272937896090472378592133239775938085409573688062851627994874304318317862611643166961232498534730265757407912729619903682765224124977839280352358547098287921317341666922129894464337354928568038122378355225632276256715583670471355993855172746622825944376966233973757356911825260162871812592632559891117486347422347992529941697702017488464635678917868589612168269669537653857591035652857132315393832456797892133684196261957473754507416947165754330317062712830511914274558747584295780647492605119565668911332402960887396222241993596509063834636402284154381646485385868579153248445294622277948748137205831632555745583303493332 \ No newline at end of file diff --git a/2024/gareth/day10/day10.go b/2024/gareth/day10/day10.go new file mode 100644 index 0000000..ef1dda7 --- /dev/null +++ b/2024/gareth/day10/day10.go @@ -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 +} diff --git a/2024/gareth/day10/day10_test.go b/2024/gareth/day10/day10_test.go new file mode 100644 index 0000000..547889b --- /dev/null +++ b/2024/gareth/day10/day10_test.go @@ -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) +} diff --git a/2024/gareth/day10/input.txt b/2024/gareth/day10/input.txt new file mode 100644 index 0000000..a6f2793 --- /dev/null +++ b/2024/gareth/day10/input.txt @@ -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 \ No newline at end of file diff --git a/2024/gareth/day11/day11.go b/2024/gareth/day11/day11.go new file mode 100644 index 0000000..4876cac --- /dev/null +++ b/2024/gareth/day11/day11.go @@ -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 +} diff --git a/2024/gareth/day11/day11_test.go b/2024/gareth/day11/day11_test.go new file mode 100644 index 0000000..56c3825 --- /dev/null +++ b/2024/gareth/day11/day11_test.go @@ -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) +} diff --git a/2024/gareth/day11/input.txt b/2024/gareth/day11/input.txt new file mode 100644 index 0000000..ae72b37 --- /dev/null +++ b/2024/gareth/day11/input.txt @@ -0,0 +1 @@ +965842 9159 3372473 311 0 6 86213 48 \ No newline at end of file diff --git a/2024/gareth/day13/day13.go b/2024/gareth/day13/day13.go new file mode 100644 index 0000000..3d038b1 --- /dev/null +++ b/2024/gareth/day13/day13.go @@ -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 +} diff --git a/2024/gareth/day13/day13_test.go b/2024/gareth/day13/day13_test.go new file mode 100644 index 0000000..209a74f --- /dev/null +++ b/2024/gareth/day13/day13_test.go @@ -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) +} diff --git a/2024/gareth/day13/input.txt b/2024/gareth/day13/input.txt new file mode 100644 index 0000000..ad39ae5 --- /dev/null +++ b/2024/gareth/day13/input.txt @@ -0,0 +1,1279 @@ +Button A: X+54, Y+22 +Button B: X+36, Y+62 +Prize: X=19754, Y=14184 + +Button A: X+20, Y+68 +Button B: X+34, Y+13 +Prize: X=15660, Y=15792 + +Button A: X+63, Y+17 +Button B: X+11, Y+28 +Prize: X=2658, Y=11605 + +Button A: X+15, Y+56 +Button B: X+74, Y+29 +Prize: X=9393, Y=11622 + +Button A: X+34, Y+97 +Button B: X+83, Y+35 +Prize: X=3876, Y=4197 + +Button A: X+14, Y+62 +Button B: X+75, Y+27 +Prize: X=12989, Y=4061 + +Button A: X+46, Y+17 +Button B: X+15, Y+54 +Prize: X=15841, Y=336 + +Button A: X+19, Y+61 +Button B: X+69, Y+12 +Prize: X=204, Y=7413 + +Button A: X+34, Y+14 +Button B: X+29, Y+40 +Prize: X=2353, Y=10368 + +Button A: X+64, Y+32 +Button B: X+25, Y+48 +Prize: X=3273, Y=304 + +Button A: X+18, Y+60 +Button B: X+66, Y+30 +Prize: X=11594, Y=2330 + +Button A: X+65, Y+47 +Button B: X+11, Y+29 +Prize: X=4677, Y=195 + +Button A: X+13, Y+23 +Button B: X+42, Y+14 +Prize: X=7115, Y=12417 + +Button A: X+81, Y+55 +Button B: X+26, Y+93 +Prize: X=2703, Y=5678 + +Button A: X+50, Y+96 +Button B: X+74, Y+20 +Prize: X=8694, Y=9856 + +Button A: X+19, Y+54 +Button B: X+74, Y+36 +Prize: X=6145, Y=9170 + +Button A: X+45, Y+76 +Button B: X+43, Y+15 +Prize: X=4194, Y=5627 + +Button A: X+28, Y+91 +Button B: X+94, Y+48 +Prize: X=2282, Y=2009 + +Button A: X+70, Y+35 +Button B: X+33, Y+83 +Prize: X=4786, Y=3856 + +Button A: X+14, Y+89 +Button B: X+38, Y+40 +Prize: X=2186, Y=3415 + +Button A: X+55, Y+19 +Button B: X+43, Y+79 +Prize: X=4737, Y=2757 + +Button A: X+32, Y+76 +Button B: X+60, Y+17 +Prize: X=11124, Y=5467 + +Button A: X+33, Y+62 +Button B: X+50, Y+21 +Prize: X=4940, Y=12625 + +Button A: X+56, Y+14 +Button B: X+48, Y+92 +Prize: X=2888, Y=962 + +Button A: X+14, Y+58 +Button B: X+83, Y+30 +Prize: X=6249, Y=5488 + +Button A: X+47, Y+83 +Button B: X+47, Y+11 +Prize: X=7153, Y=15685 + +Button A: X+35, Y+68 +Button B: X+52, Y+16 +Prize: X=12241, Y=14956 + +Button A: X+46, Y+72 +Button B: X+56, Y+25 +Prize: X=6054, Y=4401 + +Button A: X+35, Y+57 +Button B: X+43, Y+14 +Prize: X=10516, Y=12390 + +Button A: X+29, Y+56 +Button B: X+41, Y+25 +Prize: X=6288, Y=2319 + +Button A: X+73, Y+19 +Button B: X+59, Y+86 +Prize: X=9965, Y=8669 + +Button A: X+13, Y+43 +Button B: X+49, Y+13 +Prize: X=12137, Y=19559 + +Button A: X+17, Y+65 +Button B: X+67, Y+22 +Prize: X=1910, Y=15266 + +Button A: X+55, Y+27 +Button B: X+11, Y+43 +Prize: X=7767, Y=5007 + +Button A: X+26, Y+18 +Button B: X+35, Y+94 +Prize: X=4719, Y=9616 + +Button A: X+37, Y+81 +Button B: X+58, Y+13 +Prize: X=11010, Y=1876 + +Button A: X+66, Y+43 +Button B: X+17, Y+88 +Prize: X=6227, Y=5057 + +Button A: X+36, Y+66 +Button B: X+61, Y+31 +Prize: X=1642, Y=10702 + +Button A: X+54, Y+17 +Button B: X+15, Y+50 +Prize: X=17444, Y=2332 + +Button A: X+33, Y+74 +Button B: X+47, Y+16 +Prize: X=1127, Y=13206 + +Button A: X+45, Y+93 +Button B: X+84, Y+43 +Prize: X=9867, Y=10858 + +Button A: X+35, Y+99 +Button B: X+64, Y+33 +Prize: X=3780, Y=5511 + +Button A: X+29, Y+62 +Button B: X+46, Y+24 +Prize: X=14412, Y=6932 + +Button A: X+91, Y+18 +Button B: X+21, Y+20 +Prize: X=9303, Y=2474 + +Button A: X+61, Y+34 +Button B: X+30, Y+75 +Prize: X=6835, Y=7015 + +Button A: X+32, Y+82 +Button B: X+46, Y+12 +Prize: X=7126, Y=14580 + +Button A: X+30, Y+47 +Button B: X+36, Y+11 +Prize: X=13922, Y=14563 + +Button A: X+79, Y+39 +Button B: X+12, Y+43 +Prize: X=15040, Y=13839 + +Button A: X+15, Y+14 +Button B: X+20, Y+81 +Prize: X=1075, Y=1502 + +Button A: X+35, Y+80 +Button B: X+45, Y+11 +Prize: X=10380, Y=11870 + +Button A: X+50, Y+36 +Button B: X+21, Y+58 +Prize: X=4389, Y=3546 + +Button A: X+31, Y+95 +Button B: X+60, Y+14 +Prize: X=5432, Y=4076 + +Button A: X+96, Y+20 +Button B: X+64, Y+77 +Prize: X=3424, Y=2687 + +Button A: X+15, Y+51 +Button B: X+60, Y+26 +Prize: X=1505, Y=19741 + +Button A: X+37, Y+12 +Button B: X+33, Y+78 +Prize: X=10344, Y=13604 + +Button A: X+70, Y+93 +Button B: X+84, Y+21 +Prize: X=9184, Y=8034 + +Button A: X+33, Y+85 +Button B: X+99, Y+59 +Prize: X=4356, Y=2988 + +Button A: X+26, Y+27 +Button B: X+13, Y+60 +Prize: X=1105, Y=3240 + +Button A: X+55, Y+31 +Button B: X+21, Y+46 +Prize: X=7181, Y=11070 + +Button A: X+20, Y+54 +Button B: X+41, Y+32 +Prize: X=2979, Y=3400 + +Button A: X+35, Y+19 +Button B: X+33, Y+60 +Prize: X=10334, Y=11024 + +Button A: X+84, Y+21 +Button B: X+29, Y+79 +Prize: X=9575, Y=6340 + +Button A: X+58, Y+24 +Button B: X+15, Y+64 +Prize: X=10518, Y=6264 + +Button A: X+41, Y+12 +Button B: X+45, Y+69 +Prize: X=10120, Y=8966 + +Button A: X+87, Y+28 +Button B: X+14, Y+67 +Prize: X=6242, Y=6571 + +Button A: X+12, Y+28 +Button B: X+65, Y+24 +Prize: X=1515, Y=12044 + +Button A: X+85, Y+24 +Button B: X+29, Y+37 +Prize: X=7600, Y=2434 + +Button A: X+34, Y+92 +Button B: X+94, Y+69 +Prize: X=9882, Y=12282 + +Button A: X+11, Y+37 +Button B: X+23, Y+12 +Prize: X=848, Y=8448 + +Button A: X+52, Y+28 +Button B: X+33, Y+63 +Prize: X=3429, Y=6843 + +Button A: X+57, Y+13 +Button B: X+56, Y+55 +Prize: X=4314, Y=1744 + +Button A: X+81, Y+24 +Button B: X+12, Y+59 +Prize: X=13487, Y=6933 + +Button A: X+72, Y+50 +Button B: X+15, Y+40 +Prize: X=8927, Y=9290 + +Button A: X+68, Y+27 +Button B: X+16, Y+30 +Prize: X=2728, Y=2904 + +Button A: X+66, Y+13 +Button B: X+54, Y+65 +Prize: X=6060, Y=1846 + +Button A: X+56, Y+86 +Button B: X+88, Y+44 +Prize: X=5840, Y=4138 + +Button A: X+44, Y+80 +Button B: X+46, Y+15 +Prize: X=15084, Y=8430 + +Button A: X+50, Y+18 +Button B: X+13, Y+60 +Prize: X=6386, Y=6944 + +Button A: X+15, Y+63 +Button B: X+67, Y+14 +Prize: X=12210, Y=802 + +Button A: X+22, Y+65 +Button B: X+65, Y+33 +Prize: X=2817, Y=4983 + +Button A: X+23, Y+37 +Button B: X+51, Y+11 +Prize: X=4351, Y=1387 + +Button A: X+58, Y+39 +Button B: X+14, Y+50 +Prize: X=2678, Y=3343 + +Button A: X+13, Y+80 +Button B: X+65, Y+68 +Prize: X=4784, Y=5536 + +Button A: X+47, Y+93 +Button B: X+84, Y+33 +Prize: X=5496, Y=3948 + +Button A: X+51, Y+13 +Button B: X+21, Y+58 +Prize: X=13064, Y=14007 + +Button A: X+38, Y+22 +Button B: X+12, Y+26 +Prize: X=1962, Y=11422 + +Button A: X+51, Y+13 +Button B: X+34, Y+62 +Prize: X=13062, Y=2106 + +Button A: X+31, Y+11 +Button B: X+44, Y+78 +Prize: X=4550, Y=7654 + +Button A: X+97, Y+27 +Button B: X+48, Y+63 +Prize: X=10321, Y=3816 + +Button A: X+59, Y+17 +Button B: X+27, Y+78 +Prize: X=978, Y=18744 + +Button A: X+68, Y+27 +Button B: X+25, Y+64 +Prize: X=2115, Y=1002 + +Button A: X+19, Y+33 +Button B: X+91, Y+19 +Prize: X=7873, Y=2689 + +Button A: X+39, Y+96 +Button B: X+47, Y+16 +Prize: X=5548, Y=8672 + +Button A: X+58, Y+11 +Button B: X+20, Y+80 +Prize: X=4668, Y=4086 + +Button A: X+13, Y+33 +Button B: X+56, Y+14 +Prize: X=3696, Y=1396 + +Button A: X+21, Y+45 +Button B: X+34, Y+13 +Prize: X=15420, Y=12003 + +Button A: X+12, Y+22 +Button B: X+77, Y+27 +Prize: X=2487, Y=1477 + +Button A: X+58, Y+89 +Button B: X+70, Y+19 +Prize: X=5774, Y=1787 + +Button A: X+25, Y+63 +Button B: X+53, Y+13 +Prize: X=13823, Y=19135 + +Button A: X+45, Y+36 +Button B: X+34, Y+99 +Prize: X=6416, Y=9369 + +Button A: X+81, Y+35 +Button B: X+18, Y+50 +Prize: X=4203, Y=5025 + +Button A: X+81, Y+28 +Button B: X+12, Y+58 +Prize: X=2592, Y=5258 + +Button A: X+57, Y+21 +Button B: X+19, Y+67 +Prize: X=19310, Y=9410 + +Button A: X+62, Y+48 +Button B: X+25, Y+84 +Prize: X=1505, Y=2652 + +Button A: X+98, Y+18 +Button B: X+20, Y+26 +Prize: X=9334, Y=1960 + +Button A: X+23, Y+42 +Button B: X+33, Y+13 +Prize: X=11779, Y=4858 + +Button A: X+12, Y+36 +Button B: X+75, Y+39 +Prize: X=4355, Y=8495 + +Button A: X+20, Y+34 +Button B: X+37, Y+18 +Prize: X=10274, Y=2754 + +Button A: X+89, Y+26 +Button B: X+18, Y+44 +Prize: X=4524, Y=1864 + +Button A: X+11, Y+36 +Button B: X+53, Y+21 +Prize: X=18093, Y=17453 + +Button A: X+48, Y+22 +Button B: X+47, Y+74 +Prize: X=8784, Y=8868 + +Button A: X+29, Y+53 +Button B: X+45, Y+16 +Prize: X=12465, Y=10268 + +Button A: X+47, Y+82 +Button B: X+65, Y+19 +Prize: X=4989, Y=3984 + +Button A: X+98, Y+36 +Button B: X+52, Y+96 +Prize: X=1610, Y=1668 + +Button A: X+31, Y+75 +Button B: X+63, Y+26 +Prize: X=1468, Y=2161 + +Button A: X+14, Y+66 +Button B: X+47, Y+14 +Prize: X=5961, Y=12456 + +Button A: X+20, Y+87 +Button B: X+70, Y+44 +Prize: X=1740, Y=3922 + +Button A: X+52, Y+21 +Button B: X+16, Y+43 +Prize: X=3884, Y=7457 + +Button A: X+93, Y+97 +Button B: X+91, Y+20 +Prize: X=2827, Y=851 + +Button A: X+68, Y+15 +Button B: X+23, Y+63 +Prize: X=10422, Y=7157 + +Button A: X+84, Y+68 +Button B: X+22, Y+86 +Prize: X=2696, Y=2728 + +Button A: X+67, Y+34 +Button B: X+40, Y+83 +Prize: X=5256, Y=5865 + +Button A: X+34, Y+49 +Button B: X+97, Y+12 +Prize: X=3687, Y=1352 + +Button A: X+15, Y+90 +Button B: X+89, Y+21 +Prize: X=7432, Y=2013 + +Button A: X+41, Y+13 +Button B: X+12, Y+50 +Prize: X=7134, Y=14486 + +Button A: X+20, Y+28 +Button B: X+32, Y+13 +Prize: X=10032, Y=19165 + +Button A: X+27, Y+77 +Button B: X+69, Y+13 +Prize: X=9554, Y=15260 + +Button A: X+47, Y+23 +Button B: X+32, Y+54 +Prize: X=6409, Y=355 + +Button A: X+56, Y+81 +Button B: X+64, Y+16 +Prize: X=7600, Y=5786 + +Button A: X+46, Y+17 +Button B: X+37, Y+66 +Prize: X=7509, Y=14295 + +Button A: X+18, Y+33 +Button B: X+64, Y+36 +Prize: X=16814, Y=12887 + +Button A: X+22, Y+79 +Button B: X+92, Y+31 +Prize: X=3856, Y=5165 + +Button A: X+43, Y+12 +Button B: X+30, Y+74 +Prize: X=1825, Y=17414 + +Button A: X+74, Y+49 +Button B: X+28, Y+70 +Prize: X=6646, Y=9135 + +Button A: X+85, Y+14 +Button B: X+12, Y+79 +Prize: X=1124, Y=3340 + +Button A: X+60, Y+31 +Button B: X+11, Y+44 +Prize: X=14996, Y=12846 + +Button A: X+62, Y+17 +Button B: X+12, Y+54 +Prize: X=17176, Y=5908 + +Button A: X+73, Y+54 +Button B: X+21, Y+91 +Prize: X=4258, Y=4810 + +Button A: X+32, Y+57 +Button B: X+36, Y+11 +Prize: X=412, Y=2137 + +Button A: X+80, Y+65 +Button B: X+12, Y+63 +Prize: X=2060, Y=5135 + +Button A: X+38, Y+19 +Button B: X+11, Y+30 +Prize: X=2771, Y=8832 + +Button A: X+12, Y+63 +Button B: X+89, Y+94 +Prize: X=2441, Y=3484 + +Button A: X+64, Y+42 +Button B: X+19, Y+44 +Prize: X=10186, Y=11248 + +Button A: X+21, Y+47 +Button B: X+81, Y+42 +Prize: X=6363, Y=4491 + +Button A: X+55, Y+70 +Button B: X+90, Y+13 +Prize: X=7855, Y=6037 + +Button A: X+39, Y+78 +Button B: X+53, Y+19 +Prize: X=19180, Y=483 + +Button A: X+11, Y+77 +Button B: X+74, Y+17 +Prize: X=6027, Y=1608 + +Button A: X+71, Y+34 +Button B: X+20, Y+54 +Prize: X=1962, Y=12986 + +Button A: X+19, Y+50 +Button B: X+57, Y+25 +Prize: X=19082, Y=12150 + +Button A: X+54, Y+19 +Button B: X+13, Y+31 +Prize: X=1754, Y=19209 + +Button A: X+77, Y+15 +Button B: X+17, Y+98 +Prize: X=7856, Y=7117 + +Button A: X+86, Y+35 +Button B: X+18, Y+85 +Prize: X=6694, Y=6375 + +Button A: X+14, Y+62 +Button B: X+63, Y+41 +Prize: X=1330, Y=4938 + +Button A: X+92, Y+51 +Button B: X+38, Y+74 +Prize: X=6240, Y=8435 + +Button A: X+14, Y+20 +Button B: X+86, Y+27 +Prize: X=4106, Y=2319 + +Button A: X+54, Y+17 +Button B: X+36, Y+69 +Prize: X=6488, Y=2762 + +Button A: X+82, Y+96 +Button B: X+82, Y+15 +Prize: X=4592, Y=2460 + +Button A: X+14, Y+65 +Button B: X+71, Y+24 +Prize: X=9947, Y=3249 + +Button A: X+33, Y+54 +Button B: X+23, Y+11 +Prize: X=7043, Y=12653 + +Button A: X+35, Y+12 +Button B: X+16, Y+47 +Prize: X=7136, Y=7027 + +Button A: X+11, Y+26 +Button B: X+39, Y+20 +Prize: X=8298, Y=1518 + +Button A: X+50, Y+12 +Button B: X+13, Y+23 +Prize: X=1816, Y=2066 + +Button A: X+17, Y+38 +Button B: X+63, Y+40 +Prize: X=9007, Y=7834 + +Button A: X+55, Y+19 +Button B: X+11, Y+28 +Prize: X=14257, Y=9219 + +Button A: X+55, Y+18 +Button B: X+11, Y+69 +Prize: X=1343, Y=5285 + +Button A: X+19, Y+53 +Button B: X+74, Y+28 +Prize: X=2560, Y=1920 + +Button A: X+12, Y+59 +Button B: X+39, Y+14 +Prize: X=5354, Y=317 + +Button A: X+72, Y+14 +Button B: X+91, Y+86 +Prize: X=9387, Y=7358 + +Button A: X+18, Y+84 +Button B: X+54, Y+48 +Prize: X=3852, Y=6960 + +Button A: X+12, Y+69 +Button B: X+57, Y+12 +Prize: X=6488, Y=7169 + +Button A: X+15, Y+30 +Button B: X+42, Y+15 +Prize: X=12671, Y=10775 + +Button A: X+25, Y+12 +Button B: X+34, Y+96 +Prize: X=2435, Y=6348 + +Button A: X+29, Y+12 +Button B: X+40, Y+66 +Prize: X=1315, Y=17804 + +Button A: X+69, Y+26 +Button B: X+22, Y+56 +Prize: X=6670, Y=4708 + +Button A: X+19, Y+42 +Button B: X+62, Y+21 +Prize: X=2458, Y=16769 + +Button A: X+45, Y+17 +Button B: X+23, Y+38 +Prize: X=5151, Y=19084 + +Button A: X+17, Y+33 +Button B: X+35, Y+14 +Prize: X=14888, Y=18170 + +Button A: X+74, Y+36 +Button B: X+14, Y+57 +Prize: X=14816, Y=15158 + +Button A: X+36, Y+14 +Button B: X+32, Y+60 +Prize: X=3368, Y=15472 + +Button A: X+85, Y+19 +Button B: X+83, Y+89 +Prize: X=10387, Y=4717 + +Button A: X+55, Y+18 +Button B: X+37, Y+68 +Prize: X=16050, Y=14820 + +Button A: X+52, Y+21 +Button B: X+15, Y+49 +Prize: X=4037, Y=6619 + +Button A: X+75, Y+11 +Button B: X+11, Y+51 +Prize: X=19531, Y=6083 + +Button A: X+90, Y+21 +Button B: X+29, Y+38 +Prize: X=10125, Y=3768 + +Button A: X+33, Y+70 +Button B: X+45, Y+20 +Prize: X=4805, Y=17590 + +Button A: X+11, Y+28 +Button B: X+58, Y+33 +Prize: X=4190, Y=18722 + +Button A: X+95, Y+50 +Button B: X+16, Y+70 +Prize: X=3754, Y=2530 + +Button A: X+88, Y+19 +Button B: X+35, Y+84 +Prize: X=7511, Y=3227 + +Button A: X+48, Y+12 +Button B: X+11, Y+31 +Prize: X=9355, Y=19551 + +Button A: X+71, Y+40 +Button B: X+39, Y+96 +Prize: X=9850, Y=12656 + +Button A: X+18, Y+46 +Button B: X+69, Y+53 +Prize: X=1584, Y=3308 + +Button A: X+65, Y+26 +Button B: X+62, Y+89 +Prize: X=7671, Y=5829 + +Button A: X+92, Y+51 +Button B: X+19, Y+41 +Prize: X=4806, Y=5650 + +Button A: X+26, Y+98 +Button B: X+50, Y+39 +Prize: X=6268, Y=10174 + +Button A: X+16, Y+64 +Button B: X+34, Y+12 +Prize: X=16854, Y=11364 + +Button A: X+20, Y+69 +Button B: X+61, Y+23 +Prize: X=408, Y=12175 + +Button A: X+49, Y+16 +Button B: X+11, Y+45 +Prize: X=17005, Y=1724 + +Button A: X+82, Y+15 +Button B: X+92, Y+80 +Prize: X=15178, Y=8525 + +Button A: X+98, Y+17 +Button B: X+32, Y+95 +Prize: X=4930, Y=5596 + +Button A: X+74, Y+24 +Button B: X+63, Y+72 +Prize: X=4818, Y=1872 + +Button A: X+63, Y+23 +Button B: X+29, Y+74 +Prize: X=4610, Y=2155 + +Button A: X+14, Y+69 +Button B: X+46, Y+16 +Prize: X=5686, Y=14981 + +Button A: X+12, Y+44 +Button B: X+73, Y+32 +Prize: X=1404, Y=2320 + +Button A: X+16, Y+61 +Button B: X+36, Y+16 +Prize: X=19784, Y=1294 + +Button A: X+79, Y+17 +Button B: X+11, Y+57 +Prize: X=18419, Y=19769 + +Button A: X+27, Y+61 +Button B: X+32, Y+16 +Prize: X=11215, Y=8185 + +Button A: X+80, Y+14 +Button B: X+55, Y+94 +Prize: X=6715, Y=3622 + +Button A: X+13, Y+99 +Button B: X+67, Y+60 +Prize: X=1132, Y=5469 + +Button A: X+11, Y+64 +Button B: X+68, Y+52 +Prize: X=1359, Y=3096 + +Button A: X+16, Y+40 +Button B: X+60, Y+34 +Prize: X=4712, Y=2220 + +Button A: X+50, Y+11 +Button B: X+12, Y+60 +Prize: X=15794, Y=4259 + +Button A: X+38, Y+17 +Button B: X+29, Y+54 +Prize: X=1335, Y=6160 + +Button A: X+36, Y+59 +Button B: X+93, Y+32 +Prize: X=6990, Y=6880 + +Button A: X+29, Y+97 +Button B: X+62, Y+55 +Prize: X=3255, Y=5097 + +Button A: X+25, Y+21 +Button B: X+22, Y+73 +Prize: X=3307, Y=5831 + +Button A: X+15, Y+75 +Button B: X+87, Y+82 +Prize: X=2655, Y=6215 + +Button A: X+22, Y+82 +Button B: X+74, Y+39 +Prize: X=4198, Y=6648 + +Button A: X+41, Y+61 +Button B: X+36, Y+11 +Prize: X=7347, Y=17092 + +Button A: X+82, Y+51 +Button B: X+19, Y+60 +Prize: X=1729, Y=1509 + +Button A: X+43, Y+13 +Button B: X+49, Y+76 +Prize: X=8520, Y=7788 + +Button A: X+97, Y+24 +Button B: X+46, Y+51 +Prize: X=1349, Y=1245 + +Button A: X+84, Y+38 +Button B: X+13, Y+51 +Prize: X=10408, Y=4606 + +Button A: X+48, Y+97 +Button B: X+80, Y+28 +Prize: X=9584, Y=8808 + +Button A: X+13, Y+32 +Button B: X+76, Y+43 +Prize: X=16226, Y=18495 + +Button A: X+14, Y+33 +Button B: X+78, Y+54 +Prize: X=1852, Y=2028 + +Button A: X+11, Y+30 +Button B: X+73, Y+37 +Prize: X=7433, Y=18454 + +Button A: X+23, Y+56 +Button B: X+31, Y+16 +Prize: X=12525, Y=3816 + +Button A: X+55, Y+16 +Button B: X+21, Y+68 +Prize: X=16009, Y=16852 + +Button A: X+17, Y+47 +Button B: X+76, Y+37 +Prize: X=6637, Y=12724 + +Button A: X+74, Y+88 +Button B: X+59, Y+12 +Prize: X=9928, Y=6688 + +Button A: X+26, Y+87 +Button B: X+32, Y+21 +Prize: X=1790, Y=3063 + +Button A: X+25, Y+71 +Button B: X+56, Y+19 +Prize: X=1849, Y=5946 + +Button A: X+51, Y+76 +Button B: X+59, Y+28 +Prize: X=7997, Y=6644 + +Button A: X+53, Y+28 +Button B: X+32, Y+62 +Prize: X=5323, Y=6228 + +Button A: X+33, Y+69 +Button B: X+39, Y+18 +Prize: X=575, Y=13307 + +Button A: X+93, Y+15 +Button B: X+56, Y+55 +Prize: X=7024, Y=3845 + +Button A: X+21, Y+53 +Button B: X+68, Y+24 +Prize: X=5268, Y=7924 + +Button A: X+13, Y+51 +Button B: X+78, Y+27 +Prize: X=15733, Y=10982 + +Button A: X+12, Y+79 +Button B: X+50, Y+11 +Prize: X=7094, Y=2854 + +Button A: X+21, Y+83 +Button B: X+90, Y+69 +Prize: X=2607, Y=5143 + +Button A: X+94, Y+16 +Button B: X+25, Y+54 +Prize: X=10271, Y=6474 + +Button A: X+80, Y+14 +Button B: X+12, Y+69 +Prize: X=15888, Y=10392 + +Button A: X+58, Y+37 +Button B: X+15, Y+54 +Prize: X=1422, Y=3573 + +Button A: X+13, Y+28 +Button B: X+59, Y+29 +Prize: X=2235, Y=12810 + +Button A: X+11, Y+32 +Button B: X+58, Y+13 +Prize: X=438, Y=6564 + +Button A: X+14, Y+72 +Button B: X+93, Y+84 +Prize: X=4137, Y=7476 + +Button A: X+63, Y+29 +Button B: X+27, Y+54 +Prize: X=4319, Y=1669 + +Button A: X+86, Y+28 +Button B: X+30, Y+60 +Prize: X=5710, Y=2060 + +Button A: X+15, Y+54 +Button B: X+52, Y+19 +Prize: X=9815, Y=1199 + +Button A: X+24, Y+63 +Button B: X+57, Y+20 +Prize: X=16160, Y=12588 + +Button A: X+19, Y+37 +Button B: X+57, Y+33 +Prize: X=2324, Y=15332 + +Button A: X+25, Y+14 +Button B: X+31, Y+56 +Prize: X=7136, Y=17336 + +Button A: X+66, Y+29 +Button B: X+25, Y+57 +Prize: X=13681, Y=16936 + +Button A: X+36, Y+93 +Button B: X+84, Y+56 +Prize: X=6720, Y=11242 + +Button A: X+92, Y+41 +Button B: X+18, Y+96 +Prize: X=1396, Y=1150 + +Button A: X+12, Y+38 +Button B: X+63, Y+28 +Prize: X=19403, Y=12776 + +Button A: X+72, Y+28 +Button B: X+13, Y+37 +Prize: X=5137, Y=3113 + +Button A: X+90, Y+72 +Button B: X+91, Y+13 +Prize: X=5795, Y=2543 + +Button A: X+28, Y+13 +Button B: X+31, Y+49 +Prize: X=16418, Y=9287 + +Button A: X+17, Y+33 +Button B: X+64, Y+32 +Prize: X=11422, Y=2206 + +Button A: X+71, Y+22 +Button B: X+16, Y+45 +Prize: X=2918, Y=7791 + +Button A: X+15, Y+36 +Button B: X+55, Y+35 +Prize: X=7930, Y=7704 + +Button A: X+57, Y+65 +Button B: X+95, Y+17 +Prize: X=11818, Y=4800 + +Button A: X+22, Y+46 +Button B: X+33, Y+21 +Prize: X=1232, Y=1040 + +Button A: X+34, Y+98 +Button B: X+85, Y+39 +Prize: X=7582, Y=9494 + +Button A: X+63, Y+15 +Button B: X+15, Y+47 +Prize: X=13439, Y=17391 + +Button A: X+20, Y+41 +Button B: X+38, Y+23 +Prize: X=2052, Y=10086 + +Button A: X+14, Y+66 +Button B: X+84, Y+28 +Prize: X=16902, Y=10730 + +Button A: X+27, Y+12 +Button B: X+17, Y+43 +Prize: X=9367, Y=12201 + +Button A: X+30, Y+49 +Button B: X+40, Y+20 +Prize: X=8430, Y=10049 + +Button A: X+82, Y+22 +Button B: X+46, Y+97 +Prize: X=3798, Y=4236 + +Button A: X+56, Y+55 +Button B: X+94, Y+13 +Prize: X=6522, Y=5533 + +Button A: X+39, Y+41 +Button B: X+59, Y+16 +Prize: X=4261, Y=3559 + +Button A: X+59, Y+18 +Button B: X+11, Y+63 +Prize: X=15316, Y=10169 + +Button A: X+59, Y+55 +Button B: X+20, Y+98 +Prize: X=375, Y=667 + +Button A: X+11, Y+93 +Button B: X+64, Y+67 +Prize: X=6699, Y=14917 + +Button A: X+13, Y+46 +Button B: X+48, Y+15 +Prize: X=1661, Y=1232 + +Button A: X+36, Y+99 +Button B: X+85, Y+42 +Prize: X=2224, Y=3048 + +Button A: X+11, Y+75 +Button B: X+28, Y+22 +Prize: X=2614, Y=6168 + +Button A: X+21, Y+97 +Button B: X+94, Y+81 +Prize: X=7763, Y=8662 + +Button A: X+34, Y+13 +Button B: X+26, Y+42 +Prize: X=8612, Y=15869 + +Button A: X+39, Y+71 +Button B: X+31, Y+13 +Prize: X=19737, Y=5345 + +Button A: X+21, Y+60 +Button B: X+75, Y+30 +Prize: X=10448, Y=18140 + +Button A: X+24, Y+49 +Button B: X+47, Y+17 +Prize: X=7371, Y=12446 + +Button A: X+56, Y+86 +Button B: X+94, Y+41 +Prize: X=3570, Y=4759 + +Button A: X+14, Y+50 +Button B: X+54, Y+28 +Prize: X=19392, Y=1330 + +Button A: X+20, Y+67 +Button B: X+52, Y+13 +Prize: X=1000, Y=3692 + +Button A: X+14, Y+26 +Button B: X+50, Y+21 +Prize: X=7114, Y=9374 + +Button A: X+19, Y+55 +Button B: X+39, Y+16 +Prize: X=15710, Y=8361 + +Button A: X+56, Y+14 +Button B: X+63, Y+96 +Prize: X=4851, Y=3540 + +Button A: X+33, Y+67 +Button B: X+54, Y+24 +Prize: X=5447, Y=1189 + +Button A: X+39, Y+84 +Button B: X+89, Y+24 +Prize: X=10312, Y=8292 + +Button A: X+51, Y+19 +Button B: X+53, Y+74 +Prize: X=4001, Y=3498 + +Button A: X+67, Y+43 +Button B: X+11, Y+36 +Prize: X=4764, Y=9202 + +Button A: X+21, Y+62 +Button B: X+54, Y+22 +Prize: X=4434, Y=2234 + +Button A: X+89, Y+87 +Button B: X+24, Y+88 +Prize: X=6501, Y=7323 + +Button A: X+54, Y+29 +Button B: X+28, Y+51 +Prize: X=13224, Y=17258 + +Button A: X+62, Y+45 +Button B: X+39, Y+94 +Prize: X=4796, Y=9262 + +Button A: X+45, Y+23 +Button B: X+12, Y+52 +Prize: X=11084, Y=11636 + +Button A: X+22, Y+37 +Button B: X+48, Y+25 +Prize: X=5514, Y=11182 + +Button A: X+15, Y+38 +Button B: X+75, Y+39 +Prize: X=16520, Y=17711 + +Button A: X+78, Y+11 +Button B: X+49, Y+92 +Prize: X=9365, Y=6341 + +Button A: X+98, Y+14 +Button B: X+13, Y+64 +Prize: X=5741, Y=2498 + +Button A: X+13, Y+63 +Button B: X+61, Y+20 +Prize: X=13770, Y=14824 + +Button A: X+21, Y+38 +Button B: X+62, Y+37 +Prize: X=17864, Y=15513 + +Button A: X+24, Y+21 +Button B: X+15, Y+62 +Prize: X=1476, Y=4224 + +Button A: X+16, Y+75 +Button B: X+52, Y+12 +Prize: X=468, Y=8849 + +Button A: X+14, Y+41 +Button B: X+46, Y+22 +Prize: X=2040, Y=1353 + +Button A: X+49, Y+16 +Button B: X+29, Y+54 +Prize: X=10446, Y=18614 + +Button A: X+11, Y+69 +Button B: X+75, Y+18 +Prize: X=10963, Y=2327 + +Button A: X+37, Y+64 +Button B: X+47, Y+20 +Prize: X=18201, Y=3324 + +Button A: X+99, Y+14 +Button B: X+87, Y+75 +Prize: X=14862, Y=6177 + +Button A: X+12, Y+58 +Button B: X+82, Y+33 +Prize: X=7438, Y=6507 + +Button A: X+72, Y+13 +Button B: X+13, Y+79 +Prize: X=14160, Y=11952 + +Button A: X+24, Y+55 +Button B: X+73, Y+39 +Prize: X=12196, Y=4761 + +Button A: X+47, Y+28 +Button B: X+21, Y+52 +Prize: X=969, Y=9732 + +Button A: X+57, Y+29 +Button B: X+15, Y+30 +Prize: X=17750, Y=13700 + +Button A: X+40, Y+23 +Button B: X+13, Y+26 +Prize: X=13248, Y=14881 + +Button A: X+68, Y+13 +Button B: X+85, Y+90 +Prize: X=9707, Y=6207 + +Button A: X+47, Y+23 +Button B: X+19, Y+57 +Prize: X=2226, Y=13254 \ No newline at end of file diff --git a/2024/gareth/day14/day14.go b/2024/gareth/day14/day14.go new file mode 100644 index 0000000..d16f089 --- /dev/null +++ b/2024/gareth/day14/day14.go @@ -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 +} diff --git a/2024/gareth/day14/day14_test.go b/2024/gareth/day14/day14_test.go new file mode 100644 index 0000000..ebb51a5 --- /dev/null +++ b/2024/gareth/day14/day14_test.go @@ -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) +} diff --git a/2024/gareth/day14/input.txt b/2024/gareth/day14/input.txt new file mode 100644 index 0000000..e1a6d0a --- /dev/null +++ b/2024/gareth/day14/input.txt @@ -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 \ No newline at end of file diff --git a/2024/gareth/day18/day18.go b/2024/gareth/day18/day18.go new file mode 100644 index 0000000..ed76eb7 --- /dev/null +++ b/2024/gareth/day18/day18.go @@ -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] +} diff --git a/2024/gareth/day18/day18_test.go b/2024/gareth/day18/day18_test.go new file mode 100644 index 0000000..7a52d3b --- /dev/null +++ b/2024/gareth/day18/day18_test.go @@ -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) +} diff --git a/2024/gareth/day18/input.txt b/2024/gareth/day18/input.txt new file mode 100644 index 0000000..6265c77 --- /dev/null +++ b/2024/gareth/day18/input.txt @@ -0,0 +1,3450 @@ +44,51 +65,43 +65,40 +35,54 +66,67 +41,59 +55,55 +23,2 +45,57 +69,36 +34,53 +37,2 +38,1 +37,55 +41,67 +58,55 +3,26 +9,14 +5,28 +54,51 +56,69 +48,47 +46,53 +64,29 +61,56 +69,64 +45,7 +69,38 +39,54 +50,47 +27,14 +33,1 +67,50 +9,19 +56,57 +64,53 +15,21 +63,50 +3,42 +63,65 +43,52 +9,26 +59,31 +1,29 +30,59 +59,53 +13,0 +65,35 +5,24 +19,35 +47,9 +4,21 +24,11 +53,66 +35,2 +26,9 +56,51 +70,29 +69,56 +53,55 +69,67 +58,67 +8,9 +37,62 +55,9 +35,3 +69,35 +55,15 +59,69 +51,9 +61,5 +5,29 +66,45 +5,23 +63,37 +59,17 +69,55 +63,61 +17,18 +57,8 +15,17 +63,60 +53,61 +33,3 +67,68 +23,3 +9,20 +19,7 +1,5 +53,9 +68,47 +21,14 +32,13 +19,5 +6,19 +25,9 +43,58 +4,7 +25,16 +67,37 +0,29 +59,65 +47,55 +8,1 +11,19 +49,5 +57,48 +59,59 +65,39 +36,9 +43,5 +66,29 +55,54 +53,5 +1,35 +6,11 +68,31 +70,69 +20,21 +61,8 +65,46 +47,0 +49,41 +3,11 +30,25 +55,11 +29,4 +33,62 +15,13 +1,18 +1,37 +39,60 +65,53 +67,48 +67,49 +52,49 +25,3 +55,43 +0,21 +13,6 +41,53 +38,9 +17,17 +47,41 +41,6 +45,54 +56,17 +1,38 +6,23 +67,56 +2,11 +69,49 +1,33 +32,5 +41,50 +66,61 +5,21 +21,11 +3,29 +59,16 +49,55 +22,9 +34,1 +15,10 +57,3 +69,57 +18,3 +43,59 +24,15 +65,25 +53,11 +35,56 +39,12 +53,52 +65,30 +38,51 +25,7 +33,10 +63,36 +7,14 +5,25 +50,37 +51,5 +1,23 +53,6 +47,3 +61,41 +27,3 +61,26 +51,7 +39,61 +13,25 +1,31 +35,62 +50,43 +29,6 +53,15 +61,63 +45,5 +11,29 +27,6 +31,14 +55,41 +29,5 +5,5 +25,11 +61,35 +4,13 +34,17 +11,21 +69,69 +63,55 +50,45 +49,46 +1,13 +57,39 +63,47 +55,62 +37,61 +1,32 +7,30 +13,9 +51,47 +49,1 +19,23 +2,45 +51,62 +51,53 +57,63 +54,45 +47,58 +33,59 +3,37 +51,59 +39,3 +19,4 +61,60 +9,21 +67,69 +45,56 +53,57 +1,0 +23,13 +5,1 +27,7 +45,51 +56,45 +33,64 +56,13 +7,33 +20,13 +36,5 +57,55 +9,16 +57,65 +45,48 +47,48 +59,45 +65,29 +11,27 +55,67 +69,63 +17,2 +63,41 +10,27 +9,27 +69,47 +25,0 +57,51 +55,53 +65,48 +15,20 +43,9 +55,47 +62,37 +35,59 +22,17 +25,24 +18,7 +63,38 +40,63 +69,58 +59,43 +3,1 +34,7 +42,59 +41,51 +65,27 +7,21 +9,39 +51,49 +7,5 +25,2 +32,63 +8,3 +33,9 +54,9 +67,61 +67,38 +62,33 +17,1 +44,55 +2,27 +7,19 +2,47 +1,9 +7,9 +41,1 +39,10 +61,25 +35,61 +63,59 +21,13 +29,11 +58,51 +37,3 +17,12 +7,3 +7,29 +37,59 +65,69 +67,31 +19,13 +61,66 +23,9 +43,49 +50,9 +43,8 +61,64 +49,8 +15,2 +57,43 +23,15 +64,43 +39,52 +33,57 +8,29 +57,53 +11,6 +65,31 +65,67 +28,17 +9,31 +41,56 +22,1 +51,11 +66,69 +43,6 +1,19 +33,13 +53,41 +68,35 +43,3 +65,51 +44,3 +57,17 +61,12 +61,65 +44,1 +57,13 +13,10 +61,53 +9,15 +11,9 +29,12 +64,65 +45,41 +67,59 +55,12 +67,33 +56,41 +10,1 +5,14 +19,10 +53,43 +69,31 +3,21 +57,14 +37,47 +35,9 +10,5 +11,24 +66,41 +40,1 +59,39 +65,64 +63,70 +64,67 +13,35 +7,35 +4,11 +17,7 +43,60 +53,3 +32,55 +60,49 +39,48 +63,33 +7,6 +63,53 +69,37 +61,48 +45,45 +61,62 +16,7 +54,3 +13,11 +67,29 +47,59 +23,12 +32,3 +11,25 +63,63 +69,39 +29,7 +49,51 +62,43 +55,39 +3,51 +5,17 +45,3 +17,9 +13,1 +55,33 +47,2 +53,14 +13,19 +61,61 +1,39 +29,15 +5,35 +39,5 +1,1 +53,64 +47,56 +48,55 +59,67 +23,7 +59,63 +68,29 +31,13 +28,13 +30,3 +3,3 +31,17 +43,57 +51,4 +69,34 +3,47 +9,3 +69,54 +17,15 +61,34 +3,43 +39,9 +57,10 +58,43 +63,31 +52,55 +47,49 +25,6 +48,53 +38,57 +17,8 +63,69 +69,65 +50,7 +61,54 +63,67 +55,6 +65,52 +17,3 +51,51 +67,47 +57,5 +10,11 +57,41 +69,44 +29,61 +5,2 +9,11 +17,13 +52,45 +52,47 +57,15 +53,63 +1,7 +54,47 +7,16 +47,7 +9,1 +67,42 +39,1 +53,10 +41,69 +52,13 +57,60 +61,46 +67,60 +5,9 +54,61 +11,32 +55,68 +6,27 +26,3 +66,55 +49,66 +69,32 +61,3 +26,11 +5,44 +57,47 +3,19 +61,58 +12,11 +31,6 +11,34 +49,47 +68,41 +0,5 +61,38 +41,57 +68,45 +39,58 +1,10 +63,29 +55,59 +69,66 +9,24 +63,57 +65,54 +11,3 +48,5 +37,49 +40,7 +2,13 +57,31 +61,51 +33,58 +55,20 +49,53 +35,5 +67,43 +25,1 +61,13 +2,7 +6,9 +20,9 +5,7 +40,3 +7,13 +43,53 +67,65 +66,65 +37,57 +2,21 +13,17 +65,37 +13,3 +50,51 +31,10 +5,18 +35,7 +65,32 +7,26 +7,18 +11,8 +56,65 +65,58 +53,53 +55,44 +9,9 +13,8 +67,35 +38,7 +32,7 +69,29 +22,15 +58,63 +27,13 +29,10 +19,3 +62,67 +15,7 +57,59 +40,51 +61,47 +69,59 +31,19 +27,5 +59,11 +68,67 +15,5 +68,53 +44,43 +60,35 +61,11 +33,63 +40,47 +7,1 +39,51 +62,69 +18,11 +31,55 +44,59 +63,46 +67,67 +37,9 +3,28 +5,32 +11,18 +65,38 +16,21 +3,16 +55,45 +59,56 +66,35 +18,1 +11,11 +61,37 +9,13 +9,23 +48,43 +3,5 +8,19 +3,9 +13,5 +47,61 +5,43 +7,12 +39,55 +46,59 +31,9 +45,59 +27,4 +11,7 +17,5 +7,27 +12,15 +11,20 +12,3 +25,17 +2,3 +13,13 +64,57 +55,3 +3,4 +37,4 +31,3 +44,7 +51,65 +65,61 +69,52 +9,34 +25,5 +24,13 +59,57 +11,1 +3,30 +37,63 +22,21 +42,49 +7,25 +1,24 +39,59 +17,11 +14,13 +19,6 +61,40 +7,15 +13,7 +51,39 +47,57 +4,25 +1,45 +25,15 +9,7 +7,34 +48,11 +66,57 +57,7 +51,55 +57,61 +39,53 +14,1 +31,7 +59,66 +3,23 +41,49 +65,49 +68,39 +37,5 +49,50 +11,15 +59,33 +11,22 +15,4 +23,5 +39,63 +54,11 +21,3 +41,4 +30,63 +13,15 +5,13 +67,39 +61,14 +61,69 +61,42 +42,55 +49,3 +21,8 +23,10 +50,55 +59,35 +69,43 +6,29 +21,15 +45,1 +5,38 +54,15 +55,37 +5,15 +42,11 +46,5 +67,57 +60,13 +47,47 +63,39 +51,3 +1,20 +15,23 +37,58 +35,58 +36,7 +27,9 +49,11 +47,1 +57,49 +50,3 +8,11 +65,26 +2,33 +61,59 +37,53 +6,7 +65,41 +57,64 +16,5 +55,26 +55,4 +13,4 +16,13 +56,63 +54,59 +54,55 +0,7 +7,23 +37,1 +5,10 +19,9 +49,49 +66,33 +65,55 +23,11 +61,31 +27,11 +57,70 +10,13 +62,11 +55,66 +58,11 +69,41 +18,17 +51,52 +14,7 +59,62 +58,13 +3,27 +51,60 +67,52 +57,37 +64,35 +4,33 +44,49 +55,16 +68,61 +15,15 +52,3 +41,61 +0,39 +37,50 +59,51 +3,34 +4,5 +47,44 +59,60 +9,4 +27,1 +46,47 +35,60 +45,55 +53,50 +65,63 +8,5 +30,53 +37,7 +35,64 +51,35 +14,33 +31,8 +39,49 +51,41 +49,7 +3,15 +55,13 +53,13 +57,52 +3,8 +1,15 +4,19 +8,23 +3,25 +62,57 +53,7 +3,31 +33,61 +69,61 +36,53 +61,39 +57,9 +15,25 +57,18 +26,13 +7,31 +61,45 +34,5 +41,54 +56,3 +2,17 +63,43 +63,62 +69,33 +69,51 +59,13 +29,9 +59,41 +55,19 +11,2 +33,5 +25,18 +1,11 +45,61 +37,54 +62,55 +42,65 +22,5 +42,3 +41,52 +31,63 +9,33 +30,15 +52,7 +23,4 +57,42 +3,17 +45,53 +57,67 +64,61 +3,38 +39,57 +65,59 +43,51 +40,57 +45,37 +63,64 +1,3 +0,43 +6,3 +3,36 +1,36 +62,51 +12,17 +3,35 +16,9 +25,13 +35,63 +53,45 +68,63 +55,40 +68,59 +69,45 +4,15 +55,42 +65,33 +21,9 +5,11 +19,1 +46,51 +3,22 +60,43 +70,49 +31,5 +47,6 +64,41 +13,12 +7,22 +7,50 +48,61 +48,51 +1,41 +28,7 +3,41 +45,49 +36,63 +42,1 +5,36 +52,41 +39,4 +5,33 +60,67 +48,7 +24,23 +57,11 +27,17 +48,3 +11,37 +47,51 +38,61 +1,26 +9,25 +64,33 +11,5 +21,7 +63,35 +1,27 +24,7 +15,9 +59,61 +9,22 +15,3 +43,1 +56,7 +67,55 +7,7 +44,45 +63,45 +55,7 +59,58 +29,55 +57,45 +67,53 +31,62 +57,58 +52,9 +7,17 +4,31 +51,45 +9,8 +58,45 +70,47 +21,4 +55,17 +67,63 +55,65 +33,7 +41,5 +3,39 +5,31 +53,47 +59,55 +55,51 +59,68 +35,57 +65,47 +56,55 +27,8 +11,13 +2,41 +3,2 +29,13 +51,61 +59,15 +38,47 +45,67 +45,4 +4,1 +50,11 +51,54 +47,53 +69,53 +65,50 +51,63 +67,45 +11,31 +1,25 +3,40 +63,49 +39,7 +23,1 +30,11 +21,1 +59,37 +57,69 +34,3 +69,27 +9,29 +41,60 +58,53 +70,41 +38,15 +55,5 +43,55 +60,53 +60,45 +43,46 +49,35 +24,5 +1,43 +15,1 +67,51 +37,11 +20,1 +59,9 +68,25 +57,29 +45,15 +54,37 +17,29 +17,52 +4,43 +29,23 +13,46 +41,65 +65,16 +43,41 +17,23 +11,46 +34,67 +35,37 +5,47 +35,40 +41,29 +12,69 +15,67 +53,35 +42,43 +47,22 +35,49 +17,40 +13,59 +49,59 +33,29 +47,31 +11,54 +27,65 +69,3 +67,7 +53,29 +24,45 +57,28 +21,25 +62,21 +31,29 +23,59 +41,47 +22,55 +22,43 +67,26 +29,41 +41,25 +59,23 +43,35 +33,56 +7,69 +23,25 +31,1 +23,65 +41,45 +31,39 +47,63 +25,45 +67,13 +40,41 +46,45 +27,43 +23,49 +37,19 +67,27 +66,23 +46,31 +37,13 +35,47 +19,30 +20,47 +9,38 +64,7 +29,30 +19,45 +56,21 +35,66 +5,45 +33,49 +39,34 +47,65 +17,31 +13,51 +45,22 +45,42 +55,23 +27,55 +37,28 +41,37 +51,36 +57,33 +29,29 +35,53 +1,62 +49,69 +47,32 +4,59 +23,51 +61,33 +15,50 +37,24 +1,57 +46,27 +11,43 +29,35 +20,25 +37,29 +18,41 +31,34 +29,37 +46,29 +23,57 +9,69 +43,68 +37,65 +49,18 +4,61 +58,1 +20,33 +21,12 +46,65 +63,21 +31,27 +27,51 +5,64 +27,48 +26,59 +29,24 +18,35 +15,40 +6,59 +41,21 +46,35 +10,57 +29,19 +45,70 +62,17 +59,36 +25,66 +42,47 +26,49 +53,21 +59,21 +13,55 +51,40 +17,49 +47,34 +31,50 +2,57 +27,37 +55,49 +28,69 +64,25 +34,37 +57,24 +61,17 +43,11 +59,10 +27,42 +9,42 +13,58 +55,35 +35,46 +19,31 +28,65 +15,45 +31,47 +29,45 +67,41 +7,46 +41,63 +39,39 +67,20 +67,21 +37,18 +6,43 +47,33 +57,26 +26,45 +27,45 +35,39 +40,17 +48,21 +65,23 +42,33 +9,37 +29,25 +63,16 +53,24 +31,18 +25,37 +67,11 +43,39 +31,46 +3,55 +13,44 +14,49 +9,35 +55,57 +33,51 +37,69 +7,59 +1,17 +68,3 +64,13 +31,23 +33,53 +43,40 +2,67 +28,47 +43,65 +47,35 +63,3 +35,20 +19,26 +35,17 +11,33 +51,34 +20,29 +12,59 +43,14 +57,34 +33,39 +42,27 +7,61 +45,17 +11,63 +33,14 +4,55 +39,38 +9,43 +27,53 +14,37 +17,65 +31,45 +55,29 +10,47 +19,51 +29,17 +25,69 +18,25 +11,62 +65,21 +23,38 +1,66 +30,49 +9,61 +63,23 +23,39 +11,49 +47,67 +6,69 +31,48 +14,21 +21,57 +24,59 +18,29 +47,27 +25,21 +55,69 +63,7 +35,13 +23,63 +13,33 +15,11 +15,39 +25,36 +43,20 +65,1 +23,21 +20,55 +47,14 +45,36 +51,67 +22,41 +17,47 +16,31 +60,5 +43,36 +8,37 +43,15 +21,5 +10,53 +45,62 +51,17 +57,23 +22,31 +15,16 +31,32 +23,20 +55,0 +25,44 +55,24 +43,47 +5,57 +62,23 +8,61 +27,34 +20,57 +40,33 +15,65 +43,7 +24,29 +44,27 +27,63 +5,63 +57,21 +61,24 +23,29 +49,21 +55,25 +27,50 +17,25 +7,48 +5,53 +37,43 +13,41 +21,70 +8,45 +34,33 +58,47 +6,55 +3,57 +70,23 +59,1 +13,18 +33,60 +46,39 +35,27 +11,41 +33,55 +42,67 +19,48 +17,51 +17,50 +44,31 +68,17 +39,30 +1,63 +29,21 +9,47 +55,27 +33,27 +53,51 +21,21 +9,63 +25,33 +7,58 +53,38 +46,19 +18,69 +21,49 +40,39 +5,37 +53,67 +39,31 +33,12 +7,57 +1,49 +1,55 +19,36 +29,43 +13,50 +55,63 +51,37 +1,56 +41,41 +29,53 +24,63 +27,33 +70,9 +24,19 +2,65 +39,37 +36,35 +25,52 +32,27 +9,51 +25,19 +45,63 +15,33 +19,21 +49,13 +39,13 +65,15 +3,54 +11,57 +49,24 +41,14 +15,29 +15,27 +1,60 +31,25 +30,39 +3,58 +11,44 +13,53 +27,38 +35,33 +43,31 +53,34 +61,67 +25,27 +13,63 +21,59 +17,21 +21,55 +48,17 +5,51 +24,49 +54,49 +50,29 +31,43 +53,19 +62,31 +43,45 +19,41 +17,33 +31,59 +65,28 +26,25 +3,65 +51,25 +59,27 +20,69 +31,60 +47,11 +24,35 +39,23 +48,29 +17,44 +33,50 +61,49 +67,22 +15,26 +15,55 +52,25 +51,0 +67,10 +43,19 +45,33 +39,11 +13,49 +49,33 +3,70 +33,34 +51,13 +25,31 +32,67 +14,45 +45,34 +17,53 +43,21 +53,36 +55,31 +3,13 +1,48 +18,15 +17,69 +29,36 +11,48 +45,31 +29,39 +60,7 +22,27 +41,38 +21,47 +67,8 +49,19 +43,37 +41,33 +53,49 +21,53 +25,60 +33,45 +49,31 +13,22 +53,30 +37,12 +37,31 +27,61 +29,26 +5,52 +33,26 +35,70 +33,69 +39,25 +9,55 +29,1 +5,3 +69,15 +31,22 +9,32 +53,20 +23,33 +31,33 +6,63 +64,15 +69,23 +49,39 +48,27 +41,3 +7,38 +59,47 +65,10 +7,66 +17,24 +67,9 +25,22 +0,63 +7,37 +9,36 +9,17 +69,25 +27,39 +42,25 +11,23 +57,25 +31,67 +51,20 +35,55 +11,17 +9,57 +11,67 +35,29 +5,27 +16,57 +27,36 +21,63 +10,51 +52,17 +34,11 +3,45 +49,67 +37,37 +43,12 +53,18 +5,66 +26,17 +17,67 +19,60 +28,19 +31,70 +27,20 +11,68 +8,67 +33,38 +15,47 +51,29 +33,23 +47,23 +11,30 +45,69 +33,16 +42,19 +8,55 +25,67 +23,19 +69,7 +35,31 +28,29 +67,17 +13,31 +26,53 +19,66 +27,57 +45,65 +33,11 +5,65 +1,69 +22,67 +13,65 +51,38 +3,53 +70,27 +17,30 +25,59 +19,64 +21,19 +36,33 +36,27 +53,56 +65,24 +39,18 +37,36 +15,64 +15,28 +53,28 +45,27 +33,47 +31,69 +23,67 +5,59 +53,59 +35,19 +29,22 +47,43 +59,7 +35,42 +54,31 +21,45 +25,53 +20,51 +69,8 +12,39 +29,54 +10,45 +16,67 +29,58 +61,15 +63,2 +27,15 +57,36 +60,31 +30,43 +21,51 +21,38 +21,42 +63,18 +29,47 +17,57 +67,15 +65,3 +16,47 +13,54 +37,45 +45,14 +48,57 +25,55 +55,32 +47,17 +19,19 +41,39 +7,52 +7,45 +51,23 +53,22 +23,37 +11,56 +68,15 +50,33 +35,67 +33,24 +23,64 +15,51 +15,36 +26,61 +57,32 +15,35 +39,17 +16,39 +11,65 +13,14 +33,17 +43,25 +40,45 +63,25 +19,32 +41,8 +44,67 +3,59 +41,19 +36,13 +14,17 +17,39 +23,54 +25,63 +28,33 +19,47 +16,33 +29,65 +33,20 +31,49 +65,2 +34,45 +27,2 +11,36 +48,41 +45,25 +3,69 +42,69 +43,17 +61,29 +65,7 +31,51 +40,27 +14,63 +27,31 +10,17 +59,25 +37,17 +4,49 +19,29 +25,51 +26,21 +15,63 +64,9 +24,27 +69,5 +30,67 +3,7 +51,69 +19,57 +4,51 +48,35 +34,23 +59,3 +26,31 +37,23 +7,65 +66,7 +68,11 +42,17 +52,67 +24,41 +49,17 +33,67 +29,69 +69,19 +39,64 +14,57 +49,43 +19,22 +53,39 +47,25 +33,35 +63,9 +20,19 +58,5 +35,25 +60,3 +19,53 +22,65 +38,31 +56,49 +19,44 +67,3 +13,28 +27,41 +31,56 +50,1 +14,25 +27,23 +26,67 +65,5 +17,58 +15,61 +48,25 +35,15 +29,16 +39,67 +31,37 +57,2 +54,39 +38,13 +29,40 +23,52 +39,47 +21,29 +36,67 +25,39 +3,67 +40,13 +12,25 +59,38 +17,22 +44,63 +9,59 +47,29 +52,31 +29,67 +3,33 +21,16 +12,35 +29,59 +2,51 +47,5 +53,37 +44,19 +28,39 +45,35 +15,49 +7,39 +56,35 +31,21 +17,62 +15,59 +63,10 +63,11 +49,57 +3,49 +35,51 +43,30 +11,38 +36,43 +13,29 +47,13 +9,62 +43,23 +50,27 +12,41 +63,13 +29,3 +35,69 +12,65 +46,25 +16,27 +7,43 +47,68 +63,19 +41,7 +56,29 +58,15 +63,51 +45,9 +25,61 +36,15 +33,30 +61,22 +45,24 +59,30 +53,31 +5,69 +17,27 +27,29 +58,33 +59,40 +35,22 +47,15 +16,45 +37,40 +14,65 +44,9 +27,67 +35,36 +36,17 +33,19 +52,27 +11,45 +64,5 +41,43 +39,69 +9,53 +41,17 +43,42 +17,59 +45,29 +37,39 +21,39 +21,65 +19,37 +21,23 +65,17 +11,35 +35,1 +33,65 +47,19 +37,15 +13,21 +49,30 +20,59 +62,7 +13,70 +1,47 +61,7 +15,69 +5,67 +53,23 +39,27 +49,60 +5,56 +51,66 +37,67 +13,69 +19,39 +33,21 +7,67 +16,15 +17,61 +49,14 +15,68 +25,35 +69,9 +21,67 +46,17 +24,57 +23,68 +1,51 +43,38 +35,48 +39,16 +0,55 +65,65 +19,33 +60,9 +5,41 +67,2 +29,44 +53,69 +41,31 +17,37 +63,17 +7,42 +8,49 +7,32 +6,49 +15,37 +13,57 +33,33 +35,43 +39,29 +51,15 +29,66 +23,27 +23,61 +61,21 +25,47 +18,59 +41,35 +31,52 +30,35 +69,17 +27,59 +13,30 +49,27 +15,31 +11,53 +65,57 +15,56 +30,19 +23,62 +27,27 +24,31 +23,47 +23,23 +23,31 +29,46 +28,61 +17,41 +36,19 +7,40 +38,65 +11,66 +27,69 +37,21 +45,11 +59,18 +7,41 +59,49 +51,43 +19,49 +15,43 +55,61 +49,37 +8,65 +39,68 +61,9 +7,51 +41,32 +37,25 +19,43 +26,29 +19,56 +69,1 +43,34 +67,23 +11,69 +37,35 +69,13 +19,27 +27,19 +60,19 +32,21 +32,35 +11,47 +35,41 +66,5 +28,57 +42,63 +44,39 +51,1 +18,43 +14,53 +27,68 +41,11 +44,17 +18,19 +49,29 +52,43 +35,65 +19,15 +53,33 +27,25 +45,23 +37,51 +67,14 +9,52 +1,61 +50,19 +65,19 +27,32 +38,41 +31,35 +25,46 +53,42 +33,25 +25,29 +16,61 +21,46 +43,61 +13,37 +2,53 +13,38 +59,20 +63,20 +3,63 +13,43 +67,0 +35,23 +6,35 +21,27 +20,45 +39,43 +12,49 +7,11 +9,68 +15,42 +43,27 +41,15 +19,63 +61,23 +66,13 +25,65 +18,67 +69,12 +23,48 +27,26 +17,54 +53,68 +33,28 +21,52 +22,45 +16,63 +21,61 +29,63 +49,68 +44,65 +59,4 +51,19 +51,57 +19,69 +22,49 +37,68 +49,23 +58,21 +47,10 +34,9 +33,41 +25,64 +23,50 +25,54 +37,32 +39,42 +41,9 +29,28 +25,41 +39,21 +45,19 +19,65 +22,29 +47,38 +21,28 +50,15 +5,40 +49,65 +67,19 +36,49 +61,57 +53,2 +32,37 +43,63 +10,41 +69,21 +19,55 +20,39 +64,1 +57,38 +69,18 +17,38 +11,51 +20,63 +57,35 +21,24 +41,55 +51,70 +61,55 +19,61 +40,25 +57,27 +61,1 +39,44 +39,36 +27,21 +41,24 +21,37 +1,53 +51,58 +27,47 +57,57 +39,33 +37,33 +23,55 +40,69 +21,43 +37,46 +49,70 +46,67 +64,21 +41,13 +13,27 +45,12 +50,23 +39,66 +45,13 +19,17 +19,11 +63,1 +19,38 +17,48 +61,28 +22,59 +19,62 +37,44 +21,34 +13,39 +61,43 +37,38 +2,69 +27,64 +12,29 +53,27 +31,61 +2,63 +23,40 +23,26 +59,26 +32,39 +31,11 +43,33 +53,32 +49,45 +63,5 +21,31 +53,25 +17,43 +4,45 +23,32 +5,62 +13,45 +19,14 +57,22 +13,26 +51,27 +69,11 +39,28 +15,19 +65,20 +7,54 +5,46 +31,57 +39,45 +34,51 +7,63 +17,55 +46,9 +29,33 +26,41 +39,22 +67,25 +66,17 +69,6 +47,21 +10,29 +62,3 +16,35 +63,15 +67,5 +62,27 +7,49 +17,19 +20,41 +45,39 +61,27 +34,29 +47,64 +11,61 +51,12 +33,46 +10,61 +19,25 +23,45 +47,42 +21,69 +41,27 +59,29 +22,23 +33,43 +41,22 +31,53 +9,41 +29,31 +49,61 +9,45 +5,55 +33,44 +27,62 +1,21 +23,35 +47,37 +25,25 +44,23 +30,69 +61,19 +22,57 +0,51 +31,15 +53,65 +60,1 +46,13 +25,23 +65,13 +51,16 +17,66 +0,15 +29,51 +9,60 +39,19 +5,19 +39,15 +41,20 +33,15 +51,26 +4,67 +43,67 +51,21 +48,39 +9,49 +22,35 +32,43 +43,16 +21,33 +47,45 +51,31 +28,53 +48,37 +19,20 +57,1 +35,35 +14,41 +23,53 +31,24 +57,19 +21,41 +41,10 +15,60 +70,17 +43,13 +41,30 +35,21 +52,59 +47,16 +55,1 +47,62 +24,33 +35,26 +19,50 +39,41 +30,65 +37,41 +5,39 +51,22 +65,44 +49,25 +20,67 +9,65 +27,56 +39,65 +30,31 +11,55 +5,49 +43,43 +9,58 +14,47 +49,63 +23,69 +67,24 +68,5 +47,20 +45,47 +65,45 +11,59 +5,61 +60,51 +36,23 +63,27 +50,59 +41,36 +55,21 +36,39 +55,58 +7,47 +45,43 +17,63 +32,19 +34,41 +33,48 +30,1 +11,39 +1,65 +43,28 +47,69 +32,41 +39,35 +13,60 +33,68 +49,9 +3,48 +43,69 +12,63 +65,12 +14,67 +12,55 +9,40 +49,64 +65,9 +68,21 +26,57 +38,25 +31,31 +41,23 +43,29 +59,19 +28,51 +19,54 +49,12 +15,24 +63,48 +13,61 +23,17 +29,49 +5,60 +27,24 +60,29 +27,49 +35,45 +17,35 +69,2 +15,32 +26,39 +29,27 +1,67 +23,41 +21,36 +23,43 +62,5 +35,11 +48,65 +25,68 +17,45 +13,47 +31,0 +31,65 +59,5 +13,23 +15,53 +27,35 +41,62 +59,22 +58,39 +53,17 +16,55 +54,23 +15,52 +33,31 +49,32 +9,64 +24,39 +13,67 +25,43 +38,27 +25,49 +36,31 +15,41 +65,11 +15,57 +67,1 +39,20 +29,57 +5,68 +25,57 +31,30 +19,59 +49,15 +31,41 +21,35 +59,24 +32,53 +3,61 +47,39 +7,53 +51,33 +45,21 +1,59 +37,27 +38,21 +57,30 +22,61 +21,17 +33,37 +7,55 +29,42 +9,5 +9,67 +52,63 +19,67 +53,1 +44,36 +34,34 +60,18 +62,64 +38,2 +22,40 +25,40 +28,45 +22,13 +20,37 +28,9 +28,64 +68,0 +0,6 +34,38 +63,40 +66,66 +12,16 +21,56 +26,15 +0,54 +20,44 +52,10 +70,55 +54,33 +22,47 +69,20 +32,36 +21,48 +28,40 +0,14 +2,50 +5,70 +28,8 +15,6 +58,9 +36,51 +46,28 +8,14 +64,6 +0,56 +58,29 +64,55 +26,51 +17,4 +30,54 +14,24 +68,26 +14,35 +68,22 +26,2 +30,38 +17,16 +28,11 +37,14 +62,16 +23,42 +26,68 +42,7 +60,20 +40,49 +14,12 +68,12 +26,44 +28,37 +35,50 +70,43 +66,58 +48,56 +46,30 +34,48 +16,14 +62,15 +41,2 +56,6 +31,16 +50,70 +24,20 +64,58 +59,14 +6,6 +19,2 +10,66 +25,20 +54,46 +41,16 +55,50 +10,28 +42,42 +38,45 +26,34 +59,8 +12,36 +10,23 +58,35 +47,66 +60,46 +40,54 +16,8 +36,16 +56,39 +70,36 +30,4 +35,32 +54,63 +8,36 +38,10 +30,70 +4,41 +0,48 +25,10 +34,52 +20,4 +56,44 +67,4 +38,44 +18,37 +6,60 +60,47 +6,66 +27,18 +35,12 +37,8 +8,48 +18,53 +30,50 +36,50 +35,24 +22,3 +55,8 +20,24 +70,65 +4,68 +25,42 +8,68 +42,5 +30,55 +70,60 +18,33 +23,36 +35,8 +40,28 +34,13 +42,4 +26,32 +54,67 +29,2 +39,6 +68,48 +0,16 +8,35 +18,5 +38,12 +32,10 +48,13 +70,57 +19,0 +46,23 +42,36 +38,35 +39,14 +11,70 +34,59 +24,40 +70,64 +70,52 +45,28 +24,21 +4,6 +66,62 +62,29 +25,34 +34,21 +36,37 +4,54 +39,70 +46,6 +26,58 +30,27 +36,56 +44,5 +59,6 +65,18 +64,17 +38,24 +57,12 +34,12 +66,42 +15,18 +30,13 +69,60 +21,40 +25,4 +54,66 +26,26 +34,39 +31,58 +62,39 +12,23 +2,48 +32,1 +28,32 +62,52 +32,59 +50,18 +17,6 +44,12 +42,46 +48,15 +8,15 +62,13 +28,15 +70,22 +35,30 +48,22 +2,62 +41,64 +10,38 +64,44 +41,68 +48,1 +70,37 +8,39 +24,52 +58,42 +25,8 +6,57 +18,46 +67,28 +36,24 +70,5 +63,42 +6,67 +18,48 +38,20 +14,0 +10,37 +26,24 +70,34 +58,60 +61,36 +64,26 +24,25 +62,46 +44,64 +55,10 +25,14 +4,26 +4,34 +14,44 +42,14 +37,20 +10,33 +37,26 +34,40 +10,46 +52,16 +3,66 +4,35 +66,53 +67,58 +31,44 +70,31 +38,59 +68,28 +40,11 +6,38 +52,29 +28,35 +52,37 +30,5 +14,9 +18,28 +43,48 +68,49 +38,39 +46,16 +13,32 +12,13 +53,8 +52,0 +60,28 +68,9 +52,39 +36,30 +40,66 +13,20 +27,60 +18,10 +46,32 +8,31 +39,40 +70,59 +58,56 +50,34 +60,40 +70,32 +64,52 +30,29 +58,62 +32,56 +35,10 +38,53 +51,18 +56,62 +18,6 +37,30 +44,37 +67,66 +10,30 +1,70 +66,16 +50,36 +28,58 +30,45 +0,70 +28,44 +20,3 +62,28 +30,30 +15,22 +17,0 +48,40 +6,36 +30,23 +13,24 +54,22 +68,6 +67,30 +32,2 +36,11 +37,16 +0,49 +62,25 +8,13 +22,32 +40,43 +44,32 +38,28 +0,18 +30,37 +29,50 +46,69 +32,25 +46,10 +70,1 +1,4 +56,28 +62,18 +55,28 +36,25 +14,36 +38,58 +66,47 +20,16 +50,32 +16,41 +58,2 +54,20 +55,2 +1,58 +30,17 +60,16 +64,64 +68,24 +32,20 +66,44 +50,64 +36,18 +14,40 +12,52 +24,64 +28,50 +14,50 +36,3 +48,0 +50,60 +50,30 +63,24 +70,3 +27,12 +30,0 +42,35 +60,38 +54,34 +31,26 +22,46 +4,63 +38,50 +58,31 +49,56 +16,36 +8,20 +4,66 +62,48 +2,4 +6,54 +13,34 +36,8 +63,14 +38,17 +26,12 +20,32 +52,38 +11,52 +46,1 +48,19 +38,33 +44,28 +56,56 +54,58 +43,4 +64,50 +32,46 +45,18 +14,26 +63,54 +42,8 +68,20 +56,24 +14,31 +34,35 +70,30 +67,18 +0,67 +40,2 +58,52 +23,28 +58,27 +50,68 +10,49 +40,65 +52,4 +20,27 +62,10 +56,50 +60,14 +59,0 +62,6 +48,28 +57,20 +38,48 +20,35 +10,55 +62,20 +68,16 +42,68 +24,55 +61,70 +12,2 +53,4 +62,1 +15,14 +70,4 +37,34 +63,32 +49,0 +0,52 +60,52 +63,66 +3,62 +20,17 +12,32 +62,50 +65,68 +10,19 +14,28 +9,0 +26,30 +4,27 +39,56 +42,29 +60,24 +68,7 +59,42 +51,48 +29,8 +54,43 +49,36 +24,28 +30,7 +6,61 +55,34 +9,12 +31,40 +20,64 +50,0 +66,21 +19,18 +4,2 +30,47 +2,5 +7,20 +33,4 +24,1 +7,60 +40,24 +46,20 +49,4 +36,34 +8,18 +50,40 +12,7 +6,39 +46,46 +29,14 +50,38 +22,30 +61,32 +58,69 +32,38 +11,42 +0,22 +56,54 +10,31 +49,62 +65,4 +24,14 +44,33 +47,18 +7,28 +16,49 +42,60 +64,20 +50,48 +36,61 +1,44 +56,25 +26,38 +36,59 +14,34 +32,34 +29,0 +8,41 +67,40 +60,65 +19,70 +0,19 +4,64 +29,38 +26,50 +24,48 +25,56 +60,10 +3,68 +8,2 +56,34 +18,64 +51,64 +42,32 +59,46 +14,39 +0,31 +2,37 +40,37 +52,22 +16,70 +1,52 +58,59 +2,26 +6,64 +42,45 +12,18 +54,1 +45,46 +39,26 +52,33 +2,61 +65,66 +36,0 +42,23 +24,46 +64,36 +45,30 +43,56 +60,57 +44,20 +61,68 +16,3 +44,56 +57,40 +12,58 +10,26 +42,58 +31,54 +12,31 +48,34 +59,44 +70,11 +1,54 +40,18 +70,63 +27,10 +2,20 +46,49 +26,69 +30,10 +31,20 +32,70 +30,64 +52,48 +10,9 +38,6 +52,28 +24,24 +48,24 +70,46 +1,6 +44,21 +20,66 +12,53 +5,48 +51,68 +40,23 +63,56 +4,3 +64,4 +51,10 +14,11 +65,60 +53,70 +2,2 +34,61 +24,2 +48,59 +67,12 +8,52 +26,4 +9,44 +9,48 +44,2 +41,48 +21,32 +24,70 +20,15 +25,28 +26,1 +21,30 +4,56 +17,14 +4,36 +12,22 +14,62 +54,42 +52,1 +2,1 +28,2 +31,42 +14,8 +11,58 +49,20 +52,44 +42,13 +54,57 +70,19 +2,52 +3,20 +47,28 +70,12 +52,23 +3,0 +64,0 +70,40 +22,22 +39,24 +32,69 +22,48 +19,52 +36,69 +27,46 +22,19 +63,30 +16,52 +64,69 +28,1 +43,0 +22,42 +50,56 +35,38 +4,37 +62,4 +28,27 +51,44 +22,8 +19,58 +12,9 +58,30 +51,8 +15,46 +60,17 +6,1 +16,59 +6,16 +10,4 +0,68 +14,58 +27,22 +69,62 +0,53 +36,57 +24,68 +20,68 +54,53 +2,25 +2,8 +52,53 +33,22 +27,52 +66,15 +6,47 +31,38 +54,19 +68,34 +50,6 +23,70 +1,42 +64,27 +41,58 +33,42 +60,56 +32,18 +12,68 +42,38 +54,62 +52,20 +36,22 +47,24 +34,46 +49,26 +9,66 +25,30 +38,14 +46,34 +56,66 +52,6 +36,70 +58,40 +35,52 +28,43 +16,50 +8,42 +61,10 +42,31 +67,16 +21,2 +54,70 +10,50 +26,55 +34,16 +34,8 +12,6 +32,45 +26,6 +56,68 +69,24 +42,9 +45,40 +48,8 +64,14 +30,62 +13,42 +46,4 +16,25 +48,31 +46,58 +40,40 +46,68 +48,20 +56,4 +8,40 +10,14 +20,31 +61,20 +34,24 +68,68 +14,18 +1,46 +62,65 +46,55 +18,55 +24,66 +48,10 +16,38 +11,14 +21,22 +22,38 +28,22 +2,24 +15,66 +22,50 +19,28 +68,51 +58,25 +14,15 +64,56 +46,48 +38,67 +56,9 +12,62 +43,24 +36,10 +60,0 +2,10 +28,60 +53,44 +18,39 +28,42 +6,10 +68,44 +18,49 +68,32 +27,66 +0,44 +4,10 +29,68 +40,9 +61,44 +24,32 +9,70 +10,69 +8,56 +65,14 +25,48 +0,33 +3,32 +42,57 +40,15 +60,21 +22,69 +21,10 +20,36 +64,51 +12,1 +40,46 +48,6 +22,44 +8,24 +18,12 +54,4 +54,10 +22,39 +34,62 +64,40 +18,52 +0,25 +0,57 +38,55 +64,45 +0,35 +36,55 +0,41 +45,10 +64,16 +24,58 +56,58 +64,42 +12,46 +22,10 +38,52 +20,56 +54,41 +62,53 +4,60 +64,12 +10,7 +59,32 +20,2 +32,14 +42,50 +56,1 +50,49 +4,39 +7,24 +38,3 +69,68 +66,4 +67,32 +42,21 +4,53 +35,44 +20,53 +68,18 +0,65 +38,63 +70,53 +64,54 +35,4 +54,65 +53,0 +58,70 +63,52 +20,50 +32,16 +32,54 +47,36 +50,61 +34,27 +65,56 +65,0 +50,39 +16,10 +22,70 +10,36 +32,66 +38,8 +37,0 +4,14 +28,49 +4,12 +48,67 +59,70 +42,48 +28,56 +2,31 +64,24 +7,70 +43,18 +2,12 +10,32 +62,44 +26,70 +30,68 +4,46 +58,50 +49,58 +45,50 +8,59 +41,0 +10,24 +18,60 +60,54 +0,69 +26,5 +56,18 +60,15 +10,58 +5,12 +0,9 +22,34 +14,51 +3,60 +18,70 +69,50 +64,48 +69,10 +4,42 +8,38 +40,22 +30,60 +15,0 +28,3 +27,40 +56,70 +5,30 +42,26 +2,28 +39,8 +34,60 +34,26 +34,49 +4,29 +34,36 +33,52 +40,32 +54,8 +3,46 +10,68 +42,70 +8,26 +34,66 +15,8 +21,44 +5,26 +44,40 +50,31 +40,4 +68,10 +43,54 +4,62 +52,66 +16,22 +32,32 +62,0 +6,46 +28,23 +42,52 +53,26 +10,25 +42,54 +56,67 +60,26 +19,34 +60,30 +46,37 +10,56 +12,10 +66,25 +60,69 +19,46 +23,16 \ No newline at end of file diff --git a/2024/gareth/day19/day19.go b/2024/gareth/day19/day19.go new file mode 100644 index 0000000..cf151af --- /dev/null +++ b/2024/gareth/day19/day19.go @@ -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 +} diff --git a/2024/gareth/day19/day19_test.go b/2024/gareth/day19/day19_test.go new file mode 100644 index 0000000..cb0ed02 --- /dev/null +++ b/2024/gareth/day19/day19_test.go @@ -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) +} diff --git a/2024/gareth/day19/input.txt b/2024/gareth/day19/input.txt new file mode 100644 index 0000000..9547196 --- /dev/null +++ b/2024/gareth/day19/input.txt @@ -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 \ No newline at end of file diff --git a/2024/gareth/main.go b/2024/gareth/main.go index 99d93ff..9ef4db9 100644 --- a/2024/gareth/main.go +++ b/2024/gareth/main.go @@ -1,7 +1,7 @@ package main import ( - "aoc2024/day04" + "aoc2024/day09" "fmt" "os" "time" @@ -9,9 +9,11 @@ import ( func main() { start := time.Now() - data, _ := os.ReadFile("day04/input.txt") - fmt.Printf("part 1: %d\n", day04.Part1(string(data))) - fmt.Printf("part 2: %d\n", day04.Part2(string(data))) + data, _ := os.ReadFile("day09/input.txt") + 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 diff --git a/2024/go/day10/day10.go b/2024/go/day10/day10.go new file mode 100644 index 0000000..b52a587 --- /dev/null +++ b/2024/go/day10/day10.go @@ -0,0 +1,103 @@ +package day10 + +import ( + "adventofcode2024/utils" + "adventofcode2024/utils/grid2d" + "adventofcode2024/utils/inputs" + "fmt" +) + +type Position struct { + height int + summit bool +} + +func Part1(input string) int { + score := 0 + i := 0 + grid := inputs.ToGrid2D(input, "\n", "", Position{height: -1}, func(c string) Position { return Position{summit: false, height: utils.MustAtoi(c)} }) + fmt.Println(grid.StringWithFormatter(formatter)) + for y := 0; y < grid.SizeY(); y++ { + for x := 0; x < grid.SizeX(); x++ { + position := grid.Get(x, y) + if position.height != 0 { + continue + } + wipe_summit(grid) + score += getScore(x, y, 0, 0, grid) + fmt.Printf("Trailhead %d (%d,%d) paths: %d\n", i, x, y, score) + i++ + } + } + return score +} + +func Part2(input string) int { + score := 0 + i := 0 + grid := inputs.ToGrid2D(input, "\n", "", Position{height: -1}, func(c string) Position { return Position{summit: false, height: utils.MustAtoi(c)} }) + fmt.Println(grid.StringWithFormatter(formatter)) + for y := 0; y < grid.SizeY(); y++ { + for x := 0; x < grid.SizeX(); x++ { + position := grid.Get(x, y) + if position.height != 0 { + continue + } + wipe_summit(grid) + score += getScore2(x, y, 0, 0, grid) + fmt.Printf("Trailhead %d (%d,%d) paths: %d\n", i, x, y, score) + i++ + } + } + return score +} + +func formatter(p Position, x int, y int) string { + return fmt.Sprintf("%v", p.height) +} + +func wipe_summit(grid *grid2d.Grid[Position]) { + for y := 0; y < grid.SizeY(); y++ { + for x := 0; x < grid.SizeX(); x++ { + pos := grid.Get(x, y) + if pos.height == 9 && pos.summit { + pos.summit = false + grid.Set(x, y, pos) + } + } + } +} + +func getScore(x, y, level, score int, grid *grid2d.Grid[Position]) int { + directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}} + for _, dir := range directions { + x1 := x + dir[0] + y1 := y + dir[1] + nposition := grid.Get(x1, y1) + if level == 8 && nposition.height == 9 { + score++ + } + if nposition.height != level+1 { + continue + } + score = getScore(x1, y1, nposition.height, score, grid) + } + return score +} + +func getScore2(x, y, level, score int, grid *grid2d.Grid[Position]) int { + directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}} + for _, dir := range directions { + x1 := x + dir[0] + y1 := y + dir[1] + nposition := grid.Get(x1, y1) + if level == 8 && nposition.height == 9 { + score++ + } + if nposition.height != level+1 { + continue + } + score = getScore2(x1, y1, nposition.height, score, grid) + } + return score +} diff --git a/2024/go/day10/day10_test.go b/2024/go/day10/day10_test.go new file mode 100644 index 0000000..5b8f7a2 --- /dev/null +++ b/2024/go/day10/day10_test.go @@ -0,0 +1,31 @@ +package day10 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`89010123 +78121874 +87430965 +96549874 +45678903 +32019012 +01329801 +10456732`) + require.Equal(t, 36, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`89010123 +78121874 +87430965 +96549874 +45678903 +32019012 +01329801 +10456732`) + require.Equal(t, 81, r) +} diff --git a/2024/go/day10/input.txt b/2024/go/day10/input.txt new file mode 100644 index 0000000..df5bfc9 --- /dev/null +++ b/2024/go/day10/input.txt @@ -0,0 +1,56 @@ +43217654309879876104563234589896761012345656543098901001 +34108903212368123233472105676787851299856567832187812652 +45677814301457014312986345589876940387765678943046543743 +56789325100876525800345276430105432456566589858956769821 +65438456912963436901236187621234501223455410767349874430 +74321067803451107898547093412012982016764323101210143561 +89412210987430210789698892102123673107895214589723652678 +78601521856521345678721743089034543212345605679854781789 +66789430545678934505430654898745672212236765434765690878 +55676545038943213216765989601654981300129870121012345969 +46543216127657804389834808762347690456789983498141456452 +65454307233456934870126712354878765565210012507230987321 +54567898332110125961015645403969234674323215616546576010 +65658983021001876854324106912452128789321308723455678901 +76543212137892965348933217832141089873410419678964987652 +89862901236543501267018363101033210565566566569873788543 +89871876544345652106529854892123521454479877654012699830 +78100703454278743212434763763014672343287778943210581021 +65210212565189858906763212654985785650198961212101432010 +54321056876012567875898708783476698763267890303215678321 +87012567988703489874345679692676543294986725456574329478 +96543498589876530365210189501987650187675216987687610569 +01234567651010921234501076401236501010564307678596789876 +10389830532329854376542345321545692323403018789455430965 +21456721013456765289031234980098783410912129670320121054 +92505432565421010109120345671107654567823451061210120123 +87615443478302341018750134543234541050765962552121234984 +34322342189219650129665234789432132021894873443010965673 +45451056077828743234574343276543032134703210523457876532 +51069987456943104545987650167898749865612309610765454101 +32678678345652210698092156756547056764303458779890363232 +43010589232781306787183045876532178965210569888211274321 +56923432101090458989254234923421369878934678898302989430 +87889211078764567876360143010030450767125986567401276589 +96676305669653478985478652102141341458076803456564345676 +45435434734522780340349760123456232349883712678178737894 +80127821821011091211299854354987101016792103549069016323 +92346940910329654304587121267807652345013401232108925412 +81055432101458765643671010871018947654324589543987432101 +76567789023467010782532346965425638945695678654986540012 +05498654110567821891047897212334721032786014345678901098 +12387013223489932346156598101549889821012823216765212387 +03456323016576542345692367210678710701296954907854323456 +12345465437895431016781450123467623654387867878985401501 +21089870124326528701670101874345634565676541045621032012 +32189210065017019632543210965236730120545632456734548743 +43498349876298903545450143050159821321234012349895699654 +34567658389101232123469052101567634489234510106786789985 +99876501276788943016578769872498105672105621215021058876 +87035432365897654107689898763343234321678789334134567655 +70129641034781089898791099854232145690569245493254321567 +63238701123654178718982387763156056781410126787655010498 +54345652321073265001073456012047189872328901098546710327 +34568543434589874132569895145438976987437812361239891210 +21879654898678013203456701236327805456546521450967890123 +30968745467654320112345210987610112345545430567856543234 diff --git a/2024/go/day11/day11.go b/2024/go/day11/day11.go new file mode 100644 index 0000000..c040fb0 --- /dev/null +++ b/2024/go/day11/day11.go @@ -0,0 +1,76 @@ +package day11 + +import ( + "adventofcode2024/utils" + "fmt" + "strconv" + "strings" +) + +func Part1(input string) int { + stones := strings.Fields(input) + for i := 0; i < 25; i++ { + n_stones := []string{} + for _, stone := range stones { + switch { + case stone == "0": + n_stones = append(n_stones, "1") + case len(stone)%2 == 0: + d1 := strconv.Itoa(utils.MustAtoi(stone[0 : len(stone)/2])) + d2 := strconv.Itoa(utils.MustAtoi(stone[len(stone)/2:])) + n_stones = append(n_stones, d1) + n_stones = append(n_stones, d2) + + default: + n_stones = append(n_stones, fmt.Sprintf("%d", utils.MustAtoi(stone)*2024)) + } + } + stones = n_stones + } + return len(stones) +} + +func Part2(input string) int { + stones := strings.Fields(input) + smap := make(map[string]int) + smap2 := make(map[string]int) + + for _, stone := range stones { + smap[stone] = 1 + } + for i:=0;i<75;i++ { + for k, v := range smap { + switch { + case k == "0": + smap2["1"] = smap2["1"] + v + case len(k)%2 == 0: + d1 := strconv.Itoa(utils.MustAtoi(k[0 : len(k)/2])) + d2 := strconv.Itoa(utils.MustAtoi(k[len(k)/2:])) + smap2[d1] += v + smap2[d2] += v + default: + k2 := fmt.Sprintf("%d", utils.MustAtoi(k)*2024) + smap2[k2] += v + } + } + smap = CopyMap(smap2) + smap2 = make(map[string]int) + } + count := 0 + for _, v := range smap { + count += v + } + return count +} + +func CopyMap(original map[string]int) map[string]int { + // Create a new map to hold the copy + copied := make(map[string]int) + + // Copy each key-value pair from the original map to the new map + for key, value := range original { + copied[key] = value + } + + return copied +} diff --git a/2024/go/day11/day11_test.go b/2024/go/day11/day11_test.go new file mode 100644 index 0000000..ed2a8c3 --- /dev/null +++ b/2024/go/day11/day11_test.go @@ -0,0 +1,17 @@ +package day11 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1("125 17") + require.Equal(t, 55312, r) +} + +func TestPart2(t *testing.T) { + r := Part2("125 17") + require.Equal(t, 55312, r) +} diff --git a/2024/go/day11/input.txt b/2024/go/day11/input.txt new file mode 100644 index 0000000..c42d5d7 --- /dev/null +++ b/2024/go/day11/input.txt @@ -0,0 +1 @@ +3 386358 86195 85 1267 3752457 0 741 diff --git a/2024/go/day12/day12.go b/2024/go/day12/day12.go new file mode 100644 index 0000000..447d522 --- /dev/null +++ b/2024/go/day12/day12.go @@ -0,0 +1,146 @@ +package day12 + +import ( + "adventofcode2024/utils/grid2d" + "adventofcode2024/utils/inputs" + "fmt" + +) + +type Plot struct { + crop string + visited bool + region int + x int + y int +} + +type Region struct { + plots []Plot + crop string + id int + area int + perimteter int + sides int +} + +func Part1(input string) int { + var val int + region_id := 0 + regions := make(map[int]Region) + grid := inputs.ToGrid2D(input, "\n", "", Plot{}, func(c string) Plot { return Plot{crop: c, region: -1} }) + fmt.Println(grid.StringWithFormatter(formatter)) + for y := 0; y < grid.SizeY(); y++ { + for x := 0; x < grid.SizeX(); x++ { + var region Region + plot := grid.Get(x, y) + if plot.visited { + continue + } + + region_id++ + region = Region{id: region_id, area: 1, crop: plot.crop, sides: 4} + plot.region = region_id + plot.visited = true + plot.x = x + plot.y = y + grid.Set(x, y, plot) + region.plots = append(region.plots, plot) + regions[region_id] = region + + try_neighours(grid, ®ion, x, y) + regions[region.id] = region + } + } + for _, region := range regions { + val += region.area * region.perimteter + } + return val +} + +func Part2(input string) int { + var val int + region_id := 0 + regions := make(map[int]Region) + grid := inputs.ToGrid2D(input, "\n", "", Plot{}, func(c string) Plot { return Plot{crop: c, region: -1} }) + fmt.Println(grid.StringWithFormatter(formatter)) + for y := 0; y < grid.SizeY(); y++ { + for x := 0; x < grid.SizeX(); x++ { + var region Region + plot := grid.Get(x, y) + if plot.visited { + continue + } + + region_id++ + region = Region{id: region_id, area: 1, crop: plot.crop} + plot.region = region_id + plot.visited = true + plot.x = x + plot.y = y + grid.Set(x, y, plot) + region.plots = append(region.plots, plot) + regions[region_id] = region + + try_neighours(grid, ®ion, x, y) + regions[region.id] = region + } + } + for _, region := range regions { + val += region.area * get_sides(grid, region) + } + return val +} + +func formatter(p Plot, x int, y int) string { + return fmt.Sprintf("%v", p.crop) +} + +func try_neighours(grid *grid2d.Grid[Plot], region *Region, x int, y int) { + + directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}} + plot := grid.Get(x, y) + perimeters := 0 + + for _, dir := range directions { + x1 := x + dir[0] + y1 := y + dir[1] + nplot := grid.Get(x1, y1) + + if nplot.crop == plot.crop { + if !nplot.visited { + region.area++ + nplot.visited = true + nplot.region = plot.region + nplot.x = x1 + nplot.y = y1 + grid.Set(x1, y1, nplot) + region.plots = append(region.plots, nplot) + try_neighours(grid, region, x1, y1) + } + } else { + perimeters++ + } + } +} + +func get_sides(grid *grid2d.Grid[Plot], region Region) int { + sides := 0 + corners := [][][]int{{{-1, 0}, {0, -1}, {-1, -1}}, + {{+1, 0}, {0, -1}, {+1, -1}}, + {{-1, 0}, {0, +1}, {-1, +1}}, + {{+1, 0}, {0, +1}, {+1, +1}}} + for _, plot := range region.plots { + for _, o_corners := range corners { + c1 := grid.Get(plot.x + o_corners[0][0], plot.y + o_corners[0][1]) + c2 := grid.Get(plot.x + o_corners[1][0], plot.y + o_corners[1][1]) + c3 := grid.Get(plot.x + o_corners[2][0], plot.y + o_corners[2][1]) + if c1.crop != region.crop && c2.crop != region.crop { + sides++ + } else if c1.crop == region.crop && c2.crop == region.crop && c3.crop != region.crop { + sides++ + } + } + } + return sides +} \ No newline at end of file diff --git a/2024/go/day12/day12_test.go b/2024/go/day12/day12_test.go new file mode 100644 index 0000000..1602d7c --- /dev/null +++ b/2024/go/day12/day12_test.go @@ -0,0 +1,29 @@ +package day12 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`RRRRIICCFF +RRRRIICCCF +VVRRRCCFFF +VVRCCCJFFF +VVVVCJJCFE +VVIVCCJJEE +VVIIICJJEE +MIIIIIJJEE +MIIISIJEEE +MMMISSJEEE`) + require.Equal(t, 1930, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`AAAA +BBCD +BBCC +EEEC`) + require.Equal(t, 80, r) +} diff --git a/2024/go/day12/input.txt b/2024/go/day12/input.txt new file mode 100644 index 0000000..d0b3daa --- /dev/null +++ b/2024/go/day12/input.txt @@ -0,0 +1,140 @@ +UUUUUUUUUUUUUUUUUUUDQQQQQQQOOOOOHHSSSSSYYYYYYYYGGGGNNNNNNNNTTTTTTTTTTTTTTDDDDDDDDDDDDDDDDDDNNNCCNJJJJOOHHHDDDDDDDDDDDDDDDDDDXXMBBBBMMCCCCCCC +UUUKUUUUUUUUUUUUUDDDDDDDQQQOOOOOOOOOSSSSSYYYYYYYYGGGGGNNNNTTTTTTTTTTTTTTTTTTTTDDDDDDIIDDDNNNNNCCNJJJOOOHDDDDDDDDDDXDDDDDDDMMMXMMMMMMMMCCCCCC +UUUKKUUUUUUWUUUUUUDDDDDDDDDROOOOOOOWWSSSSYYYYYYYGGGGGGGQNTTTTTTTTTTTTTTTTTTTTTDDDDDDDIDIINNNNLNNNNOOOOODDDDDDDDDDXXDDDDDDDMMMMMMMMMMMMCCCCCC +UUKKUUKKXUUUUUUUUDDDDDDDDDDDDOOOOOOOOYSSSSSYYYYYGGGGGGQQNNTTTTTTTTTTTTTTTTTTTTDDDDDIDIIIINNNNNNNNNNOOOODDDDDDDXDDXXDDDDDDDMMMMMMMMMMMMMMCCCC +UUKKUKKKXXUQQQQUUDDDDDDDDDDDDOOOOOOOOYYYYYYYYYYYGGGGGQQIINTTTTITTTTTTTTTTTTTTTTDDDIIIIIIIINNNNNNNNNOOODDDDDDDDXXXXXXDDDDDMMMMMMMMMMMMFFFFCCC +UKKKKKKKXKAWWWWWDDDDDDDDDDDDDOOOOUUOYYYYYYYYYYYYGGGGQQQQIIDITIIIITTTTTTTTTTTTTDDDDIIIIIIINNNNNNNNLLLLODDDDDDXXXXXXXXDXDDDMMMMMMMMMMMMFFFFCCC +KKKKKKKKKKKWWWWKDPPDDDDDDDWWWOOOOOUUYYYYYYYYYYYYYGRQQQQQIIIIIIIIITTTTTTTTTTTDDDDDDIIIIIIIIINNNNNNNLLLLLDDDDDXXXXXXXXXXDDDDDMMMMMMMMMMFFFCCCC +KKKKKKKKKKWWWWWWDDDDDDDDDSWWWOWOOOOUYYAYYYYYYYYYYYQQQQQIIIIIIIIOIITTTTTTTTTTDDDDIIIIIIIIIIINNNNNLNNNLLLDDDDDDXXXXIXYDDDDDDDMMMMMMMMMMFFFCFCC +KKKKKKKKWWWWWWWWSSDSDDDDDSSWWWWOOOOUYYAYYYYYYYYYYQQQQQQIIIIIIIIIITTTTTTTTTTDDDIIIIIIIIIIIINNNNNNLLLLLLLDDDDDDXXXXIXYDDDQDDDMMMMMMMUMFFFFFFFC +KKKKKKKWWWWWWWWWSSSSDSDSSSSWWWWWOOOUYYYYYYYYYYYYYYQQQQIIIIIIIIIIIIIXXXXXTTTTDIIIIIIIIIIIKINNLNNNLLLLZLLLLDDVDXXXXXYYDDQQDDTMMYYYMMUUUFFFFFCC +KKKKKKKKWWWWWWWWWWSSSSSSSSSSWWWWWWOUYPPPPPYYYYYYQQPQQQQAIIIIIIIIISSXXXXXXXTTDIIIIIIIIIIIIIIILLLLLLLLZZLLLDDDXXXXXXXYYDXXXYMMMYYYYMPUUFFFFFFC +KKKKKKKKWWWWWWWWWWBBBBSSSSSWWWWWWWSSPPPPWWWWWWAYPPPPQAAAAITTIIIIIXXXXXXXUTTXXXIIIIIIIIIIIIIOLLLLLLLLZZLLLLLLLLXXXXYYXXXXXXXXRPPPPPPPPPFFCCFC +KKKKKKDWWWWWWWWWWWDDBBBSSSSWWWWWWWWSSPPPPWWWWWWWPPPPPAAAAIIIIIIIIXXXXXXXXXDXXIIIIIIIIIIIIIIOLLLLLLLZZZZZZLLLLNXNNXNYYYXXXXXXPPPPPPPPPPFFCCCC +KKKKKKWWWWWWWWWWWWBBBBBBBSSSWWWWWWWSSSSPPWWWWWWWPPPPPAAAAAAIIIIIIIXXUUUUUUXXXXIIIIIIIIIIIIIILLLLLLLZZZZZZZLLLNNNNNNYYYXXXXXXPPPPPPPPPPCFCCCC +KTKQQKWWWWWWWWWWBWBBBBBBBSBSWWWWWSSSSSPPPWWWWWWWWPPPPPPAAFAIIYYYUUUUUUUUUUUXXXQQQIIIXXXXXXXXXXLLLLLZZZZZZZZZLNNNNNNYYXXXXXXXPPPPPPPPPPCCCCCC +QQKAQQWWWWWWWWWWBWBBBBBBBBBSWWWSSSSSSSSPPWWWWWWWPPPPPPPPPPYYYYYYUUUUUUUUUUUQXQQQQQQIXXXXXXXXXXLZLLEZZZZZZZZZLNNPNNNYYXXXXXPXPPPPPPPPPPPCCCCC +QQQQQQQWWWWWWWWWBBBBBBBBBBVWWWDDSSSSSSSSSPWWWPPPPPPPPPPPPPYYYYYYUUUUUUUUUUUUUUUUQQIIXXXXXXXXXXLZZZZZZZZZZZZLLUUUUUUUUXXXXXPPPPPPPPPPPPCCCCCC +QQQQQQQQWWWWWWWWBBBBMMMBBBMWWWDSSSSSSSSSSPPPPPPPPPPPPPPPYYYYYYYBYYXXXXXUUUUUUUUUOIIIIZZZZZLLLZZZZZZZZZZZZZZZZIIIIUUUUUXPPXPPPPPPPPPPYYCCCCCC +QQQQQQQQQWWZZZWMMMMMMMMMBMMWWDDSSSSSSSSSSSPPPPPPPPPPPPPPYYYYYYYYYXXXXXXUUUUUUUUUOOIIIZZZZLLLLLZZZZZFFFFFFFFFHHHIUUUUUPPPPPPPYPPYPPPYYYCCCCCC +QQQQQQLQQQWWZZZMMMMMMMMMMMHHWSSSSSSSSSSSPPPPPPPPPPPPPPYYYYYYYYYYXXXXXXXUUUUUUUUUOIIIIIZLLLLLLZZZZZZFFFFFFFFFHHHIUMUUUPPPPPPPYYYYYYYYYYYCCCYC +QQQQQLLQLLZZZZMMMMMMMMMMMMMMWSSSSSSSSSSSPPPPPPPPPBYPPPYYYYYYYYYYYYXXXXXUUUUUUUUUIIIIIIIILLZZZZZZZZZFFFFFFFFFHHFFFFQUULLPPPPPQYYYYYRYYYYYYYYY +QQQLLLLLLLLZZZMMMMMMMMMMMMMMNMSSSSSSSSSSVVPPPPPPBBYYYYYYYYYYYYYYYYYXXXXUUUUUUUUUOIIIIILLLLZZZZZZZZZFFFFFFFFFFFFFFFFUUMMPPPPPYYYYYYYYYYYYYYAA +QQQLLLLLLLLZZZZMMMMMMMMMMMMMMMSSSSSSSSSSVVPPPBBBBBBYYYGGGGGGGGGYYYYYYYYUUUUUUUUUIIIIILLLLZZZZZZZZZZFFFFFFFFFFFFFFFFMMMOPPPPGYYYYYYYYYYYYYYYA +QQLLLLLLLLZZZZMMMMMMMMMMMMMMMSSSSSSSSRRSVVVVVVBBBBBYYYGGGGGGGGGYYYYYYYXUUUUUUUUUIIIIILLLLLZZZZZZZZZZZHHZZHHFFFFFFFFMMMMMPPPYYYYYYYYYYYYYYYYY +QQLLLLLLLLLZZZMMMMMMMMMMMMMMMSSSSSSRRRRSVVVVVBBBBBBBYYGGGGGGGGGYYYYYYEEUUUUUUUUUIIIIILLLLLBZZZZZZZZZZHHHHHHFFFFFFFFMMMMMMPIIYYYYYYYYYYYYYYYY +QQQLLLLLLZZZZZZMMMMMMMMMMMMMFSSSSSSRRRRRRVVVVVVVVBBYGGGGGGGGGGGYYXYYYEEEEEEEEEEEIEIILLLLLLZZZZZZZZZZZZHHHHHFFFFFFFFMMMMMMPPIIYYYYYYYYYUUYYYU +QQQQQQGLLLLPPPMMMMMMMMMMMMMMMSRSSSRRRRRRVVVVVVVVBBBQGGGGGGGGGGGGGGYXXXEEEEEEEEEEEEELLLLLHZZZZZZZZZZZXZHHHHHFFFFFFFFMMMMIIIIIYYYYYYYYYYUUUUYU +QQQQQQQQQLKPPPPIIMMMMMMMMMUUUURRSRRRURRRVVVVVVVVVBQQGGGGGGGGGGGGGGXXXXXEEEEEEEEEJEELLLHHHHHHHHHZZDDZZZHHHHHFFFFFFFFQMMMQQIIIIYUUUUYYYYUUUUUU +JJQQQTQQQKKKPPPPPQQMUUMUUUUUURRRSRUUURRRUUUVVVUVVVQQGGGGGGGGGGGGGGXXXXXEEEEEEEEEJJJLLHHTTHHHHHHYYYDDDZHHHHHFFFFFFFFQMMMQQQQQUUUUUUUUUUUUUUUU +JJJJQTTQKKKPPPPPPQQQUUUUUUUCURRRRRRUUURRUUUVUUUUVVQQGGGGGGGGGGGGGGXXXXZEEEEEEEEEJJJJJHTTTTHHHHHHYDDDDHHHHHHMMQQQHQQQQMQQQQQUUUUUUUUUUUUUUUUU +JJJJJTTTPKKPPPPPPPQUUUUUUUUUUURRRRRRUUUUUUUVUUUUUVVQGGGGGGGGGGGGGGXXXXZEZZZZEEEJJJJJTTTTTTTTHHHHYYYMMHHHMHHMMMQQQQQQQQQQQQQUUUUUUUUUUUVUUUUU +JJJJJTTPPPPPPPPPPPPUUUUUUUUUURRRRRRUUUUUUUUUUUUUUVVUGGGGGGGGGGGGGGXXRRZZZZZZEEDDDJJTTTTTTTTHHHHHYMMMMHMHMMMMMMMQLLLQLQQQQQQUUUUUUUUUVUVVUUUU +JJJJJJJPPPPPPPPPPPUUUUUUUUUUURRRRPRRRUUUUUUUUUUUUVVUGGGGGGGGGGGGGGZRRRRRRRDDDDDDDJJJZTTTTTTTHHYYYYMMMMMHHMMMMMLLLLLLLLQQSQQSSUUUUBBBVVVVVUUU +JJJJJBBPPPPPPPPPPPUUUUUUUUUUUURRRPPCCUUUUUUUUUUUUUUUGGGGGGGGGGGGZZRRRRRRRBDDDDDDDJJJTTTTTTTTYHYYYYYYUMMMHMMMMLLLLLLLLLLLSSSSUUUUBVVVVVVZVUUU +JJJJBBBBPPPPPPPPPPUUUUUUUUUUUURRPPPCCGUUUUUUUUUUUUUUUGGGGGGGGGGGZZZRRRRRRRYDDDDDDJJTTTTTTTTTYYYYYYYYYMMMMMMMMMMMLLLLLLLSSSSSSUUUBVVVVVVVVVUU +JJJJBBBBPPPPPPPPPPUUUUUUUUUUUURUPPPCCCCCCUUUUUUUUUUUUGGGGGGGGGGGZZZRRRRRRRRRRRRDDDJTTTTTTTTYYYYYYYYYMMMMMMMMMMMLLLLLLLLSSSSSSSSSEEEEVVVVVVVU +JJJJBBBBQQQPPPPPPPUUUUUUUUUUUUUUPPCCCCCCCUUUUUUUUUUUUGGGGGGGGGGGZZZRRRRRRRRRRRRDDDTTTTTTTTTTYYYYYYYOYMMMMMMMMMMMMMLLLLLLSSSSSSEEUEEEVEEVQQVQ +JJJJJBBBBQQQPPPPUUUUUUUUUUUUUUPPPPCCCCCCCCCFFUUUUUUUQGGGGGGEEKKKKZZRRRRRRRRRDDDDHDTTTTTTTTTTTTYYYYYYYMMMMMMMMMMMMMMMSSSSSSSSSSEEEEEEEEQQQQQQ +JJJJBBBBBQQQQQPPUHHWUUUUUUUUUUPPPPCCCCCCCCCFFUUEUUMUQGGGGGGEEEKKKZRRRRRRRRRRRHDDHDDDTTBTTTTTTTYYYYYYYYMMMMMMMMMMMMSSSSSSSSSSSEEEEEEEEEEQQQQQ +JJHBBBBBQQQQQPPPPHHWWUUUUUUUUPPPPPCCCCCCCCCCAUUEUUUUQGGGGGGEKKKKPRRRRRRRRRRRRHHHHHDTTTTTNTTTTTTTXYYAAYYMMMMMMMMMMMGGSGGGOOOSOOOEEEEEEEEEQQQQ +JHHHBBBBQQQQQPPPPHHWWUUUWWWUPPPPPPPPCCCCCCAAAAAEEEUUUGGGGGGCKKKKKKKRRRRRRRRRRHHHHHDTWWTTNNNTTTXXXYAAAAMMMMMMMMMMMGGGGGGJOOOOOOEEEEEEEEEEQQQE +HHHHBBBUQQQQQPPPPWHWWWUWWWWUPPPPPPPPPPCCCCAAAAAEEEEEEGGGGGGCKKKKKKKRRRRRRRRRGGHHHHHHWWNNNNNNTXXXXXXAAAAAMMMMMMMMGGGGGGJJOOOOOOEEEEEEEEEEEQEE +HHHHHBBBBQQQPPPPWWWWWWWWWWWWWPPPPPPPPPCCCAAAAAEEEEEECCCCCCCCKKKUKKRRRRRRRRRRRGHHHHHWWDDDNNNNTTXNNNNVAAAAAMWMMMMMGGGGGGJJOOOODEEEEEEEEEEEEEEE +HHHHHHHHUQQUPPPPWWBWWWWWWWWWWPPPPPPPPPCCAAAAAAAEEEEECCCCCCCCCKKKKRRRRRRRREKKKKKDHHHWDDDDNNNNNNNNNNNNNAAAAAMMMMPMMEGGGEOOOOOOEEEEEEEEEEEEEEEE +HHHHUHHHUQQUUPPPSUUWWWWWWWWWWPPPPPPPPPPCJPBAATTTTTEEEERRCCCCRRKKKKRRRRRRRRKKKKKKNHHWDDDDDNNNNNNNNFFNNAAAAAAAAMPMEEGGGEOOOOOOVVVEEEEEEEEEEEEE +HHHHUUUUUUUUUUVVUUWWWWWWWWWWWPPPPPPPPPPPPPAATTTTTTEEEERRUCCCCRKKKKKKRRRKKKKKKDDJDDDWDDDDDNNNNNNNNNNNAAAAAAAAAMMAEEEGGEEOOOOOOVVSESSSSEEEEEEE +HHHHHUUUUUUUUUUUUUWWWWWWWWWWWPPPPPLTTPPPPPPTTTTTTTTTEERRRCCCCRRKKKKKRRKKKKKKKDDDDDDDDDDDDDDNNNNNNNNNAAAAAAAAMMAAEEEEGEEEEEOOVVSSSSSSSEEEEEEE +HHHHHHHHHUUUUUUUUUWWWWWWWWWWLLLLLLLTTPPPPPPTTTTTTTTTEERRPCERRRRRKKKKKKKKKKKMKLDDDEDDDBBBBBBBNNNNNNNNNAAAAAAAAAAAAAEEEEEEEEOOVVSSSSSSSSSSEGGE +HHHHHHHUUUUUUUUUXUWWWWWWWWWWLLLLLLLTTTPPPTTTTTTTTTTTERRRRRRRRRRRRKKKKKKKKMKMLLLDDDDDDBBBBBBBNNNNNNANAAAAAAAAAAAAAAEEEEEEEEEESSFSSSSSSSSSESGG +HHHHHHHUUUUUUUUXXXXWWWWWWLLLLLLLLLTTTTTTTTQTTTTTTTTTTRRRRRRRRRRRKKMMKKKKKMMMMMLLDDDDDBBBBBBBNNNNNNNAAAAAAAAAAAAAAAKKEEEEEEEESSSSSSSSSSSSSSGG +HHHHHUUUUUUUUUUXXXXXWWWXLLLLLLLLLLTTTTTQQQQTTTTTTTTTTTRRRRRRRRRRRKMMMKKKKMMMMMMDDDDDDBBBBBBBNNNNNNNNNAAAAAAAAAKKKKKKEEEEEEEEESSSSSSSSSQSNQGG +HHHKKUUUUKUUUWWXXXXXXXXXLLLLLLLLLLQQQTTQQHQTQQQTTTTTTRRRRRRRRRRRRMMMMKKKKMMMMMMDDDDDDBBBBBBBDNNNNNNNBBBBBBBAAAAKKKKKKKEEEEEEEESSSSSSSSQQQQGG +HHHHKKLKAKKUWWWXXXXXXXXXLLLLLLLLLLQQQTTQQHQQQQTTTTTTTRRRRRRRRRRRRMMMMMKMMMMMMMMQQDDDDBBBBBBBNNNNNNNNBBBBBBBAAAAKKKKKKEEEEEEEESSSSSSSSSQGQQGG +HHHHHKKKKKKUWWWWWXXXXXXXXLLLLLLLLLQVQQQQQQQQQQQTTTTTRRRRRRRRRRRNNMMMMMMMMMMMMMMQQZDDDBBBBBBBBBBBBBNABBBBBBBAAAAKKKKKKEEEEEENEESSSSSSQSQQQQGQ +HHHHKKKKKKKRWWWWWWXXXXXXXLLLLLLIILIQQQQQQQQQQQQQTTTTRRRRRRRRRRRNMMMMMMMMMMMMMMMQQZDDDBBBBBBBBBBBBBBBBBBBBBBAAAAKKKKKKEEEENNNNSSSSSSSQQQQQQQQ +HMHHKKKKKKKRWWWWWXXXXXXXXLLLLLLIIIIQQQQQQQQQQQQQTTTRRRGRRRRRRRRNMMMMMMMMMMMMMMZQZZDDDBBBBBBBBBBBBBBBBBBBBBBAAAAAAKKKKEEENNNNNSSSNSSSQQQQQQQQ +MMKKKKKKKKKWWWWWWXXXXXXXXLLLLLLLLIIIQQQQQQQQQQQQQQTRRRRKKRRRRRNNMMMMMMMMMMMMBBZZZZZZDBBBBBBBBBBBBBBBBBBBBBBAAIIAKKKKKKKENNNNNNNSNSSUUQQQQQQQ +NMMMMKKKKKKWWWWWWWXXXXXLLLLLLLLLLLLIIQQQQQQQQQQQQEEERRIIKRRRRNNNMMMMMMMMMMMMMBZZZZZZZBBBBBBBBBBBBBBBBBBBBBBNIIIKKKKKKKKKKNNNNNNNNSUUQVQQQQQQ +MMMKKKKKKKKWWWWWWXXXXXXXXRRRRJXXXLIIQQAQQQQQQQQQQEEEEEIIIIINNNNNNMMMMMMMMMMMBBZZZZZZZDSSBBBBBBBBBBBBBBBNNNEEIIIKKKKKIKKNNNNNNNNNNNQQQQQQQQQQ +MFMIFFKKKKKKWWWWWWXXXXXXRRRRJJJXXQQQQQQQQQQQQQQQQEEEEEEEIINNNNNNNNNNMMMMMMMBBBBBZZZZZDZZBBBBBBBBBBBBBBBNNNIIIIIKKKIKIINNNNNNNNNNNQQQQQQQQQQQ +FFBIFFFKKKKKWWWWWWXXXXXXWWRRRJJXXXXQQQQQQQQQQQQQQEEEEEIIIINNNNNNNNNNNMMMMMMMBBBCBZZZZZZZBBBBBBBBBBBNNNNNNIIIIIIIIIIIIINNNNNNNNNNNNNQQQQQQQQQ +FFBBBFFFFKKKYWWWXXXXXXVWWWRRRJXXXXXXXQQQQIQQQUQQUUEUEEIIIIIIINNINNNNMMMMMBBBBBBBBBZZZZZZZZBBBBBBBBBIINNNNIIIIIIIIIIIIIIINNNNNNNNNNNNNHQQQQQQ +FBBBBFFFFFFFFWWWXXXXXXXWWWRWWXXXXXXDDPPPQQUUUUUQUUUUIIIIIIIIIIIINNNNMMMMMBBBBBBBBBZZZZZZZZBBBBBBBBBINNNNNIIIEIIIIIIIIIIIINNNNNWNNNNNNHQZQQQQ +BBBBBFFFFFFFEEEQXXXXXXXXWWWWWXWXXXXDDPPZZUUUUUUUUUUUIIIIIIIIIIIINNNNNNMBBBBBBBBBBBBZZZZZZZBBBBBBBBBIIIIEEEEEEIIIIIIIIIIIWWWWWUWWNWNNNNQZZDDD +BBBBBFFFFFEEEEEQXNNXXXWWWWWWWWWWXDDDDQQUUUUUUUUUUUHBIIIIIIIIIIIBNNNNNNBBBBBBBBBBBBZZZZZZZZBBBBBBBBBIIIIIEEEEEIIIIIIIIIIIWWWWUWWWWWNNNNNZDDDD +BBBBBBFFFFFEEEEEENNNNWWWWWXXXXXXXXXXDDDDDDDUUUUUUBBBIIIIIIIIIIIBNNNNNBBBBBBBBBBBBDBBZZZZZZBBBBBBBBBIIIIEEEEEEEEEIIIIIIIWWWWWWWWWWWNNNZZZDDDD +BBBBBBBEFFFEEEEEENENNNWWWWXXXXXXXXXXDDDDDDDDUUUUBBBBBIIIIIIIILBBBNBNNNNBBBBBBBBBBBBZZZZZZZBBBBBIIIIIIEEEEEEEEEEEIIIIIIIWWWWWWWWWWWZZZZZZDDDD +BBBBBBEEEYEEEEEELEEENNWWWWXXXXXXXXXXDDDDDDUUUUUUUBBBBIIIIIIIIIBBBBBBBBBBBBBBBBBBBBBBZZZZZZHHHUUUIIIIIENEEEEEEEEEIIIIMMMWWWWWWWWWWWZZZZZZZZDD +BBBBBBBEEEEEEEEEEEEENWWWWWXXXXXXXXXXDDDDDDDUUUUUUBBBBIIIIIEIIBBBBBBBTTBBBBBBBBBBBBBZZZZZZZHUUUUUUUIIEEEEEEEEEEEEEMMMMMMMWWWWXXXXXWZZIJZZZZDZ +BBBBBBBBBEEEEEEEEEEEELXXXXXXXXXXXXXXDDDDDDUUUUUUUBTUBIIIIIIIBBBBBBBBTBBBBBBBBBBBBBZZZZZZZZUUUUUUUUIIIELEEEEEEEEEEMMMLWWMWXXXXXXXXXZIIIIIZZDZ +BBBBBBBBBEEEEEEEEEEEEEXXXXXXXXXXXXXXDRRDZAUUUUUUUUUUUNNNNIMBBBBBBBBBBBBBBBBBBBBOOBZZZZZZZZZUUUUUUUUUEEEEEEEEEEEEEMMMLLWWWXXXXXXXXXZIIPIZZZZZ +BBBBBBBBBBEEEEEEEEEEEWXXXXXXXXXXXXXXDRRDAAAUUUUUUUUMMMNMNNMBBBBBBBBBBBRNBBBBBVNOZZZZZZZZUUUUUUUUUUUUUEEEEEEEELELLMMLLLWWWXXXXXXXXXZIIIIIIZZZ +BBBBBBLLLLLLEEEEEEEEEEXXXXXXXXXXXXXXWVVAAARAUUUUUUUMMMMMMMMBBBBBBBBBBBRNNBBNNNNOOZZZNNZUUUUUUUUUUUUUUUUEEEEEELLLLMLLLLWWWXXXXXXXXXZIIIIIIZZZ +BBBBBBLLLLLLEEEEEEEEEEXXXXXXXXXXXXXXWVVAAAAAAUUUUUUMMMMMMMMBBBBBBBBBBRRNNNNNNNNOONZZNNZUUUUUUUUUUUUUZEEEEEEEELLLLLLLLVWWWXXXXXXXXXIIIIIIIIIZ +BBBBBBLLLLLLLLXXEEEVEKXXXXXXXXXXXXXXWVVVVVVAAAAUUUUMMMMMMMMBBMBBBBBBBBRNNNNNNNNNNNNNNUUUUUUUUUUUUUUUEEEEEEEEELLLLLLLLLLLWXXXXXXXXXIIIJZZZZZZ +BBBBBBLLLLLLLGLLEEEEEKXXXXXZZZZZZZWWVVVVVVVVVUUUUUMMMMMMMMMMMMBBBBBBBBNNNNNNNNNNINNNNUUUUUUUUUUUUUUJEEEEEEEELLLLLLLLLLLWWXXXXXXXXXJJJJJJJZZZ +BBBBBBLLLLLLLLLLLLLLLLXXXXXXXXXXXXXWVVVVVVVVVUUUUUMMMMMMMMMMMMBBBBBBBBBNNNNNNNNNNNNNNUUUUUUUUUUUUVVICCELEEEELLLLLLLLLLDDWXXXXXXXXXWWJJJJZZZZ +BLLLLLLLOOOLLLLLLLLLLLXXXXXXXXXXXXXWVVVVVVVVVVURRUFRMMMMMMMMMBBBBBBBBNNNNNNVKKNNNNNNNNNNNUUUUIVVVVVICCCEEEEELLLLLLLLLDDDDXXXXXXXXXJJJJJJJZZZ +BLLLLLLLOOOLLLLLLLLLLLCZZZXXXXXXXXXZVVVVVVVVVVRRRRRRRRMMMMMMMIIIBBBBBBBBVVVVVKYNNNNNNNNNNNUIIIIVVVIIIIEEEEELLLLLLLLLLDDDDDDXXXJJJJJJJJJJJZZZ +BLLLLLLLOOOLLLLLLLLLLLLLZZXXXXXXXXXZVVVVVVVVVRRRRRRRRRRRTTTIIIIIIIBBBYYVFVVVVVYYNNNNNNNINNNIIIIVVIIIIEEEEEEEELVLLLLGLLDDDDDXXXJJJJJJJJJJJJJZ +LLLLLLLLOOOLLLLLLLLLLLLNZZXXXXXXXXXZVVVVVVVVRRRRRRRRRRRRRRRNIIIIIBBBBYYVVVVVYYYYYYNNNNNIIIBIIIIVIIIIIBEEEDDKELVVDLLLLDDDDDDDDDJJJJJJJJJJJJJZ +LLLLLLLLOOOLLLLLLLLLLALNZZXXXXXXXXXZVVVVVVVVKRRRRRRRRRRRRRRRRIIIIBBBBBYYYYVVYYYYYYNNNIIDIIIIIIIIIIIIIIDREDVDEVVVDLLDLDDDDDDDDJJJJJJJJJJJJJJJ +LLLLLLLLOOOLLLLBBBLLAAZZZZZZZZZZZZZMVVVVVVVRRRRRRRRRRRRRRXRRIIIIIIIIBYYYYYVVYYYYYYNNNIIIIIIIIIIIIIIIIIDDDDDDDVVDDDDDDDDDDDQDDDJJJJJJJJJJTJJC +LLLLLLLLOOOLLLBBBBLLLAAAAAMZZZZMZZMMMVVVVVVRCCCRRRRRRRRRRRRRIIIIIKKYYYYYYYYYYYYYYYYYNNIIIIIIIIIIIIIIIIDDDDDDDVDDDDDDDDDDDQQDDDJJJJJJJJJTTTJC +LLLLLLLLOOOLLLLBBBLQLAAAAAMMMZZMZMMMVVVVVVVRCCCCCRRRRRRIIIRRRIIIIKKYYYYYYYYYYYYYYYYYYIIIIIIIIIIIIIIISIDDDDDDDVVDDDDDDDDDQQQDQQGJJJJJJJJGGGCC +LLLLLLLLOOOLLLBBBBBBAAAAAAMMMMMMMMMMMVVVVVVCCCCCCRRRRRRIIIIIIIIIIIKYYYYYYYYYYYYYYYOOOIIIIIIIIIIIIIIIGIDDDDDDDDDDDDWWQQQQQQQQQQGJTJJWWWWGGGCC +LLLLLLLLOOOLLLBBBBBBAAAAAAAMMMMMMMMMXXVVVVVCCCCCCCEEERJJJIIIIIIIIKKKKYYYYYYYYYYIIIIIIIIIIIIIIIIIIIIGGGDDDDDDDDDDIWWGQQQQQQQQTTJJTTGGGGWGGGGC +TLLLLLLLLLLLLLBBBBBBBAAAAAAMMMMMMMMXXXVVXVVCCCCCCCEEEEAAAAAIIIIIIKKKKYYYYYYYYYYIIIIIIIGIIIIIIIIIIFGGGGDDDDDDDSDWWWGGQQQQQQQQTTTTTGGGGGGGGCCC +TLLLLLLLLLLLLLCBBBBBBBACAAAMMMMMMMMXXXXXXXCCCCCCCCEEECAUUUUUUIIIIKKKYYYYYYYYYIIIIIIIIIGIIIIIIFFFFFGGGGDDDDDDSSSSWWWGGQQQQQQQTTTTGGGGGGGGGCCC +ZLLLLLLEELLLLLBBBBBBBUCCCMMMMMMMMMMMXXXXXCCCCIIIIIIIIIIUUUUUUHIIKKKKYYYYYYYYYYGXIIIIIIGIIIIIIGGFFFGGGGGDDDDDSSSSSGGGGGQQQQQTTTTGGGGGGGGCCCCC +ZZLLLZZLLLLLLLBBBSBBBBBCMMMMMMMMMMXXXXXXXXCCCIIIIIIIIIIUUUUUUHIIIIKKJYYYYYYYYGGGIIIIIGGGGIIIQGGFGGGGGGGSSSSSSSSSSSSGGQQQQQTTQTTTTGGGGGGCCCCC +ZZZEZZZZZLLRLLCCKCBBCCCCMMMMMMMMMMMXXXXXXXCCCIIIIIIIIIIUUUUUUHHHIIKKJYYYGGAGGGGGGFGIWGGGGIIGGGGGSSSSSSSSSSSSSSSSSSGGGQQQQQQQQQTTGGGGGGGCCCCC +ZZZZZZZZZZLLLLSCCCCCCCCCCMNNMMMMMEEXXXXXXXXCCIIIIIIIIIIUUUUUUHQHHHJJJJJYGGGGGGGGGFGGGGGGGGGGGGGGSSSSSSSSSSSSSSSSSWWWGWQQQQQQQQQTGGGGGGCCCCCC +ZZZZZZZZSSLLLSSSCCCCCCCCMMNMMMMMMMMXXXXXXCCCTIIIIIIIIIIUUUUUUHQHHJJJJJJGGGGGGGGGGGGGGGGGGGGGGGGGSSSSSSSSSSSSSWWWWWWWWWQWQQQQWQTTGGGGGGGGCCCC +ZZZZZZZZSSSSSSSSSCCCCCMMMMMMMMMMMMMXXXXXXCXXCIIIIIIIIIIQQQQQQQQQAJJJJJJJJJGGGGGGGGGGGGGGGGGGGGGGGGGGGGGSSSSSSSSWWWWWWWWWWQWWWQQGGGGGGGGGCCCC +ZZZZZZZSSSSSSSSSSCCCCCMMMMMMMMMMMMMXXXXXXXXXXIIIIIIIIIIIIQQQQQQAAEAJJJJJJJGGGGGGGGGGGGGGGGGGGGGGGGGGDDDSSSSSSSSWWWWWWWWWWWWQQQQQGOGGGGGGCCQC +ZZZZZZZZSTTTSSSSSCCCCCCCMMMMMMMMMMXXXXXXXXXXXXXWWIIIWAIIIQQAPQQAAAAAJJJJGGGGGGMGGGGGGGGGGGGGGGGGGGGGDDDDSSSSSSSAWHWHWWWWWWWQQQQQGGGQQGGGGCQQ +ZZZZZZZZZTTTSSSTSSCCHCCMMMMMMEMMMAXXXXXXXXXXXXWWWIIIIIIIIIAAPPPAAAAAJJJMGGGGGGMMMGGGGGGGGGBBGGGEGGGGDDBDSSSSSSSHHHHHWWWWYWWQQQQQQQQQQQQGQQQQ +ZZZZZZZOZTTTTTTTTSCCHCHMMMEEEEEMAAXXXXXXXXXXXXWIIIIIIIIIIIAUAPAAAAAAJJJMGGGMMGMMMGGGGGGGGGGGGGEEGGGGSSSSSSSSSSSHHHHHWWWYYQQQQQQQQQQQQQQQQQQX +ZZZZZZZOZZTTTTTTTTTHHHHHMEEEEEEEEAAXXGXJXXXXXXWIIIIIIIIIIIAAAAAAAAAAAMMMMMMMMMMMGGGGGGGGGGGGGWEEEEEESSSSSSSSSSSHHHHHHHWHHHHQQQQQQQQQQQQQQQQQ +ZZZZZOOOTTTTTTTTTTTTTTEHEEEEEEEEAAXXXXXJXCXXXIIIIIIIIIIIIIAAAAAAAAAAMMMMMMMMMMMMGGGGGGGGGGGGGWEEEEEESSSSSSSSSSSHHHHHHHHHHHHQQQQQQQQQQQQQQQQQ +ZZZZZOOOTTTTTTTTTTTTTTEEEEEEEEEEEAXXAAAJACCCCIIIIIIIIIIIIIAAAAAAAAAAAAMMMMMMMMMMMMMGGGGGGGGGGEEEEEEESSSSSSSSSSSHHHHHHHHHHHHQKKQQQQQQQQQQQQQQ +OOOOOOOOOOTTTTTTTTTTTUUESSSSSSSEAAAAAAAAACCCCIIIIIIIIIIIIIFAAAAAAAAAAAMMMMMMMMMMMGGGGGGUGGGEGEEEEEEESSSSSSSSHHHHHHHHHHHHHHHHKKKKQQQQQQQQQQQQ +OOOOOOOOOOTTTTTTTTTTUUUESSSSSSSEAAAAAAAAACCCCIIIIIIIIIIIIIAAAAAAAAAAAMMMMMMMMMMMMMGGGGGGGEEEEEEEEEEESSSSSSSSXXHHHHHHHHHHHHHHKKKQQQQQQQQHQQQQ +OOOOOOOOOOOTTTTTTTTTCCCESSSSSSSZEAAAAAAAEEECCSIIIIIIIIIISSAAAAAAAAAAMMMMMMMMMMMMMMGGGGOOEEEEEEEEEEEESSSSSSSSXXXHHHHHHHHHQHHHHKNPPIQQQQQHQHHH +OOOOOOOOOOTTTTTTTTTTCCCCSSSSSSSEEEAAAACEEEESSSIIIIIIIIIISSAAAMMAAAAAMMMMMMMMMMMMMMXXGGJEEEEEEEEEEEXBSSSSSSSSXXXXHHHHHHHQQHHKKKNNPIIIQIIHHHHH +OOOYYYYYOOTTTTTTTTTTBCCCSSSSSSSEHHHAAAEEEEESSSIIIIIIIIIITGGAMMMAAAMMMMMMMMMMMMVVVMXXXJJJJEEEEEEEEEXXSSSSSSSSXXXXXHHHHHHHHHKKKKKNNIIIIIIHHHHH +OOYYYYYYOTTTTTTTTTUTCCCCSSSSSSSEHHHAAAEEEEEESSIIIIIIIIIITGGAMMMAAAAAMDMMMMMMMMVVXXXXXJJJJEEEEERRREXXSSSSSSSSXXXXXHHTHTKKHHKKKKKNNTIIIIIHHHHH +OOYYYYYYOYTTTTTTTCUCCCCCSSSSSSSYYHIIIIIEEEEESSIIIIIIIIIITTTTMMMMAAADDDDMMMMMMMVVVVXXXJJJJJEEEERRRXXXBBBXXXXXXXXXHHHTTTTKKKKKKKNNNTIIIIIIHHHH +YYYYYYYYYYTTTTTTTCCCCCCCSSSSSSSYYHIIIIIIEEEEESSSSSSSSSTTTTTJTYYYAADDDDDDVVMVVVVVVVJJJJJJJJEEEEERRXXXBBXXXXXXXXXXGGGTTTTTKKKNNNNNIIIIIIIIIHHH +YYYYYYYYYYYYTTTYYYCCCCCCSSSSSSSSSPIIIIIEEEEEESSSSSSSTSTTTTTTTTYYYADDDDDDVVVVVVVVVVJJJJJJJJEEEERRRXXXXXXXXXXXVXVVVVGTTTUTKNNNNNNNIIIIIIIIIHHH +YYYYYYYYIIYYYYYYYCCCCCCCCCSSSSSSSIIIIIIIEEEEEEESSSSSTTTTTTTTTTTYYYDDDDDDVVVVVVVVVVVVVJJJJJEEERRRRRRXXXXXXXXXVVVVVGGTTTTMNNNNNNNNIIIIIIIIIHHH +YYYYYYYYHHHHHHYYYYCCCCCCCCSSSSSSSIIIIIIEEEEESESSSSSSTJTTTTTTTTYYYYYDDDDDDVVVVVVVVVVJJJJJJJEEERRRRRRRRXXXXXXXVVVVVVVVATTNNNNNNNNNIIIIIIIIHHHH +YYYYYYYYYHHHHHHYYYCCCCCCCCSSSSSSSIIIIIGEEEEESSSSSSSSSYTTYTYYYYYYYYYDDDDDDDDVVVVVVVVJVVVVJEEERRRRRRRRRXRRXXXXVVVVVVVVAAAANNNNNNNNNIIIIIIIIHHH +YYYYYYYDYHHHHHYYYYCCCCCCCCSSSSSSSIIIGGGEEEEEESSSSSSSSYYYYYYYYYDDDYYYDDDDSDDDVVVVVVVVVVVVVEEERRRRRRRRRRRRXXXXVVVVVVVVAAAANNNNNNNNNNIIIIUUIIHH +YYYYYYYYHHHHHYYYYYCCCCCCCCSSSSSSSIIIIIIIPEEEEESSSSSYYYYYYYYYYYDDDDSSDSSSSVVVVVVVVVVVVVVVEEEERRRRRRRRRREEXXXVVNVVVVVVAAAANNNNNNNNNNIIIUUUUUHH +SYSSSSYYHHHHHHYYYYCCCYCHCCSSSSSSSSSSSIHPPEEEEEEESSSYYYYYYYYDDYDDDDSSSSSSSSSVVVVVVVVVVVMMMMMMKMRRRRRRRRTEXXXXTVVVVVVAAAAAANNNNNNNNNNUIUUUUUUH +SYSSSSYYHHHHHHYYYYYYCYIHHCSSSSSSSSSSSHHHHEEEEEESSSSAYYYYYYYDDDDDDDFSSSSSSSSSVVVVSVVMMMMMMMMMKMMRRRRRRTTEETTTTTTVVVAAAAAAANNNNNNNNNNUUUUUUUUU +SSSSSSSSSHHHHHYYYYYYYYYHHHHSSSSSSSSSSHHHHEEEEEEAASSSHYYYYYYDDDDDFFFSSSSSSSSSSVVVSVVMMMMMMMMMMMMRTRRRRTTTTTTTTTTVAAAAAAAAANNNNNNNNNNUUUUUUUMU +SSSSSSSHHHHHHHHHYYYYYYYYHHHSSSSHHIIIHHHHEEEEEAAAAASHHHHSYYYDDDFFFFSSSSSSSSSSSSSSSVVMMMMMMMMMMMAATRRRTTTTTTTTTTUVAAAAAAAANNNNNNNNNNNUUUUUUUUF +SSASSSSSSHHHNHHHZZJJYTYHHHHHHHHHHHIIHHHHHHEEEAAAAAAATHXXXYYADDFFFFSSRSSSSSSSSSSSVVVMMMMMMMMMMMAATTTTTTTTTTTTTTTAAAAAAAAAAUNNNNNUNUUUUUUUBBBF +SSASSSSSSHHHHJHZZJJJYYYHHHHHHHHHHHHHHHHHHHGEEAAAAAAAAXXXXYYAAAAAAAASASSSSSSSSSSSSSVVMMMMMMMMMAATTTTTTTTTTTTTTTAAAAAAAAAAUUNNUNUUUUUUUUUBBBBB +SAAAASSSSBHHVJHHJJJJYYHHHHHHHYYHHHHHHHHHHHGAAAAAAAAAAXXXXXYYAAAAAAAAAAASSSSSSSSSVVVMMMMMMMMMMAATTTTDTTTTTTTTTTTAAAAAAAAAUUUUUNUUUUUUUUBBBBBB +SAAAAASBBBBJJJJHJJJJYYHHHHHHYYYYYHHHHHHHHAAAAAAAAAAAAXKXXXIRAAAAAAAAASSSSSGASSSSVVVTMMMMMMMMAAAATTMDTTTTTTTXZTTAAAAAAVAAVVUUUUUXUXUUUUUHHBBH +AAAAAASSSBJJJJJJJJJHHHHHHHHYYYYYYYYYHHHHHAAAAAAAAAAAAXXXNIIRRAAAAAAAAAAAASSAASSSSVTTMSMMMMMMMAAATTMMMMTTTXTXXTXAAAAAAVVVVEUUUUUXXXUUUUUUHHHH +AAAAAJRJJJJJJJJJJJJHHHHHHHYYYYYYYYYYHHHHHAAAAAAAAAAAAJIIIIIRAAAAAAAAAAAAAASAAATSRVTTMMMMMMMXXXAAATPMMMKXXXXXXXXXAAAAAVVVVUUUUUXXXXXXXUUUHHHH +AAAAARRTTJAAJJJJJJJJHHHHHHHYYYYYYYYYHHHAAAAAAAAAAAAAAJIIIIIIIIIAAAAAAAAAAAAAATTTVVTTMMMGMZZXXXXAAMMMMXXXXXXXXXXXAAAVVVVVVUUUUXXXXXXXXXHHHHHH +AAAAARRRJJAJJJJJJJJJHHHUUUUUYYYYYYYYYYEAAAAAAAAAAAAAAAYYIIIIIIIIAAAAAAAAAAAAAATTTTTTWMMMMZZXXXAAAAMMMXXXXXXXXXXXAAAVVVVVVUVVUXXXXXXXXXXHHHHH +AAAAAAARJAAJJJJJJJJJMPPUUUUUYYYYYYYYYYAAAAAAAAAAAAAAAAAAIIIIIIIAAAAAAAAAAAAAAATTTTTWWDDDMXXXXXXXAAAXXXXXXXXXXXXXAAVVVVVVVVVVUXXXXXXXXHHHHHHH +AAAAAARRRAAAJJJJJJJJPPPUUUUUYYYYYYYYYYAANNAAAAAAAAAAAIAIIIIIIIIAAISAIIIAAAATAATWWTWWWWDDXXXXXXXXXXXXXXXXXXXXXKKKAAVVVVVVVVVVUXXXXXXXXHHHHHHH +AAAAAGGRRAAAAAJJPPPJJPPUUUUUYYYYYYYYYYYOOOOROSSAAAIAAIIIIIIIIFIIAIIIIIIAAOOOAATTWWWWWWWXXXXXXXXXXXXXXXXXXXXXXXKAAKVVVVVVVVVVVTXXXXXIIXXHHHHH +AAAAAGGGRRRAAAAAAPPPPPPPPPYYYYYYYYYYYYOOOOOOOSSSSAGGGGGIIIIIFFIIIIIIIIAAOOOOOOTTWWWWWWWXXXXXXXXXXXXXXXXXXXXXXXKKKKKKVVVVVVVVVVXXXXXXXEXXHHHH +AAAAAGGARAAAAAAPPPPPPPPPPPPPYYYYYYOYYYOOOOOOOSSSSGGGGGIIIIIIIFIIIIIIIIAAOOOOOOOOWWWWWWIIXHXXXXXXXXXXXXXXXXXXXXKVVVVVVVVVVVVVVVXXXXXXXEXXHHHH +AAAAAGGAAAAAAAAPPPPPPPPPPPPPPPYYOOOOOYOOOOOOOOOSSGGGGGGIIIIIIIIIIIIIIIOOOOOOHHHHWWWWWWIIXHXXXXXXXXXLXXXXXXXXXXXZZVVVVVVVVVVVVVVXXXXXXXXXHHHH +AAAGGGAAAAAAAAPPPPPPNNNPPPPPPPPPPOOOOOOOOOOOOOCGGGGGGGGGIIIIIIIIIIIIIIIQIOOOHHHHHWWWWWWIJHHXXXXXXXXXXXXXXXXXXHXZZVVVVVVVVVVVVVVXXXXXYYXXHHHH +GAAGGGGAAAAAAAAAPJJNNNNPNPPPPPPPNOOOOOOOOOOOOOCGGGGGGGGGGGIIIIIIIIIIIIIIIOHHHHHHHWIWIIIIJHHXXXXXXXXXXXXXXXZZXXZZZVVVVVVVVVVVVVVYXYYYYYYYEEHH +GGGGGGGGAAAAAAAAAJJNNNNNNPPPPPPPPOOOOOOOOOOUOOOGGGGGGGGGGINIIIIIIIIIIIIIIIIHHHHHHHIIIIJJJHHXXXXXXJXXXXXXXXXZZZZZVVVVVSSSZVVZVVVYYYYYYEEEEHHH +GGGGGGGGGAAAAAAAAJJNNNNNNPPPPPPPPPPOOOOOOOOUUUGGGGGGGGGGGIIIIIIIIIIIIIIIIHHHHHHHHIIIIIIJJJHXXXXXXXWXXFXXXXZZZZZZVZZVVVVVZZZZZVYYYYEYYEEAEHHH +GGGGGGGGAAAAAAAAAAJNNNNNNNPNPPPPXXXOOOOOOOOOUUGGGGGGGGGGGGIIIIIIIIIIIIHHIIHHHHHHHHHIIIIJJJHXXXXXXXWXFFFXXXXZZZZZZZZZZZVZZZZZZZYYYYEEEEEEHHHH +GGGGGGGGGGGAAAJJJJJNNNNNNNNNPPPXXXXOOXXOOOOOGGGGGGGGGGGGGGGGIIIIIIIIIIIHHHHHHHHHHHHHHHHHHHHHXXXXXXXXXFFFFXXZZZZZZZZZZZZZZZZZZZZZYYEEEEEHHHHH diff --git a/2024/go/day13/day13.go b/2024/go/day13/day13.go new file mode 100644 index 0000000..5f90897 --- /dev/null +++ b/2024/go/day13/day13.go @@ -0,0 +1,58 @@ +package day13 + +import ( + "adventofcode2024/utils" + _ "adventofcode2024/utils/grid2d" + _ "adventofcode2024/utils/inputs" + "regexp" + _ "fmt" + "strings" +) + +func Part1(input string) int { + val := 0 + machines := strings.Split(input, "\n\n") + pattern := `Button A: X\+(\d+), Y\+(\d+)\sButton B: X\+(\d+), Y\+(\d+)\sPrize: X=(\d+), Y=(\d+)` + re := regexp.MustCompile(pattern) + for _, machine := range machines { + matches := re.FindStringSubmatch(machine) + a := utils.MustAtoi(matches[1]) + b := utils.MustAtoi(matches[2]) + c := utils.MustAtoi(matches[3]) + d := utils.MustAtoi(matches[4]) + X := utils.MustAtoi(matches[5]) + Y := utils.MustAtoi(matches[6]) +// fmt.Println(matches) + B := (Y*a - X*b)/(a*d - c*b) + A := (X - c*B)/a +// fmt.Printf("A: %d B: %d\n", A, B) + if (A*a + B*c == X && A*b + B*d == Y) { + val += A*3 + B + } + } + return val +} + +func Part2(input string) int { + val := 0 + machines := strings.Split(input, "\n\n") + pattern := `Button A: X\+(\d+), Y\+(\d+)\sButton B: X\+(\d+), Y\+(\d+)\sPrize: X=(\d+), Y=(\d+)` + re := regexp.MustCompile(pattern) + for _, machine := range machines { + matches := re.FindStringSubmatch(machine) + a := utils.MustAtoi(matches[1]) + b := utils.MustAtoi(matches[2]) + c := utils.MustAtoi(matches[3]) + d := utils.MustAtoi(matches[4]) + X := utils.MustAtoi(matches[5]) + 10000000000000 + Y := utils.MustAtoi(matches[6]) + 10000000000000 +// fmt.Println(matches) + B := (Y*a - X*b)/(a*d - c*b) + A := (X - c*B)/a +// fmt.Printf("A: %d B: %d\n", A, B) + if (A*a + B*c == X && A*b + B*d == Y) { + val += A*3 + B + } + } + return val +} \ No newline at end of file diff --git a/2024/go/day13/day13_test.go b/2024/go/day13/day13_test.go new file mode 100644 index 0000000..5778833 --- /dev/null +++ b/2024/go/day13/day13_test.go @@ -0,0 +1,45 @@ +package day13 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +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`) + require.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`) + require.Equal(t, 480, r) +} diff --git a/2024/go/day13/input.txt b/2024/go/day13/input.txt new file mode 100644 index 0000000..3b53baf --- /dev/null +++ b/2024/go/day13/input.txt @@ -0,0 +1,1279 @@ +Button A: X+17, Y+68 +Button B: X+62, Y+15 +Prize: X=4507, Y=17764 + +Button A: X+19, Y+95 +Button B: X+59, Y+23 +Prize: X=6550, Y=10174 + +Button A: X+20, Y+58 +Button B: X+60, Y+11 +Prize: X=3140, Y=4691 + +Button A: X+92, Y+31 +Button B: X+49, Y+87 +Prize: X=6599, Y=2717 + +Button A: X+46, Y+72 +Button B: X+29, Y+12 +Prize: X=18754, Y=13304 + +Button A: X+42, Y+33 +Button B: X+19, Y+81 +Prize: X=3531, Y=6144 + +Button A: X+80, Y+13 +Button B: X+20, Y+75 +Prize: X=1860, Y=3818 + +Button A: X+79, Y+14 +Button B: X+56, Y+66 +Prize: X=6740, Y=3830 + +Button A: X+18, Y+85 +Button B: X+70, Y+36 +Prize: X=5358, Y=5861 + +Button A: X+42, Y+44 +Button B: X+52, Y+14 +Prize: X=6310, Y=4870 + +Button A: X+56, Y+90 +Button B: X+88, Y+41 +Prize: X=9208, Y=8572 + +Button A: X+95, Y+67 +Button B: X+13, Y+71 +Prize: X=3065, Y=6799 + +Button A: X+70, Y+22 +Button B: X+13, Y+57 +Prize: X=17469, Y=5153 + +Button A: X+36, Y+65 +Button B: X+79, Y+27 +Prize: X=5764, Y=4394 + +Button A: X+20, Y+46 +Button B: X+67, Y+29 +Prize: X=4637, Y=10139 + +Button A: X+47, Y+72 +Button B: X+42, Y+20 +Prize: X=1495, Y=10984 + +Button A: X+37, Y+96 +Button B: X+70, Y+53 +Prize: X=3563, Y=6029 + +Button A: X+20, Y+59 +Button B: X+62, Y+13 +Prize: X=5550, Y=18133 + +Button A: X+16, Y+52 +Button B: X+70, Y+61 +Prize: X=2400, Y=5136 + +Button A: X+70, Y+32 +Button B: X+22, Y+53 +Prize: X=320, Y=18668 + +Button A: X+47, Y+78 +Button B: X+78, Y+17 +Prize: X=6317, Y=6323 + +Button A: X+48, Y+33 +Button B: X+20, Y+89 +Prize: X=4296, Y=7017 + +Button A: X+17, Y+53 +Button B: X+43, Y+14 +Prize: X=19634, Y=5590 + +Button A: X+41, Y+95 +Button B: X+78, Y+30 +Prize: X=6816, Y=6900 + +Button A: X+14, Y+75 +Button B: X+65, Y+12 +Prize: X=10103, Y=12239 + +Button A: X+84, Y+69 +Button B: X+23, Y+95 +Prize: X=6178, Y=11620 + +Button A: X+57, Y+88 +Button B: X+70, Y+33 +Prize: X=4926, Y=6479 + +Button A: X+84, Y+34 +Button B: X+29, Y+78 +Prize: X=6138, Y=2882 + +Button A: X+32, Y+60 +Button B: X+62, Y+29 +Prize: X=13264, Y=10848 + +Button A: X+81, Y+69 +Button B: X+13, Y+61 +Prize: X=7893, Y=11217 + +Button A: X+98, Y+12 +Button B: X+85, Y+85 +Prize: X=8352, Y=3708 + +Button A: X+22, Y+91 +Button B: X+73, Y+39 +Prize: X=1457, Y=4186 + +Button A: X+38, Y+56 +Button B: X+97, Y+16 +Prize: X=9339, Y=3480 + +Button A: X+46, Y+13 +Button B: X+36, Y+71 +Prize: X=14918, Y=17793 + +Button A: X+27, Y+74 +Button B: X+64, Y+13 +Prize: X=11637, Y=3584 + +Button A: X+18, Y+58 +Button B: X+35, Y+16 +Prize: X=13544, Y=2948 + +Button A: X+32, Y+99 +Button B: X+99, Y+16 +Prize: X=7159, Y=4441 + +Button A: X+86, Y+49 +Button B: X+12, Y+49 +Prize: X=13188, Y=6269 + +Button A: X+19, Y+72 +Button B: X+37, Y+27 +Prize: X=1001, Y=3114 + +Button A: X+80, Y+39 +Button B: X+36, Y+55 +Prize: X=3848, Y=4797 + +Button A: X+32, Y+77 +Button B: X+82, Y+21 +Prize: X=4120, Y=4977 + +Button A: X+41, Y+64 +Button B: X+41, Y+16 +Prize: X=1829, Y=5360 + +Button A: X+67, Y+45 +Button B: X+13, Y+29 +Prize: X=19806, Y=5416 + +Button A: X+84, Y+13 +Button B: X+37, Y+55 +Prize: X=2852, Y=3792 + +Button A: X+70, Y+37 +Button B: X+21, Y+52 +Prize: X=8089, Y=10953 + +Button A: X+16, Y+57 +Button B: X+81, Y+38 +Prize: X=18875, Y=17714 + +Button A: X+91, Y+87 +Button B: X+24, Y+97 +Prize: X=3019, Y=5182 + +Button A: X+48, Y+60 +Button B: X+75, Y+17 +Prize: X=3267, Y=937 + +Button A: X+78, Y+26 +Button B: X+54, Y+95 +Prize: X=10638, Y=9706 + +Button A: X+21, Y+90 +Button B: X+65, Y+18 +Prize: X=5264, Y=4320 + +Button A: X+14, Y+58 +Button B: X+41, Y+33 +Prize: X=931, Y=983 + +Button A: X+22, Y+45 +Button B: X+55, Y+23 +Prize: X=18987, Y=18336 + +Button A: X+24, Y+61 +Button B: X+75, Y+29 +Prize: X=5127, Y=5758 + +Button A: X+49, Y+84 +Button B: X+38, Y+11 +Prize: X=3463, Y=3446 + +Button A: X+32, Y+75 +Button B: X+54, Y+11 +Prize: X=10780, Y=933 + +Button A: X+18, Y+84 +Button B: X+75, Y+31 +Prize: X=2577, Y=2137 + +Button A: X+16, Y+53 +Button B: X+66, Y+24 +Prize: X=12502, Y=7650 + +Button A: X+46, Y+75 +Button B: X+46, Y+20 +Prize: X=7598, Y=5780 + +Button A: X+97, Y+57 +Button B: X+40, Y+75 +Prize: X=6896, Y=6936 + +Button A: X+87, Y+49 +Button B: X+17, Y+61 +Prize: X=2245, Y=5687 + +Button A: X+89, Y+43 +Button B: X+38, Y+88 +Prize: X=8665, Y=7181 + +Button A: X+39, Y+94 +Button B: X+34, Y+26 +Prize: X=2237, Y=5112 + +Button A: X+57, Y+12 +Button B: X+40, Y+71 +Prize: X=5110, Y=6395 + +Button A: X+92, Y+13 +Button B: X+29, Y+88 +Prize: X=6278, Y=4411 + +Button A: X+94, Y+81 +Button B: X+13, Y+64 +Prize: X=3211, Y=5882 + +Button A: X+49, Y+34 +Button B: X+14, Y+65 +Prize: X=1939, Y=3778 + +Button A: X+32, Y+73 +Button B: X+50, Y+12 +Prize: X=12774, Y=12247 + +Button A: X+34, Y+97 +Button B: X+78, Y+59 +Prize: X=1364, Y=1602 + +Button A: X+13, Y+44 +Button B: X+70, Y+41 +Prize: X=13681, Y=7491 + +Button A: X+72, Y+44 +Button B: X+13, Y+56 +Prize: X=1078, Y=1716 + +Button A: X+56, Y+30 +Button B: X+27, Y+58 +Prize: X=3425, Y=5100 + +Button A: X+99, Y+18 +Button B: X+40, Y+83 +Prize: X=9389, Y=6175 + +Button A: X+44, Y+14 +Button B: X+17, Y+66 +Prize: X=7836, Y=16974 + +Button A: X+16, Y+58 +Button B: X+79, Y+29 +Prize: X=1201, Y=18041 + +Button A: X+60, Y+19 +Button B: X+52, Y+73 +Prize: X=5560, Y=5718 + +Button A: X+13, Y+51 +Button B: X+69, Y+26 +Prize: X=7423, Y=7244 + +Button A: X+40, Y+14 +Button B: X+42, Y+60 +Prize: X=6320, Y=5836 + +Button A: X+73, Y+29 +Button B: X+20, Y+54 +Prize: X=12274, Y=12544 + +Button A: X+12, Y+64 +Button B: X+89, Y+95 +Prize: X=8072, Y=9640 + +Button A: X+26, Y+49 +Button B: X+70, Y+26 +Prize: X=2276, Y=3442 + +Button A: X+68, Y+47 +Button B: X+29, Y+69 +Prize: X=7480, Y=8499 + +Button A: X+13, Y+28 +Button B: X+86, Y+21 +Prize: X=1826, Y=1141 + +Button A: X+97, Y+85 +Button B: X+25, Y+88 +Prize: X=5021, Y=6647 + +Button A: X+24, Y+50 +Button B: X+85, Y+17 +Prize: X=1952, Y=2786 + +Button A: X+21, Y+71 +Button B: X+59, Y+21 +Prize: X=18503, Y=12693 + +Button A: X+94, Y+58 +Button B: X+42, Y+85 +Prize: X=12332, Y=12395 + +Button A: X+93, Y+49 +Button B: X+13, Y+40 +Prize: X=9332, Y=7370 + +Button A: X+58, Y+44 +Button B: X+32, Y+84 +Prize: X=6696, Y=10216 + +Button A: X+18, Y+77 +Button B: X+56, Y+51 +Prize: X=2952, Y=5840 + +Button A: X+13, Y+76 +Button B: X+46, Y+11 +Prize: X=14558, Y=6711 + +Button A: X+46, Y+20 +Button B: X+45, Y+70 +Prize: X=6149, Y=5750 + +Button A: X+92, Y+39 +Button B: X+54, Y+97 +Prize: X=10056, Y=10488 + +Button A: X+25, Y+48 +Button B: X+80, Y+50 +Prize: X=2260, Y=1542 + +Button A: X+12, Y+52 +Button B: X+39, Y+20 +Prize: X=2225, Y=10452 + +Button A: X+25, Y+62 +Button B: X+42, Y+15 +Prize: X=2596, Y=12552 + +Button A: X+11, Y+39 +Button B: X+67, Y+17 +Prize: X=2192, Y=12338 + +Button A: X+90, Y+59 +Button B: X+19, Y+57 +Prize: X=5277, Y=7602 + +Button A: X+50, Y+34 +Button B: X+33, Y+80 +Prize: X=1245, Y=1710 + +Button A: X+11, Y+63 +Button B: X+83, Y+12 +Prize: X=4173, Y=15554 + +Button A: X+52, Y+97 +Button B: X+91, Y+13 +Prize: X=13091, Y=10469 + +Button A: X+23, Y+57 +Button B: X+69, Y+36 +Prize: X=8771, Y=6614 + +Button A: X+21, Y+40 +Button B: X+67, Y+40 +Prize: X=15512, Y=5120 + +Button A: X+20, Y+47 +Button B: X+66, Y+22 +Prize: X=9426, Y=16922 + +Button A: X+15, Y+37 +Button B: X+49, Y+14 +Prize: X=2334, Y=3915 + +Button A: X+25, Y+51 +Button B: X+44, Y+17 +Prize: X=4718, Y=4386 + +Button A: X+77, Y+30 +Button B: X+16, Y+78 +Prize: X=7755, Y=7758 + +Button A: X+55, Y+87 +Button B: X+64, Y+15 +Prize: X=10939, Y=9456 + +Button A: X+64, Y+17 +Button B: X+24, Y+78 +Prize: X=312, Y=3577 + +Button A: X+15, Y+68 +Button B: X+73, Y+12 +Prize: X=708, Y=6800 + +Button A: X+71, Y+66 +Button B: X+12, Y+42 +Prize: X=7143, Y=8028 + +Button A: X+70, Y+24 +Button B: X+22, Y+66 +Prize: X=1930, Y=10706 + +Button A: X+52, Y+28 +Button B: X+29, Y+47 +Prize: X=19597, Y=3007 + +Button A: X+11, Y+24 +Button B: X+51, Y+24 +Prize: X=2230, Y=1200 + +Button A: X+23, Y+80 +Button B: X+55, Y+15 +Prize: X=2251, Y=1130 + +Button A: X+20, Y+42 +Button B: X+75, Y+48 +Prize: X=15760, Y=14762 + +Button A: X+63, Y+12 +Button B: X+32, Y+77 +Prize: X=1622, Y=1319 + +Button A: X+11, Y+20 +Button B: X+54, Y+22 +Prize: X=10462, Y=1050 + +Button A: X+24, Y+72 +Button B: X+53, Y+12 +Prize: X=5360, Y=10304 + +Button A: X+99, Y+52 +Button B: X+12, Y+52 +Prize: X=8937, Y=5928 + +Button A: X+62, Y+25 +Button B: X+57, Y+95 +Prize: X=10249, Y=10110 + +Button A: X+40, Y+99 +Button B: X+91, Y+13 +Prize: X=3050, Y=1182 + +Button A: X+26, Y+60 +Button B: X+71, Y+38 +Prize: X=9324, Y=9448 + +Button A: X+60, Y+88 +Button B: X+73, Y+32 +Prize: X=8559, Y=7824 + +Button A: X+59, Y+21 +Button B: X+59, Y+75 +Prize: X=4602, Y=2070 + +Button A: X+14, Y+48 +Button B: X+47, Y+19 +Prize: X=4601, Y=3977 + +Button A: X+64, Y+22 +Button B: X+29, Y+65 +Prize: X=12970, Y=19186 + +Button A: X+28, Y+19 +Button B: X+18, Y+43 +Prize: X=2002, Y=2005 + +Button A: X+24, Y+17 +Button B: X+12, Y+30 +Prize: X=14612, Y=12593 + +Button A: X+34, Y+54 +Button B: X+88, Y+12 +Prize: X=9576, Y=2688 + +Button A: X+22, Y+35 +Button B: X+51, Y+17 +Prize: X=6367, Y=4806 + +Button A: X+28, Y+53 +Button B: X+91, Y+44 +Prize: X=5194, Y=3932 + +Button A: X+31, Y+11 +Button B: X+30, Y+69 +Prize: X=14791, Y=1482 + +Button A: X+46, Y+94 +Button B: X+26, Y+17 +Prize: X=3028, Y=3514 + +Button A: X+79, Y+29 +Button B: X+13, Y+52 +Prize: X=16594, Y=6031 + +Button A: X+76, Y+36 +Button B: X+32, Y+80 +Prize: X=5908, Y=3836 + +Button A: X+20, Y+41 +Button B: X+59, Y+28 +Prize: X=4243, Y=10632 + +Button A: X+72, Y+32 +Button B: X+22, Y+58 +Prize: X=15972, Y=11444 + +Button A: X+53, Y+28 +Button B: X+28, Y+58 +Prize: X=3946, Y=10646 + +Button A: X+19, Y+69 +Button B: X+61, Y+22 +Prize: X=9244, Y=17018 + +Button A: X+20, Y+71 +Button B: X+64, Y+18 +Prize: X=17356, Y=9567 + +Button A: X+28, Y+89 +Button B: X+69, Y+50 +Prize: X=5623, Y=5174 + +Button A: X+62, Y+17 +Button B: X+11, Y+73 +Prize: X=1851, Y=10184 + +Button A: X+60, Y+22 +Button B: X+18, Y+38 +Prize: X=3728, Y=6252 + +Button A: X+58, Y+32 +Button B: X+28, Y+94 +Prize: X=5286, Y=6844 + +Button A: X+53, Y+80 +Button B: X+58, Y+14 +Prize: X=8236, Y=5886 + +Button A: X+15, Y+49 +Button B: X+46, Y+18 +Prize: X=11211, Y=18229 + +Button A: X+21, Y+96 +Button B: X+27, Y+29 +Prize: X=2448, Y=7697 + +Button A: X+42, Y+85 +Button B: X+93, Y+37 +Prize: X=5364, Y=5412 + +Button A: X+56, Y+32 +Button B: X+16, Y+31 +Prize: X=3368, Y=3389 + +Button A: X+14, Y+66 +Button B: X+81, Y+66 +Prize: X=7042, Y=11088 + +Button A: X+12, Y+54 +Button B: X+76, Y+37 +Prize: X=5280, Y=15420 + +Button A: X+37, Y+24 +Button B: X+12, Y+44 +Prize: X=4537, Y=5804 + +Button A: X+55, Y+14 +Button B: X+24, Y+85 +Prize: X=4477, Y=3743 + +Button A: X+70, Y+92 +Button B: X+73, Y+17 +Prize: X=5044, Y=2840 + +Button A: X+13, Y+51 +Button B: X+40, Y+38 +Prize: X=2505, Y=5665 + +Button A: X+63, Y+24 +Button B: X+22, Y+55 +Prize: X=6942, Y=6141 + +Button A: X+30, Y+75 +Button B: X+62, Y+22 +Prize: X=14496, Y=6211 + +Button A: X+87, Y+43 +Button B: X+30, Y+75 +Prize: X=3153, Y=6312 + +Button A: X+77, Y+37 +Button B: X+14, Y+45 +Prize: X=11197, Y=3283 + +Button A: X+48, Y+25 +Button B: X+49, Y+96 +Prize: X=1254, Y=1076 + +Button A: X+14, Y+77 +Button B: X+53, Y+55 +Prize: X=1972, Y=5170 + +Button A: X+32, Y+19 +Button B: X+18, Y+39 +Prize: X=3720, Y=3681 + +Button A: X+36, Y+13 +Button B: X+39, Y+75 +Prize: X=5181, Y=6196 + +Button A: X+34, Y+23 +Button B: X+11, Y+35 +Prize: X=14981, Y=13421 + +Button A: X+83, Y+28 +Button B: X+11, Y+47 +Prize: X=5038, Y=15145 + +Button A: X+44, Y+98 +Button B: X+78, Y+26 +Prize: X=7832, Y=4444 + +Button A: X+18, Y+11 +Button B: X+19, Y+44 +Prize: X=15969, Y=15082 + +Button A: X+14, Y+81 +Button B: X+39, Y+34 +Prize: X=1722, Y=1914 + +Button A: X+29, Y+94 +Button B: X+75, Y+55 +Prize: X=9696, Y=14311 + +Button A: X+41, Y+79 +Button B: X+58, Y+19 +Prize: X=4374, Y=5367 + +Button A: X+47, Y+14 +Button B: X+35, Y+66 +Prize: X=17301, Y=1534 + +Button A: X+68, Y+29 +Button B: X+21, Y+98 +Prize: X=6996, Y=5833 + +Button A: X+16, Y+61 +Button B: X+72, Y+15 +Prize: X=10896, Y=9927 + +Button A: X+69, Y+16 +Button B: X+17, Y+99 +Prize: X=4411, Y=2924 + +Button A: X+16, Y+73 +Button B: X+43, Y+42 +Prize: X=2463, Y=4299 + +Button A: X+54, Y+16 +Button B: X+21, Y+43 +Prize: X=4187, Y=10273 + +Button A: X+49, Y+13 +Button B: X+49, Y+83 +Prize: X=6076, Y=4902 + +Button A: X+40, Y+19 +Button B: X+17, Y+31 +Prize: X=18121, Y=6893 + +Button A: X+22, Y+89 +Button B: X+62, Y+33 +Prize: X=3470, Y=2929 + +Button A: X+24, Y+51 +Button B: X+51, Y+11 +Prize: X=13013, Y=7760 + +Button A: X+40, Y+72 +Button B: X+94, Y+29 +Prize: X=10730, Y=8799 + +Button A: X+85, Y+18 +Button B: X+64, Y+86 +Prize: X=3858, Y=4222 + +Button A: X+99, Y+11 +Button B: X+18, Y+71 +Prize: X=1530, Y=722 + +Button A: X+69, Y+12 +Button B: X+93, Y+98 +Prize: X=11136, Y=9792 + +Button A: X+95, Y+75 +Button B: X+21, Y+96 +Prize: X=917, Y=1677 + +Button A: X+22, Y+57 +Button B: X+46, Y+17 +Prize: X=7332, Y=17866 + +Button A: X+55, Y+19 +Button B: X+27, Y+67 +Prize: X=8606, Y=17118 + +Button A: X+42, Y+92 +Button B: X+77, Y+50 +Prize: X=3416, Y=2736 + +Button A: X+13, Y+64 +Button B: X+92, Y+86 +Prize: X=5175, Y=6030 + +Button A: X+56, Y+18 +Button B: X+20, Y+46 +Prize: X=4068, Y=5212 + +Button A: X+78, Y+11 +Button B: X+19, Y+79 +Prize: X=6081, Y=10602 + +Button A: X+19, Y+87 +Button B: X+84, Y+35 +Prize: X=3342, Y=3765 + +Button A: X+57, Y+33 +Button B: X+19, Y+43 +Prize: X=8062, Y=8686 + +Button A: X+93, Y+60 +Button B: X+14, Y+72 +Prize: X=1229, Y=2556 + +Button A: X+55, Y+24 +Button B: X+14, Y+94 +Prize: X=1871, Y=6002 + +Button A: X+13, Y+19 +Button B: X+37, Y+15 +Prize: X=11560, Y=7340 + +Button A: X+97, Y+92 +Button B: X+68, Y+14 +Prize: X=12918, Y=8566 + +Button A: X+64, Y+16 +Button B: X+19, Y+58 +Prize: X=15227, Y=15866 + +Button A: X+12, Y+62 +Button B: X+63, Y+17 +Prize: X=11813, Y=12953 + +Button A: X+72, Y+28 +Button B: X+20, Y+52 +Prize: X=1284, Y=4264 + +Button A: X+76, Y+17 +Button B: X+23, Y+38 +Prize: X=8199, Y=4101 + +Button A: X+84, Y+38 +Button B: X+17, Y+47 +Prize: X=7592, Y=6422 + +Button A: X+76, Y+26 +Button B: X+33, Y+61 +Prize: X=7100, Y=3622 + +Button A: X+53, Y+45 +Button B: X+14, Y+48 +Prize: X=3495, Y=4737 + +Button A: X+14, Y+57 +Button B: X+95, Y+13 +Prize: X=2193, Y=4817 + +Button A: X+91, Y+24 +Button B: X+39, Y+44 +Prize: X=8905, Y=4776 + +Button A: X+36, Y+95 +Button B: X+54, Y+14 +Prize: X=6570, Y=8985 + +Button A: X+47, Y+26 +Button B: X+27, Y+45 +Prize: X=9856, Y=1870 + +Button A: X+70, Y+23 +Button B: X+33, Y+80 +Prize: X=6705, Y=3932 + +Button A: X+93, Y+22 +Button B: X+72, Y+97 +Prize: X=13317, Y=8748 + +Button A: X+68, Y+56 +Button B: X+12, Y+82 +Prize: X=3792, Y=5070 + +Button A: X+91, Y+19 +Button B: X+50, Y+58 +Prize: X=7149, Y=4917 + +Button A: X+17, Y+85 +Button B: X+62, Y+56 +Prize: X=6472, Y=11278 + +Button A: X+71, Y+18 +Button B: X+16, Y+75 +Prize: X=7574, Y=7170 + +Button A: X+13, Y+78 +Button B: X+64, Y+76 +Prize: X=3350, Y=6856 + +Button A: X+65, Y+14 +Button B: X+16, Y+42 +Prize: X=8942, Y=19674 + +Button A: X+37, Y+19 +Button B: X+20, Y+33 +Prize: X=15445, Y=3074 + +Button A: X+12, Y+40 +Button B: X+76, Y+26 +Prize: X=1848, Y=19728 + +Button A: X+86, Y+16 +Button B: X+11, Y+96 +Prize: X=7116, Y=9216 + +Button A: X+62, Y+14 +Button B: X+49, Y+69 +Prize: X=5138, Y=6722 + +Button A: X+44, Y+63 +Button B: X+42, Y+17 +Prize: X=10920, Y=3470 + +Button A: X+51, Y+26 +Button B: X+35, Y+55 +Prize: X=11198, Y=1063 + +Button A: X+85, Y+11 +Button B: X+11, Y+72 +Prize: X=507, Y=16765 + +Button A: X+50, Y+17 +Button B: X+28, Y+55 +Prize: X=2500, Y=4978 + +Button A: X+17, Y+41 +Button B: X+60, Y+38 +Prize: X=11731, Y=5537 + +Button A: X+31, Y+41 +Button B: X+91, Y+36 +Prize: X=9013, Y=6353 + +Button A: X+62, Y+21 +Button B: X+15, Y+59 +Prize: X=1794, Y=13288 + +Button A: X+41, Y+14 +Button B: X+26, Y+49 +Prize: X=7670, Y=3910 + +Button A: X+24, Y+99 +Button B: X+95, Y+54 +Prize: X=8639, Y=10971 + +Button A: X+13, Y+80 +Button B: X+93, Y+52 +Prize: X=4898, Y=7248 + +Button A: X+97, Y+73 +Button B: X+31, Y+83 +Prize: X=6926, Y=10702 + +Button A: X+21, Y+86 +Button B: X+90, Y+65 +Prize: X=7887, Y=8317 + +Button A: X+37, Y+42 +Button B: X+83, Y+27 +Prize: X=7887, Y=3105 + +Button A: X+19, Y+68 +Button B: X+67, Y+25 +Prize: X=3042, Y=7375 + +Button A: X+30, Y+51 +Button B: X+80, Y+15 +Prize: X=2140, Y=2670 + +Button A: X+87, Y+22 +Button B: X+49, Y+91 +Prize: X=6983, Y=3338 + +Button A: X+74, Y+42 +Button B: X+14, Y+40 +Prize: X=8560, Y=1180 + +Button A: X+98, Y+11 +Button B: X+53, Y+87 +Prize: X=4734, Y=3125 + +Button A: X+36, Y+60 +Button B: X+94, Y+15 +Prize: X=6512, Y=2070 + +Button A: X+36, Y+11 +Button B: X+33, Y+57 +Prize: X=15008, Y=16375 + +Button A: X+79, Y+51 +Button B: X+18, Y+46 +Prize: X=12284, Y=18892 + +Button A: X+25, Y+63 +Button B: X+66, Y+18 +Prize: X=12741, Y=16919 + +Button A: X+11, Y+54 +Button B: X+76, Y+33 +Prize: X=4920, Y=6683 + +Button A: X+23, Y+71 +Button B: X+55, Y+17 +Prize: X=15713, Y=18075 + +Button A: X+92, Y+85 +Button B: X+72, Y+14 +Prize: X=11088, Y=6988 + +Button A: X+90, Y+31 +Button B: X+15, Y+41 +Prize: X=8280, Y=5217 + +Button A: X+16, Y+52 +Button B: X+72, Y+24 +Prize: X=15496, Y=13792 + +Button A: X+17, Y+24 +Button B: X+76, Y+16 +Prize: X=8548, Y=3760 + +Button A: X+21, Y+42 +Button B: X+56, Y+20 +Prize: X=3955, Y=3034 + +Button A: X+57, Y+15 +Button B: X+16, Y+20 +Prize: X=3915, Y=1125 + +Button A: X+64, Y+16 +Button B: X+25, Y+70 +Prize: X=12199, Y=10666 + +Button A: X+13, Y+57 +Button B: X+36, Y+13 +Prize: X=12196, Y=1889 + +Button A: X+50, Y+70 +Button B: X+29, Y+13 +Prize: X=19005, Y=11065 + +Button A: X+58, Y+87 +Button B: X+76, Y+34 +Prize: X=6738, Y=7227 + +Button A: X+79, Y+62 +Button B: X+24, Y+88 +Prize: X=2126, Y=1876 + +Button A: X+29, Y+89 +Button B: X+70, Y+22 +Prize: X=7399, Y=4003 + +Button A: X+61, Y+36 +Button B: X+12, Y+47 +Prize: X=7624, Y=15339 + +Button A: X+16, Y+27 +Button B: X+43, Y+14 +Prize: X=15461, Y=6925 + +Button A: X+53, Y+14 +Button B: X+17, Y+53 +Prize: X=1833, Y=2085 + +Button A: X+12, Y+46 +Button B: X+76, Y+33 +Prize: X=17232, Y=7631 + +Button A: X+23, Y+15 +Button B: X+11, Y+32 +Prize: X=2079, Y=2051 + +Button A: X+14, Y+61 +Button B: X+79, Y+31 +Prize: X=19076, Y=19749 + +Button A: X+67, Y+97 +Button B: X+95, Y+39 +Prize: X=12736, Y=11344 + +Button A: X+14, Y+23 +Button B: X+35, Y+11 +Prize: X=6444, Y=17109 + +Button A: X+14, Y+40 +Button B: X+32, Y+17 +Prize: X=5020, Y=6220 + +Button A: X+53, Y+14 +Button B: X+14, Y+42 +Prize: X=17332, Y=3966 + +Button A: X+43, Y+16 +Button B: X+12, Y+25 +Prize: X=2577, Y=12758 + +Button A: X+26, Y+12 +Button B: X+24, Y+47 +Prize: X=17828, Y=3061 + +Button A: X+99, Y+66 +Button B: X+43, Y+91 +Prize: X=6135, Y=8391 + +Button A: X+13, Y+41 +Button B: X+63, Y+12 +Prize: X=6296, Y=12458 + +Button A: X+18, Y+42 +Button B: X+88, Y+22 +Prize: X=2486, Y=1034 + +Button A: X+35, Y+80 +Button B: X+52, Y+37 +Prize: X=5416, Y=8041 + +Button A: X+81, Y+32 +Button B: X+21, Y+50 +Prize: X=3750, Y=1690 + +Button A: X+90, Y+27 +Button B: X+17, Y+82 +Prize: X=3355, Y=6005 + +Button A: X+35, Y+14 +Button B: X+35, Y+48 +Prize: X=13850, Y=6312 + +Button A: X+94, Y+82 +Button B: X+14, Y+41 +Prize: X=4962, Y=6027 + +Button A: X+18, Y+86 +Button B: X+36, Y+31 +Prize: X=2826, Y=8849 + +Button A: X+24, Y+42 +Button B: X+57, Y+26 +Prize: X=4289, Y=16742 + +Button A: X+15, Y+59 +Button B: X+76, Y+27 +Prize: X=12775, Y=18008 + +Button A: X+64, Y+27 +Button B: X+20, Y+65 +Prize: X=19348, Y=11874 + +Button A: X+27, Y+55 +Button B: X+85, Y+14 +Prize: X=2653, Y=1903 + +Button A: X+90, Y+12 +Button B: X+47, Y+90 +Prize: X=681, Y=342 + +Button A: X+13, Y+29 +Button B: X+18, Y+13 +Prize: X=2527, Y=8550 + +Button A: X+71, Y+34 +Button B: X+25, Y+59 +Prize: X=10411, Y=6369 + +Button A: X+78, Y+26 +Button B: X+61, Y+98 +Prize: X=7284, Y=3360 + +Button A: X+49, Y+78 +Button B: X+47, Y+11 +Prize: X=8090, Y=8347 + +Button A: X+65, Y+29 +Button B: X+23, Y+59 +Prize: X=3886, Y=2806 + +Button A: X+13, Y+58 +Button B: X+82, Y+33 +Prize: X=17126, Y=1844 + +Button A: X+15, Y+46 +Button B: X+52, Y+29 +Prize: X=14512, Y=8557 + +Button A: X+51, Y+19 +Button B: X+17, Y+57 +Prize: X=4573, Y=2565 + +Button A: X+16, Y+84 +Button B: X+43, Y+29 +Prize: X=2326, Y=2374 + +Button A: X+21, Y+80 +Button B: X+52, Y+12 +Prize: X=2872, Y=11268 + +Button A: X+16, Y+56 +Button B: X+42, Y+20 +Prize: X=1218, Y=17444 + +Button A: X+43, Y+14 +Button B: X+25, Y+38 +Prize: X=2364, Y=11092 + +Button A: X+34, Y+16 +Button B: X+42, Y+65 +Prize: X=19300, Y=16358 + +Button A: X+12, Y+47 +Button B: X+68, Y+29 +Prize: X=17592, Y=3390 + +Button A: X+38, Y+11 +Button B: X+55, Y+70 +Prize: X=4021, Y=1867 + +Button A: X+33, Y+13 +Button B: X+14, Y+52 +Prize: X=8642, Y=16058 + +Button A: X+74, Y+27 +Button B: X+12, Y+54 +Prize: X=5318, Y=5265 + +Button A: X+28, Y+44 +Button B: X+38, Y+11 +Prize: X=11126, Y=12365 + +Button A: X+34, Y+56 +Button B: X+44, Y+20 +Prize: X=14102, Y=5556 + +Button A: X+75, Y+85 +Button B: X+53, Y+16 +Prize: X=6607, Y=5549 + +Button A: X+81, Y+20 +Button B: X+35, Y+57 +Prize: X=2908, Y=3281 + +Button A: X+13, Y+30 +Button B: X+41, Y+19 +Prize: X=10899, Y=10340 + +Button A: X+11, Y+25 +Button B: X+64, Y+22 +Prize: X=18766, Y=8966 + +Button A: X+57, Y+15 +Button B: X+17, Y+42 +Prize: X=14691, Y=8777 + +Button A: X+19, Y+29 +Button B: X+72, Y+16 +Prize: X=7014, Y=3194 + +Button A: X+22, Y+57 +Button B: X+44, Y+21 +Prize: X=15632, Y=19217 + +Button A: X+48, Y+94 +Button B: X+86, Y+37 +Prize: X=11514, Y=11115 + +Button A: X+11, Y+53 +Button B: X+57, Y+22 +Prize: X=8712, Y=5709 + +Button A: X+92, Y+23 +Button B: X+12, Y+81 +Prize: X=7868, Y=7661 + +Button A: X+52, Y+79 +Button B: X+63, Y+22 +Prize: X=5604, Y=2322 + +Button A: X+20, Y+51 +Button B: X+95, Y+41 +Prize: X=9500, Y=8125 + +Button A: X+24, Y+85 +Button B: X+68, Y+46 +Prize: X=7808, Y=9339 + +Button A: X+16, Y+58 +Button B: X+83, Y+72 +Prize: X=2007, Y=4300 + +Button A: X+86, Y+16 +Button B: X+31, Y+75 +Prize: X=7780, Y=5186 + +Button A: X+21, Y+59 +Button B: X+89, Y+41 +Prize: X=2578, Y=3062 + +Button A: X+62, Y+13 +Button B: X+34, Y+86 +Prize: X=5006, Y=6334 + +Button A: X+75, Y+86 +Button B: X+80, Y+11 +Prize: X=6665, Y=1749 + +Button A: X+20, Y+55 +Button B: X+59, Y+47 +Prize: X=2643, Y=3004 diff --git a/2024/go/day14/day14.go b/2024/go/day14/day14.go new file mode 100644 index 0000000..2ed2ef6 --- /dev/null +++ b/2024/go/day14/day14.go @@ -0,0 +1,149 @@ +package day14 + +import ( + "adventofcode2024/utils" + grid "adventofcode2024/utils/grid2d" + "fmt" + "regexp" + "strings" +) + +type Robot struct { + velocity [2]int +} + +const SIZE_X = 101 +const SIZE_Y = 103 + +func Part1(input string) int { + grid := grid.NewGrid(SIZE_X, SIZE_Y, []Robot{}) + pattern := `p=(-?\d+),(-?\d+) v=(-?\d+),(-?\d+)` + re := regexp.MustCompile(pattern) + lines := strings.Split(input, "\n") + for _, line := range lines { + matches := re.FindStringSubmatch(line) + fmt.Println(matches) + x := utils.MustAtoi(matches[1]) + y := utils.MustAtoi(matches[2]) + x1 := utils.MustAtoi(matches[3]) + y1 := utils.MustAtoi(matches[4]) + robots := grid.Get(x, y) + grid.Set(x, y, append(robots, Robot{velocity: [2]int{x1, y1}})) + } + fmt.Println(grid.StringWithFormatter(formatter)) + ng := ticks(grid, 100) + fmt.Println(ng.StringWithFormatter(formatter)) + + return get_saftey(ng) +} + +func Part2(input string) int { + min_safe := 240096000 + min_i := 0 + max_safe := 0 + max_i := 0 + grid := grid.NewGrid(SIZE_X, SIZE_Y, []Robot{}) + pattern := `p=(-?\d+),(-?\d+) v=(-?\d+),(-?\d+)` + re := regexp.MustCompile(pattern) + lines := strings.Split(input, "\n") + for _, line := range lines { + matches := re.FindStringSubmatch(line) + fmt.Println(matches) + x := utils.MustAtoi(matches[1]) + y := utils.MustAtoi(matches[2]) + x1 := utils.MustAtoi(matches[3]) + y1 := utils.MustAtoi(matches[4]) + robots := grid.Get(x, y) + grid.Set(x, y, append(robots, Robot{velocity: [2]int{x1, y1}})) + } + fmt.Println(grid.StringWithFormatter(formatter)) + max_safe = get_saftey(grid) + for i:=0;i<7380;i++ { + ng := ticks(grid, 1) + safe := get_saftey(ng) + if safe > max_safe { + max_safe = safe + max_i = i + } + if safe < min_safe { + min_safe = safe + min_i = i + } + grid = ng + } + for i:=7380;i<7390;i++{ + ng := ticks(grid, 1) + fmt.Println(ng.StringWithFormatter(formatter)) + grid = ng + } + fmt.Println(grid.StringWithFormatter(formatter)) + fmt.Printf("max_safe: %d max_i: %d min_safe: %d min_i:%d", max_safe, max_i, min_safe, min_i) + return get_saftey(grid) +} + +func formatter(robots []Robot, x int, y int) string { + if len(robots) == 0 { + return " " + } + return "*" +} + +func ticks(g *grid.Grid[[]Robot], seconds int) *grid.Grid[[]Robot] { + ng := grid.NewGrid(SIZE_X, SIZE_Y, []Robot{}) + for y := 0; y < g.SizeY(); y++ { + for x := 0; x < g.SizeX(); x++ { + for _, robot := range g.Get(x, y) { + nx := x + ((robot.velocity[0] * seconds) % SIZE_X) + if nx < 0 { + nx = g.SizeX() + nx + } + if nx >= g.SizeX() { + nx = nx - g.SizeX() + } + ny := y + ((robot.velocity[1] * seconds) % SIZE_Y) + if ny < 0 { + ny = g.SizeY() + ny + } + if ny >= g.SizeY() { + ny = ny - g.SizeY() + } + robots := ng.Get(nx, ny) + ng.Set(nx, ny, append(robots, robot)) + } + } + } + return ng +} + +func get_saftey(grid *grid.Grid[[]Robot]) int { + robots := 0 + val := 1 + for y := 0; y < grid.SizeY()/2; y++ { + for x := 0; x < grid.SizeX()/2; x++ { + robots += len(grid.Get(x, y)) + } + } + val *= robots + robots = 0 + for y := 0; y < grid.SizeY()/2; y++ { + for x := grid.SizeX()/2 + 1; x < grid.SizeX(); x++ { + robots += len(grid.Get(x, y)) + } + } + val *= robots + robots = 0 + for y := grid.SizeY()/2 + 1; y < grid.SizeY(); y++ { + for x := grid.SizeX()/2 + 1; x < grid.SizeX(); x++ { + robots += len(grid.Get(x, y)) + } + } + val *= robots + robots = 0 + for y := grid.SizeY()/2 + 1; y < grid.SizeY(); y++ { + for x := 0; x < grid.SizeX()/2; x++ { + robots += len(grid.Get(x, y)) + } + } + val *= robots + return val +} \ No newline at end of file diff --git a/2024/go/day14/day14_test.go b/2024/go/day14/day14_test.go new file mode 100644 index 0000000..791e1d9 --- /dev/null +++ b/2024/go/day14/day14_test.go @@ -0,0 +1,527 @@ +package day14 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +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`) + require.Equal(t, 12, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`p=80,75 v=69,72 +p=88,10 v=-28,-23 +p=79,61 v=79,59 +p=37,102 v=92,-43 +p=12,22 v=-5,-95 +p=60,13 v=-30,-42 +p=3,59 v=-96,-88 +p=85,33 v=-43,-41 +p=44,14 v=63,45 +p=6,6 v=-34,-86 +p=47,102 v=12,42 +p=36,88 v=-88,-93 +p=78,27 v=-18,52 +p=96,64 v=-62,-34 +p=49,99 v=-78,-15 +p=57,31 v=-80,21 +p=25,57 v=8,-84 +p=69,20 v=81,61 +p=80,5 v=-11,-30 +p=2,35 v=-85,77 +p=9,12 v=-4,36 +p=37,68 v=12,-69 +p=47,88 v=-8,-90 +p=72,68 v=59,-86 +p=55,38 v=-68,-94 +p=60,58 v=41,37 +p=76,87 v=-1,-18 +p=89,9 v=38,92 +p=100,67 v=17,-53 +p=83,73 v=80,32 +p=77,19 v=-54,-20 +p=10,86 v=-65,36 +p=13,88 v=-64,-84 +p=50,29 v=-17,-29 +p=79,38 v=89,-57 +p=55,57 v=-68,22 +p=71,82 v=-80,52 +p=37,83 v=-68,-43 +p=25,5 v=81,-22 +p=83,54 v=-32,-75 +p=27,95 v=-77,-55 +p=70,97 v=-72,-4 +p=3,84 v=-60,-60 +p=16,29 v=-35,99 +p=39,39 v=37,-38 +p=76,94 v=90,60 +p=18,21 v=-86,-26 +p=22,84 v=-16,66 +p=45,83 v=-40,-43 +p=35,52 v=54,3 +p=30,21 v=14,36 +p=69,61 v=69,-66 +p=52,22 v=-28,33 +p=9,21 v=-85,-73 +p=87,32 v=79,52 +p=28,85 v=-35,85 +p=32,58 v=-49,89 +p=22,75 v=85,44 +p=45,19 v=-88,61 +p=97,59 v=98,-75 +p=70,81 v=82,7 +p=97,102 v=-23,-8 +p=92,68 v=89,72 +p=24,42 v=-63,-97 +p=21,64 v=-45,-47 +p=58,3 v=-69,51 +p=33,68 v=19,-20 +p=27,6 v=-89,-21 +p=28,81 v=-67,-8 +p=59,83 v=-66,-82 +p=3,14 v=-3,-1 +p=19,65 v=15,-25 +p=57,37 v=53,-29 +p=36,84 v=-4,-84 +p=55,96 v=82,-21 +p=68,101 v=51,51 +p=68,8 v=-90,-30 +p=78,51 v=-51,-63 +p=4,55 v=-63,97 +p=100,60 v=76,-13 +p=7,91 v=-96,-73 +p=97,17 v=-54,33 +p=85,60 v=69,-3 +p=20,39 v=96,-85 +p=24,12 v=86,-84 +p=34,7 v=-7,-36 +p=30,69 v=-67,97 +p=65,17 v=20,33 +p=39,101 v=-7,-83 +p=38,51 v=-90,-4 +p=99,61 v=-13,59 +p=30,1 v=-67,-96 +p=1,89 v=-85,-83 +p=8,1 v=68,4 +p=89,89 v=-52,85 +p=81,5 v=-55,71 +p=99,60 v=-94,-72 +p=68,70 v=-10,78 +p=81,18 v=89,-95 +p=47,61 v=-39,56 +p=91,71 v=85,59 +p=28,66 v=44,-28 +p=10,64 v=-59,-4 +p=84,10 v=-32,-11 +p=29,52 v=-37,34 +p=78,43 v=-92,12 +p=85,3 v=-71,4 +p=37,85 v=-46,-84 +p=56,21 v=21,-32 +p=17,17 v=15,17 +p=26,87 v=45,-93 +p=57,21 v=-6,40 +p=95,48 v=-33,59 +p=38,59 v=65,-72 +p=59,85 v=-50,-99 +p=17,21 v=86,-45 +p=53,3 v=-28,-46 +p=1,40 v=-54,-91 +p=61,13 v=-40,83 +p=33,35 v=-72,-96 +p=40,14 v=33,-8 +p=29,89 v=53,-59 +p=74,0 v=-22,-42 +p=12,32 v=-65,-4 +p=82,89 v=-12,20 +p=35,71 v=-40,20 +p=14,5 v=95,83 +p=46,44 v=39,92 +p=25,54 v=-66,-47 +p=91,78 v=64,53 +p=14,9 v=25,67 +p=39,29 v=-29,8 +p=20,100 v=95,51 +p=59,41 v=92,-82 +p=15,92 v=93,-73 +p=42,93 v=3,-86 +p=82,93 v=-21,-96 +p=50,9 v=12,-39 +p=81,22 v=-13,99 +p=72,81 v=-51,-93 +p=88,19 v=-72,-14 +p=8,93 v=-85,-15 +p=54,2 v=61,8 +p=44,81 v=66,41 +p=78,10 v=90,8 +p=19,53 v=68,4 +p=80,43 v=9,46 +p=11,38 v=-66,88 +p=31,3 v=4,-2 +p=49,28 v=-74,21 +p=27,15 v=54,-88 +p=96,87 v=-50,-67 +p=94,94 v=-5,-97 +p=16,89 v=73,23 +p=93,32 v=-53,93 +p=47,17 v=-29,92 +p=10,78 v=16,35 +p=55,33 v=-60,-17 +p=55,73 v=-68,-22 +p=100,62 v=17,-69 +p=67,91 v=-49,45 +p=68,53 v=-42,-41 +p=35,73 v=54,47 +p=20,63 v=-85,-12 +p=23,16 v=-87,33 +p=70,55 v=50,-16 +p=92,6 v=41,-59 +p=9,97 v=-37,47 +p=48,48 v=42,40 +p=96,37 v=-90,32 +p=66,13 v=-60,91 +p=62,46 v=-50,18 +p=11,15 v=98,77 +p=42,78 v=1,47 +p=10,40 v=15,-48 +p=88,44 v=7,-75 +p=27,53 v=-70,-9 +p=21,7 v=-56,96 +p=92,81 v=-22,69 +p=57,65 v=92,-34 +p=85,63 v=77,11 +p=92,2 v=-30,21 +p=59,16 v=73,-70 +p=16,11 v=86,-89 +p=82,16 v=80,-36 +p=41,30 v=-49,19 +p=13,6 v=14,73 +p=67,99 v=-91,51 +p=37,20 v=-65,-37 +p=85,16 v=99,-14 +p=1,39 v=-44,56 +p=37,29 v=74,5 +p=44,51 v=-18,93 +p=43,9 v=-55,-84 +p=5,10 v=-65,26 +p=51,90 v=-59,-96 +p=55,98 v=-9,23 +p=0,94 v=88,-49 +p=91,43 v=-14,-72 +p=93,43 v=-69,-94 +p=84,100 v=-12,54 +p=23,46 v=85,78 +p=79,37 v=39,-10 +p=1,23 v=99,-79 +p=73,50 v=-51,84 +p=78,58 v=-31,-16 +p=75,44 v=69,71 +p=27,5 v=-87,14 +p=95,91 v=-33,63 +p=22,94 v=-5,-37 +p=36,11 v=-5,-60 +p=18,3 v=-64,-27 +p=44,14 v=24,-92 +p=96,40 v=65,-92 +p=47,1 v=84,25 +p=93,22 v=68,-48 +p=14,32 v=-24,37 +p=99,17 v=78,-89 +p=53,36 v=10,58 +p=44,44 v=-78,-60 +p=15,28 v=-96,-20 +p=96,61 v=-81,-45 +p=58,87 v=-9,7 +p=20,43 v=84,-22 +p=50,42 v=-18,68 +p=74,23 v=-12,42 +p=12,57 v=-94,-94 +p=49,49 v=-89,40 +p=47,98 v=-67,-8 +p=84,17 v=-62,11 +p=31,6 v=-57,-42 +p=28,67 v=66,-81 +p=0,3 v=-88,-13 +p=51,76 v=82,76 +p=67,81 v=87,-14 +p=84,78 v=39,41 +p=39,74 v=72,35 +p=30,10 v=64,-77 +p=10,31 v=11,-4 +p=6,90 v=-4,76 +p=90,24 v=-2,-23 +p=8,39 v=-57,-27 +p=31,69 v=93,-25 +p=79,38 v=39,-35 +p=69,31 v=70,30 +p=1,16 v=7,73 +p=46,9 v=-99,-70 +p=53,16 v=-94,-84 +p=32,60 v=33,-69 +p=62,22 v=-99,-4 +p=66,3 v=98,20 +p=4,76 v=46,-75 +p=50,71 v=-90,22 +p=57,12 v=31,-15 +p=59,84 v=-50,-65 +p=33,0 v=76,-48 +p=58,76 v=-30,44 +p=6,69 v=6,35 +p=74,91 v=-61,-43 +p=36,92 v=-58,60 +p=2,78 v=-48,-98 +p=43,91 v=53,76 +p=34,101 v=-77,79 +p=40,44 v=-68,28 +p=71,64 v=47,-48 +p=54,7 v=84,15 +p=54,75 v=-60,-31 +p=14,40 v=86,12 +p=80,29 v=-92,-26 +p=8,47 v=-33,-69 +p=2,41 v=12,-9 +p=39,60 v=-38,59 +p=13,22 v=86,-20 +p=25,12 v=-57,11 +p=60,47 v=96,96 +p=50,51 v=-48,-82 +p=85,40 v=89,74 +p=99,4 v=-94,-21 +p=75,7 v=29,-73 +p=28,58 v=-80,24 +p=46,94 v=-9,56 +p=24,65 v=-76,62 +p=50,2 v=-20,70 +p=85,55 v=-5,66 +p=38,11 v=43,36 +p=53,54 v=53,24 +p=18,45 v=65,96 +p=94,22 v=16,80 +p=79,28 v=75,-69 +p=30,38 v=-15,-29 +p=5,23 v=-4,49 +p=8,98 v=96,-99 +p=7,60 v=-14,47 +p=96,17 v=88,-73 +p=48,23 v=-41,35 +p=17,31 v=-26,-23 +p=13,52 v=66,37 +p=58,19 v=41,55 +p=25,9 v=-77,-89 +p=3,92 v=55,-80 +p=74,95 v=20,-77 +p=26,70 v=43,72 +p=54,4 v=96,-18 +p=63,8 v=-97,49 +p=23,51 v=87,-75 +p=24,18 v=85,36 +p=8,52 v=6,-13 +p=97,50 v=17,-72 +p=47,66 v=-25,6 +p=38,78 v=3,-93 +p=62,6 v=5,77 +p=56,74 v=-70,-6 +p=94,99 v=9,34 +p=19,92 v=-18,26 +p=35,54 v=-47,-69 +p=92,8 v=-13,42 +p=47,86 v=12,-90 +p=12,83 v=-68,2 +p=0,18 v=-75,-89 +p=11,99 v=-99,14 +p=88,20 v=62,21 +p=27,53 v=53,-47 +p=17,44 v=-5,-91 +p=57,10 v=66,-65 +p=66,95 v=-71,-12 +p=38,21 v=23,95 +p=68,69 v=-31,35 +p=87,71 v=50,72 +p=98,12 v=47,33 +p=94,21 v=66,51 +p=53,97 v=-16,-93 +p=59,35 v=6,39 +p=12,88 v=-86,88 +p=85,16 v=39,8 +p=38,85 v=35,80 +p=44,9 v=-48,11 +p=71,18 v=-82,39 +p=85,14 v=-74,-73 +p=88,22 v=-42,36 +p=8,6 v=-58,38 +p=21,58 v=-66,9 +p=25,17 v=-68,95 +p=89,16 v=-34,-86 +p=33,54 v=64,-88 +p=57,8 v=54,51 +p=40,18 v=-98,58 +p=91,22 v=-34,-53 +p=75,81 v=-70,26 +p=89,70 v=-2,69 +p=62,6 v=-1,-92 +p=78,24 v=-82,-42 +p=47,7 v=-75,83 +p=86,8 v=-63,95 +p=80,64 v=-36,-79 +p=69,95 v=-30,29 +p=46,86 v=85,20 +p=76,35 v=-82,-51 +p=33,15 v=-17,55 +p=40,58 v=-2,-11 +p=76,31 v=39,2 +p=46,82 v=-15,-45 +p=14,53 v=36,-16 +p=98,66 v=68,-3 +p=83,38 v=35,-87 +p=41,9 v=53,70 +p=35,33 v=-68,-68 +p=53,66 v=62,97 +p=75,80 v=49,-62 +p=66,70 v=-50,47 +p=78,80 v=7,64 +p=82,16 v=85,-81 +p=58,25 v=11,-70 +p=36,72 v=33,72 +p=66,92 v=-91,10 +p=24,52 v=-98,22 +p=74,7 v=-36,-79 +p=46,26 v=-61,-90 +p=52,24 v=53,-88 +p=92,26 v=31,78 +p=60,52 v=80,-81 +p=82,78 v=-81,-49 +p=10,3 v=-15,-55 +p=91,31 v=99,77 +p=75,50 v=-91,40 +p=49,71 v=93,91 +p=1,94 v=-54,54 +p=96,50 v=39,18 +p=0,3 v=-53,33 +p=34,9 v=-17,-8 +p=96,28 v=68,-63 +p=25,4 v=66,21 +p=94,74 v=82,-89 +p=47,66 v=-17,87 +p=58,23 v=63,83 +p=13,82 v=-74,75 +p=29,85 v=40,79 +p=57,7 v=50,83 +p=7,88 v=-37,-16 +p=81,61 v=-10,34 +p=6,32 v=33,-60 +p=63,7 v=1,98 +p=59,29 v=-31,-85 +p=85,91 v=19,-18 +p=22,39 v=21,90 +p=25,13 v=75,89 +p=14,100 v=-27,30 +p=33,6 v=97,-53 +p=84,83 v=-22,38 +p=100,69 v=77,-38 +p=2,67 v=-14,-25 +p=71,71 v=-53,73 +p=9,43 v=-52,98 +p=55,76 v=-60,94 +p=49,91 v=-35,-95 +p=77,68 v=26,12 +p=41,91 v=-17,-15 +p=1,69 v=-44,72 +p=32,61 v=4,59 +p=94,12 v=-33,30 +p=1,35 v=96,49 +p=72,64 v=-61,-53 +p=76,93 v=38,-37 +p=97,9 v=33,61 +p=60,32 v=80,18 +p=16,68 v=15,-29 +p=99,72 v=66,44 +p=99,18 v=56,99 +p=42,11 v=-88,11 +p=57,69 v=-2,-2 +p=39,57 v=26,-51 +p=34,15 v=73,42 +p=56,55 v=-61,-75 +p=89,1 v=67,-27 +p=21,100 v=5,70 +p=85,11 v=-35,63 +p=16,35 v=47,-63 +p=98,0 v=93,-2 +p=51,89 v=-9,85 +p=50,32 v=84,-42 +p=29,63 v=78,-76 +p=92,86 v=89,10 +p=27,11 v=-77,51 +p=65,21 v=-59,68 +p=84,68 v=20,-50 +p=19,2 v=-24,-36 +p=25,78 v=25,-85 +p=90,92 v=59,-87 +p=70,100 v=10,-52 +p=48,78 v=3,54 +p=85,81 v=30,44 +p=53,65 v=41,-67 +p=13,95 v=82,-29 +p=5,19 v=95,75 +p=37,96 v=-68,26 +p=83,16 v=-5,-9 +p=31,17 v=4,-20 +p=83,34 v=-83,-76 +p=50,88 v=93,-5 +p=66,36 v=-30,58 +p=11,29 v=-44,83 +p=31,31 v=-77,-51 +p=26,85 v=14,-18 +p=8,76 v=65,69 +p=60,70 v=-40,47 +p=69,70 v=22,64 +p=85,53 v=18,12 +p=97,93 v=-58,-57 +p=52,83 v=92,-9 +p=20,92 v=30,50 +p=88,73 v=32,3 +p=83,16 v=-42,-14 +p=57,89 v=-29,20 +p=50,19 v=73,8 +p=8,101 v=-94,-68 +p=12,77 v=-4,-84 +p=63,28 v=-84,91 +p=46,25 v=13,-95 +p=93,21 v=88,-26 +p=10,54 v=-24,72 +p=69,16 v=-92,-30 +p=26,68 v=21,97 +p=56,30 v=-90,-51 +p=62,69 v=-1,-50 +p=7,6 v=55,-39 +p=63,78 v=76,92 +p=57,55 v=-51,-19 +p=70,62 v=18,37 +p=88,26 v=-61,82 +p=80,50 v=-73,99 +p=40,1 v=-78,86 +p=35,85 v=81,-12 +p=17,74 v=56,47 +p=36,99 v=64,-15 +p=56,18 v=-29,-14 +p=42,44 v=-18,46 +p=84,4 v=-63,-2 +p=97,75 v=27,-62 +p=47,71 v=54,-50 +p=26,101 v=-67,-83 +p=30,74 v=-57,66`) + require.Equal(t, 0, r) +} diff --git a/2024/go/day14/input.txt b/2024/go/day14/input.txt new file mode 100644 index 0000000..179e1e7 --- /dev/null +++ b/2024/go/day14/input.txt @@ -0,0 +1,500 @@ +p=80,75 v=69,72 +p=88,10 v=-28,-23 +p=79,61 v=79,59 +p=37,102 v=92,-43 +p=12,22 v=-5,-95 +p=60,13 v=-30,-42 +p=3,59 v=-96,-88 +p=85,33 v=-43,-41 +p=44,14 v=63,45 +p=6,6 v=-34,-86 +p=47,102 v=12,42 +p=36,88 v=-88,-93 +p=78,27 v=-18,52 +p=96,64 v=-62,-34 +p=49,99 v=-78,-15 +p=57,31 v=-80,21 +p=25,57 v=8,-84 +p=69,20 v=81,61 +p=80,5 v=-11,-30 +p=2,35 v=-85,77 +p=9,12 v=-4,36 +p=37,68 v=12,-69 +p=47,88 v=-8,-90 +p=72,68 v=59,-86 +p=55,38 v=-68,-94 +p=60,58 v=41,37 +p=76,87 v=-1,-18 +p=89,9 v=38,92 +p=100,67 v=17,-53 +p=83,73 v=80,32 +p=77,19 v=-54,-20 +p=10,86 v=-65,36 +p=13,88 v=-64,-84 +p=50,29 v=-17,-29 +p=79,38 v=89,-57 +p=55,57 v=-68,22 +p=71,82 v=-80,52 +p=37,83 v=-68,-43 +p=25,5 v=81,-22 +p=83,54 v=-32,-75 +p=27,95 v=-77,-55 +p=70,97 v=-72,-4 +p=3,84 v=-60,-60 +p=16,29 v=-35,99 +p=39,39 v=37,-38 +p=76,94 v=90,60 +p=18,21 v=-86,-26 +p=22,84 v=-16,66 +p=45,83 v=-40,-43 +p=35,52 v=54,3 +p=30,21 v=14,36 +p=69,61 v=69,-66 +p=52,22 v=-28,33 +p=9,21 v=-85,-73 +p=87,32 v=79,52 +p=28,85 v=-35,85 +p=32,58 v=-49,89 +p=22,75 v=85,44 +p=45,19 v=-88,61 +p=97,59 v=98,-75 +p=70,81 v=82,7 +p=97,102 v=-23,-8 +p=92,68 v=89,72 +p=24,42 v=-63,-97 +p=21,64 v=-45,-47 +p=58,3 v=-69,51 +p=33,68 v=19,-20 +p=27,6 v=-89,-21 +p=28,81 v=-67,-8 +p=59,83 v=-66,-82 +p=3,14 v=-3,-1 +p=19,65 v=15,-25 +p=57,37 v=53,-29 +p=36,84 v=-4,-84 +p=55,96 v=82,-21 +p=68,101 v=51,51 +p=68,8 v=-90,-30 +p=78,51 v=-51,-63 +p=4,55 v=-63,97 +p=100,60 v=76,-13 +p=7,91 v=-96,-73 +p=97,17 v=-54,33 +p=85,60 v=69,-3 +p=20,39 v=96,-85 +p=24,12 v=86,-84 +p=34,7 v=-7,-36 +p=30,69 v=-67,97 +p=65,17 v=20,33 +p=39,101 v=-7,-83 +p=38,51 v=-90,-4 +p=99,61 v=-13,59 +p=30,1 v=-67,-96 +p=1,89 v=-85,-83 +p=8,1 v=68,4 +p=89,89 v=-52,85 +p=81,5 v=-55,71 +p=99,60 v=-94,-72 +p=68,70 v=-10,78 +p=81,18 v=89,-95 +p=47,61 v=-39,56 +p=91,71 v=85,59 +p=28,66 v=44,-28 +p=10,64 v=-59,-4 +p=84,10 v=-32,-11 +p=29,52 v=-37,34 +p=78,43 v=-92,12 +p=85,3 v=-71,4 +p=37,85 v=-46,-84 +p=56,21 v=21,-32 +p=17,17 v=15,17 +p=26,87 v=45,-93 +p=57,21 v=-6,40 +p=95,48 v=-33,59 +p=38,59 v=65,-72 +p=59,85 v=-50,-99 +p=17,21 v=86,-45 +p=53,3 v=-28,-46 +p=1,40 v=-54,-91 +p=61,13 v=-40,83 +p=33,35 v=-72,-96 +p=40,14 v=33,-8 +p=29,89 v=53,-59 +p=74,0 v=-22,-42 +p=12,32 v=-65,-4 +p=82,89 v=-12,20 +p=35,71 v=-40,20 +p=14,5 v=95,83 +p=46,44 v=39,92 +p=25,54 v=-66,-47 +p=91,78 v=64,53 +p=14,9 v=25,67 +p=39,29 v=-29,8 +p=20,100 v=95,51 +p=59,41 v=92,-82 +p=15,92 v=93,-73 +p=42,93 v=3,-86 +p=82,93 v=-21,-96 +p=50,9 v=12,-39 +p=81,22 v=-13,99 +p=72,81 v=-51,-93 +p=88,19 v=-72,-14 +p=8,93 v=-85,-15 +p=54,2 v=61,8 +p=44,81 v=66,41 +p=78,10 v=90,8 +p=19,53 v=68,4 +p=80,43 v=9,46 +p=11,38 v=-66,88 +p=31,3 v=4,-2 +p=49,28 v=-74,21 +p=27,15 v=54,-88 +p=96,87 v=-50,-67 +p=94,94 v=-5,-97 +p=16,89 v=73,23 +p=93,32 v=-53,93 +p=47,17 v=-29,92 +p=10,78 v=16,35 +p=55,33 v=-60,-17 +p=55,73 v=-68,-22 +p=100,62 v=17,-69 +p=67,91 v=-49,45 +p=68,53 v=-42,-41 +p=35,73 v=54,47 +p=20,63 v=-85,-12 +p=23,16 v=-87,33 +p=70,55 v=50,-16 +p=92,6 v=41,-59 +p=9,97 v=-37,47 +p=48,48 v=42,40 +p=96,37 v=-90,32 +p=66,13 v=-60,91 +p=62,46 v=-50,18 +p=11,15 v=98,77 +p=42,78 v=1,47 +p=10,40 v=15,-48 +p=88,44 v=7,-75 +p=27,53 v=-70,-9 +p=21,7 v=-56,96 +p=92,81 v=-22,69 +p=57,65 v=92,-34 +p=85,63 v=77,11 +p=92,2 v=-30,21 +p=59,16 v=73,-70 +p=16,11 v=86,-89 +p=82,16 v=80,-36 +p=41,30 v=-49,19 +p=13,6 v=14,73 +p=67,99 v=-91,51 +p=37,20 v=-65,-37 +p=85,16 v=99,-14 +p=1,39 v=-44,56 +p=37,29 v=74,5 +p=44,51 v=-18,93 +p=43,9 v=-55,-84 +p=5,10 v=-65,26 +p=51,90 v=-59,-96 +p=55,98 v=-9,23 +p=0,94 v=88,-49 +p=91,43 v=-14,-72 +p=93,43 v=-69,-94 +p=84,100 v=-12,54 +p=23,46 v=85,78 +p=79,37 v=39,-10 +p=1,23 v=99,-79 +p=73,50 v=-51,84 +p=78,58 v=-31,-16 +p=75,44 v=69,71 +p=27,5 v=-87,14 +p=95,91 v=-33,63 +p=22,94 v=-5,-37 +p=36,11 v=-5,-60 +p=18,3 v=-64,-27 +p=44,14 v=24,-92 +p=96,40 v=65,-92 +p=47,1 v=84,25 +p=93,22 v=68,-48 +p=14,32 v=-24,37 +p=99,17 v=78,-89 +p=53,36 v=10,58 +p=44,44 v=-78,-60 +p=15,28 v=-96,-20 +p=96,61 v=-81,-45 +p=58,87 v=-9,7 +p=20,43 v=84,-22 +p=50,42 v=-18,68 +p=74,23 v=-12,42 +p=12,57 v=-94,-94 +p=49,49 v=-89,40 +p=47,98 v=-67,-8 +p=84,17 v=-62,11 +p=31,6 v=-57,-42 +p=28,67 v=66,-81 +p=0,3 v=-88,-13 +p=51,76 v=82,76 +p=67,81 v=87,-14 +p=84,78 v=39,41 +p=39,74 v=72,35 +p=30,10 v=64,-77 +p=10,31 v=11,-4 +p=6,90 v=-4,76 +p=90,24 v=-2,-23 +p=8,39 v=-57,-27 +p=31,69 v=93,-25 +p=79,38 v=39,-35 +p=69,31 v=70,30 +p=1,16 v=7,73 +p=46,9 v=-99,-70 +p=53,16 v=-94,-84 +p=32,60 v=33,-69 +p=62,22 v=-99,-4 +p=66,3 v=98,20 +p=4,76 v=46,-75 +p=50,71 v=-90,22 +p=57,12 v=31,-15 +p=59,84 v=-50,-65 +p=33,0 v=76,-48 +p=58,76 v=-30,44 +p=6,69 v=6,35 +p=74,91 v=-61,-43 +p=36,92 v=-58,60 +p=2,78 v=-48,-98 +p=43,91 v=53,76 +p=34,101 v=-77,79 +p=40,44 v=-68,28 +p=71,64 v=47,-48 +p=54,7 v=84,15 +p=54,75 v=-60,-31 +p=14,40 v=86,12 +p=80,29 v=-92,-26 +p=8,47 v=-33,-69 +p=2,41 v=12,-9 +p=39,60 v=-38,59 +p=13,22 v=86,-20 +p=25,12 v=-57,11 +p=60,47 v=96,96 +p=50,51 v=-48,-82 +p=85,40 v=89,74 +p=99,4 v=-94,-21 +p=75,7 v=29,-73 +p=28,58 v=-80,24 +p=46,94 v=-9,56 +p=24,65 v=-76,62 +p=50,2 v=-20,70 +p=85,55 v=-5,66 +p=38,11 v=43,36 +p=53,54 v=53,24 +p=18,45 v=65,96 +p=94,22 v=16,80 +p=79,28 v=75,-69 +p=30,38 v=-15,-29 +p=5,23 v=-4,49 +p=8,98 v=96,-99 +p=7,60 v=-14,47 +p=96,17 v=88,-73 +p=48,23 v=-41,35 +p=17,31 v=-26,-23 +p=13,52 v=66,37 +p=58,19 v=41,55 +p=25,9 v=-77,-89 +p=3,92 v=55,-80 +p=74,95 v=20,-77 +p=26,70 v=43,72 +p=54,4 v=96,-18 +p=63,8 v=-97,49 +p=23,51 v=87,-75 +p=24,18 v=85,36 +p=8,52 v=6,-13 +p=97,50 v=17,-72 +p=47,66 v=-25,6 +p=38,78 v=3,-93 +p=62,6 v=5,77 +p=56,74 v=-70,-6 +p=94,99 v=9,34 +p=19,92 v=-18,26 +p=35,54 v=-47,-69 +p=92,8 v=-13,42 +p=47,86 v=12,-90 +p=12,83 v=-68,2 +p=0,18 v=-75,-89 +p=11,99 v=-99,14 +p=88,20 v=62,21 +p=27,53 v=53,-47 +p=17,44 v=-5,-91 +p=57,10 v=66,-65 +p=66,95 v=-71,-12 +p=38,21 v=23,95 +p=68,69 v=-31,35 +p=87,71 v=50,72 +p=98,12 v=47,33 +p=94,21 v=66,51 +p=53,97 v=-16,-93 +p=59,35 v=6,39 +p=12,88 v=-86,88 +p=85,16 v=39,8 +p=38,85 v=35,80 +p=44,9 v=-48,11 +p=71,18 v=-82,39 +p=85,14 v=-74,-73 +p=88,22 v=-42,36 +p=8,6 v=-58,38 +p=21,58 v=-66,9 +p=25,17 v=-68,95 +p=89,16 v=-34,-86 +p=33,54 v=64,-88 +p=57,8 v=54,51 +p=40,18 v=-98,58 +p=91,22 v=-34,-53 +p=75,81 v=-70,26 +p=89,70 v=-2,69 +p=62,6 v=-1,-92 +p=78,24 v=-82,-42 +p=47,7 v=-75,83 +p=86,8 v=-63,95 +p=80,64 v=-36,-79 +p=69,95 v=-30,29 +p=46,86 v=85,20 +p=76,35 v=-82,-51 +p=33,15 v=-17,55 +p=40,58 v=-2,-11 +p=76,31 v=39,2 +p=46,82 v=-15,-45 +p=14,53 v=36,-16 +p=98,66 v=68,-3 +p=83,38 v=35,-87 +p=41,9 v=53,70 +p=35,33 v=-68,-68 +p=53,66 v=62,97 +p=75,80 v=49,-62 +p=66,70 v=-50,47 +p=78,80 v=7,64 +p=82,16 v=85,-81 +p=58,25 v=11,-70 +p=36,72 v=33,72 +p=66,92 v=-91,10 +p=24,52 v=-98,22 +p=74,7 v=-36,-79 +p=46,26 v=-61,-90 +p=52,24 v=53,-88 +p=92,26 v=31,78 +p=60,52 v=80,-81 +p=82,78 v=-81,-49 +p=10,3 v=-15,-55 +p=91,31 v=99,77 +p=75,50 v=-91,40 +p=49,71 v=93,91 +p=1,94 v=-54,54 +p=96,50 v=39,18 +p=0,3 v=-53,33 +p=34,9 v=-17,-8 +p=96,28 v=68,-63 +p=25,4 v=66,21 +p=94,74 v=82,-89 +p=47,66 v=-17,87 +p=58,23 v=63,83 +p=13,82 v=-74,75 +p=29,85 v=40,79 +p=57,7 v=50,83 +p=7,88 v=-37,-16 +p=81,61 v=-10,34 +p=6,32 v=33,-60 +p=63,7 v=1,98 +p=59,29 v=-31,-85 +p=85,91 v=19,-18 +p=22,39 v=21,90 +p=25,13 v=75,89 +p=14,100 v=-27,30 +p=33,6 v=97,-53 +p=84,83 v=-22,38 +p=100,69 v=77,-38 +p=2,67 v=-14,-25 +p=71,71 v=-53,73 +p=9,43 v=-52,98 +p=55,76 v=-60,94 +p=49,91 v=-35,-95 +p=77,68 v=26,12 +p=41,91 v=-17,-15 +p=1,69 v=-44,72 +p=32,61 v=4,59 +p=94,12 v=-33,30 +p=1,35 v=96,49 +p=72,64 v=-61,-53 +p=76,93 v=38,-37 +p=97,9 v=33,61 +p=60,32 v=80,18 +p=16,68 v=15,-29 +p=99,72 v=66,44 +p=99,18 v=56,99 +p=42,11 v=-88,11 +p=57,69 v=-2,-2 +p=39,57 v=26,-51 +p=34,15 v=73,42 +p=56,55 v=-61,-75 +p=89,1 v=67,-27 +p=21,100 v=5,70 +p=85,11 v=-35,63 +p=16,35 v=47,-63 +p=98,0 v=93,-2 +p=51,89 v=-9,85 +p=50,32 v=84,-42 +p=29,63 v=78,-76 +p=92,86 v=89,10 +p=27,11 v=-77,51 +p=65,21 v=-59,68 +p=84,68 v=20,-50 +p=19,2 v=-24,-36 +p=25,78 v=25,-85 +p=90,92 v=59,-87 +p=70,100 v=10,-52 +p=48,78 v=3,54 +p=85,81 v=30,44 +p=53,65 v=41,-67 +p=13,95 v=82,-29 +p=5,19 v=95,75 +p=37,96 v=-68,26 +p=83,16 v=-5,-9 +p=31,17 v=4,-20 +p=83,34 v=-83,-76 +p=50,88 v=93,-5 +p=66,36 v=-30,58 +p=11,29 v=-44,83 +p=31,31 v=-77,-51 +p=26,85 v=14,-18 +p=8,76 v=65,69 +p=60,70 v=-40,47 +p=69,70 v=22,64 +p=85,53 v=18,12 +p=97,93 v=-58,-57 +p=52,83 v=92,-9 +p=20,92 v=30,50 +p=88,73 v=32,3 +p=83,16 v=-42,-14 +p=57,89 v=-29,20 +p=50,19 v=73,8 +p=8,101 v=-94,-68 +p=12,77 v=-4,-84 +p=63,28 v=-84,91 +p=46,25 v=13,-95 +p=93,21 v=88,-26 +p=10,54 v=-24,72 +p=69,16 v=-92,-30 +p=26,68 v=21,97 +p=56,30 v=-90,-51 +p=62,69 v=-1,-50 +p=7,6 v=55,-39 +p=63,78 v=76,92 +p=57,55 v=-51,-19 +p=70,62 v=18,37 +p=88,26 v=-61,82 +p=80,50 v=-73,99 +p=40,1 v=-78,86 +p=35,85 v=81,-12 +p=17,74 v=56,47 +p=36,99 v=64,-15 +p=56,18 v=-29,-14 +p=42,44 v=-18,46 +p=84,4 v=-63,-2 +p=97,75 v=27,-62 +p=47,71 v=54,-50 +p=26,101 v=-67,-83 +p=30,74 v=-57,66 diff --git a/2024/go/day15/day15.go b/2024/go/day15/day15.go new file mode 100644 index 0000000..349865b --- /dev/null +++ b/2024/go/day15/day15.go @@ -0,0 +1,119 @@ +package day15 + +import ( + _ "adventofcode2024/utils" + _ "adventofcode2024/utils/grid2d" + _ "adventofcode2024/utils/grid2d" + "adventofcode2024/utils/inputs" + "fmt" + _ "regexp" + "strings" + + _ "github.com/deckarep/golang-set/v2" +) + +type Loc struct { + x int + y int +} + +type Queue struct { + elements []Loc +} + +// Push adds an element to the end of the queue +func (q *Queue) Push(value Loc) { + q.elements = append(q.elements, value) +} + +// Pop removes an element from the front of the queue +func (q *Queue) Pop() (Loc, bool) { + if len(q.elements) == 0 { + return Loc{}, false // Return zero and false if the queue is empty + } + value := q.elements[0] + q.elements = q.elements[1:] // Remove the first element + return value, true +} + +// IsEmpty checks if the queue is empty +func (q *Queue) IsEmpty() bool { + return len(q.elements) == 0 +} + +func Part1(input string) int { + var val int + var rloc Loc + in := strings.Split(input, "\n\n") + dirs := map[rune][2]int{ + '<': {-1, 0}, + '>': {1, 0}, + '^': {0, -1}, + 'v': {0, 1}, + } + grid := inputs.ToGrid2D(in[0], "\n", "", ',', func(c string) rune { return rune(c[0]) }) + directions := strings.ReplaceAll(in[1], "\n", "") + fmt.Printf("%v\n", grid.StringWithFormatter(formatter)) + fmt.Printf("%v\n", directions) + found := false + for x := 0; x < grid.SizeX(); x++ { + if found { + break + } + for y := 0; y < grid.SizeY(); y++ { + if grid.Get(x, y) == '@' { + rloc = Loc{x: x, y: y} + found = true + break + } + } + } + fmt.Printf("Robot: %v\n", rloc) + for _, dir := range directions { + q := &Queue{} + x := rloc.x + y := rloc.y + Loop: + for { + x += dirs[dir][0] + y += dirs[dir][1] + switch grid.Get(x, y) { + case 'O': + q.Push(Loc{x: x, y: y}) + case '.': + for !q.IsEmpty() { + grid.Set(x, y, 'O') + loc, _ := q.Pop() + fmt.Printf("%d,%d\n", loc.x, loc.y) + // grid.Set(loc.x, loc.y, 'O') + x -= dirs[dir][0] + y -= dirs[dir][1] + } + grid.Set(rloc.x, rloc.y, '.') + rloc.x = x + rloc.y = y + grid.Set(rloc.x, rloc.y, '@') + break Loop + case '#': + break Loop + } + } + // fmt.Printf("%v\n", grid.StringWithFormatter(formatter)) + } + for x := 0; x < grid.SizeX(); x++ { + for y := 0; y < grid.SizeY(); y++ { + if grid.Get(x, y) == 'O' { + val += (100 * y) + x + } + } + } + return val +} + +func Part2(input string) int { + return 0 +} + +func formatter(p rune, x int, y int) string { + return string(p) +} diff --git a/2024/go/day15/day15_test.go b/2024/go/day15/day15_test.go new file mode 100644 index 0000000..3abc33f --- /dev/null +++ b/2024/go/day15/day15_test.go @@ -0,0 +1,57 @@ +package day15 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`########## +#..O..O.O# +#......O.# +#.OO..O.O# +#..O@..O.# +#O#..O...# +#O..O..O.# +#.OO.O.OO# +#....O...# +########## + +^v>^vv^v>v<>v^v<<><>>v^v^>^<<<><^ +vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<^<^^>>>^<>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^v^^<^^vv< +<>^^^^>>>v^<>vvv^>^^^vv^^>v<^^^^v<>^>vvvv><>>v^<<^^^^^ +^><^><>>><>^^<<^^v>>><^^>v>>>^v><>^v><<<>vvvv>^<><<>^>< +^>><>^v<><^vvv<^^<><^v<<<><<<^^<^>>^<<<^>>^v^>>^v>vv>^<<^v<>><<><<>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^ +<><^^>^^^<>^vv<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<> +^^>vv<^v^v^<>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<>< +v^^>>><<^^<>>^v^v^<<>^<^v^v><^<<<><<^vv>>v>v^<<^`) + require.Equal(t, 10092, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`########## +#..O..O.O# +#......O.# +#.OO..O.O# +#..O@..O.# +#O#..O...# +#O..O..O.# +#.OO.O.OO# +#....O...# +########## + +^v>^vv^v>v<>v^v<<><>>v^v^>^<<<><^ +vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<^<^^>>>^<>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^v^^<^^vv< +<>^^^^>>>v^<>vvv^>^^^vv^^>v<^^^^v<>^>vvvv><>>v^<<^^^^^ +^><^><>>><>^^<<^^v>>><^^>v>>>^v><>^v><<<>vvvv>^<><<>^>< +^>><>^v<><^vvv<^^<><^v<<<><<<^^<^>>^<<<^>>^v^>>^v>vv>^<<^v<>><<><<>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^ +<><^^>^^^<>^vv<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<> +^^>vv<^v^v^<>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<>< +v^^>>><<^^<>>^v^v^<<>^<^v^v><^<<<><<^vv>>v>v^<<^`) + require.Equal(t, 0, r) +} diff --git a/2024/go/day15/input.txt b/2024/go/day15/input.txt new file mode 100644 index 0000000..923444c --- /dev/null +++ b/2024/go/day15/input.txt @@ -0,0 +1,71 @@ +################################################## +#...O.#..O....##O..OO.#O..#.#.......OO...#O.#OO..# +#O#..OO...O..O.O.....O.O.O....OO#.....O#.O.OO..O.# +#........O....#...O......O.OO...#..O.O.#O#....O..# +#..O.OO..O..O.#..O.O.OO.O...O...O......#O.....O..# +#..OO.....O.OO.O#.......O.........O.....O.O.O....# +#.O.#.O.O#......OO........O.O.....OO..O.O.O.#.#O.# +#........#.....#.##O....O.O..OOO.......OOO.#O....# +#.O#.#...OO.....#.......O...O...#O.O.......OO..OO# +#.O...O..#O...#O..O.........O.O..OO..O.......O.OO# +#O.O......O.OO..O.O.......O.OO#O.##...#....#O.O.O# +#.O...O.OO.O....O..O.O...O...#.O....OO..O.O#O#OO.# +#.....O.O..#O.....O.O..##O.O#OO...O...O.O.O......# +##..O...O..OO.O.O.O..OO........#.##.........O.O..# +#..O...O.OO..OOO.O...#..#.........#.O....OO......# +#O....OOO.OO...O##.O.OO..O.O.....O.O.OOO....O.O.O# +#O.O..OO.O..OO............O....O....O..OO...OO..## +#.O...O.O.O.....O..O.O...O.#.......OOO...........# +#O.O...O.....#..O..#O...O.O.O....O#...#.###.....O# +#.O...O.O..#O.#.OO.......O.OO.O...O...........O..# +##O.#O....O.#............O..O..O.....O..O..OO....# +##..#.OO.O.OO.#.O....O...#........#........O.O...# +#..O.OO...O....#..OO.O...........OOOO#..OO#O.....# +#OO.O#...#..#...O#........O.OOO...OO....#O.OO#OOO# +#...OOO............#O.#.@...O.....O#.#.O...O..O..# +#...O...OO.#..O......O..............#OOO......OOO# +#..#OO...O.#O......O..OO.O#...O....OO..O...O.O#O.# +#.#.##...#O........#.O.....#O#.O.OO..OOO..#..O...# +#.#....#...O..O#O..OOO.....#....#......O...O...#.# +#....O....O......O.O.O..........O.O..O.O......O..# +#.#OO#O.OO............O##.##O.O#.O...O#.........O# +##.O.#..........#......#OOOO.OO.#.O.O.O.....O..#.# +#O.....#OO.....O..............#...O.O..O.....OO#.# +#O.O.O..O#OO.O.O....O..O......O..O........OO.....# +##O....O...............................#.O.....O## +##..O...#...O.........O#...#O...O.OO......OO.O..O# +#O..OO.....OOOO.#......O.#OO..O.O...O.O...O.O.O#.# +#..O.....O.O........O.....O.....O#....OO##OOO..#O# +#O..##....OOO..O#.O....O.#...O.....O.O.O......O.O# +#..OO.#O.......O.OO.O#O.O.....O.....OO..OO.OOOO..# +#.#.#OO.O..O.O........O#.#...#..O.O.O.#.O..OO.O.O# +#..O#.OO.O.#.....O...O..OO#..O...O.O#...O.....#.O# +#.OO.OO....O.O..O..#OO.....#......#.#OO..#.#O.O#.# +#...O....#..#......O....O..O#O...O....OO.......O.# +#.#.....O#.......O..O..#O.OOOO..........O.O......# +#.O.O.....OO.O.O.O..#O.O.O..O.OO....O....##.....## +#O..#.OOO##....O.O..OOOO.O...O..O#..........O....# +##.O##...O.O.....O.O#...O.........#...........OOO# +#O#O.....#..O.OOO...O..OO.....OOO............#O..# +################################################## + +^^<^>^^<<^v>^><^^^^^<><^v>v<^vv>^v<^>>v>^vv<>>>>>v^>v>^>^v<^v^>^^>v<<>>^v^v>^>v^>^^^<^^v>>v>^>v<^^vvv<>vvv<^v<>v><><^^<>v^^<^><>>^^>v^>^<><<^><<>v>>vvv<^^v^v^>>v^^>^vv<^<^<^<><>>>^>>^<><^v<^<^v<^^>^<><<^<<^vv^^v^<^^vv>>^v>^v>^<^>^><>^v<>v>^^^<^vv^^<^v><^^^v<<>>>^<^^>^v>>^^<^^>^>><<^>>vv<>v^^<<>^<><>^^v<^v<<>vv><^>><^<^>>^^>v<^>v^>^<<^^^^v^<>^>^v^^vv<><<vv^v>>>v>>>>>^v>^<><<<><>v<>^vv>v<>^v^<>>v>>v^>^vv^vvv^^<<>vv>^>^v>>v^^vv<^v>^^vv<>^v>^>v^^<>^^>^^v<>^^^<^^<>^>^v><<>>^<>>v>>^><^>v<>v^v<>^<<>>v>^v<>^v<^>^^v>v>>^<^^^<<<<>vvv^v><<^^^v^^^>v><<^^v>vv^v>^>^v<>>vv<<^v<>v><^><>>^vv><>><><<>>v>><>v^^<^v<>^<^<^>v^^^>>v<^^<^^^>^^>^>^>^^<>v>vvv^v^>^<^<>v>^^>v<^>v>v>><> +^vv>>>^vv><^v^<>v>^><^^^>^v>><>>^>^<<^^v^^vv>^v^<^v^>vv<<>^>vvv>v>^vvv>>vv^>v^^v^^vv^^<><<<^^><<^>>>^<>v>>^v>v>><>v><<^v^><>v>v>^>>^^><>v>^>^v>^>><<<^vv<>^<<^><^<<><>vv^^v<<>v>v^vvv>^>^>^<>v<>vv>^>>v^^v<>><>>v<>>^^<>v^vvv<><^^v^>vv<^^>>>v>^>^^><<^v>^^>>^^>v<<<><<><>vv^>v>v^>vv><^<>><<>^>vv<<>v><^^^>v^^<^v>v^<>^<<>^^vvv>vvv><<><^><>>><<>>^><^>^><><^^vv<^>^vvv<^>>><<^>><^v<<^>v>^v>v>>^vv^>>><^>v^<>>v>v^v^><^v^v^<^v<>^><^>>v^^>v<^^^v>v>^^^<^^><><^>>v<>v<^v>^^<>v^>^vv<<^<^v^^^>v^vv<>vv>^^<<><^>><<^v<^>v>>^>><<^<>vv^>v><>^vv^^v>v<<>^<><^^>^^><^>>^v>vvvv>^>v><<^^><^v^<^v><^>vvv><^v<>><<^^>^<^<<<v>^v^>^>vv^<><><>^^<^v^^>^^^^^vv<<<^vv<<<>><>v>vv>^^^<^><><<><<>><^vv^^<v<>^^^^<><^^^<>^^<><<>>>^<>v^^>^^>>^v>v^ +^>>v<><<<<v<<<<^v<>v<<^vv<^vv<^^>>v^>^v^>^<>>>v<^<<^^>>vv^^<^^^>^><>>>vv<>vv<>^^>vv^vvvvvv^v>^^<<^<<<>v>^<^v>vv<>^^>^>><^^^v<>^<^v>^><><<<^><>^>^^vv^>^<<<^>^v>^v<<<>^^<^^<<^<^^<>^<<<^v^<>^>vvv><<<^vv^<^><>><><>v^^>v<^<^vv<>><^>v>^v<><>>^v^^^^v^<<><^^v>><>^v^<>>^v>v^^v<^v><>>v><^^<<^v<>v<<^^>><<<^>>vv>^<^>^<^v^<^v>>>>>><^vv<^>v>>v^>>vvv^vvvvvvv>^^>>>^v<>><>^<<<>^><^^v^v<>><^>^>v><>>v^>^<^<^><<^<>vv^^v^<>v<<<^>>vvv^>><<^<^^><^^>>>v>^^^>^vv^<<>^^^<^v>><>>>>v^<>>^^^<>v^^v^>><<>v>>^>^vvv><>^v>vv^v>>^><>^>v<<^>><^^v><^>^^>^>vv><<<^vvvvv<^<^<^<^^<>v^^>^v<^^v<>v>^>^>vv^>v>^^<^<^^v><^<^^v^v<>>^>v^v<^v>>><^v<^<<^v<^vv^^><>^v<><^>v<>vvv^^^>^^^^^v<^^^^v<><<>>>v^v<>v^^^>^vv>v>v>>><>v>vvvv>v>>vvv>^v<>^^v^<^vv^^>^^>>vv<><^vv>^<^>><<>>v>vv^vv<^<<<<>^v<<>>^v<>>>^v><<<><^<^><>>>>v^>v<><^v>v^>^^v^^>v<v<^v^^<<<^v^^vv^vv>vv^>^^vv^<^^<^>>>>^><<>^>^v^<^v>v^v><<>v^<>>v^^^><<^>^>^<^vvv>>^<^><^v>^^<><^^^>^><^^>>v^vvv><^<v>>^<<<<>^vv^>^<^<<>><^>vvv>v>>v^><><>vv>>^vv>>vv<^<>^^^>^>v>^v><^v^>v^^v^>^>vvvvvv<<^^<^<>^^^v><>><<<^^<>v<>vv<^<^v^v>v>v^vv^v<^v^<<<<^^<<>v<<<<<>v<^vv<>^<>><><^<^^<^<>v<>^<<<>vv<^vv<>^^<>v><><<<^<^>v^vv>vvvv^>v<^^^v<<<>>^>>^>>vv>>>v>v^<<>^^v>v^>^<^^<^^>><^^>v>v>^^>v>>>^<>^^v^v>^^<^v>^v><<v^>v^vvv><<^>>v^^>>>^vvvv^>^^v^^>vvv>^v^^^v^<^>v>>>^^<><>vv>^vvv<<>>v^<>^<^<vv^<v>v><^^>^>vv<^^<^^v<>^vvv^^v^vv>>^>v>v<^^<>vv>^<<>^^^>^<^<^>v>vv^^><>^>^v>>^<> +^<^^<^>v<^<^>^^>><<<>v<^^><>>^^<^^>^v^^><^v^^<^vv><>>v<^v^>>>^<>>^>^>^<>^^^<^v<>vv^v^^<^>v>^>><<>>v<><^<<<>v>>^<>>>>v>^v^<<<>^vv<<^>vv>vv>><^><><<>v><^<>v>>>><><>^vv<^v^vv><<^>v>v<<><>^>^v<^>v>v<>v<<>^vv>v><>><<<>>^^^<^^^^<>^>>vv>^v<^>>vv>^^v>^vv^^^v>v>>><<<>>>v>vv<^>^v>vv^^^<><>v<^>><^vv>^<<^<>><<<<^^>^^<><>v><<^v<<<<<^v>v<^^v<<^<>^><<<>>v<<^v>v>>>v<>>v><><^vv<^^<v>vv^<>^^>>>><<<>^^^^v>v>>>>^v><<^^>v^<v<>>^^v>^><^v>^>^^vvvvv>^>v>v>v>v^^^>^<><<^^^^<>^<^v>^>>>>vv>>>v^>^><^^v>>^>>vv<^^<>>vv^^v^<>>>vvv<>^>vv^<<^<^<>vv>^>v>v<^<<><^v^<^^^<^^^^vv^>^^>^^>><>^<^>v>v<^>>^^^^>^^><>vv><^^>v>^^^^v>^v>^v<^v^>v>^>^^^>v>v^^v^v>^v<^^^>^>vv^^vv>vv>v^v<^<^vv^>^^v>^vvvv<>^^v<>><<v<^>><><^><>>^< +^><^v>v^>vvv^^v^vv<>>>v>>vv^^>v^><^^<>v^><>^v^>v>^^>><<^><>v><^v>>>><<<>v^><<<>><<>^v^^^^<^^><><>^^vv^<^v^>>^>^><>vv^>>>>v^<>vv^>>v^<>vv>>><^><^>^vvvv><<^vvv^<>>v^v>><^^^><>>v^>^<^^><<<>vvv^^^v>^v<>v^>v<>v>v<>^v>vvvv<^>^^^v^^<>^<^^v>>^^^><>v^>><^>vv>><^^^v>><^<<^><<>^>^<>vv>vv^^^^<^>^v<>>^v>>>^v<>v<^v<<^v^v<<<^>>v^v^v<<^^v>vv^>v><>v>^vv>^v>>^<<^><>v>^>v>^<<^<>>^^v<>^>v^<>^v>vvv<><<>>^<^^>^<<>^<>vv^^v^^<<>v<<><^<^^<>>><<^v<<^>v<>vv>^>>>>>vv<<><^^vv^>v^<>v<<<>^>^v>vv^^<^v>v<^<>>^vv>v^<>^v^<>^>><><>v>>v>^><^><^>v><<>>^^^<<^v>v>^vv^>>>^^<>v<^<^>>^v^>v<><^>>>vvv^^^^>vv>^>>>><^<>^>v^v>v<^>>>><^^vv><<>vv<>v<>>^>^^<>>vv>>><<>vvv<<>>vv>^<^^v>>v>^<<<><^v^v^>^v^><<>^v><>>^^>v>>>^^>>v<>>>^v>^v^<<^<<<><>vv^>vvv>^^v>v<^v^v^><^v<>^v>^<>><<^v>vv^ +^>v<>>^vvv>>v^vvv>>v^><>><^v<>vv^>^^><<>><^<^>^v<>v>>v^<>>^<<^vv<^^<>^v><<>>^^<<^vv^v>^>^<>v>>>^<^<^<>v<^><<^><<>>vv><<><>^>>v^^>>>^v<^^<v><>><^<<^v>>^vv^v<>^>><>>>^<>>v><>>^^v>>^><^^^>^^>^>^>^vvvvv<^^>>>>v>vv>v>^vv^v<^v>^>^>vv>v<>v<><<>v^v<>><<<v<<>^v^><>v<><^v>^>^><^^^>v<>vvv<<^^v>^vv^<^>v>>>v>^^><^>^v>^v^^>^^v><>>^<^><^^v^^vv<^>^^>^>>vv<^>vv<<<>><><<^^v><^<^<>v^v>^v^<<v^<<<<v^<>v<^^<<^>^v<<><>><><<<^^>v>^^<^^>v>v<^v>^>>v>>v>v><^v^v<^v>^vv^><^v>><<^<^^^^^^>>v>v^<>v>>v<>v^>v><<<^v^<^<^<>^>>v>>>v>^vv>^^<>v^v>v><^v^>v>>^<^v>>>v>v>vv>^^^>vvvv^><^>^^^v<^><>^^<<^<<^^<^^>^<>^<^<^^v<^^<<>>>^v>^^^^^^^^<>v><^<^v><^>^v^^v>v^^<>vv^<^^v<>v^>^v>v<<<<>><>^<^<^<<><>>^<><<^^<>v^>>^vvv^<^^v^^v<<><^>vv>>^v<^^>^^>^>> +^>vv>^^>v^>>^><>>^<>v><<>v>v^^^>>v>>vv^^<<<>v^^v<<>v>>^<>^v<^^^<><^<<>^<>>v^vvv^v^<^>v^<^^<<^^<<^v<><^v^^v^v^v^^>v^><^>vv>>^><^<v>v>><>^v>^^<^>>v^<<>v<v^>vv>vv^>v^vvv^<>^v><<<>v^vv>vv<>^><^<><^v>>v<<^^^><^>^<>v^^v^^><^^>>v^^<>v>><>v<<^^^^^<<><>^vv^<><<>v>>>^><<^<><>^^v^vv>>v^vvv<>><><>^vv^v>^<^<^v>>>><^>>v>^v><<>^^<>^v^<>vv^<^<>^<<>v><^<^^^^>^<>^^^^<^^>v<<<v>v>>^vv>vvv^>v^vv>v^>vv^v<>>>vv>^>>^^^>><^^v^^<^^>vv<^v>v^vv<<^^<>^vv<^vv>vv<>>^<<>^<<>v<<>v<>v^^<>vv>^^>^vv^v>^<>v^v^>vv^^^>^>><>v><>>>v>>>v>v^v^v>v<^>^<^^>v<>>^><^^<^^<^v^v>vvv<^vv<^<><>^<v^>vv^^^>^>^>><<^>>^v^>v^^^v<^^^<^>>v^v<>^<><v><^^v^<^>>^^v^>>^<<<>v<^^^^<<^^v^^^^^>vv^>>v<^><<<>v^<>v>^ +^^<<>^<^<<<>v^^v>v>>^^^^^^<><^^<<^^v<>^^<^>^v>>>><><<<^^v^<><<<><<^v<<^v>vvv>><^>^>^><^>^>>>v^<<<<^>>v^><^^vv>vv<^>><^^v^^vv<>^^v<>^>>^^vv^^>>v^>>><v<^v^vvv>vvv>^v>^^^<><>v>v><<><^v>>>^<<^vv^^>>^<^^v^>v^<><<^>v>^v^<<><><>v^>>>v>><<^^v^vv^v<><^vvvv^>^><>>>>v^>>^vvv^<><^v>vv<>^><><^>v>vvvv>^^>vvv><^>^v>>^>v>^v<>>>>^^>^>v>^^>^^>>><^<^^v^^^^>^v>v<v^vvv>>v^<^v^v<^v^v<^<<>^v^<>>v>v>^^vv>^v><>^^<<<>v<>v>v><<<<^vv>^>>v><v<^v>v<<>><<>^><<^>>vvvv^<^v^^>>vv>><^vv<^^^>>>v^>^v>vvvv^>>v^><<^<^>^>^>v><><<<^<^vv^<<<>^<<^^<<>v<>><<<>>>>^>v>^^><>^><v>^>^v<^v^v>^<^v^^><<<>v>>v^vv>^^^^v><^>><><<^^<>vv^v^<>^>^<>v<^^>>>^>^>><<<><^>>^v><<>vv>><<>v^^>v>vv<^v<^>v^v>>^v<><<<>^v^<><^v<<vv>>^>^>^>>v>^<^v<<<>^v^v>^v<>v>v>><^<<><>v^^^v^<<^v>>><^^^v>vv>v<>v<>^^> +>^^<^v>v<<^<>^^>^<>vv>v^>^<^v^^>^>vv^<>><<>^v>^>v^v<^^^>v<>v>>>vvv<>^^^vv<^v<^v^<^<>>v<>^><<^<^><^<vv^>><<>>^vv>vv^^>v^^vv<>><>^vv^>v>>^^<^^v^>^^v<>^<<<<^v^^v>>v^^v>^^<^<^>>v^v>^<^v<>>^vvv<^vv>^<<<>^^^<^^^vv^^^<>^^v>>>><^>vvv<^><>^<><>^^>>^<<^>^^<>vv^vv<>v<^>vvv><^<^v>vv<^^^>v>>vv<>><^^v^^vv>^<<^<<^>v^>v^<>^<>v^v<>v><^>>^^<><>>v^vv^^<^>v<>>>^>>><<><>>^v>^^>>v><<^^v<>^<<><>>>>^>><><^>>>v^vvv^^^<><>^<^v<>>v^>>vvv>^<>^vv<>^v>><>><>v^v>^^>vv<^<<^^^v<><^<^v>vv>^<>v<<^vv^^vvv>><>>v<>v^^vv^>^<<^^v<^>v<^^<<^vv><>>^v>^^vvvv>^<^v^^vv><^^^v<>>v^v^^>v^^^^^^^>^v<<><<<^vv<<^vv^<<^<<>>><<><<><>vv>>^^>>>>^^v^^v<<>>^<>>>^^<>>>vv><<>>>^<^<>vv>>v^>v>^>>>^>^>>>>>>^>>><^^v><<><^vvv^>^v^>^>>^v>v^v<>^><^>v +^^^<^vv>^<<^<<><^<<>v^<^^vv><^<>^v>v<>^v^^vvv<^<>vvv^>><^vvv<>^>><>>^>v<>>>>>v^^<^<>^>^<^<<^^<>^>^>^v^v<<>v>^v>>>>^>v>>^v<>><>^>^>v<^<^<^<^<<<>^^>>^<>vvv<<>><>^>vv^>^^v^^>v<^^>>>v^v<><^^vvv>v<<^<^>^^<<^v>>><^^<^^v<>v^><>^v^<<>v>>v>^^>><^<<<^><^^vvv^>^>v<^v^>^><<^v<>>^><>^<>>vv<><>v^<>v^<^>>vv><^v^v<<<>v>^<^v^v<<<^<>>vv^<^^>>^v^<v<^vvv<>v^v>><^v>>^v^^^><<^<^<^>^vvvv<^v>^>>>^v<<><<^>><^^v^^^v^>vvv^^>^v<^>vv^^^v>><<>vv>>^^<>^v>v^v<<^^^>>^vv<>>v>vvv<^v<<>^^v<^>v>^>v>^<>v^v<>>>^vvv^v^<>>>>^v^<<>>>>v<>>^^^^><<^^^^<>^>^<>><<^<<>>^>>vvvvvv^><^^>^^^>^>v<^^^^>>v>v<><^<^^>>^>>^v>vv^vv^v<>>v<<<><vv^<^v>v><>^v>v<^<>>^>>v<<<>^vvv>v^<<^^>^<>vv><>^^^v>v^>vv<^^<>^<>v>vvv<^><<<>^>>^^>v^v<<>^v>> +v^^v<v>>><<>^>^>^v><^^v<^^^^^v^^<>><>>>^<<><^<<^>^<^^^<>>>>v<<>>>vvvv^v^<>v^^>>^>>^<^^v^>v<>^>vv<>>>>vvv>v^v^vv>v<>>vv^<>v^<>>v<<>vv<<>^>vv<>v>^<><^v^>>^<^<<>v^<<^><><>^^><><<>>v<^vv<>^>>v<><^>^<<>^>v^><><>^v>^<>v<^>^v>^>>^>^<<><<^>^><><^v^><^vvvv><>^v>^>vv<^v><^^^^>><^v<<><>v^^^^^^^vvv>^<<<<>v^<<^><<^>vv<^><^vv^>^vvv^>>>><<<^^vv><^><^>>v^^>^^><^vvv<<^vv^^<^>^>v^vv<><^>v>v><>>^>>^^^^^v<>^^>v^>^>^^<^<^^vv^^vv^>vv>vvvv<>v^>^<^^v>^>^vv>v^v<<><^v>>>vvv^^<<>><^^>^vvv^>v<^>v>>^<>^<>v><^<>><<<>><<<^>>>v>vvv^>><>>>>^>v>>v>^>^>>><>^><<^<^>v^^v^>^^>^>^<>^v^>^v<>v^<<>v^v>v><^>>v>><<>v><<>vvv>><^^v<>>v>v^>>vv>^<^>^<>v<<^vv<^>v^v<^<<^<^v<^v><^vvv>^<>^vv^>>><^^<^v<^^<^v^vv<<<>^v>v<<>v>>< +<>>vv^v>v<^<^^v^v^<^>>><^^<<<^<<^<^<<>v^^^^^<^>v^>vvv^>><^<<>>v^<><><<^^<^^><<>>v^v^v>><^^>>v>v<^<><^^><<>^<^v^^v>^^<^v^^v^<^v>^<><>^>^^^^<><^^<<>v>^<><^<><^v^^<^^<^><^<<^^^>v<<>^>>>>>>v>^>^>><^^>>^v>^v>><^vv^v<<^^^<^v^v^>v^v>^<<^vvvv>v>^^>><<<<>^v^v^><><><<<>><^<^^^^vv<>>>>>^v>>>>>v^<^<>vv^<^^v^^>>^^<^<^<><>>^><^>^<^^>v<^^>><^<^vv^v^<<^>>>v<<^>><<^v<^<^<>v<^vv^^^v<^v<^^vv>^vv>>>v^^^>><>v^>><<>v>^^^<^^<<>><>v>>v^v<^>vvvv^^^^vv><>v>^v>v^v><<>^vv^v>>^<>^^^^^v^v>^^vv>v>>>v>^^^vvvv^^>^^><^vv><><>^v^>>v>v^><><^^^^<^vv>^^v>^^>^vvv^^>^>^^v^<^>v^vv<>vv^<<><>^>vv^^v>vv^^<<>>^v^^<<^>^><>v>>^<<v>^v<<<<>^v>^^^>>v<^^v>>v^>v>>>^vv^>><<><><^^^v<^>>vv>>>^^^vv>>v><^^>v><>>^>v>v^<>vv<<^vv>>^>^vv>vvv^>>vv^^<>><>v^>^v>v^v>^>>v<^v^<><>^v<>>><<>^v><>v^vvv>vvvv>^<< +^^><<<^^v>^v<<^<^v<^v^v><^v<^>^v<><^^<<^>><>vv^vvv^v>v<>v<<>vv><>vvv<><^vv^^<<^<^v<>^<^<><<>^>>^v>>^v^>><^>^><^vv>>>>^>vv^v^<<>^^<^v^<v>>^<v^v>v>v><^>^vv>v<^v^vv<>>^>>^>v^^^^^><<>vv^vv<^^>^>^<<^^^>v<>vv<^^<^v>^>>><^<<>^<>^v<<>^>v^>vv^^^<>^^<>^>>^^v^v>vv<<<^>>>v>>^^^>^^v^<^^>^>^>>>><^^>^<^^>v<<^v>^^^v>^^^>^<^^>v<<^v>vv>v^^>^>v>^vv>>v^v<<<>^<^^v><^^<^^v<<^vv>>v>vvv>^v>vvv>^<><>^><<<^v^^^^v^^>v>^>v<^v<<^>^vv^^<>>^<^<v>^<^^<>>><>><v<>><^vvv>v>>>^>v<^^>v^^vv>v^^<><^vv^^v><^^<>^>v>>vv<>>^<<^^vv>vv<^^vv^<<^v<>>v<>>>>^^v>v>>^<^v>vv<^>^<<><<^<>>^<^><>^>v^<>^^<^<>v^v<>v><<>^<^^^v>^<^<^>>>><>^><v>^^<^>^<>v>^^<<^v^<><^v<>^v<<<<<<^^<^>v<<>^v^>^v^v>^<^>^<^>v<v^v>^v>>^v<>v<^vv<>>^^^<>v><><>><>v>^>v^v +vv<<>>vv<^>^^<<^>v>^v<<^^<<^^>^>>vv<<>^v><>>>^^<<^vv>vvv<<><<>v^v>v>vv^>v>^v^>^>>^v>><>^<^><<><>>>vv<>>v>><>vv<<>>vv>^^vv<>^^<<<^^v<>v^^<<<><>v<^^>v<>^vv>^v>>^^^<><<^^^<<>>^v^>vvv^v>v<^v<<>>^v^^v^<^<>^^<>v><>><><<^v<v<^<<>>><>>vv^>^<<>^^v>^>^<<^v>^>v^>^vv<^v><^^v^<>v^<^>>^v<^^^^^v^^>^<v<><^><^v<^<>v<^v^v>^>v><^><><^v^<<>^>^>^^v^<^<>^>vvvv^v^v^v^v><><><>v^^v^<>>vvv^<>^<^^vv^^<<<^v^>>>>>^^>>^>>^^>^v>vvv<^^v>^^v^v^^<<^>>v>v>^^>^<<^><>>^v^><>^^>v>^<<>^^><^v>^>>^^^<>>><<^^^<>>v^<><><>v^v>><^<^<^v^>v^vvvv^v>>vv^>v<<^^^<<>>^<>vv><^>^v>v^<^^^v^>v^>^<>^v^v^v<<<^>^<>^>v<^>>>vv<<>>^vv<>^>^vvvv>v<v^v<^vv<^^^v<^<>^><>>v>^><<^<>><^^>^v^^<^^vv^<<>>v<^v>>><<^^v>^<^v^^^v>^^^^<^^^<^>v<^<>>^<^>vvv<^><>v<^^>><^><^v<><<<^^v^^><^v<<>v +^vv<>v>^v>^<>^v><>><><^>^^^^<v^<>^><>^v<<vv>>v^<>v><>v>v^^<<<>>^v>^vvv<^^^><^v>>v^vv<<>><>v<>>v<<<^<<<^<><<<<<>>^v^vvvvvv^v^<>v<v<>vv<><<^v><>>><^v^v>v>v>>v><^v><>^vv>v^v^^>>>v>v^v>vvv<<<>>>v^v><<<>v>>^><<^vv<>><^>^vvv>v<<<<>^>v<^^<><^<^>>^vv<^v>^v^>^^>^^><^vv<<^<><<<^<<^v^v^>^>>>^v^><<>>^^v^<<^<>>v^>vv><>^^<^>^^v^v<<>^^^v<>>><<^^^<>^^>^>v^^>^v^^<^>^^>vv>vvvv<^v>v^v<>^v<<^>>v>>^^v>^^v>v><^^v<<<vv^<>><<>vv^<<><^<<^^^v>^<<<<^>v>^v^^><>^<^vv>v>>^^>>^><^>^<^v^>^>>^>v<<>><^^<<>vv><^<<<>v>^^v>vvvv>v<>>><^^>^>^vvvv^vvvv<>v<^v^^^^v<>^^>v^^<^^<<^<>^v<^v>>v^<<^<>v^^v^^<^>>v<>^<>>^<><^^^>><>v^<^><^v^^>>v<^<>v^<>^vv>v<^^<^vv<>vv>>^vv>^v<<^>>^^>vv^><^>><^>^>v^v^vv>v<^>><^>v>v>v><>>^<<><^v<^^>v>>>^v><<>^v>>v>^ +>^^>^><<<>v>>^><<><>^<><>>^>>>v^vv^<<>^>^v<>>>>v<v<>v^>>v<<<<>vv^v^<v^>^>>vvv<>>^vv>^v^><^^^v<>>v^vv^v^<^^v>>>v<>^v^<^vvv<><>>vv^>v<<<<>>vv<>^v>><^><^^^>v<<>>>v>^v^<^>v^^<v>v>>>v>^>^v<^<^^<^vv>^<>^v>vv>^^>><^v^v>v<<>v^^^>^^>^<>^>v>>v>>>>vv><>>^v^>>v^^v^><>^><>^^>>>v^<>>>v^>v^^>>>>v>v<^v>>^v^><>^^<>^<<<>^<>>>>>v><>^v^v^<<<^<<<<>v<^^^v><><>^^v^v<^^^^>^<^^^<>vvv<^v^>^v><>v^v^^<>>^v><<<vv^^>v<^^<><<<>>>>><<<^<>>^v>vvv<>v<<^>>v>v<>>^>^^v>><^<^<^^^vv^<><^^v<^<^<>^>^v>vv^v>^v<>v^^<<<^^<>^v<>^<^v^><>v<>^v>^vv^v^>>v>^v<<^>v<<^^v^v>^v<^^>>>>v><>^>vv>^vv<^v>^>v>v<^^<>v^>^v^>>v^^>^v^>v<^vv^^^v<><>^^^>v^^>^<^^><^v^>><^^v>^^^v^>>><><<<>><<<<>v>^>>>^^^v<^^^><<>>>^v<><>v<^vvvv>^<><>^<<<>v^^v^^>vv +<><^>^v^>v^^^<>^^^<><>>>>vv<^v>v>^^><<>v>^<^v^vv^<>>^^^^^v^>vv^><^>>^v^v^^vvvv>><<vvv><><^^>v^>><>^<>^^v^^v>^>^^v^^>v^><^^v<^><>vv^<^^^>>vv^^<<<>>^^v^>v<^<^v>>>v>>><<>><>v^^v<>v>^v<<^^vv^<>v^v>^<<<>>v^<>v^>vv>v^^>v<>v>v>><>^<<^v^<^<^<^vv>>^>vv^^>>^<><>^>>vvv^>v^^>vv^vv<<>v><vv><<>>>^<^v<<<>v^<<>^<>>>v<>>^<^<^v^<^v>>v<v^<<<^<>^v<^^>v>^v<^^>v^v^>>v>v<<^>v^>v^>^^<<^^v<<^v<<^vvv^>^^>>><>^>^^>><v>>>^v>^>>v<^^v<>^vvv>^^>>>v^>v<<^<^v><^v>^^>^v>^<>v^^<>vv>v><><^v^>^^<<<<>><<>^^<<>v^>^^>^^vv<^^v^^>^>vv>>^<>v><v>v^^^vv^vv>vvv^>vv>vv^>>>v<^^><^>>vv>^><<><^><v>><>vv^<><<^<^<>^>v>v^v<<>v^><^^v<>^>vv^v>>>^^^v>>>^><<<^<^<^^v<<<>><>^^vvv>^vv>>^v<><^v<>v>^v^><>^v<v^^^><^>v^vv<<vv>v><^v<^^^><^^ +<^<^v>vvv^v<^v^^>vv^><><>vvv><>vv^^^>^<^^<<^v^v>^v^<<^>>v<^^<><^v^<>>>>^<<>^v^<<>><^<^><<>v^>^>v>vv^<vv^^^^vv>^>vv>^^v<^<>>><>vv>>vvv><^v>^v^v^<^>^vv><^<^>^><^<><<^^vv>>^>v^^^v<><^v^<><^>>v^^v<^>v>^^<>v<<^vv^v><^v^v<^vv^><><^^<>v^<<^^vv^<<>^v^^^<<<><<>>^>^>v><<>v^<<>v<^v^<><<^^<>vv>^vv^^v^v>^><^vvvv^v^>^<^^vvvv^<^v<^<<<>v>><>>^v^^><>^v>^v><<<^^^^^<<^><v^>v>v>v^^^^v><^>>^>^><>v>vv<<>>^><>v<><^<>>^^<^>^^^v^^<<>>vv>><^<<<<>^v<<^v^v<<>^>^vv>><>v<^^<>v^>v>>vv<^vv>>>>v<<>v><><^<<^<^><<<<>v>>v><>v<>v<^vv><<>v>>v>vv><^>><>>>^^^>v>^<>v<>v^<^v<>v^^^vvv^^v^vvv>vvv^v>>^<^>^v<^>>>^<>>^v<<>v<^<<^><>>>^<><^v^^><>><^>vv>^>vv<^v^>v^^v^>^<^>^vvv>>vv^^vv^><^^<<><^>^v^v>>^<^<^^^<<^>v>>^vvv>v>><^>^<^v><^v>^v^^<<^>^^<<>>vv^^<^ +<<<^<^v<^v>>v^^>><><^>vv>^^^vvv<<>^>v>^><<<<^vv^v>^>><<^vv>^^<>v>>>>><><^vv<>v<^><^>>>v<^>>v^<^>>>^>^>v^>vv>^>^vv<^^<^vv^<^><^<^^v^<><<^><^>>^^<^>^>^^<^v^>><^>>><><^^>v^v>vv^^v>^><<^<<<><<<^v>>>><<<>v<>^>^v^<>^><>^>><<<>>^v^vv^v^<^<<>^^<<^^>^^v<>^vv>v>v^^v^>^v<^^v>^<^v><<>^<^^v<^^v^<><<>^^<v>vv>><^>v>v<>^v>v<<<>v^<>vv<>^<^>vv^^<^<^>>><v^^vv><<^<>^<<<>v>vv^><^>><>><^^><^v>v>><>>v>>v^^<<>>v>vv^>^v>v<^>><>>vvv<^>^>^^^>^>^>^><>v><^>>vv><^v>>^>>v^<^<<>>v<>v>v^^v^<>><>><>^>v><^<>^><>v><<<^v<<>>^^<^^>v^>^>^>>v^v^>^^v>vv^v<vvv><>^^>vvv^>vvvv>^^^>^<^^>v<^vvv<<>^<<<>^>^v>v>v^><><^>>>>^>^<^^^><>vvvvv^vv>^>^>>v^v^vv^>^>>v>>^^v>>^^><>v<^<<>>^>>^^><^>>v><^>v^^><^>v^<<>^><^^>>^><vv>>^^<<>>>^><<^v>v<v^>v<<>v diff --git a/2024/go/day16/day16.go b/2024/go/day16/day16.go new file mode 100644 index 0000000..cbf3814 --- /dev/null +++ b/2024/go/day16/day16.go @@ -0,0 +1,225 @@ +package day16 + +import ( + "adventofcode2024/utils/dijkstra" + "adventofcode2024/utils/grid2d" + "adventofcode2024/utils/inputs" + "fmt" + _ "strings" +) + +type ( + Vec struct{ x, y int } + Dir struct{ x, y int } + Cell rune + Move struct { + p Vec + d Dir + } + Maze struct { + height, width int + start Vec + end Vec + grid *grid2d.Grid[Cell] + } +) + +const ( + WALL Cell = '#' + CORRIDOR Cell = '.' + START Cell = 'S' + END Cell = 'E' + PATH Cell = '*' +) + +var ( + NORTH = Dir{0, -1} + EAST = Dir{1, 0} + SOUTH = Dir{0, 1} + WEST = Dir{-1, 0} + DIRECTIONS = []Dir{NORTH, EAST, SOUTH, WEST} +) + +func Part1(input string) int { + maze := Maze{}.Parse(input) + fmt.Println(maze) + data := inputGraph(*maze) + graph := dijkstra.CreateGraph(data) + data.From.Label = "EAST" + path, dist := dijkstra.GetShortestPath(data.From, data.To, graph) + for _, p := range path { + maze.grid.Set(p.X, p.Y, PATH) + } + fmt.Println(maze) + return dist +} +func Part2(input string) int { + maze := Maze{}.Parse(input) + fmt.Println(maze) + data := inputGraph(*maze) + graph := dijkstra.CreateGraph(data) + data.From.Label = "START" + data.To.Label = "NORTH" + paths, _ := dijkstra.GetAllShortestPaths(data.From, data.To, graph) + bestPaths := make(map[Vec]struct{}) + for _, path := range paths { + for _, node := range path { + bestPaths[Vec{x: node.X, y: node.Y}] = struct{}{} + } + } + return len(bestPaths) +} + +func inputGraph(maze Maze) dijkstra.InputGraph { + data := dijkstra.InputGraph{} + data.From = dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"} + data.To = dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"} + for y := 0; y < maze.height; y++ { + for x := 0; x < maze.width; x++ { + if maze.grid.Get(x, y) == WALL { + continue + } + for _, dir := range DIRECTIONS { + nx, ny := x+dir.x, y+dir.y + if nx < 0 || ny < 0 || nx >= maze.width || ny >= maze.height { + continue + } + if maze.grid.Get(nx, ny) == WALL { + continue + } + for _, d := range getAllowedDirections(dir) { + ss := dirToString(dir) + ds := dirToString(d) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: x, Y: y, Label: ss}, + Destination: dijkstra.Point{X: nx, Y: ny, Label: ds}, + Weight: func() int { + if dir == d { + return 1 + } else { + return 1001 + } + }(), + }) + } + } + } + } + + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"}, + Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(EAST)}, + Weight: 0, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"}, + Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(WEST)}, + Weight: 0, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"}, + Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(NORTH)}, + Weight: 0, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"}, + Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(SOUTH)}, + Weight: 0, + }) + + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"}, + Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(EAST)}, + Weight: 0, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"}, + Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(WEST)}, + Weight: 2000, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"}, + Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(NORTH)}, + Weight: 1000, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"}, + Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(SOUTH)}, + Weight: 1000, + }) + + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "EAST"}, + Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "NORTH"}, + Weight: 1000, + }) + + return data +} + +func dirToString(dir Dir) string { + switch dir { + case NORTH: + return "NORTH" + case EAST: + return "EAST" + case SOUTH: + return "SOUTH" + case WEST: + return "WEST" + default: + return "UNKNOWN" + } +} + +func getAllowedDirections(direction Dir) []Dir { + switch direction { + case NORTH: + return []Dir{NORTH, EAST, WEST} + case SOUTH: + return []Dir{SOUTH, EAST, WEST} + case WEST: + return []Dir{WEST, NORTH, SOUTH} + case EAST: + return []Dir{EAST, NORTH, SOUTH} + } + return []Dir{} +} + +func (m Maze) Parse(input string) *Maze { + m.grid = inputs.ToGrid2D(input, "\n", "", '?', func(c string) Cell { return Cell(c[0]) }) + m.height, m.width = m.grid.SizeY(), m.grid.SizeX() + for y := 0; y < m.height; y++ { + for x := 0; x < m.width; x++ { + c := m.grid.Get(x, y) + switch c { + case WALL, CORRIDOR: + m.grid.Set(x, y, c) + case START: + m.grid.Set(x, y, CORRIDOR) + m.start = Vec{x, y} + case END: + m.grid.Set(x, y, CORRIDOR) + m.end = Vec{x, y} + } + } + } + return &m +} + +func (m *Maze) String() string { + s := "" + for y := 0; y < m.height; y++ { + for x := 0; x < m.width; x++ { + if y == m.start.y && x == m.start.x { + s += string(START) + } else if y == m.end.y && x == m.end.x { + s += string(END) + } else { + s += string(m.grid.Get(x, y)) + } + } + s += "\n" + } + return s +} diff --git a/2024/go/day16/day16_test.go b/2024/go/day16/day16_test.go new file mode 100644 index 0000000..426b7b5 --- /dev/null +++ b/2024/go/day16/day16_test.go @@ -0,0 +1,47 @@ +package day16 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`############### +#.......#....E# +#.#.###.#.###.# +#.....#.#...#.# +#.###.#####.#.# +#.#.#.......#.# +#.#.#####.###.# +#...........#.# +###.#.#####.#.# +#...#.....#.#.# +#.#.#.###.#.#.# +#.....#...#.#.# +#.###.#.#.#.#.# +#S..#.....#...# +###############`) + require.Equal(t, 7036, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`################# +#...#...#...#..E# +#.#.#.#.#.#.#.#.# +#.#.#.#...#...#.# +#.#.#.#.###.#.#.# +#...#.#.#.....#.# +#.#.#.#.#.#####.# +#.#...#.#.#.....# +#.#.#####.#.###.# +#.#.#.......#...# +#.#.###.#####.### +#.#.#...#.....#.# +#.#.#.#####.###.# +#.#.#.........#.# +#.#.#.#########.# +#S#.............# +#################`) + require.Equal(t, 64, r) +} diff --git a/2024/go/day16/input.txt b/2024/go/day16/input.txt new file mode 100644 index 0000000..67000f9 --- /dev/null +++ b/2024/go/day16/input.txt @@ -0,0 +1,141 @@ +############################################################################################################################################# +#.....#.....#...#.................#...#.......#.........#...#.......#...#.......#.......#...#...#.....#...#.......................#...#....E# +#.###.#.#.#.###.#.###.###.#######.#.#.#.#.###.#.###.###.#.#.#.###.#.###.#.#.#####.###.#.###.#.#.#.#.#.#.#.#.#####.#.###.#.#######.#.#.#.###.# +#...#.#.#.#...#.....#...#.#.....#...#...#.#...#.#...#...#.#.#...#.#...#.#.#...#...#...#.....#.#.#.#.#...#...#.....#.#.#.....#.....#.#.#...#.# +#.#.###.#.###.#.#####.#.#.###.###########.#.#####.###.###.###.###.###.#.#.#.#.#.###.#######.#.#.#.#.#########.#####.#.#.#####.#####.#.###.#.# +#.#.....#.#.#.#...#...#.#...#.....#.....#.#.....#.#.#.#.........................#.#.......#.#.#...#.....#...#.#...#.....#...#.#...#.#.....#.# +#.#######.#.#.#.###.#.#.###.#.#.#.#.#.###.#####.#.#.#.#.###.###.###.#.###.#.#.#.#.#######.###.#.#####.#.#.#.#.###.###.#.#.#.#.#.#.#.#######.# +#...#...#.#...#.#...#.#...#.#.#.#...#.#.......#...#...#...#...#.#.....#...#.#...#.......#...#...#.....#...#.#.....#...#...#...#.#.........#.# +###.#.###.#.#####.###.###.#.###.#.#####.###.#.#####.###.#.###.#.###.###.###.#####.#########.#.#.###.#.###.#.#####.#.###.#######.###########.# +#...#...#.#.#.....#...#...#.#...#.#...#.#...#.#...#...#.#.....#...#...#.#...........#.........#.#...#.#...#.........#.#.#.......#...........# +#.#####.#.#.#.#######.#.###.#.###.#.#.#.#.###.#.#####.#########.#.#.###.#.#####.###.#.#####.#.#.#.###.###.###.#####.#.#.#.#######.#########.# +#.#.....#.#...#.......#...#.#.#.....#.#...#.#.#...............................#...#.#...#...#...#.#.#.....#.#.....#...#.#.#.....#.......#...# +#.#.###.#.#####.#.###.###.#.#.#.#.###.#.###.#.###############.#.#.#.#.#####.#.#####.###.#####.#.#.#.#####.#.#####.###.#.#.#.###.#######.###.# +#.#...#.#.....#.#.....#...#...#.#...#.#.....#.#.....#.................................#...#...#...#...#...................#...#...#...#...#.# +#.###.#.#####.###.#.#.#.#####.#.#.#.#.#######.#.###.#.#######.###.#.#.#.#.###.#.#########.#.#.#.#.#.###.#.#####.#.###.#.#.###.#.#.###.###.#.# +#.#...............#.#...#...#.#...#.........#.....#.#.#.......#...#.#.#.#.#...#.#.....#...#.#.....#.....#.....#.#.....#.#.#...#.#...#...#...# +#.#.#####.#.#####.#.#####.#.#.###.#########.#.#####.#.#.#######.###.#.###.#.###.#.###.#.#.#.#.#########.#.###.#########.#.#####.###.###.###.# +#.#.#.....#.....#.#.#.....#.....#.....#...#.#.#.....#.#.#.......#.#.#.....#.#...#.#...#.#.#.#.........#...#.#.........#.#.........#...#...#.# +#.#.#.#####.#####.#.###.#######.#####.###.#.###.#####.#.#####.###.#.#######.#.#.#.#.#.#.###.#.#######.#.###.###.#.###.#.#########.###.#.#.#.# +#.#.......#...#...#...#...#...#.....#...#.#.#...#.#.....#.....#.....#...#...#.#...#.#.#.....#.#.......#.#.......#...#.#.....#.......#.#.....# +#.#######.###.#.#####.#.###.#.#########.#.#.#.###.#.#####.###.#######.#.#.#########.#.###.###.#.#######.#.#####.###.#.#####.#.###.###.#.#.#.# +#.....#...#...#...#.#.#.#...#.#.........#.#...#...#...#...#.#.#.......#...#.......#.#.#.......#.........#.........#.#...#.#.#...#.....#.#.#.# +#####.###.#.#.###.#.#.###.###.#.#########.#####.#####.#.#.#.#.#.#############.###.#.#.###########.#######.#######.#.#.#.#.#.###.#######.#.#.# +#...#...#.#.#.#...#.......#.#.#.#.......#.......#.....#.#.#...#.............#.#...#.#...#.......#.........#...#...#...#...#...#...#.....#.#.# +#.#.###.#.#.#.#.###########.#.#.###.###.#.#.#####.#####.#.#####.#.#########.#.#.###.###.#.###.#.###########.###.#####.###.#.#####.#.#####.#.# +#.#.#.#.#.#.#.#.....#.....#...#...#.#.....#.#.....#.#...#.....#.#.#.......#.#.#...#.#.....#...#.#.....#.....#...#.......#.#.................# +#.#.#.#.###.#.#####.#.###.#.#####.#.#######.#.#####.#.#####.#.#.#.#####.###.#.###.#.#########.#.#.###.#.###.#.###.#####.#.###.###.###.#.###.# +#.....#.#...#.....#...#...#...#...#.#.....#.#...#.#...#.....#...#.#.....#...#.#...#...#.......#...#...#...#.#.#...#.....#.#.#.........#...#.# +#.#####.#.#######.#####.#####.#.###.#.###.#####.#.#.#####.#.#####.#.#####.###.#.#####.#.###.#######.#######.#.###.#.#####.#.###############.# +#.#.....#...#...#...#...#.....#.#...#.#.#.......#.#.......#.....#.#.....#.#...#.......#.#...#.......#.....#.#.....#.....#.......#.........#.# +#.#.#######.#.#.###.#.#######.#.#.###.#.#########.#############.#.#.###.#.#.###.#########.#.#.#########.#.#.#####.#####.#####.###.#######.#.# +#...#.....#...#...#.#.......#...#...#...#.........#.......#...#...#...#.#.#...#.#...#...#.#.#.#.....#...#.#.....#.....#.....#.#...#.....#...# +#.###.#.#.#.#####.#########.###.###.###.###.###.#.#.###.#.#.#.#########.#.#.#.###.#.#.#.#.###.#.###.#.###.#.#.#######.#####.#.#.###.#.#####.# +#.#.....#.#.#...#...#.......#.............#.#.#.#.#.#...#...#.#.........#.#.#.....#.#.#.#.#.....#.....#.#.#.#...........#...#.#...#.#.#...#.# +#.#.#.###.###.#.###.#.#########.#####.###.#.#.#.#.#.#.#########.#.#####.#.#########.#.#.#.#.#######.###.#.###########.###.###.###.#.###.#.#.# +#...#...#.....#.....#.#.........#.....#...#.....#.#.#.#.....#...#.#...#.#.#.......#...#.#...#.#...#...#...#.............#.#...#...#.....#.#.# +#####.#.#######.#####.#.#.#############.#####.#.###.#.#.###.#.###.#.#.###.#.#####.#####.#.###.#.#.#.#.#.###.###########.#.###.#.###.#####.#.# +#.#...#.......#.#.....#.#.#...#.............#.#.#...#.....#.....#...#...#.#...#.#...#...#.#...#.#.#.#.#...#.#...#.....#.#.#.....#...#...#...# +#.#.#.###.#####.#.#####.###.#.#.###########.###.#.#############.#######.#.###.#.###.#.###.#.###.#.#.#.#.#.#.#.#.#.#####.#.#.#.###.###.#.##### +#...#...#...#...#.#.#.......#.#.#.......#.....#.....#.........#.........#...#.#.....#...#...#...#.#.#.#.....#.#.#.........#.#.#...#...#.#...# +#.###.#.###.#.###.#.#.#######.#.#.#####.#####.#.#####.#######.#.#####.#.###.#.#.#######.###.#.###.#.###.###.#.#.#.#########.#.#.#####.#.#.#.# +#.......#...#...#.#.........#...#...#.#.....#.#...#...#.#.....#.#.....#...#...#...#...#.....#...#.#.....#.....#.#.#.........#.#.......#.#.#.# +#.###.#.#.###.#.#.###.#########.###.#.#####.#.#####.###.#.#######.#######.#######.#.#.#.###.###.#.#.#####.#####.#.#.#########.#########.#.### +#.#.....#.....#.#...#.#.......#.#...#.....#.#.......#.....#.......#...#.....#...#...#.#.#...#...#.#.#.....#...#.#.#.#.........#.....#...#...# +#.#.#.#######.#.#.#.###.#.###.###.###.#####.#.#.###.#.#########.#.#.#.#.#####.#.###.#.###.#.#.###.###.#####.#.#.###.#.#####.###.###.#.###.#.# +#.#.#.....#...#.#.#.#...#...#.#...#.....#...#.........#.........#.#.#.#.#.....#.....#.#...#...#.#...........#.#...#.#.#...#.......#.#...#.#.# +#.#.#.###.#.#.#.#.#.#.#####.#.#.#######.#.###.#########.#.###.#####.#.###.#####.#####.#.###.###.#######.#########.#.###.#.#####.#.#.###.###.# +#.#.#.....#.#.#.#.#.#.......#.#.#...#...#.#.#...#.#.....#.#...#.........#...#...#...#.#.#...#...#.....#.#.....#...#.....#.#.....#.#.........# +#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#.###.#.#.#####.#####.###.###.###.#.###.#.#.#.#.###.#.#.###.###.###.#.#.#####.#.#.###.#.#########.# +#.#.......#.#.#...#.#.#.#.#.#.#...#.#.#...#.#...#...#...#.#...#...#...#...#.#.....#.#.#.#.#...#.#.#...#...#.#.#.#.........#...#.#.....#...#.# +#.#######.#.#.###.#.#.#.#.###.#####.#.#.###.#.#####.#.#.#.#.#.###.###.###.#.#######.#.#.#.#.#####.#.###.###.#.#.#####.#.#####.#.#######.#.#.# +#.#.......#.#...#.#.#...#...#.#.......#.#...#.....#.#.#...#.#...#.....#.#.#.......#...#.....#.....#...#.#.....#.....#.#.#.....#.........#.#.# +#.#.#####.#.###.#.#.#.#.###.#.#.#######.#.#.#####.#.#.###.#.###.#.###.#.#.#######.###########.#######.#.#.#########.###.#.###############.#.# +#.#...#...#.#...#.#...#.#...#...#.#.....#.#.#.....#.#.#...#...#.........#...................#.#.....#.#.#.........#...#...#.......#.......#.# +#.###.#.#.#.#####.###.###.#.#####.#.#####.#.#.#####.#.#.#####.#########.###################.#.#.#####.#.###.###.#.###.#####.#######.#######.# +#...#...#...#.....#.......#.....#.#.#.....#...#.........#...#...#.....#...#...........#.#.....#.......#...#.....#.......#...#.....#.#.....#.# +###.###.#.###.#####.###########.#.#.#.###########.#.#####.#.###.#.###.###.#.#########.#.#.#######.#####.#.###########.#.#.#.#.###.#.###.###.# +#...#...#...........#.#.....#.....#.#.#.......#...#.#.....#.....#.#.#.#...#.#.#.....#.#.....#...#.....#.#.................#.#.#.#.#...#.....# +#.#.#.#####.###.#####.#.###.#.###.#.#.###.###.#.#####.#######.###.#.#.#####.#.#.#.###.#.#####.#.#####.#####.#########.#####.#.#.#.#.#.###.### +#.#.#.#...#.#.......#.....#.....#.#.#.#...#.#.#.......#.....#...#.#.#...#.......#.....#...#...#.#...#.....#.........#...#...#.#...#.#...#...# +#.###.#.#.###.###.#.###########.#.#.#.#.###.#.#.#.#####.###.###.#.#.###.#.#########.#######.###.###.#####.#########.###.#.###.#.#######.##### +#.#...#.#.....#...#.#.........#...#.#...#...#.#.....#...#...#...#.#.#...#.........#.........#.#.#...#...#...#.....#...#.#...#.#...#...#.....# +#.#.###.#.#####.#.#.#.#######.#.###.#####.###.#.###.#.###.#######.#.#.###.#######.###########.#.#.###.#.###.#.#####.###.#####.###.#.#.#.###.# +#...#...#.....#.#...#.#.....#.#.#...#.....#...#.....#...#.........#.#.#.........#.......#...#...#.....#...#.#...........#...#...#...#.......# +#####.###.#.###.#####.#.#.###.###.###.#####.#######.###.###.#######.#.#########.#.#.###.###.#.#########.###.#########.###.#.###.#######.###.# +#.....#...#.....#.....#.#.......................#...#...#.........#.#.......#...#.#...#...#.#.......#...#...#.........#...#...#.......#.....# +#.#####.#.#######.#################.#########.#.#.###.###.#####.#.#.#######.#####.###.###.#.#.#.###.#.#.#.###.###.#####.#####.#######.#.##### +#.#.#...#...#.................#.#...#.........#.......#.#.#.#...#...#...#...#...#.......#.#.#.#...#...#.#.....#...#...#...#.........#.......# +#.#.#.#.#.###.###.###########.#.#.###.#################.#.#.#.#####.#.#.#.###.#.#########.#.#.###.#####.#######.###.#.###.#########.###.###.# +#.#.#...#.........#.....#.....#.#.#.....#...#.............#.#.#.....#.#.......#.........#.#.#...#.........#.......#.#...#...#.....#.#.....#.# +#.#.###.#.#######.#####.#.#####.#.#.###.#.#.###.###.###.#.#.#.#######.#################.#.#.###.#.#.#####.#.#######.###.###.#.###.#.#.###.#.# +#.#...#.#.....#.........#.#.....#.#.#...#.#...#...#...#.#.....#.......#.........#.......#.#...#.#.#.....#.#.#...#...#...#...#...#.#...#.#.#.# +#.#.###.#.###.###########.#.###.#.###.###.###.#######.###.#.#.#.###############.#.#######.#.#.#.###.###.#.#.#.#.#.###.#.#.#####.#.#####.#.#.# +#.#.....#.#...............#.#...#...#...#...#.#.....#.......#...........#.....#.#.#.......#.#.#.....#.#.#.#...#.#.#.......#.....#.......#...# +#.#.###.#.#.#################.###.#.#.#.###.#.#.###.#######.###########.#.###.#.#.#.###.#.###.###.#.#.#.###.#####.#.###########.#.#####.###.# +#.#...#...#.#...#...#.........#...#.#.#...#.#...#.#.#.....#.#.....#...#.#...#...#...#.#...#...#...#...#.....#.....#.....#.......#.....#...#.# +#.###.#.#####.#.#.#.#####.#.###.#.#.###.#.#.#####.#.#.###.###.###.#.#.#.###.#########.#####.#.#.#####.###.#.#.#######.###.#####.#####.###.#.# +#.#...#.......#.#.#...#...#.#...#...#.....#...#...#...#.#.....#.#...#.#...#.#.#.......#.......#.....#.......#.#.#.....#...#...#.#.....#...#.# +#.#.###.###.###.#.###.#.###.#.#######.#.#####.#.#.#####.#######.#####.###.#.#.#.###.#.#.#####.#####.#########.#.#.#####.###.#.#.###.###.#.#.# +#.#.#.....#.....#.#.....#.#.#.........#.......#.#.........#.............#.#.#.....#.#.#.#.....#.....#.......#.#...#...#.#...#.#...#...#.#.#.# +#.#.#.#.#.#.#####.#######.#.#####.#####.#.#########.###.#.#.#####.#####.#.#.#######.#.###.###.#.#.###.#####.#.###.#.#.#.###.#.#.#.#.#.#.#.#.# +#.#...#.#...#...............#...#.#...#.#.#.......#...#.#.#...#.......#.#.#.#.......#.#...#.#.#.#.......#...#.......#.......#...#.#.#...#.#.# +#.#####.#.#.###.#######.#####.#.#.#.#.###.#.#####.#####.#.#.#.#.#.###.#.#.#.#.#######.#.###.#.#.#######.#.###.###########.#####.#.#.#######.# +#.....#...#...#.#...#...#.....#...#.#.#...#.#...........#.#...#.#...#.#.#.#.#...#...#...#.#...#.........#.#.....#...#.............#.#.......# +#.#.#.#.###.#.###.#.#.###.#.#######.#.#.###.#.#.#########.#.#.#.###.#.#.#.#.#.#.#.#.#####.#.#########.###.#.#####.#.#.#########.###.#.####### +#.#.#.......#.#...#.#.....#.......#.#...#...#.#.#.......#...#.#.#...#...#.#...#...#.#.........#.......#...#...#...#.#.#...#.....#...#...#...# +#.#.###.#####.#.###.#.#########.###.#######.#.###.#####.###.###.#.###.#######.#####.#.#######.###.#.###.#####.#.###.#.#.###.###.#.#.###.###.# +#...#...........#.#.#...........#...#.......#.........#.....#...#...#.#.....#.....#.......#...#...#.#...#.....#.#.....#...#...#.#.#...#.....# +#.###.#.###.#.#.#.#.###########.#.###.#.#################.###.#####.#.#.###.#####.#.#####.#.###.###.#.#####.###.#######.#.###.#.#.###.#####.# +#.....#.....#.....#.......#.....#...#.#...#.............#...#.....#.#.#...#.....#.#.....#.#.....#...#.#...#...#.....#...#.....#.#.#.#.....#.# +#.#######.###########.###.#.#######.#.###.#.###.#.#####.#########.#.#.###.###.#.#.###.###.#######.###.#.#.#.#######.#.#########.#.#.###.#.#.# +#.#.....#.......#...#...#.#...#.........#...#.#...#...#...........#.....#...#.....#...#...#.........#...#.#.#.......#.#.#.....#...#...#.#.#.# +#.#.###.#########.#.###.#.###.#.#######.#####.#.###.#########.#.#.#########.#######.###.###.#######.#####.###.#######.#.#.###.#.###.#.#.###.# +#.#.#.#...........#.#...#.#...#...#...#...........#.....#...#.#.#...#.....#.....#.....#.#.....#...#.#...#.....#.....#.#.....#.......#.#.#...# +#.#.#.#############.#####.#.#####.#.###.#.#########.###.#.#.#.#####.#.#.#####.#.#######.###.###.#.#.#.#.#######.###.#.#############.###.#.### +#.#.#...#...#.......#.....#.#.#...#.#...#.......#.....#.#.#.#.....#...#.....#...#.....#.....#...#.#...#...#.....#...#.............#...#...#.# +###.#.###.#.#.#######.#####.#.#.#.#.#.#####.###.#.###.#.#.#.#.#.#########.#.#.###.###.###.#.#.###.#.#####.###.###.###############.###.#####.# +#...#...#.#.#...#...#.........#.#.........#...#...#...#.#.#.#.#.............#.....#.#...#.#...#...#.#...#.....#...#.......#.....#...#.......# +#.###.#.#.#.#.#.#.#.###.#####.#.#########.#.#.#####.#.#.#.#.#######.###.#.#########.###.#.#####.#.###.#.#######.###.#####.#.#.#.###.#.#####.# +#.................#...#.....#.#.....#.#...#.#.....#.#.#.#.#.........#...#.....#.......#.#.#.....#.#...#.#.........#.....#.#...#.#.#...#...#.# +#.#.#.#.#####.#.#.###.#####.#######.#.#.###.#####.#.#.#.#.#########.#######.#.#.#####.#.#.#.#####.#.###.#.#.#####.#####.###.#.#.#.#####.###.# +#...........#...#.#.........#...#...#.#...#.....#...#.#.#...#.....#.#.....#.#...#.#...#.#.#.#.....#.#.#.#.#.#...............#.#.......#.....# +#.###.#.###.#.###.#########.#.#.#.###.###.#####.#####.#.###.#####.#.#.###.#.###.#.#.#.#.#.#.#.#####.#.#.###.#.###########.###.#########.##### +#.#.........#.....#.........#.#.#.#.#.....#...#...#.#.....#.....#...#.#...#.#.....#...#.#.#.#.#.....#.#...#.#.#...#.......#.#...#.......#...# +#.###.#.#.###.###.#.#####.###.#.#.#.#.#####.#.#.#.#.#####.#####.#.###.#.###.#.###.###.#.###.#.#.#####.###.#.#.#.###.#######.###.#.#########.# +#.......#...#.......#...#.#...#.#.#...#.....#.#.#.#.....#.#...#.#...#.#.#...#...#...#.#...#.#.#.#.......#.#.....#...#.....#...#...#.#.......# +#####.#.###.#.#####.#.###.#.###.#.###.###.###.###.#.###.#.#.#.#.###.#.#.###.###.#####.###.#.#.#.#.#.###.#.#######.#####.#.###.#####.#.###.#.# +#.......#.....#.....#...#.#.#...#...#.....#.#.#...#...#.#.#.#.#.#...#.#.......#.#.....#...#.#.#.#.#...#.#...#.....#.....#...#...#.......#...# +#.#####.#######.#####.#.#.#.#.#####.#######.#.#.#####.#.#.###.#.#####.#.#.###.#.#.#####.###.###.###.#.#.###.#.#####.#######.#.###.#########.# +#.#.....#.......#.....#.#.#.#.......#...........#...#.#.#.....#.....#...#.....#.#.....#.#.#...#.....#.....#.........#.....#.#.....#.....#...# +#.#.###.#.#######.#.###.#.#.#########.###########.#.#.#.#####.#####.###.#######.#.#####.#.#.#.#######.#####.###.#.###.#.###.#.#.###.###.#.#.# +#.#.#.....#.....#.#...#.#.#.....#...#...#...#.#...#.#.#.....#.#.......#.....#.....#...#.#.#.#.........#.....#.#.#...#.#.....#...#...#.#...#.# +#.#.#.#.###.#####.#.#.#.#.#####.#.#.#####.#.#.#.###.#.###.###.#.###.#.#####.#######.#.#.#.#.###.#####.#.###.#.#.#.#.#.###.#.###.#.###.#####.# +#.#.#.#.....#...#...#.#.#.....#...#.......#.#.#.#.#.#.#.#.....#.#.......#.#.#.....#.#.....#.#.......#.#.#...#.#.#...#...#.#...#...#.......#.# +#.#.#.#.#####.#.#.#.#.#.###.###.###########.#.#.#.#.#.#.#######.#.#####.#.#.#.###.#.#####.#.#.#####.#.#.#.###.#.#.#.#####.###.#.###.#####.#.# +#...#.#.......#.#...#.#.....#...#.........#.#.#...#.#.......#.#.#.#...#...#...#...#...#...#.#.....#...#.#.....#.#.#.....#...#...#.#.#.......# +#.###.#.#######.#####.###.#.#.#.#.#####.###.#.###.#.#######.#.#.###.#.###.#####.#.###.#.#.#.###.#.###.#.#####.#.#.#####.#.#.###.#.#.#.#.###.# +#.#...#.#...#...#...#...#.#...#.#.....#.....#.....#.......#...#.....#.#.#.#.....#...#.#.#...#...#.#.......#...#.#.....#.#.........#.#.#.....# +#.#.###.#.#.#.#.#.#.###.#.#####.#.#.#.#######.#####.#.#####.#.#######.#.#.#.#########.#.#####.#.#.#.#####.#.#.#.#####.#.###.#.#.###.#.#####.# +#.#.#...#.#.#.#.#.#.....#...#...#...#.#.......#...#.#.#.....#...#...#.#...#.....#...#.#.......#.#.........#.#.#.......#...#.#...#...#.......# +#.#.#.###.#.#.#.#.#######.###.#.#####.#########.#.###.#.#####.#.###.#.#########.#.#.#.###.#.#####.#########.#.#######.#.#.#####.#.#########.# +#...#.....#.#.#.#...#...#...#.#.....#.........#.#...#.#.#.....#.....#.#.........#.#...#.#.#.....#.#...#.....#.......#.#.#...#...#.#.....#...# +###########.#.#.###.#.#.###.#.###.###########.#.###.#.#.#.#######.###.#.#######.#.#####.#.#.###.#.#.###.###.#######.#.#.###.#.#.#.#.#.#.#.#.# +#.#.......#.#.#...#.#.#...#.#.....#.......#.#.#.......#.#.........#...#.........#.....#...#.#.....#.#.....#.......#.#.#...#.#.#...#.#.#.#.#.# +#.#.#####.#.#.###.#.#.#.#.#.#####.#.#.###.#.#.#.#.###.#.###.###.#.#.#.#######.#####.#.#.###.###.###.#.#####.#####.#.#.###.#.#.#.#####.#.#.#.# +#.......#.#.#...#.#.#.#.#.#...#.....#...#...#.#.#.#...#...#...#...#.#.#.....#.#.........#.#...........#...#...#.#...#.#...#.#.......#.#...#.# +#########.#.###.#.#.#.#.#.#.#.#.#####.#.#.###.#.#.#######.#.#.#####.#.#.#.###.#.#####.###.#####.#######.#.###.#.#####.#.###.#######.#.#####.# +#.......#...#...#.#.#.#.#.#.#.........#...#...#.#.#...#...#.#.....#.#.#.#...#...#...#.#...#...#.......#.#.#.........#.#...#...#.#...........# +#.#####.#####.###.#.#.#.###.#########.###.#.#####.#.#.#.#########.#.#.#.###.#####.#.#.#.#.#.#.#.#####.#.#.###########.#######.#.#.###.#.##### +#...#.........#...#.#.#...#.#.......#...#...#.....#.#...#.........#.#.#...#.#.....#.#.#.#.#.#.......#.#.#.........#...#.....#.#.............# +#.#.###########.###.###.#.#.#######.#.#.#####.#####.#####.#######.#.#.#.#.#.#.###.#.#.#.#.#.#######.#.#.#########.#.###.###.#.#.#.#####.###.# +#.#.#.......#.............#.....#...#.....#.......#.#.....#...#...#.#.#...........#.#.#.#.#.#...#...#...#.#.......#.#...#.......#.........#.# +###.#.#####.###.#.###.###.###.#.#.###.#.###.#####.#.#.###.#.#.#.###.#.#.#######.###.#.###.#.###.#.#######.#.#######.#.#.#######.#######.#.#.# +#...#.....#...#.....#.#...#...#.#.....#...#...#...#.#.#...#.#.#...#.#.#...#.#...#...#...#.#.....#.....#.......................#...#.....#.#.# +#.#######.###.#.###.#.#.#.#.#.#.#.###.#.#.###.#.###.#.#.###.#.###.#.#.###.#.#.#########.#.###.#####.#.###.#.#.###.#.#########.#.#.#.###.#.#.# +#.......#.#.#...#...#...#...........................#.#.#...#.#...#.#...#...#.....#...#.#.....#.....#...#.#.#...................#.#.#...#...# +#.#.###.#.#.###.#.#.#########.#.###.#.#.###.#.#########.#.#.###.###.#######.#####.#.#.#.#.#####.#######.#.#.###.#.#########.#.#.###.#.#.###.# +#.#.#.#...#...#.#.#.......................#.#.#.........#.#.#...#.#.#.....#.#...#...#...#...#...#.......#.#.....#...#.......#.#.#...#.....#.# +#.#.#.#####.#.#.###.###########.#########.#.#.#####.#####.#.#.###.#.#.#.###.#.#.#############.###.#######.#########.#.#######.#.#.#####.#.#.# +#S..........#.#...........................#.........#.....#.......#...#.......#...............#...................#...........#.........#...# +############################################################################################################################################# diff --git a/2024/go/day17/day17.go b/2024/go/day17/day17.go new file mode 100644 index 0000000..312b2d7 --- /dev/null +++ b/2024/go/day17/day17.go @@ -0,0 +1,91 @@ +package day17 + +import ( + "encoding/json" + "fmt" + "regexp" + "strings" + "golang.org/x/exp/slices" + + + "adventofcode2024/utils" + +) + +type Opcode int + +const ( + adv Opcode = 0 + bxl Opcode = 1 + bst Opcode = 2 + jnx Opcode = 3 + bxc Opcode = 4 + out Opcode = 5 + bdv Opcode = 6 + cdv Opcode = 7 + +) + +func Part1(input string) string { + m := regexp.MustCompile(`[\d,]+`).FindAllString(input, -1) + a := utils.MustAtoi(m[0]) + b := utils.MustAtoi(m[1]) + c := utils.MustAtoi(m[2]) + + var pgm []int + json.Unmarshal([]byte("["+m[3]+"]"), &pgm) + + fmt.Printf("%d %d %d %v\n", a, b, c, pgm) + out := fmt.Sprint(run(a, b, c, pgm)) + out = fmt.Sprint(strings.Trim(strings.ReplaceAll(out, " ", ","), "[]")) + return out +} + +func Part2(input string) int { + m := regexp.MustCompile(`[\d,]+`).FindAllString(input, -1) + b := utils.MustAtoi(m[1]) + c := utils.MustAtoi(m[2]) + + var pgm []int + json.Unmarshal([]byte("["+m[3]+"]"), &pgm) + + fmt.Printf("%d %d %v\n", b, c, pgm) + + a := 0 + for n := len(pgm) - 1; n >= 0; n-- { + a <<= 3 + for !slices.Equal(run(a, b, c, pgm), pgm[n:]) { + a++ + } + } + return a +} + +func run(a, b, c int, pgm []int) (output []int) { + for ip := 0; ip < len(pgm); ip += 2 { + operand := pgm[ip+1] + combo := []int{0, 1, 2, 3, a, b, c}[operand] + + switch pgm[ip] { + case int(adv): + a >>= combo + case int(bxl): + b ^= operand + case int(bst): + b = combo % 8 + case int(jnx): + if a != 0 { + ip = operand - 2 + } + case int(bxc): + b ^= c + case int(out): + output = append(output, combo%8) + case int(bdv): + b = a >> combo + case int(cdv): + c = a >> combo + } + } + return output +} \ No newline at end of file diff --git a/2024/go/day17/day17_test.go b/2024/go/day17/day17_test.go new file mode 100644 index 0000000..ba2ffcc --- /dev/null +++ b/2024/go/day17/day17_test.go @@ -0,0 +1,25 @@ +package day17 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`Register A: 729 +Register B: 0 +Register C: 0 + +Program: 0,1,5,4,3,0`) + require.Equal(t, "4,6,3,5,6,3,5,2,1,0", r) +} + +func TestPart2(t *testing.T) { + r := Part2(`Register A: 2024 +Register B: 0 +Register C: 0 + +Program: 0,3,5,4,3,0`) + require.Equal(t, 117440, r) +} diff --git a/2024/go/day17/input.txt b/2024/go/day17/input.txt new file mode 100644 index 0000000..9d9d9cd --- /dev/null +++ b/2024/go/day17/input.txt @@ -0,0 +1,5 @@ +Register A: 61156655 +Register B: 0 +Register C: 0 + +Program: 2,4,1,5,7,5,4,3,1,6,0,3,5,5,3,0 diff --git a/2024/go/day18/day18.go b/2024/go/day18/day18.go new file mode 100644 index 0000000..9faee97 --- /dev/null +++ b/2024/go/day18/day18.go @@ -0,0 +1,126 @@ +package day18 + +import ( + "adventofcode2024/utils" + "adventofcode2024/utils/dijkstra" + "adventofcode2024/utils/grid2d" + "fmt" + "strings" +) + +type ( + Vec struct{ x, y int } + Dir struct{ x, y int } + Cell rune + Move struct { + p Vec + d Dir + } + Maze struct { + height, width int + start Vec + end Vec + grid *grid2d.Grid[Cell] + } +) + +const ( + WALL Cell = '#' + CORRIDOR Cell = '.' + START Cell = 'S' + END Cell = 'E' + PATH Cell = '*' +) + +var ( + NORTH = Dir{0, -1} + EAST = Dir{1, 0} + SOUTH = Dir{0, 1} + WEST = Dir{-1, 0} + DIRECTIONS = []Dir{NORTH, EAST, SOUTH, WEST} +) + +func Part1(input string) int { + maze := Maze{}.Parse(input, 1024) + fmt.Println(maze) + data := inputGraph(*maze) + graph := dijkstra.CreateGraph(data) + path, dist := dijkstra.GetShortestPath(data.From, data.To, graph) + for _, p := range path { + maze.grid.Set(p.X, p.Y, PATH) + } + fmt.Println(maze) + return dist +} +func Part2(input string) int { + maze := Maze{}.Parse(input, 2877) + fmt.Println(maze) + data := inputGraph(*maze) + graph := dijkstra.CreateGraph(data) + _, count := dijkstra.GetShortestPath(data.From, data.To, graph) + return count +} + +func inputGraph(maze Maze) dijkstra.InputGraph { + data := dijkstra.InputGraph{} + data.From = dijkstra.Point{X: maze.start.x, Y: maze.start.y} + data.To = dijkstra.Point{X: maze.end.x, Y: maze.end.y} + for y := 0; y < maze.height; y++ { + for x := 0; x < maze.width; x++ { + if maze.grid.Get(x, y) == WALL { + continue + } + for _, dir := range DIRECTIONS { + nx, ny := x+dir.x, y+dir.y + if nx < 0 || ny < 0 || nx >= maze.width || ny >= maze.height { + continue + } + if maze.grid.Get(nx, ny) == WALL { + continue + } + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: x, Y: y}, + Destination: dijkstra.Point{X: nx, Y: ny}, + Weight: 1, + }) + } + } + } + + return data +} + +func (m Maze) Parse(input string, bytes int) *Maze { + m.grid = grid2d.NewGrid(71, 71, CORRIDOR) + for _, line := range strings.Split(input, "\n") { + if bytes == 0 { + break + } + in := strings.Split(line, ",") + x := utils.MustAtoi(in[0]) + y := utils.MustAtoi(in[1]) + m.grid.Set(x, y, WALL) + bytes-- + } + m.start = Vec{0, 0} + m.end = Vec{70, 70} + m.height, m.width = m.grid.SizeY(), m.grid.SizeX() + return &m +} + +func (m *Maze) String() string { + s := "" + for y := 0; y < m.height; y++ { + for x := 0; x < m.width; x++ { + if y == m.start.y && x == m.start.x { + s += string(START) + } else if y == m.end.y && x == m.end.x { + s += string(END) + } else { + s += string(m.grid.Get(x, y)) + } + } + s += "\n" + } + return s +} diff --git a/2024/go/day18/day18_test.go b/2024/go/day18/day18_test.go new file mode 100644 index 0000000..aec55d5 --- /dev/null +++ b/2024/go/day18/day18_test.go @@ -0,0 +1,6915 @@ +package day18 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`2,5 +20,1 +63,59 +21,29 +37,59 +33,63 +14,33 +70,15 +21,34 +62,5 +45,54 +45,60 +48,53 +33,58 +23,35 +22,3 +33,0 +63,62 +44,67 +52,55 +5,19 +42,55 +45,0 +57,3 +15,45 +41,62 +1,39 +63,19 +39,59 +39,3 +48,7 +61,65 +31,1 +54,51 +11,14 +53,62 +67,68 +65,16 +17,45 +21,24 +55,3 +30,15 +4,39 +69,19 +69,57 +41,57 +43,24 +19,11 +18,27 +3,48 +8,13 +41,66 +67,67 +61,62 +5,37 +18,19 +29,64 +13,14 +42,57 +33,67 +0,19 +67,53 +47,59 +19,3 +51,54 +53,69 +42,5 +7,26 +59,65 +50,69 +3,27 +26,9 +43,3 +17,7 +15,11 +12,31 +43,5 +50,65 +9,5 +29,3 +21,6 +65,15 +43,57 +15,37 +50,53 +67,51 +29,1 +47,7 +55,54 +52,51 +47,54 +17,26 +12,43 +65,51 +1,27 +15,22 +63,15 +7,37 +69,49 +57,59 +7,36 +60,7 +66,7 +18,35 +13,36 +21,19 +15,3 +46,9 +30,3 +53,7 +8,7 +66,3 +49,69 +35,65 +48,5 +33,6 +1,31 +26,5 +44,59 +68,13 +45,67 +9,16 +51,55 +57,5 +2,33 +57,64 +31,2 +1,19 +5,12 +19,37 +40,67 +10,19 +21,12 +3,31 +51,1 +4,29 +52,65 +47,5 +17,19 +70,47 +11,19 +57,10 +54,55 +39,53 +61,56 +49,55 +28,37 +21,30 +9,45 +43,69 +57,19 +29,10 +60,63 +19,32 +66,5 +53,45 +53,49 +47,57 +26,1 +17,34 +65,7 +7,28 +41,63 +6,1 +69,69 +0,13 +5,28 +10,1 +38,67 +37,13 +3,7 +39,12 +2,15 +54,65 +35,53 +63,20 +13,30 +52,47 +13,3 +69,55 +55,61 +37,4 +7,35 +57,4 +35,69 +5,3 +63,64 +40,69 +59,5 +32,61 +66,61 +43,64 +40,1 +49,3 +68,65 +3,38 +21,4 +49,56 +18,29 +23,12 +7,11 +16,29 +8,11 +10,25 +39,67 +59,60 +3,19 +26,31 +7,9 +51,58 +49,67 +53,65 +65,59 +67,9 +43,58 +55,51 +69,7 +6,39 +49,59 +10,37 +4,43 +54,5 +3,28 +69,16 +67,7 +4,37 +37,1 +27,2 +62,59 +45,70 +25,35 +65,53 +31,7 +53,59 +1,10 +67,10 +65,67 +30,67 +17,1 +67,59 +31,61 +59,59 +65,69 +51,59 +61,66 +13,15 +29,65 +27,1 +65,65 +68,53 +53,11 +5,17 +20,35 +43,68 +3,30 +59,7 +3,39 +45,63 +7,31 +3,13 +51,5 +23,39 +20,3 +67,0 +37,3 +46,61 +65,70 +15,1 +17,11 +66,63 +32,23 +51,0 +3,1 +17,3 +13,6 +59,3 +19,31 +1,24 +41,3 +4,49 +40,57 +63,6 +16,17 +22,25 +39,60 +11,34 +56,7 +38,57 +55,53 +35,66 +1,11 +64,19 +50,3 +9,38 +19,8 +64,61 +3,17 +8,33 +13,1 +5,9 +50,7 +1,34 +41,65 +48,57 +14,13 +17,31 +56,1 +6,15 +24,25 +23,2 +69,13 +45,52 +15,23 +15,27 +27,28 +60,3 +31,30 +19,35 +42,53 +19,27 +61,1 +65,50 +53,2 +52,61 +15,20 +42,7 +67,20 +11,23 +29,54 +6,17 +41,53 +47,63 +68,51 +21,21 +19,6 +53,61 +23,29 +53,9 +19,29 +21,10 +2,41 +10,3 +49,9 +42,59 +12,1 +45,7 +19,28 +3,35 +69,6 +43,4 +17,21 +47,3 +52,7 +65,22 +45,62 +16,5 +51,3 +48,11 +7,33 +40,3 +26,35 +37,63 +49,68 +11,26 +54,67 +64,23 +21,17 +5,49 +63,65 +23,13 +58,1 +61,54 +69,56 +47,60 +11,7 +9,35 +57,58 +45,66 +1,23 +7,21 +17,12 +11,17 +34,3 +25,25 +22,35 +57,65 +17,17 +1,5 +12,33 +36,63 +19,15 +7,38 +53,55 +21,25 +42,1 +17,23 +35,67 +33,3 +56,63 +56,59 +3,2 +42,67 +65,56 +45,5 +5,33 +21,22 +9,42 +3,14 +21,14 +59,53 +64,53 +33,25 +11,35 +9,1 +63,16 +47,49 +53,60 +47,55 +39,1 +63,60 +35,63 +9,31 +55,68 +57,57 +68,15 +11,39 +62,69 +41,45 +55,57 +5,13 +9,14 +1,32 +17,5 +19,19 +19,30 +1,29 +55,56 +6,35 +21,8 +13,0 +4,25 +16,33 +69,9 +53,67 +67,17 +52,67 +41,59 +24,1 +51,7 +54,7 +3,22 +7,13 +41,61 +45,3 +21,33 +37,53 +11,13 +45,8 +48,1 +43,13 +17,46 +1,33 +41,69 +22,19 +19,38 +19,12 +45,57 +53,6 +15,36 +35,68 +9,21 +43,65 +5,41 +7,7 +68,61 +60,1 +7,23 +21,28 +23,34 +63,69 +7,40 +51,64 +66,51 +43,61 +49,63 +69,11 +50,51 +53,13 +17,24 +47,65 +32,67 +4,15 +38,1 +58,63 +23,21 +61,59 +15,21 +11,27 +33,65 +2,1 +20,25 +11,3 +55,67 +5,31 +43,53 +63,66 +3,29 +65,55 +36,69 +64,1 +3,23 +11,6 +52,57 +61,4 +63,17 +61,69 +3,33 +65,4 +21,16 +27,11 +1,3 +5,39 +69,54 +63,47 +1,36 +27,27 +33,61 +25,37 +61,14 +15,26 +55,1 +7,17 +29,11 +11,12 +2,19 +66,55 +45,59 +29,29 +26,39 +8,17 +45,65 +11,37 +2,39 +0,29 +5,27 +16,31 +67,65 +68,63 +26,25 +9,30 +3,36 +48,65 +59,51 +63,1 +7,41 +23,28 +1,15 +18,1 +4,41 +43,63 +21,27 +67,22 +52,69 +7,18 +68,49 +3,12 +18,17 +9,41 +19,13 +1,17 +3,26 +59,61 +57,66 +53,63 +39,69 +3,3 +67,69 +50,57 +9,19 +1,13 +55,58 +49,6 +7,3 +47,1 +12,37 +59,63 +61,67 +8,45 +41,1 +8,1 +39,63 +8,27 +15,19 +1,25 +61,57 +47,66 +46,5 +0,39 +4,3 +67,8 +9,43 +64,67 +49,47 +63,14 +51,57 +0,47 +8,3 +21,15 +63,57 +46,3 +5,21 +15,31 +57,12 +13,18 +21,23 +67,15 +21,7 +23,14 +67,55 +63,63 +21,13 +67,58 +51,49 +25,26 +2,31 +56,51 +32,69 +55,7 +31,62 +65,57 +55,65 +5,24 +7,20 +11,15 +19,14 +65,21 +5,1 +67,5 +67,63 +67,49 +68,57 +19,21 +37,65 +11,1 +47,61 +33,7 +28,3 +12,21 +47,68 +41,70 +65,1 +69,23 +5,25 +47,11 +49,61 +1,35 +59,57 +1,37 +33,1 +53,57 +59,1 +49,65 +27,15 +60,11 +61,63 +5,34 +69,15 +9,20 +66,65 +49,62 +35,3 +55,5 +4,19 +21,20 +47,67 +59,68 +24,27 +41,5 +67,3 +21,3 +47,9 +65,17 +9,47 +23,3 +41,67 +65,63 +15,29 +55,49 +3,6 +69,17 +22,17 +48,51 +33,64 +51,65 +9,27 +58,55 +25,21 +69,24 +9,22 +64,63 +19,1 +9,36 +17,27 +54,49 +38,69 +8,5 +46,67 +60,57 +68,11 +0,7 +19,17 +39,65 +27,3 +9,40 +64,57 +17,25 +3,25 +19,9 +47,8 +58,61 +23,22 +21,11 +41,7 +18,9 +11,45 +51,67 +52,3 +8,43 +9,25 +69,8 +67,11 +2,27 +63,51 +65,61 +53,5 +7,19 +18,3 +67,18 +45,9 +55,63 +15,15 +47,64 +54,3 +13,31 +19,5 +41,64 +15,16 +37,67 +53,52 +12,9 +15,4 +25,34 +43,59 +2,17 +23,33 +57,8 +16,15 +57,67 +29,0 +66,69 +19,7 +42,61 +66,15 +67,61 +51,63 +36,7 +1,16 +2,23 +66,59 +67,2 +61,64 +56,65 +56,5 +15,2 +19,33 +15,28 +49,53 +5,35 +12,3 +65,18 +69,53 +11,33 +37,2 +47,69 +57,69 +11,5 +34,7 +3,45 +63,5 +15,33 +35,1 +17,20 +23,11 +6,31 +17,35 +50,61 +51,4 +64,3 +62,55 +3,9 +49,60 +13,35 +68,69 +21,37 +44,63 +2,9 +15,7 +49,5 +67,13 +9,39 +9,33 +9,24 +2,11 +5,23 +46,55 +17,22 +9,23 +48,3 +45,13 +47,58 +60,59 +5,18 +14,3 +24,11 +56,69 +43,55 +57,63 +55,10 +17,33 +53,47 +36,3 +13,16 +5,32 +64,7 +32,3 +51,51 +10,17 +13,37 +40,59 +11,31 +13,19 +19,10 +49,1 +34,1 +10,27 +42,9 +61,2 +58,57 +13,33 +25,3 +43,2 +23,31 +24,37 +59,66 +12,29 +7,10 +31,65 +19,23 +39,64 +22,39 +18,5 +55,62 +23,18 +39,62 +53,50 +21,31 +40,55 +58,5 +23,40 +67,66 +69,59 +23,25 +39,61 +1,7 +21,1 +21,5 +57,61 +51,53 +53,51 +5,29 +69,47 +30,27 +5,14 +10,45 +18,23 +7,29 +55,60 +40,7 +49,7 +14,31 +15,25 +68,19 +57,49 +12,23 +7,30 +60,49 +50,9 +16,1 +22,9 +57,55 +15,24 +65,49 +69,25 +59,69 +28,69 +4,21 +23,36 +58,69 +69,61 +23,8 +5,8 +43,1 +9,37 +55,69 +3,11 +66,53 +70,59 +14,19 +15,17 +9,13 +59,55 +36,65 +69,67 +8,23 +23,32 +3,8 +65,3 +69,65 +29,5 +9,15 +61,61 +13,34 +1,1 +3,4 +68,45 +45,56 +33,69 +67,48 +38,65 +6,21 +0,3 +63,68 +50,67 +15,13 +63,58 +9,34 +67,1 +48,63 +60,69 +69,51 +57,47 +70,67 +51,47 +59,54 +57,7 +43,67 +4,45 +59,67 +45,2 +67,57 +62,1 +69,52 +31,63 +69,21 +31,15 +27,9 +3,37 +19,25 +63,55 +6,3 +53,3 +20,21 +13,17 +23,30 +6,23 +43,7 +17,29 +57,2 +21,32 +51,69 +7,1 +44,5 +57,1 +33,66 +45,69 +59,8 +9,3 +13,23 +11,22 +65,5 +1,9 +24,17 +61,3 +49,57 +12,19 +13,28 +69,12 +10,51 +53,53 +13,47 +31,69 +24,43 +69,63 +20,17 +67,21 +44,55 +33,68 +7,15 +45,1 +39,55 +39,4 +69,60 +23,27 +45,61 +51,61 +25,1 +63,3 +37,69 +33,5 +17,15 +9,32 +7,39 +63,54 +65,47 +29,19 +53,43 +60,33 +57,45 +5,6 +47,27 +39,25 +48,47 +53,36 +43,18 +49,21 +41,21 +23,19 +52,35 +39,45 +55,17 +29,39 +57,51 +55,45 +54,27 +33,26 +40,19 +44,17 +57,20 +37,45 +27,64 +31,13 +41,13 +5,7 +9,57 +10,69 +23,47 +1,51 +0,69 +49,12 +3,58 +15,9 +21,53 +53,27 +45,11 +63,42 +27,56 +6,11 +27,12 +27,31 +23,41 +35,41 +15,61 +61,27 +21,43 +41,43 +17,56 +11,66 +41,28 +51,37 +41,27 +38,59 +39,47 +59,41 +11,41 +26,59 +59,16 +29,35 +1,45 +33,41 +55,29 +65,39 +47,50 +28,5 +39,43 +35,21 +54,25 +43,16 +51,43 +31,17 +23,53 +37,21 +43,22 +22,55 +57,17 +15,49 +36,57 +11,48 +56,27 +36,39 +53,35 +8,51 +29,46 +61,29 +67,37 +31,35 +42,47 +63,41 +37,18 +43,36 +52,21 +63,9 +57,48 +29,36 +39,27 +35,59 +55,41 +25,53 +45,47 +19,66 +29,44 +61,5 +49,23 +14,59 +27,59 +19,58 +16,13 +44,51 +29,24 +13,7 +26,19 +37,20 +41,40 +28,27 +65,38 +41,47 +47,19 +49,49 +46,39 +38,55 +13,65 +53,44 +31,49 +36,5 +68,5 +42,45 +3,5 +4,63 +59,23 +23,56 +15,59 +37,52 +67,35 +11,11 +1,63 +11,25 +19,47 +31,33 +61,36 +27,46 +35,44 +46,21 +9,56 +5,59 +27,41 +35,37 +28,13 +39,20 +61,23 +36,15 +35,9 +7,8 +52,15 +14,39 +51,21 +65,25 +35,12 +58,15 +66,35 +23,7 +35,62 +63,25 +68,1 +23,64 +68,33 +65,28 +44,29 +19,67 +29,43 +47,51 +25,67 +2,45 +55,21 +37,43 +32,21 +58,51 +69,33 +13,29 +41,11 +47,23 +65,35 +23,45 +31,64 +41,50 +1,65 +25,39 +42,39 +44,47 +67,39 +32,35 +43,38 +51,29 +9,6 +41,24 +3,67 +57,31 +41,44 +53,19 +19,41 +14,61 +15,41 +46,49 +39,35 +62,51 +51,23 +32,9 +23,60 +1,47 +49,27 +57,36 +19,52 +43,49 +49,35 +21,50 +49,39 +53,38 +51,19 +21,57 +43,45 +33,38 +45,41 +1,56 +39,22 +21,63 +48,49 +47,30 +37,39 +4,61 +34,13 +26,51 +47,39 +19,45 +31,59 +3,52 +17,54 +69,45 +15,35 +49,11 +17,69 +55,13 +64,39 +57,33 +45,40 +28,21 +11,9 +64,29 +33,19 +21,60 +32,19 +47,25 +57,53 +31,4 +17,61 +69,5 +19,39 +46,15 +60,51 +9,50 +27,40 +63,29 +59,36 +11,55 +25,61 +30,55 +35,25 +27,69 +23,1 +9,65 +43,37 +27,42 +19,49 +56,45 +13,49 +35,7 +33,47 +43,11 +38,33 +35,49 +63,39 +41,20 +13,48 +1,60 +43,30 +7,45 +55,19 +65,19 +53,15 +33,53 +29,49 +51,45 +13,50 +34,23 +20,55 +10,11 +12,39 +17,53 +11,65 +27,37 +8,53 +65,24 +65,45 +61,45 +7,65 +59,37 +27,21 +39,39 +31,67 +45,23 +53,10 +59,22 +25,42 +1,57 +54,45 +13,10 +43,23 +37,51 +51,13 +40,35 +48,45 +36,27 +1,59 +39,51 +57,32 +31,5 +35,5 +8,69 +25,29 +39,9 +19,53 +29,40 +61,43 +7,62 +39,17 +3,54 +27,57 +67,43 +23,49 +53,17 +29,47 +25,41 +9,62 +61,35 +27,38 +23,9 +67,38 +41,49 +22,45 +43,15 +25,17 +13,69 +31,52 +29,68 +29,37 +30,37 +7,63 +37,27 +55,39 +65,13 +50,23 +59,11 +25,11 +25,65 +26,15 +55,37 +47,18 +20,69 +12,69 +8,47 +61,17 +53,12 +54,41 +9,69 +33,59 +57,37 +47,47 +61,39 +40,13 +69,3 +18,55 +22,47 +65,41 +31,45 +21,9 +38,27 +61,30 +61,55 +3,57 +51,11 +20,57 +41,51 +61,15 +40,37 +53,23 +49,38 +22,69 +1,61 +16,59 +20,65 +17,63 +51,17 +26,45 +24,31 +61,49 +38,41 +22,51 +29,16 +11,52 +34,35 +30,61 +37,33 +58,19 +9,29 +29,17 +61,9 +2,51 +7,59 +49,51 +35,55 +8,59 +29,41 +37,47 +23,67 +30,53 +15,69 +33,27 +49,31 +69,29 +59,43 +3,41 +43,10 +59,19 +35,27 +61,11 +27,25 +49,30 +28,57 +15,53 +39,29 +45,46 +16,41 +28,9 +27,61 +37,15 +29,18 +15,47 +17,57 +25,19 +37,25 +11,64 +45,12 +61,46 +14,67 +6,51 +19,65 +32,17 +21,65 +46,29 +51,28 +25,6 +19,51 +35,61 +47,41 +45,45 +39,49 +36,25 +19,59 +32,25 +25,47 +30,41 +62,19 +39,50 +41,41 +44,43 +53,37 +33,14 +40,51 +62,47 +19,48 +55,43 +63,13 +68,43 +65,29 +53,25 +23,59 +39,11 +54,17 +59,35 +63,53 +13,11 +35,58 +12,5 +63,21 +25,20 +45,37 +34,47 +24,55 +3,53 +11,67 +46,33 +25,31 +56,23 +36,43 +8,65 +61,19 +37,41 +41,31 +31,27 +37,23 +64,49 +6,67 +9,17 +11,40 +17,13 +26,11 +67,41 +23,57 +13,52 +50,17 +21,35 +33,51 +59,40 +27,5 +36,33 +3,62 +35,60 +58,43 +13,56 +24,67 +17,37 +29,53 +63,23 +20,51 +24,39 +13,12 +2,55 +62,41 +28,49 +39,44 +20,47 +52,27 +35,39 +59,25 +35,32 +49,29 +65,31 +35,52 +54,47 +29,51 +37,9 +13,13 +53,31 +45,39 +9,7 +39,13 +17,65 +37,31 +24,5 +30,5 +2,65 +28,7 +49,17 +55,55 +37,24 +13,5 +3,68 +49,13 +56,15 +21,49 +41,37 +43,26 +57,25 +3,47 +29,21 +47,43 +29,42 +55,11 +35,19 +6,55 +53,34 +23,17 +31,12 +4,69 +15,43 +66,33 +59,33 +13,57 +17,42 +10,67 +59,13 +50,37 +33,45 +35,40 +38,7 +21,41 +9,63 +53,1 +33,37 +13,66 +50,15 +1,55 +19,36 +18,47 +61,26 +49,25 +59,38 +5,43 +37,62 +11,61 +22,67 +61,18 +33,55 +18,61 +25,9 +62,49 +56,29 +65,44 +59,29 +33,39 +55,9 +49,37 +13,55 +35,22 +41,39 +48,19 +30,21 +13,9 +21,39 +37,61 +29,15 +27,52 +19,55 +47,35 +51,33 +8,55 +63,7 +35,46 +11,54 +29,69 +15,52 +31,46 +25,62 +63,43 +41,26 +61,41 +7,64 +43,35 +47,33 +40,33 +45,36 +57,41 +57,23 +57,27 +11,29 +5,69 +63,37 +7,25 +34,9 +57,24 +23,5 +59,18 +23,55 +48,41 +11,47 +16,57 +60,25 +60,23 +20,53 +66,47 +56,33 +30,11 +15,46 +26,33 +64,33 +51,10 +35,13 +5,55 +33,21 +10,55 +35,11 +9,53 +23,44 +63,11 +69,1 +21,45 +6,47 +42,17 +32,41 +17,49 +61,12 +35,45 +31,51 +55,20 +31,25 +7,51 +41,15 +45,31 +31,8 +29,13 +3,43 +27,70 +59,21 +43,41 +67,45 +59,46 +56,43 +5,66 +18,39 +39,10 +1,22 +68,25 +15,48 +68,41 +2,67 +37,46 +15,44 +25,69 +43,47 +61,28 +61,31 +43,20 +48,37 +19,44 +24,9 +27,16 +37,29 +51,40 +38,25 +62,31 +31,23 +47,21 +13,53 +12,61 +37,8 +5,47 +17,67 +49,44 +31,19 +25,57 +13,67 +3,65 +63,8 +3,69 +29,63 +11,63 +27,60 +31,37 +29,61 +25,27 +32,13 +1,53 +52,31 +57,35 +36,35 +67,32 +33,30 +4,57 +23,43 +39,31 +46,47 +5,61 +43,51 +51,9 +10,43 +5,63 +69,41 +7,60 +53,21 +45,35 +34,25 +37,35 +33,40 +64,9 +37,7 +9,49 +13,59 +70,43 +11,46 +43,34 +36,49 +29,9 +46,13 +31,38 +41,23 +65,33 +47,28 +54,37 +23,58 +33,33 +1,43 +7,67 +6,43 +63,33 +27,17 +49,41 +15,40 +43,21 +50,1 +61,21 +5,5 +51,48 +37,10 +44,49 +1,64 +55,31 +13,54 +47,31 +31,57 +45,49 +57,50 +52,25 +48,33 +61,13 +27,29 +31,28 +19,69 +23,15 +45,20 +65,42 +24,63 +55,47 +61,20 +40,29 +45,55 +11,59 +48,35 +25,5 +33,29 +15,10 +59,44 +41,29 +24,23 +43,27 +69,31 +37,38 +45,15 +51,15 +65,11 +5,46 +41,33 +62,37 +62,35 +53,20 +59,31 +9,67 +31,44 +46,37 +22,59 +27,19 +41,16 +25,4 +11,8 +31,9 +16,7 +28,61 +49,45 +45,21 +57,15 +50,25 +30,7 +14,69 +43,14 +33,49 +42,33 +67,36 +21,62 +51,38 +37,49 +62,9 +58,13 +35,43 +1,49 +57,46 +25,43 +5,67 +31,53 +59,9 +8,67 +13,63 +43,32 +33,42 +30,49 +0,63 +1,50 +21,59 +19,63 +36,55 +23,37 +67,27 +10,61 +5,56 +31,31 +47,13 +20,45 +28,31 +1,67 +15,62 +34,19 +55,40 +62,23 +2,47 +67,31 +39,5 +7,57 +15,70 +33,57 +28,53 +55,27 +7,5 +66,25 +47,22 +11,51 +23,51 +53,28 +61,33 +23,69 +65,37 +11,53 +31,3 +64,45 +7,69 +13,42 +31,34 +4,65 +68,21 +55,15 +41,55 +15,56 +39,33 +45,34 +25,15 +19,61 +21,67 +37,48 +24,53 +7,49 +37,30 +43,31 +5,15 +37,36 +31,41 +27,65 +25,13 +0,53 +37,57 +45,43 +15,65 +25,45 +33,48 +15,42 +15,38 +45,51 +3,55 +29,7 +39,23 +13,39 +20,63 +31,56 +45,27 +64,31 +27,39 +33,16 +25,14 +61,25 +21,55 +55,23 +43,39 +18,65 +15,67 +43,9 +30,59 +26,29 +41,17 +60,15 +25,23 +57,9 +24,15 +10,57 +17,59 +65,27 +52,45 +58,29 +70,31 +15,39 +55,35 +43,33 +17,55 +29,45 +55,14 +9,59 +53,16 +31,43 +15,5 +17,43 +62,43 +17,47 +59,28 +10,29 +67,29 +61,37 +69,36 +22,53 +43,43 +29,57 +48,15 +29,67 +61,47 +33,35 +51,31 +35,23 +27,13 +34,55 +27,18 +25,49 +25,63 +34,37 +39,38 +60,39 +55,25 +31,32 +53,39 +37,17 +39,21 +33,50 +68,27 +50,47 +26,53 +56,41 +15,51 +51,42 +11,43 +21,47 +35,33 +50,41 +31,11 +45,32 +31,29 +33,28 +15,57 +69,28 +23,63 +35,47 +55,22 +29,27 +29,59 +62,15 +27,67 +13,43 +53,24 +6,5 +29,50 +44,41 +10,63 +36,37 +1,58 +59,27 +39,37 +26,23 +25,33 +39,16 +15,50 +60,21 +3,63 +45,19 +46,41 +42,11 +5,57 +5,45 +4,53 +42,49 +49,33 +10,59 +21,69 +3,61 +30,19 +28,33 +21,42 +30,23 +69,37 +16,37 +33,17 +65,23 +38,53 +54,13 +43,19 +16,9 +34,61 +70,3 +38,49 +39,7 +37,42 +31,47 +15,54 +70,41 +50,21 +15,55 +61,44 +47,29 +54,9 +13,24 +18,69 +25,55 +45,10 +17,51 +52,13 +3,59 +27,53 +22,43 +45,25 +5,53 +39,19 +32,7 +13,51 +33,11 +13,61 +33,15 +59,39 +54,31 +63,31 +30,33 +50,35 +28,29 +22,65 +14,7 +13,64 +13,41 +35,30 +37,14 +27,63 +21,51 +23,23 +57,26 +66,29 +29,48 +35,50 +27,49 +51,35 +13,45 +69,35 +27,44 +13,27 +20,61 +37,19 +2,61 +33,9 +53,32 +61,53 +65,43 +44,13 +51,39 +35,17 +24,47 +27,55 +56,53 +31,36 +50,45 +51,30 +17,68 +29,33 +59,48 +47,45 +34,53 +41,19 +42,29 +45,44 +7,43 +63,45 +34,17 +51,25 +3,51 +37,12 +29,31 +3,42 +63,61 +66,13 +7,48 +27,43 +61,32 +59,49 +15,63 +3,15 +40,47 +35,31 +29,55 +26,57 +1,69 +65,10 +5,11 +24,21 +57,21 +41,25 +38,15 +37,5 +51,27 +41,30 +11,57 +63,26 +67,25 +29,23 +39,18 +17,39 +52,41 +57,39 +51,41 +25,50 +21,61 +35,15 +9,51 +69,30 +56,39 +49,20 +61,51 +27,23 +25,51 +49,16 +67,19 +63,35 +17,41 +56,17 +65,46 +63,40 +6,53 +37,28 +7,47 +32,53 +47,37 +59,45 +70,21 +49,32 +25,7 +26,67 +25,60 +65,26 +59,17 +9,55 +6,45 +11,21 +18,13 +25,68 +39,40 +11,50 +67,46 +45,33 +37,54 +7,58 +35,29 +55,33 +29,14 +23,61 +21,38 +57,11 +15,66 +38,45 +25,59 +40,43 +37,37 +51,18 +67,47 +18,51 +56,35 +49,43 +7,27 +13,44 +46,17 +31,39 +27,33 +5,51 +13,46 +68,39 +61,7 +39,26 +45,53 +43,29 +34,33 +39,15 +7,53 +33,44 +69,39 +62,11 +23,65 +59,15 +41,42 +55,59 +27,7 +50,33 +69,43 +32,59 +58,23 +29,58 +41,36 +49,24 +45,17 +55,34 +33,31 +16,61 +7,55 +31,21 +23,48 +46,45 +6,63 +41,14 +4,59 +35,57 +59,47 +49,28 +57,38 +63,27 +41,22 +13,21 +5,50 +47,26 +57,43 +53,22 +36,17 +57,13 +9,61 +66,39 +55,30 +16,67 +46,25 +13,25 +43,17 +9,11 +53,33 +35,20 +37,55 +58,33 +10,9 +44,23 +45,29 +33,10 +37,11 +63,67 +1,41 +64,35 +33,23 +19,43 +53,29 +47,17 +31,55 +13,58 +33,13 +59,42 +6,69 +43,25 +11,69 +47,15 +41,9 +25,64 +27,47 +47,42 +17,64 +47,53 +17,9 +20,67 +18,59 +13,26 +53,41 +29,26 +59,30 +33,56 +44,27 +26,47 +27,66 +3,21 +49,26 +29,66 +12,59 +41,35 +25,48 +33,32 +27,35 +39,57 +15,64 +37,22 +39,6 +5,65 +11,49 +65,9 +29,25 +49,15 +9,9 +66,41 +55,18 +41,52 +38,31 +59,52 +69,34 +27,51 +27,45 +59,10 +3,49 +29,22 +7,61 +35,35 +32,49 +67,33 +63,48 +20,41 +19,40 +1,21 +1,44 +57,29 +64,13 +49,14 +17,44 +40,9 +19,57 +69,27 +67,23 +63,49 +62,25 +47,24 +17,50 +35,51 +50,11 +32,47 +33,43 +49,19 +39,41 +67,30 +61,34 +43,60 +12,46 +70,22 +38,20 +14,44 +41,38 +22,52 +12,67 +2,7 +58,46 +34,30 +34,70 +6,46 +20,68 +7,24 +9,18 +33,20 +60,42 +67,24 +37,6 +0,61 +12,18 +20,10 +39,54 +69,0 +16,65 +40,63 +14,10 +34,21 +54,56 +16,21 +62,12 +23,24 +48,61 +70,29 +30,16 +0,66 +70,6 +6,52 +30,62 +35,14 +62,36 +48,58 +13,8 +28,60 +22,26 +66,17 +62,54 +40,53 +12,53 +23,54 +61,40 +43,66 +0,34 +15,68 +32,66 +22,10 +42,48 +28,6 +38,38 +55,28 +46,23 +16,68 +52,54 +5,52 +4,64 +57,42 +2,49 +38,12 +64,38 +28,52 +68,31 +68,52 +21,70 +16,16 +8,31 +9,66 +4,55 +11,68 +36,14 +42,16 +32,39 +54,64 +18,58 +52,46 +68,22 +7,0 +29,62 +0,44 +35,8 +18,67 +23,52 +58,42 +26,2 +32,57 +8,66 +30,20 +0,30 +12,6 +46,1 +49,2 +34,56 +16,52 +2,2 +48,24 +25,38 +41,34 +46,28 +32,26 +53,48 +34,69 +11,28 +3,64 +62,8 +12,48 +19,22 +4,11 +24,30 +22,31 +32,45 +19,68 +12,60 +7,32 +22,38 +25,58 +55,42 +47,70 +18,28 +66,62 +34,41 +44,57 +4,10 +53,64 +38,34 +12,22 +37,70 +0,42 +30,31 +35,54 +61,48 +58,34 +36,38 +66,43 +54,52 +39,66 +43,62 +60,52 +37,44 +42,22 +53,0 +70,25 +18,40 +69,20 +53,58 +21,18 +25,12 +0,67 +25,44 +22,14 +48,32 +48,38 +18,15 +52,30 +34,15 +52,43 +52,52 +46,63 +2,22 +10,21 +22,64 +37,58 +10,31 +21,64 +6,40 +0,58 +36,42 +24,2 +65,20 +0,1 +2,58 +21,26 +0,68 +62,26 +8,32 +38,17 +11,56 +19,18 +31,20 +43,70 +0,5 +3,10 +14,38 +14,37 +32,33 +18,44 +62,53 +6,29 +70,30 +42,21 +18,37 +23,38 +14,60 +46,59 +34,22 +10,48 +8,63 +68,20 +50,58 +44,32 +4,67 +40,14 +22,34 +6,25 +38,52 +38,48 +32,30 +38,54 +26,49 +5,30 +34,48 +45,28 +56,58 +17,60 +10,38 +44,70 +24,49 +7,12 +42,38 +38,13 +52,48 +40,2 +52,59 +20,52 +21,68 +44,44 +2,70 +10,6 +24,52 +40,48 +48,20 +70,20 +36,23 +36,58 +20,27 +58,4 +2,8 +26,38 +4,38 +36,60 +12,57 +34,49 +30,29 +48,50 +18,60 +22,21 +64,62 +31,50 +20,37 +20,33 +5,40 +34,46 +12,12 +17,32 +2,29 +44,28 +58,45 +32,63 +54,30 +12,42 +16,28 +8,16 +66,42 +12,49 +12,63 +26,68 +18,25 +44,21 +17,6 +34,34 +36,67 +2,13 +26,3 +70,0 +39,58 +17,14 +18,12 +43,50 +16,25 +2,34 +8,50 +62,6 +26,41 +50,40 +30,56 +18,49 +4,32 +16,60 +22,8 +15,6 +21,36 +4,58 +29,28 +47,40 +36,62 +34,14 +33,60 +8,44 +43,8 +60,55 +39,30 +24,24 +36,11 +47,48 +38,32 +22,58 +31,10 +38,60 +16,46 +10,5 +23,50 +0,14 +4,60 +10,64 +20,22 +66,37 +28,51 +27,26 +38,21 +30,43 +19,20 +0,28 +16,54 +40,46 +34,5 +56,42 +8,34 +41,68 +61,8 +50,63 +27,14 +36,8 +26,36 +30,70 +36,20 +70,33 +41,2 +70,19 +5,22 +38,10 +10,40 +28,42 +42,41 +46,42 +0,23 +70,46 +24,40 +16,39 +38,56 +26,50 +22,5 +40,56 +34,57 +52,64 +46,70 +8,26 +3,34 +32,52 +70,44 +12,24 +8,10 +28,50 +14,16 +20,56 +9,60 +8,20 +37,34 +49,22 +27,24 +17,10 +68,30 +22,62 +22,15 +58,35 +69,44 +14,20 +48,22 +48,25 +51,2 +26,21 +6,30 +12,26 +33,12 +5,60 +60,56 +0,70 +4,56 +56,50 +58,47 +46,0 +50,22 +52,68 +4,4 +32,36 +34,60 +30,17 +36,56 +62,42 +28,23 +3,50 +35,28 +39,34 +38,3 +30,12 +20,7 +18,57 +52,60 +6,50 +52,49 +4,13 +56,56 +8,70 +44,8 +70,1 +28,62 +42,42 +60,12 +50,28 +47,38 +60,43 +50,54 +51,50 +55,12 +31,18 +47,32 +18,16 +16,6 +62,32 +24,69 +2,54 +62,27 +40,32 +38,68 +8,36 +59,70 +52,16 +68,37 +24,18 +53,8 +14,70 +31,60 +32,4 +33,36 +64,14 +52,22 +31,22 +12,51 +16,38 +30,1 +48,40 +57,56 +69,40 +25,32 +50,60 +49,4 +30,64 +46,22 +28,48 +42,56 +2,43 +46,6 +6,41 +43,46 +20,59 +54,6 +58,64 +0,59 +41,10 +54,42 +62,63 +30,57 +4,17 +22,40 +60,44 +52,42 +28,30 +7,2 +0,15 +22,27 +70,38 +30,68 +5,64 +35,38 +0,20 +17,62 +55,70 +5,4 +56,60 +34,42 +60,61 +40,27 +38,44 +5,16 +14,51 +18,26 +46,46 +69,26 +48,14 +32,43 +10,28 +27,22 +54,20 +14,48 +67,26 +57,0 +4,70 +59,12 +51,6 +40,10 +59,20 +32,8 +34,2 +20,18 +62,44 +64,46 +20,58 +56,31 +54,69 +28,14 +0,17 +22,12 +52,0 +20,44 +34,8 +32,29 +65,30 +56,3 +26,52 +4,47 +22,1 +13,38 +62,65 +0,31 +44,42 +42,15 +42,10 +24,38 +10,62 +26,64 +48,64 +48,21 +43,56 +8,46 +4,7 +9,0 +30,14 +56,61 +68,34 +56,55 +13,40 +50,62 +8,2 +50,39 +18,68 +0,37 +4,5 +47,36 +14,24 +44,58 +56,25 +24,62 +6,13 +11,2 +20,5 +18,11 +51,16 +56,6 +53,70 +32,0 +34,51 +37,56 +18,41 +42,70 +24,20 +22,44 +28,46 +20,38 +36,34 +10,56 +43,44 +0,60 +1,70 +37,0 +58,12 +68,17 +66,14 +70,40 +61,58 +53,40 +60,19 +14,4 +3,20 +6,38 +53,18 +24,8 +14,43 +42,43 +50,4 +57,30 +7,50 +37,40 +64,65 +36,47 +66,34 +16,27 +70,34 +20,14 +60,27 +32,31 +66,48 +43,28 +64,28 +67,54 +13,70 +50,38 +42,58 +52,26 +24,29 +20,48 +17,30 +66,67 +68,64 +68,9 +14,68 +70,24 +38,5 +60,47 +11,60 +67,12 +0,43 +1,12 +56,16 +38,22 +24,68 +51,8 +38,63 +60,22 +36,54 +38,61 +66,45 +46,27 +48,8 +6,0 +27,30 +8,40 +32,60 +5,62 +62,67 +64,32 +52,37 +60,5 +70,64 +10,18 +63,52 +18,20 +34,39 +1,62 +51,34 +40,49 +28,38 +51,62 +8,54 +45,58 +5,10 +12,15 +68,8 +26,22 +35,34 +58,32 +32,34 +10,10 +6,7 +38,42 +62,57 +52,6 +40,22 +62,70 +58,6 +50,48 +41,46 +52,18 +60,2 +25,70 +5,0 +50,6 +39,2 +2,4 +62,45 +48,23 +57,34 +55,66 +18,14 +9,52 +24,22 +54,60 +49,52 +12,54 +54,14 +63,44 +56,64 +4,0 +20,50 +18,64 +1,18 +14,41 +16,35 +29,2 +66,52 +12,50 +42,68 +34,24 +56,57 +66,32 +57,60 +28,8 +22,66 +32,32 +52,58 +50,42 +4,36 +16,32 +65,58 +56,20 +42,0 +17,4 +34,68 +49,36 +32,58 +68,50 +19,16 +6,70 +40,38 +60,37 +50,49 +34,40 +51,70 +1,38 +13,32 +53,66 +6,32 +65,32 +32,22 +14,55 +38,30 +44,26 +66,8 +50,30 +48,31 +5,36 +52,19 +29,30 +24,50 +55,36 +46,69 +64,18 +44,0 +27,10 +68,32 +60,13 +12,17 +10,34 +18,18 +70,52 +10,8 +12,38 +16,70 +8,9 +58,65 +64,21 +70,4 +5,48 +22,49 +36,2 +18,30 +41,6 +10,44 +48,48 +60,14 +23,42 +46,36 +18,56 +40,18 +36,40 +24,59 +64,64 +40,11 +59,50 +14,57 +25,46 +65,0 +32,16 +24,4 +40,34 +50,36 +38,50 +20,30 +66,38 +14,40 +70,62 +6,58 +12,28 +62,60 +68,28 +36,29 +58,37 +45,68 +22,22 +40,65 +49,64 +24,65 +40,8 +0,12 +40,64 +70,66 +23,62 +66,49 +28,32 +47,44 +10,12 +29,8 +26,18 +28,16 +49,50 +7,6 +30,54 +52,10 +32,10 +1,0 +40,28 +7,52 +18,54 +5,42 +58,10 +54,40 +41,4 +10,22 +24,56 +44,36 +39,14 +12,2 +65,48 +20,16 +10,4 +56,66 +40,68 +16,19 +45,42 +20,43 +50,18 +40,15 +0,6 +18,62 +14,2 +51,44 +35,48 +54,68 +7,4 +30,25 +27,36 +48,9 +42,46 +57,54 +68,55 +34,59 +58,16 +70,65 +70,14 +24,12 +46,12 +30,39 +55,2 +38,8 +62,22 +3,70 +60,40 +7,44 +9,44 +16,58 +64,2 +22,46 +40,45 +23,0 +62,30 +46,18 +23,6 +27,48 +31,66 +66,30 +52,9 +29,20 +36,21 +69,10 +24,41 +8,38 +44,34 +37,66 +68,4 +34,28 +21,44 +28,70 +42,30 +35,42 +46,16 +6,8 +36,48 +8,61 +14,26 +62,0 +28,45 +46,7 +7,68 +32,40 +61,24 +32,1 +40,12 +58,2 +62,58 +0,2 +42,60 +13,68 +48,59 +6,18 +36,28 +61,0 +63,28 +58,8 +44,33 +59,6 +64,6 +12,62 +30,32 +39,56 +70,32 +67,44 +56,11 +38,6 +2,36 +60,50 +55,26 +58,66 +55,8 +48,17 +56,2 +64,0 +60,41 +64,24 +42,52 +30,13 +16,20 +30,44 +1,26 +47,34 +24,54 +56,8 +16,0 +2,32 +62,38 +70,56 +18,50 +9,28 +63,38 +30,18 +10,70 +44,25 +57,40 +28,26 +54,0 +36,12 +32,24 +44,62 +52,23 +19,54 +45,30 +51,68 +8,8 +48,62 +40,60 +48,6 +48,69 +22,36 +61,10 +62,28 +51,66 +14,18 +53,56 +29,52 +63,4 +46,50 +26,69 +52,56 +21,54`) + require.Equal(t, 304, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`2,5 +20,1 +63,59 +21,29 +37,59 +33,63 +14,33 +70,15 +21,34 +62,5 +45,54 +45,60 +48,53 +33,58 +23,35 +22,3 +33,0 +63,62 +44,67 +52,55 +5,19 +42,55 +45,0 +57,3 +15,45 +41,62 +1,39 +63,19 +39,59 +39,3 +48,7 +61,65 +31,1 +54,51 +11,14 +53,62 +67,68 +65,16 +17,45 +21,24 +55,3 +30,15 +4,39 +69,19 +69,57 +41,57 +43,24 +19,11 +18,27 +3,48 +8,13 +41,66 +67,67 +61,62 +5,37 +18,19 +29,64 +13,14 +42,57 +33,67 +0,19 +67,53 +47,59 +19,3 +51,54 +53,69 +42,5 +7,26 +59,65 +50,69 +3,27 +26,9 +43,3 +17,7 +15,11 +12,31 +43,5 +50,65 +9,5 +29,3 +21,6 +65,15 +43,57 +15,37 +50,53 +67,51 +29,1 +47,7 +55,54 +52,51 +47,54 +17,26 +12,43 +65,51 +1,27 +15,22 +63,15 +7,37 +69,49 +57,59 +7,36 +60,7 +66,7 +18,35 +13,36 +21,19 +15,3 +46,9 +30,3 +53,7 +8,7 +66,3 +49,69 +35,65 +48,5 +33,6 +1,31 +26,5 +44,59 +68,13 +45,67 +9,16 +51,55 +57,5 +2,33 +57,64 +31,2 +1,19 +5,12 +19,37 +40,67 +10,19 +21,12 +3,31 +51,1 +4,29 +52,65 +47,5 +17,19 +70,47 +11,19 +57,10 +54,55 +39,53 +61,56 +49,55 +28,37 +21,30 +9,45 +43,69 +57,19 +29,10 +60,63 +19,32 +66,5 +53,45 +53,49 +47,57 +26,1 +17,34 +65,7 +7,28 +41,63 +6,1 +69,69 +0,13 +5,28 +10,1 +38,67 +37,13 +3,7 +39,12 +2,15 +54,65 +35,53 +63,20 +13,30 +52,47 +13,3 +69,55 +55,61 +37,4 +7,35 +57,4 +35,69 +5,3 +63,64 +40,69 +59,5 +32,61 +66,61 +43,64 +40,1 +49,3 +68,65 +3,38 +21,4 +49,56 +18,29 +23,12 +7,11 +16,29 +8,11 +10,25 +39,67 +59,60 +3,19 +26,31 +7,9 +51,58 +49,67 +53,65 +65,59 +67,9 +43,58 +55,51 +69,7 +6,39 +49,59 +10,37 +4,43 +54,5 +3,28 +69,16 +67,7 +4,37 +37,1 +27,2 +62,59 +45,70 +25,35 +65,53 +31,7 +53,59 +1,10 +67,10 +65,67 +30,67 +17,1 +67,59 +31,61 +59,59 +65,69 +51,59 +61,66 +13,15 +29,65 +27,1 +65,65 +68,53 +53,11 +5,17 +20,35 +43,68 +3,30 +59,7 +3,39 +45,63 +7,31 +3,13 +51,5 +23,39 +20,3 +67,0 +37,3 +46,61 +65,70 +15,1 +17,11 +66,63 +32,23 +51,0 +3,1 +17,3 +13,6 +59,3 +19,31 +1,24 +41,3 +4,49 +40,57 +63,6 +16,17 +22,25 +39,60 +11,34 +56,7 +38,57 +55,53 +35,66 +1,11 +64,19 +50,3 +9,38 +19,8 +64,61 +3,17 +8,33 +13,1 +5,9 +50,7 +1,34 +41,65 +48,57 +14,13 +17,31 +56,1 +6,15 +24,25 +23,2 +69,13 +45,52 +15,23 +15,27 +27,28 +60,3 +31,30 +19,35 +42,53 +19,27 +61,1 +65,50 +53,2 +52,61 +15,20 +42,7 +67,20 +11,23 +29,54 +6,17 +41,53 +47,63 +68,51 +21,21 +19,6 +53,61 +23,29 +53,9 +19,29 +21,10 +2,41 +10,3 +49,9 +42,59 +12,1 +45,7 +19,28 +3,35 +69,6 +43,4 +17,21 +47,3 +52,7 +65,22 +45,62 +16,5 +51,3 +48,11 +7,33 +40,3 +26,35 +37,63 +49,68 +11,26 +54,67 +64,23 +21,17 +5,49 +63,65 +23,13 +58,1 +61,54 +69,56 +47,60 +11,7 +9,35 +57,58 +45,66 +1,23 +7,21 +17,12 +11,17 +34,3 +25,25 +22,35 +57,65 +17,17 +1,5 +12,33 +36,63 +19,15 +7,38 +53,55 +21,25 +42,1 +17,23 +35,67 +33,3 +56,63 +56,59 +3,2 +42,67 +65,56 +45,5 +5,33 +21,22 +9,42 +3,14 +21,14 +59,53 +64,53 +33,25 +11,35 +9,1 +63,16 +47,49 +53,60 +47,55 +39,1 +63,60 +35,63 +9,31 +55,68 +57,57 +68,15 +11,39 +62,69 +41,45 +55,57 +5,13 +9,14 +1,32 +17,5 +19,19 +19,30 +1,29 +55,56 +6,35 +21,8 +13,0 +4,25 +16,33 +69,9 +53,67 +67,17 +52,67 +41,59 +24,1 +51,7 +54,7 +3,22 +7,13 +41,61 +45,3 +21,33 +37,53 +11,13 +45,8 +48,1 +43,13 +17,46 +1,33 +41,69 +22,19 +19,38 +19,12 +45,57 +53,6 +15,36 +35,68 +9,21 +43,65 +5,41 +7,7 +68,61 +60,1 +7,23 +21,28 +23,34 +63,69 +7,40 +51,64 +66,51 +43,61 +49,63 +69,11 +50,51 +53,13 +17,24 +47,65 +32,67 +4,15 +38,1 +58,63 +23,21 +61,59 +15,21 +11,27 +33,65 +2,1 +20,25 +11,3 +55,67 +5,31 +43,53 +63,66 +3,29 +65,55 +36,69 +64,1 +3,23 +11,6 +52,57 +61,4 +63,17 +61,69 +3,33 +65,4 +21,16 +27,11 +1,3 +5,39 +69,54 +63,47 +1,36 +27,27 +33,61 +25,37 +61,14 +15,26 +55,1 +7,17 +29,11 +11,12 +2,19 +66,55 +45,59 +29,29 +26,39 +8,17 +45,65 +11,37 +2,39 +0,29 +5,27 +16,31 +67,65 +68,63 +26,25 +9,30 +3,36 +48,65 +59,51 +63,1 +7,41 +23,28 +1,15 +18,1 +4,41 +43,63 +21,27 +67,22 +52,69 +7,18 +68,49 +3,12 +18,17 +9,41 +19,13 +1,17 +3,26 +59,61 +57,66 +53,63 +39,69 +3,3 +67,69 +50,57 +9,19 +1,13 +55,58 +49,6 +7,3 +47,1 +12,37 +59,63 +61,67 +8,45 +41,1 +8,1 +39,63 +8,27 +15,19 +1,25 +61,57 +47,66 +46,5 +0,39 +4,3 +67,8 +9,43 +64,67 +49,47 +63,14 +51,57 +0,47 +8,3 +21,15 +63,57 +46,3 +5,21 +15,31 +57,12 +13,18 +21,23 +67,15 +21,7 +23,14 +67,55 +63,63 +21,13 +67,58 +51,49 +25,26 +2,31 +56,51 +32,69 +55,7 +31,62 +65,57 +55,65 +5,24 +7,20 +11,15 +19,14 +65,21 +5,1 +67,5 +67,63 +67,49 +68,57 +19,21 +37,65 +11,1 +47,61 +33,7 +28,3 +12,21 +47,68 +41,70 +65,1 +69,23 +5,25 +47,11 +49,61 +1,35 +59,57 +1,37 +33,1 +53,57 +59,1 +49,65 +27,15 +60,11 +61,63 +5,34 +69,15 +9,20 +66,65 +49,62 +35,3 +55,5 +4,19 +21,20 +47,67 +59,68 +24,27 +41,5 +67,3 +21,3 +47,9 +65,17 +9,47 +23,3 +41,67 +65,63 +15,29 +55,49 +3,6 +69,17 +22,17 +48,51 +33,64 +51,65 +9,27 +58,55 +25,21 +69,24 +9,22 +64,63 +19,1 +9,36 +17,27 +54,49 +38,69 +8,5 +46,67 +60,57 +68,11 +0,7 +19,17 +39,65 +27,3 +9,40 +64,57 +17,25 +3,25 +19,9 +47,8 +58,61 +23,22 +21,11 +41,7 +18,9 +11,45 +51,67 +52,3 +8,43 +9,25 +69,8 +67,11 +2,27 +63,51 +65,61 +53,5 +7,19 +18,3 +67,18 +45,9 +55,63 +15,15 +47,64 +54,3 +13,31 +19,5 +41,64 +15,16 +37,67 +53,52 +12,9 +15,4 +25,34 +43,59 +2,17 +23,33 +57,8 +16,15 +57,67 +29,0 +66,69 +19,7 +42,61 +66,15 +67,61 +51,63 +36,7 +1,16 +2,23 +66,59 +67,2 +61,64 +56,65 +56,5 +15,2 +19,33 +15,28 +49,53 +5,35 +12,3 +65,18 +69,53 +11,33 +37,2 +47,69 +57,69 +11,5 +34,7 +3,45 +63,5 +15,33 +35,1 +17,20 +23,11 +6,31 +17,35 +50,61 +51,4 +64,3 +62,55 +3,9 +49,60 +13,35 +68,69 +21,37 +44,63 +2,9 +15,7 +49,5 +67,13 +9,39 +9,33 +9,24 +2,11 +5,23 +46,55 +17,22 +9,23 +48,3 +45,13 +47,58 +60,59 +5,18 +14,3 +24,11 +56,69 +43,55 +57,63 +55,10 +17,33 +53,47 +36,3 +13,16 +5,32 +64,7 +32,3 +51,51 +10,17 +13,37 +40,59 +11,31 +13,19 +19,10 +49,1 +34,1 +10,27 +42,9 +61,2 +58,57 +13,33 +25,3 +43,2 +23,31 +24,37 +59,66 +12,29 +7,10 +31,65 +19,23 +39,64 +22,39 +18,5 +55,62 +23,18 +39,62 +53,50 +21,31 +40,55 +58,5 +23,40 +67,66 +69,59 +23,25 +39,61 +1,7 +21,1 +21,5 +57,61 +51,53 +53,51 +5,29 +69,47 +30,27 +5,14 +10,45 +18,23 +7,29 +55,60 +40,7 +49,7 +14,31 +15,25 +68,19 +57,49 +12,23 +7,30 +60,49 +50,9 +16,1 +22,9 +57,55 +15,24 +65,49 +69,25 +59,69 +28,69 +4,21 +23,36 +58,69 +69,61 +23,8 +5,8 +43,1 +9,37 +55,69 +3,11 +66,53 +70,59 +14,19 +15,17 +9,13 +59,55 +36,65 +69,67 +8,23 +23,32 +3,8 +65,3 +69,65 +29,5 +9,15 +61,61 +13,34 +1,1 +3,4 +68,45 +45,56 +33,69 +67,48 +38,65 +6,21 +0,3 +63,68 +50,67 +15,13 +63,58 +9,34 +67,1 +48,63 +60,69 +69,51 +57,47 +70,67 +51,47 +59,54 +57,7 +43,67 +4,45 +59,67 +45,2 +67,57 +62,1 +69,52 +31,63 +69,21 +31,15 +27,9 +3,37 +19,25 +63,55 +6,3 +53,3 +20,21 +13,17 +23,30 +6,23 +43,7 +17,29 +57,2 +21,32 +51,69 +7,1 +44,5 +57,1 +33,66 +45,69 +59,8 +9,3 +13,23 +11,22 +65,5 +1,9 +24,17 +61,3 +49,57 +12,19 +13,28 +69,12 +10,51 +53,53 +13,47 +31,69 +24,43 +69,63 +20,17 +67,21 +44,55 +33,68 +7,15 +45,1 +39,55 +39,4 +69,60 +23,27 +45,61 +51,61 +25,1 +63,3 +37,69 +33,5 +17,15 +9,32 +7,39 +63,54 +65,47 +29,19 +53,43 +60,33 +57,45 +5,6 +47,27 +39,25 +48,47 +53,36 +43,18 +49,21 +41,21 +23,19 +52,35 +39,45 +55,17 +29,39 +57,51 +55,45 +54,27 +33,26 +40,19 +44,17 +57,20 +37,45 +27,64 +31,13 +41,13 +5,7 +9,57 +10,69 +23,47 +1,51 +0,69 +49,12 +3,58 +15,9 +21,53 +53,27 +45,11 +63,42 +27,56 +6,11 +27,12 +27,31 +23,41 +35,41 +15,61 +61,27 +21,43 +41,43 +17,56 +11,66 +41,28 +51,37 +41,27 +38,59 +39,47 +59,41 +11,41 +26,59 +59,16 +29,35 +1,45 +33,41 +55,29 +65,39 +47,50 +28,5 +39,43 +35,21 +54,25 +43,16 +51,43 +31,17 +23,53 +37,21 +43,22 +22,55 +57,17 +15,49 +36,57 +11,48 +56,27 +36,39 +53,35 +8,51 +29,46 +61,29 +67,37 +31,35 +42,47 +63,41 +37,18 +43,36 +52,21 +63,9 +57,48 +29,36 +39,27 +35,59 +55,41 +25,53 +45,47 +19,66 +29,44 +61,5 +49,23 +14,59 +27,59 +19,58 +16,13 +44,51 +29,24 +13,7 +26,19 +37,20 +41,40 +28,27 +65,38 +41,47 +47,19 +49,49 +46,39 +38,55 +13,65 +53,44 +31,49 +36,5 +68,5 +42,45 +3,5 +4,63 +59,23 +23,56 +15,59 +37,52 +67,35 +11,11 +1,63 +11,25 +19,47 +31,33 +61,36 +27,46 +35,44 +46,21 +9,56 +5,59 +27,41 +35,37 +28,13 +39,20 +61,23 +36,15 +35,9 +7,8 +52,15 +14,39 +51,21 +65,25 +35,12 +58,15 +66,35 +23,7 +35,62 +63,25 +68,1 +23,64 +68,33 +65,28 +44,29 +19,67 +29,43 +47,51 +25,67 +2,45 +55,21 +37,43 +32,21 +58,51 +69,33 +13,29 +41,11 +47,23 +65,35 +23,45 +31,64 +41,50 +1,65 +25,39 +42,39 +44,47 +67,39 +32,35 +43,38 +51,29 +9,6 +41,24 +3,67 +57,31 +41,44 +53,19 +19,41 +14,61 +15,41 +46,49 +39,35 +62,51 +51,23 +32,9 +23,60 +1,47 +49,27 +57,36 +19,52 +43,49 +49,35 +21,50 +49,39 +53,38 +51,19 +21,57 +43,45 +33,38 +45,41 +1,56 +39,22 +21,63 +48,49 +47,30 +37,39 +4,61 +34,13 +26,51 +47,39 +19,45 +31,59 +3,52 +17,54 +69,45 +15,35 +49,11 +17,69 +55,13 +64,39 +57,33 +45,40 +28,21 +11,9 +64,29 +33,19 +21,60 +32,19 +47,25 +57,53 +31,4 +17,61 +69,5 +19,39 +46,15 +60,51 +9,50 +27,40 +63,29 +59,36 +11,55 +25,61 +30,55 +35,25 +27,69 +23,1 +9,65 +43,37 +27,42 +19,49 +56,45 +13,49 +35,7 +33,47 +43,11 +38,33 +35,49 +63,39 +41,20 +13,48 +1,60 +43,30 +7,45 +55,19 +65,19 +53,15 +33,53 +29,49 +51,45 +13,50 +34,23 +20,55 +10,11 +12,39 +17,53 +11,65 +27,37 +8,53 +65,24 +65,45 +61,45 +7,65 +59,37 +27,21 +39,39 +31,67 +45,23 +53,10 +59,22 +25,42 +1,57 +54,45 +13,10 +43,23 +37,51 +51,13 +40,35 +48,45 +36,27 +1,59 +39,51 +57,32 +31,5 +35,5 +8,69 +25,29 +39,9 +19,53 +29,40 +61,43 +7,62 +39,17 +3,54 +27,57 +67,43 +23,49 +53,17 +29,47 +25,41 +9,62 +61,35 +27,38 +23,9 +67,38 +41,49 +22,45 +43,15 +25,17 +13,69 +31,52 +29,68 +29,37 +30,37 +7,63 +37,27 +55,39 +65,13 +50,23 +59,11 +25,11 +25,65 +26,15 +55,37 +47,18 +20,69 +12,69 +8,47 +61,17 +53,12 +54,41 +9,69 +33,59 +57,37 +47,47 +61,39 +40,13 +69,3 +18,55 +22,47 +65,41 +31,45 +21,9 +38,27 +61,30 +61,55 +3,57 +51,11 +20,57 +41,51 +61,15 +40,37 +53,23 +49,38 +22,69 +1,61 +16,59 +20,65 +17,63 +51,17 +26,45 +24,31 +61,49 +38,41 +22,51 +29,16 +11,52 +34,35 +30,61 +37,33 +58,19 +9,29 +29,17 +61,9 +2,51 +7,59 +49,51 +35,55 +8,59 +29,41 +37,47 +23,67 +30,53 +15,69 +33,27 +49,31 +69,29 +59,43 +3,41 +43,10 +59,19 +35,27 +61,11 +27,25 +49,30 +28,57 +15,53 +39,29 +45,46 +16,41 +28,9 +27,61 +37,15 +29,18 +15,47 +17,57 +25,19 +37,25 +11,64 +45,12 +61,46 +14,67 +6,51 +19,65 +32,17 +21,65 +46,29 +51,28 +25,6 +19,51 +35,61 +47,41 +45,45 +39,49 +36,25 +19,59 +32,25 +25,47 +30,41 +62,19 +39,50 +41,41 +44,43 +53,37 +33,14 +40,51 +62,47 +19,48 +55,43 +63,13 +68,43 +65,29 +53,25 +23,59 +39,11 +54,17 +59,35 +63,53 +13,11 +35,58 +12,5 +63,21 +25,20 +45,37 +34,47 +24,55 +3,53 +11,67 +46,33 +25,31 +56,23 +36,43 +8,65 +61,19 +37,41 +41,31 +31,27 +37,23 +64,49 +6,67 +9,17 +11,40 +17,13 +26,11 +67,41 +23,57 +13,52 +50,17 +21,35 +33,51 +59,40 +27,5 +36,33 +3,62 +35,60 +58,43 +13,56 +24,67 +17,37 +29,53 +63,23 +20,51 +24,39 +13,12 +2,55 +62,41 +28,49 +39,44 +20,47 +52,27 +35,39 +59,25 +35,32 +49,29 +65,31 +35,52 +54,47 +29,51 +37,9 +13,13 +53,31 +45,39 +9,7 +39,13 +17,65 +37,31 +24,5 +30,5 +2,65 +28,7 +49,17 +55,55 +37,24 +13,5 +3,68 +49,13 +56,15 +21,49 +41,37 +43,26 +57,25 +3,47 +29,21 +47,43 +29,42 +55,11 +35,19 +6,55 +53,34 +23,17 +31,12 +4,69 +15,43 +66,33 +59,33 +13,57 +17,42 +10,67 +59,13 +50,37 +33,45 +35,40 +38,7 +21,41 +9,63 +53,1 +33,37 +13,66 +50,15 +1,55 +19,36 +18,47 +61,26 +49,25 +59,38 +5,43 +37,62 +11,61 +22,67 +61,18 +33,55 +18,61 +25,9 +62,49 +56,29 +65,44 +59,29 +33,39 +55,9 +49,37 +13,55 +35,22 +41,39 +48,19 +30,21 +13,9 +21,39 +37,61 +29,15 +27,52 +19,55 +47,35 +51,33 +8,55 +63,7 +35,46 +11,54 +29,69 +15,52 +31,46 +25,62 +63,43 +41,26 +61,41 +7,64 +43,35 +47,33 +40,33 +45,36 +57,41 +57,23 +57,27 +11,29 +5,69 +63,37 +7,25 +34,9 +57,24 +23,5 +59,18 +23,55 +48,41 +11,47 +16,57 +60,25 +60,23 +20,53 +66,47 +56,33 +30,11 +15,46 +26,33 +64,33 +51,10 +35,13 +5,55 +33,21 +10,55 +35,11 +9,53 +23,44 +63,11 +69,1 +21,45 +6,47 +42,17 +32,41 +17,49 +61,12 +35,45 +31,51 +55,20 +31,25 +7,51 +41,15 +45,31 +31,8 +29,13 +3,43 +27,70 +59,21 +43,41 +67,45 +59,46 +56,43 +5,66 +18,39 +39,10 +1,22 +68,25 +15,48 +68,41 +2,67 +37,46 +15,44 +25,69 +43,47 +61,28 +61,31 +43,20 +48,37 +19,44 +24,9 +27,16 +37,29 +51,40 +38,25 +62,31 +31,23 +47,21 +13,53 +12,61 +37,8 +5,47 +17,67 +49,44 +31,19 +25,57 +13,67 +3,65 +63,8 +3,69 +29,63 +11,63 +27,60 +31,37 +29,61 +25,27 +32,13 +1,53 +52,31 +57,35 +36,35 +67,32 +33,30 +4,57 +23,43 +39,31 +46,47 +5,61 +43,51 +51,9 +10,43 +5,63 +69,41 +7,60 +53,21 +45,35 +34,25 +37,35 +33,40 +64,9 +37,7 +9,49 +13,59 +70,43 +11,46 +43,34 +36,49 +29,9 +46,13 +31,38 +41,23 +65,33 +47,28 +54,37 +23,58 +33,33 +1,43 +7,67 +6,43 +63,33 +27,17 +49,41 +15,40 +43,21 +50,1 +61,21 +5,5 +51,48 +37,10 +44,49 +1,64 +55,31 +13,54 +47,31 +31,57 +45,49 +57,50 +52,25 +48,33 +61,13 +27,29 +31,28 +19,69 +23,15 +45,20 +65,42 +24,63 +55,47 +61,20 +40,29 +45,55 +11,59 +48,35 +25,5 +33,29 +15,10 +59,44 +41,29 +24,23 +43,27 +69,31 +37,38 +45,15 +51,15 +65,11 +5,46 +41,33 +62,37 +62,35 +53,20 +59,31 +9,67 +31,44 +46,37 +22,59 +27,19 +41,16 +25,4 +11,8 +31,9 +16,7 +28,61 +49,45 +45,21 +57,15 +50,25 +30,7 +14,69 +43,14 +33,49 +42,33 +67,36 +21,62 +51,38 +37,49 +62,9 +58,13 +35,43 +1,49 +57,46 +25,43 +5,67 +31,53 +59,9 +8,67 +13,63 +43,32 +33,42 +30,49 +0,63 +1,50 +21,59 +19,63 +36,55 +23,37 +67,27 +10,61 +5,56 +31,31 +47,13 +20,45 +28,31 +1,67 +15,62 +34,19 +55,40 +62,23 +2,47 +67,31 +39,5 +7,57 +15,70 +33,57 +28,53 +55,27 +7,5 +66,25 +47,22 +11,51 +23,51 +53,28 +61,33 +23,69 +65,37 +11,53 +31,3 +64,45 +7,69 +13,42 +31,34 +4,65 +68,21 +55,15 +41,55 +15,56 +39,33 +45,34 +25,15 +19,61 +21,67 +37,48 +24,53 +7,49 +37,30 +43,31 +5,15 +37,36 +31,41 +27,65 +25,13 +0,53 +37,57 +45,43 +15,65 +25,45 +33,48 +15,42 +15,38 +45,51 +3,55 +29,7 +39,23 +13,39 +20,63 +31,56 +45,27 +64,31 +27,39 +33,16 +25,14 +61,25 +21,55 +55,23 +43,39 +18,65 +15,67 +43,9 +30,59 +26,29 +41,17 +60,15 +25,23 +57,9 +24,15 +10,57 +17,59 +65,27 +52,45 +58,29 +70,31 +15,39 +55,35 +43,33 +17,55 +29,45 +55,14 +9,59 +53,16 +31,43 +15,5 +17,43 +62,43 +17,47 +59,28 +10,29 +67,29 +61,37 +69,36 +22,53 +43,43 +29,57 +48,15 +29,67 +61,47 +33,35 +51,31 +35,23 +27,13 +34,55 +27,18 +25,49 +25,63 +34,37 +39,38 +60,39 +55,25 +31,32 +53,39 +37,17 +39,21 +33,50 +68,27 +50,47 +26,53 +56,41 +15,51 +51,42 +11,43 +21,47 +35,33 +50,41 +31,11 +45,32 +31,29 +33,28 +15,57 +69,28 +23,63 +35,47 +55,22 +29,27 +29,59 +62,15 +27,67 +13,43 +53,24 +6,5 +29,50 +44,41 +10,63 +36,37 +1,58 +59,27 +39,37 +26,23 +25,33 +39,16 +15,50 +60,21 +3,63 +45,19 +46,41 +42,11 +5,57 +5,45 +4,53 +42,49 +49,33 +10,59 +21,69 +3,61 +30,19 +28,33 +21,42 +30,23 +69,37 +16,37 +33,17 +65,23 +38,53 +54,13 +43,19 +16,9 +34,61 +70,3 +38,49 +39,7 +37,42 +31,47 +15,54 +70,41 +50,21 +15,55 +61,44 +47,29 +54,9 +13,24 +18,69 +25,55 +45,10 +17,51 +52,13 +3,59 +27,53 +22,43 +45,25 +5,53 +39,19 +32,7 +13,51 +33,11 +13,61 +33,15 +59,39 +54,31 +63,31 +30,33 +50,35 +28,29 +22,65 +14,7 +13,64 +13,41 +35,30 +37,14 +27,63 +21,51 +23,23 +57,26 +66,29 +29,48 +35,50 +27,49 +51,35 +13,45 +69,35 +27,44 +13,27 +20,61 +37,19 +2,61 +33,9 +53,32 +61,53 +65,43 +44,13 +51,39 +35,17 +24,47 +27,55 +56,53 +31,36 +50,45 +51,30 +17,68 +29,33 +59,48 +47,45 +34,53 +41,19 +42,29 +45,44 +7,43 +63,45 +34,17 +51,25 +3,51 +37,12 +29,31 +3,42 +63,61 +66,13 +7,48 +27,43 +61,32 +59,49 +15,63 +3,15 +40,47 +35,31 +29,55 +26,57 +1,69 +65,10 +5,11 +24,21 +57,21 +41,25 +38,15 +37,5 +51,27 +41,30 +11,57 +63,26 +67,25 +29,23 +39,18 +17,39 +52,41 +57,39 +51,41 +25,50 +21,61 +35,15 +9,51 +69,30 +56,39 +49,20 +61,51 +27,23 +25,51 +49,16 +67,19 +63,35 +17,41 +56,17 +65,46 +63,40 +6,53 +37,28 +7,47 +32,53 +47,37 +59,45 +70,21 +49,32 +25,7 +26,67 +25,60 +65,26 +59,17 +9,55 +6,45 +11,21 +18,13 +25,68 +39,40 +11,50 +67,46 +45,33 +37,54 +7,58 +35,29 +55,33 +29,14 +23,61 +21,38 +57,11 +15,66 +38,45 +25,59 +40,43 +37,37 +51,18 +67,47 +18,51 +56,35 +49,43 +7,27 +13,44 +46,17 +31,39 +27,33 +5,51 +13,46 +68,39 +61,7 +39,26 +45,53 +43,29 +34,33 +39,15 +7,53 +33,44 +69,39 +62,11 +23,65 +59,15 +41,42 +55,59 +27,7 +50,33 +69,43 +32,59 +58,23 +29,58 +41,36 +49,24 +45,17 +55,34 +33,31 +16,61 +7,55 +31,21 +23,48 +46,45 +6,63 +41,14 +4,59 +35,57 +59,47 +49,28 +57,38 +63,27 +41,22 +13,21 +5,50 +47,26 +57,43 +53,22 +36,17 +57,13 +9,61 +66,39 +55,30 +16,67 +46,25 +13,25 +43,17 +9,11 +53,33 +35,20 +37,55 +58,33 +10,9 +44,23 +45,29 +33,10 +37,11 +63,67 +1,41 +64,35 +33,23 +19,43 +53,29 +47,17 +31,55 +13,58 +33,13 +59,42 +6,69 +43,25 +11,69 +47,15 +41,9 +25,64 +27,47 +47,42 +17,64 +47,53 +17,9 +20,67 +18,59 +13,26 +53,41 +29,26 +59,30 +33,56 +44,27 +26,47 +27,66 +3,21 +49,26 +29,66 +12,59 +41,35 +25,48 +33,32 +27,35 +39,57 +15,64 +37,22 +39,6 +5,65 +11,49 +65,9 +29,25 +49,15 +9,9 +66,41 +55,18 +41,52 +38,31 +59,52 +69,34 +27,51 +27,45 +59,10 +3,49 +29,22 +7,61 +35,35 +32,49 +67,33 +63,48 +20,41 +19,40 +1,21 +1,44 +57,29 +64,13 +49,14 +17,44 +40,9 +19,57 +69,27 +67,23 +63,49 +62,25 +47,24 +17,50 +35,51 +50,11 +32,47 +33,43 +49,19 +39,41 +67,30 +61,34 +43,60 +12,46 +70,22 +38,20 +14,44 +41,38 +22,52 +12,67 +2,7 +58,46 +34,30 +34,70 +6,46 +20,68 +7,24 +9,18 +33,20 +60,42 +67,24 +37,6 +0,61 +12,18 +20,10 +39,54 +69,0 +16,65 +40,63 +14,10 +34,21 +54,56 +16,21 +62,12 +23,24 +48,61 +70,29 +30,16 +0,66 +70,6 +6,52 +30,62 +35,14 +62,36 +48,58 +13,8 +28,60 +22,26 +66,17 +62,54 +40,53 +12,53 +23,54 +61,40 +43,66 +0,34 +15,68 +32,66 +22,10 +42,48 +28,6 +38,38 +55,28 +46,23 +16,68 +52,54 +5,52 +4,64 +57,42 +2,49 +38,12 +64,38 +28,52 +68,31 +68,52 +21,70 +16,16 +8,31 +9,66 +4,55 +11,68 +36,14 +42,16 +32,39 +54,64 +18,58 +52,46 +68,22 +7,0 +29,62 +0,44 +35,8 +18,67 +23,52 +58,42 +26,2 +32,57 +8,66 +30,20 +0,30 +12,6 +46,1 +49,2 +34,56 +16,52 +2,2 +48,24 +25,38 +41,34 +46,28 +32,26 +53,48 +34,69 +11,28 +3,64 +62,8 +12,48 +19,22 +4,11 +24,30 +22,31 +32,45 +19,68 +12,60 +7,32 +22,38 +25,58 +55,42 +47,70 +18,28 +66,62 +34,41 +44,57 +4,10 +53,64 +38,34 +12,22 +37,70 +0,42 +30,31 +35,54 +61,48 +58,34 +36,38 +66,43 +54,52 +39,66 +43,62 +60,52 +37,44 +42,22 +53,0 +70,25 +18,40 +69,20 +53,58 +21,18 +25,12 +0,67 +25,44 +22,14 +48,32 +48,38 +18,15 +52,30 +34,15 +52,43 +52,52 +46,63 +2,22 +10,21 +22,64 +37,58 +10,31 +21,64 +6,40 +0,58 +36,42 +24,2 +65,20 +0,1 +2,58 +21,26 +0,68 +62,26 +8,32 +38,17 +11,56 +19,18 +31,20 +43,70 +0,5 +3,10 +14,38 +14,37 +32,33 +18,44 +62,53 +6,29 +70,30 +42,21 +18,37 +23,38 +14,60 +46,59 +34,22 +10,48 +8,63 +68,20 +50,58 +44,32 +4,67 +40,14 +22,34 +6,25 +38,52 +38,48 +32,30 +38,54 +26,49 +5,30 +34,48 +45,28 +56,58 +17,60 +10,38 +44,70 +24,49 +7,12 +42,38 +38,13 +52,48 +40,2 +52,59 +20,52 +21,68 +44,44 +2,70 +10,6 +24,52 +40,48 +48,20 +70,20 +36,23 +36,58 +20,27 +58,4 +2,8 +26,38 +4,38 +36,60 +12,57 +34,49 +30,29 +48,50 +18,60 +22,21 +64,62 +31,50 +20,37 +20,33 +5,40 +34,46 +12,12 +17,32 +2,29 +44,28 +58,45 +32,63 +54,30 +12,42 +16,28 +8,16 +66,42 +12,49 +12,63 +26,68 +18,25 +44,21 +17,6 +34,34 +36,67 +2,13 +26,3 +70,0 +39,58 +17,14 +18,12 +43,50 +16,25 +2,34 +8,50 +62,6 +26,41 +50,40 +30,56 +18,49 +4,32 +16,60 +22,8 +15,6 +21,36 +4,58 +29,28 +47,40 +36,62 +34,14 +33,60 +8,44 +43,8 +60,55 +39,30 +24,24 +36,11 +47,48 +38,32 +22,58 +31,10 +38,60 +16,46 +10,5 +23,50 +0,14 +4,60 +10,64 +20,22 +66,37 +28,51 +27,26 +38,21 +30,43 +19,20 +0,28 +16,54 +40,46 +34,5 +56,42 +8,34 +41,68 +61,8 +50,63 +27,14 +36,8 +26,36 +30,70 +36,20 +70,33 +41,2 +70,19 +5,22 +38,10 +10,40 +28,42 +42,41 +46,42 +0,23 +70,46 +24,40 +16,39 +38,56 +26,50 +22,5 +40,56 +34,57 +52,64 +46,70 +8,26 +3,34 +32,52 +70,44 +12,24 +8,10 +28,50 +14,16 +20,56 +9,60 +8,20 +37,34 +49,22 +27,24 +17,10 +68,30 +22,62 +22,15 +58,35 +69,44 +14,20 +48,22 +48,25 +51,2 +26,21 +6,30 +12,26 +33,12 +5,60 +60,56 +0,70 +4,56 +56,50 +58,47 +46,0 +50,22 +52,68 +4,4 +32,36 +34,60 +30,17 +36,56 +62,42 +28,23 +3,50 +35,28 +39,34 +38,3 +30,12 +20,7 +18,57 +52,60 +6,50 +52,49 +4,13 +56,56 +8,70 +44,8 +70,1 +28,62 +42,42 +60,12 +50,28 +47,38 +60,43 +50,54 +51,50 +55,12 +31,18 +47,32 +18,16 +16,6 +62,32 +24,69 +2,54 +62,27 +40,32 +38,68 +8,36 +59,70 +52,16 +68,37 +24,18 +53,8 +14,70 +31,60 +32,4 +33,36 +64,14 +52,22 +31,22 +12,51 +16,38 +30,1 +48,40 +57,56 +69,40 +25,32 +50,60 +49,4 +30,64 +46,22 +28,48 +42,56 +2,43 +46,6 +6,41 +43,46 +20,59 +54,6 +58,64 +0,59 +41,10 +54,42 +62,63 +30,57 +4,17 +22,40 +60,44 +52,42 +28,30 +7,2 +0,15 +22,27 +70,38 +30,68 +5,64 +35,38 +0,20 +17,62 +55,70 +5,4 +56,60 +34,42 +60,61 +40,27 +38,44 +5,16 +14,51 +18,26 +46,46 +69,26 +48,14 +32,43 +10,28 +27,22 +54,20 +14,48 +67,26 +57,0 +4,70 +59,12 +51,6 +40,10 +59,20 +32,8 +34,2 +20,18 +62,44 +64,46 +20,58 +56,31 +54,69 +28,14 +0,17 +22,12 +52,0 +20,44 +34,8 +32,29 +65,30 +56,3 +26,52 +4,47 +22,1 +13,38 +62,65 +0,31 +44,42 +42,15 +42,10 +24,38 +10,62 +26,64 +48,64 +48,21 +43,56 +8,46 +4,7 +9,0 +30,14 +56,61 +68,34 +56,55 +13,40 +50,62 +8,2 +50,39 +18,68 +0,37 +4,5 +47,36 +14,24 +44,58 +56,25 +24,62 +6,13 +11,2 +20,5 +18,11 +51,16 +56,6 +53,70 +32,0 +34,51 +37,56 +18,41 +42,70 +24,20 +22,44 +28,46 +20,38 +36,34 +10,56 +43,44 +0,60 +1,70 +37,0 +58,12 +68,17 +66,14 +70,40 +61,58 +53,40 +60,19 +14,4 +3,20 +6,38 +53,18 +24,8 +14,43 +42,43 +50,4 +57,30 +7,50 +37,40 +64,65 +36,47 +66,34 +16,27 +70,34 +20,14 +60,27 +32,31 +66,48 +43,28 +64,28 +67,54 +13,70 +50,38 +42,58 +52,26 +24,29 +20,48 +17,30 +66,67 +68,64 +68,9 +14,68 +70,24 +38,5 +60,47 +11,60 +67,12 +0,43 +1,12 +56,16 +38,22 +24,68 +51,8 +38,63 +60,22 +36,54 +38,61 +66,45 +46,27 +48,8 +6,0 +27,30 +8,40 +32,60 +5,62 +62,67 +64,32 +52,37 +60,5 +70,64 +10,18 +63,52 +18,20 +34,39 +1,62 +51,34 +40,49 +28,38 +51,62 +8,54 +45,58 +5,10 +12,15 +68,8 +26,22 +35,34 +58,32 +32,34 +10,10 +6,7 +38,42 +62,57 +52,6 +40,22 +62,70 +58,6 +50,48 +41,46 +52,18 +60,2 +25,70 +5,0 +50,6 +39,2 +2,4 +62,45 +48,23 +57,34 +55,66 +18,14 +9,52 +24,22 +54,60 +49,52 +12,54 +54,14 +63,44 +56,64 +4,0 +20,50 +18,64 +1,18 +14,41 +16,35 +29,2 +66,52 +12,50 +42,68 +34,24 +56,57 +66,32 +57,60 +28,8 +22,66 +32,32 +52,58 +50,42 +4,36 +16,32 +65,58 +56,20 +42,0 +17,4 +34,68 +49,36 +32,58 +68,50 +19,16 +6,70 +40,38 +60,37 +50,49 +34,40 +51,70 +1,38 +13,32 +53,66 +6,32 +65,32 +32,22 +14,55 +38,30 +44,26 +66,8 +50,30 +48,31 +5,36 +52,19 +29,30 +24,50 +55,36 +46,69 +64,18 +44,0 +27,10 +68,32 +60,13 +12,17 +10,34 +18,18 +70,52 +10,8 +12,38 +16,70 +8,9 +58,65 +64,21 +70,4 +5,48 +22,49 +36,2 +18,30 +41,6 +10,44 +48,48 +60,14 +23,42 +46,36 +18,56 +40,18 +36,40 +24,59 +64,64 +40,11 +59,50 +14,57 +25,46 +65,0 +32,16 +24,4 +40,34 +50,36 +38,50 +20,30 +66,38 +14,40 +70,62 +6,58 +12,28 +62,60 +68,28 +36,29 +58,37 +45,68 +22,22 +40,65 +49,64 +24,65 +40,8 +0,12 +40,64 +70,66 +23,62 +66,49 +28,32 +47,44 +10,12 +29,8 +26,18 +28,16 +49,50 +7,6 +30,54 +52,10 +32,10 +1,0 +40,28 +7,52 +18,54 +5,42 +58,10 +54,40 +41,4 +10,22 +24,56 +44,36 +39,14 +12,2 +65,48 +20,16 +10,4 +56,66 +40,68 +16,19 +45,42 +20,43 +50,18 +40,15 +0,6 +18,62 +14,2 +51,44 +35,48 +54,68 +7,4 +30,25 +27,36 +48,9 +42,46 +57,54 +68,55 +34,59 +58,16 +70,65 +70,14 +24,12 +46,12 +30,39 +55,2 +38,8 +62,22 +3,70 +60,40 +7,44 +9,44 +16,58 +64,2 +22,46 +40,45 +23,0 +62,30 +46,18 +23,6 +27,48 +31,66 +66,30 +52,9 +29,20 +36,21 +69,10 +24,41 +8,38 +44,34 +37,66 +68,4 +34,28 +21,44 +28,70 +42,30 +35,42 +46,16 +6,8 +36,48 +8,61 +14,26 +62,0 +28,45 +46,7 +7,68 +32,40 +61,24 +32,1 +40,12 +58,2 +62,58 +0,2 +42,60 +13,68 +48,59 +6,18 +36,28 +61,0 +63,28 +58,8 +44,33 +59,6 +64,6 +12,62 +30,32 +39,56 +70,32 +67,44 +56,11 +38,6 +2,36 +60,50 +55,26 +58,66 +55,8 +48,17 +56,2 +64,0 +60,41 +64,24 +42,52 +30,13 +16,20 +30,44 +1,26 +47,34 +24,54 +56,8 +16,0 +2,32 +62,38 +70,56 +18,50 +9,28 +63,38 +30,18 +10,70 +44,25 +57,40 +28,26 +54,0 +36,12 +32,24 +44,62 +52,23 +19,54 +45,30 +51,68 +8,8 +48,62 +40,60 +48,6 +48,69 +22,36 +61,10 +62,28 +51,66 +14,18 +53,56 +29,52 +63,4 +46,50 +26,69 +52,56 +21,54`) + require.Equal(t, 0, r) +} diff --git a/2024/go/day18/input.txt b/2024/go/day18/input.txt new file mode 100644 index 0000000..3b8f63e --- /dev/null +++ b/2024/go/day18/input.txt @@ -0,0 +1,3450 @@ +2,5 +20,1 +63,59 +21,29 +37,59 +33,63 +14,33 +70,15 +21,34 +62,5 +45,54 +45,60 +48,53 +33,58 +23,35 +22,3 +33,0 +63,62 +44,67 +52,55 +5,19 +42,55 +45,0 +57,3 +15,45 +41,62 +1,39 +63,19 +39,59 +39,3 +48,7 +61,65 +31,1 +54,51 +11,14 +53,62 +67,68 +65,16 +17,45 +21,24 +55,3 +30,15 +4,39 +69,19 +69,57 +41,57 +43,24 +19,11 +18,27 +3,48 +8,13 +41,66 +67,67 +61,62 +5,37 +18,19 +29,64 +13,14 +42,57 +33,67 +0,19 +67,53 +47,59 +19,3 +51,54 +53,69 +42,5 +7,26 +59,65 +50,69 +3,27 +26,9 +43,3 +17,7 +15,11 +12,31 +43,5 +50,65 +9,5 +29,3 +21,6 +65,15 +43,57 +15,37 +50,53 +67,51 +29,1 +47,7 +55,54 +52,51 +47,54 +17,26 +12,43 +65,51 +1,27 +15,22 +63,15 +7,37 +69,49 +57,59 +7,36 +60,7 +66,7 +18,35 +13,36 +21,19 +15,3 +46,9 +30,3 +53,7 +8,7 +66,3 +49,69 +35,65 +48,5 +33,6 +1,31 +26,5 +44,59 +68,13 +45,67 +9,16 +51,55 +57,5 +2,33 +57,64 +31,2 +1,19 +5,12 +19,37 +40,67 +10,19 +21,12 +3,31 +51,1 +4,29 +52,65 +47,5 +17,19 +70,47 +11,19 +57,10 +54,55 +39,53 +61,56 +49,55 +28,37 +21,30 +9,45 +43,69 +57,19 +29,10 +60,63 +19,32 +66,5 +53,45 +53,49 +47,57 +26,1 +17,34 +65,7 +7,28 +41,63 +6,1 +69,69 +0,13 +5,28 +10,1 +38,67 +37,13 +3,7 +39,12 +2,15 +54,65 +35,53 +63,20 +13,30 +52,47 +13,3 +69,55 +55,61 +37,4 +7,35 +57,4 +35,69 +5,3 +63,64 +40,69 +59,5 +32,61 +66,61 +43,64 +40,1 +49,3 +68,65 +3,38 +21,4 +49,56 +18,29 +23,12 +7,11 +16,29 +8,11 +10,25 +39,67 +59,60 +3,19 +26,31 +7,9 +51,58 +49,67 +53,65 +65,59 +67,9 +43,58 +55,51 +69,7 +6,39 +49,59 +10,37 +4,43 +54,5 +3,28 +69,16 +67,7 +4,37 +37,1 +27,2 +62,59 +45,70 +25,35 +65,53 +31,7 +53,59 +1,10 +67,10 +65,67 +30,67 +17,1 +67,59 +31,61 +59,59 +65,69 +51,59 +61,66 +13,15 +29,65 +27,1 +65,65 +68,53 +53,11 +5,17 +20,35 +43,68 +3,30 +59,7 +3,39 +45,63 +7,31 +3,13 +51,5 +23,39 +20,3 +67,0 +37,3 +46,61 +65,70 +15,1 +17,11 +66,63 +32,23 +51,0 +3,1 +17,3 +13,6 +59,3 +19,31 +1,24 +41,3 +4,49 +40,57 +63,6 +16,17 +22,25 +39,60 +11,34 +56,7 +38,57 +55,53 +35,66 +1,11 +64,19 +50,3 +9,38 +19,8 +64,61 +3,17 +8,33 +13,1 +5,9 +50,7 +1,34 +41,65 +48,57 +14,13 +17,31 +56,1 +6,15 +24,25 +23,2 +69,13 +45,52 +15,23 +15,27 +27,28 +60,3 +31,30 +19,35 +42,53 +19,27 +61,1 +65,50 +53,2 +52,61 +15,20 +42,7 +67,20 +11,23 +29,54 +6,17 +41,53 +47,63 +68,51 +21,21 +19,6 +53,61 +23,29 +53,9 +19,29 +21,10 +2,41 +10,3 +49,9 +42,59 +12,1 +45,7 +19,28 +3,35 +69,6 +43,4 +17,21 +47,3 +52,7 +65,22 +45,62 +16,5 +51,3 +48,11 +7,33 +40,3 +26,35 +37,63 +49,68 +11,26 +54,67 +64,23 +21,17 +5,49 +63,65 +23,13 +58,1 +61,54 +69,56 +47,60 +11,7 +9,35 +57,58 +45,66 +1,23 +7,21 +17,12 +11,17 +34,3 +25,25 +22,35 +57,65 +17,17 +1,5 +12,33 +36,63 +19,15 +7,38 +53,55 +21,25 +42,1 +17,23 +35,67 +33,3 +56,63 +56,59 +3,2 +42,67 +65,56 +45,5 +5,33 +21,22 +9,42 +3,14 +21,14 +59,53 +64,53 +33,25 +11,35 +9,1 +63,16 +47,49 +53,60 +47,55 +39,1 +63,60 +35,63 +9,31 +55,68 +57,57 +68,15 +11,39 +62,69 +41,45 +55,57 +5,13 +9,14 +1,32 +17,5 +19,19 +19,30 +1,29 +55,56 +6,35 +21,8 +13,0 +4,25 +16,33 +69,9 +53,67 +67,17 +52,67 +41,59 +24,1 +51,7 +54,7 +3,22 +7,13 +41,61 +45,3 +21,33 +37,53 +11,13 +45,8 +48,1 +43,13 +17,46 +1,33 +41,69 +22,19 +19,38 +19,12 +45,57 +53,6 +15,36 +35,68 +9,21 +43,65 +5,41 +7,7 +68,61 +60,1 +7,23 +21,28 +23,34 +63,69 +7,40 +51,64 +66,51 +43,61 +49,63 +69,11 +50,51 +53,13 +17,24 +47,65 +32,67 +4,15 +38,1 +58,63 +23,21 +61,59 +15,21 +11,27 +33,65 +2,1 +20,25 +11,3 +55,67 +5,31 +43,53 +63,66 +3,29 +65,55 +36,69 +64,1 +3,23 +11,6 +52,57 +61,4 +63,17 +61,69 +3,33 +65,4 +21,16 +27,11 +1,3 +5,39 +69,54 +63,47 +1,36 +27,27 +33,61 +25,37 +61,14 +15,26 +55,1 +7,17 +29,11 +11,12 +2,19 +66,55 +45,59 +29,29 +26,39 +8,17 +45,65 +11,37 +2,39 +0,29 +5,27 +16,31 +67,65 +68,63 +26,25 +9,30 +3,36 +48,65 +59,51 +63,1 +7,41 +23,28 +1,15 +18,1 +4,41 +43,63 +21,27 +67,22 +52,69 +7,18 +68,49 +3,12 +18,17 +9,41 +19,13 +1,17 +3,26 +59,61 +57,66 +53,63 +39,69 +3,3 +67,69 +50,57 +9,19 +1,13 +55,58 +49,6 +7,3 +47,1 +12,37 +59,63 +61,67 +8,45 +41,1 +8,1 +39,63 +8,27 +15,19 +1,25 +61,57 +47,66 +46,5 +0,39 +4,3 +67,8 +9,43 +64,67 +49,47 +63,14 +51,57 +0,47 +8,3 +21,15 +63,57 +46,3 +5,21 +15,31 +57,12 +13,18 +21,23 +67,15 +21,7 +23,14 +67,55 +63,63 +21,13 +67,58 +51,49 +25,26 +2,31 +56,51 +32,69 +55,7 +31,62 +65,57 +55,65 +5,24 +7,20 +11,15 +19,14 +65,21 +5,1 +67,5 +67,63 +67,49 +68,57 +19,21 +37,65 +11,1 +47,61 +33,7 +28,3 +12,21 +47,68 +41,70 +65,1 +69,23 +5,25 +47,11 +49,61 +1,35 +59,57 +1,37 +33,1 +53,57 +59,1 +49,65 +27,15 +60,11 +61,63 +5,34 +69,15 +9,20 +66,65 +49,62 +35,3 +55,5 +4,19 +21,20 +47,67 +59,68 +24,27 +41,5 +67,3 +21,3 +47,9 +65,17 +9,47 +23,3 +41,67 +65,63 +15,29 +55,49 +3,6 +69,17 +22,17 +48,51 +33,64 +51,65 +9,27 +58,55 +25,21 +69,24 +9,22 +64,63 +19,1 +9,36 +17,27 +54,49 +38,69 +8,5 +46,67 +60,57 +68,11 +0,7 +19,17 +39,65 +27,3 +9,40 +64,57 +17,25 +3,25 +19,9 +47,8 +58,61 +23,22 +21,11 +41,7 +18,9 +11,45 +51,67 +52,3 +8,43 +9,25 +69,8 +67,11 +2,27 +63,51 +65,61 +53,5 +7,19 +18,3 +67,18 +45,9 +55,63 +15,15 +47,64 +54,3 +13,31 +19,5 +41,64 +15,16 +37,67 +53,52 +12,9 +15,4 +25,34 +43,59 +2,17 +23,33 +57,8 +16,15 +57,67 +29,0 +66,69 +19,7 +42,61 +66,15 +67,61 +51,63 +36,7 +1,16 +2,23 +66,59 +67,2 +61,64 +56,65 +56,5 +15,2 +19,33 +15,28 +49,53 +5,35 +12,3 +65,18 +69,53 +11,33 +37,2 +47,69 +57,69 +11,5 +34,7 +3,45 +63,5 +15,33 +35,1 +17,20 +23,11 +6,31 +17,35 +50,61 +51,4 +64,3 +62,55 +3,9 +49,60 +13,35 +68,69 +21,37 +44,63 +2,9 +15,7 +49,5 +67,13 +9,39 +9,33 +9,24 +2,11 +5,23 +46,55 +17,22 +9,23 +48,3 +45,13 +47,58 +60,59 +5,18 +14,3 +24,11 +56,69 +43,55 +57,63 +55,10 +17,33 +53,47 +36,3 +13,16 +5,32 +64,7 +32,3 +51,51 +10,17 +13,37 +40,59 +11,31 +13,19 +19,10 +49,1 +34,1 +10,27 +42,9 +61,2 +58,57 +13,33 +25,3 +43,2 +23,31 +24,37 +59,66 +12,29 +7,10 +31,65 +19,23 +39,64 +22,39 +18,5 +55,62 +23,18 +39,62 +53,50 +21,31 +40,55 +58,5 +23,40 +67,66 +69,59 +23,25 +39,61 +1,7 +21,1 +21,5 +57,61 +51,53 +53,51 +5,29 +69,47 +30,27 +5,14 +10,45 +18,23 +7,29 +55,60 +40,7 +49,7 +14,31 +15,25 +68,19 +57,49 +12,23 +7,30 +60,49 +50,9 +16,1 +22,9 +57,55 +15,24 +65,49 +69,25 +59,69 +28,69 +4,21 +23,36 +58,69 +69,61 +23,8 +5,8 +43,1 +9,37 +55,69 +3,11 +66,53 +70,59 +14,19 +15,17 +9,13 +59,55 +36,65 +69,67 +8,23 +23,32 +3,8 +65,3 +69,65 +29,5 +9,15 +61,61 +13,34 +1,1 +3,4 +68,45 +45,56 +33,69 +67,48 +38,65 +6,21 +0,3 +63,68 +50,67 +15,13 +63,58 +9,34 +67,1 +48,63 +60,69 +69,51 +57,47 +70,67 +51,47 +59,54 +57,7 +43,67 +4,45 +59,67 +45,2 +67,57 +62,1 +69,52 +31,63 +69,21 +31,15 +27,9 +3,37 +19,25 +63,55 +6,3 +53,3 +20,21 +13,17 +23,30 +6,23 +43,7 +17,29 +57,2 +21,32 +51,69 +7,1 +44,5 +57,1 +33,66 +45,69 +59,8 +9,3 +13,23 +11,22 +65,5 +1,9 +24,17 +61,3 +49,57 +12,19 +13,28 +69,12 +10,51 +53,53 +13,47 +31,69 +24,43 +69,63 +20,17 +67,21 +44,55 +33,68 +7,15 +45,1 +39,55 +39,4 +69,60 +23,27 +45,61 +51,61 +25,1 +63,3 +37,69 +33,5 +17,15 +9,32 +7,39 +63,54 +65,47 +29,19 +53,43 +60,33 +57,45 +5,6 +47,27 +39,25 +48,47 +53,36 +43,18 +49,21 +41,21 +23,19 +52,35 +39,45 +55,17 +29,39 +57,51 +55,45 +54,27 +33,26 +40,19 +44,17 +57,20 +37,45 +27,64 +31,13 +41,13 +5,7 +9,57 +10,69 +23,47 +1,51 +0,69 +49,12 +3,58 +15,9 +21,53 +53,27 +45,11 +63,42 +27,56 +6,11 +27,12 +27,31 +23,41 +35,41 +15,61 +61,27 +21,43 +41,43 +17,56 +11,66 +41,28 +51,37 +41,27 +38,59 +39,47 +59,41 +11,41 +26,59 +59,16 +29,35 +1,45 +33,41 +55,29 +65,39 +47,50 +28,5 +39,43 +35,21 +54,25 +43,16 +51,43 +31,17 +23,53 +37,21 +43,22 +22,55 +57,17 +15,49 +36,57 +11,48 +56,27 +36,39 +53,35 +8,51 +29,46 +61,29 +67,37 +31,35 +42,47 +63,41 +37,18 +43,36 +52,21 +63,9 +57,48 +29,36 +39,27 +35,59 +55,41 +25,53 +45,47 +19,66 +29,44 +61,5 +49,23 +14,59 +27,59 +19,58 +16,13 +44,51 +29,24 +13,7 +26,19 +37,20 +41,40 +28,27 +65,38 +41,47 +47,19 +49,49 +46,39 +38,55 +13,65 +53,44 +31,49 +36,5 +68,5 +42,45 +3,5 +4,63 +59,23 +23,56 +15,59 +37,52 +67,35 +11,11 +1,63 +11,25 +19,47 +31,33 +61,36 +27,46 +35,44 +46,21 +9,56 +5,59 +27,41 +35,37 +28,13 +39,20 +61,23 +36,15 +35,9 +7,8 +52,15 +14,39 +51,21 +65,25 +35,12 +58,15 +66,35 +23,7 +35,62 +63,25 +68,1 +23,64 +68,33 +65,28 +44,29 +19,67 +29,43 +47,51 +25,67 +2,45 +55,21 +37,43 +32,21 +58,51 +69,33 +13,29 +41,11 +47,23 +65,35 +23,45 +31,64 +41,50 +1,65 +25,39 +42,39 +44,47 +67,39 +32,35 +43,38 +51,29 +9,6 +41,24 +3,67 +57,31 +41,44 +53,19 +19,41 +14,61 +15,41 +46,49 +39,35 +62,51 +51,23 +32,9 +23,60 +1,47 +49,27 +57,36 +19,52 +43,49 +49,35 +21,50 +49,39 +53,38 +51,19 +21,57 +43,45 +33,38 +45,41 +1,56 +39,22 +21,63 +48,49 +47,30 +37,39 +4,61 +34,13 +26,51 +47,39 +19,45 +31,59 +3,52 +17,54 +69,45 +15,35 +49,11 +17,69 +55,13 +64,39 +57,33 +45,40 +28,21 +11,9 +64,29 +33,19 +21,60 +32,19 +47,25 +57,53 +31,4 +17,61 +69,5 +19,39 +46,15 +60,51 +9,50 +27,40 +63,29 +59,36 +11,55 +25,61 +30,55 +35,25 +27,69 +23,1 +9,65 +43,37 +27,42 +19,49 +56,45 +13,49 +35,7 +33,47 +43,11 +38,33 +35,49 +63,39 +41,20 +13,48 +1,60 +43,30 +7,45 +55,19 +65,19 +53,15 +33,53 +29,49 +51,45 +13,50 +34,23 +20,55 +10,11 +12,39 +17,53 +11,65 +27,37 +8,53 +65,24 +65,45 +61,45 +7,65 +59,37 +27,21 +39,39 +31,67 +45,23 +53,10 +59,22 +25,42 +1,57 +54,45 +13,10 +43,23 +37,51 +51,13 +40,35 +48,45 +36,27 +1,59 +39,51 +57,32 +31,5 +35,5 +8,69 +25,29 +39,9 +19,53 +29,40 +61,43 +7,62 +39,17 +3,54 +27,57 +67,43 +23,49 +53,17 +29,47 +25,41 +9,62 +61,35 +27,38 +23,9 +67,38 +41,49 +22,45 +43,15 +25,17 +13,69 +31,52 +29,68 +29,37 +30,37 +7,63 +37,27 +55,39 +65,13 +50,23 +59,11 +25,11 +25,65 +26,15 +55,37 +47,18 +20,69 +12,69 +8,47 +61,17 +53,12 +54,41 +9,69 +33,59 +57,37 +47,47 +61,39 +40,13 +69,3 +18,55 +22,47 +65,41 +31,45 +21,9 +38,27 +61,30 +61,55 +3,57 +51,11 +20,57 +41,51 +61,15 +40,37 +53,23 +49,38 +22,69 +1,61 +16,59 +20,65 +17,63 +51,17 +26,45 +24,31 +61,49 +38,41 +22,51 +29,16 +11,52 +34,35 +30,61 +37,33 +58,19 +9,29 +29,17 +61,9 +2,51 +7,59 +49,51 +35,55 +8,59 +29,41 +37,47 +23,67 +30,53 +15,69 +33,27 +49,31 +69,29 +59,43 +3,41 +43,10 +59,19 +35,27 +61,11 +27,25 +49,30 +28,57 +15,53 +39,29 +45,46 +16,41 +28,9 +27,61 +37,15 +29,18 +15,47 +17,57 +25,19 +37,25 +11,64 +45,12 +61,46 +14,67 +6,51 +19,65 +32,17 +21,65 +46,29 +51,28 +25,6 +19,51 +35,61 +47,41 +45,45 +39,49 +36,25 +19,59 +32,25 +25,47 +30,41 +62,19 +39,50 +41,41 +44,43 +53,37 +33,14 +40,51 +62,47 +19,48 +55,43 +63,13 +68,43 +65,29 +53,25 +23,59 +39,11 +54,17 +59,35 +63,53 +13,11 +35,58 +12,5 +63,21 +25,20 +45,37 +34,47 +24,55 +3,53 +11,67 +46,33 +25,31 +56,23 +36,43 +8,65 +61,19 +37,41 +41,31 +31,27 +37,23 +64,49 +6,67 +9,17 +11,40 +17,13 +26,11 +67,41 +23,57 +13,52 +50,17 +21,35 +33,51 +59,40 +27,5 +36,33 +3,62 +35,60 +58,43 +13,56 +24,67 +17,37 +29,53 +63,23 +20,51 +24,39 +13,12 +2,55 +62,41 +28,49 +39,44 +20,47 +52,27 +35,39 +59,25 +35,32 +49,29 +65,31 +35,52 +54,47 +29,51 +37,9 +13,13 +53,31 +45,39 +9,7 +39,13 +17,65 +37,31 +24,5 +30,5 +2,65 +28,7 +49,17 +55,55 +37,24 +13,5 +3,68 +49,13 +56,15 +21,49 +41,37 +43,26 +57,25 +3,47 +29,21 +47,43 +29,42 +55,11 +35,19 +6,55 +53,34 +23,17 +31,12 +4,69 +15,43 +66,33 +59,33 +13,57 +17,42 +10,67 +59,13 +50,37 +33,45 +35,40 +38,7 +21,41 +9,63 +53,1 +33,37 +13,66 +50,15 +1,55 +19,36 +18,47 +61,26 +49,25 +59,38 +5,43 +37,62 +11,61 +22,67 +61,18 +33,55 +18,61 +25,9 +62,49 +56,29 +65,44 +59,29 +33,39 +55,9 +49,37 +13,55 +35,22 +41,39 +48,19 +30,21 +13,9 +21,39 +37,61 +29,15 +27,52 +19,55 +47,35 +51,33 +8,55 +63,7 +35,46 +11,54 +29,69 +15,52 +31,46 +25,62 +63,43 +41,26 +61,41 +7,64 +43,35 +47,33 +40,33 +45,36 +57,41 +57,23 +57,27 +11,29 +5,69 +63,37 +7,25 +34,9 +57,24 +23,5 +59,18 +23,55 +48,41 +11,47 +16,57 +60,25 +60,23 +20,53 +66,47 +56,33 +30,11 +15,46 +26,33 +64,33 +51,10 +35,13 +5,55 +33,21 +10,55 +35,11 +9,53 +23,44 +63,11 +69,1 +21,45 +6,47 +42,17 +32,41 +17,49 +61,12 +35,45 +31,51 +55,20 +31,25 +7,51 +41,15 +45,31 +31,8 +29,13 +3,43 +27,70 +59,21 +43,41 +67,45 +59,46 +56,43 +5,66 +18,39 +39,10 +1,22 +68,25 +15,48 +68,41 +2,67 +37,46 +15,44 +25,69 +43,47 +61,28 +61,31 +43,20 +48,37 +19,44 +24,9 +27,16 +37,29 +51,40 +38,25 +62,31 +31,23 +47,21 +13,53 +12,61 +37,8 +5,47 +17,67 +49,44 +31,19 +25,57 +13,67 +3,65 +63,8 +3,69 +29,63 +11,63 +27,60 +31,37 +29,61 +25,27 +32,13 +1,53 +52,31 +57,35 +36,35 +67,32 +33,30 +4,57 +23,43 +39,31 +46,47 +5,61 +43,51 +51,9 +10,43 +5,63 +69,41 +7,60 +53,21 +45,35 +34,25 +37,35 +33,40 +64,9 +37,7 +9,49 +13,59 +70,43 +11,46 +43,34 +36,49 +29,9 +46,13 +31,38 +41,23 +65,33 +47,28 +54,37 +23,58 +33,33 +1,43 +7,67 +6,43 +63,33 +27,17 +49,41 +15,40 +43,21 +50,1 +61,21 +5,5 +51,48 +37,10 +44,49 +1,64 +55,31 +13,54 +47,31 +31,57 +45,49 +57,50 +52,25 +48,33 +61,13 +27,29 +31,28 +19,69 +23,15 +45,20 +65,42 +24,63 +55,47 +61,20 +40,29 +45,55 +11,59 +48,35 +25,5 +33,29 +15,10 +59,44 +41,29 +24,23 +43,27 +69,31 +37,38 +45,15 +51,15 +65,11 +5,46 +41,33 +62,37 +62,35 +53,20 +59,31 +9,67 +31,44 +46,37 +22,59 +27,19 +41,16 +25,4 +11,8 +31,9 +16,7 +28,61 +49,45 +45,21 +57,15 +50,25 +30,7 +14,69 +43,14 +33,49 +42,33 +67,36 +21,62 +51,38 +37,49 +62,9 +58,13 +35,43 +1,49 +57,46 +25,43 +5,67 +31,53 +59,9 +8,67 +13,63 +43,32 +33,42 +30,49 +0,63 +1,50 +21,59 +19,63 +36,55 +23,37 +67,27 +10,61 +5,56 +31,31 +47,13 +20,45 +28,31 +1,67 +15,62 +34,19 +55,40 +62,23 +2,47 +67,31 +39,5 +7,57 +15,70 +33,57 +28,53 +55,27 +7,5 +66,25 +47,22 +11,51 +23,51 +53,28 +61,33 +23,69 +65,37 +11,53 +31,3 +64,45 +7,69 +13,42 +31,34 +4,65 +68,21 +55,15 +41,55 +15,56 +39,33 +45,34 +25,15 +19,61 +21,67 +37,48 +24,53 +7,49 +37,30 +43,31 +5,15 +37,36 +31,41 +27,65 +25,13 +0,53 +37,57 +45,43 +15,65 +25,45 +33,48 +15,42 +15,38 +45,51 +3,55 +29,7 +39,23 +13,39 +20,63 +31,56 +45,27 +64,31 +27,39 +33,16 +25,14 +61,25 +21,55 +55,23 +43,39 +18,65 +15,67 +43,9 +30,59 +26,29 +41,17 +60,15 +25,23 +57,9 +24,15 +10,57 +17,59 +65,27 +52,45 +58,29 +70,31 +15,39 +55,35 +43,33 +17,55 +29,45 +55,14 +9,59 +53,16 +31,43 +15,5 +17,43 +62,43 +17,47 +59,28 +10,29 +67,29 +61,37 +69,36 +22,53 +43,43 +29,57 +48,15 +29,67 +61,47 +33,35 +51,31 +35,23 +27,13 +34,55 +27,18 +25,49 +25,63 +34,37 +39,38 +60,39 +55,25 +31,32 +53,39 +37,17 +39,21 +33,50 +68,27 +50,47 +26,53 +56,41 +15,51 +51,42 +11,43 +21,47 +35,33 +50,41 +31,11 +45,32 +31,29 +33,28 +15,57 +69,28 +23,63 +35,47 +55,22 +29,27 +29,59 +62,15 +27,67 +13,43 +53,24 +6,5 +29,50 +44,41 +10,63 +36,37 +1,58 +59,27 +39,37 +26,23 +25,33 +39,16 +15,50 +60,21 +3,63 +45,19 +46,41 +42,11 +5,57 +5,45 +4,53 +42,49 +49,33 +10,59 +21,69 +3,61 +30,19 +28,33 +21,42 +30,23 +69,37 +16,37 +33,17 +65,23 +38,53 +54,13 +43,19 +16,9 +34,61 +70,3 +38,49 +39,7 +37,42 +31,47 +15,54 +70,41 +50,21 +15,55 +61,44 +47,29 +54,9 +13,24 +18,69 +25,55 +45,10 +17,51 +52,13 +3,59 +27,53 +22,43 +45,25 +5,53 +39,19 +32,7 +13,51 +33,11 +13,61 +33,15 +59,39 +54,31 +63,31 +30,33 +50,35 +28,29 +22,65 +14,7 +13,64 +13,41 +35,30 +37,14 +27,63 +21,51 +23,23 +57,26 +66,29 +29,48 +35,50 +27,49 +51,35 +13,45 +69,35 +27,44 +13,27 +20,61 +37,19 +2,61 +33,9 +53,32 +61,53 +65,43 +44,13 +51,39 +35,17 +24,47 +27,55 +56,53 +31,36 +50,45 +51,30 +17,68 +29,33 +59,48 +47,45 +34,53 +41,19 +42,29 +45,44 +7,43 +63,45 +34,17 +51,25 +3,51 +37,12 +29,31 +3,42 +63,61 +66,13 +7,48 +27,43 +61,32 +59,49 +15,63 +3,15 +40,47 +35,31 +29,55 +26,57 +1,69 +65,10 +5,11 +24,21 +57,21 +41,25 +38,15 +37,5 +51,27 +41,30 +11,57 +63,26 +67,25 +29,23 +39,18 +17,39 +52,41 +57,39 +51,41 +25,50 +21,61 +35,15 +9,51 +69,30 +56,39 +49,20 +61,51 +27,23 +25,51 +49,16 +67,19 +63,35 +17,41 +56,17 +65,46 +63,40 +6,53 +37,28 +7,47 +32,53 +47,37 +59,45 +70,21 +49,32 +25,7 +26,67 +25,60 +65,26 +59,17 +9,55 +6,45 +11,21 +18,13 +25,68 +39,40 +11,50 +67,46 +45,33 +37,54 +7,58 +35,29 +55,33 +29,14 +23,61 +21,38 +57,11 +15,66 +38,45 +25,59 +40,43 +37,37 +51,18 +67,47 +18,51 +56,35 +49,43 +7,27 +13,44 +46,17 +31,39 +27,33 +5,51 +13,46 +68,39 +61,7 +39,26 +45,53 +43,29 +34,33 +39,15 +7,53 +33,44 +69,39 +62,11 +23,65 +59,15 +41,42 +55,59 +27,7 +50,33 +69,43 +32,59 +58,23 +29,58 +41,36 +49,24 +45,17 +55,34 +33,31 +16,61 +7,55 +31,21 +23,48 +46,45 +6,63 +41,14 +4,59 +35,57 +59,47 +49,28 +57,38 +63,27 +41,22 +13,21 +5,50 +47,26 +57,43 +53,22 +36,17 +57,13 +9,61 +66,39 +55,30 +16,67 +46,25 +13,25 +43,17 +9,11 +53,33 +35,20 +37,55 +58,33 +10,9 +44,23 +45,29 +33,10 +37,11 +63,67 +1,41 +64,35 +33,23 +19,43 +53,29 +47,17 +31,55 +13,58 +33,13 +59,42 +6,69 +43,25 +11,69 +47,15 +41,9 +25,64 +27,47 +47,42 +17,64 +47,53 +17,9 +20,67 +18,59 +13,26 +53,41 +29,26 +59,30 +33,56 +44,27 +26,47 +27,66 +3,21 +49,26 +29,66 +12,59 +41,35 +25,48 +33,32 +27,35 +39,57 +15,64 +37,22 +39,6 +5,65 +11,49 +65,9 +29,25 +49,15 +9,9 +66,41 +55,18 +41,52 +38,31 +59,52 +69,34 +27,51 +27,45 +59,10 +3,49 +29,22 +7,61 +35,35 +32,49 +67,33 +63,48 +20,41 +19,40 +1,21 +1,44 +57,29 +64,13 +49,14 +17,44 +40,9 +19,57 +69,27 +67,23 +63,49 +62,25 +47,24 +17,50 +35,51 +50,11 +32,47 +33,43 +49,19 +39,41 +67,30 +61,34 +43,60 +12,46 +70,22 +38,20 +14,44 +41,38 +22,52 +12,67 +2,7 +58,46 +34,30 +34,70 +6,46 +20,68 +7,24 +9,18 +33,20 +60,42 +67,24 +37,6 +0,61 +12,18 +20,10 +39,54 +69,0 +16,65 +40,63 +14,10 +34,21 +54,56 +16,21 +62,12 +23,24 +48,61 +70,29 +30,16 +0,66 +70,6 +6,52 +30,62 +35,14 +62,36 +48,58 +13,8 +28,60 +22,26 +66,17 +62,54 +40,53 +12,53 +23,54 +61,40 +43,66 +0,34 +15,68 +32,66 +22,10 +42,48 +28,6 +38,38 +55,28 +46,23 +16,68 +52,54 +5,52 +4,64 +57,42 +2,49 +38,12 +64,38 +28,52 +68,31 +68,52 +21,70 +16,16 +8,31 +9,66 +4,55 +11,68 +36,14 +42,16 +32,39 +54,64 +18,58 +52,46 +68,22 +7,0 +29,62 +0,44 +35,8 +18,67 +23,52 +58,42 +26,2 +32,57 +8,66 +30,20 +0,30 +12,6 +46,1 +49,2 +34,56 +16,52 +2,2 +48,24 +25,38 +41,34 +46,28 +32,26 +53,48 +34,69 +11,28 +3,64 +62,8 +12,48 +19,22 +4,11 +24,30 +22,31 +32,45 +19,68 +12,60 +7,32 +22,38 +25,58 +55,42 +47,70 +18,28 +66,62 +34,41 +44,57 +4,10 +53,64 +38,34 +12,22 +37,70 +0,42 +30,31 +35,54 +61,48 +58,34 +36,38 +66,43 +54,52 +39,66 +43,62 +60,52 +37,44 +42,22 +53,0 +70,25 +18,40 +69,20 +53,58 +21,18 +25,12 +0,67 +25,44 +22,14 +48,32 +48,38 +18,15 +52,30 +34,15 +52,43 +52,52 +46,63 +2,22 +10,21 +22,64 +37,58 +10,31 +21,64 +6,40 +0,58 +36,42 +24,2 +65,20 +0,1 +2,58 +21,26 +0,68 +62,26 +8,32 +38,17 +11,56 +19,18 +31,20 +43,70 +0,5 +3,10 +14,38 +14,37 +32,33 +18,44 +62,53 +6,29 +70,30 +42,21 +18,37 +23,38 +14,60 +46,59 +34,22 +10,48 +8,63 +68,20 +50,58 +44,32 +4,67 +40,14 +22,34 +6,25 +38,52 +38,48 +32,30 +38,54 +26,49 +5,30 +34,48 +45,28 +56,58 +17,60 +10,38 +44,70 +24,49 +7,12 +42,38 +38,13 +52,48 +40,2 +52,59 +20,52 +21,68 +44,44 +2,70 +10,6 +24,52 +40,48 +48,20 +70,20 +36,23 +36,58 +20,27 +58,4 +2,8 +26,38 +4,38 +36,60 +12,57 +34,49 +30,29 +48,50 +18,60 +22,21 +64,62 +31,50 +20,37 +20,33 +5,40 +34,46 +12,12 +17,32 +2,29 +44,28 +58,45 +32,63 +54,30 +12,42 +16,28 +8,16 +66,42 +12,49 +12,63 +26,68 +18,25 +44,21 +17,6 +34,34 +36,67 +2,13 +26,3 +70,0 +39,58 +17,14 +18,12 +43,50 +16,25 +2,34 +8,50 +62,6 +26,41 +50,40 +30,56 +18,49 +4,32 +16,60 +22,8 +15,6 +21,36 +4,58 +29,28 +47,40 +36,62 +34,14 +33,60 +8,44 +43,8 +60,55 +39,30 +24,24 +36,11 +47,48 +38,32 +22,58 +31,10 +38,60 +16,46 +10,5 +23,50 +0,14 +4,60 +10,64 +20,22 +66,37 +28,51 +27,26 +38,21 +30,43 +19,20 +0,28 +16,54 +40,46 +34,5 +56,42 +8,34 +41,68 +61,8 +50,63 +27,14 +36,8 +26,36 +30,70 +36,20 +70,33 +41,2 +70,19 +5,22 +38,10 +10,40 +28,42 +42,41 +46,42 +0,23 +70,46 +24,40 +16,39 +38,56 +26,50 +22,5 +40,56 +34,57 +52,64 +46,70 +8,26 +3,34 +32,52 +70,44 +12,24 +8,10 +28,50 +14,16 +20,56 +9,60 +8,20 +37,34 +49,22 +27,24 +17,10 +68,30 +22,62 +22,15 +58,35 +69,44 +14,20 +48,22 +48,25 +51,2 +26,21 +6,30 +12,26 +33,12 +5,60 +60,56 +0,70 +4,56 +56,50 +58,47 +46,0 +50,22 +52,68 +4,4 +32,36 +34,60 +30,17 +36,56 +62,42 +28,23 +3,50 +35,28 +39,34 +38,3 +30,12 +20,7 +18,57 +52,60 +6,50 +52,49 +4,13 +56,56 +8,70 +44,8 +70,1 +28,62 +42,42 +60,12 +50,28 +47,38 +60,43 +50,54 +51,50 +55,12 +31,18 +47,32 +18,16 +16,6 +62,32 +24,69 +2,54 +62,27 +40,32 +38,68 +8,36 +59,70 +52,16 +68,37 +24,18 +53,8 +14,70 +31,60 +32,4 +33,36 +64,14 +52,22 +31,22 +12,51 +16,38 +30,1 +48,40 +57,56 +69,40 +25,32 +50,60 +49,4 +30,64 +46,22 +28,48 +42,56 +2,43 +46,6 +6,41 +43,46 +20,59 +54,6 +58,64 +0,59 +41,10 +54,42 +62,63 +30,57 +4,17 +22,40 +60,44 +52,42 +28,30 +7,2 +0,15 +22,27 +70,38 +30,68 +5,64 +35,38 +0,20 +17,62 +55,70 +5,4 +56,60 +34,42 +60,61 +40,27 +38,44 +5,16 +14,51 +18,26 +46,46 +69,26 +48,14 +32,43 +10,28 +27,22 +54,20 +14,48 +67,26 +57,0 +4,70 +59,12 +51,6 +40,10 +59,20 +32,8 +34,2 +20,18 +62,44 +64,46 +20,58 +56,31 +54,69 +28,14 +0,17 +22,12 +52,0 +20,44 +34,8 +32,29 +65,30 +56,3 +26,52 +4,47 +22,1 +13,38 +62,65 +0,31 +44,42 +42,15 +42,10 +24,38 +10,62 +26,64 +48,64 +48,21 +43,56 +8,46 +4,7 +9,0 +30,14 +56,61 +68,34 +56,55 +13,40 +50,62 +8,2 +50,39 +18,68 +0,37 +4,5 +47,36 +14,24 +44,58 +56,25 +24,62 +6,13 +11,2 +20,5 +18,11 +51,16 +56,6 +53,70 +32,0 +34,51 +37,56 +18,41 +42,70 +24,20 +22,44 +28,46 +20,38 +36,34 +10,56 +43,44 +0,60 +1,70 +37,0 +58,12 +68,17 +66,14 +70,40 +61,58 +53,40 +60,19 +14,4 +3,20 +6,38 +53,18 +24,8 +14,43 +42,43 +50,4 +57,30 +7,50 +37,40 +64,65 +36,47 +66,34 +16,27 +70,34 +20,14 +60,27 +32,31 +66,48 +43,28 +64,28 +67,54 +13,70 +50,38 +42,58 +52,26 +24,29 +20,48 +17,30 +66,67 +68,64 +68,9 +14,68 +70,24 +38,5 +60,47 +11,60 +67,12 +0,43 +1,12 +56,16 +38,22 +24,68 +51,8 +38,63 +60,22 +36,54 +38,61 +66,45 +46,27 +48,8 +6,0 +27,30 +8,40 +32,60 +5,62 +62,67 +64,32 +52,37 +60,5 +70,64 +10,18 +63,52 +18,20 +34,39 +1,62 +51,34 +40,49 +28,38 +51,62 +8,54 +45,58 +5,10 +12,15 +68,8 +26,22 +35,34 +58,32 +32,34 +10,10 +6,7 +38,42 +62,57 +52,6 +40,22 +62,70 +58,6 +50,48 +41,46 +52,18 +60,2 +25,70 +5,0 +50,6 +39,2 +2,4 +62,45 +48,23 +57,34 +55,66 +18,14 +9,52 +24,22 +54,60 +49,52 +12,54 +54,14 +63,44 +56,64 +4,0 +20,50 +18,64 +1,18 +14,41 +16,35 +29,2 +66,52 +12,50 +42,68 +34,24 +56,57 +66,32 +57,60 +28,8 +22,66 +32,32 +52,58 +50,42 +4,36 +16,32 +65,58 +56,20 +42,0 +17,4 +34,68 +49,36 +32,58 +68,50 +19,16 +6,70 +40,38 +60,37 +50,49 +34,40 +51,70 +1,38 +13,32 +53,66 +6,32 +65,32 +32,22 +14,55 +38,30 +44,26 +66,8 +50,30 +48,31 +5,36 +52,19 +29,30 +24,50 +55,36 +46,69 +64,18 +44,0 +27,10 +68,32 +60,13 +12,17 +10,34 +18,18 +70,52 +10,8 +12,38 +16,70 +8,9 +58,65 +64,21 +70,4 +5,48 +22,49 +36,2 +18,30 +41,6 +10,44 +48,48 +60,14 +23,42 +46,36 +18,56 +40,18 +36,40 +24,59 +64,64 +40,11 +59,50 +14,57 +25,46 +65,0 +32,16 +24,4 +40,34 +50,36 +38,50 +20,30 +66,38 +14,40 +70,62 +6,58 +12,28 +62,60 +68,28 +36,29 +58,37 +45,68 +22,22 +40,65 +49,64 +24,65 +40,8 +0,12 +40,64 +70,66 +23,62 +66,49 +28,32 +47,44 +10,12 +29,8 +26,18 +28,16 +49,50 +7,6 +30,54 +52,10 +32,10 +1,0 +40,28 +7,52 +18,54 +5,42 +58,10 +54,40 +41,4 +10,22 +24,56 +44,36 +39,14 +12,2 +65,48 +20,16 +10,4 +56,66 +40,68 +16,19 +45,42 +20,43 +50,18 +40,15 +0,6 +18,62 +14,2 +51,44 +35,48 +54,68 +7,4 +30,25 +27,36 +48,9 +42,46 +57,54 +68,55 +34,59 +58,16 +70,65 +70,14 +24,12 +46,12 +30,39 +55,2 +38,8 +62,22 +3,70 +60,40 +7,44 +9,44 +16,58 +64,2 +22,46 +40,45 +23,0 +62,30 +46,18 +23,6 +27,48 +31,66 +66,30 +52,9 +29,20 +36,21 +69,10 +24,41 +8,38 +44,34 +37,66 +68,4 +34,28 +21,44 +28,70 +42,30 +35,42 +46,16 +6,8 +36,48 +8,61 +14,26 +62,0 +28,45 +46,7 +7,68 +32,40 +61,24 +32,1 +40,12 +58,2 +62,58 +0,2 +42,60 +13,68 +48,59 +6,18 +36,28 +61,0 +63,28 +58,8 +44,33 +59,6 +64,6 +12,62 +30,32 +39,56 +70,32 +67,44 +56,11 +38,6 +2,36 +60,50 +55,26 +58,66 +55,8 +48,17 +56,2 +64,0 +60,41 +64,24 +42,52 +30,13 +16,20 +30,44 +1,26 +47,34 +24,54 +56,8 +16,0 +2,32 +62,38 +70,56 +18,50 +9,28 +63,38 +30,18 +10,70 +44,25 +57,40 +28,26 +54,0 +36,12 +32,24 +44,62 +52,23 +19,54 +45,30 +51,68 +8,8 +48,62 +40,60 +48,6 +48,69 +22,36 +61,10 +62,28 +51,66 +14,18 +53,56 +29,52 +63,4 +46,50 +26,69 +52,56 +21,54 \ No newline at end of file diff --git a/2024/go/day19/day19.go b/2024/go/day19/day19.go new file mode 100644 index 0000000..e4e19bd --- /dev/null +++ b/2024/go/day19/day19.go @@ -0,0 +1,87 @@ +package day19 + +import ( + "sort" + "strings" +) + +func Part1(input string) int { + in := strings.Split(input, "\n\n") + towels := strings.Split(in[0], ", ") + patterns := strings.Split(in[1], "\n") + // fmt.Println(towels, patterns) + count := 0 + not_possibles := make(map[string]bool) + for _, pattern := range patterns { + if isPossible(towels, pattern, not_possibles) { + // fmt.Println(count, pattern) + count++ + } + } + return count +} + +func Part2(input string) int { + in := strings.Split(input, "\n\n") + towels := strings.Split(in[0], ", ") + sort.Strings(towels) + patterns := strings.Split(in[1], "\n") + // fmt.Println(towels, patterns) + count := 0 + memo := make(map[string]int) + for _, pattern := range patterns { + count += countPossible(sortStringsByPrefix(towels), pattern, memo) + } + return count +} + +func isPossible(towels []string, pattern string, not_possibles map[string]bool) bool { + if pattern == "" { + return true + } + if not_possibles[pattern] { + return false + } + for _, towel := range towels { + if strings.HasPrefix(pattern, towel) { + if isPossible(towels, pattern[len(towel):], not_possibles) { + return true + } + } + } + not_possibles[pattern] = true + return false +} + +func countPossible(towels map[byte][]string, pattern string, memo map[string]int) int { + if pattern == "" { + return 1 + } + + //If memo has key + if val, ok := memo[pattern]; ok { + return val + } + + count := 0 + for _, towel := range towels[pattern[0]] { + if strings.HasPrefix(pattern, towel) { + count += countPossible(towels, pattern[len(towel):], memo) + } + } + + memo[pattern] = count + + return count +} + +func sortStringsByPrefix(slice []string) map[byte][]string { + result := make(map[byte][]string) + for _, str := range slice { + result[str[0]] = append(result[str[0]], str) + } + for _, t := range result { + sort.Strings(t) + } + return result +} diff --git a/2024/go/day19/day19_test.go b/2024/go/day19/day19_test.go new file mode 100644 index 0000000..fa99ba2 --- /dev/null +++ b/2024/go/day19/day19_test.go @@ -0,0 +1,42 @@ +package day19 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`r, wr, b, g, bwu, rb, gb, br + +brwrr +bggr +gbbr +rrbgbr +ubwu +bwurrg +brgr +bbrgwb`) + require.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`) + require.Equal(t, 16, r) +} + +func TestPart2Long(t *testing.T) { + r := Part2(`rrgwru, gwubwg, wgbbw, bwb, ugrgw, uwgguuw, wuggb, bgwb, ubrr, grruuub, rwbwgbub, wwwggg, uuw, gubuu, urwb, bubg, bubb, rruruuu, ubgr, uw, urugg, wubuu, brwb, buw, bgug, wgbwwrb, rwrgrr, gwgr, rrwrg, wwbwgbw, gguu, rgg, bwg, ruurrwg, wbu, ggg, wrw, brbw, wbb, rrbgg, gbb, gwwrubwu, rwgu, grgwwu, wguu, rwg, wbwug, rbur, gwg, wbrugu, wbwwgu, wbbuw, rwrg, rgru, rgb, bwwrg, bwur, rrubwu, gwb, ugwur, wbguwb, rbu, ubrwgw, ruwbr, wbbu, rrbwbg, rgub, rwgb, urwg, bbw, bugg, rugwg, rwbrwww, wuru, guu, brwbg, ug, ruuwruw, bguww, wwrgrurg, rrbgr, uubwurb, brrrwgg, bur, urg, rbg, wruw, gr, ugb, wwrbgrg, wbuuw, bbugu, uug, rrbb, rrbw, bgr, wwwru, rgu, urr, rg, wbgbru, brrgu, gubu, rurgr, wwbrgg, ruurwgwg, rbb, rbrugwb, gwwrbg, bwuuwrg, wu, b, bgwrb, uwggr, rgbb, rww, wgwb, gwgwr, uwbb, uww, gu, ubwuu, wbwwwug, rurwru, rr, rrg, uggr, bgwu, wbgbu, urggw, br, gubgugr, wgrb, bbgrrbu, brbg, wrg, bgrb, rwbwwur, uwr, bubu, grwb, ubb, wr, bbbgwr, bug, uwgwuwu, grb, bgw, uuu, ugr, wgbbgu, gbg, bgwub, urbgrw, rbruwg, gb, bbwgwur, uwbgwrr, ggrb, wbrrwrbu, gbbugrb, ub, rwb, gwr, ruwu, gurgu, rru, uuwwgwuw, bw, ruwbbb, rbgrgu, wuwu, grrugr, wgr, rbbr, rugr, rrrrbww, bwrr, wrbbr, uuwgr, gug, wwb, rgur, brbrr, gguw, grwubrg, rrrr, uwb, wuwwrrwg, gwbggr, rwrub, wuur, gub, rbgb, urrbubrr, uwubu, brbb, bwbr, bww, ruuubwu, ugbbbr, bub, rrug, wub, gruu, uu, bbu, gbbr, urrg, buwu, grw, grbbbu, bgb, ugubg, uwww, urw, wwubruww, buurb, www, bguurr, wwgu, wgb, ruwub, wggggbg, urrb, gbwuw, ubrrg, wrr, gbubgg, gw, wuw, wuug, wwrb, wgg, rgugrru, rgwrbr, guurrg, bgu, rurgb, gwggb, bwgbbw, ggwb, ubwgw, bbg, rbr, wgru, urwr, brr, rgbr, rgr, wwg, guwuru, uuggg, rrw, buu, urb, guwg, ugwwbuwb, rubb, brbuww, rwugru, ubu, wwub, bgwgb, wrug, rug, w, brgg, wwugwruw, ggrwb, bbwuwuu, uub, rrr, ggbrr, wbur, wurbru, wgu, brb, urbbb, gburbww, wbrgruru, rbugr, gubw, wgwgg, rwr, ugw, gggg, gwrwrg, rrub, gbwgg, grg, uwuur, gbwbbb, guw, gbwbb, uwu, ruw, bwr, rwgub, rbw, ggbwr, u, gwu, rrurrb, gwgg, uugwrbr, brw, ugburg, rwu, wwu, wbr, ruwgr, gbwbur, rwgr, rwbww, rbgr, rgbub, rbbuw, ruu, bwgw, bbwg, ubr, gurr, wwr, wwwguu, gbw, ggw, gru, wug, rubwrbrr, wbrrrr, uru, wbgw, wgur, uurgg, bbb, rbwgwbur, wwbwur, bbgubw, gww, brg, ugu, rgrgw, wwrrgugu, rrrwuww, uwwrb, wrb, rrgg, wubgrrb, bwwgrbww, gbr, gwrwu, brgwwbu, urrwub, rbru, bwrgrr, brwuwrb, guuur, wb, bbrb, brww, wuwrww, bu, rgw, rwbwug, bbug, urrgr, bg, bgg, wbgwbgru, wbrru, uwbbr, wbg, gwwur, gur, ubwb, gubbb, bb, wrugr, grur, rb, uwubrg, bwgrw, gbug, g, wuwubgw, ubw, urgu, rrrg, uwg, bbww, uwgrug, ww, ggu, gwbuwu, rgggwgr, wugw, gbrrg, ugg, bwu, ubuur, uurrw, uwwug, bgww, ubg, rw, gwgbwrg, wuu, rbgbg, buwbur, rub, ugbwwrgu, gbww, wbw, gurbwu, bruw, rggrbrgw, wguwu, ubwbwr, ru, uwur, ggb, uurwg, wguubgr, wru, rbrbr, rbwr, wwwrbb, urww, rur, bru, bbbwrw, uwrwrr, ruww, ububbgr, rrb, bggrwg, bbr, wrwrb, bwgwrbg, grbuwg, gg, ubuurwg, uur, guguwb, rugurgbw, bbuwbb + +wrbwgruugbbgwwurggwrgrrrurbgwbgggwbbgwgbrwggwur`) + require.Equal(t, 16, r) +} diff --git a/2024/go/day19/input.txt b/2024/go/day19/input.txt new file mode 100644 index 0000000..f06b5fa --- /dev/null +++ b/2024/go/day19/input.txt @@ -0,0 +1,402 @@ +rrgwru, gwubwg, wgbbw, bwb, ugrgw, uwgguuw, wuggb, bgwb, ubrr, grruuub, rwbwgbub, wwwggg, uuw, gubuu, urwb, bubg, bubb, rruruuu, ubgr, uw, urugg, wubuu, brwb, buw, bgug, wgbwwrb, rwrgrr, gwgr, rrwrg, wwbwgbw, gguu, rgg, bwg, ruurrwg, wbu, ggg, wrw, brbw, wbb, rrbgg, gbb, gwwrubwu, rwgu, grgwwu, wguu, rwg, wbwug, rbur, gwg, wbrugu, wbwwgu, wbbuw, rwrg, rgru, rgb, bwwrg, bwur, rrubwu, gwb, ugwur, wbguwb, rbu, ubrwgw, ruwbr, wbbu, rrbwbg, rgub, rwgb, urwg, bbw, bugg, rugwg, rwbrwww, wuru, guu, brwbg, ug, ruuwruw, bguww, wwrgrurg, rrbgr, uubwurb, brrrwgg, bur, urg, rbg, wruw, gr, ugb, wwrbgrg, wbuuw, bbugu, uug, rrbb, rrbw, bgr, wwwru, rgu, urr, rg, wbgbru, brrgu, gubu, rurgr, wwbrgg, ruurwgwg, rbb, rbrugwb, gwwrbg, bwuuwrg, wu, b, bgwrb, uwggr, rgbb, rww, wgwb, gwgwr, uwbb, uww, gu, ubwuu, wbwwwug, rurwru, rr, rrg, uggr, bgwu, wbgbu, urggw, br, gubgugr, wgrb, bbgrrbu, brbg, wrg, bgrb, rwbwwur, uwr, bubu, grwb, ubb, wr, bbbgwr, bug, uwgwuwu, grb, bgw, uuu, ugr, wgbbgu, gbg, bgwub, urbgrw, rbruwg, gb, bbwgwur, uwbgwrr, ggrb, wbrrwrbu, gbbugrb, ub, rwb, gwr, ruwu, gurgu, rru, uuwwgwuw, bw, ruwbbb, rbgrgu, wuwu, grrugr, wgr, rbbr, rugr, rrrrbww, bwrr, wrbbr, uuwgr, gug, wwb, rgur, brbrr, gguw, grwubrg, rrrr, uwb, wuwwrrwg, gwbggr, rwrub, wuur, gub, rbgb, urrbubrr, uwubu, brbb, bwbr, bww, ruuubwu, ugbbbr, bub, rrug, wub, gruu, uu, bbu, gbbr, urrg, buwu, grw, grbbbu, bgb, ugubg, uwww, urw, wwubruww, buurb, www, bguurr, wwgu, wgb, ruwub, wggggbg, urrb, gbwuw, ubrrg, wrr, gbubgg, gw, wuw, wuug, wwrb, wgg, rgugrru, rgwrbr, guurrg, bgu, rurgb, gwggb, bwgbbw, ggwb, ubwgw, bbg, rbr, wgru, urwr, brr, rgbr, rgr, wwg, guwuru, uuggg, rrw, buu, urb, guwg, ugwwbuwb, rubb, brbuww, rwugru, ubu, wwub, bgwgb, wrug, rug, w, brgg, wwugwruw, ggrwb, bbwuwuu, uub, rrr, ggbrr, wbur, wurbru, wgu, brb, urbbb, gburbww, wbrgruru, rbugr, gubw, wgwgg, rwr, ugw, gggg, gwrwrg, rrub, gbwgg, grg, uwuur, gbwbbb, guw, gbwbb, uwu, ruw, bwr, rwgub, rbw, ggbwr, u, gwu, rrurrb, gwgg, uugwrbr, brw, ugburg, rwu, wwu, wbr, ruwgr, gbwbur, rwgr, rwbww, rbgr, rgbub, rbbuw, ruu, bwgw, bbwg, ubr, gurr, wwr, wwwguu, gbw, ggw, gru, wug, rubwrbrr, wbrrrr, uru, wbgw, wgur, uurgg, bbb, rbwgwbur, wwbwur, bbgubw, gww, brg, ugu, rgrgw, wwrrgugu, rrrwuww, uwwrb, wrb, rrgg, wubgrrb, bwwgrbww, gbr, gwrwu, brgwwbu, urrwub, rbru, bwrgrr, brwuwrb, guuur, wb, bbrb, brww, wuwrww, bu, rgw, rwbwug, bbug, urrgr, bg, bgg, wbgwbgru, wbrru, uwbbr, wbg, gwwur, gur, ubwb, gubbb, bb, wrugr, grur, rb, uwubrg, bwgrw, gbug, g, wuwubgw, ubw, urgu, rrrg, uwg, bbww, uwgrug, ww, ggu, gwbuwu, rgggwgr, wugw, gbrrg, ugg, bwu, ubuur, uurrw, uwwug, bgww, ubg, rw, gwgbwrg, wuu, rbgbg, buwbur, rub, ugbwwrgu, gbww, wbw, gurbwu, bruw, rggrbrgw, wguwu, ubwbwr, ru, uwur, ggb, uurwg, wguubgr, wru, rbrbr, rbwr, wwwrbb, urww, rur, bru, bbbwrw, uwrwrr, ruww, ububbgr, rrb, bggrwg, bbr, wrwrb, bwgwrbg, grbuwg, gg, ubuurwg, uur, guguwb, rugurgbw, bbuwbb + +wrbwgruugbbgwwurggwrgrrrurbgwbgggwbbgwgbrwggwur +bururbrguwurbguwrubbbbbuburuuuwbgbgrwggbugrwrwurwwbrb +wgwgwbwuggbbwbrbgrwwgwbrbwbrbggrrgburbubwwur +wguwuugubwggburwwbbbbwrgwbrwuubgbbrugrbrrbrrugwuwguwrwwwur +rubwururuggurrgbgrburbrgbuuuuurwgubbbrbuwwbgbwgwrb +rwrwguwuwgbruwurgbwbgrugwgrggwwrrgrbwrurrrrgbrgbbgwggwb +buggrbwwurwuwbwrrwgubuwgburrrwbwubugugwurrbwgwburwubuurwbb +ggwgwrrwbrbgggbubwgwgguurbwwwggbuwbrubuubrrwur +uugugbrwbbwuugwwuwugurbuugbrugrrgbwgugggrgggrgrur +bwrubgugbuugbwrwbbubbgbugbbgruubwrwgubwguubbbugu +wrgrwwgbgubrrwbbgbwuurgbbwrrgwrrwuugrgubwrgrwbwbbbwrgrbb +rwbwwwgrgbrbgwurwbwwrrguwbrbwgrubrubguwurg +rbggguwguwrbgbbruruwgguuwwwrwbugwbbbbrrwgwb +wburgubbbrbgugwurbgrrwgbbuggbrggbrbubrwbrrwur +wgwrwurgrbwgwwuwrgwwbubwbubwbubggwbwgbwwgr +bgbbbgwwgbggrububrubbwwwguruurbbwwububwugwwuburgwurgrwr +rugwgbugbwbbrbgbwrbgwgurbuuwbbwbwbwbguugruwbrrrugwwu +rwbgruguuurwbubwrbrbwwrwurguwuwbbgggrurbgbgbwwwggwu +ubwubgbbrgbbbbgwwurgbuwuubgurwrggrrrgrbbbgggbrbb +wuuruwbwubrwgwuurugbrbwgubruuwwurwgwrbrugwrrbuuuww +ugwgbwrggrwwuwbgwwrubwuubrbrbwgbbwgbubburuguwguww +grbguwwuwgrburgggguugubwwgwguuwbwuwuwgugwggggwurrubwgbbwrb +buwbuwubrrugrrurwrwwbbbrugurgwguwugwwbrurrwbrgrg +gwwgggurwbwggwwbwrrgwwgurubrubbrbuuruurwur +rruguggbrrgwgwgrwbwwwugrbrubgruugrgwgubrgwbubwbrw +grbbbwrrugwrwwurwguugugguwuwggruubrgubguuurubrgrrruwub +wwrwguwwurbwuwwrrwgwggbgwruugbbrgruubwrwur +bgbwwwbbubrugwgubbgbggburrwggbbggbrbgwrrrbrgurwur +gwbwurgrwwbrgrubwgruubbrugbruruwuwgrubugwg +uguugbrbuuugbwwrgubrwgwrgggwrrgbrrbwbuwwwwbgbuwurbrbr +ugbggbwuwrgwugurggrugbrgwbwwbgbrwugubgrwrbuuwgrurwgguugwwwur +uwrwuggbuwwbururwgbrggwgwubburwwggguwwrrggwu +grrwwwrugbwuubrggrwgrwuuuwgwrwrbugrrrwubgwggwbguurbw +rgbuuwbgwgwuwurrgwrgugruwgwbgggbuugugbbwwrwugwrurubwr +gwguwrwgbbruuwrbbubburwgrrrrrwburrwuwrwgwgwur +bgbbuuguggrgrwugruwrbuuuuurwgbwbbubwrrggwrbw +rwwurubruwuwbrbwugrwbgwwuwwuuwuwurwwgwbrwgubgrruuurugwgg +wbwguwbrruruuwubggrbggwggugurgwgbrbugbwwbrbwuguuugr +uguuwrrbrwugrwwbbuwwrgbrwgbwubbubgwwbuuwgrwuwggbwr +wguwwrbbggrugbwrugbububgurrubggbwwugubbubuuguggrwur +uuurbwwwguurrbrgrrrbwgbwuuuwurwbuwgurwguugwrwggb +urrgwwwbuuwrwugrurgwgggrgbwuugruruuwwubruwwbru +wugugbguguwugbwgrgbrugrwwgrbwrgwwubruwwrggggwur +brubbgbwubwugbrruwububuuwbbwbrugwrbbrrggrgwrugrrwbbrrub +gwwruubbrrbbrwuubrwrrgwuwrgbuuwgggbburgwurrwbuuuub +wbugwuwbbwwwggrwwbgwuggbwuuwwgwuwbrubwrgubwurwwrguur +urgrgwrurbwggguubwuuwrbbwrgggggugurgggbbwbbwgwuu +wwgubrruggbgrwbggwbrubwggbwuuuwbbrwgbgbbbrbwruwwwwurw +wuurrggguwwbgbgubugrbwgwgggrwbwgbubuwwbbrwbuurwgwguwgurwur +rgrggggggbwrrbgggguurbbbubugbururrgrrrbbgwugbwrbgubb +rbburbururrbrurrwgrwrruwubwbgrrurgrubuwwur +bgguburbbruwugrurubbubgbggwgbgrrgwgwbguguwgubrrgwrbrwur +rrrwrbgwwrubwuwurgrrwbruwuwbgwbuguurgbrbrgwur +rrgbbgrurgrgrbrwggbubbbubbwgbuuwwugbrwgwrgwbru +bwggrguguburbbrwurrbgrgbgwwrwrrrwuwgwgbggwrggubwbgubbwurbb +gbwuwwgggrgwbbrrbuuruwubwrubgubwwbgwbgrbgurbg +bbwgrbbgwurwbrgbggwbwgwurburbburgugurbbbwbbbggrbu +urwgrwgguuuwruuwrbuggggwurbrbgwrbwbggwur +wbgrurwuwgugbuwgrwrwbbgrbbburwggugugrrgbrbbwrbbrruuwgwur +ubbuggwrwrgggrugwuwwuwrgruwwbrwruuugwgrrurgurrrbbugbr +uuugrwugwuuwurgwbrgwgugrrwbrrwrbuururubguuwrbwugrbbrgwur +ubrwgrruuugwgbrgbgwgugrbwwurgbwrbgwuubbuwrbgwwwwur +gguubbgggggwwwwrrrbwwubggwuggubguuuubwwugrrrgguwrbwrwwrwur +bgwuuuggwgbbbgwugwuuuwububgurgbwbbwbuwrbuwgrgg +buwwrrurugrgbgbubuwbgwgurbrrguwuwwurwwgrurrwrbwggrrbrrgrg +urggwurbbubbrubrggwgbbwbuubgggbggrwbwrrwburubg +rbuurgbbrrgbuwwrwgurrbgbrurwgbbrrbgbwbgbbwwuwwb +ugbggurgguuurggguuubgurrgurbuwrrgbgwwgbwwbwwrgbggrwwrbrbrb +wbwbubbrwubwggwuugrgubbuguwgurruugrrbwbbuwbgb +ubuggruwrwgwbubuuuubuwwgwrbuurbuwgwgruwgrgrurwrrrwgwbuwg +bwuuwubuwrwbwbubwgbwwwbwubgugugrugwrrrwgwbgw +ruwurrbgbuwrwrbwrbguwbgrbrrubugbubbwugrrbgubggbrugw +wggrwwgwurbgggbgubgrwggwbwbrbggwwbrrurwbbguwurgb +bwbgbbuwwruggbgrrrbbwbgrbbuwuuuugbwgggwwwgbwbbbwubwu +wrrbgbbbguwgrwrrrgbbugrruuuwbgwgbgwurbbuwrugg +bggrbrgwgrurwgubgwwwwuwbbuururugwwrbrgrbubwwur +ubbwwrwrwurwgbwrwwggwgggburbgggbuwrwbbwrubrubgugbrwwuw +rbguwwbrgrrbbwuuwwgurbwbrwbbbuuubrwrggwwubbgrrwgrrwuwu +wurrurgbwbgbwbrrubbrggbwgbwrwbuubgrbuwuwrbgrgrbw +rrbgbrurwrwugbgwwrggbrgbwugurwrbwwrubugubwru +guwbrgbuuurrguurgugwgwwrwwbrgbgwwwgbbgguwwwur +gggbrwguwguwgwurrgurruuuubrruggwrgbubugurrbububgrw +ggrburwwubbwwrwgbgggurrbgggwgrrbrbbbbwugbwrbrwubur +bbbgrugwwgwggbruwrgwwbgrbbuubuguwbggwwugbuugwbwrubgguuwwg +guwgwbggruuwgrwgrbwgrrwurwgbgwwurgubrubgbuubrwwwuw +rguwrbbrbubuguurbgwburguwbwbwgwggbgwgwwuwubrwruu +uguggubuwrwrugrwwuuuguguwwrwrbgwbwbwwggurbbggbrbguwwgubwwur +bggwbuuwurgbwbrbwbbrrgwwgugrrugubbrbggbrrwug +bwrruwuguwwgbwwrrbbgrrrrrrgugbwwrrgbuuwuwrwr +bgwbugbuwwrwwrwburwwgbgbwubrbrwgbugrruuugbbbrgurbwub +ruguuwgbrrguuuwbbwwbgbgrbwgwgbwbwwrbruubrw +rguwwwggbrwbruuwwbubbbbgbbwgrwgwggggrggwbgg +ruwrugwwbuwbwwwbrwbggwburrwwururguruuguguwgrbu +bgugbrbgggbbwugwbwuurbubruwwbrbbbgrgwrgrgggrbwrg +wbrgrgbrwbwbrwuuwbrbbwrwrrwbgwggubrbrbwrrgrbuwwr +grwuwgugrwbgrgwwbwwbggwgrwrgubgrrruuburrurwwrwbrrggwgwwbgwur +ubwbwbrrbgrgwuuwgwubgggrgurwuwbrwggurrgrgurrwubrubbw +rbrgwuwggbbubruruuuubbggwrgurrwrwwuwrgguurr +urgurgubgrgubwgugwrbuugrwrgwbgwwwwubrwwbguggrrrrrb +grrurbuubrwguguurrbrguwrrggwwwgburgrrrwbgwwbbrwrwrwgwub +uruwwwbgbbbbggbbbbuwwgubburwwuugburguurwur +gwurgwwwrgrurgbbrrrwrbggbgrwgbrgugruruuwwgrgwwwwrwuwubugbu +rugguwwgwrruurwbgwuguuruuuwbgbgubbubrrrbgwbwwwwbbbb +wbbwgwrgbwwburuurgrugbwggrwbgrgubbrbwurggbggbwwwrgggbr +ugrrurbugbwwrguugwugggrrugwgururwbbubgbrwrwur +rugbrrbwbbrrwbrgwuwbgugggruuubburgbrbububrrbubwuurub +wgurrbuugubgwwbruubrrwbwwubbgrububguwgbrrwwuwuwuuw +ubrruwbuguurgbbrrrwuggbggwbrrgwgubgwbruugwuuurgubrbwugwwb +wuwrrbuwuwbburgwurwggwugggbgrwrwgburgurgbg +uwwburubuwrrubbuwgwbugwrwbgugwgbbggwbugbwuwwbruggwur +bgrubrbwruwuuuwwrgrwubrggbbgbuubbgugubrrburbgu +bgrgrgbugrurwburwbbrruwrwbburwbwbggguwburrrwuggurbbrbgrbu +bguwuggrguwbrgruuuguwwgrbgrwbuugwrbrbgburwbwwbwrb +wggbwwbwwwbbggggurbbwuubgrbrgbbrrwuuwburrugwwubgru +rbgburuuggwwwguwwrbrggbrwuwgbrgbrwwbgrugwuubguwbu +gbrbuububuububrbgrgwurbbwbuugwbrwrururgugwgbwwgggbbgbwurgwur +ruurwgwggwbbwrbgrrurguwgwwrurgrgggrgguubgguwuwrw +uwbubgwguuubbbgbrrgwwrbbrururwgurrgbbrbgubwwgbgwuguuwurub +wrwrugugguwbuwwwwgrwrbgrbwuwburbbwwgubugwuguwuwwur +urbrbwwuggwurgwbrrbgrbwrbugbugbbbwuuguwrrwurrwur +rbrbubrrruggbrrwrwbruwburrwuwgwrrwgubbgguug +gubrurwwgwwuwbrrgurggrgbwwrrgbbruurgbuubrwgr +bbrwuugubuugwwwwgbrgubbbrgbrrguwrggrurrwgbrggbugbbwwbwrrgu +uugbbwwwgwgurgggrugubgbrwwrwrwrrurugrwwur +guwgwbwgrbwbrrwrbugbbwuugwbbwgwwbrwrwubbbrb +bbbrurugrugbwuguuwwrgbrbwbwwuwwbrwbrwurgbgbggrgruuuru +ubuubgbgbuwugugurbbwuubrrgbwwubuggwbururggrrrgr +ubgwwbgurbruggwwrubwggubbuubggbggbwwwwwwgubwgu +gburuwbbrrrbwwbgbugugguugbbbwbubbguwrbrgbbgwgburrugr +gbgwbgruwrgwrrurwuugrwugruwrgubwbrrbugubugugbbwu +burbubrgbwgrwwrwbbrbuururggwbwubugrwruruuwbuuggrwbgb +bbbwgubrburwbubwwbruubguugrgwrgguuruubbwbb +guwggggrgrrugrbbrwururugbbrwrurwgbwgrrrguwwrrbbbwuwuug +bgwrrrgwruwrbbuwgbrugruugwrrrugwwuubbugubbubgggubrrrwwg +bbgbrwrwrbwbbrgwwgbugugugrrbwbbbbrbgguwrbugrbwgwrbru +rrbwwggrgwurbuwbwbggbrrbggurugwgubgggbrrbwwrugrwgurbugur +ggburugbwruugbburgrbugrgrwbbwbruubgubgbgubugubbbgrrbrgrg +rwuwrgbwgwubwubrrbgbrrbwrrwgugwgguubbrbbwguwwwwur +wuwwgbbbwrgwrrbrrgwbwwubbwrwrrrwwuuburuubwbuubuwwbbgg +wbbgwrgbrbubwggbuwwuwwggrugwwrugrgwuubbwuugrggbbrgubwrrgu +burrbwgrgbrgrruugwbwruugwbbbburwbbuwgrwuguwrbgwur +bbwbwuwwwbwbrgwwwrrwggbwgruurrbrgwggbrbbbrrbgbbgrrrwrugg +wwwbbgwgbwwrbugurgugrrggbuguugrbbgwrguugggbwwugrugu +gurbrggwrwugwgrggrbrgwugbrbuugrwurrwgrbwurwuuruwuggwruwr +guuwgguwwubrbwwguubugurbwbrrwwwbbwgggrwururgg +wubuuuurbuwbrrrurbggbgrwbbwrbuwwbwwbrbrggrwgggwwwur +wgwrwugbrwgubguguuugwbubuwbbrwgbbgrgubrruuuuuuu +wbrgwggwruuwruwwrbruubuwgwwwbuuugbwububbgwbgwbgbg +wwwwgwwwugrwgrgrgwbbuwgbgruwugrrwuugbrbrurrrguubwwur +bgbubwrwwrgrwrbuwgurrguwbruuwgguwrurwrurrwgugggbwrbwwggw +rwwurgwuwgbbwggwwuurbwbbwrwrbwbrwrgbrbbrwbr +wrugbbrgbbugrrwbrwgwuggrbrwwwgbgbbuuurwuwubbggubbg +grrwurgburgruuurgrbuurgwgwurubgbbubbubuwwwbwbuuubbbrrwur +uguuguurrwbbwgwrwgruubgguubgwggbburbuwwgbrwruururwbgrgrrgu +gugbrwwwbguggrubbuwbbbwggbgurruruwubrwggruurwbggrrruurwbb +grgrbwuurwwwuwuwwwgbuubwbuuruwwwgguubwbruggbrgub +gwruurrugubbwbbwrggrgurbwuugbgbgbubbugbgugbwbwuu +wuubwrgrruwwrurwgwwurbugrgbrbuggbuwwbwrrrbrwr +urwbwrrbbgbbwwuwbwubrbruwgubruuuguguwubguwugurubr +rrwbbrwrbbuwbwrwwwrrguwrbgrwbubwuurugurgbwrru +wwrbgbubrrruubrggbrrgugbwuwgrbgbburbbgwur +gwuwggbbrbgbbgubgbwburbguuggugrrwrbubruuurggwrw +rurruwgrrrurwwwbbuuuwbrbrbrugrgwgrrrwbbgrgwguguubg +bwgwrwggwggrwbwbbrbbbrgrwbbuubrugbwbrbwggbwb +bwwwbugwbgubgrruwrbubggwurwwuuggbrugrrururggrbwbbggbrwgug +uugwuuggrrbgugbwuubwwugwruubbbrrwbwgbbruuggggwuurgrw +bwrururgwugwrwuwbbrgwgugrurwgrwbwwwwrbgwur +ugrrrurbggwwugubwrggwgrggrrbuggrurbbbrrugwurubbbguruwbuwb +uwbgubgrrwrbgrgurubgrurrrguwbbuurbuwbgwbgruwrggwur +rwurbubbwububgbbubbugubrbbuuwwwuuuruwwrwruwwbwbwwgwbrggbg +bwgrguuruwwbwrbubwrbbbbuburwwugwbwurggwguurguguurww +wwruuguwbgurrgwrubbbwurgubguuuwrwgwugwgrrwwwrgurrurrbgrbrwur +grurwwuwwububrrggbwrgrgbuggrwrbruubwbggggrbbwrwbwwrugr +brbuguuwuubuuwurrrburrgbbuwgwbwwwrrgwrwwuwuwbguurbrr +wgrbuurrbubrrgbgbbbbbrrwrurrwgbgwbrrrwrbubruubuubwrbbbwwur +wruuuggbrburwrbbwrwbwrbwrbrurbbgggggguuwgbbgrguggwruuuww +bgubgggbruwwrggrwubbbgbrbbrwrgbruugwruggguwwur +bbgrbgruburguuwwruubrbbbwwrrrgugbgururgbgwggrbwrwur +ubwubwwubbuurwuuruwrgwwwwwbbwgwrggbwrwbbubwgubbuwru +bbuguuwuuwururbgubrruruguwwwugwruwbwgwrwbgwur +wuwrugbugwbubwwwrrugbbrruwgwgruuugbgrurbwwrwg +ubgwwwwgrbbrrgwwwbugrubwwwrurbbgbbwrbbgubwbruurbuurwr +gguggugrbwrwuubgrurbgbgrgugbgrurbuwguburbuwbrwbrwgubgu +uubgrwbgwuurrwwuubwburbruwgrrrgubuwwwwrgwu +wwrbwwwgubgubrguugrwbubwgrbuuurrgrwruwbgubwuuwuwggwububrgwur +brgrgwbgrbbbgwgbugwwubgruruubgguuwrwuwwrwbbbgbururw +rrgwguwuuubrurwwwrrugbwugrubrrwurrbrrrbggrb +ugwgwbbbrggbwugbrrbruuubrggwugruguugugwbggwrgrw +wurbrrgbbwwrwgwwgugwwbbbgbwwbrwbbggrgbggbwru +ubwwwrurbubbwbggbbwrwbrrwgwwubguggwwggbggwur +bgwgwwuurwgbbrugrgrgubrguwwrugwwwgrbuuwbrbwbrwgwwwbwurwg +wrrbubuuguruwrbggbugbgwwruuwgbwubwbruwgbwwwwrguwbwwur +urrrrbugwrwrurgubrwubbrrwbrgwuururbuwrgrggugrw +gggubrggugbbbwbwgrgwwruwwwbuwbuwgggbbbgwubuguuurwbgu +uruuruugbrggruwbuguwbggbrgwbbburuwbwwuwrgbw +bwwuwgrggrgrurwwbbbbgwwuwbwwrwwbggrrguugbgruuuubwuwugu +gwbububrubrgwubrbwrwgwubrgrwrwbrrubggwbgbuuwrwubrwwwrggg +wbggbrrbrggbuwwwbrurbbgrbuuuwrrbuguruwurwgr +brubbuwubbbwgbgrwuggbgggbrbbguuwuuwrgubbrugbbbgugrrwur +gruuubwuggbbggugrbbgbwrwgwwgwgwuwwbruuugbugrrru +wwbwwuwrguubrwugrbrgggbwuwwgbrbwguurbrbwguuwwrbgwwubwwuwbu +grrbgrwwwugbwbguwgrgrrbubgwrwwgrggwuwuwrgggbugrbugg +wuuwgbggburgggrgubbrugbgrbruubruwguuggwwuwbgggwuwwgu +wurubwgrgurrgbgrgbbwbgggwwuwbbgbrruugggruguggbwruwru +gbrugrbuwrgwrrurrrurrwuwgwgbbgwrwgugwbwrbbwrrbrrub +ugbwrugbruwwurwwrwgbuwrgrrgwrugbruggrrbwbuwbburwur +guuuwuwbuurggburbbuugwgwrgguugrguguubbbbuug +rrgubrbbwuggurbrrgrbbbwwwrgrrbgwgubruwguruurwgwgbwgbrwur +wuggruwburuwbubuwuwbwwrrwrbwgwwubuwrugbggwgbwbuuwg +wwrrbwgubbrrwuwbggrwwrbubbuggwrrwwrrgugurguurwrrwbbwgbw +grggruubbgubugwgugbwgbuuwugrwwrrwrggwurwuguuurgrwuwrbwrwwr +wrguwwubrgrgbuuurggwubbwgwubgbgrrburbgwururbbgwrburr +gwbgguuwwgrbbbrwbuwgrrgwubwgurbwrruwrggbugrwwwur +wrbrwrgrurrugwuggbbrrurburubwrrbuugubrrrrbugwrrwgbuwrgbbr +rbuggurgwgwwuuwuuwubbbrguugbubrurwrrwuuwugubwugrugbrrwur +brgwburbwbrbrwgwruwwggbbgrwrbguguugugubgrgwgwwr +wrbbbrwgwbrgggrrwbwgbbwbrggrwrburrbgbgrbbuugwg +uggbwubwrwwbrgrwwruuwwrggbwrbuwurwgurgbuguwuugbwbg +brgwbgbuggbbgrguggbwggrgrwrubururuwubrgwwbbgwrwugwugwr +buruuuuwgugwbgbrwrbururbrurwwbburuurbwuuugbbbwwuwrugugbrg +rrgrrrgwggguuwugrwwguubbbuggrwrbruuuguwgwg +ugbgruuwruwbwbgrgggbwugbwbbwurugwgwuurbuwrg +bwuwugbbubggwwrwubuubwgrrbrrbugrurubrrguwrbr +rguwwugwruwrgbwwgbgugrwubrwrbbwwrbggubugubwgwrbrwuuubu +wgbwggggrgrgrbgurwbuugwuwwrbwbbbugruwgubwwgrrgwur +ugrgwgguuuwbrgrgrugbruwrbbbrguwuurgurgugurrgbubuwgubuwbwu +ggwwwbgwgwguwrrruwuubwgbrubgruuurrrubuurrrgbguurw +grwrwuubrwwurbwgbggwrwuuruwguuurrgbwguwubwbuurgwbgugwuwbwr +bbwuuwrrwgrrbgrgbruurguuubuwrwguwuwbbggwrubbug +rrbbruwbbrbbrbbbwbubbgwurrbubrrbrrubbwugubr +burrubrururbguwwgrubwwbgwugrrwgbbgwgrwbubgurgug +wuwubwwburgugwwbgwurbbwwgrwguguwwbgwggubgbwbbrgrurrbbr +buruwbrugwrwbrgruurbrwbbrggbwgugwbuwgrgbwwwruugrggrg +wrgurwwgwwrbrubuwrbrruurrbbgggwuwgugwwurbwgurgwbbbrwr +buubbgbrrbwgwwwbgwrubwrugruurgggwrbugubrgwrrgbu +bwrbbuguugbgurbruwgbbruuwubwbggbrbrbugggubbbwwwbbguggwwgrg +burggrbrgwrwbwwbrbuwuguwwwwbrbbrbrbbwwur +uwbrggwrbwuruubggbwuurubrrbwubrwwgugwruwgugguu +grbgggbwbbwwuwbrggrurwwgbrruwgbwgbruwwruwubrruwwbbwuuw +wbrrgrrguwbuuugbrrrgggurbrwbwwgwrwbrurwggubbuwuwgwgwbbbbb +brbgubgrwrbbuwwwbwrguwwwuggurrubrugruwrguuwwubgru +rrbbrguwrrugwuubrwgwwrubrubuwbuwbrgwbrwuruuguwuuwrgrgur +rgwrbggrbwuwwwggrggrgrwwgwgrbbgrubuwugbrrwrbgwb +wwwugwuggbgwwrrbuwwrrwuuguggbgbwwrrbggwrbwwguur +ugugbrwrgwbrrrbbrwrrrbuugubrwgwrrgugwbwgbguuwwwruguwgrwg +gwgrbgguuurbwbwbwuuguubgbrgrrguwrbubgwwrug +gubwwbrwrruwbwwrwwwbrgwbugrrbuwubruuwbrwbbwubrw +uggwgbwrguwwubbugbgrwurgubggugwwwwbwuburwgub +uwrrgwrrrwrwbgwruuugbwbgwggwrrrwwgurrrrrgurwwwgruruwgw +urrubgggbbwgbbrbrbwrrwgrwwgrggwbbbrrurgrrurgubwbwu +grurubrburbbwwuuwrubbbbwrwbbwrgwrbggwgguwuuwwur +bwbbwbrgrbwrwbbwugrugurruruububburwuwgugguwrwur +rbrrbgubwbgwuwuuwwwrubgggwwuuugggubbrrbbggwrwb +gbwrugrgubwbrwwurbbgwgrrbuubrrubuwubguuuwgu +bggbwuuubgwrgwuwbbuguwrburrrurbbubrgwrwrwgrg +wgurrrrbbggwbbruwbwbrbguuubwwrbuurbrurrurwur +gwbgbgwbruuruwuurrrrurrwbgrbbwguwgbgrwgrrwuwwwgbbrr +rubburrrwggbwuwrbggrubrgurgwbgwbwurgbgwrbgwg +uubuwbubrggrwwwuurgburbuguuugrbguuwugubwbgwrgrggu +uwurgbguubbuuwrubbgubggurrgrrbbrrrwwugwruwr +uwwgwugguugrugbubbrwwgubwubbwrwguwbwguwggrgugrwguggubrwb +bgrbggwgbbgrggwwrbbubwwugbwgrurrurbuuurbrbburbruur +rubwrbrrwwgwuwbbbubrguggwwbuwrrguwbwrgggwburbwuurwb +rrgbbwwwbwbubwbwrugbugguwbuwrubuwrubbgwbgwgwrbgurrurruu +gbuwwwwgrguwgwbgrugrrwbwuuguubgrbbugbbgrgbrgbb +rwrwbgruwbrbgbrbgwwrbwubbwwuwbrbbbburuwrugggr +buubbrbubwwuggurrwwuguuuwbrbwbrgggrubwbbrgbwurugrwgrrwwgb +rrgbuwbwuuwwwbwuugrurggwbrbwwuruwwwuruwur +grrbrwwbguwbbggguuwwugugrugrgwwwbrgrgbguggwrr +rbgrwugbgggbubugwrburgggrbwbrruuuubrrrguugruwwrbgrbwg +urgrbrrrgwuwwgguwuwuuubwwrugwrgbwrbuwuwbgwbwurwwwrgbrrggb +rgrwwwwwugbgugbugrgbuwrgwrwgburuwrrgrbwbuubwguwwwugbrg +wbbbggwwuuwwgwwuguuuwuwwugrwwwubgugurrrugubwgw +brbuwwwgwgurwgbwrrbrgruguwgbrbwububbrgrbuwrugrwwur +uubuuggbguurwbrwgrburbbbwburubgurguugbbruruur +grrrwbuwuwruwgbwwwgbbgwbbguwbwurrugwwbuwbuuurrurwur +ruruwrwuuwbrgbugwwgwgbrbwwrrrwrbrburrgruwrwwbbbugubwwgrbww +bgwruugguuwuurbubgwgrgruwbuwwwwguwwwrbgrwrurwbggrguw +wuwwwwuuburggurgwrgruuwggbguurwbggrwbuugrwbggurbgrgb +rugwbbuwrgruubgggwuwwrggbgwwbuubrguwugbburrbgrrbwrru +gubgwgwuubwuubrbrbbwwbwrbguruuurgrgrggurbuguwbgr +ubbwgruubgbuwuurrguwrbuwwgubbrgwrruggurbuguwrbrbbwgur +wgggurbbwuubrbwrgwuurrbwgwburrwrbuuwbwurwur +gwgbwwrubwugbrgrwbgwbgruwugbwubbbbbwubbubg +ugubrbguubwgbgwugbwgwrrgruugbbbbruwugwrurugrgrwwrbw +urgurgubwuugbgbgurbbrrgggggwuwgrwbwgbubwuruuwbub +rrrruwwgwgubwbubbggrbruuururugbwwgwwugwgggwguggg +uggbbuubrurwubuuwrurrbwwuuwubrbgwrbrrrrwbrbgwggwuruur +rbbbwbgrurugbbwguurrugubrbgbgggrbuguwrgwwbgrrw +wrgwrugruwbgrwbgbbguwgubwwbugubrgbrgwgburguubbbbuwrwwur +rwbuurbrbgrgrgbgbbbrgbrrgggrbbrgrruuubrguubbrgrwwwwuwrubgr +bubwrwwbrruwrbuuugggrrrruuwrbwwbggwrwbuuguwwbgurgbu +uwwrwwgbbwrugruuuuruuwuwgrwbwrbgubwwrbbwgbgbgwg +buuwrguuuurguwbrbrrwguubrrubgggwwrbbwgbgrr +uuwwgwuwgbgwruwuuubrrbwuwrrurrwbgwbuwbwurwur +ubgurwwbwgwruurwwubrwuwrbugggruurwugurruwguwgbrgrugr +uguuguwubgrgbrbgbwgwuwwwubbwrgrbuguuugrwur +rrwbrrrbuwwgwgrggwrwbrrubwrbrrbbwubrrwwur +ubugrwwbbrgugburbgrrwwwuugbwrugbgurgrwrgubur +bgwbgguwrgwruwgwwrwrugurrugbrggubwbbgwwwwrbwwrugggbrwggrrw +wurrguggggwgbuwwguwbbbbgwburwwbrrwrrgwur +gbrwwgrguuwwrrgugubwbgwuuugwgrwbbwrwbgurugruurwuuubrwur +rrrwugwrrwwruwbggwrruuwgrbuwbbgbbggruwwbgruwggburwg +brbwwggbgwwbgruwubbbbggwwubrgubbuwububuwurwbbwwbwu +gbbggrbwwuuwuugrwuugwbrurrruububggwrwggrgurwwur +rgbwwrruugbgruruwuburgrwrwbbuwgrggguugugurwggwggrgugggrg +brbbwrruuubuwurrrwburbrbwgwurrbrgbrwrbgguruuwuuurbgbbg +gwbrwbguugbbwrgrgrbgbruwgwruwbrwugrrgbwwgb +wuurgwugrugguwwwbwwubwuubgwubuuubrwuuububrugwbgggrruggrrr +rggbuwwggruugruwugggrgrbwbwrggrgugwubrrgrwgwrwuru +uguguwwwgugrgbrwgbubwwuurbgguwubrrugrruruwrgrwwubgwg +gbbbrwurrubrugwrgwrbugwggugrwuubuwbgrurbuwbgbbbgw +wrgwuwbwrbbrgrbwbrbuggbuwbrgurwggwbbgrwwuwbbgwrrrgrubbb +bbubbrgwrgbbbrgguurggrurwuwubgwuwubburbgwrgw +urggrwbgbggrwbwburbbubggbrgbgwbrururrgwgbbuwbu +urggbbbrbubbwubbbbrbgubrwrrwbuwbbbbrguwrubbuwuwgg +ugugbubbugggwwbbruggwwrugbrurguugbrwbgwuuwbbwuguggb +wrbwrrbgrurbuwwrwwwrrrbrbuuwbuwbggwgggwuuwwuwbrwwrwbrrrrrwur +ggubgbruuuwbgrubwbbubgruwwwuurbrwbgwrrwbrbrgu +bwbbrgwgburwwbgrrwgbururwrwggguwgbwwbgwuuggwuggrbg +ugwwgugbuwruuggugggwrbuguuugggwbrwrbubguuuubwbwgwg +buugrgrruurbbrbgguubgbgbbuuuwuwgwbrrgwur +gwbbguuwwbburguugubrwgwwwubbubrgwruurwwruruwu +guuwbugrurwbbugrbrwuwbgwbrgruruwugwwbrrgrwgrwrugggbwwur +grurbgrrubwwwbwrrurwbwbgurwuwgwruwwwurwrwwrrugw +bwgbuwurrugwwrurbrurwgwubrrrrbuwwbruuggwbrubbrgur +ugwuwgrubrrgbbrwwgwggbwubgrbrbwwbgwbgrbuwuwwrrwg +ubbuwubugwwrgwrrwwubguurgbgwrbubwwbrwrwbbburuuruuurbuubu +wrbrgwubgrruuwbgguwbubwbbggrbgwbwrgwwrrgrgrbgbugubwg +wrugubgwbruwgrgrbgrugggwwwrwrwuwbururgrwrggwwrubuwbbbggbu +wugubugbbrrwwwrguburwrguwrugubwgugrbbguwrgwwwbgggubrrwgbgwur +rwrbgwguwurbrrbbbrrwrugrbggggwruubwruwbgbwrrrwbg +brrgrrugggggwgurgububrgbuuwgubugbgbgbuggwbburbgugugbw +gbbugurwwrbrbwbwwgbbrrruuwbubwwwgrbubuwgrw +wgubburbrubrwwugugwrburrbgurbgbruuurwgubgwb +ubwubwbgwrgwwuwbugbrwgbgrwgrwuwbrbububguguwrgwrwwwur +uwgwrwguwrbrgguwbgubrbwrurrwubbwbggbwbbbwburrruwbruugu +bwbwwbrwwwuwrrbugrgrrbwwgrugurwuubwbwgguwgbwwgwuwrbrb +wurrwgubuuwrrbbbuggwbwugrbgwwbrurwwuwwuruur +wgggrgrurbbbrbuurubgububwuwrgbbuuugbwwwbgurbruwbugubr +rurrubrwrwubrgurbbbgwrrbubwggbwwbbwgguugwrwwubuw +wwuggububbrrbbwrbwrwburwbrgwwgwugguwgrbwuwbuurrwwugbwr +ggrwbrwrbwwbwwwbgbgbbgwurrbwwbgubwbgrgubugr +rbbbbgrggurwuguurugugrruugwrwgrwgrbwbbwgrbrurggr +wrubwggwbuwrbggwbuwggwbwgwrruguwrbubrggbrwur +gwgbwrwugbwuwubwwwgrbrrbwubbwbwrubbbrwuuuwuw +bgwgubbuuugurwrbubrurburggwbrguwbggbgbbbbg +gwurgbbburbrrubgwwruwrwugbwwwwruuggwgguwuuuwuuurubgru +bgrwbuugwwrgggrggwrgrbbggrgbwrrwubwububurrrbgwggg +bbwuwrurwgbrrurguggrgwgggwuurbrrrurguwurrwgwruwbbgb +guwugbwrwwbgrrrugwuwurubwbwurgbwubwubbrwgwugb +uwrurbgwubuwruuggburburggwguwwbwgggwgbrgrwwrrrgww +ggwwbgrbuwrruurugggwrbwwgrgrwburgrwwwwrwbrbrrwrgurggrgwur +wurbwgrugbwugrbugbrrwugruwrgubuuwuwgrgbwgggb +wwuubuuuwrguuwwugbuwuububwubbguubgbubgrrbugbrgrwrbwrb +wwbrbwgbggbuubrwwgrguubbrbbwbbuwurbggubrrrrw +ggrugurgbwggwwwrwwbbgbuubuuubbwrurbubwbgbrwur +wgbrwgurwwgbbwwurugwgwugrggwurgrgbbbbrrbrbrgwuur +urwrbrgrwgwuurgubugbburugbgbguwbubgbwugbuubu +bwgwwuugrrrgrbwbggwuuwwurugbwbwgubgbwrubwgrw +brurrbbgubrrrurwwwwbubbgwgwgrugubbggwbggwubuuug +uwbwgrubgbbgrrrrubrgrgrbrbgurrbrgwrrbwgrwrgrgwgrrubbuuwu +wgbbrwurubuuwgruwgubrwwwubgbggrburruggbbrrwwruwwwwur +uwurruwrugbgbwrrbgwrwuwwuubruwrubrwwbwrwgggwugbrrrrwur +bbuggwgbbruurubuuwgbbwbrbrrbggggrrbuubrububbubugu +brbguwururwguwbrgrrwbbbwbgrgbgwgwgwgrrggrwrbbrburrur +gwbbrrwwrggwrrgwwrwwwurrggbuugubbrwbbggwur +rgguburbuggbbbrgurrwrwrggbrgrbuwbrgwwbwrurbugbbbu +buwuwwbuwugrrgrwuugbrgwurwwgguwgbggrrurbwgrurrwur +uugubgwggruuuggwgrbuwbrbuuwbgugwbuugwbgbgwuuuwgruwu +rwwubbrgwbuwbbguugwgbwburrwubruubbuwwwwwgbbbbruwuuurwur +rrrrwwguwgrurbubgbrgbrurwwgubwuuwuwbbwruwwur +bbubuubgbwgbruwugggurrwguggbwbbbbbgrbwggubwgwubgbwrwur +bubgwubbwrrbbwgurwrubrrubgurwwgrubbbugrgub +rbwgrbubbubwwrbgbgbwgrbubguurwwgguwgubbrrbubwr +guugbrgwbubububrbrwurrgwurbwrggbgbrbwwrbbuggugwgubrwrwbbbb +grrbguguwwwuwurruubggguububgwurbubrrurwrwguggbrwrwgugb +rgbgbugubuwrbbrwwuwubbububgwbugwurruwrbrgwg +bwbwgubgwbwwurrubgbrgurugugwwrwrrbwwbbwggrb +uuwwrgrurgbwgruuuubbugrrwbwgrbggwbubwbwbwgwuubugbrwur +bbwrbrwrrrrwwbbguwrbruwgbbrwurwrwuugbwgugurwwugrrurgugubu +urgwrrgrgggrguggbgrbggwuuburbwrwgwgrgbwrgg +ruuuwrwubrwwuguurrwgbrbbgggrrrgrbuwuuwwrrguu +grwwrrrrggbuwurwbugugugrrwwuwwgggrbrwwrbwuwbwgw +rrwbbruwuwwwuggwrwbrgwwgggrbrrgwrbgbwbbrwrbubgrrggwrwgrg +uwwwbwwuurrguuwwubwrbbuubbwwgrbwwbbwwwurwbuuwrwrwggwur +grrgwbgubwrbubrwubguburrggbbugwwwwruuwwuggbg +grbwwuwubbgggwbbuggrgwburwwrruruugrgwwwgwwwrgrbuwbrgb +ggrggrrgbgggrrgrbrurwgbgrrwbgruwwbbggbgwwbubwrggwgr +wgrubwrwbbrgbwuurwbwwuubwgbuubbwrugugurbgwrbwrbuwgguurww +rbwbwbgwuubrrrgrrubbbbburbbwuwwubbbguubgwwwur +buuuwrwwbuuguurwwbuwwgrgrgrrrugwrggbggwbgubw +wwuwwwwbrrwbwgwuuwwwgwguwgwubuwwgwuggrbwbrr +gbbgbwbbrbrgwrwburbrbwrburrgwwuguruubrgubgrgrwugb +urbgbwwrrwguurugruurbuwbruwrguuburguwwuuruwbggbwuwggb +bwrwwuurugugggwuuwrbrgbuugbuwbuubrgrrrrbwgbgwgbu +ubwrugrgrwruwggbwruuggbubwguguubwrrbggbgwggrww +uwbubuuwbgbuwbguwuwwgbggugwwubrbubgbuwrrbuwbuwrwbubgbrgru +bbruurgrwuwbrgruruwwuwbwuugwurbbrwgugrrrurbubgrgw +wbgwwrrwgwrugwurgbggbgwwgbwrbrbwwrrwugwrwbuuugguww diff --git a/2024/go/go.mod b/2024/go/go.mod index 1ff1c1b..d7d05a2 100644 --- a/2024/go/go.mod +++ b/2024/go/go.mod @@ -7,6 +7,6 @@ require golang.org/x/exp v0.0.0-20221208152030-732eee02a75a require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/stretchr/testify v1.10.0 // direct + github.com/stretchr/testify v1.10.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) From 952def48a057233677b130a19bd18ef39975aceb Mon Sep 17 00:00:00 2001 From: Alan R Evans Date: Mon, 13 Jan 2025 23:51:28 +0000 Subject: [PATCH 10/11] Revert "fix missing" This reverts commit 08b38c2bd37ec7e22e27b3f5d529ea35d8f7a0af. --- 2024/gareth/day07/day07.go | 90 - 2024/gareth/day07/day07_test.go | 33 - 2024/gareth/day07/input.txt | 850 ---- 2024/gareth/day08/day08.go | 80 - 2024/gareth/day08/day08_test.go | 39 - 2024/gareth/day08/input.txt | 50 - 2024/gareth/day09/day09.go | 104 - 2024/gareth/day09/day09_test.go | 22 - 2024/gareth/day09/input.txt | 1 - 2024/gareth/day10/day10.go | 141 - 2024/gareth/day10/day10_test.go | 31 - 2024/gareth/day10/input.txt | 45 - 2024/gareth/day11/day11.go | 89 - 2024/gareth/day11/day11_test.go | 12 - 2024/gareth/day11/input.txt | 1 - 2024/gareth/day13/day13.go | 76 - 2024/gareth/day13/day13_test.go | 45 - 2024/gareth/day13/input.txt | 1279 ------ 2024/gareth/day14/day14.go | 172 - 2024/gareth/day14/day14_test.go | 23 - 2024/gareth/day14/input.txt | 500 --- 2024/gareth/day18/day18.go | 156 - 2024/gareth/day18/day18_test.go | 65 - 2024/gareth/day18/input.txt | 3450 --------------- 2024/gareth/day19/day19.go | 90 - 2024/gareth/day19/day19_test.go | 35 - 2024/gareth/day19/input.txt | 402 -- 2024/gareth/main.go | 10 +- 2024/go/day10/day10.go | 103 - 2024/go/day10/day10_test.go | 31 - 2024/go/day10/input.txt | 56 - 2024/go/day11/day11.go | 76 - 2024/go/day11/day11_test.go | 17 - 2024/go/day11/input.txt | 1 - 2024/go/day12/day12.go | 146 - 2024/go/day12/day12_test.go | 29 - 2024/go/day12/input.txt | 140 - 2024/go/day13/day13.go | 58 - 2024/go/day13/day13_test.go | 45 - 2024/go/day13/input.txt | 1279 ------ 2024/go/day14/day14.go | 149 - 2024/go/day14/day14_test.go | 527 --- 2024/go/day14/input.txt | 500 --- 2024/go/day15/day15.go | 119 - 2024/go/day15/day15_test.go | 57 - 2024/go/day15/input.txt | 71 - 2024/go/day16/day16.go | 225 - 2024/go/day16/day16_test.go | 47 - 2024/go/day16/input.txt | 141 - 2024/go/day17/day17.go | 91 - 2024/go/day17/day17_test.go | 25 - 2024/go/day17/input.txt | 5 - 2024/go/day18/day18.go | 126 - 2024/go/day18/day18_test.go | 6915 ------------------------------- 2024/go/day18/input.txt | 3450 --------------- 2024/go/day19/day19.go | 87 - 2024/go/day19/day19_test.go | 42 - 2024/go/day19/input.txt | 402 -- 2024/go/go.mod | 2 +- 59 files changed, 5 insertions(+), 22848 deletions(-) delete mode 100644 2024/gareth/day07/day07.go delete mode 100644 2024/gareth/day07/day07_test.go delete mode 100644 2024/gareth/day07/input.txt delete mode 100644 2024/gareth/day08/day08.go delete mode 100644 2024/gareth/day08/day08_test.go delete mode 100644 2024/gareth/day08/input.txt delete mode 100644 2024/gareth/day09/day09.go delete mode 100644 2024/gareth/day09/day09_test.go delete mode 100644 2024/gareth/day09/input.txt delete mode 100644 2024/gareth/day10/day10.go delete mode 100644 2024/gareth/day10/day10_test.go delete mode 100644 2024/gareth/day10/input.txt delete mode 100644 2024/gareth/day11/day11.go delete mode 100644 2024/gareth/day11/day11_test.go delete mode 100644 2024/gareth/day11/input.txt delete mode 100644 2024/gareth/day13/day13.go delete mode 100644 2024/gareth/day13/day13_test.go delete mode 100644 2024/gareth/day13/input.txt delete mode 100644 2024/gareth/day14/day14.go delete mode 100644 2024/gareth/day14/day14_test.go delete mode 100644 2024/gareth/day14/input.txt delete mode 100644 2024/gareth/day18/day18.go delete mode 100644 2024/gareth/day18/day18_test.go delete mode 100644 2024/gareth/day18/input.txt delete mode 100644 2024/gareth/day19/day19.go delete mode 100644 2024/gareth/day19/day19_test.go delete mode 100644 2024/gareth/day19/input.txt delete mode 100644 2024/go/day10/day10.go delete mode 100644 2024/go/day10/day10_test.go delete mode 100644 2024/go/day10/input.txt delete mode 100644 2024/go/day11/day11.go delete mode 100644 2024/go/day11/day11_test.go delete mode 100644 2024/go/day11/input.txt delete mode 100644 2024/go/day12/day12.go delete mode 100644 2024/go/day12/day12_test.go delete mode 100644 2024/go/day12/input.txt delete mode 100644 2024/go/day13/day13.go delete mode 100644 2024/go/day13/day13_test.go delete mode 100644 2024/go/day13/input.txt delete mode 100644 2024/go/day14/day14.go delete mode 100644 2024/go/day14/day14_test.go delete mode 100644 2024/go/day14/input.txt delete mode 100644 2024/go/day15/day15.go delete mode 100644 2024/go/day15/day15_test.go delete mode 100644 2024/go/day15/input.txt delete mode 100644 2024/go/day16/day16.go delete mode 100644 2024/go/day16/day16_test.go delete mode 100644 2024/go/day16/input.txt delete mode 100644 2024/go/day17/day17.go delete mode 100644 2024/go/day17/day17_test.go delete mode 100644 2024/go/day17/input.txt delete mode 100644 2024/go/day18/day18.go delete mode 100644 2024/go/day18/day18_test.go delete mode 100644 2024/go/day18/input.txt delete mode 100644 2024/go/day19/day19.go delete mode 100644 2024/go/day19/day19_test.go delete mode 100644 2024/go/day19/input.txt diff --git a/2024/gareth/day07/day07.go b/2024/gareth/day07/day07.go deleted file mode 100644 index 694c09a..0000000 --- a/2024/gareth/day07/day07.go +++ /dev/null @@ -1,90 +0,0 @@ -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 -} diff --git a/2024/gareth/day07/day07_test.go b/2024/gareth/day07/day07_test.go deleted file mode 100644 index 73ff38b..0000000 --- a/2024/gareth/day07/day07_test.go +++ /dev/null @@ -1,33 +0,0 @@ -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) -} diff --git a/2024/gareth/day07/input.txt b/2024/gareth/day07/input.txt deleted file mode 100644 index 23117ba..0000000 --- a/2024/gareth/day07/input.txt +++ /dev/null @@ -1,850 +0,0 @@ -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 \ No newline at end of file diff --git a/2024/gareth/day08/day08.go b/2024/gareth/day08/day08.go deleted file mode 100644 index ce5a1cd..0000000 --- a/2024/gareth/day08/day08.go +++ /dev/null @@ -1,80 +0,0 @@ -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) -} diff --git a/2024/gareth/day08/day08_test.go b/2024/gareth/day08/day08_test.go deleted file mode 100644 index f744f8f..0000000 --- a/2024/gareth/day08/day08_test.go +++ /dev/null @@ -1,39 +0,0 @@ -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) -} diff --git a/2024/gareth/day08/input.txt b/2024/gareth/day08/input.txt deleted file mode 100644 index d4fb9a8..0000000 --- a/2024/gareth/day08/input.txt +++ /dev/null @@ -1,50 +0,0 @@ -........................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 \ No newline at end of file diff --git a/2024/gareth/day09/day09.go b/2024/gareth/day09/day09.go deleted file mode 100644 index c2e12df..0000000 --- a/2024/gareth/day09/day09.go +++ /dev/null @@ -1,104 +0,0 @@ -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 -} diff --git a/2024/gareth/day09/day09_test.go b/2024/gareth/day09/day09_test.go deleted file mode 100644 index b9de485..0000000 --- a/2024/gareth/day09/day09_test.go +++ /dev/null @@ -1,22 +0,0 @@ -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) -} diff --git a/2024/gareth/day09/input.txt b/2024/gareth/day09/input.txt deleted file mode 100644 index b5ab7ba..0000000 --- a/2024/gareth/day09/input.txt +++ /dev/null @@ -1 +0,0 @@ -2529414994631170149953136311659836486767499011295895209013255645858553884990631239857180407026188318789536626883964672136355273919115442427552799046486996326836721848461142184774852462365260634524991545439574418977718911375256991472764810705999392318631748622830142133467261617273937356141415707425753674415292503537471415868114655290826112291685289736371370794189785878486831872016564126976522727423616247825525582235815348304183161672962553208063528051403895878511223754541942753550948843423236569890488336109548241119404580493982516632107654275399605468301782552884515594818174546445227869897726454296218318628664159728961325374033515263746610627048519411977781695595794535515064703636952079774826159321748816186679411826696063348134165468188023619726476382843216866261777484681339754899174368188722709816794137754761792646555351973887495359649411363814901253642493312614366531222370302156743751318251941645822081602872738751283687336339884876543218141359765134733663492093416431535012445097595649165971493028986240575597653688523974288772307034632638625633187731811281922665421327836218203214749354406959408680793080389496978212945419775978249165443961189137588895163095106088317084441298272395387540452384597822868485507235641120715625515459853525688110756198615289287578182442456417904668154987527729122473963550517916127294526771821425495935972610686448528932482912141732519954383661982334932650248353682615255120545729895022211147836848115341454584957926805633627964276847999330476526354279332512826717133230773157324347402953953927527665567153253315399378748818468678693837961867951860312379276017805343355247963052974232165110245254232287194847722340532410286385821556192322832743937519209173458985571983132531839983977272421739138970811391464140682379139824407889378619871180297441298829669070809895586794531431857864567433873076723053603435662419381934421712102617472739137385638576101831848842655652454165101290255871526232351950556852421166861327615244371495542266229753205035804540174131698192768395814389388644268086405515537752706254391829761337527891677215356747115182964429255822243039588914805260924016257466777195552352949478722191539771342551122847825532233481813754983169379785489050221270707365696021932483631432414437351963685012191132618360937331778186804479417765518124878796421456944742103810878239437117576013394324571182139571294073653266958694952196425926136893533164132575492817488096489046378492654888421055756213119857493249964822944119957868459016171356769871756326614598659835681980344267978612918689166116244890339182206315282146134018964798226159212449309744905320227743183143823029572839434660354034213549817535283713791522376277984037586413688061535089165885822732145890396647843158478710908866936938249064552772794146522586525741963899855122516857695592581647685180705089559981833535136560929145755880975051188152909463771689906499581149643227497130528722407033493481913346162338161479763710736884142797715949788465814349438278276580443850194834256818985090856559827988358562352513349995775225726210788843511763845149583787943127203914501053994685329347167183832489402915704644923353246710121286566284592170886447519167319529279269987190217074136145686633506883865816354097504356778652208815894272748631452119193048574123409114138145899637632260879694921946816524934021101560398222255429352486691681551047543735741549497410302274971744428279371337924012804528976512947630763820698984176515394115387633878375905835504237195317411954949167209227352725803951402765353945194611408966745723441976996218446199527123935043173695744261353026652837718730465094774015112912204943556343544443281354456239347083976280589560844610218264355879457283812993459560733867541611553150662275879650464596329710741282407824297149262230995875542027136495131087189327597974108634582334863989876019159315756949473828329795289481447823671037856645639327923091353712977682847527747453192825951029198856408367633596597492822338202150779572581027413328459951408278317191453930802581727739778818584413762281675934513970122072971459927778838048533780518220295897149947836136418279345115765461984365627774424287416673159950719867353137466421928859527059578264892347829281782530312247822394516573966472975576956366988127608160989564458910184313229420889926896085859813973174764072952774397898954466591163388550598972604976663611761341337996196531364142244786437084508236507637471411333734425822787974289912567133635377856417676855417510459720787516351248865028922683834152246383211823927644303075529444473819826470587213904655264647936061755076265634169417988091507859331696695769284314334936986135269574142089267669916879509927751857594745155933587016723848953951677257844971196014883326232861968441712070642663307777867467921814283324529951996933555279335439351793773832376425489790347097348422593969642852779022169223143874617495449982708614991877319989495996341617318379612350708842715884444940298963514595995861202572539578968229889314943042379386975825399714472598998896275717317789252230862580831911698693607072779348639733637062376388618751532446287461907975694698138498743674524764675433752075968423109396213318302547126063612015531374816351905283436220886375995812865645649141134191501727367893497583962867563365886828824519512052627638939237741386617227974759779067369889518684846439526033282876841617462042442269987069773717961312365584922658887661807898123591715763889589721296117827774775908347857384569976642759537833152357239422302577182823786591653840885394638914438832962054492810589492861554891063532026219355884515583221127034332875159922409584108748275365712893384120529451631561844113821693951354569460739871304131148640197459796332329932481346758171451932293326231949729390343088517175979578399524493432135176233172553180593570434837191336643916833176559150318999731314923242823710603792571853876371181271567758677297726678746261485567172587397114357927481587588546685557202136685993376096227650548253591779513552553924641735665178743045792684921252441476943956138343342153965395174258165333143368244033705373906479283944601437469850534960435315251028392311693555987024759239405319995026991252746572267189531323531240726621262588875681413577157821855759361879662876199816456269408159192440157511974546254551552112837961332772366597688970625124776783129518443867948213402053698231624310479198241337516740542547528657576074569664283634947780873287845510856376975280329234895920361046864061638397742281498357239959407484853642241734938160807663532164878623998830956790996098256839394229567714123932563931773235189019543369113372644947855499733915242264161245168769962351632553241194171382308165896772152271462743716484197248784950479730116542401564881257731654274033215711596287275930853493403887128663418582562837826832168965813950579887467061403834136842595975531188795065866894841959715210245747786292922145987543385430557218605063544754162850197295523292787872151070389787421074127480979667155282908461632832688958559343982661121567427116199232372744447250876255842217334096361787578921133673471226504829932937435162951056248417288221392613501749757484922179762626734566329696681235101999163642723350107832851532326160957591154631213496682013446738936344824599467110178333272612434182583726759394461671638880234884483742665765867162858753905079626655457570366587407816437486477441464926871135787479692260276680512056289567185812166261926597168235395791874272491337975719533018634929555681852889654725246766427836868339678299888070467361418118189185887849937415133033914434276167236373773242317889396972266762417210188295313421108175673291946914346531348630218711871325557857622725614288216914324142176149347966536219563474327432727315874397694491365159904382779931668771605155113377709491935019345329841640515393223388938398282814804018387757388269801688686119747960177369204228904719749989835059126010153088386468907469927142349124434852117714543516719911402832634829925120206332742825132621443526525038458970937574866527656658817482173683851272254888471587388799605651435266467029242546257288474665612035773117775755683493605435355451292552972838536749176269563218506210641949288225781671776376732626121854927620421599755763586241659734169460198471917986486743522513185299196496888657338493297625141871835456782744552777179870472819335930524451412227158567606324777065304544224274548895676217717154302827468454448617961547129915827072347777646166273473351079158780484188286332909954245091842872889126836863984182843435306389397411631977474322671629434756137663563618752317648357694644226485694945599174259688668187274661887191493082457995761881593446127225317165293022501952319497336932322767788699429262191752563263922892838047925172188196504853449214629551296665581145158670239512849396537147485663544045742782496673348490857554903925836698569925609944374774653511741831657175125137496038822182603950587691483262191235208463325762778839662856282217234530369627147973868822827010148030165632441653194425421050232513106040447451846676359089671531796362678717767988124162979694506496784054812360567782399784865135388690294642683171216974766986396576975490105318559373424698787437688557877158218371278457789860311029563277546383544892577698264626845017579266981747732354379074878361114767608950934590211375765721348048884340909970805539267593105416844391682494919095598134249119368133359819757379212389438096743567758051275829118265143278801797638476563062925356262417553725967577142813708467847887655547416511553757847121804935843837784184545722793051823734246648646452287876584949575494315249845695325028189443292761891979237563826779898665181091654818647159185643608485305387963626224565928489378619444981923468579667968346377691534172934755957294709524397313443796384252591052707013952490768483528934175481704189152762162211298817663343485942147260512852528849838755724259418851669671598937513426823917485262305387796586297250551618388512339573624195264377407617827265294187259151294042519881542927279134235990229478796182765494193011192529599466449484487736567431126378487357537211408016478927122161197418944499364646411439156188812657659057274751477567475479836151955744708965869356819072204223903818202714564693184141171455129739674233312746984353853673975679277422414589723884364055569015124470343548823363192038946382122535898741553564885030261230488670409813686864388051132153324436708452844556148980927437241868332788438436634578876696742551928297793057289492146014478268681653366058565496734095904157615382536916912880508895357980811744463551872854337213632877945616938728611968899069416832219319264918987045779598529743253653729623391460482983259834966541864633785212981315586379697984194168364339675053787966329947131876867391118287634731671236868794137657415848338165177860813946763329597892791846106916246165157787333462409543784419585539868247783516923034381310458279709742708571821071597884146240884743628171457667686192573119798348994886418635727348836793913966419121819538427523585050341284172143209454318938299629713522699382881471164623839496246929753762186223896414982817796548399273461731797862527790617851192259229068723173591179947263952488681098333066867061403077834543413647619652285790488368491330257022614855462914813418496334698360298890977253499690182691378151647998867282767275147356601673269337114933275033361763477777327319657889664111264293916799147973231610405711368633275341825337629973362314465218134291874541119265441641325965383489444932957497211982434423247696121722833394918883766470873350703970871023839028395037172370843315285469767290177132558647268362894144737545542038543444326848886920491119779813203419559399587340303127918720857376772641801270168616802661393363597267548380882130511796448246378086751479931092975214946844455177376047631427628232643039145923562453584976937176864628584340132716635333833468614764566940837086345727807372153256379129817956745919253421978943303191964484576435667240425071512984142417757658878650324473919977471882477144698189544341706848156784755021389523767151202493163382509560121311875219924649812452873976707628227820632820739257169016537896842144442495561161711243947054753082906874578195333626412299754020937251566533744223342995987474144817277213873632741755679846976852884229374282621294461537863047549490727134294218613747912747684785411267652467495199481996163375674940915462324184284088111423992371895230408480857930131266845763228223598440796634564969707066156452295089288777649277556013195871949271376495896088399085111576956820871784768372833888472937351118942457391847395757728767643727465020313980359554748836956333726494842729481765977351583238212696488790762185727885446331169472632080216273482057861829471778875450927772519954192552374349244223288897401148744834795092241162595178262946332893829021521296928856767232999222429392929724231276538533162498199713755661745720188685621372609635783747372243441353383311216763858812142622337755866549154717988836991149157056679744351490452357525326895036498352158193214564873889188822172336593194139584162523761462788035946956594849555358833582551834963214195228681216846935144898711024858025684423272687674547243741279359721575796724717376598366601669371589483213985131383414752627927723557070944997926173415173724037987866907042694413604737826114832744647489791567315380453572501087819757772371789536942057356056834340224775282111235470393566669227791979483123856082711161352084954631189797986652655943733985175613773658602334372343281879567914308267183638153184823726724566396110569430372769759269198217761169106040842690481473942285616714699962893391327592143644558856814994338618558544845832538562737478613796728913775260514678619912268081237650253842478140275339735790247579151915741082626354947213262785324994159099206320675914582810964666394819689639747759292899828544111124815030245345989832397773681057556125975939588428612540904269995936848226157958545165614127438731257823974789789811341898208715245826579965389778646581252045654084858253831882371812399318389060736043917199945624964579799041907783207825824399623327318161397052456683102527646058649444143050285876779192592564613330951083466466502517598764917022923845789672152239786235482764779660924680725767294573227498398795537592791385536149221689312957148544603085491049136359461311252913228854582995985553121163751021405540196625412868938130782435662350157030738948966344462633246063731083604516377127533931273840604693967751118249227536484769582931637926753549825338488847403822703910596122894485916477281041683480916174998749199321157023909665156323107760293576617787344728487416299641705594226185974385776878853444481736797141554985434667491845948847953989684619984662615950661342432494176354605213197243564389207529919259276511378044254880809886939188541479568484884436932410235652754259366920219999509354482025651582522873161276536036926662659835546646737470146247178441633174105497918161793946529556639276345920313138156847186466769956195522594258387664807758424387523222864982562133457388503184838382627283787760769617306330925889844668863338639486313032367972343946232599962147372284593149426277978221664943956749342273165518778795246230308036222172627794688092688374417660859628207682432230585335997646518451283753855632283563461248551782801478427171182044233235333689246344142349195527326218614546934096196395919249796094979048404911418569849992205723919588352868267022792715638089365555469933109745505983854555716754389359943836287587882385792117865937135819373743166117166634263438428256662492501874434630605897748134639549891548337076632976438735725457809789651163712698574923324917873193176394253438473564844581103495857314944695524838936319331387739355914148379720413456597618841520611034261711463157755783229893234042737345213852299940451380776112897760259714232379641391851693292843105245934282976949556542441355827670265534643431928527265926343029236454344667976639992684351387822888527390635595276038301338842760967882862050784988835946425019497961696974179371653976645268358674107934849749506388444356928590662862962050795631898627636338248381123892379795127315579693901181929965611971192592687949777296569359557275288711591621995840581068823650967232971011659247646069542710526291704853263490729512519956325623226321378177893166585121321844383090608885395624666032711317364698202572312567906283314163458748239810969511193451358948754518893542546920874788249278615074638584873548987858714494329655139886301026184321619953857896988815757599456453288089384482348062264715136844338148275555332016145254409076549132309660707222523960779157687563959995652343137132357989488445389210161565559326941817131277456063109683808335235724285164251890294027516524798351723588853355353337971087914066811666802940771578915136967538512688114939848293447517254942203619344534653241641455922596502420724020646461452575937427301251575826383828208412638471853768861468933955412839852493704967123787276736464624867167589648486712784155602554687837309060812180409563389019256718323094324035663674751022144535804524703362643625738220613356196193181182676491217180161232783738874760412587743291935496788956644846291471646968263250985566956040196438494715221043223627487440104551507183612184648040516627433067117696278659536799656067988833855035232022299588322565596270969486416635211995476318621946902994605967253960603347503394665843208333927524282996905694719826813772238273901570383296399220481911621780582786776577412022235016458129677157872539206116436944159412168664414826399628808910403233937791491571647325359066778280479961443674664081892572998374821221625140159133847469139499164637247539935712522260797025385033319534455526189365428960343483535542217665664726812024901773776917146114487248538687624319891318957441316967777576473049372764251177564480132356638412215697295025474413357622434690359746759335827523317492439392733713486952142988665231215292633669259725952646192054369364385068652199241664604763346882699186751576467924189378159018354145172419751388786241999187995825214531719054494111317922957862687780948371339841473610663867992514545614484648353581399073723231208154211012754251288542144223701493275358165119283458504117789158274734615196369367194387631995881697342191189572599029142212195690231476735929641029888887177840149796788522677992162737116597478484646056525174271255454122623685275569419714652921746041168099595295681399824887713226447050238817675317501956458571484291876187918049171175574175502991341121445870531814272148263064565282627514101123843723926654728619217784377581691964745248742935414089789490199119901853209347556262769030686033849925415671401323286071689986625384437097242386402070752539733644425362302761512360586910688334224486608461723197915563788036646327757479361026187821836868569836296615936497363657906673652749883673425570236496307020577955277693605582949958448529747175845572891755706137581334391327675010162978597060117322524120484736867193209235686848993575189277991753559513785257361183538376296615746462283343218369316121978319455552454193795487287969913691192354711363702111845346793736812589899096354127506081808036655441412958509547693761145119798696819510255490727798714511824497435990268786605521723282914729916771733149511360747625614267243964173121895462317598271534507061376766169942297795745526178562494180322753378246586130222089701041133920185272225395134511116953644349679488869173479735531687619476132528769768498069807465749939773067771825171055452073763268712329272937896090472378592133239775938085409573688062851627994874304318317862611643166961232498534730265757407912729619903682765224124977839280352358547098287921317341666922129894464337354928568038122378355225632276256715583670471355993855172746622825944376966233973757356911825260162871812592632559891117486347422347992529941697702017488464635678917868589612168269669537653857591035652857132315393832456797892133684196261957473754507416947165754330317062712830511914274558747584295780647492605119565668911332402960887396222241993596509063834636402284154381646485385868579153248445294622277948748137205831632555745583303493332 \ No newline at end of file diff --git a/2024/gareth/day10/day10.go b/2024/gareth/day10/day10.go deleted file mode 100644 index ef1dda7..0000000 --- a/2024/gareth/day10/day10.go +++ /dev/null @@ -1,141 +0,0 @@ -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 -} diff --git a/2024/gareth/day10/day10_test.go b/2024/gareth/day10/day10_test.go deleted file mode 100644 index 547889b..0000000 --- a/2024/gareth/day10/day10_test.go +++ /dev/null @@ -1,31 +0,0 @@ -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) -} diff --git a/2024/gareth/day10/input.txt b/2024/gareth/day10/input.txt deleted file mode 100644 index a6f2793..0000000 --- a/2024/gareth/day10/input.txt +++ /dev/null @@ -1,45 +0,0 @@ -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 \ No newline at end of file diff --git a/2024/gareth/day11/day11.go b/2024/gareth/day11/day11.go deleted file mode 100644 index 4876cac..0000000 --- a/2024/gareth/day11/day11.go +++ /dev/null @@ -1,89 +0,0 @@ -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 -} diff --git a/2024/gareth/day11/day11_test.go b/2024/gareth/day11/day11_test.go deleted file mode 100644 index 56c3825..0000000 --- a/2024/gareth/day11/day11_test.go +++ /dev/null @@ -1,12 +0,0 @@ -package day11 - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestPart1(t *testing.T) { - r := Part1(`125 17`) - assert.Equal(t, 55312, r) -} diff --git a/2024/gareth/day11/input.txt b/2024/gareth/day11/input.txt deleted file mode 100644 index ae72b37..0000000 --- a/2024/gareth/day11/input.txt +++ /dev/null @@ -1 +0,0 @@ -965842 9159 3372473 311 0 6 86213 48 \ No newline at end of file diff --git a/2024/gareth/day13/day13.go b/2024/gareth/day13/day13.go deleted file mode 100644 index 3d038b1..0000000 --- a/2024/gareth/day13/day13.go +++ /dev/null @@ -1,76 +0,0 @@ -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 -} diff --git a/2024/gareth/day13/day13_test.go b/2024/gareth/day13/day13_test.go deleted file mode 100644 index 209a74f..0000000 --- a/2024/gareth/day13/day13_test.go +++ /dev/null @@ -1,45 +0,0 @@ -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) -} diff --git a/2024/gareth/day13/input.txt b/2024/gareth/day13/input.txt deleted file mode 100644 index ad39ae5..0000000 --- a/2024/gareth/day13/input.txt +++ /dev/null @@ -1,1279 +0,0 @@ -Button A: X+54, Y+22 -Button B: X+36, Y+62 -Prize: X=19754, Y=14184 - -Button A: X+20, Y+68 -Button B: X+34, Y+13 -Prize: X=15660, Y=15792 - -Button A: X+63, Y+17 -Button B: X+11, Y+28 -Prize: X=2658, Y=11605 - -Button A: X+15, Y+56 -Button B: X+74, Y+29 -Prize: X=9393, Y=11622 - -Button A: X+34, Y+97 -Button B: X+83, Y+35 -Prize: X=3876, Y=4197 - -Button A: X+14, Y+62 -Button B: X+75, Y+27 -Prize: X=12989, Y=4061 - -Button A: X+46, Y+17 -Button B: X+15, Y+54 -Prize: X=15841, Y=336 - -Button A: X+19, Y+61 -Button B: X+69, Y+12 -Prize: X=204, Y=7413 - -Button A: X+34, Y+14 -Button B: X+29, Y+40 -Prize: X=2353, Y=10368 - -Button A: X+64, Y+32 -Button B: X+25, Y+48 -Prize: X=3273, Y=304 - -Button A: X+18, Y+60 -Button B: X+66, Y+30 -Prize: X=11594, Y=2330 - -Button A: X+65, Y+47 -Button B: X+11, Y+29 -Prize: X=4677, Y=195 - -Button A: X+13, Y+23 -Button B: X+42, Y+14 -Prize: X=7115, Y=12417 - -Button A: X+81, Y+55 -Button B: X+26, Y+93 -Prize: X=2703, Y=5678 - -Button A: X+50, Y+96 -Button B: X+74, Y+20 -Prize: X=8694, Y=9856 - -Button A: X+19, Y+54 -Button B: X+74, Y+36 -Prize: X=6145, Y=9170 - -Button A: X+45, Y+76 -Button B: X+43, Y+15 -Prize: X=4194, Y=5627 - -Button A: X+28, Y+91 -Button B: X+94, Y+48 -Prize: X=2282, Y=2009 - -Button A: X+70, Y+35 -Button B: X+33, Y+83 -Prize: X=4786, Y=3856 - -Button A: X+14, Y+89 -Button B: X+38, Y+40 -Prize: X=2186, Y=3415 - -Button A: X+55, Y+19 -Button B: X+43, Y+79 -Prize: X=4737, Y=2757 - -Button A: X+32, Y+76 -Button B: X+60, Y+17 -Prize: X=11124, Y=5467 - -Button A: X+33, Y+62 -Button B: X+50, Y+21 -Prize: X=4940, Y=12625 - -Button A: X+56, Y+14 -Button B: X+48, Y+92 -Prize: X=2888, Y=962 - -Button A: X+14, Y+58 -Button B: X+83, Y+30 -Prize: X=6249, Y=5488 - -Button A: X+47, Y+83 -Button B: X+47, Y+11 -Prize: X=7153, Y=15685 - -Button A: X+35, Y+68 -Button B: X+52, Y+16 -Prize: X=12241, Y=14956 - -Button A: X+46, Y+72 -Button B: X+56, Y+25 -Prize: X=6054, Y=4401 - -Button A: X+35, Y+57 -Button B: X+43, Y+14 -Prize: X=10516, Y=12390 - -Button A: X+29, Y+56 -Button B: X+41, Y+25 -Prize: X=6288, Y=2319 - -Button A: X+73, Y+19 -Button B: X+59, Y+86 -Prize: X=9965, Y=8669 - -Button A: X+13, Y+43 -Button B: X+49, Y+13 -Prize: X=12137, Y=19559 - -Button A: X+17, Y+65 -Button B: X+67, Y+22 -Prize: X=1910, Y=15266 - -Button A: X+55, Y+27 -Button B: X+11, Y+43 -Prize: X=7767, Y=5007 - -Button A: X+26, Y+18 -Button B: X+35, Y+94 -Prize: X=4719, Y=9616 - -Button A: X+37, Y+81 -Button B: X+58, Y+13 -Prize: X=11010, Y=1876 - -Button A: X+66, Y+43 -Button B: X+17, Y+88 -Prize: X=6227, Y=5057 - -Button A: X+36, Y+66 -Button B: X+61, Y+31 -Prize: X=1642, Y=10702 - -Button A: X+54, Y+17 -Button B: X+15, Y+50 -Prize: X=17444, Y=2332 - -Button A: X+33, Y+74 -Button B: X+47, Y+16 -Prize: X=1127, Y=13206 - -Button A: X+45, Y+93 -Button B: X+84, Y+43 -Prize: X=9867, Y=10858 - -Button A: X+35, Y+99 -Button B: X+64, Y+33 -Prize: X=3780, Y=5511 - -Button A: X+29, Y+62 -Button B: X+46, Y+24 -Prize: X=14412, Y=6932 - -Button A: X+91, Y+18 -Button B: X+21, Y+20 -Prize: X=9303, Y=2474 - -Button A: X+61, Y+34 -Button B: X+30, Y+75 -Prize: X=6835, Y=7015 - -Button A: X+32, Y+82 -Button B: X+46, Y+12 -Prize: X=7126, Y=14580 - -Button A: X+30, Y+47 -Button B: X+36, Y+11 -Prize: X=13922, Y=14563 - -Button A: X+79, Y+39 -Button B: X+12, Y+43 -Prize: X=15040, Y=13839 - -Button A: X+15, Y+14 -Button B: X+20, Y+81 -Prize: X=1075, Y=1502 - -Button A: X+35, Y+80 -Button B: X+45, Y+11 -Prize: X=10380, Y=11870 - -Button A: X+50, Y+36 -Button B: X+21, Y+58 -Prize: X=4389, Y=3546 - -Button A: X+31, Y+95 -Button B: X+60, Y+14 -Prize: X=5432, Y=4076 - -Button A: X+96, Y+20 -Button B: X+64, Y+77 -Prize: X=3424, Y=2687 - -Button A: X+15, Y+51 -Button B: X+60, Y+26 -Prize: X=1505, Y=19741 - -Button A: X+37, Y+12 -Button B: X+33, Y+78 -Prize: X=10344, Y=13604 - -Button A: X+70, Y+93 -Button B: X+84, Y+21 -Prize: X=9184, Y=8034 - -Button A: X+33, Y+85 -Button B: X+99, Y+59 -Prize: X=4356, Y=2988 - -Button A: X+26, Y+27 -Button B: X+13, Y+60 -Prize: X=1105, Y=3240 - -Button A: X+55, Y+31 -Button B: X+21, Y+46 -Prize: X=7181, Y=11070 - -Button A: X+20, Y+54 -Button B: X+41, Y+32 -Prize: X=2979, Y=3400 - -Button A: X+35, Y+19 -Button B: X+33, Y+60 -Prize: X=10334, Y=11024 - -Button A: X+84, Y+21 -Button B: X+29, Y+79 -Prize: X=9575, Y=6340 - -Button A: X+58, Y+24 -Button B: X+15, Y+64 -Prize: X=10518, Y=6264 - -Button A: X+41, Y+12 -Button B: X+45, Y+69 -Prize: X=10120, Y=8966 - -Button A: X+87, Y+28 -Button B: X+14, Y+67 -Prize: X=6242, Y=6571 - -Button A: X+12, Y+28 -Button B: X+65, Y+24 -Prize: X=1515, Y=12044 - -Button A: X+85, Y+24 -Button B: X+29, Y+37 -Prize: X=7600, Y=2434 - -Button A: X+34, Y+92 -Button B: X+94, Y+69 -Prize: X=9882, Y=12282 - -Button A: X+11, Y+37 -Button B: X+23, Y+12 -Prize: X=848, Y=8448 - -Button A: X+52, Y+28 -Button B: X+33, Y+63 -Prize: X=3429, Y=6843 - -Button A: X+57, Y+13 -Button B: X+56, Y+55 -Prize: X=4314, Y=1744 - -Button A: X+81, Y+24 -Button B: X+12, Y+59 -Prize: X=13487, Y=6933 - -Button A: X+72, Y+50 -Button B: X+15, Y+40 -Prize: X=8927, Y=9290 - -Button A: X+68, Y+27 -Button B: X+16, Y+30 -Prize: X=2728, Y=2904 - -Button A: X+66, Y+13 -Button B: X+54, Y+65 -Prize: X=6060, Y=1846 - -Button A: X+56, Y+86 -Button B: X+88, Y+44 -Prize: X=5840, Y=4138 - -Button A: X+44, Y+80 -Button B: X+46, Y+15 -Prize: X=15084, Y=8430 - -Button A: X+50, Y+18 -Button B: X+13, Y+60 -Prize: X=6386, Y=6944 - -Button A: X+15, Y+63 -Button B: X+67, Y+14 -Prize: X=12210, Y=802 - -Button A: X+22, Y+65 -Button B: X+65, Y+33 -Prize: X=2817, Y=4983 - -Button A: X+23, Y+37 -Button B: X+51, Y+11 -Prize: X=4351, Y=1387 - -Button A: X+58, Y+39 -Button B: X+14, Y+50 -Prize: X=2678, Y=3343 - -Button A: X+13, Y+80 -Button B: X+65, Y+68 -Prize: X=4784, Y=5536 - -Button A: X+47, Y+93 -Button B: X+84, Y+33 -Prize: X=5496, Y=3948 - -Button A: X+51, Y+13 -Button B: X+21, Y+58 -Prize: X=13064, Y=14007 - -Button A: X+38, Y+22 -Button B: X+12, Y+26 -Prize: X=1962, Y=11422 - -Button A: X+51, Y+13 -Button B: X+34, Y+62 -Prize: X=13062, Y=2106 - -Button A: X+31, Y+11 -Button B: X+44, Y+78 -Prize: X=4550, Y=7654 - -Button A: X+97, Y+27 -Button B: X+48, Y+63 -Prize: X=10321, Y=3816 - -Button A: X+59, Y+17 -Button B: X+27, Y+78 -Prize: X=978, Y=18744 - -Button A: X+68, Y+27 -Button B: X+25, Y+64 -Prize: X=2115, Y=1002 - -Button A: X+19, Y+33 -Button B: X+91, Y+19 -Prize: X=7873, Y=2689 - -Button A: X+39, Y+96 -Button B: X+47, Y+16 -Prize: X=5548, Y=8672 - -Button A: X+58, Y+11 -Button B: X+20, Y+80 -Prize: X=4668, Y=4086 - -Button A: X+13, Y+33 -Button B: X+56, Y+14 -Prize: X=3696, Y=1396 - -Button A: X+21, Y+45 -Button B: X+34, Y+13 -Prize: X=15420, Y=12003 - -Button A: X+12, Y+22 -Button B: X+77, Y+27 -Prize: X=2487, Y=1477 - -Button A: X+58, Y+89 -Button B: X+70, Y+19 -Prize: X=5774, Y=1787 - -Button A: X+25, Y+63 -Button B: X+53, Y+13 -Prize: X=13823, Y=19135 - -Button A: X+45, Y+36 -Button B: X+34, Y+99 -Prize: X=6416, Y=9369 - -Button A: X+81, Y+35 -Button B: X+18, Y+50 -Prize: X=4203, Y=5025 - -Button A: X+81, Y+28 -Button B: X+12, Y+58 -Prize: X=2592, Y=5258 - -Button A: X+57, Y+21 -Button B: X+19, Y+67 -Prize: X=19310, Y=9410 - -Button A: X+62, Y+48 -Button B: X+25, Y+84 -Prize: X=1505, Y=2652 - -Button A: X+98, Y+18 -Button B: X+20, Y+26 -Prize: X=9334, Y=1960 - -Button A: X+23, Y+42 -Button B: X+33, Y+13 -Prize: X=11779, Y=4858 - -Button A: X+12, Y+36 -Button B: X+75, Y+39 -Prize: X=4355, Y=8495 - -Button A: X+20, Y+34 -Button B: X+37, Y+18 -Prize: X=10274, Y=2754 - -Button A: X+89, Y+26 -Button B: X+18, Y+44 -Prize: X=4524, Y=1864 - -Button A: X+11, Y+36 -Button B: X+53, Y+21 -Prize: X=18093, Y=17453 - -Button A: X+48, Y+22 -Button B: X+47, Y+74 -Prize: X=8784, Y=8868 - -Button A: X+29, Y+53 -Button B: X+45, Y+16 -Prize: X=12465, Y=10268 - -Button A: X+47, Y+82 -Button B: X+65, Y+19 -Prize: X=4989, Y=3984 - -Button A: X+98, Y+36 -Button B: X+52, Y+96 -Prize: X=1610, Y=1668 - -Button A: X+31, Y+75 -Button B: X+63, Y+26 -Prize: X=1468, Y=2161 - -Button A: X+14, Y+66 -Button B: X+47, Y+14 -Prize: X=5961, Y=12456 - -Button A: X+20, Y+87 -Button B: X+70, Y+44 -Prize: X=1740, Y=3922 - -Button A: X+52, Y+21 -Button B: X+16, Y+43 -Prize: X=3884, Y=7457 - -Button A: X+93, Y+97 -Button B: X+91, Y+20 -Prize: X=2827, Y=851 - -Button A: X+68, Y+15 -Button B: X+23, Y+63 -Prize: X=10422, Y=7157 - -Button A: X+84, Y+68 -Button B: X+22, Y+86 -Prize: X=2696, Y=2728 - -Button A: X+67, Y+34 -Button B: X+40, Y+83 -Prize: X=5256, Y=5865 - -Button A: X+34, Y+49 -Button B: X+97, Y+12 -Prize: X=3687, Y=1352 - -Button A: X+15, Y+90 -Button B: X+89, Y+21 -Prize: X=7432, Y=2013 - -Button A: X+41, Y+13 -Button B: X+12, Y+50 -Prize: X=7134, Y=14486 - -Button A: X+20, Y+28 -Button B: X+32, Y+13 -Prize: X=10032, Y=19165 - -Button A: X+27, Y+77 -Button B: X+69, Y+13 -Prize: X=9554, Y=15260 - -Button A: X+47, Y+23 -Button B: X+32, Y+54 -Prize: X=6409, Y=355 - -Button A: X+56, Y+81 -Button B: X+64, Y+16 -Prize: X=7600, Y=5786 - -Button A: X+46, Y+17 -Button B: X+37, Y+66 -Prize: X=7509, Y=14295 - -Button A: X+18, Y+33 -Button B: X+64, Y+36 -Prize: X=16814, Y=12887 - -Button A: X+22, Y+79 -Button B: X+92, Y+31 -Prize: X=3856, Y=5165 - -Button A: X+43, Y+12 -Button B: X+30, Y+74 -Prize: X=1825, Y=17414 - -Button A: X+74, Y+49 -Button B: X+28, Y+70 -Prize: X=6646, Y=9135 - -Button A: X+85, Y+14 -Button B: X+12, Y+79 -Prize: X=1124, Y=3340 - -Button A: X+60, Y+31 -Button B: X+11, Y+44 -Prize: X=14996, Y=12846 - -Button A: X+62, Y+17 -Button B: X+12, Y+54 -Prize: X=17176, Y=5908 - -Button A: X+73, Y+54 -Button B: X+21, Y+91 -Prize: X=4258, Y=4810 - -Button A: X+32, Y+57 -Button B: X+36, Y+11 -Prize: X=412, Y=2137 - -Button A: X+80, Y+65 -Button B: X+12, Y+63 -Prize: X=2060, Y=5135 - -Button A: X+38, Y+19 -Button B: X+11, Y+30 -Prize: X=2771, Y=8832 - -Button A: X+12, Y+63 -Button B: X+89, Y+94 -Prize: X=2441, Y=3484 - -Button A: X+64, Y+42 -Button B: X+19, Y+44 -Prize: X=10186, Y=11248 - -Button A: X+21, Y+47 -Button B: X+81, Y+42 -Prize: X=6363, Y=4491 - -Button A: X+55, Y+70 -Button B: X+90, Y+13 -Prize: X=7855, Y=6037 - -Button A: X+39, Y+78 -Button B: X+53, Y+19 -Prize: X=19180, Y=483 - -Button A: X+11, Y+77 -Button B: X+74, Y+17 -Prize: X=6027, Y=1608 - -Button A: X+71, Y+34 -Button B: X+20, Y+54 -Prize: X=1962, Y=12986 - -Button A: X+19, Y+50 -Button B: X+57, Y+25 -Prize: X=19082, Y=12150 - -Button A: X+54, Y+19 -Button B: X+13, Y+31 -Prize: X=1754, Y=19209 - -Button A: X+77, Y+15 -Button B: X+17, Y+98 -Prize: X=7856, Y=7117 - -Button A: X+86, Y+35 -Button B: X+18, Y+85 -Prize: X=6694, Y=6375 - -Button A: X+14, Y+62 -Button B: X+63, Y+41 -Prize: X=1330, Y=4938 - -Button A: X+92, Y+51 -Button B: X+38, Y+74 -Prize: X=6240, Y=8435 - -Button A: X+14, Y+20 -Button B: X+86, Y+27 -Prize: X=4106, Y=2319 - -Button A: X+54, Y+17 -Button B: X+36, Y+69 -Prize: X=6488, Y=2762 - -Button A: X+82, Y+96 -Button B: X+82, Y+15 -Prize: X=4592, Y=2460 - -Button A: X+14, Y+65 -Button B: X+71, Y+24 -Prize: X=9947, Y=3249 - -Button A: X+33, Y+54 -Button B: X+23, Y+11 -Prize: X=7043, Y=12653 - -Button A: X+35, Y+12 -Button B: X+16, Y+47 -Prize: X=7136, Y=7027 - -Button A: X+11, Y+26 -Button B: X+39, Y+20 -Prize: X=8298, Y=1518 - -Button A: X+50, Y+12 -Button B: X+13, Y+23 -Prize: X=1816, Y=2066 - -Button A: X+17, Y+38 -Button B: X+63, Y+40 -Prize: X=9007, Y=7834 - -Button A: X+55, Y+19 -Button B: X+11, Y+28 -Prize: X=14257, Y=9219 - -Button A: X+55, Y+18 -Button B: X+11, Y+69 -Prize: X=1343, Y=5285 - -Button A: X+19, Y+53 -Button B: X+74, Y+28 -Prize: X=2560, Y=1920 - -Button A: X+12, Y+59 -Button B: X+39, Y+14 -Prize: X=5354, Y=317 - -Button A: X+72, Y+14 -Button B: X+91, Y+86 -Prize: X=9387, Y=7358 - -Button A: X+18, Y+84 -Button B: X+54, Y+48 -Prize: X=3852, Y=6960 - -Button A: X+12, Y+69 -Button B: X+57, Y+12 -Prize: X=6488, Y=7169 - -Button A: X+15, Y+30 -Button B: X+42, Y+15 -Prize: X=12671, Y=10775 - -Button A: X+25, Y+12 -Button B: X+34, Y+96 -Prize: X=2435, Y=6348 - -Button A: X+29, Y+12 -Button B: X+40, Y+66 -Prize: X=1315, Y=17804 - -Button A: X+69, Y+26 -Button B: X+22, Y+56 -Prize: X=6670, Y=4708 - -Button A: X+19, Y+42 -Button B: X+62, Y+21 -Prize: X=2458, Y=16769 - -Button A: X+45, Y+17 -Button B: X+23, Y+38 -Prize: X=5151, Y=19084 - -Button A: X+17, Y+33 -Button B: X+35, Y+14 -Prize: X=14888, Y=18170 - -Button A: X+74, Y+36 -Button B: X+14, Y+57 -Prize: X=14816, Y=15158 - -Button A: X+36, Y+14 -Button B: X+32, Y+60 -Prize: X=3368, Y=15472 - -Button A: X+85, Y+19 -Button B: X+83, Y+89 -Prize: X=10387, Y=4717 - -Button A: X+55, Y+18 -Button B: X+37, Y+68 -Prize: X=16050, Y=14820 - -Button A: X+52, Y+21 -Button B: X+15, Y+49 -Prize: X=4037, Y=6619 - -Button A: X+75, Y+11 -Button B: X+11, Y+51 -Prize: X=19531, Y=6083 - -Button A: X+90, Y+21 -Button B: X+29, Y+38 -Prize: X=10125, Y=3768 - -Button A: X+33, Y+70 -Button B: X+45, Y+20 -Prize: X=4805, Y=17590 - -Button A: X+11, Y+28 -Button B: X+58, Y+33 -Prize: X=4190, Y=18722 - -Button A: X+95, Y+50 -Button B: X+16, Y+70 -Prize: X=3754, Y=2530 - -Button A: X+88, Y+19 -Button B: X+35, Y+84 -Prize: X=7511, Y=3227 - -Button A: X+48, Y+12 -Button B: X+11, Y+31 -Prize: X=9355, Y=19551 - -Button A: X+71, Y+40 -Button B: X+39, Y+96 -Prize: X=9850, Y=12656 - -Button A: X+18, Y+46 -Button B: X+69, Y+53 -Prize: X=1584, Y=3308 - -Button A: X+65, Y+26 -Button B: X+62, Y+89 -Prize: X=7671, Y=5829 - -Button A: X+92, Y+51 -Button B: X+19, Y+41 -Prize: X=4806, Y=5650 - -Button A: X+26, Y+98 -Button B: X+50, Y+39 -Prize: X=6268, Y=10174 - -Button A: X+16, Y+64 -Button B: X+34, Y+12 -Prize: X=16854, Y=11364 - -Button A: X+20, Y+69 -Button B: X+61, Y+23 -Prize: X=408, Y=12175 - -Button A: X+49, Y+16 -Button B: X+11, Y+45 -Prize: X=17005, Y=1724 - -Button A: X+82, Y+15 -Button B: X+92, Y+80 -Prize: X=15178, Y=8525 - -Button A: X+98, Y+17 -Button B: X+32, Y+95 -Prize: X=4930, Y=5596 - -Button A: X+74, Y+24 -Button B: X+63, Y+72 -Prize: X=4818, Y=1872 - -Button A: X+63, Y+23 -Button B: X+29, Y+74 -Prize: X=4610, Y=2155 - -Button A: X+14, Y+69 -Button B: X+46, Y+16 -Prize: X=5686, Y=14981 - -Button A: X+12, Y+44 -Button B: X+73, Y+32 -Prize: X=1404, Y=2320 - -Button A: X+16, Y+61 -Button B: X+36, Y+16 -Prize: X=19784, Y=1294 - -Button A: X+79, Y+17 -Button B: X+11, Y+57 -Prize: X=18419, Y=19769 - -Button A: X+27, Y+61 -Button B: X+32, Y+16 -Prize: X=11215, Y=8185 - -Button A: X+80, Y+14 -Button B: X+55, Y+94 -Prize: X=6715, Y=3622 - -Button A: X+13, Y+99 -Button B: X+67, Y+60 -Prize: X=1132, Y=5469 - -Button A: X+11, Y+64 -Button B: X+68, Y+52 -Prize: X=1359, Y=3096 - -Button A: X+16, Y+40 -Button B: X+60, Y+34 -Prize: X=4712, Y=2220 - -Button A: X+50, Y+11 -Button B: X+12, Y+60 -Prize: X=15794, Y=4259 - -Button A: X+38, Y+17 -Button B: X+29, Y+54 -Prize: X=1335, Y=6160 - -Button A: X+36, Y+59 -Button B: X+93, Y+32 -Prize: X=6990, Y=6880 - -Button A: X+29, Y+97 -Button B: X+62, Y+55 -Prize: X=3255, Y=5097 - -Button A: X+25, Y+21 -Button B: X+22, Y+73 -Prize: X=3307, Y=5831 - -Button A: X+15, Y+75 -Button B: X+87, Y+82 -Prize: X=2655, Y=6215 - -Button A: X+22, Y+82 -Button B: X+74, Y+39 -Prize: X=4198, Y=6648 - -Button A: X+41, Y+61 -Button B: X+36, Y+11 -Prize: X=7347, Y=17092 - -Button A: X+82, Y+51 -Button B: X+19, Y+60 -Prize: X=1729, Y=1509 - -Button A: X+43, Y+13 -Button B: X+49, Y+76 -Prize: X=8520, Y=7788 - -Button A: X+97, Y+24 -Button B: X+46, Y+51 -Prize: X=1349, Y=1245 - -Button A: X+84, Y+38 -Button B: X+13, Y+51 -Prize: X=10408, Y=4606 - -Button A: X+48, Y+97 -Button B: X+80, Y+28 -Prize: X=9584, Y=8808 - -Button A: X+13, Y+32 -Button B: X+76, Y+43 -Prize: X=16226, Y=18495 - -Button A: X+14, Y+33 -Button B: X+78, Y+54 -Prize: X=1852, Y=2028 - -Button A: X+11, Y+30 -Button B: X+73, Y+37 -Prize: X=7433, Y=18454 - -Button A: X+23, Y+56 -Button B: X+31, Y+16 -Prize: X=12525, Y=3816 - -Button A: X+55, Y+16 -Button B: X+21, Y+68 -Prize: X=16009, Y=16852 - -Button A: X+17, Y+47 -Button B: X+76, Y+37 -Prize: X=6637, Y=12724 - -Button A: X+74, Y+88 -Button B: X+59, Y+12 -Prize: X=9928, Y=6688 - -Button A: X+26, Y+87 -Button B: X+32, Y+21 -Prize: X=1790, Y=3063 - -Button A: X+25, Y+71 -Button B: X+56, Y+19 -Prize: X=1849, Y=5946 - -Button A: X+51, Y+76 -Button B: X+59, Y+28 -Prize: X=7997, Y=6644 - -Button A: X+53, Y+28 -Button B: X+32, Y+62 -Prize: X=5323, Y=6228 - -Button A: X+33, Y+69 -Button B: X+39, Y+18 -Prize: X=575, Y=13307 - -Button A: X+93, Y+15 -Button B: X+56, Y+55 -Prize: X=7024, Y=3845 - -Button A: X+21, Y+53 -Button B: X+68, Y+24 -Prize: X=5268, Y=7924 - -Button A: X+13, Y+51 -Button B: X+78, Y+27 -Prize: X=15733, Y=10982 - -Button A: X+12, Y+79 -Button B: X+50, Y+11 -Prize: X=7094, Y=2854 - -Button A: X+21, Y+83 -Button B: X+90, Y+69 -Prize: X=2607, Y=5143 - -Button A: X+94, Y+16 -Button B: X+25, Y+54 -Prize: X=10271, Y=6474 - -Button A: X+80, Y+14 -Button B: X+12, Y+69 -Prize: X=15888, Y=10392 - -Button A: X+58, Y+37 -Button B: X+15, Y+54 -Prize: X=1422, Y=3573 - -Button A: X+13, Y+28 -Button B: X+59, Y+29 -Prize: X=2235, Y=12810 - -Button A: X+11, Y+32 -Button B: X+58, Y+13 -Prize: X=438, Y=6564 - -Button A: X+14, Y+72 -Button B: X+93, Y+84 -Prize: X=4137, Y=7476 - -Button A: X+63, Y+29 -Button B: X+27, Y+54 -Prize: X=4319, Y=1669 - -Button A: X+86, Y+28 -Button B: X+30, Y+60 -Prize: X=5710, Y=2060 - -Button A: X+15, Y+54 -Button B: X+52, Y+19 -Prize: X=9815, Y=1199 - -Button A: X+24, Y+63 -Button B: X+57, Y+20 -Prize: X=16160, Y=12588 - -Button A: X+19, Y+37 -Button B: X+57, Y+33 -Prize: X=2324, Y=15332 - -Button A: X+25, Y+14 -Button B: X+31, Y+56 -Prize: X=7136, Y=17336 - -Button A: X+66, Y+29 -Button B: X+25, Y+57 -Prize: X=13681, Y=16936 - -Button A: X+36, Y+93 -Button B: X+84, Y+56 -Prize: X=6720, Y=11242 - -Button A: X+92, Y+41 -Button B: X+18, Y+96 -Prize: X=1396, Y=1150 - -Button A: X+12, Y+38 -Button B: X+63, Y+28 -Prize: X=19403, Y=12776 - -Button A: X+72, Y+28 -Button B: X+13, Y+37 -Prize: X=5137, Y=3113 - -Button A: X+90, Y+72 -Button B: X+91, Y+13 -Prize: X=5795, Y=2543 - -Button A: X+28, Y+13 -Button B: X+31, Y+49 -Prize: X=16418, Y=9287 - -Button A: X+17, Y+33 -Button B: X+64, Y+32 -Prize: X=11422, Y=2206 - -Button A: X+71, Y+22 -Button B: X+16, Y+45 -Prize: X=2918, Y=7791 - -Button A: X+15, Y+36 -Button B: X+55, Y+35 -Prize: X=7930, Y=7704 - -Button A: X+57, Y+65 -Button B: X+95, Y+17 -Prize: X=11818, Y=4800 - -Button A: X+22, Y+46 -Button B: X+33, Y+21 -Prize: X=1232, Y=1040 - -Button A: X+34, Y+98 -Button B: X+85, Y+39 -Prize: X=7582, Y=9494 - -Button A: X+63, Y+15 -Button B: X+15, Y+47 -Prize: X=13439, Y=17391 - -Button A: X+20, Y+41 -Button B: X+38, Y+23 -Prize: X=2052, Y=10086 - -Button A: X+14, Y+66 -Button B: X+84, Y+28 -Prize: X=16902, Y=10730 - -Button A: X+27, Y+12 -Button B: X+17, Y+43 -Prize: X=9367, Y=12201 - -Button A: X+30, Y+49 -Button B: X+40, Y+20 -Prize: X=8430, Y=10049 - -Button A: X+82, Y+22 -Button B: X+46, Y+97 -Prize: X=3798, Y=4236 - -Button A: X+56, Y+55 -Button B: X+94, Y+13 -Prize: X=6522, Y=5533 - -Button A: X+39, Y+41 -Button B: X+59, Y+16 -Prize: X=4261, Y=3559 - -Button A: X+59, Y+18 -Button B: X+11, Y+63 -Prize: X=15316, Y=10169 - -Button A: X+59, Y+55 -Button B: X+20, Y+98 -Prize: X=375, Y=667 - -Button A: X+11, Y+93 -Button B: X+64, Y+67 -Prize: X=6699, Y=14917 - -Button A: X+13, Y+46 -Button B: X+48, Y+15 -Prize: X=1661, Y=1232 - -Button A: X+36, Y+99 -Button B: X+85, Y+42 -Prize: X=2224, Y=3048 - -Button A: X+11, Y+75 -Button B: X+28, Y+22 -Prize: X=2614, Y=6168 - -Button A: X+21, Y+97 -Button B: X+94, Y+81 -Prize: X=7763, Y=8662 - -Button A: X+34, Y+13 -Button B: X+26, Y+42 -Prize: X=8612, Y=15869 - -Button A: X+39, Y+71 -Button B: X+31, Y+13 -Prize: X=19737, Y=5345 - -Button A: X+21, Y+60 -Button B: X+75, Y+30 -Prize: X=10448, Y=18140 - -Button A: X+24, Y+49 -Button B: X+47, Y+17 -Prize: X=7371, Y=12446 - -Button A: X+56, Y+86 -Button B: X+94, Y+41 -Prize: X=3570, Y=4759 - -Button A: X+14, Y+50 -Button B: X+54, Y+28 -Prize: X=19392, Y=1330 - -Button A: X+20, Y+67 -Button B: X+52, Y+13 -Prize: X=1000, Y=3692 - -Button A: X+14, Y+26 -Button B: X+50, Y+21 -Prize: X=7114, Y=9374 - -Button A: X+19, Y+55 -Button B: X+39, Y+16 -Prize: X=15710, Y=8361 - -Button A: X+56, Y+14 -Button B: X+63, Y+96 -Prize: X=4851, Y=3540 - -Button A: X+33, Y+67 -Button B: X+54, Y+24 -Prize: X=5447, Y=1189 - -Button A: X+39, Y+84 -Button B: X+89, Y+24 -Prize: X=10312, Y=8292 - -Button A: X+51, Y+19 -Button B: X+53, Y+74 -Prize: X=4001, Y=3498 - -Button A: X+67, Y+43 -Button B: X+11, Y+36 -Prize: X=4764, Y=9202 - -Button A: X+21, Y+62 -Button B: X+54, Y+22 -Prize: X=4434, Y=2234 - -Button A: X+89, Y+87 -Button B: X+24, Y+88 -Prize: X=6501, Y=7323 - -Button A: X+54, Y+29 -Button B: X+28, Y+51 -Prize: X=13224, Y=17258 - -Button A: X+62, Y+45 -Button B: X+39, Y+94 -Prize: X=4796, Y=9262 - -Button A: X+45, Y+23 -Button B: X+12, Y+52 -Prize: X=11084, Y=11636 - -Button A: X+22, Y+37 -Button B: X+48, Y+25 -Prize: X=5514, Y=11182 - -Button A: X+15, Y+38 -Button B: X+75, Y+39 -Prize: X=16520, Y=17711 - -Button A: X+78, Y+11 -Button B: X+49, Y+92 -Prize: X=9365, Y=6341 - -Button A: X+98, Y+14 -Button B: X+13, Y+64 -Prize: X=5741, Y=2498 - -Button A: X+13, Y+63 -Button B: X+61, Y+20 -Prize: X=13770, Y=14824 - -Button A: X+21, Y+38 -Button B: X+62, Y+37 -Prize: X=17864, Y=15513 - -Button A: X+24, Y+21 -Button B: X+15, Y+62 -Prize: X=1476, Y=4224 - -Button A: X+16, Y+75 -Button B: X+52, Y+12 -Prize: X=468, Y=8849 - -Button A: X+14, Y+41 -Button B: X+46, Y+22 -Prize: X=2040, Y=1353 - -Button A: X+49, Y+16 -Button B: X+29, Y+54 -Prize: X=10446, Y=18614 - -Button A: X+11, Y+69 -Button B: X+75, Y+18 -Prize: X=10963, Y=2327 - -Button A: X+37, Y+64 -Button B: X+47, Y+20 -Prize: X=18201, Y=3324 - -Button A: X+99, Y+14 -Button B: X+87, Y+75 -Prize: X=14862, Y=6177 - -Button A: X+12, Y+58 -Button B: X+82, Y+33 -Prize: X=7438, Y=6507 - -Button A: X+72, Y+13 -Button B: X+13, Y+79 -Prize: X=14160, Y=11952 - -Button A: X+24, Y+55 -Button B: X+73, Y+39 -Prize: X=12196, Y=4761 - -Button A: X+47, Y+28 -Button B: X+21, Y+52 -Prize: X=969, Y=9732 - -Button A: X+57, Y+29 -Button B: X+15, Y+30 -Prize: X=17750, Y=13700 - -Button A: X+40, Y+23 -Button B: X+13, Y+26 -Prize: X=13248, Y=14881 - -Button A: X+68, Y+13 -Button B: X+85, Y+90 -Prize: X=9707, Y=6207 - -Button A: X+47, Y+23 -Button B: X+19, Y+57 -Prize: X=2226, Y=13254 \ No newline at end of file diff --git a/2024/gareth/day14/day14.go b/2024/gareth/day14/day14.go deleted file mode 100644 index d16f089..0000000 --- a/2024/gareth/day14/day14.go +++ /dev/null @@ -1,172 +0,0 @@ -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 -} diff --git a/2024/gareth/day14/day14_test.go b/2024/gareth/day14/day14_test.go deleted file mode 100644 index ebb51a5..0000000 --- a/2024/gareth/day14/day14_test.go +++ /dev/null @@ -1,23 +0,0 @@ -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) -} diff --git a/2024/gareth/day14/input.txt b/2024/gareth/day14/input.txt deleted file mode 100644 index e1a6d0a..0000000 --- a/2024/gareth/day14/input.txt +++ /dev/null @@ -1,500 +0,0 @@ -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 \ No newline at end of file diff --git a/2024/gareth/day18/day18.go b/2024/gareth/day18/day18.go deleted file mode 100644 index ed76eb7..0000000 --- a/2024/gareth/day18/day18.go +++ /dev/null @@ -1,156 +0,0 @@ -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] -} diff --git a/2024/gareth/day18/day18_test.go b/2024/gareth/day18/day18_test.go deleted file mode 100644 index 7a52d3b..0000000 --- a/2024/gareth/day18/day18_test.go +++ /dev/null @@ -1,65 +0,0 @@ -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) -} diff --git a/2024/gareth/day18/input.txt b/2024/gareth/day18/input.txt deleted file mode 100644 index 6265c77..0000000 --- a/2024/gareth/day18/input.txt +++ /dev/null @@ -1,3450 +0,0 @@ -44,51 -65,43 -65,40 -35,54 -66,67 -41,59 -55,55 -23,2 -45,57 -69,36 -34,53 -37,2 -38,1 -37,55 -41,67 -58,55 -3,26 -9,14 -5,28 -54,51 -56,69 -48,47 -46,53 -64,29 -61,56 -69,64 -45,7 -69,38 -39,54 -50,47 -27,14 -33,1 -67,50 -9,19 -56,57 -64,53 -15,21 -63,50 -3,42 -63,65 -43,52 -9,26 -59,31 -1,29 -30,59 -59,53 -13,0 -65,35 -5,24 -19,35 -47,9 -4,21 -24,11 -53,66 -35,2 -26,9 -56,51 -70,29 -69,56 -53,55 -69,67 -58,67 -8,9 -37,62 -55,9 -35,3 -69,35 -55,15 -59,69 -51,9 -61,5 -5,29 -66,45 -5,23 -63,37 -59,17 -69,55 -63,61 -17,18 -57,8 -15,17 -63,60 -53,61 -33,3 -67,68 -23,3 -9,20 -19,7 -1,5 -53,9 -68,47 -21,14 -32,13 -19,5 -6,19 -25,9 -43,58 -4,7 -25,16 -67,37 -0,29 -59,65 -47,55 -8,1 -11,19 -49,5 -57,48 -59,59 -65,39 -36,9 -43,5 -66,29 -55,54 -53,5 -1,35 -6,11 -68,31 -70,69 -20,21 -61,8 -65,46 -47,0 -49,41 -3,11 -30,25 -55,11 -29,4 -33,62 -15,13 -1,18 -1,37 -39,60 -65,53 -67,48 -67,49 -52,49 -25,3 -55,43 -0,21 -13,6 -41,53 -38,9 -17,17 -47,41 -41,6 -45,54 -56,17 -1,38 -6,23 -67,56 -2,11 -69,49 -1,33 -32,5 -41,50 -66,61 -5,21 -21,11 -3,29 -59,16 -49,55 -22,9 -34,1 -15,10 -57,3 -69,57 -18,3 -43,59 -24,15 -65,25 -53,11 -35,56 -39,12 -53,52 -65,30 -38,51 -25,7 -33,10 -63,36 -7,14 -5,25 -50,37 -51,5 -1,23 -53,6 -47,3 -61,41 -27,3 -61,26 -51,7 -39,61 -13,25 -1,31 -35,62 -50,43 -29,6 -53,15 -61,63 -45,5 -11,29 -27,6 -31,14 -55,41 -29,5 -5,5 -25,11 -61,35 -4,13 -34,17 -11,21 -69,69 -63,55 -50,45 -49,46 -1,13 -57,39 -63,47 -55,62 -37,61 -1,32 -7,30 -13,9 -51,47 -49,1 -19,23 -2,45 -51,62 -51,53 -57,63 -54,45 -47,58 -33,59 -3,37 -51,59 -39,3 -19,4 -61,60 -9,21 -67,69 -45,56 -53,57 -1,0 -23,13 -5,1 -27,7 -45,51 -56,45 -33,64 -56,13 -7,33 -20,13 -36,5 -57,55 -9,16 -57,65 -45,48 -47,48 -59,45 -65,29 -11,27 -55,67 -69,63 -17,2 -63,41 -10,27 -9,27 -69,47 -25,0 -57,51 -55,53 -65,48 -15,20 -43,9 -55,47 -62,37 -35,59 -22,17 -25,24 -18,7 -63,38 -40,63 -69,58 -59,43 -3,1 -34,7 -42,59 -41,51 -65,27 -7,21 -9,39 -51,49 -7,5 -25,2 -32,63 -8,3 -33,9 -54,9 -67,61 -67,38 -62,33 -17,1 -44,55 -2,27 -7,19 -2,47 -1,9 -7,9 -41,1 -39,10 -61,25 -35,61 -63,59 -21,13 -29,11 -58,51 -37,3 -17,12 -7,3 -7,29 -37,59 -65,69 -67,31 -19,13 -61,66 -23,9 -43,49 -50,9 -43,8 -61,64 -49,8 -15,2 -57,43 -23,15 -64,43 -39,52 -33,57 -8,29 -57,53 -11,6 -65,31 -65,67 -28,17 -9,31 -41,56 -22,1 -51,11 -66,69 -43,6 -1,19 -33,13 -53,41 -68,35 -43,3 -65,51 -44,3 -57,17 -61,12 -61,65 -44,1 -57,13 -13,10 -61,53 -9,15 -11,9 -29,12 -64,65 -45,41 -67,59 -55,12 -67,33 -56,41 -10,1 -5,14 -19,10 -53,43 -69,31 -3,21 -57,14 -37,47 -35,9 -10,5 -11,24 -66,41 -40,1 -59,39 -65,64 -63,70 -64,67 -13,35 -7,35 -4,11 -17,7 -43,60 -53,3 -32,55 -60,49 -39,48 -63,33 -7,6 -63,53 -69,37 -61,48 -45,45 -61,62 -16,7 -54,3 -13,11 -67,29 -47,59 -23,12 -32,3 -11,25 -63,63 -69,39 -29,7 -49,51 -62,43 -55,39 -3,51 -5,17 -45,3 -17,9 -13,1 -55,33 -47,2 -53,14 -13,19 -61,61 -1,39 -29,15 -5,35 -39,5 -1,1 -53,64 -47,56 -48,55 -59,67 -23,7 -59,63 -68,29 -31,13 -28,13 -30,3 -3,3 -31,17 -43,57 -51,4 -69,34 -3,47 -9,3 -69,54 -17,15 -61,34 -3,43 -39,9 -57,10 -58,43 -63,31 -52,55 -47,49 -25,6 -48,53 -38,57 -17,8 -63,69 -69,65 -50,7 -61,54 -63,67 -55,6 -65,52 -17,3 -51,51 -67,47 -57,5 -10,11 -57,41 -69,44 -29,61 -5,2 -9,11 -17,13 -52,45 -52,47 -57,15 -53,63 -1,7 -54,47 -7,16 -47,7 -9,1 -67,42 -39,1 -53,10 -41,69 -52,13 -57,60 -61,46 -67,60 -5,9 -54,61 -11,32 -55,68 -6,27 -26,3 -66,55 -49,66 -69,32 -61,3 -26,11 -5,44 -57,47 -3,19 -61,58 -12,11 -31,6 -11,34 -49,47 -68,41 -0,5 -61,38 -41,57 -68,45 -39,58 -1,10 -63,29 -55,59 -69,66 -9,24 -63,57 -65,54 -11,3 -48,5 -37,49 -40,7 -2,13 -57,31 -61,51 -33,58 -55,20 -49,53 -35,5 -67,43 -25,1 -61,13 -2,7 -6,9 -20,9 -5,7 -40,3 -7,13 -43,53 -67,65 -66,65 -37,57 -2,21 -13,17 -65,37 -13,3 -50,51 -31,10 -5,18 -35,7 -65,32 -7,26 -7,18 -11,8 -56,65 -65,58 -53,53 -55,44 -9,9 -13,8 -67,35 -38,7 -32,7 -69,29 -22,15 -58,63 -27,13 -29,10 -19,3 -62,67 -15,7 -57,59 -40,51 -61,47 -69,59 -31,19 -27,5 -59,11 -68,67 -15,5 -68,53 -44,43 -60,35 -61,11 -33,63 -40,47 -7,1 -39,51 -62,69 -18,11 -31,55 -44,59 -63,46 -67,67 -37,9 -3,28 -5,32 -11,18 -65,38 -16,21 -3,16 -55,45 -59,56 -66,35 -18,1 -11,11 -61,37 -9,13 -9,23 -48,43 -3,5 -8,19 -3,9 -13,5 -47,61 -5,43 -7,12 -39,55 -46,59 -31,9 -45,59 -27,4 -11,7 -17,5 -7,27 -12,15 -11,20 -12,3 -25,17 -2,3 -13,13 -64,57 -55,3 -3,4 -37,4 -31,3 -44,7 -51,65 -65,61 -69,52 -9,34 -25,5 -24,13 -59,57 -11,1 -3,30 -37,63 -22,21 -42,49 -7,25 -1,24 -39,59 -17,11 -14,13 -19,6 -61,40 -7,15 -13,7 -51,39 -47,57 -4,25 -1,45 -25,15 -9,7 -7,34 -48,11 -66,57 -57,7 -51,55 -57,61 -39,53 -14,1 -31,7 -59,66 -3,23 -41,49 -65,49 -68,39 -37,5 -49,50 -11,15 -59,33 -11,22 -15,4 -23,5 -39,63 -54,11 -21,3 -41,4 -30,63 -13,15 -5,13 -67,39 -61,14 -61,69 -61,42 -42,55 -49,3 -21,8 -23,10 -50,55 -59,35 -69,43 -6,29 -21,15 -45,1 -5,38 -54,15 -55,37 -5,15 -42,11 -46,5 -67,57 -60,13 -47,47 -63,39 -51,3 -1,20 -15,23 -37,58 -35,58 -36,7 -27,9 -49,11 -47,1 -57,49 -50,3 -8,11 -65,26 -2,33 -61,59 -37,53 -6,7 -65,41 -57,64 -16,5 -55,26 -55,4 -13,4 -16,13 -56,63 -54,59 -54,55 -0,7 -7,23 -37,1 -5,10 -19,9 -49,49 -66,33 -65,55 -23,11 -61,31 -27,11 -57,70 -10,13 -62,11 -55,66 -58,11 -69,41 -18,17 -51,52 -14,7 -59,62 -58,13 -3,27 -51,60 -67,52 -57,37 -64,35 -4,33 -44,49 -55,16 -68,61 -15,15 -52,3 -41,61 -0,39 -37,50 -59,51 -3,34 -4,5 -47,44 -59,60 -9,4 -27,1 -46,47 -35,60 -45,55 -53,50 -65,63 -8,5 -30,53 -37,7 -35,64 -51,35 -14,33 -31,8 -39,49 -51,41 -49,7 -3,15 -55,13 -53,13 -57,52 -3,8 -1,15 -4,19 -8,23 -3,25 -62,57 -53,7 -3,31 -33,61 -69,61 -36,53 -61,39 -57,9 -15,25 -57,18 -26,13 -7,31 -61,45 -34,5 -41,54 -56,3 -2,17 -63,43 -63,62 -69,33 -69,51 -59,13 -29,9 -59,41 -55,19 -11,2 -33,5 -25,18 -1,11 -45,61 -37,54 -62,55 -42,65 -22,5 -42,3 -41,52 -31,63 -9,33 -30,15 -52,7 -23,4 -57,42 -3,17 -45,53 -57,67 -64,61 -3,38 -39,57 -65,59 -43,51 -40,57 -45,37 -63,64 -1,3 -0,43 -6,3 -3,36 -1,36 -62,51 -12,17 -3,35 -16,9 -25,13 -35,63 -53,45 -68,63 -55,40 -68,59 -69,45 -4,15 -55,42 -65,33 -21,9 -5,11 -19,1 -46,51 -3,22 -60,43 -70,49 -31,5 -47,6 -64,41 -13,12 -7,22 -7,50 -48,61 -48,51 -1,41 -28,7 -3,41 -45,49 -36,63 -42,1 -5,36 -52,41 -39,4 -5,33 -60,67 -48,7 -24,23 -57,11 -27,17 -48,3 -11,37 -47,51 -38,61 -1,26 -9,25 -64,33 -11,5 -21,7 -63,35 -1,27 -24,7 -15,9 -59,61 -9,22 -15,3 -43,1 -56,7 -67,55 -7,7 -44,45 -63,45 -55,7 -59,58 -29,55 -57,45 -67,53 -31,62 -57,58 -52,9 -7,17 -4,31 -51,45 -9,8 -58,45 -70,47 -21,4 -55,17 -67,63 -55,65 -33,7 -41,5 -3,39 -5,31 -53,47 -59,55 -55,51 -59,68 -35,57 -65,47 -56,55 -27,8 -11,13 -2,41 -3,2 -29,13 -51,61 -59,15 -38,47 -45,67 -45,4 -4,1 -50,11 -51,54 -47,53 -69,53 -65,50 -51,63 -67,45 -11,31 -1,25 -3,40 -63,49 -39,7 -23,1 -30,11 -21,1 -59,37 -57,69 -34,3 -69,27 -9,29 -41,60 -58,53 -70,41 -38,15 -55,5 -43,55 -60,53 -60,45 -43,46 -49,35 -24,5 -1,43 -15,1 -67,51 -37,11 -20,1 -59,9 -68,25 -57,29 -45,15 -54,37 -17,29 -17,52 -4,43 -29,23 -13,46 -41,65 -65,16 -43,41 -17,23 -11,46 -34,67 -35,37 -5,47 -35,40 -41,29 -12,69 -15,67 -53,35 -42,43 -47,22 -35,49 -17,40 -13,59 -49,59 -33,29 -47,31 -11,54 -27,65 -69,3 -67,7 -53,29 -24,45 -57,28 -21,25 -62,21 -31,29 -23,59 -41,47 -22,55 -22,43 -67,26 -29,41 -41,25 -59,23 -43,35 -33,56 -7,69 -23,25 -31,1 -23,65 -41,45 -31,39 -47,63 -25,45 -67,13 -40,41 -46,45 -27,43 -23,49 -37,19 -67,27 -66,23 -46,31 -37,13 -35,47 -19,30 -20,47 -9,38 -64,7 -29,30 -19,45 -56,21 -35,66 -5,45 -33,49 -39,34 -47,65 -17,31 -13,51 -45,22 -45,42 -55,23 -27,55 -37,28 -41,37 -51,36 -57,33 -29,29 -35,53 -1,62 -49,69 -47,32 -4,59 -23,51 -61,33 -15,50 -37,24 -1,57 -46,27 -11,43 -29,35 -20,25 -37,29 -18,41 -31,34 -29,37 -46,29 -23,57 -9,69 -43,68 -37,65 -49,18 -4,61 -58,1 -20,33 -21,12 -46,65 -63,21 -31,27 -27,51 -5,64 -27,48 -26,59 -29,24 -18,35 -15,40 -6,59 -41,21 -46,35 -10,57 -29,19 -45,70 -62,17 -59,36 -25,66 -42,47 -26,49 -53,21 -59,21 -13,55 -51,40 -17,49 -47,34 -31,50 -2,57 -27,37 -55,49 -28,69 -64,25 -34,37 -57,24 -61,17 -43,11 -59,10 -27,42 -9,42 -13,58 -55,35 -35,46 -19,31 -28,65 -15,45 -31,47 -29,45 -67,41 -7,46 -41,63 -39,39 -67,20 -67,21 -37,18 -6,43 -47,33 -57,26 -26,45 -27,45 -35,39 -40,17 -48,21 -65,23 -42,33 -9,37 -29,25 -63,16 -53,24 -31,18 -25,37 -67,11 -43,39 -31,46 -3,55 -13,44 -14,49 -9,35 -55,57 -33,51 -37,69 -7,59 -1,17 -68,3 -64,13 -31,23 -33,53 -43,40 -2,67 -28,47 -43,65 -47,35 -63,3 -35,20 -19,26 -35,17 -11,33 -51,34 -20,29 -12,59 -43,14 -57,34 -33,39 -42,27 -7,61 -45,17 -11,63 -33,14 -4,55 -39,38 -9,43 -27,53 -14,37 -17,65 -31,45 -55,29 -10,47 -19,51 -29,17 -25,69 -18,25 -11,62 -65,21 -23,38 -1,66 -30,49 -9,61 -63,23 -23,39 -11,49 -47,67 -6,69 -31,48 -14,21 -21,57 -24,59 -18,29 -47,27 -25,21 -55,69 -63,7 -35,13 -23,63 -13,33 -15,11 -15,39 -25,36 -43,20 -65,1 -23,21 -20,55 -47,14 -45,36 -51,67 -22,41 -17,47 -16,31 -60,5 -43,36 -8,37 -43,15 -21,5 -10,53 -45,62 -51,17 -57,23 -22,31 -15,16 -31,32 -23,20 -55,0 -25,44 -55,24 -43,47 -5,57 -62,23 -8,61 -27,34 -20,57 -40,33 -15,65 -43,7 -24,29 -44,27 -27,63 -5,63 -57,21 -61,24 -23,29 -49,21 -55,25 -27,50 -17,25 -7,48 -5,53 -37,43 -13,41 -21,70 -8,45 -34,33 -58,47 -6,55 -3,57 -70,23 -59,1 -13,18 -33,60 -46,39 -35,27 -11,41 -33,55 -42,67 -19,48 -17,51 -17,50 -44,31 -68,17 -39,30 -1,63 -29,21 -9,47 -55,27 -33,27 -53,51 -21,21 -9,63 -25,33 -7,58 -53,38 -46,19 -18,69 -21,49 -40,39 -5,37 -53,67 -39,31 -33,12 -7,57 -1,49 -1,55 -19,36 -29,43 -13,50 -55,63 -51,37 -1,56 -41,41 -29,53 -24,63 -27,33 -70,9 -24,19 -2,65 -39,37 -36,35 -25,52 -32,27 -9,51 -25,19 -45,63 -15,33 -19,21 -49,13 -39,13 -65,15 -3,54 -11,57 -49,24 -41,14 -15,29 -15,27 -1,60 -31,25 -30,39 -3,58 -11,44 -13,53 -27,38 -35,33 -43,31 -53,34 -61,67 -25,27 -13,63 -21,59 -17,21 -21,55 -48,17 -5,51 -24,49 -54,49 -50,29 -31,43 -53,19 -62,31 -43,45 -19,41 -17,33 -31,59 -65,28 -26,25 -3,65 -51,25 -59,27 -20,69 -31,60 -47,11 -24,35 -39,23 -48,29 -17,44 -33,50 -61,49 -67,22 -15,26 -15,55 -52,25 -51,0 -67,10 -43,19 -45,33 -39,11 -13,49 -49,33 -3,70 -33,34 -51,13 -25,31 -32,67 -14,45 -45,34 -17,53 -43,21 -53,36 -55,31 -3,13 -1,48 -18,15 -17,69 -29,36 -11,48 -45,31 -29,39 -60,7 -22,27 -41,38 -21,47 -67,8 -49,19 -43,37 -41,33 -53,49 -21,53 -25,60 -33,45 -49,31 -13,22 -53,30 -37,12 -37,31 -27,61 -29,26 -5,52 -33,26 -35,70 -33,69 -39,25 -9,55 -29,1 -5,3 -69,15 -31,22 -9,32 -53,20 -23,33 -31,33 -6,63 -64,15 -69,23 -49,39 -48,27 -41,3 -7,38 -59,47 -65,10 -7,66 -17,24 -67,9 -25,22 -0,63 -7,37 -9,36 -9,17 -69,25 -27,39 -42,25 -11,23 -57,25 -31,67 -51,20 -35,55 -11,17 -9,57 -11,67 -35,29 -5,27 -16,57 -27,36 -21,63 -10,51 -52,17 -34,11 -3,45 -49,67 -37,37 -43,12 -53,18 -5,66 -26,17 -17,67 -19,60 -28,19 -31,70 -27,20 -11,68 -8,67 -33,38 -15,47 -51,29 -33,23 -47,23 -11,30 -45,69 -33,16 -42,19 -8,55 -25,67 -23,19 -69,7 -35,31 -28,29 -67,17 -13,31 -26,53 -19,66 -27,57 -45,65 -33,11 -5,65 -1,69 -22,67 -13,65 -51,38 -3,53 -70,27 -17,30 -25,59 -19,64 -21,19 -36,33 -36,27 -53,56 -65,24 -39,18 -37,36 -15,64 -15,28 -53,28 -45,27 -33,47 -31,69 -23,67 -5,59 -53,59 -35,19 -29,22 -47,43 -59,7 -35,42 -54,31 -21,45 -25,53 -20,51 -69,8 -12,39 -29,54 -10,45 -16,67 -29,58 -61,15 -63,2 -27,15 -57,36 -60,31 -30,43 -21,51 -21,38 -21,42 -63,18 -29,47 -17,57 -67,15 -65,3 -16,47 -13,54 -37,45 -45,14 -48,57 -25,55 -55,32 -47,17 -19,19 -41,39 -7,52 -7,45 -51,23 -53,22 -23,37 -11,56 -68,15 -50,33 -35,67 -33,24 -23,64 -15,51 -15,36 -26,61 -57,32 -15,35 -39,17 -16,39 -11,65 -13,14 -33,17 -43,25 -40,45 -63,25 -19,32 -41,8 -44,67 -3,59 -41,19 -36,13 -14,17 -17,39 -23,54 -25,63 -28,33 -19,47 -16,33 -29,65 -33,20 -31,49 -65,2 -34,45 -27,2 -11,36 -48,41 -45,25 -3,69 -42,69 -43,17 -61,29 -65,7 -31,51 -40,27 -14,63 -27,31 -10,17 -59,25 -37,17 -4,49 -19,29 -25,51 -26,21 -15,63 -64,9 -24,27 -69,5 -30,67 -3,7 -51,69 -19,57 -4,51 -48,35 -34,23 -59,3 -26,31 -37,23 -7,65 -66,7 -68,11 -42,17 -52,67 -24,41 -49,17 -33,67 -29,69 -69,19 -39,64 -14,57 -49,43 -19,22 -53,39 -47,25 -33,35 -63,9 -20,19 -58,5 -35,25 -60,3 -19,53 -22,65 -38,31 -56,49 -19,44 -67,3 -13,28 -27,41 -31,56 -50,1 -14,25 -27,23 -26,67 -65,5 -17,58 -15,61 -48,25 -35,15 -29,16 -39,67 -31,37 -57,2 -54,39 -38,13 -29,40 -23,52 -39,47 -21,29 -36,67 -25,39 -3,67 -40,13 -12,25 -59,38 -17,22 -44,63 -9,59 -47,29 -52,31 -29,67 -3,33 -21,16 -12,35 -29,59 -2,51 -47,5 -53,37 -44,19 -28,39 -45,35 -15,49 -7,39 -56,35 -31,21 -17,62 -15,59 -63,10 -63,11 -49,57 -3,49 -35,51 -43,30 -11,38 -36,43 -13,29 -47,13 -9,62 -43,23 -50,27 -12,41 -63,13 -29,3 -35,69 -12,65 -46,25 -16,27 -7,43 -47,68 -63,19 -41,7 -56,29 -58,15 -63,51 -45,9 -25,61 -36,15 -33,30 -61,22 -45,24 -59,30 -53,31 -5,69 -17,27 -27,29 -58,33 -59,40 -35,22 -47,15 -16,45 -37,40 -14,65 -44,9 -27,67 -35,36 -36,17 -33,19 -52,27 -11,45 -64,5 -41,43 -39,69 -9,53 -41,17 -43,42 -17,59 -45,29 -37,39 -21,39 -21,65 -19,37 -21,23 -65,17 -11,35 -35,1 -33,65 -47,19 -37,15 -13,21 -49,30 -20,59 -62,7 -13,70 -1,47 -61,7 -15,69 -5,67 -53,23 -39,27 -49,60 -5,56 -51,66 -37,67 -13,69 -19,39 -33,21 -7,67 -16,15 -17,61 -49,14 -15,68 -25,35 -69,9 -21,67 -46,17 -24,57 -23,68 -1,51 -43,38 -35,48 -39,16 -0,55 -65,65 -19,33 -60,9 -5,41 -67,2 -29,44 -53,69 -41,31 -17,37 -63,17 -7,42 -8,49 -7,32 -6,49 -15,37 -13,57 -33,33 -35,43 -39,29 -51,15 -29,66 -23,27 -23,61 -61,21 -25,47 -18,59 -41,35 -31,52 -30,35 -69,17 -27,59 -13,30 -49,27 -15,31 -11,53 -65,57 -15,56 -30,19 -23,62 -27,27 -24,31 -23,47 -23,23 -23,31 -29,46 -28,61 -17,41 -36,19 -7,40 -38,65 -11,66 -27,69 -37,21 -45,11 -59,18 -7,41 -59,49 -51,43 -19,49 -15,43 -55,61 -49,37 -8,65 -39,68 -61,9 -7,51 -41,32 -37,25 -19,43 -26,29 -19,56 -69,1 -43,34 -67,23 -11,69 -37,35 -69,13 -19,27 -27,19 -60,19 -32,21 -32,35 -11,47 -35,41 -66,5 -28,57 -42,63 -44,39 -51,1 -18,43 -14,53 -27,68 -41,11 -44,17 -18,19 -49,29 -52,43 -35,65 -19,15 -53,33 -27,25 -45,23 -37,51 -67,14 -9,52 -1,61 -50,19 -65,19 -27,32 -38,41 -31,35 -25,46 -53,42 -33,25 -25,29 -16,61 -21,46 -43,61 -13,37 -2,53 -13,38 -59,20 -63,20 -3,63 -13,43 -67,0 -35,23 -6,35 -21,27 -20,45 -39,43 -12,49 -7,11 -9,68 -15,42 -43,27 -41,15 -19,63 -61,23 -66,13 -25,65 -18,67 -69,12 -23,48 -27,26 -17,54 -53,68 -33,28 -21,52 -22,45 -16,63 -21,61 -29,63 -49,68 -44,65 -59,4 -51,19 -51,57 -19,69 -22,49 -37,68 -49,23 -58,21 -47,10 -34,9 -33,41 -25,64 -23,50 -25,54 -37,32 -39,42 -41,9 -29,28 -25,41 -39,21 -45,19 -19,65 -22,29 -47,38 -21,28 -50,15 -5,40 -49,65 -67,19 -36,49 -61,57 -53,2 -32,37 -43,63 -10,41 -69,21 -19,55 -20,39 -64,1 -57,38 -69,18 -17,38 -11,51 -20,63 -57,35 -21,24 -41,55 -51,70 -61,55 -19,61 -40,25 -57,27 -61,1 -39,44 -39,36 -27,21 -41,24 -21,37 -1,53 -51,58 -27,47 -57,57 -39,33 -37,33 -23,55 -40,69 -21,43 -37,46 -49,70 -46,67 -64,21 -41,13 -13,27 -45,12 -50,23 -39,66 -45,13 -19,17 -19,11 -63,1 -19,38 -17,48 -61,28 -22,59 -19,62 -37,44 -21,34 -13,39 -61,43 -37,38 -2,69 -27,64 -12,29 -53,27 -31,61 -2,63 -23,40 -23,26 -59,26 -32,39 -31,11 -43,33 -53,32 -49,45 -63,5 -21,31 -53,25 -17,43 -4,45 -23,32 -5,62 -13,45 -19,14 -57,22 -13,26 -51,27 -69,11 -39,28 -15,19 -65,20 -7,54 -5,46 -31,57 -39,45 -34,51 -7,63 -17,55 -46,9 -29,33 -26,41 -39,22 -67,25 -66,17 -69,6 -47,21 -10,29 -62,3 -16,35 -63,15 -67,5 -62,27 -7,49 -17,19 -20,41 -45,39 -61,27 -34,29 -47,64 -11,61 -51,12 -33,46 -10,61 -19,25 -23,45 -47,42 -21,69 -41,27 -59,29 -22,23 -33,43 -41,22 -31,53 -9,41 -29,31 -49,61 -9,45 -5,55 -33,44 -27,62 -1,21 -23,35 -47,37 -25,25 -44,23 -30,69 -61,19 -22,57 -0,51 -31,15 -53,65 -60,1 -46,13 -25,23 -65,13 -51,16 -17,66 -0,15 -29,51 -9,60 -39,19 -5,19 -39,15 -41,20 -33,15 -51,26 -4,67 -43,67 -51,21 -48,39 -9,49 -22,35 -32,43 -43,16 -21,33 -47,45 -51,31 -28,53 -48,37 -19,20 -57,1 -35,35 -14,41 -23,53 -31,24 -57,19 -21,41 -41,10 -15,60 -70,17 -43,13 -41,30 -35,21 -52,59 -47,16 -55,1 -47,62 -24,33 -35,26 -19,50 -39,41 -30,65 -37,41 -5,39 -51,22 -65,44 -49,25 -20,67 -9,65 -27,56 -39,65 -30,31 -11,55 -5,49 -43,43 -9,58 -14,47 -49,63 -23,69 -67,24 -68,5 -47,20 -45,47 -65,45 -11,59 -5,61 -60,51 -36,23 -63,27 -50,59 -41,36 -55,21 -36,39 -55,58 -7,47 -45,43 -17,63 -32,19 -34,41 -33,48 -30,1 -11,39 -1,65 -43,28 -47,69 -32,41 -39,35 -13,60 -33,68 -49,9 -3,48 -43,69 -12,63 -65,12 -14,67 -12,55 -9,40 -49,64 -65,9 -68,21 -26,57 -38,25 -31,31 -41,23 -43,29 -59,19 -28,51 -19,54 -49,12 -15,24 -63,48 -13,61 -23,17 -29,49 -5,60 -27,24 -60,29 -27,49 -35,45 -17,35 -69,2 -15,32 -26,39 -29,27 -1,67 -23,41 -21,36 -23,43 -62,5 -35,11 -48,65 -25,68 -17,45 -13,47 -31,0 -31,65 -59,5 -13,23 -15,53 -27,35 -41,62 -59,22 -58,39 -53,17 -16,55 -54,23 -15,52 -33,31 -49,32 -9,64 -24,39 -13,67 -25,43 -38,27 -25,49 -36,31 -15,41 -65,11 -15,57 -67,1 -39,20 -29,57 -5,68 -25,57 -31,30 -19,59 -49,15 -31,41 -21,35 -59,24 -32,53 -3,61 -47,39 -7,53 -51,33 -45,21 -1,59 -37,27 -38,21 -57,30 -22,61 -21,17 -33,37 -7,55 -29,42 -9,5 -9,67 -52,63 -19,67 -53,1 -44,36 -34,34 -60,18 -62,64 -38,2 -22,40 -25,40 -28,45 -22,13 -20,37 -28,9 -28,64 -68,0 -0,6 -34,38 -63,40 -66,66 -12,16 -21,56 -26,15 -0,54 -20,44 -52,10 -70,55 -54,33 -22,47 -69,20 -32,36 -21,48 -28,40 -0,14 -2,50 -5,70 -28,8 -15,6 -58,9 -36,51 -46,28 -8,14 -64,6 -0,56 -58,29 -64,55 -26,51 -17,4 -30,54 -14,24 -68,26 -14,35 -68,22 -26,2 -30,38 -17,16 -28,11 -37,14 -62,16 -23,42 -26,68 -42,7 -60,20 -40,49 -14,12 -68,12 -26,44 -28,37 -35,50 -70,43 -66,58 -48,56 -46,30 -34,48 -16,14 -62,15 -41,2 -56,6 -31,16 -50,70 -24,20 -64,58 -59,14 -6,6 -19,2 -10,66 -25,20 -54,46 -41,16 -55,50 -10,28 -42,42 -38,45 -26,34 -59,8 -12,36 -10,23 -58,35 -47,66 -60,46 -40,54 -16,8 -36,16 -56,39 -70,36 -30,4 -35,32 -54,63 -8,36 -38,10 -30,70 -4,41 -0,48 -25,10 -34,52 -20,4 -56,44 -67,4 -38,44 -18,37 -6,60 -60,47 -6,66 -27,18 -35,12 -37,8 -8,48 -18,53 -30,50 -36,50 -35,24 -22,3 -55,8 -20,24 -70,65 -4,68 -25,42 -8,68 -42,5 -30,55 -70,60 -18,33 -23,36 -35,8 -40,28 -34,13 -42,4 -26,32 -54,67 -29,2 -39,6 -68,48 -0,16 -8,35 -18,5 -38,12 -32,10 -48,13 -70,57 -19,0 -46,23 -42,36 -38,35 -39,14 -11,70 -34,59 -24,40 -70,64 -70,52 -45,28 -24,21 -4,6 -66,62 -62,29 -25,34 -34,21 -36,37 -4,54 -39,70 -46,6 -26,58 -30,27 -36,56 -44,5 -59,6 -65,18 -64,17 -38,24 -57,12 -34,12 -66,42 -15,18 -30,13 -69,60 -21,40 -25,4 -54,66 -26,26 -34,39 -31,58 -62,39 -12,23 -2,48 -32,1 -28,32 -62,52 -32,59 -50,18 -17,6 -44,12 -42,46 -48,15 -8,15 -62,13 -28,15 -70,22 -35,30 -48,22 -2,62 -41,64 -10,38 -64,44 -41,68 -48,1 -70,37 -8,39 -24,52 -58,42 -25,8 -6,57 -18,46 -67,28 -36,24 -70,5 -63,42 -6,67 -18,48 -38,20 -14,0 -10,37 -26,24 -70,34 -58,60 -61,36 -64,26 -24,25 -62,46 -44,64 -55,10 -25,14 -4,26 -4,34 -14,44 -42,14 -37,20 -10,33 -37,26 -34,40 -10,46 -52,16 -3,66 -4,35 -66,53 -67,58 -31,44 -70,31 -38,59 -68,28 -40,11 -6,38 -52,29 -28,35 -52,37 -30,5 -14,9 -18,28 -43,48 -68,49 -38,39 -46,16 -13,32 -12,13 -53,8 -52,0 -60,28 -68,9 -52,39 -36,30 -40,66 -13,20 -27,60 -18,10 -46,32 -8,31 -39,40 -70,59 -58,56 -50,34 -60,40 -70,32 -64,52 -30,29 -58,62 -32,56 -35,10 -38,53 -51,18 -56,62 -18,6 -37,30 -44,37 -67,66 -10,30 -1,70 -66,16 -50,36 -28,58 -30,45 -0,70 -28,44 -20,3 -62,28 -30,30 -15,22 -17,0 -48,40 -6,36 -30,23 -13,24 -54,22 -68,6 -67,30 -32,2 -36,11 -37,16 -0,49 -62,25 -8,13 -22,32 -40,43 -44,32 -38,28 -0,18 -30,37 -29,50 -46,69 -32,25 -46,10 -70,1 -1,4 -56,28 -62,18 -55,28 -36,25 -14,36 -38,58 -66,47 -20,16 -50,32 -16,41 -58,2 -54,20 -55,2 -1,58 -30,17 -60,16 -64,64 -68,24 -32,20 -66,44 -50,64 -36,18 -14,40 -12,52 -24,64 -28,50 -14,50 -36,3 -48,0 -50,60 -50,30 -63,24 -70,3 -27,12 -30,0 -42,35 -60,38 -54,34 -31,26 -22,46 -4,63 -38,50 -58,31 -49,56 -16,36 -8,20 -4,66 -62,48 -2,4 -6,54 -13,34 -36,8 -63,14 -38,17 -26,12 -20,32 -52,38 -11,52 -46,1 -48,19 -38,33 -44,28 -56,56 -54,58 -43,4 -64,50 -32,46 -45,18 -14,26 -63,54 -42,8 -68,20 -56,24 -14,31 -34,35 -70,30 -67,18 -0,67 -40,2 -58,52 -23,28 -58,27 -50,68 -10,49 -40,65 -52,4 -20,27 -62,10 -56,50 -60,14 -59,0 -62,6 -48,28 -57,20 -38,48 -20,35 -10,55 -62,20 -68,16 -42,68 -24,55 -61,70 -12,2 -53,4 -62,1 -15,14 -70,4 -37,34 -63,32 -49,0 -0,52 -60,52 -63,66 -3,62 -20,17 -12,32 -62,50 -65,68 -10,19 -14,28 -9,0 -26,30 -4,27 -39,56 -42,29 -60,24 -68,7 -59,42 -51,48 -29,8 -54,43 -49,36 -24,28 -30,7 -6,61 -55,34 -9,12 -31,40 -20,64 -50,0 -66,21 -19,18 -4,2 -30,47 -2,5 -7,20 -33,4 -24,1 -7,60 -40,24 -46,20 -49,4 -36,34 -8,18 -50,40 -12,7 -6,39 -46,46 -29,14 -50,38 -22,30 -61,32 -58,69 -32,38 -11,42 -0,22 -56,54 -10,31 -49,62 -65,4 -24,14 -44,33 -47,18 -7,28 -16,49 -42,60 -64,20 -50,48 -36,61 -1,44 -56,25 -26,38 -36,59 -14,34 -32,34 -29,0 -8,41 -67,40 -60,65 -19,70 -0,19 -4,64 -29,38 -26,50 -24,48 -25,56 -60,10 -3,68 -8,2 -56,34 -18,64 -51,64 -42,32 -59,46 -14,39 -0,31 -2,37 -40,37 -52,22 -16,70 -1,52 -58,59 -2,26 -6,64 -42,45 -12,18 -54,1 -45,46 -39,26 -52,33 -2,61 -65,66 -36,0 -42,23 -24,46 -64,36 -45,30 -43,56 -60,57 -44,20 -61,68 -16,3 -44,56 -57,40 -12,58 -10,26 -42,58 -31,54 -12,31 -48,34 -59,44 -70,11 -1,54 -40,18 -70,63 -27,10 -2,20 -46,49 -26,69 -30,10 -31,20 -32,70 -30,64 -52,48 -10,9 -38,6 -52,28 -24,24 -48,24 -70,46 -1,6 -44,21 -20,66 -12,53 -5,48 -51,68 -40,23 -63,56 -4,3 -64,4 -51,10 -14,11 -65,60 -53,70 -2,2 -34,61 -24,2 -48,59 -67,12 -8,52 -26,4 -9,44 -9,48 -44,2 -41,48 -21,32 -24,70 -20,15 -25,28 -26,1 -21,30 -4,56 -17,14 -4,36 -12,22 -14,62 -54,42 -52,1 -2,1 -28,2 -31,42 -14,8 -11,58 -49,20 -52,44 -42,13 -54,57 -70,19 -2,52 -3,20 -47,28 -70,12 -52,23 -3,0 -64,0 -70,40 -22,22 -39,24 -32,69 -22,48 -19,52 -36,69 -27,46 -22,19 -63,30 -16,52 -64,69 -28,1 -43,0 -22,42 -50,56 -35,38 -4,37 -62,4 -28,27 -51,44 -22,8 -19,58 -12,9 -58,30 -51,8 -15,46 -60,17 -6,1 -16,59 -6,16 -10,4 -0,68 -14,58 -27,22 -69,62 -0,53 -36,57 -24,68 -20,68 -54,53 -2,25 -2,8 -52,53 -33,22 -27,52 -66,15 -6,47 -31,38 -54,19 -68,34 -50,6 -23,70 -1,42 -64,27 -41,58 -33,42 -60,56 -32,18 -12,68 -42,38 -54,62 -52,20 -36,22 -47,24 -34,46 -49,26 -9,66 -25,30 -38,14 -46,34 -56,66 -52,6 -36,70 -58,40 -35,52 -28,43 -16,50 -8,42 -61,10 -42,31 -67,16 -21,2 -54,70 -10,50 -26,55 -34,16 -34,8 -12,6 -32,45 -26,6 -56,68 -69,24 -42,9 -45,40 -48,8 -64,14 -30,62 -13,42 -46,4 -16,25 -48,31 -46,58 -40,40 -46,68 -48,20 -56,4 -8,40 -10,14 -20,31 -61,20 -34,24 -68,68 -14,18 -1,46 -62,65 -46,55 -18,55 -24,66 -48,10 -16,38 -11,14 -21,22 -22,38 -28,22 -2,24 -15,66 -22,50 -19,28 -68,51 -58,25 -14,15 -64,56 -46,48 -38,67 -56,9 -12,62 -43,24 -36,10 -60,0 -2,10 -28,60 -53,44 -18,39 -28,42 -6,10 -68,44 -18,49 -68,32 -27,66 -0,44 -4,10 -29,68 -40,9 -61,44 -24,32 -9,70 -10,69 -8,56 -65,14 -25,48 -0,33 -3,32 -42,57 -40,15 -60,21 -22,69 -21,10 -20,36 -64,51 -12,1 -40,46 -48,6 -22,44 -8,24 -18,12 -54,4 -54,10 -22,39 -34,62 -64,40 -18,52 -0,25 -0,57 -38,55 -64,45 -0,35 -36,55 -0,41 -45,10 -64,16 -24,58 -56,58 -64,42 -12,46 -22,10 -38,52 -20,56 -54,41 -62,53 -4,60 -64,12 -10,7 -59,32 -20,2 -32,14 -42,50 -56,1 -50,49 -4,39 -7,24 -38,3 -69,68 -66,4 -67,32 -42,21 -4,53 -35,44 -20,53 -68,18 -0,65 -38,63 -70,53 -64,54 -35,4 -54,65 -53,0 -58,70 -63,52 -20,50 -32,16 -32,54 -47,36 -50,61 -34,27 -65,56 -65,0 -50,39 -16,10 -22,70 -10,36 -32,66 -38,8 -37,0 -4,14 -28,49 -4,12 -48,67 -59,70 -42,48 -28,56 -2,31 -64,24 -7,70 -43,18 -2,12 -10,32 -62,44 -26,70 -30,68 -4,46 -58,50 -49,58 -45,50 -8,59 -41,0 -10,24 -18,60 -60,54 -0,69 -26,5 -56,18 -60,15 -10,58 -5,12 -0,9 -22,34 -14,51 -3,60 -18,70 -69,50 -64,48 -69,10 -4,42 -8,38 -40,22 -30,60 -15,0 -28,3 -27,40 -56,70 -5,30 -42,26 -2,28 -39,8 -34,60 -34,26 -34,49 -4,29 -34,36 -33,52 -40,32 -54,8 -3,46 -10,68 -42,70 -8,26 -34,66 -15,8 -21,44 -5,26 -44,40 -50,31 -40,4 -68,10 -43,54 -4,62 -52,66 -16,22 -32,32 -62,0 -6,46 -28,23 -42,52 -53,26 -10,25 -42,54 -56,67 -60,26 -19,34 -60,30 -46,37 -10,56 -12,10 -66,25 -60,69 -19,46 -23,16 \ No newline at end of file diff --git a/2024/gareth/day19/day19.go b/2024/gareth/day19/day19.go deleted file mode 100644 index cf151af..0000000 --- a/2024/gareth/day19/day19.go +++ /dev/null @@ -1,90 +0,0 @@ -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 -} diff --git a/2024/gareth/day19/day19_test.go b/2024/gareth/day19/day19_test.go deleted file mode 100644 index cb0ed02..0000000 --- a/2024/gareth/day19/day19_test.go +++ /dev/null @@ -1,35 +0,0 @@ -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) -} diff --git a/2024/gareth/day19/input.txt b/2024/gareth/day19/input.txt deleted file mode 100644 index 9547196..0000000 --- a/2024/gareth/day19/input.txt +++ /dev/null @@ -1,402 +0,0 @@ -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 \ No newline at end of file diff --git a/2024/gareth/main.go b/2024/gareth/main.go index 9ef4db9..99d93ff 100644 --- a/2024/gareth/main.go +++ b/2024/gareth/main.go @@ -1,7 +1,7 @@ package main import ( - "aoc2024/day09" + "aoc2024/day04" "fmt" "os" "time" @@ -9,11 +9,9 @@ import ( func main() { start := time.Now() - data, _ := os.ReadFile("day09/input.txt") - fmt.Printf("part 1: %d\n", day09.Part1(string(data))) - fmt.Printf("part 2: %d\n", day09.Part2(string(data))) + data, _ := os.ReadFile("day04/input.txt") + fmt.Printf("part 1: %d\n", day04.Part1(string(data))) + fmt.Printf("part 2: %d\n", day04.Part2(string(data))) elapsed := time.Since(start) fmt.Printf("Execution time: %s\n", elapsed) } - -// 6320029754031 diff --git a/2024/go/day10/day10.go b/2024/go/day10/day10.go deleted file mode 100644 index b52a587..0000000 --- a/2024/go/day10/day10.go +++ /dev/null @@ -1,103 +0,0 @@ -package day10 - -import ( - "adventofcode2024/utils" - "adventofcode2024/utils/grid2d" - "adventofcode2024/utils/inputs" - "fmt" -) - -type Position struct { - height int - summit bool -} - -func Part1(input string) int { - score := 0 - i := 0 - grid := inputs.ToGrid2D(input, "\n", "", Position{height: -1}, func(c string) Position { return Position{summit: false, height: utils.MustAtoi(c)} }) - fmt.Println(grid.StringWithFormatter(formatter)) - for y := 0; y < grid.SizeY(); y++ { - for x := 0; x < grid.SizeX(); x++ { - position := grid.Get(x, y) - if position.height != 0 { - continue - } - wipe_summit(grid) - score += getScore(x, y, 0, 0, grid) - fmt.Printf("Trailhead %d (%d,%d) paths: %d\n", i, x, y, score) - i++ - } - } - return score -} - -func Part2(input string) int { - score := 0 - i := 0 - grid := inputs.ToGrid2D(input, "\n", "", Position{height: -1}, func(c string) Position { return Position{summit: false, height: utils.MustAtoi(c)} }) - fmt.Println(grid.StringWithFormatter(formatter)) - for y := 0; y < grid.SizeY(); y++ { - for x := 0; x < grid.SizeX(); x++ { - position := grid.Get(x, y) - if position.height != 0 { - continue - } - wipe_summit(grid) - score += getScore2(x, y, 0, 0, grid) - fmt.Printf("Trailhead %d (%d,%d) paths: %d\n", i, x, y, score) - i++ - } - } - return score -} - -func formatter(p Position, x int, y int) string { - return fmt.Sprintf("%v", p.height) -} - -func wipe_summit(grid *grid2d.Grid[Position]) { - for y := 0; y < grid.SizeY(); y++ { - for x := 0; x < grid.SizeX(); x++ { - pos := grid.Get(x, y) - if pos.height == 9 && pos.summit { - pos.summit = false - grid.Set(x, y, pos) - } - } - } -} - -func getScore(x, y, level, score int, grid *grid2d.Grid[Position]) int { - directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}} - for _, dir := range directions { - x1 := x + dir[0] - y1 := y + dir[1] - nposition := grid.Get(x1, y1) - if level == 8 && nposition.height == 9 { - score++ - } - if nposition.height != level+1 { - continue - } - score = getScore(x1, y1, nposition.height, score, grid) - } - return score -} - -func getScore2(x, y, level, score int, grid *grid2d.Grid[Position]) int { - directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}} - for _, dir := range directions { - x1 := x + dir[0] - y1 := y + dir[1] - nposition := grid.Get(x1, y1) - if level == 8 && nposition.height == 9 { - score++ - } - if nposition.height != level+1 { - continue - } - score = getScore2(x1, y1, nposition.height, score, grid) - } - return score -} diff --git a/2024/go/day10/day10_test.go b/2024/go/day10/day10_test.go deleted file mode 100644 index 5b8f7a2..0000000 --- a/2024/go/day10/day10_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package day10 - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestPart1(t *testing.T) { - r := Part1(`89010123 -78121874 -87430965 -96549874 -45678903 -32019012 -01329801 -10456732`) - require.Equal(t, 36, r) -} - -func TestPart2(t *testing.T) { - r := Part2(`89010123 -78121874 -87430965 -96549874 -45678903 -32019012 -01329801 -10456732`) - require.Equal(t, 81, r) -} diff --git a/2024/go/day10/input.txt b/2024/go/day10/input.txt deleted file mode 100644 index df5bfc9..0000000 --- a/2024/go/day10/input.txt +++ /dev/null @@ -1,56 +0,0 @@ -43217654309879876104563234589896761012345656543098901001 -34108903212368123233472105676787851299856567832187812652 -45677814301457014312986345589876940387765678943046543743 -56789325100876525800345276430105432456566589858956769821 -65438456912963436901236187621234501223455410767349874430 -74321067803451107898547093412012982016764323101210143561 -89412210987430210789698892102123673107895214589723652678 -78601521856521345678721743089034543212345605679854781789 -66789430545678934505430654898745672212236765434765690878 -55676545038943213216765989601654981300129870121012345969 -46543216127657804389834808762347690456789983498141456452 -65454307233456934870126712354878765565210012507230987321 -54567898332110125961015645403969234674323215616546576010 -65658983021001876854324106912452128789321308723455678901 -76543212137892965348933217832141089873410419678964987652 -89862901236543501267018363101033210565566566569873788543 -89871876544345652106529854892123521454479877654012699830 -78100703454278743212434763763014672343287778943210581021 -65210212565189858906763212654985785650198961212101432010 -54321056876012567875898708783476698763267890303215678321 -87012567988703489874345679692676543294986725456574329478 -96543498589876530365210189501987650187675216987687610569 -01234567651010921234501076401236501010564307678596789876 -10389830532329854376542345321545692323403018789455430965 -21456721013456765289031234980098783410912129670320121054 -92505432565421010109120345671107654567823451061210120123 -87615443478302341018750134543234541050765962552121234984 -34322342189219650129665234789432132021894873443010965673 -45451056077828743234574343276543032134703210523457876532 -51069987456943104545987650167898749865612309610765454101 -32678678345652210698092156756547056764303458779890363232 -43010589232781306787183045876532178965210569888211274321 -56923432101090458989254234923421369878934678898302989430 -87889211078764567876360143010030450767125986567401276589 -96676305669653478985478652102141341458076803456564345676 -45435434734522780340349760123456232349883712678178737894 -80127821821011091211299854354987101016792103549069016323 -92346940910329654304587121267807652345013401232108925412 -81055432101458765643671010871018947654324589543987432101 -76567789023467010782532346965425638945695678654986540012 -05498654110567821891047897212334721032786014345678901098 -12387013223489932346156598101549889821012823216765212387 -03456323016576542345692367210678710701296954907854323456 -12345465437895431016781450123467623654387867878985401501 -21089870124326528701670101874345634565676541045621032012 -32189210065017019632543210965236730120545632456734548743 -43498349876298903545450143050159821321234012349895699654 -34567658389101232123469052101567634489234510106786789985 -99876501276788943016578769872498105672105621215021058876 -87035432365897654107689898763343234321678789334134567655 -70129641034781089898791099854232145690569245493254321567 -63238701123654178718982387763156056781410126787655010498 -54345652321073265001073456012047189872328901098546710327 -34568543434589874132569895145438976987437812361239891210 -21879654898678013203456701236327805456546521450967890123 -30968745467654320112345210987610112345545430567856543234 diff --git a/2024/go/day11/day11.go b/2024/go/day11/day11.go deleted file mode 100644 index c040fb0..0000000 --- a/2024/go/day11/day11.go +++ /dev/null @@ -1,76 +0,0 @@ -package day11 - -import ( - "adventofcode2024/utils" - "fmt" - "strconv" - "strings" -) - -func Part1(input string) int { - stones := strings.Fields(input) - for i := 0; i < 25; i++ { - n_stones := []string{} - for _, stone := range stones { - switch { - case stone == "0": - n_stones = append(n_stones, "1") - case len(stone)%2 == 0: - d1 := strconv.Itoa(utils.MustAtoi(stone[0 : len(stone)/2])) - d2 := strconv.Itoa(utils.MustAtoi(stone[len(stone)/2:])) - n_stones = append(n_stones, d1) - n_stones = append(n_stones, d2) - - default: - n_stones = append(n_stones, fmt.Sprintf("%d", utils.MustAtoi(stone)*2024)) - } - } - stones = n_stones - } - return len(stones) -} - -func Part2(input string) int { - stones := strings.Fields(input) - smap := make(map[string]int) - smap2 := make(map[string]int) - - for _, stone := range stones { - smap[stone] = 1 - } - for i:=0;i<75;i++ { - for k, v := range smap { - switch { - case k == "0": - smap2["1"] = smap2["1"] + v - case len(k)%2 == 0: - d1 := strconv.Itoa(utils.MustAtoi(k[0 : len(k)/2])) - d2 := strconv.Itoa(utils.MustAtoi(k[len(k)/2:])) - smap2[d1] += v - smap2[d2] += v - default: - k2 := fmt.Sprintf("%d", utils.MustAtoi(k)*2024) - smap2[k2] += v - } - } - smap = CopyMap(smap2) - smap2 = make(map[string]int) - } - count := 0 - for _, v := range smap { - count += v - } - return count -} - -func CopyMap(original map[string]int) map[string]int { - // Create a new map to hold the copy - copied := make(map[string]int) - - // Copy each key-value pair from the original map to the new map - for key, value := range original { - copied[key] = value - } - - return copied -} diff --git a/2024/go/day11/day11_test.go b/2024/go/day11/day11_test.go deleted file mode 100644 index ed2a8c3..0000000 --- a/2024/go/day11/day11_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package day11 - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestPart1(t *testing.T) { - r := Part1("125 17") - require.Equal(t, 55312, r) -} - -func TestPart2(t *testing.T) { - r := Part2("125 17") - require.Equal(t, 55312, r) -} diff --git a/2024/go/day11/input.txt b/2024/go/day11/input.txt deleted file mode 100644 index c42d5d7..0000000 --- a/2024/go/day11/input.txt +++ /dev/null @@ -1 +0,0 @@ -3 386358 86195 85 1267 3752457 0 741 diff --git a/2024/go/day12/day12.go b/2024/go/day12/day12.go deleted file mode 100644 index 447d522..0000000 --- a/2024/go/day12/day12.go +++ /dev/null @@ -1,146 +0,0 @@ -package day12 - -import ( - "adventofcode2024/utils/grid2d" - "adventofcode2024/utils/inputs" - "fmt" - -) - -type Plot struct { - crop string - visited bool - region int - x int - y int -} - -type Region struct { - plots []Plot - crop string - id int - area int - perimteter int - sides int -} - -func Part1(input string) int { - var val int - region_id := 0 - regions := make(map[int]Region) - grid := inputs.ToGrid2D(input, "\n", "", Plot{}, func(c string) Plot { return Plot{crop: c, region: -1} }) - fmt.Println(grid.StringWithFormatter(formatter)) - for y := 0; y < grid.SizeY(); y++ { - for x := 0; x < grid.SizeX(); x++ { - var region Region - plot := grid.Get(x, y) - if plot.visited { - continue - } - - region_id++ - region = Region{id: region_id, area: 1, crop: plot.crop, sides: 4} - plot.region = region_id - plot.visited = true - plot.x = x - plot.y = y - grid.Set(x, y, plot) - region.plots = append(region.plots, plot) - regions[region_id] = region - - try_neighours(grid, ®ion, x, y) - regions[region.id] = region - } - } - for _, region := range regions { - val += region.area * region.perimteter - } - return val -} - -func Part2(input string) int { - var val int - region_id := 0 - regions := make(map[int]Region) - grid := inputs.ToGrid2D(input, "\n", "", Plot{}, func(c string) Plot { return Plot{crop: c, region: -1} }) - fmt.Println(grid.StringWithFormatter(formatter)) - for y := 0; y < grid.SizeY(); y++ { - for x := 0; x < grid.SizeX(); x++ { - var region Region - plot := grid.Get(x, y) - if plot.visited { - continue - } - - region_id++ - region = Region{id: region_id, area: 1, crop: plot.crop} - plot.region = region_id - plot.visited = true - plot.x = x - plot.y = y - grid.Set(x, y, plot) - region.plots = append(region.plots, plot) - regions[region_id] = region - - try_neighours(grid, ®ion, x, y) - regions[region.id] = region - } - } - for _, region := range regions { - val += region.area * get_sides(grid, region) - } - return val -} - -func formatter(p Plot, x int, y int) string { - return fmt.Sprintf("%v", p.crop) -} - -func try_neighours(grid *grid2d.Grid[Plot], region *Region, x int, y int) { - - directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}} - plot := grid.Get(x, y) - perimeters := 0 - - for _, dir := range directions { - x1 := x + dir[0] - y1 := y + dir[1] - nplot := grid.Get(x1, y1) - - if nplot.crop == plot.crop { - if !nplot.visited { - region.area++ - nplot.visited = true - nplot.region = plot.region - nplot.x = x1 - nplot.y = y1 - grid.Set(x1, y1, nplot) - region.plots = append(region.plots, nplot) - try_neighours(grid, region, x1, y1) - } - } else { - perimeters++ - } - } -} - -func get_sides(grid *grid2d.Grid[Plot], region Region) int { - sides := 0 - corners := [][][]int{{{-1, 0}, {0, -1}, {-1, -1}}, - {{+1, 0}, {0, -1}, {+1, -1}}, - {{-1, 0}, {0, +1}, {-1, +1}}, - {{+1, 0}, {0, +1}, {+1, +1}}} - for _, plot := range region.plots { - for _, o_corners := range corners { - c1 := grid.Get(plot.x + o_corners[0][0], plot.y + o_corners[0][1]) - c2 := grid.Get(plot.x + o_corners[1][0], plot.y + o_corners[1][1]) - c3 := grid.Get(plot.x + o_corners[2][0], plot.y + o_corners[2][1]) - if c1.crop != region.crop && c2.crop != region.crop { - sides++ - } else if c1.crop == region.crop && c2.crop == region.crop && c3.crop != region.crop { - sides++ - } - } - } - return sides -} \ No newline at end of file diff --git a/2024/go/day12/day12_test.go b/2024/go/day12/day12_test.go deleted file mode 100644 index 1602d7c..0000000 --- a/2024/go/day12/day12_test.go +++ /dev/null @@ -1,29 +0,0 @@ -package day12 - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestPart1(t *testing.T) { - r := Part1(`RRRRIICCFF -RRRRIICCCF -VVRRRCCFFF -VVRCCCJFFF -VVVVCJJCFE -VVIVCCJJEE -VVIIICJJEE -MIIIIIJJEE -MIIISIJEEE -MMMISSJEEE`) - require.Equal(t, 1930, r) -} - -func TestPart2(t *testing.T) { - r := Part2(`AAAA -BBCD -BBCC -EEEC`) - require.Equal(t, 80, r) -} diff --git a/2024/go/day12/input.txt b/2024/go/day12/input.txt deleted file mode 100644 index d0b3daa..0000000 --- a/2024/go/day12/input.txt +++ /dev/null @@ -1,140 +0,0 @@ -UUUUUUUUUUUUUUUUUUUDQQQQQQQOOOOOHHSSSSSYYYYYYYYGGGGNNNNNNNNTTTTTTTTTTTTTTDDDDDDDDDDDDDDDDDDNNNCCNJJJJOOHHHDDDDDDDDDDDDDDDDDDXXMBBBBMMCCCCCCC -UUUKUUUUUUUUUUUUUDDDDDDDQQQOOOOOOOOOSSSSSYYYYYYYYGGGGGNNNNTTTTTTTTTTTTTTTTTTTTDDDDDDIIDDDNNNNNCCNJJJOOOHDDDDDDDDDDXDDDDDDDMMMXMMMMMMMMCCCCCC -UUUKKUUUUUUWUUUUUUDDDDDDDDDROOOOOOOWWSSSSYYYYYYYGGGGGGGQNTTTTTTTTTTTTTTTTTTTTTDDDDDDDIDIINNNNLNNNNOOOOODDDDDDDDDDXXDDDDDDDMMMMMMMMMMMMCCCCCC -UUKKUUKKXUUUUUUUUDDDDDDDDDDDDOOOOOOOOYSSSSSYYYYYGGGGGGQQNNTTTTTTTTTTTTTTTTTTTTDDDDDIDIIIINNNNNNNNNNOOOODDDDDDDXDDXXDDDDDDDMMMMMMMMMMMMMMCCCC -UUKKUKKKXXUQQQQUUDDDDDDDDDDDDOOOOOOOOYYYYYYYYYYYGGGGGQQIINTTTTITTTTTTTTTTTTTTTTDDDIIIIIIIINNNNNNNNNOOODDDDDDDDXXXXXXDDDDDMMMMMMMMMMMMFFFFCCC -UKKKKKKKXKAWWWWWDDDDDDDDDDDDDOOOOUUOYYYYYYYYYYYYGGGGQQQQIIDITIIIITTTTTTTTTTTTTDDDDIIIIIIINNNNNNNNLLLLODDDDDDXXXXXXXXDXDDDMMMMMMMMMMMMFFFFCCC -KKKKKKKKKKKWWWWKDPPDDDDDDDWWWOOOOOUUYYYYYYYYYYYYYGRQQQQQIIIIIIIIITTTTTTTTTTTDDDDDDIIIIIIIIINNNNNNNLLLLLDDDDDXXXXXXXXXXDDDDDMMMMMMMMMMFFFCCCC -KKKKKKKKKKWWWWWWDDDDDDDDDSWWWOWOOOOUYYAYYYYYYYYYYYQQQQQIIIIIIIIOIITTTTTTTTTTDDDDIIIIIIIIIIINNNNNLNNNLLLDDDDDDXXXXIXYDDDDDDDMMMMMMMMMMFFFCFCC -KKKKKKKKWWWWWWWWSSDSDDDDDSSWWWWOOOOUYYAYYYYYYYYYYQQQQQQIIIIIIIIIITTTTTTTTTTDDDIIIIIIIIIIIINNNNNNLLLLLLLDDDDDDXXXXIXYDDDQDDDMMMMMMMUMFFFFFFFC -KKKKKKKWWWWWWWWWSSSSDSDSSSSWWWWWOOOUYYYYYYYYYYYYYYQQQQIIIIIIIIIIIIIXXXXXTTTTDIIIIIIIIIIIKINNLNNNLLLLZLLLLDDVDXXXXXYYDDQQDDTMMYYYMMUUUFFFFFCC -KKKKKKKKWWWWWWWWWWSSSSSSSSSSWWWWWWOUYPPPPPYYYYYYQQPQQQQAIIIIIIIIISSXXXXXXXTTDIIIIIIIIIIIIIIILLLLLLLLZZLLLDDDXXXXXXXYYDXXXYMMMYYYYMPUUFFFFFFC -KKKKKKKKWWWWWWWWWWBBBBSSSSSWWWWWWWSSPPPPWWWWWWAYPPPPQAAAAITTIIIIIXXXXXXXUTTXXXIIIIIIIIIIIIIOLLLLLLLLZZLLLLLLLLXXXXYYXXXXXXXXRPPPPPPPPPFFCCFC -KKKKKKDWWWWWWWWWWWDDBBBSSSSWWWWWWWWSSPPPPWWWWWWWPPPPPAAAAIIIIIIIIXXXXXXXXXDXXIIIIIIIIIIIIIIOLLLLLLLZZZZZZLLLLNXNNXNYYYXXXXXXPPPPPPPPPPFFCCCC -KKKKKKWWWWWWWWWWWWBBBBBBBSSSWWWWWWWSSSSPPWWWWWWWPPPPPAAAAAAIIIIIIIXXUUUUUUXXXXIIIIIIIIIIIIIILLLLLLLZZZZZZZLLLNNNNNNYYYXXXXXXPPPPPPPPPPCFCCCC -KTKQQKWWWWWWWWWWBWBBBBBBBSBSWWWWWSSSSSPPPWWWWWWWWPPPPPPAAFAIIYYYUUUUUUUUUUUXXXQQQIIIXXXXXXXXXXLLLLLZZZZZZZZZLNNNNNNYYXXXXXXXPPPPPPPPPPCCCCCC -QQKAQQWWWWWWWWWWBWBBBBBBBBBSWWWSSSSSSSSPPWWWWWWWPPPPPPPPPPYYYYYYUUUUUUUUUUUQXQQQQQQIXXXXXXXXXXLZLLEZZZZZZZZZLNNPNNNYYXXXXXPXPPPPPPPPPPPCCCCC -QQQQQQQWWWWWWWWWBBBBBBBBBBVWWWDDSSSSSSSSSPWWWPPPPPPPPPPPPPYYYYYYUUUUUUUUUUUUUUUUQQIIXXXXXXXXXXLZZZZZZZZZZZZLLUUUUUUUUXXXXXPPPPPPPPPPPPCCCCCC -QQQQQQQQWWWWWWWWBBBBMMMBBBMWWWDSSSSSSSSSSPPPPPPPPPPPPPPPYYYYYYYBYYXXXXXUUUUUUUUUOIIIIZZZZZLLLZZZZZZZZZZZZZZZZIIIIUUUUUXPPXPPPPPPPPPPYYCCCCCC -QQQQQQQQQWWZZZWMMMMMMMMMBMMWWDDSSSSSSSSSSSPPPPPPPPPPPPPPYYYYYYYYYXXXXXXUUUUUUUUUOOIIIZZZZLLLLLZZZZZFFFFFFFFFHHHIUUUUUPPPPPPPYPPYPPPYYYCCCCCC -QQQQQQLQQQWWZZZMMMMMMMMMMMHHWSSSSSSSSSSSPPPPPPPPPPPPPPYYYYYYYYYYXXXXXXXUUUUUUUUUOIIIIIZLLLLLLZZZZZZFFFFFFFFFHHHIUMUUUPPPPPPPYYYYYYYYYYYCCCYC -QQQQQLLQLLZZZZMMMMMMMMMMMMMMWSSSSSSSSSSSPPPPPPPPPBYPPPYYYYYYYYYYYYXXXXXUUUUUUUUUIIIIIIIILLZZZZZZZZZFFFFFFFFFHHFFFFQUULLPPPPPQYYYYYRYYYYYYYYY -QQQLLLLLLLLZZZMMMMMMMMMMMMMMNMSSSSSSSSSSVVPPPPPPBBYYYYYYYYYYYYYYYYYXXXXUUUUUUUUUOIIIIILLLLZZZZZZZZZFFFFFFFFFFFFFFFFUUMMPPPPPYYYYYYYYYYYYYYAA -QQQLLLLLLLLZZZZMMMMMMMMMMMMMMMSSSSSSSSSSVVPPPBBBBBBYYYGGGGGGGGGYYYYYYYYUUUUUUUUUIIIIILLLLZZZZZZZZZZFFFFFFFFFFFFFFFFMMMOPPPPGYYYYYYYYYYYYYYYA -QQLLLLLLLLZZZZMMMMMMMMMMMMMMMSSSSSSSSRRSVVVVVVBBBBBYYYGGGGGGGGGYYYYYYYXUUUUUUUUUIIIIILLLLLZZZZZZZZZZZHHZZHHFFFFFFFFMMMMMPPPYYYYYYYYYYYYYYYYY -QQLLLLLLLLLZZZMMMMMMMMMMMMMMMSSSSSSRRRRSVVVVVBBBBBBBYYGGGGGGGGGYYYYYYEEUUUUUUUUUIIIIILLLLLBZZZZZZZZZZHHHHHHFFFFFFFFMMMMMMPIIYYYYYYYYYYYYYYYY -QQQLLLLLLZZZZZZMMMMMMMMMMMMMFSSSSSSRRRRRRVVVVVVVVBBYGGGGGGGGGGGYYXYYYEEEEEEEEEEEIEIILLLLLLZZZZZZZZZZZZHHHHHFFFFFFFFMMMMMMPPIIYYYYYYYYYUUYYYU -QQQQQQGLLLLPPPMMMMMMMMMMMMMMMSRSSSRRRRRRVVVVVVVVBBBQGGGGGGGGGGGGGGYXXXEEEEEEEEEEEEELLLLLHZZZZZZZZZZZXZHHHHHFFFFFFFFMMMMIIIIIYYYYYYYYYYUUUUYU -QQQQQQQQQLKPPPPIIMMMMMMMMMUUUURRSRRRURRRVVVVVVVVVBQQGGGGGGGGGGGGGGXXXXXEEEEEEEEEJEELLLHHHHHHHHHZZDDZZZHHHHHFFFFFFFFQMMMQQIIIIYUUUUYYYYUUUUUU -JJQQQTQQQKKKPPPPPQQMUUMUUUUUURRRSRUUURRRUUUVVVUVVVQQGGGGGGGGGGGGGGXXXXXEEEEEEEEEJJJLLHHTTHHHHHHYYYDDDZHHHHHFFFFFFFFQMMMQQQQQUUUUUUUUUUUUUUUU -JJJJQTTQKKKPPPPPPQQQUUUUUUUCURRRRRRUUURRUUUVUUUUVVQQGGGGGGGGGGGGGGXXXXZEEEEEEEEEJJJJJHTTTTHHHHHHYDDDDHHHHHHMMQQQHQQQQMQQQQQUUUUUUUUUUUUUUUUU -JJJJJTTTPKKPPPPPPPQUUUUUUUUUUURRRRRRUUUUUUUVUUUUUVVQGGGGGGGGGGGGGGXXXXZEZZZZEEEJJJJJTTTTTTTTHHHHYYYMMHHHMHHMMMQQQQQQQQQQQQQUUUUUUUUUUUVUUUUU -JJJJJTTPPPPPPPPPPPPUUUUUUUUUURRRRRRUUUUUUUUUUUUUUVVUGGGGGGGGGGGGGGXXRRZZZZZZEEDDDJJTTTTTTTTHHHHHYMMMMHMHMMMMMMMQLLLQLQQQQQQUUUUUUUUUVUVVUUUU -JJJJJJJPPPPPPPPPPPUUUUUUUUUUURRRRPRRRUUUUUUUUUUUUVVUGGGGGGGGGGGGGGZRRRRRRRDDDDDDDJJJZTTTTTTTHHYYYYMMMMMHHMMMMMLLLLLLLLQQSQQSSUUUUBBBVVVVVUUU -JJJJJBBPPPPPPPPPPPUUUUUUUUUUUURRRPPCCUUUUUUUUUUUUUUUGGGGGGGGGGGGZZRRRRRRRBDDDDDDDJJJTTTTTTTTYHYYYYYYUMMMHMMMMLLLLLLLLLLLSSSSUUUUBVVVVVVZVUUU -JJJJBBBBPPPPPPPPPPUUUUUUUUUUUURRPPPCCGUUUUUUUUUUUUUUUGGGGGGGGGGGZZZRRRRRRRYDDDDDDJJTTTTTTTTTYYYYYYYYYMMMMMMMMMMMLLLLLLLSSSSSSUUUBVVVVVVVVVUU -JJJJBBBBPPPPPPPPPPUUUUUUUUUUUURUPPPCCCCCCUUUUUUUUUUUUGGGGGGGGGGGZZZRRRRRRRRRRRRDDDJTTTTTTTTYYYYYYYYYMMMMMMMMMMMLLLLLLLLSSSSSSSSSEEEEVVVVVVVU -JJJJBBBBQQQPPPPPPPUUUUUUUUUUUUUUPPCCCCCCCUUUUUUUUUUUUGGGGGGGGGGGZZZRRRRRRRRRRRRDDDTTTTTTTTTTYYYYYYYOYMMMMMMMMMMMMMLLLLLLSSSSSSEEUEEEVEEVQQVQ -JJJJJBBBBQQQPPPPUUUUUUUUUUUUUUPPPPCCCCCCCCCFFUUUUUUUQGGGGGGEEKKKKZZRRRRRRRRRDDDDHDTTTTTTTTTTTTYYYYYYYMMMMMMMMMMMMMMMSSSSSSSSSSEEEEEEEEQQQQQQ -JJJJBBBBBQQQQQPPUHHWUUUUUUUUUUPPPPCCCCCCCCCFFUUEUUMUQGGGGGGEEEKKKZRRRRRRRRRRRHDDHDDDTTBTTTTTTTYYYYYYYYMMMMMMMMMMMMSSSSSSSSSSSEEEEEEEEEEQQQQQ -JJHBBBBBQQQQQPPPPHHWWUUUUUUUUPPPPPCCCCCCCCCCAUUEUUUUQGGGGGGEKKKKPRRRRRRRRRRRRHHHHHDTTTTTNTTTTTTTXYYAAYYMMMMMMMMMMMGGSGGGOOOSOOOEEEEEEEEEQQQQ -JHHHBBBBQQQQQPPPPHHWWUUUWWWUPPPPPPPPCCCCCCAAAAAEEEUUUGGGGGGCKKKKKKKRRRRRRRRRRHHHHHDTWWTTNNNTTTXXXYAAAAMMMMMMMMMMMGGGGGGJOOOOOOEEEEEEEEEEQQQE -HHHHBBBUQQQQQPPPPWHWWWUWWWWUPPPPPPPPPPCCCCAAAAAEEEEEEGGGGGGCKKKKKKKRRRRRRRRRGGHHHHHHWWNNNNNNTXXXXXXAAAAAMMMMMMMMGGGGGGJJOOOOOOEEEEEEEEEEEQEE -HHHHHBBBBQQQPPPPWWWWWWWWWWWWWPPPPPPPPPCCCAAAAAEEEEEECCCCCCCCKKKUKKRRRRRRRRRRRGHHHHHWWDDDNNNNTTXNNNNVAAAAAMWMMMMMGGGGGGJJOOOODEEEEEEEEEEEEEEE -HHHHHHHHUQQUPPPPWWBWWWWWWWWWWPPPPPPPPPCCAAAAAAAEEEEECCCCCCCCCKKKKRRRRRRRREKKKKKDHHHWDDDDNNNNNNNNNNNNNAAAAAMMMMPMMEGGGEOOOOOOEEEEEEEEEEEEEEEE -HHHHUHHHUQQUUPPPSUUWWWWWWWWWWPPPPPPPPPPCJPBAATTTTTEEEERRCCCCRRKKKKRRRRRRRRKKKKKKNHHWDDDDDNNNNNNNNFFNNAAAAAAAAMPMEEGGGEOOOOOOVVVEEEEEEEEEEEEE -HHHHUUUUUUUUUUVVUUWWWWWWWWWWWPPPPPPPPPPPPPAATTTTTTEEEERRUCCCCRKKKKKKRRRKKKKKKDDJDDDWDDDDDNNNNNNNNNNNAAAAAAAAAMMAEEEGGEEOOOOOOVVSESSSSEEEEEEE -HHHHHUUUUUUUUUUUUUWWWWWWWWWWWPPPPPLTTPPPPPPTTTTTTTTTEERRRCCCCRRKKKKKRRKKKKKKKDDDDDDDDDDDDDDNNNNNNNNNAAAAAAAAMMAAEEEEGEEEEEOOVVSSSSSSSEEEEEEE -HHHHHHHHHUUUUUUUUUWWWWWWWWWWLLLLLLLTTPPPPPPTTTTTTTTTEERRPCERRRRRKKKKKKKKKKKMKLDDDEDDDBBBBBBBNNNNNNNNNAAAAAAAAAAAAAEEEEEEEEOOVVSSSSSSSSSSEGGE -HHHHHHHUUUUUUUUUXUWWWWWWWWWWLLLLLLLTTTPPPTTTTTTTTTTTERRRRRRRRRRRRKKKKKKKKMKMLLLDDDDDDBBBBBBBNNNNNNANAAAAAAAAAAAAAAEEEEEEEEEESSFSSSSSSSSSESGG -HHHHHHHUUUUUUUUXXXXWWWWWWLLLLLLLLLTTTTTTTTQTTTTTTTTTTRRRRRRRRRRRKKMMKKKKKMMMMMLLDDDDDBBBBBBBNNNNNNNAAAAAAAAAAAAAAAKKEEEEEEEESSSSSSSSSSSSSSGG -HHHHHUUUUUUUUUUXXXXXWWWXLLLLLLLLLLTTTTTQQQQTTTTTTTTTTTRRRRRRRRRRRKMMMKKKKMMMMMMDDDDDDBBBBBBBNNNNNNNNNAAAAAAAAAKKKKKKEEEEEEEEESSSSSSSSSQSNQGG -HHHKKUUUUKUUUWWXXXXXXXXXLLLLLLLLLLQQQTTQQHQTQQQTTTTTTRRRRRRRRRRRRMMMMKKKKMMMMMMDDDDDDBBBBBBBDNNNNNNNBBBBBBBAAAAKKKKKKKEEEEEEEESSSSSSSSQQQQGG -HHHHKKLKAKKUWWWXXXXXXXXXLLLLLLLLLLQQQTTQQHQQQQTTTTTTTRRRRRRRRRRRRMMMMMKMMMMMMMMQQDDDDBBBBBBBNNNNNNNNBBBBBBBAAAAKKKKKKEEEEEEEESSSSSSSSSQGQQGG -HHHHHKKKKKKUWWWWWXXXXXXXXLLLLLLLLLQVQQQQQQQQQQQTTTTTRRRRRRRRRRRNNMMMMMMMMMMMMMMQQZDDDBBBBBBBBBBBBBNABBBBBBBAAAAKKKKKKEEEEEENEESSSSSSQSQQQQGQ -HHHHKKKKKKKRWWWWWWXXXXXXXLLLLLLIILIQQQQQQQQQQQQQTTTTRRRRRRRRRRRNMMMMMMMMMMMMMMMQQZDDDBBBBBBBBBBBBBBBBBBBBBBAAAAKKKKKKEEEENNNNSSSSSSSQQQQQQQQ -HMHHKKKKKKKRWWWWWXXXXXXXXLLLLLLIIIIQQQQQQQQQQQQQTTTRRRGRRRRRRRRNMMMMMMMMMMMMMMZQZZDDDBBBBBBBBBBBBBBBBBBBBBBAAAAAAKKKKEEENNNNNSSSNSSSQQQQQQQQ -MMKKKKKKKKKWWWWWWXXXXXXXXLLLLLLLLIIIQQQQQQQQQQQQQQTRRRRKKRRRRRNNMMMMMMMMMMMMBBZZZZZZDBBBBBBBBBBBBBBBBBBBBBBAAIIAKKKKKKKENNNNNNNSNSSUUQQQQQQQ -NMMMMKKKKKKWWWWWWWXXXXXLLLLLLLLLLLLIIQQQQQQQQQQQQEEERRIIKRRRRNNNMMMMMMMMMMMMMBZZZZZZZBBBBBBBBBBBBBBBBBBBBBBNIIIKKKKKKKKKKNNNNNNNNSUUQVQQQQQQ -MMMKKKKKKKKWWWWWWXXXXXXXXRRRRJXXXLIIQQAQQQQQQQQQQEEEEEIIIIINNNNNNMMMMMMMMMMMBBZZZZZZZDSSBBBBBBBBBBBBBBBNNNEEIIIKKKKKIKKNNNNNNNNNNNQQQQQQQQQQ -MFMIFFKKKKKKWWWWWWXXXXXXRRRRJJJXXQQQQQQQQQQQQQQQQEEEEEEEIINNNNNNNNNNMMMMMMMBBBBBZZZZZDZZBBBBBBBBBBBBBBBNNNIIIIIKKKIKIINNNNNNNNNNNQQQQQQQQQQQ -FFBIFFFKKKKKWWWWWWXXXXXXWWRRRJJXXXXQQQQQQQQQQQQQQEEEEEIIIINNNNNNNNNNNMMMMMMMBBBCBZZZZZZZBBBBBBBBBBBNNNNNNIIIIIIIIIIIIINNNNNNNNNNNNNQQQQQQQQQ -FFBBBFFFFKKKYWWWXXXXXXVWWWRRRJXXXXXXXQQQQIQQQUQQUUEUEEIIIIIIINNINNNNMMMMMBBBBBBBBBZZZZZZZZBBBBBBBBBIINNNNIIIIIIIIIIIIIIINNNNNNNNNNNNNHQQQQQQ -FBBBBFFFFFFFFWWWXXXXXXXWWWRWWXXXXXXDDPPPQQUUUUUQUUUUIIIIIIIIIIIINNNNMMMMMBBBBBBBBBZZZZZZZZBBBBBBBBBINNNNNIIIEIIIIIIIIIIIINNNNNWNNNNNNHQZQQQQ -BBBBBFFFFFFFEEEQXXXXXXXXWWWWWXWXXXXDDPPZZUUUUUUUUUUUIIIIIIIIIIIINNNNNNMBBBBBBBBBBBBZZZZZZZBBBBBBBBBIIIIEEEEEEIIIIIIIIIIIWWWWWUWWNWNNNNQZZDDD -BBBBBFFFFFEEEEEQXNNXXXWWWWWWWWWWXDDDDQQUUUUUUUUUUUHBIIIIIIIIIIIBNNNNNNBBBBBBBBBBBBZZZZZZZZBBBBBBBBBIIIIIEEEEEIIIIIIIIIIIWWWWUWWWWWNNNNNZDDDD -BBBBBBFFFFFEEEEEENNNNWWWWWXXXXXXXXXXDDDDDDDUUUUUUBBBIIIIIIIIIIIBNNNNNBBBBBBBBBBBBDBBZZZZZZBBBBBBBBBIIIIEEEEEEEEEIIIIIIIWWWWWWWWWWWNNNZZZDDDD -BBBBBBBEFFFEEEEEENENNNWWWWXXXXXXXXXXDDDDDDDDUUUUBBBBBIIIIIIIILBBBNBNNNNBBBBBBBBBBBBZZZZZZZBBBBBIIIIIIEEEEEEEEEEEIIIIIIIWWWWWWWWWWWZZZZZZDDDD -BBBBBBEEEYEEEEEELEEENNWWWWXXXXXXXXXXDDDDDDUUUUUUUBBBBIIIIIIIIIBBBBBBBBBBBBBBBBBBBBBBZZZZZZHHHUUUIIIIIENEEEEEEEEEIIIIMMMWWWWWWWWWWWZZZZZZZZDD -BBBBBBBEEEEEEEEEEEEENWWWWWXXXXXXXXXXDDDDDDDUUUUUUBBBBIIIIIEIIBBBBBBBTTBBBBBBBBBBBBBZZZZZZZHUUUUUUUIIEEEEEEEEEEEEEMMMMMMMWWWWXXXXXWZZIJZZZZDZ -BBBBBBBBBEEEEEEEEEEEELXXXXXXXXXXXXXXDDDDDDUUUUUUUBTUBIIIIIIIBBBBBBBBTBBBBBBBBBBBBBZZZZZZZZUUUUUUUUIIIELEEEEEEEEEEMMMLWWMWXXXXXXXXXZIIIIIZZDZ -BBBBBBBBBEEEEEEEEEEEEEXXXXXXXXXXXXXXDRRDZAUUUUUUUUUUUNNNNIMBBBBBBBBBBBBBBBBBBBBOOBZZZZZZZZZUUUUUUUUUEEEEEEEEEEEEEMMMLLWWWXXXXXXXXXZIIPIZZZZZ -BBBBBBBBBBEEEEEEEEEEEWXXXXXXXXXXXXXXDRRDAAAUUUUUUUUMMMNMNNMBBBBBBBBBBBRNBBBBBVNOZZZZZZZZUUUUUUUUUUUUUEEEEEEEELELLMMLLLWWWXXXXXXXXXZIIIIIIZZZ -BBBBBBLLLLLLEEEEEEEEEEXXXXXXXXXXXXXXWVVAAARAUUUUUUUMMMMMMMMBBBBBBBBBBBRNNBBNNNNOOZZZNNZUUUUUUUUUUUUUUUUEEEEEELLLLMLLLLWWWXXXXXXXXXZIIIIIIZZZ -BBBBBBLLLLLLEEEEEEEEEEXXXXXXXXXXXXXXWVVAAAAAAUUUUUUMMMMMMMMBBBBBBBBBBRRNNNNNNNNOONZZNNZUUUUUUUUUUUUUZEEEEEEEELLLLLLLLVWWWXXXXXXXXXIIIIIIIIIZ -BBBBBBLLLLLLLLXXEEEVEKXXXXXXXXXXXXXXWVVVVVVAAAAUUUUMMMMMMMMBBMBBBBBBBBRNNNNNNNNNNNNNNUUUUUUUUUUUUUUUEEEEEEEEELLLLLLLLLLLWXXXXXXXXXIIIJZZZZZZ -BBBBBBLLLLLLLGLLEEEEEKXXXXXZZZZZZZWWVVVVVVVVVUUUUUMMMMMMMMMMMMBBBBBBBBNNNNNNNNNNINNNNUUUUUUUUUUUUUUJEEEEEEEELLLLLLLLLLLWWXXXXXXXXXJJJJJJJZZZ -BBBBBBLLLLLLLLLLLLLLLLXXXXXXXXXXXXXWVVVVVVVVVUUUUUMMMMMMMMMMMMBBBBBBBBBNNNNNNNNNNNNNNUUUUUUUUUUUUVVICCELEEEELLLLLLLLLLDDWXXXXXXXXXWWJJJJZZZZ -BLLLLLLLOOOLLLLLLLLLLLXXXXXXXXXXXXXWVVVVVVVVVVURRUFRMMMMMMMMMBBBBBBBBNNNNNNVKKNNNNNNNNNNNUUUUIVVVVVICCCEEEEELLLLLLLLLDDDDXXXXXXXXXJJJJJJJZZZ -BLLLLLLLOOOLLLLLLLLLLLCZZZXXXXXXXXXZVVVVVVVVVVRRRRRRRRMMMMMMMIIIBBBBBBBBVVVVVKYNNNNNNNNNNNUIIIIVVVIIIIEEEEELLLLLLLLLLDDDDDDXXXJJJJJJJJJJJZZZ -BLLLLLLLOOOLLLLLLLLLLLLLZZXXXXXXXXXZVVVVVVVVVRRRRRRRRRRRTTTIIIIIIIBBBYYVFVVVVVYYNNNNNNNINNNIIIIVVIIIIEEEEEEEELVLLLLGLLDDDDDXXXJJJJJJJJJJJJJZ -LLLLLLLLOOOLLLLLLLLLLLLNZZXXXXXXXXXZVVVVVVVVRRRRRRRRRRRRRRRNIIIIIBBBBYYVVVVVYYYYYYNNNNNIIIBIIIIVIIIIIBEEEDDKELVVDLLLLDDDDDDDDDJJJJJJJJJJJJJZ -LLLLLLLLOOOLLLLLLLLLLALNZZXXXXXXXXXZVVVVVVVVKRRRRRRRRRRRRRRRRIIIIBBBBBYYYYVVYYYYYYNNNIIDIIIIIIIIIIIIIIDREDVDEVVVDLLDLDDDDDDDDJJJJJJJJJJJJJJJ -LLLLLLLLOOOLLLLBBBLLAAZZZZZZZZZZZZZMVVVVVVVRRRRRRRRRRRRRRXRRIIIIIIIIBYYYYYVVYYYYYYNNNIIIIIIIIIIIIIIIIIDDDDDDDVVDDDDDDDDDDDQDDDJJJJJJJJJJTJJC -LLLLLLLLOOOLLLBBBBLLLAAAAAMZZZZMZZMMMVVVVVVRCCCRRRRRRRRRRRRRIIIIIKKYYYYYYYYYYYYYYYYYNNIIIIIIIIIIIIIIIIDDDDDDDVDDDDDDDDDDDQQDDDJJJJJJJJJTTTJC -LLLLLLLLOOOLLLLBBBLQLAAAAAMMMZZMZMMMVVVVVVVRCCCCCRRRRRRIIIRRRIIIIKKYYYYYYYYYYYYYYYYYYIIIIIIIIIIIIIIISIDDDDDDDVVDDDDDDDDDQQQDQQGJJJJJJJJGGGCC -LLLLLLLLOOOLLLBBBBBBAAAAAAMMMMMMMMMMMVVVVVVCCCCCCRRRRRRIIIIIIIIIIIKYYYYYYYYYYYYYYYOOOIIIIIIIIIIIIIIIGIDDDDDDDDDDDDWWQQQQQQQQQQGJTJJWWWWGGGCC -LLLLLLLLOOOLLLBBBBBBAAAAAAAMMMMMMMMMXXVVVVVCCCCCCCEEERJJJIIIIIIIIKKKKYYYYYYYYYYIIIIIIIIIIIIIIIIIIIIGGGDDDDDDDDDDIWWGQQQQQQQQTTJJTTGGGGWGGGGC -TLLLLLLLLLLLLLBBBBBBBAAAAAAMMMMMMMMXXXVVXVVCCCCCCCEEEEAAAAAIIIIIIKKKKYYYYYYYYYYIIIIIIIGIIIIIIIIIIFGGGGDDDDDDDSDWWWGGQQQQQQQQTTTTTGGGGGGGGCCC -TLLLLLLLLLLLLLCBBBBBBBACAAAMMMMMMMMXXXXXXXCCCCCCCCEEECAUUUUUUIIIIKKKYYYYYYYYYIIIIIIIIIGIIIIIIFFFFFGGGGDDDDDDSSSSWWWGGQQQQQQQTTTTGGGGGGGGGCCC -ZLLLLLLEELLLLLBBBBBBBUCCCMMMMMMMMMMMXXXXXCCCCIIIIIIIIIIUUUUUUHIIKKKKYYYYYYYYYYGXIIIIIIGIIIIIIGGFFFGGGGGDDDDDSSSSSGGGGGQQQQQTTTTGGGGGGGGCCCCC -ZZLLLZZLLLLLLLBBBSBBBBBCMMMMMMMMMMXXXXXXXXCCCIIIIIIIIIIUUUUUUHIIIIKKJYYYYYYYYGGGIIIIIGGGGIIIQGGFGGGGGGGSSSSSSSSSSSSGGQQQQQTTQTTTTGGGGGGCCCCC -ZZZEZZZZZLLRLLCCKCBBCCCCMMMMMMMMMMMXXXXXXXCCCIIIIIIIIIIUUUUUUHHHIIKKJYYYGGAGGGGGGFGIWGGGGIIGGGGGSSSSSSSSSSSSSSSSSSGGGQQQQQQQQQTTGGGGGGGCCCCC -ZZZZZZZZZZLLLLSCCCCCCCCCCMNNMMMMMEEXXXXXXXXCCIIIIIIIIIIUUUUUUHQHHHJJJJJYGGGGGGGGGFGGGGGGGGGGGGGGSSSSSSSSSSSSSSSSSWWWGWQQQQQQQQQTGGGGGGCCCCCC -ZZZZZZZZSSLLLSSSCCCCCCCCMMNMMMMMMMMXXXXXXCCCTIIIIIIIIIIUUUUUUHQHHJJJJJJGGGGGGGGGGGGGGGGGGGGGGGGGSSSSSSSSSSSSSWWWWWWWWWQWQQQQWQTTGGGGGGGGCCCC -ZZZZZZZZSSSSSSSSSCCCCCMMMMMMMMMMMMMXXXXXXCXXCIIIIIIIIIIQQQQQQQQQAJJJJJJJJJGGGGGGGGGGGGGGGGGGGGGGGGGGGGGSSSSSSSSWWWWWWWWWWQWWWQQGGGGGGGGGCCCC -ZZZZZZZSSSSSSSSSSCCCCCMMMMMMMMMMMMMXXXXXXXXXXIIIIIIIIIIIIQQQQQQAAEAJJJJJJJGGGGGGGGGGGGGGGGGGGGGGGGGGDDDSSSSSSSSWWWWWWWWWWWWQQQQQGOGGGGGGCCQC -ZZZZZZZZSTTTSSSSSCCCCCCCMMMMMMMMMMXXXXXXXXXXXXXWWIIIWAIIIQQAPQQAAAAAJJJJGGGGGGMGGGGGGGGGGGGGGGGGGGGGDDDDSSSSSSSAWHWHWWWWWWWQQQQQGGGQQGGGGCQQ -ZZZZZZZZZTTTSSSTSSCCHCCMMMMMMEMMMAXXXXXXXXXXXXWWWIIIIIIIIIAAPPPAAAAAJJJMGGGGGGMMMGGGGGGGGGBBGGGEGGGGDDBDSSSSSSSHHHHHWWWWYWWQQQQQQQQQQQQGQQQQ -ZZZZZZZOZTTTTTTTTSCCHCHMMMEEEEEMAAXXXXXXXXXXXXWIIIIIIIIIIIAUAPAAAAAAJJJMGGGMMGMMMGGGGGGGGGGGGGEEGGGGSSSSSSSSSSSHHHHHWWWYYQQQQQQQQQQQQQQQQQQX -ZZZZZZZOZZTTTTTTTTTHHHHHMEEEEEEEEAAXXGXJXXXXXXWIIIIIIIIIIIAAAAAAAAAAAMMMMMMMMMMMGGGGGGGGGGGGGWEEEEEESSSSSSSSSSSHHHHHHHWHHHHQQQQQQQQQQQQQQQQQ -ZZZZZOOOTTTTTTTTTTTTTTEHEEEEEEEEAAXXXXXJXCXXXIIIIIIIIIIIIIAAAAAAAAAAMMMMMMMMMMMMGGGGGGGGGGGGGWEEEEEESSSSSSSSSSSHHHHHHHHHHHHQQQQQQQQQQQQQQQQQ -ZZZZZOOOTTTTTTTTTTTTTTEEEEEEEEEEEAXXAAAJACCCCIIIIIIIIIIIIIAAAAAAAAAAAAMMMMMMMMMMMMMGGGGGGGGGGEEEEEEESSSSSSSSSSSHHHHHHHHHHHHQKKQQQQQQQQQQQQQQ -OOOOOOOOOOTTTTTTTTTTTUUESSSSSSSEAAAAAAAAACCCCIIIIIIIIIIIIIFAAAAAAAAAAAMMMMMMMMMMMGGGGGGUGGGEGEEEEEEESSSSSSSSHHHHHHHHHHHHHHHHKKKKQQQQQQQQQQQQ -OOOOOOOOOOTTTTTTTTTTUUUESSSSSSSEAAAAAAAAACCCCIIIIIIIIIIIIIAAAAAAAAAAAMMMMMMMMMMMMMGGGGGGGEEEEEEEEEEESSSSSSSSXXHHHHHHHHHHHHHHKKKQQQQQQQQHQQQQ -OOOOOOOOOOOTTTTTTTTTCCCESSSSSSSZEAAAAAAAEEECCSIIIIIIIIIISSAAAAAAAAAAMMMMMMMMMMMMMMGGGGOOEEEEEEEEEEEESSSSSSSSXXXHHHHHHHHHQHHHHKNPPIQQQQQHQHHH -OOOOOOOOOOTTTTTTTTTTCCCCSSSSSSSEEEAAAACEEEESSSIIIIIIIIIISSAAAMMAAAAAMMMMMMMMMMMMMMXXGGJEEEEEEEEEEEXBSSSSSSSSXXXXHHHHHHHQQHHKKKNNPIIIQIIHHHHH -OOOYYYYYOOTTTTTTTTTTBCCCSSSSSSSEHHHAAAEEEEESSSIIIIIIIIIITGGAMMMAAAMMMMMMMMMMMMVVVMXXXJJJJEEEEEEEEEXXSSSSSSSSXXXXXHHHHHHHHHKKKKKNNIIIIIIHHHHH -OOYYYYYYOTTTTTTTTTUTCCCCSSSSSSSEHHHAAAEEEEEESSIIIIIIIIIITGGAMMMAAAAAMDMMMMMMMMVVXXXXXJJJJEEEEERRREXXSSSSSSSSXXXXXHHTHTKKHHKKKKKNNTIIIIIHHHHH -OOYYYYYYOYTTTTTTTCUCCCCCSSSSSSSYYHIIIIIEEEEESSIIIIIIIIIITTTTMMMMAAADDDDMMMMMMMVVVVXXXJJJJJEEEERRRXXXBBBXXXXXXXXXHHHTTTTKKKKKKKNNNTIIIIIIHHHH -YYYYYYYYYYTTTTTTTCCCCCCCSSSSSSSYYHIIIIIIEEEEESSSSSSSSSTTTTTJTYYYAADDDDDDVVMVVVVVVVJJJJJJJJEEEEERRXXXBBXXXXXXXXXXGGGTTTTTKKKNNNNNIIIIIIIIIHHH -YYYYYYYYYYYYTTTYYYCCCCCCSSSSSSSSSPIIIIIEEEEEESSSSSSSTSTTTTTTTTYYYADDDDDDVVVVVVVVVVJJJJJJJJEEEERRRXXXXXXXXXXXVXVVVVGTTTUTKNNNNNNNIIIIIIIIIHHH -YYYYYYYYIIYYYYYYYCCCCCCCCCSSSSSSSIIIIIIIEEEEEEESSSSSTTTTTTTTTTTYYYDDDDDDVVVVVVVVVVVVVJJJJJEEERRRRRRXXXXXXXXXVVVVVGGTTTTMNNNNNNNNIIIIIIIIIHHH -YYYYYYYYHHHHHHYYYYCCCCCCCCSSSSSSSIIIIIIEEEEESESSSSSSTJTTTTTTTTYYYYYDDDDDDVVVVVVVVVVJJJJJJJEEERRRRRRRRXXXXXXXVVVVVVVVATTNNNNNNNNNIIIIIIIIHHHH -YYYYYYYYYHHHHHHYYYCCCCCCCCSSSSSSSIIIIIGEEEEESSSSSSSSSYTTYTYYYYYYYYYDDDDDDDDVVVVVVVVJVVVVJEEERRRRRRRRRXRRXXXXVVVVVVVVAAAANNNNNNNNNIIIIIIIIHHH -YYYYYYYDYHHHHHYYYYCCCCCCCCSSSSSSSIIIGGGEEEEEESSSSSSSSYYYYYYYYYDDDYYYDDDDSDDDVVVVVVVVVVVVVEEERRRRRRRRRRRRXXXXVVVVVVVVAAAANNNNNNNNNNIIIIUUIIHH -YYYYYYYYHHHHHYYYYYCCCCCCCCSSSSSSSIIIIIIIPEEEEESSSSSYYYYYYYYYYYDDDDSSDSSSSVVVVVVVVVVVVVVVEEEERRRRRRRRRREEXXXVVNVVVVVVAAAANNNNNNNNNNIIIUUUUUHH -SYSSSSYYHHHHHHYYYYCCCYCHCCSSSSSSSSSSSIHPPEEEEEEESSSYYYYYYYYDDYDDDDSSSSSSSSSVVVVVVVVVVVMMMMMMKMRRRRRRRRTEXXXXTVVVVVVAAAAAANNNNNNNNNNUIUUUUUUH -SYSSSSYYHHHHHHYYYYYYCYIHHCSSSSSSSSSSSHHHHEEEEEESSSSAYYYYYYYDDDDDDDFSSSSSSSSSVVVVSVVMMMMMMMMMKMMRRRRRRTTEETTTTTTVVVAAAAAAANNNNNNNNNNUUUUUUUUU -SSSSSSSSSHHHHHYYYYYYYYYHHHHSSSSSSSSSSHHHHEEEEEEAASSSHYYYYYYDDDDDFFFSSSSSSSSSSVVVSVVMMMMMMMMMMMMRTRRRRTTTTTTTTTTVAAAAAAAAANNNNNNNNNNUUUUUUUMU -SSSSSSSHHHHHHHHHYYYYYYYYHHHSSSSHHIIIHHHHEEEEEAAAAASHHHHSYYYDDDFFFFSSSSSSSSSSSSSSSVVMMMMMMMMMMMAATRRRTTTTTTTTTTUVAAAAAAAANNNNNNNNNNNUUUUUUUUF -SSASSSSSSHHHNHHHZZJJYTYHHHHHHHHHHHIIHHHHHHEEEAAAAAAATHXXXYYADDFFFFSSRSSSSSSSSSSSVVVMMMMMMMMMMMAATTTTTTTTTTTTTTTAAAAAAAAAAUNNNNNUNUUUUUUUBBBF -SSASSSSSSHHHHJHZZJJJYYYHHHHHHHHHHHHHHHHHHHGEEAAAAAAAAXXXXYYAAAAAAAASASSSSSSSSSSSSSVVMMMMMMMMMAATTTTTTTTTTTTTTTAAAAAAAAAAUUNNUNUUUUUUUUUBBBBB -SAAAASSSSBHHVJHHJJJJYYHHHHHHHYYHHHHHHHHHHHGAAAAAAAAAAXXXXXYYAAAAAAAAAAASSSSSSSSSVVVMMMMMMMMMMAATTTTDTTTTTTTTTTTAAAAAAAAAUUUUUNUUUUUUUUBBBBBB -SAAAAASBBBBJJJJHJJJJYYHHHHHHYYYYYHHHHHHHHAAAAAAAAAAAAXKXXXIRAAAAAAAAASSSSSGASSSSVVVTMMMMMMMMAAAATTMDTTTTTTTXZTTAAAAAAVAAVVUUUUUXUXUUUUUHHBBH -AAAAAASSSBJJJJJJJJJHHHHHHHHYYYYYYYYYHHHHHAAAAAAAAAAAAXXXNIIRRAAAAAAAAAAAASSAASSSSVTTMSMMMMMMMAAATTMMMMTTTXTXXTXAAAAAAVVVVEUUUUUXXXUUUUUUHHHH -AAAAAJRJJJJJJJJJJJJHHHHHHHYYYYYYYYYYHHHHHAAAAAAAAAAAAJIIIIIRAAAAAAAAAAAAAASAAATSRVTTMMMMMMMXXXAAATPMMMKXXXXXXXXXAAAAAVVVVUUUUUXXXXXXXUUUHHHH -AAAAARRTTJAAJJJJJJJJHHHHHHHYYYYYYYYYHHHAAAAAAAAAAAAAAJIIIIIIIIIAAAAAAAAAAAAAATTTVVTTMMMGMZZXXXXAAMMMMXXXXXXXXXXXAAAVVVVVVUUUUXXXXXXXXXHHHHHH -AAAAARRRJJAJJJJJJJJJHHHUUUUUYYYYYYYYYYEAAAAAAAAAAAAAAAYYIIIIIIIIAAAAAAAAAAAAAATTTTTTWMMMMZZXXXAAAAMMMXXXXXXXXXXXAAAVVVVVVUVVUXXXXXXXXXXHHHHH -AAAAAAARJAAJJJJJJJJJMPPUUUUUYYYYYYYYYYAAAAAAAAAAAAAAAAAAIIIIIIIAAAAAAAAAAAAAAATTTTTWWDDDMXXXXXXXAAAXXXXXXXXXXXXXAAVVVVVVVVVVUXXXXXXXXHHHHHHH -AAAAAARRRAAAJJJJJJJJPPPUUUUUYYYYYYYYYYAANNAAAAAAAAAAAIAIIIIIIIIAAISAIIIAAAATAATWWTWWWWDDXXXXXXXXXXXXXXXXXXXXXKKKAAVVVVVVVVVVUXXXXXXXXHHHHHHH -AAAAAGGRRAAAAAJJPPPJJPPUUUUUYYYYYYYYYYYOOOOROSSAAAIAAIIIIIIIIFIIAIIIIIIAAOOOAATTWWWWWWWXXXXXXXXXXXXXXXXXXXXXXXKAAKVVVVVVVVVVVTXXXXXIIXXHHHHH -AAAAAGGGRRRAAAAAAPPPPPPPPPYYYYYYYYYYYYOOOOOOOSSSSAGGGGGIIIIIFFIIIIIIIIAAOOOOOOTTWWWWWWWXXXXXXXXXXXXXXXXXXXXXXXKKKKKKVVVVVVVVVVXXXXXXXEXXHHHH -AAAAAGGARAAAAAAPPPPPPPPPPPPPYYYYYYOYYYOOOOOOOSSSSGGGGGIIIIIIIFIIIIIIIIAAOOOOOOOOWWWWWWIIXHXXXXXXXXXXXXXXXXXXXXKVVVVVVVVVVVVVVVXXXXXXXEXXHHHH -AAAAAGGAAAAAAAAPPPPPPPPPPPPPPPYYOOOOOYOOOOOOOOOSSGGGGGGIIIIIIIIIIIIIIIOOOOOOHHHHWWWWWWIIXHXXXXXXXXXLXXXXXXXXXXXZZVVVVVVVVVVVVVVXXXXXXXXXHHHH -AAAGGGAAAAAAAAPPPPPPNNNPPPPPPPPPPOOOOOOOOOOOOOCGGGGGGGGGIIIIIIIIIIIIIIIQIOOOHHHHHWWWWWWIJHHXXXXXXXXXXXXXXXXXXHXZZVVVVVVVVVVVVVVXXXXXYYXXHHHH -GAAGGGGAAAAAAAAAPJJNNNNPNPPPPPPPNOOOOOOOOOOOOOCGGGGGGGGGGGIIIIIIIIIIIIIIIOHHHHHHHWIWIIIIJHHXXXXXXXXXXXXXXXZZXXZZZVVVVVVVVVVVVVVYXYYYYYYYEEHH -GGGGGGGGAAAAAAAAAJJNNNNNNPPPPPPPPOOOOOOOOOOUOOOGGGGGGGGGGINIIIIIIIIIIIIIIIIHHHHHHHIIIIJJJHHXXXXXXJXXXXXXXXXZZZZZVVVVVSSSZVVZVVVYYYYYYEEEEHHH -GGGGGGGGGAAAAAAAAJJNNNNNNPPPPPPPPPPOOOOOOOOUUUGGGGGGGGGGGIIIIIIIIIIIIIIIIHHHHHHHHIIIIIIJJJHXXXXXXXWXXFXXXXZZZZZZVZZVVVVVZZZZZVYYYYEYYEEAEHHH -GGGGGGGGAAAAAAAAAAJNNNNNNNPNPPPPXXXOOOOOOOOOUUGGGGGGGGGGGGIIIIIIIIIIIIHHIIHHHHHHHHHIIIIJJJHXXXXXXXWXFFFXXXXZZZZZZZZZZZVZZZZZZZYYYYEEEEEEHHHH -GGGGGGGGGGGAAAJJJJJNNNNNNNNNPPPXXXXOOXXOOOOOGGGGGGGGGGGGGGGGIIIIIIIIIIIHHHHHHHHHHHHHHHHHHHHHXXXXXXXXXFFFFXXZZZZZZZZZZZZZZZZZZZZZYYEEEEEHHHHH diff --git a/2024/go/day13/day13.go b/2024/go/day13/day13.go deleted file mode 100644 index 5f90897..0000000 --- a/2024/go/day13/day13.go +++ /dev/null @@ -1,58 +0,0 @@ -package day13 - -import ( - "adventofcode2024/utils" - _ "adventofcode2024/utils/grid2d" - _ "adventofcode2024/utils/inputs" - "regexp" - _ "fmt" - "strings" -) - -func Part1(input string) int { - val := 0 - machines := strings.Split(input, "\n\n") - pattern := `Button A: X\+(\d+), Y\+(\d+)\sButton B: X\+(\d+), Y\+(\d+)\sPrize: X=(\d+), Y=(\d+)` - re := regexp.MustCompile(pattern) - for _, machine := range machines { - matches := re.FindStringSubmatch(machine) - a := utils.MustAtoi(matches[1]) - b := utils.MustAtoi(matches[2]) - c := utils.MustAtoi(matches[3]) - d := utils.MustAtoi(matches[4]) - X := utils.MustAtoi(matches[5]) - Y := utils.MustAtoi(matches[6]) -// fmt.Println(matches) - B := (Y*a - X*b)/(a*d - c*b) - A := (X - c*B)/a -// fmt.Printf("A: %d B: %d\n", A, B) - if (A*a + B*c == X && A*b + B*d == Y) { - val += A*3 + B - } - } - return val -} - -func Part2(input string) int { - val := 0 - machines := strings.Split(input, "\n\n") - pattern := `Button A: X\+(\d+), Y\+(\d+)\sButton B: X\+(\d+), Y\+(\d+)\sPrize: X=(\d+), Y=(\d+)` - re := regexp.MustCompile(pattern) - for _, machine := range machines { - matches := re.FindStringSubmatch(machine) - a := utils.MustAtoi(matches[1]) - b := utils.MustAtoi(matches[2]) - c := utils.MustAtoi(matches[3]) - d := utils.MustAtoi(matches[4]) - X := utils.MustAtoi(matches[5]) + 10000000000000 - Y := utils.MustAtoi(matches[6]) + 10000000000000 -// fmt.Println(matches) - B := (Y*a - X*b)/(a*d - c*b) - A := (X - c*B)/a -// fmt.Printf("A: %d B: %d\n", A, B) - if (A*a + B*c == X && A*b + B*d == Y) { - val += A*3 + B - } - } - return val -} \ No newline at end of file diff --git a/2024/go/day13/day13_test.go b/2024/go/day13/day13_test.go deleted file mode 100644 index 5778833..0000000 --- a/2024/go/day13/day13_test.go +++ /dev/null @@ -1,45 +0,0 @@ -package day13 - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -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`) - require.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`) - require.Equal(t, 480, r) -} diff --git a/2024/go/day13/input.txt b/2024/go/day13/input.txt deleted file mode 100644 index 3b53baf..0000000 --- a/2024/go/day13/input.txt +++ /dev/null @@ -1,1279 +0,0 @@ -Button A: X+17, Y+68 -Button B: X+62, Y+15 -Prize: X=4507, Y=17764 - -Button A: X+19, Y+95 -Button B: X+59, Y+23 -Prize: X=6550, Y=10174 - -Button A: X+20, Y+58 -Button B: X+60, Y+11 -Prize: X=3140, Y=4691 - -Button A: X+92, Y+31 -Button B: X+49, Y+87 -Prize: X=6599, Y=2717 - -Button A: X+46, Y+72 -Button B: X+29, Y+12 -Prize: X=18754, Y=13304 - -Button A: X+42, Y+33 -Button B: X+19, Y+81 -Prize: X=3531, Y=6144 - -Button A: X+80, Y+13 -Button B: X+20, Y+75 -Prize: X=1860, Y=3818 - -Button A: X+79, Y+14 -Button B: X+56, Y+66 -Prize: X=6740, Y=3830 - -Button A: X+18, Y+85 -Button B: X+70, Y+36 -Prize: X=5358, Y=5861 - -Button A: X+42, Y+44 -Button B: X+52, Y+14 -Prize: X=6310, Y=4870 - -Button A: X+56, Y+90 -Button B: X+88, Y+41 -Prize: X=9208, Y=8572 - -Button A: X+95, Y+67 -Button B: X+13, Y+71 -Prize: X=3065, Y=6799 - -Button A: X+70, Y+22 -Button B: X+13, Y+57 -Prize: X=17469, Y=5153 - -Button A: X+36, Y+65 -Button B: X+79, Y+27 -Prize: X=5764, Y=4394 - -Button A: X+20, Y+46 -Button B: X+67, Y+29 -Prize: X=4637, Y=10139 - -Button A: X+47, Y+72 -Button B: X+42, Y+20 -Prize: X=1495, Y=10984 - -Button A: X+37, Y+96 -Button B: X+70, Y+53 -Prize: X=3563, Y=6029 - -Button A: X+20, Y+59 -Button B: X+62, Y+13 -Prize: X=5550, Y=18133 - -Button A: X+16, Y+52 -Button B: X+70, Y+61 -Prize: X=2400, Y=5136 - -Button A: X+70, Y+32 -Button B: X+22, Y+53 -Prize: X=320, Y=18668 - -Button A: X+47, Y+78 -Button B: X+78, Y+17 -Prize: X=6317, Y=6323 - -Button A: X+48, Y+33 -Button B: X+20, Y+89 -Prize: X=4296, Y=7017 - -Button A: X+17, Y+53 -Button B: X+43, Y+14 -Prize: X=19634, Y=5590 - -Button A: X+41, Y+95 -Button B: X+78, Y+30 -Prize: X=6816, Y=6900 - -Button A: X+14, Y+75 -Button B: X+65, Y+12 -Prize: X=10103, Y=12239 - -Button A: X+84, Y+69 -Button B: X+23, Y+95 -Prize: X=6178, Y=11620 - -Button A: X+57, Y+88 -Button B: X+70, Y+33 -Prize: X=4926, Y=6479 - -Button A: X+84, Y+34 -Button B: X+29, Y+78 -Prize: X=6138, Y=2882 - -Button A: X+32, Y+60 -Button B: X+62, Y+29 -Prize: X=13264, Y=10848 - -Button A: X+81, Y+69 -Button B: X+13, Y+61 -Prize: X=7893, Y=11217 - -Button A: X+98, Y+12 -Button B: X+85, Y+85 -Prize: X=8352, Y=3708 - -Button A: X+22, Y+91 -Button B: X+73, Y+39 -Prize: X=1457, Y=4186 - -Button A: X+38, Y+56 -Button B: X+97, Y+16 -Prize: X=9339, Y=3480 - -Button A: X+46, Y+13 -Button B: X+36, Y+71 -Prize: X=14918, Y=17793 - -Button A: X+27, Y+74 -Button B: X+64, Y+13 -Prize: X=11637, Y=3584 - -Button A: X+18, Y+58 -Button B: X+35, Y+16 -Prize: X=13544, Y=2948 - -Button A: X+32, Y+99 -Button B: X+99, Y+16 -Prize: X=7159, Y=4441 - -Button A: X+86, Y+49 -Button B: X+12, Y+49 -Prize: X=13188, Y=6269 - -Button A: X+19, Y+72 -Button B: X+37, Y+27 -Prize: X=1001, Y=3114 - -Button A: X+80, Y+39 -Button B: X+36, Y+55 -Prize: X=3848, Y=4797 - -Button A: X+32, Y+77 -Button B: X+82, Y+21 -Prize: X=4120, Y=4977 - -Button A: X+41, Y+64 -Button B: X+41, Y+16 -Prize: X=1829, Y=5360 - -Button A: X+67, Y+45 -Button B: X+13, Y+29 -Prize: X=19806, Y=5416 - -Button A: X+84, Y+13 -Button B: X+37, Y+55 -Prize: X=2852, Y=3792 - -Button A: X+70, Y+37 -Button B: X+21, Y+52 -Prize: X=8089, Y=10953 - -Button A: X+16, Y+57 -Button B: X+81, Y+38 -Prize: X=18875, Y=17714 - -Button A: X+91, Y+87 -Button B: X+24, Y+97 -Prize: X=3019, Y=5182 - -Button A: X+48, Y+60 -Button B: X+75, Y+17 -Prize: X=3267, Y=937 - -Button A: X+78, Y+26 -Button B: X+54, Y+95 -Prize: X=10638, Y=9706 - -Button A: X+21, Y+90 -Button B: X+65, Y+18 -Prize: X=5264, Y=4320 - -Button A: X+14, Y+58 -Button B: X+41, Y+33 -Prize: X=931, Y=983 - -Button A: X+22, Y+45 -Button B: X+55, Y+23 -Prize: X=18987, Y=18336 - -Button A: X+24, Y+61 -Button B: X+75, Y+29 -Prize: X=5127, Y=5758 - -Button A: X+49, Y+84 -Button B: X+38, Y+11 -Prize: X=3463, Y=3446 - -Button A: X+32, Y+75 -Button B: X+54, Y+11 -Prize: X=10780, Y=933 - -Button A: X+18, Y+84 -Button B: X+75, Y+31 -Prize: X=2577, Y=2137 - -Button A: X+16, Y+53 -Button B: X+66, Y+24 -Prize: X=12502, Y=7650 - -Button A: X+46, Y+75 -Button B: X+46, Y+20 -Prize: X=7598, Y=5780 - -Button A: X+97, Y+57 -Button B: X+40, Y+75 -Prize: X=6896, Y=6936 - -Button A: X+87, Y+49 -Button B: X+17, Y+61 -Prize: X=2245, Y=5687 - -Button A: X+89, Y+43 -Button B: X+38, Y+88 -Prize: X=8665, Y=7181 - -Button A: X+39, Y+94 -Button B: X+34, Y+26 -Prize: X=2237, Y=5112 - -Button A: X+57, Y+12 -Button B: X+40, Y+71 -Prize: X=5110, Y=6395 - -Button A: X+92, Y+13 -Button B: X+29, Y+88 -Prize: X=6278, Y=4411 - -Button A: X+94, Y+81 -Button B: X+13, Y+64 -Prize: X=3211, Y=5882 - -Button A: X+49, Y+34 -Button B: X+14, Y+65 -Prize: X=1939, Y=3778 - -Button A: X+32, Y+73 -Button B: X+50, Y+12 -Prize: X=12774, Y=12247 - -Button A: X+34, Y+97 -Button B: X+78, Y+59 -Prize: X=1364, Y=1602 - -Button A: X+13, Y+44 -Button B: X+70, Y+41 -Prize: X=13681, Y=7491 - -Button A: X+72, Y+44 -Button B: X+13, Y+56 -Prize: X=1078, Y=1716 - -Button A: X+56, Y+30 -Button B: X+27, Y+58 -Prize: X=3425, Y=5100 - -Button A: X+99, Y+18 -Button B: X+40, Y+83 -Prize: X=9389, Y=6175 - -Button A: X+44, Y+14 -Button B: X+17, Y+66 -Prize: X=7836, Y=16974 - -Button A: X+16, Y+58 -Button B: X+79, Y+29 -Prize: X=1201, Y=18041 - -Button A: X+60, Y+19 -Button B: X+52, Y+73 -Prize: X=5560, Y=5718 - -Button A: X+13, Y+51 -Button B: X+69, Y+26 -Prize: X=7423, Y=7244 - -Button A: X+40, Y+14 -Button B: X+42, Y+60 -Prize: X=6320, Y=5836 - -Button A: X+73, Y+29 -Button B: X+20, Y+54 -Prize: X=12274, Y=12544 - -Button A: X+12, Y+64 -Button B: X+89, Y+95 -Prize: X=8072, Y=9640 - -Button A: X+26, Y+49 -Button B: X+70, Y+26 -Prize: X=2276, Y=3442 - -Button A: X+68, Y+47 -Button B: X+29, Y+69 -Prize: X=7480, Y=8499 - -Button A: X+13, Y+28 -Button B: X+86, Y+21 -Prize: X=1826, Y=1141 - -Button A: X+97, Y+85 -Button B: X+25, Y+88 -Prize: X=5021, Y=6647 - -Button A: X+24, Y+50 -Button B: X+85, Y+17 -Prize: X=1952, Y=2786 - -Button A: X+21, Y+71 -Button B: X+59, Y+21 -Prize: X=18503, Y=12693 - -Button A: X+94, Y+58 -Button B: X+42, Y+85 -Prize: X=12332, Y=12395 - -Button A: X+93, Y+49 -Button B: X+13, Y+40 -Prize: X=9332, Y=7370 - -Button A: X+58, Y+44 -Button B: X+32, Y+84 -Prize: X=6696, Y=10216 - -Button A: X+18, Y+77 -Button B: X+56, Y+51 -Prize: X=2952, Y=5840 - -Button A: X+13, Y+76 -Button B: X+46, Y+11 -Prize: X=14558, Y=6711 - -Button A: X+46, Y+20 -Button B: X+45, Y+70 -Prize: X=6149, Y=5750 - -Button A: X+92, Y+39 -Button B: X+54, Y+97 -Prize: X=10056, Y=10488 - -Button A: X+25, Y+48 -Button B: X+80, Y+50 -Prize: X=2260, Y=1542 - -Button A: X+12, Y+52 -Button B: X+39, Y+20 -Prize: X=2225, Y=10452 - -Button A: X+25, Y+62 -Button B: X+42, Y+15 -Prize: X=2596, Y=12552 - -Button A: X+11, Y+39 -Button B: X+67, Y+17 -Prize: X=2192, Y=12338 - -Button A: X+90, Y+59 -Button B: X+19, Y+57 -Prize: X=5277, Y=7602 - -Button A: X+50, Y+34 -Button B: X+33, Y+80 -Prize: X=1245, Y=1710 - -Button A: X+11, Y+63 -Button B: X+83, Y+12 -Prize: X=4173, Y=15554 - -Button A: X+52, Y+97 -Button B: X+91, Y+13 -Prize: X=13091, Y=10469 - -Button A: X+23, Y+57 -Button B: X+69, Y+36 -Prize: X=8771, Y=6614 - -Button A: X+21, Y+40 -Button B: X+67, Y+40 -Prize: X=15512, Y=5120 - -Button A: X+20, Y+47 -Button B: X+66, Y+22 -Prize: X=9426, Y=16922 - -Button A: X+15, Y+37 -Button B: X+49, Y+14 -Prize: X=2334, Y=3915 - -Button A: X+25, Y+51 -Button B: X+44, Y+17 -Prize: X=4718, Y=4386 - -Button A: X+77, Y+30 -Button B: X+16, Y+78 -Prize: X=7755, Y=7758 - -Button A: X+55, Y+87 -Button B: X+64, Y+15 -Prize: X=10939, Y=9456 - -Button A: X+64, Y+17 -Button B: X+24, Y+78 -Prize: X=312, Y=3577 - -Button A: X+15, Y+68 -Button B: X+73, Y+12 -Prize: X=708, Y=6800 - -Button A: X+71, Y+66 -Button B: X+12, Y+42 -Prize: X=7143, Y=8028 - -Button A: X+70, Y+24 -Button B: X+22, Y+66 -Prize: X=1930, Y=10706 - -Button A: X+52, Y+28 -Button B: X+29, Y+47 -Prize: X=19597, Y=3007 - -Button A: X+11, Y+24 -Button B: X+51, Y+24 -Prize: X=2230, Y=1200 - -Button A: X+23, Y+80 -Button B: X+55, Y+15 -Prize: X=2251, Y=1130 - -Button A: X+20, Y+42 -Button B: X+75, Y+48 -Prize: X=15760, Y=14762 - -Button A: X+63, Y+12 -Button B: X+32, Y+77 -Prize: X=1622, Y=1319 - -Button A: X+11, Y+20 -Button B: X+54, Y+22 -Prize: X=10462, Y=1050 - -Button A: X+24, Y+72 -Button B: X+53, Y+12 -Prize: X=5360, Y=10304 - -Button A: X+99, Y+52 -Button B: X+12, Y+52 -Prize: X=8937, Y=5928 - -Button A: X+62, Y+25 -Button B: X+57, Y+95 -Prize: X=10249, Y=10110 - -Button A: X+40, Y+99 -Button B: X+91, Y+13 -Prize: X=3050, Y=1182 - -Button A: X+26, Y+60 -Button B: X+71, Y+38 -Prize: X=9324, Y=9448 - -Button A: X+60, Y+88 -Button B: X+73, Y+32 -Prize: X=8559, Y=7824 - -Button A: X+59, Y+21 -Button B: X+59, Y+75 -Prize: X=4602, Y=2070 - -Button A: X+14, Y+48 -Button B: X+47, Y+19 -Prize: X=4601, Y=3977 - -Button A: X+64, Y+22 -Button B: X+29, Y+65 -Prize: X=12970, Y=19186 - -Button A: X+28, Y+19 -Button B: X+18, Y+43 -Prize: X=2002, Y=2005 - -Button A: X+24, Y+17 -Button B: X+12, Y+30 -Prize: X=14612, Y=12593 - -Button A: X+34, Y+54 -Button B: X+88, Y+12 -Prize: X=9576, Y=2688 - -Button A: X+22, Y+35 -Button B: X+51, Y+17 -Prize: X=6367, Y=4806 - -Button A: X+28, Y+53 -Button B: X+91, Y+44 -Prize: X=5194, Y=3932 - -Button A: X+31, Y+11 -Button B: X+30, Y+69 -Prize: X=14791, Y=1482 - -Button A: X+46, Y+94 -Button B: X+26, Y+17 -Prize: X=3028, Y=3514 - -Button A: X+79, Y+29 -Button B: X+13, Y+52 -Prize: X=16594, Y=6031 - -Button A: X+76, Y+36 -Button B: X+32, Y+80 -Prize: X=5908, Y=3836 - -Button A: X+20, Y+41 -Button B: X+59, Y+28 -Prize: X=4243, Y=10632 - -Button A: X+72, Y+32 -Button B: X+22, Y+58 -Prize: X=15972, Y=11444 - -Button A: X+53, Y+28 -Button B: X+28, Y+58 -Prize: X=3946, Y=10646 - -Button A: X+19, Y+69 -Button B: X+61, Y+22 -Prize: X=9244, Y=17018 - -Button A: X+20, Y+71 -Button B: X+64, Y+18 -Prize: X=17356, Y=9567 - -Button A: X+28, Y+89 -Button B: X+69, Y+50 -Prize: X=5623, Y=5174 - -Button A: X+62, Y+17 -Button B: X+11, Y+73 -Prize: X=1851, Y=10184 - -Button A: X+60, Y+22 -Button B: X+18, Y+38 -Prize: X=3728, Y=6252 - -Button A: X+58, Y+32 -Button B: X+28, Y+94 -Prize: X=5286, Y=6844 - -Button A: X+53, Y+80 -Button B: X+58, Y+14 -Prize: X=8236, Y=5886 - -Button A: X+15, Y+49 -Button B: X+46, Y+18 -Prize: X=11211, Y=18229 - -Button A: X+21, Y+96 -Button B: X+27, Y+29 -Prize: X=2448, Y=7697 - -Button A: X+42, Y+85 -Button B: X+93, Y+37 -Prize: X=5364, Y=5412 - -Button A: X+56, Y+32 -Button B: X+16, Y+31 -Prize: X=3368, Y=3389 - -Button A: X+14, Y+66 -Button B: X+81, Y+66 -Prize: X=7042, Y=11088 - -Button A: X+12, Y+54 -Button B: X+76, Y+37 -Prize: X=5280, Y=15420 - -Button A: X+37, Y+24 -Button B: X+12, Y+44 -Prize: X=4537, Y=5804 - -Button A: X+55, Y+14 -Button B: X+24, Y+85 -Prize: X=4477, Y=3743 - -Button A: X+70, Y+92 -Button B: X+73, Y+17 -Prize: X=5044, Y=2840 - -Button A: X+13, Y+51 -Button B: X+40, Y+38 -Prize: X=2505, Y=5665 - -Button A: X+63, Y+24 -Button B: X+22, Y+55 -Prize: X=6942, Y=6141 - -Button A: X+30, Y+75 -Button B: X+62, Y+22 -Prize: X=14496, Y=6211 - -Button A: X+87, Y+43 -Button B: X+30, Y+75 -Prize: X=3153, Y=6312 - -Button A: X+77, Y+37 -Button B: X+14, Y+45 -Prize: X=11197, Y=3283 - -Button A: X+48, Y+25 -Button B: X+49, Y+96 -Prize: X=1254, Y=1076 - -Button A: X+14, Y+77 -Button B: X+53, Y+55 -Prize: X=1972, Y=5170 - -Button A: X+32, Y+19 -Button B: X+18, Y+39 -Prize: X=3720, Y=3681 - -Button A: X+36, Y+13 -Button B: X+39, Y+75 -Prize: X=5181, Y=6196 - -Button A: X+34, Y+23 -Button B: X+11, Y+35 -Prize: X=14981, Y=13421 - -Button A: X+83, Y+28 -Button B: X+11, Y+47 -Prize: X=5038, Y=15145 - -Button A: X+44, Y+98 -Button B: X+78, Y+26 -Prize: X=7832, Y=4444 - -Button A: X+18, Y+11 -Button B: X+19, Y+44 -Prize: X=15969, Y=15082 - -Button A: X+14, Y+81 -Button B: X+39, Y+34 -Prize: X=1722, Y=1914 - -Button A: X+29, Y+94 -Button B: X+75, Y+55 -Prize: X=9696, Y=14311 - -Button A: X+41, Y+79 -Button B: X+58, Y+19 -Prize: X=4374, Y=5367 - -Button A: X+47, Y+14 -Button B: X+35, Y+66 -Prize: X=17301, Y=1534 - -Button A: X+68, Y+29 -Button B: X+21, Y+98 -Prize: X=6996, Y=5833 - -Button A: X+16, Y+61 -Button B: X+72, Y+15 -Prize: X=10896, Y=9927 - -Button A: X+69, Y+16 -Button B: X+17, Y+99 -Prize: X=4411, Y=2924 - -Button A: X+16, Y+73 -Button B: X+43, Y+42 -Prize: X=2463, Y=4299 - -Button A: X+54, Y+16 -Button B: X+21, Y+43 -Prize: X=4187, Y=10273 - -Button A: X+49, Y+13 -Button B: X+49, Y+83 -Prize: X=6076, Y=4902 - -Button A: X+40, Y+19 -Button B: X+17, Y+31 -Prize: X=18121, Y=6893 - -Button A: X+22, Y+89 -Button B: X+62, Y+33 -Prize: X=3470, Y=2929 - -Button A: X+24, Y+51 -Button B: X+51, Y+11 -Prize: X=13013, Y=7760 - -Button A: X+40, Y+72 -Button B: X+94, Y+29 -Prize: X=10730, Y=8799 - -Button A: X+85, Y+18 -Button B: X+64, Y+86 -Prize: X=3858, Y=4222 - -Button A: X+99, Y+11 -Button B: X+18, Y+71 -Prize: X=1530, Y=722 - -Button A: X+69, Y+12 -Button B: X+93, Y+98 -Prize: X=11136, Y=9792 - -Button A: X+95, Y+75 -Button B: X+21, Y+96 -Prize: X=917, Y=1677 - -Button A: X+22, Y+57 -Button B: X+46, Y+17 -Prize: X=7332, Y=17866 - -Button A: X+55, Y+19 -Button B: X+27, Y+67 -Prize: X=8606, Y=17118 - -Button A: X+42, Y+92 -Button B: X+77, Y+50 -Prize: X=3416, Y=2736 - -Button A: X+13, Y+64 -Button B: X+92, Y+86 -Prize: X=5175, Y=6030 - -Button A: X+56, Y+18 -Button B: X+20, Y+46 -Prize: X=4068, Y=5212 - -Button A: X+78, Y+11 -Button B: X+19, Y+79 -Prize: X=6081, Y=10602 - -Button A: X+19, Y+87 -Button B: X+84, Y+35 -Prize: X=3342, Y=3765 - -Button A: X+57, Y+33 -Button B: X+19, Y+43 -Prize: X=8062, Y=8686 - -Button A: X+93, Y+60 -Button B: X+14, Y+72 -Prize: X=1229, Y=2556 - -Button A: X+55, Y+24 -Button B: X+14, Y+94 -Prize: X=1871, Y=6002 - -Button A: X+13, Y+19 -Button B: X+37, Y+15 -Prize: X=11560, Y=7340 - -Button A: X+97, Y+92 -Button B: X+68, Y+14 -Prize: X=12918, Y=8566 - -Button A: X+64, Y+16 -Button B: X+19, Y+58 -Prize: X=15227, Y=15866 - -Button A: X+12, Y+62 -Button B: X+63, Y+17 -Prize: X=11813, Y=12953 - -Button A: X+72, Y+28 -Button B: X+20, Y+52 -Prize: X=1284, Y=4264 - -Button A: X+76, Y+17 -Button B: X+23, Y+38 -Prize: X=8199, Y=4101 - -Button A: X+84, Y+38 -Button B: X+17, Y+47 -Prize: X=7592, Y=6422 - -Button A: X+76, Y+26 -Button B: X+33, Y+61 -Prize: X=7100, Y=3622 - -Button A: X+53, Y+45 -Button B: X+14, Y+48 -Prize: X=3495, Y=4737 - -Button A: X+14, Y+57 -Button B: X+95, Y+13 -Prize: X=2193, Y=4817 - -Button A: X+91, Y+24 -Button B: X+39, Y+44 -Prize: X=8905, Y=4776 - -Button A: X+36, Y+95 -Button B: X+54, Y+14 -Prize: X=6570, Y=8985 - -Button A: X+47, Y+26 -Button B: X+27, Y+45 -Prize: X=9856, Y=1870 - -Button A: X+70, Y+23 -Button B: X+33, Y+80 -Prize: X=6705, Y=3932 - -Button A: X+93, Y+22 -Button B: X+72, Y+97 -Prize: X=13317, Y=8748 - -Button A: X+68, Y+56 -Button B: X+12, Y+82 -Prize: X=3792, Y=5070 - -Button A: X+91, Y+19 -Button B: X+50, Y+58 -Prize: X=7149, Y=4917 - -Button A: X+17, Y+85 -Button B: X+62, Y+56 -Prize: X=6472, Y=11278 - -Button A: X+71, Y+18 -Button B: X+16, Y+75 -Prize: X=7574, Y=7170 - -Button A: X+13, Y+78 -Button B: X+64, Y+76 -Prize: X=3350, Y=6856 - -Button A: X+65, Y+14 -Button B: X+16, Y+42 -Prize: X=8942, Y=19674 - -Button A: X+37, Y+19 -Button B: X+20, Y+33 -Prize: X=15445, Y=3074 - -Button A: X+12, Y+40 -Button B: X+76, Y+26 -Prize: X=1848, Y=19728 - -Button A: X+86, Y+16 -Button B: X+11, Y+96 -Prize: X=7116, Y=9216 - -Button A: X+62, Y+14 -Button B: X+49, Y+69 -Prize: X=5138, Y=6722 - -Button A: X+44, Y+63 -Button B: X+42, Y+17 -Prize: X=10920, Y=3470 - -Button A: X+51, Y+26 -Button B: X+35, Y+55 -Prize: X=11198, Y=1063 - -Button A: X+85, Y+11 -Button B: X+11, Y+72 -Prize: X=507, Y=16765 - -Button A: X+50, Y+17 -Button B: X+28, Y+55 -Prize: X=2500, Y=4978 - -Button A: X+17, Y+41 -Button B: X+60, Y+38 -Prize: X=11731, Y=5537 - -Button A: X+31, Y+41 -Button B: X+91, Y+36 -Prize: X=9013, Y=6353 - -Button A: X+62, Y+21 -Button B: X+15, Y+59 -Prize: X=1794, Y=13288 - -Button A: X+41, Y+14 -Button B: X+26, Y+49 -Prize: X=7670, Y=3910 - -Button A: X+24, Y+99 -Button B: X+95, Y+54 -Prize: X=8639, Y=10971 - -Button A: X+13, Y+80 -Button B: X+93, Y+52 -Prize: X=4898, Y=7248 - -Button A: X+97, Y+73 -Button B: X+31, Y+83 -Prize: X=6926, Y=10702 - -Button A: X+21, Y+86 -Button B: X+90, Y+65 -Prize: X=7887, Y=8317 - -Button A: X+37, Y+42 -Button B: X+83, Y+27 -Prize: X=7887, Y=3105 - -Button A: X+19, Y+68 -Button B: X+67, Y+25 -Prize: X=3042, Y=7375 - -Button A: X+30, Y+51 -Button B: X+80, Y+15 -Prize: X=2140, Y=2670 - -Button A: X+87, Y+22 -Button B: X+49, Y+91 -Prize: X=6983, Y=3338 - -Button A: X+74, Y+42 -Button B: X+14, Y+40 -Prize: X=8560, Y=1180 - -Button A: X+98, Y+11 -Button B: X+53, Y+87 -Prize: X=4734, Y=3125 - -Button A: X+36, Y+60 -Button B: X+94, Y+15 -Prize: X=6512, Y=2070 - -Button A: X+36, Y+11 -Button B: X+33, Y+57 -Prize: X=15008, Y=16375 - -Button A: X+79, Y+51 -Button B: X+18, Y+46 -Prize: X=12284, Y=18892 - -Button A: X+25, Y+63 -Button B: X+66, Y+18 -Prize: X=12741, Y=16919 - -Button A: X+11, Y+54 -Button B: X+76, Y+33 -Prize: X=4920, Y=6683 - -Button A: X+23, Y+71 -Button B: X+55, Y+17 -Prize: X=15713, Y=18075 - -Button A: X+92, Y+85 -Button B: X+72, Y+14 -Prize: X=11088, Y=6988 - -Button A: X+90, Y+31 -Button B: X+15, Y+41 -Prize: X=8280, Y=5217 - -Button A: X+16, Y+52 -Button B: X+72, Y+24 -Prize: X=15496, Y=13792 - -Button A: X+17, Y+24 -Button B: X+76, Y+16 -Prize: X=8548, Y=3760 - -Button A: X+21, Y+42 -Button B: X+56, Y+20 -Prize: X=3955, Y=3034 - -Button A: X+57, Y+15 -Button B: X+16, Y+20 -Prize: X=3915, Y=1125 - -Button A: X+64, Y+16 -Button B: X+25, Y+70 -Prize: X=12199, Y=10666 - -Button A: X+13, Y+57 -Button B: X+36, Y+13 -Prize: X=12196, Y=1889 - -Button A: X+50, Y+70 -Button B: X+29, Y+13 -Prize: X=19005, Y=11065 - -Button A: X+58, Y+87 -Button B: X+76, Y+34 -Prize: X=6738, Y=7227 - -Button A: X+79, Y+62 -Button B: X+24, Y+88 -Prize: X=2126, Y=1876 - -Button A: X+29, Y+89 -Button B: X+70, Y+22 -Prize: X=7399, Y=4003 - -Button A: X+61, Y+36 -Button B: X+12, Y+47 -Prize: X=7624, Y=15339 - -Button A: X+16, Y+27 -Button B: X+43, Y+14 -Prize: X=15461, Y=6925 - -Button A: X+53, Y+14 -Button B: X+17, Y+53 -Prize: X=1833, Y=2085 - -Button A: X+12, Y+46 -Button B: X+76, Y+33 -Prize: X=17232, Y=7631 - -Button A: X+23, Y+15 -Button B: X+11, Y+32 -Prize: X=2079, Y=2051 - -Button A: X+14, Y+61 -Button B: X+79, Y+31 -Prize: X=19076, Y=19749 - -Button A: X+67, Y+97 -Button B: X+95, Y+39 -Prize: X=12736, Y=11344 - -Button A: X+14, Y+23 -Button B: X+35, Y+11 -Prize: X=6444, Y=17109 - -Button A: X+14, Y+40 -Button B: X+32, Y+17 -Prize: X=5020, Y=6220 - -Button A: X+53, Y+14 -Button B: X+14, Y+42 -Prize: X=17332, Y=3966 - -Button A: X+43, Y+16 -Button B: X+12, Y+25 -Prize: X=2577, Y=12758 - -Button A: X+26, Y+12 -Button B: X+24, Y+47 -Prize: X=17828, Y=3061 - -Button A: X+99, Y+66 -Button B: X+43, Y+91 -Prize: X=6135, Y=8391 - -Button A: X+13, Y+41 -Button B: X+63, Y+12 -Prize: X=6296, Y=12458 - -Button A: X+18, Y+42 -Button B: X+88, Y+22 -Prize: X=2486, Y=1034 - -Button A: X+35, Y+80 -Button B: X+52, Y+37 -Prize: X=5416, Y=8041 - -Button A: X+81, Y+32 -Button B: X+21, Y+50 -Prize: X=3750, Y=1690 - -Button A: X+90, Y+27 -Button B: X+17, Y+82 -Prize: X=3355, Y=6005 - -Button A: X+35, Y+14 -Button B: X+35, Y+48 -Prize: X=13850, Y=6312 - -Button A: X+94, Y+82 -Button B: X+14, Y+41 -Prize: X=4962, Y=6027 - -Button A: X+18, Y+86 -Button B: X+36, Y+31 -Prize: X=2826, Y=8849 - -Button A: X+24, Y+42 -Button B: X+57, Y+26 -Prize: X=4289, Y=16742 - -Button A: X+15, Y+59 -Button B: X+76, Y+27 -Prize: X=12775, Y=18008 - -Button A: X+64, Y+27 -Button B: X+20, Y+65 -Prize: X=19348, Y=11874 - -Button A: X+27, Y+55 -Button B: X+85, Y+14 -Prize: X=2653, Y=1903 - -Button A: X+90, Y+12 -Button B: X+47, Y+90 -Prize: X=681, Y=342 - -Button A: X+13, Y+29 -Button B: X+18, Y+13 -Prize: X=2527, Y=8550 - -Button A: X+71, Y+34 -Button B: X+25, Y+59 -Prize: X=10411, Y=6369 - -Button A: X+78, Y+26 -Button B: X+61, Y+98 -Prize: X=7284, Y=3360 - -Button A: X+49, Y+78 -Button B: X+47, Y+11 -Prize: X=8090, Y=8347 - -Button A: X+65, Y+29 -Button B: X+23, Y+59 -Prize: X=3886, Y=2806 - -Button A: X+13, Y+58 -Button B: X+82, Y+33 -Prize: X=17126, Y=1844 - -Button A: X+15, Y+46 -Button B: X+52, Y+29 -Prize: X=14512, Y=8557 - -Button A: X+51, Y+19 -Button B: X+17, Y+57 -Prize: X=4573, Y=2565 - -Button A: X+16, Y+84 -Button B: X+43, Y+29 -Prize: X=2326, Y=2374 - -Button A: X+21, Y+80 -Button B: X+52, Y+12 -Prize: X=2872, Y=11268 - -Button A: X+16, Y+56 -Button B: X+42, Y+20 -Prize: X=1218, Y=17444 - -Button A: X+43, Y+14 -Button B: X+25, Y+38 -Prize: X=2364, Y=11092 - -Button A: X+34, Y+16 -Button B: X+42, Y+65 -Prize: X=19300, Y=16358 - -Button A: X+12, Y+47 -Button B: X+68, Y+29 -Prize: X=17592, Y=3390 - -Button A: X+38, Y+11 -Button B: X+55, Y+70 -Prize: X=4021, Y=1867 - -Button A: X+33, Y+13 -Button B: X+14, Y+52 -Prize: X=8642, Y=16058 - -Button A: X+74, Y+27 -Button B: X+12, Y+54 -Prize: X=5318, Y=5265 - -Button A: X+28, Y+44 -Button B: X+38, Y+11 -Prize: X=11126, Y=12365 - -Button A: X+34, Y+56 -Button B: X+44, Y+20 -Prize: X=14102, Y=5556 - -Button A: X+75, Y+85 -Button B: X+53, Y+16 -Prize: X=6607, Y=5549 - -Button A: X+81, Y+20 -Button B: X+35, Y+57 -Prize: X=2908, Y=3281 - -Button A: X+13, Y+30 -Button B: X+41, Y+19 -Prize: X=10899, Y=10340 - -Button A: X+11, Y+25 -Button B: X+64, Y+22 -Prize: X=18766, Y=8966 - -Button A: X+57, Y+15 -Button B: X+17, Y+42 -Prize: X=14691, Y=8777 - -Button A: X+19, Y+29 -Button B: X+72, Y+16 -Prize: X=7014, Y=3194 - -Button A: X+22, Y+57 -Button B: X+44, Y+21 -Prize: X=15632, Y=19217 - -Button A: X+48, Y+94 -Button B: X+86, Y+37 -Prize: X=11514, Y=11115 - -Button A: X+11, Y+53 -Button B: X+57, Y+22 -Prize: X=8712, Y=5709 - -Button A: X+92, Y+23 -Button B: X+12, Y+81 -Prize: X=7868, Y=7661 - -Button A: X+52, Y+79 -Button B: X+63, Y+22 -Prize: X=5604, Y=2322 - -Button A: X+20, Y+51 -Button B: X+95, Y+41 -Prize: X=9500, Y=8125 - -Button A: X+24, Y+85 -Button B: X+68, Y+46 -Prize: X=7808, Y=9339 - -Button A: X+16, Y+58 -Button B: X+83, Y+72 -Prize: X=2007, Y=4300 - -Button A: X+86, Y+16 -Button B: X+31, Y+75 -Prize: X=7780, Y=5186 - -Button A: X+21, Y+59 -Button B: X+89, Y+41 -Prize: X=2578, Y=3062 - -Button A: X+62, Y+13 -Button B: X+34, Y+86 -Prize: X=5006, Y=6334 - -Button A: X+75, Y+86 -Button B: X+80, Y+11 -Prize: X=6665, Y=1749 - -Button A: X+20, Y+55 -Button B: X+59, Y+47 -Prize: X=2643, Y=3004 diff --git a/2024/go/day14/day14.go b/2024/go/day14/day14.go deleted file mode 100644 index 2ed2ef6..0000000 --- a/2024/go/day14/day14.go +++ /dev/null @@ -1,149 +0,0 @@ -package day14 - -import ( - "adventofcode2024/utils" - grid "adventofcode2024/utils/grid2d" - "fmt" - "regexp" - "strings" -) - -type Robot struct { - velocity [2]int -} - -const SIZE_X = 101 -const SIZE_Y = 103 - -func Part1(input string) int { - grid := grid.NewGrid(SIZE_X, SIZE_Y, []Robot{}) - pattern := `p=(-?\d+),(-?\d+) v=(-?\d+),(-?\d+)` - re := regexp.MustCompile(pattern) - lines := strings.Split(input, "\n") - for _, line := range lines { - matches := re.FindStringSubmatch(line) - fmt.Println(matches) - x := utils.MustAtoi(matches[1]) - y := utils.MustAtoi(matches[2]) - x1 := utils.MustAtoi(matches[3]) - y1 := utils.MustAtoi(matches[4]) - robots := grid.Get(x, y) - grid.Set(x, y, append(robots, Robot{velocity: [2]int{x1, y1}})) - } - fmt.Println(grid.StringWithFormatter(formatter)) - ng := ticks(grid, 100) - fmt.Println(ng.StringWithFormatter(formatter)) - - return get_saftey(ng) -} - -func Part2(input string) int { - min_safe := 240096000 - min_i := 0 - max_safe := 0 - max_i := 0 - grid := grid.NewGrid(SIZE_X, SIZE_Y, []Robot{}) - pattern := `p=(-?\d+),(-?\d+) v=(-?\d+),(-?\d+)` - re := regexp.MustCompile(pattern) - lines := strings.Split(input, "\n") - for _, line := range lines { - matches := re.FindStringSubmatch(line) - fmt.Println(matches) - x := utils.MustAtoi(matches[1]) - y := utils.MustAtoi(matches[2]) - x1 := utils.MustAtoi(matches[3]) - y1 := utils.MustAtoi(matches[4]) - robots := grid.Get(x, y) - grid.Set(x, y, append(robots, Robot{velocity: [2]int{x1, y1}})) - } - fmt.Println(grid.StringWithFormatter(formatter)) - max_safe = get_saftey(grid) - for i:=0;i<7380;i++ { - ng := ticks(grid, 1) - safe := get_saftey(ng) - if safe > max_safe { - max_safe = safe - max_i = i - } - if safe < min_safe { - min_safe = safe - min_i = i - } - grid = ng - } - for i:=7380;i<7390;i++{ - ng := ticks(grid, 1) - fmt.Println(ng.StringWithFormatter(formatter)) - grid = ng - } - fmt.Println(grid.StringWithFormatter(formatter)) - fmt.Printf("max_safe: %d max_i: %d min_safe: %d min_i:%d", max_safe, max_i, min_safe, min_i) - return get_saftey(grid) -} - -func formatter(robots []Robot, x int, y int) string { - if len(robots) == 0 { - return " " - } - return "*" -} - -func ticks(g *grid.Grid[[]Robot], seconds int) *grid.Grid[[]Robot] { - ng := grid.NewGrid(SIZE_X, SIZE_Y, []Robot{}) - for y := 0; y < g.SizeY(); y++ { - for x := 0; x < g.SizeX(); x++ { - for _, robot := range g.Get(x, y) { - nx := x + ((robot.velocity[0] * seconds) % SIZE_X) - if nx < 0 { - nx = g.SizeX() + nx - } - if nx >= g.SizeX() { - nx = nx - g.SizeX() - } - ny := y + ((robot.velocity[1] * seconds) % SIZE_Y) - if ny < 0 { - ny = g.SizeY() + ny - } - if ny >= g.SizeY() { - ny = ny - g.SizeY() - } - robots := ng.Get(nx, ny) - ng.Set(nx, ny, append(robots, robot)) - } - } - } - return ng -} - -func get_saftey(grid *grid.Grid[[]Robot]) int { - robots := 0 - val := 1 - for y := 0; y < grid.SizeY()/2; y++ { - for x := 0; x < grid.SizeX()/2; x++ { - robots += len(grid.Get(x, y)) - } - } - val *= robots - robots = 0 - for y := 0; y < grid.SizeY()/2; y++ { - for x := grid.SizeX()/2 + 1; x < grid.SizeX(); x++ { - robots += len(grid.Get(x, y)) - } - } - val *= robots - robots = 0 - for y := grid.SizeY()/2 + 1; y < grid.SizeY(); y++ { - for x := grid.SizeX()/2 + 1; x < grid.SizeX(); x++ { - robots += len(grid.Get(x, y)) - } - } - val *= robots - robots = 0 - for y := grid.SizeY()/2 + 1; y < grid.SizeY(); y++ { - for x := 0; x < grid.SizeX()/2; x++ { - robots += len(grid.Get(x, y)) - } - } - val *= robots - return val -} \ No newline at end of file diff --git a/2024/go/day14/day14_test.go b/2024/go/day14/day14_test.go deleted file mode 100644 index 791e1d9..0000000 --- a/2024/go/day14/day14_test.go +++ /dev/null @@ -1,527 +0,0 @@ -package day14 - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -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`) - require.Equal(t, 12, r) -} - -func TestPart2(t *testing.T) { - r := Part2(`p=80,75 v=69,72 -p=88,10 v=-28,-23 -p=79,61 v=79,59 -p=37,102 v=92,-43 -p=12,22 v=-5,-95 -p=60,13 v=-30,-42 -p=3,59 v=-96,-88 -p=85,33 v=-43,-41 -p=44,14 v=63,45 -p=6,6 v=-34,-86 -p=47,102 v=12,42 -p=36,88 v=-88,-93 -p=78,27 v=-18,52 -p=96,64 v=-62,-34 -p=49,99 v=-78,-15 -p=57,31 v=-80,21 -p=25,57 v=8,-84 -p=69,20 v=81,61 -p=80,5 v=-11,-30 -p=2,35 v=-85,77 -p=9,12 v=-4,36 -p=37,68 v=12,-69 -p=47,88 v=-8,-90 -p=72,68 v=59,-86 -p=55,38 v=-68,-94 -p=60,58 v=41,37 -p=76,87 v=-1,-18 -p=89,9 v=38,92 -p=100,67 v=17,-53 -p=83,73 v=80,32 -p=77,19 v=-54,-20 -p=10,86 v=-65,36 -p=13,88 v=-64,-84 -p=50,29 v=-17,-29 -p=79,38 v=89,-57 -p=55,57 v=-68,22 -p=71,82 v=-80,52 -p=37,83 v=-68,-43 -p=25,5 v=81,-22 -p=83,54 v=-32,-75 -p=27,95 v=-77,-55 -p=70,97 v=-72,-4 -p=3,84 v=-60,-60 -p=16,29 v=-35,99 -p=39,39 v=37,-38 -p=76,94 v=90,60 -p=18,21 v=-86,-26 -p=22,84 v=-16,66 -p=45,83 v=-40,-43 -p=35,52 v=54,3 -p=30,21 v=14,36 -p=69,61 v=69,-66 -p=52,22 v=-28,33 -p=9,21 v=-85,-73 -p=87,32 v=79,52 -p=28,85 v=-35,85 -p=32,58 v=-49,89 -p=22,75 v=85,44 -p=45,19 v=-88,61 -p=97,59 v=98,-75 -p=70,81 v=82,7 -p=97,102 v=-23,-8 -p=92,68 v=89,72 -p=24,42 v=-63,-97 -p=21,64 v=-45,-47 -p=58,3 v=-69,51 -p=33,68 v=19,-20 -p=27,6 v=-89,-21 -p=28,81 v=-67,-8 -p=59,83 v=-66,-82 -p=3,14 v=-3,-1 -p=19,65 v=15,-25 -p=57,37 v=53,-29 -p=36,84 v=-4,-84 -p=55,96 v=82,-21 -p=68,101 v=51,51 -p=68,8 v=-90,-30 -p=78,51 v=-51,-63 -p=4,55 v=-63,97 -p=100,60 v=76,-13 -p=7,91 v=-96,-73 -p=97,17 v=-54,33 -p=85,60 v=69,-3 -p=20,39 v=96,-85 -p=24,12 v=86,-84 -p=34,7 v=-7,-36 -p=30,69 v=-67,97 -p=65,17 v=20,33 -p=39,101 v=-7,-83 -p=38,51 v=-90,-4 -p=99,61 v=-13,59 -p=30,1 v=-67,-96 -p=1,89 v=-85,-83 -p=8,1 v=68,4 -p=89,89 v=-52,85 -p=81,5 v=-55,71 -p=99,60 v=-94,-72 -p=68,70 v=-10,78 -p=81,18 v=89,-95 -p=47,61 v=-39,56 -p=91,71 v=85,59 -p=28,66 v=44,-28 -p=10,64 v=-59,-4 -p=84,10 v=-32,-11 -p=29,52 v=-37,34 -p=78,43 v=-92,12 -p=85,3 v=-71,4 -p=37,85 v=-46,-84 -p=56,21 v=21,-32 -p=17,17 v=15,17 -p=26,87 v=45,-93 -p=57,21 v=-6,40 -p=95,48 v=-33,59 -p=38,59 v=65,-72 -p=59,85 v=-50,-99 -p=17,21 v=86,-45 -p=53,3 v=-28,-46 -p=1,40 v=-54,-91 -p=61,13 v=-40,83 -p=33,35 v=-72,-96 -p=40,14 v=33,-8 -p=29,89 v=53,-59 -p=74,0 v=-22,-42 -p=12,32 v=-65,-4 -p=82,89 v=-12,20 -p=35,71 v=-40,20 -p=14,5 v=95,83 -p=46,44 v=39,92 -p=25,54 v=-66,-47 -p=91,78 v=64,53 -p=14,9 v=25,67 -p=39,29 v=-29,8 -p=20,100 v=95,51 -p=59,41 v=92,-82 -p=15,92 v=93,-73 -p=42,93 v=3,-86 -p=82,93 v=-21,-96 -p=50,9 v=12,-39 -p=81,22 v=-13,99 -p=72,81 v=-51,-93 -p=88,19 v=-72,-14 -p=8,93 v=-85,-15 -p=54,2 v=61,8 -p=44,81 v=66,41 -p=78,10 v=90,8 -p=19,53 v=68,4 -p=80,43 v=9,46 -p=11,38 v=-66,88 -p=31,3 v=4,-2 -p=49,28 v=-74,21 -p=27,15 v=54,-88 -p=96,87 v=-50,-67 -p=94,94 v=-5,-97 -p=16,89 v=73,23 -p=93,32 v=-53,93 -p=47,17 v=-29,92 -p=10,78 v=16,35 -p=55,33 v=-60,-17 -p=55,73 v=-68,-22 -p=100,62 v=17,-69 -p=67,91 v=-49,45 -p=68,53 v=-42,-41 -p=35,73 v=54,47 -p=20,63 v=-85,-12 -p=23,16 v=-87,33 -p=70,55 v=50,-16 -p=92,6 v=41,-59 -p=9,97 v=-37,47 -p=48,48 v=42,40 -p=96,37 v=-90,32 -p=66,13 v=-60,91 -p=62,46 v=-50,18 -p=11,15 v=98,77 -p=42,78 v=1,47 -p=10,40 v=15,-48 -p=88,44 v=7,-75 -p=27,53 v=-70,-9 -p=21,7 v=-56,96 -p=92,81 v=-22,69 -p=57,65 v=92,-34 -p=85,63 v=77,11 -p=92,2 v=-30,21 -p=59,16 v=73,-70 -p=16,11 v=86,-89 -p=82,16 v=80,-36 -p=41,30 v=-49,19 -p=13,6 v=14,73 -p=67,99 v=-91,51 -p=37,20 v=-65,-37 -p=85,16 v=99,-14 -p=1,39 v=-44,56 -p=37,29 v=74,5 -p=44,51 v=-18,93 -p=43,9 v=-55,-84 -p=5,10 v=-65,26 -p=51,90 v=-59,-96 -p=55,98 v=-9,23 -p=0,94 v=88,-49 -p=91,43 v=-14,-72 -p=93,43 v=-69,-94 -p=84,100 v=-12,54 -p=23,46 v=85,78 -p=79,37 v=39,-10 -p=1,23 v=99,-79 -p=73,50 v=-51,84 -p=78,58 v=-31,-16 -p=75,44 v=69,71 -p=27,5 v=-87,14 -p=95,91 v=-33,63 -p=22,94 v=-5,-37 -p=36,11 v=-5,-60 -p=18,3 v=-64,-27 -p=44,14 v=24,-92 -p=96,40 v=65,-92 -p=47,1 v=84,25 -p=93,22 v=68,-48 -p=14,32 v=-24,37 -p=99,17 v=78,-89 -p=53,36 v=10,58 -p=44,44 v=-78,-60 -p=15,28 v=-96,-20 -p=96,61 v=-81,-45 -p=58,87 v=-9,7 -p=20,43 v=84,-22 -p=50,42 v=-18,68 -p=74,23 v=-12,42 -p=12,57 v=-94,-94 -p=49,49 v=-89,40 -p=47,98 v=-67,-8 -p=84,17 v=-62,11 -p=31,6 v=-57,-42 -p=28,67 v=66,-81 -p=0,3 v=-88,-13 -p=51,76 v=82,76 -p=67,81 v=87,-14 -p=84,78 v=39,41 -p=39,74 v=72,35 -p=30,10 v=64,-77 -p=10,31 v=11,-4 -p=6,90 v=-4,76 -p=90,24 v=-2,-23 -p=8,39 v=-57,-27 -p=31,69 v=93,-25 -p=79,38 v=39,-35 -p=69,31 v=70,30 -p=1,16 v=7,73 -p=46,9 v=-99,-70 -p=53,16 v=-94,-84 -p=32,60 v=33,-69 -p=62,22 v=-99,-4 -p=66,3 v=98,20 -p=4,76 v=46,-75 -p=50,71 v=-90,22 -p=57,12 v=31,-15 -p=59,84 v=-50,-65 -p=33,0 v=76,-48 -p=58,76 v=-30,44 -p=6,69 v=6,35 -p=74,91 v=-61,-43 -p=36,92 v=-58,60 -p=2,78 v=-48,-98 -p=43,91 v=53,76 -p=34,101 v=-77,79 -p=40,44 v=-68,28 -p=71,64 v=47,-48 -p=54,7 v=84,15 -p=54,75 v=-60,-31 -p=14,40 v=86,12 -p=80,29 v=-92,-26 -p=8,47 v=-33,-69 -p=2,41 v=12,-9 -p=39,60 v=-38,59 -p=13,22 v=86,-20 -p=25,12 v=-57,11 -p=60,47 v=96,96 -p=50,51 v=-48,-82 -p=85,40 v=89,74 -p=99,4 v=-94,-21 -p=75,7 v=29,-73 -p=28,58 v=-80,24 -p=46,94 v=-9,56 -p=24,65 v=-76,62 -p=50,2 v=-20,70 -p=85,55 v=-5,66 -p=38,11 v=43,36 -p=53,54 v=53,24 -p=18,45 v=65,96 -p=94,22 v=16,80 -p=79,28 v=75,-69 -p=30,38 v=-15,-29 -p=5,23 v=-4,49 -p=8,98 v=96,-99 -p=7,60 v=-14,47 -p=96,17 v=88,-73 -p=48,23 v=-41,35 -p=17,31 v=-26,-23 -p=13,52 v=66,37 -p=58,19 v=41,55 -p=25,9 v=-77,-89 -p=3,92 v=55,-80 -p=74,95 v=20,-77 -p=26,70 v=43,72 -p=54,4 v=96,-18 -p=63,8 v=-97,49 -p=23,51 v=87,-75 -p=24,18 v=85,36 -p=8,52 v=6,-13 -p=97,50 v=17,-72 -p=47,66 v=-25,6 -p=38,78 v=3,-93 -p=62,6 v=5,77 -p=56,74 v=-70,-6 -p=94,99 v=9,34 -p=19,92 v=-18,26 -p=35,54 v=-47,-69 -p=92,8 v=-13,42 -p=47,86 v=12,-90 -p=12,83 v=-68,2 -p=0,18 v=-75,-89 -p=11,99 v=-99,14 -p=88,20 v=62,21 -p=27,53 v=53,-47 -p=17,44 v=-5,-91 -p=57,10 v=66,-65 -p=66,95 v=-71,-12 -p=38,21 v=23,95 -p=68,69 v=-31,35 -p=87,71 v=50,72 -p=98,12 v=47,33 -p=94,21 v=66,51 -p=53,97 v=-16,-93 -p=59,35 v=6,39 -p=12,88 v=-86,88 -p=85,16 v=39,8 -p=38,85 v=35,80 -p=44,9 v=-48,11 -p=71,18 v=-82,39 -p=85,14 v=-74,-73 -p=88,22 v=-42,36 -p=8,6 v=-58,38 -p=21,58 v=-66,9 -p=25,17 v=-68,95 -p=89,16 v=-34,-86 -p=33,54 v=64,-88 -p=57,8 v=54,51 -p=40,18 v=-98,58 -p=91,22 v=-34,-53 -p=75,81 v=-70,26 -p=89,70 v=-2,69 -p=62,6 v=-1,-92 -p=78,24 v=-82,-42 -p=47,7 v=-75,83 -p=86,8 v=-63,95 -p=80,64 v=-36,-79 -p=69,95 v=-30,29 -p=46,86 v=85,20 -p=76,35 v=-82,-51 -p=33,15 v=-17,55 -p=40,58 v=-2,-11 -p=76,31 v=39,2 -p=46,82 v=-15,-45 -p=14,53 v=36,-16 -p=98,66 v=68,-3 -p=83,38 v=35,-87 -p=41,9 v=53,70 -p=35,33 v=-68,-68 -p=53,66 v=62,97 -p=75,80 v=49,-62 -p=66,70 v=-50,47 -p=78,80 v=7,64 -p=82,16 v=85,-81 -p=58,25 v=11,-70 -p=36,72 v=33,72 -p=66,92 v=-91,10 -p=24,52 v=-98,22 -p=74,7 v=-36,-79 -p=46,26 v=-61,-90 -p=52,24 v=53,-88 -p=92,26 v=31,78 -p=60,52 v=80,-81 -p=82,78 v=-81,-49 -p=10,3 v=-15,-55 -p=91,31 v=99,77 -p=75,50 v=-91,40 -p=49,71 v=93,91 -p=1,94 v=-54,54 -p=96,50 v=39,18 -p=0,3 v=-53,33 -p=34,9 v=-17,-8 -p=96,28 v=68,-63 -p=25,4 v=66,21 -p=94,74 v=82,-89 -p=47,66 v=-17,87 -p=58,23 v=63,83 -p=13,82 v=-74,75 -p=29,85 v=40,79 -p=57,7 v=50,83 -p=7,88 v=-37,-16 -p=81,61 v=-10,34 -p=6,32 v=33,-60 -p=63,7 v=1,98 -p=59,29 v=-31,-85 -p=85,91 v=19,-18 -p=22,39 v=21,90 -p=25,13 v=75,89 -p=14,100 v=-27,30 -p=33,6 v=97,-53 -p=84,83 v=-22,38 -p=100,69 v=77,-38 -p=2,67 v=-14,-25 -p=71,71 v=-53,73 -p=9,43 v=-52,98 -p=55,76 v=-60,94 -p=49,91 v=-35,-95 -p=77,68 v=26,12 -p=41,91 v=-17,-15 -p=1,69 v=-44,72 -p=32,61 v=4,59 -p=94,12 v=-33,30 -p=1,35 v=96,49 -p=72,64 v=-61,-53 -p=76,93 v=38,-37 -p=97,9 v=33,61 -p=60,32 v=80,18 -p=16,68 v=15,-29 -p=99,72 v=66,44 -p=99,18 v=56,99 -p=42,11 v=-88,11 -p=57,69 v=-2,-2 -p=39,57 v=26,-51 -p=34,15 v=73,42 -p=56,55 v=-61,-75 -p=89,1 v=67,-27 -p=21,100 v=5,70 -p=85,11 v=-35,63 -p=16,35 v=47,-63 -p=98,0 v=93,-2 -p=51,89 v=-9,85 -p=50,32 v=84,-42 -p=29,63 v=78,-76 -p=92,86 v=89,10 -p=27,11 v=-77,51 -p=65,21 v=-59,68 -p=84,68 v=20,-50 -p=19,2 v=-24,-36 -p=25,78 v=25,-85 -p=90,92 v=59,-87 -p=70,100 v=10,-52 -p=48,78 v=3,54 -p=85,81 v=30,44 -p=53,65 v=41,-67 -p=13,95 v=82,-29 -p=5,19 v=95,75 -p=37,96 v=-68,26 -p=83,16 v=-5,-9 -p=31,17 v=4,-20 -p=83,34 v=-83,-76 -p=50,88 v=93,-5 -p=66,36 v=-30,58 -p=11,29 v=-44,83 -p=31,31 v=-77,-51 -p=26,85 v=14,-18 -p=8,76 v=65,69 -p=60,70 v=-40,47 -p=69,70 v=22,64 -p=85,53 v=18,12 -p=97,93 v=-58,-57 -p=52,83 v=92,-9 -p=20,92 v=30,50 -p=88,73 v=32,3 -p=83,16 v=-42,-14 -p=57,89 v=-29,20 -p=50,19 v=73,8 -p=8,101 v=-94,-68 -p=12,77 v=-4,-84 -p=63,28 v=-84,91 -p=46,25 v=13,-95 -p=93,21 v=88,-26 -p=10,54 v=-24,72 -p=69,16 v=-92,-30 -p=26,68 v=21,97 -p=56,30 v=-90,-51 -p=62,69 v=-1,-50 -p=7,6 v=55,-39 -p=63,78 v=76,92 -p=57,55 v=-51,-19 -p=70,62 v=18,37 -p=88,26 v=-61,82 -p=80,50 v=-73,99 -p=40,1 v=-78,86 -p=35,85 v=81,-12 -p=17,74 v=56,47 -p=36,99 v=64,-15 -p=56,18 v=-29,-14 -p=42,44 v=-18,46 -p=84,4 v=-63,-2 -p=97,75 v=27,-62 -p=47,71 v=54,-50 -p=26,101 v=-67,-83 -p=30,74 v=-57,66`) - require.Equal(t, 0, r) -} diff --git a/2024/go/day14/input.txt b/2024/go/day14/input.txt deleted file mode 100644 index 179e1e7..0000000 --- a/2024/go/day14/input.txt +++ /dev/null @@ -1,500 +0,0 @@ -p=80,75 v=69,72 -p=88,10 v=-28,-23 -p=79,61 v=79,59 -p=37,102 v=92,-43 -p=12,22 v=-5,-95 -p=60,13 v=-30,-42 -p=3,59 v=-96,-88 -p=85,33 v=-43,-41 -p=44,14 v=63,45 -p=6,6 v=-34,-86 -p=47,102 v=12,42 -p=36,88 v=-88,-93 -p=78,27 v=-18,52 -p=96,64 v=-62,-34 -p=49,99 v=-78,-15 -p=57,31 v=-80,21 -p=25,57 v=8,-84 -p=69,20 v=81,61 -p=80,5 v=-11,-30 -p=2,35 v=-85,77 -p=9,12 v=-4,36 -p=37,68 v=12,-69 -p=47,88 v=-8,-90 -p=72,68 v=59,-86 -p=55,38 v=-68,-94 -p=60,58 v=41,37 -p=76,87 v=-1,-18 -p=89,9 v=38,92 -p=100,67 v=17,-53 -p=83,73 v=80,32 -p=77,19 v=-54,-20 -p=10,86 v=-65,36 -p=13,88 v=-64,-84 -p=50,29 v=-17,-29 -p=79,38 v=89,-57 -p=55,57 v=-68,22 -p=71,82 v=-80,52 -p=37,83 v=-68,-43 -p=25,5 v=81,-22 -p=83,54 v=-32,-75 -p=27,95 v=-77,-55 -p=70,97 v=-72,-4 -p=3,84 v=-60,-60 -p=16,29 v=-35,99 -p=39,39 v=37,-38 -p=76,94 v=90,60 -p=18,21 v=-86,-26 -p=22,84 v=-16,66 -p=45,83 v=-40,-43 -p=35,52 v=54,3 -p=30,21 v=14,36 -p=69,61 v=69,-66 -p=52,22 v=-28,33 -p=9,21 v=-85,-73 -p=87,32 v=79,52 -p=28,85 v=-35,85 -p=32,58 v=-49,89 -p=22,75 v=85,44 -p=45,19 v=-88,61 -p=97,59 v=98,-75 -p=70,81 v=82,7 -p=97,102 v=-23,-8 -p=92,68 v=89,72 -p=24,42 v=-63,-97 -p=21,64 v=-45,-47 -p=58,3 v=-69,51 -p=33,68 v=19,-20 -p=27,6 v=-89,-21 -p=28,81 v=-67,-8 -p=59,83 v=-66,-82 -p=3,14 v=-3,-1 -p=19,65 v=15,-25 -p=57,37 v=53,-29 -p=36,84 v=-4,-84 -p=55,96 v=82,-21 -p=68,101 v=51,51 -p=68,8 v=-90,-30 -p=78,51 v=-51,-63 -p=4,55 v=-63,97 -p=100,60 v=76,-13 -p=7,91 v=-96,-73 -p=97,17 v=-54,33 -p=85,60 v=69,-3 -p=20,39 v=96,-85 -p=24,12 v=86,-84 -p=34,7 v=-7,-36 -p=30,69 v=-67,97 -p=65,17 v=20,33 -p=39,101 v=-7,-83 -p=38,51 v=-90,-4 -p=99,61 v=-13,59 -p=30,1 v=-67,-96 -p=1,89 v=-85,-83 -p=8,1 v=68,4 -p=89,89 v=-52,85 -p=81,5 v=-55,71 -p=99,60 v=-94,-72 -p=68,70 v=-10,78 -p=81,18 v=89,-95 -p=47,61 v=-39,56 -p=91,71 v=85,59 -p=28,66 v=44,-28 -p=10,64 v=-59,-4 -p=84,10 v=-32,-11 -p=29,52 v=-37,34 -p=78,43 v=-92,12 -p=85,3 v=-71,4 -p=37,85 v=-46,-84 -p=56,21 v=21,-32 -p=17,17 v=15,17 -p=26,87 v=45,-93 -p=57,21 v=-6,40 -p=95,48 v=-33,59 -p=38,59 v=65,-72 -p=59,85 v=-50,-99 -p=17,21 v=86,-45 -p=53,3 v=-28,-46 -p=1,40 v=-54,-91 -p=61,13 v=-40,83 -p=33,35 v=-72,-96 -p=40,14 v=33,-8 -p=29,89 v=53,-59 -p=74,0 v=-22,-42 -p=12,32 v=-65,-4 -p=82,89 v=-12,20 -p=35,71 v=-40,20 -p=14,5 v=95,83 -p=46,44 v=39,92 -p=25,54 v=-66,-47 -p=91,78 v=64,53 -p=14,9 v=25,67 -p=39,29 v=-29,8 -p=20,100 v=95,51 -p=59,41 v=92,-82 -p=15,92 v=93,-73 -p=42,93 v=3,-86 -p=82,93 v=-21,-96 -p=50,9 v=12,-39 -p=81,22 v=-13,99 -p=72,81 v=-51,-93 -p=88,19 v=-72,-14 -p=8,93 v=-85,-15 -p=54,2 v=61,8 -p=44,81 v=66,41 -p=78,10 v=90,8 -p=19,53 v=68,4 -p=80,43 v=9,46 -p=11,38 v=-66,88 -p=31,3 v=4,-2 -p=49,28 v=-74,21 -p=27,15 v=54,-88 -p=96,87 v=-50,-67 -p=94,94 v=-5,-97 -p=16,89 v=73,23 -p=93,32 v=-53,93 -p=47,17 v=-29,92 -p=10,78 v=16,35 -p=55,33 v=-60,-17 -p=55,73 v=-68,-22 -p=100,62 v=17,-69 -p=67,91 v=-49,45 -p=68,53 v=-42,-41 -p=35,73 v=54,47 -p=20,63 v=-85,-12 -p=23,16 v=-87,33 -p=70,55 v=50,-16 -p=92,6 v=41,-59 -p=9,97 v=-37,47 -p=48,48 v=42,40 -p=96,37 v=-90,32 -p=66,13 v=-60,91 -p=62,46 v=-50,18 -p=11,15 v=98,77 -p=42,78 v=1,47 -p=10,40 v=15,-48 -p=88,44 v=7,-75 -p=27,53 v=-70,-9 -p=21,7 v=-56,96 -p=92,81 v=-22,69 -p=57,65 v=92,-34 -p=85,63 v=77,11 -p=92,2 v=-30,21 -p=59,16 v=73,-70 -p=16,11 v=86,-89 -p=82,16 v=80,-36 -p=41,30 v=-49,19 -p=13,6 v=14,73 -p=67,99 v=-91,51 -p=37,20 v=-65,-37 -p=85,16 v=99,-14 -p=1,39 v=-44,56 -p=37,29 v=74,5 -p=44,51 v=-18,93 -p=43,9 v=-55,-84 -p=5,10 v=-65,26 -p=51,90 v=-59,-96 -p=55,98 v=-9,23 -p=0,94 v=88,-49 -p=91,43 v=-14,-72 -p=93,43 v=-69,-94 -p=84,100 v=-12,54 -p=23,46 v=85,78 -p=79,37 v=39,-10 -p=1,23 v=99,-79 -p=73,50 v=-51,84 -p=78,58 v=-31,-16 -p=75,44 v=69,71 -p=27,5 v=-87,14 -p=95,91 v=-33,63 -p=22,94 v=-5,-37 -p=36,11 v=-5,-60 -p=18,3 v=-64,-27 -p=44,14 v=24,-92 -p=96,40 v=65,-92 -p=47,1 v=84,25 -p=93,22 v=68,-48 -p=14,32 v=-24,37 -p=99,17 v=78,-89 -p=53,36 v=10,58 -p=44,44 v=-78,-60 -p=15,28 v=-96,-20 -p=96,61 v=-81,-45 -p=58,87 v=-9,7 -p=20,43 v=84,-22 -p=50,42 v=-18,68 -p=74,23 v=-12,42 -p=12,57 v=-94,-94 -p=49,49 v=-89,40 -p=47,98 v=-67,-8 -p=84,17 v=-62,11 -p=31,6 v=-57,-42 -p=28,67 v=66,-81 -p=0,3 v=-88,-13 -p=51,76 v=82,76 -p=67,81 v=87,-14 -p=84,78 v=39,41 -p=39,74 v=72,35 -p=30,10 v=64,-77 -p=10,31 v=11,-4 -p=6,90 v=-4,76 -p=90,24 v=-2,-23 -p=8,39 v=-57,-27 -p=31,69 v=93,-25 -p=79,38 v=39,-35 -p=69,31 v=70,30 -p=1,16 v=7,73 -p=46,9 v=-99,-70 -p=53,16 v=-94,-84 -p=32,60 v=33,-69 -p=62,22 v=-99,-4 -p=66,3 v=98,20 -p=4,76 v=46,-75 -p=50,71 v=-90,22 -p=57,12 v=31,-15 -p=59,84 v=-50,-65 -p=33,0 v=76,-48 -p=58,76 v=-30,44 -p=6,69 v=6,35 -p=74,91 v=-61,-43 -p=36,92 v=-58,60 -p=2,78 v=-48,-98 -p=43,91 v=53,76 -p=34,101 v=-77,79 -p=40,44 v=-68,28 -p=71,64 v=47,-48 -p=54,7 v=84,15 -p=54,75 v=-60,-31 -p=14,40 v=86,12 -p=80,29 v=-92,-26 -p=8,47 v=-33,-69 -p=2,41 v=12,-9 -p=39,60 v=-38,59 -p=13,22 v=86,-20 -p=25,12 v=-57,11 -p=60,47 v=96,96 -p=50,51 v=-48,-82 -p=85,40 v=89,74 -p=99,4 v=-94,-21 -p=75,7 v=29,-73 -p=28,58 v=-80,24 -p=46,94 v=-9,56 -p=24,65 v=-76,62 -p=50,2 v=-20,70 -p=85,55 v=-5,66 -p=38,11 v=43,36 -p=53,54 v=53,24 -p=18,45 v=65,96 -p=94,22 v=16,80 -p=79,28 v=75,-69 -p=30,38 v=-15,-29 -p=5,23 v=-4,49 -p=8,98 v=96,-99 -p=7,60 v=-14,47 -p=96,17 v=88,-73 -p=48,23 v=-41,35 -p=17,31 v=-26,-23 -p=13,52 v=66,37 -p=58,19 v=41,55 -p=25,9 v=-77,-89 -p=3,92 v=55,-80 -p=74,95 v=20,-77 -p=26,70 v=43,72 -p=54,4 v=96,-18 -p=63,8 v=-97,49 -p=23,51 v=87,-75 -p=24,18 v=85,36 -p=8,52 v=6,-13 -p=97,50 v=17,-72 -p=47,66 v=-25,6 -p=38,78 v=3,-93 -p=62,6 v=5,77 -p=56,74 v=-70,-6 -p=94,99 v=9,34 -p=19,92 v=-18,26 -p=35,54 v=-47,-69 -p=92,8 v=-13,42 -p=47,86 v=12,-90 -p=12,83 v=-68,2 -p=0,18 v=-75,-89 -p=11,99 v=-99,14 -p=88,20 v=62,21 -p=27,53 v=53,-47 -p=17,44 v=-5,-91 -p=57,10 v=66,-65 -p=66,95 v=-71,-12 -p=38,21 v=23,95 -p=68,69 v=-31,35 -p=87,71 v=50,72 -p=98,12 v=47,33 -p=94,21 v=66,51 -p=53,97 v=-16,-93 -p=59,35 v=6,39 -p=12,88 v=-86,88 -p=85,16 v=39,8 -p=38,85 v=35,80 -p=44,9 v=-48,11 -p=71,18 v=-82,39 -p=85,14 v=-74,-73 -p=88,22 v=-42,36 -p=8,6 v=-58,38 -p=21,58 v=-66,9 -p=25,17 v=-68,95 -p=89,16 v=-34,-86 -p=33,54 v=64,-88 -p=57,8 v=54,51 -p=40,18 v=-98,58 -p=91,22 v=-34,-53 -p=75,81 v=-70,26 -p=89,70 v=-2,69 -p=62,6 v=-1,-92 -p=78,24 v=-82,-42 -p=47,7 v=-75,83 -p=86,8 v=-63,95 -p=80,64 v=-36,-79 -p=69,95 v=-30,29 -p=46,86 v=85,20 -p=76,35 v=-82,-51 -p=33,15 v=-17,55 -p=40,58 v=-2,-11 -p=76,31 v=39,2 -p=46,82 v=-15,-45 -p=14,53 v=36,-16 -p=98,66 v=68,-3 -p=83,38 v=35,-87 -p=41,9 v=53,70 -p=35,33 v=-68,-68 -p=53,66 v=62,97 -p=75,80 v=49,-62 -p=66,70 v=-50,47 -p=78,80 v=7,64 -p=82,16 v=85,-81 -p=58,25 v=11,-70 -p=36,72 v=33,72 -p=66,92 v=-91,10 -p=24,52 v=-98,22 -p=74,7 v=-36,-79 -p=46,26 v=-61,-90 -p=52,24 v=53,-88 -p=92,26 v=31,78 -p=60,52 v=80,-81 -p=82,78 v=-81,-49 -p=10,3 v=-15,-55 -p=91,31 v=99,77 -p=75,50 v=-91,40 -p=49,71 v=93,91 -p=1,94 v=-54,54 -p=96,50 v=39,18 -p=0,3 v=-53,33 -p=34,9 v=-17,-8 -p=96,28 v=68,-63 -p=25,4 v=66,21 -p=94,74 v=82,-89 -p=47,66 v=-17,87 -p=58,23 v=63,83 -p=13,82 v=-74,75 -p=29,85 v=40,79 -p=57,7 v=50,83 -p=7,88 v=-37,-16 -p=81,61 v=-10,34 -p=6,32 v=33,-60 -p=63,7 v=1,98 -p=59,29 v=-31,-85 -p=85,91 v=19,-18 -p=22,39 v=21,90 -p=25,13 v=75,89 -p=14,100 v=-27,30 -p=33,6 v=97,-53 -p=84,83 v=-22,38 -p=100,69 v=77,-38 -p=2,67 v=-14,-25 -p=71,71 v=-53,73 -p=9,43 v=-52,98 -p=55,76 v=-60,94 -p=49,91 v=-35,-95 -p=77,68 v=26,12 -p=41,91 v=-17,-15 -p=1,69 v=-44,72 -p=32,61 v=4,59 -p=94,12 v=-33,30 -p=1,35 v=96,49 -p=72,64 v=-61,-53 -p=76,93 v=38,-37 -p=97,9 v=33,61 -p=60,32 v=80,18 -p=16,68 v=15,-29 -p=99,72 v=66,44 -p=99,18 v=56,99 -p=42,11 v=-88,11 -p=57,69 v=-2,-2 -p=39,57 v=26,-51 -p=34,15 v=73,42 -p=56,55 v=-61,-75 -p=89,1 v=67,-27 -p=21,100 v=5,70 -p=85,11 v=-35,63 -p=16,35 v=47,-63 -p=98,0 v=93,-2 -p=51,89 v=-9,85 -p=50,32 v=84,-42 -p=29,63 v=78,-76 -p=92,86 v=89,10 -p=27,11 v=-77,51 -p=65,21 v=-59,68 -p=84,68 v=20,-50 -p=19,2 v=-24,-36 -p=25,78 v=25,-85 -p=90,92 v=59,-87 -p=70,100 v=10,-52 -p=48,78 v=3,54 -p=85,81 v=30,44 -p=53,65 v=41,-67 -p=13,95 v=82,-29 -p=5,19 v=95,75 -p=37,96 v=-68,26 -p=83,16 v=-5,-9 -p=31,17 v=4,-20 -p=83,34 v=-83,-76 -p=50,88 v=93,-5 -p=66,36 v=-30,58 -p=11,29 v=-44,83 -p=31,31 v=-77,-51 -p=26,85 v=14,-18 -p=8,76 v=65,69 -p=60,70 v=-40,47 -p=69,70 v=22,64 -p=85,53 v=18,12 -p=97,93 v=-58,-57 -p=52,83 v=92,-9 -p=20,92 v=30,50 -p=88,73 v=32,3 -p=83,16 v=-42,-14 -p=57,89 v=-29,20 -p=50,19 v=73,8 -p=8,101 v=-94,-68 -p=12,77 v=-4,-84 -p=63,28 v=-84,91 -p=46,25 v=13,-95 -p=93,21 v=88,-26 -p=10,54 v=-24,72 -p=69,16 v=-92,-30 -p=26,68 v=21,97 -p=56,30 v=-90,-51 -p=62,69 v=-1,-50 -p=7,6 v=55,-39 -p=63,78 v=76,92 -p=57,55 v=-51,-19 -p=70,62 v=18,37 -p=88,26 v=-61,82 -p=80,50 v=-73,99 -p=40,1 v=-78,86 -p=35,85 v=81,-12 -p=17,74 v=56,47 -p=36,99 v=64,-15 -p=56,18 v=-29,-14 -p=42,44 v=-18,46 -p=84,4 v=-63,-2 -p=97,75 v=27,-62 -p=47,71 v=54,-50 -p=26,101 v=-67,-83 -p=30,74 v=-57,66 diff --git a/2024/go/day15/day15.go b/2024/go/day15/day15.go deleted file mode 100644 index 349865b..0000000 --- a/2024/go/day15/day15.go +++ /dev/null @@ -1,119 +0,0 @@ -package day15 - -import ( - _ "adventofcode2024/utils" - _ "adventofcode2024/utils/grid2d" - _ "adventofcode2024/utils/grid2d" - "adventofcode2024/utils/inputs" - "fmt" - _ "regexp" - "strings" - - _ "github.com/deckarep/golang-set/v2" -) - -type Loc struct { - x int - y int -} - -type Queue struct { - elements []Loc -} - -// Push adds an element to the end of the queue -func (q *Queue) Push(value Loc) { - q.elements = append(q.elements, value) -} - -// Pop removes an element from the front of the queue -func (q *Queue) Pop() (Loc, bool) { - if len(q.elements) == 0 { - return Loc{}, false // Return zero and false if the queue is empty - } - value := q.elements[0] - q.elements = q.elements[1:] // Remove the first element - return value, true -} - -// IsEmpty checks if the queue is empty -func (q *Queue) IsEmpty() bool { - return len(q.elements) == 0 -} - -func Part1(input string) int { - var val int - var rloc Loc - in := strings.Split(input, "\n\n") - dirs := map[rune][2]int{ - '<': {-1, 0}, - '>': {1, 0}, - '^': {0, -1}, - 'v': {0, 1}, - } - grid := inputs.ToGrid2D(in[0], "\n", "", ',', func(c string) rune { return rune(c[0]) }) - directions := strings.ReplaceAll(in[1], "\n", "") - fmt.Printf("%v\n", grid.StringWithFormatter(formatter)) - fmt.Printf("%v\n", directions) - found := false - for x := 0; x < grid.SizeX(); x++ { - if found { - break - } - for y := 0; y < grid.SizeY(); y++ { - if grid.Get(x, y) == '@' { - rloc = Loc{x: x, y: y} - found = true - break - } - } - } - fmt.Printf("Robot: %v\n", rloc) - for _, dir := range directions { - q := &Queue{} - x := rloc.x - y := rloc.y - Loop: - for { - x += dirs[dir][0] - y += dirs[dir][1] - switch grid.Get(x, y) { - case 'O': - q.Push(Loc{x: x, y: y}) - case '.': - for !q.IsEmpty() { - grid.Set(x, y, 'O') - loc, _ := q.Pop() - fmt.Printf("%d,%d\n", loc.x, loc.y) - // grid.Set(loc.x, loc.y, 'O') - x -= dirs[dir][0] - y -= dirs[dir][1] - } - grid.Set(rloc.x, rloc.y, '.') - rloc.x = x - rloc.y = y - grid.Set(rloc.x, rloc.y, '@') - break Loop - case '#': - break Loop - } - } - // fmt.Printf("%v\n", grid.StringWithFormatter(formatter)) - } - for x := 0; x < grid.SizeX(); x++ { - for y := 0; y < grid.SizeY(); y++ { - if grid.Get(x, y) == 'O' { - val += (100 * y) + x - } - } - } - return val -} - -func Part2(input string) int { - return 0 -} - -func formatter(p rune, x int, y int) string { - return string(p) -} diff --git a/2024/go/day15/day15_test.go b/2024/go/day15/day15_test.go deleted file mode 100644 index 3abc33f..0000000 --- a/2024/go/day15/day15_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package day15 - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestPart1(t *testing.T) { - r := Part1(`########## -#..O..O.O# -#......O.# -#.OO..O.O# -#..O@..O.# -#O#..O...# -#O..O..O.# -#.OO.O.OO# -#....O...# -########## - -^v>^vv^v>v<>v^v<<><>>v^v^>^<<<><^ -vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<^<^^>>>^<>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^v^^<^^vv< -<>^^^^>>>v^<>vvv^>^^^vv^^>v<^^^^v<>^>vvvv><>>v^<<^^^^^ -^><^><>>><>^^<<^^v>>><^^>v>>>^v><>^v><<<>vvvv>^<><<>^>< -^>><>^v<><^vvv<^^<><^v<<<><<<^^<^>>^<<<^>>^v^>>^v>vv>^<<^v<>><<><<>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^ -<><^^>^^^<>^vv<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<> -^^>vv<^v^v^<>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<>< -v^^>>><<^^<>>^v^v^<<>^<^v^v><^<<<><<^vv>>v>v^<<^`) - require.Equal(t, 10092, r) -} - -func TestPart2(t *testing.T) { - r := Part2(`########## -#..O..O.O# -#......O.# -#.OO..O.O# -#..O@..O.# -#O#..O...# -#O..O..O.# -#.OO.O.OO# -#....O...# -########## - -^v>^vv^v>v<>v^v<<><>>v^v^>^<<<><^ -vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<^<^^>>>^<>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^v^^<^^vv< -<>^^^^>>>v^<>vvv^>^^^vv^^>v<^^^^v<>^>vvvv><>>v^<<^^^^^ -^><^><>>><>^^<<^^v>>><^^>v>>>^v><>^v><<<>vvvv>^<><<>^>< -^>><>^v<><^vvv<^^<><^v<<<><<<^^<^>>^<<<^>>^v^>>^v>vv>^<<^v<>><<><<>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^ -<><^^>^^^<>^vv<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<> -^^>vv<^v^v^<>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<>< -v^^>>><<^^<>>^v^v^<<>^<^v^v><^<<<><<^vv>>v>v^<<^`) - require.Equal(t, 0, r) -} diff --git a/2024/go/day15/input.txt b/2024/go/day15/input.txt deleted file mode 100644 index 923444c..0000000 --- a/2024/go/day15/input.txt +++ /dev/null @@ -1,71 +0,0 @@ -################################################## -#...O.#..O....##O..OO.#O..#.#.......OO...#O.#OO..# -#O#..OO...O..O.O.....O.O.O....OO#.....O#.O.OO..O.# -#........O....#...O......O.OO...#..O.O.#O#....O..# -#..O.OO..O..O.#..O.O.OO.O...O...O......#O.....O..# -#..OO.....O.OO.O#.......O.........O.....O.O.O....# -#.O.#.O.O#......OO........O.O.....OO..O.O.O.#.#O.# -#........#.....#.##O....O.O..OOO.......OOO.#O....# -#.O#.#...OO.....#.......O...O...#O.O.......OO..OO# -#.O...O..#O...#O..O.........O.O..OO..O.......O.OO# -#O.O......O.OO..O.O.......O.OO#O.##...#....#O.O.O# -#.O...O.OO.O....O..O.O...O...#.O....OO..O.O#O#OO.# -#.....O.O..#O.....O.O..##O.O#OO...O...O.O.O......# -##..O...O..OO.O.O.O..OO........#.##.........O.O..# -#..O...O.OO..OOO.O...#..#.........#.O....OO......# -#O....OOO.OO...O##.O.OO..O.O.....O.O.OOO....O.O.O# -#O.O..OO.O..OO............O....O....O..OO...OO..## -#.O...O.O.O.....O..O.O...O.#.......OOO...........# -#O.O...O.....#..O..#O...O.O.O....O#...#.###.....O# -#.O...O.O..#O.#.OO.......O.OO.O...O...........O..# -##O.#O....O.#............O..O..O.....O..O..OO....# -##..#.OO.O.OO.#.O....O...#........#........O.O...# -#..O.OO...O....#..OO.O...........OOOO#..OO#O.....# -#OO.O#...#..#...O#........O.OOO...OO....#O.OO#OOO# -#...OOO............#O.#.@...O.....O#.#.O...O..O..# -#...O...OO.#..O......O..............#OOO......OOO# -#..#OO...O.#O......O..OO.O#...O....OO..O...O.O#O.# -#.#.##...#O........#.O.....#O#.O.OO..OOO..#..O...# -#.#....#...O..O#O..OOO.....#....#......O...O...#.# -#....O....O......O.O.O..........O.O..O.O......O..# -#.#OO#O.OO............O##.##O.O#.O...O#.........O# -##.O.#..........#......#OOOO.OO.#.O.O.O.....O..#.# -#O.....#OO.....O..............#...O.O..O.....OO#.# -#O.O.O..O#OO.O.O....O..O......O..O........OO.....# -##O....O...............................#.O.....O## -##..O...#...O.........O#...#O...O.OO......OO.O..O# -#O..OO.....OOOO.#......O.#OO..O.O...O.O...O.O.O#.# -#..O.....O.O........O.....O.....O#....OO##OOO..#O# -#O..##....OOO..O#.O....O.#...O.....O.O.O......O.O# -#..OO.#O.......O.OO.O#O.O.....O.....OO..OO.OOOO..# -#.#.#OO.O..O.O........O#.#...#..O.O.O.#.O..OO.O.O# -#..O#.OO.O.#.....O...O..OO#..O...O.O#...O.....#.O# -#.OO.OO....O.O..O..#OO.....#......#.#OO..#.#O.O#.# -#...O....#..#......O....O..O#O...O....OO.......O.# -#.#.....O#.......O..O..#O.OOOO..........O.O......# -#.O.O.....OO.O.O.O..#O.O.O..O.OO....O....##.....## -#O..#.OOO##....O.O..OOOO.O...O..O#..........O....# -##.O##...O.O.....O.O#...O.........#...........OOO# -#O#O.....#..O.OOO...O..OO.....OOO............#O..# -################################################## - -^^<^>^^<<^v>^><^^^^^<><^v>v<^vv>^v<^>>v>^vv<>>>>>v^>v>^>^v<^v^>^^>v<<>>^v^v>^>v^>^^^<^^v>>v>^>v<^^vvv<>vvv<^v<>v><><^^<>v^^<^><>>^^>v^>^<><<^><<>v>>vvv<^^v^v^>>v^^>^vv<^<^<^<><>>>^>>^<><^v<^<^v<^^>^<><<^<<^vv^^v^<^^vv>>^v>^v>^<^>^><>^v<>v>^^^<^vv^^<^v><^^^v<<>>>^<^^>^v>>^^<^^>^>><<^>>vv<>v^^<<>^<><>^^v<^v<<>vv><^>><^<^>>^^>v<^>v^>^<<^^^^v^<>^>^v^^vv<><<vv^v>>>v>>>>>^v>^<><<<><>v<>^vv>v<>^v^<>>v>>v^>^vv^vvv^^<<>vv>^>^v>>v^^vv<^v>^^vv<>^v>^>v^^<>^^>^^v<>^^^<^^<>^>^v><<>>^<>>v>>^><^>v<>v^v<>^<<>>v>^v<>^v<^>^^v>v>>^<^^^<<<<>vvv^v><<^^^v^^^>v><<^^v>vv^v>^>^v<>>vv<<^v<>v><^><>>^vv><>><><<>>v>><>v^^<^v<>^<^<^>v^^^>>v<^^<^^^>^^>^>^>^^<>v>vvv^v^>^<^<>v>^^>v<^>v>v>><> -^vv>>>^vv><^v^<>v>^><^^^>^v>><>>^>^<<^^v^^vv>^v^<^v^>vv<<>^>vvv>v>^vvv>>vv^>v^^v^^vv^^<><<<^^><<^>>>^<>v>>^v>v>><>v><<^v^><>v>v>^>>^^><>v>^>^v>^>><<<^vv<>^<<^><^<<><>vv^^v<<>v>v^vvv>^>^>^<>v<>vv>^>>v^^v<>><>>v<>>^^<>v^vvv<><^^v^>vv<^^>>>v>^>^^><<^v>^^>>^^>v<<<><<><>vv^>v>v^>vv><^<>><<>^>vv<<>v><^^^>v^^<^v>v^<>^<<>^^vvv>vvv><<><^><>>><<>>^><^>^><><^^vv<^>^vvv<^>>><<^>><^v<<^>v>^v>v>>^vv^>>><^>v^<>>v>v^v^><^v^v^<^v<>^><^>>v^^>v<^^^v>v>^^^<^^><><^>>v<>v<^v>^^<>v^>^vv<<^<^v^^^>v^vv<>vv>^^<<><^>><<^v<^>v>>^>><<^<>vv^>v><>^vv^^v>v<<>^<><^^>^^><^>>^v>vvvv>^>v><<^^><^v^<^v><^>vvv><^v<>><<^^>^<^<<<v>^v^>^>vv^<><><>^^<^v^^>^^^^^vv<<<^vv<<<>><>v>vv>^^^<^><><<><<>><^vv^^<v<>^^^^<><^^^<>^^<><<>>>^<>v^^>^^>>^v>v^ -^>>v<><<<<v<<<<^v<>v<<^vv<^vv<^^>>v^>^v^>^<>>>v<^<<^^>>vv^^<^^^>^><>>>vv<>vv<>^^>vv^vvvvvv^v>^^<<^<<<>v>^<^v>vv<>^^>^>><^^^v<>^<^v>^><><<<^><>^>^^vv^>^<<<^>^v>^v<<<>^^<^^<<^<^^<>^<<<^v^<>^>vvv><<<^vv^<^><>><><>v^^>v<^<^vv<>><^>v>^v<><>>^v^^^^v^<<><^^v>><>^v^<>>^v>v^^v<^v><>>v><^^<<^v<>v<<^^>><<<^>>vv>^<^>^<^v^<^v>>>>>><^vv<^>v>>v^>>vvv^vvvvvvv>^^>>>^v<>><>^<<<>^><^^v^v<>><^>^>v><>>v^>^<^<^><<^<>vv^^v^<>v<<<^>>vvv^>><<^<^^><^^>>>v>^^^>^vv^<<>^^^<^v>><>>>>v^<>>^^^<>v^^v^>><<>v>>^>^vvv><>^v>vv^v>>^><>^>v<<^>><^^v><^>^^>^>vv><<<^vvvvv<^<^<^<^^<>v^^>^v<^^v<>v>^>^>vv^>v>^^<^<^^v><^<^^v^v<>>^>v^v<^v>>><^v<^<<^v<^vv^^><>^v<><^>v<>vvv^^^>^^^^^v<^^^^v<><<>>>v^v<>v^^^>^vv>v>v>>><>v>vvvv>v>>vvv>^v<>^^v^<^vv^^>^^>>vv<><^vv>^<^>><<>>v>vv^vv<^<<<<>^v<<>>^v<>>>^v><<<><^<^><>>>>v^>v<><^v>v^>^^v^^>v<v<^v^^<<<^v^^vv^vv>vv^>^^vv^<^^<^>>>>^><<>^>^v^<^v>v^v><<>v^<>>v^^^><<^>^>^<^vvv>>^<^><^v>^^<><^^^>^><^^>>v^vvv><^<v>>^<<<<>^vv^>^<^<<>><^>vvv>v>>v^><><>vv>>^vv>>vv<^<>^^^>^>v>^v><^v^>v^^v^>^>vvvvvv<<^^<^<>^^^v><>><<<^^<>v<>vv<^<^v^v>v>v^vv^v<^v^<<<<^^<<>v<<<<<>v<^vv<>^<>><><^<^^<^<>v<>^<<<>vv<^vv<>^^<>v><><<<^<^>v^vv>vvvv^>v<^^^v<<<>>^>>^>>vv>>>v>v^<<>^^v>v^>^<^^<^^>><^^>v>v>^^>v>>>^<>^^v^v>^^<^v>^v><<v^>v^vvv><<^>>v^^>>>^vvvv^>^^v^^>vvv>^v^^^v^<^>v>>>^^<><>vv>^vvv<<>>v^<>^<^<vv^<v>v><^^>^>vv<^^<^^v<>^vvv^^v^vv>>^>v>v<^^<>vv>^<<>^^^>^<^<^>v>vv^^><>^>^v>>^<> -^<^^<^>v<^<^>^^>><<<>v<^^><>>^^<^^>^v^^><^v^^<^vv><>>v<^v^>>>^<>>^>^>^<>^^^<^v<>vv^v^^<^>v>^>><<>>v<><^<<<>v>>^<>>>>v>^v^<<<>^vv<<^>vv>vv>><^><><<>v><^<>v>>>><><>^vv<^v^vv><<^>v>v<<><>^>^v<^>v>v<>v<<>^vv>v><>><<<>>^^^<^^^^<>^>>vv>^v<^>>vv>^^v>^vv^^^v>v>>><<<>>>v>vv<^>^v>vv^^^<><>v<^>><^vv>^<<^<>><<<<^^>^^<><>v><<^v<<<<<^v>v<^^v<<^<>^><<<>>v<<^v>v>>>v<>>v><><^vv<^^<v>vv^<>^^>>>><<<>^^^^v>v>>>>^v><<^^>v^<v<>>^^v>^><^v>^>^^vvvvv>^>v>v>v>v^^^>^<><<^^^^<>^<^v>^>>>>vv>>>v^>^><^^v>>^>>vv<^^<>>vv^^v^<>>>vvv<>^>vv^<<^<^<>vv>^>v>v<^<<><^v^<^^^<^^^^vv^>^^>^^>><>^<^>v>v<^>>^^^^>^^><>vv><^^>v>^^^^v>^v>^v<^v^>v>^>^^^>v>v^^v^v>^v<^^^>^>vv^^vv>vv>v^v<^<^vv^>^^v>^vvvv<>^^v<>><<v<^>><><^><>>^< -^><^v>v^>vvv^^v^vv<>>>v>>vv^^>v^><^^<>v^><>^v^>v>^^>><<^><>v><^v>>>><<<>v^><<<>><<>^v^^^^<^^><><>^^vv^<^v^>>^>^><>vv^>>>>v^<>vv^>>v^<>vv>>><^><^>^vvvv><<^vvv^<>>v^v>><^^^><>>v^>^<^^><<<>vvv^^^v>^v<>v^>v<>v>v<>^v>vvvv<^>^^^v^^<>^<^^v>>^^^><>v^>><^>vv>><^^^v>><^<<^><<>^>^<>vv>vv^^^^<^>^v<>>^v>>>^v<>v<^v<<^v^v<<<^>>v^v^v<<^^v>vv^>v><>v>^vv>^v>>^<<^><>v>^>v>^<<^<>>^^v<>^>v^<>^v>vvv<><<>>^<^^>^<<>^<>vv^^v^^<<>v<<><^<^^<>>><<^v<<^>v<>vv>^>>>>>vv<<><^^vv^>v^<>v<<<>^>^v>vv^^<^v>v<^<>>^vv>v^<>^v^<>^>><><>v>>v>^><^><^>v><<>>^^^<<^v>v>^vv^>>>^^<>v<^<^>>^v^>v<><^>>>vvv^^^^>vv>^>>>><^<>^>v^v>v<^>>>><^^vv><<>vv<>v<>>^>^^<>>vv>>><<>vvv<<>>vv>^<^^v>>v>^<<<><^v^v^>^v^><<>^v><>>^^>v>>>^^>>v<>>>^v>^v^<<^<<<><>vv^>vvv>^^v>v<^v^v^><^v<>^v>^<>><<^v>vv^ -^>v<>>^vvv>>v^vvv>>v^><>><^v<>vv^>^^><<>><^<^>^v<>v>>v^<>>^<<^vv<^^<>^v><<>>^^<<^vv^v>^>^<>v>>>^<^<^<>v<^><<^><<>>vv><<><>^>>v^^>>>^v<^^<v><>><^<<^v>>^vv^v<>^>><>>>^<>>v><>>^^v>>^><^^^>^^>^>^>^vvvvv<^^>>>>v>vv>v>^vv^v<^v>^>^>vv>v<>v<><<>v^v<>><<<v<<>^v^><>v<><^v>^>^><^^^>v<>vvv<<^^v>^vv^<^>v>>>v>^^><^>^v>^v^^>^^v><>>^<^><^^v^^vv<^>^^>^>>vv<^>vv<<<>><><<^^v><^<^<>v^v>^v^<<v^<<<<v^<>v<^^<<^>^v<<><>><><<<^^>v>^^<^^>v>v<^v>^>>v>>v>v><^v^v<^v>^vv^><^v>><<^<^^^^^^>>v>v^<>v>>v<>v^>v><<<^v^<^<^<>^>>v>>>v>^vv>^^<>v^v>v><^v^>v>>^<^v>>>v>v>vv>^^^>vvvv^><^>^^^v<^><>^^<<^<<^^<^^>^<>^<^<^^v<^^<<>>>^v>^^^^^^^^<>v><^<^v><^>^v^^v>v^^<>vv^<^^v<>v^>^v>v<<<<>><>^<^<^<<><>>^<><<^^<>v^>>^vvv^<^^v^^v<<><^>vv>>^v<^^>^^>^>> -^>vv>^^>v^>>^><>>^<>v><<>v>v^^^>>v>>vv^^<<<>v^^v<<>v>>^<>^v<^^^<><^<<>^<>>v^vvv^v^<^>v^<^^<<^^<<^v<><^v^^v^v^v^^>v^><^>vv>>^><^<v>v>><>^v>^^<^>>v^<<>v<v^>vv>vv^>v^vvv^<>^v><<<>v^vv>vv<>^><^<><^v>>v<<^^^><^>^<>v^^v^^><^^>>v^^<>v>><>v<<^^^^^<<><>^vv^<><<>v>>>^><<^<><>^^v^vv>>v^vvv<>><><>^vv^v>^<^<^v>>>><^>>v>^v><<>^^<>^v^<>vv^<^<>^<<>v><^<^^^^>^<>^^^^<^^>v<<<v>v>>^vv>vvv^>v^vv>v^>vv^v<>>>vv>^>>^^^>><^^v^^<^^>vv<^v>v^vv<<^^<>^vv<^vv>vv<>>^<<>^<<>v<<>v<>v^^<>vv>^^>^vv^v>^<>v^v^>vv^^^>^>><>v><>>>v>>>v>v^v^v>v<^>^<^^>v<>>^><^^<^^<^v^v>vvv<^vv<^<><>^<v^>vv^^^>^>^>><<^>>^v^>v^^^v<^^^<^>>v^v<>^<><v><^^v^<^>>^^v^>>^<<<>v<^^^^<<^^v^^^^^>vv^>>v<^><<<>v^<>v>^ -^^<<>^<^<<<>v^^v>v>>^^^^^^<><^^<<^^v<>^^<^>^v>>>><><<<^^v^<><<<><<^v<<^v>vvv>><^>^>^><^>^>>>v^<<<<^>>v^><^^vv>vv<^>><^^v^^vv<>^^v<>^>>^^vv^^>>v^>>><v<^v^vvv>vvv>^v>^^^<><>v>v><<><^v>>>^<<^vv^^>>^<^^v^>v^<><<^>v>^v^<<><><>v^>>>v>><<^^v^vv^v<><^vvvv^>^><>>>>v^>>^vvv^<><^v>vv<>^><><^>v>vvvv>^^>vvv><^>^v>>^>v>^v<>>>>^^>^>v>^^>^^>>><^<^^v^^^^>^v>v<v^vvv>>v^<^v^v<^v^v<^<<>^v^<>>v>v>^^vv>^v><>^^<<<>v<>v>v><<<<^vv>^>>v><v<^v>v<<>><<>^><<^>>vvvv^<^v^^>>vv>><^vv<^^^>>>v^>^v>vvvv^>>v^><<^<^>^>^>v><><<<^<^vv^<<<>^<<^^<<>v<>><<<>>>>^>v>^^><>^><v>^>^v<^v^v>^<^v^^><<<>v>>v^vv>^^^^v><^>><><<^^<>vv^v^<>^>^<>v<^^>>>^>^>><<<><^>>^v><<>vv>><<>v^^>v>vv<^v<^>v^v>>^v<><<<>^v^<><^v<<vv>>^>^>^>>v>^<^v<<<>^v^v>^v<>v>v>><^<<><>v^^^v^<<^v>>><^^^v>vv>v<>v<>^^> ->^^<^v>v<<^<>^^>^<>vv>v^>^<^v^^>^>vv^<>><<>^v>^>v^v<^^^>v<>v>>>vvv<>^^^vv<^v<^v^<^<>>v<>^><<^<^><^<vv^>><<>>^vv>vv^^>v^^vv<>><>^vv^>v>>^^<^^v^>^^v<>^<<<<^v^^v>>v^^v>^^<^<^>>v^v>^<^v<>>^vvv<^vv>^<<<>^^^<^^^vv^^^<>^^v>>>><^>vvv<^><>^<><>^^>>^<<^>^^<>vv^vv<>v<^>vvv><^<^v>vv<^^^>v>>vv<>><^^v^^vv>^<<^<<^>v^>v^<>^<>v^v<>v><^>>^^<><>>v^vv^^<^>v<>>>^>>><<><>>^v>^^>>v><<^^v<>^<<><>>>>^>><><^>>>v^vvv^^^<><>^<^v<>>v^>>vvv>^<>^vv<>^v>><>><>v^v>^^>vv<^<<^^^v<><^<^v>vv>^<>v<<^vv^^vvv>><>>v<>v^^vv^>^<<^^v<^>v<^^<<^vv><>>^v>^^vvvv>^<^v^^vv><^^^v<>>v^v^^>v^^^^^^^>^v<<><<<^vv<<^vv^<<^<<>>><<><<><>vv>>^^>>>>^^v^^v<<>>^<>>>^^<>>>vv><<>>>^<^<>vv>>v^>v>^>>>^>^>>>>>>^>>><^^v><<><^vvv^>^v^>^>>^v>v^v<>^><^>v -^^^<^vv>^<<^<<><^<<>v^<^^vv><^<>^v>v<>^v^^vvv<^<>vvv^>><^vvv<>^>><>>^>v<>>>>>v^^<^<>^>^<^<<^^<>^>^>^v^v<<>v>^v>>>>^>v>>^v<>><>^>^>v<^<^<^<^<<<>^^>>^<>vvv<<>><>^>vv^>^^v^^>v<^^>>>v^v<><^^vvv>v<<^<^>^^<<^v>>><^^<^^v<>v^><>^v^<<>v>>v>^^>><^<<<^><^^vvv^>^>v<^v^>^><<^v<>>^><>^<>>vv<><>v^<>v^<^>>vv><^v^v<<<>v>^<^v^v<<<^<>>vv^<^^>>^v^<v<^vvv<>v^v>><^v>>^v^^^><<^<^<^>^vvvv<^v>^>>>^v<<><<^>><^^v^^^v^>vvv^^>^v<^>vv^^^v>><<>vv>>^^<>^v>v^v<<^^^>>^vv<>>v>vvv<^v<<>^^v<^>v>^>v>^<>v^v<>>>^vvv^v^<>>>>^v^<<>>>>v<>>^^^^><<^^^^<>^>^<>><<^<<>>^>>vvvvvv^><^^>^^^>^>v<^^^^>>v>v<><^<^^>>^>>^v>vv^vv^v<>>v<<<><vv^<^v>v><>^v>v<^<>>^>>v<<<>^vvv>v^<<^^>^<>vv><>^^^v>v^>vv<^^<>^<>v>vvv<^><<<>^>>^^>v^v<<>^v>> -v^^v<v>>><<>^>^>^v><^^v<^^^^^v^^<>><>>>^<<><^<<^>^<^^^<>>>>v<<>>>vvvv^v^<>v^^>>^>>^<^^v^>v<>^>vv<>>>>vvv>v^v^vv>v<>>vv^<>v^<>>v<<>vv<<>^>vv<>v>^<><^v^>>^<^<<>v^<<^><><>^^><><<>>v<^vv<>^>>v<><^>^<<>^>v^><><>^v>^<>v<^>^v>^>>^>^<<><<^>^><><^v^><^vvvv><>^v>^>vv<^v><^^^^>><^v<<><>v^^^^^^^vvv>^<<<<>v^<<^><<^>vv<^><^vv^>^vvv^>>>><<<^^vv><^><^>>v^^>^^><^vvv<<^vv^^<^>^>v^vv<><^>v>v><>>^>>^^^^^v<>^^>v^>^>^^<^<^^vv^^vv^>vv>vvvv<>v^>^<^^v>^>^vv>v^v<<><^v>>>vvv^^<<>><^^>^vvv^>v<^>v>>^<>^<>v><^<>><<<>><<<^>>>v>vvv^>><>>>>^>v>>v>^>^>>><>^><<^<^>v^^v^>^^>^>^<>^v^>^v<>v^<<>v^v>v><^>>v>><<>v><<>vvv>><^^v<>>v>v^>>vv>^<^>^<>v<<^vv<^>v^v<^<<^<^v<^v><^vvv>^<>^vv^>>><^^<^v<^^<^v^vv<<<>^v>v<<>v>>< -<>>vv^v>v<^<^^v^v^<^>>><^^<<<^<<^<^<<>v^^^^^<^>v^>vvv^>><^<<>>v^<><><<^^<^^><<>>v^v^v>><^^>>v>v<^<><^^><<>^<^v^^v>^^<^v^^v^<^v>^<><>^>^^^^<><^^<<>v>^<><^<><^v^^<^^<^><^<<^^^>v<<>^>>>>>>v>^>^>><^^>>^v>^v>><^vv^v<<^^^<^v^v^>v^v>^<<^vvvv>v>^^>><<<<>^v^v^><><><<<>><^<^^^^vv<>>>>>^v>>>>>v^<^<>vv^<^^v^^>>^^<^<^<><>>^><^>^<^^>v<^^>><^<^vv^v^<<^>>>v<<^>><<^v<^<^<>v<^vv^^^v<^v<^^vv>^vv>>>v^^^>><>v^>><<>v>^^^<^^<<>><>v>>v^v<^>vvvv^^^^vv><>v>^v>v^v><<>^vv^v>>^<>^^^^^v^v>^^vv>v>>>v>^^^vvvv^^>^^><^vv><><>^v^>>v>v^><><^^^^<^vv>^^v>^^>^vvv^^>^>^^v^<^>v^vv<>vv^<<><>^>vv^^v>vv^^<<>>^v^^<<^>^><>v>>^<<v>^v<<<<>^v>^^^>>v<^^v>>v^>v>>>^vv^>><<><><^^^v<^>>vv>>>^^^vv>>v><^^>v><>>^>v>v^<>vv<<^vv>>^>^vv>vvv^>>vv^^<>><>v^>^v>v^v>^>>v<^v^<><>^v<>>><<>^v><>v^vvv>vvvv>^<< -^^><<<^^v>^v<<^<^v<^v^v><^v<^>^v<><^^<<^>><>vv^vvv^v>v<>v<<>vv><>vvv<><^vv^^<<^<^v<>^<^<><<>^>>^v>>^v^>><^>^><^vv>>>>^>vv^v^<<>^^<^v^<v>>^<v^v>v>v><^>^vv>v<^v^vv<>>^>>^>v^^^^^><<>vv^vv<^^>^>^<<^^^>v<>vv<^^<^v>^>>><^<<>^<>^v<<>^>v^>vv^^^<>^^<>^>>^^v^v>vv<<<^>>>v>>^^^>^^v^<^^>^>^>>>><^^>^<^^>v<<^v>^^^v>^^^>^<^^>v<<^v>vv>v^^>^>v>^vv>>v^v<<<>^<^^v><^^<^^v<<^vv>>v>vvv>^v>vvv>^<><>^><<<^v^^^^v^^>v>^>v<^v<<^>^vv^^<>>^<^<v>^<^^<>>><>><v<>><^vvv>v>>>^>v<^^>v^^vv>v^^<><^vv^^v><^^<>^>v>>vv<>>^<<^^vv>vv<^^vv^<<^v<>>v<>>>>^^v>v>>^<^v>vv<^>^<<><<^<>>^<^><>^>v^<>^^<^<>v^v<>v><<>^<^^^v>^<^<^>>>><>^><v>^^<^>^<>v>^^<<^v^<><^v<>^v<<<<<<^^<^>v<<>^v^>^v^v>^<^>^<^>v<v^v>^v>>^v<>v<^vv<>>^^^<>v><><>><>v>^>v^v -vv<<>>vv<^>^^<<^>v>^v<<^^<<^^>^>>vv<<>^v><>>>^^<<^vv>vvv<<><<>v^v>v>vv^>v>^v^>^>>^v>><>^<^><<><>>>vv<>>v>><>vv<<>>vv>^^vv<>^^<<<^^v<>v^^<<<><>v<^^>v<>^vv>^v>>^^^<><<^^^<<>>^v^>vvv^v>v<^v<<>>^v^^v^<^<>^^<>v><>><><<^v<v<^<<>>><>>vv^>^<<>^^v>^>^<<^v>^>v^>^vv<^v><^^v^<>v^<^>>^v<^^^^^v^^>^<v<><^><^v<^<>v<^v^v>^>v><^><><^v^<<>^>^>^^v^<^<>^>vvvv^v^v^v^v><><><>v^^v^<>>vvv^<>^<^^vv^^<<<^v^>>>>>^^>>^>>^^>^v>vvv<^^v>^^v^v^^<<^>>v>v>^^>^<<^><>>^v^><>^^>v>^<<>^^><^v>^>>^^^<>>><<^^^<>>v^<><><>v^v>><^<^<^v^>v^vvvv^v>>vv^>v<<^^^<<>>^<>vv><^>^v>v^<^^^v^>v^>^<>^v^v^v<<<^>^<>^>v<^>>>vv<<>>^vv<>^>^vvvv>v<v^v<^vv<^^^v<^<>^><>>v>^><<^<>><^^>^v^^<^^vv^<<>>v<^v>>><<^^v>^<^v^^^v>^^^^<^^^<^>v<^<>>^<^>vvv<^><>v<^^>><^><^v<><<<^^v^^><^v<<>v -^vv<>v>^v>^<>^v><>><><^>^^^^<v^<>^><>^v<<vv>>v^<>v><>v>v^^<<<>>^v>^vvv<^^^><^v>>v^vv<<>><>v<>>v<<<^<<<^<><<<<<>>^v^vvvvvv^v^<>v<v<>vv<><<^v><>>><^v^v>v>v>>v><^v><>^vv>v^v^^>>>v>v^v>vvv<<<>>>v^v><<<>v>>^><<^vv<>><^>^vvv>v<<<<>^>v<^^<><^<^>>^vv<^v>^v^>^^>^^><^vv<<^<><<<^<<^v^v^>^>>>^v^><<>>^^v^<<^<>>v^>vv><>^^<^>^^v^v<<>^^^v<>>><<^^^<>^^>^>v^^>^v^^<^>^^>vv>vvvv<^v>v^v<>^v<<^>>v>>^^v>^^v>v><^^v<<<vv^<>><<>vv^<<><^<<^^^v>^<<<<^>v>^v^^><>^<^vv>v>>^^>>^><^>^<^v^>^>>^>v<<>><^^<<>vv><^<<<>v>^^v>vvvv>v<>>><^^>^>^vvvv^vvvv<>v<^v^^^^v<>^^>v^^<^^<<^<>^v<^v>>v^<<^<>v^^v^^<^>>v<>^<>>^<><^^^>><>v^<^><^v^^>>v<^<>v^<>^vv>v<^^<^vv<>vv>>^vv>^v<<^>>^^>vv^><^>><^>^>v^v^vv>v<^>><^>v>v>v><>>^<<><^v<^^>v>>>^v><<>^v>>v>^ ->^^>^><<<>v>>^><<><>^<><>>^>>>v^vv^<<>^>^v<>>>>v<v<>v^>>v<<<<>vv^v^<v^>^>>vvv<>>^vv>^v^><^^^v<>>v^vv^v^<^^v>>>v<>^v^<^vvv<><>>vv^>v<<<<>>vv<>^v>><^><^^^>v<<>>>v>^v^<^>v^^<v>v>>>v>^>^v<^<^^<^vv>^<>^v>vv>^^>><^v^v>v<<>v^^^>^^>^<>^>v>>v>>>>vv><>>^v^>>v^^v^><>^><>^^>>>v^<>>>v^>v^^>>>>v>v<^v>>^v^><>^^<>^<<<>^<>>>>>v><>^v^v^<<<^<<<<>v<^^^v><><>^^v^v<^^^^>^<^^^<>vvv<^v^>^v><>v^v^^<>>^v><<<vv^^>v<^^<><<<>>>>><<<^<>>^v>vvv<>v<<^>>v>v<>>^>^^v>><^<^<^^^vv^<><^^v<^<^<>^>^v>vv^v>^v<>v^^<<<^^<>^v<>^<^v^><>v<>^v>^vv^v^>>v>^v<<^>v<<^^v^v>^v<^^>>>>v><>^>vv>^vv<^v>^>v>v<^^<>v^>^v^>>v^^>^v^>v<^vv^^^v<><>^^^>v^^>^<^^><^v^>><^^v>^^^v^>>><><<<>><<<<>v>^>>>^^^v<^^^><<>>>^v<><>v<^vvvv>^<><>^<<<>v^^v^^>vv -<><^>^v^>v^^^<>^^^<><>>>>vv<^v>v>^^><<>v>^<^v^vv^<>>^^^^^v^>vv^><^>>^v^v^^vvvv>><<vvv><><^^>v^>><>^<>^^v^^v>^>^^v^^>v^><^^v<^><>vv^<^^^>>vv^^<<<>>^^v^>v<^<^v>>>v>>><<>><>v^^v<>v>^v<<^^vv^<>v^v>^<<<>>v^<>v^>vv>v^^>v<>v>v>><>^<<^v^<^<^<^vv>>^>vv^^>>^<><>^>>vvv^>v^^>vv^vv<<>v><vv><<>>>^<^v<<<>v^<<>^<>>>v<>>^<^<^v^<^v>>v<v^<<<^<>^v<^^>v>^v<^^>v^v^>>v>v<<^>v^>v^>^^<<^^v<<^v<<^vvv^>^^>>><>^>^^>><v>>>^v>^>>v<^^v<>^vvv>^^>>>v^>v<<^<^v><^v>^^>^v>^<>v^^<>vv>v><><^v^>^^<<<<>><<>^^<<>v^>^^>^^vv<^^v^^>^>vv>>^<>v><v>v^^^vv^vv>vvv^>vv>vv^>>>v<^^><^>>vv>^><<><^><v>><>vv^<><<^<^<>^>v>v^v<<>v^><^^v<>^>vv^v>>>^^^v>>>^><<<^<^<^^v<<<>><>^^vvv>^vv>>^v<><^v<>v>^v^><>^v<v^^^><^>v^vv<<vv>v><^v<^^^><^^ -<^<^v>vvv^v<^v^^>vv^><><>vvv><>vv^^^>^<^^<<^v^v>^v^<<^>>v<^^<><^v^<>>>>^<<>^v^<<>><^<^><<>v^>^>v>vv^<vv^^^^vv>^>vv>^^v<^<>>><>vv>>vvv><^v>^v^v^<^>^vv><^<^>^><^<><<^^vv>>^>v^^^v<><^v^<><^>>v^^v<^>v>^^<>v<<^vv^v><^v^v<^vv^><><^^<>v^<<^^vv^<<>^v^^^<<<><<>>^>^>v><<>v^<<>v<^v^<><<^^<>vv>^vv^^v^v>^><^vvvv^v^>^<^^vvvv^<^v<^<<<>v>><>>^v^^><>^v>^v><<<^^^^^<<^><v^>v>v>v^^^^v><^>>^>^><>v>vv<<>>^><>v<><^<>>^^<^>^^^v^^<<>>vv>><^<<<<>^v<<^v^v<<>^>^vv>><>v<^^<>v^>v>>vv<^vv>>>>v<<>v><><^<<^<^><<<<>v>>v><>v<>v<^vv><<>v>>v>vv><^>><>>>^^^>v>^<>v<>v^<^v<>v^^^vvv^^v^vvv>vvv^v>>^<^>^v<^>>>^<>>^v<<>v<^<<^><>>>^<><^v^^><>><^>vv>^>vv<^v^>v^^v^>^<^>^vvv>>vv^^vv^><^^<<><^>^v^v>>^<^<^^^<<^>v>>^vvv>v>><^>^<^v><^v>^v^^<<^>^^<<>>vv^^<^ -<<<^<^v<^v>>v^^>><><^>vv>^^^vvv<<>^>v>^><<<<^vv^v>^>><<^vv>^^<>v>>>>><><^vv<>v<^><^>>>v<^>>v^<^>>>^>^>v^>vv>^>^vv<^^<^vv^<^><^<^^v^<><<^><^>>^^<^>^>^^<^v^>><^>>><><^^>v^v>vv^^v>^><<^<<<><<<^v>>>><<<>v<>^>^v^<>^><>^>><<<>>^v^vv^v^<^<<>^^<<^^>^^v<>^vv>v>v^^v^>^v<^^v>^<^v><<>^<^^v<^^v^<><<>^^<v>vv>><^>v>v<>^v>v<<<>v^<>vv<>^<^>vv^^<^<^>>><v^^vv><<^<>^<<<>v>vv^><^>><>><^^><^v>v>><>>v>>v^^<<>>v>vv^>^v>v<^>><>>vvv<^>^>^^^>^>^>^><>v><^>>vv><^v>>^>>v^<^<<>>v<>v>v^^v^<>><>><>^>v><^<>^><>v><<<^v<<>>^^<^^>v^>^>^>>v^v^>^^v>vv^v<vvv><>^^>vvv^>vvvv>^^^>^<^^>v<^vvv<<>^<<<>^>^v>v>v^><><^>>>>^>^<^^^><>vvvvv^vv>^>^>>v^v^vv^>^>>v>>^^v>>^^><>v<^<<>>^>>^^><^>>v><^>v^^><^>v^<<>^><^^>>^><vv>>^^<<>>>^><<^v>v<v^>v<<>v diff --git a/2024/go/day16/day16.go b/2024/go/day16/day16.go deleted file mode 100644 index cbf3814..0000000 --- a/2024/go/day16/day16.go +++ /dev/null @@ -1,225 +0,0 @@ -package day16 - -import ( - "adventofcode2024/utils/dijkstra" - "adventofcode2024/utils/grid2d" - "adventofcode2024/utils/inputs" - "fmt" - _ "strings" -) - -type ( - Vec struct{ x, y int } - Dir struct{ x, y int } - Cell rune - Move struct { - p Vec - d Dir - } - Maze struct { - height, width int - start Vec - end Vec - grid *grid2d.Grid[Cell] - } -) - -const ( - WALL Cell = '#' - CORRIDOR Cell = '.' - START Cell = 'S' - END Cell = 'E' - PATH Cell = '*' -) - -var ( - NORTH = Dir{0, -1} - EAST = Dir{1, 0} - SOUTH = Dir{0, 1} - WEST = Dir{-1, 0} - DIRECTIONS = []Dir{NORTH, EAST, SOUTH, WEST} -) - -func Part1(input string) int { - maze := Maze{}.Parse(input) - fmt.Println(maze) - data := inputGraph(*maze) - graph := dijkstra.CreateGraph(data) - data.From.Label = "EAST" - path, dist := dijkstra.GetShortestPath(data.From, data.To, graph) - for _, p := range path { - maze.grid.Set(p.X, p.Y, PATH) - } - fmt.Println(maze) - return dist -} -func Part2(input string) int { - maze := Maze{}.Parse(input) - fmt.Println(maze) - data := inputGraph(*maze) - graph := dijkstra.CreateGraph(data) - data.From.Label = "START" - data.To.Label = "NORTH" - paths, _ := dijkstra.GetAllShortestPaths(data.From, data.To, graph) - bestPaths := make(map[Vec]struct{}) - for _, path := range paths { - for _, node := range path { - bestPaths[Vec{x: node.X, y: node.Y}] = struct{}{} - } - } - return len(bestPaths) -} - -func inputGraph(maze Maze) dijkstra.InputGraph { - data := dijkstra.InputGraph{} - data.From = dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"} - data.To = dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"} - for y := 0; y < maze.height; y++ { - for x := 0; x < maze.width; x++ { - if maze.grid.Get(x, y) == WALL { - continue - } - for _, dir := range DIRECTIONS { - nx, ny := x+dir.x, y+dir.y - if nx < 0 || ny < 0 || nx >= maze.width || ny >= maze.height { - continue - } - if maze.grid.Get(nx, ny) == WALL { - continue - } - for _, d := range getAllowedDirections(dir) { - ss := dirToString(dir) - ds := dirToString(d) - data.Graph = append(data.Graph, dijkstra.InputData{ - Source: dijkstra.Point{X: x, Y: y, Label: ss}, - Destination: dijkstra.Point{X: nx, Y: ny, Label: ds}, - Weight: func() int { - if dir == d { - return 1 - } else { - return 1001 - } - }(), - }) - } - } - } - } - - data.Graph = append(data.Graph, dijkstra.InputData{ - Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"}, - Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(EAST)}, - Weight: 0, - }) - data.Graph = append(data.Graph, dijkstra.InputData{ - Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"}, - Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(WEST)}, - Weight: 0, - }) - data.Graph = append(data.Graph, dijkstra.InputData{ - Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"}, - Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(NORTH)}, - Weight: 0, - }) - data.Graph = append(data.Graph, dijkstra.InputData{ - Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"}, - Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(SOUTH)}, - Weight: 0, - }) - - data.Graph = append(data.Graph, dijkstra.InputData{ - Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"}, - Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(EAST)}, - Weight: 0, - }) - data.Graph = append(data.Graph, dijkstra.InputData{ - Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"}, - Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(WEST)}, - Weight: 2000, - }) - data.Graph = append(data.Graph, dijkstra.InputData{ - Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"}, - Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(NORTH)}, - Weight: 1000, - }) - data.Graph = append(data.Graph, dijkstra.InputData{ - Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"}, - Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(SOUTH)}, - Weight: 1000, - }) - - data.Graph = append(data.Graph, dijkstra.InputData{ - Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "EAST"}, - Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "NORTH"}, - Weight: 1000, - }) - - return data -} - -func dirToString(dir Dir) string { - switch dir { - case NORTH: - return "NORTH" - case EAST: - return "EAST" - case SOUTH: - return "SOUTH" - case WEST: - return "WEST" - default: - return "UNKNOWN" - } -} - -func getAllowedDirections(direction Dir) []Dir { - switch direction { - case NORTH: - return []Dir{NORTH, EAST, WEST} - case SOUTH: - return []Dir{SOUTH, EAST, WEST} - case WEST: - return []Dir{WEST, NORTH, SOUTH} - case EAST: - return []Dir{EAST, NORTH, SOUTH} - } - return []Dir{} -} - -func (m Maze) Parse(input string) *Maze { - m.grid = inputs.ToGrid2D(input, "\n", "", '?', func(c string) Cell { return Cell(c[0]) }) - m.height, m.width = m.grid.SizeY(), m.grid.SizeX() - for y := 0; y < m.height; y++ { - for x := 0; x < m.width; x++ { - c := m.grid.Get(x, y) - switch c { - case WALL, CORRIDOR: - m.grid.Set(x, y, c) - case START: - m.grid.Set(x, y, CORRIDOR) - m.start = Vec{x, y} - case END: - m.grid.Set(x, y, CORRIDOR) - m.end = Vec{x, y} - } - } - } - return &m -} - -func (m *Maze) String() string { - s := "" - for y := 0; y < m.height; y++ { - for x := 0; x < m.width; x++ { - if y == m.start.y && x == m.start.x { - s += string(START) - } else if y == m.end.y && x == m.end.x { - s += string(END) - } else { - s += string(m.grid.Get(x, y)) - } - } - s += "\n" - } - return s -} diff --git a/2024/go/day16/day16_test.go b/2024/go/day16/day16_test.go deleted file mode 100644 index 426b7b5..0000000 --- a/2024/go/day16/day16_test.go +++ /dev/null @@ -1,47 +0,0 @@ -package day16 - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestPart1(t *testing.T) { - r := Part1(`############### -#.......#....E# -#.#.###.#.###.# -#.....#.#...#.# -#.###.#####.#.# -#.#.#.......#.# -#.#.#####.###.# -#...........#.# -###.#.#####.#.# -#...#.....#.#.# -#.#.#.###.#.#.# -#.....#...#.#.# -#.###.#.#.#.#.# -#S..#.....#...# -###############`) - require.Equal(t, 7036, r) -} - -func TestPart2(t *testing.T) { - r := Part2(`################# -#...#...#...#..E# -#.#.#.#.#.#.#.#.# -#.#.#.#...#...#.# -#.#.#.#.###.#.#.# -#...#.#.#.....#.# -#.#.#.#.#.#####.# -#.#...#.#.#.....# -#.#.#####.#.###.# -#.#.#.......#...# -#.#.###.#####.### -#.#.#...#.....#.# -#.#.#.#####.###.# -#.#.#.........#.# -#.#.#.#########.# -#S#.............# -#################`) - require.Equal(t, 64, r) -} diff --git a/2024/go/day16/input.txt b/2024/go/day16/input.txt deleted file mode 100644 index 67000f9..0000000 --- a/2024/go/day16/input.txt +++ /dev/null @@ -1,141 +0,0 @@ -############################################################################################################################################# -#.....#.....#...#.................#...#.......#.........#...#.......#...#.......#.......#...#...#.....#...#.......................#...#....E# -#.###.#.#.#.###.#.###.###.#######.#.#.#.#.###.#.###.###.#.#.#.###.#.###.#.#.#####.###.#.###.#.#.#.#.#.#.#.#.#####.#.###.#.#######.#.#.#.###.# -#...#.#.#.#...#.....#...#.#.....#...#...#.#...#.#...#...#.#.#...#.#...#.#.#...#...#...#.....#.#.#.#.#...#...#.....#.#.#.....#.....#.#.#...#.# -#.#.###.#.###.#.#####.#.#.###.###########.#.#####.###.###.###.###.###.#.#.#.#.#.###.#######.#.#.#.#.#########.#####.#.#.#####.#####.#.###.#.# -#.#.....#.#.#.#...#...#.#...#.....#.....#.#.....#.#.#.#.........................#.#.......#.#.#...#.....#...#.#...#.....#...#.#...#.#.....#.# -#.#######.#.#.#.###.#.#.###.#.#.#.#.#.###.#####.#.#.#.#.###.###.###.#.###.#.#.#.#.#######.###.#.#####.#.#.#.#.###.###.#.#.#.#.#.#.#.#######.# -#...#...#.#...#.#...#.#...#.#.#.#...#.#.......#...#...#...#...#.#.....#...#.#...#.......#...#...#.....#...#.#.....#...#...#...#.#.........#.# -###.#.###.#.#####.###.###.#.###.#.#####.###.#.#####.###.#.###.#.###.###.###.#####.#########.#.#.###.#.###.#.#####.#.###.#######.###########.# -#...#...#.#.#.....#...#...#.#...#.#...#.#...#.#...#...#.#.....#...#...#.#...........#.........#.#...#.#...#.........#.#.#.......#...........# -#.#####.#.#.#.#######.#.###.#.###.#.#.#.#.###.#.#####.#########.#.#.###.#.#####.###.#.#####.#.#.#.###.###.###.#####.#.#.#.#######.#########.# -#.#.....#.#...#.......#...#.#.#.....#.#...#.#.#...............................#...#.#...#...#...#.#.#.....#.#.....#...#.#.#.....#.......#...# -#.#.###.#.#####.#.###.###.#.#.#.#.###.#.###.#.###############.#.#.#.#.#####.#.#####.###.#####.#.#.#.#####.#.#####.###.#.#.#.###.#######.###.# -#.#...#.#.....#.#.....#...#...#.#...#.#.....#.#.....#.................................#...#...#...#...#...................#...#...#...#...#.# -#.###.#.#####.###.#.#.#.#####.#.#.#.#.#######.#.###.#.#######.###.#.#.#.#.###.#.#########.#.#.#.#.#.###.#.#####.#.###.#.#.###.#.#.###.###.#.# -#.#...............#.#...#...#.#...#.........#.....#.#.#.......#...#.#.#.#.#...#.#.....#...#.#.....#.....#.....#.#.....#.#.#...#.#...#...#...# -#.#.#####.#.#####.#.#####.#.#.###.#########.#.#####.#.#.#######.###.#.###.#.###.#.###.#.#.#.#.#########.#.###.#########.#.#####.###.###.###.# -#.#.#.....#.....#.#.#.....#.....#.....#...#.#.#.....#.#.#.......#.#.#.....#.#...#.#...#.#.#.#.........#...#.#.........#.#.........#...#...#.# -#.#.#.#####.#####.#.###.#######.#####.###.#.###.#####.#.#####.###.#.#######.#.#.#.#.#.#.###.#.#######.#.###.###.#.###.#.#########.###.#.#.#.# -#.#.......#...#...#...#...#...#.....#...#.#.#...#.#.....#.....#.....#...#...#.#...#.#.#.....#.#.......#.#.......#...#.#.....#.......#.#.....# -#.#######.###.#.#####.#.###.#.#########.#.#.#.###.#.#####.###.#######.#.#.#########.#.###.###.#.#######.#.#####.###.#.#####.#.###.###.#.#.#.# -#.....#...#...#...#.#.#.#...#.#.........#.#...#...#...#...#.#.#.......#...#.......#.#.#.......#.........#.........#.#...#.#.#...#.....#.#.#.# -#####.###.#.#.###.#.#.###.###.#.#########.#####.#####.#.#.#.#.#.#############.###.#.#.###########.#######.#######.#.#.#.#.#.###.#######.#.#.# -#...#...#.#.#.#...#.......#.#.#.#.......#.......#.....#.#.#...#.............#.#...#.#...#.......#.........#...#...#...#...#...#...#.....#.#.# -#.#.###.#.#.#.#.###########.#.#.###.###.#.#.#####.#####.#.#####.#.#########.#.#.###.###.#.###.#.###########.###.#####.###.#.#####.#.#####.#.# -#.#.#.#.#.#.#.#.....#.....#...#...#.#.....#.#.....#.#...#.....#.#.#.......#.#.#...#.#.....#...#.#.....#.....#...#.......#.#.................# -#.#.#.#.###.#.#####.#.###.#.#####.#.#######.#.#####.#.#####.#.#.#.#####.###.#.###.#.#########.#.#.###.#.###.#.###.#####.#.###.###.###.#.###.# -#.....#.#...#.....#...#...#...#...#.#.....#.#...#.#...#.....#...#.#.....#...#.#...#...#.......#...#...#...#.#.#...#.....#.#.#.........#...#.# -#.#####.#.#######.#####.#####.#.###.#.###.#####.#.#.#####.#.#####.#.#####.###.#.#####.#.###.#######.#######.#.###.#.#####.#.###############.# -#.#.....#...#...#...#...#.....#.#...#.#.#.......#.#.......#.....#.#.....#.#...#.......#.#...#.......#.....#.#.....#.....#.......#.........#.# -#.#.#######.#.#.###.#.#######.#.#.###.#.#########.#############.#.#.###.#.#.###.#########.#.#.#########.#.#.#####.#####.#####.###.#######.#.# -#...#.....#...#...#.#.......#...#...#...#.........#.......#...#...#...#.#.#...#.#...#...#.#.#.#.....#...#.#.....#.....#.....#.#...#.....#...# -#.###.#.#.#.#####.#########.###.###.###.###.###.#.#.###.#.#.#.#########.#.#.#.###.#.#.#.#.###.#.###.#.###.#.#.#######.#####.#.#.###.#.#####.# -#.#.....#.#.#...#...#.......#.............#.#.#.#.#.#...#...#.#.........#.#.#.....#.#.#.#.#.....#.....#.#.#.#...........#...#.#...#.#.#...#.# -#.#.#.###.###.#.###.#.#########.#####.###.#.#.#.#.#.#.#########.#.#####.#.#########.#.#.#.#.#######.###.#.###########.###.###.###.#.###.#.#.# -#...#...#.....#.....#.#.........#.....#...#.....#.#.#.#.....#...#.#...#.#.#.......#...#.#...#.#...#...#...#.............#.#...#...#.....#.#.# -#####.#.#######.#####.#.#.#############.#####.#.###.#.#.###.#.###.#.#.###.#.#####.#####.#.###.#.#.#.#.#.###.###########.#.###.#.###.#####.#.# -#.#...#.......#.#.....#.#.#...#.............#.#.#...#.....#.....#...#...#.#...#.#...#...#.#...#.#.#.#.#...#.#...#.....#.#.#.....#...#...#...# -#.#.#.###.#####.#.#####.###.#.#.###########.###.#.#############.#######.#.###.#.###.#.###.#.###.#.#.#.#.#.#.#.#.#.#####.#.#.#.###.###.#.##### -#...#...#...#...#.#.#.......#.#.#.......#.....#.....#.........#.........#...#.#.....#...#...#...#.#.#.#.....#.#.#.........#.#.#...#...#.#...# -#.###.#.###.#.###.#.#.#######.#.#.#####.#####.#.#####.#######.#.#####.#.###.#.#.#######.###.#.###.#.###.###.#.#.#.#########.#.#.#####.#.#.#.# -#.......#...#...#.#.........#...#...#.#.....#.#...#...#.#.....#.#.....#...#...#...#...#.....#...#.#.....#.....#.#.#.........#.#.......#.#.#.# -#.###.#.#.###.#.#.###.#########.###.#.#####.#.#####.###.#.#######.#######.#######.#.#.#.###.###.#.#.#####.#####.#.#.#########.#########.#.### -#.#.....#.....#.#...#.#.......#.#...#.....#.#.......#.....#.......#...#.....#...#...#.#.#...#...#.#.#.....#...#.#.#.#.........#.....#...#...# -#.#.#.#######.#.#.#.###.#.###.###.###.#####.#.#.###.#.#########.#.#.#.#.#####.#.###.#.###.#.#.###.###.#####.#.#.###.#.#####.###.###.#.###.#.# -#.#.#.....#...#.#.#.#...#...#.#...#.....#...#.........#.........#.#.#.#.#.....#.....#.#...#...#.#...........#.#...#.#.#...#.......#.#...#.#.# -#.#.#.###.#.#.#.#.#.#.#####.#.#.#######.#.###.#########.#.###.#####.#.###.#####.#####.#.###.###.#######.#########.#.###.#.#####.#.#.###.###.# -#.#.#.....#.#.#.#.#.#.......#.#.#...#...#.#.#...#.#.....#.#...#.........#...#...#...#.#.#...#...#.....#.#.....#...#.....#.#.....#.#.........# -#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#.###.#.#.#####.#####.###.###.###.#.###.#.#.#.#.###.#.#.###.###.###.#.#.#####.#.#.###.#.#########.# -#.#.......#.#.#...#.#.#.#.#.#.#...#.#.#...#.#...#...#...#.#...#...#...#...#.#.....#.#.#.#.#...#.#.#...#...#.#.#.#.........#...#.#.....#...#.# -#.#######.#.#.###.#.#.#.#.###.#####.#.#.###.#.#####.#.#.#.#.#.###.###.###.#.#######.#.#.#.#.#####.#.###.###.#.#.#####.#.#####.#.#######.#.#.# -#.#.......#.#...#.#.#...#...#.#.......#.#...#.....#.#.#...#.#...#.....#.#.#.......#...#.....#.....#...#.#.....#.....#.#.#.....#.........#.#.# -#.#.#####.#.###.#.#.#.#.###.#.#.#######.#.#.#####.#.#.###.#.###.#.###.#.#.#######.###########.#######.#.#.#########.###.#.###############.#.# -#.#...#...#.#...#.#...#.#...#...#.#.....#.#.#.....#.#.#...#...#.........#...................#.#.....#.#.#.........#...#...#.......#.......#.# -#.###.#.#.#.#####.###.###.#.#####.#.#####.#.#.#####.#.#.#####.#########.###################.#.#.#####.#.###.###.#.###.#####.#######.#######.# -#...#...#...#.....#.......#.....#.#.#.....#...#.........#...#...#.....#...#...........#.#.....#.......#...#.....#.......#...#.....#.#.....#.# -###.###.#.###.#####.###########.#.#.#.###########.#.#####.#.###.#.###.###.#.#########.#.#.#######.#####.#.###########.#.#.#.#.###.#.###.###.# -#...#...#...........#.#.....#.....#.#.#.......#...#.#.....#.....#.#.#.#...#.#.#.....#.#.....#...#.....#.#.................#.#.#.#.#...#.....# -#.#.#.#####.###.#####.#.###.#.###.#.#.###.###.#.#####.#######.###.#.#.#####.#.#.#.###.#.#####.#.#####.#####.#########.#####.#.#.#.#.#.###.### -#.#.#.#...#.#.......#.....#.....#.#.#.#...#.#.#.......#.....#...#.#.#...#.......#.....#...#...#.#...#.....#.........#...#...#.#...#.#...#...# -#.###.#.#.###.###.#.###########.#.#.#.#.###.#.#.#.#####.###.###.#.#.###.#.#########.#######.###.###.#####.#########.###.#.###.#.#######.##### -#.#...#.#.....#...#.#.........#...#.#...#...#.#.....#...#...#...#.#.#...#.........#.........#.#.#...#...#...#.....#...#.#...#.#...#...#.....# -#.#.###.#.#####.#.#.#.#######.#.###.#####.###.#.###.#.###.#######.#.#.###.#######.###########.#.#.###.#.###.#.#####.###.#####.###.#.#.#.###.# -#...#...#.....#.#...#.#.....#.#.#...#.....#...#.....#...#.........#.#.#.........#.......#...#...#.....#...#.#...........#...#...#...#.......# -#####.###.#.###.#####.#.#.###.###.###.#####.#######.###.###.#######.#.#########.#.#.###.###.#.#########.###.#########.###.#.###.#######.###.# -#.....#...#.....#.....#.#.......................#...#...#.........#.#.......#...#.#...#...#.#.......#...#...#.........#...#...#.......#.....# -#.#####.#.#######.#################.#########.#.#.###.###.#####.#.#.#######.#####.###.###.#.#.#.###.#.#.#.###.###.#####.#####.#######.#.##### -#.#.#...#...#.................#.#...#.........#.......#.#.#.#...#...#...#...#...#.......#.#.#.#...#...#.#.....#...#...#...#.........#.......# -#.#.#.#.#.###.###.###########.#.#.###.#################.#.#.#.#####.#.#.#.###.#.#########.#.#.###.#####.#######.###.#.###.#########.###.###.# -#.#.#...#.........#.....#.....#.#.#.....#...#.............#.#.#.....#.#.......#.........#.#.#...#.........#.......#.#...#...#.....#.#.....#.# -#.#.###.#.#######.#####.#.#####.#.#.###.#.#.###.###.###.#.#.#.#######.#################.#.#.###.#.#.#####.#.#######.###.###.#.###.#.#.###.#.# -#.#...#.#.....#.........#.#.....#.#.#...#.#...#...#...#.#.....#.......#.........#.......#.#...#.#.#.....#.#.#...#...#...#...#...#.#...#.#.#.# -#.#.###.#.###.###########.#.###.#.###.###.###.#######.###.#.#.#.###############.#.#######.#.#.#.###.###.#.#.#.#.#.###.#.#.#####.#.#####.#.#.# -#.#.....#.#...............#.#...#...#...#...#.#.....#.......#...........#.....#.#.#.......#.#.#.....#.#.#.#...#.#.#.......#.....#.......#...# -#.#.###.#.#.#################.###.#.#.#.###.#.#.###.#######.###########.#.###.#.#.#.###.#.###.###.#.#.#.###.#####.#.###########.#.#####.###.# -#.#...#...#.#...#...#.........#...#.#.#...#.#...#.#.#.....#.#.....#...#.#...#...#...#.#...#...#...#...#.....#.....#.....#.......#.....#...#.# -#.###.#.#####.#.#.#.#####.#.###.#.#.###.#.#.#####.#.#.###.###.###.#.#.#.###.#########.#####.#.#.#####.###.#.#.#######.###.#####.#####.###.#.# -#.#...#.......#.#.#...#...#.#...#...#.....#...#...#...#.#.....#.#...#.#...#.#.#.......#.......#.....#.......#.#.#.....#...#...#.#.....#...#.# -#.#.###.###.###.#.###.#.###.#.#######.#.#####.#.#.#####.#######.#####.###.#.#.#.###.#.#.#####.#####.#########.#.#.#####.###.#.#.###.###.#.#.# -#.#.#.....#.....#.#.....#.#.#.........#.......#.#.........#.............#.#.#.....#.#.#.#.....#.....#.......#.#...#...#.#...#.#...#...#.#.#.# -#.#.#.#.#.#.#####.#######.#.#####.#####.#.#########.###.#.#.#####.#####.#.#.#######.#.###.###.#.#.###.#####.#.###.#.#.#.###.#.#.#.#.#.#.#.#.# -#.#...#.#...#...............#...#.#...#.#.#.......#...#.#.#...#.......#.#.#.#.......#.#...#.#.#.#.......#...#.......#.......#...#.#.#...#.#.# -#.#####.#.#.###.#######.#####.#.#.#.#.###.#.#####.#####.#.#.#.#.#.###.#.#.#.#.#######.#.###.#.#.#######.#.###.###########.#####.#.#.#######.# -#.....#...#...#.#...#...#.....#...#.#.#...#.#...........#.#...#.#...#.#.#.#.#...#...#...#.#...#.........#.#.....#...#.............#.#.......# -#.#.#.#.###.#.###.#.#.###.#.#######.#.#.###.#.#.#########.#.#.#.###.#.#.#.#.#.#.#.#.#####.#.#########.###.#.#####.#.#.#########.###.#.####### -#.#.#.......#.#...#.#.....#.......#.#...#...#.#.#.......#...#.#.#...#...#.#...#...#.#.........#.......#...#...#...#.#.#...#.....#...#...#...# -#.#.###.#####.#.###.#.#########.###.#######.#.###.#####.###.###.#.###.#######.#####.#.#######.###.#.###.#####.#.###.#.#.###.###.#.#.###.###.# -#...#...........#.#.#...........#...#.......#.........#.....#...#...#.#.....#.....#.......#...#...#.#...#.....#.#.....#...#...#.#.#...#.....# -#.###.#.###.#.#.#.#.###########.#.###.#.#################.###.#####.#.#.###.#####.#.#####.#.###.###.#.#####.###.#######.#.###.#.#.###.#####.# -#.....#.....#.....#.......#.....#...#.#...#.............#...#.....#.#.#...#.....#.#.....#.#.....#...#.#...#...#.....#...#.....#.#.#.#.....#.# -#.#######.###########.###.#.#######.#.###.#.###.#.#####.#########.#.#.###.###.#.#.###.###.#######.###.#.#.#.#######.#.#########.#.#.###.#.#.# -#.#.....#.......#...#...#.#...#.........#...#.#...#...#...........#.....#...#.....#...#...#.........#...#.#.#.......#.#.#.....#...#...#.#.#.# -#.#.###.#########.#.###.#.###.#.#######.#####.#.###.#########.#.#.#########.#######.###.###.#######.#####.###.#######.#.#.###.#.###.#.#.###.# -#.#.#.#...........#.#...#.#...#...#...#...........#.....#...#.#.#...#.....#.....#.....#.#.....#...#.#...#.....#.....#.#.....#.......#.#.#...# -#.#.#.#############.#####.#.#####.#.###.#.#########.###.#.#.#.#####.#.#.#####.#.#######.###.###.#.#.#.#.#######.###.#.#############.###.#.### -#.#.#...#...#.......#.....#.#.#...#.#...#.......#.....#.#.#.#.....#...#.....#...#.....#.....#...#.#...#...#.....#...#.............#...#...#.# -###.#.###.#.#.#######.#####.#.#.#.#.#.#####.###.#.###.#.#.#.#.#.#########.#.#.###.###.###.#.#.###.#.#####.###.###.###############.###.#####.# -#...#...#.#.#...#...#.........#.#.........#...#...#...#.#.#.#.#.............#.....#.#...#.#...#...#.#...#.....#...#.......#.....#...#.......# -#.###.#.#.#.#.#.#.#.###.#####.#.#########.#.#.#####.#.#.#.#.#######.###.#.#########.###.#.#####.#.###.#.#######.###.#####.#.#.#.###.#.#####.# -#.................#...#.....#.#.....#.#...#.#.....#.#.#.#.#.........#...#.....#.......#.#.#.....#.#...#.#.........#.....#.#...#.#.#...#...#.# -#.#.#.#.#####.#.#.###.#####.#######.#.#.###.#####.#.#.#.#.#########.#######.#.#.#####.#.#.#.#####.#.###.#.#.#####.#####.###.#.#.#.#####.###.# -#...........#...#.#.........#...#...#.#...#.....#...#.#.#...#.....#.#.....#.#...#.#...#.#.#.#.....#.#.#.#.#.#...............#.#.......#.....# -#.###.#.###.#.###.#########.#.#.#.###.###.#####.#####.#.###.#####.#.#.###.#.###.#.#.#.#.#.#.#.#####.#.#.###.#.###########.###.#########.##### -#.#.........#.....#.........#.#.#.#.#.....#...#...#.#.....#.....#...#.#...#.#.....#...#.#.#.#.#.....#.#...#.#.#...#.......#.#...#.......#...# -#.###.#.#.###.###.#.#####.###.#.#.#.#.#####.#.#.#.#.#####.#####.#.###.#.###.#.###.###.#.###.#.#.#####.###.#.#.#.###.#######.###.#.#########.# -#.......#...#.......#...#.#...#.#.#...#.....#.#.#.#.....#.#...#.#...#.#.#...#...#...#.#...#.#.#.#.......#.#.....#...#.....#...#...#.#.......# -#####.#.###.#.#####.#.###.#.###.#.###.###.###.###.#.###.#.#.#.#.###.#.#.###.###.#####.###.#.#.#.#.#.###.#.#######.#####.#.###.#####.#.###.#.# -#.......#.....#.....#...#.#.#...#...#.....#.#.#...#...#.#.#.#.#.#...#.#.......#.#.....#...#.#.#.#.#...#.#...#.....#.....#...#...#.......#...# -#.#####.#######.#####.#.#.#.#.#####.#######.#.#.#####.#.#.###.#.#####.#.#.###.#.#.#####.###.###.###.#.#.###.#.#####.#######.#.###.#########.# -#.#.....#.......#.....#.#.#.#.......#...........#...#.#.#.....#.....#...#.....#.#.....#.#.#...#.....#.....#.........#.....#.#.....#.....#...# -#.#.###.#.#######.#.###.#.#.#########.###########.#.#.#.#####.#####.###.#######.#.#####.#.#.#.#######.#####.###.#.###.#.###.#.#.###.###.#.#.# -#.#.#.....#.....#.#...#.#.#.....#...#...#...#.#...#.#.#.....#.#.......#.....#.....#...#.#.#.#.........#.....#.#.#...#.#.....#...#...#.#...#.# -#.#.#.#.###.#####.#.#.#.#.#####.#.#.#####.#.#.#.###.#.###.###.#.###.#.#####.#######.#.#.#.#.###.#####.#.###.#.#.#.#.#.###.#.###.#.###.#####.# -#.#.#.#.....#...#...#.#.#.....#...#.......#.#.#.#.#.#.#.#.....#.#.......#.#.#.....#.#.....#.#.......#.#.#...#.#.#...#...#.#...#...#.......#.# -#.#.#.#.#####.#.#.#.#.#.###.###.###########.#.#.#.#.#.#.#######.#.#####.#.#.#.###.#.#####.#.#.#####.#.#.#.###.#.#.#.#####.###.#.###.#####.#.# -#...#.#.......#.#...#.#.....#...#.........#.#.#...#.#.......#.#.#.#...#...#...#...#...#...#.#.....#...#.#.....#.#.#.....#...#...#.#.#.......# -#.###.#.#######.#####.###.#.#.#.#.#####.###.#.###.#.#######.#.#.###.#.###.#####.#.###.#.#.#.###.#.###.#.#####.#.#.#####.#.#.###.#.#.#.#.###.# -#.#...#.#...#...#...#...#.#...#.#.....#.....#.....#.......#...#.....#.#.#.#.....#...#.#.#...#...#.#.......#...#.#.....#.#.........#.#.#.....# -#.#.###.#.#.#.#.#.#.###.#.#####.#.#.#.#######.#####.#.#####.#.#######.#.#.#.#########.#.#####.#.#.#.#####.#.#.#.#####.#.###.#.#.###.#.#####.# -#.#.#...#.#.#.#.#.#.....#...#...#...#.#.......#...#.#.#.....#...#...#.#...#.....#...#.#.......#.#.........#.#.#.......#...#.#...#...#.......# -#.#.#.###.#.#.#.#.#######.###.#.#####.#########.#.###.#.#####.#.###.#.#########.#.#.#.###.#.#####.#########.#.#######.#.#.#####.#.#########.# -#...#.....#.#.#.#...#...#...#.#.....#.........#.#...#.#.#.....#.....#.#.........#.#...#.#.#.....#.#...#.....#.......#.#.#...#...#.#.....#...# -###########.#.#.###.#.#.###.#.###.###########.#.###.#.#.#.#######.###.#.#######.#.#####.#.#.###.#.#.###.###.#######.#.#.###.#.#.#.#.#.#.#.#.# -#.#.......#.#.#...#.#.#...#.#.....#.......#.#.#.......#.#.........#...#.........#.....#...#.#.....#.#.....#.......#.#.#...#.#.#...#.#.#.#.#.# -#.#.#####.#.#.###.#.#.#.#.#.#####.#.#.###.#.#.#.#.###.#.###.###.#.#.#.#######.#####.#.#.###.###.###.#.#####.#####.#.#.###.#.#.#.#####.#.#.#.# -#.......#.#.#...#.#.#.#.#.#...#.....#...#...#.#.#.#...#...#...#...#.#.#.....#.#.........#.#...........#...#...#.#...#.#...#.#.......#.#...#.# -#########.#.###.#.#.#.#.#.#.#.#.#####.#.#.###.#.#.#######.#.#.#####.#.#.#.###.#.#####.###.#####.#######.#.###.#.#####.#.###.#######.#.#####.# -#.......#...#...#.#.#.#.#.#.#.........#...#...#.#.#...#...#.#.....#.#.#.#...#...#...#.#...#...#.......#.#.#.........#.#...#...#.#...........# -#.#####.#####.###.#.#.#.###.#########.###.#.#####.#.#.#.#########.#.#.#.###.#####.#.#.#.#.#.#.#.#####.#.#.###########.#######.#.#.###.#.##### -#...#.........#...#.#.#...#.#.......#...#...#.....#.#...#.........#.#.#...#.#.....#.#.#.#.#.#.......#.#.#.........#...#.....#.#.............# -#.#.###########.###.###.#.#.#######.#.#.#####.#####.#####.#######.#.#.#.#.#.#.###.#.#.#.#.#.#######.#.#.#########.#.###.###.#.#.#.#####.###.# -#.#.#.......#.............#.....#...#.....#.......#.#.....#...#...#.#.#...........#.#.#.#.#.#...#...#...#.#.......#.#...#.......#.........#.# -###.#.#####.###.#.###.###.###.#.#.###.#.###.#####.#.#.###.#.#.#.###.#.#.#######.###.#.###.#.###.#.#######.#.#######.#.#.#######.#######.#.#.# -#...#.....#...#.....#.#...#...#.#.....#...#...#...#.#.#...#.#.#...#.#.#...#.#...#...#...#.#.....#.....#.......................#...#.....#.#.# -#.#######.###.#.###.#.#.#.#.#.#.#.###.#.#.###.#.###.#.#.###.#.###.#.#.###.#.#.#########.#.###.#####.#.###.#.#.###.#.#########.#.#.#.###.#.#.# -#.......#.#.#...#...#...#...........................#.#.#...#.#...#.#...#...#.....#...#.#.....#.....#...#.#.#...................#.#.#...#...# -#.#.###.#.#.###.#.#.#########.#.###.#.#.###.#.#########.#.#.###.###.#######.#####.#.#.#.#.#####.#######.#.#.###.#.#########.#.#.###.#.#.###.# -#.#.#.#...#...#.#.#.......................#.#.#.........#.#.#...#.#.#.....#.#...#...#...#...#...#.......#.#.....#...#.......#.#.#...#.....#.# -#.#.#.#####.#.#.###.###########.#########.#.#.#####.#####.#.#.###.#.#.#.###.#.#.#############.###.#######.#########.#.#######.#.#.#####.#.#.# -#S..........#.#...........................#.........#.....#.......#...#.......#...............#...................#...........#.........#...# -############################################################################################################################################# diff --git a/2024/go/day17/day17.go b/2024/go/day17/day17.go deleted file mode 100644 index 312b2d7..0000000 --- a/2024/go/day17/day17.go +++ /dev/null @@ -1,91 +0,0 @@ -package day17 - -import ( - "encoding/json" - "fmt" - "regexp" - "strings" - "golang.org/x/exp/slices" - - - "adventofcode2024/utils" - -) - -type Opcode int - -const ( - adv Opcode = 0 - bxl Opcode = 1 - bst Opcode = 2 - jnx Opcode = 3 - bxc Opcode = 4 - out Opcode = 5 - bdv Opcode = 6 - cdv Opcode = 7 - -) - -func Part1(input string) string { - m := regexp.MustCompile(`[\d,]+`).FindAllString(input, -1) - a := utils.MustAtoi(m[0]) - b := utils.MustAtoi(m[1]) - c := utils.MustAtoi(m[2]) - - var pgm []int - json.Unmarshal([]byte("["+m[3]+"]"), &pgm) - - fmt.Printf("%d %d %d %v\n", a, b, c, pgm) - out := fmt.Sprint(run(a, b, c, pgm)) - out = fmt.Sprint(strings.Trim(strings.ReplaceAll(out, " ", ","), "[]")) - return out -} - -func Part2(input string) int { - m := regexp.MustCompile(`[\d,]+`).FindAllString(input, -1) - b := utils.MustAtoi(m[1]) - c := utils.MustAtoi(m[2]) - - var pgm []int - json.Unmarshal([]byte("["+m[3]+"]"), &pgm) - - fmt.Printf("%d %d %v\n", b, c, pgm) - - a := 0 - for n := len(pgm) - 1; n >= 0; n-- { - a <<= 3 - for !slices.Equal(run(a, b, c, pgm), pgm[n:]) { - a++ - } - } - return a -} - -func run(a, b, c int, pgm []int) (output []int) { - for ip := 0; ip < len(pgm); ip += 2 { - operand := pgm[ip+1] - combo := []int{0, 1, 2, 3, a, b, c}[operand] - - switch pgm[ip] { - case int(adv): - a >>= combo - case int(bxl): - b ^= operand - case int(bst): - b = combo % 8 - case int(jnx): - if a != 0 { - ip = operand - 2 - } - case int(bxc): - b ^= c - case int(out): - output = append(output, combo%8) - case int(bdv): - b = a >> combo - case int(cdv): - c = a >> combo - } - } - return output -} \ No newline at end of file diff --git a/2024/go/day17/day17_test.go b/2024/go/day17/day17_test.go deleted file mode 100644 index ba2ffcc..0000000 --- a/2024/go/day17/day17_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package day17 - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestPart1(t *testing.T) { - r := Part1(`Register A: 729 -Register B: 0 -Register C: 0 - -Program: 0,1,5,4,3,0`) - require.Equal(t, "4,6,3,5,6,3,5,2,1,0", r) -} - -func TestPart2(t *testing.T) { - r := Part2(`Register A: 2024 -Register B: 0 -Register C: 0 - -Program: 0,3,5,4,3,0`) - require.Equal(t, 117440, r) -} diff --git a/2024/go/day17/input.txt b/2024/go/day17/input.txt deleted file mode 100644 index 9d9d9cd..0000000 --- a/2024/go/day17/input.txt +++ /dev/null @@ -1,5 +0,0 @@ -Register A: 61156655 -Register B: 0 -Register C: 0 - -Program: 2,4,1,5,7,5,4,3,1,6,0,3,5,5,3,0 diff --git a/2024/go/day18/day18.go b/2024/go/day18/day18.go deleted file mode 100644 index 9faee97..0000000 --- a/2024/go/day18/day18.go +++ /dev/null @@ -1,126 +0,0 @@ -package day18 - -import ( - "adventofcode2024/utils" - "adventofcode2024/utils/dijkstra" - "adventofcode2024/utils/grid2d" - "fmt" - "strings" -) - -type ( - Vec struct{ x, y int } - Dir struct{ x, y int } - Cell rune - Move struct { - p Vec - d Dir - } - Maze struct { - height, width int - start Vec - end Vec - grid *grid2d.Grid[Cell] - } -) - -const ( - WALL Cell = '#' - CORRIDOR Cell = '.' - START Cell = 'S' - END Cell = 'E' - PATH Cell = '*' -) - -var ( - NORTH = Dir{0, -1} - EAST = Dir{1, 0} - SOUTH = Dir{0, 1} - WEST = Dir{-1, 0} - DIRECTIONS = []Dir{NORTH, EAST, SOUTH, WEST} -) - -func Part1(input string) int { - maze := Maze{}.Parse(input, 1024) - fmt.Println(maze) - data := inputGraph(*maze) - graph := dijkstra.CreateGraph(data) - path, dist := dijkstra.GetShortestPath(data.From, data.To, graph) - for _, p := range path { - maze.grid.Set(p.X, p.Y, PATH) - } - fmt.Println(maze) - return dist -} -func Part2(input string) int { - maze := Maze{}.Parse(input, 2877) - fmt.Println(maze) - data := inputGraph(*maze) - graph := dijkstra.CreateGraph(data) - _, count := dijkstra.GetShortestPath(data.From, data.To, graph) - return count -} - -func inputGraph(maze Maze) dijkstra.InputGraph { - data := dijkstra.InputGraph{} - data.From = dijkstra.Point{X: maze.start.x, Y: maze.start.y} - data.To = dijkstra.Point{X: maze.end.x, Y: maze.end.y} - for y := 0; y < maze.height; y++ { - for x := 0; x < maze.width; x++ { - if maze.grid.Get(x, y) == WALL { - continue - } - for _, dir := range DIRECTIONS { - nx, ny := x+dir.x, y+dir.y - if nx < 0 || ny < 0 || nx >= maze.width || ny >= maze.height { - continue - } - if maze.grid.Get(nx, ny) == WALL { - continue - } - data.Graph = append(data.Graph, dijkstra.InputData{ - Source: dijkstra.Point{X: x, Y: y}, - Destination: dijkstra.Point{X: nx, Y: ny}, - Weight: 1, - }) - } - } - } - - return data -} - -func (m Maze) Parse(input string, bytes int) *Maze { - m.grid = grid2d.NewGrid(71, 71, CORRIDOR) - for _, line := range strings.Split(input, "\n") { - if bytes == 0 { - break - } - in := strings.Split(line, ",") - x := utils.MustAtoi(in[0]) - y := utils.MustAtoi(in[1]) - m.grid.Set(x, y, WALL) - bytes-- - } - m.start = Vec{0, 0} - m.end = Vec{70, 70} - m.height, m.width = m.grid.SizeY(), m.grid.SizeX() - return &m -} - -func (m *Maze) String() string { - s := "" - for y := 0; y < m.height; y++ { - for x := 0; x < m.width; x++ { - if y == m.start.y && x == m.start.x { - s += string(START) - } else if y == m.end.y && x == m.end.x { - s += string(END) - } else { - s += string(m.grid.Get(x, y)) - } - } - s += "\n" - } - return s -} diff --git a/2024/go/day18/day18_test.go b/2024/go/day18/day18_test.go deleted file mode 100644 index aec55d5..0000000 --- a/2024/go/day18/day18_test.go +++ /dev/null @@ -1,6915 +0,0 @@ -package day18 - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestPart1(t *testing.T) { - r := Part1(`2,5 -20,1 -63,59 -21,29 -37,59 -33,63 -14,33 -70,15 -21,34 -62,5 -45,54 -45,60 -48,53 -33,58 -23,35 -22,3 -33,0 -63,62 -44,67 -52,55 -5,19 -42,55 -45,0 -57,3 -15,45 -41,62 -1,39 -63,19 -39,59 -39,3 -48,7 -61,65 -31,1 -54,51 -11,14 -53,62 -67,68 -65,16 -17,45 -21,24 -55,3 -30,15 -4,39 -69,19 -69,57 -41,57 -43,24 -19,11 -18,27 -3,48 -8,13 -41,66 -67,67 -61,62 -5,37 -18,19 -29,64 -13,14 -42,57 -33,67 -0,19 -67,53 -47,59 -19,3 -51,54 -53,69 -42,5 -7,26 -59,65 -50,69 -3,27 -26,9 -43,3 -17,7 -15,11 -12,31 -43,5 -50,65 -9,5 -29,3 -21,6 -65,15 -43,57 -15,37 -50,53 -67,51 -29,1 -47,7 -55,54 -52,51 -47,54 -17,26 -12,43 -65,51 -1,27 -15,22 -63,15 -7,37 -69,49 -57,59 -7,36 -60,7 -66,7 -18,35 -13,36 -21,19 -15,3 -46,9 -30,3 -53,7 -8,7 -66,3 -49,69 -35,65 -48,5 -33,6 -1,31 -26,5 -44,59 -68,13 -45,67 -9,16 -51,55 -57,5 -2,33 -57,64 -31,2 -1,19 -5,12 -19,37 -40,67 -10,19 -21,12 -3,31 -51,1 -4,29 -52,65 -47,5 -17,19 -70,47 -11,19 -57,10 -54,55 -39,53 -61,56 -49,55 -28,37 -21,30 -9,45 -43,69 -57,19 -29,10 -60,63 -19,32 -66,5 -53,45 -53,49 -47,57 -26,1 -17,34 -65,7 -7,28 -41,63 -6,1 -69,69 -0,13 -5,28 -10,1 -38,67 -37,13 -3,7 -39,12 -2,15 -54,65 -35,53 -63,20 -13,30 -52,47 -13,3 -69,55 -55,61 -37,4 -7,35 -57,4 -35,69 -5,3 -63,64 -40,69 -59,5 -32,61 -66,61 -43,64 -40,1 -49,3 -68,65 -3,38 -21,4 -49,56 -18,29 -23,12 -7,11 -16,29 -8,11 -10,25 -39,67 -59,60 -3,19 -26,31 -7,9 -51,58 -49,67 -53,65 -65,59 -67,9 -43,58 -55,51 -69,7 -6,39 -49,59 -10,37 -4,43 -54,5 -3,28 -69,16 -67,7 -4,37 -37,1 -27,2 -62,59 -45,70 -25,35 -65,53 -31,7 -53,59 -1,10 -67,10 -65,67 -30,67 -17,1 -67,59 -31,61 -59,59 -65,69 -51,59 -61,66 -13,15 -29,65 -27,1 -65,65 -68,53 -53,11 -5,17 -20,35 -43,68 -3,30 -59,7 -3,39 -45,63 -7,31 -3,13 -51,5 -23,39 -20,3 -67,0 -37,3 -46,61 -65,70 -15,1 -17,11 -66,63 -32,23 -51,0 -3,1 -17,3 -13,6 -59,3 -19,31 -1,24 -41,3 -4,49 -40,57 -63,6 -16,17 -22,25 -39,60 -11,34 -56,7 -38,57 -55,53 -35,66 -1,11 -64,19 -50,3 -9,38 -19,8 -64,61 -3,17 -8,33 -13,1 -5,9 -50,7 -1,34 -41,65 -48,57 -14,13 -17,31 -56,1 -6,15 -24,25 -23,2 -69,13 -45,52 -15,23 -15,27 -27,28 -60,3 -31,30 -19,35 -42,53 -19,27 -61,1 -65,50 -53,2 -52,61 -15,20 -42,7 -67,20 -11,23 -29,54 -6,17 -41,53 -47,63 -68,51 -21,21 -19,6 -53,61 -23,29 -53,9 -19,29 -21,10 -2,41 -10,3 -49,9 -42,59 -12,1 -45,7 -19,28 -3,35 -69,6 -43,4 -17,21 -47,3 -52,7 -65,22 -45,62 -16,5 -51,3 -48,11 -7,33 -40,3 -26,35 -37,63 -49,68 -11,26 -54,67 -64,23 -21,17 -5,49 -63,65 -23,13 -58,1 -61,54 -69,56 -47,60 -11,7 -9,35 -57,58 -45,66 -1,23 -7,21 -17,12 -11,17 -34,3 -25,25 -22,35 -57,65 -17,17 -1,5 -12,33 -36,63 -19,15 -7,38 -53,55 -21,25 -42,1 -17,23 -35,67 -33,3 -56,63 -56,59 -3,2 -42,67 -65,56 -45,5 -5,33 -21,22 -9,42 -3,14 -21,14 -59,53 -64,53 -33,25 -11,35 -9,1 -63,16 -47,49 -53,60 -47,55 -39,1 -63,60 -35,63 -9,31 -55,68 -57,57 -68,15 -11,39 -62,69 -41,45 -55,57 -5,13 -9,14 -1,32 -17,5 -19,19 -19,30 -1,29 -55,56 -6,35 -21,8 -13,0 -4,25 -16,33 -69,9 -53,67 -67,17 -52,67 -41,59 -24,1 -51,7 -54,7 -3,22 -7,13 -41,61 -45,3 -21,33 -37,53 -11,13 -45,8 -48,1 -43,13 -17,46 -1,33 -41,69 -22,19 -19,38 -19,12 -45,57 -53,6 -15,36 -35,68 -9,21 -43,65 -5,41 -7,7 -68,61 -60,1 -7,23 -21,28 -23,34 -63,69 -7,40 -51,64 -66,51 -43,61 -49,63 -69,11 -50,51 -53,13 -17,24 -47,65 -32,67 -4,15 -38,1 -58,63 -23,21 -61,59 -15,21 -11,27 -33,65 -2,1 -20,25 -11,3 -55,67 -5,31 -43,53 -63,66 -3,29 -65,55 -36,69 -64,1 -3,23 -11,6 -52,57 -61,4 -63,17 -61,69 -3,33 -65,4 -21,16 -27,11 -1,3 -5,39 -69,54 -63,47 -1,36 -27,27 -33,61 -25,37 -61,14 -15,26 -55,1 -7,17 -29,11 -11,12 -2,19 -66,55 -45,59 -29,29 -26,39 -8,17 -45,65 -11,37 -2,39 -0,29 -5,27 -16,31 -67,65 -68,63 -26,25 -9,30 -3,36 -48,65 -59,51 -63,1 -7,41 -23,28 -1,15 -18,1 -4,41 -43,63 -21,27 -67,22 -52,69 -7,18 -68,49 -3,12 -18,17 -9,41 -19,13 -1,17 -3,26 -59,61 -57,66 -53,63 -39,69 -3,3 -67,69 -50,57 -9,19 -1,13 -55,58 -49,6 -7,3 -47,1 -12,37 -59,63 -61,67 -8,45 -41,1 -8,1 -39,63 -8,27 -15,19 -1,25 -61,57 -47,66 -46,5 -0,39 -4,3 -67,8 -9,43 -64,67 -49,47 -63,14 -51,57 -0,47 -8,3 -21,15 -63,57 -46,3 -5,21 -15,31 -57,12 -13,18 -21,23 -67,15 -21,7 -23,14 -67,55 -63,63 -21,13 -67,58 -51,49 -25,26 -2,31 -56,51 -32,69 -55,7 -31,62 -65,57 -55,65 -5,24 -7,20 -11,15 -19,14 -65,21 -5,1 -67,5 -67,63 -67,49 -68,57 -19,21 -37,65 -11,1 -47,61 -33,7 -28,3 -12,21 -47,68 -41,70 -65,1 -69,23 -5,25 -47,11 -49,61 -1,35 -59,57 -1,37 -33,1 -53,57 -59,1 -49,65 -27,15 -60,11 -61,63 -5,34 -69,15 -9,20 -66,65 -49,62 -35,3 -55,5 -4,19 -21,20 -47,67 -59,68 -24,27 -41,5 -67,3 -21,3 -47,9 -65,17 -9,47 -23,3 -41,67 -65,63 -15,29 -55,49 -3,6 -69,17 -22,17 -48,51 -33,64 -51,65 -9,27 -58,55 -25,21 -69,24 -9,22 -64,63 -19,1 -9,36 -17,27 -54,49 -38,69 -8,5 -46,67 -60,57 -68,11 -0,7 -19,17 -39,65 -27,3 -9,40 -64,57 -17,25 -3,25 -19,9 -47,8 -58,61 -23,22 -21,11 -41,7 -18,9 -11,45 -51,67 -52,3 -8,43 -9,25 -69,8 -67,11 -2,27 -63,51 -65,61 -53,5 -7,19 -18,3 -67,18 -45,9 -55,63 -15,15 -47,64 -54,3 -13,31 -19,5 -41,64 -15,16 -37,67 -53,52 -12,9 -15,4 -25,34 -43,59 -2,17 -23,33 -57,8 -16,15 -57,67 -29,0 -66,69 -19,7 -42,61 -66,15 -67,61 -51,63 -36,7 -1,16 -2,23 -66,59 -67,2 -61,64 -56,65 -56,5 -15,2 -19,33 -15,28 -49,53 -5,35 -12,3 -65,18 -69,53 -11,33 -37,2 -47,69 -57,69 -11,5 -34,7 -3,45 -63,5 -15,33 -35,1 -17,20 -23,11 -6,31 -17,35 -50,61 -51,4 -64,3 -62,55 -3,9 -49,60 -13,35 -68,69 -21,37 -44,63 -2,9 -15,7 -49,5 -67,13 -9,39 -9,33 -9,24 -2,11 -5,23 -46,55 -17,22 -9,23 -48,3 -45,13 -47,58 -60,59 -5,18 -14,3 -24,11 -56,69 -43,55 -57,63 -55,10 -17,33 -53,47 -36,3 -13,16 -5,32 -64,7 -32,3 -51,51 -10,17 -13,37 -40,59 -11,31 -13,19 -19,10 -49,1 -34,1 -10,27 -42,9 -61,2 -58,57 -13,33 -25,3 -43,2 -23,31 -24,37 -59,66 -12,29 -7,10 -31,65 -19,23 -39,64 -22,39 -18,5 -55,62 -23,18 -39,62 -53,50 -21,31 -40,55 -58,5 -23,40 -67,66 -69,59 -23,25 -39,61 -1,7 -21,1 -21,5 -57,61 -51,53 -53,51 -5,29 -69,47 -30,27 -5,14 -10,45 -18,23 -7,29 -55,60 -40,7 -49,7 -14,31 -15,25 -68,19 -57,49 -12,23 -7,30 -60,49 -50,9 -16,1 -22,9 -57,55 -15,24 -65,49 -69,25 -59,69 -28,69 -4,21 -23,36 -58,69 -69,61 -23,8 -5,8 -43,1 -9,37 -55,69 -3,11 -66,53 -70,59 -14,19 -15,17 -9,13 -59,55 -36,65 -69,67 -8,23 -23,32 -3,8 -65,3 -69,65 -29,5 -9,15 -61,61 -13,34 -1,1 -3,4 -68,45 -45,56 -33,69 -67,48 -38,65 -6,21 -0,3 -63,68 -50,67 -15,13 -63,58 -9,34 -67,1 -48,63 -60,69 -69,51 -57,47 -70,67 -51,47 -59,54 -57,7 -43,67 -4,45 -59,67 -45,2 -67,57 -62,1 -69,52 -31,63 -69,21 -31,15 -27,9 -3,37 -19,25 -63,55 -6,3 -53,3 -20,21 -13,17 -23,30 -6,23 -43,7 -17,29 -57,2 -21,32 -51,69 -7,1 -44,5 -57,1 -33,66 -45,69 -59,8 -9,3 -13,23 -11,22 -65,5 -1,9 -24,17 -61,3 -49,57 -12,19 -13,28 -69,12 -10,51 -53,53 -13,47 -31,69 -24,43 -69,63 -20,17 -67,21 -44,55 -33,68 -7,15 -45,1 -39,55 -39,4 -69,60 -23,27 -45,61 -51,61 -25,1 -63,3 -37,69 -33,5 -17,15 -9,32 -7,39 -63,54 -65,47 -29,19 -53,43 -60,33 -57,45 -5,6 -47,27 -39,25 -48,47 -53,36 -43,18 -49,21 -41,21 -23,19 -52,35 -39,45 -55,17 -29,39 -57,51 -55,45 -54,27 -33,26 -40,19 -44,17 -57,20 -37,45 -27,64 -31,13 -41,13 -5,7 -9,57 -10,69 -23,47 -1,51 -0,69 -49,12 -3,58 -15,9 -21,53 -53,27 -45,11 -63,42 -27,56 -6,11 -27,12 -27,31 -23,41 -35,41 -15,61 -61,27 -21,43 -41,43 -17,56 -11,66 -41,28 -51,37 -41,27 -38,59 -39,47 -59,41 -11,41 -26,59 -59,16 -29,35 -1,45 -33,41 -55,29 -65,39 -47,50 -28,5 -39,43 -35,21 -54,25 -43,16 -51,43 -31,17 -23,53 -37,21 -43,22 -22,55 -57,17 -15,49 -36,57 -11,48 -56,27 -36,39 -53,35 -8,51 -29,46 -61,29 -67,37 -31,35 -42,47 -63,41 -37,18 -43,36 -52,21 -63,9 -57,48 -29,36 -39,27 -35,59 -55,41 -25,53 -45,47 -19,66 -29,44 -61,5 -49,23 -14,59 -27,59 -19,58 -16,13 -44,51 -29,24 -13,7 -26,19 -37,20 -41,40 -28,27 -65,38 -41,47 -47,19 -49,49 -46,39 -38,55 -13,65 -53,44 -31,49 -36,5 -68,5 -42,45 -3,5 -4,63 -59,23 -23,56 -15,59 -37,52 -67,35 -11,11 -1,63 -11,25 -19,47 -31,33 -61,36 -27,46 -35,44 -46,21 -9,56 -5,59 -27,41 -35,37 -28,13 -39,20 -61,23 -36,15 -35,9 -7,8 -52,15 -14,39 -51,21 -65,25 -35,12 -58,15 -66,35 -23,7 -35,62 -63,25 -68,1 -23,64 -68,33 -65,28 -44,29 -19,67 -29,43 -47,51 -25,67 -2,45 -55,21 -37,43 -32,21 -58,51 -69,33 -13,29 -41,11 -47,23 -65,35 -23,45 -31,64 -41,50 -1,65 -25,39 -42,39 -44,47 -67,39 -32,35 -43,38 -51,29 -9,6 -41,24 -3,67 -57,31 -41,44 -53,19 -19,41 -14,61 -15,41 -46,49 -39,35 -62,51 -51,23 -32,9 -23,60 -1,47 -49,27 -57,36 -19,52 -43,49 -49,35 -21,50 -49,39 -53,38 -51,19 -21,57 -43,45 -33,38 -45,41 -1,56 -39,22 -21,63 -48,49 -47,30 -37,39 -4,61 -34,13 -26,51 -47,39 -19,45 -31,59 -3,52 -17,54 -69,45 -15,35 -49,11 -17,69 -55,13 -64,39 -57,33 -45,40 -28,21 -11,9 -64,29 -33,19 -21,60 -32,19 -47,25 -57,53 -31,4 -17,61 -69,5 -19,39 -46,15 -60,51 -9,50 -27,40 -63,29 -59,36 -11,55 -25,61 -30,55 -35,25 -27,69 -23,1 -9,65 -43,37 -27,42 -19,49 -56,45 -13,49 -35,7 -33,47 -43,11 -38,33 -35,49 -63,39 -41,20 -13,48 -1,60 -43,30 -7,45 -55,19 -65,19 -53,15 -33,53 -29,49 -51,45 -13,50 -34,23 -20,55 -10,11 -12,39 -17,53 -11,65 -27,37 -8,53 -65,24 -65,45 -61,45 -7,65 -59,37 -27,21 -39,39 -31,67 -45,23 -53,10 -59,22 -25,42 -1,57 -54,45 -13,10 -43,23 -37,51 -51,13 -40,35 -48,45 -36,27 -1,59 -39,51 -57,32 -31,5 -35,5 -8,69 -25,29 -39,9 -19,53 -29,40 -61,43 -7,62 -39,17 -3,54 -27,57 -67,43 -23,49 -53,17 -29,47 -25,41 -9,62 -61,35 -27,38 -23,9 -67,38 -41,49 -22,45 -43,15 -25,17 -13,69 -31,52 -29,68 -29,37 -30,37 -7,63 -37,27 -55,39 -65,13 -50,23 -59,11 -25,11 -25,65 -26,15 -55,37 -47,18 -20,69 -12,69 -8,47 -61,17 -53,12 -54,41 -9,69 -33,59 -57,37 -47,47 -61,39 -40,13 -69,3 -18,55 -22,47 -65,41 -31,45 -21,9 -38,27 -61,30 -61,55 -3,57 -51,11 -20,57 -41,51 -61,15 -40,37 -53,23 -49,38 -22,69 -1,61 -16,59 -20,65 -17,63 -51,17 -26,45 -24,31 -61,49 -38,41 -22,51 -29,16 -11,52 -34,35 -30,61 -37,33 -58,19 -9,29 -29,17 -61,9 -2,51 -7,59 -49,51 -35,55 -8,59 -29,41 -37,47 -23,67 -30,53 -15,69 -33,27 -49,31 -69,29 -59,43 -3,41 -43,10 -59,19 -35,27 -61,11 -27,25 -49,30 -28,57 -15,53 -39,29 -45,46 -16,41 -28,9 -27,61 -37,15 -29,18 -15,47 -17,57 -25,19 -37,25 -11,64 -45,12 -61,46 -14,67 -6,51 -19,65 -32,17 -21,65 -46,29 -51,28 -25,6 -19,51 -35,61 -47,41 -45,45 -39,49 -36,25 -19,59 -32,25 -25,47 -30,41 -62,19 -39,50 -41,41 -44,43 -53,37 -33,14 -40,51 -62,47 -19,48 -55,43 -63,13 -68,43 -65,29 -53,25 -23,59 -39,11 -54,17 -59,35 -63,53 -13,11 -35,58 -12,5 -63,21 -25,20 -45,37 -34,47 -24,55 -3,53 -11,67 -46,33 -25,31 -56,23 -36,43 -8,65 -61,19 -37,41 -41,31 -31,27 -37,23 -64,49 -6,67 -9,17 -11,40 -17,13 -26,11 -67,41 -23,57 -13,52 -50,17 -21,35 -33,51 -59,40 -27,5 -36,33 -3,62 -35,60 -58,43 -13,56 -24,67 -17,37 -29,53 -63,23 -20,51 -24,39 -13,12 -2,55 -62,41 -28,49 -39,44 -20,47 -52,27 -35,39 -59,25 -35,32 -49,29 -65,31 -35,52 -54,47 -29,51 -37,9 -13,13 -53,31 -45,39 -9,7 -39,13 -17,65 -37,31 -24,5 -30,5 -2,65 -28,7 -49,17 -55,55 -37,24 -13,5 -3,68 -49,13 -56,15 -21,49 -41,37 -43,26 -57,25 -3,47 -29,21 -47,43 -29,42 -55,11 -35,19 -6,55 -53,34 -23,17 -31,12 -4,69 -15,43 -66,33 -59,33 -13,57 -17,42 -10,67 -59,13 -50,37 -33,45 -35,40 -38,7 -21,41 -9,63 -53,1 -33,37 -13,66 -50,15 -1,55 -19,36 -18,47 -61,26 -49,25 -59,38 -5,43 -37,62 -11,61 -22,67 -61,18 -33,55 -18,61 -25,9 -62,49 -56,29 -65,44 -59,29 -33,39 -55,9 -49,37 -13,55 -35,22 -41,39 -48,19 -30,21 -13,9 -21,39 -37,61 -29,15 -27,52 -19,55 -47,35 -51,33 -8,55 -63,7 -35,46 -11,54 -29,69 -15,52 -31,46 -25,62 -63,43 -41,26 -61,41 -7,64 -43,35 -47,33 -40,33 -45,36 -57,41 -57,23 -57,27 -11,29 -5,69 -63,37 -7,25 -34,9 -57,24 -23,5 -59,18 -23,55 -48,41 -11,47 -16,57 -60,25 -60,23 -20,53 -66,47 -56,33 -30,11 -15,46 -26,33 -64,33 -51,10 -35,13 -5,55 -33,21 -10,55 -35,11 -9,53 -23,44 -63,11 -69,1 -21,45 -6,47 -42,17 -32,41 -17,49 -61,12 -35,45 -31,51 -55,20 -31,25 -7,51 -41,15 -45,31 -31,8 -29,13 -3,43 -27,70 -59,21 -43,41 -67,45 -59,46 -56,43 -5,66 -18,39 -39,10 -1,22 -68,25 -15,48 -68,41 -2,67 -37,46 -15,44 -25,69 -43,47 -61,28 -61,31 -43,20 -48,37 -19,44 -24,9 -27,16 -37,29 -51,40 -38,25 -62,31 -31,23 -47,21 -13,53 -12,61 -37,8 -5,47 -17,67 -49,44 -31,19 -25,57 -13,67 -3,65 -63,8 -3,69 -29,63 -11,63 -27,60 -31,37 -29,61 -25,27 -32,13 -1,53 -52,31 -57,35 -36,35 -67,32 -33,30 -4,57 -23,43 -39,31 -46,47 -5,61 -43,51 -51,9 -10,43 -5,63 -69,41 -7,60 -53,21 -45,35 -34,25 -37,35 -33,40 -64,9 -37,7 -9,49 -13,59 -70,43 -11,46 -43,34 -36,49 -29,9 -46,13 -31,38 -41,23 -65,33 -47,28 -54,37 -23,58 -33,33 -1,43 -7,67 -6,43 -63,33 -27,17 -49,41 -15,40 -43,21 -50,1 -61,21 -5,5 -51,48 -37,10 -44,49 -1,64 -55,31 -13,54 -47,31 -31,57 -45,49 -57,50 -52,25 -48,33 -61,13 -27,29 -31,28 -19,69 -23,15 -45,20 -65,42 -24,63 -55,47 -61,20 -40,29 -45,55 -11,59 -48,35 -25,5 -33,29 -15,10 -59,44 -41,29 -24,23 -43,27 -69,31 -37,38 -45,15 -51,15 -65,11 -5,46 -41,33 -62,37 -62,35 -53,20 -59,31 -9,67 -31,44 -46,37 -22,59 -27,19 -41,16 -25,4 -11,8 -31,9 -16,7 -28,61 -49,45 -45,21 -57,15 -50,25 -30,7 -14,69 -43,14 -33,49 -42,33 -67,36 -21,62 -51,38 -37,49 -62,9 -58,13 -35,43 -1,49 -57,46 -25,43 -5,67 -31,53 -59,9 -8,67 -13,63 -43,32 -33,42 -30,49 -0,63 -1,50 -21,59 -19,63 -36,55 -23,37 -67,27 -10,61 -5,56 -31,31 -47,13 -20,45 -28,31 -1,67 -15,62 -34,19 -55,40 -62,23 -2,47 -67,31 -39,5 -7,57 -15,70 -33,57 -28,53 -55,27 -7,5 -66,25 -47,22 -11,51 -23,51 -53,28 -61,33 -23,69 -65,37 -11,53 -31,3 -64,45 -7,69 -13,42 -31,34 -4,65 -68,21 -55,15 -41,55 -15,56 -39,33 -45,34 -25,15 -19,61 -21,67 -37,48 -24,53 -7,49 -37,30 -43,31 -5,15 -37,36 -31,41 -27,65 -25,13 -0,53 -37,57 -45,43 -15,65 -25,45 -33,48 -15,42 -15,38 -45,51 -3,55 -29,7 -39,23 -13,39 -20,63 -31,56 -45,27 -64,31 -27,39 -33,16 -25,14 -61,25 -21,55 -55,23 -43,39 -18,65 -15,67 -43,9 -30,59 -26,29 -41,17 -60,15 -25,23 -57,9 -24,15 -10,57 -17,59 -65,27 -52,45 -58,29 -70,31 -15,39 -55,35 -43,33 -17,55 -29,45 -55,14 -9,59 -53,16 -31,43 -15,5 -17,43 -62,43 -17,47 -59,28 -10,29 -67,29 -61,37 -69,36 -22,53 -43,43 -29,57 -48,15 -29,67 -61,47 -33,35 -51,31 -35,23 -27,13 -34,55 -27,18 -25,49 -25,63 -34,37 -39,38 -60,39 -55,25 -31,32 -53,39 -37,17 -39,21 -33,50 -68,27 -50,47 -26,53 -56,41 -15,51 -51,42 -11,43 -21,47 -35,33 -50,41 -31,11 -45,32 -31,29 -33,28 -15,57 -69,28 -23,63 -35,47 -55,22 -29,27 -29,59 -62,15 -27,67 -13,43 -53,24 -6,5 -29,50 -44,41 -10,63 -36,37 -1,58 -59,27 -39,37 -26,23 -25,33 -39,16 -15,50 -60,21 -3,63 -45,19 -46,41 -42,11 -5,57 -5,45 -4,53 -42,49 -49,33 -10,59 -21,69 -3,61 -30,19 -28,33 -21,42 -30,23 -69,37 -16,37 -33,17 -65,23 -38,53 -54,13 -43,19 -16,9 -34,61 -70,3 -38,49 -39,7 -37,42 -31,47 -15,54 -70,41 -50,21 -15,55 -61,44 -47,29 -54,9 -13,24 -18,69 -25,55 -45,10 -17,51 -52,13 -3,59 -27,53 -22,43 -45,25 -5,53 -39,19 -32,7 -13,51 -33,11 -13,61 -33,15 -59,39 -54,31 -63,31 -30,33 -50,35 -28,29 -22,65 -14,7 -13,64 -13,41 -35,30 -37,14 -27,63 -21,51 -23,23 -57,26 -66,29 -29,48 -35,50 -27,49 -51,35 -13,45 -69,35 -27,44 -13,27 -20,61 -37,19 -2,61 -33,9 -53,32 -61,53 -65,43 -44,13 -51,39 -35,17 -24,47 -27,55 -56,53 -31,36 -50,45 -51,30 -17,68 -29,33 -59,48 -47,45 -34,53 -41,19 -42,29 -45,44 -7,43 -63,45 -34,17 -51,25 -3,51 -37,12 -29,31 -3,42 -63,61 -66,13 -7,48 -27,43 -61,32 -59,49 -15,63 -3,15 -40,47 -35,31 -29,55 -26,57 -1,69 -65,10 -5,11 -24,21 -57,21 -41,25 -38,15 -37,5 -51,27 -41,30 -11,57 -63,26 -67,25 -29,23 -39,18 -17,39 -52,41 -57,39 -51,41 -25,50 -21,61 -35,15 -9,51 -69,30 -56,39 -49,20 -61,51 -27,23 -25,51 -49,16 -67,19 -63,35 -17,41 -56,17 -65,46 -63,40 -6,53 -37,28 -7,47 -32,53 -47,37 -59,45 -70,21 -49,32 -25,7 -26,67 -25,60 -65,26 -59,17 -9,55 -6,45 -11,21 -18,13 -25,68 -39,40 -11,50 -67,46 -45,33 -37,54 -7,58 -35,29 -55,33 -29,14 -23,61 -21,38 -57,11 -15,66 -38,45 -25,59 -40,43 -37,37 -51,18 -67,47 -18,51 -56,35 -49,43 -7,27 -13,44 -46,17 -31,39 -27,33 -5,51 -13,46 -68,39 -61,7 -39,26 -45,53 -43,29 -34,33 -39,15 -7,53 -33,44 -69,39 -62,11 -23,65 -59,15 -41,42 -55,59 -27,7 -50,33 -69,43 -32,59 -58,23 -29,58 -41,36 -49,24 -45,17 -55,34 -33,31 -16,61 -7,55 -31,21 -23,48 -46,45 -6,63 -41,14 -4,59 -35,57 -59,47 -49,28 -57,38 -63,27 -41,22 -13,21 -5,50 -47,26 -57,43 -53,22 -36,17 -57,13 -9,61 -66,39 -55,30 -16,67 -46,25 -13,25 -43,17 -9,11 -53,33 -35,20 -37,55 -58,33 -10,9 -44,23 -45,29 -33,10 -37,11 -63,67 -1,41 -64,35 -33,23 -19,43 -53,29 -47,17 -31,55 -13,58 -33,13 -59,42 -6,69 -43,25 -11,69 -47,15 -41,9 -25,64 -27,47 -47,42 -17,64 -47,53 -17,9 -20,67 -18,59 -13,26 -53,41 -29,26 -59,30 -33,56 -44,27 -26,47 -27,66 -3,21 -49,26 -29,66 -12,59 -41,35 -25,48 -33,32 -27,35 -39,57 -15,64 -37,22 -39,6 -5,65 -11,49 -65,9 -29,25 -49,15 -9,9 -66,41 -55,18 -41,52 -38,31 -59,52 -69,34 -27,51 -27,45 -59,10 -3,49 -29,22 -7,61 -35,35 -32,49 -67,33 -63,48 -20,41 -19,40 -1,21 -1,44 -57,29 -64,13 -49,14 -17,44 -40,9 -19,57 -69,27 -67,23 -63,49 -62,25 -47,24 -17,50 -35,51 -50,11 -32,47 -33,43 -49,19 -39,41 -67,30 -61,34 -43,60 -12,46 -70,22 -38,20 -14,44 -41,38 -22,52 -12,67 -2,7 -58,46 -34,30 -34,70 -6,46 -20,68 -7,24 -9,18 -33,20 -60,42 -67,24 -37,6 -0,61 -12,18 -20,10 -39,54 -69,0 -16,65 -40,63 -14,10 -34,21 -54,56 -16,21 -62,12 -23,24 -48,61 -70,29 -30,16 -0,66 -70,6 -6,52 -30,62 -35,14 -62,36 -48,58 -13,8 -28,60 -22,26 -66,17 -62,54 -40,53 -12,53 -23,54 -61,40 -43,66 -0,34 -15,68 -32,66 -22,10 -42,48 -28,6 -38,38 -55,28 -46,23 -16,68 -52,54 -5,52 -4,64 -57,42 -2,49 -38,12 -64,38 -28,52 -68,31 -68,52 -21,70 -16,16 -8,31 -9,66 -4,55 -11,68 -36,14 -42,16 -32,39 -54,64 -18,58 -52,46 -68,22 -7,0 -29,62 -0,44 -35,8 -18,67 -23,52 -58,42 -26,2 -32,57 -8,66 -30,20 -0,30 -12,6 -46,1 -49,2 -34,56 -16,52 -2,2 -48,24 -25,38 -41,34 -46,28 -32,26 -53,48 -34,69 -11,28 -3,64 -62,8 -12,48 -19,22 -4,11 -24,30 -22,31 -32,45 -19,68 -12,60 -7,32 -22,38 -25,58 -55,42 -47,70 -18,28 -66,62 -34,41 -44,57 -4,10 -53,64 -38,34 -12,22 -37,70 -0,42 -30,31 -35,54 -61,48 -58,34 -36,38 -66,43 -54,52 -39,66 -43,62 -60,52 -37,44 -42,22 -53,0 -70,25 -18,40 -69,20 -53,58 -21,18 -25,12 -0,67 -25,44 -22,14 -48,32 -48,38 -18,15 -52,30 -34,15 -52,43 -52,52 -46,63 -2,22 -10,21 -22,64 -37,58 -10,31 -21,64 -6,40 -0,58 -36,42 -24,2 -65,20 -0,1 -2,58 -21,26 -0,68 -62,26 -8,32 -38,17 -11,56 -19,18 -31,20 -43,70 -0,5 -3,10 -14,38 -14,37 -32,33 -18,44 -62,53 -6,29 -70,30 -42,21 -18,37 -23,38 -14,60 -46,59 -34,22 -10,48 -8,63 -68,20 -50,58 -44,32 -4,67 -40,14 -22,34 -6,25 -38,52 -38,48 -32,30 -38,54 -26,49 -5,30 -34,48 -45,28 -56,58 -17,60 -10,38 -44,70 -24,49 -7,12 -42,38 -38,13 -52,48 -40,2 -52,59 -20,52 -21,68 -44,44 -2,70 -10,6 -24,52 -40,48 -48,20 -70,20 -36,23 -36,58 -20,27 -58,4 -2,8 -26,38 -4,38 -36,60 -12,57 -34,49 -30,29 -48,50 -18,60 -22,21 -64,62 -31,50 -20,37 -20,33 -5,40 -34,46 -12,12 -17,32 -2,29 -44,28 -58,45 -32,63 -54,30 -12,42 -16,28 -8,16 -66,42 -12,49 -12,63 -26,68 -18,25 -44,21 -17,6 -34,34 -36,67 -2,13 -26,3 -70,0 -39,58 -17,14 -18,12 -43,50 -16,25 -2,34 -8,50 -62,6 -26,41 -50,40 -30,56 -18,49 -4,32 -16,60 -22,8 -15,6 -21,36 -4,58 -29,28 -47,40 -36,62 -34,14 -33,60 -8,44 -43,8 -60,55 -39,30 -24,24 -36,11 -47,48 -38,32 -22,58 -31,10 -38,60 -16,46 -10,5 -23,50 -0,14 -4,60 -10,64 -20,22 -66,37 -28,51 -27,26 -38,21 -30,43 -19,20 -0,28 -16,54 -40,46 -34,5 -56,42 -8,34 -41,68 -61,8 -50,63 -27,14 -36,8 -26,36 -30,70 -36,20 -70,33 -41,2 -70,19 -5,22 -38,10 -10,40 -28,42 -42,41 -46,42 -0,23 -70,46 -24,40 -16,39 -38,56 -26,50 -22,5 -40,56 -34,57 -52,64 -46,70 -8,26 -3,34 -32,52 -70,44 -12,24 -8,10 -28,50 -14,16 -20,56 -9,60 -8,20 -37,34 -49,22 -27,24 -17,10 -68,30 -22,62 -22,15 -58,35 -69,44 -14,20 -48,22 -48,25 -51,2 -26,21 -6,30 -12,26 -33,12 -5,60 -60,56 -0,70 -4,56 -56,50 -58,47 -46,0 -50,22 -52,68 -4,4 -32,36 -34,60 -30,17 -36,56 -62,42 -28,23 -3,50 -35,28 -39,34 -38,3 -30,12 -20,7 -18,57 -52,60 -6,50 -52,49 -4,13 -56,56 -8,70 -44,8 -70,1 -28,62 -42,42 -60,12 -50,28 -47,38 -60,43 -50,54 -51,50 -55,12 -31,18 -47,32 -18,16 -16,6 -62,32 -24,69 -2,54 -62,27 -40,32 -38,68 -8,36 -59,70 -52,16 -68,37 -24,18 -53,8 -14,70 -31,60 -32,4 -33,36 -64,14 -52,22 -31,22 -12,51 -16,38 -30,1 -48,40 -57,56 -69,40 -25,32 -50,60 -49,4 -30,64 -46,22 -28,48 -42,56 -2,43 -46,6 -6,41 -43,46 -20,59 -54,6 -58,64 -0,59 -41,10 -54,42 -62,63 -30,57 -4,17 -22,40 -60,44 -52,42 -28,30 -7,2 -0,15 -22,27 -70,38 -30,68 -5,64 -35,38 -0,20 -17,62 -55,70 -5,4 -56,60 -34,42 -60,61 -40,27 -38,44 -5,16 -14,51 -18,26 -46,46 -69,26 -48,14 -32,43 -10,28 -27,22 -54,20 -14,48 -67,26 -57,0 -4,70 -59,12 -51,6 -40,10 -59,20 -32,8 -34,2 -20,18 -62,44 -64,46 -20,58 -56,31 -54,69 -28,14 -0,17 -22,12 -52,0 -20,44 -34,8 -32,29 -65,30 -56,3 -26,52 -4,47 -22,1 -13,38 -62,65 -0,31 -44,42 -42,15 -42,10 -24,38 -10,62 -26,64 -48,64 -48,21 -43,56 -8,46 -4,7 -9,0 -30,14 -56,61 -68,34 -56,55 -13,40 -50,62 -8,2 -50,39 -18,68 -0,37 -4,5 -47,36 -14,24 -44,58 -56,25 -24,62 -6,13 -11,2 -20,5 -18,11 -51,16 -56,6 -53,70 -32,0 -34,51 -37,56 -18,41 -42,70 -24,20 -22,44 -28,46 -20,38 -36,34 -10,56 -43,44 -0,60 -1,70 -37,0 -58,12 -68,17 -66,14 -70,40 -61,58 -53,40 -60,19 -14,4 -3,20 -6,38 -53,18 -24,8 -14,43 -42,43 -50,4 -57,30 -7,50 -37,40 -64,65 -36,47 -66,34 -16,27 -70,34 -20,14 -60,27 -32,31 -66,48 -43,28 -64,28 -67,54 -13,70 -50,38 -42,58 -52,26 -24,29 -20,48 -17,30 -66,67 -68,64 -68,9 -14,68 -70,24 -38,5 -60,47 -11,60 -67,12 -0,43 -1,12 -56,16 -38,22 -24,68 -51,8 -38,63 -60,22 -36,54 -38,61 -66,45 -46,27 -48,8 -6,0 -27,30 -8,40 -32,60 -5,62 -62,67 -64,32 -52,37 -60,5 -70,64 -10,18 -63,52 -18,20 -34,39 -1,62 -51,34 -40,49 -28,38 -51,62 -8,54 -45,58 -5,10 -12,15 -68,8 -26,22 -35,34 -58,32 -32,34 -10,10 -6,7 -38,42 -62,57 -52,6 -40,22 -62,70 -58,6 -50,48 -41,46 -52,18 -60,2 -25,70 -5,0 -50,6 -39,2 -2,4 -62,45 -48,23 -57,34 -55,66 -18,14 -9,52 -24,22 -54,60 -49,52 -12,54 -54,14 -63,44 -56,64 -4,0 -20,50 -18,64 -1,18 -14,41 -16,35 -29,2 -66,52 -12,50 -42,68 -34,24 -56,57 -66,32 -57,60 -28,8 -22,66 -32,32 -52,58 -50,42 -4,36 -16,32 -65,58 -56,20 -42,0 -17,4 -34,68 -49,36 -32,58 -68,50 -19,16 -6,70 -40,38 -60,37 -50,49 -34,40 -51,70 -1,38 -13,32 -53,66 -6,32 -65,32 -32,22 -14,55 -38,30 -44,26 -66,8 -50,30 -48,31 -5,36 -52,19 -29,30 -24,50 -55,36 -46,69 -64,18 -44,0 -27,10 -68,32 -60,13 -12,17 -10,34 -18,18 -70,52 -10,8 -12,38 -16,70 -8,9 -58,65 -64,21 -70,4 -5,48 -22,49 -36,2 -18,30 -41,6 -10,44 -48,48 -60,14 -23,42 -46,36 -18,56 -40,18 -36,40 -24,59 -64,64 -40,11 -59,50 -14,57 -25,46 -65,0 -32,16 -24,4 -40,34 -50,36 -38,50 -20,30 -66,38 -14,40 -70,62 -6,58 -12,28 -62,60 -68,28 -36,29 -58,37 -45,68 -22,22 -40,65 -49,64 -24,65 -40,8 -0,12 -40,64 -70,66 -23,62 -66,49 -28,32 -47,44 -10,12 -29,8 -26,18 -28,16 -49,50 -7,6 -30,54 -52,10 -32,10 -1,0 -40,28 -7,52 -18,54 -5,42 -58,10 -54,40 -41,4 -10,22 -24,56 -44,36 -39,14 -12,2 -65,48 -20,16 -10,4 -56,66 -40,68 -16,19 -45,42 -20,43 -50,18 -40,15 -0,6 -18,62 -14,2 -51,44 -35,48 -54,68 -7,4 -30,25 -27,36 -48,9 -42,46 -57,54 -68,55 -34,59 -58,16 -70,65 -70,14 -24,12 -46,12 -30,39 -55,2 -38,8 -62,22 -3,70 -60,40 -7,44 -9,44 -16,58 -64,2 -22,46 -40,45 -23,0 -62,30 -46,18 -23,6 -27,48 -31,66 -66,30 -52,9 -29,20 -36,21 -69,10 -24,41 -8,38 -44,34 -37,66 -68,4 -34,28 -21,44 -28,70 -42,30 -35,42 -46,16 -6,8 -36,48 -8,61 -14,26 -62,0 -28,45 -46,7 -7,68 -32,40 -61,24 -32,1 -40,12 -58,2 -62,58 -0,2 -42,60 -13,68 -48,59 -6,18 -36,28 -61,0 -63,28 -58,8 -44,33 -59,6 -64,6 -12,62 -30,32 -39,56 -70,32 -67,44 -56,11 -38,6 -2,36 -60,50 -55,26 -58,66 -55,8 -48,17 -56,2 -64,0 -60,41 -64,24 -42,52 -30,13 -16,20 -30,44 -1,26 -47,34 -24,54 -56,8 -16,0 -2,32 -62,38 -70,56 -18,50 -9,28 -63,38 -30,18 -10,70 -44,25 -57,40 -28,26 -54,0 -36,12 -32,24 -44,62 -52,23 -19,54 -45,30 -51,68 -8,8 -48,62 -40,60 -48,6 -48,69 -22,36 -61,10 -62,28 -51,66 -14,18 -53,56 -29,52 -63,4 -46,50 -26,69 -52,56 -21,54`) - require.Equal(t, 304, r) -} - -func TestPart2(t *testing.T) { - r := Part2(`2,5 -20,1 -63,59 -21,29 -37,59 -33,63 -14,33 -70,15 -21,34 -62,5 -45,54 -45,60 -48,53 -33,58 -23,35 -22,3 -33,0 -63,62 -44,67 -52,55 -5,19 -42,55 -45,0 -57,3 -15,45 -41,62 -1,39 -63,19 -39,59 -39,3 -48,7 -61,65 -31,1 -54,51 -11,14 -53,62 -67,68 -65,16 -17,45 -21,24 -55,3 -30,15 -4,39 -69,19 -69,57 -41,57 -43,24 -19,11 -18,27 -3,48 -8,13 -41,66 -67,67 -61,62 -5,37 -18,19 -29,64 -13,14 -42,57 -33,67 -0,19 -67,53 -47,59 -19,3 -51,54 -53,69 -42,5 -7,26 -59,65 -50,69 -3,27 -26,9 -43,3 -17,7 -15,11 -12,31 -43,5 -50,65 -9,5 -29,3 -21,6 -65,15 -43,57 -15,37 -50,53 -67,51 -29,1 -47,7 -55,54 -52,51 -47,54 -17,26 -12,43 -65,51 -1,27 -15,22 -63,15 -7,37 -69,49 -57,59 -7,36 -60,7 -66,7 -18,35 -13,36 -21,19 -15,3 -46,9 -30,3 -53,7 -8,7 -66,3 -49,69 -35,65 -48,5 -33,6 -1,31 -26,5 -44,59 -68,13 -45,67 -9,16 -51,55 -57,5 -2,33 -57,64 -31,2 -1,19 -5,12 -19,37 -40,67 -10,19 -21,12 -3,31 -51,1 -4,29 -52,65 -47,5 -17,19 -70,47 -11,19 -57,10 -54,55 -39,53 -61,56 -49,55 -28,37 -21,30 -9,45 -43,69 -57,19 -29,10 -60,63 -19,32 -66,5 -53,45 -53,49 -47,57 -26,1 -17,34 -65,7 -7,28 -41,63 -6,1 -69,69 -0,13 -5,28 -10,1 -38,67 -37,13 -3,7 -39,12 -2,15 -54,65 -35,53 -63,20 -13,30 -52,47 -13,3 -69,55 -55,61 -37,4 -7,35 -57,4 -35,69 -5,3 -63,64 -40,69 -59,5 -32,61 -66,61 -43,64 -40,1 -49,3 -68,65 -3,38 -21,4 -49,56 -18,29 -23,12 -7,11 -16,29 -8,11 -10,25 -39,67 -59,60 -3,19 -26,31 -7,9 -51,58 -49,67 -53,65 -65,59 -67,9 -43,58 -55,51 -69,7 -6,39 -49,59 -10,37 -4,43 -54,5 -3,28 -69,16 -67,7 -4,37 -37,1 -27,2 -62,59 -45,70 -25,35 -65,53 -31,7 -53,59 -1,10 -67,10 -65,67 -30,67 -17,1 -67,59 -31,61 -59,59 -65,69 -51,59 -61,66 -13,15 -29,65 -27,1 -65,65 -68,53 -53,11 -5,17 -20,35 -43,68 -3,30 -59,7 -3,39 -45,63 -7,31 -3,13 -51,5 -23,39 -20,3 -67,0 -37,3 -46,61 -65,70 -15,1 -17,11 -66,63 -32,23 -51,0 -3,1 -17,3 -13,6 -59,3 -19,31 -1,24 -41,3 -4,49 -40,57 -63,6 -16,17 -22,25 -39,60 -11,34 -56,7 -38,57 -55,53 -35,66 -1,11 -64,19 -50,3 -9,38 -19,8 -64,61 -3,17 -8,33 -13,1 -5,9 -50,7 -1,34 -41,65 -48,57 -14,13 -17,31 -56,1 -6,15 -24,25 -23,2 -69,13 -45,52 -15,23 -15,27 -27,28 -60,3 -31,30 -19,35 -42,53 -19,27 -61,1 -65,50 -53,2 -52,61 -15,20 -42,7 -67,20 -11,23 -29,54 -6,17 -41,53 -47,63 -68,51 -21,21 -19,6 -53,61 -23,29 -53,9 -19,29 -21,10 -2,41 -10,3 -49,9 -42,59 -12,1 -45,7 -19,28 -3,35 -69,6 -43,4 -17,21 -47,3 -52,7 -65,22 -45,62 -16,5 -51,3 -48,11 -7,33 -40,3 -26,35 -37,63 -49,68 -11,26 -54,67 -64,23 -21,17 -5,49 -63,65 -23,13 -58,1 -61,54 -69,56 -47,60 -11,7 -9,35 -57,58 -45,66 -1,23 -7,21 -17,12 -11,17 -34,3 -25,25 -22,35 -57,65 -17,17 -1,5 -12,33 -36,63 -19,15 -7,38 -53,55 -21,25 -42,1 -17,23 -35,67 -33,3 -56,63 -56,59 -3,2 -42,67 -65,56 -45,5 -5,33 -21,22 -9,42 -3,14 -21,14 -59,53 -64,53 -33,25 -11,35 -9,1 -63,16 -47,49 -53,60 -47,55 -39,1 -63,60 -35,63 -9,31 -55,68 -57,57 -68,15 -11,39 -62,69 -41,45 -55,57 -5,13 -9,14 -1,32 -17,5 -19,19 -19,30 -1,29 -55,56 -6,35 -21,8 -13,0 -4,25 -16,33 -69,9 -53,67 -67,17 -52,67 -41,59 -24,1 -51,7 -54,7 -3,22 -7,13 -41,61 -45,3 -21,33 -37,53 -11,13 -45,8 -48,1 -43,13 -17,46 -1,33 -41,69 -22,19 -19,38 -19,12 -45,57 -53,6 -15,36 -35,68 -9,21 -43,65 -5,41 -7,7 -68,61 -60,1 -7,23 -21,28 -23,34 -63,69 -7,40 -51,64 -66,51 -43,61 -49,63 -69,11 -50,51 -53,13 -17,24 -47,65 -32,67 -4,15 -38,1 -58,63 -23,21 -61,59 -15,21 -11,27 -33,65 -2,1 -20,25 -11,3 -55,67 -5,31 -43,53 -63,66 -3,29 -65,55 -36,69 -64,1 -3,23 -11,6 -52,57 -61,4 -63,17 -61,69 -3,33 -65,4 -21,16 -27,11 -1,3 -5,39 -69,54 -63,47 -1,36 -27,27 -33,61 -25,37 -61,14 -15,26 -55,1 -7,17 -29,11 -11,12 -2,19 -66,55 -45,59 -29,29 -26,39 -8,17 -45,65 -11,37 -2,39 -0,29 -5,27 -16,31 -67,65 -68,63 -26,25 -9,30 -3,36 -48,65 -59,51 -63,1 -7,41 -23,28 -1,15 -18,1 -4,41 -43,63 -21,27 -67,22 -52,69 -7,18 -68,49 -3,12 -18,17 -9,41 -19,13 -1,17 -3,26 -59,61 -57,66 -53,63 -39,69 -3,3 -67,69 -50,57 -9,19 -1,13 -55,58 -49,6 -7,3 -47,1 -12,37 -59,63 -61,67 -8,45 -41,1 -8,1 -39,63 -8,27 -15,19 -1,25 -61,57 -47,66 -46,5 -0,39 -4,3 -67,8 -9,43 -64,67 -49,47 -63,14 -51,57 -0,47 -8,3 -21,15 -63,57 -46,3 -5,21 -15,31 -57,12 -13,18 -21,23 -67,15 -21,7 -23,14 -67,55 -63,63 -21,13 -67,58 -51,49 -25,26 -2,31 -56,51 -32,69 -55,7 -31,62 -65,57 -55,65 -5,24 -7,20 -11,15 -19,14 -65,21 -5,1 -67,5 -67,63 -67,49 -68,57 -19,21 -37,65 -11,1 -47,61 -33,7 -28,3 -12,21 -47,68 -41,70 -65,1 -69,23 -5,25 -47,11 -49,61 -1,35 -59,57 -1,37 -33,1 -53,57 -59,1 -49,65 -27,15 -60,11 -61,63 -5,34 -69,15 -9,20 -66,65 -49,62 -35,3 -55,5 -4,19 -21,20 -47,67 -59,68 -24,27 -41,5 -67,3 -21,3 -47,9 -65,17 -9,47 -23,3 -41,67 -65,63 -15,29 -55,49 -3,6 -69,17 -22,17 -48,51 -33,64 -51,65 -9,27 -58,55 -25,21 -69,24 -9,22 -64,63 -19,1 -9,36 -17,27 -54,49 -38,69 -8,5 -46,67 -60,57 -68,11 -0,7 -19,17 -39,65 -27,3 -9,40 -64,57 -17,25 -3,25 -19,9 -47,8 -58,61 -23,22 -21,11 -41,7 -18,9 -11,45 -51,67 -52,3 -8,43 -9,25 -69,8 -67,11 -2,27 -63,51 -65,61 -53,5 -7,19 -18,3 -67,18 -45,9 -55,63 -15,15 -47,64 -54,3 -13,31 -19,5 -41,64 -15,16 -37,67 -53,52 -12,9 -15,4 -25,34 -43,59 -2,17 -23,33 -57,8 -16,15 -57,67 -29,0 -66,69 -19,7 -42,61 -66,15 -67,61 -51,63 -36,7 -1,16 -2,23 -66,59 -67,2 -61,64 -56,65 -56,5 -15,2 -19,33 -15,28 -49,53 -5,35 -12,3 -65,18 -69,53 -11,33 -37,2 -47,69 -57,69 -11,5 -34,7 -3,45 -63,5 -15,33 -35,1 -17,20 -23,11 -6,31 -17,35 -50,61 -51,4 -64,3 -62,55 -3,9 -49,60 -13,35 -68,69 -21,37 -44,63 -2,9 -15,7 -49,5 -67,13 -9,39 -9,33 -9,24 -2,11 -5,23 -46,55 -17,22 -9,23 -48,3 -45,13 -47,58 -60,59 -5,18 -14,3 -24,11 -56,69 -43,55 -57,63 -55,10 -17,33 -53,47 -36,3 -13,16 -5,32 -64,7 -32,3 -51,51 -10,17 -13,37 -40,59 -11,31 -13,19 -19,10 -49,1 -34,1 -10,27 -42,9 -61,2 -58,57 -13,33 -25,3 -43,2 -23,31 -24,37 -59,66 -12,29 -7,10 -31,65 -19,23 -39,64 -22,39 -18,5 -55,62 -23,18 -39,62 -53,50 -21,31 -40,55 -58,5 -23,40 -67,66 -69,59 -23,25 -39,61 -1,7 -21,1 -21,5 -57,61 -51,53 -53,51 -5,29 -69,47 -30,27 -5,14 -10,45 -18,23 -7,29 -55,60 -40,7 -49,7 -14,31 -15,25 -68,19 -57,49 -12,23 -7,30 -60,49 -50,9 -16,1 -22,9 -57,55 -15,24 -65,49 -69,25 -59,69 -28,69 -4,21 -23,36 -58,69 -69,61 -23,8 -5,8 -43,1 -9,37 -55,69 -3,11 -66,53 -70,59 -14,19 -15,17 -9,13 -59,55 -36,65 -69,67 -8,23 -23,32 -3,8 -65,3 -69,65 -29,5 -9,15 -61,61 -13,34 -1,1 -3,4 -68,45 -45,56 -33,69 -67,48 -38,65 -6,21 -0,3 -63,68 -50,67 -15,13 -63,58 -9,34 -67,1 -48,63 -60,69 -69,51 -57,47 -70,67 -51,47 -59,54 -57,7 -43,67 -4,45 -59,67 -45,2 -67,57 -62,1 -69,52 -31,63 -69,21 -31,15 -27,9 -3,37 -19,25 -63,55 -6,3 -53,3 -20,21 -13,17 -23,30 -6,23 -43,7 -17,29 -57,2 -21,32 -51,69 -7,1 -44,5 -57,1 -33,66 -45,69 -59,8 -9,3 -13,23 -11,22 -65,5 -1,9 -24,17 -61,3 -49,57 -12,19 -13,28 -69,12 -10,51 -53,53 -13,47 -31,69 -24,43 -69,63 -20,17 -67,21 -44,55 -33,68 -7,15 -45,1 -39,55 -39,4 -69,60 -23,27 -45,61 -51,61 -25,1 -63,3 -37,69 -33,5 -17,15 -9,32 -7,39 -63,54 -65,47 -29,19 -53,43 -60,33 -57,45 -5,6 -47,27 -39,25 -48,47 -53,36 -43,18 -49,21 -41,21 -23,19 -52,35 -39,45 -55,17 -29,39 -57,51 -55,45 -54,27 -33,26 -40,19 -44,17 -57,20 -37,45 -27,64 -31,13 -41,13 -5,7 -9,57 -10,69 -23,47 -1,51 -0,69 -49,12 -3,58 -15,9 -21,53 -53,27 -45,11 -63,42 -27,56 -6,11 -27,12 -27,31 -23,41 -35,41 -15,61 -61,27 -21,43 -41,43 -17,56 -11,66 -41,28 -51,37 -41,27 -38,59 -39,47 -59,41 -11,41 -26,59 -59,16 -29,35 -1,45 -33,41 -55,29 -65,39 -47,50 -28,5 -39,43 -35,21 -54,25 -43,16 -51,43 -31,17 -23,53 -37,21 -43,22 -22,55 -57,17 -15,49 -36,57 -11,48 -56,27 -36,39 -53,35 -8,51 -29,46 -61,29 -67,37 -31,35 -42,47 -63,41 -37,18 -43,36 -52,21 -63,9 -57,48 -29,36 -39,27 -35,59 -55,41 -25,53 -45,47 -19,66 -29,44 -61,5 -49,23 -14,59 -27,59 -19,58 -16,13 -44,51 -29,24 -13,7 -26,19 -37,20 -41,40 -28,27 -65,38 -41,47 -47,19 -49,49 -46,39 -38,55 -13,65 -53,44 -31,49 -36,5 -68,5 -42,45 -3,5 -4,63 -59,23 -23,56 -15,59 -37,52 -67,35 -11,11 -1,63 -11,25 -19,47 -31,33 -61,36 -27,46 -35,44 -46,21 -9,56 -5,59 -27,41 -35,37 -28,13 -39,20 -61,23 -36,15 -35,9 -7,8 -52,15 -14,39 -51,21 -65,25 -35,12 -58,15 -66,35 -23,7 -35,62 -63,25 -68,1 -23,64 -68,33 -65,28 -44,29 -19,67 -29,43 -47,51 -25,67 -2,45 -55,21 -37,43 -32,21 -58,51 -69,33 -13,29 -41,11 -47,23 -65,35 -23,45 -31,64 -41,50 -1,65 -25,39 -42,39 -44,47 -67,39 -32,35 -43,38 -51,29 -9,6 -41,24 -3,67 -57,31 -41,44 -53,19 -19,41 -14,61 -15,41 -46,49 -39,35 -62,51 -51,23 -32,9 -23,60 -1,47 -49,27 -57,36 -19,52 -43,49 -49,35 -21,50 -49,39 -53,38 -51,19 -21,57 -43,45 -33,38 -45,41 -1,56 -39,22 -21,63 -48,49 -47,30 -37,39 -4,61 -34,13 -26,51 -47,39 -19,45 -31,59 -3,52 -17,54 -69,45 -15,35 -49,11 -17,69 -55,13 -64,39 -57,33 -45,40 -28,21 -11,9 -64,29 -33,19 -21,60 -32,19 -47,25 -57,53 -31,4 -17,61 -69,5 -19,39 -46,15 -60,51 -9,50 -27,40 -63,29 -59,36 -11,55 -25,61 -30,55 -35,25 -27,69 -23,1 -9,65 -43,37 -27,42 -19,49 -56,45 -13,49 -35,7 -33,47 -43,11 -38,33 -35,49 -63,39 -41,20 -13,48 -1,60 -43,30 -7,45 -55,19 -65,19 -53,15 -33,53 -29,49 -51,45 -13,50 -34,23 -20,55 -10,11 -12,39 -17,53 -11,65 -27,37 -8,53 -65,24 -65,45 -61,45 -7,65 -59,37 -27,21 -39,39 -31,67 -45,23 -53,10 -59,22 -25,42 -1,57 -54,45 -13,10 -43,23 -37,51 -51,13 -40,35 -48,45 -36,27 -1,59 -39,51 -57,32 -31,5 -35,5 -8,69 -25,29 -39,9 -19,53 -29,40 -61,43 -7,62 -39,17 -3,54 -27,57 -67,43 -23,49 -53,17 -29,47 -25,41 -9,62 -61,35 -27,38 -23,9 -67,38 -41,49 -22,45 -43,15 -25,17 -13,69 -31,52 -29,68 -29,37 -30,37 -7,63 -37,27 -55,39 -65,13 -50,23 -59,11 -25,11 -25,65 -26,15 -55,37 -47,18 -20,69 -12,69 -8,47 -61,17 -53,12 -54,41 -9,69 -33,59 -57,37 -47,47 -61,39 -40,13 -69,3 -18,55 -22,47 -65,41 -31,45 -21,9 -38,27 -61,30 -61,55 -3,57 -51,11 -20,57 -41,51 -61,15 -40,37 -53,23 -49,38 -22,69 -1,61 -16,59 -20,65 -17,63 -51,17 -26,45 -24,31 -61,49 -38,41 -22,51 -29,16 -11,52 -34,35 -30,61 -37,33 -58,19 -9,29 -29,17 -61,9 -2,51 -7,59 -49,51 -35,55 -8,59 -29,41 -37,47 -23,67 -30,53 -15,69 -33,27 -49,31 -69,29 -59,43 -3,41 -43,10 -59,19 -35,27 -61,11 -27,25 -49,30 -28,57 -15,53 -39,29 -45,46 -16,41 -28,9 -27,61 -37,15 -29,18 -15,47 -17,57 -25,19 -37,25 -11,64 -45,12 -61,46 -14,67 -6,51 -19,65 -32,17 -21,65 -46,29 -51,28 -25,6 -19,51 -35,61 -47,41 -45,45 -39,49 -36,25 -19,59 -32,25 -25,47 -30,41 -62,19 -39,50 -41,41 -44,43 -53,37 -33,14 -40,51 -62,47 -19,48 -55,43 -63,13 -68,43 -65,29 -53,25 -23,59 -39,11 -54,17 -59,35 -63,53 -13,11 -35,58 -12,5 -63,21 -25,20 -45,37 -34,47 -24,55 -3,53 -11,67 -46,33 -25,31 -56,23 -36,43 -8,65 -61,19 -37,41 -41,31 -31,27 -37,23 -64,49 -6,67 -9,17 -11,40 -17,13 -26,11 -67,41 -23,57 -13,52 -50,17 -21,35 -33,51 -59,40 -27,5 -36,33 -3,62 -35,60 -58,43 -13,56 -24,67 -17,37 -29,53 -63,23 -20,51 -24,39 -13,12 -2,55 -62,41 -28,49 -39,44 -20,47 -52,27 -35,39 -59,25 -35,32 -49,29 -65,31 -35,52 -54,47 -29,51 -37,9 -13,13 -53,31 -45,39 -9,7 -39,13 -17,65 -37,31 -24,5 -30,5 -2,65 -28,7 -49,17 -55,55 -37,24 -13,5 -3,68 -49,13 -56,15 -21,49 -41,37 -43,26 -57,25 -3,47 -29,21 -47,43 -29,42 -55,11 -35,19 -6,55 -53,34 -23,17 -31,12 -4,69 -15,43 -66,33 -59,33 -13,57 -17,42 -10,67 -59,13 -50,37 -33,45 -35,40 -38,7 -21,41 -9,63 -53,1 -33,37 -13,66 -50,15 -1,55 -19,36 -18,47 -61,26 -49,25 -59,38 -5,43 -37,62 -11,61 -22,67 -61,18 -33,55 -18,61 -25,9 -62,49 -56,29 -65,44 -59,29 -33,39 -55,9 -49,37 -13,55 -35,22 -41,39 -48,19 -30,21 -13,9 -21,39 -37,61 -29,15 -27,52 -19,55 -47,35 -51,33 -8,55 -63,7 -35,46 -11,54 -29,69 -15,52 -31,46 -25,62 -63,43 -41,26 -61,41 -7,64 -43,35 -47,33 -40,33 -45,36 -57,41 -57,23 -57,27 -11,29 -5,69 -63,37 -7,25 -34,9 -57,24 -23,5 -59,18 -23,55 -48,41 -11,47 -16,57 -60,25 -60,23 -20,53 -66,47 -56,33 -30,11 -15,46 -26,33 -64,33 -51,10 -35,13 -5,55 -33,21 -10,55 -35,11 -9,53 -23,44 -63,11 -69,1 -21,45 -6,47 -42,17 -32,41 -17,49 -61,12 -35,45 -31,51 -55,20 -31,25 -7,51 -41,15 -45,31 -31,8 -29,13 -3,43 -27,70 -59,21 -43,41 -67,45 -59,46 -56,43 -5,66 -18,39 -39,10 -1,22 -68,25 -15,48 -68,41 -2,67 -37,46 -15,44 -25,69 -43,47 -61,28 -61,31 -43,20 -48,37 -19,44 -24,9 -27,16 -37,29 -51,40 -38,25 -62,31 -31,23 -47,21 -13,53 -12,61 -37,8 -5,47 -17,67 -49,44 -31,19 -25,57 -13,67 -3,65 -63,8 -3,69 -29,63 -11,63 -27,60 -31,37 -29,61 -25,27 -32,13 -1,53 -52,31 -57,35 -36,35 -67,32 -33,30 -4,57 -23,43 -39,31 -46,47 -5,61 -43,51 -51,9 -10,43 -5,63 -69,41 -7,60 -53,21 -45,35 -34,25 -37,35 -33,40 -64,9 -37,7 -9,49 -13,59 -70,43 -11,46 -43,34 -36,49 -29,9 -46,13 -31,38 -41,23 -65,33 -47,28 -54,37 -23,58 -33,33 -1,43 -7,67 -6,43 -63,33 -27,17 -49,41 -15,40 -43,21 -50,1 -61,21 -5,5 -51,48 -37,10 -44,49 -1,64 -55,31 -13,54 -47,31 -31,57 -45,49 -57,50 -52,25 -48,33 -61,13 -27,29 -31,28 -19,69 -23,15 -45,20 -65,42 -24,63 -55,47 -61,20 -40,29 -45,55 -11,59 -48,35 -25,5 -33,29 -15,10 -59,44 -41,29 -24,23 -43,27 -69,31 -37,38 -45,15 -51,15 -65,11 -5,46 -41,33 -62,37 -62,35 -53,20 -59,31 -9,67 -31,44 -46,37 -22,59 -27,19 -41,16 -25,4 -11,8 -31,9 -16,7 -28,61 -49,45 -45,21 -57,15 -50,25 -30,7 -14,69 -43,14 -33,49 -42,33 -67,36 -21,62 -51,38 -37,49 -62,9 -58,13 -35,43 -1,49 -57,46 -25,43 -5,67 -31,53 -59,9 -8,67 -13,63 -43,32 -33,42 -30,49 -0,63 -1,50 -21,59 -19,63 -36,55 -23,37 -67,27 -10,61 -5,56 -31,31 -47,13 -20,45 -28,31 -1,67 -15,62 -34,19 -55,40 -62,23 -2,47 -67,31 -39,5 -7,57 -15,70 -33,57 -28,53 -55,27 -7,5 -66,25 -47,22 -11,51 -23,51 -53,28 -61,33 -23,69 -65,37 -11,53 -31,3 -64,45 -7,69 -13,42 -31,34 -4,65 -68,21 -55,15 -41,55 -15,56 -39,33 -45,34 -25,15 -19,61 -21,67 -37,48 -24,53 -7,49 -37,30 -43,31 -5,15 -37,36 -31,41 -27,65 -25,13 -0,53 -37,57 -45,43 -15,65 -25,45 -33,48 -15,42 -15,38 -45,51 -3,55 -29,7 -39,23 -13,39 -20,63 -31,56 -45,27 -64,31 -27,39 -33,16 -25,14 -61,25 -21,55 -55,23 -43,39 -18,65 -15,67 -43,9 -30,59 -26,29 -41,17 -60,15 -25,23 -57,9 -24,15 -10,57 -17,59 -65,27 -52,45 -58,29 -70,31 -15,39 -55,35 -43,33 -17,55 -29,45 -55,14 -9,59 -53,16 -31,43 -15,5 -17,43 -62,43 -17,47 -59,28 -10,29 -67,29 -61,37 -69,36 -22,53 -43,43 -29,57 -48,15 -29,67 -61,47 -33,35 -51,31 -35,23 -27,13 -34,55 -27,18 -25,49 -25,63 -34,37 -39,38 -60,39 -55,25 -31,32 -53,39 -37,17 -39,21 -33,50 -68,27 -50,47 -26,53 -56,41 -15,51 -51,42 -11,43 -21,47 -35,33 -50,41 -31,11 -45,32 -31,29 -33,28 -15,57 -69,28 -23,63 -35,47 -55,22 -29,27 -29,59 -62,15 -27,67 -13,43 -53,24 -6,5 -29,50 -44,41 -10,63 -36,37 -1,58 -59,27 -39,37 -26,23 -25,33 -39,16 -15,50 -60,21 -3,63 -45,19 -46,41 -42,11 -5,57 -5,45 -4,53 -42,49 -49,33 -10,59 -21,69 -3,61 -30,19 -28,33 -21,42 -30,23 -69,37 -16,37 -33,17 -65,23 -38,53 -54,13 -43,19 -16,9 -34,61 -70,3 -38,49 -39,7 -37,42 -31,47 -15,54 -70,41 -50,21 -15,55 -61,44 -47,29 -54,9 -13,24 -18,69 -25,55 -45,10 -17,51 -52,13 -3,59 -27,53 -22,43 -45,25 -5,53 -39,19 -32,7 -13,51 -33,11 -13,61 -33,15 -59,39 -54,31 -63,31 -30,33 -50,35 -28,29 -22,65 -14,7 -13,64 -13,41 -35,30 -37,14 -27,63 -21,51 -23,23 -57,26 -66,29 -29,48 -35,50 -27,49 -51,35 -13,45 -69,35 -27,44 -13,27 -20,61 -37,19 -2,61 -33,9 -53,32 -61,53 -65,43 -44,13 -51,39 -35,17 -24,47 -27,55 -56,53 -31,36 -50,45 -51,30 -17,68 -29,33 -59,48 -47,45 -34,53 -41,19 -42,29 -45,44 -7,43 -63,45 -34,17 -51,25 -3,51 -37,12 -29,31 -3,42 -63,61 -66,13 -7,48 -27,43 -61,32 -59,49 -15,63 -3,15 -40,47 -35,31 -29,55 -26,57 -1,69 -65,10 -5,11 -24,21 -57,21 -41,25 -38,15 -37,5 -51,27 -41,30 -11,57 -63,26 -67,25 -29,23 -39,18 -17,39 -52,41 -57,39 -51,41 -25,50 -21,61 -35,15 -9,51 -69,30 -56,39 -49,20 -61,51 -27,23 -25,51 -49,16 -67,19 -63,35 -17,41 -56,17 -65,46 -63,40 -6,53 -37,28 -7,47 -32,53 -47,37 -59,45 -70,21 -49,32 -25,7 -26,67 -25,60 -65,26 -59,17 -9,55 -6,45 -11,21 -18,13 -25,68 -39,40 -11,50 -67,46 -45,33 -37,54 -7,58 -35,29 -55,33 -29,14 -23,61 -21,38 -57,11 -15,66 -38,45 -25,59 -40,43 -37,37 -51,18 -67,47 -18,51 -56,35 -49,43 -7,27 -13,44 -46,17 -31,39 -27,33 -5,51 -13,46 -68,39 -61,7 -39,26 -45,53 -43,29 -34,33 -39,15 -7,53 -33,44 -69,39 -62,11 -23,65 -59,15 -41,42 -55,59 -27,7 -50,33 -69,43 -32,59 -58,23 -29,58 -41,36 -49,24 -45,17 -55,34 -33,31 -16,61 -7,55 -31,21 -23,48 -46,45 -6,63 -41,14 -4,59 -35,57 -59,47 -49,28 -57,38 -63,27 -41,22 -13,21 -5,50 -47,26 -57,43 -53,22 -36,17 -57,13 -9,61 -66,39 -55,30 -16,67 -46,25 -13,25 -43,17 -9,11 -53,33 -35,20 -37,55 -58,33 -10,9 -44,23 -45,29 -33,10 -37,11 -63,67 -1,41 -64,35 -33,23 -19,43 -53,29 -47,17 -31,55 -13,58 -33,13 -59,42 -6,69 -43,25 -11,69 -47,15 -41,9 -25,64 -27,47 -47,42 -17,64 -47,53 -17,9 -20,67 -18,59 -13,26 -53,41 -29,26 -59,30 -33,56 -44,27 -26,47 -27,66 -3,21 -49,26 -29,66 -12,59 -41,35 -25,48 -33,32 -27,35 -39,57 -15,64 -37,22 -39,6 -5,65 -11,49 -65,9 -29,25 -49,15 -9,9 -66,41 -55,18 -41,52 -38,31 -59,52 -69,34 -27,51 -27,45 -59,10 -3,49 -29,22 -7,61 -35,35 -32,49 -67,33 -63,48 -20,41 -19,40 -1,21 -1,44 -57,29 -64,13 -49,14 -17,44 -40,9 -19,57 -69,27 -67,23 -63,49 -62,25 -47,24 -17,50 -35,51 -50,11 -32,47 -33,43 -49,19 -39,41 -67,30 -61,34 -43,60 -12,46 -70,22 -38,20 -14,44 -41,38 -22,52 -12,67 -2,7 -58,46 -34,30 -34,70 -6,46 -20,68 -7,24 -9,18 -33,20 -60,42 -67,24 -37,6 -0,61 -12,18 -20,10 -39,54 -69,0 -16,65 -40,63 -14,10 -34,21 -54,56 -16,21 -62,12 -23,24 -48,61 -70,29 -30,16 -0,66 -70,6 -6,52 -30,62 -35,14 -62,36 -48,58 -13,8 -28,60 -22,26 -66,17 -62,54 -40,53 -12,53 -23,54 -61,40 -43,66 -0,34 -15,68 -32,66 -22,10 -42,48 -28,6 -38,38 -55,28 -46,23 -16,68 -52,54 -5,52 -4,64 -57,42 -2,49 -38,12 -64,38 -28,52 -68,31 -68,52 -21,70 -16,16 -8,31 -9,66 -4,55 -11,68 -36,14 -42,16 -32,39 -54,64 -18,58 -52,46 -68,22 -7,0 -29,62 -0,44 -35,8 -18,67 -23,52 -58,42 -26,2 -32,57 -8,66 -30,20 -0,30 -12,6 -46,1 -49,2 -34,56 -16,52 -2,2 -48,24 -25,38 -41,34 -46,28 -32,26 -53,48 -34,69 -11,28 -3,64 -62,8 -12,48 -19,22 -4,11 -24,30 -22,31 -32,45 -19,68 -12,60 -7,32 -22,38 -25,58 -55,42 -47,70 -18,28 -66,62 -34,41 -44,57 -4,10 -53,64 -38,34 -12,22 -37,70 -0,42 -30,31 -35,54 -61,48 -58,34 -36,38 -66,43 -54,52 -39,66 -43,62 -60,52 -37,44 -42,22 -53,0 -70,25 -18,40 -69,20 -53,58 -21,18 -25,12 -0,67 -25,44 -22,14 -48,32 -48,38 -18,15 -52,30 -34,15 -52,43 -52,52 -46,63 -2,22 -10,21 -22,64 -37,58 -10,31 -21,64 -6,40 -0,58 -36,42 -24,2 -65,20 -0,1 -2,58 -21,26 -0,68 -62,26 -8,32 -38,17 -11,56 -19,18 -31,20 -43,70 -0,5 -3,10 -14,38 -14,37 -32,33 -18,44 -62,53 -6,29 -70,30 -42,21 -18,37 -23,38 -14,60 -46,59 -34,22 -10,48 -8,63 -68,20 -50,58 -44,32 -4,67 -40,14 -22,34 -6,25 -38,52 -38,48 -32,30 -38,54 -26,49 -5,30 -34,48 -45,28 -56,58 -17,60 -10,38 -44,70 -24,49 -7,12 -42,38 -38,13 -52,48 -40,2 -52,59 -20,52 -21,68 -44,44 -2,70 -10,6 -24,52 -40,48 -48,20 -70,20 -36,23 -36,58 -20,27 -58,4 -2,8 -26,38 -4,38 -36,60 -12,57 -34,49 -30,29 -48,50 -18,60 -22,21 -64,62 -31,50 -20,37 -20,33 -5,40 -34,46 -12,12 -17,32 -2,29 -44,28 -58,45 -32,63 -54,30 -12,42 -16,28 -8,16 -66,42 -12,49 -12,63 -26,68 -18,25 -44,21 -17,6 -34,34 -36,67 -2,13 -26,3 -70,0 -39,58 -17,14 -18,12 -43,50 -16,25 -2,34 -8,50 -62,6 -26,41 -50,40 -30,56 -18,49 -4,32 -16,60 -22,8 -15,6 -21,36 -4,58 -29,28 -47,40 -36,62 -34,14 -33,60 -8,44 -43,8 -60,55 -39,30 -24,24 -36,11 -47,48 -38,32 -22,58 -31,10 -38,60 -16,46 -10,5 -23,50 -0,14 -4,60 -10,64 -20,22 -66,37 -28,51 -27,26 -38,21 -30,43 -19,20 -0,28 -16,54 -40,46 -34,5 -56,42 -8,34 -41,68 -61,8 -50,63 -27,14 -36,8 -26,36 -30,70 -36,20 -70,33 -41,2 -70,19 -5,22 -38,10 -10,40 -28,42 -42,41 -46,42 -0,23 -70,46 -24,40 -16,39 -38,56 -26,50 -22,5 -40,56 -34,57 -52,64 -46,70 -8,26 -3,34 -32,52 -70,44 -12,24 -8,10 -28,50 -14,16 -20,56 -9,60 -8,20 -37,34 -49,22 -27,24 -17,10 -68,30 -22,62 -22,15 -58,35 -69,44 -14,20 -48,22 -48,25 -51,2 -26,21 -6,30 -12,26 -33,12 -5,60 -60,56 -0,70 -4,56 -56,50 -58,47 -46,0 -50,22 -52,68 -4,4 -32,36 -34,60 -30,17 -36,56 -62,42 -28,23 -3,50 -35,28 -39,34 -38,3 -30,12 -20,7 -18,57 -52,60 -6,50 -52,49 -4,13 -56,56 -8,70 -44,8 -70,1 -28,62 -42,42 -60,12 -50,28 -47,38 -60,43 -50,54 -51,50 -55,12 -31,18 -47,32 -18,16 -16,6 -62,32 -24,69 -2,54 -62,27 -40,32 -38,68 -8,36 -59,70 -52,16 -68,37 -24,18 -53,8 -14,70 -31,60 -32,4 -33,36 -64,14 -52,22 -31,22 -12,51 -16,38 -30,1 -48,40 -57,56 -69,40 -25,32 -50,60 -49,4 -30,64 -46,22 -28,48 -42,56 -2,43 -46,6 -6,41 -43,46 -20,59 -54,6 -58,64 -0,59 -41,10 -54,42 -62,63 -30,57 -4,17 -22,40 -60,44 -52,42 -28,30 -7,2 -0,15 -22,27 -70,38 -30,68 -5,64 -35,38 -0,20 -17,62 -55,70 -5,4 -56,60 -34,42 -60,61 -40,27 -38,44 -5,16 -14,51 -18,26 -46,46 -69,26 -48,14 -32,43 -10,28 -27,22 -54,20 -14,48 -67,26 -57,0 -4,70 -59,12 -51,6 -40,10 -59,20 -32,8 -34,2 -20,18 -62,44 -64,46 -20,58 -56,31 -54,69 -28,14 -0,17 -22,12 -52,0 -20,44 -34,8 -32,29 -65,30 -56,3 -26,52 -4,47 -22,1 -13,38 -62,65 -0,31 -44,42 -42,15 -42,10 -24,38 -10,62 -26,64 -48,64 -48,21 -43,56 -8,46 -4,7 -9,0 -30,14 -56,61 -68,34 -56,55 -13,40 -50,62 -8,2 -50,39 -18,68 -0,37 -4,5 -47,36 -14,24 -44,58 -56,25 -24,62 -6,13 -11,2 -20,5 -18,11 -51,16 -56,6 -53,70 -32,0 -34,51 -37,56 -18,41 -42,70 -24,20 -22,44 -28,46 -20,38 -36,34 -10,56 -43,44 -0,60 -1,70 -37,0 -58,12 -68,17 -66,14 -70,40 -61,58 -53,40 -60,19 -14,4 -3,20 -6,38 -53,18 -24,8 -14,43 -42,43 -50,4 -57,30 -7,50 -37,40 -64,65 -36,47 -66,34 -16,27 -70,34 -20,14 -60,27 -32,31 -66,48 -43,28 -64,28 -67,54 -13,70 -50,38 -42,58 -52,26 -24,29 -20,48 -17,30 -66,67 -68,64 -68,9 -14,68 -70,24 -38,5 -60,47 -11,60 -67,12 -0,43 -1,12 -56,16 -38,22 -24,68 -51,8 -38,63 -60,22 -36,54 -38,61 -66,45 -46,27 -48,8 -6,0 -27,30 -8,40 -32,60 -5,62 -62,67 -64,32 -52,37 -60,5 -70,64 -10,18 -63,52 -18,20 -34,39 -1,62 -51,34 -40,49 -28,38 -51,62 -8,54 -45,58 -5,10 -12,15 -68,8 -26,22 -35,34 -58,32 -32,34 -10,10 -6,7 -38,42 -62,57 -52,6 -40,22 -62,70 -58,6 -50,48 -41,46 -52,18 -60,2 -25,70 -5,0 -50,6 -39,2 -2,4 -62,45 -48,23 -57,34 -55,66 -18,14 -9,52 -24,22 -54,60 -49,52 -12,54 -54,14 -63,44 -56,64 -4,0 -20,50 -18,64 -1,18 -14,41 -16,35 -29,2 -66,52 -12,50 -42,68 -34,24 -56,57 -66,32 -57,60 -28,8 -22,66 -32,32 -52,58 -50,42 -4,36 -16,32 -65,58 -56,20 -42,0 -17,4 -34,68 -49,36 -32,58 -68,50 -19,16 -6,70 -40,38 -60,37 -50,49 -34,40 -51,70 -1,38 -13,32 -53,66 -6,32 -65,32 -32,22 -14,55 -38,30 -44,26 -66,8 -50,30 -48,31 -5,36 -52,19 -29,30 -24,50 -55,36 -46,69 -64,18 -44,0 -27,10 -68,32 -60,13 -12,17 -10,34 -18,18 -70,52 -10,8 -12,38 -16,70 -8,9 -58,65 -64,21 -70,4 -5,48 -22,49 -36,2 -18,30 -41,6 -10,44 -48,48 -60,14 -23,42 -46,36 -18,56 -40,18 -36,40 -24,59 -64,64 -40,11 -59,50 -14,57 -25,46 -65,0 -32,16 -24,4 -40,34 -50,36 -38,50 -20,30 -66,38 -14,40 -70,62 -6,58 -12,28 -62,60 -68,28 -36,29 -58,37 -45,68 -22,22 -40,65 -49,64 -24,65 -40,8 -0,12 -40,64 -70,66 -23,62 -66,49 -28,32 -47,44 -10,12 -29,8 -26,18 -28,16 -49,50 -7,6 -30,54 -52,10 -32,10 -1,0 -40,28 -7,52 -18,54 -5,42 -58,10 -54,40 -41,4 -10,22 -24,56 -44,36 -39,14 -12,2 -65,48 -20,16 -10,4 -56,66 -40,68 -16,19 -45,42 -20,43 -50,18 -40,15 -0,6 -18,62 -14,2 -51,44 -35,48 -54,68 -7,4 -30,25 -27,36 -48,9 -42,46 -57,54 -68,55 -34,59 -58,16 -70,65 -70,14 -24,12 -46,12 -30,39 -55,2 -38,8 -62,22 -3,70 -60,40 -7,44 -9,44 -16,58 -64,2 -22,46 -40,45 -23,0 -62,30 -46,18 -23,6 -27,48 -31,66 -66,30 -52,9 -29,20 -36,21 -69,10 -24,41 -8,38 -44,34 -37,66 -68,4 -34,28 -21,44 -28,70 -42,30 -35,42 -46,16 -6,8 -36,48 -8,61 -14,26 -62,0 -28,45 -46,7 -7,68 -32,40 -61,24 -32,1 -40,12 -58,2 -62,58 -0,2 -42,60 -13,68 -48,59 -6,18 -36,28 -61,0 -63,28 -58,8 -44,33 -59,6 -64,6 -12,62 -30,32 -39,56 -70,32 -67,44 -56,11 -38,6 -2,36 -60,50 -55,26 -58,66 -55,8 -48,17 -56,2 -64,0 -60,41 -64,24 -42,52 -30,13 -16,20 -30,44 -1,26 -47,34 -24,54 -56,8 -16,0 -2,32 -62,38 -70,56 -18,50 -9,28 -63,38 -30,18 -10,70 -44,25 -57,40 -28,26 -54,0 -36,12 -32,24 -44,62 -52,23 -19,54 -45,30 -51,68 -8,8 -48,62 -40,60 -48,6 -48,69 -22,36 -61,10 -62,28 -51,66 -14,18 -53,56 -29,52 -63,4 -46,50 -26,69 -52,56 -21,54`) - require.Equal(t, 0, r) -} diff --git a/2024/go/day18/input.txt b/2024/go/day18/input.txt deleted file mode 100644 index 3b8f63e..0000000 --- a/2024/go/day18/input.txt +++ /dev/null @@ -1,3450 +0,0 @@ -2,5 -20,1 -63,59 -21,29 -37,59 -33,63 -14,33 -70,15 -21,34 -62,5 -45,54 -45,60 -48,53 -33,58 -23,35 -22,3 -33,0 -63,62 -44,67 -52,55 -5,19 -42,55 -45,0 -57,3 -15,45 -41,62 -1,39 -63,19 -39,59 -39,3 -48,7 -61,65 -31,1 -54,51 -11,14 -53,62 -67,68 -65,16 -17,45 -21,24 -55,3 -30,15 -4,39 -69,19 -69,57 -41,57 -43,24 -19,11 -18,27 -3,48 -8,13 -41,66 -67,67 -61,62 -5,37 -18,19 -29,64 -13,14 -42,57 -33,67 -0,19 -67,53 -47,59 -19,3 -51,54 -53,69 -42,5 -7,26 -59,65 -50,69 -3,27 -26,9 -43,3 -17,7 -15,11 -12,31 -43,5 -50,65 -9,5 -29,3 -21,6 -65,15 -43,57 -15,37 -50,53 -67,51 -29,1 -47,7 -55,54 -52,51 -47,54 -17,26 -12,43 -65,51 -1,27 -15,22 -63,15 -7,37 -69,49 -57,59 -7,36 -60,7 -66,7 -18,35 -13,36 -21,19 -15,3 -46,9 -30,3 -53,7 -8,7 -66,3 -49,69 -35,65 -48,5 -33,6 -1,31 -26,5 -44,59 -68,13 -45,67 -9,16 -51,55 -57,5 -2,33 -57,64 -31,2 -1,19 -5,12 -19,37 -40,67 -10,19 -21,12 -3,31 -51,1 -4,29 -52,65 -47,5 -17,19 -70,47 -11,19 -57,10 -54,55 -39,53 -61,56 -49,55 -28,37 -21,30 -9,45 -43,69 -57,19 -29,10 -60,63 -19,32 -66,5 -53,45 -53,49 -47,57 -26,1 -17,34 -65,7 -7,28 -41,63 -6,1 -69,69 -0,13 -5,28 -10,1 -38,67 -37,13 -3,7 -39,12 -2,15 -54,65 -35,53 -63,20 -13,30 -52,47 -13,3 -69,55 -55,61 -37,4 -7,35 -57,4 -35,69 -5,3 -63,64 -40,69 -59,5 -32,61 -66,61 -43,64 -40,1 -49,3 -68,65 -3,38 -21,4 -49,56 -18,29 -23,12 -7,11 -16,29 -8,11 -10,25 -39,67 -59,60 -3,19 -26,31 -7,9 -51,58 -49,67 -53,65 -65,59 -67,9 -43,58 -55,51 -69,7 -6,39 -49,59 -10,37 -4,43 -54,5 -3,28 -69,16 -67,7 -4,37 -37,1 -27,2 -62,59 -45,70 -25,35 -65,53 -31,7 -53,59 -1,10 -67,10 -65,67 -30,67 -17,1 -67,59 -31,61 -59,59 -65,69 -51,59 -61,66 -13,15 -29,65 -27,1 -65,65 -68,53 -53,11 -5,17 -20,35 -43,68 -3,30 -59,7 -3,39 -45,63 -7,31 -3,13 -51,5 -23,39 -20,3 -67,0 -37,3 -46,61 -65,70 -15,1 -17,11 -66,63 -32,23 -51,0 -3,1 -17,3 -13,6 -59,3 -19,31 -1,24 -41,3 -4,49 -40,57 -63,6 -16,17 -22,25 -39,60 -11,34 -56,7 -38,57 -55,53 -35,66 -1,11 -64,19 -50,3 -9,38 -19,8 -64,61 -3,17 -8,33 -13,1 -5,9 -50,7 -1,34 -41,65 -48,57 -14,13 -17,31 -56,1 -6,15 -24,25 -23,2 -69,13 -45,52 -15,23 -15,27 -27,28 -60,3 -31,30 -19,35 -42,53 -19,27 -61,1 -65,50 -53,2 -52,61 -15,20 -42,7 -67,20 -11,23 -29,54 -6,17 -41,53 -47,63 -68,51 -21,21 -19,6 -53,61 -23,29 -53,9 -19,29 -21,10 -2,41 -10,3 -49,9 -42,59 -12,1 -45,7 -19,28 -3,35 -69,6 -43,4 -17,21 -47,3 -52,7 -65,22 -45,62 -16,5 -51,3 -48,11 -7,33 -40,3 -26,35 -37,63 -49,68 -11,26 -54,67 -64,23 -21,17 -5,49 -63,65 -23,13 -58,1 -61,54 -69,56 -47,60 -11,7 -9,35 -57,58 -45,66 -1,23 -7,21 -17,12 -11,17 -34,3 -25,25 -22,35 -57,65 -17,17 -1,5 -12,33 -36,63 -19,15 -7,38 -53,55 -21,25 -42,1 -17,23 -35,67 -33,3 -56,63 -56,59 -3,2 -42,67 -65,56 -45,5 -5,33 -21,22 -9,42 -3,14 -21,14 -59,53 -64,53 -33,25 -11,35 -9,1 -63,16 -47,49 -53,60 -47,55 -39,1 -63,60 -35,63 -9,31 -55,68 -57,57 -68,15 -11,39 -62,69 -41,45 -55,57 -5,13 -9,14 -1,32 -17,5 -19,19 -19,30 -1,29 -55,56 -6,35 -21,8 -13,0 -4,25 -16,33 -69,9 -53,67 -67,17 -52,67 -41,59 -24,1 -51,7 -54,7 -3,22 -7,13 -41,61 -45,3 -21,33 -37,53 -11,13 -45,8 -48,1 -43,13 -17,46 -1,33 -41,69 -22,19 -19,38 -19,12 -45,57 -53,6 -15,36 -35,68 -9,21 -43,65 -5,41 -7,7 -68,61 -60,1 -7,23 -21,28 -23,34 -63,69 -7,40 -51,64 -66,51 -43,61 -49,63 -69,11 -50,51 -53,13 -17,24 -47,65 -32,67 -4,15 -38,1 -58,63 -23,21 -61,59 -15,21 -11,27 -33,65 -2,1 -20,25 -11,3 -55,67 -5,31 -43,53 -63,66 -3,29 -65,55 -36,69 -64,1 -3,23 -11,6 -52,57 -61,4 -63,17 -61,69 -3,33 -65,4 -21,16 -27,11 -1,3 -5,39 -69,54 -63,47 -1,36 -27,27 -33,61 -25,37 -61,14 -15,26 -55,1 -7,17 -29,11 -11,12 -2,19 -66,55 -45,59 -29,29 -26,39 -8,17 -45,65 -11,37 -2,39 -0,29 -5,27 -16,31 -67,65 -68,63 -26,25 -9,30 -3,36 -48,65 -59,51 -63,1 -7,41 -23,28 -1,15 -18,1 -4,41 -43,63 -21,27 -67,22 -52,69 -7,18 -68,49 -3,12 -18,17 -9,41 -19,13 -1,17 -3,26 -59,61 -57,66 -53,63 -39,69 -3,3 -67,69 -50,57 -9,19 -1,13 -55,58 -49,6 -7,3 -47,1 -12,37 -59,63 -61,67 -8,45 -41,1 -8,1 -39,63 -8,27 -15,19 -1,25 -61,57 -47,66 -46,5 -0,39 -4,3 -67,8 -9,43 -64,67 -49,47 -63,14 -51,57 -0,47 -8,3 -21,15 -63,57 -46,3 -5,21 -15,31 -57,12 -13,18 -21,23 -67,15 -21,7 -23,14 -67,55 -63,63 -21,13 -67,58 -51,49 -25,26 -2,31 -56,51 -32,69 -55,7 -31,62 -65,57 -55,65 -5,24 -7,20 -11,15 -19,14 -65,21 -5,1 -67,5 -67,63 -67,49 -68,57 -19,21 -37,65 -11,1 -47,61 -33,7 -28,3 -12,21 -47,68 -41,70 -65,1 -69,23 -5,25 -47,11 -49,61 -1,35 -59,57 -1,37 -33,1 -53,57 -59,1 -49,65 -27,15 -60,11 -61,63 -5,34 -69,15 -9,20 -66,65 -49,62 -35,3 -55,5 -4,19 -21,20 -47,67 -59,68 -24,27 -41,5 -67,3 -21,3 -47,9 -65,17 -9,47 -23,3 -41,67 -65,63 -15,29 -55,49 -3,6 -69,17 -22,17 -48,51 -33,64 -51,65 -9,27 -58,55 -25,21 -69,24 -9,22 -64,63 -19,1 -9,36 -17,27 -54,49 -38,69 -8,5 -46,67 -60,57 -68,11 -0,7 -19,17 -39,65 -27,3 -9,40 -64,57 -17,25 -3,25 -19,9 -47,8 -58,61 -23,22 -21,11 -41,7 -18,9 -11,45 -51,67 -52,3 -8,43 -9,25 -69,8 -67,11 -2,27 -63,51 -65,61 -53,5 -7,19 -18,3 -67,18 -45,9 -55,63 -15,15 -47,64 -54,3 -13,31 -19,5 -41,64 -15,16 -37,67 -53,52 -12,9 -15,4 -25,34 -43,59 -2,17 -23,33 -57,8 -16,15 -57,67 -29,0 -66,69 -19,7 -42,61 -66,15 -67,61 -51,63 -36,7 -1,16 -2,23 -66,59 -67,2 -61,64 -56,65 -56,5 -15,2 -19,33 -15,28 -49,53 -5,35 -12,3 -65,18 -69,53 -11,33 -37,2 -47,69 -57,69 -11,5 -34,7 -3,45 -63,5 -15,33 -35,1 -17,20 -23,11 -6,31 -17,35 -50,61 -51,4 -64,3 -62,55 -3,9 -49,60 -13,35 -68,69 -21,37 -44,63 -2,9 -15,7 -49,5 -67,13 -9,39 -9,33 -9,24 -2,11 -5,23 -46,55 -17,22 -9,23 -48,3 -45,13 -47,58 -60,59 -5,18 -14,3 -24,11 -56,69 -43,55 -57,63 -55,10 -17,33 -53,47 -36,3 -13,16 -5,32 -64,7 -32,3 -51,51 -10,17 -13,37 -40,59 -11,31 -13,19 -19,10 -49,1 -34,1 -10,27 -42,9 -61,2 -58,57 -13,33 -25,3 -43,2 -23,31 -24,37 -59,66 -12,29 -7,10 -31,65 -19,23 -39,64 -22,39 -18,5 -55,62 -23,18 -39,62 -53,50 -21,31 -40,55 -58,5 -23,40 -67,66 -69,59 -23,25 -39,61 -1,7 -21,1 -21,5 -57,61 -51,53 -53,51 -5,29 -69,47 -30,27 -5,14 -10,45 -18,23 -7,29 -55,60 -40,7 -49,7 -14,31 -15,25 -68,19 -57,49 -12,23 -7,30 -60,49 -50,9 -16,1 -22,9 -57,55 -15,24 -65,49 -69,25 -59,69 -28,69 -4,21 -23,36 -58,69 -69,61 -23,8 -5,8 -43,1 -9,37 -55,69 -3,11 -66,53 -70,59 -14,19 -15,17 -9,13 -59,55 -36,65 -69,67 -8,23 -23,32 -3,8 -65,3 -69,65 -29,5 -9,15 -61,61 -13,34 -1,1 -3,4 -68,45 -45,56 -33,69 -67,48 -38,65 -6,21 -0,3 -63,68 -50,67 -15,13 -63,58 -9,34 -67,1 -48,63 -60,69 -69,51 -57,47 -70,67 -51,47 -59,54 -57,7 -43,67 -4,45 -59,67 -45,2 -67,57 -62,1 -69,52 -31,63 -69,21 -31,15 -27,9 -3,37 -19,25 -63,55 -6,3 -53,3 -20,21 -13,17 -23,30 -6,23 -43,7 -17,29 -57,2 -21,32 -51,69 -7,1 -44,5 -57,1 -33,66 -45,69 -59,8 -9,3 -13,23 -11,22 -65,5 -1,9 -24,17 -61,3 -49,57 -12,19 -13,28 -69,12 -10,51 -53,53 -13,47 -31,69 -24,43 -69,63 -20,17 -67,21 -44,55 -33,68 -7,15 -45,1 -39,55 -39,4 -69,60 -23,27 -45,61 -51,61 -25,1 -63,3 -37,69 -33,5 -17,15 -9,32 -7,39 -63,54 -65,47 -29,19 -53,43 -60,33 -57,45 -5,6 -47,27 -39,25 -48,47 -53,36 -43,18 -49,21 -41,21 -23,19 -52,35 -39,45 -55,17 -29,39 -57,51 -55,45 -54,27 -33,26 -40,19 -44,17 -57,20 -37,45 -27,64 -31,13 -41,13 -5,7 -9,57 -10,69 -23,47 -1,51 -0,69 -49,12 -3,58 -15,9 -21,53 -53,27 -45,11 -63,42 -27,56 -6,11 -27,12 -27,31 -23,41 -35,41 -15,61 -61,27 -21,43 -41,43 -17,56 -11,66 -41,28 -51,37 -41,27 -38,59 -39,47 -59,41 -11,41 -26,59 -59,16 -29,35 -1,45 -33,41 -55,29 -65,39 -47,50 -28,5 -39,43 -35,21 -54,25 -43,16 -51,43 -31,17 -23,53 -37,21 -43,22 -22,55 -57,17 -15,49 -36,57 -11,48 -56,27 -36,39 -53,35 -8,51 -29,46 -61,29 -67,37 -31,35 -42,47 -63,41 -37,18 -43,36 -52,21 -63,9 -57,48 -29,36 -39,27 -35,59 -55,41 -25,53 -45,47 -19,66 -29,44 -61,5 -49,23 -14,59 -27,59 -19,58 -16,13 -44,51 -29,24 -13,7 -26,19 -37,20 -41,40 -28,27 -65,38 -41,47 -47,19 -49,49 -46,39 -38,55 -13,65 -53,44 -31,49 -36,5 -68,5 -42,45 -3,5 -4,63 -59,23 -23,56 -15,59 -37,52 -67,35 -11,11 -1,63 -11,25 -19,47 -31,33 -61,36 -27,46 -35,44 -46,21 -9,56 -5,59 -27,41 -35,37 -28,13 -39,20 -61,23 -36,15 -35,9 -7,8 -52,15 -14,39 -51,21 -65,25 -35,12 -58,15 -66,35 -23,7 -35,62 -63,25 -68,1 -23,64 -68,33 -65,28 -44,29 -19,67 -29,43 -47,51 -25,67 -2,45 -55,21 -37,43 -32,21 -58,51 -69,33 -13,29 -41,11 -47,23 -65,35 -23,45 -31,64 -41,50 -1,65 -25,39 -42,39 -44,47 -67,39 -32,35 -43,38 -51,29 -9,6 -41,24 -3,67 -57,31 -41,44 -53,19 -19,41 -14,61 -15,41 -46,49 -39,35 -62,51 -51,23 -32,9 -23,60 -1,47 -49,27 -57,36 -19,52 -43,49 -49,35 -21,50 -49,39 -53,38 -51,19 -21,57 -43,45 -33,38 -45,41 -1,56 -39,22 -21,63 -48,49 -47,30 -37,39 -4,61 -34,13 -26,51 -47,39 -19,45 -31,59 -3,52 -17,54 -69,45 -15,35 -49,11 -17,69 -55,13 -64,39 -57,33 -45,40 -28,21 -11,9 -64,29 -33,19 -21,60 -32,19 -47,25 -57,53 -31,4 -17,61 -69,5 -19,39 -46,15 -60,51 -9,50 -27,40 -63,29 -59,36 -11,55 -25,61 -30,55 -35,25 -27,69 -23,1 -9,65 -43,37 -27,42 -19,49 -56,45 -13,49 -35,7 -33,47 -43,11 -38,33 -35,49 -63,39 -41,20 -13,48 -1,60 -43,30 -7,45 -55,19 -65,19 -53,15 -33,53 -29,49 -51,45 -13,50 -34,23 -20,55 -10,11 -12,39 -17,53 -11,65 -27,37 -8,53 -65,24 -65,45 -61,45 -7,65 -59,37 -27,21 -39,39 -31,67 -45,23 -53,10 -59,22 -25,42 -1,57 -54,45 -13,10 -43,23 -37,51 -51,13 -40,35 -48,45 -36,27 -1,59 -39,51 -57,32 -31,5 -35,5 -8,69 -25,29 -39,9 -19,53 -29,40 -61,43 -7,62 -39,17 -3,54 -27,57 -67,43 -23,49 -53,17 -29,47 -25,41 -9,62 -61,35 -27,38 -23,9 -67,38 -41,49 -22,45 -43,15 -25,17 -13,69 -31,52 -29,68 -29,37 -30,37 -7,63 -37,27 -55,39 -65,13 -50,23 -59,11 -25,11 -25,65 -26,15 -55,37 -47,18 -20,69 -12,69 -8,47 -61,17 -53,12 -54,41 -9,69 -33,59 -57,37 -47,47 -61,39 -40,13 -69,3 -18,55 -22,47 -65,41 -31,45 -21,9 -38,27 -61,30 -61,55 -3,57 -51,11 -20,57 -41,51 -61,15 -40,37 -53,23 -49,38 -22,69 -1,61 -16,59 -20,65 -17,63 -51,17 -26,45 -24,31 -61,49 -38,41 -22,51 -29,16 -11,52 -34,35 -30,61 -37,33 -58,19 -9,29 -29,17 -61,9 -2,51 -7,59 -49,51 -35,55 -8,59 -29,41 -37,47 -23,67 -30,53 -15,69 -33,27 -49,31 -69,29 -59,43 -3,41 -43,10 -59,19 -35,27 -61,11 -27,25 -49,30 -28,57 -15,53 -39,29 -45,46 -16,41 -28,9 -27,61 -37,15 -29,18 -15,47 -17,57 -25,19 -37,25 -11,64 -45,12 -61,46 -14,67 -6,51 -19,65 -32,17 -21,65 -46,29 -51,28 -25,6 -19,51 -35,61 -47,41 -45,45 -39,49 -36,25 -19,59 -32,25 -25,47 -30,41 -62,19 -39,50 -41,41 -44,43 -53,37 -33,14 -40,51 -62,47 -19,48 -55,43 -63,13 -68,43 -65,29 -53,25 -23,59 -39,11 -54,17 -59,35 -63,53 -13,11 -35,58 -12,5 -63,21 -25,20 -45,37 -34,47 -24,55 -3,53 -11,67 -46,33 -25,31 -56,23 -36,43 -8,65 -61,19 -37,41 -41,31 -31,27 -37,23 -64,49 -6,67 -9,17 -11,40 -17,13 -26,11 -67,41 -23,57 -13,52 -50,17 -21,35 -33,51 -59,40 -27,5 -36,33 -3,62 -35,60 -58,43 -13,56 -24,67 -17,37 -29,53 -63,23 -20,51 -24,39 -13,12 -2,55 -62,41 -28,49 -39,44 -20,47 -52,27 -35,39 -59,25 -35,32 -49,29 -65,31 -35,52 -54,47 -29,51 -37,9 -13,13 -53,31 -45,39 -9,7 -39,13 -17,65 -37,31 -24,5 -30,5 -2,65 -28,7 -49,17 -55,55 -37,24 -13,5 -3,68 -49,13 -56,15 -21,49 -41,37 -43,26 -57,25 -3,47 -29,21 -47,43 -29,42 -55,11 -35,19 -6,55 -53,34 -23,17 -31,12 -4,69 -15,43 -66,33 -59,33 -13,57 -17,42 -10,67 -59,13 -50,37 -33,45 -35,40 -38,7 -21,41 -9,63 -53,1 -33,37 -13,66 -50,15 -1,55 -19,36 -18,47 -61,26 -49,25 -59,38 -5,43 -37,62 -11,61 -22,67 -61,18 -33,55 -18,61 -25,9 -62,49 -56,29 -65,44 -59,29 -33,39 -55,9 -49,37 -13,55 -35,22 -41,39 -48,19 -30,21 -13,9 -21,39 -37,61 -29,15 -27,52 -19,55 -47,35 -51,33 -8,55 -63,7 -35,46 -11,54 -29,69 -15,52 -31,46 -25,62 -63,43 -41,26 -61,41 -7,64 -43,35 -47,33 -40,33 -45,36 -57,41 -57,23 -57,27 -11,29 -5,69 -63,37 -7,25 -34,9 -57,24 -23,5 -59,18 -23,55 -48,41 -11,47 -16,57 -60,25 -60,23 -20,53 -66,47 -56,33 -30,11 -15,46 -26,33 -64,33 -51,10 -35,13 -5,55 -33,21 -10,55 -35,11 -9,53 -23,44 -63,11 -69,1 -21,45 -6,47 -42,17 -32,41 -17,49 -61,12 -35,45 -31,51 -55,20 -31,25 -7,51 -41,15 -45,31 -31,8 -29,13 -3,43 -27,70 -59,21 -43,41 -67,45 -59,46 -56,43 -5,66 -18,39 -39,10 -1,22 -68,25 -15,48 -68,41 -2,67 -37,46 -15,44 -25,69 -43,47 -61,28 -61,31 -43,20 -48,37 -19,44 -24,9 -27,16 -37,29 -51,40 -38,25 -62,31 -31,23 -47,21 -13,53 -12,61 -37,8 -5,47 -17,67 -49,44 -31,19 -25,57 -13,67 -3,65 -63,8 -3,69 -29,63 -11,63 -27,60 -31,37 -29,61 -25,27 -32,13 -1,53 -52,31 -57,35 -36,35 -67,32 -33,30 -4,57 -23,43 -39,31 -46,47 -5,61 -43,51 -51,9 -10,43 -5,63 -69,41 -7,60 -53,21 -45,35 -34,25 -37,35 -33,40 -64,9 -37,7 -9,49 -13,59 -70,43 -11,46 -43,34 -36,49 -29,9 -46,13 -31,38 -41,23 -65,33 -47,28 -54,37 -23,58 -33,33 -1,43 -7,67 -6,43 -63,33 -27,17 -49,41 -15,40 -43,21 -50,1 -61,21 -5,5 -51,48 -37,10 -44,49 -1,64 -55,31 -13,54 -47,31 -31,57 -45,49 -57,50 -52,25 -48,33 -61,13 -27,29 -31,28 -19,69 -23,15 -45,20 -65,42 -24,63 -55,47 -61,20 -40,29 -45,55 -11,59 -48,35 -25,5 -33,29 -15,10 -59,44 -41,29 -24,23 -43,27 -69,31 -37,38 -45,15 -51,15 -65,11 -5,46 -41,33 -62,37 -62,35 -53,20 -59,31 -9,67 -31,44 -46,37 -22,59 -27,19 -41,16 -25,4 -11,8 -31,9 -16,7 -28,61 -49,45 -45,21 -57,15 -50,25 -30,7 -14,69 -43,14 -33,49 -42,33 -67,36 -21,62 -51,38 -37,49 -62,9 -58,13 -35,43 -1,49 -57,46 -25,43 -5,67 -31,53 -59,9 -8,67 -13,63 -43,32 -33,42 -30,49 -0,63 -1,50 -21,59 -19,63 -36,55 -23,37 -67,27 -10,61 -5,56 -31,31 -47,13 -20,45 -28,31 -1,67 -15,62 -34,19 -55,40 -62,23 -2,47 -67,31 -39,5 -7,57 -15,70 -33,57 -28,53 -55,27 -7,5 -66,25 -47,22 -11,51 -23,51 -53,28 -61,33 -23,69 -65,37 -11,53 -31,3 -64,45 -7,69 -13,42 -31,34 -4,65 -68,21 -55,15 -41,55 -15,56 -39,33 -45,34 -25,15 -19,61 -21,67 -37,48 -24,53 -7,49 -37,30 -43,31 -5,15 -37,36 -31,41 -27,65 -25,13 -0,53 -37,57 -45,43 -15,65 -25,45 -33,48 -15,42 -15,38 -45,51 -3,55 -29,7 -39,23 -13,39 -20,63 -31,56 -45,27 -64,31 -27,39 -33,16 -25,14 -61,25 -21,55 -55,23 -43,39 -18,65 -15,67 -43,9 -30,59 -26,29 -41,17 -60,15 -25,23 -57,9 -24,15 -10,57 -17,59 -65,27 -52,45 -58,29 -70,31 -15,39 -55,35 -43,33 -17,55 -29,45 -55,14 -9,59 -53,16 -31,43 -15,5 -17,43 -62,43 -17,47 -59,28 -10,29 -67,29 -61,37 -69,36 -22,53 -43,43 -29,57 -48,15 -29,67 -61,47 -33,35 -51,31 -35,23 -27,13 -34,55 -27,18 -25,49 -25,63 -34,37 -39,38 -60,39 -55,25 -31,32 -53,39 -37,17 -39,21 -33,50 -68,27 -50,47 -26,53 -56,41 -15,51 -51,42 -11,43 -21,47 -35,33 -50,41 -31,11 -45,32 -31,29 -33,28 -15,57 -69,28 -23,63 -35,47 -55,22 -29,27 -29,59 -62,15 -27,67 -13,43 -53,24 -6,5 -29,50 -44,41 -10,63 -36,37 -1,58 -59,27 -39,37 -26,23 -25,33 -39,16 -15,50 -60,21 -3,63 -45,19 -46,41 -42,11 -5,57 -5,45 -4,53 -42,49 -49,33 -10,59 -21,69 -3,61 -30,19 -28,33 -21,42 -30,23 -69,37 -16,37 -33,17 -65,23 -38,53 -54,13 -43,19 -16,9 -34,61 -70,3 -38,49 -39,7 -37,42 -31,47 -15,54 -70,41 -50,21 -15,55 -61,44 -47,29 -54,9 -13,24 -18,69 -25,55 -45,10 -17,51 -52,13 -3,59 -27,53 -22,43 -45,25 -5,53 -39,19 -32,7 -13,51 -33,11 -13,61 -33,15 -59,39 -54,31 -63,31 -30,33 -50,35 -28,29 -22,65 -14,7 -13,64 -13,41 -35,30 -37,14 -27,63 -21,51 -23,23 -57,26 -66,29 -29,48 -35,50 -27,49 -51,35 -13,45 -69,35 -27,44 -13,27 -20,61 -37,19 -2,61 -33,9 -53,32 -61,53 -65,43 -44,13 -51,39 -35,17 -24,47 -27,55 -56,53 -31,36 -50,45 -51,30 -17,68 -29,33 -59,48 -47,45 -34,53 -41,19 -42,29 -45,44 -7,43 -63,45 -34,17 -51,25 -3,51 -37,12 -29,31 -3,42 -63,61 -66,13 -7,48 -27,43 -61,32 -59,49 -15,63 -3,15 -40,47 -35,31 -29,55 -26,57 -1,69 -65,10 -5,11 -24,21 -57,21 -41,25 -38,15 -37,5 -51,27 -41,30 -11,57 -63,26 -67,25 -29,23 -39,18 -17,39 -52,41 -57,39 -51,41 -25,50 -21,61 -35,15 -9,51 -69,30 -56,39 -49,20 -61,51 -27,23 -25,51 -49,16 -67,19 -63,35 -17,41 -56,17 -65,46 -63,40 -6,53 -37,28 -7,47 -32,53 -47,37 -59,45 -70,21 -49,32 -25,7 -26,67 -25,60 -65,26 -59,17 -9,55 -6,45 -11,21 -18,13 -25,68 -39,40 -11,50 -67,46 -45,33 -37,54 -7,58 -35,29 -55,33 -29,14 -23,61 -21,38 -57,11 -15,66 -38,45 -25,59 -40,43 -37,37 -51,18 -67,47 -18,51 -56,35 -49,43 -7,27 -13,44 -46,17 -31,39 -27,33 -5,51 -13,46 -68,39 -61,7 -39,26 -45,53 -43,29 -34,33 -39,15 -7,53 -33,44 -69,39 -62,11 -23,65 -59,15 -41,42 -55,59 -27,7 -50,33 -69,43 -32,59 -58,23 -29,58 -41,36 -49,24 -45,17 -55,34 -33,31 -16,61 -7,55 -31,21 -23,48 -46,45 -6,63 -41,14 -4,59 -35,57 -59,47 -49,28 -57,38 -63,27 -41,22 -13,21 -5,50 -47,26 -57,43 -53,22 -36,17 -57,13 -9,61 -66,39 -55,30 -16,67 -46,25 -13,25 -43,17 -9,11 -53,33 -35,20 -37,55 -58,33 -10,9 -44,23 -45,29 -33,10 -37,11 -63,67 -1,41 -64,35 -33,23 -19,43 -53,29 -47,17 -31,55 -13,58 -33,13 -59,42 -6,69 -43,25 -11,69 -47,15 -41,9 -25,64 -27,47 -47,42 -17,64 -47,53 -17,9 -20,67 -18,59 -13,26 -53,41 -29,26 -59,30 -33,56 -44,27 -26,47 -27,66 -3,21 -49,26 -29,66 -12,59 -41,35 -25,48 -33,32 -27,35 -39,57 -15,64 -37,22 -39,6 -5,65 -11,49 -65,9 -29,25 -49,15 -9,9 -66,41 -55,18 -41,52 -38,31 -59,52 -69,34 -27,51 -27,45 -59,10 -3,49 -29,22 -7,61 -35,35 -32,49 -67,33 -63,48 -20,41 -19,40 -1,21 -1,44 -57,29 -64,13 -49,14 -17,44 -40,9 -19,57 -69,27 -67,23 -63,49 -62,25 -47,24 -17,50 -35,51 -50,11 -32,47 -33,43 -49,19 -39,41 -67,30 -61,34 -43,60 -12,46 -70,22 -38,20 -14,44 -41,38 -22,52 -12,67 -2,7 -58,46 -34,30 -34,70 -6,46 -20,68 -7,24 -9,18 -33,20 -60,42 -67,24 -37,6 -0,61 -12,18 -20,10 -39,54 -69,0 -16,65 -40,63 -14,10 -34,21 -54,56 -16,21 -62,12 -23,24 -48,61 -70,29 -30,16 -0,66 -70,6 -6,52 -30,62 -35,14 -62,36 -48,58 -13,8 -28,60 -22,26 -66,17 -62,54 -40,53 -12,53 -23,54 -61,40 -43,66 -0,34 -15,68 -32,66 -22,10 -42,48 -28,6 -38,38 -55,28 -46,23 -16,68 -52,54 -5,52 -4,64 -57,42 -2,49 -38,12 -64,38 -28,52 -68,31 -68,52 -21,70 -16,16 -8,31 -9,66 -4,55 -11,68 -36,14 -42,16 -32,39 -54,64 -18,58 -52,46 -68,22 -7,0 -29,62 -0,44 -35,8 -18,67 -23,52 -58,42 -26,2 -32,57 -8,66 -30,20 -0,30 -12,6 -46,1 -49,2 -34,56 -16,52 -2,2 -48,24 -25,38 -41,34 -46,28 -32,26 -53,48 -34,69 -11,28 -3,64 -62,8 -12,48 -19,22 -4,11 -24,30 -22,31 -32,45 -19,68 -12,60 -7,32 -22,38 -25,58 -55,42 -47,70 -18,28 -66,62 -34,41 -44,57 -4,10 -53,64 -38,34 -12,22 -37,70 -0,42 -30,31 -35,54 -61,48 -58,34 -36,38 -66,43 -54,52 -39,66 -43,62 -60,52 -37,44 -42,22 -53,0 -70,25 -18,40 -69,20 -53,58 -21,18 -25,12 -0,67 -25,44 -22,14 -48,32 -48,38 -18,15 -52,30 -34,15 -52,43 -52,52 -46,63 -2,22 -10,21 -22,64 -37,58 -10,31 -21,64 -6,40 -0,58 -36,42 -24,2 -65,20 -0,1 -2,58 -21,26 -0,68 -62,26 -8,32 -38,17 -11,56 -19,18 -31,20 -43,70 -0,5 -3,10 -14,38 -14,37 -32,33 -18,44 -62,53 -6,29 -70,30 -42,21 -18,37 -23,38 -14,60 -46,59 -34,22 -10,48 -8,63 -68,20 -50,58 -44,32 -4,67 -40,14 -22,34 -6,25 -38,52 -38,48 -32,30 -38,54 -26,49 -5,30 -34,48 -45,28 -56,58 -17,60 -10,38 -44,70 -24,49 -7,12 -42,38 -38,13 -52,48 -40,2 -52,59 -20,52 -21,68 -44,44 -2,70 -10,6 -24,52 -40,48 -48,20 -70,20 -36,23 -36,58 -20,27 -58,4 -2,8 -26,38 -4,38 -36,60 -12,57 -34,49 -30,29 -48,50 -18,60 -22,21 -64,62 -31,50 -20,37 -20,33 -5,40 -34,46 -12,12 -17,32 -2,29 -44,28 -58,45 -32,63 -54,30 -12,42 -16,28 -8,16 -66,42 -12,49 -12,63 -26,68 -18,25 -44,21 -17,6 -34,34 -36,67 -2,13 -26,3 -70,0 -39,58 -17,14 -18,12 -43,50 -16,25 -2,34 -8,50 -62,6 -26,41 -50,40 -30,56 -18,49 -4,32 -16,60 -22,8 -15,6 -21,36 -4,58 -29,28 -47,40 -36,62 -34,14 -33,60 -8,44 -43,8 -60,55 -39,30 -24,24 -36,11 -47,48 -38,32 -22,58 -31,10 -38,60 -16,46 -10,5 -23,50 -0,14 -4,60 -10,64 -20,22 -66,37 -28,51 -27,26 -38,21 -30,43 -19,20 -0,28 -16,54 -40,46 -34,5 -56,42 -8,34 -41,68 -61,8 -50,63 -27,14 -36,8 -26,36 -30,70 -36,20 -70,33 -41,2 -70,19 -5,22 -38,10 -10,40 -28,42 -42,41 -46,42 -0,23 -70,46 -24,40 -16,39 -38,56 -26,50 -22,5 -40,56 -34,57 -52,64 -46,70 -8,26 -3,34 -32,52 -70,44 -12,24 -8,10 -28,50 -14,16 -20,56 -9,60 -8,20 -37,34 -49,22 -27,24 -17,10 -68,30 -22,62 -22,15 -58,35 -69,44 -14,20 -48,22 -48,25 -51,2 -26,21 -6,30 -12,26 -33,12 -5,60 -60,56 -0,70 -4,56 -56,50 -58,47 -46,0 -50,22 -52,68 -4,4 -32,36 -34,60 -30,17 -36,56 -62,42 -28,23 -3,50 -35,28 -39,34 -38,3 -30,12 -20,7 -18,57 -52,60 -6,50 -52,49 -4,13 -56,56 -8,70 -44,8 -70,1 -28,62 -42,42 -60,12 -50,28 -47,38 -60,43 -50,54 -51,50 -55,12 -31,18 -47,32 -18,16 -16,6 -62,32 -24,69 -2,54 -62,27 -40,32 -38,68 -8,36 -59,70 -52,16 -68,37 -24,18 -53,8 -14,70 -31,60 -32,4 -33,36 -64,14 -52,22 -31,22 -12,51 -16,38 -30,1 -48,40 -57,56 -69,40 -25,32 -50,60 -49,4 -30,64 -46,22 -28,48 -42,56 -2,43 -46,6 -6,41 -43,46 -20,59 -54,6 -58,64 -0,59 -41,10 -54,42 -62,63 -30,57 -4,17 -22,40 -60,44 -52,42 -28,30 -7,2 -0,15 -22,27 -70,38 -30,68 -5,64 -35,38 -0,20 -17,62 -55,70 -5,4 -56,60 -34,42 -60,61 -40,27 -38,44 -5,16 -14,51 -18,26 -46,46 -69,26 -48,14 -32,43 -10,28 -27,22 -54,20 -14,48 -67,26 -57,0 -4,70 -59,12 -51,6 -40,10 -59,20 -32,8 -34,2 -20,18 -62,44 -64,46 -20,58 -56,31 -54,69 -28,14 -0,17 -22,12 -52,0 -20,44 -34,8 -32,29 -65,30 -56,3 -26,52 -4,47 -22,1 -13,38 -62,65 -0,31 -44,42 -42,15 -42,10 -24,38 -10,62 -26,64 -48,64 -48,21 -43,56 -8,46 -4,7 -9,0 -30,14 -56,61 -68,34 -56,55 -13,40 -50,62 -8,2 -50,39 -18,68 -0,37 -4,5 -47,36 -14,24 -44,58 -56,25 -24,62 -6,13 -11,2 -20,5 -18,11 -51,16 -56,6 -53,70 -32,0 -34,51 -37,56 -18,41 -42,70 -24,20 -22,44 -28,46 -20,38 -36,34 -10,56 -43,44 -0,60 -1,70 -37,0 -58,12 -68,17 -66,14 -70,40 -61,58 -53,40 -60,19 -14,4 -3,20 -6,38 -53,18 -24,8 -14,43 -42,43 -50,4 -57,30 -7,50 -37,40 -64,65 -36,47 -66,34 -16,27 -70,34 -20,14 -60,27 -32,31 -66,48 -43,28 -64,28 -67,54 -13,70 -50,38 -42,58 -52,26 -24,29 -20,48 -17,30 -66,67 -68,64 -68,9 -14,68 -70,24 -38,5 -60,47 -11,60 -67,12 -0,43 -1,12 -56,16 -38,22 -24,68 -51,8 -38,63 -60,22 -36,54 -38,61 -66,45 -46,27 -48,8 -6,0 -27,30 -8,40 -32,60 -5,62 -62,67 -64,32 -52,37 -60,5 -70,64 -10,18 -63,52 -18,20 -34,39 -1,62 -51,34 -40,49 -28,38 -51,62 -8,54 -45,58 -5,10 -12,15 -68,8 -26,22 -35,34 -58,32 -32,34 -10,10 -6,7 -38,42 -62,57 -52,6 -40,22 -62,70 -58,6 -50,48 -41,46 -52,18 -60,2 -25,70 -5,0 -50,6 -39,2 -2,4 -62,45 -48,23 -57,34 -55,66 -18,14 -9,52 -24,22 -54,60 -49,52 -12,54 -54,14 -63,44 -56,64 -4,0 -20,50 -18,64 -1,18 -14,41 -16,35 -29,2 -66,52 -12,50 -42,68 -34,24 -56,57 -66,32 -57,60 -28,8 -22,66 -32,32 -52,58 -50,42 -4,36 -16,32 -65,58 -56,20 -42,0 -17,4 -34,68 -49,36 -32,58 -68,50 -19,16 -6,70 -40,38 -60,37 -50,49 -34,40 -51,70 -1,38 -13,32 -53,66 -6,32 -65,32 -32,22 -14,55 -38,30 -44,26 -66,8 -50,30 -48,31 -5,36 -52,19 -29,30 -24,50 -55,36 -46,69 -64,18 -44,0 -27,10 -68,32 -60,13 -12,17 -10,34 -18,18 -70,52 -10,8 -12,38 -16,70 -8,9 -58,65 -64,21 -70,4 -5,48 -22,49 -36,2 -18,30 -41,6 -10,44 -48,48 -60,14 -23,42 -46,36 -18,56 -40,18 -36,40 -24,59 -64,64 -40,11 -59,50 -14,57 -25,46 -65,0 -32,16 -24,4 -40,34 -50,36 -38,50 -20,30 -66,38 -14,40 -70,62 -6,58 -12,28 -62,60 -68,28 -36,29 -58,37 -45,68 -22,22 -40,65 -49,64 -24,65 -40,8 -0,12 -40,64 -70,66 -23,62 -66,49 -28,32 -47,44 -10,12 -29,8 -26,18 -28,16 -49,50 -7,6 -30,54 -52,10 -32,10 -1,0 -40,28 -7,52 -18,54 -5,42 -58,10 -54,40 -41,4 -10,22 -24,56 -44,36 -39,14 -12,2 -65,48 -20,16 -10,4 -56,66 -40,68 -16,19 -45,42 -20,43 -50,18 -40,15 -0,6 -18,62 -14,2 -51,44 -35,48 -54,68 -7,4 -30,25 -27,36 -48,9 -42,46 -57,54 -68,55 -34,59 -58,16 -70,65 -70,14 -24,12 -46,12 -30,39 -55,2 -38,8 -62,22 -3,70 -60,40 -7,44 -9,44 -16,58 -64,2 -22,46 -40,45 -23,0 -62,30 -46,18 -23,6 -27,48 -31,66 -66,30 -52,9 -29,20 -36,21 -69,10 -24,41 -8,38 -44,34 -37,66 -68,4 -34,28 -21,44 -28,70 -42,30 -35,42 -46,16 -6,8 -36,48 -8,61 -14,26 -62,0 -28,45 -46,7 -7,68 -32,40 -61,24 -32,1 -40,12 -58,2 -62,58 -0,2 -42,60 -13,68 -48,59 -6,18 -36,28 -61,0 -63,28 -58,8 -44,33 -59,6 -64,6 -12,62 -30,32 -39,56 -70,32 -67,44 -56,11 -38,6 -2,36 -60,50 -55,26 -58,66 -55,8 -48,17 -56,2 -64,0 -60,41 -64,24 -42,52 -30,13 -16,20 -30,44 -1,26 -47,34 -24,54 -56,8 -16,0 -2,32 -62,38 -70,56 -18,50 -9,28 -63,38 -30,18 -10,70 -44,25 -57,40 -28,26 -54,0 -36,12 -32,24 -44,62 -52,23 -19,54 -45,30 -51,68 -8,8 -48,62 -40,60 -48,6 -48,69 -22,36 -61,10 -62,28 -51,66 -14,18 -53,56 -29,52 -63,4 -46,50 -26,69 -52,56 -21,54 \ No newline at end of file diff --git a/2024/go/day19/day19.go b/2024/go/day19/day19.go deleted file mode 100644 index e4e19bd..0000000 --- a/2024/go/day19/day19.go +++ /dev/null @@ -1,87 +0,0 @@ -package day19 - -import ( - "sort" - "strings" -) - -func Part1(input string) int { - in := strings.Split(input, "\n\n") - towels := strings.Split(in[0], ", ") - patterns := strings.Split(in[1], "\n") - // fmt.Println(towels, patterns) - count := 0 - not_possibles := make(map[string]bool) - for _, pattern := range patterns { - if isPossible(towels, pattern, not_possibles) { - // fmt.Println(count, pattern) - count++ - } - } - return count -} - -func Part2(input string) int { - in := strings.Split(input, "\n\n") - towels := strings.Split(in[0], ", ") - sort.Strings(towels) - patterns := strings.Split(in[1], "\n") - // fmt.Println(towels, patterns) - count := 0 - memo := make(map[string]int) - for _, pattern := range patterns { - count += countPossible(sortStringsByPrefix(towels), pattern, memo) - } - return count -} - -func isPossible(towels []string, pattern string, not_possibles map[string]bool) bool { - if pattern == "" { - return true - } - if not_possibles[pattern] { - return false - } - for _, towel := range towels { - if strings.HasPrefix(pattern, towel) { - if isPossible(towels, pattern[len(towel):], not_possibles) { - return true - } - } - } - not_possibles[pattern] = true - return false -} - -func countPossible(towels map[byte][]string, pattern string, memo map[string]int) int { - if pattern == "" { - return 1 - } - - //If memo has key - if val, ok := memo[pattern]; ok { - return val - } - - count := 0 - for _, towel := range towels[pattern[0]] { - if strings.HasPrefix(pattern, towel) { - count += countPossible(towels, pattern[len(towel):], memo) - } - } - - memo[pattern] = count - - return count -} - -func sortStringsByPrefix(slice []string) map[byte][]string { - result := make(map[byte][]string) - for _, str := range slice { - result[str[0]] = append(result[str[0]], str) - } - for _, t := range result { - sort.Strings(t) - } - return result -} diff --git a/2024/go/day19/day19_test.go b/2024/go/day19/day19_test.go deleted file mode 100644 index fa99ba2..0000000 --- a/2024/go/day19/day19_test.go +++ /dev/null @@ -1,42 +0,0 @@ -package day19 - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestPart1(t *testing.T) { - r := Part1(`r, wr, b, g, bwu, rb, gb, br - -brwrr -bggr -gbbr -rrbgbr -ubwu -bwurrg -brgr -bbrgwb`) - require.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`) - require.Equal(t, 16, r) -} - -func TestPart2Long(t *testing.T) { - r := Part2(`rrgwru, gwubwg, wgbbw, bwb, ugrgw, uwgguuw, wuggb, bgwb, ubrr, grruuub, rwbwgbub, wwwggg, uuw, gubuu, urwb, bubg, bubb, rruruuu, ubgr, uw, urugg, wubuu, brwb, buw, bgug, wgbwwrb, rwrgrr, gwgr, rrwrg, wwbwgbw, gguu, rgg, bwg, ruurrwg, wbu, ggg, wrw, brbw, wbb, rrbgg, gbb, gwwrubwu, rwgu, grgwwu, wguu, rwg, wbwug, rbur, gwg, wbrugu, wbwwgu, wbbuw, rwrg, rgru, rgb, bwwrg, bwur, rrubwu, gwb, ugwur, wbguwb, rbu, ubrwgw, ruwbr, wbbu, rrbwbg, rgub, rwgb, urwg, bbw, bugg, rugwg, rwbrwww, wuru, guu, brwbg, ug, ruuwruw, bguww, wwrgrurg, rrbgr, uubwurb, brrrwgg, bur, urg, rbg, wruw, gr, ugb, wwrbgrg, wbuuw, bbugu, uug, rrbb, rrbw, bgr, wwwru, rgu, urr, rg, wbgbru, brrgu, gubu, rurgr, wwbrgg, ruurwgwg, rbb, rbrugwb, gwwrbg, bwuuwrg, wu, b, bgwrb, uwggr, rgbb, rww, wgwb, gwgwr, uwbb, uww, gu, ubwuu, wbwwwug, rurwru, rr, rrg, uggr, bgwu, wbgbu, urggw, br, gubgugr, wgrb, bbgrrbu, brbg, wrg, bgrb, rwbwwur, uwr, bubu, grwb, ubb, wr, bbbgwr, bug, uwgwuwu, grb, bgw, uuu, ugr, wgbbgu, gbg, bgwub, urbgrw, rbruwg, gb, bbwgwur, uwbgwrr, ggrb, wbrrwrbu, gbbugrb, ub, rwb, gwr, ruwu, gurgu, rru, uuwwgwuw, bw, ruwbbb, rbgrgu, wuwu, grrugr, wgr, rbbr, rugr, rrrrbww, bwrr, wrbbr, uuwgr, gug, wwb, rgur, brbrr, gguw, grwubrg, rrrr, uwb, wuwwrrwg, gwbggr, rwrub, wuur, gub, rbgb, urrbubrr, uwubu, brbb, bwbr, bww, ruuubwu, ugbbbr, bub, rrug, wub, gruu, uu, bbu, gbbr, urrg, buwu, grw, grbbbu, bgb, ugubg, uwww, urw, wwubruww, buurb, www, bguurr, wwgu, wgb, ruwub, wggggbg, urrb, gbwuw, ubrrg, wrr, gbubgg, gw, wuw, wuug, wwrb, wgg, rgugrru, rgwrbr, guurrg, bgu, rurgb, gwggb, bwgbbw, ggwb, ubwgw, bbg, rbr, wgru, urwr, brr, rgbr, rgr, wwg, guwuru, uuggg, rrw, buu, urb, guwg, ugwwbuwb, rubb, brbuww, rwugru, ubu, wwub, bgwgb, wrug, rug, w, brgg, wwugwruw, ggrwb, bbwuwuu, uub, rrr, ggbrr, wbur, wurbru, wgu, brb, urbbb, gburbww, wbrgruru, rbugr, gubw, wgwgg, rwr, ugw, gggg, gwrwrg, rrub, gbwgg, grg, uwuur, gbwbbb, guw, gbwbb, uwu, ruw, bwr, rwgub, rbw, ggbwr, u, gwu, rrurrb, gwgg, uugwrbr, brw, ugburg, rwu, wwu, wbr, ruwgr, gbwbur, rwgr, rwbww, rbgr, rgbub, rbbuw, ruu, bwgw, bbwg, ubr, gurr, wwr, wwwguu, gbw, ggw, gru, wug, rubwrbrr, wbrrrr, uru, wbgw, wgur, uurgg, bbb, rbwgwbur, wwbwur, bbgubw, gww, brg, ugu, rgrgw, wwrrgugu, rrrwuww, uwwrb, wrb, rrgg, wubgrrb, bwwgrbww, gbr, gwrwu, brgwwbu, urrwub, rbru, bwrgrr, brwuwrb, guuur, wb, bbrb, brww, wuwrww, bu, rgw, rwbwug, bbug, urrgr, bg, bgg, wbgwbgru, wbrru, uwbbr, wbg, gwwur, gur, ubwb, gubbb, bb, wrugr, grur, rb, uwubrg, bwgrw, gbug, g, wuwubgw, ubw, urgu, rrrg, uwg, bbww, uwgrug, ww, ggu, gwbuwu, rgggwgr, wugw, gbrrg, ugg, bwu, ubuur, uurrw, uwwug, bgww, ubg, rw, gwgbwrg, wuu, rbgbg, buwbur, rub, ugbwwrgu, gbww, wbw, gurbwu, bruw, rggrbrgw, wguwu, ubwbwr, ru, uwur, ggb, uurwg, wguubgr, wru, rbrbr, rbwr, wwwrbb, urww, rur, bru, bbbwrw, uwrwrr, ruww, ububbgr, rrb, bggrwg, bbr, wrwrb, bwgwrbg, grbuwg, gg, ubuurwg, uur, guguwb, rugurgbw, bbuwbb - -wrbwgruugbbgwwurggwrgrrrurbgwbgggwbbgwgbrwggwur`) - require.Equal(t, 16, r) -} diff --git a/2024/go/day19/input.txt b/2024/go/day19/input.txt deleted file mode 100644 index f06b5fa..0000000 --- a/2024/go/day19/input.txt +++ /dev/null @@ -1,402 +0,0 @@ -rrgwru, gwubwg, wgbbw, bwb, ugrgw, uwgguuw, wuggb, bgwb, ubrr, grruuub, rwbwgbub, wwwggg, uuw, gubuu, urwb, bubg, bubb, rruruuu, ubgr, uw, urugg, wubuu, brwb, buw, bgug, wgbwwrb, rwrgrr, gwgr, rrwrg, wwbwgbw, gguu, rgg, bwg, ruurrwg, wbu, ggg, wrw, brbw, wbb, rrbgg, gbb, gwwrubwu, rwgu, grgwwu, wguu, rwg, wbwug, rbur, gwg, wbrugu, wbwwgu, wbbuw, rwrg, rgru, rgb, bwwrg, bwur, rrubwu, gwb, ugwur, wbguwb, rbu, ubrwgw, ruwbr, wbbu, rrbwbg, rgub, rwgb, urwg, bbw, bugg, rugwg, rwbrwww, wuru, guu, brwbg, ug, ruuwruw, bguww, wwrgrurg, rrbgr, uubwurb, brrrwgg, bur, urg, rbg, wruw, gr, ugb, wwrbgrg, wbuuw, bbugu, uug, rrbb, rrbw, bgr, wwwru, rgu, urr, rg, wbgbru, brrgu, gubu, rurgr, wwbrgg, ruurwgwg, rbb, rbrugwb, gwwrbg, bwuuwrg, wu, b, bgwrb, uwggr, rgbb, rww, wgwb, gwgwr, uwbb, uww, gu, ubwuu, wbwwwug, rurwru, rr, rrg, uggr, bgwu, wbgbu, urggw, br, gubgugr, wgrb, bbgrrbu, brbg, wrg, bgrb, rwbwwur, uwr, bubu, grwb, ubb, wr, bbbgwr, bug, uwgwuwu, grb, bgw, uuu, ugr, wgbbgu, gbg, bgwub, urbgrw, rbruwg, gb, bbwgwur, uwbgwrr, ggrb, wbrrwrbu, gbbugrb, ub, rwb, gwr, ruwu, gurgu, rru, uuwwgwuw, bw, ruwbbb, rbgrgu, wuwu, grrugr, wgr, rbbr, rugr, rrrrbww, bwrr, wrbbr, uuwgr, gug, wwb, rgur, brbrr, gguw, grwubrg, rrrr, uwb, wuwwrrwg, gwbggr, rwrub, wuur, gub, rbgb, urrbubrr, uwubu, brbb, bwbr, bww, ruuubwu, ugbbbr, bub, rrug, wub, gruu, uu, bbu, gbbr, urrg, buwu, grw, grbbbu, bgb, ugubg, uwww, urw, wwubruww, buurb, www, bguurr, wwgu, wgb, ruwub, wggggbg, urrb, gbwuw, ubrrg, wrr, gbubgg, gw, wuw, wuug, wwrb, wgg, rgugrru, rgwrbr, guurrg, bgu, rurgb, gwggb, bwgbbw, ggwb, ubwgw, bbg, rbr, wgru, urwr, brr, rgbr, rgr, wwg, guwuru, uuggg, rrw, buu, urb, guwg, ugwwbuwb, rubb, brbuww, rwugru, ubu, wwub, bgwgb, wrug, rug, w, brgg, wwugwruw, ggrwb, bbwuwuu, uub, rrr, ggbrr, wbur, wurbru, wgu, brb, urbbb, gburbww, wbrgruru, rbugr, gubw, wgwgg, rwr, ugw, gggg, gwrwrg, rrub, gbwgg, grg, uwuur, gbwbbb, guw, gbwbb, uwu, ruw, bwr, rwgub, rbw, ggbwr, u, gwu, rrurrb, gwgg, uugwrbr, brw, ugburg, rwu, wwu, wbr, ruwgr, gbwbur, rwgr, rwbww, rbgr, rgbub, rbbuw, ruu, bwgw, bbwg, ubr, gurr, wwr, wwwguu, gbw, ggw, gru, wug, rubwrbrr, wbrrrr, uru, wbgw, wgur, uurgg, bbb, rbwgwbur, wwbwur, bbgubw, gww, brg, ugu, rgrgw, wwrrgugu, rrrwuww, uwwrb, wrb, rrgg, wubgrrb, bwwgrbww, gbr, gwrwu, brgwwbu, urrwub, rbru, bwrgrr, brwuwrb, guuur, wb, bbrb, brww, wuwrww, bu, rgw, rwbwug, bbug, urrgr, bg, bgg, wbgwbgru, wbrru, uwbbr, wbg, gwwur, gur, ubwb, gubbb, bb, wrugr, grur, rb, uwubrg, bwgrw, gbug, g, wuwubgw, ubw, urgu, rrrg, uwg, bbww, uwgrug, ww, ggu, gwbuwu, rgggwgr, wugw, gbrrg, ugg, bwu, ubuur, uurrw, uwwug, bgww, ubg, rw, gwgbwrg, wuu, rbgbg, buwbur, rub, ugbwwrgu, gbww, wbw, gurbwu, bruw, rggrbrgw, wguwu, ubwbwr, ru, uwur, ggb, uurwg, wguubgr, wru, rbrbr, rbwr, wwwrbb, urww, rur, bru, bbbwrw, uwrwrr, ruww, ububbgr, rrb, bggrwg, bbr, wrwrb, bwgwrbg, grbuwg, gg, ubuurwg, uur, guguwb, rugurgbw, bbuwbb - -wrbwgruugbbgwwurggwrgrrrurbgwbgggwbbgwgbrwggwur -bururbrguwurbguwrubbbbbuburuuuwbgbgrwggbugrwrwurwwbrb -wgwgwbwuggbbwbrbgrwwgwbrbwbrbggrrgburbubwwur -wguwuugubwggburwwbbbbwrgwbrwuubgbbrugrbrrbrrugwuwguwrwwwur -rubwururuggurrgbgrburbrgbuuuuurwgubbbrbuwwbgbwgwrb -rwrwguwuwgbruwurgbwbgrugwgrggwwrrgrbwrurrrrgbrgbbgwggwb -buggrbwwurwuwbwrrwgubuwgburrrwbwubugugwurrbwgwburwubuurwbb -ggwgwrrwbrbgggbubwgwgguurbwwwggbuwbrubuubrrwur -uugugbrwbbwuugwwuwugurbuugbrugrrgbwgugggrgggrgrur -bwrubgugbuugbwrwbbubbgbugbbgruubwrwgubwguubbbugu -wrgrwwgbgubrrwbbgbwuurgbbwrrgwrrwuugrgubwrgrwbwbbbwrgrbb -rwbwwwgrgbrbgwurwbwwrrguwbrbwgrubrubguwurg -rbggguwguwrbgbbruruwgguuwwwrwbugwbbbbrrwgwb -wburgubbbrbgugwurbgrrwgbbuggbrggbrbubrwbrrwur -wgwrwurgrbwgwwuwrgwwbubwbubwbubggwbwgbwwgr -bgbbbgwwgbggrububrubbwwwguruurbbwwububwugwwuburgwurgrwr -rugwgbugbwbbrbgbwrbgwgurbuuwbbwbwbwbguugruwbrrrugwwu -rwbgruguuurwbubwrbrbwwrwurguwuwbbgggrurbgbgbwwwggwu -ubwubgbbrgbbbbgwwurgbuwuubgurwrggrrrgrbbbgggbrbb -wuuruwbwubrwgwuurugbrbwgubruuwwurwgwrbrugwrrbuuuww -ugwgbwrggrwwuwbgwwrubwuubrbrbwgbbwgbubburuguwguww -grbguwwuwgrburgggguugubwwgwguuwbwuwuwgugwggggwurrubwgbbwrb -buwbuwubrrugrrurwrwwbbbrugurgwguwugwwbrurrwbrgrg -gwwgggurwbwggwwbwrrgwwgurubrubbrbuuruurwur -rruguggbrrgwgwgrwbwwwugrbrubgruugrgwgubrgwbubwbrw -grbbbwrrugwrwwurwguugugguwuwggruubrgubguuurubrgrrruwub -wwrwguwwurbwuwwrrwgwggbgwruugbbrgruubwrwur -bgbwwwbbubrugwgubbgbggburrwggbbggbrbgwrrrbrgurwur -gwbwurgrwwbrgrubwgruubbrugbruruwuwgrubugwg -uguugbrbuuugbwwrgubrwgwrgggwrrgbrrbwbuwwwwbgbuwurbrbr -ugbggbwuwrgwugurggrugbrgwbwwbgbrwugubgrwrbuuwgrurwgguugwwwur -uwrwuggbuwwbururwgbrggwgwubburwwggguwwrrggwu -grrwwwrugbwuubrggrwgrwuuuwgwrwrbugrrrwubgwggwbguurbw -rgbuuwbgwgwuwurrgwrgugruwgwbgggbuugugbbwwrwugwrurubwr -gwguwrwgbbruuwrbbubburwgrrrrrwburrwuwrwgwgwur -bgbbuuguggrgrwugruwrbuuuuurwgbwbbubwrrggwrbw -rwwurubruwuwbrbwugrwbgwwuwwuuwuwurwwgwbrwgubgrruuurugwgg -wbwguwbrruruuwubggrbggwggugurgwgbrbugbwwbrbwuguuugr -uguuwrrbrwugrwwbbuwwrgbrwgbwubbubgwwbuuwgrwuwggbwr -wguwwrbbggrugbwrugbububgurrubggbwwugubbubuuguggrwur -uuurbwwwguurrbrgrrrbwgbwuuuwurwbuwgurwguugwrwggb -urrgwwwbuuwrwugrurgwgggrgbwuugruruuwwubruwwbru -wugugbguguwugbwgrgbrugrwwgrbwrgwwubruwwrggggwur -brubbgbwubwugbrruwububuuwbbwbrugwrbbrrggrgwrugrrwbbrrub -gwwruubbrrbbrwuubrwrrgwuwrgbuuwgggbburgwurrwbuuuub -wbugwuwbbwwwggrwwbgwuggbwuuwwgwuwbrubwrgubwurwwrguur -urgrgwrurbwggguubwuuwrbbwrgggggugurgggbbwbbwgwuu -wwgubrruggbgrwbggwbrubwggbwuuuwbbrwgbgbbbrbwruwwwwurw -wuurrggguwwbgbgubugrbwgwgggrwbwgbubuwwbbrwbuurwgwguwgurwur -rgrggggggbwrrbgggguurbbbubugbururrgrrrbbgwugbwrbgubb -rbburbururrbrurrwgrwrruwubwbgrrurgrubuwwur -bgguburbbruwugrurubbubgbggwgbgrrgwgwbguguwgubrrgwrbrwur -rrrwrbgwwrubwuwurgrrwbruwuwbgwbuguurgbrbrgwur -rrgbbgrurgrgrbrwggbubbbubbwgbuuwwugbrwgwrgwbru -bwggrguguburbbrwurrbgrgbgwwrwrrrwuwgwgbggwrggubwbgubbwurbb -gbwuwwgggrgwbbrrbuuruwubwrubgubwwbgwbgrbgurbg -bbwgrbbgwurwbrgbggwbwgwurburbburgugurbbbwbbbggrbu -urwgrwgguuuwruuwrbuggggwurbrbgwrbwbggwur -wbgrurwuwgugbuwgrwrwbbgrbbburwggugugrrgbrbbwrbbrruuwgwur -ubbuggwrwrgggrugwuwwuwrgruwwbrwruuugwgrrurgurrrbbugbr -uuugrwugwuuwurgwbrgwgugrrwbrrwrbuururubguuwrbwugrbbrgwur -ubrwgrruuugwgbrgbgwgugrbwwurgbwrbgwuubbuwrbgwwwwur -gguubbgggggwwwwrrrbwwubggwuggubguuuubwwugrrrgguwrbwrwwrwur -bgwuuuggwgbbbgwugwuuuwububgurgbwbbwbuwrbuwgrgg -buwwrrurugrgbgbubuwbgwgurbrrguwuwwurwwgrurrwrbwggrrbrrgrg -urggwurbbubbrubrggwgbbwbuubgggbggrwbwrrwburubg -rbuurgbbrrgbuwwrwgurrbgbrurwgbbrrbgbwbgbbwwuwwb -ugbggurgguuurggguuubgurrgurbuwrrgbgwwgbwwbwwrgbggrwwrbrbrb -wbwbubbrwubwggwuugrgubbuguwgurruugrrbwbbuwbgb -ubuggruwrwgwbubuuuubuwwgwrbuurbuwgwgruwgrgrurwrrrwgwbuwg -bwuuwubuwrwbwbubwgbwwwbwubgugugrugwrrrwgwbgw -ruwurrbgbuwrwrbwrbguwbgrbrrubugbubbwugrrbgubggbrugw -wggrwwgwurbgggbgubgrwggwbwbrbggwwbrrurwbbguwurgb -bwbgbbuwwruggbgrrrbbwbgrbbuwuuuugbwgggwwwgbwbbbwubwu -wrrbgbbbguwgrwrrrgbbugrruuuwbgwgbgwurbbuwrugg -bggrbrgwgrurwgubgwwwwuwbbuururugwwrbrgrbubwwur -ubbwwrwrwurwgbwrwwggwgggburbgggbuwrwbbwrubrubgugbrwwuw -rbguwwbrgrrbbwuuwwgurbwbrwbbbuuubrwrggwwubbgrrwgrrwuwu -wurrurgbwbgbwbrrubbrggbwgbwrwbuubgrbuwuwrbgrgrbw -rrbgbrurwrwugbgwwrggbrgbwugurwrbwwrubugubwru -guwbrgbuuurrguurgugwgwwrwwbrgbgwwwgbbgguwwwur -gggbrwguwguwgwurrgurruuuubrruggwrgbubugurrbububgrw -ggrburwwubbwwrwgbgggurrbgggwgrrbrbbbbwugbwrbrwubur -bbbgrugwwgwggbruwrgwwbgrbbuubuguwbggwwugbuugwbwrubgguuwwg -guwgwbggruuwgrwgrbwgrrwurwgbgwwurgubrubgbuubrwwwuw -rguwrbbrbubuguurbgwburguwbwbwgwggbgwgwwuwubrwruu -uguggubuwrwrugrwwuuuguguwwrwrbgwbwbwwggurbbggbrbguwwgubwwur -bggwbuuwurgbwbrbwbbrrgwwgugrrugubbrbggbrrwug -bwrruwuguwwgbwwrrbbgrrrrrrgugbwwrrgbuuwuwrwr -bgwbugbuwwrwwrwburwwgbgbwubrbrwgbugrruuugbbbrgurbwub -ruguuwgbrrguuuwbbwwbgbgrbwgwgbwbwwrbruubrw -rguwwwggbrwbruuwwbubbbbgbbwgrwgwggggrggwbgg -ruwrugwwbuwbwwwbrwbggwburrwwururguruuguguwgrbu -bgugbrbgggbbwugwbwuurbubruwwbrbbbgrgwrgrgggrbwrg -wbrgrgbrwbwbrwuuwbrbbwrwrrwbgwggubrbrbwrrgrbuwwr -grwuwgugrwbgrgwwbwwbggwgrwrgubgrrruuburrurwwrwbrrggwgwwbgwur -ubwbwbrrbgrgwuuwgwubgggrgurwuwbrwggurrgrgurrwubrubbw -rbrgwuwggbbubruruuuubbggwrgurrwrwwuwrgguurr -urgurgubgrgubwgugwrbuugrwrgwbgwwwwubrwwbguggrrrrrb -grrurbuubrwguguurrbrguwrrggwwwgburgrrrwbgwwbbrwrwrwgwub -uruwwwbgbbbbggbbbbuwwgubburwwuugburguurwur -gwurgwwwrgrurgbbrrrwrbggbgrwgbrgugruruuwwgrgwwwwrwuwubugbu -rugguwwgwrruurwbgwuguuruuuwbgbgubbubrrrbgwbwwwwbbbb -wbbwgwrgbwwburuurgrugbwggrwbgrgubbrbwurggbggbwwwrgggbr -ugrrurbugbwwrguugwugggrrugwgururwbbubgbrwrwur -rugbrrbwbbrrwbrgwuwbgugggruuubburgbrbububrrbubwuurub -wgurrbuugubgwwbruubrrwbwwubbgrububguwgbrrwwuwuwuuw -ubrruwbuguurgbbrrrwuggbggwbrrgwgubgwbruugwuuurgubrbwugwwb -wuwrrbuwuwbburgwurwggwugggbgrwrwgburgurgbg -uwwburubuwrrubbuwgwbugwrwbgugwgbbggwbugbwuwwbruggwur -bgrubrbwruwuuuwwrgrwubrggbbgbuubbgugubrrburbgu -bgrgrgbugrurwburwbbrruwrwbburwbwbggguwburrrwuggurbbrbgrbu -bguwuggrguwbrgruuuguwwgrbgrwbuugwrbrbgburwbwwbwrb -wggbwwbwwwbbggggurbbwuubgrbrgbbrrwuuwburrugwwubgru -rbgburuuggwwwguwwrbrggbrwuwgbrgbrwwbgrugwuubguwbu -gbrbuububuububrbgrgwurbbwbuugwbrwrururgugwgbwwgggbbgbwurgwur -ruurwgwggwbbwrbgrrurguwgwwrurgrgggrgguubgguwuwrw -uwbubgwguuubbbgbrrgwwrbbrururwgurrgbbrbgubwwgbgwuguuwurub -wrwrugugguwbuwwwwgrwrbgrbwuwburbbwwgubugwuguwuwwur -urbrbwwuggwurgwbrrbgrbwrbugbugbbbwuuguwrrwurrwur -rbrbubrrruggbrrwrwbruwburrwuwgwrrwgubbgguug -gubrurwwgwwuwbrrgurggrgbwwrrgbbruurgbuubrwgr -bbrwuugubuugwwwwgbrgubbbrgbrrguwrggrurrwgbrggbugbbwwbwrrgu -uugbbwwwgwgurgggrugubgbrwwrwrwrrurugrwwur -guwgwbwgrbwbrrwrbugbbwuugwbbwgwwbrwrwubbbrb -bbbrurugrugbwuguuwwrgbrbwbwwuwwbrwbrwurgbgbggrgruuuru -ubuubgbgbuwugugurbbwuubrrgbwwubuggwbururggrrrgr -ubgwwbgurbruggwwrubwggubbuubggbggbwwwwwwgubwgu -gburuwbbrrrbwwbgbugugguugbbbwbubbguwrbrgbbgwgburrugr -gbgwbgruwrgwrrurwuugrwugruwrgubwbrrbugubugugbbwu -burbubrgbwgrwwrwbbrbuururggwbwubugrwruruuwbuuggrwbgb -bbbwgubrburwbubwwbruubguugrgwrgguuruubbwbb -guwggggrgrrugrbbrwururugbbrwrurwgbwgrrrguwwrrbbbwuwuug -bgwrrrgwruwrbbuwgbrugruugwrrrugwwuubbugubbubgggubrrrwwg -bbgbrwrwrbwbbrgwwgbugugugrrbwbbbbrbgguwrbugrbwgwrbru -rrbwwggrgwurbuwbwbggbrrbggurugwgubgggbrrbwwrugrwgurbugur -ggburugbwruugbburgrbugrgrwbbwbruubgubgbgubugubbbgrrbrgrg -rwuwrgbwgwubwubrrbgbrrbwrrwgugwgguubbrbbwguwwwwur -wuwwgbbbwrgwrrbrrgwbwwubbwrwrrrwwuuburuubwbuubuwwbbgg -wbbgwrgbrbubwggbuwwuwwggrugwwrugrgwuubbwuugrggbbrgubwrrgu -burrbwgrgbrgrruugwbwruugwbbbburwbbuwgrwuguwrbgwur -bbwbwuwwwbwbrgwwwrrwggbwgruurrbrgwggbrbbbrrbgbbgrrrwrugg -wwwbbgwgbwwrbugurgugrrggbuguugrbbgwrguugggbwwugrugu -gurbrggwrwugwgrggrbrgwugbrbuugrwurrwgrbwurwuuruwuggwruwr -guuwgguwwubrbwwguubugurbwbrrwwwbbwgggrwururgg -wubuuuurbuwbrrrurbggbgrwbbwrbuwwbwwbrbrggrwgggwwwur -wgwrwugbrwgubguguuugwbubuwbbrwgbbgrgubrruuuuuuu -wbrgwggwruuwruwwrbruubuwgwwwbuuugbwububbgwbgwbgbg -wwwwgwwwugrwgrgrgwbbuwgbgruwugrrwuugbrbrurrrguubwwur -bgbubwrwwrgrwrbuwgurrguwbruuwgguwrurwrurrwgugggbwrbwwggw -rwwurgwuwgbbwggwwuurbwbbwrwrbwbrwrgbrbbrwbr -wrugbbrgbbugrrwbrwgwuggrbrwwwgbgbbuuurwuwubbggubbg -grrwurgburgruuurgrbuurgwgwurubgbbubbubuwwwbwbuuubbbrrwur -uguuguurrwbbwgwrwgruubgguubgwggbburbuwwgbrwruururwbgrgrrgu -gugbrwwwbguggrubbuwbbbwggbgurruruwubrwggruurwbggrrruurwbb -grgrbwuurwwwuwuwwwgbuubwbuuruwwwgguubwbruggbrgub -gwruurrugubbwbbwrggrgurbwuugbgbgbubbugbgugbwbwuu -wuubwrgrruwwrurwgwwurbugrgbrbuggbuwwbwrrrbrwr -urwbwrrbbgbbwwuwbwubrbruwgubruuuguguwubguwugurubr -rrwbbrwrbbuwbwrwwwrrguwrbgrwbubwuurugurgbwrru -wwrbgbubrrruubrggbrrgugbwuwgrbgbburbbgwur -gwuwggbbrbgbbgubgbwburbguuggugrrwrbubruuurggwrw -rurruwgrrrurwwwbbuuuwbrbrbrugrgwgrrrwbbgrgwguguubg -bwgwrwggwggrwbwbbrbbbrgrwbbuubrugbwbrbwggbwb -bwwwbugwbgubgrruwrbubggwurwwuuggbrugrrururggrbwbbggbrwgug -uugwuuggrrbgugbwuubwwugwruubbbrrwbwgbbruuggggwuurgrw -bwrururgwugwrwuwbbrgwgugrurwgrwbwwwwrbgwur -ugrrrurbggwwugubwrggwgrggrrbuggrurbbbrrugwurubbbguruwbuwb -uwbgubgrrwrbgrgurubgrurrrguwbbuurbuwbgwbgruwrggwur -rwurbubbwububgbbubbugubrbbuuwwwuuuruwwrwruwwbwbwwgwbrggbg -bwgrguuruwwbwrbubwrbbbbuburwwugwbwurggwguurguguurww -wwruuguwbgurrgwrubbbwurgubguuuwrwgwugwgrrwwwrgurrurrbgrbrwur -grurwwuwwububrrggbwrgrgbuggrwrbruubwbggggrbbwrwbwwrugr -brbuguuwuubuuwurrrburrgbbuwgwbwwwrrgwrwwuwuwbguurbrr -wgrbuurrbubrrgbgbbbbbrrwrurrwgbgwbrrrwrbubruubuubwrbbbwwur -wruuuggbrburwrbbwrwbwrbwrbrurbbgggggguuwgbbgrguggwruuuww -bgubgggbruwwrggrwubbbgbrbbrwrgbruugwruggguwwur -bbgrbgruburguuwwruubrbbbwwrrrgugbgururgbgwggrbwrwur -ubwubwwubbuurwuuruwrgwwwwwbbwgwrggbwrwbbubwgubbuwru -bbuguuwuuwururbgubrruruguwwwugwruwbwgwrwbgwur -wuwrugbugwbubwwwrrugbbrruwgwgruuugbgrurbwwrwg -ubgwwwwgrbbrrgwwwbugrubwwwrurbbgbbwrbbgubwbruurbuurwr -gguggugrbwrwuubgrurbgbgrgugbgrurbuwguburbuwbrwbrwgubgu -uubgrwbgwuurrwwuubwburbruwgrrrgubuwwwwrgwu -wwrbwwwgubgubrguugrwbubwgrbuuurrgrwruwbgubwuuwuwggwububrgwur -brgrgwbgrbbbgwgbugwwubgruruubgguuwrwuwwrwbbbgbururw -rrgwguwuuubrurwwwrrugbwugrubrrwurrbrrrbggrb -ugwgwbbbrggbwugbrrbruuubrggwugruguugugwbggwrgrw -wurbrrgbbwwrwgwwgugwwbbbgbwwbrwbbggrgbggbwru -ubwwwrurbubbwbggbbwrwbrrwgwwubguggwwggbggwur -bgwgwwuurwgbbrugrgrgubrguwwrugwwwgrbuuwbrbwbrwgwwwbwurwg -wrrbubuuguruwrbggbugbgwwruuwgbwubwbruwgbwwwwrguwbwwur -urrrrbugwrwrurgubrwubbrrwbrgwuururbuwrgrggugrw -gggubrggugbbbwbwgrgwwruwwwbuwbuwgggbbbgwubuguuurwbgu -uruuruugbrggruwbuguwbggbrgwbbburuwbwwuwrgbw -bwwuwgrggrgrurwwbbbbgwwuwbwwrwwbggrrguugbgruuuubwuwugu -gwbububrubrgwubrbwrwgwubrgrwrwbrrubggwbgbuuwrwubrwwwrggg -wbggbrrbrggbuwwwbrurbbgrbuuuwrrbuguruwurwgr -brubbuwubbbwgbgrwuggbgggbrbbguuwuuwrgubbrugbbbgugrrwur -gruuubwuggbbggugrbbgbwrwgwwgwgwuwwbruuugbugrrru -wwbwwuwrguubrwugrbrgggbwuwwgbrbwguurbrbwguuwwrbgwwubwwuwbu -grrbgrwwwugbwbguwgrgrrbubgwrwwgrggwuwuwrgggbugrbugg -wuuwgbggburgggrgubbrugbgrbruubruwguuggwwuwbgggwuwwgu -wurubwgrgurrgbgrgbbwbgggwwuwbbgbrruugggruguggbwruwru -gbrugrbuwrgwrrurrrurrwuwgwgbbgwrwgugwbwrbbwrrbrrub -ugbwrugbruwwurwwrwgbuwrgrrgwrugbruggrrbwbuwbburwur -guuuwuwbuurggburbbuugwgwrgguugrguguubbbbuug -rrgubrbbwuggurbrrgrbbbwwwrgrrbgwgubruwguruurwgwgbwgbrwur -wuggruwburuwbubuwuwbwwrrwrbwgwwubuwrugbggwgbwbuuwg -wwrrbwgubbrrwuwbggrwwrbubbuggwrrwwrrgugurguurwrrwbbwgbw -grggruubbgubugwgugbwgbuuwugrwwrrwrggwurwuguuurgrwuwrbwrwwr -wrguwwubrgrgbuuurggwubbwgwubgbgrrburbgwururbbgwrburr -gwbgguuwwgrbbbrwbuwgrrgwubwgurbwrruwrggbugrwwwur -wrbrwrgrurrugwuggbbrrurburubwrrbuugubrrrrbugwrrwgbuwrgbbr -rbuggurgwgwwuuwuuwubbbrguugbubrurwrrwuuwugubwugrugbrrwur -brgwburbwbrbrwgwruwwggbbgrwrbguguugugubgrgwgwwr -wrbbbrwgwbrgggrrwbwgbbwbrggrwrburrbgbgrbbuugwg -uggbwubwrwwbrgrwwruuwwrggbwrbuwurwgurgbuguwuugbwbg -brgwbgbuggbbgrguggbwggrgrwrubururuwubrgwwbbgwrwugwugwr -buruuuuwgugwbgbrwrbururbrurwwbburuurbwuuugbbbwwuwrugugbrg -rrgrrrgwggguuwugrwwguubbbuggrwrbruuuguwgwg -ugbgruuwruwbwbgrgggbwugbwbbwurugwgwuurbuwrg -bwuwugbbubggwwrwubuubwgrrbrrbugrurubrrguwrbr -rguwwugwruwrgbwwgbgugrwubrwrbbwwrbggubugubwgwrbrwuuubu -wgbwggggrgrgrbgurwbuugwuwwrbwbbbugruwgubwwgrrgwur -ugrgwgguuuwbrgrgrugbruwrbbbrguwuurgurgugurrgbubuwgubuwbwu -ggwwwbgwgwguwrrruwuubwgbrubgruuurrrubuurrrgbguurw -grwrwuubrwwurbwgbggwrwuuruwguuurrgbwguwubwbuurgwbgugwuwbwr -bbwuuwrrwgrrbgrgbruurguuubuwrwguwuwbbggwrubbug -rrbbruwbbrbbrbbbwbubbgwurrbubrrbrrubbwugubr -burrubrururbguwwgrubwwbgwugrrwgbbgwgrwbubgurgug -wuwubwwburgugwwbgwurbbwwgrwguguwwbgwggubgbwbbrgrurrbbr -buruwbrugwrwbrgruurbrwbbrggbwgugwbuwgrgbwwwruugrggrg -wrgurwwgwwrbrubuwrbrruurrbbgggwuwgugwwurbwgurgwbbbrwr -buubbgbrrbwgwwwbgwrubwrugruurgggwrbugubrgwrrgbu -bwrbbuguugbgurbruwgbbruuwubwbggbrbrbugggubbbwwwbbguggwwgrg -burggrbrgwrwbwwbrbuwuguwwwwbrbbrbrbbwwur -uwbrggwrbwuruubggbwuurubrrbwubrwwgugwruwgugguu -grbgggbwbbwwuwbrggrurwwgbrruwgbwgbruwwruwubrruwwbbwuuw -wbrrgrrguwbuuugbrrrgggurbrwbwwgwrwbrurwggubbuwuwgwgwbbbbb -brbgubgrwrbbuwwwbwrguwwwuggurrubrugruwrguuwwubgru -rrbbrguwrrugwuubrwgwwrubrubuwbuwbrgwbrwuruuguwuuwrgrgur -rgwrbggrbwuwwwggrggrgrwwgwgrbbgrubuwugbrrwrbgwb -wwwugwuggbgwwrrbuwwrrwuuguggbgbwwrrbggwrbwwguur -ugugbrwrgwbrrrbbrwrrrbuugubrwgwrrgugwbwgbguuwwwruguwgrwg -gwgrbgguuurbwbwbwuuguubgbrgrrguwrbubgwwrug -gubwwbrwrruwbwwrwwwbrgwbugrrbuwubruuwbrwbbwubrw -uggwgbwrguwwubbugbgrwurgubggugwwwwbwuburwgub -uwrrgwrrrwrwbgwruuugbwbgwggwrrrwwgurrrrrgurwwwgruruwgw -urrubgggbbwgbbrbrbwrrwgrwwgrggwbbbrrurgrrurgubwbwu -grurubrburbbwwuuwrubbbbwrwbbwrgwrbggwgguwuuwwur -bwbbwbrgrbwrwbbwugrugurruruububburwuwgugguwrwur -rbrrbgubwbgwuwuuwwwrubgggwwuuugggubbrrbbggwrwb -gbwrugrgubwbrwwurbbgwgrrbuubrrubuwubguuuwgu -bggbwuuubgwrgwuwbbuguwrburrrurbbubrgwrwrwgrg -wgurrrrbbggwbbruwbwbrbguuubwwrbuurbrurrurwur -gwbgbgwbruuruwuurrrrurrwbgrbbwguwgbgrwgrrwuwwwgbbrr -rubburrrwggbwuwrbggrubrgurgwbgwbwurgbgwrbgwg -uubuwbubrggrwwwuurgburbuguuugrbguuwugubwbgwrgrggu -uwurgbguubbuuwrubbgubggurrgrrbbrrrwwugwruwr -uwwgwugguugrugbubbrwwgubwubbwrwguwbwguwggrgugrwguggubrwb -bgrbggwgbbgrggwwrbbubwwugbwgrurrurbuuurbrbburbruur -rubwrbrrwwgwuwbbbubrguggwwbuwrrguwbwrgggwburbwuurwb -rrgbbwwwbwbubwbwrugbugguwbuwrubuwrubbgwbgwgwrbgurrurruu -gbuwwwwgrguwgwbgrugrrwbwuuguubgrbbugbbgrgbrgbb -rwrwbgruwbrbgbrbgwwrbwubbwwuwbrbbbburuwrugggr -buubbrbubwwuggurrwwuguuuwbrbwbrgggrubwbbrgbwurugrwgrrwwgb -rrgbuwbwuuwwwbwuugrurggwbrbwwuruwwwuruwur -grrbrwwbguwbbggguuwwugugrugrgwwwbrgrgbguggwrr -rbgrwugbgggbubugwrburgggrbwbrruuuubrrrguugruwwrbgrbwg -urgrbrrrgwuwwgguwuwuuubwwrugwrgbwrbuwuwbgwbwurwwwrgbrrggb -rgrwwwwwugbgugbugrgbuwrgwrwgburuwrrgrbwbuubwguwwwugbrg -wbbbggwwuuwwgwwuguuuwuwwugrwwwubgugurrrugubwgw -brbuwwwgwgurwgbwrrbrgruguwgbrbwububbrgrbuwrugrwwur -uubuuggbguurwbrwgrburbbbwburubgurguugbbruruur -grrrwbuwuwruwgbwwwgbbgwbbguwbwurrugwwbuwbuuurrurwur -ruruwrwuuwbrgbugwwgwgbrbwwrrrwrbrburrgruwrwwbbbugubwwgrbww -bgwruugguuwuurbubgwgrgruwbuwwwwguwwwrbgrwrurwbggrguw -wuwwwwuuburggurgwrgruuwggbguurwbggrwbuugrwbggurbgrgb -rugwbbuwrgruubgggwuwwrggbgwwbuubrguwugbburrbgrrbwrru -gubgwgwuubwuubrbrbbwwbwrbguruuurgrgrggurbuguwbgr -ubbwgruubgbuwuurrguwrbuwwgubbrgwrruggurbuguwrbrbbwgur -wgggurbbwuubrbwrgwuurrbwgwburrwrbuuwbwurwur -gwgbwwrubwugbrgrwbgwbgruwugbwubbbbbwubbubg -ugubrbguubwgbgwugbwgwrrgruugbbbbruwugwrurugrgrwwrbw -urgurgubwuugbgbgurbbrrgggggwuwgrwbwgbubwuruuwbub -rrrruwwgwgubwbubbggrbruuururugbwwgwwugwgggwguggg -uggbbuubrurwubuuwrurrbwwuuwubrbgwrbrrrrwbrbgwggwuruur -rbbbwbgrurugbbwguurrugubrbgbgggrbuguwrgwwbgrrw -wrgwrugruwbgrwbgbbguwgubwwbugubrgbrgwgburguubbbbuwrwwur -rwbuurbrbgrgrgbgbbbrgbrrgggrbbrgrruuubrguubbrgrwwwwuwrubgr -bubwrwwbrruwrbuuugggrrrruuwrbwwbggwrwbuuguwwbgurgbu -uwwrwwgbbwrugruuuuruuwuwgrwbwrbgubwwrbbwgbgbgwg -buuwrguuuurguwbrbrrwguubrrubgggwwrbbwgbgrr -uuwwgwuwgbgwruwuuubrrbwuwrrurrwbgwbuwbwurwur -ubgurwwbwgwruurwwubrwuwrbugggruurwugurruwguwgbrgrugr -uguuguwubgrgbrbgbwgwuwwwubbwrgrbuguuugrwur -rrwbrrrbuwwgwgrggwrwbrrubwrbrrbbwubrrwwur -ubugrwwbbrgugburbgrrwwwuugbwrugbgurgrwrgubur -bgwbgguwrgwruwgwwrwrugurrugbrggubwbbgwwwwrbwwrugggbrwggrrw -wurrguggggwgbuwwguwbbbbgwburwwbrrwrrgwur -gbrwwgrguuwwrrgugubwbgwuuugwgrwbbwrwbgurugruurwuuubrwur -rrrwugwrrwwruwbggwrruuwgrbuwbbgbbggruwwbgruwggburwg -brbwwggbgwwbgruwubbbbggwwubrgubbuwububuwurwbbwwbwu -gbbggrbwwuuwuugrwuugwbrurrruububggwrwggrgurwwur -rgbwwrruugbgruruwuburgrwrwbbuwgrggguugugurwggwggrgugggrg -brbbwrruuubuwurrrwburbrbwgwurrbrgbrwrbgguruuwuuurbgbbg -gwbrwbguugbbwrgrgrbgbruwgwruwbrwugrrgbwwgb -wuurgwugrugguwwwbwwubwuubgwubuuubrwuuububrugwbgggrruggrrr -rggbuwwggruugruwugggrgrbwbwrggrgugwubrrgrwgwrwuru -uguguwwwgugrgbrwgbubwwuurbgguwubrrugrruruwrgrwwubgwg -gbbbrwurrubrugwrgwrbugwggugrwuubuwbgrurbuwbgbbbgw -wrgwuwbwrbbrgrbwbrbuggbuwbrgurwggwbbgrwwuwbbgwrrrgrubbb -bbubbrgwrgbbbrgguurggrurwuwubgwuwubburbgwrgw -urggrwbgbggrwbwburbbubggbrgbgwbrururrgwgbbuwbu -urggbbbrbubbwubbbbrbgubrwrrwbuwbbbbrguwrubbuwuwgg -ugugbubbugggwwbbruggwwrugbrurguugbrwbgwuuwbbwuguggb -wrbwrrbgrurbuwwrwwwrrrbrbuuwbuwbggwgggwuuwwuwbrwwrwbrrrrrwur -ggubgbruuuwbgrubwbbubgruwwwuurbrwbgwrrwbrbrgu -bwbbrgwgburwwbgrrwgbururwrwggguwgbwwbgwuuggwuggrbg -ugwwgugbuwruuggugggwrbuguuugggwbrwrbubguuuubwbwgwg -buugrgrruurbbrbgguubgbgbbuuuwuwgwbrrgwur -gwbbguuwwbburguugubrwgwwwubbubrgwruurwwruruwu -guuwbugrurwbbugrbrwuwbgwbrgruruwugwwbrrgrwgrwrugggbwwur -grurbgrrubwwwbwrrurwbwbgurwuwgwruwwwurwrwwrrugw -bwgbuwurrugwwrurbrurwgwubrrrrbuwwbruuggwbrubbrgur -ugwuwgrubrrgbbrwwgwggbwubgrbrbwwbgwbgrbuwuwwrrwg -ubbuwubugwwrgwrrwwubguurgbgwrbubwwbrwrwbbburuuruuurbuubu -wrbrgwubgrruuwbgguwbubwbbggrbgwbwrgwwrrgrgrbgbugubwg -wrugubgwbruwgrgrbgrugggwwwrwrwuwbururgrwrggwwrubuwbbbggbu -wugubugbbrrwwwrguburwrguwrugubwgugrbbguwrgwwwbgggubrrwgbgwur -rwrbgwguwurbrrbbbrrwrugrbggggwruubwruwbgbwrrrwbg -brrgrrugggggwgurgububrgbuuwgubugbgbgbuggwbburbgugugbw -gbbugurwwrbrbwbwwgbbrrruuwbubwwwgrbubuwgrw -wgubburbrubrwwugugwrburrbgurbgbruuurwgubgwb -ubwubwbgwrgwwuwbugbrwgbgrwgrwuwbrbububguguwrgwrwwwur -uwgwrwguwrbrgguwbgubrbwrurrwubbwbggbwbbbwburrruwbruugu -bwbwwbrwwwuwrrbugrgrrbwwgrugurwuubwbwgguwgbwwgwuwrbrb -wurrwgubuuwrrbbbuggwbwugrbgwwbrurwwuwwuruur -wgggrgrurbbbrbuurubgububwuwrgbbuuugbwwwbgurbruwbugubr -rurrubrwrwubrgurbbbgwrrbubwggbwwbbwgguugwrwwubuw -wwuggububbrrbbwrbwrwburwbrgwwgwugguwgrbwuwbuurrwwugbwr -ggrwbrwrbwwbwwwbgbgbbgwurrbwwbgubwbgrgubugr -rbbbbgrggurwuguurugugrruugwrwgrwgrbwbbwgrbrurggr -wrubwggwbuwrbggwbuwggwbwgwrruguwrbubrggbrwur -gwgbwrwugbwuwubwwwgrbrrbwubbwbwrubbbrwuuuwuw -bgwgubbuuugurwrbubrurburggwbrguwbggbgbbbbg -gwurgbbburbrrubgwwruwrwugbwwwwruuggwgguwuuuwuuurubgru -bgrwbuugwwrgggrggwrgrbbggrgbwrrwubwububurrrbgwggg -bbwuwrurwgbrrurguggrgwgggwuurbrrrurguwurrwgwruwbbgb -guwugbwrwwbgrrrugwuwurubwbwurgbwubwubbrwgwugb -uwrurbgwubuwruuggburburggwguwwbwgggwgbrgrwwrrrgww -ggwwbgrbuwrruurugggwrbwwgrgrwburgrwwwwrwbrbrrwrgurggrgwur -wurbwgrugbwugrbugbrrwugruwrgubuuwuwgrgbwgggb -wwuubuuuwrguuwwugbuwuububwubbguubgbubgrrbugbrgrwrbwrb -wwbrbwgbggbuubrwwgrguubbrbbwbbuwurbggubrrrrw -ggrugurgbwggwwwrwwbbgbuubuuubbwrurbubwbgbrwur -wgbrwgurwwgbbwwurugwgwugrggwurgrgbbbbrrbrbrgwuur -urwrbrgrwgwuurgubugbburugbgbguwbubgbwugbuubu -bwgwwuugrrrgrbwbggwuuwwurugbwbwgubgbwrubwgrw -brurrbbgubrrrurwwwwbubbgwgwgrugubbggwbggwubuuug -uwbwgrubgbbgrrrrubrgrgrbrbgurrbrgwrrbwgrwrgrgwgrrubbuuwu -wgbbrwurubuuwgruwgubrwwwubgbggrburruggbbrrwwruwwwwur -uwurruwrugbgbwrrbgwrwuwwuubruwrubrwwbwrwgggwugbrrrrwur -bbuggwgbbruurubuuwgbbwbrbrrbggggrrbuubrububbubugu -brbguwururwguwbrgrrwbbbwbgrgbgwgwgwgrrggrwrbbrburrur -gwbbrrwwrggwrrgwwrwwwurrggbuugubbrwbbggwur -rgguburbuggbbbrgurrwrwrggbrgrbuwbrgwwbwrurbugbbbu -buwuwwbuwugrrgrwuugbrgwurwwgguwgbggrrurbwgrurrwur -uugubgwggruuuggwgrbuwbrbuuwbgugwbuugwbgbgwuuuwgruwu -rwwubbrgwbuwbbguugwgbwburrwubruubbuwwwwwgbbbbruwuuurwur -rrrrwwguwgrurbubgbrgbrurwwgubwuuwuwbbwruwwur -bbubuubgbwgbruwugggurrwguggbwbbbbbgrbwggubwgwubgbwrwur -bubgwubbwrrbbwgurwrubrrubgurwwgrubbbugrgub -rbwgrbubbubwwrbgbgbwgrbubguurwwgguwgubbrrbubwr -guugbrgwbubububrbrwurrgwurbwrggbgbrbwwrbbuggugwgubrwrwbbbb -grrbguguwwwuwurruubggguububgwurbubrrurwrwguggbrwrwgugb -rgbgbugubuwrbbrwwuwubbububgwbugwurruwrbrgwg -bwbwgubgwbwwurrubgbrgurugugwwrwrrbwwbbwggrb -uuwwrgrurgbwgruuuubbugrrwbwgrbggwbubwbwbwgwuubugbrwur -bbwrbrwrrrrwwbbguwrbruwgbbrwurwrwuugbwgugurwwugrrurgugubu -urgwrrgrgggrguggbgrbggwuuburbwrwgwgrgbwrgg -ruuuwrwubrwwuguurrwgbrbbgggrrrgrbuwuuwwrrguu -grwwrrrrggbuwurwbugugugrrwwuwwgggrbrwwrbwuwbwgw -rrwbbruwuwwwuggwrwbrgwwgggrbrrgwrbgbwbbrwrbubgrrggwrwgrg -uwwwbwwuurrguuwwubwrbbuubbwwgrbwwbbwwwurwbuuwrwrwggwur -grrgwbgubwrbubrwubguburrggbbugwwwwruuwwuggbg -grbwwuwubbgggwbbuggrgwburwwrruruugrgwwwgwwwrgrbuwbrgb -ggrggrrgbgggrrgrbrurwgbgrrwbgruwwbbggbgwwbubwrggwgr -wgrubwrwbbrgbwuurwbwwuubwgbuubbwrugugurbgwrbwrbuwgguurww -rbwbwbgwuubrrrgrrubbbbburbbwuwwubbbguubgwwwur -buuuwrwwbuuguurwwbuwwgrgrgrrrugwrggbggwbgubw -wwuwwwwbrrwbwgwuuwwwgwguwgwubuwwgwuggrbwbrr -gbbgbwbbrbrgwrwburbrbwrburrgwwuguruubrgubgrgrwugb -urbgbwwrrwguurugruurbuwbruwrguuburguwwuuruwbggbwuwggb -bwrwwuurugugggwuuwrbrgbuugbuwbuubrgrrrrbwgbgwgbu -ubwrugrgrwruwggbwruuggbubwguguubwrrbggbgwggrww -uwbubuuwbgbuwbguwuwwgbggugwwubrbubgbuwrrbuwbuwrwbubgbrgru -bbruurgrwuwbrgruruwwuwbwuugwurbbrwgugrrrurbubgrgw -wbgwwrrwgwrugwurgbggbgwwgbwrbrbwwrrwugwrwbuuugguww diff --git a/2024/go/go.mod b/2024/go/go.mod index 14e4a5c..42db796 100644 --- a/2024/go/go.mod +++ b/2024/go/go.mod @@ -13,6 +13,6 @@ require github.com/spf13/pflag v1.0.5 // indirect require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/stretchr/testify v1.10.0 // indirect + github.com/stretchr/testify v1.10.0 // direct gopkg.in/yaml.v3 v3.0.1 // indirect ) From 6ab021face2f996e3a89828a56f5774dd7b63aab Mon Sep 17 00:00:00 2001 From: Alan R Evans Date: Tue, 14 Jan 2025 12:14:43 +0000 Subject: [PATCH 11/11] move to alan branch --- 2024/go/day20/day20.go | 128 ++++++++++++++++++++++++++++++++ 2024/go/day20/day20_test.go | 31 ++++++++ 2024/go/day20/input.txt | 141 ++++++++++++++++++++++++++++++++++++ 2024/go/main.go | 2 +- 4 files changed, 301 insertions(+), 1 deletion(-) create mode 100644 2024/go/day20/day20.go create mode 100644 2024/go/day20/day20_test.go create mode 100644 2024/go/day20/input.txt diff --git a/2024/go/day20/day20.go b/2024/go/day20/day20.go new file mode 100644 index 0000000..d3a2c94 --- /dev/null +++ b/2024/go/day20/day20.go @@ -0,0 +1,128 @@ +package day20 + +import ( + "adventofcode2024/utils/dijkstra" + "adventofcode2024/utils/grid2d" + "adventofcode2024/utils/inputs" + "fmt" +) + +type ( + Vec struct{ x, y int } + Dir struct{ x, y int } + Cell rune + Move struct { + p Vec + d Dir + } + Maze struct { + height, width int + start Vec + end Vec + grid *grid2d.Grid[Cell] + } +) + +const ( + WALL Cell = '#' + CORRIDOR Cell = '.' + START Cell = 'S' + END Cell = 'E' + PATH Cell = '*' +) + +var ( + NORTH = Dir{0, -1} + EAST = Dir{1, 0} + SOUTH = Dir{0, 1} + WEST = Dir{-1, 0} + DIRECTIONS = []Dir{NORTH, EAST, SOUTH, WEST} +) + +func Part1(input string) int { + maze := Maze{}.Parse(input) + fmt.Println(maze) + data := inputGraph(*maze) + graph := dijkstra.CreateGraph(data) + path, dist := dijkstra.GetShortestPath(data.From, data.To, graph) + for _, p := range path { + maze.grid.Set(p.X, p.Y, PATH) + } + fmt.Println(maze) + return dist +} +func Part2(input string) int { + maze := Maze{}.Parse(input) + fmt.Println(maze) + data := inputGraph(*maze) + graph := dijkstra.CreateGraph(data) + _, count := dijkstra.GetShortestPath(data.From, data.To, graph) + return count +} + +func inputGraph(maze Maze) dijkstra.InputGraph { + data := dijkstra.InputGraph{} + data.From = dijkstra.Point{X: maze.start.x, Y: maze.start.y} + data.To = dijkstra.Point{X: maze.end.x, Y: maze.end.y} + for y := 0; y < maze.height; y++ { + for x := 0; x < maze.width; x++ { + if maze.grid.Get(x, y) == WALL { + continue + } + for _, dir := range DIRECTIONS { + nx, ny := x+dir.x, y+dir.y + if nx < 0 || ny < 0 || nx >= maze.width || ny >= maze.height { + continue + } + if maze.grid.Get(nx, ny) == WALL { + continue + } + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: x, Y: y}, + Destination: dijkstra.Point{X: nx, Y: ny}, + Weight: 1, + }) + } + } + } + + return data +} + +func (m Maze) Parse(input string) *Maze { + m.grid = inputs.ToGrid2D(input, "\n", "", '?', func(c string) Cell { return Cell(c[0]) }) + m.height, m.width = m.grid.SizeY(), m.grid.SizeX() + for y := 0; y < m.height; y++ { + for x := 0; x < m.width; x++ { + c := m.grid.Get(x, y) + switch c { + case WALL, CORRIDOR: + m.grid.Set(x, y, c) + case START: + m.grid.Set(x, y, CORRIDOR) + m.start = Vec{x, y} + case END: + m.grid.Set(x, y, CORRIDOR) + m.end = Vec{x, y} + } + } + } + return &m +} + +func (m *Maze) String() string { + s := "" + for y := 0; y < m.height; y++ { + for x := 0; x < m.width; x++ { + if y == m.start.y && x == m.start.x { + s += string(START) + } else if y == m.end.y && x == m.end.x { + s += string(END) + } else { + s += string(m.grid.Get(x, y)) + } + } + s += "\n" + } + return s +} diff --git a/2024/go/day20/day20_test.go b/2024/go/day20/day20_test.go new file mode 100644 index 0000000..0174040 --- /dev/null +++ b/2024/go/day20/day20_test.go @@ -0,0 +1,31 @@ +package day20 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`############### +#...#...#.....# +#.#.#.#.#.###.# +#S#...#.#.#...# +#######.#.#.### +#######.#.#...# +#######.#.###.# +###..E#...#...# +###.#######.### +#...###...#...# +#.#####.#.###.# +#.#...#.#.#...# +#.#.#.#.#.#.### +#...#...#...### +###############`) + require.Equal(t, 100, r) +} + +func TestPart2(t *testing.T) { + r := Part2("") + require.Equal(t, 0, r) +} diff --git a/2024/go/day20/input.txt b/2024/go/day20/input.txt new file mode 100644 index 0000000..488b75f --- /dev/null +++ b/2024/go/day20/input.txt @@ -0,0 +1,141 @@ +############################################################################################################################################# +#.........#...#...###...#...###...###...###...........#.....#...#.....#...###...#...#...#...#...###...#.....#.......#...###.............#...# +#.#######.#.#.#.#.###.#.#.#.###.#.###.#.###.#########.#.###.#.#.#.###.#.#.###.#.#.#.#.#.#.#.#.#.###.#.#.###.#.#####.#.#.###.###########.#.#.# +#.......#.#.#.#.#.#...#...#.#...#...#.#.....#...#...#.#...#.#.#.#...#.#.#.#...#...#.#.#.#.#.#.#...#.#.#.#...#...#...#.#.#...#...#.......#.#.# +#######.#.#.#.#.#.#.#######.#.#####.#.#######.#.#.#.#.###.#.#.#.###.#.#.#.#.#######.#.#.#.#.#.###.#.#.#.#.#####.#.###.#.#.###.#.#.#######.#.# +###...#.#.#.#.#.#.#.......#...#...#.#.#.......#...#...#...#.#.#.###.#.#.#.#.#.......#.#.#.#.#...#.#.#...#.#...#.#.#...#.#.#...#...###...#.#.# +###.#.#.#.#.#.#.#.#######.#####.#.#.#.#.###############.###.#.#.###.#.#.#.#.#.#######.#.#.#.###.#.#.#####.#.#.#.#.#.###.#.#.#########.#.#.#.# +#...#...#.#.#.#.#.###...#.....#.#...#.#.#...#...#...###...#.#.#.....#.#.#...#.......#.#.#.#.#...#.#.....#.#.#.#.#...#...#.#.#...#...#.#.#.#.# +#.#######.#.#.#.#.###.#.#####.#.#####.#.#.#.#.#.#.#.#####.#.#.#######.#.###########.#.#.#.#.#.###.#####.#.#.#.#.#####.###.#.#.#.#.#.#.#.#.#.# +#...#.....#.#...#.....#.#.....#...#...#.#.#.#.#...#.#.....#.#.......#.#.#...........#.#.#.#.#...#.......#...#.#.....#...#.#.#.#.#.#.#.#...#.# +###.#.#####.###########.#.#######.#.###.#.#.#.#####.#.#####.#######.#.#.#.###########.#.#.#.###.#############.#####.###.#.#.#.#.#.#.#.#####.# +#...#.#...#...........#.#.....#...#...#.#.#...#.....#.#...#...###...#.#.#.###...#...#.#.#.#...#.#...#.......#.###...#...#.#...#...#...#.....# +#.###.#.#.###########.#.#####.#.#####.#.#.#####.#####.#.#.###.###.###.#.#.###.#.#.#.#.#.#.###.#.#.#.#.#####.#.###.###.###.#############.##### +#...#.#.#.###.....#...#.......#.....#.#.#...#...#...#...#...#...#...#.#.#...#.#.#.#...#.#.#...#...#...#...#.#.#...#...#...#...#.........#...# +###.#.#.#.###.###.#.###############.#.#.###.#.###.#.#######.###.###.#.#.###.#.#.#.#####.#.#.###########.#.#.#.#.###.###.###.#.#.#########.#.# +#...#...#.....#...#...#...........#.#.#.....#...#.#.###...#.#...###.#.#.#...#.#...#.....#.#.#...#####...#.#.#.#.#...#...#...#.#...........#.# +#.#############.#####.#.#########.#.#.#########.#.#.###.#.#.#.#####.#.#.#.###.#####.#####.#.#.#.#####.###.#.#.#.#.###.###.###.#############.# +#.......#.....#...###...#...#.....#.#.....#.....#.#...#.#.#.#.......#...#...#.....#.#...#.#.#.#...#...#...#.#.#.#.....#...###.......#.......# +#######.#.###.###.#######.#.#.#####.#####.#.#####.###.#.#.#.###############.#####.#.#.#.#.#.#.###.#.###.###.#.#.#######.###########.#.####### +#.....#...###...#...###...#.#.#...#.#.....#...###.#...#.#.#.......#.......#...#...#.#.#.#.#.#...#.#...#.#...#...#.....#.........###.#.......# +#.###.#########.###.###.###.#.#.#.#.#.#######.###.#.###.#.#######.#.#####.###.#.###.#.#.#.#.###.#.###.#.#.#######.###.#########.###.#######.# +#...#...###...#...#...#...#...#.#...#.......#.....#.###.#.....###...#.....#...#.#...#.#...#.#...#.#...#.#.#.......###.#.......#.#...#...#...# +###.###.###.#.###.###.###.#####.###########.#######.###.#####.#######.#####.###.#.###.#####.#.###.#.###.#.#.#########.#.#####.#.#.###.#.#.### +#...#...#...#...#...#...#.....#...#.....#...#.......#...#.....#.....#.....#.#...#.#...#.....#...#.#...#.#.#.........#.#.....#...#.....#...### +#.###.###.#####.###.###.#####.###.#.###.#.###.#######.###.#####.###.#####.#.#.###.#.###.#######.#.###.#.#.#########.#.#####.################# +#...#...#.....#.###...#.#...#...#.#.#...#...#.###...#...#.....#...#...#...#...#...#...#.....#...#.#...#...#.....#...#.......#...#.....#.....# +###.###.#####.#.#####.#.#.#.###.#.#.#.#####.#.###.#.###.#####.###.###.#.#######.#####.#####.#.###.#.#######.###.#.###########.#.#.###.#.###.# +#...#...###...#.#.....#...#.....#.#.#.#.....#...#.#.#...#.....#...#...#...#.....#####.....#...#...#...#.....###...#...###...#.#...#...#.#...# +#.###.#####.###.#.###############.#.#.#.#######.#.#.#.###.#####.###.#####.#.#############.#####.#####.#.###########.#.###.#.#.#####.###.#.### +#.#...#...#...#.#.......#...#...#...#.#.#.......#.#...#...#...#...#.#####.#.#...###...###...#...#...#.#...#.....###.#.....#.#.#.....###.#...# +#.#.###.#.###.#.#######.#.#.#.#.#####.#.#.#######.#####.###.#.###.#.#####.#.#.#.###.#.#####.#.###.#.#.###.#.###.###.#######.#.#.#######.###.# +#.#...#.#...#.#.#.......#.#...#.#...#.#.#.#.....#.....#.....#.#...#...#...#.#.#...#.#.#.....#...#.#.#.#...#.#...#...#.......#.#.........#...# +#.###.#.###.#.#.#.#######.#####.#.#.#.#.#.#.###.#####.#######.#.#####.#.###.#.###.#.#.#.#######.#.#.#.#.###.#.###.###.#######.###########.### +#.#...#.#...#.#...#.......#...#.#.#.#.#.#.#.#...#...#.......#.#...#...#...#.#.#...#.#.#.....#...#.#.#.#.###.#.....#...#...###.#.........#...# +#.#.###.#.###.#####.#######.#.#.#.#.#.#.#.#.#.###.#.#######.#.###.#.#####.#.#.#.###.#.#####.#.###.#.#.#.###.#######.###.#.###.#.#######.###.# +#.#.#...#...#.......#...###.#.#...#.#...#.#.#.#...#...#...#.#...#.#.#...#.#.#.#...#.#.#...#.#.#...#.#.#.....#.....#.....#.....#.......#...#.# +#.#.#.#####.#########.#.###.#.#####.#####.#.#.#.#####.#.#.#.###.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.###.#.#######.###.###################.###.#.# +#.#.#.....#.#...#.....#...#.#.....#.....#.#.#.#...#...#.#.#...#.#.#...#.#.#...###...#...#.#.#...###.#...#.....###...#.......#...#...#.#...#.# +#.#.#####.#.#.#.#.#######.#.#####.#####.#.#.#.###.#.###.#.###.#.#.#####.#.###############.#.#######.###.#.#########.#.#####.#.#.#.#.#.#.###.# +#.#.......#.#.#.#.......#.#.....#.......#...#...#.#.#...#...#.#...#.....#...........#.....#...#...#.....#.........#.#.....#.#.#...#.#.#...#.# +#.#########.#.#.#######.#.#####.###############.#.#.#.#####.#.#####.###############.#.#######.#.#.###############.#.#####.#.#.#####.#.###.#.# +#.........#.#.#.#...#...#...###.............#...#.#.#...#...#.#.....#.....#.....#...#.....#...#.#.................#.......#...#...#...#...#.# +#########.#.#.#.#.#.#.#####.###############.#.###.#.###.#.###.#.#####.###.#.###.#.#######.#.###.###############################.#.#####.###.# +#.........#...#...#...#...#...#.........#...#...#.#.#...#...#.#...#...#E..#...#.#...#.....#...#.....#...........................#.....#...#.# +#.#####################.#.###.#.#######.#.#####.#.#.#.#####.#.###.#.#########.#.###.#.#######.#####.#.###############################.###.#.# +#.........#...#.........#.#...#.......#.#.....#...#.#.#...#...###...#########.#.#...#.#...#...#.....#.#.........#.............#...#...#...#.# +#########.#.#.#.#########.#.#########.#.#####.#####.#.#.#.###################.#.#.###.#.#.#.###.#####.#.#######.#.###########.#.#.#.###.###.# +#.........#.#.#.#.........#.....###...#.#.....#.....#...#.....###############.#.#.#...#.#.#...#.......#.......#...#.........#...#.#...#.....# +#.#########.#.#.#.#############.###.###.#.#####.#############.###############.#.#.#.###.#.###.###############.#####.#######.#####.###.####### +#.........#.#.#.#.......#.....#.....###...#...#.....#...#.....###############.#...#.#...#...#.#...............#...#.#.....#.....#...#.#.....# +#########.#.#.#.#######.#.###.#############.#.#####.#.#.#.###################.#####.#.#####.#.#.###############.#.#.#.###.#####.###.#.#.###.# +#.........#.#.#.#.....#...###.......#...#...#.....#.#.#.#.....###############.....#...#...#...#...#.............#...#...#.......#...#...#...# +#.#########.#.#.#.###.#############.#.#.#.#######.#.#.#.#####.###################.#####.#.#######.#.###################.#########.#######.### +#...#...#...#...#...#.............#...#...#.......#...#.#.....###################.....#.#.........#.#...........#.......#.....###.......#...# +###.#.#.#.#########.#############.#########.###########.#.###########################.#.###########.#.#########.#.#######.###.#########.###.# +###...#...#.........#...#.......#.....#...#.....#...#...#.....###################...#.#...#.........#.........#...#...#...#...#...#...#.....# +###########.#########.#.#.#####.#####.#.#.#####.#.#.#.#######.###################.#.#.###.#.#################.#####.#.#.###.###.#.#.#.####### +#...###...#...........#...#.....#...#...#.......#.#.#.........###################.#...###...#...............#.......#.#.#...###.#...#.......# +#.#.###.#.#################.#####.#.#############.#.#############################.###########.#############.#########.#.#.#####.###########.# +#.#...#.#.#...#...#.........#.....#...............#.......#...###################...#...#...#.....#.......#.....#...#...#.#...#.#...........# +#.###.#.#.#.#.#.#.#.#########.###########################.#.#.#####################.#.#.#.#.#####.#.#####.#####.#.#.#####.#.#.#.#.########### +#...#...#...#.#.#.#...#.......#...#...#...#...#...#...#...#.#...#############...#...#.#...#.......#.#.....#...#...#.....#...#...#.....#.....# +###.#########.#.#.###.#.#######.#.#.#.#.#.#.#.#.#.#.#.#.###.###.#############.#.#.###.#############.#.#####.#.#########.#############.#.###.# +###.....#...#...#.###...#...#...#...#...#.#.#...#.#.#...#...#...#############.#.#.#...#...#.........#.......#...#.....#...............#.#...# +#######.#.#.#####.#######.#.#.###########.#.#####.#.#####.###.###############.#.#.#.###.#.#.###################.#.###.#################.#.### +###...#...#.....#.....#...#...#.....#...#...#...#...#...#...#.###############.#...#.....#.#.#.........###.......#.#...#.......#...###...#...# +###.#.#########.#####.#.#######.###.#.#.#####.#.#####.#.###.#.###############.###########.#.#.#######.###.#######.#.###.#####.#.#.###.#####.# +#...#...........#...#...#...#...###...#...#...#.......#.....#...#...###...#S..###...#...#...#...#...#.....#...#...#...#.#.....#.#...#.#...#.# +#.###############.#.#####.#.#.###########.#.###################.#.#.###.#.#######.#.#.#.#######.#.#.#######.#.#.#####.#.#.#####.###.#.#.#.#.# +#...#.....#...#...#...#...#...#.......#...#...#...........#...#...#.....#...#.....#.#.#.###...#...#.........#...#...#...#...###.#...#.#.#...# +###.#.###.#.#.#.#####.#.#######.#####.#.#####.#.#########.#.#.#############.#.#####.#.#.###.#.###################.#.#######.###.#.###.#.##### +###...#...#.#.#.#...#...#...###.....#.#...#...#.....#...#.#.#.#...#.....#...#...#...#.#.....#.......#...........#.#.#.....#.....#.....#.....# +#######.###.#.#.#.#.#####.#.#######.#.###.#.#######.#.#.#.#.#.#.#.#.###.#.#####.#.###.#############.#.#########.#.#.#.###.#################.# +###...#.....#...#.#.......#.......#.#.....#.#.......#.#.#...#...#.#...#.#.#.....#...#.............#.#.........#...#...###.....#.....#.......# +###.#.###########.###############.#.#######.#.#######.#.#########.###.#.#.#.#######.#############.#.#########.###############.#.###.#.####### +#...#.#...#...###...............#.#.....#...#.#...#...#.....#.....#...#...#.......#...#...#.......#.....#...#.........#...###...###.#.......# +#.###.#.#.#.#.#################.#.#####.#.###.#.#.#.#######.#.#####.#############.###.#.#.#.###########.#.#.#########.#.#.#########.#######.# +#...#.#.#...#...................#.....#.#...#...#...#.......#.......###.....#...#...#.#.#.#...........#...#.#.......#...#.........#.#.......# +###.#.#.#############################.#.###.#########.#################.###.#.#.###.#.#.#.###########.#####.#.#####.#############.#.#.####### +#...#...#.....#.....................#.#.....#.......#.......#.....#...#...#...#.....#...#.....#.....#.....#.#.....#...#...#...#...#.#.#...### +#.#######.###.#.###################.#.#######.#####.#######.#.###.#.#.###.###################.#.###.#####.#.#####.###.#.#.#.#.#.###.#.#.#.### +#...#.....###.#.#.................#.#.#.....#.#...#.......#...#...#.#.###.........#...#.....#.#...#.###...#.....#...#.#.#.#.#...#...#...#...# +###.#.#######.#.#.###############.#.#.#.###.#.#.#.#######.#####.###.#.###########.#.#.#.###.#.###.#.###.#######.###.#.#.#.#.#####.#########.# +###.#.#.....#...#...............#...#.#.#...#...#.......#.......#...#.#...#...#...#.#.#.#...#.###.#...#.......#.....#...#...#...#.....#...#.# +###.#.#.###.###################.#####.#.#.#############.#########.###.#.#.#.#.#.###.#.#.#.###.###.###.#######.###############.#.#####.#.#.#.# +#...#.#...#.#...###.............#...#...#...#.....#...#...#...###...#...#.#.#.#...#.#.#.#...#.....#...#.......#.......#...###.#...###...#...# +#.###.###.#.#.#.###.#############.#.#######.#.###.#.#.###.#.#.#####.#####.#.#.###.#.#.#.###.#######.###.#######.#####.#.#.###.###.########### +#.....###.#.#.#.#...#.....#.......#.......#.#...#...#.....#.#.....#...#...#.#...#...#...###...#...#...#.......#.#.....#.#...#...#.#.........# +#########.#.#.#.#.###.###.#.#############.#.###.###########.#####.###.#.###.###.#############.#.#.###.#######.#.#.#####.###.###.#.#.#######.# +#...#.....#.#.#.#.....#...#.#.............#.#...#.......###.#.....#...#...#...#...#...#...###...#...#.......#.#.#...###...#.....#.#.#.......# +#.#.#.#####.#.#.#######.###.#.#############.#.###.#####.###.#.#####.#####.###.###.#.#.#.#.#########.#######.#.#.###.#####.#######.#.#.####### +#.#.#.....#.#.#.#...###.....#...#...#...###.#...#.....#.#...#...#...#.....#...#...#.#.#.#.#...#.....#.....#...#.#...#...#.#.....#...#.......# +#.#.#####.#.#.#.#.#.###########.#.#.#.#.###.###.#####.#.#.#####.#.###.#####.###.###.#.#.#.#.#.#.#####.###.#####.#.###.#.#.#.###.###########.# +#.#.#.....#...#...#.#...#.....#...#...#...#.#...#.....#.#.....#.#.#...#...#.#...###.#.#.#.#.#.#.......###.......#.....#...#...#.#...#...#...# +#.#.#.#############.#.#.#.###.###########.#.#.###.#####.#####.#.#.#.###.#.#.#.#####.#.#.#.#.#.###############################.#.#.#.#.#.#.### +#.#.#.....#.......#.#.#.#...#.#...........#...###.....#...###.#.#.#...#.#...#.....#.#...#.#.#...#...........#.....#...#...#...#...#.#.#...### +#.#.#####.#.#####.#.#.#.###.#.#.#####################.###.###.#.#.###.#.#########.#.#####.#.###.#.#########.#.###.#.#.#.#.#.#######.#.####### +#.#.......#.#.....#...#...#.#.#.................#.....#...#...#.#.#...#.........#.#...#...#...#.#.........#.#...#...#...#.#.......#.#...#...# +#.#########.#.###########.#.#.#################.#.#####.###.###.#.#.###########.#.###.#.#####.#.#########.#.###.#########.#######.#.###.#.#.# +#.#.........#...........#...#.....#.............#.....#.#...#...#.#.###...#.....#.#...#.#.....#.#...#.....#.....###...###.........#.....#.#.# +#.#.###################.#########.#.#################.#.#.###.###.#.###.#.#.#####.#.###.#.#####.#.#.#.#############.#.###################.#.# +#...#.......###...#.....#...#...#...#.....#.....#.....#.#...#.#...#...#.#.#.#...#.#.#...#...#...#.#.#...........#...#.....###...###.......#.# +#####.#####.###.#.#.#####.#.#.#.#####.###.#.###.#.#####.###.#.#.#####.#.#.#.#.#.#.#.#.#####.#.###.#.###########.#.#######.###.#.###.#######.# +###...#...#.....#...#...#.#...#.....#.#...#...#.#.....#.###.#.#...#...#.#.#...#.#.#.#.#...#.#.###.#.#...#.....#...#.......#...#.....#.......# +###.###.#.###########.#.#.#########.#.#.#####.#.#####.#.###.#.###.#.###.#.#####.#.#.#.#.#.#.#.###.#.#.#.#.###.#####.#######.#########.####### +#...#...#.......#...#.#...###.......#.#...#...#...#...#.#...#.#...#.#...#...#...#.#.#.#.#.#.#.#...#...#.#...#.#...#.#...#...#.....#...#.....# +#.###.#########.#.#.#.#######.#######.###.#.#####.#.###.#.###.#.###.#.#####.#.###.#.#.#.#.#.#.#.#######.###.#.#.#.#.#.#.#.###.###.#.###.###.# +#...#.#.........#.#.#.#.......#.....#.#...#...###...###.#...#.#.#...#.#.....#.###.#.#.#.#.#.#.#.....###...#.#.#.#.#...#.#...#.###.#.###.#...# +###.#.#.#########.#.#.#.#######.###.#.#.#####.#########.###.#.#.#.###.#.#####.###.#.#.#.#.#.#.#####.#####.#.#.#.#.#####.###.#.###.#.###.#.### +###...#.......#...#.#.#.#.......#...#.#...#...#.........#...#.#.#.....#.#...#...#.#.#.#.#.#.#.#.....#.....#.#.#.#.....#.....#...#.#.....#...# +#############.#.###.#.#.#.#######.###.###.#.###.#########.###.#.#######.#.#.###.#.#.#.#.#.#.#.#.#####.#####.#.#.#####.#########.#.#########.# +#...#.........#.###...#...#.......#...###.#.###...#.....#.#...#.......#...#.#...#.#.#.#.#.#.#.#.#.....#...#.#.#.....#...#...#...#.....#...#.# +#.#.#.#########.###########.#######.#####.#.#####.#.###.#.#.#########.#####.#.###.#.#.#.#.#.#.#.#.#####.#.#.#.#####.###.#.#.#.#######.#.#.#.# +#.#.#.....#...#.......#.....#...#...#...#.#.#.....#...#...#...#.....#.#.....#...#...#.#.#...#...#...#...#.#.#...#...###.#.#.#.......#.#.#.#.# +#.#.#####.#.#.#######.#.#####.#.#.###.#.#.#.#.#######.#######.#.###.#.#.#######.#####.#.###########.#.###.#.###.#.#####.#.#.#######.#.#.#.#.# +#.#.......#.#.#.......#.....#.#.#.#...#...#.#.#...#...###.....#.###...#.....#...#...#...#...........#.###.#...#.#.#.....#.#.........#.#.#.#.# +#.#########.#.#.###########.#.#.#.#.#######.#.#.#.#.#####.#####.###########.#.###.#.#####.###########.###.###.#.#.#.#####.###########.#.#.#.# +#...........#.#.###...###...#.#.#.#...#.....#...#.#.#.....#...#.......#.....#.....#.....#...........#...#...#.#...#.#...#...###.....#.#.#.#.# +#############.#.###.#.###.###.#.#.###.#.#########.#.#.#####.#.#######.#.###############.###########.###.###.#.#####.#.#.###.###.###.#.#.#.#.# +#...#.......#.#.....#...#.#...#.#.###...###.......#.#.......#...#.....#...#...#...#...#...#.........#...###.#...#...#.#...#...#...#.#...#...# +#.#.#.#####.#.#########.#.#.###.#.#########.#######.###########.#.#######.#.#.#.#.#.#.###.#.#########.#####.###.#.###.###.###.###.#.######### +#.#.#.....#...#.....#...#.#...#.#.#.........#...#...#.........#...#...#...#.#.#.#...#...#.#.#.......#.....#.#...#.#...#...#...###.#.........# +#.#.#####.#####.###.#.###.###.#.#.#.#########.#.#.###.#######.#####.#.#.###.#.#.#######.#.#.#.#####.#####.#.#.###.#.###.###.#####.#########.# +#.#.......#...#...#.#.#...#...#.#.#.#.....#...#.#...#...#...#...###.#...#...#.#.......#.#.#...#.....#.....#.#...#.#...#...#.......#...#...#.# +#.#########.#.###.#.#.#.###.###.#.#.#.###.#.###.###.###.#.#.###.###.#####.###.#######.#.#.#####.#####.#####.###.#.###.###.#########.#.#.#.#.# +#.#.......#.#.#...#.#.#...#...#...#...#...#.#...#...#...#.#...#.....#.....###.#.......#...#.....#...#.....#.....#.....###.......#...#...#.#.# +#.#.#####.#.#.#.###.#.###.###.#########.###.#.###.###.###.###.#######.#######.#.###########.#####.#.#####.#####################.#.#######.#.# +#.#.#.....#.#.#.###...###...#...###...#.....#...#...#...#.###...#...#.......#.#...#.......#.#.....#.#...#...............#.......#.....###...# +#.#.#.#####.#.#.###########.###.###.#.#########.###.###.#.#####.#.#.#######.#.###.#.#####.#.#.#####.#.#.###############.#.###########.####### +#.#.#...#...#.#.....#...#...#...#...#.#...#.....#...###.#.#.....#.#.#...#...#...#...#...#.#.#...#...#.#.#.......#.....#.#...#...#...#...#...# +#.#.###.#.###.#####.#.#.#.###.###.###.#.#.#.#####.#####.#.#.#####.#.#.#.#.#####.#####.#.#.#.###.#.###.#.#.#####.#.###.#.###.#.#.#.#.###.#.#.# +#...#...#...#.#...#.#.#...#...###...#...#...#...#...#...#.#.#...#.#.#.#.#.....#...#...#...#...#.#...#.#.#.....#.#...#...#...#.#.#.#.#...#.#.# +#####.#####.#.#.#.#.#.#####.#######.#########.#.###.#.###.#.#.#.#.#.#.#.#####.###.#.#########.#.###.#.#.#####.#.###.#####.###.#.#.#.#.###.#.# +#...#...#...#.#.#...#.#...#.###.....#...#.....#.#...#...#.#...#...#...#.#...#.###.#.....#####...###.#.#.......#.#...#.....#...#.#.#.#.....#.# +#.#.###.#.###.#.#####.#.#.#.###.#####.#.#.#####.#.#####.#.#############.#.#.#.###.#####.###########.#.#########.#.###.#####.###.#.#.#######.# +#.#.....#...#.#.#.....#.#.#...#...#...#...#.....#...###.#.###...........#.#...#...#...#...#...#.....#.........#.#.###.....#.###.#.#.#...#...# +#.#########.#.#.#.#####.#.###.###.#.#######.#######.###.#.###.###########.#####.###.#.###.#.#.#.#############.#.#.#######.#.###.#.#.#.#.#.### +#.#...#...#.#.#.#...#...#...#...#.#.#.......#...#...#...#.#...#...#...#...#.....#...#...#...#.#...#...#...#...#.#.#.......#...#.#.#.#.#.#...# +#.#.#.#.#.#.#.#.###.#.#####.###.#.#.#.#######.#.#.###.###.#.###.#.#.#.#.###.#####.#####.#####.###.#.#.#.#.#.###.#.#.#########.#.#.#.#.#.###.# +#...#...#...#...###...#####.....#...#.........#...###.....#.....#...#...###.......#####.......###...#...#...###...#...........#...#...#.....# +############################################################################################################################################# diff --git a/2024/go/main.go b/2024/go/main.go index be5c3e7..d5d0946 100644 --- a/2024/go/main.go +++ b/2024/go/main.go @@ -99,7 +99,7 @@ func main() { // Reads day from os.Args. func day() int { - latest := 18 + latest := 19 if len(os.Args) == 1 { return latest }