fix missing

This commit is contained in:
2025-01-13 23:48:55 +00:00
parent f8c29be7ef
commit 08b38c2bd3
59 changed files with 22848 additions and 5 deletions

View File

@@ -0,0 +1,90 @@
package day07
import (
"fmt"
"strconv"
"strings"
)
func Part1(input string) int {
total := 0
lines := strings.Split(strings.TrimSpace(input), "\n")
for i := 0; i < len(lines); i++ {
target, numbers := parseLine(lines[i])
if validLinePart1(numbers, 1, numbers[0], target) {
total += target
}
}
return total
}
func Part2(input string) int {
total := 0
lines := strings.Split(strings.TrimSpace(input), "\n")
for i := 0; i < len(lines); i++ {
target, numbers := parseLine(lines[i])
if validLinePart2(numbers, 1, numbers[0], target) {
total += target
}
}
return total
}
func parseLine(line string) (int, []int) {
parts := strings.Split(line, ":")
target, _ := strconv.Atoi(strings.TrimSpace(parts[0]))
numberStrings := strings.Fields(parts[1])
numbers := make([]int, len(numberStrings))
for i := 0; i < len(numberStrings); i++ {
numbers[i], _ = strconv.Atoi(strings.TrimSpace(numberStrings[i]))
}
return target, numbers
}
func validLinePart1(numbers []int, index int, currentValue int, target int) bool {
if index == len(numbers) {
return currentValue == target
}
sum := currentValue + numbers[index]
if validLinePart1(numbers, index+1, sum, target) {
return true
}
product := currentValue * numbers[index]
if validLinePart1(numbers, index+1, product, target) {
return true
}
return false
}
func validLinePart2(numbers []int, index int, currentValue int, target int) bool {
if index == len(numbers) {
return currentValue == target
}
sum := currentValue + numbers[index]
if validLinePart2(numbers, index+1, sum, target) {
return true
}
product := currentValue * numbers[index]
if validLinePart2(numbers, index+1, product, target) {
return true
}
// Turns 12 || 34 into 1234
concatenated, _ := strconv.Atoi(strings.TrimSpace(fmt.Sprintf("%d%d", currentValue, numbers[index])))
if validLinePart2(numbers, index+1, concatenated, target) {
return true
}
return false
}

View File

@@ -0,0 +1,33 @@
package day07
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestPart1(t *testing.T) {
r := Part1(`190: 10 19
3267: 81 40 27
83: 17 5
156: 15 6
7290: 6 8 6 15
161011: 16 10 13
192: 17 8 14
21037: 9 7 18 13
292: 11 6 16 20`)
assert.Equal(t, 3749, r)
}
func TestPart2(t *testing.T) {
r := Part2(`190: 10 19
3267: 81 40 27
83: 17 5
156: 15 6
7290: 6 8 6 15
161011: 16 10 13
192: 17 8 14
21037: 9 7 18 13
292: 11 6 16 20`)
assert.Equal(t, 11387, r)
}

850
2024/gareth/day07/input.txt Normal file
View File

