From 4cfb172f6a02135d82fe876209c1a3a24857fd8a Mon Sep 17 00:00:00 2001 From: Quinten Kock Date: Mon, 6 Dec 2021 14:50:47 +0100 Subject: [PATCH] first commit --- 2021/day01.hs | 16 + 2021/day01.input | 2000 ++++++++++++++++++++++++++++++++++++++++++++++ 2021/day02.hs | 37 + 2021/day02.input | 1000 +++++++++++++++++++++++ 2021/day03.hs | 35 + 2021/day03.input | 1000 +++++++++++++++++++++++ 2021/day04.hs | 42 + 2021/day04.input | 601 ++++++++++++++ 2021/day05.hs | 46 ++ 2021/day05.input | 500 ++++++++++++ 2021/day06.hs | 22 + 2021/day06.input | 1 + 12 files changed, 5300 insertions(+) create mode 100644 2021/day01.hs create mode 100644 2021/day01.input create mode 100644 2021/day02.hs create mode 100644 2021/day02.input create mode 100644 2021/day03.hs create mode 100644 2021/day03.input create mode 100644 2021/day04.hs create mode 100644 2021/day04.input create mode 100644 2021/day05.hs create mode 100644 2021/day05.input create mode 100644 2021/day06.hs create mode 100644 2021/day06.input diff --git a/2021/day01.hs b/2021/day01.hs new file mode 100644 index 0000000..4d22d88 --- /dev/null +++ b/2021/day01.hs @@ -0,0 +1,16 @@ +module Main where + +main :: IO () +main = do + input <- getContents + let numbers = map (read :: String -> Integer) (lines input) + putStr "part 1: " + let zippedInts = zip numbers (tail numbers) + -- let count = filter (\(x,y) -> y > x) zippedInts + let count = filter (<0) (zipWith (-) numbers (tail numbers)) + putStrLn $ show $ length count + + putStr "part 2: " + let sums = zipWith3 (\x y z -> x + y + z) numbers (tail numbers) (tail (tail numbers)) + putStrLn $ show $ length $ filter (<0) $ zipWith (-) sums (tail sums) + return () diff --git a/2021/day01.input b/2021/day01.input new file mode 100644 index 0000000..f65b86c --- /dev/null +++ b/2021/day01.input @@ -0,0 +1,2000 @@ +123 +126 +130 +137 +140 +150 +155 +157 +173 +186 +201 +205 +234 +236 +237 +252 +254 +258 +265 +266 +270 +278 +285 +289 +310 +332 +323 +349 +371 +372 +373 +380 +381 +382 +383 +401 +406 +408 +411 +412 +415 +410 +413 +423 +435 +440 +445 +448 +453 +454 +455 +470 +472 +473 +476 +480 +483 +485 +486 +489 +491 +490 +495 +497 +520 +537 +547 +555 +575 +577 +588 +594 +595 +597 +598 +599 +635 +636 +637 +638 +642 +649 +652 +654 +655 +658 +699 +700 +702 +716 +718 +724 +728 +729 +730 +731 +734 +744 +753 +754 +755 +774 +775 +789 +794 +795 +793 +790 +809 +827 +828 +831 +832 +839 +840 +841 +855 +856 +860 +861 +867 +875 +894 +901 +902 +923 +931 +935 +937 +944 +947 +952 +961 +963 +965 +985 +987 +1000 +1008 +1017 +1041 +1047 +1049 +1030 +1048 +1050 +1048 +1059 +1073 +1092 +1091 +1092 +1103 +1111 +1125 +1134 +1136 +1162 +1163 +1188 +1190 +1209 +1214 +1227 +1228 +1235 +1237 +1238 +1240 +1242 +1246 +1248 +1250 +1252 +1258 +1259 +1262 +1263 +1266 +1267 +1272 +1274 +1276 +1277 +1288 +1293 +1299 +1300 +1281 +1287 +1288 +1293 +1298 +1299 +1300 +1325 +1323 +1319 +1330 +1312 +1318 +1337 +1354 +1355 +1360 +1374 +1376 +1377 +1388 +1389 +1395 +1401 +1404 +1406 +1408 +1417 +1416 +1417 +1420 +1428 +1433 +1435 +1453 +1459 +1474 +1480 +1481 +1513 +1509 +1515 +1518 +1522 +1519 +1530 +1531 +1527 +1547 +1549 +1552 +1553 +1554 +1558 +1567 +1570 +1580 +1582 +1585 +1586 +1587 +1609 +1611 +1612 +1614 +1616 +1641 +1640 +1643 +1646 +1617 +1620 +1621 +1626 +1632 +1637 +1638 +1659 +1660 +1661 +1670 +1673 +1674 +1675 +1678 +1679 +1700 +1689 +1697 +1700 +1702 +1706 +1707 +1705 +1711 +1736 +1740 +1743 +1744 +1758 +1764 +1766 +1765 +1770 +1773 +1772 +1775 +1776 +1777 +1780 +1787 +1788 +1790 +1793 +1794 +1800 +1806 +1808 +1837 +1841 +1846 +1847 +1848 +1849 +1848 +1851 +1854 +1853 +1859 +1860 +1865 +1866 +1867 +1873 +1882 +1900 +1913 +1914 +1935 +1937 +1942 +1938 +1941 +1942 +1952 +1953 +1956 +1957 +1959 +1980 +1981 +1982 +1988 +2009 +2020 +2043 +2046 +2033 +2036 +2042 +2047 +2048 +2062 +2052 +2053 +2079 +2082 +2091 +2092 +2091 +2082 +2083 +2090 +2101 +2129 +2130 +2134 +2120 +2121 +2115 +2119 +2123 +2124 +2139 +2140 +2141 +2142 +2145 +2146 +2151 +2148 +2150 +2158 +2162 +2163 +2155 +2160 +2175 +2184 +2192 +2210 +2211 +2214 +2215 +2221 +2222 +2223 +2231 +2233 +2256 +2258 +2243 +2250 +2255 +2269 +2280 +2288 +2294 +2299 +2313 +2321 +2324 +2327 +2354 +2353 +2348 +2363 +2384 +2390 +2391 +2393 +2398 +2401 +2416 +2418 +2419 +2422 +2435 +2436 +2441 +2452 +2453 +2442 +2447 +2451 +2452 +2465 +2470 +2457 +2486 +2524 +2536 +2540 +2543 +2537 +2522 +2531 +2532 +2534 +2553 +2564 +2562 +2570 +2573 +2590 +2575 +2583 +2585 +2559 +2563 +2566 +2567 +2573 +2564 +2565 +2574 +2579 +2605 +2610 +2617 +2615 +2616 +2651 +2652 +2653 +2668 +2670 +2673 +2679 +2681 +2684 +2685 +2686 +2692 +2693 +2697 +2698 +2713 +2710 +2718 +2719 +2726 +2686 +2687 +2690 +2692 +2691 +2708 +2713 +2714 +2713 +2710 +2699 +2704 +2703 +2707 +2713 +2718 +2719 +2713 +2716 +2724 +2726 +2736 +2745 +2748 +2752 +2753 +2754 +2763 +2766 +2767 +2769 +2776 +2777 +2810 +2813 +2814 +2817 +2818 +2825 +2842 +2849 +2862 +2868 +2865 +2869 +2890 +2894 +2909 +2915 +2916 +2919 +2918 +2919 +2923 +2931 +2946 +2925 +2931 +2933 +2934 +2965 +2978 +2981 +2994 +2995 +2996 +2997 +3003 +3011 +3008 +3009 +3011 +3012 +3013 +3018 +3020 +3033 +3032 +3036 +3040 +3030 +3032 +3033 +3035 +3038 +3046 +3052 +3068 +3070 +3043 +3050 +3051 +3052 +3059 +3063 +3065 +3088 +3093 +3094 +3093 +3098 +3102 +3107 +3110 +3113 +3114 +3116 +3110 +3111 +3113 +3116 +3119 +3116 +3121 +3122 +3121 +3125 +3138 +3139 +3145 +3150 +3151 +3149 +3162 +3169 +3178 +3179 +3191 +3202 +3227 +3234 +3236 +3246 +3254 +3258 +3259 +3251 +3267 +3281 +3249 +3270 +3271 +3272 +3281 +3295 +3296 +3295 +3296 +3321 +3327 +3334 +3340 +3321 +3330 +3333 +3336 +3359 +3368 +3376 +3403 +3412 +3417 +3410 +3418 +3421 +3422 +3425 +3433 +3440 +3441 +3443 +3464 +3467 +3471 +3472 +3475 +3473 +3488 +3494 +3481 +3482 +3491 +3514 +3521 +3525 +3543 +3565 +3566 +3567 +3591 +3590 +3591 +3572 +3573 +3567 +3599 +3622 +3623 +3643 +3646 +3651 +3656 +3662 +3663 +3673 +3684 +3679 +3684 +3672 +3678 +3723 +3744 +3742 +3739 +3732 +3746 +3750 +3757 +3759 +3762 +3759 +3758 +3753 +3755 +3760 +3766 +3767 +3771 +3800 +3801 +3805 +3806 +3807 +3806 +3811 +3818 +3819 +3831 +3832 +3840 +3844 +3829 +3842 +3854 +3858 +3874 +3875 +3877 +3880 +3903 +3906 +3907 +3908 +3909 +3929 +3951 +3952 +3962 +3973 +3975 +3976 +3974 +3977 +4004 +4008 +4017 +4004 +4003 +4009 +4010 +4004 +4005 +4007 +4015 +4018 +4026 +4029 +4019 +4022 +4030 +4036 +4037 +4039 +4022 +4024 +4026 +4034 +4033 +4034 +4040 +4042 +4050 +4054 +4055 +4056 +4033 +4047 +4048 +4047 +4048 +4050 +4059 +4077 +4079 +4091 +4092 +4098 +4103 +4107 +4108 +4112 +4114 +4118 +4119 +4125 +4126 +4138 +4137 +4168 +4189 +4195 +4198 +4217 +4220 +4223 +4228 +4234 +4233 +4234 +4236 +4269 +4268 +4269 +4268 +4280 +4291 +4285 +4311 +4312 +4315 +4307 +4313 +4315 +4326 +4332 +4345 +4340 +4353 +4355 +4353 +4354 +4367 +4368 +4377 +4378 +4380 +4382 +4385 +4390 +4392 +4393 +4396 +4397 +4385 +4398 +4386 +4381 +4382 +4370 +4385 +4384 +4403 +4404 +4405 +4408 +4422 +4425 +4422 +4435 +4436 +4438 +4452 +4461 +4465 +4480 +4488 +4495 +4504 +4505 +4508 +4523 +4524 +4527 +4529 +4561 +4577 +4580 +4614 +4635 +4636 +4637 +4639 +4654 +4655 +4652 +4663 +4665 +4666 +4668 +4671 +4677 +4680 +4687 +4689 +4693 +4695 +4688 +4697 +4711 +4724 +4734 +4747 +4748 +4780 +4781 +4793 +4799 +4804 +4805 +4792 +4793 +4794 +4820 +4815 +4817 +4828 +4830 +4834 +4836 +4840 +4839 +4848 +4862 +4867 +4869 +4871 +4870 +4878 +4868 +4869 +4871 +4874 +4897 +4905 +4909 +4910 +4912 +4945 +4946 +4945 +4950 +4951 +4952 +4957 +4958 +4967 +4991 +4998 +5001 +5021 +5022 +5021 +5030 +5031 +5028 +5031 +5014 +5018 +5025 +5027 +5032 +5034 +5036 +5033 +5036 +5035 +5038 +5042 +5043 +5044 +5045 +5062 +5069 +5070 +5068 +5089 +5110 +5114 +5130 +5134 +5154 +5153 +5158 +5162 +5177 +5178 +5182 +5187 +5188 +5189 +5223 +5225 +5237 +5264 +5269 +5270 +5274 +5275 +5276 +5279 +5285 +5266 +5270 +5272 +5275 +5276 +5294 +5298 +5299 +5302 +5306 +5311 +5317 +5304 +5308 +5303 +5324 +5329 +5330 +5334 +5342 +5348 +5367 +5385 +5390 +5382 +5383 +5384 +5388 +5389 +5390 +5399 +5401 +5403 +5407 +5408 +5417 +5445 +5456 +5459 +5462 +5463 +5471 +5472 +5475 +5504 +5525 +5538 +5552 +5553 +5556 +5562 +5598 +5575 +5569 +5571 +5574 +5575 +5562 +5586 +5594 +5599 +5641 +5639 +5642 +5644 +5647 +5643 +5642 +5643 +5645 +5654 +5655 +5672 +5681 +5696 +5700 +5701 +5702 +5705 +5709 +5716 +5721 +5724 +5728 +5749 +5750 +5746 +5744 +5743 +5751 +5754 +5748 +5764 +5765 +5773 +5775 +5778 +5796 +5800 +5801 +5806 +5811 +5826 +5829 +5833 +5844 +5850 +5852 +5861 +5863 +5867 +5883 +5880 +5867 +5862 +5863 +5865 +5866 +5864 +5869 +5871 +5880 +5887 +5908 +5917 +5919 +5928 +5939 +5967 +5954 +5955 +5945 +5950 +5956 +5958 +5968 +5972 +5978 +5979 +5981 +5986 +5987 +5990 +5992 +5993 +6012 +6018 +6021 +6023 +6024 +6025 +6041 +6045 +6042 +6058 +6059 +6060 +6062 +6064 +6072 +6074 +6075 +6068 +6075 +6093 +6095 +6090 +6092 +6107 +6106 +6107 +6108 +6109 +6120 +6123 +6125 +6126 +6129 +6130 +6132 +6149 +6157 +6163 +6164 +6165 +6152 +6154 +6156 +6158 +6155 +6156 +6158 +6163 +6178 +6179 +6180 +6179 +6182 +6184 +6191 +6189 +6199 +6210 +6212 +6218 +6222 +6223 +6232 +6233 +6228 +6232 +6221 +6223 +6225 +6228 +6236 +6237 +6246 +6252 +6254 +6255 +6256 +6255 +6260 +6262 +6263 +6267 +6268 +6272 +6279 +6277 +6276 +6282 +6287 +6305 +6306 +6308 +6309 +6310 +6318 +6319 +6321 +6320 +6328 +6346 +6348 +6351 +6352 +6369 +6370 +6368 +6369 +6371 +6374 +6375 +6370 +6374 +6393 +6403 +6406 +6412 +6420 +6435 +6437 +6438 +6462 +6461 +6462 +6467 +6468 +6494 +6508 +6509 +6518 +6519 +6520 +6521 +6518 +6545 +6546 +6550 +6552 +6567 +6568 +6570 +6578 +6582 +6580 +6591 +6599 +6601 +6595 +6598 +6610 +6628 +6612 +6616 +6614 +6618 +6641 +6640 +6643 +6647 +6663 +6664 +6665 +6668 +6669 +6670 +6685 +6706 +6704 +6708 +6710 +6716 +6717 +6719 +6726 +6736 +6755 +6752 +6753 +6760 +6769 +6774 +6779 +6783 +6792 +6794 +6798 +6804 +6803 +6806 +6809 +6811 +6812 +6817 +6827 +6830 +6822 +6842 +6844 +6848 +6849 +6850 +6852 +6854 +6873 +6891 +6925 +6928 +6930 +6940 +6941 +6942 +6943 +6946 +6951 +6956 +6957 +6966 +6969 +6971 +6973 +7000 +7006 +7007 +7031 +7037 +7046 +7052 +7053 +7070 +7072 +7076 +7084 +7090 +7089 +7117 +7139 +7153 +7168 +7178 +7179 +7168 +7171 +7172 +7171 +7174 +7194 +7226 +7246 +7252 +7256 +7257 +7259 +7261 +7266 +7277 +7296 +7298 +7300 +7315 +7329 +7332 +7333 +7338 +7340 +7347 +7349 +7350 +7351 +7352 +7353 +7356 +7359 +7360 +7361 +7358 +7363 +7364 +7385 +7406 +7409 +7434 +7435 +7436 +7438 +7399 +7401 +7406 +7416 +7409 +7410 +7413 +7415 +7439 +7441 +7440 +7442 +7466 +7465 +7468 +7480 +7481 +7483 +7488 +7498 +7497 +7500 +7503 +7506 +7513 +7518 +7519 +7524 +7506 +7507 +7517 +7519 +7528 +7529 +7533 +7535 +7540 +7542 +7554 +7556 +7557 +7573 +7582 +7593 +7599 +7583 +7591 +7593 +7595 +7599 +7611 +7626 +7618 +7615 +7619 +7620 +7625 +7626 +7628 +7631 +7630 +7631 +7642 +7654 +7656 +7657 +7659 +7673 +7677 +7691 +7697 +7707 +7708 +7710 +7712 +7717 +7724 +7722 +7723 +7722 +7725 +7726 +7724 +7730 +7734 +7760 +7770 +7775 +7788 +7787 +7789 +7797 +7813 +7841 +7853 +7860 +7868 +7883 +7903 +7907 +7908 +7910 +7912 +7919 +7921 +7925 +7926 +7937 +7951 +7954 +7957 +7961 +7964 +7976 +7979 +7971 +7969 +7970 +7982 +7983 +7984 +7993 +8000 +8015 +8017 +8014 +8025 +8019 +8028 +8029 +8030 +8033 +8038 +8040 +8041 +8040 +8044 +8026 +8030 +8031 +8044 +8060 +8064 +8065 +8054 +8056 +8058 +8060 +8061 +8062 +8068 +8072 +8078 +8069 +8067 +8073 +8084 +8119 +8121 +8120 +8122 +8132 +8133 +8127 +8132 +8151 +8154 +8161 +8162 +8158 +8186 +8187 +8172 +8181 +8200 +8202 +8216 +8213 +8215 +8229 +8243 +8244 +8245 +8246 +8239 +8260 +8262 +8279 +8281 +8287 +8288 +8292 +8296 +8299 +8303 +8310 +8311 +8315 +8329 +8330 +8331 +8334 +8346 +8347 +8354 +8377 +8379 +8381 +8388 +8389 +8415 +8413 +8419 +8420 +8421 +8425 +8427 +8428 +8435 +8442 +8426 +8420 +8432 +8435 +8445 +8446 +8450 +8451 +8455 +8456 +8482 +8489 +8487 +8500 +8485 +8493 +8497 +8502 +8501 +8502 +8503 +8505 +8507 +8508 +8509 +8514 +8523 +8527 +8531 +8542 +8540 +8542 +8543 +8544 +8557 +8550 +8552 +8563 +8565 +8566 +8567 +8581 +8591 +8595 +8605 +8613 +8614 +8613 +8615 +8618 +8631 +8628 +8627 +8628 +8629 +8646 +8648 +8650 +8655 +8659 +8681 +8684 +8687 +8690 +8687 +8688 +8719 +8722 +8721 +8723 +8754 +8767 +8749 +8750 +8764 +8772 +8773 +8776 +8778 +8782 +8786 +8784 +8799 +8800 +8815 +8819 +8838 +8833 +8834 +8835 +8837 +8844 +8851 +8852 +8856 +8857 +8870 +8879 +8904 +8910 +8918 +8925 +8928 +8927 +8928 +8936 +8937 +8939 +8944 +8979 +8980 +8994 +8996 +8997 +8999 +9003 +9014 +9015 +9020 +9023 +9026 +9027 +9028 +9030 +9033 +9036 +9038 +9044 +9048 +9063 +9066 +9091 +9092 +9093 +9095 +9099 +9097 +9102 +9103 +9123 +9124 +9125 +9127 +9128 +9132 +9135 +9142 +9149 +9152 +9171 +9166 +9177 +9178 +9162 +9168 +9169 +9170 +9183 +9189 +9199 +9195 +9198 +9203 +9214 +9213 +9222 +9223 +9228 +9229 +9241 +9243 +9229 +9242 +9257 +9262 +9265 +9275 +9276 +9289 +9290 +9297 +9298 +9301 +9313 +9314 +9315 +9316 +9324 +9325 +9328 +9310 +9311 +9336 +9340 +9354 +9356 +9360 +9361 +9362 +9381 +9385 +9393 +9394 +9402 +9403 +9407 +9403 +9415 +9416 +9436 +9442 +9454 +9481 +9485 +9486 +9487 +9513 +9521 +9525 +9521 +9519 +9524 +9526 +9530 +9540 +9568 +9571 +9589 +9609 +9610 +9604 +9602 +9601 +9626 +9630 +9662 +9670 +9672 +9674 +9676 +9682 +9683 +9685 +9687 +9704 +9706 +9707 +9708 +9718 +9732 +9741 +9756 +9775 +9785 +9786 +9797 +9800 +9803 +9806 +9812 +9815 +9840 +9842 +9859 +9865 +9871 +9876 +9894 +9903 +9905 +9912 +9939 +9940 +9946 +9948 +9953 +9960 +9963 +9964 +9967 +9973 +9974 +9986 +9982 +9987 +9988 +10011 +10012 +10013 +10018 +10021 +10022 +10028 +10032 +10034 +10035 +10036 +10037 +10048 +10060 +10107 +10128 +10125 +10136 +10158 +10167 +10158 +10183 +10212 +10223 +10229 +10233 +10229 +10232 +10242 +10245 +10246 +10269 +10274 +10270 +10271 +10293 +10287 +10298 +10299 +10307 +10308 +10315 +10336 +10342 +10350 +10344 +10349 +10353 +10354 +10370 +10377 +10380 +10390 +10410 +10411 diff --git a/2021/day02.hs b/2021/day02.hs new file mode 100644 index 0000000..3643497 --- /dev/null +++ b/2021/day02.hs @@ -0,0 +1,37 @@ +data Command = Forward Int | Down Int | Up Int +type Position = (Int,Int) +type AimPosition = (Int,Int,Int) + +readCmd :: String -> Command +readCmd s = case cmd of + "forward" -> Forward $ read num + "down" -> Down $ read num + "up" -> Up $ read num + _ -> error $ "unknown command" ++ cmd + where (cmd:num:xs) = words s + +moveSub :: Position -> Command -> Position +moveSub (h,d) (Forward f) = (h+f,d) +moveSub (h,d) (Down f) = (h,d+f) +moveSub (h,d) (Up f) = (h,d-f) + +applyCommands :: [Command] -> Position +applyCommands = foldl moveSub (0,0) + +moveSubAim :: AimPosition -> Command -> AimPosition +moveSubAim (h,d,a) (Forward f) = (h+f,d+a*f,a) +moveSubAim (h,d,a) (Down f) = (h,d,a+f) +moveSubAim (h,d,a) (Up f) = (h,d,a-f) + +applyCommandsAim :: [Command] -> AimPosition +applyCommandsAim = foldl moveSubAim (0,0,0) + +main :: IO () +main = do + input <- getContents + let commands = map readCmd $ lines input + putStr "part 1: " + print $ uncurry (*) $ applyCommands commands + putStr "part 2: " + print $ (\(x,y,_) -> x*y) $ applyCommandsAim commands + return () diff --git a/2021/day02.input b/2021/day02.input new file mode 100644 index 0000000..aef25e3 --- /dev/null +++ b/2021/day02.input @@ -0,0 +1,1000 @@ +forward 8 +forward 3 +down 8 +forward 4 +down 2 +down 4 +down 8 +down 4 +down 7 +up 4 +down 6 +down 2 +forward 7 +down 5 +down 7 +down 5 +forward 8 +forward 4 +forward 3 +down 4 +forward 2 +up 3 +up 6 +forward 7 +down 4 +down 2 +forward 7 +up 3 +forward 8 +down 4 +down 6 +forward 3 +forward 9 +down 9 +down 6 +forward 8 +up 8 +forward 3 +down 8 +down 4 +forward 7 +forward 3 +up 9 +down 8 +forward 7 +forward 5 +forward 3 +down 1 +down 4 +forward 1 +down 6 +forward 9 +up 2 +forward 3 +down 2 +down 1 +up 5 +down 8 +down 7 +down 5 +down 9 +up 7 +forward 4 +down 9 +down 8 +down 4 +forward 3 +down 1 +up 8 +down 1 +down 8 +forward 4 +up 1 +forward 7 +down 6 +down 2 +forward 3 +down 9 +forward 9 +forward 4 +down 1 +up 6 +down 1 +up 2 +down 4 +down 9 +down 7 +forward 5 +down 3 +up 9 +forward 4 +up 5 +down 9 +forward 1 +forward 7 +forward 1 +down 8 +forward 5 +down 2 +down 4 +down 3 +forward 4 +down 9 +up 7 +up 1 +forward 4 +up 2 +forward 4 +forward 4 +down 1 +down 5 +forward 6 +forward 1 +down 6 +forward 8 +forward 8 +forward 6 +down 3 +forward 3 +forward 1 +forward 5 +forward 7 +down 5 +forward 8 +down 7 +down 8 +forward 7 +forward 8 +down 7 +forward 7 +up 2 +up 9 +down 1 +forward 1 +forward 6 +up 3 +up 6 +down 2 +down 4 +forward 2 +up 8 +forward 5 +up 9 +up 5 +down 2 +forward 5 +forward 9 +up 3 +forward 7 +down 4 +down 3 +down 2 +forward 9 +up 4 +down 7 +down 1 +forward 9 +forward 3 +up 4 +forward 1 +up 6 +forward 5 +forward 2 +forward 2 +down 9 +forward 1 +up 7 +forward 3 +down 1 +down 5 +up 8 +down 5 +forward 5 +forward 5 +down 9 +up 5 +forward 8 +up 9 +down 1 +forward 1 +down 7 +up 3 +down 9 +down 9 +down 5 +up 6 +forward 7 +down 5 +down 2 +down 5 +forward 3 +forward 2 +forward 9 +forward 5 +forward 6 +up 7 +up 7 +forward 4 +forward 2 +up 4 +up 6 +down 8 +up 9 +up 5 +down 8 +forward 4 +up 9 +forward 8 +forward 3 +down 6 +down 6 +down 7 +down 6 +forward 7 +up 5 +down 2 +down 5 +forward 2 +up 5 +forward 7 +down 5 +up 4 +up 2 +forward 2 +forward 9 +forward 5 +forward 8 +up 4 +forward 6 +up 7 +forward 5 +down 2 +down 3 +down 8 +up 2 +down 2 +up 1 +up 7 +down 1 +down 6 +down 9 +down 7 +forward 8 +up 8 +up 9 +down 9 +forward 6 +forward 6 +down 6 +forward 3 +forward 4 +forward 6 +forward 7 +down 5 +down 8 +forward 7 +forward 9 +down 4 +up 9 +forward 8 +down 6 +down 1 +down 2 +forward 4 +down 5 +up 1 +forward 1 +down 6 +forward 4 +forward 2 +forward 6 +down 8 +up 2 +up 8 +forward 3 +down 6 +forward 7 +down 1 +forward 1 +forward 8 +down 8 +down 8 +down 2 +forward 8 +down 4 +up 8 +down 6 +forward 2 +down 5 +up 3 +up 1 +down 2 +forward 4 +up 7 +forward 2 +up 9 +forward 1 +down 5 +forward 3 +up 9 +up 4 +down 4 +up 6 +down 1 +forward 9 +up 5 +forward 5 +up 4 +down 6 +forward 2 +up 6 +forward 5 +forward 5 +down 4 +up 7 +forward 2 +down 9 +down 8 +down 7 +forward 4 +forward 7 +down 4 +forward 9 +up 2 +forward 1 +up 4 +down 8 +forward 9 +up 2 +up 5 +down 7 +up 6 +forward 7 +up 1 +forward 3 +down 3 +down 2 +down 6 +down 6 +forward 3 +down 2 +down 2 +down 5 +down 4 +down 6 +down 2 +forward 7 +down 6 +forward 4 +down 5 +down 7 +down 3 +forward 2 +forward 8 +forward 1 +up 6 +down 8 +down 4 +up 5 +forward 5 +down 7 +forward 5 +forward 8 +forward 7 +down 8 +down 5 +down 3 +up 2 +forward 8 +forward 7 +down 6 +up 1 +down 9 +down 3 +down 7 +down 2 +forward 9 +forward 2 +forward 4 +forward 8 +forward 3 +forward 2 +down 3 +down 8 +up 7 +down 7 +down 1 +forward 8 +down 2 +up 4 +forward 9 +down 6 +forward 5 +forward 8 +forward 1 +forward 4 +down 6 +down 1 +down 6 +forward 1 +forward 7 +down 3 +down 3 +down 1 +up 2 +down 6 +down 5 +down 6 +forward 5 +forward 2 +forward 1 +forward 8 +up 5 +down 2 +down 9 +down 9 +down 5 +down 3 +up 6 +forward 2 +down 7 +down 7 +down 2 +down 2 +up 6 +forward 8 +forward 6 +forward 4 +down 1 +forward 7 +down 5 +up 9 +forward 5 +down 4 +down 9 +up 7 +forward 1 +up 3 +up 7 +forward 6 +forward 8 +up 6 +up 3 +forward 4 +up 3 +down 1 +forward 8 +forward 1 +up 3 +forward 7 +up 2 +forward 6 +forward 2 +down 2 +down 9 +down 9 +forward 1 +forward 8 +down 5 +forward 4 +forward 5 +forward 5 +down 9 +forward 8 +up 8 +down 6 +down 2 +down 5 +down 6 +up 9 +up 8 +down 4 +down 9 +up 4 +forward 6 +forward 1 +forward 3 +up 4 +up 3 +forward 3 +forward 8 +down 1 +down 2 +down 2 +forward 9 +forward 4 +up 2 +forward 7 +down 4 +up 1 +forward 2 +forward 9 +forward 8 +down 4 +down 7 +up 7 +down 1 +forward 3 +down 7 +down 8 +up 2 +forward 2 +forward 8 +forward 4 +forward 4 +down 5 +forward 8 +down 2 +up 7 +down 1 +up 9 +up 5 +down 3 +forward 6 +forward 2 +forward 6 +down 5 +down 6 +forward 9 +up 5 +up 6 +down 4 +down 5 +up 4 +down 6 +down 2 +down 5 +down 4 +forward 7 +forward 6 +down 8 +forward 2 +down 5 +down 7 +down 2 +forward 8 +forward 6 +down 3 +forward 4 +up 6 +down 9 +down 3 +forward 3 +forward 3 +down 9 +up 1 +up 3 +forward 3 +forward 6 +forward 1 +forward 4 +forward 3 +forward 3 +forward 3 +down 6 +down 8 +forward 3 +down 5 +forward 8 +forward 3 +down 4 +up 3 +up 1 +down 7 +forward 7 +up 6 +forward 7 +down 4 +down 7 +up 9 +down 9 +forward 8 +down 5 +down 2 +forward 9 +down 3 +forward 4 +forward 4 +forward 4 +forward 6 +down 1 +up 5 +forward 8 +down 6 +forward 5 +up 5 +up 5 +down 2 +down 9 +down 7 +up 3 +up 7 +up 6 +forward 2 +forward 6 +up 9 +forward 5 +forward 2 +up 4 +down 4 +down 5 +forward 7 +down 5 +down 7 +forward 3 +down 6 +down 1 +forward 6 +up 5 +up 6 +up 3 +down 9 +up 7 +forward 9 +down 3 +forward 4 +up 2 +forward 9 +down 2 +up 2 +up 5 +forward 1 +down 8 +down 1 +down 8 +up 2 +forward 9 +forward 1 +up 2 +down 1 +up 1 +forward 2 +down 7 +forward 9 +up 1 +forward 8 +down 5 +down 5 +down 9 +forward 5 +down 7 +down 1 +forward 9 +down 5 +forward 9 +forward 9 +down 6 +down 5 +down 6 +forward 3 +down 4 +up 8 +down 6 +up 4 +down 9 +up 1 +up 2 +up 8 +forward 6 +down 7 +down 4 +down 9 +down 3 +forward 9 +down 5 +forward 6 +down 6 +forward 7 +down 9 +forward 2 +forward 2 +down 8 +down 7 +forward 5 +down 8 +forward 6 +down 1 +forward 6 +forward 7 +forward 3 +forward 2 +forward 1 +forward 1 +down 9 +forward 7 +up 9 +down 5 +forward 6 +down 4 +down 2 +forward 4 +forward 3 +forward 9 +down 8 +down 2 +forward 4 +down 8 +down 6 +forward 9 +down 7 +forward 1 +up 1 +forward 3 +down 5 +down 8 +up 6 +forward 9 +forward 4 +down 2 +forward 4 +up 2 +forward 9 +down 5 +down 1 +down 9 +forward 5 +down 9 +forward 1 +down 9 +forward 8 +down 5 +forward 9 +forward 8 +up 8 +down 7 +up 9 +down 5 +up 9 +forward 7 +forward 7 +forward 1 +up 2 +up 2 +forward 6 +up 5 +up 5 +down 7 +forward 2 +up 8 +forward 8 +down 8 +forward 7 +forward 8 +down 7 +down 8 +forward 4 +forward 2 +down 8 +up 4 +down 1 +up 7 +forward 4 +forward 3 +down 6 +up 6 +forward 6 +down 1 +forward 3 +down 6 +forward 6 +up 3 +up 1 +up 5 +down 1 +up 9 +down 8 +forward 7 +forward 9 +up 2 +forward 2 +forward 6 +up 2 +up 3 +forward 1 +forward 2 +forward 8 +down 6 +forward 5 +down 8 +forward 2 +up 1 +down 1 +down 3 +forward 9 +down 6 +down 1 +down 6 +down 6 +down 6 +down 1 +up 6 +down 6 +forward 6 +down 5 +down 2 +up 5 +forward 7 +down 3 +forward 9 +forward 2 +down 2 +down 1 +down 9 +up 3 +down 2 +forward 2 +forward 6 +down 4 +up 7 +up 3 +up 9 +forward 3 +forward 8 +forward 9 +forward 4 +forward 2 +up 7 +up 5 +down 9 +forward 1 +up 1 +down 7 +forward 5 +forward 5 +down 3 +forward 1 +forward 6 +up 8 +down 4 +down 2 +up 2 +forward 2 +forward 1 +down 4 +up 9 +down 1 +down 4 +down 6 +forward 3 +forward 7 +down 4 +up 8 +down 6 +forward 7 +forward 4 +up 2 +down 8 +forward 5 +down 1 +forward 7 +down 1 +up 6 +down 9 +forward 3 +forward 1 +up 2 +up 4 +forward 8 +forward 1 +up 8 +forward 3 +forward 7 +up 9 +up 6 +up 9 +down 9 +down 5 +forward 8 +forward 7 +down 5 +forward 7 +forward 6 +forward 8 +up 4 +forward 6 +down 6 +up 8 +down 7 +up 8 +forward 6 +forward 7 +down 4 +forward 4 +up 2 +forward 9 +down 6 +down 2 +down 8 +forward 6 +up 2 +up 8 +forward 2 +down 3 +forward 7 +forward 6 +down 9 +up 1 +forward 1 +down 8 +down 8 +forward 4 +forward 4 +up 6 +down 8 +up 8 +forward 1 +forward 1 +down 6 +up 3 +up 7 +forward 1 +forward 1 +up 2 +forward 2 +down 4 +up 8 +forward 1 +up 7 +down 2 +forward 2 +down 1 +forward 1 +down 4 +forward 4 +forward 8 +up 5 +down 6 +up 8 +forward 4 +down 3 +up 6 +forward 3 +forward 4 +down 5 +forward 1 +forward 6 +forward 4 +forward 1 +down 7 +down 4 +forward 2 +down 6 +forward 3 +down 5 +forward 3 +forward 4 +forward 4 +forward 9 +down 5 +forward 7 +forward 7 +forward 9 +down 1 +up 6 +forward 1 +down 9 +forward 3 +down 7 +up 8 +up 6 +down 7 +forward 2 +down 9 +forward 9 +forward 6 +down 9 +forward 6 +down 8 +forward 1 +up 6 +down 1 +forward 6 +down 9 +forward 6 +forward 7 +forward 3 +forward 8 +forward 5 +forward 8 +down 9 +down 2 +forward 3 +down 3 +up 4 +down 4 +down 3 +forward 3 +forward 3 +down 5 +forward 5 +forward 1 +down 9 +down 3 +up 7 +forward 9 +up 1 +down 1 +down 6 +up 1 +forward 2 diff --git a/2021/day03.hs b/2021/day03.hs new file mode 100644 index 0000000..abe9bc2 --- /dev/null +++ b/2021/day03.hs @@ -0,0 +1,35 @@ +module Day03 where +import Data.Char (digitToInt) +import Data.List (foldl', transpose) + +count :: Eq a => a -> [a] -> Int +count x = length . filter (x==) + +binToDec :: String -> Int +binToDec = foldl' (\acc x -> acc * 2 + digitToInt x) 0 + +getMostCommon :: String -> Char +getMostCommon x = if count '0' x > count '1' x then '0' else '1' + +getLeastCommon :: String -> Char +getLeastCommon x = if count '0' x > count '1' x then '1' else '0' + +filterNumbers :: (String->Char) -> Int -> [String] -> String +filterNumbers _ _ [x] = x +filterNumbers f i nums = filterNumbers f (i+1) $ filter (\w -> w!!i == filterVal) nums + where filterVal = f $ map (!!i) nums + +main :: IO () +main = do + input <- getContents + let bits = lines input + + putStr "part 1: " + let gamma = binToDec $ map getMostCommon $ transpose bits + let epsilon = binToDec $ map getLeastCommon $ transpose bits + print $ gamma*epsilon + + putStr "part 2: " + let oxygen = binToDec $ filterNumbers getMostCommon 0 bits + let co2 = binToDec $ filterNumbers getLeastCommon 0 bits + print $ oxygen*co2 \ No newline at end of file diff --git a/2021/day03.input b/2021/day03.input new file mode 100644 index 0000000..0e1771b --- /dev/null +++ b/2021/day03.input @@ -0,0 +1,1000 @@ +000110000001 +011011001101 +001101100111 +001101011001 +110111011101 +110011101010 +111101010001 +010100111101 +011000011000 +001110110011 +001100010110 +110111101100 +110001111100 +001011111100 +000000011010 +110101100111 +011000011111 +011000000111 +011111000110 +100101110111 +010101001110 +111101000011 +010010010110 +100100011111 +101011001110 +001111110000 +110000011111 +110000011000 +011001111100 +010010001101 +000111001110 +110111001110 +110001010101 +100111011001 +000101110000 +110001011100 +111101010010 +101011000001 +001101001111 +110111101010 +101111111000 +110101000110 +011111001001 +001110100001 +010100110111 +110100000110 +101010110010 +100100101110 +101111011110 +000110110101 +011011110101 +111001011110 +110110100111 +000100010001 +001101010110 +100011000110 +001110010010 +010111110111 +011010011101 +110000011100 +010100001001 +000110100000 +101001010000 +000001110000 +101110010011 +010011100111 +010011011000 +110111011111 +000111010010 +101010111010 +111001100100 +101110100011 +111101111110 +010111111000 +010010001111 +110010000011 +001110000010 +100101111110 +000100101001 +101101010000 +111111010000 +101010011000 +011100100001 +011101101000 +001010010100 +010010100011 +110011111111 +110100011001 +111010011110 +011110001101 +011010011100 +100100000001 +111111001010 +110100110011 +110100011111 +100010001110 +101000111100 +100001110010 +110101010011 +101010011101 +011010011010 +101110101101 +001100011010 +101001010101 +101010000100 +000110101010 +100000111100 +000111111100 +000001001011 +010010111100 +011000111001 +111010101100 +010011100010 +010100110001 +001100111011 +101100001111 +111010101111 +010001000011 +000001100010 +000100001011 +100110011011 +101100001110 +000010110100 +011000101011 +010011011100 +110101010000 +101101101100 +101001110000 +010111010011 +110101110001 +011000001000 +011101010010 +111011111110 +010010000110 +110000111000 +101000000110 +011100110000 +111001111010 +110000001100 +101011111110 +100001111100 +011011100110 +101000001101 +001011110011 +111100100011 +101111000111 +101000000001 +001001011010 +010111111010 +101010111001 +011110101001 +101100111101 +011100000010 +000110001111 +111100110101 +100011100010 +000110010100 +011000000011 +010011001011 +000001101111 +101011101101 +100100100101 +011001110110 +010100000000 +100100010001 +001100000100 +100000111010 +101001011001 +010010111001 +110000101010 +001101010101 +110110011100 +010000000011 +111100011000 +000101111110 +100010110101 +101111010000 +000010100010 +101101001010 +011111000000 +011000100100 +110010100110 +010001110011 +010101101101 +001011100000 +001000110110 +001000110111 +110100111110 +110010110100 +101010100111 +000111011001 +111000101101 +110000010110 +010011101010 +110100111011 +100110010100 +100111000011 +011110111111 +010010000111 +111100111110 +001010111101 +000011001110 +000110010101 +111100110011 +101111111001 +101001111011 +111010110000 +000001010101 +100010011001 +111110110010 +110100101100 +100001011110 +100001000011 +101111000011 +101111110100 +111010000010 +001010010110 +010001000110 +100010000101 +111101111010 +000101111111 +010110110100 +110111111110 +011010101011 +100000110011 +000000101001 +010010101111 +010001001010 +000101010100 +101110111010 +101001000000 +001010101111 +011110100110 +110101011001 +100111101101 +110001001001 +110100001010 +100100101001 +110111010011 +011010001011 +011001001101 +110100010001 +010100001100 +011011000001 +110100011100 +001110111111 +111001110010 +001110010000 +011100001110 +001111110001 +001101010111 +111110011100 +111100111010 +010100010100 +000011001010 +011110001010 +111101010011 +100111001010 +010110110011 +000101000000 +000110011010 +100100001111 +000100111111 +010100010101 +001110100011 +100111000100 +100001101110 +011010011110 +001111010101 +111000001100 +100111110110 +101110001100 +101011000111 +001010110010 +100011011100 +110000010000 +101001101011 +111011011000 +000101101001 +011001111011 +101011001111 +001111111111 +110000101011 +111111100011 +101010101111 +001001010001 +011111010001 +001011101110 +011010011011 +011000001011 +100000100000 +001011110110 +011000100011 +001010011010 +000010111111 +001110001111 +111110001100 +010110100011 +110101100010 +100111110000 +010000101011 +011100011111 +001100101010 +101110110100 +100101000111 +111111111010 +000001000001 +110111011001 +010011000000 +101100000101 +110000100100 +110100100101 +101011010010 +101001000101 +110001001111 +010010011010 +000110110111 +011010110001 +001101001001 +010110101000 +101000011000 +110010011010 +100101011111 +001101110011 +110001110001 +011110000110 +111011100101 +001100111001 +001011011011 +001011110001 +010001111101 +011000101001 +100100000110 +011000101111 +001010110100 +000100101010 +111011010110 +100111000000 +001000111010 +101101001111 +000110111010 +001111100001 +011110011001 +100011000101 +001010010011 +110011100110 +010010001011 +110101101110 +111100100101 +101100100010 +111010111101 +000000000011 +011011001110 +101110000001 +000111111000 +100000110001 +101101100111 +001001011001 +101100010010 +001000011100 +111011111100 +010000100011 +111010111100 +011001101111 +100011001111 +011001111010 +110110100101 +010110100110 +011110101101 +011101110001 +111000100101 +000010000000 +100110111001 +000101000001 +000001101100 +011010000100 +111000101001 +111100111111 +100110000110 +100010001010 +011110001000 +100001100100 +101101101010 +101111010001 +010001111100 +001010111001 +001101110111 +010100101100 +100011011101 +010100111000 +000110000000 +110101101010 +010100000101 +101110111100 +001010110000 +000000010101 +000100011000 +011010110100 +010000000010 +111101100011 +000111101001 +011101011100 +101000101101 +110110101011 +011010110011 +011001101010 +100000000011 +101001111111 +111010110100 +010000011100 +011011100000 +110011011000 +111011101111 +100010110110 +010000100111 +110101110101 +100010111001 +011011101000 +011010000001 +001001111110 +100010010001 +010101000110 +111111110010 +101011011110 +010011110110 +000010010100 +100011101111 +001001110110 +000100110100 +100101110110 +011010111001 +010010101110 +110010100011 +011010101010 +000101111000 +111011110011 +100111101110 +101111101001 +010111100010 +111011001011 +111110011110 +110110010110 +010110010111 +011111001100 +110111110010 +110011111000 +001110111101 +111100111000 +000100000010 +110101111110 +010111101101 +111001001010 +000010011100 +110101100100 +111000011110 +010110000000 +011100010011 +011110010100 +101000100111 +111011110101 +000100010000 +000110110011 +100011001011 +111010100000 +010100110101 +001000000101 +010001101100 +010110000101 +100100101111 +011101111110 +000011110000 +000011010011 +101111111110 +101001101010 +000010100011 +010100101010 +001111001110 +011000001001 +010001110100 +010111011110 +100000111111 +101100010101 +111101000110 +110111101111 +011010010010 +011100011100 +001111010010 +111001101000 +110110111010 +101110000111 +011100101100 +011100001010 +110101011101 +011100010010 +010101010010 +000001111101 +110100110111 +011111100111 +111101011110 +110110000110 +100110001011 +111110000001 +010001010011 +101001110110 +011101011101 +010011011110 +000100000000 +100110010001 +000011100110 +101111100001 +101100101010 +001010101110 +001111001101 +110000000111 +110010100001 +011100000111 +100111100111 +101001011111 +110000100011 +111001000111 +010101111010 +110111100100 +001010101100 +001011110100 +001010010111 +110001001000 +110010011001 +110111011100 +001110000011 +010001000010 +100000000101 +110001101001 +000101010111 +101010110101 +100000010000 +000000111100 +011011100100 +110010001110 +110110100000 +101100001100 +110010110111 +010001100010 +101110100010 +001101101101 +010100110000 +010010100000 +011101110100 +100011011001 +010110111101 +010110011011 +011111011111 +001000000000 +001101110101 +010000010101 +000101001000 +011011100101 +001010000101 +110010001101 +000001000011 +001101001110 +000101100010 +010110100001 +010111110011 +011000100111 +100001101011 +100100100011 +111100011001 +010010101000 +101010000010 +010011000001 +100000000010 +010011101011 +101110100111 +111101101011 +011010001111 +001000011000 +011111110111 +101111011100 +011011011111 +110111100010 +010010110001 +111100010111 +111000001111 +101100010011 +010101001101 +110101100001 +010111010110 +110000001111 +000111000000 +110010010001 +001110110101 +101000010010 +010110001100 +001101101010 +110110110110 +000000000111 +011010010000 +011001010111 +001010101011 +001001100011 +001111010110 +000000100111 +000000010100 +001001110011 +010111000010 +010000001100 +101111010111 +101001110100 +100011010111 +000111110100 +011101111010 +000111000010 +011100111100 +011011110100 +101000110011 +010101110111 +111101101000 +010010011011 +000101011111 +010000000110 +011110100101 +111000000100 +010110110101 +010110111001 +101110010000 +010111001111 +001001000110 +010100010000 +101100100111 +101100001000 +110110001001 +011001001010 +011001001110 +110011101001 +010100101111 +111101001000 +100000101100 +111000011000 +011000011100 +111111010001 +111100100100 +011000111110 +010011010000 +100110101100 +110000100001 +001101010011 +011000101110 +000110010000 +011010101100 +001110001010 +010101000001 +101010010101 +100000010111 +000100110101 +110111010110 +101101101011 +100101100101 +101010011110 +111001000100 +011101100111 +010000110101 +100111010110 +010011111110 +111011100100 +100010101101 +010110100101 +100011100000 +110010011101 +011110000011 +111111110011 +100001101100 +000000011000 +000100101101 +000100110000 +000110000010 +011110010011 +111001111111 +000011110101 +111001101100 +111010111010 +000101000101 +111000010110 +111010011000 +101110100110 +111100000100 +101000110001 +000001010110 +101000100000 +110111001010 +001001101000 +010011111010 +100010100100 +110010101001 +111101100101 +010001000101 +011001111101 +110000001110 +100101101100 +110110111100 +010111011101 +111011011100 +011111011100 +100100011001 +111010011011 +110011101011 +100001101000 +010110100010 +101100100110 +010110111010 +111111011001 +101011110011 +011001101001 +110011100111 +010100111110 +001001010011 +010101110000 +010111010101 +100110011100 +110010011011 +001011010111 +000001010100 +001111011100 +000010100100 +010101011011 +010100001011 +000001011110 +011111010111 +010000101100 +111111101111 +100101010110 +100011010101 +100101100100 +010011111101 +010011001111 +011010000101 +110010000111 +101110110110 +000010001001 +111000010010 +111001001111 +111000111010 +010111011100 +011010001101 +111011011111 +001010110001 +011111111101 +001001001011 +100100011000 +001000101010 +101001111010 +011101000010 +111010000111 +001000100000 +100000100010 +111111011000 +110011000110 +111111100010 +100110011101 +101111101000 +001001001100 +100001100001 +100111110011 +001000100010 +011100011000 +000001010010 +100010111110 +101111010010 +100100000011 +000101000010 +101001011100 +000101001101 +000101110010 +111111111011 +110100000100 +000001000010 +101011010101 +000011110011 +000011001000 +010111111001 +111110100111 +100110100111 +001100001111 +000100011110 +001101000101 +011110000000 +000100111100 +011110010111 +011011010011 +010101011110 +100111001100 +011111101010 +011011001000 +100100110100 +011101010101 +100101111001 +100011101001 +101010000001 +101110111001 +110100101111 +010001001100 +100110110000 +100000111001 +010111011011 +111110001000 +101000111101 +000011010110 +100010010010 +010010011111 +011110111110 +000100111000 +111100001101 +000010110101 +010010001110 +101111000100 +100101111100 +010100011111 +110101010010 +000010111110 +100001000100 +001010001010 +110000111100 +010000101000 +111000110110 +001001101010 +001101011100 +001000001100 +110010011100 +011111000011 +111100101101 +110111010101 +000010010110 +111101110111 +000011010010 +111110000000 +001111000101 +100010111100 +001011000011 +010110000010 +001101111101 +101011000011 +100001010010 +100001010100 +111100011101 +010110001101 +011101101101 +101010101110 +110111110100 +001111001010 +100010111101 +011010001001 +111111001000 +100010100001 +111010010110 +001101000011 +000011111011 +110101000100 +110101111101 +010010000011 +110101001111 +001110111110 +101111100011 +011011011100 +001100100100 +010011111000 +101010001111 +111101010101 +001110110001 +101100010100 +100010001000 +101110000110 +001101100001 +111001000110 +101110011110 +100010000110 +101010111011 +001010110101 +001101101110 +100000101111 +011001000001 +010100001110 +100111101000 +011000110000 +110000101111 +010110111111 +001110101000 +111010100010 +100000110100 +100100000010 +101010110011 +010101000100 +100100001011 +000110011011 +110001000010 +111111000111 +010001010010 +001000011011 +110010000101 +111110110111 +001000111001 +101111100010 +101001110010 +001101101111 +101001101101 +001000010011 +111000011111 +111111110101 +101001000001 +010101101111 +110100100100 +001011101011 +001010111100 +000111100011 +010001010100 +110011000011 +100111100000 +001001111001 +111111100001 +001001100110 +001000101001 +111101011011 +111000000010 +100000100111 +101011100100 +001010111110 +100110110100 +110111100111 +000110101000 +011001000111 +010111000001 +101111101101 +000001101101 +000110100111 +110001010100 +111110101111 +111110110101 +111000010001 +101111011010 +101111110110 +000000101100 +010011010010 +000101010101 +100110101000 +000111000011 +001000010110 +000111001010 +000001000111 +000101000110 +000100010100 +001011011101 +001001111101 +000000000101 +000100100101 +101010001101 +001010000111 +110110001110 +000010011010 +011001110101 +111111101011 +001100001100 +100111001000 +011010011000 +000001101001 +010001111001 +001001110100 +111110111000 +000010010001 +111111010011 +100000011011 +010110010100 +010000111000 +100001110110 +111101111001 +110000011010 +100110101111 +010001100111 +100001011100 +110000010011 +010100001111 +110010010110 +110010111000 +001011000110 +101011001101 +010000000100 +010010000000 +010100100101 +110010100101 +010101110110 +101101001101 +110000110011 +110011110110 +111101110110 +001011111001 +110101101000 +101111111100 +110011111101 +100001111110 +011101111000 +101010000111 +101110011111 +101000010101 diff --git a/2021/day04.hs b/2021/day04.hs new file mode 100644 index 0000000..325e309 --- /dev/null +++ b/2021/day04.hs @@ -0,0 +1,42 @@ +module Day04 where +import Data.List.Split ( splitOn ) +import Data.Maybe (catMaybes, mapMaybe, listToMaybe) +import Data.List (transpose, sort) + +type Board = [[Int]] + +checkRowTime :: [Int] -> [Int] -> Maybe Int +checkRowTime values row = fmap maximum elemTimes + where + elemTimes = mapM (`lookup` times) row + times = zip values [0..] + +checkBingoTime :: [Int] -> Board -> Maybe Int +checkBingoTime values board = listToMaybe $ sort $ catMaybes $ horTimes ++ verTimes + where + horTimes = map (checkRowTime values) board + verTimes = map (checkRowTime values) (transpose board) + +calculateScore :: [Int] -> Int -> Board -> Int +calculateScore values time card = values!!time * sum unmarked + where + marked = take (time+1) values + unmarked = filter (`notElem` marked) $ concat card + +main :: IO () +main = do + firstLine <- getLine + let values = map (read :: String->Int) $ splitOn "," firstLine + _ <- getLine + + input <- getContents + let cards = map (map (map (read::String->Int))) $ map (map words) $ splitOn [""] $ lines input + let cardsWithTime = mapMaybe (\card -> fmap (\t -> (t,card)) (checkBingoTime values card)) cards + + putStr "part 1: " + let (time,card) = minimum cardsWithTime + print $ calculateScore values time card + + putStr "part 2: " + let (time,card) = maximum cardsWithTime + print $ calculateScore values time card \ No newline at end of file diff --git a/2021/day04.input b/2021/day04.input new file mode 100644 index 0000000..31161a0 --- /dev/null +++ b/2021/day04.input @@ -0,0 +1,601 @@ +31,50,68,16,25,15,28,80,41,8,75,45,96,9,3,98,83,27,62,42,59,99,95,13,55,10,23,84,18,76,87,56,88,66,1,58,92,89,19,54,85,74,39,93,77,26,30,52,69,48,91,73,72,38,64,53,32,51,6,29,17,90,34,61,70,4,7,57,44,97,82,37,43,14,81,65,11,22,5,36,71,35,78,12,0,94,47,49,33,79,63,86,40,21,24,46,20,2,67,60 + +95 91 54 75 45 +46 94 39 44 85 +31 43 24 2 70 +90 58 4 30 77 +13 26 38 52 34 + +68 14 99 63 46 +67 16 82 10 8 +55 52 41 51 4 +90 17 32 44 74 +89 94 73 56 36 + + 6 91 2 28 71 + 7 88 37 21 36 +95 32 84 57 8 +13 79 89 75 48 +47 81 66 17 5 + +44 55 48 16 41 +35 5 43 53 11 + 0 79 19 82 49 +30 85 31 72 39 +27 68 65 66 95 + + 6 46 55 24 40 +87 16 62 11 64 + 8 49 18 59 91 +72 28 48 19 96 +39 73 9 88 0 + +46 1 18 93 6 +50 96 41 81 58 +62 66 49 32 55 +29 11 65 2 10 +71 30 17 69 43 + +84 57 6 56 95 +39 15 32 1 10 +55 43 40 3 22 +89 54 13 80 38 +72 12 59 71 77 + + 3 51 72 88 6 +56 64 99 82 36 +75 81 42 67 24 +41 79 35 40 73 + 2 14 61 50 87 + +72 7 0 99 24 +29 81 92 74 38 +84 53 20 56 91 +93 64 44 48 2 +37 40 88 96 97 + +39 87 99 75 38 +45 81 46 72 62 +40 8 24 67 79 +96 1 77 73 70 +34 13 55 83 59 + +18 38 55 84 58 +35 97 31 26 44 +80 1 28 71 85 +45 46 10 32 99 +60 48 72 11 53 + +53 44 6 30 82 +65 64 10 0 86 +81 50 5 21 60 +16 19 97 66 73 +20 24 96 68 69 + +33 85 88 58 20 +19 2 99 40 70 +69 10 17 67 23 +48 9 29 34 3 +89 30 43 41 94 + +30 83 37 14 78 +57 42 98 90 28 + 5 82 51 15 55 +77 79 96 67 53 +22 76 0 59 47 + +10 93 84 54 11 +59 30 6 94 75 + 9 62 68 37 24 +61 3 66 58 74 +64 0 83 32 13 + +24 77 15 5 49 +23 11 70 17 10 +62 33 38 36 12 + 3 61 0 26 65 +63 47 54 50 9 + +34 28 24 55 38 +69 37 36 32 72 +91 85 9 64 68 +94 22 96 90 82 +30 20 97 19 56 + +35 90 58 93 2 +72 8 27 88 16 +25 54 69 60 61 + 1 15 9 71 78 +89 42 46 57 91 + +43 38 47 1 82 +19 32 2 95 51 +78 74 91 10 22 +80 77 33 60 14 + 0 98 70 54 50 + +71 94 3 84 31 +10 59 12 28 46 +68 69 13 48 36 +37 49 24 26 61 +72 65 38 16 25 + +68 78 10 90 29 +40 14 45 43 44 +27 75 72 39 87 +96 93 53 12 11 +37 64 56 59 76 + +19 78 84 68 41 +36 96 87 15 55 +47 33 10 91 85 +11 94 31 49 35 +83 63 86 4 76 + + 5 89 55 46 96 +67 22 95 82 56 +61 94 84 99 28 +71 70 16 57 63 +98 92 86 73 83 + +56 24 93 88 29 +74 89 50 44 79 +97 49 87 31 8 +70 6 57 3 82 +20 25 99 48 78 + +80 20 45 22 57 +43 35 48 44 52 +29 98 38 27 11 +64 49 84 60 31 + 7 97 17 85 74 + +21 1 18 41 62 +76 38 13 46 27 + 0 16 43 28 53 +54 42 22 83 20 + 4 25 50 11 56 + +21 71 73 30 51 +92 27 14 16 11 +89 43 38 62 31 +65 4 36 84 94 +56 13 59 22 6 + +46 28 45 57 6 +16 67 33 20 44 +36 86 92 3 11 +98 27 26 84 31 + 5 76 13 65 25 + +49 55 99 31 73 +80 0 83 26 65 + 3 96 60 37 50 +57 34 7 20 23 +70 52 93 13 71 + +78 41 81 32 76 +37 36 16 99 48 + 3 93 33 85 35 +60 38 74 80 56 +86 29 87 20 7 + +98 24 4 9 82 +22 37 52 81 30 +51 70 17 23 8 +60 61 75 35 85 +33 48 88 13 57 + +49 52 91 21 46 +90 51 70 5 35 +57 68 31 86 87 +42 36 25 95 3 +73 64 17 96 80 + + 6 42 13 16 24 +51 72 55 78 47 +67 28 7 97 64 +44 77 98 71 25 +82 8 31 76 73 + +63 79 18 80 27 +57 66 47 89 14 +15 61 94 38 29 +21 53 73 17 76 +65 7 23 36 3 + +93 22 8 52 4 +63 31 90 46 68 +51 14 95 50 23 +17 34 60 75 36 +88 55 7 0 73 + +42 67 91 15 83 + 1 37 76 12 25 +29 82 50 70 86 +74 66 39 90 16 +31 71 47 5 92 + +98 48 27 87 2 +60 0 25 30 14 +44 61 94 82 16 +17 19 53 49 59 +15 85 50 63 8 + +63 12 52 81 97 +87 68 44 31 41 +39 24 99 27 6 + 1 21 35 59 51 + 4 92 3 90 62 + +66 43 98 25 47 +59 16 75 44 82 +40 58 48 60 37 +13 81 61 45 83 +24 89 93 19 67 + + 8 86 47 81 83 + 1 91 57 59 68 + 0 52 25 93 95 +27 84 63 45 36 +39 62 20 99 88 + +67 28 65 4 17 +44 33 12 99 84 +27 36 34 5 10 +38 63 97 82 64 +94 19 58 41 6 + +28 41 96 16 39 +93 78 56 69 75 +74 60 9 30 7 +12 81 35 84 94 +45 20 6 49 2 + +33 7 5 43 9 +97 65 50 2 1 +26 86 76 47 98 +83 31 30 58 52 +93 51 34 63 12 + +65 81 10 46 59 +51 89 85 2 52 +13 54 18 70 4 +37 94 75 92 56 +58 99 91 32 41 + +44 23 18 16 75 + 5 3 45 76 90 +20 71 69 37 99 +49 91 43 32 82 + 4 79 51 2 39 + +54 80 71 61 76 +81 52 6 89 34 +58 14 20 26 40 +25 60 45 0 3 +36 33 65 41 94 + +53 23 56 55 92 + 3 81 59 0 35 +32 30 93 70 40 +45 91 24 65 6 +95 88 16 47 8 + +24 23 10 47 63 +38 79 18 77 62 +13 88 72 68 36 +96 27 12 69 89 +28 94 6 98 20 + +70 1 61 77 28 +92 22 30 48 96 +66 3 34 29 45 +85 6 17 87 5 +97 89 14 80 20 + +40 86 97 5 54 +91 57 12 19 7 +62 88 92 20 32 +50 77 11 39 22 +33 2 21 95 35 + +51 79 64 24 28 +95 19 82 58 76 +69 30 9 14 42 +27 16 56 80 83 +52 5 49 43 45 + +26 65 68 18 55 +58 83 30 48 4 +69 42 78 96 22 +91 13 82 38 41 +67 33 10 98 53 + +74 97 43 1 18 +49 30 28 10 15 +42 12 80 20 96 +41 92 67 22 36 + 5 26 13 47 4 + +85 60 72 19 48 +61 21 43 34 83 +51 75 94 11 78 +27 89 45 49 79 +97 15 5 28 50 + +69 99 97 77 98 +37 80 86 7 34 +85 28 31 23 16 +32 47 8 40 4 +46 91 71 54 74 + +23 43 29 7 21 +58 34 42 4 38 +64 96 16 73 49 +36 92 52 81 31 +85 71 78 13 5 + +65 71 46 5 11 +24 4 6 0 23 +13 17 76 15 34 +27 79 10 56 85 +90 19 30 94 78 + +81 40 65 12 35 +23 93 24 96 53 +27 60 87 59 33 +76 56 4 17 6 +78 49 90 3 80 + + 7 25 42 85 39 +40 6 26 11 63 +48 20 62 61 89 +78 15 18 21 53 +69 4 87 47 5 + +38 65 87 72 26 +88 75 10 30 3 +89 58 7 20 32 +85 2 97 63 15 +28 77 82 57 64 + +16 89 6 31 27 +45 69 61 5 15 +40 75 64 94 98 +36 18 26 58 90 +10 44 59 13 67 + +80 13 39 49 42 +50 94 12 14 88 +97 48 15 68 69 +21 18 51 99 91 +89 64 35 63 84 + +81 96 26 43 30 + 5 74 9 93 60 +63 41 1 14 22 + 4 77 33 53 3 +38 90 50 25 10 + +58 66 17 0 16 + 5 67 41 48 40 +43 93 76 95 68 + 4 13 14 51 8 +56 74 23 57 94 + +18 15 92 4 20 +69 26 84 23 2 +72 35 56 96 9 +61 41 85 91 25 +13 70 1 14 77 + +15 20 77 80 47 +45 34 63 55 75 +65 12 66 44 22 +74 3 25 38 93 + 9 31 68 87 67 + +54 95 79 50 75 +18 36 20 34 43 +17 65 55 98 61 +27 46 56 6 52 +91 31 30 40 0 + +25 30 24 64 98 + 8 72 53 45 3 +27 77 0 33 44 +89 39 34 71 38 +54 21 20 80 23 + +69 38 63 60 4 +55 37 83 68 61 +67 25 86 24 18 +22 59 65 28 70 +84 46 44 91 96 + +35 27 65 31 0 +46 97 44 74 4 +56 61 7 49 88 + 5 38 50 20 26 +62 9 45 64 51 + + 3 28 43 97 7 +88 57 17 82 73 +16 94 74 22 39 +84 99 31 1 47 +92 91 55 38 78 + +60 31 29 49 72 +89 41 5 79 22 +58 28 90 76 95 +93 45 14 47 37 +65 25 7 59 62 + +58 1 73 30 55 +95 46 5 80 63 +52 16 70 20 71 +84 60 15 0 77 +99 89 17 72 31 + +83 21 68 18 42 + 1 28 97 31 35 + 2 38 67 63 74 +77 27 48 90 86 +12 52 26 29 60 + +81 53 80 85 96 +19 32 31 15 88 +91 92 66 37 34 +74 75 33 39 78 +42 40 30 83 58 + +40 41 80 69 67 +24 63 97 33 5 +28 84 34 72 11 +36 79 91 14 92 +55 89 59 10 44 + + 0 51 49 24 60 +48 65 28 70 66 +86 58 78 77 18 + 6 44 50 37 36 + 4 73 91 97 43 + +66 42 76 12 48 +77 83 35 18 50 +30 87 95 99 11 + 0 52 92 16 51 +26 56 39 64 62 + +83 89 52 61 45 +74 77 66 59 30 +85 17 38 10 8 +97 67 54 21 26 +34 63 11 94 40 + +93 91 14 49 38 +77 53 29 36 39 +12 52 0 48 92 +95 82 71 76 37 +19 70 75 9 74 + +80 49 59 67 27 +43 66 97 81 12 +10 77 24 75 68 +16 57 14 28 85 +41 52 23 15 2 + +39 89 66 27 11 +63 84 21 44 69 +56 51 58 70 83 +14 0 8 41 31 +98 18 61 97 74 + +97 18 63 29 24 +75 73 80 8 7 +81 37 46 93 68 +57 32 2 41 5 + 4 65 88 45 54 + +87 26 81 12 50 +19 9 68 23 71 +74 38 4 34 16 +18 99 86 45 7 +35 8 11 98 57 + +13 31 78 59 58 +51 61 96 68 44 +41 85 26 55 92 +11 62 30 7 64 +18 19 73 27 17 + +48 85 71 39 29 +33 79 24 0 72 +95 52 12 77 40 +70 31 46 44 43 +61 88 73 49 65 + +60 81 51 24 27 +23 28 47 85 67 +35 57 45 76 84 +19 48 30 37 74 +15 78 56 87 16 + +12 5 45 26 21 + 1 71 51 10 25 +37 68 73 46 56 +55 20 63 87 91 +22 32 66 90 19 + +20 59 12 29 97 +92 30 77 27 49 +14 98 23 50 6 +11 47 61 34 36 +55 82 13 22 21 + +29 37 0 40 71 + 2 43 97 18 59 +32 72 89 99 24 +58 90 73 60 85 +69 53 95 78 27 + +58 28 32 52 55 +86 33 1 41 60 + 8 53 42 92 5 +43 69 96 54 24 +74 10 17 89 85 + +51 74 99 21 64 +54 27 60 32 37 +14 45 50 81 94 +28 11 77 17 23 +93 95 53 57 79 + +16 5 80 45 71 +22 57 9 90 43 + 3 52 47 59 84 +28 53 14 15 7 +50 76 46 56 34 + +83 62 77 56 26 +82 35 11 6 51 +96 97 15 1 78 +92 45 55 84 94 +20 8 70 21 31 + + 4 47 68 81 12 +66 23 35 8 39 +73 94 27 69 22 +59 11 53 26 99 + 7 20 87 60 88 + +90 0 88 81 43 +47 54 42 29 97 +60 13 85 51 71 +56 14 94 80 41 +75 8 35 69 61 + +51 38 40 17 42 +19 26 92 64 67 +33 66 82 27 55 +62 2 68 59 31 + 7 24 20 91 79 + +21 83 45 35 88 +85 11 5 86 72 +78 3 58 0 89 +67 1 39 59 63 +79 87 19 4 57 + +25 16 40 17 27 +96 72 29 32 87 +50 63 35 81 66 + 7 11 92 68 69 +54 83 12 51 95 + +64 98 67 54 75 + 8 10 31 5 57 +89 23 25 34 47 +72 74 37 48 94 +39 59 15 55 87 diff --git a/2021/day05.hs b/2021/day05.hs new file mode 100644 index 0000000..d28fec8 --- /dev/null +++ b/2021/day05.hs @@ -0,0 +1,46 @@ +module Day05 where +import Data.Map (Map, insertWith, empty, elems) +import Data.List.Split (splitOn) + +data Line = Line (Int,Int) (Int,Int) deriving Show +type Field = Map (Int,Int) Int +strToLine :: String -> Line +strToLine s = Line (x1,y1) (x2,y2) where + [x1,y1] = map read $ splitOn "," p1 + [x2,y2] = map read $ splitOn "," p2 + [p1,"->",p2] = words s + +coverPoint :: (Int,Int) -> Field -> Field +coverPoint point = Data.Map.insertWith (+) point 1 + +coverLine :: Line -> Field -> Field +coverLine (Line (x1,y1) (x2,y2)) field + | y1 == y2 = let points = map (\x -> (x,y1)) [xMin..xMax] in foldr coverPoint field points + | x1 == x2 = let points = map (\y -> (x1,y)) [yMin..yMax] in foldr coverPoint field points + | otherwise = field + where xMin = min x1 x2; xMax = max x1 x2; yMin = min y1 y2; yMax = max y1 y2 + +coverLineDiag :: Line -> Field -> Field +coverLineDiag (Line (x1,y1) (x2,y2)) field + | y1 == y2 = let points = map (\x -> (x,y1)) [xMin..xMax] in foldr coverPoint field points + | x1 == x2 = let points = map (\y -> (x1,y)) [yMin..yMax] in foldr coverPoint field points + | x1 == xMin && y1 == yMin = let points = zip [x1..x2] [y1..y2] in foldr coverPoint field points + | x1 == xMin && y1 == yMax = let points = zip [x1..x2] (reverse [y2..y1]) in foldr coverPoint field points + | otherwise = coverLineDiag (Line (x2,y2) (x1,y1)) field + where xMin = min x1 x2; xMax = max x1 x2; yMin = min y1 y2; yMax = max y1 y2 + +main :: IO () +main = do + lines <- getContents >>= ((return . map strToLine) . lines) + + putStr "part 1: " + let covered = foldr coverLine Data.Map.empty lines + let num_overlap = length $ filter (>=2) $ Data.Map.elems covered + print num_overlap + + putStr "part 2: " + let covered = foldr coverLineDiag Data.Map.empty lines + let num_overlap = length $ filter (>=2) $ Data.Map.elems covered + print num_overlap + + return () \ No newline at end of file diff --git a/2021/day05.input b/2021/day05.input new file mode 100644 index 0000000..d7b445a --- /dev/null +++ b/2021/day05.input @@ -0,0 +1,500 @@ +593,10 -> 593,98 +777,236 -> 964,236 +650,575 -> 476,575 +120,612 -> 715,17 +508,707 -> 508,89 +98,834 -> 751,834 +623,554 -> 623,701 +929,976 -> 62,109 +368,893 -> 330,931 +495,335 -> 40,335 +44,704 -> 423,704 +683,711 -> 683,487 +26,940 -> 833,133 +961,183 -> 454,183 +301,306 -> 301,935 +973,822 -> 398,822 +639,911 -> 515,911 +861,180 -> 184,857 +31,97 -> 857,923 +966,376 -> 966,114 +881,485 -> 881,377 +930,98 -> 110,918 +841,889 -> 841,35 +512,261 -> 880,261 +48,533 -> 48,674 +207,226 -> 52,226 +823,952 -> 177,306 +331,566 -> 423,566 +422,418 -> 422,130 +699,517 -> 699,567 +757,784 -> 241,784 +508,445 -> 560,393 +866,275 -> 435,706 +74,41 -> 74,258 +386,369 -> 334,317 +240,94 -> 240,969 +851,197 -> 577,197 +28,906 -> 741,193 +286,227 -> 286,293 +849,800 -> 849,665 +736,307 -> 336,307 +69,701 -> 494,276 +421,823 -> 96,823 +121,626 -> 121,393 +318,351 -> 194,351 +670,671 -> 439,671 +603,914 -> 603,272 +61,507 -> 61,889 +266,39 -> 157,39 +543,664 -> 869,664 +382,709 -> 884,709 +499,80 -> 548,80 +489,79 -> 878,79 +695,86 -> 644,86 +987,585 -> 987,557 +287,67 -> 551,67 +975,983 -> 35,43 +707,351 -> 232,351 +529,175 -> 852,175 +32,811 -> 604,811 +106,153 -> 815,153 +195,268 -> 509,582 +50,922 -> 312,922 +220,500 -> 872,500 +473,33 -> 569,33 +858,847 -> 162,151 +937,947 -> 26,36 +726,435 -> 402,435 +686,601 -> 474,813 +764,880 -> 84,200 +850,950 -> 850,464 +413,620 -> 413,285 +893,560 -> 229,560 +149,100 -> 149,901 +358,613 -> 243,613 +202,445 -> 202,411 +127,153 -> 513,539 +147,846 -> 53,940 +139,920 -> 679,380 +913,953 -> 913,735 +339,466 -> 339,177 +113,882 -> 647,882 +18,880 -> 134,880 +897,152 -> 897,428 +473,511 -> 636,511 +880,370 -> 358,370 +400,244 -> 721,244 +419,987 -> 120,688 +872,224 -> 481,224 +335,302 -> 730,302 +961,324 -> 961,157 +769,301 -> 959,301 +829,124 -> 144,124 +523,372 -> 985,372 +520,33 -> 520,685 +554,644 -> 808,898 +82,676 -> 870,676 +303,612 -> 303,705 +338,40 -> 338,939 +836,47 -> 72,811 +371,751 -> 575,955 +929,505 -> 929,324 +273,181 -> 275,183 +347,595 -> 347,463 +95,629 -> 95,606 +809,188 -> 126,871 +857,924 -> 145,212 +668,277 -> 668,63 +700,904 -> 700,45 +814,899 -> 22,899 +205,98 -> 714,607 +943,28 -> 40,931 +282,620 -> 773,129 +424,803 -> 285,803 +688,329 -> 299,329 +146,628 -> 34,628 +573,417 -> 164,826 +292,232 -> 412,112 +412,508 -> 145,508 +632,648 -> 632,92 +885,904 -> 885,513 +295,981 -> 132,818 +134,681 -> 41,681 +810,531 -> 959,531 +188,590 -> 188,215 +960,795 -> 189,24 +729,211 -> 729,833 +214,817 -> 845,817 +196,609 -> 584,609 +384,908 -> 384,101 +770,907 -> 770,530 +451,469 -> 451,812 +571,261 -> 834,261 +799,436 -> 799,983 +248,105 -> 248,879 +783,906 -> 783,903 +955,670 -> 790,670 +723,750 -> 723,429 +572,427 -> 546,427 +610,341 -> 527,341 +925,426 -> 816,317 +151,403 -> 151,684 +408,969 -> 408,369 +276,425 -> 276,75 +186,86 -> 186,758 +412,420 -> 412,531 +361,60 -> 976,60 +787,649 -> 667,769 +45,866 -> 91,866 +319,963 -> 51,963 +112,866 -> 112,747 +291,475 -> 504,475 +175,116 -> 357,116 +968,961 -> 968,213 +13,12 -> 987,986 +640,728 -> 767,728 +981,505 -> 246,505 +864,981 -> 128,981 +91,66 -> 931,906 +798,116 -> 91,823 +552,74 -> 88,538 +620,872 -> 232,872 +45,229 -> 658,229 +413,75 -> 413,436 +815,257 -> 815,686 +989,22 -> 36,975 +178,904 -> 233,849 +635,128 -> 635,96 +640,820 -> 640,313 +890,787 -> 167,64 +221,22 -> 826,22 +914,132 -> 60,986 +848,31 -> 392,487 +105,969 -> 858,969 +903,868 -> 143,108 +38,941 -> 621,358 +171,340 -> 14,497 +286,460 -> 81,255 +726,688 -> 857,819 +494,689 -> 510,689 +517,913 -> 598,913 +932,66 -> 932,431 +977,982 -> 18,23 +95,101 -> 95,278 +574,467 -> 349,467 +63,803 -> 63,882 +838,874 -> 255,874 +900,752 -> 181,33 +102,897 -> 989,10 +374,439 -> 374,277 +513,504 -> 513,885 +814,932 -> 814,407 +824,656 -> 959,521 +415,570 -> 616,570 +577,880 -> 577,181 +287,524 -> 986,524 +955,665 -> 323,665 +556,365 -> 263,658 +154,226 -> 886,226 +803,750 -> 866,750 +558,725 -> 558,395 +941,115 -> 941,150 +180,410 -> 180,874 +458,753 -> 112,753 +199,253 -> 363,253 +423,650 -> 22,650 +892,851 -> 279,238 +611,109 -> 611,198 +983,344 -> 339,988 +299,47 -> 299,934 +435,652 -> 700,387 +186,775 -> 677,284 +136,576 -> 136,368 +818,744 -> 305,744 +767,171 -> 767,431 +930,842 -> 259,171 +342,831 -> 342,601 +193,672 -> 46,525 +925,164 -> 528,164 +725,92 -> 617,200 +67,729 -> 67,739 +547,153 -> 547,245 +763,434 -> 763,509 +314,888 -> 357,888 +72,645 -> 491,645 +92,67 -> 240,67 +827,936 -> 788,897 +852,378 -> 77,378 +448,337 -> 668,337 +846,739 -> 499,739 +465,691 -> 315,541 +716,163 -> 18,861 +78,965 -> 983,60 +114,952 -> 820,246 +950,351 -> 419,882 +266,36 -> 266,482 +773,841 -> 773,66 +742,198 -> 742,46 +417,512 -> 304,625 +900,277 -> 900,338 +983,431 -> 473,941 +986,282 -> 734,30 +742,19 -> 769,19 +952,320 -> 948,324 +92,590 -> 548,590 +107,39 -> 107,696 +603,749 -> 603,26 +55,282 -> 888,282 +670,848 -> 985,533 +981,982 -> 92,93 +147,428 -> 649,930 +773,737 -> 821,785 +791,576 -> 791,852 +327,672 -> 530,469 +847,122 -> 381,122 +419,493 -> 498,572 +879,842 -> 879,239 +267,717 -> 267,869 +142,449 -> 174,417 +342,718 -> 342,397 +603,207 -> 314,207 +612,648 -> 735,771 +37,10 -> 971,944 +891,716 -> 891,86 +252,217 -> 662,627 +185,165 -> 941,921 +854,717 -> 676,717 +158,791 -> 336,791 +762,226 -> 98,890 +73,189 -> 92,189 +649,511 -> 253,115 +719,456 -> 514,251 +605,286 -> 325,286 +454,609 -> 454,489 +374,541 -> 783,541 +599,177 -> 94,682 +600,384 -> 32,384 +810,933 -> 39,162 +780,871 -> 409,871 +24,639 -> 24,316 +454,80 -> 454,95 +556,541 -> 907,541 +627,295 -> 750,295 +245,71 -> 214,102 +725,445 -> 614,445 +779,538 -> 779,390 +746,667 -> 351,272 +117,776 -> 117,660 +498,495 -> 88,905 +697,721 -> 697,919 +580,314 -> 580,166 +22,656 -> 641,37 +413,433 -> 44,802 +182,305 -> 805,928 +739,277 -> 739,499 +172,210 -> 172,259 +894,576 -> 894,322 +265,263 -> 265,437 +430,228 -> 780,578 +464,531 -> 798,531 +713,63 -> 668,63 +918,831 -> 256,169 +414,375 -> 467,375 +440,32 -> 391,32 +439,806 -> 955,806 +335,820 -> 335,279 +727,458 -> 422,458 +312,274 -> 619,581 +136,724 -> 538,322 +589,680 -> 589,850 +335,648 -> 232,545 +499,216 -> 405,216 +942,710 -> 942,455 +969,556 -> 721,556 +756,552 -> 756,902 +98,870 -> 445,870 +476,833 -> 476,269 +820,127 -> 407,127 +337,519 -> 714,519 +756,95 -> 11,840 +317,339 -> 317,286 +353,86 -> 43,86 +93,950 -> 938,105 +705,509 -> 705,319 +244,879 -> 721,402 +434,794 -> 711,517 +272,381 -> 431,381 +652,104 -> 652,587 +850,866 -> 34,50 +645,902 -> 79,336 +701,39 -> 701,295 +492,793 -> 95,396 +352,554 -> 395,554 +123,405 -> 322,206 +941,745 -> 716,520 +450,512 -> 569,631 +42,25 -> 817,800 +909,387 -> 909,863 +919,934 -> 919,546 +439,881 -> 569,881 +167,866 -> 167,669 +242,264 -> 242,694 +981,786 -> 228,33 +452,434 -> 452,660 +22,26 -> 22,29 +26,155 -> 677,806 +801,627 -> 313,627 +657,135 -> 657,270 +872,875 -> 440,443 +636,248 -> 636,338 +776,51 -> 93,51 +498,600 -> 894,600 +263,984 -> 263,807 +416,390 -> 899,873 +269,137 -> 976,137 +752,12 -> 752,617 +55,925 -> 548,925 +856,551 -> 771,551 +653,93 -> 653,587 +403,286 -> 403,417 +895,706 -> 221,32 +139,822 -> 139,928 +696,194 -> 696,143 +270,678 -> 710,678 +879,353 -> 879,360 +949,712 -> 752,712 +665,661 -> 817,661 +462,952 -> 980,434 +692,766 -> 692,478 +157,117 -> 144,117 +438,701 -> 408,701 +401,703 -> 401,724 +876,831 -> 108,63 +749,892 -> 832,892 +455,124 -> 455,776 +551,222 -> 551,372 +533,80 -> 726,80 +342,740 -> 56,740 +793,370 -> 34,370 +949,614 -> 949,623 +610,287 -> 610,760 +978,834 -> 85,834 +644,894 -> 644,341 +35,887 -> 176,887 +168,958 -> 964,162 +341,886 -> 341,470 +417,845 -> 417,702 +338,347 -> 304,313 +651,10 -> 72,10 +853,160 -> 853,85 +381,568 -> 436,623 +794,437 -> 250,437 +861,72 -> 206,72 +807,813 -> 807,827 +820,502 -> 820,329 +547,508 -> 547,773 +160,129 -> 160,175 +756,468 -> 756,80 +442,661 -> 405,661 +304,817 -> 304,765 +99,42 -> 957,900 +212,110 -> 854,752 +44,620 -> 661,620 +212,311 -> 784,883 +329,671 -> 329,908 +86,359 -> 553,826 +257,799 -> 934,122 +409,663 -> 409,367 +528,623 -> 593,688 +957,525 -> 544,938 +846,766 -> 113,33 +176,680 -> 176,102 +167,287 -> 167,929 +932,870 -> 834,968 +86,774 -> 49,774 +745,231 -> 70,906 +435,760 -> 138,463 +776,810 -> 625,810 +928,930 -> 76,78 +602,24 -> 602,688 +394,424 -> 65,424 +946,966 -> 93,113 +494,39 -> 951,39 +607,699 -> 832,699 +13,403 -> 391,403 +726,475 -> 726,29 +828,625 -> 836,617 +396,770 -> 167,770 +28,546 -> 374,200 +56,113 -> 837,894 +290,589 -> 740,139 +930,805 -> 296,171 +646,895 -> 49,895 +111,15 -> 111,497 +11,274 -> 570,833 +257,624 -> 603,624 +63,844 -> 666,844 +846,661 -> 846,464 +431,72 -> 431,674 +726,674 -> 726,40 +286,660 -> 286,909 +847,222 -> 847,861 +325,896 -> 325,416 +793,953 -> 365,953 +987,956 -> 62,31 +845,853 -> 363,371 +79,782 -> 506,782 +424,21 -> 424,369 +938,162 -> 177,923 +86,193 -> 799,906 +320,164 -> 320,654 +840,306 -> 840,711 +852,736 -> 852,690 +876,966 -> 143,233 +787,926 -> 38,177 +374,112 -> 340,112 +132,541 -> 740,541 +29,28 -> 968,967 +916,212 -> 170,958 +371,553 -> 521,403 +88,796 -> 870,796 +656,367 -> 71,367 +785,166 -> 785,427 +320,30 -> 320,549 +909,527 -> 816,620 +832,965 -> 302,965 +672,259 -> 80,259 +578,513 -> 578,243 +975,561 -> 537,123 +135,330 -> 188,330 +501,695 -> 501,573 +717,230 -> 878,230 +854,501 -> 27,501 +705,885 -> 950,885 +704,338 -> 704,630 +477,485 -> 864,485 +901,42 -> 305,638 +660,540 -> 660,546 +555,79 -> 190,79 +226,126 -> 800,700 +575,908 -> 944,908 +94,478 -> 94,746 +461,425 -> 929,893 +861,429 -> 451,19 +832,825 -> 179,172 +186,133 -> 298,133 +684,270 -> 558,270 +786,872 -> 125,872 +649,178 -> 649,595 +893,738 -> 412,257 +760,854 -> 901,713 +16,914 -> 866,64 +935,928 -> 266,259 +323,229 -> 32,229 +608,828 -> 608,49 +715,892 -> 74,251 +787,187 -> 787,903 +405,793 -> 405,183 +232,704 -> 232,389 +130,706 -> 130,657 diff --git a/2021/day06.hs b/2021/day06.hs new file mode 100644 index 0000000..e378560 --- /dev/null +++ b/2021/day06.hs @@ -0,0 +1,22 @@ +module Day06 where +import Data.Array +import Data.List.Split + +updateArray :: Array Int Int -> Array Int Int +updateArray a = array (0,8) $ map (\i -> (i,calculate i)) [0..8] where + calculate 8 = a ! 0 + calculate 6 = (a ! 0) + (a ! 7) + calculate x = a ! (x+1) + +calcArray :: Int -> Array Int Int -> Array Int Int +calcArray n = foldr (.) id $ replicate n updateArray + +main :: IO () +main = do + input <- map (read :: String -> Int) . splitOn "," <$> getContents + let starting_array = array (0,8) $ map (\val -> (val,length $ filter (==val) input)) [0..8] + + putStr "part 1: " + print $ sum $ elems $ calcArray 80 starting_array + putStr "part 2: " + print $ sum $ elems $ calcArray 256 starting_array \ No newline at end of file diff --git a/2021/day06.input b/2021/day06.input new file mode 100644 index 0000000..2d60cee --- /dev/null +++ b/2021/day06.input @@ -0,0 +1 @@ +4,5,3,2,3,3,2,4,2,1,2,4,5,2,2,2,4,1,1,1,5,1,1,2,5,2,1,1,4,4,5,5,1,2,1,1,5,3,5,2,4,3,2,4,5,3,2,1,4,1,3,1,2,4,1,1,4,1,4,2,5,1,4,3,5,2,4,5,4,2,2,5,1,1,2,4,1,4,4,1,1,3,1,2,3,2,5,5,1,1,5,2,4,2,2,4,1,1,1,4,2,2,3,1,2,4,5,4,5,4,2,3,1,4,1,3,1,2,3,3,2,4,3,3,3,1,4,2,3,4,2,1,5,4,2,4,4,3,2,1,5,3,1,4,1,1,5,4,2,4,2,2,4,4,4,1,4,2,4,1,1,3,5,1,5,5,1,3,2,2,3,5,3,1,1,4,4,1,3,3,3,5,1,1,2,5,5,5,2,4,1,5,1,2,1,1,1,4,3,1,5,2,3,1,3,1,4,1,3,5,4,5,1,3,4,2,1,5,1,3,4,5,5,2,1,2,1,1,1,4,3,1,4,2,3,1,3,5,1,4,5,3,1,3,3,2,2,1,5,5,4,3,2,1,5,1,3,1,3,5,1,1,2,1,1,1,5,2,1,1,3,2,1,5,5,5,1,1,5,1,4,1,5,4,2,4,5,2,4,3,2,5,4,1,1,2,4,3,2,1