From c0ec510fc9665b298e1da8c2dd1281ade766bd39 Mon Sep 17 00:00:00 2001 From: Dustin Swan Date: Fri, 8 Dec 2023 23:09:27 -0700 Subject: [PATCH 01/10] day 9. Why do I feel like I could have doen this a much easier way... --- day9/data.txt | 200 ++++++++++++++++++++++++++++++++++++++++++++++++++ day9/main.zig | 78 ++++++++++++++++++++ day9/test.txt | 3 + 3 files changed, 281 insertions(+) create mode 100644 day9/data.txt create mode 100644 day9/main.zig create mode 100644 day9/test.txt diff --git a/day9/data.txt b/day9/data.txt new file mode 100644 index 0000000..65fb280 --- /dev/null +++ b/day9/data.txt @@ -0,0 +1,200 @@ +8 10 9 -2 -17 8 190 771 2208 5345 11753 24409 49063 97014 190779 375658 743112 1477240 2945141 5868120 11637263 +-9 -16 -26 -42 -67 -89 -41 278 1345 4163 10710 24787 53710 111805 227699 459451 925644 1868703 3782952 7672020 15562542 +28 51 96 170 284 469 798 1415 2573 4692 8485 15300 28049 53554 108059 229471 503402 1116673 2463878 5353430 11394522 +10 16 22 28 34 40 46 52 58 64 70 76 82 88 94 100 106 112 118 124 130 +8 24 56 121 238 431 742 1256 2137 3671 6309 10700 17701 28348 43769 65017 92798 127066 166454 207507 243680 +3 13 33 61 105 197 418 951 2204 5084 11556 25688 55464 115742 232843 451380 844073 1525447 2670475 4539407 7510219 +15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 +4 5 21 57 125 255 506 977 1818 3241 5531 9057 14283 21779 32232 46457 65408 90189 122065 162473 213033 +5 12 36 95 219 453 862 1541 2644 4472 7720 14109 27863 58876 128976 283411 610443 1272472 2551916 4913291 9078231 +2 19 48 88 142 226 378 659 1139 1866 2825 3907 4925 5735 6545 8524 14856 32421 74326 163554 338048 +3 2 -4 -12 -13 15 119 394 1027 2386 5231 11268 24599 55319 127898 299662 699808 1609223 3620339 7952681 17068804 +9 19 41 88 184 362 655 1088 1698 2633 4409 8432 17912 39299 84354 172945 336675 623603 1104781 1884372 3117140 +11 10 7 2 -5 -14 -25 -38 -53 -70 -89 -110 -133 -158 -185 -214 -245 -278 -313 -350 -389 +19 24 24 19 9 -6 -26 -51 -81 -116 -156 -201 -251 -306 -366 -431 -501 -576 -656 -741 -831 +9 32 76 155 293 539 990 1835 3446 6555 12569 24088 45704 85172 155057 274974 474551 797258 1305258 2085449 3256879 +4 22 61 126 216 323 429 496 442 104 -778 -2444 -4602 -5001 3844 41336 151368 424562 1035747 2304666 4791100 +0 0 9 40 118 299 697 1509 3030 5661 9946 16758 27950 48215 89776 183216 400828 904162 2036175 4492208 9625134 +13 25 39 60 106 222 501 1112 2341 4666 8915 16616 30800 57904 112321 227047 477565 1032763 2257999 4913736 10521598 +6 22 40 69 146 357 871 2004 4337 8920 17613 33667 62784 115219 210184 385179 715340 1352050 2596670 5035253 9774610 +2 9 16 23 30 37 44 51 58 65 72 79 86 93 100 107 114 121 128 135 142 +-1 -2 -8 -29 -74 -137 -160 57 1057 4150 12265 31578 74476 164761 346652 700523 1371301 2621840 4937055 9232612 17279510 +7 3 -1 -5 -9 -13 -17 -21 -25 -29 -33 -37 -41 -45 -49 -53 -57 -61 -65 -69 -73 +18 35 77 152 275 474 797 1337 2301 4165 8004 16198 33941 72398 155095 330403 695128 1437759 2915603 5788900 11248491 +7 28 76 166 310 512 772 1122 1725 3072 6312 13746 29508 60444 117184 215382 377075 632084 1019348 1588046 2398322 +-3 10 34 68 126 257 565 1229 2528 4882 8928 15661 26685 44639 73889 121610 199423 325802 529526 854522 1366528 +6 4 15 51 125 266 551 1157 2441 5079 10347 20719 41097 81174 159640 311114 596708 1118810 2039715 3601703 6142457 +12 35 71 120 182 257 345 446 560 687 827 980 1146 1325 1517 1722 1940 2171 2415 2672 2942 +-2 4 33 113 285 614 1209 2261 4127 7519 13909 26350 51070 100480 198753 392053 767092 1484370 2836777 5350987 9959291 +-6 -2 3 9 20 44 93 183 334 570 919 1413 2088 2984 4145 5619 7458 9718 12459 15745 19644 +12 25 49 95 174 290 437 612 857 1353 2630 6055 14955 37103 90000 211717 482514 1066813 2292543 4797075 9788236 +-4 4 16 26 29 26 31 88 318 1047 3127 8672 22628 55944 131699 296469 640572 1332626 2675974 5196610 9773547 +14 20 26 42 100 265 654 1485 3185 6596 13338 26437 51445 98542 186642 351540 662034 1251569 2380155 4556366 8781478 +17 28 52 116 263 555 1079 1958 3381 5702 9728 17440 33609 69151 147721 318136 676961 1408280 2851676 5615220 10758379 +27 38 47 50 36 -21 -161 -409 -683 -567 1192 7716 25976 70370 168856 372991 773719 1525352 2880909 5242830 9234076 +9 24 52 89 130 174 242 430 1026 2727 7008 16735 37199 77905 155712 300326 563743 1036074 1871316 3328125 5832568 +18 30 58 130 290 604 1169 2128 3710 6351 11024 20036 38775 79266 167002 353463 738166 1506184 2990058 5769178 10825356 +23 37 62 108 193 352 660 1280 2553 5166 10476 21162 42594 85792 173866 355862 735855 1532471 3197482 6646280 13695427 +-7 -9 1 33 93 192 372 760 1668 3760 8302 17494 34850 65539 116523 196223 313307 474021 677271 906407 1116355 +4 13 35 70 118 179 253 340 440 553 679 818 970 1135 1313 1504 1708 1925 2155 2398 2654 +13 32 68 135 266 535 1087 2173 4187 7702 13502 22607 36288 56069 83713 121189 170617 234188 314056 412199 530246 +15 39 72 119 196 333 580 1029 1874 3542 6945 13932 28069 55954 109395 208956 389625 709697 1264414 2206485 3776346 +23 48 100 198 372 668 1150 1905 3070 4928 8170 14508 27993 57733 123378 265976 568880 1196482 2462432 4942379 9645683 +22 37 58 84 123 216 478 1175 2866 6656 14639 30679 61822 120915 231510 436964 817030 1517731 2805360 5166426 9499429 +9 38 78 125 175 224 268 303 325 330 314 273 203 100 -40 -221 -447 -722 -1050 -1435 -1881 +10 28 69 152 306 570 993 1634 2562 3856 5605 7908 10874 14622 19281 24990 31898 40164 49957 61456 74850 +10 30 66 140 289 566 1040 1795 2928 4546 6762 9690 13439 18106 23768 30473 38230 46998 56674 67080 77949 +10 33 71 120 172 215 233 206 110 -83 -405 -892 -1584 -2525 -3763 -5350 -7342 -9799 -12785 -16368 -20620 +10 22 42 79 147 285 585 1232 2574 5271 10644 21490 43883 90886 189731 395088 813105 1645355 3271757 6413156 12459158 +10 22 42 75 127 213 369 668 1240 2296 4156 7281 12309 20095 31755 48714 72758 106090 151390 211879 291387 +-4 -11 -10 7 44 101 174 255 332 389 406 359 220 -43 -466 -1089 -1956 -3115 -4618 -6521 -8884 +6 13 27 55 126 305 707 1511 2974 5445 9379 15351 24070 36393 53339 76103 106070 144829 194187 256183 333102 +20 33 58 101 165 248 350 501 838 1791 4500 11709 29625 71674 165847 368562 789903 1638140 3296401 6452952 12322160 +23 39 62 92 129 173 224 282 347 419 498 584 677 777 884 998 1119 1247 1382 1524 1673 +8 23 43 75 141 283 577 1166 2326 4597 9059 17933 35875 72670 148631 305041 623716 1262615 2518947 4938203 9498009 +5 6 14 50 148 354 723 1323 2267 3805 6514 11618 21442 39941 73131 129065 216721 342776 504702 677906 793712 +17 39 77 145 271 506 944 1760 3284 6161 11714 22748 45250 91860 188860 390266 806371 1661427 3408743 6955423 14089337 +8 11 17 19 16 30 134 493 1416 3421 7337 14514 27296 50072 91574 169956 324336 641639 1319313 2809709 6143224 +20 40 82 157 276 450 690 1007 1412 1916 2530 3265 4132 5142 6306 7635 9140 10832 12722 14821 17140 +26 51 92 152 243 410 767 1551 3215 6604 13286 26131 50219 94068 170936 299469 502108 798261 1187076 1611454 1890399 +5 4 -3 -16 -37 -71 -118 -146 -26 614 2709 8433 22564 55138 126495 276803 584082 1198534 2408270 4765262 9325584 +16 24 24 20 20 33 68 136 256 466 840 1512 2708 4787 8292 14012 23056 36940 57688 87948 131124 +2 4 17 50 116 232 419 702 1110 1676 2437 3434 4712 6320 8311 10742 13674 17172 21305 26146 31772 +9 21 50 100 171 262 381 562 889 1527 2760 5036 9019 15648 26203 42378 66361 100921 149502 216324 306491 +13 19 47 108 224 444 870 1714 3432 7027 14700 31188 66405 140452 292753 598086 1193703 2323675 4409173 8156732 14720782 +9 14 24 54 143 367 864 1895 3980 8163 16475 32679 63396 119726 219493 390258 673259 1128452 1840842 2928308 4551141 +2 1 4 10 10 -19 -107 -262 -420 -378 302 2477 7844 19892 45891 100715 213678 440047 879496 1704492 3202470 +23 51 106 201 353 596 998 1681 2859 4937 8750 16060 30476 59057 115120 223470 430907 828331 1597490 3107587 6107791 +20 41 78 134 207 294 404 583 954 1767 3431 6461 11241 17567 24329 30972 45742 113631 394186 1354910 4215913 +24 44 85 162 305 572 1065 1962 3594 6612 12299 23081 43291 80299 146385 262490 466732 834112 1520337 2853824 5518005 +13 25 53 116 249 517 1041 2041 3906 7306 13366 23927 41924 71916 120808 198810 320683 507327 787771 1201630 1802099 +21 36 51 65 78 93 132 286 825 2400 6393 15550 35227 75980 158961 326806 664625 1338584 2663715 5218371 10030592 +-2 10 41 111 263 574 1177 2302 4346 7998 14498 26240 48213 91352 180004 367865 770694 1631114 3442799 7181181 14719595 +18 37 69 128 236 416 695 1128 1861 3265 6203 12558 26282 55463 116296 240439 488096 970361 1885949 3579504 6631284 +16 22 39 87 214 510 1121 2263 4236 7438 12379 19695 30162 44710 64437 90623 124744 168486 223759 292711 377742 +9 12 25 49 89 160 301 608 1312 2951 6717 15102 33027 69744 142059 280147 539226 1025523 1957432 3810972 7658912 +20 23 28 51 127 324 759 1624 3256 6337 12400 24960 51801 109240 229543 473023 946556 1830019 3410988 6125145 10594043 +13 41 81 141 250 464 868 1574 2715 4435 6875 10155 14352 19474 25430 31996 38777 45165 50293 52985 51702 +9 25 60 119 218 394 712 1273 2236 3882 6772 12095 22397 43107 85819 175561 367114 781429 1685305 3661271 7960379 +4 -3 -16 -36 -64 -101 -148 -206 -276 -359 -456 -568 -696 -841 -1004 -1186 -1388 -1611 -1856 -2124 -2416 +12 22 40 66 101 159 289 616 1428 3364 7800 17594 38458 81425 167274 334550 654272 1257026 2382572 4469306 8312199 +16 36 62 92 124 156 186 212 232 244 246 236 212 172 114 36 -64 -188 -338 -516 -724 +-7 -6 1 14 33 58 89 126 169 218 273 334 401 474 553 638 729 826 929 1038 1153 +21 41 85 171 323 570 943 1470 2169 3039 4049 5125 6135 6872 7035 6208 3837 -795 -8595 -20689 -38453 +0 2 3 7 42 189 631 1728 4124 8892 17723 33165 58918 100191 164127 260302 401304 603398 887283 1278947 1810626 +6 27 66 133 252 474 900 1733 3392 6747 13590 27567 55991 113275 227215 450074 877438 1679215 3149022 5780661 10383546 +9 31 60 105 196 390 771 1445 2548 4325 7416 13619 27615 60490 136517 305923 669051 1423011 2953492 6016853 12099022 +10 10 21 57 143 333 754 1693 3747 8052 16589 32520 60419 106134 175917 274623 403748 562914 764993 1088463 1815555 +0 11 47 123 250 438 717 1186 2100 4005 7931 15653 30030 55432 98265 167604 275944 440079 682119 1030655 1522082 +4 2 5 13 19 5 -59 -207 -444 -647 -311 2028 9979 31542 83085 196006 427388 876388 1708621 3191415 5743531 +21 28 30 24 16 36 154 489 1199 2436 4246 6390 8058 7444 1146 -16649 -55239 -128788 -258066 -472604 -813324 +2 1 3 8 31 126 434 1265 3232 7490 16224 33728 68807 139949 285947 586660 1201702 2439383 4874513 9541916 18242623 +11 15 11 0 -8 20 173 655 1882 4654 10510 22528 47110 97732 202274 416411 846705 1688621 3286965 6229712 11491728 +22 34 53 83 132 217 384 759 1656 3781 8578 18756 39018 77011 144606 259984 452078 771652 1319659 2317357 4271044 +-1 10 40 92 174 315 592 1169 2349 4640 8836 16114 28148 47241 76476 119887 182651 271302 393968 560632 783418 +11 27 70 166 357 711 1348 2493 4581 8479 15978 30885 61394 125101 259370 542362 1135062 2364307 4885498 10000015 20273388 +16 34 71 142 262 448 727 1148 1805 2912 5045 9795 21275 49208 114707 260357 566838 1179102 2346051 4478772 8233684 +-1 3 10 20 33 49 68 90 115 143 174 208 245 285 328 374 423 475 530 588 649 +8 19 45 96 187 347 635 1155 2072 3652 6373 11169 19859 35758 64343 113626 193536 313097 473469 653950 786771 +16 27 57 113 198 323 534 953 1841 3719 7634 15727 32332 65876 131823 256818 484209 881806 1555374 2678560 4566449 +6 15 32 61 113 206 365 622 1016 1593 2406 3515 4987 6896 9323 12356 16090 20627 26076 32553 40181 +12 22 41 78 161 360 818 1788 3675 7089 12934 22598 38391 64551 109515 190999 347381 663416 1328773 2771447 5959410 +20 37 57 82 120 202 409 905 1974 4070 7921 14798 27191 50372 95791 188266 381292 790377 1667237 3566548 7718806 +13 31 51 84 169 384 851 1731 3207 5457 8622 12766 17791 23206 27605 27891 19281 389 -3571 134438 850205 +12 30 69 155 343 727 1450 2720 4851 8376 14327 24862 44585 83254 161329 321456 652505 1340181 2773452 5766664 12017378 +7 33 73 127 195 277 373 483 607 745 897 1063 1243 1437 1645 1867 2103 2353 2617 2895 3187 +14 28 57 126 266 511 910 1580 2847 5550 11627 25187 54445 115233 237408 476507 934644 1797152 3395149 6309420 11538196 +12 20 31 64 149 337 730 1545 3236 6713 13717 27432 53431 101047 185216 328782 565363 943750 1538049 2477213 4031782 +4 9 15 22 30 39 49 60 72 85 99 114 130 147 165 184 204 225 247 270 294 +8 16 40 86 162 281 478 850 1629 3313 6920 14505 30198 62187 126285 251980 492162 938034 1741020 3143748 5522366 +16 27 42 65 100 151 222 317 440 595 786 1017 1292 1615 1990 2421 2912 3467 4090 4785 5556 +6 20 54 122 238 416 670 1014 1462 2028 2726 3570 4574 5752 7118 8686 10470 12484 14742 17258 20046 +9 24 58 124 248 479 909 1713 3230 6126 11716 22596 43907 85957 169853 339829 690242 1423895 2975313 6264575 13205537 +10 30 69 129 215 346 572 997 1808 3310 5967 10449 17685 28922 45790 70373 105286 153758 219721 307905 423939 +5 6 12 44 147 410 1009 2300 5014 10641 22129 45070 89636 173785 328969 611348 1125520 2076190 3879935 7401246 14436738 +4 23 58 126 255 497 955 1823 3438 6343 11360 19672 32913 53265 83561 127393 189224 274503 389782 542834 742771 +-3 3 14 23 25 25 43 111 257 471 648 503 -547 -3539 -10163 -23009 -45867 -84085 -144990 -238377 -377071 +24 32 45 77 159 360 827 1863 4068 8584 17521 34717 67143 127585 239871 449153 842175 1587195 3012500 5760444 11088242 +-1 -10 -11 17 100 263 524 900 1447 2377 4337 9008 20296 46552 104484 225721 467367 928352 1773957 3271571 5841540 +7 9 21 54 125 261 505 927 1647 2882 5033 8829 15541 27268 47277 80348 133031 213663 331917 497560 717981 +10 25 59 126 244 435 733 1209 2021 3494 6227 11208 19891 34148 55951 86561 124900 164655 189507 165690 30862 +17 39 65 91 129 232 527 1254 2820 5913 11798 23063 45363 91274 188528 397238 845276 1799567 3807034 7968541 16464470 +10 5 8 41 136 332 666 1164 1850 2805 4324 7237 13480 27024 55294 111236 216218 403981 725888 1257753 2108568 +23 28 45 103 240 500 936 1633 2784 4889 9214 18760 40184 87465 188797 399575 827065 1677498 3345611 6582649 12805268 +16 36 75 162 343 693 1348 2572 4878 9227 17344 32245 59237 108076 197887 368248 703127 1380167 2768016 5612597 11386394 +9 25 48 72 98 137 208 331 515 741 940 966 564 -667 -3316 -8207 -16451 -29503 -49224 -77948 -118554 +8 11 19 51 147 387 916 1974 3939 7405 13332 23309 39939 67244 110732 176273 266070 368619 437421 350083 -164985 +1 18 58 126 237 431 788 1443 2601 4552 7686 12508 19653 29901 44192 63641 89553 123438 167026 222282 291421 +6 14 44 113 249 499 946 1753 3263 6207 12115 24099 48316 96714 192312 379634 745628 1461428 2864106 5612169 10971811 +3 -1 -4 15 107 376 1022 2428 5329 11117 22350 43537 82253 150582 266772 456790 755159 1204011 1848664 2727187 3850311 +-2 11 36 86 184 371 731 1440 2846 5587 10754 20106 36344 63451 107105 175172 278286 430523 650176 960638 1391400 +2 12 49 136 307 612 1119 1915 3118 4931 7803 12816 22494 42330 83446 166930 330518 638386 1194857 2162772 3787073 +14 23 56 129 259 471 826 1484 2816 5579 11168 21959 41757 76363 134274 227530 372722 592175 915320 1380269 2035607 +-3 10 37 93 208 427 810 1432 2383 3768 5707 8335 11802 16273 21928 28962 37585 48022 60513 75313 92692 +14 26 51 89 140 204 281 371 474 590 719 861 1016 1184 1365 1559 1766 1986 2219 2465 2724 +13 18 22 22 18 15 24 62 151 316 582 970 1492 2145 2904 3714 4481 5062 5254 4782 3286 +2 9 33 96 243 556 1172 2313 4353 7978 14545 26820 50378 96085 184258 351319 660028 1214703 2183217 3828008 6548853 +16 14 18 44 112 244 468 833 1440 2494 4382 7782 13808 24196 41536 69555 113456 180318 279562 423488 627888 +26 51 102 207 421 842 1643 3133 5872 10895 20161 37455 70161 132626 252290 480413 910142 1705891 3149624 5711711 10156653 +-8 -9 -5 6 26 57 101 160 236 331 447 586 750 941 1161 1412 1696 2015 2371 2766 3202 +6 11 36 109 272 579 1093 1890 3099 5048 8652 16275 33429 71844 154659 324750 657532 1279953 2397844 4334305 7582398 +12 13 19 49 142 372 874 1886 3822 7408 13943 25807 47456 87359 161694 301190 563352 1053519 1959875 3609765 6557578 +3 11 30 60 101 153 216 290 375 471 578 696 825 965 1116 1278 1451 1635 1830 2036 2253 +2 5 14 38 86 167 290 464 698 1001 1382 1850 2414 3083 3866 4772 5810 6989 8318 9806 11462 +12 14 25 57 123 242 448 813 1520 3071 6796 15951 37865 87827 195703 416649 847748 1652956 3099403 5608869 9829151 +11 19 46 109 234 461 861 1576 2893 5363 9976 18403 33316 58797 100847 168006 272095 429091 660146 992761 1462126 +12 23 46 76 103 123 168 360 988 2610 6216 13584 28159 57134 115970 237426 488356 999153 2012874 3963868 7599263 +10 27 58 116 238 503 1059 2170 4308 8331 15813 29644 55142 102218 189816 355285 674142 1300799 2549636 5050248 10033414 +-1 -4 -11 -23 -41 -66 -99 -141 -193 -256 -331 -419 -521 -638 -771 -921 -1089 -1276 -1483 -1711 -1961 +25 51 96 173 317 600 1159 2245 4300 8080 14874 26942 48463 87669 161677 307220 603675 1220565 2511928 5198007 10707121 +6 28 60 95 122 126 88 -15 -210 -528 -1004 -1677 -2590 -3790 -5328 -7259 -9642 -12540 -16020 -20153 -25014 +14 27 46 83 176 401 886 1840 3627 6937 13133 24885 47239 89311 166843 305910 548124 957743 1631160 2709319 4393682 +16 28 49 81 128 208 369 702 1349 2526 4627 8552 16517 33764 71801 154073 325302 666144 1315301 2501803 4590846 +28 43 66 110 191 336 602 1103 2052 3863 7434 14852 30927 66172 142094 299937 614308 1213403 2307810 4230074 7487335 +17 21 36 76 171 394 901 1991 4208 8544 16875 32885 63920 124479 242406 469310 897323 1685023 3096214 5556282 9732049 +20 27 37 61 114 218 416 815 1700 3806 8912 21041 48724 109025 234339 483377 958252 1830189 3377111 6037213 10483638 +0 13 36 73 134 248 489 1018 2144 4402 8643 16149 28862 50022 85992 151103 279532 552483 1156778 2504561 5466066 +7 5 0 -5 0 33 133 396 1045 2545 5774 12261 24502 46365 83595 144430 240339 386893 604780 920975 1370076 +13 9 9 34 128 365 862 1820 3630 7095 13832 26934 52012 98876 184552 339505 621668 1148550 2168444 4210603 8385165 +-5 -12 -23 -30 -18 35 158 387 765 1342 2175 3328 4872 6885 9452 12665 16623 21432 27205 34062 42130 +5 9 17 39 105 283 715 1694 3815 8241 17147 34472 67267 128237 240613 447347 827905 1527761 2808205 5127421 9268133 +25 37 57 106 230 518 1137 2397 4859 9508 18054 33532 61594 113281 210702 398013 761477 1464303 2804527 5307542 9869150 +11 17 46 114 241 455 798 1334 2159 3413 5294 8074 12117 17899 26030 37278 52595 73145 100334 135842 181657 +4 -1 -4 12 78 257 677 1583 3423 7014 13911 27274 53877 108552 223482 466589 976170 2023577 4123518 8225636 16048444 +0 1 0 -3 -8 -15 -24 -35 -48 -63 -80 -99 -120 -143 -168 -195 -224 -255 -288 -323 -360 +11 18 29 49 92 206 522 1339 3257 7370 15531 30701 57394 102230 174608 287511 458455 710594 1073993 1587081 2298296 +13 15 9 -12 -48 -79 -45 193 934 2793 6973 15712 33032 66133 128347 245886 473338 927958 1861532 3802331 7819427 +2 6 10 14 18 22 26 30 34 38 42 46 50 54 58 62 66 70 74 78 82 +11 27 52 97 186 362 709 1407 2852 5898 12324 25725 53226 108808 219736 438752 866576 1692276 3264166 6213201 11668991 +4 13 42 103 207 362 569 822 1123 1528 2245 3810 7372 15123 30914 61103 115686 209767 365428 614065 999261 +15 21 37 86 203 434 831 1439 2272 3276 4278 4921 4586 2303 -3346 -14328 -33259 -63497 -109221 -175488 -268259 +11 16 28 64 160 393 913 1979 3985 7464 13083 21703 34688 54819 88416 149606 268111 502480 961366 1836266 3450112 +19 28 52 114 257 565 1198 2452 4861 9361 17538 31985 56799 98260 165752 273013 439839 694418 1076536 1641980 2468565 +15 15 13 12 12 1 -45 -137 -191 184 2178 8829 27103 71775 172317 384631 810367 1627833 3140255 5849526 10566770 +12 11 5 -6 -22 -43 -69 -100 -136 -177 -223 -274 -330 -391 -457 -528 -604 -685 -771 -862 -958 +14 26 38 50 62 74 86 98 110 122 134 146 158 170 182 194 206 218 230 242 254 +13 19 31 63 138 294 607 1239 2530 5172 10540 21334 42843 85426 169298 333601 653532 1273267 2471552 4797589 9360217 +11 3 -4 4 47 149 343 691 1325 2507 4689 8539 14934 25131 41979 74636 152691 362315 929342 2395398 5968245 +18 22 40 91 193 361 613 998 1668 3038 6128 13283 29669 66335 146381 317205 674569 1409654 2901085 5895585 11864268 +11 37 82 161 309 586 1087 1974 3560 6490 12081 22905 43732 83003 155088 283716 507161 886051 1515060 2540273 4184711 +25 39 52 67 92 144 269 587 1366 3134 6880 14520 30088 62684 133303 289715 637379 1401437 3047748 6514061 13642856 +4 -4 -20 -50 -102 -185 -302 -435 -512 -331 602 3393 10381 26381 61265 135375 290656 612718 1272684 2603156 5230544 +16 37 62 103 197 413 863 1725 3295 6108 11215 20791 39404 76543 151493 302640 605473 1208410 2406047 4790866 9565986 +18 28 36 48 72 117 192 305 462 666 916 1206 1524 1851 2160 2415 2570 2568 2340 1804 864 +6 31 75 155 307 590 1091 1932 3290 5463 9049 15351 27179 50290 95789 183908 349686 651191 1181055 2082235 3569067 +13 24 44 80 152 311 679 1524 3380 7215 14639 28129 51229 88660 146248 230547 347999 503434 697670 923926 1162710 +10 22 32 51 114 303 788 1898 4249 8981 18195 35742 68605 129235 239371 436181 782284 1383028 2418714 4208909 7345156 +7 30 81 174 320 532 841 1335 2242 4084 7930 15770 31017 59118 108216 189751 318817 514002 796327 1186766 1701670 +14 27 59 134 293 607 1198 2270 4163 7468 13293 23865 43815 82762 160259 314926 620952 1217673 2362755 4528740 8580085 +8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 +8 0 -4 18 98 273 583 1076 1829 3005 4987 8667 16029 31260 62764 126655 252582 493110 938366 1738280 3135532 +-3 4 19 42 73 112 159 214 277 348 427 514 609 712 823 942 1069 1204 1347 1498 1657 +14 24 32 37 53 130 397 1139 2922 6787 14546 29230 55761 101947 179931 308262 514798 840698 1345812 2115835 3271653 +7 23 56 112 206 369 661 1190 2131 3727 6237 9780 14024 17718 18228 11631 -5265 -28077 -27602 87844 547546 +23 36 62 118 231 444 832 1544 2899 5581 11011 22063 44521 90194 183657 376560 777027 1608138 3321360 6812948 13832967 +8 0 -5 4 43 136 319 644 1176 1961 2930 3727 3573 1607 -1170 4025 48104 214582 698717 1914790 4680631 +6 17 37 64 93 116 122 97 24 -117 -349 -698 -1193 -1866 -2752 -3889 -5318 -7083 -9231 -11812 -14879 +-2 -7 -2 33 136 369 821 1608 2870 4765 7460 11119 15888 21877 29139 37646 47262 57713 68554 79133 88552 +18 20 30 66 151 310 570 972 1603 2653 4499 7817 13726 23977 41217 69385 114336 184842 294188 462668 721393 +3 0 -3 -6 -9 -12 -15 -18 -21 -24 -27 -30 -33 -36 -39 -42 -45 -48 -51 -54 -57 +16 28 38 46 52 56 58 58 56 52 46 38 28 16 2 -14 -32 -52 -74 -98 -124 diff --git a/day9/main.zig b/day9/main.zig new file mode 100644 index 0000000..9459eb0 --- /dev/null +++ b/day9/main.zig @@ -0,0 +1,78 @@ +const std = @import("std"); + +pub fn main() !void { + const content = @embedFile("data.txt"); + var lines = std.mem.split(u8, content, "\n"); + + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + + var list = std.ArrayList(std.ArrayList(i32)).init(allocator); + defer list.deinit(); + + while (lines.next()) |line| { + if (line.len == 0) { + break; + } + var history = std.ArrayList(i32).init(allocator); + var nums = std.mem.split(u8, line, " "); + while (nums.next()) |num| { + const parsed = try std.fmt.parseInt(i32, num, 10); + try history.append(parsed); + } + + try list.append(history); + } + + var part1: i32 = 0; + var part2: i32 = 0; + + for (list.items) |history| { + var derived = std.ArrayList(std.ArrayList(i32)).init(allocator); + try derived.append(history); + + var cur = history; + while (true) { + var d = try derive(cur, allocator); + try derived.append(d); + cur = d; + + var allZero = true; + for (d.items) |item| { + if (item != 0) { + allZero = false; + } + } + if (allZero) { + break; + } + } + + var newItem: i32 = 0; + var newItem2: i32 = 0; + for (derived.items, 0..) |_, j| { + // part 1 + const idx = derived.items.len - j - 1; + const lastItem = derived.items[idx].getLast(); + newItem = lastItem + newItem; + + // part 2 + const firstItem = derived.items[idx].items[0]; + newItem2 = firstItem - newItem2; + } + + part1 += newItem; + part2 += newItem2; + } + + std.debug.print("Part 1: {d}\n", .{part1}); + std.debug.print("Part 2: {d}\n", .{part2}); +} + +fn derive(history: std.ArrayList(i32), allocator: std.mem.Allocator) !std.ArrayList(i32) { + var list = std.ArrayList(i32).init(allocator); + for (0..history.items.len - 1) |idx| { + try list.append(history.items[idx + 1] - history.items[idx]); + } + return list; +} diff --git a/day9/test.txt b/day9/test.txt new file mode 100644 index 0000000..539a763 --- /dev/null +++ b/day9/test.txt @@ -0,0 +1,3 @@ +0 3 6 9 12 15 +1 3 6 10 15 21 +10 13 16 21 30 45 From 5ce53b92b8b3313329639a85ca84630012d4d995 Mon Sep 17 00:00:00 2001 From: Dustin Swan Date: Mon, 11 Dec 2023 16:41:39 -0700 Subject: [PATCH 02/10] Not done with day 10 yet. Cannot figure out part 2. Crap --- day10/data.txt | 140 +++++++++++++++++++++++++++++++++ day10/main.zig | 210 +++++++++++++++++++++++++++++++++++++++++++++++++ day10/test.txt | 10 +++ 3 files changed, 360 insertions(+) create mode 100644 day10/data.txt create mode 100644 day10/main.zig create mode 100644 day10/test.txt diff --git a/day10/data.txt b/day10/data.txt new file mode 100644 index 0000000..b9b0758 --- /dev/null +++ b/day10/data.txt @@ -0,0 +1,140 @@ +FL7L-F7FJF-7FFF7FF|-F-F|JF--|.|-J-7.F--FJF|-7.F.-FF7.-F7-L-|FF-F-|-7.-F7-FF-|7J-J.F-J7.FF7..L7F|7F-7JF-L7F.|--FL7F---|.FFF-L7FL--L777L-.FF7F +7FFJ.FLJF-.FJ||F-FJJJJ||F|-F7FLJ.7-F7J||-FFF7.L7-FJL7.F|||-J7JJ.LL77F|LF7LJJ||L7--|-7F-F|F-7JLJ.LJL--F-|LLJ|7J|L|-|7|FF|7|J.LJFFJ7.|-J.F.|L| +L-77.L77JF-JF7.||||.F7FFF7-|-7L.L--|.FF.|F-JL77.|L-7|F7|-|7F|-.-7L-F7--JJ|.||L7L-.|JF|.|JL-77F-|J-L|JL--FLJLJ7JF|7||7.FJL|7--L|---7|.|FF-J-| +LF7--FFJFLJLFL|J|.77---J-F-|F7-7.|7.L|J--L--7L7F7F7|LJL7-77-L.--J7LL-7.|LF-J--.F-J7-F--L7|-F7LFJ--77-7.77LJJ.7FL.J-JFJJ|F|J|LF|7||F|7FFJL|LJ +L|J7.-JJ-.|F|FJJJL||FL77LJ.|FJ7|FL7F.L7JJFLFJFJ|LJLJF--J-F7...FF||.FJL.-7L|.FL7JJLL-JJ.|||F||.L7|JFJ.|FJ7|--7JJ-|7LLF-FJ-F.--FJF|-LJFLJ-J.FJ +FJF-L-|.LF-F||J-7.-7|FF7-77J-7|LLJ|JJLJ--7-L7|JL-7F-JF-7.||7F-JJF7.J7.||L.--JJ.---77L7--777||7FLJFJJ-|7||F-L|-J7LJ-FJL|J.|.F77.L|F|JFJ|7.FF7 +|-FJ.-F7.F..L|LF|7---LL77|L7FJJ.L.|LF-JFF|-FJ|F--JL-7|FJFJ|-7JLL||F7FL.JLLJ..F.L--LF7L.LF-7|L77J.FL7.FFLF--FF.L|7|.J|FJFL|-|7-7|F|7-J..777|F +F77.F|L77LFF-|LJ-L7|-LJ|F|.--7|.L--F-|7-L7.L7|L--7F-J|L-JFJFJJ-|JFF-7---FJ..-77||7.F7||-L7LJFJ77F7JLFF7L|7|||L7||7-J-|7-.|.L|.LJ.|LJJ.FLL-L7 +|.|--F-J-7L7-FF|---7-|.J7JF.LFL-J.||LF-J.F--J|LF-JL7FJF7FJ77|F7--FL7|-L7-77F7F---7-||F7F7L-7|JLF77-L|||F-7-|JLJJLL7FF...JL-J.77|FJ.|.77|L-|J +-F7FLJ|LF7.|.L-LJ.LJ..F|..F.L-|.F-J77|F-7L--7L7L--7LJFJ|L7F777J|.F-JL7LJ---L7L--7|FJ||||L7FJL7.|L7-F7|||FJ7L|J.L|LJ7JF77L.|FLJ7-7FF7|77|.F-7 +J.-77LF7||F77FJ-7.|L7F-7-.F7.|F7JJ-F7J7LF7F7L7L7F7|F7L7L-J||F7-JFL7F7|--7L|LF---J||FJ||L7|L7FJF|FJF|LJLJL-7L7|F7|FLL7LLJ77LJ7|.FJ-J||L7J.JF- +|.LL-.LLL-|L-7|---L-7.LL.FL7.FJ||.F-7|F7||||JL7|||||L-JFF-J|||.F7FJ|LJ7F7-JLL7F-7|||FJL7|L7|L--JL-7L-7F---JF|7LF-LJFL-J-LLJF---FJ.F|LJJ.JJLJ +L||L|7.L7LL77LJ.F|J7|7||7|7J|.|--FL7L-JLJ|||F7|||LJ|F7F7L7FJ||FJ|L7L7F7|L7J-FLJFJLJLJF-J|FJ|F--7F-JF-JL--7L--L7JFJ.L|L|FL7.JJ-||J-7-|JFJ.FF| +|JF7LL-.|7-|77.-F|LF--FJ-JF7F77FFLJL----7LJLJLJ|L7FJ||||FJL7|LJFJ-|FJ|||FJ|--LFJF---7|F7|L7|L7-LJF7|F--7FJ.JJ7F7|.J-J7-7-F-|..FJF-.J.LJJ-F7. +F7.|-|.FF7L|.L7||..|.|.JFF|LJ|F7J-F-7F7JL-----7L-JL-J||||F-JL-7L7FJ|FJ|||F77.LL-JF--JLJLJFJL7L-7-||LJF7||F7|.F||77|.|L7L-L.F-F-LLJ7.FF-|.L-- +L7FF-FF-LJ.7-FJJ|JFL-L7FJLL-7|||F7L7LJL-7F77F7L--7F--J||||F7F7L7||FJ|FJ|||||F7F77L---7F--JF7|F-JFJ|F7|||LJL77F||F7J--.|F|LF|.L-.|FF--J7LF-|| +.J-J.|JLF|F|7F|.JLJ|.F-7|FF-J||LJ|JL-7F7LJ|FJ|F--JL7|FJ||||||L7|LJ|FJ|FJ||L7|LJL-7F7FJL7JFJLJL-7|FJ|||||F--JF7||||JFL-J-J.-7-|F-|-|7L-F.J--J +FJL-7|FF-FFL--7-LFJ7-J.---|F7LJF-JF-7LJL-7|L7LJF7F7L7L7|||||L7|L7FJL7||FJ|FJL---7LJ|L-7L7L---7FJ||FJ||||L-7FJ||||L7F7LF|.|-LL|-||-LFF-JF.F|7 +|7LF77-J-L-.|L||.L7|-|F|-LLJL-7L77L7|F-7L|||L-7|||L7L-J||||L-JL-JL-7|||L7|L-7LF7L-7L--JFJF7|FJL7|||FJ|||F-JL7||||FJ|L--777J.F---J7L|J7-7-FJ7 +LFFL|J|..F.FJ|F-7.LJFF|7.LF7F7|FJF7|||FJFJL--7LJLJ.|F--J|||F--7F7F7||LJFJ|F-JFJ|F7|F--7L7|L-JF-J|||L7||||.F7|||LJL-JF--J7.|FJ.FL7L-7-77||J.J +|F7-JFJ-FLFJ.FJL-7J--LJ|FF|LJLJL7|LJ||L7L---7|.F7-FJL7F7|||L7FJ|LJLJL-7|-||F7L7|||LJF7L7|L--7|F7||L7||||L7|||||F---7|F7F-777.77L|J7L-J-FF--J +LJ|7.FJ.|.F7F|.77|J.F|J|--|F---7LJF-J|FJ7F7FJ|FJ|FJF7LJ||||FJL7|F7|F7FJL7|LJ|FJ||L--JL-JL7F7|||||L-JLJLJFJ||||||LF7LJ|LJFJL7-7JL|LFJF|LFJ7|7 +F-|JF|JFLJJ-77.L|J|F|-F7FFLJF7LL-7L7J|L7FJ|L7|L7|L-J|F7||LJL77LJ||FJ|L7FJ|F-JL7|L-------7LJLJLJLJF------JF|LJLJL-J|F7|F7L-7JF|7.7JF-FJ||F-JL +F-J7L.F|J7.|L-7F-J-7JFJ|F7F-J|F-7L7L7|FJL7L-JL7||F--J|LJL7F7L-7F|||FJFJL7|L7F7||F-7F-7F7L---7F---JF7F-7F-7|F--7F--J||||L--J|FJF-7-J-|JLJJ-7J +L7L-7.J7--.|--77F7FL-L7|||L-7LJFJ|L7LJ|JJL---7|||L--7L7F7||L--JFJ|||JL-7LJFJ|LJ|L7|L7|||F-7-|L---7||L7||FJ||F7LJFF7||||F--7FJ-|FJ|J.|.L|J.|7 +L-JF--FFJ.F|7FLLJJ|JLF|LJ|F7L-7|F-7L-7L7F7F7FJ||L7-FJFJ|LJL--7F|FJ|L7|FJF-J.L-7L7|L-JLJ||FJFJF---J||FJLJL7|LJL7F7|||||||F-J--||L-7LL77.F--FJ +-JJ|J.|J7-F-JJL||-JF-7L7FJ|L7FJ||FJF7|FJ||||L7LJFJFJFJFJF---7|FJL7|FJFJFJF7FF7L7|L--7F7LJL7L7L-7F-J|L7F7FJ|F--J|||||LJLJ|F7J.FJF-JF||7LL-LJ| +....-.|F|.LJ.FFFF7.|--FJL7|FJL7LJL7||||FJ|||7L-7L7L7|F|FJF-7LJL-7|||FJFJFJL7||FJ|F-7LJL--7|FJF-JL-7L7LJ||FJL-7FJ||||F7F-J||.FJFJJ-7L-J||.|L- +-F77LFJFJ-7|F|LFJ|-F7.L-7|||F7L--7LJ|||L7LJL7F7L7L7|L7|L7L7L77F7||||L7L7L7FJ|||FJ|FJF7F7FJLJFJ7F7|L7|F7||L7F-J|FJ|LJ|LJF7|L7|FJ7FF77J|FFF.|. +|LL-F|.FJ-7L|J-L7|J||F--J||||L7F7L-7||||L-7FJ|L-JFJ|FJ|FJ.|FJFJ||LJL-JFJFJL-J||L7|L7|LJ|L-7FJ.FJL7FJ||||L7||F-JL-JF7L7-|||FJ||L|||L7LJ-7J77- +JJL7FL.L..|.7FF7||FJ|L7F7|||L7||L7FJ||L7F-JL7L--7|FJL-JL-7||FJFJL-7F--JFL-7F-J|FJL7|L-7L7-|L-7L-7|L7||||FJ|||F--7FJL-JFJ|||FJL--7JJLFL-JL-.. +..FLJL|L|J|-JFJLJ|L7|JLJ|||||||L7|L7|L7|L--7L-7FJ||F7F---J|||FJF77|L7F7F7FJL7-|L7FJ|F7L7L-JF-JF-JL7||||||FJLJL-7LJF7F7L7||LJF---JF-JL||.F|L. +F-L|7.-7|LJLFL--7L-JL7F7|LJ|FJ|FJ|FJL7||-F-JF-JL7|||LJF7F-J||L7||FJFJ||||L-7L7|FJ|FJ||FL--7|F7|F7FJ||||||L7F---JF-JLJL7|||F-J7LJJL77FLF.LLL| +.|-|-7L--L.FFF--JF--7|||L-7|L7|L7|L-7LJL7L-7L7F7|LJ|F7||L-7||FJ|||FJL||||F-JFJ|L7|L7||F7F7|LJ|||||FJ||||L-JL--7|L7F---J|LJL--7-JL|-FF..7L|L| +-LFJ.7|L-..FFL---JF-J|||F-JL7|L7||F7L7F-JF7|FJ||L7FJ||||F7||||-||||F7||||L7FJJL7||FJ||||||L7FJLJ||L7||||F-----JF7||F7F-JF7F-7|77FFF-77-L-7-7 +L||LJJ7.L-7JJF----JF7LJ||F7FJL7||LJL-JL7FJ||L7|L7||FJLJ||||||L7|||||LJ||L7|L7F7||||FJ|||||FJL-7FJL7|||LJL-----7|||||||F-JLJ.LJF7F7|FJ7JFL|F| +.LJ|7|F-JJ||-L-----JL7FJLJ|||FJ|L----7-||FJL7|L7|||L-7FJ|LJ|L7|||||L7||L7|L7||LJ||||F||LJ||F7FJ|F7||||F------7||||||LJL-7F7F77|||||L77||FFLJ +F7-|J-7|J.F7.L-F-----J|F7FJL-JFJ|F7F7L7|||F7||FJLJL7FJL7|F7|FJ|||||FJFJFJ|FJ||-FJ|||FJL-7|LJ||FJ|LJ||||F---7LLJ|||||F---J||||FJLJ|L7|F7|LFJ. +FJF|JJLL--JF7LFJF7F7F7LJLJF7F7L--JLJL7|||LJLJLJF---JL7J|LJ|LJFJ|||LJFJFJFJL7|L7|FJ||L7F7||F7||L7|F7|LJLJF--JF-7|LJLJL-7F7|||||F--JFJLJ|-JL7F +.F-J|F.L-LFJL7L-JLJLJL---7|||L7F-7F-7LJ|L-----7L7F7F7|FJF7L-7L-J|L-7L7|FJF7||FJ||FJ|FJ|||||LJ|FJLJLJFF-7L7F7L7LJF-7F--J|LJLJLJL7F7|F--JF7-F7 +F|LFF.7.7|L-7|LF--7F7F7F-J|LJFJ|FJ|FJF7L----7FJFJ|LJ||L7||F-JF--JF7L7|||FJ|||L7LJ|FJL-J|||L7FJ|F----7L7|FLJL7|F-J|LJF7FL7F-----J|LJL7F77F7-- +-J-JJ7|7LJJL|L7L-7LJLJLJF7L7FJFJL-JL-JL----7LJJ|FJF-J|-|||L-7L-7FJ|FJ||||FJ|L7|F-JL---7|||FJL7|L7F-7L-JL---7LJL-----JL7FJL------JF--J|L-J|7| +|J..LJF|FJLFJFJF7L---7F-J|FJL7|F-----7F-7F7L--7||FJF7|FJ||F-J7FJ|FJL7||LJ|FJFJ|L7F7F7FJLJ|L7FJL7||FJF7F--7.L---7F7F7F-J|F-----7F-JF7FJF--JF7 +|-FF.FLJJ|-L7L-JL-7F7LJF-J|F7LJ|F7F7.LJLLJ|F--J||L-JLJL7|LJ-F-JFJL7FJ|L-7LJFJFJJ||||LJF-7|FJL7FJLJL7|LJF-JF-7F7LJ||LJF7||-F--7LJF7||L7L--7|| +-7FJ-J.|L77.L----7||L--JF-J||F7LJLJL----7FJL--7|L7F--7F|L--7L-7|F-JL7|F7L7.L7L-7LJ|L-7L7LJL-7|L7F-7LJ7FJF7L7||L-7LJF-JLJL-JF7L7||||L-JF-7LJ| +FLJJL7--F--------J|L----JF-JLJ|-F-----7FJL7F7FJL-JL-7L-JF--JF-J||F7FJ||L-JF7|F-JF-JF-JFJF7F-J|FJL7L--7L-JL-JLJF-JF7L7F----7|L7L-JLJF7FJFJF-J +FL-...|.L7F7F7F7F7|F-----JF7F7L7L--7F7||F7LJ|L--7F--JF-7L-7FJF7|||||FJ|7F7|LJL77L-7L7FJFJ|L-7||F7|F-7|F7F-----JF-JL-JL---7LJFJF7F7FJLJFJFJ|| +|-FFF-7-LLJLJLJLJ||L------J||L7L7F7LJ||LJ|F7L7F7||F7FJFJF7|L7|||||||L7|FJLJF-7L--7|FJL7|JL7FJ||||LJFJ|||L------JF--7F7F-7L-7|FJLJ|L--7L7L7F| +J-|-J|.LJ7|LL|F--JL-------7LJ-L7LJL--JL--J|L7LJLJ||||FJFJ||FJ|||||||FJ|L7F7L7|F--J||F7||F-J|FJ|||F7L7|||FF--7F-7L-7LJLJLL7FJ||F--JF-7L7L-J-7 +|-J|FFL---J-F-JF---------7|F--7L7F-7F7|F--JFJF-7-LJLJ|FJLLJ|FJ||||LJL7|L||L7||L--7LJ|LJ|L7FJ|FJ|LJL-JLJL-JF7LJL|F7L-----7|L7||L7F7L7L7L-7JL- +.LJF7LL-J7||L-7|-F-------J|L-7|JLJFLJL-JF-7L-JFJF7F--JL---7||FJ||||F7||FJ|FJ|L7F-JF-JF7L7||FJ|.L7F7F------JL--7LJL---7F-J|FJLJ-LJ|FJ7L-7|7LL +|7JFL77.||-J.L||FJF------7|F-J|F-------7L7|F--JFJLJF-7F7F-JLJL7||L7||||L7||FJFJ|F-JF7||FJLJL-JF-J|LJF---7F-7F7L-7F--7LJF-JL7F7FF7|L--7.LJJ7| +|J-LL.7--||J-FLJL-JF----7||L-7|L----7F7|FJ|L7F7L7F7|7|||L--7F-J||FJ||LJFJ||L7L-JL--J|||L7F7F-7L-7|F-JF-7LJ.LJL-7LJF7|F7L-7FJ||FJLJF7FJF|LFL- +LFF7J-LJFJJ-F7F77F7L---7LJL--JL-7F7FJ||LJFL7LJL7LJ|L7||L7F-JL-7||L-JL7FJFJL7L7F-----J||FJ|LJFJF7LJL-7|FJF77F--7L7FJLJ|L-7LJFJ|L7F7|LJ7FJ.7J7 +||LJJ7J7||L-|LJL-J|F7F7L---7F7F7LJLJ||L--7-L7F-J.FJFJ|L7|L7JF7||L7F7FJ|FJ|FJFJ|F7F-7FJ|L7|F7L-JL7F--J|L-JL-JF-J||L---JF-JF7|FJ7LJ|L-7-|JF|FJ +F|-JFFFFJ7|.L----7||LJL--7LLJLJL-7F--JF--JF7LJF-7|FJFJFJ|FJFJLJ|F||LJFJ|F7L7L7||LJJLJ|L-JLJL-7F7LJF7FJ7F--7FJ.F7|F7F-7|JFJ|||F--7|F7L7--J.|J +LLJFJ--L-J-FJF7F-JLJF7F-7L7F-----J|F--JFF-JL--JFJLJJL-J.|L7L7F-JFJL-7L7LJ|F|FJ||.F7-F77F7F7F7LJ|F7|LJF7L-7|L--J|LJ||FJL7|FJ|LJF-J||L7|JJ|-J| +LL7LJ|L-7|||FJLJF---JLJ-L7LJF7F7F7|L---7|F--7F-JF-7F7F-7|FJ-LJF-JF7FJFJF7|FJ||||FJL-JL-JLJ|||F7LJLJF7|L--JL---7L-7|||F7LJL-JF7L-7LJL||-F|L-7 +FL7JL7---7F-JF--JF77F7F--JF7|LJLJLJF7F7LJL7LLJF7L7||||FJLJF7F7L-7|||FL7|LJL7L7||L7F7F7F7F7LJLJL7F--JLJF-----7|L--JLJLJL7F7F-JL--JJ|JLJ-FL-L7 +77LF-FF-L-L--JF--JL-JLJF7FJLJF7F7F-JLJL---JF7FJ|FJLJLJL-77|||L--J||L-7|L-7FJFJLJFJ|||LJ|||F-7F7LJF----JF7F-7L--------7F|||L------7JJFLF7|JLF +|L-77.J.L7JF-7L-----7F-JLJF7FJLJLJF--7F-7F7|||FJL--7F-7FJFJ|L--7FJ|F7|L--JL7|J|.|FJ||F-J||L7LJ|F7|F----JLJJL-----7F--JFJ||F-----7|.FFFFJ|J-F +LJL|77-FFF7L7|F7F7F7|L7F--JLJF--7FJF-J|FJ|LJLJ|LF-7|L7LJL|FJLF-J|FJ||L7J7F-J|F-7LJ-LJL--JL-JF7|||||F--7F--------7|L--7L7||L----7LJ.LL.JFJ-FJ +L|--.|F-FJL-JLJLJ|||L7|L-7F7FJF-JL7L--JL-JF7F7L7L7||FJF-7||.FJF7|L7|L-J|FL-7||FJF----7F-----J|LJLJLJF7||F-------JL-7FJJLJL7F7F-JL|-FFJ.|J.F7 +-|J-7|J-L-7F7F7F7LJL7LJF7LJLJ.L---JF-7F---JLJL7|FJLJL7L7||L7|FJ|L7||JFFF..FJLJ|JL---7|L-----7L-7F7F7||LJL---------7|L---7J|||L-7F7|FFJ7J.-FL +|L77L|.7FLLJ||||L7F-JF7|L---7FF7JF-JFLJF7F---7LJ|F--7|FJLJFJLJ.L7|||J|7LF-L7F7|J.LLFJ|F7F7F7L-7LJLJLJL----7F------J|F7F7L7|||F7LJ|7L-JL-7||| +JJ||.LF|7.F7LJLJFJL-7||L7F7FJFJL-JF7F7FJLJF--JF7|L-7LJ|F7FJF7F-7||LJ-JLF--LLJLJ77-FL7||LJ|||F7|F----7F---7|L------7LJLJ|FJ||LJ|F7|J7L7-L.FFL +LFJFF---F-J|J.F7L--7|||-LJ||FJF---JLJLJF-7|JF-JLJF-JF-J|LJFJLJFJ||J|L--7.|7|.FLJ--|F|LJF7LJLJ|LJF--7LJF--JL--7F7F7L--7LLJFJL7JLJLJ77LJ7L-F|. +L77LL7||L-7L7FJL---JLJL---JLJFJF--7F7F-JFJL-JF7F-JF7|F-JF7|F--JLLJF-77.L.7-.L7LLJ-F7L--JL-7F7|F7L-7L-7L-----7LJLJL7F7L--7L--JF777|.J77F-FFF7 +FJF7LL--L-L7LJF7F-----7F7F7F7|JL-7LJ|L-7|F7F7||L--JLJL7-|LJL---7LJ7L|77.F|JFLJ7-FFJ|F7-F--J||LJL-7L7FJ-F7F-7L-7F-7||L--7|F7F7|L--7JF7JL7FLJF +|-7J7FLF77LL7FJLJF----J|LJ||||F--JF7L--JLJ||||L7F--7F7L7|F----7L7FJJLL7-FF.7.|7FLL7LJL7L---JL---7L-JL-7|LJ-L-7LJFJ|L7F7LJ|||||F--J||JJJLFJ7| +7F|FLJ7FF7F-J||F-JF-7F7L7LLJLJL--7|L-----7|||L7|L-7LJL7LJL---7L7L77F77|7F-FJ7|F|.LL--7L-7|F-----JF7F-7LJF7LF7L--J-L-J||F7||||||J||-FJ7.F|-J. +--JFJFLF|LJF7|FJF7L7LJL-JF7F7F7F7||F--7F7|LJL-J|F-J-F-JF-7F-7L7L7|-L77|LF.|--JLJFJJF-JF7L7L---7F-J|L7L7FJL-JL7F---7F-JLJLJLJLJL7F7F77-|-|J.| +L|--.|.FJF-JLJL-JL-JJF7-FJLJLJLJ|LJL-7LJLJF7F-7|L--7|F7|-|L7L-JLLJ-JF--J|F-7JFLF7JFL--JL7L-7F7LJF7L-J-LJF----J|F-7|L7F---7F7F-7LJLJL7.LF7.F| +.7FJ.J.L-J|-F-----77FJL7L----7F7L-7F7L--7L|||FJL--7|||||FJFJJ.F77L|JJ.|FLJFLF7.JJF------JF7LJL-7||.F7FF7L-----JL7LJFJL--7LJLJ|L7F-7FJ7F7JFJ. +F-JFJJF|-L|.L--7F7|FJF7L-7|F-J||F7LJL--7L7|||L7F77LJ||||L-J.F-JL7L|-.7JLL-JJ.J7||L--7F7F7|L7F-7LJL-JL-JL-------7L--JF7F7|F7LF7|LJ7LJF-J|-|J7 +|7L|F|-|.LLFF-7LJ||L-J|F7L7|F7|LJL----7L-J||L7LJL--7||||F7F7L-7FJF7J-|7.L---..F7LJLFJ|LJ||FJ|FJF--7F----------7L--7FJLJ|||L7|L7F7F7FJF-J7LF| +7J-FJ7.J7LLFL7L--JL---J|L7LJ|||F------JJF-JL-JF7F--JLJLJ|LJL7-|||||F-|-F7F7-77FLJLLL7|F7||L7|L7|F-J|F--------7L7F7|L--7LJ|FJL7LJLJ||FJJFJ7|7 +L-F7JJ7.7-FFJL7F-7F7F7FJ|L7FJLJL-7F--7FFJF7F--J||F7F7-F7|F--JFJL-J|7J|F777JF-77JJFLLLJ||LJ-LJ7LJL--JL----7F-7L-J||L---JF7||F7|F---J|L77|J|L| +||||L-J|LF-|-LLJ7LJLJ|L--7LJF7F7FLJF7L7L7|LJF7.LJ|LJL-JLJL7F7|F7F7L-7-LF7FF7|F77FJ.||FJL-----7FF--7LF----J|FJF--J|F7F--JLJLJLJL----JFJFL.JJ| +J-|F-L-F7L-|FF7F7F---JF--JF7||||F7FJL7L-JL--JL--7|F7F----7|||||LJ|F-JFL|L7||FJL7LJFF7L-----7FJFJF7L7L-----JL-JF-7||LJF--7F7F7F--7F-7|F7--.F. +.LLJLLFJ-J-FFJLJLJF-7FJLF-J|||||||L-7L--7F7F7F-7LJ|LJF--7LJ|LJL-7LJF77JL7||||F-J7JFJL-7F---JL7L-JL7|FF7LF----7L7|LJF7L-7|||||L-7LJ7LJ-|7..F7 +|.|7F-JJ.J--L7F7F-JFJ|F-JF7LJLJLJ|F-JF7LLJLJ||JL--JF7L7FJF7|F---J.FJ|F77|LJ|||JF7JL--7|L7F7F7L----JL-JL7L---7L7||F7|L7FJLJ|||F7|F--77|L--7L. +L-JL|7777FF||LJLJF7L7||F7|L-----7|L--J|F---7|L-----JL-JL7|LJL-7F7FL7||L7|F7|||FJL7F--JL7LJLJL7F7F-7F7F7L----JJLJLJ|L7|L-7FJ||||||F-J7JF-F-77 +FJFLJL|7-L-F-----JL7LJLJ||F-----JL----J|F--JL--7F--7F7F7LJF-7FJ||F-J||FJLJ|||LJF7|L--7FJF---7LJLJFJ||||F-7F7.F---7|FJL--JL-JLJLJ||F7J.FL--77 +J7|7|JLJ7JLL------7L7F77LJL----7F------JL----7F||F7LJLJL7FJ|LJFJ|L-7|||F7FJ||F-JLJ7F7|L7L--7|-F--JFJLJLJFLJL7|F--J|L---7F7F7F7|FJLJL-7JJ-F|| +FF|-L.|7L7|L7|FF7L|FJ||F7F-7F-7||F---7F----7FJFJLJL----7|L-7F7|FJF7||||||L7||L7F7F7||L7L7F7|L-JF-7|F--7F7F7FJ||F7||F---J|||LJL-JF7F7FJJ.-F77 +F7F-L7L-7JF--LFJL-JL-J|||L7|L7|LJL--7|L---7|L7|F7F7F7F-JL--J|LJ|FJ||LJ|||FJ|L7||LJ||L7L7LJ|L--7|FJ|L-7||LJLJJ|||L7LJF-7FJLJF7F7FJ||LJJF|.L|7 +J7L77F|L|.JJF|L------7|||FJ|FJL-----JL---7|L-J||||||LJF7|F-7|F-JL7|L7FJ|LJFJ.|LJF-JL7|7L-7L7F7LJL-JF-JLJF7|F-JLJFJF7|FJL7F-JLJLJLLJJ..FJL.L7 +L|.LLJF-JF|7FF--7F7F7||||L7|L7F7F-------7|L--7||||LJF7|L7|FJ||F-7|L-JL7L-7|F7L-7|-F-J|F7FJFJ|L7F--7L--7FJL-JF7F7L7|LJL7FJL-----7|LF-7-|7|.7| +7||7LLLJ-FJF7L-7LJLJLJLJL-JL7LJLJF------JL---JLJLJF7|||FJ|||||L7|L---7L77|LJL7FJL-JF7||LJFJFL7||F-JF--J|F---J|||FJ|F--J|F--7F-7|F7|FJ7|FF|LJ +L-L7.|.7.FFJ|F7L-----7F--7F7L7LF7L---------7F-7-F7|||||L7|L7||FJ|F7F7L7L-JF--JL-7F-JLJL-7|F7FJ|||F7L---JL7FF7LJLJF|L---J|LFJL7LJ|LJL7FF7L7-7 +|.FF-7-FFFL7LJL----7LLJF-J|L7L-JL7F----7F--J|FJFJ||||||FJL7||||FJ||||JL--7L7F7F-JL7F7F7F|LJ|L7LJ|||F7F7F7L-JL-----JF7F-7L7L-7L--JF-7L-JL7J-J +77|L7L.||LFJF--7F-7L-7FJF7L7L7F7FJL---7|L---JL7L7|||||||F7|||||L7|||L-7F7|FJ||L7F7|||||FJF7L7|F7LJLJLJ|||F-7F7F7F-7||L7L7L-7L----JFJF--7|J-7 +--L-JF|LJ.L7|J7LJFJF7LJFJ|FJ-LJ|L-----JL------JFJ|||||||||||||L7LJ||F-J|||L7|L7LJ|||||||FJL-JLJL-----7|||L7|||||L7LJL-J7L--JF----7L7L7.LJJF7 +|-J-J-F-J7JLJFF7-L-J|F-JFLJF7F-JF7F--------7F-7L7||LJ||LJLJ|||7L-7|||F7|LJFJ|FJFFJLJ||LJ|F77F---7F7LFJLJ|FJLJ||L7L---------7|F---JJL-J77L7F7 +F7.FL7J.FF-LLFJ|F7F-JL7F---J|L--JLJF-----7FJ|FJFJ||F7||F---J|L-77||||||L-7S7||F7|F-7||F-J|L7L--7|||FJF-7LJF7-LJFJF7F7F--7F7LJL--7-FL-|.7F|JL +L|7F7|.F|LF7FL7|||L-7FJL-7F7L-7F--7L7F--7LJFJ|LL7|LJ|||L---7L-7|FJLJ|||F-JFJ|LJ|LJ-|LJ|F7L7|F-7||||L-J||F7||F7.L-JLJ|L-7|||F7F-7L7L|---L7|.| +F-J|J.FFF-J|F-J||L--JL--7LJL-7|L-7L-J|F-JF7L7L7FJL-7|LJF---JF7||L-7FJ||L-7|J|F7L7F7|F7LJL-J|L7||LJL--7FJ|LJLJL7F7F7JL--JLJLJ|L7L-JL--|.LF77. +-JJL.FLLL-7|L-7LJF---7F7|7F7FJ|F7L---JL--JL7|FJL7F-JL-7|FF7F|LJ|F7||FJL7FJL7LJL7|||LJL-7F--JFJ|L--7F-JL-JF-7F7LJ|||F-------7L7L--77.FF-F.L77 +FLFJ-J.LLFJL--JF7|F--J|||FJ|L7|||F---------J|L-7|L7-F7|L7|L7L7FJ|LJ|L-7|L7FJF-7|LJL7F--J|F7FJFJF--J|F7F--JJLJ|F-J|LJF---7F7L7|F7FJ-L-J|.F.L7 +|-7J.J...L-7F7FJ|||F7FJLJL7L-JLJ|L------7F7-|F-JL7L7|||FJ|FJFJL7L7FJ|FJL7|L7|FJL7F-JL-7FJ||L7||L--7|||L-----7LJF7|F-JF7-LJL-J|||||.L|FJ7L-7| +|FJ..|-7FLLLJLJ.LJLJLJF-7-L7F7F7L---7F--J||FJ|F7FJFJ|||L7||FJF-J7||F7L-7LJFJ||F7|L-7F7||FJL7||F7F-JLJ|7F7F-7L-7|||L--JL-----7LJ|L-7-LF-L..77 +F-JJ-|.FFF--7F-7JF---7L7|F7||LJL-7F7LJLF7|||FJ||L7L7|||FJ||L7|JF7||||F7|F-JJ||||L-7|||||L7FJ||||L--7FJFJ|L7|F7LJLJF-----7F--JF7L--J7.J-|7..| +7JJ-7J7FFJF7|L7|FJF-7L-JLJLJ|F--7LJ|F--J||LJL7||LL7|||||FJ|FJ|FJ||||||||L-7FJ|||F7|||||L7|L7|LJ|F7FJ|-L7L-JLJL---7L7F--7LJF7FJL-7JJL7.L7J7-L +LF-FF---JFJ|L7||L-J-L-----7FJ|F7L--J|F--JL7F-J||F7||||||L7|L7|L7||||||||F-JL7||||||||||FJ|FJ|F-J||L7|F7L--7-F--7LL-J|F-JJ-|||F--J7||77LJ||7| +7|FFL7F7FJ.L7LJL-7F7JF77F-J|JLJL7F-7||F7F7|L7FJ||||||LJ|FJL7|L7||||||||||F-7||||||||||||FJL7|L7FJ|FJ||L7F7L7|F-JF---JL-7FFJ|||F-7J-.FJ-LJ7-J +L-7--LJLJF--JF7F7LJL-JL-JF7|F---J|FJ|||||||FJL7LJ|||L-7||F7|L7||||||||||||FJ|||||||||||LJF-JL7||FJ|FJ|-||L7LJL--JF--7F7L7|FJ|LJFJ.L-J--F|L|. +.|||7.||-L---J||L7F7F-7F7|||L-7F7|L7|||||||L7FJF7||L7FJLJ|LJFJ||LJLJ||||||L7|LJ||||||||F7L---JLJL7|L7|FJL7L7F7F--JF7||L7LJL-JF-JJJF|JFF.J-FF +|J|-7F|FF--7F7||.LJLJFJ|||LJF-J|||FJ||||||L7|L7|LJL7||F--JF-JFJL7LF7LJ||||.|L-7||LJLJ|LJL--7F---7||F|||F7|FJ||L7|FJ|||FJF-7F7L--7JJLL|JL-F|J +|FJ||7LFJF7LJ|LJF7-F7L7|LJF-JF7|||L7|||LJL7|L7|L7F-JLJL-7FJJFJF7L7||F-J|||FJF-JLJLF7FJF-7F7LJF-7|||FJ|||||L7|L7L-JFJLJL7|F||L---JJ|..|-|FL77 +F--|L-JL-J|F7L--JL-JL-JL7FJF7|LJ|L7||LJF--JL7||FJL---7F7||F-JFJL7LJ|L7FJLJL7|.F77FJLJFJ-||L-7L7LJ||L7|||||L||FL---JJF77|L7|L7F7JF7J---7F7|L7 +FJJLJ.FF7|LJL------7F7F-J|FJ||F-JFJ||F-JF7F7|||L7F7F7||LJ||F7L-7|F7|FJ|F---JL7|L7|F7FJF-JL-7|FJF7LJFJ|LJLJFJL-------JL7L7|L7LJL-J||JL|-LJ-LF +-JFL.F7|L--7F------J||L-7LJ|LJL7FJ-LJ|F7|LJLJ|L7||||||L-7|||L7FJLJLJL-JL--7F7LJFJLJ|L7|F7F7||L-JL7.|FJF---JF7F----7F-7L7LJFJF7F--J77-|||7..| +|L|LFJ|L--7|L---7F-7||F7|F---7FJL7F7FJ||L7F--JFJLJ||||F-J||L7|L----7F-----J||F7|F--JFJLJ||LJL7F-7L7|L7|F7F7||L---7LJ7L7L-7L-J||F|.F77.-L-7F- +L7-FL7L---JL----J|FJ||||||F-7LJF-J|LJFJ|FJL-7FJF7LLJ|||F7|L7|L7F-7FJL--7F7FJ||||L7F7L7|FJL77FJL7L-JL-JLJLJLJL7F--JF7F7L-7L--7|L777JLF7FJLF|J +|.LJ.L----7F7F--7||FJ||||||FL-7L-7L7FJ|||F--JL-JL7F7||||||FJ|-|L7|L7F-7|||||||||FJ|L7L7|F7L7|F7L----7F7F7F---JL---JLJL7J|F7FJ|FJL-.FL.L7.|L7 +-JFL.|7FLFJ|LJF-J|||FJ||||L7-FJF-J.|L-7||L--7F7F7||LJ|||LJL7L7|FJ|FJL7LJ||L7LJ||L7L7L7|LJL-JLJ|F-7F7LJLJ||F--7F7F7F7F7L7||LJL||-F.F||-L-F|-. +JF-JFL-7-L7|F-JF-JLJL7||||FJFJFJF--JF7|||F--J|LJLJL7FJLJF--JFJLJJ||F-JF7|L7L7FJL7L-JJ|L-----7FJ|FJ||F7F7|||F-J|||||LJ|FJ|L--7LJJ|---F-J7-JFF +J7.L-7.-F-J||F7L--7F7||||LJLL7|FJF7FJ|||||F-7L--7F-JL7F-JF-7L---7LJL7FJ||LL-J|F7L-7F-JF---7FJL-JL7|LJLJ||LJ|F7||||L-7LJFJF7FJ-|7L-JJ..||.LFJ +F|-FJ---|F7|LJ|F--J|LJ|||JF--J||FJ||LLJ||LJ-|F7FJL7F7|L7FJFJF7F7|-F-J|FJL7F--J|L7FJL-7L-7|LJ|.F--JL--7FJ|F-J|||||L7FJF7L-JLJ.||F-JJ.-7L|7--7 +FL-F7FJFLJ||F-JL-7LL7FJLJ.L--7|||7|L-7FJ|F--J||L-7||||FJL7L7|LJLJFJF7|L7FJ|F-7L7||LF-JF7L---7FJF7F7F7|L7|L-7|||LJ-|L-JL----7-|L7-||FLJ7L|7|J +-.FL||-FJ||||F-7FJ.LLJJF|-J|LLJ||FJF7|L7||F7FJ|F-J||||L--J7|L---7L-JLJFJL7||F|FJ|L7L-7|L----JL7|LJ||LJJLJF-J||L--7L7F7F-7F-J7JF---JLJ-|7LF77 +L-7JLL.-JFLJ||||L7FLL|-J.|JLF--J|L7|LJFJ||||L7|L-7||||F----JF-7FJ|F---JF-J|L7||JL-JFFJL---7F-7|L-7|L---7FL7FJL7F-JL||||FJL7.F----J|F-7J--J|7 +|--.7JF77.LFJL7L-J7|F|||77|.L7F7|FJL-7L7|LJL7||F7|LJ|||F---7L7||F-JF7F7|F-JFJLJF----JF7F--J|FJL-7||F---JF-J|F-J|F-7||LJL7FJ.|LJJ|JFL-JJ77F-J +F7-7|-F7-|JL-7L7LF7-L|JJL||-LLJLJL7F7|LLJ|F-J|||LJJFJ|||F--JFJLJ|F7|LJ|||F7L--7L-7F7FJ|L---JL--7LJ||F7|FJF7||F7LJFJ||JJJ||-77J.-7F7L7.LFLJ7| +||FF|7L7-|-|-|FJ-LJ.FJJ.F7|7.|7L-|LJLJ7JF7L-7||L--7|FJLJL-7FJF7-|||L-7||||L7F-JLFJ||L7L7F7F7F-7|F-JLJL7|FJ||||L7FJ|LJ--FJL7|FJFLJF7-|7J.L7L| +L-J|..FJL7.J.LJ|-L7J77.F|J7F-77|.F7LJ|L-|L--J||F7FJ|L7F---JL-J|FJ||F7|LJ|L7|L-7F|FJL-JFJ||||L7||L7F7F7|||-||||FJL-7.LFLL7FJJ|-F.-FJ7FL.F7|.| +|J-F7-77-LJLJ|J7-7JL|FJ-||-7LLJ-JLJ|||.LL7F7FJLJ|L7L7|L-7F7F-7|L-J||LJF-JFJ|F7|FJL--7FL-J|||FJ|L7||||LJ|L7LJ||L7F-JFFJJJLJ.||LLJLL-J.LJJ-L-7 +|.7---L|-|F7J|-77|--.J|F77.|.L|..|-|-LJJ-LJ|L7|FJFJJLJF-J||L7LJ|7LLJ7FJF7L7LJLJL7F--JF---J||L7L-JLJ|L-7L7L7.LJ.|L7|F77|J|J7FL7L|7LF-L-|J.7-L +F77.|F7.FJ-J.JJLJ|JL|LLL-J.FF.|F-L7J7LJ77|-L-JFJFJJLF-JF7|L7L7L|J-|FFJFJ|FJ7F-7FJL7F-JF7F7|L7L---7FJF-JFJFJFJ-LL7|J77FJ.LJLJFL-FJ.F7.L7.FL-J +FLF-|JL7||FL-JL||F..JJFJ.L.|L.F|J-F-|7L-|F-JJLL-JJLFL7FJLJFJFJ.|--J-|FJFJ|F7L7LJF-J|F7|||LJ7|F7F-JL7L7FJFJ.|7.LLLJL--FJF||L77|.|FF--7.JF-|F| +L.|-77LFFF7JL7-LJ|--7F7-L77-.7.|..JJ.L7|.LJF7J|FJ|F|LLJ7L-L7||-|-JFFLJ-L7LJ|FJF7|-FJ||||L-7FJ|||-|FL-JL7|J7LLJ.F|.||J|FLJ-|LJ.FLFJ.|FFJL7J|| +.FL-J--||LF-|-F-|7|JF-JLLJJ7.LFFJ7J..FF--.FF7.L|LL||-LLJL7JLJ7FL-.FL..F-JF7|L7|LJJL7|LJL7FJ|FJ||FLLJ||-LJ.F-|L7J|F7L.LF|7-L|7FLL|J---L-L7F|J +FJJ7.|-F|7JF|LLF-L77..|7.FF7-.LF7JLFJ|L7J..FJ-J..|||77||.||L.LJJ.F|.F-L-7|LJFJ|J|7.||.F-JL7LJL|L7||F|7.L|-LF--F-7LJ.L.F.|.||-JLLJ.-.|7J|L7J7 +|JJF7.L|LJ.LL77|J-|J7-J|FFLJ7.JLJL7J|7LL7.F|7-L-L-LJL7-|7L7|.|7--JFF|.LLLJJLL-J.L|-LJFJF-7L7JFL7L7LJLF7FF-77LLJJLJ.7J-L-7.L7L|7L7FLFF77|F|JL +L7FJF-7F.LFJ|JL--7|-|FL-FJ7-|.L--L|--|7F-7|JL7-JJF|-FJ.LJ.-F7|--L7LJ|7-J7-F7-L-7LJ.|L|FJFJFJ.|.L-J.|7L7|||LJ-F77FJ-J-FLJ|F-7.|7-|JL-J.7-J..| +.JJJ|JFL7F|FJ7..LL|-|7FFL-J||JFL-J.F||.L.L-77|F---J|JFJ.L7LFJJ7LJLF7|7.LF-FJ7LF|7FJ7JLJLL7|JJ--JJ7.F|-|77F||JLL-|...FJ7F|7-|F|7L|.7|F-|J.FF7 +J-LF|.|7|7|L-F-77-L-.|LJL7LLF.|JJ.L--J7JJ|LJFLF777LL-J-F.|-7JFJ.|FJ|L-7F7||-|7|---J7.||J7LJ.FL.L7LL7|-|L7-J|..|7J7.7J7F.L|J|7LL-7-L-J-|7FFJJ +LF.FJF7-|-L--FL7L-7|-F.F-JL|.LF7F7L7-7JJFLLFFJ.LJ7-L|FF|F|.|7|.7J7...|LLL-F-7J.JFFF-7F.LFJJ-7.|7L7JLF7|F|J.|F7FJ...J||JJFF7LJF.FL7L-J.L-77|7 +F--JJL-7J|LJLJJLF-L7---J-|.J-.JLJJLL7JL7JJ.7.L|LLJ-.L-J-7J-L7LLJ---FJ-LJJ..JLL7.L-JLLLL-7-FJLF77L---7JJLJ.LFJL--F-F-JJ.LLJ|-F7-JJ.JJ.JJF7--7 diff --git a/day10/main.zig b/day10/main.zig new file mode 100644 index 0000000..4bbfb9e --- /dev/null +++ b/day10/main.zig @@ -0,0 +1,210 @@ +const std = @import("std"); + +const Coord = struct { row: usize, col: usize }; + +pub fn main() !void { + const grid = @embedFile("data.txt"); + const width = std.mem.indexOf(u8, grid, "\n").?; // can't do this at comptime. damn + const height = grid.len / width - 1; + const start = std.mem.indexOf(u8, grid, "S").?; + const startCoord = indexToCoord(start, width); + const allStartingNeighbors = neighbors(startCoord, width, height); + + // find the 2 path starting points + var paths: [2]Coord = undefined; + var pathIndex: u2 = 0; + + for (allStartingNeighbors, 0..) |neighbor, dir| { + if (neighbor) |c| { + const value = grid[coordToIndex(c, width)]; + var validPath = false; + if (dir == 0 and (value == '|' or value == 'F' or value == '7')) { + validPath = true; + } + if (dir == 1 and (value == '-' or value == 'J' or value == '7')) { + validPath = true; + } + if (dir == 2 and (value == '|' or value == 'J' or value == 'L')) { + validPath = true; + } + if (dir == 3 and (value == '-' or value == 'F' or value == 'L')) { + validPath = true; + } + if (validPath) { + paths[pathIndex] = c; + pathIndex += 1; + } + } + } + + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + + // capture the loop's coordinates in a map + var loop = std.ArrayList(Coord).init(allocator); + defer loop.deinit(); + try loop.append(startCoord); + try loop.append(paths[0]); + + // count the steps + var steps: u16 = 1; + var totalSteps: u16 = 0; + var prevs = [2]Coord{ startCoord, startCoord }; + + while (true) { + // for each of the 2 paths + for (0..2) |i| { + const temp = visit(paths[i], prevs[i], grid, width).?; + + if (i == 0) { + // try loop.put(temp, {}); + try loop.append(temp); + } + + prevs[i] = paths[i]; + paths[i] = temp; + } + + steps += 1; + + // if the two paths converge (and not at the starting point again) + if (paths[0].row == paths[1].row and paths[0].col == paths[1].col and (paths[0].row != startCoord.row or paths[0].col != startCoord.col)) { + totalSteps = steps; + } + + // for part 2, continue the first path until it gets back to the beginning + if (paths[0].row == startCoord.row and paths[0].col == startCoord.col) { + break; + } + } + + std.debug.print("Part 1: {d}\n", .{totalSteps}); + + // Part 2 + var visited = std.AutoHashMap(Coord, void).init(allocator); + defer visited.deinit(); + + var prev = startCoord; + for (loop.items) |c| { + // find the coord to the "right" + var coord: ?Coord = null; + if (prev.row < c.row) { + coord = Coord{ .row = c.row, .col = c.col - 1 }; + } else if (prev.row > c.row) { + coord = Coord{ .row = c.row, .col = c.col + 1 }; + } else if (prev.col < c.col) { + coord = Coord{ .row = c.row + 1, .col = c.col }; + } else { + coord = Coord{ .row = c.row - 1, .col = c.col }; + } + + try visitAllNeighbors(coord.?, &visited, &loop, grid, width, height); + prev = c; + } + + // looking at my printed grid, there are a bunch of stragglers. Donno how. Let's count them + // var stragglers = std.ArrayList(Coord).init(allocator); + // defer stragglers.deinit(); + // + // for (grid) |i| { + // const c = indexToCoord(i, width); + // const ns = neighbors(c, width, height); + // var allVisited = true; + // for (ns) |n| { + // if (n != null and visited.get(n.?) != null) { + // allVisited = false; + // } + // } + // if (allVisited) { + // try visited.put(c, {}); + // } + // } + + printGrid(grid, width, visited, &loop); + std.debug.print("Part 2: {any}\n", .{visited.count()}); +} + +fn printGrid(grid: []const u8, width: usize, visited: anytype, loop: anytype) void { + for (grid, 0..) |value, idx| { + const c = indexToCoord(idx, width); + if (contains(loop, c)) { + // std.debug.print("{c}", .{value}); + std.debug.print(" ", .{}); + } else if (visited.get(c) != null) { + std.debug.print("X", .{}); + } else if (value == '\n') { + std.debug.print("{c}", .{value}); + } else { + // std.debug.print("{c}", .{value}); + std.debug.print(".", .{}); + } + } +} + +fn visitAllNeighbors(c: Coord, visited: anytype, loop: anytype, grid: []const u8, width: usize, height: usize) !void { + // if it's been visited, get out + if (visited.get(c) != null) { + return; + } + + if (contains(loop, c)) { + return; + } + + try visited.put(c, {}); + + const ns = neighbors(c, width, height); + for (ns) |neighbor| { + if (neighbor) |n| { + try visitAllNeighbors(n, visited, loop, grid, width, height); + } + } +} + +fn contains(ar: *std.ArrayList(Coord), item: Coord) bool { + for (ar.items) |i| { + if (i.row == item.row and i.col == item.col) { + return true; + } + } + + return false; +} + +// pass it a coordinate and the previous coordinate, and it finds the next one +fn visit(c: Coord, prev: Coord, grid: []const u8, width: usize) ?Coord { + const value = grid[coordToIndex(c, width)]; + + return switch (value) { + '-' => Coord{ .row = c.row, .col = if (prev.col < c.col) c.col + 1 else c.col - 1 }, + '|' => Coord{ .row = if (prev.row < c.row) c.row + 1 else c.row - 1, .col = c.col }, + 'F' => if (prev.row > c.row) Coord{ .row = c.row, .col = c.col + 1 } else Coord{ .row = c.row + 1, .col = c.col }, + '7' => if (prev.row > c.row) Coord{ .row = c.row, .col = c.col - 1 } else Coord{ .row = c.row + 1, .col = c.col }, + 'J' => if (prev.row < c.row) Coord{ .row = c.row, .col = c.col - 1 } else Coord{ .row = c.row - 1, .col = c.col }, + 'L' => if (prev.row < c.row) Coord{ .row = c.row, .col = c.col + 1 } else Coord{ .row = c.row - 1, .col = c.col }, + else => null, + }; +} + +// returns all neighboring coordinates, or null if it would be off the grid +fn neighbors(c: Coord, width: usize, height: usize) [4]?Coord { + const up = if (c.row > 0) Coord{ .row = c.row - 1, .col = c.col } else null; + const right = if (c.col < width - 1) Coord{ .row = c.row, .col = c.col + 1 } else null; + const down = if (c.row < height - 1) Coord{ .row = c.row + 1, .col = c.col } else null; + const left = if (c.col > 0) Coord{ .row = c.row, .col = c.col - 1 } else null; + + return [_]?Coord{ + up, + right, + down, + left, + }; +} + +fn coordToIndex(c: Coord, width: usize) usize { + return c.row * (width + 1) + c.col; +} + +fn indexToCoord(index: usize, width: usize) Coord { + return Coord{ .row = index / (width + 1), .col = index % (width + 1) }; +} diff --git a/day10/test.txt b/day10/test.txt new file mode 100644 index 0000000..8f950ae --- /dev/null +++ b/day10/test.txt @@ -0,0 +1,10 @@ +FF7FSF7F7F7F7F7F---7 +L|LJ||||||||||||F--J +FL-7LJLJ||||||LJL-77 +F--JF--7||LJLJ7F7FJ- +L---JF-JLJ.||-FJLJJ7 +|F|F-JF---7F7-L7L|7| +|FFJF7L7F-JF7|JL---7 +7-L-JL7||F7|L7F-7F7| +L.L7LFJ|||||FJL7||LJ +L7JLJL-JLJLJL--JLJ.L From 17c5af6d8df1faf4084ca3233c486ebc886d4285 Mon Sep 17 00:00:00 2001 From: Dustin Swan Date: Mon, 11 Dec 2023 20:57:36 -0700 Subject: [PATCH 03/10] So much easier than day10. Man this year is crazy --- day11/data.txt | 140 +++++++++++++++++++++++++++++++++++++++++++ day11/main.zig | 158 +++++++++++++++++++++++++++++++++++++++++++++++++ day11/test.txt | 10 ++++ 3 files changed, 308 insertions(+) create mode 100644 day11/data.txt create mode 100644 day11/main.zig create mode 100644 day11/test.txt diff --git a/day11/data.txt b/day11/data.txt new file mode 100644 index 0000000..2d0f845 --- /dev/null +++ b/day11/data.txt @@ -0,0 +1,140 @@ +..............#..........................#.....................#.....#...................#..................................#............... +.............................#.........................................................................................#..........#......... +#......................#.................................................#.....................#...........#................................ +......#..............................#........................................#............................................................. +................................#...........#.........#.............................................................#.....#..........#...... +..................#...................................................#...................#................................................. +............................#............................................................................................................... +........#.....#...............................................................................#...............#............................. +#...................................#.....#.........................................#.....................................................#. +..........................................................................#........................#..............#........#........#....... +.....#.....#.............#.......................#.......................................................................................... +..............................#.............................#....................#......#................................................... +............................................................................................................................................ +.......................................#....................................#........................................#...................... +.......#................................................#..............#............................#....................................... +................#.................................................#.........................................#............................... +.....................#.........................#.....................................#...................................................... +...............................................................................................#..................................#......... +.#......................................................................................................................#................... +........#................................................................................................................................... +...............................#...........#.............#...............................#...........#...................................#.. +.............#.....#.............................................#.....#......................................#............................. +............................................................................................................................................ +.......................#...........#.................#..............................#....................................#.................. +...............................................................................#.....................................................#...... +..#......#.............................#............................#..................................#........................#........... +.............................#..........................#......#...........#................................................................ +....................#.........................#..................................................#.......................................... +......#............................................................................................................#........................ +...........................................................................................................#................#............... +#..............#...................#.............................................#........................................................#. +.........................................#.........................................................#........................................ +.....................#............................................#.....................#................................................... +.................................................#......#................................................................................... +.........................................................................................................#..............#.......#........... +...............................#..................................................................................#...................#..... +..........................#.........................#...........#..............#..........#..................#.............................. +..........................................#.............................#................................................................... +............#......#................................................................................#....................................... +................................................................................................................#.....#....................# +...#.........................#................#...............................................................................#............. +......................#..................................#.............................#...................#................................ +.......................................................................#.....#.................#............................................ +.......#..................#.........................#....................................................................................#.. +..........................................................................................#....................#............................ +........................................#........................#.....................................................#.................... +...................#.....................................................#.......#.............................................#............ +..............................#.................#........................................................................................... +..#..................................................#......#................#.............................................#.........#.....# +...........#..................................................................................#.....................#....................... +.....................................................................................................#...........................#.......... +................#......................#........................................................................#........................... +............................................................................................................................................ +.......#..............#............#............................#......#................#.....................................#............. +............................................#........#.........................................#............................................ +..............................#..............................................................................#.......................#...... +............................................................................................................................................ +....................#............................................................#..............................................#........... +......................................#..............................................................#...................................#.. +..........#.....................#.......................................#..............#.................................................... +............................................................................................................................................ +....#.....................#..................#......#.......#.................#...........................................#................. +....................................#.........................................................#....................#.............#.......... +....................................................................................................#....................................... +.................................................................#........................................#................................. +..................#...................................................................................................#..................... +.........................................................................#......................#........................................... +#......................................................#...........................#............................#.........#................. +...........................#............#..........................................................................................#........ +..................................................................#......................#.................................................. +................#................................#...........................#.............................................................. +........#.....................................................................................................................#............. +...................................#........................................................................................................ +.......................#.....#................................................................................#............................. +.#...........#...........................................#.................#....................#........................................... +..........................................................................................#............#................#................... +..........................#..........#...................................................................................................... +.....#...............................................................................#.....................#.....................#.......... +............................................................................................................................................ +..........#............#................................#.....................#..................................#.......................... +...............#...................#.........................#....................................#..................................#...... +............................................................................................................................................ +...........................................................................................................................................# +...#.....................................................................................................#.................................. +......................#.............................#..........................#..............................#............................. +..........................................#...................#..........#..........................#...............#....................... +..............................#.....................................................................................................#....... +.........................................................#................................#................................................. +...............................................#............................................................................................ +..........#...........................#..............#..........................#.........................#...................#............. +#.....................................................................................#..................................................... +.....#............................................................#..........................#.................#............................ +...........................#.......#..............#.................................................................#....................... +.......................................................................................................#.................................... +........#..........#.....................#..................#......................#......................................#...............#. +.............#.........................................................#.................................................................... +................................................................#........................................................................... +.....#.................#.................................................................#......................#.....#..........#.......... +................................#......#.............#.........................................#.....#...................................... +...........................................................................#.........................................................#...... +..........#................#................................................................................................................ +.................................................#..............................#..........................................#................ +.....................................................................................#.................#.........#.......................... +.......................................................................#....................................#............................#.. +...............#......#....................................#................................................................................ +.........#...............................#..........#..........................................................................#............ +...............................................................#.................#.........#.....#......................#................... +............................#.....#......................................................................................................... +......#..........................................#.......#...........................................................................#...... +..............#...................................................#........................................#......#......................... +.............................................................................#.............................................................. +.....................................#................................#................................................#.................... +..........#..................#..............................#.............................#................................................. +....#.....................................................................#......#............................................#............. +......................#.................................#..............................................#.................................... +.............#.............................................................................................................................. +..........................................#......#...............................................#..........#............................... +.........................#......#.......................................................#...............................................#... +...........................................................#.................................#...................#.......................... +...#...............#..................#..............#....................#...........................................#..................... +.....................................................................#...........#..........................................#......#........ +..............................#...............#.................................................#......#.................................... +........#.....#............................................................................................................................. +#........................................................#.............................#.......................................#.......#.... +....................#..................................................#.................................................................... +..........................................#......................#.......................................................................... +.........................#...........................#.............................................#............#.........#................. +.....................................................................................................................#..............#....... +..........#...................................#............................................................#..................#............. +.....#..........#...................#........................................#.............................................................. +.....................................................................#.........................#.......#.................................... +......................#......#.............................................................................................................. +.#......#................................................................................................................................... +.................................#....................................................#...........#......................#...............#.. +.................#..................................#.........#.........#...........................................................#....... +..............................................#..................................#.......................................................... +...........................#..........................................................................#.........#........................... +..........................................#................................................................................................. +.....................................#...........#..................#.........................................................#............. +..................#....................................#.............................#...........#........#.............#................... diff --git a/day11/main.zig b/day11/main.zig new file mode 100644 index 0000000..9ab2a56 --- /dev/null +++ b/day11/main.zig @@ -0,0 +1,158 @@ +const std = @import("std"); + +const Galaxy = struct { row: usize, col: usize }; + +pub fn main() !void { + const content = @embedFile("data.txt"); + + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + + // put into ArrayList of ArrayLists + var grid = try parseGrid(content, allocator); + defer grid.deinit(); + std.debug.print("grid: {any}\n", .{grid}); + + // find empty rows + const emptyRows = try findEmptyRows(grid, allocator); + std.debug.print("empty rows: {any}\n", .{emptyRows}); + + // find empty columns + const emptyColumns = try findEmptyColumns(grid, allocator); + std.debug.print("empty cols: {any}\n", .{emptyColumns}); + + // duplicate empty rows + // NOTE: not doing this any more, using Part 2 solution for Part 1 + // + // for (emptyRows.items, 0..) |row, i| { + // try grid.insert(row + i, grid.items[row + i]); + // } + // + // // duplicate empty columns + // for (emptyColumns.items, 0..) |col, i| { + // for (grid.items, 0..) |_, row| { + // try grid.items[row].insert(col + i, '.'); + // } + // } + + // find original galaxy locations + var galaxies = std.ArrayList(Galaxy).init(allocator); + for (grid.items, 0..) |row, i| { + for (row.items, 0..) |char, j| { + if (char == '#') { + try galaxies.append(Galaxy{ .row = i, .col = j }); + } + } + } + + var galaxies1 = std.ArrayList(Galaxy).init(allocator); + var galaxies2 = std.ArrayList(Galaxy).init(allocator); + + for (galaxies.items) |g| { + const row = g.row; + const col = g.col; + + // how many expanded rows & cols before this galaxy? + var expandedRows: usize = 0; + for (emptyRows.items) |r| { + if (r > row) { + break; + } + expandedRows += 1; + } + + var expandedColumns: usize = 0; + for (emptyColumns.items) |c| { + if (c > col) { + break; + } + expandedColumns += 1; + } + + const expansionFactor = 1_000_000; + + try galaxies1.append(Galaxy{ .row = row + expandedRows, .col = col + expandedColumns }); + try galaxies2.append(Galaxy{ .row = row + (expansionFactor - 1) * expandedRows, .col = col + (expansionFactor - 1) * expandedColumns }); + } + + // add up all their distances + var part1: usize = 0; + for (0..galaxies1.items.len - 1) |i| { + for (i + 1..galaxies1.items.len) |j| { + part1 += dist(galaxies1.items[j], galaxies1.items[i]); + } + } + + std.debug.print("Part 1: {d}\n", .{part1}); + + var part2: usize = 0; + for (0..galaxies2.items.len - 1) |i| { + for (i + 1..galaxies2.items.len) |j| { + part2 += dist(galaxies2.items[j], galaxies2.items[i]); + } + } + + std.debug.print("Part 2: {d}\n", .{part2}); +} + +fn dist(a: Galaxy, b: Galaxy) usize { + const x = if (a.row > b.row) a.row - b.row else b.row - a.row; + const y = if (a.col > b.col) a.col - b.col else b.col - a.col; + return x + y; +} + +fn findEmptyColumns(grid: std.ArrayList(std.ArrayList(u8)), allocator: std.mem.Allocator) !std.ArrayList(usize) { + var cols = std.ArrayList(usize).init(allocator); + const height = grid.items.len; + const width = grid.items[0].items.len; + + for (0..width) |col| { + var allEmpty = true; + for (0..height) |row| { + if (grid.items[row].items[col] == '#') { + allEmpty = false; + } + } + if (allEmpty) { + try cols.append(col); + } + } + return cols; +} + +fn findEmptyRows(grid: std.ArrayList(std.ArrayList(u8)), allocator: std.mem.Allocator) !std.ArrayList(usize) { + var rows = std.ArrayList(usize).init(allocator); + + for (grid.items, 0..) |row, idx| { + var allEmpty = true; + for (row.items) |char| { + if (char == '#') { + allEmpty = false; + } + } + if (allEmpty) { + try rows.append(idx); + } + } + return rows; +} + +fn parseGrid(content: []const u8, allocator: std.mem.Allocator) !std.ArrayList(std.ArrayList(u8)) { + var grid = std.ArrayList(std.ArrayList(u8)).init(allocator); + var lines = std.mem.split(u8, content, "\n"); + + while (lines.next()) |line| { + if (line.len < 1) { + break; + } + + var al = std.ArrayList(u8).init(allocator); + for (line) |char| { + try al.append(char); + } + + try grid.append(al); + } + + return grid; +} diff --git a/day11/test.txt b/day11/test.txt new file mode 100644 index 0000000..986aad4 --- /dev/null +++ b/day11/test.txt @@ -0,0 +1,10 @@ +...#...... +.......#.. +#......... +.......... +......#... +.#........ +.........# +.......... +.......#.. +#...#..... From 90a32e4439f6a5f8278b194b17b3585fc9ab45d3 Mon Sep 17 00:00:00 2001 From: Dustin Swan Date: Mon, 11 Dec 2023 22:05:52 -0700 Subject: [PATCH 04/10] Fixed day10. Well.. got an answer, but it isn't pretty. Hard coded something, and left a bunch of cruft in. Oh well. --- day10/main.zig | 97 +++++++++++++++++++++----------------------------- 1 file changed, 40 insertions(+), 57 deletions(-) diff --git a/day10/main.zig b/day10/main.zig index 4bbfb9e..44f6d55 100644 --- a/day10/main.zig +++ b/day10/main.zig @@ -43,6 +43,7 @@ pub fn main() !void { // capture the loop's coordinates in a map var loop = std.ArrayList(Coord).init(allocator); defer loop.deinit(); + try loop.append(startCoord); try loop.append(paths[0]); @@ -84,83 +85,65 @@ pub fn main() !void { var visited = std.AutoHashMap(Coord, void).init(allocator); defer visited.deinit(); - var prev = startCoord; - for (loop.items) |c| { - // find the coord to the "right" - var coord: ?Coord = null; - if (prev.row < c.row) { - coord = Coord{ .row = c.row, .col = c.col - 1 }; - } else if (prev.row > c.row) { - coord = Coord{ .row = c.row, .col = c.col + 1 }; - } else if (prev.col < c.col) { - coord = Coord{ .row = c.row + 1, .col = c.col }; - } else { - coord = Coord{ .row = c.row - 1, .col = c.col }; - } + // scarn left to right, keeping track of if we're "in" or "out" of the loop + var numVisited: u16 = 0; + for (0..height) |r| { + var in: bool = false; + var lastAngle: ?u8 = null; - try visitAllNeighbors(coord.?, &visited, &loop, grid, width, height); - prev = c; + for (0..width) |c| { + const coord = Coord{ .row = r, .col = c }; + const value = grid[coordToIndex(coord, width)]; + + const onLoop = contains(&loop, coord); + if (onLoop) { + if (value == 'S') { + lastAngle = 'L'; // '7' for test data.. TODO don't hard code this + } else if (value == '|') { // hit a part of the loop. toggle "in" + in = !in; + } else if (value == 'L' or value == 'F') { // we're starting to go "along" the loop + lastAngle = value; + } else if (value == '7' or value == 'J') { // we're coming out of the edge of the loop + if ((value == '7' and lastAngle == 'L') or (value == 'J' and lastAngle == 'F')) { + in = !in; + } + } + } + + if (!onLoop and in) { // if we aren't on a loop, and inside, add it to the list! + numVisited += 1; + try visited.put(coord, {}); + } + } } - // looking at my printed grid, there are a bunch of stragglers. Donno how. Let's count them - // var stragglers = std.ArrayList(Coord).init(allocator); - // defer stragglers.deinit(); - // - // for (grid) |i| { - // const c = indexToCoord(i, width); - // const ns = neighbors(c, width, height); - // var allVisited = true; - // for (ns) |n| { - // if (n != null and visited.get(n.?) != null) { - // allVisited = false; - // } - // } - // if (allVisited) { - // try visited.put(c, {}); - // } - // } - printGrid(grid, width, visited, &loop); - std.debug.print("Part 2: {any}\n", .{visited.count()}); + std.debug.print("Part 2: {any}\n", .{numVisited}); } fn printGrid(grid: []const u8, width: usize, visited: anytype, loop: anytype) void { for (grid, 0..) |value, idx| { const c = indexToCoord(idx, width); if (contains(loop, c)) { - // std.debug.print("{c}", .{value}); - std.debug.print(" ", .{}); + const code: u16 = switch (value) { + '-' => 0x2501, + '|' => 0x2503, + 'F' => 0x250F, + '7' => 0x2513, + 'J' => 0x251B, + else => 0x2517, + }; + std.debug.print("{u}", .{code}); } else if (visited.get(c) != null) { std.debug.print("X", .{}); } else if (value == '\n') { std.debug.print("{c}", .{value}); } else { - // std.debug.print("{c}", .{value}); std.debug.print(".", .{}); } } } -fn visitAllNeighbors(c: Coord, visited: anytype, loop: anytype, grid: []const u8, width: usize, height: usize) !void { - // if it's been visited, get out - if (visited.get(c) != null) { - return; - } - - if (contains(loop, c)) { - return; - } - - try visited.put(c, {}); - - const ns = neighbors(c, width, height); - for (ns) |neighbor| { - if (neighbor) |n| { - try visitAllNeighbors(n, visited, loop, grid, width, height); - } - } -} - fn contains(ar: *std.ArrayList(Coord), item: Coord) bool { for (ar.items) |i| { if (i.row == item.row and i.col == item.col) { From 68f15009538bf5f96e5eb352ed1ce1d913dd9025 Mon Sep 17 00:00:00 2001 From: Dustin Swan Date: Wed, 13 Dec 2023 19:17:29 -0700 Subject: [PATCH 05/10] Day 13. still haven't finished day 12. Today was so easy compared to yesterday. --- day13/main.zig | 119 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 day13/main.zig diff --git a/day13/main.zig b/day13/main.zig new file mode 100644 index 0000000..d67a28a --- /dev/null +++ b/day13/main.zig @@ -0,0 +1,119 @@ +const std = @import("std"); + +pub fn main() !void { + const content = @embedFile("data.txt"); + + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + + // yo dog + var grids = std.ArrayList(std.ArrayList(std.ArrayList(u8))).init(allocator); + var sections = std.mem.split(u8, content, "\n\n"); + + while (sections.next()) |section| { + var lines = std.mem.split(u8, section, "\n"); + var gridArrayList = std.ArrayList(std.ArrayList(u8)).init(allocator); + + while (lines.next()) |line| { + if (line.len < 1) { + break; + } + + var lineArrayList = std.ArrayList(u8).init(allocator); + for (line) |char| { + try lineArrayList.append(char); + } + try gridArrayList.append(lineArrayList); + } + + try grids.append(gridArrayList); + } + + var part1: usize = 0; + var part2: usize = 0; + + for (grids.items) |grid| { + const transposed = try transpose(grid, allocator); + + const rowReflection = findRowReflection(grid); + const columnReflection = findRowReflection(transposed); + + part1 += 100 * (rowReflection orelse 0) + (columnReflection orelse 0); + + const rowSmudge = findSmudge(grid); + const colSmudge = findSmudge(transposed); + + part2 += 100 * (rowSmudge orelse 0) + (colSmudge orelse 0); + } + + std.debug.print("part1 {d}\n", .{part1}); + std.debug.print("part2 {d}\n", .{part2}); +} + +fn findSmudge(grid: std.ArrayList(std.ArrayList(u8))) ?usize { + const height = grid.items.len; + + for (1..height) |row| { + var numDiff: u8 = 0; + + for (1..row + 1) |d| { + const row1 = grid.items[row - d]; + const row2 = grid.items[row + d - 1]; + + for (0..row1.items.len) |i| { + if (row1.items[i] != row2.items[i]) { + numDiff += 1; + } + } + if (numDiff > 1) { + break; + } + + if (row - d == 0 or row + d == height) { + break; + } + } + + if (numDiff == 1) { + return row; + } + } + return null; +} + +fn findRowReflection(grid: std.ArrayList(std.ArrayList(u8))) ?usize { + const height = grid.items.len; + + for (1..height) |row| { + for (1..row + 1) |d| { + const row1 = grid.items[row - d]; + const row2 = grid.items[row + d - 1]; + if (!std.mem.eql(u8, row1.items, row2.items)) { + break; + } + + if (row - d == 0 or row + d == height) { + return row; + } + } + } + return null; +} + +fn transpose(grid: std.ArrayList(std.ArrayList(u8)), allocator: std.mem.Allocator) !std.ArrayList(std.ArrayList(u8)) { + const height = grid.items.len; + const width = grid.items[0].items.len; + + var grid2 = std.ArrayList(std.ArrayList(u8)).init(allocator); + for (0..width) |c| { + var row = std.ArrayList(u8).init(allocator); + + for (0..height) |r| { + try row.append(grid.items[r].items[c]); + } + + try grid2.append(row); + } + + return grid2; +} From 40798151a955ec3e94aa5d96700de07565404cfb Mon Sep 17 00:00:00 2001 From: Dustin Swan Date: Fri, 15 Dec 2023 12:05:48 -0700 Subject: [PATCH 06/10] Day 14. Took me a looong time to figure out how to use the map right for some reason --- day14/data.txt | 100 ++++++++++++++++++++++++++++ day14/main.zig | 177 +++++++++++++++++++++++++++++++++++++++++++++++++ day14/test.txt | 10 +++ 3 files changed, 287 insertions(+) create mode 100644 day14/data.txt create mode 100644 day14/main.zig create mode 100644 day14/test.txt diff --git a/day14/data.txt b/day14/data.txt new file mode 100644 index 0000000..a4b4ee3 --- /dev/null +++ b/day14/data.txt @@ -0,0 +1,100 @@ +.....O..#....O.O.....OO#...#.....#...........O#..OO...#O##..#.....#...O.OO...#.O......OO#...OO...O.. +OOO....#O.#..O#.#.OO...OO..O##...O.....O.O...#.O.......OOO.O...#.....#.#.O....O.O.....#...#.OOOO.O.. +...O..#...#O..#......O#.......#..O##O.#....##......O.O...O..#O.O..##..#..#O......##...OO.#.O#..O...# +.O..#...##O..#....#...O.O...#........O.O..#...O..#O.O.....#O...OO.#....O..O....OO##OO#...O#.O#...#.# +#.O......O.#.O..OO.O..#....#.OO....#.#..#..O#.O....OO......#.##O...#.OO........O..OO...OOO#O.#O#.O.# +...##.O.#O.O.##.#..O....#.#..#.OO.O...#....#.O..O#O.O.O..O...O.O..##...O#..#.......O.O......#O.#O... +.O.O..O..O#.O.O..O.O..O..O..............#...O#O#.O.#.##..........##O....O.O...........O..O..O#...#.. +...#O.O.OO#..O..#.#...#O...O..#...#.........O...#OO#...#.O#....O...##..O...O.#O#.O#...O.O...#OO.O#.. +...##.##.O...O..#..#O.O.O...O.##..#.#.O..OO.O......OO..#..O.O..#..#.......O..O.....OO.OOO.O..O..#O.# +....#O.O...#OO..O.O............O.....#O..#O#...#.........O.O..O...OO....#..O..##.O..####O#O.#....... +.OOO.......##..O..#O.OO.##.....O....#..OO.#O.......OO..........OO..O..O#...#..O..##.O........#....O. +....#.O#...#OO..............O..O.O...O...O...O....O###....O.#OO...O#.OO.#...#.#.##.....O...........O +.......#O##..#......#.O.#.......O#.#.O#O#..#.#...O.....O..O#..O..#.O#....O..#.......O..O..#O........ +O..O.#.O...#....##...#.....O..#.#......O..#O..#.OO..O.##.........O#O.#....#..#.###OOOO..#OO.#O.O.O#. +...O##O.#.............#..O.O....O#.....#OO...OOO......O#.O...#O#.#..#....O..#.#..O..#.O...OO.....O.. +...O......#..O.#.#..##....O..#....#..O.#.......#..O...##O.O.......#..O.OO..O..........O....##.....#. +........#O##..O....#....#.....O...O.O.O.OO..O........#..#.O.........O.....O..O.O..#O.O...O...#..##.. +.O.#.....O.O.#..##O#.....#.#..O......O..##.#.#....##...O...OO.#..........OO.#O#OOO..#....#.#...O.#.. +....#...#.OO....#..OO#.#OO.O....OO..#..O....OO.......##.##O####O.O.O#..#....O.O......O.....#.O..O... +.O#O#........O.#...O#O..#O...O.#..#.#..O#........O###..O..#...#..O.##..#............O.......O..O.... +........#.O.....O...O.....##.....##.#.#.#....OO####.#..O#....#O...#.O#..O.O.#.O......O..#..O.....O.. +..O#..##O.OOOO...OO....OO#.#.O.....#.#......#...#OO#...####O#....O...O.O.O.O#....O.##OO#..O.#.O..##. +.##...............#.O#OO.#.......#...#O.#.OOO#.O...#....#....O#..O.#..O...O#...#..O#.O#O#........OO# +...#......##...#.#O..O......O#O.O..OOO..O##....#....O.#..O....#........OO#.#...#.O#..O....O.O##..O#. +.OO......O.....O...##..#...#....O.#....O....O...........OO.#.#..#...#.O#O.#.#......#.O......O.O#.#.# +O.O....#O...##.O..#O.O...#...O.......O.OO...O.O#.....#..#.O#.....O.O...........O.....O...O.....#.... +.#O#..O....O.......#..OOOO.....O.....####...#.......O...O#O...O..#..#...##.#.....#....O....#...##... +........O.O#OO#..#.O.....#.OOO......OO#.#.....O.#..#O.........#OOO......O..#......O..##....#O....#.# +..O..#O.....##..#.OO..O..........OO..O...#.##O.#.#..O.O#.#.#......OOO......#..O..#.O....O#...OO#.... +...#.OOO.O......O#O...O.O.OO....OO#.....O.O.O#.....O##.OO......#......OOO#O.OO.O#...#.....O....OO... +...#.#O..O...##.#.###.O.#...#.#....O.OO...O.O.O.O...#.#.O....#OO#.OO...#O...#O...OO.O..O..O....O..O# +.##.O......#.##.....O...OO#...O.....O..#.....O.........#....O..#....O.####......#...#........O#..OO. +.#.#.O.#.O#..OO.#....O...#.O...O..#.O.....#OO....#.O.O.O......OO...#.#.O#O#OO.#O.O.....O.........#.. +..#.#..O...#..#.....OO.#O...O#...OO.O...O#....##O....#.#...OO.#.....#.O#.....O.....O...#.#O.....#... +.O..OO#.#OO...O..#..........OO.............##..####...#.O....O...#.#...O#..O.O..OO.#....OOO..#...OO. +#...#....#.........OOOO....OO....O#O..........#..O#..O...#.OOO.....OO.......OO.##...O.#....OOO...##. +#.........#OO#.O.#..##.#.##O...#...OO....O#O......#.......O.O...#O...O.O.#O##O#..O....O#.#......O.#. +...O..O#..#...##..O....O..O......O.O#...OO.......##......OO..#.O....#.##O.OO....#.O.#.OO..O....O.#.. +.O..O.#.O.#............O....#....#....#.#.....#...OO#...OO.##OO.#..#....#....#.O#.OO#.#.O.O#..O..... +.OO#O...#.#......O...#...O##.O....O#...O..O..O..O.#O..#..###OO..#..O##O.#.O...O#O...OO.O..#.#O#..#.# +#..OOOO...OOO.O..#O...OO##....O#..OO...O.O.#....#O#O....#.#....O#...O...O....O...#..O.#O..#..#..#O#. +##.....OO#.....#.O.O..OO.O.#.....O..O....#....#.........OOO.O.....O#...O..#..........O.O.#..#...#..O +##.#.#.O..O.....##.##.#O..#........O#....O..O....O....#..O.##OO#.O.O..O#...###.OO.O#..#.O...##..OO.. +O....#.....O...#.#.OO..OO.###.O.#O.O...#.O.#......O.O#.#O#..O#...O...#.OO##..#.O.......#O....#...... +..#....#..#.O..#.O.O..O#......#O..#...O#.....#..#O..O.O.O.....#O.#.........O..........O.#O..O.O..O.. +OO####.OO..O...#..#O#.O#.#......#...#.#.O##..##.O.....O.OO.O.O#...O...O...O...O.O#........#..O.O.O.. +.O#O......O...O.#O##.OO.O..OO#..#OO...O.O..O.#...#O..OO....O.#OO.#O.#..O...#....#..OO#.......###.... +..#O#O........#.O.#...#O.#.O..O.O#..O.O#OO.O.O#O.#OOO....O#.........#..O..#.O...O........O#.......O# +...O.#.OO....#OO...#.........O..O.O.#OOO....O.....O..O.#.......OO..#O......#.#O..#.OO#O....O#.....O. +O.#OO..............#.O...##....OO#OO.......O#.....O.O....##....O........#......O..#..#..###O...#.... +...O.OO..O#...#.#O..O#...#..OO...OO......O..#..#....O..#.#......#...#....#.OOOO.#....##......O#..#.O +..#.......#...##OOO..O.....O..O.O.O..O#.....#.#O........O..#...#O..#...O#...#.OO....#.O..O#..O.#OO.# +##.#.O.OO..O..##O...O..O..O.......O.O....#...O......O.O.#.O......O......O...O...O.#.#.OO#OO...##..O. +.O...OO...#..O.O.#O..#O......#.#..#...........#O....#.###.#....#O.#...O....##...#.OO....O.#.O.O.O..O +.#..O#..O......#O...O..#.#.....OO...#.##.......#..O.O.......#......#..#....#.##..O.......O...#.OO... +O..O...#O.O#O#.....#O..#..#..#...O...O#.#O........O.OO.O.....#O#.#...O#.#...#O.#...#O.....#..O.O.... +OO.OO.#....O....O##..O#..O...#.......#......#.OO..O......#O#.OO.#...O.......#.#O....#.O...#.O.....O# +.O#.....#O.O....OO..O..O.#O.#O.O.OO..#.#...O.........O#...OO....O...#..O....O#.O#..#O#..O.#..O....O. +OO..##.O.......OO.O..#O...O...O.##...........O#.O...O....O#.#.OO...#O....O.#O......O#.O...........O. +O.#...........#O#.O.##...O#....O.O...#..O...#.OO.....#OO..O#.#.O..........#.#..O.#...#.......##O#O.. +....O......OO.OO..........OO.O...O.....#.#...OO..#.O#.O......OO##O.O...#.OOO...#...#..O......OO.#... +....#..#.#.O..O#....O.#.O#O#.#.#.O...O.....O..........#...##.O#..O#O.O..O#...###..O..#.O...O...#...# +###.....O#.#..##....#..O..#OO.#O.O...#..#O.#..O......O.....#.O..OO##.#.##.#.....#...O#O##....#...O.O +.....#..O.......#..O.#..#..#..O#...#...#O...O#.OO#.O#O#OO..##.O#.O.#..O.#..O..O....#.O.O..O........O +........OO...#OO.#..#.OO#...O..OO....#......OO#O#.#.#...#O.#.O......O.....O#..#...#....#.#O#..#...O. +O#...##..O........#OO##...#......O...........OO#...O.O.##O........#....##O.....##..O.....O.#O#.#.... +......O....##.#.O##.O#........##O.O..##...O..#.O..O....#.OO...OO.#.......#.O.....OO#O.##O.O....O#..O +..O....#...O.O...##.#....O....O..O......#...O..#..O......O.OO.#..#.O#...#..O.OO........#..#O...O..#. +#.O.#.O.....O..###.#.............O.##O.#.OO..#.....#.....O.........O.OOOO#...#.O#.##O.......OO.#OO.. +....OOO..O...OO##.O...#.#.OO..O#...O.#..O..OO.#O.##..##....O.O..OO#O...O#.....O..O##......#.#......O +..O.....O..#.........O#..O..#.OO..O##..O.O.##O#....O.OOO...#...O...O#O.#.O..............O....O#.#... +OO.#....O.......O..O.#.OO....##....OOOO...O.......OOO#....O#...O#.OO..O.....#.##...#..#..O......#O.# +.O...O...O.#O.O..OO##..#..#OO.O.OO....O........#O.....###OO.OO.OO..O##...O.#.O.....O......O...O##... +...O...O..#..O.......O#O....##.O.OO#.O...#OO.#..O.O.#...#O.#.#...O..O...O..OOO..#..O..O..#.#..#.O..O +.....#.......O.O...#.O.........O...#...#..O.##..OO...#.O..........O#.#..O#.#.O.OO.#........OO..O..O. +#O.OO..#..#.###...O....O.#...........#O....O.#O.#..........O.........O.....#..O.#..O.....O....OO.... +O......O..O...O...O..O.OO...O#...O......#..#O.O#.OOO..#.#.....#O.....##..#OO...O.....####O.......... +O....O#..#O..OO#O...O.#..O.....#..#..O..#..O..O#O..#.......O.#.#...O.........O..OO#.......#.O..OO.#. +.#.#...O.#O.....O....O.#O..O.#....OO..O#...#.O.#.OOO.O..O.....O.O..#.#..OO......#.#.O#O.#....O.O.O#. +....#O..##..#.#..#..#....#.#O.#.O####.......##.......##O.O......O..OO.##OO.......#...O..O....O#....O +.......O..OO.#.........O..O...OO...O.O.....#.....#.....O...O..#.##O.O...OO....O...O#O......O..O#.... +.....O....#...O.O.#O...O#..O....O.OO......O......O#O..O.O.O.##O..#...O...O.#.##O....O....O...O..#.#O +..O.O#O.....O#.O........##...#...#.O##O....#.#.#..O.O.OOO.##...O...##.O.O.#...O.#.#...##.....#.O..O# +.O......O.#O...OOO..#..##...#...O...O..O.........O.O#.....##.......##..O.OO...#.#..........OOO..#... +#O............O..#O#..#OO...O..#.O.O.O....O...#.#.#OO....O..##....O#..#...#OO..#.#........#........O +.#....#O#.O.#.....#.O....O#.....O....OOO#O.O.O.....O..OO.#O..#..#.OOOO......#OO.#.........O#.O#..#.# +...O..#..O.#......O....#..#..O.O.O.###.#.....OOO.#O.O.....O.O.#.#O...#.O#..#.....#......##...O.#.#.. +#...O....#.O....#...###...O.#.O..O#.#.#.O...........O#.#..O.#...O...O..#O..O....#O...O.O##....O....O +#O...#.OO#.#O........OO......#..O...O.OOOO.#.#..O#.##.O.O....#..O#..O.......#.O...#..#O......O..O... +...O....O..O.#OO#...O.....O..#........OO.....OO.....#.O..O......O...#.OOO......OO...O.#O...O..O##... +..#O.O.......##..O.OO.........#.........O.O#....O..O#.O...#OOO...O...#O.#O.#O.......#..#.##..##O...# +..O....O......#...O.#......O#....O.....O.....O..O......##.#.#O..OO...#.#.O#.O#O.#.#.O.#.#.O....O...# +...O...O.......#............O#O#..#.O....O#..OOO.#O#..OO.O...........OO...#...OOOO...#..O##O.O..#... +.O.O....O.#O.O#...#.#...........#.O.O#.#..O.#........O..O...#....O........O..O.#.#.#...#.........#O. +.O#..#O...#.O#.#...#...O...#..O##O..O......O.O....#O.#..O#OOO.O.#.........O....O.#.O....#OO....#...O +O#...#....#.#...#...O..##.#.....O.#..#.O....###O..O.OO#.....O...O.......#.....#O......#...OO.#.O..#. +O.O#O.#...OO##.#OO..#...O..OO#.O.....##..OO.....##..#O...#...OO#.O...#......#.O#..##..#.O.....O#.#.O +O..#O.O...OO.#O.O....#.OO...O...#..O.O..#OO............#........O..#.....#OOOO...O......O.##.O....O# +#...#OO.OO.#.#...O...O....O..##.O...#..O.......####.....#......#..O...#.##....#O..O..O.#.#.#......O. +.....O...O..#.O#...O..#.#.O#.O.OO.#..........O...OO#O#.....#.OO.........#OO.O...O..OO.O.#......O##.. diff --git a/day14/main.zig b/day14/main.zig new file mode 100644 index 0000000..002bf30 --- /dev/null +++ b/day14/main.zig @@ -0,0 +1,177 @@ +const std = @import("std"); + +pub fn main() !void { + const content = @embedFile("data.txt"); + + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + + var grid = std.ArrayList(std.ArrayList(u8)).init(allocator); + defer grid.deinit(); + + var grid2 = std.ArrayList(std.ArrayList(u8)).init(allocator); + defer grid2.deinit(); + + var lines = std.mem.split(u8, content, "\n"); + + while (lines.next()) |line| { + if (line.len < 1) { + break; + } + + var lineArrayList = std.ArrayList(u8).init(allocator); + var lineArrayList2 = std.ArrayList(u8).init(allocator); + + for (line) |char| { + try lineArrayList.append(char); + try lineArrayList2.append(char); + } + + try grid.append(lineArrayList); + try grid2.append(lineArrayList2); + } + + var map = std.StringHashMap(usize).init(allocator); + defer map.deinit(); + + transpose(&grid); + try tiltWest(&grid); + transpose(&grid); + + var part1 = calculateLoad(grid); + + std.debug.print("part 1: {d}\n", .{part1}); + + var prev: usize = 0; + var loop: usize = 0; + + const MAX = 1_000_000_000; + for (0..MAX) |i| { + // see if this grid arrangement is in our map + const key = try getKey(&grid2); + const hashed = map.get(key); + + // if it is, we've found a loop + if (hashed) |val| { + prev = val; + loop = i; + break; + } + + try cycle(&grid2); + + // add the new grid arrangement to the map + try map.put(key, i); + } + + // figure out where in the loop we should stop + const stop = (MAX - prev) % (loop - prev); + + // cycle that many more times + for (0..stop) |_| { + try cycle(&grid2); + } + var part2 = calculateLoad(grid2); + + std.debug.print("part 2: {d}\n", .{part2}); +} + +fn getKey(grid: *std.ArrayList(std.ArrayList(u8))) ![]u8 { + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + + var str = std.ArrayList(u8).init(allocator); + for (grid.items) |row| { + try str.appendSlice(row.items); + } + return str.items; +} + +fn cycle(grid: *std.ArrayList(std.ArrayList(u8))) !void { + transpose(grid); // to tilt north, transpose so north is left + try tiltWest(grid); + + transpose(grid); // to tilt west, transpose again + + try tiltWest(grid); + // at this point, grid is back to normal + flipY(grid); // to tilt south, flip (south is up) then transpose (south is left) + transpose(grid); + + try tiltWest(grid); + // at this point, south is left, west is up. we want east left + transpose(grid); // south is up, west is left + flipY(grid); // grid is back to normal + flipX(grid); + try tiltWest(grid); + flipX(grid); +} + +fn calculateLoad(grid: std.ArrayList(std.ArrayList(u8))) usize { + var load: usize = 0; + for (grid.items, 0..) |row, rowNum| { + var rowMultiplier = grid.items.len - rowNum; + for (row.items) |cell| { + if (cell == 'O') { + load += rowMultiplier; + } + } + } + + return load; +} + +fn tiltWest(grid: *std.ArrayList(std.ArrayList(u8))) !void { + for (grid.items) |row| { + for (row.items, 0..) |cell, i| { + if (cell == 'O' and i != 0 and row.items[i - 1] == '.') { + var j = i; + while (j > 0) { + row.items[j - 1] = 'O'; + row.items[j] = '.'; + j -= 1; + if (j < 1 or row.items[j - 1] != '.') { + break; + } + } + } + } + } +} + +// assumes square grid +fn transpose(grid: *std.ArrayList(std.ArrayList(u8))) void { + const length = grid.items.len; + + for (0..length - 1) |i| { + for (i + 1..length) |j| { + const temp = grid.items[i].items[j]; + grid.items[i].items[j] = grid.items[j].items[i]; + grid.items[j].items[i] = temp; + } + } +} + +// flip a grid upside down +fn flipY(grid: *std.ArrayList(std.ArrayList(u8))) void { + const height = grid.items.len; + + for (0..height / 2) |r| { + const temp = grid.items[r]; + grid.items[r] = grid.items[height - r - 1]; + grid.items[height - r - 1] = temp; + } +} + +// flip a grid left to right +fn flipX(grid: *std.ArrayList(std.ArrayList(u8))) void { + const length = grid.items.len; + + for (0..length) |r| { + for (0..length / 2) |c| { + const temp = grid.items[r].items[c]; + grid.items[r].items[c] = grid.items[r].items[length - c - 1]; + grid.items[r].items[length - c - 1] = temp; + } + } +} diff --git a/day14/test.txt b/day14/test.txt new file mode 100644 index 0000000..5a24dce --- /dev/null +++ b/day14/test.txt @@ -0,0 +1,10 @@ +O....#.... +O.OO#....# +.....##... +OO.#O....O +.O.....O#. +O.#..O.#.# +..O..#O..O +.......O.. +#....###.. +#OO..#.... From 27aa24f5038124def8c41dcbf1d44e6ccf6d3881 Mon Sep 17 00:00:00 2001 From: Dustin Swan Date: Fri, 15 Dec 2023 14:10:45 -0700 Subject: [PATCH 07/10] Day 15. So random this year. Fricking AIs --- day15/main.zig | 115 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 day15/main.zig diff --git a/day15/main.zig b/day15/main.zig new file mode 100644 index 0000000..d96b228 --- /dev/null +++ b/day15/main.zig @@ -0,0 +1,115 @@ +const std = @import("std"); + +const Lens = struct { label: []const u8, focalLength: u8 }; + +pub fn main() !void { + var content = @embedFile("data.txt"); + + var words = std.mem.split(u8, content, ","); + + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + + var boxes = std.AutoHashMap(u32, std.ArrayList(Lens)).init(allocator); + defer boxes.deinit(); + + var part1: u32 = 0; + while (words.next()) |w| { + // stupid last char thing + const word = if (w[w.len - 1] == 10) w[0 .. w.len - 2] else w; + + // Part 1 + part1 += hash(word); + + // Part 2 + const dash = std.mem.indexOf(u8, word, "-"); + const equals = std.mem.indexOf(u8, word, "="); + const idx = dash orelse equals orelse unreachable; + const label = word[0..idx]; + const box = hash(label); + std.debug.print("\nAfter \"{s}\":\n", .{word}); + + if (dash != null) { + // if dash, find the box + if (boxes.getPtr(box)) |list| { + // get the list, and find a lens with this label in it + var indexToRemove: ?usize = null; + for (list.items, 0..) |l, i| { + if (std.mem.eql(u8, l.label, label)) { + indexToRemove = i; + } + } + + // if it's there, remove it + if (indexToRemove) |i| { + _ = list.orderedRemove(i); + } + } + } else { + // if equals, parse out parts, put it in the box + const focalLength = try std.fmt.parseInt(u8, word[idx + 1 ..], 10); + const lens = Lens{ .focalLength = focalLength, .label = label }; + + // does this list exist? use it. otherwise make a new one + var list = boxes.get(box) orelse std.ArrayList(Lens).init(allocator); + + // find if this lens is already in the list + var dupIdx: ?usize = null; + for (list.items, 0..) |l, i| { + if (std.mem.eql(u8, l.label, label)) { + dupIdx = i; + } + } + + // if it is, replace it with the new lens + if (dupIdx) |i| { + try list.replaceRange(i, 1, &[_]Lens{lens}); + } else { + try list.append(lens); + } + try boxes.put(box, list); + } + + printBoxes(boxes); + } + + std.debug.print("Part 1: {d}\n", .{part1}); + + var part2: usize = 0; + var it = boxes.iterator(); + while (it.next()) |box| { + const boxNumber = box.key_ptr.*; + + for (box.value_ptr.items, 0..) |lens, slotNumber| { + part2 += (boxNumber + 1) * (slotNumber + 1) * lens.focalLength; + } + } + + std.debug.print("Part 2: {d}\n", .{part2}); +} + +fn hash(word: []const u8) u32 { + var sum: u32 = 0; + for (word) |c| { + if (c == 10) { + break; + } + sum += c; + sum *= 17; + sum = sum % 256; + } + + return sum; +} + +fn printBoxes(boxes: std.AutoHashMap(u32, std.ArrayList(Lens))) void { + var it = boxes.iterator(); + while (it.next()) |list| { + std.debug.print("Box {d}: ", .{list.key_ptr.*}); + + for (list.value_ptr.items) |lens| { + std.debug.print("[{s} {d}] ", .{ lens.label, lens.focalLength }); + } + std.debug.print("\n", .{}); + } +} From 9ffad3b1b434d665c8ec24ed437a9a69760b90e3 Mon Sep 17 00:00:00 2001 From: Dustin Swan Date: Fri, 15 Dec 2023 14:11:53 -0700 Subject: [PATCH 08/10] I hear we aren't supposed to be commiting our data. Oops. --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7a3a745 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.txt +.DS_Store From 8ea740f0298a9bb26652a4896e1ef5a6239f5c65 Mon Sep 17 00:00:00 2001 From: Dustin Swan Date: Sat, 16 Dec 2023 22:06:52 -0700 Subject: [PATCH 09/10] 4s to run part 2. But still happy with it. --- day16/main.zig | 254 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 day16/main.zig diff --git a/day16/main.zig b/day16/main.zig new file mode 100644 index 0000000..37a020d --- /dev/null +++ b/day16/main.zig @@ -0,0 +1,254 @@ +const std = @import("std"); + +const Dir = enum(usize) { up, right, down, left }; +const Coord = struct { row: usize, col: usize }; +const Beam = struct { dir: Dir, coord: Coord }; + +pub fn main() !void { + var content = @embedFile("data.txt"); + + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + + var grid = std.ArrayList(std.ArrayList(u8)).init(allocator); + defer grid.deinit(); + + var lines = std.mem.split(u8, content, "\n"); + + while (lines.next()) |line| { + if (line.len < 1) { + break; + } + + var lineArrayList = std.ArrayList(u8).init(allocator); + + for (line) |char| { + try lineArrayList.append(char); + } + + try grid.append(lineArrayList); + } + + const energy = try energize(Beam{ .dir = Dir.right, .coord = Coord{ .row = 0, .col = 0 } }, grid); + + std.debug.print("Part 1: {d}\n", .{energy}); + + const height = grid.items.len; + const width = grid.items[0].items.len; + + var maxEnergy: usize = 0; + + for (0..height) |row| { + for ([_]usize{ 0, width - 1 }) |col| { + const dir = if (col == 0) Dir.right else Dir.left; + const start = Beam{ .dir = dir, .coord = Coord{ .row = row, .col = col } }; + const e = try energize(start, grid); + if (e > maxEnergy) { + maxEnergy = e; + } + } + } + + for (0..width) |col| { + for ([_]usize{ 0, height - 1 }) |row| { + const dir = if (row == 0) Dir.down else Dir.up; + const start = Beam{ .dir = dir, .coord = Coord{ .row = row, .col = col } }; + const e = try energize(start, grid); + if (e > maxEnergy) { + maxEnergy = e; + } + } + } + + std.debug.print("Part 2: {d}\n", .{maxEnergy}); +} + +fn energize(start: Beam, grid: std.ArrayList(std.ArrayList(u8))) !usize { + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + + var beams = std.ArrayList(Beam).init(allocator); + defer beams.deinit(); + + // add the first beam + try beams.append(start); + + var energized = std.AutoHashMap(Coord, void).init(allocator); + defer energized.deinit(); + + var beamHistory = std.AutoHashMap(Beam, void).init(allocator); + defer beamHistory.deinit(); + + const height = grid.items.len; + const width = grid.items[0].items.len; + + while (true) { + // make 2 new lists: beams to add, and beams to remove. + // batch these while iterating, and do it all after + var beamsToAdd = std.ArrayList(Beam).init(allocator); + defer beamsToAdd.deinit(); + + var beamsToRemove = std.ArrayList(usize).init(allocator); + defer beamsToRemove.deinit(); + + if (beams.items.len == 0) { + break; + } + + for ((&beams).items, 0..) |*b, beamNumber| { + if (isOutOfGrid(b, grid)) { + try beamsToRemove.append(beamNumber); + continue; + } + + try energized.put(b.coord, {}); + + if (beamHistory.contains(b.*)) { + try beamsToRemove.append(beamNumber); + continue; + } + + try beamHistory.put(b.*, {}); + + const row = b.coord.row; + const col = b.coord.col; + + const value = grid.items[row].items[col]; + + const goStraight = value == '.' or (value == '|' and (b.dir == .up or b.dir == .down)) or + (value == '-' and (b.dir == .left or b.dir == .right)); + + if (goStraight) { + switch (b.dir) { + .up => if (row == 0) { + b.coord.row = height + 10; // put it out of the grid to get cleaned up + } else { + b.coord.row -= 1; + }, + .right => b.coord.col += 1, + .down => b.coord.row += 1, + .left => if (col == 0) { + b.coord.col = width + 10; // put it out of the grid to get cleaned up + } else { + b.coord.col -= 1; + }, + } + } else if (value == '|') { + if (row == 0) { + // if we are on the top row, change the beam to go down + b.dir = Dir.down; + b.coord.row += 1; + } else { + // otherwise, change beam direction to up and move it up one cell + b.dir = Dir.up; + b.coord.row -= 1; + if (row != height - 1) { + // and if we're not on the _bottom_ row, + // create a new beam going down, below this cell + const newBeam = Beam{ .dir = Dir.down, .coord = Coord{ .row = row + 1, .col = col } }; + try beamsToAdd.append(newBeam); + } + } + } else if (value == '-') { + if (col == 0) { + // if we are on the first col, change the beam to go right + b.dir = Dir.right; + b.coord.col += 1; + } else { + // otherwise, change beam direction to left and move it left one cell + b.dir = Dir.left; + b.coord.col -= 1; + if (col != width - 1) { + // and if we're not on the _last_ column, + // create a new beam going right, to the right this cell + const newBeam = Beam{ .dir = Dir.right, .coord = Coord{ .row = row, .col = col + 1 } }; + try beamsToAdd.append(newBeam); + } + } + } else if (value == '/') { + switch (b.dir) { + .up => { + b.dir = Dir.right; + b.coord.col += 1; + }, + .right => if (row == 0) { + b.coord.row = height + 10; // put it out of the grid to get cleaned up + } else { + b.dir = Dir.up; + b.coord.row -= 1; + }, + .down => if (col == 0) { + b.coord.row = height + 10; // put it out of the grid to get cleaned up + } else { + b.dir = Dir.left; + b.coord.col -= 1; + }, + .left => { + b.dir = Dir.down; + b.coord.row += 1; + }, + } + } else if (value == '\\') { + switch (b.dir) { + .up => if (col == 0) { + b.coord.col = width + 10; // put it out of the grid to get cleaned up + } else { + b.dir = Dir.left; + b.coord.col -= 1; + }, + .right => { + b.dir = Dir.down; + b.coord.row += 1; + }, + .down => { + b.dir = Dir.right; + b.coord.col += 1; + }, + .left => if (row == 0) { + b.coord.row = height + 10; // put it out of the grid to get cleaned up + } else { + b.dir = Dir.up; + b.coord.row -= 1; + }, + } + } + } + + // remove the beams in reverse order + const len = beamsToRemove.items.len; + for (0..len) |j| { + const idx = beamsToRemove.items[len - j - 1]; + _ = beams.orderedRemove(idx); + } + beamsToRemove.clearAndFree(); + + // add the new beams + for (beamsToAdd.items) |beam| { + try beams.append(beam); + } + beamsToAdd.clearAndFree(); + } + + return energized.count(); +} + +fn isOutOfGrid(beam: *Beam, grid: std.ArrayList(std.ArrayList(u8))) bool { + const row = beam.coord.row; + const col = beam.coord.col; + const height = grid.items.len; + const width = grid.items[0].items.len; + return row < 0 or row >= height or col < 0 or col >= width; +} + +fn printGrid(grid: std.ArrayList(std.ArrayList(u8)), energized: std.AutoHashMap(Coord, void)) void { + for (grid.items, 0..) |line, row| { + for (line.items, 0..) |char, col| { + if (char == '.' and energized.contains(Coord{ .row = row, .col = col })) { + std.debug.print("#", .{}); + } else { + std.debug.print("{c}", .{char}); + } + } + std.debug.print("\n", .{}); + } +} From ed16c41c9c7948dacccccf7555ff3c6c41e064a7 Mon Sep 17 00:00:00 2001 From: Dustin Swan Date: Mon, 25 Dec 2023 21:04:40 -0700 Subject: [PATCH 10/10] Adding some unfinished days --- day12/index.js | 71 ++++++++++++++ day12/main.zig | 87 +++++++++++++++++ day17/main.zig | 254 +++++++++++++++++++++++++++++++++++++++++++++++++ day18/main.zig | 232 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 644 insertions(+) create mode 100644 day12/index.js create mode 100644 day12/main.zig create mode 100644 day17/main.zig create mode 100644 day18/main.zig diff --git a/day12/index.js b/day12/index.js new file mode 100644 index 0000000..63dbe7f --- /dev/null +++ b/day12/index.js @@ -0,0 +1,71 @@ +const fs = require("node:fs"); + +let data; +try { + data = fs.readFileSync("test.txt", "utf8"); +} catch (err) { + return +} + +const lines = data.trim().split("\n"); +var part1 = 0; +var part2 = 0; + +lines.forEach((l) => { + const parts = l.split(" "); + const map = parts[0]; + const damaged = parts[1].split(",").map(Number); + // const all = allArrangements(map) + // const valid = all.filter((m) => isValid(m, damaged)); + // part1 += valid.length; + + const map2 = [map, map, map, map, map].join("?"); + const damaged2 = [damaged, damaged, damaged, damaged, damaged].flat(); + // console.log(damaged2); + const all2 = allValidArrangements(map2, damaged2); + console.log("all2", all2); + part2 += all2.length; +}); + +// console.log("part1", part1); +console.log("part2", part1); + +function allValidArrangements(map, damaged, index = 0) { + const i = map.substring(index).indexOf("?"); + if (i === -1) { + return map; + } + + const one = allValidArrangements(replaceAt(map, i + index, "#"), damaged, index + 1); + const two = allValidArrangements(replaceAt(map, i + index, "."), damaged, index + 1); + return [one, two].flat(); +} + + +function allArrangements(map, index = 0) { + const i = map.substring(index).indexOf("?"); + if (i === -1) { + return map; + } + + const one = allArrangements(replaceAt(map, i + index, "#"), index + 1); + const two = allArrangements(replaceAt(map, i + index, "."), index + 1); + return [one, two].flat(); +} + +function replaceAt(str, index, replacement) { + return str.substring(0, index) + replacement + str.substring(index + replacement.length); +} + +function isValid(map, damaged) { + const trimmed = map.replace(/^\.+/, "").replace(/\.+$/, ""); + const parts = trimmed.split(/\.+/); + let isValid = parts.length === damaged.length; + damaged.forEach((d, i) => { + if (!parts[i] || parts[i].length !== d) { + isValid = false; + } + }); + + return isValid; +} diff --git a/day12/main.zig b/day12/main.zig new file mode 100644 index 0000000..63e23aa --- /dev/null +++ b/day12/main.zig @@ -0,0 +1,87 @@ +const std = @import("std"); + +const Record = struct { map: []const u8, damaged: std.ArrayList(u8) }; + +pub fn main() !void { + const content = @embedFile("test.txt"); + var lines = std.mem.split(u8, content, "\n"); + + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + + var records = std.ArrayList(Record).init(allocator); + defer records.deinit(); + + // parse lines + while (lines.next()) |line| { + if (line.len < 1) { + break; + } + var parts = std.mem.split(u8, line, " "); + const map = parts.next().?; + var damageIterator = std.mem.split(u8, parts.next().?, ","); + var damaged = std.ArrayList(u8).init(allocator); + while (damageIterator.next()) |d| { + const parsed = try std.fmt.parseInt(u8, d, 10); + try damaged.append(parsed); + } + try records.append(Record{ .map = map, .damaged = damaged }); + } + std.debug.print("records: {any}\n", .{records.items}); + + var part1: u8 = 0; + for (records.items) |r| { + // var all = std.ArrayList(u8).init(allocator); + const all = allArrangements(r.map, r.damaged, 0); + std.debug.print("all arrangements: {any}\n", .{all}); + + // part1 += numValid(r); + } + + std.debug.print("Part1: {d}\n", .{part1}); +} + +// replaces ?s with every possible combination of . or # +// fn allArrangements(r: Record, i: u8) []const u8 { +fn allArrangements(map: []const u8, damaged: std.ArrayList(u8), start: u8) []const u8 { + std.debug.print("allArrangements. map: {any} damage: {any} start: {any}\n", .{ map, damaged, start }); + // find the first ? + const idx = std.mem.indexOf(u8, map, "?"); + if (idx == null) { + return map; + } + + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + + var records = std.ArrayList(Record).init(allocator); + defer records.deinit(); + + var one: [map.len]u8 = undefined; + @memcpy(one, map); + std.debug.print("? idx: {?d}\n", .{idx}); + return &[_]u8{1}; +} + +fn numValid(r: Record) u8 { + // var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + // const allocator = gpa.allocator(); + // + // // generate all possible arrangements + // var all = std.ArrayList(u8).init(allocator); + // defer all.deinit(); + + const num = numQuestionMarks(r.map); + std.debug.print("num ?: {d}\n", .{num}); + return num; +} + +fn numQuestionMarks(str: []const u8) u8 { + var i: u8 = 0; + for (str) |char| { + if (char == '?') { + i += 1; + } + } + return i; +} diff --git a/day17/main.zig b/day17/main.zig new file mode 100644 index 0000000..2cc4e93 --- /dev/null +++ b/day17/main.zig @@ -0,0 +1,254 @@ +const std = @import("std"); + +const Dir = enum(usize) { up, right, down, left }; +const Coord = struct { row: usize, col: usize }; +const Beam = struct { dir: Dir, coord: Coord }; + +pub fn main() !void { + var content = @embedFile("test.txt"); + + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + + var grid = std.ArrayList(std.ArrayList(u8)).init(allocator); + defer grid.deinit(); + + var lines = std.mem.split(u8, content, "\n"); + + while (lines.next()) |line| { + if (line.len < 1) { + break; + } + + var lineArrayList = std.ArrayList(u8).init(allocator); + + for (line) |char| { + try lineArrayList.append(char); + } + + try grid.append(lineArrayList); + } + + const energy = try energize(Beam{ .dir = Dir.right, .coord = Coord{ .row = 0, .col = 0 } }, grid); + + std.debug.print("Part 1: {d}\n", .{energy}); + + const height = grid.items.len; + const width = grid.items[0].items.len; + + var maxEnergy: usize = 0; + + for (0..height) |row| { + for ([_]usize{ 0, width - 1 }) |col| { + const dir = if (col == 0) Dir.right else Dir.left; + const start = Beam{ .dir = dir, .coord = Coord{ .row = row, .col = col } }; + const e = try energize(start, grid); + if (e > maxEnergy) { + maxEnergy = e; + } + } + } + + for (0..width) |col| { + for ([_]usize{ 0, height - 1 }) |row| { + const dir = if (row == 0) Dir.down else Dir.up; + const start = Beam{ .dir = dir, .coord = Coord{ .row = row, .col = col } }; + const e = try energize(start, grid); + if (e > maxEnergy) { + maxEnergy = e; + } + } + } + + std.debug.print("Part 2: {d}\n", .{maxEnergy}); +} + +fn energize(start: Beam, grid: std.ArrayList(std.ArrayList(u8))) !usize { + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + + var beams = std.ArrayList(Beam).init(allocator); + defer beams.deinit(); + + // add the first beam + try beams.append(start); + + var energized = std.AutoHashMap(Coord, void).init(allocator); + defer energized.deinit(); + + var beamHistory = std.AutoHashMap(Beam, void).init(allocator); + defer beamHistory.deinit(); + + const height = grid.items.len; + const width = grid.items[0].items.len; + + while (true) { + // make 2 new lists: beams to add, and beams to remove. + // batch these while iterating, and do it all after + var beamsToAdd = std.ArrayList(Beam).init(allocator); + defer beamsToAdd.deinit(); + + var beamsToRemove = std.ArrayList(usize).init(allocator); + defer beamsToRemove.deinit(); + + if (beams.items.len == 0) { + break; + } + + for ((&beams).items, 0..) |*b, beamNumber| { + if (isOutOfGrid(b, grid)) { + try beamsToRemove.append(beamNumber); + continue; + } + + try energized.put(b.coord, {}); + + if (beamHistory.contains(b.*)) { + try beamsToRemove.append(beamNumber); + continue; + } + + try beamHistory.put(b.*, {}); + + const row = b.coord.row; + const col = b.coord.col; + + const value = grid.items[row].items[col]; + + const goStraight = value == '.' or (value == '|' and (b.dir == .up or b.dir == .down)) or + (value == '-' and (b.dir == .left or b.dir == .right)); + + if (goStraight) { + switch (b.dir) { + .up => if (row == 0) { + b.coord.row = height + 10; // put it out of the grid to get cleaned up + } else { + b.coord.row -= 1; + }, + .right => b.coord.col += 1, + .down => b.coord.row += 1, + .left => if (col == 0) { + b.coord.col = width + 10; // put it out of the grid to get cleaned up + } else { + b.coord.col -= 1; + }, + } + } else if (value == '|') { + if (row == 0) { + // if we are on the top row, change the beam to go down + b.dir = Dir.down; + b.coord.row += 1; + } else { + // otherwise, change beam direction to up and move it up one cell + b.dir = Dir.up; + b.coord.row -= 1; + if (row != height - 1) { + // and if we're not on the _bottom_ row, + // create a new beam going down, below this cell + const newBeam = Beam{ .dir = Dir.down, .coord = Coord{ .row = row + 1, .col = col } }; + try beamsToAdd.append(newBeam); + } + } + } else if (value == '-') { + if (col == 0) { + // if we are on the first col, change the beam to go right + b.dir = Dir.right; + b.coord.col += 1; + } else { + // otherwise, change beam direction to left and move it left one cell + b.dir = Dir.left; + b.coord.col -= 1; + if (col != width - 1) { + // and if we're not on the _last_ column, + // create a new beam going right, to the right this cell + const newBeam = Beam{ .dir = Dir.right, .coord = Coord{ .row = row, .col = col + 1 } }; + try beamsToAdd.append(newBeam); + } + } + } else if (value == '/') { + switch (b.dir) { + .up => { + b.dir = Dir.right; + b.coord.col += 1; + }, + .right => if (row == 0) { + b.coord.row = height + 10; // put it out of the grid to get cleaned up + } else { + b.dir = Dir.up; + b.coord.row -= 1; + }, + .down => if (col == 0) { + b.coord.row = height + 10; // put it out of the grid to get cleaned up + } else { + b.dir = Dir.left; + b.coord.col -= 1; + }, + .left => { + b.dir = Dir.down; + b.coord.row += 1; + }, + } + } else if (value == '\\') { + switch (b.dir) { + .up => if (col == 0) { + b.coord.col = width + 10; // put it out of the grid to get cleaned up + } else { + b.dir = Dir.left; + b.coord.col -= 1; + }, + .right => { + b.dir = Dir.down; + b.coord.row += 1; + }, + .down => { + b.dir = Dir.right; + b.coord.col += 1; + }, + .left => if (row == 0) { + b.coord.row = height + 10; // put it out of the grid to get cleaned up + } else { + b.dir = Dir.up; + b.coord.row -= 1; + }, + } + } + } + + // remove the beams in reverse order + const len = beamsToRemove.items.len; + for (0..len) |j| { + const idx = beamsToRemove.items[len - j - 1]; + _ = beams.orderedRemove(idx); + } + beamsToRemove.clearAndFree(); + + // add the new beams + for (beamsToAdd.items) |beam| { + try beams.append(beam); + } + beamsToAdd.clearAndFree(); + } + + return energized.count(); +} + +fn isOutOfGrid(beam: *Beam, grid: std.ArrayList(std.ArrayList(u8))) bool { + const row = beam.coord.row; + const col = beam.coord.col; + const height = grid.items.len; + const width = grid.items[0].items.len; + return row < 0 or row >= height or col < 0 or col >= width; +} + +fn printGrid(grid: std.ArrayList(std.ArrayList(u8)), energized: std.AutoHashMap(Coord, void)) void { + for (grid.items, 0..) |line, row| { + for (line.items, 0..) |char, col| { + if (char == '.' and energized.contains(Coord{ .row = row, .col = col })) { + std.debug.print("#", .{}); + } else { + std.debug.print("{c}", .{char}); + } + } + std.debug.print("\n", .{}); + } +} diff --git a/day18/main.zig b/day18/main.zig new file mode 100644 index 0000000..994fb56 --- /dev/null +++ b/day18/main.zig @@ -0,0 +1,232 @@ +const std = @import("std"); + +const Point = struct { row: i32, col: i32 }; +const Direction = enum(usize) { up, right, down, left }; +const Instruction = struct { direction: Direction, distance: usize }; + +pub fn main() !void { + var content = @embedFile("test.txt"); + + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + + var path = std.AutoHashMap(Point, void).init(allocator); + defer path.deinit(); + + var instructions = std.ArrayList(Instruction).init(allocator); + defer instructions.deinit(); + + try parseInstructions(content, &instructions); + + var minCol: i32 = 0; + var maxCol: i32 = 0; + var minRow: i32 = 0; + var maxRow: i32 = 0; + + var row: i32 = 0; + var col: i32 = 0; + for (instructions.items) |ins| { + for (0..ins.distance) |_| { + try path.put(Point{ .row = row, .col = col }, {}); + + if (row > maxRow) { + maxRow = row; + } + if (row < minRow) { + minRow = row; + } + if (col > maxCol) { + maxCol = col; + } + if (col < minCol) { + minCol = col; + } + + if (ins.direction == Direction.up) { + row -= 1; + } else if (ins.direction == Direction.right) { + col += 1; + } else if (ins.direction == Direction.down) { + row += 1; + } else { + col -= 1; + } + } + } + + std.debug.print("min row:{d}, max row: {d}\n", .{ minRow, maxRow }); + std.debug.print("min col:{d}, max col: {d}\n", .{ minCol, maxCol }); + + // guess at finding a spot inside + var inside = Point{ .row = @divFloor(maxRow - minRow, 2), .col = @divFloor(maxCol - minCol, 2) }; + + var filled = try path.clone(); + defer filled.deinit(); + + std.debug.print("count pre: {d}\n", .{path.count()}); + + try fill(&filled, inside); + + std.debug.print("count post: {d}\n", .{filled.count()}); + + // printGrid(filled); + + // Part 2 + var path2 = std.AutoHashMap(Point, void).init(allocator); + defer path2.deinit(); + + var instructions2 = std.ArrayList(Instruction).init(allocator); + defer instructions2.deinit(); + + try parseInstructions2(content, &instructions2); + + minCol = 0; + maxCol = 0; + minRow = 0; + maxRow = 0; + + row = 0; + col = 0; + for (instructions2.items) |ins| { + for (0..ins.distance) |_| { + try path2.put(Point{ .row = row, .col = col }, {}); + + if (row > maxRow) { + maxRow = row; + } + if (row < minRow) { + minRow = row; + } + if (col > maxCol) { + maxCol = col; + } + if (col < minCol) { + minCol = col; + } + + if (ins.direction == Direction.up) { + row -= 1; + } else if (ins.direction == Direction.right) { + col += 1; + } else if (ins.direction == Direction.down) { + row += 1; + } else { + col -= 1; + } + } + } + + std.debug.print("min row:{d}, max row: {d}\n", .{ minRow, maxRow }); + std.debug.print("min col:{d}, max col: {d}\n", .{ minCol, maxCol }); + + // guess at finding a spot inside + inside = Point{ .row = @divFloor(maxRow - minRow, 2), .col = @divFloor(maxCol - minCol, 2) }; + + var filled2 = try path2.clone(); + defer filled2.deinit(); + + std.debug.print("count pre: {d}\n", .{path2.count()}); + + try fill(&filled2, inside); + + std.debug.print("count post: {d}\n", .{filled2.count()}); +} + +fn fill(grid: *std.AutoHashMap(Point, void), point: Point) !void { + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + + var toVisit = std.ArrayList(Point).init(allocator); + defer toVisit.deinit(); + + try toVisit.append(point); + + while (toVisit.items.len > 0) { + const p = toVisit.pop(); + // std.debug.print("Looping in fill. point: {any}\n", .{p}); + const ns = [_]Point{ Point{ .row = p.row - 1, .col = p.col }, Point{ .row = p.row + 1, .col = p.col }, Point{ .row = p.row, .col = p.col + 1 }, Point{ .row = p.row, .col = p.col - 1 } }; + for (ns) |px| { + if (!grid.contains(px)) { + try grid.put(px, {}); + // try fill(grid, px); + try toVisit.append(px); + } + } + } +} + +fn parseInstructions(content: []const u8, instructions: *std.ArrayList(Instruction)) !void { + var lines = std.mem.split(u8, content, "\n"); + + while (lines.next()) |line| { + if (line.len < 1) { + break; + } + + var parts = std.mem.split(u8, line, " "); + const dirString = parts.next().?; + + var direction: Direction = undefined; + + if (std.mem.eql(u8, dirString, "U")) { + direction = Direction.up; + } else if (std.mem.eql(u8, dirString, "R")) { + direction = Direction.right; + } else if (std.mem.eql(u8, dirString, "D")) { + direction = Direction.down; + } else if (std.mem.eql(u8, dirString, "L")) { + direction = Direction.left; + } else { + unreachable; + } + + const distance = std.fmt.parseInt(u8, parts.next().?, 10); + + const instruction = Instruction{ .direction = direction, .distance = try distance }; + try instructions.*.append(instruction); + } +} + +fn parseInstructions2(content: []const u8, instructions: *std.ArrayList(Instruction)) !void { + var lines = std.mem.split(u8, content, "\n"); + + while (lines.next()) |line| { + if (line.len < 1) { + break; + } + + var hex = line[6..12]; + const dirString = hex[5..6]; + var direction: Direction = undefined; + + if (std.mem.eql(u8, dirString, "0")) { + direction = Direction.right; + } else if (std.mem.eql(u8, dirString, "1")) { + direction = Direction.down; + } else if (std.mem.eql(u8, dirString, "2")) { + direction = Direction.left; + } else if (std.mem.eql(u8, dirString, "3")) { + direction = Direction.up; + } else { + unreachable; + } + + const distance = try std.fmt.parseInt(usize, hex[0..5], 16); + + const instruction = Instruction{ .direction = direction, .distance = distance }; + try instructions.append(instruction); + } +} + +fn printGrid(grid: std.AutoHashMap(Point, void)) void { + for (0..300) |row| { + for (0..300) |col| { + if (grid.contains(Point{ .row = @as(i32, @intCast(row)) - 43, .col = @as(i32, @intCast(col)) - 5 })) { + std.debug.print("#", .{}); + } else { + std.debug.print(".", .{}); + } + } + std.debug.print("\n", .{}); + } +}