@@ -0,0 +1,850 @@
31084: 8 67 8 735 38
40541461584: 5 81 9 4 32 43 283 228
6208: 915 6 2 539 148 29
306501986: 6 3 630 45 536 64 6
21276000: 8 5 5 91 6 5 8 6 8 985 2 8
1432991: 3 403 4 821 591 2 236
17115994: 69 321 254 764 3 99
19961295: 5 311 84 6 63
22953531: 22 95 35 2 8
18894343830: 90 5 3 2 65 7 159 2 91 1
4312695565: 158 8 716 615 95 59
391: 1 326 64
25202: 8 5 62 1 401
5324514: 6 8 466 59 169
658234: 3 83 592 97 57 4
26804472776473: 7 61 1 447 29 496 71 9
1503368: 653 23 18 824 625
24803314445: 5 2 4 4 417 1 987 4 447
1021069871: 7 3 2 7 9 37 2 2 8 5 58
1614: 63 645 4 3 31 868
4258805: 68 532 78 91 5
4495130022: 583 78 275 37 77
45111648: 47 98 45 855 998 46 6
2964501691711: 9 672 76 9 754 7 4 65
90685578359: 906 855 782 33 126
13608006: 3 5 7 7 3 602 7 4 7 720 6
4645623: 66 863 5 615 8
2569495: 443 74 7 71 5
134484: 68 55 4 77 9 2 327 4
1143450000: 24 750 35 264 5 1
5449: 4 2 907 7
23061783: 854 9 5 6 1 1 7 3 2 76 5
2930: 18 6 7 555 5
2115475: 9 194 8 54 42 5 31
19449: 6 1 9 4 4 769 8 1 79 905
4595553: 298 3 4 257 5 3 345 45
208314087: 7 3 877 815 9 9 3 2 6 51
2905504: 46 58 514 626 763
963368: 48 425 484 6 370
9980664: 1 98 80 5 98 68
652568: 7 197 871 290 68
45827: 15 3 665 9 154
722: 2 21 337 5 357
27652464029930: 7 829 9 700 7 9 3 7 4 1 8
6868809: 45 2 9 848 9
1175: 7 5 98
2133: 17 2 5 36 5
528: 55 1 5 8 9 31
8206806: 1 4 9 4 99 6 24 97 2 5 6 5
37530658373: 1 2 8 5 8 4 5 7 3 946 373
65484738025: 47 5 4 43 8 6 43 7 7 26 5
2157: 8 2 1 93 8 568
23082508: 7 5 3 3 2 5 8 477 2 3 1 1
29090880: 45 28 37 8 78
1262763: 1 1 27 729 93 16 2 75
1409848204234: 7 87 622 84 820 42 34
3304: 6 55 4
1196013120: 8 340 179 35 192
124278235: 4 4 69 225 78 235
2735190615: 273 2 3 1 906 1 5
52192: 104 89 6 45 10 72
573777850: 680 31 807 8 50
35694425: 82 38 921 61 871 84 2
658877085778: 7 86 55 156 10 977 8
20860682976: 546 3 7 930 7 954 42 6
224616: 441 46 8 36 73 8 3 45 7
358087: 7 236 9 45 2 9 3 9 6 4 2 5
6354432: 55 792 7 153 639 7
1923524: 177 175 9 3 3 528 21
117340: 9 82 159
1234059: 64 357 9 45 6
2651349895: 8 526 4 7 9 1 6 42 9 89 5
3884759: 737 251 3 5 7
633925731: 346 4 3 5 472 9 7 9 4 8 9
43555: 37 4 60 25 53 77
4230519: 2 2 12 8 9 9 91 41 2 5 2 3
5489: 69 8 9 515 6
82630872: 33 1 2 19 81 9 4 5 6 6 33
203340489: 181 55 1 4 112 9
72068: 7 197 4 5 9
168389664: 1 683 84 5 667
30367442: 2 657 6 4 384 5 673 49
2846739576: 4 8 743 9 3 9 829 719 6
78401: 77 4 9 93 5
627886555182: 1 61 78 8 65 4 57 94 82
53361: 85 3 592 1 63
154268: 48 43 3 892 4 8 3 8 1
525075263: 656 34 4 8 6 6
248294606: 6 896 24 1 83 9 4 1 7 75
9082152: 182 66 9 8 6 7 7 2 195 2
1657909631: 8 5 76 7 5 95 2 9 22 544
484430: 2 5 64 7 49 961 83 3
11192683920: 6 26 7 8 5 8 6 3 8 372 1 1
52887178: 4 863 61 118 60
896861: 88 9 7 671 4 187
721710054179: 135 891 60 541 81
12403134: 92 6 34 58 6 5 7 9 6 6
33615296: 312 44 55 9 3 1 572
183192: 35 8 5 5 612 28 71 3 4 8
1244794661146: 6 4 9 6 1 6 4 57 7 685 8 6
362827266: 86 643 395 8 738 813
1477891785: 86 6 2 8 13 2 91 7 1 8 8
5983: 3 888 5 291 2 57 6
73739569: 668 6 687 89 6 69
902757501: 855 24 627 1 63 26 9
177442819: 6 9 401 2 4 52 256 4 3
87403263: 95 920 3 191 7 65
223398085: 57 3 1 8 11 50 45 8 9 85
76471: 81 472 2 1 6
102739: 1 284 1 8 9 1
98723250300: 79 119 1 1 2 143 5 7 21
37813543: 28 4 5 813 540
21449386021: 185 4 9 9 3 6 4 46 7 1 3 8
355140846: 39 4 6 90 845
25511824797: 3 7 4 746 48 55 3 15
11681963: 5 76 9 67 1 35 3 8 50 3 2
10812636790: 3 778 3 954 790
144: 90 14 40
2954988: 6 3 3 16 4 95 2 1 7 3 9 3
1666626: 282 573 74 39 1 46
380854191760: 2 7 24 5 54 177 5 5 664
20485976: 47 155 643 323 3 8
562264400: 8 1 3 1 5 74 3 67 309 88
5054: 67 3 55 599 604
5790: 8 6 4 3 7 43 1 9 8 4 17 6
1423: 232 6 23 2 6
2214885600: 1 5 2 1 3 50 183 41 82 3
586061: 507 69 31 975 3
68594249: 2 9 373 9 50 340 3 32 6
380980: 95 4 980
7510: 5 4 825 4 71 9
451918: 90 50 18 11 106
16294: 29 134 8 65 4 1 455 3
10536237: 6 6 3 9 1 1 4 724 4 5 1 97
24566372: 1 34 8 3 90 592 85 87
284990: 5 5 5 91 7 5 88 5
1108832032: 80 93 29 3 727 88
215422984: 63 82 417 8 70 1
37636247: 3 875 3 39 615 6 73 5 2
511718662: 3 505 3 718 23 42 9
172674894: 6 76 9 6 7 5 6 6 7 7 22 2
2494298: 21 8 468 606 6
1164891: 12 97 891
1303421387: 8 604 17 5 6 48 95 87
113169: 242 889 55 7 6
28083319654: 7 1 6 2 780 4 8 9 9 3 8 7
689769: 2 479 72 6
664006: 603 60 997 9
383810: 312 123 4 7
278838736: 254 851 15 86 76
35266920: 4 8 65 481 94
2342060: 5 55 2 43 99 710
61499384: 760 4 83 423 2 4
1337677: 769 562 5 67 3 9 13
20708670: 1 7 8 1 9 9 6 70 6 1 3 57
22607703347: 23 6 7 6 7 67 80 39 44
422584: 1 6 185 2 95 23 1 878
16961283369: 7 614 720 9 609 1 9
7743900: 12 80 8 38 33 75 525
5198: 5 14 5 5 3
7706: 5 765 6
60799047884: 9 6 5 331 7 2 2 6 3 3 5 87
373279812855: 74 65 5 946 16 571 5
273426612: 519 24 87 2 656 3 958
449: 250 94 8 9 88
69949442: 8 92 4 1 15 33 8 3 1 2 2
2540247614: 578 3 346 73 29 5 5 9 2
72710790952: 99 4 87 255 85 7 4
43727113667: 3 1 333 66 106 71 2 4 7
74125836117: 4 5 52 6 25 35 9 3 521
527906: 54 9 9 931 29
139782: 11 33 6 526 918
19218: 704 402 9 522 284 8
8668810: 40 8 6 3 6 2 84 2 2 75 7 3
1487663526: 9 9 517 70 2 6 2 5 94 8 4
20610: 1 152 3 2 45
359112: 323 5 47 54 7 6 3 8 4 2 4
3198: 1 7 8 8 24 7 1 4 41 7 27
41189: 13 9 3 624 5
4720776758223: 47 20 776 758 222
195264: 4 2 339 36 2
16012371600: 6 9 6 3 6 3 95 3 76 4 185
3864074: 3 4 426 84 73
45674415: 42 4 9 7 82 410 5
1175718380: 6 340 5 911 746
51156: 3 4 4 540 87
4831584: 2 43 8 2 55 5 7 5 69 96
874516400: 874 5 16 368 32
220190: 7 974 32 38 1 7 4 172 4
429894584: 1 9 5 7 5 98 94 9 6 9 58 4
114640: 3 7 31 52 7 6 1 772 299
10759: 23 1 6 12 7 2 1 4 81 28 7
360390945715: 2 431 696 27 213 20 5
3140056: 783 9 5 1 43 9 8 864
15606936: 96 6 40 639 172
1134226: 9 824 46 152 2
640: 5 32 2 2
46339061240: 7 20 9 987 5 715 618
35646030: 42 1 885 137 7
271367519: 7 45 964 127 96 893
495104: 1 960 8 56 64
3480: 7 1 12 3 1 40
2608290: 91 95 46 3 3 30
55890251: 1 65 7 9 4 81 454 3 582
541872: 774 7 46 2 27
309960637: 8 43 4 90 640
14270: 44 8 875 1 9 6 1 8 3 5 5
2461824: 1 4 1 9 7 12 61 71 1 4 1 8
53575: 6 73 9 7 118 3
3128658: 93 9 2 2 20 8 94 331 7
223592: 5 43 381 5 9 4 5 884 8
12112807054: 870 119 7 61 15 274 4
27775914: 6 1 781 1 9 18 4 3 5 889
279477744: 33 3 9 411 87 763
9896932013: 647 3 331 353 343 46
8127207475: 8 1 2 720 3 4 29 9 4 91 3
3683665: 981 751 5 5 8
7203976: 3 51 7 5 629 3 5 9 9 8 5 4
12182439609: 5 57 9 9 9 7 9 8 4 320 3 3
6547981: 9 727 2 47 84
269451007: 9 262 62 4 992
1760418: 99 34 1 5 99 96 4 27 6
4881246: 5 3 46 2 4 67 57 8
104401: 68 69 8 72 1
57612060: 6 270 53 61 11
65336211: 92 71 912 169 540 1
1056886344323: 8 990 3 9 1 6 18 695 64
431112: 3 19 108 92 69
1497953467: 1 640 5 8 6 9 38 65
20122455: 24 76 903 9
112719469: 32 80 7 13 6 456 4 6
1178483161: 18 8 6 29 75 754 4 3 4
119908723232: 48 39 7 5 3 73 8 64 30
21106565: 350 1 37 4 966 2 1 7 2 2
70193: 4 53 9 2 7 701 59 746 4
3034: 21 45 68 816 3
3005: 2 89 24 92 7 58
81430304: 124 4 989 2 83
22260548: 7 15 212 54 7
494808: 87 6 665 6 8
6723: 4 81 13 457 13
463069864051: 995 8 4 91 7 465 10
913887: 3 6 7 2 752 9 5 1 36 5 2 1
824408862: 82 43 9 86 8 94 6 5
3431928092169: 5 3 67 76 755 15 362 6
502132176: 9 109 624 964 702
83412526: 1 4 7 2 27 405 3 1 721 8
407094: 27 7 60 433 7 5
701412: 2 5 84 648 97 836 8
25707842242: 311 3 2 3 711 8 8 2 2 42
505119: 1 44 41 7 40
295936440: 9 27 963 89 272 4 38
59813: 595 97 657 457 984
297534: 348 61 1 1 2 7 296 46
143500: 618 32 8 31 19 1 82 7
138312966147: 5 29 5 3 2 2 7 50 4 8 96 2
311740: 5 76 5 37 1 1 597 3 20
4908292: 9 785 31 59 5
6141663: 204 7 25 3 5 1 7 2 9 6 2 2
746258: 1 3 61 6 48 21 4 11 81 5
310680: 6 7 59 782 9 45 8
170615594: 447 3 7 74 35 7 7 6 6 6 2
160656040: 75 78 105 603 7
5577322182: 47 49 942 2 24 5 7 1 2 7
48328: 3 7 4 7 9 149 9 456 7 3 7
155259452737: 56 746 874 2 8 342
35341: 5 76 93 1
22236341: 3 381 88 641 5 1
44989863673: 96 6 5 6 71 2 3 381 7 3 3
606: 4 80 50 4 70
12733: 65 9 2 86 5
22463298: 24 88 3 5 80 1 4 89 8
377019478: 6 748 5 1 3 4 1 9 7 2 3 8
19642752: 696 5 7 544 51
702511961: 887 792 1 7 961
6024648: 8 86 75 47 168
104509650: 5 1 482 62 72 597 7 70
1135227: 2 218 25 27 45 5 5
224: 2 4 6 2 86 100
173902: 99 277 462 89 4 99
823929: 9 9 8 5 929
25781529: 60 9 8 4 7 65 9 2 4 213 9
15984006: 38 6 5 9 727 7 6 4 96 1 5
911: 7 6 1 868 1
1319338035: 7 6 1 7 6 438 1 448 5 87
281978: 561 4 9 5 5 56 1 4 1 9 5 3
26739745316256: 3 772 8 21 75 45 5 75 5
804636: 50 6 26 542 927
4368: 9 87 1 8 42
1339970241787: 2 6 8 17 4 82 9 29 4 95 2
27896197888: 8 8 849 619 66 521
1624907806241: 9 270 3 9 649 18 9 44 1
804053256: 531 30 7 9 25 91 6
19887: 394 48 682 27 264
576579196: 34 7 5 75 6 8 1 5 5 5 91 9
4075638918: 886 5 23 97 1 5 4 7 48
1242184922: 7 4 5 7 88 9 393 4 925
816: 5 2 5 6 45 6
16640: 34 60 177
55047199922: 5 674 9 97 58 8 985 7 1
202: 1 57 3 8 1 4 28 2
128584480: 34 6 835 650 94 8
14447: 166 3 28 420 83
302594: 5 6 2 511 83
100153: 4 389 35 70 60 43 450
2185551: 38 3 43 19 3
6746: 4 6 583 93 784 39
3486469538: 8 47 3 40 786 7 9 1 19
2105210: 7 4 8 2 6 9 8 31 7 56 3 2
47524069: 6 4 610 811 106 4 85 8
24206: 25 599 13 2 19
83444222: 309 3 9 96 1 8 38 21
1157600: 383 930 42 92 800
135424: 274 494 29 6 33
41759168088: 63 4 91 3 77 2 33 9 94
912: 6 1 9 58 1 838
1483426560: 4 6 1 69 801 406 692 6
1291767304: 41 475 889 4 88 65 8
4740630: 941 32 56 2 87
145255683: 6 928 2 270 96 3 3
2804256: 2 563 36 41 6 91 8
3662: 592 6 91 11 8
2070609492: 9 460 7 1 66 352 9 8 5
58896: 73 2 5 17 5 15 8
161664199: 5 9 8 9 746 32 2 1 9 8
28767133: 6 69 10 43 37 96
321150750: 6 3 33 7 6 191 1 74 355
32221373185: 931 4 3 78 56 33 8
125188150: 1 84 8 299 7 6 3 623 38
529: 1 2 63 54 350
371329981: 53 730 8 78 760 4 57 1
8636010413: 34 6 1 516 8 4 4 82 1 1 1
16436: 8 8 36 7 70
2610384: 6 74 93 329 8 42
2511598: 21 497 80 7 10 12 5
2051303: 68 6 53 523 6 91
3583491: 58 3 3 8 852 79 4 5 5 46
2567: 5 3 32 4 3
37412197: 63 94 238 46 197
660996: 61 61 7 43 18
772595115: 1 7 2 25 4 2 314 72 5 8 6
1125072: 6 82 64 2 3 7 444 2 3 48
40030036: 9 68 7 66 646
26483808: 5 6 9 862 16 33 96
89503594: 2 91 80 112 72 61
34849136: 7 14 6 1 9 857 68 88
1052469452651: 5 94 9 5 5 5 9 870 8 8 3 8
2333026: 2 9 1 8 36 9 5 5 75 1 7 9
2142047: 55 2 6 1 60 3 9 40 6 5
18329059: 1 7 398 2 523 11 1
1515: 1 5 216 3 1 214
636751072: 65 7 58 3 967 7 759 9 4
65121: 3 648 21
1203384: 855 2 9 12 7
1231: 567 1 29 21 1 612
5830477499: 416 2 925 357 7
39904736: 2 2 987 58 51 2 1 8
7192: 4 881 3 11 8
984797352: 86 84 99 3 1 459
4330380: 444 3 8 3 797 7 6 9 1 5 6
174675: 8 41 206 75 824 530
644000: 2 4 89 4 17 7 92 14 1 4
275310: 6 11 31 58 888 4 2 9 2
2980025: 29 72 7 96 4 61
1100140: 3 8 9 91 3 9 466 5 6 8 3 9
26416153: 5 3 64 9 4 764 7 7 5 4 6 7
392307: 644 22 589 2 30
1703108: 23 789 9 532 7 8
84496967641: 9 8 7 71 696 158 605 9
4926: 5 47 3 5 2 6 60
1238: 7 20 5 8 75
4166368: 4 8 393 74 22 7
264286: 5 5 2 6 11 26 80 115 8 6
5390070: 38 5 77 813 35 3 54 8 6
7109213251: 798 2 5 88 89 50
11479038526: 245 1 5 7 333 456 3 7 9
35577532: 71 155 500 25 5
516: 7 4 6 4 1 70 9 66 1 5 39 2
12159: 9 6 1 225 9
593081: 1 92 6 4 343 2 6 8 3 41
52698: 89 592 7
36739952992513: 9 4 779 4 627 92 4 8 3 7
2006: 22 8 90 75 5 8
83601: 68 30 8 5 1 56 3 1 3 7
478266: 1 4 8 6 3 724 612 8 286
297000: 49 50 820 9 90 6 88
1229910807: 262 102 46 6 600 807
185356128: 44 5 401 7 82 115 48
246521: 787 6 4 6 307
86285202: 25 96 42 856 402
23586: 70 1 3 52 9 5
18086584: 46 6 144 8 27 534 7
33690: 4 69 4 56 89
46311716: 12 3 41 18 619 6
214023: 5 793 66 7 53 9
6755: 270 2 799 12 5
14223284: 9 9 7 5 7 8 2 111 1 45 4 8
2291081: 3 2 632 725 81
284789717303: 605 3 9 3 960 30 47 49
17262: 105 4 3 1 3 9 3 240 2 7 1
157051: 9 7 6 181 6 9 3 3 451 81
1349805670: 59 4 874 26 71
2361910101: 5 623 7 3 38 6 8 1 3 1 8 2
45459840: 8 42 71 1 3 8 4 9 8 9 384
644841302: 7 658 2 70 62 68 2
196349: 69 6 192 81 2 4
25233495: 14 6 1 3 34 83 14
2502364627: 9 73 7 1 76 4 7 95 8 5 27
891841251: 79 62 560 2 63 6 51
526: 95 9 4 1 417
46610701: 46 605 5 697 4
101160: 5 5 6 5 9 4 873 8 4 3 3 63
74700: 86 2 765 47 83
487499: 9 52 6 6 85 502
12930315: 4 77 3 9 48 9 1 5
818480: 3 4 8 966 10 3 7 1 4 5 4 1
8956575: 6 8 827 5 676 864 35
6467920693: 5 8 5 48 652 1 8 8 1 3 8 5
877: 71 10 689 32 75
53325209060: 554 965 941 2 53
23291024284082: 9 42 193 47 6 9 515 48
929424926: 3 6 29 42 492 5
17829266: 6 56 4 53 63
12276: 2 5 55 3 66
181712606: 595 74 75 412 6
8831966: 2 56 30 2 2 39 65 2 9 8 7
661454663997: 231 3 453 350 8 10 78
237094: 3 3 311 50 646 12
5707220457: 71 82 86 966 4 920 55
152255376595: 76 17 40 820 65 163
1347305: 9 4 8 65 664 3 4 3 701 9
70155: 91 2 88 257 706 58 1
60468016: 640 1 23 5 27 726 812
408075824: 40 74 6 758 22
149767280436: 1 221 860 788 436
1581985302: 83 9 258 3 8 38 72 3 6
157694208: 94 8 52 3 5 15 56 1 3 8
3814512: 5 6 4 8 8 5 6 5 5 37 9
4548610: 66 9 3 3 7 57 50 1 9
21119484: 38 822 28 29 876
5946398: 661 589 67 71 91 57
151648362: 894 75 5 9 93 54 317
10321152: 99 807 712 2 8
114489: 6 5 4 8 31 84 37 9
145909: 75 70 909
106820010: 722 269 10 2 55
1480075: 44 2 198 9 3 71 691 6 7
28827: 19 1 5 7 6 9 78 1 8 849 3
7566: 7 244 8 141 62 23 5 83
5508361: 495 4 214 13 1
4988516: 5 33 55 12 568 66 2 97
184373: 1 9 7 9 5 1 1 33 9 11 20
199283931852: 3 5 8 4 158 6 3 539 855
1666857472580: 77 654 23 180 331
14487733: 557 891 68 9 9 5 828
1198391800: 231 965 8 84 2 93 1 4 2
126143604: 86 2 6 463 88 55 5 3
153392452209: 6 482 7 3 939 11 5 4 9 7
12681: 5 7 2 9 4 7 44 2 5 65 4 9
989: 1 9 99
93840: 98 38 46 15
217780: 419 3 516 23 5
33264: 447 87 973 5 22
7178025: 995 9 5 2 87 7 527 20 5
9028: 3 83 7 5 3
12935: 711 5 6 3 47
3659499181: 365 925 6 229 9 5 181
701521: 9 4 3 64 7 61 8 26 67 53
340704429: 52 78 84 319 7 7 99
62241150: 7 176 842 8 77 6
112424: 5 1 8 936 82 8 183 92
723672: 347 67 1 2 874
3066: 51 5 8 8 8 898
1274880: 23 52 542 9 87
2517506958: 37 68 780 726 9 59
110283391: 3 52 3 53 8 3 8 6 3 903 1
4536: 83 5 81 9 747 2
87466: 19 46 6 3
605783111392: 404 91 601 37 741 4
58853775: 4 485 79 4 384 399
47889063: 516 64 89 984 999 29
23241016: 7 3 5 5 6 1 3 819 27 9 9 1
27260572330: 9 9 7 9 28 57 2 3 8 2 5 5
233756964: 61 958 6 5 1 5 26 8 314
781268: 376 6 743 4 692 1
69945120: 7 4 539 5 113 5 6 4 7 73
267715242: 92 8 663 9 4 3 632 3 1 2
1896465174: 976 920 1 4 651 72
2800123: 203 8 17 9 384 23
206464: 3 7 3 186 1
127766017: 74 12 9 35 714 1 24 1
24: 7 5 1 9 3
10510918116: 59 46 109 181 15
3621981: 2 248 954 2 1 3 9 78
7258534: 70 96 523 840 898
12932425: 928 6 43 57 8 54 1 3 9 7
40426441: 6 8 7 7 3 8 1 2 1 18 509 9
258400: 70 120 34 40
895: 81 303 38 2 51
80809920: 932 69 727 47 995
21779938: 9 411 92 64 226
1613: 4 401 4 7
43158803498: 36 222 9 7 26 39 6 9 9 1
4366703135: 57 7 93 7 2 70 982 8 6
167694750: 9 89 350 76 598
1913663802: 64 299 63 6 2 10 2
1444191: 556 9 11 4 6 5 1 41 83 7
1003880435: 19 82 746 977 863
4155: 72 810 13 4 575
96614034: 15 6 361 72 6 2 3 6 59
1688: 5 9 1 5 3 8 8
41338714328: 41 338 639 75 328
9197318140: 2 59 6 1 690 8 1 5 227 4
46479360: 61 7 4 2 9 7 39 272 6 5 8
404048233: 951 7 8 576 2 4 235
11494468882: 3 187 5 9 1 3 24 2 6 7 5 7
1922: 6 233 457 6 61
6955: 9 7 8 4 5 7 4 2 4 5 202 5
31285182: 23 136 506 7 63 52
8117862: 437 1 6 921 2 381 46 6
47589: 9 94 374 39 7
2256037: 60 376 39
2527024499: 4 3 1 7 8 10 3 1 6 51 91
37690: 3 720 52 6 1 88 1
4175256007: 4 8 5 39 20 2 34 2 23
380247474471: 2 4 2 45 497 88 5 7 2 7 1
21474: 9 9 9 1 17 4 784 8 4 39 9
3277745: 18 2 5 4 414 89 271
20611117618: 3 3 2 4 8 1 4 9 39 76 19
6706090709: 799 2 3 1 8 9 8 4 7 872
5792: 618 29 68 8 3 69
410827821: 4 927 73 453 16 409
233173828: 3 74 634 6 896 3 4 7 5 6
187959: 119 32 2 556 23
486043544: 3 230 57 52 54 74 62 7
2347696: 4 1 35 40 19 769 8
4278588041013: 44 7 29 4 7 456 7 4 684
5637600: 58 9 54 25 8
4977330: 9 7 6 79 3 9 8 838 3 4 7 6
22497: 82 79 983 1 1 3 9 102
35382699154: 77 617 2 14 2 46 554
16502056: 8 6 58 319 488 5 819
756793: 88 3 3 944 192 3 1 72
4214: 6 697 1 5 27
12450094: 2 2 2 6 3 629 9 857 5 9 4
1618088: 76 4 6 1 7 7 62 90 5 1 8
1060491: 3 361 14 906 66 1
266689086: 3 2 17 83 5 6 8 42 6 5 3 3
68560832: 3 1 82 6 8 5 3 308 2 1 2
1326: 423 846 4 1 8 44
68085: 674 6 78 7
1840707: 85 9 62 6 804 4 3
13403416: 2 1 3 5 4 65 7 8 7 3 933
2093: 56 6 868 26 614 9 8
12213922: 73 703 14 1 17
224283: 640 7 4 5 8 4
97770: 1 214 7 27 1 8 378
25990: 6 5 5 87 2 7 767 6 92 4
299184551: 325 2 92 544 7
63062194: 70 9 605 7 46 123 825
68322843482: 28 244 28 434 82
37380255: 80 1 935 87 493 4 5
305472677: 509 6 7 267 7
46: 1 45 2
2250: 29 1 75 6 69
191773: 19 176 5 8
91083792: 4 7 236 878 7 5 6 4 3 1 1
335524376: 8 53 51 68 668 158
29640281671: 7 8 4 6 3 5 7 44 7 8 8 90
497340: 9 3 762 7 3 6 3 5 6
279527: 402 67 149 4 1 3
279694: 1 935 96 765 97
224785469: 2 1 9 5 68 10 2 3 9 3 7 23
10732502: 15 5 477 5 60
7497250: 8 936 1 9 249
56971: 4 76 9 79 91
41393070: 2 53 5 781 70
12168228431496: 64 3 8 2 161 9 7 831 3
117142318737: 3 6 6 9 2 60 436 3 9 6 9 3
158260: 9 45 5 4 78
2363212870: 2 363 212 4 52 420
447325: 463 2 795 355 25
4751: 11 48 9
841: 81 9 97 2 13
3346211520: 3 9 858 11 522
697352492: 67 1 4 4 18 3 455 69 9 5
7319280640: 61 45 7 709 7 656 80
27260: 7 9 344 79 5
10737320581: 7 8 5 5 55 7 8 6 294 70
17943: 9 839 921 18 6 9 4
35412: 6 724 1 9 8 580
6453: 161 1 475 81 9
840798: 975 287 52 3 647 517
17854: 3 32 69 42 7 655
1735468803: 3 86 8 5 9 91 68 3 26 80
1955340326: 54 8 292 2 54 5 327
7614444: 86 7 718 824 7 88 7 19
108369902185: 3 9 115 814 7 9 5 7 1 8 6
139223: 8 3 53 2 77 38 6 3 2 7 4
2142640: 49 43 35 566 72
266228026: 3 80 51 8 597 5 62 24
68870224: 6 62 870 22 4
393281: 5 4 109 9 32 77 2 22 9
22257035: 29 25 685 5 6 3 597 3 5
1480: 679 67 130 537 9 58
11720991: 1 8 23 7 364 5 5 5 59 7
156699: 663 9 301 5 5
1292069: 17 760 21 42 6
83229203: 100 1 4 7 1 808 321 9 2
15899250: 986 375 43
80808: 40 4 521 212 104
10465625002: 9 77 71 47 50 1 425 2
819408192: 31 68 991 7 3 87
667: 8 8 2 7
26860: 200 45 23 56 4
49480468: 43 29 90 127
5186813940000: 504 967 5 825 5 86 2 3
19174057: 6 7 652 7 51 7
72691616664: 991 7 733 662 6 38
18573243: 343 360 489 9 900 6
3883810560: 6 88 2 8 4 438 8 980 6
19738: 5 2 508 38 54
703764: 13 8 48 495 20 77 23 6
273920: 7 629 987 89 8 20
911: 7 5 9 4 592
33029: 50 644 822 7
524702: 7 153 24 79 7 3 95 17
109342: 84 130 3 3 2 2 80
35742400: 8 1 706 7 51 174 6 6 9 7
1483641: 2 64 70 737 153
7397: 364 5 8 4 85
10622451329: 5 80 3 7 1 4 7 879 3 1 2
1513454743: 69 31 8 732 963 91
87816030: 47 1 7 80 3 8 1 6 417 1
2957777379: 30 265 7 777 379
279602: 759 1 23 4 4 274 9 7
2793723: 2 10 66 1 6 24 2 723
13426560: 36 37 180 8 7
72281484: 8 25 758 6 17 9 36
15157818475: 26 124 1 5 7 818 475
1726473: 857 5 41 9 819 2
69102877793: 9 997 2 91 7 17 711 7 5
1182849: 2 249 31 38 4 129 8
81125766: 7 2 670 17 308 3 789
20198: 8 6 3 396 2
130416799: 10 27 483 6 7 9 6 4
29969: 7 62 38 7 91 5 4 907
4071: 3 10 4 7 23
3447616557: 858 111 362 9 54
31720: 38 59 43 63 4 2
10386966: 1 3 8 612 2 96 5 7 8 4 6 3
2515969: 2 768 9 906 8
2085272: 18 65 114 297 25
245966149: 96 3 146 5 6 4 2 2 3 731
936628: 57 38 19 887 90 88
434515299: 905 64 9 8 56 99
7751781085279: 8 7 900 819 9 389 11
6523: 4 61 26 151 28
507242778: 6 822 69 44 4 459 1 6 7
4557: 2 48 3 9 169 3
6172533: 37 9 207 43 7 9 7 7 12 9
4528512: 7 27 871 689 5 6 63
35178: 1 682 81 46 80
40198: 67 4 25 6
12418780: 54 7 6 8 351 6 164 11
37440: 24 9 8 12 870 247 32
7303307255: 35 695 324 6 64 8 52
42929: 9 124 38 5 516
101311: 2 99 31 1 3
3786723: 1 685 92 6 3 3
757762: 76 997 1 3 38
728: 567 6 23 42 90
19126995: 593 1 70 65 59 58 458
83647: 8 828 47
1250549: 24 939 1 71 50
9778: 9 173 39 15 5 3 39 262
18714: 89 265 5 13 4 43 1 3
10446534727248: 61 465 74 62 990 8 6
4136: 12 289 668
986: 919 65 2
382284584: 655 1 7 1 144 578 7 1
2087668: 521 7 75 94 48 4
13551: 62 69 8 36 9
54736659: 504 52 8 38 17 261
46609728: 5 9 6 5 78 8 818 9 3 1 5 6
8001: 55 7 6 9 7 3
2164: 20 62 3 7 8 8 76
34288954: 174 227 512 141 854
149143039: 568 157 839 4 4 8 745
858002: 715 600 1 2 2
355275: 3 550 5 22 6
1161901609: 9 3 7 1 9 5 8 2 99 9 492 4
14265505: 7 4 77 237 684
93906: 1 23 457 4 78
280258704: 396 16 217 528 81
2447: 237 9 217 9 88
21103892: 688 2 139 4 3 64 55 7
572320: 571 889 7 8 7
22940: 74 1 31 10
453933144: 884 1 7 2 8 75 164 94 9
9387402762: 447 7 134 3 70 3 57 2
628: 2 96 5 6 10
58729373: 53 4 53 29 373
16162243: 2 3 90 75 92 139 927
1806271: 4 319 283 5 13 718
1908: 72 26 16 8 9
87108518916: 8 349 61 129 729 4
1120226562: 81 8 1 54 7 89 8 5 2 32
5619463232: 7 860 2 3 9 3 24 29
28275666: 4 35 65 440 227
57418552: 8 96 4 18 9 6 4 142
337848089754: 893 778 54 82 7 9 5
101244761: 2 8 4 1 222 8 1 631 6 4 5
31091: 2 94 6 323 9 4 4 53 8 3
9551142: 2 7 4 4 92 9 87 2 54
431798: 2 827 32 904 554 96
368064: 62 5 31 10 568 6
641856: 80 23 1 2 8
356332: 848 13 8 38 853 4
1530148: 107 13 11 13 33
10595: 4 93 3 71 524
13825: 37 88 128 73 4
485809: 9 597 19 6 996 5
6598799: 541 2 674 617 6 5 3 1 1
15595884486: 6 36 560 69 8 961
655845: 5 5 2 512 8 298 7 115
167578404: 716 3 162 9 916 19
539849: 3 7 1 594 25
3430232: 9 15 29 9 2 700 7 56 4 8
4196: 951 77 9 8 4 4
24625387: 9 6 8 6 9 37 846 38 3 8 8
4318272002: 10 7 2 3 80 6 5 2 7 306 2
49392736: 80 63 4 72 34 2 944 2
97244751876: 3 45 6 3 7 293 8 5 9 2 3 1
2827209446: 384 6 35 4 9 6 7 3 441 5
773376516: 7 73 37 651 5
466781: 21 76 5 364 782
314242938: 77 30 223 22 610 218
654638167: 14 95 6 631 7 169
11952: 76 23 69 7 50 439 18
7579925: 860 37 435 47 5
1618: 80 4 7 711 59
33287: 1 822 40 354 48 2 3
126232779: 6 3 841 9 5 4 77 8 34 9 3
155627: 1 6 99 989 54 95 13 99
713339897: 9 7 5 8 9 30 430
131670050047: 231 19 75 12 5 1 4 8
7727322: 2 795 9 753 513
349733: 615 8 637 271 4 6 28
2481710424: 1 58 9 49 1 3 96 5 9 3 8 3
261963659: 9 7 4 7 2 308 655 650 9
51571974: 7 5 579 7 848 1 1 3
20290: 3 85 3 467 36 1 1 6 196
2626: 2 6 96 545 2
22878: 2 2 80 275 4 21 3 9
575535: 54 4 14 18 10 8 73 6 3
477517: 43 3 4 5 8 46 7 50
1384703: 4 401 6 7 738 51
891003337: 86 6 12 4 825 3 3 39
90028742465: 608 3 1 37 4 3 4 2 4 6 2 1
231588050: 35 3 1 586 1 2 8 1 3 65 5
1072: 7 9 995 9 5
11381395: 73 4 974 2 36 2 435 7
3841: 847 4 87 358 8
88734868: 3 6 9 8 9 2 7 5 4 838 725
280240227: 2 981 23 1 48 94
343965: 6 35 67 885 23
14417393: 9 4 7 2 63 6 38 35 90
227912: 8 183 31 19 3 72 9 8 1
2511501082: 1 946 88 2 430 3 7 6 2 4
9770975: 2 207 7 58 9 4 36 33 5
181098129983: 36 3 6 1 3 399 7 9 8 1 8 6
5511886: 749 92 63 2 9 4 104 94
11912: 3 167 581 43 15
54194003: 24 5 7 50 632
40135618285: 5 5 5 4 8 7 7 38 182 8 3 5
8817032: 460 2 2 6 4 4 7 2 57 728
236071: 566 414 610 196 941
1699: 874 26 799
9082: 59 85 7 9 10
14399715: 7 6 5 84 32 1 9 9 8 756 7
957922: 5 76 282 265 853
519850: 854 1 1 608 8
494598: 8 8 8 9 1 2 4 1 3 4 17 78
717301: 769 92 138 844 1
79732051: 8 1 7 80 45 5 221 629 8
193315: 5 329 577 536 60
443120: 71 7 62 5 764 4
799531202: 320 693 332 72 50 2
25055194: 241 48 900 7 194
148742749564: 341 93 73 435 240 65
2975722: 802 811 6 919 2
69614316: 3 9 65 34 9 9 6 3 1 96 59
9211672: 92 116 51 20
1384: 5 687 2
2227754259: 312 1 75 78 952
1980: 6 46 5 70 6
1051: 74 41 921 7 8
7224: 69 9 6 405 7
100058717: 58 44 628 7 145 31 9 8
13325842: 86 4 981 7 534 49 5 9
135606016: 86 1 1 7 2 4 8 877 96 8
188416: 4 8 735 32 8
13081748: 306 58 2 737
3408461: 654 396 4 34 348 94 9
19518: 2 1 8 9 1 54 9 25 9 616 2
31719: 65 6 9 78 597
246572: 26 98 9 4 393 9 81 2 8
127805458: 40 71 9 1 5 457
7811: 198 16 5 7 31 1 4 794 6
1168319105: 5 2 1 2 4 44 8 93 9 12 8 8
7211685: 411 5 7 562 8 554 93 5
4028985022: 77 86 48 505 604
127755655140: 73 70 5 3 8 31 5 140
208269903: 3 75 267 990 3
956027222: 455 20 5 10 4 3 5 7
332644: 63 1 8 660 4
739903: 8 744 1 67 3 630 9 1 5
449841: 8 6 3 1 9 9 4 9 608 73 88
3162: 88 4 6 9 7 3 53 7 9 17
123780: 961 528 514 51 9 60
397: 88 299 1 1 9
20327221321: 10 40 83 98 1 460 7 6
22759444: 366 7 6 3 241 6
1397068088398: 419 2 5 161 5 6 4 414 1
5172: 6 431 2
7637: 251 9 85 746 7
1812: 908 35 789 3 77
1120: 7 9 1 68 9 2 4
770138283: 11 6 57 1 3 8 947 9 1 3 3
163644: 610 32 344 63 156
6168: 137 5 9
507: 41 9 2 76 60
593693: 77 77 16 765 9
1214074355: 9 4 5 3 9 73 5 7 8 4 855 8
607244471: 6 3 7 3 1 83 2 510 2 4 6 8
275: 26 2 9 2 2
250040507: 24 9 455 585 504
5137920095731: 44 7 438 78 3 23 573 2
282926819: 6 4 827 26 812 42 3 32
80952: 37 2 6 948 2
8890436: 635 2 7 43 8
10600: 2 1 8 8 6 6 8 3 91 541 6 5
23840: 5 86 1 9 4 1 7 511 57 5
283368: 3 8 8 322 8
1123947090: 49 3 877 8 1 323 9 342
25775616: 8 8 6 97 692
243687944: 650 5 815 32 92
2855764: 2 1 912 730 1
2736185924: 835 66 2 53 8 3 31 3 2 2

