diff --git a/examples/aoc-2021/advent-day01.lox b/examples/aoc-2021/advent-day01.lox new file mode 100644 index 0000000..f698f64 --- /dev/null +++ b/examples/aoc-2021/advent-day01.lox @@ -0,0 +1,72 @@ +var example = [199, 200, 208, 210, 200, 207, 240, 269, 260, 263]; + +class WindowedArray { + init(array, size) { + this.array = array; + this.size = size; + this.current = 0; + } + + next() { + if (this.current + this.size > this.array.length()) return Ok(nil); + var window = this.array.slice(this.current, this.current + this.size, 1); + this.current = this.current + 1; + return Ok(window); + } +} + +class WindowedLineReader { + init(lineReader, size) { + this.lineReader = lineReader; + this.size = size; + } + + next() { + if (this?.window == nil) { + this.window = Array(this.size); + for (var line, i = 0; i < this.size; i++) { + line = this.lineReader.readLine()!?; + this.window.set(i, line); + } + return Ok(this.window); + } else { + var line = this.lineReader.readLine()!?; + if (line == nil) { + return Ok(nil); + } else { + System.arraycopy(this.window, 1, this.window, 0, this.size - 1); + this.window.set(this.size - 1, line); + return Ok(this.window); + } + } + } +} + +fun compute(windowed, convert) { + var window = windowed.next(); + var previous = 0; + var count = 0; + while (window = windowed.next()!?) { + var sum = window.reduce(0, fun (a, b) = a + convert(b)); + if (sum > previous) count++; + previous = sum; + } + + return Ok(count); +} + +fun part1Example(depths) = compute(WindowedArray(depths, 1), fun (x) = x); +fun part2Example(depths) = compute(WindowedArray(depths, 3), fun (x) = x); + +fun windowed(file, size) = + WindowedLineReader(LineReader(BufferedInputStream(FileInputStream(file))), size); + +fun parseNumber(x) = String.toNumber(x).orElse(0); +fun part1(file) = compute(windowed(file, 1), parseNumber); +fun part2(file) = compute(windowed(file, 3), parseNumber); + +var file = File("examples/aoc-2021/advent-day01.txt"); +print part1Example(example); // expect: 7 +print part1(file); // expect: 1342 +print part2Example(example); // expect: 5 +print part2(file); // expect: 1378 diff --git a/examples/aoc-2021/advent-day01.txt b/examples/aoc-2021/advent-day01.txt new file mode 100644 index 0000000..55921b9 --- /dev/null +++ b/examples/aoc-2021/advent-day01.txt @@ -0,0 +1,2000 @@ +176 +184 +196 +199 +204 +206 +219 +215 +216 +217 +218 +230 +231 +214 +210 +189 +174 +170 +162 +167 +173 +182 +177 +179 +180 +182 +198 +201 +200 +207 +203 +213 +231 +222 +223 +224 +209 +217 +228 +236 +243 +241 +260 +262 +258 +260 +254 +270 +271 +278 +264 +263 +262 +260 +261 +234 +229 +233 +208 +210 +211 +210 +206 +207 +209 +199 +201 +218 +210 +206 +207 +218 +221 +229 +233 +234 +235 +246 +253 +254 +260 +259 +253 +254 +275 +277 +295 +296 +299 +333 +334 +336 +337 +339 +347 +374 +369 +371 +376 +371 +374 +375 +371 +374 +381 +383 +384 +395 +396 +400 +395 +397 +399 +389 +396 +390 +404 +411 +412 +428 +424 +433 +431 +437 +473 +489 +486 +488 +479 +480 +484 +474 +475 +471 +492 +493 +501 +512 +509 +506 +519 +523 +522 +521 +535 +548 +531 +519 +523 +522 +516 +512 +522 +547 +581 +582 +580 +579 +580 +600 +595 +592 +587 +588 +591 +592 +583 +586 +584 +597 +610 +592 +581 +583 +578 +575 +582 +579 +587 +594 +592 +593 +599 +605 +609 +610 +609 +601 +604 +608 +609 +613 +614 +612 +614 +626 +627 +636 +656 +652 +655 +656 +678 +680 +686 +687 +654 +663 +669 +664 +668 +647 +652 +659 +653 +654 +656 +637 +638 +621 +620 +621 +609 +604 +612 +616 +612 +617 +614 +610 +607 +608 +613 +617 +624 +625 +622 +604 +606 +610 +609 +607 +605 +618 +622 +635 +636 +640 +667 +668 +664 +674 +675 +682 +694 +698 +704 +717 +723 +724 +699 +695 +693 +674 +670 +683 +685 +683 +676 +675 +678 +677 +675 +657 +670 +675 +673 +658 +660 +673 +685 +675 +676 +677 +671 +689 +688 +690 +691 +692 +709 +713 +712 +715 +739 +731 +734 +762 +764 +746 +728 +729 +727 +730 +745 +773 +781 +787 +806 +807 +808 +815 +822 +837 +844 +842 +841 +850 +853 +838 +841 +845 +846 +844 +849 +846 +847 +859 +851 +854 +857 +873 +882 +892 +896 +883 +896 +895 +886 +879 +878 +877 +878 +881 +891 +898 +913 +914 +920 +922 +928 +929 +915 +917 +918 +913 +926 +929 +937 +939 +940 +936 +938 +939 +948 +946 +951 +950 +918 +917 +924 +917 +918 +921 +919 +917 +929 +950 +985 +988 +991 +996 +1002 +995 +990 +999 +989 +990 +991 +992 +991 +992 +993 +991 +994 +996 +997 +989 +993 +975 +973 +972 +973 +971 +969 +976 +983 +980 +987 +1003 +1002 +1000 +993 +994 +993 +972 +970 +991 +988 +989 +993 +996 +1002 +1003 +1008 +1007 +1014 +1015 +1022 +1012 +1029 +1030 +1029 +1030 +1025 +1026 +1010 +1006 +1008 +1006 +1012 +1015 +1029 +1067 +1102 +1107 +1108 +1103 +1108 +1103 +1120 +1119 +1118 +1119 +1118 +1119 +1132 +1137 +1148 +1150 +1153 +1166 +1169 +1199 +1205 +1208 +1216 +1210 +1217 +1216 +1217 +1218 +1198 +1199 +1197 +1198 +1193 +1202 +1241 +1242 +1239 +1241 +1238 +1233 +1234 +1235 +1237 +1228 +1229 +1235 +1218 +1236 +1237 +1208 +1246 +1251 +1246 +1248 +1242 +1241 +1243 +1231 +1226 +1224 +1221 +1220 +1224 +1219 +1227 +1214 +1237 +1261 +1271 +1268 +1292 +1304 +1303 +1312 +1287 +1286 +1292 +1295 +1297 +1304 +1311 +1312 +1309 +1314 +1307 +1316 +1320 +1319 +1316 +1333 +1332 +1316 +1315 +1320 +1321 +1335 +1355 +1353 +1356 +1325 +1333 +1335 +1339 +1360 +1361 +1362 +1364 +1361 +1363 +1362 +1363 +1364 +1392 +1397 +1398 +1405 +1406 +1408 +1406 +1394 +1391 +1407 +1413 +1415 +1413 +1419 +1422 +1416 +1422 +1421 +1431 +1433 +1437 +1439 +1443 +1446 +1449 +1439 +1444 +1452 +1460 +1468 +1469 +1486 +1500 +1507 +1513 +1512 +1511 +1531 +1532 +1541 +1550 +1557 +1561 +1557 +1560 +1563 +1564 +1565 +1588 +1589 +1592 +1591 +1593 +1598 +1603 +1590 +1604 +1608 +1610 +1623 +1598 +1592 +1601 +1598 +1600 +1601 +1599 +1609 +1607 +1608 +1613 +1605 +1601 +1605 +1610 +1611 +1609 +1608 +1615 +1620 +1629 +1628 +1641 +1632 +1630 +1635 +1634 +1629 +1630 +1632 +1630 +1641 +1661 +1655 +1657 +1653 +1619 +1629 +1607 +1600 +1603 +1591 +1596 +1599 +1601 +1582 +1591 +1593 +1596 +1597 +1600 +1596 +1597 +1603 +1624 +1630 +1628 +1626 +1628 +1631 +1628 +1629 +1625 +1627 +1620 +1613 +1614 +1638 +1637 +1626 +1624 +1623 +1621 +1620 +1621 +1598 +1610 +1611 +1622 +1629 +1646 +1655 +1677 +1678 +1679 +1699 +1702 +1715 +1710 +1722 +1719 +1715 +1716 +1724 +1735 +1734 +1727 +1743 +1748 +1745 +1742 +1755 +1754 +1734 +1738 +1729 +1732 +1733 +1726 +1723 +1744 +1745 +1746 +1748 +1778 +1777 +1780 +1792 +1798 +1799 +1800 +1793 +1794 +1797 +1802 +1796 +1800 +1820 +1823 +1824 +1823 +1828 +1827 +1824 +1847 +1842 +1846 +1847 +1844 +1833 +1826 +1834 +1839 +1846 +1854 +1842 +1845 +1860 +1874 +1869 +1871 +1869 +1870 +1874 +1875 +1891 +1893 +1894 +1886 +1885 +1853 +1871 +1868 +1866 +1875 +1885 +1882 +1883 +1879 +1884 +1893 +1918 +1919 +1932 +1933 +1930 +1949 +1952 +1949 +1945 +1944 +1930 +1950 +1952 +1951 +1981 +1980 +1992 +1993 +1981 +1979 +2007 +1989 +1987 +1996 +2006 +2012 +2028 +2037 +2041 +2039 +2046 +2047 +2055 +2058 +2079 +2086 +2087 +2088 +2079 +2080 +2079 +2082 +2089 +2092 +2097 +2113 +2115 +2119 +2109 +2111 +2110 +2108 +2100 +2099 +2107 +2103 +2104 +2115 +2110 +2116 +2117 +2113 +2120 +2128 +2129 +2115 +2114 +2125 +2148 +2145 +2147 +2160 +2159 +2162 +2155 +2161 +2162 +2160 +2162 +2149 +2150 +2152 +2170 +2171 +2172 +2171 +2186 +2187 +2186 +2188 +2196 +2185 +2195 +2196 +2200 +2197 +2195 +2190 +2191 +2189 +2199 +2200 +2208 +2204 +2203 +2209 +2231 +2234 +2247 +2245 +2277 +2279 +2281 +2282 +2279 +2294 +2296 +2304 +2287 +2294 +2293 +2297 +2311 +2339 +2343 +2344 +2323 +2360 +2369 +2371 +2372 +2373 +2372 +2384 +2383 +2390 +2412 +2419 +2421 +2432 +2428 +2427 +2449 +2459 +2456 +2457 +2459 +2469 +2472 +2474 +2472 +2475 +2487 +2479 +2481 +2482 +2481 +2502 +2492 +2493 +2496 +2522 +2529 +2550 +2551 +2549 +2547 +2546 +2551 +2553 +2555 +2552 +2547 +2536 +2534 +2518 +2517 +2513 +2511 +2495 +2508 +2500 +2501 +2514 +2524 +2551 +2552 +2561 +2563 +2571 +2573 +2565 +2559 +2564 +2565 +2568 +2570 +2556 +2546 +2552 +2554 +2581 +2574 +2573 +2572 +2575 +2577 +2578 +2579 +2580 +2579 +2589 +2586 +2587 +2611 +2615 +2614 +2618 +2619 +2618 +2626 +2630 +2623 +2627 +2628 +2627 +2628 +2657 +2658 +2672 +2673 +2685 +2668 +2658 +2660 +2668 +2669 +2671 +2673 +2669 +2668 +2675 +2668 +2669 +2652 +2672 +2675 +2678 +2677 +2699 +2700 +2701 +2712 +2710 +2712 +2711 +2710 +2721 +2722 +2727 +2731 +2733 +2731 +2734 +2738 +2751 +2745 +2744 +2750 +2765 +2767 +2773 +2771 +2770 +2773 +2778 +2782 +2792 +2796 +2794 +2806 +2807 +2820 +2823 +2836 +2834 +2827 +2826 +2830 +2828 +2829 +2831 +2838 +2845 +2846 +2863 +2860 +2862 +2861 +2862 +2863 +2864 +2871 +2873 +2874 +2875 +2893 +2892 +2893 +2898 +2924 +2942 +2956 +2950 +2952 +2990 +2993 +2994 +3001 +3017 +3022 +3017 +3016 +3017 +3012 +3018 +3019 +3018 +3048 +3058 +3059 +3062 +3072 +3073 +3071 +3072 +3065 +3093 +3094 +3095 +3094 +3100 +3101 +3084 +3085 +3079 +3077 +3099 +3100 +3117 +3118 +3121 +3122 +3137 +3108 +3110 +3109 +3108 +3113 +3102 +3103 +3119 +3122 +3126 +3132 +3137 +3132 +3152 +3153 +3163 +3164 +3176 +3175 +3181 +3190 +3191 +3198 +3195 +3177 +3178 +3177 +3183 +3202 +3203 +3192 +3184 +3185 +3191 +3196 +3195 +3173 +3183 +3182 +3184 +3185 +3193 +3210 +3208 +3207 +3214 +3221 +3234 +3233 +3263 +3284 +3283 +3284 +3270 +3259 +3268 +3253 +3259 +3246 +3251 +3246 +3251 +3256 +3249 +3251 +3261 +3260 +3259 +3267 +3277 +3273 +3282 +3286 +3284 +3285 +3288 +3295 +3270 +3269 +3277 +3276 +3281 +3280 +3292 +3293 +3301 +3306 +3335 +3336 +3310 +3309 +3312 +3318 +3324 +3340 +3368 +3371 +3369 +3370 +3368 +3367 +3386 +3388 +3416 +3420 +3423 +3433 +3427 +3438 +3457 +3469 +3474 +3479 +3489 +3507 +3471 +3468 +3480 +3486 +3490 +3493 +3495 +3496 +3495 +3479 +3480 +3485 +3490 +3489 +3491 +3488 +3494 +3493 +3515 +3517 +3526 +3519 +3520 +3525 +3515 +3516 +3517 +3508 +3510 +3512 +3515 +3536 +3535 +3530 +3540 +3542 +3550 +3530 +3550 +3553 +3537 +3536 +3542 +3547 +3544 +3562 +3561 +3551 +3546 +3547 +3562 +3561 +3586 +3593 +3582 +3586 +3589 +3600 +3604 +3605 +3607 +3608 +3613 +3624 +3626 +3652 +3668 +3669 +3666 +3674 +3677 +3668 +3671 +3673 +3675 +3657 +3666 +3655 +3658 +3662 +3659 +3660 +3657 +3655 +3662 +3657 +3660 +3661 +3664 +3675 +3677 +3661 +3663 +3669 +3645 +3646 +3644 +3645 +3666 +3677 +3685 +3686 +3689 +3697 +3694 +3703 +3672 +3676 +3675 +3706 +3726 +3742 +3744 +3765 +3792 +3793 +3802 +3805 +3813 +3816 +3817 +3826 +3827 +3828 +3830 +3826 +3825 +3824 +3816 +3821 +3820 +3821 +3825 +3846 +3848 +3847 +3846 +3849 +3854 +3844 +3860 +3859 +3861 +3863 +3848 +3845 +3846 +3853 +3851 +3850 +3863 +3865 +3885 +3912 +3913 +3914 +3913 +3901 +3897 +3927 +3928 +3927 +3929 +3931 +3925 +3912 +3915 +3919 +3920 +3896 +3900 +3904 +3909 +3919 +3922 +3923 +3925 +3944 +3938 +3937 +3936 +3944 +3943 +3942 +3955 +3944 +3945 +3948 +3946 +3939 +3955 +3957 +3951 +3950 +3954 +3966 +3974 +3987 +3991 +3987 +3985 +3981 +3983 +3986 +3996 +4002 +4012 +4031 +4030 +4031 +4034 +4018 +4020 +4007 +4009 +4019 +4006 +4011 +4018 +4022 +4012 +4014 +4012 +4013 +4031 +4046 +4051 +4054 +4065 +4070 +4074 +4080 +4081 +4080 +4051 +4058 +4056 +4054 +4049 +4054 +4048 +4065 +4078 +4082 +4086 +4099 +4100 +4106 +4126 +4118 +4145 +4141 +4142 +4153 +4168 +4176 +4168 +4167 +4171 +4172 +4173 +4137 +4154 +4150 +4134 +4137 +4138 +4137 +4148 +4151 +4129 +4131 +4130 +4132 +4129 +4155 +4156 +4157 +4162 +4179 +4185 +4187 +4186 +4177 +4167 +4174 +4178 +4176 +4174 +4177 +4180 +4192 +4206 +4212 +4192 +4201 +4193 +4213 +4194 +4201 +4181 +4184 +4181 +4192 +4195 +4205 +4209 +4199 +4201 +4200 +4201 +4219 +4218 +4220 +4221 +4235 +4236 +4229 +4235 +4233 +4234 +4240 +4239 +4211 +4216 +4223 +4210 +4224 +4225 +4223 +4224 +4223 +4233 +4232 +4240 +4248 +4240 +4241 +4246 +4247 +4244 +4245 +4246 +4256 +4261 +4274 +4268 +4288 +4289 +4290 +4301 +4299 +4303 +4304 +4303 +4297 +4299 +4288 +4296 +4293 +4296 +4295 +4302 +4303 +4319 +4313 +4315 +4320 +4322 +4326 +4328 +4337 +4338 +4351 +4370 +4381 +4388 +4413 +4418 +4417 +4416 +4415 +4436 +4440 +4441 +4464 +4461 +4468 +4469 +4471 +4480 +4496 +4495 +4496 +4497 +4494 +4461 +4462 +4461 +4462 +4461 +4457 +4466 +4467 +4468 +4469 +4491 +4497 +4510 +4500 +4485 +4497 +4508 +4506 +4500 +4501 +4514 +4516 +4517 +4516 +4543 +4549 +4529 +4523 +4522 +4540 +4539 +4540 +4543 +4545 +4530 +4532 +4531 +4533 +4535 +4511 +4517 +4520 +4521 +4523 +4517 +4525 +4526 +4538 +4566 +4567 +4564 +4575 +4577 +4576 +4574 +4580 +4594 +4595 +4596 +4621 +4622 +4629 +4632 +4641 +4642 +4658 +4659 +4660 +4685 +4687 +4708 +4727 +4735 +4739 +4745 +4744 +4753 +4755 +4757 +4759 +4782 +4785 +4777 +4783 +4786 +4789 +4794 +4802 +4803 +4833 +4849 +4857 +4865 +4866 +4872 +4869 +4876 +4874 +4877 +4899 +4900 +4901 +4893 +4892 +4904 +4907 +4900 +4907 +4908 +4903 +4890 +4895 +4896 +4876 +4880 +4888 +4889 +4894 +4893 +4924 +4927 +4922 +4893 +4901 +4891 +4908 +4916 +4915 +4920 +4931 +4954 +4943 +4953 +4954 +4959 +4949 +4952 +4936 +4935 +4916 +4922 +4923 +4922 +4928 +4929 +4930 +4927 +4923 +4926 +4924 +4931 +4935 +4955 +4966 +4987 +4988 +4990 +4992 +4991 +4999 +5001 +5006 +5007 +5021 +5034 +5047 +5050 +5055 +5091 +5096 +5101 +5100 +5105 +5108 +5117 +5114 +5127 +5129 +5127 +5153 +5152 +5154 +5155 +5156 +5142 +5154 +5180 +5177 +5183 +5184 +5201 +5204 +5205 +5222 +5212 +5217 +5222 +5251 +5278 +5277 +5302 +5319 +5326 +5333 +5327 +5321 +5337 +5361 +5362 +5368 +5369 +5366 +5368 +5385 +5383 +5384 +5393 +5403 +5427 +5428 +5429 +5428 +5459 +5442 +5441 +5433 +5436 +5428 +5429 +5428 +5427 +5433 +5418 +5419 +5421 +5425 +5426 +5435 +5441 +5445 +5442 +5446 +5454 +5458 +5454 +5456 +5452 +5423 +5426 +5425 +5418 +5417 +5420 +5425 +5420 +5438 +5447 +5450 +5451 +5453 +5450 +5453 +5449 +5457 +5464 +5455 +5460 +5443 +5439 +5425 +5423 +5434 +5438 +5437 +5412 +5408 +5405 +5407 +5420 +5426 +5452 +5459 +5460 +5490 +5498 +5508 +5528 +5531 +5516 +5517 +5512 +5524 +5529 +5511 +5525 +5527 +5538 +5539 +5546 +5550 +5549 +5552 +5554 +5559 +5551 +5552 +5556 +5559 +5579 +5584 +5590 +5593 +5592 +5595 +5604 +5600 +5586 +5591 +5572 +5571 +5583 +5584 +5578 +5579 +5580 +5579 +5570 +5571 +5574 +5577 +5583 +5584 +5569 +5586 +5582 +5561 +5550 +5554 +5544 +5550 +5529 +5538 +5551 +5569 +5570 +5584 +5588 +5596 \ No newline at end of file diff --git a/examples/aoc-2021/advent-day02.lox b/examples/aoc-2021/advent-day02.lox new file mode 100644 index 0000000..783a145 --- /dev/null +++ b/examples/aoc-2021/advent-day02.lox @@ -0,0 +1,95 @@ +class Submarine { + init() { + this.depth = 0; + this.horizontal = 0; + } + + forward(n) { + this.horizontal = this.horizontal + n; + return this; + } + + down(n) { + this.depth = this.depth + n; + return this; + } + + up(n) { + this.depth = this.depth - n; + return this; + } + + toString() { + return "Submarine(" + this.horizontal + ", " + this.depth + ")"; + } +} + +class SubmarineWithAim < Submarine { + init() { + super.init(); + this.aim = 0; + } + + forward(n) { + this.horizontal = this.horizontal + n; + this.depth = this.depth + this.aim * n; + return this; + } + + down(n) { + this.aim = this.aim + n; + return this; + } + + up(n) { + this.aim = this.aim - n; + return this; + } + + toString() { + return "Submarine(" + this.horizontal + ", " + this.depth + ", " + this.aim + ")"; + } +} + +fun example(submarine) { + submarine + .forward(5) + .down(5) + .forward(8) + .up(3) + .down(8) + .forward(2); + + return submarine.depth * submarine.horizontal; +} + + +fun parse(file) { + var commands = ArrayList(); + var input = LineReader(BufferedInputStream(FileInputStream(file))); + + var line; + while (line = input.readLine()!?) { + var (direction, value) = String.split(line, " "); + commands.add(Pair(direction, String.toNumber(value)!?)); + } + + return Ok(commands); +} + +fun compute(commands, submarine) { + for (var (direction, value) in commands) { + if (direction == "forward") submarine.forward(value); + if (direction == "up") submarine.up(value); + if (direction == "down") submarine.down(value); + } + + return submarine.depth * submarine.horizontal; +} + +var input = parse(File("examples/aoc-2021/advent-day02.txt")).orFail(); + +print example(Submarine()); // expect: 150 +print compute(input, Submarine()); // expect: 1480518 +print example(SubmarineWithAim()); // expect: 150 +print compute(input, SubmarineWithAim()); // expect: 1282809906 diff --git a/examples/aoc-2021/advent-day02.txt b/examples/aoc-2021/advent-day02.txt new file mode 100644 index 0000000..9e714f9 --- /dev/null +++ b/examples/aoc-2021/advent-day02.txt @@ -0,0 +1,1000 @@ +forward 2 +down 8 +down 1 +up 7 +forward 4 +down 4 +down 3 +forward 2 +forward 5 +forward 2 +forward 7 +forward 8 +down 7 +forward 6 +forward 1 +down 8 +down 8 +up 9 +down 9 +forward 1 +up 1 +forward 6 +forward 7 +down 7 +forward 4 +forward 2 +forward 1 +forward 3 +forward 8 +forward 4 +up 6 +down 2 +forward 4 +down 3 +up 3 +up 2 +up 3 +forward 8 +down 5 +down 8 +down 5 +down 4 +down 2 +up 1 +forward 6 +forward 6 +forward 8 +up 5 +down 5 +forward 8 +forward 7 +down 9 +down 7 +down 6 +down 3 +forward 3 +up 7 +forward 2 +up 6 +forward 7 +forward 9 +down 9 +forward 3 +down 2 +down 2 +down 7 +down 7 +forward 8 +down 7 +forward 9 +up 7 +down 4 +down 8 +forward 2 +forward 2 +up 1 +forward 8 +down 5 +forward 8 +forward 4 +up 1 +forward 2 +forward 2 +forward 2 +down 9 +down 7 +down 9 +forward 9 +forward 4 +up 7 +down 4 +forward 9 +forward 8 +up 5 +up 1 +down 1 +down 9 +down 6 +up 8 +forward 2 +forward 7 +up 7 +forward 7 +forward 6 +down 6 +forward 8 +up 6 +forward 7 +down 7 +forward 4 +forward 9 +up 9 +up 8 +forward 8 +forward 3 +up 1 +up 4 +down 4 +up 9 +up 8 +forward 6 +down 2 +down 2 +up 4 +forward 4 +forward 1 +down 8 +forward 6 +down 5 +forward 6 +down 8 +up 1 +forward 1 +up 9 +down 8 +up 3 +up 9 +forward 9 +forward 2 +down 2 +up 6 +up 6 +forward 8 +up 3 +down 3 +forward 5 +up 2 +forward 1 +forward 1 +forward 8 +down 4 +forward 8 +forward 7 +down 8 +forward 7 +down 7 +down 2 +down 1 +down 7 +up 9 +down 5 +up 1 +forward 7 +down 5 +down 9 +down 2 +down 8 +down 4 +forward 2 +forward 2 +forward 1 +down 6 +up 7 +forward 2 +down 1 +down 5 +forward 3 +forward 8 +down 4 +up 2 +up 9 +up 7 +forward 7 +forward 4 +up 8 +up 3 +up 4 +forward 6 +down 7 +forward 7 +up 6 +down 9 +up 6 +forward 4 +up 3 +down 3 +up 6 +down 9 +down 6 +forward 7 +forward 9 +forward 2 +down 6 +up 3 +up 9 +forward 9 +forward 8 +up 4 +up 5 +forward 6 +down 5 +up 4 +up 9 +down 8 +forward 5 +up 5 +forward 7 +forward 6 +down 8 +down 5 +down 2 +up 5 +down 8 +forward 7 +forward 7 +up 6 +forward 3 +down 8 +forward 5 +forward 8 +down 7 +forward 6 +down 2 +forward 2 +forward 8 +down 4 +forward 5 +forward 7 +forward 5 +forward 8 +forward 9 +forward 6 +down 6 +up 7 +down 9 +forward 7 +forward 1 +up 2 +forward 8 +down 1 +up 9 +forward 7 +down 2 +up 2 +forward 5 +down 4 +down 3 +up 8 +up 6 +forward 3 +up 4 +forward 3 +forward 1 +forward 1 +up 9 +down 2 +down 9 +up 4 +forward 4 +forward 4 +forward 2 +forward 5 +forward 9 +forward 7 +up 4 +up 5 +down 5 +forward 9 +down 1 +forward 2 +down 6 +forward 9 +down 4 +down 2 +forward 2 +up 7 +forward 7 +forward 8 +up 9 +forward 3 +up 1 +down 5 +forward 5 +down 1 +up 5 +forward 4 +forward 5 +up 3 +down 4 +up 6 +up 1 +down 2 +forward 6 +down 8 +up 9 +down 7 +forward 9 +down 8 +forward 3 +forward 8 +down 1 +down 7 +forward 6 +up 6 +down 1 +down 5 +forward 6 +down 7 +down 2 +forward 6 +forward 2 +forward 8 +forward 7 +forward 2 +down 7 +up 2 +down 7 +forward 8 +forward 8 +forward 2 +forward 4 +down 1 +down 6 +down 1 +down 4 +down 4 +down 2 +down 7 +up 5 +up 5 +down 1 +forward 3 +up 1 +down 3 +forward 9 +forward 4 +forward 7 +down 4 +down 4 +down 2 +forward 2 +forward 1 +forward 9 +down 1 +down 4 +down 1 +forward 4 +up 8 +forward 3 +down 6 +forward 5 +forward 9 +forward 1 +up 8 +down 7 +down 8 +forward 4 +down 4 +up 5 +down 3 +forward 3 +down 6 +down 1 +down 9 +forward 8 +up 5 +down 7 +up 7 +forward 3 +up 5 +up 7 +down 4 +up 2 +down 2 +down 8 +up 6 +down 4 +up 1 +down 8 +down 4 +forward 7 +down 4 +up 3 +down 9 +forward 3 +up 4 +up 1 +up 5 +down 4 +forward 4 +forward 4 +down 2 +down 3 +down 4 +forward 2 +down 9 +down 9 +down 6 +forward 5 +forward 7 +down 3 +forward 2 +up 8 +down 6 +down 8 +down 2 +up 9 +down 1 +forward 8 +forward 1 +forward 8 +up 4 +up 1 +down 8 +up 2 +forward 5 +down 3 +forward 5 +forward 4 +forward 1 +down 9 +forward 2 +forward 5 +forward 4 +forward 3 +down 7 +up 9 +forward 7 +up 8 +forward 3 +forward 3 +down 5 +forward 7 +forward 5 +down 4 +forward 6 +down 6 +up 3 +down 3 +forward 7 +forward 8 +up 3 +up 8 +forward 8 +up 4 +forward 5 +up 4 +down 7 +forward 4 +down 8 +down 6 +forward 7 +down 4 +up 7 +down 6 +up 5 +down 2 +forward 7 +down 7 +up 3 +up 3 +down 3 +down 5 +forward 3 +forward 5 +forward 8 +down 3 +down 8 +forward 3 +down 1 +forward 4 +up 5 +forward 8 +up 1 +up 4 +down 4 +forward 1 +forward 6 +up 7 +up 1 +up 7 +down 5 +forward 8 +down 1 +forward 1 +forward 6 +up 9 +up 6 +down 4 +forward 5 +down 1 +forward 7 +down 8 +up 3 +down 9 +down 1 +up 7 +up 6 +forward 8 +down 9 +down 4 +forward 4 +up 7 +down 3 +forward 5 +forward 8 +up 5 +down 7 +up 2 +forward 3 +forward 3 +forward 4 +down 1 +forward 5 +forward 7 +up 7 +forward 7 +forward 1 +forward 3 +forward 9 +down 3 +forward 5 +down 9 +down 7 +down 4 +down 8 +up 3 +down 1 +up 5 +down 5 +forward 2 +down 6 +down 5 +forward 2 +forward 6 +down 6 +up 6 +down 8 +up 1 +forward 4 +forward 2 +forward 1 +up 1 +forward 5 +forward 3 +forward 7 +down 9 +forward 3 +down 9 +up 5 +down 7 +down 2 +down 3 +up 5 +up 3 +down 2 +forward 4 +forward 1 +down 3 +up 4 +down 8 +down 1 +forward 6 +down 3 +forward 9 +down 7 +down 3 +down 4 +down 5 +up 1 +forward 8 +forward 2 +up 3 +up 7 +up 1 +forward 3 +forward 9 +up 5 +forward 6 +down 8 +down 9 +down 5 +forward 6 +forward 3 +forward 8 +forward 7 +forward 9 +forward 2 +up 9 +forward 8 +down 2 +down 6 +down 9 +down 5 +forward 1 +down 7 +forward 2 +down 4 +down 1 +up 1 +down 2 +forward 5 +forward 8 +down 9 +up 6 +forward 8 +forward 3 +up 6 +up 2 +forward 8 +down 8 +up 1 +down 6 +down 2 +down 6 +forward 5 +forward 6 +down 4 +forward 1 +down 4 +up 7 +forward 4 +up 1 +forward 9 +forward 7 +up 3 +down 7 +down 4 +forward 3 +forward 8 +forward 6 +forward 6 +up 1 +up 2 +up 8 +down 7 +forward 8 +down 5 +forward 6 +down 1 +down 9 +down 2 +forward 6 +up 3 +down 5 +down 6 +forward 1 +forward 2 +down 3 +forward 8 +forward 1 +up 5 +down 8 +down 4 +up 9 +up 2 +forward 7 +forward 9 +up 8 +up 6 +forward 1 +down 7 +up 1 +down 3 +forward 2 +forward 3 +down 3 +down 2 +forward 3 +down 7 +forward 3 +forward 7 +forward 7 +down 8 +down 4 +forward 3 +forward 4 +down 7 +down 9 +down 4 +down 2 +forward 7 +up 8 +down 4 +down 3 +forward 9 +down 5 +up 6 +up 2 +down 5 +down 6 +forward 2 +forward 8 +down 1 +forward 6 +up 7 +down 6 +forward 4 +down 2 +down 5 +down 9 +forward 7 +up 4 +forward 9 +up 7 +down 4 +down 6 +up 9 +forward 1 +up 7 +down 5 +forward 3 +forward 3 +down 7 +down 1 +down 7 +down 7 +down 1 +forward 8 +forward 9 +forward 8 +down 9 +down 8 +down 5 +down 3 +forward 4 +forward 1 +down 1 +forward 1 +down 7 +forward 7 +forward 3 +down 8 +forward 3 +forward 9 +forward 8 +down 7 +forward 8 +down 2 +up 5 +forward 7 +forward 4 +down 2 +up 6 +up 8 +forward 7 +down 9 +up 3 +forward 4 +up 9 +up 5 +up 5 +up 6 +down 4 +down 5 +up 5 +forward 7 +forward 6 +down 4 +forward 5 +forward 4 +up 7 +forward 8 +down 2 +forward 1 +down 9 +down 8 +forward 7 +down 7 +down 1 +forward 9 +down 7 +forward 6 +down 2 +up 9 +forward 1 +up 9 +down 3 +up 9 +down 1 +forward 1 +down 1 +up 6 +down 8 +up 2 +down 3 +forward 1 +down 4 +up 5 +down 5 +down 4 +forward 5 +forward 4 +down 9 +up 7 +down 7 +forward 7 +forward 6 +forward 8 +down 8 +forward 8 +down 1 +down 1 +down 8 +down 2 +up 2 +up 1 +forward 5 +down 1 +up 5 +up 2 +down 6 +up 8 +forward 5 +down 8 +down 1 +up 5 +down 1 +forward 4 +down 6 +down 4 +forward 2 +forward 2 +down 1 +up 4 +up 8 +down 6 +down 2 +forward 5 +forward 8 +forward 7 +down 5 +down 7 +down 3 +forward 6 +down 3 +down 3 +forward 6 +forward 6 +forward 6 +up 7 +forward 1 +down 5 +down 2 +up 8 +forward 6 +down 7 +down 6 +forward 1 +up 5 +down 4 +up 9 +forward 3 +up 3 +forward 9 +forward 9 +forward 7 +forward 5 +down 9 +forward 1 +forward 6 +up 8 +down 7 +forward 9 +forward 5 +up 4 +down 8 +forward 8 +forward 4 +down 9 +up 2 +forward 5 +forward 8 +down 8 +down 9 +down 9 +forward 4 +forward 8 +down 5 +down 5 +forward 5 +forward 5 +up 9 +up 7 +forward 3 +up 4 +down 8 +up 6 +up 6 +down 4 +down 3 +forward 2 +forward 9 +down 4 +down 2 +forward 4 +up 9 +forward 1 +down 8 +down 9 +down 9 +down 3 +forward 1 +down 5 +up 9 +forward 6 +up 4 +forward 2 +forward 2 +forward 4 +down 9 +up 5 +up 1 +down 6 +forward 7 +down 8 +forward 4 +forward 9 +up 9 +up 4 +down 5 +down 3 +forward 2 +down 8 +down 6 +forward 3 +down 2 +forward 6 +up 2 +forward 6 +down 7 +up 4 +forward 1 +forward 4 +up 4 +forward 6 +forward 8 +down 7 +down 6 +up 7 +down 2 +down 4 +down 5 +forward 1 +up 4 +forward 8 +forward 6 +down 8 +up 5 +up 2 +up 9 +up 5 +forward 6 +down 4 +up 3 +down 8 +down 6 +down 2 +up 3 +up 5 +down 1 +forward 9 +up 8 +up 2 +down 3 +forward 6 +down 1 +forward 5 +down 3 +up 1 +up 2 +down 5 +down 7 +forward 8 +down 8 +up 9 +forward 3 +down 8 +down 8 +forward 1 +down 4 +down 4 +forward 3 +up 6 +down 3 +down 7 +down 7 +up 1 +forward 3 +forward 2 diff --git a/examples/aoc-2021/advent-day03.lox b/examples/aoc-2021/advent-day03.lox new file mode 100644 index 0000000..2a871c6 --- /dev/null +++ b/examples/aoc-2021/advent-day03.lox @@ -0,0 +1,76 @@ +var example = [ + "00100", + "11110", + "10110", + "10111", + "10101", + "01111", + "00111", + "11100", + "10000", + "11001", + "00010", + "01010", +].toList(); + +fun part1(input) { + var numberOfBits = String.length(input[0]); + input = input.map(fun(string) = Number.parseBinaryString(string).orNil()); + var result = Array(numberOfBits); + result.fill(0); + for (var i = 0; i < input.length(); i++) { + for (var j = 0; j < numberOfBits; j++) { + result[numberOfBits - j - 1] = result[numberOfBits - j - 1] + ((input[i] >> j) & 1); + } + } + + var gamma = result.map(fun(x) { + if (x > input.length() / 2) return 1; else return 0; + }).reduce("", fun (a, b) = a + b); + + var epsilon = result.map(fun(x) { + if (x < input.length() / 2) return 1; else return 0; + }).reduce("", fun (a, b) = a + b); + + return Number.parseBinaryString(gamma)!? * Number.parseBinaryString(epsilon)!?; +} + + +fun parse(file) { + var commands = ArrayList(); + var input = LineReader(BufferedInputStream(FileInputStream(file))); + + var line; + while (line = input.readLine()!?) { + commands.add(line); + } + + return Ok(commands); +} + +fun part2(input) { + var numberOfBits = String.length(input[0]); + fun find(mostFrequent) { + var copy = input.copy(); + for (var i = 0; i < numberOfBits; i++) { + var zeros = copy.count(fun (row) = String.charAt(row, i).orNil() == "0"); + var ones = copy.length() - zeros; + var toKeep; + if (zeros <= ones) { + if (mostFrequent) toKeep = "1"; else toKeep = "0"; + } else { + if (mostFrequent) toKeep = "0"; else toKeep = "1"; + } + copy.removeIf(fun (row) = String.charAt(row, i).orNil() != toKeep); + if (copy.length() == 1) return Number.parseBinaryString(copy.first())!?; + } + } + + return find(true) * find(false); +} + +var input = parse(File("examples/aoc-2021/advent-day03.txt")).orFail(); +print part1(example); // expect: 198 +print part1(input); // expect: 1025636 +print part2(example); // expect: 230 +print part2(input); // expect: 793873 diff --git a/examples/aoc-2021/advent-day03.txt b/examples/aoc-2021/advent-day03.txt new file mode 100644 index 0000000..99c0fc4 --- /dev/null +++ b/examples/aoc-2021/advent-day03.txt @@ -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/examples/aoc-2021/advent-day04.example.txt b/examples/aoc-2021/advent-day04.example.txt new file mode 100644 index 0000000..49d17bc --- /dev/null +++ b/examples/aoc-2021/advent-day04.example.txt @@ -0,0 +1,19 @@ +7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1 + +22 13 17 11 0 + 8 2 23 4 24 +21 9 14 16 7 + 6 10 3 18 5 + 1 12 20 15 19 + + 3 15 0 2 22 + 9 18 13 17 5 +19 8 7 25 23 +20 11 10 24 4 +14 21 16 12 6 + +14 21 17 24 4 +10 16 15 9 19 +18 8 23 26 20 +22 11 13 6 5 + 2 0 12 3 7 \ No newline at end of file diff --git a/examples/aoc-2021/advent-day04.lox b/examples/aoc-2021/advent-day04.lox new file mode 100644 index 0000000..ec720ca --- /dev/null +++ b/examples/aoc-2021/advent-day04.lox @@ -0,0 +1,162 @@ +class Board { + init(size) { + this.board = Array(size); + for (var x in 0..(size - 1)) { + this.board.set(x, Row(size)); + } + } + + set(row, col, value) { + this.board.get(row).set(col, value); + return this; + } + + mark(number) { + this.lastNumber = number; + for (var row in this.board) { + row.mark(number); + } + } + + row(n) = this.board.get(n); + + column(n) { + var col = Column(this.board.length()); + for (var (i, row) in this.board.withIndex()) { + col[i] = row[n]; + } + return col; + } + + sum { + return this.board.reduce(0, fun(x, row) = x + row.sum); + } + + isWon { + for (var row in this.board) { + if (row.isComplete) { + return true; + } + } + for (var col in 0..(this.board.length()-1)) { + if (this.column(col).isComplete) { + return true; + } + } + return false; + } + + toString() { + var s = ""; + for (var row in this.board) { + for (var cell in row) { + s = s + cell + " "; + } + s = s + "\n"; + } + return s; + } +} + +class BoardRowColumn < Array { + isComplete { + return this.reduce(this.get(0).isMarked, fun(a, b) = a and b.isMarked); + } + + mark(number) { + this.filter(fun(cell) = cell.value == number).forEach(fun(cell) = cell.isMarked = true); + } + + sum { + return this.filterNot(fun(cell) = cell.isMarked).reduce(0, fun(sum, cell) = sum + cell.value); + } +} + +class Row < BoardRowColumn +class Column < BoardRowColumn + +class Cell { + init(value) { + this.value = value; + this.isMarked = false; + } + + mark() { + this.isMarked = true; + } + + toString() { + var s = ""; + if (this.isMarked) s = s + "["; + else s = s + " "; + if (this.value < 10) s = s + " "; + s = s + this.value; + if (this.isMarked) s = s + "]"; + else s = s + " "; + return s; + } +} + +fun parse(file) { + var boardSize = 5; + var lineReader = LineReader(FileInputStream(File(file))); + + var numbers = String.split(lineReader.readLine()!?, ",").map(fun (s) = String.toNumber(s)!?); + + var line; + var boards = ArrayList(); + var board; + var row = 0; + while (line = lineReader.readLine()!?) { + if (String.length(line) == 0) { + if (board != nil) boards.add(board); + board = Board(boardSize); + row = 0; + continue; + } + var parts = String.split(line, " ").map(fun (x) = String.toNumber(x)!?); + for (var (col, value) in parts.withIndex()) { + board.set(row, col, Cell(value)); + } + row++; + } + + boards.add(board); + + return Ok(Pair(numbers, boards)); +} + + +fun part1(numbers, boards) { + for (var number in numbers) { + for (var board in boards) { + board.mark(number); + if (PRINT) print board; + if (board.isWon) return number * board.sum; + } + } +} + +fun part2(numbers, boards) { + var won = ArrayList(); + for (var number in numbers) { + for (var board in boards) { + board.mark(number); + if (board.isWon) { + if (PRINT) print board; + if (!won.contains(board)) won.add(board); + if (won.length() == boards.length()) { + return won.last().sum * won.last().lastNumber; + } + } + } + } +} + +var PRINT = System.arg(0) == "--printboards"; +var (numbers, boards) = parse("examples/aoc-2021/advent-day04.example.txt").orFail(); +print part1(numbers, boards); // expect: 4512 +print part2(numbers, boards); // expect: 1924 +var (numbers, boards) = parse("examples/aoc-2021/advent-day04.txt").orFail(); +print part1(numbers, boards); // expect: 71708 +print part2(numbers, boards); // expect: 34726 diff --git a/examples/aoc-2021/advent-day04.txt b/examples/aoc-2021/advent-day04.txt new file mode 100644 index 0000000..1c64115 --- /dev/null +++ b/examples/aoc-2021/advent-day04.txt @@ -0,0 +1,601 @@ +6,69,28,50,36,84,49,13,48,90,1,33,71,0,94,59,53,58,60,96,30,34,29,91,11,41,77,95,17,80,85,93,7,9,74,89,18,25,26,8,87,38,68,5,12,43,27,46,62,73,16,55,22,4,65,76,54,52,83,10,21,67,15,47,45,40,35,66,79,51,75,39,64,24,37,72,3,44,82,32,78,63,57,2,86,31,19,92,14,97,20,56,88,81,70,61,42,99,23,98 + +22 59 7 10 6 +33 36 96 55 23 +13 85 18 29 28 +75 46 83 73 58 +34 40 87 56 98 + +73 96 47 14 10 +28 11 79 84 20 +74 30 0 59 71 +80 93 42 22 17 +44 2 81 29 15 + +73 32 37 93 39 + 2 87 38 99 97 +15 12 42 49 33 + 9 23 25 94 19 +57 4 18 70 79 + +43 79 59 71 78 +51 97 37 28 26 +46 21 84 8 86 +96 30 17 34 49 +55 90 99 75 61 + +43 86 35 51 24 +16 25 29 21 3 + 2 13 4 36 54 +89 27 8 85 34 +96 59 65 14 56 + + 5 57 43 4 1 +86 80 67 30 20 +22 16 99 0 14 +40 25 59 91 54 +82 95 96 37 24 + +97 20 87 66 21 +25 40 9 78 89 +52 75 95 63 62 +32 43 13 47 69 +53 48 56 29 4 + +24 4 65 12 8 +76 3 81 99 49 +45 33 31 66 34 +17 94 75 35 88 +64 10 7 93 95 + +88 20 99 15 83 +81 40 5 6 98 +49 74 18 27 9 +43 69 28 37 71 +87 82 90 14 47 + +21 97 92 42 60 +11 65 98 95 29 + 2 49 75 20 74 +56 40 78 66 81 +68 4 46 77 61 + +26 14 39 76 11 +41 74 34 91 4 +51 9 97 29 75 +83 86 23 35 77 +90 2 49 30 89 + +34 97 0 22 15 +65 60 82 66 47 +30 9 49 95 48 +54 73 67 17 78 +33 96 44 1 32 + +90 29 10 49 63 + 8 26 95 61 0 +54 13 51 12 44 +32 48 16 47 84 +55 46 93 14 3 + +68 55 46 16 54 +97 59 49 6 21 +52 32 15 96 70 +57 56 61 51 0 +40 31 62 24 48 + +75 56 70 42 14 +77 9 23 62 25 +29 27 54 17 2 +55 72 43 15 96 +45 30 88 86 1 + +65 12 22 6 51 +77 81 15 91 19 +80 71 27 89 52 +75 92 41 83 57 +40 44 66 84 98 + +89 80 73 59 18 +74 55 67 71 10 +78 27 37 57 3 +92 26 17 5 72 +52 83 28 76 51 + +64 0 87 4 13 +14 43 42 62 31 +17 84 72 91 83 +53 80 59 61 74 +47 22 38 28 77 + +65 49 91 94 19 +25 81 64 57 9 +50 95 82 12 66 +53 54 85 36 11 +31 56 83 18 60 + + 6 12 76 37 33 +14 96 16 31 40 +17 82 27 94 83 + 1 50 49 9 54 +29 70 59 91 77 + +85 0 33 41 16 + 7 86 80 53 65 +94 19 28 35 32 + 4 55 93 97 63 +83 22 67 56 36 + +28 70 65 17 19 +88 51 15 73 12 +11 49 80 23 42 +26 54 90 75 29 +74 77 91 86 66 + +88 22 83 10 43 +57 34 15 23 8 +94 42 68 67 37 +84 3 6 71 62 +89 45 72 55 38 + +68 27 93 7 15 +85 96 1 56 6 +32 2 30 55 17 +99 90 37 80 50 +77 78 58 98 57 + + 5 95 22 13 97 +19 2 52 92 20 +75 49 86 31 41 +51 63 56 33 10 +82 27 79 94 57 + +15 44 91 26 4 +41 78 53 95 86 +90 92 46 56 33 +80 93 68 66 70 +36 10 38 0 6 + +11 47 52 64 17 +16 60 39 55 78 +46 18 33 83 35 +13 92 4 23 50 +40 5 29 6 90 + +20 60 2 23 74 +43 39 91 75 12 +58 67 50 29 79 +10 40 92 95 25 +13 24 53 72 36 + +69 64 15 53 86 +61 11 48 71 27 +26 93 38 70 73 +96 29 30 98 45 +13 7 31 59 84 + +13 55 50 54 57 +32 24 45 5 77 +82 86 0 4 99 +75 72 14 40 56 +76 94 89 17 30 + +66 71 86 41 0 +80 64 3 29 78 +23 21 42 99 87 +96 60 75 61 49 + 2 83 85 12 1 + +78 96 4 82 6 +73 36 57 99 8 +11 83 15 35 30 +85 87 25 22 66 +32 64 16 50 43 + + 6 39 55 2 4 + 1 61 99 71 80 +46 88 22 31 60 +62 66 37 97 76 +74 34 10 52 24 + +42 38 13 65 12 + 4 39 60 62 21 +81 99 1 69 40 +59 15 11 95 53 +91 78 72 30 73 + +43 68 82 72 2 +34 92 33 97 89 +63 70 9 0 45 +69 10 12 65 21 +40 20 55 57 49 + +41 22 8 16 49 +71 64 19 65 92 +17 10 26 36 29 +30 88 7 54 11 +77 55 70 72 47 + +15 94 90 6 39 +99 55 16 54 91 +18 7 82 44 51 +25 34 83 14 12 +30 2 77 27 66 + +44 50 74 97 58 +87 42 56 92 28 +49 82 52 17 78 +54 89 63 77 27 +83 14 24 16 84 + +47 32 8 55 22 +19 14 24 82 4 +76 73 9 10 64 +40 6 92 67 17 +68 44 43 3 54 + +26 10 9 92 81 +46 98 13 0 14 +68 99 35 18 72 +74 33 22 61 93 +80 38 71 6 75 + +17 23 54 55 22 +10 8 60 76 24 +71 28 16 62 82 +13 12 21 78 39 +26 66 89 64 79 + +72 12 91 79 99 +84 18 37 98 41 +10 71 88 23 24 +11 34 26 83 74 +58 27 77 5 8 + + 9 90 13 0 46 + 6 58 74 92 8 +75 77 56 76 80 +55 60 44 68 91 +67 28 96 66 18 + +14 26 54 21 35 +69 67 16 76 62 +78 45 87 44 94 +27 89 39 85 28 + 3 81 93 64 74 + +10 28 35 84 76 +40 11 95 59 57 +53 4 24 50 45 + 7 43 78 17 81 + 1 74 82 16 27 + + 6 26 72 53 52 +51 91 80 11 18 +20 63 74 25 33 +79 4 8 59 67 + 3 13 55 81 83 + +98 85 27 84 42 +90 15 17 61 34 +40 64 86 96 45 +59 47 53 5 35 +11 7 41 80 13 + +47 48 54 31 76 +99 32 98 20 15 +61 41 30 94 37 +34 59 86 55 45 + 9 83 92 53 3 + + 3 80 24 94 25 +17 23 64 76 71 +20 97 0 56 72 +95 73 28 59 21 +14 81 46 67 88 + + 2 95 5 38 90 +63 62 11 24 34 +19 31 57 84 80 +47 86 36 85 74 +13 39 73 94 42 + +28 6 60 34 15 +63 36 51 30 92 +43 10 7 88 49 +78 76 31 19 66 +22 20 35 45 79 + +19 42 49 57 73 +99 50 97 93 43 +67 52 40 16 33 + 2 55 0 71 46 +21 75 59 66 83 + +19 86 30 25 3 +32 39 65 54 29 +38 6 85 52 13 +43 95 18 44 15 +53 70 16 31 71 + +68 73 74 83 70 +56 15 12 78 4 +43 87 63 90 86 +41 16 23 17 77 +80 14 61 30 50 + +88 28 45 80 65 +64 11 68 33 27 +29 70 44 82 37 +42 66 9 32 87 +10 24 15 3 46 + +99 81 5 62 97 + 4 36 23 38 35 +42 16 37 98 54 +34 41 25 30 48 + 8 60 63 89 72 + +25 33 94 23 14 +45 10 79 30 3 +22 28 95 27 11 +74 13 39 84 83 +72 88 56 53 97 + +31 92 91 84 71 +54 90 89 80 0 +98 96 65 66 68 +35 39 70 11 82 +15 34 42 52 2 + +68 71 86 82 37 +28 48 12 34 54 +62 55 10 25 89 +60 4 50 21 22 + 3 2 18 40 84 + +18 96 95 47 45 +14 51 2 88 43 +94 56 19 15 8 +48 65 62 6 75 +35 28 25 72 30 + +43 85 69 92 26 +61 75 5 73 66 +16 87 4 99 48 +18 19 79 23 83 +37 88 31 38 40 + +23 10 89 84 76 +45 39 62 55 66 +25 73 79 43 60 +12 69 36 93 71 + 9 77 14 58 49 + + 9 24 26 53 79 +99 15 30 50 16 +14 95 12 25 33 +54 40 58 46 66 + 5 23 39 29 48 + +64 67 11 10 92 +59 99 80 97 66 +45 51 88 47 82 +35 27 72 85 16 +54 58 2 1 52 + +10 97 27 54 66 +89 85 39 99 98 + 8 68 95 51 19 + 4 17 79 87 3 +72 43 76 58 33 + +95 72 0 18 17 + 3 42 24 86 34 +52 79 46 58 98 +76 77 78 19 10 +81 61 88 85 54 + +74 70 15 80 72 +77 89 11 19 22 +34 59 56 65 91 +58 6 50 40 16 +93 30 95 26 85 + +47 62 57 6 25 +40 79 22 95 29 +42 11 70 10 92 +60 53 84 96 17 +75 86 74 89 18 + +30 42 4 19 92 +40 58 72 7 70 +17 98 45 76 50 +93 57 65 79 2 +56 94 73 84 62 + +51 0 14 7 53 +63 36 48 81 84 +50 22 11 88 6 +83 99 21 31 91 +86 17 72 42 94 + +83 0 20 26 7 +42 24 37 86 65 +73 82 63 21 27 +30 35 9 47 80 +79 53 3 14 84 + +50 99 83 86 42 +81 36 24 4 76 + 0 71 66 41 57 + 7 54 94 78 97 +12 8 82 45 31 + + 4 91 57 50 37 +22 46 86 24 26 +39 54 48 7 42 + 2 45 95 29 12 +38 25 52 0 72 + +51 94 46 44 62 +95 60 0 48 61 +38 13 85 32 8 +22 56 53 30 80 +43 65 58 68 88 + +49 76 41 43 51 +57 46 45 82 90 +48 33 36 5 23 +81 30 3 61 75 +56 70 29 91 59 + +58 74 50 47 84 + 2 1 62 36 60 +32 16 95 43 27 +79 12 39 56 11 + 9 33 4 25 61 + +23 84 16 51 39 +72 19 53 64 43 + 9 44 10 52 26 +45 68 29 56 74 +62 42 46 95 0 + +16 83 27 85 56 +13 41 49 79 53 +18 63 7 60 3 +45 15 48 69 29 +46 86 35 34 32 + +85 2 96 15 43 +33 30 29 53 98 +21 55 61 73 40 +31 4 66 75 59 +26 32 91 38 80 + +69 81 65 30 77 +82 22 83 0 38 + 2 3 29 47 94 +42 55 9 18 97 +53 45 90 31 44 + +23 86 0 35 84 +27 80 3 64 12 + 1 96 48 93 85 +69 24 61 15 22 +91 72 62 13 76 + +81 51 67 60 16 +65 48 86 39 97 +92 93 49 77 59 +15 94 88 52 19 +80 83 23 61 4 + +47 84 46 79 55 +92 38 65 42 76 + 9 58 26 95 86 +30 49 56 69 59 +94 4 25 89 44 + +73 10 29 0 48 +56 40 19 84 61 +52 31 25 86 21 +79 55 53 51 5 +81 9 35 72 15 + +41 95 30 58 73 +26 80 4 21 96 +61 92 76 93 74 + 2 69 60 8 20 +46 98 70 72 83 + + 1 99 31 4 86 +93 64 8 43 61 +33 36 75 90 50 +52 13 3 42 34 +22 65 60 18 76 + +17 63 6 66 92 +51 67 86 88 18 +82 83 32 74 30 + 5 33 9 28 61 +72 75 25 23 60 + +43 28 40 53 52 +54 12 77 10 83 +21 44 63 0 1 +15 22 33 49 2 +80 41 3 46 55 + + 1 97 75 37 4 +47 33 13 21 40 +27 62 15 90 30 +11 83 63 36 35 + 0 12 60 91 42 + + 0 45 17 88 18 +66 10 63 62 8 +36 5 47 39 67 +21 3 61 29 19 +82 58 33 6 59 + +37 92 69 56 52 +46 66 20 78 13 +83 99 16 31 0 +36 35 2 68 9 +70 82 94 96 29 + +62 65 85 37 3 +74 95 34 96 58 +15 33 49 21 93 +19 83 66 6 25 +81 84 23 0 76 + +95 84 71 92 52 +54 36 66 59 82 + 0 76 32 45 83 +69 27 25 88 38 +81 96 63 4 61 + +73 51 28 48 40 + 3 38 11 14 35 +66 91 86 20 81 +53 39 46 71 1 +97 60 21 93 23 + +92 70 4 60 95 +58 49 20 15 25 +55 68 21 84 80 +56 41 82 23 19 +30 74 65 27 29 + +81 97 68 46 75 +62 73 63 36 41 + 1 5 91 84 37 +45 92 20 49 7 +25 26 3 88 56 + +25 9 94 37 26 +44 58 84 91 38 +39 46 57 98 50 +96 42 73 24 70 +71 32 53 48 13 + +98 72 25 96 77 +80 64 88 53 23 +21 37 45 24 18 +41 86 59 68 5 +76 50 36 26 12 + +77 79 88 74 12 +21 9 85 26 68 +11 62 64 4 5 +47 33 76 63 87 +55 19 2 60 95 + +74 79 30 14 35 +90 52 17 29 63 +18 69 78 34 26 +92 42 85 71 56 +12 2 5 0 98