diff --git a/2023/09/.gitignore b/2023/09/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/2023/09/.gitignore @@ -0,0 +1 @@ +/target diff --git a/2023/09/Cargo.toml b/2023/09/Cargo.toml new file mode 100644 index 0000000..faf1451 --- /dev/null +++ b/2023/09/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "y2023d09" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/2023/09/data/example1 b/2023/09/data/example1 new file mode 100644 index 0000000..70c5595 --- /dev/null +++ b/2023/09/data/example1 @@ -0,0 +1,3 @@ +0 3 6 9 12 15 +1 3 6 10 15 21 +10 13 16 21 30 45 \ No newline at end of file diff --git a/2023/09/data/input b/2023/09/data/input new file mode 100644 index 0000000..8951fc1 --- /dev/null +++ b/2023/09/data/input @@ -0,0 +1,200 @@ +4 7 14 17 8 -3 40 284 1054 3047 7774 18514 42224 93097 198790 410780 820904 1587039 2972406 5405827 9575760 +13 26 44 80 164 361 809 1779 3761 7595 14712 27667 51418 96397 185632 370526 764205 1608876 3406248 7160410 14814288 +7 29 66 132 264 549 1164 2429 4873 9313 16946 29454 49122 78969 122892 185823 273899 394645 557170 772376 1053180 +4 12 30 67 132 234 382 585 852 1192 1614 2127 2740 3462 4302 5269 6372 7620 9022 10587 12324 +2 -7 -12 5 83 304 825 1930 4126 8339 16326 31524 60745 117473 228159 444058 863130 1669793 3205496 6091003 11433015 +19 37 58 82 109 139 172 208 247 289 334 382 433 487 544 604 667 733 802 874 949 +13 38 85 173 329 598 1062 1881 3394 6351 12388 24919 50736 102855 205682 404727 785534 1511550 2900900 5582289 10809214 +22 36 50 64 78 92 106 120 134 148 162 176 190 204 218 232 246 260 274 288 302 +12 19 44 94 170 273 428 741 1505 3379 7690 16965 35920 73403 146423 288884 571005 1142650 2328614 4832776 10161751 +13 31 55 85 121 163 211 265 325 391 463 541 625 715 811 913 1021 1135 1255 1381 1513 +-1 -6 -11 -16 -21 -26 -31 -36 -41 -46 -51 -56 -61 -66 -71 -76 -81 -86 -91 -96 -101 +-7 -4 1 5 18 78 281 836 2166 5113 11395 24648 52730 112561 239752 506795 1055794 2154637 4288752 8302746 15603689 +10 10 6 10 58 234 708 1799 4086 8613 17277 33560 63876 119961 222947 410039 745066 1334612 2351960 4071710 6918670 +6 -1 -4 6 38 101 204 356 566 843 1196 1634 2166 2801 3548 4416 5414 6551 7836 9278 10886 +18 33 58 89 113 102 19 -151 -332 -237 816 4165 12155 28592 59313 112885 201446 341701 556086 874113 1333909 +9 36 76 129 195 274 366 471 589 720 864 1021 1191 1374 1570 1779 2001 2236 2484 2745 3019 +11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 +12 14 14 25 84 272 747 1794 3893 7803 14657 26060 44179 71811 112412 170067 249378 355244 492504 665411 876902 +5 13 24 55 145 366 834 1719 3252 5736 9593 15522 24904 40677 69058 122831 227727 435239 849010 1679301 3353475 +10 22 53 118 232 410 667 1018 1478 2062 2785 3662 4708 5938 7367 9010 10882 12998 15373 18022 20960 +14 29 48 76 124 218 413 811 1591 3074 5862 11106 20993 39660 75101 143587 280453 566488 1190981 2597257 5806239 +15 33 77 165 319 573 988 1673 2824 4813 8382 15035 27824 53013 103809 208864 431181 908257 1932899 4107549 8624741 +0 6 20 51 122 297 735 1784 4130 9028 18687 37000 71067 134442 253856 482482 924903 1782520 3435024 6588364 12553249 +12 24 34 38 31 7 -41 -121 -242 -414 -648 -956 -1351 -1847 -2459 -3203 -4096 -5156 -6402 -7854 -9533 +13 32 57 100 187 357 665 1191 2060 3502 6052 11145 22655 50458 118076 278353 644947 1455264 3196219 6854814 14412615 +15 34 66 133 280 581 1139 2078 3525 5580 8272 11499 14950 18007 19625 18188 11339 -4218 -32946 -80735 -155196 +0 19 52 99 160 235 324 427 544 675 820 979 1152 1339 1540 1755 1984 2227 2484 2755 3040 +11 26 63 142 292 548 958 1619 2768 4961 9380 18315 35875 68989 128765 232282 404897 683156 1118405 1781204 2766654 +-3 9 28 56 113 247 537 1093 2078 3815 7117 14120 30148 67548 153076 341406 738867 1543937 3114970 6082220 11532363 +6 24 62 125 229 410 741 1367 2569 4881 9326 17946 35052 70144 144457 304889 652104 1394482 2947110 6106207 12345559 +2 3 22 69 150 282 532 1089 2378 5225 11082 22321 42606 77352 134280 224077 361170 564623 859166 1276365 1855942 +7 14 28 42 58 106 286 856 2410 6225 14921 33702 72677 151193 305960 606484 1184929 2294888 4428038 8545010 16526252 +9 12 31 92 230 485 896 1493 2287 3258 4341 5410 6260 6587 5966 3827 -571 -8168 -20133 -37896 -63182 +1 14 51 136 315 677 1382 2701 5086 9304 16688 29580 52066 91131 158393 272609 463183 774946 1274521 2058632 3264765 +13 25 39 68 145 346 837 1954 4338 9181 18700 37050 72020 138034 261208 487500 895339 1614537 2853781 4939576 8370171 +-7 -9 -13 -8 42 219 678 1686 3698 7521 14657 27996 53216 101691 196743 387406 778956 1600221 3349773 7107057 15179205 +16 24 40 65 104 176 320 592 1048 1708 2496 3151 3104 1316 -3928 -15274 -36608 -73424 -133256 -226179 -365384 +-1 13 48 119 245 449 767 1284 2219 4089 8014 16311 33700 69739 143527 292235 585572 1148764 2196908 4083479 7364698 +7 13 38 90 172 282 413 553 685 787 832 788 618 280 -273 -1093 -2237 -3767 -5750 -8258 -11368 +0 -1 7 35 92 188 342 595 1028 1785 3101 5335 9008 14846 23828 37239 56728 84371 122739 174971 244852 +27 47 73 114 189 331 594 1067 1900 3344 5800 9861 16316 26066 39879 57884 78673 97845 105787 84444 2783 +2 -3 5 37 110 259 567 1228 2666 5762 12302 25860 53476 108682 216668 422661 804906 1493979 2700515 4753783 8153866 +2 7 34 93 193 357 646 1190 2236 4245 8109 15629 30517 60387 120517 240638 476686 930395 1780876 3333989 6097449 +21 35 49 61 65 50 -1 -112 -315 -651 -1171 -1937 -3023 -4516 -6517 -9142 -12523 -16809 -22167 -28783 -36863 +11 25 52 109 215 389 663 1131 2061 4105 8657 18436 38415 77283 149720 279890 506719 891729 1530450 2568735 4225663 +7 12 21 34 51 72 97 126 159 196 237 282 331 384 441 502 567 636 709 786 867 +-1 5 24 73 186 425 907 1857 3705 7258 14006 26685 50350 94441 176685 330182 615659 1141583 2095476 3790157 6728418 +15 29 60 126 262 540 1099 2180 4173 7718 13983 25401 47434 92431 187518 390006 816655 1698669 3485638 7045690 14060466 +21 44 79 133 219 349 521 709 881 1097 1789 4415 12831 35974 92880 221911 497941 1065530 2205607 4473153 8983035 +22 47 88 152 257 437 752 1310 2301 4034 6973 11811 19729 33185 57884 107000 209244 422965 859074 1716102 3331013 +19 38 61 94 159 317 705 1587 3419 6928 13205 23812 40903 67359 106937 164433 245859 358634 511789 716186 984751 +15 39 75 123 183 255 339 435 543 663 795 939 1095 1263 1443 1635 1839 2055 2283 2523 2775 +18 29 46 74 118 183 274 396 554 753 998 1294 1646 2059 2538 3088 3714 4421 5214 6098 7078 +1 0 -2 -7 -18 -26 29 336 1343 3952 9792 21583 43604 82278 146887 250430 410637 651152 1002898 1505637 2209738 +9 22 54 107 180 269 367 464 547 600 604 537 374 87 -355 -986 -1843 -2966 -4398 -6185 -8376 +15 30 63 128 258 533 1138 2479 5409 11662 24677 51151 103958 207625 408542 793752 1524859 2897750 5445011 10106818 18508538 +3 11 27 66 172 435 1017 2207 4546 9091 17922 35038 67837 129431 242110 442339 787749 1366667 2310821 3811954 6143186 +26 52 104 199 370 676 1223 2215 4061 7571 14281 26954 50311 92053 164242 285116 481420 791342 1268150 1984633 3038456 +10 20 58 146 322 647 1212 2158 3735 6437 11263 20184 36980 68838 129680 247589 481942 963055 1982435 4192778 9037066 +-3 0 19 79 235 602 1400 3014 6069 11520 20757 35725 59059 94234 145730 219212 321725 461904 650199 899115 1223467 +2 9 16 23 30 37 44 51 58 65 72 79 86 93 100 107 114 121 128 135 142 +8 10 20 50 115 236 457 892 1832 3957 8722 19039 40491 83533 167515 327971 629536 1188172 2208208 4042144 7284363 +5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62 65 +8 26 65 146 316 663 1341 2624 5023 9514 17937 33635 62411 113908 203613 355960 609658 1027726 1717281 2868628 4830662 +9 17 37 78 149 259 417 632 913 1269 1709 2242 2877 3623 4489 5484 6617 7897 9333 10934 12709 +20 38 78 154 280 470 738 1098 1564 2150 2870 3738 4768 5974 7370 8970 10788 12838 15134 17690 20520 +7 24 47 81 136 225 362 557 805 1066 1233 1085 222 -2021 -6684 -15319 -30157 -54308 -91997 -148839 -232156 +0 1 -2 -3 9 62 236 730 1970 4767 10534 21571 41427 75348 130820 218216 351556 549389 835806 1241593 1805533 +3 6 17 53 156 407 939 1945 3678 6448 10644 16862 26335 42111 71980 135406 279566 615947 1402676 3226260 7393115 +10 14 24 34 47 98 296 908 2528 6411 15120 33747 72146 148909 298384 583295 1118426 2117292 3987296 7525720 14319117 +6 9 14 40 129 360 864 1837 3555 6422 11141 19209 34150 64331 129087 271621 585396 1266455 2713600 5713306 11768647 +20 46 99 205 403 741 1279 2113 3437 5662 9612 16817 29922 53229 93386 160233 267810 435526 689481 1063925 1602829 +1 -3 -16 -37 -52 -24 125 554 1603 4032 9538 21770 48166 103065 212703 422887 810357 1499095 2683124 4657661 7860848 +15 27 41 48 38 19 62 398 1607 4947 12880 29877 63658 127217 242445 447220 810212 1462984 2670744 4988351 9600271 +30 55 99 181 341 651 1226 2235 3912 6567 10597 16497 24871 36443 52068 72743 99618 134007 177399 231469 298089 +8 19 40 95 231 522 1073 2037 3667 6440 11313 20214 36973 69143 131709 254841 500234 995487 2006112 4085673 8387151 +12 29 60 119 244 510 1052 2120 4203 8274 16223 31560 60485 113437 207249 368051 635078 1065555 1740846 2774069 4319394 +21 35 62 112 205 390 770 1534 3007 5757 10855 20481 39217 76578 151615 300791 590793 1138511 2141100 3919854 6982573 +-1 0 5 14 27 44 65 90 119 152 189 230 275 324 377 434 495 560 629 702 779 +15 25 54 108 189 298 441 637 927 1383 2116 3282 5085 7776 11647 17019 24223 33573 45330 59656 76557 +13 15 16 23 58 163 406 888 1751 3187 5448 8857 13820 20839 30526 43618 60993 83687 112912 150075 196798 +8 21 34 47 60 73 86 99 112 125 138 151 164 177 190 203 216 229 242 255 268 +0 9 40 105 216 385 624 945 1360 1881 2520 3289 4200 5265 6496 7905 9504 11305 13320 15561 18040 +5 9 31 90 225 511 1093 2256 4558 9063 17712 33854 62927 113248 196881 330673 537887 851569 1322065 2033214 3135009 +14 32 65 126 231 399 652 1015 1516 2186 3059 4172 5565 7281 9366 11869 14842 18340 22421 27146 32579 +16 31 59 114 216 393 692 1217 2225 4328 8874 18619 38863 79316 157097 301464 561142 1015477 1791117 3086528 5207418 +25 48 85 150 280 562 1170 2410 4780 9072 16583 29586 52395 93748 172014 326185 638123 1275552 2571281 5162458 10224290 +25 46 83 141 230 371 602 984 1607 2596 4117 6383 9660 14273 20612 29138 40389 54986 73639 97153 126434 +18 31 60 135 311 678 1382 2668 4956 8961 15868 27573 47001 78512 128406 205538 322054 494259 743628 1097971 1592763 +21 48 96 181 334 609 1091 1904 3219 5262 8322 12759 19012 27607 39165 54410 74177 99420 131220 170793 219498 +18 28 41 75 171 406 911 1901 3730 7004 12834 23400 43124 80886 153787 292822 550230 1006860 1775083 2987825 4756165 +7 16 48 120 261 531 1049 2030 3831 7006 12370 21072 34677 55257 85491 128774 189335 272364 384148 532216 725493 +8 11 29 87 229 520 1042 1880 3091 4646 6332 7598 7326 3505 -7217 -30131 -73246 -148283 -271921 -467335 -766069 +7 13 24 59 160 415 991 2177 4437 8473 15298 26319 43430 69115 106561 159781 233747 334533 469468 647299 878364 +18 32 60 116 213 363 585 940 1624 3168 6820 15212 33440 70732 143055 277580 521391 960022 1757523 3240240 6062704 +-4 -7 -1 28 110 302 699 1445 2744 4871 8183 13130 20266 30260 43907 62139 86036 116837 155951 204968 265670 +22 35 67 129 230 384 629 1065 1918 3637 7031 13453 25038 45002 78009 130613 211782 333511 511531 766121 1123030 +15 33 77 173 374 787 1624 3286 6502 12571 23801 44317 81531 148727 269365 483718 858087 1495811 2547551 4216723 6757554 +18 47 97 189 354 628 1047 1642 2434 3429 4613 5947 7362 8754 9979 10848 11122 10507 8649 5129 -542 +14 25 46 95 214 486 1051 2114 3943 6866 11288 17755 27083 40535 59955 87640 125532 173023 222266 249351 199012 +18 36 60 90 126 168 216 270 330 396 468 546 630 720 816 918 1026 1140 1260 1386 1518 +14 32 64 129 250 457 795 1334 2178 3470 5390 8143 11934 16927 23185 30588 38726 46764 53276 56045 51826 +24 48 80 114 151 204 309 562 1228 3014 7682 19333 46981 109581 245726 532281 1120276 2304490 4659592 9309226 18462519 +9 28 63 134 279 559 1060 1903 3283 5568 9499 16542 29453 53127 95812 170779 298549 509788 848991 1379086 2187099 +8 8 7 5 2 -2 -7 -13 -20 -28 -37 -47 -58 -70 -83 -97 -112 -128 -145 -163 -182 +-1 2 18 60 141 274 472 748 1115 1586 2174 2892 3753 4770 5956 7324 8887 10658 12650 14876 17349 +20 27 34 41 48 55 62 69 76 83 90 97 104 111 118 125 132 139 146 153 160 +10 30 62 108 170 257 399 681 1326 2881 6603 15220 34388 75445 160625 333097 676895 1357967 2711435 5430457 10976083 +23 27 33 52 106 235 504 1010 1889 3323 5547 8856 13612 20251 29290 41334 57083 77339 103013 135132 174846 +4 11 21 34 50 69 91 116 144 175 209 246 286 329 375 424 476 531 589 650 714 +-4 -1 2 10 34 98 272 758 2068 5345 12890 28970 60994 121156 228656 412622 715868 1199635 1949474 3082442 4755794 +21 30 31 25 13 -9 -55 -154 -355 -732 -1389 -2465 -4139 -6635 -10227 -15244 -22075 -31174 -43065 -58347 -77699 +4 12 30 76 187 427 907 1844 3713 7600 15961 34160 73458 156678 328807 676706 1365506 2705112 5269876 10109828 19115437 +9 23 58 116 205 355 653 1320 2867 6390 14107 30327 63214 128026 253037 490173 933684 1752420 3245799 5943513 10791206 +17 16 22 56 148 344 725 1445 2800 5360 10241 19669 38091 74208 144420 278248 526283 971040 1740680 3024798 5090230 +13 16 25 41 65 98 141 195 261 340 433 541 665 806 965 1143 1341 1560 1801 2065 2353 +21 40 64 103 184 349 650 1152 1962 3302 5631 9792 17133 29596 50051 83992 145651 275472 582970 1341041 3177182 +3 6 24 80 206 440 830 1452 2457 4176 7328 13390 25196 47830 89862 164942 293711 505906 842424 1356964 2116682 +12 21 34 62 123 239 446 841 1713 3847 9168 22032 51708 116973 254314 532059 1073914 2096945 3971102 7310034 13106297 +17 19 17 20 47 136 362 858 1829 3555 6414 11046 18963 34255 67667 145431 327161 740367 1644463 3545588 7396567 +11 33 61 102 174 306 538 921 1517 2399 3651 5368 7656 10632 14424 19171 25023 32141 40697 50874 62866 +10 22 44 75 115 171 284 598 1506 3938 9915 23607 53356 115562 242174 495118 993898 1967721 3852127 7463913 14308751 +9 12 19 51 139 320 640 1186 2180 4174 8380 17155 34671 67931 128748 238449 439487 822724 1587149 3161951 6441487 +11 32 68 126 212 338 545 948 1813 3685 7610 15551 31215 61722 120906 235602 457115 881274 1682148 3166760 5861114 +4 6 11 16 18 14 1 -24 -64 -122 -201 -304 -434 -594 -787 -1016 -1284 -1594 -1949 -2352 -2806 +5 14 17 8 -10 0 154 721 2238 5692 12832 26749 53001 101813 192341 360811 675779 1266182 2371803 4432002 8238072 +7 17 40 78 149 302 645 1396 2970 6128 12256 23945 46252 89397 174271 343099 679057 1340763 2620584 5039928 9500511 +11 26 61 121 225 420 795 1495 2735 4814 8129 13189 20629 31224 45903 65763 92083 126338 170213 225617 294697 +6 5 11 28 67 169 437 1072 2412 4986 9617 17649 31475 55807 100744 188965 371746 762575 1603683 3390746 7095403 +11 14 26 58 124 244 467 942 2078 4844 11280 25359 54540 112843 227363 452379 899585 1801110 3636518 7379896 14964376 +7 13 23 37 73 185 497 1265 2992 6660 14232 29750 61661 127515 263009 538679 1089674 2167524 4228610 8083880 15151202 +12 34 65 112 187 307 494 775 1182 1752 2527 3554 4885 6577 8692 11297 14464 18270 22797 28132 34367 +24 45 76 117 168 229 300 381 472 573 684 805 936 1077 1228 1389 1560 1741 1932 2133 2344 +20 42 81 151 274 474 782 1271 2159 4052 8462 18855 42715 95570 208876 445649 931901 1920493 3921194 7964326 16129275 +14 15 20 43 112 286 687 1547 3270 6509 12258 21959 37624 61972 98581 152055 228206 334251 479024 673203 929552 +16 26 49 113 263 564 1104 1997 3386 5446 8387 12457 17945 25184 34554 46485 61460 80018 102757 130337 163483 +13 21 44 91 174 319 600 1215 2635 5876 12970 27755 57206 113784 219872 416611 781841 1466127 2763048 5241467 9985262 +10 18 39 92 210 445 881 1679 3202 6299 12868 26894 56330 116568 237008 473629 932842 1815712 3497445 6665552 12552178 +23 44 67 91 132 234 485 1058 2316 5059 11078 24359 53620 117500 254920 545448 1149018 2383217 4873604 9845500 19687217 +6 0 -11 -24 -30 -11 77 345 1046 2694 6237 13294 26466 49731 88933 152375 251526 401852 623781 943812 1395778 +18 30 64 146 315 625 1163 2110 3899 7565 15437 32402 68116 140840 284229 559773 1080416 2056576 3886978 7338046 13894977 +6 15 34 63 102 151 210 279 358 447 546 655 774 903 1042 1191 1350 1519 1698 1887 2086 +4 14 24 34 50 101 285 867 2467 6406 15343 34475 73848 152844 308861 613987 1206919 2354222 4568737 8840286 17087455 +-5 -9 -17 -29 -45 -65 -89 -117 -149 -185 -225 -269 -317 -369 -425 -485 -549 -617 -689 -765 -845 +12 24 36 48 60 72 84 96 108 120 132 144 156 168 180 192 204 216 228 240 252 +13 30 61 121 241 471 883 1574 2669 4324 6729 10111 14737 20917 29007 39412 52589 69050 89365 114165 144145 +7 7 -2 -12 11 151 577 1589 3675 7579 14380 25582 43215 69947 109207 165319 243647 350751 494554 684520 931843 +11 27 66 148 300 556 957 1551 2393 3545 5076 7062 9586 12738 16615 21321 26967 33671 41558 50760 61416 +14 30 69 146 276 472 751 1158 1814 2986 5175 9257 16882 31826 64146 141378 335518 822406 2003157 4737816 10772536 +10 15 24 43 93 234 605 1484 3378 7172 14414 27913 53008 100168 190085 363322 698366 1345713 2593620 4997599 9637955 +1 -1 -5 -2 23 101 300 757 1721 3607 7061 13036 22879 38429 62126 97131 147457 218111 315247 446330 620311 +-1 -2 13 54 133 274 525 984 1863 3623 7219 14497 28785 55717 104323 188409 328239 552516 900641 1425208 2194669 +11 8 19 60 145 283 475 711 967 1202 1355 1342 1053 349 -941 -3023 -6141 -10580 -16669 -24784 -35351 +-3 3 25 83 214 475 946 1733 2971 4827 7503 11239 16316 23059 31840 43081 57257 74899 96597 123003 154834 +19 33 57 102 193 384 789 1647 3461 7290 15348 32218 67296 139654 287521 586270 1181494 2347838 4590050 8810205 16573334 +16 32 67 130 228 380 644 1157 2188 4204 7949 14536 25552 43176 70310 110723 169208 251752 365719 520046 725452 +-4 -7 -10 -13 -16 -19 -22 -25 -28 -31 -34 -37 -40 -43 -46 -49 -52 -55 -58 -61 -64 +6 0 -1 13 58 174 463 1168 2842 6700 15319 33986 73261 153834 315684 635168 1256474 2448851 4710185 8954744 16855508 +17 21 26 32 39 47 56 66 77 89 102 116 131 147 164 182 201 221 242 264 287 +18 24 30 36 42 48 54 60 66 72 78 84 90 96 102 108 114 120 126 132 138 +8 18 38 78 161 336 706 1485 3117 6535 13723 28886 60754 126884 261373 528410 1046221 2030675 3878211 7329809 13802378 +1 17 57 142 316 673 1404 2874 5755 11276 21706 41270 77840 146004 272601 506680 937325 1725195 3157359 5740566 10356100 +13 22 36 71 173 434 1019 2218 4544 8913 16968 31651 58210 106027 192137 348404 636607 1180136 2229164 4290479 8377331 +20 33 62 124 239 433 751 1295 2308 4335 8522 17186 34930 70824 142590 284445 561536 1096265 2116210 4041472 7643885 +12 19 31 71 180 417 862 1628 2883 4886 8068 13259 22292 39418 74260 147476 301083 617090 1252234 2506948 4971597 +16 35 58 84 129 256 635 1653 4095 9414 20107 40227 76106 137465 239274 405034 672626 1104557 1805384 2950374 4831127 +15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 +4 10 24 67 168 369 753 1517 3130 6644 14264 30331 62930 126403 245125 458989 831144 1458638 2486736 4127811 6685844 +13 20 27 34 41 48 55 62 69 76 83 90 97 104 111 118 125 132 139 146 153 +5 16 45 111 258 579 1257 2639 5370 10625 20488 38538 70713 126534 220782 375732 624059 1012542 1606703 2496529 3803436 +-6 -11 -12 -1 30 89 184 323 514 765 1084 1479 1958 2529 3200 3979 4874 5893 7044 8335 9774 +21 28 48 94 179 316 518 798 1169 1644 2236 2958 3823 4844 6034 7406 8973 10748 12744 14974 17451 +20 40 75 133 225 363 558 818 1146 1538 1981 2451 2911 3309 3576 3624 3344 2604 1247 -911 -4083 +-5 -5 -10 -19 -16 51 304 986 2544 5790 12260 25049 50716 103457 213853 446457 933805 1939865 3974510 7993713 15739652 +16 18 28 61 142 309 631 1256 2504 5020 10002 19519 36934 67447 118773 201970 332432 531062 825640 1252401 1857838 +9 26 54 85 113 139 174 240 369 600 974 1527 2281 3233 4342 5514 6585 7302 7302 6089 3009 +14 28 45 76 143 279 537 1027 2014 4145 8946 19863 44343 97800 210836 441850 898246 1770938 3388859 6302846 11411751 +21 40 65 95 140 248 555 1371 3318 7539 16000 31910 60287 108701 188228 314652 509955 804138 1237419 1862857 2749454 +9 28 69 145 272 472 779 1255 2034 3432 6198 12056 24835 52745 112772 238757 495479 1001904 1967523 3746087 6910594 +29 41 51 59 65 69 71 71 69 65 59 51 41 29 15 -1 -19 -39 -61 -85 -111 +7 12 26 60 128 241 409 655 1039 1689 2845 4945 8822 16140 30276 57954 112055 216162 411548 767474 1395828 +21 33 45 57 69 81 93 105 117 129 141 153 165 177 189 201 213 225 237 249 261 +27 43 57 67 78 121 289 797 2086 5009 11158 23415 46838 90026 167145 300838 526281 896675 1490467 2420551 3845586 +11 38 78 144 259 448 722 1052 1345 1456 1294 1103 2028 7144 23332 64994 162268 380677 869401 1978519 4534958 +27 49 92 166 278 444 709 1166 1960 3258 5161 7529 9685 9959 5028 -10997 -47791 -120401 -251262 -472712 -830080 +12 24 37 58 116 281 689 1587 3434 7123 14425 28799 56762 110070 209025 387294 698704 1226562 2096141 3491072 5674488 +10 25 59 131 272 525 941 1574 2476 3690 5253 7284 10390 16936 34267 81829 205414 503567 1173671 2588513 5418388 +15 22 35 54 79 110 147 190 239 294 355 422 495 574 659 750 847 950 1059 1174 1295 +7 16 25 34 43 52 61 70 79 88 97 106 115 124 133 142 151 160 169 178 187 +-4 -3 7 42 130 311 637 1172 1992 3185 4851 7102 10062 13867 18665 24616 31892 40677 51167 63570 78106 +7 20 49 103 202 387 744 1466 2987 6226 12972 26422 51863 97498 175531 304013 510955 844516 1397947 2367673 4181236 +6 26 73 177 381 744 1358 2398 4230 7602 13946 25860 47997 89012 166166 316082 618662 1247330 2569083 5334503 11023997 +7 20 51 111 217 413 816 1711 3744 8301 18213 38991 80870 162026 313424 585857 1059845 1859178 3169007 5259511 8516295 +24 38 64 115 219 438 907 1901 3931 7858 14997 27161 46568 75502 115582 166451 223650 275390 297878 248791 58425 +8 22 50 114 257 555 1137 2218 4144 7436 12800 21040 32769 47757 63683 73968 64256 6978 -146722 -478602 -1119591 +27 55 94 155 260 437 719 1147 1772 2646 3787 5098 6215 6254 3422 -5548 -26183 -67327 -142524 -271787 -483818 +5 11 17 23 29 35 41 47 53 59 65 71 77 83 89 95 101 107 113 119 125 +21 42 77 130 209 333 553 1010 2061 4521 10111 22298 47924 100469 206712 420389 850041 1715168 3457893 6961526 13970951 +23 37 51 65 79 93 107 121 135 149 163 177 191 205 219 233 247 261 275 289 303 +8 16 31 66 153 353 781 1672 3523 7350 15098 30236 58558 109195 195822 338018 562706 905564 1412257 2139294 3154263 \ No newline at end of file diff --git a/2023/09/src/data.rs b/2023/09/src/data.rs new file mode 100644 index 0000000..5b7bd47 --- /dev/null +++ b/2023/09/src/data.rs @@ -0,0 +1,5 @@ +#[cfg(test)] +pub const EXAMPLE1: &'static str = include_str!("../data/example1"); + +#[allow(unused)] +pub const INPUT: &'static str = include_str!("../data/input"); diff --git a/2023/09/src/history.rs b/2023/09/src/history.rs new file mode 100644 index 0000000..effb3b0 --- /dev/null +++ b/2023/09/src/history.rs @@ -0,0 +1,55 @@ +use std::{num::ParseIntError, str::FromStr}; + +#[derive(Debug)] +pub struct ParseError; + +impl From for ParseError { + fn from(_value: ParseIntError) -> Self { + Self + } +} + +#[derive(Debug)] +pub struct History(pub Box<[i64]>); + +impl FromStr for History { + type Err = ParseError; + + fn from_str(s: &str) -> Result { + Ok(Self( + s.split_ascii_whitespace() + .map(|s| s.parse()) + .collect::>()?, + )) + } +} + +impl History { + pub fn next_value(&self) -> i64 { + if self.0.len() <= 1 { + return 0; + } + let diffs = History(self.0.windows(2).map(|s| s[1] - s[0]).collect()); + self.0[self.0.len() - 1] + diffs.next_value() + } + + pub fn prev_value(&self) -> i64 { + if self.0.len() <= 1 { + return 0; + } + let diffs = History(self.0.windows(2).map(|s| s[1] - s[0]).collect()); + self.0[0] - diffs.prev_value() + } +} + +#[test] +fn next_value() { + let h = History(Box::new([0, 3, 6, 9, 12, 15])); + assert_eq!(h.next_value(), 18); +} + +#[test] +fn prev_value() { + let h = History(Box::new([10, 13, 16, 21, 30, 45])); + assert_eq!(h.prev_value(), 5); +} diff --git a/2023/09/src/main.rs b/2023/09/src/main.rs new file mode 100644 index 0000000..9ab0c36 --- /dev/null +++ b/2023/09/src/main.rs @@ -0,0 +1,11 @@ +mod data; +mod history; +mod part1; +mod part2; +mod puzzle; + +fn main() { + use data::INPUT; + println!("Part 1: {}", part1::run(INPUT)); + println!("Part 2: {}", part2::run(INPUT)); +} diff --git a/2023/09/src/part1/mod.rs b/2023/09/src/part1/mod.rs new file mode 100644 index 0000000..97bdaba --- /dev/null +++ b/2023/09/src/part1/mod.rs @@ -0,0 +1,17 @@ +use crate::puzzle::Puzzle; + +pub fn run(input: &str) -> i64 { + let puzzle: Puzzle = input.parse().expect("parse failed"); + puzzle.histories.iter().map(|h| h.next_value()).sum() +} + +#[cfg(test)] +mod test { + use super::*; + use crate::data::EXAMPLE1; + + #[test] + fn test1() { + assert_eq!(run(EXAMPLE1), 114); + } +} diff --git a/2023/09/src/part2/mod.rs b/2023/09/src/part2/mod.rs new file mode 100644 index 0000000..5e92c7c --- /dev/null +++ b/2023/09/src/part2/mod.rs @@ -0,0 +1,21 @@ +use crate::puzzle::Puzzle; + +pub fn run(input: &str) -> i64 { + let puzzle: Puzzle = input.parse().expect("parse failed"); + puzzle + .histories + .iter() + .map(|h| h.prev_value()) + .sum() +} + +#[cfg(test)] +mod test { + use super::*; + use crate::data::EXAMPLE1; + + #[test] + fn test1() { + assert_eq!(run(EXAMPLE1), 2); + } +} diff --git a/2023/09/src/puzzle.rs b/2023/09/src/puzzle.rs new file mode 100644 index 0000000..a8336d7 --- /dev/null +++ b/2023/09/src/puzzle.rs @@ -0,0 +1,27 @@ +use std::str::FromStr; + +use crate::history::History; + +#[derive(Debug)] +pub struct ParseError; + +impl From<::Err> for ParseError { + fn from(_value: ::Err) -> Self { + Self + } +} + +#[derive(Debug)] +pub struct Puzzle { + pub histories: Box<[History]>, +} + +impl FromStr for Puzzle { + type Err = ParseError; + + fn from_str(s: &str) -> Result { + Ok(Self { + histories: s.lines().map(|s| s.parse()).collect::>()?, + }) + } +} diff --git a/2023/10/.gitignore b/2023/10/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/2023/10/.gitignore @@ -0,0 +1 @@ +/target diff --git a/2023/10/Cargo.toml b/2023/10/Cargo.toml new file mode 100644 index 0000000..7b5b0c9 --- /dev/null +++ b/2023/10/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "y2023d10" +version = "0.1.0" +edition = "2024" + +[dependencies] +anyhow = "1.0.99" +game-grid.workspace = true +thiserror = "2.0.15" +direction.workspace = true diff --git a/2023/10/data/example1 b/2023/10/data/example1 new file mode 100644 index 0000000..73b3d66 --- /dev/null +++ b/2023/10/data/example1 @@ -0,0 +1,5 @@ +..... +.S-7. +.|.|. +.L-J. +..... \ No newline at end of file diff --git a/2023/10/data/example2 b/2023/10/data/example2 new file mode 100644 index 0000000..3c00cf2 --- /dev/null +++ b/2023/10/data/example2 @@ -0,0 +1,5 @@ +..F7. +.FJ|. +SJ.L7 +|F--J +LJ... \ No newline at end of file diff --git a/2023/10/data/example3 b/2023/10/data/example3 new file mode 100644 index 0000000..6933a28 --- /dev/null +++ b/2023/10/data/example3 @@ -0,0 +1,9 @@ +........... +.S-------7. +.|F-----7|. +.||.....||. +.||.....||. +.|L-7.F-J|. +.|..|.|..|. +.L--J.L--J. +........... \ No newline at end of file diff --git a/2023/10/data/example4 b/2023/10/data/example4 new file mode 100644 index 0000000..2e5dcbb --- /dev/null +++ b/2023/10/data/example4 @@ -0,0 +1,10 @@ +.F----7F7F7F7F-7.... +.|F--7||||||||FJ.... +.||.FJ||||||||L7.... +FJL7L7LJLJ||LJ.L-7.. +L--J.L7...LJS7F-7L7. +....F-J..F7FJ|L7L7L7 +....L7.F7||L7|.L7L7| +.....|FJLJ|FJ|F7|.LJ +....FJL-7.||.||||... +....L---J.LJ.LJLJ... \ No newline at end of file diff --git a/2023/10/data/example5 b/2023/10/data/example5 new file mode 100644 index 0000000..fbc0300 --- /dev/null +++ b/2023/10/data/example5 @@ -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 \ No newline at end of file diff --git a/2023/10/data/input b/2023/10/data/input new file mode 100644 index 0000000..c9972df --- /dev/null +++ b/2023/10/data/input @@ -0,0 +1,140 @@ +F-F-JJF7.F7.F-LJ7-|77.L|.FJ7--7LFL|-|F-.|--7.F7-F-.F|-FL7.FF7.F77-FLLJFLF--.FL--FF--7..FJ-L-LL-J..F-J77FF|-FF77FL|-|7J-7--7J-L77.FL.FL|-F7F- +LJ|.L-|-FF|J|L|||.L7J.FJF7-77.|7||L7F7-F77-|7|J.-.F-7F|L---L77..--|FL.F|L7FFF.FFF7..L77F.F|7.J7L7-JF.JJF-7.F--L7.7-L7..|L--7.L-.L|FFL-JL|F-J +L.|FL7|F|||LJFL-LJ-JJF7JF|-7-FJF7J-L.7.F|-7L7||L.FJFJ7J7L7.LFL-LJ.|F|--|.F7F7-FFJL7--LFJFLLF.L||L7|.7L-|7F7F|||.FF7LL7F7J.|-F7-7J.L.|7L.-L-| +LLF7-J7FL|..J-FLJL----JL-.L|JF7-J7F|7J.L|LJ.LLJJFL7L7F7F7777J.L|FFL|.|F|F||||-FL-7L7J.JF7.LL-7|7.7-FJ7LF-J|F7F-7FJ|7||FL.FF7LF-LJLJ7FJ.|-LF- +FL|F-LFJ7LJ7.F-..L|-JL-7LJLL-JLFLLFJL7--L7|.FJ|LF7L7||||L7|F-7.L7-JJLF7F-JLJ|-|F7|FJ7F-JL-J|7JLL7|.L|J-L-7|||L7LJFJF7L77F-|L-F7JF||LJJ|-7LLJ +FF|J7-LJ7L||FJ7...F-L-|-|J.LL|-777|F-F7|.-77.FFFJ|FJLJLJFJ-JFLF-JLFF7||L---7L7FJLJ|77JF-7...F7L7J7F.J7.F-J||||L-7|.|L-7JJJ|JFLJ|L7||FL7J|-|| +FJJJF-|L7F777-|FFFJ.L-J|.FF.|.F-JJ-7.||FJL||FF-JFJL7F---JJ.|F..FF|L|FJL7-F-JFJL--7L7F7-F77-|.-J|.F|L.|7L-7||L7F7|L7|F-JJJ|JFJLL|F--LJF7FL.|- +|J.FL7J7|J|L|F-F-LJ--|-JFJ7--7|L.|.L-|F7JJF-7|F7|F7||F7JFL-F-7.FJFF7L-7L7L-7|F-7-L7|||L||7-LL7.-7L|JF-7F-J|L7|||L7LJL-77|.FLJ7-L7JL|||LFJFJ. +L--7LJLJ7-J-JJ.L|J7.||-L7--7|.||FF-JLFJ|7F|FJLJ|||||LJ|JF-|JL-7.F7F7F7L7|LFJLJFJFL||||FJL7.|F-JJLF7.L7|L-7L-J|||FJF7F-JF77-|-JJFJ-FLF7.L7|.F +..|LL|.|J.|.JJL-|FL-JJ-L|7FLF7.FF-7F-L7L7FJL7JFJ||LJF-J7J.FFJ-F-||||||FJL7|F--JF7FJ||LJF-J-7FL7FFJL7-||F7L-7FJ|||FJLJF7-L-7L7..|..F-|.F-|7-| +.FLF-L-FF7L7L-|7F--|FL..|F7L||.L7LFL.FJFJL7FJFJFJL-7|F--77||LFF7|||||||F7LJ|F77|||FJ|F-J-F7F7LF-L-7|FJLJL7FJL-J|||F--JL-7FF7J7-JFL-J..L|L-.| +.|.L-LJ|77.|FLL-JL-FJFJJ-F7FJ|7F-7|LFL7||FJL7L7L7F7|||F-JF7JL||LJLJ|||LJL7FJ||FJLJL-JL-7L|LJ|-F7F7||L7F7FJL-7F-J|||F----JFJ|7F7J|FF-J.FL|JFF +7L7|F|7LJF-J-J||J.|.JJ7F||||FJ7-F|7-F-JL7L-7|FJFJ|LJ||L-7||J.FL---7||L-7.|L7||L-7F7F7F-J-L-7L-J||LJL7LJ||F-7||F7||||F7|F7L7|F7-7FL-.LF.JJ7F7 +L.L77777FJL|.--|.LF7|.F--J||L-7F7|F7L--7L--J||FJ-L-7LJF7LJL-7F---7||L-7L7|FJ||JFJ||||L--7F7L7F-JL7F-JLFJ|L7LJ||LJLJLJL-JL-J|||.L7.|7|LF|LFJ| +FL7L|.LFJ.-FJ|.JF|JFL-L--7|L7FJ|L-J|F-7L--7FJ|L--7JL7FJL----JL--7LJL--JFJ|L-JL7L7|LJL---J||FJ||F-JL7F7|FJFL-7LJF-7F-7F-7F--J|L7L|F7-77|..J-- +FF-7JF7FJ7J..L-LLL-JLF.F-JL-J|FL-7FJL7L---J|FJF--JF7|L-7|F77F7F7|F--7F7L7L---7|FJL7F7F7.L||L7L7L--7||||L7F--JF7L7||FJ|FJL7F-JFJ---J|LF7-J-LJ +L-J7-LJ|.JJ-F|-.|FFJ||FL7F--7L7F7||F7L----7|L7|F7-||L-7L7|L7||||LJF-J|L7|F--7||L7FJ|LJL7FJ|FJFJJF-JLJ||FJL--7|L-JLJL-JL--J|F-J-|7|F7FJ.JLF.| +L7JF.L|7.|.-7FJ--7FJ|LF|LJF7L7||||LJ|F7F-7||-|||L7|L--JFJ|FJ|LJL7-L-7L7LJL-7LJL7|L7|F--JL7|L7|F7L---7||||F7FJL---------7F7|L---7F|7.L-|JF77L +FJ.|..J-7FJ--JJFLJL77LFF-7||FJ||LJF-J||L7LJ|FJLJFJL-7F-JFJL7L7F-J|F7L7|F--7L--7||FJ|L--7FJL-JLJL7F-7|||L7|||F----------J|||F---JJ-7..|.-JLFJ +L7FJF-L||77L|7J||FJ.LF7L7LJ||FJL-7|F7||FJF-JL--7L-7FJL7LL7FJFJL-7FJL7|||F-JF7FJ|||J|F--JL-7F-7F-JL7LJ|L7LJ||||F7F7JF7F7FJLJL---7J|J.-77|J.|J +LLJL7J--L7--F7F7-7LLFJL7L-7||L7F-J|||||L7||F7F-JF-JL-7L7FJL7|F7FJL-7LJLJL--J|L7||L7||F7JF7LJFJ|F7|L-7|F|F7|||FJLJL7||||L-7F----J7|7FJ7---7.| +FJFFJ.-.|.FF-77J|-7LL-7L--J||FJL-7LJLJL7|L7||L-7L-7F7|FJ|F-J||LJF7F|F7F7F7F7L-J|L7LJLJL-JL7FJFJ||FF-JL7LJ|||||F---J||||F7||F7JLF--77JLFJ||F- +|-77FL-LJ-FJF-.FF.F7F-JF--7|||F7FL----7||FJ|L7FJF-J|LJL7||F7|L7FJL7LJLJ||LJL--7|FJF7F7F-7FJL7|J|L7L-7FJJFJ||LJL7F--J||LJ||LJL-7L-7L7..|L|F7| +F-7-77FJ|-F--.F7|FF7L--JF7||||||F-7F7FJLJL7|FJL7L77L-7FJ|||||FJL-7|F7F7||FF--7|LJFJLJ|L7LJF-J|FJFJF7||F7L7|L7F-J|F--J|F-J|F--7L7FJFJ7-LFL-L- +|LL|L-JLFJ|F|F7-F7|L7F--JLJLJLJ|L7||||F--7LJL-7|FJF7||L-JLJLJL7F7|LJ|||LJFJF7|L7FJ.F7L-JF7L-7||FJFJLJ|||FJ|FJL--JL--7|L--J|F7L-JL7L-7.7|--J. +|LF--7JFJFF--J|F|LJFJL--------7|FJLJ|LJF7L7F--J|L7|L7|F-------J||L7FJ|L-7L7||L7||F7|L--7||F7|||L7L--7||LJFJL7F---7F-J|F---J||F7F-JF7|F-J-F7. +7F||LL.L--L--7L7L-7L--7F7F7.F-J|L--7|F7|L-J|F7-L7LJFJ||F7F7F-77||FJ|FJF7|FJ|L7LJLJ||F--J||||||L7L7F-J|L-7||FJL-7|LJF7|L7F7L|LJLJF7|LJJ7.|L7- +LF7F7.|7F-F-7|FJF7L--7LJLJL7L-7|F7FJLJ|L--7||L7LL-7L7|LJ|||L7L7||L7||FJLJL7|FL-7F-J||F7.||||||FJFJL-7||FJL7L7F-JF--J|L7|||FJF7F7|LJJL7F-F7|L +|FJJJFJF.FL7LJ|||L7F7L----7L-7|LJ|L-7FJF7FJ||FJF--JFJ|F-J|L7L7|||FJ||L7|F7LJF7FJL7FJLJL7||||||L7L-7FJL-JF7|FJL-7L-7FJFJLJLJFJLJLJF|||LJ.LL|| +||FLJL7.F7-L-7L7L7|||JF7F7L-7||F-JF7||FJ|L7LJL7L--7|FJ|F7L7L7||||L7|L7L7||.FJ|L7FJL7F7FJ|||||L7|F-JL--7FJ|||F--JF7||FJF----JF7F|-|FL|F7-F-L- +|77.FLLFJL7F7L7|FJ|||FJLJ|F7|||L7FJ|||L7|FJF--JJF7|||FJ||F|FJ|LJ|FJL7|FJ||FJFJ||L-7||LJFJLJLJFJ||F7F7-||J||||F7|||||L7|F7F7FJL-7LJ-LJ7J.7-LJ +LJ-J-F.L-7LJL-J|L7LJLJF-7||LJ||FJL7LJ|FJ||FJ.F-7|LJLJ|FJL7|||L-7||F7||L7||L7L7FJF7||L-7|F---7|FJ||||L7|L7LJ|||L-J||L-JLJLJLJF--J7|JL|J|FL7.| +|7|..F--7L----7|LL----JFJLJF7|||F7L-7|L7LJ|F7L7|L---7|L7FJ||F-7|LJ|LJL7|||FJFJL7|LJ|F-JLJF7-||L7||||FJ|FJF7|LJF7FJL7F7F7F--7L-7F7F77JF-77.-L +.L-F7|F7L-7F--J|F-7F-7.L---J||||||F-JL7L-7||L7||F-7FJL-JL7|||FJL-7L7F7|||||FJF-JL7FJL7F7FJL7|L7|||||L7||FJ||F-JLJF7||LJLJF7|F-J||||J-F-J7-LL +FL---LJ|F7LJF-7LJFJL7L-7F7F7|||LJ|L-7FJF7|||FJ||L7|L--7F-J||||.F7|FJ||||||||FL-7FJ|F-J||L7FJ|FJ||||L7||||FJ|L7JF-JLJL----J||L--JLJ|JFL-|.F|. +-FJJ|.L|||F-JJL-7|F7|F-J|LJ|||L-7|7FJL7|LJ|||FJL7|L7F-J|F7|LJ|FJ|||FJ||||||L7F7|L7||F7||FJL7|L7||||FJ||||L7|FJFJF7F7F--7F7|L-7F7F-J77|L|7F-7 +.J-L7FLLJLJF7F7FJLJLJL-7L-7LJL--JL-JF-JL7FJ||L7L||FLJF-J|||7FJ|FJ|||-LJ||LJFJ|||FJ|||LJ||F-JL7||||LJFLJ||FJ|L-JFJ||LJF7LJ|L-7LJLJ.LJJ7F-7|.J +L7F-7-F7F7FJLJLJF7F7F-7L--JF7F7F7F-7L-7FJL7||FJFJL--7L7FJ|L7L7||FJ|L-7FJL7FJFJLJL7||L-7||L7F7|LJ|L--7.FJ||J|F7FJFJL--JL-7|F7L--7F77.FL7.-J-| +||J-F-JLJLJF7F-7|LJ||-L7F7FJ||||LJ|L7FJL7||||L7|F7F-JF||FJFJF||LJFJF7||F-J|FJJF--J||F7|||FJ|||F-JF-7L7L-JL-J|LJLL7F7F---JLJ|F7FJF7777|FF.F7| +7.|.L7F-7F-JLJFLJF7LJF-J|||FJ|LJF7F-JL-7L7LJ|FJ||||F--J|L7|F-JL7FJFJLJ|L7FJL-7|F-7|||||||L7||||F7L7|FJLF---7L-7L|LJ|L-----7||||FF-7LFL-F7L7J +-7F-7LJFJ|F---7F7||F7L--J||L-JF-J|L--7|L7L-7LJL|||||F7FJFJ|L7F7|L7L-7L|FJL7F7||L7||||LJ|L7|||||||FJ||F7L-7LL-7L7F7FJF-----JLJ|L-JFJLFJL|F-|| +LF|.LF-JFJL--7LJLJLJ|F7F7LJF-7L-7L---JF7L7FJF--J|LJ||||FL7|LLJ||||F7|FJ|F7LJ|||FJ|||L-7|FJ||LJ||||JLJ||F7|F7.L7LJ|L7L---7F7F7|F-7L-7L-7FJF|7 +F7LFJL--JF---JF7F--7LJLJL7JL7|F7L7F---JL7LJ7L--7L-7LJ||F7|L7F-JL7||LJL7LJ|7FJ||L7||L7FJ||7|L7FJ|||F--JLJ|LJL-7L7FJFJF7F7LJ|||LJF|F-J-L-|-LFJ +LL7J7J.L-|F--7|LJF7|F---7L--JLJ||LJF-7F7L----7FJF-JF7|||LJFJL7F7||L--7L7FJFJFJL7|LJFJL7|L7|FJL7||||F7F-7L--7FJ7|L7L-JLJ|F-J|L--7LJ.L||L|7JJJ +F7JFF--J.LJF-J||FJLJL7F-JF--7F7L---J.LJ|F7F--JL7L-7||||L7FJLFJ|LJL7F7L7||FL7L7FJL-7L-7||FJ|L7.LJLJLJLJFL--7|L7FJFJF--7|LJF-JF-7L7-F-|7LL|-77 +7LLFJ|.F-LFJF7L7|F7F-JL--JF7LJL--7F---7LJ|L7.F7|F7LJ|LJFJL-7L7L-7FJ|L-J|L-7|FJ|F-7L7FJ||||L-JF----7|F7F---JL-JL7L-JF7|F--JF7L7L-J7|||77.-.LF +|F7L-7FLJ-L-JL7|LJLJF-----JL-----J|F--JF7L-JFJLJ|L-7L7-L7F7L7|F-JL7L7F7L-7|||L|L7|FJL7||L-7F-JF7F7|FJLJF------7L---JLJ|F--JL-JF--7J-LF7FL.FJ +LF--||||-7.F|.LJF7F7L-7F-7F-7F-7F-JL7F7|L7F-JF7FJLFJFJF-J|L7|LJF7FL7LJL7FJ||L7L7||L77LJ|F-J|F7||||LJF-7|F-----JF7FF7F-JL---7F-JF-J7.L|JFJ-|J +LLJLLLJJ-77|-F--JLJL7F||7LJJLJFJ|F--J|LJFJL-7||L7FJFJ7|F7|FJL--JL-7L7F7||FJ|FJJ||L-JF--JL-7LJLJLJL--JFJ|L7F7F7J|L7|LJF-----JL-7L7LF77JFF-F|. +7L-77.|FL-7.FL-----7L7LJF---7-L-JL---JF-JF7FJ||FJL7L-7||||L7F-7F--JFJ||||L7|L-7LJ.F-JF7F7FJ-F7F7F----JFJ.LJLJL7|FJ|F-JF7F7F-7FJFJFJL7J||FJJ. +|7|LL.LF7L-F7F--7F7L7L-7L--7L-7F------JF7||L7||||FJF7||||L7|L7|L-7FJFJ|||FJ|F7L--7|F7|||||F7|LJ|L7F--7|F--7F-7LJL-JL-7||||L7||FJF|F-JJ|77.L7 +L|F|.|L7JL|F-JF7LJL-JF7L---JF7LJF7F----JLJL7LJLJFJFJ||||L7||FJ|F-J|FJ|LJ||FJ|L--7||||||||||LJF7L7LJF7LJL-7|L7L7F7F7F-J|LJL7||||F-J|J..|LF7.J +L|--J7-|7--L--JL-----JL-----J|F7|||F-------JF7F7L-JFLJ||FJ||L7||F7||F7-FJ|L7L--7||||||||||L7FJL7L7FJL----JL-J.|||||L7L|F--J|||LJF-J-F77F.J-7 +LJL|JFF777LLJ-F7F7F7F-7F7F7F7LJLJLJL----7F7FJ||L-----7|||FJL7||LJ||||L7L7L7L7F-JLJ||||||||7||F7L7|L--7F7F7F7F7LJLJL-JFJL7F7|LJF7L--7JLF-7J.| +FL.|-JJL-J---FJLJLJ|L7||LJLJL--7F7LF---7LJ||FJ|F-----JLJLJLFJ|L7FJ|LJFJFL-JJ|L-7FFJ|LJLJ||FJ||L-JL---J|LJLJLJL-7F7F--JF7LJLJF-JL7F7|7-LJJF-- +-J7J.|7.LFJ|7L----7L-J|L--7F7F7LJ|FJ|F7L-7LJL-JL----7F-7F--JFJFJL7L7FJLF----JF-J-|FJLF7FJ||FJL----7F7FJF7F-----J|||F--JL7F--JF7JLJLJJ|FF-|7| +L-J-J--J7F7F-7F7F7L7F7L-7JLJLJL-7|L--JL-7L7F-7F7F---J|FJL-7FJ|L7FJFJL7FJF7F-7L-7FLJF-J|L-JLJF-----J|||FJLJ7F7|F7|LJL7F77LJF--JL7F7JFFJ7J|L77 +F||FF|J7F||L7||||L-J|L-7|F7F7F--JL--7F--JFJL7|||L----JL7F-JL--7||.L7FJL-J||FJF7L-7.L-7|F7F-7L----7FJLJL----JL7|||F--J||F--JF7F7LJ|--JLL-JJ|- +L--L7-7-FJL-JLJLJF--JF7|||||LJF7F--7|L--7|F7|LJL--7F--7|L-7F7FJ||F-J|.LLL||L7||F-JF-7|LJLJFJLF7F7LJF--------7LJLJL-77|LJF--JLJ|F-J7.LF-7J||| +L|.|.FF-L--------J|F-JLJLJLJF7|||F-JL---JLJ|L----7|L-7|L7FJ|LJJLJ|F7L-7JL||FJ|||F7L7|L---7L7FJLJL-7L-7F--7F7L--7F--JFJF7L----7||JF-7J|FJ7L7L +7J.L-|.FF---------7L-7F-7F-7|LJLJL-7-F--7F7L-7F-7||F7||FJL7L--7|7||L7FJ7-LJL-JLJ|L-J|F7F7L7|L--7F7|F7LJF-J||F7-LJF7.L7|L---7FJLJ.|FJL77F|LJJ +-7|JJLF-L--7F7F--7L--JL7LJFJL-7F---JFJF7LJL-7|L7||LJLJLJJ.L7F7L-7||-||F||L|L-JJFJF-7||LJL7||F-7LJ|LJ|F-JF-JLJ|F7FJL--JL7F7||L7F7FJL-7|F-LFJ7 +L-77-LJJL7LLJLJ7FJF7F-7L-7L--7|L----JFJL-7F7|L-JLJF---7|F-7||L7FJLJJ||7JLJFJ7L||FJJ|LJF-7LJ||FJF7L-7|L--JF7F7LJLJF--7F7LJL7L-J|LJF--JF7F-7L- +LJ.7.-F7JL7|LF-7|FJLJFL--JF-7LJF7F7F7L--7||||F----JF-7L7L7|LJ.S|.L-|LJ|F|.LLJFFLJF-JF7L7L-7LJL7||F-JL----JLJL-7F7L7LLJL--7L-7FL-7|F7.|LJFJF| +|F|-7F|J.FL--L7LJ|F-------JFJF7|||LJL---JLJLJ|F--7FJ7L7L-JL7F-||-|LJJJL-.F.|FLFF-JF-JL7|F7L--7|||L--------7F-7LJL-JF----7|F-JF7||||L7|F-JLF- +-J|.J---FF|.|FL7FJL-------7|J||||L---------7FJL-7LJF7FJF7F7|7.||7---L7JJ-FFJ---L--J7F7LJ||F--J||L---------J|FJLF-7FJF7F-J|L--JL-JLJFJ||F7-JJ +LJJ7|LFF-7.F-F-J|JF---7F--JL-JLJL7LF----7F-JL7F7L--J|L-JLJ||LLLJ|7-77J|.FLJ|FLJF----J|F7||L7F7LJF-7F7F-----JL--JFJ|FJLJF-JF--7F7F7FJJ|LJ|L|F +|.L7-FJLFLJ7-L--J7L--7|L7F-7F-7F7L-JF7F7LJF7F||L7F-7L-7F-7LJJ||J|FF-F--7L||L7.-L----7LJLJL7LJL7FJ.LJLJF7F----7F7L-JL--7|F7L7FJ|LJ|L--JF7|-J7 +L7-.LFJ-77J|F-LF7FF--JL-JL7LJJLJL7F7|||L--JL-JL7LJJL--J|FJFJ7-L7LF-.|-LL-FJJ|-LJLF--JF---7L---J|F--7F-J|L---7LJ|F7F7F7|||L7|L7L-7L----J||FLL +LF.L.|JF|J-|JF-|L7L--7F-7FJF-7F-7LJLJLJF------7L7F77F7.||F7|FJLJJJ|7L|F|.L|-7-|FFJF--JFF-JF-7F7|L-7|L-7L---7L-7LJLJLJLJLJ-LJJL-7L----7.LJJ|L +.|JF--7J||FJJLLL7L-7FJ|FLJ.L7|L7|F----7L-----7L7LJL-JL7|LJL7JFJ.F7L-FFL7-|J.J-FFL-JF--7L--J-LJLJF7||F7L7F7FL-7L7F7F-77F7F7F7F-7L7F-7FJ7-LJFL +JLF||F7-J-L7-77FL-7LJFJF-77FJL7||L---7L------J.|F-----J|F--J7L--F-7J|LLL7|.-|-J||||L-7L----7F77FJLJLJL7LJL--7|FJ|||FJFJ||LJLJFJ.LJ-||||-|7J| +|-|L7J.LFLF7FLF--7L--JFL7|FJF7LJ|F7F7L---7F7|F7|L----7||L7F77LLF77F-L--LF7|7||-J7FF7.L----7LJL-JF---7FJF7F--J|L-JLJ|.|FJL7F--J7F--7||77.L-.. +F-7JJ-|.|--7--L-7L-7F-7FJ||FJL-7LJLJL-7F7LJL-J|L-----JFJFJ||F77FF-77-L77L-L--J7.-FJL----7LL-7F-7|F--JL-JLJF7L|F7F-7L-JL-7||F7F7|F-J|L7JJ|--F +-J||L77-|7-J-F--JF7|L7|L7|LJF7FJF--7F7LJL--7F7L-7F-7F7L7L7||||F7|FJ.||.L-F|J.|J7LL-7F7F7L---JL7LJ|F-7F7F--JL7LJ|L7|F-7F-J|LJLJLJL7FJFJ7LJJ.J +LFF|-|FJLJ|.|L---J|L-JL-J|F-JLJFJF-J|L----7|||F7|L7|||||FJ||||||||F7F77LF.||FF77||FLJLJL-7F7F7L7FJ|FLJLJF--7L-7|FJ|L7|L--JF7F-7F-JL-JF-7..-. +FLF|FJJ77|L.LF----JF7F7F7|L---7|FJF7|F----JLJLJLJFJLJL-JL-JLJ||||LJLJL7.F.|JL||FF7F7F--7FJ|LJL-JL-JF7F7FL-7|F-JLJFJFJ|F-7FJ|L7|L7-F7F|7J|.|7 +F-LJ7..FL|.FLL-----JLJLJ|L----J|L-JLJL-----7JF77FJF7F7F--7F7FJ|LJF-7F7L-7F7JFJL-J||LJF-JL-J|F------J|||F7FJ|L--7-L-JJ|||LJFL-JL-JFJL--77J7L7 +|JF-7F77J|F7LLF7F7F---7FJF7F--7|F------7F--JFJ|FJFJLJLJF7LJLJ|L7FJ-LJL--J|L7L--7FJL7FJF7F7F7L-7F7F-7LJLJLJJL--7L7F7FFJ|F-----7F7||F--7L7FL7. +|F-JJL|.-FJL7F||||L--7LJFJLJF7LJ|F-7F-7LJF7L|FJ|FJLF7F-JL-77F7F||F7FF7F-7|FJF7FJL-7|L7|LJ|||F7LJLJFL-----7F--7L7LJ|FJFJ|F----J|L7||F7L7|FJ-7 +FJ7L--J7LL-7L-J|||F7LL-7|F--J|F7LJ7LJFJF-JL7|L-JL--JLJF--7L7||FJLJL-JLJFJ||FJ|L--7||FJL-7|||||F7F7F77F7F7LJF-JFJF-JL-J.||F7F7-|FJ|LJL7LJ7JJF +.L-7J7L|L|FL7F7LJLJ|F7JLJL--7LJL-----J||F--J|F--7F----JF-JFJ||L-7F-----JFJ||FJLF-J|||F7FJLJLJLJLJLJL-J||L--JF7L-JF7F77FJLJLJL7||-|F--JF-7.|F +-7LL7FLJ7|F7LJL-7F7LJ|F-----JF7F---7F7FJ|F7L|L-7|L----7L-7L7||F-J|-F-7F7L7LJL7FJF7||||LJF--------7F7F7LJF-7.||F-7||||FJF7F7F7LJL-JL-7FJFJ7-L +.FFJL.|.|7|L7-F-J|L-7LJF7F7F7|LJFF-J||L7|||FJF7||F-7F-JF7L-J||L-7L7|FJ|L7|F--JL-J||||L--JF-------J|LJL--JFJFJLJFJ|||||FJLJ||L-7F-7F-J|FJJLFJ +F-J7J7F-F7L7L-JF-JF-JF-J||LJLJFF7L--JL7|||||FJLJLJ|LJF7||JF7|L7-L7||L7L7|||F77F7FJ||L--7FJF----7F-JF-7F--JFJF-7L-JLJLJL-7|LJ7FJL7LJF-JL-7F7J +L7.J|FF-J|-L7F7|F-JF7|F-J|F----JL-7F-7LJ||LJL-7F--7F-JLJ|FJ||FJF7|||FJFJLJLJ|FJLJFJ|F7FJL-JF-7FJ|F7L7|L---JFJ7|F7F-7F7F7L---7|F7L--JF---J||J +F77LLFL-7L-7LJLJL--JLJL-7||F-----7LJJ|F7LJF---J|F-JL7F-7|L7LJL-JLJLJL7L7F---JL--7L7||LJF7F-JFJL7|||FJ|F7F--JF7LJLJFJ|||L---7||||F--7L----JL7 +FJL7||F|L-7L7F--------7-||LJF-7F7L--7||L-7|.F7FJL---JL7LJ7L-7F7F--7F7|FJL-7F----JFJ|L7FJ|L-7L-7LJ||L7|||L---JL---7L7||L---7LJ|||L-7|F-7F-7FJ +F-|-F-----JFJL-----7F7L7LJF7L7||L---JLJF-JL-JLJF-----7L77F-7LJLJF7||||L7F-JL----7|FJFJL7|F-JF-JF-JL-JLJL-----7F7FJ7|||F---JF7||L7FJ||FJL7LJ7 +F-JFL-----7|F7F--77LJL7L7FJ|FJLJF7F--7FJF-7F--7L----7L7L-JFJF7F7|LJ|LJFJ|F7F7F--JLJFJF-J|L-7||FJF7F7F7F7F7-F7LJLJ|FJ||L7F--J|||JLJ.LJL7FJFL| +LL-.F---7FJ|||L-7|F--7L7||FJL---JLJF-JL-JL|L-7|F-7F7L7L7F7|FJLJ|L-7|F-JFJ|LJ|L--7F-JFL-7L-7|L7L-JLJLJLJLJL-JL-7.F7L7|L-J|F--JLJLF----7LJL77| +J-L.L--7|L7|||F7||L7FJFJLJ|F------7L---7F-JF-J||-LJL-JL||LJL--7|F-J||F7L7|F-J.F7||F-7F7L-7||FJF7F7F7F-7F---7F7L7||7LJF-7|L--7F7FJF---J-J7F-J +L7.-F-7|L-JLJLJLJ|FJL7L--7LJF---7FJF-7FJL-7L-7LJF7F7FF7LJF7F7FJ|L-7|LJL7LJL7F7|LJ||FJ|L7FJLJL-J||LJ|L7|L-77LJL7LJL-7L|FJ|F--J|||FJLF7J-7F|7. +L|77L7LJF--7F-7F7|L7FJF--JF7|FF-JL-JLLJF7FJF7L7FJLJL7||F-JLJ|L7|7FJL7F7L7F-J||L7FJ|L7L7||F-----J|F7L-JL7FL--7-L----JFJL-JL-7|||||F7||J.FJF77 +|.77FJF-JF-JL7|||L-JL-JF-7|||FJF-7F----J||FJL-J|F---J||L---7|FJL7L-7LJ|F|L-7||FJL7L7|FJLJL---7F7LJL---7|F--7L----7F-JF-7F--JFJLJLJLJL--7-||7 +L-J-|FJJ|L-7FJLJL7F7F7FJFJ|||L7|FJ|F----JLJF7F-J|F7F7|L7F--JLJF7L--JF-JFJF7LJ|L-7L-J||F-7F---J||FF7F7-||L-7|F7F--JL7FJFJL---JF7F7F-----JL|L7 +|.|.LJJLF--J|F-7-LJ|||L7L7|||FLJL-JL-----7FJ|L7FJ|LJLJFJL--7F-JL---7L7FJFJL--JF7L--7|LJ-||F7FFJL-JLJ|FJL--JLJ|L--7FJL7L--7F7FJ|||L-------JFJ +F.7-FJ..L7F7||FJF7FJ||FJFJ|LJF7F---------J|FJFJ|7|F-7FJF7F7||F7F-7FJFJL7L--7F-J|F7FJL77FJ||L7|F7F--7LJF7F--7JL---J|F7L--7LJLJFLJL7F7F7F7F7|J +L7.FJJ77FJ||||L-JLJFJ|L7L7L7FJLJF7F----7F-JL7L7L7|L7||FJ|||LJ||L7|L7L--JF--JL-7||||F7L7|FJ|FJ||||F-JF-JLJF7L----7FJ||F-7L--7F--7FJ|LJLJ||LJJ +FLL7L||FL-JLJL----7|FL7|FJFJL-7FJLJF---JL--7L-JFJ|FJLJ|FJ|L7FJ|FJ|.|F--7L7F7F7||||LJ|FJ|L7|L7LJLJL--J7F7FJL-----JL7|LJLL7F7LJF-J|FJ|LJ-LJJJL +||.|JLLJLFF-----7FJ|F-J|L-JF--J|F-7L--7F-77L7F7L7|L7|FJL7|FJL7|L7L7||F7L7LJLJ|||||FFJ|FJFJL7|F7F7LF--7||L-7F--7F7FJL---7LJL-7L-7LJF7.F7|||LJ +LLJ-F7LJ|FL7F7F7LJFJL7FJF-7L---JL7L-7FJL7|F7LJL7||FJFJF-J|L7L||FJFJLJ|||L7F7FJ|LJL-JFJL7L7FJ||||L7L-7||L--J|F-J|||F---7L---7L7FJF-JL7F77-J.| +-7|-|--.LJLLJLJL7FJF7LJ7L7L---7-FJF7LJF7|||||F-J||L7L7|F7|FJFJLJFJF7F|L--J|LJ-L---7FJF-JFJL7|||L7|F7||L----JL-7|LJ|F7.L7F--JFJL-JF-7L-77|LF7 +F|J.|7F|.7-F----JL7|L-7F7L-7F7L-JFJL7FJLJ||L7L-7LJFJFJ|||||FJF--JFJL7L-7F7L7F--7F7|L7L-7L7FJ|||FJLJ|||F7F--7F-JL7FJ|L-7LJF7|L--7FJL|F-J77L-J +L|77.F7|-|.L---7F-JL-7||L--J|L--7|F-JL7F-J|FJF7|F-JFL7|||||L7||F7L-7|F7LJ|FJL-7||||FJF7|FJ|FJ||L--7|||||L-7||F7||L-JF7L--JL---7|L-7|L7-LJLJ7 +LL-J7L-L7FF----J|F---J|L----JF7FJ|L-7FJ|F7||FJ|||F-7FJLJ||L7||FJL7FJ|||F7|L-7FJ||||L7|LJL7|L-JL7F7|||LJ|F7||LJL-JF7FJL-7F-7F7FJ|F-J|FJJ7.F-7 +-.LL7|LF77|F7F-7|L7F-7|FF7-F-JLJFJF7|L7||LJ||7||||.LJF7FJ|FJ||L-7||LLJ||LJF-J|7|||L7|L7|FJL-7F-J|LJ||F-J|LJ|F7F7FJLJF7JLJJ|||L7|L-7LJ|.F7F.| +|.|.L|-JJFJ|LJ-LJ7LJFJL-JL7L-7F7|FJLJFJ|L-7||FJ||L--7||L7||FJ|F-J||F--JL7J|F7L7LJL7|L7|FJF7FJL7FJLFJ|L-7L-7||LJLJF--JL---7LJ|FJ|F-J.|F-L|J7F +|--F7|JLLL-JLF------JF---7|F7||LJ|F7FJFJF7|||L7||F-7||L-J||L7|L-7||L7F-7L7||L7L--7||7|||FJ||F-JL7FJFJF7|F7|||F7F-JF-7F--7L-7|L7|L7--FF-7-7-7 +LJ-|-FF-JFJ..L--7F7F7|F--JLJ|LJF-J||L7L-JLJ|L7LJ||J||L7F7|L-J|F7|||7||-|FJ||F|F--J|L7|||L7LJL-7FJ|FJ-|LJ||||LJLJF-JFLJF7L--J|FJL-J7-L-.J.F.| +|77L-FJ7LJ7|7LF-J|||||L--7F7L-7L7FJ|FJ7F7-FJFJF-JL7|L7LJ|L--7LJ||||FJ|FJ|FJ|FJL-7FJFJ||L7|F---J|FJL7FJF7|||L-7F7L-----JL---7|L7LF7J.|F-.FJ7F +|F||||||.F|LJ-L7FJ||LJFF-J||F7L-JL7||.FJL-JFJ7L-7FJL-JF7|F--JF7LJ||L7|L7|L-J|F7FJL7L7LJF||L7F7FJL7FJ|FJLJ|L7FJ|L7F---7F7F7FJL-J-|L7--J.F|7FJ +LFLJL|L|.F|F7.F||FJL7|FJF7||||F7F7||L7L--7FJF7F7|L--7FJLJL-7FJL7L||L|L7LJ-F7||LJF7L7L--7|L7||||F-J|FJL7F-JFJL7|FJL--7LJLJLJF7F7F|FJJ7L7LF777 +|.||FJ-LF-7LFF7LJ|F-JFJFJ||LJ||||LJ|FJF7L|L7|LJLJF7FJ|F7F-7LJF7L7LJFJFJ-F-JLJL--J|FJF7FJ|FJ|||||F7||F7||F7L-7LJL7F-7L--7.F-JLJL-JL7FL.|.LLJ- +FF|L7JJLJF|F|LF7LLJF7L7||||.FJ|||F-J|FJL-JFJL--7FJLJJ||LJFL7FJL7|JFJFJF-JF-7F-7F-JL-J|L7||FJ|||||||LJ|||||F7L-7FJL7|F-7L-JF--7F-7FJJ.JL-LF77 +7L|L-JFLFJ-7.FJL7F7|L-J|FJ|FJFJ|||F7||F7F7|7F--JL-7F-JL-7F7||F7|L7L7L7L7FJFJL7|L7F--7L7|||L7|||||||F-J|LJ||L7FJL7FJLJL|F7FJF7|L7LJJ-|.7LL7LJ +|FJFJ.|-|FLL7L-7LJ||F7FJ|FJ|FJFLJ||||||||||FJF7F-7|L---7LJ||LJ|L7L7|FJFJ|JL7FJL7LJF-J|LJLJFJ|||||||L7FJF7||L||F7|L-7F7|||L-J||FJFJJF|FLF.||J +LJLL7LJFF-L-|.LL-7LJ|||FJL7||F---J||||||||||FJ||FJL--7FJF-J|F-JFJFJLJFJFJF7||-||F-J7F77F-7L7|||||||FJ|J|LJL7|LJ|L7FJ||LJ|F-7|LJFJ|LFF-FL-J|| +LL7F|7.LF.|-L-7F-JF7|LJL7FJLJ|F-7FJ||LJ||LJ|L7|||F7F-JL7L-7|L-7L7L--7L7|FJLJL7FJL--7|L-JFJFJ|LJ||||L7|FJF-7||F-JFJL-JL-7|L7||7L|L|-FF-77-LF7 +.LF--|-|F7..---L7FJLJF-7|L7LFJ|FJ|FJ|F-JL-7L-J||LJ|L7-FJF-J|F-JFJF7FJ.LJ|F7F-JL7F7FJL-7FJJ|FJF-J|LJFJ|L7|FLJ||F-JF7F7F7||FJLJ-7LFJ|||.LJ-|L| +.JLL|JFF|-FF--7-LJ.F7L7||FJFJFJL7||FJ|F7F-JF--JL-7L7L7L7L-7|L7FJFJLJF7F7LJLJF--J|LJF--JL-7LJ-|F7L7J|FJF||F--J|L7FJ||LJLJ|L-7LLL7L-J-7J7JF-77 +L-7.L.|LL7L|7.JJFF-JL-JLJL7L7|F-J||L7|||L7JL7F7F-J.L7L7L7FJ|FJ|FJ-F-JLJL----JF-7L--JF7F-7L7F7LJL7L7||F-J||F-7|FJ|FJL---7L7FJF|FLJJL-|.J-|-|7 +|FJ.L7|F-|FL|.|7F|F7F-7F7FJFJ|L7FJL-J|||FJF7LJ|L-7F7L7L7|L7LJFJL7.L--------7FJ||F7F7||L7L7LJL-7F|FJ||L7FJLJFJ|L7|L7F---JLLJL--||-..|J.L-J-|7 +|-F-F-J7-7JFJ-|FFJ||L7|||L7L-J.|L---7LJ|L-JL7||F-J||FJFJL7L-7L-7L7F7F------JL-7LJ|||||FJ-L7F-7|FJ||LJFJL--7L7L7||F|L-7-L..L|.LJL-7F|LL-FL7.| +|-L7||--FJJJ.|L-L-J|FJ||L-JF7F7|F7F-JLFJF-7FJFJL--J|L7L-7L7FJF-JFJ|LJF----7F-7L-7LJ|||L-7FJL7LJL7L--7L7F-7L7L7|||FJF-J7L|-F-J.||FJ-7-.F|7|-7 +-77L-|-LJJ.|LJJLFJJLJ.LJ-LFJLJLJ|LJLF-JFJ||L7|F7F--JFJF7L7|L7L7FJJ|F7|F---J|7L-7L7FJ||F7|L7FJF--JF7FJ7LJ.L7|-LJ||L7L--7-.F7|JF7LF7F|F7-J-|.| +L77JLJ77.F--7|JF--FLJ7L7F.L7F7F7L--7L-7|F-JFJLJ|L--7L7||FJ|FJFJL-7LJLJL-7F7L--7|FJ|FJLJLJFJL7L-7FJ|L--7L|-||LF-JL7|F-7|JF|L|J||FF--JFLJ|.F-L +LLJJJ|L7-7FJ7|-|7F7J|J7FF--J|LJ|F--JF7||L7FJ7F-JF7FJFJ||L7|L7|F7FJF-----J||F7FJLJFJ|F----JF7L-7LJFJF7FJ.LLLJ-L7F7|||LLJ--F-|L|7J.7|F|J.77JL7 +||JF-7FJ|L.L-J.|F|.|LJ|-|F--JF7|L-7FJLJ|FJL-7|F7|LJ-L7||FJL-JLJ||-L----7FJ|||L--7L7|L7F7F7||F7L7-|FJLJ--77L|J|||||||.LL7L|-|.F--7.LF7J.-77J| +FL7L.LL||L-JF|-J7|F-7.--LJJF-JLJF7||F-7|L7F-J|||L--7FLJ|L7JJ.J|LJJLF---J|FJ|L7F7L7LJJLJ||||||L-JJLJ-JJ|LJ7|L-LLJLJ||JLJ-JL|F7J-7.J-L7.FL.L77 +7F7JL77|JL|-FFFJ|F77|F|.|J-|F-7FJ||||FLJFJL-7||L7F7L--7|FJJ|77F|7.|L---7|L7L7||L7L----7||||LJLJ|LFJ|7L-7L--J.LJLFLLJJFL.F7FLJ.F|F|7L||J|--|J +-|L|LLL77FF-|FJJJ|JF7--7L|FLJ.|L7||||F--JF-7|LJFJ|L7F-J|L7F|FJ777.JJLF-J|FJFJLJ.|F7F-7|LJ||7J7-J.|.FJ.L--FJ7JLJL7JFJJF-7L-|L--LL-L7.FJL-JL|| +FL7F--7L|-JF--L-FFJFJL--7LF---JFJLJLJL--7L7|L7.L7|FJ||.L-J7|FL-J7.L|-|F7|L7L--7FJ|LJFLJJFLJJ---F-J-|.FLL-7-J7-.7J.JF-J-L77JF..FJ7|F7|F7.FFL| +JL7JF-JL||L-LJL77J-L7JF|-FL7F--J|..|.F--JFJL-JFFJ|L7L77.LJLJJ7|L|J.-J||||FJF-7||FJJF77.L-|.|.L-JJ7-LF7.|.-J7F-----J-LFFJL-FLJ-J.--7-F-|JJJLL +.FJ-JF|7F7|.F-7LLJ.L||||.|FLJJJ|J-|LFL--7L-7-|-L7|FJFJ77JF|-FL7JLF77.||LJ|FJFJ||||FJ|77|L|7F7L|L|7..||7|FL.FF7L.|LL7LJ--7.|LJ77LJ|J-LFJ|F|.L +LLJJ.F7-J|-FJ.L7L-F-.|J7.||F|7-||.|F----JF7L---7||L7|JLLF77L7L|JF|.77LJJ-LJ.|FJ|L-JFJL|7-FFL--L-FF-7-|-F77L-|7J-|..|7|J||F-7LJ7LL7J|.|.FJF|| +||77FJ|F7.L7|FL||FJ77|J|---7|--J-7-L-7F-7|L--7FJLJFLJ.F.LFL-..-FFJLJJ|L.FJJ-LJFJF7FJJ7L|LJ7J7.|-LJ7.FLLJ-7L7L7.FJ-FJF7||.7--7J7L----|77|-LJ| +-|-|--F7|7..|J-L|-LJ7FFJF..L|--|-J7|7LJ-|L--7LJ.|7--|-|7L|FJ-7L7L7F|FJ--L-JJLLL7|LJ7|JJJF-JLL7FF7-7-JFJ|7LF|.|.L--F-J-J-FJF7|LJ-JJLL-JFJ|FFF +LL.|||.F|L77.L-JL|L|7-|JL--.L-7L-L|JFF--JF-7L--7JJ.FF.|||.|7LL.-7|J7|FF.|J.7LL-LJ-L-F7|FL-||FLFJ7-|J.J7L--|7FJ777.F-7|---7LL7||FLJFJ|-7-|--J +LJ-JJL-FLJ|J-JL7.7LLJ-F..-.-J.7LLL7-JL---J-L---JJ.F.F7.LJ.LJLJ.J-J.|.JL7-.J.JJFL|J.|JF-J-L|-LJF-F--FJJLLJLJJ-L|JLLJL7--J.J..|-F7JL--L-J.|JFJ \ No newline at end of file diff --git a/2023/10/src/data.rs b/2023/10/src/data.rs new file mode 100644 index 0000000..e2657b2 --- /dev/null +++ b/2023/10/src/data.rs @@ -0,0 +1,17 @@ +#[cfg(test)] +pub const EXAMPLE1: &'static str = include_str!("../data/example1"); + +#[cfg(test)] +pub const EXAMPLE2: &'static str = include_str!("../data/example2"); + +#[cfg(test)] +pub const EXAMPLE3: &'static str = include_str!("../data/example3"); + +#[cfg(test)] +pub const EXAMPLE4: &'static str = include_str!("../data/example4"); + +#[cfg(test)] +pub const EXAMPLE5: &'static str = include_str!("../data/example5"); + +#[allow(unused)] +pub const INPUT: &'static str = include_str!("../data/input"); diff --git a/2023/10/src/main.rs b/2023/10/src/main.rs new file mode 100644 index 0000000..0f9680f --- /dev/null +++ b/2023/10/src/main.rs @@ -0,0 +1,12 @@ +mod data; +mod part1; +mod part2; +mod pipe; +mod position; +mod puzzle; + +fn main() { + use data::INPUT; + println!("Part 1: {}", part1::run(INPUT)); + println!("Part 2: {}", part2::run(INPUT)); +} diff --git a/2023/10/src/part1/mod.rs b/2023/10/src/part1/mod.rs new file mode 100644 index 0000000..b689f9e --- /dev/null +++ b/2023/10/src/part1/mod.rs @@ -0,0 +1,23 @@ +use crate::*; +use puzzle::Puzzle; + +pub fn run(input: &str) -> usize { + let puzzle: Puzzle = input.parse().expect("parse failed"); + puzzle.iter().count() / 2 +} + +#[cfg(test)] +mod test { + use super::*; + use crate::data; + + #[test] + fn test1() { + assert_eq!(run(data::EXAMPLE1), 4); + } + + #[test] + fn test2() { + assert_eq!(run(data::EXAMPLE2), 8); + } +} diff --git a/2023/10/src/part2/mod.rs b/2023/10/src/part2/mod.rs new file mode 100644 index 0000000..511c01c --- /dev/null +++ b/2023/10/src/part2/mod.rs @@ -0,0 +1,96 @@ +use direction::Direction; + +use crate::position::Position; +use crate::puzzle::Puzzle; + +fn shoelace(mut iter: impl Iterator) -> i32 { + let start = iter.next().expect("shoelace: iter must not be empty"); + let mut prev = start; + let mut area = 0i32; + for pos in iter { + area += prev.x * pos.y - pos.x * prev.y; + prev = pos; + } + area += prev.x * start.y - start.x * prev.y; + area / 2 +} + +fn left_offset(r#in: Direction, out: Direction) -> (i32, i32) { + use Direction::*; + match (r#in, out) { + (N, E) | (E, N) => (-1, -1), + (N, W) | (W, N) => (-1, 1), + (S, E) | (E, S) => (1, -1), + (S, W) | (W, S) => (1, 1), + (N, N) => (-1, 0), + (S, S) => (1, 0), + (E, E) => (0, -1), + (W, W) => (0, 1), + _ => unreachable!(), + } +} + +fn left_area(puzzle: &Puzzle) -> i32 { + shoelace(puzzle.iter().map(|state| { + state.position * 2 + + (1, 1) + + left_offset( + state + .pipe + .next_direction(state.direction.reverse()) + .expect("bad pipe / direction combo") + .reverse(), + state.direction, + ) + })) / 4 +} + +fn right_area(puzzle: &Puzzle) -> i32 { + shoelace(puzzle.iter().map(|state| { + state.position * 2 + (1, 1) + - left_offset( + state + .pipe + .next_direction(state.direction.reverse()) + .expect("bad pipe / direction combo") + .reverse(), + state.direction, + ) + })) / 4 +} + +pub fn run(input: &str) -> usize { + let puzzle: Puzzle = input.parse().expect("parse failed"); + left_area(&puzzle) + .abs() + .min(right_area(&puzzle).abs()) + .try_into() + .expect("abs() returned a negative number") +} + +#[cfg(test)] +mod test { + use super::*; + use crate::data; + + #[test] + fn test1() { + assert_eq!(run(data::EXAMPLE1), 1); + } + #[test] + fn test2() { + assert_eq!(run(data::EXAMPLE2), 1); + } + #[test] + fn test3() { + assert_eq!(run(data::EXAMPLE3), 4); + } + #[test] + fn test4() { + assert_eq!(run(data::EXAMPLE4), 8); + } + #[test] + fn test5() { + assert_eq!(run(data::EXAMPLE5), 10); + } +} diff --git a/2023/10/src/pipe.rs b/2023/10/src/pipe.rs new file mode 100644 index 0000000..7f456cc --- /dev/null +++ b/2023/10/src/pipe.rs @@ -0,0 +1,50 @@ +use direction::Direction; +use game_grid::GridCell; +use game_grid::ParseCellError; + +#[derive(GridCell, Copy, Clone, Debug, PartialEq, Eq, Default)] +pub enum Pipe { + #[cell('.')] + #[default] + Ground, + #[cell('|')] + NorthSouth, + #[cell('-')] + EastWest, + #[cell('L')] + NorthEast, + #[cell('J')] + NorthWest, + #[cell('7')] + SouthWest, + #[cell('F')] + SouthEast, + #[cell('S')] + Start, +} + +impl Pipe { + pub fn next_direction(&self, direction: Direction) -> Option { + use Direction::*; + use Pipe::*; + Some(match (*self, direction) { + (NorthSouth, N) => N, + (NorthSouth, S) => S, + (EastWest, E) => E, + (EastWest, W) => W, + (NorthEast, S) => E, + (NorthEast, W) => N, + (NorthWest, S) => W, + (NorthWest, E) => N, + (SouthWest, N) => W, + (SouthWest, E) => S, + (SouthEast, N) => E, + (SouthEast, W) => S, + _ => return None, + }) + } + + pub fn has_direction(&self, direction: Direction) -> bool { + self.next_direction(direction).is_some() + } +} diff --git a/2023/10/src/position.rs b/2023/10/src/position.rs new file mode 100644 index 0000000..4a92634 --- /dev/null +++ b/2023/10/src/position.rs @@ -0,0 +1,55 @@ +use std::ops::{Add, Mul, Sub}; + +use direction::Direction; +use game_grid::GridPosition; + +#[derive(Debug, Clone, Copy, GridPosition)] +pub struct Position { + pub x: i32, + pub y: i32, +} + +impl> Add for Position { + type Output = Self; + + fn add(self, rhs: T) -> Self::Output { + let (dx, dy) = rhs.into(); + Position { + x: self.x + dx, + y: self.y + dy, + } + } +} + +impl> Sub for Position { + type Output = Self; + + fn sub(self, rhs: T) -> Self::Output { + let (dx, dy) = rhs.into(); + Position { + x: self.x - dx, + y: self.y - dy, + } + } +} + +impl Mul for Position { + type Output = Self; + + fn mul(self, rhs: i32) -> Self::Output { + Position { + x: self.x * rhs, + y: self.y * rhs, + } + } +} + +impl Position { + pub fn next(&self, direction: Direction) -> Self { + *self + direction + } + + pub fn step(&mut self, direction: Direction) { + *self = self.next(direction); + } +} diff --git a/2023/10/src/puzzle.rs b/2023/10/src/puzzle.rs new file mode 100644 index 0000000..7a69d9a --- /dev/null +++ b/2023/10/src/puzzle.rs @@ -0,0 +1,133 @@ +use crate::*; +use anyhow::Result; +use direction::Direction; +use pipe::Pipe; +use position::Position; +use std::str::FromStr; +use thiserror::Error; + +type Grid = game_grid::Grid; + +fn find_start_position(grid: &Grid) -> Option { + grid.iter() + .find_map(|(pos, pipe)| (pipe == Pipe::Start).then_some(pos)) +} + +fn patch_pipe(grid: &Grid, position: Position) -> Option { + use Direction::*; + use Pipe::*; + let has_direction = |direction: Direction| -> bool { + let position = position.next(direction); + let result = grid.is_in_bounds(position) && grid.cell_at(position).has_direction(direction); + // dbg!("has_direction", position, direction, result); + result + }; + Some( + match ( + has_direction(N), + has_direction(S), + has_direction(E), + has_direction(W), + ) { + (true, true, false, false) => NorthSouth, + (true, false, true, false) => NorthEast, + (true, false, false, true) => NorthWest, + (false, true, true, false) => SouthEast, + (false, true, false, true) => SouthWest, + (false, false, true, true) => EastWest, + _ => return None, + }, + ) +} + +fn find_starting_direction(grid: &Grid, starting_position: Position) -> Option { + use Direction::*; + use Pipe::*; + Some(match patch_pipe(grid, starting_position)? { + Ground => unreachable!(), + NorthSouth => N, + EastWest => E, + NorthEast => N, + NorthWest => N, + SouthWest => S, + SouthEast => S, + Start => unreachable!(), + }) +} + +#[derive(Debug)] +pub struct Puzzle { + pub grid: Grid, + pub starting_position: Position, + pub starting_direction: Direction, +} + +impl Puzzle { + pub fn iter<'a>(&'a self) -> Iter<'a> { + Iter { + grid: &self.grid, + position: self.starting_position, + direction: Some(self.starting_direction), + } + } +} + +#[derive(Debug)] +#[allow(unused)] +pub struct State { + pub position: Position, + pub direction: Direction, + pub pipe: Pipe, +} + +#[derive(Debug)] +pub struct Iter<'a> { + grid: &'a Grid, + position: Position, + direction: Option, +} + +impl<'a> Iterator for Iter<'a> { + type Item = State; + + fn next(&mut self) -> Option { + let direction = self.direction?; + let mut pipe = self.grid.cell_at(self.position); + if pipe == Pipe::Start { + pipe = patch_pipe(self.grid, self.position).expect("unpatchable starting position"); + } + let result = State { + position: self.position, + direction, + pipe, + }; + self.position.step(direction); + self.direction = self.grid.cell_at(self.position).next_direction(direction); + // dbg!(self.position, self.direction); + Some(result) + } +} + +#[derive(Error, Debug)] +#[error("starting position was not found")] +pub struct StartingPositionNotFound; + +#[derive(Error, Debug)] +#[error("starting direction was not found")] +pub struct StartingDirectionNotFound; + +impl FromStr for Puzzle { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result { + let grid: Grid = s.parse()?; + let starting_position = find_start_position(&grid).ok_or(StartingPositionNotFound)?; + let starting_direction: Direction = + find_starting_direction(&grid, starting_position).ok_or(StartingDirectionNotFound)?; + Ok(Self { + grid, + starting_position, + starting_direction, + }) + } +} diff --git a/Cargo.lock b/Cargo.lock index 43b2c17..d6e0bbd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,6 +11,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "anyhow" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" + [[package]] name = "arrayvec" version = "0.7.6" @@ -131,6 +137,7 @@ name = "direction" version = "0.1.0" dependencies = [ "derive_more", + "enum-iterator", "parse-display", ] @@ -651,18 +658,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "80d76d3f064b981389ecb4b6b7f45a0bf9fdac1d5b9204c7bd6714fecc302850" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "44d29feb33e986b6ea906bd9c3559a856983f92371b3eaa5e83782a351623de0" dependencies = [ "proc-macro2", "quote", @@ -776,6 +783,20 @@ dependencies = [ "typed-arena", ] +[[package]] +name = "y2023d09" +version = "0.1.0" + +[[package]] +name = "y2023d10" +version = "0.1.0" +dependencies = [ + "anyhow", + "direction 0.1.0", + "game-grid", + "thiserror", +] + [[package]] name = "y2024d01" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 099f2f5..0fc4126 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ members = [ [workspace.dependencies] derive_more = "2" +enum-iterator = "2" game-grid = "0" itertools = "0" nom = "8" diff --git a/direction/Cargo.toml b/direction/Cargo.toml index cb1a031..05cc700 100644 --- a/direction/Cargo.toml +++ b/direction/Cargo.toml @@ -5,4 +5,5 @@ edition = "2024" [dependencies] derive_more = { workspace = true, features = ["try_from", "from_str"] } +enum-iterator.workspace = true parse-display.workspace = true diff --git a/direction/src/lib.rs b/direction/src/lib.rs index caa6460..308a242 100644 --- a/direction/src/lib.rs +++ b/direction/src/lib.rs @@ -1,7 +1,8 @@ use derive_more::{FromStr, TryFrom}; +use enum_iterator::Sequence; use parse_display::Display; -#[derive(Clone, Copy, Debug, Display, PartialEq, Eq, TryFrom, FromStr, Hash)] +#[derive(Clone, Copy, Debug, Display, PartialEq, Eq, TryFrom, FromStr, Hash, Sequence)] #[try_from(repr)] #[repr(u8)] pub enum Direction {