View File

@@ -0,0 +1,80 @@
package day08
import (
"math"
"strings"
)
type Coordinate struct {
Row int
Col int
}
func Part1(input string) int {
grid, antennaMap := parseInput(input)
result := findAntinodes(grid, antennaMap, true)
return result
}
func Part2(input string) int {
grid, antennaMap := parseInput(input)
result := findAntinodes(grid, antennaMap, false)
return result
}
func parseInput(input string) ([][]rune, map[rune][]Coordinate) {
lines := strings.Split(input, "\n")
rowCount := len(lines)
colCount := len(lines[0])
grid := make([][]rune, rowCount)
antennaMap := make(map[rune][]Coordinate)
for row := 0; row < rowCount; row++ {
grid[row] = []rune(lines[row])
for col := 0; col < colCount; col++ {
frequency := grid[row][col]
if frequency != '.' {
antennaMap[frequency] = append(antennaMap[frequency], Coordinate{Row: row, Col: col})
}
}
}
return grid, antennaMap
}
func findAntinodes(grid [][]rune, antennaMap map[rune][]Coordinate, onlySpecial bool) int {
rowCount := len(grid)
colCount := len(grid[0])
uniqueAntinodes := make(map[Coordinate]struct{})
for row := 0; row < rowCount; row++ {
for col := 0; col < colCount; col++ {
for _, antennaPositions := range antennaMap {
for i, firstAntenna := range antennaPositions {
for j, secondAntenna := range antennaPositions {
//I know I know thats too many for loops
if i != j {
distance1 := int(math.Abs(float64(row-firstAntenna.Row)) + math.Abs(float64(col-firstAntenna.Col)))
distance2 := int(math.Abs(float64(row-secondAntenna.Row)) + math.Abs(float64(col-secondAntenna.Col)))
rowDiff1 := row - firstAntenna.Row
rowDiff2 := row - secondAntenna.Row
colDiff1 := col - firstAntenna.Col
colDiff2 := col - secondAntenna.Col
if rowDiff1*colDiff2 == rowDiff2*colDiff1 {
if (distance1 == 2*distance2 || distance1*2 == distance2) && onlySpecial {
uniqueAntinodes[Coordinate{Row: row, Col: col}] = struct{}{}
} else if !onlySpecial {
uniqueAntinodes[Coordinate{Row: row, Col: col}] = struct{}{}
}
}
}
}
}
}
}
}
return len(uniqueAntinodes)
}

View File

@@ -0,0 +1,39 @@
package day08
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestPart1(t *testing.T) {
r := Part1(`............
........0...
.....0......
.......0....
....0.......
......A.....
............
............
........A...
.........A..
............
............`)
assert.Equal(t, 14, r)
}
func TestPart2(t *testing.T) {
r := Part2(`............
........0...
.....0......
.......0....
....0.......
......A.....
............
............
........A...
.........A..
............
............`)
assert.Equal(t, 11387, r)
}

View File

@@ -0,0 +1,50 @@
........................E...j......W..........L...
............................O........E.........L..
..q......O...........l....................K.......
............q...................HM......W.........
................................1..H...........IW.
....................5.............................
..........k........M...wl............6............
.....O.......w...k.....5.8..l......K.........o.6..
.......k....w.........5.........R.....o........K..
.....q..X..............j........E...I.........K...
............O..........E........................H.
................Mn.h2.w.p....................H....
..................p.......a............j.....L....
.....X...l.p.....................m.........W..6...
..Xq................A..................R..m.......
.........................i..........a..........R..
...........u.....................a........I.....2.
k..............A..n.........R.................o...
................n.................Qo..............
..........u.A.........h........2..................
...5.......Y.....p...............iN...............
1...x.....................i.......................
........M..............2.....Qi...................
...............................I..e...............
......u......A...........m..........h.............
.......1...........U.............Qm.......j.......
.......X.......................................9..
.....u........U.......Y...........................
.............................h.e..................
..................4....e......Q.....L....N........
.1..................4.......................y8....
.........Y................................8.N.....
............P.0J...........3..........8y..........
....V3P..........J................................
............U..P...7x...........e.................
....................J...............r...9.........
.........0.V......Y...............................
...............V.4................................
..........V..........................n............
..............v........7..........................
...........U..........J.......7...................
.....v........7..........................a........
.......................................r..........
...........0.......x................y.............
............6..v.x.....................N..........
...........P......................................
........3.......................r......4..........
..............3......................y............
................................................9.
.................................................9

104
2024/gareth/day09/day09.go Normal file
View File

@@ -0,0 +1,104 @@
package day09
func Part1(input string) int {
files, gaps, lengthOfFinalFile := parseInput(input)
checksum := compactFiles(files, gaps, lengthOfFinalFile)
return checksum
}
func Part2(input string) int {
files, freeSpaces := parseInputPart2(input)
checksum := calculateChecksum(files, freeSpaces)
return checksum
}
func parseInput(input string) ([]int, []int, int) {
var files []int
var gaps []int
lengthOfFinalFile := 0
for i, char := range input {
if i%2 == 0 {
files = append(files, int(char-'0'))
lengthOfFinalFile += int(char - '0')
} else {
gaps = append(gaps, int(char-'0'))
}
}
return files, gaps, lengthOfFinalFile
}
func parseInputPart2(input string) ([][]int, [][]int) {
files, freeSpaces, position := [][]int{}, [][]int{}, 0
for index, char := range input {
length := int(char - '0')
if index%2 == 0 {
files = append(files, generateRange(position, position+length))
} else {
freeSpaces = append(freeSpaces, generateRange(position, position+length))
}
position += length
}
return files, freeSpaces
}
func compactFiles(files []int, gaps []int, lengthOfFinalFile int) int {
fileIndex := len(files) - 1
gapIndex := 0
position := files[0]
checksum := 0
fileID := files[0]
for lengthOfFinalFile != position {
// If there's a gap and a file to move then move the file
if gaps[gapIndex] > 0 && files[fileIndex] > 0 {
files[fileIndex]--
gaps[gapIndex]--
checksum += fileIndex * position
position++
}
// If this file is fully moved go to next file
if files[fileIndex] == 0 {
fileIndex--
fileID++
}
// Update gapIndex if this gap is filled
if gaps[gapIndex] == 0 {
gapIndex++
for f := 0; f < files[gapIndex]; f++ {
checksum += gapIndex * position
position++
}
}
}
return checksum
}
func generateRange(start, end int) []int {
rangeList := make([]int, end-start)
for i := range rangeList {
rangeList[i] = start + i
}
return rangeList
}
func calculateChecksum(files, freeSpaces [][]int) int {
checksum := 0
for fileIndex := len(files) - 1; fileIndex >= 0; fileIndex-- {
for spaceIndex := 0; spaceIndex < len(freeSpaces); spaceIndex++ {
if len(freeSpaces[spaceIndex]) >= len(files[fileIndex]) && files[fileIndex][0] > freeSpaces[spaceIndex][0] {
files[fileIndex] = freeSpaces[spaceIndex][:len(files[fileIndex])]
freeSpaces[spaceIndex] = freeSpaces[spaceIndex][len(files[fileIndex]):]
}
}
}
for fileID, file := range files {
for _, block := range file {
checksum += fileID * block
}
}
return checksum
}

View File

@@ -0,0 +1,22 @@
package day09
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestPart1(t *testing.T) {
r := Part1(`12345`)
assert.Equal(t, 60, r)
}
func TestPart1Long(t *testing.T) {
r := Part1(`2333133121414131402`)
assert.Equal(t, 1928, r)
}
func TestPart2(t *testing.T) {
r := Part2(`2333133121414131402`)
assert.Equal(t, 2858, r)
}

File diff suppressed because one or more lines are too long

141
2024/gareth/day10/day10.go Normal file
View File

