From cc446240fac48c545c522f3d69c5d04a93b63461 Mon Sep 17 00:00:00 2001 From: Mike Vink Date: Sat, 25 Feb 2023 13:23:13 +0100 Subject: day1-7 --- day1.go | 68 ++ day1.txt | 2257 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ day2.go | 163 ++++ day2.txt | 2501 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ day3.go | 102 +++ day3.txt | 300 ++++++++ day4.go | 80 ++ day4.txt | 1000 +++++++++++++++++++++++++ day5.go | 135 ++++ day5.txt | 511 +++++++++++++ day6.go | 48 ++ day6.txt | 1 + day7.go | 153 ++++ day7.txt | 1079 +++++++++++++++++++++++++++ 14 files changed, 8398 insertions(+) create mode 100644 day1.go create mode 100644 day1.txt create mode 100644 day2.go create mode 100644 day2.txt create mode 100644 day3.go create mode 100644 day3.txt create mode 100644 day4.go create mode 100644 day4.txt create mode 100644 day5.go create mode 100644 day5.txt create mode 100644 day6.go create mode 100644 day6.txt create mode 100644 day7.go create mode 100644 day7.txt diff --git a/day1.go b/day1.go new file mode 100644 index 0000000..1b2fc29 --- /dev/null +++ b/day1.go @@ -0,0 +1,68 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "strconv" +) + +func biggestElf(data []int) []int { + topThree := make([]int, 3) + push := func(i int, a int) { + tmp := topThree[i] + topThree[i] = a + carry := tmp + for i++; i < len(topThree); i++ { + tmp = topThree[i] + topThree[i] = carry + carry = tmp + } + } + Elf := 0 + for i := 0; i < len(data); i++ { + if data[i] < 0 { + for j := 0; j < len(topThree); j++ { + if topThree[j] < Elf { + push(j, Elf) + break + } + } + Elf = 0 + continue + } + Elf = Elf + data[i] + } + return topThree +} + +func sum(array []int) int { + s := 0 + for _, val := range array { + s += val + } + return s +} + +// Should've kept part1 solution like in day3... +func main() { + f, err := os.Open("day1.txt") + if err != nil { + fmt.Println(err) + } + defer f.Close() + + data := make([]int, 0) + scanner := bufio.NewScanner(f) + var line string + for scanner.Scan() { + line = scanner.Text() + if len(line) == 0 { + data = append(data, -1) + } else if num, err := strconv.Atoi(line); err == nil { + data = append(data, num) + } + } + fmt.Println(biggestElf(data)) + fmt.Println(sum(biggestElf(data))) +} diff --git a/day1.txt b/day1.txt new file mode 100644 index 0000000..78ccff4 --- /dev/null +++ b/day1.txt @@ -0,0 +1,2257 @@ +11223 +6323 +10725 +10761 +3587 + +1274 +1041 +5566 +1759 +1372 +1619 +2228 +1283 +1981 +1885 +5894 +1321 +6081 +4407 +2992 + +7184 +2310 +7975 +2752 +7942 +7616 +3622 +1320 +1231 +6191 + +3069 +10691 +4789 +5329 +6726 +9550 +6188 +3117 + +17492 +3489 +18055 + +12369 +21123 + +2121 +5065 +5377 +1768 +6060 +1256 +1496 +6899 +3569 +3766 +6873 +5490 +2961 + +6407 +3770 +2823 +5998 +7783 +4194 +1866 +5504 +6550 +7857 +2884 + +5385 +4621 +2434 +6123 +2159 +6191 +3552 +6871 + +6531 +4287 +7402 +5634 +3960 + +4955 +6958 +7652 +7416 +7540 +7990 +1696 +2568 +1040 +3087 +5608 + +28948 +24385 + +27643 +31191 + +8674 +10486 +1765 +1787 +4234 +4187 +7126 + +6370 +1098 +2071 +4231 +3223 +1456 +3853 +5740 +6327 +2723 +4716 + +6783 +5772 +4352 +2984 +3483 +2359 +7168 +1581 +6182 +1637 +2601 +4015 + +12691 +14785 +18295 + +1035 +5658 +8643 +2693 +6046 +1531 +6174 +8290 +5239 +3430 + +2510 +1090 +6971 +5314 +6949 +8885 +3334 +9329 +2738 + +23893 +19568 +19775 + +4257 +5830 +3972 +4513 +3988 +7674 +1535 +5402 +6257 +1785 + +12580 + +3869 +4718 +7144 +7107 +4168 +5713 +6920 +5802 +3226 +1389 +5876 + +3405 +1630 +3297 +1130 +4787 +2319 +5745 +5744 +2852 +5594 +1641 +2012 +3828 +3717 +2181 + +6200 +4566 +5973 +4301 +1608 +7023 +6922 +6247 +4402 +6943 +4980 + +6063 +4381 +3878 +2147 +1437 +2822 +5830 +2453 +3898 +6106 +4618 +1905 +1608 +5115 +1656 + +7057 +6579 +5295 +6106 +5517 +5560 +2264 +5144 +5623 +1650 +6594 +5828 + +8444 +4858 +8810 +6516 +5064 +1198 +6087 +8280 +8275 +5471 + +9667 +26851 + +5191 +5421 +2865 +1495 +5491 +3406 +1779 +2454 +6648 +6237 +1868 +1313 + +6885 +8414 +6097 + +9459 +9028 +2432 +4442 +1721 +8546 +5060 + +8042 +13365 +7153 +10483 +7147 + +11597 +1891 +10089 +9866 +11989 +1774 +1386 + +7690 +5023 +5273 +5257 +1790 +2008 +1100 +4395 +3691 +1270 + +34927 +32922 + +22524 +19581 +7007 + +6204 +5778 +2172 +3231 +5452 +4320 +5110 +1397 +4063 +2370 +6075 +3506 +3764 +2327 + +1764 +1282 +1837 +3490 +4161 +5852 +5595 +1428 +4863 +1894 +2983 +2336 +4587 +1656 +5178 + +3987 +6437 +4976 +3214 +2354 +7292 +1167 +4874 +6006 + +6911 +3746 +6773 +7196 +7615 +1359 +3757 +7858 +5074 +6991 +5915 + +4952 +6034 +4897 +3990 +5389 +1886 +3544 +7289 +2881 +2402 +6238 +6533 + +4548 +5600 +5383 +3044 +1113 +6264 +2151 +6527 +7206 +2516 +6959 +7111 + +5811 +4157 +5365 +3234 +5614 +5556 +3486 +2452 +4304 +4990 +2269 +2944 +2060 +4504 + +67337 + +10762 +7277 +4855 +8338 +2555 +4499 +9727 + +7093 +6258 + +2117 +6720 +2717 +1336 +2124 +7329 +1182 +4312 +7579 +3997 + +11769 +4034 +4675 +3409 +5871 +1752 +5233 + +4359 +7926 +8543 +4196 +3184 +9262 +7649 + +11423 +1963 +11334 +11792 + +5951 +5005 +2263 +6667 +1586 +6799 +7104 +5810 + +1474 +1433 +4979 +5569 +5195 +5467 +5503 +6305 +4527 +5721 +4151 +4965 +3459 + +1572 +4083 +3559 +3119 +4290 +5019 +1274 +1243 +5732 +3525 +2310 +4945 +1128 +2249 +5974 + +2324 +6525 +6790 +5283 +4011 +1907 +2385 +6918 +5300 +1177 +5483 +6271 + +2380 +8204 +6100 +3828 +4024 +5895 +1613 +4301 +4242 +4265 + +3519 +1809 +8065 +3966 +7829 +1476 +5391 +2276 +5886 +5447 +5325 + +4424 +3641 +1053 +1843 +2247 +2337 +3572 +1720 +4668 + +7399 +7282 +3897 +6376 +3540 +5313 +6058 +5209 +5392 +5429 + +4724 +6793 +7620 +4771 +8430 +2765 +10691 + +9003 +5417 +7064 +3317 +2271 +3973 +2491 +5203 + +1978 +5937 +5166 +1587 +5342 +1353 +2506 +3213 +2041 +4374 +3097 +1710 + +2998 +7694 +2359 +6486 +3319 +7771 +5340 +8062 +6645 + +6121 +5006 +3579 +12148 +3412 +8373 +10656 + +2851 +13441 + +2361 +7577 +8360 +2128 +4313 +6552 +5422 +8627 + +3435 +11683 +4085 +11581 +3017 +4731 +8645 + +10115 +9761 +7367 +5257 +10263 +5022 +9674 +6552 + +4997 +2470 +2855 +1860 +2547 +3060 +1036 +3288 +6338 +5423 +4701 +6740 +2226 + +2182 +2468 +2724 +4116 +2740 +1677 +1642 +2717 +1604 +2874 +4231 +5637 +5907 +1780 +5585 + +1425 +5503 +8059 +2459 +2334 +1655 +10561 + +7278 +5393 +6827 +1776 +6841 +6404 +7090 +7051 +1764 +2107 +5593 +3639 + +17501 +16452 +11047 +7696 + +11332 +9288 +13543 +2406 +7699 +5661 + +9845 +14017 +12535 +7383 + +4341 +1266 +3942 +2669 +1219 +1987 +5423 +2973 +5656 +4981 +3084 +4455 +1780 +1772 +2947 + +6183 +2669 +6038 +8553 +12075 + +3041 +6281 +2661 +1855 +6460 +6508 +6582 +5775 +3895 +1141 +1096 +3572 + +1458 +2196 +4078 +1940 +2785 +2560 +6964 +5713 +7913 +6951 +2396 + +1820 +3990 +16654 +15798 + +1445 +1269 +2821 +5078 +3402 +4371 +6619 +3479 +5353 +1921 +5645 +3800 + +11876 +15581 +11141 +17267 + +9397 +8627 +3948 +4177 +6374 +4943 +7444 +4766 +5053 + +6847 +8418 +2322 +2549 +1334 +5677 +1151 +8407 + +69814 + +1529 +5847 +8312 +7219 +4067 +7646 +5212 +5183 +9533 + +17696 +2661 +7171 + +8696 +10434 +5330 +6274 +5824 +2386 +10535 +8402 + +3339 +9444 +3712 +4540 +4296 +4385 +2453 +10416 + +4225 +7128 +7768 +7085 +1382 +4348 +6967 +1719 +3131 +4060 +3516 + +3329 +3612 +1093 +4118 +2946 +2250 +1200 +2193 +4142 +3120 +2394 +1217 +1214 +2310 +3690 + +9634 +10560 +3796 +7011 +10745 +10677 + +4024 +4466 +6953 +1754 +2261 +6560 +6690 +2671 +6082 +5522 +4024 + +16675 +17642 +1382 +12630 + +4454 +4023 +6985 +6880 +5862 +3351 +2861 +5649 +6833 +4668 +2089 +3832 + +3744 +2151 +3951 +3859 +1900 +2921 +1267 +2132 +4015 +3160 +4747 +4780 +4398 +4160 +5221 + +18994 +14365 +11726 + +8313 +16460 +18955 +7491 + +7558 +1673 +1267 +4825 +4651 +5819 +9798 + +50633 + +4542 +1002 +4677 +4874 +5472 +3518 +3642 +3083 +4735 +6769 +5389 +2869 +4223 + +4275 +4306 +4645 +2360 +4603 +7805 +7964 +8022 +7382 +6504 + +2452 +9071 +6449 +11056 +7775 + +8750 +8343 +3753 +11284 +2024 +1088 + +2376 +8200 +1858 +11313 +10710 +5992 + +32813 +26299 + +15734 +8393 +7230 +20011 + +19297 +21723 +14837 + +2126 +3511 +6139 +3427 +6135 +5685 +1514 +4338 +4446 +3334 +4417 +1343 + +5737 +1004 +1168 +4504 +2467 +3431 +3800 +1931 +5287 +4057 +6507 +4662 +1845 + +6896 +5740 +6075 +5798 +6055 +4309 +5679 +7279 +1311 +4647 + +3594 +7095 +7139 +6593 +9371 +6162 +1320 +7202 +6216 + +3592 +1250 +2848 +6524 +1240 +6845 +5263 +1176 +1165 +3641 +5653 +3051 +6168 + +5535 +4847 +13599 +5746 +5288 +7316 + +13934 +13998 +25642 + +4070 +1691 +6012 +5137 +3924 +2272 +4886 +4272 +3467 +5077 +3114 +3794 +5220 +1129 +2113 + +8763 +11869 +7453 +2318 +10101 +5238 +4663 + +17968 +21896 +25750 + +2567 +6997 +8972 +4451 +4917 +4229 +5235 +8327 +2785 + +6031 +17803 +19811 + +5995 +3180 +2417 +5245 +2481 +2578 +3879 +4348 +1183 +2027 +1809 +1278 +3428 +2253 +5083 + +5958 +8942 +6761 +4251 +1630 +2788 +7080 +6954 +4471 + +4874 +2390 +4410 +1109 +5096 +6956 +1676 +4848 +3521 +5799 +5997 +3748 +5709 + +3624 +7400 +4652 +3504 +2104 +6861 +4377 +1647 +4293 +7214 +7099 +5289 + +10481 +1917 + +3507 +5672 +2015 +2831 +6385 +4068 +5241 +7465 +4759 +5053 +7052 + +6280 +9794 +4646 +6980 +3720 + +8585 +9331 +3157 +9319 +7640 +4446 +5594 +1358 + +6644 +9767 +6051 +6421 +8044 +5769 +1292 +6633 + +1230 +1380 +4214 +4932 +5426 +3025 +4739 +2440 +4998 +2899 +3845 +2650 +2980 +6266 + +6378 +1563 +3315 +4910 +1256 +9085 +5390 +10324 + +8771 +4691 +1164 +1066 +9470 +4868 +9659 +7827 + +1105 +6108 +4769 +3728 +1575 +4603 +6185 +6376 +5012 +5673 +1280 +5428 +6304 + +2239 +1560 +5668 +4430 +3985 +4435 +5807 +4135 +5911 +4154 +2544 +2498 +5446 +4814 + +14668 +11210 +13344 +12364 +9961 + +11641 +1360 +7500 +4268 +9701 +4171 +2548 + +1947 +3352 +5709 +4353 +4671 +3119 +2870 +2138 +4595 +2051 +1807 +3416 +3492 +1334 +4695 + +7970 +8487 +1319 +1471 +7599 +8547 +6998 +1005 +1741 + +4692 +1989 +2772 +4105 +2154 +1885 +4124 +6762 +5784 +7407 +2898 + +3169 +2220 +5328 +4295 +8593 +3355 +4605 +6313 +1871 + +10304 +9352 +7552 +9610 +1175 +10454 +3342 +2821 + +16100 +9638 +8215 +10806 +3023 + +29092 +1901 + +8203 +13092 +10935 +13568 +11032 +2819 + +4185 +6055 +1638 +4727 +2223 +1707 +2701 +2955 +5282 +1704 +1728 +3464 +4085 +4768 +4239 + +5205 +7478 +1929 +2900 +5997 + +34467 +23210 + +5963 +1701 +6455 +9686 +8353 +5662 +3429 +6921 +9281 + +4888 +4749 +6983 +4976 +2664 +9637 +5002 +2791 + +10256 +25711 +22494 + +3115 +2602 +3274 +4413 +4512 +1994 +3181 +3316 +1755 +2764 +5607 +1058 +4609 +1329 +6055 + +6595 +4222 +3407 +10124 +1446 +4008 +7234 + +3194 +4401 +4598 +3461 +2599 +6216 +4501 +1280 +4413 +6073 +1774 +5722 +3007 +3088 + +10411 +25669 +8871 + +2613 +2848 +2537 +1277 +5831 +6144 +5639 +6685 +6095 +3826 +1796 +6333 +6555 + +1310 +6643 +9862 +2064 +1697 +4078 +3647 +6155 + +4361 +2370 +2349 +2015 +4278 +4873 +5165 +4172 +3229 +6081 +5611 +4981 +5538 +4877 +3416 + +4484 +6999 +7901 +7691 +2688 +5054 +5847 +10641 + +49205 + +4445 +3962 +4702 +5865 +4458 +4673 +4979 +2816 +4194 +5485 +1370 +1414 +1938 +6069 +1713 + +1272 +5551 +6047 +1084 +1476 +6923 +3815 +2695 +3753 +4342 +4076 +7109 + +1166 +10620 +2255 +15911 + +3776 +31838 + +5462 +7846 +10506 +10139 + +5095 +7569 +5193 +2026 +7823 +7835 +8264 +3499 +9567 + +8657 +6625 +5734 +6420 +3489 +8213 +2147 +7071 +3228 +6418 + +10360 +1069 +14776 +6090 + +5317 +3597 +5311 +2456 +1009 +3954 +5518 +3283 +3619 +4970 +5877 +4643 +5428 +2472 +1800 + +9343 +8166 +3967 +4650 +6978 +1809 +9866 +1354 + +5664 +5951 + +18203 +7380 +2701 +16860 + +2995 +2739 +5498 +1567 +8326 +2770 +4838 + +10006 +1510 +3844 +1706 +8009 +11790 +7550 + +1185 +2494 +1299 +4168 +6869 +4108 +4941 +5636 +2668 +4842 +3448 +3087 +3871 + +4568 +21522 +11228 + +1210 +5132 +6540 +8377 +5968 +5358 +4232 +4710 + +6603 +23736 + +4328 +2190 +4021 +4316 +4760 +3010 +5604 +4746 +5843 +5327 +2718 +4956 +3167 +3359 + +8760 +6848 +7827 +7235 +2491 +6362 +7344 +4841 +4454 +8604 + +8394 +5794 +13797 +15870 +4818 + +8412 +14825 +16385 +11468 + +29542 + +6924 +5318 +6833 +3875 +6931 +3650 +2849 +2068 +7369 +1375 +2375 +4576 + +2269 +5568 +4133 +3853 +1996 +5885 +1074 +3356 +5187 +6079 +1522 +5220 +1704 +2942 +1641 + +14866 +9313 +23116 + +13359 +13222 +15441 +14439 +16050 + +8511 +10467 +8505 +2880 +4654 +6594 +3942 +1306 + +6483 +7197 +4990 +6774 + +8594 +7425 +5701 +9526 +2538 +9519 +8284 +8558 +9647 + +1181 +7034 +13744 +6912 +9743 +8735 + +5076 +7046 +5565 +2810 +1461 +4916 +3777 +5174 +1842 +6263 +4151 +6307 + +6262 +11239 + +2639 +3859 +6504 +4947 +6810 +6805 +3288 +3042 +5873 +6339 +2931 +4332 +1707 + +1834 +2381 +5243 +5769 +3444 +2755 +4929 +1520 +3791 +2443 +1521 +6059 +3943 +5845 + +19725 +18762 +2318 +11981 + +7867 +10660 +2834 +13236 +1524 +7225 + +1377 +2138 +2955 +1407 +3971 +1872 +1293 +6090 +1203 +6798 +2729 +3360 + +12399 +5994 +7732 +12299 +12160 + +10151 +19182 +18060 +19397 + +34075 +25670 + +5145 +6043 +5241 +2001 +6063 +1342 +4769 +6629 +7465 +3500 +4873 + +4825 +5192 +1670 +5946 +8053 +2622 +1436 +5977 +4523 +4415 +5831 + +7035 +3322 +7624 +1840 +2078 +6420 +6273 +4362 +4874 +7712 +5714 + +3644 +4526 +2940 +7904 +7620 +6260 +4794 +3705 +3585 +3033 + +5391 +6000 +3398 +3922 +4655 +6747 +6505 +3402 +2082 +1856 +6626 + +6085 +5246 +3072 +8802 +3666 +6219 +7612 +4531 + +5420 +2366 +3861 +5686 +2737 +6276 +2292 +6004 +6195 +1605 +1639 +7004 + +4932 +2314 +2297 +1611 +4624 +7495 +3485 +6580 +1751 +5170 +6100 + +9273 +11201 +6597 +3958 +11219 +8899 +9413 + +28386 +26100 + +3170 +2290 +6393 +2973 +5677 +4855 +1937 +4071 +2830 +2344 +4708 +3775 +2780 +5562 + +11208 +4958 +7770 +10314 +8593 +11973 +6000 + +19570 +24273 +20898 + +1972 +12111 +8510 +1145 + +12217 +13432 + +7383 +1407 +5216 +8061 +10559 +8810 +1385 + +2300 +3845 +4200 +3033 +2758 +2464 +1543 +1216 +4980 +4409 +3881 +5162 +1743 +2350 +4386 + +5339 +2610 +10101 +3159 +15809 + +6064 +3176 +6116 +1092 +4494 +1245 +4343 +2704 +5405 +5426 +5126 +4722 +1609 +4367 +2280 + +16523 +23950 +11677 + +9674 +1499 +11422 +13298 +9949 +10616 + +3895 +9314 +12341 +8416 + +1949 +9055 +3289 +5458 +9902 +7137 +6167 +5111 + +2141 +2700 +2221 +7184 +6103 +4030 +3695 +4116 +3358 +6650 +5498 +1608 + +3900 +5189 +3383 +5800 +5109 +2383 +1001 +6074 +1110 +5187 +5430 +3448 +1899 +5865 +1098 + +8948 +2222 +8881 +1948 +6993 +4242 +4588 +7172 + +6514 +3993 +9681 +6992 +6150 +10477 +5089 +8951 + +1714 +7959 +12561 +13204 +13321 +3506 + +4979 +3299 +1108 +5065 + +5536 +8474 +8551 +5400 +1405 +10623 +5028 +9292 + +1199 +4551 +4953 +2814 +4224 +6361 +3457 +3640 +3139 +4825 +2001 +1432 +4116 +3688 + +13664 +10207 +6028 +3098 +4410 +4175 + +5623 +3796 +2402 +4038 +2083 +2761 +1806 +3806 +1704 +1905 +1550 +6133 +4524 + +3052 +3739 +3842 +7695 +8135 +3738 +4717 +3232 +8761 + +4498 +4685 +7377 +2806 +5031 +3386 +1609 +7810 +3717 +2535 +6173 + +15301 +1343 + +6134 + +3331 +8838 +18585 +2670 + +10770 +4959 +8095 +1497 +1627 +4809 +5857 +10329 + +8734 +3895 +4301 +5958 +1740 +10403 +8830 + +3531 +13028 +12682 + +19031 + +14044 + +2867 +1941 +5744 +9099 +3583 +1719 +3917 +2737 +4593 + +4474 +2684 +9230 +7981 +3032 +4811 +9558 +8513 + +23797 +27967 + +9143 +8743 +9120 +4760 +1985 +7971 +7476 +10415 + +24714 +13638 + +13753 +13010 +12301 +15112 +13584 + +1467 +2681 +4482 +3424 +7161 +7828 +6262 +5660 +6950 +5807 +5109 + +3023 +5008 +5278 +1131 +1563 +6917 +1553 +2406 +3173 +3255 +2772 +1427 +1930 + diff --git a/day2.go b/day2.go new file mode 100644 index 0000000..3eb3a43 --- /dev/null +++ b/day2.go @@ -0,0 +1,163 @@ +package main + +import ( + "bytes" + "fmt" + "io" + "log" + "os" +) + +type round struct { + opponent shape + player shape +} + +type roundOutcome struct { + lost int + draw int + won int +} + +var outcome roundOutcome = roundOutcome{ + lost: 0, + draw: 3, + won: 6, +} + +type shape rune + +const ( + opponentRock, playerRock shape = iota + 'A', iota + 'X' + opponentPaper, playerPaper + opponentScissors, playerScissors +) + +func shapePoints(p shape) int { + return int((p - playerRock + 1) * 1) +} + +func loseDrawWin(o shape) (shape, shape, shape) { + switch o { + case opponentRock: + return playerScissors, playerRock, playerPaper + case opponentPaper: + return playerRock, playerPaper, playerScissors + case opponentScissors: + return playerPaper, playerScissors, playerRock + default: + return 0, 0, 0 + } +} + +func outcomePoints(r round) int { + player := int(r.player - playerPaper) + opponent := int(r.opponent - opponentPaper) + if player == opponent { + return 3 + } + if player+opponent == 0 && player < opponent { + return 6 + } else if player+opponent == 0 && player > opponent { + return 0 + } + if player < opponent { + return 0 + } else { + return 6 + } +} + +func outcomePointsCheating(p shape) int { + switch p { + case playerRock: + return 0 + case playerPaper: + return 3 + case playerScissors: + return 6 + default: + return 0 + } +} + +func shapePointsCheating(r round) int { + lose, draw, win := loseDrawWin(r.opponent) + switch outcomePointsCheating(r.player) { + case 0: + return shapePoints(lose) + case 3: + return shapePoints(draw) + case 6: + return shapePoints(win) + default: + return 0 + } +} + +func countRounds(f io.Reader, buf []byte) (int, error) { + count := 0 + for { + i, err := f.Read(buf) + count += bytes.Count(buf[:i], []byte{'\n'}) + switch { + case err == io.EOF: + return count, nil + case err != nil: + log.Fatal("Error reading input file") + return count, err + } + } +} + +// A very verbose way to read lines into rounds without the bufio package +func getRounds(f io.Reader, buf []byte, rounds []round) []round { + r := 0 + for { + n, err := f.Read(buf) + for i := 0; i < n; i += 4 { + o := shape(buf[i]) + p := shape(buf[i+2]) + if playerRock <= p && p <= playerScissors { + rounds[r].player = p + } + if opponentRock <= o && o <= opponentScissors { + rounds[r].opponent = o + } + if rounds[r].player == 0 || rounds[r].opponent == 0 { + rounds[r] = rounds[len(rounds)-1] + rounds = rounds[:len(rounds)-1] + } + r++ + } + if err == io.EOF { + return rounds + } + } +} + +func main() { + f, err := os.Open("day2.txt") + if err != nil { + log.Fatal("could not open input file") + } + var buf []byte = make([]byte, 32*1024) + count, err := countRounds(f, buf) + f.Seek(0, 0) + var rounds []round = make([]round, count) + rounds = getRounds(f, buf, rounds) + + points := 0 + for _, r := range rounds { + points += shapePoints(r.player) + points += outcomePoints(r) + } + fmt.Println("first part: ", points) + + points = 0 + for _, r := range rounds { + points += shapePointsCheating(r) + points += outcomePointsCheating(r.player) + } + fmt.Println("second part: ", points) +} diff --git a/day2.txt b/day2.txt new file mode 100644 index 0000000..75812ca --- /dev/null +++ b/day2.txt @@ -0,0 +1,2501 @@ +C X +C X +C X +A Z +C X +C Z +C X +B Y +C X +C X +C X +B Y +C X +B Z +C Z +C X +C X +C Z +C Z +B Y +C Z +C X +B Z +C X +C X +C X +B Y +C Z +B Z +C X +B Y +C Z +A Y +C X +B Y +A Y +C X +C Y +C X +C Z +C X +C X +A Y +C X +C X +B Y +B Y +C X +C X +B Y +C Z +B Y +B Y +C X +C X +C Y +B X +C X +C X +B X +C Y +B X +B Y +C X +C Z +B Y +B Y +B Y +B X +C Z +C X +B Y +C X +A Y +C Z +A Y +C Z +C X +C Z +B Y +B X +C X +B Z +C X +C Y +C X +C X +C Z +C Z +C Z +B Z +C Y +B Y +B Y +B Y +C X +B Y +C Z +C X +C X +C X +B Y +C Z +C X +C X +C X +C X +C X +B Z +C X +A Y +B X +C X +C X +C X +A Y +B Z +C X +C Z +C X +A Y +C X +B Y +C Z +C X +C Z +B Z +B Y +B Y +C Z +B Y +B Y +B X +B Y +B Y +C X +C Z +C X +C X +C X +C X +C X +C X +C X +C X +C Z +C Y +B Y +B Y +C Z +A X +C X +C Z +B Z +B Y +C Z +C X +C X +B Z +B Z +C X +C X +C X +B X +A Y +B X +C X +C Z +C X +C Z +B Y +C X +B Y +A Y +A Y +A Y +B Y +C X +C Y +B Y +A Y +C Z +A X +C X +C Z +C X +C X +C X +C Z +C X +B X +A X +C Z +C X +C X +C Y +C X +C Z +B Y +C X +C X +C X +C Z +C X +B X +C X +B Y +B X +C Y +C X +C X +C Y +C X +C X +C X +C X +B Y +C X +B X +B Y +C Y +C X +C X +B X +C X +C X +B Y +A Y +C Z +C X +B Y +C X +C X +C Z +C X +C X +A Z +C X +C Y +A Z +C Z +C Z +B Y +C X +B Y +C X +C X +C X +B Y +B Z +C X +C X +C X +B X +B Y +C X +A Y +B X +B X +B Y +B Z +C X +B X +C Z +C X +B Y +C X +A X +C Y +A Z +C X +A Z +B Z +C X +B X +B Y +A Y +B X +C X +B Y +B X +C Z +B Y +B X +A X +C Z +B Y +C X +C X +C X +A Y +B Y +C X +B Y +C Z +C X +C Z +B Z +B X +A Y +C X +B Y +C X +C X +C X +B Y +B Y +B Z +B Y +C Z +C X +C Z +C X +C Z +C X +C X +A Y +C Z +B Y +A Y +B Z +C X +C X +C X +C X +B Y +C X +C X +C X +C X +A Y +C X +C X +C X +C Z +C X +B Y +C X +C X +C Z +C X +C X +C X +B Y +B Z +B Y +C X +C X +C X +B Y +C X +B Y +C X +C X +C Z +C Y +C Z +C Z +C X +C X +C Z +A Y +C Z +C X +B Z +C X +C Z +C X +C X +B Y +B Z +B Z +A Y +B Z +C Z +C X +C Y +B Y +A Y +C X +A Y +A Z +B Z +A Y +C X +C Z +A Y +B Y +B Y +C X +C Z +B Y +C X +C X +B Y +C X +C Z +B Y +B X +C Z +C X +C Y +C X +C X +C X +C Y +C X +B Z +C Y +B Y +B Y +C X +A Y +C X +A Z +A Y +B X +C X +B Y +C X +B Y +B Y +C Z +C Z +A Y +C X +A Y +C Z +C X +C Z +C X +B Y +B X +C X +B X +C X +C X +B Y +C X +C X +C X +C Z +C Z +B Y +C Y +C X +C X +B Y +C X +C Z +C X +C Z +C X +C Y +C X +C Y +C Z +C X +B Y +C X +B X +B Y +C Z +B Y +B Z +B Z +C X +A X +C X +C Z +C Y +C X +B X +C Y +A Y +C Y +C X +B Y +B Y +C X +C Z +B X +A Y +C X +C X +C X +B Y +B Y +B Z +C Z +C Z +B X +C X +B Z +C X +B Y +B Y +C Z +C X +C Z +C X +C X +C X +C Z +C Z +C Z +C X +B Y +C X +C X +B Y +C X +C X +C X +A Y +C Z +B Z +B Z +C Z +C X +C Y +C X +A Y +C X +C X +C Z +C X +B Y +B Y +C X +C Z +C Y +B X +B Y +A Y +B Y +C X +C X +C Z +B Y +C X +C Y +C Y +A Z +B Y +C X +B X +A Y +B Y +B Y +C Z +A X +C X +A Y +C Z +C Z +B X +A Y +C Y +B Y +C X +A Y +B Y +C X +C X +A Y +B Y +C Z +C X +C Z +A X +A Z +C X +C Z +C X +C Y +C X +B Y +C Z +C X +B Y +C Z +C X +B Z +B X +C X +C X +B X +C X +C Z +C X +C X +C X +C Y +B X +C X +C X +B Y +B Y +C X +B Y +C X +C Z +C X +B Y +B Y +B Y +C Z +C X +A Z +A Y +C X +C Z +C Z +A Z +B Y +A Z +C Z +B Z +B Y +C X +B Y +C X +B Y +A Y +C X +C X +C X +C X +B Y +A Z +B X +C X +C X +C X +C Z +B Y +C X +B Y +B Y +B Y +C X +C Y +B Z +C X +B Y +B X +C X +C X +B Y +C X +B X +C X +C X +A Z +C X +A Z +C X +C X +C Z +C X +B Y +C Z +B Y +C X +B Y +C Z +B X +C X +A Y +C Y +C X +C X +B Y +B Y +C X +C Z +C Z +C Z +C X +C X +B Z +B Z +A Z +B Y +B Y +B Y +A X +C X +B X +B X +C X +C X +C X +C X +B X +B X +B Y +B Y +B Y +B X +C X +C Z +B Y +B Y +A Y +A Y +C X +C X +C X +B X +C Z +C X +C X +B Y +C X +C X +C X +C X +B X +B X +A Y +B Z +C Z +B Z +A X +C X +B X +C X +B Z +C Z +B X +B Y +C Z +C Y +C X +C X +C Z +C X +C X +C X +C Z +C X +B Y +C X +C X +C X +A Z +C Z +C X +C X +C X +C Y +A Y +C Z +B X +B X +C X +C X +C Z +A Y +C Z +C X +B Y +B Y +B Z +B Y +C X +B X +C X +C X +B Y +C Y +C Z +C X +C Z +B Y +C Y +B Y +B X +C Y +B X +C X +C X +B Z +C Y +B Y +B Y +B Z +C Y +B X +B Y +C Z +A Y +B Y +B Y +A Z +C X +C Z +B Z +C X +C X +B Y +C X +C X +B X +C X +C Z +C Z +B Y +B X +B Z +B Z +B X +C X +C X +C X +C X +B Y +A Y +B X +C X +C X +C X +B Y +C Z +B X +C Y +C Z +B Z +C X +C X +B Y +C Z +B Y +C X +C X +B Y +B X +C X +C X +C X +C X +B Y +A Y +C Y +C X +C X +B Y +B X +B Y +C X +C X +C Z +C X +C Z +A Y +C X +C Z +B Y +C Z +B X +A X +C X +C Z +C Y +B Y +C X +C Z +C Z +B X +C X +C X +C Z +C X +A Y +B Y +C X +C X +C X +C X +C X +C X +B X +B X +C Z +B Y +C X +C X +A Z +C X +C Z +B Y +C Z +C Y +C X +C Y +C X +C X +C Z +B Y +B Y +B Z +B Y +C Z +C X +C Z +B Y +C Z +C X +C X +C X +C Y +C X +C X +B X +C X +B Y +B X +B X +B Y +B Y +B Z +C Z +A Y +B X +B Y +C Z +C Y +C X +C X +C Z +A Y +C X +C Z +C X +B X +B Z +C Z +B Y +C X +C X +C Z +B X +B Y +C Z +B Z +B Z +C X +C X +C X +B Y +C X +C Z +C X +C X +B Y +C X +B Y +B Y +C X +C X +C X +B Y +B Z +C X +C X +B X +B Y +C X +C Y +B Y +A Y +C X +C X +C X +C Y +C X +C Z +A Y +B X +C Z +C X +C X +C X +B Y +B Y +C Z +C Z +C Y +C Z +C X +B Y +B Y +C X +B Y +C X +B Y +C X +C X +C X +C X +C Z +B Y +B Z +C X +C X +B Y +C X +B Y +C X +B Y +C Y +B Y +C X +B Y +C X +B Y +C X +B Z +C X +B X +B X +B Y +B X +B Z +C X +B Y +C X +B Z +B Y +C X +C Y +C Z +A Z +C X +C X +B Y +A X +C X +B Z +C Z +B X +C X +C X +B Y +B Z +A Z +A Z +C X +C X +C X +C X +A Y +B Y +B Y +C X +B Z +C Z +C X +C X +B Z +C Z +B Y +C Z +C Y +C Z +B Y +C Z +B Z +B Y +C X +C Z +C X +C X +C Y +C X +B X +A X +B X +C X +C Z +C Z +C Z +B Y +B X +C X +B Y +C X +C X +C X +A Y +C Z +A Y +C X +C X +C X +B Z +C X +C Z +C X +B Y +B Y +B X +C X +C Z +C Z +A Z +B Y +C Y +B Y +C Z +C X +A Z +C X +B X +B Z +C X +B Y +C Y +C X +B X +C Z +C Z +C Z +C X +C X +C X +A Y +C Z +B X +B X +B Y +B X +A Y +C X +B Y +C X +C X +C X +B X +A X +B Y +C X +C Z +B X +A X +C X +B Y +C X +C Z +A X +C X +B Z +C X +C Z +C Z +B Z +C Z +C X +B Y +C X +B Y +C Y +B Y +C Y +B Y +C X +B X +C Y +C X +C X +B Y +C Y +A Z +C X +C X +C X +C X +B Y +B Y +C X +C Z +C X +C X +C X +B Y +B Y +B Y +C X +B Y +B X +C Y +B Y +C X +C X +B Y +C X +C Y +C X +B Y +C X +B Y +C Z +C X +C X +C Z +C Z +B Z +C Z +C X +C X +C Z +C Z +B X +C Y +C Y +C X +C X +B Z +C Z +B Y +B Y +C Z +C X +C X +B Y +C X +C X +C Z +C X +C Z +A Z +B Y +C Z +C X +A X +A Z +B Y +B Y +B Y +B Y +C Z +B X +C X +B Y +B Y +C X +B Y +B Y +C Z +C X +B Y +C Y +C X +C Z +C X +A Y +C X +C X +C Z +A X +B Y +B Y +B Z +B Y +C Z +C X +C X +B Y +C X +C Z +C Z +C X +B X +C Z +C Z +B Y +B Y +C X +B Y +B X +C X +A Y +B Y +B Y +C X +C Z +B X +C X +C Z +A Z +B Y +C X +C Z +C X +C X +C X +B Y +B X +B Y +B X +C X +C X +C Z +C X +C X +C X +C X +B Y +C X +B Y +C Z +B X +C Z +C X +B Z +C X +A Y +C X +C X +C X +C X +C X +C X +B Y +C X +C X +B Y +C Z +C Z +B X +C X +A X +C X +C X +B X +C Z +B Y +B X +C X +C X +B Y +C Z +C Y +B Y +C Y +B X +C X +B Y +C X +C Z +C Z +B Y +B Y +A Z +B X +C X +C X +C Z +C X +C X +B X +C Z +A Y +C Z +C X +C Z +C X +C Z +C Z +A Z +A Y +A Y +C Z +C X +A X +C X +B Y +B Y +C X +C Z +B X +B Z +C X +C Z +B Y +C Z +B Y +C Z +B Z +B Y +C X +C X +B Y +C X +C X +C Z +B X +C Z +C Z +B Y +A Z +C X +B Y +C X +C Z +C X +C X +B Y +C Z +A Z +C X +C X +B X +C X +C X +B Z +B Y +B Y +B X +C Y +C X +B Y +B Y +C X +C X +C X +A Z +C Z +A Y +C X +B Y +B Y +C X +C Z +C X +C X +B X +B Y +C Z +B Z +C Y +C X +C X +B Z +B X +C Z +C X +C X +C X +C X +C X +C X +C X +C X +B Y +C Y +C X +B Y +B Y +B Y +C X +C X +B X +C Y +B Y +C X +B Z +C X +C X +B Z +C Z +B X +B Z +C Z +B Z +C X +B Y +C X +C Y +A Y +B X +B Y +B Z +C X +B Z +A Y +C Z +C Z +C Y +B Y +B Y +B Z +C X +C X +A Y +C Z +C X +C X +C X +C Z +C X +C X +C X +C X +A Y +C X +C Z +C Z +C X +B Z +C X +C X +A Y +B Z +C Y +A X +C X +C X +C Z +C X +C X +C X +A Y +A Y +C Z +B Z +B X +C X +C X +C X +A Z +B Y +C Z +C Z +C X +C X +C Z +C X +B Y +B X +C Z +C X +B Y +B Z +C X +C X +B Y +C Z +C Z +C X +B Y +C X +C X +B Y +A Z +B X +C X +C X +C X +B Y +C X +C Z +B Y +B X +C Z +B Y +B X +C X +C X +A Y +C Z +C X +C X +C Z +B Z +B Y +B Y +B Z +C X +A Y +B X +C X +C X +B Y +C X +C Z +B Y +C X +C X +C X +C Y +B Y +B X +B Y +C X +C X +C Z +C Z +A Y +C X +C Y +B Y +B Y +B X +C X +C X +B X +C X +C X +C X +B X +C X +C Z +C X +A X +B Y +C Z +B Y +C Z +C X +C Z +C X +B Y +C X +B X +A X +A Z +C X +C Z +C X +C X +B Y +B X +B X +B Y +B Z +C Z +C X +C Z +B X +C X +B Y +B X +B Y +B Y +C Y +C X +B X +B Y +C X +C Z +C X +B Y +C X +C X +B Y +C X +C X +C Z +C X +B Z +A X +C X +C X +B X +C Y +C X +B Y +C X +C X +A Y +A X +C X +B Z +C X +A X +C X +C Y +C X +C X +C X +C Y +C X +C X +B Z +C X +C X +B X +B X +C X +C X +B Z +C X +A Y +B X +B Y +C X +C X +B X +B Y +C Z +B X +B Y +C X +C X +C X +C Z +C X +C X +C X +A Y +A Z +C Z +A Y +B Y +B Y +C Y +C X +C Y +C X +B Y +C X +C Z +A Y +B X +C Z +B Z +C Z +A Z +A X +B Y +B Y +C X +C Y +B Y +B Y +B Y +C Y +C X +B Y +B Y +C X +C X +B Y +C X +B Y +B Y +C Y +C Y +A Y +B Y +B Y +C X +B X +B X +C X +B Y +A X +C Z +C Z +C X +A X +B Y +C Y +B Y +C Z +C Z +B Y +B X +B Y +B X +B X +C Y +C Y +B Z +B Y +C X +C X +C Y +C X +C X +C X +C Z +B Y +B Y +C X +C X +C Z +B Y +A Y +B Y +B Y +B X +C X +C Z +C X +C Z +C X +B Z +C Z +C X +B Y +A Y +C X +A Y +B Y +C Y +A X +C X +B Z +C X +B Y +A Z +C X +C Z +C Z +C X +A Y +C Z +C X +C X +B Y +C Z +B Z +B Y +B Y +C Z +A Y +C X +B X +C Z +C X +B Y +A Y +B Y +B Y +C X +C Y +B Z +B Y +B X +C Z +C X +C X +B Y +A Y +B Y +C X +C X +B Y +B Y +C X +C Z +C X +B Y +C X +B Y +B Y +C X +C Z +A Z +B X +C Z +B X +C X +C Z +B Y +B Z +C X +B Y +C Z +C X +C X +C X +B Z +C X +C Z +C X +C X +B Y +B Y +C X +A X +A X +C X +C X +B X +C X +C Z +B Y +C Z +C Z +C X +A Y +A Z +C X +C X +B Y +B Y +B Y +C Z +B Y +C X +C X +C X +B X +B Y +B X +B Y +A Y +C X +B X +C X +C Y +C Z +C Y +C Z +C X +A Y +C X +B Y +C Z +C Z +C X +B Y +B Y +B Y +C X +A X +C X +B X +C Y +C X +B Y +C Z +C X +C Z +C Z +C Z +A Y +B Y +B Y +C X +A Y +C Y +B Y +C X +B Z +B Y +C X +B Y +C Z +B Y +C Z +C X +B Z +C Z +C Z +B X +C X +C Y +B X +B Y +C X +A X +B Y +C Z +B Y +C X +C X +B X +C X +B Y +C X +B Y +C Z +C Z +C X +C X +A Y +B Y +C Y +B Y +B Y +B Y +C X +C Y +A X +A Y +C X +C X +B X +B Y +C X +C Z +C X +B Y +C X +C Y +B Z +B X +C X +A Y +C X +C Y +C Z +B X +C X +C Z +C Y +C X +C Z +C X +C Z +B Y +B Z +C X +A Y +C X +C X +B X +B Y +C X +C X +B Y +C X +B Z +C X +C X +C X +B Z +A Y +B X +B Y +B Y +B Y +B Y +C X +C Z +B Z +C Z +C X +B Y +C X +B Y +A Y +C Y +B X +B Z +C X +C X +C X +A Y +B X +B Z +C X +C Z +B Y +C Z +C X +B Y +B Z +C Y +C Y +C X +C X +B Z +B Y +A Y +C Z +B Y +B Y +A Z +C X +B Y +A Y +C X +C Z +B Y +C X +A Z +C X +B Z +B Y +C Z +B Y +C X +B X +B Y +C X +B Y +C X +C Y +B Y +B X +C X +C Y +C X +B Y +C Y +C X +C X +B Y +B Y +B X +C X +B X +A Y +C X +B Y +C Y +C Z +C X +B Z +B X +C X +C X +C Z +C Z +B Y +C X +C X +B Y +C X +C X +A Y +C Z +C X +A X +B Y +C X +C X +C X +C Z +B Y +C X +B Y +B Z +C X +C X +B Y +A Z +C X +C X +C X +A Y +B Y +C X +C Y +C Z +A X +C X +C X +B X +B Y +C X +B Y +B X +B X +C X +C Z +B Y +B Y +C Z +B Y +A Y +C X +B Y +C X +C Z +C X +C Z +A Y +C X +B Z +C Z +B Z +C Z +C X +B Y +A Z +C X +C Z +B Y +B Y +C X +C Z +A X +B X +B Y +C X +C X +B Z +C X +C X +C Z +A Y +C X +A X +C X +C X +B X +C Z +B Y +B Y +C Z +B Y +B Y +C X +C X +B Z +B Y +B Y +C X +A X +C X +B Y +C X +B Y +C Z +A Z +C X +C Z +C Y +B Y +C X +C Z +C Z +B Y +B Z +B X +C Z +C Z +B Z +B Z +B Y +C X +B Y +B Y +B X +B Y +C X +C Z +C Z +B Y +B Y +B Z +C X +C Z +C Z +C Z +C X +C X +B Y +C X +B Y +B Y +C Y +C X +B Y +C X +C X +C X +C Z +A Z +C X +A X +A Y +B Y +C X +B Y +B Y +C Y +C X +C X +C X +B Y +C X +A Y +B Y +C Z +C Z +C X +A Y +C X +B Y +C X +C Z +C Z +C Y +B Y +C X +B Y +B Y +C Y +C X +B X +C Z +C X +C X +C X +B Y +B Z +C Z +C X +C Z +B Y +A Z +C X +C Z +B Z +A Z +B Y +B Y +C X +C Z +C X +C X +C X +C X +C Z +C X +B Y +C Y +B Y +C X +C Z +B Z +B X +C Y +C X +B Y +C X +B X +C X +C X +C Z +C X +B Y +C X +C Z +C Z +B X +C X +B Y +C X +B Y +B X +C X +A Y +C X +C X +C Z +B Y +C X +B Z +C X +C X +C X +C X +B Z +C X +B Y +C X +B X +C Z +C X +B Y +C X +C X +C X +A Y +B Z +C Z +A Z +C X +B X +C Z +C Y +B Z +C X +B Y +B Z +C X +C Z +B X +C X +C Z +C X +B Y +B X +B Y +B Y +C Y +C Y +C Y +C X +B Y +B Y +C X +C X +C Y +B Y +C X +C X +C Z +C X +B X +C X +C Y +C X +C X +C X +C Z +C Z +C Y +C Z +C Z +B X +C X +C X +B Y +C X +C X +C Z +B Y +C X +C X +C X +A Y +A X +C Z +C Z +C X +C X +B X +B Y +C X +C Y +B Y +B Y +C X +C Z +C X +C Z +B X +C X +C X +B Y +B Y +B Y +C X +C X +C X +C Z +C X +C X +B Z +C X +C Y +C X +A Y +C X +C X +B X +C X +C X +B Z +C X +C X +C Z +C Z +C X +C Y +C X +C X +C X +C X +B Y +C X +C Y +C Z +C X +C X +C X +C X +B Y +B X +C X +C X +C Y +C X +B Y +C X +C X +C Z +C Z +C X + diff --git a/day3.go b/day3.go new file mode 100644 index 0000000..98357dc --- /dev/null +++ b/day3.go @@ -0,0 +1,102 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" +) + +// Returns two slices of the input array representing both backpacks +func ruckSacks(inputline []byte) ([]byte, []byte) { + split := len(inputline) / 2 + return inputline[:split], inputline[split:] +} + +// Gets the priority based on the character byte +func itemPriority(item byte) byte { + if 'a' <= item && item <= 'z' { + return (item - 'a') + } + if 'A' <= item && item <= 'Z' { + return (item - 'A' + 26) + } + return 0 +} + +// Makes an array of 52 flags indicating with 0 or 1 if an item is in a rucksack +func insideFlags(ruckSack []byte) []byte { + flags := make([]byte, 52) + for _, item := range ruckSack { + if flags[item] != 1 { + flags[item] = 1 + } + } + return flags +} + +// Checks if one of the items in a rucksacks is flagged in another rucksack +func inBoth(ruckSack []byte, insideFlags []byte) byte { + for _, item := range ruckSack { + if insideFlags[item] == 1 { + return item + } + } + return 0 +} + +// Finds the item that is in all rucksacks +func inAll(elfGroup []byte, groupSize int) int { + for i, itemCount := range elfGroup { + if int(itemCount) == groupSize { + return i + 1 + } + } + return 0 +} + +// Solves the rucksack problem in linear time (since we don't have nested loops to check for the presence in the rucksacks), +// could be more efficient with memory i think? But that would involve more bookkeeping +func main() { + f, err := os.Open("day3.txt") + if err != nil { + log.Fatal("Could not open inputfile") + } + // Part 1 + runningSum := 0 + scanner := bufio.NewScanner(f) + for scanner.Scan() { + priorities := make([]byte, len(scanner.Bytes())) + for i, item := range scanner.Bytes() { + priorities[i] = itemPriority(item) + } + r1, r2 := ruckSacks(priorities) + insideR2 := insideFlags(r2) + duplicate := inBoth(r1, insideR2) + runningSum += int(duplicate) + 1 + } + fmt.Println("part 1:", runningSum) + + // Part 2 + runningSum = 0 + elfGroup := make([]byte, 52) + groupSize := 3 + elf := 0 + f.Seek(0, 0) + scanner = bufio.NewScanner(f) + for scanner.Scan() { + priorities := make([]byte, len(scanner.Bytes())) + for i, item := range scanner.Bytes() { + priorities[i] = itemPriority(item) + } + for i, flag := range insideFlags(priorities) { + elfGroup[i] += flag + } + if elf == (groupSize - 1) { + runningSum += inAll(elfGroup, groupSize) + elfGroup = make([]byte, 52) + } + elf = (elf + 1) % groupSize + } + fmt.Println("part 2:", runningSum) +} diff --git a/day3.txt b/day3.txt new file mode 100644 index 0000000..cb4dee4 --- /dev/null +++ b/day3.txt @@ -0,0 +1,300 @@ +rNZNWvMZZmDDmwqNdZrWTqhJMhhgzggBhzBJBchQzzJJ +pHlSVbVbFHgHBzzhQHqg +nVsqGpbbtDtTNmrmfZ +zrBMnbzBchshsttfbMRBgmJggmmCHGgDhDgNDGHL +VddZqQqdvSQMJHJGdCDCDDmH +pZWWllPQlPZQvZvwpSVlqlvtfswMRzBbntzRbzbfstsRzF +NnjjRlnWNSWWbGwccbcchfPfTvfjfTBBpvmdMjTfvB +FVzJtDDJDqTMlmlM +gVQZlFLlzHhLGShGww +rPZtvtFrFPgWjQvCBlcqMzlqQC +QGVDJJnLnVTCJBczqqTM +fNSSnmLDSVLhhhSNSLhGSGfVPjrFHwmQwtwWFRWRjWPHrwgt +SvmlrVrCvmNhSSVZVCrsgqPfbwGFwwwsflbbGb +QHffdnHDDQdMGbgqPwztdPds +DjBjWHfQDfTQWTBfpMBQLVmmmcCCcVhCBBBhhCmC +trLHFFQHTLHJQrflfCnLLHrRfRRPqSRPbPbbsRGqqGqhjj +mcMpNWVVNmNVsSbSJPcGhPRR +NpzNgwzZDVNZVWNpHJQLQHtQrZQHrBCl +JVCMfgJVrJtMBhhrfVVfhVsjvpFGFgjSSgFdSGGqjvjvqF +mHllHlHpmWlDSFqbdSTS +nmZRLzQnWVpctMVpQs +BrvRzWBPWbRwGRjbbRGrtrfqjCJCjCJgJsZJscFCZcJC +MnnnVMVhTMQhsccVfwqFJgqf +mMShHHppQmHrrBzwtSbWwR +pWWGJMJJwlnZSqjWmvSWZC +gtHrLttDtgFjjqRZZCrjpp +bFtbTpHFHLbfLFbHVttccttddJGQdJzTwdTzJlMnMBwwJJ +JhqHFhVMzJPQcdcVncdc +NhgfwSjwCWwltSfnrnRWZdpcPrrRnp +NNhlltBjssNBgwLFFvDmDqLzHqBB +LnFrnddfrLnMFjWzpFhcWpjpFc +ntCwgtNggCqCgCqqPPltvcjjhvmWhmvDzTzDzD +lqlVQgVCSPVllVQSNGMHHrdQsHrJJBnMHHJf +ZGZcRZNWpcHZhJfbbNblrfrgllNr +stBMtzCCsHMfFQjfSSPgtt +qmszdsCzMncdGwdWZGvH +PccqPqbhvSvvvtWNjTtWsWcscp +gRwdDzHJQgHzfdRhgHRffzwsTTjTTCjNjssCpmWWDjtCLW +zdRMwdRHhGJwgHlnGGSFvvSrnSrr +rRpMJtPwrcCTNNQNMZQm +mDWdWVddbbbmBflFhvTHjjQjfZTgZgLLfH +bhBbFFnDVhdddFBhdmpJRrzStJmwnPzcsJ +RjlpRRWzzRGRmGzlCRRlQjCgtvTJTtJrTPttrWTwhFvvVJFT +bSBdLLqbcqcLndLHZNqcZdBDPrVTDDTJSFrJJvVthTwwDS +cqVsnBfHffVdqnZccGMmCsGzQmjsjlljgz +wMzJhLtwbnMWtHcFCCFqFNNbgq +fMlMfjrRRmdmGCGVVCHcVqcVTC +MmRRRlvmQWzpvnZpwJ +gRmgMRMmRwzzmwHbwcTNqPDVBbPTZVqPNZ +fWHphpGFpfJrrhPsNTNZVsNVhT +WGfJdvltJJfHrJpRgvMRMSwRznwMmw +htJFGsGspCppCFCGthCdpmJmgmWZfqqzWzlWcfgZHgzHlg +nwVMjVcVcWlbnBlfWB +wcNDTvPPDMFJLLppDGDD +hjCBgPbvMvmQDzlWnWjm +HrHtgZRRRNwczDWwwDzsQQWW +LpTqNtFtLFqHLHRrqgFHffVVBChvhhVPBCPhbPbp +CwpbCwjGqSjVllpGCllBfhZZRDPNcPPNvLLLDSDN +WshFFWsgTHsdMzQvPczLfLZDZRcLfR +rWsJQTMhWWHdsQTgsFJgllClVpqVbqnGblCppCVr +gRBSGcBDBSJSvPQwrTFLjggQTQ +HMMnHHHZfFVFrrMT +HhlhppCNcJzCTtBT +CCffCCmRLTsQRPHQQMPF +dWdbgcDSNclbbdwdSqHsvHPQPTPJplPMFMGJ +DWbDNcqZDSWSccNTVBCzVVfmBVZnVz +BnsrrvZwBsBSJrrrqSTgJQjCbCjgbCHDJgJFjQ +hLmGlnLmGWcjGDgfFFjQdF +hhWPmhPtczWpNRmppzRhLchMsnwZvTMZvVSwwrsNwSsBvr +tDCCltNVttJhNGlMPSWdqBqSjM +RFQcpcRTpFcnFzdLmLSWjMSSBLSQ +jwzzczpFbwnHcDCsthDJJsNbst +dLRWTHSwTmTwTcTWvQNVVQCvVvNFps +GnBPtBMJBPrjGGJMjrlqChNpNlsnhVFhQsVQ +JtMtGJfrJgDJjPjRTZLdFcRZRmwSDH +VSccPJSBLgZPDLDQ +zfpLMmLsHQGqgQHnDD +zdLLMssmrdfhddcVdJtScB +VvpTVQHSqSHSHqqHJVmRJVHpgDBwDgjcDDDgZjBZBjwBZbRw +PCdssGlstdWslFPfNPrtClGjwBgBJgJNwcjBjBgZwwMBJD +tlJldhdhdsdhTqSTqVQqQq +VGqTcTqbpPwrjfbl +BvntnZNNsLZvLszSnCsvJthlfjTrZwlrjrpPlwlhfwrl +QBtNtJLvTsFdQcqWmQRR +fjcjhmjBvcvcSvcZ +HMwZtRQQpGGRgzMvLnWWnbLlSntlbv +JQPzzJHqQRqGMMQwHwzDZZhmmPfjDjmjsCZhPj +cBlZZMfBrCBMwBMCvQzTwFbQzPnbwjTbTg +WtzpVDzmtthzGFQTbTThnnTQQg +sGWstpHdpGDmdHdmGmmmJNstRMrCcBSfBSzNBNRrSRNMcMMv +mMPDVBZZLSmRdcFpjr +fggGGfbfgQStjjsdbtdt +gNqQgCQlNCCJgJHvnvnHMjPHjv +bLsRQrQsGQbLrbRZMGgbJJBJFtlFFngJphhcfBBq +jjdHCCjfVNmmmNDFcBcpBthcplFDFq +jmvvmWVjjHTCVvNjSbQGLrRzwMWsMRwfGG +sJNCsCFFCNPhCzlrSvRrvwhRjj +MMGMTwpMHGzrGczzlG +qVmwgHtDtmCdWCsNFmNJ +fmhWhjVjNpqRRJjwRw +gnGQGDDCgSsCvPlvPgnPgnPtwqbpHRHqHdJpzpQJJJRJRF +wgPGsDGPsZgGgBmBWNZNfLWWrZ +WdsCVtjWWWHRRqLLHncC +fbSpMSPSZHRRcqlpRc +cGMmJmfMPPPccZMNQPWvjTtdTjvgmdtTsggw +tPBQhHWBtQHgWQCtLwddcGnfpGpwwnbhVb +vqQzTNJJJTvRrTNFJsZrrzFlbbfcnVbbcwmGGGpVzmddcdfd +NSSqJvFFFFFQjQCjQDSDPD +rQZnVVrZmZmgSWqHrSzHPC +LGFLwcMBcllBjFNwGjltggSqSWCCzvNgSqSHtt +wdhqqGBwwqGMcDhcwdFFbbJppZbssbfZQsQsdVQm +lqBZlsjVTbVqmFrSnTFSvwncPP +zQztHfZQtWLJzPFnnQScFcFrvS +ftHJWHhfttHWffhtgLNfZDWbdqBqjbVssBDCqCdCsmClGG +MlbWFTJQFbFFzRdNjNtjdtBT +srwnrsLVHzQPQsjjSQ +gLpnwgnwnHCvcHHcvwgCvGFFhWGmFmqMMbQFQFFhlGmJ +qqNcJgJccdqhsqgsggdgqgcrtfNWNZzVbvVFzttMfzbVMZ +GLlpPpCpwPLDGvrFVWrWWbZt +DlRCDDLSjTjDjSRSjPClwnwSHHHQmmQvTJcQgvddHsqdcgmB +jmRjRbRQLLZbPnbrcTTHHHNn +MfhhmmwtvStrpnJJHc +fgqlvfhvFzMwqfvMfFWlmMvLZsdQsZVdCdLZdGQjRzdQjD +lTPcDlVdTlVVMSDfTJccVzdlmMgGBmppgBmnHGHqHqQqqQMH +ZRjWFPsLNLLrPhWNtnBBvnpGpHGpQmHnmR +CtwssCNLrsZWjrjcbfPzwJJJffDbTl +cjMvvqpJFqhShNCRQR +ldtDgQZDPdzztLZgPTtfbnStfBSbNNSbnbhhSS +TDsrzsZZZTFHmVHjcsQW +BQmQchrmBddcmZZdpSgrpswWWswVsnnnDJVnnZFnGN +TfStMPLTHvbvRVGnHGsNnJWFNV +qtvMRMMPbbPMLqRPvRTRzMjSSmprpQdBchlmmgldgjzm +nRRnvNPhrbZDLjvS +HCszMwcHHcLDrbQDWr +ptszqwdMbnnhPBqN +QbzhhfbFhBbpbzwwLjLJjSjltL +mNndGrSStHJTJLln +rDMMNVWdVpCbSbSp +tDTSTSTTTTJDwqjWqBWttdjg +nNPmVfnGfPNVLmNzfnzPVFMjdpBwWZwZHwBLBqgjqpWH +dfGPfVQGVPhGzlmnzSvsSTDJhTbTTrrSRD +ZfgtZBptBfRQNQggjjrjjwmwsQJPzrwm +TwTGGwTwzzsJzTsH +lFvwqFLhFMnqcLlVLMLfptNWppppDBDbDfbFgW +mjftBfVPjttmjcSjcPttzJlvnrwvTRrTnvwvlRrHHTHRTR +WZDWDNLFWbZbcMDWGZDbNdMCRsnTdTvdnqrHCTrvsRRvwC +DQFZLNNgtBJQcBzJ +HbZQZFVbQVpQplQZGbGchDffltfLtmdgDjggTmtm +zWzRCdnCRBRdJrzDjLhDthjLJTTtjq +CPPnwSrRdRSzCGMcZZZMwFwMZF +WBQqNQnQllwnWQlvBBMlljHTqqFdGfmTdFfcFTFFcqmP +rsRRVrZhrzbtpZRRhFDmPvfFFrfTdFHGvc +VtSCtSLbtsZVtttthCbJSWSlJlwJQggWWglvwW +QfFLWCvRfSLFCtvtFhNcqDDcGVbhGcqh +ZVgrdZZPPZZzPwdjzZhmccsqJGqDdsDDNddD +pzzwpgZzZZTznZnjZZzPVRLQLlvfSlQRSpWlCvtSQv +RtcHhRMcrHhBrrTNDVBNLqLqQqfBPm +wCbWzWbvdWCjbWppmtmNmqmLLsfsNV +lwjWdbztgHTgggnnnR +flBbzbMfbrTlrMvBCcwPggdmcdmg +VDVVRFZRZSFFhQLSGFQhjSVZCgpvPwLCzpdWWzccwdvvvwcC +hDHRGQVHHQVRZSQGbqqfNTlbHzrbbsqb +MTFdTsZpPTcMpFCPdCBmMBmRfRGBmQgQRRgt +vbDSwvhzznnbbhDWnvSzRBgQQLgLQltqtqlmwfGB +jVjhfSnNDNbzzWzjWSjrCFNpcHdpTTJddJFpsJcc +ZrrZPHfChPdDPVVdDq +vFmsbTsmSbbBJssmSBvTmmnTrnrwlWqwVlLrVTLLTWqL +JrFbpsvFBMBmzBzFStcRhjZjfCCpZNCtct +TGgRrTggwwtvtQtdCdQNqN +sJHZJVZHDBpFBZBBNzNdhzdpSzddvqhN +VZcvFsJVFvsmvssbcnrwbrnGMbMlRn +SdcdWzMJdSMWMddZJdVcmBmwrwqrrnVnVNtr +mlQHCfgbjsfQTbfCBNtVhVnntVBnVh +HLDslDDmblgHfvLHPJFSZPpDFpFFpdPS +qNqPNJvcSzGGPQnGQp +bWhbgsshZWBhltthhbWtCsZNjrzpnQnnznnjtQFrjGjVFGnn +bRDNddhNdDsZdNChmvDmmwqqvLqwSJDq +TnSfPnCSmnSgpSTmfLzfMFLWFJJLWWsBsr +jdQjcdqDVVwDcPsPzMRJMLqPqR +PGhGchjhtZlTGTHCCb +ZZRrJJqSqJwNFFphsGsLPJ +blcMCflvTTPFFNpVvsFv +CcTlltTmtmMdmCmnlllBDDSDQSwSjRDQSdswjR +MCCPNsnQFWbvvTPF +CcCVJJhjVJZRtcCclDDlbcbTcGFFDz +HpjtVwVZfpjJVhZgCVtLmrBwdMrLsNNsMmdLqB +TJTDTnrFzzdWgWGJSSMJwg +LhPVttjtLmsPqqqVsVpsjLlgWlwHvGnlHWlgHlGgwvlP +mQshLhmsnsqZcqhZqpshsLVpNTNbBfzTRBQdFRzNNFBTdbzR +ZGqMLGqvJsJsMJmd +PDVQPfPcrrcFrrzrTdgCjSSCzgszmlJjBj +PfRtVfttVcWtVJrfbGqvwqLpRRwvpppH +HmLmMSnnWnrTrnvpqFCHVGfzVFVHQj +ttsstRhhcNwbswNtdwsdNPFfjzQppQPjfGGfQVPCpR +bbsDNtDcbhstsSZLDmSSgCmnSS +tfwBBLcJVrDnqvLv +zmWWJRZhWRRRGRNdgSZGgWTvpnjvrDqvpHjjzrpnrPDnHj +NdJmSGZWRhRNsghWTJmdGfQCtllCcFMwffBftsfMQc +lTLgTghpGZJDBrnGWnnm +VlRwlHttwqmHHbDWHJ +twldzCvsRdsFFtRtSczTjSgMcfSpSzTM +pBpMBTcSlNtMcTfFCmbPDzCDLb +JgrjjJqhGZQrQrZhnJGDDCZfvPDdDzFFdzfmZL +QHhqqnrVJJPhHrnGQgwMNwMMctcWRWSBMNtNsW +FJrlhpcfDCcFWpNpwWwjNQwz +RTTvPdbjWzMbnNNM +GRZTGggGgtvjGcqrBcttcDlFhr +pMRVdVbbMMMSdWWqHpCTvTjnBBBFFGGB +smNfZgcsNrcmzggZszsgRnPGFHjBPTBTjGjPTBNj +RmwgsmgfrzzsZtfgZLQQSVWlwbdMhlwdqQ +mRRjPmLrrSmzSczSzPgVZFpTCpZCMWrZQMQrZJZT +BvdbHNdnJtvBDbqqdBlvwvqpDQMpZQFMCsQCspZTMMCZCF +nBlfbfbndJBHPfLRfmhhhhPL +ScJDFBNLLbVRqVfZ +rWrgmdMgnnBhBtnntf +CwBWWMgCwddCgwsQjsrvNvlTJzSNHwNTHFJHzS +vnddCrNpCgtjLdSdgCgCCvLnWqDhWBQhHqQHDqBhQHDHNNDl +wPTVfVTJmZGJVJGffZBwHMWlWlHlWtbQDqbl +mGsJVVJsTVTTmtJVzzTJjdSjjprzCvpSLSCjdnLg +zLNggsVHmNNsssLmwzLQZLwDRvGQBqGGDDBBvvDBDqPhRG +WrCjbtJdbFhBRglGgjqv +JWCJcWcSdWcctnJCcJJJbcbmzwwznmgLzNzmLHmHZMwsZL +JRRDNNhhszMTzNMwCG +MnHPqmgmHjPnnvjqdmjFLQwLwTLwzTwTdGLCzS +BnPPZqmcfqgqnnZmBmqjqhfWVJlRMlhWlRDlVsssbh +nmTLTqsvqnwqsvwDPnLHdNVrMMHHCBlmVdmGNV +RgRpcJhQRfQZcJbWhQpBHCjVCdjCVGdddMllHp +fczbZhzbtcZfgRRBcWSPPwFsLSDswSwTsSzw +rbFpzFCVBrrBZCjbCzHHBVdJllGDLsLrDtsswswstGJs +QNhNNnNnnQhNWSnRhnJtdpJpJtMDGsGLLtsQ +ScmRvNRNnWWvNvNvfpTccjVZbqgZgVzqHjCjTVTVVq +BTppwCwBpwwBqnjlHcLBTHnbbSbDthsSSJgsnDDRgJRD +FVGzzvrdMGSSsdtZtZgd +QvQtvtGFlBLLjLQL +gsWWsNMjwgPMPWnMjShHHZSZbmZbbmTSnb +rlCvVQrCfqffpVjQRqCCvDDTTTmmZhZTmZhThFmhhZZhqb +CDDVJpVfrJJVJLMNzMwWwLwj +nHrcsZrssPcBPtQJLJtQQCZQpV +GFWzNzNFdNbTMMqbGTqTqzqqdLCpfDQCtRVVCLtdCfQsdCCt +TlNqGTWFNmMMszhGsmFTWGFzwHnvSjgPgvgSjllBvBnvwPBB +mpMggjgMlmtjtGMwZpcSscBlcsSblhsfSdfs +zzPVDRrLrCTQNCzNRTVFNLhBhBSqdQbcfSsJBJdbjJfB +RPTRPTVNTFzVrHVDCrTHmHtwMvwWMmtwmGjWgvGv +rLMcvfHVfMgLFvfNnBBzwRbBwnrGNs +dttJjJCtdjmwzwBCRRCqcs +TddDQDJDtQJtcJFpPQHPQMvfQlFL +LQSqqpqTCSJcsDcqQMMhnnjMjppZhwHZbZ +NRtvtmgmvdBffgtVCBWVRgFbPzHbMHbnwwjMPZfHbPjzPP +RNtvCvNdgtNNmldgvCFRNVLsQLqJcQGJJrccGSlDLDLr +GdwwqqqwGVtjdPvTCplbHTPbPzPTpp +RpLmLLpFfNsgTzclhzClThgH +ZFsWZLFZJsNsnWsnRsRfnfJQGBttjdGJjBvvwjdpjjttvj +tfPzzLrrdrQlTlvn +qJRBhNhNGVRBFRTlnJvCmvmJPCCl +VVPDNchNMVFGRMFcRVBjsZZcttSLSZzzStcWtZ +pTrwTrnjtttjprTSTNTQfcjcgPsPZfPgjdgdsQ +mCmCzvzhmJDHzJDbhFCDPsgddcsfcdsbdgVRpdVs +zqJzFCDhmqvGhMmCvmGhMCGJnSlnllSBLllLMtNpWtpNBnlt +JBhJrFLhGrnJZrlcbffndnggfggf +jqmWMGGSsqCsmpjmsDQzlcHgbtdzjjlVfctjHV +GWSmSCspCsMSpRmSmqMMCBvFLJLhTTwFhRFLLBTwrv +BCdWccqcqpQqrsNgGsWMgfNW +lFttLzzLwnfsLrsNsNLG +zjNlznlwvRPZnltwvPFnZRCbmjCcqjpcpQcqVVdbdVBm +CwTbbCGNFHtHwwjSjJpzjLMdMMzT +rscqqVvWgWrZMjrlmSzzmLrM +WPqqZnPqgncnBQQVRbCDwRHGSFHPwRNw +ZQnZwWjFvdsHwBJltfmfSlsqlJ +gPprhMDTpMpPMVNqNRqNlJhltJdJ +pLGCcCrgppCrVcMpdzjvzvjLwQQzFjwzHF +NmmmvfqcvmLSQhCLvtvL +TVlWTZVJZJsFbwWbQQhtQgLFCnSgghLt +hZJTJZhwZlRJrJWHVlblMBffmqfdNMjdGdBBqqcH +GJJfLfptGqqqnsVqVVjjDnNc +mZPSvPmBCdmwdCLDshSbRnnDDhRL +gvBrBvPBPPZCTLZmwmrgQdwfTJMHGzHfWffJzFzttHWFzW +sBMvmzWzmFmNWJfffZNLfbqZbtZq +jRQVRnhhppnVhjgnDLttLqbLqLQfDLss +jRRgpGVGhwhnspgpRppwSnBvMMcWvGczGJJHdmHJmJFF +VCLHFwHMhLghHHWhFFgWNMMVzmdmbvWdJqBPJPPBppqmBdzm +SRTsjGZTsZZnSnGZGqdBmrqPvmqqqsPpmv +GvQSGtZSQllVhtLMcLLNMH +GsNdWpdVWGSHjFCWCqFFgqngvW +mRQTcrLRmZTPRLPZfqqqHbDDDgFvFnvqzQ +hfZHrwwmcZRwlLfwlmrRjMJJsVjslVNBGNjpVBBG +pllpztRqBBvvGPpG +QQhhZQbVcZQTPMWWGbvvbMHM +cwgCQCLZChQwwLZVzCrzzqNCzrDqdFPF +bgcLPvvpcbdsbpSsHRTCqsRfWfsHRm +lZlQtthrnlVMmTHqqqqHSChB +rDtlzttnlSNrMtQjZVrcgGDLLddcdcpPgPGJJd +jvGbvLLQDSGlRmmSLjlDmRQggFBrMCwWdsBFWBFjdrrWrr +PpTfcPZpNTVNpHzTzzzpPJhBcwrrhFsrMdFcMCBFhgMF +JTTqdtfzfzJpqffNdTTHGtQRnmDQGGLQQlQRbblD +CQQCshCMwgQhMdjWJFBPpbjgmmWj +SNNvcGNSZSTDtGDcczJJBmzbjBJjmppbppms +cDtfDVNTGGGNNrwLLwHdqLhfLs +ngghZCChzhNjjNbbJfdh +slPPRLlBBlVRMvRllLLHvcpcdFfJjvdFpfHfcZ +RDZPZBLmPVWDVrQtnzSTmgTwmTSg diff --git a/day4.go b/day4.go new file mode 100644 index 0000000..dec7170 --- /dev/null +++ b/day4.go @@ -0,0 +1,80 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" + "strconv" + "strings" +) + +// Use min and max to check if fully contained, since we have sorted sections +type section struct { + min int + max int +} + +func sectionFromString(sectionRange string) section { + minmax := strings.Split(sectionRange, "-") + min, errMin := strconv.Atoi(minmax[0]) + max, errMax := strconv.Atoi(minmax[1]) + if errMin != nil || errMax != nil { + log.Fatal("Got unexpected input", sectionRange) + } + return section{ + min: min, + max: max, + } +} + +func (s section) isInside(o section) bool { + if o.min <= s.min && s.max <= o.max { + return true + } + return false +} + +// Use negative cases because it is easier to think about when ranges don't overlap +func (s section) isOverlapping(o section) bool { + if s.max < o.min { + return false + } + if o.max < s.min { + return false + } + return true +} + +func main() { + f, err := os.Open("day4.txt") + if err != nil { + log.Fatal("Could not open input file") + } + + // part 1 + scanner := bufio.NewScanner(f) + runningSum := 0 + for scanner.Scan() { + sectionStrings := strings.Split(scanner.Text(), ",") + sectionA, sectionB := sectionFromString(sectionStrings[0]), sectionFromString(sectionStrings[1]) + if sectionA.isInside(sectionB) || sectionB.isInside(sectionA) { + runningSum += 1 + } + } + fmt.Println("Part 1:", runningSum) + + f.Seek(0, 0) + scanner = bufio.NewScanner(f) + + // Part 2 + runningSum = 0 + for scanner.Scan() { + sectionStrings := strings.Split(scanner.Text(), ",") + sectionA, sectionB := sectionFromString(sectionStrings[0]), sectionFromString(sectionStrings[1]) + if sectionA.isOverlapping(sectionB) { + runningSum += 1 + } + } + fmt.Println("Part 2:", runningSum) +} diff --git a/day4.txt b/day4.txt new file mode 100644 index 0000000..29e566a --- /dev/null +++ b/day4.txt @@ -0,0 +1,1000 @@ +7-24,8-8 +2-75,37-51 +47-78,20-39 +53-91,34-53 +13-50,14-50 +93-93,20-93 +74-80,48-81 +30-87,27-38 +6-93,7-94 +56-98,12-49 +10-71,3-4 +87-95,55-88 +27-98,52-99 +4-11,11-82 +4-90,4-96 +3-89,4-80 +4-88,6-82 +69-75,70-76 +6-71,5-7 +91-96,8-74 +52-53,2-52 +9-94,10-97 +14-75,63-76 +3-26,3-4 +40-55,39-41 +17-22,4-80 +62-94,15-95 +37-77,6-76 +21-22,22-27 +3-94,93-98 +92-93,12-93 +80-81,6-80 +53-54,54-95 +45-90,44-91 +12-99,21-95 +36-69,35-68 +30-77,61-86 +24-49,23-78 +40-87,40-86 +36-53,53-54 +11-96,55-86 +31-41,40-45 +8-99,11-87 +15-71,70-71 +5-34,8-33 +2-96,2-95 +31-95,22-96 +47-98,48-90 +48-79,48-80 +46-84,45-81 +61-96,85-97 +15-82,16-84 +23-54,51-80 +17-66,17-67 +18-95,16-16 +6-22,21-21 +74-78,74-77 +90-99,91-94 +1-34,7-78 +72-72,9-73 +80-80,79-97 +71-80,77-81 +61-62,59-61 +87-89,37-88 +30-40,40-81 +5-21,21-69 +17-37,16-18 +39-74,17-98 +73-98,14-96 +16-95,15-17 +22-62,22-63 +4-4,5-63 +9-11,10-92 +33-51,51-96 +1-99,1-51 +5-76,4-76 +58-84,35-89 +2-25,24-38 +1-8,8-95 +48-79,25-78 +85-98,6-86 +2-24,9-25 +7-60,6-60 +4-6,5-28 +8-95,19-98 +19-19,19-82 +71-83,33-87 +61-77,95-95 +57-58,56-59 +3-53,1-98 +83-83,10-84 +30-93,92-93 +37-73,4-95 +37-96,38-99 +23-89,2-20 +31-90,89-90 +53-59,60-60 +88-92,35-92 +47-84,46-98 +77-91,91-91 +16-53,16-54 +15-94,2-15 +26-54,76-79 +32-78,33-78 +3-4,3-17 +48-54,39-40 +51-99,52-98 +10-10,9-56 +70-75,71-71 +24-43,23-35 +41-83,40-83 +23-76,22-23 +29-60,13-37 +3-31,2-38 +34-48,26-47 +6-96,95-95 +94-99,98-98 +3-84,3-84 +7-62,61-62 +16-93,99-99 +68-84,67-92 +91-91,23-92 +56-81,61-82 +93-94,44-95 +24-52,48-58 +4-81,2-5 +26-73,27-74 +3-95,3-96 +10-84,1-60 +15-17,13-17 +18-88,3-89 +62-73,27-72 +12-12,11-97 +9-27,27-43 +1-62,1-1 +94-95,82-92 +28-89,89-90 +33-36,19-24 +14-41,13-42 +3-92,4-91 +82-88,5-84 +12-47,8-12 +20-99,20-96 +2-76,1-75 +55-92,31-90 +10-80,30-81 +2-76,92-94 +30-30,30-80 +8-61,7-61 +11-94,93-99 +15-82,12-16 +58-63,58-77 +31-76,76-83 +36-87,35-61 +24-94,58-93 +7-52,10-35 +79-79,45-79 +93-97,5-56 +52-53,53-58 +35-90,29-35 +26-48,26-49 +7-97,5-7 +33-63,33-78 +10-12,11-88 +41-41,30-41 +5-90,4-91 +3-3,6-86 +43-90,52-90 +31-57,30-32 +70-89,4-71 +4-96,3-5 +70-70,10-71 +50-71,50-51 +46-47,47-89 +66-87,65-87 +6-85,2-6 +29-91,30-90 +44-79,14-47 +30-73,73-73 +24-93,24-89 +24-88,24-44 +29-32,32-32 +14-30,30-30 +69-78,70-70 +35-48,23-27 +86-86,65-86 +91-92,70-91 +18-78,11-17 +40-40,40-75 +50-52,55-81 +40-51,40-52 +27-64,27-65 +15-94,12-15 +86-99,59-92 +7-11,10-69 +43-98,42-99 +6-88,5-89 +3-82,2-83 +79-98,98-98 +79-79,51-79 +77-77,3-77 +7-8,8-89 +35-54,38-58 +63-85,84-84 +23-94,47-79 +25-26,25-93 +91-91,57-91 +17-94,13-17 +17-50,16-51 +39-67,51-68 +13-93,12-94 +4-96,5-5 +10-87,23-87 +24-93,81-96 +44-59,7-45 +16-76,16-61 +23-52,23-53 +30-56,29-56 +20-20,23-75 +4-95,5-94 +79-97,80-97 +53-91,72-93 +16-50,15-17 +16-99,15-16 +70-84,54-83 +56-89,57-89 +51-72,52-72 +55-57,30-56 +13-14,13-70 +27-51,8-79 +17-78,18-92 +66-95,67-94 +2-57,57-58 +26-93,27-64 +21-26,80-94 +28-41,21-25 +10-21,22-56 +91-94,7-92 +2-94,77-99 +4-29,29-30 +37-37,29-38 +89-89,33-89 +14-88,11-14 +8-80,8-8 +7-7,6-68 +3-98,2-20 +90-90,36-90 +81-96,80-87 +8-9,8-98 +24-79,58-79 +19-96,20-95 +9-93,10-68 +68-90,68-89 +97-98,2-97 +57-71,12-58 +35-87,36-43 +1-4,3-19 +34-45,39-46 +3-95,1-1 +57-58,56-57 +1-97,2-2 +67-72,7-73 +1-85,2-85 +25-80,71-79 +2-91,47-91 +40-84,26-84 +32-93,31-32 +37-96,6-85 +52-94,51-95 +23-94,22-96 +41-41,7-42 +51-83,50-83 +12-94,93-93 +28-29,29-98 +14-22,12-24 +6-96,95-96 +20-20,20-92 +15-34,5-15 +15-23,14-22 +88-90,87-94 +1-88,2-88 +38-57,15-38 +61-77,78-86 +25-28,26-28 +63-69,65-68 +9-46,9-45 +2-33,1-82 +15-38,4-16 +10-95,94-94 +2-85,1-86 +68-68,74-74 +79-86,78-87 +9-99,7-59 +16-50,15-17 +42-74,42-73 +29-47,28-29 +68-90,67-68 +82-97,83-99 +13-96,95-99 +29-91,30-92 +8-96,7-9 +12-93,12-93 +86-99,97-97 +18-75,17-97 +48-90,47-90 +20-87,21-94 +54-71,55-70 +30-65,31-64 +97-97,1-87 +5-82,83-94 +29-70,23-72 +39-48,38-48 +15-95,98-99 +98-98,34-99 +44-95,45-94 +46-70,38-69 +99-99,2-97 +2-3,2-86 +35-79,35-35 +14-92,15-93 +18-19,18-98 +6-15,8-98 +7-88,6-87 +60-95,61-61 +71-82,71-83 +33-43,32-43 +5-39,5-63 +7-92,9-92 +43-43,33-42 +17-88,16-94 +13-53,52-53 +5-26,25-87 +8-74,73-74 +47-53,48-53 +24-26,24-26 +9-57,56-56 +44-63,44-89 +2-89,11-42 +82-82,1-82 +15-88,7-60 +11-94,12-93 +78-88,77-89 +67-78,54-68 +69-91,69-89 +17-33,12-13 +37-37,28-38 +28-96,12-91 +99-99,1-98 +25-60,15-26 +96-96,57-96 +25-28,55-95 +9-52,47-50 +59-93,17-94 +20-80,21-21 +49-73,48-73 +34-77,33-76 +55-55,4-56 +8-56,7-55 +2-99,2-97 +8-70,8-69 +90-99,92-98 +28-72,27-73 +28-84,17-75 +22-32,33-33 +20-94,20-93 +62-77,63-97 +7-27,7-26 +4-83,3-98 +11-56,12-97 +21-73,6-21 +3-99,2-99 +93-97,35-76 +87-99,61-86 +4-99,3-98 +52-93,51-93 +2-80,2-79 +38-88,39-73 +7-86,7-85 +82-95,17-83 +35-67,66-66 +42-42,40-43 +21-93,20-88 +38-74,39-88 +44-93,3-97 +23-58,22-58 +8-27,2-26 +1-87,1-88 +65-66,65-92 +69-69,12-69 +4-76,2-77 +33-52,32-33 +40-88,78-89 +2-95,1-96 +7-87,28-55 +13-93,10-92 +24-38,15-60 +45-59,44-59 +18-93,17-93 +69-90,74-91 +73-73,73-73 +17-90,6-91 +26-75,27-71 +4-80,5-80 +52-92,91-94 +32-53,31-53 +73-89,38-84 +70-90,71-89 +72-93,72-93 +12-79,13-68 +29-76,54-77 +26-66,65-67 +10-10,9-78 +43-94,44-99 +13-48,13-14 +24-25,24-64 +26-84,84-85 +96-98,32-93 +2-90,3-3 +18-69,8-76 +6-99,98-99 +69-88,66-97 +17-96,9-18 +42-75,74-74 +4-5,4-54 +87-97,69-87 +2-3,2-99 +15-86,14-16 +4-97,4-98 +6-63,5-7 +4-97,12-94 +63-70,44-69 +28-93,27-93 +50-54,46-54 +66-68,67-76 +52-65,52-68 +51-77,50-91 +2-49,4-95 +25-86,15-25 +19-20,15-84 +74-85,73-85 +1-10,2-8 +37-79,36-55 +5-76,5-75 +5-79,5-80 +12-45,4-12 +2-2,2-99 +13-76,14-76 +17-17,16-54 +39-59,39-39 +52-52,48-52 +3-91,2-48 +29-72,72-72 +6-46,5-46 +26-38,38-38 +5-97,1-99 +15-29,20-28 +23-29,18-33 +93-93,1-94 +46-90,46-55 +7-48,6-39 +25-86,24-26 +16-83,83-83 +38-69,68-94 +76-79,47-86 +90-96,91-98 +31-81,80-81 +85-86,85-87 +22-89,21-90 +73-98,88-99 +66-67,2-67 +22-91,21-87 +53-89,53-90 +32-32,31-47 +57-88,87-98 +6-91,13-83 +7-95,3-7 +40-48,48-49 +34-74,33-73 +13-63,14-64 +39-85,40-85 +1-85,13-87 +6-12,11-56 +16-93,92-92 +8-42,39-78 +83-83,50-83 +8-59,58-59 +48-76,49-77 +86-86,36-86 +29-45,44-49 +67-92,66-92 +1-53,34-76 +39-99,38-70 +21-80,22-22 +39-54,38-99 +13-96,95-98 +95-97,61-92 +15-66,18-67 +38-97,39-83 +84-85,85-97 +20-41,21-40 +95-97,28-96 +99-99,68-96 +10-64,9-65 +88-96,42-89 +30-99,30-98 +68-97,70-96 +10-10,9-96 +18-26,17-27 +13-58,5-40 +13-66,67-75 +56-60,42-61 +60-94,93-93 +62-69,7-95 +6-81,31-97 +51-80,79-80 +25-43,26-43 +65-65,64-86 +9-9,8-83 +50-81,51-81 +79-79,28-80 +14-84,15-15 +74-91,4-90 +17-89,17-34 +14-14,14-94 +2-34,1-33 +39-73,40-72 +2-90,1-89 +49-71,48-50 +37-87,87-87 +6-73,6-74 +39-96,18-98 +38-59,58-58 +9-90,20-89 +79-80,38-80 +5-30,7-90 +10-84,10-83 +51-75,19-74 +21-22,22-98 +1-37,37-38 +6-92,4-6 +35-37,36-82 +1-93,93-93 +58-95,35-68 +20-85,20-81 +1-85,1-93 +22-50,21-51 +44-84,43-87 +58-63,58-79 +59-60,58-59 +35-47,35-36 +19-28,9-19 +33-59,32-60 +6-97,6-81 +89-90,21-90 +97-99,48-89 +2-67,2-68 +14-97,13-97 +6-29,28-28 +33-71,32-71 +35-89,92-93 +51-97,51-87 +15-30,14-20 +14-97,15-97 +28-43,8-52 +3-99,2-55 +33-37,32-38 +69-69,69-83 +4-76,4-50 +87-91,28-58 +76-80,77-95 +38-57,29-58 +11-90,51-76 +16-89,16-88 +21-77,20-68 +7-86,7-7 +28-94,29-95 +29-30,30-97 +62-77,62-91 +2-97,1-96 +26-33,26-27 +24-64,4-63 +23-58,22-59 +13-59,58-58 +35-38,19-94 +31-98,32-97 +43-82,43-84 +6-92,40-75 +3-3,2-81 +5-92,6-97 +72-85,71-86 +21-21,20-26 +8-8,7-98 +22-63,21-23 +20-73,19-21 +60-71,53-61 +26-68,25-27 +21-93,21-94 +1-80,1-2 +17-65,66-87 +70-92,70-91 +7-73,7-72 +4-81,5-82 +5-85,85-86 +36-37,21-36 +49-97,49-97 +8-70,7-71 +43-85,68-91 +25-95,99-99 +35-86,36-36 +55-55,54-66 +75-84,74-85 +6-38,10-39 +76-83,8-76 +67-69,68-87 +4-96,6-96 +45-88,78-89 +4-42,3-43 +16-95,43-87 +48-67,47-97 +18-98,19-99 +22-71,70-70 +64-89,88-99 +10-17,9-61 +2-3,6-73 +13-79,14-78 +31-69,30-69 +8-66,9-94 +4-95,3-96 +13-92,14-91 +47-59,48-60 +31-75,75-95 +47-96,96-96 +31-54,32-75 +3-68,2-74 +10-11,10-75 +83-96,75-84 +33-33,32-78 +6-64,6-65 +2-97,3-97 +57-77,37-77 +5-52,5-52 +7-31,31-76 +37-37,32-42 +7-92,8-91 +35-83,27-82 +27-90,27-90 +24-46,25-46 +57-78,58-58 +14-67,2-34 +70-81,24-82 +85-85,72-86 +8-29,7-13 +19-90,20-89 +30-90,29-98 +92-95,8-93 +60-99,34-96 +4-4,3-46 +8-85,9-84 +7-53,8-38 +18-97,62-99 +29-80,28-38 +47-50,49-75 +50-70,51-51 +36-54,35-37 +13-71,49-91 +15-83,83-84 +27-27,26-93 +14-28,13-27 +40-57,39-57 +55-57,56-92 +13-56,12-57 +76-99,63-89 +61-61,61-65 +55-92,45-67 +22-81,22-82 +9-69,8-10 +6-96,9-96 +29-73,28-67 +2-54,10-70 +17-95,16-94 +7-84,8-84 +22-23,23-23 +3-99,98-98 +1-80,1-81 +44-55,38-44 +4-83,5-97 +4-87,2-47 +28-93,28-74 +90-91,76-89 +22-80,23-81 +32-93,8-60 +46-57,47-57 +4-69,69-69 +41-41,40-70 +21-61,60-61 +42-48,52-91 +91-92,32-59 +26-38,16-16 +89-94,89-93 +29-62,29-61 +12-31,31-77 +21-74,4-21 +1-89,2-88 +66-89,99-99 +42-51,41-52 +48-70,49-59 +27-80,49-69 +36-95,36-83 +79-89,86-89 +4-91,4-92 +66-77,65-78 +4-99,5-99 +54-79,53-80 +15-19,16-20 +29-37,29-30 +8-57,57-57 +16-18,17-48 +20-46,21-66 +10-93,3-98 +63-95,14-72 +97-97,22-90 +38-78,37-89 +96-96,55-97 +30-69,31-70 +41-90,40-90 +17-93,32-95 +50-88,49-88 +23-67,66-67 +5-84,5-84 +8-96,7-9 +66-94,16-65 +7-87,8-87 +29-30,29-99 +12-13,12-99 +10-12,11-96 +68-69,23-68 +3-3,2-98 +6-84,7-84 +46-96,4-46 +4-86,4-25 +4-96,5-36 +21-39,22-40 +3-99,1-1 +19-21,20-62 +49-96,95-95 +49-51,51-52 +41-62,6-61 +7-16,26-39 +17-86,17-18 +22-45,23-44 +33-39,39-39 +40-81,41-81 +63-86,65-83 +17-35,18-97 +13-21,14-75 +11-91,8-90 +9-20,20-21 +77-80,76-81 +2-9,4-96 +14-59,60-91 +18-18,17-97 +15-41,42-61 +27-80,38-80 +46-69,46-70 +7-83,96-98 +16-96,8-12 +5-56,5-9 +1-96,2-97 +12-97,12-96 +78-83,78-82 +3-63,1-3 +4-76,2-5 +68-96,69-81 +19-84,14-20 +35-78,34-78 +41-66,42-65 +18-96,46-56 +37-94,15-37 +69-94,69-93 +22-24,23-97 +25-47,19-25 +4-40,7-98 +67-96,68-95 +43-75,31-74 +51-77,50-51 +6-76,77-77 +8-96,7-97 +45-85,85-85 +37-62,37-61 +25-59,24-58 +22-79,78-78 +79-79,6-80 +39-97,40-82 +22-88,21-88 +4-91,58-96 +23-90,24-90 +14-86,15-86 +29-44,29-43 +53-68,63-65 +4-37,3-97 +41-85,40-59 +6-7,7-61 +82-96,81-83 +52-93,52-96 +4-52,4-53 +18-52,17-36 +16-85,15-86 +19-73,73-73 +7-88,6-89 +32-54,54-54 +30-35,29-30 +14-95,14-15 +25-96,24-95 +16-75,15-75 +29-66,52-66 +10-10,11-54 +6-67,6-58 +9-46,1-9 +2-53,95-98 +11-46,12-67 +64-65,39-64 +37-48,36-48 +5-42,13-99 +16-58,9-9 +7-91,7-90 +50-51,50-94 +31-76,32-75 +31-96,31-95 +10-81,11-80 +23-76,57-81 +14-83,12-82 +3-93,2-93 +27-27,26-73 +98-99,17-99 +13-67,14-14 +48-48,1-49 +94-95,7-94 +42-97,43-98 +62-81,63-82 +27-27,17-28 +20-69,59-68 +18-67,68-68 +2-13,5-7 +3-98,2-97 +27-90,26-90 +2-9,9-48 +11-99,12-97 +3-88,2-12 +12-13,12-49 +5-20,20-39 +39-98,38-75 +90-90,4-91 +64-77,64-77 +3-51,4-51 +3-10,10-34 +4-29,29-96 +2-90,1-90 +55-55,9-55 +70-79,37-71 +66-66,31-66 +2-11,1-12 +72-76,72-76 +34-87,87-99 +14-67,14-67 +73-82,74-81 +62-62,29-62 +57-58,11-58 +3-7,8-82 +19-99,18-20 +23-26,22-26 +20-63,11-63 +11-82,12-83 +76-83,76-83 +10-72,8-10 +48-49,48-53 +10-41,11-42 +44-55,54-54 +80-92,79-81 +8-43,7-42 +12-20,1-20 +22-71,23-23 +2-95,1-2 +21-71,20-71 +9-83,9-83 +58-75,4-60 +98-98,30-99 +63-96,68-97 +27-79,27-79 +3-56,56-75 +1-91,82-92 +62-76,61-77 +6-8,7-97 +37-67,37-66 +52-53,52-83 +92-92,54-92 +55-91,91-91 +61-79,61-65 +44-44,37-45 +64-89,9-64 +20-35,19-36 +16-49,15-16 +64-82,64-83 +3-97,2-94 +52-53,40-52 +43-68,15-85 +79-79,36-80 +35-84,85-94 +23-96,23-95 +65-73,65-74 +2-69,3-70 +49-76,49-95 +2-97,1-98 +8-68,7-9 +86-87,40-86 +50-94,79-94 +34-48,19-35 +7-12,8-12 +10-92,92-92 +92-99,7-98 +52-83,83-83 +10-22,11-64 +66-90,66-67 +10-88,11-88 +37-85,38-84 +9-63,10-58 +26-52,25-51 +14-60,15-61 +41-58,57-57 +16-86,17-86 +19-93,19-92 +89-89,3-89 +7-99,8-8 +36-96,14-95 +9-50,10-10 +12-87,12-88 +59-91,96-99 +13-92,14-14 +13-95,14-98 +8-74,15-77 +26-74,72-80 +4-5,4-28 +92-92,20-93 +8-97,97-97 +68-79,67-69 +2-85,21-83 +2-6,9-14 +60-64,81-89 +5-47,47-82 +41-80,41-80 +54-55,52-55 +4-5,6-85 +10-88,11-87 +4-46,46-46 +25-35,26-43 +10-19,11-18 +42-83,41-83 +6-90,4-7 +28-97,29-96 +22-67,21-68 +16-75,17-74 +19-74,53-95 +67-75,72-76 +19-94,88-99 +6-91,5-69 +3-95,95-95 +3-5,4-60 +29-82,89-90 +3-3,2-97 +6-25,25-40 +10-98,11-93 +4-38,37-39 +99-99,3-97 +28-75,75-76 +29-96,30-95 +13-48,27-98 +4-83,10-70 +14-38,30-35 +59-98,49-51 +18-88,87-94 +9-21,14-43 +36-49,33-36 +95-96,54-95 +37-92,16-41 +32-92,43-93 +36-38,37-80 +3-3,34-56 +1-8,2-2 +16-28,26-30 +50-98,51-98 +13-90,12-13 +50-94,51-51 +98-98,12-99 +10-96,1-74 +44-74,74-74 +64-67,63-65 +59-77,59-81 +1-99,1-98 +31-96,32-95 +13-72,14-55 +23-79,22-24 diff --git a/day5.go b/day5.go new file mode 100644 index 0000000..706414b --- /dev/null +++ b/day5.go @@ -0,0 +1,135 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" + "regexp" + "strconv" +) + +type crates struct { + stacks [][]byte +} + +func (c *crates) topCrates() string { + b := make([]byte, len(c.stacks)) + for i, stack := range c.stacks { + if len(stack) > 0 { + b[i] = stack[len(stack)-1] + } + } + return string(b) +} + +func (c *crates) move(m move) { + // copy slices + from := c.stacks[m.from-1] + to := c.stacks[m.to-1] + + for i := 0; i < m.amount; i++ { + pop, popped := from[len(from)-1], from[:len(from)-1] + from = popped + to = append(to, pop) + } + + // set slices + c.stacks[m.to-1] = to + c.stacks[m.from-1] = from +} + +func (c *crates) moveMultiple(m move) { + // copy slices + from := c.stacks[m.from-1] + to := c.stacks[m.to-1] + + pop, from := from[len(from)-m.amount:], from[:len(from)-m.amount] + + // push + c.stacks[m.to-1] = append(to, pop...) + // set popped + c.stacks[m.from-1] = from +} + +func (c *crates) parseLine(l []byte) { + // by four + for i := 0; i < len(l); i += 4 { + if 'A' <= l[i+1] && l[i+1] <= 'Z' { + // push front: https://github.com/golang/go/wiki/SliceTricks#push-frontunshift + c.stacks[i/4] = append([]byte{l[i+1]}, c.stacks[i/4]...) + } + } +} + +func newCargo(s *bufio.Scanner) *crates { + // build cargo + s.Scan() + line := s.Bytes() + //[x]. + //1234 + cargo := &crates{stacks: make([][]byte, len(line)/4+1)} + cargo.parseLine(line) + + for s.Scan() { + line = s.Bytes() + if len(line) == 0 { + break + } + cargo.parseLine(line) + } + return cargo +} + +type move struct { + amount int + from int + to int +} + +func parseMove(l string) move { + regex := regexp.MustCompile(`move (?P\d+) from (?P\d+) to (?P\d+)`) + matches := regex.FindStringSubmatch(l) + m := make([]int, 3) + for i, match := range matches[1:] { + matchInt, err := strconv.Atoi(match) + m[i] = matchInt + if err != nil { + log.Fatal("Got unexpected input in move") + } + } + return move{ + amount: m[0], + from: m[1], + to: m[2], + } +} + +func main() { + f, err := os.Open("day5.txt") + if err != nil { + log.Fatal("Could not open input file") + } + + // part 1 + scanner := bufio.NewScanner(f) + cargo := newCargo(scanner) + for scanner.Scan() { + l := scanner.Text() + m := parseMove(l) + cargo.move(m) + } + fmt.Println("Part 1:", cargo.topCrates()) + + f.Seek(0, 0) + + // part 2 + scanner = bufio.NewScanner(f) + cargo = newCargo(scanner) + for scanner.Scan() { + l := scanner.Text() + m := parseMove(l) + cargo.moveMultiple(m) + } + fmt.Println("Part 2:", cargo.topCrates()) +} diff --git a/day5.txt b/day5.txt new file mode 100644 index 0000000..ba76f1e --- /dev/null +++ b/day5.txt @@ -0,0 +1,511 @@ +[V] [T] [J] +[Q] [M] [P] [Q] [J] +[W] [B] [N] [Q] [C] [T] +[M] [C] [F] [N] [G] [W] [G] +[B] [W] [J] [H] [L] [R] [B] [C] +[N] [R] [R] [W] [W] [W] [D] [N] [F] +[Z] [Z] [Q] [S] [F] [P] [B] [Q] [L] +[C] [H] [F] [Z] [G] [L] [V] [Z] [H] + 1 2 3 4 5 6 7 8 9 + +move 2 from 1 to 7 +move 6 from 2 to 6 +move 10 from 7 to 6 +move 4 from 3 to 1 +move 5 from 6 to 4 +move 1 from 1 to 9 +move 4 from 6 to 9 +move 12 from 4 to 1 +move 5 from 1 to 4 +move 7 from 9 to 8 +move 11 from 8 to 1 +move 6 from 6 to 2 +move 2 from 5 to 2 +move 3 from 6 to 3 +move 4 from 9 to 4 +move 2 from 2 to 5 +move 1 from 6 to 4 +move 3 from 3 to 6 +move 1 from 8 to 4 +move 1 from 6 to 1 +move 28 from 1 to 4 +move 28 from 4 to 5 +move 1 from 9 to 1 +move 4 from 4 to 1 +move 2 from 6 to 2 +move 2 from 1 to 6 +move 7 from 4 to 2 +move 14 from 2 to 9 +move 1 from 4 to 1 +move 1 from 1 to 2 +move 18 from 5 to 6 +move 2 from 2 to 6 +move 1 from 9 to 7 +move 8 from 9 to 2 +move 15 from 6 to 5 +move 1 from 6 to 3 +move 3 from 2 to 5 +move 1 from 7 to 5 +move 2 from 1 to 3 +move 3 from 2 to 1 +move 1 from 6 to 4 +move 5 from 6 to 5 +move 2 from 2 to 9 +move 35 from 5 to 7 +move 4 from 9 to 3 +move 1 from 4 to 1 +move 5 from 1 to 7 +move 6 from 5 to 3 +move 1 from 9 to 4 +move 11 from 7 to 6 +move 2 from 9 to 2 +move 1 from 4 to 7 +move 14 from 7 to 4 +move 5 from 6 to 9 +move 2 from 2 to 4 +move 6 from 7 to 9 +move 2 from 9 to 5 +move 6 from 9 to 5 +move 8 from 4 to 9 +move 5 from 4 to 3 +move 3 from 5 to 7 +move 1 from 3 to 9 +move 5 from 3 to 4 +move 7 from 9 to 8 +move 2 from 7 to 4 +move 4 from 5 to 7 +move 1 from 5 to 3 +move 5 from 6 to 4 +move 8 from 4 to 8 +move 5 from 7 to 6 +move 1 from 4 to 7 +move 3 from 6 to 9 +move 2 from 6 to 5 +move 7 from 8 to 3 +move 2 from 5 to 9 +move 17 from 3 to 1 +move 3 from 1 to 3 +move 6 from 8 to 9 +move 4 from 4 to 7 +move 6 from 3 to 5 +move 2 from 8 to 5 +move 14 from 7 to 5 +move 2 from 4 to 5 +move 6 from 9 to 5 +move 1 from 7 to 9 +move 1 from 6 to 9 +move 8 from 1 to 9 +move 8 from 5 to 2 +move 2 from 1 to 3 +move 7 from 2 to 6 +move 2 from 3 to 4 +move 1 from 2 to 6 +move 3 from 1 to 6 +move 16 from 9 to 4 +move 2 from 9 to 8 +move 1 from 1 to 6 +move 2 from 9 to 4 +move 1 from 6 to 9 +move 1 from 6 to 1 +move 1 from 1 to 7 +move 1 from 6 to 9 +move 1 from 9 to 3 +move 1 from 3 to 8 +move 1 from 9 to 2 +move 1 from 2 to 7 +move 2 from 5 to 3 +move 7 from 5 to 8 +move 2 from 7 to 9 +move 1 from 6 to 7 +move 3 from 6 to 9 +move 10 from 8 to 7 +move 1 from 4 to 3 +move 3 from 3 to 1 +move 1 from 7 to 1 +move 19 from 4 to 6 +move 3 from 9 to 7 +move 1 from 9 to 2 +move 2 from 1 to 7 +move 1 from 9 to 1 +move 12 from 6 to 9 +move 2 from 7 to 1 +move 1 from 2 to 4 +move 11 from 6 to 3 +move 1 from 4 to 8 +move 1 from 6 to 8 +move 11 from 7 to 9 +move 2 from 8 to 9 +move 18 from 9 to 6 +move 5 from 3 to 7 +move 5 from 3 to 8 +move 11 from 5 to 6 +move 26 from 6 to 4 +move 1 from 6 to 5 +move 1 from 3 to 7 +move 3 from 8 to 3 +move 1 from 8 to 7 +move 3 from 3 to 6 +move 5 from 9 to 3 +move 1 from 4 to 9 +move 8 from 4 to 5 +move 2 from 7 to 8 +move 3 from 3 to 6 +move 3 from 4 to 6 +move 7 from 7 to 4 +move 1 from 9 to 1 +move 5 from 5 to 3 +move 2 from 9 to 7 +move 3 from 8 to 2 +move 7 from 3 to 7 +move 1 from 7 to 6 +move 3 from 5 to 6 +move 7 from 4 to 8 +move 10 from 4 to 5 +move 2 from 4 to 2 +move 3 from 7 to 5 +move 2 from 4 to 1 +move 6 from 8 to 5 +move 5 from 1 to 4 +move 5 from 4 to 2 +move 5 from 7 to 8 +move 10 from 2 to 8 +move 3 from 8 to 3 +move 2 from 5 to 3 +move 13 from 6 to 1 +move 19 from 5 to 3 +move 12 from 3 to 9 +move 4 from 8 to 2 +move 2 from 6 to 7 +move 5 from 8 to 7 +move 9 from 3 to 9 +move 1 from 5 to 9 +move 2 from 7 to 6 +move 3 from 2 to 3 +move 15 from 9 to 3 +move 13 from 3 to 5 +move 1 from 6 to 2 +move 5 from 5 to 8 +move 1 from 2 to 5 +move 1 from 7 to 6 +move 6 from 9 to 6 +move 6 from 6 to 8 +move 4 from 7 to 1 +move 2 from 3 to 6 +move 11 from 1 to 9 +move 1 from 2 to 3 +move 4 from 5 to 6 +move 1 from 1 to 6 +move 10 from 9 to 2 +move 8 from 2 to 3 +move 3 from 1 to 2 +move 8 from 3 to 1 +move 5 from 5 to 4 +move 1 from 9 to 8 +move 2 from 3 to 7 +move 2 from 4 to 5 +move 6 from 1 to 6 +move 9 from 8 to 1 +move 16 from 1 to 9 +move 2 from 7 to 3 +move 3 from 3 to 8 +move 6 from 9 to 6 +move 1 from 5 to 4 +move 1 from 3 to 8 +move 5 from 2 to 1 +move 5 from 1 to 9 +move 2 from 4 to 9 +move 4 from 8 to 6 +move 1 from 8 to 7 +move 4 from 8 to 5 +move 2 from 8 to 2 +move 17 from 9 to 5 +move 11 from 5 to 7 +move 1 from 2 to 5 +move 1 from 2 to 5 +move 1 from 9 to 1 +move 1 from 1 to 6 +move 5 from 7 to 6 +move 20 from 6 to 7 +move 4 from 6 to 4 +move 15 from 7 to 8 +move 2 from 3 to 7 +move 1 from 6 to 5 +move 10 from 8 to 4 +move 1 from 3 to 6 +move 4 from 6 to 4 +move 13 from 7 to 8 +move 1 from 7 to 5 +move 1 from 6 to 3 +move 1 from 6 to 3 +move 1 from 6 to 9 +move 9 from 4 to 1 +move 3 from 8 to 2 +move 14 from 5 to 6 +move 2 from 2 to 8 +move 1 from 3 to 9 +move 14 from 6 to 2 +move 1 from 3 to 9 +move 1 from 9 to 3 +move 15 from 2 to 1 +move 1 from 3 to 9 +move 4 from 4 to 9 +move 10 from 8 to 5 +move 1 from 9 to 5 +move 1 from 1 to 5 +move 4 from 8 to 7 +move 3 from 9 to 3 +move 1 from 8 to 5 +move 1 from 4 to 7 +move 2 from 8 to 7 +move 6 from 5 to 6 +move 4 from 1 to 2 +move 1 from 2 to 5 +move 2 from 2 to 8 +move 2 from 8 to 1 +move 3 from 7 to 2 +move 3 from 4 to 9 +move 18 from 1 to 8 +move 1 from 7 to 3 +move 3 from 9 to 6 +move 1 from 1 to 5 +move 5 from 6 to 4 +move 2 from 1 to 9 +move 8 from 4 to 5 +move 4 from 3 to 2 +move 16 from 5 to 4 +move 8 from 8 to 6 +move 2 from 2 to 6 +move 1 from 7 to 6 +move 7 from 8 to 1 +move 1 from 2 to 3 +move 2 from 8 to 3 +move 4 from 4 to 9 +move 4 from 1 to 2 +move 1 from 7 to 2 +move 1 from 5 to 4 +move 1 from 3 to 7 +move 3 from 4 to 5 +move 1 from 9 to 6 +move 9 from 2 to 5 +move 2 from 3 to 6 +move 3 from 5 to 8 +move 3 from 1 to 7 +move 4 from 5 to 8 +move 1 from 4 to 3 +move 5 from 9 to 5 +move 5 from 5 to 8 +move 1 from 3 to 4 +move 4 from 5 to 1 +move 2 from 5 to 4 +move 13 from 6 to 2 +move 12 from 2 to 9 +move 3 from 9 to 2 +move 4 from 1 to 6 +move 8 from 6 to 2 +move 1 from 4 to 9 +move 3 from 7 to 9 +move 2 from 9 to 8 +move 1 from 7 to 2 +move 9 from 9 to 5 +move 2 from 8 to 6 +move 4 from 2 to 3 +move 1 from 7 to 2 +move 1 from 6 to 4 +move 4 from 3 to 9 +move 9 from 5 to 8 +move 10 from 4 to 2 +move 1 from 4 to 7 +move 1 from 6 to 2 +move 1 from 6 to 7 +move 13 from 2 to 6 +move 1 from 2 to 5 +move 6 from 6 to 5 +move 7 from 5 to 8 +move 1 from 4 to 5 +move 27 from 8 to 5 +move 3 from 6 to 3 +move 2 from 8 to 6 +move 8 from 9 to 5 +move 1 from 7 to 9 +move 1 from 6 to 2 +move 4 from 5 to 9 +move 2 from 3 to 4 +move 9 from 2 to 5 +move 1 from 4 to 1 +move 1 from 4 to 2 +move 1 from 2 to 4 +move 1 from 3 to 7 +move 1 from 1 to 3 +move 1 from 3 to 9 +move 6 from 9 to 4 +move 1 from 7 to 5 +move 13 from 5 to 2 +move 1 from 9 to 5 +move 1 from 7 to 2 +move 5 from 2 to 7 +move 8 from 5 to 7 +move 6 from 4 to 2 +move 1 from 4 to 5 +move 3 from 2 to 4 +move 4 from 2 to 7 +move 2 from 4 to 3 +move 13 from 7 to 3 +move 5 from 2 to 3 +move 4 from 7 to 8 +move 11 from 3 to 8 +move 11 from 5 to 9 +move 4 from 6 to 9 +move 1 from 6 to 5 +move 1 from 4 to 2 +move 1 from 3 to 6 +move 3 from 2 to 6 +move 3 from 6 to 2 +move 1 from 6 to 1 +move 1 from 3 to 8 +move 3 from 3 to 6 +move 2 from 2 to 7 +move 4 from 3 to 9 +move 16 from 9 to 2 +move 1 from 7 to 8 +move 2 from 2 to 8 +move 9 from 2 to 3 +move 6 from 2 to 7 +move 1 from 6 to 3 +move 2 from 9 to 2 +move 1 from 9 to 7 +move 2 from 6 to 3 +move 4 from 3 to 9 +move 2 from 2 to 7 +move 1 from 2 to 5 +move 14 from 5 to 6 +move 14 from 6 to 3 +move 4 from 9 to 8 +move 5 from 8 to 4 +move 1 from 1 to 5 +move 4 from 8 to 1 +move 1 from 5 to 9 +move 8 from 7 to 2 +move 18 from 3 to 7 +move 1 from 1 to 5 +move 1 from 1 to 9 +move 1 from 4 to 5 +move 1 from 8 to 5 +move 8 from 2 to 9 +move 3 from 5 to 8 +move 7 from 7 to 1 +move 3 from 4 to 7 +move 1 from 3 to 6 +move 7 from 8 to 3 +move 2 from 9 to 3 +move 3 from 8 to 9 +move 9 from 1 to 7 +move 9 from 3 to 4 +move 2 from 3 to 4 +move 12 from 7 to 4 +move 1 from 3 to 8 +move 1 from 8 to 7 +move 8 from 4 to 7 +move 11 from 4 to 9 +move 5 from 4 to 8 +move 19 from 7 to 9 +move 1 from 6 to 2 +move 2 from 7 to 4 +move 2 from 8 to 3 +move 1 from 7 to 8 +move 1 from 3 to 2 +move 3 from 8 to 4 +move 1 from 8 to 9 +move 1 from 3 to 2 +move 36 from 9 to 1 +move 5 from 9 to 6 +move 5 from 4 to 2 +move 24 from 1 to 3 +move 5 from 6 to 7 +move 1 from 1 to 4 +move 14 from 3 to 4 +move 4 from 7 to 3 +move 1 from 8 to 5 +move 5 from 2 to 9 +move 1 from 1 to 6 +move 5 from 9 to 1 +move 3 from 2 to 3 +move 1 from 5 to 3 +move 11 from 4 to 2 +move 1 from 7 to 1 +move 6 from 1 to 9 +move 3 from 4 to 2 +move 1 from 6 to 7 +move 10 from 1 to 7 +move 3 from 2 to 1 +move 3 from 3 to 2 +move 2 from 1 to 7 +move 1 from 4 to 8 +move 13 from 3 to 2 +move 1 from 8 to 3 +move 2 from 7 to 5 +move 2 from 3 to 7 +move 2 from 5 to 2 +move 1 from 1 to 7 +move 28 from 2 to 6 +move 1 from 2 to 3 +move 2 from 8 to 2 +move 6 from 9 to 7 +move 1 from 3 to 8 +move 1 from 9 to 8 +move 3 from 6 to 2 +move 14 from 7 to 9 +move 3 from 2 to 1 +move 2 from 2 to 9 +move 2 from 1 to 9 +move 1 from 9 to 1 +move 7 from 6 to 9 +move 2 from 1 to 4 +move 2 from 4 to 6 +move 4 from 8 to 7 +move 1 from 7 to 6 +move 1 from 8 to 1 +move 1 from 3 to 6 +move 1 from 1 to 5 +move 14 from 9 to 8 +move 1 from 5 to 9 +move 5 from 7 to 3 +move 16 from 6 to 3 +move 2 from 7 to 4 +move 8 from 9 to 5 +move 6 from 6 to 1 +move 8 from 5 to 9 +move 2 from 7 to 4 +move 11 from 9 to 1 +move 4 from 4 to 1 +move 14 from 8 to 3 +move 2 from 1 to 7 +move 20 from 3 to 6 +move 5 from 3 to 1 +move 1 from 3 to 5 +move 2 from 7 to 4 +move 20 from 6 to 7 +move 18 from 7 to 6 +move 17 from 6 to 9 +move 1 from 5 to 3 +move 6 from 3 to 2 +move 3 from 3 to 1 +move 1 from 6 to 2 +move 2 from 7 to 8 +move 4 from 1 to 5 +move 2 from 4 to 9 +move 1 from 3 to 2 +move 1 from 8 to 6 +move 18 from 1 to 4 +move 1 from 2 to 7 +move 1 from 6 to 2 +move 3 from 4 to 3 +move 1 from 8 to 1 +move 4 from 1 to 6 +move 7 from 2 to 1 +move 1 from 5 to 7 +move 1 from 4 to 1 +move 2 from 6 to 3 +move 3 from 5 to 9 +move 9 from 9 to 8 +move 10 from 9 to 3 +move 9 from 3 to 5 diff --git a/day6.go b/day6.go new file mode 100644 index 0000000..285eb76 --- /dev/null +++ b/day6.go @@ -0,0 +1,48 @@ +package main + +import ( + "fmt" + "log" + "os" +) + +func inside(c byte, b []byte) int { + for i, a := range b { + if c == a { + return i + } + } + return -1 +} + +func packetMarker(buf []byte, l int) int { + i, j := 0, 1 + for (j - i) < l { + n := inside(buf[j], buf[i:j]) + if n != -1 { + i += n + 1 + } else { + j++ + } + } + return j +} + +func main() { + f, err := os.Open("day6.txt") + if err != nil { + log.Fatal("Could not open input file", err) + } + buf := make([]byte, 32*1024) + _, err = f.Read(buf) + if err != nil { + log.Fatal("Got error reading into buffer", err) + } + // Part 1 + r := packetMarker(buf, 4) + fmt.Println("Part 1", r, string(buf[r-4:r])) + + // Part 2 + r = packetMarker(buf, 14) + fmt.Println("Part 2", r, string(buf[r-14:r])) +} diff --git a/day6.txt b/day6.txt new file mode 100644 index 0000000..dc16ab4 --- /dev/null +++ b/day6.txt @@ -0,0 +1 @@ +dvgdvvbpbtbhbdhbhmmmcctmcmccggtrgghnhmnnqffpcprrqssnhsnhnshhsrsqqhchcdcfcqqcncrrzpppmzpzzhjzzzvrvnnpbpzzswzwswnngjgjgcjcfcllhffjbfjfhhppvnppfmfcmmcnnmnfnzfnzffphpnnnsvswvvnwnfntftjftfvvztzqzhzddttjpjbpphhlnnwgnwggdmmczclczzqddlcdldrlrccfflwwgqwwrjwrwzrrsdrrfssddcmmvrvlvhvfhfzhzbhbzzdmdvvsppwswmwdwjjzmzhhvghgthghvvtcthcttgsttpqpbbhthppzznntpnttshtshthhwrrgbbjzbjblblzbllcblcblbvvqfqqnjqqhfhftftwfftvvmddgzzmdzmdmtttttqmqmnqmqpmqpqqjlldpllfvlffjdfjjvlvjjjjbsjbjnnhmnhnrrwtrrfvvtppwmmpnnjbnjjcncjcttrcrjjlqjljccpzccvqvzzscctgccsmmnznhzhnnjggmjgmgjgtgtlgglhhrlhhrvhvrvtvvlvvwmmrjjzqqbzqqtgtzgttmgggwpgwgbwggwwprwwvswszznczncnccjnccjdjdjssqmmgcmcjmmhwhswhwdwrddtccmzmjmsmrmrddhrhhqbbspbsppqvqmvqmmclcddzjzvvslsffdhhqgqrqjrqjqjrrmpmrppcjpjffwhfwwppqvvzjzqqtftgfghgpglgnglldlvvwzwmmfzzhzmzhhswhhnvhvphpmphphrrwwfccmgmqgmmzgmgngznnzbzttjwttgngzzdndffwhfwhhlmllwqlwwgfgfpfnnldnldndbdcdddmbdmbbdpbpwbpptrrpggtrtrnttsmmcrmmlhltlgttblttbhttjzzvnnsbsqbqwbbtwtmtbbcjcljjslscswwglgqlgqgmmcpctcrttprpjjfvjfjqqljlvjljnnfhhfzhzmhmghhjnhjjbppmqqwlwswwgbbzszspzsppcscvvnhndhdwdmdrdssqrqdqsddnbnpplqppjbjdbdqdcccffsnntzntnmnlnbbrzzzvgvvqttbbzpbzpzdpdvppjmjpjbbdrbbgwgffzpzzjddmldlwwjdwwscwcfccnznmmfttvvmpmvpmvmcvmmjmwjwbbwqwjjzqjzjbbjqbjqqqthhsssmrsshvvprvvwccjlcctwwmgwgpwgpgcpptrppjppltlhthctttfptppwgpwprpbbqzbzznssfcsffbnnndffqmmqwmmpvvpvdppjqqttfpttjccbnbddvtdvddlsstjtccphchsswbbrqqgtqgqpqjqnjjvccwscwssjwjttqvtvmtmjjghghccpnpsplslmmfjfjtffgtgrtrftfhttpsttzzmhmllwqwhhnffdpffwbwnnbrrfbrrnjrjlljqqnjqnqqwlqqbbbtvvwgvgbgddpwdwvdwvdvvwzvwwtzwttppnttqccjtjrttqbbprpsrpssfjsffmdfmfbmbggjhggcjgcgvvjqqbhbllhrlhlclzzplpqqdtddrhhfssdvsvrrscsjjnwjjfpjfffcbfcfmmlpmphhhlpltptcpttppfssppgwppjgjnnblbhbtbrbgbpplnlvlsvlvwvwpptmtsswzswsnscsfcsfsfggzhghvvgbbfddgbbrmrtrqtthvhzhzthtbtjjcljjlcllzglzzdszdzjzjfzzzblbslbljjdnndvvnwnqnwqqscscmczcwwvrrlclttbtdtvddbrddvllnppvpmvmbbvfvttfcttggwgffrfwwwpwcpchppcrrgprgprgrjgjdgdgvddzndzdbzzswsvvtgtccrrnggbwggpjpnnsjjwfjjqfqvffrrhdrrsfrfjjfzfdzzqfqwbztszjqtttfdqvzmznzjlsjnwdthtwdtfslgdmgfpwsqcsqdhnsnsmghttfvlzqgspzdtlstdmthzftwmnqrznldpmwqbtthggjwcgjjmbpqgrnwspggjvrlcmtvpchmqhlwwtswqgpdjpbznqnssqhdjzgbjnfmgssrvnmmcvvhgmcvqbfdhgrhnqqzdmttmdzwgtprzqhplwnhhmlrvcbwpllqprtltdvqrwhvwzvlqsvfqsfjwmrnzlqpdgfpmtfdczqdnfjjbjmrdnffcmtwlzcmvnwmlpmqhvggdhptnzlvzwzwjbcszsnzgpwncfgvzfgbzwclvrbmllzpltzwjrftmppsfwhvvvhvqjtstnnczgtdbmpjjsscbdwplftgcgmtrnrnzplzhghrqgdtjwntwfstjwqjjrlhtwhnfqwfqgsjptjfpsrbnvvlgsltnvtfvscttwvrfzblzmfmnfrlrnzrrzhclggtntpjbbcphdvrfhnrtzvdmwbwgbftgzwlcqztghdhdmzwlmjbgptfnnzbmwsnzlzcpprqzmbbdsplmhpgmzthqcsfjcnfbfvsdsqzfvfcnpgqsvpgwsdbgjmsglrwmfjfpddczwvgdppfmrtszbtfdwbmlmzhqvvwmvlzvjfpffjnhwwhssfjnbzlqwqvjbjbhfntmhgswntdpbzlwwfbdbhrfhzfjsjbtlrqhlnrpfbwtpmrfvbhlmmsgtvcmrqmdpwvhqfqpgmfgnfrbvprhprtnpzjcnltndfsvjgndwblhwphtpsmnczgbtpwdvjsrctjbvbfslvslzlwbtstqvgcrqmfphwztpjqdmvcjpjqmjbdndfpzwsfwplchsmqwwbggptjdtztszmpfwgfwnqpdwfcpgrrhmfglsctjllflfltbcfvcpfcnqbwrvzmcmjpwptgsrlbrdchngwsdstfmcbrqvdsvvbnppdmnfwcgvpjjzqwcpvqfncvqlsfnjzprvhpgqscshqwsttdrsmqjfwlhcwlvnzvgvclqfjdgctvsrbwzflcldmrwlfhbgdtstqsqlblndnpgqlfbjzslcpcwvdwdffshhrzvhqwdsdmwtmtvcnrhmstvrnscppmbpmjbfjhljmsjnbjlhjhmnmcvvfgbdrblwbzrcctrjwjjwjtgnfjhhqbsmdjvdrdjtjbscfrsljnvqjlgjwqrvfmdttsvqjwdbswdtcfqsrpbvzrbsdqlqfjlrgcwzbqtqrpsrfcmbzcvjngcsmvqlbnghllcqcztbtvdrfcmpgfdprghsmbjvzbdnrdqnjdzslclgdsqglvpvcjpzqfwztlssljtmcdfcqdnqzwcttvpqfdpvzlhjfvvsgphgqrmzppvnjznqmdzfnfztjppstjfwddftcpcjnssznqbrvlvrzfhbvsjrwghttwlwfrptsvsrwfnvjtthwrppbngbgqvbsdgcrjcwjjljcwptrvgmbjpjtdbmhmzcfhzbsbrmzhdsrjbbmnwbsntpffdrrlgcrcgbcfwvlpmrzvsmvpjthtdjdvcspdsdvshlrwzcqnjmcnrgzbqzhfzbmtrvzzmjwbnjggtrtgcsnrmzbtjzgdmffdntspdhgnvgrmpbtnsspcqhsrvppjbrmdbggjbftnnbrgdsmdscqthdzflldfnplqccthpwccsfsnstttwztqnmnfshntqngmcndbsbftmgnhhwjvhchdfqzzgpdnfgvnjzjzfdzvsvtdqqcftrvmdcszcwpfrbcsmlqqfprrjgncwcvcngmrnwntcvzzlnwrhrznnldslhqdscbgsrqnvnmdtqvlttwqljmvbpbfldtbgzhvwzghnhwrwdqphhhgjpnmtlcmvfbdffnsvcswtmffzsrvczbntfpdsmwbqphvvcflpwgsrmjhrljlvzdgrcwpfphmvtwqwhjmrvmjzjlzlbflhzrdrzcdwhblpqwjljbvprddtvnccmchgctncwbpnmlqppfmhwchvjvpmblqhccfhlprdrczdfhmnsqhddbqlppgsnvhhfrwhqhfdpvsfcvzbqhgswtmnpmzrwsvnmztnqwdrhllssmgtzbztsprpsj diff --git a/day7.go b/day7.go new file mode 100644 index 0000000..6bc3742 --- /dev/null +++ b/day7.go @@ -0,0 +1,153 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" + "strconv" + "strings" +) + +type filesystem struct { + root *dir +} + +type dir struct { + parent *dir + subdirs map[string]*dir + files map[string]*file +} + +func newDir(parent *dir) *dir { + return &dir{ + parent: parent, + subdirs: make(map[string]*dir), + files: make(map[string]*file), + } +} + +type file struct { + name string + size int +} + +func changeDir(fs *filesystem, wd *dir, arg string) *dir { + switch arg { + case "..": + return wd.parent + case "/": + return fs.root + default: + d, ok := wd.subdirs[arg] + if !ok { + log.Fatal("Tried going into non existing directory") + } + return d + } +} + +func lsOut(wd *dir, words []string) { + if words[0] == "dir" { + wd.subdirs[words[1]] = newDir(wd) + return + } + if num, err := strconv.Atoi(words[0]); err == nil { + wd.files[words[1]] = &file{ + name: words[1], + size: num, + } + } +} + +// Assume only one command arg +func commands(fs *filesystem, wd *dir, s *bufio.Scanner) { + lsout := false + for s.Scan() { + words := strings.Split(s.Text(), " ") + if words[0] == "$" { + lsout = false + + switch words[1] { + case "ls": + lsout = true + continue + case "cd": + wd = changeDir(fs, wd, words[2]) + } + } + + if lsout { + lsOut(wd, words) + } + } +} + +func byMaxSize(fs *filesystem, maxSize int) (int, []int) { + return byPred(fs, maxSize, func(a int) bool { + return a <= maxSize + }) +} + +func byMinSize(fs *filesystem, minSize int) (int, []int) { + return byPred(fs, minSize, func(a int) bool { + return a >= minSize + }) +} + +func byPred(fs *filesystem, by int, pred func(a int) bool) (int, []int) { + dirSizes := []int{} + wd := fs.root + var bms func(wd *dir) int + bms = func(wd *dir) int { + size := 0 + for _, f := range wd.files { + size += f.size + } + for _, d := range wd.subdirs { + size += bms(d) + } + if pred(size) { + dirSizes = append(dirSizes, size) + } + return size + } + + return bms(wd), dirSizes +} + +func main() { + f, err := os.Open("day7.txt") + if err != nil { + log.Fatal("Could not open input file", err) + } + + // Part 1 + s := bufio.NewScanner(f) + fs := &filesystem{ + root: newDir(nil), + } + var wd *dir = nil + // build the fs tree + commands(fs, wd, s) + // recurse the three + total, dirSizes := byMaxSize(fs, 100_000) + sum := 0 + for _, d := range dirSizes { + sum += d + } + fmt.Println("Part 1:", total, sum) + + // Part 2 + total, _ = byMaxSize(fs, 0) + free := (70_000_000 - total) + need := (30_000_000 - free) + total, dirSizes = byMinSize(fs, need) + smallest := dirSizes[0] + for _, d := range dirSizes { + if d < smallest { + smallest = d + } + } + fmt.Println("Part 2", need, smallest) +} diff --git a/day7.txt b/day7.txt new file mode 100644 index 0000000..8f22e2f --- /dev/null +++ b/day7.txt @@ -0,0 +1,1079 @@ +$ cd / +$ ls +dir dpbwg +dir dvwfscw +dir hccpl +dir jsgbg +dir lhjmzsl +63532 mwvbpw.mmg +239480 npj +dir pngs +dir qhs +303649 shvgmwn.vhv +236905 sjrrgd.phh +dir sntcp +dir sqs +$ cd dpbwg +$ ls +dir dgh +100731 dpbwg +dir rpwnv +$ cd dgh +$ ls +197049 lhjmzsl.hzj +$ cd .. +$ cd rpwnv +$ ls +10702 qsgv.fmf +$ cd .. +$ cd .. +$ cd dvwfscw +$ ls +dir bvg +dir fbfjs +115450 gjftb.mgd +dir gsmnprgz +dir hdwdcvv +dir mhjtrlqz +75437 qsctddrw +171722 qsgv.zqz +$ cd bvg +$ ls +56335 cgtzb.szt +139481 shvgmwn.vhv +255200 wzqlgr.mhl +$ cd .. +$ cd fbfjs +$ ls +252977 hmcj +256083 mbgfn.pmh +dir qsgv +$ cd qsgv +$ ls +271506 dchsdfz.bbg +202650 hmcj +32623 lqgmfcp +57614 mgp.fbn +220895 qwzqrrq.wjf +$ cd .. +$ cd .. +$ cd gsmnprgz +$ ls +dir dzcsldzw +dir hrjmfd +dir lcwv +dir sdp +62355 zrncdmd.lmj +$ cd dzcsldzw +$ ls +dir hmcj +$ cd hmcj +$ ls +151947 hgtzldbg +$ cd .. +$ cd .. +$ cd hrjmfd +$ ls +dir drjlhbqf +65599 npj +$ cd drjlhbqf +$ ls +263623 hzfmzs.mlj +13866 npj +173713 wtnf.qps +$ cd .. +$ cd .. +$ cd lcwv +$ ls +44150 hmcj.lds +200694 mpbb +$ cd .. +$ cd sdp +$ ls +dir gcwjj +dir qzdczvwn +$ cd gcwjj +$ ls +149603 qsgv.srr +$ cd .. +$ cd qzdczvwn +$ ls +dir gnvbm +291187 hmcj.rgm +dir msdt +dir mwvbpw +dir shpr +$ cd gnvbm +$ ls +259516 dpbwg +120868 mpbb +dir vqrcd +$ cd vqrcd +$ ls +306804 fqqg +34290 mtctcdgd.nmb +$ cd .. +$ cd .. +$ cd msdt +$ ls +168438 mpbb +67435 nbqcrdjs +$ cd .. +$ cd mwvbpw +$ ls +dir btzqzvbl +308719 npj +$ cd btzqzvbl +$ ls +177311 bdnrf.jtw +122356 qwhmd.vcd +169153 vzzzccg.hlb +$ cd .. +$ cd .. +$ cd shpr +$ ls +290591 nblzc.nmp +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd hdwdcvv +$ ls +96864 hmcj.tjn +$ cd .. +$ cd mhjtrlqz +$ ls +dir bzrbsfjp +238772 fpggqqj +dir hqzgs +20155 shvgmwn.vhv +$ cd bzrbsfjp +$ ls +313691 fnscbhfc +17630 llwfdzgg.bsp +dir lthr +$ cd lthr +$ ls +237053 bhbbzt.bmt +$ cd .. +$ cd .. +$ cd hqzgs +$ ls +295258 gllsgr.nnz +70743 ptpqd +dir rnmsdpmj +205022 rpqh.rpn +158287 tsm.tdq +154025 wmfwr.bcm +$ cd rnmsdpmj +$ ls +218043 dpbwg.mls +149072 mbgfn.pmh +89388 mwvbpw.qfm +57207 rszcvm.mqc +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd hccpl +$ ls +dir blqdjh +dir hfqw +dir qsgv +$ cd blqdjh +$ ls +dir fbpg +$ cd fbpg +$ ls +231357 dpbwg +$ cd .. +$ cd .. +$ cd hfqw +$ ls +210898 fjblghm.gtg +286252 hmcj.dgz +258768 mpbb +225743 qsgv.pqf +191717 shvgmwn.vhv +$ cd .. +$ cd qsgv +$ ls +dir bslqpr +dir dpbwg +dir lhjmzsl +210707 npj +64435 qhpnrbhq +dir rpj +301426 shvgmwn.vhv +dir stbgbrw +dir vhzmg +$ cd bslqpr +$ ls +4365 dpbwg +dir fpj +dir lhjmzsl +dir lncmt +dir mwvbpw +35725 ncbjtpcb.svf +dir njhsmb +dir rjzsddlw +41533 shvgmwn.vhv +$ cd fpj +$ ls +88146 dpbwg +$ cd .. +$ cd lhjmzsl +$ ls +57400 fzngdsh.sbn +198711 mnqz.npt +$ cd .. +$ cd lncmt +$ ls +192228 qsgv.jss +$ cd .. +$ cd mwvbpw +$ ls +65217 hmcj.drs +$ cd .. +$ cd njhsmb +$ ls +157177 dpbwg.wsl +10919 jhfs +$ cd .. +$ cd rjzsddlw +$ ls +dir cftp +dir flcfwml +dir vpdbl +$ cd cftp +$ ls +89075 dpbwg +57259 mbgfn.pmh +237771 zwglrhh +$ cd .. +$ cd flcfwml +$ ls +51498 pbbgmqn.gfg +$ cd .. +$ cd vpdbl +$ ls +98690 npj +$ cd .. +$ cd .. +$ cd .. +$ cd dpbwg +$ ls +dir wlmdbjh +$ cd wlmdbjh +$ ls +dir pmldd +245468 rdgldw.tzb +$ cd pmldd +$ ls +145032 mwvbpw.tpc +$ cd .. +$ cd .. +$ cd .. +$ cd lhjmzsl +$ ls +233642 dpbwg.tbq +dir frsggjl +dir hmcj +dir jmhzlq +dir jvdtpzd +251765 npj +169647 shvgmwn.vhv +$ cd frsggjl +$ ls +dir dshv +dir fqvpc +dir lhjmzsl +313045 npj +dir rngqmwgr +$ cd dshv +$ ls +dir pptfqn +85609 wpgz +dir zfmqls +$ cd pptfqn +$ ls +258817 mtctcdgd.nmb +39899 npj +$ cd .. +$ cd zfmqls +$ ls +119006 hlw.mzg +295107 wstvdqn.wgw +$ cd .. +$ cd .. +$ cd fqvpc +$ ls +dir pqpf +$ cd pqpf +$ ls +312566 mpbb +$ cd .. +$ cd .. +$ cd lhjmzsl +$ ls +157261 dpbwg.bgc +76700 mpbb +$ cd .. +$ cd rngqmwgr +$ ls +42626 dpbwg.dtt +78765 gjsnmzn.fzb +$ cd .. +$ cd .. +$ cd hmcj +$ ls +166183 jntzn +dir qsgv +254851 rbcgrdr.vqp +$ cd qsgv +$ ls +256449 dhj.mrm +49207 fbrhl +69922 lhjmzsl +121778 tpdvnb +$ cd .. +$ cd .. +$ cd jmhzlq +$ ls +dir bbpqsf +245813 ftw.jwq +$ cd bbpqsf +$ ls +169373 mwvbpw.tjt +$ cd .. +$ cd .. +$ cd jvdtpzd +$ ls +dir brfln +dir dpbwg +263586 fsqzfhj.bzh +85956 lhjmzsl +dir mwvbpw +dir tcgwhp +91473 vjgt.twz +200413 zlnnrrpn.qqd +$ cd brfln +$ ls +65066 fpvnm +$ cd .. +$ cd dpbwg +$ ls +dir jtqwgc +dir lrdjdqn +281885 mpbb +$ cd jtqwgc +$ ls +219022 spbqn +$ cd .. +$ cd lrdjdqn +$ ls +116830 hmcj.ptr +dir mwvbpw +$ cd mwvbpw +$ ls +251737 ccqlb +$ cd .. +$ cd .. +$ cd .. +$ cd mwvbpw +$ ls +226329 fztjpfb +$ cd .. +$ cd tcgwhp +$ ls +dir grmsl +$ cd grmsl +$ ls +dir hmcj +197995 wzqlr.fqj +$ cd hmcj +$ ls +239775 mbgfn.pmh +dir rrvccjp +95381 shvgmwn.vhv +$ cd rrvccjp +$ ls +dir qsgv +$ cd qsgv +$ ls +192956 mtctcdgd.nmb +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd rpj +$ ls +dir bwc +dir ctjwjlzc +dir dpbwg +dir lhjmzsl +249767 npj +dir wqmlz +$ cd bwc +$ ls +56181 hmcj.dhd +105111 hvw +63869 rqw.srq +8030 shvgmwn.vhv +dir stff +$ cd stff +$ ls +dir gsjsc +$ cd gsjsc +$ ls +514 mtctcdgd.nmb +$ cd .. +$ cd .. +$ cd .. +$ cd ctjwjlzc +$ ls +39823 qjgnjm.hzn +$ cd .. +$ cd dpbwg +$ ls +dir lhqrjr +$ cd lhqrjr +$ ls +179949 tmvl.zqf +$ cd .. +$ cd .. +$ cd lhjmzsl +$ ls +305735 shvgmwn.vhv +$ cd .. +$ cd wqmlz +$ ls +141757 fstftggh +$ cd .. +$ cd .. +$ cd stbgbrw +$ ls +196003 dpbwg.shs +dir gbr +104091 hmcj +232145 lhjmzsl.nnc +dir lhv +dir qqqbtpq +51208 qsgv.dbm +235090 vbpzgnr +dir vqmnsdrt +$ cd gbr +$ ls +101809 npj +121922 pcqrmmlt.ghh +125915 ptffhc +128293 wdz.nsd +$ cd .. +$ cd lhv +$ ls +75506 qtwlnvv.nbm +28413 rbwbp +$ cd .. +$ cd qqqbtpq +$ ls +96300 gdf +$ cd .. +$ cd vqmnsdrt +$ ls +146229 mwvbpw.qrc +189540 plldv.vtv +dir rtng +$ cd rtng +$ ls +42730 hrbs.zpc +$ cd .. +$ cd .. +$ cd .. +$ cd vhzmg +$ ls +dir dcmjvhtt +dir dpbwg +$ cd dcmjvhtt +$ ls +85508 hhlctr.bbs +296657 lhjmzsl.zjt +255803 mbgfn.pmh +170803 mtctcdgd.nmb +$ cd .. +$ cd dpbwg +$ ls +156142 hmcj +dir lhjmzsl +$ cd lhjmzsl +$ ls +13590 mtctcdgd.nmb +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd jsgbg +$ ls +202682 hmcj.tbl +$ cd .. +$ cd lhjmzsl +$ ls +197308 lhjmzsl +$ cd .. +$ cd pngs +$ ls +115979 hfpzqf.hjw +dir lhjmzsl +125414 mpbb +dir mwbffchr +$ cd lhjmzsl +$ ls +55108 hwhsjr +$ cd .. +$ cd mwbffchr +$ ls +249138 czv.lgd +$ cd .. +$ cd .. +$ cd qhs +$ ls +108106 ccmhjzp.ppf +197911 shvgmwn.vhv +$ cd .. +$ cd sntcp +$ ls +dir cvgtwsbw +dir dpbwg +dir dqbzfcq +dir gfvtsjmz +dir ljsmjsp +dir mwvbpw +dir phfqzwp +dir rpsnfndl +dir rrqwcbqm +dir rtv +dir vnvft +dir vqcvbncp +dir vsgjds +$ cd cvgtwsbw +$ ls +dir bprbr +dir bpw +dir dpbwg +dir jvjs +dir mwvbpw +dir nbfzn +dir pcr +dir rhgltw +$ cd bprbr +$ ls +126107 dpbwg.jqq +140931 ljhc.gsm +120326 pnjv +dir wbrb +$ cd wbrb +$ ls +28887 ccr.rvd +dir gwfpgws +77898 mwvbpw.qrc +280487 pbfbtb.qjp +$ cd gwfpgws +$ ls +205904 dgm +313203 vpgzr.jfw +$ cd .. +$ cd .. +$ cd .. +$ cd bpw +$ ls +dir lgstpgrn +173334 npj +$ cd lgstpgrn +$ ls +dir rngr +$ cd rngr +$ ls +291856 czjz.fzp +246123 mpbb +200301 qqfvpnz +$ cd .. +$ cd .. +$ cd .. +$ cd dpbwg +$ ls +265739 mtctcdgd.nmb +dir mwvbpw +76505 ntjn.mnp +227157 pqznms +312879 qzlmsht +$ cd mwvbpw +$ ls +144523 dpbwg.lgr +39441 mmtrnzqw.mnv +285772 mpbb +306936 rpmgcmqd.qht +$ cd .. +$ cd .. +$ cd jvjs +$ ls +51134 lsnvhd.gsj +$ cd .. +$ cd mwvbpw +$ ls +125428 hmcj.bvd +40162 npj +117658 pmzfj.crj +$ cd .. +$ cd nbfzn +$ ls +11429 mwvbpw.swl +5582 qsgv.jrm +$ cd .. +$ cd pcr +$ ls +dir dpbwg +95858 mtctcdgd.nmb +$ cd dpbwg +$ ls +dir wmsb +$ cd wmsb +$ ls +154498 npj +$ cd .. +$ cd .. +$ cd .. +$ cd rhgltw +$ ls +188447 qsgv.rzs +$ cd .. +$ cd .. +$ cd dpbwg +$ ls +261326 cjfszwr +88528 glp.fgc +dir lhjmzsl +270470 shvgmwn.vhv +310081 vdhmgb +dir wsc +$ cd lhjmzsl +$ ls +245410 dnnfljbs +$ cd .. +$ cd wsc +$ ls +dir lhjmzsl +311302 mbs.tqc +309985 mpbb +dir qgpqzr +20812 vhcc.wpw +$ cd lhjmzsl +$ ls +dir dpbwg +$ cd dpbwg +$ ls +273340 fmvbcphl.crp +$ cd .. +$ cd .. +$ cd qgpqzr +$ ls +dir fdwgdhrf +$ cd fdwgdhrf +$ ls +275421 mtctcdgd.nmb +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd dqbzfcq +$ ls +30930 njnz +$ cd .. +$ cd gfvtsjmz +$ ls +290134 mbgfn.pmh +154689 vql +$ cd .. +$ cd ljsmjsp +$ ls +59894 hwggw.rpd +26336 mbgfn.pmh +dir mvzchpq +dir mwvbpw +122061 zlcr.jsw +$ cd mvzchpq +$ ls +294618 lhjmzsl.bqm +dir mwvbpw +204294 nljhbh.cfc +79337 ntvt.dbw +$ cd mwvbpw +$ ls +dir njwcqcjh +309971 nqdv.vmp +$ cd njwcqcjh +$ ls +155159 mtctcdgd.nmb +$ cd .. +$ cd .. +$ cd .. +$ cd mwvbpw +$ ls +43451 lhjmzsl.vjt +$ cd .. +$ cd .. +$ cd mwvbpw +$ ls +3144 phvjzs.prf +$ cd .. +$ cd phfqzwp +$ ls +dir hmcj +dir hnnrw +196279 lhjmzsl +90948 mwvbpw.hvm +275082 shvgmwn.vhv +$ cd hmcj +$ ls +4346 mtctcdgd.nmb +$ cd .. +$ cd hnnrw +$ ls +dir lhjmzsl +103070 qsbrf.tpv +dir rdf +$ cd lhjmzsl +$ ls +158692 dpbwg.bvl +$ cd .. +$ cd rdf +$ ls +dir gpj +dir lbgpm +$ cd gpj +$ ls +136508 shvgmwn.vhv +$ cd .. +$ cd lbgpm +$ ls +154457 ccpvr +232065 lhjmzsl +43787 npj +189920 rpgmvv +96362 tlmvpc +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd rpsnfndl +$ ls +dir pcbtmcwf +$ cd pcbtmcwf +$ ls +dir qsgv +$ cd qsgv +$ ls +45662 npj +$ cd .. +$ cd .. +$ cd .. +$ cd rrqwcbqm +$ ls +dir vjm +$ cd vjm +$ ls +263137 npj +$ cd .. +$ cd .. +$ cd rtv +$ ls +dir lhjmzsl +dir pcwsn +dir qsgv +dir vvzbsg +$ cd lhjmzsl +$ ls +dir qzsjhsfn +$ cd qzsjhsfn +$ ls +26909 mbgfn.pmh +$ cd .. +$ cd .. +$ cd pcwsn +$ ls +160033 ftz.nbg +145165 wgdjsgsb.hhm +$ cd .. +$ cd qsgv +$ ls +dir jqm +136209 mbgfn.pmh +79664 mghdlnh.chv +$ cd jqm +$ ls +222831 npj +$ cd .. +$ cd .. +$ cd vvzbsg +$ ls +84246 dpbwg.tsq +$ cd .. +$ cd .. +$ cd vnvft +$ ls +dir crqrl +dir scdvzsd +$ cd crqrl +$ ls +13185 dpbwg.twz +109021 qcdqnhg.jjj +$ cd .. +$ cd scdvzsd +$ ls +dir hmcj +$ cd hmcj +$ ls +252155 npj +$ cd .. +$ cd .. +$ cd .. +$ cd vqcvbncp +$ ls +72128 crnhb +dir ddz +dir dvhzvdn +dir ffsbcmg +dir gfs +dir jghlb +dir llq +dir pvn +dir rvqmmjgr +$ cd ddz +$ ls +232302 gdfqpnj.nhf +274940 lhjmzsl.mzv +286217 mpbb +$ cd .. +$ cd dvhzvdn +$ ls +273183 cfnqn.qpz +$ cd .. +$ cd ffsbcmg +$ ls +6544 mtctcdgd.nmb +52511 wndzt.lqb +$ cd .. +$ cd gfs +$ ls +228312 mwvbpw.tdj +dir rqjrfzgt +62100 shc.rtj +313984 szsplzq.dpd +dir tqtnp +$ cd rqjrfzgt +$ ls +296460 bvp +272324 mbgfn.pmh +221044 npj +110232 qvcszzv +$ cd .. +$ cd tqtnp +$ ls +98376 tzwh +212247 wzjj.scp +$ cd .. +$ cd .. +$ cd jghlb +$ ls +dir ddrmsv +$ cd ddrmsv +$ ls +252143 mbgfn.pmh +$ cd .. +$ cd .. +$ cd llq +$ ls +dir lhjmzsl +67341 mbgfn.pmh +155159 npj +dir qsgv +dir vcvnzc +$ cd lhjmzsl +$ ls +151930 ssldrsf.mzm +$ cd .. +$ cd qsgv +$ ls +233702 ztdmtqb.mhf +$ cd .. +$ cd vcvnzc +$ ls +168179 lhjmzsl.cwf +$ cd .. +$ cd .. +$ cd pvn +$ ls +240160 lbd.slf +$ cd .. +$ cd rvqmmjgr +$ ls +24809 gwgcrzp.zhj +dir hmcj +dir lhjmzsl +dir mwvbpw +121997 nbmf +77886 ntp +dir qcqrgdm +$ cd hmcj +$ ls +126073 dpbwg.lhh +dir jchccghv +dir lhjmzsl +144075 qsgv.lbw +288076 swrngbsq.qzw +$ cd jchccghv +$ ls +310277 mpbb +$ cd .. +$ cd lhjmzsl +$ ls +193576 bwsz.crv +16002 mbgfn.pmh +57961 mtctcdgd.nmb +$ cd .. +$ cd .. +$ cd lhjmzsl +$ ls +dir bsfwmcz +dir dpbwg +121640 mwvbpw +dir pmrfvzw +dir qsgv +$ cd bsfwmcz +$ ls +dir fjqqblz +51952 gqbj.fwd +dir hmcj +dir lctt +81316 lhjmzsl.qqr +6372 mbgfn.pmh +22669 shvgmwn.vhv +130990 zgq.fpv +$ cd fjqqblz +$ ls +26064 zrqrnb.nwf +$ cd .. +$ cd hmcj +$ ls +14385 mwvbpw.vzq +$ cd .. +$ cd lctt +$ ls +137397 fbgbs.fjf +dir jgbzqzq +dir qrr +272639 qsgv.vwm +$ cd jgbzqzq +$ ls +135320 mpbb +$ cd .. +$ cd qrr +$ ls +dir dpbwg +dir mwvbpw +54143 pnsl.bbm +dir wbpzpg +$ cd dpbwg +$ ls +250653 shvgmwn.vhv +$ cd .. +$ cd mwvbpw +$ ls +2682 fhdh.hmt +$ cd .. +$ cd wbpzpg +$ ls +dir bqshqpvm +141398 mtctcdgd.nmb +130729 vtnfmjqm.mgp +$ cd bqshqpvm +$ ls +252449 shvgmwn.vhv +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd dpbwg +$ ls +82216 gwjwmcbf.gwl +$ cd .. +$ cd pmrfvzw +$ ls +dir mwvbpw +dir wtzgjspz +dir zmb +$ cd mwvbpw +$ ls +16736 wbzjzz.mqq +$ cd .. +$ cd wtzgjspz +$ ls +dir vjb +$ cd vjb +$ ls +301763 drchphtm +$ cd .. +$ cd .. +$ cd zmb +$ ls +201978 mdj +dir qgnffw +147889 qzbmwpnm.gjp +$ cd qgnffw +$ ls +17740 cwz.dhs +222345 mbgfn.pmh +81554 npj +206597 tsnlnzh +$ cd .. +$ cd .. +$ cd .. +$ cd qsgv +$ ls +dir mmsnzr +$ cd mmsnzr +$ ls +160502 tgrztm +$ cd .. +$ cd .. +$ cd .. +$ cd mwvbpw +$ ls +40049 qmmdv +313418 qsgv.srp +$ cd .. +$ cd qcqrgdm +$ ls +202848 wtl.qbj +$ cd .. +$ cd .. +$ cd .. +$ cd vsgjds +$ ls +138690 npj +22984 tpfbnz.sgj +$ cd .. +$ cd .. +$ cd sqs +$ ls +dir zms +$ cd zms +$ ls +152096 cvtqph.wwp +dir mmwzg +$ cd mmwzg +$ ls +100870 qsgv -- cgit v1.2.3