aoc

My solutions for the Advent of Code
git clone https://git.tronto.net/aoc
Download | Log | Files | Refs | README

commit 284827dec47bbd4debe8a9c0a1d0c8ccb949189e
parent 37888633a8820f4e3166ac5e4b51156a239f3115
Author: Sebastiano Tronto <sebastiano@tronto.net>
Date:   Thu, 26 Jun 2025 09:47:23 +0200

Added 2022, first few problems

Diffstat:
A2022/01/a.rs | 8++++++++
A2022/01/b.rs | 9+++++++++
A2022/01/common.rs | 18++++++++++++++++++
A2022/01/input | 2249+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A2022/01/test | 14++++++++++++++
A2022/02/a.rs | 13+++++++++++++
A2022/02/b.rs | 13+++++++++++++
A2022/02/common.rs | 10++++++++++
A2022/02/input | 2500+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A2022/02/test | 3+++
A2022/03/a.rs | 26++++++++++++++++++++++++++
A2022/03/b.rs | 29+++++++++++++++++++++++++++++
A2022/03/common.rs | 7+++++++
A2022/03/input | 300+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A2022/03/test | 6++++++
A2022/04/a.rs | 7+++++++
A2022/04/b.rs | 8++++++++
A2022/04/common.rs | 20++++++++++++++++++++
A2022/04/input | 1000+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A2022/04/test | 6++++++
A2022/05/a.rs | 17+++++++++++++++++
A2022/05/b.rs | 20++++++++++++++++++++
A2022/05/common.rs | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A2022/05/input | 511+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A2022/05/test | 9+++++++++
A2022/06/a.rs | 9+++++++++
A2022/06/b.rs | 9+++++++++
A2022/06/common.rs | 20++++++++++++++++++++
A2022/06/input | 1+
A2022/06/test | 1+
A2022/07/a.rs | 12++++++++++++
A2022/07/b.rs | 13+++++++++++++
A2022/07/common.rs | 130+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A2022/07/input | 986+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A2022/07/test | 23+++++++++++++++++++++++
A2022/08/a.rs | 42++++++++++++++++++++++++++++++++++++++++++
A2022/08/b.rs | 47+++++++++++++++++++++++++++++++++++++++++++++++
A2022/08/common.rs | 13+++++++++++++
A2022/08/input | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A2022/08/test | 5+++++
A2022/09/a.rs | 6++++++
A2022/09/b.rs | 6++++++
A2022/09/common.rs | 46++++++++++++++++++++++++++++++++++++++++++++++
A2022/09/input | 2000+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A2022/09/test | 8++++++++
A2022/09/test2 | 8++++++++
A2022/README.md | 12++++++++++++
A2022/run.sh | 12++++++++++++
48 files changed, 10384 insertions(+), 0 deletions(-)