@@ -0,0 +1,141 @@
package day10
import (
"strings"
)
var directions = [][2]int{
{-1, 0},
{1, 0},
{0, -1},
{0, 1},
}
func Part1(input string) int {
grid := ParseInput(input)
return CalculateTotalTrailheadScore(grid)
}
func Part2(input string) int {
grid := ParseInput(input)
return CalculateTotalTrailheadRating(grid)
}
func ParseInput(input string) [][]int {
lines := strings.Split(strings.TrimSpace(input), "\n")
grid := make([][]int, len(lines))
for i, line := range lines {
grid[i] = make([]int, len(line))
for j, char := range line {
grid[i][j] = int(char - '0')
}
}
return grid
}
func IsValidPosition(x, y, rows, cols int) bool {
return x >= 0 && x < rows && y >= 0 && y < cols
}
func DFS(grid [][]int, x, y, prevHeight int, visited [][]bool, reached9 map[[2]int]bool) {
rows := len(grid)
cols := len(grid[0])
if !IsValidPosition(x, y, rows, cols) || visited[x][y] || grid[x][y] != prevHeight+1 {
return
}
if grid[x][y] == 9 {
reached9[[2]int{x, y}] = true
return
}
visited[x][y] = true
for _, dir := range directions {
nx, ny := x+dir[0], y+dir[1]
DFS(grid, nx, ny, grid[x][y], visited, reached9)
}
visited[x][y] = false
}
func CalculateTrailheadScore(grid [][]int, x, y int) int {
rows := len(grid)
cols := len(grid[0])
visited := make([][]bool, rows)
for i := range visited {
visited[i] = make([]bool, cols)
}
reached9 := make(map[[2]int]bool)
DFS(grid, x, y, -1, visited, reached9)
return len(reached9)
}
func DFSForRatings(grid [][]int, x, y, prevHeight int, visited [][]bool, trailCache map[[3]int]int) int {
rows := len(grid)
cols := len(grid[0])
if !IsValidPosition(x, y, rows, cols) || visited[x][y] || grid[x][y] != prevHeight+1 {
return 0
}
if grid[x][y] == 9 {
return 1
}
cacheKey := [3]int{x, y, grid[x][y]}
if count, exists := trailCache[cacheKey]; exists {
return count
}
visited[x][y] = true
totalTrails := 0
for _, dir := range directions {
nx, ny := x+dir[0], y+dir[1]
totalTrails += DFSForRatings(grid, nx, ny, grid[x][y], visited, trailCache)
}
visited[x][y] = false
trailCache[cacheKey] = totalTrails
return totalTrails
}
func CalculateTrailheadRating(grid [][]int, x, y int) int {
rows := len(grid)
cols := len(grid[0])
visited := make([][]bool, rows)
for i := range visited {
visited[i] = make([]bool, cols)
}
trailCache := make(map[[3]int]int)
return DFSForRatings(grid, x, y, -1, visited, trailCache)
}
func CalculateTotalTrailheadScore(grid [][]int) int {
rows := len(grid)
cols := len(grid[0])
totalScore := 0
for i := 0; i < rows; i++ {
for j := 0; j < cols; j++ {
if grid[i][j] == 0 {
score := CalculateTrailheadScore(grid, i, j)
totalScore += score
}
}
}
return totalScore
}
func CalculateTotalTrailheadRating(grid [][]int) int {
rows := len(grid)
cols := len(grid[0])
totalRating := 0
for i := 0; i < rows; i++ {
for j := 0; j < cols; j++ {
if grid[i][j] == 0 {
rating := CalculateTrailheadRating(grid, i, j)
totalRating += rating
}
}
}
return totalRating
}

View File

@@ -0,0 +1,31 @@
package day10
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestPart1(t *testing.T) {
r := Part1(`89010123
78121874
87430965
96549874
45678903
32019012
01329801
10456732`)
assert.Equal(t, 36, r)
}
func TestPart2(t *testing.T) {
r := Part2(`89010123
78121874
87430965
96549874
45678903
32019012
01329801
10456732`)
assert.Equal(t, 81, r)
}

View File

@@ -0,0 +1,45 @@
987123434330121232101001234730123456781067632
876076576521010345692340349823212347892398701
945087689432105676787659856714503210987445610
332196576587654989801456787609654502376530923
211543210298923215432321098128778901430121894
300692340147210106523543210039569876589836765
456781678236103267015693016543410231276745650
576890549345234178106782187612320140345654321
985098432100125089235493498109876056034765012
834127102345456978340362569018765487123876678
123236221976347869651251078729034398101985589
014545340889298958707867897430120987012834432
105965456770107843216950956541231276543124501
896872378761016930345441019876501345678023670
787901069654325321210332398545432330589012981
107821543213034321089206787638901421432103210
215430694102123475670115896129876548901210349
126989780210014984308924925014578037654321458
037878921001235675217833210123669123109452367
549865438901045102346542106548754321278501476
678954987432696201256430087239689870347699985
230143006501787349961021298101236787656788014
123272112981010458872787034010345691875107623
054387623472129867763698125676210010961234510
565694502561036789854567012980387121250129878
676783411051045672343218763901296030343278569
989872123432345891050109654812345145467303450
012763094321056700891760345765432256958912341
103450185789763211709851236876301967843211032
814321276656854345612345654954101878701208983
923434434565956745678036783063210989870345674
874532345410345832989123192178981876781456564
265101654323234901808765013265432185692387565
103216765432101267814554323476501094501893474
232109856321011876923601098789678923432102985
343898707896540945498712367765672310567891078
456789010987231234321203456894581455454986569
556776125670102343100157654503490166303890432
543895434894321765212348983212321876212761201
432104898765010894301054581200110955211654300
301256567656987105498765690341034567300563212
434567430547896234787654785652123498456767843
321798121032345375696543098743096567877854952
210899021121036789781232143456787656928923761
326765430110145678710123232109876543210010890

View File

@@ -0,0 +1,89 @@
package day11
import (
"strconv"
"strings"
)
func Part1(input string) int {
stones := ParseInput(input)
return len(blinkTimes(stones, 25))
}
func Part2(input string) int {
stones := ParseInput(input)
return getNumStones(stones, 75)
}
func ParseInput(input string) []int {
strStones := strings.Split(strings.TrimSpace(input), " ")
stones := make([]int, 0, len(strStones))
for _, s := range strStones {
num, _ := strconv.Atoi(s)
stones = append(stones, num)
}
return stones
}
// Part 1 initial thought of recursion
func blinkTimes(stones []int, times int) []int {
if times <= 0 {
return stones
}
result := blink(stones)
return blinkTimes(result, times-1)
}
func blink(stones []int) []int {
result := make([]int, 0)
for _, stone := range stones {
strStone := strconv.Itoa(stone)
if stone == 0 {
result = append(result, 1)
} else if len(strStone)%2 == 0 {
mid := len(strStone) / 2
firstHalf, _ := strconv.Atoi(strStone[:mid])
secondHalf, _ := strconv.Atoi(strStone[mid:])
result = append(result, firstHalf, secondHalf)
} else {
result = append(result, stone*2024)
}
}
return result
}
// Part 2 with maps since blinkTimes(75) would set my computer on fire
func getNumStones(s []int, times int) int {
stoneMap := make(map[int]int)
for _, stone := range s {
stoneMap[stone] = stoneMap[stone] + 1
}
for i := 0; i < times; i++ {
stoneMap2 := make(map[int]int)
for stone, count := range stoneMap {
stones := make([]int, 0)
strStone := strconv.Itoa(stone)
if stone == 0 {
stones = append(stones, 1)
} else if len(strStone)%2 == 0 {
mid := len(strStone) / 2
firstHalf, _ := strconv.Atoi(strStone[:mid])
secondHalf, _ := strconv.Atoi(strStone[mid:])
stones = append(stones, firstHalf, secondHalf)
} else {
stones = append(stones, stone*2024)
}
for _, newStone := range stones {
stoneMap2[newStone] = stoneMap2[newStone] + count
}
}
stoneMap = stoneMap2
}
result := 0
for _, count := range stoneMap {
result += count
}
return result
}

View File

@@ -0,0 +1,12 @@
package day11
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestPart1(t *testing.T) {
r := Part1(`125 17`)
assert.Equal(t, 55312, r)
}

View File

@@ -0,0 +1 @@
965842 9159 3372473 311 0 6 86213 48

View File

@@ -0,0 +1,76 @@
package day13
import (
"regexp"
"strconv"
"strings"
)
type ClawMachine struct {
Ax, Ay int
Bx, By int
Px, Py int
}
func Part1(input string) int {
clawMachines := parseInput(input)
total := 0
for _, c := range clawMachines {
x, y := solveSimEquations(c.Ax, c.Bx, c.Px, c.Ay, c.By, c.Py)
total += x*3 + y
}
return total
}
func Part2(input string) int {
clawMachines := parseInput(input)
total := 0
for _, c := range clawMachines {
prizeX, prizeY := c.Px+10000000000000, c.Py+10000000000000
det, x, y := c.Ax*c.By-c.Bx*c.Ay, prizeX*c.By-c.Bx*prizeY, c.Ax*prizeY-prizeX*c.Ay
if det != 0 && x == (x/det)*det && y == (y/det)*det {
total += (x/det)*3 + (y / det)
}
}
return total
}
func parseInput(input string) []ClawMachine {
clawMachines := strings.Split(strings.TrimSpace(input), "\n\n")
output := make([]ClawMachine, 0, len(clawMachines))
for _, c := range clawMachines {
var clawMachine ClawMachine
line := strings.Split(strings.TrimSpace(c), "\n")
re := regexp.MustCompile(`X\+(\d+), Y\+(\d+)`)
matches := re.FindStringSubmatch(line[0])
clawMachine.Ax, _ = strconv.Atoi(matches[1])
clawMachine.Ay, _ = strconv.Atoi(matches[2])
matches = re.FindStringSubmatch(line[1])
clawMachine.Bx, _ = strconv.Atoi(matches[1])
clawMachine.By, _ = strconv.Atoi(matches[2])
re = regexp.MustCompile(`X=(\d+), Y=(\d+)`)
matches = re.FindStringSubmatch(line[2])
clawMachine.Px, _ = strconv.Atoi(matches[1])
clawMachine.Py, _ = strconv.Atoi(matches[2])
output = append(output, clawMachine)
}
return output
}
func solveSimEquations(a1, b1, c1, a2, b2, c2 int) (int, int) {
det := a1*b2 - a2*b1
if det == 0 || (c1*b2-c2*b1)%det != 0 || (a1*c2-a2*c1)%det != 0 {
return 0, 0
}
x := (c1*b2 - c2*b1) / det
y := (a1*c2 - a2*c1) / det
if x < 0 || x > 100 || y < 0 || y > 100 {
return 0, 0
}
return x, y
}

View File

@@ -0,0 +1,45 @@
package day13
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestPart1(t *testing.T) {
r := Part1(`Button A: X+94, Y+34
Button B: X+22, Y+67
Prize: X=8400, Y=5400
Button A: X+26, Y+66
Button B: X+67, Y+21
Prize: X=12748, Y=12176
Button A: X+17, Y+86
Button B: X+84, Y+37
Prize: X=7870, Y=6450
Button A: X+69, Y+23
Button B: X+27, Y+71
Prize: X=18641, Y=10279`)
assert.Equal(t, 480, r)
}
func TestPart2(t *testing.T) {
r := Part2(`Button A: X+94, Y+34
Button B: X+22, Y+67
Prize: X=8400, Y=5400
Button A: X+26, Y+66
Button B: X+67, Y+21
Prize: X=12748, Y=12176
Button A: X+17, Y+86
Button B: X+84, Y+37
Prize: X=7870, Y=6450
Button A: X+69, Y+23
Button B: X+27, Y+71
Prize: X=18641, Y=10279`)
assert.Equal(t, 0, r)
}

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

File diff suppressed because it is too large Load Diff

172
2024/gareth/day14/day14.go Normal file
View File

@@ -0,0 +1,172 @@
package day14
import (
"fmt"
"strconv"
"strings"
)
type Robot struct {
px, py int // position
vx, vy int // velocity
}
func Part1(input string) int {
// Parse the input
lines := strings.Split(input, "\n")
var robots []Robot
for _, line := range lines {
robot := ParseRobot(line)
robots = append(robots, robot)
}
// Define grid size
gridWidth := 101
gridHeight := 103
// Update robot positions for 100 seconds
for i := 0; i < 100; i++ {
for j := range robots {
robots[j].UpdatePosition(gridWidth, gridHeight)
}
}
// Count the robots in each quadrant
q1, q2, q3, q4 := CountRobotsInQuadrants(robots, gridWidth, gridHeight)
fmt.Printf("Quadrant counts: Q1=%d, Q2=%d, Q3=%d, Q4=%d\n", q1, q2, q3, q4)
// Calculate the safety factor
safetyFactor := CalculateSafetyFactor(q1, q2, q3, q4)
fmt.Printf("Safety Factor: %d\n", safetyFactor)
return safetyFactor
}
func Part2(input string) int {
// Parse the input
lines := strings.Split(input, "\n")
var robots []Robot
for _, line := range lines {
robot := ParseRobot(line)
robots = append(robots, robot)
}
// Define grid size
gridWidth := 101
gridHeight := 103
// Update robot positions for 100 seconds
for i := 0; i < 6285; i++ {
for j := range robots {
robots[j].UpdatePosition(gridWidth, gridHeight)
}
}
DisplayGrid(robots, gridWidth, gridHeight)
return 2
}
// ParseRobot takes a line of input and converts it to a Robot struct
func ParseRobot(line string) Robot {
parts := strings.Split(line, " ")
posParts := strings.Split(parts[0][2:], ",") // Extract p=x,y and split
velParts := strings.Split(parts[1][2:], ",") // Extract v=x,y and split
px, _ := strconv.Atoi(posParts[0])
py, _ := strconv.Atoi(posParts[1])
vx, _ := strconv.Atoi(velParts[0])
vy, _ := strconv.Atoi(velParts[1])
return Robot{px, py, vx, vy}
}
// UpdatePosition updates the position of a robot, considering the wrap-around
func (r *Robot) UpdatePosition(gridWidth, gridHeight int) {
r.px = (r.px + r.vx + gridWidth) % gridWidth
r.py = (r.py + r.vy + gridHeight) % gridHeight
}
// CountRobotsInQuadrants counts the number of robots in each of the four quadrants
func CountRobotsInQuadrants(robots []Robot, width, height int) (int, int, int, int) {
midX := width / 2
midY := height / 2
q1, q2, q3, q4 := 0, 0, 0, 0
for _, r := range robots {
if r.px == midX || r.py == midY {
// Skip robots on the middle line
continue
}
if r.px < midX && r.py < midY {
q1++ // Top-left quadrant
} else if r.px > midX && r.py < midY {
q2++ // Top-right quadrant
} else if r.px < midX && r.py > midY {
q3++ // Bottom-left quadrant
} else if r.px > midX && r.py > midY {
q4++ // Bottom-right quadrant
}
}
return q1, q2, q3, q4
}
// CalculateSafetyFactor multiplies the number of robots in each quadrant
func CalculateSafetyFactor(q1, q2, q3, q4 int) int {
return q1 * q2 * q3 * q4
}
// DisplayGrid displays the current state of the grid
func DisplayGrid(robots []Robot, width, height int) {
grid := make([][]rune, height)
for i := range grid {
grid[i] = make([]rune, width)
for j := range grid[i] {
grid[i][j] = '.'
}
}
for _, r := range robots {
grid[r.py][r.px] = '#'
}
for _, row := range grid {
fmt.Println(string(row))
}
}
// FindEasterEgg determines the fewest number of seconds that must elapse for the robots to display the Easter egg
func FindEasterEgg(robots []Robot, width, height int) int {
smallestArea := width * height
bestTime := 0
for t := 6285; t < 6286; t++ { // Large upper limit to search
// Update robot positions
for i := range robots {
robots[i].UpdatePosition(width, height)
}
// Calculate the bounding box of all robot positions
minX, minY := width, height
maxX, maxY := 0, 0
for _, r := range robots {
if r.px < minX {
minX = r.px
}
if r.px > maxX {
maxX = r.px
}
if r.py < minY {
minY = r.py
}
if r.py > maxY {
maxY = r.py
}
}
area := (maxX - minX + 1) * (maxY - minY + 1)
if area < smallestArea {
smallestArea = area
bestTime = t + 1
fmt.Printf("Time: %d\n", bestTime)
DisplayGrid(robots, width, height)
}
}
return bestTime
}

View File

@@ -0,0 +1,23 @@
package day14
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestPart1(t *testing.T) {
r := Part1(`p=0,4 v=3,-3
p=6,3 v=-1,-3
p=10,3 v=-1,2
p=2,0 v=2,-1
p=0,0 v=1,3
p=3,0 v=-2,-2
p=7,6 v=-1,-3
p=3,0 v=-1,-2
p=9,3 v=2,3
p=7,3 v=-1,2
p=2,4 v=2,-3
p=9,5 v=-3,-3`)
assert.Equal(t, 12, r)
}

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

