]> fbox.kageds.com Git - adventofcode.git/commitdiff
re-organise repo
authorAlan R Evans <alan@kageds.com>
Thu, 16 Nov 2023 10:48:53 +0000 (10:48 +0000)
committerAlan R Evans <alan@kageds.com>
Thu, 16 Nov 2023 10:48:53 +0000 (10:48 +0000)
87 files changed:
2021/Gareth solution Python/1.py [moved from Gareth solution Python/1.py with 100% similarity]
2021/Gareth solution Python/2.py [moved from Gareth solution Python/2.py with 100% similarity]
2021/Gareth solution Python/5pt1.py [moved from Gareth solution Python/5pt1.py with 100% similarity]
2021/Gareth solution Python/5pt2.py [moved from Gareth solution Python/5pt2.py with 100% similarity]
2021/Gareth solution Python/6.py [moved from Gareth solution Python/6.py with 100% similarity]
2021/Gareth solution Python/ConvertToArray.py [moved from Gareth solution Python/ConvertToArray.py with 100% similarity]
2021/Gareth solution Python/Day3pt2.py [moved from Gareth solution Python/Day3pt2.py with 100% similarity]
2021/day1/day1.erl [moved from day1/day1.erl with 100% similarity]
2021/day1/day1_p1.hs [moved from day1/day1_p1.hs with 100% similarity]
2021/day1/day1_p2.hs [moved from day1/day1_p2.hs with 100% similarity]
2021/day1/input.txt [moved from day1/input.txt with 100% similarity]
2021/day1/test.txt [moved from day1/test.txt with 100% similarity]
2021/day10/day10.erl [moved from day10/day10.erl with 100% similarity]
2021/day10/input.txt [moved from day10/input.txt with 100% similarity]
2021/day11/day11.erl [moved from day11/day11.erl with 100% similarity]
2021/day11/input.txt [moved from day11/input.txt with 100% similarity]
2021/day12/day12.erl [moved from day12/day12.erl with 100% similarity]
2021/day12/input.txt [moved from day12/input.txt with 100% similarity]
2021/day13/commmands.txt [moved from day13/commmands.txt with 100% similarity]
2021/day13/day13.erl [moved from day13/day13.erl with 100% similarity]
2021/day13/input.txt [moved from day13/input.txt with 100% similarity]
2021/day14/day14.erl [moved from day14/day14.erl with 100% similarity]
2021/day14/input.txt [moved from day14/input.txt with 100% similarity]
2021/day15/day15.erl [moved from day15/day15.erl with 100% similarity]
2021/day15/input.test [moved from day15/input.test with 100% similarity]
2021/day15/input.txt [moved from day15/input.txt with 100% similarity]
2021/day16/day16.erl [moved from day16/day16.erl with 100% similarity]
2021/day16/input.txt [moved from day16/input.txt with 100% similarity]
2021/day17/day17.erl [moved from day17/day17.erl with 100% similarity]
2021/day17/diagram.txt [moved from day17/diagram.txt with 100% similarity]
2021/day17/input.txt [moved from day17/input.txt with 100% similarity]
2021/day18/day18.erl [moved from day18/day18.erl with 100% similarity]
2021/day18/input.txt [moved from day18/input.txt with 100% similarity]
2021/day2/day2.erl [moved from day2/day2.erl with 100% similarity]
2021/day3/day3 [moved from day3/day3 with 100% similarity]
2021/day3/day3.erl [moved from day3/day3.erl with 100% similarity]
2021/day3/day3.hs [moved from day3/day3.hs with 100% similarity]
2021/day4/boards.txt [moved from day4/boards.txt with 100% similarity]
2021/day4/day4.erl [moved from day4/day4.erl with 100% similarity]
2021/day5/day5.erl [moved from day5/day5.erl with 100% similarity]
2021/day5/day5.hs [moved from day5/day5.hs with 100% similarity]
2021/day5/input.txt [moved from day5/input.txt with 100% similarity]
2021/day6/day6.erl [moved from day6/day6.erl with 100% similarity]
2021/day6/input.txt [moved from day6/input.txt with 100% similarity]
2021/day7/day7.erl [moved from day7/day7.erl with 100% similarity]
2021/day7/input.txt [moved from day7/input.txt with 100% similarity]
2021/day8/day8.erl [moved from day8/day8.erl with 100% similarity]
2021/day8/input.txt [moved from day8/input.txt with 100% similarity]
2021/day9/day9.erl [moved from day9/day9.erl with 100% similarity]
2021/day9/input.txt [moved from day9/input.txt with 100% similarity]
2022/go/day01/day01.go [new file with mode: 0644]
2022/go/day01/day01_test.go [new file with mode: 0644]
2022/go/day01/input.txt [new file with mode: 0644]
2022/go/day02/day02.go [new file with mode: 0644]
2022/go/day02/day02_test.go [new file with mode: 0644]
2022/go/day02/input.txt [new file with mode: 0644]
2022/go/day03/day03.go [new file with mode: 0644]
2022/go/day03/day03_test.go [new file with mode: 0644]
2022/go/day03/input.txt [new file with mode: 0644]
2022/go/day04/day04.go [new file with mode: 0644]
2022/go/day04/day04_test.go [new file with mode: 0644]
2022/go/day04/input.txt [new file with mode: 0644]
2022/go/day05/day05.go [new file with mode: 0644]
2022/go/day05/day05_test.go [new file with mode: 0644]
2022/go/day05/input.txt [new file with mode: 0644]
2022/go/day06/day06.go [new file with mode: 0644]
2022/go/day06/day06_test.go [new file with mode: 0644]
2022/go/day06/input.txt [new file with mode: 0644]
2022/go/day07/day07.go [new file with mode: 0644]
2022/go/day07/day07_test.go [new file with mode: 0644]
2022/go/day07/input.txt [new file with mode: 0644]
2022/go/day08/day08.go [new file with mode: 0644]
2022/go/day08/day08_test.go [new file with mode: 0644]
2022/go/day08/input.txt [new file with mode: 0644]
2022/go/day09/day09.go [new file with mode: 0644]
2022/go/day09/day09_test.go [new file with mode: 0644]
2022/go/day09/input.txt [new file with mode: 0644]
2022/go/day10/day10.go [new file with mode: 0644]
2022/go/day10/day10_test.go [new file with mode: 0644]
2022/go/day10/input.txt [new file with mode: 0644]
2022/go/go.mod [new file with mode: 0644]
2022/go/go.sum [new file with mode: 0644]
2022/go/main.go [new file with mode: 0644]
2022/go/utils/grid2d/grid2d.go [new file with mode: 0644]
2022/go/utils/inputs/inputs.go [new file with mode: 0644]
2022/go/utils/sparseGrid/sparseGrid.go [new file with mode: 0644]
2022/go/utils/utils.go [new file with mode: 0644]

