From bb4471f2db22ab93e377ab706427258dbcc899cc Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 7 Nov 2023 16:15:01 +0100 Subject: [PATCH] Day 20 --- Y2022.cabal | 2 + app/Main.hs | 1 + bench/Bench.hs | 1 + data/20.in | 5000 +++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 2 +- src/Days/D20.c | 305 +++ src/Days/D20.hs | 69 + src/Lib.hs | 2 + 8 files changed, 5381 insertions(+), 1 deletion(-) create mode 100644 data/20.in create mode 100644 src/Days/D20.c create mode 100644 src/Days/D20.hs diff --git a/Y2022.cabal b/Y2022.cabal index 4e917cd..5fb8f90 100644 --- a/Y2022.cabal +++ b/Y2022.cabal @@ -27,6 +27,7 @@ library hs-source-dirs: src c-sources: src/Days/D08.c + src/Days/D20.c exposed-modules: Lib other-modules: @@ -53,6 +54,7 @@ library Days.D17 Days.D18 Days.D19 + Days.D20 build-depends: bytestring , either diff --git a/app/Main.hs b/app/Main.hs index fe943ac..fccadde 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -27,6 +27,7 @@ paths = , "./data/17.in" , "./data/18.in" , "./data/19.in" + , "./data/20.in" ] solutions :: [(Int, Day, FilePath)] diff --git a/bench/Bench.hs b/bench/Bench.hs index 8e663d5..90f3f07 100644 --- a/bench/Bench.hs +++ b/bench/Bench.hs @@ -26,6 +26,7 @@ paths = , "./data/17.in" , "./data/18.in" , "./data/19.in" + , "./data/20.in" ] solutions :: [(Integer, [Day], FilePath)] diff --git a/data/20.in b/data/20.in new file mode 100644 index 0000000..a58f495 --- /dev/null +++ b/data/20.in @@ -0,0 +1,5000 @@ +-7050 +-7455 +-2217 +-8572 +-2107 +-5557 +8985 +4354 +9848 +-2695 +7765 +-1763 +3323 +6597 +3298 +-352 +597 +3287 +-48 +-3279 +-7316 +3072 +-3221 +-9235 +-4750 +-7932 +-3224 +-6232 +126 +-1108 +-630 +526 +7271 +-2627 +9232 +-7877 +6651 +-3129 +8229 +6439 +-9177 +-5766 +-5356 +-9101 +-3261 +-1061 +-2588 +-4871 +-9177 +-8873 +9884 +6167 +2019 +8504 +-6894 +402 +-2973 +-8104 +7440 +3575 +3487 +-9238 +4987 +7634 +-225 +-3066 +341 +-1728 +1164 +5725 +1353 +4749 +-1940 +-9092 +11 +4856 +1949 +-8284 +-9103 +9604 +5079 +-8707 +-3202 +5736 +-3635 +-8424 +9255 +2100 +-9177 +2092 +4399 +4267 +8162 +8090 +9517 +-571 +8519 +5099 +6319 +-1374 +264 +-5657 +8250 +-7760 +-298 +-1054 +-9157 +-4843 +-1737 +542 +-4813 +-1432 +-9801 +7443 +-5616 +-5009 +-4711 +-4829 +9109 +721 +-7773 +4687 +7406 +-2576 +5301 +-5734 +3252 +4989 +9708 +-4358 +4370 +1882 +-9661 +9173 +4888 +-149 +-6703 +-2076 +7814 +-2176 +-1963 +-8472 +2157 +-6968 +-4934 +1875 +-4515 +-2148 +-4103 +-8555 +-4358 +-1372 +6902 +-6699 +-4140 +-3080 +-6135 +-9209 +1670 +2819 +-8880 +-6584 +-7144 +5073 +-4668 +9090 +-3966 +-2684 +4065 +-8208 +-7828 +1265 +-1498 +1399 +-8925 +1860 +3150 +3676 +5099 +-7643 +1260 +-8611 +-2456 +-9008 +5980 +-5714 +2186 +-6189 +9498 +6053 +-5523 +-448 +-479 +5614 +2473 +-1413 +5730 +6643 +-588 +-8605 +7352 +-6004 +-1183 +-896 +-2468 +-3643 +-2297 +5490 +7346 +7099 +6892 +-1523 +-3563 +4176 +-4160 +8407 +5398 +-6713 +3718 +7130 +8675 +8379 +8158 +-9667 +-7481 +597 +2371 +-7510 +6708 +-5924 +-5636 +7155 +-4830 +-4706 +6505 +-9946 +315 +7979 +1229 +1285 +-850 +8455 +4812 +-916 +-6760 +6397 +-9684 +-2250 +-99 +-1652 +-5640 +8044 +-4871 +3914 +-4091 +4253 +-6226 +1901 +7138 +1306 +-5032 +-6988 +-5724 +291 +-7444 +4535 +1273 +8893 +3470 +1879 +-501 +4467 +778 +-6219 +-8724 +-7322 +5080 +-9318 +-4644 +3182 +-7833 +-7016 +-5667 +6823 +7142 +5683 +-2169 +663 +333 +3515 +-1252 +-2491 +-3571 +-3202 +-3583 +7832 +-5607 +-6880 +2187 +8569 +-5590 +-6554 +-2311 +-1538 +-9513 +-563 +-6754 +9451 +857 +8849 +8574 +548 +6890 +7150 +5277 +-7704 +-6299 +8759 +8807 +-2777 +-4436 +833 +1314 +4477 +-7316 +5241 +-7231 +-6864 +-995 +-5860 +6514 +-7595 +-562 +-6789 +2559 +-5335 +8711 +-8183 +9464 +9316 +-4540 +6494 +-4588 +-4184 +-2304 +1532 +-5636 +-38 +-6625 +-8230 +-9463 +4466 +945 +-6607 +-2498 +2094 +-9138 +-7663 +2318 +6388 +-8342 +-5207 +-9985 +-4640 +-9776 +3813 +-502 +-5042 +6185 +-603 +9482 +9679 +9423 +2389 +1679 +1721 +-6416 +-207 +51 +-9141 +7380 +-7179 +6371 +6819 +-7308 +-60 +-246 +9512 +9729 +2073 +-8848 +7380 +-3940 +-4436 +9949 +7200 +8545 +6553 +5581 +506 +-7481 +6722 +-7314 +-750 +5534 +2101 +3931 +-125 +3849 +8649 +-4892 +9241 +-8197 +-7297 +6076 +8634 +2579 +-2819 +-617 +-1687 +-2095 +1355 +-4681 +-3608 +7396 +-2792 +-1601 +-8138 +-1364 +-8677 +-1121 +2738 +1775 +6340 +-1845 +6349 +-3005 +-35 +7335 +5607 +8343 +-5472 +620 +6280 +-4580 +-276 +-1779 +-2176 +3993 +-3978 +-4431 +-2783 +-5849 +-8882 +822 +3192 +992 +9741 +4772 +-3399 +-8297 +-5102 +-9512 +-7846 +-7306 +-5162 +8258 +5260 +4734 +6823 +-7335 +7318 +-4905 +6394 +939 +-9986 +-1023 +-5170 +-7165 +-7407 +2821 +7597 +198 +-3809 +9808 +-2358 +8511 +9451 +-2854 +-7540 +-6870 +7984 +2575 +-3563 +-3638 +4726 +3234 +-9381 +7188 +-7857 +-1560 +-8396 +-4010 +-3419 +1271 +5915 +-3028 +-2483 +2733 +7498 +-2482 +6643 +-2657 +-357 +1911 +-7421 +-5755 +585 +-8291 +1797 +-6822 +-9962 +-862 +8005 +2940 +-9662 +-1959 +-4727 +-5699 +-8527 +7997 +3388 +2760 +5768 +-3099 +-9158 +172 +5947 +-8037 +-5392 +0 +-7823 +8508 +-1119 +-7551 +3210 +-5907 +-888 +-519 +845 +4255 +-7050 +2302 +-525 +3532 +-60 +-671 +-2217 +8746 +6 +369 +-7344 +3751 +-5367 +3752 +-9257 +-6895 +-3221 +5154 +1529 +3972 +3647 +-6952 +9108 +-9920 +-3913 +7398 +5114 +9343 +1524 +784 +1772 +1306 +3373 +-1456 +7080 +6764 +4909 +7682 +3696 +-5161 +5490 +-10 +-8850 +-7530 +-8083 +-4764 +-4704 +3107 +-5814 +9665 +995 +6982 +7005 +-8829 +2971 +-1396 +6745 +658 +3184 +-8011 +-3311 +-4108 +1754 +5246 +-137 +1867 +-2632 +1130 +8238 +5644 +-1831 +-8237 +-6662 +-5354 +9694 +8256 +804 +6449 +565 +3220 +-4540 +-3346 +-4863 +8996 +-3275 +-8297 +-4328 +8230 +6247 +-4908 +2572 +6255 +9911 +6134 +1840 +-2150 +6855 +-2466 +3240 +-5354 +-9356 +6563 +-2916 +-5125 +-206 +5067 +-4824 +-7124 +-9291 +-3866 +-4681 +-4864 +894 +-1708 +-5864 +3309 +8139 +-1966 +9319 +7825 +3319 +9316 +1721 +-7511 +-8795 +6449 +1532 +3120 +1067 +-7615 +7539 +-8899 +-6271 +-6918 +5020 +-2710 +-6063 +4631 +-9336 +-8557 +-9440 +-9556 +-6982 +-2245 +8648 +6164 +6164 +-8926 +-2688 +5798 +6734 +5760 +5594 +-8300 +8639 +5007 +-8465 +3800 +-1102 +-7635 +2005 +-5591 +-5917 +-7802 +3116 +-2335 +2862 +3217 +-6480 +-6069 +6761 +7431 +8317 +9134 +-2302 +5772 +2281 +-2500 +5322 +-204 +-5681 +-434 +5207 +3470 +2299 +7010 +-6757 +-215 +5961 +2745 +-1870 +7393 +8149 +-6897 +-3557 +1900 +7594 +-7859 +6067 +-6554 +9890 +3467 +-3140 +9004 +-9291 +-5319 +-6086 +5046 +7451 +-7031 +7015 +-8164 +-7340 +4731 +7103 +857 +-388 +3571 +9224 +3616 +-4830 +-3410 +-9527 +1594 +8212 +1780 +2476 +-6394 +-6770 +4617 +-1000 +-4770 +7257 +7345 +-9212 +-5375 +495 +53 +-7165 +-7149 +801 +-753 +6835 +-1269 +-5110 +7698 +6625 +6826 +3158 +-6407 +5076 +8244 +-1372 +-6055 +2959 +625 +605 +7294 +8536 +1666 +2190 +6496 +-9266 +-4860 +8795 +5537 +6083 +2214 +-3423 +495 +-7762 +-5036 +-2033 +7159 +4109 +9775 +2127 +-9662 +-5186 +-1956 +-1331 +-9921 +7625 +-5754 +-114 +1205 +-8528 +-4887 +-3769 +-8862 +-4003 +5644 +3093 +5524 +4530 +5644 +-8875 +-8342 +2879 +-5571 +1250 +151 +1166 +380 +-2360 +8622 +-2540 +-8701 +4313 +8896 +673 +-6004 +-5685 +-1150 +-1856 +8182 +2578 +3403 +-4167 +2389 +-3702 +3002 +-6841 +-2614 +4332 +-3180 +8635 +95 +4524 +-1115 +4643 +2412 +-9874 +7625 +-9979 +-2021 +649 +80 +-8037 +8002 +5079 +3207 +5704 +-5259 +1896 +8934 +8974 +-7565 +8045 +2471 +6044 +822 +7298 +-4603 +8291 +8047 +8029 +5490 +-3109 +-6891 +5017 +2872 +1390 +-9921 +9889 +-5917 +7760 +9579 +-7786 +3276 +9738 +9241 +-5200 +6657 +-4532 +5789 +8072 +-6220 +-3607 +9548 +4616 +-3551 +-364 +-7419 +-2881 +4958 +5420 +-5085 +-793 +1265 +5511 +2469 +3078 +9092 +7193 +-5716 +-410 +6724 +3470 +5017 +-142 +8597 +-9132 +-668 +4648 +-4887 +5661 +-4413 +4480 +-6051 +-8985 +-9194 +3687 +6515 +-1949 +-8782 +2094 +8230 +-9617 +9464 +-149 +5703 +8154 +8698 +8766 +-9177 +-7512 +2992 +7847 +4743 +-2657 +-3702 +-5286 +-3134 +-1677 +456 +282 +3169 +-3611 +6914 +-2584 +6969 +-3060 +-3844 +-5429 +141 +-665 +-381 +-8977 +6797 +9103 +-2697 +-3787 +-5484 +-5861 +2314 +-7318 +-1929 +-4437 +-5580 +-3492 +-2934 +5482 +-8607 +-7165 +9518 +6296 +7890 +-272 +-5860 +6722 +-1910 +-4445 +8597 +4631 +7202 +6885 +-8582 +828 +6827 +6523 +4037 +5784 +-5264 +-3210 +-8035 +-7243 +-8008 +902 +8319 +-862 +-5816 +4894 +-3878 +-6114 +-1394 +-9322 +5068 +9572 +3185 +6635 +-1954 +3483 +-1651 +-1319 +4387 +-4057 +-1331 +-2787 +985 +5700 +-5477 +-329 +9143 +9745 +9737 +3752 +-9209 +-9223 +2161 +7136 +826 +-5994 +-543 +4771 +5822 +-2634 +-6710 +588 +-5583 +3757 +-8919 +1223 +896 +3562 +-3643 +7231 +8760 +6151 +5484 +-2233 +6726 +3035 +4616 +-57 +-5917 +3822 +8460 +7489 +-2482 +4866 +594 +-3202 +-9880 +-8921 +7483 +-4164 +-6958 +-9881 +-9356 +2304 +-8639 +-7120 +1137 +-2710 +-5920 +8228 +9562 +9085 +-767 +-7855 +1878 +9916 +-3483 +7630 +-8862 +-5638 +8083 +-6446 +4428 +-153 +-2950 +-6885 +-7592 +8317 +2691 +-8037 +-1906 +2977 +-9846 +8987 +1644 +-3247 +9795 +-4603 +-9122 +-3818 +7798 +-9527 +9877 +1300 +5490 +-7048 +-4747 +-7075 +3035 +-1148 +4062 +-5567 +4240 +-4248 +4621 +2552 +2904 +-383 +-57 +3798 +3834 +-3556 +2478 +54 +-5454 +4522 +-6669 +-8371 +-9283 +-7445 +9075 +-1358 +914 +9599 +-2771 +-7241 +4733 +6928 +7898 +-1838 +8317 +2446 +-400 +-349 +2471 +3425 +3020 +-2191 +599 +-3791 +6225 +7085 +-5764 +-4627 +-7405 +6676 +-7865 +9520 +3520 +3914 +-1653 +9184 +-1190 +-4206 +-6294 +580 +7312 +-7196 +4130 +-1596 +5068 +1815 +-4837 +3224 +-6313 +-4886 +-9381 +-1800 +-4076 +-4456 +-8060 +-2730 +-7828 +-1021 +-6926 +-3597 +6159 +9315 +30 +2187 +-4905 +8338 +-9800 +2254 +-5970 +5801 +-705 +9947 +6801 +6727 +5844 +-6156 +6117 +764 +3697 +-6562 +3022 +-6101 +-3417 +-1102 +-9473 +-4695 +8036 +9051 +-9348 +7698 +734 +2934 +-6804 +2551 +55 +-6949 +-6113 +4438 +-6736 +-9446 +216 +9316 +2668 +-8173 +-3563 +-3787 +-9651 +-6149 +-3686 +8265 +7129 +-5137 +-8598 +2816 +-788 +3093 +-1861 +-92 +-6052 +324 +9829 +-1972 +-3995 +6570 +-4893 +5028 +-6732 +-8329 +-4411 +4742 +-5442 +-9531 +2541 +-597 +7380 +-9078 +3813 +8294 +-3485 +8840 +4332 +732 +6111 +-8374 +4070 +-4272 +4708 +-7220 +-8060 +6982 +-7877 +-7340 +-1023 +-413 +5460 +-5367 +3695 +-5532 +8753 +-5796 +-2506 +-1578 +-469 +-1878 +-5753 +4171 +-8752 +1894 +5246 +-6884 +7103 +8291 +-6290 +7876 +-7479 +6797 +-4765 +-6625 +3301 +-8011 +-188 +-8090 +3252 +-2123 +-8312 +-3635 +-7108 +5433 +2512 +-524 +-3948 +-9177 +7955 +-2271 +-7346 +8373 +-6320 +1418 +-3769 +-3913 +6714 +5151 +-951 +2296 +5833 +-8817 +-6232 +7242 +-6103 +-8194 +-4220 +-2234 +-2061 +-1633 +9945 +-5430 +7663 +-4436 +-8104 +9708 +-3105 +2600 +-2166 +5277 +-5692 +3231 +6553 +-7048 +8187 +9548 +-4351 +-4214 +-9396 +-8306 +8153 +8308 +-5036 +2558 +-2410 +-4176 +3027 +3232 +1762 +-9384 +-2724 +-4786 +-7154 +-9869 +9701 +2161 +6470 +3521 +-1681 +-8533 +3185 +3483 +7985 +3579 +-9209 +-5532 +-6943 +-3260 +-5719 +-8002 +-3595 +-537 +-3302 +9957 +7039 +8689 +-6866 +5845 +-6093 +-9152 +6463 +4946 +-9541 +3781 +-2079 +-8044 +-4811 +-758 +-3300 +1519 +-7255 +-4999 +-2843 +-5754 +-9699 +2274 +4052 +-1549 +5700 +-5534 +9997 +3487 +5017 +3680 +-2571 +2476 +305 +1921 +2746 +-6178 +1353 +-7628 +-1680 +6499 +-5811 +-1231 +4507 +3486 +8898 +3516 +-5125 +4626 +4384 +-5054 +2297 +8376 +-1195 +-9346 +8775 +9729 +-5462 +-8402 +-8797 +-4140 +-548 +-1197 +-6181 +3403 +-352 +5687 +7554 +4448 +-7271 +2443 +-3661 +-4611 +2965 +-2483 +742 +-2194 +-4803 +4660 +4808 +8241 +-7370 +1007 +953 +4351 +2550 +-4973 +4472 +210 +-4560 +5188 +5676 +9414 +-4830 +-9331 +-4560 +-2592 +9451 +6975 +-4934 +7585 +-7565 +8098 +-7569 +9582 +6993 +4310 +-2696 +-8645 +-8432 +-1305 +-2483 +6996 +-2738 +7194 +3172 +9131 +-8678 +4535 +924 +4479 +-4858 +-1094 +2603 +-256 +-358 +3696 +8149 +-6600 +-4541 +-842 +-7847 +-6968 +-3872 +4476 +-8979 +5106 +-9617 +128 +1477 +3969 +3130 +-9108 +6248 +-2980 +2114 +2410 +126 +6727 +7290 +-2840 +5575 +-3643 +-3311 +4573 +9871 +-7447 +5029 +496 +-8413 +-7065 +2953 +-5079 +4734 +-4436 +9316 +5687 +1772 +9795 +9075 +3060 +6714 +5416 +1485 +7057 +8115 +5298 +-5244 +-657 +4295 +-2404 +-9019 +3394 +-2099 +4398 +-2526 +-7108 +-8033 +-4584 +-8112 +-138 +-3523 +2746 +-8462 +-1048 +7366 +-3260 +-2255 +-7010 +-6208 +-7546 +-5783 +2821 +-2699 +-2876 +-914 +3277 +1146 +8021 +5435 +5159 +5714 +9173 +5263 +-7013 +6720 +2135 +-4515 +7050 +6808 +9143 +-3712 +7501 +-511 +6809 +5250 +6164 +139 +-4357 +-8081 +7241 +6320 +8698 +-2659 +3851 +-3995 +-2140 +-2795 +6574 +-8070 +-9760 +-7540 +7194 +-5526 +-7666 +-9322 +-3732 +4374 +905 +618 +6631 +6213 +-6208 +-6729 +-4003 +-4436 +8232 +5061 +-4057 +-1030 +-5692 +-585 +6055 +-479 +3832 +6753 +-5271 +524 +-7297 +4375 +-515 +-211 +-4916 +-7409 +-1982 +-7433 +2620 +8643 +-8329 +-7016 +2138 +-517 +4162 +9776 +-4863 +-8316 +-6480 +-6706 +-6219 +9664 +-3461 +8182 +-6135 +5764 +-4988 +455 +-6627 +-3452 +-383 +-5827 +-3005 +-3859 +-5546 +9562 +-3244 +735 +8299 +6110 +5604 +1459 +-2478 +-8807 +-4060 +-1835 +-696 +9841 +5612 +-6156 +-5999 +9100 +1513 +-4884 +8392 +7143 +9127 +-7199 +7961 +-8621 +-9247 +-2148 +-7376 +-7828 +-9596 +-2684 +6166 +-1048 +-5639 +-5717 +-2854 +5944 +3418 +7501 +-6034 +3472 +-9018 +-2364 +4536 +-5032 +-594 +1902 +6730 +6758 +-9719 +-1954 +-153 +2760 +8083 +1598 +2302 +-2343 +-4362 +-2813 +-4831 +1942 +994 +-862 +-3130 +-6554 +-6450 +-1660 +-7249 +-3987 +-5752 +1205 +-2237 +9531 +6247 +-7125 +-9817 +8813 +5704 +-352 +4587 +-4119 +-2876 +-8008 +3938 +-5903 +-7088 +-6177 +8371 +-8644 +-1092 +2587 +8696 +-1197 +-939 +-9546 +-8054 +7691 +2206 +8369 +440 +2681 +-9039 +-5435 +2266 +-1466 +8181 +-4848 +9691 +-4875 +6612 +429 +-7931 +5222 +-2554 +9637 +4427 +-713 +7573 +-9746 +4504 +3504 +4894 +-2699 +2189 +-9628 +661 +8589 +8486 +-643 +-5511 +320 +9269 +1539 +7371 +-4910 +-5313 +-1241 +3368 +5620 +-8697 +-3423 +8690 +5030 +-3457 +-2181 +2186 +4989 +6791 +-3552 +-1304 +-1051 +2668 +1588 +-9241 +-2754 +2836 +-92 +-2958 +-9996 +6035 +8319 +8292 +-769 +202 +2953 +1558 +-9281 +7591 +9434 +1710 +1459 +-1844 +783 +-8097 +8896 +3403 +3953 +6412 +-3461 +7563 +-7004 +6389 +2563 +824 +-8234 +4037 +2819 +-351 +8731 +1037 +2097 +6841 +-6385 +1493 +8273 +-7120 +7856 +2628 +8795 +4984 +-1897 +2792 +1007 +-9766 +4535 +-1978 +1390 +-4102 +-6213 +-2800 +3948 +-7248 +-3140 +-6249 +1483 +128 +8928 +-3318 +6585 +-525 +7967 +-3563 +-2053 +-494 +-2250 +5577 +-2469 +3041 +1840 +7675 +-5812 +5571 +-1180 +-8269 +-7678 +5493 +1610 +1245 +1092 +-6155 +2469 +-1975 +-3657 +-3521 +-3844 +-7391 +5385 +6344 +-1713 +8836 +3389 +-8387 +6516 +2754 +-6182 +-7481 +-6651 +-6918 +180 +964 +2127 +-2767 +7472 +5272 +6791 +-9828 +-7197 +5104 +9824 +-7977 +-9877 +-370 +4541 +3396 +1540 +865 +338 +-2018 +-1054 +856 +-7615 +114 +-9008 +327 +-2684 +-3244 +-5894 +-8066 +8165 +8115 +2746 +9282 +3403 +-352 +-6302 +-3840 +-3437 +-9154 +-8901 +-2902 +1180 +-4413 +1887 +-4803 +-8101 +-5657 +-5595 +-5278 +-8246 +-1314 +5736 +-9263 +7124 +-3787 +-2714 +5372 +1934 +3579 +5954 +4710 +1788 +-7316 +2063 +6862 +8970 +8914 +-6718 +-482 +-6757 +-4521 +-6546 +128 +6505 +2896 +-5509 +-9768 +-2955 +6164 +5107 +-2876 +2070 +4354 +7242 +-9762 +-9336 +-7671 +449 +3989 +-1522 +-9925 +-4233 +-4967 +-9057 +6319 +-8862 +9086 +-7889 +4034 +-203 +-3071 +-1048 +-8297 +-1501 +-7511 +4349 +-6103 +-6049 +7860 +2498 +-6816 +-3311 +1910 +-9671 +-501 +-90 +737 +3078 +1570 +928 +3801 +-897 +4872 +1808 +-1243 +2408 +5784 +-4134 +-5186 +3441 +-7010 +-4436 +-7996 +550 +8575 +-9874 +-1194 +-3573 +-7031 +6294 +5798 +9244 +-9471 +9256 +-2794 +-3420 +4509 +5891 +3764 +-2267 +-1923 +777 +-8309 +1762 +5256 +-4861 +-5050 +3931 +-9356 +6216 +-688 +-162 +-5532 +-244 +4992 +6255 +-2800 +-410 +5827 +7205 +-8083 +-7311 +-7861 +2317 +7509 +4658 +-3556 +6892 +-3614 +3667 +2145 +7404 +63 +1711 +1774 +-4462 +5608 +6593 +-9823 +796 +7609 +-4577 +1964 +-2598 +722 +-610 +5028 +3300 +6661 +-7898 +-5163 +5344 +4472 +-3654 +7436 +5414 +-4561 +9461 +-4367 +-7167 +5026 +-9651 +2469 +-6950 +-165 +2511 +-9303 +-6113 +6628 +-5402 +-1432 +-6191 +4264 +5562 +6978 +-2304 +9438 +-2767 +-3968 +2185 +8646 +8375 +6784 +-401 +9728 +3931 +-7401 +6140 +-1844 +9109 +-2389 +-190 +-8604 +-5833 +-1463 +-3221 +1840 +-4274 +2070 +-6026 +-234 +-5472 +5099 +9343 +-4893 +3144 +-7075 +-6495 +-2855 +-643 +7642 +2289 +931 +-7200 +-6095 +9423 +1475 +778 +-4859 +1488 +2572 +-2498 +9342 +777 +8014 +6661 +-6704 +-5543 +7811 +-9077 +7501 +-6065 +-5695 +-4933 +-9033 +-1741 +2318 +7731 +1135 +-93 +7532 +6710 +-1963 +-9120 +-7905 +2094 +-7754 +8458 +-5464 +2160 +9971 +-5990 +-6476 +8028 +-1448 +9981 +-1767 +4985 +-9263 +-6662 +-1370 +4863 +-4355 +3983 +-5783 +4527 +6850 +-2305 +4541 +7025 +-1148 +3476 +4981 +-2542 +1309 +-1712 +2846 +3477 +9976 +2712 +5381 +-9397 +-8308 +-7704 +2371 +1558 +2187 +-3538 +-1003 +1575 +2212 +2972 +-4140 +-1108 +-2783 +-3702 +-901 +5362 +3325 +-104 +6280 +5070 +4238 +8623 +-7710 +-630 +5151 +-2837 +-4897 +-7565 +-9446 +9879 +-5235 +-254 +-1996 +3869 +-3018 +4397 +6633 +8049 +2725 +-9522 +50 +2611 +-2982 +-5408 +4797 +-5010 +-3809 +3895 +8113 +2132 +-6648 +8373 +5833 +-9068 +2101 +2935 +8078 +-6710 +6516 +-3422 +-2287 +-2902 +-8530 +-1778 +1712 +-2588 +357 +-1730 +8402 +-2505 +9244 +8838 +357 +-4640 +-4599 +-2107 +-663 +-4510 +-7144 +-9108 +-5186 +6731 +-2382 +-5903 +-5189 +6412 +-7065 +-6491 +4373 +-5580 +9362 +3061 +-2178 +-583 +2834 +-3658 +1166 +-1021 +-3622 +8435 +-7696 +-1197 +-8840 +-2148 +-6284 +-135 +-1011 +9100 +2722 +7992 +5701 +-3411 +-1389 +-7149 +-3098 +44 +-1000 +-1227 +-3311 +-7124 +7874 +-2124 +-8755 +-8041 +4670 +-5003 +9391 +2726 +9030 +5079 +6347 +250 +-4897 +-3598 +6255 +123 +4374 +-8214 +-2515 +1649 +-2555 +124 +-4375 +4896 +6226 +5518 +1901 +113 +-1118 +-196 +-4360 +-6648 +8504 +-6600 +-6010 +6473 +-2084 +-5471 +-4908 +-2923 +8398 +8677 +-6743 +-9800 +3140 +-6556 +-8926 +411 +4027 +-6704 +-7818 +-2269 +-3812 +722 +7399 +-4904 +8696 +-9815 +-8132 +6732 +3357 +2239 +2527 +8829 +9173 +-5335 +-2021 +8044 +8793 +456 +7031 +-9384 +3277 +1625 +-760 +-9097 +-5696 +-2456 +-4397 +7649 +8992 +2896 +1223 +-7898 +-4765 +-3253 +4070 +-8735 +5933 +1849 +20 +3076 +1905 +-560 +-6413 +-1445 +-9943 +5974 +9007 +558 +6755 +-9400 +4617 +-9070 +2449 +7961 +-5616 +-9997 +7239 +9095 +6967 +9573 +9884 +1047 +-1182 +5308 +-8172 +2795 +-8258 +-8833 +8537 +-2730 +2814 +2094 +1017 +-2360 +-8090 +-256 +4349 +-2679 +9423 +-5862 +6175 +7997 +338 +4065 +5385 +-1992 +860 +-3904 +4705 +-7444 +-8926 +1161 +7349 +534 +-8751 +-5943 +-7200 +-5435 +-7565 +694 +-4927 +-9869 +-5754 +9576 +8562 +-9354 +-5543 +2318 +370 +6150 +1497 +-3775 +9137 +-2783 +-4947 +4081 +-8076 +1414 +-8677 +-3521 +-5202 +-7882 +-4552 +-74 +5212 +-6582 +-7783 +-8020 +-7368 +-4276 +-1509 +4695 +-3657 +3560 +-7977 +-6123 +3035 +287 +-8293 +456 +-2192 +7445 +8317 +8847 +-6841 +-1197 +-6094 +15 +1754 +-383 +-463 +-5812 +-2456 +-1398 +3274 +7675 +4966 +6640 +-3669 +8134 +928 +6629 +-2686 +-5590 +1681 +4423 +-422 +6448 +-5409 +-8862 +-9902 +-9818 +3923 +-8273 +-8371 +1576 +-1010 +6717 +-4943 +601 +7948 +7488 +9605 +1719 +8460 +2271 +-8107 +-2887 +7642 +1239 +-8856 +568 +8308 +-6591 +4379 +-1835 +7235 +3252 +5290 +-4768 +-4276 +3802 +6746 +6238 +3572 +-241 +589 +-1473 +7777 +9519 +7649 +-9946 +4585 +-7014 +9408 +-9807 +-7971 +-6349 +-8834 +2087 +7807 +-8589 +-289 +9036 +-2566 +-3139 +6215 +8469 +-3726 +-3410 +-7807 +3394 +1043 +8802 +-339 +6374 +-2407 +-3723 +4737 +6181 +-7004 +4336 +-3036 +9170 +-4814 +7940 +2140 +-949 +-5597 +-2299 +-4852 +3032 +4827 +51 +4251 +6816 +5372 +9321 +7503 +5372 +-8317 +4521 +6408 +-8109 +6722 +7159 +4733 +-1331 +6286 +8362 +6818 +-4885 +5026 +-9746 +9344 +4676 +-1560 +-2389 +-9416 +-3830 +1936 +-6229 +761 +6386 +-5601 +8716 +2732 +-2406 +-2036 +4100 +2038 +-3750 +5666 +5607 +-2165 +5191 +-3453 +-5025 +998 +6514 +7380 +2627 +-716 +-4704 +9892 +3855 +-7065 +1916 +7498 +5648 +6900 +5080 +9293 +1321 +3433 +-2565 +-6942 +-7171 +-4947 +9344 +-8157 +6559 +-9460 +8352 +5159 +-5870 +8784 +-9761 +-9101 +-544 +828 +8991 +-2307 +3144 +8244 +3428 +-3966 +-6060 +5339 +6661 +6580 +8465 +-5613 +6975 +-4562 +-5842 +438 +3185 +5902 +4197 +4521 +4267 +-9322 +-7407 +51 +2550 +496 +5142 +1451 +-124 +9111 +7675 +3081 +-670 +-114 +-3222 +5910 +-9018 +126 +4985 +1726 +3394 +-3799 +-9177 +-1120 +9978 +-8387 +5277 +7916 +-2516 +-383 +9986 +2501 +1459 +2778 +9601 +-7061 +8646 +8775 +-862 +9741 +-9349 +-5680 +8298 +-8260 +-1638 +-8753 +9825 +-2077 +-8582 +-8848 +8770 +-1416 +-6060 +-4456 +474 +-7565 +-5639 +9185 +1239 +-4223 +4567 +7909 +-8172 +-9209 +-8045 +1819 +-434 +-3788 +-6377 +7494 +-742 +6092 +2814 +1021 +-3643 +1399 +-4108 +-2752 +-3275 +8431 +7549 +3307 +1590 +8689 +5503 +-7705 +-9938 +-4721 +-1911 +2572 +726 +3786 +-4506 +6225 +3188 +-5321 +-1745 +-730 +7352 +-4311 +7162 +-3178 +-3745 +623 +-850 +-6401 +-8316 +2037 +3347 +1304 +1309 +5251 +-8083 +-9348 +-7551 +-8204 +4600 +-6981 +1471 +-6069 +4167 +8241 +-7206 +-4060 +9265 +7080 +-5450 +8593 +-8494 +-5812 +1406 +6620 +3972 +3038 +3381 +2979 +-4814 +-2128 +-4421 +-6788 +-9601 +1626 +-3180 +7282 +-2516 +5884 +7985 +1339 +2264 +-9766 +5420 +-9522 +26 +4591 +6348 +-8703 +6516 +8731 +9224 +3147 +-337 +-370 +-2094 +3396 +727 +-2382 +4336 +-452 +9791 +-6050 +1726 +-10000 +5644 +2383 +2239 +-3987 +-2305 +-165 +5704 +8553 +-57 +-9958 +6959 +-9245 +-1549 +-9486 +6216 +-3007 +-6641 +6187 +-7786 +-6014 +-7765 +-552 +5241 +-847 +4743 +7238 +-4261 +-204 +9103 +-6970 +9517 +-5801 +1610 +-6446 +1079 +5350 +-271 +6602 +1849 +8152 +2740 +578 +-4801 +-4942 +-2902 +9926 +-6229 +2803 +9293 +7825 +6720 +-9512 +-7959 +-2655 +4562 +-7883 +3765 +-2958 +6864 +5188 +8051 +2896 +-7537 +7634 +-8831 +1288 +668 +-1425 +6035 +-7221 +7219 +5488 +-7381 +-1956 +-8190 +3979 +4641 +-1108 +-1331 +-9693 +-8964 +1537 +3512 +-3311 +4557 +-2267 +-3531 +-5253 +-9677 +-2192 +-6398 +1459 +7150 +-8424 +6386 +-2818 +99 +4879 +-3568 +7404 +-8826 +-8391 +9585 +-2017 +8124 +-1868 +510 +1867 +-8424 +-2855 +1356 +7517 +-7828 +3627 +5705 +8759 +-5534 +-9915 +654 +-5645 +6113 +7431 +2476 +-2382 +2182 +2006 +2587 +-671 +-4360 +3434 +-6368 +-6226 +4374 +4721 +9956 +3075 +-4868 +-2515 +-6217 +9137 +7494 +-6710 +-4879 +8113 +-5655 +3955 +-2431 +6215 +-6641 +464 +2681 +-6001 +-4979 +6202 +-778 +8276 +7511 +7315 +6735 +2258 +7239 +-8398 +1187 +6982 +-7635 +650 +6345 +-4981 +9911 +6255 +-3556 +-8238 +-1373 +4325 +3979 +7193 +3507 +6805 +913 +7821 +-3489 +-857 +5416 +-7108 +2811 +-6069 +-7199 +1547 +9841 +-244 +1897 +2398 +-6516 +-6353 +-3573 +348 +2241 +-6474 +-1749 +-7512 +6758 +-7133 +3974 +-4893 +4070 +-7409 +3711 +4387 +9342 +-5616 +6117 +-7622 +2712 +-582 +1976 +-7482 +7945 +8928 +-1167 +2073 +5975 +4936 +-1787 +6655 +-8947 +8908 +4156 +5759 +-4668 +-6162 +735 +1431 +-8767 +-2301 +-1385 +9927 +2289 +4638 +9617 +-4118 +903 +-4765 +6892 +-2568 +-5391 +-9979 +50 +594 +-3643 +-1758 +-7518 +305 +-8833 +2818 +3955 +8977 +3961 +6137 +1573 +1934 +-9776 +291 +5765 +8098 +-5812 +6424 +9470 +2494 +7532 +658 +-2673 +-8625 +-3769 +9673 +8388 +-9212 +-5537 +-3882 +-2469 +-73 +-2920 +-3127 +4429 +3585 +-2902 +697 +-6086 +8622 +6252 +-1633 +-4336 +4037 +-2658 +2142 +-4228 +-694 +-8286 +-6243 +9382 +-2362 +-79 +-8968 +-6919 +9307 +1943 +8635 +4534 +4448 +-4057 +8231 +1345 +80 +276 +-3354 +1477 +293 +-9546 +-6259 +-4863 +2972 +8408 +-3579 +1037 +-3620 +4197 +-9978 +9548 +-1545 +-2237 +6133 +-5313 +-4375 +1840 +7649 +-1596 +3670 +-617 +-5422 +-7875 +-4933 +7416 +2281 +6920 +8967 +-8132 +618 +995 +3067 +-1524 +4335 +-532 +1412 +-9997 +9472 +-9230 +-1000 +6823 +-734 +-618 +-9837 +4880 +6424 +-9790 +-2837 +-9361 +1035 +-2616 +-1369 +-4010 +-6252 +4214 +6790 +-5580 +-5132 +-5663 +8188 +2584 +177 +-3606 +-8414 +-1538 +-2235 +-3960 +8099 +-9784 +-5184 +-2795 +3427 +5700 +3056 +-3723 +7982 +8332 +6633 +1588 +315 +-8104 +8064 +8796 +-9719 +9779 +-2273 +6735 +-3186 +-7406 +-4218 +-7197 +-2812 +6474 +-289 +7567 +-4811 +7874 +2825 +1585 +6591 +-6946 +2186 +7279 +1386 +-6949 +2427 +4509 +3879 +-9093 +8829 +-4071 +-1549 +3769 +5676 +-597 +2187 +2166 +2309 +-8284 +6453 +9239 +9679 +-4600 +-3461 +-2389 +-3904 +-4437 +2404 +6731 +7869 +-5006 +-1538 +-5879 +-6322 +-4462 +5397 +-6603 +5404 +-8016 +-692 +931 +-8855 +4543 +7472 +-6041 +-8063 +-3950 +-6754 +636 +77 +9085 +5219 +1099 +-7427 +4609 +522 +-9336 +9729 +-5430 +8187 +-1190 +3325 +9861 +-2783 +7342 +9316 +334 +5231 +8132 +-3388 +8622 +7554 +1697 +-5313 +6640 +-9719 +4620 +-298 +-6612 +524 +9892 +3954 +6139 +8044 +-7482 +-5450 +6523 +8152 +-9135 +-6385 +-6489 +-6870 +-6439 +4498 +9283 +3740 +-916 +-4292 +-9943 +9976 +9637 +4548 +8921 +2057 +-2468 +-37 +-8977 +3373 +-6335 +3966 +3627 +-9024 +-8901 +-4330 +6449 +-5812 +5188 +7285 +2146 +9491 +-3707 +7747 +-2402 +5519 +-1473 +2816 +-1160 +3107 +-6712 +-8093 +5518 +-5783 +6137 +9856 +-9112 +7063 +990 +-1333 +4335 +5289 +-352 +-1545 +2005 +-9794 +-1619 +-6103 +5642 +712 +872 +-6367 +-3848 +8166 +-9212 +7239 +-8398 +3487 +690 +-9334 +-6211 +-9625 +-5176 +8399 +589 +1709 +-6898 +9954 +-6337 +8253 +7798 +-2409 +-6379 +5020 +9095 +-7683 +2610 +3734 +-7145 +1602 +7898 +7856 +2230 +5722 +3744 +2232 +-9385 +8253 +3245 +-3551 +5537 +-9800 +9759 +7021 +-4979 +-9239 +8472 +-643 +-9661 +9173 +-5278 +-3180 +1001 +-9276 +1166 +2314 +-6758 +-4860 +-7404 +9841 +-8989 +-8791 +-6469 +-6618 +-6877 +6099 +-8398 +8649 +4365 +3004 +-4670 +-7206 +-522 +7986 +-933 +-6929 +6839 +-850 +-6892 +7649 +8336 +-3715 +9573 +2206 +5843 +1964 +5400 +-452 +-7786 +8813 +-2111 +7384 +7577 +-905 +-9558 +-2505 +-837 +8896 +8656 +1469 +-1369 +-7110 +7015 +4012 +-2486 +2909 +8958 +2972 +151 +-6491 +-7376 +4631 +-6916 +9364 +-4532 +-3838 +-3769 +1074 +-9982 +-5295 +-2675 +-7311 +7239 +2723 +-6208 +-4406 +3177 +-9460 +-9762 +-8391 +-1515 +8064 +2934 +-225 +-3780 +6791 +-6743 +5616 +2125 +-6995 +-9353 +-7641 +-3691 +-6186 +6181 +-9177 +4253 +5089 +5704 +-3919 +-4600 +-3935 +-8538 +-7773 +-5348 +-1596 +1076 +-7096 +-8204 +-2358 +-8063 +-8833 +-4030 +5785 +-2500 +3631 +7945 +7350 +-3163 +7723 +2387 +-821 +8397 +-5381 +-383 +-673 +-8148 +-7434 +1497 +524 +3274 +3253 +8190 +-3515 +64 +6838 +-6086 +9410 +-111 +-4361 +1191 +7847 +2727 +8219 +-6487 +-4106 +5537 +-5601 +5399 +-4875 +9451 +-1643 +-8899 +-7350 +9624 +-7546 +-2619 +-1230 +6217 +-8041 +783 +-6083 +-9543 +248 +-4977 +6769 +-6155 +1729 +-8921 +-1513 +6620 +-1713 +-434 +8823 +3061 +-2092 +-3753 +-4764 +-6838 +-5108 +-5391 +-4372 +5604 +8034 +-6828 +-9531 +7398 +-3950 +-9979 +-5485 +8307 +2541 +-7475 +3066 +598 +-8140 +-138 +9109 +-6977 +-3563 +-8259 +-6568 +-3060 +-7205 +-3787 +1942 +92 +9385 +-5793 +3860 +3576 +5482 +8511 +-6120 +-8705 +-2679 +2001 +-9901 +-6121 +1648 +-7900 +-6453 +-8002 +-1364 +5615 +-5529 +-8284 +5041 +-72 +3144 +994 +7460 +1007 +-9725 +-865 +-8370 +-3189 +3600 +9517 +9173 +-4729 +-6494 +-7786 +-2655 +6303 +7398 +-5920 +2044 +-8343 +-6828 +7825 +-4577 +-9909 +-6828 +-8680 +6753 +3251 +2705 +9769 +9889 +9006 +9250 +8331 +-5042 +2314 +-79 +2727 +-4247 +609 +-5213 +-2198 +5686 +-9758 +5522 +6072 +-7444 +-2129 +-5079 +-3217 +-2491 +2285 +4365 +-3858 +-2079 +6909 +7566 +6386 +-6279 +-5321 +-6184 +-8862 +7100 +-3076 +5598 +5021 +-902 +9564 +5493 +-26 +-4197 +6226 +-2126 +-7901 +-6816 +-8021 +-4546 +6399 +737 +-6618 +5655 +-3745 +7081 +8343 +-5870 +-5269 +-4868 +-1363 +-3320 +2075 +-1842 +7554 +9038 +-4697 +-6494 +-8219 +7573 +9605 +-1432 +-2837 +-9414 +-7255 +-9329 +-1756 +1840 +-6038 +5227 +2092 +-6147 +3834 +6898 +-9138 +-9373 +-1877 +4306 +3228 +7983 +1036 +-8948 +1866 +-1959 +8373 +-5302 +419 +824 +-6749 +892 +3579 +1081 +-4374 +8840 +4465 +-3326 +-5836 +-5502 +348 +-6191 +7080 +6268 +-1524 +-6847 +9018 +6141 +4868 +-5137 +-9108 +6566 +-7206 +-8918 +-1291 +9317 +5852 +-4546 +-4289 +5943 +2274 +3475 +4627 +9892 +-3998 +-192 +1600 +-7143 +-2243 +6463 +8460 +-2129 +2393 +5518 +-7416 +-2491 +-8766 +-5351 +-9209 +-1358 +4438 +4838 +-3324 +7481 +1313 +8795 +-5924 +9086 +-3675 +9433 +-7271 +7481 +-2342 +-9558 +804 +1583 +6041 +-9101 +-3318 +-3809 +2449 +-7312 +-1651 +-7303 +-2813 +-6123 +7361 +-8099 +-2783 +-1508 +2716 +5252 +8913 +-9798 +-9324 +4658 +-8381 +-5442 +1838 +-170 +-2584 +-7943 +-2094 +-352 +5613 +-779 +-2724 +5313 +5261 +9377 +-7401 +7100 +-7697 +3900 +-9522 +-7898 +-8738 +6237 +4985 +-4223 +-3040 +9871 +8085 +-4011 +-862 +-6612 +-6407 +7112 +5617 +94 +-9554 +-8780 +4019 +821 +3432 +-6490 +2669 +6508 +6151 +-6977 +3989 +-6092 +-670 +-6101 +-8703 +5529 +8435 +9202 +8255 +-8090 +4339 +-9916 +-3746 +-4931 +-2267 +-4003 +-4713 +9152 +-5601 +-842 +8895 +1887 +2231 +-6460 +-10 +2101 +9023 +7480 +6696 +-5774 +4459 +697 +602 +6564 +-4077 +-6322 +712 +5381 +2494 +8930 +7585 +-897 +2679 +-2287 +3475 +-2342 +-469 +2906 +-779 +-8957 +1590 +5384 +8187 +2628 +8584 +1309 +6842 +9802 +-4432 +-6750 +-6252 +8062 +-8767 +-694 +-7977 +691 +-6932 +-699 +3931 +508 +4480 +-760 +-2267 +-3252 +2339 +-1067 +6731 +-9781 +9517 +-364 +7127 +-204 +-79 +6723 +-9481 +6628 +-2483 +-3437 +5283 +1067 +2905 +-4101 +-364 +8255 +-9115 +-4521 +-9725 +9585 +-4606 +-4604 +-7252 +-1151 +139 +-9852 +8458 +2691 +9564 +6591 +-337 +4387 +-6102 +-2848 +-1119 +-8132 +6580 +-2982 +-9513 +6758 +-880 +1662 +8771 +-5601 +-1127 +1519 +-1197 +-6627 +3035 +-9372 +1136 +-2563 +-7710 +2044 +4783 +11 +-7482 +8918 +7473 +-1072 +-9310 +-7626 +-9559 +3403 +-693 +-9587 +-8787 +-9902 +2307 +-7066 +-4381 +1238 +-4806 +25 +-5135 +8516 +-930 +6635 +7008 +-8964 +-282 +2259 +315 +-2101 +2473 +4827 +6319 +3096 +-4056 +-4176 +617 +-7045 +-8996 +-14 +-8011 +-1698 +317 +-9024 +-7311 +892 +-8340 +-1534 +-8384 +3034 +5942 +6586 +-7671 +4964 +-3796 +2379 +5772 +989 +-6546 +-5135 +-3393 +8300 +4248 +517 +-8378 +-5218 +-5645 +-2750 +-9704 +9829 +-1619 +7794 +-7179 +-6536 +-7515 +989 +8528 +2108 +-9666 +-6258 +-6155 +6140 +-1845 +-1020 +-9666 +315 +-7144 +3224 +2679 +3285 +-9910 +7202 +2232 +1069 +-4574 +-3982 +-9858 +-7774 +9111 +2186 +8078 +-7482 +6250 +7834 +5021 +-2898 +-2211 +-2211 +-5621 +2181 +-8899 +2733 +-2079 +-8862 +3276 +7910 +7399 +6643 +-5347 +-4603 +5866 +5220 +-9339 +-2258 +-4433 +8373 +4617 +-8374 +-5763 +8891 +-1432 +9374 +572 +647 +-2469 +8617 +6841 +-7548 +-3036 +3993 +-7031 +5578 +-7356 +-6891 +-7765 +-3976 +-3899 +-5646 +-302 +871 +-5379 +-8926 +30 +2930 +8709 +-7117 +-6446 +-298 +-1908 +-4556 +-6257 +4621 +6351 +-3180 +8244 +5771 +2819 +3832 +3920 +-1068 +-8415 +8628 +1444 +-3859 +9611 +1905 +-8099 +5015 +-8041 +8348 +-4966 +1931 +-3551 +-7865 +2992 +4727 +8458 +-3872 +3262 +3302 +7825 +-9391 +-5808 +1196 +-9416 +7426 +2869 +467 +1727 +6561 +-4681 +2462 +-3173 +-8342 +-8002 +6055 +-5994 +3518 +3190 +2911 +8397 +2444 +-7762 +-4397 +-119 +-8099 +8278 +-4675 +3245 +-9505 +7342 +9863 +721 +662 +-3872 +7808 +1732 +-4997 +6892 +6102 +-9856 +4272 +8390 +-8977 +-3769 +5639 +6932 +4019 +-4675 +2746 +5212 +7911 +-3355 +-3437 +-6080 +6523 +3610 +-8179 +6519 +743 +-7311 +4289 +-4749 +4502 +2575 +625 +4141 +3427 +1259 +-6060 +-5601 +-1115 +-6483 +-2403 +-4778 +5046 +1610 +-7175 +-6445 +-4966 +-8826 +8278 +7622 +8553 +8049 +7239 +9877 +9236 +-4498 +2764 +5607 +5976 +-111 +3049 +4521 +8484 +-2579 +9439 +6319 +-2404 +2760 +1729 +-6923 +1625 +-3708 +-6138 +-3868 +-2063 +2550 +-4241 +4014 +8542 +9497 +-6676 +-8742 +-1776 +-6864 +-1680 +8425 +-2838 +-9691 +8796 +-4101 +5607 +-7306 +-4127 +9889 +-4422 +1602 +-5778 +4734 +1412 +6314 +107 +5609 +5 +6743 +5730 +2816 +-6935 +-2586 +-7034 +-4765 +-6369 +-2028 +822 +2977 +-3466 +1265 +-425 +-6453 +-812 +6749 +6855 +8933 +-1106 +5433 +-3614 +-8571 +3100 +8545 +-9252 +8770 +4735 +6286 +4336 +5607 +6720 +9110 +1644 +-2491 +6053 +1343 +-2777 +-4722 +8239 +-5696 +1264 +-5601 +4148 +5138 +8830 +-3447 +9706 +1588 +3687 +1077 +660 +6826 +6083 +-5652 +-5645 +-7155 +942 +5263 +-5054 +1934 +-6033 +-2571 +-5204 +3094 +8721 +6823 +-7482 +-1699 +-2410 +-5920 +-3448 +7872 +7099 +-865 +-7143 +1135 +8205 +5572 +1719 +-5907 +-8983 +5595 +2893 +-4937 +-1779 +-4725 +-1980 +9394 +3780 +6735 +8231 +960 +-3465 +8549 +-2009 +-2162 +3687 +-3288 +5503 +-2317 +6633 +8709 +1585 +905 +4314 +5298 +6499 +-3920 +-3184 +-5260 +-655 +7591 +6758 +-8567 +5537 +1379 +-7196 +-9558 +-5501 +-7936 +-425 +-1005 +6474 +-1051 +4844 +9627 +8616 +2724 +3663 +-9585 +5667 +8181 +1345 +9461 +2892 +-2974 +-1596 +2975 +-2571 +-2188 +9229 +5212 +9293 +5419 +3130 +-1120 +-6243 +4769 +-2483 +-6093 +-7434 +8696 +6987 +126 +6612 +3713 +4932 +1681 +-6807 +-6360 +4207 +1991 +-4180 +-6140 +8985 +2768 +2733 +6034 +7585 +4197 +-9377 +8974 +-1382 +7532 +-1684 +8662 +-8421 +-624 +-9471 +4617 +2691 +-2581 +8332 +5082 +-5667 +-3066 +9217 +1306 +1350 +3571 +1118 +-7773 +9729 +3808 +-6508 +3808 +-5236 +9317 +9838 +-1953 +5485 +2165 +7995 +-6009 +4037 +124 +-8104 +-3741 +-8760 +-5472 +6669 +7490 +6635 +9423 +-5630 +-9904 +-6590 +2781 +-9558 +4572 +-3908 +-9230 +-1709 +726 +2906 +5620 +2081 +5061 +-1809 +3898 +-9869 +-3978 +3903 +7609 +320 +99 +9030 +8854 +1149 +-2469 +4384 +503 +-7823 +-9901 +-4600 +4314 +5474 +6202 +-7059 +9440 +-527 +2959 +5676 +-2902 +-9318 +7441 +8176 +4969 +-8269 +7250 +3602 +2212 +9414 +-1329 +-924 +979 +-8008 +8528 +-434 +818 +214 +-6034 +-8824 +-8353 +589 +-4456 +7162 +9808 +3325 +9601 +6722 +4376 +-72 +6924 +8241 +-8345 +-9802 +-3697 +4715 +-507 +-4140 +-4697 +-5887 +3154 +-8918 +-7482 +-6438 +9246 +4347 +-7598 +8882 +-5391 +7193 +6469 +-4381 +-336 +3068 +-9075 +4217 +-9188 +-7457 +-2492 +5613 +896 +-5580 +-9092 +-157 +675 +-6750 +8460 +-3173 +-4380 +-6243 +6975 +979 +-8723 +-688 +-1517 +-1926 +-3760 +4096 +1668 +-6570 +-6407 +7350 +-5337 +6010 +-4778 +3144 +4969 +3202 +-7865 +-2787 +8154 +7481 +-4811 +-8026 +-7382 +3776 +-5283 +9759 +-1573 +8452 +-3239 +1126 +737 +-8621 +1727 +-1193 +7026 +-9110 +9721 +3100 +928 +-8495 +-8468 +3093 +-2734 +5836 +-9042 +9946 +1337 +-8466 +-8041 +53 +3240 +-5849 +-5612 +8696 +-5253 +-4973 +-391 +6590 +-3223 +3195 +-1306 +-385 +3252 +-6480 +2255 +-4604 +8295 +1264 +5246 +3440 +7485 +-6378 +1506 +2778 +-4744 +597 +7451 +2682 +1685 +3185 +-6885 +4791 +8973 +1293 +1892 +-1316 +1136 +-8085 diff --git a/flake.nix b/flake.nix index 6e81061..0454ba5 100644 --- a/flake.nix +++ b/flake.nix @@ -18,7 +18,7 @@ { devShells = forAllSystems (pkgs: with pkgs; { - default = mkShell { + default = (mkShell.override { stdenv = llvmPackages_16.stdenv; }) { buildInputs = [ ghc cabal-install haskell-language-server ]; }; }); diff --git a/src/Days/D20.c b/src/Days/D20.c new file mode 100644 index 0000000..4e0d900 --- /dev/null +++ b/src/Days/D20.c @@ -0,0 +1,305 @@ +#include +#include +#include +#include +#include +#include + +#define max(a,b) \ +({ \ + __typeof__ (a) _a = (a); \ + __typeof__ (b) _b = (b); \ + _a > _b ? _a : _b; \ +}) + +/////////////////// +// AVL-TREE NODE // +/////////////////// + +typedef struct Node { + struct Node *parent; + struct Node *leftChild; + struct Node *rightChild; + int32_t size; + int32_t height; + int64_t value; +} Node; + +//////////////////////////////// +// NULL-SAFE NODE DATA ACCESS // +//////////////////////////////// + +int32_t height(Node *node) +{ + return node == NULL ? 0 : node->height; +} + +int32_t size(Node *node) +{ + return node == NULL ? 0 : node->size; +} + +int balance(Node *node) +{ + return node == NULL ? 0 : height(node->leftChild) - height(node->rightChild); +} + + +/////////// +// RESET // +/////////// + +void resetHeight(Node *node) +{ + node->height = 1 + max(height(node->leftChild), height(node->rightChild)); +} + +void resetSize(Node *node) +{ + node->size = 1 + size(node->leftChild) + size(node->rightChild); +} + + +/////////////////// +// AVL-ROTATIONS // +/////////////////// + +Node *rotateL(Node *root) +{ + assert(root); + assert(root->rightChild); + + Node *newRoot = root->rightChild; + Node *transfer = newRoot->leftChild; + + newRoot->leftChild = root; + root->rightChild = transfer; + + newRoot->parent = root->parent; + root->parent = newRoot; + + if (transfer != NULL) transfer->parent = root; + + resetSize(root); + resetSize(newRoot); + + resetHeight(root); + resetHeight(newRoot); + + return newRoot; +} + +Node *rotateR(Node *root) +{ + assert(root); + assert(root->leftChild); + + Node *newRoot = root->leftChild; + Node *transfer = newRoot->rightChild; + + newRoot->rightChild = root; + root->leftChild = transfer; + + newRoot->parent = root->parent; + root->parent = newRoot; + + if (transfer != NULL) transfer->parent = root; + + resetSize(root); + resetSize(newRoot); + + resetHeight(root); + resetHeight(newRoot); + + return newRoot; +} + +/////////////////// +// MODIFICATIONS // +/////////////////// + +Node *insert_pos_rec(Node *root, int pos, Node *newNode, Node *parent) +{ + assert(0 <= pos && (!root || pos <= root->size)); + + if (root == NULL) { + assert(pos == 0); + + newNode->leftChild = NULL; + newNode->rightChild = NULL; + if (parent != NULL) newNode->parent = parent; + + resetSize(newNode); + resetHeight(newNode); + + return newNode; + } + + if (pos <= size(root->leftChild)) + root->leftChild = insert_pos_rec(root->leftChild, pos, newNode, root); + else + root->rightChild = insert_pos_rec(root->rightChild, pos - size(root->leftChild) - 1, + newNode, root); + + resetSize(root); + resetHeight(root); + + int bal = balance(root); + + if (bal > 1) { + if (pos > size(root->leftChild->leftChild)) + root->leftChild = rotateL(root->leftChild); + + root = rotateR(root); + } + + if (bal < -1) { + int posUpd = pos - size(root->leftChild) - 1; + + if (posUpd <= size(root->rightChild->leftChild)) + root->rightChild = rotateR(root->rightChild); + + root = rotateL(root); + } + + return root; +} + +Node *insert_pos(Node *root, int pos, Node *newNode) +{ + return insert_pos_rec(root, pos, newNode, NULL); +} + +Node *delete_pos_rec(Node *root, int pos, Node **victim) +{ + assert(root); + assert(0 <= pos && (!root || pos <= root->size)); + + if (pos < size(root->leftChild)) + root->leftChild = delete_pos_rec(root->leftChild, pos, victim); + else if (pos > size(root->leftChild)) + root->rightChild = delete_pos_rec(root->rightChild, pos - size(root->leftChild) - 1, victim); + else { + *victim = root; + + if (root->leftChild == NULL) return root->rightChild; + if (root->rightChild == NULL) return root->leftChild; + + Node *replacement; + root->rightChild = delete_pos_rec(root->rightChild, 0, &replacement); + + replacement->leftChild = root->leftChild; + replacement->rightChild = root->rightChild; + replacement->parent = root->parent; + + root = replacement; + } + + if (root->leftChild) root->leftChild->parent = root; + if (root->rightChild) root->rightChild->parent = root; + + resetSize(root); + resetHeight(root); + + int bal = balance(root); + + if (bal > 1) { + if (balance(root->leftChild) < 0) + root->leftChild = rotateL(root->leftChild); + + root = rotateR(root); + } + + if (bal < -1) { + if (balance(root->rightChild) > 0) + root->rightChild = rotateR(root->rightChild); + + root = rotateL(root); + } + + return root; +} + +Node *delete_pos(Node *root, int pos, Node **victim) +{ + return delete_pos_rec(root, pos, victim); +} + +int wrap(long long n, int mod) +{ + return (n % mod + mod) % mod; +} + +////////////// +// QUERYING // +////////////// + +Node *node_at_position(Node *root, int pos) +{ + assert(root); + assert(0 <= pos && pos <= root->size); + + if (pos < size(root->leftChild)) + return node_at_position(root->leftChild, pos); + else if (pos > size(root->leftChild)) + return node_at_position(root->rightChild, pos - size(root->leftChild) - 1); + else + return root; +} + +int32_t position_of_node(Node *node) { + int32_t pos = size(node->leftChild); + + for (; node->parent; node = node->parent) + if (node->parent->rightChild == node) + pos += size(node->parent->leftChild) + 1; + + return pos; +} + +///////////// +// FFI API // +///////////// + +typedef struct CyclicList { + Node *root; + Node *nodes; +} CyclicList; + +int32_t position_of_nth_value(CyclicList *cl, int32_t n) { + assert(0 <= n && n < cl->root->size); + return position_of_node(&cl->nodes[n]); +} + +int64_t value_at_position(CyclicList *cl, int32_t pos) { + return node_at_position(cl->root, wrap(pos, cl->root->size))->value; +} + +CyclicList *cyclic_list_from_array(int64_t *values, int numValues) { + CyclicList* cl = malloc(sizeof(CyclicList)); + + cl->root = NULL; + cl->nodes = (Node *) malloc(sizeof(Node) * numValues); + + for (int i = 0; i < numValues; i++) + cl->nodes[i].value = values[i]; + + for (int i = 0; i < numValues; i++) + cl->root = insert_pos(cl->root, i, &cl->nodes[i]); + + return cl; +} + +void mix(CyclicList *cl, int32_t rounds) { + Node *victim; + + int length = cl->root->size; + for (int j = 0; j < rounds; j++) { + for (int i = 0; i < length; i++) { + int idx = position_of_node(&cl->nodes[i]); + cl->root = delete_pos(cl->root, idx, &victim); + int newIdx = wrap(idx + victim->value, length - 1); + cl->root = insert_pos(cl->root, newIdx, victim); + } + } +} diff --git a/src/Days/D20.hs b/src/Days/D20.hs new file mode 100644 index 0000000..c8703fa --- /dev/null +++ b/src/Days/D20.hs @@ -0,0 +1,69 @@ +{-# LANGUAGE ImportQualifiedPost #-} + +module Days.D20 where + +import Common +import Data.Int (Int32, Int64) +import Data.Maybe (fromJust) +import Data.Vector.Storable qualified as Vector +import Foreign qualified +import Parse +import System.IO.Unsafe (unsafePerformIO) + +-- Dummy types for FFI +data CyclicList = CyclicList + +foreign import ccall unsafe "cyclic_list_from_array" + cMkCyclicList :: + Foreign.Ptr Int64 -> + Int32 -> + Foreign.Ptr CyclicList + +foreign import ccall unsafe "mix" + cMix :: + Foreign.Ptr CyclicList -> + Int32 -> + IO () + +foreign import ccall unsafe "position_of_nth_value" + cPositionOfNthValue :: + Foreign.Ptr CyclicList -> + Int32 -> + Int32 + +foreign import ccall unsafe "value_at_position" + cValueAtPosition :: + Foreign.Ptr CyclicList -> + Int32 -> + Int64 + +parser :: Parser [Int] +parser = someLines int + +decrypt :: Int -> [Int] -> [Int64] +decrypt rounds numbers = + let iv = Vector.fromList $ map (fromIntegral :: Int -> Int64) numbers + zeroIndex = fromJust $ Vector.elemIndex 0 iv + (dataPtr, dataLen) = Vector.unsafeToForeignPtr0 iv + groveOffsets = [1000, 2000, 3000] + in unsafePerformIO $ + Foreign.withForeignPtr + dataPtr + ( \ptr -> do + let cycList = cMkCyclicList ptr (fromIntegral dataLen) + cMix cycList (fromIntegral rounds) + let zeroPos = cPositionOfNthValue cycList (fromIntegral zeroIndex) + return $ map (cValueAtPosition cycList . (+ zeroPos)) groveOffsets + ) + +part1 :: [Int] -> Int64 +part1 = sum . decrypt 1 + +decryptionKey :: Int +decryptionKey = 811589153 + +part2 :: [Int] -> Int64 +part2 = sum . decrypt 10 . map (* decryptionKey) + +day :: Day +day = parsecDay parser (definitive . part1, definitive . part2) diff --git a/src/Lib.hs b/src/Lib.hs index 2a1cc4e..4d930c9 100644 --- a/src/Lib.hs +++ b/src/Lib.hs @@ -31,6 +31,7 @@ import Days.D16 qualified as D16 import Days.D17 qualified as D17 import Days.D18 qualified as D18 import Days.D19 qualified as D19 +import Days.D20 qualified as D20 import Data.ByteString.Char8 qualified as BS import Data.Text.IO qualified as T @@ -62,4 +63,5 @@ days = , [D17.day] , [D18.day] , [D19.day] + , [D20.day] ]