Compare commits

...

9 Commits

Author SHA1 Message Date
Gareth
d72675c53b Day09 2025-01-11 16:06:38 +00:00
Gareth
ce8af338ed Day08 2025-01-10 20:44:19 +00:00
Gareth
60015d1134 Day14 2025-01-10 20:01:21 +00:00
Gareth
201c30d31a Day10 2025-01-10 19:59:49 +00:00
Gareth
0ea71abec3 Day19 2025-01-10 19:55:42 +00:00
Gareth
622f81a352 Day18 2024-12-22 19:02:26 +00:00
Gareth
436e4376a2 Day13 2024-12-13 22:12:50 +00:00
Gareth
c9b972148b Day11 2024-12-12 13:11:47 +00:00
Gareth
9b0516c587 Day07 2024-12-08 13:47:09 +00:00
28 changed files with 7887 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