diff --git a/2022/01/a.rs b/2022/01/a.rs @@ -0,0 +1,8 @@ +mod common; +use common::*; + +fn main() { + let e = get_elves_from_stdin(); + let m: i64 = e.iter().map(|a| a.iter().sum()).max().unwrap(); + println!("{m}"); +} diff --git a/2022/01/b.rs b/2022/01/b.rs @@ -0,0 +1,9 @@ +mod common; +use common::*; + +fn main() { + let e = get_elves_from_stdin(); + let mut w = e.iter().map(|a| a.iter().sum()).collect::<Vec<i64>>(); + w.sort_by(|a, b| b.cmp(a)); + println!("{}", w[0] + w[1] + w[2]); +} diff --git a/2022/01/common.rs b/2022/01/common.rs @@ -0,0 +1,18 @@ +pub fn get_elves_from_stdin() -> Vec<Vec<i64>> { + let mut e = Vec::<Vec::<i64>>::new(); + e.push(Vec::<i64>::new()); + let mut line = String::new(); + loop { + match std::io::stdin().read_line(&mut line).unwrap() { + 0 => break, + 1 => e.push(Vec::<i64>::new()), + _ => { + let n = line.trim().parse::<i64>().unwrap(); + let last = e.len() - 1; + e[last].push(n); + } + } + line.clear(); + } + e +} diff --git a/2022/01/input b/2022/01/input @@ -0,0 +1,2249 @@ +4887 +9307 +8895 +8136 +6292 +10177 +4077 +8228 + +5533 +7981 +5396 +4909 +5657 +7587 +9651 +1583 +8058 + +5201 +4782 +5956 +5327 +2029 +3455 +6148 +5468 +2177 +5352 +5373 +5442 +4888 + +36630 +9196 + +28629 + +9252 +1098 +9842 +7347 +3616 +5157 +8546 + +8031 +7718 +6690 +7819 +10921 +12059 +10334 + +3455 +1687 +3740 +2666 +6672 +3264 +4330 +4673 +5550 +1754 +4161 +2764 +6355 + +2711 +3232 +1429 +2381 +5990 +4482 +3091 +2745 +1886 +5648 +4776 +2696 +2846 +4177 +5781 + +6379 +12826 +3706 +12650 +5875 +11396 + +10381 +2204 +5950 +11465 +11501 +13306 + +4006 +6635 +5139 +5290 +4562 +5558 +2788 +1242 +5308 +6704 +6858 +3751 + +3574 +5601 +4492 +4795 +2135 +3295 +6150 +4786 +6761 +5098 +6646 +5839 +1989 + +14468 +13500 +11544 +2195 +6282 + +1400 +3519 +6010 +4063 +4077 +1583 +2044 +5089 +3588 +6061 +1634 +1358 +2241 +2351 +6075 + +2658 +5979 +4727 +4991 +2198 +4491 +2206 +2601 +3637 +1955 +1618 +5849 +4662 +2457 +2479 + +7450 +2813 +1678 +5678 +6688 +3338 +3708 +4898 +4542 +4800 +3127 +3338 + +2747 +6148 +6301 +6097 +6988 +2280 +4093 +8031 +4865 +7293 +1528 + +7851 +3366 +10761 +12012 + +7487 +1457 +3109 +7722 +6730 +1528 +8678 +5243 +3434 +7351 + +7661 +2803 +7796 +7485 +6268 +7251 +7346 +8521 +5165 +8506 + +6788 +10715 +3520 +6591 +5738 +7419 + +37041 +22858 + +18343 +19902 +15427 + +13379 +7285 +11836 +9418 +9597 + +2796 +3345 +2704 +5395 +5386 +2687 +4133 +1749 +5117 +3822 +4244 +6093 +3108 +2015 +1322 + +3640 +6611 +5160 +6176 +4105 +3796 +4651 +6634 +3804 +3308 +3206 +6686 +3122 + +15465 +12326 +11646 +3744 +2857 + +2724 +3037 +3333 +6247 +9610 +7087 +2883 +6291 +6549 + +2860 +4870 +8726 +4865 +7283 +6364 +4892 +8653 +1937 +1356 + +6900 +4695 +4167 +6336 +1515 +3047 +6735 +4487 +1255 +3833 +3786 +1489 +5117 + +8133 +11386 +1756 +2859 +7861 +4284 +9113 + +2766 +8069 +1212 +2325 +6421 +7231 +6566 +1833 +2677 +3622 +6814 + +7498 +5282 +7407 +3241 +5596 +3862 +7268 + +12142 +3155 +7969 +6330 +10030 + +2534 +2657 +3129 +1604 +5325 +6252 +1007 +4982 +4123 +6270 +2391 + +9554 +15638 +14218 +15314 + +17850 + +4336 +7216 +8068 +2602 +7176 +5411 +1504 +7965 +5582 + +1910 +10293 +9366 +1653 +7607 +1238 +6089 +9832 + +8438 +18781 +8544 +14156 + +3472 +8118 +2455 +1789 +7535 +6667 +2003 +1025 +7340 + +2807 +9390 +13476 +10938 +2272 +5114 + +3311 +13209 + +10615 +15963 +6233 +9368 +13767 + +11712 +3170 +13964 + +3689 +9486 +9551 +3456 +4882 +11211 +1600 + +6760 +5563 +3589 +8736 +7398 +4388 + +9518 +4642 +3473 +11134 +1020 +3983 +1012 + +3776 +1573 +6476 +6958 +2257 +2912 +2577 +3201 +5425 +2764 +6006 +4068 +3984 + +3516 + +12606 +33693 + +22285 +30183 + +6732 +2689 +7685 +5674 +1023 +2447 +5675 +6507 +7257 +4059 +2773 + +14742 +13724 +5856 + +19020 +15808 +15831 + +6871 +5101 +5123 +7918 +1663 +4364 +5111 +6205 +6680 + +5241 +1029 +5194 +2693 +7420 +4095 +3765 +3433 +1752 +1822 + +4311 +10029 +9151 +9518 +2511 +2363 +6980 + +6760 +4212 +21929 + +5789 +2855 +7378 +1525 +3127 +6001 +8351 +8353 +4445 +2987 + +5246 +2746 +1650 +5781 +5816 +1068 +4261 +4453 +6656 +1395 +2589 +4375 +4263 + +2133 +10539 +2325 +2094 +9071 +4830 +5758 +2060 + +2173 +6292 +5585 +2040 +3758 +2941 +4877 +3816 +6376 +1493 +4425 +3327 +3551 + +2469 +3948 +6275 +3614 +2736 +6400 +5997 +6010 +4231 +4716 +5492 +2055 +1836 + +7704 +6489 +3032 +8583 +7929 +8709 +7837 +5110 +3939 +4258 + +3360 +6562 +19776 + +12387 +9654 +1246 +12376 +12271 +6105 + +2945 +14862 +15087 +15649 +2445 + +3191 +4141 +4266 +3335 +2222 +3679 +5209 +5109 +6873 +6313 +2765 +2442 +2133 + +10886 +3410 +16022 +19192 + +14993 +2080 +9131 +19401 + +1222 +4856 +5484 +4898 +3546 +3996 +1054 +6444 +2077 +1460 +4349 +2253 +5826 +6257 + +7221 +11757 +1038 +4768 +12836 +13339 + +4975 +17027 + +2688 +1733 +3844 +6205 +3089 +1343 +7323 +2613 +1223 +4277 +5551 +3968 + +3475 +4760 +6351 +7360 +2946 +1337 +3434 +2485 +6407 +3266 +3517 +2125 + +21512 +23024 + +27755 +1947 + +6307 +1957 +6982 +1516 +1671 +1054 +4311 +4235 +6952 +8129 + +6734 +11365 +9035 +9922 +7310 +4799 +5883 + +59886 + +1919 +10200 +5393 +6601 +4924 +10451 +10218 +3175 + +2360 +4470 +1823 +3699 +4974 +3365 +2002 +5251 +1188 +3192 +2328 +2461 +1931 +1506 +2544 + +6131 +4712 +4994 +5450 +3023 +2002 +6108 +1591 +1011 +1689 +3003 +3970 +3613 + +7374 +2176 +5878 +4112 +1213 +5819 +3944 +3250 +5839 +1207 +4641 + +4375 +2510 +1107 +1717 +4333 +5631 +2499 +4002 +3822 +3618 +5259 +7133 + +6307 +6702 +1754 +4893 +4003 +5101 +3275 +3579 +2235 +6823 + +7388 +6708 +2218 +2220 +5287 +8692 +8143 +5692 +4287 +7770 + +5881 +1741 +7408 +2466 +14095 + +9268 +2524 +2958 +15427 +14742 + +3955 +7993 +6342 +2637 +5825 +3660 +5537 +1832 + +1022 +3769 +2113 +5734 +4382 +5338 +4904 +3631 +1073 +4992 +4134 +1773 +2645 +4100 +3882 + +31354 + +22767 +13308 +3424 + +18428 +9719 + +13154 +13267 +1035 +10201 +3948 + +3104 +2047 +2790 +6051 +3733 +4667 +3701 +2668 +2197 +3221 +3145 +1999 +3303 + +1703 +1792 +4827 +5038 +1712 +2516 +4798 +1464 +3073 +4214 +4870 +5705 +4507 +5712 + +2151 +4888 +2967 +1081 +1474 +2949 +1942 +4762 +1432 +5156 +2345 +5225 +3496 +6123 + +2205 +2399 +5266 +8514 +8150 +7435 +4416 +5244 +2903 +7406 + +4278 +3403 +6713 +8407 +3593 +7880 +8196 +7305 +1762 + +4341 +19333 +3617 + +7586 + +16168 +1909 +8778 +4452 +4148 + +3790 +3233 +2400 +6936 +1376 +4576 +6698 +1305 +4930 +5510 +2721 +1772 +2293 + +5791 +2163 +1948 +3948 +8564 +6399 +8272 +9733 + +5423 +6215 +1459 +6879 +4283 +4006 +5135 +5086 +3024 +2603 +3646 +3998 +2984 + +4991 +8870 +9477 +6827 +4847 +8241 +6970 +6532 + +3660 +36765 + +2699 +7895 +2763 +2460 +2477 +4390 +1370 +5744 +7657 + +3183 +2115 +2175 +2887 +2336 +8459 +8135 +1868 +1095 +6213 + +5677 +2990 +5916 +6344 +5605 +2072 +2173 +3704 +2888 +1999 +7661 + +24731 +13470 +5599 + +8873 +6995 +5302 +12016 +8988 +4674 +10185 + +5528 +19366 +18649 +9187 + +7428 +3617 +5583 +6033 +8532 +3632 +2565 + +6725 +1708 +1735 +1662 +4790 +3215 +4378 +2562 +3136 +2268 +3323 +6101 +3908 + +67860 + +3912 +2698 +2610 +1883 +7163 +7834 +8215 +4361 +4631 +6559 + +61469 + +1752 +3571 +5372 +1210 +2232 +4724 +2075 +4374 +6962 +1331 +3080 + +4392 +3755 +8553 +10430 +2077 +6502 +9329 +8373 + +4642 +6832 +6307 +5022 +4373 +5532 +4745 +1098 +6005 +4653 +4683 +6255 +6875 + +7024 +1051 +5664 +1399 +7333 +4725 +3375 +3832 +7361 +6068 +1187 +1447 + +19585 +7175 +19834 +13102 + +6423 +10860 +6839 + +6385 +7387 +13727 +13764 +13174 + +3453 +1935 +6047 +2440 +6454 +2789 +5995 +5238 +2206 +5418 +2905 +5424 +6725 + +20427 +11408 +21179 + +1648 +6294 +5757 +6484 +6851 +6987 +4177 +4898 +6845 +7343 +1573 + +23105 + +4696 +5155 +3429 +2107 +6849 +1619 +2146 +2232 +1080 +8086 +7818 + +4525 +3467 +1486 +8013 +7366 +3654 +5303 +7754 +6469 +1468 +3874 + +8007 +5589 +6424 +9322 +10417 +1508 +5900 + +3644 +2169 +8705 +1837 +3247 +8079 +7704 +2387 +2802 +4142 + +5554 +4692 +1368 +2623 +4146 +3634 +3354 +5121 +2171 +3418 +7129 +1334 + +18870 +23687 + +13467 +5594 +13229 +2978 +7542 + +2239 +7363 +3465 +7284 +2900 +7929 +5295 +4752 +2225 + +4445 +15568 + +3892 +2012 +2469 +1666 +1613 +3789 +5048 +1514 +2444 +3556 +3011 +5467 +5248 +4722 +2803 + +4793 +3118 +1831 +2977 +3936 +1036 +4325 +4205 +5869 +4957 +5223 +4290 +4719 +2397 +4679 + +4298 +5696 +5284 +1761 +6972 +1749 +1766 +3024 +2173 +6806 +6209 + +4805 +2409 +5913 +1863 +6111 +3958 +1514 +1970 +6399 +1839 +5697 +3174 +6203 + +12825 +8917 +10603 +6987 +8314 + +16810 +10340 +21902 + +1836 +3878 +1856 +2099 +6527 +4670 +2388 +1364 +2119 +5725 +2976 + +2368 +15063 +12997 +6731 +3508 + +3583 +4242 +5197 +2541 +3058 +5540 +4464 +4867 +3424 +6194 +2071 +1310 +5976 +5290 + +4262 +5256 +1625 +3579 +2688 +2816 +5619 +5282 +2163 +1264 +1820 +2748 +1064 +3239 +3082 + +8888 +17024 +18873 +12576 + +5571 +2530 +4707 +6564 +2637 +6947 +4981 +1116 +3747 +1187 +3968 +6569 +6926 + +5158 +4884 +2078 +1283 +6676 +4477 +7153 +3696 +1282 +3218 +6716 +2714 + +68708 + +12439 +12815 +12165 +6292 +8568 +7503 + +18845 +9399 + +3205 +33907 + +2754 +2530 +2082 +2114 +5490 +2469 +5103 +5656 +1633 +5631 +1633 +5003 +5194 +3584 +2830 + +4197 +11261 +3154 +5946 +7624 +4258 + +1338 + +4227 +8355 +5986 +8348 +4869 +6318 +6432 +7363 +6661 + +9115 +3231 + +9797 +4164 +16220 + +4412 +2616 +1705 +3033 +5695 +4241 +4252 +2810 +4176 +2554 +6251 +1751 +5832 +5548 + +3098 +4538 +5763 +4913 +3322 +5956 +1910 +4210 +3629 +5531 +1243 +5258 +4642 +5572 +3838 + +10520 +2932 +18639 +7802 + +15433 +3635 + +4777 +5260 +1283 +7917 +5860 +1376 +8001 +1209 +6245 +5939 +4721 + +6893 +4349 +1011 +1314 +5878 +3129 +1410 +4377 +2089 +3518 +3560 +1205 +6452 + +16914 +17575 +8660 +17142 + +15028 +10221 +16158 + +11777 +10449 +13633 +19094 + +10289 +9390 +3685 +3979 +12643 + +15858 +24129 +9740 + +2707 +1840 +3010 +1744 +1509 +5039 +4158 +2900 +4999 +3619 +5309 +4386 +2105 +2919 +2327 + +2358 +1502 +6302 +1270 +3358 +2033 +5857 +1125 +6738 +5707 +3960 +6751 +2829 + +2690 +2401 +4685 +1891 +4701 +4503 +5740 +6441 +1119 +4211 +2072 +1476 +1779 +1943 + +1490 +12834 +3680 +13513 +1055 +9731 + +5322 +13458 +2941 +1758 +11817 +4550 + +3688 +4536 +5079 +4031 +5642 +5920 +5061 +4114 +3118 +3316 +1980 +5607 +2845 + +4372 +7991 +11604 +6661 +12052 +1241 + +4013 +4554 +5176 +4386 +6064 +1319 +4562 +1902 +4010 +3954 +1265 +4361 +2068 +3759 +4652 + +11866 + +4305 +1270 +2941 +6582 +3164 +3522 +4611 +4191 +3659 +7416 +4855 + +5179 +8236 +3392 +11505 +8487 +4344 + +7032 +27996 + +5322 +4909 +4858 +1281 +5937 +1289 +4176 +5993 +2841 +2188 +4192 +3398 +1800 +2678 + +5789 +13043 +4951 + +4119 +10014 +8815 +6749 +4545 +7692 +8436 +6740 + +10382 +8802 +7279 +4950 +1653 +3537 +10285 +7896 + +9975 + +3544 +5188 +5111 +2576 +7568 +7371 +6930 +4818 +7435 +6810 +2847 + +52788 + +2951 +8272 +6521 +5428 +6863 +3722 +6443 +1114 +7114 +2776 + +4386 +1913 +7477 +2665 +7932 +4653 +5426 +4484 +1108 + +3541 +3719 +3868 +1077 +4637 +2936 +3503 +5201 +5315 +5940 +2278 +6496 +1172 +4755 + +6439 +5144 +6491 +1234 +1459 +1968 +5797 +4909 +5923 +6534 +5268 +2147 +5632 + +2993 +3284 +4366 +5384 +4598 +1051 +3969 +2961 +7025 +2727 +4233 +3326 + +9727 +15517 +19290 + +17096 +1375 +14129 +10456 + +4103 +6099 +2887 +2589 +2957 +6664 +6948 +5126 +2427 +3269 +2868 +6296 +4641 + +1935 +5903 +3249 +1842 +4289 +5319 +2667 +4309 +2668 +3080 +3400 +3762 +2166 +2408 + +7866 +7422 +14288 +15942 +6371 + +1693 +2509 +6586 +4294 +7542 +1271 +8072 +4193 +8047 + +1925 +1564 +6018 +6894 +3300 +4040 +4154 +1720 +5159 +5001 +1605 +6080 +2792 + +16335 +11723 +7586 +12891 +13423 + +12011 +11646 +5317 +2769 +9679 + +6924 +1571 +3645 +4124 +5594 +7185 +7705 +2532 +7397 +5459 +1037 + +3948 +4286 +6395 +2645 +1835 +4764 +2649 +3403 +2704 +4039 +4581 +5278 +4128 +6174 + +5567 +8309 +4782 +5394 +4052 +5453 +7241 + +8673 +2968 +6481 +3887 +8279 +7800 +2025 +4775 +4627 + +6856 +1361 +6648 +7563 +4239 +10679 +8050 +8027 + +4905 +11553 +2902 +12065 +5974 +9578 +9837 + +6128 +6201 +2999 +6195 +1121 +2830 +4668 +5007 +1825 +2830 +5287 +5471 +5759 +1805 + +6515 +17925 +23344 + +4610 +2265 +7019 +2395 +3396 +5131 +7067 +5803 +1994 +6492 +3618 + +7951 +1762 +7521 +4837 +1589 +6260 +5765 +7442 +6185 +2695 +5675 + +4104 +6509 +5143 +2862 +5655 +2104 +5772 +6257 +2689 +3244 +3501 +2054 + +3967 +1326 +5906 +2740 +3487 +6586 +2908 + +43279 + +4935 +6761 +6021 +4857 +3040 +1491 +3820 +2741 +7058 +3114 +5775 + +6458 +8250 +3691 +7478 +4003 +6917 +8033 +1181 +6882 +6533 + +12020 +5725 +24247 + +6550 +1033 +1841 +5367 +1621 +6554 +5355 +7437 +8079 +5876 + +9079 +12200 +16431 +8582 +15548 + +7910 +16510 +25149 + +2569 +3570 +6639 +1706 +7204 +4964 +3314 +1862 +4344 +3529 +7688 + +9213 +15614 +12172 +15703 +6499 + +4927 +2418 +4565 +2409 +5355 +1464 +4788 +2040 + +1499 +5180 +2638 +5857 +2693 +5068 +3382 +1202 +5745 +3817 +1174 +3182 +3011 +5823 +4302 + +1992 +1060 +1356 +5702 +2700 +2129 +4364 +5380 +2317 +2392 +1269 +6268 +3462 +5392 + +4601 +1395 +8724 +2017 +11000 +2414 +9399 + +5998 +4595 +1327 +9386 +6206 +2712 +9617 +5234 +7096 + +5436 +6415 +4210 +1032 +1825 +4408 +4903 +3803 +1197 +2849 +4106 +5611 +4553 + +3572 +6127 +6035 +6950 +4353 +1660 +2135 +2866 +1322 +4847 + +2181 +4407 +2006 +5437 + +3560 +4717 +5998 +6944 +2180 +6922 +8628 +2761 +3524 +2473 + +6215 +2369 +5907 +6959 +7105 +4982 +5255 +2650 +1834 +7016 +3072 + +1564 +6445 +6037 +6545 +4622 +6301 +1712 +2949 +3608 +3965 +2602 +5065 +6050 + +12326 +10342 +12805 +11947 +2641 +10687 + +15426 + +19377 +13829 +6477 +11837 + +7159 +7868 +6373 +10135 +10731 +6850 +5819 + +6938 +25628 +22954 + +5570 +5782 +8571 +7353 +2189 +6056 +2774 +7061 +6279 +1923 + +1200 +5306 +6067 +2575 +4613 +1321 +1525 +1545 +1059 +5337 +1920 +1367 + +9230 +8121 +5933 +11082 +5561 + +6447 +3340 +6950 +2194 +3685 +5311 +3610 +4332 +6755 +4780 +1164 +4978 +2476 + +3111 +6078 +2022 +7748 +5569 +2895 +4911 +7478 +4002 + +2414 +3673 +3897 +11893 +4984 +3471 + +6240 +6211 +5245 +15319 +6704 diff --git a/2022/01/test b/2022/01/test @@ -0,0 +1,14 @@ +1000 +2000 +3000 + +4000 + +5000 +6000 + +7000 +8000 +9000 + +10000 diff --git a/2022/02/a.rs b/2022/02/a.rs @@ -0,0 +1,13 @@ +mod common; +use common::*; + +pub fn main() { + let play_score = |s: &[u8]| (s[2] as i64) - ('X' as i64) + 1; + let win_score = |s: &[u8]| { + let other = s[0] as i64 - ('A' as i64); + let me = s[2] as i64 - ('X' as i64); + 3 * ((me - other + 4) % 3) + }; + let score = get_score(play_score, win_score); + println!("{score}"); +} diff --git a/2022/02/b.rs b/2022/02/b.rs @@ -0,0 +1,13 @@ +mod common; +use common::*; + +pub fn main() { + let play_score = |s: &[u8]| { + let other = s[0] as i64 - ('A' as i64); + let w = s[2] as i64 - ('X' as i64); + (other + w + 2) % 3 + 1 + }; + let win_score = |s: &[u8]| 3 * ((s[2] as i64) - ('X' as i64)); + let score = get_score(play_score, win_score); + println!("{score}"); +} diff --git a/2022/02/common.rs b/2022/02/common.rs @@ -0,0 +1,10 @@ +pub fn get_score(play_score: fn(&[u8]) -> i64, win_score: fn(&[u8]) -> i64) -> i64 { + let mut score = 0; + let mut line = String::new(); + while std::io::stdin().read_line(&mut line).unwrap() > 0 { + let l = line.as_bytes(); + score += play_score(l) + win_score(l); + line.clear(); + } + score +} diff --git a/2022/02/input b/2022/02/input @@ -0,0 +1,2500 @@ +C Y +C Y +C Y +B Z +C Y +C Z +C Y +C Y +C Z +B Y +C Y +C Y +C Y +C Y +C Y +B Z +A X +C Y +B Y +A X +C Z +C Y +C Y +C Y +B Z +B X +C Y +A X +A X +A X +C X +A X +C X +B X +C Y +C Y +A X +A Y +C Y +C Y +C Y +C Y +B X +A X +B Y +C Y +C Y +C Z +A Y +B X +B Z +C Z +C Z +A X +A X +B X +C Z +C X +A Y +C X +C Y +A X +A X +A X +C Y +C Z +C X +C Y +A X +C Y +C Z +C Y +B Z +C Y +A X +C Z +C Y +C Y +C Y +A X +A X +A X +B X +A Z +A X +C Y +A Y +C Y +B X +B Z +B Z +B Z +B X +C X +A X +A X +A X +C Z +A Y +C X +C Y +B X +C Y +C Y +A X +C Y +C Y +C Y +A X +C Y +A X +C Y +A X +C Y +B X +C Z +C Y +A X +C Z +B Z +A Z +B Z +C Y +B X +A X +C Y +B X +A X +A X +A Y +B Z +C Y +A X +C Y +C Y +A X +C Y +C Y +A X +C Y +A X +C X +B Y +C Z +B Z +C Y +C Y +A X +B X +A X +C Y +C Y +A X +B X +C Y +B X +C Z +B Z +C Y +C Y +C X +A X +C Y +A X +C Y +C Y +C Y +C Z +A X +C Y +A X +A X +B X +C Y +C Y +A X +B X +A X +A X +A X +B Z +C Y +C Y +C Y +A X +A X +A Y +A X +B X +B Z +B Z +C Y +B Z +A X +B Z +C Y +C Y +C Y +C Y +C Y +A X +A X +A Z +B Y +C Y +C Y +C Y +A X +B X +A X +A X +C X +C Y +B Z +C Y +C Y +B X +A X +A X +B Z +C Y +B Z +C Y +C Y +C Y +A X +C Y +C Y +A X +C Z +B X +B Z +C Y +C X +C Y +A X +C Z +B Z +A X +B X +C X +A X +C Y +C Y +B Z +A Z +B X +B X +A X +A X +A X +C Y +C Y +C Z +A X +C X +C Y +C Y +A X +B X +A Z +B X +B X +C Y +B X +B Y +B Z +A X +B X +B Y +C X +A Y +A Y +C Y +A X +C Y +B X +C Z +C X +A Z +C Z +C Y +C Y +B X +B X +C Y +A X +C Z +C X +C Z +B X +A X +A X +A X +B Z +B X +B Z +C Y +C Y +C Y +B X +C Z +C Y +A X +C Y +C Y +A X +A X +C Y +C Y +C Y +C Y +C Y +C Y +A X +C Y +C Y +C Y +C Y +C Z +C Y +A X +A X +C Y +A Y +B Z +C X +C Y +B X +A Y +C Y +C Y +C Y +A Y +B X +A X +B Y +C Y +C Y +C Z +B Z +C Y +A X +A Y +C Y +C Y +C Y +C Y +A Y +B Z +A X +C Y +C X +C Y +C Y +C Y +C Z +C Y +C Y +C Y +B Y +C Y +B Z +C Y +A X +C Y +B Z +C Y +C Y +A X +A X +B Z +C Y +C Y +C X +B X +C Z +A X +A X +B X +C Y +B Y +C Y +A Y +C X +A X +C X +C Y +C Y +B X +C Y +C Y +B Z +C Z +C Y +C Y +A X +C Y +C Y +A X +C Y +B X +C Y +C X +A X +C X +A X +C Y +A X +C Y +C Y +C Y +C Z +C Z +B Z +C Z +C Y +B X +C Z +C Y +A X +A X +C Y +C Y +C Y +B X +C X +A X +C Y +A X +C Y +A X +C X +B X +A X +C Y +C Y +B X +A X +A X +C Z +C X +A X +A X +B X +A Z +A X +C X +C Y +A X +B X +C Y +A X +C Y +C Y +B X +C Y +C Y +A X +C Z +C Y +B X +C X +B X +C Y +C Y +B X +B Z +B Z +C Y +C Y +B X +C Y +B Z +C X +A Z +A X +A X +C Y +C Y +C Y +C Y +C Y +C Y +B Z +B X +C Y +B Z +C Y +A X +A X +C Y +A X +A X +C Y +C Y +A Z +C Y +A X +C Y +C Y +C Y +C Y +C Y +A X +B Z +A X +C X +B X +C Y +B Z +C Y +B X +B X +C Y +C Y +C X +C Y +C Y +A X +C X +A X +C Y +B X +A X +B Y +A X +B X +C Y +C X +C Y +C Y +A X +C Y +C Y +A X +C Z +B X +A X +C Y +A X +A X +C Y +A X +C X +B X +A X +A X +B X +A X +C X +A Z +B Z +C Y +C Y +A X +C Y +C Y +B X +A X +C Y +A Y +B X +C Y +C Y +A X +C X +C Y +C Y +A X +C X +B Y +C Y +C X +C Y +C Y +C Y +C Z +A X +C Y +C X +C Y +A Z +A X +C Y +B X +C Y +B Z +A X +C Y +C Y +A X +A X +C Y +B X +A Z +B Z +C Y +C Z +A X +A X +A X +B Z +A Z +C Y +C Y +C Y +C Y +C Y +B Z +B X +A Y +B X +C Y +A X +C X +A X +A X +C Y +A X +C Y +C Y +A X +C Y +C Y +C Y +C Y +B Z +B X +C Y +C Y +A X +C Y +B X +C Y +C Z +C Y +B X +C Y +C Y +B Z +A Y +C Z +B X +C Z +C Y +A Y +A X +A X +C Y +B X +A X +A Y +C X +A Y +C Y +C Y +C X +C Y +C Z +C X +B X +C Y +C Z +A X +C Y +A X +C Y +C Y +A Z +A X +C Z +B X +C X +B X +B Y +C Y +C Y +B Z +C Y +B X +B Z +C Y +C Y +C Y +B X +B Z +C Y +B Z +B X +A Z +A X +C Y +C Y +B X +B Z +A X +C Y +C Y +C Z +C Y +C Y +C Y +B Z +C Y +C Y +B Z +C Y +C Y +C Y +C Y +C Y +C Z +C X +C Y +C Y +C Z +C Y +B Z +C Z +A X +C Y +B X +C Y +A X +C Y +A X +C Y +C Y +C Y +C Y +B X +C Y +C Y +A X +C Z +A X +A X +C Y +B X +C Y +C Y +C Y +A X +A X +C Y +B X +B X +C Y +B X +C Y +C Z +C Z +A X +C Y +C X +C X +C Z +C X +C Y +A X +C Y +C Y +C Y +A X +A X +C X +C Y +C Y +A X +A Z +C Z +C Y +C Z +A X +C Z +C Y +C Y +A X +C Y +B Z +B X +A X +C Y +C Z +A X +C X +C Y +C Y +B X +C Y +C Y +C Y +B X +B Z +B Z +A X +A X +C Z +C Y +C Y +C Y +B Z +A X +C Y +C Y +C Z +B X +A X +C Y +B Z +C Y +A X +B Z +A X +A X +A X +A Y +C Z +A X +A X +B X +A X +C Y +C Y +A X +C Z +A X +A X +C Y +A X +B X +A X +C Y +A X +C Y +C Z +C Y +C Y +C Z +C Y +C X +A Y +A Z +B Z +B X +C Y +C X +B X +A X +A Y +A X +A X +C Y +B X +A X +C Y +B Z +C Y +C Y +C Y +C Y +A X +B X +C Y +A X +A Y +C Y +B X +C Y +B Y +C Y +B X +C Y +C Y +C Y +C X +A X +B Z +C Y +C Y +B X +C Y +C Y +B Z +A X +C Y +C Y +A Y +C Y +B Z +C Y +C Y +A X +A X +A X +C Z +B X +C X +A X +C Y +C Z +A X +B X +A X +B X +C Z +C X +C Y +B X +C Z +C Z +C Y +A X +C Y +C X +B X +C Y +C Y +A Y +C Y +C Z +C Y +C Y +B Z +C Y +C Y +C Z +B X +B X +C Y +B Z +C Y +A X +C Z +C Z +A X +A X +A X +A X +C Y +C Y +B X +C Y +B X +A X +C Y +C Y +C Y +A X +B Z +A X +C Y +C Y +C Y +A X +C Y +C Y +B Z +B Z +A X +C Y +C Y +B Y +C Y +C Z +A X +C Y +C Z +A X +A X +C X +C Y +A X +A X +C Y +C Y +A X +A X +A X +C Y +C Y +B Z +C Y +B X +A X +A X +C Z +C Y +A X +C Y +A X +C Y +C Z +C Z +C Y +A X +C Y +C X +C Y +B X +C Y +A X +B Z +C Z +C Z +C Y +B X +C Y +C Y +C Y +A X +A X +A X +C Y +B Z +A X +C Y +C Y +C Y +A X +C Y +C Y +A X +C Y +C X +A X +C Y +C Y +C Z +C Z +C Y +C Y +C Y +C Y +C Z +B X +C Y +C Y +A Y +C Z +B Z +C Y +C Y +A X +B X +A X +C Z +C Y +B Y +C Y +A Z +C Y +B Z +B Z +C Y +A X +C Y +B Z +B X +B Z +A X +B X +A X +C X +A X +B X +A Y +B Z +C Z +C Y +A X +A X +C Y +C X +A Y +C Z +C Y +C Y +A X +A Z +A Y +C Y +B X +A X +C Y +C Z +B X +A X +B X +C Y +C Z +B X +C Y +C Y +C Y +A X +C Y +C Y +C Y +C Y +C Y +C X +C X +C Y +C Y +C Y +A Y +C Y +A X +C Z +C Z +C Y +C Y +C Y +B X +A Z +C Y +C Z +C Y +A X +C Y +A Y +A X +C Y +C Y +A Z +B X +C Z +B X +C Y +C Z +C Y +C Y +C Y +C Y +C Y +C Y +B Z +C Z +A X +A Z +C Z +B Y +B Z +C Z +C Z +A X +B X +B X +C Y +C Y +A X +A X +C Y +C Y +A X +C Y +A Z +C Z +C Y +A X +C Y +C Y +A X +A X +C Y +C Y +B Z +B X +C Y +C Y +A Z +C X +C Y +B X +C Z +A X +C Z +C Y +A X +B Z +C Y +C Y +B X +A Z +C Y +B Z +A X +C Y +C X +A X +C Y +C Y +C Z +A X +B X +B Z +C X +C Y +C Y +A X +C Y +B X +A X +A X +C Y +A X +A X +A X +A Y +A Z +A X +A X +C Y +C X +C Z +C Y +C Y +C X +C Y +A X +A X +A Y +C Z +C Z +C X +B Z +C Y +A X +C Y +B Z +A X +C Z +C Y +A Y +A X +B Z +A X +C Y +B X +B Z +A X +B X +B X +C Y +C X +C Y +C Y +C Y +C Z +B Z +C Y +C Y +C Z +C Y +C Y +C Y +A X +A X +C Z +A X +C Y +C Y +B Z +A X +A Z +C Z +C Y +C Y +C Y +C Z +C Y +C Y +C Y +C Y +B Z +C Y +C Z +C Z +C Y +B Z +A X +C Y +B X +C X +A X +A X +B X +C Y +C Y +C Y +C X +B Z +C Y +A X +C Z +A X +A Z +C Z +C Y +C Y +C Y +C X +A X +C Y +A Y +C Y +B Z +A Y +C Y +A X +C Y +A X +C Y +C Y +C Y +B X +C Y +C Y +A X +C Y +C Y +C Y +C Y +A X +B Z +B X +A X +C Y +C X +C Y +B X +C X +C Y +C Y +A X +A X +C Y +C Z +A X +C Y +A X +C Y +C X +C Y +B Y +A Y +C Y +C Z +A X +B X +C Y +B X +A X +C Y +B X +A Z +C Y +B X +C Y +A X +B X +C Z +A X +B X +C Y +A X +A X +B X +C Y +A X +C Z +A X +C Y +A X +B X +C Y +C Y +C Y +C Y +C Y +A X +A Z +C Y +A X +C Y +C Y +B X +C Y +A X +C Y +C Z +C Y +C Y +A X +A X +A X +C Y +C Y +C Y +C Z +C Y +C Y +C Y +C Y +C Z +C X +C Y +C Z +C Y +C Y +C Y +C Y +A X +B X +C Z +A X +C Z +C Y +C Y +C Y +C Y +A Z +B X +A X +B Z +C Y +C Y +C X +C Y +B Y +B X +C X +C X +A X +C Y +C Y +A X +A X +B Z +C Y +C Y +C Y +A X +A X +C Y +C X +C Y +A X +C X +B Y +C X +C Y +C Y +A X +B Z +C Y +B X +A X +B Y +C Y +C Y +C Y +A X +A X +C Y +C Y +A X +C Y +C X +C Y +B Z +C Y +C Y +A Z +C Y +C Z +C Z +C X +C Y +C Y +C Y +C Y +C Y +C Y +C Y +A X +C Y +B X +C Z +C Y +C X +C X +A Y +C Y +A X +A X +B Z +C Y +C Y +A X +A Z +B X +C Y +C Y +B Y +C Y +C Y +C Y +C Y +A X +C Z +C Y +C Z +A Y +C Y +A X +A X +C Y +C Y +C Y +B X +B X +B Z +A X +C Z +C X +A X +C Y +C Y +C Y +C Y +C X +C X +B Z +A Z +C Y +B Z +C Z +A X +C Z +A X +C Y +A X +C Y +A X +A X +C Y +A X +C Y +C Y +C Y +B X +C Y +C X +C Y +C Z +C Y +A X +C Y +C Y +C Y +B Z +C Y +A X +B X +C Y +C Y +B Y +C Z +C Z +C Y +A X +C Y +C Y +A X +C X +B X +A X +A X +C Y +C Y +C Y +C Y +C Y +A X +A X +C Y +C Y +B X +C Y +C Y +C X +C Y +C Z +B Z +C Z +C Y +B X +C Y +C X +A X +C Y +B X +B X +A X +C Y +A X +C Y +A X +C X +C Y +C Y +B X +C Y +C Y +C Y +C Y +C X +B Z +A X +A X +C X +C X +C Y +A X +C Z +C Y +C Z +A X +A X +C X +C X +C Z +B X +A X +C Y +B X +C Y +B X +C Y +C Y +C Y +C Y +C Y +C Y +C Y +B Z +C Z +A Z +B X +C Z +C Z +C Y +B Z +C Y +A X +C Y +C Y +C Y +B Z +C Y +A X +B Z +B Z +C Z +A Y +C Z +A X +C Y +C Z +C X +A X +B X +C Y +C Y +C Y +A X +A Y +C Y +C Y +C Y +A X +C Y +B X +A X +A X +B X +C Z +C Y +B Z +C Y +A Y +B X +C Z +B Z +B Z +C X +B Z +C X +A X +C Y +B X +C Y +A X +C Y +A X +C Y +C Y +C Z +C Y +A X +B X +C Y +A X +B X +C Y +C X +C Y +C Y +A X +C Y +A X +B X +C Y +B X +B X +C Y +A X +C X +C X +B X +B Z +C Y +B X +C Y +C Y +B X +A X +C Z +A Y +C Y +C Z +A X +A X +C Y +A X +B Z +A X +A X +C Y +B Z +B Z +C Y +B X +B X +A X +A X +C Y +C Z +C X +C Y +A X +B Y +A X +C Y +B Z +B X +A Y +A X +C Y +A X +A X +C Y +C Y +C Y +C Z +C Z +A X +B Z +A Z +A X +C Y +B Z +C X +C Y +C Z +C Z +B X +B Z +B X +C Y +B X +B X +C Y +C Y +C X +B X +A X +C Z +A X +C Y +A X +A X +C Y +B X +B X +A X +B X +B Y +C Y +A X +A X +A X +B X +C Y +B Z +C Z +B X +C Y +C Z +A X +C Y +C Y +B Z +C Z +C Y +C Z +A X +B X +A Z +C Z +B Z +A X +A X +B X +A X +C Y +C Y +C Y +C Y +A X +C Y +C Z +C Z +B X +A X +A X +B X +B X +B X +C Y +C Y +A X +C Y +B Z +C Y +C Y +B Z +A Z +C X +C Z +B X +C Y +A X +A X +C Y +C Y +C Y +C Z +A X +C X +B X +C Y +A X +C Y +C X +A X +A Z +C X +C Z +A X +C Y +C Y +C Y +A X +A X +A X +B Z +C Z +C Z +A X +B X +B X +A X +C Y +B X +C Z +B Y +A X +C Z +A Z +C Y +C Y +A X +A X +B X +C Y +B Z +C Y +A X +A X +A X +C Y +A X +C Y +C Y +C Y +B X +A X +B Z +C Y +A X +A X +A Z +A X +A Y +A X +C Y +C Y +B X +A Y +C Y +C Y +A X +A Y +C Y +B X +C Y +C Y +C Y +C Y +C Y +B X +C Y +C Y +C X +C Y +A X +B Z +B X +B X +C Y +A X +C Y +C X +C X +C Y +C Y +C Z +C Y +A X +C Y +A X +C Y +A X +A X +C Y +C Y +B X +B Y +C Y +A X +B Z +C Y +C Y +C Y +A X +A X +A X +C Z +C Y +C Z +C Y +C Y +C Y +A X +C Y +C Y +C Y +B X +A X +C Y +C Y +C Z +A X +A X +C Y +C Y +B X +A Z +C Y +C Y +C Y +C Z +C Y +A Y +C Y +C Y +C Y +B Z +C Y +B X +C Y +C Y +B Z +A X +C X +C Y +A Y +A X +C X +C Y +C Y +A Y +B X +A X +A Y +C Y +C Y +C Y +A X +A X +A X +B X +A X +C Y +C Y +C Z +C Y +C Y +C Y +C Y +C Y +C Z +C Y +B Z +A X +B X +A X +C Y +A X +C Z +B X +B X +B Z +C Y +C Y +C Z +C Y +C Z +B Z +C Z +A X +C Y +B Z +B Z +C Y +A Y +B Z +B Y +C Z +C Y +C Y +B X +A X +C Y +B Y +A X +A X +C Y +C X +C Y +B Z +A X +C Y +A X +C Z +C Y +B Z +C Y +B Y +A X +C Y +A X +B X +A Y +C Y +C Y +B X +C Y +C Z +A X +C Y +B X +C Y +B Z +C Y +B X +B Z +C X +C Y +C Z +C Y +C Y +C Y +C Y +C Y +C Y +A X +A X +A X +A X +A X +A X +C Y +A X +B Z +B X +C Y +C Y +C Y +C X +A X +C X +A X +C Y +B X +B X +C Z +C Y +C Y +A Y +C Y +C X +A X +B Z +C Y +C Z +A X +B Z +B Z +A X +A X +C Z +C Y +B Z +A X +B X +A Y +B Z +A X +C Z +C X +C Y +C X +C Y +C Y +A X +C Y +C Y +C Z +A X +B Z +C Y +C Z +A Y +C Y +C Y +A Z +C Y +C Y +C Z +C Y +C Y +C Z +C Z +C Y +A Y +B X +B Z +A Y +A X +B X +C Y +C Y +C Y +A X +C Y +A X +B X +C Y +C Y +B X +C Y +A X +A Z +B Z +B Z +A X +A Y +A X +A X +C Y +C Z +A X +B X +C Y +B X +C Y +C Z +B X +C Y +C Z +A X +C Y +C Y +C Y +B X +C Z +A X +A X +C Y +C X +A X +C Y +C Y +C Z +A X +B X +A X +C Y +C Y +C Y +C Y +B X +B Z +C Z +A X +A X +A X +A X +A X +A X +C Y +C Y +C Y +B Z +C Z +C Y +C Y +C Y +C Z +A X +C Y +B X +A X +A X +C Z +B X +C Z +B Z +C Y +A X +A X +C Y +C Y +C Y +C Y +C Y +A X +C Y +A X +C Y +A X +C Y +C Y +C Y +C Y +A X +A X +C Y +C Y +C Y +B X +A X +C Y +C Y +C X +A X +A X +C X +C Y +C Y +C Y +C Y +C Y +C Y +C Y +C Y +C X +C Y +B X +B Z +C Z +C Y +C Y +C Y +C Y +B X +C Y +C Y +C Y +C Y +B Z +A X +C Y +A X +C Y +A X +C Y +C Y +A X +C Y +C Y +A X +A Z +A X +C Z +C Z +C Y +B X +C X +C Y +C Y +C Y +B Z +B Y +A X +B Z +A X +A X +A X +B X +B X +A X +C Y +C Z +A X +C Y +C Y +C Y +A X +C Y +C Y +C Y +A X +A Y +A X +C Y +C Y +C Z +C Y +C Y +C X +A X +C Y +A X +A X +A X +C Y +C Y +C X +A X +A X +B Z +A X +C Y +A X +B Z +C Z +A X +C Y +A X +B X +C Y +C Z +A X +A X +C Y +A X +A X +C Z +B X +A X +A X +B X +C Y +B X +C Y +A X +B X +C Y +C Y +A X +B X +C Y +C Y +B X +A X +B X +A Y +C Y +C Y +C Y +A X +C Y +A X +B Z +B X +C Y +B Z +A X +C Z +C X +C Y +C Y +A X +A X +A X +C Y +A X +B Z +B Z +C Y +B X +C X +C X +B X +C Y +C Y +C Y +C Y +B Z +C Y +C Y +C Y +A X +C Y +A Y +B X +C Y +C Y +B X +A X +B Z +C Z +A X +C Y +C Y +C Z +C Y +C Y +C Y +C Y +B Y +C Z +C Y +C X +A X +A Z +C Y +A X +A Y +B X +C X +B X +B X +B X +C X +C Y +C Y +C Y +A Z +A X +C Y +C X +A Y +A X diff --git a/2022/02/test b/2022/02/test @@ -0,0 +1,3 @@ +A Y +B X +C Z diff --git a/2022/03/a.rs b/2022/03/a.rs @@ -0,0 +1,26 @@ +mod common; +use common::*; + +fn get_rep_val(rucksack: &[u8]) -> i64 { + let mut seen = [false; 256]; + let mid = rucksack.len()/2; + for i in 0..mid { + seen[rucksack[i] as usize] = true; + } + for i in mid..rucksack.len() { + if seen[rucksack[i] as usize] { + return value(rucksack[i] as char); + } + } + panic!("Could not find repeated char"); +} + +fn main() { + let mut sum = 0; + let mut line = String::new(); + while std::io::stdin().read_line(&mut line).unwrap() > 0 { + sum += get_rep_val(line.as_bytes()); + line.clear(); + } + println!("{sum}"); +} diff --git a/2022/03/b.rs b/2022/03/b.rs @@ -0,0 +1,29 @@ +mod common; +use common::*; + +fn get_rep_val(e: &[String; 3]) -> i64 { + let mut seen = [[false; 256]; 2]; + for i in 0..2 { + for c in e[i].chars() { + seen[i][c as usize] = true; + } + } + for c in e[2].chars() { + if seen[0][c as usize] && seen[1][c as usize] { + return value(c); + } + } + panic!("Could not find repeated char"); +} + +fn main() { + let mut sum = 0; + let mut lines: [String; 3] = Default::default(); + while std::io::stdin().read_line(&mut lines[0]).unwrap() > 0 { + let _ = std::io::stdin().read_line(&mut lines[1]); + let _ = std::io::stdin().read_line(&mut lines[2]); + sum += get_rep_val(&lines); + for l in &mut lines { l.clear(); } + } + println!("{sum}"); +} diff --git a/2022/03/common.rs b/2022/03/common.rs @@ -0,0 +1,7 @@ +pub fn value(c: char) -> i64 { + match c { + 'a'..='z' => (c as i64) - ('a' as i64) + 1, + 'A'..='Z' => (c as i64) - ('A' as i64) + 27, + _ => panic!("Error: unexpected character '{}'", c) + } +} diff --git a/2022/03/input b/2022/03/input @@ -0,0 +1,300 @@ +QtGHnGlcwQGvHwMHGnnGfRFCJnRBfVVJRVBfCFBh +qsDjzNWhmspNNqVrfjVfjJCbBVfB +DLhPTmNDTzTqzpmzLpswGMHtMgwglcPQMQvSGM +ctwDjvgtltgglHrSHCsQWBBDfS +ZJZdVnmhmfCprnBTfS +dNddhhdPRRdbdNcvwCPCgCctjPlF +MNNDGMWrQsfhtrTnrm +jcvRPRPJdvccRNFNCjLdcwJCSHtHPmzhsSzPHmfhnftnTffH +RddRcjRvZgZNWNgQQb +fPrvhqhRPSfCCfhrqtbtLcmZmtHCtpCFcc +WFQJlTdzgGJVQGWQTzdJcHbQZtLtHmbbZMZHsZQm +JFNlzTBNJGlNPSRhfqRRrN +tdVVgttdDtJJsNPmzdQmjcPP +CBTMmmmbTBHqHMwQcZPWWsWnzbbnzW +CGlLFCTMGvqBGvGvGSRSRfmtRRtgVgrSLS +LHSGJLWZLqHQHpRHRz +bpBPVtpCwPgBCtqqvzfzMQvjbbjz +lhVsTgPlBNThpBNwBtVThPnrGGWJZnLZFnFrGWsFrWZr +nQbbbjpnsdsGCSlmHtJmvljHMjWt +cDcgThLVcPTHVlVlHllvWp +cwpgghTcRRczDhnQGGCSdfszdSbS +vTMFDNTlDhjTDNMNJDwmWWWfGPfLnnzLGfMmmL +bVQgbpqqtctzLflltnCz +VSqlVSHRFvNwJSDj +RfZfjljffssWLWPTGPjhzT +FDCvMDMJJpBJpBFJCMBDMtPbWbLVPGztWPVTtPmLWGhQ +DpgHggpwBJwzJMrFFvrCrHsffnRScNsdclSnnRnSNs +wTvfHSvSwssPGCLCPhgSCn +QNpMRqRJQMZlBBbRRRMfbZlBhPChghhlChGCtnthctjPhchh +rrrNBbMZqRbqDsFHTwfWTFFwrF +fVgfQhhgfTLHSLNZZHfZ +CDtsqrqlDtqDddsqjsstHrSlNLWLcSZScFWWcNBFcBcc +jrCJrHjDCMMDsJjJMstThppgwvGzVGQzhJvvng +DGlTlSzbSnzmwbmblTBBPgffpNjFHppZBH +WqQdWqqJdCrtvQtJLQjtdcBNfPsNZfHZZsHNNZHsBBHL +cCJcjdRvqrQhqvWMzlbDGVGbSMSnbR +BfQmpfpmsRCRPDSZVSjjSg +MhNJGMTMHGGTbnGMJrbJHTzzdPgSwSqqPjPdZddSqNSwPZDw +TWbWbhnHWBFBFBDD +FrlJbTcBTcrlTlqwZTwWdhWLChLtVhdfLhmwWC +pppSpzBGMMMjSSMSzMNzHRSDVWGWDWVCDtGdtdhLhftthd +RNNgpMPRNgzggFJcBPqFZJZrbc +SdvnnvvntnbDDqtz +wRpFRRspZhgZgFggFMgtczcGGDzQcGlGDMqcDG +CLLCFNZhsppRvvttBPCjStdT +JJDMhSwmMwBnnJPJmQcFtfQtfgQhQQfcgH +ZvCvTGqGVWTZZWptQggGtHfDgcpz +dsVCvDTZWWbZqqCZqVsqsqmNlPNnSJmbNNmlmMSnJLBl +MGnMBMBJFpBcNpdwRWRvRNdblmwW +LSgtPCChgjCPgSSzCSqWLLbrdWlmwmwmFvml +QhHPVSHghCtQFgCzgQhVnDGMGffnpcZMcMfJDf +QwrJqMLRLtBQRtWLJLvQLMrMgNNzPDngNHlHnbbbggHlgZNt +GdfThGcmShTGSfppmFfTHDNNblSZDbbzlBzZZHHg +TffmGBBFcCFFmTGFhBwjJQJMQWqWQCrrvQMR +mRbrjZzRLchHqqdLDllh +mCGCsJSggCmgSGShlhhDVVVwhqSltV +PsfsGNGJvGPfspvcmrTRBrjTZzvT +NRNqFFtqqFrDDQRcJJJNrWDswHwWwbDVTgTwLbVlVD +ZpdHHGPmgwTwldbw +HnnnMPMzChPmnpnmfFJCRqcJqJRRrrtSBc +LnNNLBmTNBNTwNZZjZmRMHJwMHvbWrvPMMWdcP +GtSFDFpzsGVvMJdJsrMbvr +SqQQGGtqqSVtDpGtplVDpVJClmnhnTZNjNfmnmBChCZL +CHltTDsjHNHHdpDRmqdPQpzd +fMMbbZwLJgMVVFmcRqRpzdqbRm +MJJWfnVhMzTNGlNTsh +WtWbtWvrrQGrbcSWHHfSHfgdWJ +zpnPhLPhPnTMMnzMzpMnDzLPjTVjccSgdmjdvSJdHSgdjScj +qqvMMCnDCCCzqqCzhPlLsRsGtrsNlRbZtBRtbrrQ +mPTmlGQnjNTPQQNljnlQnmmCtgRPhghqgqgzqLRPtMqqMzhq +pDsVSZcdVspbdBpcBHBcHhqLWzMbfhMMrMgMgzLRft +pFZpJJFSBFRllvlFNC +pbMVjJbwbbLqlZlstRhjstsN +FSTnfCBcnBSBvSmmCFCCRQhZBZNsRGlsQQNsqZlG +dvcdfFcqmfcmdMdJgwJJHMbH +QSRlWDhQQqDqlTCjTRCSljSmVsPmmGmzsgvppzPVVzdPSP +HHwtMNMZvfPGbdwdggwG +ZFcNMFFvHLMjlCWrqhqchh +jccDSGVVlRLVSVVScWZZwLvbphgwdpLwZv +BQHBtfQQHBfmMtmFznrHzmDwghWphvZZFpDhZvgvpZhh +DmQrPQnBtTnzrrfHrtfMrmTCGqPNjSPCRRGjRCRRqCNjVN +bRDbbtVgPFFbDfgVCtPcGsNNsHccqcGGWCNNzW +ZwlmJwwRSmlJdQRhqGNTqzGTwzqGhc +ZQdZjpljldrSMjmjdRLdmdbVvvtDVFFffvBFPVBgMnBg +rzwGrwPGppqzPMzrdqsssSsvgtQgTTTJsH +LCNNHLmHWvCJstsJss +cfVLLNBmZBVMVDHGwrhM +FCGFrJltMGdFdGtlFtCgFzQfQnZfVVVMDcQDVzVjfD +PSPSPZPRbPRsbBRbHBTPvfVzQcDQqWWnDjnnHDjzcz +RmSTPwSTRpvSlZglgZprZtNp +njtLGLbcNTbbLnLmNTtqnFzVPwJFFzPVFPwMVmfMmV +srpZlSpsSVqgSPJJ +HZsHsrZhrBQpqQvpdprnTnnHTbGLbHnjHGbjbT +vFFnJjvnVSjgCqSCDZ +lswrrcsQrHTHwdrDdhmqqsRhzmggghgsGC +QPrWQWcDNDHdddNrQPfDMLMLtvvMbnBpPFvpFFvL +LgltlRMtcccgMdlzqTVwwrdsqm +FpvfSDNzSpnvGSnNpmsmVqVVrHwvTqVmmw +pGjDFFDpffnWQbnzjLJhhLchPPJMPBLt +lJqBqPvtvVPnttnJjJBjVMzMrFhdQrQFbGbQnrbzGG +msRgTgmTLLmsTDRfQRllMdGzdRbMHQFF +msfDWglWTpSLCgTpSCDsfPjvjtwVjJZqqSSvPVZSqB +VZZWGZGlZZZMZrGMlQBQGWltFzqvzzcVcgzvmgzddccgvqFc +rLjNrDRLDRLTqdCqFCNzFgqg +TJSSbHfDDfSnbpHpJnGhWPtrZWnPhBwWPWBt +ssvsDDjNwhjNhGGgDDRZllltLCLvCWbMffLCfWzb +qVRmJFSQqqVcqSMWMWLMlllbtbVM +PqQBPcFJFcmdrJPJrFrQpsNjnTGgwTwGssRNRnRBsG +sHsJJfSsrpBLHCLJmdqgdZgRNZQlgRNC +VtnFbhFhwjwVPPjhbccQDQqgRlWDQmdWZZDd +hFhFvbhGwzvFbtbPnttGbtjsLBfspSrMvJLrpJTrMsLZrH +nzJDJvvZznnqnZrpTgTpzzTNjlmtsglBjjttQQCgCCtlBj +SRLRfdVfSVcfHdVVdSLdMHQjPtClsmcwNQltjwjCQQwm +RShVLWWfWWGvsTZz +vcdptvndNzrndjctrvcnvtTdbwwRTgwbHDFDTWgqWlWqwqbl +ffVBmQPhshhfPmSfBPfChmmCWFWbDWFbWwwqRDbsgwWMbWFb +SJJCBLZBhfvnJnpGtvRc +HLMMHHpNqWHqFqppPWnshtsLhBnVDtthLLms +JgmSRgCRGbgwGSbgJJjRRDntztrVhnsDrllllwhhzt +bRRCCjgRvJQQdcdjjvRcQdgbZPZpqfqpHHMfNFqNTPWqQWmq +PPwQTlFrLqrLQrPfPJrHtcjtSvdCNNctLCjNdc +DGZMhmVRMGqVmVDnGMbBZhsjHNvjdstddjdjccSBSjds +mqzVnWDmmGzRhqRbbWQQFwPQQTlzPFpTlPJJ +RMmnMrZMlQQpGrQt +gPPgcDBcjdgjBCBcQtNDNzzthltGphhz +FSvPSSjFWFScSWdjWvbTwWJQZQVRsMTQVwTmVR +PwlbMTDQDvMwttThPthhvhvvZzNLzNZjQCNNLWLCRZWQRzNW +VpJHFpgfqdFqqHFGHVSdGmZZRnSsnLjNZCWmmszLSz +drrJRGJVrcMBDwhDbcMh +hghHTgbwHbDqHrgbbbSLzzFNnsVqNVBnLnfs +jMlcMRRmGcRlZQMMJRJSPPmCFzBBzpfBfLfpFLszLNNFVCfz +JlmGlZmvRMgvrgbrrSTw +ZtTTHpprHtQtHtpqPmjVSScjVSjjSNqw +nRvGWhRbnRGzvWCBGPjNdwcSwcnlJdmmSj +vCbsmbWfRsRWWzsMWBQFFrDZpgpFHLgQLMgQ +QlJBfZssjgZsQsDNbScdDZdNcvvF +zrGrVVpVMWMwMVLMwqVWpRdNFSDcFNDFbSddqHldDdqd +VLVtrWpMRCRLWGWMRwVGCVPfCPJnBTQsJlmjsfsPBQjC +GQqpnnFWFcnWpBMhhSZRhQCCCfRQRD +HsbcczlrjzflffLVfDlt +jssvwsHPsjzWdMcgBnvqMB +JMJdMptTbbtpJZhtTMZwJdNWQBPNBlwNBNQWHBCHHPlg +rVqsvVmjrcCqCPsPNQgnsnQglW +rVvzfqvLjFVDVcLjCqLmJFGbpJpRJTGMtbRpdGRG +LrmwdZHlSlcVlSrrDWCzbtpjpgzjtD +gBGgPTTBqPQTqnnPJhMTTCzzppnCvptpnCtzNpDntz +qQPTTPshRRQqcgsflHZcsSLV +smvdTvlPzslmVjMhJlbjrblJ +cqFffFffcwFfpcDSjcnZwZWrQVDrQBhNbrrNBbWVbNhr +nSpRZRjpcHqpCpqnqFRGmvPLtLGmCdCsGLLdtC +PJPLPPHDdPvdnbctfcpt +NRrGNjNzLjltppvpRSRS +LzVWLjTWGLQqBgZWJWBBFg +znzccGnswWrWNCpvvdTCzddC +RfZlRDDDZflSBMhhhPSMMZpmpHHGNCGTmCJTmvmCvJGR +GbBMhhbSMhMffDMZPggSGfhVWLwjsLttWtrjWscVLWnQWswn +jwRzdZZhwhwHSQqpStJHhp +GVGPBvNPvffpvtvp +nsGGDVtFNGgGWjWlTwrwTmjwTR +MQtmmMMmnHGGTmhw +llqvqvvpqdvvrSfrpSfdfnhFSTMNDHFMNFFSGFwMHT +JqvvRgpCfrzCpqqzdfRpRllWZZBQJbVVtMttsVWJbjPbcc +zgqBczqBbBGjdHVgdDFd +lNVhNNnLtZZZGWjdWrSW +PCQhNflCtCwtJwhClMmVcRmpbPqTcmBqpm +wWbqbTwVrQLqlMtrZtZffNfMfP +vhjqqRpRvZsfssZN +ccBjJBqGpRhDGbJldHlgLwddLd +hVScjtgcchVhSgZJSchVwLbNLWnLNwwnwrbWNLgr +BzMdBqzBQzZQPpfrsrbrNdNLsrRR +zPMzmmGpmzGlFQPPmlZPzSVTSVJJcSlcDhTlvSCtjJ +hzdwlqngZQvDfmzF +vcRrcsVNpVQsFfBfPPQB +HCHVWVcCpNMHWRjLwhvhggdjvggM +LBHCTPzHHBcClwppwjjNNl +JddZMRmmssVmvDvJddSJWVWBwpQvwfpwvwwfrrFNQfwjpl +BsVMVZDVZssZhMhJqLzhzzHzPTPnLGqb +bcnNQnBTvvvWTQTJhdHJzhSjpJJjStjd +mMwqwVMMRwhBtjdSVBVl +GfsrwCRmZBcZTvBf +bBjQmmmqWdLqvLbWLtNJccNZZgCBCZgCTg +phfpfzpHPDwfMwvVzlhlJJlggcZgZcRFFlCgZg +zfhpMMDpVVzzhHhzzMMwfnMfSmQmbQvvWqWjmLSqdQmrqjjn +ZzdcbGTwLZwPPwpMPWpjWPpWChBC +nmznNRFHQrqQvqqmmMfWWWpMFjspWFMWjB +zqRDSmDrmvnvntGccGdcTVtLTlVG +nfnVscTcDzsZqmRtjtsqjJ +wnnhWPWLBNwPLHdQdWdHPHLdJjqRRqrvjrmqFtvRqtQRqFjm +bWhHdBBLdLnShWHcTVzCfCpVDTblpT +WSjVFSVTSWvgvFwpgTTFsfdVclhNCfsHnHlHsCfV +zRqLqZqZZQcdNltfHzsd +ZqBqGLLRcjWWBvTT +wwBqgZfbgbZsvWmfJrtFrdDttqdFdLct +SNSSVTnnThnCSPPnzVztQJJQdLPtFcGLdFGDsD +lSlszRVsRjmmfjfRRf +NGzGWSLzMdQtcctbgWjt +vqTnfVVHBffnCmHgMtrrrHrgtcrt +vqCDVlFnnCnnBSzlspSzLSNMLL +rwVlfVMRSTqTgRhT +pppjLtpZjHFHNhsctSqDDVtnns +HNjJLFBFHZZzWbVBZGfwdGrMfCCfGvmzlM +zFzztqWnJttqqzJtdqbtqbPVMGcGZwgPGVwGQjwCCggMZQ +hssLlrsSrBmBrZGSfgwgSwQCcj +BmBBDBHLrlNhLNHrpsDvLJNtddczdRzzcTqJzzdWnc +pLWcpGSscLQPDzLBgdbmdZHBHmZB +lntfCfVMvtttqVqnZHHbbBZmwwwCdHhc +qqRJFfRFRNlTzSSWWzSJpc +DrphDfFrdGGjTTgTgCSV +vbsMZPnPvqHMQvtZZPWBBVVBJjWSVTPjJC +nMbnsRSQvvLRMsssQhdFrcwczLlDrrDzhz +LLlDQlcLDqLSlCDRlRDCqTTzzgNzShSBdZGBFBBgNG +nHnMwPPbrWwpmztdMtzFZZFtTN +PJfbZmHrpJfZDRLlDlLcVsVJ +wZwQsrrzQFQSrRSFbzDglcdCcdljjdlljcvslLhv +VPqGJtqqfnJcCLFllFMGcd +fNHPJWpmHfffqJHmwzgbrBDZrDbFRQ +HggtSJtzrgltshlTsrzbzsgbFddfffDZwZRZZZGfGDRTNNZZ +LnjWccmQBPWqmWPqMfFNdGBRCDFFSfDfRd +WpMjWpMcWSjqqPjQLmvmjMgllsbgbtvsrrtvJgJHhrHl +PMcMcBpztMztzPPhbSgGSvgfHD +nsmsVQVZVQmTRmddrLgfFhfLgLDzgvffDhbF +dwsjrQQrVwTmZRTzsTdBcjqlqWpcCCppcllltC +DbVjbjwNMDTCVbhbTNDrVTTmzFGLFLHcLHzmcWFczLHwmH +PPWsfBZngtZqZZnPgZnPqvmFmczgRHGmGSRRSSLGFF +sntBlWPdnspnnPQZtnNNNMjhMNrVMjMThjpr +rCrCWVvvWDnBWvDnWDMCMZTpThhGGhGRGqGqZmhZqV +NNjQMzNzQjjwNmJNmZddpdTG +QwtwLPcjPtQlHSSslzwHSlPQDfDWsggsvvBvDvnvgngCnvFM +ZDCbvbDvvHbCGTWpZTtWWQnn +hLqzLVhVwNwVfMnJrfqMzWrQddgmQQGdgpgQGmgjTj +wlVNwJJfVRLPRnHRbFHRsP +lLmvLGRCrmDwVPVsjmtBBQmt +NSHWNbzSHWpSpfChqqJPnzBJsBPPJnQJ +pWcHbNfWpgZcWbhbZSgchWpRdCZMMdGDFFrLwlwMRRZFdd +PnNrFVZQHNDrmNQPflbhbfqbvhwbVfvq +TCdTtpCtCWTBMtjTJMWtBMCLSfvbqqzqbljflwDLvLjLLf +MCCGcpCJRWTTMGmPnDFNQQnDns +FhSmttZmgLjJVMlVGllGjcrj +NRNvNWNCdnNrBvWvwRdWvvvRCGcbVVQbMQGcGcVcMclzVVlG +qwBsBWwnvdtHJJSrtHsr +wnwPrnBBPgqRPjhgCRGCLvvbRZcJvCbb +dWVdVdlMHtsTslMtzztFGGczvvGJzL +fMflHpddJfNNVfNWWmDqQpwBgwnjPBQDjqBh +WttGctsNCNrfwTMlBtlr +HJLzLJJVnFjHbnbVjDHDdFqwwffTTfTGwrqwBBTT +jgVgJSbnHjNWsWCSWWGG +ssLfHLvrrfMMlBMRMfpd +qbbhmGCCVDQhQQVzDDbqmhMBtDZdBZHlddpltpBpdlJd +QhQbzqCGzVzSbqzLHjLgrcjvPSnnSL +NGGZGsGFCGvCcnCcgnZWrPHjsJjHjTDjJHfrjHDP +RzzQmwwmdRRwMqRQmZwtfrDPfTfrbjHqrDPTHr +MBLphmLpSzdRlnWZCNcGLgLG +LwPPHZLLWRMWMsHqTCjmTTjSTn +lFpNNpzplbfphzNcQzVcpvzsnqTsggmnjfgqCDsnCDqsgS +vFJJhQVhbcVddLtmWZJdmm +GwMNMGBMRMGjdSGsDntglDrDGQ +WTmPPzfmlQrsnQmg +ZPTJVvllhBwvLvwRwj +nlSvqqFqzfnbnvFwwsGHTBHgPfWsTrRPgG +dMdjphVhhgdLVJhNRBGPRWWBBGPTTGHV +thJgLpghLNLhNQMCtdMhSmFlQnzzwnbzlbqqSQFb +ZJJLBWhJBNwJwLvgRgGRgbZqbHTbGT +cCrfFFnzjmdrdrmmzsgSPSHSbHWPRgrgGR +dmCFntnFctjfdVtttjtDVncfBDlNJJppwQMwNBNvvplppWNh +GGNNNbNbqmsmTVbCDQQhDJQT +rgPvdgMdPdBddvMcrMnvgcSwhClTTJCwClDTvLJJthTlth +zBdWpnDBDmfFGRffzH +WNNNWcDcdVHNQTNT +lLvLctvrvvvPCpHLQQTZVQLTTHBV +zltgpbPCrrmtlmrlhhbqcWMqDDMDFMfbGScc +dzSHRCGZGdRQWQWtllWB +mNmbLbbmwjsmsNjDmcPvpVHBVPQvWDWBBpvB +jnmNNrLcnnjjHhSCdGMSfrfd +mgGvfvJSmSSrbvScmGccTPCqNnRjlpNNfNjqwqlpNpfw +zZLLQFFFtsFwWjjRqbbCsW +hBBLBdFHddVrGbVc +bJGchsCcHwbHfgvg +qdlSSNqLPqlPQZDffgfZRZMghvZr +PLtqtFTPNLlWlqtQqqQzBBmcnschGtjtnChmzC +llNLDLzjDtCTVtClCDMHSlmwdmmdSmddwZSS +gPJszvsBPbwSHZRQSJQJ +bgFssFPcWhDjCzLcnNDD +ZTGMwdhMwMJphZMJlNdVBCnncNPLBCCRPnCncn +fWsqmfSsqvfFFFvmWjfSSsPLCwVPRnPRCmRnRRCVzRCV +FQfQfvStwjtqsjvvQWFfWqWtlMDdGTJJGdMdhJtDMbllDZ +DzZLpBDptpVPrrrFPqRmBj +WsfCTTgMllCWJMlhslNsCFJrGqvmRPqmqZjGFjvmvm +HfghcNghHhgNNfbDDZdcdpndDzpt +RRBRdJfccVRdDJqdDrvwShwvztWJlWwSJn +mPtCHPPmHbmHNZjjjQHbMSgrSWhWzWnnQwvzzrlrll +tpFmjpmjFMCmppmVTVLFVfBqTqVDLd +jtljZcTcVVtdggVmdczzzDPzvCsvRbDsDmvm +MHHnnJMFMNpwSNprpMJrfsbPRRbWDGLbHLDRvzzssR +rJFNvQfBSwQBwNwldZTqTtctQchthc +WsWTWsfjgTJGSnTz +RHNmvRLCpJclcNcvHpNcPBzgQgMnnGFnLFgPgnPF +mHlcdbbccZcCCCNZZNcCWtthWbWqwwJsbDfthfwW +vFFzppnHFrjmpljQhg +JPGfPWVdwfPgQzVQlTrQrZ +PwRJfGDBfCHMzRHNHMNR diff --git a/2022/03/test b/2022/03/test @@ -0,0 +1,6 @@ +vJrwpWtwJgWrhcsFMMfFFhFp +jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL +PmmdzqPrVvPwwTWBwg +wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn +ttgJtRGJQctTZtZT +CrZsJsPPZsGzwwsLwLmpwMDw diff --git a/2022/04/a.rs b/2022/04/a.rs @@ -0,0 +1,7 @@ +mod common; +use common::*; + +fn main() { + let contained = |a: (i64, i64), b: (i64, i64)| a.0 >= b.0 && a.1 <= b.1; + println!("{}", count(|a, b| contained(a, b) || contained(b, a))); +} diff --git a/2022/04/b.rs b/2022/04/b.rs @@ -0,0 +1,8 @@ +mod common; +use common::*; + +fn main() { + let overlap = |a: (i64, i64), b: (i64, i64)| + (a.0 >= b.0 && a.0 <= b.1) || (b.0 >= a.0 && b.0 <= a.1); + println!("{}", count(overlap)); +} diff --git a/2022/04/common.rs b/2022/04/common.rs @@ -0,0 +1,20 @@ +fn get_ints(line: &str) -> ((i64, i64), (i64, i64)) { + let i = line.find('-').unwrap(); + let j = line.find(',').unwrap(); + let k = line[j..].find('-').unwrap() + j; + ((line[..i].parse().unwrap(), line[i+1..j].parse().unwrap()), + (line[j+1..k].parse().unwrap(), line[k+1..line.len()-1].parse().unwrap())) +} + +pub fn count<F: Fn((i64, i64), (i64, i64)) -> bool>(condition: F) -> i64 { + let mut line = String::new(); + let mut sum = 0; + while std::io::stdin().read_line(&mut line).unwrap() > 0 { + let (a, b) = get_ints(&line); + if condition(a, b) { + sum += 1; + } + line.clear(); + } + sum +} diff --git a/2022/04/input b/2022/04/input @@ -0,0 +1,1000 @@ +5-96,6-99 +29-97,80-97 +3-87,3-4 +12-12,6-12 +64-65,24-66 +52-54,1-53 +86-89,85-88 +37-69,38-38 +81-96,47-75 +1-13,18-44 +46-93,46-63 +12-75,65-75 +27-58,27-34 +10-74,83-87 +17-19,18-95 +96-96,10-95 +1-90,7-89 +62-79,90-98 +5-93,6-96 +17-82,31-82 +1-2,1-12 +37-50,49-92 +21-65,20-79 +7-61,8-91 +2-6,1-99 +51-92,51-52 +18-18,20-94 +21-26,27-69 +7-86,6-86 +71-71,72-99 +34-96,95-95 +63-64,11-71 +85-87,42-86 +3-4,4-74 +14-14,13-97 +8-12,9-10 +70-78,65-79 +6-10,5-5 +4-78,46-78 +21-21,22-94 +20-21,19-19 +7-56,6-56 +16-84,84-84 +8-14,15-88 +61-90,60-63 +25-75,42-75 +39-54,50-54 +48-86,48-71 +4-45,5-5 +55-55,57-87 +1-97,1-54 +39-44,39-41 +10-41,40-41 +75-87,4-88 +11-88,87-89 +10-74,75-75 +4-98,5-95 +1-70,5-93 +85-90,85-91 +11-33,8-32 +6-79,5-79 +51-97,50-96 +16-29,16-20 +49-56,9-56 +35-91,34-91 +2-6,10-58 +29-55,54-55 +15-53,15-59 +39-91,44-46 +96-96,95-99 +33-49,33-48 +61-96,61-95 +20-86,18-86 +18-98,17-84 +13-20,8-14 +25-39,24-25 +23-32,27-37 +25-51,5-24 +44-91,45-91 +83-83,37-84 +87-87,17-86 +24-42,23-42 +1-62,49-62 +40-82,88-91 +58-91,59-93 +12-62,11-53 +17-36,37-74 +13-70,71-71 +17-60,17-77 +15-48,63-74 +3-89,10-90 +35-36,35-82 +74-99,23-87 +15-94,15-91 +99-99,23-86 +60-89,88-89 +25-83,33-84 +12-83,12-13 +9-68,8-68 +57-99,18-57 +24-31,24-64 +70-97,71-86 +10-22,15-79 +24-77,16-77 +82-84,66-85 +83-84,50-84 +9-98,8-98 +5-77,76-77 +5-94,6-90 +48-57,34-64 +18-49,25-50 +15-85,1-14 +15-72,15-91 +10-82,9-96 +4-4,3-87 +9-93,10-10 +2-92,2-85 +20-95,21-21 +53-67,66-67 +2-97,1-97 +49-72,12-66 +48-57,47-47 +86-95,95-95 +41-87,41-75 +37-83,62-84 +75-90,38-63 +35-95,22-36 +70-78,42-77 +23-99,98-98 +49-58,2-62 +16-35,10-18 +24-63,91-98 +34-36,35-72 +19-94,88-94 +5-28,3-3 +9-81,10-82 +68-94,99-99 +5-53,3-54 +56-91,2-91 +7-9,10-43 +17-71,72-84 +19-55,18-20 +13-93,85-94 +4-6,5-53 +13-99,69-99 +29-31,29-40 +47-81,48-48 +78-96,79-99 +14-88,89-89 +42-51,43-75 +86-98,84-96 +36-57,29-37 +71-84,83-83 +5-68,5-88 +3-86,29-86 +79-97,7-63 +36-49,47-63 +17-45,4-42 +2-17,16-83 +53-66,54-86 +81-99,17-80 +9-37,29-38 +49-50,22-50 +81-81,43-80 +28-75,37-76 +4-98,3-98 +5-11,11-86 +5-70,69-81 +70-70,69-87 +17-57,16-57 +16-92,14-92 +19-22,13-22 +32-90,5-91 +37-73,8-73 +4-84,1-2 +22-53,22-61 +75-99,74-97 +57-81,13-81 +32-33,12-33 +56-78,56-92 +11-84,85-85 +8-49,49-74 +6-91,7-70 +38-93,93-93 +92-92,35-91 +95-98,10-90 +5-36,4-92 +36-36,14-36 +1-59,42-59 +88-92,8-47 +21-57,6-22 +7-86,12-99 +29-63,97-99 +12-79,80-80 +20-22,24-92 +95-96,25-96 +12-26,13-16 +54-58,32-58 +64-65,60-64 +36-78,35-35 +3-55,1-2 +9-56,4-40 +32-36,76-96 +1-2,3-99 +69-95,14-97 +93-93,78-93 +78-78,59-79 +23-77,10-78 +7-71,70-71 +8-93,2-94 +3-3,4-98 +77-98,5-98 +16-16,16-98 +17-48,16-17 +98-99,3-80 +41-63,41-55 +54-54,53-86 +32-63,40-46 +77-78,18-77 +32-55,33-33 +89-97,66-97 +6-90,90-97 +3-81,3-64 +9-99,3-93 +6-99,5-94 +62-93,86-94 +95-95,11-95 +17-99,8-13 +34-84,35-97 +23-23,22-85 +85-85,22-85 +8-24,7-44 +9-92,9-33 +1-63,1-96 +28-97,30-97 +12-90,8-89 +14-14,2-15 +38-79,38-39 +54-55,55-57 +46-80,34-79 +12-80,11-95 +9-56,8-56 +64-94,28-93 +14-14,15-95 +3-43,44-51 +19-61,5-5 +62-99,15-95 +67-78,77-79 +23-40,24-40 +1-55,9-54 +6-81,1-80 +4-84,4-85 +4-4,6-94 +68-89,20-67 +10-79,9-11 +26-52,26-27 +16-60,12-60 +92-92,7-92 +51-51,56-72 +2-7,6-99 +35-36,36-36 +98-99,8-97 +87-87,4-86 +83-89,68-75 +6-92,6-91 +64-74,65-65 +14-70,15-73 +18-22,18-56 +3-99,2-99 +7-95,2-96 +34-82,34-34 +46-94,45-94 +14-52,1-13 +29-93,28-28 +1-40,2-32 +24-28,23-28 +55-83,18-65 +3-84,1-84 +2-57,7-58 +7-21,3-22 +20-78,20-79 +88-99,32-46 +25-58,57-99 +37-84,37-70 +18-76,18-80 +14-99,31-98 +54-83,54-83 +14-14,2-13 +1-81,1-20 +3-54,4-89 +15-48,14-14 +7-76,75-76 +4-4,3-16 +11-12,11-97 +27-90,28-60 +4-99,1-39 +10-62,41-62 +8-93,9-92 +14-78,27-87 +10-25,24-25 +16-42,15-93 +25-68,76-89 +46-46,2-47 +67-96,65-89 +53-54,53-53 +40-74,15-26 +58-75,57-59 +12-17,16-17 +11-31,30-66 +16-49,17-49 +7-82,15-82 +42-60,41-41 +32-34,3-33 +5-7,6-59 +27-64,94-99 +17-72,34-73 +12-97,12-13 +53-61,52-65 +1-97,1-96 +85-86,27-86 +11-85,10-85 +78-98,19-77 +6-99,98-99 +58-58,10-57 +13-91,12-93 +77-80,76-80 +22-24,23-80 +80-80,28-81 +21-74,5-19 +35-87,36-74 +7-68,82-82 +2-35,10-74 +39-66,40-54 +21-38,29-61 +18-59,41-60 +14-94,97-99 +47-53,54-71 +28-84,49-85 +71-95,70-88 +6-98,6-51 +7-26,27-27 +18-79,2-81 +29-79,28-88 +16-16,16-61 +11-49,48-54 +28-28,27-84 +9-94,94-95 +3-8,2-43 +3-89,89-89 +57-79,60-78 +27-96,28-94 +5-81,61-80 +34-63,64-79 +12-14,15-96 +8-99,24-99 +14-14,15-81 +3-78,12-95 +48-92,48-93 +80-99,1-98 +79-98,87-95 +5-77,77-78 +36-41,36-40 +5-86,1-6 +10-66,11-11 +48-74,76-84 +66-98,19-66 +8-53,52-52 +28-99,19-28 +9-68,63-65 +2-6,1-97 +22-74,22-86 +5-8,7-50 +8-80,7-87 +91-95,77-82 +2-21,97-99 +1-2,3-74 +2-94,1-98 +3-93,94-96 +1-2,1-25 +30-67,30-70 +52-96,96-98 +81-82,71-82 +24-48,4-25 +4-50,6-50 +89-89,88-88 +97-97,18-97 +47-95,46-96 +5-81,4-92 +1-1,2-84 +97-97,1-98 +8-32,2-33 +5-57,4-56 +30-53,25-29 +6-16,4-11 +90-90,33-89 +80-81,80-96 +1-2,1-61 +62-73,62-72 +47-82,47-83 +17-97,17-17 +8-89,2-7 +2-91,67-91 +29-67,29-66 +2-99,3-96 +59-89,88-88 +43-73,43-72 +23-67,23-68 +5-75,75-75 +10-97,9-11 +33-82,33-34 +45-89,46-46 +4-97,4-93 +7-16,16-79 +17-21,20-36 +65-95,96-96 +36-63,37-37 +3-78,77-77 +4-96,5-76 +21-72,20-20 +46-73,46-72 +70-98,71-99 +48-99,8-99 +1-98,1-65 +69-69,20-70 +10-37,38-55 +45-46,36-46 +35-47,35-48 +8-86,7-86 +12-77,38-77 +9-26,5-26 +12-89,12-88 +11-68,29-69 +72-72,5-73 +50-83,10-82 +3-67,3-67 +12-97,12-89 +14-99,15-95 +17-67,18-39 +4-88,4-87 +28-28,22-29 +31-38,31-32 +6-46,6-16 +48-48,47-54 +24-95,25-40 +73-89,73-91 +13-17,11-20 +29-51,30-52 +12-86,12-85 +36-52,35-52 +6-99,7-7 +6-6,2-5 +41-74,73-86 +31-87,73-87 +20-90,20-87 +47-76,46-76 +36-37,38-78 +74-97,73-73 +63-85,62-93 +1-95,97-98 +5-90,5-93 +19-65,52-65 +4-54,21-54 +8-8,7-86 +94-98,2-85 +46-46,47-49 +53-53,52-61 +15-94,13-15 +56-73,27-74 +95-95,3-95 +61-63,7-62 +29-85,97-99 +39-74,73-75 +6-95,43-94 +3-3,3-16 +3-98,99-99 +35-94,36-94 +14-75,76-77 +39-45,38-38 +6-6,7-94 +3-56,7-55 +92-96,36-81 +17-85,18-85 +87-90,10-86 +19-91,18-96 +61-72,60-60 +62-86,85-87 +87-87,23-86 +36-89,37-37 +1-94,1-95 +5-60,5-61 +96-97,96-99 +23-31,15-30 +14-52,52-52 +44-87,43-87 +25-99,20-26 +53-85,55-85 +44-62,43-98 +77-78,64-78 +85-86,85-90 +25-43,41-43 +32-65,64-66 +18-87,18-81 +6-60,7-7 +32-79,78-80 +13-18,13-13 +14-92,14-14 +1-98,1-97 +21-23,22-98 +19-61,18-18 +1-98,3-97 +6-64,14-64 +2-7,33-96 +75-77,11-76 +40-52,31-77 +21-35,15-36 +31-64,13-32 +89-90,51-90 +14-77,34-78 +51-85,52-96 +73-73,20-74 +36-44,41-44 +8-36,32-40 +44-94,93-98 +5-54,5-53 +45-97,4-42 +28-50,25-27 +58-76,58-76 +6-78,77-78 +19-96,20-90 +85-86,1-86 +12-70,11-11 +9-85,86-86 +45-46,44-70 +43-74,10-73 +60-91,11-91 +1-65,64-87 +13-14,14-79 +46-46,45-45 +58-89,59-59 +3-98,1-98 +23-53,8-53 +9-99,8-10 +12-75,12-74 +8-70,24-71 +57-94,8-94 +78-92,77-92 +3-54,1-36 +89-99,87-92 +2-86,86-86 +76-84,83-93 +17-70,18-72 +11-89,10-82 +8-99,9-18 +39-53,39-53 +13-46,13-57 +2-95,49-56 +52-54,52-57 +30-58,31-58 +10-45,10-46 +9-75,8-72 +5-75,1-75 +2-67,4-66 +9-93,10-10 +1-99,75-99 +24-90,24-25 +15-91,15-93 +49-58,64-92 +33-73,73-74 +10-76,12-77 +16-88,87-87 +60-91,50-61 +40-61,39-75 +61-62,2-62 +7-88,7-8 +22-97,21-94 +61-61,25-60 +21-81,9-36 +66-95,16-94 +3-97,1-1 +22-81,21-21 +36-48,35-74 +19-57,29-56 +81-82,14-82 +31-73,73-76 +4-92,8-92 +16-17,16-17 +9-97,10-99 +62-64,63-95 +10-18,3-17 +63-63,63-94 +13-88,8-88 +45-48,7-47 +2-65,3-98 +6-17,5-13 +54-79,53-79 +58-63,58-58 +42-64,8-49 +58-91,2-57 +25-98,12-26 +11-17,10-81 +23-23,18-22 +34-98,33-58 +28-56,29-57 +46-99,16-98 +16-78,17-17 +41-42,37-42 +15-31,14-14 +20-60,61-61 +29-48,23-26 +24-88,5-47 +17-86,4-16 +31-95,31-96 +15-62,22-62 +36-46,7-45 +13-94,9-10 +67-67,3-66 +33-33,21-34 +1-94,3-94 +5-99,6-97 +85-92,19-43 +67-90,81-90 +1-8,9-96 +30-30,31-53 +8-37,7-25 +8-82,4-28 +17-18,17-76 +59-69,34-58 +5-93,20-93 +3-97,99-99 +20-88,94-96 +14-94,92-99 +21-99,22-97 +24-91,23-23 +27-66,28-67 +98-99,1-96 +61-76,18-80 +30-86,85-85 +21-96,20-98 +47-83,10-47 +37-40,36-58 +80-81,21-80 +25-74,4-87 +4-68,67-68 +17-22,5-7 +17-67,25-67 +1-99,1-2 +88-96,84-93 +5-93,97-98 +4-89,90-93 +41-45,42-42 +16-80,15-83 +23-94,23-88 +1-1,2-80 +28-58,59-59 +35-36,36-36 +1-48,1-75 +1-5,14-99 +44-60,44-77 +97-97,6-98 +24-61,3-68 +23-35,24-35 +91-91,92-93 +30-48,29-58 +20-83,13-82 +17-88,18-99 +2-3,2-98 +63-63,59-64 +94-94,1-93 +40-47,5-46 +16-88,16-88 +26-84,25-99 +32-88,31-33 +29-80,30-75 +98-99,14-94 +10-34,35-35 +74-85,75-80 +43-88,42-89 +3-93,17-94 +5-10,4-43 +89-99,81-85 +45-71,46-46 +7-89,6-82 +2-2,2-88 +32-85,5-97 +55-91,54-56 +72-97,21-96 +18-97,18-19 +18-73,19-74 +92-99,7-88 +35-81,36-36 +3-59,60-99 +3-4,3-87 +36-97,28-97 +16-51,38-52 +5-25,4-18 +49-92,28-46 +2-3,4-92 +85-85,47-85 +4-77,78-78 +45-70,71-78 +93-99,79-99 +84-98,48-99 +1-1,1-99 +14-94,13-95 +21-44,22-45 +87-88,6-88 +52-96,95-95 +12-87,11-91 +47-72,11-52 +64-72,34-63 +25-78,26-26 +84-87,82-86 +55-63,23-62 +8-60,59-60 +9-40,3-10 +43-97,80-97 +8-95,3-95 +56-58,57-90 +14-52,15-52 +11-11,11-35 +20-56,21-57 +2-89,2-76 +1-72,3-73 +25-27,26-59 +35-97,35-42 +24-88,1-67 +71-83,71-75 +30-33,32-33 +2-97,2-2 +12-56,5-55 +18-67,23-94 +42-67,68-68 +70-89,18-58 +71-82,27-71 +24-69,25-50 +9-64,8-10 +68-83,9-83 +17-95,98-98 +8-17,16-18 +12-43,15-97 +30-76,30-96 +41-52,10-51 +29-95,2-95 +1-91,90-91 +10-89,8-90 +1-99,31-99 +62-83,33-82 +54-56,11-55 +4-54,53-55 +69-69,26-70 +47-93,46-46 +8-85,9-85 +48-61,48-97 +33-79,32-97 +1-47,9-48 +29-63,64-64 +32-93,27-90 +70-70,67-69 +66-97,67-68 +28-68,28-67 +21-92,4-91 +1-87,3-88 +25-76,21-75 +69-76,72-76 +88-89,40-89 +37-38,37-97 +41-61,60-61 +39-76,75-77 +14-28,3-13 +56-96,56-92 +85-86,9-85 +82-82,68-81 +46-78,40-78 +45-68,44-44 +70-83,30-83 +93-95,20-92 +18-33,29-30 +24-91,66-91 +1-77,14-97 +24-72,73-73 +15-71,15-16 +8-93,7-24 +14-44,43-43 +15-66,15-65 +4-58,9-61 +15-49,33-61 +1-59,1-60 +39-97,38-96 +91-92,4-92 +6-79,3-96 +9-94,95-95 +12-60,23-75 +51-59,40-50 +19-30,20-99 +72-97,97-98 +33-60,58-61 +3-10,3-9 +21-34,20-98 +3-65,53-78 +7-48,7-7 +61-71,59-60 +5-10,4-4 +87-88,8-88 +1-19,12-26 +6-89,26-89 +74-96,74-74 +16-40,10-12 +87-87,9-86 +5-7,8-92 +7-89,6-6 +44-95,45-59 +87-92,4-85 +62-63,43-63 +4-22,4-93 +22-71,21-38 +46-57,56-57 +39-90,39-92 +3-28,2-86 +35-84,84-84 +4-69,9-69 +34-34,35-95 +67-96,1-90 +10-54,45-95 +4-85,3-88 +26-97,25-99 +14-21,22-22 +52-66,24-86 +7-53,8-91 +99-99,7-61 +1-3,4-99 +24-87,24-94 +17-89,16-18 +13-55,30-42 +2-48,21-48 +31-38,37-37 +1-98,1-97 +4-21,1-3 +7-7,6-10 +14-77,68-77 +45-98,50-98 +4-96,5-96 +43-77,15-78 +32-51,24-60 +99-99,1-98 +41-41,42-67 +7-73,9-72 +16-77,15-15 +9-44,43-43 +13-76,14-61 +14-16,15-56 +1-65,8-66 +18-57,18-19 +24-24,31-46 +7-90,90-90 +1-81,13-81 +39-88,40-59 +2-95,1-1 +48-48,22-49 +12-90,11-91 +4-96,1-65 +13-63,36-64 +4-90,5-86 +24-93,96-97 +11-90,89-89 +30-91,30-31 +99-99,28-94 +18-55,14-94 +79-89,10-90 +98-98,27-97 +12-71,4-11 +89-97,21-92 +19-80,18-91 +51-58,13-55 +42-56,41-79 +57-75,57-70 +19-63,33-62 +77-82,7-85 +45-95,96-96 +97-98,11-98 +6-87,6-7 +3-85,67-86 +50-97,50-50 +26-50,50-68 +37-53,12-54 +8-29,8-29 +82-98,1-97 +16-16,17-98 +93-93,91-92 +5-99,4-76 +2-56,2-3 +6-7,6-61 +68-81,3-69 +6-84,7-84 +13-65,64-64 +92-98,5-91 +31-70,32-92 +1-51,51-51 +3-30,3-92 +68-77,53-69 +43-52,46-48 +82-96,69-81 +13-36,12-74 +28-75,61-76 +7-61,8-8 +20-80,20-51 +33-89,83-90 +13-13,14-92 +1-1,1-99 +8-16,15-97 +26-28,26-41 +62-80,62-62 +1-76,35-75 +7-56,7-98 +33-76,32-38 +8-9,8-50 +1-61,61-61 +14-73,14-96 +62-89,89-89 +9-9,8-99 +3-4,4-95 +9-72,8-10 +37-37,36-36 +18-79,24-80 +92-92,9-91 +29-50,29-30 +68-68,65-67 +39-83,79-83 +60-82,39-51 +13-96,95-96 +4-85,68-85 +44-49,48-48 +31-42,30-73 +10-74,9-73 +65-65,32-65 +91-92,8-92 +14-85,84-85 +34-41,14-40 +1-32,1-88 +78-80,74-79 +29-85,86-93 +24-27,28-97 +85-86,57-79 +22-46,41-54 +74-99,5-31 +8-11,11-85 +25-71,24-24 +29-95,11-96 +65-65,66-92 +9-53,4-53 +18-98,19-75 +32-39,35-86 +4-98,2-2 +10-69,1-70 +55-93,94-97 +6-99,2-7 +62-90,70-74 +48-74,26-97 +5-80,15-37 +1-97,84-98 +2-98,68-79 +96-97,46-97 +34-99,98-98 +66-73,65-67 +42-43,25-44 +5-99,5-98 +4-5,4-58 +78-91,6-91 +91-95,16-90 +32-88,88-88 +56-89,55-93 +5-25,4-4 +60-98,61-96 +58-61,57-62 +13-60,59-60 +19-29,20-44 +15-29,14-94 +4-4,5-11 +46-78,6-78 +29-29,29-72 +1-95,68-94 +36-51,50-51 +10-85,9-9 +15-60,16-93 +3-60,5-61 +7-70,11-69 +6-68,5-6 +49-84,40-54 +63-89,76-90 +6-13,9-72 +98-99,5-97 +71-71,33-73 +19-63,18-64 +32-76,20-77 +11-97,12-93 +11-11,3-11 +29-65,19-48 +63-64,13-64 +2-91,92-92 +85-91,86-91 +10-85,11-64 diff --git a/2022/04/test b/2022/04/test @@ -0,0 +1,6 @@ +2-4,6-8 +2-3,4-5 +5-7,7-9 +2-8,3-7 +6-6,4-6 +2-6,4-8 diff --git a/2022/05/a.rs b/2022/05/a.rs @@ -0,0 +1,17 @@ +mod common; +use common::*; + +fn apply_move(grid: &mut Vec::<Vec::<char>>, line: &str) { + let (n, from, to) = read_move(&line); + + for _ in 0..n { + let x = grid[from-1].pop().unwrap(); + grid[to-1].push(x); + } +} + +fn main() { + let mut grid = get_grid_from_stdin(); + apply_moves_from_stdin(&mut grid, apply_move); + print_top(&grid); +} diff --git a/2022/05/b.rs b/2022/05/b.rs @@ -0,0 +1,20 @@ +mod common; +use common::*; + +fn apply_move(grid: &mut Vec::<Vec::<char>>, line: &str) { + let (n, from, to) = read_move(&line); + + let first_moved = grid[from-1].len()-n; + let len = grid[from-1].len(); + for i in first_moved..len { + let x = grid[from-1][i]; + grid[to-1].push(x); + } + grid[from-1].drain(first_moved..len); +} + +fn main() { + let mut grid = get_grid_from_stdin(); + apply_moves_from_stdin(&mut grid, apply_move); + print_top(&grid); +} diff --git a/2022/05/common.rs b/2022/05/common.rs @@ -0,0 +1,73 @@ +pub type Grid = Vec<Vec<char>>; + +fn read_rows() -> Vec<Vec<char>> { + let mut rows = Vec::<Vec::<char>>::new(); + let mut line = String::new(); + loop { + let mut row = Vec::<char>::new(); + + std::io::stdin().read_line(&mut line).unwrap(); + let line_chars = line.as_bytes(); + if line_chars[1] == '1' as u8 { + let _ = std::io::stdin().read_line(&mut line); + break; + } + + let mut i = 0; + while i < line_chars.len() { + row.push(line_chars[i+1] as char); + i += 4; + } + + rows.push(row); + line.clear(); + } + + rows +} + +fn rows_to_grid(rows: &Vec<Vec<char>>) -> Grid { + let mut grid = vec![Vec::<char>::new(); rows[0].len()]; + for row in rows.iter().rev() { + for i in 0..row.len() { + if row[i] != ' ' { + grid[i].push(row[i]); + } + } + } + grid +} + +fn next_usize(line: &str, s: usize) -> (usize, usize) { + let i = line[s..].find(|c: char| c.is_digit(10)).unwrap() + s; + let j = line[i..].find(|c: char| c.is_whitespace()).unwrap() + i; + (line[i..j].parse::<usize>().unwrap(), j) +} + +pub fn read_move(line: &str) -> (usize, usize, usize) { + let (n, i) = next_usize(line, 0); + let (from, i) = next_usize(line, i); + let (to, _) = next_usize(line, i); + + (n, from, to) +} + +pub fn get_grid_from_stdin() -> Grid { + rows_to_grid(&read_rows()) +} + +pub fn apply_moves_from_stdin<F: Fn(&mut Grid, &str) -> ()>(grid: &mut Grid, apply_move: F) { + let mut line = String::new(); + while std::io::stdin().read_line(&mut line).unwrap() > 0 { + apply_move(grid, &line); + line.clear(); + } +} + +pub fn print_top(grid: &Grid) { + for column in grid { + let c = match column.last() { Some(d) => d, None => &'_' }; + print!("{}", c); + } + println!(); +} diff --git a/2022/05/input b/2022/05/input @@ -0,0 +1,511 @@ +[N] [R] [C] +[T] [J] [S] [J] [N] +[B] [Z] [H] [M] [Z] [D] +[S] [P] [G] [L] [H] [Z] [T] +[Q] [D] [F] [D] [V] [L] [S] [M] +[H] [F] [V] [J] [C] [W] [P] [W] [L] +[G] [S] [H] [Z] [Z] [T] [F] [V] [H] +[R] [H] [Z] [M] [T] [M] [T] [Q] [W] + 1 2 3 4 5 6 7 8 9 + +move 3 from 9 to 7 +move 4 from 4 to 5 +move 2 from 4 to 6 +move 4 from 7 to 5 +move 3 from 7 to 3 +move 2 from 5 to 9 +move 5 from 6 to 3 +move 5 from 9 to 1 +move 3 from 8 to 4 +move 3 from 4 to 6 +move 8 from 1 to 8 +move 1 from 8 to 6 +move 2 from 8 to 2 +move 5 from 8 to 4 +move 1 from 8 to 1 +move 6 from 6 to 4 +move 1 from 7 to 9 +move 5 from 1 to 7 +move 1 from 1 to 2 +move 2 from 9 to 8 +move 6 from 4 to 9 +move 1 from 6 to 8 +move 3 from 2 to 7 +move 4 from 2 to 8 +move 4 from 9 to 3 +move 6 from 5 to 4 +move 7 from 8 to 1 +move 10 from 4 to 1 +move 12 from 1 to 5 +move 1 from 4 to 9 +move 1 from 2 to 3 +move 2 from 9 to 1 +move 1 from 9 to 3 +move 1 from 6 to 7 +move 1 from 9 to 1 +move 3 from 1 to 3 +move 9 from 5 to 9 +move 2 from 2 to 7 +move 2 from 7 to 4 +move 3 from 9 to 4 +move 7 from 5 to 7 +move 5 from 1 to 3 +move 2 from 4 to 5 +move 1 from 4 to 6 +move 1 from 6 to 9 +move 4 from 9 to 2 +move 12 from 7 to 9 +move 2 from 4 to 9 +move 6 from 5 to 9 +move 3 from 7 to 6 +move 12 from 9 to 6 +move 5 from 9 to 1 +move 1 from 7 to 6 +move 14 from 6 to 1 +move 20 from 3 to 5 +move 5 from 9 to 5 +move 3 from 2 to 8 +move 1 from 6 to 4 +move 1 from 9 to 2 +move 1 from 4 to 6 +move 1 from 2 to 6 +move 16 from 1 to 5 +move 1 from 2 to 1 +move 12 from 5 to 6 +move 1 from 8 to 4 +move 29 from 5 to 1 +move 5 from 6 to 9 +move 20 from 1 to 3 +move 4 from 1 to 3 +move 11 from 3 to 8 +move 1 from 4 to 3 +move 4 from 9 to 8 +move 7 from 1 to 8 +move 2 from 3 to 2 +move 2 from 6 to 7 +move 1 from 9 to 8 +move 10 from 3 to 5 +move 1 from 6 to 1 +move 1 from 7 to 2 +move 3 from 1 to 2 +move 6 from 2 to 4 +move 2 from 6 to 3 +move 4 from 6 to 5 +move 1 from 6 to 2 +move 1 from 2 to 9 +move 6 from 5 to 2 +move 1 from 9 to 3 +move 24 from 8 to 7 +move 1 from 4 to 8 +move 5 from 5 to 4 +move 1 from 4 to 8 +move 1 from 8 to 7 +move 2 from 8 to 9 +move 1 from 9 to 7 +move 6 from 2 to 4 +move 10 from 3 to 7 +move 3 from 5 to 3 +move 1 from 9 to 8 +move 3 from 3 to 8 +move 4 from 8 to 7 +move 1 from 4 to 6 +move 1 from 6 to 4 +move 13 from 4 to 3 +move 17 from 7 to 6 +move 1 from 6 to 3 +move 2 from 4 to 8 +move 3 from 7 to 5 +move 14 from 6 to 7 +move 1 from 5 to 9 +move 1 from 5 to 9 +move 2 from 6 to 7 +move 1 from 5 to 1 +move 1 from 1 to 6 +move 1 from 9 to 3 +move 29 from 7 to 4 +move 10 from 4 to 3 +move 6 from 7 to 5 +move 1 from 6 to 5 +move 1 from 9 to 7 +move 1 from 7 to 2 +move 4 from 3 to 2 +move 1 from 2 to 9 +move 1 from 8 to 5 +move 11 from 3 to 4 +move 24 from 4 to 7 +move 2 from 2 to 5 +move 10 from 3 to 2 +move 6 from 2 to 1 +move 5 from 4 to 7 +move 1 from 9 to 2 +move 3 from 5 to 1 +move 1 from 4 to 6 +move 4 from 2 to 3 +move 5 from 5 to 7 +move 2 from 5 to 3 +move 32 from 7 to 5 +move 16 from 5 to 1 +move 1 from 1 to 2 +move 3 from 2 to 9 +move 1 from 8 to 6 +move 3 from 7 to 6 +move 1 from 2 to 4 +move 5 from 6 to 8 +move 5 from 8 to 6 +move 2 from 9 to 3 +move 1 from 7 to 5 +move 9 from 5 to 4 +move 1 from 9 to 1 +move 2 from 3 to 1 +move 4 from 3 to 6 +move 1 from 3 to 8 +move 6 from 4 to 6 +move 6 from 5 to 9 +move 1 from 9 to 6 +move 1 from 5 to 1 +move 1 from 5 to 4 +move 1 from 3 to 6 +move 1 from 8 to 3 +move 1 from 4 to 2 +move 1 from 2 to 3 +move 17 from 6 to 4 +move 4 from 1 to 8 +move 3 from 9 to 6 +move 1 from 8 to 4 +move 1 from 9 to 7 +move 2 from 6 to 2 +move 1 from 7 to 8 +move 12 from 1 to 9 +move 8 from 9 to 2 +move 1 from 6 to 9 +move 6 from 2 to 8 +move 2 from 8 to 3 +move 18 from 4 to 9 +move 2 from 1 to 6 +move 1 from 6 to 5 +move 3 from 4 to 3 +move 7 from 3 to 8 +move 4 from 2 to 7 +move 1 from 4 to 6 +move 2 from 6 to 4 +move 13 from 9 to 6 +move 1 from 5 to 2 +move 5 from 9 to 3 +move 9 from 1 to 2 +move 1 from 1 to 8 +move 1 from 2 to 6 +move 3 from 7 to 6 +move 2 from 2 to 6 +move 9 from 8 to 6 +move 1 from 7 to 8 +move 1 from 8 to 7 +move 2 from 4 to 6 +move 5 from 3 to 6 +move 17 from 6 to 9 +move 7 from 8 to 4 +move 4 from 2 to 3 +move 17 from 6 to 2 +move 1 from 6 to 4 +move 1 from 7 to 8 +move 1 from 8 to 9 +move 24 from 9 to 6 +move 4 from 3 to 1 +move 1 from 1 to 5 +move 20 from 6 to 4 +move 4 from 6 to 9 +move 1 from 5 to 7 +move 2 from 4 to 2 +move 1 from 9 to 7 +move 25 from 4 to 3 +move 1 from 4 to 2 +move 2 from 1 to 6 +move 3 from 9 to 4 +move 2 from 4 to 7 +move 2 from 7 to 5 +move 1 from 4 to 2 +move 1 from 6 to 3 +move 1 from 1 to 5 +move 5 from 3 to 9 +move 1 from 5 to 6 +move 10 from 2 to 8 +move 9 from 2 to 5 +move 21 from 3 to 6 +move 1 from 7 to 6 +move 2 from 6 to 5 +move 5 from 9 to 7 +move 6 from 7 to 8 +move 19 from 6 to 9 +move 1 from 6 to 1 +move 8 from 8 to 1 +move 1 from 6 to 1 +move 2 from 8 to 5 +move 5 from 9 to 2 +move 6 from 8 to 2 +move 2 from 9 to 7 +move 9 from 9 to 4 +move 7 from 2 to 4 +move 1 from 6 to 4 +move 14 from 5 to 9 +move 1 from 1 to 8 +move 1 from 7 to 9 +move 4 from 2 to 9 +move 16 from 4 to 6 +move 3 from 2 to 8 +move 1 from 6 to 2 +move 2 from 8 to 9 +move 1 from 8 to 7 +move 1 from 8 to 3 +move 3 from 2 to 7 +move 1 from 3 to 9 +move 8 from 9 to 3 +move 4 from 7 to 8 +move 1 from 5 to 4 +move 4 from 6 to 3 +move 1 from 4 to 2 +move 9 from 3 to 8 +move 10 from 9 to 5 +move 8 from 6 to 7 +move 13 from 8 to 4 +move 8 from 5 to 2 +move 3 from 6 to 3 +move 7 from 9 to 6 +move 7 from 7 to 2 +move 2 from 4 to 6 +move 5 from 6 to 2 +move 3 from 1 to 5 +move 5 from 5 to 8 +move 4 from 6 to 2 +move 4 from 1 to 8 +move 15 from 2 to 6 +move 11 from 4 to 9 +move 12 from 6 to 8 +move 1 from 6 to 9 +move 5 from 3 to 7 +move 2 from 2 to 6 +move 6 from 7 to 1 +move 3 from 1 to 3 +move 1 from 4 to 1 +move 1 from 3 to 9 +move 1 from 3 to 9 +move 1 from 7 to 6 +move 1 from 3 to 2 +move 4 from 2 to 6 +move 4 from 2 to 7 +move 1 from 2 to 6 +move 4 from 1 to 6 +move 12 from 6 to 7 +move 2 from 6 to 1 +move 8 from 9 to 6 +move 1 from 7 to 4 +move 14 from 8 to 1 +move 8 from 1 to 5 +move 1 from 3 to 9 +move 5 from 9 to 5 +move 1 from 8 to 9 +move 1 from 9 to 2 +move 1 from 9 to 3 +move 5 from 8 to 3 +move 12 from 5 to 4 +move 1 from 9 to 2 +move 6 from 7 to 3 +move 7 from 3 to 2 +move 1 from 5 to 1 +move 1 from 8 to 3 +move 2 from 1 to 3 +move 2 from 6 to 9 +move 5 from 6 to 5 +move 5 from 1 to 7 +move 4 from 4 to 1 +move 7 from 2 to 8 +move 4 from 3 to 8 +move 1 from 9 to 3 +move 1 from 9 to 5 +move 4 from 1 to 8 +move 10 from 7 to 9 +move 1 from 6 to 7 +move 2 from 8 to 6 +move 6 from 4 to 2 +move 5 from 3 to 1 +move 2 from 6 to 3 +move 2 from 7 to 1 +move 5 from 2 to 5 +move 2 from 7 to 1 +move 7 from 5 to 7 +move 2 from 5 to 6 +move 2 from 5 to 3 +move 3 from 2 to 9 +move 9 from 9 to 3 +move 1 from 6 to 4 +move 3 from 3 to 1 +move 9 from 8 to 2 +move 6 from 3 to 6 +move 8 from 7 to 9 +move 4 from 9 to 8 +move 14 from 1 to 5 +move 1 from 9 to 2 +move 1 from 1 to 5 +move 2 from 3 to 6 +move 12 from 5 to 3 +move 2 from 2 to 8 +move 7 from 6 to 2 +move 12 from 2 to 8 +move 2 from 6 to 2 +move 6 from 9 to 6 +move 1 from 1 to 2 +move 1 from 9 to 3 +move 2 from 5 to 9 +move 1 from 9 to 2 +move 1 from 9 to 4 +move 1 from 3 to 2 +move 2 from 6 to 7 +move 2 from 6 to 9 +move 5 from 4 to 2 +move 14 from 3 to 9 +move 15 from 9 to 4 +move 1 from 7 to 4 +move 10 from 8 to 6 +move 1 from 5 to 9 +move 2 from 9 to 5 +move 10 from 8 to 1 +move 1 from 7 to 4 +move 5 from 1 to 2 +move 2 from 1 to 5 +move 3 from 4 to 6 +move 4 from 5 to 8 +move 5 from 8 to 6 +move 14 from 2 to 9 +move 2 from 6 to 7 +move 3 from 2 to 9 +move 3 from 1 to 7 +move 1 from 7 to 3 +move 3 from 7 to 1 +move 1 from 3 to 6 +move 1 from 7 to 6 +move 1 from 8 to 9 +move 2 from 1 to 4 +move 1 from 1 to 2 +move 16 from 9 to 4 +move 7 from 4 to 8 +move 5 from 8 to 1 +move 2 from 8 to 3 +move 2 from 1 to 7 +move 13 from 6 to 7 +move 2 from 2 to 3 +move 4 from 7 to 4 +move 6 from 4 to 5 +move 4 from 7 to 6 +move 3 from 1 to 2 +move 2 from 2 to 6 +move 3 from 3 to 8 +move 5 from 5 to 3 +move 2 from 9 to 6 +move 3 from 3 to 7 +move 1 from 8 to 1 +move 22 from 4 to 8 +move 1 from 4 to 3 +move 9 from 6 to 3 +move 1 from 2 to 1 +move 4 from 3 to 4 +move 2 from 4 to 5 +move 1 from 1 to 7 +move 4 from 3 to 7 +move 2 from 6 to 1 +move 1 from 6 to 7 +move 18 from 8 to 7 +move 2 from 6 to 5 +move 2 from 3 to 4 +move 1 from 5 to 4 +move 30 from 7 to 6 +move 2 from 1 to 3 +move 18 from 6 to 8 +move 12 from 6 to 4 +move 13 from 4 to 9 +move 2 from 3 to 8 +move 1 from 6 to 2 +move 3 from 7 to 2 +move 1 from 1 to 2 +move 2 from 5 to 9 +move 8 from 8 to 1 +move 1 from 7 to 8 +move 7 from 1 to 3 +move 2 from 4 to 9 +move 1 from 1 to 6 +move 4 from 2 to 1 +move 16 from 8 to 1 +move 1 from 2 to 6 +move 2 from 4 to 8 +move 2 from 5 to 1 +move 4 from 3 to 7 +move 3 from 7 to 1 +move 1 from 6 to 8 +move 1 from 8 to 9 +move 1 from 7 to 3 +move 6 from 3 to 5 +move 1 from 3 to 8 +move 1 from 6 to 9 +move 16 from 9 to 5 +move 4 from 5 to 3 +move 15 from 5 to 1 +move 1 from 5 to 8 +move 3 from 9 to 8 +move 9 from 8 to 5 +move 6 from 5 to 1 +move 4 from 5 to 6 +move 2 from 6 to 4 +move 1 from 6 to 4 +move 1 from 8 to 4 +move 3 from 3 to 6 +move 3 from 6 to 8 +move 1 from 6 to 8 +move 21 from 1 to 9 +move 4 from 8 to 5 +move 3 from 5 to 7 +move 2 from 5 to 1 +move 2 from 4 to 8 +move 2 from 8 to 2 +move 2 from 7 to 8 +move 1 from 7 to 9 +move 1 from 8 to 7 +move 5 from 1 to 8 +move 1 from 7 to 8 +move 4 from 8 to 4 +move 2 from 4 to 5 +move 1 from 2 to 7 +move 1 from 2 to 7 +move 2 from 7 to 6 +move 2 from 6 to 9 +move 1 from 4 to 9 +move 1 from 3 to 4 +move 16 from 1 to 5 +move 16 from 5 to 7 +move 2 from 5 to 4 +move 14 from 9 to 6 +move 5 from 4 to 3 +move 3 from 3 to 6 +move 5 from 1 to 4 +move 2 from 4 to 7 +move 7 from 9 to 4 +move 2 from 9 to 7 +move 10 from 6 to 9 +move 8 from 4 to 6 +move 1 from 8 to 4 +move 1 from 1 to 9 +move 14 from 6 to 3 +move 10 from 3 to 2 +move 3 from 7 to 8 +move 6 from 3 to 1 +move 2 from 7 to 9 +move 5 from 7 to 9 +move 10 from 9 to 1 +move 2 from 4 to 3 +move 1 from 2 to 1 +move 16 from 1 to 4 +move 1 from 6 to 1 +move 2 from 3 to 9 +move 3 from 8 to 5 +move 8 from 7 to 1 +move 3 from 5 to 9 +move 7 from 4 to 6 +move 7 from 1 to 5 +move 2 from 8 to 3 +move 1 from 7 to 8 diff --git a/2022/05/test b/2022/05/test @@ -0,0 +1,9 @@ + [D] +[N] [C] +[Z] [M] [P] + 1 2 3 + +move 1 from 2 to 1 +move 3 from 1 to 3 +move 2 from 2 to 1 +move 1 from 1 to 2 diff --git a/2022/06/a.rs b/2022/06/a.rs @@ -0,0 +1,9 @@ +mod common; +use common::*; + +fn main() { + let mut line = String::new(); + std::io::stdin().read_line(&mut line).unwrap(); + let i = first_index_n_distinct(line.as_bytes(), 4) + 1; + println!("{i}"); +} diff --git a/2022/06/b.rs b/2022/06/b.rs @@ -0,0 +1,9 @@ +mod common; +use common::*; + +fn main() { + let mut line = String::new(); + std::io::stdin().read_line(&mut line).unwrap(); + let i = first_index_n_distinct(line.as_bytes(), 14) + 1; + println!("{i}"); +} diff --git a/2022/06/common.rs b/2022/06/common.rs @@ -0,0 +1,20 @@ +fn all_distinct<T: PartialEq>(a: &[T]) -> bool { + for i in 0..a.len() { + for j in i+1..a.len() { + if a[i] == a[j] { + return false; + } + } + } + return true; +} + +pub fn first_index_n_distinct(a: &[u8], n: usize) -> usize { + assert!(n > 0, "{} must be greater than 0", n); + for i in 0..a.len()-n+1 { + if all_distinct(&a[i..i+n]) { + return i+n-1; + } + } + panic!("Cannot find {} distinct in a row", n); +} diff --git a/2022/06/input b/2022/06/input @@ -0,0 +1 @@ +qvllndllhzhfzhhdzhddhjdjggvnvhvccmffwllqgqmmfjfqfhhtrrzczjczzlplddfpptqqfbqffmnmjnnqppfjfccgnnmqqsvvdbbgppjvpjvpjjctjjttwtrrdldlcddrvddqndqnqwqwzwfwwzczggcppgzpzhpzhppprfffbhhwmhhtftstrsrvsrvsrvvshvssnwwpllhfhnnfflcltlblzlqlvqlvlcldcccpptggtdgdjdbbrggmbmnncscbssqrrjddvcvgvfflpppgpvphvphhpcpzpzvvctvctvthtwtfwwbrrhhlplmlwwlqlnlhhtmhmmqlqplllrvrgvrvrffzfgfjfjtjmjvmjmwmvvjffmpfphfhvfvmfvmmhpphhltthgttgccqggpzpfpqpcpvcpvcvvqtqvqbbrlrtllmrmllhmhvmhhvzhvzvrrrzjzbbtvvbgvbbfnnqndqnnpnbnbnlnggwqggmgmqmgmbbmccgqcqbccpvcvnnhvvrvlrrcwrcwrcwrwbrwwzbwbdbfddpttntzzjszsnznbndnzngzgccjrcjchcffmlmqqlrqqzsqzzsbsnsttzpztpzpggzrrttbqqplpqlqjjqcqvccdzdccthccvfcvvqvhqhfhhzwzpzwppgpttntssflfjjrwrqrjrppptlltptpvttpfpwpswpppzzsrzssqllbnlljpllrjllsrlrhrdrmdrmrrpsrprnrffgrffdqdhdqhhrhggwqqlddsbsqbqtqdtdhdvhhbdhdzhdhhtrrppzddgfgzgpzpvpfpnpptggltggbnbppqffzfrzzzsbsrrdgrddwsdsqddhpdpbpvpfvppfsfgfngffzmzbzlblclsccvqvqmmjtjqtjjlcjllsddjqddhldlvlrrbgbrgbrrdzzpfpggqnqbqrrqbbgjgppqgpgwgqqndncndnpdnnbvbnvnwnjjgppzlplqqdgqghqgqzggjssqmmwwcfcpptrpprggrppgbplmzwmdtnpqwzcrthqbppwbgcvgqrpfpnbscnhvrllpvpqwnsslcjrqtvdccprvqfrpswtpvzdzlgtmmvppdmhgdbbsmrbqpqspdhpqgfjznqzphrnggcbzhdqrgvzcfzrhtrlssgmjjghqsjtghhnwjffqrrfslfnsvvdvfjqbfpffrrstdhggvbfwtfpfgswqlfdrnjpjmwzptlbmwgghgwqrphcrvfmhrplllgbnjlprllmjwccphsflntgpnbmdbfqcdsbgvrnfznfrlcfvswqfrqvdnbjsflnsmlcrdstzppmcvbgdtcvgztbdzqbwhmwcfvbwjjcdgbnwjwzrrdqhpgscwtnztjsfstzfwftcldjgvdvwbzrlbdslwttbqpnlwbjcjwqgtrgcglsgtdqbqbnqznptzzbwffwlwzvvtdpcjbvhnswzptclpbndcdvsfmcrmwwgzdfsszqjjdztmtsqgfqzjpctfdpwnzbpnzzwngqnghntblndfrnjzdrmgbqmzbdqfzctrgshwqgfgqssqjltrqlzjswjhmpgwwjdwcjpnsvgrvbfpmlmmwzmbdjwsrjthppfrccjgnmwlvqlprgslbwtbbzlqbznczmsmhsfdcqnwblprcpbzzwfllbnldvpjcwsdhglrzjsptmsjdjqzsmgvhjfjrrtvvbjlmzjsntnrggwbpjlrjggfgqzvswtggthzfmfjnmrzrttbzqpwpsnmdtnbfblpfgslgcmjlbdpshnnrbhvwsbrnvdmjqhvhdjhbfzjmqrmqmdthhzvnrmqcnbtwcdjdqfvdgvmfbhrfqnmdncrddggtcppjlznbsnntppjtnsqsrjwvfrzpnzqcrzhhdflfmmtmwcvtpzbqhdwsczffcqhtdbdjblmgnrmhlqcsvcpgghhvwqhdtzpzlpfllchzltqgcwgfqnbzhgzmdwqdlwnvhqmpqjqnjbhjctslghdqvctdmjfwdfpdjnhdndzwsfjzlmsbmfmzvnvpqgqhtngvgqmlrrzsfmwlcwsscvghjvrzjjqbnplnjzqswpblwzwczhwbhhnjmctnmwlbqqfmnlwdcrptlmfjpjrnpcvmhffjhwhmntdzpdjzwzhrrsdvmjlwdtcpvjfmfzfsrgjghhlvmjjjczgmhvrfpgqbnhldwbrjgzmnszzbssfzcggrwmdfvddwsdmnwtwfwlfnwlvzlctfblbtrjvcwjjdljplcrjhwqslppwwtvfqwsjlfmdznmcdzdmgvmmsrfcclcvhtrhlsjzrbjwrjlfnvqhqvmpzmdttnbhfcvnqlrqbcsvtvwfccjstjpmhqgwlnrzjjmfdszflmglrdbpqhqhqsdfzrcljbdvvnlcqfllmnqcjfzjppdsjwshfschzqbnwfqnpwhqnmwsjbtcgvrljsrtzvcvghcjjlqsngglcggqpntrrhbjpbfhmvpltmnfmfdtwnczwfbvjcqnhvppjftwvwsrlhvvcjtsfptpqgrmrqwwddnqmnmfgrlnphbpqhhhvglqgtwvnwvnbssftmwttmfrffwtzhrpqspclvgchwqwcsgwqwwvpgcwngrcfmhbhflwfbfchlphdzdcrflfmfclsngtlwrqcrsgrdzcpdsvvcdbhgtljmbntbbcqgjqfsbfwzlfsnljpjdcnmjlqrwpmlvwgdlrrdgfhdqhzgltmclzgzzhmrbggsmgtpqdrgmjtlzwstrwbpvhppvsmdqvvwwglzjgdswjszqmrdbmshbhhcstpcsjdbvgjnvcmvhbtclrlmlgnvppgvncsrfchdbqjrclwwlnchmcgvshfsbsvvcvjrsgjlnsfqtqmgntffwnqjtldcqbcqhsgztllstswwqnfrswpchqhnfzzzszqjztzfrgrbjdbjlpvqfqrlrmmpbfbbcclrgmnlzwqrjhqrstswjpgsrtnlwsbqthzpvdzllzqmdmbvvtcztftvlwphhjzbfnrvccfmhmvmzlbrzlnppfzcsffjvjmbgpvlwgwszpztjpsrbnftqtdrbnljtbrjzzbwlsvtwtlwptdtnmtncvcblcmdngjzmctlqtzchncccnwjzrrmmmnllbhrnhwtqjsnvcslrqjfbfndqvdlrjshdzmlprtzbtnhthdqhplwzdbnjmgzlzrbzrvrqnflwfmsmbssqnbcddnvdpltpmplpdzvtjrslcdcnrdplwtjtvctwfzhlvwwqqtbqcjjwhhnpmvgzhqmqfgthwbphrmrtdghchsmwghdqjgjgmpddbrtngtvhqgjfrplrdgpbnhqvswrmqhcmsqvsqmqsgwjndwjrbrhvrctmmrmfwpsgfgdlrzpslpflgvwrgcthgcrnhgrzsmqdgdssjgspfhmqfmjfpmwqhnfjdvqzhpndvnbmqglbrjmdrwgmgctrgzpsdvfbmcstcslblmvnprphntgslmlrqwthrndrhtbccgzzfsglhgqztcsnqjwfzbzlvrpbvswbhrwdsrhrrpnrmsbvbvjccbdsdcfrrzpgwjtnnnvjwlcppwzdqsbdzpfjplrlfgvjpsmbzwpwlghnvqgddfjvrsztrpzlfgmqqzrfcgglghndbhgbmldglclhldljjdslvhzshshtqwhqnbzhvqrcmwdmcmhjcrmdmhrwnwcbhvbbrwrbtfdnztwnbpdfjfhgrmcpngftsvbsmsptnwcvvllnmbnsntbzmwnhfdptbtzswtjzdqwjdhprnjwvhzpscjvlsgrhdrmmrmhzhwwtslzdjqmzfncnmgplhnmwrvqhslvchtjcmpzpjpnpfbjptvvwcsmhgdjtsqrjlfpnfdncpqqmpgpvtlvwljlsqbnhtsqgfwlsmdjpgtvgjvjcrnnzmbllqzlrfdnlffgmtphhhgbcjgdlpzqpwmjwtcmdrsmtnmddftwczbsddtppsptbwfvpnfnsqmsgcfqfmnzffzqgcdvwzrgdwhmnzmrlhcdpdsltnsmjzdqwmmpwvjqbbwsrfgzh diff --git a/2022/06/test b/2022/06/test @@ -0,0 +1 @@ +mjqjpqmgbljsphdztnvjfqwrcgsmlb diff --git a/2022/07/a.rs b/2022/07/a.rs @@ -0,0 +1,12 @@ +mod common; +use common::*; + +fn main() { + let fs = FileSystem::build_from_stdin(); + let sum: usize = fs.iter() + .filter(|f| matches!(f.kind, FileType::Directory(_))) + .map(|f| f.real_size(&fs)) + .filter(|s| *s <= 100000) + .sum(); + println!("{sum}"); +} diff --git a/2022/07/b.rs b/2022/07/b.rs @@ -0,0 +1,13 @@ +mod common; +use common::*; + +fn main() { + let fs = FileSystem::build_from_stdin(); + let remaining = 70000000 - fs[0].real_size(&fs); + let ds: usize = fs.iter() + .filter(|f| matches!(f.kind, FileType::Directory(_))) + .map(|f| f.real_size(&fs)) + .filter(|s| *s + remaining >= 30000000) + .min().unwrap(); + println!("{ds}"); +} diff --git a/2022/07/common.rs b/2022/07/common.rs @@ -0,0 +1,130 @@ +use std::ops; + +pub enum FileType { + File(usize), + Directory(Vec<usize>) +} + +pub struct File { + pub kind: FileType, + name: String +} + +impl File { + pub fn real_size(&self, fs: &FileSystem) -> usize { + match &self.kind { + FileType::File(s) => *s, + FileType::Directory(c) => + c.iter().map(|x: &usize| fs[*x].real_size(&fs)).sum() + } + } +} + +pub struct FileSystem { + files: Vec<File> +} + +impl FileSystem { + fn new() -> Self { + Self { + files: vec![File { + kind: FileType::Directory(Vec::<usize>::new()), + name: String::from("/") + }] + } + } + + pub fn build_from_stdin() -> Self { + let mut fs = FileSystem::new(); + let mut path = Path::new(); + let mut line = String::new(); + while std::io::stdin().read_line(&mut line).unwrap() > 0 { + if &line[..5] == "$ cd " { + exec_cd(&line[5..], &mut path, &fs); + } else if &line[..3] == "dir" { + fs.add_dir(&line[4..line.len()-1], path.last()); + } else if line.as_bytes()[0] != '$' as u8 { + let i = line.find(' ').unwrap(); + let size = line[0..i].parse::<usize>().unwrap(); + fs.add_file(&line[i+1..line.len()-1], size, path.last()); + } + line.clear(); + } + fs + } + + fn make_parent(&mut self, id: usize, parent: usize) { + let p = &mut self.files[parent]; + if let FileType::Directory(v) = &mut p.kind { + v.push(id); + } else { + panic!("Parent is not a directory"); + } + } + + fn add_dir(&mut self, name: &str, parent: usize) { + let id = self.files.len(); + self.files.push( + File { + kind: FileType::Directory(Vec::<usize>::new()), + name: String::from(name) + } + ); + self.make_parent(id, parent); + } + + fn add_file(&mut self, name: &str, size: usize, parent: usize) { + let id = self.files.len(); + self.files.push( + File { + kind: FileType::File(size), + name: String::from(name) + } + ); + self.make_parent(id, parent); + } + + pub fn iter(&self) -> impl Iterator<Item = &File>{ + self.files.iter() + } +} + +impl ops::Index<usize> for FileSystem { + type Output = File; + fn index(&self, i: usize) -> &File { + &self.files[i] + } +} + +struct Path { + stack: Vec<usize> +} + +impl Path { + fn new() -> Self { Self { stack: vec![0] } } // 0 is the id of "/" + fn last(&self) -> usize { *self.stack.last().unwrap() } + fn clear(&mut self) { self.stack.drain(1..); } + fn pop(&mut self) { self.stack.pop(); } + fn push(&mut self, dir_id: usize) { self.stack.push(dir_id); } +} + +fn exec_cd(line: &str, path: &mut Path, fs: &FileSystem) { + if line.as_bytes()[0] == '/' as u8 { + path.clear(); + } else if &line[..2] == ".." { + path.pop(); + } else { + let current_dir = &fs[path.last()]; + if let FileType::Directory(children) = &current_dir.kind { + for c in children { + if fs[*c].name == &line[..line.len()-1] { + path.push(*c); + return; + } + } + } else { + panic!("Non-directory in path"); + } + panic!("Directory not found in current path"); + } +} diff --git a/2022/07/input b/2022/07/input @@ -0,0 +1,986 @@ +$ cd / +$ ls +dir bnl +dir dmpsnhdh +272080 dncdssn.hdr +dir fcnqg +6067 hjpmqrq +dir jvwtm +dir ldztz +dir lmmw +dir wthvqw +dir zpdnprb +$ cd bnl +$ ls +dir dhw +dir dmpsnhdh +dir lmw +dir vgbqbrst +$ cd dhw +$ ls +237421 vccwmhl +$ cd .. +$ cd dmpsnhdh +$ ls +dir chf +dir mjpbhjm +dir zwhpwp +$ cd chf +$ ls +4679 lmw.wmp +217367 wwnfv.qqr +dir zfgznbz +$ cd zfgznbz +$ ls +179409 cnj.gdn +171574 vglqg +$ cd .. +$ cd .. +$ cd mjpbhjm +$ ls +dir crf +dir hqnj +dir lmw +18783 lmw.rwr +302608 twpq +166891 vqczlg +$ cd crf +$ ls +32183 dltmqht +240428 frqqdsr.hbf +224910 sgtnrvrt +$ cd .. +$ cd hqnj +$ ls +261723 cgstb +77979 dmpsnhdh.cmd +$ cd .. +$ cd lmw +$ ls +50307 fcqrwd +$ cd .. +$ cd .. +$ cd zwhpwp +$ ls +141133 gdngm.mps +$ cd .. +$ cd .. +$ cd lmw +$ ls +dir dvv +267473 jmqgrh.dlz +295139 rrqjwpm +$ cd dvv +$ ls +114536 gmlmbrrw.wdm +102061 lmw +$ cd .. +$ cd .. +$ cd vgbqbrst +$ ls +105102 dmpsnhdh.bgl +269054 gmwgjf.fzz +dir jbdtpnw +245266 jzsjvgl +216220 lmw.gtb +dir rflp +dir twpq +$ cd jbdtpnw +$ ls +27543 cjvvmzp +$ cd .. +$ cd rflp +$ ls +137601 frqqdsr.hbf +83444 rrqjwpm +$ cd .. +$ cd twpq +$ ls +dir rlbsdj +36846 tnrqzjdd +$ cd rlbsdj +$ ls +56078 bvndq +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd dmpsnhdh +$ ls +dir fnpwwhtj +dir lmw +9090 mgjpsvl.jlh +186374 pbb.zln +$ cd fnpwwhtj +$ ls +dir cgp +$ cd cgp +$ ls +81938 hjpmqrq +281971 jvszf +151057 wmr.bnf +$ cd .. +$ cd .. +$ cd lmw +$ ls +dir bfbv +56929 pbb.zln +dir rrqjwpm +dir sngm +$ cd bfbv +$ ls +92667 qrrttb.jgp +$ cd .. +$ cd rrqjwpm +$ ls +25739 cqljn.zqw +91325 dncdssn.hdr +$ cd .. +$ cd sngm +$ ls +282163 jgrj +dir lmw +237524 lmw.dff +153497 lmw.ntg +dir lqd +dir szn +143535 tvpvc.qpr +98326 vbfgh +$ cd lmw +$ ls +32484 dncdssn.hdr +dir glwr +$ cd glwr +$ ls +144719 frqqdsr.hbf +$ cd .. +$ cd .. +$ cd lqd +$ ls +231401 dncdssn.hdr +dir jnjqmvg +dir lmw +199704 rrqjwpm +$ cd jnjqmvg +$ ls +104947 trpsrfjz.brg +$ cd .. +$ cd lmw +$ ls +230298 rrqjwpm.nnv +158947 wfv.qrb +$ cd .. +$ cd .. +$ cd szn +$ ls +197974 frqqdsr.hbf +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd fcnqg +$ ls +251609 dncdssn.hdr +289497 jdjmftqs +228459 qbmthcq +$ cd .. +$ cd jvwtm +$ ls +dir dmpsnhdh +47959 pbb.zln +dir tlr +dir twpq +dir wbgcsw +dir zjmldjdh +$ cd dmpsnhdh +$ ls +247567 bnl +102471 bnl.wdm +80054 fhqvp.hfm +dir llhp +dir mnsbh +dir mpplsfjp +20844 mtvl.lmp +$ cd llhp +$ ls +180255 dmpsnhdh +$ cd .. +$ cd mnsbh +$ ls +267627 dmpsnhdh +$ cd .. +$ cd mpplsfjp +$ ls +dir bnl +233742 tcnpvqc.tdr +$ cd bnl +$ ls +243223 fcqrwd +$ cd .. +$ cd .. +$ cd .. +$ cd tlr +$ ls +dir vcsngm +dir wndmt +$ cd vcsngm +$ ls +36434 czs.dnv +$ cd .. +$ cd wndmt +$ ls +dir fvmtfcqd +dir nvdb +dir nwqqgl +dir sbspgnpm +$ cd fvmtfcqd +$ ls +237025 nzttjt.rzh +$ cd .. +$ cd nvdb +$ ls +235328 dnrqwqtp.vfc +51984 rhblt.mfz +51332 rjhvhw +$ cd .. +$ cd nwqqgl +$ ls +203534 cjghw +dir cljbrh +$ cd cljbrh +$ ls +133820 lmw.dnd +$ cd .. +$ cd .. +$ cd sbspgnpm +$ ls +270010 hjpmqrq +$ cd .. +$ cd .. +$ cd .. +$ cd twpq +$ ls +dir dmpsnhdh +dir hbchdjjp +247649 hjpmqrq +29891 rrqjwpm +72407 twpq.crb +$ cd dmpsnhdh +$ ls +251490 dncdssn.hdr +222231 hjpmqrq +102058 pbb.zln +$ cd .. +$ cd hbchdjjp +$ ls +70058 dprrmd.qcd +230958 tsdbl.bnq +$ cd .. +$ cd .. +$ cd wbgcsw +$ ls +292028 bhtfcf +dir bnl +dir bqq +dir ctnlpgt +247888 hblhfvwj +dir hbqm +277949 pbb.zln +106225 rrqjwpm +125927 ssqpmlfb.gwm +dir zqmjwsgz +dir zwwphs +$ cd bnl +$ ls +dir fbbr +240500 frqqdsr.hbf +dir mzfrdl +25137 srqlww.mcj +dir tqgrdz +dir ztrnq +$ cd fbbr +$ ls +84414 mjbw.dhs +$ cd .. +$ cd mzfrdl +$ ls +135647 bccwgn +dir cjdptqgh +dir hwdnrqns +dir prq +$ cd cjdptqgh +$ ls +147946 mdgl.drz +11972 pbb.zln +$ cd .. +$ cd hwdnrqns +$ ls +dir dmpsnhdh +$ cd dmpsnhdh +$ ls +254432 phthmn +$ cd .. +$ cd .. +$ cd prq +$ ls +75827 dmpsnhdh.rtl +$ cd .. +$ cd .. +$ cd tqgrdz +$ ls +251475 bjwnll.rlw +$ cd .. +$ cd ztrnq +$ ls +208497 bnl.dtr +179376 gqnbswcj.hht +$ cd .. +$ cd .. +$ cd bqq +$ ls +202201 bnl.lbm +$ cd .. +$ cd ctnlpgt +$ ls +269484 vsfvzrpr +$ cd .. +$ cd hbqm +$ ls +74455 bvnfz +42748 pbb.zln +$ cd .. +$ cd zqmjwsgz +$ ls +146194 pbb.zln +$ cd .. +$ cd zwwphs +$ ls +209587 mtbzd.nwb +$ cd .. +$ cd .. +$ cd zjmldjdh +$ ls +dir cdq +dir mdclfbs +dir tfc +132043 wrm +$ cd cdq +$ ls +289173 twpq.mrn +$ cd .. +$ cd mdclfbs +$ ls +64639 bnl.jwf +dir hpdgt +72868 hznfj.nmj +159467 lmw.bfz +$ cd hpdgt +$ ls +52760 fcqrwd +54661 tzgt.hvh +$ cd .. +$ cd .. +$ cd tfc +$ ls +185481 bwntlh +18925 fcqrwd +$ cd .. +$ cd .. +$ cd .. +$ cd ldztz +$ ls +128430 bwz.fcz +dir dmpsnhdh +dir lbqgz +dir znrnj +$ cd dmpsnhdh +$ ls +238193 dncdssn.hdr +285939 hwfngq.dpw +$ cd .. +$ cd lbqgz +$ ls +171931 vgrp +$ cd .. +$ cd znrnj +$ ls +153738 vmwwbjqd +$ cd .. +$ cd .. +$ cd lmmw +$ ls +dir bqqnsfdj +163303 fcqrwd +43453 frqqdsr.hbf +33319 hjpmqrq +dir rlpcqtzg +$ cd bqqnsfdj +$ ls +dir bnl +2251 hjpmqrq +14707 rrqjwpm +dir tlnbvhdl +$ cd bnl +$ ls +33357 bnl.fqp +151237 bnl.vbs +40294 dmpsnhdh.hwz +76455 dncdssn.hdr +290341 hjpmqrq +dir lmw +dir nqw +$ cd lmw +$ ls +dir sfj +$ cd sfj +$ ls +156532 fcqrwd +$ cd .. +$ cd .. +$ cd nqw +$ ls +59928 dncdssn.hdr +$ cd .. +$ cd .. +$ cd tlnbvhdl +$ ls +183301 hjpmqrq +$ cd .. +$ cd .. +$ cd rlpcqtzg +$ ls +258638 dqt.mlc +$ cd .. +$ cd .. +$ cd wthvqw +$ ls +224501 pbb.zln +$ cd .. +$ cd zpdnprb +$ ls +dir bnl +dir ffg +dir jljlwpsv +212081 lrzc.lhj +dir rrqjwpm +dir twpq +dir vlgsrtm +$ cd bnl +$ ls +124009 hjgjf +74860 hjpmqrq +84996 lrdl.swf +dir pnzmp +$ cd pnzmp +$ ls +dir btbtlrs +128636 nfzf +$ cd btbtlrs +$ ls +107651 hhzbwd.wzj +$ cd .. +$ cd .. +$ cd .. +$ cd ffg +$ ls +57918 jwzbs.tnt +$ cd .. +$ cd jljlwpsv +$ ls +188175 dmpsnhdh.nnb +46693 fcqrwd +111557 pbb.zln +$ cd .. +$ cd rrqjwpm +$ ls +dir bftw +dir ccsfws +87225 mccw +290654 pbb.zln +147394 twzqc.pbz +52983 wsvgf +dir wwfgbzqh +$ cd bftw +$ ls +dir brl +167154 crs +dir lmw +dir rrqjwpm +dir twpq +174963 twpq.wjl +dir vnfhb +dir wcldzp +$ cd brl +$ ls +297937 wspcnp +$ cd .. +$ cd lmw +$ ls +166695 mcjql.jrv +$ cd .. +$ cd rrqjwpm +$ ls +198762 mwn +$ cd .. +$ cd twpq +$ ls +141835 jlwf.hcd +$ cd .. +$ cd vnfhb +$ ls +128626 tvmwhq.wfn +$ cd .. +$ cd wcldzp +$ ls +dir ncq +dir twpq +$ cd ncq +$ ls +dir wrtw +$ cd wrtw +$ ls +133331 fcqrwd +$ cd .. +$ cd .. +$ cd twpq +$ ls +151811 fcqrwd +$ cd .. +$ cd .. +$ cd .. +$ cd ccsfws +$ ls +100548 twpq.ppm +$ cd .. +$ cd wwfgbzqh +$ ls +dir lmw +dir mfms +dir pjbjgbcl +204154 qtflzwm +226500 vdmjj.htj +dir wzqbwr +$ cd lmw +$ ls +dir bgl +95150 dncdssn.hdr +119653 frqqdsr.hbf +97941 hjpmqrq +dir jqthwzj +$ cd bgl +$ ls +dir lmw +dir rrqjwpm +$ cd lmw +$ ls +233655 wmdldvbz +$ cd .. +$ cd rrqjwpm +$ ls +242918 frqqdsr.hbf +227581 hjpmqrq +dir hsvnmlp +dir nsch +25524 pbb.zln +dir qlgg +dir twpq +67453 twpq.fms +$ cd hsvnmlp +$ ls +264517 pbb.zln +$ cd .. +$ cd nsch +$ ls +7898 cmsdzh +233270 dmpsnhdh.bsq +101256 frl +133902 jzvh.vdv +dir lmw +dir sgjsg +130245 wcftvft +$ cd lmw +$ ls +69572 bnjnc.csp +$ cd .. +$ cd sgjsg +$ ls +38856 tnzpz.tbq +$ cd .. +$ cd .. +$ cd qlgg +$ ls +276013 frbstg.pzb +$ cd .. +$ cd twpq +$ ls +136454 fhwz.bqb +94099 rglp +114026 tsrt.cbd +26252 zhclpzm.rqf +$ cd .. +$ cd .. +$ cd .. +$ cd jqthwzj +$ ls +128200 lmw.btl +$ cd .. +$ cd .. +$ cd mfms +$ ls +274935 dmpsnhdh +76547 lchwq.dsd +215701 pbb.zln +dir rmwtvjt +$ cd rmwtvjt +$ ls +74490 hjpmqrq +$ cd .. +$ cd .. +$ cd pjbjgbcl +$ ls +231757 cjcpwwc.wbf +dir cswvftzs +dir jtvtg +dir lmw +dir tnctbjr +dir tqsrfhdr +$ cd cswvftzs +$ ls +dir dchqnbns +dir smf +$ cd dchqnbns +$ ls +94111 szl.hqs +$ cd .. +$ cd smf +$ ls +dir dlnsgvl +dir zglt +$ cd dlnsgvl +$ ls +dir dsz +$ cd dsz +$ ls +156473 hjpmqrq +$ cd .. +$ cd .. +$ cd zglt +$ ls +295383 frgg.sdp +$ cd .. +$ cd .. +$ cd .. +$ cd jtvtg +$ ls +202254 bftv.rqb +58419 lmw +$ cd .. +$ cd lmw +$ ls +8097 fcqrwd +$ cd .. +$ cd tnctbjr +$ ls +250830 frqqdsr.hbf +dir gzrcqr +$ cd gzrcqr +$ ls +dir fnzgsnv +$ cd fnzgsnv +$ ls +117215 hjpmqrq +$ cd .. +$ cd .. +$ cd .. +$ cd tqsrfhdr +$ ls +96381 lmw +$ cd .. +$ cd .. +$ cd wzqbwr +$ ls +149066 dmpsnhdh.vnd +dir dpbcgfdr +dir swp +14495 twpq.gsb +dir zhj +$ cd dpbcgfdr +$ ls +12909 dmpsnhdh +dir jvn +173491 mnhpr.lpr +222018 rfqfjmd.jqq +205077 wbbdrpr.hzj +dir wzpbbbhm +$ cd jvn +$ ls +117656 vqddrqlq.nfd +233109 vqqvh.swz +$ cd .. +$ cd wzpbbbhm +$ ls +143534 pbb.zln +$ cd .. +$ cd .. +$ cd swp +$ ls +131295 pbb.zln +$ cd .. +$ cd zhj +$ ls +166268 pbb.zln +33734 rrqjwpm.blg +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd twpq +$ ls +dir bppvlwqs +dir bvh +dir rmcdr +dir tdn +2230 whb.lfb +dir wwtwnvh +$ cd bppvlwqs +$ ls +195026 hvlhgsw +279259 rrqjwpm +$ cd .. +$ cd bvh +$ ls +dir lmw +$ cd lmw +$ ls +66958 pdqnd +$ cd .. +$ cd .. +$ cd rmcdr +$ ls +dir dmpsnhdh +182930 grj +dir pmrdhrth +119725 qpcqclqh +77890 sjgfjz +142855 twpq +dir zbmcrvbh +$ cd dmpsnhdh +$ ls +dir rrqjwpm +188474 zgjzpbl.vgv +$ cd rrqjwpm +$ ls +dir bnl +dir lmw +7598 vsntvs.pdv +$ cd bnl +$ ls +245600 lmw.mgf +$ cd .. +$ cd lmw +$ ls +73396 hjpmqrq +$ cd .. +$ cd .. +$ cd .. +$ cd pmrdhrth +$ ls +173155 rrqjwpm.pjw +178530 smgpzs.qtj +$ cd .. +$ cd zbmcrvbh +$ ls +124201 fcqrwd +135578 hjpmqrq +54356 hnztplsp.qlh +dir lmw +58350 pbb.zln +dir qfrvdm +dir rcg +15267 rwbzjpt.djn +$ cd lmw +$ ls +dir bbbll +28362 bfgfwlf.wvg +229637 dmpndms.fln +146121 dncdssn.hdr +131039 frqqdsr.hbf +152805 hjpmqrq +dir mlz +$ cd bbbll +$ ls +169940 dncdssn.hdr +216888 pbb.zln +248369 tjpmlr.vmf +$ cd .. +$ cd mlz +$ ls +115167 bhfv.fts +$ cd .. +$ cd .. +$ cd qfrvdm +$ ls +284564 pbb.zln +$ cd .. +$ cd rcg +$ ls +dir sqzjz +$ cd sqzjz +$ ls +116435 jrstpcpl.zsq +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd tdn +$ ls +143971 cmg +133317 fcqrwd +dir pstpclp +133161 tddv +$ cd pstpclp +$ ls +267351 hjpmqrq +86930 rrqjwpm.dvl +$ cd .. +$ cd .. +$ cd wwtwnvh +$ ls +256584 frqqdsr.hbf +114564 twpq.wrd +$ cd .. +$ cd .. +$ cd vlgsrtm +$ ls +148089 bnl.jzj +119796 cjfphsfw.hnd +197668 cpw +dir dmpsnhdh +dir fjsglr +dir lmw +dir lqgrft +9231 pltdltrs +dir rmdp +109777 rncfff.fll +dir vgjzqjpq +dir ztnqnfnq +$ cd dmpsnhdh +$ ls +dir lltnrdtv +dir scthsg +$ cd lltnrdtv +$ ls +179511 pcvmpz +90913 tbr +$ cd .. +$ cd scthsg +$ ls +dir rrqjwpm +$ cd rrqjwpm +$ ls +188629 fcqrwd +$ cd .. +$ cd .. +$ cd .. +$ cd fjsglr +$ ls +139754 fcqrwd +dir pnsjwfzc +$ cd pnsjwfzc +$ ls +113848 lmw +$ cd .. +$ cd .. +$ cd lmw +$ ls +54999 dmpsnhdh +dir ffhcf +251476 frqqdsr.hbf +dir jpgqspqw +198972 nhfclq.pbh +180380 nqmjnvc.fvr +dir pfsjwmbc +213768 rcvccgcd +$ cd ffhcf +$ ls +40478 svmwstq.sjj +$ cd .. +$ cd jpgqspqw +$ ls +22181 hjpmqrq +$ cd .. +$ cd pfsjwmbc +$ ls +dir bcvchw +$ cd bcvchw +$ ls +225892 bnl.nwc +$ cd .. +$ cd .. +$ cd .. +$ cd lqgrft +$ ls +dir rrqjwpm +dir twpq +$ cd rrqjwpm +$ ls +54786 fcqrwd +3053 tthhqjm.ntd +$ cd .. +$ cd twpq +$ ls +109355 bnl +dir lmw +dir mhgqt +301291 rrqjwpm.lrm +271233 twpq.srp +$ cd lmw +$ ls +dir lmw +dir lngbszqm +$ cd lmw +$ ls +139640 pbb.zln +$ cd .. +$ cd lngbszqm +$ ls +98279 mqvq.gsj +283599 rvjd.dvt +$ cd .. +$ cd .. +$ cd mhgqt +$ ls +208165 fcqrwd +$ cd .. +$ cd .. +$ cd .. +$ cd rmdp +$ ls +dir bqn +170956 fcqrwd +90954 snnttp.gld +$ cd bqn +$ ls +75628 hdrgbrpc +$ cd .. +$ cd .. +$ cd vgjzqjpq +$ ls +dir bnl +dir wpfw +$ cd bnl +$ ls +25911 pbb.zln +$ cd .. +$ cd wpfw +$ ls +247784 bzll.ltc +$ cd .. +$ cd .. +$ cd ztnqnfnq +$ ls +dir dtpzsrfc +214055 srgzhp.nlr +$ cd dtpzsrfc +$ ls +142652 bhgwj diff --git a/2022/07/test b/2022/07/test @@ -0,0 +1,23 @@ +$ cd / +$ ls +dir a +14848514 b.txt +8504156 c.dat +dir d +$ cd a +$ ls +dir e +29116 f +2557 g +62596 h.lst +$ cd e +$ ls +584 i +$ cd .. +$ cd .. +$ cd d +$ ls +4060174 j +8033020 d.log +5626152 d.ext +7214296 k diff --git a/2022/08/a.rs b/2022/08/a.rs @@ -0,0 +1,42 @@ +use std::cmp::max; +mod common; +use common::*; + +fn mark_visible(grid: &mut Grid) { + let update = |elem: &mut (i8, bool), m: &mut i8| { + elem.1 = elem.1 || elem.0 > *m; + *m = max(*m, elem.0); + }; + + for row in &mut *grid { + // From left + let mut m = -1; + for t in &mut *row { update(t, &mut m); } + + // From right + let mut m = -1; + for t in &mut row.iter_mut().rev() { update(t, &mut m); } + } + + for j in 0..grid[0].len() { + // From top + let mut m = -1; + for i in 0..grid.len() { update(&mut grid[i][j], &mut m); } + + // From bottom + let mut m = -1; + for i in (0..grid.len()).rev() { update(&mut grid[i][j], &mut m); } + } +} + +fn count_visible(grid: &Grid) -> usize { + grid.iter() + .map(|row| row.iter().filter(|c| c.1).count()) + .sum() +} + +fn main() { + let mut grid = read_grid_from_stdin(); + mark_visible(&mut grid); + println!("{}", count_visible(&grid)); +} diff --git a/2022/08/b.rs b/2022/08/b.rs @@ -0,0 +1,47 @@ +use std::cmp::max; +mod common; +use common::*; + +fn count_visible_from(grid: &Grid, i0: usize, j0: usize) -> usize { + let x = grid[i0][j0].0; + let mut top = 0; + for i in (0..i0).rev() { + top += 1; + if grid[i][j0].0 >= x { break; } + } + + let mut bottom = 0; + for i in i0+1..grid.len() { + bottom += 1; + if grid[i][j0].0 >= x { break; } + } + + let mut left = 0; + for j in (0..j0).rev() { + left += 1; + if grid[i0][j].0 >= x { break; } + } + + let mut right = 0; + for j in j0+1..grid[0].len() { + right += 1; + if grid[i0][j].0 >= x { break; } + } + + top * bottom * left * right +} + +fn max_view_factor(grid: &Grid) -> usize { + let mut m = 0; + for i in 0..grid.len() { + for j in 0..grid[0].len() { + m = max(m, count_visible_from(grid, i, j)); + } + } + m +} + +fn main() { + let grid = read_grid_from_stdin(); + println!("{}", max_view_factor(&grid)); +} diff --git a/2022/08/common.rs b/2022/08/common.rs @@ -0,0 +1,13 @@ +pub type Grid = Vec<Vec<(i8, bool)>>; + +pub fn read_grid_from_stdin() -> Grid { + let mut grid = Vec::<Vec<(i8, bool)>>::new(); + let mut line = String::new(); + while std::io::stdin().read_line(&mut line).unwrap() > 0 { + let row = line[..line.len()-1].as_bytes().iter() + .map(|b| ((*b as i8) - ('0' as i8), false)).collect(); + grid.push(row); + line.clear(); + } + grid +} diff --git a/2022/08/input b/2022/08/input @@ -0,0 +1,99 @@ +112121202020313300020340412130241443213110212555412551412441344012102310202342110301131001201210222 +002220000133232333300400324440200340331442222154322435351134115104433131022400301210231103320120102 +002111110023312202140422121302301411425412143121451113531553512221212012141140202223332010130102121 +200121112032232121304410232442313124341433152252314544515325125233341244332012020324021110233002001 +201022212100303122230042110420411144235142233535353242115241433555244414021310121244221013322222121 +011133013013221340022444040034222334222333233513241314324332525223122512421234021412140011030323220 +210300120303001122232014221422523555232331235422254211412225214325215241553042040303041423101011002 +003120002332341304133020544511125535535541345465624233512532523153125344553310344313112440310203011 +131130201012400142322154551413323211211264453362355545322422255141341455331312144311201120100013210 +231231113320032112042452344144421222532325455233246353364224262633314514222114310222010411123020310 +130132323324003111222144335255232253526222366424453236522644225645542113443452221300403213402211010 +113120324042321002433123114511424246663652545323562652666642343346224141215312351154031420431123313 +322103103420203222134243312435226546235454342354423362646633563243445363453321134444313221424211210 +222002200102244012425542311135622554533554536552565362325262535422342364211432245513321404214403103 +020312030211000311145233135522425335364263235236633766423525523653365556233412434131421431421413032 +210200210122104332244324435223345455654634767746775377345346266325246256554325112245151433442112120 +122021103003325452113155263653362555455536744343555667465337737332644556355541512314415321432122010 +302130331324344154351152233526435626553676357536566754666777544543643553226655255322235341014410100 +314012231321215344153565545233452474545654556345434346477343637634766266254223421545221444103004003 +203142142342444551513532553564436657337357765377547636675373434576744336526346456543411441023143110 +012342201025331211122452444533576366457663645436375557334447647673566472636623645223251551503132201 +242040141354332534632526224223663666376753663766575676333754654644753446365223356333455541211334020 +304212105422512243642223324443434437444774475647656876467367634464365546355325563651434541552020333 +411420043555145455366465334765477455434665856478775445748748844536643753776566362432434143454420144 +401414045521554536566434665734634475568447478784884574576588667675763475753664255466323144315114340 +403203444553445263226363636763747365744764846865845556768875448846334555367546232343531522434303222 +320101251535223652234326457665537657586786457478765885578775686476536463546335334642346321452233131 +101012145413152534234557444577344864876885844857544755664447444658566665757343254462522531514251101 +340341152532244444232667437647346678855466568676685668454547775878787354745333434364264512332351234 +034022314552563333466574354365446884777648857896869775765876486687448874547744636623356245124411300 +434115222252325233267546336767445666887887795778879879888964665878876674757366746353365644321332143 +312035533543623363556753755356877487485687695957956976755556874674844755665746737526623244522514143 +420252322135326524253347754684544485747997555758865876756898776645768885645667637664454254124241132 +042551521433445422576644675485868857686859585876589677967989879564666758475665333623554365252143351 +404455122524562436436545777675857467559889565668857859685895859976758774886545433533522546412531113 +402414213444443632667535548848565847669657785977756989557799965677887465558473374753636263414433431 +022221152324544456367356377556875457665895668676988667859858876695687554757534736365524353324555445 +344111222625453364363635787885744595658769866898866968696568596595864444764473337656423523432142535 +225434342232366345537763675578769565995877778767697786787965759585779855884865343633323444422312351 +035315413543653543334365848874759855766697967679779767999679566665785768858653734543735645643221454 +023235144645352563656735676476699588575688669887679986967789786578779847658656675663653453233341153 +142225254342433566337738656784888579869898976766696886867989878587588888556744335476656546565134514 +332531546644465434575456856855557977598878768976688677796996689765566874765455375433552656652141222 +245115244422246534474538846486987698857687868676878977996687768986655856867454644744464462545223145 +534255233266234565357356454786989999898896977688879977977896669857699764786566736463343326443154122 +454354332542262477736688458567665797769979688789788788987866776769877696655848467435475444463335241 +512543144352562655357675475585978965976868699798788899789679876985786899685774865763673624244331431 +324412256535565334657448674688895886877986668889799998798889878866685759475645457456546355544251525 +115513233345333374765468446775577596767887988887878879877777968697669577748775734356333445243551434 +415151565352224735474558556859799577886898999998979889789968896887667799778755865475767222365331232 +341542233524534557363486747546566765697666978897898998779776898687767558456588645347447452326635211 +141352533235633637755547684876556558796988688897999988799797887989695558885678545676777233242514541 +521224242633256545773565667556868787766779689977797878779776688978856968445584875373474655564453414 +212223344626635634464468564667887899889688667779987877977666888978896755878447456437466626246242154 +234115532222663767644584477756969899977977999989879987999976887779867996588585775466444223626514313 +135352514355535475547475454586885687868789797787897877999696989878678658675857877374766244666335415 +245312112534242364465384488548568678767769779778898997999876767795755964548464847565732454524524223 +021525515246626734753566444568597959566979986967678896977989678777787774766445653374342254643512525 +154333554224543664547576668488558779569899998698676696676768688689695868756558334756732443435414211 +241121123663636476553777547778679898575887899887676677898688967655685877474554463766356464665314411 +042314546263224256647665654464888598856776787699868899986977858568579785688458575346453652462152344 +123331145253442347344577548844655756795759896669869969898669978977675445684486336563564633463521424 +441245214645233266655474685847446687769676869796966869876898656576557445456865677774743333555121233 +125144145355562535553453348876854556596588579796889867979959976599967847546665344765436664421452124 +005214145522463625374665767445668477766757899558986688996855569799556464475877546663265544522533142 +424213534345444245575767446587747766879868999866679969656557796695754688786576454364542222333552433 +340123443165235626753533465668444668759977876797965776795859756987877778467766435676633663325451242 +003233434214334366657377335845776467875798576979767697579687977648857565845364473624435244552521232 +424135233343456444347333753548856886767998675667957686789866998677467875563746577654546663332345512 +142144412143652453363555366356464857764776776669865675576766767657655474454367647255355333454132411 +114044434535536365647343757563768767554848877759975798758895468485667587677463336535634542315521124 +243044411234356654655645476665375787765667655868887868786658648788875454747665334553525245122313313 +223005135155362266463337346655467578858875455446758445778678456564555447754654655642444335244151100 +441031313535133543536645563565447868478877557885475885785484588664864367437333352334646552545540434 +230403434533122325663365655775564467566764578557546875654785658764434354637753535553443132323132432 +231103055415354435244636576576467643575457665666647886566848556463753663346723326243525141135130424 +234240311433354434253255264577573744567747565865655865884455858675735663776644624454624322251114322 +001140425351442116425436424534333635755754445857766654848476464365374745573246334553145131221240002 +423442125121142242554242262463344446436337646568454446465366647477574476743566434562422322213241112 +041120244223522424262622532426564364336575645645643473455773734743736536462532635531424223442140002 +333213342044141312256465444645743463747737775353476574446663366477433766453534634424144243324342330 +123301211302132311214446544655333545346646756574364363763577337443636433244534466131243245142313041 +333302233005545533332445234232634365637756745756665533337455656536362324645335641322232425441330441 +210101031320143231223346443232362353735643457655456457447337655745423533326242244322432513011341141 +103110441134453455534214566635432365634456656643365735556363677266633236436433421143354400234124322 +210103104441245232113425543552436226532532734735737666776674646353226636524623254312414101401413013 +020024442231000453252454154546643563663622535463445755356246553442265263346551444421542422240011133 +031020232402201014325415255432463233224332466352332362464633465245446636555422514435430143120003112 +310302320413232125411435155524536333442626366353663655223253243262552253454113353253031242202102210 +221201232400342023452154554354353535536252463345626432342652363255555242425543353242440134432103103 +210032311140434341431423452253535242446256556466223466635264232223251545121524142114121403343313003 +120033031102121020314222514435233222253442525525522546426665636231521441532113451340400133032210231 +210023013101112320231215311434153455555125335452263535435665554254354533423243412221004001101231111 +221223223131114201030343552243332413432225514566333324653532145252122232542252133334211422030222312 +222331111212014202022011214444443411412221134525134425141412252142514152354243232311422120203312310 +110131122101302404410231242111542122454123223331222324435451342542314134420104111021220102332003000 +201221202213022021032201013424223253221544343453433115235543553513232252242121443333323311020103222 +001200323302010132410244321011414224212135145444322543324442532241244022442341044312322333033210110 +012221120210002201233041204141124034134123443133233422423453224352410321301023102020300131022311221 diff --git a/2022/08/test b/2022/08/test @@ -0,0 +1,5 @@ +30373 +25512 +65332 +33549 +35390 diff --git a/2022/09/a.rs b/2022/09/a.rs @@ -0,0 +1,6 @@ +mod common; +use common::*; + +fn main() { + println!("{}", simulate(2).len()); +} diff --git a/2022/09/b.rs b/2022/09/b.rs @@ -0,0 +1,6 @@ +mod common; +use common::*; + +fn main() { + println!("{}", simulate(10).len()); +} diff --git a/2022/09/common.rs b/2022/09/common.rs @@ -0,0 +1,46 @@ +use std::collections::HashSet; + +fn get_dir(c: char) -> (i64, i64) { + match c { + 'R' => (1, 0), + 'L' => (-1, 0), + 'U' => (0, 1), + 'D' => (0, -1), + _ => panic!("Unexpected char") + } +} + +fn follow(lead: (i64, i64), trail: (i64, i64)) -> (i64, i64) { + let max1 = |x: i64| x / (2 - (x%2).abs()); + let d = (max1(lead.0 - trail.0), max1(lead.1 - trail.1)); + (trail.0 + d.0, trail.1 + d.1) +} + +fn step(r: &mut Vec<(i64, i64)>, d: (i64, i64)) { + r[0] = (r[0].0 + d.0, r[0].1 + d.1); + for i in 1..r.len() { + if (r[i].0 - r[i-1].0).abs() > 1 || (r[i].1 - r[i-1].1).abs() > 1 { + r[i] = follow(r[i-1], r[i]); + } else { + break; + } + } +} + +pub fn simulate(n: usize) -> HashSet<(i64, i64)> { + let mut r = vec![(0, 0); n]; + let mut visited = HashSet::<(i64, i64)>::new(); + visited.insert(r[n-1]); + + let mut line = String::new(); + while std::io::stdin().read_line(&mut line).unwrap() > 0 { + let dir = get_dir(line.chars().nth(0).unwrap()); + let l = line[2..line.len()-1].parse::<usize>().unwrap(); + for _ in 0..l { + step(&mut r, dir); + visited.insert(r[n-1]); + } + line.clear(); + } + visited +} diff --git a/2022/09/input b/2022/09/input @@ -0,0 +1,2000 @@ +R 2 +D 2 +U 2 +D 1 +L 1 +D 2 +R 2 +L 2 +R 1 +D 2 +L 1 +U 2 +R 1 +D 1 +R 1 +L 1 +D 1 +R 2 +U 2 +L 2 +R 2 +U 2 +R 1 +L 1 +D 2 +R 1 +D 1 +R 1 +D 1 +R 1 +L 2 +R 1 +D 1 +L 1 +U 2 +L 1 +D 1 +L 1 +R 1 +U 2 +D 1 +U 2 +L 2 +R 2 +D 1 +L 1 +R 1 +D 1 +L 1 +U 1 +R 2 +D 1 +R 1 +D 2 +L 1 +D 2 +L 1 +D 2 +R 1 +L 1 +D 2 +L 1 +R 1 +D 2 +L 2 +R 2 +L 1 +U 2 +R 1 +U 2 +R 2 +U 1 +D 1 +U 2 +L 1 +D 2 +L 2 +R 2 +L 1 +R 1 +U 2 +D 1 +R 1 +L 2 +U 1 +D 2 +U 1 +L 2 +R 2 +D 1 +U 1 +L 2 +U 2 +L 1 +R 1 +D 1 +R 2 +D 1 +R 1 +D 2 +R 1 +D 1 +R 1 +D 2 +L 2 +U 2 +L 1 +D 1 +L 1 +R 2 +U 1 +D 1 +U 2 +L 2 +D 3 +L 3 +U 3 +R 1 +D 3 +R 1 +D 3 +R 2 +D 2 +U 3 +D 2 +L 3 +R 3 +U 3 +R 1 +U 3 +D 3 +L 1 +D 2 +U 1 +R 2 +L 2 +R 3 +L 2 +D 3 +L 2 +R 1 +D 1 +U 1 +D 2 +R 2 +L 1 +U 1 +R 3 +U 2 +D 3 +L 3 +U 2 +L 3 +R 2 +D 2 +U 2 +R 1 +U 3 +R 2 +D 1 +U 2 +D 3 +U 2 +R 3 +U 2 +L 3 +U 3 +D 2 +R 3 +U 3 +L 3 +U 2 +L 1 +D 3 +L 2 +D 3 +R 3 +L 2 +R 3 +D 1 +U 1 +L 3 +R 3 +D 2 +L 3 +U 2 +R 2 +U 1 +R 3 +D 3 +R 1 +U 2 +L 2 +U 1 +R 1 +U 1 +D 2 +L 2 +R 1 +D 3 +R 1 +D 3 +U 1 +R 2 +U 2 +L 2 +U 2 +L 3 +D 3 +U 2 +L 3 +U 1 +L 2 +D 1 +U 3 +L 2 +R 3 +D 1 +R 3 +L 3 +U 1 +L 3 +R 2 +D 3 +U 3 +L 3 +D 4 +L 1 +U 1 +R 3 +L 1 +D 4 +U 4 +L 4 +D 4 +U 1 +D 3 +R 1 +D 4 +L 1 +U 2 +D 1 +R 3 +L 4 +D 2 +U 2 +R 1 +L 4 +U 4 +R 4 +D 1 +R 3 +D 1 +R 4 +U 4 +D 1 +U 3 +D 4 +L 3 +R 2 +D 4 +L 2 +U 4 +D 3 +U 4 +D 2 +U 2 +L 3 +R 4 +L 4 +U 2 +L 1 +U 4 +D 4 +R 4 +U 4 +R 2 +U 4 +R 1 +U 3 +R 3 +U 4 +R 4 +U 2 +L 1 +U 3 +D 4 +L 1 +R 1 +L 2 +R 2 +D 2 +U 3 +R 3 +L 1 +D 2 +R 4 +D 1 +R 4 +L 2 +U 4 +D 2 +R 4 +U 2 +D 4 +R 1 +U 3 +L 3 +D 2 +R 2 +U 1 +L 4 +R 1 +U 2 +R 4 +D 3 +R 1 +L 2 +U 1 +R 2 +L 2 +U 2 +R 3 +L 2 +D 4 +U 4 +L 1 +U 2 +D 1 +U 2 +D 1 +L 2 +R 4 +L 5 +D 2 +U 5 +L 1 +R 2 +L 3 +U 3 +D 3 +L 1 +D 1 +U 4 +L 4 +U 3 +D 5 +R 1 +L 4 +U 1 +L 2 +R 4 +D 1 +L 4 +D 1 +U 4 +D 1 +L 2 +D 5 +L 5 +D 4 +R 3 +U 2 +L 4 +U 4 +L 4 +R 5 +D 1 +L 2 +R 5 +U 4 +D 5 +L 2 +U 4 +D 1 +L 3 +R 5 +D 4 +L 1 +D 3 +L 3 +U 2 +R 2 +D 4 +L 4 +U 1 +D 2 +L 5 +D 2 +L 2 +U 3 +R 3 +U 3 +D 2 +U 4 +R 3 +L 3 +D 2 +L 2 +R 3 +D 2 +L 3 +R 4 +U 4 +R 4 +D 2 +R 1 +D 1 +L 4 +R 4 +D 3 +R 2 +U 4 +L 2 +D 3 +U 4 +L 3 +R 5 +L 2 +R 1 +D 4 +L 5 +D 2 +U 5 +L 4 +U 2 +R 3 +L 4 +R 1 +U 3 +R 3 +L 2 +U 2 +L 3 +R 5 +L 3 +R 3 +U 3 +L 3 +U 5 +D 4 +U 5 +D 4 +L 4 +D 2 +R 5 +L 3 +U 2 +D 3 +L 4 +R 1 +D 1 +R 5 +L 3 +R 2 +L 3 +U 3 +D 1 +U 5 +R 2 +L 2 +D 5 +R 3 +U 4 +R 3 +L 1 +R 6 +L 4 +D 4 +U 4 +R 4 +U 2 +R 4 +D 1 +U 3 +R 1 +U 5 +D 3 +L 4 +R 5 +L 3 +U 6 +L 5 +D 3 +R 1 +D 2 +U 5 +L 1 +R 5 +U 4 +R 1 +U 1 +R 3 +L 2 +D 5 +U 4 +L 1 +U 2 +R 3 +L 5 +R 2 +D 3 +U 3 +D 6 +R 1 +D 2 +L 3 +R 3 +L 3 +U 4 +R 4 +U 4 +R 6 +U 1 +L 6 +R 6 +L 4 +U 6 +L 2 +D 1 +R 5 +L 5 +U 3 +D 6 +U 5 +L 4 +U 2 +R 1 +L 3 +D 6 +U 5 +R 4 +U 2 +D 3 +R 4 +L 1 +D 4 +U 6 +R 1 +D 6 +U 2 +D 5 +U 4 +L 4 +R 6 +D 2 +R 6 +L 1 +R 3 +D 4 +R 5 +L 6 +U 5 +L 3 +R 6 +U 1 +L 3 +D 7 +U 2 +D 5 +R 5 +D 7 +R 6 +D 6 +R 7 +D 7 +L 3 +R 4 +L 1 +U 6 +R 2 +L 7 +U 7 +D 1 +R 1 +D 1 +U 5 +R 4 +U 2 +D 5 +U 6 +L 2 +R 1 +U 5 +L 1 +U 7 +R 1 +D 2 +L 4 +D 4 +L 5 +U 4 +L 2 +D 5 +R 7 +D 7 +R 5 +L 3 +U 7 +R 7 +D 1 +L 2 +U 3 +L 2 +U 7 +L 2 +U 3 +L 6 +D 6 +L 2 +D 6 +L 6 +U 3 +L 3 +U 7 +D 3 +L 4 +U 5 +D 5 +L 4 +D 7 +U 3 +R 7 +D 5 +R 3 +L 6 +U 2 +L 2 +U 1 +L 1 +U 4 +D 7 +L 7 +D 2 +U 6 +L 2 +U 2 +L 4 +R 3 +L 6 +R 2 +D 7 +L 6 +D 3 +L 6 +R 1 +U 4 +R 6 +L 7 +D 7 +R 4 +U 7 +L 6 +R 3 +D 1 +U 3 +D 2 +U 3 +R 2 +L 7 +U 1 +R 4 +D 4 +U 2 +R 5 +D 5 +R 4 +L 3 +U 1 +R 7 +L 5 +D 4 +L 3 +D 7 +U 2 +D 4 +U 4 +L 1 +D 4 +R 7 +L 6 +U 3 +L 4 +D 5 +U 1 +D 1 +L 6 +R 7 +D 1 +L 4 +D 1 +L 5 +R 8 +D 4 +L 8 +R 4 +D 4 +U 3 +L 5 +R 5 +L 8 +U 4 +R 2 +D 6 +R 5 +L 1 +U 8 +L 1 +D 5 +U 5 +D 4 +L 6 +U 6 +D 8 +R 6 +D 3 +U 7 +R 8 +D 7 +L 2 +U 4 +D 4 +L 2 +R 2 +U 5 +L 4 +R 3 +L 2 +U 5 +D 8 +L 8 +D 3 +U 4 +D 2 +L 2 +U 4 +R 5 +L 6 +U 4 +R 5 +U 4 +L 7 +D 8 +R 8 +D 7 +R 5 +D 6 +U 2 +R 1 +D 3 +L 6 +U 3 +D 5 +U 6 +L 7 +R 1 +L 4 +R 4 +L 4 +R 3 +L 4 +U 3 +D 7 +U 8 +D 4 +R 6 +L 7 +R 2 +L 2 +U 7 +D 2 +R 1 +D 5 +U 1 +D 7 +R 2 +L 8 +R 8 +U 4 +R 9 +L 4 +R 5 +L 2 +D 6 +L 9 +U 2 +R 5 +D 4 +R 9 +U 4 +D 8 +R 9 +U 5 +D 4 +U 4 +L 4 +U 3 +R 5 +L 8 +D 9 +U 2 +L 8 +U 5 +D 4 +L 1 +D 4 +U 3 +D 7 +U 5 +D 5 +R 9 +L 2 +D 5 +L 7 +D 1 +L 2 +R 6 +D 9 +U 1 +L 6 +R 2 +D 2 +R 5 +D 8 +R 2 +D 3 +L 4 +D 5 +R 2 +D 8 +L 3 +D 6 +U 2 +L 4 +D 9 +L 6 +R 5 +L 7 +U 2 +D 8 +U 5 +L 6 +U 1 +L 9 +R 9 +D 1 +R 3 +U 9 +L 2 +U 8 +R 8 +D 8 +R 7 +U 7 +R 6 +L 2 +U 4 +D 2 +L 4 +U 4 +D 2 +R 8 +L 6 +R 9 +D 9 +L 6 +D 4 +L 5 +U 8 +D 2 +R 6 +D 7 +U 3 +R 6 +L 9 +U 6 +L 8 +U 8 +D 6 +U 9 +D 5 +U 8 +L 6 +R 6 +L 6 +R 9 +L 2 +U 4 +L 4 +U 1 +D 4 +R 1 +U 7 +D 5 +R 4 +U 4 +D 5 +L 9 +R 2 +U 5 +L 2 +R 10 +L 5 +R 1 +L 2 +U 3 +D 2 +R 7 +L 2 +R 6 +L 3 +R 6 +U 7 +L 1 +U 6 +R 6 +U 2 +L 3 +R 3 +L 1 +R 9 +L 5 +U 9 +L 9 +D 9 +U 4 +D 2 +R 6 +D 6 +R 8 +D 2 +U 6 +L 5 +R 2 +U 10 +L 3 +D 6 +R 3 +D 6 +U 2 +D 7 +R 1 +U 7 +D 2 +R 8 +L 5 +U 4 +L 5 +R 6 +U 6 +D 1 +L 5 +D 5 +R 5 +D 4 +L 5 +U 3 +R 4 +L 5 +R 2 +L 5 +D 10 +R 4 +L 2 +R 4 +L 7 +U 9 +R 3 +D 6 +R 7 +L 10 +D 7 +U 4 +L 9 +D 6 +L 7 +R 3 +U 7 +R 5 +U 6 +L 1 +U 2 +L 5 +D 6 +R 8 +L 7 +R 7 +D 1 +U 9 +R 1 +L 4 +U 4 +R 1 +L 3 +D 2 +L 8 +D 10 +L 9 +D 8 +R 5 +D 6 +L 7 +D 2 +U 11 +D 2 +U 6 +L 3 +U 8 +D 11 +U 9 +D 9 +R 11 +U 11 +L 8 +U 11 +R 11 +U 2 +D 6 +R 11 +D 7 +L 6 +U 5 +R 1 +L 3 +D 11 +U 3 +D 5 +R 4 +U 4 +D 8 +L 6 +U 1 +R 10 +L 5 +D 3 +U 8 +R 7 +L 8 +R 2 +U 6 +D 9 +R 1 +D 1 +R 3 +U 3 +L 10 +U 7 +R 1 +D 3 +U 6 +L 10 +R 6 +L 6 +R 4 +L 2 +R 10 +L 11 +U 5 +R 5 +U 5 +R 2 +D 10 +L 8 +U 9 +D 11 +R 10 +D 11 +R 11 +D 2 +U 7 +R 11 +U 2 +L 9 +R 11 +U 1 +R 8 +L 5 +U 6 +D 5 +L 10 +U 1 +L 4 +R 7 +L 5 +D 2 +R 9 +D 10 +U 4 +R 1 +D 7 +R 10 +D 10 +L 5 +R 3 +L 8 +R 8 +U 10 +R 9 +D 11 +R 1 +D 9 +R 5 +L 3 +D 5 +L 8 +U 8 +R 10 +D 10 +U 1 +D 3 +R 6 +U 1 +L 2 +U 6 +L 7 +R 11 +U 2 +R 2 +L 5 +U 5 +R 2 +D 12 +U 3 +L 2 +D 5 +U 3 +R 11 +D 5 +R 10 +U 8 +L 7 +R 6 +D 2 +U 11 +L 10 +R 12 +D 8 +U 12 +L 7 +D 5 +R 11 +U 10 +R 12 +U 1 +L 1 +U 10 +L 2 +R 9 +U 1 +R 4 +U 2 +R 8 +D 1 +R 2 +L 3 +R 7 +D 7 +L 10 +R 2 +U 11 +R 8 +U 11 +D 12 +U 8 +L 5 +U 12 +L 12 +U 12 +L 7 +R 5 +D 4 +U 9 +L 5 +R 7 +L 10 +R 4 +L 11 +D 3 +R 1 +D 12 +U 10 +R 10 +D 5 +R 11 +U 2 +L 8 +R 4 +D 1 +L 10 +R 2 +D 11 +L 4 +U 12 +D 11 +L 11 +U 3 +L 9 +U 8 +D 8 +R 10 +L 8 +U 2 +D 9 +U 12 +D 7 +U 8 +L 8 +D 9 +L 6 +U 8 +D 11 +U 12 +D 9 +L 1 +D 4 +R 2 +U 10 +D 2 +L 10 +U 6 +L 9 +D 4 +U 4 +R 4 +L 5 +R 9 +U 2 +R 5 +U 4 +D 12 +R 3 +L 10 +U 7 +D 1 +U 9 +R 6 +L 4 +U 9 +L 13 +D 2 +L 8 +R 12 +D 7 +U 13 +D 6 +U 12 +L 4 +R 4 +D 10 +U 8 +L 4 +R 4 +D 2 +U 9 +L 9 +D 11 +L 6 +R 2 +L 8 +R 9 +L 6 +U 13 +R 10 +D 3 +U 10 +L 12 +R 9 +U 12 +R 10 +U 10 +D 11 +L 7 +R 5 +L 13 +U 11 +R 13 +U 11 +R 12 +U 8 +R 12 +D 4 +L 10 +R 1 +L 9 +R 13 +L 2 +U 7 +L 13 +R 4 +U 13 +L 6 +R 12 +D 1 +U 7 +L 10 +R 6 +D 6 +U 2 +R 2 +L 8 +D 5 +U 9 +D 5 +L 9 +R 1 +U 5 +L 13 +D 1 +R 5 +L 8 +U 5 +R 2 +U 8 +L 1 +U 13 +R 6 +U 12 +L 3 +D 1 +U 4 +L 12 +R 1 +D 6 +L 11 +U 7 +D 1 +L 9 +R 4 +U 7 +D 7 +U 9 +D 1 +L 10 +D 14 +U 3 +D 9 +L 7 +U 1 +L 9 +R 13 +L 14 +R 11 +D 8 +L 12 +U 11 +R 11 +U 9 +R 2 +U 13 +R 5 +D 3 +U 3 +R 9 +D 14 +U 2 +D 8 +L 7 +D 2 +U 8 +L 12 +U 7 +D 12 +R 11 +D 14 +R 13 +L 13 +R 9 +L 7 +U 4 +D 9 +U 9 +L 12 +U 3 +D 4 +R 5 +D 14 +L 9 +D 14 +U 3 +L 8 +R 1 +U 2 +R 14 +D 5 +L 6 +R 9 +D 12 +R 3 +D 1 +L 8 +U 11 +D 11 +L 7 +R 14 +D 9 +L 9 +R 13 +L 4 +D 11 +R 14 +U 6 +L 10 +R 7 +D 9 +U 7 +D 5 +R 8 +U 2 +R 9 +D 6 +R 13 +U 1 +L 14 +R 6 +L 9 +D 11 +L 3 +U 5 +R 12 +U 8 +L 3 +D 5 +U 7 +R 2 +D 14 +R 14 +L 2 +U 5 +L 11 +U 7 +L 14 +U 5 +D 6 +R 14 +D 12 +U 4 +D 5 +R 14 +L 14 +D 12 +L 10 +D 2 +L 1 +R 5 +D 8 +R 2 +L 14 +R 5 +L 12 +D 9 +L 6 +D 8 +L 8 +R 12 +U 1 +L 11 +U 3 +D 7 +R 11 +D 15 +L 4 +U 9 +R 15 +U 8 +D 4 +L 10 +U 2 +L 13 +U 9 +L 5 +D 13 +L 5 +R 1 +D 3 +U 11 +D 5 +L 13 +R 3 +D 4 +U 3 +R 5 +U 14 +R 4 +D 9 +R 3 +D 11 +U 13 +R 7 +U 10 +R 1 +L 9 +D 15 +R 6 +U 12 +L 4 +R 13 +U 7 +D 10 +R 13 +U 1 +R 4 +D 15 +L 10 +R 11 +U 9 +L 1 +D 6 +R 15 +U 10 +L 10 +D 6 +U 10 +L 8 +R 5 +L 14 +D 6 +L 2 +U 2 +L 9 +U 2 +L 7 +U 9 +L 2 +D 8 +R 6 +D 6 +R 7 +U 2 +L 13 +R 13 +U 3 +D 13 +U 14 +R 9 +L 4 +U 15 +R 1 +D 2 +U 15 +R 12 +U 12 +L 12 +U 9 +R 8 +U 3 +L 7 +D 3 +U 2 +R 7 +D 4 +R 6 +U 13 +D 7 +U 7 +D 8 +R 13 +U 10 +D 16 +L 12 +U 8 +R 6 +U 10 +L 14 +D 12 +R 2 +L 9 +U 8 +D 7 +U 6 +R 7 +L 14 +D 6 +L 10 +U 11 +L 3 +D 6 +R 2 +U 8 +L 2 +D 10 +R 16 +U 14 +R 10 +D 13 +R 3 +D 8 +R 2 +D 16 +L 12 +D 13 +U 6 +D 2 +L 4 +R 14 +D 16 +U 12 +L 1 +D 9 +L 7 +U 1 +L 3 +U 7 +R 7 +D 3 +L 11 +R 9 +D 5 +R 10 +D 12 +R 1 +U 8 +L 8 +D 5 +R 12 +U 8 +R 11 +U 3 +D 5 +R 9 +L 11 +U 14 +L 14 +D 5 +U 12 +L 9 +D 2 +U 6 +L 7 +D 6 +L 2 +R 2 +D 11 +R 13 +D 10 +U 4 +L 13 +U 5 +L 6 +R 3 +U 16 +D 13 +R 1 +U 2 +D 4 +R 3 +U 10 +D 16 +L 1 +U 1 +R 16 +D 6 +U 7 +D 3 +R 4 +U 2 +D 4 +L 8 +U 9 +R 8 +U 15 +D 4 +R 11 +D 4 +R 12 +U 1 +D 2 +R 4 +D 17 +L 4 +U 1 +D 1 +L 3 +R 16 +D 12 +R 6 +U 3 +R 4 +U 2 +D 8 +R 5 +D 4 +R 1 +U 5 +L 12 +D 1 +R 12 +U 3 +D 13 +L 13 +U 11 +D 8 +R 3 +D 14 +L 10 +D 1 +L 4 +D 4 +R 9 +L 10 +U 6 +L 8 +R 7 +L 2 +R 1 +L 4 +D 8 +R 14 +U 8 +L 13 +D 12 +R 17 +D 2 +R 5 +U 12 +R 8 +D 16 +L 6 +R 14 +D 9 +U 7 +L 5 +U 14 +L 10 +U 5 +L 4 +U 7 +R 17 +D 1 +U 6 +L 12 +D 10 +L 2 +D 17 +L 14 +R 3 +D 6 +U 11 +R 14 +L 11 +D 8 +U 1 +R 1 +L 14 +U 17 +L 15 +U 3 +R 5 +D 3 +L 12 +R 10 +U 17 +R 7 +D 2 +U 16 +D 10 +L 12 +R 5 +D 10 +L 14 +D 17 +U 4 +L 9 +D 11 +R 5 +D 4 +U 5 +L 16 +D 16 +L 5 +U 10 +D 8 +L 14 +U 11 +L 17 +D 1 +U 10 +R 9 +U 17 +L 8 +R 11 +L 15 +D 9 +U 18 +D 3 +R 4 +L 7 +R 2 +U 5 +L 17 +U 2 +R 11 +L 11 +U 7 +D 17 +U 11 +R 5 +D 14 +U 7 +R 17 +D 10 +U 18 +D 15 +L 7 +U 2 +D 3 +U 14 +R 6 +D 2 +L 5 +R 16 +D 8 +U 2 +D 16 +R 9 +U 12 +R 4 +D 14 +R 10 +U 1 +R 1 +L 8 +D 15 +L 8 +D 16 +U 9 +R 11 +L 17 +U 18 +L 2 +R 4 +L 1 +U 9 +L 13 +R 1 +U 17 +L 12 +R 3 +D 15 +R 3 +U 3 +D 8 +L 6 +R 4 +D 13 +U 2 +R 1 +L 10 +U 9 +R 2 +D 16 +R 9 +U 15 +R 10 +U 4 +R 6 +D 10 +U 4 +R 11 +D 1 +R 10 +U 17 +R 4 +D 9 +U 17 +R 7 +U 11 +L 10 +R 10 +L 10 +U 8 +L 18 +U 14 +R 16 +L 12 +U 18 +R 1 +D 4 +L 9 +R 18 +D 12 +L 17 +D 12 +U 4 +D 1 +U 16 +R 17 +U 3 +D 13 +L 14 +D 9 +L 19 +U 13 +L 2 +U 9 +D 7 +U 7 +D 4 +L 10 +R 6 +D 11 +R 7 +U 10 +D 13 +U 18 +L 14 +D 7 +L 4 +R 11 +D 8 +L 8 +R 9 +L 2 +U 11 +R 13 +L 13 +R 11 +L 16 +D 10 +L 6 +R 3 +D 8 +L 19 +U 18 +L 14 +D 15 +U 10 +D 11 +R 19 +D 14 +U 2 +R 7 +U 6 +D 15 +U 10 +D 4 +U 10 +L 9 +R 15 +L 8 +U 7 +R 4 +D 5 +R 18 +L 3 +R 11 +D 11 +R 2 +U 1 +L 6 +D 18 +R 15 +U 2 +R 10 +L 18 +R 1 +U 19 +D 15 +R 18 +L 18 +R 4 +L 7 +D 18 +R 19 +U 11 +D 3 +L 3 +R 11 +U 16 +R 3 +D 4 +U 2 +R 10 +U 9 +L 18 +U 6 +L 5 +D 7 +L 17 +U 3 +L 5 +D 6 +U 19 +R 14 +U 3 +D 1 +U 16 +L 16 +D 12 +L 11 +D 16 +R 15 +U 5 +D 14 +L 3 +U 18 +L 8 +U 10 +L 10 +D 10 +R 5 diff --git a/2022/09/test b/2022/09/test @@ -0,0 +1,8 @@ +R 4 +U 4 +L 3 +D 1 +R 4 +D 1 +L 5 +R 2 diff --git a/2022/09/test2 b/2022/09/test2 @@ -0,0 +1,8 @@ +R 5 +U 8 +L 8 +D 3 +R 17 +D 10 +L 25 +U 20 diff --git a/2022/README.md b/2022/README.md @@ -0,0 +1,12 @@ +# Advent of Code 2022 + +I did not solve these problems in 2022, but in 2025, as a playground +to learn Rust. + +## Usage + +To run this code you'll need the `rustc` compiler (no `cargo`). + +From this folder run: `./run.sh day part`, for example `./run.sh 03 a`. +Input is read from standard input; paste your input in the terminal or +read it from a file with e.g. `<input.txt`. diff --git a/2022/run.sh b/2022/run.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +usage() { + echo "Usage: $0 day part" + echo "Example: $0 07 b" +} + +[ -n "$1" ] && [ -n "$2" ] || (usage; exit 1) +[ -d "$1" ] || (echo "Directory $1 does not exist"; exit 1) +[ -f "$1/$2.rs" ] || (echo "File $1/$2.rs does not exist"; exit 2) + +rustc "$1/$2.rs" -o "$1/$2.out" && time "./$1/$2.out"