@@ -0,0 +1,500 @@
p=38,76 v=-61,88
p=28,22 v=-43,-40
p=76,78 v=-98,87
p=39,56 v=10,96
p=38,0 v=79,-15
p=6,44 v=-88,53
p=40,80 v=-83,31
p=11,2 v=28,-31
p=41,91 v=-86,-48
p=8,55 v=-81,95
p=77,19 v=3,-90
p=94,73 v=-59,42
p=51,53 v=35,48
p=12,52 v=72,6
p=62,61 v=96,47
p=78,62 v=47,-57
p=39,54 v=53,50
p=1,43 v=-64,-46
p=9,21 v=28,-36
p=92,79 v=67,-47
p=6,15 v=-58,-48
p=54,67 v=99,-38
p=96,99 v=-55,30
p=90,44 v=-10,-8
p=23,84 v=20,77
p=5,84 v=28,88
p=55,20 v=-31,-36
p=84,43 v=-37,-41
p=12,75 v=-38,30
p=39,2 v=-12,-29
p=74,14 v=56,-81
p=63,53 v=22,-53
p=51,28 v=9,-90
p=53,72 v=48,-61
p=33,42 v=-43,23
p=75,18 v=-89,-37
p=38,83 v=27,38
p=69,31 v=61,80
p=73,3 v=-45,74
p=39,29 v=92,17
p=78,45 v=-23,-47
p=48,59 v=-57,38
p=2,41 v=-71,-93
p=30,13 v=36,-82
p=37,57 v=25,13
p=51,73 v=56,-98
p=76,78 v=38,91
p=56,49 v=22,55
p=34,47 v=10,84
p=83,93 v=81,-16
p=14,70 v=71,-50
p=97,74 v=-4,70
p=33,8 v=93,-35
p=39,70 v=-2,19
p=94,63 v=20,44
p=86,4 v=-33,19
p=17,67 v=26,44
p=39,2 v=-70,-25
p=47,56 v=-79,-55
p=5,98 v=86,-75
p=53,21 v=79,-89
p=53,85 v=61,73
p=46,32 v=66,54
p=30,75 v=49,-73
p=44,81 v=-61,-69
p=82,66 v=-72,-6
p=89,76 v=-13,98
p=57,87 v=30,36
p=12,41 v=59,-40
p=36,56 v=10,-61
p=60,80 v=48,39
p=50,75 v=-44,42
p=66,56 v=-93,-1
p=57,96 v=83,-79
p=98,88 v=-15,-16
p=0,63 v=59,44
p=90,27 v=29,-40
p=21,60 v=-86,2
p=85,13 v=11,61
p=92,77 v=24,-34
p=16,24 v=80,4
p=47,8 v=-79,-49
p=1,28 v=-82,-48
p=80,55 v=6,-72
p=60,94 v=-67,-15
p=83,90 v=-98,78
p=3,75 v=46,-66
p=93,40 v=15,11
p=52,37 v=48,7
p=23,4 v=-47,25
p=46,43 v=57,-98
p=23,12 v=-98,-36
p=11,42 v=-83,50
p=80,33 v=25,54
p=59,95 v=-1,36
p=55,67 v=-44,-60
p=90,80 v=83,-39
p=57,61 v=-1,96
p=51,79 v=31,39
p=28,89 v=85,35
p=12,98 v=28,-80
p=25,61 v=-95,-50
p=77,84 v=-37,78
p=50,80 v=66,89
p=93,32 v=-15,-45
p=30,4 v=-96,-29
p=81,95 v=14,-66
p=23,3 v=42,-16
p=33,69 v=-96,-10
p=28,23 v=-43,68
p=77,25 v=-45,-41
p=27,96 v=-69,-32
p=41,15 v=-53,-35
p=66,81 v=-22,5
p=5,15 v=13,-95
p=88,1 v=-59,-26
p=48,41 v=16,-19
p=88,75 v=33,46
p=21,9 v=-64,-86
p=36,4 v=-16,-95
p=68,22 v=-5,65
p=8,43 v=-34,46
p=71,68 v=-49,-59
p=37,92 v=-48,-18
p=59,43 v=-21,-10
p=69,31 v=30,58
p=90,77 v=46,-74
p=42,42 v=-76,20
p=58,34 v=78,55
p=18,10 v=33,2
p=23,92 v=45,-69
p=23,45 v=-32,27
p=63,50 v=39,-96
p=8,72 v=-34,85
p=22,102 v=-69,26
p=73,14 v=-45,-38
p=65,54 v=-51,68
p=99,29 v=-16,67
p=29,60 v=15,-19
p=85,76 v=-54,80
p=21,23 v=-3,-47
p=9,37 v=94,-44
p=99,77 v=48,80
p=48,47 v=18,56
p=26,61 v=36,-57
p=80,58 v=56,90
p=37,6 v=53,-90
p=47,15 v=53,60
p=4,79 v=70,52
p=35,8 v=31,12
p=18,8 v=25,-30
p=80,38 v=33,45
p=23,26 v=-69,61
p=10,35 v=-78,-96
p=53,17 v=48,-34
p=24,45 v=72,-2
p=65,75 v=-1,-38
p=5,72 v=-49,39
p=63,87 v=-27,-16
p=0,46 v=-34,73
p=14,46 v=55,-15
p=28,70 v=45,92
p=29,30 v=89,10
p=98,31 v=-46,-89
p=1,85 v=-77,82
p=30,79 v=-43,28
p=29,70 v=-81,65
p=51,97 v=13,-25
p=76,19 v=-23,18
p=36,83 v=-17,91
p=52,34 v=-39,-98
p=35,46 v=-43,55
p=97,13 v=-99,-26
p=40,26 v=27,13
p=18,38 v=89,57
p=45,57 v=-79,-52
p=86,76 v=-54,-64
p=12,38 v=28,55
p=6,56 v=-86,97
p=85,100 v=-41,-22
p=4,34 v=28,-95
p=89,33 v=-4,-73
p=82,20 v=-33,-15
p=98,5 v=31,43
p=85,81 v=73,88
p=13,42 v=-90,-49
p=93,60 v=-91,-64
p=56,7 v=-5,64
p=9,5 v=45,76
p=61,4 v=74,86
p=23,53 v=-7,3
p=89,21 v=-38,-74
p=13,44 v=-86,10
p=96,62 v=-11,96
p=5,98 v=-22,3
p=26,26 v=-73,-93
p=52,95 v=-5,42
p=62,50 v=-57,-7
p=11,2 v=41,-77
p=23,73 v=-2,-97
p=34,77 v=-47,-71
p=91,58 v=99,43
p=41,74 v=-53,42
p=75,102 v=55,-81
p=89,95 v=30,8
p=76,28 v=-80,12
p=82,27 v=-43,77
p=62,63 v=-97,21
p=94,73 v=-58,14
p=13,35 v=-47,-46
p=56,0 v=61,25
p=94,39 v=11,8
p=96,53 v=77,-53
p=23,78 v=-43,-7
p=24,51 v=-74,-86
p=77,33 v=60,8
p=84,71 v=-76,19
p=78,96 v=82,3
p=61,92 v=-58,-30
p=9,75 v=94,-34
p=89,13 v=7,-26
p=16,67 v=-25,96
p=95,43 v=-25,-54
p=39,62 v=18,-40
p=41,36 v=17,-65
p=2,42 v=86,-10
p=29,54 v=55,-2
p=51,74 v=-44,92
p=75,40 v=-36,-96
p=60,15 v=-93,-84
p=44,33 v=44,8
p=88,51 v=85,-94
p=26,60 v=43,62
p=94,22 v=-81,-98
p=4,50 v=-94,-96
p=87,47 v=-55,3
p=15,80 v=33,-14
p=4,48 v=-24,-48
p=57,36 v=-18,-98
p=87,12 v=76,63
p=53,17 v=-91,-81
p=17,96 v=53,6
p=91,40 v=95,-46
p=23,28 v=-55,55
p=81,7 v=-54,16
p=62,102 v=-97,-77
p=42,31 v=80,-41
p=99,53 v=-72,57
p=17,29 v=98,58
p=24,57 v=84,-48
p=98,101 v=-33,-30
p=77,82 v=-36,-25
p=44,8 v=83,18
p=27,35 v=-27,16
p=95,58 v=-29,52
p=87,40 v=60,-91
p=66,1 v=17,24
p=17,11 v=63,21
p=67,77 v=-23,-11
p=91,30 v=-59,64
p=22,34 v=7,84
p=55,90 v=48,29
p=45,45 v=31,50
p=12,34 v=65,-86
p=40,48 v=18,-1
p=39,42 v=75,11
p=28,27 v=63,-49
p=93,44 v=-81,3
p=8,78 v=-51,-15
p=6,37 v=-51,-42
p=73,89 v=-45,23
p=2,80 v=-23,50
p=93,37 v=55,-44
p=16,52 v=-54,35
p=15,17 v=-33,74
p=84,37 v=-6,-48
p=13,47 v=50,-48
p=88,34 v=-79,-39
p=16,68 v=50,94
p=20,78 v=-99,29
p=100,20 v=77,64
p=79,2 v=-91,30
p=52,0 v=-95,-86
p=4,84 v=79,35
p=13,74 v=19,-66
p=57,55 v=-9,-63
p=21,30 v=19,-94
p=50,37 v=-66,4
p=9,56 v=94,95
p=91,59 v=55,-65
p=77,15 v=34,-33
p=5,100 v=81,-26
p=26,96 v=-34,83
p=36,64 v=-44,94
p=37,65 v=-70,51
p=74,6 v=25,-93
p=33,78 v=-17,-48
p=0,33 v=-6,-39
p=3,55 v=-11,96
p=32,19 v=-8,-33
p=60,53 v=-5,-55
p=75,62 v=56,45
p=74,71 v=12,-66
p=50,74 v=-53,91
p=24,90 v=-19,-57
p=58,53 v=31,5
p=13,95 v=-33,20
p=30,98 v=41,-70
p=54,78 v=71,-43
p=78,73 v=26,53
p=66,30 v=-49,60
p=81,87 v=-24,-15
p=28,27 v=-31,11
p=75,18 v=-89,10
p=76,82 v=-89,-66
p=44,65 v=-17,98
p=17,42 v=-7,-5
p=75,92 v=-54,32
p=95,10 v=-28,-76
p=20,36 v=-22,-62
p=100,0 v=11,21
p=37,39 v=5,-46
p=80,50 v=-63,7
p=77,28 v=-98,2
p=61,41 v=-1,-40
p=88,78 v=95,-17
p=83,1 v=47,-30
p=47,67 v=-30,-9
p=14,81 v=-38,82
p=40,97 v=-31,76
p=76,27 v=37,-70
p=25,73 v=80,35
p=88,84 v=-33,77
p=60,71 v=83,35
p=14,93 v=-3,-25
p=40,45 v=-35,4
p=34,35 v=15,19
p=87,100 v=90,-66
p=20,90 v=-42,-68
p=90,44 v=50,-52
p=43,77 v=31,89
p=99,81 v=33,-12
p=28,35 v=58,-37
p=37,52 v=57,6
p=48,65 v=-66,23
p=63,21 v=39,-35
p=91,77 v=-15,-70
p=27,28 v=93,-94
p=18,61 v=-99,38
p=56,36 v=-98,81
p=90,75 v=-72,-67
p=86,21 v=-13,-46
p=20,88 v=89,-74
p=17,41 v=-82,-98
p=28,65 v=45,-72
p=85,15 v=35,41
p=39,43 v=-2,-36
p=93,72 v=-94,91
p=90,73 v=-64,77
p=83,43 v=-94,-99
p=50,59 v=-49,51
p=58,25 v=13,-36
p=25,102 v=-44,-54
p=100,86 v=16,-23
p=45,42 v=21,-90
p=9,29 v=-13,18
p=24,41 v=1,-47
p=69,33 v=-58,55
p=80,52 v=52,-2
p=82,77 v=82,-11
p=86,78 v=-41,-69
p=89,58 v=69,-13
p=12,91 v=-55,-65
p=69,40 v=-93,59
p=8,26 v=2,19
p=21,47 v=19,3
p=38,20 v=25,-83
p=20,99 v=54,31
p=20,74 v=-14,-30
p=51,83 v=-40,24
p=61,30 v=-27,-94
p=84,19 v=-28,69
p=28,33 v=-65,3
p=58,91 v=-93,-18
p=33,78 v=22,92
p=86,53 v=63,-43
p=53,79 v=-26,-42
p=83,16 v=94,56
p=21,0 v=-64,-35
p=48,80 v=-97,79
p=62,18 v=29,71
p=17,13 v=-69,-36
p=1,93 v=19,75
p=7,75 v=41,93
p=65,61 v=-45,65
p=56,71 v=92,-63
p=71,102 v=-53,-21
p=64,79 v=96,49
p=40,13 v=-74,-84
p=28,71 v=93,91
p=43,68 v=-39,-6
p=10,40 v=63,55
p=73,0 v=-97,-82
p=26,38 v=85,-27
p=27,94 v=36,-79
p=1,99 v=-82,-30
p=66,96 v=-23,31
p=78,21 v=96,16
p=10,93 v=-51,-76
p=76,87 v=78,80
p=13,20 v=-38,68
p=31,42 v=-43,5
p=56,10 v=-53,-33
p=76,61 v=34,-4
p=73,2 v=-36,74
p=93,83 v=15,-19
p=76,50 v=20,-51
p=27,53 v=36,-51
p=93,97 v=50,72
p=59,22 v=87,21
p=95,22 v=-29,66
p=56,35 v=79,10
p=60,38 v=17,-94
p=67,41 v=-5,6
p=97,71 v=-73,35
p=26,10 v=-73,74
p=74,71 v=5,64
p=36,91 v=84,-17
p=38,91 v=67,33
p=19,64 v=41,-9
p=89,15 v=-59,66
p=5,94 v=94,-27
p=92,21 v=7,-87
p=87,64 v=-28,-5
p=22,6 v=-95,25
p=59,42 v=-51,-7
p=50,95 v=88,29
p=59,91 v=73,-21
p=52,42 v=-75,56
p=10,39 v=-30,7
p=88,79 v=29,-62
p=31,89 v=-21,-82
p=43,60 v=4,52
p=2,76 v=-68,-15
p=13,71 v=-38,97
p=93,38 v=1,-95
p=53,99 v=10,16
p=94,72 v=-98,30
p=1,3 v=37,-82
p=68,78 v=55,18
p=1,78 v=42,-7
p=80,84 v=52,-26
p=75,46 v=-87,-20
p=71,27 v=95,-39
p=90,18 v=73,11
p=99,3 v=62,52
p=39,88 v=-80,-93
p=85,32 v=69,-40
p=72,23 v=-28,-75
p=22,59 v=98,-7
p=69,76 v=12,93
p=56,59 v=30,50
p=80,92 v=-49,-80
p=4,40 v=-77,-50
p=90,60 v=40,-28
p=6,79 v=9,56
p=63,47 v=57,-59
p=33,62 v=22,37
p=74,27 v=78,70
p=26,101 v=-43,-49
p=1,24 v=-29,-38
p=73,90 v=56,79
p=5,90 v=-20,-75
p=16,35 v=94,8
p=96,93 v=4,58
p=61,43 v=4,4
p=13,68 v=76,94
p=5,29 v=86,-95
p=32,81 v=39,-85
p=94,42 v=-37,55
p=80,20 v=60,22
p=43,94 v=57,-19
p=93,4 v=51,-26
p=12,4 v=62,-58
p=87,74 v=-98,-64
p=81,41 v=-26,69
p=30,54 v=-30,-13
p=73,4 v=21,-30
p=68,35 v=-49,-44
p=47,2 v=19,-70
p=92,100 v=33,79
p=81,11 v=73,-83
p=46,75 v=-62,-69
p=48,56 v=-13,-56
p=7,84 v=15,30
p=92,10 v=28,69
p=15,31 v=-87,61
p=95,0 v=33,79
p=3,61 v=-37,-50
p=73,95 v=96,20

156
2024/gareth/day18/day18.go Normal file
View File

@@ -0,0 +1,156 @@
package day18
import (
"container/heap"
"strconv"
"strings"
)
type Point struct {
x, y int
}
// Item represents a node in the priority queue.
type Item struct {
point Point
distance int
index int
}
func Part1(input string) int {
grid := parseInput(input, 1024)
_, distance := dijkstra(grid)
return distance
}
func Part2(input string) int {
lines := strings.Split(strings.TrimSpace(input), "\n")
numLines := len(lines)
for i := 1; i <= numLines; i++ {
grid := parseInput(input, i)
_, distance := dijkstra(grid)
if distance == -1 {
println(lines[i-1])
return 2
}
}
return -1
}
func parseInput(input string, upToLine int) [][]rune {
grid := make([][]rune, 71)
for i := range grid {
grid[i] = make([]rune, 71)
for j := range grid[i] {
grid[i][j] = '.'
}
}
lines := strings.Split(strings.TrimSpace(input), "\n")
for index, line := range lines {
if index == upToLine {
break
}
cords := strings.Split(strings.TrimSpace(line), ",")
x, _ := strconv.Atoi(cords[0])
y, _ := strconv.Atoi(cords[1])
grid[x][y] = '#'
}
return grid
}
// PriorityQueue implements a priority queue for Dijkstra's algorithm.
type PriorityQueue []*Item
func (pq PriorityQueue) Len() int { return len(pq) }
func (pq PriorityQueue) Less(i, j int) bool {
return pq[i].distance < pq[j].distance
}
func (pq PriorityQueue) Swap(i, j int) {
pq[i], pq[j] = pq[j], pq[i]
pq[i].index = i
pq[j].index = j
}
func (pq *PriorityQueue) Push(x interface{}) {
n := len(*pq)
item := x.(*Item)
item.index = n
*pq = append(*pq, item)
}
func (pq *PriorityQueue) Pop() interface{} {
old := *pq
n := len(old)
item := old[n-1]
item.index = -1
*pq = old[0 : n-1]
return item
}
func isValid(grid [][]rune, x, y int) bool {
return x >= 0 && x < len(grid) && y >= 0 && y < len(grid[0]) && grid[x][y] == '.'
}
func dijkstra(grid [][]rune) ([][]rune, int) {
directions := []Point{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}
rows, cols := len(grid), len(grid[0])
// Validate start and end points
if grid[0][0] != '.' || grid[rows-1][cols-1] != '.' {
return grid, -1 // No path if start or end is not valid
}
dist := make([][]int, rows)
for i := range dist {
dist[i] = make([]int, cols)
for j := range dist[i] {
dist[i][j] = 1 << 30
}
}
pq := &PriorityQueue{}
heap.Init(pq)
heap.Push(pq, &Item{point: Point{0, 0}, distance: 0})
dist[0][0] = 0
path := make([][]Point, rows)
for i := range path {
path[i] = make([]Point, cols)
}
for pq.Len() > 0 {
item := heap.Pop(pq).(*Item)
x, y := item.point.x, item.point.y
if x == rows-1 && y == cols-1 {
break
}
for _, dir := range directions {
nx, ny := x+dir.x, y+dir.y
if isValid(grid, nx, ny) {
newDist := dist[x][y] + 1
if newDist < dist[nx][ny] {
dist[nx][ny] = newDist
heap.Push(pq, &Item{point: Point{nx, ny}, distance: newDist})
path[nx][ny] = Point{x, y}
}
}
}
}
// Check if no path exists
if dist[rows-1][cols-1] == 1<<30 {
return grid, -1 // No path found
}
// Reconstruct the path
x, y := rows-1, cols-1
for x != 0 || y != 0 {
grid[x][y] = 'O'
x, y = path[x][y].x, path[x][y].y
}
grid[0][0] = 'O'
return grid, dist[rows-1][cols-1]
}

