summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Vink <mike1994vink@gmail.com>2023-02-25 13:23:13 +0100
committerMike Vink <mike1994vink@gmail.com>2023-02-25 13:23:13 +0100
commitcc446240fac48c545c522f3d69c5d04a93b63461 (patch)
treed872d54643280f238b9e6456fdfcf596c4daad8d
parent536b1f2b33f3d98f607dd8776f8b437d13c200c0 (diff)
day1-7
-rw-r--r--day1.go68
-rw-r--r--day1.txt2257
-rw-r--r--day2.go163
-rw-r--r--day2.txt2501
-rw-r--r--day3.go102
-rw-r--r--day3.txt300
-rw-r--r--day4.go80
-rw-r--r--day4.txt1000
-rw-r--r--day5.go135
-rw-r--r--day5.txt511
-rw-r--r--day6.go48
-rw-r--r--day6.txt1
-rw-r--r--day7.go153
-rw-r--r--day7.txt1079
14 files changed, 8398 insertions, 0 deletions
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<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
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