commit cd6cc0be1eeb920b2c99b7962a0d688b27d028d0 Author: Philipp Matthias Schaefer Date: Wed Dec 22 11:33:30 2021 +0100 Initial commit diff --git a/1.data b/1.data new file mode 100644 index 0000000..c7d277b --- /dev/null +++ b/1.data @@ -0,0 +1,2000 @@ +150 +152 +155 +156 +157 +141 +124 +138 +143 +145 +144 +146 +148 +149 +148 +149 +124 +122 +123 +124 +117 +118 +119 +132 +159 +152 +175 +183 +194 +222 +226 +237 +242 +248 +229 +225 +227 +235 +229 +230 +227 +229 +252 +253 +251 +269 +270 +266 +268 +269 +270 +256 +257 +258 +261 +258 +251 +242 +245 +270 +275 +287 +309 +310 +330 +337 +344 +347 +353 +350 +355 +356 +353 +354 +372 +371 +370 +365 +368 +370 +374 +370 +332 +329 +340 +343 +347 +348 +349 +350 +351 +366 +358 +370 +369 +370 +367 +368 +369 +371 +382 +380 +385 +379 +394 +395 +393 +406 +389 +400 +389 +396 +386 +387 +390 +399 +406 +408 +413 +415 +416 +417 +416 +417 +416 +424 +425 +426 +427 +434 +435 +434 +436 +433 +430 +431 +434 +435 +436 +437 +452 +456 +459 +462 +463 +475 +477 +479 +500 +497 +498 +501 +507 +522 +517 +509 +519 +541 +542 +540 +551 +558 +551 +552 +553 +564 +569 +575 +581 +587 +589 +591 +596 +610 +617 +621 +618 +614 +615 +620 +640 +654 +669 +670 +686 +685 +686 +690 +691 +700 +706 +722 +721 +720 +725 +726 +736 +738 +754 +761 +759 +757 +765 +773 +790 +797 +798 +797 +798 +796 +789 +794 +798 +797 +804 +806 +807 +831 +823 +833 +836 +857 +852 +856 +863 +896 +898 +893 +904 +908 +931 +933 +948 +966 +967 +957 +961 +969 +971 +985 +988 +989 +996 +1018 +1020 +1025 +1060 +1061 +1060 +1088 +1090 +1096 +1091 +1092 +1091 +1064 +1070 +1087 +1088 +1083 +1085 +1090 +1091 +1094 +1093 +1091 +1093 +1103 +1104 +1105 +1107 +1126 +1127 +1126 +1145 +1151 +1165 +1166 +1171 +1179 +1189 +1190 +1193 +1217 +1218 +1219 +1220 +1222 +1225 +1210 +1221 +1225 +1247 +1249 +1246 +1247 +1228 +1227 +1214 +1224 +1254 +1256 +1276 +1279 +1273 +1268 +1271 +1272 +1269 +1279 +1286 +1290 +1263 +1267 +1270 +1272 +1286 +1276 +1277 +1278 +1280 +1266 +1267 +1266 +1231 +1235 +1260 +1261 +1271 +1280 +1284 +1291 +1299 +1297 +1310 +1322 +1331 +1342 +1336 +1345 +1358 +1361 +1358 +1343 +1334 +1333 +1330 +1346 +1349 +1348 +1353 +1371 +1380 +1388 +1362 +1373 +1378 +1393 +1417 +1407 +1412 +1417 +1419 +1420 +1421 +1436 +1432 +1437 +1442 +1444 +1447 +1448 +1467 +1468 +1472 +1477 +1479 +1513 +1541 +1549 +1566 +1562 +1567 +1571 +1581 +1583 +1578 +1583 +1601 +1588 +1611 +1612 +1614 +1615 +1624 +1618 +1612 +1632 +1633 +1635 +1634 +1646 +1661 +1663 +1656 +1657 +1658 +1657 +1658 +1677 +1679 +1692 +1693 +1692 +1718 +1719 +1720 +1721 +1727 +1732 +1731 +1730 +1722 +1723 +1737 +1743 +1744 +1747 +1753 +1766 +1768 +1765 +1767 +1773 +1768 +1773 +1778 +1776 +1788 +1790 +1799 +1807 +1808 +1805 +1806 +1803 +1804 +1818 +1831 +1832 +1828 +1837 +1840 +1841 +1837 +1840 +1844 +1853 +1854 +1855 +1853 +1856 +1857 +1856 +1862 +1873 +1860 +1862 +1863 +1872 +1888 +1892 +1893 +1906 +1919 +1901 +1910 +1916 +1919 +1921 +1922 +1945 +1942 +1943 +1944 +1947 +1956 +1958 +1964 +1967 +1981 +1988 +1976 +1978 +1999 +2003 +2008 +2039 +2042 +2049 +2075 +2072 +2076 +2082 +2091 +2096 +2120 +2131 +2120 +2116 +2119 +2117 +2139 +2141 +2143 +2144 +2147 +2129 +2140 +2151 +2166 +2167 +2186 +2198 +2199 +2205 +2206 +2207 +2209 +2207 +2228 +2231 +2223 +2231 +2242 +2244 +2232 +2234 +2237 +2242 +2235 +2225 +2227 +2233 +2228 +2229 +2230 +2229 +2221 +2222 +2214 +2216 +2219 +2223 +2229 +2230 +2233 +2241 +2263 +2264 +2259 +2255 +2260 +2277 +2308 +2311 +2312 +2315 +2320 +2322 +2321 +2295 +2297 +2293 +2295 +2296 +2300 +2304 +2298 +2305 +2306 +2305 +2302 +2305 +2306 +2298 +2316 +2335 +2326 +2325 +2291 +2298 +2300 +2305 +2312 +2314 +2316 +2320 +2323 +2321 +2318 +2315 +2318 +2319 +2343 +2341 +2340 +2342 +2341 +2345 +2346 +2347 +2349 +2353 +2327 +2318 +2339 +2342 +2355 +2356 +2357 +2358 +2359 +2386 +2387 +2389 +2403 +2408 +2396 +2394 +2419 +2414 +2419 +2420 +2426 +2425 +2415 +2419 +2420 +2424 +2425 +2436 +2438 +2440 +2435 +2441 +2448 +2456 +2446 +2448 +2447 +2440 +2452 +2451 +2449 +2460 +2452 +2453 +2456 +2473 +2480 +2478 +2486 +2488 +2467 +2469 +2493 +2494 +2493 +2495 +2509 +2511 +2515 +2541 +2554 +2555 +2541 +2535 +2536 +2539 +2535 +2538 +2539 +2548 +2555 +2558 +2557 +2560 +2570 +2571 +2585 +2588 +2599 +2612 +2615 +2623 +2640 +2647 +2648 +2645 +2639 +2637 +2641 +2643 +2678 +2680 +2712 +2721 +2727 +2758 +2753 +2750 +2751 +2758 +2759 +2778 +2789 +2800 +2794 +2799 +2803 +2804 +2810 +2793 +2794 +2792 +2801 +2803 +2804 +2805 +2831 +2851 +2855 +2837 +2848 +2864 +2832 +2822 +2828 +2831 +2823 +2822 +2835 +2821 +2841 +2842 +2845 +2830 +2831 +2837 +2838 +2843 +2845 +2844 +2871 +2874 +2873 +2872 +2873 +2869 +2890 +2893 +2912 +2914 +2908 +2949 +2948 +2961 +2965 +2970 +2971 +2974 +2966 +2968 +2974 +2980 +2948 +2980 +2985 +2999 +3005 +3018 +3022 +3021 +3024 +3025 +3027 +3026 +3025 +3029 +3031 +3024 +2998 +3008 +3016 +3020 +3019 +3016 +3018 +3035 +3062 +3063 +3030 +3021 +3022 +3023 +3017 +3032 +3042 +3043 +3044 +3043 +3041 +3047 +3049 +3055 +3060 +3061 +3033 +3034 +3027 +3032 +3055 +3054 +3059 +3058 +3052 +3074 +3087 +3104 +3106 +3108 +3104 +3113 +3104 +3106 +3102 +3103 +3110 +3116 +3124 +3123 +3116 +3146 +3132 +3140 +3143 +3141 +3145 +3149 +3158 +3154 +3156 +3164 +3173 +3172 +3173 +3179 +3178 +3187 +3188 +3196 +3195 +3198 +3199 +3205 +3206 +3216 +3222 +3223 +3222 +3223 +3211 +3219 +3220 +3221 +3226 +3224 +3225 +3252 +3246 +3257 +3258 +3256 +3274 +3260 +3273 +3277 +3279 +3296 +3297 +3302 +3304 +3306 +3330 +3355 +3360 +3368 +3365 +3371 +3373 +3376 +3389 +3400 +3402 +3426 +3414 +3420 +3433 +3434 +3431 +3440 +3442 +3437 +3427 +3428 +3415 +3427 +3415 +3399 +3400 +3392 +3421 +3428 +3435 +3455 +3456 +3457 +3459 +3470 +3477 +3496 +3497 +3492 +3499 +3500 +3502 +3524 +3510 +3512 +3515 +3525 +3532 +3533 +3534 +3559 +3561 +3551 +3573 +3578 +3579 +3582 +3583 +3578 +3584 +3583 +3594 +3596 +3601 +3602 +3609 +3595 +3601 +3600 +3606 +3607 +3608 +3609 +3611 +3635 +3654 +3673 +3676 +3663 +3669 +3696 +3685 +3687 +3692 +3707 +3711 +3710 +3720 +3723 +3727 +3739 +3761 +3774 +3785 +3811 +3818 +3816 +3821 +3823 +3824 +3825 +3827 +3839 +3841 +3853 +3864 +3861 +3860 +3873 +3868 +3867 +3866 +3867 +3864 +3868 +3869 +3854 +3842 +3845 +3852 +3870 +3871 +3870 +3832 +3838 +3832 +3828 +3827 +3840 +3841 +3840 +3864 +3860 +3861 +3860 +3867 +3835 +3850 +3851 +3864 +3866 +3867 +3876 +3879 +3881 +3884 +3898 +3910 +3916 +3919 +3906 +3875 +3876 +3878 +3880 +3892 +3897 +3901 +3905 +3901 +3909 +3915 +3921 +3920 +3942 +3936 +3945 +3951 +3961 +3950 +3961 +3962 +3966 +3967 +3968 +3979 +3981 +3982 +3976 +3977 +3980 +3983 +3984 +4001 +4020 +4015 +4023 +4025 +4026 +4012 +4017 +4029 +4050 +4037 +4041 +4055 +4062 +4053 +4056 +4055 +4053 +4066 +4064 +4089 +4093 +4110 +4111 +4110 +4112 +4114 +4115 +4126 +4135 +4150 +4151 +4184 +4190 +4195 +4204 +4211 +4220 +4219 +4229 +4225 +4232 +4248 +4269 +4268 +4261 +4257 +4256 +4257 +4269 +4277 +4274 +4277 +4290 +4279 +4314 +4315 +4350 +4374 +4388 +4389 +4386 +4378 +4379 +4409 +4437 +4439 +4441 +4437 +4442 +4448 +4435 +4436 +4413 +4400 +4408 +4409 +4393 +4392 +4395 +4398 +4399 +4400 +4404 +4415 +4416 +4425 +4411 +4412 +4406 +4430 +4431 +4430 +4431 +4429 +4430 +4426 +4435 +4439 +4449 +4460 +4453 +4454 +4488 +4496 +4474 +4480 +4481 +4467 +4469 +4472 +4477 +4474 +4477 +4484 +4489 +4490 +4521 +4522 +4536 +4543 +4544 +4545 +4549 +4556 +4561 +4562 +4588 +4584 +4576 +4577 +4576 +4595 +4608 +4607 +4610 +4611 +4581 +4584 +4591 +4609 +4630 +4631 +4635 +4636 +4635 +4636 +4670 +4683 +4685 +4686 +4687 +4682 +4683 +4680 +4682 +4678 +4682 +4683 +4686 +4697 +4702 +4703 +4702 +4703 +4733 +4772 +4766 +4764 +4771 +4773 +4761 +4760 +4761 +4763 +4776 +4783 +4790 +4789 +4793 +4798 +4797 +4805 +4813 +4804 +4803 +4804 +4808 +4798 +4799 +4811 +4808 +4807 +4810 +4832 +4869 +4870 +4877 +4880 +4879 +4883 +4878 +4875 +4880 +4882 +4884 +4883 +4884 +4921 +4925 +4926 +4921 +4919 +4920 +4922 +4924 +4923 +4914 +4911 +4917 +4925 +4923 +4925 +4937 +4944 +4945 +4949 +4957 +4953 +4923 +4925 +4926 +4925 +4933 +4934 +4940 +4941 +4956 +4944 +4956 +4977 +4987 +4988 +4989 +4992 +4997 +4998 +5016 +5017 +5024 +5033 +5039 +5037 +5042 +5045 +5048 +5066 +5107 +5131 +5145 +5150 +5154 +5153 +5148 +5149 +5150 +5154 +5159 +5161 +5152 +5168 +5170 +5174 +5167 +5191 +5192 +5206 +5208 +5211 +5212 +5249 +5254 +5255 +5252 +5257 +5291 +5302 +5315 +5326 +5327 +5332 +5333 +5328 +5331 +5322 +5327 +5328 +5332 +5338 +5339 +5340 +5351 +5354 +5339 +5340 +5349 +5347 +5355 +5346 +5354 +5352 +5353 +5354 +5353 +5328 +5345 +5346 +5345 +5334 +5338 +5359 +5361 +5369 +5374 +5377 +5378 +5384 +5385 +5389 +5403 +5407 +5399 +5423 +5430 +5429 +5448 +5458 +5485 +5502 +5504 +5506 +5507 +5509 +5515 +5519 +5523 +5526 +5527 +5522 +5520 +5521 +5525 +5528 +5499 +5500 +5504 +5492 +5498 +5499 +5503 +5504 +5503 +5510 +5500 +5524 +5527 +5530 +5532 +5538 +5541 +5520 +5528 +5539 +5540 +5541 +5538 +5545 +5546 +5548 +5553 +5557 +5554 +5562 +5573 +5572 +5573 +5597 +5581 +5577 +5579 +5586 +5578 +5579 +5600 +5601 +5620 +5642 +5634 +5629 +5656 +5640 +5643 +5642 +5629 +5637 +5638 +5639 +5641 +5643 +5649 +5615 +5632 +5623 +5620 +5629 +5630 +5631 +5624 +5639 +5642 +5662 +5671 +5693 +5692 +5694 +5705 +5719 +5727 +5728 +5732 +5717 +5721 +5732 +5733 +5748 +5750 +5755 +5756 +5763 +5780 +5785 +5787 +5781 +5782 +5796 +5797 +5803 +5824 +5830 +5833 +5836 +5835 +5838 +5837 +5854 +5853 +5844 +5843 +5846 +5847 +5856 +5878 +5887 +5890 +5898 +5896 +5898 +5897 +5898 +5899 +5920 +5915 +5925 +5924 +5942 +5939 +5935 +5939 +5941 +5942 +5943 +5951 +5942 +5939 +5940 +5944 +5954 +5955 +5958 +5959 +5960 +5959 +5962 +5986 +6008 +6018 +6011 +6009 +6008 +6012 +6013 +6010 +6015 +6012 +6015 +6024 +6028 +6023 +6027 +6018 +6043 +6059 +6066 +6072 +6074 +6087 +6095 +6096 +6098 +6099 +6096 +6073 +6074 +6072 +6075 +6087 +6088 +6084 +6089 +6097 +6095 +6085 +6083 +6084 +6082 +6093 +6085 +6081 +6082 +6106 +6108 +6124 +6127 +6122 +6103 +6108 +6110 +6109 +6121 +6122 +6132 +6153 +6155 +6160 +6162 +6185 +6193 +6198 +6196 +6187 +6188 +6206 +6207 +6222 +6243 +6244 +6237 +6255 +6251 +6253 +6255 +6257 +6259 +6269 +6273 +6277 +6298 +6301 +6305 +6310 +6312 +6315 +6332 +6333 +6334 +6333 +6335 +6327 +6332 +6330 +6347 +6348 +6344 +6343 +6349 +6355 +6359 +6365 +6370 +6352 +6349 +6375 +6381 +6366 +6398 +6414 +6416 +6417 +6419 +6420 +6419 +6418 +6405 +6414 +6417 +6418 +6419 +6406 +6410 +6409 +6414 +6416 +6403 +6402 +6404 +6406 +6425 +6426 +6427 +6431 +6447 +6432 +6433 +6435 +6440 +6469 +6484 +6489 +6508 +6512 +6514 +6517 +6523 +6505 +6503 +6504 +6512 +6513 +6515 +6516 +6521 +6522 +6525 +6533 +6532 +6535 +6536 +6535 +6539 +6543 +6572 +6576 +6579 +6590 +6600 +6601 +6614 +6616 +6625 +6635 +6636 +6647 +6652 +6659 +6660 +6675 +6691 +6703 +6706 +6719 +6743 +6729 +6756 +6755 +6739 +6740 +6748 +6737 +6738 +6740 +6741 +6746 +6748 +6745 +6744 +6715 +6729 +6743 +6742 +6741 +6744 +6770 +6783 +6793 +6792 +6805 +6788 +6800 +6806 +6793 +6795 +6800 +6801 +6816 +6826 +6822 +6829 +6835 +6847 +6845 +6847 +6845 +6846 +6853 +6860 +6861 +6874 +6866 +6869 +6863 +6866 +6867 +6870 +6849 +6848 +6849 +6853 +6847 +6857 +6898 +6899 +6897 +6888 +6899 +6901 +6896 +6899 +6909 +6912 +6913 +6914 +6915 +6916 +6930 +6931 +6932 +6929 +6930 +6941 +6934 +6954 +6975 +6982 +6988 +7010 +7017 +7021 +7050 +7052 +7029 +7030 +7035 +7036 +7046 +7070 +7071 +7078 +7079 +7078 +7094 +7101 +7113 +7119 +7120 +7121 +7122 +7135 +7139 +7116 +7119 +7129 +7132 +7136 +7133 +7151 +7148 +7136 +7143 +7170 +7183 +7184 +7205 +7207 +7216 +7207 +7232 +7228 +7230 +7256 +7276 +7295 +7320 +7303 +7311 +7313 +7314 +7315 +7325 +7306 +7301 +7291 +7293 +7310 +7318 +7335 +7354 +7374 +7379 +7393 +7396 +7413 +7403 +7387 +7399 +7400 +7399 +7400 +7402 +7412 +7413 +7409 +7410 +7409 +7414 +7415 +7416 +7417 +7421 +7388 +7389 +7388 +7371 +7377 +7378 +7379 +7384 +7396 +7390 +7399 +7401 +7422 +7423 +7421 +7422 +7425 +7444 +7453 +7454 +7455 +7457 +7461 +7456 +7442 +7407 +7408 +7418 +7419 +7427 +7447 +7448 +7449 +7450 +7452 +7462 +7440 +7471 +7492 +7512 +7529 +7530 +7543 +7542 +7543 +7558 +7560 +7566 +7584 +7588 +7589 +7586 +7587 +7586 +7596 +7612 +7616 +7615 +7616 +7605 +7607 +7627 +7648 +7667 +7670 +7679 +7680 +7685 +7695 +7705 +7725 +7751 +7757 +7739 diff --git a/1.jl b/1.jl new file mode 100644 index 0000000..f384578 --- /dev/null +++ b/1.jl @@ -0,0 +1,14 @@ +include("utils.jl") + +input_lines = non_empty_lines("1.data") +integers = map(s->parse(Int, s), input_lines) + +"1" +zipped = zip(view(integers, 1:length(integers)-1), view(integers, 2:length(integers))) +result1 = mapreduce(t->t[1] < t[2], +, zipped) + +"2" +zipped2 = zip(view(integers, 1:length(integers)-2), view(integers, 2:length(integers)-1), view(integers, 3:length(integers))) +summed = map(t->t[1]+t[2]+t[3], zipped2) +zipped_again = zip(view(summed, 1:length(summed)-1), view(summed, 2:length(summed))) +result2 = mapreduce(t->t[1] < t[2], +, zipped_again) diff --git a/10.data b/10.data new file mode 100644 index 0000000..eec53e5 --- /dev/null +++ b/10.data @@ -0,0 +1,94 @@ +({<{({([<<{<[<<><>><<>>](<()()>)><{{{}<>}}<<<>{}>[<>[]]>>}{[<<[]{}>[<>()]>[(()[])]]<{{<><>}[[]<>]}{< +[(<[[([[(([<{{[]{}}([][])}<<{}[]>([]{})>><{<()()><[][]>}{[()]<()[]>}>]<{({()()}){[{}[]][<>()]}}[{[{}<>] +{{(<[[(<<<(<<[{}{}]{<>()}><{[]{}}([]{})>>([([][]){{}<>}][<()<>>[(){}]]))<{<(<>())[{}<>]>{{[]{}}<<>{}>}}({< +<([({[<[(([[<(()<>){[]<>}><<(){}>{()()}>]](<(({}[]){[][]})<{<>())[<>[]]>>{{{()<>}{(){}}}{[<>()]<{}[]>} +<(((<{<(<{{[[[()<>]{[]()}]][{<()[]><<>{}>}]}}[<{[{[][]}[<><>]]}{{{(){}}[<>()]}{[[]()]{<>[]}}}>{[({{} +{{({[({(({{[<[{}()]([]<>)><<{}()>[<>[]]>]<<{[]{}}([]<>)>{{<>}{<>{}}}}}{{<<[]<>>{<>()}>}<({[]<>} +(([{[(<(<[[(([()[]][{}()])(([][])<{}<>>))]]>)[<(<{{<<><>>(<>[])}<([]<>)[[]{}]>}((<{}[]>[<><>]){{[ +{{[<<{<<(<([<<[]()>[[][]]>{[()[]]<()[]>}]){(<(<>{})([])>{<(){}>{<>()]}){[<[]()><<>()>](([][ +((<{[{{(<<[(<{<>{}}[<>[]]>{<{}<>>{{}[]}})]>><{([<(<>())[{}()]>{<<>{}>{[]{}}}><([[]()]<[]<>>)(<[]>{()()})>)}>) +{<({{{(<[([<{(<>[])<()[]>}([[]]([]{}))>])[{{[([]){[]{}}]}}{[[{(){}}{<>{}}][[(){}]]]<([<>{}]{{}<>})( +([([{{{[[<<[[(()[])<<><>>]{({}[])}]((([]{})<<>>)({[]<>}[<>[]]))>{(({<>()})([{}[]]<()<>>)){[ +{[<(({[<<{{{[({}[]){<>()}]{[()()]{[]()}}}[{<<><>>{<>[]}}<{()()}<()>>]}({<(<><>)[()[]]>([{}()])}{[(<>())(() +<{{[[<{{(<<{<[{}{}]<{}[]>>[{{}[]}[{}()]]}((<()()>{(){}})<((){})>)>[{<({})[[]{}]>([{}<>])}{{[{}()]}{<[ +[{[<{<[[({([(<{}<>>[<>()])]<<<{}{}>({}<>)>>)<{(({}[])({}<>))}<{<[]>({}<>)}{{()()}([]())}>>}){<[<[[{}<>]< +{(<{{<{<<(<<<[{}{}]((){})>>{<<{}{}>{()[]}>}>)([({(<>())<<>()>>)(<<()[]>(<>())><<()()>({}())>)]{(<[<>< +[{<{[<{([{[({<(){}>([]())}[<<>[]>([]())]){{<(){}>{{}[]}}<[()[]]({})]}](((<{}()>{{}()})))}[[( +<<[{{[<<(<{({{[]{}}{()()}}){<<{}()>({}<>)>(({}<>)[()<>])}}<[[([]{})[<><>]]]((<()()>{<>[]}){{[]{ +[[({[({[([({{<[]{}>{(){}}}{[[][]][()()]}}[{<{}><{}()>}({()[]})]){{[[()<>]<[][]>][({}<>)]}}](<({<{}( +[[[((([((<{{[(<>())[{}[]]]{{<>{}}}}}>))<[[[({{{}{}}(()())})({([]{})[<><>]}[([]{}){()[]}])]<{<[{ +[{[<[{{([[{(({()()}<{}[]>){{()<>}{{}()}})<<<{}[]>>{<<>[]><{}{}>}>}]{{{[{()()}[<>()}]{{{}}[(){}]}}} +[[{[(({[[[[{(<<>()>(<>()))[<{}[]>{[]<>}]}{{{()<>}<()()>}}]<[<([]<>}{<>[]}>]>](((<{()()}<()()>><<<>[]><<> +({[{({(<{((<<[()[]]<()<>>]<([][])>>[([{}()]<{}{}>){<{}{}>(()[])}])[{([<>()]{()[]}){[()[]]}}([{()<>} +[(({(([[{(<{{<[][]>(()()}}[({}[])]}[(<<>[]><()[]>)]>)<{({{[]{}}[()[]]}[<<>()>(()())])}{(((()[])<[]>) +<(<([[({[((((<{}[]>[{}{}]){[{}<>](<><>)})(([()<>]({})){[{}{}]{[]<>}}))[({(()[])<<>[]>}[[()<>]<() +{[(<<({([{[(<<[][]>(<>())>){<[<>()][[]{}]>(({}[])[(){}])}][(({{}<>}))(<[()()]<()()>>}]}{[{<(<> +[{{({<({<(<[[<{}<>>{()[]}][{()()}]]>){[<{{()[]}[{}()]}>([<()[]><{}<>>](<()[]>))]{[<[<><>]{<>[]}>[<() +{[<<[{<<[[(<(<[][]>[()()])>){<(([]()){{}[]})><<[{}()]<<>>>>}}[[([<{}[]><(){}>][({}())[()<>]])[[{<>[] +{((<[{{<{[<[((()<>)<()()>)]>]}>}((([{[[<<>[]>[[][]]]<[[]()]({}[])]]{[([]{}){()()}]}}<((<[]< +{[[({<{<<{<{{{[]{}}}}>}[[{(([][]){<>[]}){{()<>}}}<<<()[]>[{}[]]>>]<[{[()[]]({}{})}{[{}()]}]>]>>}>}< +[{[(<({{(<(([{()<>}{()<>}]{{[]}(()())]))>(<<{[<><>]<()<>>}[(<>{})<<>{}>]>[{{<>{}}{{}[]}}<[< +{{((<[(([<{{([()][(){}])({<>()}[()<>])}[{[{}<>]<()()>}<{{}}([]<>)>>}(<<[[]{}]<[]<>>>[([]()){[]{}}]>((<<>( +(<<<(<([<<({<<<><>>[{}<>]>{<()>([]<>)}}{{(<><>)}<{<>()}{{}()}>})<<<({}{})<[]<>>>>>]{({({[][]}[{}()])([<>()]( +([(<<<(<(([([{<>{}}<(){}>](<{}<>>[{}{}]})][([<()>{{}[]}](<<>()><()[]>))[[{<>()}[<>[]]]{<<>[]> +(<{[[<<<({[<<([]())[()()]>([()[]]{<>{}})>]})[[{<[{<>()}({}{})><(()<>)([]{})>><<<<>()><<>() +[[[{(<[[((<[{<<>[]>({}[])}<[{}{}]{[]<>}>]<{({}{})}{[{}<>]{<><>}}>>([{[[]<>](()<>)}{{<>{}}(<>[]))]{[{{}{}}]}) +[(<([[[{<[[<((()()){[][]})>((<{}[]>[()<>])<([]()){<>[]}>)]<<{<<><>>}{{(){}}}>>]<{[<<(){}>({}<>)><<<>()>([]<> +[<((<<[<{[{[{[()[]]{()<>}}(<<>()>[<>()])]}{<[[(){}]{(){}}]{[()]{<>[]}}>{{<[][]>[()()]}[(<>{ +[({{([([{[[([<<>{}>[[]()]]({{}()}))][<{{()[]}}<<{}{}>>><[[{}[]][<>()]][{{}[]}(<>{}))>]][{((((){ +((<<{(([[[{{<[()[]]({}())>}<[{(){}}]<({}{})<()[]>>>}{((<()<>>([]<>)){[()][()[]]})([{()}<[]{}>]<(<><> +<<<<[([<<(({<[[]()]<<><>>>({[][]})}{([<>{}]<<>()>){{[]{}}}})){[[[[[]{}][(){})]{(()[])(()<>)}]{{[[]<>][{}( +[({{([<{({{[{(()[])<<><>>}(((){})[<>()])>}{{{{{}<>}<{}[]>}{[(){}](()[])}}}}([(([<>{}](<>[])) +([(<({{(<<[([[<>][<>()]])<[{()[]}([]{})]{[()<>][[]{}]}>]><<{[{<><>}<()()>]{{<>[]}>}>>><[<{{ +({{(([({{<[<[{{}{}}{{}<>}]((<>{})[[]<>])>(((<><>)<{}()>){{{}{}}{{}{}}})]({<{{}}([][])><<[]{}> +[(<{({{(<<<(<[{}[]]{(){}}>(([]()){<>[])))[{{[]{}}{()()}}{[<>{}][<>]}]>[((<{}<>>[<>[]])[({}[])<[]{}>])[<[{ +[(<<<[<<({{{[[(){}]]{<<>{}>{()[]}}}{({<>{}}{[][]})}}{<([()[]]<{}<>>)([{}()]({}[]))>[(<<>()>{[]()})]}}{([{{( +{[{{(({[{<{{[[()<>]<[]<>>]({{}{}}[{}{}])}{(<<>[]>{[]})[[[]{}]{()<>}>}}{<<{{}{}}(()[])>>{{[[]()] +[<[[{(([<<[<[([][])<[]{}}]{<(){}>}>(<<()<>><[][]>><<{}[]>[{}()]>)]><([([[]<>](()[]))[(()<>)<(){}>]][({ +<{{<([<([{{{(<[]{}>[[]{}])[{<>{}}([])]}}[<[<<><>>({}<>)]{((){})[[]<>]}><[{()[]}<<>{}>]{{()() +{[<<<([{([{<<(()[]){{}{}}>[(<>{}){{}()}]><[[{}<>][[]()]](<{}()>([]()))>}]){{<{<[()<>][<>()]>< +<{[<<[([[{[({[[]<>](<>[])})({([]<>)<[]()>}<([]<>)[<>[]]>)]}[[{[{()<>}{<>{}}][<[]{}>(<>[])]}<({[]<> +[[[[([({(((<<[()<>]>[(()())]>{[{{}()}[[]()]]{[<>()]([][])}})))}(<({(({()[]}[<>()]))<[[()<>]]<{{}()}[()<>] +{[([([<[(<<[<[[]()]<[]<>>>][{<[][]>[<>()]}{({}<>)<()[]>}]><{({<>()}{<><>})<{(){}}({}{})>}<{( +<<({[<<{(<[<({{}[]}{<>[]})[<()()>]>(([<>()][<><>])(<<>{}><()[]>))](<[<{}<>>[{}[]]]({{}{}}( +[<<{<(([<[{(([()<>]({}{})){<<>[]>[()()]})({([])(<>())}[{[][]}[{}[]]])}{({(()())[()[]]}({[]<>}([][]))) +((({<[{([(<[(<[]()>)](<[{}()]<[]{}>>(({}())<()[]>))>)[(<[([]<>)(<>{})]>)]][({({[()[]]{<>}}[[[]{}]{()[]}])([<< +[[[(({[<[((({([]){<>{}}})[[{()[]}[{}[]]][{[]<>}]])<<(<[]{}>[<>[]])[<[][]>[{}[]]]>>)[([{{<><>}[[][]] +({<(({{[{{<[((<>())(<>[]))<<<><>>((){})>]([<[][]><{}{}>][[{}()]<<>()>])>((<[[]()]([][])>[<{}[]>{ +(({<<([[<[[{<[()()]<[][]}>[{(){}}[{}<>]]}(<{{}<>}{[]<>}>{<(){}>{<><>}})]<<{<<>[]>[<>[]]}{{ +<[{([<[({<((<[{}()]([]<>))[(()[])])((({}{})<()<>>){(()<>)}))>{[<<[<>{}][(){}]>{<<><>>(<>[])}>{[ +{[([[[{{<<[<<<()()>(()<>)>[({}{})[<>{}]]>([[[]<>]]{<<>>[[][]]})]><<[{(()[])][<()>[{}[]]]]<([{}{}][()<>])( +{(({{<<((<{<<<[]{}>{{}()}><<<>()><()[]>>><<[<>[]]](({}[])[[]{}])>}[[({<>()}{()}){[[]{}]({}())} +<[[{<[({<([<<<()<>>>>([[[]()]{<><>}](<<>[]>[<>]))])(({({[]{}}){{{}()}{(){}}}}[{(()<>)[[]()]}[{<>()}{[][]}]])) +{<[[([{<<<{{[<[]{}>[[]<>]]{({}())<[][]>}}<<<{}{}>>({(){}})>}([{({}())}<([]())[()()]>])>({{[[<>()]{{}{ +<{(<[{[[{[<<<{(){}}[<>{}]>{{{}[]}<<>()>}>{[{[]()}<<>>]{<[]{}>[()()]}}>][[[{<<>())[[]<>]}<(<> +[{{<<{{([(<<{{{}}[()]}<(()())(<>())>>(<{[]()}[[]<>]>)>[((<()()><[]{}>}({[]<>}))(({[][]}{[]<>})<(()[])(()[] +([(<<[<{({[[[(()<>)<{}()>]{[{}()]{<>{}}}]{(<(){}>{{}[]}){<<><>><{}[]>}}]}<{[[[()()]{{}{}}]] +{<(((<({<((([<(){}>]){{{<><>}{{}()}}})({<[[]{}]>{({}())}}))>})([[<<<{[{}[]]{[]{}}}<{()<>}({}[])>>>{[ +{([[{[[[<<<({{()<>}}(<[]<>>[<><>]))[[[[]<>][{}()]]]>{<<[<>()][[][]]](<{}{}>{[]{}})>[<(<>{}){<><>}>([{}[]] +[[{(<{{{<(<{[[{}()](()[])]}<<{(){}}[()[]]>{[()()]([]())}>>)>[(<<<{[][]}>>[{([][])[(){}]}[(< +<{[(<{<{(<<{<{()[]}(()[])>(([]<>)([]()))}>{((({}[]))<{[]()}{{}()>>)<{<(){}>}<{<>()}<()()>> +<(<[{{[[{<{[{[<>][<>[]]}]{[(<>[])][<{}{}>{<>}]}}(({[()<>]{[]<>}}<{(){}}[[]{}]>)([[<><>]<()()>]<({}[])([]()) +{(<{[{[{({{(<<<>{}>><({}())(<>())>)}}{(<<<(){}>{(){}}>(<{}()>(<>()))><[{<>()}{{}()}][{[]<>}(()())]>){<[{{}[] +{[((((({<(([(<[]<>><[]<>>)<<{}()>>](<{()[]}(()<>)>{{{}{}}([]{})})))[<[{([])[<>]}(([]())<{}{}>]]{ +(<{[((([{(<<{(()<>){{}[]}}>><<<({}<>)[[]()]>{(<>[])[()()]}>{{{<><>}([]())}}>)[{(([[]()][<>( +<[<<<[(<[[(<<([]{})>([[][]][{}{}])><[<<>[]>[{}[]]]<[<>][()()]>>)][[<<{()[]}(<><>)><<()()>[()<>]>>][{[{[]() +<<{([[<[[<[({[<>[]](()<>)}{({}[]){()[]}}){({{}[]}(<>()))}]<[[<[][]>[[]<>]]<[{}<>]<[]{}>>)>>]< +[((([[{<<[[<{{{}[]}[()<>]}>(<<{}{}>[(){}]>({<>[]}<{}<>>))][<{[{}<>]{[]}}>({[{}{}}[[][]]})]](({[{[][]}]{[{} +[([{<[[{<((<<{[]<>}(()<>)>>{(<<>{}>(()<>))}))[(<[[[][]][<>{}]]{[()[]](()())}><({{}{}}}[({}())]> +{{[({<(({{[({{[]()}<()<>>}{([]()){[]{}}}){[<<>>[<><>]][<{}<>><()[]>]}][{<({}{}><[][]>>{{{}()}<(){}>}}]}}))>}< +{[{[<{{({[({[[{}()][(){}]]{{[][]}<<>()>}}[[(<>[])<[]{}>]((<>[])[{}()])])]})}}>{({{<([{<([]())[{}{}]>{ +<{{[{<{<<{{({<{}[]>[(){}]}[[<>()]{(){}}])}}[{{[(()<>)(<><>)]<{()<>}{<>()}>}{({[]()}{{}()})<{{ +((((([{{<<[<({()<>}<<>{}))<{{}<>}(<>[])>>{<{(){}}[{}[]]>}]{<<[{}{}]>{{()()}[{}<>]}>}>>([[({(()())<() +(({{[[<[[<<<<<[]()>[{}<>]]>>({[<<><>><{}()>]{{(){}}[<>{}]}}[[([]<>)({}<>)]])>{<[[<{}[]><{}<>>][<<>[]>]](<<[] +<[<([<<[([[[[<{}[]><()>][(<>{}){[]}]]{({()[]}[<>{}])}]([((<>[])(<>[]))[{<>[]}{[]<>}]][(([]{})({}<> +<((<{{({{([<([<>{}](()()))<<(){}>[<>[]>>>({<<>>([]{})})]<[[([]())<<>>]{{<>{}}(()<>)}]>)<[(((<>)<{}<>>)({<>( +{({<({<<[[{[((<>())<()<>>)<(<>[])((){})>]({{[]()}[{}()]}[[{}{}]<{}[])])}({<[(){}](<><>)><{()<>}[{}[] +<[(<<[((([(([[[]<>][<><>]]{{{}{}}[{}[]]}){(({}())<[]{}>)})<(<(()[]){()()}>{<()>[[]{}]}){{[[]{}]([]< +{(<(([{[[<[[[{<>{}}{[]{}}]({(){}})]<[[()()]][[{}[]]]>]{<<{{}{}}[{}{}]>>[(<{}()>([]{}))(<(){}>{<><>} +((<<({({<{<<[<[]{}><()[]>]<(<>()){()[]}>>>}{(((({}<>)({}()))<{[]{}}<<>[]>>)<({[][]}<(){}>){ +[[<{((({{{(<{[[]{}}{{}}}<{[]{}}<()>>>{<{{}[]}<[]()>>{[()[]]{[][]}}})([{[[][]]}(([]{})<<><>>)][(<[][]>{{} +(<({[{[(<<(((([]())[<><>]}([<><>]))<[[()<>]<<><>>]{<[]()>{()<>}}>)[<<{[]()}(())>><[<(){}><<>{} +(<<[<(<{<({<[{(){}}{<><>}][<<>()>]>}<[<[()[]]<{}[]>>]<<({}[]]><[[][]]<[]()>>>>)>}><[((<[<<[]<>>>[[<>()][{}( +[((<[{[[([{[[<<>>{<>()}]<[[]{}]<[]<>>>]}<({(()<>))<<<>()><<>[]>>)<{<[]{}>((){})}[({}[]){()()}]> +<<{{({{([{{<<{{}{}}(<>{})><{()()}[{}<>]>><{<[]<>>[[]()]}[<<><>>({})]>}(((<<>{}><{}{}>)([<>{}][{}]))[{ diff --git a/10.jl b/10.jl new file mode 100644 index 0000000..271332f --- /dev/null +++ b/10.jl @@ -0,0 +1,62 @@ +using Pkg +Pkg.add("Match") +using Match + +include("utils.jl") + +function corrupt(line) + first, rest... = line + check = [first] + for char in rest + if char in "<{[(" + push!(check, char) + else + match, score = @match char begin + '>' => ('<', 25137) + '}' => ('{', 1197) + ']' => ('[', 57) + ')' => ('(', 3) + end + if last(check) == match + pop!(check) + else + return score + end + end + end + 0 +end + +function solution10_1() + sum(map(corrupt, non_empty_lines("10.data"))) +end + +function fix(line) + first, rest... = line + check = [first] + for char in rest + if char in "<{[(" + push!(check, char) + else + pop!(check) + end + end + value = 0 + for char in reverse(check) + value *= 5 + value += @match char begin + '<' => 4 + '{' => 3 + '[' => 2 + '(' => 1 + end + end + value +end + +function solution10_2() + values = sort(map(fix, filter(line->corrupt(line)==0, collect(non_empty_lines("10.data"))))) + values[div(length(values), 2)+1] +end + +solution10_2() diff --git a/10_ex.data b/10_ex.data new file mode 100644 index 0000000..b1518d9 --- /dev/null +++ b/10_ex.data @@ -0,0 +1,10 @@ +[({(<(())[]>[[{[]{<()<>> +[(()[<>])]({[<{<<[]>>( +{([(<{}[<>[]}>{[]{[(<()> +(((({<>}<{<{<>}{[]{[]{} +[[<[([]))<([[{}[[()]]] +[{[{({}]{}}([{[{{{}}([] +{<[[]]>}<{[{[{[]{()[[[] +[<(<(<(<{}))><([]([]() +<{([([[(<>()){}]>(<<{{ +<{([{{}}[<[[[<>{}]]]>[]] diff --git a/11.data b/11.data new file mode 100644 index 0000000..5148c3e --- /dev/null +++ b/11.data @@ -0,0 +1,10 @@ +7777838353 +2217272478 +3355318645 +2242618113 +7182468666 +5441641111 +4773862364 +5717125521 +7542127721 +4576678341 diff --git a/11.jl b/11.jl new file mode 100644 index 0000000..6e6842e --- /dev/null +++ b/11.jl @@ -0,0 +1,43 @@ +include("utils.jl") + +function parse_input(filename) + map(x->parse.(Int, x), split.(non_empty_lines(filename), "")) +end + +function flash(octopuses) + sum(map(CartesianIndices((2:11, 2:11))) do coord + if octopuses[coord] > 9 + octopuses[coord] = -8 + for neighbor in CartesianIndices((coord[1]-1:coord[1]+1, coord[2]-1:coord[2]+1)) + octopuses[neighbor] += 1 + end + 1 + else + 0 + end + end) +end + +function solution11_1() + octopuses = transpose(reshape(reduce(vcat, [[fill(-2000000, 12)]; map(x -> [-2000000; x; -2000000], parse_input("11.data")); [fill(-2000000, 12)]]),(12,12))) + sum(map(1:100) do _ + map!(x->x+1, octopuses, octopuses) + flashes = sum(collect(Iterators.takewhile(>(0), (flash(octopuses) for _ in 1:100)))) + clamp!(octopuses, 0, 9) + flashes + end) +end + +function solution11_2() + octopuses = transpose(reshape(reduce(vcat, [[fill(-2000000, 12)]; map(x -> [-2000000; x; -2000000], parse_input("11_ex.data")); [fill(-2000000, 12)]]),(12,12))) + for i in 1:1000 + map!(x->x+1, octopuses, octopuses) + flashes = sum(collect(Iterators.takewhile(>(0), (flash(octopuses) for _ in 1:100)))) + if flashes == 100 + return i + end + clamp!(octopuses, 0, 9) + end +end + +solution11_2() diff --git a/11_ex.data b/11_ex.data new file mode 100644 index 0000000..03743f6 --- /dev/null +++ b/11_ex.data @@ -0,0 +1,10 @@ +5483143223 +2745854711 +5264556173 +6141336146 +6357385478 +4167524645 +2176841721 +6882881134 +4846848554 +5283751526 diff --git a/12.data b/12.data new file mode 100644 index 0000000..e408c73 --- /dev/null +++ b/12.data @@ -0,0 +1,24 @@ +by-TW +start-TW +fw-end +QZ-end +JH-by +ka-start +ka-by +end-JH +QZ-cv +vg-TI +by-fw +QZ-by +JH-ka +JH-vg +vg-fw +TW-cv +QZ-vg +ka-TW +ka-QZ +JH-fw +vg-hu +cv-start +by-cv +ka-cv diff --git a/12.jl b/12.jl new file mode 100644 index 0000000..50c26c0 --- /dev/null +++ b/12.jl @@ -0,0 +1,74 @@ +include("utils.jl") + +function solution12_1() + lines = non_empty_lines("12.data") + adj_mat = Dict() + for line in lines + front, back = split(line, "-") + push!(get!(adj_mat, front, []), back) + push!(get!(adj_mat, back, []), front) + end + result = [] + growing = [["start"]] + while length(growing) > 0 + new = [] + for path in growing + for neighbour in get(adj_mat, last(path), 0) + if Base.Unicode.isuppercase(neighbour[1]) + push!(new, [path; neighbour]) + else + if neighbour == "end" + push!(result, [path; neighbour]) + else + if !(neighbour in path) + push!(new, [path; neighbour]) + end + end + end + end + end + growing = new + end + length(result) +end + +function small_twice(path) + length(filter(unique(path)) do element + Base.Unicode.islowercase(element[1]) && length(filter(==(element), path)) > 1 + end) > 0 +end + + +function solution12_2() + lines = non_empty_lines("12.data") + adj_mat = Dict() + for line in lines + front, back = split(line, "-") + push!(get!(adj_mat, front, []), back) + push!(get!(adj_mat, back, []), front) + end + result = [] + growing = [["start"]] + while length(growing) > 0 + new = [] + for path in growing + for neighbour in get(adj_mat, last(path), 0) + if Base.Unicode.isuppercase(neighbour[1]) + push!(new, [path; neighbour]) + else + if neighbour == "end" + push!(result, [path; neighbour]) + else + if neighbour != "start" && (!small_twice(path) || !(neighbour in path)) + push!(new, [path; neighbour]) + end + end + end + end + end + growing = new + end + length(result) +end + +solution12_2() diff --git a/12_ex.data b/12_ex.data new file mode 100644 index 0000000..6fd8c41 --- /dev/null +++ b/12_ex.data @@ -0,0 +1,7 @@ +start-A +start-b +A-c +A-b +b-d +A-end +b-end diff --git a/12_ex_2.data b/12_ex_2.data new file mode 100644 index 0000000..62cc714 --- /dev/null +++ b/12_ex_2.data @@ -0,0 +1,10 @@ +dc-end +HN-start +start-kj +dc-start +dc-HN +LN-dc +HN-end +kj-sa +kj-HN +kj-dc diff --git a/12_ex_3.data b/12_ex_3.data new file mode 100644 index 0000000..65f3833 --- /dev/null +++ b/12_ex_3.data @@ -0,0 +1,18 @@ +fs-end +he-DX +fs-he +start-DX +pj-DX +end-zg +zg-sl +zg-pj +pj-he +RW-he +fs-DX +pj-RW +zg-RW +start-pj +he-WI +zg-he +pj-fs +start-RW diff --git a/13.data b/13.data new file mode 100644 index 0000000..4a8c9ec --- /dev/null +++ b/13.data @@ -0,0 +1,972 @@ +587,795 +930,267 +306,240 +1052,763 +177,826 +681,841 +1062,413 +840,878 +232,271 +965,165 +319,612 +1027,215 +524,707 +939,887 +1210,740 +284,126 +579,38 +1079,826 +509,73 +542,381 +1163,560 +1208,775 +83,306 +177,266 +348,297 +1001,729 +621,162 +1081,92 +557,802 +1039,87 +1290,824 +1096,513 +1034,711 +446,105 +955,523 +371,7 +1039,759 +246,556 +321,143 +1277,747 +768,157 +644,382 +895,471 +1285,252 +751,87 +237,30 +1057,453 +1119,747 +1086,551 +940,514 +279,345 +1064,879 +1061,32 +833,138 +637,541 +900,207 +145,709 +50,437 +870,466 +604,367 +164,773 +688,658 +698,156 +477,714 +759,721 +1233,354 +808,382 +669,121 +1034,576 +694,208 +1210,224 +67,756 +1292,770 +1124,371 +1185,455 +1016,549 +957,226 +641,87 +559,795 +229,840 +446,287 +706,576 +542,466 +753,502 +1173,390 +95,266 +1081,840 +271,87 +858,821 +1067,418 +408,879 +494,684 +525,291 +852,411 +826,313 +626,502 +918,808 +259,714 +1133,266 +567,79 +1272,354 +74,756 +125,7 +1026,380 +812,509 +465,390 +1243,756 +242,609 +1251,665 +264,796 +945,82 +25,535 +378,823 +1300,512 +559,68 +484,313 +298,52 +885,129 +1016,345 +140,819 +750,467 +485,805 +1171,173 +90,42 +191,371 +38,514 +637,93 +858,799 +997,569 +1017,162 +939,455 +999,876 +909,444 +557,392 +751,387 +408,422 +378,631 +1017,284 +249,204 +405,204 +25,617 +438,751 +1087,497 +343,218 +903,614 +1216,686 +826,562 +1078,175 +139,721 +919,732 +765,35 +977,312 +999,533 +1036,367 +284,799 +990,700 +698,14 +1064,472 +689,823 +184,645 +102,551 +567,815 +547,359 +1034,479 +229,92 +715,609 +805,180 +113,644 +721,502 +1063,112 +460,464 +1255,477 +560,203 +758,327 +718,651 +1304,131 +1036,11 +698,351 +435,278 +571,54 +662,357 +885,502 +253,892 +909,854 +1078,7 +241,606 +724,539 +181,185 +1243,490 +284,516 +644,512 +33,610 +659,197 +346,572 +263,162 +18,236 +170,497 +94,887 +147,442 +380,267 +698,238 +797,285 +964,740 +239,471 +94,686 +1066,687 +547,87 +898,285 +1061,862 +1198,466 +999,894 +49,411 +1062,481 +840,206 +1064,422 +430,551 +50,661 +1031,345 +33,215 +196,35 +957,568 +669,404 +430,631 +147,560 +393,819 +407,280 +132,793 +115,35 +274,367 +636,434 +1052,656 +90,852 +845,60 +83,364 +1101,218 +266,439 +425,129 +759,173 +38,380 +49,467 +736,422 +1163,442 +361,162 +276,711 +805,308 +544,591 +602,194 +1083,801 +1091,278 +636,770 +1261,336 +97,18 +674,770 +847,147 +900,332 +238,539 +766,476 +1046,89 +908,786 +557,502 +864,329 +1046,691 +179,697 +48,383 +751,196 +666,834 +72,490 +689,299 +674,231 +539,859 +605,558 +708,866 +299,299 +858,73 +1197,644 +684,842 +682,175 +376,551 +1258,703 +214,9 +733,526 +1295,309 +452,768 +554,446 +1293,386 +693,887 +189,504 +699,455 +201,455 +403,486 +920,796 +1091,168 +626,842 +684,54 +328,233 +663,730 +237,854 +231,703 +1063,784 +920,0 +699,614 +1144,131 +309,165 +410,780 +1039,554 +266,485 +365,119 +769,196 +1022,1 +208,789 +1215,266 +361,757 +689,75 +1305,413 +226,516 +1113,743 +636,796 +900,543 +571,588 +579,856 +1304,2 +1161,143 +319,282 +902,463 +1108,73 +416,84 +513,285 +97,17 +1136,270 +1220,490 +417,406 +1096,428 +1044,455 +801,821 +151,595 +965,505 +120,655 +875,168 +838,187 +346,154 +1250,343 +1215,826 +64,86 +865,116 +994,158 +473,165 +141,285 +264,89 +1104,544 +1272,211 +567,472 +592,719 +1061,480 +1109,439 +888,243 +739,54 +1129,185 +694,540 +626,54 +693,439 +470,206 +258,432 +391,732 +166,539 +498,133 +82,463 +1258,143 +715,161 +1277,732 +743,815 +72,861 +2,131 +1227,306 +1034,599 +671,876 +87,24 +991,707 +166,131 +522,206 +264,546 +1001,521 +917,523 +517,837 +800,635 +704,717 +219,535 +801,73 +715,665 +1235,883 +343,0 +479,147 +52,703 +567,422 +231,308 +415,471 +1078,427 +356,842 +731,11 +768,381 +577,368 +865,218 +1126,231 +945,119 +587,11 +1227,364 +74,138 +586,847 +334,642 +1185,439 +616,290 +1243,138 +1208,844 +880,263 +1242,439 +1277,679 +383,807 +1213,18 +905,592 +1113,757 +683,187 +830,494 +309,93 +192,26 +706,16 +629,535 +547,807 +934,343 +607,673 +944,235 +746,490 +497,766 +1063,614 +38,113 +0,661 +1064,662 +288,669 +574,562 +1046,805 +689,519 +1250,103 +611,439 +390,348 +552,791 +755,613 +888,875 +1268,514 +1073,30 +977,560 +38,561 +18,7 +1034,556 +967,632 +1237,749 +309,521 +962,597 +920,348 +85,466 +865,564 +1260,457 +758,50 +1280,576 +1046,98 +1034,295 +950,549 +73,2 +545,859 +837,389 +60,791 +745,226 +587,180 +60,343 +365,775 +902,472 +875,127 +559,87 +95,807 +141,509 +999,890 +1067,476 +893,304 +656,681 +13,404 +745,369 +64,808 +430,263 +219,168 +939,7 +724,47 +467,61 +95,826 +1071,423 +914,579 +756,154 +621,183 +266,7 +507,782 +733,354 +276,338 +48,717 +487,652 +319,264 +1272,540 +348,533 +1297,82 +551,173 +751,835 +196,483 +858,95 +100,313 +1119,579 +423,835 +818,121 +320,357 +580,586 +1198,94 +902,422 +694,333 +604,599 +410,207 +37,364 +746,404 +734,817 +1180,187 +1225,428 +982,380 +299,595 +1216,467 +1285,642 +885,392 +684,392 +112,878 +166,355 +967,710 +957,277 +599,359 +197,757 +470,361 +1066,780 +718,670 +1235,491 +246,662 +1059,408 +664,357 +735,700 +1034,31 +940,351 +716,73 +621,732 +858,156 +1144,539 +446,271 +341,878 +833,502 +686,634 +440,542 +488,579 +735,252 +1255,417 +935,549 +933,336 +997,430 +989,751 +669,542 +271,554 +18,98 +577,32 +356,536 +887,835 +962,688 +1036,627 +38,540 +1099,859 +15,466 +595,665 +75,446 +724,91 +475,25 +572,431 +605,467 +25,252 +666,60 +1215,59 +736,332 +1046,546 +174,606 +1173,504 +32,259 +1011,299 +637,205 +202,745 +523,19 +1200,303 +284,380 +33,162 +693,7 +706,437 +1118,500 +276,631 +559,387 +470,645 +1099,35 +1293,353 +1262,791 +416,450 +999,18 +1238,490 +587,782 +612,238 +263,732 +875,87 +440,437 +731,311 +756,446 +751,68 +557,278 +1136,830 +1064,214 +1061,690 +202,149 +984,661 +648,357 +1001,165 +125,455 +1001,93 +554,313 +1230,472 +845,834 +311,361 +689,610 +283,455 +181,505 +249,862 +95,180 +1215,852 +1027,7 +569,18 +662,131 +887,628 +551,721 +182,488 +311,302 +621,375 +246,463 +1118,394 +423,628 +10,508 +100,581 +652,579 +246,15 +864,271 +1084,378 +112,16 +689,711 +751,99 +189,642 +1009,326 +191,579 +954,392 +812,761 +232,7 +922,485 +671,38 +560,691 +805,514 +1044,439 +253,453 +124,785 +253,702 +191,763 +59,161 +283,679 +768,16 +266,821 +403,408 +346,740 +604,457 +191,131 +447,663 +976,642 +850,464 +853,603 +1073,854 +80,562 +244,207 +326,233 +621,711 +530,745 +758,485 +763,359 +239,696 +785,603 +223,497 +177,290 +930,303 +440,430 +294,549 +1165,877 +1297,404 +835,679 +219,278 +156,385 +853,743 +982,233 +1102,341 +43,439 +694,290 +1307,473 +1081,392 +229,54 +661,334 +907,486 +1186,540 +661,560 +939,280 +252,672 +214,162 +708,194 +1002,175 +1063,280 +298,502 +1071,696 +1140,397 +102,396 +808,158 +407,782 +1136,606 +534,543 +170,397 +184,663 +232,427 +853,599 +893,864 +1051,714 +90,490 +999,4 +25,502 +490,667 +577,592 +67,138 +1133,826 +87,359 +177,806 +765,859 +1133,806 +130,187 +1140,497 +1108,745 +289,231 +20,16 +1113,137 +422,243 +80,472 +1176,618 +864,105 +945,812 +490,227 +1,560 +736,562 +266,551 +422,651 +38,686 +888,651 +107,87 +510,572 +1033,483 +1290,518 +33,519 +261,819 +1279,467 +452,156 +1119,131 +18,434 +232,175 +13,352 +15,224 +232,691 +422,208 +1198,800 +962,533 +1292,460 +1044,821 +390,796 +492,219 +177,88 +1198,513 +1057,444 +77,144 +739,784 +1128,406 +612,156 +606,717 +569,876 +617,7 +780,574 +991,264 +544,303 +38,290 +915,547 +308,175 +505,751 +244,780 +639,38 +1126,249 +1046,446 +991,282 +651,473 +110,418 +182,406 +1200,418 +840,430 +930,527 +1026,462 +48,791 +572,15 +803,452 +1295,466 +182,712 +87,311 +1285,617 +396,763 +629,54 +822,579 +763,127 +812,133 +863,663 +52,303 +1250,73 +1073,864 +716,567 +838,707 +214,885 +797,385 +403,535 +370,516 +1220,42 +990,418 +704,177 +969,325 +699,7 +659,869 +1278,259 +616,208 +370,351 +460,430 +962,297 +758,844 +1293,613 +77,316 +636,231 +554,670 +1268,156 +80,332 +756,448 +67,404 +73,749 +283,215 +246,879 +1012,502 +559,99 +249,32 +79,252 +1033,336 +1267,166 +808,64 +1186,785 +1228,463 +219,359 +288,652 +626,840 +883,93 +365,231 +837,165 +706,599 +1129,505 +1292,98 +999,184 +492,675 +715,49 +830,624 +320,418 +1131,334 +820,331 +179,334 +932,631 +147,452 +1178,793 +800,707 +1081,205 +1178,814 +571,840 +87,870 +276,823 +1,334 +232,887 +604,878 +253,889 +1064,108 +840,533 +542,878 +609,218 +1309,334 +55,502 +422,686 +739,110 +17,613 +743,760 +1215,135 +371,280 +858,126 +786,187 +43,166 +887,266 +1021,775 +85,428 +232,686 +1293,281 +258,686 +177,628 +559,196 +1119,371 +485,312 +845,390 +715,733 +572,463 +95,628 +197,585 +494,131 +309,613 +405,32 +13,490 +214,605 +1078,271 +1079,255 +817,889 +612,656 +237,406 +1186,428 +80,422 +651,25 +465,642 +940,516 +793,57 +1078,238 +209,330 +348,688 +232,875 +1034,71 +83,82 +1203,731 +151,747 +48,551 +17,508 +15,551 +1192,287 +375,345 +900,351 +552,485 +1208,103 +189,281 + +fold along x=655 +fold along y=447 +fold along x=327 +fold along y=223 +fold along x=163 +fold along y=111 +fold along x=81 +fold along y=55 +fold along x=40 +fold along y=27 +fold along y=13 +fold along y=6 diff --git a/13.jl b/13.jl new file mode 100644 index 0000000..93b19f4 --- /dev/null +++ b/13.jl @@ -0,0 +1,36 @@ +include("utils.jl") + +function parse_input(filename) + lines = collect(non_empty_lines(filename)) + dots = map(l->parse.(Int, split(l,',')), filter(line->Base.Unicode.isnumeric(line[1]), lines)) + + folds = map(filter(line->!Base.Unicode.isnumeric(line[1]), lines)) do line + front, coord = split(line, '=') + 'x' in front ? 1 : 2, parse(Int, coord) + end + sort(dots), folds +end + +function solution13_2() + dots, folds = parse_input("13.data") + for (axis, coord) in folds + foreach(dots) do dot + if dot[axis] > coord + dot[axis] -= 2 * (dot[axis] - coord) + end + end + dots = sort(unique(dots)) + end + for y in 0:5 + for x in 0:38 + if [x, y] in dots + print('#') + else + print(' ') + end + end + println("") + end +end + +solution13_2() diff --git a/13_ex.data b/13_ex.data new file mode 100644 index 0000000..282114c --- /dev/null +++ b/13_ex.data @@ -0,0 +1,21 @@ +6,10 +0,14 +9,10 +0,3 +10,4 +4,11 +6,0 +6,12 +4,1 +0,13 +10,12 +3,4 +3,0 +8,4 +1,10 +2,14 +8,10 +9,0 + +fold along y=7 +fold along x=5 diff --git a/14.data b/14.data new file mode 100644 index 0000000..5074877 --- /dev/null +++ b/14.data @@ -0,0 +1,102 @@ +SCVHKHVSHPVCNBKBPVHV + +SB -> B +HH -> P +VF -> N +BS -> S +NC -> C +BF -> H +BN -> H +SP -> H +BK -> H +FF -> N +VN -> B +FN -> C +FS -> S +PP -> F +ON -> H +FV -> F +KO -> F +PK -> H +VB -> S +HS -> B +NV -> O +PN -> S +VH -> B +OS -> P +BP -> H +OV -> B +HK -> S +NN -> K +SV -> C +PB -> F +SK -> F +FB -> S +NB -> K +HF -> P +FK -> K +KV -> P +PV -> F +BC -> S +FO -> N +HC -> F +CP -> B +KK -> F +PC -> S +HN -> O +SH -> H +CK -> P +CO -> F +HP -> K +PS -> C +KP -> F +OF -> K +KS -> F +NO -> V +CB -> K +NF -> N +SF -> F +SC -> P +FC -> V +BV -> B +SS -> O +KC -> K +FH -> C +OP -> C +CF -> K +VO -> V +VK -> H +KH -> O +NP -> V +NH -> O +NS -> V +BH -> C +CH -> S +CC -> F +CS -> P +SN -> F +BO -> S +NK -> S +OO -> P +VV -> F +FP -> V +OK -> C +SO -> H +KN -> P +HO -> O +PO -> H +VS -> N +PF -> N +CV -> F +BB -> H +VC -> H +HV -> B +CN -> S +OH -> K +KF -> K +HB -> S +OC -> H +KB -> P +OB -> C +VP -> C +PH -> K diff --git a/14.jl b/14.jl new file mode 100644 index 0000000..421f10a --- /dev/null +++ b/14.jl @@ -0,0 +1,59 @@ +include("utils.jl") + +function parse_input(filename) + template, rawrules... = collect(non_empty_lines(filename)) + rules = Dict() + for rule in rawrules + front, back = split(rule, " -> ") + first, second = split(front, "") + rules[[first[1], second[1]]] = back[1] + end + pairs = Dict() + for i in 1:length(template)-1 + get!(pairs, [template[i], template[i+1]], 0) + pairs[[template[i], template[i+1]]] += 1 + end + pairs, rules, [first(template), last(template)] +end + +function countpoly(pairs, singles) + result = Dict() + for (key, value) in pairs + get!(result, key[1], 0) + result[key[1]] += value + get!(result, key[2], 0) + result[key[2]] += value + end + for single in singles + result[single] += 1 + end + for key in keys(result) + result[key] = div(result[key], 2) + end + result +end + +function solution14_2() + pairs, rules, singles = parse_input("14.data") + steps = 40 + for step in 1:steps + new = Dict() + for (key, value) in pairs + insert = get!(rules, key, nothing) + if typeof(insert) == Char + get!(new, [key[1], insert], 0) + new[[key[1], insert]] += value + get!(new, [insert, key[2]], 0) + new[[insert, key[2]]] += value + else + get!(new, key, 0) + new[key] += value + end + end + pairs = new + end + counts = sort(collect(values(countpoly(pairs, singles)))) + last(counts) - first(counts) +end + +solution14_2() diff --git a/14_ex.data b/14_ex.data new file mode 100644 index 0000000..b5594dd --- /dev/null +++ b/14_ex.data @@ -0,0 +1,18 @@ +NNCB + +CH -> B +HH -> N +CB -> H +NH -> C +HB -> C +HC -> B +HN -> C +NN -> C +BH -> H +NC -> B +NB -> B +BN -> B +BB -> N +BC -> B +CC -> N +CN -> C diff --git a/15.data b/15.data new file mode 100644 index 0000000..94046c7 --- /dev/null +++ b/15.data @@ -0,0 +1,100 @@ +7257173117871274148119191397411866741961893915191233591781237171134183111991588567743913598398999129 +9199956198317542321811795167539333593959845233586245178771259721629672984999396181817424129792113429 +5678391114239515741618386378916979112716269165195269215584939279279177393199175187199511833999819385 +7149919968927397171639311441114199789621399783958844626227879671633692776519178119978312379854918472 +9571133571872511883799281362819193417112413972551887416264299171789218539132957196979811132721291672 +8172584925581929988661688649146133971138896125391412411926754121134983167188929529959966385437588844 +4914518468152915388917729744941583692326581473756415317665271248313684872717734981831164961169161441 +2519894881987711813817528992187872878321614865385871812543911299816979364869972221856158852969592112 +9859391668949943293812278997458981968712239911133451788394169935992685191958894671638974814216612719 +2192529153611518191595896814996141119517992288611125714717119399491112913829241231917539211119881849 +2337843263693226789699931111398112969887535286492296226999311848178157169949315516494848924316823474 +1191281328169873275751982595447194592918411459316261266123821567822849396139339812112776322962112239 +4587143466247931931363896317279914687959418292417719618921579781314932674121288194141812419924513491 +9188217988495399118711317519126435116785399685763129885168131465437119937687542179912685827611129973 +9281999423754831489181352222362255825969879819312357829319722961312991751988497399311813231979551234 +8411642818749914959745792191319718911388132253292482346295961171634916811938584616484592994128913896 +3388255416913192166863912671592797172349778144861261162626679169122118178816999781511482128586841931 +1544111521579847285289829899211419185418871795132727999177828715458885628798278694521919225186212479 +6112394533149912224244478554154888237766677192511968451313528663845219413639188496229811993163929889 +7198784899159217522265428239842119185341314211991273329136173711277137989451533985143943379599711279 +5322174898961411153515736312827315967799457744138498991267929611147897735269199298727139863199825449 +9389598982325839969741219429682597992913484299849122148988986313319119891881251311761168419988993984 +9731391996727591141584769372292618329676991274389449899178113115589128811112539136473142798111999659 +5158499781719185191335698726337225419942769281296219215168381368296377583192114793345154114939919138 +9489436472297254387595375823195948188155998979224885397929111219894329444244314131186498373329899628 +5115948294552681116994961691838819122926817811428719719487293692225795236769313128246954783896581419 +7842378538599781529689123131749873922371451111511113114844145628981899497289212258729489151386198379 +5657182954384884192389177113923946799271142897712314759172399912237297817994565459889643847449996591 +2114463882686822117918787199822775881529895139151499196692246274147217497821149527235387719991114714 +2911917115481432912158219697929535145897818898214661343833193385121919978318122826712681212138729941 +7919482212881442617559399592111184197611192148899237895295211389594619418194519266268597128875922164 +5122782781762591222295946745991662147485323299849117125858933893496129327282821421189644352917799563 +1136291298829627566691527929262125187126922289732289227716821815619551911944779995415278137991622552 +4929328679851289388213321419985631998929472889692146329429231293698273199118713262892523784612611999 +1327734151191996421344997185478394257228713274441955249899986342244731153572974191897991393662691931 +2781117154312271979199389368319489151943763236781711191122134726691762925242929616867585411791129159 +1439186637181196485238285593819594866112889871679966657834249176324314497819969991879491995926214924 +8198715159568382591431231227339698151116662552918333813978498567586137499214111391961922138831958891 +1791636999843894411347725615937522999231159118674816321332412988177251964743241117549699136494419193 +2347191949569898652196299127952395252161168176339428456658821198913454439135327112298841851793131139 +6517373396832351522818699933865532731822114597879322225665521379149517111835298818315911951121182358 +9989219811198438961112789214341437915858986541454335893139567183897549391541933121816392249992757195 +2751242393169519965822749148113198418478749175225597965669585119898274413133594511599239813819261729 +2333615561781383963589211869624423159983279225123169449222598319329695159532597919931391498257683522 +2326925593466238521963381246934599431321918392819124294951311331116521125288316176431186199751635491 +9341367399225381779967242896675118399271292593248972922271792198875912499185119129993955719191131219 +9419488192386241298831213479619891591112812195761439362996925799233613913141343831817117189287994755 +9695968821621727482419983392371417945181396516317947384995853931879231912925789698357961179754119511 +9819267839831973911319938469292179778511998125121931891146223692296192299952153342285175781729419271 +1863816696271622173271985549176326189359343784972161815896794319879938399995919111197381311974788614 +9951198498951459991236295523134837224482241663114944798913138999819143627393989956711324837996945589 +5636493872291432645969776969437321939689259195165871611951271619514731193819693277839717689838523535 +1599873877797591958659883217591162792939133915996748148738729819416279661719716399869947198411871934 +8794639995351381527537286278892222682139243726394685977188691436889598769141824739519232576663818623 +9312694112319895396113225123691699114916381799538178372616115397895462387932975997638239393799315212 +5832652557695274383198568431192817489141326899824429893139485722158832888768989154554522478498498714 +8782845924111831912127921565587919113818125774499381223562975114549551996121626761137916739478221568 +9811929922686225152399211122397597158513891191615161416432783564767191169849849511985178913416153852 +1137711214593792114391112795839813891552389836983814596893489181536998977653386261925692938856897897 +2891454257881276297539979515161138819723112914812122617911912212922972482812982987377897974782821188 +7671589249839457412545235186153935156941884381134221489611219191921272892597772389234492565914198258 +1552483399116635372974898931188883743171689242311789612968114416972112951486134993116143393399793998 +8711188851122588629852724495172527356897321495229616597821333465358285422331924491418522517979118993 +9593315278649975951219952268211871741223727356181132397183838894499829221111978873973591418997289513 +3969997988729933184995613429919894232321166598283911973373115779211228919166877393889434215381781389 +5588221472469964598623295656797377199853717996631331495111278692241929496187813341637872397899624175 +9921637195158912596622263381891921897978588191413981249169189173199699294541171879989121615634351342 +3798931227871974751799777995169123924251123997219388112822621636398239724484812154741112812741472923 +1318745799964813125829815417129787311384489283415939129112478189111179617966392125599951899588399933 +9919168243159595589113819319611976889991646271868112472392818222893941139743434115977476121333191818 +3115972825613468816687921319481739413919883837749478584158912513417673612383549994987313463899975111 +9819245879871957475393932424291294189961391917998628819131487621819218799996929997391516748191973218 +2543119159599118542114782197275925148321199297951316238291197471953953113117231732381348855871885341 +8597192929968786896989279839331134411223192189898926119875521124153282436126568329811999323445191679 +3975785449971831818312568579176154978689122133184732928183381881141862482849263341279915278911683894 +3179111996949988298153199151389479257689125228811639199771592599998978715664289996372311512944263139 +3717731949295466943999325285695444691229948881923328813265999285999127111938229969918689613331778988 +3899774572142914257631398127999644341916848491762691872194259535697139312281868155191287342929193183 +3419531741121147372119481389754229993641415577459396295899232815823975392974927395711568972974293925 +1722176361244419285779288543598751211392531919462574932268633933695192352441119172662173735119515712 +8259287379497359112197399192874789929899857534134534892997117372192299398799696792833998919968157692 +9113588331521199442922126152433321148852971919741151158559612459789766141191421226791434779238851542 +9934485995397918323116671821935121371411639119196141711221111598878781853442188129954293234742142941 +5863996738774189559631311914763988372133998564893667341114799688887419869498499571261945352924543659 +1219173111621632848325722799121771234351313226119137299611516914998734631224397849155891733316457236 +2581119126696683198948223933432829124786552193519396275241779267529656466959196852322344769712989425 +9967141179556989992264146994141761832265411668193157248414232474791714884711961318296968187812563731 +2489879759889926897312354996751186797873869898953112749555984922414591917338857833991412625172181498 +9389457158881973888911321813181681241492541783691881299169396894618761158125679495966134894392982199 +9619992269841241296891999961333629572281414928995452682633291959449286127129612124227252269791663654 +1614835267511194414153578263179929291589313129387133978158911722592272783869578732691311815861241491 +9652116592834327221168619761719533625339966299211384947128885411279177514867942937963481178919941711 +2933298721252991578245341817819977199267549571111491876711439883927615991991196211296294697272313774 +1431715794741427753127381461152185596778586461419451428969132784392522194651111917169662896769767812 +5919195742129923589897349316296264144952749521471522921641452152978765849165829872135669664214112327 +6339474432243943991959119983361889756918344251994119969825144749941178381321286493218961118191911875 +5517228343299391617317192214769719192189853799115811159493116197825637676714396432979816281155693495 +6388461935842284623142112416943162883259817194297799981283439458172297191119123521515932483495126961 +7843191912999868941538811232841971381689242136381989791436989848478992513449168132392761291119899184 +1424114349573937523917871789194999469999119751164761884221519813273935995996288159921682217898434989 diff --git a/15.jl b/15.jl new file mode 100644 index 0000000..5feee55 --- /dev/null +++ b/15.jl @@ -0,0 +1,63 @@ +include("utils.jl") + +function parse_input(filename) + map(x->parse.(Int, x), split.(non_empty_lines(filename), "")) +end + +function search(entry_risk) + width, height = size(entry_risk) + total_risk = fill(typemax(Int64), width, height) + total_risk[1, 1] = 0 + + to_visit = [(CartesianIndex(1,2), 0), (CartesianIndex(2,1), 0)] + while length(to_visit) > 0 + rounds += 1 + coord, cost = popfirst!(to_visit) + cost += entry_risk[coord] + if cost < total_risk[coord] + total_risk[coord] = cost + if coord[1] > 1 + push!(to_visit, (CartesianIndex(coord[1] - 1, coord[2]), cost)) + end + if coord[1] < width + push!(to_visit, (CartesianIndex(coord[1] + 1, coord[2]), cost)) + end + if coord[2] > 1 + push!(to_visit, (CartesianIndex(coord[1], coord[2] - 1), cost)) + end + if coord[2] < height + push!(to_visit, (CartesianIndex(coord[1], coord[2] + 1), cost)) + end + end + end + total_risk[width, height] +end + +function solution15_1() + entry_risk = parse_input("15.data") + width = length(entry_risk) + height = length(entry_risk[1]) + entry_risk = transpose(reshape(reduce(vcat, entry_risk), height, width)) + search(entry_risk) +end + +function solution15_2() + entry_risk = parse_input("15.data") + width = length(entry_risk) + height = length(entry_risk[1]) + entry_risk = map(entry_risk) do line + [line; + map(x->mod((x-1)+1, 9)+1, line); + map(x->mod((x-1)+2, 9)+1, line); + map(x->mod((x-1)+3, 9)+1, line); + map(x->mod((x-1)+4, 9)+1, line); + ] + end + for _ in 1:(4*height) + push!(entry_risk, map(x->mod((x-1)+1, 9)+1, entry_risk[length(entry_risk) - (height - 1)])) + end + entry_risk = transpose(reshape(reduce(vcat, entry_risk), height*5, width*5)) + search(entry_risk) +end + +solution15_2() diff --git a/15_ex.data b/15_ex.data new file mode 100644 index 0000000..ab80887 --- /dev/null +++ b/15_ex.data @@ -0,0 +1,10 @@ +1163751742 +1381373672 +2136511328 +3694931569 +7463417111 +1319128137 +1359912421 +3125421639 +1293138521 +2311944581 diff --git a/16.data b/16.data new file mode 100644 index 0000000..cba4dbe --- /dev/null +++ b/16.data @@ -0,0 +1 @@ +420D610055D273AF1630010092019207300B278BE5932551E703E608400C335003900AF0402905009923003880856201E95C00B60198D400B50034400E20101DC00E10024C00F1003C400B000212697140249D049F0F8952A8C6009780272D5D074B5741F3F37730056C0149658965E9AED7CA8401A5CC45BB801F0999FFFEEE0D67050C010C0036278A62D4D737F359993398027800BECFD8467E3109945C1008210C9C442690A6F719C48A351006E9359C1C5003E739087E80F27EC29A0030322BD2553983D272C67508E5C0804639D4BD004C401B8B918E3600021D1061D47A30053801C89EF2C4CCFF39204C53C212DABED04C015983A9766200ACE7F95C80D802B2F3499E5A700267838803029FC56203A009CE134C773A2D3005A77F4EDC6B401600043A35C56840200F4668A71580043D92D5A02535BAF7F9A89CF97C9F59A4F02C400C249A8CF1A49331004CDA00ACA46517E8732E8D2DB90F3005E92362194EF5E630CA5E5EEAD1803E200CC228E70700010A89D0BE3A08033146164177005A5AEEB1DA463BDC667600189C9F53A6FF6D6677954B27745CA00BCAE53A6EEDC60074C920001B93CFB05140289E8FA4812E071EE447218CBE1AA149008DBA00A497F9486262325FE521898BC9669B382015365715953C5FC01AA8002111721D4221007E13C448BA600B4F77F694CE6C01393519CE474D46009D802C00085C578A71E4001098F518639CC301802B400E7CDDF4B525C8E9CA2188032600E44B8F1094C0198CB16A29180351EA1DC3091F47A5CA0054C4234BDBC2F338A77B84F201232C01700042A0DC7A8A0200CC578B10A65A000601048B24B25C56995A30056C013927D927C91AB43005D127FDC610EF55273F76C96641002A4F0F8C01CCC579A8D68E52587F982996F537D600 diff --git a/16.jl b/16.jl new file mode 100644 index 0000000..6e98ecb --- /dev/null +++ b/16.jl @@ -0,0 +1,116 @@ +using Pkg +Pkg.add("Match") +using Match + +include("utils.jl") + +function parse_input(filename) + reverse(collect(collect(non_empty_lines(filename))[1])) +end + +mutable struct BinaryReader + input + rest + BinaryReader(input) = new(input, []) +end + +function fill_rest(reader) + char = pop!(reader.input) + code = codepoint(char) + number = code < 0x3A ? code - 0x30 : code - (0x41 - 10) + reader.rest = reverse(parse.(Int, collect(string(number, base=2, pad=4)))) +end + +function read_bits(reader, count) + result = [] + while length(result) < count + if length(reader.rest) == 0 + fill_rest(reader) + end + push!(result, pop!(reader.rest)) + end + result +end + +function reader_length(reader) + length(reader.rest) + length(reader.input) * 4 +end + +function to_int(bits) + parse(Int, reduce(*, string.(bits)), base=2) +end + +function parse_literal(reader, version) + result = [] + cont = 1 + while cont == 1 + cont = read_bits(reader, 1)[1] + result = [result; read_bits(reader, 4)] + end + (version, 4, to_int(result)) +end + +function parse_operator(reader, version, type) + length_type = read_bits(reader, 1)[1] + subpackets = [] + if length_type == 0 + subpacket_bits = to_int(read_bits(reader, 15)) + start_remaining = reader_length(reader) + while reader_length(reader) + subpacket_bits > start_remaining + push!(subpackets, parse_packet(reader)) + end + else + subpacket_count = to_int(read_bits(reader, 11)) + for _ in 1:subpacket_count + push!(subpackets, parse_packet(reader)) + end + end + (version, type, subpackets) +end + +function parse_packet(reader) + version = to_int(read_bits(reader, 3)) + type = to_int(read_bits(reader, 3)) + if type == 4 + parse_literal(reader, version) + else + parse_operator(reader, version, type) + end +end + +function sum_versions(packet) + result = packet[1] + if packet[2] != 4 + result += reduce(+, sum_versions.(packet[3])) + end + result +end + +function solution16_1() + input = parse_input("16.data") + reader = BinaryReader(input) + packet = parse_packet(reader) + sum_versions(packet) +end + +function value(packet) + @match packet[2] begin + 0 => reduce(+, value.(packet[3])) + 1 => reduce(*, value.(packet[3])) + 2 => reduce(min, value.(packet[3])) + 3 => reduce(max, value.(packet[3])) + 4 => packet[3] + 5 => value(packet[3][1]) > value(packet[3][2]) ? 1 : 0 + 6 => value(packet[3][1]) < value(packet[3][2]) ? 1 : 0 + 7 => value(packet[3][1]) == value(packet[3][2]) ? 1 : 0 + end +end + +function solution16_2() + input = parse_input("16.data") + reader = BinaryReader(input) + packet = parse_packet(reader) + value(packet) +end + +solution16_2() diff --git a/16_ex.data b/16_ex.data new file mode 100644 index 0000000..3f0eda1 --- /dev/null +++ b/16_ex.data @@ -0,0 +1 @@ +D2FE28 diff --git a/16_ex_2.data b/16_ex_2.data new file mode 100644 index 0000000..a7f8f25 --- /dev/null +++ b/16_ex_2.data @@ -0,0 +1 @@ +38006F45291200 diff --git a/16_ex_3.data b/16_ex_3.data new file mode 100644 index 0000000..f9893b9 --- /dev/null +++ b/16_ex_3.data @@ -0,0 +1,16 @@ +9C0141080250320F1802104A08 +9C005AC2F8F0 +F600BC2D8F +D8005AC2A8F0 +CE00C43D881120 +880086C3E88112 +04005AC33890 +C200B40A82 + + + +A0016C880162017C3686B18A3D4780 +C0015000016115A2E0802F182340 +620080001611562C8802118E34 +8A004A801A8002F478 +EE00D40C823060 diff --git a/17.data b/17.data new file mode 100644 index 0000000..d6d5bfd --- /dev/null +++ b/17.data @@ -0,0 +1 @@ +target area: x=153..199, y=-114..-75 diff --git a/17.jl b/17.jl new file mode 100644 index 0000000..a1eb181 --- /dev/null +++ b/17.jl @@ -0,0 +1,54 @@ +include("utils.jl") + +function parse_input(filename) + line = collect(non_empty_lines(filename))[1] + println(line) + map(x->parse(Int, x.match), eachmatch(r"-?[0-9]+", line)) +end + +function inverse_gauss(x) + sqrt(1/4 + 2 * x) - 1/2 +end + +function valid_x_velocities(left, right) + Int64(ceil(inverse_gauss(left))):Int64(floor(inverse_gauss(right))) +end + +function hitp(left, right, bottom, top, vel) + pos = [0, 0] + mpos = [0, 0] + velocity = copy(vel) + while pos[2] > bottom + pos += velocity + mpos = max(pos, mpos) + velocity[1] = velocity[1] > 0 ? velocity[1] - 1 : 0 + velocity[2] -= 1 + + if pos[1] >= left && pos[1] <= right && pos[2] >= bottom && pos[2] <= top + return true, mpos[2], vel + end + end + false, mpos[2], vel +end + +function solution17_1() + left, right, bottom, top = parse_input("17.data") + for vx in valid_x_velocities(left, right) + shots = map(v->hitp(left, right, bottom, top, v), [[vx, vy] for vy in 1:10000]) + hits = collect(Iterators.filter(x->x[1], shots)) + println(last(sort(hits, by=x->x[2]))) + end +end + +function solution17_2() + left, right, bottom, top = parse_input("17.data") + sum = 0 + for vx in 1:right + shots = map(v->hitp(left, right, bottom, top, v), [[vx, vy] for vy in bottom:1000]) + hits = collect(map(x->x[3], Iterators.filter(x->x[1], shots))) + sum += length(hits) + end + sum +end + +solution17_2() diff --git a/17_ex.data b/17_ex.data new file mode 100644 index 0000000..a07e02d --- /dev/null +++ b/17_ex.data @@ -0,0 +1 @@ +target area: x=20..30, y=-10..-5 diff --git a/18.data b/18.data new file mode 100644 index 0000000..0e53f1b --- /dev/null +++ b/18.data @@ -0,0 +1,100 @@ +[[[[8,1],8],[[8,1],0]],[[8,[2,4]],[0,8]]] +[[[[2,2],[7,4]],[[9,1],6]],8] +[[[3,6],[[8,7],[2,9]]],[8,[[2,3],9]]] +[[[[4,5],[1,4]],1],[[0,8],[2,[6,8]]]] +[[7,[[4,6],[0,0]]],[[4,3],5]] +[[[[8,4],4],[[4,4],[1,0]]],[[5,[5,5]],[[5,2],1]]] +[[[0,[5,8]],[1,7]],[[[5,0],[1,3]],7]] +[4,[[[6,2],[7,8]],[0,[4,4]]]] +[[[3,[5,3]],8],[[[6,8],4],[8,9]]] +[[[6,0],[9,[8,1]]],[[[9,7],3],0]] +[[9,[[9,3],[0,8]]],[[[5,3],0],[[5,6],2]]] +[[3,[[7,7],3]],[[7,[5,2]],[[6,9],0]]] +[1,[4,[3,8]]] +[[[[0,2],9],[[0,7],8]],[[5,4],[2,8]]] +[[[[1,8],9],[1,7]],[[4,[8,5]],[[6,3],[1,0]]]] +[[9,[[4,3],[3,3]]],[[[4,9],[0,9]],6]] +[7,[[8,0],[5,6]]] +[[[[3,2],1],[[4,9],6]],[[9,[1,1]],[[8,7],1]]] +[[[[5,1],[3,3]],0],[1,[[3,2],2]]] +[[7,9],[[9,9],[5,[9,5]]]] +[[[[4,3],[1,7]],[4,[9,2]]],[[6,[1,7]],[[8,0],3]]] +[[[5,[2,8]],[[1,2],7]],[[3,[0,5]],[[3,5],8]]] +[[[[2,2],6],[[2,1],7]],[[[4,6],8],7]] +[[2,[[3,0],[0,5]]],[[[3,4],[0,1]],0]] +[[[[9,9],5],[[9,9],6]],[[[4,1],2],0]] +[4,[[2,9],[6,2]]] +[[[8,6],6],7] +[[7,[8,2]],[[[5,5],6],[9,0]]] +[5,[[2,5],[[4,9],[8,6]]]] +[[4,[7,[9,6]]],7] +[[[9,[3,3]],[[3,1],[8,7]]],[[6,[3,5]],[4,1]]] +[[8,6],[8,[[0,2],[8,1]]]] +[6,[8,[[7,7],0]]] +[3,4] +[[9,[8,0]],[[[7,8],3],1]] +[5,[[3,[8,7]],[[5,0],[9,7]]]] +[[[[4,2],9],[6,[0,2]]],6] +[[4,[3,[4,9]]],[[4,[1,6]],1]] +[[[6,3],[8,8]],[5,[[9,3],[6,3]]]] +[[[9,9],[[7,1],6]],[[[1,0],[7,4]],[3,[2,0]]]] +[[[[2,5],9],[3,[6,2]]],[4,7]] +[[1,[7,8]],[[[0,1],8],[[1,1],9]]] +[[[9,[6,4]],[[9,8],[0,2]]],[[[8,9],[2,3]],[3,[8,0]]]] +[[[[6,8],2],3],[[2,2],5]] +[[[4,[8,5]],[[4,3],1]],[[[2,4],[4,4]],[[4,1],[1,7]]]] +[[[[2,6],6],[[9,2],4]],[[[9,9],[9,5]],5]] +[[[[7,5],[4,9]],4],[[[0,7],[3,6]],[[6,5],[3,0]]]] +[[[4,4],[[5,7],[8,5]]],[0,8]] +[[3,[[1,3],[7,5]]],[6,[[8,1],0]]] +[[[9,9],[5,[9,6]]],[[[4,0],[5,4]],6]] +[0,[[[9,2],4],3]] +[[[1,[8,5]],[0,[6,0]]],[[[6,5],[3,1]],[[6,2],[1,5]]]] +[[[4,0],[4,7]],6] +[1,[[[5,2],9],[[3,9],4]]] +[[[[9,6],[4,1]],4],[2,[[0,2],6]]] +[9,[[[1,5],[3,1]],1]] +[5,0] +[9,[[[7,5],[2,1]],[[2,3],[5,3]]]] +[[5,[[0,5],[9,5]]],[[[2,7],3],[[2,9],[3,5]]]] +[[[1,9],2],[[7,[1,7]],[8,[9,8]]]] +[[8,9],[[5,[9,0]],[[6,8],[5,2]]]] +[6,[[[1,3],[0,8]],4]] +[[[[9,8],[0,9]],[[8,4],[3,5]]],[[[5,0],8],[[6,8],1]]] +[[6,[[1,4],[7,0]]],[[3,4],[[2,1],[2,7]]]] +[[[5,0],[3,[4,7]]],[[9,3],[[9,4],[9,6]]]] +[[[[8,3],[8,0]],5],[[[5,5],[0,2]],[[0,1],9]]] +[[[[6,4],[1,8]],[3,[0,2]]],[8,[[8,8],5]]] +[2,[[2,1],[1,4]]] +[8,[0,[3,5]]] +[[[[0,2],3],[[4,9],[1,2]]],[[8,2],[6,[7,1]]]] +[[[0,0],9],1] +[8,[[4,1],[[1,3],9]]] +[[[8,[5,9]],9],[[[5,7],[9,0]],3]] +[[5,[2,9]],7] +[5,6] +[[[[7,5],[8,3]],[[4,3],8]],[[2,2],[[7,2],[4,2]]]] +[[[9,5],[3,[1,5]]],6] +[[[[7,4],[7,9]],[[3,1],[3,1]]],[[[6,4],[0,1]],1]] +[[3,[[7,4],9]],[[[5,8],[2,7]],[[0,4],[3,6]]]] +[[[3,[2,3]],[[6,0],[7,7]]],1] +[[2,[[8,8],[2,3]]],[5,2]] +[[[0,[5,5]],[8,1]],5] +[[3,9],[6,[[0,5],[1,7]]]] +[[[[3,0],9],[8,2]],[[[2,2],8],0]] +[[[9,6],[[5,1],[4,9]]],[[[1,1],[0,3]],[[4,9],[7,5]]]] +[[[2,[6,1]],[[5,7],[9,2]]],[[[4,2],8],9]] +[[9,[7,1]],[[4,5],[9,1]]] +[[9,[5,0]],[[1,7],[[9,6],[4,5]]]] +[[[[1,1],[8,7]],4],[[0,4],[[1,7],[3,5]]]] +[[5,[1,[8,4]]],[[[9,4],0],[1,[5,5]]]] +[[[5,[1,6]],[6,0]],[[0,[9,7]],1]] +[2,[9,[[0,3],[2,3]]]] +[3,[4,[[0,9],8]]] +[[5,6],[[[9,9],[4,0]],[7,[2,0]]]] +[[[[5,1],6],[[1,0],[7,1]]],[[6,[1,0]],[[4,2],[0,0]]]] +[[[4,[0,2]],6],[[[4,3],[8,0]],[[9,6],[1,5]]]] +[[[[5,3],[2,2]],[8,[8,3]]],[[9,1],2]] +[[3,4],[[[4,7],[2,3]],[9,[9,0]]]] +[[[5,[6,2]],[[1,5],[9,2]]],[[[7,9],3],[[6,7],[6,2]]]] +[[[5,3],9],[[2,[4,3]],[[5,3],1]]] diff --git a/18.jl b/18.jl new file mode 100644 index 0000000..6748445 --- /dev/null +++ b/18.jl @@ -0,0 +1,135 @@ +include("utils.jl") + +function parse_value(line, index) + if line[index] == '[' + parse_tuple(line, index) + else + digits = match(r"^[0-9]+", SubString(line, index)).match + index += length(digits) + parse(Int, digits), index + end +end + +function parse_tuple(line, index=1) + @assert line[index] == '[' + index += 1 + + first, index = parse_value(line, index) + + @assert line[index] == ',' + index += 1 + + second, index = parse_value(line, index) + + @assert line[index] == ']' + index +=1 + + return Any[first, second], index +end + +function parse_input(filename) + map(x->x[1], map(parse_tuple, non_empty_lines(filename))) +end + +function split_sf(a) + if typeof(a) == Int64 + if a > 9 + Any[div(a,2),div(a,2)+rem(a,2)], true + else + a, false + end + else + l, changed = split_sf(a[1]) + a[1] = l + if changed + a, true + else + r, changed = split_sf(a[2]) + a[2] = r + a, changed + end + end +end + +function add_left_sf(a, number) + if typeof(a) == Int64 + a + number + else + a[1] = add_left_sf(a[1], number) + a + end +end + +function add_right_sf(a, number) + if typeof(a) == Int64 + a + number + else + a[2] = add_right_sf(a[2], number) + a + end +end + +function explode_sf(a, level=1) + if typeof(a) == Int64 + return a, false, 0, 0 + end + if level == 5 + @assert typeof(a[1]) == Int64 && typeof(a[2]) == Int64 + 0, true, a[1], a[2] + else + l, changed, to_left, to_right = explode_sf(a[1], level + 1) + if changed + Any[l, add_left_sf(a[2], to_right)], true, to_left, 0 + else + r, changed, to_left, to_right = explode_sf(a[2], level + 1) + if changed + Any[add_right_sf(l, to_left), r], true, 0, to_right + else + a, false, 0, 0 + end + end + end +end + +function reduce_sf(a) + changed = true + while changed + a, changed = explode_sf(a) + if changed + continue + end + a, changed = split_sf(a) + end + a +end + +function add_sf(a, b) + reduce_sf(Any[deepcopy(a), deepcopy(b)]) +end + +function mag_sf(a) + if typeof(a) == Int64 + a + else + 3 * mag_sf(a[1]) + 2 * mag_sf(a[2]) + end +end + +function solution18_1() + mag_sf(reduce(add_sf, parse_input("18.data"))) +end + +function solution18_2() + input = collect(parse_input("18.data")) + max_mag = 0 + for a in input + for b in input + print('.') + max_mag = max(max_mag, mag_sf(add_sf(a, b))) + end + end + println("") + max_mag +end + +solution18_2() diff --git a/18_ex.data b/18_ex.data new file mode 100644 index 0000000..1368dc4 --- /dev/null +++ b/18_ex.data @@ -0,0 +1,10 @@ +[[[0,[5,8]],[[1,7],[9,6]]],[[4,[1,2]],[[1,4],2]]] +[[[5,[2,8]],4],[5,[[9,9],0]]] +[6,[[[6,2],[5,6]],[[7,6],[4,7]]]] +[[[6,[0,7]],[0,9]],[4,[9,[9,0]]]] +[[[7,[6,4]],[3,[1,3]]],[[[5,5],1],9]] +[[6,[[7,3],[3,2]]],[[[3,8],[5,7]],4]] +[[[[5,4],[7,7]],8],[[8,3],8]] +[[9,3],[[9,9],[6,[4,9]]]] +[[2,[[7,7],7]],[[5,8],[[9,3],[0,2]]]] +[[[[5,2],5],[8,[3,7]]],[[5,[7,5]],[4,4]]] diff --git a/19.data b/19.data new file mode 100644 index 0000000..6a45b66 --- /dev/null +++ b/19.data @@ -0,0 +1,1023 @@ +--- scanner 0 --- +-535,-526,-765 +627,-311,420 +-587,-471,242 +581,-596,-710 +-602,794,452 +-716,825,-607 +487,760,-636 +-620,-456,271 +-37,-16,-1 +-647,-543,-606 +608,-713,-821 +-657,903,537 +-667,-557,-727 +670,-310,354 +-672,-675,243 +536,888,514 +549,-605,-861 +644,831,538 +599,-378,391 +-641,962,-643 +133,68,-113 +516,800,-553 +582,762,538 +-710,842,-633 +568,907,-594 +-549,867,508 + +--- scanner 1 --- +456,-531,375 +-576,842,-474 +610,385,-866 +-834,-556,-713 +-643,671,-468 +-762,-584,448 +682,-362,-794 +-514,568,445 +646,585,578 +-886,-519,461 +459,-646,390 +-719,819,-521 +517,-589,317 +499,-382,-859 +-760,-651,-763 +-103,-42,-119 +660,530,565 +461,449,-781 +-524,564,727 +446,497,576 +-800,-587,481 +456,358,-860 +-18,68,-9 +609,-398,-871 +-796,-580,-574 +-490,612,654 + +--- scanner 2 --- +472,403,682 +241,-583,724 +-675,357,-564 +-669,378,521 +-613,451,574 +-608,-750,432 +676,-520,-952 +-699,483,-610 +-422,-411,-781 +482,283,613 +-412,-354,-725 +619,-461,-890 +-602,-745,585 +392,445,-544 +803,-486,-963 +-698,342,629 +-124,40,-32 +446,420,688 +322,-564,719 +-436,-449,-565 +433,338,-596 +-699,414,-672 +300,-486,706 +-621,-681,516 +475,485,-515 +-14,-81,-129 + +--- scanner 3 --- +-657,-678,460 +509,-860,-656 +-401,-632,-610 +-549,-710,546 +767,-464,771 +379,775,-813 +387,525,-780 +730,-541,714 +468,458,866 +418,-783,-546 +-620,-759,379 +475,395,803 +-25,-35,83 +-295,834,-674 +-432,724,517 +-463,-611,-487 +-435,766,-751 +449,558,765 +-549,-554,-589 +-417,648,492 +377,-823,-696 +507,642,-807 +-313,727,-816 +787,-458,664 +-313,582,508 + +--- scanner 4 --- +-975,452,-498 +317,632,-820 +-738,-476,296 +-939,-527,-429 +458,519,739 +774,-515,-893 +817,-715,-874 +476,-731,558 +-690,-442,369 +-772,708,458 +-960,-659,-463 +529,-804,502 +-934,341,-453 +-805,494,447 +491,534,768 +406,738,767 +-859,-576,-415 +-799,399,-512 +649,-645,-891 +-93,-61,-123 +-717,694,445 +421,-840,473 +442,716,-804 +247,701,-785 +-734,-466,578 + +--- scanner 5 --- +127,-40,150 +-499,-631,677 +40,38,-15 +760,726,921 +-502,593,-452 +-386,-724,-812 +-270,-650,-808 +-522,-542,641 +543,730,-676 +-563,557,445 +-407,666,-490 +821,704,899 +720,-655,821 +-453,747,-389 +428,-372,-780 +-577,-635,515 +827,-770,759 +-723,466,458 +926,674,906 +594,666,-556 +497,-402,-766 +-320,-660,-679 +551,721,-473 +849,-608,823 +597,-415,-726 +-629,444,411 + +--- scanner 6 --- +-448,-863,770 +507,-372,-525 +679,509,-466 +658,447,-589 +832,-741,685 +736,595,-568 +-710,-496,-403 +-452,538,-624 +612,703,481 +-847,-455,-418 +-388,855,950 +580,595,567 +-607,-841,733 +-552,819,958 +430,-463,-635 +-40,-27,141 +-588,-892,644 +-420,592,-641 +-372,551,-688 +-522,862,841 +467,-331,-675 +-849,-493,-544 +826,-721,792 +749,-684,735 +531,666,400 + +--- scanner 7 --- +-736,638,-635 +694,-874,-538 +694,-419,546 +-565,-925,650 +572,740,-916 +792,601,779 +669,722,-857 +810,526,860 +782,447,753 +-50,-145,6 +-730,584,747 +635,-936,-481 +591,735,-835 +735,-419,458 +-664,-884,742 +-557,-911,759 +-733,655,-704 +-773,717,679 +-762,693,713 +-756,-697,-643 +-719,679,-456 +669,-947,-354 +-705,-617,-569 +691,-538,591 +-179,-24,-80 +-870,-714,-576 + +--- scanner 8 --- +620,-611,-583 +-57,-86,-120 +-826,-510,-686 +-776,-492,-631 +713,447,404 +671,372,486 +-544,426,566 +-433,238,-835 +685,379,476 +379,-699,509 +614,-764,-578 +400,-720,386 +601,-680,-647 +-419,270,-589 +-768,-432,384 +-551,551,633 +446,245,-440 +-841,-424,512 +-809,-603,428 +436,-737,464 +-411,284,-621 +-584,489,641 +413,339,-416 +-705,-569,-775 +353,409,-409 + +--- scanner 9 --- +547,349,-654 +824,-472,701 +-644,-834,480 +809,716,519 +-657,-723,492 +-368,881,791 +-757,-828,553 +940,-594,-817 +854,-528,544 +944,-520,-701 +-733,471,-569 +-509,-702,-565 +-727,491,-676 +71,-90,48 +-545,-613,-588 +706,371,-617 +-28,48,-23 +-408,840,641 +743,-462,627 +-331,749,751 +948,719,660 +687,320,-528 +-650,528,-619 +-383,-609,-510 +946,757,534 +811,-584,-767 + +--- scanner 10 --- +-740,-619,-757 +403,-769,757 +651,553,-583 +-125,59,140 +-578,545,406 +-465,625,-703 +-628,644,-782 +654,341,-562 +487,-428,-512 +-40,-61,-33 +-748,-493,739 +-499,661,-640 +-911,-686,-751 +645,426,727 +677,498,-548 +511,-466,-651 +336,-729,685 +-608,557,412 +653,378,774 +582,-502,-462 +-757,-562,529 +486,393,676 +-888,-543,-704 +379,-820,642 +-631,498,517 +-867,-568,638 + +--- scanner 11 --- +941,-739,560 +613,-873,-755 +-250,-778,413 +-277,-898,530 +-617,-592,-566 +597,670,-558 +-244,-906,280 +883,396,403 +912,-761,655 +54,-124,-23 +472,686,-642 +646,-902,-740 +110,5,-184 +402,651,-573 +-779,319,-933 +-646,526,630 +-650,-581,-780 +917,425,593 +823,-838,557 +783,381,524 +-486,459,559 +-533,539,567 +-562,-579,-580 +-820,364,-822 +-644,378,-875 +561,-901,-536 + +--- scanner 12 --- +-617,543,-421 +348,-946,-566 +-411,-724,-749 +369,-370,450 +314,-925,-698 +300,-845,-649 +-693,-720,-759 +762,378,599 +-678,632,707 +-684,479,702 +355,-402,696 +-673,490,-494 +-477,-471,869 +776,663,-580 +-588,435,-385 +-510,-377,845 +-417,-541,876 +712,360,654 +759,831,-510 +19,-107,5 +-665,548,638 +347,-416,664 +-484,-676,-783 +641,437,510 +778,788,-710 + +--- scanner 13 --- +344,570,524 +-490,680,714 +675,-434,-443 +-49,81,-108 +576,634,-664 +-591,726,633 +-457,-579,572 +782,-713,570 +-553,631,560 +-712,-581,-815 +-909,863,-683 +414,556,-668 +540,611,-575 +-913,747,-757 +-456,-644,605 +-793,-655,-805 +788,-507,-449 +786,-788,478 +310,504,411 +688,-446,-554 +822,-819,444 +357,410,433 +-332,-642,591 +-823,-498,-749 +-780,813,-693 + +--- scanner 14 --- +554,-398,907 +671,-408,753 +-333,-662,-757 +-736,552,-517 +452,548,525 +67,-58,-46 +928,-620,-737 +-700,-536,623 +479,546,480 +-656,440,-493 +-832,425,-490 +-523,-525,720 +33,31,142 +-522,311,899 +491,423,-475 +-300,-588,-695 +886,-662,-691 +-416,-622,-728 +596,-327,784 +612,455,-346 +-466,311,914 +-621,403,945 +618,455,-410 +539,549,709 +929,-582,-577 +-748,-528,776 + +--- scanner 15 --- +-106,-70,-82 +536,766,563 +-657,-414,-441 +-485,-506,629 +602,-683,-537 +-840,-394,-506 +638,-612,-726 +-614,326,-440 +542,656,454 +-562,-419,613 +-767,-430,-429 +-29,61,72 +284,-480,567 +-587,373,372 +335,-504,682 +-537,335,449 +-768,353,-434 +-619,417,-519 +676,-588,-587 +611,647,664 +561,787,-779 +-574,361,570 +-519,-489,467 +485,639,-832 +375,-437,610 +418,810,-826 + +--- scanner 16 --- +-692,744,489 +681,-914,-807 +-593,301,-664 +639,714,439 +541,-677,704 +602,729,416 +17,40,88 +-472,359,-689 +853,461,-634 +75,-15,-101 +-629,420,-644 +-451,-910,-849 +602,-775,583 +848,713,-628 +-522,-858,-759 +544,-839,-732 +-630,797,487 +922,614,-642 +676,-827,-655 +430,660,412 +-558,663,467 +-554,-778,-811 +-624,-567,756 +-439,-590,780 +425,-687,585 +-506,-576,593 + +--- scanner 17 --- +808,370,854 +605,-787,565 +-650,-572,-403 +579,220,-540 +710,421,840 +738,366,835 +607,-811,385 +-659,559,475 +668,271,-521 +-657,720,493 +-37,-152,-57 +818,-684,-416 +868,-694,-287 +705,249,-680 +-468,616,-418 +-304,-687,460 +94,-16,67 +-493,-628,-373 +-644,577,504 +-576,-562,-484 +-609,619,-279 +-327,-648,502 +-346,-708,355 +752,-620,-283 +508,-756,512 +-483,657,-281 + +--- scanner 18 --- +734,-473,878 +729,-454,797 +-606,900,-657 +-505,595,644 +-942,-410,443 +-880,-351,500 +623,393,637 +-953,-376,316 +669,732,-429 +-45,-25,-101 +441,-263,-791 +-534,555,727 +-551,933,-481 +698,530,673 +716,-376,819 +692,513,647 +595,-253,-817 +-638,808,-535 +-425,-310,-496 +665,877,-400 +661,647,-389 +-544,-354,-629 +-425,-351,-584 +520,-235,-898 +-586,448,686 +-155,166,46 + +--- scanner 19 --- +846,-264,-485 +739,-282,-343 +-538,-550,380 +-811,408,-463 +673,-492,417 +709,-424,414 +-60,18,59 +412,555,810 +537,418,-379 +-618,-400,414 +-848,540,-503 +-922,556,359 +723,-341,333 +-921,489,366 +787,410,-346 +-542,-518,-570 +36,179,-36 +-620,-370,-549 +-771,449,-613 +778,-404,-408 +510,478,721 +-728,-531,397 +-848,495,339 +654,538,-352 +-599,-432,-672 +507,577,839 + +--- scanner 20 --- +-558,-529,-663 +-613,-622,-537 +-646,-486,588 +571,-486,633 +-718,889,703 +-77,128,142 +854,831,787 +-617,551,-313 +432,-754,-402 +-636,-533,-501 +743,961,-678 +505,-748,-289 +-819,870,603 +444,-643,-389 +69,47,57 +-746,-373,605 +827,951,670 +593,920,-638 +-724,571,-319 +458,-473,570 +-667,608,-396 +618,-406,641 +703,829,-715 +860,959,920 +-756,863,540 +-659,-382,592 + +--- scanner 21 --- +387,619,594 +735,-823,544 +-642,-643,460 +-687,-637,496 +-746,-450,-504 +-722,609,572 +631,-786,-428 +-779,-449,-439 +-53,-92,180 +380,695,-637 +-618,829,-264 +575,-816,-585 +370,616,526 +-652,793,-295 +-765,-325,-441 +492,750,535 +673,-686,483 +269,682,-649 +275,795,-576 +-669,713,484 +-813,716,484 +-784,-537,413 +-167,47,127 +641,-705,-502 +-744,789,-370 +653,-891,462 + +--- scanner 22 --- +499,-702,-536 +448,-565,823 +-255,-512,865 +685,458,-611 +116,-180,41 +-380,-392,882 +-672,-785,-539 +-529,531,478 +733,542,-633 +409,698,515 +488,-748,-343 +-478,766,-541 +670,451,-622 +4,-3,10 +513,-716,-316 +-379,692,-555 +574,-509,911 +515,635,637 +-484,-484,843 +-733,-628,-494 +440,689,617 +-791,-749,-519 +-466,600,560 +-631,697,-549 +-426,602,514 +503,-575,770 + +--- scanner 23 --- +284,396,482 +-929,-746,-731 +491,-507,481 +259,-796,-632 +793,537,-400 +-64,-180,-124 +-787,-875,-748 +265,-766,-644 +-155,17,-183 +-898,-463,599 +370,-743,-585 +-778,359,365 +-983,323,-638 +686,616,-428 +-902,328,-619 +712,462,-418 +-752,365,348 +-851,-486,456 +-904,-634,532 +324,388,567 +295,392,712 +592,-626,406 +-742,434,228 +382,-617,475 +-850,-909,-712 +-924,341,-541 + +--- scanner 24 --- +-718,-571,-517 +404,564,-561 +842,-505,-829 +650,-521,-862 +-763,-696,548 +471,-506,521 +-805,519,-708 +-881,595,424 +631,614,691 +-70,-16,-109 +-746,-532,-449 +418,-609,642 +739,555,651 +-778,-535,-576 +-862,627,-684 +-734,676,466 +384,-555,671 +-736,581,-708 +337,536,-590 +-774,647,383 +-748,-690,536 +622,582,540 +336,493,-524 +772,-445,-881 +-858,-732,520 + +--- scanner 25 --- +861,766,536 +749,-623,-421 +620,-665,806 +861,751,592 +717,-558,-548 +-521,-827,-460 +-890,-713,637 +-621,-726,-420 +-438,292,-490 +-921,-546,657 +-582,446,673 +747,-638,902 +-458,-623,-445 +-812,-609,620 +769,797,691 +13,-105,-52 +732,-641,726 +-427,345,-591 +626,332,-409 +717,-494,-542 +-618,523,506 +-567,512,691 +624,377,-382 +623,561,-469 +-594,345,-473 + +--- scanner 26 --- +-814,603,-395 +392,-526,908 +554,471,-570 +469,363,917 +479,-608,-454 +-756,-741,596 +-681,-640,477 +623,357,890 +-78,-73,73 +-706,702,456 +474,442,826 +566,-553,-506 +-680,-433,-426 +-563,749,433 +-687,-531,587 +-450,-444,-422 +506,-578,-362 +442,-449,870 +-595,-473,-418 +571,630,-458 +585,509,-438 +-797,629,-389 +-630,755,604 +429,-647,882 +-934,593,-464 + +--- scanner 27 --- +562,-872,-449 +-705,-666,-777 +-544,475,-752 +455,323,-568 +-667,-400,561 +-613,485,-872 +-719,607,616 +-99,-152,23 +596,-710,735 +-652,-610,-704 +-582,-401,765 +-587,569,647 +677,636,536 +-607,448,633 +629,-721,521 +541,-723,721 +-538,449,-735 +741,721,685 +558,-590,-439 +514,-799,-415 +-597,-695,-813 +-10,11,-72 +284,329,-501 +768,715,531 +-634,-429,546 +307,376,-644 + +--- scanner 28 --- +813,-729,560 +-696,-708,-638 +-757,-610,-517 +-828,599,563 +-659,781,-782 +591,865,-339 +492,911,-431 +-755,541,506 +780,-791,634 +-684,-804,633 +697,-762,594 +-52,47,13 +377,-551,-580 +-868,727,-809 +-697,-680,568 +457,-527,-468 +281,-524,-453 +-873,-620,-636 +647,880,-339 +-696,796,-805 +-770,538,621 +590,686,497 +-664,-718,565 +413,589,508 +365,742,500 + +--- scanner 29 --- +-826,-688,686 +661,-934,-381 +-838,-820,763 +462,-511,665 +714,-516,659 +845,426,-759 +-617,311,-610 +494,444,592 +-49,9,15 +-498,460,931 +-913,-683,838 +715,-725,-408 +-774,-762,-552 +-665,480,900 +-590,215,-737 +615,-442,673 +571,611,628 +799,525,-851 +814,581,-851 +560,426,577 +-686,-939,-554 +-676,-823,-673 +-561,497,822 +-593,391,-722 +730,-762,-385 + +--- scanner 30 --- +544,-423,-876 +-959,884,454 +17,108,-84 +-491,-610,-356 +471,-348,621 +599,575,849 +505,483,-812 +-934,735,-411 +-795,915,361 +510,-390,-760 +470,-361,-843 +416,505,-918 +-865,908,421 +-616,-720,637 +-966,489,-425 +539,-434,601 +-660,-744,428 +636,498,839 +-920,703,-403 +-121,-6,7 +638,573,817 +-390,-527,-404 +-411,-659,-370 +633,516,-910 +536,-472,634 +-612,-710,355 + +--- scanner 31 --- +-447,-404,-548 +587,588,-619 +492,-479,-265 +559,367,-664 +538,-793,480 +-816,263,-631 +519,448,882 +643,520,-654 +-29,-89,40 +565,-682,597 +-717,266,-452 +-523,-663,748 +-538,720,569 +-626,-784,801 +-175,-142,156 +-704,-422,-545 +547,419,815 +-522,687,377 +-462,739,447 +-770,295,-525 +-569,-473,-591 +376,-643,-255 +403,-534,-228 +597,-833,588 +476,382,883 +-572,-813,835 + +--- scanner 32 --- +-334,-684,-605 +853,429,455 +-330,522,-519 +428,-660,-348 +768,578,519 +-388,583,-461 +-403,580,-576 +-272,-717,940 +846,540,-312 +428,-515,976 +-24,-83,10 +858,430,-328 +163,-155,143 +547,-518,-357 +-353,-784,-706 +532,-594,-332 +847,583,428 +550,-476,911 +-264,-467,973 +-578,379,600 +410,-408,834 +-360,-847,-643 +-589,593,567 +-392,-600,967 +-591,393,655 +781,357,-292 + +--- scanner 33 --- +-538,-478,-649 +-558,678,-597 +864,-661,842 +938,-647,743 +-506,-530,-729 +692,-634,-698 +-456,-600,488 +-340,759,966 +703,372,692 +-622,578,-624 +95,-76,122 +774,408,795 +-312,737,737 +869,-655,590 +560,-557,-710 +-648,689,-616 +-435,-440,-781 +-577,-625,430 +-613,-645,549 +772,454,755 +636,323,-375 +705,478,-371 +705,379,-257 +697,-482,-785 +-220,776,841 + +--- scanner 34 --- +-319,-366,692 +-673,-708,-703 +-462,-377,679 +816,-624,-462 +-382,408,518 +398,-442,790 +-819,667,-544 +111,179,111 +862,-691,-399 +-790,807,-670 +949,-670,-361 +421,-428,872 +18,45,-75 +-420,406,644 +-669,-727,-773 +665,835,741 +611,803,724 +496,-454,779 +892,703,-858 +624,883,788 +935,733,-741 +-480,-348,694 +-423,545,503 +-768,648,-633 +-618,-713,-675 +928,867,-850 + +--- scanner 35 --- +-515,-659,738 +366,-600,566 +-614,410,609 +-712,799,-745 +-483,427,719 +-654,840,-659 +-722,673,-635 +412,352,489 +682,511,-441 +581,594,-404 +457,-490,489 +487,-581,-790 +473,372,415 +-598,-484,-361 +-453,-536,717 +-633,393,799 +-601,-557,795 +-544,-501,-393 +406,379,416 +325,-450,526 +449,-707,-788 +-557,-437,-313 +25,-95,180 +692,713,-356 +490,-722,-651 +-1,86,40 + +--- scanner 36 --- +620,426,-526 +777,-583,514 +901,-648,527 +-13,59,-94 +118,-48,53 +-484,-785,-793 +-699,790,515 +606,613,-593 +811,-587,-508 +-444,-521,456 +-594,-769,-805 +-630,794,343 +-684,767,552 +-667,-805,-728 +-441,-636,441 +815,-580,547 +849,-611,-647 +-633,739,-645 +597,450,-711 +-502,-578,383 +805,623,515 +775,-516,-697 +-714,717,-779 +-767,719,-717 +707,502,454 +717,621,338 diff --git a/19.jl b/19.jl new file mode 100644 index 0000000..a9119eb --- /dev/null +++ b/19.jl @@ -0,0 +1,140 @@ +include("utils.jl") + +function parse_input(filename) + scanners = [] + current = [] + for line in non_empty_lines(filename) + if line[1] == '-' && line[2] == '-' + push!(scanners, current) + current = [] + else + coord = collect(map(m->parse(Int, m.match), eachmatch(r"-?[0-9]+", line))) + push!(current, coord) + end + end + push!(scanners, current) + scanners[2:length(scanners)] +end + +transforms = [ + # up: z + a -> a, + a -> [-a[2], a[1], a[3]], + a -> [-a[1], -a[2], a[3]], + a -> [a[2], -a[1], a[3]], + # up: -z + a -> [-a[1], a[2], -a[3]], + a -> [a[2], a[1], -a[3]], + a -> [a[1], -a[2], -a[3]], + a -> [-a[2], -a[1], -a[3]], + # up: x + a -> [-a[3], a[2], a[1]], + a -> [a[2], a[3], a[1]], + a -> [a[3], -a[2], a[1]], + a -> [-a[2], -a[3], a[1]], + # up: -x + a -> [a[3], a[2], -a[1]], + a -> [-a[2], a[3], -a[1]], + a -> [-a[3], -a[2], -a[1]], + a -> [a[2], -a[3], -a[1]], + # up: y + a -> [a[1], -a[3], a[2]], + a -> [-a[3], -a[1], a[2]], + a -> [-a[1], a[3], a[2]], + a -> [a[3], a[1], a[2]], + # up: -y + a -> [a[1], a[3], -a[2]], + a -> [-a[3], a[1], -a[2]], + a -> [-a[1], -a[3], -a[2]], + a -> [a[3], -a[1], -a[2]], +] + +function try_match(a, b) + for c in a + for d in b + t = c - d + if length(intersect(a, map(x->x+t, b))) > 11 + println("pos $t") + #println(intersect(a, map(x->x+t, b))) + return true, collect(map(x->x+t, b)) + end + end + end + false, nothing +end + +function find_match(fixed, scanners) + for (f,j) in fixed + for i in 1:length(scanners) + s,k = scanners[i] + for t in transforms + td = collect(map(t, s)) + matchp, transformed = try_match(f, td) + if matchp + println("f: $(j-1) s: $(k-1) ✓") + return i, transformed + end + end +# println("f: $(j-1) s: $(k-1) x") + end + end +end + +function solution19_1() + scanners = collect(parse_input("19.data")) + zipped = collect(zip(scanners, 1:length(scanners))) + fixed = [popfirst!(zipped)] + while length(zipped) > 0 + index, transformed = find_match(fixed, zipped) + s = popat!(zipped, index) +# println(s[1]) +# println(transformed) + push!(fixed, (transformed, s[2])) + l = length(fixed) + println("located $l") + end + length(reduce(union, map(x->x[1], fixed))) +end + +function solution19_2() + positions = [[0, 0, 0], + [-28, 1245, -161], + [1163, 26, -170], + [-1254, 90, -158], + [-18, 1355, -1280], + [1146, -1193, -28], + [-2380, 15, -13], + [-1078, 63, 1010], + [-1105, 28, -1236], + [-12, 2400, -1318], + [-1075, 1190, -1385], + [-2348, 173, -1313], + [-2450, -1024, -26], + [-3547, 0, -79], + [-1233, -1211, 1144], + [-1092, 1288, 1125], + [-2449, 1277, -1238], + [-2290, -2266, -141], + [-4753, 30, -166], + [-3532, 97, 1132], + [-1224, 2573, 1061], + [-2428, 1249, 1069], + [-2269, -3556, -95], + [-1131, -2278, -172], + [-2337, -2411, 1197], + [-4722, 31, 1198], + [-6042, 159, -182], + [-3560, 131, 2245], + [-2385, -3457, 1117], + [-2369, -4811, -22], + [-1144, -3615, -89], + [-4732, -17, 2315], + [-5936, -1062, -10], + [-2339, -3488, 2394], + [-2334, -4684, 1017], + [-3472, -3589, 2361], + [-1256, -3495, 2220]] + reduce(max, map(a->sum(abs.(a)), map(a->a[1]-a[2], [(a,b) for a in positions for b in positions]))) +end + +solution19_2() diff --git a/19_ex.data b/19_ex.data new file mode 100644 index 0000000..4e496e9 --- /dev/null +++ b/19_ex.data @@ -0,0 +1,136 @@ +--- scanner 0 --- +404,-588,-901 +528,-643,409 +-838,591,734 +390,-675,-793 +-537,-823,-458 +-485,-357,347 +-345,-311,381 +-661,-816,-575 +-876,649,763 +-618,-824,-621 +553,345,-567 +474,580,667 +-447,-329,318 +-584,868,-557 +544,-627,-890 +564,392,-477 +455,729,728 +-892,524,684 +-689,845,-530 +423,-701,434 +7,-33,-71 +630,319,-379 +443,580,662 +-789,900,-551 +459,-707,401 + +--- scanner 1 --- +686,422,578 +605,423,415 +515,917,-361 +-336,658,858 +95,138,22 +-476,619,847 +-340,-569,-846 +567,-361,727 +-460,603,-452 +669,-402,600 +729,430,532 +-500,-761,534 +-322,571,750 +-466,-666,-811 +-429,-592,574 +-355,545,-477 +703,-491,-529 +-328,-685,520 +413,935,-424 +-391,539,-444 +586,-435,557 +-364,-763,-893 +807,-499,-711 +755,-354,-619 +553,889,-390 + +--- scanner 2 --- +649,640,665 +682,-795,504 +-784,533,-524 +-644,584,-595 +-588,-843,648 +-30,6,44 +-674,560,763 +500,723,-460 +609,671,-379 +-555,-800,653 +-675,-892,-343 +697,-426,-610 +578,704,681 +493,664,-388 +-671,-858,530 +-667,343,800 +571,-461,-707 +-138,-166,112 +-889,563,-600 +646,-828,498 +640,759,510 +-630,509,768 +-681,-892,-333 +673,-379,-804 +-742,-814,-386 +577,-820,562 + +--- scanner 3 --- +-589,542,597 +605,-692,669 +-500,565,-823 +-660,373,557 +-458,-679,-417 +-488,449,543 +-626,468,-788 +338,-750,-386 +528,-832,-391 +562,-778,733 +-938,-730,414 +543,643,-506 +-524,371,-870 +407,773,750 +-104,29,83 +378,-903,-323 +-778,-728,485 +426,699,580 +-438,-605,-362 +-469,-447,-387 +509,732,623 +647,635,-688 +-868,-804,481 +614,-800,639 +595,780,-596 + +--- scanner 4 --- +727,592,562 +-293,-554,779 +441,611,-461 +-714,465,-776 +-743,427,-804 +-660,-479,-426 +832,-632,460 +927,-485,-438 +408,393,-506 +466,436,-512 +110,16,151 +-258,-428,682 +-393,719,612 +-211,-452,876 +808,-476,-593 +-575,615,604 +-485,667,467 +-680,325,-822 +-627,-443,-432 +872,-547,-609 +833,512,582 +807,604,487 +839,-516,451 +891,-625,532 +-652,-548,-490 +30,-46,-14 diff --git a/19_ex_2.data b/19_ex_2.data new file mode 100644 index 0000000..6835346 --- /dev/null +++ b/19_ex_2.data @@ -0,0 +1,39 @@ +--- scanner 0 --- +-1,-1,1 +-2,-2,2 +-3,-3,3 +-2,-3,1 +5,6,-4 +8,0,7 + +--- scanner 0 --- +1,-1,1 +2,-2,2 +3,-3,3 +2,-1,3 +-5,4,-6 +-8,-7,0 + +--- scanner 0 --- +-1,-1,-1 +-2,-2,-2 +-3,-3,-3 +-1,-3,-2 +4,6,5 +-7,0,8 + +--- scanner 0 --- +1,1,-1 +2,2,-2 +3,3,-3 +1,3,-2 +-4,-6,5 +7,0,8 + +--- scanner 0 --- +1,1,1 +2,2,2 +3,3,3 +3,1,2 +-6,-4,-5 +0,7,-8 diff --git a/1_ex.data b/1_ex.data new file mode 100644 index 0000000..167e291 --- /dev/null +++ b/1_ex.data @@ -0,0 +1,10 @@ +199 +200 +208 +210 +200 +207 +240 +269 +260 +263 diff --git a/2.data b/2.data new file mode 100644 index 0000000..720a7fd --- /dev/null +++ b/2.data @@ -0,0 +1,1000 @@ +forward 1 +down 5 +down 6 +down 2 +forward 8 +up 3 +up 2 +down 2 +forward 9 +forward 7 +down 2 +forward 5 +down 2 +forward 2 +forward 1 +down 8 +forward 5 +down 6 +up 9 +down 7 +forward 6 +forward 7 +forward 8 +up 3 +down 8 +forward 9 +forward 5 +forward 2 +down 3 +down 3 +down 6 +down 6 +down 8 +down 4 +forward 1 +up 9 +down 7 +up 6 +down 2 +down 8 +forward 1 +forward 7 +forward 4 +forward 1 +forward 7 +down 1 +down 9 +forward 6 +forward 6 +forward 7 +forward 3 +up 7 +forward 7 +up 1 +forward 3 +forward 4 +up 4 +forward 6 +down 8 +down 7 +forward 4 +up 6 +up 8 +down 5 +down 6 +forward 2 +forward 7 +forward 5 +forward 4 +down 5 +down 8 +down 4 +down 4 +down 3 +forward 3 +down 8 +forward 7 +up 6 +down 3 +down 7 +down 3 +forward 2 +up 8 +down 7 +down 6 +down 3 +up 5 +up 4 +down 2 +down 5 +up 9 +down 8 +up 7 +up 8 +forward 7 +down 9 +up 5 +down 5 +down 5 +up 4 +down 4 +up 3 +down 1 +down 4 +down 7 +forward 2 +forward 9 +up 8 +down 8 +forward 6 +forward 8 +down 6 +down 2 +forward 2 +forward 7 +up 7 +down 4 +forward 1 +down 4 +forward 2 +up 3 +forward 8 +forward 7 +forward 8 +down 2 +down 9 +down 5 +forward 7 +down 7 +forward 8 +forward 2 +up 2 +forward 9 +down 3 +up 7 +forward 2 +down 4 +up 3 +up 8 +forward 4 +forward 4 +forward 3 +up 3 +forward 5 +forward 5 +down 9 +down 4 +up 2 +down 8 +down 5 +down 8 +up 7 +down 3 +down 7 +up 9 +down 7 +up 5 +down 5 +forward 2 +forward 2 +forward 6 +down 4 +up 3 +forward 1 +forward 3 +forward 4 +down 2 +forward 2 +down 1 +down 2 +down 3 +forward 8 +forward 1 +down 5 +forward 3 +up 2 +down 2 +forward 3 +forward 1 +up 4 +up 1 +up 2 +forward 4 +forward 8 +down 7 +forward 2 +down 8 +forward 6 +forward 3 +up 7 +down 3 +down 3 +forward 7 +forward 9 +down 8 +down 8 +up 1 +up 8 +down 5 +up 3 +forward 6 +forward 4 +forward 8 +up 4 +down 6 +forward 2 +forward 8 +down 1 +up 5 +down 4 +forward 5 +up 1 +forward 2 +down 9 +down 2 +forward 8 +up 3 +up 7 +forward 3 +forward 4 +down 7 +up 3 +down 7 +forward 7 +up 1 +down 3 +down 5 +down 7 +forward 5 +down 1 +up 9 +forward 1 +down 6 +up 4 +down 1 +forward 7 +forward 2 +down 2 +forward 2 +down 7 +down 4 +down 7 +down 9 +down 6 +down 2 +up 6 +forward 8 +down 2 +down 1 +down 8 +down 8 +down 1 +down 7 +forward 4 +forward 1 +down 2 +down 1 +up 2 +down 5 +forward 3 +forward 7 +forward 9 +up 5 +down 7 +down 3 +forward 3 +down 4 +forward 6 +forward 1 +down 6 +up 5 +up 6 +down 9 +forward 9 +forward 5 +down 3 +forward 5 +up 4 +down 4 +down 6 +forward 2 +forward 2 +down 5 +down 1 +forward 3 +forward 5 +up 5 +down 1 +down 5 +down 3 +down 4 +down 2 +down 2 +forward 5 +down 1 +down 4 +down 6 +forward 4 +down 1 +down 1 +down 7 +forward 1 +down 5 +forward 6 +forward 7 +forward 3 +down 6 +forward 8 +down 8 +down 3 +up 9 +forward 3 +up 5 +forward 9 +forward 3 +forward 5 +down 3 +down 7 +down 5 +up 5 +down 1 +up 5 +down 5 +down 9 +down 4 +down 2 +down 2 +up 2 +up 1 +forward 2 +forward 4 +up 5 +down 1 +forward 6 +up 7 +up 5 +down 5 +forward 4 +down 1 +up 4 +down 2 +forward 3 +forward 4 +down 4 +down 8 +down 4 +up 3 +forward 6 +forward 3 +forward 1 +up 3 +forward 6 +down 1 +up 5 +down 5 +down 9 +down 9 +down 4 +forward 9 +down 6 +down 6 +forward 2 +up 7 +down 4 +down 4 +down 3 +up 1 +down 4 +up 2 +forward 9 +down 2 +down 6 +down 6 +up 5 +down 7 +down 6 +down 9 +down 8 +forward 5 +down 6 +up 3 +down 8 +up 3 +forward 5 +down 1 +forward 4 +forward 3 +down 9 +down 4 +forward 8 +forward 8 +up 4 +forward 7 +up 5 +down 9 +down 2 +forward 6 +down 4 +forward 9 +up 1 +down 7 +down 3 +forward 6 +up 7 +forward 2 +forward 1 +down 9 +up 4 +forward 2 +forward 6 +forward 9 +forward 9 +down 7 +forward 4 +down 2 +forward 1 +forward 8 +down 7 +down 1 +forward 5 +forward 5 +down 8 +up 8 +up 1 +forward 2 +down 8 +forward 6 +forward 1 +forward 2 +forward 7 +down 3 +forward 5 +up 6 +up 8 +down 7 +forward 2 +forward 5 +down 5 +forward 8 +down 6 +down 3 +up 2 +down 7 +forward 5 +down 4 +forward 3 +up 7 +up 6 +forward 4 +forward 7 +forward 6 +down 4 +forward 5 +up 3 +up 5 +down 8 +forward 7 +forward 2 +forward 3 +up 4 +down 1 +up 2 +up 1 +forward 6 +up 3 +down 3 +forward 7 +down 6 +forward 9 +forward 9 +down 7 +forward 1 +down 9 +down 9 +forward 8 +up 9 +up 7 +up 4 +forward 4 +down 3 +down 4 +forward 4 +forward 5 +down 2 +down 7 +down 1 +forward 7 +down 6 +down 6 +forward 3 +up 1 +forward 4 +down 5 +up 7 +up 3 +up 9 +forward 8 +up 4 +forward 2 +down 2 +down 2 +up 8 +forward 1 +forward 3 +forward 7 +down 7 +up 5 +down 3 +down 4 +down 6 +forward 5 +down 1 +forward 5 +down 4 +forward 8 +down 4 +forward 6 +forward 9 +down 5 +up 2 +down 2 +forward 1 +forward 5 +down 1 +down 4 +down 4 +up 6 +forward 7 +forward 2 +forward 9 +down 1 +forward 2 +forward 6 +forward 1 +up 9 +down 7 +down 8 +forward 3 +forward 5 +down 4 +forward 2 +forward 2 +up 8 +forward 3 +forward 8 +forward 5 +up 6 +forward 6 +forward 3 +down 4 +up 8 +down 3 +forward 4 +forward 3 +up 4 +forward 7 +down 9 +forward 3 +down 6 +forward 9 +down 8 +forward 6 +down 7 +down 1 +forward 9 +down 4 +forward 8 +forward 5 +forward 7 +up 5 +up 3 +down 8 +down 5 +down 2 +up 3 +up 7 +down 8 +forward 6 +forward 4 +forward 9 +forward 6 +forward 4 +forward 1 +down 1 +down 3 +up 3 +up 7 +down 9 +down 5 +forward 1 +forward 6 +forward 5 +down 9 +forward 9 +forward 5 +up 5 +forward 8 +forward 6 +forward 4 +down 4 +down 6 +down 1 +forward 1 +down 6 +forward 8 +down 3 +down 6 +down 5 +forward 3 +down 3 +down 8 +up 6 +forward 6 +down 6 +down 4 +down 8 +down 9 +down 3 +down 4 +down 5 +forward 4 +down 7 +down 8 +up 4 +forward 4 +down 9 +forward 1 +forward 1 +down 6 +up 3 +up 6 +down 8 +up 7 +forward 3 +down 6 +down 1 +down 4 +up 4 +down 9 +forward 1 +down 3 +up 1 +forward 8 +up 4 +up 6 +up 4 +down 4 +up 5 +up 3 +down 1 +down 6 +forward 9 +down 2 +forward 9 +forward 8 +down 2 +forward 8 +up 5 +forward 5 +forward 5 +forward 4 +up 8 +down 3 +forward 3 +down 4 +up 1 +forward 4 +up 7 +down 1 +down 4 +forward 1 +forward 9 +down 7 +forward 4 +down 5 +down 7 +forward 9 +down 2 +down 2 +down 1 +down 2 +forward 8 +down 6 +forward 5 +down 2 +down 1 +up 4 +forward 7 +down 1 +down 5 +down 7 +down 6 +down 6 +up 8 +forward 3 +up 8 +up 9 +down 2 +down 1 +down 5 +up 8 +forward 4 +forward 6 +down 2 +down 3 +forward 2 +forward 2 +forward 2 +forward 3 +down 7 +forward 3 +down 4 +up 1 +down 2 +down 9 +up 4 +down 8 +up 7 +down 6 +down 7 +down 6 +forward 6 +down 4 +forward 2 +down 7 +down 1 +forward 2 +forward 5 +forward 6 +down 1 +down 4 +forward 2 +down 4 +down 6 +down 8 +forward 9 +down 8 +forward 5 +down 7 +forward 5 +up 1 +down 1 +down 9 +down 3 +forward 3 +forward 5 +down 6 +forward 6 +up 3 +down 4 +down 4 +forward 7 +forward 3 +down 5 +down 3 +forward 7 +up 5 +forward 1 +down 6 +forward 1 +forward 9 +forward 9 +up 9 +forward 5 +up 5 +forward 6 +down 8 +up 4 +up 8 +forward 9 +forward 4 +down 5 +down 2 +down 9 +forward 3 +forward 6 +forward 2 +up 4 +down 4 +forward 3 +down 8 +down 3 +up 3 +forward 8 +down 4 +forward 4 +forward 4 +up 9 +down 1 +up 5 +up 5 +forward 8 +forward 4 +forward 5 +forward 1 +forward 3 +forward 8 +down 1 +forward 2 +forward 7 +down 4 +down 3 +down 4 +up 7 +forward 9 +forward 7 +down 8 +forward 2 +down 4 +up 9 +down 9 +down 9 +up 2 +down 9 +down 9 +down 6 +up 9 +up 6 +down 7 +forward 3 +forward 9 +forward 2 +down 4 +up 4 +forward 1 +up 1 +down 6 +down 3 +down 2 +up 6 +down 5 +down 8 +up 4 +forward 1 +down 1 +down 4 +down 8 +down 5 +forward 2 +down 5 +forward 3 +forward 1 +forward 9 +forward 4 +down 6 +down 4 +down 3 +forward 5 +forward 4 +down 1 +up 7 +down 4 +up 3 +forward 2 +forward 4 +up 2 +up 9 +forward 4 +down 5 +forward 9 +up 1 +forward 8 +down 9 +down 6 +down 6 +down 2 +down 2 +down 3 +forward 8 +down 2 +down 5 +forward 4 +up 3 +down 4 +up 6 +forward 7 +up 2 +down 6 +down 8 +forward 1 +down 8 +down 9 +down 2 +forward 3 +forward 9 +up 7 +down 1 +down 5 +up 7 +down 5 +up 8 +up 4 +down 6 +forward 1 +forward 6 +forward 9 +forward 6 +forward 6 +forward 9 +forward 8 +down 8 +down 8 +down 4 +down 7 +down 9 +up 9 +down 7 +down 2 +forward 2 +down 5 +down 3 +down 1 +down 4 +down 2 +down 1 +up 2 +forward 6 +down 3 +down 3 +down 1 +forward 8 +down 3 +forward 1 +forward 3 +down 1 +up 7 +down 9 +forward 5 +forward 8 +up 7 +down 4 +down 3 +down 1 +forward 2 +forward 9 +up 5 +down 2 +forward 6 +forward 6 +forward 2 +forward 1 +forward 1 +down 9 +forward 6 +forward 6 +down 2 +down 6 +up 5 +forward 5 +up 4 +forward 4 +down 2 +down 2 +down 7 +down 1 +down 4 +forward 3 +forward 3 +up 8 +down 8 +forward 5 +up 4 +up 9 +up 6 +up 6 +down 7 +forward 2 +up 1 +forward 2 +forward 4 +forward 4 +forward 2 +forward 4 +down 6 +down 3 +forward 9 +forward 3 +down 2 +forward 6 +forward 6 +forward 4 +forward 8 +up 1 +down 1 +forward 1 +down 7 +up 6 +up 8 +down 1 +down 4 +down 3 +up 4 +forward 4 +forward 5 +down 5 +down 8 +up 7 +down 2 +down 6 +forward 5 diff --git a/2.jl b/2.jl new file mode 100644 index 0000000..fa18b84 --- /dev/null +++ b/2.jl @@ -0,0 +1,51 @@ +using Pkg +Pkg.add("Match") +using Match + +include("utils.jl") + +function solution2_1() + input_lines = non_empty_lines("2.data") + + function parse_line(line) + (command, amount) = split(line, " ") + parsed_amount = parse(Int, amount) + end + + map(fline->split(line, " "), input_lines) + + x = 0 + y = 0 + + for line in input_lines + (command, amount) = split(line, " ") + parsed_amount = parse(Int, amount) + @match command begin + "forward" => begin x += parsed_amount end + "up" => begin y -= parsed_amount end + "down" => begin y += parsed_amount end + end + end + (x, y, x*y) +end + +function solution2_2() + input_lines = non_empty_lines("2.data") + + aim = 0 + x = 0 + y = 0 + + for line in input_lines + (command, amount) = split(line, " ") + parsed_amount = parse(Int, amount) + @match command begin + "forward" => begin x += parsed_amount; y += parsed_amount * aim end + "up" => begin aim -= parsed_amount end + "down" => begin aim += parsed_amount end + end + end + (x, y, x*y) +end + +(solution2_1(), solution2_2()) diff --git a/20.data b/20.data new file mode 100644 index 0000000..05ddd45 --- /dev/null +++ b/20.data @@ -0,0 +1,102 @@ +#.#.....##...##..#.#......#.#...#.#.#...###.##......###.##.##..##.#...#.....###.#.....#.#.#...#.#..###.###..###..#..##..###..##..##.##.#..###########.##....#.#......#...#.###..###...#.####..########.#####.#.#..##.##.##..###.##.####.#..##.##..#...#####..#.#.##.##...##..#..##.....###.#.#....####.##.#...##.########.#.##.#.....###....#..###.####....############.#.##...#.####...#...##.#.#..#..#......#..##...#.########.#.#...#####..#..######.#.#.....#####...##.###.#.#.##.........#.#.##..##.#..#..##..##.###.##.##. + +#.#...##.#.##.##...#......##....##...#.#....##.##.#.##....###.#####.#......###......#.#.##.####..#.# +#.#...###.#.#.#...##...###....#####.#...#.####..########.#.#.#..#.###..##..#.####....#.#..#..##.#### +.....#.######..#.#.....#..#..####.########..#.#.####..#####..##.#..##..##.##.#..###.#.#.#.#...#..### +#.#........#.###.#..######.##..#.##...#.....#.#.......#.##.....#.###.##.#..##..#.##...##...##.####.. +#...#.#.##..###..#..####..#####.##...###.#....#..###..#.#....####..####.####..#..###.####.###.#..### +#..###..##.#....#.##..##.#..#.##....#.#.#.##..#.#.##..#..##.....#####..#..##.##.##..#.#####.###.#... +..####..##...#....##.#...#######..#....##.###...#.#.........##........###.#.##....#.#.###...#...###. +#######..#......##...##..###..##.#..##.#...###..##..#.#.##....##...##.#..##..##....#..###...##...#.. +.###.....#..#..##....#...#.##.#..#.#.#...#..#...#..#.#.###.####..#.###.###.###.#.#..#....#.#.#.#.##. +...##.#.#.#..#..#..#.#.##..#.....#...#####..#####..#.#..#...##..#..#...###.....#...#.#.#....#..##.## +.#####.##.##..#...###.#....##...###..#..#...#...########..#.#...#.#..####........####...###...##.... +.#..#..#.#....##..#.###...#..#.###...##.###.##.#...#####....#.###..#.#..#....#.##..#.......#.....#.# +.#..##..#..####..##.#.#..##..###..#.......#...#...#.####.#.#.#..#.##......#.##.###.###.####.##.#.### +.##..##.#..##..#.##.###...#.#####.#.#.#.##...#..#...##..##...#..###.###.##..##.#######.###....###### +....#.#..##...#..#####...##.#.##......#.###.#.#.###..#...###..##.#..#..####..#.#....#..#.####...#..# +.#..##..##...#.####.#####.#######.######.####.......#.#.###.##.#.#.#.#.##.....#....#....#..###....## +###.##..#.#.#.#.#..#######.#.########.#.#.#..####.#####.#.#..##..#..##.....#...#....#.##.##.#....#.# +#..#.####.####.##.####...#.###.#.##......###..##.####..#..####..##.#.#....##..##.######...#..##..... +#.##...#...#..##...#.#......#..######.#.###.####..#######..#.##...#.#...#.##..###.#####..#...#.####. +##.###.#.######.#...#..##.#...#..##.##.....###..#.##.#..#..####....#.##.##..#.#..#.#....#.....####.. +.#.##.##.###..#...#.#.#.#.#.......#.####.#####..####.#....##.#...##.##.#.#.##.#..#.###.##..###...#.# +#.###.#.##.#.........#..#.#.#.#..##.#..##.#####.###.#.#..#.#.#..##..###..#.##.####.#..#...###.....## +##..#####.#...#.....###.#.#...##.####..#..###....##...#.##.##.##...#.###..#.##...........###.####.## +.###....###.#..#.#..#..#.###..########..##......########.#..#######...#........#.#######..####..#..# +####......#...#..#...#.######..#.##.#.##....#.##.#.#.##.#....##...###..##....#.#.##.##.....###.#.##. +.#.####.##..##.#.#.#.##.###.##....#..#...#.###.#.#...#.....##..##.####....#..######.#.#.#.##...#...# +...#.##...##..##.###..###....#..##.....#####.#.#..#.....##..##.###..##..##.##.....#.#..##.#..###..#. +..##....####...##.....###.#...#.###...##.#.#..##.###....###.##........#.#..#..##..#.######..##...... +###.##.##.#...##.#...###.##.##.######.###.###..###.#....#.#....#.#.#...###..###.#.#...######.#...### +..#.####.########.####.#.#...#..##...##...###..####.###..##..#.##..###..#.####.###..#.#.#.#######..# +###..#.##.##.#..#..#.#..#.###...#...#.##.#####.#.###.#.###.#.##..#...#.#...##...###.....#..###....## +..####.#....####..#.##.....#..#.#.###.###.#.#......#.....####.......##.#.######..####..#######.#..## +.##.#.#..#..###....#....#...##.##.###..##.##...#.######......##....##..#.#.#..##..#####....#.#...#.. +##...##..#...#.#######..#.....#..##.....#####..#...##.###.####.###..###...#..###........###.##.#.### +...###.#....#...##.....##.####..##.##.#.#..##.######.#..###.##.....##.####..#..##.###.##..###.###..# +#.#...##....#....#.##....##...##..#.#...######..###.#.#..#.#.###.#####.#..###....#.##...####..####.. +#....###.###.#...########.##.##.######.##....#...##.#.#.#..#.##.#.....#..#.....#..........#.##..#... +.#.#.#.#.##.##.###...#.#.#...##...#.##.##..#..#...##...##..#.##.#.##....#.###....####..#..###.#..### +...#.#..##.#..##.#.##.####.#.#...###...#.#.###..########.#...###...###..#..#.###..####..##.#..#...#. +##.#...#######.....#.###..#.#..####.##..##.#..##...#.##..##.#####......######.#.#.##.#..####..#.#### +#.......#.#########...#...#####...##.###.#..##..##..#...##..##.#.#.###.#.##..#...#....##..#.#.#...#. +###..###..#...##.#...####.###..##.###..##..##.##.....#.#.#.####.######........#...#####.....#..##### +##.#.#.########..#.#.##.#####..##.###...#...#.#.##...###.#.###..#..##.#......#.#.#.##.#.#.#....###.# +#.##.#..#...##..###..##..#..##..##.###...#.##.##.#.#..........##...##.##..##..#....##.#####..##..#.. +.#...##.##.#..#.##....#..##.##...#...####.###..##...#...#.##...######.#.##.#.#.##.####.##..#.###.### +##.#.#..#.#.###.#..#.##.#....#....####..#.#..##.#######..##..#...#..####.#####....#.####.#..#.#.###. +....##.##..#.#####.###.#.###.#.#.#.#..#.###.#..######....##.##.....#.#.#...###..###..#..###....##.## +#.#######.#..#.#.##.##...#.#..###.##.##..#..###...#.#...#..##.##..##.#.#.##.##.#######.#..#.#..#.#.# +###.....#####..####..#...#..##.#....##.##...##...##..###...#..##..##..####.#.....##.####..#...##.... +####..##..##.#...#.###.##...###.#..#...##.##.#...#.##....####.#.#..#...##..##.##..###.......#..#..#. +#.#.#####..#....#.#...#..##.##..##..#.####..###.####.####.#####.#.#..###.##....#....#.#.###.#.#..##. +...##...#.#.#####.#.#....##.##..#...##...........#.#....#.##.##.....##..###...#.#####..........##.## +.#..#..#.#...#.........####....##........##...#...#######.####.###.###...#....###..#.###.##.#.####.# +..#.#.....#...###.####......###.#..#.#.#.#...####...#####.#..#....#.#.#....#.##.###....#..#....##.## +##.#...##....###.#......####.#.####.##...#..#.#.#.#...#####.#..#..##.#.#...#.####....###.####.#.#.## +.#.#..#....#.####.#..#.###..#.#.#.#.#.###...#.##.##.#.##...####..######....####...##.##.#..##.#.#..# +..##.#...##.####..#.###..##..#.###.#.##..##.###.#.#####..#.##.#.....#.#####.####..#.#.######.#.##.#. +#.....##..###..###.....###.##.###.#..##.#..##.###....#..#.#.##....#.##.##.#...###.###.#......#..#... +.##.#..#...#...#.#..##.....#..#.###....###..#.##...#.##.#.##..##......#.#.#.####.#..#..##...##..##.# +####...##...#......##.##..#######....###.##.#.###.#.#.###...####..#..#.#.##.........#.##.#....#####. +.####.#####..##..###..#.##.##.####.......#.###.#####.#..#...#..#..####.#.....#.####.#.....###...#### +#.##......#.#.#.##....#.#.##..#...#.#.#..#...##..#.##.##..#..#####..###.##.#...##...#..#...##.##..#. +.##.#.#.###..###.##....#...###...####...####..##.###.####.###.#..#.###.#..#.....#.##.#..#.##.#.#.#.# +...#.###.#..#..#.###.#....##..##.#..###.######.#...##..#.#...###.....#.###.#.#....##...##.###.#.#### +.#..#..#....###..##..#....##.##..####.#.#.#..#.######....####.##.##....##.#.#.####.#..#.##.##....#.. +#..##.#...#.###..#.###..###..#.##.#.######.#.#.####....###.##....#.##.#......##.##...##....#.#.###.# +#...##.#.####...#######..#....##.#...##..#.#....#.#.#####.####.##...#.###.##.#.#.##...##.#....##..## +....#.##.#.##.##.#.#..###...##.#.#.#....#...#..........###.#####.##...##..#..#.##.#...#..###..#####. +###..###.##..#.###.#.#.#...##.#.###.##.###...##.###.....####.#...##.#.#.#..#.##...#.....#..#.#.#...# +####...#.####.#.#.#..#.##.##.##.#.#.####...#...#.#..###....##.##..##.###...##.#...#####.###.#..#.... +##..##...###..###.#.###.##.####.#..#.#..####.##.#...#..#..#.....##.#.#####...##.....#.#.#..#..##..#. +.....#......#..##..#...#.#.#.######....###.##.##..#.###...#...#.####.##.##.###.#.######.#..#.#.##... +#.#.#.###........#..#.#.#.#....##..##..###...##.#.##.#..#######.#..###.###.#.###.###.#.#.#.....##..# +#.##....####.......#..##.####.#.##..###.##.###.#.#.###...###.....######...######.#.....###.##....... +#.##..#...#..#..#....#.##...#..#.###...#...#########.#.#...#.....#...#..#.#...#.#.#...#.###.####..## +.#..##........###.#.#....#.......##.#..#.#.#.##.......#.#.#.#..#.#.....#....#.###.#.##...###.....#.. +.#.#...##...#....#.##..##.#...#.##..#..##.#..###.#####..##.#.##.####.####.###...##....##......###..# +#..##....##.###.##.....#.#.....#.#...#..##....##.###.#....###.....######.#.##.###..#..#.#...#.....#. +....#.####.....#..#..#...#.###.#####..##...#.#..###.#...#...##.###.##..#.######..####.#.#....#.#..## +##.#..##.#.#.##..##..#...###..##.##..#.###..#...###..##.#.###.####...#..#.#######.##.###.###.#.#..#. +...##...##.#.#.##.#.##.###..##...##.#..#..##.##.##.##.#.####..##.######....#..#.#.#....###.#.##.#.#. +.#.....#.###...##.#.##.#..###.##..####.###..#.#.....#..##.#.#..##...##.#..#.##..#########..#.#.##.#. +####.#..#.#..##...#..#.##..#..#...#.###.....#..##...#..####....#######.....#.##.##..##...#.##..####. +########...#.#.####..####.#.#.#..##.#.#.##...#...#..#...#..###.#.#..##..#####.#.#.#.##.#.###...#.##. +.#....#..######.#.#.#..##.#.#...#####....##..##.##.#####....#.##..#..#.#.#.###..#.####.###.........# +...####..##......###..#..###..#.#.###.#...#..####.#.#..###....#..##.####.#..#.....#.........##..###. +.####...##...#####.##.##...##...##..##...#.#####...#...##...#.####..####.###.....##.##...##.#######. +##..####....#.#..#.#....##..#####....#.#...#.####..#######..##.#####.#.#.#.##.#.#..#...#.###.##.#.## +#.####....#..##########...###.#..#####.#.#.##....#..#....######.....#...#.##.##.#.##..#.###..###..#. +##.#.##.###..#.###.....##..#.###.#....#####.###...#.#.##.#..#.###.#.#.#####.#.##.##.##.#.#.###.###.. +.###.#.#.##.######.#.#..##.#..####..#....##......#...##.##.#.......#.#.#.####.#.#.##....##.####..#.# +####..#...##....#.#.#....#.#####...#..#....##..#..####...#..###...........####.###.###......#..##..# +..##.####.##....####....#.#.####..#...###.#....#.##.###.#.##..####.#..###..#...#..#####..#...##...#. +...#..#....#.#..##.#.####....#..####...##.#..#####.###..#.##..###.######...#...#...######.##....##.. +..#########.#####.#####.###.##.#.###.###..#.#.#.#.###.#...###........####..#####.#.##.##.#..#..#.##. +#..###.##.###.#...#.#.#.##.###........#.#.#.#..#..##.##.#.....#.#.....##...#..#.##..#..#..#......#.# +...##..#...##.....##...####.....#.##..###.....#..#.###.#..#.#...#..#.#.....###.###.##.#.#.#..#.#.... +#...#...#.#.#...#####.####..#....##...##.##.##.#...#.#.#..#...##....#...###.#.##.##....########..#.. +.#.####....#.#.....########.#....######.#.#######...##..#.###.#.###..###.#..###....#.#.###.....###.# +..#.##.##....#..#...#..#.#.#...###...#..#.#.#.####.#.#####.####....##..#..###.#.#..####....##.####.. diff --git a/20.jl b/20.jl new file mode 100644 index 0000000..1660db8 --- /dev/null +++ b/20.jl @@ -0,0 +1,58 @@ +include("utils.jl") + +function convert_to_binary(string) + map(x->x=='#' ? 1 : 0, collect(string)) +end + +function parse_input(filename, iterations) + lines = collect(non_empty_lines(filename)) + algorithm = convert_to_binary(lines[1]) + + dim = length(lines[2]) + buffered_dim = 2 * iterations + dim + + fix_lines = fill(fill(0, buffered_dim), iterations) + + i = [fix_lines; + map(convert_to_binary, map(x-> reduce(*, fill(".", iterations)) * x * reduce(*, fill(".", iterations)), lines[2:length(lines)])); + fix_lines] + image = transpose(reshape(reduce(vcat, i), buffered_dim, buffered_dim)) + algorithm, image +end + +function getv(algorithm, image, i, x, y) + address = [] + for ox in (x-1):(x+1) + for oy in (y-1):(y+1) + if ox < 1 || ox > size(image)[1] || oy < 1 || oy > size(image)[1] + # example +# push!(address, "0") + # real + push!(address, i % 2 == 1 ? "0" : "1") + else + push!(address, string(image[ox,oy])) + end + end + end + algorithm[parse(Int, reduce(*, address), base=2)+1] +end + +function enhance(fname, iterations) + algorithm, image = parse_input(fname, iterations) + for i in 1:iterations + new = copy(image) + for x in 1:size(image)[1] + for y in 1:size(image)[1] + new[x, y] = getv(algorithm, image, i, x, y) + end + end + image = new + end + length(filter(==(1), image)) +end + +function solution20_1() + enhance("20.data", 50) +end + +solution20_1() diff --git a/20_ex.data b/20_ex.data new file mode 100644 index 0000000..8fa4bd4 --- /dev/null +++ b/20_ex.data @@ -0,0 +1,7 @@ +..#.#..#####.#.#.#.###.##.....###.##.#..###.####..#####..#....#..#..##..###..######.###...####..#..#####..##..#.#####...##.#.#..#.##..#.#......#.###.######.###.####...#.##.##..#..#..#####.....#.#....###..#.##......#.....#..#..#..##..#...##.######.####.####.#.#...#.......#..#.#.#...####.##.#......#..#...##.#.##..#...##.#.##..###.#......#.#.......#.#.#.####.###.##...#.....####.#..#..#.##.#....##..#.####....##...##..#...#......#.#.......#.......##..####..#...#.#.#...##..#.#..###..#####........#..####......#..# + +#..#. +#.... +##..# +..#.. +..### diff --git a/21.jl b/21.jl new file mode 100644 index 0000000..a7895a1 --- /dev/null +++ b/21.jl @@ -0,0 +1,70 @@ +function make_dice(max_value) + next = max_value - 1 + r = 0 + function roll() + r += 1 + next += 1 + next %= max_value + return next + 1 + end + function rolls() + r + end + roll, rolls +end + +function advance(pos, dice) + pos += dice()+dice()+dice() + ((pos - 1) % 10) + 1 +end + +function solution21_1() + pos_a = 8 + pos_b = 5 + dice, times = make_dice(100) + score_a = 0 + score_b = 0 + while true + pos_a = advance(pos_a, dice) + score_a += pos_a + println("a -> $pos_a ($score_a)") + if score_a >= 1000 + r = times() + println("$score_b $r $(score_b * r)") + break + end + pos_b = advance(pos_b, dice) + score_b += pos_b + println("b -> $pos_b ($score_b)") + if score_b >= 1000 + r = times() + println("$score_a $r $(score_a * r)") + break + end + end +end + +using Pkg +Pkg.add("Memoize") +using Memoize + +DICE = [(a,b,c) for a in 1:3 for b in 1:3 for c in 1:3] + +@memoize function round(pa, pb, sa, sb) + sum(map(DICE) do dice + npa = pa + sum(dice) + npa = ((npa - 1) % 10) + 1 + nsa = sa + npa + if nsa >= 21 + [1, 0] + else + circshift(round(pb, npa, sb, nsa), 1) + end + end) +end + +function solution21_2() + round(8, 5, 0, 0) +end + +solution21_2() diff --git a/22.data b/22.data new file mode 100644 index 0000000..db381dd --- /dev/null +++ b/22.data @@ -0,0 +1,420 @@ +on x=-9..45,y=-15..37,z=-2..46 +on x=-48..2,y=-11..37,z=3..48 +on x=-47..4,y=-47..-3,z=-12..34 +on x=-24..29,y=-12..40,z=-20..29 +on x=-48..3,y=-38..16,z=-22..31 +on x=-35..13,y=-10..43,z=-11..42 +on x=-4..47,y=1..47,z=-26..18 +on x=-49..1,y=-29..22,z=-44..2 +on x=-12..33,y=-14..38,z=-9..35 +on x=-44..8,y=0..46,z=-28..20 +off x=-44..-31,y=-37..-21,z=35..49 +on x=-2..42,y=-49..-4,z=-10..39 +off x=-26..-17,y=-38..-29,z=-32..-18 +on x=-41..10,y=-1..49,z=-22..24 +off x=-49..-35,y=-26..-15,z=11..24 +on x=-5..47,y=-34..10,z=-3..42 +off x=-16..-7,y=-9..0,z=-4..12 +on x=-45..1,y=-25..22,z=-2..49 +off x=21..40,y=30..44,z=-16..1 +on x=-11..37,y=-44..1,z=-20..25 +on x=7379..15679,y=62885..66145,z=40785..66699 +on x=55922..93809,y=1651..21593,z=-29830..-6845 +on x=-31566..-20771,y=49570..87512,z=-38744..-20396 +on x=4993..41166,y=-27079..-6497,z=-88189..-66473 +on x=60741..69319,y=-13925..8370,z=-62720..-33863 +on x=34284..42689,y=-71439..-58324,z=22610..47957 +on x=8592..42171,y=-65708..-43885,z=-61206..-46568 +on x=64371..79931,y=28477..37185,z=13392..20753 +on x=-59117..-37612,y=-64167..-37759,z=35921..54572 +on x=-14064..20202,y=-90417..-70077,z=25371..40391 +on x=-67395..-41025,y=17787..31773,z=-57128..-48199 +on x=-70962..-46942,y=19586..45376,z=-54426..-31169 +on x=31777..46666,y=-28152..-20207,z=-66876..-55373 +on x=13530..27088,y=-90327..-70591,z=-1912..25782 +on x=40408..67678,y=38887..66828,z=-30776..-13301 +on x=-29414..-16610,y=56466..86239,z=20871..32428 +on x=-76113..-67766,y=37613..40645,z=-16702..13708 +on x=-53053..-28552,y=57577..78562,z=14326..42575 +on x=-58889..-42881,y=16768..21306,z=42955..76041 +on x=-73073..-51398,y=46632..48316,z=20149..34615 +on x=-66303..-54970,y=-61600..-49802,z=-11768..9094 +on x=-53654..-27948,y=9591..45638,z=-71810..-58350 +on x=-69622..-52612,y=-45011..-38959,z=24484..44518 +on x=3515..15378,y=41121..59682,z=-61133..-55743 +on x=-90134..-62577,y=208..23739,z=26851..46343 +on x=65530..81406,y=42070..52596,z=-11235..13125 +on x=64169..84257,y=-10178..17467,z=-29044..-16366 +on x=17446..26654,y=-66194..-47798,z=-42530..-24698 +on x=-58456..-32175,y=-57823..-50339,z=35867..54337 +on x=47156..63257,y=-36128..-21908,z=33134..41699 +on x=-48529..-31263,y=-62437..-39211,z=-56496..-37240 +on x=-34149..-14003,y=-79123..-45929,z=-55215..-40418 +on x=-84191..-64387,y=-11156..17366,z=31098..34346 +on x=-82865..-68797,y=-5798..8421,z=28104..58202 +on x=29311..45767,y=-88790..-62482,z=-29612..-214 +on x=8842..27908,y=68184..82736,z=-55247..-19216 +on x=-42756..-14515,y=74498..84491,z=-20007..4343 +on x=-37638..-28150,y=-72221..-45636,z=49412..60164 +on x=32841..44894,y=-62963..-55317,z=-44129..-18308 +on x=41325..48341,y=14656..22614,z=-63334..-57171 +on x=39491..70558,y=48229..67699,z=14708..39318 +on x=-16935..-15423,y=72793..82573,z=-9454..8508 +on x=28720..40689,y=29779..36750,z=-74342..-54201 +on x=65984..88372,y=-3884..15208,z=19130..38834 +on x=-85972..-61107,y=-27882..-5274,z=-23592..-4731 +on x=-65737..-48051,y=-4370..32823,z=-51562..-27039 +on x=53568..75174,y=13164..34585,z=-62900..-49637 +on x=43348..67279,y=37890..47849,z=6060..34285 +on x=-88633..-60579,y=-40956..-20401,z=-20101..8972 +on x=-70097..-44904,y=37603..69889,z=-21021..-5234 +on x=-76016..-71353,y=10592..39343,z=5961..25639 +on x=26814..51079,y=-76683..-51852,z=-32221..-7926 +on x=78022..90710,y=-6329..7380,z=-30398..3225 +on x=-81947..-59036,y=6212..27865,z=-30191..-23650 +on x=-14260..5518,y=-59292..-33347,z=-80781..-44527 +on x=61127..77249,y=-44821..-16717,z=-15659..9963 +on x=7812..29885,y=46232..56927,z=56252..66587 +on x=-70864..-55068,y=36351..66673,z=2115..29365 +on x=-21385..-5787,y=-24942..-1426,z=62656..77888 +on x=21748..31508,y=44194..75368,z=42392..61013 +on x=-30140..-13716,y=60038..82957,z=-55563..-22103 +on x=15892..46641,y=28104..45417,z=-69780..-49812 +on x=-35304..-14704,y=-69612..-54212,z=-64119..-43604 +on x=-75511..-53167,y=-16408..-5573,z=-34276..-13669 +on x=-49880..-26128,y=-78019..-53301,z=563..27150 +on x=-3710..31007,y=635..31231,z=-89739..-67701 +on x=16417..27647,y=59484..83416,z=-38071..-8125 +on x=-55486..-36218,y=-18343..-1162,z=48973..70778 +on x=6364..25168,y=-73763..-55266,z=-47439..-20212 +on x=-77074..-63388,y=13325..37503,z=26475..47125 +on x=47836..63427,y=-22005..-1081,z=-56895..-36496 +on x=52594..78952,y=1602..34837,z=-55674..-29580 +on x=9195..36803,y=-42634..-16959,z=49912..77645 +on x=-43313..-9809,y=-61189..-27305,z=-73518..-57945 +on x=-15098..-247,y=-84505..-61173,z=-6903..10359 +on x=-14761..20062,y=42726..66812,z=-67450..-36194 +on x=-6269..13514,y=27764..51152,z=-65770..-56309 +on x=-11702..12085,y=4154..19444,z=74342..85810 +on x=20250..40759,y=-12245..12965,z=-85663..-56952 +on x=14397..31766,y=-77031..-60677,z=-13856..14510 +on x=-57268..-50706,y=-61409..-55384,z=-8347..2644 +on x=27634..48898,y=66690..87119,z=-27363..-7996 +on x=11697..40665,y=-92019..-67357,z=-28564..-4579 +on x=-23635..-7962,y=23732..32687,z=-83083..-62791 +on x=40495..46668,y=-62018..-49602,z=-65022..-33630 +on x=13198..30010,y=-82290..-65531,z=-17978..9547 +on x=12582..25248,y=-22745..3631,z=70846..86218 +on x=-26583..-5966,y=41977..55683,z=36463..75892 +on x=-65277..-49356,y=37876..57024,z=-52763..-45440 +on x=-64608..-41498,y=-8129..16874,z=50097..71345 +on x=42175..49606,y=-70140..-50383,z=35730..40798 +on x=54705..58189,y=-56152..-49341,z=-400..24932 +on x=68337..79185,y=-25307..-6874,z=-3313..19891 +on x=5018..29619,y=62462..81105,z=18248..30135 +on x=-76041..-38663,y=38551..70709,z=-12671..23088 +on x=-72729..-54213,y=-6076..24031,z=-57821..-37810 +on x=43326..72010,y=20000..41816,z=51160..69275 +on x=1558..30222,y=-73358..-70358,z=16312..51532 +on x=-35043..-18417,y=-44261..-25881,z=-78549..-52077 +on x=28098..46713,y=18474..22660,z=-78742..-54633 +on x=-14412..8266,y=70802..80415,z=-14992..9258 +on x=-26641..-7645,y=60425..75589,z=-43589..-23911 +on x=-25876..-19902,y=53219..77507,z=-48144..-17584 +on x=-43367..-22330,y=68271..77937,z=9057..20584 +on x=-17237..2381,y=3583..28698,z=-94572..-73051 +on x=-6829..3379,y=65792..90689,z=-5002..16981 +on x=-54132..-45538,y=-78237..-50736,z=-11644..8605 +on x=-59532..-53419,y=34745..56394,z=30582..53444 +on x=-20732..5101,y=-77256..-61756,z=30478..35782 +on x=14347..38867,y=9283..24381,z=-87398..-53279 +on x=36595..57756,y=38640..51025,z=-58273..-44565 +on x=-54582..-27927,y=-78804..-46081,z=13910..33182 +on x=16349..35830,y=71332..87852,z=8157..16797 +on x=-43956..-33473,y=33808..56755,z=42846..61246 +on x=11314..13439,y=-38033..-17400,z=-76284..-68981 +on x=46492..76990,y=8474..15734,z=-55742..-41584 +on x=27131..36354,y=-29792..-5590,z=-74708..-55530 +on x=52353..74451,y=33392..55689,z=19093..30505 +on x=10590..26407,y=26646..44875,z=53669..85124 +on x=10328..23456,y=52345..77588,z=31705..56684 +on x=-46182..-26197,y=20916..52128,z=-61613..-51850 +on x=-5902..15644,y=7302..32746,z=-89842..-71630 +on x=-13813..21172,y=-87032..-70414,z=-36..11650 +on x=-43300..-20544,y=-39391..-20796,z=-78685..-54411 +on x=53826..59621,y=-22659..6182,z=34874..57854 +on x=56180..78116,y=-17473..-11209,z=33329..48534 +on x=-27987..-9324,y=45080..55335,z=48847..80731 +on x=71719..89566,y=-25531..-10083,z=-22109..-12785 +on x=-29430..-21311,y=-89432..-55080,z=14731..25873 +on x=32126..44985,y=48444..71257,z=16998..38903 +on x=24388..50981,y=-66328..-57172,z=-52521..-27884 +on x=30463..45384,y=-7855..28748,z=-86869..-55644 +on x=-67671..-45297,y=-29469..-5222,z=44296..53119 +on x=35058..42106,y=-69099..-47111,z=40655..63310 +on x=33046..64904,y=-70169..-43042,z=13896..36888 +on x=-22322..-13112,y=-25157..-2838,z=-93853..-69670 +on x=73781..84202,y=-1016..31182,z=9547..30589 +on x=-72865..-63710,y=-50800..-28031,z=-15998..20829 +on x=6767..15631,y=-17255..-11461,z=-97425..-59135 +on x=25319..31792,y=-93050..-64825,z=8041..20183 +on x=-70089..-30927,y=36115..69616,z=-39401..-14311 +on x=62942..69074,y=-22392..-1078,z=-66440..-27451 +on x=-13913..4148,y=-75097..-42466,z=35698..57507 +on x=-85917..-59242,y=-11125..2601,z=19575..55603 +on x=15134..42927,y=-79064..-64982,z=-1971..24343 +on x=39880..58909,y=56469..72390,z=-1437..26115 +on x=-21090..-12306,y=-94355..-77198,z=-29560..52 +on x=-28671..-8856,y=45669..64627,z=31384..51891 +on x=-75912..-56733,y=-23901..1139,z=28555..57092 +on x=-47744..-10650,y=71138..83710,z=4554..27540 +on x=25710..42555,y=-33622..-14274,z=52056..65528 +on x=-76115..-63779,y=-29627..-15804,z=-1106..16981 +on x=14189..34263,y=-62546..-38815,z=42727..81264 +on x=7852..41042,y=31315..42334,z=55681..71183 +on x=-88315..-67768,y=-8097..8232,z=22878..36892 +on x=-75367..-48994,y=-65971..-49798,z=-331..14292 +on x=-25718..1445,y=-80169..-61373,z=-57242..-32282 +on x=-13075..7644,y=-14640..-3379,z=75167..96592 +on x=35741..67984,y=-60591..-37834,z=-42879..-23133 +on x=-26071..-15399,y=-54535..-33151,z=64373..77023 +on x=70725..90684,y=8312..29942,z=-28004..2695 +on x=54936..67698,y=10377..30841,z=-45783..-36371 +on x=-2020..25407,y=-78434..-50839,z=-48610..-39223 +on x=-45717..-43647,y=48801..70774,z=31062..45511 +on x=34206..54314,y=-70584..-47392,z=-45786..-24983 +on x=-49858..-27145,y=-8313..12257,z=-80733..-65761 +on x=19194..48953,y=-76824..-50937,z=-38483..-20184 +on x=-11056..8975,y=60011..77711,z=-47016..-22798 +on x=23444..61412,y=-8792..27162,z=54757..77897 +on x=-75528..-48686,y=-2534..13417,z=-72418..-47078 +on x=21664..55288,y=9053..15264,z=54771..84777 +on x=45230..57868,y=-35816..-19600,z=-70489..-40910 +on x=30646..56513,y=-73290..-51396,z=-48109..-23594 +on x=-19927..8133,y=20111..22064,z=-78790..-65966 +on x=-73214..-50284,y=-42781..-29543,z=-52080..-40858 +on x=59641..92804,y=-14320..9890,z=10580..32686 +on x=6948..24112,y=59008..83939,z=9209..29435 +on x=20747..42638,y=54010..87392,z=-10349..6792 +on x=-82467..-56030,y=-63078..-36419,z=-18052..-7281 +on x=43143..53517,y=-42852..-33677,z=-75322..-38352 +on x=34903..68087,y=-53600..-43300,z=19263..37332 +on x=-75090..-51229,y=39553..54421,z=-29984..-11983 +on x=31297..41923,y=40810..55544,z=41336..65242 +on x=48907..76926,y=44120..55019,z=19408..32113 +on x=-28350..-11619,y=-96073..-68302,z=7131..23826 +on x=-71444..-52453,y=-46437..-37331,z=-23610..-7727 +on x=-90114..-62112,y=-11142..11966,z=10310..30329 +on x=-8298..10663,y=-89901..-65346,z=26819..55136 +on x=-83214..-52210,y=-28546..-6449,z=26105..44117 +on x=-48292..-15887,y=-32421..-24179,z=-72733..-50252 +on x=2675..6592,y=57643..77972,z=-45680..-31319 +on x=-27301..-19021,y=52139..65771,z=40324..62506 +on x=-15122..12261,y=76124..83252,z=-6966..26871 +on x=-28135..-5592,y=42253..66391,z=61120..81631 +on x=41458..59123,y=-65686..-28325,z=18007..42560 +on x=-7254..2575,y=-37975..-25118,z=-83436..-55842 +on x=-69756..-51850,y=-14700..11743,z=-64913..-57730 +on x=46050..60943,y=29947..49852,z=-29174..-16871 +on x=-24798..-1730,y=72778..96749,z=7809..19201 +on x=-23651..-9598,y=-57234..-34582,z=-70338..-60811 +off x=-62738..-27200,y=9928..29860,z=-82061..-55735 +off x=-35621..-8459,y=71584..77639,z=-24783..543 +on x=5884..24918,y=4508..27365,z=-79957..-56399 +off x=50195..64289,y=48376..65137,z=-21184..896 +off x=24188..59760,y=-44337..-27583,z=42362..66284 +off x=-57347..-28736,y=-60601..-44136,z=-63070..-43716 +off x=48377..66842,y=5381..28487,z=-56713..-36405 +off x=-30632..-10325,y=-68112..-57776,z=-70249..-44986 +on x=-27258..-24687,y=-27831..179,z=67481..80119 +off x=25197..36490,y=58147..79063,z=-55819..-29388 +on x=-42369..-14014,y=35824..40212,z=49626..67639 +on x=72482..78811,y=2743..24960,z=-21034..9641 +on x=-38737..-16444,y=-19459..-7136,z=70522..89734 +off x=-47053..-18446,y=-49781..-27644,z=-63382..-45445 +on x=-61779..-53562,y=-68401..-43173,z=-26499..2615 +on x=70280..90492,y=-22017..-1048,z=-11788..9915 +on x=16973..40998,y=55375..78623,z=5729..32627 +on x=6679..29613,y=46958..81428,z=27700..55392 +off x=-54278..-31989,y=37760..65264,z=47082..48144 +on x=-24395..-1817,y=-3077..6849,z=62195..88101 +off x=32931..47933,y=-80935..-47905,z=12414..35416 +on x=-4833..29094,y=-74517..-46510,z=-50662..-36261 +off x=17745..39300,y=-77063..-52076,z=14430..34896 +on x=-4254..2793,y=-27799..-2199,z=61332..85652 +on x=-11125..-6797,y=-67626..-59797,z=45783..53770 +on x=-51997..-22683,y=-75871..-59016,z=-35612..-29371 +off x=-53070..-30804,y=-37612..-16817,z=-61098..-33579 +on x=-52249..-27676,y=65019..73794,z=8944..31489 +on x=54561..70311,y=8710..27762,z=-60193..-29447 +on x=-79526..-54134,y=-48561..-39181,z=12782..46387 +off x=19885..33599,y=62071..83093,z=-50279..-13755 +on x=23245..46830,y=20494..44306,z=-73620..-54933 +on x=-79449..-67759,y=-24475..-10791,z=5687..32934 +off x=-30071..-21031,y=54871..72346,z=32042..55267 +off x=-30238..-2898,y=-77564..-51143,z=35341..64987 +off x=54103..57884,y=36694..60345,z=-45985..-16112 +on x=52740..71478,y=15648..46995,z=9255..41940 +off x=47709..56624,y=42824..76404,z=-16692..-4361 +off x=-79808..-65764,y=11636..14621,z=6874..40024 +off x=-53031..-20679,y=-63906..-40440,z=24661..46608 +off x=21238..38683,y=-78416..-46878,z=-47880..-35504 +on x=-53581..-36276,y=-1941..20566,z=-71887..-54358 +off x=-32154..-11432,y=-79738..-67958,z=-10706..17360 +off x=10696..21438,y=-53803..-22129,z=-87224..-56070 +off x=28285..52461,y=-49037..-26856,z=36499..53886 +on x=-260..5955,y=24586..37153,z=-83960..-67924 +off x=-50570..-23890,y=-75797..-57497,z=-41895..-29533 +off x=-4478..14154,y=25690..41167,z=-78169..-65042 +off x=53823..62681,y=-65274..-48164,z=11640..36739 +off x=7445..17160,y=3112..20438,z=-79277..-66317 +off x=-72283..-62851,y=-18551..17812,z=26518..45970 +off x=-59435..-35677,y=-61145..-49053,z=-28620..-19260 +on x=52909..71776,y=-35904..-8679,z=-45640..-18257 +on x=-28198..-10547,y=47520..75387,z=-56238..-36602 +on x=-78021..-57108,y=-202..20511,z=22910..26211 +on x=6366..17660,y=-81206..-59720,z=-20739..4299 +off x=62320..70434,y=-46472..-33338,z=24434..41197 +on x=65053..71471,y=16283..27975,z=-53360..-32879 +on x=25858..60433,y=-26017..-21914,z=48513..63801 +off x=-79152..-68671,y=22088..30479,z=-22648..-10494 +off x=67085..79404,y=-9147..17587,z=-34597..-22908 +on x=-25433..-14453,y=-65170..-45979,z=46473..59725 +on x=-85030..-67943,y=-43295..-20298,z=-28190..-8337 +off x=14793..29071,y=51299..70682,z=-63333..-48581 +on x=-22738..-3843,y=62665..91255,z=-40441..-6764 +off x=-69466..-51782,y=-28726..-4741,z=51052..65722 +off x=-37894..-19524,y=-83016..-54967,z=-15269..4234 +off x=-51737..-36058,y=49755..52567,z=40935..52695 +on x=5160..16270,y=-63557..-29172,z=-66325..-60455 +on x=-12754..14999,y=42410..57660,z=-81237..-44235 +off x=-21896..-1639,y=-6683..12111,z=-86947..-66486 +on x=17671..34865,y=25801..50054,z=-69110..-52941 +off x=53780..79949,y=-19080..-1582,z=-51267..-26442 +on x=11705..31955,y=-18273..10873,z=-79513..-72321 +off x=42225..64739,y=-63751..-38399,z=-21976..3241 +on x=-83556..-68733,y=-27434..-7743,z=-13017..9177 +on x=56237..76149,y=-34497..-16008,z=-39077..-19458 +on x=-43305..-25014,y=-73343..-49996,z=-7825..-3892 +on x=-64308..-43967,y=-33788..-28512,z=52866..68806 +on x=-70700..-50756,y=31972..50876,z=-38908..-15838 +off x=-57164..-42932,y=19342..48612,z=33732..55624 +on x=-36748..-10589,y=51955..83318,z=-48442..-26669 +on x=25359..40927,y=-79085..-59846,z=8036..36888 +off x=10380..14539,y=71572..87896,z=-24628..-4781 +off x=-47176..-28461,y=65456..67163,z=-40894..-16836 +off x=-18332..8399,y=47821..71986,z=26668..47522 +on x=-20965..-9481,y=-20308..4897,z=-95419..-57801 +off x=31539..51751,y=35462..53163,z=-57494..-42838 +off x=-18472..1572,y=75988..93471,z=-26864..1039 +on x=-70785..-33731,y=-73997..-43660,z=-23224..9946 +on x=19380..37078,y=53776..78064,z=-31936..-10509 +on x=-8062..-2825,y=-82342..-69826,z=-13266..3969 +off x=10179..29342,y=31007..48598,z=64959..69127 +off x=-60805..-32266,y=43431..69404,z=8577..28595 +off x=-22720..-3203,y=60404..66611,z=34857..59638 +off x=-53582..-38618,y=52017..73240,z=27473..42769 +off x=-72814..-66689,y=-45388..-21812,z=-14516..3856 +on x=-73641..-69708,y=-15500..7339,z=-39764..-29382 +off x=-4677..17044,y=-91970..-68336,z=-5685..15742 +on x=11739..24073,y=35242..45244,z=-80024..-60736 +on x=64670..76998,y=26199..39053,z=-15372..11264 +on x=32930..62408,y=7820..14870,z=-84786..-50274 +off x=1793..28795,y=19984..43135,z=67050..87662 +on x=62730..81556,y=-59681..-32462,z=-9119..17314 +off x=51211..84860,y=-10649..27833,z=33629..61327 +on x=4877..24218,y=58754..64225,z=-51294..-29252 +on x=-34998..-23262,y=-7791..15688,z=-77251..-73653 +on x=-8985..2565,y=-80674..-57237,z=31372..66054 +on x=26910..46858,y=-70174..-50719,z=-39433..-6303 +on x=-77313..-45494,y=-35534..-19783,z=-56939..-23493 +off x=-86093..-58555,y=-10764..-7163,z=32984..39939 +off x=22629..45516,y=56413..69690,z=23879..45264 +off x=6426..22257,y=-81295..-58682,z=-4833..30396 +on x=-20499..-623,y=68725..85089,z=-3165..16088 +on x=-22113..-8769,y=50723..69731,z=35423..63761 +off x=17927..28889,y=66820..87168,z=7146..17344 +on x=-51150..-32434,y=4434..29601,z=-87179..-50635 +on x=44312..65806,y=-17376..-4824,z=-60807..-46664 +off x=-74021..-63274,y=18155..23737,z=23087..44175 +on x=53142..78645,y=11091..24149,z=-33898..-15733 +on x=-89734..-59095,y=5415..39645,z=-30819..-14415 +off x=-3526..9687,y=44579..60215,z=-61672..-41733 +off x=73321..97678,y=7224..33092,z=-23526..-6480 +on x=-38319..-18652,y=-94091..-57143,z=-27008..-10399 +off x=-39624..-25656,y=-27151..-17149,z=62826..73496 +off x=11777..31489,y=27498..41343,z=-66823..-64400 +off x=-86379..-57406,y=1305..22612,z=-19292..-12364 +off x=46778..72347,y=-30615..-14497,z=-57631..-38999 +off x=11620..35158,y=60858..89766,z=3059..17854 +off x=12508..29190,y=-69508..-58455,z=23048..41891 +on x=-18252..13098,y=36042..44460,z=50978..82816 +on x=-6496..13599,y=-32852..-21957,z=70926..82031 +on x=69343..93866,y=-13495..12902,z=20150..37520 +on x=14399..46141,y=-16440..-4786,z=64520..82073 +on x=34907..49197,y=-77417..-58364,z=7116..41283 +off x=-964..13645,y=-84374..-61091,z=5528..26680 +on x=17413..51768,y=18101..39773,z=59112..72097 +on x=-66173..-34985,y=-64364..-26681,z=-46312..-32514 +on x=4907..25817,y=-86293..-63574,z=20626..51969 +off x=25870..59523,y=34211..49946,z=40232..74133 +off x=-54230..-38453,y=30481..43869,z=-54591..-40302 +on x=-19584..11278,y=-61815..-44911,z=-59169..-54278 +off x=9524..37706,y=69604..90591,z=2047..19112 +off x=-55707..-36536,y=32805..48941,z=-69826..-44814 +off x=-47397..-26251,y=-45541..-17561,z=51498..63966 +on x=-26274..-8974,y=-11082..14341,z=-95770..-63704 +on x=63227..82757,y=-53349..-33869,z=6276..38367 +off x=-9009..17116,y=-1685..15956,z=-89391..-75291 +off x=-60467..-32934,y=-16532..8638,z=66520..73970 +on x=42282..63814,y=-52404..-29292,z=16300..39083 +on x=59807..76726,y=-59577..-30112,z=-6617..22740 +off x=-71581..-61332,y=-11793..7729,z=28377..51215 +off x=58949..86888,y=-38405..-857,z=-27434..-1959 +on x=-38039..-18664,y=-52842..-30904,z=-69197..-39328 +on x=34271..60705,y=-13427..9155,z=-86631..-62294 +on x=-47181..-37507,y=52951..66180,z=31932..41322 +on x=50153..80932,y=-4041..16916,z=32832..52829 +on x=-5561..25588,y=-10476..10520,z=78611..97383 +off x=-83214..-60530,y=-3562..17310,z=7405..28737 +on x=-60777..-54134,y=54086..73346,z=-11397..12806 +on x=8008..14420,y=-63596..-41593,z=-68526..-45673 +off x=24007..49083,y=-16462..-7045,z=57536..81481 +off x=-11681..3645,y=-58012..-41953,z=55142..76200 +off x=-76656..-52954,y=35846..55582,z=-53872..-34722 +on x=-12038..8659,y=-87346..-69918,z=28070..47940 +on x=-11947..10184,y=-53409..-34027,z=-72583..-47438 +off x=-55067..-35621,y=-69939..-60505,z=-14835..1042 +off x=32935..37139,y=-85226..-70552,z=-25685..4412 +on x=-28948..-4652,y=36671..63289,z=-68708..-50580 +off x=11959..12834,y=37735..57272,z=-76650..-51945 +off x=-80869..-62027,y=-29135..1722,z=-41049..-20272 +off x=-16105..-9908,y=13813..43802,z=-91236..-73026 +on x=-49560..-40469,y=43630..61941,z=-52839..-35457 +off x=9147..25541,y=-80287..-59670,z=42741..55735 +off x=50379..79472,y=29160..49483,z=-5978..29107 +on x=-88412..-58603,y=-3423..3159,z=19531..41416 +off x=-1015..23656,y=53461..84876,z=27264..47816 +off x=-34955..-31932,y=56566..75983,z=-11994..10763 +off x=-33477..-1860,y=19104..24306,z=-77651..-71897 +on x=-73047..-48583,y=28931..56704,z=23154..30012 +off x=70083..72794,y=-5597..15786,z=-51791..-23271 +on x=28989..57370,y=40583..60178,z=-62971..-45863 +on x=55125..91706,y=-15559..4561,z=15786..49181 +off x=-24690..-3730,y=59694..97039,z=724..22523 +on x=50442..59532,y=-34136..-13939,z=-73167..-41283 +on x=-42457..-22829,y=28486..55735,z=-61093..-54803 +off x=59374..88933,y=-35520..-16575,z=21065..24982 +off x=47891..77004,y=-55581..-33892,z=-24958..-20207 +on x=-39381..-6103,y=25106..44027,z=51236..84981 +off x=53027..72033,y=-66349..-40215,z=-1886..6465 +off x=-16688..3581,y=-13126..2347,z=-92211..-65235 +on x=-42613..-26870,y=-29924..-12291,z=-67035..-61494 +off x=63092..79122,y=988..21133,z=-16953..3867 +off x=-67216..-58011,y=-53495..-33034,z=-11608..-1856 +off x=53934..86965,y=-44444..-9436,z=16273..30447 +off x=-4034..19635,y=-54143..-37719,z=-78365..-41039 +on x=-34211..-14894,y=-25413..-719,z=56386..88338 +on x=-57326..-35994,y=-38049..-8173,z=-56649..-54035 +off x=30271..50936,y=-87052..-56522,z=3300..32145 +on x=55833..75804,y=18495..43321,z=-27127..-11497 diff --git a/22.jl b/22.jl new file mode 100644 index 0000000..ca6e88d --- /dev/null +++ b/22.jl @@ -0,0 +1,106 @@ +include("utils.jl") + +function interval(coords) + coords[1]:coords[2] +end + +function parse_input(filename) + map(non_empty_lines(filename)) do line + command, coords = split(line) + coords = map(x->parse(Int, x.match), eachmatch(r"-?[0-9]+", coords)) + coords = [interval(sort(coords[1:2])), + interval(sort(coords[3:4])), + interval(sort(coords[5:6]))] + command, coords + end +end + +function ccontains(a, b) + all(issubset.(a, b)) +end + +function cempty(cube) + reduce(min, length.(cube)) == 0 +end + +function setdiffcubes(cube, subcube) + above = [cube[1], cube[2], (subcube[3].stop+1):(cube[3].stop)] + below = [cube[1], cube[2], (cube[3].start):(subcube[3].start-1)] + far = [cube[1], (subcube[2].stop+1):(cube[2].stop), subcube[3]] + near = [cube[1], (cube[2].start):(subcube[2].start-1), subcube[3]] + right = [(subcube[1].stop+1):(cube[1].stop), subcube[2], subcube[3]] + left = [(cube[1].start):(subcube[1].start-1), subcube[2], subcube[3]] + + filter(c->!cempty(c), [above, below, far, near, right, left]) +end + +function add_cube(cubes, cube) + if length(cubes) == 0 + return [cube] + end + + if any(map(c->ccontains(cube, c), cubes)) + return cubes + end + cubes = filter(c->!ccontains(c, cube), cubes) + + result = [cube] + for c in cubes + inter = intersect.(c, cube) + if cempty(inter) + push!(result, c) + else + append!(result, setdiffcubes(c, inter)) + end + end + result +end + +function remove_cube(cubes, cube) + if length(cubes) == 0 + return [] + end + result = [] + for c in cubes + if ccontains(c, cube) + continue + end + inter = intersect.(c, cube) + if cempty(inter) + push!(result, c) + continue + end + append!(result, setdiffcubes(c, inter)) + end + result +end + +function magnitude(cube) + reduce(*, length.(cube)) +end + +function run(filter=nothing) + cubes = [] + for (command, coords) in parse_input("22.data") + if typeof(filter) == Int64 && reduce(max, map(x->reduce(max, abs.(x)), coords)) > filter + continue + end + if command == "on" + cubes = add_cube(cubes, coords) + else + cubes = remove_cube(cubes, coords) + end + end + sum(map(magnitude, cubes)) +end + + +function solution22_1() + run(50) +end + +function solution22_2() + run() +end + +solution22_1(), solution22_2() diff --git a/22_ex.data b/22_ex.data new file mode 100644 index 0000000..25975df --- /dev/null +++ b/22_ex.data @@ -0,0 +1,4 @@ +on x=10..12,y=10..12,z=10..12 +on x=11..13,y=11..13,z=11..13 +off x=9..11,y=9..11,z=9..11 +on x=10..10,y=10..10,z=10..10 diff --git a/22_ex_2.data b/22_ex_2.data new file mode 100644 index 0000000..e665295 --- /dev/null +++ b/22_ex_2.data @@ -0,0 +1,22 @@ +on x=-20..26,y=-36..17,z=-47..7 +on x=-20..33,y=-21..23,z=-26..28 +on x=-22..28,y=-29..23,z=-38..16 +on x=-46..7,y=-6..46,z=-50..-1 +on x=-49..1,y=-3..46,z=-24..28 +on x=2..47,y=-22..22,z=-23..27 +on x=-27..23,y=-28..26,z=-21..29 +on x=-39..5,y=-6..47,z=-3..44 +on x=-30..21,y=-8..43,z=-13..34 +on x=-22..26,y=-27..20,z=-29..19 +off x=-48..-32,y=26..41,z=-47..-37 +on x=-12..35,y=6..50,z=-50..-2 +off x=-48..-32,y=-32..-16,z=-15..-5 +on x=-18..26,y=-33..15,z=-7..46 +off x=-40..-22,y=-38..-28,z=23..41 +on x=-16..35,y=-41..10,z=-47..6 +off x=-32..-23,y=11..30,z=-14..3 +on x=-49..-5,y=-3..45,z=-29..18 +off x=18..30,y=-20..-8,z=-3..13 +on x=-41..9,y=-7..43,z=-33..15 +on x=-54112..-39298,y=-85059..-49293,z=-27449..7877 +on x=967..23432,y=45373..81175,z=27513..53682 diff --git a/22_ex_3.data b/22_ex_3.data new file mode 100644 index 0000000..aba7585 --- /dev/null +++ b/22_ex_3.data @@ -0,0 +1,60 @@ +on x=-5..47,y=-31..22,z=-19..33 +on x=-44..5,y=-27..21,z=-14..35 +on x=-49..-1,y=-11..42,z=-10..38 +on x=-20..34,y=-40..6,z=-44..1 +off x=26..39,y=40..50,z=-2..11 +on x=-41..5,y=-41..6,z=-36..8 +off x=-43..-33,y=-45..-28,z=7..25 +on x=-33..15,y=-32..19,z=-34..11 +off x=35..47,y=-46..-34,z=-11..5 +on x=-14..36,y=-6..44,z=-16..29 +on x=-57795..-6158,y=29564..72030,z=20435..90618 +on x=36731..105352,y=-21140..28532,z=16094..90401 +on x=30999..107136,y=-53464..15513,z=8553..71215 +on x=13528..83982,y=-99403..-27377,z=-24141..23996 +on x=-72682..-12347,y=18159..111354,z=7391..80950 +on x=-1060..80757,y=-65301..-20884,z=-103788..-16709 +on x=-83015..-9461,y=-72160..-8347,z=-81239..-26856 +on x=-52752..22273,y=-49450..9096,z=54442..119054 +on x=-29982..40483,y=-108474..-28371,z=-24328..38471 +on x=-4958..62750,y=40422..118853,z=-7672..65583 +on x=55694..108686,y=-43367..46958,z=-26781..48729 +on x=-98497..-18186,y=-63569..3412,z=1232..88485 +on x=-726..56291,y=-62629..13224,z=18033..85226 +on x=-110886..-34664,y=-81338..-8658,z=8914..63723 +on x=-55829..24974,y=-16897..54165,z=-121762..-28058 +on x=-65152..-11147,y=22489..91432,z=-58782..1780 +on x=-120100..-32970,y=-46592..27473,z=-11695..61039 +on x=-18631..37533,y=-124565..-50804,z=-35667..28308 +on x=-57817..18248,y=49321..117703,z=5745..55881 +on x=14781..98692,y=-1341..70827,z=15753..70151 +on x=-34419..55919,y=-19626..40991,z=39015..114138 +on x=-60785..11593,y=-56135..2999,z=-95368..-26915 +on x=-32178..58085,y=17647..101866,z=-91405..-8878 +on x=-53655..12091,y=50097..105568,z=-75335..-4862 +on x=-111166..-40997,y=-71714..2688,z=5609..50954 +on x=-16602..70118,y=-98693..-44401,z=5197..76897 +on x=16383..101554,y=4615..83635,z=-44907..18747 +off x=-95822..-15171,y=-19987..48940,z=10804..104439 +on x=-89813..-14614,y=16069..88491,z=-3297..45228 +on x=41075..99376,y=-20427..49978,z=-52012..13762 +on x=-21330..50085,y=-17944..62733,z=-112280..-30197 +on x=-16478..35915,y=36008..118594,z=-7885..47086 +off x=-98156..-27851,y=-49952..43171,z=-99005..-8456 +off x=2032..69770,y=-71013..4824,z=7471..94418 +on x=43670..120875,y=-42068..12382,z=-24787..38892 +off x=37514..111226,y=-45862..25743,z=-16714..54663 +off x=25699..97951,y=-30668..59918,z=-15349..69697 +off x=-44271..17935,y=-9516..60759,z=49131..112598 +on x=-61695..-5813,y=40978..94975,z=8655..80240 +off x=-101086..-9439,y=-7088..67543,z=33935..83858 +off x=18020..114017,y=-48931..32606,z=21474..89843 +off x=-77139..10506,y=-89994..-18797,z=-80..59318 +off x=8476..79288,y=-75520..11602,z=-96624..-24783 +on x=-47488..-1262,y=24338..100707,z=16292..72967 +off x=-84341..13987,y=2429..92914,z=-90671..-1318 +off x=-37810..49457,y=-71013..-7894,z=-105357..-13188 +off x=-27365..46395,y=31009..98017,z=15428..76570 +off x=-70369..-16548,y=22648..78696,z=-1892..86821 +on x=-53470..21291,y=-120233..-33476,z=-44150..38147 +off x=-93533..-4276,y=-16170..68771,z=-104985..-24507 diff --git a/2_ex.data b/2_ex.data new file mode 100644 index 0000000..b7172ac --- /dev/null +++ b/2_ex.data @@ -0,0 +1,6 @@ +forward 5 +down 5 +forward 8 +up 3 +down 8 +forward 2 diff --git a/3.data b/3.data new file mode 100644 index 0000000..ac22a69 --- /dev/null +++ b/3.data @@ -0,0 +1,1000 @@ +011001101000 +010101111100 +000000111101 +001001001010 +010011000001 +111111001110 +001011101111 +110011010110 +100011111110 +101110000111 +000011011100 +001111111011 +011101001111 +111001010110 +011100011110 +001011000010 +100010111011 +000101010011 +000001101100 +010001011110 +100010101000 +111101011101 +110000100001 +011011010101 +110101100110 +001101101010 +111010110011 +011111111000 +010001010001 +000001010101 +001001011011 +101111110011 +100011010001 +111010010111 +011010011010 +101111011011 +101010111100 +001111100110 +010100110111 +010110101100 +000111110101 +111110101110 +111010000000 +011111111010 +000101011100 +000001010110 +101000100101 +100001011001 +011101110010 +110111100100 +110011001011 +000010001111 +000100010101 +110111001100 +010001100000 +101111110101 +111000011011 +000100001001 +101101011101 +001001011110 +101100111010 +011011000010 +110010010111 +101001010101 +000000101110 +000011011111 +010001000011 +011011001010 +101101111011 +100010001010 +001001011100 +010011110001 +000001111101 +100001000101 +011101011010 +000010101110 +001010101010 +101010011011 +000111001011 +000011101000 +110100101001 +000111111010 +100111100101 +111010001111 +111100110001 +011111101010 +110101000011 +001111101100 +101000100110 +100101100011 +000011010011 +010101011111 +010000110111 +110011001001 +101011011101 +001011100001 +000001100101 +001001001101 +001101001111 +001110110001 +010110101110 +001100110110 +001000001111 +101101001001 +011111011010 +111111101110 +111001100000 +100101011001 +010101100101 +100000110100 +011001001000 +111100110011 +111011110001 +110011111010 +001101001010 +111110011111 +110101100000 +111001000101 +010001111110 +111011010100 +110011010111 +100100110111 +111111011010 +011110101111 +001011110010 +010111011010 +011101101101 +011010101110 +011000110001 +010110101010 +011110010000 +111111011100 +111011000101 +100110101110 +010101100010 +101100011110 +000010110101 +010010011110 +110000000110 +011111010101 +000110110011 +101011000010 +000011000111 +101011010000 +101101101001 +010000101010 +101001001001 +111010110110 +111000111101 +000001010111 +101110001100 +110010110001 +100000110001 +101100101011 +100000111001 +010110100111 +101011001111 +101010111001 +010010110000 +001110010011 +010101101110 +011000010100 +100111111000 +011110100011 +110100100111 +101110101000 +101010101111 +101001000000 +111010000110 +101001000100 +010001100111 +011011010001 +000101010101 +010110000011 +100000101110 +110010001000 +111000100001 +001001101001 +110010001001 +100001111011 +101010010100 +110011100101 +010101100001 +011101010100 +110100101111 +110100001111 +011000101101 +001011101100 +010010010101 +011011111010 +010101000001 +100101100000 +101001111101 +010000000100 +110000110100 +000000001101 +100100111101 +111100110010 +001011001111 +101100001011 +001111010001 +101100011001 +100110110001 +010111000011 +011010110101 +100111100011 +000111110011 +010101111101 +010010000000 +011000011011 +001100011001 +001011001001 +101110101101 +101111110111 +101011100100 +000100110100 +110000101111 +011001111101 +000000000111 +111001001010 +110100001100 +000001001110 +111001101011 +100011011111 +110000001000 +110101011011 +001010000101 +001011111001 +011011111100 +010100110101 +110101111001 +010110010101 +010010001000 +001001110111 +011111111111 +100011100010 +000110001101 +011111010000 +010111110010 +110010100011 +101011110101 +110011011110 +010000000101 +011101100100 +110010011100 +011101101100 +000010001001 +000011101101 +000101100011 +010111111000 +010111100111 +010101000101 +110111100010 +110001101011 +111010100000 +101010101011 +011101010101 +000100110111 +000111100111 +000100111111 +111100001001 +010000100001 +110101011111 +100010000100 +000011011000 +111011110000 +101000011100 +110001001010 +001000010101 +110110000101 +100000011110 +001101111010 +010111001100 +111011111100 +100101001000 +010111101001 +110010010000 +110011010000 +000010100111 +100101111101 +110101100010 +110100011110 +101111010110 +110001001111 +011101000111 +001011001101 +110001000010 +011110100110 +000101100110 +000110111110 +001010111010 +100110000111 +001000010110 +100001110100 +000111000110 +101100011100 +110100110110 +100011010111 +000101110001 +001010010110 +101000000101 +100101101000 +000111111110 +010010010111 +110010001010 +001100110111 +110110110101 +011111011101 +110101100111 +100100100111 +011011000000 +111101001100 +011101000011 +011101001010 +101101101101 +100100110010 +001000000010 +010010001010 +111110111001 +000111010001 +011100111111 +011111011001 +110101000000 +011110000010 +001111010110 +010011111111 +110101111011 +101110111111 +001001100001 +011100111100 +110111001110 +011000000111 +001100010111 +001011010010 +010010001011 +101110000011 +100000101000 +100010100100 +000111011101 +001000111011 +010010101010 +111011010011 +110100010001 +011110001110 +111010110001 +010000010111 +010110101101 +111101100001 +110011100110 +000101111110 +110010101010 +000001010000 +001101111101 +011011110100 +110001010101 +011001000001 +001101101100 +100011011011 +101011100010 +011011100101 +100110110101 +110111001011 +000100101011 +001101010100 +010000011100 +101100111011 +011001011100 +011011010100 +011100110001 +010010110011 +101000110011 +111101010001 +111000000100 +101101100111 +001011111000 +010100000111 +011110101101 +111011101100 +110101110001 +001110010000 +010010000111 +101001111011 +100100111100 +000101101101 +101111110100 +100000101111 +011001110000 +011110011001 +000101010110 +000000000101 +110010001100 +000111100100 +010010011010 +001111110100 +011010001010 +101100101111 +011001001011 +100011111101 +101100000001 +100100101010 +000000000100 +111001110101 +000010011110 +110110100100 +111010010001 +011101010010 +011100101111 +010110000010 +010000110101 +110101010011 +001110011110 +111010011010 +000110101000 +001111000001 +010110110000 +001100110001 +110011011111 +000100111011 +110001000111 +011010111101 +000010100110 +010100101001 +010001000010 +000101110101 +101100110100 +111000110010 +111011110010 +010111001111 +100000101101 +101100001010 +100100001001 +111111111101 +001010101001 +000011011010 +101011010010 +111001000110 +111100010011 +111010011100 +100000111100 +011100001101 +110001101000 +101111011001 +001100001000 +101110010111 +011111100000 +001011100000 +101011101010 +110010101111 +001110000101 +001111011011 +011110101000 +111000001000 +010100111010 +010010111001 +110000110001 +110011000101 +001110000100 +010100101101 +101010110100 +100001010100 +100011010011 +100000010010 +011101010111 +001000010111 +001100111100 +000110100011 +101111101010 +010001010000 +001100100110 +111001111110 +101000001001 +000010110010 +110111101011 +101011000011 +001000111111 +100011001101 +011010010101 +110011100011 +110010011010 +110001010100 +100010111101 +101110000110 +010111001011 +110011011100 +110001100011 +000100011010 +111011100010 +011110110011 +011111100010 +000100001101 +100010010000 +110000000011 +101001011000 +101100110101 +001010101011 +011001011010 +001010001001 +001111011100 +111100010001 +100011010110 +001000110111 +011011010011 +001100000000 +100001111100 +000011110101 +100010000111 +000010110011 +000010111110 +011110000101 +010000001011 +001111110010 +001110001001 +011101111111 +010110110001 +110000000111 +010101011101 +010111001001 +100100010010 +101001101110 +100001001010 +010001011101 +100111010101 +100000101011 +000100101001 +110111001001 +100100000001 +010111010010 +111101111011 +011010010010 +111101101000 +100110111101 +010010001001 +100111011000 +110101111111 +111010101110 +010011110010 +101001100100 +010000101111 +010011001111 +110010011111 +101110100111 +011010100101 +111111001001 +010101100110 +101001001101 +001000101010 +010001001100 +101001101000 +110110100000 +011101000101 +100101010101 +101110111011 +010010101001 +110100011000 +110101111010 +110000100000 +010011101101 +111011001101 +100100011101 +110100010111 +011100110100 +010111011001 +011101010001 +101000000010 +100111111001 +100100001000 +001000001000 +001000000100 +011110110010 +010101010011 +101101101100 +110111111001 +010000010011 +100010100001 +000110101111 +101010101101 +100101111100 +000111010110 +001101101111 +110010000011 +110100001110 +011111111101 +111011010101 +001010100010 +100010100110 +101101110111 +010110011011 +111001110110 +011110101001 +110011100111 +000100111101 +101100011000 +101101001010 +011111100111 +010000011000 +100001100110 +000000101101 +000111010010 +110000001100 +111111101010 +001000100010 +111111111011 +001011100111 +000101110010 +010111110011 +010000011001 +111001111101 +110100001101 +010001101000 +110000101011 +011011000110 +110010111011 +100111101010 +011001101011 +001101010011 +011000100101 +110111101111 +001000100001 +010010111101 +101101101011 +011111011100 +111111010110 +001110000000 +101011110010 +011101011111 +001001101101 +011101110000 +011100011101 +111101001101 +010111010101 +010111101010 +001000101101 +100000000011 +111110101111 +000111101111 +001110010101 +101111001101 +111100110000 +110010100000 +011101110100 +100011001111 +010110001001 +111100101100 +101001110100 +011010010111 +011000100100 +001100110100 +001001111000 +001000000111 +110100000111 +011000001011 +001011000000 +110110110111 +000010111011 +001001000011 +000011100111 +110011001111 +010000111101 +001110100010 +000011110001 +011001111011 +110111000001 +111111000001 +011001100110 +110010101100 +111101010100 +010010000101 +000011011011 +110110010001 +010111111010 +010000010101 +110000011010 +110001101110 +000110101011 +101111000111 +001101100000 +010100000001 +111110001001 +000011110000 +111100111001 +000001001011 +011000010110 +000001000100 +011100111000 +001011111110 +011100000000 +000101001011 +111111110110 +111010011000 +001000111101 +011001110010 +001101011100 +100110001111 +110110111010 +001110101100 +010000101100 +010011000011 +100101110010 +000000111010 +000001111001 +111101011000 +101000011001 +111110000101 +101111111011 +100110111110 +000110010110 +011011101110 +100000010111 +110111001000 +000010101010 +001010011011 +101010101010 +101100000000 +000101101011 +010110100110 +110010010100 +001010110101 +001110000001 +010001101010 +111111110100 +001101110110 +111101010111 +101011101100 +110001101010 +100111010100 +101101111001 +001011100110 +010010001111 +100101110110 +110011000010 +001111010100 +000101011011 +110000000001 +011011001001 +001001011111 +000111011111 +100001001100 +111011010010 +010101011001 +000001110100 +000010100101 +110110010010 +100010111110 +011110111110 +000001101000 +001011000110 +000010001010 +101101010100 +011011010000 +000011111000 +101000001110 +011110101011 +110100111000 +000011000010 +111111010001 +011101110001 +100000111101 +110100101101 +110000100101 +011001110110 +110001010010 +010010110110 +011110001000 +111010110100 +101111110010 +110000110111 +111101110100 +110111101110 +100110010111 +001001100011 +001110111000 +101110100100 +010000101101 +010111100101 +011001100010 +011100000101 +101001111001 +100011001010 +100010000010 +100101000010 +111111100101 +100001101110 +101001010110 +100000100011 +100000011000 +000110000001 +000000011011 +011000110101 +011010111011 +111110000001 +001001110100 +001011011110 +110111010110 +011101110101 +101111000101 +100001010010 +000001111000 +001110010100 +111111101100 +001011010001 +111001111001 +100101101010 +111000000010 +010101001010 +001010000010 +101011000110 +110011001010 +001000011000 +001010010011 +110000111101 +001001100000 +111101100111 +011001001100 +001100111011 +100001010101 +111010100011 +111000011111 +001000000000 +101110011001 +000000000011 +111011000111 +011010100011 +110000110000 +000011001001 +011000010001 +011110000011 +011101000000 +010100110011 +010110010001 +111001101111 +110111110100 +110111110110 +100111001011 +111100110110 +101010001110 +100110000010 +011011100001 +001101010010 +010001110011 +010011110000 +110010100111 +001101110100 +101010101100 +110000111000 +011101110110 +101011110001 +110011000000 +010000011011 +001011010000 +010111010001 +010100010101 +110101000100 +010011101011 +010110111001 +101111000011 +011011100000 +000010100010 +001100110000 +110000111001 +100100100000 +001101000010 +100000010011 +100010011110 +110101010000 +000100000101 +000111000001 +000001111011 +100111011101 +110111110111 +011101111000 +001001000110 +100110010011 +100011100111 +010011010000 +010011010111 +001101100101 +010000010110 +000101010001 +011111010100 +010010111100 +001010101110 +110000001011 +011001010101 +000001111110 +010111111011 +011110010010 +001001101100 +101100101000 +100000001110 +110001001110 +011110111011 +001000110011 +111100110111 +001101100111 +000110110000 +000010011011 +100110111010 +111110001100 +000000101100 +110000111100 +100110111100 +110111111100 +110000111010 +100001100100 +100010011010 +011011100110 +110100010110 +001001010101 +000110101110 +101001100000 +100010110011 +111000001101 +101110100110 +100010111100 +000101110110 +000011011001 +000001010100 +101100111001 +011101111101 +011110011000 +111010001011 +010101110101 +100001100101 +100110100010 +100110011000 +001010100110 +011001010111 +111111001010 +111111001000 +111110100101 +000101000011 +110101101111 +110100010010 +011100000010 +001000010100 +101100000111 +001010111111 +101001010011 +101011001000 +001100000011 +010010101000 +101101111101 +101001010010 +100101111011 +101110101110 +100000100100 +000000000010 +011101100011 +110000110110 +101000110000 +111011111010 +010111000110 +001111110110 +100111110110 +100110011101 +000000001000 +101110111010 +000101011000 +001011100011 +011101100111 +000011000011 +000101011001 +110101101101 +101000001111 +111000010101 +000011100010 +011010111001 +001100100101 +010111111101 +010101111011 +000101001100 +101010000111 +111100111111 +100000000111 +110111110011 +000110110111 +010011011111 +100110010100 +000100111110 +001000111001 +011111000001 +001010100101 +101010001100 +011100001011 +000101001111 +010010101111 +101000111011 +001101000001 +100100100001 +100010101111 +100111111110 +011011111001 +101000000001 +111001101101 +101011010101 +111111100110 +001010010100 +011101111001 +001100100000 +101001110110 diff --git a/3.jl b/3.jl new file mode 100644 index 0000000..7cdf2a7 --- /dev/null +++ b/3.jl @@ -0,0 +1,61 @@ +include("utils.jl") + +function parse_input(filename) + input_lines = collect(non_empty_lines(filename)) + width = length(input_lines[1]) + integers = map(x->parse(Int, x, base = 2), input_lines) + (integers, width) +end + +function most_common_bit(integers, width) + score = zeros(Int, width) + for int in integers + for index in 1:width + score[index] += ((int >> (index-1) & 1) - 0.5) * 2 + end + end + map(map(sign, score)) do x + if x == 0 + 1 + else + x + end + end +end + +function solution3_1() + integers, width = parse_input("3.data") + + score = most_common_bit(integers, width) + + result = 0 + cresult = 0 + for i in 1:width + result += ((score[i] + 1) >> 1) << (i - 1) + cresult += (((score[i] * -1) + 1) >> 1) << (i - 1) + end + (result, cresult, result * cresult) +end + +function filterdata(integers, width, score_factor) + ints = copy(integers) + for i in reverse(1:width) + score = most_common_bit(ints, width) * score_factor + ints = filter(ints) do x + (x & (1 << (i - 1))) >> (i - 1) == (score[i] + 1) >> 1 + end + if length(ints) == 1 + break + end + end + ints[1] +end + +function solution3_2() + integers, width = parse_input("3.data") + oxy = filterdata(integers, width, 1) + co2 = filterdata(integers, width, -1) + (oxy, co2, oxy * co2) +end + +solution3_2() diff --git a/3_ex.data b/3_ex.data new file mode 100644 index 0000000..a6366a8 --- /dev/null +++ b/3_ex.data @@ -0,0 +1,12 @@ +00100 +11110 +10110 +10111 +10101 +01111 +00111 +11100 +10000 +11001 +00010 +01010 diff --git a/4.data b/4.data new file mode 100644 index 0000000..6f02da3 --- /dev/null +++ b/4.data @@ -0,0 +1,601 @@ +31,50,79,59,39,53,58,95,92,55,40,97,81,22,69,26,6,23,3,29,83,48,18,75,47,49,62,45,35,34,1,88,54,16,56,77,28,94,52,15,0,87,93,90,60,67,68,85,80,51,20,96,61,66,63,91,8,99,70,13,71,17,7,38,44,43,5,25,72,2,57,33,82,78,89,21,30,11,73,84,4,46,14,19,12,10,42,32,64,98,9,74,86,27,24,65,37,41,76,36 + +31 5 70 8 88 +38 63 14 91 56 +22 67 17 47 74 +93 52 69 29 53 +33 66 64 19 73 + +35 63 17 48 77 +25 58 33 14 96 +32 87 90 66 70 +16 4 98 72 23 +19 74 39 29 59 + +40 29 44 17 27 +56 98 83 62 70 +25 91 20 60 84 +42 66 34 77 31 +16 8 6 50 28 + +13 6 58 39 74 + 3 15 69 5 23 +81 65 0 85 93 +72 7 60 42 52 +45 64 47 53 67 + +94 21 67 0 14 + 2 75 77 15 78 +38 25 49 99 92 +76 35 69 4 64 +42 96 86 84 70 + +46 7 74 65 80 +99 12 4 38 77 +30 90 78 94 21 +22 15 72 52 57 +11 67 59 3 9 + +18 17 63 53 96 +16 76 55 5 92 +33 82 60 51 8 +29 99 87 95 58 +88 15 75 61 21 + +10 24 79 28 90 +64 43 21 48 99 +45 85 80 71 94 +68 39 57 50 72 +47 60 3 62 49 + +82 92 58 16 89 +76 90 74 61 29 + 2 72 43 69 23 +84 38 0 4 55 + 5 64 49 78 94 + +79 60 28 45 95 +47 2 93 89 77 +56 18 54 97 33 +55 91 68 58 90 +87 37 88 35 10 + +42 76 25 15 38 + 6 34 33 88 30 +43 10 27 26 72 +78 66 62 14 37 + 1 65 95 54 5 + +14 0 46 72 75 +83 2 62 76 26 +65 85 19 18 95 +57 45 87 51 29 +32 37 61 34 43 + + 9 75 56 60 50 +53 81 41 55 11 +86 54 29 85 2 +92 6 97 46 84 + 5 0 70 3 82 + + 3 15 61 94 85 +62 7 12 10 45 +84 66 18 33 86 +91 19 11 22 39 +57 16 80 26 9 + + 1 69 46 98 61 +19 7 63 56 90 + 9 3 66 38 73 +40 49 72 0 94 +42 23 75 89 32 + +33 59 17 15 86 +62 96 84 2 18 +27 63 55 3 82 + 0 89 19 73 24 +56 93 12 87 41 + +31 56 33 3 9 +55 52 87 57 30 +44 89 6 5 65 +15 53 62 51 11 +61 35 13 4 46 + +15 84 95 88 65 +96 18 93 14 21 +49 40 46 1 30 +50 64 69 80 81 + 3 19 87 9 38 + +71 68 18 81 41 +95 26 45 24 25 +42 73 62 36 94 + 5 61 98 99 48 +31 55 8 1 88 + + 0 73 19 12 4 +72 22 27 59 48 +71 26 28 66 37 +54 87 8 2 65 +20 60 35 32 29 + +44 41 93 76 47 +24 33 15 14 61 +78 49 81 67 52 +74 73 54 23 66 +75 10 18 3 60 + +94 95 52 23 10 +55 14 35 44 56 + 0 49 50 60 79 +59 54 90 67 46 +17 81 4 37 58 + +38 29 8 79 77 +91 98 1 68 30 +86 13 95 46 61 +55 36 90 42 97 +69 7 0 93 27 + +82 5 67 40 3 +61 16 56 68 29 +55 20 13 15 0 +75 28 45 17 77 +86 85 10 2 26 + +98 73 72 43 17 +32 41 56 46 76 +85 7 31 69 91 +86 21 37 40 82 +33 57 15 39 30 + +83 18 90 75 29 +17 73 32 88 50 +51 99 5 23 22 +60 47 35 42 2 +37 86 82 14 30 + +17 47 7 54 0 +65 83 33 11 57 +85 16 27 75 61 +60 90 44 69 81 +71 73 38 46 28 + +57 79 76 91 99 +96 20 13 34 52 + 0 21 5 47 63 +60 62 55 29 71 +44 59 58 78 65 + +83 30 7 1 80 +90 2 11 41 92 + 3 27 33 10 78 +63 75 0 38 86 +96 76 87 67 6 + +63 19 42 56 12 +35 89 87 13 81 +21 23 4 16 11 +64 78 25 92 33 +41 10 66 68 99 + +56 76 37 18 41 +38 27 17 50 14 +60 23 0 6 1 + 9 8 30 93 44 +58 99 16 46 26 + +40 77 4 96 68 +55 21 30 24 76 +81 58 41 91 98 +56 46 20 78 0 +82 29 87 67 53 + +59 33 4 18 95 + 2 52 54 96 19 +46 72 3 43 81 +20 97 87 55 53 + 9 80 84 76 29 + + 2 25 44 64 46 +93 35 17 84 67 +14 48 21 73 90 +89 62 53 54 52 +38 59 69 45 50 + +71 96 56 57 72 +47 39 25 15 90 +29 65 44 3 83 +36 30 92 59 95 +97 86 48 74 94 + +51 91 75 25 28 +72 56 9 21 93 +88 32 58 24 37 +82 48 95 53 23 +68 20 43 84 69 + +68 75 33 39 96 + 0 65 45 27 53 +36 71 2 91 97 +10 82 44 41 7 +11 42 17 26 14 + +61 36 56 6 64 +72 10 62 77 21 +99 73 37 38 25 +60 7 44 43 14 +81 59 29 19 92 + +63 49 13 31 56 +59 76 62 83 44 +69 24 57 40 91 +20 41 2 55 9 +50 60 46 15 52 + +87 90 97 53 23 +85 67 7 71 98 + 1 22 48 82 69 +15 21 17 91 80 +99 57 28 94 79 + +24 25 44 95 99 +55 97 9 18 27 +71 37 13 52 39 +30 3 79 14 28 +81 62 98 22 31 + +49 90 17 65 4 +59 42 15 14 54 +91 55 67 58 8 +13 61 79 32 99 +92 28 16 72 20 + +73 47 39 94 45 +93 53 95 71 27 +66 40 65 37 58 +15 61 63 50 55 +57 8 99 90 85 + + 6 45 79 9 14 +82 12 42 38 15 +31 71 48 5 96 +35 81 25 63 19 + 2 90 64 22 33 + +62 56 60 29 63 +47 33 75 77 76 +86 7 90 34 46 +85 3 0 16 65 +71 44 11 40 52 + +18 19 73 67 64 +66 85 37 10 51 +62 46 11 40 35 +83 69 57 1 78 +81 48 36 6 22 + +99 0 41 81 52 +68 31 27 30 5 +12 62 54 43 50 +58 36 10 55 86 +61 69 97 22 49 + +59 18 91 86 90 +87 20 57 61 42 +15 99 31 32 73 +23 89 64 96 49 +79 47 97 19 51 + +17 46 19 20 58 +67 29 4 8 22 +52 18 13 34 70 +82 73 71 95 47 +35 28 33 42 62 + +15 16 78 99 74 +61 81 84 72 69 +12 11 17 62 94 +76 63 96 42 98 +89 64 10 32 18 + +18 21 63 89 14 +95 5 79 19 11 +29 82 77 59 90 +13 3 31 46 45 +80 37 97 78 61 + +75 9 94 11 80 +93 27 10 2 82 +89 32 64 52 60 +42 56 23 20 18 +70 78 45 76 40 + +16 98 0 94 73 +28 13 48 90 11 +30 43 20 9 78 +14 39 89 4 6 +15 63 91 45 37 + +41 55 44 2 39 +38 14 19 72 64 +75 95 35 6 47 +70 7 1 29 86 +83 79 90 96 82 + +32 29 42 60 3 +85 93 16 41 35 +11 90 46 13 58 +26 19 79 30 86 +72 56 63 18 95 + +25 71 26 35 59 +80 21 11 24 87 +48 29 64 66 34 +74 83 84 60 57 +44 30 95 20 32 + +29 60 31 2 7 +51 78 32 45 14 +70 6 59 33 81 +16 26 11 38 88 +49 74 39 46 3 + +58 91 95 21 47 +61 52 30 2 96 +83 19 89 9 1 +41 64 28 23 11 +62 55 43 60 53 + +81 15 33 4 19 +51 97 88 70 13 +76 38 58 28 82 +67 3 6 22 47 +57 41 53 31 79 + +29 42 12 64 86 +23 0 14 28 82 +99 63 79 9 17 +75 73 3 45 1 +93 52 43 54 76 + +15 70 19 3 44 +47 60 46 93 59 +16 87 41 30 68 +88 9 26 45 43 +28 49 73 98 78 + +57 30 65 22 25 +99 21 36 47 11 +70 83 31 73 16 +61 77 94 93 23 +91 26 13 87 63 + +13 58 63 4 82 + 5 89 11 39 51 +12 43 75 97 8 +15 56 21 0 74 +23 66 62 70 44 + +37 25 82 80 86 +58 89 30 91 38 +75 40 87 50 67 +78 4 55 0 39 +54 64 52 96 45 + +61 57 42 74 26 +88 48 8 13 70 +81 69 7 97 10 +16 23 18 55 36 +11 46 68 39 27 + +37 85 59 41 2 + 3 29 91 87 84 +65 18 70 78 12 + 9 80 97 19 24 + 1 75 58 13 92 + +62 8 80 34 86 +72 6 40 57 3 +85 82 48 84 37 +79 29 70 21 96 +41 5 33 32 94 + +58 21 50 7 72 +34 71 93 35 90 +77 43 79 55 88 +57 12 45 95 70 +38 9 29 37 52 + +57 26 2 22 98 +87 4 53 17 97 +75 25 70 62 93 + 3 9 86 33 28 +58 50 72 27 5 + +16 15 71 64 94 +37 56 84 32 7 +54 99 73 20 8 +60 19 22 70 27 +69 83 79 48 77 + +94 38 0 31 19 +43 58 22 93 84 + 2 88 56 13 50 +90 68 46 95 47 +32 59 89 42 69 + +94 60 26 63 86 +21 64 81 47 71 +36 32 93 20 67 +16 10 68 39 74 +75 99 82 27 18 + +24 31 35 82 18 +49 16 98 90 26 + 8 64 25 87 92 +54 76 2 22 15 + 7 50 44 94 68 + + 1 31 72 28 18 +76 93 20 4 16 +35 54 49 30 10 +59 32 53 62 84 +99 52 92 75 25 + + 1 75 51 22 90 +61 83 58 63 28 + 9 5 85 43 92 +69 8 62 93 48 +84 31 21 82 78 + +99 6 70 73 75 +65 53 29 31 16 +78 61 37 90 7 +54 64 20 35 4 +97 44 1 10 3 + +73 50 53 24 49 +15 56 94 82 39 +31 40 65 79 44 +92 70 57 95 30 +21 74 55 3 64 + +44 42 78 31 37 +33 69 71 24 81 +12 7 23 8 30 +10 9 11 68 29 +93 28 94 63 87 + +87 53 75 85 0 +34 52 37 49 28 +11 72 2 86 62 +66 17 61 46 45 +13 96 18 99 29 + +50 76 71 10 92 + 4 99 46 39 86 +23 94 12 73 40 + 5 70 96 43 51 +55 61 67 18 15 + +51 88 97 58 33 +36 12 90 53 85 +86 5 42 6 2 +95 57 19 34 17 +26 1 77 78 20 + +61 17 79 97 10 +29 65 21 55 63 +19 88 74 62 6 +73 76 89 33 31 +50 30 12 22 39 + +18 94 15 17 26 +69 37 91 30 85 +13 67 25 84 58 +95 90 27 82 33 +20 56 62 4 65 + +58 19 17 83 89 +14 82 48 36 97 + 5 46 20 50 57 +60 92 52 85 9 +95 34 31 53 73 + +89 47 3 15 21 + 2 10 59 76 36 + 5 24 14 30 72 +37 77 57 48 91 +16 9 73 94 26 + +62 1 32 85 9 +13 52 75 34 84 +93 24 95 51 90 +86 35 22 72 38 + 0 46 96 88 7 + +67 80 84 34 4 +39 11 37 47 82 +29 63 57 86 77 +78 64 5 32 96 +38 69 55 87 50 + +91 26 89 87 54 +51 43 22 68 21 +74 62 88 38 53 +28 92 4 39 40 +96 97 73 72 29 + +40 83 35 5 91 +41 45 57 94 60 +61 31 59 47 95 +81 89 69 25 33 + 3 36 15 93 27 + +19 49 37 14 48 +96 55 43 6 12 +22 21 50 47 75 +78 40 51 91 63 +59 87 28 93 86 + +86 44 3 54 17 +71 82 70 88 49 +14 43 63 76 15 +78 81 61 22 46 +84 65 9 29 83 + +15 28 5 45 29 +12 19 64 93 48 +83 40 7 99 74 +20 30 85 67 58 +22 21 59 76 18 + +42 1 46 8 62 +69 27 67 68 38 +88 35 83 14 84 +53 85 82 29 59 +61 73 39 74 99 + +38 32 50 9 74 +75 66 63 3 62 +68 15 17 98 6 +81 29 52 88 21 +58 2 87 96 56 + +49 12 26 89 98 +92 69 90 50 35 +74 40 0 87 48 +19 47 65 42 31 +17 3 33 28 85 + +47 64 43 73 81 +32 49 65 42 24 +95 93 36 78 62 +34 96 79 10 4 +39 54 15 17 51 + +53 32 41 16 95 +54 47 56 69 17 +31 0 42 66 13 +88 9 43 38 79 +21 8 19 98 92 + +78 43 38 75 14 +36 62 64 45 53 +31 96 16 46 44 +93 11 57 56 65 +27 3 73 74 68 + +66 23 39 13 58 +40 85 68 50 57 +97 37 77 28 83 +48 29 51 84 91 +95 1 70 78 56 + +51 74 68 89 91 +49 54 8 83 36 +86 65 99 28 47 +82 57 32 81 58 +13 66 3 94 67 diff --git a/4.jl b/4.jl new file mode 100644 index 0000000..e74a733 --- /dev/null +++ b/4.jl @@ -0,0 +1,83 @@ +include("utils.jl") + +function parse_boards(lines) + num_boards = div(length(lines),5) + boards = Array{Array{Int}}(undef, num_boards) + for i in 1:num_boards + boards[i] = zeros(5, 5) + for li in 1:5 + values = map(x->parse(Int, x), split(lines[(i - 1)*5+li])) + boards[i][li,:] .= values + end + end + boards +end + +function parse_input(filename) + lines = Iterators.Stateful(non_empty_lines(filename)) + numbers = map(x->parse(Int, x), split(popfirst!(lines), ",")) + boards = parse_boards(collect(lines)) + numbers, boards +end + +function apply(number, boards) + for board in boards + for i in CartesianIndices((1:5, 1:5)) + if board[i] == number + board[i] = -1 + end + end + end +end + +function check(boards) + for board in boards + for i in 1:5 + if (reduce(+, board[i,:]) == -5) || (reduce(+, board[:,i]) == -5) + return true, board + end + end + end + false, nothing +end + +function solution4_1() + numbers, boards = parse_input("4.data") + for number in numbers + apply(number, boards) + winning, board = check(boards) + if winning + score = reduce(+, filter(>(0), board)) + return (score, number, score * number) + end + end +end + +function remove_winning_boards(boards) + last = nothing + filtered = filter(boards) do board + for i in 1:5 + if (reduce(+, board[i,:]) == -5) || (reduce(+, board[:,i]) == -5) + last = board + return false + end + end + true + end + filtered, last +end + + +function solution4_2() + numbers, boards = parse_input("4.data") + for number in numbers + apply(number, boards) + boards, board = remove_winning_boards(boards) + if length(boards) == 0 + score = reduce(+, filter(>(0), board)) + return (score, number, score * number) + end + end +end + +solution4_2() diff --git a/4_ex.data b/4_ex.data new file mode 100644 index 0000000..669a51d --- /dev/null +++ b/4_ex.data @@ -0,0 +1,19 @@ +7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1 + +22 13 17 11 0 + 8 2 23 4 24 +21 9 14 16 7 + 6 10 3 18 5 + 1 12 20 15 19 + + 3 15 0 2 22 + 9 18 13 17 5 +19 8 7 25 23 +20 11 10 24 4 +14 21 16 12 6 + +14 21 17 24 4 +10 16 15 9 19 +18 8 23 26 20 +22 11 13 6 5 + 2 0 12 3 7 diff --git a/5.data b/5.data new file mode 100644 index 0000000..abe5fe3 --- /dev/null +++ b/5.data @@ -0,0 +1,500 @@ +427,523 -> 427,790 +94,639 -> 94,951 +757,371 -> 465,663 +503,935 -> 503,148 +655,565 -> 655,951 +167,754 -> 710,211 +634,433 -> 245,433 +449,889 -> 449,509 +152,753 -> 207,808 +301,90 -> 301,982 +566,405 -> 482,405 +758,741 -> 847,652 +342,686 -> 921,107 +741,317 -> 741,533 +976,917 -> 976,664 +273,272 -> 273,899 +326,616 -> 326,478 +483,906 -> 391,814 +20,165 -> 20,349 +860,533 -> 860,137 +846,834 -> 846,610 +155,923 -> 241,923 +989,984 -> 17,12 +711,681 -> 82,52 +312,788 -> 312,281 +319,746 -> 892,746 +568,555 -> 757,555 +659,450 -> 940,450 +870,260 -> 870,487 +110,794 -> 604,794 +509,141 -> 509,99 +29,68 -> 29,713 +340,688 -> 820,688 +428,46 -> 902,520 +539,525 -> 539,210 +181,822 -> 806,822 +551,338 -> 551,79 +894,542 -> 894,151 +700,625 -> 700,60 +143,736 -> 143,770 +810,975 -> 54,219 +44,373 -> 44,514 +849,794 -> 120,794 +347,690 -> 97,440 +10,625 -> 57,625 +541,202 -> 799,202 +375,491 -> 809,925 +271,474 -> 271,905 +980,825 -> 980,908 +600,751 -> 624,751 +120,978 -> 958,140 +262,916 -> 262,794 +399,350 -> 399,666 +623,270 -> 158,735 +585,792 -> 585,381 +168,34 -> 168,88 +256,806 -> 566,806 +196,397 -> 326,397 +583,677 -> 172,677 +45,242 -> 311,508 +530,469 -> 433,566 +46,101 -> 877,932 +607,655 -> 485,777 +773,672 -> 461,360 +340,30 -> 659,30 +846,952 -> 846,917 +457,700 -> 125,368 +571,656 -> 561,656 +251,30 -> 576,30 +79,197 -> 79,87 +518,51 -> 518,904 +916,802 -> 181,67 +23,626 -> 485,626 +956,106 -> 956,811 +849,384 -> 743,278 +893,153 -> 893,608 +17,989 -> 933,73 +701,119 -> 701,704 +494,580 -> 494,821 +605,740 -> 605,363 +823,58 -> 823,166 +250,363 -> 566,363 +418,178 -> 783,178 +273,82 -> 273,115 +545,489 -> 656,489 +468,671 -> 966,671 +376,744 -> 178,942 +62,728 -> 589,201 +588,150 -> 467,29 +202,664 -> 751,115 +519,547 -> 916,150 +803,483 -> 380,60 +599,459 -> 922,459 +162,680 -> 162,385 +823,94 -> 18,899 +802,734 -> 415,347 +115,964 -> 115,935 +749,595 -> 749,770 +229,64 -> 582,64 +103,496 -> 551,48 +137,581 -> 707,11 +501,563 -> 895,957 +59,222 -> 620,222 +874,249 -> 874,938 +201,927 -> 927,201 +630,619 -> 655,619 +666,331 -> 413,78 +517,650 -> 425,558 +803,256 -> 803,598 +303,460 -> 606,763 +124,975 -> 967,132 +867,528 -> 867,363 +239,140 -> 239,211 +975,779 -> 364,168 +971,49 -> 531,49 +408,932 -> 143,932 +927,663 -> 392,128 +497,246 -> 497,389 +849,935 -> 15,101 +582,517 -> 543,517 +410,85 -> 237,85 +292,316 -> 841,316 +753,708 -> 753,38 +266,328 -> 267,327 +789,980 -> 16,207 +514,963 -> 514,180 +865,532 -> 687,710 +544,620 -> 956,208 +132,287 -> 557,287 +268,710 -> 268,684 +234,746 -> 234,688 +51,906 -> 51,911 +191,159 -> 428,159 +834,956 -> 834,565 +916,242 -> 230,928 +227,789 -> 227,689 +206,767 -> 705,268 +291,403 -> 578,403 +35,890 -> 956,890 +185,618 -> 402,401 +989,858 -> 284,858 +391,284 -> 391,74 +717,158 -> 670,111 +188,146 -> 785,743 +602,696 -> 602,367 +975,972 -> 975,317 +146,301 -> 146,205 +328,215 -> 861,215 +15,653 -> 990,653 +48,101 -> 48,34 +929,547 -> 506,970 +901,519 -> 670,519 +801,560 -> 19,560 +953,829 -> 876,829 +856,317 -> 856,787 +618,171 -> 86,703 +823,622 -> 369,168 +209,291 -> 846,928 +944,601 -> 944,544 +678,223 -> 987,223 +893,143 -> 54,982 +30,740 -> 244,740 +974,974 -> 15,15 +497,557 -> 63,557 +846,193 -> 846,964 +83,119 -> 946,982 +864,179 -> 864,387 +583,312 -> 77,818 +612,154 -> 612,641 +487,136 -> 487,938 +502,611 -> 215,898 +648,978 -> 648,885 +373,372 -> 318,372 +582,988 -> 168,574 +453,261 -> 899,261 +467,578 -> 33,578 +876,138 -> 683,331 +708,248 -> 132,824 +686,56 -> 686,211 +687,964 -> 687,485 +626,76 -> 626,222 +630,176 -> 630,485 +968,608 -> 968,382 +943,69 -> 943,856 +173,344 -> 173,902 +193,918 -> 326,918 +811,748 -> 379,316 +484,941 -> 113,570 +277,635 -> 156,514 +770,573 -> 691,573 +37,475 -> 464,475 +720,856 -> 676,856 +988,13 -> 25,976 +414,74 -> 140,74 +169,158 -> 29,298 +611,910 -> 611,718 +851,161 -> 507,161 +76,969 -> 76,114 +270,243 -> 976,949 +375,607 -> 325,657 +738,450 -> 196,450 +153,776 -> 153,325 +862,123 -> 862,535 +705,933 -> 931,933 +900,26 -> 35,891 +870,66 -> 79,857 +815,569 -> 347,569 +950,290 -> 757,290 +719,446 -> 317,848 +243,531 -> 671,531 +320,807 -> 380,807 +221,984 -> 221,858 +832,308 -> 832,950 +522,694 -> 584,694 +412,48 -> 412,328 +898,690 -> 646,690 +602,191 -> 106,191 +58,961 -> 58,879 +177,413 -> 147,383 +48,159 -> 48,639 +18,935 -> 883,70 +26,68 -> 406,68 +579,73 -> 579,523 +975,825 -> 975,737 +390,125 -> 737,472 +127,179 -> 127,111 +506,557 -> 576,487 +161,210 -> 324,47 +524,165 -> 524,67 +938,790 -> 184,36 +302,431 -> 548,677 +559,363 -> 559,913 +936,10 -> 176,770 +828,976 -> 657,976 +864,14 -> 864,607 +28,46 -> 28,347 +732,742 -> 732,615 +91,712 -> 91,279 +982,884 -> 772,674 +917,47 -> 683,47 +631,697 -> 83,697 +463,413 -> 463,949 +719,348 -> 197,870 +980,25 -> 24,981 +64,608 -> 410,954 +103,882 -> 103,842 +279,10 -> 830,561 +409,573 -> 409,247 +673,291 -> 222,291 +315,143 -> 942,770 +216,89 -> 80,225 +134,936 -> 967,103 +387,566 -> 82,566 +282,259 -> 862,839 +930,225 -> 930,775 +460,370 -> 460,922 +276,254 -> 518,496 +647,881 -> 293,527 +983,977 -> 90,84 +336,836 -> 336,392 +96,888 -> 963,21 +42,47 -> 978,983 +923,280 -> 726,83 +311,486 -> 505,292 +496,637 -> 861,637 +575,438 -> 575,498 +228,754 -> 228,599 +965,963 -> 21,19 +834,171 -> 730,171 +497,234 -> 497,448 +977,970 -> 977,618 +335,422 -> 335,640 +931,954 -> 36,59 +140,966 -> 871,235 +352,88 -> 449,88 +631,332 -> 735,332 +765,823 -> 48,106 +496,685 -> 103,685 +89,416 -> 89,37 +121,544 -> 569,544 +643,712 -> 596,712 +662,656 -> 739,656 +42,386 -> 42,697 +959,875 -> 959,527 +874,967 -> 120,213 +962,649 -> 240,649 +627,714 -> 266,714 +148,301 -> 148,383 +883,491 -> 883,605 +242,401 -> 348,401 +660,931 -> 420,931 +475,72 -> 955,552 +912,949 -> 912,881 +928,330 -> 45,330 +474,203 -> 131,203 +805,459 -> 818,459 +534,645 -> 639,750 +68,911 -> 933,46 +717,276 -> 21,972 +233,615 -> 957,615 +902,495 -> 902,867 +230,427 -> 230,421 +630,917 -> 845,917 +884,903 -> 34,53 +157,205 -> 157,409 +857,588 -> 608,588 +422,863 -> 422,469 +890,83 -> 722,251 +546,318 -> 138,726 +691,881 -> 52,242 +171,435 -> 209,435 +978,15 -> 702,15 +581,86 -> 581,282 +61,767 -> 61,903 +835,289 -> 835,941 +176,351 -> 707,882 +571,84 -> 571,788 +700,373 -> 700,650 +40,40 -> 945,945 +82,616 -> 809,616 +351,402 -> 455,402 +517,242 -> 73,686 +489,795 -> 814,795 +543,734 -> 611,734 +688,849 -> 688,571 +631,903 -> 883,903 +312,636 -> 667,281 +213,575 -> 699,89 +752,128 -> 161,719 +754,931 -> 754,474 +748,666 -> 748,54 +123,667 -> 57,667 +140,497 -> 140,644 +634,961 -> 187,514 +822,865 -> 822,126 +58,162 -> 632,736 +417,164 -> 166,164 +943,597 -> 943,274 +355,756 -> 355,167 +340,546 -> 232,438 +166,125 -> 166,96 +354,394 -> 354,579 +147,844 -> 155,844 +652,723 -> 719,656 +584,582 -> 667,665 +514,373 -> 685,202 +308,404 -> 966,404 +124,179 -> 916,971 +706,597 -> 455,597 +52,822 -> 510,364 +419,900 -> 860,900 +153,649 -> 872,649 +915,160 -> 56,160 +422,346 -> 422,38 +940,73 -> 940,784 +922,581 -> 922,753 +949,821 -> 949,621 +591,778 -> 145,778 +93,685 -> 164,756 +287,469 -> 287,948 +953,952 -> 446,445 +935,47 -> 12,970 +458,109 -> 458,639 +71,643 -> 644,70 +812,214 -> 812,655 +488,496 -> 158,496 +113,868 -> 755,226 +666,429 -> 666,920 +962,246 -> 517,246 +400,261 -> 400,713 +601,617 -> 943,275 +904,847 -> 120,63 +556,334 -> 278,612 +416,463 -> 59,463 +724,401 -> 871,548 +701,210 -> 426,485 +786,116 -> 786,904 +976,979 -> 157,160 +674,377 -> 674,891 +321,829 -> 891,829 +404,84 -> 404,800 +975,850 -> 906,781 +753,331 -> 978,331 +87,240 -> 87,383 +167,390 -> 167,20 +258,931 -> 107,780 +672,313 -> 696,313 +589,88 -> 589,13 +637,65 -> 637,808 +532,610 -> 532,756 +612,482 -> 318,482 +522,322 -> 135,322 +89,49 -> 89,679 +475,506 -> 475,973 +385,348 -> 229,348 +633,978 -> 633,255 +978,833 -> 978,436 +746,553 -> 707,553 +970,820 -> 970,548 +589,59 -> 589,19 +674,890 -> 16,890 +838,315 -> 413,740 +39,129 -> 860,950 +923,755 -> 425,257 +757,929 -> 940,746 +639,390 -> 104,925 +650,512 -> 260,902 +718,90 -> 987,90 +352,228 -> 795,671 +141,629 -> 491,279 +755,616 -> 368,616 +117,113 -> 707,703 +206,73 -> 926,793 +372,415 -> 372,130 +894,632 -> 611,632 +974,554 -> 878,554 +823,710 -> 823,972 +730,711 -> 582,859 +94,912 -> 108,912 +782,190 -> 88,884 +668,567 -> 336,567 +87,266 -> 327,506 +738,303 -> 36,303 +320,358 -> 445,358 +566,725 -> 695,725 +94,364 -> 94,64 +884,184 -> 159,909 +947,575 -> 947,662 +658,741 -> 658,470 +512,776 -> 512,960 +96,757 -> 950,757 +349,604 -> 349,760 +459,247 -> 355,143 +90,12 -> 95,12 +28,27 -> 981,980 +388,959 -> 508,959 +704,194 -> 148,194 +349,546 -> 349,259 +30,38 -> 720,728 +307,631 -> 307,282 +520,417 -> 154,417 +746,771 -> 924,771 +838,932 -> 20,114 +406,141 -> 406,75 +15,35 -> 963,983 +264,143 -> 948,827 +545,899 -> 742,899 +759,356 -> 309,356 +686,707 -> 224,245 +226,985 -> 962,249 +826,628 -> 826,637 +985,329 -> 683,631 +586,283 -> 586,258 +602,703 -> 243,703 +419,883 -> 419,556 +475,375 -> 211,111 +981,15 -> 19,977 +989,10 -> 10,989 +238,350 -> 479,591 +720,714 -> 603,714 +969,985 -> 35,51 +844,356 -> 837,349 +450,354 -> 450,834 +385,870 -> 385,758 +911,856 -> 89,34 +948,124 -> 989,124 +439,556 -> 439,310 +990,233 -> 990,633 +747,723 -> 943,527 +418,23 -> 804,23 +876,96 -> 38,934 +556,92 -> 532,92 +727,155 -> 727,279 +674,545 -> 940,811 +118,879 -> 420,879 +141,50 -> 426,335 +591,180 -> 591,537 +662,511 -> 681,511 +776,858 -> 776,956 +872,329 -> 87,329 +183,985 -> 114,985 +186,179 -> 186,801 +354,933 -> 491,933 +10,223 -> 759,972 +112,626 -> 702,36 +498,78 -> 161,78 +196,61 -> 814,679 +629,71 -> 116,71 +23,281 -> 23,32 +819,810 -> 432,423 +187,276 -> 187,912 +95,683 -> 576,683 +125,813 -> 856,82 +98,882 -> 140,882 +843,909 -> 198,909 +192,904 -> 192,335 +375,342 -> 375,668 +61,804 -> 61,832 +475,387 -> 966,878 +822,740 -> 822,186 diff --git a/5.jl b/5.jl new file mode 100644 index 0000000..9df8ac6 --- /dev/null +++ b/5.jl @@ -0,0 +1,67 @@ +include("utils.jl") + +function parse_input(filename) + map(non_empty_lines(filename)) do line + collect(map(x->parse(Int, x.match), eachmatch(r"[0-9]+", line))) + end +end + +function solution5_1() + max_x = 0 + max_y = 0 + lines = filter(parse_input("5.data")) do line + max_x = max(max_x, line[1], line[2]) + max_y = max(max_y, line[2], line[4]) + line[1] == line[3] || line[2] == line[4] + end + board = fill(0, max_x + 1 , max_y + 1) + for line in lines + if line[1] == line[3] + if line[2] <= line[4] + for i in line[2]:line[4] + board[line[1] + 1, i + 1] += 1 + end + else + for i in line[4]:line[2] + board[line[1] + 1, i + 1] += 1 + end + end + else + if line[1] <= line[3] + for i in line[1]:line[3] + board[i + 1, line[2] + 1] += 1 + end + else + for i in line[3]:line[1] + board[i + 1, line[2] + 1] += 1 + end + end + end + end + length(filter(>(1), board)) +end + +function solution5_2() + max_x = 0 + max_y = 0 + lines = filter(parse_input("5.data")) do line + max_x = max(max_x, line[1], line[2]) + max_y = max(max_y, line[2], line[4]) + true + end + board = fill(0, max_x + 1 , max_y + 1) + for line in lines + x = line[1] + y = line[2] + board[x + 1, y + 1] += 1 + while x != line[3] || y != line[4] + x += sign(line[3]-line[1]) + y += sign(line[4]-line[2]) + board[x + 1, y + 1] += 1 + end + end + length(filter(>(1), board)) + # transpose(board) +end + +solution5_2() diff --git a/5_ex.data b/5_ex.data new file mode 100644 index 0000000..b258f68 --- /dev/null +++ b/5_ex.data @@ -0,0 +1,10 @@ +0,9 -> 5,9 +8,0 -> 0,8 +9,4 -> 3,4 +2,2 -> 2,1 +7,0 -> 7,4 +6,4 -> 2,0 +0,9 -> 2,9 +3,4 -> 1,4 +0,0 -> 8,8 +5,5 -> 8,2 diff --git a/6.data b/6.data new file mode 100644 index 0000000..afcd5e5 --- /dev/null +++ b/6.data @@ -0,0 +1 @@ +2,1,1,4,4,1,3,4,2,4,2,1,1,4,3,5,1,1,5,1,1,5,4,5,4,1,5,1,3,1,4,2,3,2,1,2,5,5,2,3,1,2,3,3,1,4,3,1,1,1,1,5,2,1,1,1,5,3,3,2,1,4,1,1,1,3,1,1,5,5,1,4,4,4,4,5,1,5,1,1,5,5,2,2,5,4,1,5,4,1,4,1,1,1,1,5,3,2,4,1,1,1,4,4,1,2,1,1,5,2,1,1,1,4,4,4,4,3,3,1,1,5,1,5,2,1,4,1,2,4,4,4,4,2,2,2,4,4,4,2,1,5,5,2,1,1,1,4,4,1,4,2,3,3,3,3,3,5,4,1,5,1,4,5,5,1,1,1,4,1,2,4,4,1,2,3,3,3,3,5,1,4,2,5,5,2,1,1,1,1,3,3,1,1,2,3,2,5,4,2,1,1,2,2,2,1,3,1,5,4,1,1,5,3,3,2,2,3,1,1,1,1,2,4,2,2,5,1,2,4,2,1,1,3,2,5,5,3,1,3,3,1,4,1,1,5,5,1,5,4,1,1,1,1,2,3,3,1,2,3,1,5,1,3,1,1,3,1,1,1,1,1,1,5,1,1,5,5,2,1,1,5,2,4,5,5,1,1,5,1,5,5,1,1,3,3,1,1,3,1 diff --git a/6.jl b/6.jl new file mode 100644 index 0000000..1b2d34b --- /dev/null +++ b/6.jl @@ -0,0 +1,19 @@ +function solution6(n) + initial = parse.(Int, split(readline("6.data"),",")) + fish = [count(initial .== i) for i in 0:8] + for _ in 1:n + fish = circshift(fish, -1) + fish[7] += fish[9] + end + sum(fish) +end + +function solution6_1() + solution6(80) +end + +function solution6_2() + solution6(256) +end + +solution6_1(),solution6_2() diff --git a/6_ex.data b/6_ex.data new file mode 100644 index 0000000..55129f1 --- /dev/null +++ b/6_ex.data @@ -0,0 +1 @@ +3,4,3,1,2 diff --git a/7.data b/7.data new file mode 100644 index 0000000..4407d6f --- /dev/null +++ b/7.data @@ -0,0 +1 @@ +1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,478,1187,253,1892,900,155,20,787,17,248,1397,407,167,686,638,1020,960,124,840,220,1824,700,373,4,551,229,294,567,254,350,1144,679,124,361,145,483,335,202,1334,367,60,870,11,557,482,645,672,1296,1538,427,78,542,1135,13,65,0,140,705,13,642,187,1085,36,1118,349,601,382,584,941,26,949,200,763,198,430,204,1352,1135,210,342,11,1089,830,1523,9,523,167,762,254,805,8,132,29,102,1299,936,756,59,134,183,235,316,139,48,182,44,88,213,113,93,169,565,601,1899,1191,189,796,770,32,1183,365,374,867,918,1084,86,75,20,47,99,1140,2,99,1024,366,455,752,556,1220,66,326,450,213,1,342,756,49,675,160,280,68,221,193,379,88,179,94,16,109,570,1145,1207,824,355,1389,1601,168,86,236,923,120,759,14,478,460,84,167,1723,1005,269,6,171,861,311,832,952,701,3,1598,1466,96,780,57,161,631,572,276,105,594,276,17,405,688,1444,173,23,199,177,689,19,565,472,151,986,76,379,1430,212,928,106,25,143,84,833,942,860,1555,271,239,720,596,1209,235,535,361,1794,79,283,275,17,342,1687,1434,173,967,740,217,1370,18,1579,1259,546,94,623,475,834,1000,456,101,520,120,1023,360,167,213,617,42,1149,629,760,17,33,27,1347,414,646,1116,1340,134,259,143,407,249,328,968,677,241,438,98,313,27,791,1,634,3,918,1482,213,123,444,45,24,26,26,1203,64,67,1562,1,4,298,12,384,32,443,37,268,674,356,202,286,694,272,163,950,1022,54,59,21,73,519,462,106,76,1112,10,72,388,194,6,120,9,645,209,1121,75,599,362,661,439,69,62,339,390,23,1247,365,1266,4,246,511,47,467,134,276,497,130,458,427,669,1191,701,917,168,1191,294,641,236,801,375,106,872,800,87,356,583,1096,253,459,951,1331,719,66,1091,525,15,370,290,141,1201,30,43,37,76,1131,616,297,172,402,1016,654,301,63,872,303,69,1195,502,351,52,1659,86,104,294,807,166,120,190,333,60,283,819,198,184,144,278,343,1395,496,103,705,485,172,642,225,181,583,188,38,436,801,91,5,634,180,28,20,146,488,676,121,420,965,220,1564,1011,241,423,3,1631,709,106,725,164,1032,65,205,503,188,397,1072,49,121,761,721,249,418,87,126,258,712,500,435,157,127,681,108,270,647,504,505,83,407,212,165,1177,160,715,1292,491,195,141,25,829,1316,242,754,364,1707,33,594,434,488,368,298,183,1156,29,1674,537,378,8,9,860,240,571,749,471,331,501,156,62,427,1103,52,12,832,1198,284,388,827,556,194,288,218,397,84,1485,95,401,739,986,994,305,668,1324,1437,312,993,15,822,923,707,135,42,423,37,1183,1344,997,19,699,395,119,7,168,1711,50,151,38,20,163,686,1364,21,24,411,32,335,188,55,628,274,1766,439,180,286,1024,87,15,1498,290,561,971,32,294,67,113,219,42,18,715,3,664,242,583,221,1045,236,74,46,1612,639,325,164,100,69,518,38,502,26,329,112,1174,127,124,90,144,527,468,152,1098,800,125,349,191,290,191,27,651,446,267,9,1304,269,586,64,983,152,236,512,8,248,177,109,311,957,47,126,69,13,709,204,381,1151,580,340,994,865,258,190,9,1149,930,1128,321,100,471,0,507,1308,326,585,813,1088,76,174,333,387,631,186,430,988,24,820,11,45,173,167,1494,98,1467,456,167,21,1363,1173,394,318,1601,1111,1249,757,282,672,1227,1214,277,336,815,136,1192,681,689,431,130,1488,154,465,14,709,339,1123,68,151,1280,143,1797,23,250,1231,1007,302,1103,2,585,552,1732,994,225,771,1495,82,229,700,910,15,38,159,1122,316,1044,711,1436,920,1722,523,1398,188,443,1032,93,33,397,272,187,24,489,53,79,1277,671,1094,68,1705,984,1096,512,145,389,167,161,1174,94,4,534,1295,648,75,24,366,995,175,220,714,843,412,267,634,1209,66,1094,125,822,1114,1513,694,1520,30,676,817,245,26,77,1146,552,143,165,39,343,971,87,0,90,1434,588,616,99,297,1034,114,5,702,917,582,733,31,54,820,0,212,192,282,33,639,1661,460,75,680,115,178,194,271,274,582,1008,89,139,611,707,0,376,65,9,161,135,40,134,566,66,601,95,817,745,202,352,447,322,842,6,1247,175,468,330,608,368,139,21,29,486,121,9,1293,298,73,328,302,145,889,1794,677,56,952,520,80 diff --git a/7.jl b/7.jl new file mode 100644 index 0000000..26793a3 --- /dev/null +++ b/7.jl @@ -0,0 +1,14 @@ +function solution7(costfunction) + start = parse.(Int, split(readline("7.data"),",")) + min(map(x -> costfunction(x, start), min(start...):max(start...))...) +end + +function solution7_1() + solution7((x, positions) -> sum(abs.(positions .- x))) +end + +function solution7_2() + solution7((x, positions) -> sum(div.(map(n->n * (n+1), abs.(positions .- x)), 2))) +end + +solution7_1(), solution7_2() diff --git a/7_ex.data b/7_ex.data new file mode 100644 index 0000000..18bd32a --- /dev/null +++ b/7_ex.data @@ -0,0 +1 @@ +16,1,2,0,4,2,7,1,2,14 diff --git a/8.data b/8.data new file mode 100644 index 0000000..a4de956 --- /dev/null +++ b/8.data @@ -0,0 +1,200 @@ +dcagfb cbegda cabdf bagedf dcb cd dcbegaf aebcf bgdaf dgcf | dacebgf cbafd dbacf cdgf +dfgbc ceagbd egb cgdae eafcgd ecbgd eb aefbgcd bfaceg deba | baed ecabgd aebd cadfebg +acbd bagfec bedcf efbca dbfecag gadcfe dc dbcaef cde fbegd | deacfg bfagcde bgedf cde +dgec dfc fabgd bfcgae dfbcg baegdcf cd fbdace cdbefg becgf | cedg adfbecg badgf dgbfc +be bacedg dfacb fbge deagcf eba egacf gcebfa febac dbgacfe | befg be egbf aedgcbf +gafbd gbafce agced fdgae bcedgaf gdeacb efdc eaf fe cgeadf | cgdae fdec fcdeabg ef +cdaefgb cfadbe gc afgcbe afedcg faecb cabg egc bfgde bfgce | fbaedc gc abgc bfcea +egcafb adgecf caebf fdgbaec fbaed cebg facbgd cfe fgabc ec | fbgca deagfc ce ce +fcdab deb cdbfea fecb befcdga abecd gdcae efbgda fcdgba be | cfbad dacge gbdeaf bed +afdecg gfcadb ecadfbg facgd ed egda efbgc ecd cdegf bfadec | becgf fcbeg de cgefb +caedbg gcfdba bfdae ge beagfdc bedag gcabd egac gcefbd deg | fdbecg acge bgfacd abefd +befad ecgad adgefcb febg gb afdcbe dcbfag beafgd dbg eagdb | feabd aedfb gbd aebdcf +bcfde acbfed dcaf dbcae gacbfe fc dgbcae egbacfd fcb edbfg | gbdfe gbeafc bcf cebfga +cgbade adcbgfe fb efgbad gbcfde aecfd edgba afbg bfeda fbe | ecafbdg bfdea fgab edfbgc +cbfa gefbd bcfedga bagefc ab bga ecdgab gbaef gfacde fcage | acdegf gab cegadb gab +cafbeg dfaebc fdca dgcbe eacbf fde debgfca egabfd dfceb fd | df eabcf egbdc dfe +egcdfa ebdac fdaecbg ed fdacb agecb cbdgaf ecd efdb dbaecf | dcabf cbeag ebdf ecgba +gacdebf decfbg afbdg dcagbf cg agdbc agcf ebcad abgedf bcg | badec dcbga cgfa abcde +fgcad dfebga gdbef ec ebcd fbcgea ceg fgedc defgbac dcfgbe | ce gbdfe fbcgdea fcgbdea +cgbef afcbeg dgbec ebafcd cgbfeda adbge cd ecd gfcd fgbdec | edc gcebd fegacdb cd +bafdcg egfdc bcfge dgeabf cd cgbadfe agefd facegd eadc cgd | cgd dcg defbagc cfdbega +degfcb fdg edabgf cadge fg gfcb cdeafbg bcefd dgfec beadcf | dgcbfe cabfed fecbd cgdfbea +dbfaec bfcgae cdb cdaf defbcg abgde ceabf adceb decgafb cd | fcda bdc dc afgecb +cead efcdg adbcfeg fagdc def acegfd fcbagd cbgef ed fgdaeb | ecad fcaedg cgadf cfaged +egdbfa cbgefad dgacbf cb dfbgec gefbd cbf gefbc gcefa bdec | ebcd ecgdbf fgebc cfb +fagbe acbged bf eagcf dgaebcf gbf febadg deabg cdagbf fbed | fbcdag fgeca abgdcf cdbage +baefc febgadc fcag dbgec feg gacfbe gfecb afedgb fg edafcb | aegdfb feabc agbfed fabged +gfedcb eadgcf fed befdagc gaedf bgdea bdafcg fe acdfg feca | bcfdga cagfd afce efca +cbfed degfba fgdbac acdg fdcab ac acgebf agdfb bac gcbfdea | cbdegfa caefgbd ca gdbcafe +dbcgea dc dcg cadf abgcdf efgdb afgbc gefacdb fbcdg agebfc | dabgce gbceda dgc dc +ef dgfbc cefbg gabecfd agceb feg gbcadf dfbe fcdgeb dfagec | gfe cafegd dfeb fe +ebgdc egdacb dfbcega dfe dbfge bagef ecdbfg bdcf df fgecad | dbgce fd cfdb edf +bdage ab fbgaecd aefb bfadeg gefad cdgeb agcbdf gba fgcdae | cgdbfa befa dgefca acebfdg +aecb dbgecf eagfcb ecdbfag fdegba geacf gebfa cge cgdfa ec | acgfe gec cabe fgcda +acd cafg abedcgf cfebda efcbgd cegfd ca cdgafe agcde bgeda | egcfbda gcfdae gefacd dca +dcefga gdefa db fbaed abefdgc faebc fbgaed bdf gbed dcafgb | bfd db db gbdfae +befac abcd bdcfe ecd cd baegfc edfgca adfbce aebcdgf edbfg | cgedfab feabc cd dabc +eacdgf cebgdfa acgebd ecdba dbcfea fdgcb dag ga acgdb abge | ag ga adg ag +gca fagbe dfageb bagce ecgfab gfce gc dcfeabg fadbcg bedac | afbdceg gadfeb cga acbdfg +gbad febac dea gadbecf fdegbc edfacg da bdecg cdbea bdcgae | dbag cdeabg gcdaeb adbg +cdgfeb cbeaf adef cfa fa aecbg fedcb acdebf bdcfga cdefbga | fdea eadf efad caefb +aedgb df cgbaed gdef bfcgda bfd efbac dgfeab debfa aegcbdf | acbfe egfd afebgd gefd +badcfe fcbg bf dfecbga faged gfadbc dfb dfgab abdcg dbceag | bf fb dafbgec fbd +bdae decgbf afcbge bdecfa afcbd edgfcab ebcaf bd dfacg dbc | ebda db cbd cbd +acfgde ae eac agbdec gadcb ebgcafd baed gfcbe cgabe bfgadc | cea fecdga ebgdac eac +cbedga cfb adcbe bfae afcdgeb cgdaf fcedab bf fcbdeg dacbf | dfceba fcdga fbc fcebda +cdafg dfgeac fc dbgcef gadbc gacfebd dcf edfgab gefad caef | fadgc facged adgefb ecgbdaf +gdcbf eabdgf gaefd fbdge afcedg bacgfe fagbedc dbea efb be | ecagfb dgaef be eb +gbecad faced abgedf cd cbfd abedcf dacgbfe cde deabf agcfe | cd edbfac cgabed daebfg +cgebaf dacbge gafed eadbgf dgcef ad fadgbce dea bgafe dafb | fegad dgeaf ad gdfae +ecfadb eagdbc afbcdge abfcgd cf bgedf agfc cfd gbfdc bcagd | fcga fcd befgd gdbfc +afcbg gfeb gfcad ecgdba cbf cafbeg bacge fb ebdfac baedcfg | fbc gabce egabc fcadg +agd gadbc da agcfed gcebad dgfcb ecabg ebcagdf eadb becfag | fgbeadc bcega geacb gceab +gaebf gfdbce aefbgd fde aefcbg ed dcaebfg agde aefdb acfdb | efd agcdebf cbgefd ebgfa +cdgfe ecbafd ebgca ad gedbcfa cad adbg cedabg egcad fcebga | gbedac adgb ecdgab daceg +efcb fcdag begdfa egcdf edf fe gfcdeb cdbega geacdbf becdg | dagfc gbadef decbg fe +bgaed agfdc fdgea fae fabcgd gcfe fe decfga afgedcb facbed | gdafe ef eacfbgd fe +ebgfca def fd ecgfbd efbda eabdg edgcfba afdc ecbfa bfdaec | abcefd fd dafc debcagf +eacbg efbdgca fdbga gde abecdg beagd cdeafg de cebd ecagbf | gaedbc gdcbafe gaecdf bgdeac +bafce cedb edacgfb fbgac fbe aedfgb be cbedfa cdefa eacfgd | be acbfg gfbac edbc +dgba cbgfdea gbe fbaegc cbedga fegdc decafb cdbge bg daecb | cadfbe bgad beadgc bgedc +abd fdbcae aedfb daec ad bacfdg dgefcb agbef cbefd cbagdef | ad dab acde da +cdagbe dagbe fageb gdfbeca gdcba edac dgcfba egd egcfbd ed | fbgcad cafdbg de facbged +dbecf egadfb cfagde da fcebga cagef dae fadec dagc dfbcaeg | da dgac bfedc ad +efa adcf fgcde acgeb bgedfa efcga degfbc aegcfdb fa efdgac | cfgea fedgc ecagf efdacgb +fecga eafgd acgefb cf gceab fbcdag gecdafb cabedg fbec gcf | agcbfd gfc cgf ceagf +egcaf ecdafgb dfgea cbafe dfebgc bgac cbagef cg gfc ecdfab | edbfgca edafg cgf gfc +afdcgb decgb fbdegca fbgae fdbaeg dgfbe gbafce df fdb efda | gcbed dafe gbfdca aefgb +gaebd baefg cfadbg fb gaedfbc gadbef cfgea bfde baf gacdeb | abf cdbagf aecbdg fagec +cfdb dcg geadbf febdg edfabcg dc bgecd eabcg fcgead cgbfde | dgc dc bdfge dcfebga +dfbcaeg fdgcae gfdab bagc gabcdf fecbgd cadgf gb fbade bdg | bdg gacb bgac ecfbdg +eg befdg fceabd badfg dbecf egbcfa bedgcf gbacefd egb dceg | beg faecdb gfdbe dbacef +cdagef edfca dgfa fca fa agedc gfcabe bdfec bdcage fbcaedg | caedbfg ecafgbd fdcega decgfba +gfc cfeb cafgdb fc aedgbfc cgdfe degfb aedcg fbegcd dfgbea | acdge fedbg agedc ebgdfa +aegdcb gde dgbfca eg bdecfga fedbgc gcbfd fgecd bfge acefd | ge debcag bgedcf bfeg +gbd eagbc cbefagd gcde aefdb gcebad cgdafb dg aegbd facbge | cdeg cged ebdaf gbd +eagbcf cba aebd cdfga cdegbf afcbedg dcbfe ab adfcb acfbde | bcfeag fgdcbe daeb bdae +gc dabcfg dcfageb acg ecabf bgadef facge gfeda ecdg fagced | gcde efdga agc fgaed +bcgdea bacfdg aeg cdabg dfeagc befgd aebc dabfgec ae degba | ebfdg egadcf aceb gbdac +ceadf defagb fg agbed dfgaebc bfaecg eacdbg afgde efg fgbd | gf egbda fabegc badfgec +begcfd fdecb fbdga ca bace cfadb egfdca cda cfaedb efabdcg | gacefd fdgba fcdebg bcae +bcga agbefc fageb ca afc debfc dafegc fdgeab abfdgec fecab | gdafceb befac fdecga ac +fce adcfg cgdefa bgcfda fdae acegf fe cgbae adgfceb cdegfb | gedacbf fdebgac deaf afde +agcf dbegf bga cfeba gfdebca fgaeb cbdefa ag egadcb cbfega | fbdge gcabef cagf ebdafc +aedg ge decbga bafce ecg gcdab degfcab gcfdeb ceabg abdcfg | cbfea ecg bafec eacfb +gfdceb cgb bcdfe gebdc egcabdf egcf bafcgd bgdae edabfc cg | gbc bgdfca cgfe gc +bg bedcf dgfaec fdbgc gcbafed fbg bfaged gadcf cgab acbgfd | agfbde bg bgcdf fgb +gafcb cdfgab abfcge cbgde bdcfae ea faeg dbgcafe ace agebc | decbaf fbacde bcagf ace +bgfdac cgabdef efdca fagce febagc cd fcd dfeacg gdce aefdb | dc dgcfba ecdagf gfacbe +bde eb egfbdc ebgfd fbdgc daebgc cagfbd gfbceda efbc aedfg | cgebadf becf cfbdg cfbedg +ebcdfag fadec daceg gbecaf eabcfd fd fad aebfc fcgbad efbd | dcefbag fceagb fdecabg adf +efgd fd bfagcd acefb febad gdbaef edcgba badge dbgaefc daf | eafbd gbcdfa gdfe edgba +cefdag bfagec bedcg da acd bcfead bdgcefa gcaef acdeg agfd | geacbf faegdc fcdgbea eacgfdb +bcedgaf bgfae cab bdcg cb gcade egdacf abdegc agbec becfad | gfcadbe adgbec gebfcda cfaedg +gf edbcafg cfge gdafe gdf cdabfg eabdg dgefac acfed fbceda | geabd cbgdfa ceadbf agbfdc +fcbgde fbged cgfdb gdebcaf cfge ebg deabf baedcg ge dfabcg | beadf ge dcbgef cfeg +eafdcb gcdfbea eag dgcba gacdef agebd dbefag deabf ge fgbe | fcbdea bgcdeaf dbgac fagcebd +dc fgebad ecd aedcfb cdga ebcagd dfbaecg adebg debcg gbecf | bcegd gcdeb dacg eagdb +cad feabgd fadegc bgcdfea gbcfa bgcda bgaced decb dc ebadg | acd adfbge cd dc +af cfbge fadecg afbgc dbaf gbdfac bdgeacf dbcga cfa gebcda | fa dabcg dafb gbceda +fbgdea gcefa agfdb fecdba egbd fdgea de bagfcd gdcbafe dae | ed eda abdefc fadgeb +fdbcga fdbae bfa adfcge gcbfaed bfeg fdage eacbd fgbaed fb | bdcfage fbeg eadfbg gbef +cfdbga fdeab gefbad bcaefd egad fdaegbc ag gcefb afg agefb | abfgecd egda bgcfe adefb +fbeda ae dae bdgfe gcadbf beac fedabc badfc ceagfd dgcbafe | bfcad gfabdc aed fbdac +fgcaed bagcef bdfc edabg efacd ebcadf fb afb abefd agfbdce | cfdb fb abf abf +fed bfaedc fceab edabg bfdea ecdagf begfdac df fceabg bfcd | cebgfa df eagbd gafced +egfdc fcg cadg dfebc dfebcga cg dgabef ebgacf dfgea gcfade | fbedc gcfed dcag fgc +fcbde fbeacgd afedb da fcegda dabg ebgaf dgfaeb dea febagc | da bfdce egfacb ad +fcdeg cdbe fgcab dceagf febcg eb cebdgf geb edfgab dbgcaef | abgcfed bdec gdcfe cfgdbe +degfb ebdacf edbfcg agdfce dbf bd bgcd dgfce gfdcbae abegf | gebfcd fgeab gecdfb gdafcbe +egacd abedg decfgba dagceb ca cabe cag dagfcb badfeg cegfd | gca caeb cfgde ca +gfa ebafd fg gafdbec gaecfb gbdfa edfg gaedbf bdgca ecadfb | fbagec fecabd caegbf fg +dfgce cgfbe cefad bfdace fcaged cdg badceg fdceagb dg afdg | gcfbe dg gadf edfabc +dfgbc cbfeda bdgcfe fdb efbg bf gcedb fdaecgb gdecba fgadc | bgdafec bgcde fbgdc agdfc +fgecd dbegfac adbfgc fa bdcage acegb eacgf efab fca fceabg | gafce af gdcbea af +fgdacb fbdec adb gfda acbdegf edbcga cfgba da cbgefa cadfb | gbcfea bgcfda da dab +fbcdg abfcdg cfegbda ed dbcaef gedcfb aecgb dcegb ced egdf | cabfgde egcdfb fbcade dgcfab +dbec fcd cegbdf dc fdacgeb abdfg baefcg gbfcd dafgce gfbec | dcf cfd fcd agefcb +fcdeg gdefb cfgadbe fb bef bfcg edfacb fecdgb gcdfea gadeb | efb feb fbcg dabge +acebd dacfg bdf agdcbfe gcafdb fcegad afgdbe bcfg bfcad bf | dbf bdaec bf febacdg +acdegf bdfa afdebg febcga gaefb fd fed dgefcab bedgf edbcg | efgdab aecdgf cedgbfa def +ecdfabg dfge cedfba fcadgb fgabd ebgfad fea egafb bcgae ef | efgdbca eagcfdb defg bfgda +efacgd bfda bcadg gab gbceadf ab cfbdga gadfc bcgfae dgbec | fgecad dbaf ba abfgdec +bcgaed fbgc edcfg dgbecf fgdae dgc cg abdcef gfcbdea ebfdc | cg cdfeb cg edbcfag +cagb fgcdeab gdebaf fcegd ecabfd acfeg ag afceb fga acgbfe | ga agf bcadfe fag +fbgde efbagc ecgd efdgabc ebdcf fdcgbe abfdg fcbead egb eg | dcge cedbgf fbgad acegfbd +febadcg cfdbge bgcef gecd ed gbdaf bfdeg deb gfabce fcbead | efdbca ed fgcbe cebdaf +eagbc cgde cafbg abdge fbdgae gacedb aec ec acefbgd abcefd | bgacf cgbfeda agbed dgec +efgbdca gfdb cadbfg dag dg degfac bcdaef gdacb bfcad agebc | gda dfagecb gcfdea dag +gefab bfde acbfgde gfdac ebfgad bfgeca aegbcd eda gfade de | gafbce gcfeabd aefgd fgbcae +gaecfb cdebgf fec ebcafgd bgecad cf debgc bfead ebfdc cgdf | cdbfe gfcd egbdca edfcgb +cfdeba bfgd gcedfa gbdae dgefcab cbega dg febadg agd bdaef | dfgb adg gecdfa fcebda +dea bgdeaf da befdc gdcfaeb ecdbga abecd gacd bgafce eagcb | aedcb facebg abfecdg bagefdc +gcebf dfbae dbgcfe egdc dgebcaf febcd bcd cagfeb fdgcba dc | bcd efcbd daefb agbdfce +fa acged bdfec afeg gcfadb bfdagce ecgafd caf acdfe dgaecb | debfc af afge adegc +bacfdg fadbe egbdfc ba bage acefd baf bgdafe fgebd gdacbef | dbfage bgedf aedgbf acedf +acgb dgcbfa dba edgbfac acdefb begdf bdgfa dceafg dcagf ba | abd dfbge abd gacb +gcdea gc agfdce egdfa egcf fbeagd aecbd dgc fcebgad cagfbd | acebd egcf defag gfadceb +fab begadc ebcad dfbea gfcdab acdfgbe fa fedgb adcfbe feca | cbgead bfcdega fba gbadce +gb efcagd fgcad cfbg bedca abg fcgbda dgbcafe acbgd bdafeg | abcdgf bcgf cgfb bg +fbcagd fcdae beacgf gf agf baecdg fecag bgfe cagdbef gbcea | edbagfc ebfg gebf bgcae +cdgfea bdeacf aefcgb dbca beafc bcgdefa ebdgf ad defab ade | dbcgefa da ade bacd +bcgaedf badecg cfegb afceg dcbf egdbfa gcedb gbf bf fgcdbe | bagfed bdagfe fdbc gefcbd +cegba bgeda cgefa cbde fegadb dagcbe acfgdb cb cbg ecbdafg | cdegabf ebgda bfgade ebgac +afbdg gdabec gcafdeb fc cfdeba bcf fgebdc cefg gcdbf ecdbg | fecg cdbefg gdbfc gfce +bgdfa egbf bcdgfa fe dfcbea aef feadgb edcag dagef afdcegb | fea cbedfa acdfgeb dfgeab +eacgfd caegdb gbfecad bdfce edcfa dgaf fea fa egdac aegbcf | af fa edbcf gdeacbf +baefg fedabcg gbfac gacbfe cb dfageb dcfag cgb bcea cfdegb | cabe eabc gfacd fgdcabe +fgdeac cgd ebdfga agefdbc bfcegd cdgbf cd cfabg dceb befgd | cgd cfgab fdgeb efbgd +aedgbf cgebda dbcagf gbf gbefd gdecf gdfabec fb eabdg feab | bf fbea cefdagb adgbe +fcgea fbgedca gbecfa efbadc efgd fcagd df cdfaeg fdc acgdb | efgac fcd dfceba fegac +egdfac cab cadbf gbdaf bc eadcf dcebagf dbecag fbdace cebf | cedabfg cgbaed bc efacbdg +be abcged afcgb ebg bgefc gebfcd cgefd efdb gdeafc daecgbf | gabedc dbeafcg debf febcadg +dgebafc cefdbg db edfb fcgdb fdceg dgecfa bdc abcfg baecdg | fegdca baecdfg bcd bd +fbgead cfab cdbgefa agcbdf aedgc fgcbd fa fagcd ecgbdf gaf | adgcebf gaf gaf af +debagfc eb fcedba ebc cgdab efdgac befa eadcf edabc gdbefc | bcdagfe fbae ecadb eabf +gaedcb bfcgd bcegf bagdcf fd aedfgbc bfd cbdga cabefd adfg | ecfbda cbfgda cfbadg fbgcd +agdcfbe bcfega cbeag ge dacfeb facged bcaef gbdac gce efbg | feabc acfbdeg aefbc gce +febcdg egdacb bedcf debfacg abdfce ba bae fbeda gdfea acfb | eadbf ab ab eab +cdfbg dfbcae dcabe egba ag cgdfea abdcg aefcdgb cga decagb | defabc edacb cbfgd ag +fgac dfgec eag cfbdge bacde ag abdgef bagfdec dcgfae agcde | aecbdgf gcaf efcgd befcdg +de gecad fbcgae gcafd dge edfbcg eadb eacfdbg bcedag acbge | gabce fcegba bgfcead ed +gbacd dbefcg fdcgae edgca afdeg aecf egc gfaedb dcfagbe ce | feac acegd caefbdg aecf +egacbd aedbc dagbc fcdagb ec bacefdg ace dcge ecfagb febda | afecgb fgdbac bcade cea +ceadgb cgaedf bfdge cfg cf fdgbc dgabc cfdabg gdcebaf bacf | gebdf fdeacg dafbgec cgf +bgfda gdcfae afce bfecgd ac acdfg afebdgc dgefc bdcaeg cag | gdbfec gcedf gfdaceb cegdab +fa fgeabdc bfga faedb fad ebgdfa daceb fgbcde fgdeb dafcge | efdab gcdfeb fa gabf +ebfc fb aedbgc ebagdf fab cgfeab gcdfeba acbeg abcfg gfdca | gbfac bgfeac bfa bcfga +fagdec gadebc cg cabfegd agdfb cbge dbeac cdfabe adcbg cgd | acgbed dgfeabc fdeacb dgbacef +fgbdc gbedaf bdgaf dfc cbfadg gfceb degcfa dc bacd gbafcde | dcf egfdca cd cdegaf +fcb aebf bf cafgb efgabc cgadbe egbadfc egbca gcfebd acdgf | beacgfd gebfcd dfbgec bf +bfgcd deb bfacdg ed fcebgd baefg dbaecfg efdc dabecg fdgbe | de gebaf dbcgfe bde +facgdbe gda ebdfag gabdf da cagfeb gebaf deaf dbagec dcfbg | egfba dgebca aefd cgdbf +deabg eg gdfacb bdfea egd gebfdca ecdgab acge dacbg cefgbd | eg dgcbef agcdb fadbceg +cafbged feacb gbafd dc gfdc agdcbf fcabd deabgf cad acgedb | fdcba egbfdac cad dca +dfagce fbd eabdfc gdfeb ebgfa dfabcge fdgce cedfbg bcgd bd | cdbg agbcefd db db +fdagec fcg gf gbace efbgacd ecgbfd dfcea caefg dagf dbecaf | acdegfb fg gbdfaec fadg +edfag bgfced dga ag cfbgdea bfdcag bfged decfa afedbg bgae | abeg dgaef ag edfgb +dcaegb fageb cdga begda adbce gd dge gbecafd cabfed cgfebd | gdaebc ged egd dcga +cfb agebfc fegb fb adcef afbec ebgdca bafdgc gbcea fdbeagc | ebfg gabce fbc agfdceb +fdcega cbgfea febg agdebfc cfe afecb gbcae ef bcdfa acgedb | fbgdeac egbf acfgeb bfge +fbadge dfgebc fbgacde bg fdage afdcge cedba agbf bge dgbea | adgbe fgba gabf fceagd +cfbda bgedca fgdcba abcfe dc agbfd dbc fdgc facbged dagfeb | cd fbcda fdcab fdgc +cdefa fbgdce aebdg geacd ebcdgfa gc cdg baegdc febdag gbac | fdeca cg dgfbcae bcgfde +gcadeb ef ecbfga acbgfed fbdga bcade dafcbe dcfe deabf feb | fdegacb agdbf fgbedac fcdbaeg +adgc fac ca gdfcae cfdegb gcdef adcfbe dgefcba cagef abgef | gcadbfe feabdc cdefg bgdeafc +cfdeba dega fga gadfec cdfabeg aecbfg cbdfg ag faedc dfcag | ag ga acfed cebfad +efcgb feagdc gdfbea fadc ac cea gadbfce cfgae aedgbc geafd | fcgeabd cafeg cbadge ca +ebfda cfgbea cgdbef fbadgec dgcb cedfga dg fdbeg efcgb gfd | fgdeb bfgcde ebfdg dg +dcafg facgdb bgfa dbacf ba gdcefa ecfdb cfegdba bac acedbg | gcbdaf fbadc begdac dgcbaf +eagf agedbcf acdegb abg gcfba fcegb befgcd fbcda ag ebcfag | dbcegfa bfecg cafdebg faeg +fbgcd cba fgacdb gabcdef fbgdec gdabc gacf bafdec begad ac | eacbdf badge acb becfad +eacbd dabfec dbgfeac ag eagdb fcdbag bga agec dbfge bacged | agecdb bag gebcdaf cdbea +bfgcd bcdegfa fdabgc da efgca cfagd efbdca cda dgfecb bgda | acdebf badfcg abdg cafgd +efcbgd cadefg cfegd dcgba cafedgb cagfd gaf acef fa bedafg | agf fcedg gefdcb cfdge +afdceg dcaf fd dfg aefgc gdbecf cafbdeg dbage ecagfb deafg | adefgc bfdecga fdg cefag +bfdacg dagbf abdefcg acfg fbcda beafdc egdab cfdegb gfd gf | bcafgd efgcabd cfga dcaegfb +dbage dfagbe cadfeb gfeb bae fabgdc be bafdg cdgea bgdfaec | fedacbg eb dfcbea eab +gebfd cfedga begfa dagbfc fgeadcb ecdgbf bced edfgc dgb db | dbec gadcfb db aefbg +dbcg fbagc bcf bc cdaebgf aegbdf faecg fdcaeb cdafbg afbgd | adfbg fadebgc dgbafc febagd diff --git a/8.jl b/8.jl new file mode 100644 index 0000000..c1896f9 --- /dev/null +++ b/8.jl @@ -0,0 +1,96 @@ +include("utils.jl") + +function parse_input(filename) + map(non_empty_lines(filename)) do line + notes, output = map(split, split(line, "|")) + end +end + +function count_unique(strings) + length(filter(x -> x in (2,3,4,7), length.(strings))) +end + +function solution8_1() + sum(map(count_unique, getindex.(parse_input("8.data"), 2))) +end + +function solution8_2() + summe = 0 + for (notes, output) in parse_input("8.data") + recordings = [notes;output] + # find length 2 => c,f + cf = first(filter(x->length(x)==2, recordings)) + + # find length 3 => c,f,a => a + cfa = first(filter(x->length(x)==3, recordings)) + a = setdiff(cfa, cf)[1] + + # find length 4 => c,f,d,b => d,b + cfdb = first(filter(x->length(x)==4, recordings)) + db = setdiff(cfdb, cf) + + d = "X" + b = "X" + f = "X" + c = "X" + # find length 5 => + for fives in filter(x->length(x)==5, recordings) + common = intersect(fives, db) + if length(common) == 1 + # is there one missing d,b? => present is d missing is b + d = common[1] + b = setdiff(db, d)[1] + else + # is there one with d AND b => has one of c,f => f (and thus c) + f = intersect(fives, cf)[1] + c = setdiff(cf, f)[1] + end + end + + abcdf = "$a$b$c$d$f" + + g = "X" + for sixes in filter(x->length(x)==6, recordings) + new = setdiff(sixes, "$a$b$c$d$f") + if length(new) == 1 + g = new[1] + end + end + + abcdfg = "$a$b$c$d$f$g" + + e = "x" + for anything in recordings + new = setdiff(anything, abcdfg) + if length(new) == 1 + e = new[1] + break + end + end + + digits = Dict(sort(collect("$a$b$c$e$f$g")) => 0, + sort(collect("$c$f")) => 1, + sort(collect("$a$c$d$e$g")) => 2, + sort(collect("$a$c$d$f$g")) => 3, + sort(collect("$b$c$d$f")) => 4, + sort(collect("$a$b$d$f$g")) => 5, + sort(collect("$a$b$d$e$f$g")) => 6, + sort(collect("$a$c$f")) => 7, + sort(collect("$a$b$c$d$e$f$g")) => 8, + sort(collect("$a$b$c$d$f$g")) => 9) + + result = 0 + power = 0 + for digit in reverse(output) + value = get(digits, sort(collect(digit)), -1) + result += value * 10^power + power += 1 + end + # println("$(join(notes, ' ')) | $(join(output, ' ')): $result") + summe += result + end + + summe +end + +solution8_2() diff --git a/8_ex.data b/8_ex.data new file mode 100644 index 0000000..c9f629b --- /dev/null +++ b/8_ex.data @@ -0,0 +1,10 @@ +be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe +edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc +fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg +fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb +aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea +fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb +dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe +bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef +egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb +gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce diff --git a/8_ex_mini.data b/8_ex_mini.data new file mode 100644 index 0000000..42b3bfd --- /dev/null +++ b/8_ex_mini.data @@ -0,0 +1 @@ +acedgfb cdfbe gcdfa fbcad dab cefabd cdfgeb eafb cagedb ab | cdfeb fcadb cdfeb cdbaf diff --git a/9.data b/9.data new file mode 100644 index 0000000..05ef6df --- /dev/null +++ b/9.data @@ -0,0 +1,100 @@ +4567894301299921298789654345689439843295436789543298765432345678986789756901239998765634567895986555 +3458963212989890989678943234678998764989945678932198764321456799215678949892398999854525658934895434 +2348954329876799876567899195789469999767896989949019965432567897434569998789987898743212345695679423 +1237895498765698765479998989890359878956789999898929876545678996545698987678976987654563456789798912 +3456797987854569954398987678921298766545678998777899987766789987656987676569895498765676567899987893 +4567989896543498765987876567892987655434567897656798799897894598767899565458789329876787678999876789 +5679878789432579879876743458989876542123456996545987678998923459878998433347678910987898789998865678 +8798765678921456989865432365678987678012345989439878569899012398989987321234567899998949898987654568 +9987654688932368998765421234567898632125499878998767476789323987399876510126789998769434967896543456 +2398543567893458999876510195978976543236989656989654345895439876210965432345678989754323456987432345 +1987652356954567899985431989899987654549878949878943234976545985431986583556899679943212569898541234 +0198621237899778999996569878789698765698765436567890125987689987642398874567976567894323498789210123 +9239432348998989998987698765679549878789876323456789239898992398543498765678965456789434999654321234 +8998543459987899987898798754678932989899985434567894398789943987659569898789654329899949898765432345 +7987674569876789876789987643767891296929876765678965987656894998998979979898763210169898769896543456 +6599795678965699965679876321458942965439987878989879898545899899987898965919874323456789656987654578 +5459898789654569874589765432349899876598998989894998765434789789876567894301986545678998734598787689 +4345979896543498763459896565456789987987989998763219896545697698765456965212397696989654321239898793 +3254567965432987654567987886767891299876767899854323987676789569876345894343498989898975434345999892 +0123979879521098975678998997878910198965656789967456798789893498985256799454569978797896545656789991 +1239899998632129996789989798989992987654547899996567899893912987654345678965698765686789656767899989 +4398789876543234989899976659999989998743234598989699989932102398965457789898789654345898787878999878 +6987654997654399878999865545898678999654123987678989876545293459878968898769899983236789898989998767 +9876563498969989769899854236789567898763234976567878989676989598989879997656999874345899949899989756 +9765432349898876658789743145678978999854569865453569998789878987899989789743298765456789234789876545 +9897561298767435345697653234567899989967698774312478999898767856789997678932109876567892125678987634 +8999990129854321234589754745678999879878987685101387899997656345678954567893212987678943034599299846 +7898889298743210125678965678989998767989999543215456999898743237567893478954563499789956745989398767 +6787678987654321367889876989999887656799898654323567898765432123456789589765679599899877659878989878 +5674569898765432456789987898998786545698798765434678979878741012367998678978798989924989798767878989 +4323498789878543567897698967899654323987679878555789567997652323458998789989987678912398987856567899 +3212347678989697689976569458789765219886587989676894456989543456767899893499876567893987996543456789 +2101234567898798797895435365698954398775456898789932349879656567878954901298775456789896789612345678 +3232345678979899896789423234567965699674345679894321298968987678989543212987654345698765678923458989 +4563656789765932945678910123679899986545234569965432987857899799898954329898765257789674567934567897 +5674767899854321234789543234598798997632123678996949876546978998767899998789954348998543456895688976 +6789898998765430123897654345987687889875012399989899985434569987658998875657895767987432388996789765 +7895919987654321234998765499876576778964323989878789876323568998899987764546789879876321276989899876 +8954323498765434345699878987655485567895439876567678987212567899999876543534995989865410125678999987 +9765434679876595456789989987643213458996545985434569874323456789998765432323894399986423234789998998 +7976765789987876567994399876543201246789759886323498765434569899879894321012789459876534345689987989 +6989876894598987878973234997875212345678998765434999876545679998767987652345678967987649876798765678 +5492987923679598989862125987654345456789329876565899987786789987656399543458789978998956987899654568 +6321098912395439799654434598765456567893212987876789699898899876543297654567893989879987898998743489 +5499999101987325678969547679976787998999543498989896545999932999632198775878932398767898969997632378 +6987893245896534567898956789987898949698956569193987659899891098949019896989991987654329459876541267 +9876789356789645678987897996598989434567897692012798998789789987898923987899989998763212345998765459 +8765678969898756789256789543459876323456789789125679989678679876767994598999878989854301456789876567 +5874789998979867894345678932398765614347899899434599876534598765656789679998767678965212367899987678 +4343467897767998965456789321459654301256789998765987988323989854345678999987654589654343479999898789 +3212989926456999987567895432396543212367899899899876543219876543236799989876543458965494989698769894 +4343499212347894398878989693987665323456789789989987695499965432125678978985432367896989896569654923 +5454578901456943219989878989998786734569897679878798986989876743234599769876921456999976789696543219 +6567689212567899324599967678999897895878944598765659987976987654345678956989890967898765698987654998 +7678998343456898935679756567899998976989432129654745698965498765458789545698789899987654567898769897 +8789997654597987899798743456789879987896545098743434899876569896567890124987698768894323458999998786 +9897898765989876568987654567898765698989652196542123987987678989698921239876567656789214567899989645 +9956789879876543456798765678989854349678943987663039876498789878999632345985454347898996789979878434 +9745698998767432345679896789876543234567894598754198765339899867996543459876321238957889895659762123 +8634567899654321238789997898987654349978965679865299873210998759889654569985432349546778954349843234 +6525898998765432345893298967898795998899876789876789954321989645678965678996543489435568893234956785 +5436789129887643458932139456789989876789987895987899977439876434599876789987687678923456789125987996 +6545679012998786567891012345899876765898998934598999876567965323689987895398798789212345699934598987 +9876789199129987698972357896789995854567899325679999987679873212347898943219999892103479789895679298 +3987899988997598789765456789899984323456789212389989898989932101236789992103498943212567998789792149 +2198979876789459899896987999939876434598994323459878799999876512345699983212987654323456789678989234 +3239567965679345999989898998929987545989987654598765634789965423457999874323498767654567898567878945 +4999459854567956789878789987898797659876998765965834323679876567568998765454999878765678997434569896 +9878398765699897898765679976545698998965789899894321014567987698989549878969891989889789986545789789 +9765129876986789989874798765434569987654891998789543223478998789794323989998710195999897987696897678 +8654234989875679876743459983125689998785992989678965354567899895699456799987623234599976798789977567 +9766545698764568995432369894012378999876789878567896765678932923988998899876544395989897899898765456 +9878656799853656789321298765623567894987898765456989896789671019977789921987895989878789978987632345 +9989867987942345693210129898794678923498949987345678987896532198866678930298999876765678954596543456 +9896979876543456789521345999898789213999239876239789498986545987755567891979998765874567893987656567 +8755699987654567897432567899989892109878998765458991349997679876643456789767987654323456912998767778 +5444598798767678996543456789876989298767879986767890145989998965432387893458998765534567899889898989 +9323497679989789987894568998765678987656767897878921239876897896521298932347899876765678965678999496 +8939986545698993498989979349654349876545856998989432398965986789430989549456910997876889954567894325 +7898965434577892109879893298743212965432147899996545987654875678949878998967891298989997892349993214 +6587894323456943998765789349892109876543236789987659876543534567898767897898932999292356793498989323 +5456789434567899899854578998765412987656745893299767985452123679987656786789999899101236789987879434 +4345678946678998789943469549894329898767856794999879876321014989699542345999987678912345699996768965 +3235789987889997678912568932985498769878967989899989965432127894598431259899976567893456789865657896 +2124899998999876589893467899876987654989879876789999876543236893987640198788893478999567998754346789 +4235998989998765498794878945987896543296999765678998987664345992987651987677789567898979899893235678 +5345987878999654346689989234598987654345989654567897898785456789298769876545678978957898789762124568 +5459876567898953234579890123499998785459876543678965439976567892129898987634389899545987689654335679 +6798765456587892145656789294989899896567985432349876521989878921019987896521256789434596578965445799 +7999874343456921012345999989876789987679876545678965439997989532198756965432345694323987459878556789 +9899983212457892123456789876765695498789987658789997698976596545349867896545696789109876367989769899 +9789874343468943234567899985634789219898998969899989987897697655459878987856789895414995499999878998 +8676965656578998745678999894323478901987899878999879876789798798767989498979899954323986989899989987 +6565698767889109656789698765434567899876789989898765765678999899878995349989998765456899876789899886 +5454569878999998767895549898745679978987897696789654344567899945989965210995439876787898965678789765 +4323456989769899878934135987656789567898976545698743213456789434597894329874321987898987654565678954 +5434567893656789989321014598967993456799895434997654302345678923456789459765210298959996543534567893 +6547978932345678995432323459978942367898754329876543212456789014567896598654354349543985432123489932 +7656889321256789876543434567899431234789843212987655433469894323478987698765565458932976543234567891 +8798995432367899989656657678976532345678932101298766545678965435689998799876676567891098764546678910 diff --git a/9.jl b/9.jl new file mode 100644 index 0000000..958924c --- /dev/null +++ b/9.jl @@ -0,0 +1,86 @@ +include("utils.jl") + +function parse_input(filename) + map(x->parse.(Int, x), split.(non_empty_lines(filename), "")) +end + +function sink_locations(width, height, heights) + sinks = [] + for x in 1:width + for y in 1:height + minimum = true + if x > 1 + minimum &= heights[x - 1, y] > heights[x, y] + end + if x < width + minimum &= heights[x + 1, y] > heights[x, y] + end + if y > 1 + minimum &= heights[x, y - 1] > heights[x, y] + end + if y < height + minimum &= heights[x, y + 1] > heights[x, y] + end + if minimum + push!(sinks, (x, y)) + end + end + end + sinks +end + +function solution9_1() + input = collect(parse_input("9_ex.data")) + width = length(input[1]) + height = length(input) + heights = reshape(reduce(vcat, input),(width,height)) + sinks = sink_locations(width, height, heights) + risk = 0 + for sink in sinks + risk += heights[sink[1], sink[2]] + 1 + end + risk +end + +function basin_size(x, y, width, height, heights) + heights = copy(heights) + to_visit = [CartesianIndex(x, y)] + visited = [] + while length(to_visit) > 0 + current = pop!(to_visit) + if current in visited + continue + end + push!(visited, current) + if heights[current] == 9 + continue + end + if current[1] > 1 + push!(to_visit, CartesianIndex(-1, 0) + current) + end + if current[1] < width + push!(to_visit, CartesianIndex(+1, 0) + current) + end + if current[2] > 1 + push!(to_visit, CartesianIndex(0, -1) + current) + end + if current[2] < height + push!(to_visit, CartesianIndex(0, +1) + current) + end + heights[current] = -1 + end + length(filter(==(-1), heights)) +end + +function solution9_2() + input = collect(parse_input("9.data")) + width = length(input[1]) + height = length(input) + heights = reshape(reduce(vcat, input),(width,height)) + sizes = map(sink_locations(width, height, heights)) do sink + size = basin_size(sink[1], sink[2], width, height, heights) + end + reduce(*, Iterators.take(reverse(sort(sizes)), 3)) +end + +solution9_2() diff --git a/9_ex.data b/9_ex.data new file mode 100644 index 0000000..6dee4a4 --- /dev/null +++ b/9_ex.data @@ -0,0 +1,5 @@ +2199943210 +3987894921 +9856789892 +8767896789 +9899965678 diff --git a/utils.jl b/utils.jl new file mode 100644 index 0000000..6769e0c --- /dev/null +++ b/utils.jl @@ -0,0 +1,3 @@ +function non_empty_lines(path::String) + Iterators.filter(!isempty, eachline(path)) +end