View File

@@ -0,0 +1,65 @@
package day18
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestPart1(t *testing.T) {
r := Part1(`5,4
4,2
4,5
3,0
2,1
6,3
2,4
1,5
0,6
3,3
2,6
5,1
1,2
5,5
2,5
6,5
1,4
0,4
6,4
1,1
6,1
1,0
0,5
1,6
2,0`)
assert.Equal(t, 22, r)
}
func TestPart2(t *testing.T) {
r := Part2(`5,4
4,2
4,5
3,0
2,1
6,3
2,4
1,5
0,6
3,3
2,6
5,1
1,2
5,5
2,5
6,5
1,4
0,4
6,4
1,1
6,1
1,0
0,5
1,6
2,0`)
assert.Equal(t, 0, r)
}

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

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,90 @@
package day19
import (
"strings"
)
func Part1(input string) int {
towelPatterns, designs := parseInput(input)
result := countPossibleDesigns(towelPatterns, designs)
return result
}
func Part2(input string) int {
towelPatterns, designs := parseInput(input)
result := totalArrangements(towelPatterns, designs)
return result
}
func parseInput(input string) ([]string, []string) {
parts := strings.SplitN(input, "\n\n", 2)
towels := strings.Split(strings.ReplaceAll(parts[0], " ", ""), ",")
patterns := strings.Split(strings.TrimSpace(parts[1]), "\n")
return towels, patterns
}
func countPossibleDesigns(towelPatterns []string, designs []string) int {
memo := make(map[string]bool)
count := 0
for _, design := range designs {
if canConstruct(design, towelPatterns, memo) {
count++
}
}
return count
}
func canConstruct(design string, patterns []string, memo map[string]bool) bool {
if design == "" {
return true
}
if val, found := memo[design]; found {
return val
}
for _, pattern := range patterns {
if strings.HasPrefix(design, pattern) {
remaining := design[len(pattern):]
if canConstruct(remaining, patterns, memo) {
memo[design] = true
return true
}
}
}
memo[design] = false
return false
}
func totalArrangements(towelPatterns []string, designs []string) int {
memo := make(map[string]int)
total := 0
for _, design := range designs {
total += countWays(design, towelPatterns, memo)
}
return total
}
func countWays(design string, patterns []string, memo map[string]int) int {
if design == "" {
return 1
}
if val, found := memo[design]; found {
return val
}
totalWays := 0
for _, pattern := range patterns {
if strings.HasPrefix(design, pattern) {
remaining := design[len(pattern):]
totalWays += countWays(remaining, patterns, memo)
}
}
memo[design] = totalWays
return totalWays
}

View File

@@ -0,0 +1,35 @@
package day19
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestPart1(t *testing.T) {
r := Part1(`r, wr, b, g, bwu, rb, gb, br
brwrr
bggr
gbbr
rrbgbr
ubwu
bwurrg
brgr
bbrgwb`)
assert.Equal(t, 6, r)
}
func TestPart2(t *testing.T) {
r := Part2(`r, wr, b, g, bwu, rb, gb, br
brwrr
bggr
gbbr
rrbgbr
ubwu
bwurrg
brgr
bbrgwb`)
assert.Equal(t, 16, r)
}

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

