diff options
| author | Mike Vink <mike1994vink@gmail.com> | 2023-02-25 13:23:13 +0100 |
|---|---|---|
| committer | Mike Vink <mike1994vink@gmail.com> | 2023-02-25 13:23:13 +0100 |
| commit | cc446240fac48c545c522f3d69c5d04a93b63461 (patch) | |
| tree | d872d54643280f238b9e6456fdfcf596c4daad8d | |
| parent | 536b1f2b33f3d98f607dd8776f8b437d13c200c0 (diff) | |
day1-7
| -rw-r--r-- | day1.go | 68 | ||||
| -rw-r--r-- | day1.txt | 2257 | ||||
| -rw-r--r-- | day2.go | 163 | ||||
| -rw-r--r-- | day2.txt | 2501 | ||||
| -rw-r--r-- | day3.go | 102 | ||||
| -rw-r--r-- | day3.txt | 300 | ||||
| -rw-r--r-- | day4.go | 80 | ||||
| -rw-r--r-- | day4.txt | 1000 | ||||
| -rw-r--r-- | day5.go | 135 | ||||
| -rw-r--r-- | day5.txt | 511 | ||||
| -rw-r--r-- | day6.go | 48 | ||||
| -rw-r--r-- | day6.txt | 1 | ||||
| -rw-r--r-- | day7.go | 153 | ||||
| -rw-r--r-- | day7.txt | 1079 |
14 files changed, 8398 insertions, 0 deletions
@@ -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 + @@ -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 + @@ -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 @@ -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 @@ -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<amount>\d+) from (?P<from>\d+) to (?P<to>\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 @@ -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 @@ -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 |
