diff --git a/Cargo.lock b/Cargo.lock index 9a47356..f1371a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -357,6 +357,9 @@ version = "0.1.0" [[package]] name = "day20" version = "0.1.0" +dependencies = [ + "bitvec", +] [[package]] name = "day21" diff --git a/day20/Cargo.toml b/day20/Cargo.toml index 27d0761..ed31895 100644 --- a/day20/Cargo.toml +++ b/day20/Cargo.toml @@ -8,3 +8,4 @@ build = true app = true [dependencies] +bitvec = "1.0.1" diff --git a/day20/input b/day20/input new file mode 100644 index 0000000..abf5a7f --- /dev/null +++ b/day20/input @@ -0,0 +1,5000 @@ +6624 +7325 +6213 +1798 +9065 +-3023 +2228 +5781 +8106 +-1769 +4419 +9584 +-9853 +9030 +-509 +2861 +-9318 +9950 +-6947 +-3741 +-9442 +5010 +-3228 +913 +4187 +2164 +-7370 +4620 +-6913 +2359 +2933 +8865 +6380 +8205 +-3995 +-5111 +-6632 +225 +5830 +3878 +-4605 +8165 +-5659 +1215 +2149 +9425 +-7708 +-8171 +-8149 +-9590 +3667 +-6599 +-5340 +6062 +-3499 +190 +5546 +6787 +3794 +9541 +5662 +-817 +-4468 +-2309 +8034 +2678 +6596 +3902 +6732 +9041 +-9091 +-4509 +-6627 +-9980 +1091 +-6956 +4293 +1893 +-5948 +-9450 +60 +-2821 +-3639 +-6528 +-1218 +1126 +7445 +3376 +-9375 +7269 +9325 +-5345 +5707 +-5010 +9462 +-5106 +-58 +-2809 +-4582 +8002 +4902 +996 +8592 +-3758 +-9995 +1566 +-3997 +-808 +3041 +6971 +2322 +1443 +-5695 +-5052 +-9133 +7994 +-9818 +7837 +750 +8610 +-2360 +-6645 +-247 +-199 +8006 +5526 +-967 +-4468 +6906 +7627 +5344 +-5978 +8335 +8485 +-6011 +5344 +-5186 +-3058 +5340 +-8972 +2276 +778 +9825 +6921 +5464 +2799 +9092 +-1737 +-8107 +-7434 +-3574 +5571 +1806 +3577 +1156 +-9316 +924 +7253 +8038 +1326 +-1629 +2541 +1544 +-1379 +1094 +-8691 +-9215 +5367 +2744 +-8532 +-4137 +-3510 +-7932 +4123 +8883 +-6135 +6790 +-5512 +5810 +-208 +593 +-4863 +-9666 +-4149 +-1358 +-6154 +-6056 +-1942 +-4171 +7720 +6073 +-5738 +793 +3531 +-3119 +6172 +7394 +-6548 +-7197 +-1460 +9203 +3857 +-7129 +5513 +-6718 +-5780 +1151 +-4568 +-7106 +-3775 +6218 +-7701 +-3930 +-7460 +-9912 +2255 +-1408 +1459 +-3368 +3740 +7650 +-6184 +678 +-1641 +2326 +3029 +1987 +3386 +6656 +-8519 +5817 +-1619 +9649 +-1967 +-3260 +-962 +-8628 +-1059 +6275 +5830 +-4399 +-5818 +7652 +4514 +1507 +-2360 +9298 +-5499 +-9089 +6300 +1505 +6985 +-9516 +1212 +-938 +4359 +-1562 +182 +4296 +2561 +2282 +7897 +7650 +-8490 +-714 +1172 +1337 +899 +1899 +-628 +-8475 +-2197 +9151 +-5599 +-5234 +-1272 +7316 +-5727 +218 +2701 +-545 +-6146 +2827 +1558 +-7692 +3563 +5531 +-817 +-6059 +-3484 +-301 +3861 +-593 +1986 +1219 +-3744 +5394 +8466 +8166 +-2384 +456 +5967 +-8645 +6343 +314 +-3525 +-521 +2181 +8328 +4462 +-5318 +4415 +1296 +9318 +434 +-4488 +-4556 +-9242 +4688 +5643 +4804 +8735 +3885 +4766 +3929 +-3794 +7704 +-726 +-2488 +6454 +-1748 +-5579 +-7744 +-765 +4160 +-4479 +4620 +841 +-45 +8750 +-3576 +2505 +945 +-5306 +7905 +-171 +2727 +-4664 +-5846 +-3139 +4053 +-9356 +-6161 +-3984 +8240 +5789 +-962 +381 +-5362 +-6633 +5168 +-2479 +1269 +-9285 +-1887 +-6104 +-8975 +5391 +8157 +2299 +-6209 +5399 +-6571 +-1298 +9457 +2627 +-1260 +3290 +-8564 +-7574 +8308 +3384 +-7896 +1000 +-2754 +2626 +-2938 +6030 +-4149 +-8968 +7407 +8137 +-5339 +-2460 +161 +1504 +6424 +3378 +-9376 +-4841 +1700 +-7159 +6269 +8075 +-802 +6581 +-4811 +3915 +-2516 +-840 +5985 +1090 +2568 +8629 +7821 +-1386 +-764 +-6519 +2051 +-1103 +8003 +2979 +-5858 +-560 +-6105 +-4856 +6571 +-1491 +7083 +2035 +2971 +-9191 +3696 +-6843 +5613 +9431 +7171 +-125 +-8705 +32 +1537 +-583 +3058 +5322 +4931 +7226 +-2215 +372 +9846 +81 +-7040 +-726 +9249 +7453 +2971 +-2265 +2842 +6445 +-638 +-9617 +5466 +7386 +-7588 +9352 +2220 +8685 +-7040 +-3475 +-3116 +2901 +2165 +1861 +7944 +3342 +-6513 +5991 +434 +-6799 +3287 +-8217 +3121 +1810 +3965 +7212 +-7015 +3614 +7717 +-2419 +-99 +-8023 +-2509 +-3338 +-9976 +-829 +7437 +-5460 +3387 +-1230 +5605 +678 +7462 +-8821 +8367 +3884 +-5851 +-171 +-3574 +-4952 +-6195 +-4617 +2017 +6831 +6183 +-261 +3731 +-6575 +6001 +5311 +-796 +-6991 +2290 +9489 +-7926 +-1948 +-7588 +-9887 +-9079 +7546 +766 +-5559 +-1840 +-5793 +8903 +2617 +7256 +-784 +7394 +3458 +1810 +6355 +366 +-2458 +5339 +-3022 +-8706 +7789 +8465 +3587 +-9080 +5065 +8397 +9199 +6061 +-7318 +-8330 +5674 +-3876 +-5251 +4335 +3719 +-7216 +7546 +-9738 +4184 +-3437 +1271 +400 +2505 +3782 +4525 +-654 +-9798 +-5643 +-1932 +-8417 +8157 +-31 +-6284 +-8618 +8954 +-7716 +7925 +-3852 +-5075 +2520 +-7508 +9580 +-5642 +-2524 +4123 +-9134 +5322 +2296 +-6238 +-135 +-2360 +-2645 +400 +7740 +7240 +-5289 +2616 +3914 +8366 +-9152 +6912 +2452 +6332 +-9676 +2182 +-7539 +5051 +-3741 +8229 +-9163 +-5895 +-2492 +-2927 +-4532 +-6577 +-3331 +-2641 +1372 +3058 +8506 +1372 +4269 +8207 +-8633 +1703 +7441 +3113 +-4102 +-7969 +4202 +-220 +-6242 +-3279 +1983 +7654 +7051 +-421 +-9574 +-2156 +-7046 +4004 +-3016 +731 +-2544 +-5776 +495 +3384 +7591 +5235 +7884 +378 +-7184 +9905 +-8930 +-5013 +-5701 +3248 +-3147 +-608 +-5109 +9154 +5568 +327 +-9319 +-8797 +1511 +7227 +-3196 +9436 +7886 +-6964 +3441 +-3830 +-3444 +9811 +8750 +587 +8074 +7927 +-3330 +-5678 +-8577 +-5103 +4043 +4886 +6734 +8778 +-8038 +-6652 +-4940 +-601 +-5256 +4047 +-4278 +8714 +649 +8207 +-4689 +-31 +4521 +-460 +-7190 +9649 +8027 +-4295 +1631 +5602 +3831 +3588 +6169 +8070 +1496 +-5299 +-5813 +-5043 +2521 +-3368 +5050 +-8539 +-508 +-3609 +-3049 +-6991 +2128 +5520 +5333 +6474 +2671 +-4472 +1994 +-9578 +-108 +-94 +6764 +8466 +5695 +-7224 +1564 +25 +2873 +-4758 +234 +1723 +-5430 +-9782 +-4971 +5824 +-4619 +-8666 +-4592 +-3744 +-3443 +5380 +5559 +3255 +3160 +-7742 +-4999 +6502 +9586 +6908 +-6635 +7598 +-2262 +-818 +-1333 +5420 +-7703 +-562 +876 +4433 +2918 +-1831 +-4402 +-4965 +2401 +-5846 +6132 +-8827 +7694 +8771 +-5242 +8012 +7964 +9609 +4620 +3953 +-4519 +-4681 +4480 +-1949 +-9930 +5176 +-7405 +6876 +3108 +-3160 +-1161 +-948 +3919 +3290 +8706 +2523 +-4977 +2745 +4977 +4866 +2943 +-8527 +-4158 +876 +9660 +-6193 +-6535 +-6421 +-3490 +1160 +9692 +793 +-5217 +-8502 +-3337 +-4154 +-706 +-832 +-6567 +-7140 +4497 +-8826 +-3887 +-365 +-4961 +3821 +-645 +1061 +4542 +-3014 +3199 +-6260 +-648 +5456 +-8795 +-58 +5868 +1155 +6877 +-1116 +3836 +7487 +2368 +1504 +-9289 +-4147 +4426 +-1224 +1185 +-3026 +-1669 +5758 +6515 +6343 +-4879 +-8557 +6005 +9605 +3725 +8579 +-480 +-5318 +-2141 +7606 +5049 +-1224 +6490 +1348 +1602 +-7929 +4805 +-5595 +-5196 +8669 +2848 +5698 +-1048 +-4495 +-1996 +3052 +-1283 +-105 +-6038 +-9121 +-9558 +6283 +3198 +-7655 +4986 +-5601 +5676 +-3178 +-6947 +-5026 +6955 +-4154 +-7358 +9312 +-4149 +6946 +-2693 +-9306 +691 +-6932 +-4485 +-7311 +-5466 +3019 +7790 +9161 +1498 +9721 +7714 +1252 +7852 +-5935 +-7235 +-5051 +-3762 +-9187 +-8216 +-1374 +-1673 +-3389 +-1880 +-5847 +-7995 +-2798 +-8695 +-8486 +1117 +8085 +-8916 +-237 +-254 +2842 +785 +7496 +-9835 +-559 +-4811 +5976 +-1168 +9249 +-5339 +-7895 +-9892 +4208 +8113 +3988 +-6933 +6716 +7809 +-2194 +-3712 +1646 +3264 +5367 +78 +3778 +-1677 +4743 +3547 +-2852 +3052 +-1711 +-375 +-4261 +-1268 +1493 +524 +4011 +3264 +-7241 +5615 +-2257 +6673 +1363 +7484 +8478 +7847 +-2779 +4620 +-7017 +-2294 +-5433 +9706 +2565 +385 +-5913 +-2362 +-1929 +-6428 +9458 +-3022 +5352 +1361 +7928 +2109 +2250 +4224 +-126 +-446 +-543 +171 +-2078 +8071 +-9335 +-4400 +5419 +-6242 +4629 +-3876 +838 +-8820 +-4396 +6582 +-5970 +6287 +6045 +-5940 +1017 +-5979 +6361 +4657 +-249 +1339 +5038 +9610 +-6340 +9541 +-2816 +-5627 +-6169 +2943 +-5466 +5789 +-2626 +-5251 +2121 +-1681 +6465 +5482 +987 +-1843 +-330 +-8577 +9298 +-859 +-6792 +4814 +-2448 +171 +-6550 +120 +-5046 +-7112 +-5082 +5435 +-6858 +-9373 +-8004 +-8350 +-4554 +3441 +8207 +5399 +-5599 +8133 +6831 +3662 +-9779 +1998 +4087 +1242 +3649 +9883 +-6687 +-152 +9077 +-1967 +7461 +-5867 +-7556 +1805 +5674 +174 +5790 +7887 +-2374 +597 +-2306 +-8859 +-532 +5390 +8724 +-6892 +-40 +3276 +-5990 +-7399 +39 +-1704 +6529 +3858 +2021 +8806 +9235 +2109 +7399 +2164 +-7781 +8630 +-557 +1550 +-9405 +7498 +-6431 +-5095 +1280 +-4705 +2901 +-3900 +-5436 +2029 +6391 +-40 +-3581 +-7624 +-6461 +-1485 +-1056 +5104 +4686 +-3309 +4964 +-332 +6588 +-3814 +-7124 +9522 +-5753 +-9449 +8615 +-3883 +-6439 +9629 +-7082 +265 +-5013 +-9754 +6718 +1050 +927 +-9212 +2427 +-9194 +4766 +-8972 +3172 +-137 +-5196 +1004 +-7734 +-5567 +-2189 +-4705 +-3809 +3477 +-7051 +-6417 +-6449 +8334 +-2063 +-4149 +9302 +3933 +-2606 +752 +5535 +1846 +-5615 +-7027 +-105 +-9684 +3607 +-1086 +-6156 +3871 +-4090 +-108 +6385 +385 +-7277 +-9672 +-6068 +5385 +9482 +1320 +6001 +861 +7982 +6102 +-270 +-4920 +1937 +-254 +314 +8038 +5526 +9087 +377 +-9878 +-3147 +-175 +3560 +-4461 +-6886 +8409 +4525 +-2160 +-2893 +-7148 +378 +7389 +5303 +-6896 +803 +5299 +8207 +9726 +-5461 +-1991 +-2280 +-537 +-9626 +-3022 +1497 +-3487 +7197 +-2748 +9945 +-6687 +6932 +-4056 +-9513 +6836 +-7171 +-2056 +-3121 +-8139 +-6560 +6831 +124 +-5894 +5559 +-5762 +-2549 +4851 +6305 +8364 +7226 +3983 +6213 +1723 +-6143 +362 +-7677 +-4100 +-8723 +8344 +-1826 +7325 +5330 +2295 +524 +-7782 +-6179 +9132 +-6089 +-1101 +5539 +4928 +-2252 +2164 +-2266 +-2232 +6556 +1555 +2701 +-9231 +4481 +-5132 +1205 +-4585 +8615 +2616 +-6336 +-4452 +-992 +9985 +8433 +-9817 +5196 +3536 +-5111 +1037 +-545 +-9953 +8707 +1683 +894 +5908 +5625 +6045 +-2642 +-7375 +3240 +-4254 +7380 +-4642 +-5306 +6770 +4582 +-9559 +2986 +-8643 +1579 +-2106 +-1408 +-9648 +-5627 +6966 +1616 +8846 +6575 +-7872 +-8253 +-1317 +-3228 +4294 +-9902 +9132 +-6933 +8708 +-2054 +-849 +-2394 +-5395 +-1424 +-6305 +-4026 +-4295 +7047 +-2508 +6852 +-8892 +8694 +-893 +5124 +-19 +6855 +9721 +5118 +4654 +4995 +-5857 +-2723 +-9344 +3863 +8390 +6986 +1447 +7467 +-1278 +-1096 +-5890 +-2946 +2536 +9794 +1285 +-5979 +9424 +6319 +5380 +-175 +-3168 +-2252 +1497 +-4361 +-8347 +3386 +-6118 +3870 +8615 +-1834 +204 +-8977 +-2990 +6234 +6966 +-8373 +3915 +-4483 +5063 +7138 +6131 +-7834 +-608 +3733 +4315 +2986 +5669 +6004 +8366 +1700 +3696 +-1777 +-7269 +7210 +6026 +-6723 +936 +-6495 +-4629 +9637 +-6422 +2305 +2188 +9988 +-6629 +-9188 +-7 +8732 +2946 +1234 +-1095 +1163 +-6193 +-7904 +2472 +-301 +-3474 +-8821 +-1535 +-6859 +-4352 +3120 +5389 +9152 +-4870 +2550 +7306 +-5302 +3056 +-8028 +2256 +3824 +-9798 +3686 +-8078 +-7872 +1326 +-1118 +6122 +845 +7932 +-2875 +-7283 +7414 +1105 +2740 +2521 +4038 +4099 +9811 +2387 +-7580 +5790 +6848 +1409 +-9323 +-9329 +889 +744 +-751 +-7938 +-843 +6588 +-4187 +4035 +5245 +6397 +-1035 +4026 +6995 +-5141 +-8129 +-8963 +-2394 +-6450 +-8587 +4274 +-547 +4026 +-4 +-2644 +-4834 +5041 +9814 +5632 +-4758 +-7532 +670 +-6351 +2546 +-3893 +2969 +5046 +5513 +9726 +6969 +-7522 +7486 +-9198 +-2768 +-2621 +-3771 +1076 +-6822 +-3395 +4080 +-1908 +5934 +-6486 +3019 +-2893 +-5267 +6566 +-273 +6273 +5648 +4834 +-5435 +-8937 +8039 +8526 +1882 +-9087 +-9406 +7240 +-7715 +9612 +-3820 +-5681 +6474 +400 +5958 +-852 +-5940 +-2730 +-2458 +-9999 +-4439 +8510 +-6395 +895 +-2535 +-6852 +6080 +369 +6656 +332 +7690 +-7530 +-4342 +-5815 +3157 +-1400 +3018 +-1726 +7786 +1983 +-7458 +5914 +7971 +-5166 +5420 +1467 +400 +-3492 +-6824 +-3541 +5446 +6098 +5325 +8989 +4999 +-3929 +7998 +-2498 +-1942 +8732 +9873 +-7630 +-7357 +5193 +2773 +-3643 +823 +2036 +8254 +-7729 +3199 +-9598 +-4352 +-580 +-2589 +-5615 +1249 +-9132 +-1118 +-1056 +564 +4094 +5622 +-6070 +-7159 +-7261 +4625 +1683 +3264 +-7882 +-5796 +-2491 +-1237 +-4127 +-9543 +1327 +-5933 +-5807 +-6942 +1557 +6893 +-5468 +-316 +-3490 +-9639 +-512 +7365 +-8291 +160 +568 +7742 +6826 +-795 +4585 +-323 +8622 +6718 +-9670 +9059 +-9233 +9822 +8107 +1150 +-9727 +4336 +-1685 +-7508 +-8438 +3262 +3541 +5010 +-7666 +4839 +4542 +-4728 +3824 +6216 +-5489 +-8644 +-3869 +-9208 +1172 +1845 +419 +3430 +-6055 +3470 +-1945 +-8512 +5375 +-9644 +-2360 +-3611 +950 +8502 +4619 +5945 +7133 +-2204 +1469 +-9695 +2073 +-6730 +2358 +-2266 +-9080 +-6896 +5542 +-4147 +4928 +9724 +7581 +-9693 +9341 +-784 +9692 +9765 +1206 +4284 +3180 +8134 +9814 +-6812 +-3045 +5859 +6901 +5960 +-476 +-2717 +7508 +8157 +120 +6836 +9622 +-2824 +-8216 +4769 +8896 +9517 +6032 +1961 +2790 +-2555 +4327 +-5908 +-3168 +-6093 +-449 +2109 +-2634 +-1221 +3569 +-6838 +-8172 +-9675 +-1870 +-9310 +-813 +-5022 +572 +3870 +-2909 +2457 +1339 +587 +-571 +8062 +4552 +-8668 +6505 +993 +2625 +-9907 +899 +-1571 +-6652 +6524 +-996 +4855 +-8470 +-7790 +-9194 +-8073 +7573 +-3917 +211 +-9157 +9767 +-7907 +8476 +7342 +2119 +375 +-7068 +-8949 +2992 +9295 +933 +4129 +-4468 +-7962 +7295 +2119 +-6034 +4791 +-2873 +-9788 +495 +9406 +1151 +1072 +-5009 +-8763 +-5522 +3237 +9099 +-5868 +-3372 +9337 +-2475 +-221 +809 +-4529 +9726 +-7409 +4116 +-3205 +-8603 +545 +6978 +-6777 +-2025 +-5643 +-5935 +1778 +7538 +-5748 +7847 +6391 +263 +2016 +5269 +-308 +-996 +2151 +8997 +-7953 +-6968 +-3230 +9482 +4301 +6442 +-8142 +-4975 +1233 +-6430 +501 +7914 +-2718 +8294 +2219 +1940 +1409 +-4800 +1226 +6894 +-4931 +-8475 +4037 +1299 +-1055 +-9409 +8286 +-3574 +2610 +6669 +9726 +-8717 +-4977 +-417 +-6408 +-948 +6247 +-7964 +9286 +8903 +5437 +-5881 +-5460 +-221 +-3291 +8145 +709 +5948 +-2964 +9833 +375 +2397 +-1221 +9441 +-9100 +7704 +3809 +-3099 +4298 +-2080 +3022 +-2460 +-5130 +-7138 +8156 +7910 +6948 +-2989 +-7019 +4574 +-7835 +4542 +8668 +-5987 +-9640 +-7573 +-9281 +-4519 +5660 +1987 +-8972 +-4704 +6318 +4706 +8133 +-8833 +1778 +-8174 +-7440 +5559 +-9617 +-262 +6246 +-2809 +-1401 +-917 +-1341 +7776 +-22 +2121 +9592 +4191 +1852 +-1457 +-8249 +9699 +-9952 +9871 +3884 +9754 +-714 +-7325 +-7971 +-9252 +456 +-1042 +9825 +4141 +-2914 +4682 +-4009 +-5857 +9700 +7284 +-6800 +7366 +-6422 +5003 +-4699 +-9111 +3788 +873 +2574 +6116 +-6661 +-1723 +5370 +2530 +1886 +2121 +-6824 +7738 +-4910 +4903 +6618 +-6338 +-1797 +-249 +6857 +-7351 +4094 +-5393 +4713 +66 +-7881 +-1218 +-6205 +4866 +9985 +2254 +5235 +-2479 +3366 +-7109 +-9152 +-5847 +9681 +1987 +1121 +-6025 +9594 +-1141 +-5178 +-3437 +6921 +-579 +-3217 +169 +3066 +5935 +-2417 +3766 +918 +-618 +-5126 +9763 +-1073 +8523 +6361 +-8105 +-9000 +2943 +6343 +5901 +953 +8407 +-967 +5239 +-2543 +-7133 +-7051 +8113 +-8826 +-6132 +-3911 +-962 +-3960 +5993 +-6751 +-8823 +5311 +6712 +-4619 +3383 +-3820 +-2030 +-3083 +3588 +237 +-345 +-726 +2419 +7620 +164 +16 +4381 +-3177 +-7309 +-1217 +9702 +-8681 +-2312 +1895 +-974 +-8304 +-4390 +-6645 +-24 +-7556 +8523 +2919 +5336 +-9375 +5895 +8797 +-4450 +8541 +8019 +-3980 +-7967 +576 +-3200 +8838 +8326 +-3741 +3053 +8363 +7802 +4441 +5459 +-8025 +-9887 +-529 +-5193 +-5215 +-1778 +1784 +-9572 +-1740 +-1213 +8162 +4238 +9300 +1255 +5649 +-1747 +-5091 +-6108 +-9540 +8029 +8523 +180 +7598 +-2189 +-5245 +-2840 +7862 +8997 +-6230 +-2494 +-6557 +2744 +8268 +7291 +1890 +7666 +2446 +-8893 +62 +4326 +8070 +-4982 +-6242 +1991 +8100 +718 +-8833 +-3929 +4096 +-3028 +597 +9305 +5615 +5435 +-6182 +-8512 +-1164 +9263 +-5259 +6000 +-369 +-2991 +-8307 +-7196 +1072 +1496 +-1723 +8815 +7577 +-7262 +6326 +-7068 +-2390 +-8519 +-1640 +-5534 +-1102 +4542 +1505 +-7082 +-4931 +4814 +-5169 +-3437 +8332 +-7513 +-2931 +-8487 +-8817 +8592 +-4191 +9051 +-9790 +-7637 +-6191 +5292 +-5077 +3486 +1004 +-5269 +1836 +6473 +-532 +-6585 +7885 +-6335 +-6166 +-4758 +-6230 +4847 +4712 +-384 +-2398 +-6062 +2730 +-5030 +8246 +-2291 +5528 +8965 +1555 +-837 +7036 +7947 +5390 +-7022 +-9350 +-3121 +641 +-4957 +6876 +-697 +-8498 +9474 +6287 +-4125 +6183 +393 +3106 +9854 +-9376 +9743 +-3335 +3887 +-115 +-4390 +-6154 +-3196 +-3228 +173 +4006 +-9913 +-5867 +-369 +-2627 +746 +-3143 +-6394 +-2573 +-5753 +4415 +-6089 +8166 +2297 +7309 +-2210 +-9798 +-4053 +3084 +-1599 +5278 +4053 +-2268 +-4390 +6893 +4118 +-6675 +-8709 +-9143 +-1702 +-9691 +5477 +-3911 +-2654 +5380 +2904 +7792 +3247 +624 +-5126 +6045 +-2800 +3923 +5952 +7832 +-207 +-1530 +8038 +5503 +-8180 +9611 +-9616 +8753 +7363 +9043 +-4339 +-5317 +-2193 +-675 +6338 +265 +-824 +3943 +-2132 +1138 +7166 +-8661 +-7373 +4381 +4326 +5235 +308 +-2312 +-6389 +-1641 +8137 +1233 +-166 +1176 +-2886 +-2851 +-2055 +-4354 +4266 +-202 +8846 +2471 +-1649 +-8304 +-1168 +-2823 +3805 +-958 +-3929 +6237 +-1094 +-4619 +1845 +-1313 +545 +-9579 +-8174 +-7917 +4094 +1176 +1846 +9965 +9910 +5859 +-5274 +6442 +411 +8893 +8456 +6575 +-8977 +8019 +6743 +6443 +8122 +8343 +8390 +1512 +4490 +5657 +1871 +2314 +3936 +-7612 +-8644 +-117 +-8962 +-5641 +-9202 +-3356 +-8713 +5394 +9348 +2229 +8959 +-5837 +-8348 +9237 +1505 +8891 +-732 +7551 +6562 +9336 +-4808 +-4377 +-7334 +-4461 +-8415 +5569 +1047 +-8269 +-4200 +5928 +-9194 +8003 +-8634 +7156 +-5479 +-1499 +-5537 +495 +-8712 +4224 +9234 +-6843 +6613 +5531 +7068 +8021 +-3402 +-3930 +4410 +-9995 +178 +-7075 +656 +2487 +6297 +1172 +-9761 +6262 +-5804 +3052 +-9702 +-4968 +-2833 +-6822 +1789 +8390 +-9208 +-3224 +-4055 +7583 +5644 +-3585 +4442 +1242 +6853 +6361 +3758 +3932 +2016 +-3911 +8937 +2471 +-3444 +451 +884 +-967 +3060 +9639 +5164 +5705 +-8172 +747 +-5282 +4148 +-4433 +-112 +4968 +-4924 +2881 +4567 +-9727 +-6305 +-1022 +6978 +7914 +-1641 +-6213 +9603 +9272 +9348 +-7775 +-3642 +-6056 +8328 +-7311 +-4353 +-3794 +8343 +190 +-967 +3234 +-7520 +-5264 +2121 +-2249 +-3758 +2191 +-3022 +-6807 +5238 +-6758 +6348 +-1867 +-9648 +-9607 +9241 +-2962 +-5391 +8355 +-7962 +8206 +7487 +8979 +-9383 +2054 +788 +-508 +8895 +-8112 +-7932 +-794 +5304 +6005 +-4078 +-3837 +9965 +1843 +4652 +-2847 +2449 +-7017 +-6319 +1881 +2010 +-9974 +2737 +-1168 +-9332 +-714 +2992 +4678 +-8677 +-381 +-8212 +8893 +9692 +-367 +8990 +-9736 +8605 +-7962 +6457 +6970 +-1407 +-5046 +-112 +-7692 +2797 +-5436 +-1847 +3302 +-4910 +-5567 +5824 +-5636 +3561 +5923 +-4104 +8850 +-9227 +-6687 +5377 +-509 +5511 +5119 +4370 +-3758 +-9825 +-6448 +3052 +8953 +-7991 +-1615 +7053 +-2948 +7000 +-6597 +-4964 +6424 +5942 +-5935 +2299 +2064 +-1436 +-4808 +947 +-5698 +4327 +-4149 +-150 +-5363 +8629 +5879 +-1704 +-5384 +6560 +1672 +5206 +1995 +8097 +942 +1469 +8360 +-9432 +6229 +-4697 +-489 +-1084 +2337 +-1587 +325 +-9975 +-9198 +9968 +-7738 +5978 +-3142 +-9372 +-6321 +6877 +-4246 +-9379 +-9902 +-6083 +3102 +2454 +7104 +2296 +-1485 +9377 +-6336 +-7834 +6636 +-5621 +5567 +9209 +8753 +6707 +7674 +-8585 +8296 +6035 +5660 +-6571 +7541 +-6802 +6066 +-282 +4035 +7186 +-3833 +6734 +6836 +2392 +-1746 +-9277 +4208 +8519 +-5436 +7935 +-9408 +6000 +2157 +3060 +8487 +-1850 +-6038 +9542 +494 +3199 +-3796 +1660 +9079 +1043 +6338 +-687 +692 +9043 +-3911 +-4167 +-3178 +-3897 +2543 +-6389 +5163 +8021 +-4288 +-5660 +-8414 +8592 +-6235 +1293 +4928 +-5345 +-5002 +1707 +-1046 +1326 +385 +-2336 +-3139 +-7948 +9681 +-5570 +-6250 +3172 +9458 +-5720 +7150 +-9423 +5565 +987 +9711 +461 +-9553 +-6652 +-2755 +4410 +-2623 +-402 +-5234 +-3303 +-4607 +9279 +2781 +-4127 +7958 +-6912 +-1110 +-6810 +6321 +1003 +6361 +-3629 +7056 +-3833 +-5821 +1479 +-5348 +-9777 +-7103 +-1706 +1255 +-5639 +1000 +-4693 +1861 +-3248 +5430 +-4845 +-6841 +-6062 +8785 +-8436 +9814 +601 +-460 +-1118 +8925 +6250 +8842 +2489 +-557 +9065 +1111 +9162 +-7408 +-7782 +-6089 +4079 +1065 +5057 +497 +-1759 +736 +-5306 +4315 +8430 +9030 +-4957 +-3997 +-7547 +-7727 +-7380 +1526 +1392 +-167 +-5842 +-4301 +9095 +-6972 +1773 +7487 +-7549 +-8315 +9141 +-2506 +6575 +-8665 +157 +-399 +-9329 +8718 +-9760 +7606 +9224 +-8223 +5847 +-4533 +-9644 +7995 +-5953 +2826 +-3911 +-4082 +3768 +-5774 +4476 +-3442 +-9540 +-809 +2610 +386 +-4421 +2311 +-3461 +9757 +5265 +9576 +510 +-153 +186 +5181 +9087 +9473 +3943 +3702 +3113 +4118 +-7094 +-6341 +-2952 +-1022 +-1306 +8902 +3522 +-7257 +8243 +7218 +-6085 +1647 +5453 +6410 +4908 +3242 +-9801 +-9451 +-383 +4316 +6690 +2598 +-386 +-8158 +3764 +-2551 +2338 +1674 +-1220 +2224 +6950 +-9121 +4304 +-1602 +-4613 +4078 +-7066 +-5431 +-5846 +-6271 +122 +7766 +-9071 +2288 +-1230 +7359 +1210 +3014 +-8193 +8965 +7089 +-1493 +-6011 +6571 +3611 +-5080 +-7959 +1507 +-8725 +6906 +-3928 +-1245 +7031 +1782 +5858 +-3762 +3229 +-1075 +3648 +3383 +-5519 +-1880 +-3762 +8402 +8582 +5610 +-2816 +-6758 +-1358 +-7505 +2866 +8308 +-4306 +6256 +-9041 +-5051 +-9202 +2636 +-7635 +9482 +-9308 +3667 +9240 +-660 +5397 +-1081 +6707 +-9080 +7949 +-9163 +-6577 +9822 +4480 +1830 +5260 +-1460 +-549 +6515 +4441 +-4452 +1845 +-5936 +5287 +-7743 +-4471 +4049 +-2813 +-4473 +-4515 +1369 +7856 +-1408 +6834 +-7702 +-3752 +6906 +8816 +-6968 +-1715 +-6461 +8235 +6805 +9405 +905 +-1673 +-9272 +5380 +171 +1421 +-1264 +-3492 +1565 +-318 +-9676 +3213 +-8576 +-6104 +6694 +-3744 +-2330 +8537 +2629 +-5782 +6955 +-2901 +2439 +5176 +-2132 +-2096 +-4613 +9424 +3516 +-2479 +8475 +9488 +-8894 +-9763 +7056 +4079 +-4387 +1125 +-6893 +1222 +2679 +-8129 +-2722 +9846 +-7508 +6997 +-6998 +71 +-824 +1421 +5791 +-1099 +8600 +-2008 +5096 +4094 +7668 +9 +5568 +6599 +-2503 +9354 +-8347 +-2800 +992 +-3883 +273 +71 +3577 +3988 +5858 +3363 +-175 +-6632 +-1769 +3385 +-4739 +-9864 +8536 +-2929 +3804 +-1006 +-3395 +-6146 +-1765 +7406 +1788 +-9073 +1280 +-8565 +-8928 +-1417 +-9085 +9482 +-8819 +-5307 +2201 +-9308 +-4467 +4785 +9209 +-1612 +6557 +-7823 +5092 +7908 +9286 +1121 +9841 +-98 +803 +-7681 +-8356 +3366 +1007 +8596 +-5604 +805 +7332 +-8611 +2305 +1704 +2151 +5010 +-1870 +-2565 +-859 +1280 +-5130 +6526 +8969 +-7673 +-9501 +9583 +-401 +-7748 +-6557 +-72 +1049 +7704 +4513 +-1267 +-8949 +5648 +6677 +-7197 +1109 +-9771 +-9350 +913 +-4094 +-295 +5010 +3804 +122 +-7302 +5536 +2063 +-1945 +8624 +576 +-5746 +9337 +-5512 +727 +-8187 +-3867 +1672 +-8806 +7999 +-9993 +-2205 +2607 +308 +2973 +-7405 +333 +-214 +9961 +742 +4667 +1531 +-5083 +-3684 +-8890 +9610 +-4844 +-6290 +-5216 +5674 +-1225 +2465 +3592 +2016 +2885 +-1747 +-8962 +3983 +4181 +-6642 +-1875 +6426 +-6840 +1724 +1642 +-1602 +-7134 +-4573 +7789 +6764 +-9063 +1007 +8453 +-460 +2397 +-8641 +-6780 +1947 +-9738 +-7615 +2595 +7885 +9229 +308 +7289 +3898 +7479 +2224 +-8087 +-2946 +-5978 +4775 +-2782 +5867 +-6072 +-2615 +4896 +-6924 +-1331 +-5246 +8301 +6948 +3759 +-5738 +3073 +807 +8528 +5359 +-8276 +4858 +-4725 +1549 +3301 +1093 +4805 +8758 +3441 +-9658 +6492 +8420 +2391 +-254 +2385 +-6264 +-5747 +-4147 +2101 +-2675 +-4214 +5162 +-2699 +-5184 +4497 +2529 +-7172 +-2193 +2366 +5130 +9904 +1631 +-386 +4530 +0 +-4732 +8441 +-1176 +5931 +5747 +8675 +-171 +6697 +-4122 +8079 +5548 +-7996 +-609 +2620 +3713 +-3902 +6300 +4670 +3435 +5239 +-9215 +-489 +-399 +-3642 +5728 +-3468 +-1480 +-2629 +5150 +2193 +9029 +-7103 +1916 +-2209 +2888 +4557 +9048 +-3435 +4617 +-7681 +78 +7363 +-1197 +-7583 +157 +3575 +-7759 +545 +-2392 +-7914 +-8934 +-9836 +-2173 +-3762 +-2030 +-4617 +-7141 +164 +7116 +-1594 +2337 +-4885 +-160 +4064 +2059 +-8766 +638 +-1194 +-7697 +-8329 +-7343 +787 +-6351 +169 +-5460 +192 +-530 +-5050 +8843 +1566 +-9004 +-777 +-796 +3909 +8360 +-9116 +8846 +2971 +9780 +-8225 +5808 +-9540 +5176 +2943 +-5275 +-4420 +8868 +2362 +-8526 +9594 +-593 +6093 +-2141 +9848 +5967 +-9103 +1837 +9985 +3648 +-9750 +-9114 +-2623 +4011 +-1606 +8673 +-9442 +1893 +2499 +-1981 +120 +-4585 +3370 +-1245 +-4410 +-9450 +-6104 +-7921 +-7195 +9036 +2208 +-2781 +-532 +7905 +6649 +6588 +-6283 +-1996 +-7955 +-4529 +8420 +8403 +-6321 +-3998 +1512 +6232 +4025 +-4589 +2256 +-8813 +-8225 +2190 +-3368 +840 +-6737 +9479 +-7775 +4473 +-7391 +-339 +-7335 +39 +1336 +-5337 +7266 +571 +6483 +9003 +3604 +-2884 +4887 +7759 +1330 +-4807 +-7192 +5153 +1043 +2602 +-5461 +7560 +5164 +6356 +-9368 +2969 +-1957 +9709 +6677 +1121 +-732 +9689 +3487 +-7449 +-5043 +-900 +-8415 +7820 +7499 +-345 +-2565 +6893 +845 +-4770 +-2030 +-1261 +-3205 +-100 +-7002 +-7032 +2757 +4157 +-98 +-4147 +-2480 +-9684 +-4318 +-136 +6997 +-6852 +-992 +6876 +5406 +9030 +-4220 +124 +-1891 +1131 +5723 +-9811 +-906 +7585 +222 +-9837 +1469 +-7939 +-4255 +-2777 +-3619 +4045 +-8908 +-9957 +2279 +51 +-1547 +8169 +6385 +5115 +-2347 +4013 +-9621 +6588 +1758 +434 +-532 +-5268 +-9235 +3833 +8070 +-4805 +-8979 +-2229 +-9695 +-9154 +-6807 +-3507 +5528 +7508 +-3389 +-137 +-5753 +9065 +5407 +7596 +9354 +-7775 +-4863 +9681 +5080 +-213 +-6211 +-7154 +2368 +4052 +-1963 +-549 +-5485 +-9957 +-4940 +4497 +9422 +-552 +5749 +-6454 +-3985 +-3762 +-8590 +4839 +-2415 +-9462 +3283 +6183 +5183 +7265 +8021 +-5938 +6503 +-8856 +2178 +7210 +7927 +6203 +-2479 +-2642 +-4282 +8103 +-3828 +5571 +4357 +3878 +-6909 +-3761 +-8742 +8888 +-6271 +8441 +-2210 +-5544 +-9202 +1061 +-560 +8012 +-781 +8490 +-803 +169 +5790 +-3133 +-4122 +2406 +7486 +-1747 +2216 +-380 +7964 +2610 +4376 +-3962 +6872 +605 +5200 +852 +2941 +-4387 +2748 +-5421 +6177 +-5393 +-5081 +5466 +-6239 +8815 +-40 +3567 +-9565 +7669 +9301 +-5002 +-8567 +-3210 +-5177 +3237 +5206 +-6942 +-40 +-8269 +-589 +2790 +7017 +7425 +9726 +-3820 +1961 +-8492 +-7539 +5320 +-7881 +1401 +-5753 +-5460 +9708 +5260 +-2863 +3492 +7499 +1338 +-5394 +3803 +4053 +9286 +-2725 +-8698 +5903 +5855 +6597 +-4940 +-8811 +2314 +-7184 +-8246 +-6084 +-9084 +2997 +7507 +-4607 +-93 +-941 +-1652 +-2116 +1205 +3294 +-925 +-3046 +9174 +222 +-8240 +3142 +-199 +4160 +5350 +8978 +6515 +-1908 +-1224 +4035 +8272 +2822 +-4091 +-7318 +534 +200 +-6792 +705 +937 +171 +2039 +6948 +-6654 +-2713 +6970 +4224 +-9616 +-4884 +5567 +-98 +-9351 +-2768 +6514 +-4425 +4323 +-9826 +-9635 +4316 +-2694 +-1435 +7396 +8485 +504 +-6186 +9841 +-489 +-3260 +-5874 +-8634 +-8414 +3030 +2486 +-8079 +3712 +6575 +316 +3093 +-841 +314 +1046 +-7408 +3761 +-8742 +829 +-6093 +-9445 +-9426 +3879 +5385 +-1056 +-891 +1919 +7055 +-857 +5959 +-3365 +809 +-3333 +-3023 +3939 +648 +2555 +6908 +-1186 +-175 +8169 +-6275 +5836 +4694 +-415 +6966 +-7624 +-5935 +1649 +-2646 +7585 +-1418 +-9308 +-7758 +5559 +-1996 +5219 +2867 +-4100 +9119 +-6573 +-1035 +-9117 +9512 +3623 +9030 +5474 +-105 +2471 +-1230 +4355 +-7407 +-2486 +1010 +-5825 +-4561 +9457 +-342 +-8886 +-1264 +266 +1493 +9272 +-9782 +-4671 +7453 +2520 +-8038 +-5475 +-8350 +148 +7815 +3519 +6121 +-841 +-6672 +2923 +-2597 +-1274 +5559 +-8247 +-9818 +-8007 +-8717 +1465 +9505 +4308 +2617 +3909 +3516 +-8461 +4953 +7150 +-2888 +2252 +-859 +-1660 +7982 +-7085 +2195 +-1921 +3087 +8656 +-8452 +9543 +727 +7674 +6098 +8106 +-1290 +4839 +6306 +-7045 +-4138 +1593 +-1129 +4670 +494 +1867 +-7885 +1830 +-7637 +-8781 +-7701 +-3652 +9341 +-9582 +-7365 +-3146 +-567 +-7983 +-849 +-7391 +-1648 +6223 +-8362 +7963 +5824 +-6786 +1919 +-8787 +8019 +-8851 +2130 +-2229 +8487 +-3995 +-7210 +2997 +-9553 +9743 +-4900 +-1437 +858 +3108 +9113 +393 +5150 +-4673 +-6108 +173 +-9763 +1106 +-7372 +-3568 +-2191 +-3041 +8489 +-8468 +3086 +9915 +-694 +-723 +-4554 +-5317 +-9446 +-772 +-3930 +-8487 +-6596 +-5867 +-9035 +-3410 +-3444 +1537 +5534 +-2657 +-5889 +-9966 +-1638 +-297 +7478 +6979 +-1587 +9770 +-5378 +-489 +4186 +836 +-1681 +5934 +1179 +3336 +634 +-2272 +7706 +778 +283 +5833 +7606 +7326 +-2281 +5466 +-9581 +3954 +-5738 +4704 +5185 +9904 +-5274 +-7034 +18 +-8656 +8510 +8953 +3113 +-6117 +-2587 +5401 +9052 +-5434 +239 +5588 +-2506 +1714 +3972 +-4982 +4047 +7994 +-5109 +-51 +8796 +-3758 +6342 +1212 +-126 +8914 +7151 +9831 +5980 +8328 +-742 +9646 +-6840 +-1231 +-4989 +-7915 +-4036 +2473 +2243 +-8857 +8000 +2536 +1271 +8370 +1773 +218 +-5189 +-4216 +-7513 +463 +-5492 +6631 +8421 +2216 +-7648 +7897 +889 +8978 +-1967 +770 +-5890 +-3044 +8792 +-3342 +-2702 +-1268 +5884 +934 +-4414 +-9936 +-6192 +845 +-4069 +6300 +-7515 +-7498 +-7200 +-6231 +3210 +7456 +746 +-2189 +-340 +-1378 +1672 +-9152 +-6190 +-3538 +362 +2588 +6068 +-521 +-6945 +3536 +530 +-2554 +-8390 +4606 +-7198 +9037 +8574 +-6068 +-241 +-6780 +222 +2181 +4010 +-2030 +-3333 +-1043 +9097 +-5350 +1639 +8267 +-8717 +2849 +5063 +5435 +-3154 +5152 +-4323 +-1940 +2273 +-5953 +-1503 +-4136 +-8326 +-4600 +532 +-1935 +-9761 +-5093 +-5265 +4584 +-2272 +375 +-421 +-8975 +-8519 +8990 +-2524 +-1833 +-6486 +1102 +-415 +-2615 +-840 +-8299 +-5251 +4266 +6831 +4052 +-2484 +-7900 +7394 +4444 +-1477 +-645 +1565 +-8170 +2934 +-4689 +1122 +5928 +-9289 +7925 +-6095 +-1723 +2707 +-399 +-1564 +650 +-8207 +9926 +1 +1228 +5602 +6286 +3744 +-8894 +-123 +8107 +6469 +-4352 +-6796 +7487 +5787 +-369 +2360 +-8356 +-7615 +503 +-9346 +-2573 +-2551 +-4866 +-9961 +8906 +9406 +-2101 +-5701 +3405 +2431 +-2796 +-340 +-5245 +-172 +2678 +1320 +-2554 +-5874 +-5406 +-4105 +7516 +8386 +326 +5770 +5024 +9024 +-1970 +2670 +-508 +-5586 +-8526 +-5540 +6387 +-9293 +7309 +2740 +-8184 +-3554 +-4889 +-56 +9249 +9286 +-6792 +3936 +1244 +2805 +-7503 +6335 +-8356 +1339 +-7624 +-2272 +-1778 +-1165 +-6942 +-3796 +8894 +2384 +4632 +4552 +5069 +-8645 +6458 +961 +-9331 +1557 +-5889 +1565 +2707 +-5455 +-9270 +-8247 +-2279 +-6328 +-5818 +3989 +2743 +9928 +4036 +5423 +-2384 +6882 +5067 +930 +-9883 +9113 +-4125 +1497 +-3333 +-2020 +1789 +-3195 +3867 +1191 +-1920 +-8681 +8206 +-559 +5923 +-6382 +8738 +-872 +-6445 +-8775 +8174 +4600 +-7305 +-3821 +-4347 +7903 +-6512 +7199 +-4448 +9492 +5369 +9902 +-6820 +8775 +-8535 +3916 +8865 +1511 +-8390 +-9073 +-8836 +5019 +-583 +205 +1778 +2121 +316 +-593 +-5738 +1271 +-1096 +1753 +6921 +-1686 +8816 +9147 +6775 +9326 +1648 +5602 +3363 +544 +-7195 +-2894 +7884 +-3014 +528 +3740 +-9266 +9708 +-3049 +5893 +2741 +2565 +2588 +8216 +5790 +9985 +6610 +-9031 +-3473 +5380 +-7737 +8062 +3836 +-8977 +-8053 +-4014 +2078 +-530 +-2866 +1995 +-8167 +4038 +-3960 +-528 +2884 +6336 +8630 +-686 +7521 +7927 +7373 +-3350 +2890 +-563 +4931 +9931 +-6723 +-9964 +-7534 +-9356 +3798 +-2255 +3212 +-4136 +-2533 +9576 +708 +-5119 +355 +8638 +569 +-7147 +-5446 +-2935 +7654 +-5799 +1788 +-7014 +-404 +8831 +4632 +-1610 +-1843 +-6282 +-7866 +-3432 +-4685 +-3886 +-1825 +-3796 +4158 +5824 +1778 +4498 +-5192 +3734 +4810 +3839 +-9501 +-6654 +-2466 +133 +7544 +3630 +-3064 +6032 +-8504 +6930 +3370 +859 +9065 +5399 +5049 +-1424 +1812 +7726 +-2293 +-6205 +8169 +5965 +1097 +6921 +1890 +6051 +-412 +3900 +8475 +2866 +7548 +-2034 +6647 +-5009 +5526 +-4542 +1507 +-7775 +-9408 +7573 +-9574 +4094 +-175 +5474 +7783 +-4109 +-7554 +8865 +5847 +-9223 +3347 +6852 +9454 +5163 +9152 +-4138 +4352 +3541 +2805 +-1193 +5039 +1484 +-9350 +-119 +6588 +-361 +7527 +-9738 +-4644 +686 +-531 +2583 +2890 +382 +8205 +-4801 +6028 +8906 +8134 +-2215 +2279 +-558 +9470 +7837 +7985 +-1359 +-2813 +-9070 +9688 +5691 +2172 +1111 +2548 +-7047 +-4136 +3666 +-3622 +6325 +3198 +-3805 +-4909 +-6766 +-4450 +3440 +-726 +-22 +6389 +-6316 +-1278 +9029 +-1593 +6443 +4958 +5931 +3921 +-7827 +5539 +-9760 +9915 +4415 +-9021 +2620 +6359 +-5479 +-3557 +-8249 +-5339 +218 +777 +5761 +-5680 +1004 +-5442 +2256 +1616 +-2884 +9075 +4218 +-7612 +511 +-417 +-3928 +-4845 +4130 +-6064 +-8253 +-8951 +-2320 +-1629 +-3092 +3451 +4042 +-7919 +-9223 +5648 +9708 +-1073 +-4064 +6000 +8003 +-4181 +-712 +9316 +-9152 +-7572 +2233 +-135 +-2644 +-9637 +-2549 +1746 +-5398 +-9340 +-6822 +2760 +7788 +-6504 +-3576 +4963 +959 +7741 +-9089 +-7855 +9535 +-8086 +-802 +-5119 +6297 +6122 +-3490 +-9940 +-5009 +3782 +-5178 +550 +4848 +5488 +6382 +3333 +-6608 +-5247 +7044 +-2923 +-7701 +9065 +-598 +3108 +1367 +-5678 +8582 +-4811 +-7008 +-6452 +1723 +650 +5835 +-3121 +7577 +-2657 +-2618 +-1323 +-9190 +9635 +-1242 +-7035 +5309 +-4409 +6921 +-3611 +-7793 +-8299 +8908 +-7195 +727 +3300 +6880 +2362 +-4149 +7910 +3999 +3734 +6780 +-7612 +-4891 +845 +9840 +775 +8112 +9027 +-1045 +1191 +2352 +-8108 +-3800 +-3023 +-8821 +3808 +-4886 +-8870 +5752 +7617 +-3781 +171 +8096 +-7129 +-4290 +-4062 +320 +-2487 +553 +9708 +5159 +899 +6363 +-6465 +9147 +-401 +-7466 +-3276 +2279 +-6311 +-927 +-5802 +-7198 +-119 +-1678 +1003 +8092 +4488 +-4379 +8133 +-4339 +-9138 +2848 +-5429 +-7756 +2885 +6147 +-6038 +7877 +-8618 +6474 +8753 +7994 +8024 +3578 +-5935 +3029 +-8077 +2969 +-1970 +-453 +-5697 +7928 +3106 +2058 +-1118 +-4728 +9726 +-3216 +-6441 +7460 +5952 +3058 +3104 +-9088 +6547 +6587 +-714 +-4010 +-8590 +-1244 +-7655 +5051 +5134 +-1679 +3884 +339 +194 +-8356 +-4377 +9473 +-5680 +-3215 +-5470 +3180 +2598 +407 +-967 +4036 +314 +-839 +6806 +-6573 +3569 +3863 +-2336 +-8787 +4038 +691 +6741 +-4251 +1102 +-9781 +-7612 +-3704 +7699 +-6744 +-8893 +-472 +-6991 +9945 +-1408 +-6453 +-2623 +337 +3613 +1391 +-941 +-7109 +-463 +-322 +-5082 +3029 +-9456 +-9021 +-2316 +-906 +7766 +-222 +2881 +-5274 +-8368 +5011 +-8545 +332 +7748 +-362 +6404 +-2800 +9354 +16 +9020 +7319 +6203 +-7863 +8816 +8413 +1846 +2070 +-1181 +7394 +-2460 +-3854 +-8299 +2489 +-4968 +5674 +-5435 +-9060 +-3569 +1919 +-6627 +-6433 +-731 +7017 +-8208 +-6577 +-6678 +-3178 +5447 +2790 +6127 +7928 +-547 +-9684 +-7252 +-6575 +-1887 +-7753 +4382 +1122 +4316 +6572 +2198 +-9071 +3953 +-4147 +-9617 +3667 +-1683 +649 +-6743 +-1553 +3921 +-9874 +-1031 +4321 +-4431 +5309 +978 +-9355 +-9323 +3503 +-5810 +1168 +4829 +214 +6996 +-9873 +7541 +-9653 +4528 +5615 +-521 +-5512 +-7182 +7928 +2406 +3523 +-215 +3692 +1550 +7087 +9274 +3622 +3259 +4686 +-3273 +-1046 +1219 +3925 +-6863 +-524 +6976 +8390 +8709 +-1762 +-5114 +-5913 +2806 +3693 +2041 +-2827 +-4249 +378 +-6700 +-9906 +-85 +-523 +5245 +3550 +-8024 +8898 +-5874 +5193 +3289 +7482 +8254 +-6486 +-153 +-1777 +-7132 +-1400 +-9992 +-5178 +-2255 +9362 +6028 +5571 +-6468 +-9108 +78 +1354 +6000 +4982 +4028 +-8643 +6525 +2290 +1201 +4079 +2226 +521 +8074 +-7094 +2701 +-5078 +6562 +9611 +-4766 +438 +2826 +6326 +-7630 +-5130 +619 +-8956 +6966 +3761 +-3211 +4236 +-9978 +1267 +-3183 +-2025 +-5627 +4637 +-8827 +-248 diff --git a/day20/input.test b/day20/input.test new file mode 100644 index 0000000..52c68ff --- /dev/null +++ b/day20/input.test @@ -0,0 +1,7 @@ +1 +2 +-3 +3 +-2 +0 +4 diff --git a/day20/src/main.rs b/day20/src/main.rs index e7a11a9..c7fbfee 100644 --- a/day20/src/main.rs +++ b/day20/src/main.rs @@ -1,3 +1,193 @@ -fn main() { - println!("Hello, world!"); +use std::{ + fs::File, + io::{BufRead, BufReader}, + ops::{Range, RangeInclusive}, +}; + +use bitvec::{prelude::Msb0, vec::BitVec}; + +#[derive(Debug, Default, PartialEq, Eq)] +enum SolvePuzzle { + First, + #[default] + Second, +} + +#[derive(Debug)] +struct List { + numbers: Vec, + number_positions: Vec, +} + +impl List { + fn parse_input(reader: R) -> Self { + reader + .lines() + .map(Result::unwrap) + .map(|line| line.parse()) + .map(Result::unwrap) + .map(|number: i64| number * DECRYPTION_KEY) + .collect() + } + + fn apply_rotation(&mut self) { + let mut moved: BitVec = BitVec::repeat(false, self.numbers.len()); + println!("NUM: {:>3?}", self.numbers); + println!("POS: {:>3?}", self.number_positions); + println!( + "MOV: {:>3?}", + moved.iter().by_vals().map(u8::from).collect::>() + ); + println!( + "***: {:>3?}", + self.number_positions + .iter() + .map(|&idx| self.numbers[idx]) + .collect::>() + ); + for position_index in 0..self.number_positions.len() { + let number_index = self.number_positions[position_index]; + println!("\n=== {number_index} ==="); + let elem = self.numbers[position_index]; + let op = Operation::new(elem, number_index, self.numbers.len()); + println!("OP: {op:?}"); + let idx_saved = self.number_positions[op.from]; + let rotate_right = op.should_rotate_right(); + let range = op.get_rotation_range(); + if rotate_right { + self.number_positions[range.clone()].rotate_right(1); + moved[range.clone()].rotate_left(1); + } else { + self.number_positions[range.clone()].rotate_left(1); + moved[range.clone()].rotate_right(1); + } + self.number_positions[op.to] = idx_saved; + moved.set(op.to, true); + println!("NUM: {:>3?}", self.numbers); + println!("POS: {:>3?}", self.number_positions); + println!( + "MOV: {:>3?}", + moved.iter().by_vals().map(u8::from).collect::>() + ); + println!( + "***: {:>3?}", + self.number_positions + .iter() + .map(|&idx| self.numbers[idx]) + .collect::>() + ); + } + } + + fn sum_of_magic_positions(&self) -> i64 { + let pos_of_zero = self + .numbers + .iter() + .position(|&num| num == 0) + .expect("Zero must be present in data"); + let first = (pos_of_zero + 1000) % self.numbers.len(); + let second = (pos_of_zero + 2000) % self.numbers.len(); + let third = (pos_of_zero + 3000) % self.numbers.len(); + self.numbers[first] + self.numbers[second] + self.numbers[third] + } +} + +#[derive(Debug)] +struct Operation { + from: usize, + to: usize, + insert: i64, +} + +impl Operation { + fn new(insert: i64, from: usize, list_len: usize) -> Self { + let to_unbounded = from as i64 + insert; + let mut to = to_unbounded.rem_euclid(list_len as i64 - 1); + if to == 0 { + to = list_len as i64 - 1; + } + Self { + from, + to: to as usize, + insert, + } + } + + fn should_rotate_right(&self) -> bool { + self.to < self.from + } + + fn get_rotation_range(&self) -> RangeInclusive { + self.from.min(self.to)..=self.from.max(self.to) + } + + fn index_change(&self) -> usize { + if self.to < self.from { + 1 + } else { + 0 + } + } +} + +pub fn solve_first_puzzle(reader: R) -> i64 { + let mut list = List::parse_input::<1, _>(reader); + list.apply_rotation(); + list.sum_of_magic_positions() +} + +pub fn solve_second_puzzle(reader: R) -> i64 { + let mut list = List::parse_input::<811589153, _>(reader); + for _ in 0..10 { + list.apply_rotation(); + } + list.sum_of_magic_positions() +} + +fn main() { + let mut args = ::std::env::args().skip(1); + let file = args.next().unwrap_or_else(|| String::from("./input")); + let solve = args + .next() + .map(|arg| match arg.as_str() { + "first" => SolvePuzzle::First, + "second" => SolvePuzzle::Second, + _ => unreachable!(), + }) + .unwrap_or_default(); + let file = BufReader::new(File::open(file).expect("Opening file")); + match solve { + SolvePuzzle::First => println!("{}", solve_first_puzzle(file)), + SolvePuzzle::Second => println!("{}", solve_second_puzzle(file)), + }; +} + +impl FromIterator for List { + fn from_iter>(iter: T) -> Self { + let numbers: Vec = iter.into_iter().collect(); + let number_positions = (0..numbers.len()).collect(); + Self { + numbers, + number_positions, + } + } +} + +#[cfg(test)] +mod tests { + use std::io::Cursor; + + use super::*; + + #[test] + fn example_on_first() { + let reader = Cursor::new(include_str!("../input.test")); + assert_eq!(solve_first_puzzle(reader), 3); + } + + #[test] + fn example_on_second() { + let reader = Cursor::new(include_str!("../input.test")); + assert_eq!(solve_second_puzzle(reader), 1623178306); + } }