similarity index 100%
rename from day1/day1.erl
rename to 2021/day1/day1.erl
similarity index 100%
rename from day1/day1_p1.hs
rename to 2021/day1/day1_p1.hs
similarity index 100%
rename from day1/day1_p2.hs
rename to 2021/day1/day1_p2.hs
similarity index 100%
rename from day1/input.txt
rename to 2021/day1/input.txt
similarity index 100%
rename from day1/test.txt
rename to 2021/day1/test.txt
similarity index 100%
rename from day10/day10.erl
rename to 2021/day10/day10.erl
similarity index 100%
rename from day10/input.txt
rename to 2021/day10/input.txt
similarity index 100%
rename from day11/day11.erl
rename to 2021/day11/day11.erl
similarity index 100%
rename from day11/input.txt
rename to 2021/day11/input.txt
similarity index 100%
rename from day12/day12.erl
rename to 2021/day12/day12.erl
similarity index 100%
rename from day12/input.txt
rename to 2021/day12/input.txt
similarity index 100%
rename from day13/commmands.txt
rename to 2021/day13/commmands.txt
similarity index 100%
rename from day13/day13.erl
rename to 2021/day13/day13.erl
similarity index 100%
rename from day13/input.txt
rename to 2021/day13/input.txt
similarity index 100%
rename from day14/day14.erl
rename to 2021/day14/day14.erl
similarity index 100%
rename from day14/input.txt
rename to 2021/day14/input.txt
similarity index 100%
rename from day15/day15.erl
rename to 2021/day15/day15.erl
similarity index 100%
rename from day15/input.test
rename to 2021/day15/input.test
similarity index 100%
rename from day15/input.txt
rename to 2021/day15/input.txt
similarity index 100%
rename from day16/day16.erl
rename to 2021/day16/day16.erl
similarity index 100%
rename from day16/input.txt
rename to 2021/day16/input.txt
similarity index 100%
rename from day17/day17.erl
rename to 2021/day17/day17.erl
similarity index 100%
rename from day17/diagram.txt
rename to 2021/day17/diagram.txt
similarity index 100%
rename from day17/input.txt
rename to 2021/day17/input.txt
similarity index 100%
rename from day18/day18.erl
rename to 2021/day18/day18.erl
similarity index 100%
rename from day18/input.txt
rename to 2021/day18/input.txt
similarity index 100%
rename from day2/day2.erl
rename to 2021/day2/day2.erl
similarity index 100%
rename from day3/day3
rename to 2021/day3/day3
similarity index 100%
rename from day3/day3.erl
rename to 2021/day3/day3.erl
similarity index 100%
rename from day3/day3.hs
rename to 2021/day3/day3.hs
similarity index 100%
rename from day4/boards.txt
rename to 2021/day4/boards.txt
similarity index 100%
rename from day4/day4.erl
rename to 2021/day4/day4.erl
similarity index 100%
rename from day5/day5.erl
rename to 2021/day5/day5.erl
similarity index 100%
rename from day5/day5.hs
rename to 2021/day5/day5.hs
similarity index 100%
rename from day5/input.txt
rename to 2021/day5/input.txt
similarity index 100%
rename from day6/day6.erl
rename to 2021/day6/day6.erl
similarity index 100%
rename from day6/input.txt
rename to 2021/day6/input.txt
similarity index 100%
rename from day7/day7.erl
rename to 2021/day7/day7.erl
similarity index 100%
rename from day7/input.txt
rename to 2021/day7/input.txt
similarity index 100%
rename from day8/day8.erl
rename to 2021/day8/day8.erl
similarity index 100%
rename from day8/input.txt
rename to 2021/day8/input.txt
similarity index 100%
rename from day9/day9.erl
rename to 2021/day9/day9.erl
similarity index 100%
rename from day9/input.txt
rename to 2021/day9/input.txt
diff --git a/2022/go/day01/day01.go b/2022/go/day01/day01.go
new file mode 100644 (file)
index 0000000..dac5b7c
--- /dev/null
@@ -0,0 +1,44 @@
+package day01
+
+import (
+       "sort"
+       "strings"
+
+       "adventofcode2022/utils"
+)
+
+type elf struct {
+       calories int
+}
+
+func Part1(input string) int {
+       elves := common(input)
+       return elves[0].calories
+}
+
+func Part2(input string) int {
+       elves := common(input)
+       return elves[0].calories + elves[1].calories + elves[2].calories
+}
+
+func common(input string) []elf {
+       lines := strings.Split(input, "\n")
+
+       elves := []elf{}
+       e := elf{}
+       for _, line := range lines {
+               if line == "" {
+                       elves = append(elves, e)
+                       e = elf{}
+               } else {
+                       e.calories += utils.MustAtoi(line)
+               }
+       }
+       elves = append(elves, e)
+
+       sort.Slice(elves, func(i, j int) bool {
+               return elves[i].calories > elves[j].calories
+       })
+
+       return elves
+}
\ No newline at end of file
diff --git a/2022/go/day01/day01_test.go b/2022/go/day01/day01_test.go
new file mode 100644 (file)
index 0000000..2e45d89
--- /dev/null
@@ -0,0 +1,43 @@
+package day01
+
+import (
+       "testing"
+
+       "github.com/stretchr/testify/assert"
+)
+
+func TestPart1(t *testing.T) {
+       r := Part1(`1000
+2000
+3000
+
+4000
+
+5000
+6000
+
+7000
+8000
+9000
+
+10000`)
+       assert.Equal(t, 24000, r)
+}
+
+func TestPart2(t *testing.T) {
+       r := Part2(`1000
+2000
+3000
+
+4000
+
+5000
+6000
+
+7000
+8000
+9000
+
+10000`)
+       assert.Equal(t, 45000, r)
+}
diff --git a/2022/go/day01/input.txt b/2022/go/day01/input.txt
new file mode 100644 (file)
index 0000000..a9fff82
--- /dev/null
@@ -0,0 +1,2255 @@
+5324
+5176
+2197
+2701
+6185
+3901
+5392
+2065
+6467
+6085
+5062
+1841
+1197
+1318
+
+4901
+3443
+1403
+5570
+4336
+5672
+2532
+5627
+6038
+1099
+4305
+2317
+1382
+3226
+4427
+
+2612
+15638
+
+4118
+4687
+2243
+3532
+2089
+3937
+1146
+5069
+5728
+2962
+3099
+5882
+5448
+6064
+
+2642
+7996
+5334
+10384
+1106
+2742
+
+3064
+3506
+2566
+5241
+2705
+5973
+5482
+1689
+1797
+6098
+3964
+2592
+2700
+5569
+4305
+
+1307
+2204
+3618
+4795
+7853
+6103
+5248
+5989
+1451
+5524
+2572
+
+7207
+5428
+8504
+3861
+1025
+3600
+2850
+3363
+4283
+3695
+
+21536
+34998
+
+7332
+7390
+4755
+1006
+6221
+2081
+4894
+6376
+3893
+2797
+4448
+2961
+
+6544
+13080
+9331
+4452
+11569
+
+8130
+7731
+4130
+2905
+5849
+3086
+1386
+8160
+4405
+4456
+
+1673
+5591
+6628
+3577
+2097
+2540
+4884
+3704
+4340
+5609
+5671
+2386
+
+1454
+2458
+2099
+2123
+3529
+1500
+2574
+1414
+1570
+5540
+4674
+2596
+5112
+4553
+3538
+
+3089
+20620
+8662
+
+7318
+6430
+3187
+4619
+7214
+7950
+5435
+1408
+4418
+6811
+6619
+
+14465
+13716
+4698
+18846
+
+3262
+3532
+3052
+8765
+7883
+4037
+3531
+1275
+1699
+
+7331
+1567
+1820
+2593
+3537
+2140
+6760
+5755
+4144
+2073
+4602
+4128
+
+6104
+8972
+19892
+
+17252
+21573
+9351
+
+67201
+
+4294
+7766
+
+19774
+
+11565
+11046
+2842
+8393
+
+7017
+9675
+6745
+13481
+13556
+4249
+
+2107
+5225
+4963
+1119
+1573
+7933
+5257
+6803
+3414
+6156
+2593
+
+3598
+2420
+2557
+2910
+6750
+2253
+5729
+6724
+6355
+1731
+4128
+4827
+6062
+
+5367
+1916
+4804
+5871
+1210
+2265
+3945
+6557
+5711
+6611
+2373
+
+10064
+
+9038
+27653
+
+2574
+6005
+11713
+2748
+10206
+
+3404
+3885
+6447
+6270
+3738
+6098
+4455
+4285
+3386
+2148
+6238
+2457
+3971
+5009
+
+1964
+7018
+3023
+13938
+2509
+9362
+
+5570
+5928
+7596
+7327
+3867
+2127
+2473
+6631
+2514
+5685
+
+17379
+5566
+7377
+11680
+
+11618
+9050
+4052
+6359
+9340
+10670
+2206
+
+3801
+7994
+1783
+8331
+8378
+8567
+6575
+6466
+6327
+7675
+
+1727
+4854
+13316
+2277
+1002
+
+11508
+
+1466
+2783
+1248
+6891
+5062
+4676
+5392
+
+2309
+4345
+4061
+2291
+6176
+2020
+1352
+4323
+5949
+3386
+1453
+6271
+2406
+3702
+
+9874
+9051
+11016
+5825
+8846
+1554
+7739
+
+23528
+
+1043
+8194
+3368
+9066
+9089
+8174
+
+10746
+9730
+11740
+10055
+7193
+13904
+
+6215
+1885
+5229
+6669
+6959
+4974
+2120
+1298
+1430
+6121
+
+14723
+32715
+
+5783
+1098
+5175
+4285
+4773
+3161
+5007
+2226
+5436
+6077
+4460
+4532
+2250
+4365
+2067
+
+6400
+2528
+2425
+3648
+2881
+3142
+6677
+5898
+2358
+6551
+2718
+1068
+
+26003
+35903
+
+5639
+2631
+5958
+5768
+1598
+2399
+2034
+5312
+5296
+2416
+4102
+5487
+4703
+
+2570
+8366
+5181
+2445
+5162
+7602
+7173
+7287
+5544
+
+7471
+1860
+6054
+4806
+8003
+7528
+1229
+8685
+7621
+8658
+
+2772
+3368
+2152
+5375
+2609
+8107
+6980
+4483
+5277
+2887
+
+5247
+2757
+5563
+2715
+1667
+1226
+5100
+5406
+3361
+1873
+1254
+1455
+5119
+6059
+5763
+
+36308
+
+10652
+2469
+5899
+3109
+9516
+1320
+5497
+8118
+
+1633
+36728
+
+15311
+15800
+2345
+
+8798
+7581
+2277
+8154
+10875
+7322
+6145
+
+9637
+3697
+4013
+3531
+10327
+7563
+9885
+2997
+
+4043
+2569
+6039
+1967
+7443
+3359
+2323
+6144
+6260
+2931
+1316
+
+4511
+10608
+16203
+5885
+5809
+
+4708
+9406
+8620
+7918
+3530
+6432
+1294
+1129
+
+5619
+2899
+1447
+4966
+2602
+4203
+1151
+4142
+5444
+1628
+2951
+3237
+2622
+1772
+4763
+
+2587
+2284
+2831
+8008
+2176
+11829
+2512
+
+13915
+13264
+10711
+5834
+8227
+
+9012
+13250
+9137
+3782
+8746
+2746
+
+3215
+2767
+1979
+3831
+5022
+1171
+1315
+4688
+2993
+1727
+1632
+2576
+1148
+3347
+5848
+
+4528
+1066
+24591
+
+1107
+5616
+6397
+3615
+1922
+7825
+4068
+2282
+4969
+4928
+1956
+
+7563
+8015
+1599
+7393
+8540
+5662
+3296
+7456
+7456
+6788
+
+8739
+3875
+
+5167
+1477
+5247
+8143
+1505
+10220
+7960
+4732
+
+16912
+
+4976
+7525
+1736
+1008
+4977
+5674
+4444
+6232
+6049
+3639
+4522
+
+22528
+23111
+
+13556
+17076
+3627
+17255
+
+1016
+1029
+3348
+5944
+5495
+2094
+4820
+2525
+4933
+5956
+2824
+3723
+5823
+6486
+
+19290
+4670
+15993
+1076
+
+9721
+7648
+17076
+7349
+
+9628
+8035
+7244
+8595
+
+29847
+31827
+
+13167
+5522
+5306
+8929
+11649
+10464
+
+4502
+3131
+1443
+5337
+9086
+4409
+6998
+4804
+
+5638
+4221
+1322
+7392
+3318
+4711
+7797
+7945
+
+5089
+2885
+1516
+6707
+4162
+2750
+3852
+4179
+4237
+1514
+3948
+
+5584
+2739
+2969
+1821
+6459
+2524
+1315
+2437
+5509
+1931
+2268
+2997
+
+5234
+2321
+4232
+5685
+3984
+2906
+1432
+4343
+3281
+2528
+2488
+1718
+5990
+3522
+4354
+
+26195
+6781
+
+5142
+4073
+5532
+7427
+7419
+1747
+3380
+6364
+6631
+3779
+4765
+5835
+
+3705
+1536
+6790
+2033
+1455
+6505
+4919
+3024
+2474
+5873
+3471
+3505
+1316
+
+6749
+4727
+3858
+5056
+
+22223
+
+17648
+4274
+12725
+
+2280
+9924
+
+15172
+7628
+7641
+7194
+1968
+
+5982
+5614
+2452
+5362
+8434
+3174
+2176
+2698
+2412
+2189
+
+13340
+12621
+14111
+14941
+13566
+
+1361
+5862
+4128
+6746
+4467
+1838
+2139
+2664
+5443
+6834
+4677
+1098
+6784
+
+10515
+2760
+10711
+5115
+12137
+2781
+
+5049
+6241
+2530
+5856
+2433
+4728
+5363
+6403
+3327
+4275
+4158
+3801
+2371
+6359
+
+29965
+8489
+
+56825
+
+11312
+9212
+1929
+14504
+
+6465
+9629
+10359
+5838
+9425
+3058
+9753
+5888
+
+5406
+13482
+3204
+2628
+9957
+10256
+
+6179
+4133
+5327
+2896
+5640
+6104
+2780
+7809
+3987
+1638
+2541
+
+33667
+14175
+
+6110
+11612
+2695
+9999
+
+5704
+6108
+2967
+1017
+1635
+3585
+6748
+1582
+6924
+1444
+3855
+1401
+2205
+
+6732
+1197
+6953
+2207
+5612
+4231
+7347
+5711
+7897
+
+13701
+10913
+16370
+19244
+
+2674
+7112
+6486
+7851
+4414
+5481
+6726
+6598
+2871
+6893
+1811
+
+1943
+3602
+4825
+11299
+14128
+
+3270
+5562
+4320
+1632
+2765
+5645
+4944
+5241
+5292
+8473
+
+2052
+2661
+4128
+5271
+1213
+4609
+3655
+6794
+2479
+5906
+6116
+4915
+
+13118
+3888
+4049
+14650
+8187
+
+7607
+7667
+4020
+2573
+3144
+10783
+3750
+
+3572
+1577
+5913
+1191
+2013
+5357
+1334
+4691
+4955
+3044
+3587
+4261
+1879
+5174
+
+21378
+
+3856
+7070
+6705
+8507
+9457
+9742
+2451
+
+2451
+6025
+10161
+10060
+11159
+4572
+
+6103
+14326
+18133
+15332
+
+5227
+2699
+2870
+1360
+3827
+2691
+5508
+1526
+2144
+4458
+4799
+3028
+5663
+3352
+5890
+
+6639
+12924
+5358
+9307
+1789
+
+4548
+8584
+2044
+1171
+8894
+7690
+2456
+2225
+6462
+
+17817
+18601
+22573
+
+5232
+7406
+2372
+9508
+6245
+5918
+3184
+7341
+4055
+
+5583
+6410
+2211
+1752
+5614
+6256
+3575
+5114
+5707
+5439
+6576
+6152
+4253
+
+1588
+4856
+1078
+9837
+10431
+3509
+2755
+2086
+
+4108
+1603
+5413
+3281
+2084
+4070
+5170
+6002
+2991
+5885
+2073
+5249
+5078
+2229
+
+2486
+1600
+2956
+5086
+3521
+2302
+5989
+5187
+2070
+3637
+4734
+2812
+2929
+1017
+1030
+
+2302
+3395
+8743
+10214
+9177
+11084
+11280
+
+3789
+5462
+5929
+2823
+5276
+5236
+1262
+1046
+6508
+5734
+5138
+5299
+3707
+
+18103
+23600
+9666
+
+9572
+5689
+8247
+6325
+5766
+6474
+4341
+2272
+
+11951
+3817
+9665
+9371
+11456
+
+18948
+
+5760
+4181
+5350
+4406
+3333
+1192
+3369
+1739
+1417
+2549
+6452
+5864
+3340
+2264
+
+1353
+4974
+1110
+3219
+3022
+1763
+2457
+1242
+1015
+5118
+2844
+1289
+5798
+2370
+1328
+
+2420
+3955
+5165
+6471
+1506
+7366
+2845
+7015
+3494
+3631
+3366
+
+5595
+1173
+5367
+2745
+5405
+3846
+4318
+4974
+1798
+5729
+2531
+3837
+4751
+1773
+
+2917
+16933
+3801
+1609
+
+24309
+17327
+3185
+
+3608
+5934
+10329
+13659
+8898
+
+13593
+
+34109
+14389
+
+5060
+2976
+1252
+3496
+2184
+2118
+2705
+4575
+1960
+1399
+4248
+1096
+5987
+
+22148
+
+6872
+3921
+6311
+6941
+5690
+5889
+5491
+2539
+6307
+6881
+6341
+4722
+6489
+
+1294
+4268
+5230
+4534
+4271
+3299
+5569
+2424
+1169
+3393
+2191
+4614
+3407
+6061
+
+5949
+3315
+3465
+1766
+6758
+3424
+6719
+3146
+5540
+5761
+3082
+5684
+
+2622
+5651
+5396
+6061
+1771
+1924
+5686
+5660
+1867
+5316
+5457
+6073
+2739
+5972
+5036
+
+6479
+4340
+4935
+1261
+3876
+1382
+3676
+7756
+6854
+1713
+2231
+
+4951
+9899
+5241
+6767
+1821
+7499
+10630
+2795
+
+6056
+4547
+1637
+9041
+8543
+2658
+4432
+8485
+2344
+
+13655
+9543
+10307
+13701
+7088
+3037
+
+11024
+13887
+13483
+9086
+3240
+
+25938
+5207
+12019
+
+7149
+1287
+6648
+2064
+1192
+4329
+3562
+6906
+4932
+1275
+2770
+5506
+
+3937
+2237
+3689
+1612
+5617
+5771
+1582
+4790
+2307
+5041
+2624
+2838
+2795
+2206
+1635
+
+17589
+8653
+17117
+
+4989
+4956
+5419
+6835
+2196
+7712
+2424
+4662
+1602
+3939
+1272
+
+16436
+12889
+6171
+9114
+2522
+
+7624
+7560
+2198
+9091
+4732
+4600
+5329
+6004
+1019
+
+5856
+1678
+1413
+1159
+2087
+1688
+2705
+2914
+4541
+6192
+3899
+
+5894
+7004
+6434
+7397
+1628
+10169
+10771
+2815
+
+5066
+4856
+1640
+1711
+11255
+
+4073
+1430
+3137
+4448
+6758
+6601
+5361
+1551
+1172
+6521
+1984
+6439
+6856
+
+9142
+5332
+6587
+6221
+7395
+3916
+3028
+6746
+
+1888
+4873
+4385
+1612
+2542
+5366
+4580
+4885
+5067
+2973
+3746
+2312
+
+9887
+2252
+9326
+9370
+4463
+2315
+3341
+8055
+
+2044
+2280
+7734
+3207
+7745
+7176
+4730
+2999
+1333
+5779
+7820
+
+2176
+5977
+6915
+5025
+2534
+5837
+5051
+2789
+2710
+3725
+4542
+5014
+6533
+
+5040
+7527
+7004
+6962
+2013
+7318
+1072
+1885
+5706
+2064
+2112
+
+32698
+5926
+
+7743
+4843
+6126
+6327
+4515
+5568
+7777
+5099
+5645
+5375
+4282
+
+10281
+7177
+8041
+9502
+4617
+6776
+5955
+9100
+
+13793
+5079
+11978
+9184
+5004
+6506
+
+11597
+22056
+11123
+
+1966
+2459
+6579
+4048
+4820
+3866
+7306
+3019
+4028
+3280
+1280
+6118
+
+2629
+6241
+5263
+4006
+7169
+6295
+1916
+7067
+5163
+7417
+7183
+
+5296
+1587
+6900
+7476
+2815
+6000
+5377
+5690
+6823
+6629
+
+10444
+7392
+8982
+6994
+9345
+1164
+
+4648
+18356
+5229
+18479
+
+37019
+
+1595
+14516
+11072
+12073
+10524
+
+7074
+4499
+3528
+6918
+7634
+7018
+4064
+2346
+6254
+4557
+5201
+
+1304
+4826
+7327
+7594
+5661
+6148
+8777
+4703
+3436
+4898
+
+69863
+
+8498
+10599
+9617
+8728
+9386
+1506
+2857
+
+7081
+3260
+16812
+
+1978
+5986
+5234
+6330
+5033
+3496
+6263
+7934
+8236
+3702
+
+1453
+2526
+5851
+2084
+3092
+6085
+6055
+3543
+2803
+1552
+1021
+5182
+4564
+3912
+3854
+
+1003
+6113
+5847
+1479
+3534
+1497
+2047
+6062
+3713
+3888
+1847
+1798
+3207
+2560
+3212
+
+4904
+7090
+2494
+8864
+1494
+3313
+1009
+7531
+4235
+
+3024
+7888
+3711
+7637
+4804
+10269
+4739
+3124
+
+10068
+9428
+5562
+2721
+
+6320
+6421
+2922
+3893
+3632
+5560
+3579
+5181
+1927
+3860
+1432
+4818
+2868
+2184
+
+11927
+4764
+7755
+10159
+6954
+9559
+
+8985
+5396
+
+5821
+15081
+12926
+16298
+11228
+
+2555
+4710
+5259
+5744
+2489
+2068
+1502
+4496
+3785
+3377
+2321
+3902
+
+10993
+10833
+24463
+
+4011
+1089
+2087
+5185
+3488
+3736
+4926
+4891
+3448
+3271
+4634
+3751
+5303
+1994
+
+5919
+3347
+4708
+1965
+5606
+6273
+2042
+1773
+3026
+4585
+2239
+2520
+4567
+4964
+
+11355
+11798
+7831
+7480
+8790
+6294
+11922
+
+3780
+4205
+2006
+4419
+4193
+2482
+4835
+4758
+3600
+1117
+3185
+1808
+1233
+4082
+3326
+
+43241
+
+5617
+1489
+5975
+5619
+2877
+1722
+4756
+5164
+3192
+2945
+5610
+6021
+4883
+2218
+
+1579
+3888
+8895
+3815
+11782
+7598
+
+2480
+2152
+7361
+6604
+3773
+1116
+4720
+6142
+6743
+7900
+1503
+
+8257
+6224
+5073
+5153
+6286
+5930
+2198
+7322
+1244
+3028
+
+9040
+9861
+11717
+
+1692
+2885
+9293
+6439
+6822
+4663
+
+11327
+6426
+4039
+9769
+3730
+6972
+6462
+
+6202
+2857
+3687
+4333
+3206
+5999
+3844
+4236
+3496
+7349
+1637
+5892
+
+21290
+13265
+16574
+
+1501
+8323
+2174
+7603
+1417
+5507
+3152
+8574
+6952
+6893
+
+2057
+5770
+6945
+5910
+2066
+2373
+6613
+6703
+5795
+7033
+6063
+3443
+
+10064
+12696
+1625
+1604
+8552
+
+4518
+3559
+4612
+4990
+6122
+1829
+8607
+2051
+6314
+2596
+
+1898
+8330
+6823
+14127
+4122
+
+2494
+6727
+4587
+2321
+4617
+4813
+7347
+3794
+1446
+5291
+4913
+
+15290
+9852
+5973
+7334
+
+5995
+4539
+8371
+9076
+12656
+12625
+
+2198
+1139
+4259
+3010
+9045
+2929
+8392
+4307
+5738
+
+12958
+5954
+
+2276
+6600
+5912
+1305
+6350
+5827
+2640
+6856
+7562
+7882
+3944
+
+7186
+4975
+9015
+12599
+13902
+
+55492
+
+4832
+5290
+2044
+1011
+4110
+1236
+4706
+5218
+1300
+3238
+1836
+1309
+4742
+3964
+4682
+
+5611
+3648
+8179
+9855
+2938
+8541
+9237
+
+6779
+7885
+7768
+7979
+1604
+2719
+3879
+2771
+1197
+
+2775
+12978
+7208
+
+19188
+16982
+8339
+
+12742
+18586
+18256
+
+15946
+28794
+
+5010
+1439
+1176
+5112
+6225
+11059
+1380
+
+2636
+5109
+7016
+4966
+7277
+1646
+1209
+4458
+4147
+3169
+
+18833
+18515
+8638
+6254
+
+7158
+2439
+12116
+2417
+6262
+9579
+6050
+
+7881
+8103
+6525
+5610
+4287
+7642
+2084
+8453
+1724
+
+3535
+10683
+10350
+11645
+11293
+7447
+6324
+
+17973
+11656
+19267
+18227
+
+5568
+3346
+5735
+5136
+5528
+5605
+3106
+4635
+2530
+3111
+2916
+1510
+2617
+
+6132
+1462
+2779
+4977
+1771
+8308
+2896
+6441
+3027
+1452
+
+50057
+
+1733
+4620
+5879
+3456
+3043
+1039
+5811
+3572
+1371
+4420
+5788
+1722
+1173
+5371
+
+4890
+4902
+5587
+5794
+4689
+6264
+3451
+6440
+5713
+4760
+4073
+6571
+5257
+
+2882
+1784
+4373
+4672
+3418
+5014
+3662
+1249
+5828
+5153
+5729
+3709
+5709
+3007
+
+13324
+9643
+14954
+14195
+
+4739
+5997
+2183
+3111
+6721
+8025
+1373
+4982
+2199
+6187
+
+6561
+6690
+9276
+7602
+7353
+7961
+1247
+6694
+6641
+
+6626
+5971
+6702
+1726
+3909
+2262
+6701
+4754
+4256
+5897
+3946
+1457
+4469
\ No newline at end of file
diff --git a/2022/go/day02/day02.go b/2022/go/day02/day02.go
new file mode 100644 (file)
index 0000000..3a50b8c
--- /dev/null
@@ -0,0 +1,89 @@
+package day02
+
+import (
+       "strings"
+)
+
+func Part1(input string) int {
+       var sum int = 0
+
+       values := map[string]int{
+               "Rock":     1,
+               "Paper":    2,
+               "Scissors": 3,
+       }
+
+       translateMap := map[string]string{
+               "X": "Rock",
+               "Y": "Paper",
+               "Z": "Scissors",
+               "A": "Rock",
+               "B": "Paper",
+               "C": "Scissors",
+       }
+
+       winOn := map[string]string{
+               "Rock":     "Scissors",
+               "Paper":    "Rock",
+               "Scissors": "Paper",
+       }
+
+       lines := strings.Split(input, "\n")
+       for _, line := range lines {
+               objects := strings.Split(line, " ")
+               opponent := translateMap[objects[0]]
+               player := translateMap[objects[1]]
+               sum = sum + values[player]
+               if player == opponent {
+                       sum = sum + 3
+               } else if winOn[player] == opponent {
+                       sum = sum + 6
+               }
+       }
+       return sum
+}
+
+func Part2(input string) int {
+       var sum int = 0
+
+       values := map[string]int{
+               "Rock":     1,
+               "Paper":    2,
+               "Scissors": 3,
+       }
+
+       translateMap := map[string]string{
+               "X": "Lose",
+               "Y": "Draw",
+               "Z": "Win",
+               "A": "Rock",
+               "B": "Paper",
+               "C": "Scissors",
+       }
+
+       winOn := map[string]string{
+               "Rock":     "Paper",
+               "Paper":    "Scissors",
+               "Scissors": "Rock",
+       }
+
+       loseOn := map[string]string{
+               "Rock":     "Scissors",
+               "Paper":    "Rock",
+               "Scissors": "Paper",
+       }
+
+       lines := strings.Split(input, "\n")
+       for _, line := range lines {
+               objects := strings.Split(line, " ")
+               opponent := translateMap[objects[0]]
+               result := translateMap[objects[1]]
+               if result == "Draw" {
+                       sum = sum + 3 + values[opponent]
+               } else if result == "Win" {
+                       sum = sum + 6 + values[winOn[opponent]]
+               } else {
+                       sum = sum + values[loseOn[opponent]]
+               }
+       }
+       return sum}
\ No newline at end of file
diff --git a/2022/go/day02/day02_test.go b/2022/go/day02/day02_test.go
new file mode 100644 (file)
index 0000000..cdb55db
--- /dev/null
@@ -0,0 +1,23 @@
+package day02
+
+import (
+       "testing"
+
+       "github.com/stretchr/testify/require"
+)
+
+func TestPart1(t *testing.T) {
+       r := Part1(
+`A Y
+B X
+C Z`)
+       require.Equal(t, 15, r)
+}
+
+func TestPart2(t *testing.T) {
+               r := Part2(
+`A Y
+B X
+C Z`)
+       require.Equal(t, 12, r)
+}
diff --git a/2022/go/day02/input.txt b/2022/go/day02/input.txt
new file mode 100644 (file)
index 0000000..dc4057d
--- /dev/null
@@ -0,0 +1,2500 @@
+A Y
+B X
+C X
+A Z
+B Y
+C X
+C X
+C X
+C X
+C X
+A Z
+B Y
+C X
+A Z
+A Z
+B Y
+A Z
+B X
+C Z
+C X
+C X
+B Y
+C X
+A X
+B Y
+B Z
+A Z
+B Y
+C X
+C X
+C X
+A Z
+B Y
+C X
+A Z
+C X
+B Y
+C X
+C X
+B Y
+A Z
+A Z
+C X
+C X
+A Y
+B X
+C X
+B X
+C X
+C X
+A Z
+C Z
+C X
+A Y
+B Y
+B Y
+B X
+C X
+C X
+C X
+A Y
+A Z
+C X
+A Z
+C X
+B Y
+C X
+C X
+C X
+C X
+A Z
+C X
+A Z
+C X
+C X
+B Y
+C X
+B Y
+A X
+A Y
+C Y
+A Z
+C X
+C X
+A X
+A Z
+A X
+C X
+C X
+A X
+C X
+B Y
+A Z
+A Y
+A Z
+B X
+C X
+B X
+C X
+C X
+A Z
+C X
+C Z
+C X
+C X
+C X
+C X
+C X
+A Z
+A X
+C X
+A Z
+C X
+C X
+A Z
+C X
+A Z
+A Y
+C X
+C X
+A Z
+A Z
+C X
+C X
+A Z
+A Z
+C Z
+C X
+A Z
+A Z
+C X
+B Y
+C X
+C X
+A Y
+A Z
+A Z
+A Z
+A Y
+B Y
+A Z
+C X
+A Y
+A Z
+A Y
+A Z
+C X
+C X
+C X
+B X
+B Y
+A Z
+A Z
+A Z
+C X
+A Z
+A X
+B X
+C X
+C X
+C X
+A Z
+A Z
+A Z
+C X
+C X
+A X
+A Z
+C Y
+A Z
+C X
+C X
+C Z
+C X
+A Z
+A X
+C Y
+A X
+C X
+C X
+C X
+A X
+A X
+C X
+A Z
+A Z
+A Z
+A Z
+A Z
+A Y
+C X
+A Z
+A Z
+A Z
+B Y
+C X
+C X
+A X
+B X
+A Z
+C X
+A Z
+C X
+A Z
+C X
+A Z
+A Y
+C X
+C X
+C X
+A Y
+C X
+C Y
+C Z
+C X
+C X
+B Y
+C X
+A Z
+C Z
+A Z
+C X
+A Y
+B Y
+C X
+C X
+C X
+B X
+A Z
+C X
+C X
+C X
+B X
+A Z
+A Z
+C X
+C X
+C X
+A Z
+A X
+B Y
+C Y
+C X
+A Z
+A Z
+A Z
+B Y
+B X
+C X
+A Z
+A Y
+B Z
+C X
+C X
+A Z
+A X
+C X
+A Z
+B Y
+A Z
+C Z
+B X
+A Z
+C X
+C X
+C X
+A Y
+C X
+C X
+A Z
+A X
+C Z
+A Y
+C X
+C X
+A Y
+A X
+B Y
+C X
+C X
+C X
+A Z
+A X
+C X
+A X
+A X
+C X
+C X
+A Z
+C X
+A Z
+A X
+A Z
+C X
+B Y
+A Z
+C X
+A Z
+A X
+B X
+C X
+B Y
+A Y
+A Y
+C Z
+B Z
+C X
+C X
+C X
+A Z
+C Z
+A Y
+C X
+A Y
+C Z
+A Y
+B Y
+C X
+C X
+A Z
+B Y
+C X
+A Z
+C X
+C X
+A Z
+B Y
+C X
+B Y
+C X
+B Y
+A Y
+C X
+A X
+A X
+B X
+C X
+A Z
+C X
+B Y
+A Y
+C X
+B Y
+B X
+C X
+C X
+A Z
+B X
+A X
+C X
+C X
+B Y
+C Z
+B X
+C X
+A Z
+A Z
+A X
+C X
+A Z
+C X
+A Z
+C X
+A Z
+C X
+A Z
+A Y
+A Y
+C Z
+C X
+A X
+C X
+A Z
+C X
+B X
+A Z
+A Y
+A Z
+C X
+A Z
+C X
+B Y
+A X
+C X
+A Y
+C X
+C X
+C X
+A Z
+A Y
+C X
+A X
+C X
+A Z
+C X
+C X
+A Y
+C X
+C X
+C X
+A Z
+A Z
+C X
+A Z
+B X
+A Z
+C X
+B Y
+B X
+C X
+B Y
+A Z
+A X
+C X
+A Y
+A X
+A Z
+B Y
+A X
+C X
+C X
+C X
+C X
+A Z
+C X
+C X
+A X
+A Z
+A Z
+B Y
+A Z
+A X
+A Z
+C X
+B X
+A Y
+A X
+A Y
+C X
+A Z
+C X
+A Z
+B X
+A Y
+C X
+C X
+A Z
+A Z
+C X
+C Y
+A Z
+A Z
+A Z
+A Y
+C X
+C X
+A Z
+A Z
+A Z
+B Y
+C X
+A Z
+C X
+A Y
+A Z
+A Z
+A Z
+C X
+A X
+A Z
+A Z
+B Y
+B X
+A Z
+A X
+C X
+C X
+A Z
+A Z
+C X
+A X
+A Z
+C X
+A X
+C X
+A Z
+A Y
+C X
+B Y
+B Y
+C X
+C X
+C X
+C X
+C X
+A X
+A X
+A Y
+A Z
+A X
+C X
+A X
+A Z
+B Y
+A X
+A X
+C X
+A Z
+C X
+C X
+C X
+A Z
+A X
+A X
+C X
+C X
+C X
+C X
+C X
+C X
+A Z
+C X
+C X
+C Z
+C X
+A Z
+A Z
+C X
+C X
+A Z
+A Z
+C X
+A Z
+A Z
+A Z
+A Z
+C X
+A X
+C X
+B Y
+C X
+A X
+A X
+A Y
+C X
+A Y
+A Z
+C X
+C X
+C Z
+C X
+C X
+C X
+B X
+C X
+C X
+C X
+A Y
+C X
+C X
+A Z
+C X
+A Y
+C X
+C Z
+C X
+C X
+B X
+A Z
+C X
+C X
+C X
+C X
+C X
+B X
+A Z
+C X
+A Z
+B X
+B Y
+B Y
+C X
+C X
+C Y
+A Z
+C X
+C X
+A X
+A X
+A X
+A X
+C X
+C X
+C X
+C X
+A Z
+C X
+A Z
+A X
+C X
+C X
+B Y
+B Y
+A Z
+C X
+A X
+A Z
+A Z
+B Y
+C X
+C X
+A Z
+C X
+A Z
+C X
+B X
+C X
+A Y
+C X
+C X
+A X
+B Y
+B Y
+C Z
+C X
+C X
+B Y
+A X
+C X
+C X
+A X
+A Z
+C X
+C X
+A Z
+B Y
+A Z
+C X
+C X
+A X
+A X
+C X
+C Z
+C X
+A Z
+B X
+C X
+B Y
+A Y
+B X
+A Z
+A Z
+A X
+A Z
+A Y
+A Z
+A X
+A Z
+C X
+C X
+A Z
+B Y
+A Z
+B X
+B Y
+A Z
+C X
+C Y
+A Z
+C X
+C X
+A X
+A Z
+A X
+C X
+C X
+A Z
+C X
+C X
+C X
+C X
+A X
+B X
+A Z
+A Z
+C X
+A X
+A X
+C X
+C X
+A Z
+A Z
+C X
+C X
+A X
+A Z
+C X
+A X
+A Z
+A Z
+C X
+A Z
+A Z
+C X
+C X
+A Z
+C X
+C X
+A Z
+C X
+C X
+A Z
+A X
+C X
+C X
+A Z
+A Z
+C X
+C X
+C X
+A Y
+C X
+C X
+B Y
+C X
+C X
+C X
+C X
+A Z
+A Z
+A X
+C X
+A X
+C X
+A Z
+B X
+A Z
+C X
+C X
+A Z
+A Y
+C X
+C X
+A Z
+C X
+B X
+B X
+B Y
+A Y
+A Y
+A Z
+A Z
+A Z
+C X
+C X
+A Z
+C X
+B Y
+C X
+B Z
+A Z
+C X
+A Z
+C X
+C X
+C X
+C X
+A Z
+B X
+A Y
+C X
+A X
+A Z
+B Y
+A X
+C X
+C X
+C X
+C X
+C X
+A Z
+A X
+A Z
+A X
+A Z
+A Z
+C X
+A X
+C X
+B X
+C Z
+A X
+B X
+A Y
+C X
+A Z
+A Z
+B X
+B Y
+B Y
+C X
+A Z
+A X
+C X
+C X
+B Z
+B X
+B Y
+A Z
+B Y
+A Z
+C X
+A Z
+A X
+A Z
+C X
+C X
+C X
+A X
+C X
+A Z
+C X
+C X
+C Y
+B X
+C X
+A X
+C X
+A X
+A Z
+C Z
+A Z
+C X
+A Y
+C X
+C X
+B Y
+C X
+C X
+A Z
+C X
+C X
+C X
+A Z
+C Y
+C X
+A X
+A Z
+A X
+C X
+A Z
+A Z
+B Y
+B X
+A Z
+C X
+A Z
+C X
+A X
+C X
+C Y
+A Z
+A Y
+C Z
+C X
+C Z
+A Z
+A Z
+C X
+C X
+A Y
+A X
+B Y
+C X
+A Y
+C X
+A Y
+C X
+A Z
+B X
+A Y
+C X
+B X
+A Z
+C X
+A Z
+A Z
+A Y
+A Z
+A X
+B Y
+C X
+C X
+C X
+A Z
+A X
+C X
+A Y
+A Y
+C X
+A Z
+C X
+C Y
+C X
+C X
+A X
+A Z
+A X
+A X
+C X
+A X
+A Z
+C X
+A Y
+A Y
+C X
+B Y
+A Y
+C X
+A Z
+A Z
+A X
+C X
+A Y
+C X
+C X
+C X
+C X
+A Y
+A Z
+B Y
+A X
+A Y
+C X
+C X
+C X
+B X
+A Z
+C X
+C X
+B X
+A Z
+A X
+C X
+A X
+C X
+B Y
+A Z
+C X
+C X
+B X
+A Z
+A Z
+A Z
+C X
+C X
+C X
+C Y
+C X
+C X
+A Z
+C X
+A Z
+C X
+C X
+B X
+A X
+A Z
+C X
+B Z
+C X
+C X
+A X
+A Y
+C X
+A Z
+A Z
+C X
+C X
+C X
+C X
+C X
+C X
+B Y
+A Z
+C X
+A X
+A Z
+A Z
+C X
+C X
+C X
+A Z
+C X
+B Y
+A Z
+A Z
+C X
+C X
+C X
+C X
+A Z
+C X
+A Z
+A Y
+A X
+C X
+A Z
+C X
+C X
+A Z
+A Z
+A X
+A Z
+C X
+A Z
+A X
+A Z
+C X
+C X
+C Z
+A X
+C X
+C X
+A X
+A X
+C X
+A Z
+A Z
+A Z
+C X
+C X
+A Z
+B Z
+A Z
+A Z
+C X
+A Z
+C X
+A Z
+B X
+C X
+A Z
+B Y
+B Y
+C X
+A X
+A Z
+C X
+C X
+A Z
+C Y
+B Y
+A Z
+C X
+C X
+A Z
+A Z
+C Z
+A Z
+C X
+C X
+A Y
+C X
+A Y
+B X
+C Z
+C X
+A Y
+C X
+B Y
+C X
+C X
+C Z
+A Z
+A Z
+C X
+C X
+A Z
+B Z
+C X
+A Z
+C X
+A Z
+C X
+C X
+C Y
+C X
+B Y
+A X
+A Z
+C X
+B Y
+A Z
+B Y
+C X
+C Y
+C Z
+A X
+A Z
+A X
+C X
+C X
+A Z
+A Z
+C X
+C X
+C X
+C X
+B Y
+B Y
+A Y
+C X
+C X
+C X
+A X
+C X
+B Y
+A Z
+B Y
+C X
+C X
+B Y
+C X
+B Y
+C X
+C X
+C X
+A Z
+A Z
+C X
+C X
+B Z
+A X
+C X
+C X
+A Z
+C X
+C X
+C X
+C X
+A Z
+C X
+A Y
+A Z
+C X
+A Z
+A Y
+C X
+A X
+C Y
+A Y
+A Y
+C X
+C X
+A X
+A Y
+C X
+B Y
+A Z
+B Y
+C X
+B X
+C X
+C X
+C X
+B Z
+A Y
+C X
+B Y
+C X
+A X
+C X
+C X
+B X
+A Z
+C X
+A Z
+C X
+C X
+C X
+C X
+C X
+C X
+A X
+A Z
+A Z
+C X
+C X
+C Z
+B X
+C Z
+C X
+B X
+C X
+A Z
+B Y
+A Z
+C Z
+C X
+B X
+A X
+A Z
+C X
+C X
+A Z
+A Z
+A Z
+A X
+C X
+C X
+A Y
+A Z
+C X
+A Z
+B Y
+C X
+C Z
+A Z
+C X
+C X
+C X
+A X
+A Z
+A Z
+C X
+A Y
+A Y
+C X
+C X
+C X
+C X
+C X
+A Z
+C X
+B X
+C X
+B X
+B Y
+A Z
+C X
+B Y
+A Y
+C Z
+A Z
+A X
+C X
+A Z
+C X
+A Z
+C Z
+C X
+C X
+A Z
+C X
+C X
+C X
+B Y
+A Z
+B X
+A Z
+A Z
+B X
+A X
+A Z
+C X
+C X
+A Y
+C X
+A Z
+B Y
+C Y
+A Z
+C Y
+C X
+A Z
+C X
+C X
+A X
+C X
+A X
+A Z
+B Y
+B Y
+C X
+B Y
+C Z
+C X
+C X
+B Y
+A Z
+C X
+C X
+C X
+C X
+C X
+A X
+A Z
+B Y
+A Y
+C X
+C X
+C Z
+C X
+A X
+C X
+A Z
+B Y
+A Z
+B X
+C X
+C X
+A Z
+C X
+A Y
+A Y
+C X
+B X
+C X
+B X
+A Y
+A Z
+A Z
+C X
+A Z
+A X
+A Z
+C X
+C X
+C X
+A Z
+B X
+B X
+A Z
+C X
+B Y
+C X
+C X
+A Z
+A X
+C X
+B Y
+C X
+C X
+C X
+A X
+A X
+B Y
+A Y
+A X
+C X
+A Z
+B X
+A Z
+B Y
+C X
+B Y
+A Y
+C X
+C X
+C X
+A Y
+A Z
+A Z
+A X
+A Z
+A X
+C X
+A Z
+A Y
+A Z
+A Z
+A Z
+A X
+A Z
+A Z
+C X
+C X
+C X
+A Z
+C X
+C X
+B Y
+C X
+C X
+C X
+C Y
+A Z
+A Z
+A Z
+C X
+A Z
+B X
+A X
+A Z
+A Y
+C X
+A Z
+C X
+A Z
+A Y
+B Y
+C X
+A X
+A Z
+A Z
+C Y
+A X
+B Y
+B Y
+C X
+A Z
+A Z
+A Z
+A Z
+A Z
+A Z
+A Z
+C X
+C X
+B Y
+C X
+C X
+A Y
+C X
+A Z
+C X
+A X
+C X
+A X
+C X
+C X
+B X
+C X
+B X
+C X
+C X
+A Y
+A X
+A Z
+C X
+A X
+A Y
+A Z
+C X
+C X
+C X
+B Y
+A Z
+A Y
+A Z
+C X
+A Y
+B X
+C X
+A X
+A Y
+A Y
+A Z
+A Z
+A Z
+C X
+A Z
+A X
+A Z
+C X
+B X
+A Z
+C X
+C X
+A X
+A Z
+A Z
+B Y
+A Z
+A X
+A Z
+A Z
+A Z
+A X
+B Y
+A X
+A Z
+C X
+B X
+A Z
+A Z
+A Y
+B Y
+A Y
+B Y
+C X
+C X
+A Z
+B Y
+A Z
+A X
+A Z
+A Z
+C X
+C X
+A Z
+A X
+C X
+B Y
+C X
+C X
+C X
+C Z
+A Y
+C X
+A Y
+A Y
+A Y
+A Z
+A X
+A Z
+A X
+A Z
+B Y
+C X
+A Z
+A Y
+C X
+B Y
+A Z
+B Y
+C X
+B X
+B Y
+C X
+A Z
+B X
+C X
+B Y
+B Y
+C X
+C X
+A Z
+B X
+A X
+A Z
+C X
+A Z
+C X
+C X
+A Z
+B X
+A Z
+C Y
+C X
+A Z
+A X
+B Y
+B Y
+C Y
+B Y
+A Y
+C X
+A X
+C X
+C X
+C X
+A Y
+A Z
+B Y
+A Z
+A Y
+C X
+A Y
+A Y
+A Y
+C X
+B X
+B X
+C X
+B X
+C X
+C X
+A X
+A X
+A X
+C X
+C X
+C Y
+A Y
+A Z
+C X
+B Y
+C X
+A X
+C X
+A Z
+C X
+C X
+C X
+B X
+C X
+C Z
+A Z
+C Y
+B Y
+A Y
+A Z
+A Z
+A X
+A Y
+C X
+C Y
+C X
+C X
+A X
+A Y
+A Z
+C X
+B X
+B Y
+B Y
+C X
+C X
+C X
+C X
+A Z
+C X
+C X
+B Y
+C X
+C X
+A Z
+A Z
+A Z
+A X
+A Y
+A Z
+C Z
+A Z
+C X
+C X
+B Y
+A X
+C X
+A Z
+C X
+A X
+C X
+A Z
+C X
+C X
+A Z
+A X
+C X
+C X
+C X
+A Y
+C X
+C X
+A Z
+C X
+A Z
+C X
+A Z
+C X
+C X
+C X
+C X
+A Z
+C X
+A Z
+C X
+A Z
+A Z
+B Z
+A Z
+A Y
+C X
+B X
+C X
+C X
+C Z
+C X
+C X
+C X
+A X
+A Z
+A Z
+A Z
+C X
+C X
+C X
+A Z
+B Y
+C X
+C X
+C X
+A Z
+C X
+A Y
+C X
+B Y
+A Z
+C X
+B X
+C X
+A X
+C X
+C X
+C X
+A Z
+A Z
+A Z
+B Z
+C X
+A Z
+A X
+C X
+B X
+A X
+A Y
+B Y
+B Y
+A Z
+C X
+C X
+C X
+C X
+A Z
+A Z
+C X
+A X
+B Y
+B Y
+A Z
+A Z
+C X
+C X
+A Z
+A Y
+C X
+A Y
+A Z
+A Y
+C X
+A Z
+C X
+A Z
+B Y
+A X
+A Z
+C X
+A X
+C X
+A Z
+C X
+C X
+A Z
+B X
+B X
+A Z
+C X
+A Y
+A Z
+C X
+A X
+A X
+A Z
+A Y
+C X
+A Z
+B Z
+C X
+A Z
+C X
+A Z
+A Z
+C X
+A Z
+B X
+A Z
+C X
+A Z
+A Z
+C X
+C X
+A X
+A Z
+A Z
+C X
+A Z
+C X
+A Z
+C X
+A X
+A Z
+A Z
+C Z
+C X
+C X
+B Y
+B Y
+C X
+C X
+C X
+B X
+A X
+C X
+A X
+B Y
+C X
+B Y
+A Z
+A Z
+A Y
+A Z
+B X
+A X
+C X
+B Y
+C X
+A Z
+C X
+C X
+A Z
+A X
+C X
+C X
+A Z
+B Y
+C X
+A Z
+B Y
+A Z
+A Z
+A X
+C X
+A Z
+C X
+B Y
+C X
+C X
+C X
+A X
+B Y
+C X
+A X
+C X
+A Z
+C X
+C X
+B X
+B X
+C X
+C X
+A Z
+B X
+C X
+A X
+C X
+B Y
+A Y
+C Z
+C X
+A Z
+C Z
+B Y
+B Y
+A Z
+C Z
+C X
+C X
+C X
+A X
+C X
+A Z
+B X
+A Z
+B Y
+A Z
+B X
+A X
+A Z
+A Z
+C X
+B X
+C X
+A Z
+B Y
+A Z
+C X
+A Z
+A Z
+A X
+A Z
+A X
+A X
+C X
+B X
+C X
+C X
+B Y
+C X
+C X
+A X
+C X
+C X
+C X
+C X
+C X
+A Z
+C X
+C X
+A Z
+A Z
+B Y
+C X
+C Z
+C X
+B Y
+C X
+C X
+C X
+A Z
+A Y
+A X
+C X
+C X
+B Y
+C Z
+C X
+A Y
+B Y
+C X
+C X
+A Z
+A Z
+C X
+C X
+C X
+B X
+C X
+C X
+C X
+C X
+B Y
+A X
+C X
+C X
+A Z
+C X
+C X
+C X
+A Z
+C X
+C X
+B Y
+C X
+A Y
+C X
+A Z
+A Z
+B Y
+C X
+C Y
+A Y
+C X
+B Y
+A Z
+B X
+C X
+C X
+A X
+C X
+C X
+C X
+C X
+A X
+A X
+A Z
+C X
+B Z
+C X
+A Y
+A Z
+A Z
+C X
+C X
+C X
+A Z
+A Z
+A X
+A Z
+A Z
+A Z
+A Y
+A X
+A Z
+C X
+B Y
+C X
+A Z
+C X
+C Z
+B X
+C X
+C X
+A Z
+A X
+B X
+C X
+A Z
+A Z
+A Z
+C Z
+C X
+B Y
+C X
+C X
+C X
+A Z
+B Y
+C X
+C X
+C X
+C X
+C X
+C X
+A X
+C Z
+B Y
+A X
+A X
+B X
+C X
+C X
+C X
+A Z
+A Z
+B X
+C X
+C X
+A Z
+C X
+A Z
+C X
+C X
+C X
+C X
+A Z
+C Y
+C X
+C X
+A Z
+A Z
+A Z
+A Y
+A X
+A X
+C X
+A Z
+B X
+A Z
+C X
+B X
+C X
+A Y
+A X
+C X
+C X
+C X
+B X
+B X
+C X
+A Z
+A Z
+C X
+C X
+A Z
+B X
+A Z
+A Y
+A X
+A Y
+C X
+A Z
+B Y
+C X
+A Z
+C X
+C X
+A Z
+A Z
+A Y
+B X
+A Z
+C X
+A X
+A Z
+A Z
+A Z
+A X
+C X
+A Z
+A Z
+B X
+A Y
+C X
+C X
+C X
+C X
+B X
+B Y
+C X
+A Z
+C X
+B Y
+B Y
+C X
+B X
+A Z
+C X
+C X
+A Z
+B Y
+C X
+A Z
+C X
+C X
+A Z
+C X
+A Z
+A X
+C X
+C X
+A X
+A Z
+C X
+A X
+C X
+C X
+A X
+C X
+A X
+A Y
+A Z
+A Y
+A Z
+C X
+A Z
+A Z
+B Z
+A Y
+A Z
+C X
+A Z
+C X
+A X
+C X
+C Y
+C X
+C X
+C X
+A Z
+B X
+C X
+C X
+A Z
+A Z
+C Z
+C X
+A X
+A Y
+B Y
+A Z
+A X
+B X
+C X
+C X
+C X
+A Y
+C X
+A Z
+C X
+C X
+A Z
+A X
+C X
+C Z
+C X
+C X
+C X
+A Z
+A Y
+C X
+C X
+A Z
+C X
+C Y
+C X
+C X
+A Z
+A X
+C X
+B X
+A Z
+A Z
+C X
+A Z
+A Z
+C X
+A Y
+C Y
+A Z
+A Z
+B X
+C X
+A Z
+A Z
+C X
+C X
+C X
+B Y
+A Z
+B Y
+C X
+B X
+A X
+C X
+A Z
+A Y
+C X
+A Z
+C Z
+A X
+C X
+A Z
+C X
+C X
+A Z
+C X
+A Y
+C X
+C X
+A Y
+C X
+B X
+C X
+C X
+B Y
+A X
+C X
+A Y
+B Y
+C X
+A X
+A Z
+C Z
+A X
+C X
+C X
+B X
+A Z
+B Z
+A Z
+A X
+A Y
+C X
+A X
+B X
+C X
+C X
+C X
+C X
+A Z
+C X
+A Z
+A Z
+C X
+B X
+C X
+A Y
+A Z
+A X
+A X
+C X
+A Y
+C X
+C X
+A Y
+C X
+B X
+A Z
+C X
+A Z
+B X
+A Z
+B Y
+C X
+C X
+C X
+A Z
+C X
+C X
+A X
+C X
+A Z
+C X
+C X
+A Z
+C X
+A X
+B Y
+A Y
+C X
+C X
+C X
+A X
+C X
+A Z
+C X
+A X
+C X
+C X
+A Y
+C X
+C X
+C X
+C X
+A Z
+C X
+C X
+A Y
+A Z
+C X
+C X
+C X
+A Z
+A Z
+C Z
+A Y
+C X
+C X
+B Z
+B Y
+B Y
+B Y
+C Z
+B Y
+A Z
+B X
+C X
+A Z
+A Y
+C X
+B Y
+C X
+A X
+B X
+A Z
+A Z
+C X
+C Y
+A Z
+B Y
+A Z
+A Z
+C X
+C X
+B Y
+C X
+A Z
+C Z
+A X
+C X
+C X
+C X
+A Z
+C X
+B X
+B Y
+C X
+A Z
+A Z
+C X
+A Z
+C Z
+C X
+B X
+A X
+B Z
+A Z
+C X
+A X
+C X
+C X
+C X
+C X
+A Z
+C X
+C X
+C X
+C X
+A Z
+A Z
+C X
+C X
+A X
+A Z
+C X
+A X
+C X
+C Y
+C X
+A Z
+B X
+A Y
+A Z
+C Y
+A Z
+C X
+A Y
+C X
+A X
+C X
+A X
+C X
+A Z
+C X
+A X
+A Z
+A X
+A Y
+C Z
+C X
+A X
+A Z
+A Z
+A Z
+A Z
+C X
+C X
+C Z
+A X
+A Z
+B Y
+A Z
+A Z
+B X
+B Y
+A X
+A Y
+A Z
+C X
+A Z
+C X
+A Z
+B X
+B X
+C X
+C X
+C X
+A X
+C X
+A Z
+B X
+A Y
+B X
+C X
+A X
+C X
+A X
+A Z
+A Z
+A Z
+C X
+B Y
+C X
+B Y
+C X
+A Z
+A Z
+A Z
+C X
+C X
+B Y
+A Y
+C Y
+A Z
+C X
+C X
+A Z
+C X
+A Z
+C Z
+B X
+C X
+C X
+A Z
+B Y
+A Y
+C X
+A X
\ No newline at end of file
diff --git a/2022/go/day03/day03.go b/2022/go/day03/day03.go
new file mode 100644 (file)
index 0000000..6078cd4
--- /dev/null
@@ -0,0 +1,54 @@
+package day03
+
+import (
+       "strings"
+//     "fmt"
+
+       mapset "github.com/deckarep/golang-set/v2"
+
+)
+
+func Part1(input string) int {
+       var sum int = 0
+       lines := strings.Split(input, "\n")
+       for _, line := range lines {
+               c1 := []rune(line[:len(line)/2])
+               c1set := mapset.NewSet[rune](c1...)
+
+               c2 := []rune(line[len(line)/2:])
+               c2set := mapset.NewSet[rune](c2...)
+               for _, v := range c1set.Intersect(c2set).ToSlice() {
+                       sum += getValue(v)
+               }
+       }
+       return sum
+}
+
+func getValue(v rune) int {
+       if v >= 'a' && v <= 'z' {
+               return int(v) - int('a') + 1
+       }
+       if v >= 'A' && v <= 'Z' {
+               return int(v) - int('A') + 27
+       }
+       return 0        
+}
+
+func Part2(input string) int {
+       var sum int = 0
+       var idx int = 0
+       lines := strings.Split(input, "\n")
+       for idx=0; idx < len(lines); idx += 3 {
+               c1 := []rune(lines[idx])
+               c1set := mapset.NewSet[rune](c1...)
+               c2 := []rune(lines[idx+1])
+               c2set := mapset.NewSet[rune](c2...)
+               c3 := []rune(lines[idx+2])
+               c3set := mapset.NewSet[rune](c3...)
+               for _, v := range c1set.Intersect(c2set).Intersect(c3set).ToSlice() {
+                       sum += getValue(v)
+               }
+
+       }
+       return sum
+}
diff --git a/2022/go/day03/day03_test.go b/2022/go/day03/day03_test.go
new file mode 100644 (file)
index 0000000..9093bb4
--- /dev/null
@@ -0,0 +1,29 @@
+package day03
+
+import (
+       "testing"
+
+       "github.com/stretchr/testify/require"
+)
+
+func TestPart1(t *testing.T) {
+       r := Part1(
+`vJrwpWtwJgWrhcsFMMfFFhFp
+jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
+PmmdzqPrVvPwwTWBwg
+wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
+ttgJtRGJQctTZtZT
+CrZsJsPPZsGzwwsLwLmpwMDw`)
+       require.Equal(t, 157, r)
+}
+
+func TestPart2(t *testing.T) {
+       r := Part2(
+`vJrwpWtwJgWrhcsFMMfFFhFp
+jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
+PmmdzqPrVvPwwTWBwg
+wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
+ttgJtRGJQctTZtZT
+CrZsJsPPZsGzwwsLwLmpwMDw`)
+       require.Equal(t, 70, r)
+}
diff --git a/2022/go/day03/input.txt b/2022/go/day03/input.txt
new file mode 100644 (file)
index 0000000..33c0e41
--- /dev/null
@@ -0,0 +1,300 @@
+hDsDDttbhsmshNNWMNWGbTNqZq
+VQfjnlFvnQFRdZWdVtqMGdWW
+zvvvRnFFfjjlRBlBPzgQgRvvmtrmhHcptLHCDhcHHmLsBmsB
+FrzFvvdTDcTnmTzdDTTzdvWmjhgVPrhSljSQSPwPjPjPjSVC
+sMsGbqGsbbRqRbBMBGRMbLpNSSpjhlQljHVClhjgPjjPhlVp
+sNbGtJbMfssNtvcnWFVmnvDd
+TNfmdFJmfdZMQffVRQVV
+jVHBCcDSjWrMZjvg
+SShSbCGpcBtBtwtVLJJddmtLmT
+CtpNftbNWbtSJDHqGZJFLfLr
+dPsHlsRBHcZdqDFDZwwJ
+snjVlvTPlPjVlQlHWjpSmzgNNzSmtpSm
+qhZtSVqCqThGcGzZnnfZcB
+WbddWbDwrBzcpzHpBb
+DBBMFWRJDrDFWLWljCqjQjFvtCsqTjqs
+vhFTzRzzTmPvbplWFtQttQQZtZhMZqcqSQ
+fJVCfDfJNCLDwJNGmssZgwqgZcmtgcms
+VmdVNLHGGVDBdfLCHnLGHnbWpTplWbddRTlzplWPpbFp
+smwtNVqRjNmZjZBDSvzSzl
+FnTJFcTTFccCrJGTLncdCCcPJZfBBDSlSJwZDlggSffvgSSf
+FWTFGLFWLCPWrCnFnQWNbQVVwphhmHHbptVsss
+BrrgrtgfBpPFhhgMWq
+ZGvsvDGClvsSRScpGBhPphWMPhhTNh
+SBSBdBZCcdwHrVQwQr
+qmFqdVtqsVdzqGbwMJwGPpmPHM
+ZjTjLQLLDrrLjcFhlfrGHppfbJwGpMMpGHwRCC
+BTlZjrBBBcLTcDrjBlThWBjBtWNqnSzSnsSdvsFggNnqVVnv
+zVvmjGgpcJnbTTTJHRHSRb
+NPFrFQfCLPrdRlbtQRRvBtHb
+frMLqPFMrfrPLCwqqNvjczwwnmwggGmssnmnnm
+HbFJhhshsffcvslmGmLFrQBrlFTG
+jNRPwwPjSPCdCdvRzRBTlRzmGrmB
+nCSWdNjCCPqvtttZnDscth
+ScSrRTPcSSDRWSptWcdmmWGbmGGLmLJvNJNbbJ
+flzHjFpZjFfjjgszjlqzJNnnvsmbMmGvJLNNbmJv
+jFZFVpffpVlqfQhgtTwcTVtrTcRBwBTD
+rHrdGSMSSbZbjShj
+qZfDBBvllvvWLtqbbQwhJjbtwbnQgN
+WzWlzZmLWBLZLzCzrHMVcRrMRFRCCccF
+BzdplppDlBBrqWnjFMBWqNWq
+whZhZSSHhhVSrvSgHPvgvjnFTPsFFnnNTcjTFnTTsc
+HLCwVSfZLffSHhLvwtQbJbrdGlRRrGdmpztG
+grDFfDlfCftCzCfNztclNFrBNQjbZjJjjPPVsjNvsbvPsj
+HwwTpGpRwMdpHWhvjzVsPJjJGVvVZs
+ShphRpwzMWdpHdwWHwMpnHwLDmmgcLCCDtLDCCSlcgcfCD
+ccqqLLqCqTSlZMLQMllZTvnNfjddttmmDpRJjvhfpfthRmdf
+rbVssWwggFrGsWzPbVFGJpftQRPDmQDpdPmdJmfR
+bBHWWHzWHWWHrsVbsFgwbFqqMLTnBclTMMSnLnqLqMQZ
+CcSPGCCPrdPtdjcsBLDghbVLhqDl
+vMJwTHzPvzVwqBBDblls
+QNvMFfRMJHPZHjnfWmdftSjSnp
+dnBCPhhBCrQfChdbNVGLszzDzVDsTbWT
+HgcJgpppPqqHwPwJSczVzDssNNVWTtqVVGts
+JHRFpjFccplcRwPJpHPScpMPQmCdBQQfQjjhCfBCrQQvdmnn
+rQGmVRLRbDRHmmZLGBGVLHBVFspSstWWWNJcsgpQTSsNppJS
+qlldhPdfCgnspJFWCFsFNT
+jMMzwndfhnwPfqPMjgjMVBrGBmrHDHLZbjRGHbHj
+wzpZfzHRSRfzgHfffZwwStCtSrBhBBCTrtFhhBFG
+QPjQQQDcDWJNFWtrtWrGmTCMtmBW
+lDvvDQcdjQcQLvlDwnpFgbbznZZglZsl
+RfMFTMFrVrSRFPlFSfVlHpLqgzpHBLzHBBVzVpHG
+CchbhcwdmdJmwJJtGgnqzppLmGGBQqQp
+hCsstCJwLvMRvsZsTR
+fQlfMlNClQhhZhrlWrWw
+njDbnTDTBtGjmrGvSh
+bgshBdBcDbTTdnnnTqcqLgqfpfQppCsCMsHHVVpHHNCHFF
+PbCnTbzJnqQNzbbTNDdpwcmjDmwjGQjccw
+hWgvSdLvwcGjSpSm
+vVfrFvvhHFTZndJq
+FFvRVCRqVRcfsDLrgqGNWjjHfhQQzGWjQHzN
+ppJPBwplwSBJTmPpTzWWStzHHjNNLNzHNh
+wnwMPbLJMJllJJwBmJmnLVvCvsCsbFgDrRrsCsvrqc
+jqHgVgdgGQttWCtNqNflmllgFnfDnmFFlpcl
+TZZsrrwwhwrsrZRGmhcfSnhGlmSFcf
+rsLvvbJPPLBGPCQqHWtMCMHN
+WzzBpCBpMsBpCvCfsgnPPfHgbfFNfF
+jtdTLLjGTGjDjLbbbGlDLLLmfFgmmfgrPrgmNPHSnnNnqFSq
+jbRRbjlwlRVpvWwvzBpB
+qpwzCzCznFznTcCvrcrvVcLb
+cPmNMHSlMsLfvWgsrWvL
+mMHGPDMBGSGPHlPBcBPzznnzpdQFBjqRFdwdnn
+QGZLJzmJrZgZzZhNQFqDWlWPWDFCWNRlPW
+hMMbhVbhHWCsPWCMRs
+BwjbSHVBVvfcTfZgZzQhrzdGrt
+cvPTjfDPpDmmBjbQjZMdlBZj
+CHNnghNChVzNgrFVwCMJLMMMMMQQdbLZ
+FNSzShrHhNnWgVnWfvfbpfpDGTfvsG
+FFpVrZhpTlSQlQzTtRtZHfmPmJDbRtZJ
+jNnwBLnWwBgNBNCwsNgsMsCLVfDWfmDJRffmRRtmfRmPDRtR
+BnLdNdjnBNcLngdCVBndgllFlQrrpQlSSFrQphFcQq
+JmVLJPMNjmVJpMLJSVmNQZZQZZrnTHqZQHTrTTMr
+ltfdwChhwRdRswDDdnBQqqWNTqrrHrqZRr
+dwdwwDwsGlhhDFtsCwhsJLcPmGPcGzSjSjjLzNPS
+QgSbgQCLQSJFMccLFLVVzH
+WBNffrBpBNdNRdWDfptBtdzWcMZZVPMVwHMmsVHFccHsDsVc
+ptphRWrfGRGRnqlCSQvhqbCzJS
+VvdMLMLMBMlVlVschsNpDGpdNsGc
+tqFSmnmnnttGfDqNcfvNDD
+nzRHnrwrrWRrrzHtbMlTMBjCvWLgBBMl
+pCBlRvzwzlCzvZqqDwzmvgtsLsQdgZsgPNtdrsWrst
+JbGjbGVGHSFbhbnhTShSTbQtQrPsLsHLQgNRtsgdQsLP
+GnnbJbGMGbSjjbSbCzqlwMRRDzqzMBBv
+TTVRJVMWMshSQtjSVTQJRQlcCBncJccdppnJcBBDngFpgP
+frvfzfHrwzZNrtNwzzzZncCCZFdFFCgBDpPcBcBg
+LwNGbqwvmvvtbNQjQlVVRWTGTQWM
+RnggwVLRLDfCVZhfpDGGMGMGcGzGNHvv
+jmmWBTSsBmFmSzctsqpccHvzpN
+SBSrTblSQPbQhNwwZfPVdZPf
+CCvCwzfNStLzfrbmMJbZMtlsbJMW
+gPPPBqDjBcPFpVgBRbnMsVsbJZnWsdbSbM
+qgDPHjHcPhpDRRpPBRpCGSLwvHQwGfzrHLGLTL
+CLGqDZZLTdddPsdJpq
+gbRbbnghnrWvgrdJdSTRSsVNJlld
+hMnwrjnnjggvnLDwGffTfwCZZZ
+NzJHbNHNNzJzgmHmzpQSvvLqbLsVVsVGvB
+WtWhtWDdrZldDWrWTlZgppVVsqQTVQBqsGqBsQVp
+jWjWRRRlPcHRwJgw
+CCnnFTmnPCMCRNfnwGwdfzvwwl
+VQQVShDSSshhDDtDLhjccGjLBBzBzlZflNZvwZzdwBzpSNNZ
+QLHhJDDhDhgscgtjbGHTrWbrTbRmbFrm
+CJbLvJvbwtFHqvLzwJqqqtHWTWRgDScDRSWQQjTRcWRDLT
+mssGsMNphZMNsPPBnhSjRgdnQRdWgdjgrcDn
+GGmBMMsffmslMGshZlMphGqCzHCbzlbvzqwzzgFJggCF
+WCgWBphpWLQZQpgdhGdwmfbfFRVRjRTbbSFttdbSbT
+qqrZnDNqZJDTVzRjVFbfSN
+rPMvqJJqrJMPJnZMZZgLPgLWLggWQghwhmBh
+CWGGzdHHmPPSmPsC
+LqwlZwRLrPMQlMqrlbZrQRsSNsmssSNSsNcBNpgmsJ
+lwLDQhrDMQqPGfhzGGjhGn
+ZqDlZssCqJJMvpdBpBBmBQSMRp
+wLgVcbgFLzTLTNNZmNNRdjdRmF
+HZHbctWTwgVWgsfrnnPqlnsWlD
+RSnwSPFcLnFPnRwjzctzbGNlZgNbbGdGpLhZdpgM
+BqqBfMvTmmJqDgGNVdGVbVJJZG
+vsTDfqBmHmMWQCwjtrHjjSFFnRSn
+LsCmmcDHRjdtNMstwwzJ
+TvThqfBFBNTnnndTtL
+lvGQfbFQGblFrRccLRSSlPPVHS
+qbLpqTHSqpbqbrPcQgjPDjcdDL
+gnzhhBBwBWZzMglmjDrDPjvfdvQPdwtd
+WZZzZZlZmhsMmFgRBBBzHHJpNJGVRSJVGTVpNqCH
+JDphhGhDdGzWRBnvqqLDNLMnLw
+gsrTHHffTHPcrPrlHCNZhvBZnZNLhPvBNwvh
+sHVCSsSghJpSJjQh
+JTMGlfjlTdqjnqbnqFwqmnbQ
+PBZhBBcWRZprPZcZDDCZTZRgnnzwbbsbnvhbvznFsNFFvvNQ
+BcWrVgCCZTDRDrlGttfVtMddSJlH
+vwwvpVbSvnSRRmfMCmTHVHTBHB
+QLZgDPgSDgGTMZfmTTBZ
+QDDsQFDlzlgtJlLdFDgSJQFvvpRvjqzjRwwwzWvhvWwqjj
+mRRTGGNNflGRGGmmgRblsGwCZwVZlZjVwjztpjZhpBCB
+PMLLFLHPLPnLqDDLvFDrzzMjhwVCjtphBzjMhV
+FDdSPSpLcDsNRRWSTNWN
+STldJthdJbtTqljCRDDHmqmj
+VVvNwwvNFssJFJPNNwVvRMCgCgDqjjjqrDqqMHqP
+QBZwQfZwfVhtcSBtBJnT
+TzjjPzsQTslNlNzPRVGJJJGGtTJmgJHtmTZC
+dBDWScMBhhPGgdwwJPfw
+SqSqbSPDBhqnMqvrrSWVNFpRVRLzVQslvpNjVL
+bWFgFCPFtgvDZWgtChDNFJHvGVzHHpjzHnnzGzzHRR
+qcScQbbmqdQmlQmrlcQwLmHlRRjzGHnHJnnGVjHzBHzG
+TqQwmLmfcddfwrfCgbWCNPsZNfCb
+pddprrtrCPdvJdMjwwwHnLwwjLWCLg
+qhzZTmZcmRhmpFlVHcQQVwWQHVQwnH
+lGmhfRfmBZRlmmbvDPBMvNbvJJpP
+NsptgfGLLNwnNQSZbCvZnRnMCb
+JldhdzwzBMCSZvrz
+JFcdWTdwhPTFVDVmTJNqmstLqgLtLtjGGpsG
+dVVTSgTDpHVDjgdWpdpHTZSbWGrnnvrNwzFGNrFwnNNwvh
+CPRlMPJcMQcBcsmmLCMPrzbFfhwfrvLrNNwwGwfF
+CRJmtbmJlQbsQlRBpZDVjTHTdjDtSjZt
+rQVJrRFdrwDfzHQHQBTnpWTW
+PCLbPcPCsgqCgPgLjScSqNbHTzMtWmWtzlTHmBtTlMssMT
+cCqghSSPcvgScPbwFGdDDVZFfDhZGB
+zrRQRdqzPHQtnMPrtzPMRRQMVBBblJJBSClBpJbpdCCbBlCC
+hTcGwzswGwGmGfDvvfGmGNfBpllVSWbWppNCBNBVpCBClW
+gvGFTmTgwDhTDccsTfzfmfGGQPgPPqrgRZPHnRqRZrQLnRgP
+hvmmJllPbmCRMNGMMlNwNl
+PFTpTVjTgpTpBRgMGMnRNHBB
+WWrqzTTPVQDPqpjTqPJbmLtcfsQsftbLbvct
+SzrmpjjcsjTZNzgnnNzN
+BLHNDwBLBPLwLBhwDVLgdQCgCQGTngHQZCngZd
+PPJBDvBVVBmppNjJjrrr
+ZHBNQFhsqHBsgCfqtctcPvSwPqrV
+LlnGTnJpJJTmdDpmLlmLndWfVrPvvRwDfcwwwRVwcfQtvP
+GnbQblWmWGdTJQdTGnZHsHhZhFNsbCsjFgjC
+hWfDzDTVndDMhddMlBWMBDfJRnRtvvSSQjCvZCtjtpJvSR
+bGHsccFcbscsqGPHNGcrpjJZtvSRtFtQCZrjSj
+GsbwGGwNNGLgPLwMzBzfMMVMTLdTCC
+GBcNzTSSmGzmTLNgvwgpNCDqpDggpw
+JRZMrJWFZZnZtJgvvjwbpbCJDd
+rFMPRhZtZFnWrRtQGmPPDcLfmGLTfz
+VdWnVdjhhdFjVWbndMlNLQspVMHCNVlClV
+RSrJBRRJwJSBQpMBHLLDCL
+TqwtRRRJzJTSqJSzSrtmqgWWhcncvPgnWbPQnbnWmb
+VnDFpPpFssVSpFDVHbRbscCvgbMTvTCR
+JfzqdQBfhBdddfBBGDLdGQvbrqMMcCRRMTgbqgMrbbqc
+QDfzJNWBJLQBhmdGDzDGhQGGlFZwPtWjtFFppllSVpZZFnjj
+qrLLNpJbJnRLNnpvQtRVhhRFCdlFFlFd
+mmjzjvGjwPwmTsSTSQjDVlVWQjlCDthCCC
+cSSmcTTPcSswScfSHmTSTzJqqNrnpBpqBbJLvZMrqfrL
+NSvRZRfFvfHSZQcNJBLbzDLnrDFnhtFLFnrh
+wmTGpmGCwsMplMsHllPlMnDLjznrgrzDjgnntznr
+dsCVGGGwmpTGPplmCmPppVmHSSRJNfJvBNZQfWdBRJZRBZcR
+TwQwqDPQtwNwzNDTZcnZbJvMnMMbFqZM
+SzGSjrjLWrjHHspWVhvVVnFJbccVZcRJbllb
+pHppszGSprhhWHLCLrsjdTtDDPfwdfwtdNfDgNCN
+ftcvBtBFtmBlmvPFmmcczCChrgSCzzCSnCSSnGHf
+sJddbdTDbDHdnJRggrGzGzrG
+dppDVDZMMMsTTVsDTsTDpwVctNcvBZQPcPctqtQcHmvlvQ
+jzbdzztbDqNqwvLvRmQZjvRH
+FSJbFFWgJnZFLRZmHmRQ
+TgVJTVSJGJcJlllgTMdqpdNsrztNNsNbMDDp
+CCCVWbwVnlRbTcqSShqGhhGcnF
+PgDBfDpMNlfgpPfNZZtcJgcqqhmmjqSmjFmhmS
+tpfpsPrlpsPDDMDfBZrwLrVWLLLWRCdHLTwbVR
+pjvfDGjSMpvDmDpDpSDnJmfqbPVsCMFsPqFVPqCrwrbMFV
+NQlHtHNhZHgZZNBHhQgzPmCwbqqVFlsrPFrFCP
+hgHtQdQchcHctHgcgNgBQdWNpmvTWvpGmLJDLGjTpLGnnjfv
+QhgLLLmtlRqDtRGP
+HLbnCZFWVHLZnFCJJRFrGJzDGDGJDD
+WZHfndfMfCZbMnTVTfZhSNQQpdwSdLwhNcmdSN
+sPwrPMgLFPFFsLZtmcclSSZDtcZs
+qVzqdNdCnnNVVNCGmbncDBlmBlBBnRlZ
+VTdCGVvVfffrjpfMQPwm
+BPDldDTDPZcggjcccTdNMbbMNSQNqqjtzMbrRb
+LvmWsfvssLGnQbQMRQqrSRnz
+WpvsVmmpmmfpfJGrHfVCHVvmcDgpDlZphgFgdhclhdgdBlgF
+VGwHbNzMMrzHbbHChhqgCqPNghgCqW
+ZJVBvBvZWqvRvggP
+JBJlBlBZcsBfcJVrHnLwQQGzLQMc
+gBWfBPPPfhvVWFfSVfVdjjbvTvwwQppHcHcctTcQTHcZ
+DnNnMJMqMJzqchbZtTQQrb
+llRmNLDLDGlCsWSFCffWdshd
+LpNMZZpqqpfTTwNqLZwGsZqZbdHRHbHGddnCBHRcmzGmmCdG
+JFRtRlVStjPlhtjbBzBncmVWdzWBnb
+rPhhSlrvQlFFFPgtJlJtFlhlDNTwRMfZTZfDZNrspZLMMsrq
+zBLjLFBjLjmHWlzNZlzVCC
+dcJrdfddbllJbdMTwDNMZWNVwVDwHT
+gRcgJbcbqfgbftdjlqLhFFLPPhGBjm
+WfBgBRzQGNNQqmmqZN
+nFjCjCpLbtpPJtCDDnCDJpzncrSVbmdVqbhhdqNbSSmrdVSq
+CLPJpDLlLlFDpFjjsGRsBGRfWwsHHglz
+lSlSlpCRSsWTRLTlWRvlmMrBPjBPjpqrrmqPJMPZ
+DDzbhVhQhDGzhQnGGfnHHQGBPZjMqJjBJMBVJmqMdrqqdT
+NNGQbFwnHzNzwbQwFnwbfsLCLtsvLsWggFslsTggSc
+nvzPvCnlvtwCrZWmWwvvZCQfbbfQfGbqSJJGmqGSFSbJ
+LhTBWdsMNNRgNcgDWsDNcVSfQqJGFSFJqSSddQGSJF
+HNgchHcWDRNhTNMWwtPrtZZjnHzrnvCz
+djhnzRghMMVCBfhh
+qjQTrTPQJCDDqBDJ
+LQvGrLjTHLjNNPPTpQgtztSmmbFgmgLbFnmL
+FRDNFBBRRVFFmbLZHPZBZvvH
+QnhgMllglJTdGgJnhLQQJpZpvwZHpwsPTwpbsZHmsH
+lnhnQGrMgthMlntlGfQhgWWcRSDcVCrLWzRSrRFDRN
+PqrrrRnPBbrVhVqFrFVRPVhZLvNSNvLZcQvtJfRvNScJNJ
+dDzWwwCTmmdwdddpDLWQZMSSMfSJtcWJfQSQZN
+CCwmTdjsClVjFjnLBl
+srjCvjPmQVlPjFPmQmPrdHHZhvHZDqHhDDwHHqfB
+pLcnJQNQMZpqZDDZ
+WNRbtNJgRPjjQVmz
+NJJRmjmJbbJfqSVMNHFCSFzLLlrLLrFHTz
+QvnsQGvBwWwQvgRHlGGDFPFCGlrR
+QhvwBvBctBccZWZNRNmVfjpmjJjb
+RMmGGMLRRCFmRPPfGFpGPFPJWZQWctrtlQvZvltfrQWcWWBq
+gggwjjbjwwbZtwZBBcmQQv
+SdNbDDVSgPMFmPzdMm
+nZhnNZDnZPmZPWbppPpMlvRlzvrtMmRtqRzRfq
+HcFwsCQLVQwFwLtLbvtzrlrLtt
+GsgCFCgCQHHCVHsFQHcFdDPDbJDZTpZDbWJPNWWZDd
+BBrBrGlGpgGjsNhlBlpBwpfSwZJdQwfcZwvSQnnn
+LvWvHLmmVJQQHfQH
+RPLRMvqFTbRTjGBhjNFsslls
+cNZZZmZDcDDJmhzzrrlHtSbvgjSvgfPSWvPfjShv
+VBwnndnVCqbqpRRpnspnqRWtGgWSSgvFBSGGSWgtGGSP
+LqCMnTLVRwCRCpRLpbHDNzMMNcmmHNHQJQ
+MMqDtnVnBlHtZvtB
+WLWrWgdWwdrLCTFCwLlbbsJsJQsbQlQzlvrB
+jFSvTdjfnfRmVcRR
+ZLGqnvnqLzvbGRMfcRpwMpdV
+fgfNNfgHHjVmRcVdgM
+HsWDCDfCQCZBBZnvWtLq
+bTZjqflqZhcrlczGzppGNgjmFNnp
+PmmRSWWDMBQVNpWFznGF
+SStRBDSCCSSSwPBwBDBwPmZhZlfZhqHTsTfltHHZfsHH
+GbNbsSptQGqsdJCzsddcgzzv
+DHRRnmWWmZnmRhllnHnnnMLvvLgcTVvjVhCTvgzcJgLj
+RnWMlDZRlnHlmHWBFwGQqNGGPNQzPGqFwz
+vSGvHpJnBLbGHBNCgfDzzChDgbCfzT
+wFRslqmqTRgggQghPmQf
+qjRFMjWqNNMMGHTL
+fWGcQGGSRFQZhttZJfSSJflDDrwdClljVrNDdrdCFBCr
+MTgvLLPPnHzMbDwdlNbMBwMM
+mnTvnnPTcNmmJJWN
+qqbbQQnbWrqGgnWqvZpVzMCZjCgfjZCSVM
+ldcmDPDhmlFBHPDddLBVFDHLppZpjSCjjNfwNMwCpSMwhCMp
+FtDdsHPcHmdHVPLtHsdtBHQnsbvnTRRTRsRRqbqvqWnJ
+hhtBtPrgbbhhgjZjjCCHHNpNDHpffHWCvr
+LGFLVwswsJMSgFwMMpddSvpHCCdDdvCpvm
+sGsFsQLsVsLFnnFTJQthjcjQqhRcBZZtRg
\ No newline at end of file
diff --git a/2022/go/day04/day04.go b/2022/go/day04/day04.go
new file mode 100644 (file)
index 0000000..f5b789e
--- /dev/null
@@ -0,0 +1,59 @@
+package day04
+
+import (
+       "strings"
+       "strconv"
+//     "fmt"
+
+       mapset "github.com/deckarep/golang-set/v2"
+
+)
+
+func Part1(input string) int {
+       var count int = 0
+       lines := strings.Split(input, "\n")
+       for _, line := range lines {
+               pairs := strings.Split(line, ",")
+               
+               pair1 := strings.Split(pairs[0], "-")
+               pair2 := strings.Split(pairs[1], "-")
+
+               p1set := mapset.NewSet[int](Range(pair1[0], pair1[1])...)
+               p2set := mapset.NewSet[int](Range(pair2[0], pair2[1])...)
+
+               if p1set.IsSubset(p2set) || p2set.IsSubset(p1set) {
+                       count++
+               }
+       }
+       return count
+}
+
+func Part2(input string) int {
+       var count int = 0
+       lines := strings.Split(input, "\n")
+       for _, line := range lines {
+               pairs := strings.Split(line, ",")
+               
+               pair1 := strings.Split(pairs[0], "-")
+               pair2 := strings.Split(pairs[1], "-")
+
+               p1set := mapset.NewSet[int](Range(pair1[0], pair1[1])...)
+               p2set := mapset.NewSet[int](Range(pair2[0], pair2[1])...)
+
+               if len(p1set.Intersect(p2set).ToSlice()) > 0 {
+                       count++
+               }
+       }
+       return count
+}
+
+func Range(start string, end string)[]int {
+       s, _ := strconv.Atoi(start)
+       e, _ := strconv.Atoi(end)
+
+       var r []int
+       for i := s; i <= e; i++ {
+               r = append(r, i)
+       }
+       return r
+}
\ No newline at end of file
diff --git a/2022/go/day04/day04_test.go b/2022/go/day04/day04_test.go
new file mode 100644 (file)
index 0000000..ca17625
--- /dev/null
@@ -0,0 +1,29 @@
+package day04
+
+import (
+       "testing"
+
+       "github.com/stretchr/testify/require"
+)
+
+func TestPart1(t *testing.T) {
+       r := Part1(
+`2-4,6-8
+2-3,4-5
+5-7,7-9
+2-8,3-7
+6-6,4-6
+2-6,4-8`)
+       require.Equal(t, 2, r)
+}
+
+func TestPart2(t *testing.T) {
+       r := Part2(
+`2-4,6-8
+2-3,4-5
+5-7,7-9
+2-8,3-7
+6-6,4-6
+2-6,4-8`)
+       require.Equal(t, 4, r)
+}
diff --git a/2022/go/day04/input.txt b/2022/go/day04/input.txt
new file mode 100644 (file)
index 0000000..6398f2a
--- /dev/null
@@ -0,0 +1,1000 @@
+48-50,48-49
+5-89,5-5
+17-57,55-96
+24-67,23-25
+89-99,11-89
+34-71,35-71
+13-17,16-95
+13-93,5-12
+11-91,1-11
+4-81,2-11
+53-82,52-53
+5-98,4-97
+4-78,3-3
+20-81,21-80
+79-83,77-82
+76-87,43-87
+14-93,12-62
+13-94,15-95
+22-75,14-53
+67-90,67-79
+1-82,1-82
+5-80,83-96
+28-57,56-56
+53-91,52-54
+21-97,2-36
+8-18,10-98
+7-91,12-91
+11-88,19-95
+22-88,21-88
+31-69,9-48
+2-3,3-43
+5-95,2-6
+5-85,5-79
+51-91,51-69
+41-91,41-64
+23-37,24-95
+1-28,3-94
+6-93,6-98
+8-65,34-66
+2-8,9-38
+3-75,2-4
+40-77,37-76
+51-51,11-51
+95-95,3-94
+90-90,81-90
+26-61,26-61
+1-96,97-98
+41-84,90-91
+94-94,1-94
+52-89,74-90
+9-11,10-74
+57-67,56-62
+29-98,30-78
+20-88,18-54
+11-81,10-82
+85-87,26-86
+8-45,46-78
+16-33,20-49
+73-93,16-93
+35-36,29-36
+4-98,98-98
+24-30,30-80
+64-99,72-97
+8-33,8-47
+88-96,93-99
+23-46,35-49
+41-60,40-41
+5-83,4-6
+76-76,15-76
+37-70,69-71
+11-77,11-12
+57-65,65-97
+20-46,46-62
+76-84,8-77
+10-29,29-53
+16-50,6-17
+20-99,19-19
+11-12,12-72
+24-91,77-92
+37-73,72-73
+50-52,73-89
+37-99,25-76
+1-88,1-2
+18-64,17-63
+19-52,17-52
+5-86,6-87
+13-87,14-87
+23-82,19-92
+56-79,57-79
+25-68,26-67
+5-95,94-96
+38-50,38-39
+32-75,32-75
+23-69,23-69
+25-54,18-25
+33-79,34-67
+38-62,38-65
+62-75,69-78
+2-17,3-17
+12-20,19-96
+7-7,4-8
+1-92,2-93
+29-70,69-77
+7-54,2-54
+9-34,16-34
+4-20,7-31
+4-89,4-47
+12-91,9-96
+8-79,9-80
+32-91,31-91
+1-4,5-55
+85-94,84-95
+73-74,6-74
+51-70,52-70
+21-75,7-27
+13-38,37-39
+42-97,42-98
+33-45,28-45
+12-14,13-98
+91-92,90-91
+66-83,57-83
+8-79,9-67
+59-72,71-72
+33-71,3-33
+13-38,12-38
+18-93,18-52
+28-80,12-26
+87-88,2-88
+7-89,7-85
+26-27,27-27
+12-97,12-97
+36-95,32-91
+25-33,25-32
+4-39,5-75
+40-58,41-58
+8-60,8-93
+9-69,70-70
+19-34,35-68
+47-47,38-47
+1-70,1-70
+39-82,38-83
+17-98,17-99
+56-86,37-56
+2-2,4-96
+5-97,97-97
+52-93,52-77
+39-66,38-66
+9-99,4-99
+25-37,24-37
+2-99,1-98
+13-15,15-15
+10-51,5-9
+38-99,19-96
+6-38,37-78
+94-98,95-99
+8-89,29-89
+2-98,1-98
+13-99,99-99
+1-76,1-25
+8-97,8-97
+9-90,89-93
+24-52,7-49
+30-97,45-99
+26-62,26-59
+15-27,21-30
+80-81,64-80
+65-76,2-76
+9-9,10-99
+3-6,4-82
+78-79,20-79
+11-50,49-49
+10-12,11-68
+1-5,4-85
+8-10,9-95
+16-86,16-87
+11-81,10-11
+36-87,75-87
+55-92,54-99
+3-18,18-84
+4-73,1-2
+16-66,5-76
+29-73,29-79
+60-91,67-91
+82-82,47-82
+31-38,31-37
+44-44,21-44
+93-94,65-94
+13-79,2-12
+4-97,5-97
+40-78,40-41
+69-99,1-69
+8-97,8-96
+27-27,26-79
+60-96,71-88
+24-57,18-25
+1-26,2-27
+53-81,69-81
+3-96,2-96
+9-99,9-97
+45-48,46-56
+6-36,5-30
+45-73,46-73
+28-41,27-42
+4-91,90-94
+6-39,20-44
+3-3,5-65
+17-98,18-65
+15-98,15-96
+29-88,65-90
+10-61,60-62
+26-91,27-91
+78-96,95-95
+6-22,6-17
+40-56,40-57
+4-5,6-98
+78-83,51-83
+8-78,8-78
+26-87,26-86
+4-94,3-4
+5-55,2-6
+40-50,19-56
+55-68,2-94
+39-41,9-40
+68-76,68-69
+51-60,50-59
+9-48,2-10
+13-96,13-63
+1-90,4-91
+1-7,6-99
+25-67,25-66
+13-94,14-93
+27-28,28-70
+39-41,25-40
+8-53,9-53
+56-89,57-88
+4-56,50-56
+22-76,15-17
+7-98,69-76
+12-46,11-46
+1-41,3-72
+43-55,44-76
+9-81,9-81
+45-95,45-94
+12-68,12-69
+90-96,74-85
+67-68,68-68
+50-73,2-73
+6-17,6-97
+70-76,71-99
+9-43,9-43
+9-76,8-75
+66-90,65-66
+13-99,12-14
+1-2,3-91
+53-86,52-53
+3-57,3-96
+81-92,80-92
+6-18,17-88
+70-94,69-69
+17-17,18-88
+4-92,4-93
+41-61,47-61
+25-52,25-73
+78-97,12-97
+39-54,38-46
+39-52,39-58
+8-99,8-51
+52-58,51-52
+5-45,6-46
+3-99,98-98
+84-87,84-98
+58-87,86-88
+6-72,71-73
+41-42,41-86
+27-42,27-77
+14-15,14-74
+43-43,40-43
+17-95,17-93
+44-66,65-70
+4-99,5-99
+43-43,44-86
+64-75,63-71
+4-99,5-99
+6-29,6-99
+19-84,18-83
+72-72,10-72
+9-14,13-88
+3-98,98-98
+9-81,10-81
+13-69,13-70
+3-87,1-87
+22-61,10-62
+75-90,75-90
+69-99,68-87
+94-94,91-95
+2-3,3-96
+5-93,48-93
+43-45,33-49
+85-87,2-86
+51-52,52-62
+50-91,40-49
+1-81,21-81
+51-56,51-56
+22-23,23-37
+25-27,26-67
+58-59,23-58
+37-85,84-85
+12-97,12-96
+14-38,2-13
+33-81,32-44
+34-65,46-60
+3-28,27-28
+11-54,11-55
+2-93,1-93
+28-28,28-50
+10-82,81-83
+77-82,77-82
+33-63,49-63
+2-84,89-91
+37-90,36-91
+46-85,45-85
+97-97,14-97
+5-18,6-19
+7-94,6-95
+17-87,12-86
+11-85,39-85
+7-94,7-93
+9-98,9-96
+18-18,19-96
+62-62,34-62
+24-36,24-91
+72-91,4-91
+7-84,7-83
+9-93,9-87
+22-99,21-99
+32-46,31-32
+32-70,69-97
+13-89,12-88
+10-10,11-89
+46-46,47-64
+51-51,24-52
+5-51,3-3
+46-90,99-99
+6-96,5-95
+50-96,50-97
+96-96,4-70
+13-36,12-35
+19-90,13-20
+12-43,42-95
+1-83,1-84
+3-5,4-70
+24-97,25-98
+27-40,1-50
+37-82,36-83
+47-95,47-94
+2-80,2-58
+64-83,63-87
+42-52,41-44
+26-97,1-97
+35-45,35-78
+6-45,28-82
+11-17,11-16
+67-67,44-67
+2-95,2-94
+22-95,22-94
+20-43,21-92
+33-60,59-76
+6-75,7-75
+3-90,96-99
+38-76,41-76
+18-98,6-19
+2-65,64-77
+3-88,2-88
+14-94,13-93
+40-89,71-99
+44-93,44-72
+48-62,48-61
+6-27,6-26
+43-53,43-54
+4-97,36-98
+8-13,12-83
+15-96,7-96
+18-91,17-18
+11-13,12-55
+31-92,19-94
+44-87,14-45
+18-51,17-18
+23-24,27-27
+23-46,24-88
+12-90,13-90
+37-70,34-70
+1-98,88-98
+2-93,6-95
+73-99,74-98
+4-46,2-46
+50-52,51-75
+45-91,46-90
+11-85,58-94
+26-43,26-44
+56-95,55-94
+10-93,11-92
+1-99,1-99
+8-95,7-7
+19-69,9-18
+18-90,9-60
+74-93,13-73
+62-90,61-72
+7-53,52-95
+44-82,4-44
+17-88,17-88
+26-27,26-89
+1-9,1-62
+13-40,39-62
+2-93,1-92
+91-91,17-91
+57-58,58-85
+23-98,97-99
+16-48,16-48
+25-61,61-87
+14-47,13-84
+46-96,47-94
+8-98,7-99
+3-5,4-97
+38-83,28-82
+7-99,6-34
+23-91,38-84
+33-35,34-63
+14-55,55-55
+34-50,11-35
+3-69,4-69
+67-99,99-99
+38-94,2-59
+2-98,2-97
+77-79,42-78
+6-45,44-45
+39-79,61-93
+5-92,5-97
+4-61,3-64
+47-48,48-67
+11-23,10-23
+2-99,9-99
+31-99,30-81
+28-87,29-88
+8-31,2-13
+3-17,16-83
+29-58,57-59
+4-75,15-35
+49-94,48-93
+23-85,84-84
+7-92,7-97
+53-91,91-97
+26-95,1-95
+9-22,7-9
+13-63,62-95
+54-55,54-97
+80-88,79-88
+1-44,2-44
+3-83,1-4
+95-95,26-95
+23-26,23-26
+19-35,19-34
+17-34,34-34
+39-89,75-97
+42-84,84-84
+60-95,61-94
+6-88,5-88
+2-68,1-68
+16-76,15-16
+30-93,9-96
+10-91,11-91
+36-88,35-36
+24-67,45-66
+41-58,16-96
+84-85,83-85
+10-59,18-59
+33-70,69-69
+58-69,57-58
+4-6,68-85
+3-91,91-91
+99-99,2-98
+33-94,93-95
+68-69,27-68
+4-4,5-14
+98-98,2-97
+5-91,90-92
+2-91,2-90
+37-81,80-80
+9-51,54-69
+45-59,46-59
+8-69,7-69
+20-21,21-29
+45-83,88-91
+22-87,20-21
+4-77,3-76
+50-81,49-49
+47-59,58-78
+22-85,21-84
+3-86,7-91
+63-83,62-63
+10-58,7-57
+14-88,14-88
+18-67,16-28
+39-50,39-42
+9-85,8-85
+7-28,7-8
+72-72,19-73
+25-27,25-56
+40-43,40-43
+10-26,25-25
+29-99,30-99
+9-14,13-92
+9-17,10-56
+93-94,1-94
+31-67,30-68
+15-84,84-84
+45-46,8-46
+10-93,10-94
+31-48,5-94
+49-93,92-92
+45-80,40-67
+63-94,7-93
+2-94,1-66
+26-44,41-53
+51-94,1-94
+5-93,4-92
+14-86,85-86
+9-52,8-10
+24-61,23-62
+1-78,77-79
+6-97,17-96
+43-65,19-43
+45-99,35-99
+58-58,20-57
+22-89,64-85
+12-22,21-80
+6-36,36-36
+1-92,87-92
+26-99,26-97
+7-85,1-85
+20-98,20-98
+2-51,2-54
+73-95,74-95
+16-54,15-17
+4-95,4-96
+11-98,11-98
+67-79,66-80
+61-61,62-63
+50-62,12-50
+9-80,9-81
+1-1,3-87
+16-61,15-23
+31-35,34-40
+13-89,12-90
+89-91,90-95
+20-60,12-81
+2-65,1-66
+38-96,56-96
+23-23,12-22
+96-96,11-95
+8-37,36-97
+2-26,1-26
+30-71,37-73
+71-87,70-70
+31-99,31-82
+6-39,2-7
+1-99,3-99
+29-73,32-81
+33-37,33-36
+15-41,14-40
+32-33,33-90
+23-85,22-24
+26-93,26-86
+3-97,2-98
+10-92,92-94
+29-55,30-55
+9-75,29-96
+6-94,93-97
+63-63,52-63
+24-78,5-5
+38-67,37-67
+14-32,13-32
+35-94,36-94
+23-92,24-92
+9-36,8-36
+63-95,62-62
+37-78,3-78
+34-51,17-37
+84-85,13-84
+1-95,1-98
+18-56,18-19
+17-78,13-16
+6-52,15-44
+13-33,14-33
+10-88,11-89
+61-80,61-79
+6-98,98-98
+1-91,1-85
+60-86,10-87
+3-96,95-98
+34-99,33-98
+19-21,20-91
+7-96,8-96
+2-90,2-90
+36-96,36-96
+76-96,60-75
+8-44,7-44
+9-28,10-28
+10-95,7-95
+56-68,29-82
+10-97,18-99
+68-97,45-97
+19-92,2-92
+6-97,5-97
+74-74,73-73
+20-70,20-70
+18-66,19-67
+91-94,7-92
+4-47,4-47
+11-93,12-93
+33-54,32-53
+54-64,55-63
+20-99,20-21
+39-82,56-68
+4-36,36-47
+30-41,25-31
+65-69,69-69
+20-71,71-74
+16-36,24-54
+2-96,95-98
+11-70,10-12
+5-36,35-95
+36-92,36-37
+37-78,32-87
+28-89,15-88
+9-63,62-62
+2-94,4-94
+85-85,72-85
+30-73,7-31
+10-36,10-36
+75-97,47-95
+23-23,4-24
+49-88,36-87
+25-25,26-42
+33-86,26-86
+13-76,76-76
+60-60,60-60
+3-23,24-24
+4-85,10-85
+7-38,8-37
+40-85,41-84
+46-86,47-87
+8-38,7-38
+76-78,9-77
+80-94,57-94
+86-96,86-97
+35-89,10-67
+45-94,35-81
+8-93,7-8
+22-48,23-47
+21-94,20-94
+63-72,60-73
+89-89,57-90
+34-41,41-78
+5-5,2-6
+1-79,1-80
+79-82,80-83
+37-37,38-53
+65-93,64-96
+33-85,33-33
+7-98,44-57
+2-5,4-69
+19-69,18-68
+80-81,7-81
+19-99,20-99
+5-34,4-14
+4-88,88-89
+51-91,59-93
+33-60,33-58
+32-67,27-94
+8-98,7-8
+34-43,44-69
+10-80,10-11
+7-73,11-73
+23-69,24-69
+68-83,6-68
+2-35,5-35
+1-4,3-90
+88-89,30-89
+57-99,14-63
+16-29,17-28
+67-82,62-77
+20-65,19-66
+37-69,61-63
+58-94,94-94
+1-72,72-72
+7-11,10-47
+18-59,59-59
+57-57,37-58
+60-81,54-72
+2-86,1-87
+7-78,7-77
+59-69,59-65
+15-16,15-73
+15-82,16-92
+8-88,57-88
+36-92,36-88
+59-60,24-59
+4-22,1-3
+44-60,45-60
+90-95,35-89
+21-30,20-30
+4-83,83-83
+16-99,7-17
+11-18,19-95
+45-94,44-94
+3-11,3-12
+9-70,8-10
+1-8,8-78
+1-5,4-97
+30-55,29-31
+7-89,8-89
+47-47,46-48
+66-96,38-84
+33-34,33-73
+2-23,1-22
+52-64,53-91
+9-34,19-61
+25-57,25-57
+1-98,97-98
+79-89,76-80
+28-80,28-80
+13-77,76-78
+3-88,2-88
+69-72,70-72
+91-91,22-91
+77-95,76-94
+84-92,84-91
+55-99,56-99
+1-91,2-91
+33-36,27-36
+79-84,62-74
+52-54,18-53
+26-37,25-27
+55-85,40-85
+58-74,10-59
+6-53,6-53
+42-49,42-47
+47-79,80-97
+11-24,25-91
+83-87,86-87
+1-88,1-96
+55-63,54-62
+76-76,8-76
+3-78,78-99
+1-86,8-96
+44-70,43-70
+25-27,26-91
+65-98,97-97
+14-64,15-65
+9-36,8-35
+78-84,77-85
+42-58,41-59
+60-92,59-60
+95-97,14-86
+8-82,7-83
+5-58,5-59
+5-99,6-99
+4-13,1-4
+57-86,43-58
+11-82,11-11
+4-87,1-5
+6-7,7-11
+6-22,2-7
+15-49,14-49
+39-97,99-99
+12-49,13-90
+70-80,71-80
+46-95,66-94
+94-98,13-94
+3-11,11-11
+13-23,12-23
+11-98,11-98
+20-99,8-20
+28-87,27-87
+16-21,21-61
+2-91,7-56
+7-7,8-71
+74-74,67-74
+23-88,1-74
+1-99,2-98
+34-85,40-86
+6-85,6-68
+28-31,31-49
+13-40,13-40
+55-56,56-56
+70-72,26-71
+93-94,34-93
+45-75,44-75
+4-10,10-50
+65-74,65-77
+39-87,6-59
+11-85,3-85
+8-46,12-46
+9-9,10-95
+30-41,27-92
+13-97,9-96
+21-62,22-63
+54-69,52-53
+17-99,18-99
+75-92,7-76
+38-39,38-90
+50-69,49-50
+65-87,65-99
+6-98,6-96
+34-62,40-90
+33-47,34-48
+33-95,34-95
+42-99,43-98
+70-85,1-71
+37-63,38-63
+12-17,17-72
+28-31,29-92
+18-69,8-17
+41-96,40-95
+7-86,7-86
+68-78,67-73
+4-6,7-99
+8-86,86-87
+5-6,6-37
+88-94,89-95
+33-74,33-74
+86-87,86-87
+29-55,62-78
+23-38,13-38
+9-44,10-89
+18-67,19-97
+3-83,1-66
+55-81,55-81
+6-72,7-71
+5-55,6-55
+14-99,14-97
+39-83,16-40
+11-73,55-73
+4-68,5-67
+66-73,26-73
+3-92,3-91
+36-59,33-35
+72-73,4-73
+1-83,2-83
+25-88,25-43
+45-71,45-73
+9-96,95-95
+4-5,7-23
+48-50,4-49
+45-96,44-96
+50-87,49-50
+98-99,27-96
+4-40,40-78
+3-94,94-94
+7-34,25-26
+72-79,23-72
+2-84,3-83
+78-96,25-78
+77-94,73-94
+63-66,62-65
+25-80,24-80
+10-33,78-90
+25-55,24-54
+58-62,23-64
+61-62,62-84
+83-83,46-84
+23-30,31-92
+8-95,94-99
+35-65,34-64
+12-19,12-18
+21-25,24-43
+54-79,54-84
+37-56,37-57
+77-77,15-77
+57-88,55-88
+7-93,8-93
+5-89,3-66
+33-63,32-33
+9-52,51-96
+7-97,6-66
+3-58,1-3
+26-85,25-84
+11-63,10-12
+52-54,53-54
+23-68,22-22
+14-96,14-95
+4-41,3-21
+4-6,5-83
+97-98,1-97
+13-90,73-88
+11-15,7-10
+65-80,24-81
+48-82,48-83
+81-87,4-81
+40-47,40-47
+15-87,14-75
+30-50,29-30
+26-65,64-64
+37-37,7-37
+51-51,49-51
+5-71,7-70
+18-54,53-54
+47-48,48-60
+26-98,25-97
+5-6,5-81
+3-98,3-99
+9-22,21-22
+4-97,1-1
+36-36,37-77
+22-35,4-23
+18-95,19-96
+14-94,14-96
+43-46,47-50
+80-91,81-91
+20-67,5-81
+8-87,9-86
+30-69,23-30
+96-99,2-96
+59-75,74-76
+20-66,19-66
+10-85,10-65
+9-82,8-38
+32-66,54-66
+23-64,63-65
+1-89,1-90
+1-95,1-94
+12-82,7-64
+55-66,60-66
+3-93,3-42
+45-87,15-88
+3-50,3-76
+7-86,8-79
+39-39,40-85
+57-86,52-52
+17-84,16-18
+63-99,64-99
+83-94,83-94
+12-85,11-86
+18-89,17-17
+12-25,13-87
+9-12,10-15
+62-92,85-88
+26-97,26-94
+16-94,94-94
+47-83,47-83
+25-86,85-88
+1-99,1-98
+47-87,87-99
+9-99,9-97
+8-73,2-73
+45-47,46-85
+18-95,18-96
+41-41,40-41
+1-4,4-61
+4-95,5-96
+8-79,78-80
+6-81,9-81
+7-90,1-7
+6-22,6-22
+32-82,15-59
+19-93,13-93
+43-48,12-99
+45-45,46-59
+27-69,1-28
+78-78,59-79
+12-57,57-57
+4-39,4-77
+55-91,91-91
+27-87,92-95
+83-87,87-98
+22-84,22-31
+3-91,3-22
+45-86,57-62
+68-82,55-82
+96-98,3-97
+12-32,1-32
+37-71,37-71
+31-59,31-59
+86-88,79-88
+4-92,3-3
+40-91,17-91
+51-52,52-74
+2-97,1-98
+50-83,82-83
+34-34,35-41
+6-47,5-5
+5-65,5-47
+32-77,33-85
+21-68,22-67
+12-45,46-95
+45-48,38-46
+39-84,35-40
+4-60,3-4
+67-83,68-84
+24-92,25-93
\ No newline at end of file
diff --git a/2022/go/day05/day05.go b/2022/go/day05/day05.go
new file mode 100644 (file)
index 0000000..5988915
--- /dev/null
@@ -0,0 +1,93 @@
+package day05
+
+import (
+       "fmt"
+       "strings"
+
+       "github.com/philhanna/stack"
+)
+
+func Part1(input string) (result string) {
+
+       result = ""
+       var stacks [9]stack.Stack[string]
+       var lineNo int
+
+       for i := 0; i < 9; i++ {
+               stacks[i] = stack.NewStack[string]()
+       }
+
+       lines := strings.Split(input, "\n")
+       for n, line := range lines {
+               if line == " 1   2   3   4   5   6   7   8   9 " {
+                       lineNo = n + 2
+                       break
+               }
+               for i, r := range line {
+                       if r != ' ' && r != '[' && r != ']' {
+                               stacks[i/4].Push(string(r))
+                       }
+               }
+       }
+       for i := 0; i < 9; i++ {
+               stacks[i].Reverse()
+       }
+       var quantity, from, to int
+       for _, line := range lines[lineNo:] {
+               fmt.Sscanf(line, "move %d from %d to %d", &quantity, &from, &to)
+               for i := 0; i < quantity; i++ {
+                       value, _ := (stacks[from-1]).Pop()
+                       stacks[to-1].Push(value)
+               }
+       }
+       for i := 0; i < 9; i++ {
+               item, _ := stacks[i].Peek()
+               result = result + item
+       }
+       return
+}
+
+func Part2(input string) (result string) {
+
+       result = ""
+       var stacks [9]stack.Stack[string]
+       tmp := stack.NewStack[string]()
+       var lineNo int
+
+       for i := 0; i < 9; i++ {
+               stacks[i] = stack.NewStack[string]()
+       }
+
+       lines := strings.Split(input, "\n")
+       for n, line := range lines {
+               if line == " 1   2   3   4   5   6   7   8   9 " {
+                       lineNo = n + 2
+                       break
+               }
+               for i, r := range line {
+                       if r != ' ' && r != '[' && r != ']' {
+                               stacks[i/4].Push(string(r))
+                       }
+               }
+       }
+       for i := 0; i < 9; i++ {
+               stacks[i].Reverse()
+       }
+       var quantity, from, to int
+       for _, line := range lines[lineNo:] {
+               fmt.Sscanf(line, "move %d from %d to %d", &quantity, &from, &to)
+               for i := 0; i < quantity; i++ {
+                       value, _ := (stacks[from-1]).Pop()
+                       tmp.Push(value)
+               }
+               for i := 0; i < quantity; i++ {
+                       value, _ := tmp.Pop()
+                       stacks[to-1].Push(value)
+               }
+       }
+       for i := 0; i < 9; i++ {
+               item, _ := stacks[i].Peek()
+               result = result + item
+       }
+       return
+}
diff --git a/2022/go/day05/day05_test.go b/2022/go/day05/day05_test.go
new file mode 100644 (file)
index 0000000..9fff6c6
--- /dev/null
@@ -0,0 +1,17 @@
+package day05
+
+import (
+       "testing"
+
+       "github.com/stretchr/testify/require"
+)
+
+func TestPart1(t *testing.T) {
+       r := Part1("")
+       require.Equal(t, 0, r)
+}
+
+func TestPart2(t *testing.T) {
+       r := Part2("")
+       require.Equal(t, 0, r)
+}
diff --git a/2022/go/day05/input.txt b/2022/go/day05/input.txt
new file mode 100644 (file)
index 0000000..7875817
--- /dev/null
@@ -0,0 +1,514 @@
+        [G]         [D]     [Q]    
+[P]     [T]         [L] [M] [Z]    
+[Z] [Z] [C]         [Z] [G] [W]    
+[M] [B] [F]         [P] [C] [H] [N]
+[T] [S] [R]     [H] [W] [R] [L] [W]
+[R] [T] [Q] [Z] [R] [S] [Z] [F] [P]
+[C] [N] [H] [R] [N] [H] [D] [J] [Q]
+[N] [D] [M] [G] [Z] [F] [W] [S] [S]
+ 1   2   3   4   5   6   7   8   9 
+
+move 7 from 6 to 8
+move 5 from 2 to 6
+move 2 from 4 to 1
+move 1 from 4 to 5
+move 5 from 7 to 6
+move 7 from 6 to 3
+move 5 from 9 to 2
+move 6 from 2 to 3
+move 2 from 7 to 9
+move 20 from 3 to 1
+move 11 from 1 to 6
+move 1 from 9 to 8
+move 3 from 8 to 2
+move 8 from 1 to 5
+move 10 from 8 to 4
+move 7 from 6 to 4
+move 1 from 8 to 3
+move 8 from 1 to 7
+move 16 from 4 to 8
+move 1 from 9 to 8
+move 1 from 5 to 2
+move 4 from 7 to 4
+move 5 from 6 to 7
+move 1 from 6 to 1
+move 8 from 7 to 4
+move 1 from 6 to 9
+move 12 from 4 to 5
+move 3 from 2 to 5
+move 1 from 6 to 2
+move 1 from 3 to 7
+move 1 from 3 to 2
+move 1 from 9 to 3
+move 1 from 7 to 8
+move 1 from 7 to 5
+move 1 from 3 to 2
+move 4 from 5 to 7
+move 5 from 5 to 7
+move 1 from 4 to 3
+move 1 from 3 to 9
+move 3 from 1 to 8
+move 1 from 9 to 1
+move 2 from 2 to 1
+move 2 from 2 to 7
+move 8 from 8 to 1
+move 3 from 5 to 2
+move 8 from 7 to 5
+move 7 from 1 to 3
+move 3 from 1 to 7
+move 1 from 1 to 5
+move 1 from 3 to 7
+move 7 from 5 to 8
+move 2 from 2 to 8
+move 1 from 3 to 2
+move 1 from 2 to 4
+move 1 from 4 to 8
+move 13 from 8 to 1
+move 13 from 5 to 9
+move 2 from 5 to 2
+move 7 from 9 to 3
+move 12 from 8 to 3
+move 4 from 9 to 3
+move 1 from 3 to 4
+move 2 from 2 to 3
+move 1 from 1 to 6
+move 1 from 2 to 3
+move 1 from 5 to 9
+move 7 from 7 to 4
+move 10 from 1 to 8
+move 1 from 1 to 4
+move 1 from 9 to 5
+move 2 from 5 to 1
+move 1 from 6 to 5
+move 3 from 8 to 9
+move 5 from 4 to 3
+move 4 from 4 to 1
+move 7 from 1 to 6
+move 2 from 5 to 7
+move 35 from 3 to 4
+move 4 from 9 to 1
+move 19 from 4 to 8
+move 1 from 7 to 6
+move 1 from 9 to 2
+move 10 from 4 to 5
+move 2 from 4 to 7
+move 3 from 4 to 3
+move 1 from 2 to 8
+move 1 from 1 to 9
+move 3 from 3 to 6
+move 4 from 8 to 6
+move 4 from 5 to 2
+move 2 from 8 to 3
+move 3 from 5 to 9
+move 12 from 6 to 1
+move 8 from 8 to 6
+move 2 from 9 to 1
+move 1 from 4 to 1
+move 1 from 3 to 8
+move 3 from 7 to 8
+move 2 from 9 to 7
+move 1 from 6 to 7
+move 10 from 6 to 8
+move 4 from 2 to 5
+move 1 from 3 to 7
+move 7 from 5 to 7
+move 13 from 8 to 1
+move 29 from 1 to 4
+move 8 from 7 to 8
+move 1 from 1 to 3
+move 3 from 7 to 6
+move 1 from 1 to 9
+move 15 from 4 to 1
+move 1 from 3 to 6
+move 10 from 1 to 6
+move 10 from 6 to 7
+move 1 from 4 to 9
+move 1 from 9 to 1
+move 1 from 9 to 7
+move 6 from 7 to 8
+move 1 from 1 to 6
+move 5 from 6 to 5
+move 21 from 8 to 9
+move 5 from 1 to 9
+move 2 from 9 to 5
+move 3 from 5 to 6
+move 3 from 7 to 9
+move 4 from 4 to 6
+move 6 from 8 to 7
+move 6 from 6 to 3
+move 2 from 7 to 9
+move 1 from 7 to 2
+move 6 from 3 to 2
+move 1 from 6 to 4
+move 4 from 5 to 9
+move 1 from 4 to 5
+move 9 from 4 to 6
+move 7 from 6 to 4
+move 10 from 9 to 2
+move 5 from 7 to 5
+move 10 from 2 to 7
+move 2 from 5 to 4
+move 2 from 5 to 9
+move 4 from 9 to 4
+move 1 from 8 to 6
+move 7 from 7 to 2
+move 1 from 5 to 4
+move 2 from 7 to 1
+move 1 from 5 to 7
+move 3 from 6 to 2
+move 4 from 4 to 5
+move 1 from 2 to 7
+move 10 from 4 to 7
+move 3 from 7 to 3
+move 17 from 9 to 4
+move 1 from 1 to 4
+move 1 from 1 to 5
+move 5 from 2 to 7
+move 1 from 9 to 2
+move 5 from 4 to 8
+move 2 from 9 to 7
+move 4 from 8 to 1
+move 3 from 4 to 8
+move 1 from 2 to 5
+move 1 from 9 to 2
+move 6 from 4 to 8
+move 3 from 7 to 5
+move 1 from 4 to 9
+move 1 from 9 to 1
+move 3 from 1 to 9
+move 4 from 8 to 5
+move 2 from 9 to 8
+move 4 from 2 to 5
+move 8 from 7 to 2
+move 5 from 8 to 5
+move 2 from 7 to 8
+move 1 from 3 to 5
+move 1 from 1 to 2
+move 1 from 1 to 6
+move 2 from 3 to 6
+move 5 from 2 to 8
+move 4 from 7 to 1
+move 7 from 8 to 5
+move 1 from 1 to 5
+move 3 from 8 to 3
+move 1 from 9 to 3
+move 7 from 2 to 3
+move 2 from 2 to 8
+move 2 from 4 to 8
+move 1 from 8 to 5
+move 1 from 1 to 4
+move 2 from 4 to 7
+move 2 from 7 to 1
+move 3 from 2 to 3
+move 3 from 5 to 2
+move 1 from 8 to 3
+move 3 from 3 to 2
+move 5 from 2 to 1
+move 17 from 5 to 8
+move 9 from 8 to 1
+move 11 from 3 to 5
+move 8 from 8 to 5
+move 2 from 8 to 5
+move 16 from 1 to 4
+move 13 from 4 to 7
+move 6 from 5 to 2
+move 2 from 4 to 8
+move 5 from 7 to 9
+move 2 from 1 to 2
+move 7 from 7 to 1
+move 1 from 1 to 4
+move 1 from 9 to 8
+move 7 from 2 to 8
+move 1 from 4 to 7
+move 2 from 9 to 4
+move 1 from 4 to 1
+move 1 from 3 to 5
+move 2 from 9 to 8
+move 11 from 8 to 7
+move 2 from 6 to 5
+move 1 from 6 to 9
+move 1 from 1 to 9
+move 1 from 9 to 1
+move 4 from 1 to 4
+move 2 from 1 to 8
+move 1 from 1 to 2
+move 1 from 9 to 5
+move 2 from 4 to 3
+move 2 from 2 to 7
+move 2 from 3 to 9
+move 1 from 9 to 1
+move 1 from 9 to 1
+move 5 from 5 to 1
+move 19 from 5 to 6
+move 5 from 1 to 4
+move 1 from 2 to 9
+move 1 from 1 to 3
+move 7 from 5 to 8
+move 1 from 3 to 6
+move 8 from 7 to 3
+move 7 from 4 to 8
+move 3 from 8 to 5
+move 1 from 4 to 1
+move 1 from 9 to 4
+move 1 from 4 to 9
+move 1 from 5 to 2
+move 2 from 5 to 6
+move 2 from 8 to 2
+move 7 from 8 to 1
+move 1 from 1 to 7
+move 3 from 6 to 9
+move 2 from 3 to 2
+move 1 from 2 to 1
+move 1 from 8 to 7
+move 2 from 9 to 6
+move 2 from 9 to 5
+move 1 from 5 to 6
+move 1 from 2 to 8
+move 2 from 1 to 7
+move 1 from 4 to 3
+move 3 from 2 to 5
+move 7 from 1 to 3
+move 10 from 3 to 4
+move 3 from 5 to 4
+move 1 from 3 to 8
+move 3 from 3 to 2
+move 1 from 8 to 1
+move 1 from 1 to 3
+move 3 from 8 to 3
+move 5 from 4 to 6
+move 1 from 2 to 3
+move 4 from 6 to 4
+move 1 from 5 to 7
+move 4 from 3 to 4
+move 1 from 2 to 8
+move 12 from 7 to 6
+move 1 from 8 to 2
+move 2 from 2 to 7
+move 1 from 8 to 4
+move 23 from 6 to 3
+move 14 from 3 to 6
+move 15 from 4 to 6
+move 1 from 8 to 6
+move 10 from 3 to 7
+move 2 from 4 to 2
+move 11 from 7 to 8
+move 2 from 2 to 6
+move 44 from 6 to 9
+move 21 from 9 to 3
+move 12 from 3 to 6
+move 1 from 7 to 4
+move 1 from 4 to 7
+move 9 from 3 to 2
+move 2 from 8 to 6
+move 3 from 2 to 4
+move 17 from 9 to 1
+move 3 from 4 to 6
+move 2 from 2 to 9
+move 4 from 9 to 2
+move 10 from 6 to 9
+move 1 from 7 to 6
+move 4 from 9 to 5
+move 4 from 2 to 4
+move 14 from 1 to 5
+move 4 from 4 to 3
+move 3 from 2 to 9
+move 9 from 9 to 7
+move 1 from 2 to 5
+move 9 from 8 to 5
+move 8 from 7 to 2
+move 4 from 3 to 8
+move 5 from 6 to 2
+move 3 from 1 to 6
+move 1 from 7 to 1
+move 4 from 2 to 4
+move 3 from 6 to 4
+move 3 from 8 to 3
+move 13 from 5 to 2
+move 2 from 3 to 5
+move 12 from 5 to 9
+move 1 from 3 to 5
+move 1 from 5 to 9
+move 1 from 8 to 3
+move 4 from 9 to 5
+move 6 from 4 to 5
+move 12 from 9 to 7
+move 1 from 9 to 3
+move 1 from 3 to 2
+move 12 from 5 to 6
+move 12 from 7 to 2
+move 1 from 3 to 7
+move 1 from 4 to 8
+move 33 from 2 to 8
+move 1 from 7 to 5
+move 1 from 1 to 2
+move 4 from 5 to 4
+move 3 from 2 to 5
+move 34 from 8 to 6
+move 1 from 4 to 3
+move 1 from 5 to 7
+move 1 from 7 to 5
+move 3 from 4 to 9
+move 2 from 9 to 7
+move 1 from 9 to 4
+move 1 from 3 to 7
+move 1 from 5 to 8
+move 1 from 5 to 1
+move 1 from 5 to 7
+move 1 from 4 to 8
+move 1 from 1 to 4
+move 1 from 4 to 2
+move 3 from 7 to 5
+move 2 from 8 to 5
+move 1 from 2 to 8
+move 4 from 6 to 2
+move 1 from 8 to 6
+move 1 from 7 to 9
+move 29 from 6 to 7
+move 4 from 2 to 3
+move 2 from 5 to 8
+move 1 from 9 to 5
+move 2 from 8 to 1
+move 23 from 7 to 5
+move 2 from 6 to 1
+move 23 from 5 to 6
+move 1 from 3 to 6
+move 4 from 5 to 9
+move 2 from 1 to 3
+move 5 from 3 to 8
+move 2 from 6 to 5
+move 2 from 1 to 4
+move 1 from 9 to 8
+move 1 from 9 to 1
+move 1 from 4 to 6
+move 2 from 5 to 6
+move 6 from 7 to 8
+move 2 from 9 to 2
+move 18 from 6 to 5
+move 21 from 6 to 4
+move 1 from 1 to 6
+move 2 from 6 to 7
+move 2 from 7 to 9
+move 2 from 2 to 8
+move 7 from 4 to 3
+move 12 from 5 to 3
+move 1 from 9 to 5
+move 1 from 9 to 4
+move 6 from 5 to 2
+move 17 from 3 to 4
+move 3 from 4 to 3
+move 1 from 2 to 4
+move 5 from 2 to 8
+move 1 from 5 to 8
+move 19 from 8 to 7
+move 1 from 3 to 6
+move 1 from 8 to 4
+move 1 from 6 to 1
+move 15 from 4 to 6
+move 1 from 1 to 4
+move 3 from 3 to 5
+move 4 from 6 to 7
+move 1 from 4 to 7
+move 10 from 6 to 7
+move 16 from 4 to 5
+move 24 from 7 to 2
+move 8 from 7 to 8
+move 1 from 4 to 2
+move 6 from 8 to 7
+move 1 from 8 to 7
+move 1 from 6 to 9
+move 14 from 5 to 4
+move 9 from 7 to 8
+move 4 from 5 to 1
+move 2 from 1 to 5
+move 3 from 8 to 6
+move 2 from 6 to 9
+move 2 from 2 to 8
+move 6 from 2 to 7
+move 3 from 4 to 6
+move 1 from 3 to 4
+move 3 from 5 to 7
+move 1 from 6 to 9
+move 5 from 7 to 2
+move 4 from 9 to 1
+move 1 from 7 to 9
+move 9 from 8 to 4
+move 5 from 1 to 2
+move 2 from 6 to 1
+move 6 from 4 to 7
+move 1 from 7 to 3
+move 1 from 3 to 9
+move 1 from 9 to 7
+move 1 from 6 to 7
+move 9 from 4 to 5
+move 7 from 7 to 9
+move 3 from 7 to 5
+move 1 from 9 to 2
+move 6 from 9 to 8
+move 4 from 4 to 5
+move 1 from 4 to 2
+move 1 from 4 to 2
+move 2 from 1 to 2
+move 1 from 9 to 8
+move 10 from 2 to 4
+move 8 from 2 to 7
+move 12 from 2 to 9
+move 6 from 7 to 4
+move 1 from 1 to 2
+move 8 from 9 to 8
+move 7 from 5 to 1
+move 9 from 4 to 3
+move 14 from 8 to 4
+move 1 from 8 to 4
+move 1 from 1 to 5
+move 1 from 5 to 2
+move 3 from 2 to 4
+move 1 from 7 to 1
+move 1 from 7 to 3
+move 2 from 1 to 7
+move 3 from 5 to 7
+move 2 from 7 to 6
+move 1 from 6 to 5
+move 3 from 7 to 1
+move 1 from 6 to 8
+move 1 from 8 to 7
+move 1 from 3 to 6
+move 1 from 7 to 1
+move 4 from 1 to 4
+move 6 from 3 to 2
+move 3 from 1 to 2
+move 3 from 3 to 6
+move 3 from 2 to 6
+move 6 from 6 to 5
+move 1 from 1 to 4
+move 1 from 9 to 6
+move 5 from 2 to 1
+move 3 from 1 to 2
+move 2 from 9 to 8
+move 3 from 1 to 5
+move 1 from 9 to 7
+move 25 from 4 to 1
+move 1 from 1 to 7
+move 2 from 8 to 3
+move 13 from 1 to 9
+move 2 from 3 to 5
+move 8 from 5 to 9
+move 4 from 2 to 1
+move 2 from 6 to 7
+move 10 from 5 to 9
+move 4 from 7 to 2
+move 2 from 2 to 3
+move 9 from 9 to 2
+move 4 from 4 to 5
+move 4 from 5 to 4
+move 5 from 1 to 4
+move 10 from 4 to 5
+move 22 from 9 to 1
+move 2 from 2 to 7
+move 3 from 2 to 1
+move 6 from 2 to 6
+move 1 from 7 to 1
+move 10 from 5 to 7
+move 15 from 1 to 4
+move 13 from 1 to 5
+move 3 from 6 to 8
+move 1 from 8 to 9
\ No newline at end of file
diff --git a/2022/go/day06/day06.go b/2022/go/day06/day06.go
new file mode 100644 (file)
index 0000000..74bfcf7
--- /dev/null
@@ -0,0 +1,35 @@
+package day06
+
+import (
+       _ "fmt"
+       "sort"
+       "strings"
+
+       "github.com/mpvl/unique"
+)
+
+func Part1(input string) int {
+       for i:=4;i<len(input);i++ {
+               s := input[i-4:i]
+               if s[0] == s[1] || s[0] == s[2] || s[0] == s[3] || s[1] == s[2] || s[1] == s[3] || s[2] == s[3] {
+                       continue
+               } else {
+                       return i
+               }
+       }
+       return 0
+}
+
+func Part2(input string) int {
+       for i:=14;i<len(input);i++ {
+               s := input[i-14:i]
+               sSlice := strings.Split(s,"")
+               length := len(sSlice)
+               sort.Strings(sSlice)
+               unique.Strings(&sSlice)
+               if length == len(sSlice) {
+                       return i
+               }
+       }
+       return 0
+}
diff --git a/2022/go/day06/day06_test.go b/2022/go/day06/day06_test.go
new file mode 100644 (file)
index 0000000..b7853d8
--- /dev/null
@@ -0,0 +1,17 @@
+package day06
+
+import (
+       "testing"
+
+       "github.com/stretchr/testify/require"
+)
+
+func TestPart1(t *testing.T) {
+       r := Part1(`nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg`)
+       require.Equal(t, 10, r)
+}
+
+func TestPart2(t *testing.T) {
+       r := Part2("mjqjpqmgbljsphdztnvjfqwrcgsmlb")
+       require.Equal(t, 19, r)
+}
diff --git a/2022/go/day06/input.txt b/2022/go/day06/input.txt
new file mode 100644 (file)
index 0000000..992da75
--- /dev/null
@@ -0,0 +1 @@
+srjsssgppnssqzszmzjmjdmmqwqcwqccslsjswjssgbsgsnggqtqnnjznndtndnhddfldfdsfswsjsjjptjpttlwlccpnpgngcncnscncsnnwrwmwggsgdgssvbsstzsstqqrjqqlsqlsqscschhclhccznzcnnzzqppjbpjjqzzbwbqqzdqdjjqtjtbtgtqgtgdgwwsjjbwjjzssrsvsttgqtgglgplgpllcrcncssbrbgrbrllsqlsltthshrrnddwzdzdbbrppdvdqvvpvdvdsslbbmnbnjjrdrnntzzftzftttrsshpspvvrzzqzwzhzszbzjjwqwvqqglgflfwfrfprpddfvdffhzztwtppwwwztzsznzmnnbvbbtqqdhqdqdfffnjnmnlmljmlmnlnddzbbdgdqdnqqtjjtnthttvwwtrwwwgffqcfchfcfwcczhhgjhghpgpwgwffhghzghhtftntnnmlnmlmddqbbfwbfwbwvvfssrggptpltpllbcbzczzlccjgcgvcczjzvvvdtvdvqdqwdqdvdjvddjfdjjqmmfgfsftfzfwzwzfftmfmmqdqccjqcqwwflwlccpssvzzzbnbjnbjjgtgpttbwbrbwrwvrrwccgrgrvvpjvvznvvhddtdldpldppmlplltdllhqhpqhqqbpptgpgjgqjgjffvfdvdttsrsllhzlzrrdrnrjrddqbbjrrvrsstgsttjqjhjbhhnmndmmnrmnnrggmtgmmhshjjfqjjtqtstpstppggtzzrsrwwqffvzvzvqqggqsqtstszttpvtvvvddcncvncvchhnsnpsnnlmnnmqnqjjfwfccmwmbwbswbswwghhzrrptptbbjbtjjgdjgjrgrwgwlglblbnlnbbwnnpbnbmbtmtvvhjjlwlhhszslldwlwdllhjhghqghhqpplhhtjhhnhqhlhjhmmlhlmmrpptvvcczfcccwgcccpgpspdpccfhchffbjbzzwppfbbstbtltpllcssnnctnnqcqhhclhccvlvlffnjjwbwfbfttwvvdvnnnsrstrtmtfthtzzcvzvhzzpmpfpmmmwggdbdqdbbjnbbdqbbrnnnprrwbbcwbbpjjprjjzzvwwvrrthhqvhvnhhzmzszrszsjssclcjjbhjbhjbhjbjhhzbbzttnrnssrbrjbrjjmsmffdlflfzfbzzmtztdthdhldhlddnccgbbmtbbsbzsbzzcsszpzfffprfpfzfrzzhvhffsmmqtjwgjbzhnmrslrmgfjpqcllcgsjdhrshqtlgmqqtfmswfzwtnrswtzdjzclcfmltqgdhcsgvzrdltgfbtqclpppvbqnbqmlhmdbsjbwbdllzpnrwfhmnlgvdwsdjsznnhqzhwntjvcpzdrfwmwwdrttdvzspmbmqggmlmsvwgcjgpvcmplqwfjgpghnfpbctnfhcgngcbdmzhlpcnjpmczzsgfgrdftrzgvmmpdmgcrpcdrjsgczpfjnwpdjpntdngdjwctvcbsjmfwvtsrlhvpswppmfwrwzsbsgbjvljzqjjldmnqnmwsmqnmhmqhhttppbpqlvdcvdbhmbnjzztjrdjdzlvmbdrghtftwdpcwwblsjbgnzwtpztmtmnrpsvzfzncqmrvhcbqcvqvnlngdcllrqlbhjttnmjmhfhdzmjmplcfdqpmwblzsnmpczwcnggcwdvgnjcrrtmpwwqdqpvtbzpdbfnbfcfllntqjlslcsznjvzvsbntrtzwhcbtdmbmwttvhdvdtvrcmprcrrjlgsqddrsmwsrbtbpjrmlbrnsdrjfhjnqjtgjmhzjbjnprvmhtjcdbztwqmrlfflfmcslshtwmwhgvbdslgjhzjlglhllsdphlzngjfwfrlwpnqfhghnqhzhgrszbcwjvlrtmshntszsqplvfbccjwctgtfmqgqjdlgdbwhgvctqtcgfdwvqdwqzddmsbrpftzpqztgzbnplvhftmgpdthnrdhqbltbrmhpcqsfccmqzwmrbnbgbjspslwpjhdqspssqdtnssmjmvzwwfstgzzjrmfczdlznwqpdhbsjqddvffcgfhfdqdrlwcsgcsszdtpqbbsthpwbhdfzmgmcdggfcwcmzfjnfbzbccjhvwhbwfslnqnrwhgrwtlnmrmncnjtbjbdlmqsczppgbcmsdrwlrpjbgrmnhqqfhhsdhmdmpvvpjrnzsvzctmqhpzcvcjfgtlfvqvnvlnprmgrsvrrvtjfndqfsvqdsfbcwlbglmfhfhcfgqdfmclnzhdtppgzzsqgjqncqrbdhlhdjqwjpmbdnfmgdgwbwmnlngnmrhcgqwzvmbjzdvsspjwwdtpnvpftdlqlzfgtscfczsvbrtrqqpgqlvmrtddqplbzsswbgpdzpqfvqpqbndblghmdhmnctdnjbgglmrlvmrmsfgntfdwvqcvvlvbcnwrctvjqhmnsjqccwltbfqpqpmwsfvmnnfqmlmlcchqcdtbvqwcpptvfwrwtbdrlsgnwpmjgnwlprzqjlwqmtmjglbrzlgfbsghwqdmwhrcmfwdmzmflsbngtgndftdpzsqvgqdsfdhplmfcmwpbtvcdmpghmfwqjvhdhfpmbrqpvnbhlftgdtprlztrgnlcldfpjqjqdfrvqtcnzrtjcgzgsslzghlnfhwwjwzdsmpsczclrfmnqjvfmvsqpntsnnnlrfswqtrppzhqgjzlzvrrbhhfhchhvgztpgctcsgssvttszsrdwzwrbmwmspgqhmmfnzqqdbmnbltdmrsvqgddltwczbbjcmplncspgqgmzrndhttsrbvqbpbvhshfqrpqgmmdbhmmtccjcmntmpqhrvhnfnlqqbctsnfzjbphhqwmztgbhqqlbctbsfcszbggzrlcdhwddtjgtqhppzgjsqcddwjsngjrcdflmgwgfnzhjtcwgbqvpwmpgcpdwvqgswwfzcnjgmdpffmqczmsqgpthpmsjlwnrcbzrfshvwftzllwrmfccmlpjnmpjdfpcvjgjpznllmqjwpcflgqgdljtbbjvjlvhhmtvzfnjfnnwrvtlfdbhqphrjghtmlsrplqscsnvjvqdslsbsfzzrjfmchplzgjgdqvzhfphvsjfvnqlgmjfzhrdlmmvfntnzdvrnwqshsmtjnqmwzgpbbzszrsqcvlzjwnmgjhmfqrbvgmfqpswctmvpfcghvdqgstglmzvpfhzfzvhqqdmvrvrttlpwwhqgddzqlrvvdffqtznvlfgjhhmvbmtzjqnnhqzrtbzpqcwpngrdcndcgzwhzgtfwbmwbrpvvczczhwcqwsqzqbqvqftcswtcbzdbpccjhtwbpnwlwwwqwscptlwshrdbmmdcgrmpnnwgjwzszwwdwctfspbfqvdjqtrflshrqlbfgpnrmbszwjpcdzbggphgplcgvwljprzmtncsvfwqchttndhpnzmtdvtjqtcsddtqvcmztmjgwqvjhflrjjtnvfpjrnlvzvwvrpbhrzslmrqqzqhnzqnvtqppmncddphbwwsjczmphsrlltzndtqjgdlqgpnlfcvwntstmrgcrjzmmllpwldnwmwzpvzctmhszspcvtgnqthszzsmtdnzwtfddfctpjhscbqgwfpqmzpvqrzvtbrdjzrqprdgbpmzzfbgqcvcdtsfrffcpqwtvdwvtcqlcsdrzntgrhrspznndslmnvptlphpdqgbblfhmgbpmmfwqzlhvzshhpzgfjldqclngbcbrmmnqqvqmwdnjsglsggqfgjldqfbsqgtrwmpdffqlcwwlfhlpqfgwtssnjwzhgvtwqzmhmgwzwmcggmpmrzqrcsmflqsrbnzvdmjcdbnscstqrqhvddsbjpzwsvzswqhcqmgzlvfcnzjrrffzphmrvdbhqbrwpsfqvfqwhqhcgfvfsfttzcdsrjgjwcgvhllszmplmvgczqsbfldnbvrnqccbprjjdwhmqpdjjrnfdlhzdvlfmrldjlqclbjrrtjfsflphzdcdpfpr
\ No newline at end of file
diff --git a/2022/go/day07/day07.go b/2022/go/day07/day07.go
new file mode 100644 (file)
index 0000000..b2e007f
--- /dev/null
@@ -0,0 +1,112 @@
+package day07
+
+import (
+       "strings"
+
+       "adventofcode2022/utils"
+)
+
+type dir struct {
+       name   string
+       files  map[string]int
+       subdir map[string]*dir
+       parent *dir
+       size   int
+}
+
+func Part1(input string) int {
+       root := dir{name: "/", files: map[string]int{}, subdir: map[string]*dir{}, parent: nil}
+       root.parse(input)
+       sum := 0
+       find_dirs_part1(&root, 100000, &sum)
+       return sum
+}
+
+func Part2(input string) int {
+       root := dir{name: "/", files: map[string]int{}, subdir: map[string]*dir{}, parent: nil}
+       root.parse(input)
+       unused := 70000000 - root.size
+       need := 30000000 - unused
+       dir_size := 0
+       find_dirs_part2(&root, need, &dir_size)
+       return dir_size
+}
+
+func find_dirs_part1(d *dir, size int, sum *int) {
+       // recurse into subdir
+       for _, subdir := range d.subdir {
+               if (subdir.size) <= size {
+                       *sum += subdir.size
+               }
+               find_dirs_part1(subdir, size, sum)
+       }
+}
+
+func find_dirs_part2(d *dir, size int, sum *int) {
+       // recurse into subdir
+       for _, subdir := range d.subdir {
+               if (subdir.size) >= size && (*sum == 0 || (subdir.size) < *sum) {
+                       *sum = subdir.size
+               }
+               find_dirs_part2(subdir, size, sum)
+       }
+}
+
+func (root *dir) parse(input string) {
+       c := root
+
+       for _, line := range strings.Split(input, "\n") {
+               pieces := strings.Split(line, " ")
+               if pieces[0] == "$" {
+                       if pieces[1] == "cd" {
+                               if pieces[2] == ".." {
+                                       c = c.parent
+                               } else if pieces[2] == "/" {
+                                       c = root
+                               } else {
+                                       c = c.addDirectoryIfMissing(pieces[2])
+                               }
+                       } else if pieces[1] == "ls" {
+                               // no need to do anything
+                       } else {
+                               panic("oops")
+                       }
+               } else if pieces[0] == "dir" {
+                       c.addDirectoryIfMissing(pieces[1])
+               } else {
+                       c.addFileIfMissing(pieces[1], utils.MustAtoi(pieces[0]))
+               }
+       }
+}
+
+func (d *dir) addDirectoryIfMissing(name string) *dir {
+       t, ok := d.subdir[name]
+       if !ok {
+               t = &dir{
+                       name:   name,
+                       files:  map[string]int{},
+                       subdir: map[string]*dir{},
+                       parent: d,
+               }
+               d.subdir[name] = t
+       }
+       return t
+}
+
+func (d *dir) addFileIfMissing(name string, size int) {
+       t, ok := d.files[name]
+       if ok {
+               if t != size {
+                       panic("oops")
+               }
+       } else {
+               current := d
+               d.files[name] = size
+               
+               for current.name != "/" {
+                       current.size += size
+                       current = current.parent
+               }
+               current.size += size
+       }
+}
\ No newline at end of file
diff --git a/2022/go/day07/day07_test.go b/2022/go/day07/day07_test.go
new file mode 100644 (file)
index 0000000..ec74f8a
--- /dev/null
@@ -0,0 +1,63 @@
+package day07
+
+import (
+       "testing"
+
+       "github.com/stretchr/testify/require"
+)
+
+func TestPart1(t *testing.T) {
+       r := Part1(
+`$ cd /
+$ ls
+dir a
+14848514 b.txt
+8504156 c.dat
+dir d
+$ cd a
+$ ls
+dir e
+29116 f
+2557 g
+62596 h.lst
+$ cd e
+$ ls
+584 i
+$ cd ..
+$ cd ..
+$ cd d
+$ ls
+4060174 j
+8033020 d.log
+5626152 d.ext
+7214296 k`)
+       require.Equal(t, 95437, r)
+}
+
+func TestPart2(t *testing.T) {
+       r := Part2(
+`$ cd /
+$ ls
+dir a
+14848514 b.txt
+8504156 c.dat
+dir d
+$ cd a
+$ ls
+dir e
+29116 f
+2557 g
+62596 h.lst
+$ cd e
+$ ls
+584 i
+$ cd ..
+$ cd ..
+$ cd d
+$ ls
+4060174 j
+8033020 d.log
+5626152 d.ext
+7214296 k`)
+       require.Equal(t, 24933642, r)
+}
diff --git a/2022/go/day07/input.txt b/2022/go/day07/input.txt
new file mode 100644 (file)
index 0000000..c2680f2
--- /dev/null
@@ -0,0 +1,1051 @@
+$ cd /
+$ ls
+dir ccjp
+328708 hglnvs.bsh
+dir hpsnpc
+dir pcb
+dir pntzm
+dir pzg
+dir thfgwwsp
+$ cd ccjp
+$ ls
+159990 dlz
+dir mbtsvblj
+165076 nppbjl.qhg
+$ cd mbtsvblj
+$ ls
+34806 frqsf.nsv
+dir ppq
+dir ptht
+dir rgmvdwt
+$ cd ppq
+$ ls
+266252 dhzp
+$ cd ..
+$ cd ptht
+$ ls
+dir jbnj
+dir zcbnwhzd
+$ cd jbnj
+$ ls
+dir clscr
+145780 zwtwf.zfz
+$ cd clscr
+$ ls
+249531 dhzp
+$ cd ..
+$ cd ..
+$ cd zcbnwhzd
+$ ls
+dir mbtsvblj
+$ cd mbtsvblj
+$ ls
+258527 pjhvzjt.brz
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd rgmvdwt
+$ ls
+166021 hdb
+115350 ljpzpdbf
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd hpsnpc
+$ ls
+6334 bfdfbrh.vff
+311949 qphlw.whm
+$ cd ..
+$ cd pcb
+$ ls
+dir ccjp
+201615 gbpzf.gmg
+dir lhth
+319302 lrmj.rmm
+dir mwl
+303062 pvftq
+$ cd ccjp
+$ ls
+10932 ccjp
+80040 jjcggmr.ljs
+299982 jrqwhsn.ptv
+280655 ljpzpdbf
+268430 mdvvj.dlf
+dir mvhhlg
+dir ppfq
+dir rdgngdm
+dir smftmb
+dir tqwchhd
+$ cd mvhhlg
+$ ls
+146902 fwhcbfr.shd
+$ cd ..
+$ cd ppfq
+$ ls
+263452 hdb
+$ cd ..
+$ cd rdgngdm
+$ ls
+46355 wlgshdgl
+$ cd ..
+$ cd smftmb
+$ ls
+56834 mhs
+325038 ppmtvcj
+dir rzcmwl
+194645 ztwqq.jfw
+$ cd rzcmwl
+$ ls
+dir btfhswwf
+dir jrd
+dir ndzfvl
+$ cd btfhswwf
+$ ls
+62811 ccjp.clj
+$ cd ..
+$ cd jrd
+$ ls
+184948 fqqg.pfc
+dir mshf
+136894 nbvbr
+$ cd mshf
+$ ls
+314602 ppmtvcj
+$ cd ..
+$ cd ..
+$ cd ndzfvl
+$ ls
+43177 hhcfpnmg.njm
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd tqwchhd
+$ ls
+294014 dlz
+122061 ljpzpdbf
+54178 ppmtvcj.wlp
+dir trm
+dir zcbnwhzd
+$ cd trm
+$ ls
+279737 ccjp.mhz
+$ cd ..
+$ cd zcbnwhzd
+$ ls
+88477 dhnwjlzj
+143989 dhzp
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd lhth
+$ ls
+79532 tlls
+$ cd ..
+$ cd mwl
+$ ls
+dir frc
+dir lqqqppm
+178576 prpjmrw
+$ cd frc
+$ ls
+dir cvm
+244013 dhzp
+29325 gnh
+264555 hdb
+$ cd cvm
+$ ls
+196619 hhcfpnmg.njm
+$ cd ..
+$ cd ..
+$ cd lqqqppm
+$ ls
+dir jdznl
+38505 nqv
+$ cd jdznl
+$ ls
+85492 ctt
+228912 dfbgtqj.vsb
+136077 nnwgd.vjn
+254459 zrrzsfss
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd pntzm
+$ ls
+dir hnnhdd
+dir mbtsvblj
+dir vmdlwdj
+$ cd hnnhdd
+$ ls
+35908 fjp
+119221 ljpzpdbf
+210488 whhpztz.lgt
+$ cd ..
+$ cd mbtsvblj
+$ ls
+dir clfpc
+dir csqcnmtc
+18524 mbtsvblj
+dir zcrrtlh
+$ cd clfpc
+$ ls
+dir jffq
+dir qpsfrhld
+89569 tdzfqpz.wvs
+$ cd jffq
+$ ls
+dir dpngpgr
+dir htbf
+$ cd dpngpgr
+$ ls
+128899 ccjp.nbs
+$ cd ..
+$ cd htbf
+$ ls
+90381 ljpzpdbf
+$ cd ..
+$ cd ..
+$ cd qpsfrhld
+$ ls
+dir bgrb
+dir ddtlcfz
+54115 dlz
+154299 hhcfpnmg.njm
+59452 jwc.pwg
+dir mbtsvblj
+$ cd bgrb
+$ ls
+119046 ccjp.zmf
+dir qsnng
+$ cd qsnng
+$ ls
+195412 vjdh.cqv
+$ cd ..
+$ cd ..
+$ cd ddtlcfz
+$ ls
+dir ftfch
+26717 mbtsvblj
+157679 mbtsvblj.rfb
+299928 qmg
+dir trq
+dir wjhjlpr
+$ cd ftfch
+$ ls
+50242 dhzp
+58846 dlz
+dir hhwsrzhv
+$ cd hhwsrzhv
+$ ls
+dir bjnn
+67610 dhzp
+dir mbtsvblj
+205664 tmcfmshb
+$ cd bjnn
+$ ls
+199806 dlz
+$ cd ..
+$ cd mbtsvblj
+$ ls
+dir ffzjcshp
+$ cd ffzjcshp
+$ ls
+dir ppmtvcj
+$ cd ppmtvcj
+$ ls
+184744 dlz
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd trq
+$ ls
+278471 ccjp
+$ cd ..
+$ cd wjhjlpr
+$ ls
+dir wzwqrfhv
+$ cd wzwqrfhv
+$ ls
+262877 ccjp
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd mbtsvblj
+$ ls
+243142 ccjp.szb
+306673 lmstdpfc.nww
+dir nlsprnh
+dir nmzwtwwc
+dir rbpbl
+$ cd nlsprnh
+$ ls
+200708 stbjphg.hcs
+$ cd ..
+$ cd nmzwtwwc
+$ ls
+323366 vzq.pcj
+$ cd ..
+$ cd rbpbl
+$ ls
+59872 fmnmsjr.svf
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd csqcnmtc
+$ ls
+16652 ccjp
+dir fsfd
+37144 hdb
+dir mbtsvblj
+dir mwl
+66387 nljlpbjq
+dir ppmtvcj
+120839 rgclgwnq
+$ cd fsfd
+$ ls
+105721 qqvchq.mwh
+$ cd ..
+$ cd mbtsvblj
+$ ls
+dir cdzgtll
+dir dfgd
+dir fbfr
+165975 mbtsvblj
+174541 ppmtvcj
+dir vwgrpswj
+$ cd cdzgtll
+$ ls
+163523 dhzp
+124219 dlz
+199796 hdb
+$ cd ..
+$ cd dfgd
+$ ls
+173064 ccjp.cbt
+dir cdqc
+dir fzrm
+dir grcs
+87000 mbtsvblj.zrl
+dir njvgs
+dir ppmtvcj
+210984 rhtslcwt.wgt
+dir vws
+$ cd cdqc
+$ ls
+178924 hdb
+$ cd ..
+$ cd fzrm
+$ ls
+dir bjwtbc
+211229 dhzp
+dir dtslj
+76461 mbtsvblj.mtw
+317618 mmz.mqq
+dir mwl
+163587 vwgq
+$ cd bjwtbc
+$ ls
+9891 hhcfpnmg.njm
+dir mwl
+$ cd mwl
+$ ls
+203337 glwp.dls
+112753 mwl.qph
+$ cd ..
+$ cd ..
+$ cd dtslj
+$ ls
+277817 hhcfpnmg.njm
+$ cd ..
+$ cd mwl
+$ ls
+90781 mhnrwpmg.svv
+$ cd ..
+$ cd ..
+$ cd grcs
+$ ls
+286144 rnfqhs
+$ cd ..
+$ cd njvgs
+$ ls
+dir bmhdth
+dir ccjp
+dir mwl
+$ cd bmhdth
+$ ls
+154455 ppmtvcj.hwq
+$ cd ..
+$ cd ccjp
+$ ls
+215864 fcwjtzhs.vqn
+$ cd ..
+$ cd mwl
+$ ls
+139000 fnjztz
+$ cd ..
+$ cd ..
+$ cd ppmtvcj
+$ ls
+45041 jzfnmdw.jms
+dir zstzfs
+$ cd zstzfs
+$ ls
+dir qsfsj
+$ cd qsfsj
+$ ls
+34771 rsv
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd vws
+$ ls
+98036 pjs
+103603 szszjfv
+211083 ztd
+$ cd ..
+$ cd ..
+$ cd fbfr
+$ ls
+dir dshrpf
+216109 hbw.jhj
+319355 hdhl
+dir ltf
+210950 qstlgvb
+dir thhncv
+316300 zfgh
+$ cd dshrpf
+$ ls
+dir nll
+dir qrsg
+$ cd nll
+$ ls
+45935 flmvswv.rll
+4161 hhcfpnmg.njm
+82301 sww.dwj
+dir tqdmtp
+46608 tzrn.qrt
+101463 zcbnwhzd.mpm
+$ cd tqdmtp
+$ ls
+280430 dhzp
+$ cd ..
+$ cd ..
+$ cd qrsg
+$ ls
+dir htrvnvz
+$ cd htrvnvz
+$ ls
+dir mbtsvblj
+$ cd mbtsvblj
+$ ls
+235270 dlz
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ltf
+$ ls
+dir pcbc
+dir wwjnwbjj
+dir zcbnwhzd
+$ cd pcbc
+$ ls
+140010 mbtsvblj.hqd
+$ cd ..
+$ cd wwjnwbjj
+$ ls
+dir mwl
+$ cd mwl
+$ ls
+dir pddbdp
+$ cd pddbdp
+$ ls
+27497 dlz
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd zcbnwhzd
+$ ls
+302364 nrgpwm.cbb
+$ cd ..
+$ cd ..
+$ cd thhncv
+$ ls
+299769 hdb
+$ cd ..
+$ cd ..
+$ cd vwgrpswj
+$ ls
+dir jgt
+dir mwl
+293673 mwl.pwl
+$ cd jgt
+$ ls
+282773 hhcfpnmg.njm
+$ cd ..
+$ cd mwl
+$ ls
+288944 jfnjdtr.ssj
+186368 wfr
+dir zrtvvf
+$ cd zrtvvf
+$ ls
+82162 gtz.gsc
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd mwl
+$ ls
+98218 htc.qjr
+dir mghhqrtn
+dir qct
+$ cd mghhqrtn
+$ ls
+220446 dlz
+36230 pwwlwv.crn
+$ cd ..
+$ cd qct
+$ ls
+33534 hdb
+27140 jpwqvbs.mvr
+60637 mlqtp
+12143 nlvtp.qjn
+152733 nqjqzt
+$ cd ..
+$ cd ..
+$ cd ppmtvcj
+$ ls
+dir ccjp
+297245 zcbnwhzd
+$ cd ccjp
+$ ls
+128473 wcw.dng
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd zcrrtlh
+$ ls
+27488 bcbnmhq
+dir dhsmmlt
+dir fgqbpcn
+$ cd dhsmmlt
+$ ls
+42514 cvfwqnfl
+252570 dlz
+145814 ppmtvcj.snb
+294613 rslsh.slv
+186477 vwd.spz
+dir wffbp
+$ cd wffbp
+$ ls
+dir mbtsvblj
+dir nvq
+150447 ppmtvcj.hzc
+34904 whzpsbqp.clq
+dir zcbnwhzd
+$ cd mbtsvblj
+$ ls
+65132 cmmlw.bmq
+310866 cqrtmpdp.pjq
+dir mbtsvblj
+212527 mbtsvblj.spw
+232198 ngmltt.qwl
+dir pbqh
+dir ppwgsp
+dir qqfsb
+223322 tzsmvh
+$ cd mbtsvblj
+$ ls
+dir bzpdz
+dir mbtsvblj
+dir pwnn
+dir zcbnwhzd
+$ cd bzpdz
+$ ls
+272769 gtmftv
+280597 hhcfpnmg.njm
+151008 nmgvrhr.mvp
+$ cd ..
+$ cd mbtsvblj
+$ ls
+64862 czn
+309781 dhzp
+253325 dlz
+dir dqnr
+dir fgd
+139779 ghtzv
+255567 rml.rhm
+dir srfzjfw
+$ cd dqnr
+$ ls
+302986 cjnwm.lrb
+158871 frhjlp.rnn
+180385 nrlmq
+$ cd ..
+$ cd fgd
+$ ls
+158213 msjrcl.dsh
+$ cd ..
+$ cd srfzjfw
+$ ls
+dir jfnd
+210830 ljpzpdbf
+dir mbtsvblj
+dir zcrrvpg
+$ cd jfnd
+$ ls
+300883 zvtdj.srv
+$ cd ..
+$ cd mbtsvblj
+$ ls
+287467 cjdm.whc
+233084 hpfgtnts
+dir zcbnwhzd
+$ cd zcbnwhzd
+$ ls
+79744 dlz
+$ cd ..
+$ cd ..
+$ cd zcrrvpg
+$ ls
+dir jrbcqlct
+dir srpm
+$ cd jrbcqlct
+$ ls
+325945 dlz
+$ cd ..
+$ cd srpm
+$ ls
+90698 ngw.fhm
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd pwnn
+$ ls
+104826 ppmtvcj.jtm
+$ cd ..
+$ cd zcbnwhzd
+$ ls
+145508 fnr.dgt
+256683 gwdl.vfl
+dir mdv
+44255 mqdv.cdb
+79723 rgvcf
+dir sjdh
+88945 wdgq.hfm
+dir zpm
+$ cd mdv
+$ ls
+231290 dlz
+3468 hdb
+95091 mcm
+67779 mwl.ncb
+dir ppf
+dir rfwwtjdn
+143730 slrv.qdl
+dir sqbdvppf
+$ cd ppf
+$ ls
+73809 rgdtlp
+$ cd ..
+$ cd rfwwtjdn
+$ ls
+255306 dhzp
+306865 zbnmtcgr.ddf
+237019 zcbnwhzd.szn
+$ cd ..
+$ cd sqbdvppf
+$ ls
+dir ccjp
+dir mbtsvblj
+142955 str
+dir whtrbcqn
+93407 zcbnwhzd.ctr
+$ cd ccjp
+$ ls
+29914 cwtvtcnp.tft
+295537 rvlb
+$ cd ..
+$ cd mbtsvblj
+$ ls
+262652 ccjp.wbn
+297839 mbtsvblj.gnz
+249019 pqsqjg.vwr
+$ cd ..
+$ cd whtrbcqn
+$ ls
+dir ccjp
+dir hslmvvb
+51040 vzcsfcwf
+$ cd ccjp
+$ ls
+39489 slps
+$ cd ..
+$ cd hslmvvb
+$ ls
+148628 gpwnf.qtd
+dir jrl
+11814 qtjtsvgg.ltz
+$ cd jrl
+$ ls
+dir scwlmjzm
+$ cd scwlmjzm
+$ ls
+119717 vhpsrbzw.jnh
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd sjdh
+$ ls
+43495 srwzspsl
+$ cd ..
+$ cd zpm
+$ ls
+137218 mwl.pzt
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd pbqh
+$ ls
+202610 dlz
+dir vdrqc
+$ cd vdrqc
+$ ls
+202958 mzzmjrt
+$ cd ..
+$ cd ..
+$ cd ppwgsp
+$ ls
+248541 pzvtdl.lcc
+$ cd ..
+$ cd qqfsb
+$ ls
+211390 mbtsvblj.fvh
+241455 mwl.bzl
+$ cd ..
+$ cd ..
+$ cd nvq
+$ ls
+74730 hhcfpnmg.njm
+257109 ljpzpdbf
+8864 zcbnwhzd.ctj
+$ cd ..
+$ cd zcbnwhzd
+$ ls
+307501 ccjp
+dir dfgbztqr
+dir mwl
+248526 pmhtz
+dir rwmzdt
+$ cd dfgbztqr
+$ ls
+18261 hdb
+dir mwl
+dir ppmtvcj
+$ cd mwl
+$ ls
+36787 hdv.vfs
+283104 zrvbsht.fmm
+$ cd ..
+$ cd ppmtvcj
+$ ls
+208809 ljpzpdbf
+$ cd ..
+$ cd ..
+$ cd mwl
+$ ls
+195369 mgfvgw
+146522 mwl
+78589 sfthn
+$ cd ..
+$ cd rwmzdt
+$ ls
+10176 hdb
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd fgqbpcn
+$ ls
+169227 dhzp
+dir dwsgcrz
+140391 pjjln.ngc
+162589 ppmtvcj.ngb
+199626 rcgbjn.wfv
+dir snrl
+dir vfnrs
+$ cd dwsgcrz
+$ ls
+300751 fjlw.wtp
+$ cd ..
+$ cd snrl
+$ ls
+16142 ccjp.jpw
+150389 cmbnljt.ljq
+52600 gqggd.dwm
+$ cd ..
+$ cd vfnrs
+$ ls
+217267 bwlpdfv.hzh
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd vmdlwdj
+$ ls
+29199 bcgjdpj.qcj
+172894 jjgrcd.cvf
+dir ngpnmbqz
+296193 ppmtvcj.bfr
+dir tfvhhpn
+36476 wqzst.wcj
+$ cd ngpnmbqz
+$ ls
+dir gnsm
+dir ntsgrm
+$ cd gnsm
+$ ls
+dir rjzngs
+dir tvv
+$ cd rjzngs
+$ ls
+dir dpfcw
+dir spmhrb
+$ cd dpfcw
+$ ls
+181566 mgdjjd.pqg
+$ cd ..
+$ cd spmhrb
+$ ls
+163198 hhcfpnmg.njm
+$ cd ..
+$ cd ..
+$ cd tvv
+$ ls
+131443 hhcfpnmg.njm
+$ cd ..
+$ cd ..
+$ cd ntsgrm
+$ ls
+246786 dlz
+12841 pzbgrn
+$ cd ..
+$ cd ..
+$ cd tfvhhpn
+$ ls
+196923 dhzp
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd pzg
+$ ls
+262706 ppbqssj.hjj
+$ cd ..
+$ cd thfgwwsp
+$ ls
+dir dsvc
+dir fbg
+dir flgmdj
+516 gwppndsl
+dir mwl
+dir qfhsr
+dir tgj
+dir wdmzc
+272804 zcbnwhzd
+dir zrfmzrl
+$ cd dsvc
+$ ls
+22089 dlz
+$ cd ..
+$ cd fbg
+$ ls
+289639 hhcfpnmg.njm
+$ cd ..
+$ cd flgmdj
+$ ls
+293793 fqrpf
+$ cd ..
+$ cd mwl
+$ ls
+159673 dhzp
+dir ftthgr
+270973 hhcfpnmg.njm
+dir jjrq
+279365 ljpzpdbf
+dir mglzfcq
+101769 pnz
+18964 rdl.wqf
+$ cd ftthgr
+$ ls
+dir ccrvnht
+170369 ljltl.slv
+dir mwl
+dir zqts
+65217 zvnhmqpz.cqb
+$ cd ccrvnht
+$ ls
+164437 hdb
+$ cd ..
+$ cd mwl
+$ ls
+dir cjsc
+dir zcbnwhzd
+dir zwzb
+$ cd cjsc
+$ ls
+91883 hhcfpnmg.njm
+203008 nfmvr
+$ cd ..
+$ cd zcbnwhzd
+$ ls
+dir mbtsvblj
+$ cd mbtsvblj
+$ ls
+187513 ljpzpdbf
+$ cd ..
+$ cd ..
+$ cd zwzb
+$ ls
+138631 ljpzpdbf
+dir sjngjp
+$ cd sjngjp
+$ ls
+52116 ccjp.ttc
+157900 fptzbpp.sdm
+89462 hhcfpnmg.njm
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd zqts
+$ ls
+162402 hdb
+$ cd ..
+$ cd ..
+$ cd jjrq
+$ ls
+dir bffvw
+dir czbwf
+13447 dlz
+dir gjh
+dir hjs
+$ cd bffvw
+$ ls
+139679 dqqtq.lnb
+dir mwl
+13310 sjln.zgv
+243329 srmghrt.ffl
+72108 ssm.tph
+$ cd mwl
+$ ls
+dir fdlmfjt
+dir jms
+122108 nqwrj
+$ cd fdlmfjt
+$ ls
+75969 hdtbcsfc.vmz
+$ cd ..
+$ cd jms
+$ ls
+297556 hhcfpnmg.njm
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd czbwf
+$ ls
+320541 ccjp
+$ cd ..
+$ cd gjh
+$ ls
+164281 dhzp
+286094 vjs
+$ cd ..
+$ cd hjs
+$ ls
+dir cbdzvd
+41353 ccjp
+dir gbs
+114686 hdb
+dir hmtpm
+278709 ljpzpdbf
+dir ppmtvcj
+292308 zcmlbbbc.mpp
+86096 zttwct
+$ cd cbdzvd
+$ ls
+153733 dhzp
+$ cd ..
+$ cd gbs
+$ ls
+dir nfnb
+$ cd nfnb
+$ ls
+dir hgm
+$ cd hgm
+$ ls
+233469 ljpzpdbf
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd hmtpm
+$ ls
+14247 mwl
+$ cd ..
+$ cd ppmtvcj
+$ ls
+dir jcwhvcf
+241390 mwl
+$ cd jcwhvcf
+$ ls
+198254 wddq.rgp
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd mglzfcq
+$ ls
+dir bsplglmj
+21700 fhflt.vgq
+56724 lpmcbzrj
+222733 qnbr
+256952 thvbqb.gtv
+$ cd bsplglmj
+$ ls
+dir zcbnwhzd
+$ cd zcbnwhzd
+$ ls
+dir mqzqz
+$ cd mqzqz
+$ ls
+75000 ppmtvcj
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd qfhsr
+$ ls
+249770 gfv.cnw
+70204 qlvwhff.jhm
+$ cd ..
+$ cd tgj
+$ ls
+243926 mwl.bfv
+$ cd ..
+$ cd wdmzc
+$ ls
+19843 hdb
+264263 jbqf.str
+261303 qrvt.lbr
+$ cd ..
+$ cd zrfmzrl
+$ ls
+52067 lnfgp.nhl
\ No newline at end of file
diff --git a/2022/go/day08/day08.go b/2022/go/day08/day08.go
new file mode 100644 (file)
index 0000000..2201c97
--- /dev/null
@@ -0,0 +1,89 @@
+package day08
+
+import (
+       _ "fmt"
+
+       "adventofcode2022/utils"
+       "adventofcode2022/utils/inputs"
+       "adventofcode2022/utils/grid2d"
+)
+
+func Part1(input string) int {
+       grid := inputs.ToGrid2D(input, "\n", "", -1, utils.MustAtoi)
+       visible := grid2d.NewGrid(grid.SizeX(), grid.SizeY(), false)
+
+       for j := 0; j < grid.SizeY(); j++ {
+               for i := 0; i < grid.SizeX(); i++ {
+                       directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}
+                       for _, dir := range directions {
+                               v := true
+                               x := i
+                               y := j
+                               for {
+                                       x += dir[0]
+                                       y += dir[1]
+                                       if x < 0 || x >= grid.SizeX() || y < 0 || y >= grid.SizeY() {
+                                               break
+                                       }
+                                       if grid.Get(i, j) <= grid.Get(x, y) {
+                                               v = false
+                                               break
+                                       }
+                               }
+                               if v {
+                                       visible.Set(i, j, true)
+                                       break
+                               }
+                       }
+               }
+       }
+
+       sum := 0
+       for j := 0; j < visible.SizeY(); j++ {
+               for i := 0; i < visible.SizeX(); i++ {
+                       if visible.Get(i, j) {
+                               sum++
+                       }
+               }
+       }
+       return sum
+}
+
+func Part2(input string) int {
+       grid := inputs.ToGrid2D(input, "\n", "", -1, utils.MustAtoi)
+       scenicScore := grid2d.NewGrid(grid.SizeX(), grid.SizeY(), 1)
+
+       for j := 0; j < grid.SizeY(); j++ {
+               for i := 0; i < grid.SizeX(); i++ {
+                       directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}
+                       for _, dir := range directions {
+                               score := 0
+                               x := i
+                               y := j
+                               for {
+                                       x += dir[0]
+                                       y += dir[1]
+                                       if x < 0 || x >= grid.SizeX() || y < 0 || y >= grid.SizeY() {
+                                               break
+                                       }
+                                       if grid.Get(i, j) <= grid.Get(x, y) {
+                                               score++
+                                               break
+                                       }
+                                       score++
+                               }
+                               scenicScore.Set(i, j, scenicScore.Get(i,j) * score)
+                               }
+               }
+       }
+       
+       max := 0
+       for j := 0; j < scenicScore.SizeY(); j++ {
+               for i := 0; i < scenicScore.SizeX(); i++ {
+                       if scenicScore.Get(i, j) > max {
+                               max = scenicScore.Get(i, j)
+                       }
+               }
+       }
+       return max
+}
diff --git a/2022/go/day08/day08_test.go b/2022/go/day08/day08_test.go
new file mode 100644 (file)
index 0000000..fe7ce2d
--- /dev/null
@@ -0,0 +1,27 @@
+package day08
+
+import (
+       "testing"
+
+       "github.com/stretchr/testify/require"
+)
+
+func TestPart1(t *testing.T) {
+       r := Part1(
+`30373
+25512
+65332
+33549
+35390`)
+       require.Equal(t, 21, r)
+}
+
+func TestPart2(t *testing.T) {
+       r := Part2(
+`30373
+25512
+65332
+33549
+35390`)
+       require.Equal(t, 8, r)
+}
diff --git a/2022/go/day08/input.txt b/2022/go/day08/input.txt
new file mode 100644 (file)
index 0000000..7b14148
--- /dev/null
@@ -0,0 +1,99 @@
+020111211022103023211142403044034010412103202221251542233334311102303044440313120021223120332211221
+121001110111201102213124201444431204213221413222211111444444412110041144131210002230130121313101010
+112010221202200121420032021412024323255214355122345552225213252324112400440302313420323102103100221
+211022232121222123201224234031435144114512425232345144523531533222344004011342234110131312300332202
+202103101023303021233104321411251553151424242531344221312225231225524421412434024103021300123300121
+202122200002211022342141123051132352344252152315525324551424132421225143201002114204223302333232221
+011310312223223421431113235421121321152124551441143435255214322514544552225412313011414423301132102
+121331322013001133311000223433443341113554412556562564315233144532455221433431002003332002203013201
+003201332004241133340023541532333131413153266664363423353232622124454254554345422200200433100333102
+230030131344203011040552414515334144165664524445366334422626244444323115333252423443232113432003211
+020300112334333142144323414353551436334563654426436625356343222253643212532215422020214344013310331
+220002231221003314452445344223355655546325233543653632544634656464243551334233433413423044300230210
+111022100242320043435324555421362243363346366346456252353246655455262455415331454531201000441410231
+101232013434204241242451442362524554225656254252456532663634445256345634451144555513214431300213021
+021113211441142541244515256653533353262654644343347336234522332254544443346322422154143020040021110
+002032342223245141521455555365463263562446777664546776637635443223664266645633333231151132112140113
+002033421301452414544444345232465536465366346553375665564756366435442422632435555111445311104203133
+332303032232445231354236322622423634433537753546335477544636344436526324435436522445155410213401230
+214021124335354212514535634245552337436663757533364556376776733565333462254562365531354214423412431
+231123230423124441525624265443647673566756453545563655373357453547537663433453433212213223101140424
+100211320333154123522263362425466444634667564437776546465446345667366445453365366551352122420231230
+024400401554531424535342424657437377754456437376767656436366374765557746355562226364213315421212320
+214442223135544515264335435467756354735433346664764464468465443746334373746425422542525455354340110
+141333001441254326655252563743544735555378755475567457777687677357576573543344653346551442221242312
+022033123224325536562464253467675635635678458757477754757874576653435356676234462564555551451230022
+444402313413432333426636637636453646648557685556587678886878777785454364533433543362622525453201222
+031024134513414333456224636475357556855564445765756678575486648885765563445546566235352311454320030
+341331341415512452344636337436467675565575756658588888477584775646657736366434365523664142235144413
+333344214132152543325563654447567486457556845676545687457688885466457333476777342344625323533242333
+203124152315365546566375565336778768544768846599686578655665448478657834657533335544343231212251101
+200144235323636235437557635373578555545475587655886585897998654658858755534374677344254563233421200
+433243323452635426237436445738684446475489658878699879887988684656474746764334543334452565153341241
+340411231113223465344733555465744685569658998876796578688888887678657675875533766464362432543531231
+132155112416452662274535754677457567869597559977756878779755568868854644586734466764422245333151550
+321153454153653654743477667888756477986578656976558879999589975695487876766664653466625262642234421
+414524133155254243564664555445778475666688565697596679558768656758547564888437343772346336642515514
+321251321324554554436434474754674597576658986766997798688766897876884764444653674674326233445555243
+031553412663524646375654566887688857698655696699699989968699659665774657875735457664452362352111522
+121541141642244257534355645887786995858959886778688769889987779898696567777567344373632655621545545
+334343242432423553675774445756455759676757789677879778999988695976997447856786357655446656351514552
+125145532643224566754564678556569669557567799868776897666898866898879866784847777744353546366314141
+045114213352452647446647465888875868689699789677897977779999699895556776458746737674746244442322442
+132343555663565436365447746478789879798676878686777999789966769777759954677478745673552645533545344
+045253354653642556466557766588567888887978866878777776986676768968695857655674556463732652626443441
+324411423536354677366485874488885578788769789998797978797888777868996895476778847746764226464355343
+355421453642352476436787475855785669696986976979989787787998669696679989555875747556435562425323311
+225422326356526465747344444546866698678986799879779799999876866969999686664477767757535635652555421
+215234242322226376376776764668889755898766677787987779877967696689565966757675463574434246652622343
+214252444222333767567367778585695867987669688798987987789888698888858597545545475573737453632634414
+435144324646623745547785547465689576878976877888878988989877866686976879488454664357347554642541254
+424224446333664566656688545685586987987699788897978888788999878967887869445474863534753362524653532
+234521532264544735666677658457578679997886798878788998987976677895559685784445835563745433436535545
+541253562333326733576345574569866788667878789897999998887996866685657897848485475437744246636412312
+531515163362265375476387485646556857878999799999999989879989886696789765664474863474462523344554532
+134323536435565375644658845476675857999867789999988888799986676978987577885467643356656525623333421
+432434326635433776557758756889896978587689688777989999797796888999765958586488873373565325435254453
+352344243543664654777655867556767767686778796989888798998697976755779565488844544677343523234525134
+023522455223435563774634466685769765877876776996699877886876668865856964846675357575675235445525211
+452211123455454466574537744568597875596879779869788776669767986968956557448486336534544244456115451
+154255352645344566574476875484685575595898898697799799688669879869766768688476473673634645556554324
+153224532366353377543578485765465665577767776999977978876879865565957587758448456773452265664315213
+212223354662352476456344644856876756566976677698968768897897866997679566845464663374352444344522513
+333134124655526377555445475778655559695856687767878889687866969787796886748547665457422543622531314
+114114243655626456537464558857564557866777897897898988696885586978887448448543375665233363532515252
+022123225426235336675765546686448888566865666569876966556979869667956845877753374733454555422452344
+105112231544246463366336777688875488697685796985999888976956985978664485756743456372244565641412542
+243421525526425322655767646868764584599579555769857975877669799998745668566534743565233224245452434
+310412235133463356343754335447454467578555798898788997569756589585876868467475435524433556255213522
+122253434533466554567356664688567676567976599967878669868967997845484546736534545734455626245154423
+313334534424352263526466637778587787868565658999559897596678677574858776343543534432632333531241224
+001031252124265545567437743765668445564487997555965858678954577555545545743366457636433553523254344
+044305452425444342246365565576568644874888888677955886697487686854588744354437555336664241413533111
+110113123534526242542645447354547688467557884774478677887477777586654656653436654455626314334324023
+403311355254242426345425533745657486754657454674877454647844866774463676664344325662334351444144012
+114043453225323265365363357353773386544675474785655464585675566555543364665665355442555535443420344
+234021355512324262426566274773756436677647664566764646854655875476556464746532226425352124354233001
+104234323224222234534254555373773666356744475886877868685764755374634533664662562645321154355101301
+413312132345313224565423553463467666456365585778746647466885776356666677636556254365513311121044324
+010140223145323354554344523347476477547564757555585887484666633663433654743326266555221322431333120
+023311233225342421354662654347733666374666336373663635367447753577353743232632663243333251551031321
+143043334422453221246324462653756444767736544367544755375437335646557334655533644454121143303220002
+101212344011254432246625336226267546745356655577456676377355677475746633565634244145133154032123242
+233244204414154431434433222525444454344635736634774576466473546373725623264634363324244114303014300
+010103422332213512154554324533443662535535356636747655647737636354525554536436123454141421414030443
+203123300244432323224135253642444433566335637575443374634433336553444225543564152215332533001133230
+213003230312403552352142145445635666323653353353657647435752235322633623453542112525124011312421020
+120004434213011143254452233425222536464236356544634635324242345464353322232141135221424123200431123
+331000214011314431233211121223425334456246345226324246526344536556636556453143153253323114441131132
+303123142412333143322451153243464566344362342525524265432552566442626262524431454151443133021301210
+220100102032004440315125323552226234566265233246334556355333643662354455122325544112124232340231031
+112122312031202424345533512342151435534325334444254264542526645645533111234131131223411304322200110
+213031212133401330114433121533455425225634422363334633454623522242353342455454511303033230433202120
+223232022333401311421344332255311133421254642562465526534445512134533413153142410113101444330132130
+020133013100324344342244215442123125243314222446342424421353134352515124333133430431401122202211032
+102300310001014311443112031115242425132234255215315523551534154524134344433432201022200432133000302
+001233311232134334100401400151532231322435145412132433235254313414243334103312232304403111313321210
+110213022233310011220103432114343112114222424442543155552411511144115122143322304023012132213011210
+000220123220323122321103444304134551331233141552114422121151224211122042434324042030120133230110110
+020120232301110331441234422110132302233413123211331413433254521355004032312110222131010330301222211
\ No newline at end of file
diff --git a/2022/go/day09/day09.go b/2022/go/day09/day09.go
new file mode 100644 (file)
index 0000000..f67da1b
--- /dev/null
@@ -0,0 +1,119 @@
+package day09
+
+import (
+       "strings"
+
+       "adventofcode2022/utils"
+       sparsegrid "adventofcode2022/utils/sparseGrid"
+)
+
+type rope struct {
+       size int
+       posX []int
+       posY []int
+}
+
+func Part1(input string) int {
+       rope := newRope(2)
+       grid := sparsegrid.NewGrid(false)
+       grid.Set(rope.posX[rope.size-1], rope.posY[rope.size-1], true)
+       for _, line := range strings.Split(input, "\n") {
+               dx := 0
+               dy := 0
+               switch line[0] {
+               case 'R':
+                       dx = 1
+               case 'U':
+                       dy = -1
+               case 'D':
+                       dy = 1
+               case 'L':
+                       dx = -1
+               }
+               n := utils.MustAtoi(line[2:])
+               for i := 0; i < n; i++ {
+                       // move head
+                       rope.posX[0] += dx
+                       rope.posY[0] += dy
+
+                       // update tail
+                       rope.updateTail()
+                       grid.Set(rope.posX[rope.size-1], rope.posY[rope.size-1], true)
+               }
+       }
+       return grid.Visited()
+}
+
+func Part2(input string) int {
+       rope := newRope(10)
+       grid := sparsegrid.NewGrid(false)
+       grid.Set(rope.posX[rope.size-1], rope.posY[rope.size-1], true)
+       for _, line := range strings.Split(input, "\n") {
+               dx := 0
+               dy := 0
+               switch line[0] {
+               case 'R':
+                       dx = 1
+               case 'U':
+                       dy = -1
+               case 'D':
+                       dy = 1
+               case 'L':
+                       dx = -1
+               }
+               n := utils.MustAtoi(line[2:])
+               for i := 0; i < n; i++ {
+                       // move head
+                       rope.posX[0] += dx
+                       rope.posY[0] += dy
+
+                       // update tail
+                       rope.updateTail()
+                       grid.Set(rope.posX[rope.size-1], rope.posY[rope.size-1], true)
+               }
+       }
+       return grid.Visited()
+}
+
+func newRope(size int) *rope {
+       return &rope{
+               size: size,
+               posX: make([]int, size),
+               posY: make([]int, size),
+       }
+}
+
+func (r *rope) updateTail() {
+outer:
+       for i := 1; i < r.size; i++ {
+               diffX := utils.Abs(r.posX[i-1] - r.posX[i])
+               diffY := utils.Abs(r.posY[i-1] - r.posY[i])
+               if diffX <= 1 && diffY <= 1 {
+                       // no need to update node if it's touching
+                       continue
+               }
+               moves := [][]int{{1, 0}, {-1, 0}, {0, 1}, {0, -1}}
+               for _, move := range moves {
+                       t := utils.Max(
+                               utils.Abs(r.posX[i-1]-r.posX[i]+move[0]),
+                               utils.Abs(r.posY[i-1]-r.posY[i]+move[1]))
+                       if t == 1 {
+                               r.posX[i] = r.posX[i-1] + move[0]
+                               r.posY[i] = r.posY[i-1] + move[1]
+                               continue outer
+                       }
+               }
+               moves = [][]int{{1, 1}, {-1, 1}, {1, -1}, {-1, -1}}
+               for _, move := range moves {
+                       t := utils.Max(
+                               utils.Abs(r.posX[i-1]-r.posX[i]+move[0]),
+                               utils.Abs(r.posY[i-1]-r.posY[i]+move[1]))
+                       if t == 1 {
+                               r.posX[i] = r.posX[i-1] + move[0]
+                               r.posY[i] = r.posY[i-1] + move[1]
+                               continue outer
+                       }
+               }
+               panic("unreachable")
+       }
+}
\ No newline at end of file
diff --git a/2022/go/day09/day09_test.go b/2022/go/day09/day09_test.go
new file mode 100644 (file)
index 0000000..0bcc27b
--- /dev/null
@@ -0,0 +1,25 @@
+package day09
+
+import (
+       "testing"
+
+       "github.com/stretchr/testify/require"
+)
+
+func TestPart1(t *testing.T) {
+       r := Part1(
+`R 4
+U 4
+L 3
+D 1
+R 4
+D 1
+L 5
+R 2`)
+       require.Equal(t, 13, r)
+}
+
+func TestPart2(t *testing.T) {
+       r := Part2("")
+       require.Equal(t, 0, r)
+}
diff --git a/2022/go/day09/input.txt b/2022/go/day09/input.txt
new file mode 100644 (file)
index 0000000..df43863
--- /dev/null
@@ -0,0 +1,2000 @@
+R 1
+U 1
+D 1
+U 1
+R 2
+D 2
+R 2
+D 2
+R 1
+U 1
+L 1
+U 2
+D 2
+R 1
+D 1
+R 2
+U 2
+R 2
+L 2
+D 2
+L 2
+U 2
+D 2
+L 2
+R 2
+D 1
+U 2
+D 2
+U 1
+L 2
+D 2
+R 1
+U 2
+D 2
+L 1
+D 2
+L 2
+R 2
+U 2
+D 2
+U 1
+R 1
+U 1
+D 1
+R 2
+L 2
+D 1
+U 1
+R 1
+L 1
+U 1
+D 1
+L 1
+U 1
+D 1
+U 2
+D 2
+U 1
+D 1
+U 1
+L 1
+R 2
+L 1
+D 1
+U 1
+R 1
+L 2
+U 2
+L 2
+U 2
+D 1
+R 2
+D 2
+L 2
+R 1
+U 2
+R 1
+D 2
+L 1
+D 1
+L 1
+D 2
+R 1
+U 1
+L 1
+U 2
+D 2
+L 1
+U 2
+D 2
+R 1
+U 1
+R 1
+L 2
+D 1
+L 2
+U 2
+L 2
+D 2
+L 2
+D 2
+U 1
+L 1
+U 2
+R 1
+D 1
+R 1
+D 1
+R 1
+D 2
+U 1
+R 1
+U 1
+R 1
+D 1
+U 3
+L 2
+R 2
+L 3
+R 1
+L 1
+U 2
+L 1
+U 3
+D 3
+L 3
+D 2
+L 3
+U 1
+L 1
+R 2
+D 3
+L 1
+R 1
+U 2
+L 2
+D 3
+U 2
+D 3
+R 3
+U 1
+D 3
+L 3
+R 2
+U 3
+D 1
+U 1
+R 1
+L 2
+R 1
+L 2
+D 3
+L 1
+D 3
+R 2
+U 1
+D 1
+R 3
+D 1
+L 1
+U 2
+D 1
+L 3
+U 3
+R 1
+D 1
+U 3
+D 2
+L 3
+R 2
+L 1
+D 2
+U 1
+R 2
+L 1
+U 2
+R 2
+L 2
+U 2
+L 2
+U 2
+R 1
+U 2
+D 3
+U 1
+D 1
+L 2
+U 1
+L 2
+R 3
+L 2
+R 3
+L 1
+R 2
+L 2
+R 1
+D 3
+L 3
+D 2
+R 1
+D 1
+U 1
+D 2
+R 3
+U 3
+D 3
+R 3
+L 1
+U 1
+R 3
+U 2
+L 1
+R 1
+L 3
+D 3
+R 2
+U 1
+L 2
+D 2
+R 1
+U 3
+D 2
+R 1
+L 4
+D 3
+R 3
+L 1
+D 1
+R 3
+U 3
+L 2
+D 4
+U 3
+D 2
+L 4
+D 2
+R 1
+D 3
+R 3
+D 1
+U 4
+R 1
+U 4
+D 2
+U 4
+L 1
+R 1
+L 2
+R 1
+D 1
+L 4
+U 1
+R 4
+D 3
+R 1
+U 3
+R 3
+U 2
+L 3
+U 2
+L 2
+R 4
+U 2
+D 3
+R 4
+D 1
+U 4
+D 3
+R 2
+D 3
+R 1
+D 1
+U 1
+R 3
+L 1
+U 3
+L 1
+D 3
+L 3
+D 3
+R 3
+D 3
+U 1
+R 4
+D 2
+R 2
+U 1
+R 1
+D 1
+L 4
+D 2
+L 1
+U 4
+D 1
+L 2
+U 4
+D 3
+U 3
+L 2
+R 2
+D 1
+L 4
+D 2
+R 3
+D 4
+R 4
+U 1
+D 1
+L 2
+R 1
+D 4
+R 2
+L 1
+D 4
+L 3
+R 3
+U 4
+R 3
+D 3
+L 2
+R 1
+D 3
+L 2
+R 3
+D 1
+L 2
+U 3
+R 4
+D 4
+U 3
+R 2
+D 3
+R 3
+D 1
+R 4
+U 3
+R 5
+U 1
+D 2
+R 5
+U 1
+R 3
+L 1
+U 1
+L 1
+D 1
+R 5
+U 2
+D 3
+R 4
+L 5
+R 2
+D 1
+L 2
+U 2
+D 3
+R 5
+D 2
+R 5
+D 5
+U 5
+D 1
+L 5
+U 3
+D 2
+R 1
+D 5
+R 2
+D 2
+R 5
+U 3
+L 2
+U 1
+L 4
+R 5
+L 3
+R 2
+U 2
+D 3
+L 1
+U 3
+L 4
+R 5
+L 1
+U 4
+L 1
+D 5
+R 3
+U 5
+R 3
+L 2
+U 4
+D 2
+U 4
+L 1
+U 1
+L 1
+R 4
+D 4
+U 4
+R 5
+D 2
+U 2
+L 3
+U 4
+D 3
+L 2
+R 4
+U 1
+L 3
+R 3
+D 1
+L 2
+R 5
+U 2
+L 2
+R 2
+L 4
+D 4
+L 2
+U 4
+R 2
+L 3
+U 4
+L 5
+D 5
+L 5
+U 3
+L 5
+R 2
+D 4
+L 5
+U 3
+D 2
+L 2
+D 2
+U 2
+D 4
+R 5
+U 5
+L 3
+R 5
+D 3
+L 1
+D 1
+L 1
+D 5
+R 2
+L 1
+U 2
+L 3
+U 2
+R 2
+L 5
+R 3
+U 2
+R 1
+L 4
+D 4
+U 3
+R 2
+L 2
+D 3
+L 2
+R 4
+L 1
+U 6
+R 2
+D 5
+L 4
+U 3
+R 6
+D 6
+L 4
+D 3
+R 2
+D 2
+L 2
+R 2
+D 4
+L 6
+D 3
+L 5
+R 4
+L 5
+U 3
+L 6
+U 5
+L 3
+R 2
+U 3
+L 1
+D 1
+L 3
+U 4
+L 5
+D 3
+L 2
+U 5
+D 4
+L 3
+R 1
+U 3
+D 4
+U 3
+D 3
+U 6
+D 4
+R 3
+U 6
+R 1
+U 3
+R 3
+U 3
+R 5
+U 6
+L 1
+R 2
+D 5
+U 3
+D 4
+U 4
+D 4
+L 1
+U 4
+D 3
+L 1
+U 5
+R 3
+U 3
+R 1
+U 1
+L 3
+R 3
+U 4
+R 1
+L 3
+U 2
+L 2
+D 2
+L 4
+U 4
+L 3
+U 4
+R 2
+U 1
+D 2
+U 2
+D 5
+L 5
+R 1
+D 3
+L 4
+R 3
+D 6
+U 7
+D 5
+L 7
+D 5
+U 3
+D 1
+L 2
+R 2
+D 7
+U 7
+D 3
+L 2
+U 1
+L 6
+D 5
+R 4
+U 3
+R 5
+U 6
+L 6
+U 6
+L 1
+R 5
+U 7
+R 5
+U 5
+R 4
+U 5
+D 6
+R 4
+D 7
+L 7
+U 5
+R 2
+U 7
+R 3
+D 5
+R 5
+D 4
+U 1
+L 6
+R 4
+D 6
+L 6
+R 2
+U 7
+L 3
+D 5
+L 4
+R 3
+L 1
+U 3
+D 3
+R 5
+U 1
+L 6
+U 7
+R 7
+D 4
+L 4
+U 6
+R 7
+U 4
+R 1
+L 1
+R 4
+U 7
+D 1
+U 5
+D 3
+R 7
+L 1
+D 4
+U 6
+D 2
+L 3
+U 1
+D 6
+L 1
+D 5
+R 3
+U 3
+L 6
+D 5
+R 4
+U 5
+L 4
+R 4
+U 7
+R 1
+L 7
+U 2
+R 4
+L 1
+D 5
+U 4
+L 6
+D 2
+R 3
+L 2
+D 5
+R 5
+U 7
+R 4
+D 7
+U 6
+R 6
+L 6
+R 6
+U 1
+D 1
+R 3
+D 2
+U 3
+R 3
+D 8
+U 1
+R 5
+L 8
+D 8
+L 7
+D 3
+U 6
+R 6
+U 8
+D 3
+U 2
+R 2
+D 7
+U 8
+D 5
+L 2
+R 8
+U 3
+L 2
+R 5
+U 3
+R 6
+L 8
+U 8
+R 8
+L 2
+U 1
+D 1
+U 4
+L 1
+U 2
+L 4
+D 2
+U 4
+D 3
+L 8
+D 3
+R 3
+L 2
+D 7
+L 5
+R 5
+L 3
+R 4
+L 7
+D 6
+U 3
+L 3
+D 4
+R 4
+L 3
+D 5
+U 2
+R 4
+U 6
+L 7
+D 2
+R 6
+L 3
+D 8
+L 8
+R 2
+U 7
+D 7
+U 3
+R 7
+U 8
+L 5
+D 6
+R 6
+U 8
+R 1
+U 3
+R 5
+L 4
+D 7
+U 6
+R 8
+L 2
+R 6
+U 1
+L 4
+D 1
+L 2
+U 4
+R 2
+U 4
+R 5
+L 3
+R 1
+L 4
+R 7
+D 7
+R 1
+U 5
+L 6
+D 4
+R 4
+D 5
+U 8
+L 3
+D 8
+L 6
+U 5
+D 1
+R 7
+L 2
+D 1
+R 7
+L 5
+D 8
+U 6
+D 1
+L 8
+U 8
+L 1
+R 1
+U 2
+D 9
+L 5
+D 9
+L 4
+U 8
+D 3
+R 6
+L 1
+R 8
+D 7
+L 6
+U 7
+R 6
+U 2
+L 3
+D 6
+L 5
+U 3
+R 1
+U 6
+D 1
+U 2
+L 9
+R 2
+L 2
+R 9
+D 1
+R 2
+U 7
+D 7
+U 5
+R 4
+U 9
+L 5
+U 9
+D 5
+L 1
+R 3
+L 1
+U 1
+D 7
+L 8
+D 2
+L 7
+D 1
+L 6
+R 2
+D 1
+U 9
+D 4
+U 8
+L 8
+U 1
+L 8
+D 6
+U 1
+R 2
+U 3
+R 4
+D 4
+U 4
+L 9
+D 5
+L 2
+U 6
+D 8
+U 6
+R 1
+L 6
+D 5
+R 3
+L 4
+R 6
+L 5
+R 4
+L 6
+D 5
+R 8
+D 6
+L 1
+U 8
+R 8
+U 8
+R 3
+U 2
+D 9
+L 9
+U 3
+D 5
+L 2
+D 2
+R 3
+L 2
+D 8
+R 6
+D 9
+R 5
+L 9
+R 2
+L 9
+U 5
+R 9
+D 3
+R 1
+U 1
+L 6
+R 7
+D 7
+U 3
+R 2
+L 5
+D 2
+L 8
+U 8
+R 9
+U 5
+R 1
+U 9
+D 8
+R 10
+U 9
+D 5
+R 4
+D 8
+U 4
+L 7
+U 10
+L 8
+R 10
+L 9
+D 9
+L 4
+R 7
+U 4
+D 3
+U 10
+R 6
+D 9
+L 5
+R 3
+D 7
+R 9
+D 4
+L 9
+D 3
+R 7
+U 6
+L 6
+R 6
+L 7
+D 8
+L 7
+U 5
+D 8
+L 8
+U 9
+L 5
+D 9
+U 9
+R 3
+D 1
+U 9
+L 9
+U 6
+R 4
+U 6
+D 10
+U 4
+R 9
+D 9
+R 2
+D 10
+L 9
+U 8
+L 2
+D 7
+L 10
+R 2
+L 9
+R 9
+L 10
+U 6
+D 7
+R 1
+D 9
+R 5
+L 7
+D 4
+U 7
+L 3
+D 3
+R 4
+L 8
+U 1
+L 1
+D 10
+U 2
+D 9
+L 2
+D 8
+U 2
+D 3
+R 6
+U 3
+R 5
+U 4
+L 6
+R 10
+L 1
+D 2
+L 3
+U 11
+R 5
+U 11
+D 11
+U 10
+D 2
+L 10
+U 8
+R 4
+D 11
+U 11
+R 11
+U 5
+D 3
+R 7
+D 9
+U 9
+R 5
+U 8
+D 7
+U 9
+D 2
+U 11
+L 7
+D 1
+R 9
+D 2
+R 5
+U 4
+R 11
+D 1
+L 2
+R 1
+U 5
+D 4
+L 10
+R 11
+U 6
+L 3
+U 11
+R 1
+D 1
+L 2
+U 5
+R 6
+U 9
+R 11
+D 9
+L 11
+U 6
+R 5
+L 7
+D 6
+U 9
+D 5
+U 6
+R 10
+D 11
+R 4
+U 7
+L 5
+U 7
+L 2
+R 6
+L 10
+D 3
+R 6
+L 9
+D 8
+L 1
+R 1
+L 1
+R 3
+D 8
+L 10
+D 2
+U 1
+D 1
+L 3
+R 10
+L 3
+U 1
+D 2
+U 2
+D 3
+U 1
+R 8
+U 8
+D 10
+U 6
+L 5
+U 6
+D 4
+R 9
+D 9
+R 9
+D 11
+L 3
+D 7
+R 9
+L 7
+U 7
+D 7
+R 4
+L 3
+R 5
+U 3
+L 9
+D 10
+L 1
+R 9
+L 6
+D 5
+L 6
+D 4
+U 7
+L 8
+R 7
+L 5
+U 9
+R 1
+L 1
+D 12
+R 5
+U 1
+L 8
+D 11
+U 5
+D 5
+R 4
+D 10
+R 2
+U 6
+D 2
+L 12
+D 1
+R 10
+U 4
+D 8
+L 7
+D 9
+R 7
+D 1
+R 10
+D 5
+U 7
+D 12
+R 9
+U 2
+D 3
+U 5
+D 2
+U 6
+D 3
+U 7
+D 4
+R 11
+D 2
+L 3
+R 9
+L 2
+R 12
+L 3
+D 5
+U 7
+D 6
+R 9
+D 12
+R 11
+D 5
+U 5
+D 2
+R 1
+U 6
+R 6
+D 5
+L 9
+U 10
+D 4
+U 1
+R 3
+D 10
+U 1
+R 9
+D 8
+L 1
+D 12
+U 11
+D 12
+L 2
+R 9
+U 12
+D 6
+L 1
+R 4
+L 8
+D 8
+L 6
+R 10
+L 8
+D 4
+U 11
+L 1
+R 5
+L 6
+R 10
+D 12
+R 3
+L 9
+D 10
+U 6
+D 9
+R 7
+U 9
+R 10
+U 10
+L 10
+U 1
+L 3
+D 7
+L 12
+U 4
+R 3
+U 1
+L 8
+R 5
+U 4
+L 4
+D 5
+R 4
+D 11
+L 9
+D 5
+L 7
+U 6
+R 8
+U 7
+D 3
+U 1
+L 6
+U 8
+D 2
+R 7
+D 2
+U 1
+L 9
+U 8
+L 10
+U 4
+D 12
+L 12
+D 5
+R 3
+U 1
+D 1
+R 11
+L 10
+R 11
+L 6
+R 3
+L 13
+R 6
+L 4
+R 10
+D 9
+R 13
+U 8
+L 7
+R 7
+L 10
+R 9
+U 4
+L 1
+D 1
+L 12
+D 6
+L 3
+R 4
+U 6
+L 12
+D 2
+U 5
+R 11
+L 2
+U 8
+R 10
+D 2
+U 6
+L 4
+D 2
+U 9
+L 7
+D 5
+L 6
+U 9
+R 6
+L 9
+R 1
+U 3
+L 6
+R 6
+U 8
+D 1
+R 5
+U 12
+D 9
+U 10
+D 13
+L 10
+R 4
+L 13
+R 9
+L 9
+D 6
+U 8
+D 6
+U 8
+D 10
+R 3
+L 11
+R 8
+D 4
+R 2
+U 10
+D 9
+U 8
+R 5
+D 10
+L 11
+R 7
+D 9
+U 7
+L 6
+U 3
+L 5
+U 6
+D 1
+U 3
+R 8
+L 5
+U 3
+R 13
+L 8
+D 1
+U 8
+L 6
+D 11
+U 4
+D 1
+R 9
+D 11
+R 1
+D 2
+R 10
+U 2
+D 12
+U 6
+R 13
+U 6
+D 4
+R 11
+U 6
+R 9
+U 10
+D 3
+R 2
+L 13
+U 14
+D 14
+R 6
+D 9
+U 5
+D 2
+L 5
+R 10
+L 3
+R 8
+D 9
+U 10
+R 11
+U 8
+L 8
+R 12
+D 13
+U 7
+R 14
+D 9
+L 12
+R 13
+L 10
+D 11
+L 7
+U 6
+D 14
+L 14
+D 13
+U 11
+R 11
+U 9
+L 8
+D 2
+L 9
+R 12
+U 5
+D 9
+U 10
+R 1
+L 2
+D 8
+L 8
+R 4
+U 2
+L 13
+R 9
+L 12
+D 7
+L 14
+D 13
+R 12
+D 10
+L 5
+U 12
+R 6
+L 3
+U 14
+R 8
+U 10
+R 5
+U 3
+D 1
+R 6
+U 9
+R 4
+L 9
+U 7
+R 6
+U 8
+R 10
+U 9
+R 9
+U 12
+L 14
+R 2
+U 11
+L 12
+D 5
+R 15
+L 10
+U 8
+R 6
+U 8
+R 6
+D 2
+U 9
+L 15
+D 13
+L 14
+U 1
+D 9
+U 6
+R 8
+L 6
+D 3
+L 13
+R 7
+U 1
+L 8
+U 7
+D 8
+R 1
+D 6
+L 8
+R 14
+D 14
+U 9
+L 14
+R 15
+U 11
+L 14
+D 14
+L 1
+U 5
+L 3
+R 4
+L 13
+R 5
+D 14
+R 4
+U 7
+D 9
+R 4
+U 6
+D 11
+R 12
+D 13
+U 15
+D 10
+R 1
+D 1
+U 10
+L 14
+R 13
+U 6
+D 10
+U 15
+D 3
+U 8
+D 2
+U 15
+R 6
+U 12
+L 9
+R 2
+D 6
+R 15
+D 13
+R 2
+D 5
+R 8
+U 3
+R 10
+D 6
+L 7
+D 6
+R 11
+U 13
+D 1
+L 7
+U 7
+L 4
+U 10
+D 4
+R 10
+U 2
+L 2
+U 4
+R 7
+D 15
+R 15
+D 7
+R 14
+U 3
+D 8
+L 2
+U 11
+D 11
+U 9
+R 5
+L 3
+D 9
+R 12
+L 2
+R 10
+D 6
+R 6
+U 15
+R 10
+D 16
+R 5
+U 14
+R 16
+U 5
+L 10
+R 14
+L 15
+R 13
+L 15
+R 12
+L 9
+D 16
+U 13
+D 16
+R 2
+U 1
+D 15
+L 7
+D 5
+R 9
+U 8
+R 12
+U 3
+D 16
+R 11
+D 1
+U 3
+D 4
+U 10
+L 8
+R 4
+L 8
+R 8
+U 8
+L 9
+D 16
+U 7
+D 6
+R 1
+D 3
+L 15
+U 9
+D 9
+U 1
+L 9
+D 7
+U 14
+R 1
+D 11
+L 16
+U 13
+L 3
+R 12
+L 9
+R 9
+L 9
+U 5
+R 10
+D 14
+L 8
+R 7
+L 12
+R 13
+D 5
+U 10
+R 12
+U 11
+L 7
+R 9
+D 7
+L 11
+D 1
+R 8
+D 7
+U 6
+D 10
+R 13
+L 16
+U 10
+L 5
+R 12
+L 16
+U 6
+D 10
+U 3
+D 7
+U 7
+D 15
+L 2
+R 9
+U 8
+D 11
+L 15
+U 10
+D 10
+L 6
+D 14
+L 5
+U 3
+D 9
+U 2
+D 16
+U 6
+D 3
+R 15
+D 12
+R 9
+L 16
+R 4
+U 9
+L 8
+R 11
+L 14
+D 6
+U 11
+L 6
+R 7
+U 8
+R 7
+U 8
+D 7
+U 6
+L 15
+U 3
+D 6
+U 3
+R 6
+D 3
+L 10
+R 14
+L 17
+D 12
+L 15
+D 5
+R 6
+D 4
+R 6
+D 5
+U 8
+D 10
+R 13
+D 6
+U 3
+L 5
+U 3
+R 11
+D 11
+U 8
+L 5
+U 11
+L 7
+R 16
+L 11
+D 3
+L 16
+D 14
+R 1
+U 10
+L 7
+U 4
+D 11
+L 9
+R 3
+D 1
+L 7
+R 17
+D 17
+R 11
+U 4
+R 15
+L 10
+R 13
+U 17
+D 16
+L 16
+U 14
+D 11
+U 10
+D 12
+L 11
+R 5
+D 17
+U 1
+R 5
+L 14
+D 14
+R 5
+L 6
+R 11
+U 13
+R 10
+U 15
+L 2
+R 8
+D 3
+R 11
+L 8
+R 11
+U 5
+L 12
+U 2
+L 16
+D 5
+L 17
+R 10
+D 15
+L 16
+U 1
+D 10
+R 13
+L 6
+D 5
+R 13
+U 2
+D 16
+L 9
+U 11
+D 13
+U 16
+L 6
+R 15
+D 10
+U 17
+L 15
+D 7
+R 6
+D 15
+R 11
+L 14
+U 12
+D 18
+R 6
+U 16
+L 1
+U 10
+R 15
+U 3
+L 12
+D 9
+L 11
+D 18
+R 11
+L 12
+U 5
+L 13
+D 2
+R 11
+D 10
+L 15
+R 5
+D 17
+R 6
+L 16
+R 11
+D 1
+R 5
+U 13
+R 11
+D 13
+L 12
+U 10
+D 9
+R 1
+D 15
+R 1
+D 17
+R 10
+U 11
+R 14
+L 17
+R 2
+L 1
+D 12
+R 6
+U 18
+R 3
+L 8
+R 11
+L 15
+U 8
+L 7
+D 2
+L 9
+D 9
+L 11
+U 5
+D 8
+U 16
+R 13
+L 7
+D 6
+U 16
+L 9
+U 3
+R 4
+L 12
+U 18
+D 7
+L 10
+R 16
+D 1
+R 4
+U 4
+R 13
+D 6
+L 5
+R 3
+D 10
+U 4
+L 17
+D 9
+R 8
+L 1
+D 8
+L 16
+D 3
+U 3
+R 1
+U 9
+R 13
+D 3
+L 4
+R 6
+D 10
+U 16
+L 9
+U 5
+L 14
+U 8
+D 17
+L 18
+D 5
+U 10
+R 14
+L 8
+U 6
+R 5
+U 19
+L 9
+U 2
+D 7
+U 14
+R 17
+L 16
+D 15
+U 11
+D 4
+L 16
+U 14
+D 6
+L 3
+R 18
+L 17
+D 6
+L 10
+U 7
+D 11
+L 15
+U 12
+L 6
+D 6
+L 14
+U 17
+L 7
+D 2
+L 7
+U 12
+L 17
+R 16
+U 19
+L 12
+U 10
+L 6
+U 3
+D 16
+L 5
+D 15
+L 7
+R 6
+D 2
+R 19
+L 4
+D 18
+R 19
+D 9
+R 11
+L 17
+R 1
+U 15
+R 3
+D 18
+L 13
+U 7
+D 7
+R 15
+U 4
+D 16
+R 6
+U 4
+R 10
+U 10
+R 1
+D 19
+R 13
+U 7
+L 13
+D 15
+U 2
+L 18
+D 5
+U 5
+D 10
+L 8
+D 13
+U 8
+L 15
+D 12
+U 11
+D 17
+L 14
+R 4
+D 19
+L 6
+D 5
+L 13
+D 16
+U 1
+R 14
+U 15
+L 18
+D 7
+L 14
+D 11
+L 7
+D 18
+U 16
+L 1
+R 18
+L 1
+U 19
+R 3
+D 1
\ No newline at end of file
diff --git a/2022/go/day10/day10.go b/2022/go/day10/day10.go
new file mode 100644 (file)
index 0000000..4fecf79
--- /dev/null
@@ -0,0 +1,77 @@
+package day10
+
+import (
+       "adventofcode2022/utils"
+       _ "fmt"
+       "strings"
+)
+
+func Part1(input string) int {
+       lines := strings.Split(input, "\n")
+       cycle := 0
+       strength := 0
+       x := 1
+       for _, line := range lines {
+               cmd := strings.Split(line, " ")
+               switch {
+               case cmd[0] == "noop":
+                       strength,cycle = cycles_1(1, cycle, strength, x)
+               case cmd[0] == "addx":
+                       strength, cycle = cycles_1(2, cycle, strength, x)
+                       x += utils.MustAtoi(cmd[1])
+               }
+       }
+       return strength
+}
+
+func Part2(input string) string {
+       lines := strings.Split(input, "\n")
+       cycle := 0
+       x := 1
+       crt := [6][40]string{}
+       for _, line := range lines {
+               cmd := strings.Split(line, " ")
+               switch {
+               case cmd[0] == "noop":
+                       cycle = cycles_2(1, cycle, x, &crt)
+               case cmd[0] == "addx":
+                       cycle = cycles_2(2, cycle, x, &crt)
+                       x += utils.MustAtoi(cmd[1])
+               }
+       }
+       output := "\n"
+       for i:=0;i<6;i++ {
+               for j:=0;j<40;j++ {
+                       output = output + crt[i][j]
+               }
+               output = output + "\n"
+       }
+       
+       return output
+}
+
+func cycles_1(num int, cycle int, strength int, x int) (int, int) {
+       for i:=0;i<num;i++ {
+               cycle++
+               if cycle == 20 {
+                       strength = strength + (x * cycle)
+               } else if  (cycle - 20) % 40 == 0 {
+                       strength = strength + (x * cycle)
+               }
+       }
+       return strength, cycle
+}
+
+func cycles_2(num int, cycle int, x int, crt *[6][40]string) int {
+       for i:=0;i<num;i++ {
+               crt_x := cycle / 40
+               crt_y := cycle % 40
+               if x-1 == crt_y || x == crt_y || x+1 == crt_y {
+                       crt[crt_x][crt_y] = "#"
+               } else {
+                       crt[crt_x][crt_y] = " "
+               }
+               cycle++
+       }
+       return cycle
+}
\ No newline at end of file
diff --git a/2022/go/day10/day10_test.go b/2022/go/day10/day10_test.go
new file mode 100644 (file)
index 0000000..506a667
--- /dev/null
@@ -0,0 +1,314 @@
+package day10
+
+import (
+       "testing"
+
+       "github.com/stretchr/testify/require"
+)
+
+func TestPart1(t *testing.T) {
+       r := Part1(
+`addx 15
+addx -11
+addx 6
+addx -3
+addx 5
+addx -1
+addx -8
+addx 13
+addx 4
+noop
+addx -1
+addx 5
+addx -1
+addx 5
+addx -1
+addx 5
+addx -1
+addx 5
+addx -1
+addx -35
+addx 1
+addx 24
+addx -19
+addx 1
+addx 16
+addx -11
+noop
+noop
+addx 21
+addx -15
+noop
+noop
+addx -3
+addx 9
+addx 1
+addx -3
+addx 8
+addx 1
+addx 5
+noop
+noop
+noop
+noop
+noop
+addx -36
+noop
+addx 1
+addx 7
+noop
+noop
+noop
+addx 2
+addx 6
+noop
+noop
+noop
+noop
+noop
+addx 1
+noop
+noop
+addx 7
+addx 1
+noop
+addx -13
+addx 13
+addx 7
+noop
+addx 1
+addx -33
+noop
+noop
+noop
+addx 2
+noop
+noop
+noop
+addx 8
+noop
+addx -1
+addx 2
+addx 1
+noop
+addx 17
+addx -9
+addx 1
+addx 1
+addx -3
+addx 11
+noop
+noop
+addx 1
+noop
+addx 1
+noop
+noop
+addx -13
+addx -19
+addx 1
+addx 3
+addx 26
+addx -30
+addx 12
+addx -1
+addx 3
+addx 1
+noop
+noop
+noop
+addx -9
+addx 18
+addx 1
+addx 2
+noop
+noop
+addx 9
+noop
+noop
+noop
+addx -1
+addx 2
+addx -37
+addx 1
+addx 3
+noop
+addx 15
+addx -21
+addx 22
+addx -6
+addx 1
+noop
+addx 2
+addx 1
+noop
+addx -10
+noop
+noop
+addx 20
+addx 1
+addx 2
+addx 2
+addx -6
+addx -11
+noop
+noop
+noop`)
+       require.Equal(t, 13140, r)
+}
+
+func TestPart2(t *testing.T) {
+       r := Part2(
+`addx 15
+addx -11
+addx 6
+addx -3
+addx 5
+addx -1
+addx -8
+addx 13
+addx 4
+noop
+addx -1
+addx 5
+addx -1
+addx 5
+addx -1
+addx 5
+addx -1
+addx 5
+addx -1
+addx -35
+addx 1
+addx 24
+addx -19
+addx 1
+addx 16
+addx -11
+noop
+noop
+addx 21
+addx -15
+noop
+noop
+addx -3
+addx 9
+addx 1
+addx -3
+addx 8
+addx 1
+addx 5
+noop
+noop
+noop
+noop
+noop
+addx -36
+noop
+addx 1
+addx 7
+noop
+noop
+noop
+addx 2
+addx 6
+noop
+noop
+noop
+noop
+noop
+addx 1
+noop
+noop
+addx 7
+addx 1
+noop
+addx -13
+addx 13
+addx 7
+noop
+addx 1
+addx -33
+noop
+noop
+noop
+addx 2
+noop
+noop
+noop
+addx 8
+noop
+addx -1
+addx 2
+addx 1
+noop
+addx 17
+addx -9
+addx 1
+addx 1
+addx -3
+addx 11
+noop
+noop
+addx 1
+noop
+addx 1
+noop
+noop
+addx -13
+addx -19
+addx 1
+addx 3
+addx 26
+addx -30
+addx 12
+addx -1
+addx 3
+addx 1
+noop
+noop
+noop
+addx -9
+addx 18
+addx 1
+addx 2
+noop
+noop
+addx 9
+noop
+noop
+noop
+addx -1
+addx 2
+addx -37
+addx 1
+addx 3
+noop
+addx 15
+addx -21
+addx 22
+addx -6
+addx 1
+noop
+addx 2
+addx 1
+noop
+addx -10
+noop
+noop
+addx 20
+addx 1
+addx 2
+addx 2
+addx -6
+addx -11
+noop
+noop
+noop`)
+       require.Equal(t, `##..##..##..##..##..##..##..##..##..##..
+###...###...###...###...###...###...###.
+####....####....####....####....####....
+#####.....#####.....#####.....#####.....
+######......######......######......####
+#######.......#######.......#######.....`, r)
+}
diff --git a/2022/go/day10/input.txt b/2022/go/day10/input.txt
new file mode 100644 (file)
index 0000000..4c41d7b
--- /dev/null
@@ -0,0 +1,140 @@
+addx 1
+addx 4
+addx 21
+addx -20
+addx 4
+noop
+noop
+addx 5
+addx 3
+noop
+addx 2
+addx 1
+noop
+noop
+addx 4
+noop
+noop
+noop
+addx 3
+addx 5
+addx 2
+addx 1
+noop
+addx -37
+addx 22
+addx -4
+addx -14
+addx 2
+addx 5
+addx 3
+addx -2
+addx 2
+addx 5
+addx 2
+addx -15
+addx 32
+addx -14
+addx 5
+addx 2
+addx 3
+noop
+addx -13
+addx -2
+addx 18
+addx -36
+noop
+addx 11
+addx -7
+noop
+noop
+addx 6
+addx 22
+addx -21
+addx 3
+addx 2
+addx 4
+noop
+noop
+noop
+addx 5
+addx -16
+addx 17
+addx 2
+addx 5
+addx -11
+addx 15
+addx -15
+addx -24
+noop
+noop
+addx 7
+addx 2
+addx -6
+addx 9
+noop
+addx 5
+noop
+addx -3
+addx 4
+addx 2
+noop
+noop
+addx 7
+noop
+noop
+noop
+addx 5
+addx -28
+addx 29
+noop
+addx 3
+addx -7
+addx -29
+noop
+addx 7
+addx -2
+addx 2
+addx 5
+addx 2
+addx -3
+addx 4
+addx 5
+addx 2
+addx 8
+addx -30
+addx 25
+addx 7
+noop
+noop
+addx 3
+addx -2
+addx 2
+addx -10
+addx -24
+addx 2
+noop
+noop
+addx 2
+noop
+addx 3
+addx 2
+noop
+addx 3
+addx 2
+addx 5
+addx 2
+noop
+addx 1
+noop
+addx 2
+addx 8
+noop
+noop
+addx -1
+addx -9
+addx 14
+noop
+addx 1
+noop
+noop
\ No newline at end of file
diff --git a/2022/go/go.mod b/2022/go/go.mod
new file mode 100644 (file)
index 0000000..fead91e
--- /dev/null
@@ -0,0 +1,18 @@
+module adventofcode2022
+
+go 1.19
+
+require (
+       github.com/alokmenghrajani/adventofcode2022 v0.0.0-20221225182202-291aae949bfb
+       github.com/deckarep/golang-set/v2 v2.3.1
+       github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de
+       github.com/philhanna/stack v1.5.0
+       github.com/stretchr/testify v1.8.2
+       golang.org/x/exp v0.0.0-20221208152030-732eee02a75a
+)
+
+require (
+       github.com/davecgh/go-spew v1.1.1 // indirect
+       github.com/pmezard/go-difflib v1.0.0 // indirect
+       gopkg.in/yaml.v3 v3.0.1 // indirect
+)
diff --git a/2022/go/go.sum b/2022/go/go.sum
new file mode 100644 (file)
index 0000000..487605e
--- /dev/null
@@ -0,0 +1,27 @@
+github.com/alokmenghrajani/adventofcode2022 v0.0.0-20221225182202-291aae949bfb h1:brhd2lQBATJuzH9JNEoJHeDT0zs5WImcEtRqQ2OzYLw=
+github.com/alokmenghrajani/adventofcode2022 v0.0.0-20221225182202-291aae949bfb/go.mod h1:1rWZGu5Q4mtVaXOMj9kUNWcJqNGQJWynsvLmnN3P1Ng=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/deckarep/golang-set/v2 v2.3.1 h1:vjmkvJt/IV27WXPyYQpAh4bRyWJc5Y435D17XQ9QU5A=
+github.com/deckarep/golang-set/v2 v2.3.1/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
+github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de h1:D5x39vF5KCwKQaw+OC9ZPiLVHXz3UFw2+psEX+gYcto=
+github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de/go.mod h1:kJun4WP5gFuHZgRjZUWWuH1DTxCtxbHDOIJsudS8jzY=
+github.com/philhanna/stack v1.5.0 h1:GAKwXfNxNPjv6MIDZAoFOTFMKt2wj+63iDpjyz8tapQ=
+github.com/philhanna/stack v1.5.0/go.mod h1:w5LpFSK/gkZQdRXU5xvDcvyvVD5VmyfZ3FNZAVmih2s=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+golang.org/x/exp v0.0.0-20221208152030-732eee02a75a h1:4iLhBPcpqFmylhnkbY3W0ONLUYYkDAW9xMFLfxgsvCw=
+golang.org/x/exp v0.0.0-20221208152030-732eee02a75a/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/2022/go/main.go b/2022/go/main.go
new file mode 100644 (file)
index 0000000..c92f46b
--- /dev/null
@@ -0,0 +1,122 @@
+package main
+
+import (
+       "fmt"
+//     "math/rand"
+       "os"
+//     "strings"
+//     "time"
+
+       "adventofcode2022/utils"
+       "adventofcode2022/day01"
+       "adventofcode2022/day02"
+       "adventofcode2022/day03"
+       "adventofcode2022/day04"
+       "adventofcode2022/day05"
+       "adventofcode2022/day06"
+       "adventofcode2022/day07"
+       "adventofcode2022/day08"
+       "adventofcode2022/day09"
+       "adventofcode2022/day10"
+
+)
+
+// Usage: go run main.go <NN>
+// assumes input is in day<NN>/input.txt
+func main() {
+       d := day()
+       fmt.Printf("Running day %02d\n", d)
+
+       switch d {
+       case 1:
+               fmt.Printf("part 1: %d\n", day01.Part1(utils.Readfile(d)))
+               fmt.Printf("part 2: %d\n", day01.Part2(utils.Readfile(d)))
+       case 2:
+               fmt.Printf("part 1: %d\n", day02.Part1(utils.Readfile(d)))
+               fmt.Printf("part 2: %d\n", day02.Part2(utils.Readfile(d)))
+       case 3:
+               fmt.Printf("part 1: %d\n", day03.Part1(utils.Readfile(d)))
+               fmt.Printf("part 2: %d\n", day03.Part2(utils.Readfile(d)))
+       case 4:
+               fmt.Printf("part 1: %d\n", day04.Part1(utils.Readfile(d)))
+               fmt.Printf("part 2: %d\n", day04.Part2(utils.Readfile(d)))
+       case 5:
+               fmt.Printf("part 1: %s\n", day05.Part1(utils.Readfile(d)))
+               fmt.Printf("part 2: %s\n", day05.Part2(utils.Readfile(d)))
+       case 6:
+               fmt.Printf("part 1: %d\n", day06.Part1(utils.Readfile(d)))
+               fmt.Printf("part 2: %d\n", day06.Part2(utils.Readfile(d)))
+       case 7:
+               fmt.Printf("part 1: %d\n", day07.Part1(utils.Readfile(d)))
+               fmt.Printf("part 2: %d\n", day07.Part2(utils.Readfile(d)))
+       case 8:
+               fmt.Printf("part 1: %d\n", day08.Part1(utils.Readfile(d)))
+               fmt.Printf("part 2: %d\n", day08.Part2(utils.Readfile(d)))
+       case 9:
+               fmt.Printf("part 1: %d\n", day09.Part1(utils.Readfile(d)))
+               fmt.Printf("part 2: %d\n", day09.Part2(utils.Readfile(d)))
+       case 10:
+               fmt.Printf("part 1: %d\n", day10.Part1(utils.Readfile(d)))
+               fmt.Printf("part 2: %s\n", day10.Part2(utils.Readfile(d)))
+       default:
+               panic(fmt.Errorf("no such day: %d", d))
+       }
+}
+
+// Reads day from os.Args.
+func day() int {
+       latest := 9
+       if len(os.Args) == 1 {
+               return latest
+       }
+
+       if os.Args[1] == "next" {
+               genNext(latest + 1)
+               os.Exit(0)
+       }
+       day := utils.MustAtoi(os.Args[1])
+       return day
+}
+
+
+func genNext(n int) {
+       os.Mkdir(fmt.Sprintf("day%02d", n), 0755)
+       f, err := os.Create(fmt.Sprintf("day%02d/day%02d.go", n, n))
+       utils.PanicOnErr(err)
+       defer f.Close()
+       f.WriteString(fmt.Sprintf(`package day%02d
+
+func Part1(input string) int {
+       return 0
+}
+
+func Part2(input string) int {
+       return 0
+}
+`, n))
+       fmt.Printf("wrote day%02d/day%02d.go\n", n, n)
+
+       f, err = os.Create(fmt.Sprintf("day%02d/day%02d_test.go", n, n))
+       utils.PanicOnErr(err)
+       defer f.Close()
+       f.WriteString(fmt.Sprintf(`package day%02d
+
+import (
+       "testing"
+
+       "github.com/stretchr/testify/require"
+)
+
+func TestPart1(t *testing.T) {
+       r := Part1("")
+       require.Equal(t, 0, r)
+}
+
+func TestPart2(t *testing.T) {
+       r := Part2("")
+       require.Equal(t, 0, r)
+}
+`, n))
+       fmt.Printf("wrote day%02d/day%02d_test.go\n", n, n)
+
+}
\ No newline at end of file
diff --git a/2022/go/utils/grid2d/grid2d.go b/2022/go/utils/grid2d/grid2d.go
new file mode 100644 (file)
index 0000000..561a34f
--- /dev/null
@@ -0,0 +1,74 @@
+package grid2d
+
+import (
+       "strings"
+
+       "adventofcode2022/utils"
+)
+
+type Grid[T any] struct {
+       sizeX, sizeY int
+       matrix       [][]T
+       empty        T
+}
+
+func NewGrid[T any](sizeX, sizeY int, empty T) *Grid[T] {
+       matrix := make([][]T, sizeY)
+       rows := make([]T, sizeX*sizeY)
+       for i := 0; i < sizeX*sizeY; i++ {
+               rows[i] = empty
+       }
+
+       j := 0
+       for i := 0; i < sizeY; i++ {
+               matrix[i] = rows[j : j+sizeX : j+sizeX]
+               j += sizeX
+       }
+       return &Grid[T]{
+               sizeX:  sizeX,
+               sizeY:  sizeY,
+               matrix: matrix,
+               empty:  empty,
+       }
+}
+
+func (g *Grid[T]) SizeX() int {
+       return g.sizeX
+}
+
+func (g *Grid[T]) SizeY() int {
+       return g.sizeY
+}
+
+func (g *Grid[T]) Get(x, y int) T {
+       if x < 0 || x >= g.sizeX {
+               return g.empty
+       }
+       if y < 0 || y >= g.sizeY {
+               return g.empty
+       }
+       return g.matrix[y][x]
+}
+
+func (g *Grid[T]) Set(x, y int, v T) {
+       if x < 0 || x >= g.sizeX {
+               panic("invalid x")
+       }
+       if y < 0 || y >= g.sizeY {
+               panic("invalid y")
+       }
+       g.matrix[y][x] = v
+}
+
+func (g *Grid[T]) StringWithFormatter(formatter func(T, int, int) string) string {
+       var r strings.Builder
+       for j := 0; j < g.sizeY; j++ {
+               for i := 0; i < g.sizeX; i++ {
+                       _, err := r.WriteString(formatter(g.matrix[j][i], i, j))
+                       utils.PanicOnErr(err)
+               }
+               _, err := r.WriteRune('\n')
+               utils.PanicOnErr(err)
+       }
+       return r.String()
+}
diff --git a/2022/go/utils/inputs/inputs.go b/2022/go/utils/inputs/inputs.go
new file mode 100644 (file)
index 0000000..1a51933
--- /dev/null
@@ -0,0 +1,45 @@
+package inputs
+
+import (
+       "strings"
+
+       "adventofcode2022/utils"
+       "adventofcode2022/utils/grid2d"
+       sparsegrid "adventofcode2022/utils/sparseGrid"
+)
+
+func ToInts(input string, sep string) []int {
+       var r []int
+       for _, line := range strings.Split(input, sep) {
+               if line != "" {
+                       r = append(r, utils.MustAtoi(line))
+               }
+       }
+       return r
+}
+
+func ToGrid2D[T any](input, rowSep, colSep string, empty T, conv func(string) T) *grid2d.Grid[T] {
+       lines := strings.Split(input, rowSep)
+
+       grid := grid2d.NewGrid(len(lines[0]), len(lines), empty)
+       for y, line := range lines {
+               for x, v := range strings.Split(line, colSep) {
+                       grid.Set(x, y, conv(v))
+               }
+       }
+
+       return grid
+}
+
+func ToSparseGrid[T comparable](input, rowSep, colSep string, empty T, conv func(string) T) *sparsegrid.SparseGrid[T] {
+       lines := strings.Split(input, rowSep)
+
+       grid := sparsegrid.NewGrid(empty)
+       for y, line := range lines {
+               for x, v := range strings.Split(line, colSep) {
+                       grid.Set(x, y, conv(v))
+               }
+       }
+
+       return grid
+}
diff --git a/2022/go/utils/sparseGrid/sparseGrid.go b/2022/go/utils/sparseGrid/sparseGrid.go
new file mode 100644 (file)
index 0000000..11b5a13
--- /dev/null
@@ -0,0 +1,81 @@
+package sparsegrid
+
+import (
+       "fmt"
+       "strings"
+
+       "adventofcode2022/utils"
+)
+
+type SparseGrid[T comparable] struct {
+       minX, maxX, minY, maxY int
+       data                   map[string]T
+       empty                  T
+}
+
+func NewGrid[T comparable](empty T) *SparseGrid[T] {
+       return &SparseGrid[T]{
+               minX:  utils.MaxInt,
+               maxX:  utils.MinInt,
+               minY:  utils.MaxInt,
+               maxY:  utils.MinInt,
+               data:  map[string]T{},
+               empty: empty,
+       }
+}
+
+func (g *SparseGrid[T]) SizeX() (int, int) {
+       return g.minX, g.maxX
+}
+
+func (g *SparseGrid[T]) SizeY() (int, int) {
+       return g.minY, g.maxY
+}
+
+func (g *SparseGrid[T]) Visited() int {
+       return len(g.data)
+}
+
+func (g *SparseGrid[T]) Get(x, y int) T {
+       k := key(x, y)
+       v, ok := g.data[k]
+       if !ok {
+               return g.empty
+       }
+       return v
+}
+
+func (g *SparseGrid[T]) Set(x, y int, v T) {
+       k := key(x, y)
+       current, ok := g.data[k]
+       if ok && v == current {
+               return
+       } else if !ok && v == g.empty {
+               return
+       } else if v == g.empty {
+               delete(g.data, k)
+       } else {
+               g.data[k] = v
+               g.minX = utils.Min(g.minX, x)
+               g.maxX = utils.Max(g.maxX, x)
+               g.minY = utils.Min(g.minY, y)
+               g.maxY = utils.Max(g.maxY, y)
+       }
+}
+
+func (g *SparseGrid[T]) StringWithFormatter(formatter func(T, int, int) string) string {
+       var r strings.Builder
+       for j := g.minY; j <= g.maxY; j++ {
+               for i := g.minX; i <= g.maxX; i++ {
+                       _, err := r.WriteString(formatter(g.Get(i, j), i, j))
+                       utils.PanicOnErr(err)
+               }
+               _, err := r.WriteRune('\n')
+               utils.PanicOnErr(err)
+       }
+       return r.String()
+}
+
+func key(x, y int) string {
+       return fmt.Sprintf("%d:%d", x, y)
+}
diff --git a/2022/go/utils/utils.go b/2022/go/utils/utils.go
new file mode 100644 (file)
index 0000000..973c9ad
--- /dev/null
@@ -0,0 +1,207 @@
+package utils
+
+import (
+       "bufio"
+       "fmt"
+       "io"
+       "os"
+       "reflect"
+       "regexp"
+       "strconv"
+       "strings"
+
+       "golang.org/x/exp/constraints"
+)
+
+func PanicOnErr(err error) {
+       if err != nil {
+               panic(err)
+       }
+}
+
+const MaxInt = int(^uint(0) >> 1)
+const MinInt = ^MaxInt
+
+func Max[T constraints.Ordered](a, b T) T {
+       if a > b {
+               return a
+       }
+       return b
+}
+
+func Min[T constraints.Ordered](a, b T) T {
+       if a < b {
+               return a
+       }
+       return b
+}
+
+func SliceMinMax[T constraints.Ordered](slice []T) (*T, *T) {
+       if len(slice) == 0 {
+               return nil, nil
+       }
+       min := &slice[0]
+       max := &slice[0]
+       for i, v := range slice {
+               if v < *min {
+                       min = &slice[i]
+               }
+               if v > *max {
+                       max = &slice[i]
+               }
+       }
+       return min, max
+}
+
+func MustAtoi(s string) int {
+       v, err := strconv.Atoi(s)
+       PanicOnErr(err)
+       return v
+}
+
+// Returns key from map[T]int which has the max value
+func MapFindMax(m interface{}) interface{} {
+       var maxK interface{} = nil
+       var maxV = MinInt
+       iter := reflect.ValueOf(m).MapRange()
+       for iter.Next() {
+               k := iter.Key()
+               v := int(iter.Value().Int())
+               if v > maxV {
+                       maxV = v
+                       maxK = k.Interface()
+               }
+       }
+       return maxK
+}
+
+// Returns key from map[T]int which has the min value
+func MapFindMin(m interface{}) interface{} {
+       var minK interface{} = nil
+       var minV = MaxInt
+       iter := reflect.ValueOf(m).MapRange()
+       for iter.Next() {
+               k := iter.Key()
+               v := int(iter.Value().Int())
+               if v < minV {
+                       minV = v
+                       minK = k.Interface()
+               }
+       }
+       return minK
+}
+
+func Readfile(day int) string {
+       filename := fmt.Sprintf("day%02d/input.txt", day)
+       file, err := os.Open(filename)
+       PanicOnErr(err)
+       defer file.Close()
+
+       reader := bufio.NewReader(file)
+       contents, err := io.ReadAll(reader)
+       PanicOnErr(err)
+
+       return strings.TrimSuffix(string(contents), "\n")
+}
+
+func ParseToStruct(re *regexp.Regexp, input string, target interface{}) bool {
+       m := re.FindStringSubmatch(input)
+       if m == nil {
+               return false
+       }
+
+       var useOffset bool
+
+       for i, name := range re.SubexpNames() {
+               if i == 0 {
+                       continue
+               }
+               var field reflect.Value
+               if name == "" {
+                       // use offset
+                       if i == 1 {
+                               useOffset = true
+                       } else if !useOffset {
+                               panic("can't mix named and unnamed subexpressions")
+                       }
+                       field = reflect.ValueOf(target).Elem().Field(i - 1)
+               } else {
+                       // use name
+                       if i == 1 {
+                               useOffset = false
+                       } else if useOffset {
+                               panic("can't mix named and unnamed subexpressions")
+                       }
+                       field = reflect.ValueOf(target).Elem().FieldByName(name)
+               }
+               if field.Kind() == reflect.String {
+                       field.SetString(m[i])
+               } else if field.Kind() == reflect.Int {
+                       v, err := strconv.Atoi(m[i])
+                       PanicOnErr(err)
+                       field.SetInt(int64(v))
+               } else if field.Kind() == reflect.Uint8 {
+                       if len(m[i]) != 1 {
+                               panic(fmt.Sprintf("expecting 1 char, got: %s", m[i]))
+                       }
+                       field.SetUint(uint64(m[i][0]))
+               } else {
+                       panic(fmt.Sprintf("unknown kind: %s", field.Kind()))
+               }
+       }
+       return true
+}
+
+func MustParseToStruct(re *regexp.Regexp, input string, target interface{}) {
+       if !ParseToStruct(re, input, target) {
+               panic(fmt.Errorf("failed to parse: %s", input))
+       }
+}
+
+func CharToLower(c byte) byte {
+       return strings.ToLower(string(c))[0]
+}
+
+func CharToUpper(c byte) byte {
+       return strings.ToUpper(string(c))[0]
+}
+
+func Contains(haystack []string, needle string) bool {
+       for _, s := range haystack {
+               if s == needle {
+                       return true
+               }
+       }
+       return false
+}
+
+func Abs[T constraints.Signed](x T) T {
+       if x < 0 {
+               return -x
+       }
+       return x
+}
+
+func Gcd(x, y int) int {
+       if x <= 0 || y <= 0 {
+               panic(fmt.Errorf("invalid input: %d, %d", x, y))
+       }
+       if x == y {
+               return x
+       }
+       if x > y {
+               return Gcd(x-y, y)
+       } else {
+               return Gcd(x, y-x)
+       }
+}
+
+func Sign[T constraints.Signed](x T) int {
+       if x < 0 {
+               return -1
+       } else if x > 0 {
+               return 1
+       } else {
+               return 0
+       }
+}