Merge branch 'tmp'

This commit is contained in:
2025-01-13 23:57:55 +00:00
70 changed files with 24732 additions and 4 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

291
2024/go/day06/day06.go Normal file
View File

@@ -0,0 +1,291 @@
package day06
import (
"adventofcode2024/utils/grid2d"
"adventofcode2024/utils/inputs"
"fmt"
_ "strings"
)
type Direction int
const (
_ Direction = iota
Up
Down
Left
Right
)
type Pos struct {
x int
y int
}
type Loc struct {
dir Direction
pos Pos
count int
}
type Point struct {
dirs []Direction
display string
}
func (d Direction) String() string {
return [...]string{"-", "Up", "Down", "Left", "Right"}[d]
}
func (l Loc) String() string {
return fmt.Sprintf("Direction: %s, Position: %d %d", l.dir, l.pos.x, l.pos.y)
}
func Part1(input string) int {
var loc Loc
grid := inputs.ToGrid2D(input, "\n", "", "", func(c string) string { return c })
for x := 0; x < grid.SizeX(); x++ {
for y := 0; y < grid.SizeY(); y++ {
if grid.Get(x, y) == "^" {
loc = Loc{dir: Up, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y) == "v" {
loc = Loc{dir: Down, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y) == ">" {
loc = Loc{dir: Right, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y) == "<" {
loc = Loc{dir: Left, pos: Pos{x: x, y: y}}
}
}
}
fmt.Println(grid.Matrix())
fmt.Printf("%v\n", loc)
grid.Set(loc.pos.x, loc.pos.y, "X")
loc.count = 1
move1(&loc, grid)
return loc.count
}
func Part2(input string) int {
var loc Loc
grid := inputs.ToGrid2D(input, "\n", "", Point{}, func(c string) Point { return Point{dirs: make([]Direction, 1), display: c} })
for x := 0; x < grid.SizeX(); x++ {
for y := 0; y < grid.SizeY(); y++ {
if grid.Get(x, y).display == "^" {
loc = Loc{dir: Up, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y).display == "v" {
loc = Loc{dir: Down, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y).display == ">" {
loc = Loc{dir: Right, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y).display == "<" {
loc = Loc{dir: Left, pos: Pos{x: x, y: y}}
}
}
}
fmt.Println(grid.Matrix())
fmt.Printf("%v\n", loc)
point := grid.Get(loc.pos.x, loc.pos.y)
grid.Set(loc.pos.x, loc.pos.y, Point{dirs: append(point.dirs, Up), display: "X"})
for x := 0; x < grid.SizeX(); x++ {
for y := 0; y < grid.SizeY(); y++ {
grid = inputs.ToGrid2D(input, "\n", "", Point{}, func(c string) Point { return Point{dirs: make([]Direction, 1), display: c} })
p := grid.Get(x, y)
if p.display == "." {
grid.Set(x, y, Point{dirs: p.dirs, display: "#"})
l := loc
if isLoop(&l, grid) {
loc.count++
}
grid.Set(x, y, Point{dirs: p.dirs, display: "."})
}
}
}
return loc.count
}
func isLoop(loc *Loc, grid *grid2d.Grid[Point]) bool {
for {
_, _, err := move2(loc, grid)
if err != nil { return false }
if contains(loc.dir, grid.Get(loc.pos.x, loc.pos.y)) {
return true
} else {
p := grid.Get(loc.pos.x, loc.pos.y)
grid.Set(loc.pos.x, loc.pos.y, Point{dirs: append(p.dirs, loc.dir), display: "X"})
}
}
}
func Part2b(input string) int {
var loc Loc
grid := inputs.ToGrid2D(input, "\n", "", Point{}, func(c string) Point { return Point{dirs: make([]Direction, 1), display: c} })
for x := 0; x < grid.SizeX(); x++ {
for y := 0; y < grid.SizeY(); y++ {
if grid.Get(x, y).display == "^" {
loc = Loc{dir: Up, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y).display == "v" {
loc = Loc{dir: Down, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y).display == ">" {
loc = Loc{dir: Right, pos: Pos{x: x, y: y}}
}
if grid.Get(x, y).display == "<" {
loc = Loc{dir: Left, pos: Pos{x: x, y: y}}
}
}
}
fmt.Println(grid.Matrix())
fmt.Printf("%v\n", loc)
point := grid.Get(loc.pos.x, loc.pos.y)
grid.Set(loc.pos.x, loc.pos.y, Point{dirs: append(point.dirs, Up), display: "X"})
loc.count = 0
for {
_, _, err := move2(&loc, grid)
if err != nil {
break
}
if contains(loc.dir, grid.Get(loc.pos.x, loc.pos.y)) {
loc.count++
break
}
}
return loc.count
}
func move1(loc *Loc, grid *grid2d.Grid[string]) int {
return -1
}
func move2(loc *Loc, grid *grid2d.Grid[Point]) (int, int, error) {
x, y, err := doMove(loc, grid)
if err != nil {
return x, y, err
}
if x == loc.pos.x && y == loc.pos.y {
move2(loc, grid)
}
return x, y, nil
}
func canBlock(loc *Loc, point Point) bool {
val := false
switch loc.dir {
case Up:
if contains(Right, point) {
val = true
}
case Down:
if contains(Left, point) {
val = true
}
case Left:
if contains(Up, point) {
val = true
}
case Right:
if contains(Down, point) {
val = true
}
}
return val
}
func contains(v Direction, point Point) bool {
for _, d := range point.dirs {
if d == v {
return true
}
}
return false
}
func checkMove(loc *Loc, grid *grid2d.Grid[string]) bool {
switch loc.dir {
case Down:
if loc.pos.y+1 >= grid.SizeY() {
return false
}
if grid.Get(loc.pos.x, loc.pos.y+1) == "#" {
loc.dir = Left
} else {
loc.pos.y++
}
case Up:
if loc.pos.y-1 < 0 {
return false
}
if grid.Get(loc.pos.x, loc.pos.y-1) == "#" {
loc.dir = Right
} else {
loc.pos.y--
}
case Left:
if loc.pos.x-1 < 0 {
return false
}
if grid.Get(loc.pos.x-1, loc.pos.y) == "#" {
loc.dir = Up
} else {
loc.pos.x--
}
case Right:
if loc.pos.x+1 >= grid.SizeX() {
return false
}
if grid.Get(loc.pos.x+1, loc.pos.y) == "#" {
loc.dir = Down
} else {
loc.pos.x++
}
}
return true
}
func doMove(loc *Loc, grid *grid2d.Grid[Point]) (int, int, error) {
x := loc.pos.x
y := loc.pos.y
switch loc.dir {
case Down:
if loc.pos.y+1 >= grid.SizeY() {
return x, y, fmt.Errorf("outside")
}
if grid.Get(loc.pos.x, loc.pos.y+1).display == "#" {
loc.dir = Left
} else {
loc.pos.y++
}
case Up:
if loc.pos.y-1 < 0 {
return x, y, fmt.Errorf("outside")
}
if grid.Get(loc.pos.x, loc.pos.y-1).display == "#" {
loc.dir = Right
} else {
loc.pos.y--
}
case Left:
if loc.pos.x-1 < 0 {
return x, y, fmt.Errorf("outside")
}
if grid.Get(loc.pos.x-1, loc.pos.y).display == "#" {
loc.dir = Up
} else {
loc.pos.x--
}
case Right:
if loc.pos.x+1 >= grid.SizeX() {
return x, y, fmt.Errorf("outside")
}
if grid.Get(loc.pos.x+1, loc.pos.y).display == "#" {
loc.dir = Down
} else {
loc.pos.x++
}
}
return x, y, nil
}

View File

@@ -0,0 +1,35 @@
package day06
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestPart1(t *testing.T) {
r := Part1(`....#.....
.........#
..........
..#.......
.......#..
..........
.#..^.....
........#.
#.........
......#...`)
require.Equal(t, 41, r)
}
func TestPart2(t *testing.T) {
r := Part2(`....#.....
.........#
..........
..#.......
.......#..
..........
.#..^.....
........#.
#.........
......#...`)
require.Equal(t, 6, r)
}

130
2024/go/day06/input.txt Normal file
View File

@@ -0,0 +1,130 @@
...#..................#...................#......................#..............................#.............................#...
....#.......................#........#.#..............##...........#.....#..........#..........................#..................
.............#........................................................................#.........#.#..#..#..........#..............
..........#.......#..........#..................#........##...................#..............#....................................
....................#..........................................................#..#.....................................#.........
....#............................#..............................................#.....................#..........##....#..........
.......#.............#......................................................................#.............#.........#.............
....###......................#....#...........#.....#................................#..........................#.................
..........#..#...........#..#........................................................#.....#...........#................#.........
..#....#......#....#....#...................................................................#.....................................
....................#............#............................................#......#....#...............................#.......
..........#.......#.........#.......#.............................................................................................
.......#...#.......................................#...................#..........................................................
.......#........#............................#.....#.......#..............................................#..................#...#
.....................#.................................#................#...#...............#.....#.#..........................#..
.....#..........................................#......................#.............##..............................#........#...
.....#......#.........................#..........................#..........................................................#..#..
.#......#.............#......#.................................................#.....#...................##......#................
.............................................................................##...................................................
........................................#.......................................#........#.............................#.#.......#
...........#.....................................#.............................#......#......#..#....................#..#.........
.............................................#.......................#..................##....#.....#.............................
........................#..............................................................#..........................................
#..............#.........................#........#...#...............#..............#..................#....................##...
...#...#.............................#.......#................................................#........................#....#.....
.....#.........................#..#.......................#..........#.....................#..................#.#.....#...........
..................#........#..#.......#...................................................................................#....#..
..#...#...............................................#.#..#........................................................#....#......#.
...............#...............#..........................#............................#..........#.............#.................
............#.....#........#.........................................................#........#........#.....#........#......#....
............................#.........#....#........#.....#...#.............#.................................#...................
........#..................#....#..........................................................#.#.#..................................
....................................................................................................................#.............
#............#.............#..................#......................................................................#............
...............................#....#..........#...........##........................................................#.........#.#
................#.........................................#.................................................#........#............
..............................................#............#................#........#........................#...................
..................#.........#..........................#.............#...............#............#....................#..........
........................#...#...............................................#..............#.....#.....................#..........
...........#.......................................#..............................#..................#....#...##..................
#...............#..................#...............................#...............................#.....................#........
.............#...............................................................##...................................................
.................#.............#.......................#...#............#.#....#................................#...........#.....
#......#......#..................................##.................#.#...............................#...........................
.#...............#..........#...............................................#...#..........#..........#...........................
.....................................#............................#....#.............................................#...#........
......#...#.............#.#....................#.........#..........##.................................#..........#..........#....
.............................#..................#....#..............##.......................#.#.....#........#...................
.................................................#.#......................................................#................#......
......................................#..........................................#......#.........................................
#....................#...........................................................#..................#.............................
.....#.........#...................................................#....#.#....#.#.........#......................................
........#..........#......#.............#................................#.....#................#.................................
...........#................................#...........#..........#......#.............#........................#................
.......#...............#....................#..#................................................#.................................
.....................#.........#..#............#..........#...........#...........#...............................#...............
................#...#........#...........#..........................................................#..#...................#......
.........................................................#.....................#...#......................#.#....................#
................#......#....#.#..............#............#.......................................................................
..........#.....................................#......................................................................#..........
#......................................#.......#.....##..#.....................#.........#.......#................................
........#...#..............#....................#................................#..............................................#.
.##............................................................................#......#................................#..........
.#........................#..............#..............................................#........#.....#.......#..................
#......................................#.....................#...................................................................#
............................#.....#.....#............#...............#...#.......#.........#......................................
.#.........................#.......................#.........#.......#.................#............................#..#..........
.............................................................................................................#........##..........
...........#...#...#.#................#.....................................#........#............................................
......#.......................#..........#.......#................................................................#...............
........#....#........#..................#....##.....#............#..............................#...........#...........#..#.....
..................................#...............................................................................#...............
.....................#.#.......................#....................................#.............................................
........................................................................................#.........#.................#.........#...
..........................#..........#....#..........................................#.......................#............#.#.....
...............................................#.#....#...............................#...................#......................#
.....#...........#........#.#.......#.............................#..................#............................................
...............#.........................................................#....................#.................#.............#...
#....................................##..........#................................................................#...............
...............#.................#...#..............#......................................................#..............#.......
...................#......#.............................................#......................................................#.#
..#.............#.......#......#....#..#..#.......................................................................................
.........#....................................................#.....................................#..............#..............
..............#..............#................................................................#.......................#...........
..........................#.................#.......................................................##...................#.#......
...............#..#...................................................................................................#.......###.
...#.....................#..#........#..........#..................................................................##.............
.................#.......................................###..............#.........................#.............................
...#.....................................................#.......#..........................#................#..#.................
...................................................#..................#.........................................................#.
.....#.............#...................#...................#.....................................#................................
.....................#.........................#......#...........................................................................
...........#...............#......#.....##...#...#.............................................#........#.#...............#...#...
..............#..............##...........#.......................#..#.^..........................................................
...................#..............................................................................................................
..................#.......#..........#.......#..................#..........#...................................#..................
..............................................................................................#..................................#
......................................................#................#......................#...................................
..............#.........#..............................#.....................#......................#.............................
#................#.........#................#.............................#......................#..#...#..............#..........
.#..#........#................#...............#..................#........#.....................#............#........#...........
.....................................................#.#.........#......................#.............................#........#..
......................#.....................#..#......#..........................#............................#......#............
......................#.........................#..#..................................#.......................#..............#....
..........................#..................#.............#......................................................#...............
..........................#....#........................................#..#...#....#.................#...........................
.......#...........#.......................#............##........#....................................................#..........
#..........................................................................#...........#..........................................
............................................................#.................#..#........................................##......
..#...............................................#....#.................................................##.....#...##.....#......
...#.....##..............................#.........................................................#............#.................
.....#....##............................#....##..........#...#....................................................................
..................................................#..........................#.........##.......#.......................#.........
.........#.....#..........#........#........................#.##..#............#.......................................#..........
.....#...............#.......#..........#.#..........#.....................#.....................................#.....#..........
....#......#............................................................................................##...#.#.#.........#......
...........#........................#.....#....................#..................#.#........#....................................
....................................................#................#.#................................................#.........
..........#..............#.......................#.................#...................................#.............#.#......##..
................##......................................................#.................#.......#.#....................#........
................#......................................................#.............##...............#.....#......#.......#......
..............................#............................#..........#...........#...............................................
.......#.............#....................................................................#..............................#.#......
...#.....................#.#...............................................................#...#..#....#..........................
....#.........##......#..............................................................................#..................#.........
....#..........................................#......#...................#........##............#................................
..#.......#......#............#........#...#.#...........................#.......#................................................
..........................#...#....................#...............#...#......#.#...#...#...............#.#.#.....................
....##.#....................................................................#...#.....##........................#.##..............
.............................................#....................................................................................

140
2024/go/day07/day07.go Normal file
View File

@@ -0,0 +1,140 @@
package day07
import (
"adventofcode2024/utils"
"fmt"
"strconv"
"strings"
)
type Op int
const (
Add Op = iota
Mul
Conc
)
func Part1(input string) int {
val := 0
lines := strings.Split(input, "\n")
for _, line := range lines {
parts := strings.Split(line, ":")
result := utils.MustAtoi(parts[0])
numStrings := strings.Fields(parts[1])
var numbers []int
for _, numStr := range numStrings {
num := utils.MustAtoi(numStr)
numbers = append(numbers, num)
}
bitmask := 1 << (len(numbers) - 1)
for i := 0; i < bitmask; i++ {
calc := 0
switch isNthBitSet(i, 0) {
case true:
calc = numbers[0] + numbers[1]
case false:
calc = numbers[0] * numbers[1]
}
for n := 1; n < len(numbers)-1; n++ {
switch isNthBitSet(i, n) {
case true:
calc = calc + numbers[n+1]
case false:
calc = calc * numbers[n+1]
}
}
if calc == result {
fmt.Printf("result: %v numbers:%v count: %d\n", result, numbers, bitmask)
val += result
break
}
}
}
return val
}
func Part2(input string) int {
val := 0
lines := strings.Split(input, "\n")
for _, line := range lines {
parts := strings.Split(line, ":")
result := utils.MustAtoi(parts[0])
numStrings := strings.Fields(parts[1])
var numbers []int
for _, numStr := range numStrings {
num := utils.MustAtoi(numStr)
numbers = append(numbers, num)
}
operations := []Op{Add, Mul, Conc}
results := [][]Op{}
generatePermutations(operations, len(numbers)-1, []Op{}, &results)
for _, op := range results {
calc := 0
switch op[0] {
case Add:
calc = numbers[0] + numbers[1]
case Mul:
calc = numbers[0] * numbers[1]
case Conc:
calc = concat(numbers[0], numbers[1])
}
for n := 1; n < len(numbers)-1; n++ {
switch op[n] {
case Add:
calc = calc + numbers[n+1]
case Mul:
calc = calc * numbers[n+1]
case Conc:
calc = concat(calc, numbers[n+1])
}
}
if calc == result {
fmt.Printf("result: %v numbers:%v\n", result, numbers)
val += result
break
}
}
}
return val
}
func isNthBitSet(num, n int) bool {
return num&(1<<n) != 0
}
func getOp(row, col int) Op {
vals := []Op{Add, Mul, Conc}
// Column 0 cycles as row / 3
if col == 0 {
return vals[row/3]
}
// Column 1 cycles as row % 3
return vals[row%3]
}
// Recursive function to generate permutations
func generatePermutations(ops []Op, n int, prefix []Op, results *[][]Op) {
if n == 0 {
// Append a copy of the current prefix to the results
*results = append(*results, append([]Op{}, prefix...))
return
}
// Iterate over all operations and build the combinations
for _, op := range ops {
generatePermutations(ops, n-1, append(prefix, op), results)
}
}
func concat(a, b int) int {
aStr := strconv.Itoa(a)
bStr := strconv.Itoa(b)
concatStr := aStr + bStr
result, _ := strconv.Atoi(concatStr)
return result
}

View File

@@ -0,0 +1,47 @@
package day07
import (
"testing"
"github.com/stretchr/testify/require"
"fmt"
)
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`)
require.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`)
require.Equal(t, 11387, r)
}
func TestGetOp(t *testing.T) {
operations := []Op{Add, Mul, Conc} // Define the operations
X := 3 // Define the number of positions (columns)
// Start the recursive generation with an empty prefix
results := [][]Op{}
generatePermutations(operations, X, []Op{}, &results)
for _, op := range results {
fmt.Printf("%v\n", op)
}
r := Add
require.Equal(t, Add, r)
}

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

@@ -0,0 +1,850 @@
16183610: 62 7 96 8 6 8 52 3 3 47
408936528: 5 1 5 1 9 2 2 8 7 1 725 63
20378697464: 101 893 487 2 6 4
376576: 4 9 235 57 1 3 6 722 8
431880008: 18 66 276 5 295 4 5 7 1
379520346363: 858 95 723 8 92 7 9 2
18243750: 76 24 3 750
7302: 806 446 391 791 3
18879037: 7 75 1 94 217 37
3887037856: 805 64 71 7 9 856
120267: 3 48 937 659 3 69
757199: 86 2 69 7 7 8 80 5 8 743
5835692: 349 65 110 8 1 8 35 4
9693533: 560 33 54 523 251
1691420808: 33 720 4 76 84 66
27537: 5 2 2 4 296 73 89
3099946535: 7 330 5 245 9 4 5 3 7 3 5
2430252: 58 1 3 9 47 71 5 19 418
379232792: 789 98 6 71 6 8 535 8 2
11690268: 2 92 3 2 83 72 1 3 1 6 8 4
65091: 225 4 895 1 9 6 5 6 81
230263117372: 405 38 568 727 7 372
1071440: 6 4 614 67 30 4 7 1 229
60445800: 3 7 9 9 9 683 27 8 4 4
6834722563: 95 43 29 182 9 317
449482: 98 1 458 99 85
381868494: 74 992 18 289 78
42075: 86 3 28 14 38 18 225
105275: 13 751 755 4 91
1258023882: 4 79 534 502 61 3 3 9
766505: 7 87 21 4 4 7 83 5
4569436040: 355 7 6 3 4 7 8 753 4 29
182512: 4 1 7 1 6 66 38 8 6 112
238680: 9 42 36 65 2
81450600: 235 52 86 6 275 2
20684471: 2 989 98 2 4 237 3 7 59
79521192: 48 98 9 91 5 15 29 18
604195918: 756 74 12 2 9 52 7 8
43646875223: 62 28 8 5 6 8 730 3 2 3
24683153283: 5 12 2 2 462 2 72 24 3
13641: 21 664 2 3 655 5 61
23364264: 35 5 9 43 39 2 520 8 33
1352375279: 9 21 54 9 84 61 527
122558095823: 51 58 4 676 99 6 3 7 2 9
9153847: 912 3 1 38 47
623510: 25 63 6 30 892 86 2 5
100277100: 352 773 45 20 90 22
19779196416: 7 239 64 716 2 129
5982828: 86 3 644 9 2 271 66 4
1287462: 3 25 68 2 93 15 6 22
11178753676: 9 9 69 3 7 2 4 8 2 6 8 8
38798: 3 314 4 4 71 38
15055: 1 43 7 52 3
58769: 813 2 4 4 3 1 1 8 3 47 7 5
716958509: 2 343 612 33 69 5
1675: 1 28 41 19 467
39178: 3 873 40 3 1 9
708235: 340 13 9 2 50 385
61112: 7 52 2 107 5
9420: 2 9 5 70 4 13 2 468 8
23543454: 8 478 2 87 242
35262945144: 26 81 91 441 184
357858: 68 4 6 9 92 7 9 92 54
2718246046: 1 85 4 95 53 7 7 5 6 2 2 6
575: 519 2 49 3 2
1180: 172 18 58 44 888
1206891306: 2 9 1 67 80 9 1 2 9 8 5 3
1968096: 6 5 545 39 7 5 2 21 6 6 4
74504: 744 97 7
452256: 8 355 5 796 81 168
418262248: 541 1 482 802 2
152402250369: 4 87 8 8 6 319 65 369
123797905: 9 7 550 577 1 7 2 5 3 5 7
3129360: 73 1 7 5 62 59 20
13030160: 58 9 4 748 65
3758143: 7 80 6 44 6 7 1 4 17 9 4
1058: 521 534 3
6027582: 8 55 704 838 2
55923132: 971 9 7 137 1 6
42362711: 423 614 8 71 440
74875: 89 83 85 4 57 94
6528: 6 8 8 17
376636: 7 9 301 12 636
33983238: 77 8 38 925 422 51
9773991: 76 738 2 998 6
13324553022657: 7 4 20 5 9 5 30 22 646 9
99691578: 5 71 1 9 4 7 325 7 1 54 7
15561636: 4 3 74 7 10 9 7 6 6 3 3 1
133680: 1 59 7 1 24 5
768797: 956 3 8 375 7
2192068: 4 4 7 2 7 22 7 2 9 97 76
141515823: 4 8 51 515 449 3
102779637: 902 41 6 251 3 920
255504: 7 843 1 68 3
6334426: 8 4 42 47 132 3 439 6
1679200: 6 2 1 28 7 954 4 1 2 4 5
743869: 686 85 6 56 893
1740659638: 723 68 4 5 38 4 37 65 3
38740803516: 696 4 198 64 36 439
1445311524: 851 1 51 9 4 197 4 4 4
82489: 6 13 27 26 153 22
288151123: 5 8 95 3 4 121 6 7 5 7 7 8
33615: 41 9 2 83 249
235334584: 616 5 9 2 473 7 8
18983872: 3 58 389 84 8
966410: 117 12 622 477 3 5
31850527: 318 32 17 741 787
7766: 8 97 6
3767400: 6 4 3 9 203 2 17 7 4 30
8170454: 494 93 449 31 1
56113624133: 5 4 7 6 502 7 9 71 7 35 3
1070749: 2 60 64 3 986 4 6 4 9 1
152169288123: 3 440 2 47 3 834 878 3
23710639960: 7 7 6 2 3 4 2 395 81 2 4 4
41133: 1 1 736 6 119 3 85 2 3 3
2438060548: 872 65 66 8 16 5 308
2150: 60 975 6 34 2
42667317: 8 9 2 848 6 2 7 693
99291: 8 52 97 811 115 69
700480533: 152 24 4 995 533
2043415727134: 437 668 53 7 6 6 5 13 4
47685378032: 2 7 4 4 2 87 82 5 962 32
1623679122582: 842 679 71 4 2 58 2
13176069: 5 5 527 988 81
402209662: 4 891 26 8 4 9 38 389
62080: 86 718 329
1056230: 475 2 5 2 553
95017: 8 6 9 5 8 13 323 7 6 1 5 7
130085288174: 9 9 2 9 674 36 4 2 17 4
179095515: 2 38 6 7 6 26 9 36 8 27
520128: 9 66 438 504
110760: 3 8 4 7 4 60 71
76246863: 2 80 3 3 5 75 7 761 791
2167131616: 590 79 3 197 236 19 1
243936484: 25 10 5 8 8 857 4
88760: 305 4 30 6 2 9 1 70
6539567445: 2 673 89 206 49 53 5
802: 89 4 8 2 1 56
198163: 55 9 8 5 5 514 273
184378: 38 691 7 11 561
342819000: 82 387 8 5 2 3 5 9 8 8 27
10656324: 5 26 8 1 7 186 3 1 6 7 6
552920982: 87 69 7 92 91 9 61 2
20206: 1 63 1 86 79 535
1555253: 731 36 853 960 53
3143202608: 91 2 4 378 4 72 49 7
108617320: 7 64 27 657 8 367 1 49
1002415: 2 5 5 4 235 21 53 3 61 2
554954: 96 720 227 9 8 7 1 99
14766160525: 748 1 337 25 13 6 6 5 5
26599060: 51 610 855 1 9
313216: 70 93 6 92 8
495206630906: 624 496 4 577 25 4 6
852106300: 461 6 1 83 3 95 5 629
338693777: 3 386 93 739 38
84441: 50 93 2 18 647 45 13
19591896: 3 47 87 143 888 8
1215760: 88 32 8 7 760
303: 8 64 9 215 7
4493757702: 587 7 4 9 2 5 4 7 3 3 994
45810: 6 54 4 7 4
455911: 475 1 3 9 9 2 10 91 5 1
21250549332: 9 7 6 6 51 18 183 43 8 9
1651093: 716 6 3 3 1 4 1 8 8 52 4 5
1425: 50 4 36 6 9
240413184: 8 5 6 5 7 6 8 7 34 9 96 8
9353: 10 13 9 8 1 1 4 4 3 7 5 8
2098356329412: 6 57 264 714 1 5 7 651
1366070: 18 3 2 99 220 237
166196809: 68 59 291 20 7 284 9
40834936: 405 659 51 3 1
37929239: 5 739 66 518 39
332660900: 25 96 954 572 541
17248552687: 71 8 6 71 3 56 8 6 88
736: 2 97 58 4 6 9 5 62 6 8 7 5
1113308: 7 4 9 3 1 515 9 6 7 840 1
1047862: 99 5 552 863 1
8679: 9 6 32 5 39
17123332: 150 3 542 72 38
14301196: 810 535 6 33 446
13953852: 82 2 21 94 18 844 1
30194: 5 4 5 3 487
299623: 40 908 79 4 55
45472: 3 56 56 29 7
4534682: 9 17 6 96 6 52 92 159 2
182860020: 664 873 836 35 9
2594594: 2 7 5 20 6 8 6 594 7 1 1
5956711: 1 3 88 2 900 8 68 3 61
513431: 641 64 8 98 21
1690136: 197 191 66 66 8
50985: 32 9 59 3 3
1540800567: 15 30 4 16 535 567
393181: 3 3 3 2 6 9 295 43 4 69
152631244: 89 18 287 808 44
49366847: 9 60 5 831 99 551 2
47525635: 433 4 2 212 359 256 3
313329721: 139 788 41 18 458 4 9
48862422: 1 6 40 331 4 254 500 9
39443910: 87 42 1 849 170 237
130906800: 207 85 93 16 5
220175705: 42 3 2 654 89 35 79 95
14111: 1 6 5 8 6 8 143 510 4 9 5
409336410: 846 720 10 8 7 5 2 1 7 6
113011515265: 9 3 39 7 61 5 2 663 605
2387490: 6 9 7 5 221 80 60 70 8 5
7712: 2 7 1 155 606 2
8043: 210 91 58 790 7
146645: 4 407 30 3 122
8480556: 1 8 5 922 657
689065610: 7 141 2 698 10
2753326: 1 141 6 5 4 1 9 39 643
345873: 7 265 3 8 26 1 47
74885173: 372 7 670 8 2 85 9 8 3
136583527: 6 6 8 8 3 9 8 5 51 822 7
3089340323: 8 64 8 1 90 477 2 4 53 3
1096918: 195 6 886 9 920
5367398: 535 68 80 25 98
3976108135: 7 9 2 5 1 1 1 6 31 33 7 56
2496005: 8 19 199 55 71
2893997: 2 3 6 9 5 19 88 9 502 7
557376309: 295 7 7 1 2 623 27 699
42567659: 42 480 1 875 5 9
15723798791671: 4 926 456 7 6 791 671
91: 3 1 87
75030526368: 250 695 9 692 78 8 96
17385: 560 19 3 2 3
616920: 3 60 879 1 582
584294213: 8 346 7 7 4 213
4724: 9 416 7 467
155165: 4 11 95 2 648 4 19 125
981426041: 4 83 7 71 3 50 9 4 5
19972184: 2 5 31 7 2 231 2 4 4 62
549451: 7 6 741 734 53
5081833: 4 950 6 996 2 1 6 6 7 3 1
1988310268: 9 3 5 707 744 14 6 8 2
96053133326: 5 804 8 8 192 972 8 7 2
3528: 3 11 28 3 3
24189396: 8 3 2 171 4 4 33 28
864165: 9 4 78 73 795
26433000: 667 5 1 6 660
8858: 38 1 4 206
3200393280: 50 1 3 912 7 940 79
2445982082: 49 1 7 94 4 86 7 64 2
3488032730490: 73 5 6 8 57 7 8 938 490
10071162: 8 381 15 137 3 8 8 9 1
444: 69 6 30
28452288677408: 480 45 5 2 6 7 90 658 8
2593: 860 1 1 3 7
198443470: 7 506 8 78 72 97 94
75507: 754 2 2 85
564275: 3 3 767 4 3 6 3 515 9 5 6
1226: 58 4 1 276 887
1416: 6 3 4 25 55 36
4946042400: 9 751 929 60 65
10626120960: 5 1 280 6 7 4 8 672 235
222300: 10 494 15 1 3
15905: 39 6 13 3 27 29
89152410253: 1 27 8 2 2 6 8 8 1 518 5 3
347293: 7 6 5 61 1 64 336 1 659
397401: 7 7 5 20 9 9 43 1 3 7 1 3
38394: 6 466 2 1 81
120391: 4 9 145 4 3 7 9 8 2 6 927
110645540: 5 180 267 1 2 9 2 143 4
87614568: 2 4 63 32 73 213 591 4
4709992455381: 3 6 7 2 2 955 791 9 159
6834689: 27 6 194 8 3 689
768: 1 16 4 5 694
320720507: 39 660 890 7 2 7 9
349171872: 11 36 32 82 1 89 9 6 56
2144800: 47 79 3 5 32 25 7
4415: 1 1 2 8 3 6 1 7 799 8 4 3
77208: 2 322 34 7 96
70838: 5 209 55 6 76 52 2 88
711169603810: 9 1 9 2 20 80 74 761 1 5
6894733854: 684 60 84 6 90 3 4 21 2
5086572: 316 31 296 9 3 7 1 8 28
2928408191557: 394 991 42 5 5 4 75 7
509332682: 5 1 4 37 834 58 7 5 68 2
13102440337: 1 6 3 780 5 8 3 37
10878341: 9 90 612 170 45 41
498132911: 4 911 685 999 89
958999: 683 23 61 6 5 17 722
143343: 88 59 9 92 751 210 3
2743510584: 6 706 6 385 584
251973: 424 66 5 8 9
10183308: 169 709 9 5 3 9 67 2 46
749315: 464 4 4 68 10 2 2 203
92707239: 6 522 50 4 2 74 1 6 25 8
82155646350715: 4 87 2 84 9 463 507 15
87924480: 281 975 789 320
60415: 5 804 3 23 5
971347: 83 13 9 2 47
17037310: 7 811 3 6 310
15333: 535 78 95 99 19
23713: 3 2 39 519 877
29532875: 29 5 32 563 118 194
6455904009: 221 6 9 4 2 4 26 112 9
57785406: 96 140 7 55 186 26 6 7
48: 1 3 12
215140: 8 317 5 3 8 4 4 40 9 3 2 2
9406542: 9 5 39 9 5 653 511 219
8396187: 7 904 477 3 148 87 2
734384430: 56 485 9 1 507 4 9 130
484993118067: 81 402 993 345 6
287773: 1 783 2 814 267 7 4 7 3
36777312: 47 6 66 8 247
4740447723: 2 36 3 10 3 355 8 73 1 3
866755680: 460 3 3 991 1 5 6 6 19
290326138: 5 285 317 8 83 38
13602050748: 801 13 5 1 49 7 314 99
61360: 9 543 8 53 60
1787: 321 5 82 6 3 80 9
233760: 7 429 313 5 4 77 4 296
7665: 87 5 11 17 83
26991479: 26 1 8 6 6 6 12 7 7 3 5 76
18712: 6 74 13 974 56 1 7 9 7 3
217: 7 87 2 3 26
64867314: 2 90 9 5 8 492 1 4 1 257
318200694: 2 3 739 7 1 861 63
3282485321: 82 4 248 521 3 106
156568734: 7 2 8 6 4 36 769 7 5 1 6 9
832433113: 36 909 158 161 1
33661685163: 7 2 7 42 49 1 9 80 342 3
1924152: 5 83 51 9 677 998 8
5297870114599: 141 899 89 5 839 99
429345221: 9 471 63 7 45 2 21
656: 7 27 9 15 7 2
75577: 34 855 85 6 6
1215357: 2 922 57 28 210 29 3
1595334418735: 6 676 272 86 184 3 35
5453: 7 683 5 31 542 94
154076: 3 414 4 74 1 1 88 1 604
355: 44 8 3
33370224183: 71 470 224 122 64
39385509782: 3 2 712 454 6 442 86
69169117: 1 2 492 14 91 17
1312: 44 51 55 890 272
168008743: 8 50 42 87 34 9
487800: 48 7 19 72 48 75
13370112: 8 5 49 9 81 6 724 9 4 1 7
42823680: 5 1 6 9 9 5 96 34 32
8791740: 1 62 807 3 54
56457986: 60 9 6 32 9 49 568 221
113219: 78 200 8 409 43
54394: 8 99 89 90 5
378625170008: 77 496 8 83 125 61 1 8
278244129: 5 6 176 93 630 770 2 9
558711270: 10 9 7 7 8 2 550 97 9 9
119: 1 8 9 43 58
4219093863: 1 4 3 5 609 98 31 63 1
13341355: 42 910 954 14
10052058: 904 699 63 9 34 3 6
48462: 4 5 5 66 301
75699471: 4 34 942 942 82 4 347
4544506132: 5 3 7 5 247 1 5 9 9 1 1 32
52896: 68 279 1 76 76 1 2
258536924: 8 5 8 2 7 3 86 690 9 1 12
288662: 5 26 2 75 5 3 172 41 2 3
26390: 48 59 931 7 7
102081: 324 693 2 36 1
128487268: 38 7 83 6 39 81 97 1 4
19224: 3 9 1 8 89
81432540: 501 20 7 387 3
738: 20 9 4 2 7 435
29516544: 87 2 7 557 8 69
1296424278: 6 666 6 31 857 54
479149020: 5 6 987 261 62
1883704: 9 638 8 8 41
7480260: 4 8 7 534 9 102 2 7 8 18
1475107: 29 37 30 745 7
1693: 17 97 1 9 35
896075: 792 1 862 5 2 53 9 8 6 5
2470: 151 1 1 2 2 2 608 2 7 3 4
45069234: 82 177 29 539 6
241893540: 824 820 358 79 10 11
191130028: 685 7 8 4 25 92 5 4 3 16
8853318: 693 285 5 39 31 2 9
18827664945: 4 9 1 45 8 6 4 9 82 757 5
4116: 1 564 14 7 70
176837684: 7 5 22 10 4 73 5 4 7 83 2
1896818086: 12 931 5 409 5 2 4 1 6
105489753097: 6 17 9 841 5 4 1 7 8 29
40161623048: 352 63 98 3 55 4 7 2 4
1588: 8 21 3 27 8 4
557431350: 25 486 9 26 589 25 70
344082613: 47 8 5 8 4 9 2 2 4 802 13
54844287: 548 44 27 1 4
2009988: 293 98 7 4 4
1460: 9 5 3 9 7 9 4
531060398227: 4 37 897 9 4 398 227
370163550: 9 48 1 8 67 12 70 3 747
607921609: 5 476 7 37 30 790 9
142843: 2 27 80 33 12 271
1491: 729 646 86 24 6
710723510: 17 469 9 3 53 8 86 3 70
101165: 37 495 19 6 79
4068792: 3 7 432 8 3 13
22305981: 9 3 348 4 1 5 3 2 65 2 89
1969800068778: 500 201 196 687 78
1968: 105 7 1 51 12
60750717: 45 2 9 75 717
57464640: 1 85 651 2 8 2 81 3 2 5 2
200314094445: 4 8 7 5 7 66 8 1 880 8 9 5
8486: 2 963 1 6 7 7 1 6 2 337 2
313862603: 71 5 92 961 3
13295: 3 257 9 50 5
567600: 7 4 572 946
68737952352: 318 23 1 2 6 9 2 8 3 144
3564807348: 35 47 202 9 298 57 4
689871030: 19 95 980 3 26 6 5
94380: 1 9 71 5 66 2
2781516: 6 5 603 20 61 492 386
13274353131: 3 4 466 1 1 87 8 963 1 8
1114: 838 95 19 90 72
265690: 9 119 8 31 82
4914768: 505 5 968 48 17
20054848: 9 2 3 97 3 6 3 34 58 11 4
25408: 773 8 4 2 670
12692025489: 6 504 54 226 9 1 8 11
290762983266: 7 1 8 7 38 1 6 998 14 9 6
11062: 173 7 56 250 4 9 4 715
2047569858: 12 5 91 17 21 81 2 9
36882: 237 4 751 961 2 827 6
604145841: 3 5 9 8 4 5 823 4 634 41
3706712: 3 706 710
1958107: 1 325 6 8 6 4 4 1 1 60 6 1
310883145: 4 816 618 4 8 31 45
86120982: 4 41 221 6 66 866 7 6
2773830: 231 76 3 9 9 30
75367563264: 6 83 2 6 8 6 76 9 8 7 1
22134: 3 90 238
7551233910: 839 9 163 70 910
153182070: 50 2 1 7 6 84 30 7 5 9 31
6210421: 7 763 8 2 1
14047776281: 5 67 852 229 281
2203652320: 807 8 63 602 1 9 7
233435: 9 715 1 9 41 399 1 4 8 7
1257131: 5 94 1 16 1 95 502 629
26088: 10 8 6 466 953 9 48 9 2
35581368: 5 9 75 912 6 62 438
606056: 6 11 5 194 44
1552572: 85 761 3 2 9 6 18 4
253947: 3 2 627 81 12
5051760736: 3 786 571 469 50 8
358540: 9 64 306 28 394
561644260: 5 61 1 4 3 6 5 4 247 11 2
1778294250: 9 15 242 9 42 144 810
7710: 8 2 753 10 4 16
193140: 20 498 3 4 7 55 15 6
502578: 9 84 900 63 6
43946: 26 42 643 24 39 159
6279695: 1 6 5 4 60 57 1 9 95 6 2 3
2372052: 8 8 8 80 44 2 3 7 9 516
55286: 610 308 47 4 57 8 45
11313: 85 435 604 6 1 3
1172701075: 8 842 21 461 9 25 7
1797522636: 590 8 52 3 578 44 392
971889: 5 235 71 26 30 9
4481: 648 4 8 166 1 291 4 9
33050: 4 46 661
28350171951: 4 146 945 859 75 2 1
20126581497: 17 9 491 229 494 3
219611747: 9 421 966 60 549 758
1240: 53 6 3 7 1
1063335085: 7 505 96 3 6 7 975 1 8 5
1055: 6 52 29 2 6 11
7469925625: 5 38 2 1 7 59 6 86 20 5
35653113: 3 5 653 11 3
149744: 53 897 49 1 40 9 8 2 8
93519: 1 894 233 7 16 9 39 2 9
11332409040413: 7 8 418 7 502 4 90 413
143916476: 2 497 3 57 961
7467000: 8 14 900 388 300 19
198360845: 6 121 119 56 3 41 98
353309832209: 6 1 36 8 2 9 9 44 3 211
128: 6 6 2 50 6
50422922685: 340 92 73 61 362 605
1044844: 3 7 4 4 844
9193: 5 79 3 76 3
30090: 14 16 3 131 8 259 77 9
337279: 37 4 9 13 658 8
168780: 28 9 6 17 64 4 3 4 87 5
642: 77 6 8 7 2
7672557939275: 25 643 5 76 88 34 7 5
19552214: 702 29 2 8 9 480 374
354663185: 7 9 3 325 6 3 574 6 3 2 5
525: 4 7 460 54
599351195625: 2 38 4 45 625 573 689
1965880: 220 960 34 49
714: 13 3 3 2 6
3955502937502: 3 6 75 586 2 93 1 6 502
2814600: 2 2 6 14 4 83 23 20 74 1
5382626: 5 887 8 9 771 26
2985: 42 70 45
114040: 86 805 270 99 90 640
9758700: 3 11 8 35 2 47 5 7 150
100502: 56 9 7 82 8 4 1 9 9 305
414969404544: 4 317 8 6 41 9 7 9 64 96
1842483: 1 59 3 3 2 9 2 7 1 60 9 3
21282606: 4 21 883 518 942
127405: 1 447 285 9 1
142043: 2 84 8 804 139 400
28834136: 47 5 607 1 5 1 10 148 6
2624860: 28 4 2 9 9 2 217 85 45 7
17295642442: 994 174 406 15 3 42
446792: 76 1 5 5 58 19 2
35078400: 29 14 25 8 9 6 8
35933488: 8 927 948 537 218 1 8
2054: 2 54 1 35 59
5752100560: 729 935 27 394 20
1460: 8 78 3 36 2 1 794
2092: 92 2 6 482 2
132844416: 3 73 8 16 8 5 53 5 6 914
1040: 2 1 8 13 65 5
3776340861: 5 6 43 4 807 9 30 3 327
211646: 737 7 1 2 41 45
2478488900: 912 677 9 320 6 8 446
6346890: 79 13 64 549 21 9 3
10743769823: 2 9 9 366 2 9 213 5 7 4 3
384744: 1 7 45 9 1 53 8 9 1 2 3 92
11120158342: 94 2 3 863 118 2
489775464841: 754 909 829 862 9 4
51328938: 7 8 9 4 3 172 73 8 9 1
3792391: 50 8 89 5 11 141 193 3
1677592: 79 87 20 6 9 16 5 2 56
471: 9 14 8 7 433
1107101: 3 367 7 198 5 7 1 98 4 9
47200: 2 9 3 17 944
3348321304: 5 813 9 1 520 64 7 4 4 9
1739519: 66 19 428 57 519
22440: 8 4 9 54 4 9 165 846 17
821576: 9 31 6 5 79 1 2 8 9 7 5 56
2668212268: 193 9 6 929 17 9 2 9 70
107258248: 5 39 55 824 8
16886076: 86 798 850 2 10 9 27 6
15150915: 23 77 8 9 89 97 15
5495112: 4 9 3 27 652 3 329 8 8
3731250172: 18 923 206 765 957
712: 7 82 7 70 61
1690608385: 950 8 59 36 754 933 5
211704: 4 73 5 5 29 4
13350938: 9 13 690 26 878 70
1078: 4 75 3 58 938
63265042924: 8 6 92 1 1 530 8 2 924
133796: 88 12 6 1 31 2 1 991 2
1568: 47 9 365 578 202
8272201: 32 68 5 887 703
1577492: 46 517 38 1 28
196963074: 84 5 1 63 47 6 29 5 198
886296: 87 7 35 894 6
31327600: 175 117 765 2 847 3
253681: 8 1 40 23 775 45 3 7 7 2
17514480: 43 377 18 79 31 60
910107: 912 319 400 558 1 9
161: 3 3 4 2 83 9 21
40413945600: 405 172 56 280 37
3789: 87 2 35 650 24
27022: 4 4 32 5 600 22
197568: 257 9 3 1 36 84
328307113: 377 3 6 45 87
151439: 95 56 423 16
259661768400: 920 49 2 33 57 6 33 48
423: 1 2 5 8 4 6 1 4 62 7 35 3
46979865: 446 9 8 7 209 4 5
645844904: 913 3 32 7 921 349 9 8
2626745581: 7 4 4 96 770 9 5 581
563611272336: 84 52 5 5 4 6 98 126 6 3
2816515701: 4 305 5 13 93 8 5 7 6
7008: 3 24 43 7 6 1
3843804: 114 9 6 880 67 3 4 680
11489089: 29 882 67 32 5 14 59
532035739: 604 586 2 440 59
400471397473: 6 674 52 1 3 2 911 6 4 1
125805007: 8 4 5 2 3 2 9 7 51 5 60 7
3731005: 37 30 952 4 49
26168970: 873 7 4 1 704 26 7 33 6
18249174: 249 25 74 86 9
14153474251: 6 471 6 3 9 6 9 6 9 450 1
1685466: 4 921 82 678 466
50708: 8 546 191 67 793
1789646: 7 4 2 52 1 6 2 910 787 8
113086575: 136 85 1 323 95 75 21
763: 60 3 3 157
756109819: 1 2 7 90 258 9 1 4 621 9
99331: 610 597 94 38 9 2 437
5591282: 31 5 662 9 2 4 84
68420: 76 7 2 1 4 3 5 5 517 8 8 4
120380: 4 9 6 553 924 8
663053160: 4 2 6 14 5 4 9 5 2 6 365 2
26825461: 609 28 7 1 9 109 6 52 9
41360: 2 19 3 2 3 899 6
20393: 1 49 4 3 93
2084013: 781 26 3 9 257
1667257110288: 3 69 8 28 41 204 77 7
430950: 14 1 8 8 18 7 4 6 7 2 6 5
52577: 6 28 9 295 356 6
10006634: 7 1 25 5 6 634
262290534: 82 9 8 3 6 95 3 18 4 92 6
67866: 31 650 73 9 6
1575: 9 58 1 3 6
59124: 8 2 9 2 32 3 845 1 23 4 4
1013226: 3 588 5 3 94
223242318: 7 8 55 5 16 22 2 423 18
1156716300: 1 201 5 191 828 299 1
304170059558: 452 46 8 950 6 59 558
16721: 4 68 9 4 7 1 60 2 2 7 3 2
3270361: 8 1 110 8 638 2 7 4 85
810506452: 66 458 4 349 554 4 6 2
67695107: 955 7 8 7 2 268 87 30 7
1799821: 2 9 52 4 4 1 20 11
4416: 43 2 6 3 6
10554182: 9 2 4 84 5 8 80 58 6 38
139: 8 6 53
175460066367: 18 8 66 6 738 930 27
2080368820: 3 32 1 3 9 3 1 90 99 8 28
217175: 214 2 605 570
370333248: 9 80 559 33 928 586
47: 6 6 35
2499: 52 6 2 2 81 2 1 9
398476: 4 108 97
277326: 13 795 462 3 5 31 7
444588700: 444 17 41 86 41 59
140: 9 52 1 72 7
151004081: 4 47 3 99 341 9 65
117335040: 55 6 1 68 9 863 1 384 8
5381424859: 2 989 1 4 2 8 18 7 6 9 8
972371: 11 81 60 176 851
75170: 6 3 683 71 28 471
939123289: 51 8 43 158 93 36 289
1129468656: 975 25 47 492 94
59856: 1 7 539 2 19 57 222 43
48186761: 7 894 77 99 62
507835: 50 5 9 9 9 9 1 5 39 1
95273700: 8 574 52 16 705 29
20660493280: 7 529 32 49 70 560
6624696: 8 6 507 5 1 8 9 85 7 7 34
15010074378: 8 7 56 4 8 4 3 5 3 354 6 3
678375368: 700 20 4 597 968
29457249523: 2 9 12 6 4 3 2 72 495 23
124197303: 114 675 807 2 3
952: 5 3 7 91 31 6 749 7 1 5 7
105460: 8 15 88 950 10
2474: 87 9 99 995 597
82448: 12 4 9 58 1 34 1 1 3 2 3 4
200852169: 83 216 5 1 22 4 3 4 3 7
15804: 644 95 836 7 47
51172: 6 80 9 1 9 487 9 8 4 9 4 3
18716470110: 7 7 92 4 9 9 5 3 299 30
1104115320: 7 51 5 55 2 11 396 70
23730820: 4 6 7 468 96 2 23 450 3
1001067516: 2 6 1 1 22 218 2 1 892 9
43248548: 4 324 1 7 2 9 69 373 6 1
15903155187792: 90 16 503 18 73 2 92 6
8504979: 4 83 2 5 8 7 7 64 73 74
363303: 404 580 41 23 9
227343: 7 77 268 9 481 1 90 3 3
326565: 815 40 9 468 3 85
7695: 2 2 85 6 81
39343: 80 49 2 72 69
61878: 86 58 9 295 138 54
1863313: 4 41 68 8 7 314
81640800: 1 69 3 493 800
159012: 37 80 6 2 21
9700215: 8 5 1 446 8 2 2 61 105 1
58789: 202 628 35 6 3 2 1 671
3072485: 6 45 337 94 487 9 2
256800: 2 8 8 6 535
283078917: 5 7 733 38 30 39 3 309
34675: 47 8 3 4 5 995 4 5 4 175
15603: 4 14 832 364 263
3938405130: 1 8 715 46 1 3 2 8 5 6 51
1769660661: 7 2 5 2 2 3 103 35 7 426
1609545534: 32 2 83 7 55 37 7 5 89 6
77820294491: 6 63 2 917 1 64 17 74
11220481: 3 33 3 3 83 1 3 6 640 1
2658459: 771 1 9 71 8 2 5 59 1 8 3
1599441406: 416 6 89 8 5 900 7 8 91
156508013: 9 3 92 6 57 2 440 8 1 1
8346: 5 8 182 686 380
231984743: 9 72 888 7 38 9 7 607 3
21601: 37 6 2 132 7 96 1
724: 27 317 27 274 79
55994878860: 38 9 34 799 5 9 2 4 9 4
4631: 1 40 16 7 39
712350654: 857 68 17 18 453
229674: 1 723 402 36 58 3
2100: 843 740 55 76 386
921150275: 51 64 890 9 275
734929386: 632 380 4 9 90 34 6
2669199: 97 5 7 95 922 7 9 6 8 6 1
1500039: 2 7 331 3 6 2 3 8 1 9 27 9
72048: 240 650 9 49 76
1660302: 113 25 5 850 22 76 4 2
511746807: 47 9 809 9 465 807
38019125: 369 68 87 11 9 6
4527: 6 6 9 45 293 5 2 4 2 691
242568: 8 24 6 341 64 8
427: 3 81 4 91 1
23195120: 22 198 655 342 120
360: 9 6 4 2 3
6853: 79 6 78 216 7
35758: 336 21 1 43 8 6 1
2179618: 7 70 70 4 680 1 98
9606: 86 4 2 3 943
26749464: 1 5 433 5 717 98 84
776037573: 8 8 894 9 577 6 621 9
799293: 99 8 76 2 4 4 6 1 3 5 31 3
2691671: 1 7 6 2 1 4 1 12 65 668 3
1544: 898 24 1 496 99 27
68191364: 42 990 2 2 82
524438312: 524 4 382 42 70
8831455: 5 2 7 29 5 435 2 76 879
434271927: 649 708 8 725 73 4 7
88569642727: 885 69 642 7 27
663: 204 17 3
38449: 2 65 6 1 1 8 1 2 56 8 369
392709: 28 177 117 2 50 5 7 3 9
58033879: 8 725 4 9 7 8 16 570 1 9
94154: 150 22 5 86 358
43361102577534: 7 5 59 634 69 749 966
2026946: 8 257 6 983
5551744: 3 9 9 9 79 661 51 7 8 4
467134789: 819 596 957 92 29
1434: 1 5 1 6 8 520
1660075: 217 34 83 710 8 7 38 1
104704026560: 2 8 7 4 6 5 9 429 5 20 7 4
3362348024: 7 4 601 27 3 897 5 7
967272990: 17 30 354 9 559 9 64
695308: 69 436 8 86 854
617664: 4 19 879 684 696
280208148: 365 766 618 143 4
11358272: 74 3 5 44 43 11 29 63 2
102: 25 2 8 67 1
148752720571: 5 693 265 6 10 9 19 3 1
9326675237: 4 658 325 28 56 774 5
63112912358: 63 11 29 123 6 1
689052595: 202 96 7 7 485
6261: 8 4 31 16 93 8 13
1143244033: 857 230 95 9 29 2 1
4077224042: 5 343 675 763 17
148967182: 91 464 855 38 91
13013: 261 7 9 23 7
151402: 2 7 65 119 8 8 484 2 2
1162841: 4 653 7 444 5
122954: 931 42 59 1 119 25
8802293760: 8 6 5 2 7 248 208 5 72 6
882283627: 2 60 762 28 29 68 659
119320851948: 4 6 9 3 2 736 8 3 5 65 8 6
363560: 599 2 9 551 61
79156980000: 12 75 3 35 8 5 487 43
2016471: 8 80 2 5 9 9 1 5 7 66 90
541898: 7 906 63 68 6
8691: 44 4 41 2 4
57859465: 582 9 60 978 6 5 974
969507840: 8 5 3 520 71 4 254 7 3 1
111331: 14 9 2 8 4 3 1 40 188 3
79296: 9 72 2 52 62 4 2 48 7
99752561604: 25 783 42 2 4 32 2 482
260196: 85 8 466 6 2 104 53 9
54308747928: 84 978 7 115 1 6 958
177610113: 5 12 4 679 5 23 457 9
291015504: 409 342 4 702 138
111029044: 7 658 506 16 57 7 844
4431074491353: 263 96 287 7 27 650
61459200: 3 3 3 37 4 805 2 30 80 9
4938: 2 6 7 7 7 586 74 4 130 6
724927: 1 687 9 1 13 80 47
176219199: 8 533 928 1 351
7061236841: 52 30 20 299 859
1680930: 56 9 2 120 1 799 8 2 95
22230091458: 5 780 57 91 4 61
618962: 618 8 7 9 1
979087974: 896 52 407 2 5 53 393
1076124: 3 42 7 761 124
39804061: 3 6 7 9 3 2 3 685 535 6 1
617371560: 9 2 6 77 1 83 4 26 9 10 1
59292627728: 244 243 62 77 28
60679755965: 81 7 1 3 19 57 687 65
385718461: 2 6 873 908 8 3 3 3 2 24
70068614: 5 2 19 383 178 887 7 7
81627: 812 1 8 236 87 45 41
61252920: 7 396 200 229 90
122349515906: 536 4 1 3 95 66 704 49
236503863: 546 954 305 373 131
3351192: 2 65 1 640 75 9 78
5108625: 3 2 2 5 2 165 313 1 7 8 6
178031530140: 14 4 9 269 7 1 710 822
6883328: 6 94 1 3 113 7 9 4 1 4 4
4007370310: 15 90 8 9 7 357 89 830
588964251601: 7 5 347 2 47 20 963 5 1
270755048: 6 42 1 631 212 57 8 8
1332121: 8 9 8 4 2 3 6 800 8 3 3 88
5591335: 371 3 5 2 6 7 5
14219565360: 5 993 213 3 8 754 91 5
5861562162: 1 8 9 4 8 6 6 4 451 53 6 2
1433385: 874 74 21 72 9
15707744640: 568 36 6 5 59 434
1690128: 66 2 4 97 33
398948632: 65 4 61 85 5 3 7 72
10387019376: 63 1 245 7 6 77 42 328
4179604: 5 6 422 1 20 40 45 4
207295515460: 7 423 3 645 7 3 9 6 1 1 9
1496054: 80 69 48 12 54
117174039: 60 5 5 4 331 59 2 37
120561: 443 34 8 3 62
1093662: 1 413 9 1 86
72832203: 49 3 4 4 791 3 5 22 3 9 9
9172450: 520 94 7 264 49 175
5092: 9 52 9 6 5 869
205017: 859 5 67 47 3
502964: 5 465 2 92
982872: 55 31 30 94 721 1 6
18842130: 997 20 24 362 50 30
933: 11 824 8 3 87
100362657: 9 3 2 6 375 988 3 3 8 4 1
125631197: 7 8 1 2 92 6 9 72 1 563 2
16965: 936 759 2 5 8
63221509696: 76 214 5 4 340 89 8 8
175095120: 66 4 1 5 6 10 184 6 3 8 5
5948579768: 69 5 3 2 6 5 44 93 3 8 4 3
612455: 6 4 1 638 251 2 8 3 1 9 6
35828415: 6 4 1 7 9 779 2 22 5 4 5 7
1423570: 77 835 65 4 6 1 849
139702935: 55 8 4 5 5 6 4 90 2 935
521072: 148 8 55 9 5 8
42845205: 9 110 6 54 47 5
155790: 8 558 97 18 1
347911604818: 91 6 354 22 44 2 9 9 8 8
196579: 1 9 15 15 129 2 19 499
178336116: 5 53 16 4 522 6 6
211784: 352 6 6 22 4
357611951: 9 19 8 1 613 463 7 3 3 5
2856: 6 31 29 54 4
3115653: 8 404 964 5
139573401: 1 34 1 142 33 851 891
2731: 3 107 8 1 8 8 80 3
1635930605522: 8 5 9 6 8 137 7 94 604 2
2517747584: 8 1 3 715 424 5 755 1 9
13551: 8 9 6 589 4
8640: 9 60 9
246434062: 6 18 632 93 960 87 62
844073: 298 57 899 67 7 47
14942463139: 169 883 197 631 39
70584888: 8 8 23 8 888
66176064187: 882 7 833 5 9 17 2 7 5 3
54955: 54 95 5
1683752: 417 2 9 562 7
31395181: 94 497 1 1 672 9 4
418453: 9 7 19 1 1 349 2
737204: 8 1 4 189 9 3 86 4 5 5 1 3

168
2024/go/day08/day08.go Normal file
View File

@@ -0,0 +1,168 @@
package day08
import (
"adventofcode2024/utils/grid2d"
"adventofcode2024/utils/inputs"
"fmt"
)
type loc struct {
x int
y int
}
type pt struct {
display rune
antinodes int
paired map[loc]pt
visited map[rune]bool
}
func Part1(input string) int {
grid := inputs.ToGrid2D(input, "\n", "", pt{display: '.'}, func(c string) pt { return pt{display: rune(c[0]), paired: make(map[loc]pt), visited: make(map[rune]bool)} })
for x1 := 0; x1 < grid.SizeX(); x1++ {
for y1 := 0; y1 < grid.SizeY(); y1++ {
pt1 := grid.Get(x1, y1)
if pt1.display != '.' {
for x2 := 0; x2 < grid.SizeX(); x2++ {
for y2 := 0; y2 < grid.SizeY(); y2++ {
pt2 := grid.Get(x2, y2)
if x1 != x2 && y1 != y2 && pt1.display == pt2.display && !isPaired(x1, y1, pt1, pt2) {
pt1.paired[loc{x: x2, y: y2}] = pt2
pt2.paired[loc{x: x1, y: y1}] = pt1
}
}
}
}
}
}
for x := 0; x < grid.SizeX(); x++ {
for y := 0; y < grid.SizeY(); y++ {
pt1 := grid.Get(x, y)
if pt1.display != '.' {
for ploc := range pt1.paired {
addAntiNodes(x, y, ploc.x, ploc.y, grid)
}
}
}
}
antinodes := 0
for x := 0; x < grid.SizeX(); x++ {
for y := 0; y < grid.SizeY(); y++ {
pt := grid.Get(x, y)
if pt.antinodes > 0 {
antinodes++
}
}
}
return antinodes
}
func Part2(input string) int {
grid := inputs.ToGrid2D(input, "\n", "", pt{display: '.'}, func(c string) pt { return pt{display: rune(c[0]), paired: make(map[loc]pt), visited: make(map[rune]bool)}})
for x1 := 0; x1 < grid.SizeX(); x1++ {
for y1 := 0; y1 < grid.SizeY(); y1++ {
pt1 := grid.Get(x1, y1)
if pt1.display != '.' {
for x2 := 0; x2 < grid.SizeX(); x2++ {
for y2 := 0; y2 < grid.SizeY(); y2++ {
pt2 := grid.Get(x2, y2)
if x1 != x2 && y1 != y2 && pt1.display == pt2.display && !isPaired(x1, y1, pt1, pt2) {
pt1.paired[loc{x: x2, y: y2}] = pt2
pt2.paired[loc{x: x1, y: y1}] = pt1
pt1.antinodes++
pt2.antinodes++
grid.Set(x1, y1, pt1)
grid.Set(x2, y2, pt2)
}
}
}
}
}
}
for x := 0; x < grid.SizeX(); x++ {
for y := 0; y < grid.SizeY(); y++ {
pt1 := grid.Get(x, y)
if pt1.display != '.' {
for ploc := range pt1.paired {
addAntiNodes_p2(pt1.display, x, y, ploc.x, ploc.y, grid)
}
}
}
}
antinodes := 0
fmt.Printf("%v\n", grid.StringWithFormatter(formatter))
for x := 0; x < grid.SizeX(); x++ {
for y := 0; y < grid.SizeY(); y++ {
pt := grid.Get(x, y)
if pt.antinodes > 0 {
antinodes++
} else {
if pt.display != '.' { antinodes++ }
}
}
}
return antinodes
}
func formatter(p pt, x int, y int) string {
if p.antinodes > 0 {
return "#"
}
return "."
}
func isPaired(x int, y int, p1 pt, pt2 pt) bool {
return p1.paired[loc{x: x, y: y}].display == pt2.display
}
func addAntiNodes(x1 int, y1 int, x2 int, y2 int, grid *grid2d.Grid[pt]) {
px1, py1, px2, py2 := offsetPoints(x1, y1, x2, y2)
if px1 < 0 || px1 >= grid.SizeX() || py1 < 0 || py1 >= grid.SizeY() {
return
}
pt1 := grid.Get(px1, py1)
pt1.antinodes++
grid.Set(px1, py1, pt1)
if px2 < 0 || px2 >= grid.SizeX() || py2 < 0 || py2 >= grid.SizeY() {
return
}
pt2 := grid.Get(px2, py2)
pt2.antinodes++
grid.Set(px2, py2, pt2)
}
func addAntiNodes_p2(frequency rune, x1 int, y1 int, x2 int, y2 int, grid *grid2d.Grid[pt]) {
px1, py1, px2, py2 := offsetPoints(x1, y1, x2, y2)
if !(px1 < 0 || px1 >= grid.SizeX() || py1 < 0 || py1 >= grid.SizeY()) {
pt1 := grid.Get(px1, py1)
if !pt1.visited[frequency] {
pt1.antinodes++
pt1.visited[frequency] = true
grid.Set(px1, py1, pt1)
addAntiNodes_p2(frequency, x1, y1, px1, py1, grid)
}
}
if !(px2 < 0 || px2 >= grid.SizeX() || py2 < 0 || py2 >= grid.SizeY()) {
pt2 := grid.Get(px2, py2)
if !pt2.visited[frequency] {
pt2.antinodes++
pt2.visited[frequency] = true
grid.Set(px2, py2, pt2)
addAntiNodes_p2(frequency, x2, y2, px2, py2, grid)
}
}
}
// Function to calculate two points symmetrically placed above and below the line
func offsetPoints(x1, y1, x2, y2 int) (int, int, int, int) {
dx := x1 - x2
dy := y1 - y2
p1x := x1 + dx
p1y := y1 + dy
p2x := x2 - dx
p2y := y2 - dy
return p1x, p1y, p2x, p2y
}

View File

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

50
2024/go/day08/input.txt Normal file
View File

@@ -0,0 +1,50 @@
.....y..........................p................r
........I.........................................
......................4.s.........................
..........4.......................................
....y.............................................
......................................p.........r.
..........0..s......N..................1.....p....
..y........4.......................p..............
...............0..................................
..............0....t....N....h....................
.............N....................................
......j...................s............H...l..O...
..........q.................H................O....
..f...e.qj.....y...0..............................
...........t..........................k..Q..r.....
.........6................Q..s...x......W.........
....2..b...e....t..4.........c.....xW.j...........
...e....................w................1.....O..
..e..j..5...........................c.............
.........B..2...............MK................H...
...2......b...g..X...q..........h...............O.
...q...2..........m....k...i...............QV.x...
...................i.........W.k.............HQ...
........b...X...............D..........c...N......
................................l..........h.....I
.m...........g......l.......c.............3......V
....X.......m........g...V.K...7......F.d.........
.........b.X...U..........................C.......
.....................l..............o.1....C......
............u.............K..............3...d....
......................i.T....f................V...
..............................1.k.................
.B.....E......9..m....K..5.M......................
...P...............M...95....o..i........I........
...............................S......3......wI...
.....EP...........9........5..T.R.................
.P..........v..9......f.............R.Co..w3......
..........h...SG..v.E...7..f.T....................
..........6..........L.................Y.......d..
..........B...............U........D..............
....B................U.....8..M....n...J..........
.........................L................Fw......
....L6E.P.................7.UG....J.....Y.D.......
........t........v...SJ........n..d...............
......................8v.....uG...................
..................L.....n.........................
...............T..............n......D............
..............o.........8................J.Y.R....
..................S...............u....F.......R..
........6..............u.....7.8..........Y..F....

117
2024/go/day09/day09.go Normal file
View File

@@ -0,0 +1,117 @@
package day09
import (
"adventofcode2024/utils"
"fmt"
)
func Part1(input string) int {
disk := []int{}
file_id := 0
for i := 0; i <= len(input); i++ {
for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
disk = append(disk, file_id)
}
i++
if i < len(input) {
for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
disk = append(disk, -1)
}
}
file_id++
}
printDisk(disk)
for i:=len(disk)-1;i>0;i--{
if disk[i] != -1 {
id := disk[i]
disk[i] = -1
for j:=0;j<=len(disk);j++ {
if disk[j] == -1 {
disk[j] = id
break
}
}
}
}
printDisk(disk)
checksum := 0
for i:=0;i<len(disk);i++ {
if disk[i] != -1 {
checksum += i * disk[i]
}
}
return checksum
}
func Part2(input string) int {
disk := []int{}
file_id := 0
for i := 0; i <= len(input); i++ {
for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
disk = append(disk, file_id)
}
i++
if i < len(input) {
for x := 0; x < utils.MustAtoi(string(input[i])); x++ {
disk = append(disk, -1)
}
}
file_id++
}
printDisk(disk)
for i:=len(disk)-1;i>0;i--{
size := 0
if disk[i] != -1 {
id := disk[i]
for {
if i-size > 0 && disk[i-size] == id {
size++
} else {
break
}
}
free := 0
j := 0
found := false
for ;j<i && free < size;j++{
if disk[j] != -1 {
free = 0
continue
}
free++
if free == size { found = true }
}
if found {
for k:=0;k<size;k++ {
disk[i-k] = -1
disk[j-size+k] = id
}
// printDisk(disk)
}
i -= (size -1)
}
}
printDisk(disk)
checksum := 0
for i:=0;i<len(disk);i++ {
if disk[i] != -1 {
checksum += i * disk[i]
}
}
return checksum}
func printDisk(disk []int) {
for _, x := range disk {
if x == -1 {fmt.Print(".")} else {
fmt.Printf("%d", x)
}
}
fmt.Print("\n")
}

View File

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

1
2024/go/day09/input.txt Normal file

File diff suppressed because one or more lines are too long

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