diff --git a/2024/gareth/day07/day07.go b/2024/gareth/day07/day07.go new file mode 100644 index 0000000..694c09a --- /dev/null +++ b/2024/gareth/day07/day07.go @@ -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 +} diff --git a/2024/gareth/day07/day07_test.go b/2024/gareth/day07/day07_test.go new file mode 100644 index 0000000..73ff38b --- /dev/null +++ b/2024/gareth/day07/day07_test.go @@ -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) +} diff --git a/2024/gareth/day07/input.txt b/2024/gareth/day07/input.txt new file mode 100644 index 0000000..23117ba --- /dev/null +++ b/2024/gareth/day07/input.txt @@ -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 \ No newline at end of file diff --git a/2024/gareth/day08/day08.go b/2024/gareth/day08/day08.go new file mode 100644 index 0000000..ce5a1cd --- /dev/null +++ b/2024/gareth/day08/day08.go @@ -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) +} diff --git a/2024/gareth/day08/day08_test.go b/2024/gareth/day08/day08_test.go new file mode 100644 index 0000000..f744f8f --- /dev/null +++ b/2024/gareth/day08/day08_test.go @@ -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) +} diff --git a/2024/gareth/day08/input.txt b/2024/gareth/day08/input.txt new file mode 100644 index 0000000..d4fb9a8 --- /dev/null +++ b/2024/gareth/day08/input.txt @@ -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 \ No newline at end of file diff --git a/2024/gareth/day09/day09.go b/2024/gareth/day09/day09.go new file mode 100644 index 0000000..c2e12df --- /dev/null +++ b/2024/gareth/day09/day09.go @@ -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 +} diff --git a/2024/gareth/day09/day09_test.go b/2024/gareth/day09/day09_test.go new file mode 100644 index 0000000..b9de485 --- /dev/null +++ b/2024/gareth/day09/day09_test.go @@ -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) +} diff --git a/2024/gareth/day09/input.txt b/2024/gareth/day09/input.txt new file mode 100644 index 0000000..b5ab7ba --- /dev/null +++ b/2024/gareth/day09/input.txt @@ -0,0 +1 @@ +2529414994631170149953136311659836486767499011295895209013255645858553884990631239857180407026188318789536626883964672136355273919115442427552799046486996326836721848461142184774852462365260634524991545439574418977718911375256991472764810705999392318631748622830142133467261617273937356141415707425753674415292503537471415868114655290826112291685289736371370794189785878486831872016564126976522727423616247825525582235815348304183161672962553208063528051403895878511223754541942753550948843423236569890488336109548241119404580493982516632107654275399605468301782552884515594818174546445227869897726454296218318628664159728961325374033515263746610627048519411977781695595794535515064703636952079774826159321748816186679411826696063348134165468188023619726476382843216866261777484681339754899174368188722709816794137754761792646555351973887495359649411363814901253642493312614366531222370302156743751318251941645822081602872738751283687336339884876543218141359765134733663492093416431535012445097595649165971493028986240575597653688523974288772307034632638625633187731811281922665421327836218203214749354406959408680793080389496978212945419775978249165443961189137588895163095106088317084441298272395387540452384597822868485507235641120715625515459853525688110756198615289287578182442456417904668154987527729122473963550517916127294526771821425495935972610686448528932482912141732519954383661982334932650248353682615255120545729895022211147836848115341454584957926805633627964276847999330476526354279332512826717133230773157324347402953953927527665567153253315399378748818468678693837961867951860312379276017805343355247963052974232165110245254232287194847722340532410286385821556192322832743937519209173458985571983132531839983977272421739138970811391464140682379139824407889378619871180297441298829669070809895586794531431857864567433873076723053603435662419381934421712102617472739137385638576101831848842655652454165101290255871526232351950556852421166861327615244371495542266229753205035804540174131698192768395814389388644268086405515537752706254391829761337527891677215356747115182964429255822243039588914805260924016257466777195552352949478722191539771342551122847825532233481813754983169379785489050221270707365696021932483631432414437351963685012191132618360937331778186804479417765518124878796421456944742103810878239437117576013394324571182139571294073653266958694952196425926136893533164132575492817488096489046378492654888421055756213119857493249964822944119957868459016171356769871756326614598659835681980344267978612918689166116244890339182206315282146134018964798226159212449309744905320227743183143823029572839434660354034213549817535283713791522376277984037586413688061535089165885822732145890396647843158478710908866936938249064552772794146522586525741963899855122516857695592581647685180705089559981833535136560929145755880975051188152909463771689906499581149643227497130528722407033493481913346162338161479763710736884142797715949788465814349438278276580443850194834256818985090856559827988358562352513349995775225726210788843511763845149583787943127203914501053994685329347167183832489402915704644923353246710121286566284592170886447519167319529279269987190217074136145686633506883865816354097504356778652208815894272748631452119193048574123409114138145899637632260879694921946816524934021101560398222255429352486691681551047543735741549497410302274971744428279371337924012804528976512947630763820698984176515394115387633878375905835504237195317411954949167209227352725803951402765353945194611408966745723441976996218446199527123935043173695744261353026652837718730465094774015112912204943556343544443281354456239347083976280589560844610218264355879457283812993459560733867541611553150662275879650464596329710741282407824297149262230995875542027136495131087189327597974108634582334863989876019159315756949473828329795289481447823671037856645639327923091353712977682847527747453192825951029198856408367633596597492822338202150779572581027413328459951408278317191453930802581727739778818584413762281675934513970122072971459927778838048533780518220295897149947836136418279345115765461984365627774424287416673159950719867353137466421928859527059578264892347829281782530312247822394516573966472975576956366988127608160989564458910184313229420889926896085859813973174764072952774397898954466591163388550598972604976663611761341337996196531364142244786437084508236507637471411333734425822787974289912567133635377856417676855417510459720787516351248865028922683834152246383211823927644303075529444473819826470587213904655264647936061755076265634169417988091507859331696695769284314334936986135269574142089267669916879509927751857594745155933587016723848953951677257844971196014883326232861968441712070642663307777867467921814283324529951996933555279335439351793773832376425489790347097348422593969642852779022169223143874617495449982708614991877319989495996341617318379612350708842715884444940298963514595995861202572539578968229889314943042379386975825399714472598998896275717317789252230862580831911698693607072779348639733637062376388618751532446287461907975694698138498743674524764675433752075968423109396213318302547126063612015531374816351905283436220886375995812865645649141134191501727367893497583962867563365886828824519512052627638939237741386617227974759779067369889518684846439526033282876841617462042442269987069773717961312365584922658887661807898123591715763889589721296117827774775908347857384569976642759537833152357239422302577182823786591653840885394638914438832962054492810589492861554891063532026219355884515583221127034332875159922409584108748275365712893384120529451631561844113821693951354569460739871304131148640197459796332329932481346758171451932293326231949729390343088517175979578399524493432135176233172553180593570434837191336643916833176559150318999731314923242823710603792571853876371181271567758677297726678746261485567172587397114357927481587588546685557202136685993376096227650548253591779513552553924641735665178743045792684921252441476943956138343342153965395174258165333143368244033705373906479283944601437469850534960435315251028392311693555987024759239405319995026991252746572267189531323531240726621262588875681413577157821855759361879662876199816456269408159192440157511974546254551552112837961332772366597688970625124776783129518443867948213402053698231624310479198241337516740542547528657576074569664283634947780873287845510856376975280329234895920361046864061638397742281498357239959407484853642241734938160807663532164878623998830956790996098256839394229567714123932563931773235189019543369113372644947855499733915242264161245168769962351632553241194171382308165896772152271462743716484197248784950479730116542401564881257731654274033215711596287275930853493403887128663418582562837826832168965813950579887467061403834136842595975531188795065866894841959715210245747786292922145987543385430557218605063544754162850197295523292787872151070389787421074127480979667155282908461632832688958559343982661121567427116199232372744447250876255842217334096361787578921133673471226504829932937435162951056248417288221392613501749757484922179762626734566329696681235101999163642723350107832851532326160957591154631213496682013446738936344824599467110178333272612434182583726759394461671638880234884483742665765867162858753905079626655457570366587407816437486477441464926871135787479692260276680512056289567185812166261926597168235395791874272491337975719533018634929555681852889654725246766427836868339678299888070467361418118189185887849937415133033914434276167236373773242317889396972266762417210188295313421108175673291946914346531348630218711871325557857622725614288216914324142176149347966536219563474327432727315874397694491365159904382779931668771605155113377709491935019345329841640515393223388938398282814804018387757388269801688686119747960177369204228904719749989835059126010153088386468907469927142349124434852117714543516719911402832634829925120206332742825132621443526525038458970937574866527656658817482173683851272254888471587388799605651435266467029242546257288474665612035773117775755683493605435355451292552972838536749176269563218506210641949288225781671776376732626121854927620421599755763586241659734169460198471917986486743522513185299196496888657338493297625141871835456782744552777179870472819335930524451412227158567606324777065304544224274548895676217717154302827468454448617961547129915827072347777646166273473351079158780484188286332909954245091842872889126836863984182843435306389397411631977474322671629434756137663563618752317648357694644226485694945599174259688668187274661887191493082457995761881593446127225317165293022501952319497336932322767788699429262191752563263922892838047925172188196504853449214629551296665581145158670239512849396537147485663544045742782496673348490857554903925836698569925609944374774653511741831657175125137496038822182603950587691483262191235208463325762778839662856282217234530369627147973868822827010148030165632441653194425421050232513106040447451846676359089671531796362678717767988124162979694506496784054812360567782399784865135388690294642683171216974766986396576975490105318559373424698787437688557877158218371278457789860311029563277546383544892577698264626845017579266981747732354379074878361114767608950934590211375765721348048884340909970805539267593105416844391682494919095598134249119368133359819757379212389438096743567758051275829118265143278801797638476563062925356262417553725967577142813708467847887655547416511553757847121804935843837784184545722793051823734246648646452287876584949575494315249845695325028189443292761891979237563826779898665181091654818647159185643608485305387963626224565928489378619444981923468579667968346377691534172934755957294709524397313443796384252591052707013952490768483528934175481704189152762162211298817663343485942147260512852528849838755724259418851669671598937513426823917485262305387796586297250551618388512339573624195264377407617827265294187259151294042519881542927279134235990229478796182765494193011192529599466449484487736567431126378487357537211408016478927122161197418944499364646411439156188812657659057274751477567475479836151955744708965869356819072204223903818202714564693184141171455129739674233312746984353853673975679277422414589723884364055569015124470343548823363192038946382122535898741553564885030261230488670409813686864388051132153324436708452844556148980927437241868332788438436634578876696742551928297793057289492146014478268681653366058565496734095904157615382536916912880508895357980811744463551872854337213632877945616938728611968899069416832219319264918987045779598529743253653729623391460482983259834966541864633785212981315586379697984194168364339675053787966329947131876867391118287634731671236868794137657415848338165177860813946763329597892791846106916246165157787333462409543784419585539868247783516923034381310458279709742708571821071597884146240884743628171457667686192573119798348994886418635727348836793913966419121819538427523585050341284172143209454318938299629713522699382881471164623839496246929753762186223896414982817796548399273461731797862527790617851192259229068723173591179947263952488681098333066867061403077834543413647619652285790488368491330257022614855462914813418496334698360298890977253499690182691378151647998867282767275147356601673269337114933275033361763477777327319657889664111264293916799147973231610405711368633275341825337629973362314465218134291874541119265441641325965383489444932957497211982434423247696121722833394918883766470873350703970871023839028395037172370843315285469767290177132558647268362894144737545542038543444326848886920491119779813203419559399587340303127918720857376772641801270168616802661393363597267548380882130511796448246378086751479931092975214946844455177376047631427628232643039145923562453584976937176864628584340132716635333833468614764566940837086345727807372153256379129817956745919253421978943303191964484576435667240425071512984142417757658878650324473919977471882477144698189544341706848156784755021389523767151202493163382509560121311875219924649812452873976707628227820632820739257169016537896842144442495561161711243947054753082906874578195333626412299754020937251566533744223342995987474144817277213873632741755679846976852884229374282621294461537863047549490727134294218613747912747684785411267652467495199481996163375674940915462324184284088111423992371895230408480857930131266845763228223598440796634564969707066156452295089288777649277556013195871949271376495896088399085111576956820871784768372833888472937351118942457391847395757728767643727465020313980359554748836956333726494842729481765977351583238212696488790762185727885446331169472632080216273482057861829471778875450927772519954192552374349244223288897401148744834795092241162595178262946332893829021521296928856767232999222429392929724231276538533162498199713755661745720188685621372609635783747372243441353383311216763858812142622337755866549154717988836991149157056679744351490452357525326895036498352158193214564873889188822172336593194139584162523761462788035946956594849555358833582551834963214195228681216846935144898711024858025684423272687674547243741279359721575796724717376598366601669371589483213985131383414752627927723557070944997926173415173724037987866907042694413604737826114832744647489791567315380453572501087819757772371789536942057356056834340224775282111235470393566669227791979483123856082711161352084954631189797986652655943733985175613773658602334372343281879567914308267183638153184823726724566396110569430372769759269198217761169106040842690481473942285616714699962893391327592143644558856814994338618558544845832538562737478613796728913775260514678619912268081237650253842478140275339735790247579151915741082626354947213262785324994159099206320675914582810964666394819689639747759292899828544111124815030245345989832397773681057556125975939588428612540904269995936848226157958545165614127438731257823974789789811341898208715245826579965389778646581252045654084858253831882371812399318389060736043917199945624964579799041907783207825824399623327318161397052456683102527646058649444143050285876779192592564613330951083466466502517598764917022923845789672152239786235482764779660924680725767294573227498398795537592791385536149221689312957148544603085491049136359461311252913228854582995985553121163751021405540196625412868938130782435662350157030738948966344462633246063731083604516377127533931273840604693967751118249227536484769582931637926753549825338488847403822703910596122894485916477281041683480916174998749199321157023909665156323107760293576617787344728487416299641705594226185974385776878853444481736797141554985434667491845948847953989684619984662615950661342432494176354605213197243564389207529919259276511378044254880809886939188541479568484884436932410235652754259366920219999509354482025651582522873161276536036926662659835546646737470146247178441633174105497918161793946529556639276345920313138156847186466769956195522594258387664807758424387523222864982562133457388503184838382627283787760769617306330925889844668863338639486313032367972343946232599962147372284593149426277978221664943956749342273165518778795246230308036222172627794688092688374417660859628207682432230585335997646518451283753855632283563461248551782801478427171182044233235333689246344142349195527326218614546934096196395919249796094979048404911418569849992205723919588352868267022792715638089365555469933109745505983854555716754389359943836287587882385792117865937135819373743166117166634263438428256662492501874434630605897748134639549891548337076632976438735725457809789651163712698574923324917873193176394253438473564844581103495857314944695524838936319331387739355914148379720413456597618841520611034261711463157755783229893234042737345213852299940451380776112897760259714232379641391851693292843105245934282976949556542441355827670265534643431928527265926343029236454344667976639992684351387822888527390635595276038301338842760967882862050784988835946425019497961696974179371653976645268358674107934849749506388444356928590662862962050795631898627636338248381123892379795127315579693901181929965611971192592687949777296569359557275288711591621995840581068823650967232971011659247646069542710526291704853263490729512519956325623226321378177893166585121321844383090608885395624666032711317364698202572312567906283314163458748239810969511193451358948754518893542546920874788249278615074638584873548987858714494329655139886301026184321619953857896988815757599456453288089384482348062264715136844338148275555332016145254409076549132309660707222523960779157687563959995652343137132357989488445389210161565559326941817131277456063109683808335235724285164251890294027516524798351723588853355353337971087914066811666802940771578915136967538512688114939848293447517254942203619344534653241641455922596502420724020646461452575937427301251575826383828208412638471853768861468933955412839852493704967123787276736464624867167589648486712784155602554687837309060812180409563389019256718323094324035663674751022144535804524703362643625738220613356196193181182676491217180161232783738874760412587743291935496788956644846291471646968263250985566956040196438494715221043223627487440104551507183612184648040516627433067117696278659536799656067988833855035232022299588322565596270969486416635211995476318621946902994605967253960603347503394665843208333927524282996905694719826813772238273901570383296399220481911621780582786776577412022235016458129677157872539206116436944159412168664414826399628808910403233937791491571647325359066778280479961443674664081892572998374821221625140159133847469139499164637247539935712522260797025385033319534455526189365428960343483535542217665664726812024901773776917146114487248538687624319891318957441316967777576473049372764251177564480132356638412215697295025474413357622434690359746759335827523317492439392733713486952142988665231215292633669259725952646192054369364385068652199241664604763346882699186751576467924189378159018354145172419751388786241999187995825214531719054494111317922957862687780948371339841473610663867992514545614484648353581399073723231208154211012754251288542144223701493275358165119283458504117789158274734615196369367194387631995881697342191189572599029142212195690231476735929641029888887177840149796788522677992162737116597478484646056525174271255454122623685275569419714652921746041168099595295681399824887713226447050238817675317501956458571484291876187918049171175574175502991341121445870531814272148263064565282627514101123843723926654728619217784377581691964745248742935414089789490199119901853209347556262769030686033849925415671401323286071689986625384437097242386402070752539733644425362302761512360586910688334224486608461723197915563788036646327757479361026187821836868569836296615936497363657906673652749883673425570236496307020577955277693605582949958448529747175845572891755706137581334391327675010162978597060117322524120484736867193209235686848993575189277991753559513785257361183538376296615746462283343218369316121978319455552454193795487287969913691192354711363702111845346793736812589899096354127506081808036655441412958509547693761145119798696819510255490727798714511824497435990268786605521723282914729916771733149511360747625614267243964173121895462317598271534507061376766169942297795745526178562494180322753378246586130222089701041133920185272225395134511116953644349679488869173479735531687619476132528769768498069807465749939773067771825171055452073763268712329272937896090472378592133239775938085409573688062851627994874304318317862611643166961232498534730265757407912729619903682765224124977839280352358547098287921317341666922129894464337354928568038122378355225632276256715583670471355993855172746622825944376966233973757356911825260162871812592632559891117486347422347992529941697702017488464635678917868589612168269669537653857591035652857132315393832456797892133684196261957473754507416947165754330317062712830511914274558747584295780647492605119565668911332402960887396222241993596509063834636402284154381646485385868579153248445294622277948748137205831632555745583303493332 \ No newline at end of file diff --git a/2024/gareth/day10/day10.go b/2024/gareth/day10/day10.go new file mode 100644 index 0000000..ef1dda7 --- /dev/null +++ b/2024/gareth/day10/day10.go @@ -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 +} diff --git a/2024/gareth/day10/day10_test.go b/2024/gareth/day10/day10_test.go new file mode 100644 index 0000000..547889b --- /dev/null +++ b/2024/gareth/day10/day10_test.go @@ -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) +} diff --git a/2024/gareth/day10/input.txt b/2024/gareth/day10/input.txt new file mode 100644 index 0000000..a6f2793 --- /dev/null +++ b/2024/gareth/day10/input.txt @@ -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 \ No newline at end of file diff --git a/2024/gareth/day11/day11.go b/2024/gareth/day11/day11.go new file mode 100644 index 0000000..4876cac --- /dev/null +++ b/2024/gareth/day11/day11.go @@ -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 +} diff --git a/2024/gareth/day11/day11_test.go b/2024/gareth/day11/day11_test.go new file mode 100644 index 0000000..56c3825 --- /dev/null +++ b/2024/gareth/day11/day11_test.go @@ -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) +} diff --git a/2024/gareth/day11/input.txt b/2024/gareth/day11/input.txt new file mode 100644 index 0000000..ae72b37 --- /dev/null +++ b/2024/gareth/day11/input.txt @@ -0,0 +1 @@ +965842 9159 3372473 311 0 6 86213 48 \ No newline at end of file diff --git a/2024/gareth/day13/day13.go b/2024/gareth/day13/day13.go new file mode 100644 index 0000000..3d038b1 --- /dev/null +++ b/2024/gareth/day13/day13.go @@ -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 +} diff --git a/2024/gareth/day13/day13_test.go b/2024/gareth/day13/day13_test.go new file mode 100644 index 0000000..209a74f --- /dev/null +++ b/2024/gareth/day13/day13_test.go @@ -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) +} diff --git a/2024/gareth/day13/input.txt b/2024/gareth/day13/input.txt new file mode 100644 index 0000000..ad39ae5 --- /dev/null +++ b/2024/gareth/day13/input.txt @@ -0,0 +1,1279 @@ +Button A: X+54, Y+22 +Button B: X+36, Y+62 +Prize: X=19754, Y=14184 + +Button A: X+20, Y+68 +Button B: X+34, Y+13 +Prize: X=15660, Y=15792 + +Button A: X+63, Y+17 +Button B: X+11, Y+28 +Prize: X=2658, Y=11605 + +Button A: X+15, Y+56 +Button B: X+74, Y+29 +Prize: X=9393, Y=11622 + +Button A: X+34, Y+97 +Button B: X+83, Y+35 +Prize: X=3876, Y=4197 + +Button A: X+14, Y+62 +Button B: X+75, Y+27 +Prize: X=12989, Y=4061 + +Button A: X+46, Y+17 +Button B: X+15, Y+54 +Prize: X=15841, Y=336 + +Button A: X+19, Y+61 +Button B: X+69, Y+12 +Prize: X=204, Y=7413 + +Button A: X+34, Y+14 +Button B: X+29, Y+40 +Prize: X=2353, Y=10368 + +Button A: X+64, Y+32 +Button B: X+25, Y+48 +Prize: X=3273, Y=304 + +Button A: X+18, Y+60 +Button B: X+66, Y+30 +Prize: X=11594, Y=2330 + +Button A: X+65, Y+47 +Button B: X+11, Y+29 +Prize: X=4677, Y=195 + +Button A: X+13, Y+23 +Button B: X+42, Y+14 +Prize: X=7115, Y=12417 + +Button A: X+81, Y+55 +Button B: X+26, Y+93 +Prize: X=2703, Y=5678 + +Button A: X+50, Y+96 +Button B: X+74, Y+20 +Prize: X=8694, Y=9856 + +Button A: X+19, Y+54 +Button B: X+74, Y+36 +Prize: X=6145, Y=9170 + +Button A: X+45, Y+76 +Button B: X+43, Y+15 +Prize: X=4194, Y=5627 + +Button A: X+28, Y+91 +Button B: X+94, Y+48 +Prize: X=2282, Y=2009 + +Button A: X+70, Y+35 +Button B: X+33, Y+83 +Prize: X=4786, Y=3856 + +Button A: X+14, Y+89 +Button B: X+38, Y+40 +Prize: X=2186, Y=3415 + +Button A: X+55, Y+19 +Button B: X+43, Y+79 +Prize: X=4737, Y=2757 + +Button A: X+32, Y+76 +Button B: X+60, Y+17 +Prize: X=11124, Y=5467 + +Button A: X+33, Y+62 +Button B: X+50, Y+21 +Prize: X=4940, Y=12625 + +Button A: X+56, Y+14 +Button B: X+48, Y+92 +Prize: X=2888, Y=962 + +Button A: X+14, Y+58 +Button B: X+83, Y+30 +Prize: X=6249, Y=5488 + +Button A: X+47, Y+83 +Button B: X+47, Y+11 +Prize: X=7153, Y=15685 + +Button A: X+35, Y+68 +Button B: X+52, Y+16 +Prize: X=12241, Y=14956 + +Button A: X+46, Y+72 +Button B: X+56, Y+25 +Prize: X=6054, Y=4401 + +Button A: X+35, Y+57 +Button B: X+43, Y+14 +Prize: X=10516, Y=12390 + +Button A: X+29, Y+56 +Button B: X+41, Y+25 +Prize: X=6288, Y=2319 + +Button A: X+73, Y+19 +Button B: X+59, Y+86 +Prize: X=9965, Y=8669 + +Button A: X+13, Y+43 +Button B: X+49, Y+13 +Prize: X=12137, Y=19559 + +Button A: X+17, Y+65 +Button B: X+67, Y+22 +Prize: X=1910, Y=15266 + +Button A: X+55, Y+27 +Button B: X+11, Y+43 +Prize: X=7767, Y=5007 + +Button A: X+26, Y+18 +Button B: X+35, Y+94 +Prize: X=4719, Y=9616 + +Button A: X+37, Y+81 +Button B: X+58, Y+13 +Prize: X=11010, Y=1876 + +Button A: X+66, Y+43 +Button B: X+17, Y+88 +Prize: X=6227, Y=5057 + +Button A: X+36, Y+66 +Button B: X+61, Y+31 +Prize: X=1642, Y=10702 + +Button A: X+54, Y+17 +Button B: X+15, Y+50 +Prize: X=17444, Y=2332 + +Button A: X+33, Y+74 +Button B: X+47, Y+16 +Prize: X=1127, Y=13206 + +Button A: X+45, Y+93 +Button B: X+84, Y+43 +Prize: X=9867, Y=10858 + +Button A: X+35, Y+99 +Button B: X+64, Y+33 +Prize: X=3780, Y=5511 + +Button A: X+29, Y+62 +Button B: X+46, Y+24 +Prize: X=14412, Y=6932 + +Button A: X+91, Y+18 +Button B: X+21, Y+20 +Prize: X=9303, Y=2474 + +Button A: X+61, Y+34 +Button B: X+30, Y+75 +Prize: X=6835, Y=7015 + +Button A: X+32, Y+82 +Button B: X+46, Y+12 +Prize: X=7126, Y=14580 + +Button A: X+30, Y+47 +Button B: X+36, Y+11 +Prize: X=13922, Y=14563 + +Button A: X+79, Y+39 +Button B: X+12, Y+43 +Prize: X=15040, Y=13839 + +Button A: X+15, Y+14 +Button B: X+20, Y+81 +Prize: X=1075, Y=1502 + +Button A: X+35, Y+80 +Button B: X+45, Y+11 +Prize: X=10380, Y=11870 + +Button A: X+50, Y+36 +Button B: X+21, Y+58 +Prize: X=4389, Y=3546 + +Button A: X+31, Y+95 +Button B: X+60, Y+14 +Prize: X=5432, Y=4076 + +Button A: X+96, Y+20 +Button B: X+64, Y+77 +Prize: X=3424, Y=2687 + +Button A: X+15, Y+51 +Button B: X+60, Y+26 +Prize: X=1505, Y=19741 + +Button A: X+37, Y+12 +Button B: X+33, Y+78 +Prize: X=10344, Y=13604 + +Button A: X+70, Y+93 +Button B: X+84, Y+21 +Prize: X=9184, Y=8034 + +Button A: X+33, Y+85 +Button B: X+99, Y+59 +Prize: X=4356, Y=2988 + +Button A: X+26, Y+27 +Button B: X+13, Y+60 +Prize: X=1105, Y=3240 + +Button A: X+55, Y+31 +Button B: X+21, Y+46 +Prize: X=7181, Y=11070 + +Button A: X+20, Y+54 +Button B: X+41, Y+32 +Prize: X=2979, Y=3400 + +Button A: X+35, Y+19 +Button B: X+33, Y+60 +Prize: X=10334, Y=11024 + +Button A: X+84, Y+21 +Button B: X+29, Y+79 +Prize: X=9575, Y=6340 + +Button A: X+58, Y+24 +Button B: X+15, Y+64 +Prize: X=10518, Y=6264 + +Button A: X+41, Y+12 +Button B: X+45, Y+69 +Prize: X=10120, Y=8966 + +Button A: X+87, Y+28 +Button B: X+14, Y+67 +Prize: X=6242, Y=6571 + +Button A: X+12, Y+28 +Button B: X+65, Y+24 +Prize: X=1515, Y=12044 + +Button A: X+85, Y+24 +Button B: X+29, Y+37 +Prize: X=7600, Y=2434 + +Button A: X+34, Y+92 +Button B: X+94, Y+69 +Prize: X=9882, Y=12282 + +Button A: X+11, Y+37 +Button B: X+23, Y+12 +Prize: X=848, Y=8448 + +Button A: X+52, Y+28 +Button B: X+33, Y+63 +Prize: X=3429, Y=6843 + +Button A: X+57, Y+13 +Button B: X+56, Y+55 +Prize: X=4314, Y=1744 + +Button A: X+81, Y+24 +Button B: X+12, Y+59 +Prize: X=13487, Y=6933 + +Button A: X+72, Y+50 +Button B: X+15, Y+40 +Prize: X=8927, Y=9290 + +Button A: X+68, Y+27 +Button B: X+16, Y+30 +Prize: X=2728, Y=2904 + +Button A: X+66, Y+13 +Button B: X+54, Y+65 +Prize: X=6060, Y=1846 + +Button A: X+56, Y+86 +Button B: X+88, Y+44 +Prize: X=5840, Y=4138 + +Button A: X+44, Y+80 +Button B: X+46, Y+15 +Prize: X=15084, Y=8430 + +Button A: X+50, Y+18 +Button B: X+13, Y+60 +Prize: X=6386, Y=6944 + +Button A: X+15, Y+63 +Button B: X+67, Y+14 +Prize: X=12210, Y=802 + +Button A: X+22, Y+65 +Button B: X+65, Y+33 +Prize: X=2817, Y=4983 + +Button A: X+23, Y+37 +Button B: X+51, Y+11 +Prize: X=4351, Y=1387 + +Button A: X+58, Y+39 +Button B: X+14, Y+50 +Prize: X=2678, Y=3343 + +Button A: X+13, Y+80 +Button B: X+65, Y+68 +Prize: X=4784, Y=5536 + +Button A: X+47, Y+93 +Button B: X+84, Y+33 +Prize: X=5496, Y=3948 + +Button A: X+51, Y+13 +Button B: X+21, Y+58 +Prize: X=13064, Y=14007 + +Button A: X+38, Y+22 +Button B: X+12, Y+26 +Prize: X=1962, Y=11422 + +Button A: X+51, Y+13 +Button B: X+34, Y+62 +Prize: X=13062, Y=2106 + +Button A: X+31, Y+11 +Button B: X+44, Y+78 +Prize: X=4550, Y=7654 + +Button A: X+97, Y+27 +Button B: X+48, Y+63 +Prize: X=10321, Y=3816 + +Button A: X+59, Y+17 +Button B: X+27, Y+78 +Prize: X=978, Y=18744 + +Button A: X+68, Y+27 +Button B: X+25, Y+64 +Prize: X=2115, Y=1002 + +Button A: X+19, Y+33 +Button B: X+91, Y+19 +Prize: X=7873, Y=2689 + +Button A: X+39, Y+96 +Button B: X+47, Y+16 +Prize: X=5548, Y=8672 + +Button A: X+58, Y+11 +Button B: X+20, Y+80 +Prize: X=4668, Y=4086 + +Button A: X+13, Y+33 +Button B: X+56, Y+14 +Prize: X=3696, Y=1396 + +Button A: X+21, Y+45 +Button B: X+34, Y+13 +Prize: X=15420, Y=12003 + +Button A: X+12, Y+22 +Button B: X+77, Y+27 +Prize: X=2487, Y=1477 + +Button A: X+58, Y+89 +Button B: X+70, Y+19 +Prize: X=5774, Y=1787 + +Button A: X+25, Y+63 +Button B: X+53, Y+13 +Prize: X=13823, Y=19135 + +Button A: X+45, Y+36 +Button B: X+34, Y+99 +Prize: X=6416, Y=9369 + +Button A: X+81, Y+35 +Button B: X+18, Y+50 +Prize: X=4203, Y=5025 + +Button A: X+81, Y+28 +Button B: X+12, Y+58 +Prize: X=2592, Y=5258 + +Button A: X+57, Y+21 +Button B: X+19, Y+67 +Prize: X=19310, Y=9410 + +Button A: X+62, Y+48 +Button B: X+25, Y+84 +Prize: X=1505, Y=2652 + +Button A: X+98, Y+18 +Button B: X+20, Y+26 +Prize: X=9334, Y=1960 + +Button A: X+23, Y+42 +Button B: X+33, Y+13 +Prize: X=11779, Y=4858 + +Button A: X+12, Y+36 +Button B: X+75, Y+39 +Prize: X=4355, Y=8495 + +Button A: X+20, Y+34 +Button B: X+37, Y+18 +Prize: X=10274, Y=2754 + +Button A: X+89, Y+26 +Button B: X+18, Y+44 +Prize: X=4524, Y=1864 + +Button A: X+11, Y+36 +Button B: X+53, Y+21 +Prize: X=18093, Y=17453 + +Button A: X+48, Y+22 +Button B: X+47, Y+74 +Prize: X=8784, Y=8868 + +Button A: X+29, Y+53 +Button B: X+45, Y+16 +Prize: X=12465, Y=10268 + +Button A: X+47, Y+82 +Button B: X+65, Y+19 +Prize: X=4989, Y=3984 + +Button A: X+98, Y+36 +Button B: X+52, Y+96 +Prize: X=1610, Y=1668 + +Button A: X+31, Y+75 +Button B: X+63, Y+26 +Prize: X=1468, Y=2161 + +Button A: X+14, Y+66 +Button B: X+47, Y+14 +Prize: X=5961, Y=12456 + +Button A: X+20, Y+87 +Button B: X+70, Y+44 +Prize: X=1740, Y=3922 + +Button A: X+52, Y+21 +Button B: X+16, Y+43 +Prize: X=3884, Y=7457 + +Button A: X+93, Y+97 +Button B: X+91, Y+20 +Prize: X=2827, Y=851 + +Button A: X+68, Y+15 +Button B: X+23, Y+63 +Prize: X=10422, Y=7157 + +Button A: X+84, Y+68 +Button B: X+22, Y+86 +Prize: X=2696, Y=2728 + +Button A: X+67, Y+34 +Button B: X+40, Y+83 +Prize: X=5256, Y=5865 + +Button A: X+34, Y+49 +Button B: X+97, Y+12 +Prize: X=3687, Y=1352 + +Button A: X+15, Y+90 +Button B: X+89, Y+21 +Prize: X=7432, Y=2013 + +Button A: X+41, Y+13 +Button B: X+12, Y+50 +Prize: X=7134, Y=14486 + +Button A: X+20, Y+28 +Button B: X+32, Y+13 +Prize: X=10032, Y=19165 + +Button A: X+27, Y+77 +Button B: X+69, Y+13 +Prize: X=9554, Y=15260 + +Button A: X+47, Y+23 +Button B: X+32, Y+54 +Prize: X=6409, Y=355 + +Button A: X+56, Y+81 +Button B: X+64, Y+16 +Prize: X=7600, Y=5786 + +Button A: X+46, Y+17 +Button B: X+37, Y+66 +Prize: X=7509, Y=14295 + +Button A: X+18, Y+33 +Button B: X+64, Y+36 +Prize: X=16814, Y=12887 + +Button A: X+22, Y+79 +Button B: X+92, Y+31 +Prize: X=3856, Y=5165 + +Button A: X+43, Y+12 +Button B: X+30, Y+74 +Prize: X=1825, Y=17414 + +Button A: X+74, Y+49 +Button B: X+28, Y+70 +Prize: X=6646, Y=9135 + +Button A: X+85, Y+14 +Button B: X+12, Y+79 +Prize: X=1124, Y=3340 + +Button A: X+60, Y+31 +Button B: X+11, Y+44 +Prize: X=14996, Y=12846 + +Button A: X+62, Y+17 +Button B: X+12, Y+54 +Prize: X=17176, Y=5908 + +Button A: X+73, Y+54 +Button B: X+21, Y+91 +Prize: X=4258, Y=4810 + +Button A: X+32, Y+57 +Button B: X+36, Y+11 +Prize: X=412, Y=2137 + +Button A: X+80, Y+65 +Button B: X+12, Y+63 +Prize: X=2060, Y=5135 + +Button A: X+38, Y+19 +Button B: X+11, Y+30 +Prize: X=2771, Y=8832 + +Button A: X+12, Y+63 +Button B: X+89, Y+94 +Prize: X=2441, Y=3484 + +Button A: X+64, Y+42 +Button B: X+19, Y+44 +Prize: X=10186, Y=11248 + +Button A: X+21, Y+47 +Button B: X+81, Y+42 +Prize: X=6363, Y=4491 + +Button A: X+55, Y+70 +Button B: X+90, Y+13 +Prize: X=7855, Y=6037 + +Button A: X+39, Y+78 +Button B: X+53, Y+19 +Prize: X=19180, Y=483 + +Button A: X+11, Y+77 +Button B: X+74, Y+17 +Prize: X=6027, Y=1608 + +Button A: X+71, Y+34 +Button B: X+20, Y+54 +Prize: X=1962, Y=12986 + +Button A: X+19, Y+50 +Button B: X+57, Y+25 +Prize: X=19082, Y=12150 + +Button A: X+54, Y+19 +Button B: X+13, Y+31 +Prize: X=1754, Y=19209 + +Button A: X+77, Y+15 +Button B: X+17, Y+98 +Prize: X=7856, Y=7117 + +Button A: X+86, Y+35 +Button B: X+18, Y+85 +Prize: X=6694, Y=6375 + +Button A: X+14, Y+62 +Button B: X+63, Y+41 +Prize: X=1330, Y=4938 + +Button A: X+92, Y+51 +Button B: X+38, Y+74 +Prize: X=6240, Y=8435 + +Button A: X+14, Y+20 +Button B: X+86, Y+27 +Prize: X=4106, Y=2319 + +Button A: X+54, Y+17 +Button B: X+36, Y+69 +Prize: X=6488, Y=2762 + +Button A: X+82, Y+96 +Button B: X+82, Y+15 +Prize: X=4592, Y=2460 + +Button A: X+14, Y+65 +Button B: X+71, Y+24 +Prize: X=9947, Y=3249 + +Button A: X+33, Y+54 +Button B: X+23, Y+11 +Prize: X=7043, Y=12653 + +Button A: X+35, Y+12 +Button B: X+16, Y+47 +Prize: X=7136, Y=7027 + +Button A: X+11, Y+26 +Button B: X+39, Y+20 +Prize: X=8298, Y=1518 + +Button A: X+50, Y+12 +Button B: X+13, Y+23 +Prize: X=1816, Y=2066 + +Button A: X+17, Y+38 +Button B: X+63, Y+40 +Prize: X=9007, Y=7834 + +Button A: X+55, Y+19 +Button B: X+11, Y+28 +Prize: X=14257, Y=9219 + +Button A: X+55, Y+18 +Button B: X+11, Y+69 +Prize: X=1343, Y=5285 + +Button A: X+19, Y+53 +Button B: X+74, Y+28 +Prize: X=2560, Y=1920 + +Button A: X+12, Y+59 +Button B: X+39, Y+14 +Prize: X=5354, Y=317 + +Button A: X+72, Y+14 +Button B: X+91, Y+86 +Prize: X=9387, Y=7358 + +Button A: X+18, Y+84 +Button B: X+54, Y+48 +Prize: X=3852, Y=6960 + +Button A: X+12, Y+69 +Button B: X+57, Y+12 +Prize: X=6488, Y=7169 + +Button A: X+15, Y+30 +Button B: X+42, Y+15 +Prize: X=12671, Y=10775 + +Button A: X+25, Y+12 +Button B: X+34, Y+96 +Prize: X=2435, Y=6348 + +Button A: X+29, Y+12 +Button B: X+40, Y+66 +Prize: X=1315, Y=17804 + +Button A: X+69, Y+26 +Button B: X+22, Y+56 +Prize: X=6670, Y=4708 + +Button A: X+19, Y+42 +Button B: X+62, Y+21 +Prize: X=2458, Y=16769 + +Button A: X+45, Y+17 +Button B: X+23, Y+38 +Prize: X=5151, Y=19084 + +Button A: X+17, Y+33 +Button B: X+35, Y+14 +Prize: X=14888, Y=18170 + +Button A: X+74, Y+36 +Button B: X+14, Y+57 +Prize: X=14816, Y=15158 + +Button A: X+36, Y+14 +Button B: X+32, Y+60 +Prize: X=3368, Y=15472 + +Button A: X+85, Y+19 +Button B: X+83, Y+89 +Prize: X=10387, Y=4717 + +Button A: X+55, Y+18 +Button B: X+37, Y+68 +Prize: X=16050, Y=14820 + +Button A: X+52, Y+21 +Button B: X+15, Y+49 +Prize: X=4037, Y=6619 + +Button A: X+75, Y+11 +Button B: X+11, Y+51 +Prize: X=19531, Y=6083 + +Button A: X+90, Y+21 +Button B: X+29, Y+38 +Prize: X=10125, Y=3768 + +Button A: X+33, Y+70 +Button B: X+45, Y+20 +Prize: X=4805, Y=17590 + +Button A: X+11, Y+28 +Button B: X+58, Y+33 +Prize: X=4190, Y=18722 + +Button A: X+95, Y+50 +Button B: X+16, Y+70 +Prize: X=3754, Y=2530 + +Button A: X+88, Y+19 +Button B: X+35, Y+84 +Prize: X=7511, Y=3227 + +Button A: X+48, Y+12 +Button B: X+11, Y+31 +Prize: X=9355, Y=19551 + +Button A: X+71, Y+40 +Button B: X+39, Y+96 +Prize: X=9850, Y=12656 + +Button A: X+18, Y+46 +Button B: X+69, Y+53 +Prize: X=1584, Y=3308 + +Button A: X+65, Y+26 +Button B: X+62, Y+89 +Prize: X=7671, Y=5829 + +Button A: X+92, Y+51 +Button B: X+19, Y+41 +Prize: X=4806, Y=5650 + +Button A: X+26, Y+98 +Button B: X+50, Y+39 +Prize: X=6268, Y=10174 + +Button A: X+16, Y+64 +Button B: X+34, Y+12 +Prize: X=16854, Y=11364 + +Button A: X+20, Y+69 +Button B: X+61, Y+23 +Prize: X=408, Y=12175 + +Button A: X+49, Y+16 +Button B: X+11, Y+45 +Prize: X=17005, Y=1724 + +Button A: X+82, Y+15 +Button B: X+92, Y+80 +Prize: X=15178, Y=8525 + +Button A: X+98, Y+17 +Button B: X+32, Y+95 +Prize: X=4930, Y=5596 + +Button A: X+74, Y+24 +Button B: X+63, Y+72 +Prize: X=4818, Y=1872 + +Button A: X+63, Y+23 +Button B: X+29, Y+74 +Prize: X=4610, Y=2155 + +Button A: X+14, Y+69 +Button B: X+46, Y+16 +Prize: X=5686, Y=14981 + +Button A: X+12, Y+44 +Button B: X+73, Y+32 +Prize: X=1404, Y=2320 + +Button A: X+16, Y+61 +Button B: X+36, Y+16 +Prize: X=19784, Y=1294 + +Button A: X+79, Y+17 +Button B: X+11, Y+57 +Prize: X=18419, Y=19769 + +Button A: X+27, Y+61 +Button B: X+32, Y+16 +Prize: X=11215, Y=8185 + +Button A: X+80, Y+14 +Button B: X+55, Y+94 +Prize: X=6715, Y=3622 + +Button A: X+13, Y+99 +Button B: X+67, Y+60 +Prize: X=1132, Y=5469 + +Button A: X+11, Y+64 +Button B: X+68, Y+52 +Prize: X=1359, Y=3096 + +Button A: X+16, Y+40 +Button B: X+60, Y+34 +Prize: X=4712, Y=2220 + +Button A: X+50, Y+11 +Button B: X+12, Y+60 +Prize: X=15794, Y=4259 + +Button A: X+38, Y+17 +Button B: X+29, Y+54 +Prize: X=1335, Y=6160 + +Button A: X+36, Y+59 +Button B: X+93, Y+32 +Prize: X=6990, Y=6880 + +Button A: X+29, Y+97 +Button B: X+62, Y+55 +Prize: X=3255, Y=5097 + +Button A: X+25, Y+21 +Button B: X+22, Y+73 +Prize: X=3307, Y=5831 + +Button A: X+15, Y+75 +Button B: X+87, Y+82 +Prize: X=2655, Y=6215 + +Button A: X+22, Y+82 +Button B: X+74, Y+39 +Prize: X=4198, Y=6648 + +Button A: X+41, Y+61 +Button B: X+36, Y+11 +Prize: X=7347, Y=17092 + +Button A: X+82, Y+51 +Button B: X+19, Y+60 +Prize: X=1729, Y=1509 + +Button A: X+43, Y+13 +Button B: X+49, Y+76 +Prize: X=8520, Y=7788 + +Button A: X+97, Y+24 +Button B: X+46, Y+51 +Prize: X=1349, Y=1245 + +Button A: X+84, Y+38 +Button B: X+13, Y+51 +Prize: X=10408, Y=4606 + +Button A: X+48, Y+97 +Button B: X+80, Y+28 +Prize: X=9584, Y=8808 + +Button A: X+13, Y+32 +Button B: X+76, Y+43 +Prize: X=16226, Y=18495 + +Button A: X+14, Y+33 +Button B: X+78, Y+54 +Prize: X=1852, Y=2028 + +Button A: X+11, Y+30 +Button B: X+73, Y+37 +Prize: X=7433, Y=18454 + +Button A: X+23, Y+56 +Button B: X+31, Y+16 +Prize: X=12525, Y=3816 + +Button A: X+55, Y+16 +Button B: X+21, Y+68 +Prize: X=16009, Y=16852 + +Button A: X+17, Y+47 +Button B: X+76, Y+37 +Prize: X=6637, Y=12724 + +Button A: X+74, Y+88 +Button B: X+59, Y+12 +Prize: X=9928, Y=6688 + +Button A: X+26, Y+87 +Button B: X+32, Y+21 +Prize: X=1790, Y=3063 + +Button A: X+25, Y+71 +Button B: X+56, Y+19 +Prize: X=1849, Y=5946 + +Button A: X+51, Y+76 +Button B: X+59, Y+28 +Prize: X=7997, Y=6644 + +Button A: X+53, Y+28 +Button B: X+32, Y+62 +Prize: X=5323, Y=6228 + +Button A: X+33, Y+69 +Button B: X+39, Y+18 +Prize: X=575, Y=13307 + +Button A: X+93, Y+15 +Button B: X+56, Y+55 +Prize: X=7024, Y=3845 + +Button A: X+21, Y+53 +Button B: X+68, Y+24 +Prize: X=5268, Y=7924 + +Button A: X+13, Y+51 +Button B: X+78, Y+27 +Prize: X=15733, Y=10982 + +Button A: X+12, Y+79 +Button B: X+50, Y+11 +Prize: X=7094, Y=2854 + +Button A: X+21, Y+83 +Button B: X+90, Y+69 +Prize: X=2607, Y=5143 + +Button A: X+94, Y+16 +Button B: X+25, Y+54 +Prize: X=10271, Y=6474 + +Button A: X+80, Y+14 +Button B: X+12, Y+69 +Prize: X=15888, Y=10392 + +Button A: X+58, Y+37 +Button B: X+15, Y+54 +Prize: X=1422, Y=3573 + +Button A: X+13, Y+28 +Button B: X+59, Y+29 +Prize: X=2235, Y=12810 + +Button A: X+11, Y+32 +Button B: X+58, Y+13 +Prize: X=438, Y=6564 + +Button A: X+14, Y+72 +Button B: X+93, Y+84 +Prize: X=4137, Y=7476 + +Button A: X+63, Y+29 +Button B: X+27, Y+54 +Prize: X=4319, Y=1669 + +Button A: X+86, Y+28 +Button B: X+30, Y+60 +Prize: X=5710, Y=2060 + +Button A: X+15, Y+54 +Button B: X+52, Y+19 +Prize: X=9815, Y=1199 + +Button A: X+24, Y+63 +Button B: X+57, Y+20 +Prize: X=16160, Y=12588 + +Button A: X+19, Y+37 +Button B: X+57, Y+33 +Prize: X=2324, Y=15332 + +Button A: X+25, Y+14 +Button B: X+31, Y+56 +Prize: X=7136, Y=17336 + +Button A: X+66, Y+29 +Button B: X+25, Y+57 +Prize: X=13681, Y=16936 + +Button A: X+36, Y+93 +Button B: X+84, Y+56 +Prize: X=6720, Y=11242 + +Button A: X+92, Y+41 +Button B: X+18, Y+96 +Prize: X=1396, Y=1150 + +Button A: X+12, Y+38 +Button B: X+63, Y+28 +Prize: X=19403, Y=12776 + +Button A: X+72, Y+28 +Button B: X+13, Y+37 +Prize: X=5137, Y=3113 + +Button A: X+90, Y+72 +Button B: X+91, Y+13 +Prize: X=5795, Y=2543 + +Button A: X+28, Y+13 +Button B: X+31, Y+49 +Prize: X=16418, Y=9287 + +Button A: X+17, Y+33 +Button B: X+64, Y+32 +Prize: X=11422, Y=2206 + +Button A: X+71, Y+22 +Button B: X+16, Y+45 +Prize: X=2918, Y=7791 + +Button A: X+15, Y+36 +Button B: X+55, Y+35 +Prize: X=7930, Y=7704 + +Button A: X+57, Y+65 +Button B: X+95, Y+17 +Prize: X=11818, Y=4800 + +Button A: X+22, Y+46 +Button B: X+33, Y+21 +Prize: X=1232, Y=1040 + +Button A: X+34, Y+98 +Button B: X+85, Y+39 +Prize: X=7582, Y=9494 + +Button A: X+63, Y+15 +Button B: X+15, Y+47 +Prize: X=13439, Y=17391 + +Button A: X+20, Y+41 +Button B: X+38, Y+23 +Prize: X=2052, Y=10086 + +Button A: X+14, Y+66 +Button B: X+84, Y+28 +Prize: X=16902, Y=10730 + +Button A: X+27, Y+12 +Button B: X+17, Y+43 +Prize: X=9367, Y=12201 + +Button A: X+30, Y+49 +Button B: X+40, Y+20 +Prize: X=8430, Y=10049 + +Button A: X+82, Y+22 +Button B: X+46, Y+97 +Prize: X=3798, Y=4236 + +Button A: X+56, Y+55 +Button B: X+94, Y+13 +Prize: X=6522, Y=5533 + +Button A: X+39, Y+41 +Button B: X+59, Y+16 +Prize: X=4261, Y=3559 + +Button A: X+59, Y+18 +Button B: X+11, Y+63 +Prize: X=15316, Y=10169 + +Button A: X+59, Y+55 +Button B: X+20, Y+98 +Prize: X=375, Y=667 + +Button A: X+11, Y+93 +Button B: X+64, Y+67 +Prize: X=6699, Y=14917 + +Button A: X+13, Y+46 +Button B: X+48, Y+15 +Prize: X=1661, Y=1232 + +Button A: X+36, Y+99 +Button B: X+85, Y+42 +Prize: X=2224, Y=3048 + +Button A: X+11, Y+75 +Button B: X+28, Y+22 +Prize: X=2614, Y=6168 + +Button A: X+21, Y+97 +Button B: X+94, Y+81 +Prize: X=7763, Y=8662 + +Button A: X+34, Y+13 +Button B: X+26, Y+42 +Prize: X=8612, Y=15869 + +Button A: X+39, Y+71 +Button B: X+31, Y+13 +Prize: X=19737, Y=5345 + +Button A: X+21, Y+60 +Button B: X+75, Y+30 +Prize: X=10448, Y=18140 + +Button A: X+24, Y+49 +Button B: X+47, Y+17 +Prize: X=7371, Y=12446 + +Button A: X+56, Y+86 +Button B: X+94, Y+41 +Prize: X=3570, Y=4759 + +Button A: X+14, Y+50 +Button B: X+54, Y+28 +Prize: X=19392, Y=1330 + +Button A: X+20, Y+67 +Button B: X+52, Y+13 +Prize: X=1000, Y=3692 + +Button A: X+14, Y+26 +Button B: X+50, Y+21 +Prize: X=7114, Y=9374 + +Button A: X+19, Y+55 +Button B: X+39, Y+16 +Prize: X=15710, Y=8361 + +Button A: X+56, Y+14 +Button B: X+63, Y+96 +Prize: X=4851, Y=3540 + +Button A: X+33, Y+67 +Button B: X+54, Y+24 +Prize: X=5447, Y=1189 + +Button A: X+39, Y+84 +Button B: X+89, Y+24 +Prize: X=10312, Y=8292 + +Button A: X+51, Y+19 +Button B: X+53, Y+74 +Prize: X=4001, Y=3498 + +Button A: X+67, Y+43 +Button B: X+11, Y+36 +Prize: X=4764, Y=9202 + +Button A: X+21, Y+62 +Button B: X+54, Y+22 +Prize: X=4434, Y=2234 + +Button A: X+89, Y+87 +Button B: X+24, Y+88 +Prize: X=6501, Y=7323 + +Button A: X+54, Y+29 +Button B: X+28, Y+51 +Prize: X=13224, Y=17258 + +Button A: X+62, Y+45 +Button B: X+39, Y+94 +Prize: X=4796, Y=9262 + +Button A: X+45, Y+23 +Button B: X+12, Y+52 +Prize: X=11084, Y=11636 + +Button A: X+22, Y+37 +Button B: X+48, Y+25 +Prize: X=5514, Y=11182 + +Button A: X+15, Y+38 +Button B: X+75, Y+39 +Prize: X=16520, Y=17711 + +Button A: X+78, Y+11 +Button B: X+49, Y+92 +Prize: X=9365, Y=6341 + +Button A: X+98, Y+14 +Button B: X+13, Y+64 +Prize: X=5741, Y=2498 + +Button A: X+13, Y+63 +Button B: X+61, Y+20 +Prize: X=13770, Y=14824 + +Button A: X+21, Y+38 +Button B: X+62, Y+37 +Prize: X=17864, Y=15513 + +Button A: X+24, Y+21 +Button B: X+15, Y+62 +Prize: X=1476, Y=4224 + +Button A: X+16, Y+75 +Button B: X+52, Y+12 +Prize: X=468, Y=8849 + +Button A: X+14, Y+41 +Button B: X+46, Y+22 +Prize: X=2040, Y=1353 + +Button A: X+49, Y+16 +Button B: X+29, Y+54 +Prize: X=10446, Y=18614 + +Button A: X+11, Y+69 +Button B: X+75, Y+18 +Prize: X=10963, Y=2327 + +Button A: X+37, Y+64 +Button B: X+47, Y+20 +Prize: X=18201, Y=3324 + +Button A: X+99, Y+14 +Button B: X+87, Y+75 +Prize: X=14862, Y=6177 + +Button A: X+12, Y+58 +Button B: X+82, Y+33 +Prize: X=7438, Y=6507 + +Button A: X+72, Y+13 +Button B: X+13, Y+79 +Prize: X=14160, Y=11952 + +Button A: X+24, Y+55 +Button B: X+73, Y+39 +Prize: X=12196, Y=4761 + +Button A: X+47, Y+28 +Button B: X+21, Y+52 +Prize: X=969, Y=9732 + +Button A: X+57, Y+29 +Button B: X+15, Y+30 +Prize: X=17750, Y=13700 + +Button A: X+40, Y+23 +Button B: X+13, Y+26 +Prize: X=13248, Y=14881 + +Button A: X+68, Y+13 +Button B: X+85, Y+90 +Prize: X=9707, Y=6207 + +Button A: X+47, Y+23 +Button B: X+19, Y+57 +Prize: X=2226, Y=13254 \ No newline at end of file diff --git a/2024/gareth/day14/day14.go b/2024/gareth/day14/day14.go new file mode 100644 index 0000000..d16f089 --- /dev/null +++ b/2024/gareth/day14/day14.go @@ -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 +} diff --git a/2024/gareth/day14/day14_test.go b/2024/gareth/day14/day14_test.go new file mode 100644 index 0000000..ebb51a5 --- /dev/null +++ b/2024/gareth/day14/day14_test.go @@ -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) +} diff --git a/2024/gareth/day14/input.txt b/2024/gareth/day14/input.txt new file mode 100644 index 0000000..e1a6d0a --- /dev/null +++ b/2024/gareth/day14/input.txt @@ -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 \ No newline at end of file diff --git a/2024/gareth/day18/day18.go b/2024/gareth/day18/day18.go new file mode 100644 index 0000000..ed76eb7 --- /dev/null +++ b/2024/gareth/day18/day18.go @@ -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] +} diff --git a/2024/gareth/day18/day18_test.go b/2024/gareth/day18/day18_test.go new file mode 100644 index 0000000..7a52d3b --- /dev/null +++ b/2024/gareth/day18/day18_test.go @@ -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) +} diff --git a/2024/gareth/day18/input.txt b/2024/gareth/day18/input.txt new file mode 100644 index 0000000..6265c77 --- /dev/null +++ b/2024/gareth/day18/input.txt @@ -0,0 +1,3450 @@ +44,51 +65,43 +65,40 +35,54 +66,67 +41,59 +55,55 +23,2 +45,57 +69,36 +34,53 +37,2 +38,1 +37,55 +41,67 +58,55 +3,26 +9,14 +5,28 +54,51 +56,69 +48,47 +46,53 +64,29 +61,56 +69,64 +45,7 +69,38 +39,54 +50,47 +27,14 +33,1 +67,50 +9,19 +56,57 +64,53 +15,21 +63,50 +3,42 +63,65 +43,52 +9,26 +59,31 +1,29 +30,59 +59,53 +13,0 +65,35 +5,24 +19,35 +47,9 +4,21 +24,11 +53,66 +35,2 +26,9 +56,51 +70,29 +69,56 +53,55 +69,67 +58,67 +8,9 +37,62 +55,9 +35,3 +69,35 +55,15 +59,69 +51,9 +61,5 +5,29 +66,45 +5,23 +63,37 +59,17 +69,55 +63,61 +17,18 +57,8 +15,17 +63,60 +53,61 +33,3 +67,68 +23,3 +9,20 +19,7 +1,5 +53,9 +68,47 +21,14 +32,13 +19,5 +6,19 +25,9 +43,58 +4,7 +25,16 +67,37 +0,29 +59,65 +47,55 +8,1 +11,19 +49,5 +57,48 +59,59 +65,39 +36,9 +43,5 +66,29 +55,54 +53,5 +1,35 +6,11 +68,31 +70,69 +20,21 +61,8 +65,46 +47,0 +49,41 +3,11 +30,25 +55,11 +29,4 +33,62 +15,13 +1,18 +1,37 +39,60 +65,53 +67,48 +67,49 +52,49 +25,3 +55,43 +0,21 +13,6 +41,53 +38,9 +17,17 +47,41 +41,6 +45,54 +56,17 +1,38 +6,23 +67,56 +2,11 +69,49 +1,33 +32,5 +41,50 +66,61 +5,21 +21,11 +3,29 +59,16 +49,55 +22,9 +34,1 +15,10 +57,3 +69,57 +18,3 +43,59 +24,15 +65,25 +53,11 +35,56 +39,12 +53,52 +65,30 +38,51 +25,7 +33,10 +63,36 +7,14 +5,25 +50,37 +51,5 +1,23 +53,6 +47,3 +61,41 +27,3 +61,26 +51,7 +39,61 +13,25 +1,31 +35,62 +50,43 +29,6 +53,15 +61,63 +45,5 +11,29 +27,6 +31,14 +55,41 +29,5 +5,5 +25,11 +61,35 +4,13 +34,17 +11,21 +69,69 +63,55 +50,45 +49,46 +1,13 +57,39 +63,47 +55,62 +37,61 +1,32 +7,30 +13,9 +51,47 +49,1 +19,23 +2,45 +51,62 +51,53 +57,63 +54,45 +47,58 +33,59 +3,37 +51,59 +39,3 +19,4 +61,60 +9,21 +67,69 +45,56 +53,57 +1,0 +23,13 +5,1 +27,7 +45,51 +56,45 +33,64 +56,13 +7,33 +20,13 +36,5 +57,55 +9,16 +57,65 +45,48 +47,48 +59,45 +65,29 +11,27 +55,67 +69,63 +17,2 +63,41 +10,27 +9,27 +69,47 +25,0 +57,51 +55,53 +65,48 +15,20 +43,9 +55,47 +62,37 +35,59 +22,17 +25,24 +18,7 +63,38 +40,63 +69,58 +59,43 +3,1 +34,7 +42,59 +41,51 +65,27 +7,21 +9,39 +51,49 +7,5 +25,2 +32,63 +8,3 +33,9 +54,9 +67,61 +67,38 +62,33 +17,1 +44,55 +2,27 +7,19 +2,47 +1,9 +7,9 +41,1 +39,10 +61,25 +35,61 +63,59 +21,13 +29,11 +58,51 +37,3 +17,12 +7,3 +7,29 +37,59 +65,69 +67,31 +19,13 +61,66 +23,9 +43,49 +50,9 +43,8 +61,64 +49,8 +15,2 +57,43 +23,15 +64,43 +39,52 +33,57 +8,29 +57,53 +11,6 +65,31 +65,67 +28,17 +9,31 +41,56 +22,1 +51,11 +66,69 +43,6 +1,19 +33,13 +53,41 +68,35 +43,3 +65,51 +44,3 +57,17 +61,12 +61,65 +44,1 +57,13 +13,10 +61,53 +9,15 +11,9 +29,12 +64,65 +45,41 +67,59 +55,12 +67,33 +56,41 +10,1 +5,14 +19,10 +53,43 +69,31 +3,21 +57,14 +37,47 +35,9 +10,5 +11,24 +66,41 +40,1 +59,39 +65,64 +63,70 +64,67 +13,35 +7,35 +4,11 +17,7 +43,60 +53,3 +32,55 +60,49 +39,48 +63,33 +7,6 +63,53 +69,37 +61,48 +45,45 +61,62 +16,7 +54,3 +13,11 +67,29 +47,59 +23,12 +32,3 +11,25 +63,63 +69,39 +29,7 +49,51 +62,43 +55,39 +3,51 +5,17 +45,3 +17,9 +13,1 +55,33 +47,2 +53,14 +13,19 +61,61 +1,39 +29,15 +5,35 +39,5 +1,1 +53,64 +47,56 +48,55 +59,67 +23,7 +59,63 +68,29 +31,13 +28,13 +30,3 +3,3 +31,17 +43,57 +51,4 +69,34 +3,47 +9,3 +69,54 +17,15 +61,34 +3,43 +39,9 +57,10 +58,43 +63,31 +52,55 +47,49 +25,6 +48,53 +38,57 +17,8 +63,69 +69,65 +50,7 +61,54 +63,67 +55,6 +65,52 +17,3 +51,51 +67,47 +57,5 +10,11 +57,41 +69,44 +29,61 +5,2 +9,11 +17,13 +52,45 +52,47 +57,15 +53,63 +1,7 +54,47 +7,16 +47,7 +9,1 +67,42 +39,1 +53,10 +41,69 +52,13 +57,60 +61,46 +67,60 +5,9 +54,61 +11,32 +55,68 +6,27 +26,3 +66,55 +49,66 +69,32 +61,3 +26,11 +5,44 +57,47 +3,19 +61,58 +12,11 +31,6 +11,34 +49,47 +68,41 +0,5 +61,38 +41,57 +68,45 +39,58 +1,10 +63,29 +55,59 +69,66 +9,24 +63,57 +65,54 +11,3 +48,5 +37,49 +40,7 +2,13 +57,31 +61,51 +33,58 +55,20 +49,53 +35,5 +67,43 +25,1 +61,13 +2,7 +6,9 +20,9 +5,7 +40,3 +7,13 +43,53 +67,65 +66,65 +37,57 +2,21 +13,17 +65,37 +13,3 +50,51 +31,10 +5,18 +35,7 +65,32 +7,26 +7,18 +11,8 +56,65 +65,58 +53,53 +55,44 +9,9 +13,8 +67,35 +38,7 +32,7 +69,29 +22,15 +58,63 +27,13 +29,10 +19,3 +62,67 +15,7 +57,59 +40,51 +61,47 +69,59 +31,19 +27,5 +59,11 +68,67 +15,5 +68,53 +44,43 +60,35 +61,11 +33,63 +40,47 +7,1 +39,51 +62,69 +18,11 +31,55 +44,59 +63,46 +67,67 +37,9 +3,28 +5,32 +11,18 +65,38 +16,21 +3,16 +55,45 +59,56 +66,35 +18,1 +11,11 +61,37 +9,13 +9,23 +48,43 +3,5 +8,19 +3,9 +13,5 +47,61 +5,43 +7,12 +39,55 +46,59 +31,9 +45,59 +27,4 +11,7 +17,5 +7,27 +12,15 +11,20 +12,3 +25,17 +2,3 +13,13 +64,57 +55,3 +3,4 +37,4 +31,3 +44,7 +51,65 +65,61 +69,52 +9,34 +25,5 +24,13 +59,57 +11,1 +3,30 +37,63 +22,21 +42,49 +7,25 +1,24 +39,59 +17,11 +14,13 +19,6 +61,40 +7,15 +13,7 +51,39 +47,57 +4,25 +1,45 +25,15 +9,7 +7,34 +48,11 +66,57 +57,7 +51,55 +57,61 +39,53 +14,1 +31,7 +59,66 +3,23 +41,49 +65,49 +68,39 +37,5 +49,50 +11,15 +59,33 +11,22 +15,4 +23,5 +39,63 +54,11 +21,3 +41,4 +30,63 +13,15 +5,13 +67,39 +61,14 +61,69 +61,42 +42,55 +49,3 +21,8 +23,10 +50,55 +59,35 +69,43 +6,29 +21,15 +45,1 +5,38 +54,15 +55,37 +5,15 +42,11 +46,5 +67,57 +60,13 +47,47 +63,39 +51,3 +1,20 +15,23 +37,58 +35,58 +36,7 +27,9 +49,11 +47,1 +57,49 +50,3 +8,11 +65,26 +2,33 +61,59 +37,53 +6,7 +65,41 +57,64 +16,5 +55,26 +55,4 +13,4 +16,13 +56,63 +54,59 +54,55 +0,7 +7,23 +37,1 +5,10 +19,9 +49,49 +66,33 +65,55 +23,11 +61,31 +27,11 +57,70 +10,13 +62,11 +55,66 +58,11 +69,41 +18,17 +51,52 +14,7 +59,62 +58,13 +3,27 +51,60 +67,52 +57,37 +64,35 +4,33 +44,49 +55,16 +68,61 +15,15 +52,3 +41,61 +0,39 +37,50 +59,51 +3,34 +4,5 +47,44 +59,60 +9,4 +27,1 +46,47 +35,60 +45,55 +53,50 +65,63 +8,5 +30,53 +37,7 +35,64 +51,35 +14,33 +31,8 +39,49 +51,41 +49,7 +3,15 +55,13 +53,13 +57,52 +3,8 +1,15 +4,19 +8,23 +3,25 +62,57 +53,7 +3,31 +33,61 +69,61 +36,53 +61,39 +57,9 +15,25 +57,18 +26,13 +7,31 +61,45 +34,5 +41,54 +56,3 +2,17 +63,43 +63,62 +69,33 +69,51 +59,13 +29,9 +59,41 +55,19 +11,2 +33,5 +25,18 +1,11 +45,61 +37,54 +62,55 +42,65 +22,5 +42,3 +41,52 +31,63 +9,33 +30,15 +52,7 +23,4 +57,42 +3,17 +45,53 +57,67 +64,61 +3,38 +39,57 +65,59 +43,51 +40,57 +45,37 +63,64 +1,3 +0,43 +6,3 +3,36 +1,36 +62,51 +12,17 +3,35 +16,9 +25,13 +35,63 +53,45 +68,63 +55,40 +68,59 +69,45 +4,15 +55,42 +65,33 +21,9 +5,11 +19,1 +46,51 +3,22 +60,43 +70,49 +31,5 +47,6 +64,41 +13,12 +7,22 +7,50 +48,61 +48,51 +1,41 +28,7 +3,41 +45,49 +36,63 +42,1 +5,36 +52,41 +39,4 +5,33 +60,67 +48,7 +24,23 +57,11 +27,17 +48,3 +11,37 +47,51 +38,61 +1,26 +9,25 +64,33 +11,5 +21,7 +63,35 +1,27 +24,7 +15,9 +59,61 +9,22 +15,3 +43,1 +56,7 +67,55 +7,7 +44,45 +63,45 +55,7 +59,58 +29,55 +57,45 +67,53 +31,62 +57,58 +52,9 +7,17 +4,31 +51,45 +9,8 +58,45 +70,47 +21,4 +55,17 +67,63 +55,65 +33,7 +41,5 +3,39 +5,31 +53,47 +59,55 +55,51 +59,68 +35,57 +65,47 +56,55 +27,8 +11,13 +2,41 +3,2 +29,13 +51,61 +59,15 +38,47 +45,67 +45,4 +4,1 +50,11 +51,54 +47,53 +69,53 +65,50 +51,63 +67,45 +11,31 +1,25 +3,40 +63,49 +39,7 +23,1 +30,11 +21,1 +59,37 +57,69 +34,3 +69,27 +9,29 +41,60 +58,53 +70,41 +38,15 +55,5 +43,55 +60,53 +60,45 +43,46 +49,35 +24,5 +1,43 +15,1 +67,51 +37,11 +20,1 +59,9 +68,25 +57,29 +45,15 +54,37 +17,29 +17,52 +4,43 +29,23 +13,46 +41,65 +65,16 +43,41 +17,23 +11,46 +34,67 +35,37 +5,47 +35,40 +41,29 +12,69 +15,67 +53,35 +42,43 +47,22 +35,49 +17,40 +13,59 +49,59 +33,29 +47,31 +11,54 +27,65 +69,3 +67,7 +53,29 +24,45 +57,28 +21,25 +62,21 +31,29 +23,59 +41,47 +22,55 +22,43 +67,26 +29,41 +41,25 +59,23 +43,35 +33,56 +7,69 +23,25 +31,1 +23,65 +41,45 +31,39 +47,63 +25,45 +67,13 +40,41 +46,45 +27,43 +23,49 +37,19 +67,27 +66,23 +46,31 +37,13 +35,47 +19,30 +20,47 +9,38 +64,7 +29,30 +19,45 +56,21 +35,66 +5,45 +33,49 +39,34 +47,65 +17,31 +13,51 +45,22 +45,42 +55,23 +27,55 +37,28 +41,37 +51,36 +57,33 +29,29 +35,53 +1,62 +49,69 +47,32 +4,59 +23,51 +61,33 +15,50 +37,24 +1,57 +46,27 +11,43 +29,35 +20,25 +37,29 +18,41 +31,34 +29,37 +46,29 +23,57 +9,69 +43,68 +37,65 +49,18 +4,61 +58,1 +20,33 +21,12 +46,65 +63,21 +31,27 +27,51 +5,64 +27,48 +26,59 +29,24 +18,35 +15,40 +6,59 +41,21 +46,35 +10,57 +29,19 +45,70 +62,17 +59,36 +25,66 +42,47 +26,49 +53,21 +59,21 +13,55 +51,40 +17,49 +47,34 +31,50 +2,57 +27,37 +55,49 +28,69 +64,25 +34,37 +57,24 +61,17 +43,11 +59,10 +27,42 +9,42 +13,58 +55,35 +35,46 +19,31 +28,65 +15,45 +31,47 +29,45 +67,41 +7,46 +41,63 +39,39 +67,20 +67,21 +37,18 +6,43 +47,33 +57,26 +26,45 +27,45 +35,39 +40,17 +48,21 +65,23 +42,33 +9,37 +29,25 +63,16 +53,24 +31,18 +25,37 +67,11 +43,39 +31,46 +3,55 +13,44 +14,49 +9,35 +55,57 +33,51 +37,69 +7,59 +1,17 +68,3 +64,13 +31,23 +33,53 +43,40 +2,67 +28,47 +43,65 +47,35 +63,3 +35,20 +19,26 +35,17 +11,33 +51,34 +20,29 +12,59 +43,14 +57,34 +33,39 +42,27 +7,61 +45,17 +11,63 +33,14 +4,55 +39,38 +9,43 +27,53 +14,37 +17,65 +31,45 +55,29 +10,47 +19,51 +29,17 +25,69 +18,25 +11,62 +65,21 +23,38 +1,66 +30,49 +9,61 +63,23 +23,39 +11,49 +47,67 +6,69 +31,48 +14,21 +21,57 +24,59 +18,29 +47,27 +25,21 +55,69 +63,7 +35,13 +23,63 +13,33 +15,11 +15,39 +25,36 +43,20 +65,1 +23,21 +20,55 +47,14 +45,36 +51,67 +22,41 +17,47 +16,31 +60,5 +43,36 +8,37 +43,15 +21,5 +10,53 +45,62 +51,17 +57,23 +22,31 +15,16 +31,32 +23,20 +55,0 +25,44 +55,24 +43,47 +5,57 +62,23 +8,61 +27,34 +20,57 +40,33 +15,65 +43,7 +24,29 +44,27 +27,63 +5,63 +57,21 +61,24 +23,29 +49,21 +55,25 +27,50 +17,25 +7,48 +5,53 +37,43 +13,41 +21,70 +8,45 +34,33 +58,47 +6,55 +3,57 +70,23 +59,1 +13,18 +33,60 +46,39 +35,27 +11,41 +33,55 +42,67 +19,48 +17,51 +17,50 +44,31 +68,17 +39,30 +1,63 +29,21 +9,47 +55,27 +33,27 +53,51 +21,21 +9,63 +25,33 +7,58 +53,38 +46,19 +18,69 +21,49 +40,39 +5,37 +53,67 +39,31 +33,12 +7,57 +1,49 +1,55 +19,36 +29,43 +13,50 +55,63 +51,37 +1,56 +41,41 +29,53 +24,63 +27,33 +70,9 +24,19 +2,65 +39,37 +36,35 +25,52 +32,27 +9,51 +25,19 +45,63 +15,33 +19,21 +49,13 +39,13 +65,15 +3,54 +11,57 +49,24 +41,14 +15,29 +15,27 +1,60 +31,25 +30,39 +3,58 +11,44 +13,53 +27,38 +35,33 +43,31 +53,34 +61,67 +25,27 +13,63 +21,59 +17,21 +21,55 +48,17 +5,51 +24,49 +54,49 +50,29 +31,43 +53,19 +62,31 +43,45 +19,41 +17,33 +31,59 +65,28 +26,25 +3,65 +51,25 +59,27 +20,69 +31,60 +47,11 +24,35 +39,23 +48,29 +17,44 +33,50 +61,49 +67,22 +15,26 +15,55 +52,25 +51,0 +67,10 +43,19 +45,33 +39,11 +13,49 +49,33 +3,70 +33,34 +51,13 +25,31 +32,67 +14,45 +45,34 +17,53 +43,21 +53,36 +55,31 +3,13 +1,48 +18,15 +17,69 +29,36 +11,48 +45,31 +29,39 +60,7 +22,27 +41,38 +21,47 +67,8 +49,19 +43,37 +41,33 +53,49 +21,53 +25,60 +33,45 +49,31 +13,22 +53,30 +37,12 +37,31 +27,61 +29,26 +5,52 +33,26 +35,70 +33,69 +39,25 +9,55 +29,1 +5,3 +69,15 +31,22 +9,32 +53,20 +23,33 +31,33 +6,63 +64,15 +69,23 +49,39 +48,27 +41,3 +7,38 +59,47 +65,10 +7,66 +17,24 +67,9 +25,22 +0,63 +7,37 +9,36 +9,17 +69,25 +27,39 +42,25 +11,23 +57,25 +31,67 +51,20 +35,55 +11,17 +9,57 +11,67 +35,29 +5,27 +16,57 +27,36 +21,63 +10,51 +52,17 +34,11 +3,45 +49,67 +37,37 +43,12 +53,18 +5,66 +26,17 +17,67 +19,60 +28,19 +31,70 +27,20 +11,68 +8,67 +33,38 +15,47 +51,29 +33,23 +47,23 +11,30 +45,69 +33,16 +42,19 +8,55 +25,67 +23,19 +69,7 +35,31 +28,29 +67,17 +13,31 +26,53 +19,66 +27,57 +45,65 +33,11 +5,65 +1,69 +22,67 +13,65 +51,38 +3,53 +70,27 +17,30 +25,59 +19,64 +21,19 +36,33 +36,27 +53,56 +65,24 +39,18 +37,36 +15,64 +15,28 +53,28 +45,27 +33,47 +31,69 +23,67 +5,59 +53,59 +35,19 +29,22 +47,43 +59,7 +35,42 +54,31 +21,45 +25,53 +20,51 +69,8 +12,39 +29,54 +10,45 +16,67 +29,58 +61,15 +63,2 +27,15 +57,36 +60,31 +30,43 +21,51 +21,38 +21,42 +63,18 +29,47 +17,57 +67,15 +65,3 +16,47 +13,54 +37,45 +45,14 +48,57 +25,55 +55,32 +47,17 +19,19 +41,39 +7,52 +7,45 +51,23 +53,22 +23,37 +11,56 +68,15 +50,33 +35,67 +33,24 +23,64 +15,51 +15,36 +26,61 +57,32 +15,35 +39,17 +16,39 +11,65 +13,14 +33,17 +43,25 +40,45 +63,25 +19,32 +41,8 +44,67 +3,59 +41,19 +36,13 +14,17 +17,39 +23,54 +25,63 +28,33 +19,47 +16,33 +29,65 +33,20 +31,49 +65,2 +34,45 +27,2 +11,36 +48,41 +45,25 +3,69 +42,69 +43,17 +61,29 +65,7 +31,51 +40,27 +14,63 +27,31 +10,17 +59,25 +37,17 +4,49 +19,29 +25,51 +26,21 +15,63 +64,9 +24,27 +69,5 +30,67 +3,7 +51,69 +19,57 +4,51 +48,35 +34,23 +59,3 +26,31 +37,23 +7,65 +66,7 +68,11 +42,17 +52,67 +24,41 +49,17 +33,67 +29,69 +69,19 +39,64 +14,57 +49,43 +19,22 +53,39 +47,25 +33,35 +63,9 +20,19 +58,5 +35,25 +60,3 +19,53 +22,65 +38,31 +56,49 +19,44 +67,3 +13,28 +27,41 +31,56 +50,1 +14,25 +27,23 +26,67 +65,5 +17,58 +15,61 +48,25 +35,15 +29,16 +39,67 +31,37 +57,2 +54,39 +38,13 +29,40 +23,52 +39,47 +21,29 +36,67 +25,39 +3,67 +40,13 +12,25 +59,38 +17,22 +44,63 +9,59 +47,29 +52,31 +29,67 +3,33 +21,16 +12,35 +29,59 +2,51 +47,5 +53,37 +44,19 +28,39 +45,35 +15,49 +7,39 +56,35 +31,21 +17,62 +15,59 +63,10 +63,11 +49,57 +3,49 +35,51 +43,30 +11,38 +36,43 +13,29 +47,13 +9,62 +43,23 +50,27 +12,41 +63,13 +29,3 +35,69 +12,65 +46,25 +16,27 +7,43 +47,68 +63,19 +41,7 +56,29 +58,15 +63,51 +45,9 +25,61 +36,15 +33,30 +61,22 +45,24 +59,30 +53,31 +5,69 +17,27 +27,29 +58,33 +59,40 +35,22 +47,15 +16,45 +37,40 +14,65 +44,9 +27,67 +35,36 +36,17 +33,19 +52,27 +11,45 +64,5 +41,43 +39,69 +9,53 +41,17 +43,42 +17,59 +45,29 +37,39 +21,39 +21,65 +19,37 +21,23 +65,17 +11,35 +35,1 +33,65 +47,19 +37,15 +13,21 +49,30 +20,59 +62,7 +13,70 +1,47 +61,7 +15,69 +5,67 +53,23 +39,27 +49,60 +5,56 +51,66 +37,67 +13,69 +19,39 +33,21 +7,67 +16,15 +17,61 +49,14 +15,68 +25,35 +69,9 +21,67 +46,17 +24,57 +23,68 +1,51 +43,38 +35,48 +39,16 +0,55 +65,65 +19,33 +60,9 +5,41 +67,2 +29,44 +53,69 +41,31 +17,37 +63,17 +7,42 +8,49 +7,32 +6,49 +15,37 +13,57 +33,33 +35,43 +39,29 +51,15 +29,66 +23,27 +23,61 +61,21 +25,47 +18,59 +41,35 +31,52 +30,35 +69,17 +27,59 +13,30 +49,27 +15,31 +11,53 +65,57 +15,56 +30,19 +23,62 +27,27 +24,31 +23,47 +23,23 +23,31 +29,46 +28,61 +17,41 +36,19 +7,40 +38,65 +11,66 +27,69 +37,21 +45,11 +59,18 +7,41 +59,49 +51,43 +19,49 +15,43 +55,61 +49,37 +8,65 +39,68 +61,9 +7,51 +41,32 +37,25 +19,43 +26,29 +19,56 +69,1 +43,34 +67,23 +11,69 +37,35 +69,13 +19,27 +27,19 +60,19 +32,21 +32,35 +11,47 +35,41 +66,5 +28,57 +42,63 +44,39 +51,1 +18,43 +14,53 +27,68 +41,11 +44,17 +18,19 +49,29 +52,43 +35,65 +19,15 +53,33 +27,25 +45,23 +37,51 +67,14 +9,52 +1,61 +50,19 +65,19 +27,32 +38,41 +31,35 +25,46 +53,42 +33,25 +25,29 +16,61 +21,46 +43,61 +13,37 +2,53 +13,38 +59,20 +63,20 +3,63 +13,43 +67,0 +35,23 +6,35 +21,27 +20,45 +39,43 +12,49 +7,11 +9,68 +15,42 +43,27 +41,15 +19,63 +61,23 +66,13 +25,65 +18,67 +69,12 +23,48 +27,26 +17,54 +53,68 +33,28 +21,52 +22,45 +16,63 +21,61 +29,63 +49,68 +44,65 +59,4 +51,19 +51,57 +19,69 +22,49 +37,68 +49,23 +58,21 +47,10 +34,9 +33,41 +25,64 +23,50 +25,54 +37,32 +39,42 +41,9 +29,28 +25,41 +39,21 +45,19 +19,65 +22,29 +47,38 +21,28 +50,15 +5,40 +49,65 +67,19 +36,49 +61,57 +53,2 +32,37 +43,63 +10,41 +69,21 +19,55 +20,39 +64,1 +57,38 +69,18 +17,38 +11,51 +20,63 +57,35 +21,24 +41,55 +51,70 +61,55 +19,61 +40,25 +57,27 +61,1 +39,44 +39,36 +27,21 +41,24 +21,37 +1,53 +51,58 +27,47 +57,57 +39,33 +37,33 +23,55 +40,69 +21,43 +37,46 +49,70 +46,67 +64,21 +41,13 +13,27 +45,12 +50,23 +39,66 +45,13 +19,17 +19,11 +63,1 +19,38 +17,48 +61,28 +22,59 +19,62 +37,44 +21,34 +13,39 +61,43 +37,38 +2,69 +27,64 +12,29 +53,27 +31,61 +2,63 +23,40 +23,26 +59,26 +32,39 +31,11 +43,33 +53,32 +49,45 +63,5 +21,31 +53,25 +17,43 +4,45 +23,32 +5,62 +13,45 +19,14 +57,22 +13,26 +51,27 +69,11 +39,28 +15,19 +65,20 +7,54 +5,46 +31,57 +39,45 +34,51 +7,63 +17,55 +46,9 +29,33 +26,41 +39,22 +67,25 +66,17 +69,6 +47,21 +10,29 +62,3 +16,35 +63,15 +67,5 +62,27 +7,49 +17,19 +20,41 +45,39 +61,27 +34,29 +47,64 +11,61 +51,12 +33,46 +10,61 +19,25 +23,45 +47,42 +21,69 +41,27 +59,29 +22,23 +33,43 +41,22 +31,53 +9,41 +29,31 +49,61 +9,45 +5,55 +33,44 +27,62 +1,21 +23,35 +47,37 +25,25 +44,23 +30,69 +61,19 +22,57 +0,51 +31,15 +53,65 +60,1 +46,13 +25,23 +65,13 +51,16 +17,66 +0,15 +29,51 +9,60 +39,19 +5,19 +39,15 +41,20 +33,15 +51,26 +4,67 +43,67 +51,21 +48,39 +9,49 +22,35 +32,43 +43,16 +21,33 +47,45 +51,31 +28,53 +48,37 +19,20 +57,1 +35,35 +14,41 +23,53 +31,24 +57,19 +21,41 +41,10 +15,60 +70,17 +43,13 +41,30 +35,21 +52,59 +47,16 +55,1 +47,62 +24,33 +35,26 +19,50 +39,41 +30,65 +37,41 +5,39 +51,22 +65,44 +49,25 +20,67 +9,65 +27,56 +39,65 +30,31 +11,55 +5,49 +43,43 +9,58 +14,47 +49,63 +23,69 +67,24 +68,5 +47,20 +45,47 +65,45 +11,59 +5,61 +60,51 +36,23 +63,27 +50,59 +41,36 +55,21 +36,39 +55,58 +7,47 +45,43 +17,63 +32,19 +34,41 +33,48 +30,1 +11,39 +1,65 +43,28 +47,69 +32,41 +39,35 +13,60 +33,68 +49,9 +3,48 +43,69 +12,63 +65,12 +14,67 +12,55 +9,40 +49,64 +65,9 +68,21 +26,57 +38,25 +31,31 +41,23 +43,29 +59,19 +28,51 +19,54 +49,12 +15,24 +63,48 +13,61 +23,17 +29,49 +5,60 +27,24 +60,29 +27,49 +35,45 +17,35 +69,2 +15,32 +26,39 +29,27 +1,67 +23,41 +21,36 +23,43 +62,5 +35,11 +48,65 +25,68 +17,45 +13,47 +31,0 +31,65 +59,5 +13,23 +15,53 +27,35 +41,62 +59,22 +58,39 +53,17 +16,55 +54,23 +15,52 +33,31 +49,32 +9,64 +24,39 +13,67 +25,43 +38,27 +25,49 +36,31 +15,41 +65,11 +15,57 +67,1 +39,20 +29,57 +5,68 +25,57 +31,30 +19,59 +49,15 +31,41 +21,35 +59,24 +32,53 +3,61 +47,39 +7,53 +51,33 +45,21 +1,59 +37,27 +38,21 +57,30 +22,61 +21,17 +33,37 +7,55 +29,42 +9,5 +9,67 +52,63 +19,67 +53,1 +44,36 +34,34 +60,18 +62,64 +38,2 +22,40 +25,40 +28,45 +22,13 +20,37 +28,9 +28,64 +68,0 +0,6 +34,38 +63,40 +66,66 +12,16 +21,56 +26,15 +0,54 +20,44 +52,10 +70,55 +54,33 +22,47 +69,20 +32,36 +21,48 +28,40 +0,14 +2,50 +5,70 +28,8 +15,6 +58,9 +36,51 +46,28 +8,14 +64,6 +0,56 +58,29 +64,55 +26,51 +17,4 +30,54 +14,24 +68,26 +14,35 +68,22 +26,2 +30,38 +17,16 +28,11 +37,14 +62,16 +23,42 +26,68 +42,7 +60,20 +40,49 +14,12 +68,12 +26,44 +28,37 +35,50 +70,43 +66,58 +48,56 +46,30 +34,48 +16,14 +62,15 +41,2 +56,6 +31,16 +50,70 +24,20 +64,58 +59,14 +6,6 +19,2 +10,66 +25,20 +54,46 +41,16 +55,50 +10,28 +42,42 +38,45 +26,34 +59,8 +12,36 +10,23 +58,35 +47,66 +60,46 +40,54 +16,8 +36,16 +56,39 +70,36 +30,4 +35,32 +54,63 +8,36 +38,10 +30,70 +4,41 +0,48 +25,10 +34,52 +20,4 +56,44 +67,4 +38,44 +18,37 +6,60 +60,47 +6,66 +27,18 +35,12 +37,8 +8,48 +18,53 +30,50 +36,50 +35,24 +22,3 +55,8 +20,24 +70,65 +4,68 +25,42 +8,68 +42,5 +30,55 +70,60 +18,33 +23,36 +35,8 +40,28 +34,13 +42,4 +26,32 +54,67 +29,2 +39,6 +68,48 +0,16 +8,35 +18,5 +38,12 +32,10 +48,13 +70,57 +19,0 +46,23 +42,36 +38,35 +39,14 +11,70 +34,59 +24,40 +70,64 +70,52 +45,28 +24,21 +4,6 +66,62 +62,29 +25,34 +34,21 +36,37 +4,54 +39,70 +46,6 +26,58 +30,27 +36,56 +44,5 +59,6 +65,18 +64,17 +38,24 +57,12 +34,12 +66,42 +15,18 +30,13 +69,60 +21,40 +25,4 +54,66 +26,26 +34,39 +31,58 +62,39 +12,23 +2,48 +32,1 +28,32 +62,52 +32,59 +50,18 +17,6 +44,12 +42,46 +48,15 +8,15 +62,13 +28,15 +70,22 +35,30 +48,22 +2,62 +41,64 +10,38 +64,44 +41,68 +48,1 +70,37 +8,39 +24,52 +58,42 +25,8 +6,57 +18,46 +67,28 +36,24 +70,5 +63,42 +6,67 +18,48 +38,20 +14,0 +10,37 +26,24 +70,34 +58,60 +61,36 +64,26 +24,25 +62,46 +44,64 +55,10 +25,14 +4,26 +4,34 +14,44 +42,14 +37,20 +10,33 +37,26 +34,40 +10,46 +52,16 +3,66 +4,35 +66,53 +67,58 +31,44 +70,31 +38,59 +68,28 +40,11 +6,38 +52,29 +28,35 +52,37 +30,5 +14,9 +18,28 +43,48 +68,49 +38,39 +46,16 +13,32 +12,13 +53,8 +52,0 +60,28 +68,9 +52,39 +36,30 +40,66 +13,20 +27,60 +18,10 +46,32 +8,31 +39,40 +70,59 +58,56 +50,34 +60,40 +70,32 +64,52 +30,29 +58,62 +32,56 +35,10 +38,53 +51,18 +56,62 +18,6 +37,30 +44,37 +67,66 +10,30 +1,70 +66,16 +50,36 +28,58 +30,45 +0,70 +28,44 +20,3 +62,28 +30,30 +15,22 +17,0 +48,40 +6,36 +30,23 +13,24 +54,22 +68,6 +67,30 +32,2 +36,11 +37,16 +0,49 +62,25 +8,13 +22,32 +40,43 +44,32 +38,28 +0,18 +30,37 +29,50 +46,69 +32,25 +46,10 +70,1 +1,4 +56,28 +62,18 +55,28 +36,25 +14,36 +38,58 +66,47 +20,16 +50,32 +16,41 +58,2 +54,20 +55,2 +1,58 +30,17 +60,16 +64,64 +68,24 +32,20 +66,44 +50,64 +36,18 +14,40 +12,52 +24,64 +28,50 +14,50 +36,3 +48,0 +50,60 +50,30 +63,24 +70,3 +27,12 +30,0 +42,35 +60,38 +54,34 +31,26 +22,46 +4,63 +38,50 +58,31 +49,56 +16,36 +8,20 +4,66 +62,48 +2,4 +6,54 +13,34 +36,8 +63,14 +38,17 +26,12 +20,32 +52,38 +11,52 +46,1 +48,19 +38,33 +44,28 +56,56 +54,58 +43,4 +64,50 +32,46 +45,18 +14,26 +63,54 +42,8 +68,20 +56,24 +14,31 +34,35 +70,30 +67,18 +0,67 +40,2 +58,52 +23,28 +58,27 +50,68 +10,49 +40,65 +52,4 +20,27 +62,10 +56,50 +60,14 +59,0 +62,6 +48,28 +57,20 +38,48 +20,35 +10,55 +62,20 +68,16 +42,68 +24,55 +61,70 +12,2 +53,4 +62,1 +15,14 +70,4 +37,34 +63,32 +49,0 +0,52 +60,52 +63,66 +3,62 +20,17 +12,32 +62,50 +65,68 +10,19 +14,28 +9,0 +26,30 +4,27 +39,56 +42,29 +60,24 +68,7 +59,42 +51,48 +29,8 +54,43 +49,36 +24,28 +30,7 +6,61 +55,34 +9,12 +31,40 +20,64 +50,0 +66,21 +19,18 +4,2 +30,47 +2,5 +7,20 +33,4 +24,1 +7,60 +40,24 +46,20 +49,4 +36,34 +8,18 +50,40 +12,7 +6,39 +46,46 +29,14 +50,38 +22,30 +61,32 +58,69 +32,38 +11,42 +0,22 +56,54 +10,31 +49,62 +65,4 +24,14 +44,33 +47,18 +7,28 +16,49 +42,60 +64,20 +50,48 +36,61 +1,44 +56,25 +26,38 +36,59 +14,34 +32,34 +29,0 +8,41 +67,40 +60,65 +19,70 +0,19 +4,64 +29,38 +26,50 +24,48 +25,56 +60,10 +3,68 +8,2 +56,34 +18,64 +51,64 +42,32 +59,46 +14,39 +0,31 +2,37 +40,37 +52,22 +16,70 +1,52 +58,59 +2,26 +6,64 +42,45 +12,18 +54,1 +45,46 +39,26 +52,33 +2,61 +65,66 +36,0 +42,23 +24,46 +64,36 +45,30 +43,56 +60,57 +44,20 +61,68 +16,3 +44,56 +57,40 +12,58 +10,26 +42,58 +31,54 +12,31 +48,34 +59,44 +70,11 +1,54 +40,18 +70,63 +27,10 +2,20 +46,49 +26,69 +30,10 +31,20 +32,70 +30,64 +52,48 +10,9 +38,6 +52,28 +24,24 +48,24 +70,46 +1,6 +44,21 +20,66 +12,53 +5,48 +51,68 +40,23 +63,56 +4,3 +64,4 +51,10 +14,11 +65,60 +53,70 +2,2 +34,61 +24,2 +48,59 +67,12 +8,52 +26,4 +9,44 +9,48 +44,2 +41,48 +21,32 +24,70 +20,15 +25,28 +26,1 +21,30 +4,56 +17,14 +4,36 +12,22 +14,62 +54,42 +52,1 +2,1 +28,2 +31,42 +14,8 +11,58 +49,20 +52,44 +42,13 +54,57 +70,19 +2,52 +3,20 +47,28 +70,12 +52,23 +3,0 +64,0 +70,40 +22,22 +39,24 +32,69 +22,48 +19,52 +36,69 +27,46 +22,19 +63,30 +16,52 +64,69 +28,1 +43,0 +22,42 +50,56 +35,38 +4,37 +62,4 +28,27 +51,44 +22,8 +19,58 +12,9 +58,30 +51,8 +15,46 +60,17 +6,1 +16,59 +6,16 +10,4 +0,68 +14,58 +27,22 +69,62 +0,53 +36,57 +24,68 +20,68 +54,53 +2,25 +2,8 +52,53 +33,22 +27,52 +66,15 +6,47 +31,38 +54,19 +68,34 +50,6 +23,70 +1,42 +64,27 +41,58 +33,42 +60,56 +32,18 +12,68 +42,38 +54,62 +52,20 +36,22 +47,24 +34,46 +49,26 +9,66 +25,30 +38,14 +46,34 +56,66 +52,6 +36,70 +58,40 +35,52 +28,43 +16,50 +8,42 +61,10 +42,31 +67,16 +21,2 +54,70 +10,50 +26,55 +34,16 +34,8 +12,6 +32,45 +26,6 +56,68 +69,24 +42,9 +45,40 +48,8 +64,14 +30,62 +13,42 +46,4 +16,25 +48,31 +46,58 +40,40 +46,68 +48,20 +56,4 +8,40 +10,14 +20,31 +61,20 +34,24 +68,68 +14,18 +1,46 +62,65 +46,55 +18,55 +24,66 +48,10 +16,38 +11,14 +21,22 +22,38 +28,22 +2,24 +15,66 +22,50 +19,28 +68,51 +58,25 +14,15 +64,56 +46,48 +38,67 +56,9 +12,62 +43,24 +36,10 +60,0 +2,10 +28,60 +53,44 +18,39 +28,42 +6,10 +68,44 +18,49 +68,32 +27,66 +0,44 +4,10 +29,68 +40,9 +61,44 +24,32 +9,70 +10,69 +8,56 +65,14 +25,48 +0,33 +3,32 +42,57 +40,15 +60,21 +22,69 +21,10 +20,36 +64,51 +12,1 +40,46 +48,6 +22,44 +8,24 +18,12 +54,4 +54,10 +22,39 +34,62 +64,40 +18,52 +0,25 +0,57 +38,55 +64,45 +0,35 +36,55 +0,41 +45,10 +64,16 +24,58 +56,58 +64,42 +12,46 +22,10 +38,52 +20,56 +54,41 +62,53 +4,60 +64,12 +10,7 +59,32 +20,2 +32,14 +42,50 +56,1 +50,49 +4,39 +7,24 +38,3 +69,68 +66,4 +67,32 +42,21 +4,53 +35,44 +20,53 +68,18 +0,65 +38,63 +70,53 +64,54 +35,4 +54,65 +53,0 +58,70 +63,52 +20,50 +32,16 +32,54 +47,36 +50,61 +34,27 +65,56 +65,0 +50,39 +16,10 +22,70 +10,36 +32,66 +38,8 +37,0 +4,14 +28,49 +4,12 +48,67 +59,70 +42,48 +28,56 +2,31 +64,24 +7,70 +43,18 +2,12 +10,32 +62,44 +26,70 +30,68 +4,46 +58,50 +49,58 +45,50 +8,59 +41,0 +10,24 +18,60 +60,54 +0,69 +26,5 +56,18 +60,15 +10,58 +5,12 +0,9 +22,34 +14,51 +3,60 +18,70 +69,50 +64,48 +69,10 +4,42 +8,38 +40,22 +30,60 +15,0 +28,3 +27,40 +56,70 +5,30 +42,26 +2,28 +39,8 +34,60 +34,26 +34,49 +4,29 +34,36 +33,52 +40,32 +54,8 +3,46 +10,68 +42,70 +8,26 +34,66 +15,8 +21,44 +5,26 +44,40 +50,31 +40,4 +68,10 +43,54 +4,62 +52,66 +16,22 +32,32 +62,0 +6,46 +28,23 +42,52 +53,26 +10,25 +42,54 +56,67 +60,26 +19,34 +60,30 +46,37 +10,56 +12,10 +66,25 +60,69 +19,46 +23,16 \ No newline at end of file diff --git a/2024/gareth/day19/day19.go b/2024/gareth/day19/day19.go new file mode 100644 index 0000000..cf151af --- /dev/null +++ b/2024/gareth/day19/day19.go @@ -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 +} diff --git a/2024/gareth/day19/day19_test.go b/2024/gareth/day19/day19_test.go new file mode 100644 index 0000000..cb0ed02 --- /dev/null +++ b/2024/gareth/day19/day19_test.go @@ -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) +} diff --git a/2024/gareth/day19/input.txt b/2024/gareth/day19/input.txt new file mode 100644 index 0000000..9547196 --- /dev/null +++ b/2024/gareth/day19/input.txt @@ -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 \ No newline at end of file diff --git a/2024/gareth/main.go b/2024/gareth/main.go index 99d93ff..9ef4db9 100644 --- a/2024/gareth/main.go +++ b/2024/gareth/main.go @@ -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 diff --git a/2024/go/day06/day06.go b/2024/go/day06/day06.go new file mode 100644 index 0000000..d0388f4 --- /dev/null +++ b/2024/go/day06/day06.go @@ -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 +} diff --git a/2024/go/day06/day06_test.go b/2024/go/day06/day06_test.go new file mode 100644 index 0000000..8d3a4c3 --- /dev/null +++ b/2024/go/day06/day06_test.go @@ -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) +} diff --git a/2024/go/day06/input.txt b/2024/go/day06/input.txt new file mode 100644 index 0000000..86fc58b --- /dev/null +++ b/2024/go/day06/input.txt @@ -0,0 +1,130 @@ +...#..................#...................#......................#..............................#.............................#... +....#.......................#........#.#..............##...........#.....#..........#..........................#.................. +.............#........................................................................#.........#.#..#..#..........#.............. +..........#.......#..........#..................#........##...................#..............#.................................... +....................#..........................................................#..#.....................................#......... +....#............................#..............................................#.....................#..........##....#.......... +.......#.............#......................................................................#.............#.........#............. +....###......................#....#...........#.....#................................#..........................#................. +..........#..#...........#..#........................................................#.....#...........#................#......... +..#....#......#....#....#...................................................................#..................................... +....................#............#............................................#......#....#...............................#....... +..........#.......#.........#.......#............................................................................................. +.......#...#.......................................#...................#.......................................................... +.......#........#............................#.....#.......#..............................................#..................#...# +.....................#.................................#................#...#...............#.....#.#..........................#.. +.....#..........................................#......................#.............##..............................#........#... +.....#......#.........................#..........................#..........................................................#..#.. +.#......#.............#......#.................................................#.....#...................##......#................ +.............................................................................##................................................... +........................................#.......................................#........#.............................#.#.......# +...........#.....................................#.............................#......#......#..#....................#..#......... +.............................................#.......................#..................##....#.....#............................. +........................#..............................................................#.......................................... +#..............#.........................#........#...#...............#..............#..................#....................##... +...#...#.............................#.......#................................................#........................#....#..... +.....#.........................#..#.......................#..........#.....................#..................#.#.....#........... +..................#........#..#.......#...................................................................................#....#.. +..#...#...............................................#.#..#........................................................#....#......#. +...............#...............#..........................#............................#..........#.............#................. +............#.....#........#.........................................................#........#........#.....#........#......#.... +............................#.........#....#........#.....#...#.............#.................................#................... +........#..................#....#..........................................................#.#.#.................................. +....................................................................................................................#............. +#............#.............#..................#......................................................................#............ +...............................#....#..........#...........##........................................................#.........#.# +................#.........................................#.................................................#........#............ +..............................................#............#................#........#........................#................... +..................#.........#..........................#.............#...............#............#....................#.......... +........................#...#...............................................#..............#.....#.....................#.......... +...........#.......................................#..............................#..................#....#...##.................. +#...............#..................#...............................#...............................#.....................#........ +.............#...............................................................##................................................... +.................#.............#.......................#...#............#.#....#................................#...........#..... +#......#......#..................................##.................#.#...............................#........................... +.#...............#..........#...............................................#...#..........#..........#........................... +.....................................#............................#....#.............................................#...#........ +......#...#.............#.#....................#.........#..........##.................................#..........#..........#.... +.............................#..................#....#..............##.......................#.#.....#........#................... +.................................................#.#......................................................#................#...... +......................................#..........................................#......#......................................... +#....................#...........................................................#..................#............................. +.....#.........#...................................................#....#.#....#.#.........#...................................... +........#..........#......#.............#................................#.....#................#................................. +...........#................................#...........#..........#......#.............#........................#................ +.......#...............#....................#..#................................................#................................. +.....................#.........#..#............#..........#...........#...........#...............................#............... +................#...#........#...........#..........................................................#..#...................#...... +.........................................................#.....................#...#......................#.#....................# +................#......#....#.#..............#............#....................................................................... +..........#.....................................#......................................................................#.......... +#......................................#.......#.....##..#.....................#.........#.......#................................ +........#...#..............#....................#................................#..............................................#. +.##............................................................................#......#................................#.......... +.#........................#..............#..............................................#........#.....#.......#.................. +#......................................#.....................#...................................................................# +............................#.....#.....#............#...............#...#.......#.........#...................................... +.#.........................#.......................#.........#.......#.................#............................#..#.......... +.............................................................................................................#........##.......... +...........#...#...#.#................#.....................................#........#............................................ +......#.......................#..........#.......#................................................................#............... +........#....#........#..................#....##.....#............#..............................#...........#...........#..#..... +..................................#...............................................................................#............... +.....................#.#.......................#....................................#............................................. +........................................................................................#.........#.................#.........#... +..........................#..........#....#..........................................#.......................#............#.#..... +...............................................#.#....#...............................#...................#......................# +.....#...........#........#.#.......#.............................#..................#............................................ +...............#.........................................................#....................#.................#.............#... +#....................................##..........#................................................................#............... +...............#.................#...#..............#......................................................#..............#....... +...................#......#.............................................#......................................................#.# +..#.............#.......#......#....#..#..#....................................................................................... +.........#....................................................#.....................................#..............#.............. +..............#..............#................................................................#.......................#........... +..........................#.................#.......................................................##...................#.#...... +...............#..#...................................................................................................#.......###. +...#.....................#..#........#..........#..................................................................##............. +.................#.......................................###..............#.........................#............................. +...#.....................................................#.......#..........................#................#..#................. +...................................................#..................#.........................................................#. +.....#.............#...................#...................#.....................................#................................ +.....................#.........................#......#........................................................................... +...........#...............#......#.....##...#...#.............................................#........#.#...............#...#... +..............#..............##...........#.......................#..#.^.......................................................... +...................#.............................................................................................................. +..................#.......#..........#.......#..................#..........#...................................#.................. +..............................................................................................#..................................# +......................................................#................#......................#................................... +..............#.........#..............................#.....................#......................#............................. +#................#.........#................#.............................#......................#..#...#..............#.......... +.#..#........#................#...............#..................#........#.....................#............#........#........... +.....................................................#.#.........#......................#.............................#........#.. +......................#.....................#..#......#..........................#............................#......#............ +......................#.........................#..#..................................#.......................#..............#.... +..........................#..................#.............#......................................................#............... +..........................#....#........................................#..#...#....#.................#........................... +.......#...........#.......................#............##........#....................................................#.......... +#..........................................................................#...........#.......................................... +............................................................#.................#..#........................................##...... +..#...............................................#....#.................................................##.....#...##.....#...... +...#.....##..............................#.........................................................#............#................. +.....#....##............................#....##..........#...#.................................................................... +..................................................#..........................#.........##.......#.......................#......... +.........#.....#..........#........#........................#.##..#............#.......................................#.......... +.....#...............#.......#..........#.#..........#.....................#.....................................#.....#.......... +....#......#............................................................................................##...#.#.#.........#...... +...........#........................#.....#....................#..................#.#........#.................................... +....................................................#................#.#................................................#......... +..........#..............#.......................#.................#...................................#.............#.#......##.. +................##......................................................#.................#.......#.#....................#........ +................#......................................................#.............##...............#.....#......#.......#...... +..............................#............................#..........#...........#............................................... +.......#.............#....................................................................#..............................#.#...... +...#.....................#.#...............................................................#...#..#....#.......................... +....#.........##......#..............................................................................#..................#......... +....#..........................................#......#...................#........##............#................................ +..#.......#......#............#........#...#.#...........................#.......#................................................ +..........................#...#....................#...............#...#......#.#...#...#...............#.#.#..................... +....##.#....................................................................#...#.....##........................#.##.............. +.............................................#.................................................................................... diff --git a/2024/go/day07/day07.go b/2024/go/day07/day07.go new file mode 100644 index 0000000..6f4c336 --- /dev/null +++ b/2024/go/day07/day07.go @@ -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< 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 +} diff --git a/2024/go/day08/day08_test.go b/2024/go/day08/day08_test.go new file mode 100644 index 0000000..7ed15be --- /dev/null +++ b/2024/go/day08/day08_test.go @@ -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) +} diff --git a/2024/go/day08/input.txt b/2024/go/day08/input.txt new file mode 100644 index 0000000..701cc7a --- /dev/null +++ b/2024/go/day08/input.txt @@ -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.... diff --git a/2024/go/day09/day09.go b/2024/go/day09/day09.go new file mode 100644 index 0000000..64ddd3d --- /dev/null +++ b/2024/go/day09/day09.go @@ -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;i0;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 max_safe { + max_safe = safe + max_i = i + } + if safe < min_safe { + min_safe = safe + min_i = i + } + grid = ng + } + for i:=7380;i<7390;i++{ + ng := ticks(grid, 1) + fmt.Println(ng.StringWithFormatter(formatter)) + grid = ng + } + fmt.Println(grid.StringWithFormatter(formatter)) + fmt.Printf("max_safe: %d max_i: %d min_safe: %d min_i:%d", max_safe, max_i, min_safe, min_i) + return get_saftey(grid) +} + +func formatter(robots []Robot, x int, y int) string { + if len(robots) == 0 { + return " " + } + return "*" +} + +func ticks(g *grid.Grid[[]Robot], seconds int) *grid.Grid[[]Robot] { + ng := grid.NewGrid(SIZE_X, SIZE_Y, []Robot{}) + for y := 0; y < g.SizeY(); y++ { + for x := 0; x < g.SizeX(); x++ { + for _, robot := range g.Get(x, y) { + nx := x + ((robot.velocity[0] * seconds) % SIZE_X) + if nx < 0 { + nx = g.SizeX() + nx + } + if nx >= g.SizeX() { + nx = nx - g.SizeX() + } + ny := y + ((robot.velocity[1] * seconds) % SIZE_Y) + if ny < 0 { + ny = g.SizeY() + ny + } + if ny >= g.SizeY() { + ny = ny - g.SizeY() + } + robots := ng.Get(nx, ny) + ng.Set(nx, ny, append(robots, robot)) + } + } + } + return ng +} + +func get_saftey(grid *grid.Grid[[]Robot]) int { + robots := 0 + val := 1 + for y := 0; y < grid.SizeY()/2; y++ { + for x := 0; x < grid.SizeX()/2; x++ { + robots += len(grid.Get(x, y)) + } + } + val *= robots + robots = 0 + for y := 0; y < grid.SizeY()/2; y++ { + for x := grid.SizeX()/2 + 1; x < grid.SizeX(); x++ { + robots += len(grid.Get(x, y)) + } + } + val *= robots + robots = 0 + for y := grid.SizeY()/2 + 1; y < grid.SizeY(); y++ { + for x := grid.SizeX()/2 + 1; x < grid.SizeX(); x++ { + robots += len(grid.Get(x, y)) + } + } + val *= robots + robots = 0 + for y := grid.SizeY()/2 + 1; y < grid.SizeY(); y++ { + for x := 0; x < grid.SizeX()/2; x++ { + robots += len(grid.Get(x, y)) + } + } + val *= robots + return val +} \ No newline at end of file diff --git a/2024/go/day14/day14_test.go b/2024/go/day14/day14_test.go new file mode 100644 index 0000000..791e1d9 --- /dev/null +++ b/2024/go/day14/day14_test.go @@ -0,0 +1,527 @@ +package day14 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`p=0,4 v=3,-3 +p=6,3 v=-1,-3 +p=10,3 v=-1,2 +p=2,0 v=2,-1 +p=0,0 v=1,3 +p=3,0 v=-2,-2 +p=7,6 v=-1,-3 +p=3,0 v=-1,-2 +p=9,3 v=2,3 +p=7,3 v=-1,2 +p=2,4 v=2,-3 +p=9,5 v=-3,-3`) + require.Equal(t, 12, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`p=80,75 v=69,72 +p=88,10 v=-28,-23 +p=79,61 v=79,59 +p=37,102 v=92,-43 +p=12,22 v=-5,-95 +p=60,13 v=-30,-42 +p=3,59 v=-96,-88 +p=85,33 v=-43,-41 +p=44,14 v=63,45 +p=6,6 v=-34,-86 +p=47,102 v=12,42 +p=36,88 v=-88,-93 +p=78,27 v=-18,52 +p=96,64 v=-62,-34 +p=49,99 v=-78,-15 +p=57,31 v=-80,21 +p=25,57 v=8,-84 +p=69,20 v=81,61 +p=80,5 v=-11,-30 +p=2,35 v=-85,77 +p=9,12 v=-4,36 +p=37,68 v=12,-69 +p=47,88 v=-8,-90 +p=72,68 v=59,-86 +p=55,38 v=-68,-94 +p=60,58 v=41,37 +p=76,87 v=-1,-18 +p=89,9 v=38,92 +p=100,67 v=17,-53 +p=83,73 v=80,32 +p=77,19 v=-54,-20 +p=10,86 v=-65,36 +p=13,88 v=-64,-84 +p=50,29 v=-17,-29 +p=79,38 v=89,-57 +p=55,57 v=-68,22 +p=71,82 v=-80,52 +p=37,83 v=-68,-43 +p=25,5 v=81,-22 +p=83,54 v=-32,-75 +p=27,95 v=-77,-55 +p=70,97 v=-72,-4 +p=3,84 v=-60,-60 +p=16,29 v=-35,99 +p=39,39 v=37,-38 +p=76,94 v=90,60 +p=18,21 v=-86,-26 +p=22,84 v=-16,66 +p=45,83 v=-40,-43 +p=35,52 v=54,3 +p=30,21 v=14,36 +p=69,61 v=69,-66 +p=52,22 v=-28,33 +p=9,21 v=-85,-73 +p=87,32 v=79,52 +p=28,85 v=-35,85 +p=32,58 v=-49,89 +p=22,75 v=85,44 +p=45,19 v=-88,61 +p=97,59 v=98,-75 +p=70,81 v=82,7 +p=97,102 v=-23,-8 +p=92,68 v=89,72 +p=24,42 v=-63,-97 +p=21,64 v=-45,-47 +p=58,3 v=-69,51 +p=33,68 v=19,-20 +p=27,6 v=-89,-21 +p=28,81 v=-67,-8 +p=59,83 v=-66,-82 +p=3,14 v=-3,-1 +p=19,65 v=15,-25 +p=57,37 v=53,-29 +p=36,84 v=-4,-84 +p=55,96 v=82,-21 +p=68,101 v=51,51 +p=68,8 v=-90,-30 +p=78,51 v=-51,-63 +p=4,55 v=-63,97 +p=100,60 v=76,-13 +p=7,91 v=-96,-73 +p=97,17 v=-54,33 +p=85,60 v=69,-3 +p=20,39 v=96,-85 +p=24,12 v=86,-84 +p=34,7 v=-7,-36 +p=30,69 v=-67,97 +p=65,17 v=20,33 +p=39,101 v=-7,-83 +p=38,51 v=-90,-4 +p=99,61 v=-13,59 +p=30,1 v=-67,-96 +p=1,89 v=-85,-83 +p=8,1 v=68,4 +p=89,89 v=-52,85 +p=81,5 v=-55,71 +p=99,60 v=-94,-72 +p=68,70 v=-10,78 +p=81,18 v=89,-95 +p=47,61 v=-39,56 +p=91,71 v=85,59 +p=28,66 v=44,-28 +p=10,64 v=-59,-4 +p=84,10 v=-32,-11 +p=29,52 v=-37,34 +p=78,43 v=-92,12 +p=85,3 v=-71,4 +p=37,85 v=-46,-84 +p=56,21 v=21,-32 +p=17,17 v=15,17 +p=26,87 v=45,-93 +p=57,21 v=-6,40 +p=95,48 v=-33,59 +p=38,59 v=65,-72 +p=59,85 v=-50,-99 +p=17,21 v=86,-45 +p=53,3 v=-28,-46 +p=1,40 v=-54,-91 +p=61,13 v=-40,83 +p=33,35 v=-72,-96 +p=40,14 v=33,-8 +p=29,89 v=53,-59 +p=74,0 v=-22,-42 +p=12,32 v=-65,-4 +p=82,89 v=-12,20 +p=35,71 v=-40,20 +p=14,5 v=95,83 +p=46,44 v=39,92 +p=25,54 v=-66,-47 +p=91,78 v=64,53 +p=14,9 v=25,67 +p=39,29 v=-29,8 +p=20,100 v=95,51 +p=59,41 v=92,-82 +p=15,92 v=93,-73 +p=42,93 v=3,-86 +p=82,93 v=-21,-96 +p=50,9 v=12,-39 +p=81,22 v=-13,99 +p=72,81 v=-51,-93 +p=88,19 v=-72,-14 +p=8,93 v=-85,-15 +p=54,2 v=61,8 +p=44,81 v=66,41 +p=78,10 v=90,8 +p=19,53 v=68,4 +p=80,43 v=9,46 +p=11,38 v=-66,88 +p=31,3 v=4,-2 +p=49,28 v=-74,21 +p=27,15 v=54,-88 +p=96,87 v=-50,-67 +p=94,94 v=-5,-97 +p=16,89 v=73,23 +p=93,32 v=-53,93 +p=47,17 v=-29,92 +p=10,78 v=16,35 +p=55,33 v=-60,-17 +p=55,73 v=-68,-22 +p=100,62 v=17,-69 +p=67,91 v=-49,45 +p=68,53 v=-42,-41 +p=35,73 v=54,47 +p=20,63 v=-85,-12 +p=23,16 v=-87,33 +p=70,55 v=50,-16 +p=92,6 v=41,-59 +p=9,97 v=-37,47 +p=48,48 v=42,40 +p=96,37 v=-90,32 +p=66,13 v=-60,91 +p=62,46 v=-50,18 +p=11,15 v=98,77 +p=42,78 v=1,47 +p=10,40 v=15,-48 +p=88,44 v=7,-75 +p=27,53 v=-70,-9 +p=21,7 v=-56,96 +p=92,81 v=-22,69 +p=57,65 v=92,-34 +p=85,63 v=77,11 +p=92,2 v=-30,21 +p=59,16 v=73,-70 +p=16,11 v=86,-89 +p=82,16 v=80,-36 +p=41,30 v=-49,19 +p=13,6 v=14,73 +p=67,99 v=-91,51 +p=37,20 v=-65,-37 +p=85,16 v=99,-14 +p=1,39 v=-44,56 +p=37,29 v=74,5 +p=44,51 v=-18,93 +p=43,9 v=-55,-84 +p=5,10 v=-65,26 +p=51,90 v=-59,-96 +p=55,98 v=-9,23 +p=0,94 v=88,-49 +p=91,43 v=-14,-72 +p=93,43 v=-69,-94 +p=84,100 v=-12,54 +p=23,46 v=85,78 +p=79,37 v=39,-10 +p=1,23 v=99,-79 +p=73,50 v=-51,84 +p=78,58 v=-31,-16 +p=75,44 v=69,71 +p=27,5 v=-87,14 +p=95,91 v=-33,63 +p=22,94 v=-5,-37 +p=36,11 v=-5,-60 +p=18,3 v=-64,-27 +p=44,14 v=24,-92 +p=96,40 v=65,-92 +p=47,1 v=84,25 +p=93,22 v=68,-48 +p=14,32 v=-24,37 +p=99,17 v=78,-89 +p=53,36 v=10,58 +p=44,44 v=-78,-60 +p=15,28 v=-96,-20 +p=96,61 v=-81,-45 +p=58,87 v=-9,7 +p=20,43 v=84,-22 +p=50,42 v=-18,68 +p=74,23 v=-12,42 +p=12,57 v=-94,-94 +p=49,49 v=-89,40 +p=47,98 v=-67,-8 +p=84,17 v=-62,11 +p=31,6 v=-57,-42 +p=28,67 v=66,-81 +p=0,3 v=-88,-13 +p=51,76 v=82,76 +p=67,81 v=87,-14 +p=84,78 v=39,41 +p=39,74 v=72,35 +p=30,10 v=64,-77 +p=10,31 v=11,-4 +p=6,90 v=-4,76 +p=90,24 v=-2,-23 +p=8,39 v=-57,-27 +p=31,69 v=93,-25 +p=79,38 v=39,-35 +p=69,31 v=70,30 +p=1,16 v=7,73 +p=46,9 v=-99,-70 +p=53,16 v=-94,-84 +p=32,60 v=33,-69 +p=62,22 v=-99,-4 +p=66,3 v=98,20 +p=4,76 v=46,-75 +p=50,71 v=-90,22 +p=57,12 v=31,-15 +p=59,84 v=-50,-65 +p=33,0 v=76,-48 +p=58,76 v=-30,44 +p=6,69 v=6,35 +p=74,91 v=-61,-43 +p=36,92 v=-58,60 +p=2,78 v=-48,-98 +p=43,91 v=53,76 +p=34,101 v=-77,79 +p=40,44 v=-68,28 +p=71,64 v=47,-48 +p=54,7 v=84,15 +p=54,75 v=-60,-31 +p=14,40 v=86,12 +p=80,29 v=-92,-26 +p=8,47 v=-33,-69 +p=2,41 v=12,-9 +p=39,60 v=-38,59 +p=13,22 v=86,-20 +p=25,12 v=-57,11 +p=60,47 v=96,96 +p=50,51 v=-48,-82 +p=85,40 v=89,74 +p=99,4 v=-94,-21 +p=75,7 v=29,-73 +p=28,58 v=-80,24 +p=46,94 v=-9,56 +p=24,65 v=-76,62 +p=50,2 v=-20,70 +p=85,55 v=-5,66 +p=38,11 v=43,36 +p=53,54 v=53,24 +p=18,45 v=65,96 +p=94,22 v=16,80 +p=79,28 v=75,-69 +p=30,38 v=-15,-29 +p=5,23 v=-4,49 +p=8,98 v=96,-99 +p=7,60 v=-14,47 +p=96,17 v=88,-73 +p=48,23 v=-41,35 +p=17,31 v=-26,-23 +p=13,52 v=66,37 +p=58,19 v=41,55 +p=25,9 v=-77,-89 +p=3,92 v=55,-80 +p=74,95 v=20,-77 +p=26,70 v=43,72 +p=54,4 v=96,-18 +p=63,8 v=-97,49 +p=23,51 v=87,-75 +p=24,18 v=85,36 +p=8,52 v=6,-13 +p=97,50 v=17,-72 +p=47,66 v=-25,6 +p=38,78 v=3,-93 +p=62,6 v=5,77 +p=56,74 v=-70,-6 +p=94,99 v=9,34 +p=19,92 v=-18,26 +p=35,54 v=-47,-69 +p=92,8 v=-13,42 +p=47,86 v=12,-90 +p=12,83 v=-68,2 +p=0,18 v=-75,-89 +p=11,99 v=-99,14 +p=88,20 v=62,21 +p=27,53 v=53,-47 +p=17,44 v=-5,-91 +p=57,10 v=66,-65 +p=66,95 v=-71,-12 +p=38,21 v=23,95 +p=68,69 v=-31,35 +p=87,71 v=50,72 +p=98,12 v=47,33 +p=94,21 v=66,51 +p=53,97 v=-16,-93 +p=59,35 v=6,39 +p=12,88 v=-86,88 +p=85,16 v=39,8 +p=38,85 v=35,80 +p=44,9 v=-48,11 +p=71,18 v=-82,39 +p=85,14 v=-74,-73 +p=88,22 v=-42,36 +p=8,6 v=-58,38 +p=21,58 v=-66,9 +p=25,17 v=-68,95 +p=89,16 v=-34,-86 +p=33,54 v=64,-88 +p=57,8 v=54,51 +p=40,18 v=-98,58 +p=91,22 v=-34,-53 +p=75,81 v=-70,26 +p=89,70 v=-2,69 +p=62,6 v=-1,-92 +p=78,24 v=-82,-42 +p=47,7 v=-75,83 +p=86,8 v=-63,95 +p=80,64 v=-36,-79 +p=69,95 v=-30,29 +p=46,86 v=85,20 +p=76,35 v=-82,-51 +p=33,15 v=-17,55 +p=40,58 v=-2,-11 +p=76,31 v=39,2 +p=46,82 v=-15,-45 +p=14,53 v=36,-16 +p=98,66 v=68,-3 +p=83,38 v=35,-87 +p=41,9 v=53,70 +p=35,33 v=-68,-68 +p=53,66 v=62,97 +p=75,80 v=49,-62 +p=66,70 v=-50,47 +p=78,80 v=7,64 +p=82,16 v=85,-81 +p=58,25 v=11,-70 +p=36,72 v=33,72 +p=66,92 v=-91,10 +p=24,52 v=-98,22 +p=74,7 v=-36,-79 +p=46,26 v=-61,-90 +p=52,24 v=53,-88 +p=92,26 v=31,78 +p=60,52 v=80,-81 +p=82,78 v=-81,-49 +p=10,3 v=-15,-55 +p=91,31 v=99,77 +p=75,50 v=-91,40 +p=49,71 v=93,91 +p=1,94 v=-54,54 +p=96,50 v=39,18 +p=0,3 v=-53,33 +p=34,9 v=-17,-8 +p=96,28 v=68,-63 +p=25,4 v=66,21 +p=94,74 v=82,-89 +p=47,66 v=-17,87 +p=58,23 v=63,83 +p=13,82 v=-74,75 +p=29,85 v=40,79 +p=57,7 v=50,83 +p=7,88 v=-37,-16 +p=81,61 v=-10,34 +p=6,32 v=33,-60 +p=63,7 v=1,98 +p=59,29 v=-31,-85 +p=85,91 v=19,-18 +p=22,39 v=21,90 +p=25,13 v=75,89 +p=14,100 v=-27,30 +p=33,6 v=97,-53 +p=84,83 v=-22,38 +p=100,69 v=77,-38 +p=2,67 v=-14,-25 +p=71,71 v=-53,73 +p=9,43 v=-52,98 +p=55,76 v=-60,94 +p=49,91 v=-35,-95 +p=77,68 v=26,12 +p=41,91 v=-17,-15 +p=1,69 v=-44,72 +p=32,61 v=4,59 +p=94,12 v=-33,30 +p=1,35 v=96,49 +p=72,64 v=-61,-53 +p=76,93 v=38,-37 +p=97,9 v=33,61 +p=60,32 v=80,18 +p=16,68 v=15,-29 +p=99,72 v=66,44 +p=99,18 v=56,99 +p=42,11 v=-88,11 +p=57,69 v=-2,-2 +p=39,57 v=26,-51 +p=34,15 v=73,42 +p=56,55 v=-61,-75 +p=89,1 v=67,-27 +p=21,100 v=5,70 +p=85,11 v=-35,63 +p=16,35 v=47,-63 +p=98,0 v=93,-2 +p=51,89 v=-9,85 +p=50,32 v=84,-42 +p=29,63 v=78,-76 +p=92,86 v=89,10 +p=27,11 v=-77,51 +p=65,21 v=-59,68 +p=84,68 v=20,-50 +p=19,2 v=-24,-36 +p=25,78 v=25,-85 +p=90,92 v=59,-87 +p=70,100 v=10,-52 +p=48,78 v=3,54 +p=85,81 v=30,44 +p=53,65 v=41,-67 +p=13,95 v=82,-29 +p=5,19 v=95,75 +p=37,96 v=-68,26 +p=83,16 v=-5,-9 +p=31,17 v=4,-20 +p=83,34 v=-83,-76 +p=50,88 v=93,-5 +p=66,36 v=-30,58 +p=11,29 v=-44,83 +p=31,31 v=-77,-51 +p=26,85 v=14,-18 +p=8,76 v=65,69 +p=60,70 v=-40,47 +p=69,70 v=22,64 +p=85,53 v=18,12 +p=97,93 v=-58,-57 +p=52,83 v=92,-9 +p=20,92 v=30,50 +p=88,73 v=32,3 +p=83,16 v=-42,-14 +p=57,89 v=-29,20 +p=50,19 v=73,8 +p=8,101 v=-94,-68 +p=12,77 v=-4,-84 +p=63,28 v=-84,91 +p=46,25 v=13,-95 +p=93,21 v=88,-26 +p=10,54 v=-24,72 +p=69,16 v=-92,-30 +p=26,68 v=21,97 +p=56,30 v=-90,-51 +p=62,69 v=-1,-50 +p=7,6 v=55,-39 +p=63,78 v=76,92 +p=57,55 v=-51,-19 +p=70,62 v=18,37 +p=88,26 v=-61,82 +p=80,50 v=-73,99 +p=40,1 v=-78,86 +p=35,85 v=81,-12 +p=17,74 v=56,47 +p=36,99 v=64,-15 +p=56,18 v=-29,-14 +p=42,44 v=-18,46 +p=84,4 v=-63,-2 +p=97,75 v=27,-62 +p=47,71 v=54,-50 +p=26,101 v=-67,-83 +p=30,74 v=-57,66`) + require.Equal(t, 0, r) +} diff --git a/2024/go/day14/input.txt b/2024/go/day14/input.txt new file mode 100644 index 0000000..179e1e7 --- /dev/null +++ b/2024/go/day14/input.txt @@ -0,0 +1,500 @@ +p=80,75 v=69,72 +p=88,10 v=-28,-23 +p=79,61 v=79,59 +p=37,102 v=92,-43 +p=12,22 v=-5,-95 +p=60,13 v=-30,-42 +p=3,59 v=-96,-88 +p=85,33 v=-43,-41 +p=44,14 v=63,45 +p=6,6 v=-34,-86 +p=47,102 v=12,42 +p=36,88 v=-88,-93 +p=78,27 v=-18,52 +p=96,64 v=-62,-34 +p=49,99 v=-78,-15 +p=57,31 v=-80,21 +p=25,57 v=8,-84 +p=69,20 v=81,61 +p=80,5 v=-11,-30 +p=2,35 v=-85,77 +p=9,12 v=-4,36 +p=37,68 v=12,-69 +p=47,88 v=-8,-90 +p=72,68 v=59,-86 +p=55,38 v=-68,-94 +p=60,58 v=41,37 +p=76,87 v=-1,-18 +p=89,9 v=38,92 +p=100,67 v=17,-53 +p=83,73 v=80,32 +p=77,19 v=-54,-20 +p=10,86 v=-65,36 +p=13,88 v=-64,-84 +p=50,29 v=-17,-29 +p=79,38 v=89,-57 +p=55,57 v=-68,22 +p=71,82 v=-80,52 +p=37,83 v=-68,-43 +p=25,5 v=81,-22 +p=83,54 v=-32,-75 +p=27,95 v=-77,-55 +p=70,97 v=-72,-4 +p=3,84 v=-60,-60 +p=16,29 v=-35,99 +p=39,39 v=37,-38 +p=76,94 v=90,60 +p=18,21 v=-86,-26 +p=22,84 v=-16,66 +p=45,83 v=-40,-43 +p=35,52 v=54,3 +p=30,21 v=14,36 +p=69,61 v=69,-66 +p=52,22 v=-28,33 +p=9,21 v=-85,-73 +p=87,32 v=79,52 +p=28,85 v=-35,85 +p=32,58 v=-49,89 +p=22,75 v=85,44 +p=45,19 v=-88,61 +p=97,59 v=98,-75 +p=70,81 v=82,7 +p=97,102 v=-23,-8 +p=92,68 v=89,72 +p=24,42 v=-63,-97 +p=21,64 v=-45,-47 +p=58,3 v=-69,51 +p=33,68 v=19,-20 +p=27,6 v=-89,-21 +p=28,81 v=-67,-8 +p=59,83 v=-66,-82 +p=3,14 v=-3,-1 +p=19,65 v=15,-25 +p=57,37 v=53,-29 +p=36,84 v=-4,-84 +p=55,96 v=82,-21 +p=68,101 v=51,51 +p=68,8 v=-90,-30 +p=78,51 v=-51,-63 +p=4,55 v=-63,97 +p=100,60 v=76,-13 +p=7,91 v=-96,-73 +p=97,17 v=-54,33 +p=85,60 v=69,-3 +p=20,39 v=96,-85 +p=24,12 v=86,-84 +p=34,7 v=-7,-36 +p=30,69 v=-67,97 +p=65,17 v=20,33 +p=39,101 v=-7,-83 +p=38,51 v=-90,-4 +p=99,61 v=-13,59 +p=30,1 v=-67,-96 +p=1,89 v=-85,-83 +p=8,1 v=68,4 +p=89,89 v=-52,85 +p=81,5 v=-55,71 +p=99,60 v=-94,-72 +p=68,70 v=-10,78 +p=81,18 v=89,-95 +p=47,61 v=-39,56 +p=91,71 v=85,59 +p=28,66 v=44,-28 +p=10,64 v=-59,-4 +p=84,10 v=-32,-11 +p=29,52 v=-37,34 +p=78,43 v=-92,12 +p=85,3 v=-71,4 +p=37,85 v=-46,-84 +p=56,21 v=21,-32 +p=17,17 v=15,17 +p=26,87 v=45,-93 +p=57,21 v=-6,40 +p=95,48 v=-33,59 +p=38,59 v=65,-72 +p=59,85 v=-50,-99 +p=17,21 v=86,-45 +p=53,3 v=-28,-46 +p=1,40 v=-54,-91 +p=61,13 v=-40,83 +p=33,35 v=-72,-96 +p=40,14 v=33,-8 +p=29,89 v=53,-59 +p=74,0 v=-22,-42 +p=12,32 v=-65,-4 +p=82,89 v=-12,20 +p=35,71 v=-40,20 +p=14,5 v=95,83 +p=46,44 v=39,92 +p=25,54 v=-66,-47 +p=91,78 v=64,53 +p=14,9 v=25,67 +p=39,29 v=-29,8 +p=20,100 v=95,51 +p=59,41 v=92,-82 +p=15,92 v=93,-73 +p=42,93 v=3,-86 +p=82,93 v=-21,-96 +p=50,9 v=12,-39 +p=81,22 v=-13,99 +p=72,81 v=-51,-93 +p=88,19 v=-72,-14 +p=8,93 v=-85,-15 +p=54,2 v=61,8 +p=44,81 v=66,41 +p=78,10 v=90,8 +p=19,53 v=68,4 +p=80,43 v=9,46 +p=11,38 v=-66,88 +p=31,3 v=4,-2 +p=49,28 v=-74,21 +p=27,15 v=54,-88 +p=96,87 v=-50,-67 +p=94,94 v=-5,-97 +p=16,89 v=73,23 +p=93,32 v=-53,93 +p=47,17 v=-29,92 +p=10,78 v=16,35 +p=55,33 v=-60,-17 +p=55,73 v=-68,-22 +p=100,62 v=17,-69 +p=67,91 v=-49,45 +p=68,53 v=-42,-41 +p=35,73 v=54,47 +p=20,63 v=-85,-12 +p=23,16 v=-87,33 +p=70,55 v=50,-16 +p=92,6 v=41,-59 +p=9,97 v=-37,47 +p=48,48 v=42,40 +p=96,37 v=-90,32 +p=66,13 v=-60,91 +p=62,46 v=-50,18 +p=11,15 v=98,77 +p=42,78 v=1,47 +p=10,40 v=15,-48 +p=88,44 v=7,-75 +p=27,53 v=-70,-9 +p=21,7 v=-56,96 +p=92,81 v=-22,69 +p=57,65 v=92,-34 +p=85,63 v=77,11 +p=92,2 v=-30,21 +p=59,16 v=73,-70 +p=16,11 v=86,-89 +p=82,16 v=80,-36 +p=41,30 v=-49,19 +p=13,6 v=14,73 +p=67,99 v=-91,51 +p=37,20 v=-65,-37 +p=85,16 v=99,-14 +p=1,39 v=-44,56 +p=37,29 v=74,5 +p=44,51 v=-18,93 +p=43,9 v=-55,-84 +p=5,10 v=-65,26 +p=51,90 v=-59,-96 +p=55,98 v=-9,23 +p=0,94 v=88,-49 +p=91,43 v=-14,-72 +p=93,43 v=-69,-94 +p=84,100 v=-12,54 +p=23,46 v=85,78 +p=79,37 v=39,-10 +p=1,23 v=99,-79 +p=73,50 v=-51,84 +p=78,58 v=-31,-16 +p=75,44 v=69,71 +p=27,5 v=-87,14 +p=95,91 v=-33,63 +p=22,94 v=-5,-37 +p=36,11 v=-5,-60 +p=18,3 v=-64,-27 +p=44,14 v=24,-92 +p=96,40 v=65,-92 +p=47,1 v=84,25 +p=93,22 v=68,-48 +p=14,32 v=-24,37 +p=99,17 v=78,-89 +p=53,36 v=10,58 +p=44,44 v=-78,-60 +p=15,28 v=-96,-20 +p=96,61 v=-81,-45 +p=58,87 v=-9,7 +p=20,43 v=84,-22 +p=50,42 v=-18,68 +p=74,23 v=-12,42 +p=12,57 v=-94,-94 +p=49,49 v=-89,40 +p=47,98 v=-67,-8 +p=84,17 v=-62,11 +p=31,6 v=-57,-42 +p=28,67 v=66,-81 +p=0,3 v=-88,-13 +p=51,76 v=82,76 +p=67,81 v=87,-14 +p=84,78 v=39,41 +p=39,74 v=72,35 +p=30,10 v=64,-77 +p=10,31 v=11,-4 +p=6,90 v=-4,76 +p=90,24 v=-2,-23 +p=8,39 v=-57,-27 +p=31,69 v=93,-25 +p=79,38 v=39,-35 +p=69,31 v=70,30 +p=1,16 v=7,73 +p=46,9 v=-99,-70 +p=53,16 v=-94,-84 +p=32,60 v=33,-69 +p=62,22 v=-99,-4 +p=66,3 v=98,20 +p=4,76 v=46,-75 +p=50,71 v=-90,22 +p=57,12 v=31,-15 +p=59,84 v=-50,-65 +p=33,0 v=76,-48 +p=58,76 v=-30,44 +p=6,69 v=6,35 +p=74,91 v=-61,-43 +p=36,92 v=-58,60 +p=2,78 v=-48,-98 +p=43,91 v=53,76 +p=34,101 v=-77,79 +p=40,44 v=-68,28 +p=71,64 v=47,-48 +p=54,7 v=84,15 +p=54,75 v=-60,-31 +p=14,40 v=86,12 +p=80,29 v=-92,-26 +p=8,47 v=-33,-69 +p=2,41 v=12,-9 +p=39,60 v=-38,59 +p=13,22 v=86,-20 +p=25,12 v=-57,11 +p=60,47 v=96,96 +p=50,51 v=-48,-82 +p=85,40 v=89,74 +p=99,4 v=-94,-21 +p=75,7 v=29,-73 +p=28,58 v=-80,24 +p=46,94 v=-9,56 +p=24,65 v=-76,62 +p=50,2 v=-20,70 +p=85,55 v=-5,66 +p=38,11 v=43,36 +p=53,54 v=53,24 +p=18,45 v=65,96 +p=94,22 v=16,80 +p=79,28 v=75,-69 +p=30,38 v=-15,-29 +p=5,23 v=-4,49 +p=8,98 v=96,-99 +p=7,60 v=-14,47 +p=96,17 v=88,-73 +p=48,23 v=-41,35 +p=17,31 v=-26,-23 +p=13,52 v=66,37 +p=58,19 v=41,55 +p=25,9 v=-77,-89 +p=3,92 v=55,-80 +p=74,95 v=20,-77 +p=26,70 v=43,72 +p=54,4 v=96,-18 +p=63,8 v=-97,49 +p=23,51 v=87,-75 +p=24,18 v=85,36 +p=8,52 v=6,-13 +p=97,50 v=17,-72 +p=47,66 v=-25,6 +p=38,78 v=3,-93 +p=62,6 v=5,77 +p=56,74 v=-70,-6 +p=94,99 v=9,34 +p=19,92 v=-18,26 +p=35,54 v=-47,-69 +p=92,8 v=-13,42 +p=47,86 v=12,-90 +p=12,83 v=-68,2 +p=0,18 v=-75,-89 +p=11,99 v=-99,14 +p=88,20 v=62,21 +p=27,53 v=53,-47 +p=17,44 v=-5,-91 +p=57,10 v=66,-65 +p=66,95 v=-71,-12 +p=38,21 v=23,95 +p=68,69 v=-31,35 +p=87,71 v=50,72 +p=98,12 v=47,33 +p=94,21 v=66,51 +p=53,97 v=-16,-93 +p=59,35 v=6,39 +p=12,88 v=-86,88 +p=85,16 v=39,8 +p=38,85 v=35,80 +p=44,9 v=-48,11 +p=71,18 v=-82,39 +p=85,14 v=-74,-73 +p=88,22 v=-42,36 +p=8,6 v=-58,38 +p=21,58 v=-66,9 +p=25,17 v=-68,95 +p=89,16 v=-34,-86 +p=33,54 v=64,-88 +p=57,8 v=54,51 +p=40,18 v=-98,58 +p=91,22 v=-34,-53 +p=75,81 v=-70,26 +p=89,70 v=-2,69 +p=62,6 v=-1,-92 +p=78,24 v=-82,-42 +p=47,7 v=-75,83 +p=86,8 v=-63,95 +p=80,64 v=-36,-79 +p=69,95 v=-30,29 +p=46,86 v=85,20 +p=76,35 v=-82,-51 +p=33,15 v=-17,55 +p=40,58 v=-2,-11 +p=76,31 v=39,2 +p=46,82 v=-15,-45 +p=14,53 v=36,-16 +p=98,66 v=68,-3 +p=83,38 v=35,-87 +p=41,9 v=53,70 +p=35,33 v=-68,-68 +p=53,66 v=62,97 +p=75,80 v=49,-62 +p=66,70 v=-50,47 +p=78,80 v=7,64 +p=82,16 v=85,-81 +p=58,25 v=11,-70 +p=36,72 v=33,72 +p=66,92 v=-91,10 +p=24,52 v=-98,22 +p=74,7 v=-36,-79 +p=46,26 v=-61,-90 +p=52,24 v=53,-88 +p=92,26 v=31,78 +p=60,52 v=80,-81 +p=82,78 v=-81,-49 +p=10,3 v=-15,-55 +p=91,31 v=99,77 +p=75,50 v=-91,40 +p=49,71 v=93,91 +p=1,94 v=-54,54 +p=96,50 v=39,18 +p=0,3 v=-53,33 +p=34,9 v=-17,-8 +p=96,28 v=68,-63 +p=25,4 v=66,21 +p=94,74 v=82,-89 +p=47,66 v=-17,87 +p=58,23 v=63,83 +p=13,82 v=-74,75 +p=29,85 v=40,79 +p=57,7 v=50,83 +p=7,88 v=-37,-16 +p=81,61 v=-10,34 +p=6,32 v=33,-60 +p=63,7 v=1,98 +p=59,29 v=-31,-85 +p=85,91 v=19,-18 +p=22,39 v=21,90 +p=25,13 v=75,89 +p=14,100 v=-27,30 +p=33,6 v=97,-53 +p=84,83 v=-22,38 +p=100,69 v=77,-38 +p=2,67 v=-14,-25 +p=71,71 v=-53,73 +p=9,43 v=-52,98 +p=55,76 v=-60,94 +p=49,91 v=-35,-95 +p=77,68 v=26,12 +p=41,91 v=-17,-15 +p=1,69 v=-44,72 +p=32,61 v=4,59 +p=94,12 v=-33,30 +p=1,35 v=96,49 +p=72,64 v=-61,-53 +p=76,93 v=38,-37 +p=97,9 v=33,61 +p=60,32 v=80,18 +p=16,68 v=15,-29 +p=99,72 v=66,44 +p=99,18 v=56,99 +p=42,11 v=-88,11 +p=57,69 v=-2,-2 +p=39,57 v=26,-51 +p=34,15 v=73,42 +p=56,55 v=-61,-75 +p=89,1 v=67,-27 +p=21,100 v=5,70 +p=85,11 v=-35,63 +p=16,35 v=47,-63 +p=98,0 v=93,-2 +p=51,89 v=-9,85 +p=50,32 v=84,-42 +p=29,63 v=78,-76 +p=92,86 v=89,10 +p=27,11 v=-77,51 +p=65,21 v=-59,68 +p=84,68 v=20,-50 +p=19,2 v=-24,-36 +p=25,78 v=25,-85 +p=90,92 v=59,-87 +p=70,100 v=10,-52 +p=48,78 v=3,54 +p=85,81 v=30,44 +p=53,65 v=41,-67 +p=13,95 v=82,-29 +p=5,19 v=95,75 +p=37,96 v=-68,26 +p=83,16 v=-5,-9 +p=31,17 v=4,-20 +p=83,34 v=-83,-76 +p=50,88 v=93,-5 +p=66,36 v=-30,58 +p=11,29 v=-44,83 +p=31,31 v=-77,-51 +p=26,85 v=14,-18 +p=8,76 v=65,69 +p=60,70 v=-40,47 +p=69,70 v=22,64 +p=85,53 v=18,12 +p=97,93 v=-58,-57 +p=52,83 v=92,-9 +p=20,92 v=30,50 +p=88,73 v=32,3 +p=83,16 v=-42,-14 +p=57,89 v=-29,20 +p=50,19 v=73,8 +p=8,101 v=-94,-68 +p=12,77 v=-4,-84 +p=63,28 v=-84,91 +p=46,25 v=13,-95 +p=93,21 v=88,-26 +p=10,54 v=-24,72 +p=69,16 v=-92,-30 +p=26,68 v=21,97 +p=56,30 v=-90,-51 +p=62,69 v=-1,-50 +p=7,6 v=55,-39 +p=63,78 v=76,92 +p=57,55 v=-51,-19 +p=70,62 v=18,37 +p=88,26 v=-61,82 +p=80,50 v=-73,99 +p=40,1 v=-78,86 +p=35,85 v=81,-12 +p=17,74 v=56,47 +p=36,99 v=64,-15 +p=56,18 v=-29,-14 +p=42,44 v=-18,46 +p=84,4 v=-63,-2 +p=97,75 v=27,-62 +p=47,71 v=54,-50 +p=26,101 v=-67,-83 +p=30,74 v=-57,66 diff --git a/2024/go/day15/day15.go b/2024/go/day15/day15.go new file mode 100644 index 0000000..349865b --- /dev/null +++ b/2024/go/day15/day15.go @@ -0,0 +1,119 @@ +package day15 + +import ( + _ "adventofcode2024/utils" + _ "adventofcode2024/utils/grid2d" + _ "adventofcode2024/utils/grid2d" + "adventofcode2024/utils/inputs" + "fmt" + _ "regexp" + "strings" + + _ "github.com/deckarep/golang-set/v2" +) + +type Loc struct { + x int + y int +} + +type Queue struct { + elements []Loc +} + +// Push adds an element to the end of the queue +func (q *Queue) Push(value Loc) { + q.elements = append(q.elements, value) +} + +// Pop removes an element from the front of the queue +func (q *Queue) Pop() (Loc, bool) { + if len(q.elements) == 0 { + return Loc{}, false // Return zero and false if the queue is empty + } + value := q.elements[0] + q.elements = q.elements[1:] // Remove the first element + return value, true +} + +// IsEmpty checks if the queue is empty +func (q *Queue) IsEmpty() bool { + return len(q.elements) == 0 +} + +func Part1(input string) int { + var val int + var rloc Loc + in := strings.Split(input, "\n\n") + dirs := map[rune][2]int{ + '<': {-1, 0}, + '>': {1, 0}, + '^': {0, -1}, + 'v': {0, 1}, + } + grid := inputs.ToGrid2D(in[0], "\n", "", ',', func(c string) rune { return rune(c[0]) }) + directions := strings.ReplaceAll(in[1], "\n", "") + fmt.Printf("%v\n", grid.StringWithFormatter(formatter)) + fmt.Printf("%v\n", directions) + found := false + for x := 0; x < grid.SizeX(); x++ { + if found { + break + } + for y := 0; y < grid.SizeY(); y++ { + if grid.Get(x, y) == '@' { + rloc = Loc{x: x, y: y} + found = true + break + } + } + } + fmt.Printf("Robot: %v\n", rloc) + for _, dir := range directions { + q := &Queue{} + x := rloc.x + y := rloc.y + Loop: + for { + x += dirs[dir][0] + y += dirs[dir][1] + switch grid.Get(x, y) { + case 'O': + q.Push(Loc{x: x, y: y}) + case '.': + for !q.IsEmpty() { + grid.Set(x, y, 'O') + loc, _ := q.Pop() + fmt.Printf("%d,%d\n", loc.x, loc.y) + // grid.Set(loc.x, loc.y, 'O') + x -= dirs[dir][0] + y -= dirs[dir][1] + } + grid.Set(rloc.x, rloc.y, '.') + rloc.x = x + rloc.y = y + grid.Set(rloc.x, rloc.y, '@') + break Loop + case '#': + break Loop + } + } + // fmt.Printf("%v\n", grid.StringWithFormatter(formatter)) + } + for x := 0; x < grid.SizeX(); x++ { + for y := 0; y < grid.SizeY(); y++ { + if grid.Get(x, y) == 'O' { + val += (100 * y) + x + } + } + } + return val +} + +func Part2(input string) int { + return 0 +} + +func formatter(p rune, x int, y int) string { + return string(p) +} diff --git a/2024/go/day15/day15_test.go b/2024/go/day15/day15_test.go new file mode 100644 index 0000000..3abc33f --- /dev/null +++ b/2024/go/day15/day15_test.go @@ -0,0 +1,57 @@ +package day15 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`########## +#..O..O.O# +#......O.# +#.OO..O.O# +#..O@..O.# +#O#..O...# +#O..O..O.# +#.OO.O.OO# +#....O...# +########## + +^v>^vv^v>v<>v^v<<><>>v^v^>^<<<><^ +vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<^<^^>>>^<>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^v^^<^^vv< +<>^^^^>>>v^<>vvv^>^^^vv^^>v<^^^^v<>^>vvvv><>>v^<<^^^^^ +^><^><>>><>^^<<^^v>>><^^>v>>>^v><>^v><<<>vvvv>^<><<>^>< +^>><>^v<><^vvv<^^<><^v<<<><<<^^<^>>^<<<^>>^v^>>^v>vv>^<<^v<>><<><<>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^ +<><^^>^^^<>^vv<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<> +^^>vv<^v^v^<>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<>< +v^^>>><<^^<>>^v^v^<<>^<^v^v><^<<<><<^vv>>v>v^<<^`) + require.Equal(t, 10092, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`########## +#..O..O.O# +#......O.# +#.OO..O.O# +#..O@..O.# +#O#..O...# +#O..O..O.# +#.OO.O.OO# +#....O...# +########## + +^v>^vv^v>v<>v^v<<><>>v^v^>^<<<><^ +vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<^<^^>>>^<>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^v^^<^^vv< +<>^^^^>>>v^<>vvv^>^^^vv^^>v<^^^^v<>^>vvvv><>>v^<<^^^^^ +^><^><>>><>^^<<^^v>>><^^>v>>>^v><>^v><<<>vvvv>^<><<>^>< +^>><>^v<><^vvv<^^<><^v<<<><<<^^<^>>^<<<^>>^v^>>^v>vv>^<<^v<>><<><<>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^ +<><^^>^^^<>^vv<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<> +^^>vv<^v^v^<>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<>< +v^^>>><<^^<>>^v^v^<<>^<^v^v><^<<<><<^vv>>v>v^<<^`) + require.Equal(t, 0, r) +} diff --git a/2024/go/day15/input.txt b/2024/go/day15/input.txt new file mode 100644 index 0000000..923444c --- /dev/null +++ b/2024/go/day15/input.txt @@ -0,0 +1,71 @@ +################################################## +#...O.#..O....##O..OO.#O..#.#.......OO...#O.#OO..# +#O#..OO...O..O.O.....O.O.O....OO#.....O#.O.OO..O.# +#........O....#...O......O.OO...#..O.O.#O#....O..# +#..O.OO..O..O.#..O.O.OO.O...O...O......#O.....O..# +#..OO.....O.OO.O#.......O.........O.....O.O.O....# +#.O.#.O.O#......OO........O.O.....OO..O.O.O.#.#O.# +#........#.....#.##O....O.O..OOO.......OOO.#O....# +#.O#.#...OO.....#.......O...O...#O.O.......OO..OO# +#.O...O..#O...#O..O.........O.O..OO..O.......O.OO# +#O.O......O.OO..O.O.......O.OO#O.##...#....#O.O.O# +#.O...O.OO.O....O..O.O...O...#.O....OO..O.O#O#OO.# +#.....O.O..#O.....O.O..##O.O#OO...O...O.O.O......# +##..O...O..OO.O.O.O..OO........#.##.........O.O..# +#..O...O.OO..OOO.O...#..#.........#.O....OO......# +#O....OOO.OO...O##.O.OO..O.O.....O.O.OOO....O.O.O# +#O.O..OO.O..OO............O....O....O..OO...OO..## +#.O...O.O.O.....O..O.O...O.#.......OOO...........# +#O.O...O.....#..O..#O...O.O.O....O#...#.###.....O# +#.O...O.O..#O.#.OO.......O.OO.O...O...........O..# +##O.#O....O.#............O..O..O.....O..O..OO....# +##..#.OO.O.OO.#.O....O...#........#........O.O...# +#..O.OO...O....#..OO.O...........OOOO#..OO#O.....# +#OO.O#...#..#...O#........O.OOO...OO....#O.OO#OOO# +#...OOO............#O.#.@...O.....O#.#.O...O..O..# +#...O...OO.#..O......O..............#OOO......OOO# +#..#OO...O.#O......O..OO.O#...O....OO..O...O.O#O.# +#.#.##...#O........#.O.....#O#.O.OO..OOO..#..O...# +#.#....#...O..O#O..OOO.....#....#......O...O...#.# +#....O....O......O.O.O..........O.O..O.O......O..# +#.#OO#O.OO............O##.##O.O#.O...O#.........O# +##.O.#..........#......#OOOO.OO.#.O.O.O.....O..#.# +#O.....#OO.....O..............#...O.O..O.....OO#.# +#O.O.O..O#OO.O.O....O..O......O..O........OO.....# +##O....O...............................#.O.....O## +##..O...#...O.........O#...#O...O.OO......OO.O..O# +#O..OO.....OOOO.#......O.#OO..O.O...O.O...O.O.O#.# +#..O.....O.O........O.....O.....O#....OO##OOO..#O# +#O..##....OOO..O#.O....O.#...O.....O.O.O......O.O# +#..OO.#O.......O.OO.O#O.O.....O.....OO..OO.OOOO..# +#.#.#OO.O..O.O........O#.#...#..O.O.O.#.O..OO.O.O# +#..O#.OO.O.#.....O...O..OO#..O...O.O#...O.....#.O# +#.OO.OO....O.O..O..#OO.....#......#.#OO..#.#O.O#.# +#...O....#..#......O....O..O#O...O....OO.......O.# +#.#.....O#.......O..O..#O.OOOO..........O.O......# +#.O.O.....OO.O.O.O..#O.O.O..O.OO....O....##.....## +#O..#.OOO##....O.O..OOOO.O...O..O#..........O....# +##.O##...O.O.....O.O#...O.........#...........OOO# +#O#O.....#..O.OOO...O..OO.....OOO............#O..# +################################################## + +^^<^>^^<<^v>^><^^^^^<><^v>v<^vv>^v<^>>v>^vv<>>>>>v^>v>^>^v<^v^>^^>v<<>>^v^v>^>v^>^^^<^^v>>v>^>v<^^vvv<>vvv<^v<>v><><^^<>v^^<^><>>^^>v^>^<><<^><<>v>>vvv<^^v^v^>>v^^>^vv<^<^<^<><>>>^>>^<><^v<^<^v<^^>^<><<^<<^vv^^v^<^^vv>>^v>^v>^<^>^><>^v<>v>^^^<^vv^^<^v><^^^v<<>>>^<^^>^v>>^^<^^>^>><<^>>vv<>v^^<<>^<><>^^v<^v<<>vv><^>><^<^>>^^>v<^>v^>^<<^^^^v^<>^>^v^^vv<><<vv^v>>>v>>>>>^v>^<><<<><>v<>^vv>v<>^v^<>>v>>v^>^vv^vvv^^<<>vv>^>^v>>v^^vv<^v>^^vv<>^v>^>v^^<>^^>^^v<>^^^<^^<>^>^v><<>>^<>>v>>^><^>v<>v^v<>^<<>>v>^v<>^v<^>^^v>v>>^<^^^<<<<>vvv^v><<^^^v^^^>v><<^^v>vv^v>^>^v<>>vv<<^v<>v><^><>>^vv><>><><<>>v>><>v^^<^v<>^<^<^>v^^^>>v<^^<^^^>^^>^>^>^^<>v>vvv^v^>^<^<>v>^^>v<^>v>v>><> +^vv>>>^vv><^v^<>v>^><^^^>^v>><>>^>^<<^^v^^vv>^v^<^v^>vv<<>^>vvv>v>^vvv>>vv^>v^^v^^vv^^<><<<^^><<^>>>^<>v>>^v>v>><>v><<^v^><>v>v>^>>^^><>v>^>^v>^>><<<^vv<>^<<^><^<<><>vv^^v<<>v>v^vvv>^>^>^<>v<>vv>^>>v^^v<>><>>v<>>^^<>v^vvv<><^^v^>vv<^^>>>v>^>^^><<^v>^^>>^^>v<<<><<><>vv^>v>v^>vv><^<>><<>^>vv<<>v><^^^>v^^<^v>v^<>^<<>^^vvv>vvv><<><^><>>><<>>^><^>^><><^^vv<^>^vvv<^>>><<^>><^v<<^>v>^v>v>>^vv^>>><^>v^<>>v>v^v^><^v^v^<^v<>^><^>>v^^>v<^^^v>v>^^^<^^><><^>>v<>v<^v>^^<>v^>^vv<<^<^v^^^>v^vv<>vv>^^<<><^>><<^v<^>v>>^>><<^<>vv^>v><>^vv^^v>v<<>^<><^^>^^><^>>^v>vvvv>^>v><<^^><^v^<^v><^>vvv><^v<>><<^^>^<^<<<v>^v^>^>vv^<><><>^^<^v^^>^^^^^vv<<<^vv<<<>><>v>vv>^^^<^><><<><<>><^vv^^<v<>^^^^<><^^^<>^^<><<>>>^<>v^^>^^>>^v>v^ +^>>v<><<<<v<<<<^v<>v<<^vv<^vv<^^>>v^>^v^>^<>>>v<^<<^^>>vv^^<^^^>^><>>>vv<>vv<>^^>vv^vvvvvv^v>^^<<^<<<>v>^<^v>vv<>^^>^>><^^^v<>^<^v>^><><<<^><>^>^^vv^>^<<<^>^v>^v<<<>^^<^^<<^<^^<>^<<<^v^<>^>vvv><<<^vv^<^><>><><>v^^>v<^<^vv<>><^>v>^v<><>>^v^^^^v^<<><^^v>><>^v^<>>^v>v^^v<^v><>>v><^^<<^v<>v<<^^>><<<^>>vv>^<^>^<^v^<^v>>>>>><^vv<^>v>>v^>>vvv^vvvvvvv>^^>>>^v<>><>^<<<>^><^^v^v<>><^>^>v><>>v^>^<^<^><<^<>vv^^v^<>v<<<^>>vvv^>><<^<^^><^^>>>v>^^^>^vv^<<>^^^<^v>><>>>>v^<>>^^^<>v^^v^>><<>v>>^>^vvv><>^v>vv^v>>^><>^>v<<^>><^^v><^>^^>^>vv><<<^vvvvv<^<^<^<^^<>v^^>^v<^^v<>v>^>^>vv^>v>^^<^<^^v><^<^^v^v<>>^>v^v<^v>>><^v<^<<^v<^vv^^><>^v<><^>v<>vvv^^^>^^^^^v<^^^^v<><<>>>v^v<>v^^^>^vv>v>v>>><>v>vvvv>v>>vvv>^v<>^^v^<^vv^^>^^>>vv<><^vv>^<^>><<>>v>vv^vv<^<<<<>^v<<>>^v<>>>^v><<<><^<^><>>>>v^>v<><^v>v^>^^v^^>v<v<^v^^<<<^v^^vv^vv>vv^>^^vv^<^^<^>>>>^><<>^>^v^<^v>v^v><<>v^<>>v^^^><<^>^>^<^vvv>>^<^><^v>^^<><^^^>^><^^>>v^vvv><^<v>>^<<<<>^vv^>^<^<<>><^>vvv>v>>v^><><>vv>>^vv>>vv<^<>^^^>^>v>^v><^v^>v^^v^>^>vvvvvv<<^^<^<>^^^v><>><<<^^<>v<>vv<^<^v^v>v>v^vv^v<^v^<<<<^^<<>v<<<<<>v<^vv<>^<>><><^<^^<^<>v<>^<<<>vv<^vv<>^^<>v><><<<^<^>v^vv>vvvv^>v<^^^v<<<>>^>>^>>vv>>>v>v^<<>^^v>v^>^<^^<^^>><^^>v>v>^^>v>>>^<>^^v^v>^^<^v>^v><<v^>v^vvv><<^>>v^^>>>^vvvv^>^^v^^>vvv>^v^^^v^<^>v>>>^^<><>vv>^vvv<<>>v^<>^<^<vv^<v>v><^^>^>vv<^^<^^v<>^vvv^^v^vv>>^>v>v<^^<>vv>^<<>^^^>^<^<^>v>vv^^><>^>^v>>^<> +^<^^<^>v<^<^>^^>><<<>v<^^><>>^^<^^>^v^^><^v^^<^vv><>>v<^v^>>>^<>>^>^>^<>^^^<^v<>vv^v^^<^>v>^>><<>>v<><^<<<>v>>^<>>>>v>^v^<<<>^vv<<^>vv>vv>><^><><<>v><^<>v>>>><><>^vv<^v^vv><<^>v>v<<><>^>^v<^>v>v<>v<<>^vv>v><>><<<>>^^^<^^^^<>^>>vv>^v<^>>vv>^^v>^vv^^^v>v>>><<<>>>v>vv<^>^v>vv^^^<><>v<^>><^vv>^<<^<>><<<<^^>^^<><>v><<^v<<<<<^v>v<^^v<<^<>^><<<>>v<<^v>v>>>v<>>v><><^vv<^^<v>vv^<>^^>>>><<<>^^^^v>v>>>>^v><<^^>v^<v<>>^^v>^><^v>^>^^vvvvv>^>v>v>v>v^^^>^<><<^^^^<>^<^v>^>>>>vv>>>v^>^><^^v>>^>>vv<^^<>>vv^^v^<>>>vvv<>^>vv^<<^<^<>vv>^>v>v<^<<><^v^<^^^<^^^^vv^>^^>^^>><>^<^>v>v<^>>^^^^>^^><>vv><^^>v>^^^^v>^v>^v<^v^>v>^>^^^>v>v^^v^v>^v<^^^>^>vv^^vv>vv>v^v<^<^vv^>^^v>^vvvv<>^^v<>><<v<^>><><^><>>^< +^><^v>v^>vvv^^v^vv<>>>v>>vv^^>v^><^^<>v^><>^v^>v>^^>><<^><>v><^v>>>><<<>v^><<<>><<>^v^^^^<^^><><>^^vv^<^v^>>^>^><>vv^>>>>v^<>vv^>>v^<>vv>>><^><^>^vvvv><<^vvv^<>>v^v>><^^^><>>v^>^<^^><<<>vvv^^^v>^v<>v^>v<>v>v<>^v>vvvv<^>^^^v^^<>^<^^v>>^^^><>v^>><^>vv>><^^^v>><^<<^><<>^>^<>vv>vv^^^^<^>^v<>>^v>>>^v<>v<^v<<^v^v<<<^>>v^v^v<<^^v>vv^>v><>v>^vv>^v>>^<<^><>v>^>v>^<<^<>>^^v<>^>v^<>^v>vvv<><<>>^<^^>^<<>^<>vv^^v^^<<>v<<><^<^^<>>><<^v<<^>v<>vv>^>>>>>vv<<><^^vv^>v^<>v<<<>^>^v>vv^^<^v>v<^<>>^vv>v^<>^v^<>^>><><>v>>v>^><^><^>v><<>>^^^<<^v>v>^vv^>>>^^<>v<^<^>>^v^>v<><^>>>vvv^^^^>vv>^>>>><^<>^>v^v>v<^>>>><^^vv><<>vv<>v<>>^>^^<>>vv>>><<>vvv<<>>vv>^<^^v>>v>^<<<><^v^v^>^v^><<>^v><>>^^>v>>>^^>>v<>>>^v>^v^<<^<<<><>vv^>vvv>^^v>v<^v^v^><^v<>^v>^<>><<^v>vv^ +^>v<>>^vvv>>v^vvv>>v^><>><^v<>vv^>^^><<>><^<^>^v<>v>>v^<>>^<<^vv<^^<>^v><<>>^^<<^vv^v>^>^<>v>>>^<^<^<>v<^><<^><<>>vv><<><>^>>v^^>>>^v<^^<v><>><^<<^v>>^vv^v<>^>><>>>^<>>v><>>^^v>>^><^^^>^^>^>^>^vvvvv<^^>>>>v>vv>v>^vv^v<^v>^>^>vv>v<>v<><<>v^v<>><<<v<<>^v^><>v<><^v>^>^><^^^>v<>vvv<<^^v>^vv^<^>v>>>v>^^><^>^v>^v^^>^^v><>>^<^><^^v^^vv<^>^^>^>>vv<^>vv<<<>><><<^^v><^<^<>v^v>^v^<<v^<<<<v^<>v<^^<<^>^v<<><>><><<<^^>v>^^<^^>v>v<^v>^>>v>>v>v><^v^v<^v>^vv^><^v>><<^<^^^^^^>>v>v^<>v>>v<>v^>v><<<^v^<^<^<>^>>v>>>v>^vv>^^<>v^v>v><^v^>v>>^<^v>>>v>v>vv>^^^>vvvv^><^>^^^v<^><>^^<<^<<^^<^^>^<>^<^<^^v<^^<<>>>^v>^^^^^^^^<>v><^<^v><^>^v^^v>v^^<>vv^<^^v<>v^>^v>v<<<<>><>^<^<^<<><>>^<><<^^<>v^>>^vvv^<^^v^^v<<><^>vv>>^v<^^>^^>^>> +^>vv>^^>v^>>^><>>^<>v><<>v>v^^^>>v>>vv^^<<<>v^^v<<>v>>^<>^v<^^^<><^<<>^<>>v^vvv^v^<^>v^<^^<<^^<<^v<><^v^^v^v^v^^>v^><^>vv>>^><^<v>v>><>^v>^^<^>>v^<<>v<v^>vv>vv^>v^vvv^<>^v><<<>v^vv>vv<>^><^<><^v>>v<<^^^><^>^<>v^^v^^><^^>>v^^<>v>><>v<<^^^^^<<><>^vv^<><<>v>>>^><<^<><>^^v^vv>>v^vvv<>><><>^vv^v>^<^<^v>>>><^>>v>^v><<>^^<>^v^<>vv^<^<>^<<>v><^<^^^^>^<>^^^^<^^>v<<<v>v>>^vv>vvv^>v^vv>v^>vv^v<>>>vv>^>>^^^>><^^v^^<^^>vv<^v>v^vv<<^^<>^vv<^vv>vv<>>^<<>^<<>v<<>v<>v^^<>vv>^^>^vv^v>^<>v^v^>vv^^^>^>><>v><>>>v>>>v>v^v^v>v<^>^<^^>v<>>^><^^<^^<^v^v>vvv<^vv<^<><>^<v^>vv^^^>^>^>><<^>>^v^>v^^^v<^^^<^>>v^v<>^<><v><^^v^<^>>^^v^>>^<<<>v<^^^^<<^^v^^^^^>vv^>>v<^><<<>v^<>v>^ +^^<<>^<^<<<>v^^v>v>>^^^^^^<><^^<<^^v<>^^<^>^v>>>><><<<^^v^<><<<><<^v<<^v>vvv>><^>^>^><^>^>>>v^<<<<^>>v^><^^vv>vv<^>><^^v^^vv<>^^v<>^>>^^vv^^>>v^>>><v<^v^vvv>vvv>^v>^^^<><>v>v><<><^v>>>^<<^vv^^>>^<^^v^>v^<><<^>v>^v^<<><><>v^>>>v>><<^^v^vv^v<><^vvvv^>^><>>>>v^>>^vvv^<><^v>vv<>^><><^>v>vvvv>^^>vvv><^>^v>>^>v>^v<>>>>^^>^>v>^^>^^>>><^<^^v^^^^>^v>v<v^vvv>>v^<^v^v<^v^v<^<<>^v^<>>v>v>^^vv>^v><>^^<<<>v<>v>v><<<<^vv>^>>v><v<^v>v<<>><<>^><<^>>vvvv^<^v^^>>vv>><^vv<^^^>>>v^>^v>vvvv^>>v^><<^<^>^>^>v><><<<^<^vv^<<<>^<<^^<<>v<>><<<>>>>^>v>^^><>^><v>^>^v<^v^v>^<^v^^><<<>v>>v^vv>^^^^v><^>><><<^^<>vv^v^<>^>^<>v<^^>>>^>^>><<<><^>>^v><<>vv>><<>v^^>v>vv<^v<^>v^v>>^v<><<<>^v^<><^v<<vv>>^>^>^>>v>^<^v<<<>^v^v>^v<>v>v>><^<<><>v^^^v^<<^v>>><^^^v>vv>v<>v<>^^> +>^^<^v>v<<^<>^^>^<>vv>v^>^<^v^^>^>vv^<>><<>^v>^>v^v<^^^>v<>v>>>vvv<>^^^vv<^v<^v^<^<>>v<>^><<^<^><^<vv^>><<>>^vv>vv^^>v^^vv<>><>^vv^>v>>^^<^^v^>^^v<>^<<<<^v^^v>>v^^v>^^<^<^>>v^v>^<^v<>>^vvv<^vv>^<<<>^^^<^^^vv^^^<>^^v>>>><^>vvv<^><>^<><>^^>>^<<^>^^<>vv^vv<>v<^>vvv><^<^v>vv<^^^>v>>vv<>><^^v^^vv>^<<^<<^>v^>v^<>^<>v^v<>v><^>>^^<><>>v^vv^^<^>v<>>>^>>><<><>>^v>^^>>v><<^^v<>^<<><>>>>^>><><^>>>v^vvv^^^<><>^<^v<>>v^>>vvv>^<>^vv<>^v>><>><>v^v>^^>vv<^<<^^^v<><^<^v>vv>^<>v<<^vv^^vvv>><>>v<>v^^vv^>^<<^^v<^>v<^^<<^vv><>>^v>^^vvvv>^<^v^^vv><^^^v<>>v^v^^>v^^^^^^^>^v<<><<<^vv<<^vv^<<^<<>>><<><<><>vv>>^^>>>>^^v^^v<<>>^<>>>^^<>>>vv><<>>>^<^<>vv>>v^>v>^>>>^>^>>>>>>^>>><^^v><<><^vvv^>^v^>^>>^v>v^v<>^><^>v +^^^<^vv>^<<^<<><^<<>v^<^^vv><^<>^v>v<>^v^^vvv<^<>vvv^>><^vvv<>^>><>>^>v<>>>>>v^^<^<>^>^<^<<^^<>^>^>^v^v<<>v>^v>>>>^>v>>^v<>><>^>^>v<^<^<^<^<<<>^^>>^<>vvv<<>><>^>vv^>^^v^^>v<^^>>>v^v<><^^vvv>v<<^<^>^^<<^v>>><^^<^^v<>v^><>^v^<<>v>>v>^^>><^<<<^><^^vvv^>^>v<^v^>^><<^v<>>^><>^<>>vv<><>v^<>v^<^>>vv><^v^v<<<>v>^<^v^v<<<^<>>vv^<^^>>^v^<v<^vvv<>v^v>><^v>>^v^^^><<^<^<^>^vvvv<^v>^>>>^v<<><<^>><^^v^^^v^>vvv^^>^v<^>vv^^^v>><<>vv>>^^<>^v>v^v<<^^^>>^vv<>>v>vvv<^v<<>^^v<^>v>^>v>^<>v^v<>>>^vvv^v^<>>>>^v^<<>>>>v<>>^^^^><<^^^^<>^>^<>><<^<<>>^>>vvvvvv^><^^>^^^>^>v<^^^^>>v>v<><^<^^>>^>>^v>vv^vv^v<>>v<<<><vv^<^v>v><>^v>v<^<>>^>>v<<<>^vvv>v^<<^^>^<>vv><>^^^v>v^>vv<^^<>^<>v>vvv<^><<<>^>>^^>v^v<<>^v>> +v^^v<v>>><<>^>^>^v><^^v<^^^^^v^^<>><>>>^<<><^<<^>^<^^^<>>>>v<<>>>vvvv^v^<>v^^>>^>>^<^^v^>v<>^>vv<>>>>vvv>v^v^vv>v<>>vv^<>v^<>>v<<>vv<<>^>vv<>v>^<><^v^>>^<^<<>v^<<^><><>^^><><<>>v<^vv<>^>>v<><^>^<<>^>v^><><>^v>^<>v<^>^v>^>>^>^<<><<^>^><><^v^><^vvvv><>^v>^>vv<^v><^^^^>><^v<<><>v^^^^^^^vvv>^<<<<>v^<<^><<^>vv<^><^vv^>^vvv^>>>><<<^^vv><^><^>>v^^>^^><^vvv<<^vv^^<^>^>v^vv<><^>v>v><>>^>>^^^^^v<>^^>v^>^>^^<^<^^vv^^vv^>vv>vvvv<>v^>^<^^v>^>^vv>v^v<<><^v>>>vvv^^<<>><^^>^vvv^>v<^>v>>^<>^<>v><^<>><<<>><<<^>>>v>vvv^>><>>>>^>v>>v>^>^>>><>^><<^<^>v^^v^>^^>^>^<>^v^>^v<>v^<<>v^v>v><^>>v>><<>v><<>vvv>><^^v<>>v>v^>>vv>^<^>^<>v<<^vv<^>v^v<^<<^<^v<^v><^vvv>^<>^vv^>>><^^<^v<^^<^v^vv<<<>^v>v<<>v>>< +<>>vv^v>v<^<^^v^v^<^>>><^^<<<^<<^<^<<>v^^^^^<^>v^>vvv^>><^<<>>v^<><><<^^<^^><<>>v^v^v>><^^>>v>v<^<><^^><<>^<^v^^v>^^<^v^^v^<^v>^<><>^>^^^^<><^^<<>v>^<><^<><^v^^<^^<^><^<<^^^>v<<>^>>>>>>v>^>^>><^^>>^v>^v>><^vv^v<<^^^<^v^v^>v^v>^<<^vvvv>v>^^>><<<<>^v^v^><><><<<>><^<^^^^vv<>>>>>^v>>>>>v^<^<>vv^<^^v^^>>^^<^<^<><>>^><^>^<^^>v<^^>><^<^vv^v^<<^>>>v<<^>><<^v<^<^<>v<^vv^^^v<^v<^^vv>^vv>>>v^^^>><>v^>><<>v>^^^<^^<<>><>v>>v^v<^>vvvv^^^^vv><>v>^v>v^v><<>^vv^v>>^<>^^^^^v^v>^^vv>v>>>v>^^^vvvv^^>^^><^vv><><>^v^>>v>v^><><^^^^<^vv>^^v>^^>^vvv^^>^>^^v^<^>v^vv<>vv^<<><>^>vv^^v>vv^^<<>>^v^^<<^>^><>v>>^<<v>^v<<<<>^v>^^^>>v<^^v>>v^>v>>>^vv^>><<><><^^^v<^>>vv>>>^^^vv>>v><^^>v><>>^>v>v^<>vv<<^vv>>^>^vv>vvv^>>vv^^<>><>v^>^v>v^v>^>>v<^v^<><>^v<>>><<>^v><>v^vvv>vvvv>^<< +^^><<<^^v>^v<<^<^v<^v^v><^v<^>^v<><^^<<^>><>vv^vvv^v>v<>v<<>vv><>vvv<><^vv^^<<^<^v<>^<^<><<>^>>^v>>^v^>><^>^><^vv>>>>^>vv^v^<<>^^<^v^<v>>^<v^v>v>v><^>^vv>v<^v^vv<>>^>>^>v^^^^^><<>vv^vv<^^>^>^<<^^^>v<>vv<^^<^v>^>>><^<<>^<>^v<<>^>v^>vv^^^<>^^<>^>>^^v^v>vv<<<^>>>v>>^^^>^^v^<^^>^>^>>>><^^>^<^^>v<<^v>^^^v>^^^>^<^^>v<<^v>vv>v^^>^>v>^vv>>v^v<<<>^<^^v><^^<^^v<<^vv>>v>vvv>^v>vvv>^<><>^><<<^v^^^^v^^>v>^>v<^v<<^>^vv^^<>>^<^<v>^<^^<>>><>><v<>><^vvv>v>>>^>v<^^>v^^vv>v^^<><^vv^^v><^^<>^>v>>vv<>>^<<^^vv>vv<^^vv^<<^v<>>v<>>>>^^v>v>>^<^v>vv<^>^<<><<^<>>^<^><>^>v^<>^^<^<>v^v<>v><<>^<^^^v>^<^<^>>>><>^><v>^^<^>^<>v>^^<<^v^<><^v<>^v<<<<<<^^<^>v<<>^v^>^v^v>^<^>^<^>v<v^v>^v>>^v<>v<^vv<>>^^^<>v><><>><>v>^>v^v +vv<<>>vv<^>^^<<^>v>^v<<^^<<^^>^>>vv<<>^v><>>>^^<<^vv>vvv<<><<>v^v>v>vv^>v>^v^>^>>^v>><>^<^><<><>>>vv<>>v>><>vv<<>>vv>^^vv<>^^<<<^^v<>v^^<<<><>v<^^>v<>^vv>^v>>^^^<><<^^^<<>>^v^>vvv^v>v<^v<<>>^v^^v^<^<>^^<>v><>><><<^v<v<^<<>>><>>vv^>^<<>^^v>^>^<<^v>^>v^>^vv<^v><^^v^<>v^<^>>^v<^^^^^v^^>^<v<><^><^v<^<>v<^v^v>^>v><^><><^v^<<>^>^>^^v^<^<>^>vvvv^v^v^v^v><><><>v^^v^<>>vvv^<>^<^^vv^^<<<^v^>>>>>^^>>^>>^^>^v>vvv<^^v>^^v^v^^<<^>>v>v>^^>^<<^><>>^v^><>^^>v>^<<>^^><^v>^>>^^^<>>><<^^^<>>v^<><><>v^v>><^<^<^v^>v^vvvv^v>>vv^>v<<^^^<<>>^<>vv><^>^v>v^<^^^v^>v^>^<>^v^v^v<<<^>^<>^>v<^>>>vv<<>>^vv<>^>^vvvv>v<v^v<^vv<^^^v<^<>^><>>v>^><<^<>><^^>^v^^<^^vv^<<>>v<^v>>><<^^v>^<^v^^^v>^^^^<^^^<^>v<^<>>^<^>vvv<^><>v<^^>><^><^v<><<<^^v^^><^v<<>v +^vv<>v>^v>^<>^v><>><><^>^^^^<v^<>^><>^v<<vv>>v^<>v><>v>v^^<<<>>^v>^vvv<^^^><^v>>v^vv<<>><>v<>>v<<<^<<<^<><<<<<>>^v^vvvvvv^v^<>v<v<>vv<><<^v><>>><^v^v>v>v>>v><^v><>^vv>v^v^^>>>v>v^v>vvv<<<>>>v^v><<<>v>>^><<^vv<>><^>^vvv>v<<<<>^>v<^^<><^<^>>^vv<^v>^v^>^^>^^><^vv<<^<><<<^<<^v^v^>^>>>^v^><<>>^^v^<<^<>>v^>vv><>^^<^>^^v^v<<>^^^v<>>><<^^^<>^^>^>v^^>^v^^<^>^^>vv>vvvv<^v>v^v<>^v<<^>>v>>^^v>^^v>v><^^v<<<vv^<>><<>vv^<<><^<<^^^v>^<<<<^>v>^v^^><>^<^vv>v>>^^>>^><^>^<^v^>^>>^>v<<>><^^<<>vv><^<<<>v>^^v>vvvv>v<>>><^^>^>^vvvv^vvvv<>v<^v^^^^v<>^^>v^^<^^<<^<>^v<^v>>v^<<^<>v^^v^^<^>>v<>^<>>^<><^^^>><>v^<^><^v^^>>v<^<>v^<>^vv>v<^^<^vv<>vv>>^vv>^v<<^>>^^>vv^><^>><^>^>v^v^vv>v<^>><^>v>v>v><>>^<<><^v<^^>v>>>^v><<>^v>>v>^ +>^^>^><<<>v>>^><<><>^<><>>^>>>v^vv^<<>^>^v<>>>>v<v<>v^>>v<<<<>vv^v^<v^>^>>vvv<>>^vv>^v^><^^^v<>>v^vv^v^<^^v>>>v<>^v^<^vvv<><>>vv^>v<<<<>>vv<>^v>><^><^^^>v<<>>>v>^v^<^>v^^<v>v>>>v>^>^v<^<^^<^vv>^<>^v>vv>^^>><^v^v>v<<>v^^^>^^>^<>^>v>>v>>>>vv><>>^v^>>v^^v^><>^><>^^>>>v^<>>>v^>v^^>>>>v>v<^v>>^v^><>^^<>^<<<>^<>>>>>v><>^v^v^<<<^<<<<>v<^^^v><><>^^v^v<^^^^>^<^^^<>vvv<^v^>^v><>v^v^^<>>^v><<<vv^^>v<^^<><<<>>>>><<<^<>>^v>vvv<>v<<^>>v>v<>>^>^^v>><^<^<^^^vv^<><^^v<^<^<>^>^v>vv^v>^v<>v^^<<<^^<>^v<>^<^v^><>v<>^v>^vv^v^>>v>^v<<^>v<<^^v^v>^v<^^>>>>v><>^>vv>^vv<^v>^>v>v<^^<>v^>^v^>>v^^>^v^>v<^vv^^^v<><>^^^>v^^>^<^^><^v^>><^^v>^^^v^>>><><<<>><<<<>v>^>>>^^^v<^^^><<>>>^v<><>v<^vvvv>^<><>^<<<>v^^v^^>vv +<><^>^v^>v^^^<>^^^<><>>>>vv<^v>v>^^><<>v>^<^v^vv^<>>^^^^^v^>vv^><^>>^v^v^^vvvv>><<vvv><><^^>v^>><>^<>^^v^^v>^>^^v^^>v^><^^v<^><>vv^<^^^>>vv^^<<<>>^^v^>v<^<^v>>>v>>><<>><>v^^v<>v>^v<<^^vv^<>v^v>^<<<>>v^<>v^>vv>v^^>v<>v>v>><>^<<^v^<^<^<^vv>>^>vv^^>>^<><>^>>vvv^>v^^>vv^vv<<>v><vv><<>>>^<^v<<<>v^<<>^<>>>v<>>^<^<^v^<^v>>v<v^<<<^<>^v<^^>v>^v<^^>v^v^>>v>v<<^>v^>v^>^^<<^^v<<^v<<^vvv^>^^>>><>^>^^>><v>>>^v>^>>v<^^v<>^vvv>^^>>>v^>v<<^<^v><^v>^^>^v>^<>v^^<>vv>v><><^v^>^^<<<<>><<>^^<<>v^>^^>^^vv<^^v^^>^>vv>>^<>v><v>v^^^vv^vv>vvv^>vv>vv^>>>v<^^><^>>vv>^><<><^><v>><>vv^<><<^<^<>^>v>v^v<<>v^><^^v<>^>vv^v>>>^^^v>>>^><<<^<^<^^v<<<>><>^^vvv>^vv>>^v<><^v<>v>^v^><>^v<v^^^><^>v^vv<<vv>v><^v<^^^><^^ +<^<^v>vvv^v<^v^^>vv^><><>vvv><>vv^^^>^<^^<<^v^v>^v^<<^>>v<^^<><^v^<>>>>^<<>^v^<<>><^<^><<>v^>^>v>vv^<vv^^^^vv>^>vv>^^v<^<>>><>vv>>vvv><^v>^v^v^<^>^vv><^<^>^><^<><<^^vv>>^>v^^^v<><^v^<><^>>v^^v<^>v>^^<>v<<^vv^v><^v^v<^vv^><><^^<>v^<<^^vv^<<>^v^^^<<<><<>>^>^>v><<>v^<<>v<^v^<><<^^<>vv>^vv^^v^v>^><^vvvv^v^>^<^^vvvv^<^v<^<<<>v>><>>^v^^><>^v>^v><<<^^^^^<<^><v^>v>v>v^^^^v><^>>^>^><>v>vv<<>>^><>v<><^<>>^^<^>^^^v^^<<>>vv>><^<<<<>^v<<^v^v<<>^>^vv>><>v<^^<>v^>v>>vv<^vv>>>>v<<>v><><^<<^<^><<<<>v>>v><>v<>v<^vv><<>v>>v>vv><^>><>>>^^^>v>^<>v<>v^<^v<>v^^^vvv^^v^vvv>vvv^v>>^<^>^v<^>>>^<>>^v<<>v<^<<^><>>>^<><^v^^><>><^>vv>^>vv<^v^>v^^v^>^<^>^vvv>>vv^^vv^><^^<<><^>^v^v>>^<^<^^^<<^>v>>^vvv>v>><^>^<^v><^v>^v^^<<^>^^<<>>vv^^<^ +<<<^<^v<^v>>v^^>><><^>vv>^^^vvv<<>^>v>^><<<<^vv^v>^>><<^vv>^^<>v>>>>><><^vv<>v<^><^>>>v<^>>v^<^>>>^>^>v^>vv>^>^vv<^^<^vv^<^><^<^^v^<><<^><^>>^^<^>^>^^<^v^>><^>>><><^^>v^v>vv^^v>^><<^<<<><<<^v>>>><<<>v<>^>^v^<>^><>^>><<<>>^v^vv^v^<^<<>^^<<^^>^^v<>^vv>v>v^^v^>^v<^^v>^<^v><<>^<^^v<^^v^<><<>^^<v>vv>><^>v>v<>^v>v<<<>v^<>vv<>^<^>vv^^<^<^>>><v^^vv><<^<>^<<<>v>vv^><^>><>><^^><^v>v>><>>v>>v^^<<>>v>vv^>^v>v<^>><>>vvv<^>^>^^^>^>^>^><>v><^>>vv><^v>>^>>v^<^<<>>v<>v>v^^v^<>><>><>^>v><^<>^><>v><<<^v<<>>^^<^^>v^>^>^>>v^v^>^^v>vv^v<vvv><>^^>vvv^>vvvv>^^^>^<^^>v<^vvv<<>^<<<>^>^v>v>v^><><^>>>>^>^<^^^><>vvvvv^vv>^>^>>v^v^vv^>^>>v>>^^v>>^^><>v<^<<>>^>>^^><^>>v><^>v^^><^>v^<<>^><^^>>^><vv>>^^<<>>>^><<^v>v<v^>v<<>v diff --git a/2024/go/day16/day16.go b/2024/go/day16/day16.go new file mode 100644 index 0000000..cbf3814 --- /dev/null +++ b/2024/go/day16/day16.go @@ -0,0 +1,225 @@ +package day16 + +import ( + "adventofcode2024/utils/dijkstra" + "adventofcode2024/utils/grid2d" + "adventofcode2024/utils/inputs" + "fmt" + _ "strings" +) + +type ( + Vec struct{ x, y int } + Dir struct{ x, y int } + Cell rune + Move struct { + p Vec + d Dir + } + Maze struct { + height, width int + start Vec + end Vec + grid *grid2d.Grid[Cell] + } +) + +const ( + WALL Cell = '#' + CORRIDOR Cell = '.' + START Cell = 'S' + END Cell = 'E' + PATH Cell = '*' +) + +var ( + NORTH = Dir{0, -1} + EAST = Dir{1, 0} + SOUTH = Dir{0, 1} + WEST = Dir{-1, 0} + DIRECTIONS = []Dir{NORTH, EAST, SOUTH, WEST} +) + +func Part1(input string) int { + maze := Maze{}.Parse(input) + fmt.Println(maze) + data := inputGraph(*maze) + graph := dijkstra.CreateGraph(data) + data.From.Label = "EAST" + path, dist := dijkstra.GetShortestPath(data.From, data.To, graph) + for _, p := range path { + maze.grid.Set(p.X, p.Y, PATH) + } + fmt.Println(maze) + return dist +} +func Part2(input string) int { + maze := Maze{}.Parse(input) + fmt.Println(maze) + data := inputGraph(*maze) + graph := dijkstra.CreateGraph(data) + data.From.Label = "START" + data.To.Label = "NORTH" + paths, _ := dijkstra.GetAllShortestPaths(data.From, data.To, graph) + bestPaths := make(map[Vec]struct{}) + for _, path := range paths { + for _, node := range path { + bestPaths[Vec{x: node.X, y: node.Y}] = struct{}{} + } + } + return len(bestPaths) +} + +func inputGraph(maze Maze) dijkstra.InputGraph { + data := dijkstra.InputGraph{} + data.From = dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"} + data.To = dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"} + for y := 0; y < maze.height; y++ { + for x := 0; x < maze.width; x++ { + if maze.grid.Get(x, y) == WALL { + continue + } + for _, dir := range DIRECTIONS { + nx, ny := x+dir.x, y+dir.y + if nx < 0 || ny < 0 || nx >= maze.width || ny >= maze.height { + continue + } + if maze.grid.Get(nx, ny) == WALL { + continue + } + for _, d := range getAllowedDirections(dir) { + ss := dirToString(dir) + ds := dirToString(d) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: x, Y: y, Label: ss}, + Destination: dijkstra.Point{X: nx, Y: ny, Label: ds}, + Weight: func() int { + if dir == d { + return 1 + } else { + return 1001 + } + }(), + }) + } + } + } + } + + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"}, + Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(EAST)}, + Weight: 0, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"}, + Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(WEST)}, + Weight: 0, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"}, + Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(NORTH)}, + Weight: 0, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: "END"}, + Destination: dijkstra.Point{X: maze.end.x, Y: maze.end.y, Label: dirToString(SOUTH)}, + Weight: 0, + }) + + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"}, + Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(EAST)}, + Weight: 0, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"}, + Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(WEST)}, + Weight: 2000, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"}, + Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(NORTH)}, + Weight: 1000, + }) + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "START"}, + Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: dirToString(SOUTH)}, + Weight: 1000, + }) + + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "EAST"}, + Destination: dijkstra.Point{X: maze.start.x, Y: maze.start.y, Label: "NORTH"}, + Weight: 1000, + }) + + return data +} + +func dirToString(dir Dir) string { + switch dir { + case NORTH: + return "NORTH" + case EAST: + return "EAST" + case SOUTH: + return "SOUTH" + case WEST: + return "WEST" + default: + return "UNKNOWN" + } +} + +func getAllowedDirections(direction Dir) []Dir { + switch direction { + case NORTH: + return []Dir{NORTH, EAST, WEST} + case SOUTH: + return []Dir{SOUTH, EAST, WEST} + case WEST: + return []Dir{WEST, NORTH, SOUTH} + case EAST: + return []Dir{EAST, NORTH, SOUTH} + } + return []Dir{} +} + +func (m Maze) Parse(input string) *Maze { + m.grid = inputs.ToGrid2D(input, "\n", "", '?', func(c string) Cell { return Cell(c[0]) }) + m.height, m.width = m.grid.SizeY(), m.grid.SizeX() + for y := 0; y < m.height; y++ { + for x := 0; x < m.width; x++ { + c := m.grid.Get(x, y) + switch c { + case WALL, CORRIDOR: + m.grid.Set(x, y, c) + case START: + m.grid.Set(x, y, CORRIDOR) + m.start = Vec{x, y} + case END: + m.grid.Set(x, y, CORRIDOR) + m.end = Vec{x, y} + } + } + } + return &m +} + +func (m *Maze) String() string { + s := "" + for y := 0; y < m.height; y++ { + for x := 0; x < m.width; x++ { + if y == m.start.y && x == m.start.x { + s += string(START) + } else if y == m.end.y && x == m.end.x { + s += string(END) + } else { + s += string(m.grid.Get(x, y)) + } + } + s += "\n" + } + return s +} diff --git a/2024/go/day16/day16_test.go b/2024/go/day16/day16_test.go new file mode 100644 index 0000000..426b7b5 --- /dev/null +++ b/2024/go/day16/day16_test.go @@ -0,0 +1,47 @@ +package day16 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`############### +#.......#....E# +#.#.###.#.###.# +#.....#.#...#.# +#.###.#####.#.# +#.#.#.......#.# +#.#.#####.###.# +#...........#.# +###.#.#####.#.# +#...#.....#.#.# +#.#.#.###.#.#.# +#.....#...#.#.# +#.###.#.#.#.#.# +#S..#.....#...# +###############`) + require.Equal(t, 7036, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`################# +#...#...#...#..E# +#.#.#.#.#.#.#.#.# +#.#.#.#...#...#.# +#.#.#.#.###.#.#.# +#...#.#.#.....#.# +#.#.#.#.#.#####.# +#.#...#.#.#.....# +#.#.#####.#.###.# +#.#.#.......#...# +#.#.###.#####.### +#.#.#...#.....#.# +#.#.#.#####.###.# +#.#.#.........#.# +#.#.#.#########.# +#S#.............# +#################`) + require.Equal(t, 64, r) +} diff --git a/2024/go/day16/input.txt b/2024/go/day16/input.txt new file mode 100644 index 0000000..67000f9 --- /dev/null +++ b/2024/go/day16/input.txt @@ -0,0 +1,141 @@ +############################################################################################################################################# +#.....#.....#...#.................#...#.......#.........#...#.......#...#.......#.......#...#...#.....#...#.......................#...#....E# +#.###.#.#.#.###.#.###.###.#######.#.#.#.#.###.#.###.###.#.#.#.###.#.###.#.#.#####.###.#.###.#.#.#.#.#.#.#.#.#####.#.###.#.#######.#.#.#.###.# +#...#.#.#.#...#.....#...#.#.....#...#...#.#...#.#...#...#.#.#...#.#...#.#.#...#...#...#.....#.#.#.#.#...#...#.....#.#.#.....#.....#.#.#...#.# +#.#.###.#.###.#.#####.#.#.###.###########.#.#####.###.###.###.###.###.#.#.#.#.#.###.#######.#.#.#.#.#########.#####.#.#.#####.#####.#.###.#.# +#.#.....#.#.#.#...#...#.#...#.....#.....#.#.....#.#.#.#.........................#.#.......#.#.#...#.....#...#.#...#.....#...#.#...#.#.....#.# +#.#######.#.#.#.###.#.#.###.#.#.#.#.#.###.#####.#.#.#.#.###.###.###.#.###.#.#.#.#.#######.###.#.#####.#.#.#.#.###.###.#.#.#.#.#.#.#.#######.# +#...#...#.#...#.#...#.#...#.#.#.#...#.#.......#...#...#...#...#.#.....#...#.#...#.......#...#...#.....#...#.#.....#...#...#...#.#.........#.# +###.#.###.#.#####.###.###.#.###.#.#####.###.#.#####.###.#.###.#.###.###.###.#####.#########.#.#.###.#.###.#.#####.#.###.#######.###########.# +#...#...#.#.#.....#...#...#.#...#.#...#.#...#.#...#...#.#.....#...#...#.#...........#.........#.#...#.#...#.........#.#.#.......#...........# +#.#####.#.#.#.#######.#.###.#.###.#.#.#.#.###.#.#####.#########.#.#.###.#.#####.###.#.#####.#.#.#.###.###.###.#####.#.#.#.#######.#########.# +#.#.....#.#...#.......#...#.#.#.....#.#...#.#.#...............................#...#.#...#...#...#.#.#.....#.#.....#...#.#.#.....#.......#...# +#.#.###.#.#####.#.###.###.#.#.#.#.###.#.###.#.###############.#.#.#.#.#####.#.#####.###.#####.#.#.#.#####.#.#####.###.#.#.#.###.#######.###.# +#.#...#.#.....#.#.....#...#...#.#...#.#.....#.#.....#.................................#...#...#...#...#...................#...#...#...#...#.# +#.###.#.#####.###.#.#.#.#####.#.#.#.#.#######.#.###.#.#######.###.#.#.#.#.###.#.#########.#.#.#.#.#.###.#.#####.#.###.#.#.###.#.#.###.###.#.# +#.#...............#.#...#...#.#...#.........#.....#.#.#.......#...#.#.#.#.#...#.#.....#...#.#.....#.....#.....#.#.....#.#.#...#.#...#...#...# +#.#.#####.#.#####.#.#####.#.#.###.#########.#.#####.#.#.#######.###.#.###.#.###.#.###.#.#.#.#.#########.#.###.#########.#.#####.###.###.###.# +#.#.#.....#.....#.#.#.....#.....#.....#...#.#.#.....#.#.#.......#.#.#.....#.#...#.#...#.#.#.#.........#...#.#.........#.#.........#...#...#.# +#.#.#.#####.#####.#.###.#######.#####.###.#.###.#####.#.#####.###.#.#######.#.#.#.#.#.#.###.#.#######.#.###.###.#.###.#.#########.###.#.#.#.# +#.#.......#...#...#...#...#...#.....#...#.#.#...#.#.....#.....#.....#...#...#.#...#.#.#.....#.#.......#.#.......#...#.#.....#.......#.#.....# +#.#######.###.#.#####.#.###.#.#########.#.#.#.###.#.#####.###.#######.#.#.#########.#.###.###.#.#######.#.#####.###.#.#####.#.###.###.#.#.#.# +#.....#...#...#...#.#.#.#...#.#.........#.#...#...#...#...#.#.#.......#...#.......#.#.#.......#.........#.........#.#...#.#.#...#.....#.#.#.# +#####.###.#.#.###.#.#.###.###.#.#########.#####.#####.#.#.#.#.#.#############.###.#.#.###########.#######.#######.#.#.#.#.#.###.#######.#.#.# +#...#...#.#.#.#...#.......#.#.#.#.......#.......#.....#.#.#...#.............#.#...#.#...#.......#.........#...#...#...#...#...#...#.....#.#.# +#.#.###.#.#.#.#.###########.#.#.###.###.#.#.#####.#####.#.#####.#.#########.#.#.###.###.#.###.#.###########.###.#####.###.#.#####.#.#####.#.# +#.#.#.#.#.#.#.#.....#.....#...#...#.#.....#.#.....#.#...#.....#.#.#.......#.#.#...#.#.....#...#.#.....#.....#...#.......#.#.................# +#.#.#.#.###.#.#####.#.###.#.#####.#.#######.#.#####.#.#####.#.#.#.#####.###.#.###.#.#########.#.#.###.#.###.#.###.#####.#.###.###.###.#.###.# +#.....#.#...#.....#...#...#...#...#.#.....#.#...#.#...#.....#...#.#.....#...#.#...#...#.......#...#...#...#.#.#...#.....#.#.#.........#...#.# +#.#####.#.#######.#####.#####.#.###.#.###.#####.#.#.#####.#.#####.#.#####.###.#.#####.#.###.#######.#######.#.###.#.#####.#.###############.# +#.#.....#...#...#...#...#.....#.#...#.#.#.......#.#.......#.....#.#.....#.#...#.......#.#...#.......#.....#.#.....#.....#.......#.........#.# +#.#.#######.#.#.###.#.#######.#.#.###.#.#########.#############.#.#.###.#.#.###.#########.#.#.#########.#.#.#####.#####.#####.###.#######.#.# +#...#.....#...#...#.#.......#...#...#...#.........#.......#...#...#...#.#.#...#.#...#...#.#.#.#.....#...#.#.....#.....#.....#.#...#.....#...# +#.###.#.#.#.#####.#########.###.###.###.###.###.#.#.###.#.#.#.#########.#.#.#.###.#.#.#.#.###.#.###.#.###.#.#.#######.#####.#.#.###.#.#####.# +#.#.....#.#.#...#...#.......#.............#.#.#.#.#.#...#...#.#.........#.#.#.....#.#.#.#.#.....#.....#.#.#.#...........#...#.#...#.#.#...#.# +#.#.#.###.###.#.###.#.#########.#####.###.#.#.#.#.#.#.#########.#.#####.#.#########.#.#.#.#.#######.###.#.###########.###.###.###.#.###.#.#.# +#...#...#.....#.....#.#.........#.....#...#.....#.#.#.#.....#...#.#...#.#.#.......#...#.#...#.#...#...#...#.............#.#...#...#.....#.#.# +#####.#.#######.#####.#.#.#############.#####.#.###.#.#.###.#.###.#.#.###.#.#####.#####.#.###.#.#.#.#.#.###.###########.#.###.#.###.#####.#.# +#.#...#.......#.#.....#.#.#...#.............#.#.#...#.....#.....#...#...#.#...#.#...#...#.#...#.#.#.#.#...#.#...#.....#.#.#.....#...#...#...# +#.#.#.###.#####.#.#####.###.#.#.###########.###.#.#############.#######.#.###.#.###.#.###.#.###.#.#.#.#.#.#.#.#.#.#####.#.#.#.###.###.#.##### +#...#...#...#...#.#.#.......#.#.#.......#.....#.....#.........#.........#...#.#.....#...#...#...#.#.#.#.....#.#.#.........#.#.#...#...#.#...# +#.###.#.###.#.###.#.#.#######.#.#.#####.#####.#.#####.#######.#.#####.#.###.#.#.#######.###.#.###.#.###.###.#.#.#.#########.#.#.#####.#.#.#.# +#.......#...#...#.#.........#...#...#.#.....#.#...#...#.#.....#.#.....#...#...#...#...#.....#...#.#.....#.....#.#.#.........#.#.......#.#.#.# +#.###.#.#.###.#.#.###.#########.###.#.#####.#.#####.###.#.#######.#######.#######.#.#.#.###.###.#.#.#####.#####.#.#.#########.#########.#.### +#.#.....#.....#.#...#.#.......#.#...#.....#.#.......#.....#.......#...#.....#...#...#.#.#...#...#.#.#.....#...#.#.#.#.........#.....#...#...# +#.#.#.#######.#.#.#.###.#.###.###.###.#####.#.#.###.#.#########.#.#.#.#.#####.#.###.#.###.#.#.###.###.#####.#.#.###.#.#####.###.###.#.###.#.# +#.#.#.....#...#.#.#.#...#...#.#...#.....#...#.........#.........#.#.#.#.#.....#.....#.#...#...#.#...........#.#...#.#.#...#.......#.#...#.#.# +#.#.#.###.#.#.#.#.#.#.#####.#.#.#######.#.###.#########.#.###.#####.#.###.#####.#####.#.###.###.#######.#########.#.###.#.#####.#.#.###.###.# +#.#.#.....#.#.#.#.#.#.......#.#.#...#...#.#.#...#.#.....#.#...#.........#...#...#...#.#.#...#...#.....#.#.....#...#.....#.#.....#.#.........# +#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#.###.#.#.#####.#####.###.###.###.#.###.#.#.#.#.###.#.#.###.###.###.#.#.#####.#.#.###.#.#########.# +#.#.......#.#.#...#.#.#.#.#.#.#...#.#.#...#.#...#...#...#.#...#...#...#...#.#.....#.#.#.#.#...#.#.#...#...#.#.#.#.........#...#.#.....#...#.# +#.#######.#.#.###.#.#.#.#.###.#####.#.#.###.#.#####.#.#.#.#.#.###.###.###.#.#######.#.#.#.#.#####.#.###.###.#.#.#####.#.#####.#.#######.#.#.# +#.#.......#.#...#.#.#...#...#.#.......#.#...#.....#.#.#...#.#...#.....#.#.#.......#...#.....#.....#...#.#.....#.....#.#.#.....#.........#.#.# +#.#.#####.#.###.#.#.#.#.###.#.#.#######.#.#.#####.#.#.###.#.###.#.###.#.#.#######.###########.#######.#.#.#########.###.#.###############.#.# +#.#...#...#.#...#.#...#.#...#...#.#.....#.#.#.....#.#.#...#...#.........#...................#.#.....#.#.#.........#...#...#.......#.......#.# +#.###.#.#.#.#####.###.###.#.#####.#.#####.#.#.#####.#.#.#####.#########.###################.#.#.#####.#.###.###.#.###.#####.#######.#######.# +#...#...#...#.....#.......#.....#.#.#.....#...#.........#...#...#.....#...#...........#.#.....#.......#...#.....#.......#...#.....#.#.....#.# +###.###.#.###.#####.###########.#.#.#.###########.#.#####.#.###.#.###.###.#.#########.#.#.#######.#####.#.###########.#.#.#.#.###.#.###.###.# +#...#...#...........#.#.....#.....#.#.#.......#...#.#.....#.....#.#.#.#...#.#.#.....#.#.....#...#.....#.#.................#.#.#.#.#...#.....# +#.#.#.#####.###.#####.#.###.#.###.#.#.###.###.#.#####.#######.###.#.#.#####.#.#.#.###.#.#####.#.#####.#####.#########.#####.#.#.#.#.#.###.### +#.#.#.#...#.#.......#.....#.....#.#.#.#...#.#.#.......#.....#...#.#.#...#.......#.....#...#...#.#...#.....#.........#...#...#.#...#.#...#...# +#.###.#.#.###.###.#.###########.#.#.#.#.###.#.#.#.#####.###.###.#.#.###.#.#########.#######.###.###.#####.#########.###.#.###.#.#######.##### +#.#...#.#.....#...#.#.........#...#.#...#...#.#.....#...#...#...#.#.#...#.........#.........#.#.#...#...#...#.....#...#.#...#.#...#...#.....# +#.#.###.#.#####.#.#.#.#######.#.###.#####.###.#.###.#.###.#######.#.#.###.#######.###########.#.#.###.#.###.#.#####.###.#####.###.#.#.#.###.# +#...#...#.....#.#...#.#.....#.#.#...#.....#...#.....#...#.........#.#.#.........#.......#...#...#.....#...#.#...........#...#...#...#.......# +#####.###.#.###.#####.#.#.###.###.###.#####.#######.###.###.#######.#.#########.#.#.###.###.#.#########.###.#########.###.#.###.#######.###.# +#.....#...#.....#.....#.#.......................#...#...#.........#.#.......#...#.#...#...#.#.......#...#...#.........#...#...#.......#.....# +#.#####.#.#######.#################.#########.#.#.###.###.#####.#.#.#######.#####.###.###.#.#.#.###.#.#.#.###.###.#####.#####.#######.#.##### +#.#.#...#...#.................#.#...#.........#.......#.#.#.#...#...#...#...#...#.......#.#.#.#...#...#.#.....#...#...#...#.........#.......# +#.#.#.#.#.###.###.###########.#.#.###.#################.#.#.#.#####.#.#.#.###.#.#########.#.#.###.#####.#######.###.#.###.#########.###.###.# +#.#.#...#.........#.....#.....#.#.#.....#...#.............#.#.#.....#.#.......#.........#.#.#...#.........#.......#.#...#...#.....#.#.....#.# +#.#.###.#.#######.#####.#.#####.#.#.###.#.#.###.###.###.#.#.#.#######.#################.#.#.###.#.#.#####.#.#######.###.###.#.###.#.#.###.#.# +#.#...#.#.....#.........#.#.....#.#.#...#.#...#...#...#.#.....#.......#.........#.......#.#...#.#.#.....#.#.#...#...#...#...#...#.#...#.#.#.# +#.#.###.#.###.###########.#.###.#.###.###.###.#######.###.#.#.#.###############.#.#######.#.#.#.###.###.#.#.#.#.#.###.#.#.#####.#.#####.#.#.# +#.#.....#.#...............#.#...#...#...#...#.#.....#.......#...........#.....#.#.#.......#.#.#.....#.#.#.#...#.#.#.......#.....#.......#...# +#.#.###.#.#.#################.###.#.#.#.###.#.#.###.#######.###########.#.###.#.#.#.###.#.###.###.#.#.#.###.#####.#.###########.#.#####.###.# +#.#...#...#.#...#...#.........#...#.#.#...#.#...#.#.#.....#.#.....#...#.#...#...#...#.#...#...#...#...#.....#.....#.....#.......#.....#...#.# +#.###.#.#####.#.#.#.#####.#.###.#.#.###.#.#.#####.#.#.###.###.###.#.#.#.###.#########.#####.#.#.#####.###.#.#.#######.###.#####.#####.###.#.# +#.#...#.......#.#.#...#...#.#...#...#.....#...#...#...#.#.....#.#...#.#...#.#.#.......#.......#.....#.......#.#.#.....#...#...#.#.....#...#.# +#.#.###.###.###.#.###.#.###.#.#######.#.#####.#.#.#####.#######.#####.###.#.#.#.###.#.#.#####.#####.#########.#.#.#####.###.#.#.###.###.#.#.# +#.#.#.....#.....#.#.....#.#.#.........#.......#.#.........#.............#.#.#.....#.#.#.#.....#.....#.......#.#...#...#.#...#.#...#...#.#.#.# +#.#.#.#.#.#.#####.#######.#.#####.#####.#.#########.###.#.#.#####.#####.#.#.#######.#.###.###.#.#.###.#####.#.###.#.#.#.###.#.#.#.#.#.#.#.#.# +#.#...#.#...#...............#...#.#...#.#.#.......#...#.#.#...#.......#.#.#.#.......#.#...#.#.#.#.......#...#.......#.......#...#.#.#...#.#.# +#.#####.#.#.###.#######.#####.#.#.#.#.###.#.#####.#####.#.#.#.#.#.###.#.#.#.#.#######.#.###.#.#.#######.#.###.###########.#####.#.#.#######.# +#.....#...#...#.#...#...#.....#...#.#.#...#.#...........#.#...#.#...#.#.#.#.#...#...#...#.#...#.........#.#.....#...#.............#.#.......# +#.#.#.#.###.#.###.#.#.###.#.#######.#.#.###.#.#.#########.#.#.#.###.#.#.#.#.#.#.#.#.#####.#.#########.###.#.#####.#.#.#########.###.#.####### +#.#.#.......#.#...#.#.....#.......#.#...#...#.#.#.......#...#.#.#...#...#.#...#...#.#.........#.......#...#...#...#.#.#...#.....#...#...#...# +#.#.###.#####.#.###.#.#########.###.#######.#.###.#####.###.###.#.###.#######.#####.#.#######.###.#.###.#####.#.###.#.#.###.###.#.#.###.###.# +#...#...........#.#.#...........#...#.......#.........#.....#...#...#.#.....#.....#.......#...#...#.#...#.....#.#.....#...#...#.#.#...#.....# +#.###.#.###.#.#.#.#.###########.#.###.#.#################.###.#####.#.#.###.#####.#.#####.#.###.###.#.#####.###.#######.#.###.#.#.###.#####.# +#.....#.....#.....#.......#.....#...#.#...#.............#...#.....#.#.#...#.....#.#.....#.#.....#...#.#...#...#.....#...#.....#.#.#.#.....#.# +#.#######.###########.###.#.#######.#.###.#.###.#.#####.#########.#.#.###.###.#.#.###.###.#######.###.#.#.#.#######.#.#########.#.#.###.#.#.# +#.#.....#.......#...#...#.#...#.........#...#.#...#...#...........#.....#...#.....#...#...#.........#...#.#.#.......#.#.#.....#...#...#.#.#.# +#.#.###.#########.#.###.#.###.#.#######.#####.#.###.#########.#.#.#########.#######.###.###.#######.#####.###.#######.#.#.###.#.###.#.#.###.# +#.#.#.#...........#.#...#.#...#...#...#...........#.....#...#.#.#...#.....#.....#.....#.#.....#...#.#...#.....#.....#.#.....#.......#.#.#...# +#.#.#.#############.#####.#.#####.#.###.#.#########.###.#.#.#.#####.#.#.#####.#.#######.###.###.#.#.#.#.#######.###.#.#############.###.#.### +#.#.#...#...#.......#.....#.#.#...#.#...#.......#.....#.#.#.#.....#...#.....#...#.....#.....#...#.#...#...#.....#...#.............#...#...#.# +###.#.###.#.#.#######.#####.#.#.#.#.#.#####.###.#.###.#.#.#.#.#.#########.#.#.###.###.###.#.#.###.#.#####.###.###.###############.###.#####.# +#...#...#.#.#...#...#.........#.#.........#...#...#...#.#.#.#.#.............#.....#.#...#.#...#...#.#...#.....#...#.......#.....#...#.......# +#.###.#.#.#.#.#.#.#.###.#####.#.#########.#.#.#####.#.#.#.#.#######.###.#.#########.###.#.#####.#.###.#.#######.###.#####.#.#.#.###.#.#####.# +#.................#...#.....#.#.....#.#...#.#.....#.#.#.#.#.........#...#.....#.......#.#.#.....#.#...#.#.........#.....#.#...#.#.#...#...#.# +#.#.#.#.#####.#.#.###.#####.#######.#.#.###.#####.#.#.#.#.#########.#######.#.#.#####.#.#.#.#####.#.###.#.#.#####.#####.###.#.#.#.#####.###.# +#...........#...#.#.........#...#...#.#...#.....#...#.#.#...#.....#.#.....#.#...#.#...#.#.#.#.....#.#.#.#.#.#...............#.#.......#.....# +#.###.#.###.#.###.#########.#.#.#.###.###.#####.#####.#.###.#####.#.#.###.#.###.#.#.#.#.#.#.#.#####.#.#.###.#.###########.###.#########.##### +#.#.........#.....#.........#.#.#.#.#.....#...#...#.#.....#.....#...#.#...#.#.....#...#.#.#.#.#.....#.#...#.#.#...#.......#.#...#.......#...# +#.###.#.#.###.###.#.#####.###.#.#.#.#.#####.#.#.#.#.#####.#####.#.###.#.###.#.###.###.#.###.#.#.#####.###.#.#.#.###.#######.###.#.#########.# +#.......#...#.......#...#.#...#.#.#...#.....#.#.#.#.....#.#...#.#...#.#.#...#...#...#.#...#.#.#.#.......#.#.....#...#.....#...#...#.#.......# +#####.#.###.#.#####.#.###.#.###.#.###.###.###.###.#.###.#.#.#.#.###.#.#.###.###.#####.###.#.#.#.#.#.###.#.#######.#####.#.###.#####.#.###.#.# +#.......#.....#.....#...#.#.#...#...#.....#.#.#...#...#.#.#.#.#.#...#.#.......#.#.....#...#.#.#.#.#...#.#...#.....#.....#...#...#.......#...# +#.#####.#######.#####.#.#.#.#.#####.#######.#.#.#####.#.#.###.#.#####.#.#.###.#.#.#####.###.###.###.#.#.###.#.#####.#######.#.###.#########.# +#.#.....#.......#.....#.#.#.#.......#...........#...#.#.#.....#.....#...#.....#.#.....#.#.#...#.....#.....#.........#.....#.#.....#.....#...# +#.#.###.#.#######.#.###.#.#.#########.###########.#.#.#.#####.#####.###.#######.#.#####.#.#.#.#######.#####.###.#.###.#.###.#.#.###.###.#.#.# +#.#.#.....#.....#.#...#.#.#.....#...#...#...#.#...#.#.#.....#.#.......#.....#.....#...#.#.#.#.........#.....#.#.#...#.#.....#...#...#.#...#.# +#.#.#.#.###.#####.#.#.#.#.#####.#.#.#####.#.#.#.###.#.###.###.#.###.#.#####.#######.#.#.#.#.###.#####.#.###.#.#.#.#.#.###.#.###.#.###.#####.# +#.#.#.#.....#...#...#.#.#.....#...#.......#.#.#.#.#.#.#.#.....#.#.......#.#.#.....#.#.....#.#.......#.#.#...#.#.#...#...#.#...#...#.......#.# +#.#.#.#.#####.#.#.#.#.#.###.###.###########.#.#.#.#.#.#.#######.#.#####.#.#.#.###.#.#####.#.#.#####.#.#.#.###.#.#.#.#####.###.#.###.#####.#.# +#...#.#.......#.#...#.#.....#...#.........#.#.#...#.#.......#.#.#.#...#...#...#...#...#...#.#.....#...#.#.....#.#.#.....#...#...#.#.#.......# +#.###.#.#######.#####.###.#.#.#.#.#####.###.#.###.#.#######.#.#.###.#.###.#####.#.###.#.#.#.###.#.###.#.#####.#.#.#####.#.#.###.#.#.#.#.###.# +#.#...#.#...#...#...#...#.#...#.#.....#.....#.....#.......#...#.....#.#.#.#.....#...#.#.#...#...#.#.......#...#.#.....#.#.........#.#.#.....# +#.#.###.#.#.#.#.#.#.###.#.#####.#.#.#.#######.#####.#.#####.#.#######.#.#.#.#########.#.#####.#.#.#.#####.#.#.#.#####.#.###.#.#.###.#.#####.# +#.#.#...#.#.#.#.#.#.....#...#...#...#.#.......#...#.#.#.....#...#...#.#...#.....#...#.#.......#.#.........#.#.#.......#...#.#...#...#.......# +#.#.#.###.#.#.#.#.#######.###.#.#####.#########.#.###.#.#####.#.###.#.#########.#.#.#.###.#.#####.#########.#.#######.#.#.#####.#.#########.# +#...#.....#.#.#.#...#...#...#.#.....#.........#.#...#.#.#.....#.....#.#.........#.#...#.#.#.....#.#...#.....#.......#.#.#...#...#.#.....#...# +###########.#.#.###.#.#.###.#.###.###########.#.###.#.#.#.#######.###.#.#######.#.#####.#.#.###.#.#.###.###.#######.#.#.###.#.#.#.#.#.#.#.#.# +#.#.......#.#.#...#.#.#...#.#.....#.......#.#.#.......#.#.........#...#.........#.....#...#.#.....#.#.....#.......#.#.#...#.#.#...#.#.#.#.#.# +#.#.#####.#.#.###.#.#.#.#.#.#####.#.#.###.#.#.#.#.###.#.###.###.#.#.#.#######.#####.#.#.###.###.###.#.#####.#####.#.#.###.#.#.#.#####.#.#.#.# +#.......#.#.#...#.#.#.#.#.#...#.....#...#...#.#.#.#...#...#...#...#.#.#.....#.#.........#.#...........#...#...#.#...#.#...#.#.......#.#...#.# +#########.#.###.#.#.#.#.#.#.#.#.#####.#.#.###.#.#.#######.#.#.#####.#.#.#.###.#.#####.###.#####.#######.#.###.#.#####.#.###.#######.#.#####.# +#.......#...#...#.#.#.#.#.#.#.........#...#...#.#.#...#...#.#.....#.#.#.#...#...#...#.#...#...#.......#.#.#.........#.#...#...#.#...........# +#.#####.#####.###.#.#.#.###.#########.###.#.#####.#.#.#.#########.#.#.#.###.#####.#.#.#.#.#.#.#.#####.#.#.###########.#######.#.#.###.#.##### +#...#.........#...#.#.#...#.#.......#...#...#.....#.#...#.........#.#.#...#.#.....#.#.#.#.#.#.......#.#.#.........#...#.....#.#.............# +#.#.###########.###.###.#.#.#######.#.#.#####.#####.#####.#######.#.#.#.#.#.#.###.#.#.#.#.#.#######.#.#.#########.#.###.###.#.#.#.#####.###.# +#.#.#.......#.............#.....#...#.....#.......#.#.....#...#...#.#.#...........#.#.#.#.#.#...#...#...#.#.......#.#...#.......#.........#.# +###.#.#####.###.#.###.###.###.#.#.###.#.###.#####.#.#.###.#.#.#.###.#.#.#######.###.#.###.#.###.#.#######.#.#######.#.#.#######.#######.#.#.# +#...#.....#...#.....#.#...#...#.#.....#...#...#...#.#.#...#.#.#...#.#.#...#.#...#...#...#.#.....#.....#.......................#...#.....#.#.# +#.#######.###.#.###.#.#.#.#.#.#.#.###.#.#.###.#.###.#.#.###.#.###.#.#.###.#.#.#########.#.###.#####.#.###.#.#.###.#.#########.#.#.#.###.#.#.# +#.......#.#.#...#...#...#...........................#.#.#...#.#...#.#...#...#.....#...#.#.....#.....#...#.#.#...................#.#.#...#...# +#.#.###.#.#.###.#.#.#########.#.###.#.#.###.#.#########.#.#.###.###.#######.#####.#.#.#.#.#####.#######.#.#.###.#.#########.#.#.###.#.#.###.# +#.#.#.#...#...#.#.#.......................#.#.#.........#.#.#...#.#.#.....#.#...#...#...#...#...#.......#.#.....#...#.......#.#.#...#.....#.# +#.#.#.#####.#.#.###.###########.#########.#.#.#####.#####.#.#.###.#.#.#.###.#.#.#############.###.#######.#########.#.#######.#.#.#####.#.#.# +#S..........#.#...........................#.........#.....#.......#...#.......#...............#...................#...........#.........#...# +############################################################################################################################################# diff --git a/2024/go/day17/day17.go b/2024/go/day17/day17.go new file mode 100644 index 0000000..312b2d7 --- /dev/null +++ b/2024/go/day17/day17.go @@ -0,0 +1,91 @@ +package day17 + +import ( + "encoding/json" + "fmt" + "regexp" + "strings" + "golang.org/x/exp/slices" + + + "adventofcode2024/utils" + +) + +type Opcode int + +const ( + adv Opcode = 0 + bxl Opcode = 1 + bst Opcode = 2 + jnx Opcode = 3 + bxc Opcode = 4 + out Opcode = 5 + bdv Opcode = 6 + cdv Opcode = 7 + +) + +func Part1(input string) string { + m := regexp.MustCompile(`[\d,]+`).FindAllString(input, -1) + a := utils.MustAtoi(m[0]) + b := utils.MustAtoi(m[1]) + c := utils.MustAtoi(m[2]) + + var pgm []int + json.Unmarshal([]byte("["+m[3]+"]"), &pgm) + + fmt.Printf("%d %d %d %v\n", a, b, c, pgm) + out := fmt.Sprint(run(a, b, c, pgm)) + out = fmt.Sprint(strings.Trim(strings.ReplaceAll(out, " ", ","), "[]")) + return out +} + +func Part2(input string) int { + m := regexp.MustCompile(`[\d,]+`).FindAllString(input, -1) + b := utils.MustAtoi(m[1]) + c := utils.MustAtoi(m[2]) + + var pgm []int + json.Unmarshal([]byte("["+m[3]+"]"), &pgm) + + fmt.Printf("%d %d %v\n", b, c, pgm) + + a := 0 + for n := len(pgm) - 1; n >= 0; n-- { + a <<= 3 + for !slices.Equal(run(a, b, c, pgm), pgm[n:]) { + a++ + } + } + return a +} + +func run(a, b, c int, pgm []int) (output []int) { + for ip := 0; ip < len(pgm); ip += 2 { + operand := pgm[ip+1] + combo := []int{0, 1, 2, 3, a, b, c}[operand] + + switch pgm[ip] { + case int(adv): + a >>= combo + case int(bxl): + b ^= operand + case int(bst): + b = combo % 8 + case int(jnx): + if a != 0 { + ip = operand - 2 + } + case int(bxc): + b ^= c + case int(out): + output = append(output, combo%8) + case int(bdv): + b = a >> combo + case int(cdv): + c = a >> combo + } + } + return output +} \ No newline at end of file diff --git a/2024/go/day17/day17_test.go b/2024/go/day17/day17_test.go new file mode 100644 index 0000000..ba2ffcc --- /dev/null +++ b/2024/go/day17/day17_test.go @@ -0,0 +1,25 @@ +package day17 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`Register A: 729 +Register B: 0 +Register C: 0 + +Program: 0,1,5,4,3,0`) + require.Equal(t, "4,6,3,5,6,3,5,2,1,0", r) +} + +func TestPart2(t *testing.T) { + r := Part2(`Register A: 2024 +Register B: 0 +Register C: 0 + +Program: 0,3,5,4,3,0`) + require.Equal(t, 117440, r) +} diff --git a/2024/go/day17/input.txt b/2024/go/day17/input.txt new file mode 100644 index 0000000..9d9d9cd --- /dev/null +++ b/2024/go/day17/input.txt @@ -0,0 +1,5 @@ +Register A: 61156655 +Register B: 0 +Register C: 0 + +Program: 2,4,1,5,7,5,4,3,1,6,0,3,5,5,3,0 diff --git a/2024/go/day18/day18.go b/2024/go/day18/day18.go new file mode 100644 index 0000000..9faee97 --- /dev/null +++ b/2024/go/day18/day18.go @@ -0,0 +1,126 @@ +package day18 + +import ( + "adventofcode2024/utils" + "adventofcode2024/utils/dijkstra" + "adventofcode2024/utils/grid2d" + "fmt" + "strings" +) + +type ( + Vec struct{ x, y int } + Dir struct{ x, y int } + Cell rune + Move struct { + p Vec + d Dir + } + Maze struct { + height, width int + start Vec + end Vec + grid *grid2d.Grid[Cell] + } +) + +const ( + WALL Cell = '#' + CORRIDOR Cell = '.' + START Cell = 'S' + END Cell = 'E' + PATH Cell = '*' +) + +var ( + NORTH = Dir{0, -1} + EAST = Dir{1, 0} + SOUTH = Dir{0, 1} + WEST = Dir{-1, 0} + DIRECTIONS = []Dir{NORTH, EAST, SOUTH, WEST} +) + +func Part1(input string) int { + maze := Maze{}.Parse(input, 1024) + fmt.Println(maze) + data := inputGraph(*maze) + graph := dijkstra.CreateGraph(data) + path, dist := dijkstra.GetShortestPath(data.From, data.To, graph) + for _, p := range path { + maze.grid.Set(p.X, p.Y, PATH) + } + fmt.Println(maze) + return dist +} +func Part2(input string) int { + maze := Maze{}.Parse(input, 2877) + fmt.Println(maze) + data := inputGraph(*maze) + graph := dijkstra.CreateGraph(data) + _, count := dijkstra.GetShortestPath(data.From, data.To, graph) + return count +} + +func inputGraph(maze Maze) dijkstra.InputGraph { + data := dijkstra.InputGraph{} + data.From = dijkstra.Point{X: maze.start.x, Y: maze.start.y} + data.To = dijkstra.Point{X: maze.end.x, Y: maze.end.y} + for y := 0; y < maze.height; y++ { + for x := 0; x < maze.width; x++ { + if maze.grid.Get(x, y) == WALL { + continue + } + for _, dir := range DIRECTIONS { + nx, ny := x+dir.x, y+dir.y + if nx < 0 || ny < 0 || nx >= maze.width || ny >= maze.height { + continue + } + if maze.grid.Get(nx, ny) == WALL { + continue + } + data.Graph = append(data.Graph, dijkstra.InputData{ + Source: dijkstra.Point{X: x, Y: y}, + Destination: dijkstra.Point{X: nx, Y: ny}, + Weight: 1, + }) + } + } + } + + return data +} + +func (m Maze) Parse(input string, bytes int) *Maze { + m.grid = grid2d.NewGrid(71, 71, CORRIDOR) + for _, line := range strings.Split(input, "\n") { + if bytes == 0 { + break + } + in := strings.Split(line, ",") + x := utils.MustAtoi(in[0]) + y := utils.MustAtoi(in[1]) + m.grid.Set(x, y, WALL) + bytes-- + } + m.start = Vec{0, 0} + m.end = Vec{70, 70} + m.height, m.width = m.grid.SizeY(), m.grid.SizeX() + return &m +} + +func (m *Maze) String() string { + s := "" + for y := 0; y < m.height; y++ { + for x := 0; x < m.width; x++ { + if y == m.start.y && x == m.start.x { + s += string(START) + } else if y == m.end.y && x == m.end.x { + s += string(END) + } else { + s += string(m.grid.Get(x, y)) + } + } + s += "\n" + } + return s +} diff --git a/2024/go/day18/day18_test.go b/2024/go/day18/day18_test.go new file mode 100644 index 0000000..aec55d5 --- /dev/null +++ b/2024/go/day18/day18_test.go @@ -0,0 +1,6915 @@ +package day18 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`2,5 +20,1 +63,59 +21,29 +37,59 +33,63 +14,33 +70,15 +21,34 +62,5 +45,54 +45,60 +48,53 +33,58 +23,35 +22,3 +33,0 +63,62 +44,67 +52,55 +5,19 +42,55 +45,0 +57,3 +15,45 +41,62 +1,39 +63,19 +39,59 +39,3 +48,7 +61,65 +31,1 +54,51 +11,14 +53,62 +67,68 +65,16 +17,45 +21,24 +55,3 +30,15 +4,39 +69,19 +69,57 +41,57 +43,24 +19,11 +18,27 +3,48 +8,13 +41,66 +67,67 +61,62 +5,37 +18,19 +29,64 +13,14 +42,57 +33,67 +0,19 +67,53 +47,59 +19,3 +51,54 +53,69 +42,5 +7,26 +59,65 +50,69 +3,27 +26,9 +43,3 +17,7 +15,11 +12,31 +43,5 +50,65 +9,5 +29,3 +21,6 +65,15 +43,57 +15,37 +50,53 +67,51 +29,1 +47,7 +55,54 +52,51 +47,54 +17,26 +12,43 +65,51 +1,27 +15,22 +63,15 +7,37 +69,49 +57,59 +7,36 +60,7 +66,7 +18,35 +13,36 +21,19 +15,3 +46,9 +30,3 +53,7 +8,7 +66,3 +49,69 +35,65 +48,5 +33,6 +1,31 +26,5 +44,59 +68,13 +45,67 +9,16 +51,55 +57,5 +2,33 +57,64 +31,2 +1,19 +5,12 +19,37 +40,67 +10,19 +21,12 +3,31 +51,1 +4,29 +52,65 +47,5 +17,19 +70,47 +11,19 +57,10 +54,55 +39,53 +61,56 +49,55 +28,37 +21,30 +9,45 +43,69 +57,19 +29,10 +60,63 +19,32 +66,5 +53,45 +53,49 +47,57 +26,1 +17,34 +65,7 +7,28 +41,63 +6,1 +69,69 +0,13 +5,28 +10,1 +38,67 +37,13 +3,7 +39,12 +2,15 +54,65 +35,53 +63,20 +13,30 +52,47 +13,3 +69,55 +55,61 +37,4 +7,35 +57,4 +35,69 +5,3 +63,64 +40,69 +59,5 +32,61 +66,61 +43,64 +40,1 +49,3 +68,65 +3,38 +21,4 +49,56 +18,29 +23,12 +7,11 +16,29 +8,11 +10,25 +39,67 +59,60 +3,19 +26,31 +7,9 +51,58 +49,67 +53,65 +65,59 +67,9 +43,58 +55,51 +69,7 +6,39 +49,59 +10,37 +4,43 +54,5 +3,28 +69,16 +67,7 +4,37 +37,1 +27,2 +62,59 +45,70 +25,35 +65,53 +31,7 +53,59 +1,10 +67,10 +65,67 +30,67 +17,1 +67,59 +31,61 +59,59 +65,69 +51,59 +61,66 +13,15 +29,65 +27,1 +65,65 +68,53 +53,11 +5,17 +20,35 +43,68 +3,30 +59,7 +3,39 +45,63 +7,31 +3,13 +51,5 +23,39 +20,3 +67,0 +37,3 +46,61 +65,70 +15,1 +17,11 +66,63 +32,23 +51,0 +3,1 +17,3 +13,6 +59,3 +19,31 +1,24 +41,3 +4,49 +40,57 +63,6 +16,17 +22,25 +39,60 +11,34 +56,7 +38,57 +55,53 +35,66 +1,11 +64,19 +50,3 +9,38 +19,8 +64,61 +3,17 +8,33 +13,1 +5,9 +50,7 +1,34 +41,65 +48,57 +14,13 +17,31 +56,1 +6,15 +24,25 +23,2 +69,13 +45,52 +15,23 +15,27 +27,28 +60,3 +31,30 +19,35 +42,53 +19,27 +61,1 +65,50 +53,2 +52,61 +15,20 +42,7 +67,20 +11,23 +29,54 +6,17 +41,53 +47,63 +68,51 +21,21 +19,6 +53,61 +23,29 +53,9 +19,29 +21,10 +2,41 +10,3 +49,9 +42,59 +12,1 +45,7 +19,28 +3,35 +69,6 +43,4 +17,21 +47,3 +52,7 +65,22 +45,62 +16,5 +51,3 +48,11 +7,33 +40,3 +26,35 +37,63 +49,68 +11,26 +54,67 +64,23 +21,17 +5,49 +63,65 +23,13 +58,1 +61,54 +69,56 +47,60 +11,7 +9,35 +57,58 +45,66 +1,23 +7,21 +17,12 +11,17 +34,3 +25,25 +22,35 +57,65 +17,17 +1,5 +12,33 +36,63 +19,15 +7,38 +53,55 +21,25 +42,1 +17,23 +35,67 +33,3 +56,63 +56,59 +3,2 +42,67 +65,56 +45,5 +5,33 +21,22 +9,42 +3,14 +21,14 +59,53 +64,53 +33,25 +11,35 +9,1 +63,16 +47,49 +53,60 +47,55 +39,1 +63,60 +35,63 +9,31 +55,68 +57,57 +68,15 +11,39 +62,69 +41,45 +55,57 +5,13 +9,14 +1,32 +17,5 +19,19 +19,30 +1,29 +55,56 +6,35 +21,8 +13,0 +4,25 +16,33 +69,9 +53,67 +67,17 +52,67 +41,59 +24,1 +51,7 +54,7 +3,22 +7,13 +41,61 +45,3 +21,33 +37,53 +11,13 +45,8 +48,1 +43,13 +17,46 +1,33 +41,69 +22,19 +19,38 +19,12 +45,57 +53,6 +15,36 +35,68 +9,21 +43,65 +5,41 +7,7 +68,61 +60,1 +7,23 +21,28 +23,34 +63,69 +7,40 +51,64 +66,51 +43,61 +49,63 +69,11 +50,51 +53,13 +17,24 +47,65 +32,67 +4,15 +38,1 +58,63 +23,21 +61,59 +15,21 +11,27 +33,65 +2,1 +20,25 +11,3 +55,67 +5,31 +43,53 +63,66 +3,29 +65,55 +36,69 +64,1 +3,23 +11,6 +52,57 +61,4 +63,17 +61,69 +3,33 +65,4 +21,16 +27,11 +1,3 +5,39 +69,54 +63,47 +1,36 +27,27 +33,61 +25,37 +61,14 +15,26 +55,1 +7,17 +29,11 +11,12 +2,19 +66,55 +45,59 +29,29 +26,39 +8,17 +45,65 +11,37 +2,39 +0,29 +5,27 +16,31 +67,65 +68,63 +26,25 +9,30 +3,36 +48,65 +59,51 +63,1 +7,41 +23,28 +1,15 +18,1 +4,41 +43,63 +21,27 +67,22 +52,69 +7,18 +68,49 +3,12 +18,17 +9,41 +19,13 +1,17 +3,26 +59,61 +57,66 +53,63 +39,69 +3,3 +67,69 +50,57 +9,19 +1,13 +55,58 +49,6 +7,3 +47,1 +12,37 +59,63 +61,67 +8,45 +41,1 +8,1 +39,63 +8,27 +15,19 +1,25 +61,57 +47,66 +46,5 +0,39 +4,3 +67,8 +9,43 +64,67 +49,47 +63,14 +51,57 +0,47 +8,3 +21,15 +63,57 +46,3 +5,21 +15,31 +57,12 +13,18 +21,23 +67,15 +21,7 +23,14 +67,55 +63,63 +21,13 +67,58 +51,49 +25,26 +2,31 +56,51 +32,69 +55,7 +31,62 +65,57 +55,65 +5,24 +7,20 +11,15 +19,14 +65,21 +5,1 +67,5 +67,63 +67,49 +68,57 +19,21 +37,65 +11,1 +47,61 +33,7 +28,3 +12,21 +47,68 +41,70 +65,1 +69,23 +5,25 +47,11 +49,61 +1,35 +59,57 +1,37 +33,1 +53,57 +59,1 +49,65 +27,15 +60,11 +61,63 +5,34 +69,15 +9,20 +66,65 +49,62 +35,3 +55,5 +4,19 +21,20 +47,67 +59,68 +24,27 +41,5 +67,3 +21,3 +47,9 +65,17 +9,47 +23,3 +41,67 +65,63 +15,29 +55,49 +3,6 +69,17 +22,17 +48,51 +33,64 +51,65 +9,27 +58,55 +25,21 +69,24 +9,22 +64,63 +19,1 +9,36 +17,27 +54,49 +38,69 +8,5 +46,67 +60,57 +68,11 +0,7 +19,17 +39,65 +27,3 +9,40 +64,57 +17,25 +3,25 +19,9 +47,8 +58,61 +23,22 +21,11 +41,7 +18,9 +11,45 +51,67 +52,3 +8,43 +9,25 +69,8 +67,11 +2,27 +63,51 +65,61 +53,5 +7,19 +18,3 +67,18 +45,9 +55,63 +15,15 +47,64 +54,3 +13,31 +19,5 +41,64 +15,16 +37,67 +53,52 +12,9 +15,4 +25,34 +43,59 +2,17 +23,33 +57,8 +16,15 +57,67 +29,0 +66,69 +19,7 +42,61 +66,15 +67,61 +51,63 +36,7 +1,16 +2,23 +66,59 +67,2 +61,64 +56,65 +56,5 +15,2 +19,33 +15,28 +49,53 +5,35 +12,3 +65,18 +69,53 +11,33 +37,2 +47,69 +57,69 +11,5 +34,7 +3,45 +63,5 +15,33 +35,1 +17,20 +23,11 +6,31 +17,35 +50,61 +51,4 +64,3 +62,55 +3,9 +49,60 +13,35 +68,69 +21,37 +44,63 +2,9 +15,7 +49,5 +67,13 +9,39 +9,33 +9,24 +2,11 +5,23 +46,55 +17,22 +9,23 +48,3 +45,13 +47,58 +60,59 +5,18 +14,3 +24,11 +56,69 +43,55 +57,63 +55,10 +17,33 +53,47 +36,3 +13,16 +5,32 +64,7 +32,3 +51,51 +10,17 +13,37 +40,59 +11,31 +13,19 +19,10 +49,1 +34,1 +10,27 +42,9 +61,2 +58,57 +13,33 +25,3 +43,2 +23,31 +24,37 +59,66 +12,29 +7,10 +31,65 +19,23 +39,64 +22,39 +18,5 +55,62 +23,18 +39,62 +53,50 +21,31 +40,55 +58,5 +23,40 +67,66 +69,59 +23,25 +39,61 +1,7 +21,1 +21,5 +57,61 +51,53 +53,51 +5,29 +69,47 +30,27 +5,14 +10,45 +18,23 +7,29 +55,60 +40,7 +49,7 +14,31 +15,25 +68,19 +57,49 +12,23 +7,30 +60,49 +50,9 +16,1 +22,9 +57,55 +15,24 +65,49 +69,25 +59,69 +28,69 +4,21 +23,36 +58,69 +69,61 +23,8 +5,8 +43,1 +9,37 +55,69 +3,11 +66,53 +70,59 +14,19 +15,17 +9,13 +59,55 +36,65 +69,67 +8,23 +23,32 +3,8 +65,3 +69,65 +29,5 +9,15 +61,61 +13,34 +1,1 +3,4 +68,45 +45,56 +33,69 +67,48 +38,65 +6,21 +0,3 +63,68 +50,67 +15,13 +63,58 +9,34 +67,1 +48,63 +60,69 +69,51 +57,47 +70,67 +51,47 +59,54 +57,7 +43,67 +4,45 +59,67 +45,2 +67,57 +62,1 +69,52 +31,63 +69,21 +31,15 +27,9 +3,37 +19,25 +63,55 +6,3 +53,3 +20,21 +13,17 +23,30 +6,23 +43,7 +17,29 +57,2 +21,32 +51,69 +7,1 +44,5 +57,1 +33,66 +45,69 +59,8 +9,3 +13,23 +11,22 +65,5 +1,9 +24,17 +61,3 +49,57 +12,19 +13,28 +69,12 +10,51 +53,53 +13,47 +31,69 +24,43 +69,63 +20,17 +67,21 +44,55 +33,68 +7,15 +45,1 +39,55 +39,4 +69,60 +23,27 +45,61 +51,61 +25,1 +63,3 +37,69 +33,5 +17,15 +9,32 +7,39 +63,54 +65,47 +29,19 +53,43 +60,33 +57,45 +5,6 +47,27 +39,25 +48,47 +53,36 +43,18 +49,21 +41,21 +23,19 +52,35 +39,45 +55,17 +29,39 +57,51 +55,45 +54,27 +33,26 +40,19 +44,17 +57,20 +37,45 +27,64 +31,13 +41,13 +5,7 +9,57 +10,69 +23,47 +1,51 +0,69 +49,12 +3,58 +15,9 +21,53 +53,27 +45,11 +63,42 +27,56 +6,11 +27,12 +27,31 +23,41 +35,41 +15,61 +61,27 +21,43 +41,43 +17,56 +11,66 +41,28 +51,37 +41,27 +38,59 +39,47 +59,41 +11,41 +26,59 +59,16 +29,35 +1,45 +33,41 +55,29 +65,39 +47,50 +28,5 +39,43 +35,21 +54,25 +43,16 +51,43 +31,17 +23,53 +37,21 +43,22 +22,55 +57,17 +15,49 +36,57 +11,48 +56,27 +36,39 +53,35 +8,51 +29,46 +61,29 +67,37 +31,35 +42,47 +63,41 +37,18 +43,36 +52,21 +63,9 +57,48 +29,36 +39,27 +35,59 +55,41 +25,53 +45,47 +19,66 +29,44 +61,5 +49,23 +14,59 +27,59 +19,58 +16,13 +44,51 +29,24 +13,7 +26,19 +37,20 +41,40 +28,27 +65,38 +41,47 +47,19 +49,49 +46,39 +38,55 +13,65 +53,44 +31,49 +36,5 +68,5 +42,45 +3,5 +4,63 +59,23 +23,56 +15,59 +37,52 +67,35 +11,11 +1,63 +11,25 +19,47 +31,33 +61,36 +27,46 +35,44 +46,21 +9,56 +5,59 +27,41 +35,37 +28,13 +39,20 +61,23 +36,15 +35,9 +7,8 +52,15 +14,39 +51,21 +65,25 +35,12 +58,15 +66,35 +23,7 +35,62 +63,25 +68,1 +23,64 +68,33 +65,28 +44,29 +19,67 +29,43 +47,51 +25,67 +2,45 +55,21 +37,43 +32,21 +58,51 +69,33 +13,29 +41,11 +47,23 +65,35 +23,45 +31,64 +41,50 +1,65 +25,39 +42,39 +44,47 +67,39 +32,35 +43,38 +51,29 +9,6 +41,24 +3,67 +57,31 +41,44 +53,19 +19,41 +14,61 +15,41 +46,49 +39,35 +62,51 +51,23 +32,9 +23,60 +1,47 +49,27 +57,36 +19,52 +43,49 +49,35 +21,50 +49,39 +53,38 +51,19 +21,57 +43,45 +33,38 +45,41 +1,56 +39,22 +21,63 +48,49 +47,30 +37,39 +4,61 +34,13 +26,51 +47,39 +19,45 +31,59 +3,52 +17,54 +69,45 +15,35 +49,11 +17,69 +55,13 +64,39 +57,33 +45,40 +28,21 +11,9 +64,29 +33,19 +21,60 +32,19 +47,25 +57,53 +31,4 +17,61 +69,5 +19,39 +46,15 +60,51 +9,50 +27,40 +63,29 +59,36 +11,55 +25,61 +30,55 +35,25 +27,69 +23,1 +9,65 +43,37 +27,42 +19,49 +56,45 +13,49 +35,7 +33,47 +43,11 +38,33 +35,49 +63,39 +41,20 +13,48 +1,60 +43,30 +7,45 +55,19 +65,19 +53,15 +33,53 +29,49 +51,45 +13,50 +34,23 +20,55 +10,11 +12,39 +17,53 +11,65 +27,37 +8,53 +65,24 +65,45 +61,45 +7,65 +59,37 +27,21 +39,39 +31,67 +45,23 +53,10 +59,22 +25,42 +1,57 +54,45 +13,10 +43,23 +37,51 +51,13 +40,35 +48,45 +36,27 +1,59 +39,51 +57,32 +31,5 +35,5 +8,69 +25,29 +39,9 +19,53 +29,40 +61,43 +7,62 +39,17 +3,54 +27,57 +67,43 +23,49 +53,17 +29,47 +25,41 +9,62 +61,35 +27,38 +23,9 +67,38 +41,49 +22,45 +43,15 +25,17 +13,69 +31,52 +29,68 +29,37 +30,37 +7,63 +37,27 +55,39 +65,13 +50,23 +59,11 +25,11 +25,65 +26,15 +55,37 +47,18 +20,69 +12,69 +8,47 +61,17 +53,12 +54,41 +9,69 +33,59 +57,37 +47,47 +61,39 +40,13 +69,3 +18,55 +22,47 +65,41 +31,45 +21,9 +38,27 +61,30 +61,55 +3,57 +51,11 +20,57 +41,51 +61,15 +40,37 +53,23 +49,38 +22,69 +1,61 +16,59 +20,65 +17,63 +51,17 +26,45 +24,31 +61,49 +38,41 +22,51 +29,16 +11,52 +34,35 +30,61 +37,33 +58,19 +9,29 +29,17 +61,9 +2,51 +7,59 +49,51 +35,55 +8,59 +29,41 +37,47 +23,67 +30,53 +15,69 +33,27 +49,31 +69,29 +59,43 +3,41 +43,10 +59,19 +35,27 +61,11 +27,25 +49,30 +28,57 +15,53 +39,29 +45,46 +16,41 +28,9 +27,61 +37,15 +29,18 +15,47 +17,57 +25,19 +37,25 +11,64 +45,12 +61,46 +14,67 +6,51 +19,65 +32,17 +21,65 +46,29 +51,28 +25,6 +19,51 +35,61 +47,41 +45,45 +39,49 +36,25 +19,59 +32,25 +25,47 +30,41 +62,19 +39,50 +41,41 +44,43 +53,37 +33,14 +40,51 +62,47 +19,48 +55,43 +63,13 +68,43 +65,29 +53,25 +23,59 +39,11 +54,17 +59,35 +63,53 +13,11 +35,58 +12,5 +63,21 +25,20 +45,37 +34,47 +24,55 +3,53 +11,67 +46,33 +25,31 +56,23 +36,43 +8,65 +61,19 +37,41 +41,31 +31,27 +37,23 +64,49 +6,67 +9,17 +11,40 +17,13 +26,11 +67,41 +23,57 +13,52 +50,17 +21,35 +33,51 +59,40 +27,5 +36,33 +3,62 +35,60 +58,43 +13,56 +24,67 +17,37 +29,53 +63,23 +20,51 +24,39 +13,12 +2,55 +62,41 +28,49 +39,44 +20,47 +52,27 +35,39 +59,25 +35,32 +49,29 +65,31 +35,52 +54,47 +29,51 +37,9 +13,13 +53,31 +45,39 +9,7 +39,13 +17,65 +37,31 +24,5 +30,5 +2,65 +28,7 +49,17 +55,55 +37,24 +13,5 +3,68 +49,13 +56,15 +21,49 +41,37 +43,26 +57,25 +3,47 +29,21 +47,43 +29,42 +55,11 +35,19 +6,55 +53,34 +23,17 +31,12 +4,69 +15,43 +66,33 +59,33 +13,57 +17,42 +10,67 +59,13 +50,37 +33,45 +35,40 +38,7 +21,41 +9,63 +53,1 +33,37 +13,66 +50,15 +1,55 +19,36 +18,47 +61,26 +49,25 +59,38 +5,43 +37,62 +11,61 +22,67 +61,18 +33,55 +18,61 +25,9 +62,49 +56,29 +65,44 +59,29 +33,39 +55,9 +49,37 +13,55 +35,22 +41,39 +48,19 +30,21 +13,9 +21,39 +37,61 +29,15 +27,52 +19,55 +47,35 +51,33 +8,55 +63,7 +35,46 +11,54 +29,69 +15,52 +31,46 +25,62 +63,43 +41,26 +61,41 +7,64 +43,35 +47,33 +40,33 +45,36 +57,41 +57,23 +57,27 +11,29 +5,69 +63,37 +7,25 +34,9 +57,24 +23,5 +59,18 +23,55 +48,41 +11,47 +16,57 +60,25 +60,23 +20,53 +66,47 +56,33 +30,11 +15,46 +26,33 +64,33 +51,10 +35,13 +5,55 +33,21 +10,55 +35,11 +9,53 +23,44 +63,11 +69,1 +21,45 +6,47 +42,17 +32,41 +17,49 +61,12 +35,45 +31,51 +55,20 +31,25 +7,51 +41,15 +45,31 +31,8 +29,13 +3,43 +27,70 +59,21 +43,41 +67,45 +59,46 +56,43 +5,66 +18,39 +39,10 +1,22 +68,25 +15,48 +68,41 +2,67 +37,46 +15,44 +25,69 +43,47 +61,28 +61,31 +43,20 +48,37 +19,44 +24,9 +27,16 +37,29 +51,40 +38,25 +62,31 +31,23 +47,21 +13,53 +12,61 +37,8 +5,47 +17,67 +49,44 +31,19 +25,57 +13,67 +3,65 +63,8 +3,69 +29,63 +11,63 +27,60 +31,37 +29,61 +25,27 +32,13 +1,53 +52,31 +57,35 +36,35 +67,32 +33,30 +4,57 +23,43 +39,31 +46,47 +5,61 +43,51 +51,9 +10,43 +5,63 +69,41 +7,60 +53,21 +45,35 +34,25 +37,35 +33,40 +64,9 +37,7 +9,49 +13,59 +70,43 +11,46 +43,34 +36,49 +29,9 +46,13 +31,38 +41,23 +65,33 +47,28 +54,37 +23,58 +33,33 +1,43 +7,67 +6,43 +63,33 +27,17 +49,41 +15,40 +43,21 +50,1 +61,21 +5,5 +51,48 +37,10 +44,49 +1,64 +55,31 +13,54 +47,31 +31,57 +45,49 +57,50 +52,25 +48,33 +61,13 +27,29 +31,28 +19,69 +23,15 +45,20 +65,42 +24,63 +55,47 +61,20 +40,29 +45,55 +11,59 +48,35 +25,5 +33,29 +15,10 +59,44 +41,29 +24,23 +43,27 +69,31 +37,38 +45,15 +51,15 +65,11 +5,46 +41,33 +62,37 +62,35 +53,20 +59,31 +9,67 +31,44 +46,37 +22,59 +27,19 +41,16 +25,4 +11,8 +31,9 +16,7 +28,61 +49,45 +45,21 +57,15 +50,25 +30,7 +14,69 +43,14 +33,49 +42,33 +67,36 +21,62 +51,38 +37,49 +62,9 +58,13 +35,43 +1,49 +57,46 +25,43 +5,67 +31,53 +59,9 +8,67 +13,63 +43,32 +33,42 +30,49 +0,63 +1,50 +21,59 +19,63 +36,55 +23,37 +67,27 +10,61 +5,56 +31,31 +47,13 +20,45 +28,31 +1,67 +15,62 +34,19 +55,40 +62,23 +2,47 +67,31 +39,5 +7,57 +15,70 +33,57 +28,53 +55,27 +7,5 +66,25 +47,22 +11,51 +23,51 +53,28 +61,33 +23,69 +65,37 +11,53 +31,3 +64,45 +7,69 +13,42 +31,34 +4,65 +68,21 +55,15 +41,55 +15,56 +39,33 +45,34 +25,15 +19,61 +21,67 +37,48 +24,53 +7,49 +37,30 +43,31 +5,15 +37,36 +31,41 +27,65 +25,13 +0,53 +37,57 +45,43 +15,65 +25,45 +33,48 +15,42 +15,38 +45,51 +3,55 +29,7 +39,23 +13,39 +20,63 +31,56 +45,27 +64,31 +27,39 +33,16 +25,14 +61,25 +21,55 +55,23 +43,39 +18,65 +15,67 +43,9 +30,59 +26,29 +41,17 +60,15 +25,23 +57,9 +24,15 +10,57 +17,59 +65,27 +52,45 +58,29 +70,31 +15,39 +55,35 +43,33 +17,55 +29,45 +55,14 +9,59 +53,16 +31,43 +15,5 +17,43 +62,43 +17,47 +59,28 +10,29 +67,29 +61,37 +69,36 +22,53 +43,43 +29,57 +48,15 +29,67 +61,47 +33,35 +51,31 +35,23 +27,13 +34,55 +27,18 +25,49 +25,63 +34,37 +39,38 +60,39 +55,25 +31,32 +53,39 +37,17 +39,21 +33,50 +68,27 +50,47 +26,53 +56,41 +15,51 +51,42 +11,43 +21,47 +35,33 +50,41 +31,11 +45,32 +31,29 +33,28 +15,57 +69,28 +23,63 +35,47 +55,22 +29,27 +29,59 +62,15 +27,67 +13,43 +53,24 +6,5 +29,50 +44,41 +10,63 +36,37 +1,58 +59,27 +39,37 +26,23 +25,33 +39,16 +15,50 +60,21 +3,63 +45,19 +46,41 +42,11 +5,57 +5,45 +4,53 +42,49 +49,33 +10,59 +21,69 +3,61 +30,19 +28,33 +21,42 +30,23 +69,37 +16,37 +33,17 +65,23 +38,53 +54,13 +43,19 +16,9 +34,61 +70,3 +38,49 +39,7 +37,42 +31,47 +15,54 +70,41 +50,21 +15,55 +61,44 +47,29 +54,9 +13,24 +18,69 +25,55 +45,10 +17,51 +52,13 +3,59 +27,53 +22,43 +45,25 +5,53 +39,19 +32,7 +13,51 +33,11 +13,61 +33,15 +59,39 +54,31 +63,31 +30,33 +50,35 +28,29 +22,65 +14,7 +13,64 +13,41 +35,30 +37,14 +27,63 +21,51 +23,23 +57,26 +66,29 +29,48 +35,50 +27,49 +51,35 +13,45 +69,35 +27,44 +13,27 +20,61 +37,19 +2,61 +33,9 +53,32 +61,53 +65,43 +44,13 +51,39 +35,17 +24,47 +27,55 +56,53 +31,36 +50,45 +51,30 +17,68 +29,33 +59,48 +47,45 +34,53 +41,19 +42,29 +45,44 +7,43 +63,45 +34,17 +51,25 +3,51 +37,12 +29,31 +3,42 +63,61 +66,13 +7,48 +27,43 +61,32 +59,49 +15,63 +3,15 +40,47 +35,31 +29,55 +26,57 +1,69 +65,10 +5,11 +24,21 +57,21 +41,25 +38,15 +37,5 +51,27 +41,30 +11,57 +63,26 +67,25 +29,23 +39,18 +17,39 +52,41 +57,39 +51,41 +25,50 +21,61 +35,15 +9,51 +69,30 +56,39 +49,20 +61,51 +27,23 +25,51 +49,16 +67,19 +63,35 +17,41 +56,17 +65,46 +63,40 +6,53 +37,28 +7,47 +32,53 +47,37 +59,45 +70,21 +49,32 +25,7 +26,67 +25,60 +65,26 +59,17 +9,55 +6,45 +11,21 +18,13 +25,68 +39,40 +11,50 +67,46 +45,33 +37,54 +7,58 +35,29 +55,33 +29,14 +23,61 +21,38 +57,11 +15,66 +38,45 +25,59 +40,43 +37,37 +51,18 +67,47 +18,51 +56,35 +49,43 +7,27 +13,44 +46,17 +31,39 +27,33 +5,51 +13,46 +68,39 +61,7 +39,26 +45,53 +43,29 +34,33 +39,15 +7,53 +33,44 +69,39 +62,11 +23,65 +59,15 +41,42 +55,59 +27,7 +50,33 +69,43 +32,59 +58,23 +29,58 +41,36 +49,24 +45,17 +55,34 +33,31 +16,61 +7,55 +31,21 +23,48 +46,45 +6,63 +41,14 +4,59 +35,57 +59,47 +49,28 +57,38 +63,27 +41,22 +13,21 +5,50 +47,26 +57,43 +53,22 +36,17 +57,13 +9,61 +66,39 +55,30 +16,67 +46,25 +13,25 +43,17 +9,11 +53,33 +35,20 +37,55 +58,33 +10,9 +44,23 +45,29 +33,10 +37,11 +63,67 +1,41 +64,35 +33,23 +19,43 +53,29 +47,17 +31,55 +13,58 +33,13 +59,42 +6,69 +43,25 +11,69 +47,15 +41,9 +25,64 +27,47 +47,42 +17,64 +47,53 +17,9 +20,67 +18,59 +13,26 +53,41 +29,26 +59,30 +33,56 +44,27 +26,47 +27,66 +3,21 +49,26 +29,66 +12,59 +41,35 +25,48 +33,32 +27,35 +39,57 +15,64 +37,22 +39,6 +5,65 +11,49 +65,9 +29,25 +49,15 +9,9 +66,41 +55,18 +41,52 +38,31 +59,52 +69,34 +27,51 +27,45 +59,10 +3,49 +29,22 +7,61 +35,35 +32,49 +67,33 +63,48 +20,41 +19,40 +1,21 +1,44 +57,29 +64,13 +49,14 +17,44 +40,9 +19,57 +69,27 +67,23 +63,49 +62,25 +47,24 +17,50 +35,51 +50,11 +32,47 +33,43 +49,19 +39,41 +67,30 +61,34 +43,60 +12,46 +70,22 +38,20 +14,44 +41,38 +22,52 +12,67 +2,7 +58,46 +34,30 +34,70 +6,46 +20,68 +7,24 +9,18 +33,20 +60,42 +67,24 +37,6 +0,61 +12,18 +20,10 +39,54 +69,0 +16,65 +40,63 +14,10 +34,21 +54,56 +16,21 +62,12 +23,24 +48,61 +70,29 +30,16 +0,66 +70,6 +6,52 +30,62 +35,14 +62,36 +48,58 +13,8 +28,60 +22,26 +66,17 +62,54 +40,53 +12,53 +23,54 +61,40 +43,66 +0,34 +15,68 +32,66 +22,10 +42,48 +28,6 +38,38 +55,28 +46,23 +16,68 +52,54 +5,52 +4,64 +57,42 +2,49 +38,12 +64,38 +28,52 +68,31 +68,52 +21,70 +16,16 +8,31 +9,66 +4,55 +11,68 +36,14 +42,16 +32,39 +54,64 +18,58 +52,46 +68,22 +7,0 +29,62 +0,44 +35,8 +18,67 +23,52 +58,42 +26,2 +32,57 +8,66 +30,20 +0,30 +12,6 +46,1 +49,2 +34,56 +16,52 +2,2 +48,24 +25,38 +41,34 +46,28 +32,26 +53,48 +34,69 +11,28 +3,64 +62,8 +12,48 +19,22 +4,11 +24,30 +22,31 +32,45 +19,68 +12,60 +7,32 +22,38 +25,58 +55,42 +47,70 +18,28 +66,62 +34,41 +44,57 +4,10 +53,64 +38,34 +12,22 +37,70 +0,42 +30,31 +35,54 +61,48 +58,34 +36,38 +66,43 +54,52 +39,66 +43,62 +60,52 +37,44 +42,22 +53,0 +70,25 +18,40 +69,20 +53,58 +21,18 +25,12 +0,67 +25,44 +22,14 +48,32 +48,38 +18,15 +52,30 +34,15 +52,43 +52,52 +46,63 +2,22 +10,21 +22,64 +37,58 +10,31 +21,64 +6,40 +0,58 +36,42 +24,2 +65,20 +0,1 +2,58 +21,26 +0,68 +62,26 +8,32 +38,17 +11,56 +19,18 +31,20 +43,70 +0,5 +3,10 +14,38 +14,37 +32,33 +18,44 +62,53 +6,29 +70,30 +42,21 +18,37 +23,38 +14,60 +46,59 +34,22 +10,48 +8,63 +68,20 +50,58 +44,32 +4,67 +40,14 +22,34 +6,25 +38,52 +38,48 +32,30 +38,54 +26,49 +5,30 +34,48 +45,28 +56,58 +17,60 +10,38 +44,70 +24,49 +7,12 +42,38 +38,13 +52,48 +40,2 +52,59 +20,52 +21,68 +44,44 +2,70 +10,6 +24,52 +40,48 +48,20 +70,20 +36,23 +36,58 +20,27 +58,4 +2,8 +26,38 +4,38 +36,60 +12,57 +34,49 +30,29 +48,50 +18,60 +22,21 +64,62 +31,50 +20,37 +20,33 +5,40 +34,46 +12,12 +17,32 +2,29 +44,28 +58,45 +32,63 +54,30 +12,42 +16,28 +8,16 +66,42 +12,49 +12,63 +26,68 +18,25 +44,21 +17,6 +34,34 +36,67 +2,13 +26,3 +70,0 +39,58 +17,14 +18,12 +43,50 +16,25 +2,34 +8,50 +62,6 +26,41 +50,40 +30,56 +18,49 +4,32 +16,60 +22,8 +15,6 +21,36 +4,58 +29,28 +47,40 +36,62 +34,14 +33,60 +8,44 +43,8 +60,55 +39,30 +24,24 +36,11 +47,48 +38,32 +22,58 +31,10 +38,60 +16,46 +10,5 +23,50 +0,14 +4,60 +10,64 +20,22 +66,37 +28,51 +27,26 +38,21 +30,43 +19,20 +0,28 +16,54 +40,46 +34,5 +56,42 +8,34 +41,68 +61,8 +50,63 +27,14 +36,8 +26,36 +30,70 +36,20 +70,33 +41,2 +70,19 +5,22 +38,10 +10,40 +28,42 +42,41 +46,42 +0,23 +70,46 +24,40 +16,39 +38,56 +26,50 +22,5 +40,56 +34,57 +52,64 +46,70 +8,26 +3,34 +32,52 +70,44 +12,24 +8,10 +28,50 +14,16 +20,56 +9,60 +8,20 +37,34 +49,22 +27,24 +17,10 +68,30 +22,62 +22,15 +58,35 +69,44 +14,20 +48,22 +48,25 +51,2 +26,21 +6,30 +12,26 +33,12 +5,60 +60,56 +0,70 +4,56 +56,50 +58,47 +46,0 +50,22 +52,68 +4,4 +32,36 +34,60 +30,17 +36,56 +62,42 +28,23 +3,50 +35,28 +39,34 +38,3 +30,12 +20,7 +18,57 +52,60 +6,50 +52,49 +4,13 +56,56 +8,70 +44,8 +70,1 +28,62 +42,42 +60,12 +50,28 +47,38 +60,43 +50,54 +51,50 +55,12 +31,18 +47,32 +18,16 +16,6 +62,32 +24,69 +2,54 +62,27 +40,32 +38,68 +8,36 +59,70 +52,16 +68,37 +24,18 +53,8 +14,70 +31,60 +32,4 +33,36 +64,14 +52,22 +31,22 +12,51 +16,38 +30,1 +48,40 +57,56 +69,40 +25,32 +50,60 +49,4 +30,64 +46,22 +28,48 +42,56 +2,43 +46,6 +6,41 +43,46 +20,59 +54,6 +58,64 +0,59 +41,10 +54,42 +62,63 +30,57 +4,17 +22,40 +60,44 +52,42 +28,30 +7,2 +0,15 +22,27 +70,38 +30,68 +5,64 +35,38 +0,20 +17,62 +55,70 +5,4 +56,60 +34,42 +60,61 +40,27 +38,44 +5,16 +14,51 +18,26 +46,46 +69,26 +48,14 +32,43 +10,28 +27,22 +54,20 +14,48 +67,26 +57,0 +4,70 +59,12 +51,6 +40,10 +59,20 +32,8 +34,2 +20,18 +62,44 +64,46 +20,58 +56,31 +54,69 +28,14 +0,17 +22,12 +52,0 +20,44 +34,8 +32,29 +65,30 +56,3 +26,52 +4,47 +22,1 +13,38 +62,65 +0,31 +44,42 +42,15 +42,10 +24,38 +10,62 +26,64 +48,64 +48,21 +43,56 +8,46 +4,7 +9,0 +30,14 +56,61 +68,34 +56,55 +13,40 +50,62 +8,2 +50,39 +18,68 +0,37 +4,5 +47,36 +14,24 +44,58 +56,25 +24,62 +6,13 +11,2 +20,5 +18,11 +51,16 +56,6 +53,70 +32,0 +34,51 +37,56 +18,41 +42,70 +24,20 +22,44 +28,46 +20,38 +36,34 +10,56 +43,44 +0,60 +1,70 +37,0 +58,12 +68,17 +66,14 +70,40 +61,58 +53,40 +60,19 +14,4 +3,20 +6,38 +53,18 +24,8 +14,43 +42,43 +50,4 +57,30 +7,50 +37,40 +64,65 +36,47 +66,34 +16,27 +70,34 +20,14 +60,27 +32,31 +66,48 +43,28 +64,28 +67,54 +13,70 +50,38 +42,58 +52,26 +24,29 +20,48 +17,30 +66,67 +68,64 +68,9 +14,68 +70,24 +38,5 +60,47 +11,60 +67,12 +0,43 +1,12 +56,16 +38,22 +24,68 +51,8 +38,63 +60,22 +36,54 +38,61 +66,45 +46,27 +48,8 +6,0 +27,30 +8,40 +32,60 +5,62 +62,67 +64,32 +52,37 +60,5 +70,64 +10,18 +63,52 +18,20 +34,39 +1,62 +51,34 +40,49 +28,38 +51,62 +8,54 +45,58 +5,10 +12,15 +68,8 +26,22 +35,34 +58,32 +32,34 +10,10 +6,7 +38,42 +62,57 +52,6 +40,22 +62,70 +58,6 +50,48 +41,46 +52,18 +60,2 +25,70 +5,0 +50,6 +39,2 +2,4 +62,45 +48,23 +57,34 +55,66 +18,14 +9,52 +24,22 +54,60 +49,52 +12,54 +54,14 +63,44 +56,64 +4,0 +20,50 +18,64 +1,18 +14,41 +16,35 +29,2 +66,52 +12,50 +42,68 +34,24 +56,57 +66,32 +57,60 +28,8 +22,66 +32,32 +52,58 +50,42 +4,36 +16,32 +65,58 +56,20 +42,0 +17,4 +34,68 +49,36 +32,58 +68,50 +19,16 +6,70 +40,38 +60,37 +50,49 +34,40 +51,70 +1,38 +13,32 +53,66 +6,32 +65,32 +32,22 +14,55 +38,30 +44,26 +66,8 +50,30 +48,31 +5,36 +52,19 +29,30 +24,50 +55,36 +46,69 +64,18 +44,0 +27,10 +68,32 +60,13 +12,17 +10,34 +18,18 +70,52 +10,8 +12,38 +16,70 +8,9 +58,65 +64,21 +70,4 +5,48 +22,49 +36,2 +18,30 +41,6 +10,44 +48,48 +60,14 +23,42 +46,36 +18,56 +40,18 +36,40 +24,59 +64,64 +40,11 +59,50 +14,57 +25,46 +65,0 +32,16 +24,4 +40,34 +50,36 +38,50 +20,30 +66,38 +14,40 +70,62 +6,58 +12,28 +62,60 +68,28 +36,29 +58,37 +45,68 +22,22 +40,65 +49,64 +24,65 +40,8 +0,12 +40,64 +70,66 +23,62 +66,49 +28,32 +47,44 +10,12 +29,8 +26,18 +28,16 +49,50 +7,6 +30,54 +52,10 +32,10 +1,0 +40,28 +7,52 +18,54 +5,42 +58,10 +54,40 +41,4 +10,22 +24,56 +44,36 +39,14 +12,2 +65,48 +20,16 +10,4 +56,66 +40,68 +16,19 +45,42 +20,43 +50,18 +40,15 +0,6 +18,62 +14,2 +51,44 +35,48 +54,68 +7,4 +30,25 +27,36 +48,9 +42,46 +57,54 +68,55 +34,59 +58,16 +70,65 +70,14 +24,12 +46,12 +30,39 +55,2 +38,8 +62,22 +3,70 +60,40 +7,44 +9,44 +16,58 +64,2 +22,46 +40,45 +23,0 +62,30 +46,18 +23,6 +27,48 +31,66 +66,30 +52,9 +29,20 +36,21 +69,10 +24,41 +8,38 +44,34 +37,66 +68,4 +34,28 +21,44 +28,70 +42,30 +35,42 +46,16 +6,8 +36,48 +8,61 +14,26 +62,0 +28,45 +46,7 +7,68 +32,40 +61,24 +32,1 +40,12 +58,2 +62,58 +0,2 +42,60 +13,68 +48,59 +6,18 +36,28 +61,0 +63,28 +58,8 +44,33 +59,6 +64,6 +12,62 +30,32 +39,56 +70,32 +67,44 +56,11 +38,6 +2,36 +60,50 +55,26 +58,66 +55,8 +48,17 +56,2 +64,0 +60,41 +64,24 +42,52 +30,13 +16,20 +30,44 +1,26 +47,34 +24,54 +56,8 +16,0 +2,32 +62,38 +70,56 +18,50 +9,28 +63,38 +30,18 +10,70 +44,25 +57,40 +28,26 +54,0 +36,12 +32,24 +44,62 +52,23 +19,54 +45,30 +51,68 +8,8 +48,62 +40,60 +48,6 +48,69 +22,36 +61,10 +62,28 +51,66 +14,18 +53,56 +29,52 +63,4 +46,50 +26,69 +52,56 +21,54`) + require.Equal(t, 304, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`2,5 +20,1 +63,59 +21,29 +37,59 +33,63 +14,33 +70,15 +21,34 +62,5 +45,54 +45,60 +48,53 +33,58 +23,35 +22,3 +33,0 +63,62 +44,67 +52,55 +5,19 +42,55 +45,0 +57,3 +15,45 +41,62 +1,39 +63,19 +39,59 +39,3 +48,7 +61,65 +31,1 +54,51 +11,14 +53,62 +67,68 +65,16 +17,45 +21,24 +55,3 +30,15 +4,39 +69,19 +69,57 +41,57 +43,24 +19,11 +18,27 +3,48 +8,13 +41,66 +67,67 +61,62 +5,37 +18,19 +29,64 +13,14 +42,57 +33,67 +0,19 +67,53 +47,59 +19,3 +51,54 +53,69 +42,5 +7,26 +59,65 +50,69 +3,27 +26,9 +43,3 +17,7 +15,11 +12,31 +43,5 +50,65 +9,5 +29,3 +21,6 +65,15 +43,57 +15,37 +50,53 +67,51 +29,1 +47,7 +55,54 +52,51 +47,54 +17,26 +12,43 +65,51 +1,27 +15,22 +63,15 +7,37 +69,49 +57,59 +7,36 +60,7 +66,7 +18,35 +13,36 +21,19 +15,3 +46,9 +30,3 +53,7 +8,7 +66,3 +49,69 +35,65 +48,5 +33,6 +1,31 +26,5 +44,59 +68,13 +45,67 +9,16 +51,55 +57,5 +2,33 +57,64 +31,2 +1,19 +5,12 +19,37 +40,67 +10,19 +21,12 +3,31 +51,1 +4,29 +52,65 +47,5 +17,19 +70,47 +11,19 +57,10 +54,55 +39,53 +61,56 +49,55 +28,37 +21,30 +9,45 +43,69 +57,19 +29,10 +60,63 +19,32 +66,5 +53,45 +53,49 +47,57 +26,1 +17,34 +65,7 +7,28 +41,63 +6,1 +69,69 +0,13 +5,28 +10,1 +38,67 +37,13 +3,7 +39,12 +2,15 +54,65 +35,53 +63,20 +13,30 +52,47 +13,3 +69,55 +55,61 +37,4 +7,35 +57,4 +35,69 +5,3 +63,64 +40,69 +59,5 +32,61 +66,61 +43,64 +40,1 +49,3 +68,65 +3,38 +21,4 +49,56 +18,29 +23,12 +7,11 +16,29 +8,11 +10,25 +39,67 +59,60 +3,19 +26,31 +7,9 +51,58 +49,67 +53,65 +65,59 +67,9 +43,58 +55,51 +69,7 +6,39 +49,59 +10,37 +4,43 +54,5 +3,28 +69,16 +67,7 +4,37 +37,1 +27,2 +62,59 +45,70 +25,35 +65,53 +31,7 +53,59 +1,10 +67,10 +65,67 +30,67 +17,1 +67,59 +31,61 +59,59 +65,69 +51,59 +61,66 +13,15 +29,65 +27,1 +65,65 +68,53 +53,11 +5,17 +20,35 +43,68 +3,30 +59,7 +3,39 +45,63 +7,31 +3,13 +51,5 +23,39 +20,3 +67,0 +37,3 +46,61 +65,70 +15,1 +17,11 +66,63 +32,23 +51,0 +3,1 +17,3 +13,6 +59,3 +19,31 +1,24 +41,3 +4,49 +40,57 +63,6 +16,17 +22,25 +39,60 +11,34 +56,7 +38,57 +55,53 +35,66 +1,11 +64,19 +50,3 +9,38 +19,8 +64,61 +3,17 +8,33 +13,1 +5,9 +50,7 +1,34 +41,65 +48,57 +14,13 +17,31 +56,1 +6,15 +24,25 +23,2 +69,13 +45,52 +15,23 +15,27 +27,28 +60,3 +31,30 +19,35 +42,53 +19,27 +61,1 +65,50 +53,2 +52,61 +15,20 +42,7 +67,20 +11,23 +29,54 +6,17 +41,53 +47,63 +68,51 +21,21 +19,6 +53,61 +23,29 +53,9 +19,29 +21,10 +2,41 +10,3 +49,9 +42,59 +12,1 +45,7 +19,28 +3,35 +69,6 +43,4 +17,21 +47,3 +52,7 +65,22 +45,62 +16,5 +51,3 +48,11 +7,33 +40,3 +26,35 +37,63 +49,68 +11,26 +54,67 +64,23 +21,17 +5,49 +63,65 +23,13 +58,1 +61,54 +69,56 +47,60 +11,7 +9,35 +57,58 +45,66 +1,23 +7,21 +17,12 +11,17 +34,3 +25,25 +22,35 +57,65 +17,17 +1,5 +12,33 +36,63 +19,15 +7,38 +53,55 +21,25 +42,1 +17,23 +35,67 +33,3 +56,63 +56,59 +3,2 +42,67 +65,56 +45,5 +5,33 +21,22 +9,42 +3,14 +21,14 +59,53 +64,53 +33,25 +11,35 +9,1 +63,16 +47,49 +53,60 +47,55 +39,1 +63,60 +35,63 +9,31 +55,68 +57,57 +68,15 +11,39 +62,69 +41,45 +55,57 +5,13 +9,14 +1,32 +17,5 +19,19 +19,30 +1,29 +55,56 +6,35 +21,8 +13,0 +4,25 +16,33 +69,9 +53,67 +67,17 +52,67 +41,59 +24,1 +51,7 +54,7 +3,22 +7,13 +41,61 +45,3 +21,33 +37,53 +11,13 +45,8 +48,1 +43,13 +17,46 +1,33 +41,69 +22,19 +19,38 +19,12 +45,57 +53,6 +15,36 +35,68 +9,21 +43,65 +5,41 +7,7 +68,61 +60,1 +7,23 +21,28 +23,34 +63,69 +7,40 +51,64 +66,51 +43,61 +49,63 +69,11 +50,51 +53,13 +17,24 +47,65 +32,67 +4,15 +38,1 +58,63 +23,21 +61,59 +15,21 +11,27 +33,65 +2,1 +20,25 +11,3 +55,67 +5,31 +43,53 +63,66 +3,29 +65,55 +36,69 +64,1 +3,23 +11,6 +52,57 +61,4 +63,17 +61,69 +3,33 +65,4 +21,16 +27,11 +1,3 +5,39 +69,54 +63,47 +1,36 +27,27 +33,61 +25,37 +61,14 +15,26 +55,1 +7,17 +29,11 +11,12 +2,19 +66,55 +45,59 +29,29 +26,39 +8,17 +45,65 +11,37 +2,39 +0,29 +5,27 +16,31 +67,65 +68,63 +26,25 +9,30 +3,36 +48,65 +59,51 +63,1 +7,41 +23,28 +1,15 +18,1 +4,41 +43,63 +21,27 +67,22 +52,69 +7,18 +68,49 +3,12 +18,17 +9,41 +19,13 +1,17 +3,26 +59,61 +57,66 +53,63 +39,69 +3,3 +67,69 +50,57 +9,19 +1,13 +55,58 +49,6 +7,3 +47,1 +12,37 +59,63 +61,67 +8,45 +41,1 +8,1 +39,63 +8,27 +15,19 +1,25 +61,57 +47,66 +46,5 +0,39 +4,3 +67,8 +9,43 +64,67 +49,47 +63,14 +51,57 +0,47 +8,3 +21,15 +63,57 +46,3 +5,21 +15,31 +57,12 +13,18 +21,23 +67,15 +21,7 +23,14 +67,55 +63,63 +21,13 +67,58 +51,49 +25,26 +2,31 +56,51 +32,69 +55,7 +31,62 +65,57 +55,65 +5,24 +7,20 +11,15 +19,14 +65,21 +5,1 +67,5 +67,63 +67,49 +68,57 +19,21 +37,65 +11,1 +47,61 +33,7 +28,3 +12,21 +47,68 +41,70 +65,1 +69,23 +5,25 +47,11 +49,61 +1,35 +59,57 +1,37 +33,1 +53,57 +59,1 +49,65 +27,15 +60,11 +61,63 +5,34 +69,15 +9,20 +66,65 +49,62 +35,3 +55,5 +4,19 +21,20 +47,67 +59,68 +24,27 +41,5 +67,3 +21,3 +47,9 +65,17 +9,47 +23,3 +41,67 +65,63 +15,29 +55,49 +3,6 +69,17 +22,17 +48,51 +33,64 +51,65 +9,27 +58,55 +25,21 +69,24 +9,22 +64,63 +19,1 +9,36 +17,27 +54,49 +38,69 +8,5 +46,67 +60,57 +68,11 +0,7 +19,17 +39,65 +27,3 +9,40 +64,57 +17,25 +3,25 +19,9 +47,8 +58,61 +23,22 +21,11 +41,7 +18,9 +11,45 +51,67 +52,3 +8,43 +9,25 +69,8 +67,11 +2,27 +63,51 +65,61 +53,5 +7,19 +18,3 +67,18 +45,9 +55,63 +15,15 +47,64 +54,3 +13,31 +19,5 +41,64 +15,16 +37,67 +53,52 +12,9 +15,4 +25,34 +43,59 +2,17 +23,33 +57,8 +16,15 +57,67 +29,0 +66,69 +19,7 +42,61 +66,15 +67,61 +51,63 +36,7 +1,16 +2,23 +66,59 +67,2 +61,64 +56,65 +56,5 +15,2 +19,33 +15,28 +49,53 +5,35 +12,3 +65,18 +69,53 +11,33 +37,2 +47,69 +57,69 +11,5 +34,7 +3,45 +63,5 +15,33 +35,1 +17,20 +23,11 +6,31 +17,35 +50,61 +51,4 +64,3 +62,55 +3,9 +49,60 +13,35 +68,69 +21,37 +44,63 +2,9 +15,7 +49,5 +67,13 +9,39 +9,33 +9,24 +2,11 +5,23 +46,55 +17,22 +9,23 +48,3 +45,13 +47,58 +60,59 +5,18 +14,3 +24,11 +56,69 +43,55 +57,63 +55,10 +17,33 +53,47 +36,3 +13,16 +5,32 +64,7 +32,3 +51,51 +10,17 +13,37 +40,59 +11,31 +13,19 +19,10 +49,1 +34,1 +10,27 +42,9 +61,2 +58,57 +13,33 +25,3 +43,2 +23,31 +24,37 +59,66 +12,29 +7,10 +31,65 +19,23 +39,64 +22,39 +18,5 +55,62 +23,18 +39,62 +53,50 +21,31 +40,55 +58,5 +23,40 +67,66 +69,59 +23,25 +39,61 +1,7 +21,1 +21,5 +57,61 +51,53 +53,51 +5,29 +69,47 +30,27 +5,14 +10,45 +18,23 +7,29 +55,60 +40,7 +49,7 +14,31 +15,25 +68,19 +57,49 +12,23 +7,30 +60,49 +50,9 +16,1 +22,9 +57,55 +15,24 +65,49 +69,25 +59,69 +28,69 +4,21 +23,36 +58,69 +69,61 +23,8 +5,8 +43,1 +9,37 +55,69 +3,11 +66,53 +70,59 +14,19 +15,17 +9,13 +59,55 +36,65 +69,67 +8,23 +23,32 +3,8 +65,3 +69,65 +29,5 +9,15 +61,61 +13,34 +1,1 +3,4 +68,45 +45,56 +33,69 +67,48 +38,65 +6,21 +0,3 +63,68 +50,67 +15,13 +63,58 +9,34 +67,1 +48,63 +60,69 +69,51 +57,47 +70,67 +51,47 +59,54 +57,7 +43,67 +4,45 +59,67 +45,2 +67,57 +62,1 +69,52 +31,63 +69,21 +31,15 +27,9 +3,37 +19,25 +63,55 +6,3 +53,3 +20,21 +13,17 +23,30 +6,23 +43,7 +17,29 +57,2 +21,32 +51,69 +7,1 +44,5 +57,1 +33,66 +45,69 +59,8 +9,3 +13,23 +11,22 +65,5 +1,9 +24,17 +61,3 +49,57 +12,19 +13,28 +69,12 +10,51 +53,53 +13,47 +31,69 +24,43 +69,63 +20,17 +67,21 +44,55 +33,68 +7,15 +45,1 +39,55 +39,4 +69,60 +23,27 +45,61 +51,61 +25,1 +63,3 +37,69 +33,5 +17,15 +9,32 +7,39 +63,54 +65,47 +29,19 +53,43 +60,33 +57,45 +5,6 +47,27 +39,25 +48,47 +53,36 +43,18 +49,21 +41,21 +23,19 +52,35 +39,45 +55,17 +29,39 +57,51 +55,45 +54,27 +33,26 +40,19 +44,17 +57,20 +37,45 +27,64 +31,13 +41,13 +5,7 +9,57 +10,69 +23,47 +1,51 +0,69 +49,12 +3,58 +15,9 +21,53 +53,27 +45,11 +63,42 +27,56 +6,11 +27,12 +27,31 +23,41 +35,41 +15,61 +61,27 +21,43 +41,43 +17,56 +11,66 +41,28 +51,37 +41,27 +38,59 +39,47 +59,41 +11,41 +26,59 +59,16 +29,35 +1,45 +33,41 +55,29 +65,39 +47,50 +28,5 +39,43 +35,21 +54,25 +43,16 +51,43 +31,17 +23,53 +37,21 +43,22 +22,55 +57,17 +15,49 +36,57 +11,48 +56,27 +36,39 +53,35 +8,51 +29,46 +61,29 +67,37 +31,35 +42,47 +63,41 +37,18 +43,36 +52,21 +63,9 +57,48 +29,36 +39,27 +35,59 +55,41 +25,53 +45,47 +19,66 +29,44 +61,5 +49,23 +14,59 +27,59 +19,58 +16,13 +44,51 +29,24 +13,7 +26,19 +37,20 +41,40 +28,27 +65,38 +41,47 +47,19 +49,49 +46,39 +38,55 +13,65 +53,44 +31,49 +36,5 +68,5 +42,45 +3,5 +4,63 +59,23 +23,56 +15,59 +37,52 +67,35 +11,11 +1,63 +11,25 +19,47 +31,33 +61,36 +27,46 +35,44 +46,21 +9,56 +5,59 +27,41 +35,37 +28,13 +39,20 +61,23 +36,15 +35,9 +7,8 +52,15 +14,39 +51,21 +65,25 +35,12 +58,15 +66,35 +23,7 +35,62 +63,25 +68,1 +23,64 +68,33 +65,28 +44,29 +19,67 +29,43 +47,51 +25,67 +2,45 +55,21 +37,43 +32,21 +58,51 +69,33 +13,29 +41,11 +47,23 +65,35 +23,45 +31,64 +41,50 +1,65 +25,39 +42,39 +44,47 +67,39 +32,35 +43,38 +51,29 +9,6 +41,24 +3,67 +57,31 +41,44 +53,19 +19,41 +14,61 +15,41 +46,49 +39,35 +62,51 +51,23 +32,9 +23,60 +1,47 +49,27 +57,36 +19,52 +43,49 +49,35 +21,50 +49,39 +53,38 +51,19 +21,57 +43,45 +33,38 +45,41 +1,56 +39,22 +21,63 +48,49 +47,30 +37,39 +4,61 +34,13 +26,51 +47,39 +19,45 +31,59 +3,52 +17,54 +69,45 +15,35 +49,11 +17,69 +55,13 +64,39 +57,33 +45,40 +28,21 +11,9 +64,29 +33,19 +21,60 +32,19 +47,25 +57,53 +31,4 +17,61 +69,5 +19,39 +46,15 +60,51 +9,50 +27,40 +63,29 +59,36 +11,55 +25,61 +30,55 +35,25 +27,69 +23,1 +9,65 +43,37 +27,42 +19,49 +56,45 +13,49 +35,7 +33,47 +43,11 +38,33 +35,49 +63,39 +41,20 +13,48 +1,60 +43,30 +7,45 +55,19 +65,19 +53,15 +33,53 +29,49 +51,45 +13,50 +34,23 +20,55 +10,11 +12,39 +17,53 +11,65 +27,37 +8,53 +65,24 +65,45 +61,45 +7,65 +59,37 +27,21 +39,39 +31,67 +45,23 +53,10 +59,22 +25,42 +1,57 +54,45 +13,10 +43,23 +37,51 +51,13 +40,35 +48,45 +36,27 +1,59 +39,51 +57,32 +31,5 +35,5 +8,69 +25,29 +39,9 +19,53 +29,40 +61,43 +7,62 +39,17 +3,54 +27,57 +67,43 +23,49 +53,17 +29,47 +25,41 +9,62 +61,35 +27,38 +23,9 +67,38 +41,49 +22,45 +43,15 +25,17 +13,69 +31,52 +29,68 +29,37 +30,37 +7,63 +37,27 +55,39 +65,13 +50,23 +59,11 +25,11 +25,65 +26,15 +55,37 +47,18 +20,69 +12,69 +8,47 +61,17 +53,12 +54,41 +9,69 +33,59 +57,37 +47,47 +61,39 +40,13 +69,3 +18,55 +22,47 +65,41 +31,45 +21,9 +38,27 +61,30 +61,55 +3,57 +51,11 +20,57 +41,51 +61,15 +40,37 +53,23 +49,38 +22,69 +1,61 +16,59 +20,65 +17,63 +51,17 +26,45 +24,31 +61,49 +38,41 +22,51 +29,16 +11,52 +34,35 +30,61 +37,33 +58,19 +9,29 +29,17 +61,9 +2,51 +7,59 +49,51 +35,55 +8,59 +29,41 +37,47 +23,67 +30,53 +15,69 +33,27 +49,31 +69,29 +59,43 +3,41 +43,10 +59,19 +35,27 +61,11 +27,25 +49,30 +28,57 +15,53 +39,29 +45,46 +16,41 +28,9 +27,61 +37,15 +29,18 +15,47 +17,57 +25,19 +37,25 +11,64 +45,12 +61,46 +14,67 +6,51 +19,65 +32,17 +21,65 +46,29 +51,28 +25,6 +19,51 +35,61 +47,41 +45,45 +39,49 +36,25 +19,59 +32,25 +25,47 +30,41 +62,19 +39,50 +41,41 +44,43 +53,37 +33,14 +40,51 +62,47 +19,48 +55,43 +63,13 +68,43 +65,29 +53,25 +23,59 +39,11 +54,17 +59,35 +63,53 +13,11 +35,58 +12,5 +63,21 +25,20 +45,37 +34,47 +24,55 +3,53 +11,67 +46,33 +25,31 +56,23 +36,43 +8,65 +61,19 +37,41 +41,31 +31,27 +37,23 +64,49 +6,67 +9,17 +11,40 +17,13 +26,11 +67,41 +23,57 +13,52 +50,17 +21,35 +33,51 +59,40 +27,5 +36,33 +3,62 +35,60 +58,43 +13,56 +24,67 +17,37 +29,53 +63,23 +20,51 +24,39 +13,12 +2,55 +62,41 +28,49 +39,44 +20,47 +52,27 +35,39 +59,25 +35,32 +49,29 +65,31 +35,52 +54,47 +29,51 +37,9 +13,13 +53,31 +45,39 +9,7 +39,13 +17,65 +37,31 +24,5 +30,5 +2,65 +28,7 +49,17 +55,55 +37,24 +13,5 +3,68 +49,13 +56,15 +21,49 +41,37 +43,26 +57,25 +3,47 +29,21 +47,43 +29,42 +55,11 +35,19 +6,55 +53,34 +23,17 +31,12 +4,69 +15,43 +66,33 +59,33 +13,57 +17,42 +10,67 +59,13 +50,37 +33,45 +35,40 +38,7 +21,41 +9,63 +53,1 +33,37 +13,66 +50,15 +1,55 +19,36 +18,47 +61,26 +49,25 +59,38 +5,43 +37,62 +11,61 +22,67 +61,18 +33,55 +18,61 +25,9 +62,49 +56,29 +65,44 +59,29 +33,39 +55,9 +49,37 +13,55 +35,22 +41,39 +48,19 +30,21 +13,9 +21,39 +37,61 +29,15 +27,52 +19,55 +47,35 +51,33 +8,55 +63,7 +35,46 +11,54 +29,69 +15,52 +31,46 +25,62 +63,43 +41,26 +61,41 +7,64 +43,35 +47,33 +40,33 +45,36 +57,41 +57,23 +57,27 +11,29 +5,69 +63,37 +7,25 +34,9 +57,24 +23,5 +59,18 +23,55 +48,41 +11,47 +16,57 +60,25 +60,23 +20,53 +66,47 +56,33 +30,11 +15,46 +26,33 +64,33 +51,10 +35,13 +5,55 +33,21 +10,55 +35,11 +9,53 +23,44 +63,11 +69,1 +21,45 +6,47 +42,17 +32,41 +17,49 +61,12 +35,45 +31,51 +55,20 +31,25 +7,51 +41,15 +45,31 +31,8 +29,13 +3,43 +27,70 +59,21 +43,41 +67,45 +59,46 +56,43 +5,66 +18,39 +39,10 +1,22 +68,25 +15,48 +68,41 +2,67 +37,46 +15,44 +25,69 +43,47 +61,28 +61,31 +43,20 +48,37 +19,44 +24,9 +27,16 +37,29 +51,40 +38,25 +62,31 +31,23 +47,21 +13,53 +12,61 +37,8 +5,47 +17,67 +49,44 +31,19 +25,57 +13,67 +3,65 +63,8 +3,69 +29,63 +11,63 +27,60 +31,37 +29,61 +25,27 +32,13 +1,53 +52,31 +57,35 +36,35 +67,32 +33,30 +4,57 +23,43 +39,31 +46,47 +5,61 +43,51 +51,9 +10,43 +5,63 +69,41 +7,60 +53,21 +45,35 +34,25 +37,35 +33,40 +64,9 +37,7 +9,49 +13,59 +70,43 +11,46 +43,34 +36,49 +29,9 +46,13 +31,38 +41,23 +65,33 +47,28 +54,37 +23,58 +33,33 +1,43 +7,67 +6,43 +63,33 +27,17 +49,41 +15,40 +43,21 +50,1 +61,21 +5,5 +51,48 +37,10 +44,49 +1,64 +55,31 +13,54 +47,31 +31,57 +45,49 +57,50 +52,25 +48,33 +61,13 +27,29 +31,28 +19,69 +23,15 +45,20 +65,42 +24,63 +55,47 +61,20 +40,29 +45,55 +11,59 +48,35 +25,5 +33,29 +15,10 +59,44 +41,29 +24,23 +43,27 +69,31 +37,38 +45,15 +51,15 +65,11 +5,46 +41,33 +62,37 +62,35 +53,20 +59,31 +9,67 +31,44 +46,37 +22,59 +27,19 +41,16 +25,4 +11,8 +31,9 +16,7 +28,61 +49,45 +45,21 +57,15 +50,25 +30,7 +14,69 +43,14 +33,49 +42,33 +67,36 +21,62 +51,38 +37,49 +62,9 +58,13 +35,43 +1,49 +57,46 +25,43 +5,67 +31,53 +59,9 +8,67 +13,63 +43,32 +33,42 +30,49 +0,63 +1,50 +21,59 +19,63 +36,55 +23,37 +67,27 +10,61 +5,56 +31,31 +47,13 +20,45 +28,31 +1,67 +15,62 +34,19 +55,40 +62,23 +2,47 +67,31 +39,5 +7,57 +15,70 +33,57 +28,53 +55,27 +7,5 +66,25 +47,22 +11,51 +23,51 +53,28 +61,33 +23,69 +65,37 +11,53 +31,3 +64,45 +7,69 +13,42 +31,34 +4,65 +68,21 +55,15 +41,55 +15,56 +39,33 +45,34 +25,15 +19,61 +21,67 +37,48 +24,53 +7,49 +37,30 +43,31 +5,15 +37,36 +31,41 +27,65 +25,13 +0,53 +37,57 +45,43 +15,65 +25,45 +33,48 +15,42 +15,38 +45,51 +3,55 +29,7 +39,23 +13,39 +20,63 +31,56 +45,27 +64,31 +27,39 +33,16 +25,14 +61,25 +21,55 +55,23 +43,39 +18,65 +15,67 +43,9 +30,59 +26,29 +41,17 +60,15 +25,23 +57,9 +24,15 +10,57 +17,59 +65,27 +52,45 +58,29 +70,31 +15,39 +55,35 +43,33 +17,55 +29,45 +55,14 +9,59 +53,16 +31,43 +15,5 +17,43 +62,43 +17,47 +59,28 +10,29 +67,29 +61,37 +69,36 +22,53 +43,43 +29,57 +48,15 +29,67 +61,47 +33,35 +51,31 +35,23 +27,13 +34,55 +27,18 +25,49 +25,63 +34,37 +39,38 +60,39 +55,25 +31,32 +53,39 +37,17 +39,21 +33,50 +68,27 +50,47 +26,53 +56,41 +15,51 +51,42 +11,43 +21,47 +35,33 +50,41 +31,11 +45,32 +31,29 +33,28 +15,57 +69,28 +23,63 +35,47 +55,22 +29,27 +29,59 +62,15 +27,67 +13,43 +53,24 +6,5 +29,50 +44,41 +10,63 +36,37 +1,58 +59,27 +39,37 +26,23 +25,33 +39,16 +15,50 +60,21 +3,63 +45,19 +46,41 +42,11 +5,57 +5,45 +4,53 +42,49 +49,33 +10,59 +21,69 +3,61 +30,19 +28,33 +21,42 +30,23 +69,37 +16,37 +33,17 +65,23 +38,53 +54,13 +43,19 +16,9 +34,61 +70,3 +38,49 +39,7 +37,42 +31,47 +15,54 +70,41 +50,21 +15,55 +61,44 +47,29 +54,9 +13,24 +18,69 +25,55 +45,10 +17,51 +52,13 +3,59 +27,53 +22,43 +45,25 +5,53 +39,19 +32,7 +13,51 +33,11 +13,61 +33,15 +59,39 +54,31 +63,31 +30,33 +50,35 +28,29 +22,65 +14,7 +13,64 +13,41 +35,30 +37,14 +27,63 +21,51 +23,23 +57,26 +66,29 +29,48 +35,50 +27,49 +51,35 +13,45 +69,35 +27,44 +13,27 +20,61 +37,19 +2,61 +33,9 +53,32 +61,53 +65,43 +44,13 +51,39 +35,17 +24,47 +27,55 +56,53 +31,36 +50,45 +51,30 +17,68 +29,33 +59,48 +47,45 +34,53 +41,19 +42,29 +45,44 +7,43 +63,45 +34,17 +51,25 +3,51 +37,12 +29,31 +3,42 +63,61 +66,13 +7,48 +27,43 +61,32 +59,49 +15,63 +3,15 +40,47 +35,31 +29,55 +26,57 +1,69 +65,10 +5,11 +24,21 +57,21 +41,25 +38,15 +37,5 +51,27 +41,30 +11,57 +63,26 +67,25 +29,23 +39,18 +17,39 +52,41 +57,39 +51,41 +25,50 +21,61 +35,15 +9,51 +69,30 +56,39 +49,20 +61,51 +27,23 +25,51 +49,16 +67,19 +63,35 +17,41 +56,17 +65,46 +63,40 +6,53 +37,28 +7,47 +32,53 +47,37 +59,45 +70,21 +49,32 +25,7 +26,67 +25,60 +65,26 +59,17 +9,55 +6,45 +11,21 +18,13 +25,68 +39,40 +11,50 +67,46 +45,33 +37,54 +7,58 +35,29 +55,33 +29,14 +23,61 +21,38 +57,11 +15,66 +38,45 +25,59 +40,43 +37,37 +51,18 +67,47 +18,51 +56,35 +49,43 +7,27 +13,44 +46,17 +31,39 +27,33 +5,51 +13,46 +68,39 +61,7 +39,26 +45,53 +43,29 +34,33 +39,15 +7,53 +33,44 +69,39 +62,11 +23,65 +59,15 +41,42 +55,59 +27,7 +50,33 +69,43 +32,59 +58,23 +29,58 +41,36 +49,24 +45,17 +55,34 +33,31 +16,61 +7,55 +31,21 +23,48 +46,45 +6,63 +41,14 +4,59 +35,57 +59,47 +49,28 +57,38 +63,27 +41,22 +13,21 +5,50 +47,26 +57,43 +53,22 +36,17 +57,13 +9,61 +66,39 +55,30 +16,67 +46,25 +13,25 +43,17 +9,11 +53,33 +35,20 +37,55 +58,33 +10,9 +44,23 +45,29 +33,10 +37,11 +63,67 +1,41 +64,35 +33,23 +19,43 +53,29 +47,17 +31,55 +13,58 +33,13 +59,42 +6,69 +43,25 +11,69 +47,15 +41,9 +25,64 +27,47 +47,42 +17,64 +47,53 +17,9 +20,67 +18,59 +13,26 +53,41 +29,26 +59,30 +33,56 +44,27 +26,47 +27,66 +3,21 +49,26 +29,66 +12,59 +41,35 +25,48 +33,32 +27,35 +39,57 +15,64 +37,22 +39,6 +5,65 +11,49 +65,9 +29,25 +49,15 +9,9 +66,41 +55,18 +41,52 +38,31 +59,52 +69,34 +27,51 +27,45 +59,10 +3,49 +29,22 +7,61 +35,35 +32,49 +67,33 +63,48 +20,41 +19,40 +1,21 +1,44 +57,29 +64,13 +49,14 +17,44 +40,9 +19,57 +69,27 +67,23 +63,49 +62,25 +47,24 +17,50 +35,51 +50,11 +32,47 +33,43 +49,19 +39,41 +67,30 +61,34 +43,60 +12,46 +70,22 +38,20 +14,44 +41,38 +22,52 +12,67 +2,7 +58,46 +34,30 +34,70 +6,46 +20,68 +7,24 +9,18 +33,20 +60,42 +67,24 +37,6 +0,61 +12,18 +20,10 +39,54 +69,0 +16,65 +40,63 +14,10 +34,21 +54,56 +16,21 +62,12 +23,24 +48,61 +70,29 +30,16 +0,66 +70,6 +6,52 +30,62 +35,14 +62,36 +48,58 +13,8 +28,60 +22,26 +66,17 +62,54 +40,53 +12,53 +23,54 +61,40 +43,66 +0,34 +15,68 +32,66 +22,10 +42,48 +28,6 +38,38 +55,28 +46,23 +16,68 +52,54 +5,52 +4,64 +57,42 +2,49 +38,12 +64,38 +28,52 +68,31 +68,52 +21,70 +16,16 +8,31 +9,66 +4,55 +11,68 +36,14 +42,16 +32,39 +54,64 +18,58 +52,46 +68,22 +7,0 +29,62 +0,44 +35,8 +18,67 +23,52 +58,42 +26,2 +32,57 +8,66 +30,20 +0,30 +12,6 +46,1 +49,2 +34,56 +16,52 +2,2 +48,24 +25,38 +41,34 +46,28 +32,26 +53,48 +34,69 +11,28 +3,64 +62,8 +12,48 +19,22 +4,11 +24,30 +22,31 +32,45 +19,68 +12,60 +7,32 +22,38 +25,58 +55,42 +47,70 +18,28 +66,62 +34,41 +44,57 +4,10 +53,64 +38,34 +12,22 +37,70 +0,42 +30,31 +35,54 +61,48 +58,34 +36,38 +66,43 +54,52 +39,66 +43,62 +60,52 +37,44 +42,22 +53,0 +70,25 +18,40 +69,20 +53,58 +21,18 +25,12 +0,67 +25,44 +22,14 +48,32 +48,38 +18,15 +52,30 +34,15 +52,43 +52,52 +46,63 +2,22 +10,21 +22,64 +37,58 +10,31 +21,64 +6,40 +0,58 +36,42 +24,2 +65,20 +0,1 +2,58 +21,26 +0,68 +62,26 +8,32 +38,17 +11,56 +19,18 +31,20 +43,70 +0,5 +3,10 +14,38 +14,37 +32,33 +18,44 +62,53 +6,29 +70,30 +42,21 +18,37 +23,38 +14,60 +46,59 +34,22 +10,48 +8,63 +68,20 +50,58 +44,32 +4,67 +40,14 +22,34 +6,25 +38,52 +38,48 +32,30 +38,54 +26,49 +5,30 +34,48 +45,28 +56,58 +17,60 +10,38 +44,70 +24,49 +7,12 +42,38 +38,13 +52,48 +40,2 +52,59 +20,52 +21,68 +44,44 +2,70 +10,6 +24,52 +40,48 +48,20 +70,20 +36,23 +36,58 +20,27 +58,4 +2,8 +26,38 +4,38 +36,60 +12,57 +34,49 +30,29 +48,50 +18,60 +22,21 +64,62 +31,50 +20,37 +20,33 +5,40 +34,46 +12,12 +17,32 +2,29 +44,28 +58,45 +32,63 +54,30 +12,42 +16,28 +8,16 +66,42 +12,49 +12,63 +26,68 +18,25 +44,21 +17,6 +34,34 +36,67 +2,13 +26,3 +70,0 +39,58 +17,14 +18,12 +43,50 +16,25 +2,34 +8,50 +62,6 +26,41 +50,40 +30,56 +18,49 +4,32 +16,60 +22,8 +15,6 +21,36 +4,58 +29,28 +47,40 +36,62 +34,14 +33,60 +8,44 +43,8 +60,55 +39,30 +24,24 +36,11 +47,48 +38,32 +22,58 +31,10 +38,60 +16,46 +10,5 +23,50 +0,14 +4,60 +10,64 +20,22 +66,37 +28,51 +27,26 +38,21 +30,43 +19,20 +0,28 +16,54 +40,46 +34,5 +56,42 +8,34 +41,68 +61,8 +50,63 +27,14 +36,8 +26,36 +30,70 +36,20 +70,33 +41,2 +70,19 +5,22 +38,10 +10,40 +28,42 +42,41 +46,42 +0,23 +70,46 +24,40 +16,39 +38,56 +26,50 +22,5 +40,56 +34,57 +52,64 +46,70 +8,26 +3,34 +32,52 +70,44 +12,24 +8,10 +28,50 +14,16 +20,56 +9,60 +8,20 +37,34 +49,22 +27,24 +17,10 +68,30 +22,62 +22,15 +58,35 +69,44 +14,20 +48,22 +48,25 +51,2 +26,21 +6,30 +12,26 +33,12 +5,60 +60,56 +0,70 +4,56 +56,50 +58,47 +46,0 +50,22 +52,68 +4,4 +32,36 +34,60 +30,17 +36,56 +62,42 +28,23 +3,50 +35,28 +39,34 +38,3 +30,12 +20,7 +18,57 +52,60 +6,50 +52,49 +4,13 +56,56 +8,70 +44,8 +70,1 +28,62 +42,42 +60,12 +50,28 +47,38 +60,43 +50,54 +51,50 +55,12 +31,18 +47,32 +18,16 +16,6 +62,32 +24,69 +2,54 +62,27 +40,32 +38,68 +8,36 +59,70 +52,16 +68,37 +24,18 +53,8 +14,70 +31,60 +32,4 +33,36 +64,14 +52,22 +31,22 +12,51 +16,38 +30,1 +48,40 +57,56 +69,40 +25,32 +50,60 +49,4 +30,64 +46,22 +28,48 +42,56 +2,43 +46,6 +6,41 +43,46 +20,59 +54,6 +58,64 +0,59 +41,10 +54,42 +62,63 +30,57 +4,17 +22,40 +60,44 +52,42 +28,30 +7,2 +0,15 +22,27 +70,38 +30,68 +5,64 +35,38 +0,20 +17,62 +55,70 +5,4 +56,60 +34,42 +60,61 +40,27 +38,44 +5,16 +14,51 +18,26 +46,46 +69,26 +48,14 +32,43 +10,28 +27,22 +54,20 +14,48 +67,26 +57,0 +4,70 +59,12 +51,6 +40,10 +59,20 +32,8 +34,2 +20,18 +62,44 +64,46 +20,58 +56,31 +54,69 +28,14 +0,17 +22,12 +52,0 +20,44 +34,8 +32,29 +65,30 +56,3 +26,52 +4,47 +22,1 +13,38 +62,65 +0,31 +44,42 +42,15 +42,10 +24,38 +10,62 +26,64 +48,64 +48,21 +43,56 +8,46 +4,7 +9,0 +30,14 +56,61 +68,34 +56,55 +13,40 +50,62 +8,2 +50,39 +18,68 +0,37 +4,5 +47,36 +14,24 +44,58 +56,25 +24,62 +6,13 +11,2 +20,5 +18,11 +51,16 +56,6 +53,70 +32,0 +34,51 +37,56 +18,41 +42,70 +24,20 +22,44 +28,46 +20,38 +36,34 +10,56 +43,44 +0,60 +1,70 +37,0 +58,12 +68,17 +66,14 +70,40 +61,58 +53,40 +60,19 +14,4 +3,20 +6,38 +53,18 +24,8 +14,43 +42,43 +50,4 +57,30 +7,50 +37,40 +64,65 +36,47 +66,34 +16,27 +70,34 +20,14 +60,27 +32,31 +66,48 +43,28 +64,28 +67,54 +13,70 +50,38 +42,58 +52,26 +24,29 +20,48 +17,30 +66,67 +68,64 +68,9 +14,68 +70,24 +38,5 +60,47 +11,60 +67,12 +0,43 +1,12 +56,16 +38,22 +24,68 +51,8 +38,63 +60,22 +36,54 +38,61 +66,45 +46,27 +48,8 +6,0 +27,30 +8,40 +32,60 +5,62 +62,67 +64,32 +52,37 +60,5 +70,64 +10,18 +63,52 +18,20 +34,39 +1,62 +51,34 +40,49 +28,38 +51,62 +8,54 +45,58 +5,10 +12,15 +68,8 +26,22 +35,34 +58,32 +32,34 +10,10 +6,7 +38,42 +62,57 +52,6 +40,22 +62,70 +58,6 +50,48 +41,46 +52,18 +60,2 +25,70 +5,0 +50,6 +39,2 +2,4 +62,45 +48,23 +57,34 +55,66 +18,14 +9,52 +24,22 +54,60 +49,52 +12,54 +54,14 +63,44 +56,64 +4,0 +20,50 +18,64 +1,18 +14,41 +16,35 +29,2 +66,52 +12,50 +42,68 +34,24 +56,57 +66,32 +57,60 +28,8 +22,66 +32,32 +52,58 +50,42 +4,36 +16,32 +65,58 +56,20 +42,0 +17,4 +34,68 +49,36 +32,58 +68,50 +19,16 +6,70 +40,38 +60,37 +50,49 +34,40 +51,70 +1,38 +13,32 +53,66 +6,32 +65,32 +32,22 +14,55 +38,30 +44,26 +66,8 +50,30 +48,31 +5,36 +52,19 +29,30 +24,50 +55,36 +46,69 +64,18 +44,0 +27,10 +68,32 +60,13 +12,17 +10,34 +18,18 +70,52 +10,8 +12,38 +16,70 +8,9 +58,65 +64,21 +70,4 +5,48 +22,49 +36,2 +18,30 +41,6 +10,44 +48,48 +60,14 +23,42 +46,36 +18,56 +40,18 +36,40 +24,59 +64,64 +40,11 +59,50 +14,57 +25,46 +65,0 +32,16 +24,4 +40,34 +50,36 +38,50 +20,30 +66,38 +14,40 +70,62 +6,58 +12,28 +62,60 +68,28 +36,29 +58,37 +45,68 +22,22 +40,65 +49,64 +24,65 +40,8 +0,12 +40,64 +70,66 +23,62 +66,49 +28,32 +47,44 +10,12 +29,8 +26,18 +28,16 +49,50 +7,6 +30,54 +52,10 +32,10 +1,0 +40,28 +7,52 +18,54 +5,42 +58,10 +54,40 +41,4 +10,22 +24,56 +44,36 +39,14 +12,2 +65,48 +20,16 +10,4 +56,66 +40,68 +16,19 +45,42 +20,43 +50,18 +40,15 +0,6 +18,62 +14,2 +51,44 +35,48 +54,68 +7,4 +30,25 +27,36 +48,9 +42,46 +57,54 +68,55 +34,59 +58,16 +70,65 +70,14 +24,12 +46,12 +30,39 +55,2 +38,8 +62,22 +3,70 +60,40 +7,44 +9,44 +16,58 +64,2 +22,46 +40,45 +23,0 +62,30 +46,18 +23,6 +27,48 +31,66 +66,30 +52,9 +29,20 +36,21 +69,10 +24,41 +8,38 +44,34 +37,66 +68,4 +34,28 +21,44 +28,70 +42,30 +35,42 +46,16 +6,8 +36,48 +8,61 +14,26 +62,0 +28,45 +46,7 +7,68 +32,40 +61,24 +32,1 +40,12 +58,2 +62,58 +0,2 +42,60 +13,68 +48,59 +6,18 +36,28 +61,0 +63,28 +58,8 +44,33 +59,6 +64,6 +12,62 +30,32 +39,56 +70,32 +67,44 +56,11 +38,6 +2,36 +60,50 +55,26 +58,66 +55,8 +48,17 +56,2 +64,0 +60,41 +64,24 +42,52 +30,13 +16,20 +30,44 +1,26 +47,34 +24,54 +56,8 +16,0 +2,32 +62,38 +70,56 +18,50 +9,28 +63,38 +30,18 +10,70 +44,25 +57,40 +28,26 +54,0 +36,12 +32,24 +44,62 +52,23 +19,54 +45,30 +51,68 +8,8 +48,62 +40,60 +48,6 +48,69 +22,36 +61,10 +62,28 +51,66 +14,18 +53,56 +29,52 +63,4 +46,50 +26,69 +52,56 +21,54`) + require.Equal(t, 0, r) +} diff --git a/2024/go/day18/input.txt b/2024/go/day18/input.txt new file mode 100644 index 0000000..3b8f63e --- /dev/null +++ b/2024/go/day18/input.txt @@ -0,0 +1,3450 @@ +2,5 +20,1 +63,59 +21,29 +37,59 +33,63 +14,33 +70,15 +21,34 +62,5 +45,54 +45,60 +48,53 +33,58 +23,35 +22,3 +33,0 +63,62 +44,67 +52,55 +5,19 +42,55 +45,0 +57,3 +15,45 +41,62 +1,39 +63,19 +39,59 +39,3 +48,7 +61,65 +31,1 +54,51 +11,14 +53,62 +67,68 +65,16 +17,45 +21,24 +55,3 +30,15 +4,39 +69,19 +69,57 +41,57 +43,24 +19,11 +18,27 +3,48 +8,13 +41,66 +67,67 +61,62 +5,37 +18,19 +29,64 +13,14 +42,57 +33,67 +0,19 +67,53 +47,59 +19,3 +51,54 +53,69 +42,5 +7,26 +59,65 +50,69 +3,27 +26,9 +43,3 +17,7 +15,11 +12,31 +43,5 +50,65 +9,5 +29,3 +21,6 +65,15 +43,57 +15,37 +50,53 +67,51 +29,1 +47,7 +55,54 +52,51 +47,54 +17,26 +12,43 +65,51 +1,27 +15,22 +63,15 +7,37 +69,49 +57,59 +7,36 +60,7 +66,7 +18,35 +13,36 +21,19 +15,3 +46,9 +30,3 +53,7 +8,7 +66,3 +49,69 +35,65 +48,5 +33,6 +1,31 +26,5 +44,59 +68,13 +45,67 +9,16 +51,55 +57,5 +2,33 +57,64 +31,2 +1,19 +5,12 +19,37 +40,67 +10,19 +21,12 +3,31 +51,1 +4,29 +52,65 +47,5 +17,19 +70,47 +11,19 +57,10 +54,55 +39,53 +61,56 +49,55 +28,37 +21,30 +9,45 +43,69 +57,19 +29,10 +60,63 +19,32 +66,5 +53,45 +53,49 +47,57 +26,1 +17,34 +65,7 +7,28 +41,63 +6,1 +69,69 +0,13 +5,28 +10,1 +38,67 +37,13 +3,7 +39,12 +2,15 +54,65 +35,53 +63,20 +13,30 +52,47 +13,3 +69,55 +55,61 +37,4 +7,35 +57,4 +35,69 +5,3 +63,64 +40,69 +59,5 +32,61 +66,61 +43,64 +40,1 +49,3 +68,65 +3,38 +21,4 +49,56 +18,29 +23,12 +7,11 +16,29 +8,11 +10,25 +39,67 +59,60 +3,19 +26,31 +7,9 +51,58 +49,67 +53,65 +65,59 +67,9 +43,58 +55,51 +69,7 +6,39 +49,59 +10,37 +4,43 +54,5 +3,28 +69,16 +67,7 +4,37 +37,1 +27,2 +62,59 +45,70 +25,35 +65,53 +31,7 +53,59 +1,10 +67,10 +65,67 +30,67 +17,1 +67,59 +31,61 +59,59 +65,69 +51,59 +61,66 +13,15 +29,65 +27,1 +65,65 +68,53 +53,11 +5,17 +20,35 +43,68 +3,30 +59,7 +3,39 +45,63 +7,31 +3,13 +51,5 +23,39 +20,3 +67,0 +37,3 +46,61 +65,70 +15,1 +17,11 +66,63 +32,23 +51,0 +3,1 +17,3 +13,6 +59,3 +19,31 +1,24 +41,3 +4,49 +40,57 +63,6 +16,17 +22,25 +39,60 +11,34 +56,7 +38,57 +55,53 +35,66 +1,11 +64,19 +50,3 +9,38 +19,8 +64,61 +3,17 +8,33 +13,1 +5,9 +50,7 +1,34 +41,65 +48,57 +14,13 +17,31 +56,1 +6,15 +24,25 +23,2 +69,13 +45,52 +15,23 +15,27 +27,28 +60,3 +31,30 +19,35 +42,53 +19,27 +61,1 +65,50 +53,2 +52,61 +15,20 +42,7 +67,20 +11,23 +29,54 +6,17 +41,53 +47,63 +68,51 +21,21 +19,6 +53,61 +23,29 +53,9 +19,29 +21,10 +2,41 +10,3 +49,9 +42,59 +12,1 +45,7 +19,28 +3,35 +69,6 +43,4 +17,21 +47,3 +52,7 +65,22 +45,62 +16,5 +51,3 +48,11 +7,33 +40,3 +26,35 +37,63 +49,68 +11,26 +54,67 +64,23 +21,17 +5,49 +63,65 +23,13 +58,1 +61,54 +69,56 +47,60 +11,7 +9,35 +57,58 +45,66 +1,23 +7,21 +17,12 +11,17 +34,3 +25,25 +22,35 +57,65 +17,17 +1,5 +12,33 +36,63 +19,15 +7,38 +53,55 +21,25 +42,1 +17,23 +35,67 +33,3 +56,63 +56,59 +3,2 +42,67 +65,56 +45,5 +5,33 +21,22 +9,42 +3,14 +21,14 +59,53 +64,53 +33,25 +11,35 +9,1 +63,16 +47,49 +53,60 +47,55 +39,1 +63,60 +35,63 +9,31 +55,68 +57,57 +68,15 +11,39 +62,69 +41,45 +55,57 +5,13 +9,14 +1,32 +17,5 +19,19 +19,30 +1,29 +55,56 +6,35 +21,8 +13,0 +4,25 +16,33 +69,9 +53,67 +67,17 +52,67 +41,59 +24,1 +51,7 +54,7 +3,22 +7,13 +41,61 +45,3 +21,33 +37,53 +11,13 +45,8 +48,1 +43,13 +17,46 +1,33 +41,69 +22,19 +19,38 +19,12 +45,57 +53,6 +15,36 +35,68 +9,21 +43,65 +5,41 +7,7 +68,61 +60,1 +7,23 +21,28 +23,34 +63,69 +7,40 +51,64 +66,51 +43,61 +49,63 +69,11 +50,51 +53,13 +17,24 +47,65 +32,67 +4,15 +38,1 +58,63 +23,21 +61,59 +15,21 +11,27 +33,65 +2,1 +20,25 +11,3 +55,67 +5,31 +43,53 +63,66 +3,29 +65,55 +36,69 +64,1 +3,23 +11,6 +52,57 +61,4 +63,17 +61,69 +3,33 +65,4 +21,16 +27,11 +1,3 +5,39 +69,54 +63,47 +1,36 +27,27 +33,61 +25,37 +61,14 +15,26 +55,1 +7,17 +29,11 +11,12 +2,19 +66,55 +45,59 +29,29 +26,39 +8,17 +45,65 +11,37 +2,39 +0,29 +5,27 +16,31 +67,65 +68,63 +26,25 +9,30 +3,36 +48,65 +59,51 +63,1 +7,41 +23,28 +1,15 +18,1 +4,41 +43,63 +21,27 +67,22 +52,69 +7,18 +68,49 +3,12 +18,17 +9,41 +19,13 +1,17 +3,26 +59,61 +57,66 +53,63 +39,69 +3,3 +67,69 +50,57 +9,19 +1,13 +55,58 +49,6 +7,3 +47,1 +12,37 +59,63 +61,67 +8,45 +41,1 +8,1 +39,63 +8,27 +15,19 +1,25 +61,57 +47,66 +46,5 +0,39 +4,3 +67,8 +9,43 +64,67 +49,47 +63,14 +51,57 +0,47 +8,3 +21,15 +63,57 +46,3 +5,21 +15,31 +57,12 +13,18 +21,23 +67,15 +21,7 +23,14 +67,55 +63,63 +21,13 +67,58 +51,49 +25,26 +2,31 +56,51 +32,69 +55,7 +31,62 +65,57 +55,65 +5,24 +7,20 +11,15 +19,14 +65,21 +5,1 +67,5 +67,63 +67,49 +68,57 +19,21 +37,65 +11,1 +47,61 +33,7 +28,3 +12,21 +47,68 +41,70 +65,1 +69,23 +5,25 +47,11 +49,61 +1,35 +59,57 +1,37 +33,1 +53,57 +59,1 +49,65 +27,15 +60,11 +61,63 +5,34 +69,15 +9,20 +66,65 +49,62 +35,3 +55,5 +4,19 +21,20 +47,67 +59,68 +24,27 +41,5 +67,3 +21,3 +47,9 +65,17 +9,47 +23,3 +41,67 +65,63 +15,29 +55,49 +3,6 +69,17 +22,17 +48,51 +33,64 +51,65 +9,27 +58,55 +25,21 +69,24 +9,22 +64,63 +19,1 +9,36 +17,27 +54,49 +38,69 +8,5 +46,67 +60,57 +68,11 +0,7 +19,17 +39,65 +27,3 +9,40 +64,57 +17,25 +3,25 +19,9 +47,8 +58,61 +23,22 +21,11 +41,7 +18,9 +11,45 +51,67 +52,3 +8,43 +9,25 +69,8 +67,11 +2,27 +63,51 +65,61 +53,5 +7,19 +18,3 +67,18 +45,9 +55,63 +15,15 +47,64 +54,3 +13,31 +19,5 +41,64 +15,16 +37,67 +53,52 +12,9 +15,4 +25,34 +43,59 +2,17 +23,33 +57,8 +16,15 +57,67 +29,0 +66,69 +19,7 +42,61 +66,15 +67,61 +51,63 +36,7 +1,16 +2,23 +66,59 +67,2 +61,64 +56,65 +56,5 +15,2 +19,33 +15,28 +49,53 +5,35 +12,3 +65,18 +69,53 +11,33 +37,2 +47,69 +57,69 +11,5 +34,7 +3,45 +63,5 +15,33 +35,1 +17,20 +23,11 +6,31 +17,35 +50,61 +51,4 +64,3 +62,55 +3,9 +49,60 +13,35 +68,69 +21,37 +44,63 +2,9 +15,7 +49,5 +67,13 +9,39 +9,33 +9,24 +2,11 +5,23 +46,55 +17,22 +9,23 +48,3 +45,13 +47,58 +60,59 +5,18 +14,3 +24,11 +56,69 +43,55 +57,63 +55,10 +17,33 +53,47 +36,3 +13,16 +5,32 +64,7 +32,3 +51,51 +10,17 +13,37 +40,59 +11,31 +13,19 +19,10 +49,1 +34,1 +10,27 +42,9 +61,2 +58,57 +13,33 +25,3 +43,2 +23,31 +24,37 +59,66 +12,29 +7,10 +31,65 +19,23 +39,64 +22,39 +18,5 +55,62 +23,18 +39,62 +53,50 +21,31 +40,55 +58,5 +23,40 +67,66 +69,59 +23,25 +39,61 +1,7 +21,1 +21,5 +57,61 +51,53 +53,51 +5,29 +69,47 +30,27 +5,14 +10,45 +18,23 +7,29 +55,60 +40,7 +49,7 +14,31 +15,25 +68,19 +57,49 +12,23 +7,30 +60,49 +50,9 +16,1 +22,9 +57,55 +15,24 +65,49 +69,25 +59,69 +28,69 +4,21 +23,36 +58,69 +69,61 +23,8 +5,8 +43,1 +9,37 +55,69 +3,11 +66,53 +70,59 +14,19 +15,17 +9,13 +59,55 +36,65 +69,67 +8,23 +23,32 +3,8 +65,3 +69,65 +29,5 +9,15 +61,61 +13,34 +1,1 +3,4 +68,45 +45,56 +33,69 +67,48 +38,65 +6,21 +0,3 +63,68 +50,67 +15,13 +63,58 +9,34 +67,1 +48,63 +60,69 +69,51 +57,47 +70,67 +51,47 +59,54 +57,7 +43,67 +4,45 +59,67 +45,2 +67,57 +62,1 +69,52 +31,63 +69,21 +31,15 +27,9 +3,37 +19,25 +63,55 +6,3 +53,3 +20,21 +13,17 +23,30 +6,23 +43,7 +17,29 +57,2 +21,32 +51,69 +7,1 +44,5 +57,1 +33,66 +45,69 +59,8 +9,3 +13,23 +11,22 +65,5 +1,9 +24,17 +61,3 +49,57 +12,19 +13,28 +69,12 +10,51 +53,53 +13,47 +31,69 +24,43 +69,63 +20,17 +67,21 +44,55 +33,68 +7,15 +45,1 +39,55 +39,4 +69,60 +23,27 +45,61 +51,61 +25,1 +63,3 +37,69 +33,5 +17,15 +9,32 +7,39 +63,54 +65,47 +29,19 +53,43 +60,33 +57,45 +5,6 +47,27 +39,25 +48,47 +53,36 +43,18 +49,21 +41,21 +23,19 +52,35 +39,45 +55,17 +29,39 +57,51 +55,45 +54,27 +33,26 +40,19 +44,17 +57,20 +37,45 +27,64 +31,13 +41,13 +5,7 +9,57 +10,69 +23,47 +1,51 +0,69 +49,12 +3,58 +15,9 +21,53 +53,27 +45,11 +63,42 +27,56 +6,11 +27,12 +27,31 +23,41 +35,41 +15,61 +61,27 +21,43 +41,43 +17,56 +11,66 +41,28 +51,37 +41,27 +38,59 +39,47 +59,41 +11,41 +26,59 +59,16 +29,35 +1,45 +33,41 +55,29 +65,39 +47,50 +28,5 +39,43 +35,21 +54,25 +43,16 +51,43 +31,17 +23,53 +37,21 +43,22 +22,55 +57,17 +15,49 +36,57 +11,48 +56,27 +36,39 +53,35 +8,51 +29,46 +61,29 +67,37 +31,35 +42,47 +63,41 +37,18 +43,36 +52,21 +63,9 +57,48 +29,36 +39,27 +35,59 +55,41 +25,53 +45,47 +19,66 +29,44 +61,5 +49,23 +14,59 +27,59 +19,58 +16,13 +44,51 +29,24 +13,7 +26,19 +37,20 +41,40 +28,27 +65,38 +41,47 +47,19 +49,49 +46,39 +38,55 +13,65 +53,44 +31,49 +36,5 +68,5 +42,45 +3,5 +4,63 +59,23 +23,56 +15,59 +37,52 +67,35 +11,11 +1,63 +11,25 +19,47 +31,33 +61,36 +27,46 +35,44 +46,21 +9,56 +5,59 +27,41 +35,37 +28,13 +39,20 +61,23 +36,15 +35,9 +7,8 +52,15 +14,39 +51,21 +65,25 +35,12 +58,15 +66,35 +23,7 +35,62 +63,25 +68,1 +23,64 +68,33 +65,28 +44,29 +19,67 +29,43 +47,51 +25,67 +2,45 +55,21 +37,43 +32,21 +58,51 +69,33 +13,29 +41,11 +47,23 +65,35 +23,45 +31,64 +41,50 +1,65 +25,39 +42,39 +44,47 +67,39 +32,35 +43,38 +51,29 +9,6 +41,24 +3,67 +57,31 +41,44 +53,19 +19,41 +14,61 +15,41 +46,49 +39,35 +62,51 +51,23 +32,9 +23,60 +1,47 +49,27 +57,36 +19,52 +43,49 +49,35 +21,50 +49,39 +53,38 +51,19 +21,57 +43,45 +33,38 +45,41 +1,56 +39,22 +21,63 +48,49 +47,30 +37,39 +4,61 +34,13 +26,51 +47,39 +19,45 +31,59 +3,52 +17,54 +69,45 +15,35 +49,11 +17,69 +55,13 +64,39 +57,33 +45,40 +28,21 +11,9 +64,29 +33,19 +21,60 +32,19 +47,25 +57,53 +31,4 +17,61 +69,5 +19,39 +46,15 +60,51 +9,50 +27,40 +63,29 +59,36 +11,55 +25,61 +30,55 +35,25 +27,69 +23,1 +9,65 +43,37 +27,42 +19,49 +56,45 +13,49 +35,7 +33,47 +43,11 +38,33 +35,49 +63,39 +41,20 +13,48 +1,60 +43,30 +7,45 +55,19 +65,19 +53,15 +33,53 +29,49 +51,45 +13,50 +34,23 +20,55 +10,11 +12,39 +17,53 +11,65 +27,37 +8,53 +65,24 +65,45 +61,45 +7,65 +59,37 +27,21 +39,39 +31,67 +45,23 +53,10 +59,22 +25,42 +1,57 +54,45 +13,10 +43,23 +37,51 +51,13 +40,35 +48,45 +36,27 +1,59 +39,51 +57,32 +31,5 +35,5 +8,69 +25,29 +39,9 +19,53 +29,40 +61,43 +7,62 +39,17 +3,54 +27,57 +67,43 +23,49 +53,17 +29,47 +25,41 +9,62 +61,35 +27,38 +23,9 +67,38 +41,49 +22,45 +43,15 +25,17 +13,69 +31,52 +29,68 +29,37 +30,37 +7,63 +37,27 +55,39 +65,13 +50,23 +59,11 +25,11 +25,65 +26,15 +55,37 +47,18 +20,69 +12,69 +8,47 +61,17 +53,12 +54,41 +9,69 +33,59 +57,37 +47,47 +61,39 +40,13 +69,3 +18,55 +22,47 +65,41 +31,45 +21,9 +38,27 +61,30 +61,55 +3,57 +51,11 +20,57 +41,51 +61,15 +40,37 +53,23 +49,38 +22,69 +1,61 +16,59 +20,65 +17,63 +51,17 +26,45 +24,31 +61,49 +38,41 +22,51 +29,16 +11,52 +34,35 +30,61 +37,33 +58,19 +9,29 +29,17 +61,9 +2,51 +7,59 +49,51 +35,55 +8,59 +29,41 +37,47 +23,67 +30,53 +15,69 +33,27 +49,31 +69,29 +59,43 +3,41 +43,10 +59,19 +35,27 +61,11 +27,25 +49,30 +28,57 +15,53 +39,29 +45,46 +16,41 +28,9 +27,61 +37,15 +29,18 +15,47 +17,57 +25,19 +37,25 +11,64 +45,12 +61,46 +14,67 +6,51 +19,65 +32,17 +21,65 +46,29 +51,28 +25,6 +19,51 +35,61 +47,41 +45,45 +39,49 +36,25 +19,59 +32,25 +25,47 +30,41 +62,19 +39,50 +41,41 +44,43 +53,37 +33,14 +40,51 +62,47 +19,48 +55,43 +63,13 +68,43 +65,29 +53,25 +23,59 +39,11 +54,17 +59,35 +63,53 +13,11 +35,58 +12,5 +63,21 +25,20 +45,37 +34,47 +24,55 +3,53 +11,67 +46,33 +25,31 +56,23 +36,43 +8,65 +61,19 +37,41 +41,31 +31,27 +37,23 +64,49 +6,67 +9,17 +11,40 +17,13 +26,11 +67,41 +23,57 +13,52 +50,17 +21,35 +33,51 +59,40 +27,5 +36,33 +3,62 +35,60 +58,43 +13,56 +24,67 +17,37 +29,53 +63,23 +20,51 +24,39 +13,12 +2,55 +62,41 +28,49 +39,44 +20,47 +52,27 +35,39 +59,25 +35,32 +49,29 +65,31 +35,52 +54,47 +29,51 +37,9 +13,13 +53,31 +45,39 +9,7 +39,13 +17,65 +37,31 +24,5 +30,5 +2,65 +28,7 +49,17 +55,55 +37,24 +13,5 +3,68 +49,13 +56,15 +21,49 +41,37 +43,26 +57,25 +3,47 +29,21 +47,43 +29,42 +55,11 +35,19 +6,55 +53,34 +23,17 +31,12 +4,69 +15,43 +66,33 +59,33 +13,57 +17,42 +10,67 +59,13 +50,37 +33,45 +35,40 +38,7 +21,41 +9,63 +53,1 +33,37 +13,66 +50,15 +1,55 +19,36 +18,47 +61,26 +49,25 +59,38 +5,43 +37,62 +11,61 +22,67 +61,18 +33,55 +18,61 +25,9 +62,49 +56,29 +65,44 +59,29 +33,39 +55,9 +49,37 +13,55 +35,22 +41,39 +48,19 +30,21 +13,9 +21,39 +37,61 +29,15 +27,52 +19,55 +47,35 +51,33 +8,55 +63,7 +35,46 +11,54 +29,69 +15,52 +31,46 +25,62 +63,43 +41,26 +61,41 +7,64 +43,35 +47,33 +40,33 +45,36 +57,41 +57,23 +57,27 +11,29 +5,69 +63,37 +7,25 +34,9 +57,24 +23,5 +59,18 +23,55 +48,41 +11,47 +16,57 +60,25 +60,23 +20,53 +66,47 +56,33 +30,11 +15,46 +26,33 +64,33 +51,10 +35,13 +5,55 +33,21 +10,55 +35,11 +9,53 +23,44 +63,11 +69,1 +21,45 +6,47 +42,17 +32,41 +17,49 +61,12 +35,45 +31,51 +55,20 +31,25 +7,51 +41,15 +45,31 +31,8 +29,13 +3,43 +27,70 +59,21 +43,41 +67,45 +59,46 +56,43 +5,66 +18,39 +39,10 +1,22 +68,25 +15,48 +68,41 +2,67 +37,46 +15,44 +25,69 +43,47 +61,28 +61,31 +43,20 +48,37 +19,44 +24,9 +27,16 +37,29 +51,40 +38,25 +62,31 +31,23 +47,21 +13,53 +12,61 +37,8 +5,47 +17,67 +49,44 +31,19 +25,57 +13,67 +3,65 +63,8 +3,69 +29,63 +11,63 +27,60 +31,37 +29,61 +25,27 +32,13 +1,53 +52,31 +57,35 +36,35 +67,32 +33,30 +4,57 +23,43 +39,31 +46,47 +5,61 +43,51 +51,9 +10,43 +5,63 +69,41 +7,60 +53,21 +45,35 +34,25 +37,35 +33,40 +64,9 +37,7 +9,49 +13,59 +70,43 +11,46 +43,34 +36,49 +29,9 +46,13 +31,38 +41,23 +65,33 +47,28 +54,37 +23,58 +33,33 +1,43 +7,67 +6,43 +63,33 +27,17 +49,41 +15,40 +43,21 +50,1 +61,21 +5,5 +51,48 +37,10 +44,49 +1,64 +55,31 +13,54 +47,31 +31,57 +45,49 +57,50 +52,25 +48,33 +61,13 +27,29 +31,28 +19,69 +23,15 +45,20 +65,42 +24,63 +55,47 +61,20 +40,29 +45,55 +11,59 +48,35 +25,5 +33,29 +15,10 +59,44 +41,29 +24,23 +43,27 +69,31 +37,38 +45,15 +51,15 +65,11 +5,46 +41,33 +62,37 +62,35 +53,20 +59,31 +9,67 +31,44 +46,37 +22,59 +27,19 +41,16 +25,4 +11,8 +31,9 +16,7 +28,61 +49,45 +45,21 +57,15 +50,25 +30,7 +14,69 +43,14 +33,49 +42,33 +67,36 +21,62 +51,38 +37,49 +62,9 +58,13 +35,43 +1,49 +57,46 +25,43 +5,67 +31,53 +59,9 +8,67 +13,63 +43,32 +33,42 +30,49 +0,63 +1,50 +21,59 +19,63 +36,55 +23,37 +67,27 +10,61 +5,56 +31,31 +47,13 +20,45 +28,31 +1,67 +15,62 +34,19 +55,40 +62,23 +2,47 +67,31 +39,5 +7,57 +15,70 +33,57 +28,53 +55,27 +7,5 +66,25 +47,22 +11,51 +23,51 +53,28 +61,33 +23,69 +65,37 +11,53 +31,3 +64,45 +7,69 +13,42 +31,34 +4,65 +68,21 +55,15 +41,55 +15,56 +39,33 +45,34 +25,15 +19,61 +21,67 +37,48 +24,53 +7,49 +37,30 +43,31 +5,15 +37,36 +31,41 +27,65 +25,13 +0,53 +37,57 +45,43 +15,65 +25,45 +33,48 +15,42 +15,38 +45,51 +3,55 +29,7 +39,23 +13,39 +20,63 +31,56 +45,27 +64,31 +27,39 +33,16 +25,14 +61,25 +21,55 +55,23 +43,39 +18,65 +15,67 +43,9 +30,59 +26,29 +41,17 +60,15 +25,23 +57,9 +24,15 +10,57 +17,59 +65,27 +52,45 +58,29 +70,31 +15,39 +55,35 +43,33 +17,55 +29,45 +55,14 +9,59 +53,16 +31,43 +15,5 +17,43 +62,43 +17,47 +59,28 +10,29 +67,29 +61,37 +69,36 +22,53 +43,43 +29,57 +48,15 +29,67 +61,47 +33,35 +51,31 +35,23 +27,13 +34,55 +27,18 +25,49 +25,63 +34,37 +39,38 +60,39 +55,25 +31,32 +53,39 +37,17 +39,21 +33,50 +68,27 +50,47 +26,53 +56,41 +15,51 +51,42 +11,43 +21,47 +35,33 +50,41 +31,11 +45,32 +31,29 +33,28 +15,57 +69,28 +23,63 +35,47 +55,22 +29,27 +29,59 +62,15 +27,67 +13,43 +53,24 +6,5 +29,50 +44,41 +10,63 +36,37 +1,58 +59,27 +39,37 +26,23 +25,33 +39,16 +15,50 +60,21 +3,63 +45,19 +46,41 +42,11 +5,57 +5,45 +4,53 +42,49 +49,33 +10,59 +21,69 +3,61 +30,19 +28,33 +21,42 +30,23 +69,37 +16,37 +33,17 +65,23 +38,53 +54,13 +43,19 +16,9 +34,61 +70,3 +38,49 +39,7 +37,42 +31,47 +15,54 +70,41 +50,21 +15,55 +61,44 +47,29 +54,9 +13,24 +18,69 +25,55 +45,10 +17,51 +52,13 +3,59 +27,53 +22,43 +45,25 +5,53 +39,19 +32,7 +13,51 +33,11 +13,61 +33,15 +59,39 +54,31 +63,31 +30,33 +50,35 +28,29 +22,65 +14,7 +13,64 +13,41 +35,30 +37,14 +27,63 +21,51 +23,23 +57,26 +66,29 +29,48 +35,50 +27,49 +51,35 +13,45 +69,35 +27,44 +13,27 +20,61 +37,19 +2,61 +33,9 +53,32 +61,53 +65,43 +44,13 +51,39 +35,17 +24,47 +27,55 +56,53 +31,36 +50,45 +51,30 +17,68 +29,33 +59,48 +47,45 +34,53 +41,19 +42,29 +45,44 +7,43 +63,45 +34,17 +51,25 +3,51 +37,12 +29,31 +3,42 +63,61 +66,13 +7,48 +27,43 +61,32 +59,49 +15,63 +3,15 +40,47 +35,31 +29,55 +26,57 +1,69 +65,10 +5,11 +24,21 +57,21 +41,25 +38,15 +37,5 +51,27 +41,30 +11,57 +63,26 +67,25 +29,23 +39,18 +17,39 +52,41 +57,39 +51,41 +25,50 +21,61 +35,15 +9,51 +69,30 +56,39 +49,20 +61,51 +27,23 +25,51 +49,16 +67,19 +63,35 +17,41 +56,17 +65,46 +63,40 +6,53 +37,28 +7,47 +32,53 +47,37 +59,45 +70,21 +49,32 +25,7 +26,67 +25,60 +65,26 +59,17 +9,55 +6,45 +11,21 +18,13 +25,68 +39,40 +11,50 +67,46 +45,33 +37,54 +7,58 +35,29 +55,33 +29,14 +23,61 +21,38 +57,11 +15,66 +38,45 +25,59 +40,43 +37,37 +51,18 +67,47 +18,51 +56,35 +49,43 +7,27 +13,44 +46,17 +31,39 +27,33 +5,51 +13,46 +68,39 +61,7 +39,26 +45,53 +43,29 +34,33 +39,15 +7,53 +33,44 +69,39 +62,11 +23,65 +59,15 +41,42 +55,59 +27,7 +50,33 +69,43 +32,59 +58,23 +29,58 +41,36 +49,24 +45,17 +55,34 +33,31 +16,61 +7,55 +31,21 +23,48 +46,45 +6,63 +41,14 +4,59 +35,57 +59,47 +49,28 +57,38 +63,27 +41,22 +13,21 +5,50 +47,26 +57,43 +53,22 +36,17 +57,13 +9,61 +66,39 +55,30 +16,67 +46,25 +13,25 +43,17 +9,11 +53,33 +35,20 +37,55 +58,33 +10,9 +44,23 +45,29 +33,10 +37,11 +63,67 +1,41 +64,35 +33,23 +19,43 +53,29 +47,17 +31,55 +13,58 +33,13 +59,42 +6,69 +43,25 +11,69 +47,15 +41,9 +25,64 +27,47 +47,42 +17,64 +47,53 +17,9 +20,67 +18,59 +13,26 +53,41 +29,26 +59,30 +33,56 +44,27 +26,47 +27,66 +3,21 +49,26 +29,66 +12,59 +41,35 +25,48 +33,32 +27,35 +39,57 +15,64 +37,22 +39,6 +5,65 +11,49 +65,9 +29,25 +49,15 +9,9 +66,41 +55,18 +41,52 +38,31 +59,52 +69,34 +27,51 +27,45 +59,10 +3,49 +29,22 +7,61 +35,35 +32,49 +67,33 +63,48 +20,41 +19,40 +1,21 +1,44 +57,29 +64,13 +49,14 +17,44 +40,9 +19,57 +69,27 +67,23 +63,49 +62,25 +47,24 +17,50 +35,51 +50,11 +32,47 +33,43 +49,19 +39,41 +67,30 +61,34 +43,60 +12,46 +70,22 +38,20 +14,44 +41,38 +22,52 +12,67 +2,7 +58,46 +34,30 +34,70 +6,46 +20,68 +7,24 +9,18 +33,20 +60,42 +67,24 +37,6 +0,61 +12,18 +20,10 +39,54 +69,0 +16,65 +40,63 +14,10 +34,21 +54,56 +16,21 +62,12 +23,24 +48,61 +70,29 +30,16 +0,66 +70,6 +6,52 +30,62 +35,14 +62,36 +48,58 +13,8 +28,60 +22,26 +66,17 +62,54 +40,53 +12,53 +23,54 +61,40 +43,66 +0,34 +15,68 +32,66 +22,10 +42,48 +28,6 +38,38 +55,28 +46,23 +16,68 +52,54 +5,52 +4,64 +57,42 +2,49 +38,12 +64,38 +28,52 +68,31 +68,52 +21,70 +16,16 +8,31 +9,66 +4,55 +11,68 +36,14 +42,16 +32,39 +54,64 +18,58 +52,46 +68,22 +7,0 +29,62 +0,44 +35,8 +18,67 +23,52 +58,42 +26,2 +32,57 +8,66 +30,20 +0,30 +12,6 +46,1 +49,2 +34,56 +16,52 +2,2 +48,24 +25,38 +41,34 +46,28 +32,26 +53,48 +34,69 +11,28 +3,64 +62,8 +12,48 +19,22 +4,11 +24,30 +22,31 +32,45 +19,68 +12,60 +7,32 +22,38 +25,58 +55,42 +47,70 +18,28 +66,62 +34,41 +44,57 +4,10 +53,64 +38,34 +12,22 +37,70 +0,42 +30,31 +35,54 +61,48 +58,34 +36,38 +66,43 +54,52 +39,66 +43,62 +60,52 +37,44 +42,22 +53,0 +70,25 +18,40 +69,20 +53,58 +21,18 +25,12 +0,67 +25,44 +22,14 +48,32 +48,38 +18,15 +52,30 +34,15 +52,43 +52,52 +46,63 +2,22 +10,21 +22,64 +37,58 +10,31 +21,64 +6,40 +0,58 +36,42 +24,2 +65,20 +0,1 +2,58 +21,26 +0,68 +62,26 +8,32 +38,17 +11,56 +19,18 +31,20 +43,70 +0,5 +3,10 +14,38 +14,37 +32,33 +18,44 +62,53 +6,29 +70,30 +42,21 +18,37 +23,38 +14,60 +46,59 +34,22 +10,48 +8,63 +68,20 +50,58 +44,32 +4,67 +40,14 +22,34 +6,25 +38,52 +38,48 +32,30 +38,54 +26,49 +5,30 +34,48 +45,28 +56,58 +17,60 +10,38 +44,70 +24,49 +7,12 +42,38 +38,13 +52,48 +40,2 +52,59 +20,52 +21,68 +44,44 +2,70 +10,6 +24,52 +40,48 +48,20 +70,20 +36,23 +36,58 +20,27 +58,4 +2,8 +26,38 +4,38 +36,60 +12,57 +34,49 +30,29 +48,50 +18,60 +22,21 +64,62 +31,50 +20,37 +20,33 +5,40 +34,46 +12,12 +17,32 +2,29 +44,28 +58,45 +32,63 +54,30 +12,42 +16,28 +8,16 +66,42 +12,49 +12,63 +26,68 +18,25 +44,21 +17,6 +34,34 +36,67 +2,13 +26,3 +70,0 +39,58 +17,14 +18,12 +43,50 +16,25 +2,34 +8,50 +62,6 +26,41 +50,40 +30,56 +18,49 +4,32 +16,60 +22,8 +15,6 +21,36 +4,58 +29,28 +47,40 +36,62 +34,14 +33,60 +8,44 +43,8 +60,55 +39,30 +24,24 +36,11 +47,48 +38,32 +22,58 +31,10 +38,60 +16,46 +10,5 +23,50 +0,14 +4,60 +10,64 +20,22 +66,37 +28,51 +27,26 +38,21 +30,43 +19,20 +0,28 +16,54 +40,46 +34,5 +56,42 +8,34 +41,68 +61,8 +50,63 +27,14 +36,8 +26,36 +30,70 +36,20 +70,33 +41,2 +70,19 +5,22 +38,10 +10,40 +28,42 +42,41 +46,42 +0,23 +70,46 +24,40 +16,39 +38,56 +26,50 +22,5 +40,56 +34,57 +52,64 +46,70 +8,26 +3,34 +32,52 +70,44 +12,24 +8,10 +28,50 +14,16 +20,56 +9,60 +8,20 +37,34 +49,22 +27,24 +17,10 +68,30 +22,62 +22,15 +58,35 +69,44 +14,20 +48,22 +48,25 +51,2 +26,21 +6,30 +12,26 +33,12 +5,60 +60,56 +0,70 +4,56 +56,50 +58,47 +46,0 +50,22 +52,68 +4,4 +32,36 +34,60 +30,17 +36,56 +62,42 +28,23 +3,50 +35,28 +39,34 +38,3 +30,12 +20,7 +18,57 +52,60 +6,50 +52,49 +4,13 +56,56 +8,70 +44,8 +70,1 +28,62 +42,42 +60,12 +50,28 +47,38 +60,43 +50,54 +51,50 +55,12 +31,18 +47,32 +18,16 +16,6 +62,32 +24,69 +2,54 +62,27 +40,32 +38,68 +8,36 +59,70 +52,16 +68,37 +24,18 +53,8 +14,70 +31,60 +32,4 +33,36 +64,14 +52,22 +31,22 +12,51 +16,38 +30,1 +48,40 +57,56 +69,40 +25,32 +50,60 +49,4 +30,64 +46,22 +28,48 +42,56 +2,43 +46,6 +6,41 +43,46 +20,59 +54,6 +58,64 +0,59 +41,10 +54,42 +62,63 +30,57 +4,17 +22,40 +60,44 +52,42 +28,30 +7,2 +0,15 +22,27 +70,38 +30,68 +5,64 +35,38 +0,20 +17,62 +55,70 +5,4 +56,60 +34,42 +60,61 +40,27 +38,44 +5,16 +14,51 +18,26 +46,46 +69,26 +48,14 +32,43 +10,28 +27,22 +54,20 +14,48 +67,26 +57,0 +4,70 +59,12 +51,6 +40,10 +59,20 +32,8 +34,2 +20,18 +62,44 +64,46 +20,58 +56,31 +54,69 +28,14 +0,17 +22,12 +52,0 +20,44 +34,8 +32,29 +65,30 +56,3 +26,52 +4,47 +22,1 +13,38 +62,65 +0,31 +44,42 +42,15 +42,10 +24,38 +10,62 +26,64 +48,64 +48,21 +43,56 +8,46 +4,7 +9,0 +30,14 +56,61 +68,34 +56,55 +13,40 +50,62 +8,2 +50,39 +18,68 +0,37 +4,5 +47,36 +14,24 +44,58 +56,25 +24,62 +6,13 +11,2 +20,5 +18,11 +51,16 +56,6 +53,70 +32,0 +34,51 +37,56 +18,41 +42,70 +24,20 +22,44 +28,46 +20,38 +36,34 +10,56 +43,44 +0,60 +1,70 +37,0 +58,12 +68,17 +66,14 +70,40 +61,58 +53,40 +60,19 +14,4 +3,20 +6,38 +53,18 +24,8 +14,43 +42,43 +50,4 +57,30 +7,50 +37,40 +64,65 +36,47 +66,34 +16,27 +70,34 +20,14 +60,27 +32,31 +66,48 +43,28 +64,28 +67,54 +13,70 +50,38 +42,58 +52,26 +24,29 +20,48 +17,30 +66,67 +68,64 +68,9 +14,68 +70,24 +38,5 +60,47 +11,60 +67,12 +0,43 +1,12 +56,16 +38,22 +24,68 +51,8 +38,63 +60,22 +36,54 +38,61 +66,45 +46,27 +48,8 +6,0 +27,30 +8,40 +32,60 +5,62 +62,67 +64,32 +52,37 +60,5 +70,64 +10,18 +63,52 +18,20 +34,39 +1,62 +51,34 +40,49 +28,38 +51,62 +8,54 +45,58 +5,10 +12,15 +68,8 +26,22 +35,34 +58,32 +32,34 +10,10 +6,7 +38,42 +62,57 +52,6 +40,22 +62,70 +58,6 +50,48 +41,46 +52,18 +60,2 +25,70 +5,0 +50,6 +39,2 +2,4 +62,45 +48,23 +57,34 +55,66 +18,14 +9,52 +24,22 +54,60 +49,52 +12,54 +54,14 +63,44 +56,64 +4,0 +20,50 +18,64 +1,18 +14,41 +16,35 +29,2 +66,52 +12,50 +42,68 +34,24 +56,57 +66,32 +57,60 +28,8 +22,66 +32,32 +52,58 +50,42 +4,36 +16,32 +65,58 +56,20 +42,0 +17,4 +34,68 +49,36 +32,58 +68,50 +19,16 +6,70 +40,38 +60,37 +50,49 +34,40 +51,70 +1,38 +13,32 +53,66 +6,32 +65,32 +32,22 +14,55 +38,30 +44,26 +66,8 +50,30 +48,31 +5,36 +52,19 +29,30 +24,50 +55,36 +46,69 +64,18 +44,0 +27,10 +68,32 +60,13 +12,17 +10,34 +18,18 +70,52 +10,8 +12,38 +16,70 +8,9 +58,65 +64,21 +70,4 +5,48 +22,49 +36,2 +18,30 +41,6 +10,44 +48,48 +60,14 +23,42 +46,36 +18,56 +40,18 +36,40 +24,59 +64,64 +40,11 +59,50 +14,57 +25,46 +65,0 +32,16 +24,4 +40,34 +50,36 +38,50 +20,30 +66,38 +14,40 +70,62 +6,58 +12,28 +62,60 +68,28 +36,29 +58,37 +45,68 +22,22 +40,65 +49,64 +24,65 +40,8 +0,12 +40,64 +70,66 +23,62 +66,49 +28,32 +47,44 +10,12 +29,8 +26,18 +28,16 +49,50 +7,6 +30,54 +52,10 +32,10 +1,0 +40,28 +7,52 +18,54 +5,42 +58,10 +54,40 +41,4 +10,22 +24,56 +44,36 +39,14 +12,2 +65,48 +20,16 +10,4 +56,66 +40,68 +16,19 +45,42 +20,43 +50,18 +40,15 +0,6 +18,62 +14,2 +51,44 +35,48 +54,68 +7,4 +30,25 +27,36 +48,9 +42,46 +57,54 +68,55 +34,59 +58,16 +70,65 +70,14 +24,12 +46,12 +30,39 +55,2 +38,8 +62,22 +3,70 +60,40 +7,44 +9,44 +16,58 +64,2 +22,46 +40,45 +23,0 +62,30 +46,18 +23,6 +27,48 +31,66 +66,30 +52,9 +29,20 +36,21 +69,10 +24,41 +8,38 +44,34 +37,66 +68,4 +34,28 +21,44 +28,70 +42,30 +35,42 +46,16 +6,8 +36,48 +8,61 +14,26 +62,0 +28,45 +46,7 +7,68 +32,40 +61,24 +32,1 +40,12 +58,2 +62,58 +0,2 +42,60 +13,68 +48,59 +6,18 +36,28 +61,0 +63,28 +58,8 +44,33 +59,6 +64,6 +12,62 +30,32 +39,56 +70,32 +67,44 +56,11 +38,6 +2,36 +60,50 +55,26 +58,66 +55,8 +48,17 +56,2 +64,0 +60,41 +64,24 +42,52 +30,13 +16,20 +30,44 +1,26 +47,34 +24,54 +56,8 +16,0 +2,32 +62,38 +70,56 +18,50 +9,28 +63,38 +30,18 +10,70 +44,25 +57,40 +28,26 +54,0 +36,12 +32,24 +44,62 +52,23 +19,54 +45,30 +51,68 +8,8 +48,62 +40,60 +48,6 +48,69 +22,36 +61,10 +62,28 +51,66 +14,18 +53,56 +29,52 +63,4 +46,50 +26,69 +52,56 +21,54 \ No newline at end of file diff --git a/2024/go/day19/day19.go b/2024/go/day19/day19.go new file mode 100644 index 0000000..e4e19bd --- /dev/null +++ b/2024/go/day19/day19.go @@ -0,0 +1,87 @@ +package day19 + +import ( + "sort" + "strings" +) + +func Part1(input string) int { + in := strings.Split(input, "\n\n") + towels := strings.Split(in[0], ", ") + patterns := strings.Split(in[1], "\n") + // fmt.Println(towels, patterns) + count := 0 + not_possibles := make(map[string]bool) + for _, pattern := range patterns { + if isPossible(towels, pattern, not_possibles) { + // fmt.Println(count, pattern) + count++ + } + } + return count +} + +func Part2(input string) int { + in := strings.Split(input, "\n\n") + towels := strings.Split(in[0], ", ") + sort.Strings(towels) + patterns := strings.Split(in[1], "\n") + // fmt.Println(towels, patterns) + count := 0 + memo := make(map[string]int) + for _, pattern := range patterns { + count += countPossible(sortStringsByPrefix(towels), pattern, memo) + } + return count +} + +func isPossible(towels []string, pattern string, not_possibles map[string]bool) bool { + if pattern == "" { + return true + } + if not_possibles[pattern] { + return false + } + for _, towel := range towels { + if strings.HasPrefix(pattern, towel) { + if isPossible(towels, pattern[len(towel):], not_possibles) { + return true + } + } + } + not_possibles[pattern] = true + return false +} + +func countPossible(towels map[byte][]string, pattern string, memo map[string]int) int { + if pattern == "" { + return 1 + } + + //If memo has key + if val, ok := memo[pattern]; ok { + return val + } + + count := 0 + for _, towel := range towels[pattern[0]] { + if strings.HasPrefix(pattern, towel) { + count += countPossible(towels, pattern[len(towel):], memo) + } + } + + memo[pattern] = count + + return count +} + +func sortStringsByPrefix(slice []string) map[byte][]string { + result := make(map[byte][]string) + for _, str := range slice { + result[str[0]] = append(result[str[0]], str) + } + for _, t := range result { + sort.Strings(t) + } + return result +} diff --git a/2024/go/day19/day19_test.go b/2024/go/day19/day19_test.go new file mode 100644 index 0000000..fa99ba2 --- /dev/null +++ b/2024/go/day19/day19_test.go @@ -0,0 +1,42 @@ +package day19 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPart1(t *testing.T) { + r := Part1(`r, wr, b, g, bwu, rb, gb, br + +brwrr +bggr +gbbr +rrbgbr +ubwu +bwurrg +brgr +bbrgwb`) + require.Equal(t, 6, r) +} + +func TestPart2(t *testing.T) { + r := Part2(`r, wr, b, g, bwu, rb, gb, br + +brwrr +bggr +gbbr +rrbgbr +ubwu +bwurrg +brgr +bbrgwb`) + require.Equal(t, 16, r) +} + +func TestPart2Long(t *testing.T) { + r := Part2(`rrgwru, gwubwg, wgbbw, bwb, ugrgw, uwgguuw, wuggb, bgwb, ubrr, grruuub, rwbwgbub, wwwggg, uuw, gubuu, urwb, bubg, bubb, rruruuu, ubgr, uw, urugg, wubuu, brwb, buw, bgug, wgbwwrb, rwrgrr, gwgr, rrwrg, wwbwgbw, gguu, rgg, bwg, ruurrwg, wbu, ggg, wrw, brbw, wbb, rrbgg, gbb, gwwrubwu, rwgu, grgwwu, wguu, rwg, wbwug, rbur, gwg, wbrugu, wbwwgu, wbbuw, rwrg, rgru, rgb, bwwrg, bwur, rrubwu, gwb, ugwur, wbguwb, rbu, ubrwgw, ruwbr, wbbu, rrbwbg, rgub, rwgb, urwg, bbw, bugg, rugwg, rwbrwww, wuru, guu, brwbg, ug, ruuwruw, bguww, wwrgrurg, rrbgr, uubwurb, brrrwgg, bur, urg, rbg, wruw, gr, ugb, wwrbgrg, wbuuw, bbugu, uug, rrbb, rrbw, bgr, wwwru, rgu, urr, rg, wbgbru, brrgu, gubu, rurgr, wwbrgg, ruurwgwg, rbb, rbrugwb, gwwrbg, bwuuwrg, wu, b, bgwrb, uwggr, rgbb, rww, wgwb, gwgwr, uwbb, uww, gu, ubwuu, wbwwwug, rurwru, rr, rrg, uggr, bgwu, wbgbu, urggw, br, gubgugr, wgrb, bbgrrbu, brbg, wrg, bgrb, rwbwwur, uwr, bubu, grwb, ubb, wr, bbbgwr, bug, uwgwuwu, grb, bgw, uuu, ugr, wgbbgu, gbg, bgwub, urbgrw, rbruwg, gb, bbwgwur, uwbgwrr, ggrb, wbrrwrbu, gbbugrb, ub, rwb, gwr, ruwu, gurgu, rru, uuwwgwuw, bw, ruwbbb, rbgrgu, wuwu, grrugr, wgr, rbbr, rugr, rrrrbww, bwrr, wrbbr, uuwgr, gug, wwb, rgur, brbrr, gguw, grwubrg, rrrr, uwb, wuwwrrwg, gwbggr, rwrub, wuur, gub, rbgb, urrbubrr, uwubu, brbb, bwbr, bww, ruuubwu, ugbbbr, bub, rrug, wub, gruu, uu, bbu, gbbr, urrg, buwu, grw, grbbbu, bgb, ugubg, uwww, urw, wwubruww, buurb, www, bguurr, wwgu, wgb, ruwub, wggggbg, urrb, gbwuw, ubrrg, wrr, gbubgg, gw, wuw, wuug, wwrb, wgg, rgugrru, rgwrbr, guurrg, bgu, rurgb, gwggb, bwgbbw, ggwb, ubwgw, bbg, rbr, wgru, urwr, brr, rgbr, rgr, wwg, guwuru, uuggg, rrw, buu, urb, guwg, ugwwbuwb, rubb, brbuww, rwugru, ubu, wwub, bgwgb, wrug, rug, w, brgg, wwugwruw, ggrwb, bbwuwuu, uub, rrr, ggbrr, wbur, wurbru, wgu, brb, urbbb, gburbww, wbrgruru, rbugr, gubw, wgwgg, rwr, ugw, gggg, gwrwrg, rrub, gbwgg, grg, uwuur, gbwbbb, guw, gbwbb, uwu, ruw, bwr, rwgub, rbw, ggbwr, u, gwu, rrurrb, gwgg, uugwrbr, brw, ugburg, rwu, wwu, wbr, ruwgr, gbwbur, rwgr, rwbww, rbgr, rgbub, rbbuw, ruu, bwgw, bbwg, ubr, gurr, wwr, wwwguu, gbw, ggw, gru, wug, rubwrbrr, wbrrrr, uru, wbgw, wgur, uurgg, bbb, rbwgwbur, wwbwur, bbgubw, gww, brg, ugu, rgrgw, wwrrgugu, rrrwuww, uwwrb, wrb, rrgg, wubgrrb, bwwgrbww, gbr, gwrwu, brgwwbu, urrwub, rbru, bwrgrr, brwuwrb, guuur, wb, bbrb, brww, wuwrww, bu, rgw, rwbwug, bbug, urrgr, bg, bgg, wbgwbgru, wbrru, uwbbr, wbg, gwwur, gur, ubwb, gubbb, bb, wrugr, grur, rb, uwubrg, bwgrw, gbug, g, wuwubgw, ubw, urgu, rrrg, uwg, bbww, uwgrug, ww, ggu, gwbuwu, rgggwgr, wugw, gbrrg, ugg, bwu, ubuur, uurrw, uwwug, bgww, ubg, rw, gwgbwrg, wuu, rbgbg, buwbur, rub, ugbwwrgu, gbww, wbw, gurbwu, bruw, rggrbrgw, wguwu, ubwbwr, ru, uwur, ggb, uurwg, wguubgr, wru, rbrbr, rbwr, wwwrbb, urww, rur, bru, bbbwrw, uwrwrr, ruww, ububbgr, rrb, bggrwg, bbr, wrwrb, bwgwrbg, grbuwg, gg, ubuurwg, uur, guguwb, rugurgbw, bbuwbb + +wrbwgruugbbgwwurggwrgrrrurbgwbgggwbbgwgbrwggwur`) + require.Equal(t, 16, r) +} diff --git a/2024/go/day19/input.txt b/2024/go/day19/input.txt new file mode 100644 index 0000000..f06b5fa --- /dev/null +++ b/2024/go/day19/input.txt @@ -0,0 +1,402 @@ +rrgwru, gwubwg, wgbbw, bwb, ugrgw, uwgguuw, wuggb, bgwb, ubrr, grruuub, rwbwgbub, wwwggg, uuw, gubuu, urwb, bubg, bubb, rruruuu, ubgr, uw, urugg, wubuu, brwb, buw, bgug, wgbwwrb, rwrgrr, gwgr, rrwrg, wwbwgbw, gguu, rgg, bwg, ruurrwg, wbu, ggg, wrw, brbw, wbb, rrbgg, gbb, gwwrubwu, rwgu, grgwwu, wguu, rwg, wbwug, rbur, gwg, wbrugu, wbwwgu, wbbuw, rwrg, rgru, rgb, bwwrg, bwur, rrubwu, gwb, ugwur, wbguwb, rbu, ubrwgw, ruwbr, wbbu, rrbwbg, rgub, rwgb, urwg, bbw, bugg, rugwg, rwbrwww, wuru, guu, brwbg, ug, ruuwruw, bguww, wwrgrurg, rrbgr, uubwurb, brrrwgg, bur, urg, rbg, wruw, gr, ugb, wwrbgrg, wbuuw, bbugu, uug, rrbb, rrbw, bgr, wwwru, rgu, urr, rg, wbgbru, brrgu, gubu, rurgr, wwbrgg, ruurwgwg, rbb, rbrugwb, gwwrbg, bwuuwrg, wu, b, bgwrb, uwggr, rgbb, rww, wgwb, gwgwr, uwbb, uww, gu, ubwuu, wbwwwug, rurwru, rr, rrg, uggr, bgwu, wbgbu, urggw, br, gubgugr, wgrb, bbgrrbu, brbg, wrg, bgrb, rwbwwur, uwr, bubu, grwb, ubb, wr, bbbgwr, bug, uwgwuwu, grb, bgw, uuu, ugr, wgbbgu, gbg, bgwub, urbgrw, rbruwg, gb, bbwgwur, uwbgwrr, ggrb, wbrrwrbu, gbbugrb, ub, rwb, gwr, ruwu, gurgu, rru, uuwwgwuw, bw, ruwbbb, rbgrgu, wuwu, grrugr, wgr, rbbr, rugr, rrrrbww, bwrr, wrbbr, uuwgr, gug, wwb, rgur, brbrr, gguw, grwubrg, rrrr, uwb, wuwwrrwg, gwbggr, rwrub, wuur, gub, rbgb, urrbubrr, uwubu, brbb, bwbr, bww, ruuubwu, ugbbbr, bub, rrug, wub, gruu, uu, bbu, gbbr, urrg, buwu, grw, grbbbu, bgb, ugubg, uwww, urw, wwubruww, buurb, www, bguurr, wwgu, wgb, ruwub, wggggbg, urrb, gbwuw, ubrrg, wrr, gbubgg, gw, wuw, wuug, wwrb, wgg, rgugrru, rgwrbr, guurrg, bgu, rurgb, gwggb, bwgbbw, ggwb, ubwgw, bbg, rbr, wgru, urwr, brr, rgbr, rgr, wwg, guwuru, uuggg, rrw, buu, urb, guwg, ugwwbuwb, rubb, brbuww, rwugru, ubu, wwub, bgwgb, wrug, rug, w, brgg, wwugwruw, ggrwb, bbwuwuu, uub, rrr, ggbrr, wbur, wurbru, wgu, brb, urbbb, gburbww, wbrgruru, rbugr, gubw, wgwgg, rwr, ugw, gggg, gwrwrg, rrub, gbwgg, grg, uwuur, gbwbbb, guw, gbwbb, uwu, ruw, bwr, rwgub, rbw, ggbwr, u, gwu, rrurrb, gwgg, uugwrbr, brw, ugburg, rwu, wwu, wbr, ruwgr, gbwbur, rwgr, rwbww, rbgr, rgbub, rbbuw, ruu, bwgw, bbwg, ubr, gurr, wwr, wwwguu, gbw, ggw, gru, wug, rubwrbrr, wbrrrr, uru, wbgw, wgur, uurgg, bbb, rbwgwbur, wwbwur, bbgubw, gww, brg, ugu, rgrgw, wwrrgugu, rrrwuww, uwwrb, wrb, rrgg, wubgrrb, bwwgrbww, gbr, gwrwu, brgwwbu, urrwub, rbru, bwrgrr, brwuwrb, guuur, wb, bbrb, brww, wuwrww, bu, rgw, rwbwug, bbug, urrgr, bg, bgg, wbgwbgru, wbrru, uwbbr, wbg, gwwur, gur, ubwb, gubbb, bb, wrugr, grur, rb, uwubrg, bwgrw, gbug, g, wuwubgw, ubw, urgu, rrrg, uwg, bbww, uwgrug, ww, ggu, gwbuwu, rgggwgr, wugw, gbrrg, ugg, bwu, ubuur, uurrw, uwwug, bgww, ubg, rw, gwgbwrg, wuu, rbgbg, buwbur, rub, ugbwwrgu, gbww, wbw, gurbwu, bruw, rggrbrgw, wguwu, ubwbwr, ru, uwur, ggb, uurwg, wguubgr, wru, rbrbr, rbwr, wwwrbb, urww, rur, bru, bbbwrw, uwrwrr, ruww, ububbgr, rrb, bggrwg, bbr, wrwrb, bwgwrbg, grbuwg, gg, ubuurwg, uur, guguwb, rugurgbw, bbuwbb + +wrbwgruugbbgwwurggwrgrrrurbgwbgggwbbgwgbrwggwur +bururbrguwurbguwrubbbbbuburuuuwbgbgrwggbugrwrwurwwbrb +wgwgwbwuggbbwbrbgrwwgwbrbwbrbggrrgburbubwwur +wguwuugubwggburwwbbbbwrgwbrwuubgbbrugrbrrbrrugwuwguwrwwwur +rubwururuggurrgbgrburbrgbuuuuurwgubbbrbuwwbgbwgwrb +rwrwguwuwgbruwurgbwbgrugwgrggwwrrgrbwrurrrrgbrgbbgwggwb +buggrbwwurwuwbwrrwgubuwgburrrwbwubugugwurrbwgwburwubuurwbb +ggwgwrrwbrbgggbubwgwgguurbwwwggbuwbrubuubrrwur +uugugbrwbbwuugwwuwugurbuugbrugrrgbwgugggrgggrgrur +bwrubgugbuugbwrwbbubbgbugbbgruubwrwgubwguubbbugu +wrgrwwgbgubrrwbbgbwuurgbbwrrgwrrwuugrgubwrgrwbwbbbwrgrbb +rwbwwwgrgbrbgwurwbwwrrguwbrbwgrubrubguwurg +rbggguwguwrbgbbruruwgguuwwwrwbugwbbbbrrwgwb +wburgubbbrbgugwurbgrrwgbbuggbrggbrbubrwbrrwur +wgwrwurgrbwgwwuwrgwwbubwbubwbubggwbwgbwwgr +bgbbbgwwgbggrububrubbwwwguruurbbwwububwugwwuburgwurgrwr +rugwgbugbwbbrbgbwrbgwgurbuuwbbwbwbwbguugruwbrrrugwwu +rwbgruguuurwbubwrbrbwwrwurguwuwbbgggrurbgbgbwwwggwu +ubwubgbbrgbbbbgwwurgbuwuubgurwrggrrrgrbbbgggbrbb +wuuruwbwubrwgwuurugbrbwgubruuwwurwgwrbrugwrrbuuuww +ugwgbwrggrwwuwbgwwrubwuubrbrbwgbbwgbubburuguwguww +grbguwwuwgrburgggguugubwwgwguuwbwuwuwgugwggggwurrubwgbbwrb +buwbuwubrrugrrurwrwwbbbrugurgwguwugwwbrurrwbrgrg +gwwgggurwbwggwwbwrrgwwgurubrubbrbuuruurwur +rruguggbrrgwgwgrwbwwwugrbrubgruugrgwgubrgwbubwbrw +grbbbwrrugwrwwurwguugugguwuwggruubrgubguuurubrgrrruwub +wwrwguwwurbwuwwrrwgwggbgwruugbbrgruubwrwur +bgbwwwbbubrugwgubbgbggburrwggbbggbrbgwrrrbrgurwur +gwbwurgrwwbrgrubwgruubbrugbruruwuwgrubugwg +uguugbrbuuugbwwrgubrwgwrgggwrrgbrrbwbuwwwwbgbuwurbrbr +ugbggbwuwrgwugurggrugbrgwbwwbgbrwugubgrwrbuuwgrurwgguugwwwur +uwrwuggbuwwbururwgbrggwgwubburwwggguwwrrggwu +grrwwwrugbwuubrggrwgrwuuuwgwrwrbugrrrwubgwggwbguurbw +rgbuuwbgwgwuwurrgwrgugruwgwbgggbuugugbbwwrwugwrurubwr +gwguwrwgbbruuwrbbubburwgrrrrrwburrwuwrwgwgwur +bgbbuuguggrgrwugruwrbuuuuurwgbwbbubwrrggwrbw +rwwurubruwuwbrbwugrwbgwwuwwuuwuwurwwgwbrwgubgrruuurugwgg +wbwguwbrruruuwubggrbggwggugurgwgbrbugbwwbrbwuguuugr +uguuwrrbrwugrwwbbuwwrgbrwgbwubbubgwwbuuwgrwuwggbwr +wguwwrbbggrugbwrugbububgurrubggbwwugubbubuuguggrwur +uuurbwwwguurrbrgrrrbwgbwuuuwurwbuwgurwguugwrwggb +urrgwwwbuuwrwugrurgwgggrgbwuugruruuwwubruwwbru +wugugbguguwugbwgrgbrugrwwgrbwrgwwubruwwrggggwur +brubbgbwubwugbrruwububuuwbbwbrugwrbbrrggrgwrugrrwbbrrub +gwwruubbrrbbrwuubrwrrgwuwrgbuuwgggbburgwurrwbuuuub +wbugwuwbbwwwggrwwbgwuggbwuuwwgwuwbrubwrgubwurwwrguur +urgrgwrurbwggguubwuuwrbbwrgggggugurgggbbwbbwgwuu +wwgubrruggbgrwbggwbrubwggbwuuuwbbrwgbgbbbrbwruwwwwurw +wuurrggguwwbgbgubugrbwgwgggrwbwgbubuwwbbrwbuurwgwguwgurwur +rgrggggggbwrrbgggguurbbbubugbururrgrrrbbgwugbwrbgubb +rbburbururrbrurrwgrwrruwubwbgrrurgrubuwwur +bgguburbbruwugrurubbubgbggwgbgrrgwgwbguguwgubrrgwrbrwur +rrrwrbgwwrubwuwurgrrwbruwuwbgwbuguurgbrbrgwur +rrgbbgrurgrgrbrwggbubbbubbwgbuuwwugbrwgwrgwbru +bwggrguguburbbrwurrbgrgbgwwrwrrrwuwgwgbggwrggubwbgubbwurbb +gbwuwwgggrgwbbrrbuuruwubwrubgubwwbgwbgrbgurbg +bbwgrbbgwurwbrgbggwbwgwurburbburgugurbbbwbbbggrbu +urwgrwgguuuwruuwrbuggggwurbrbgwrbwbggwur +wbgrurwuwgugbuwgrwrwbbgrbbburwggugugrrgbrbbwrbbrruuwgwur +ubbuggwrwrgggrugwuwwuwrgruwwbrwruuugwgrrurgurrrbbugbr +uuugrwugwuuwurgwbrgwgugrrwbrrwrbuururubguuwrbwugrbbrgwur +ubrwgrruuugwgbrgbgwgugrbwwurgbwrbgwuubbuwrbgwwwwur +gguubbgggggwwwwrrrbwwubggwuggubguuuubwwugrrrgguwrbwrwwrwur +bgwuuuggwgbbbgwugwuuuwububgurgbwbbwbuwrbuwgrgg +buwwrrurugrgbgbubuwbgwgurbrrguwuwwurwwgrurrwrbwggrrbrrgrg +urggwurbbubbrubrggwgbbwbuubgggbggrwbwrrwburubg +rbuurgbbrrgbuwwrwgurrbgbrurwgbbrrbgbwbgbbwwuwwb +ugbggurgguuurggguuubgurrgurbuwrrgbgwwgbwwbwwrgbggrwwrbrbrb +wbwbubbrwubwggwuugrgubbuguwgurruugrrbwbbuwbgb +ubuggruwrwgwbubuuuubuwwgwrbuurbuwgwgruwgrgrurwrrrwgwbuwg +bwuuwubuwrwbwbubwgbwwwbwubgugugrugwrrrwgwbgw +ruwurrbgbuwrwrbwrbguwbgrbrrubugbubbwugrrbgubggbrugw +wggrwwgwurbgggbgubgrwggwbwbrbggwwbrrurwbbguwurgb +bwbgbbuwwruggbgrrrbbwbgrbbuwuuuugbwgggwwwgbwbbbwubwu +wrrbgbbbguwgrwrrrgbbugrruuuwbgwgbgwurbbuwrugg +bggrbrgwgrurwgubgwwwwuwbbuururugwwrbrgrbubwwur +ubbwwrwrwurwgbwrwwggwgggburbgggbuwrwbbwrubrubgugbrwwuw +rbguwwbrgrrbbwuuwwgurbwbrwbbbuuubrwrggwwubbgrrwgrrwuwu +wurrurgbwbgbwbrrubbrggbwgbwrwbuubgrbuwuwrbgrgrbw +rrbgbrurwrwugbgwwrggbrgbwugurwrbwwrubugubwru +guwbrgbuuurrguurgugwgwwrwwbrgbgwwwgbbgguwwwur +gggbrwguwguwgwurrgurruuuubrruggwrgbubugurrbububgrw +ggrburwwubbwwrwgbgggurrbgggwgrrbrbbbbwugbwrbrwubur +bbbgrugwwgwggbruwrgwwbgrbbuubuguwbggwwugbuugwbwrubgguuwwg +guwgwbggruuwgrwgrbwgrrwurwgbgwwurgubrubgbuubrwwwuw +rguwrbbrbubuguurbgwburguwbwbwgwggbgwgwwuwubrwruu +uguggubuwrwrugrwwuuuguguwwrwrbgwbwbwwggurbbggbrbguwwgubwwur +bggwbuuwurgbwbrbwbbrrgwwgugrrugubbrbggbrrwug +bwrruwuguwwgbwwrrbbgrrrrrrgugbwwrrgbuuwuwrwr +bgwbugbuwwrwwrwburwwgbgbwubrbrwgbugrruuugbbbrgurbwub +ruguuwgbrrguuuwbbwwbgbgrbwgwgbwbwwrbruubrw +rguwwwggbrwbruuwwbubbbbgbbwgrwgwggggrggwbgg +ruwrugwwbuwbwwwbrwbggwburrwwururguruuguguwgrbu +bgugbrbgggbbwugwbwuurbubruwwbrbbbgrgwrgrgggrbwrg +wbrgrgbrwbwbrwuuwbrbbwrwrrwbgwggubrbrbwrrgrbuwwr +grwuwgugrwbgrgwwbwwbggwgrwrgubgrrruuburrurwwrwbrrggwgwwbgwur +ubwbwbrrbgrgwuuwgwubgggrgurwuwbrwggurrgrgurrwubrubbw +rbrgwuwggbbubruruuuubbggwrgurrwrwwuwrgguurr +urgurgubgrgubwgugwrbuugrwrgwbgwwwwubrwwbguggrrrrrb +grrurbuubrwguguurrbrguwrrggwwwgburgrrrwbgwwbbrwrwrwgwub +uruwwwbgbbbbggbbbbuwwgubburwwuugburguurwur +gwurgwwwrgrurgbbrrrwrbggbgrwgbrgugruruuwwgrgwwwwrwuwubugbu +rugguwwgwrruurwbgwuguuruuuwbgbgubbubrrrbgwbwwwwbbbb +wbbwgwrgbwwburuurgrugbwggrwbgrgubbrbwurggbggbwwwrgggbr +ugrrurbugbwwrguugwugggrrugwgururwbbubgbrwrwur +rugbrrbwbbrrwbrgwuwbgugggruuubburgbrbububrrbubwuurub +wgurrbuugubgwwbruubrrwbwwubbgrububguwgbrrwwuwuwuuw +ubrruwbuguurgbbrrrwuggbggwbrrgwgubgwbruugwuuurgubrbwugwwb +wuwrrbuwuwbburgwurwggwugggbgrwrwgburgurgbg +uwwburubuwrrubbuwgwbugwrwbgugwgbbggwbugbwuwwbruggwur +bgrubrbwruwuuuwwrgrwubrggbbgbuubbgugubrrburbgu +bgrgrgbugrurwburwbbrruwrwbburwbwbggguwburrrwuggurbbrbgrbu +bguwuggrguwbrgruuuguwwgrbgrwbuugwrbrbgburwbwwbwrb +wggbwwbwwwbbggggurbbwuubgrbrgbbrrwuuwburrugwwubgru +rbgburuuggwwwguwwrbrggbrwuwgbrgbrwwbgrugwuubguwbu +gbrbuububuububrbgrgwurbbwbuugwbrwrururgugwgbwwgggbbgbwurgwur +ruurwgwggwbbwrbgrrurguwgwwrurgrgggrgguubgguwuwrw +uwbubgwguuubbbgbrrgwwrbbrururwgurrgbbrbgubwwgbgwuguuwurub +wrwrugugguwbuwwwwgrwrbgrbwuwburbbwwgubugwuguwuwwur +urbrbwwuggwurgwbrrbgrbwrbugbugbbbwuuguwrrwurrwur +rbrbubrrruggbrrwrwbruwburrwuwgwrrwgubbgguug +gubrurwwgwwuwbrrgurggrgbwwrrgbbruurgbuubrwgr +bbrwuugubuugwwwwgbrgubbbrgbrrguwrggrurrwgbrggbugbbwwbwrrgu +uugbbwwwgwgurgggrugubgbrwwrwrwrrurugrwwur +guwgwbwgrbwbrrwrbugbbwuugwbbwgwwbrwrwubbbrb +bbbrurugrugbwuguuwwrgbrbwbwwuwwbrwbrwurgbgbggrgruuuru +ubuubgbgbuwugugurbbwuubrrgbwwubuggwbururggrrrgr +ubgwwbgurbruggwwrubwggubbuubggbggbwwwwwwgubwgu +gburuwbbrrrbwwbgbugugguugbbbwbubbguwrbrgbbgwgburrugr +gbgwbgruwrgwrrurwuugrwugruwrgubwbrrbugubugugbbwu +burbubrgbwgrwwrwbbrbuururggwbwubugrwruruuwbuuggrwbgb +bbbwgubrburwbubwwbruubguugrgwrgguuruubbwbb +guwggggrgrrugrbbrwururugbbrwrurwgbwgrrrguwwrrbbbwuwuug +bgwrrrgwruwrbbuwgbrugruugwrrrugwwuubbugubbubgggubrrrwwg +bbgbrwrwrbwbbrgwwgbugugugrrbwbbbbrbgguwrbugrbwgwrbru +rrbwwggrgwurbuwbwbggbrrbggurugwgubgggbrrbwwrugrwgurbugur +ggburugbwruugbburgrbugrgrwbbwbruubgubgbgubugubbbgrrbrgrg +rwuwrgbwgwubwubrrbgbrrbwrrwgugwgguubbrbbwguwwwwur +wuwwgbbbwrgwrrbrrgwbwwubbwrwrrrwwuuburuubwbuubuwwbbgg +wbbgwrgbrbubwggbuwwuwwggrugwwrugrgwuubbwuugrggbbrgubwrrgu +burrbwgrgbrgrruugwbwruugwbbbburwbbuwgrwuguwrbgwur +bbwbwuwwwbwbrgwwwrrwggbwgruurrbrgwggbrbbbrrbgbbgrrrwrugg +wwwbbgwgbwwrbugurgugrrggbuguugrbbgwrguugggbwwugrugu +gurbrggwrwugwgrggrbrgwugbrbuugrwurrwgrbwurwuuruwuggwruwr +guuwgguwwubrbwwguubugurbwbrrwwwbbwgggrwururgg +wubuuuurbuwbrrrurbggbgrwbbwrbuwwbwwbrbrggrwgggwwwur +wgwrwugbrwgubguguuugwbubuwbbrwgbbgrgubrruuuuuuu +wbrgwggwruuwruwwrbruubuwgwwwbuuugbwububbgwbgwbgbg +wwwwgwwwugrwgrgrgwbbuwgbgruwugrrwuugbrbrurrrguubwwur +bgbubwrwwrgrwrbuwgurrguwbruuwgguwrurwrurrwgugggbwrbwwggw +rwwurgwuwgbbwggwwuurbwbbwrwrbwbrwrgbrbbrwbr +wrugbbrgbbugrrwbrwgwuggrbrwwwgbgbbuuurwuwubbggubbg +grrwurgburgruuurgrbuurgwgwurubgbbubbubuwwwbwbuuubbbrrwur +uguuguurrwbbwgwrwgruubgguubgwggbburbuwwgbrwruururwbgrgrrgu +gugbrwwwbguggrubbuwbbbwggbgurruruwubrwggruurwbggrrruurwbb +grgrbwuurwwwuwuwwwgbuubwbuuruwwwgguubwbruggbrgub +gwruurrugubbwbbwrggrgurbwuugbgbgbubbugbgugbwbwuu +wuubwrgrruwwrurwgwwurbugrgbrbuggbuwwbwrrrbrwr +urwbwrrbbgbbwwuwbwubrbruwgubruuuguguwubguwugurubr +rrwbbrwrbbuwbwrwwwrrguwrbgrwbubwuurugurgbwrru +wwrbgbubrrruubrggbrrgugbwuwgrbgbburbbgwur +gwuwggbbrbgbbgubgbwburbguuggugrrwrbubruuurggwrw +rurruwgrrrurwwwbbuuuwbrbrbrugrgwgrrrwbbgrgwguguubg +bwgwrwggwggrwbwbbrbbbrgrwbbuubrugbwbrbwggbwb +bwwwbugwbgubgrruwrbubggwurwwuuggbrugrrururggrbwbbggbrwgug +uugwuuggrrbgugbwuubwwugwruubbbrrwbwgbbruuggggwuurgrw +bwrururgwugwrwuwbbrgwgugrurwgrwbwwwwrbgwur +ugrrrurbggwwugubwrggwgrggrrbuggrurbbbrrugwurubbbguruwbuwb +uwbgubgrrwrbgrgurubgrurrrguwbbuurbuwbgwbgruwrggwur +rwurbubbwububgbbubbugubrbbuuwwwuuuruwwrwruwwbwbwwgwbrggbg +bwgrguuruwwbwrbubwrbbbbuburwwugwbwurggwguurguguurww +wwruuguwbgurrgwrubbbwurgubguuuwrwgwugwgrrwwwrgurrurrbgrbrwur +grurwwuwwububrrggbwrgrgbuggrwrbruubwbggggrbbwrwbwwrugr +brbuguuwuubuuwurrrburrgbbuwgwbwwwrrgwrwwuwuwbguurbrr +wgrbuurrbubrrgbgbbbbbrrwrurrwgbgwbrrrwrbubruubuubwrbbbwwur +wruuuggbrburwrbbwrwbwrbwrbrurbbgggggguuwgbbgrguggwruuuww +bgubgggbruwwrggrwubbbgbrbbrwrgbruugwruggguwwur +bbgrbgruburguuwwruubrbbbwwrrrgugbgururgbgwggrbwrwur +ubwubwwubbuurwuuruwrgwwwwwbbwgwrggbwrwbbubwgubbuwru +bbuguuwuuwururbgubrruruguwwwugwruwbwgwrwbgwur +wuwrugbugwbubwwwrrugbbrruwgwgruuugbgrurbwwrwg +ubgwwwwgrbbrrgwwwbugrubwwwrurbbgbbwrbbgubwbruurbuurwr +gguggugrbwrwuubgrurbgbgrgugbgrurbuwguburbuwbrwbrwgubgu +uubgrwbgwuurrwwuubwburbruwgrrrgubuwwwwrgwu +wwrbwwwgubgubrguugrwbubwgrbuuurrgrwruwbgubwuuwuwggwububrgwur +brgrgwbgrbbbgwgbugwwubgruruubgguuwrwuwwrwbbbgbururw +rrgwguwuuubrurwwwrrugbwugrubrrwurrbrrrbggrb +ugwgwbbbrggbwugbrrbruuubrggwugruguugugwbggwrgrw +wurbrrgbbwwrwgwwgugwwbbbgbwwbrwbbggrgbggbwru +ubwwwrurbubbwbggbbwrwbrrwgwwubguggwwggbggwur +bgwgwwuurwgbbrugrgrgubrguwwrugwwwgrbuuwbrbwbrwgwwwbwurwg +wrrbubuuguruwrbggbugbgwwruuwgbwubwbruwgbwwwwrguwbwwur +urrrrbugwrwrurgubrwubbrrwbrgwuururbuwrgrggugrw +gggubrggugbbbwbwgrgwwruwwwbuwbuwgggbbbgwubuguuurwbgu +uruuruugbrggruwbuguwbggbrgwbbburuwbwwuwrgbw +bwwuwgrggrgrurwwbbbbgwwuwbwwrwwbggrrguugbgruuuubwuwugu +gwbububrubrgwubrbwrwgwubrgrwrwbrrubggwbgbuuwrwubrwwwrggg +wbggbrrbrggbuwwwbrurbbgrbuuuwrrbuguruwurwgr +brubbuwubbbwgbgrwuggbgggbrbbguuwuuwrgubbrugbbbgugrrwur +gruuubwuggbbggugrbbgbwrwgwwgwgwuwwbruuugbugrrru +wwbwwuwrguubrwugrbrgggbwuwwgbrbwguurbrbwguuwwrbgwwubwwuwbu +grrbgrwwwugbwbguwgrgrrbubgwrwwgrggwuwuwrgggbugrbugg +wuuwgbggburgggrgubbrugbgrbruubruwguuggwwuwbgggwuwwgu +wurubwgrgurrgbgrgbbwbgggwwuwbbgbrruugggruguggbwruwru +gbrugrbuwrgwrrurrrurrwuwgwgbbgwrwgugwbwrbbwrrbrrub +ugbwrugbruwwurwwrwgbuwrgrrgwrugbruggrrbwbuwbburwur +guuuwuwbuurggburbbuugwgwrgguugrguguubbbbuug +rrgubrbbwuggurbrrgrbbbwwwrgrrbgwgubruwguruurwgwgbwgbrwur +wuggruwburuwbubuwuwbwwrrwrbwgwwubuwrugbggwgbwbuuwg +wwrrbwgubbrrwuwbggrwwrbubbuggwrrwwrrgugurguurwrrwbbwgbw +grggruubbgubugwgugbwgbuuwugrwwrrwrggwurwuguuurgrwuwrbwrwwr +wrguwwubrgrgbuuurggwubbwgwubgbgrrburbgwururbbgwrburr +gwbgguuwwgrbbbrwbuwgrrgwubwgurbwrruwrggbugrwwwur +wrbrwrgrurrugwuggbbrrurburubwrrbuugubrrrrbugwrrwgbuwrgbbr +rbuggurgwgwwuuwuuwubbbrguugbubrurwrrwuuwugubwugrugbrrwur +brgwburbwbrbrwgwruwwggbbgrwrbguguugugubgrgwgwwr +wrbbbrwgwbrgggrrwbwgbbwbrggrwrburrbgbgrbbuugwg +uggbwubwrwwbrgrwwruuwwrggbwrbuwurwgurgbuguwuugbwbg +brgwbgbuggbbgrguggbwggrgrwrubururuwubrgwwbbgwrwugwugwr +buruuuuwgugwbgbrwrbururbrurwwbburuurbwuuugbbbwwuwrugugbrg +rrgrrrgwggguuwugrwwguubbbuggrwrbruuuguwgwg +ugbgruuwruwbwbgrgggbwugbwbbwurugwgwuurbuwrg +bwuwugbbubggwwrwubuubwgrrbrrbugrurubrrguwrbr +rguwwugwruwrgbwwgbgugrwubrwrbbwwrbggubugubwgwrbrwuuubu +wgbwggggrgrgrbgurwbuugwuwwrbwbbbugruwgubwwgrrgwur +ugrgwgguuuwbrgrgrugbruwrbbbrguwuurgurgugurrgbubuwgubuwbwu +ggwwwbgwgwguwrrruwuubwgbrubgruuurrrubuurrrgbguurw +grwrwuubrwwurbwgbggwrwuuruwguuurrgbwguwubwbuurgwbgugwuwbwr +bbwuuwrrwgrrbgrgbruurguuubuwrwguwuwbbggwrubbug +rrbbruwbbrbbrbbbwbubbgwurrbubrrbrrubbwugubr +burrubrururbguwwgrubwwbgwugrrwgbbgwgrwbubgurgug +wuwubwwburgugwwbgwurbbwwgrwguguwwbgwggubgbwbbrgrurrbbr +buruwbrugwrwbrgruurbrwbbrggbwgugwbuwgrgbwwwruugrggrg +wrgurwwgwwrbrubuwrbrruurrbbgggwuwgugwwurbwgurgwbbbrwr +buubbgbrrbwgwwwbgwrubwrugruurgggwrbugubrgwrrgbu +bwrbbuguugbgurbruwgbbruuwubwbggbrbrbugggubbbwwwbbguggwwgrg +burggrbrgwrwbwwbrbuwuguwwwwbrbbrbrbbwwur +uwbrggwrbwuruubggbwuurubrrbwubrwwgugwruwgugguu +grbgggbwbbwwuwbrggrurwwgbrruwgbwgbruwwruwubrruwwbbwuuw +wbrrgrrguwbuuugbrrrgggurbrwbwwgwrwbrurwggubbuwuwgwgwbbbbb +brbgubgrwrbbuwwwbwrguwwwuggurrubrugruwrguuwwubgru +rrbbrguwrrugwuubrwgwwrubrubuwbuwbrgwbrwuruuguwuuwrgrgur +rgwrbggrbwuwwwggrggrgrwwgwgrbbgrubuwugbrrwrbgwb +wwwugwuggbgwwrrbuwwrrwuuguggbgbwwrrbggwrbwwguur +ugugbrwrgwbrrrbbrwrrrbuugubrwgwrrgugwbwgbguuwwwruguwgrwg +gwgrbgguuurbwbwbwuuguubgbrgrrguwrbubgwwrug +gubwwbrwrruwbwwrwwwbrgwbugrrbuwubruuwbrwbbwubrw +uggwgbwrguwwubbugbgrwurgubggugwwwwbwuburwgub +uwrrgwrrrwrwbgwruuugbwbgwggwrrrwwgurrrrrgurwwwgruruwgw +urrubgggbbwgbbrbrbwrrwgrwwgrggwbbbrrurgrrurgubwbwu +grurubrburbbwwuuwrubbbbwrwbbwrgwrbggwgguwuuwwur +bwbbwbrgrbwrwbbwugrugurruruububburwuwgugguwrwur +rbrrbgubwbgwuwuuwwwrubgggwwuuugggubbrrbbggwrwb +gbwrugrgubwbrwwurbbgwgrrbuubrrubuwubguuuwgu +bggbwuuubgwrgwuwbbuguwrburrrurbbubrgwrwrwgrg +wgurrrrbbggwbbruwbwbrbguuubwwrbuurbrurrurwur +gwbgbgwbruuruwuurrrrurrwbgrbbwguwgbgrwgrrwuwwwgbbrr +rubburrrwggbwuwrbggrubrgurgwbgwbwurgbgwrbgwg +uubuwbubrggrwwwuurgburbuguuugrbguuwugubwbgwrgrggu +uwurgbguubbuuwrubbgubggurrgrrbbrrrwwugwruwr +uwwgwugguugrugbubbrwwgubwubbwrwguwbwguwggrgugrwguggubrwb +bgrbggwgbbgrggwwrbbubwwugbwgrurrurbuuurbrbburbruur +rubwrbrrwwgwuwbbbubrguggwwbuwrrguwbwrgggwburbwuurwb +rrgbbwwwbwbubwbwrugbugguwbuwrubuwrubbgwbgwgwrbgurrurruu +gbuwwwwgrguwgwbgrugrrwbwuuguubgrbbugbbgrgbrgbb +rwrwbgruwbrbgbrbgwwrbwubbwwuwbrbbbburuwrugggr +buubbrbubwwuggurrwwuguuuwbrbwbrgggrubwbbrgbwurugrwgrrwwgb +rrgbuwbwuuwwwbwuugrurggwbrbwwuruwwwuruwur +grrbrwwbguwbbggguuwwugugrugrgwwwbrgrgbguggwrr +rbgrwugbgggbubugwrburgggrbwbrruuuubrrrguugruwwrbgrbwg +urgrbrrrgwuwwgguwuwuuubwwrugwrgbwrbuwuwbgwbwurwwwrgbrrggb +rgrwwwwwugbgugbugrgbuwrgwrwgburuwrrgrbwbuubwguwwwugbrg +wbbbggwwuuwwgwwuguuuwuwwugrwwwubgugurrrugubwgw +brbuwwwgwgurwgbwrrbrgruguwgbrbwububbrgrbuwrugrwwur +uubuuggbguurwbrwgrburbbbwburubgurguugbbruruur +grrrwbuwuwruwgbwwwgbbgwbbguwbwurrugwwbuwbuuurrurwur +ruruwrwuuwbrgbugwwgwgbrbwwrrrwrbrburrgruwrwwbbbugubwwgrbww +bgwruugguuwuurbubgwgrgruwbuwwwwguwwwrbgrwrurwbggrguw +wuwwwwuuburggurgwrgruuwggbguurwbggrwbuugrwbggurbgrgb +rugwbbuwrgruubgggwuwwrggbgwwbuubrguwugbburrbgrrbwrru +gubgwgwuubwuubrbrbbwwbwrbguruuurgrgrggurbuguwbgr +ubbwgruubgbuwuurrguwrbuwwgubbrgwrruggurbuguwrbrbbwgur +wgggurbbwuubrbwrgwuurrbwgwburrwrbuuwbwurwur +gwgbwwrubwugbrgrwbgwbgruwugbwubbbbbwubbubg +ugubrbguubwgbgwugbwgwrrgruugbbbbruwugwrurugrgrwwrbw +urgurgubwuugbgbgurbbrrgggggwuwgrwbwgbubwuruuwbub +rrrruwwgwgubwbubbggrbruuururugbwwgwwugwgggwguggg +uggbbuubrurwubuuwrurrbwwuuwubrbgwrbrrrrwbrbgwggwuruur +rbbbwbgrurugbbwguurrugubrbgbgggrbuguwrgwwbgrrw +wrgwrugruwbgrwbgbbguwgubwwbugubrgbrgwgburguubbbbuwrwwur +rwbuurbrbgrgrgbgbbbrgbrrgggrbbrgrruuubrguubbrgrwwwwuwrubgr +bubwrwwbrruwrbuuugggrrrruuwrbwwbggwrwbuuguwwbgurgbu +uwwrwwgbbwrugruuuuruuwuwgrwbwrbgubwwrbbwgbgbgwg +buuwrguuuurguwbrbrrwguubrrubgggwwrbbwgbgrr +uuwwgwuwgbgwruwuuubrrbwuwrrurrwbgwbuwbwurwur +ubgurwwbwgwruurwwubrwuwrbugggruurwugurruwguwgbrgrugr +uguuguwubgrgbrbgbwgwuwwwubbwrgrbuguuugrwur +rrwbrrrbuwwgwgrggwrwbrrubwrbrrbbwubrrwwur +ubugrwwbbrgugburbgrrwwwuugbwrugbgurgrwrgubur +bgwbgguwrgwruwgwwrwrugurrugbrggubwbbgwwwwrbwwrugggbrwggrrw +wurrguggggwgbuwwguwbbbbgwburwwbrrwrrgwur +gbrwwgrguuwwrrgugubwbgwuuugwgrwbbwrwbgurugruurwuuubrwur +rrrwugwrrwwruwbggwrruuwgrbuwbbgbbggruwwbgruwggburwg +brbwwggbgwwbgruwubbbbggwwubrgubbuwububuwurwbbwwbwu +gbbggrbwwuuwuugrwuugwbrurrruububggwrwggrgurwwur +rgbwwrruugbgruruwuburgrwrwbbuwgrggguugugurwggwggrgugggrg +brbbwrruuubuwurrrwburbrbwgwurrbrgbrwrbgguruuwuuurbgbbg +gwbrwbguugbbwrgrgrbgbruwgwruwbrwugrrgbwwgb +wuurgwugrugguwwwbwwubwuubgwubuuubrwuuububrugwbgggrruggrrr +rggbuwwggruugruwugggrgrbwbwrggrgugwubrrgrwgwrwuru +uguguwwwgugrgbrwgbubwwuurbgguwubrrugrruruwrgrwwubgwg +gbbbrwurrubrugwrgwrbugwggugrwuubuwbgrurbuwbgbbbgw +wrgwuwbwrbbrgrbwbrbuggbuwbrgurwggwbbgrwwuwbbgwrrrgrubbb +bbubbrgwrgbbbrgguurggrurwuwubgwuwubburbgwrgw +urggrwbgbggrwbwburbbubggbrgbgwbrururrgwgbbuwbu +urggbbbrbubbwubbbbrbgubrwrrwbuwbbbbrguwrubbuwuwgg +ugugbubbugggwwbbruggwwrugbrurguugbrwbgwuuwbbwuguggb +wrbwrrbgrurbuwwrwwwrrrbrbuuwbuwbggwgggwuuwwuwbrwwrwbrrrrrwur +ggubgbruuuwbgrubwbbubgruwwwuurbrwbgwrrwbrbrgu +bwbbrgwgburwwbgrrwgbururwrwggguwgbwwbgwuuggwuggrbg +ugwwgugbuwruuggugggwrbuguuugggwbrwrbubguuuubwbwgwg +buugrgrruurbbrbgguubgbgbbuuuwuwgwbrrgwur +gwbbguuwwbburguugubrwgwwwubbubrgwruurwwruruwu +guuwbugrurwbbugrbrwuwbgwbrgruruwugwwbrrgrwgrwrugggbwwur +grurbgrrubwwwbwrrurwbwbgurwuwgwruwwwurwrwwrrugw +bwgbuwurrugwwrurbrurwgwubrrrrbuwwbruuggwbrubbrgur +ugwuwgrubrrgbbrwwgwggbwubgrbrbwwbgwbgrbuwuwwrrwg +ubbuwubugwwrgwrrwwubguurgbgwrbubwwbrwrwbbburuuruuurbuubu +wrbrgwubgrruuwbgguwbubwbbggrbgwbwrgwwrrgrgrbgbugubwg +wrugubgwbruwgrgrbgrugggwwwrwrwuwbururgrwrggwwrubuwbbbggbu +wugubugbbrrwwwrguburwrguwrugubwgugrbbguwrgwwwbgggubrrwgbgwur +rwrbgwguwurbrrbbbrrwrugrbggggwruubwruwbgbwrrrwbg +brrgrrugggggwgurgububrgbuuwgubugbgbgbuggwbburbgugugbw +gbbugurwwrbrbwbwwgbbrrruuwbubwwwgrbubuwgrw +wgubburbrubrwwugugwrburrbgurbgbruuurwgubgwb +ubwubwbgwrgwwuwbugbrwgbgrwgrwuwbrbububguguwrgwrwwwur +uwgwrwguwrbrgguwbgubrbwrurrwubbwbggbwbbbwburrruwbruugu +bwbwwbrwwwuwrrbugrgrrbwwgrugurwuubwbwgguwgbwwgwuwrbrb +wurrwgubuuwrrbbbuggwbwugrbgwwbrurwwuwwuruur +wgggrgrurbbbrbuurubgububwuwrgbbuuugbwwwbgurbruwbugubr +rurrubrwrwubrgurbbbgwrrbubwggbwwbbwgguugwrwwubuw +wwuggububbrrbbwrbwrwburwbrgwwgwugguwgrbwuwbuurrwwugbwr +ggrwbrwrbwwbwwwbgbgbbgwurrbwwbgubwbgrgubugr +rbbbbgrggurwuguurugugrruugwrwgrwgrbwbbwgrbrurggr +wrubwggwbuwrbggwbuwggwbwgwrruguwrbubrggbrwur +gwgbwrwugbwuwubwwwgrbrrbwubbwbwrubbbrwuuuwuw +bgwgubbuuugurwrbubrurburggwbrguwbggbgbbbbg +gwurgbbburbrrubgwwruwrwugbwwwwruuggwgguwuuuwuuurubgru +bgrwbuugwwrgggrggwrgrbbggrgbwrrwubwububurrrbgwggg +bbwuwrurwgbrrurguggrgwgggwuurbrrrurguwurrwgwruwbbgb +guwugbwrwwbgrrrugwuwurubwbwurgbwubwubbrwgwugb +uwrurbgwubuwruuggburburggwguwwbwgggwgbrgrwwrrrgww +ggwwbgrbuwrruurugggwrbwwgrgrwburgrwwwwrwbrbrrwrgurggrgwur +wurbwgrugbwugrbugbrrwugruwrgubuuwuwgrgbwgggb +wwuubuuuwrguuwwugbuwuububwubbguubgbubgrrbugbrgrwrbwrb +wwbrbwgbggbuubrwwgrguubbrbbwbbuwurbggubrrrrw +ggrugurgbwggwwwrwwbbgbuubuuubbwrurbubwbgbrwur +wgbrwgurwwgbbwwurugwgwugrggwurgrgbbbbrrbrbrgwuur +urwrbrgrwgwuurgubugbburugbgbguwbubgbwugbuubu +bwgwwuugrrrgrbwbggwuuwwurugbwbwgubgbwrubwgrw +brurrbbgubrrrurwwwwbubbgwgwgrugubbggwbggwubuuug +uwbwgrubgbbgrrrrubrgrgrbrbgurrbrgwrrbwgrwrgrgwgrrubbuuwu +wgbbrwurubuuwgruwgubrwwwubgbggrburruggbbrrwwruwwwwur +uwurruwrugbgbwrrbgwrwuwwuubruwrubrwwbwrwgggwugbrrrrwur +bbuggwgbbruurubuuwgbbwbrbrrbggggrrbuubrububbubugu +brbguwururwguwbrgrrwbbbwbgrgbgwgwgwgrrggrwrbbrburrur +gwbbrrwwrggwrrgwwrwwwurrggbuugubbrwbbggwur +rgguburbuggbbbrgurrwrwrggbrgrbuwbrgwwbwrurbugbbbu +buwuwwbuwugrrgrwuugbrgwurwwgguwgbggrrurbwgrurrwur +uugubgwggruuuggwgrbuwbrbuuwbgugwbuugwbgbgwuuuwgruwu +rwwubbrgwbuwbbguugwgbwburrwubruubbuwwwwwgbbbbruwuuurwur +rrrrwwguwgrurbubgbrgbrurwwgubwuuwuwbbwruwwur +bbubuubgbwgbruwugggurrwguggbwbbbbbgrbwggubwgwubgbwrwur +bubgwubbwrrbbwgurwrubrrubgurwwgrubbbugrgub +rbwgrbubbubwwrbgbgbwgrbubguurwwgguwgubbrrbubwr +guugbrgwbubububrbrwurrgwurbwrggbgbrbwwrbbuggugwgubrwrwbbbb +grrbguguwwwuwurruubggguububgwurbubrrurwrwguggbrwrwgugb +rgbgbugubuwrbbrwwuwubbububgwbugwurruwrbrgwg +bwbwgubgwbwwurrubgbrgurugugwwrwrrbwwbbwggrb +uuwwrgrurgbwgruuuubbugrrwbwgrbggwbubwbwbwgwuubugbrwur +bbwrbrwrrrrwwbbguwrbruwgbbrwurwrwuugbwgugurwwugrrurgugubu +urgwrrgrgggrguggbgrbggwuuburbwrwgwgrgbwrgg +ruuuwrwubrwwuguurrwgbrbbgggrrrgrbuwuuwwrrguu +grwwrrrrggbuwurwbugugugrrwwuwwgggrbrwwrbwuwbwgw +rrwbbruwuwwwuggwrwbrgwwgggrbrrgwrbgbwbbrwrbubgrrggwrwgrg +uwwwbwwuurrguuwwubwrbbuubbwwgrbwwbbwwwurwbuuwrwrwggwur +grrgwbgubwrbubrwubguburrggbbugwwwwruuwwuggbg +grbwwuwubbgggwbbuggrgwburwwrruruugrgwwwgwwwrgrbuwbrgb +ggrggrrgbgggrrgrbrurwgbgrrwbgruwwbbggbgwwbubwrggwgr +wgrubwrwbbrgbwuurwbwwuubwgbuubbwrugugurbgwrbwrbuwgguurww +rbwbwbgwuubrrrgrrubbbbburbbwuwwubbbguubgwwwur +buuuwrwwbuuguurwwbuwwgrgrgrrrugwrggbggwbgubw +wwuwwwwbrrwbwgwuuwwwgwguwgwubuwwgwuggrbwbrr +gbbgbwbbrbrgwrwburbrbwrburrgwwuguruubrgubgrgrwugb +urbgbwwrrwguurugruurbuwbruwrguuburguwwuuruwbggbwuwggb +bwrwwuurugugggwuuwrbrgbuugbuwbuubrgrrrrbwgbgwgbu +ubwrugrgrwruwggbwruuggbubwguguubwrrbggbgwggrww +uwbubuuwbgbuwbguwuwwgbggugwwubrbubgbuwrrbuwbuwrwbubgbrgru +bbruurgrwuwbrgruruwwuwbwuugwurbbrwgugrrrurbubgrgw +wbgwwrrwgwrugwurgbggbgwwgbwrbrbwwrrwugwrwbuuugguww