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