@@ -0,0 +1,402 @@
rrgbg, rgguubg, rbru, rb, rrrw, wbu, gbgb, uururg, ubru, rugb, bbru, b, rggurg, wgru, bgrwb, rrgubg, ubrrbg, wgurru, rrrrw, rbrwu, wubwb, wrbbr, bgbu, brrww, brg, gbwu, wrubuur, gur, grbr, gruwrrbg, bgwr, wgugbgb, rwbru, wuwr, rrg, ruwg, rgwgr, ubu, wbr, bwg, gbu, bgrwrb, wwrw, bb, gr, rug, grr, ubwb, rbruwbu, guggug, ugu, rwbuu, bbur, wbrww, wubw, br, gruu, gwr, wrrwwu, wug, bgu, bgb, wugb, grb, rbbg, grgbwgb, rwu, bwrbb, uwrbbru, bbu, wrg, rwg, ggbgbg, wbwru, wrgrw, bburr, bgr, rgbg, bwwwugrb, uwu, rwuwrg, gguburu, uwubwu, wb, wgguug, ugrbw, rbgu, rwwu, ggbbgb, gw, wgg, rrw, uurg, uubg, bgurgb, uwgbr, wbrwu, rrbb, rww, bwgb, uugru, ggrbub, wubgw, rwwugr, uuwur, burbrg, bbr, ggb, wgr, gwbgw, rrbu, wuwwrwb, rbbr, uubw, buuu, ubbwggu, brr, urguww, uggwwgw, ugw, ug, rub, grrrwu, wurburgg, wwww, ruu, wrb, rrur, urggr, bwbwwwrg, wwbu, bbg, uwb, ggugu, gbbr, rbrgw, bg, bbuu, uwrgrg, ggbwrgw, wwgwugr, wgbwuwb, gbrwg, bbw, wwrgu, rgrwrbwb, wwwg, gugbgbg, bwrwub, rw, gbb, ggw, rrb, urrbbwb, urbu, grg, rbugggb, bruwg, uubgwgw, bw, uubgu, rru, rwww, gu, wrbrg, guu, wgu, ruuru, wubrrg, brugrg, uuggb, wrurg, rgb, rbu, urg, buw, grwbg, gwuw, grbbg, wuwu, gbgbbw, uugrwrww, wbguub, grrgbug, u, uug, uwr, wrwb, gbg, bru, wwg, bbwur, bbbbbbbw, bugbb, rwurrgr, wwb, ugbbw, bug, grgg, bgwgrrb, uggu, rurguru, wwr, rbw, ubwwgw, wrrw, rrbg, g, rgrbub, gruggw, bur, ubgb, bgg, uwur, ur, bbbwb, gwbu, wuww, uruuuubb, wbru, ugggg, gbuu, rgg, wwwug, gbrwgg, guwgr, urw, wbur, bu, rur, rrubr, ugb, ubrgrb, rbbgg, rbwrg, rggw, rguug, wwu, uur, wrrguggu, brbb, bwwwbr, guw, gugw, wgubwu, rrr, ub, ru, brrbbruw, bwwgrrbb, rubgu, uggwwg, wbb, rwr, r, ruuu, wbggg, wwwu, grbrb, rrrrr, ruwb, wuuw, rbbb, ugg, wbg, rguwr, wbw, wbuwg, ubbgrbb, urugu, rbubw, wrgwuuwu, grw, ubbbu, bwurb, rwuu, rgbbwur, urbuu, uww, wuw, bwurgu, wur, wuwwrbur, wwuu, wbgw, grbbbw, wuub, urb, wuuguuwg, wg, gwrgr, gbug, gbrbw, rwgg, brbbu, bwww, wrbbbu, wwgbggb, burug, gww, ubgrrb, bgw, rgbb, brb, wbuu, brw, ggrbrbwg, uwruw, wrgurrbb, guwrgu, rr, ugggrbr, bgrgg, urgbrbrb, wrw, wwubggu, ugurwg, grrg, bwrb, rrgwuuw, rrru, wurg, bgurwu, rgurbb, uuub, uuwb, rrrg, wrgrrrww, uwg, bgbguu, wrgwb, wwwru, rg, rrurwur, urrbb, bww, rrwwbbb, ubr, wgrbu, gru, ubg, gb, ggr, gbwbwru, uuw, rbb, gugwrg, gwb, bbb, rgrggw, uw, wggbbg, rwgubgb, gwbw, brrr, gugbwu, rwrr, uuuwbb, ugrrr, rgu, wubrwr, wrr, bwb, bwbgurb, rrrub, wub, rwgrug, rurb, gwrgrbr, rbrwbb, wwrgbg, urr, bwu, bwgu, rbuuw, bbub, wbbwubu, ggg, wbwwgwb, buwbg, wwwuru, rbg, gubugg, gbwb, www, rbr, ubur, grbbw, wgw, gbw, wgrw, rguuuu, rwb, gbrw, bbbb, gururbb, rbggwu, bub, bgbr, gurb, rrbgrb, rurwb, ugr, wgwrg, ruw, bgrr, gwu, gbr, uwugwru, wru, wr, ugbruw, grbubb, gwg, gwggurg, gugbr, ugubbgb, uwrw, uru, bwr, rgr, rbgrwg, buuw, ugbur, urgub, wurrrgww, rgguuwru, burr, rgw, rbruw, rwbwbbr, bwguw, uub, wgb, rgur, ubb, urwg, rwgww, wgub, rwwrgu, gg, rgug, gub, bggr, uuu, uu, rbug
bubrbbwggggbuuwbbrwwbbgbwrruugwbwgbwugbugrgu
wugwgwggbgubuuwugugrugwbrrwrbwwguburbbbggw
wbbrrwwbgwbgrrbwuuwrbbrwuwburgbwgwwuruwgbggubwug
ubrwbrbrggrwgbwbwwuwwguurbubwrbgwwrubbrwuwururwrr
gggrwbgwbwuwrubrguwggruubrggwgbrbguwrbrgwuurbwggrggrwwwrb
wuurugububruuwuggwuuwgbwwbrbwgrrrubwbuuwu
grrrwrwgwuwrburruuwwubgubwwwrrrwbwwbggrbrgr
gugrrubugrgrwgggggrbrbrwgguurrwurgrbuggrrbbwgwwwbuu
wubuwgwuwrrubbwuwwrburrwbrrubgurbggbbubrwrguwururgww
ubbrgurrbgbrbwguggugwrrrurwwwugbgrwwbuwrbggrgwwrgwbrwwuugb
bgwbwwwrrgugwwwugruwrbgrbrwbwbrwurbgruwgrggwruururb
guwurburwrguurwbggrrwwugurguwbubbrggrggrubrbbbrwwbgw
wgwuurwrgubguugbbgrrwbwgrwbwrwgbwrwburggrgbbuuw
grbgrruuwrgwwuburwggbubbbgwwrgrbubggwrwbuurwwbuubuwrgwb
bbwuubwuuwwubrwrwgbbrgwwurwbbwwburwuwwwubwrubguubggruwbbg
rrugrwurbugrrbggburwurbbgbuugwwrgbwrbrwbgbgrbwbuuww
gubwuubuwrrwgbuwbwguubuwwbwwrrwgbwbuwgguguwuwbwu
rrbbubrrrwubrrwwbrrbwrbwugbrbrggwbgrwgugwuugg
uurwrgruuwbwuubbrwubrwuuwwgubwgrwbbwgbwwwrbgugrbwururgurb
rbwbbrguggubguurrrrburuwrrubgbgrwrbugrrrgruburwb
grggbggwrubwwwwgrurwgbwuubguwrrrbgubruguub
rrbgbggwbwbrbrrwwgbbggrruwgggurgbrbrwubwuurrbbbwgrbrgrurr
gububbuuguwgbgrwgwgruburwrgwgbbrbrruururrrubrgggwwrbgb
ruurrgggbwbrggwggrurgrwgwbgburwwuwgubggubru
rbrrwgrgrrwrbwbrbggbwrwwuwrbwuwuuwbgbrwrgrwwgbuugbugg
wwbwrrbrrruuwrrwgggruwbubrrwrwuwwurwurbrbrrrw
wbguwwwwwguuuwuubrwgrgwguugrbrruwwrwgugbbb
rrggwbububgbgbguggwwgurbgbwuwwrwrgwuuwruggu
rbguubrrbrgwwgwbgrwrbrggwuwguuuwbwbwwbuwgr
wgbrrguuurgggrwgwgbrbguugrururubruugrrrrgbrgugbg
bgurwgugurwwbuugwurrgurwwrgwgubgrrgururubguuuwugbg
rwbbuwuwbgwbbwurbubwwugbgrbugrbuurbwwbrrwruwrrrwww
rbrburwwbwugrggwrrrruwwgbrgurbwwrrburbbggugbwbu
burgwubggburuuguuwrwbbgbuguguwwburububwrrgw
gggubgbgbwgrggrbrbrgguruurwbrrwubbrbruwgwbu
wggruwwgbwgguwgbgbggrbggbbbwbwwwrgrwwggwrgguuwwgwubgru
bbrwwruugwwbbbwububuuwruburbwbbgrwbburrgbbrub
gwggggwgguuburrgrgugrwgwrbbggggurgugugrgrgwwbr
gggbbugwgbwgwugrrgbwrrwurrgugburrggrruugurbrugrbbbg
gbwrwggbuggurrgubuguubrbgwbrubgwgrbrwubbgrr
bwuwgurrrgwwgguubggwwuurbbrbbwgwggwuwgbbwrwrburgr
wgrwwubbbwbbrggrgugwggbubwwburubwwuwgbbubbrrrrguubguwbuuu
rguuurgbrbrbuubgbuuggrwrwgrwugwrwgbwbbwbbgg
uugbgwguuggwgwrrggggwrbrgbguuguwrbrgwgbwwuubgugwwug
rbuuwwwrrrurgrgbrbbbrrbbwwwgwgwuwgbwggrbbwbruwwwwbg
wwgwuurrurrbbgwuwwbgrbbrbruugwwgugbrbrgguuwrugwuguurbgwrru
wrgwrrbrgugrrwguuguwburwuguuggguwwgbguwrbrbgubrg
wbrugwbubuggrruggbruwrgrwgugwgbwugugbwguwwuubbrwwubggw
grbgrrbrwggurbbrwugrwbbrurwrwbruuggwrggrrgrgwwbuwbgurb
gwwurrbwrgrgurwuugwbwrgrrrwwwrwguwbrbrrurwbwbuggrwb
wubguubgbbwuwbwgwwrrrgbuggwbwwwugrbbgrwubbrgurbuwwrgbur
uurgwruubgrbgubbwrubbggrububgrwwrubwwbrgbbu
uruuwrrbwbbugbbbrwguwbwuguurbwrurugwuwwguwbgb
wurbgrggbggbwwgwwbbgbbrurrrwggrwwrbrbrwrbg
ggwwrrbbwgubrgrgrgwuububrbrggbwwbubgbbgwubrgwrbururu
grrgubuwgwuwuururwwrbgwrgrurrbbrwbgruggrbggbwubrb
grbbrwbrgwgrgubuwbuwbrwuwugrbwuwwguwrbwbwwbuurgbwgw
uuguwrwggruurrggurrbgurbwgggugbgrrguugggwurgrrgubugbugugg
wrwugwwuwwbrubwwuruuwuwrugugbwwgugrrbuuguwggbrguuugwgwbw
uuggwbgurgurbgruruwwrrgubbuwwruruwrurbwugguwbwbgrgg
urwbggurwbwguurugbrbwbrbgwrgrbbrubrubburuwrburww
wbbrbwwwwrbruubggwrurgugbgbbuwgrrrrwugbwwwr
ubugrwubbgbrrrrgguugurgbubwgruuwrrgrbguuuw
rrruwrgwrggwburgugwbwwwbggubuwbwuuurrggwwbwrgwgwggbguubw
rgrgbrguruguwrggbrgruwrrbgbbbwugbrbgrbrrrggrubwuubwwbguw
rbggwgugrbwbrbwurbrugrwbbbwuuuwrwgbbbrwbuwgbwrgggurbwug
rgbuuwurbrwwuwbrugbggwbgbrrwguguwbubrubwguubbubgrgrwu
gwwwgbrguruuwggwugguuwwrbwgbgwuwuuwrgruguwrbugurrwruw
ubbgwurbrwrwggwubggugrgugwurwwbbbrbwbwgubw
wurggrrwbwgbwuguurgwgurgugwbguuurrubuwwggwgggwg
ugbrrwbgurbugwwwbggggggrugububwbguurruggrgrubuuwgurrwbbu
rbrurrwuuugbwwgubugbuugruwwurwrbrrbrbgwurwuuu
rrurrrwrwrrrbbbwguuwrruwguwuggbgguurrbbgggbwruurugurgb
rurwwgugrrrrwbwurugwrugbgwwbuwrbwuwuguggub
ubbgbrgggbuwggwgrgbgrgwbwggrrwbrggwgubuwgrwrbwrg
wggruuggrwbwrwrugwgbuwggwbgrbuggrgguggubbrbruuu
ggurbuwwbbubrguuubgwugugrgrguwrwbrubrgbwwrg
rgrgbbbbwwruubwuwguwgububwgruwgruggbgggbuggwwgwuwwgu
guwugugbrrbrruggwrbwbbgbburubwuuurbugubwrrug
grurwuuwrbguuwgruubwwbuubwbuurgugrgrwbggggwugbgruuurww
wuugguggwrrgruwgbbrrgbwbruubgrbbrburgugurgwggwgggrrur
grgbbrwuwwrrgggwwwuubuggwrbgrgbwrwwrrwrwguwggw
bwuuguwwrbbgrwubbbrwwwrrururbwgbrrrrwbrbgrbgbbu
urggrwbggwubgggrwwgwgbwbggwggrwrrrbgwrruwbbrbguuwrw
bubruuwrrbbruwbbugwuuwbwwbwbbuwubgrububwwrgwubgrggrruwggg
rurgwubgbwrrwuwuuggrrrwwgwrgburbggwwrubuwwuwgwruwurugw
wgbgururuggrbrugbwrguruugguubrgwrgguwgwruwbgrrr
uubwrbrgggrugurgbrwuugrwrwwwrgbrgwwugbwubwgrr
bggugwwurguwbgbwbwbuwwbrruubbgbbrbwbburugrr
wrwbrbgbbrwugrwbbwgbgggbrwurgrwubuggwurrrugu
grrwbgubrrwruubuugguurrrbrbubbrwgrbbguguub
uburuugrwbrurguwgrgwbrrrgrbbgbrbuwrrbugrgbrbbug
wgbuwuuwuruwuwuuwuwgggrbugburubggbgubwgbuuggbur
wuugrbbwuguwuwwuuruwrwbgurrbbwbwwrwuugbwgbuugbgwwrwwwgw
uruburbbbrwbuwrrbrbguuggbguruwwrruburwgwggr
rurbbururbwuwuwrrrbbbwbuuwwwuwrrggurgrrurgruggwuubwrww
wrbrwwggubwbugrrrgbugubgruggurwwrwuwwwrgbrrugbbbubwgwb
gwruggbrbbrwubgbuwwwrugwbubgugwuuugggurwuuwrururugg
bwgububwrrgruwubrrubwwubrwrbgrurwgrrrwbrwbubggw
urwrbwwrubbuwrbbwgugrbrburrgbbuugbbubbbugb
buggwggugwuwwwugggbrrrbbggwwuguguubugbrugu
wbrwwbwuwbwgrubbuurbuurgwubrwwwuruwuurbrubbugwuw
bbrbggbgwuguburwrgrbgrbrbugrgwbwubgwwuwbwbwrbwrwbgb
wuugrubwgggbugrbwgwgurgwuubuubrbrrbbruwbwrwgguwrrrwbwgbbw
wuugwgbwrrgugguwwgbwgbbwgbbgbgwuugbbuuwgrburuuurwbggwgrugu
wgrrwwugbugbbrrrrburgwbgrgubbguuwbbwwrbbbwuurrwbruruugrg
uwwgbwbuuwgwbbbggbwrrbwugwbruruwbbwrrwurwgbgw
gruwuruuuuuurwurwgbbggrubrubbgbrwubrbuwbruwgb
wuugrbubwrbrgwubrggugwbrgbggbbgwurrwgwrwu
grurbbbgbbubgurrrbrrrwwgggguuubuwgbwgwrguwu
ggwgbrwwwgrwgrgubrbugwuwwrbgwwgwwgurrbgburuwrgg
urwbwbbbuurubwgwrwbgrgruugwuuubgbbwwrurwwrbgugwgwbwggrbgub
wwwguggbrbrubgwggbrbbrgbuuuwubbwrbugbbbgruwbwwurggg
wuuurrguggwugbggggwbwbrrwurrbgwgwgbuwubgwubuuwbugwbwbwwwrguw
uwrgubwbrbbbgrwruwgrggbgbrwgubguuuuugwuwgwuubbgrgbgub
uuggugwuwrwgbrwwgrwgwggrbuuwruuwgbrbwrbugururuww
rwwrwurbrgwubbgwgggugbwwrubuggrgggurbrgwrwrwrrbwrwuu
rwbubuwrrgwggrrgrbwwgrgbgurrbrbrggrbuwwbrggwwrwgubrwgub
gurbbwuubbrrgbrurbwrggwuwwbrbuurwbubwwwrubggbwwgbwbrg
uwbuurrwbrgrgrurggwbwgrrwgwrbuwwwuburugugbugwuwwbrrubwu
rbbrwgwrrbbgwbgrwbrrrwwuuugrwbggrugrbburgbugburggbw
uggbgrgruubgggwbrugrgrbbbbwbwbgrbrrgrwbwrgguuwruwrwr
uwbbbuurggrbrurwgubrrrbuwgrgrrrrbwubrwrbbg
wuuurrbwrgwrguuwgrrgbuwggrbbwbuwbgugrwubwugwbrbg
gbrggbbwgurgrrbrugwrbuwgbrwbbbubgwggrurgurrw
rruwuwuuuuugwwbwbrrbbggrruwbgwuuuwgugwurwrg
gugrrbwrbrubuubgggbwbwwugugwrgwguurugbwbwwggrggbgrgrrbrw
ubbubwbuwrugrguggwwrwbbwbrbwrgwwbguwuwgwwwbwwbggbrwb
bbruguwgwbggbuubbgwugubrwbuwuwbgrgwwguwwwggruwgbb
grbugrrgwgbrgbuwrwbbgwbrrbrubrgwurbwwrwruugg
ruuruwbubugrgrbggrgubggbgrwrgwgrgbbubuwwwurbgguwr
rrwbbugbrurwgwbwwbgurgurwwwguugguwrwguwuggwgwb
wwuwgwgburubbbwggrrbbbbwbgbubguwrgbrrwubguurwwgrbgurg
urwbbbruggrwwgbuguuwubgubrbgwubwgwwrwwgubggwwrgbww
gbuurrwrgggwurrwuggbruwurrugrwrrbuwrggbwgugrwrwurwruwu
buuwrwuuuwgwwggbrbgbguuuruuuubbguwgbbbwgwgbuuwrrgbr
ggrrburrbbwrrwbwwubuugrgbugubwubrugbgwugrgu
uuubbwrbrwgrwugugbbgbgwwrrbuguuuburgrruugbwbbrwrbrbbwbrb
uuuuwrubrruguuwbwwugrrruwwburgbbggrgrgwbggubuuwu
wwgrubrrubrwrbgwrwgbguwgbbrgrrubbwbubbburbwgrrrub
bgwrgbrbbbuguugguguuubuugwbrwwurwuubrguwrruuuw
wuugbbbwuuguuwgrrwrwgwwwwwrbwgwrbwguwbrbgugubr
rgruurbggrbubwwbuwwuwuwwrbbgbgbguwrbbrwubgwrbr
uuurrubugrwwuuguwrwwwggubbbrbbbuwbbrggwuggru
wuuuurwgrwggwrruuuwubwubggrbrbwgbrwbgbwwurgbrwu
wuurggrwwbgwuwwrburuwrwrruruubgggbrugwwrwgbuwrbwgbur
ggrubgbbwruggbuuuwgrbwruwgurbwbubwuurubugbwg
rwwggbubrwurgwrbrwuwugbrrwwubuwrwbgguuuuwuwgwurgbwguw
wwbubuubgwwrrgbruubgggrrbuuwrugwbubrwgwbggbgwu
bwwgrrbbubbwrwwwguwbuuwgbbwgbbubrguwbbbgrugubrwg
wgubbgguwgbrbrgrggubrrwwgrrrwugruggrurrbubuugwbgwuuwwwwgr
wwbgwuwggugubgbggwuwgwggrrurrbbrrrrbbbgurwrrbuggg
rubguwgwuwwbuguguggurgwrwgbrbwubgugrurbwwwwbbuwu
rrwrgrwggubrwgwrwwuugrgbbrgrubgwrwuugrgbbgugbgrburrrrrugwu
bbgwugrgwbggrwwwrgbwburrwrwurbwgugwgwgrbuugwwuuwgburggggg
uuwbwguuwrbbuggbwggbgrbuwbgugwuurrurrgbrbuurwbwurrr
wurbwrgrgrrbgbwbwwuuggwuwuwbbwwuwgwgrwggubbgrwggbrrggur
wugrrubbggwurburggurrgggwuwwuguugrggurrgburrbrbrwgwbuwbg
wrugrbrwuwrugrbwurgwruggwrgwuwrgwuuwbwwggwubbgrwggwguwww
grbwguwbbbrwuwggbgurgbgbbwbgwwbwrrwbubrgubbgubgwwurggwbrbg
uubrubgurbgrgruwbwwugbuwgugburuubwuubbbrbbgbuggbbu
bbgbrwbwrwgbwrwwbbbrrugrwgbwbbruugurgggbbrgrguwurubgwbw
wwugrubrwrwburubwwuubbuubgburbbrrrruugbbwwgwbrrbubgbgbuwu
bwugrruubwwrbwbrrrbrrrbbgwrruwwbrgubugrgbwgbbrbgrwgwwwggr
wgugrrbbubgbgrrbbrwguwgbbgbwggwuuurrwgwbwrgwwuuw
wururbruwwwwurwgurwbwbuburrgruuwrbuguggwgubrgrruwwgwbbg
ugrwrrrwguwgrgwruwurbrrgruwubbubrwbwuwwrbbwbbggggr
rwuuguburgwruwrgbbuwggugbwrwuubrugrrruuwgggubbuwbrugrwuu
bgwubwuurwurbgugbuugbgrrugwrbwgrwrrwbgwwwgrguwwububuwbg
urbgbbgrrbuwrrguwrwuwrbbwgubwurugguwugururwruuubbgurrbg
grruugrurgwwbbrgugbburrwrrgwwrggwwrbwwbbwururwrbgguu
uubrwgwuubgbbgwgwuggbuggwguggwgrguwbugwwuubwwb
bbgubwurgurgguwrwrbbubbggwubwgbbwggwuuwugbg
guwbbwguurgwurbrgugwbwwbgugbgwwugubbggwugwrwgrb
wrruwbubwgwgbrwrbbbwuuuuurbwrbgwubrrugubwwrugb
gbuwwbubrrbggrrbugrgruwbrruurrburrgbggwbgwgbbggwggggbgrg
rwrbbbwbggrubuwgrugggbrbgbuwgrbrrbrrbwgwgrbuubgw
burbgruuwbbwuburbgrbuuuuurbuwbububgwwgwbrguubrguugwbbwbw
ubrrrgubrgrgbuuwgrrrwwbruuugbrrwbgbrwgrgww
uuuubwwwuwwbguwwbwgbwrwuwrwgrggrbgrbugbwgbrggwgruwrw
grwgruggbrrwuwrwbggwwgbrrwrwruuggbrurrbubur
uggbrrggwbwbrbwgurbbbrbbgwbrgbgwrbwubrurgw
ururbbrwrrwwbgubrbbuurguuwwgruwgruuurwbbwruurggru
grbwbrubbrgrwgbwubgbuwwuuwwrubruugwwwugguwrgurgrgu
wbwwugggwwurwrbugbbbrrgbgbuwggrggbbgrburbguurb
brwbbgwbgbrbbgwbrruwugwbguurubgwwgurubgrwuwrbguwuwrrgbwubu
rwugwrbgguwuggwgwgrbwbwwgwbwrrgrbbbwubgwggwrwurgwrwb
urrbwwgrruwwwrbrbwrgbrggwbggwrbbwwrggrgbbg
wurwwgwuurbwwgrrbbubbbbgugwwurrggrurbwrbuurbbbb
wggwrgurburuurwgrrurgrbubgrrgbbbwwrgwrurwrwwrgubuugwur
wrgubgbbwbbwruwrrgwgbrruubwgrurgwgrbugbgbggguwbrwuu
bgrwuwbggwwgrwbbugwuuwwwbrgugbbrubgugwbgugrbuwgrrbbubbwrrr
bwuwgwgugggrbwgruugbwruruwwbguggrbgggrggggwwuuuwugbuwuwgu
ruuugrurrrbrrbwuwbubrugwrrbgugbrwuurruwuwrbrbrwubwbwgur
rwugrbuwgwrwrbubggwugbrrgwwubbguuwbgbwuggrrrrggwrbrr
wbbrrruwuwubrgbrgbggrbgbburbugbwrrrubbbbggrurrrwb
ggruwrgubbururbrggurburuwrrwubwbuwwruruwbwuubwbrwwwrwr
wwuurwuwrwbwguuwwrbwgbuurgbbrgrbgwgwggwrgwgwwuuwgrwbuwrgbu
wuburbrwbgwrruurbrrrgwgbgrwgbwwwbbgrugubbrwuwububbrgbw
gwbwwwgrubwrguugbrbrbggguguuuugggwrbgwguwbrwwuuwggw
ubrbruwbururrrgwurrrbrrubbgbwrrggubbuburgwruwggurbrwb
rbrbrwwgwwurburubwgugwwbwuubuwbrwrrgugguwrbrrgbrrbrbw
grgubrrwbbwwwbrbbwbwwbgbbwrwrggbrrrbwwbwgbrgugguwuwubub
rurbrbrggruurgwguugugrrwrbuuwbwrubbbuburrwgruubu
ubrwguwgruuwwbbuwbrubugrgrurwrbwbwgbwrbubrgg
uuwgubuugwrbggbrrwurbbuwrurbubbbruwgrrrbrbwwwg
ububuuwuwwrugrrwrrbgurbrrrggwuwrubbgwwwurbb
bwugrrrgwurwgrbrwurbbbwbrurrwwgwwugbgbwgwuu
bbwgugurwurwbugugrgwburggurwrbbbbgwwbuubububurwuurggwubg
wuugbgbbwuubbbrrgbgubbgrrrbrgugrbwguuwgburrwrguuwgrbg
urbguwwwuugbgwwubwurubrrwbruwwugrgwwburrugugwbwbbu
uguugwgrgwburrrugbwuwgwrbwurgbbbbbwurbbgubwr
wuwrrrwwwwbwburbuburrrbgwuuubbwggrbwuwwgbrbrbwrw
wwbwbuwggbrgbrbwrwgguggwbugggrbwgwrgrgbgrrgbuurwubbr
rugbgwgugrgrugwwgwruurwbrwuwggbbrbrrggwwgwbubbug
wwrgubrgbwbbbrbuubuurbwbgbuugbwgguwrwbugbwrbwuwwrgb
bbrrwurbggbguwgwggrwbbgguubuuurbruwwrwuburbrrg
wuurugrubwrrbbrbbwbubbgburrrbugwuwwrgrrrwwbwg
uwgbugbuugrrwrwwuuuwwwrrgbubwugruubrwburgbbbbruwwgubrugb
wrwwuuwguruwrgrwgurwgrurwggubugrrugwggrbgbuu
guguugwrruwurugwgrbbwrbwwurwgggubugrugruuwrubbbgggwuubgrrr
gwuggrwbrgwuuurrbgbwbwrbrggguuwbubbrbrurwwuwugrubrwrwubwgw
ggrrwwrrggwuguuwgbgbgrbbbbgbwrrgguwgwggurubbugbgw
rbggurrgrrgrrbrbrgrbuggwubwwburrrrgbbwuuuuuwrbwbbgbrbwbwwb
bwugwbwububgbgwrbuuuwrruwgubbgruggburwburbrrwg
urrrbrwbguugwgbwrubguwwrruuguuwrbgwgwrbugwbrggbgrbuguubb
ururrgbbruuuwuubugubugbgwgwbruwgwwgwbrbgbubgwwgurgwb
wbwbrbgwurbgwbuwwbbbrrbbbuwrrgbwgurwugwburrrruwrgb
bbrrbgrrwbwuuuwwruwurwwuwgrwbgwugbgwrrwwwuubggrgrgrgrbwbrb
guguguwguwbggubbgurbugrwruguururuuuuggbrgrwguwubbwww
gwgurbrwguubuuuggwgwrurruwbuwrgwuuwugrrgrgrwrwurubuuuwgwg
rbuguuubrgwwugurgugbuugrrgwbbgubuuurguurruwrurbrrgwgrurrw
bgbbgrbgggwggbwwuggbrrbbgguurgrwuwurwrgwgugwbwwgrgubbb
rrrurgbggwgrrugurbrubbgwwrwuugwuurgrwurwrwbuugwuurgggwbrww
bburbwwrrwuuwuwuwubbwurwbwwrbwrubwugruruguwbu
rwbrwugruuruuwgugbbrrgwurrrburwrbugrubbbrg
rurugubuggrugbwrwwuwrggbrwruuggurrrgwgbgbwugrgbrurr
rrbuuruwrgubbubbgbruubgrrgwrrwwwgubwbuuburwurgurruwwrbbrw
gbggubwgrwwgwbgugbwrwgbwgubbbugggwwwrrbbggbwbwr
uruuugbubwuwrubwgbbrggrwwbguurgwgugbuwrgwbbwru
wuurrrwburwbbugubwwrgruwrrbgrwrrwwbwbbrruggbwuug
bggrwbgbwbbbbwwrurgwbrwuuuubwwbbububrbrgwgrwbrrrbrugrrrgrw
bguguurrgbugrrrwugrgggrbguwgruuwbuwubrurrrgb
ggwgrgbwrrrwuugbwbgbwgbbbburbrwbrwbrrrwggurbwrrrbbbgrbwuu
uugggwruuuururgrggbrwuggruwbgbuguuwwubrbbgwbrgubrgubrgbbww
uubwuuwrgbbrbwrbrbbugbbrbgwwrwwgwggbubwwgwuguwububgbu
gugbwwrwuuwrwrgrubwrwgbrgrguburwbrwwrbbgwuuggwggu
wwwwubbgrbubbwuwgbrgbgwubwubwgrrurwgrrggbgubburwgurgwb
grrrrwugwurbgrgwubbgrwrwbbuwguwgbbggbwuuguuwggrubwwuwggg
rrugggwburrwgbrbwbgwgwuwbubugwwrrwugwrrrwwbub
rbrbgwuwbggggwrbgwgwbgburwgurguguurbguguguwguuwggwgwr
wbbgrwbrrrrrbrurgrbugbuwrubwuwrgrwgurbgruuggurrrw
wrgrgbggrwgugbggrrgwuurrwbgrwgbubrbwrrubrggbrbgrrwuu
wuurbbrgubwrgurrugbwubbrbubruwbugrrbrwuwbbbbbbbwuwuw
wwrggrbbrgbuwgrrgwbugrubguuggugurgwbuuwgbguurgrr
wbwrgugurrwuuwbrrguwbgwurwwbbbgbgrgrwgbbuuwurburrbub
ggrbgwuubgrbgwbbbubugwruubuwwwrbgbwrggggggbubgrbwrw
bugrwrrgbwgugrgbrwburgrgbwbbrrwbgguwrbgwug
wwbrbbrruuwbgwrurgwrrguugwgrbbgbgguugubuwbgwubuwgbruuburw
gbugbuggrggbuwruuwbwbbrggrbubwbbwrrrbwgrguburrbwguwugu
ubgwggubbgguugguruubbugwuuwrbwgugbuuruwgwgwubugr
rguwbrgwbubwggbuubrrwgggggruwuuggwbbrwbgwg
ggbugubrbbrbwbruwwrguwbgruruuuwruugwbuwgwrgwurgwugwwbggub
gwuwburguwwgbrgbguguwwrbwgwurbbgruuuubwuubbwubgbu
bguwwrugrgbbuguwbwrbubbrwbbubuggwbgbbwwwrugbrgwrbwggu
wwwrbuuwuwgwrbwruwuggubrgbgwbuwwrrgguugbruuubrwg
wuuuugrgugugguwwrgurwurbbbrwbwwrgwuuwubgwru
uruuwrwrugrwwwwwrgbbwgbgbrwrwgrwrbbbrggurrrw
bggbbggbrbbrrgrgwurggrwbggrgggwbrbwwuguugb
bbrugbgrurwugwbgbbgrwggbrgbuwubgbrrwbbubwbrb
uruwbbugbwrrrgggbwbrrwgrrbwrgwgbgurrbbgwrrgwbuwgw
wrrrrugwbrgrgwbguwrbbubrwubwbwwwwwwbburbuwgwwbubrugbwguug
wuugrwrwwrwbbgwgugugurrwbbwwwwugwwbuuurbwgwrbbggugwwwwbgur
uuubbrbrrubwgbwbugguwrwbgwrubwbgbbubgrwugbgrwurubgrgbwrr
rbuguwurbrgwbubwwuwggrwuwgrbgburgubrggrgrbwwwbwbu
grrbgwgrbwbrwwbbwgbgbbgrbguurbrwwwgugrgubububbwwbuwugrbbr
wggguwwbwrrburbuwbwgbwbugbwgrurrrbrgubwbwug
uuwugrrwwbguuugrbrrrbuwuubrguwwgrggwrgubbb
ugrbwwgruwbrwbbbrwrruwbwgggugbrrbwwurbggwururgrgurwuw
rwgurbrbgwgugwuuuuwbggwwbbgrwrgrbgwuruuubgu
bgbrwuuuwrrgbbuuwuwwrgrgbrbrubbbbbrwubbwrbgbuuurbrubuwuurb
bwgrbrugwggubgrrgbbrugwbbubwwbwwgwrbgwgrurrrbugwguruwu
ugbggrbwrrwwbbrwuurbgwwbuggwggbugbgrrgwbrurrguwwubgwrgw
uruuwuwwugubwgrugurbggwgrwuuugrgwrrwuwgrrbwrg
wbgwuwbgbwuburguwbugwgggrrurgbgugggrrbwugugrrbbbwuguuuurbg
wgurrbuwuruguurgwgwbgugbruruwwggubwrwuuubgwrwwww
wguwuwugurbrwwuwrgurrbbrwggrrrbruuwbgrwbgwgubuwuwg
gbgugrbgruuwgbgwbgwwbwruwgbrgbggrrgrwrbubrgrbgbr
wuurbbwggrbbgwrgurbwwbuwggrurgrwrbwbrrbwbugubw
wburgrurggrugrbuuggrrbgwrgwbgububgrwbrbugggwrwrgr
ubwwgrubrrrbbwwrgrrubggubrrbgggwwrrrguggbugubrubburubw
uwwururrbubugbwugwrbuwruwwwrwurbrbwrrgguubgguubww
urbrrruwwrrrwgbwwuwubuuwuuwgubbguubwubgurwwgg
gbrbgbbrrrbgbgbgwbbgwgggbwbrwbbuugrgrbuuuwubrgbggrrgwuubw
gububrggbugrrrwrbguggwwwbwuurwggrrbgbgwwru
bbgbbgbuwrwrrubrrurgguwurbwurrbugbwbrrugrwgwbrwrggbbrwww
wuugrbgguuuuubruurgbrbrbubuuwwguwguwurrbbgruubburwwbbrb
grgrgrruwbuuubrurwwwugrrggbbrugwrwgruugburu
rrbbbbrguwrwgrwgwgrbwurgwrrwwbbgbgburbgwgggwb
rwgwbrwwgwbguguwurgwurbwwbrbgrbgbruuwbuwwrgug
wuugwwuubrwrubrbgbrwururuuburwggrurrgbwubwuggubbwbruuuwrwg
ubbgwbugrwwbuwrggrgwgrrwrwwgggurrrgbrwgrwubrwrur
bwububgwwbuugrwrggggrruguwrugwrgbguwrrbgbbbwburruwrgwrurg
rruwguuwwgrgburwrbrbubwgbugwggrurgrwbubrguwuwbbwgrbuww
rrbbrwwbrgwwuwrbwggbubbuwwwwwrbrwbrggrubwg
wrwbwwrbuubwwuubwrwrrbruuwwbwubbbgbgwguwburwuubbg
ururgrwggrgugugbwrbggwgugbrbugrwwgubugbrgburrurbrggg
gwwuwuurwrbbwuubrururruggrgrgwurrrgbrbrbguwrr
rgwwwrwbwrggruuburuugbruuugbgbgwgugwbugubuwwgrrrru
wwrgrbwugurbgrgwgruwrbwuubbwgwggrrggubbwugbwwrrrgbbwuu
gbwurggwgrrguurgwwgrggggbbbwgburwbgrgwwwwbr
ggbbgrbbwbbgwburgggwgwububrbwbguuurggbubuuuwbwggugu
bwbrwuwuuggbubggrwgguwugbgbubuurubwrugubwrurrugguuwrbr
ubrrgrbbrrugubuuubbwuwrwbggrbrbwgrrubbuubwg
uurbbubwuugwguwrbrgwrbbrrruwwgbwwubrgrwubguugrgwuwrg
wugbrwbrgbwugubwrrgurrrgurgwguubwgrwrbggurrbgg
wubwgrugruuuwuugwwrugwgbbgwwruuwuggurwwbrruw
bwrgruurugbwwwwbwrbrrrbrggwbburrwwugrruurbbwwggurbbbr
burrrgurrwrggbuwruwgrwwbwbgugwwwggwwurrbuwbuubbrrrwr
wrrrgrwgwwwrwgrbgrrwuuuwgwrguwwurrrubguwurgbrb
uwgwurwrwgwgbuwbgrrbubwwbrbuurubbrbbrrurubwb
wbrggubgbwbbwgrrurwwburbwruuruwugrbguwrwbuwuwbwwbuwbu
rgurgrwrurbwbwbrruuwgbwrwwbgwuubgwrugwbrwwbwbguwwbgrgrugw
rbggubugwbbggguugrwwbrwgwbgburggrgrbruubwbrbrbrbugguwwrgb
wruuggrbwgwwrgrwggugburwwgwgbrurwwgbgwuubrwbrgugubrwgbwgu
bggwurruuwwrggwbgwuburrwbrwrbwwrrggwuggrburgwguu
uwrrguugbwburwubwbuwbwrwgbgbwurguubbwbubbwbgrrrruub
rugguugbgrgbwrruurrbwbrbrgururrrwguurgrbrwgwu
bggbgrwgruwbugwrugwbwbubbwgubgubwbwwwwbgwrwrgwrwruwgwbuw
gurururrwguwuwbggbggbbrbbwbwgububrrubbrggrwgu
uugwubgugburrgrwurrrgwwgwwwrwubgbgurwrwuwuggbbguwrgugbgu
urbwgbbugrbrruwwwrwgbbbwggrwbbuugurwgwguug
rbrwwwrbrgwrbwbbugwugbguuggbbgbrgbuwwrgbugr
rbrubgwbwbubbgbubwwwrbgrwggbbguugwuguwwgwbbbbu
bwbgurbrbgugwrrbgbuggbrrbwwbrrgbwggrrwubbwbrgwg
grwuggugggurrbwbuuwrrwbgggwbruwwrbwugrrwrgguwwwrbgbu
rguwbbbrgbgrgbbuwurwuwbbgwburuwbugubrwgubrrbbruwbrr
uruwrbruruwbubbrgwwrruwrurbgwrurwwgwrruggrbguwurggggg
bbgbwwbwgbrggrgbgggrgrrwgwgggwgggwuuugrbwrrwbwb
grbrbbgubgbgwuwwgwrbgguuwugbrurwbbugrrbwrru
wgwwgbwgrurgwgruwugrbbbbrgbgbbugwgubwubgwwwur
wgurubbgbbguuwggwgrwbrgwbruwggrbrrwwuugbgwgwbbgggwg
uubbwggugwrwurbwwwuubgrwbbbbwbguwbgbbuwgrrburrwguguuwuuu
urwrgbrgubwwubwurwwrrbwwwgbwwrbuguuguuugrubwbbwwwubr
wwgwuurbburbwbwwwugrbwggugrrwgwugbugubububuurur
rugbwwgwwuwbbwbrguguggugrruubbwrwbrurwwwgwubbrrwwb
wuuuwrgbwruwwurrrgwwrgugwwbubgbbgbggrbrgg
wugbuwgbugwrrrgbbbgrbuuwwuugrbgbgwrgubugggrgrbugbggggwrr
wurwwwgwgbuwggbggwrwbwuwuwuguwwbgggwgrbgwbbbbg
gugrrrrrbrgwubwruwrgbruwwwbbguruggbubrwugwbwwbugbuwww
bbwgrbrggbuburgrwrbwbbbgbwurrruguggurbwbgrwwrr
uguwbbgwugbguggrruggbbrrubuugurgugwuubwbwwr
rwgbuwwbwuwwwbguwgugwgrbbuggubgwrurgrbwgbuugbrwr
wurbubbrgburwguwrrwuggwbrrrugbwbuuruubrrgrguuwwuururwrbww
rbubgwuubrrruubrbwbwuugugurrwugurwgwbwrurb
bbgrwuwwubruuwbwwgrwrbrgruruuwubuguwugbgrbgrwugrwrgbugburu
wuuuwwgrgurbgbwbwbgrrugbrwggrbrrubgwurwurgrbbrbu
rwbbuugrbbwubwubwrurggwwuurbbwggbwuurubrburuguwrrrrw
bgbgugwwubguuuwbuugrbbgwwwgbuwurbrgrgbuwug
wuugwbwgwwubwuuuwuwgwurburggbwwbrwwrwguuruwubwbguuwgw
grrbgrbbugwguwbrburrbrrwgbbrgrruwwurubbuwbgubbwgruwbgbb
bwuuwwururgugbrruugrrrugrgugugbggbbgbbguurrg
rgurgugrwurgbwwbuuwubruwgrwbububuuwruwggwrbbbbbbbwwbb
wuugrbgwwwgburbwrwgugrrgbbbgrgbrwwrgurrbbwbwuugugrgbubbrrrrg
ubrbgrwbuugrgwuurgrwbbbbrurubgurrgwubruubggwwgg
rwwubuuwrrrrwwwbruruuwbuwurwbubrbgrruuuwrwrwg
rggbgubbrgbgrrbgwwwrgwubrubwruugbwrwbbgguugubrubuwg
gbwbwwgubuubgurruwwwuwrrbuurgggurbbbbubbrbgw
gubggbgrbgwbbuwguggwuwgbwrrwwgbrwrrrgwwbgug
wuuruwgubbwuugbbburrugbggwwuruuuubbgruwbrr
gwgwruugwuurubburrrwrbgrurrwrwbbbbbwuuwbugrw
bgbwuwururguwuwbuubwbubugbwbuurwurbwbwgrgbwwwgwbuwubru
bruuwbugbbgrgubrggbggbgwuwbwwwrbwuwwwuuwgwgugrgwbbuwubbguu
wurrbbwuguuugrgurwwbwbgwbbbwbbuuwbbgurwrrbubwbbbbwubb
bwuubrguububbgrubbrgbgwwbgbbbgwbrrgwggwgggurgbwwwwuur
wgwuwbgrrurbwgwugwruwbubwgrrrwbbgrbuwubgbgw
rrbbrrbbwbbubbwrwgwrbrwwbbbbgwbguwgburwgbggr
wuugbbuguruwugwrgwbbuggbwbwwbbuwwuuugwbguwugbwggrbrr
gwgbburbguwuurrrgwbuwrurrbuwugwrgbgwrgwwwwurubbgbwr
wubugurgrbrbbbwrrwurwuuugwuwrbbbwwbrgbbrurrg
wrwugbwwbbbrguwuwugbwwuwgwubbbgrrbrwguuububbggbwwbwwrwbg
bugwuwrwuwwggwwuwrwrbruggrurgwwurrguwugwrwg
rbrgrwbwrurwbubrugwwgguwrrgwgwuwwbrrgrbrgwruwgbgbrbbru
rwwwrwruruuubwgwbgubrbgbgrwwuugruurugbrwbwuuwgbwubggugg
uuwugbbwrwbgrgwubgwwgrubbwrbbwwwbbwbbrbwrrugrgggw
wggubrrbgrggrwgguwggubwwrbrbgbgrrgugbggbgg
uwbuwrrgwguwurbwbbgbrbbrgguuggrrugrwrwbgrrurru
grrrgurgwububbuguwrguuuwrwwurbbwrwwguwwwrggbrbr
wubbgwbwbrbrgbggurgbrwgrubrurbrrrwrurgbbrwurgrrgugbwurrbg
wruwwrwgwrbwubrbwubbbrbuurwwwugwugubuubwgbbbubgrrgbrgbw
rwrrbgwurrgrbgrrrguugwwbgwwugbbgwwwuuuwgugwuwuwuubuw
rgwwugwwurgubwgrbwbwwgbbbubbrggbgrugguuubuuuugbgbgug
gruuruwbwbuururbwrwrgrwuububgwgruggwbwrgwbub
gbbwrurugbbwrurwwbgrruwgbrbrbrrgrwrbbgbgwbgwgwuwrwgrgu
wugwwgrwbgugurwurbggbrwruwuuwurwrbrwgruuubuurur
wgbuwbrbwrgrbwuwggugggguuwgbrbwgrgwrurrurbrgugrgwrb
ggwubgbwwwgrwwbbggwwrrggwguubuggubggguuwbwuwgwuuugrgbuubbb
rguuugwbrbrbwbgrggbubwrwwrrrubwwuugugwgrbuu
ggugbrggwbuwrwgrgwugurrbgruurruwwgrbwwubbuubr
ubgwwggbwbuwbbbbbbggbwrgrbgrgugurwggrubburrubrwrrggrgg

View File

@@ -1,7 +1,7 @@
package main
import (
"aoc2024/day04"
"aoc2024/day09"
"fmt"
"os"
"time"
@@ -9,9 +9,11 @@ import (
func main() {
start := time.Now()
data, _ := os.ReadFile("day04/input.txt")
fmt.Printf("part 1: %d\n", day04.Part1(string(data)))
fmt.Printf("part 2: %d\n", day04.Part2(string(data)))
data, _ := os.ReadFile("day09/input.txt")
fmt.Printf("part 1: %d\n", day09.Part1(string(data)))
fmt.Printf("part 2: %d\n", day09.Part2(string(data)))
elapsed := time.Since(start)
fmt.Printf("Execution time: %s\n", elapsed)
}
// 6320029754031

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

@@ -7,6 +7,6 @@ require golang.org/x/exp v0.0.0-20221208152030-732eee02a75a
require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/stretchr/testify v1.10.0 // direct
github.com/stretchr/testify v1.10.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)