From 29387606b007e804dca6b9130128f040db770dc6 Mon Sep 17 00:00:00 2001 From: Alan R Evans Date: Mon, 13 Jan 2025 18:44:06 +0000 Subject: [PATCH] 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