This commit is contained in:
2025-01-13 18:44:06 +00:00
parent 4619bc7775
commit 29387606b0
36 changed files with 15386 additions and 12 deletions

103
2024/go/day10/day10.go Normal file
View File

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

View File

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

56
2024/go/day10/input.txt Normal file
View File

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

76
2024/go/day11/day11.go Normal file
View File

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

View File

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

1
2024/go/day11/input.txt Normal file
View File

@@ -0,0 +1 @@
3 386358 86195 85 1267 3752457 0 741

146
2024/go/day12/day12.go Normal file
View File

@@ -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, &region, 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, &region, 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
}

View File

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

140
2024/go/day12/input.txt Normal file
View File

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

58
2024/go/day13/day13.go Normal file
View File

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

View File

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

1279
2024/go/day13/input.txt Normal file

File diff suppressed because it is too large Load Diff

149
2024/go/day14/day14.go Normal file
View File

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

527
2024/go/day14/day14_test.go Normal file
View File

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

500
2024/go/day14/input.txt Normal file
View File

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

119
2024/go/day15/day15.go Normal file
View File

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

View File

@@ -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...#
##########
<vv>^<v^>v>^vv^v>v<>v^v<v<^vv<<<^><<><>>v<vvv<>^v^>^<<<><<v<<<v^vv^v>^
vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<<v<^v>^<^^>>>^<v<v
><>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^<v>v^^<^^vv<
<<v<^>>^^^^>>>v^<>vvv^><v<<<>^^^vv^<vvv>^>v<^^^^v<>^>vvvv><>>v^<<^^^^^
^><^><>>><>^^<<^^v>>><^<v>^<vv>>v>>>^v><>^v><<<<v>>v<v<v>vvv>^<><<>^><
^>><>^v<><^vvv<^^<><v<<<<<><^v<<<><<<^^<v<^^^><^>>^<v^><<<^>>^v<v^v<v^
>^>>^v>vv>^<<^v<>><<><<v<<v><>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^
<><^^>^^^<><vvvvv^v<v<<>^v<v>v<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<>
^^>vv<^v^v<vv>^<><v<^v>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<><<v>
v^^>>><<^^<>>^v^<v^vv<>v^<<>^<^v^v><^<<<><<^<v><v<>vv>>v><v^<vv<>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...#
##########
<vv>^<v^>v>^vv^v>v<>v^v<v<^vv<<<^><<><>>v<vvv<>^v^>^<<<><<v<<<v^vv^v>^
vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<<v<^v>^<^^>>>^<v<v
><>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^<v>v^^<^^vv<
<<v<^>>^^^^>>>v^<>vvv^><v<<<>^^^vv^<vvv>^>v<^^^^v<>^>vvvv><>>v^<<^^^^^
^><^><>>><>^^<<^^v>>><^<v>^<vv>>v>>>^v><>^v><<<<v>>v<v<v>vvv>^<><<>^><
^>><>^v<><^vvv<^^<><v<<<<<><^v<<<><<<^^<v<^^^><^>>^<v^><<<^>>^v<v^v<v^
>^>>^v>vv>^<<^v<>><<><<v<<v><>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^
<><^^>^^^<><vvvvv^v<v<<>^v<v>v<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<>
^^>vv<^v^v<vv>^<><v<^v>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<><<v>
v^^>>><<^^<>>^v^<v^vv<>v^<<>^<^v^v><^<<<><<^<v><v<>vv>>v><v^<vv<>v^<<^`)
require.Equal(t, 0, r)
}

71
2024/go/day15/input.txt Normal file
View File

@@ -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^>^^<><^v>v<^vv>^v<^>>v>^vv<<vv>>>>>>v^>v>^>^v<^v^<v^<^v>>^^>v<<>>^v^<v<v>v<v<v^<>>^>v^>^^^<^<v<v<<<v<^vv>^v>>v<v^>><vvv>^>v<^^vvv<>vvv<^v<>v><><^^<>v^^<^><v^><>>^^>v^<v>>^<><<^><<>v>>vvv<^^v^v^><vv>>v^^><v^<<^v>^vv<^<^<^<><>>>^><vv>>^<v^<><><^v<^<^v<^^>^<><<^<<^vv^^v<vv^^>^<^<v^v^^<v^>^v<vvv^vv<^^<^^>v>>^v>^v><v^^^v>^<^<v<^>>^><>^v<>v>^^^<^vv^^<^v<vv>><^^^v<<>>>^<^^>^<v>v>><v^v<<<v>^<vv<^<v^>^<^<v^<>^><v<>^>><<^><vv>>vv<>v^<vvv^<v><v^vv>^<<><vvv>^<><>^^v<^v<<>vv><^>><^<<v<^>^>>^^>v<^>v^>^<vv><v><<^^^^v^<>^>^v^^v<v^<v>v<><<<v>vv^v><vv^>>>v>>>>><v<vvvv<<^v>^v>^<><<<><>v<vv<v><>^vv>v<>^v^<>>v<v>>>v^>^<vv^^<v<^<^>vv^vvv^^<<>vv>^>^v>>v^^vv<^v>^^vv<>^v>^>v^^<>^^><vvvvvv<^^>^^v<>^^^<^^<>^>^v><v><<>>^<>>v>>^><^>v<v><>v^v<v><>^<<>>v>^v<vv><>^v<^>^^v>v>>^<^^^<<vvv><<v><<>vvv^v><<v^vv><^^^v^^^>v><<^^v>vv^v><v>^>^v<>>vv<<^v<v><>v><^><>>^vv><>><<vv^v<^^>><<>>v>><><vv>v^^<^<v<<^vv^<^^<v^<vv<<v<>v<>^<^<^>v^^^>>v<^^<^^^>^^>^>^>^^<><vvv>v>v<vv<^v<^>vv^<vv>v^>^<^<>v>^^>v<^>v>v>><>
^vv>>>^vv><^v^<>v>^><<v>^^<v^v<v^>^>^v>><>>^>^<<^^v^^vv>^v^<<v>^v^>v<v>v<<>^>vvv>v>^vvv>>vv^>v^^v^^v<v^v>v^^<><<<^^><<^<vv<>>>>^<>v><v>>^v<v<<vv>>v>><>v><<^v^><>v><v^^<>v>^>>^^><>v<v<^vv<^v>>^><v>^v>^>><<<^vv<>^<<^><^<<><>vv^^v<<>v>v^vvv<v^>>^>^>^<>v<>vv>^><vv>>v<v<>^^v<>><>>v<>>^^<>v^<v^v^v>vvv<><^^v^>vv<<v>^^>>>v>^>^^><<^v><v^>^^>>^^>v<<<v^><><<><>vv^>v>v^>vv><^<v^><>><<>^>vv<<<v>>v><^^<v^><v>^>v^^<^v>v^<<v^>><v^>^<<>^^vvv>vvv><<><^><>>><<>>^><v<<v><^<v<>>^><><^^vv<^>^vvv<^>>><<^>><^v<v^<vv<v><<v^^v^<><^>v>^v>v<v<<>>><v>^vv^>>><v^><^>v^<>>v>v^v^><^<vv>v^v^<^v<>^><^>>v^^>v<^^^<v^^v>v>v>^^^<^^><v<vv<^vv^<vv<<<><><^>>v<>v<^v>^^<>v^>^v<v^<vv^v>v<<<v>^<^v^^^>v^vv<>vv>^^<<><^><vv>><<^v<^>v>>^>><<^<>vv^>v><>^vv^^v>v<<>^<><^^>^^><^>>^v>vvvv>^>v><<^<v^v<^<<^^<>^><^v^<<v<>^v><^>vvv><^v<>><<^^>^<^<<v^^^<^v><<<v<<>v>^v^>^>vv^<><v^^<><><>^^<^v^^>^^^^^vv<<<v^<vv<<<v^^<v<^<<v><vv^<<<<<<^^^vv><^vv<<<>><>v>vv>^^^<^><><<><<v<><>><^vv^^<<v^<^^^>v<>^^^^<><^^^<vv><>^^<><<>><vv>>^<>v<v^v<<vv^>^^>^^>>^v>v^
^>>v<><<<vvv^^^<vv><<<vvv>v<<<<^v<>v<<^vv<^vv<^^>>v^>^v^>^<>>>v<^<<^^>>vv^^<^^^>^><vv<v<v^^v<vv^<<^v<<^v<v<v><>>>vv<>vv<>^^>vv^vvvv<v>vv<vv^^>^<v<vvvv^>v>^^<<^<<<>v>^<^<v>v>vv<<v<^vv>>^^<v<v<v<>>^>><^<v<<>^^v<>^<^v>^><><<vv<^><<^><>^>^^vv^>^<<<^>^v>^v<<<>^^<^^<<^<v><^^<>^<<<^v^<>^>vv<vvv>v><<<^vv^<^><>><><>v^^>v<^<^vv<>><^>v>^v<><>>^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>>>>>><^vv<v<v^<^v^<<><^>v>>v<vv>^<vv<<v^v>>>vvv<v<vv<<<^v<v<>^vvvvvvv>^^>>>^v<>><>^<<<>^><^^v^v<>><^>^>v><<v>>>v^>^<^<^<v^vv>><<^<>vv^^v^<>v<<<^>>v<v>vv^>><<^<^^><^^>>>v>^^^>^v<v>v<v^<v^>^<<>^^^<^v>><>>>>v^<>>^^^<>v^^v^>><<>v>>^>^vvv<v>><>^v>vv^v>><vvvvv^>^><>^>v<<^>><^^v><^<v^^>>^^>^>vv><<<^vvvvv<^<^<<vv>^<^^<>v^^>^v<^^v<>v>^>^>vv^>v>^<vvv<<^<>^<^<^^v><^<^^v^<vv>v<>>^>v^v<^v>>><^v<^<<^v<^vv^^><>^v<><^><v^v>v<>vvv^^^>^^^^^v<^^^<v^<^>^v<<v<^^v<^v^<<^>><<>>>v^v<>v^^^>^vv>v>v>>><><v^<v><vv<>v>vvvv>v>>vvv><v<v^<^<v<^vvv>^<v<>v<>^^v^<^vv^^>^^>>vv<><^vv><v<
<^^>^<^>><<>>v>vv^vv<^<<<<>^v<<>>^v<>>>^v><<<><^<^><>>><vv<v<v^<>>v^>v<><v^><^v>v^>^^v^^>v<<v<<v^^^<>v<^v^^<<<^v^^vv^v<v>v>vv^>^^v<vv^<<^>v^<^^<vvv><^>>>>^><<>^><vvv>^v^<^v>v^v><<>v^<>>v^^^<v>><<^>^>^<^vvv>><v<<>^<^><<v>^v>^^<><^^^>^><vvvv><^^><v>>v^vvv><vvv<^^v^v<v<><^<<v^>v>>^<<<<>^v<v>v^>^<^<<>><^>vvv>v>>v^><><>vv>>^vv>>vv<^<>^^^>^>v>^v><^v^>v^<v^v^^^>^v^>^>vv<vvv^<<^<>vvv<vv^<vv<<<v^^>v<<^^<^<>^^^v<v<^>><>><<<^^<>v<>vv<^<^v^v>v>v^vv^v<<v<^>^v<v^^v>^<<<<^^<<>v<<<<<>v<^<v>vv<>^<><v^^v^^<v^^<<vv<v^vv^>><><^<^^<^<>v<>^<<<<v^<<^<<vv<v<>>vv<<vv>^vv<>^^<>v><<v>><vv^^^^><<<^<^>v^vv>vvvv^>v<<v<>^^^v<<<><v<v^^><v^v>>^>>^>><v<<>vv>>>v>v^<<<v<^<<>>^^<v^vv<^^<v<v^^<>v>v^<vv<v<<>>^<^^<^^>><^^>v>v>^^>v>>>^<>^^v^v>^^<^v>^v><<<vv>v^>v^<v^><v^<^>vvv><<^>>v^^>>>^<v^v^>vvv<v<>v^>^^v^^>vvv>^v^^<v^<<v^<<<>^v^<^<vvv<<<<<v<<vv^<v>>v>>><v>^^<><>v<vv^>v>^vvv<<>>v<v<>^<>^<^<<v<<vv^<v^^<<^<^v<^<^>vv^<<vv^<^vv>v>v><^^>^><vv>vv<^<v<>^<^^v<><vvv<<>^vvv^^v<v<v<^<>^vv>>^>v>v<^^<>vv>^<<>^^^>^<^<^>v>vv^^><>^>^v>>^<>
^<^^<^>v<^<^>^^>><<<>v<^^><>>^^<^^>^v^^><^v^^<^vv><>>v<^v^>>>^<>>^>^>^<<v>>^^^<^v<>vv^v^^<^>v>^>><<>>v<><^<<v<v><<>v>>^<><v<v<>>>>v>^v^<<<>^vv<<v><^>vv>vv>><v^v^^v<<<^<<<^vv><^><><<>v><vv<><^<<v<<vv^vv<^>>v>>>><><>^<v^^>vv<^v^vv><<^>v>v<<><>^>^v<^>v>v<>v<<>^vv<vv>>v><>><<<>>^^^<^^^^<<v^<<v><v<v<v>>^>>vv>^v<^>>vv>^^v>^vv^<v<^^v>^<v<v>^v><v>v>>><<<>>>v>vv<^>^v>v<vv^^v<^<v^^v<^v><v^>v^^^<><>v<^>><^vv>^<<^<>><<<<^<vv^<v<<v^>^>^^<v^<^vvvv<<v^><><>v><<^v<<<<<^v<v><v<<^<<v<>>v<^^v<<^<>^><<v^v^><<>>v<<^v>v>>>v<>>v><><^vv<vv><^^<<v^vv<^>v>v<v^<<<<v>v^<>^^>>>><<<>^^^^v>v>>>>^v><<^^<vv>>v^<<v^^<^v^v>v<>>^^v>^><^v>^>^^vvvvv<v>>^>v<v<^<>>v><vvv>v>v^^<v>^>^<><<^^^^<<v^<v>>^<^<vv<<^^^v>v>^>><v>>><v<>vv>>>v^>^><^^v>>^>>vv<^^<>><v>vv^^v<v<>^<>>>vvv<>^>vv^<<^<^<>vv>^>v>v<^<<><<vv^<<>^v^<^^^<^^^^vv^>^^>^^>><>^<^>v>v<^>>^^^^>^^><<v><v>>vv><^<vv^<v^v^vv>^>v>^^^^v><v>^v>^v<^v^>v>^<v<^v<v><v<<v^>>^^^>v>v^^v^<v>v>^v<^<v^^^v^>^^>^>vv^^vv>vv>v^v<^<^vv^><v^vv<<^>^^<v>v>^vvvv<>^^v<><vv>><<<vv>v<^>><><^><>>^<v^<><
^><^v>v^><v^<>vvv^^v^v<v^>v<>>>v>>vv^^>v^><^^<>v^><<v<<v^<<v>>^v^<v^v^^^^^<^v<v^<^^<^>><v^^^>v>^^>><<<v>^><>v><^v><vv^>>>><<<><v>v^><<<>><<>^v^^^^<^^><><>^^vv^<^v<v>^>>^>^><>vv^>>>>v^<>vv^>>v^<>vv<v^^>>>><v><^><^>^vvvv><<^vvv^<>>v^v>><^^^><>>v^<v<v<v><v^^vv<v>>^<^^><<<>vvv^^^v>^v<>v^>v<<v^v>>v>v<>^v>vvvv<^>^^^v^^<v><>^<vv<><^^<vv<^<v<>v>>^^^><>v^>><^>vv>><^^^v>><^<<^><<>^>^<>v<v<^<<>v>vv^^^^<^>^v<>>^v>>>^v<>v<^v<<^v^v<<<v^vv^><^>><v^>v^v^v<<^^v>vv<v^^v<v^^<<<^v<^>^>v><>v>^vv>^v>><v^^>^<<^><>v>^>v>^<v><<^<>>^<v^^<<>^v<>^>v^<>^v><v<><v<vv>vvv<><<>>^<^^>^<<>^<>vv^^v^^<<>v<<><^<<v<><v<<>^^<>>><<^<v<v<>v<<^>v<v^^v<><<v>><v<^v>vv>^>>>>>vv<<><^^vv^>v^<>v<<vvvv><<>^>^<v^<>v>vv^^<^v>v<^<<v^>>>^vv>v^<>^v^<>^>><><>v>>v>^><^><^>v><<>>^^^<vv<<<v^v^<<><<^v>v>^vv^>><v>>^^<vv^v<^^vv><>v<^<^>>^v^>v<><^>>>vvv^^^^>vv>^>>>><^<>^>v^v<v<^v>>v<^<v^v<>>>>><^^vv><<>vv<>v<>>^>^^<>>vv>>><<>vvv<<>>vv>^<^^v>>v>^<<<><^v^v^>^v^><<>^v><>>^^>v>>>^<v<>^>>v<>>>^v>^v^<<<vv^>^<<<><>vv^>vvv>^^v>v<^v^v^><^v<>^v>^<>><<^v>vv^
^>v<>>^vvv>>v<v<^>^vvv>>v^><>><^v<><vv>vv^<v<^>>^^><<>><^<^>^v<>v>>v^<>>^<<^vv<^^<>^v><<>>^^<<<v>^vv^v>^>^<>v>>>^<^<^<>v<^><<^><<>>vv><<><v<><>^<v^^<^>>>v^<v>^<v>>>>^v<^^<<vv^v<v<^^<<>v><>><^<<<vv^>^v>>^vv^v<><v<vv<>^>><<v<<>>>>^<v<v^v<^v><>>v><>>^^v>>^><^^^>^^>^>^>^<vv>vvvvv<^^>>>>v>vv>v>^vv^v<^v>^>^>vv>v<>v<><<>v^v<>><<<<v<<^vv>v<<>^v^><<v^^v>>v<><<v<v>^v>^>^><^^^>v<<v<^<v<^<>>vvv<<^^<vv^v<^^v>v>^vv^<^>v>>>v>^^><^>^v>^v^^>^^<v^^><v<vv^^>v><>><v<>^<^><^^v^^vv<^>^^>^>>vv<^<vv>><v>vv<<<v<^vvv<<<><>><><<^^v><vv^v><^<^<>v^v>^v^<<<v^>v^<<<<<vv>v^<>v<^^<<^>^v<<><>><v><><<<^^>v>^^<^^<v^v<vv>><v<<>v>v<^v>^>>v>>v>v<vv<>><^v^v<^v>^vv^><^v>><v<><<^<^^^^^^>>v>v^<>v>>v<vvv><>v^>v><<<^v^<^<^<>^>>v>>>v><v>^vv>^^<>v^<v>v>v><^v<v>^>v>>^<vvv><^v>>>v>v>vv>^^^>vvv<v^<v>v^><^>^^^v<^><>^^<<^<<^^<^^>^<>^<^<^<v<v^>^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^>>^vvv<v^<<v>^<^^v^^v<<><^>vv>>^v<^^<v^^<>>^<v>^>^<v<<<^<^v^^vv<>>>
^>vv>^^>v^>>^<vv^>><>>^<>v><<>v>v^^^>>v>>vv^^<<<>v^^<vvvv<>v<v><<>v<vv^^>>>^<>^v<<v>^<v^vv<^vvv>^^<><^<<>^<>>v^vv<v>v^<v<^^v<<><vv<^^<^<<v<^>v<v>^<v<^^v><^<v<<v<^^<v^<^>>v^<^^<<^^<<^v<><^v^^v^v^v^^>v^><^>vv>>^><^<<v<>v>v>><>^<vv<<^^>v>^<v><vv^v>^<^>>v^<v<><<>v<<v^v>v^>v<v^^<^^>v>vv^><vv>v^vvv^<>^v<v<<^<>><<vv<><<>v^vv>vv<><v^v>^><^<><^v>>v<<^^^><^>^<>v^^v^^><^^>>v^^<>v>><<vv^^v^>>v<<v<v<<^><<vv>^^^^^<<><>^vv^<><<>v>>>^><<<v>^<><>^^v^vv>>v^vvv<>><><><v<<v>^vv^v>^<^<^v>>>><^>>v>^v><<>^^<>^v^<>vv^<^<vv^vv><>^<<>v><^<^^<v<^<v^^v<>^^>^<>^^^^<^^>v<<<<v^>v>v>>^vv>vv<v^vv>v^>v^vv>v^>vv<v^>^v<>>>vv>^>>^^^>><^^v^^<^^>vv<^v>v^vv<<vv^<<vv^^<><^<v^>^<>^vv<<v^^v>^vv>vv<v><><v<>>^<<><v<v>^<<v><>v<v<^<^vv^^<^<><<>v<>v^^<>vv>^^>^vv^v<v^v^^>>^<>v^v^>vv^^^>^>><>v><>>>v>>>v>v^v^v>v<^>^<^^>v<>>^><<v^>^^<^^<^v^v>vv<v>v<^vv<v^<<v><^<<v^v^^^vv>><>^<<v^<>v^>vv^^<vv^^^^>^>^>^>><<^>>^<v>v^>v^^^v<^^^<^>>v^v<>^<><<v<v<vvv^^<^<>v><^^v^<^>>^^v^>>^<<v<<^<<v><<>v<^^^^<<^<v<>^v^^^^^>vv^>>v<^><<<v<<^<v><><v^v<vv>v^<>v>^
^<v>^<<>^<^<<<>v^^v>v>>^^^^^^<><^^<<^^v<>^^<v^v><^>^v><v<^^^>>>><><<<^^v^<><<<><<v><^v<<^v>vvv>><^>^>^><^>^>>>v^<v><<<<<vvvv^v>^>>v^><^<vv<^>^vv>vv<^>><^^v^^vv<>^^v<>^<v>>>^^vv^^>>v^>>><<vv>v<^v^vvv>vvv>^v>^^^<><>v>v<v<>><<><^v>>>^<<^vv^^>>^<^^v^>v^<><<^>v>^v^<<><><>v^>>>v>><<^^v^vv^v<><<v^vv^>^vvvv^>^><><v^<^^^v^vv<<v>>>>v^>>^vvv^<><^v>vv<>^><><^>v>vvvv>^^><v>vvv<v>><^>^v>>^>v>^v<>>>>^^>^>v>^<vvv^^<vv<>^>^^>>><^<^^v<v<^v<^^v^>^^^^>^v>v<<v>v^vvv>><v>v^<^v^v<^v^v<^<<>^v^<>>v>v>^^<v<>vv>^v<v>><v><>^^<v><<<>v<>v>v><<<<^vv>^>>v><<v<vv<<>v<^v>v<<>><<>^><<^>>vvvv^<^v^^>>vv>><^vv<^^^>>>v^>^v>vvvv^>>v^><<^<^>^>^<v<>>v><v<><><<<^<^vv^<<<>^<<^^<<>v<>><<<>>>>^>v><vv<^>^^><><v>^><<v>v>^><vv^v<>^v<^v^v>^<^v^^><<<>v>>v^vv>^^^^v><^>><><<<v^^^<<<^<v^>^^<>vv^v^<><v>^>^<>v<^^<vv<^>>>>^>^><v<vv^^>><v><<<><^>>^v<v<^v^^vv<<v^<^<>><<>vv>><<>v^^>v>vv<^<v<^<<vv>v<^>v^v<v^<<v<v<v<^>>>^v<><<<>^v<v>^<><^v<<<v<v<<^<^^<^^>vv>>^>^>^>>v>^<^v<<<>^v^v>^<vv^v<^^^v>v<>v>v>><^<<<v>><>v^^^v^<<vv<<><^v>>><^^^v>vv>v<>v<>^^>
>^^<^v>v<<^<v><>^^>^<>v<v^v>v>v^>^<^v^<v^<v>^>^>vv^<>><<>^v>^><vv^<<^>v^v<^^^>v<>v>><v><vv>><vv>vvv<>^^^vv<^v<^v^<^<>>v<>^<vv<>><vv<^<><<<vvvv>^<^><^<<v<v^vv>vv^>><vv^<><<<vv^<>>>^vv>v<v^v<v^<<>v^^>v^^vv<>><>^vv^<vv>>v>>^^<^^v<v<<>^>^^v<>^<vv^vvv^<<^^v^><<<<^v^^v><v<>>v^^v>^^<^<^>>v^v>^<<v<<>^v<>>^vvv<<v^^^v^v>^vv>^<<<>^^^<^^<v<<<>^vv^^^<>^^v>>><v>><<v^v>^>v<v<<^v<v^v>vv<^><>^<><>^^<v>>>^<<^>^^<>vv^vv<>v<<v>^>vvv><^<^v><v^>vv<^^^>v>>vv<>><^^<v>v^^vv>^<<^<<^>v^>v^<>^<>v^v<v^vv<><>v><^><v^<<>>^<v>^<><>>v^vv^<v<>^<^>v<>>>^>>><<><>>^<vvv^>v>^^>>v><<^^v<v><>^<<><>>>><vv^^^<<v^<<v>^>><><^>>>v^vvv^^^<><>^<^v<>>v^>>vvv>^<><v<v<^>^vv<>^v>><>><>v^v>^^>vv<^<<<v<^<^>^^^v<><^<^v>vv>^<>v<<^vv^^vvv>><>>v<<v^v<>>v^^vv^>^<<<vv>^^v<<v<<^>^>v<^^<<^vv><>>^v>^^vvvv>^<^<v^<^>v^<vv<^v<<<v>^v<v^<^>v><^^^v<>>v^v^^>v^^^^^<v<^v<>^^>^v<<><<<^vv<<^v<v<<v^v>v^<vv^><<^<<>>><<><v><<><><vv<<vvv^>vv>>^^>>>>^<v>^v^^v<vv<><<>>^<<vvv>>>>^^<>>>vv><<>>><v<v>^<^<>vv>>v^>v>^>>>^>^>>>>>>^>>><^^v><<><^vvv^>^v^>^>>^v>v^v<>^><^>v
^^^<^vv>^<<^<<><^<<>v^<^^vv><^<vv<^^<^v^^><>^v>v<>^v^^vvv<v><^<>vvv<v^<>^>><^vvv<v<^><>^>><>>^>v<>>>>>v^^<^<>^>^<^<<^^<>^>^>^v^v<v<^v<<^<vv><<>v>^v>>>><v<>^>v>>^v<>><>^>^>v<^<^<^<^<<<v^<<^<^vvv<^^<v<v><>^^>><v<>^<>vvv<<><vv<^<v>><>^>vv^>^^v^^><vv>v<^^>>>v^v<><^^<v^<vv>vv<v<^v>v>v<<^<^>^^<v><<^v>>><^^<^^v<>v^><<vv^>>^v^<<>v>>v>^^>><<v>^<<<^><^^vvv^>^>v<^v<v<>^>^><<^v<>>^><>^<v<><>>vv<><>v^<>v^<^>>vv><^v^v<<<>v><v^vvv<>^<vv^v<><^v^v<<<^<>>vv^<^^>>^v^<<v>v<^vvv<>v^v>><^v>>^v^^^><<^<<v><v<v^>^<^>^vvvv<^v>^>>><vv<^vv^v>^v<<><v<^v><<^>><^^<v^>v^^^v^>vv<vv^>v^^>^v<<v>^>vv^^^v>><<>vv>>^<v^<>^<>^v>v^v<v^v><<^^^>>^vv<>>v>vvv<v<^vv^<^v^^<v^v<v^^v<^><^v<<>^^v<^>v>^>v>^<>v^<v>v<><vvv<<v^v^v>>>^vvv^v^<>>>>^v^<<>>>>v<>>^^^^><<^^^^<>^<v<v<^<v>>^<>><<^<<>>^>>vvvvvv^><^^>^^^>^>v<^^<vvv^v<<vv>^^>>v>v<><^<^^>>^>>^v><v<v^^^v<v<vvv<vv>vv^vv<v<>^v<vv^vv<^<vvv<<><>>v<<<><<v<v^>vv^<^<v^<vv^^^<v<>v>v><>^v>v<^<>>^>>v<<<>^<v^v^^v>vvv<v<^>>v^<<^^>^<>vv><>^^<vv>^v>v^>vv<^^<>^<>v<v^<vvv^<>>vvv<^><<<>^>>^^>v^v<<>^v>>
v^^v<<v>v>><v>><<>^>^>^v><^^v<^^^^^v^^<>><>>>^<<><^<<^<v<>>^<^^^<>>>>v<<>>>vvv<vvv>v^<v<>v^<><v<>v^^>>^>>^<^^v^>v<>^>vv<>>>>vv<v>v>v^v^vv>v<vv><>>vv^<>v^<>><v<<<<v<<<<^<<>v<<>vv<<>^>vv<><vv^<>v>^<vvvv<^^><><^v^>>^<^<<>v^<<^<v<^vv>><><>^^><v><><<>>v<<v^v^^^<v>^vv<>^>>v<><^>^<<>^>v^><><>^<v>v>^<v><>v<<v^^v^vv>^>^v>^>>^>^<<><<^>^><><^v^><^vvv<v<>v><>^v>^>vv<^v<v<>><^<vvvv>^^^>><<v<>^v<<><>v^^^^^^<v<v<<v^^vv<>^vvv>^<<<<>v^<<^><<^>vv<^><^v<v<^<<>v<v<v<^vv^^<v^^v<v>^>^v<vv^<v>vv^<v^>>>>><<<^^vv><^<v<<<>><^>>v^^>^^><^vvv<<^vv^^<^>^>v^vv<v<<vv><><v<v<><^>v>v><>>^>>^^^^^v<>^^>v^>^>^^<^<^<v>^vv^^vv^>v<v<<>v>vvvv<>v^>^<^^v>^>^v<v^v<<>v>v^v<v><<><^v>>>vvv^^<<>><^<vv>^>^<v^v^v><v^vvv>vvv^>v<^><vv^>v>>^<>^<vv^^<^v<><>v><^<>><<<>><<<^<vv<>>>>v>vvv^>><<v^^vv>><v>>>>^>v>>v>^>^>>><><v<<<^>^><<^<^>v^^v^>^^>^>^<>^v^>^v<v^^><>v^<<>v^v>v><vv<><^>>v>><v><<>v<v>><<>vvv>><^^v<>>v>v^>>vv>^<^>^<><v<v<><v<vv>v<v^v^<><<v<<^vv<v^><^<v>vv<^>v^v<^<<^<^v<^v><^vv<v^>v><v<<<v<>^<>^vv^>>><^^<^v<^^<^<v>v^vv<<<>^v>v<<>v>><
<>>vv^v>v<^<^^v^v^<^>>><^^<<<^<<^<^<<>v^^^^^<^>v^>vvv^>><^<<>>v^<><<v^v>><<^^<^^><<><vv>>v^v^v><v<^<^v<<>><^^><v>>v>v<^<><^^><<>^<<vv<v>^v^^v>^^<^<v>v^^v^<^v>^<><<v^^^^<><vvvv<v<<<^^v^<><v<<><v<^>>^<v<v>>^^^<v<<>^<><^^<<>v>^<v^^^><><^<><^v<v<>^^<v><^^<^><vv><^<<^^^>v<<>^><vv^>>>>>>v>^>^>><<vv^<<<>^^>>^v>^v>><^vv^v<<^^^<^v^v^>v^v<v>>^<<^vvvv>v>^^>><<<<<vv>>^v^v^><vvvvv^<^vvv<><><><<<>><^<^^^^vv<>><v>>>><vv>^v>>>>>v^<^<>vv^<^^v^^>>^<v^^<>^<^<^<><>>^><^>^<<v^v>^^>v<^^>><^<^vv^v^<<^>>>v<<vvvvv><^>><<^v<^<^<>v<^vv^^^v<^v<^^vv<v^^v>>^vv<vvvv>>>>v^^^>><>v^>><<>v>^^<v<<>^<^^<<>><>v>>v^v<^>vvvv^^^^vv><>v>^v>v^v><<>^vv^v>>^<>^^^^^v^v>^^vv>v>>>v>^<v>^^vvvv^^>^^><^vv><><>^v^>>v>v^><><^^^^<^vv>^^v>^^>^vv<v>v^^>^>^^v^<^>v^vv<>vv^<<><>^>vv^^v>vv^^<<>>^v^^<<^>^><>v>>^<<<v>v>^<v<vv<>v<<<vvv<<v^v><<vv^vv<^^><>^v>^^^>>v<^^v>>v^>v>>>^vv^>><<><<vvvv<<>><v^vv><^^^v<^>>vv>>>^^<v^<v<^^<^<>^vv>>v<v>><^^>v><><v>>^>v>v^<>vv<<^vv>>^>^vv><v^^>vvv<v>^>>vv^^<>><>v^>^v>v^v>^>>v<^v^<><v<><>^v<>>><<>^v><>v^vvv>vvvv>^<<
^^><<<^^v>^v<<^<^v<^v^v><^v<vv^><^>^v<<vv<>><^^<<^>><>vv^vvv^v<vv<<^v^^v<>>v<>v<<>vv><>vvv<><^vv^^<<^<^v<>^<^<><<v<v<><><vv>^>>^v>>^v^>><^><vv>^><^vv>>><v<>>^>vv^v^<<v><>^^<^v^<<v<<>v>>^<<v>v^v>v><v^>v><^<v^>>^<vv^>vv>v<^v^vv<>>^>>^>v^^^^^><<>vv^vv<^^>^>^<<^^^>v<>vv<^^<<v^<<v<>^<v<^v<<^^^>v>^>>><^<<>^<>^v<<>^>v^>vv^^^<>^^<><v>^><v^^>>^^v^<v^v><v>v>vv<<<^>>><v<^vv>v>>^^^>^^v^<^^>^>^>>>><^^>^<^^><v>v<<^v><v<>^^^v>^^^>^<^^>v<<^v>v<v>v>v^^>^>v>^vv>>v^<v<^^>v<<<><vvv<^>^<^^v><^^<^<v<<^>^v<<^vv>>v>vvv>^v>vvv<vv^^^vvv^^>>^<><><v<<vvv>^><<<^v^^^^v^^>v>^>v<^v<<^>^vv^<v^^>^<>>^<^<<vvv>v>^<^^<>>><>><<v^<>v<>><^vvv>v>><v>>^>v<^^>v^^vv>v^^<><^v<v^^>v^^v><^^<>^>v>>vv<v<><>>^<<^^vv>v<v<^v^<<^^^>v<^^v<v^v^>v<v^^>^<<^v<>>v<>>>>^^v>v>>^<^v>vv<^>^<<><<^<><v^>>^<<v^^v^^^<<<>^><>^<vv><v^>>v^<>^^<^<>v<v>^v<>v><<>^<^^^v><vvv>^<^<^><v^^>>>><>^><<v<>v>^^<^>^<><v><vv>v<vv<v^>>^^<<^v^<><^v<>^v<<v^v^v<><<<<<^^<^>v<v<><<>^v^>^v^v>^<^>^<v><^>v<<vv<<<<v^<^vv<>v^v>^v>>^v<>v<^vv<>>^^^<>v><><>><>v>^<vv^^^<^>>v^<v<vv<>v
vv<<>>vv<^>^^<<^>v>^v<<^^<v<><v^><<^^><vv>^>>vv<<>^v><>>>^^<<<v<<>^vv>vvv<<><<><v^^>v^<v^^>v>v>vv^>v>^v<v<<<vv>^<v><v<^>>^>>^v>><>^<^><<><>>>vv<<vv>>>v>><>vv<<>>v<vv^>v>^<vvv^^v>^vv<><vv^>^^<<<^^v<>v^^<<<><>v<^^>v<>^vv>^v>>^^^<><<^^^<<<v>>>^v^>vvv^v>v<^v<<>>^<v<<^>v^^v^<v<<><^<>^<vv^^v<>^<<v>>v><>><><<^v<<vv<<>v<^<<>>><>>vv^>^<<>^^v>^><v>^<<^v>^>v^>^vv<^v><^^v^<>v^<^>>^v<<v>^^^^^v^^>^<<v<<>v<v^^<<<><><^><^v<^<>v<^v^v>^<v^vvv>>v><^><><v<^^><^v^<<><v>^>^>^^v^<v<^<><<v<>^<>^>vvvv^v^v^v^v><><><>v^<v^v<<>^v^<v^^^v^<v^v<<v^<><<v<>>>vvv^<>^<^^vv^^<<<^v^>>>>>^^>>^>>^^>^v>vvv<<v<v^^<<<v<v^^^<>^^v>^<v^v<v^>^v<vv>^v^^<<^><vv>>v>v>^^>^<<^><>>^v^><>^^>v>^<<>^^><<v^<vvv>^v>^>>^^^<>>><<^^^<>>v^<><><>v^v>><v<^vvv><^<^<^v^>v^vvvv^v>>vv^>v<<^^^<<>>^<>vv><^><v^v<v^vvv^v^v>^v>v^<^^^v^>v^>^<>^v^v^v<<<^>^<>^>v<^>>>vv<<>>^vv<>^><v>^vvvv>v<<v>v^v<^vv<^^^v<^<>^><>>v>^><<^<>><^^<v^v>>^<v>v^^<^^vv^<<>><v<vv^^^>v<^v>>><<^^v><vv<v>^<^v^^^v<vv>>^^^^<^^^<^>v<^<>>^<^>vvv<^<v>><>v<^^>><^><^v<vvv^v^^><><<<^^v^^><^v<<>v
^vv<>v>^v>^<><vv^<>^v><vv^vv^^v^<<<v><>><><^>^^^^<<vv>v^<>^><>^v<<<v^^><v^<v^v^v^>vv<v<^>>>v^<<v>>v<v^>><>v>v^^<<<>>^v>^vvv<v^><vv^><^^^><^v>>v^vv<<>><>v<>>v<<<^<<<^<><<<<v><<v<v<><>>^v^vvvvvv^v^<<v^<^<>>v<<v^>v<>vv<><<<v>^v><><v^>>><^v^v>v<v<<<><vv>>v>>v><^v><<v>>^vv>v^v<v>^^>>>v>v^v>vvv<<<>>>v^v><<<>v>>^><<^vv<>><vvv><^>^vvv>v<<<<>^>v<^^<><v><^<^>>^vv<^v>^<v^<<>v^>^^>^^><^vv<<^<><<<v><^<<^v<vvv^>^v^>^><v^>>>^v^><<>>^^v^<<^<>>v^>vv><>^^<^>^^v^v<<>^^<v^<v^<<^<v>^v<>>><v<<^vv<><<^^^<>^^>^>v^^>^v^^<^>^^>vv>vvvv<^v>v<v^<^^v<v^^>^v<>^v<<^>>v>>^^v>^^v><vvv<>v><^^v<<<<v>vv^<><v>><<>vv^<<><^<<^^^<v<^>v>^<<<<^>v>^v^^><>^<^vv><vv>v>>^^>>^><^>^<^v^>^<v<^<^<^>>>^>v<<>><^^<<>vv><^<<<>v>^^v>v<v^^>vvv>v<>>><^^>^>^vvvv^vvvv<>v<^v^^^^v<>^^>v^^<^^<<^<>^v<^v>>v^<<^<>v^^v^^<vv><v<v^<^v<<^^v^<<<v<><^><vv^^^v>>v<>^<v^vv><>>^<><<v<<^v>^^^>><>v^<v<^^^v<v><^><^v^^>>v<<vv<<vv^<>^<>v^<>^vv>v<^^<^vv<>vv>>^vv>^v<<^>>^^>vv^><^><v^<^<^^>><v><vv^<<^<vv<v<v><^>^>v^v^vv>v<^>><^>v>v>v><>>^<<><^v<^^>v><v>>>^v><<>^v>>v>^
<v^>>^^>^><<<>v>>^><<><v<<^><>^<><>>^>>>v^vv<v<^v>^<<>^>^<vv^<^vv^>v<>>><v<v>>v<<vv^vv^>v<>v^>>v<<<<<v>>v<vv^v>v^v^<<v^^>v^>^>>vvv<>>^vv>^v^><<v<<>^^^<v<v>v<>>v^vv<v>^v^<^^v>>>v<>^v^<^vvv<><>>vv^>v<<<<>>vv<<vvv^^vvv^v^>>^v<v>>><^><^^^<vv^>>v<vv^<><<>>>v>^v^<^<vv>>v^^<v^v<<<><<vv^vvv^>v>v>>>v>^>^<vv>v<^<^^<^vv<v<>>^<>^v>vv>^<v^vv^>^>><^v^v>v<<v><<v<<>>v^^^>^^>^<>^>v>>v>><v<^<>>><v>vv><vv><>>^v^>>v^^v^><>^><>^^>>>v^<>>>v<v^>^>v^^>>>>v>v<^v>><v<>^v^><>^^<>^<<<>^<>>><v>>>v><>^v^v^<<<<v^^^^>^<<<<>v<^^^v><><>^^v^v<^^^<v<vvv<<^>^>^<^^<v<>^<<v^><v>>vvv<^v^>^v><>v^v^^<>>^v><<v<<<^v><v><<<v<v>vv^^>v<^^<><<<>>>>><<v><<^<>>^v<vvv>>vvv<<v^<^v^<>>v<<^><v^^<>>v>v<>><vv<<^v>^>^^v>><^<^<^^^v<v^vv>v^<><v<^vv><^^v<^<^<>^>^<v<^^>v>vv^v>^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<^v>^><vv<>v>v<^^<>v<v^^^<^<^^<v>^><v>^v^>>v^^>^v<v<>^>v<^vv^^^v<><v^vvv><>^^^>v^^>^<^^><^v^>><^^v>^^^v^>>><><v><<<>><<<<>v>^>>>^^^v<^^^><<>>>^v<><>v<^vvvv>^<><>^<<<>v^^v^^>vv
<><^>^v^>v^^^<>^^^<><>>>>vv<<v>^v><v^v^^^>v>^^><<>v>^<^v^vv^<vvvv<><>>^<v<<>^^^<v<^vv^v<^v>^v^>vv^><^><v<^^^>>^v^v^^vvvv>><<<v<<vvvv<>vvv><><^^>v^>><>^<>^^v^^v>^<v^<>>^^v<vv>^^>v^><^^v<^><>vv^<^^^>>vv^^<<<>>^^v^>v<^<^v>>>v>>><<vvvv<v<^^><>><><v^vvv>v^^v<>v>^v<<^^<v<<v<v<>vv^<<v<<^>>v^v>^<<<>>v^<>v^>vv>v^^>v<>v>v<v^^>>><>^<<^v^<v^v<^v^^v<><^<^<^vv>>^>vv^^>>^<><>^<v>>>vvv^>v^^>vv^vv<<>v><v<<^vvv><<v<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<v<^<>^v<<^v<v<v^^<<vv^^v<>vv^>^^<v>>>><>^>^^<v^v>>><<vv<<^>v>>>^v>^>>v<^^v<>^vv<v^>v>^^>>>v^>v<<v<^^^^><^<^v><^v>^^>^v>^<>v^<vv^><v<>^<>vv>v><><v><v^<vv><^v^>^^<<<<>><<><vvv<vvv>^^<<>v^><v^<^>^^>^^vv<^^v^^>^>vv>>^<>v><<v>v>v^^<v>^vv^vv>vvv^>vv>vv^<v>>>>v<^^><^>>vv>^><<><^><<v>v>><<v>>vv^<><<^<^<>^><v<<<>v>v^v<<v<^><>v^><<v^<>^^v<>^>vv^v<v<^<<v<vv<>>>>^^^v>>>^><<<^<^<^^v<<<v^<<^<><>><>^^vvv>^vv>>^v<v^^><><^v<><vv>v>^v^><>^v<<v>v^^^><^>v^vv<<<v<>vv>v<v^<<vv>><^v<^<v<vv>^^><^^<v>
<v^v><^<^v>vvv^v<^v^^>vv^><><>vvv<v<><v>><>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>^>vv<v^<>>^^v<^<>>><>vv>>vvv><^v>^v^v^<^>^vv><^<^>^<v<^>><^<><<^^vv<vv^<v><v^<>>>^>v^^^v<<v<v^<<^^^>><v^^^<^^><<vv^^<>^v^<><v^><^>>v^<v<v^^>^v<^>v>^<v<>^<>v<<^vv^v><^v^v<^vv^><><^^<<v^<^v^v>>v^<<^^vv^<<>^v^^^<<<><<>>^>^>v><<>v^<<>v<^v^<v^><><<v^^><^^<>vv>^vv^^v^v>^><^vvvv^v^<v<<vv<<^<v^>>^<^^vvvv^<^<v<<v>v<^<<<v><>v>><>>^<vv>v^^><>^v>^v><<<^^^^^<<^><<v^v<v>v^>v<v^<>>v>v^^^^v><^><vvv>>^>^><>v>vv<<<v^v<^<vv^<>>>^><>v<><^<><v^<>>^^<^>^^^v^^<<>>vv>><^<<v><<<>^v<<^v^v<<>^>^vv>><>v<<vv^>^^<>v^>v>>vv<^vv<v>>>>>v<<vvv<v><>v><><^<<^<^><<<<>v<v<<vv^v>>>v><>v<>v<^vv><<>v>><v^>v>vv><^>><>>>^^^>v>^<>v<v^v<><>v^<^v<>v^^^vvv^^v^vvv>vvv^v>>^<^>^v<^>>>^<>>^v<<>v<^<<^><<v^^>>>>^<><^v^^><>><^>vv>^>vv<^v^>v^^v^>^<^<v^>>^vvv>>vv^^vv^><<v>^^<<><^>^v^v>>^<v<><^<^^^<<^>v>>^vvv>v>><^>^<^v><v<<v><^v>^<v<vvvv>v<vv<v^^><v<^>^^<<^>^^<<>>vv^^<^
<<<^<^v<^v>>v<v<<>^^>><><^>v<vvvvv>v>^^^vvv<<<v^<^^<^^v<>>^>v>^><<<<v^v><^v<v<^>v<v<^>^v>^>><<^vv>^^<>v>>><v^>>><><^vv<>v<^><^>>>v<^>>v^<^>>>^>^>v^>vv>^>^<v<vv<<<<^^><v<>vv<v^<><<v^v>^^<^vv^<^><^<^<vv>^v^<<v^<v^<v^<^v<>><<^><^>>^<v^>^<^>^>^^<^v^>><^>>><><^^>v^v>vv^^v>^><<^<<<><<<^v>><vv^>>><<<>v<>^>^v^<>^><>^>><<<>>^v^vv^v^<^<<>^^<<^^>^^v<>^vv>v>v^^v^<vv^>><v<^>^v<^^v><v<^>^<^v><<>^<^^v<^^v^<><<>^<vv<^vv^^^>^<<v<>v>vv>><^>v>v<vv<vv^^><>^v>v<<<><vv<<^<v>v^<>vv<>^<^>vv^^<^<^>>><<vv<>v^^vv><<^<>^<<<>v><v>vv^><^>><>><^^><^v>v>><>><v^<v^v>v>>v^<vv>^<<>>v>vv^>^v>v<^>><>>vvv<<vv>^>^>^<vvv^v><vvv>^^>^>^>^><>v><^<v^^^<<<<<v^^<<^<<^^>>>vv><v<><^v>>^>>v^<^<<>>v<>v>v^^v^<>><>><>^>v><^<>^><>v><<<^v<<>>^^<^^>v^>^>^><v>>v^v^>^^v>vv^v<<v^^^v<>vvv><>^^>vvv^>vvvv>^^^>^<^^>v<^<vv>vvv<<>^<<<>^<vv^v>>^v>v>v^><><^>><v<^vvv>>>^>^<^^^<vvv>><>vvvvv<v^>^v<v<>v>^>^>>v^v^vv^>^>>v>>^^v>>^^><>v<^<<>>^>><vvvv>^^><^<vv>>>v><^>v^^><<v^v<<^<>^>v^<<>^><vvv^<><^^>>^><<vvv<v<>vv>>^^<<><vv<<>>>^><<v^^^><<v>^v>v<<v>v^>v<<>v

225
2024/go/day16/day16.go Normal file
View File

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

View File

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

141
2024/go/day16/input.txt Normal file
View File

@@ -0,0 +1,141 @@
#############################################################################################################################################
#.....#.....#...#.................#...#.......#.........#...#.......#...#.......#.......#...#...#.....#...#.......................#...#....E#
#.###.#.#.#.###.#.###.###.#######.#.#.#.#.###.#.###.###.#.#.#.###.#.###.#.#.#####.###.#.###.#.#.#.#.#.#.#.#.#####.#.###.#.#######.#.#.#.###.#
#...#.#.#.#...#.....#...#.#.....#...#...#.#...#.#...#...#.#.#...#.#...#.#.#...#...#...#.....#.#.#.#.#...#...#.....#.#.#.....#.....#.#.#...#.#
#.#.###.#.###.#.#####.#.#.###.###########.#.#####.###.###.###.###.###.#.#.#.#.#.###.#######.#.#.#.#.#########.#####.#.#.#####.#####.#.###.#.#
#.#.....#.#.#.#...#...#.#...#.....#.....#.#.....#.#.#.#.........................#.#.......#.#.#...#.....#...#.#...#.....#...#.#...#.#.....#.#
#.#######.#.#.#.###.#.#.###.#.#.#.#.#.###.#####.#.#.#.#.###.###.###.#.###.#.#.#.#.#######.###.#.#####.#.#.#.#.###.###.#.#.#.#.#.#.#.#######.#
#...#...#.#...#.#...#.#...#.#.#.#...#.#.......#...#...#...#...#.#.....#...#.#...#.......#...#...#.....#...#.#.....#...#...#...#.#.........#.#
###.#.###.#.#####.###.###.#.###.#.#####.###.#.#####.###.#.###.#.###.###.###.#####.#########.#.#.###.#.###.#.#####.#.###.#######.###########.#
#...#...#.#.#.....#...#...#.#...#.#...#.#...#.#...#...#.#.....#...#...#.#...........#.........#.#...#.#...#.........#.#.#.......#...........#
#.#####.#.#.#.#######.#.###.#.###.#.#.#.#.###.#.#####.#########.#.#.###.#.#####.###.#.#####.#.#.#.###.###.###.#####.#.#.#.#######.#########.#
#.#.....#.#...#.......#...#.#.#.....#.#...#.#.#...............................#...#.#...#...#...#.#.#.....#.#.....#...#.#.#.....#.......#...#
#.#.###.#.#####.#.###.###.#.#.#.#.###.#.###.#.###############.#.#.#.#.#####.#.#####.###.#####.#.#.#.#####.#.#####.###.#.#.#.###.#######.###.#
#.#...#.#.....#.#.....#...#...#.#...#.#.....#.#.....#.................................#...#...#...#...#...................#...#...#...#...#.#
#.###.#.#####.###.#.#.#.#####.#.#.#.#.#######.#.###.#.#######.###.#.#.#.#.###.#.#########.#.#.#.#.#.###.#.#####.#.###.#.#.###.#.#.###.###.#.#
#.#...............#.#...#...#.#...#.........#.....#.#.#.......#...#.#.#.#.#...#.#.....#...#.#.....#.....#.....#.#.....#.#.#...#.#...#...#...#
#.#.#####.#.#####.#.#####.#.#.###.#########.#.#####.#.#.#######.###.#.###.#.###.#.###.#.#.#.#.#########.#.###.#########.#.#####.###.###.###.#
#.#.#.....#.....#.#.#.....#.....#.....#...#.#.#.....#.#.#.......#.#.#.....#.#...#.#...#.#.#.#.........#...#.#.........#.#.........#...#...#.#
#.#.#.#####.#####.#.###.#######.#####.###.#.###.#####.#.#####.###.#.#######.#.#.#.#.#.#.###.#.#######.#.###.###.#.###.#.#########.###.#.#.#.#
#.#.......#...#...#...#...#...#.....#...#.#.#...#.#.....#.....#.....#...#...#.#...#.#.#.....#.#.......#.#.......#...#.#.....#.......#.#.....#
#.#######.###.#.#####.#.###.#.#########.#.#.#.###.#.#####.###.#######.#.#.#########.#.###.###.#.#######.#.#####.###.#.#####.#.###.###.#.#.#.#
#.....#...#...#...#.#.#.#...#.#.........#.#...#...#...#...#.#.#.......#...#.......#.#.#.......#.........#.........#.#...#.#.#...#.....#.#.#.#
#####.###.#.#.###.#.#.###.###.#.#########.#####.#####.#.#.#.#.#.#############.###.#.#.###########.#######.#######.#.#.#.#.#.###.#######.#.#.#
#...#...#.#.#.#...#.......#.#.#.#.......#.......#.....#.#.#...#.............#.#...#.#...#.......#.........#...#...#...#...#...#...#.....#.#.#
#.#.###.#.#.#.#.###########.#.#.###.###.#.#.#####.#####.#.#####.#.#########.#.#.###.###.#.###.#.###########.###.#####.###.#.#####.#.#####.#.#
#.#.#.#.#.#.#.#.....#.....#...#...#.#.....#.#.....#.#...#.....#.#.#.......#.#.#...#.#.....#...#.#.....#.....#...#.......#.#.................#
#.#.#.#.###.#.#####.#.###.#.#####.#.#######.#.#####.#.#####.#.#.#.#####.###.#.###.#.#########.#.#.###.#.###.#.###.#####.#.###.###.###.#.###.#
#.....#.#...#.....#...#...#...#...#.#.....#.#...#.#...#.....#...#.#.....#...#.#...#...#.......#...#...#...#.#.#...#.....#.#.#.........#...#.#
#.#####.#.#######.#####.#####.#.###.#.###.#####.#.#.#####.#.#####.#.#####.###.#.#####.#.###.#######.#######.#.###.#.#####.#.###############.#
#.#.....#...#...#...#...#.....#.#...#.#.#.......#.#.......#.....#.#.....#.#...#.......#.#...#.......#.....#.#.....#.....#.......#.........#.#
#.#.#######.#.#.###.#.#######.#.#.###.#.#########.#############.#.#.###.#.#.###.#########.#.#.#########.#.#.#####.#####.#####.###.#######.#.#
#...#.....#...#...#.#.......#...#...#...#.........#.......#...#...#...#.#.#...#.#...#...#.#.#.#.....#...#.#.....#.....#.....#.#...#.....#...#
#.###.#.#.#.#####.#########.###.###.###.###.###.#.#.###.#.#.#.#########.#.#.#.###.#.#.#.#.###.#.###.#.###.#.#.#######.#####.#.#.###.#.#####.#
#.#.....#.#.#...#...#.......#.............#.#.#.#.#.#...#...#.#.........#.#.#.....#.#.#.#.#.....#.....#.#.#.#...........#...#.#...#.#.#...#.#
#.#.#.###.###.#.###.#.#########.#####.###.#.#.#.#.#.#.#########.#.#####.#.#########.#.#.#.#.#######.###.#.###########.###.###.###.#.###.#.#.#
#...#...#.....#.....#.#.........#.....#...#.....#.#.#.#.....#...#.#...#.#.#.......#...#.#...#.#...#...#...#.............#.#...#...#.....#.#.#
#####.#.#######.#####.#.#.#############.#####.#.###.#.#.###.#.###.#.#.###.#.#####.#####.#.###.#.#.#.#.#.###.###########.#.###.#.###.#####.#.#
#.#...#.......#.#.....#.#.#...#.............#.#.#...#.....#.....#...#...#.#...#.#...#...#.#...#.#.#.#.#...#.#...#.....#.#.#.....#...#...#...#
#.#.#.###.#####.#.#####.###.#.#.###########.###.#.#############.#######.#.###.#.###.#.###.#.###.#.#.#.#.#.#.#.#.#.#####.#.#.#.###.###.#.#####
#...#...#...#...#.#.#.......#.#.#.......#.....#.....#.........#.........#...#.#.....#...#...#...#.#.#.#.....#.#.#.........#.#.#...#...#.#...#
#.###.#.###.#.###.#.#.#######.#.#.#####.#####.#.#####.#######.#.#####.#.###.#.#.#######.###.#.###.#.###.###.#.#.#.#########.#.#.#####.#.#.#.#
#.......#...#...#.#.........#...#...#.#.....#.#...#...#.#.....#.#.....#...#...#...#...#.....#...#.#.....#.....#.#.#.........#.#.......#.#.#.#
#.###.#.#.###.#.#.###.#########.###.#.#####.#.#####.###.#.#######.#######.#######.#.#.#.###.###.#.#.#####.#####.#.#.#########.#########.#.###
#.#.....#.....#.#...#.#.......#.#...#.....#.#.......#.....#.......#...#.....#...#...#.#.#...#...#.#.#.....#...#.#.#.#.........#.....#...#...#
#.#.#.#######.#.#.#.###.#.###.###.###.#####.#.#.###.#.#########.#.#.#.#.#####.#.###.#.###.#.#.###.###.#####.#.#.###.#.#####.###.###.#.###.#.#
#.#.#.....#...#.#.#.#...#...#.#...#.....#...#.........#.........#.#.#.#.#.....#.....#.#...#...#.#...........#.#...#.#.#...#.......#.#...#.#.#
#.#.#.###.#.#.#.#.#.#.#####.#.#.#######.#.###.#########.#.###.#####.#.###.#####.#####.#.###.###.#######.#########.#.###.#.#####.#.#.###.###.#
#.#.#.....#.#.#.#.#.#.......#.#.#...#...#.#.#...#.#.....#.#...#.........#...#...#...#.#.#...#...#.....#.#.....#...#.....#.#.....#.#.........#
#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#.###.#.#.#####.#####.###.###.###.#.###.#.#.#.#.###.#.#.###.###.###.#.#.#####.#.#.###.#.#########.#
#.#.......#.#.#...#.#.#.#.#.#.#...#.#.#...#.#...#...#...#.#...#...#...#...#.#.....#.#.#.#.#...#.#.#...#...#.#.#.#.........#...#.#.....#...#.#
#.#######.#.#.###.#.#.#.#.###.#####.#.#.###.#.#####.#.#.#.#.#.###.###.###.#.#######.#.#.#.#.#####.#.###.###.#.#.#####.#.#####.#.#######.#.#.#
#.#.......#.#...#.#.#...#...#.#.......#.#...#.....#.#.#...#.#...#.....#.#.#.......#...#.....#.....#...#.#.....#.....#.#.#.....#.........#.#.#
#.#.#####.#.###.#.#.#.#.###.#.#.#######.#.#.#####.#.#.###.#.###.#.###.#.#.#######.###########.#######.#.#.#########.###.#.###############.#.#
#.#...#...#.#...#.#...#.#...#...#.#.....#.#.#.....#.#.#...#...#.........#...................#.#.....#.#.#.........#...#...#.......#.......#.#
#.###.#.#.#.#####.###.###.#.#####.#.#####.#.#.#####.#.#.#####.#########.###################.#.#.#####.#.###.###.#.###.#####.#######.#######.#
#...#...#...#.....#.......#.....#.#.#.....#...#.........#...#...#.....#...#...........#.#.....#.......#...#.....#.......#...#.....#.#.....#.#
###.###.#.###.#####.###########.#.#.#.###########.#.#####.#.###.#.###.###.#.#########.#.#.#######.#####.#.###########.#.#.#.#.###.#.###.###.#
#...#...#...........#.#.....#.....#.#.#.......#...#.#.....#.....#.#.#.#...#.#.#.....#.#.....#...#.....#.#.................#.#.#.#.#...#.....#
#.#.#.#####.###.#####.#.###.#.###.#.#.###.###.#.#####.#######.###.#.#.#####.#.#.#.###.#.#####.#.#####.#####.#########.#####.#.#.#.#.#.###.###
#.#.#.#...#.#.......#.....#.....#.#.#.#...#.#.#.......#.....#...#.#.#...#.......#.....#...#...#.#...#.....#.........#...#...#.#...#.#...#...#
#.###.#.#.###.###.#.###########.#.#.#.#.###.#.#.#.#####.###.###.#.#.###.#.#########.#######.###.###.#####.#########.###.#.###.#.#######.#####
#.#...#.#.....#...#.#.........#...#.#...#...#.#.....#...#...#...#.#.#...#.........#.........#.#.#...#...#...#.....#...#.#...#.#...#...#.....#
#.#.###.#.#####.#.#.#.#######.#.###.#####.###.#.###.#.###.#######.#.#.###.#######.###########.#.#.###.#.###.#.#####.###.#####.###.#.#.#.###.#
#...#...#.....#.#...#.#.....#.#.#...#.....#...#.....#...#.........#.#.#.........#.......#...#...#.....#...#.#...........#...#...#...#.......#
#####.###.#.###.#####.#.#.###.###.###.#####.#######.###.###.#######.#.#########.#.#.###.###.#.#########.###.#########.###.#.###.#######.###.#
#.....#...#.....#.....#.#.......................#...#...#.........#.#.......#...#.#...#...#.#.......#...#...#.........#...#...#.......#.....#
#.#####.#.#######.#################.#########.#.#.###.###.#####.#.#.#######.#####.###.###.#.#.#.###.#.#.#.###.###.#####.#####.#######.#.#####
#.#.#...#...#.................#.#...#.........#.......#.#.#.#...#...#...#...#...#.......#.#.#.#...#...#.#.....#...#...#...#.........#.......#
#.#.#.#.#.###.###.###########.#.#.###.#################.#.#.#.#####.#.#.#.###.#.#########.#.#.###.#####.#######.###.#.###.#########.###.###.#
#.#.#...#.........#.....#.....#.#.#.....#...#.............#.#.#.....#.#.......#.........#.#.#...#.........#.......#.#...#...#.....#.#.....#.#
#.#.###.#.#######.#####.#.#####.#.#.###.#.#.###.###.###.#.#.#.#######.#################.#.#.###.#.#.#####.#.#######.###.###.#.###.#.#.###.#.#
#.#...#.#.....#.........#.#.....#.#.#...#.#...#...#...#.#.....#.......#.........#.......#.#...#.#.#.....#.#.#...#...#...#...#...#.#...#.#.#.#
#.#.###.#.###.###########.#.###.#.###.###.###.#######.###.#.#.#.###############.#.#######.#.#.#.###.###.#.#.#.#.#.###.#.#.#####.#.#####.#.#.#
#.#.....#.#...............#.#...#...#...#...#.#.....#.......#...........#.....#.#.#.......#.#.#.....#.#.#.#...#.#.#.......#.....#.......#...#
#.#.###.#.#.#################.###.#.#.#.###.#.#.###.#######.###########.#.###.#.#.#.###.#.###.###.#.#.#.###.#####.#.###########.#.#####.###.#
#.#...#...#.#...#...#.........#...#.#.#...#.#...#.#.#.....#.#.....#...#.#...#...#...#.#...#...#...#...#.....#.....#.....#.......#.....#...#.#
#.###.#.#####.#.#.#.#####.#.###.#.#.###.#.#.#####.#.#.###.###.###.#.#.#.###.#########.#####.#.#.#####.###.#.#.#######.###.#####.#####.###.#.#
#.#...#.......#.#.#...#...#.#...#...#.....#...#...#...#.#.....#.#...#.#...#.#.#.......#.......#.....#.......#.#.#.....#...#...#.#.....#...#.#
#.#.###.###.###.#.###.#.###.#.#######.#.#####.#.#.#####.#######.#####.###.#.#.#.###.#.#.#####.#####.#########.#.#.#####.###.#.#.###.###.#.#.#
#.#.#.....#.....#.#.....#.#.#.........#.......#.#.........#.............#.#.#.....#.#.#.#.....#.....#.......#.#...#...#.#...#.#...#...#.#.#.#
#.#.#.#.#.#.#####.#######.#.#####.#####.#.#########.###.#.#.#####.#####.#.#.#######.#.###.###.#.#.###.#####.#.###.#.#.#.###.#.#.#.#.#.#.#.#.#
#.#...#.#...#...............#...#.#...#.#.#.......#...#.#.#...#.......#.#.#.#.......#.#...#.#.#.#.......#...#.......#.......#...#.#.#...#.#.#
#.#####.#.#.###.#######.#####.#.#.#.#.###.#.#####.#####.#.#.#.#.#.###.#.#.#.#.#######.#.###.#.#.#######.#.###.###########.#####.#.#.#######.#
#.....#...#...#.#...#...#.....#...#.#.#...#.#...........#.#...#.#...#.#.#.#.#...#...#...#.#...#.........#.#.....#...#.............#.#.......#
#.#.#.#.###.#.###.#.#.###.#.#######.#.#.###.#.#.#########.#.#.#.###.#.#.#.#.#.#.#.#.#####.#.#########.###.#.#####.#.#.#########.###.#.#######
#.#.#.......#.#...#.#.....#.......#.#...#...#.#.#.......#...#.#.#...#...#.#...#...#.#.........#.......#...#...#...#.#.#...#.....#...#...#...#
#.#.###.#####.#.###.#.#########.###.#######.#.###.#####.###.###.#.###.#######.#####.#.#######.###.#.###.#####.#.###.#.#.###.###.#.#.###.###.#
#...#...........#.#.#...........#...#.......#.........#.....#...#...#.#.....#.....#.......#...#...#.#...#.....#.#.....#...#...#.#.#...#.....#
#.###.#.###.#.#.#.#.###########.#.###.#.#################.###.#####.#.#.###.#####.#.#####.#.###.###.#.#####.###.#######.#.###.#.#.###.#####.#
#.....#.....#.....#.......#.....#...#.#...#.............#...#.....#.#.#...#.....#.#.....#.#.....#...#.#...#...#.....#...#.....#.#.#.#.....#.#
#.#######.###########.###.#.#######.#.###.#.###.#.#####.#########.#.#.###.###.#.#.###.###.#######.###.#.#.#.#######.#.#########.#.#.###.#.#.#
#.#.....#.......#...#...#.#...#.........#...#.#...#...#...........#.....#...#.....#...#...#.........#...#.#.#.......#.#.#.....#...#...#.#.#.#
#.#.###.#########.#.###.#.###.#.#######.#####.#.###.#########.#.#.#########.#######.###.###.#######.#####.###.#######.#.#.###.#.###.#.#.###.#
#.#.#.#...........#.#...#.#...#...#...#...........#.....#...#.#.#...#.....#.....#.....#.#.....#...#.#...#.....#.....#.#.....#.......#.#.#...#
#.#.#.#############.#####.#.#####.#.###.#.#########.###.#.#.#.#####.#.#.#####.#.#######.###.###.#.#.#.#.#######.###.#.#############.###.#.###
#.#.#...#...#.......#.....#.#.#...#.#...#.......#.....#.#.#.#.....#...#.....#...#.....#.....#...#.#...#...#.....#...#.............#...#...#.#
###.#.###.#.#.#######.#####.#.#.#.#.#.#####.###.#.###.#.#.#.#.#.#########.#.#.###.###.###.#.#.###.#.#####.###.###.###############.###.#####.#
#...#...#.#.#...#...#.........#.#.........#...#...#...#.#.#.#.#.............#.....#.#...#.#...#...#.#...#.....#...#.......#.....#...#.......#
#.###.#.#.#.#.#.#.#.###.#####.#.#########.#.#.#####.#.#.#.#.#######.###.#.#########.###.#.#####.#.###.#.#######.###.#####.#.#.#.###.#.#####.#
#.................#...#.....#.#.....#.#...#.#.....#.#.#.#.#.........#...#.....#.......#.#.#.....#.#...#.#.........#.....#.#...#.#.#...#...#.#
#.#.#.#.#####.#.#.###.#####.#######.#.#.###.#####.#.#.#.#.#########.#######.#.#.#####.#.#.#.#####.#.###.#.#.#####.#####.###.#.#.#.#####.###.#
#...........#...#.#.........#...#...#.#...#.....#...#.#.#...#.....#.#.....#.#...#.#...#.#.#.#.....#.#.#.#.#.#...............#.#.......#.....#
#.###.#.###.#.###.#########.#.#.#.###.###.#####.#####.#.###.#####.#.#.###.#.###.#.#.#.#.#.#.#.#####.#.#.###.#.###########.###.#########.#####
#.#.........#.....#.........#.#.#.#.#.....#...#...#.#.....#.....#...#.#...#.#.....#...#.#.#.#.#.....#.#...#.#.#...#.......#.#...#.......#...#
#.###.#.#.###.###.#.#####.###.#.#.#.#.#####.#.#.#.#.#####.#####.#.###.#.###.#.###.###.#.###.#.#.#####.###.#.#.#.###.#######.###.#.#########.#
#.......#...#.......#...#.#...#.#.#...#.....#.#.#.#.....#.#...#.#...#.#.#...#...#...#.#...#.#.#.#.......#.#.....#...#.....#...#...#.#.......#
#####.#.###.#.#####.#.###.#.###.#.###.###.###.###.#.###.#.#.#.#.###.#.#.###.###.#####.###.#.#.#.#.#.###.#.#######.#####.#.###.#####.#.###.#.#
#.......#.....#.....#...#.#.#...#...#.....#.#.#...#...#.#.#.#.#.#...#.#.......#.#.....#...#.#.#.#.#...#.#...#.....#.....#...#...#.......#...#
#.#####.#######.#####.#.#.#.#.#####.#######.#.#.#####.#.#.###.#.#####.#.#.###.#.#.#####.###.###.###.#.#.###.#.#####.#######.#.###.#########.#
#.#.....#.......#.....#.#.#.#.......#...........#...#.#.#.....#.....#...#.....#.#.....#.#.#...#.....#.....#.........#.....#.#.....#.....#...#
#.#.###.#.#######.#.###.#.#.#########.###########.#.#.#.#####.#####.###.#######.#.#####.#.#.#.#######.#####.###.#.###.#.###.#.#.###.###.#.#.#
#.#.#.....#.....#.#...#.#.#.....#...#...#...#.#...#.#.#.....#.#.......#.....#.....#...#.#.#.#.........#.....#.#.#...#.#.....#...#...#.#...#.#
#.#.#.#.###.#####.#.#.#.#.#####.#.#.#####.#.#.#.###.#.###.###.#.###.#.#####.#######.#.#.#.#.###.#####.#.###.#.#.#.#.#.###.#.###.#.###.#####.#
#.#.#.#.....#...#...#.#.#.....#...#.......#.#.#.#.#.#.#.#.....#.#.......#.#.#.....#.#.....#.#.......#.#.#...#.#.#...#...#.#...#...#.......#.#
#.#.#.#.#####.#.#.#.#.#.###.###.###########.#.#.#.#.#.#.#######.#.#####.#.#.#.###.#.#####.#.#.#####.#.#.#.###.#.#.#.#####.###.#.###.#####.#.#
#...#.#.......#.#...#.#.....#...#.........#.#.#...#.#.......#.#.#.#...#...#...#...#...#...#.#.....#...#.#.....#.#.#.....#...#...#.#.#.......#
#.###.#.#######.#####.###.#.#.#.#.#####.###.#.###.#.#######.#.#.###.#.###.#####.#.###.#.#.#.###.#.###.#.#####.#.#.#####.#.#.###.#.#.#.#.###.#
#.#...#.#...#...#...#...#.#...#.#.....#.....#.....#.......#...#.....#.#.#.#.....#...#.#.#...#...#.#.......#...#.#.....#.#.........#.#.#.....#
#.#.###.#.#.#.#.#.#.###.#.#####.#.#.#.#######.#####.#.#####.#.#######.#.#.#.#########.#.#####.#.#.#.#####.#.#.#.#####.#.###.#.#.###.#.#####.#
#.#.#...#.#.#.#.#.#.....#...#...#...#.#.......#...#.#.#.....#...#...#.#...#.....#...#.#.......#.#.........#.#.#.......#...#.#...#...#.......#
#.#.#.###.#.#.#.#.#######.###.#.#####.#########.#.###.#.#####.#.###.#.#########.#.#.#.###.#.#####.#########.#.#######.#.#.#####.#.#########.#
#...#.....#.#.#.#...#...#...#.#.....#.........#.#...#.#.#.....#.....#.#.........#.#...#.#.#.....#.#...#.....#.......#.#.#...#...#.#.....#...#
###########.#.#.###.#.#.###.#.###.###########.#.###.#.#.#.#######.###.#.#######.#.#####.#.#.###.#.#.###.###.#######.#.#.###.#.#.#.#.#.#.#.#.#
#.#.......#.#.#...#.#.#...#.#.....#.......#.#.#.......#.#.........#...#.........#.....#...#.#.....#.#.....#.......#.#.#...#.#.#...#.#.#.#.#.#
#.#.#####.#.#.###.#.#.#.#.#.#####.#.#.###.#.#.#.#.###.#.###.###.#.#.#.#######.#####.#.#.###.###.###.#.#####.#####.#.#.###.#.#.#.#####.#.#.#.#
#.......#.#.#...#.#.#.#.#.#...#.....#...#...#.#.#.#...#...#...#...#.#.#.....#.#.........#.#...........#...#...#.#...#.#...#.#.......#.#...#.#
#########.#.###.#.#.#.#.#.#.#.#.#####.#.#.###.#.#.#######.#.#.#####.#.#.#.###.#.#####.###.#####.#######.#.###.#.#####.#.###.#######.#.#####.#
#.......#...#...#.#.#.#.#.#.#.........#...#...#.#.#...#...#.#.....#.#.#.#...#...#...#.#...#...#.......#.#.#.........#.#...#...#.#...........#
#.#####.#####.###.#.#.#.###.#########.###.#.#####.#.#.#.#########.#.#.#.###.#####.#.#.#.#.#.#.#.#####.#.#.###########.#######.#.#.###.#.#####
#...#.........#...#.#.#...#.#.......#...#...#.....#.#...#.........#.#.#...#.#.....#.#.#.#.#.#.......#.#.#.........#...#.....#.#.............#
#.#.###########.###.###.#.#.#######.#.#.#####.#####.#####.#######.#.#.#.#.#.#.###.#.#.#.#.#.#######.#.#.#########.#.###.###.#.#.#.#####.###.#
#.#.#.......#.............#.....#...#.....#.......#.#.....#...#...#.#.#...........#.#.#.#.#.#...#...#...#.#.......#.#...#.......#.........#.#
###.#.#####.###.#.###.###.###.#.#.###.#.###.#####.#.#.###.#.#.#.###.#.#.#######.###.#.###.#.###.#.#######.#.#######.#.#.#######.#######.#.#.#
#...#.....#...#.....#.#...#...#.#.....#...#...#...#.#.#...#.#.#...#.#.#...#.#...#...#...#.#.....#.....#.......................#...#.....#.#.#
#.#######.###.#.###.#.#.#.#.#.#.#.###.#.#.###.#.###.#.#.###.#.###.#.#.###.#.#.#########.#.###.#####.#.###.#.#.###.#.#########.#.#.#.###.#.#.#
#.......#.#.#...#...#...#...........................#.#.#...#.#...#.#...#...#.....#...#.#.....#.....#...#.#.#...................#.#.#...#...#
#.#.###.#.#.###.#.#.#########.#.###.#.#.###.#.#########.#.#.###.###.#######.#####.#.#.#.#.#####.#######.#.#.###.#.#########.#.#.###.#.#.###.#
#.#.#.#...#...#.#.#.......................#.#.#.........#.#.#...#.#.#.....#.#...#...#...#...#...#.......#.#.....#...#.......#.#.#...#.....#.#
#.#.#.#####.#.#.###.###########.#########.#.#.#####.#####.#.#.###.#.#.#.###.#.#.#############.###.#######.#########.#.#######.#.#.#####.#.#.#
#S..........#.#...........................#.........#.....#.......#...#.......#...............#...................#...........#.........#...#
#############################################################################################################################################

91
2024/go/day17/day17.go Normal file
View File

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

View File

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

5
2024/go/day17/input.txt Normal file
View File

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

126
2024/go/day18/day18.go Normal file
View File

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

6915
2024/go/day18/day18_test.go Normal file

File diff suppressed because it is too large Load Diff

3450
2024/go/day18/input.txt Normal file

File diff suppressed because it is too large Load Diff

87
2024/go/day19/day19.go Normal file
View File

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

View File

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

402
2024/go/day19/input.txt Normal file
View File

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

View File

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

View File

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

View File

@@ -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 <NN>
// assumes input is in day<NN>/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))

View File

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

View File

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

View File

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