diff options
Diffstat (limited to '2021')
-rw-r--r-- | 2021/01/first.b98 | 4 | ||||
-rw-r--r-- | 2021/01/first.go | 39 | ||||
-rw-r--r-- | 2021/01/input | 2000 | ||||
-rw-r--r-- | 2021/01/second.b98 | 4 | ||||
-rw-r--r-- | 2021/01/second.go | 57 | ||||
-rw-r--r-- | 2021/02/first.b98 | 5 | ||||
-rw-r--r-- | 2021/02/first.go | 42 | ||||
-rw-r--r-- | 2021/02/input | 1000 | ||||
-rw-r--r-- | 2021/02/second.b98 | 5 | ||||
-rw-r--r-- | 2021/02/second.go | 44 | ||||
-rw-r--r-- | 2021/03/first.go | 42 | ||||
-rw-r--r-- | 2021/03/input | 1000 | ||||
-rw-r--r-- | 2021/03/second.go | 96 | ||||
-rw-r--r-- | 2021/04/first.go | 123 | ||||
-rw-r--r-- | 2021/04/input | 601 | ||||
-rw-r--r-- | 2021/04/second.go | 119 | ||||
-rw-r--r-- | 2021/05/README.md | 3 | ||||
-rw-r--r-- | 2021/05/example | 10 | ||||
-rw-r--r-- | 2021/05/first.go | 48 | ||||
-rw-r--r-- | 2021/05/first_v2.go | 60 | ||||
-rw-r--r-- | 2021/05/go.mod | 3 | ||||
-rw-r--r-- | 2021/05/input | 500 | ||||
-rw-r--r-- | 2021/05/line/line.go | 239 | ||||
-rw-r--r-- | 2021/05/second.go | 61 | ||||
-rw-r--r-- | 2021/05/second_v2.go | 58 |
25 files changed, 6163 insertions, 0 deletions
diff --git a/2021/01/first.b98 b/2021/01/first.b98 new file mode 100644 index 0000000..4903889 --- /dev/null +++ b/2021/01/first.b98 @@ -0,0 +1,4 @@ +&:>#;&-:v@,a.$$; + : 0 + ^ -<w-\1+\ + ^< diff --git a/2021/01/first.go b/2021/01/first.go new file mode 100644 index 0000000..59b958c --- /dev/null +++ b/2021/01/first.go @@ -0,0 +1,39 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" + "strconv" +) + +func main() { + f, err := os.Open("input") + if err != nil { + log.Fatalf("%+v", err) + } + defer f.Close() + + scanner := bufio.NewScanner(f) + scanner.Split(bufio.ScanLines) + + scanner.Scan() + prev, err := strconv.Atoi(scanner.Text()) + if err != nil { + log.Fatalf("%+v", err) + } + result := 0 + + for scanner.Scan() { + i, err := strconv.Atoi(scanner.Text()) + if err != nil { + log.Fatalf("%+v", err) + } + if i > prev { + result++ + } + prev = i + } + fmt.Println(result) +} diff --git a/2021/01/input b/2021/01/input new file mode 100644 index 0000000..f65b86c --- /dev/null +++ b/2021/01/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/01/second.b98 b/2021/01/second.b98 new file mode 100644 index 0000000..b4f9573 --- /dev/null +++ b/2021/01/second.b98 @@ -0,0 +1,4 @@ +v > v +>&00p&10p&20p>#;&:00gw;@,a.; v + ^ >\1+\ v + ^p02p01g02p00g01< diff --git a/2021/01/second.go b/2021/01/second.go new file mode 100644 index 0000000..bea4b05 --- /dev/null +++ b/2021/01/second.go @@ -0,0 +1,57 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" + "strconv" +) + +func main() { + f, err := os.Open("input") + if err != nil { + log.Fatalf("%+v", err) + } + defer f.Close() + + scanner := bufio.NewScanner(f) + scanner.Split(bufio.ScanLines) + + scanner.Scan() + A, err := strconv.Atoi(scanner.Text()) + if err != nil { + log.Fatalf("%+v", err) + } + scanner.Scan() + B, err := strconv.Atoi(scanner.Text()) + if err != nil { + log.Fatalf("%+v", err) + } + A += B + scanner.Scan() + C, err := strconv.Atoi(scanner.Text()) + if err != nil { + log.Fatalf("%+v", err) + } + B += C + A += C + + result := 0 + + for scanner.Scan() { + D, err := strconv.Atoi(scanner.Text()) + if err != nil { + log.Fatalf("%+v", err) + } + C += D + B += D + if B > A { + result++ + } + A = B + B = C + C = D + } + fmt.Println(result) +} diff --git a/2021/02/first.b98 b/2021/02/first.b98 new file mode 100644 index 0000000..fd7a917 --- /dev/null +++ b/2021/02/first.b98 @@ -0,0 +1,5 @@ +v pos in 0,0, depth in 1,0 +>00p10p>#;~:'f-#v_$&00g+00p v@,a.*g01g00; + >'d-#v_$&10g+10pv + >&10g\-10p v + ^ ;,a.g01.g00; ~ < # we do not forget to strip the \n from the input diff --git a/2021/02/first.go b/2021/02/first.go new file mode 100644 index 0000000..1550bcb --- /dev/null +++ b/2021/02/first.go @@ -0,0 +1,42 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" + "strconv" + "strings" +) + +func main() { + f, err := os.Open("input") + if err != nil { + log.Fatalf("%+v", err) + } + defer f.Close() + + scanner := bufio.NewScanner(f) + scanner.Split(bufio.ScanLines) + + pos := 0 + depth := 0 + for scanner.Scan() { + elts := strings.Split(scanner.Text(), " ") + i, err := strconv.Atoi(elts[1]) + if err != nil { + log.Fatalf("%+v", err) + } + switch elts[0] { + case "forward": + pos += i + case "down": + depth += i + case "up": + depth -= i + default: + panic(elts[0]) + } + } + fmt.Println(pos * depth) +} diff --git a/2021/02/input b/2021/02/input new file mode 100644 index 0000000..594c25f --- /dev/null +++ b/2021/02/input @@ -0,0 +1,1000 @@ +forward 5 +down 9 +forward 2 +up 2 +forward 4 +forward 4 +up 5 +down 3 +forward 2 +forward 9 +down 7 +forward 2 +down 2 +forward 1 +up 9 +forward 1 +forward 4 +up 5 +down 9 +forward 8 +forward 3 +up 1 +down 2 +down 3 +forward 7 +forward 2 +up 3 +forward 9 +forward 9 +down 3 +up 8 +forward 5 +forward 7 +forward 2 +down 7 +forward 5 +down 4 +up 7 +forward 8 +forward 1 +down 3 +down 1 +forward 6 +up 7 +forward 6 +down 3 +forward 9 +forward 6 +up 3 +down 1 +forward 8 +up 7 +down 9 +down 2 +down 1 +down 5 +forward 4 +down 8 +forward 2 +down 5 +down 6 +down 5 +forward 5 +down 8 +up 8 +forward 3 +forward 4 +forward 8 +forward 9 +down 2 +forward 7 +forward 3 +forward 9 +down 3 +up 1 +down 5 +forward 2 +down 9 +down 2 +down 5 +down 2 +down 9 +up 3 +forward 6 +up 9 +down 1 +forward 8 +up 6 +down 1 +forward 1 +up 1 +forward 3 +down 8 +down 1 +down 9 +forward 4 +forward 1 +down 3 +forward 8 +down 9 +forward 7 +up 6 +down 8 +down 6 +down 8 +down 7 +down 1 +down 8 +down 1 +forward 5 +down 9 +forward 4 +down 2 +forward 8 +up 1 +forward 7 +down 7 +down 6 +forward 4 +forward 6 +down 2 +down 2 +up 7 +down 2 +up 9 +forward 6 +forward 3 +down 8 +forward 9 +down 9 +down 9 +down 8 +forward 2 +forward 5 +forward 8 +forward 1 +down 3 +forward 1 +forward 2 +forward 9 +up 5 +forward 4 +forward 2 +down 6 +forward 3 +forward 7 +forward 1 +forward 8 +down 7 +forward 4 +up 3 +down 9 +up 2 +forward 2 +forward 7 +down 9 +up 9 +forward 9 +up 8 +up 7 +down 8 +down 9 +forward 1 +forward 5 +up 7 +down 3 +up 9 +forward 9 +down 4 +down 7 +down 7 +down 1 +down 4 +down 5 +up 2 +forward 2 +forward 2 +forward 6 +down 7 +forward 7 +down 5 +forward 8 +down 7 +forward 6 +down 2 +up 2 +down 5 +down 1 +up 4 +down 8 +up 9 +forward 1 +down 9 +down 6 +down 8 +up 7 +up 1 +forward 7 +down 8 +forward 1 +down 4 +down 2 +forward 3 +forward 6 +forward 8 +down 2 +forward 7 +forward 8 +up 3 +down 1 +down 8 +up 3 +down 4 +down 5 +forward 6 +forward 9 +down 3 +up 2 +down 9 +up 2 +down 3 +down 9 +forward 4 +forward 6 +down 7 +down 8 +down 4 +forward 7 +up 2 +down 5 +up 3 +down 5 +up 1 +up 1 +forward 5 +forward 9 +down 9 +up 4 +up 4 +up 8 +up 5 +forward 7 +forward 6 +up 6 +down 5 +forward 4 +forward 3 +up 6 +down 6 +forward 5 +up 6 +up 7 +forward 1 +forward 2 +forward 5 +down 3 +forward 6 +down 6 +down 3 +up 9 +down 4 +down 5 +down 4 +forward 1 +down 1 +forward 3 +up 4 +forward 1 +forward 5 +up 3 +forward 6 +forward 5 +forward 9 +forward 6 +down 2 +forward 2 +down 1 +down 4 +forward 6 +forward 8 +down 8 +up 5 +forward 8 +forward 3 +forward 1 +forward 3 +forward 6 +down 1 +down 9 +up 7 +down 2 +forward 6 +down 4 +down 7 +down 5 +forward 2 +down 1 +forward 2 +forward 8 +forward 4 +up 3 +down 1 +forward 6 +forward 3 +down 3 +down 9 +forward 1 +up 5 +forward 3 +forward 3 +up 5 +down 7 +forward 8 +up 5 +forward 2 +forward 2 +down 6 +up 8 +up 5 +forward 2 +forward 1 +down 9 +forward 7 +down 5 +forward 3 +down 3 +down 5 +down 5 +up 7 +down 8 +forward 2 +forward 4 +forward 5 +forward 1 +down 6 +forward 3 +down 1 +down 7 +forward 3 +forward 7 +down 5 +down 3 +forward 6 +down 3 +down 2 +down 4 +down 9 +forward 7 +down 2 +up 2 +up 6 +up 9 +up 8 +forward 9 +down 1 +forward 4 +forward 2 +forward 7 +forward 2 +down 8 +down 3 +forward 4 +forward 6 +down 8 +forward 7 +forward 6 +up 3 +down 6 +down 1 +down 3 +down 8 +down 2 +down 7 +down 9 +forward 4 +forward 7 +forward 8 +forward 5 +forward 9 +up 5 +down 2 +forward 9 +forward 6 +up 6 +forward 7 +down 2 +down 3 +forward 4 +down 6 +down 1 +down 2 +down 8 +forward 3 +down 3 +forward 3 +down 5 +up 8 +down 5 +forward 8 +down 1 +forward 1 +forward 4 +forward 7 +down 2 +down 5 +forward 5 +down 8 +forward 2 +down 2 +forward 5 +forward 6 +forward 4 +down 7 +up 7 +down 1 +forward 7 +forward 8 +down 6 +up 7 +forward 6 +up 6 +down 8 +forward 5 +forward 8 +up 4 +up 2 +up 1 +down 8 +down 6 +up 2 +down 5 +down 1 +forward 5 +forward 7 +down 2 +up 3 +up 3 +forward 9 +down 1 +forward 6 +down 2 +forward 2 +down 1 +down 9 +forward 7 +down 5 +down 8 +up 1 +forward 1 +down 7 +forward 3 +down 4 +up 4 +down 6 +forward 1 +forward 3 +down 2 +forward 3 +forward 5 +forward 6 +up 2 +up 9 +forward 4 +down 4 +up 1 +up 3 +forward 8 +forward 1 +down 9 +down 9 +forward 2 +down 1 +up 9 +up 3 +up 1 +up 5 +forward 6 +down 9 +forward 6 +forward 9 +forward 6 +forward 4 +up 2 +down 6 +up 3 +forward 3 +forward 1 +up 4 +forward 7 +down 9 +down 3 +forward 9 +down 4 +down 8 +down 3 +up 8 +down 8 +down 8 +forward 2 +forward 8 +up 9 +forward 2 +up 6 +forward 7 +down 1 +forward 5 +forward 4 +forward 1 +forward 7 +up 9 +down 8 +forward 1 +up 5 +forward 9 +forward 2 +forward 8 +down 1 +forward 7 +down 2 +up 8 +down 6 +up 9 +up 3 +down 6 +forward 5 +down 1 +forward 1 +forward 6 +forward 6 +up 1 +forward 5 +forward 1 +up 2 +forward 9 +forward 6 +down 3 +up 1 +forward 7 +forward 2 +down 1 +forward 6 +down 3 +up 2 +down 3 +down 8 +forward 4 +down 2 +up 7 +down 6 +up 5 +down 7 +forward 4 +down 9 +down 3 +forward 2 +up 5 +up 4 +forward 9 +down 1 +up 2 +forward 4 +down 9 +down 8 +forward 5 +forward 2 +down 5 +forward 6 +down 4 +forward 7 +forward 1 +forward 6 +down 3 +down 9 +forward 9 +forward 2 +forward 6 +down 7 +down 5 +down 3 +forward 7 +down 3 +down 3 +down 4 +down 4 +down 7 +down 7 +down 7 +up 7 +up 9 +up 7 +up 3 +up 4 +down 9 +down 4 +up 3 +forward 2 +up 1 +down 9 +down 6 +up 1 +up 2 +down 7 +down 9 +up 2 +forward 7 +down 4 +forward 3 +down 1 +down 7 +forward 7 +up 7 +forward 3 +forward 1 +forward 6 +forward 2 +down 9 +forward 8 +up 8 +down 8 +down 9 +up 1 +down 4 +down 6 +down 8 +up 4 +down 1 +forward 1 +forward 1 +forward 4 +forward 7 +forward 1 +down 4 +forward 5 +up 3 +forward 4 +down 5 +down 1 +up 2 +down 7 +forward 7 +down 7 +up 9 +down 9 +down 3 +up 2 +up 8 +up 8 +up 7 +forward 7 +forward 5 +forward 3 +forward 2 +down 5 +forward 4 +forward 1 +down 6 +down 1 +forward 8 +down 6 +down 3 +down 5 +down 9 +down 3 +forward 7 +forward 6 +down 6 +forward 9 +up 7 +forward 3 +up 5 +down 5 +down 5 +forward 4 +up 6 +down 6 +forward 3 +up 2 +forward 4 +up 1 +down 5 +forward 6 +forward 9 +down 2 +up 2 +down 2 +up 7 +forward 3 +up 2 +forward 9 +forward 5 +down 5 +down 7 +down 8 +down 6 +up 9 +up 5 +forward 7 +down 8 +down 1 +forward 7 +up 2 +forward 4 +forward 2 +up 9 +down 8 +forward 1 +forward 7 +down 2 +down 3 +down 6 +down 3 +forward 1 +up 6 +forward 8 +down 9 +down 9 +forward 8 +up 8 +down 6 +forward 4 +up 1 +forward 5 +down 3 +down 7 +down 7 +down 3 +up 2 +forward 4 +down 9 +forward 2 +down 9 +forward 9 +forward 4 +forward 5 +down 4 +forward 1 +up 1 +forward 4 +up 3 +up 4 +forward 7 +down 9 +forward 6 +down 1 +down 1 +down 2 +down 4 +forward 7 +forward 8 +forward 6 +down 8 +forward 2 +down 3 +up 5 +forward 2 +up 5 +forward 8 +down 8 +down 8 +up 8 +forward 6 +up 1 +down 3 +forward 6 +down 1 +forward 9 +up 1 +forward 7 +forward 7 +down 1 +forward 5 +forward 2 +up 7 +down 1 +forward 2 +down 4 +forward 3 +down 9 +forward 6 +up 5 +forward 1 +forward 5 +down 7 +forward 6 +down 8 +forward 9 +down 1 +forward 9 +down 1 +forward 5 +up 9 +forward 1 +forward 6 +forward 5 +down 7 +down 6 +down 5 +down 9 +forward 9 +down 2 +down 8 +down 8 +forward 2 +forward 3 +forward 3 +down 3 +forward 8 +forward 8 +down 8 +forward 1 +up 1 +forward 4 +down 7 +forward 1 +up 2 +forward 9 +forward 1 +down 6 +up 9 +down 3 +down 1 +up 1 +up 6 +up 7 +forward 9 +up 2 +forward 4 +up 8 +down 6 +forward 3 +forward 7 +down 6 +down 5 +down 3 +forward 5 +down 1 +forward 2 +forward 9 +down 8 +up 6 +forward 3 +forward 2 +up 7 +down 3 +forward 5 +forward 9 +down 5 +down 1 +up 4 +down 8 +forward 1 +forward 3 +forward 3 +down 2 +forward 5 +down 1 +forward 2 +up 3 +forward 8 +down 2 +up 8 +down 6 +down 8 +forward 4 +down 4 +up 7 +up 6 +down 7 +forward 2 +up 3 +forward 3 +down 8 +forward 8 +down 5 +forward 5 +down 3 +up 7 +down 1 +down 2 +up 8 +down 6 +up 6 +down 7 +forward 5 +up 3 +forward 7 +forward 2 +down 9 +down 1 +down 4 +down 7 +forward 9 +up 7 +forward 5 +up 8 +forward 8 +up 1 +forward 2 +down 7 +down 5 +down 6 +down 4 +up 4 +forward 5 +forward 6 +up 4 +forward 8 +forward 4 +forward 3 +up 5 +down 6 +up 4 +forward 8 +down 7 +forward 3 +down 2 +down 7 +down 5 +down 4 +forward 5 +up 4 +forward 4 +down 7 +down 3 +down 9 +down 7 +forward 2 +forward 1 +down 7 +down 8 +forward 1 +forward 2 +down 5 +up 1 +down 1 +forward 5 +down 2 +forward 9 +forward 7 +down 2 +forward 6 +forward 9 +up 5 +forward 3 +up 5 +forward 7 +down 6 +down 3 +up 3 +down 4 +forward 2 +up 4 +forward 5 +up 9 +down 3 +up 1 +down 1 +up 3 +forward 4 +forward 5 +down 3 +forward 5 +down 6 +down 2 +forward 5 +forward 3 +down 7 +down 8 +forward 4 +down 5 +forward 7 +forward 2 +forward 7 +down 7 +up 1 +forward 6 +down 1 +forward 1 +down 4 +forward 1 +up 6 +forward 8 +forward 6 +forward 7 +up 6 +up 7 +up 2 +down 9 +forward 4 +up 3 +down 1 +down 1 +forward 3 +down 4 +down 6 +down 8 +forward 9 +forward 6 +down 1 +forward 5 diff --git a/2021/02/second.b98 b/2021/02/second.b98 new file mode 100644 index 0000000..2c5504c --- /dev/null +++ b/2021/02/second.b98 @@ -0,0 +1,5 @@ +v pos in 0,0, depth in 1,0, aim in 2,0 +>00p10p20p>#;~:'f-#v_$&:00g+00p v@,a.*g01g00; + >'d-#v_$&20g+20pv>20g*10g+10pv + >&20g\-20p v < + ^ ;,a.g01.g00; ~ << # we do not forget to strip the \n from the input diff --git a/2021/02/second.go b/2021/02/second.go new file mode 100644 index 0000000..e6d0e94 --- /dev/null +++ b/2021/02/second.go @@ -0,0 +1,44 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" + "strconv" + "strings" +) + +func main() { + f, err := os.Open("input") + if err != nil { + log.Fatalf("%+v", err) + } + defer f.Close() + + scanner := bufio.NewScanner(f) + scanner.Split(bufio.ScanLines) + + aim := 0 + pos := 0 + depth := 0 + for scanner.Scan() { + elts := strings.Split(scanner.Text(), " ") + i, err := strconv.Atoi(elts[1]) + if err != nil { + log.Fatalf("%+v", err) + } + switch elts[0] { + case "forward": + pos += i + depth += i * aim + case "down": + aim += i + case "up": + aim -= i + default: + panic(elts[0]) + } + } + fmt.Println(pos * depth) +} diff --git a/2021/03/first.go b/2021/03/first.go new file mode 100644 index 0000000..5343505 --- /dev/null +++ b/2021/03/first.go @@ -0,0 +1,42 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" +) + +func main() { + f, err := os.Open("input") + if err != nil { + log.Fatalf("%+v", err) + } + defer f.Close() + + scanner := bufio.NewScanner(f) + scanner.Split(bufio.ScanLines) + + bits := make([]int, 12) + for scanner.Scan() { + num := scanner.Text() + for n := 0; n < 12; n++ { + if num[n] == '1' { + bits[n]++ + } + } + } + + gamma := 0 + epsilon := 0 + for n := 0; n < 12; n++ { + gamma *= 2 + epsilon *= 2 + if bits[n] > 500 { + gamma++ + } else { + epsilon++ + } + } + fmt.Println(gamma * epsilon) +} diff --git a/2021/03/input b/2021/03/input new file mode 100644 index 0000000..99c0fc4 --- /dev/null +++ b/2021/03/input @@ -0,0 +1,1000 @@ +111011001010 +010011101110 +110001001010 +001101011101 +110100000011 +010110110010 +101000110110 +010100000011 +111001101111 +111001100011 +000110000100 +111011110100 +010001100000 +100011000010 +001001111010 +101001010010 +110000111010 +011100110101 +010111101111 +100011001001 +011110100001 +011101110110 +001011111001 +001110010100 +100001001000 +000100110111 +011111110010 +010101110011 +001101011100 +100001110101 +111000100000 +010111001010 +110000001010 +101011110100 +101010011111 +011001001000 +010010100100 +001100111110 +011111100101 +011010011001 +000010010100 +010001110111 +000101011001 +001110101100 +100011100101 +110001011100 +100101011110 +111000001010 +000010111010 +001001000010 +011011001100 +000111110000 +110110110010 +001011111100 +110111110101 +001000101010 +101010011001 +111110011001 +001000111110 +110110010010 +010011001000 +110100100010 +111000100011 +110111000001 +110110010001 +001100011011 +111100010111 +110110101001 +100010000101 +001001101000 +010000110101 +111010001100 +110000001110 +100111110010 +110101110011 +011100111010 +100000010001 +101000111101 +001010001100 +110100000000 +011001110100 +011010101111 +001011011000 +111100101000 +101001110100 +001111100001 +110111110111 +101100010000 +110000010101 +110111010101 +101110100100 +011010001001 +011101110111 +101011110111 +011001101111 +101101001011 +010000100011 +111011111100 +110101000100 +011111101011 +101000001110 +000111001010 +011100010010 +010011011111 +100000001101 +000110001011 +101100110101 +001001010000 +001111101100 +110100010011 +100011111001 +110000101100 +101111101101 +010011100110 +011000011101 +111110001111 +000100111011 +000001001100 +111110000010 +001001110111 +100000110010 +011000111000 +100010100110 +111110100010 +000001010110 +011010001101 +001100001010 +100111001001 +001010110101 +100111000101 +110011001110 +011100000110 +101111111110 +001110100010 +110101011010 +000011111001 +101011110110 +000111000110 +110010001100 +001001010101 +011111001011 +100010101101 +001000010000 +110111110001 +001111110011 +110111101101 +010011010001 +100110101000 +001011100100 +001010111011 +101000010001 +000101001011 +011010010011 +011011000001 +111111010101 +010000011001 +101100111101 +001001110010 +000010001011 +111000001001 +010001001100 +110110011011 +111011100100 +001000001010 +101110010110 +010010000100 +100000011011 +010000110011 +111111101101 +101010001011 +001011110100 +000111100011 +110011100111 +000011100000 +100101001110 +110100000010 +110101110101 +100001010101 +010100000110 +011010110110 +001011000101 +010010100001 +001001100110 +111011110111 +100110011111 +100111010000 +010010111010 +001000101100 +000101101110 +011001010111 +010001000110 +001110111000 +010001001010 +111000011000 +000011110000 +111100011110 +101110111001 +001101001000 +111010110110 +001110101010 +100001111011 +110010010110 +101001101011 +001100111011 +111001010100 +101111011011 +010010000010 +101101101111 +101000101000 +001100100010 +111001100101 +110110001011 +000110011001 +110010110000 +000111101111 +010010001101 +110110111101 +010100100100 +001111010110 +001101000011 +011110010011 +101111101010 +111001000110 +000110001001 +100100001000 +010100110010 +001011001011 +100010110100 +001110101111 +001001101011 +000111100100 +000001111011 +100111111101 +111011100110 +000100101101 +100110110000 +010001000000 +111111111111 +011010001110 +001100000100 +000010010000 +000100100000 +010100010101 +100100111110 +001100111100 +000001010010 +011010000001 +000000111010 +110011110111 +110011100110 +000011011011 +001001001001 +100111100111 +110000101110 +101100101111 +110001110110 +111011111001 +101000110001 +010000011110 +001011110101 +001100011010 +111001110001 +001110110001 +101011010100 +110110100111 +101011001100 +110010111100 +011111001111 +110001101011 +011100111100 +111101110010 +001111000001 +100101110101 +110001101000 +110001100110 +000011110110 +001111111111 +110101001111 +101000111001 +101100111001 +110011011011 +011100100111 +111000001100 +110010001001 +000101001000 +010101101100 +110010000100 +011000010101 +010001101111 +011000000100 +111111100101 +000011101011 +011001111010 +011010000101 +000001001011 +001111001010 +001011011010 +010011111010 +101001110001 +101001000000 +100101100101 +111100000010 +110000000100 +010110000101 +011011011101 +010110101001 +010011000111 +110000010001 +000101100001 +111000000100 +000011001101 +101101110011 +110101011101 +001111000010 +101110011100 +000100001010 +111101110001 +110110111111 +001011101011 +100001010100 +011001110010 +010001111000 +001101101011 +011011101001 +010111101010 +011110000000 +111111000010 +100010110111 +111010111111 +100110001001 +011111000000 +000111000010 +111001111100 +111010100111 +001010110010 +100011110001 +011100000100 +011110010110 +101001000011 +100011111101 +001100100111 +000110100100 +001001000111 +101000000000 +011100010101 +101110010111 +000110010001 +010101001111 +010010000111 +001010001111 +000111000101 +111101111010 +010010111111 +101111101110 +101100101000 +101101010101 +000011111011 +011111000101 +011111111001 +101000100111 +010101110111 +000111101100 +011010011010 +110001000010 +100110111100 +011110011011 +001101011010 +010001011001 +100110100001 +001010111001 +011100011011 +110001111101 +100111100100 +101111111101 +111000011001 +000000101110 +101111011100 +010100111111 +010001010100 +011001111100 +110100010001 +110001111110 +111001110000 +001110010111 +001100101101 +111001100001 +000100011101 +011101011010 +010110010000 +100000111100 +100100100110 +110111111000 +001111000111 +111111110010 +111010111011 +001000111000 +101010110101 +011001110110 +001100110001 +000111101001 +010011000001 +001101011001 +111001111010 +000110011011 +000101000100 +110000011011 +010011011000 +011100111111 +010101101101 +101100110100 +001011010101 +010001000011 +001000000111 +111111011011 +110000000011 +100101010110 +001001001101 +000101010100 +111101101100 +000111110101 +100101010010 +101110001110 +101011111110 +011011000011 +000111010101 +011010001000 +001010110000 +011110000110 +001111100110 +111001111110 +000101101111 +110111100100 +100011101001 +111000100101 +100100111101 +110001000011 +110000101111 +110001111100 +000101000111 +001011110000 +010000001100 +101101110001 +000110100111 +011101000001 +001111101101 +100000000100 +010010000000 +001111101000 +001010111010 +101010011010 +111010100011 +101111110010 +001011110110 +100010010001 +010110010110 +110111111010 +000111001011 +000001111100 +100101101111 +010100011101 +000010011110 +011100100000 +011101100000 +110000100111 +110111100000 +100001110100 +011111011011 +101110110001 +010000011000 +010011010101 +001101100101 +110110100101 +101000011110 +101011000011 +000010010101 +101001110000 +110001011111 +001101101101 +000001111111 +110010111001 +111001010101 +000010101100 +111011100101 +011111001110 +011000011010 +111111110110 +111010110111 +011010010110 +110011001011 +000010101000 +011101011100 +111010110000 +010011110010 +011110010001 +101111111001 +010010110101 +101010101001 +001101110001 +011111110110 +011110110001 +001111001100 +110000011001 +111001000101 +111110101001 +010011010100 +110011000010 +110000100100 +101000101001 +010101011010 +011001100011 +101110101101 +100100001011 +111010010001 +111010001110 +100110101100 +111010010111 +101111001010 +111101111111 +101111000110 +101111101111 +011001001101 +100110000111 +101101010100 +110100011010 +010111010001 +110011101011 +101001001100 +100111010111 +000011111110 +011110000101 +001011110111 +100000110110 +011110100111 +011100011111 +010100111101 +100100010011 +001000101001 +010111010110 +100000011100 +000000111111 +111101111001 +011011100100 +101011010110 +111010001111 +111101111101 +110100110010 +010001001110 +011001110011 +110100110101 +110010100010 +111111111101 +000110011100 +011010100110 +000000010011 +100100010110 +110110010111 +101011101001 +110000000010 +001110011001 +111111011110 +000111000001 +110010101011 +111111111001 +010001010010 +001111010100 +011011110101 +110000000111 +100011010010 +000010110111 +111100111111 +111111101010 +011000100011 +011111000100 +011100001001 +110001011011 +011011010111 +100000101111 +101001100100 +110000110101 +000001110111 +110101001000 +000001100000 +010001111110 +011110011101 +011011100111 +110000011010 +111010100110 +001101110010 +111000010000 +010110101000 +010001010111 +000010101111 +111000001110 +111011100001 +111100011001 +101111001110 +101011011000 +101100101100 +111111110011 +101010010101 +110110010101 +001100111010 +100001101000 +001100000011 +010110110000 +101110101011 +100001100101 +011001011010 +110110001111 +001000000110 +011101011111 +001010101001 +001111101001 +111100011111 +100010110010 +000001101110 +011110011010 +010110100101 +010010100011 +101010001000 +010000001001 +111100110011 +110010001111 +000101100010 +011111100000 +000100000001 +100100010000 +011110000011 +000010010001 +110010101001 +000000001010 +110010011100 +000000100100 +100010110001 +101111001100 +000001101010 +111011010110 +010101011101 +100110101011 +101001011011 +010011100100 +111000001000 +100111110001 +100100101011 +011001101001 +010101110000 +101000011001 +101111110111 +010111110011 +011111111111 +011100110011 +010010110010 +111011111101 +011110000010 +100001101010 +110100011100 +001001010011 +001110000010 +000110000101 +010110001010 +101000101010 +100000101001 +000001101100 +001001111011 +100011010000 +010000100000 +001111111000 +111011111000 +100011101000 +100110001100 +010001010011 +100110110101 +100001010011 +100100101111 +011101101011 +011110111101 +101110010100 +101010110111 +001010001011 +011111001101 +111011001101 +111011000110 +001100000001 +101100110111 +101100110010 +001000110011 +111010101010 +010101010110 +111100111001 +111000101001 +111000010101 +001000101101 +100111000010 +100000010110 +000100011000 +010100011100 +111010110011 +100011100011 +111111110101 +110101010110 +011001001011 +011101110100 +111110000110 +011010100101 +110100010010 +011111100010 +111010110001 +100111000100 +100000010101 +111000110010 +111100101001 +101010100010 +000110010010 +001111101111 +010011111011 +110010000011 +000010101101 +111111100111 +101001110110 +100111011001 +011010011111 +011011011001 +110001000001 +111011011011 +001011001111 +100101000010 +110000010010 +000011011000 +010111001001 +010001111010 +110101000110 +111011101010 +001100110101 +001111000110 +000000000010 +010100111010 +111101110110 +101101110101 +011001010101 +010110001101 +011110100011 +010101010101 +100110100011 +101111110011 +000111111101 +010011000100 +000010110101 +000001011010 +101100001000 +000101111001 +100001001100 +110110000100 +111010011000 +110000001000 +010111001101 +100111000000 +000001010000 +000110101110 +000100110011 +101011101000 +100110110010 +111011100000 +100000101011 +111100101011 +100010100011 +101001000001 +110001111010 +001001110101 +001000101110 +101011111010 +000110110110 +000100010000 +111001110010 +100010111101 +111110110010 +001111110001 +011111101101 +001001101111 +110111100001 +000010111111 +101110001111 +101011101011 +110001010010 +011010100111 +011011010110 +111100001000 +111100001111 +111101011110 +010000000000 +000000011000 +001000000100 +010111100001 +101110010011 +000101000101 +101100010110 +010111011111 +000010100101 +100001111110 +011101001000 +100010001101 +100111100001 +011010110001 +010110101100 +111010110100 +010110010101 +010100111100 +110001100101 +010010011000 +111110110011 +110001101100 +100011001110 +100001000000 +101001100000 +010111111101 +011000110001 +101001011101 +100110011101 +011101111000 +000000100001 +010000010000 +110100010110 +101100011101 +111011001111 +100101111000 +110101010100 +101111000011 +000101110000 +110101110100 +010110111000 +100010101001 +010111001111 +001011111101 +001111010011 +101001101010 +011110010100 +001100110111 +010111010111 +000001100100 +100001000010 +101001111011 +000011000100 +111000100100 +111010111001 +101101001111 +001010110011 +001000000011 +111111101001 +101001010101 +001010110110 +110101110010 +101101010001 +101010111000 +110100000101 +111100110100 +100010111000 +010010001111 +011000111101 +110011011000 +101010111001 +011000010000 +001001000001 +001100101000 +110111001001 +011001000110 +101001101000 +100010011101 +000001001101 +010001011110 +111111000001 +000111100010 +110110011111 +000001110110 +110101010001 +110100100011 +100110010100 +010101100111 +000000011110 +001000010011 +000101011010 +010101101110 +001010111100 +110100111101 +101101011011 +011011101100 +100000000001 +000101010111 +101010010011 +110001000110 +101110001000 +010110000010 +110100001011 +010110100110 +000110100101 +111110111100 +110010101101 +110111101110 +001111000000 +001101010000 +010011000011 +011110010101 +100001000100 +000000111011 +010011010110 +100110110111 +111000000000 +100101111110 +110011001100 +100001001111 +100100010010 +001101111011 +110010000010 +011101001011 +011000010111 +010000010100 +100100101010 +001100101100 +000100101001 +100100000011 +101010111011 +000001100101 +101011110101 +100101111111 +010101100001 +101000001010 +000011110010 +111001010010 +100001100011 +010111111111 +001110011000 +010001011000 +000011001110 +110010111011 +001100001111 +100001110111 +110000010000 +101110000001 +001011100110 +010101001101 +001001001111 +001110100100 +111110111010 +011101100010 +001010011011 +011011010011 +111000101011 +110110110001 +110100101111 +000000100010 +111111101111 +111000101101 +011001000010 +100000001001 +000101011100 +110100100110 +111011011111 +110110111100 +110011110000 +111110011110 +001101010010 +101000111110 +010101110110 +101100000011 +001111101110 +010101011001 +110010110010 +100100110111 +011100000001 +101110000110 +001011101000 +000011100111 +010101000000 +101011100000 +100100010001 +011011100010 +011010000100 +010010110011 +011010111101 +010010011100 +010010010011 +011000011111 +101101111111 +010100001010 +100100110100 +101011101111 +100100100010 +010001011101 +101101110000 +110010000101 +111011010111 +010011110111 +100101000011 +001100111101 +110110100000 +101001100011 +111001000011 +100001011111 +010000111101 +100011100001 +101100011010 +100110100000 diff --git a/2021/03/second.go b/2021/03/second.go new file mode 100644 index 0000000..33938a1 --- /dev/null +++ b/2021/03/second.go @@ -0,0 +1,96 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" +) + +func findBitCount(data []string) []int { + bits := make([]int, 12) + for _, line := range data { + for n := 0; n < 12; n++ { + if line[n] == '1' { + bits[n]++ + } + } + } + return bits +} + +func main() { + f, err := os.Open("input") + if err != nil { + log.Fatalf("%+v", err) + } + defer f.Close() + + scanner := bufio.NewScanner(f) + scanner.Split(bufio.ScanLines) + + data := make([]string, 0) + for scanner.Scan() { + data = append(data, scanner.Text()) + } + + datacsr := make([]string, len(data)) + copy(datacsr, data) + + var ogr int + for n := 0; n < 12; n++ { + if len(data) == 1 { + break + } + bits := findBitCount(data) + var i byte + if 2*bits[n] >= len(data) { + i = '1' + } else { + i = '0' + } + newdata := make([]string, 0) + for j := 0; j < len(data); j++ { + if data[j][n] == i { + newdata = append(newdata, data[j]) + } + } + data = newdata + } + for n := 0; n < 12; n++ { + ogr *= 2 + if data[0][n] == '1' { + ogr++ + } + } + + data = datacsr + var csr int + for n := 0; n < 12; n++ { + if len(data) == 1 { + break + } + bits := findBitCount(data) + var i byte + if 2*bits[n] < len(data) { + i = '1' + } else { + i = '0' + } + newdata := make([]string, 0) + for j := 0; j < len(data); j++ { + if data[j][n] == i { + newdata = append(newdata, data[j]) + } + } + data = newdata + } + for n := 0; n < 12; n++ { + csr *= 2 + if data[0][n] == '1' { + csr++ + } + } + + fmt.Println(ogr * csr) +} diff --git a/2021/04/first.go b/2021/04/first.go new file mode 100644 index 0000000..ed3942b --- /dev/null +++ b/2021/04/first.go @@ -0,0 +1,123 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" + "strconv" + "strings" +) + +type grille struct { + lines [][]int + columns [][]int +} + +var ( + best = 100000000 + score = 0 +) + +// winning func +func win(g *grille, n int, iter int) { + sum := 0 + for i := 0; i < 5; i++ { + for j := 0; j < len(g.lines[i]); j++ { + sum += g.lines[i][j] + } + } + if iter < best { + best = iter + score = sum * n + //fmt.Println(iter, n, score, g) + } +} + +func main() { + f, err := os.Open("input") + if err != nil { + log.Fatalf("%+v", err) + } + defer f.Close() + + scanner := bufio.NewScanner(f) + scanner.Split(bufio.ScanLines) + + scanner.Scan() + tirage := make([]int, 0) + tirageStr := strings.Split(scanner.Text(), ",") + // lets process the tirage + for _, v := range tirageStr { + n, err := strconv.Atoi(v) + if err != nil { + log.Fatalf("%+v", err) + } + tirage = append(tirage, n) + } + + for scanner.Scan() { + // we just scanned the new line + // lets init the grille + g := new(grille) + g.lines = make([][]int, 5) + g.columns = make([][]int, 5) + for i := 0; i < 5; i++ { + g.lines[i] = make([]int, 5) + g.columns[i] = make([]int, 5) + } + // lets populate the grille + for i := 0; i < 5; i++ { + scanner.Scan() + numbers := strings.Fields(scanner.Text()) + for j := 0; j < 5; j++ { + n, err := strconv.Atoi(numbers[j]) + if err != nil { + log.Fatalf("%+v", err) + } + g.lines[i][j] = n + g.columns[j][i] = n + } + } + // lets process the tirage + out: + for iter, n := range tirage { + if iter >= best { + //fmt.Println(iter, n, g) + break out + } + // remove the number + for i := 0; i < 5; i++ { + for j := 0; j < len(g.lines[i]); j++ { + if g.lines[i][j] == n { + if len(g.lines[i]) == 1 { + g.lines[i] = []int{} + win(g, n, iter) + break out + } + if j < len(g.lines[i])-1 { + g.lines[i][j] = g.lines[i][len(g.lines[i])-1] + } + g.lines[i] = g.lines[i][:len(g.lines[i])-1] + } + } + } + for i := 0; i < 5; i++ { + for j := 0; j < len(g.columns[i]); j++ { + if g.columns[i][j] == n { + if len(g.columns[i]) == 1 { + g.columns[i] = []int{} + win(g, n, iter) + break out + } + if j < len(g.columns[i])-1 { + g.columns[i][j] = g.columns[i][len(g.columns[i])-1] + } + g.columns[i] = g.columns[i][:len(g.columns[i])-1] + } + } + } + } + } + fmt.Println(score) +} diff --git a/2021/04/input b/2021/04/input new file mode 100644 index 0000000..a560663 --- /dev/null +++ b/2021/04/input @@ -0,0 +1,601 @@ +14,30,18,8,3,10,77,4,48,67,28,38,63,43,62,12,68,88,54,32,17,21,83,64,97,53,24,2,60,96,86,23,20,93,65,34,45,46,42,49,71,9,61,16,31,1,29,40,59,87,95,41,39,27,6,25,19,58,80,81,50,79,73,15,70,37,92,94,7,55,85,98,5,84,99,26,66,57,82,75,22,89,74,36,11,76,56,33,13,72,35,78,47,91,51,44,69,0,90,52 + +13 62 38 10 41 +93 59 60 74 75 +79 18 57 90 28 +56 76 34 96 84 +78 42 69 14 19 + +96 38 62 8 7 +78 50 53 29 81 +88 45 34 58 52 +33 76 13 54 68 +59 95 10 80 63 + +36 26 74 29 55 +43 87 46 70 21 + 9 17 38 58 63 +56 79 85 51 2 +50 57 67 86 8 + +29 78 3 24 79 +15 81 20 6 38 +97 41 28 42 82 +45 68 89 85 92 +48 33 40 62 4 + +68 38 43 2 27 +74 92 49 11 22 +33 97 73 87 30 +42 28 60 39 67 + 3 66 35 94 47 + + 6 65 2 30 88 +69 3 33 61 23 +62 40 37 7 43 +55 12 70 36 73 +15 20 85 38 44 + +99 36 10 83 69 +31 58 93 87 56 +33 25 82 59 30 +45 86 79 12 2 +39 57 51 53 13 + +48 46 11 20 69 +89 9 96 45 76 +67 78 82 6 97 +30 41 37 32 64 +47 31 93 29 75 + +49 93 50 83 64 +54 4 18 1 76 +75 30 19 78 12 +84 55 28 3 57 +16 77 87 25 2 + +15 57 86 92 60 +87 66 76 12 52 +62 74 93 88 78 +39 13 44 20 46 +59 31 40 91 79 + +82 16 73 45 42 +21 79 97 62 5 +96 52 53 74 49 +38 84 85 69 68 +35 44 92 1 47 + + 8 22 61 35 88 +84 86 33 26 11 +57 24 83 25 64 +46 47 28 6 96 +58 99 3 29 40 + +61 49 56 59 81 +68 58 98 50 23 +92 33 43 65 16 +94 47 74 21 60 +83 69 35 31 27 + + 4 32 91 53 18 +41 84 26 69 31 +25 81 0 71 57 +39 11 43 14 63 +24 73 58 17 95 + + 3 50 57 9 94 +48 43 42 96 15 +25 0 38 12 39 +45 56 77 47 53 +19 95 24 28 54 + +78 67 64 33 40 +29 48 8 17 38 +22 79 71 46 83 +11 45 47 87 80 + 3 84 26 5 28 + +77 92 70 44 61 +59 78 12 8 50 +60 58 55 98 85 +66 2 52 83 81 +34 79 20 30 38 + +67 3 44 4 91 +78 64 32 54 31 +89 41 94 18 8 +58 23 48 62 16 +24 12 80 53 28 + +76 54 87 69 88 +16 36 90 48 5 +75 62 15 96 23 +70 42 61 1 41 +71 22 45 92 8 + +34 99 93 83 80 +31 9 43 12 57 +18 59 10 53 0 +76 87 74 38 39 +61 48 60 16 3 + +98 1 32 7 97 +87 99 14 53 46 +54 26 43 57 49 +89 72 5 0 40 +11 28 76 84 85 + +58 65 14 33 32 +13 27 30 44 35 +45 56 10 1 31 +68 93 96 38 26 +17 53 72 6 86 + +85 34 72 52 11 +92 22 79 55 47 +12 3 86 95 14 +84 81 17 20 67 +31 16 69 61 2 + +40 10 23 8 61 +88 11 86 87 49 +36 3 73 58 20 +33 62 98 38 93 +63 95 6 90 18 + +49 15 55 14 57 +41 36 32 1 35 +78 70 79 54 26 +23 0 34 21 77 +96 48 51 47 82 + +29 61 54 64 35 +79 11 31 55 42 + 0 88 20 34 3 +84 59 46 68 50 +43 6 12 17 73 + +53 91 64 39 5 +23 51 33 13 55 +25 66 56 20 98 + 6 46 72 70 3 +19 38 54 16 34 + +14 94 60 28 2 +97 80 93 89 83 +71 86 74 52 5 +77 69 64 10 81 +21 22 95 39 78 + +79 33 4 61 66 +31 49 67 30 98 +43 71 84 72 52 +29 39 81 35 37 + 2 95 94 13 14 + +77 19 40 46 96 +37 81 64 75 95 +47 68 83 25 69 +70 35 11 17 91 +31 92 1 44 14 + +68 66 30 84 55 +87 76 73 29 53 +37 58 23 12 35 + 1 7 20 34 82 +27 86 16 60 54 + +11 68 61 36 13 +78 38 98 22 73 +56 89 93 8 10 + 5 82 60 40 76 +45 39 72 48 75 + +35 22 88 77 8 +75 30 90 6 41 +12 69 48 73 61 +18 1 58 32 79 +37 36 85 9 17 + +81 76 31 87 10 +27 69 36 57 15 +44 72 30 59 9 +24 91 13 73 61 +20 84 55 51 26 + +95 74 5 11 44 +16 26 91 58 53 +82 55 27 61 76 +40 4 20 78 33 +32 28 98 9 15 + +20 1 36 71 23 +56 42 0 73 45 +92 64 5 50 43 +69 37 87 53 7 +57 84 61 70 58 + +25 95 78 27 43 +77 97 74 13 68 +20 81 18 37 4 +61 9 55 92 73 +72 16 80 41 57 + +86 74 92 16 62 +97 82 26 66 41 +73 46 6 40 83 +48 50 67 13 3 +20 27 61 10 81 + +53 24 29 60 79 +57 39 31 34 15 +12 38 13 8 30 +94 98 14 54 6 +47 82 65 22 42 + +72 69 86 31 40 +19 77 21 9 52 +53 97 7 27 20 +35 46 22 23 39 +11 43 50 29 28 + +34 10 81 75 42 +27 67 59 20 87 +45 17 46 23 76 +40 4 77 25 96 +18 8 88 53 32 + +39 37 52 22 70 +51 15 69 23 64 +65 50 43 29 91 + 3 67 1 84 76 +96 72 54 28 42 + +45 81 20 22 59 +94 70 27 61 77 + 4 83 44 68 42 +13 93 1 30 34 +84 37 35 8 48 + +24 91 55 76 74 +48 64 59 58 44 +99 29 3 34 87 +20 4 42 68 65 +90 13 82 93 78 + +61 36 18 56 26 +81 41 1 96 78 +68 54 84 4 86 +71 52 28 59 39 +60 72 40 58 37 + +66 91 90 56 73 +30 28 22 8 6 +19 70 95 17 72 +46 20 10 21 36 +53 64 99 9 79 + +93 62 37 28 17 +51 42 76 58 65 +99 71 12 66 11 +19 13 3 97 22 +86 50 36 39 16 + +10 32 80 74 2 +38 59 90 63 98 +51 7 9 57 24 +19 48 75 79 30 +40 86 72 71 54 + +10 99 7 84 46 +16 79 74 55 57 +54 12 63 30 82 +49 81 33 39 14 +65 58 67 98 61 + +60 53 43 12 2 +26 25 49 61 54 +17 73 75 47 19 + 9 95 67 46 98 +86 8 35 81 77 + +45 1 88 26 31 +53 37 64 11 28 + 7 39 32 9 72 +75 51 50 70 3 +82 79 71 90 8 + +58 26 97 61 76 +24 90 98 15 80 +62 75 34 69 4 +10 0 64 73 99 +46 83 40 23 65 + +11 42 17 59 88 +71 25 27 60 96 +43 72 69 46 37 +29 1 66 12 76 +22 34 81 47 80 + +14 24 36 83 31 +26 59 8 60 21 +57 90 85 89 32 +64 4 91 99 81 +33 1 54 73 40 + +70 57 10 81 68 +16 97 21 11 88 +56 24 51 61 5 +38 80 31 23 9 +48 95 30 91 41 + +53 15 91 12 87 +83 72 98 0 58 +49 42 94 39 77 + 6 59 90 48 26 + 2 78 62 93 33 + +59 13 31 24 71 +18 30 3 33 34 +15 61 56 91 75 +38 58 29 72 26 +81 50 88 82 40 + +26 44 95 42 3 +52 12 51 20 68 +45 34 36 11 77 +99 54 85 47 75 +22 63 82 32 15 + +52 34 81 57 70 +44 51 31 39 80 +14 82 12 8 75 +28 38 5 58 45 +22 26 21 92 74 + +88 47 20 17 0 +50 52 53 43 57 +40 38 33 9 36 +78 93 63 12 14 +65 67 91 48 98 + +25 56 93 76 12 +39 51 97 86 94 +74 10 77 1 5 +66 55 79 89 48 +92 58 80 78 87 + +72 55 75 34 69 +31 73 42 86 70 +81 11 33 45 17 +96 27 65 50 35 +18 88 98 84 39 + +91 51 90 93 6 +77 35 13 50 17 +89 75 57 39 36 +92 64 56 20 78 +12 80 34 69 9 + +99 59 14 76 4 +84 19 72 30 40 +75 6 68 66 3 +51 28 60 2 63 +85 77 62 65 5 + +29 23 24 20 87 +96 0 6 40 98 +13 80 41 82 3 +62 88 25 10 99 +32 59 31 94 9 + +22 53 42 6 33 +40 29 54 68 27 +19 30 77 37 61 +17 62 57 36 44 +69 50 32 1 20 + +87 88 94 41 91 +75 85 67 78 9 +89 46 34 59 25 +74 20 77 97 56 +62 11 54 17 38 + +85 99 89 0 98 +82 90 62 8 24 +23 72 51 59 77 +78 31 60 10 29 +44 46 26 58 68 + +39 71 56 63 33 +66 83 68 58 69 +93 73 70 15 88 +55 76 4 92 38 +47 28 36 94 89 + +12 22 20 14 51 +30 11 86 57 97 +56 6 93 59 18 +28 40 90 67 94 +16 50 89 95 88 + +15 26 31 56 21 +47 77 23 22 66 +86 51 49 24 54 +53 2 0 84 63 +60 92 48 17 4 + +16 74 15 19 53 +86 13 59 8 39 +44 77 25 90 70 +92 3 33 60 37 +10 22 20 28 14 + +21 72 63 91 41 +46 6 8 73 71 + 9 54 52 78 43 +10 27 23 42 48 + 2 25 80 20 37 + +46 70 1 56 35 +20 33 52 25 63 +71 57 40 45 30 +26 51 95 3 47 +58 55 98 83 74 + +47 23 58 98 59 +28 49 32 81 18 +83 54 34 67 3 + 4 95 27 74 22 + 2 45 30 44 33 + +67 77 0 29 76 +15 25 34 63 42 +21 68 18 1 99 + 7 69 94 79 4 +50 8 17 81 53 + +29 90 98 59 39 +15 6 91 7 76 +22 66 27 23 37 +12 33 38 54 31 +86 48 85 16 11 + +62 57 12 76 59 +41 66 13 27 43 +55 83 78 95 65 +82 51 77 53 14 +34 45 94 92 19 + +13 71 1 27 41 +45 6 60 91 20 +90 2 98 76 32 +94 92 84 54 78 +51 21 40 50 47 + +58 47 98 68 23 +92 63 28 82 73 +64 93 94 37 31 +12 20 41 61 35 +44 83 36 95 99 + + 0 47 37 21 64 +79 17 46 70 97 + 5 89 76 36 32 +51 38 19 59 31 + 3 50 63 45 9 + +65 86 43 8 77 +38 18 49 14 88 +87 28 27 26 32 +19 9 45 98 76 +85 80 5 7 25 + +67 65 23 88 28 +70 71 83 35 13 +91 6 47 54 2 +15 76 59 74 62 +46 80 95 27 18 + +34 68 61 1 86 +28 97 29 56 24 +87 73 44 94 36 +58 8 49 72 47 +83 54 30 39 41 + +24 71 72 5 11 +37 30 88 86 22 +18 94 48 10 47 +64 0 20 74 12 +87 46 59 92 33 + +90 77 97 61 75 + 2 10 5 63 69 +43 32 83 24 13 +78 1 50 70 53 +87 47 68 73 0 + +58 95 26 35 23 + 8 2 83 41 56 +60 44 75 84 92 +88 78 53 31 55 +80 70 25 81 0 + +10 59 62 74 86 +42 64 58 36 14 +93 51 45 1 3 +52 69 94 5 44 + 4 50 48 8 12 + +38 40 21 97 74 +98 17 3 56 58 +57 63 44 93 70 +10 48 49 81 73 +12 55 86 41 82 + +93 29 38 58 5 + 9 95 45 67 97 +16 64 99 65 94 +43 34 14 23 66 + 0 88 87 50 78 + +72 70 87 50 31 +90 91 69 18 75 +42 21 11 86 81 +20 63 13 43 2 +56 92 29 30 73 + +63 98 32 50 17 +71 79 4 67 44 + 7 68 45 58 80 +59 12 55 83 34 +90 94 86 25 0 + +15 24 92 39 53 +63 7 30 77 28 +65 97 68 98 35 +88 23 85 96 70 +18 69 99 42 75 + +65 75 12 20 21 +29 31 57 45 13 +34 81 97 78 28 +63 38 51 19 37 +53 67 49 14 74 + +75 35 42 5 89 +56 50 3 90 62 + 7 15 45 16 14 +40 8 84 97 65 +46 51 27 9 18 + +62 42 24 0 53 +41 94 70 88 33 +32 19 43 21 23 +84 98 60 39 36 + 5 4 49 76 82 + +99 24 90 5 76 +78 66 72 53 85 +56 94 14 79 7 +83 6 27 26 69 +67 41 54 68 91 + + 5 72 83 53 49 +48 6 9 38 15 +99 84 90 82 70 +69 85 4 67 20 +87 16 61 21 39 + +18 43 78 0 77 +91 37 88 32 71 +15 54 2 62 17 +30 98 69 38 94 +83 63 89 39 14 + +26 70 3 5 89 +94 49 35 43 99 +82 36 62 78 37 +90 73 9 38 40 +60 68 8 2 53 diff --git a/2021/04/second.go b/2021/04/second.go new file mode 100644 index 0000000..7677e4a --- /dev/null +++ b/2021/04/second.go @@ -0,0 +1,119 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" + "strconv" + "strings" +) + +type grille struct { + lines [][]int + columns [][]int +} + +var ( + best = -1 + score = 0 +) + +// winning func +func win(g *grille, n int, iter int) { + sum := 0 + for i := 0; i < 5; i++ { + for j := 0; j < len(g.lines[i]); j++ { + sum += g.lines[i][j] + } + } + if iter > best { + best = iter + score = sum * n + //fmt.Println(iter, n, score, g) + } +} + +func main() { + f, err := os.Open("input") + if err != nil { + log.Fatalf("%+v", err) + } + defer f.Close() + + scanner := bufio.NewScanner(f) + scanner.Split(bufio.ScanLines) + + scanner.Scan() + tirage := make([]int, 0) + tirageStr := strings.Split(scanner.Text(), ",") + // lets process the tirage + for _, v := range tirageStr { + n, err := strconv.Atoi(v) + if err != nil { + log.Fatalf("%+v", err) + } + tirage = append(tirage, n) + } + + for scanner.Scan() { + // we just scanned the new line + // lets init the grille + g := new(grille) + g.lines = make([][]int, 5) + g.columns = make([][]int, 5) + for i := 0; i < 5; i++ { + g.lines[i] = make([]int, 5) + g.columns[i] = make([]int, 5) + } + // lets populate the grille + for i := 0; i < 5; i++ { + scanner.Scan() + numbers := strings.Fields(scanner.Text()) + for j := 0; j < 5; j++ { + n, err := strconv.Atoi(numbers[j]) + if err != nil { + log.Fatalf("%+v", err) + } + g.lines[i][j] = n + g.columns[j][i] = n + } + } + // lets process the tirage + out: + for iter, n := range tirage { + // remove the number + for i := 0; i < 5; i++ { + for j := 0; j < len(g.lines[i]); j++ { + if g.lines[i][j] == n { + if len(g.lines[i]) == 1 { + g.lines[i] = []int{} + win(g, n, iter) + break out + } + if j < len(g.lines[i])-1 { + g.lines[i][j] = g.lines[i][len(g.lines[i])-1] + } + g.lines[i] = g.lines[i][:len(g.lines[i])-1] + } + } + } + for i := 0; i < 5; i++ { + for j := 0; j < len(g.columns[i]); j++ { + if g.columns[i][j] == n { + if len(g.columns[i]) == 1 { + g.columns[i] = []int{} + win(g, n, iter) + break out + } + if j < len(g.columns[i])-1 { + g.columns[i][j] = g.columns[i][len(g.columns[i])-1] + } + g.columns[i] = g.columns[i][:len(g.columns[i])-1] + } + } + } + } + } + fmt.Println(score) +} diff --git a/2021/05/README.md b/2021/05/README.md new file mode 100644 index 0000000..6a4996d --- /dev/null +++ b/2021/05/README.md @@ -0,0 +1,3 @@ +I went a little overboard with a parsing tutorial. + +I wanted to manually write a parser from quite some time now and seized this opportunity. It would have been trivial with just a scanner or even a regex, but hey learning! diff --git a/2021/05/example b/2021/05/example new file mode 100644 index 0000000..b258f68 --- /dev/null +++ b/2021/05/example @@ -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/2021/05/first.go b/2021/05/first.go new file mode 100644 index 0000000..3bd007b --- /dev/null +++ b/2021/05/first.go @@ -0,0 +1,48 @@ +package main + +import ( + "bufio" + "fmt" + "os" + + "git.adyxax.org/aoc/2021/05/line" +) + +func main() { + matrix := make([][]int, 1000) + for i := 0; i < 1000; i++ { + matrix[i] = make([]int, 1000) + } + + parser := line.NewParser(bufio.NewReader(os.Stdin)) + for { + l, err := parser.Parse() + if err != nil { + break + } + if l.X1 == l.X2 { + if l.Y1 > l.Y2 { + l.Y1, l.Y2 = l.Y2, l.Y1 + } + for i := l.Y1; i <= l.Y2; i++ { + matrix[l.X1][i]++ + } + } else if l.Y1 == l.Y2 { + if l.X1 > l.X2 { + l.X1, l.X2 = l.X2, l.X1 + } + for i := l.X1; i <= l.X2; i++ { + matrix[i][l.Y1]++ + } + } + } + score := 0 + for i := 0; i < 1000; i++ { + for j := 0; j < 1000; j++ { + if matrix[i][j] >= 2 { + score++ + } + } + } + fmt.Println(score) +} diff --git a/2021/05/first_v2.go b/2021/05/first_v2.go new file mode 100644 index 0000000..d99f80b --- /dev/null +++ b/2021/05/first_v2.go @@ -0,0 +1,60 @@ +package main + +import ( + "bufio" + "fmt" + "os" + + "git.adyxax.org/aoc/2021/05/line" +) + +func abs(a int) int { + if a < 0 { + return -a + } + return a +} + +func computeDelta(a, b int) int { + if a < b { + return 1 + } else if a > b { + return -1 + } + return 0 +} + +func main() { + matrix := make([][]int, 1000) + for i := 0; i < 1000; i++ { + matrix[i] = make([]int, 1000) + } + + parser := line.NewParser(bufio.NewReader(os.Stdin)) + for { + l, err := parser.Parse() + if err != nil { + break + } + length := abs(l.X2 - l.X1) + if length == 0 { + length = abs(l.Y2 - l.Y1) + } + dx := computeDelta(l.X1, l.X2) + dy := computeDelta(l.Y1, l.Y2) + if dx == 0 || dy == 0 { + for i := 0; i <= length; i++ { + matrix[l.X1+i*dx][l.Y1+i*dy]++ + } + } + } + score := 0 + for i := 0; i < 1000; i++ { + for j := 0; j < 1000; j++ { + if matrix[i][j] >= 2 { + score++ + } + } + } + fmt.Println(score) +} diff --git a/2021/05/go.mod b/2021/05/go.mod new file mode 100644 index 0000000..81fcab6 --- /dev/null +++ b/2021/05/go.mod @@ -0,0 +1,3 @@ +module git.adyxax.org/aoc/2021/05 + +go 1.17 diff --git a/2021/05/input b/2021/05/input new file mode 100644 index 0000000..527ecf6 --- /dev/null +++ b/2021/05/input @@ -0,0 +1,500 @@ +223,805 -> 223,548 +609,164 -> 609,503 +461,552 -> 796,552 +207,361 -> 207,34 +503,879 -> 503,946 +937,52 -> 937,268 +560,652 -> 118,652 +771,103 -> 85,789 +119,156 -> 947,984 +356,634 -> 607,634 +348,812 -> 873,287 +409,490 -> 726,490 +298,790 -> 298,454 +407,543 -> 820,130 +206,89 -> 591,89 +164,709 -> 976,709 +208,921 -> 208,131 +515,209 -> 515,745 +876,639 -> 281,44 +270,453 -> 727,910 +190,417 -> 190,755 +522,726 -> 903,726 +390,651 -> 603,864 +707,549 -> 926,330 +471,869 -> 471,561 +970,735 -> 401,735 +612,624 -> 612,88 +844,879 -> 844,453 +400,38 -> 400,350 +832,225 -> 984,225 +971,642 -> 42,642 +70,862 -> 447,485 +183,79 -> 183,708 +598,700 -> 598,287 +635,195 -> 39,195 +587,362 -> 349,362 +108,88 -> 965,945 +700,299 -> 165,299 +295,824 -> 785,334 +211,284 -> 390,105 +288,326 -> 672,710 +595,231 -> 595,679 +671,576 -> 813,718 +14,845 -> 784,75 +700,129 -> 43,129 +83,913 -> 889,107 +830,596 -> 322,596 +391,450 -> 391,779 +384,32 -> 384,430 +311,948 -> 938,321 +460,288 -> 460,392 +924,602 -> 924,595 +703,458 -> 703,475 +335,953 -> 335,195 +692,314 -> 927,314 +131,433 -> 131,737 +590,771 -> 965,771 +650,13 -> 963,13 +586,904 -> 658,976 +238,824 -> 782,824 +366,45 -> 691,370 +428,758 -> 201,758 +240,545 -> 30,545 +396,154 -> 332,154 +549,307 -> 233,307 +187,240 -> 851,904 +151,135 -> 937,921 +342,850 -> 342,156 +695,200 -> 695,754 +385,880 -> 893,372 +986,966 -> 813,966 +727,661 -> 727,402 +316,937 -> 316,797 +422,235 -> 422,282 +965,684 -> 882,684 +266,222 -> 419,69 +649,843 -> 635,857 +618,84 -> 126,576 +588,822 -> 588,636 +569,142 -> 569,607 +899,479 -> 488,890 +986,52 -> 369,52 +987,478 -> 551,914 +867,951 -> 973,845 +90,401 -> 304,401 +60,836 -> 798,836 +143,675 -> 686,675 +743,974 -> 743,305 +981,899 -> 551,469 +705,430 -> 493,430 +301,366 -> 823,366 +978,712 -> 617,712 +426,805 -> 426,345 +532,855 -> 532,54 +612,143 -> 612,133 +57,52 -> 955,950 +880,50 -> 16,914 +89,908 -> 89,214 +487,867 -> 586,867 +181,285 -> 181,470 +526,666 -> 86,226 +117,704 -> 117,961 +289,101 -> 983,795 +586,429 -> 442,429 +442,869 -> 734,869 +564,479 -> 564,382 +447,486 -> 62,101 +42,218 -> 509,218 +21,890 -> 843,68 +84,978 -> 921,141 +590,960 -> 590,934 +54,949 -> 967,36 +799,39 -> 767,39 +979,232 -> 979,628 +489,482 -> 339,482 +759,473 -> 290,942 +960,958 -> 32,30 +134,180 -> 134,864 +972,981 -> 13,22 +106,385 -> 11,385 +849,454 -> 447,454 +477,385 -> 955,863 +853,180 -> 922,180 +509,274 -> 751,32 +905,295 -> 779,295 +661,629 -> 104,629 +935,117 -> 93,959 +165,372 -> 746,953 +988,141 -> 122,141 +625,621 -> 625,406 +24,710 -> 465,710 +417,468 -> 851,34 +365,285 -> 572,285 +217,164 -> 217,214 +943,439 -> 465,439 +80,102 -> 80,717 +869,19 -> 54,834 +399,480 -> 399,458 +644,826 -> 644,911 +651,189 -> 651,687 +671,946 -> 332,607 +531,417 -> 657,417 +847,350 -> 847,112 +315,733 -> 871,177 +749,118 -> 692,118 +55,616 -> 55,894 +570,307 -> 633,307 +12,964 -> 883,93 +84,299 -> 84,185 +49,187 -> 903,187 +592,40 -> 842,40 +639,381 -> 802,544 +59,61 -> 836,61 +968,51 -> 266,753 +883,373 -> 883,130 +612,45 -> 406,45 +206,698 -> 206,823 +385,685 -> 385,46 +656,338 -> 73,921 +256,794 -> 365,903 +671,247 -> 248,247 +722,509 -> 635,422 +460,783 -> 615,783 +946,980 -> 946,129 +343,780 -> 343,723 +218,371 -> 218,856 +363,809 -> 143,589 +434,739 -> 889,739 +75,71 -> 975,971 +57,253 -> 582,778 +976,237 -> 976,148 +386,866 -> 386,544 +901,797 -> 901,630 +976,706 -> 195,706 +264,420 -> 272,428 +693,72 -> 693,379 +888,832 -> 888,490 +363,900 -> 363,350 +25,312 -> 25,58 +292,307 -> 481,307 +715,393 -> 976,132 +641,450 -> 96,450 +650,38 -> 432,38 +339,97 -> 476,97 +916,24 -> 13,927 +933,934 -> 34,35 +971,367 -> 971,919 +726,310 -> 477,559 +12,984 -> 986,10 +318,531 -> 318,72 +604,979 -> 12,387 +890,39 -> 890,213 +944,954 -> 33,43 +507,830 -> 284,607 +724,111 -> 724,242 +425,912 -> 425,445 +371,903 -> 371,634 +415,314 -> 415,509 +884,849 -> 884,454 +726,647 -> 447,926 +588,463 -> 588,426 +807,453 -> 807,593 +32,449 -> 975,449 +593,757 -> 593,607 +521,850 -> 521,139 +843,478 -> 843,317 +408,834 -> 408,455 +65,241 -> 864,241 +532,138 -> 613,138 +477,239 -> 477,676 +92,400 -> 92,935 +268,104 -> 300,104 +942,20 -> 93,869 +294,134 -> 695,134 +748,477 -> 748,311 +581,879 -> 481,879 +292,57 -> 874,639 +829,787 -> 944,787 +130,780 -> 442,780 +754,435 -> 956,435 +306,659 -> 306,491 +252,612 -> 646,612 +846,949 -> 846,924 +197,888 -> 145,836 +156,790 -> 151,790 +903,305 -> 671,73 +195,79 -> 195,40 +781,67 -> 781,635 +742,743 -> 742,280 +297,42 -> 618,42 +237,151 -> 156,151 +851,930 -> 47,126 +425,368 -> 659,134 +57,890 -> 898,49 +86,62 -> 86,445 +133,499 -> 133,604 +202,567 -> 872,567 +749,578 -> 749,804 +379,379 -> 147,379 +510,474 -> 510,388 +184,115 -> 738,115 +904,613 -> 550,613 +755,649 -> 755,305 +461,306 -> 461,547 +469,124 -> 542,124 +736,218 -> 736,968 +307,662 -> 307,188 +360,970 -> 58,668 +36,267 -> 214,267 +980,330 -> 22,330 +222,972 -> 222,178 +846,774 -> 714,774 +798,837 -> 789,837 +567,258 -> 567,502 +325,582 -> 325,976 +138,386 -> 138,691 +326,878 -> 326,386 +790,276 -> 811,276 +517,522 -> 81,86 +493,567 -> 406,567 +522,370 -> 13,370 +31,697 -> 607,121 +297,524 -> 297,320 +790,681 -> 753,681 +90,961 -> 901,150 +262,46 -> 262,68 +18,26 -> 977,985 +782,381 -> 956,381 +353,740 -> 353,595 +32,448 -> 941,448 +405,254 -> 686,254 +853,57 -> 297,613 +555,209 -> 439,209 +765,679 -> 142,56 +175,903 -> 175,685 +693,653 -> 845,653 +394,108 -> 394,901 +351,108 -> 335,108 +841,83 -> 841,716 +525,608 -> 525,496 +874,32 -> 874,214 +354,760 -> 44,760 +249,330 -> 864,945 +553,377 -> 553,944 +903,374 -> 335,374 +387,34 -> 387,86 +380,331 -> 380,124 +618,520 -> 797,520 +718,169 -> 703,169 +355,184 -> 851,184 +582,570 -> 582,313 +312,952 -> 312,460 +269,70 -> 269,197 +701,907 -> 701,768 +645,417 -> 645,548 +931,532 -> 367,532 +497,361 -> 497,348 +563,642 -> 976,642 +376,504 -> 376,448 +538,945 -> 538,773 +594,886 -> 594,281 +879,558 -> 192,558 +985,68 -> 66,987 +599,420 -> 599,41 +296,318 -> 296,132 +330,619 -> 302,619 +245,137 -> 918,810 +823,798 -> 556,531 +64,201 -> 723,860 +955,365 -> 955,829 +372,976 -> 255,859 +804,962 -> 168,962 +200,442 -> 200,97 +965,964 -> 870,869 +534,158 -> 128,564 +380,739 -> 577,542 +740,391 -> 740,651 +167,177 -> 619,177 +215,449 -> 215,330 +494,612 -> 19,137 +458,634 -> 458,257 +884,817 -> 393,326 +407,291 -> 19,679 +627,173 -> 627,570 +53,93 -> 552,592 +809,363 -> 119,363 +588,418 -> 588,764 +807,131 -> 807,834 +616,61 -> 514,61 +553,642 -> 236,325 +959,553 -> 683,553 +36,754 -> 36,830 +533,293 -> 144,293 +950,780 -> 396,780 +949,878 -> 14,878 +453,180 -> 989,180 +22,46 -> 670,694 +479,206 -> 479,552 +22,53 -> 599,53 +254,964 -> 884,334 +578,813 -> 100,813 +945,247 -> 778,80 +312,978 -> 312,518 +882,225 -> 882,967 +581,683 -> 293,395 +107,540 -> 534,967 +382,946 -> 28,946 +864,743 -> 246,743 +538,558 -> 733,753 +811,436 -> 814,436 +982,33 -> 65,950 +785,829 -> 945,829 +322,471 -> 346,471 +904,528 -> 904,669 +231,471 -> 772,471 +773,490 -> 669,386 +867,482 -> 417,32 +352,856 -> 352,478 +723,355 -> 619,355 +667,922 -> 667,247 +642,386 -> 241,386 +594,35 -> 594,580 +916,723 -> 793,723 +73,774 -> 269,970 +43,273 -> 148,168 +744,637 -> 825,637 +98,30 -> 98,383 +130,277 -> 802,277 +167,122 -> 672,627 +871,866 -> 564,559 +923,475 -> 539,859 +422,714 -> 422,946 +667,950 -> 667,640 +758,181 -> 12,927 +129,927 -> 129,288 +485,661 -> 402,661 +114,573 -> 974,573 +674,779 -> 851,779 +977,184 -> 977,143 +229,937 -> 229,138 +520,887 -> 520,512 +918,329 -> 918,990 +732,41 -> 521,41 +399,245 -> 883,729 +824,618 -> 356,618 +215,218 -> 845,848 +704,34 -> 307,431 +124,166 -> 696,738 +692,749 -> 839,749 +790,637 -> 790,598 +697,396 -> 669,396 +419,140 -> 113,446 +426,738 -> 171,738 +489,494 -> 190,793 +320,301 -> 320,398 +275,809 -> 275,717 +537,703 -> 465,703 +536,450 -> 560,450 +153,927 -> 914,166 +246,692 -> 485,453 +26,179 -> 26,554 +487,678 -> 487,696 +807,719 -> 224,719 +605,920 -> 899,920 +112,262 -> 112,765 +752,898 -> 752,429 +861,103 -> 861,477 +628,505 -> 628,248 +556,293 -> 556,276 +826,682 -> 273,129 +685,324 -> 685,692 +544,410 -> 544,678 +796,633 -> 796,950 +753,843 -> 753,936 +817,40 -> 817,600 +137,941 -> 677,401 +563,457 -> 599,457 +251,644 -> 251,67 +170,792 -> 805,792 +171,486 -> 171,877 +337,481 -> 268,412 +43,158 -> 44,158 +148,610 -> 863,610 +332,765 -> 202,765 +307,637 -> 334,637 +557,380 -> 231,54 +858,76 -> 150,784 +477,329 -> 319,329 +306,608 -> 306,38 +245,42 -> 245,929 +15,786 -> 745,786 +946,321 -> 841,321 +837,281 -> 837,762 +847,391 -> 847,840 +304,52 -> 304,299 +938,122 -> 877,122 +214,347 -> 862,347 +494,540 -> 751,540 +184,29 -> 913,758 +904,12 -> 15,901 +573,23 -> 158,23 +926,603 -> 643,603 +105,506 -> 518,506 +551,917 -> 983,917 +708,33 -> 831,33 +347,173 -> 218,44 +933,175 -> 933,781 +902,556 -> 902,812 +556,485 -> 252,789 +823,807 -> 368,352 +217,744 -> 217,470 +795,455 -> 795,783 +170,944 -> 926,188 +55,655 -> 258,655 +158,57 -> 959,858 +714,823 -> 714,550 +238,18 -> 388,18 +980,985 -> 12,17 +360,596 -> 770,596 +846,684 -> 220,58 +552,107 -> 552,974 +228,552 -> 354,552 +421,41 -> 421,103 +674,475 -> 912,475 +455,626 -> 455,683 +952,841 -> 946,841 +920,792 -> 381,253 +786,918 -> 786,175 +889,859 -> 889,24 +178,604 -> 573,209 +71,621 -> 550,621 +38,36 -> 922,920 +104,690 -> 575,690 +252,883 -> 894,241 +627,107 -> 417,107 +768,913 -> 13,158 +708,337 -> 708,407 +156,941 -> 156,297 +814,653 -> 814,829 +234,920 -> 896,920 +652,170 -> 128,170 +765,825 -> 347,825 +681,901 -> 681,112 +410,301 -> 979,301 +462,681 -> 462,726 +117,957 -> 117,693 +479,948 -> 698,948 +839,965 -> 97,223 +102,189 -> 102,366 +93,798 -> 819,72 +27,336 -> 27,655 +161,635 -> 527,269 +140,272 -> 140,336 +884,915 -> 41,72 +575,563 -> 155,563 +387,601 -> 387,597 +355,186 -> 782,613 +866,435 -> 816,435 +96,161 -> 764,161 +971,29 -> 21,979 diff --git a/2021/05/line/line.go b/2021/05/line/line.go new file mode 100644 index 0000000..aedf455 --- /dev/null +++ b/2021/05/line/line.go @@ -0,0 +1,239 @@ +package line + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strconv" +) + +type Line struct { + X1, Y1, X2, Y2 int +} + +// Token represents a lexical token. +type Token int + +const ( + // Special tokens + ILLEGAL Token = iota + EOF + WHITESPACE + + // Literals + INT // integers + + // Misc characters + COMMA // , + ARROW // -> +) + +func isWhitespace(ch rune) bool { + return ch == ' ' || ch == '\t' || ch == '\n' +} + +func isDigit(ch rune) bool { + return (ch >= '0' && ch <= '9') +} + +var eof = rune(0) + +// Scanner represents a lexical scanner. +type Scanner struct { + r *bufio.Reader +} + +// NewScanner returns a new instance of Scanner. +func NewScanner(r io.Reader) *Scanner { + return &Scanner{r: bufio.NewReader(r)} +} + +// read reads the next rune from the bufferred reader. +// Returns the rune(0) if an error occurs (or io.EOF is returned). +func (s *Scanner) read() rune { + ch, _, err := s.r.ReadRune() + if err != nil { + return eof + } + return ch +} + +// unread places the previously read rune back on the reader. +func (s *Scanner) unread() { _ = s.r.UnreadRune() } + +// Scan returns the next token and literal value. +func (s *Scanner) Scan() (tok Token, lit string) { + // Read the next rune. + ch := s.read() + + // If we see whitespace then consume all contiguous whitespace. + // If we see a digit then consume as an int. + if isWhitespace(ch) { + return s.scanWhitespace(ch) + } else if isDigit(ch) { + return s.scanInt(ch) + } + + // Otherwise read the individual character. + switch ch { + case eof: + return EOF, "" + case ',': + return COMMA, string(ch) + case '-': + return s.scanArrow(ch) + } + + return ILLEGAL, string(ch) +} + +// scanWhitespace consumes the current rune and all contiguous whitespace. +func (s *Scanner) scanWhitespace(read rune) (tok Token, lit string) { + // Create a buffer and read the current character into it. + var buf bytes.Buffer + buf.WriteRune(read) + + // Read every subsequent whitespace character into the buffer. + // Non-whitespace characters and EOF will cause the loop to exit. + for { + if ch := s.read(); ch == eof { + break + } else if !isWhitespace(ch) { + s.unread() + break + } else { + buf.WriteRune(ch) + } + } + + return WHITESPACE, buf.String() +} + +// scanInt consumes the current rune and all contiguous digit runes. +func (s *Scanner) scanInt(read rune) (tok Token, lit string) { + // Create a buffer and read the current character into it. + var buf bytes.Buffer + buf.WriteRune(read) + + // Read every subsequent ident character into the buffer. + // Non-ident characters and EOF will cause the loop to exit. + for { + if ch := s.read(); ch == eof { + break + } else if !isDigit(ch) { + s.unread() + break + } else { + _, _ = buf.WriteRune(ch) + } + } + + // Otherwise return as a regular identifier. + return INT, buf.String() +} + +func (s *Scanner) scanArrow(read rune) (tok Token, lit string) { + // Create a buffer and read the current character into it. + var buf bytes.Buffer + buf.WriteRune(read) + + // Read every subsequent ident character into the buffer. + // Non-ident characters and EOF will cause the loop to exit. + for { + if ch := s.read(); ch == eof { + break + } else if ch == '>' { + _, _ = buf.WriteRune(ch) + return ARROW, buf.String() + } else { + _, _ = buf.WriteRune(ch) + break + } + } + + // Otherwise return as a regular identifier. + return ILLEGAL, buf.String() +} + +// Parser represents a parser. +type Parser struct { + s *Scanner + buf struct { + tok Token // last read token + lit string // last read literal + n int // buffer size (max=1) + } +} + +// NewParser returns a new instance of Parser. +func NewParser(r io.Reader) *Parser { + return &Parser{s: NewScanner(r)} +} + +// scan returns the next token from the underlying scanner. +// If a token has been unscanned then read that instead. +func (p *Parser) scan() (tok Token, lit string) { + // If we have a token on the buffer, then return it. + if p.buf.n != 0 { + p.buf.n = 0 + return p.buf.tok, p.buf.lit + } + + // Otherwise read the next token from the scanner. + tok, lit = p.s.Scan() + + // Save it to the buffer in case we unscan later. + p.buf.tok, p.buf.lit = tok, lit + + return +} + +// unscan pushes the previously read token back onto the buffer. +func (p *Parser) unscan() { p.buf.n = 1 } + +// scanIgnoreWhitespace scans the next non-whitespace token. +func (p *Parser) scanIgnoreWhitespace() (tok Token, lit string) { + tok, lit = p.scan() + if tok == WHITESPACE { + tok, lit = p.scan() + } + return +} + +func (p *Parser) Parse() (*Line, error) { + l := &Line{} + if tok, lit := p.scanIgnoreWhitespace(); tok != INT { + return nil, fmt.Errorf("found %q, expected INT", lit) + } else { + l.X1, _ = strconv.Atoi(lit) + } + if tok, lit := p.scanIgnoreWhitespace(); tok != COMMA { + return nil, fmt.Errorf("found %q, expected COMMA", lit) + } + if tok, lit := p.scanIgnoreWhitespace(); tok != INT { + return nil, fmt.Errorf("found %q, expected INT", lit) + } else { + l.Y1, _ = strconv.Atoi(lit) + } + if tok, lit := p.scanIgnoreWhitespace(); tok != ARROW { + return nil, fmt.Errorf("found %q, expected ARROW", lit) + } + if tok, lit := p.scanIgnoreWhitespace(); tok != INT { + return nil, fmt.Errorf("found %q, expected INT", lit) + } else { + l.X2, _ = strconv.Atoi(lit) + } + if tok, lit := p.scanIgnoreWhitespace(); tok != COMMA { + return nil, fmt.Errorf("found %q, expected COMMA", lit) + } + if tok, lit := p.scanIgnoreWhitespace(); tok != INT { + return nil, fmt.Errorf("found %q, expected INT", lit) + } else { + l.Y2, _ = strconv.Atoi(lit) + } + if tok, lit := p.scan(); tok != WHITESPACE { + return nil, fmt.Errorf("found %q, expected WHITESPACE", lit) + } + return l, nil +} diff --git a/2021/05/second.go b/2021/05/second.go new file mode 100644 index 0000000..c79025a --- /dev/null +++ b/2021/05/second.go @@ -0,0 +1,61 @@ +package main + +import ( + "bufio" + "fmt" + "os" + + "git.adyxax.org/aoc/2021/05/line" +) + +func main() { + matrix := make([][]int, 1000) + for i := 0; i < 1000; i++ { + matrix[i] = make([]int, 1000) + } + + parser := line.NewParser(bufio.NewReader(os.Stdin)) + for { + l, err := parser.Parse() + if err != nil { + break + } + if l.X1 == l.X2 { + if l.Y1 > l.Y2 { + l.Y1, l.Y2 = l.Y2, l.Y1 + } + for i := l.Y1; i <= l.Y2; i++ { + matrix[l.X1][i]++ + } + } else if l.Y1 == l.Y2 { + if l.X1 > l.X2 { + l.X1, l.X2 = l.X2, l.X1 + } + for i := l.X1; i <= l.X2; i++ { + matrix[i][l.Y1]++ + } + } else { + if l.X1 > l.X2 { + l.X1, l.X2, l.Y1, l.Y2 = l.X2, l.X1, l.Y2, l.Y1 + } + if l.Y1 < l.Y2 { + for i := 0; i <= l.X2-l.X1; i++ { + matrix[l.X1+i][l.Y1+i]++ + } + } else { + for i := 0; i <= l.X2-l.X1; i++ { + matrix[l.X1+i][l.Y1-i]++ + } + } + } + } + score := 0 + for i := 0; i < 1000; i++ { + for j := 0; j < 1000; j++ { + if matrix[i][j] >= 2 { + score++ + } + } + } + fmt.Println(score) +} diff --git a/2021/05/second_v2.go b/2021/05/second_v2.go new file mode 100644 index 0000000..7d02a19 --- /dev/null +++ b/2021/05/second_v2.go @@ -0,0 +1,58 @@ +package main + +import ( + "bufio" + "fmt" + "os" + + "git.adyxax.org/aoc/2021/05/line" +) + +func abs(a int) int { + if a < 0 { + return -a + } + return a +} + +func computeDelta(a, b int) int { + if a < b { + return 1 + } else if a > b { + return -1 + } + return 0 +} + +func main() { + matrix := make([][]int, 1000) + for i := 0; i < 1000; i++ { + matrix[i] = make([]int, 1000) + } + + parser := line.NewParser(bufio.NewReader(os.Stdin)) + for { + l, err := parser.Parse() + if err != nil { + break + } + length := abs(l.X2 - l.X1) + if length == 0 { + length = abs(l.Y2 - l.Y1) + } + dx := computeDelta(l.X1, l.X2) + dy := computeDelta(l.Y1, l.Y2) + for i := 0; i <= length; i++ { + matrix[l.X1+i*dx][l.Y1+i*dy]++ + } + } + score := 0 + for i := 0; i < 1000; i++ { + for j := 0; j < 1000; j++ { + if matrix[i][j] >= 2 { + score++ + } + } + } + fmt.Println(score) +} |