~xenrox/aoc2021

3c0f1e9a6934aba3e06638fb76d427cb1f27fb0d — Thorben Günther 2 years ago
Add day01
7 files changed, 2128 insertions(+), 0 deletions(-)

A data/day01.dat
A data/day01_test.dat
A day01/day01_test.go
A day01/main.go
A day01/utils.go
A go.mod
A main.go
A  => data/day01.dat +2000 -0
@@ 1,2000 @@
137
138
139
140
143
146
147
149
155
156
159
153
163
169
175
180
183
184
206
219
226
233
231
232
234
231
234
231
234
232
230
235
225
237
245
254
263
275
288
290
291
292
316
334
343
346
359
354
352
374
377
378
391
409
419
427
433
437
411
416
435
442
438
440
443
459
460
466
467
468
467
470
488
493
504
505
506
517
523
526
525
532
541
558
559
561
563
565
582
589
595
586
571
603
607
621
634
642
646
648
651
685
702
707
729
738
741
736
737
761
763
765
769
772
774
779
795
809
835
841
836
845
848
849
874
878
880
881
889
890
915
932
936
945
946
966
965
968
980
987
989
993
994
996
997
1027
1028
1049
1047
1048
1047
1062
1057
1066
1071
1084
1093
1095
1098
1100
1104
1105
1117
1160
1165
1166
1184
1180
1181
1182
1202
1206
1204
1217
1227
1228
1248
1249
1258
1262
1267
1288
1285
1280
1286
1288
1303
1307
1308
1309
1338
1346
1357
1367
1368
1373
1386
1387
1389
1380
1407
1405
1419
1440
1465
1480
1485
1489
1490
1492
1497
1498
1497
1499
1500
1493
1503
1523
1530
1536
1544
1553
1569
1573
1574
1605
1613
1620
1628
1629
1632
1625
1626
1631
1630
1632
1633
1639
1655
1654
1670
1668
1673
1675
1676
1671
1673
1675
1677
1671
1669
1692
1695
1698
1701
1712
1711
1712
1715
1732
1728
1726
1742
1743
1744
1746
1739
1744
1757
1758
1760
1769
1772
1773
1782
1789
1794
1799
1828
1852
1856
1859
1866
1867
1868
1876
1877
1869
1874
1873
1901
1910
1912
1913
1919
1939
1940
1941
1948
1977
1976
1978
2011
2012
2015
2025
2035
2046
2040
2041
2062
2063
2064
2086
2104
2112
2111
2120
2121
2130
2139
2141
2154
2155
2157
2158
2185
2181
2183
2188
2189
2192
2197
2191
2200
2192
2220
2223
2231
2237
2246
2254
2245
2257
2258
2263
2268
2269
2281
2280
2284
2291
2328
2331
2313
2319
2321
2324
2327
2328
2346
2347
2346
2347
2348
2350
2353
2344
2335
2337
2339
2338
2342
2347
2350
2351
2356
2378
2379
2387
2386
2385
2384
2393
2407
2408
2409
2412
2413
2409
2422
2430
2431
2432
2457
2458
2459
2468
2472
2473
2480
2511
2493
2506
2514
2522
2524
2525
2530
2540
2527
2536
2546
2548
2552
2547
2552
2551
2569
2573
2590
2607
2626
2624
2641
2642
2643
2645
2666
2691
2702
2719
2734
2735
2743
2750
2769
2796
2797
2800
2804
2806
2820
2821
2822
2826
2834
2835
2836
2840
2841
2842
2838
2826
2827
2844
2843
2844
2857
2875
2877
2878
2908
2912
2913
2916
2921
2920
2923
2924
2925
2942
2943
2972
2984
2987
2999
3020
3014
3018
3017
3015
3016
3018
3021
2997
3000
2989
2981
2988
2989
2988
2989
2990
2993
2998
2999
3000
3007
3012
3013
3023
3022
3028
3063
3079
3085
3086
3085
3087
3097
3102
3103
3110
3114
3120
3136
3141
3163
3164
3166
3168
3179
3174
3175
3180
3196
3210
3188
3202
3204
3201
3207
3208
3217
3225
3231
3230
3231
3230
3274
3292
3296
3321
3351
3365
3367
3378
3381
3379
3380
3385
3383
3384
3393
3403
3404
3411
3426
3420
3422
3423
3440
3449
3460
3459
3460
3463
3464
3468
3492
3506
3513
3520
3525
3526
3529
3535
3553
3555
3556
3548
3563
3565
3568
3571
3572
3578
3583
3585
3586
3590
3602
3604
3610
3611
3612
3640
3649
3668
3658
3650
3652
3654
3657
3639
3640
3651
3639
3653
3655
3662
3683
3684
3686
3692
3693
3707
3717
3722
3735
3737
3743
3756
3753
3754
3756
3759
3760
3764
3766
3796
3800
3809
3817
3818
3819
3820
3799
3798
3801
3810
3811
3818
3819
3826
3833
3840
3842
3853
3851
3835
3836
3841
3846
3847
3852
3861
3864
3861
3869
3871
3872
3887
3889
3913
3928
3929
3937
3961
3966
3975
3998
3999
3994
3989
3965
3955
3959
3983
3994
3995
3996
3997
4000
4005
4004
4005
4012
4027
4007
4008
4011
4023
4037
4040
4062
4063
4066
4073
4078
4106
4113
4114
4126
4131
4126
4129
4164
4165
4176
4162
4172
4196
4200
4198
4199
4196
4205
4208
4220
4255
4252
4249
4259
4275
4281
4283
4286
4295
4296
4273
4271
4290
4291
4296
4302
4303
4315
4316
4317
4329
4330
4335
4336
4340
4341
4342
4314
4307
4309
4308
4313
4322
4319
4321
4318
4319
4322
4317
4318
4320
4324
4347
4355
4358
4363
4364
4375
4379
4378
4390
4399
4390
4395
4408
4425
4419
4430
4431
4437
4460
4470
4472
4473
4502
4494
4495
4509
4514
4513
4523
4527
4544
4573
4583
4584
4552
4586
4587
4598
4601
4607
4613
4607
4617
4649
4647
4642
4649
4659
4661
4651
4652
4673
4679
4684
4685
4686
4687
4689
4690
4696
4702
4710
4683
4694
4695
4696
4697
4698
4700
4698
4699
4701
4686
4688
4712
4713
4711
4729
4739
4742
4762
4763
4767
4773
4781
4785
4775
4776
4779
4777
4779
4780
4787
4773
4784
4789
4793
4809
4828
4830
4824
4827
4829
4830
4834
4842
4843
4844
4847
4848
4849
4866
4867
4868
4879
4880
4883
4897
4900
4904
4910
4922
4931
4932
4934
4935
4934
4936
4946
4947
4974
4978
4983
4984
4985
4992
4998
5007
5052
5059
5067
5072
5088
5087
5093
5114
5115
5118
5117
5118
5121
5127
5128
5132
5134
5135
5157
5151
5156
5160
5155
5151
5140
5141
5163
5158
5163
5166
5172
5176
5179
5180
5171
5174
5188
5190
5212
5213
5214
5215
5229
5234
5237
5244
5249
5250
5251
5255
5256
5258
5270
5272
5276
5292
5293
5303
5317
5325
5308
5310
5318
5324
5346
5356
5373
5370
5384
5385
5383
5387
5391
5398
5399
5413
5415
5416
5444
5443
5450
5444
5446
5447
5448
5465
5470
5455
5461
5441
5443
5452
5457
5460
5465
5466
5470
5473
5510
5515
5516
5517
5521
5519
5510
5524
5526
5531
5555
5529
5541
5543
5545
5549
5559
5572
5574
5601
5622
5631
5633
5659
5661
5669
5698
5701
5685
5682
5708
5707
5694
5695
5698
5699
5700
5711
5712
5720
5721
5723
5730
5723
5721
5729
5738
5739
5740
5741
5744
5747
5748
5750
5751
5761
5756
5761
5764
5768
5786
5798
5799
5808
5829
5840
5842
5834
5842
5843
5861
5863
5882
5898
5904
5909
5927
5931
5925
5927
5920
5921
5946
5954
5971
6002
6005
6001
6015
6018
6020
6030
6031
6032
6034
6035
6050
6051
6055
6059
6020
6014
6015
6011
5990
5991
5969
5970
5950
5951
5961
5962
5964
5970
5972
5977
5987
5989
5998
6001
6006
6009
6012
6017
6023
6028
6029
6030
6051
6053
6055
6056
6058
6082
6090
6094
6106
6108
6111
6128
6131
6150
6157
6158
6183
6180
6182
6191
6153
6152
6178
6174
6164
6167
6175
6187
6186
6187
6199
6204
6205
6210
6213
6214
6217
6228
6206
6212
6211
6210
6216
6221
6224
6226
6243
6245
6237
6238
6246
6247
6250
6256
6269
6260
6261
6266
6268
6271
6281
6279
6268
6229
6231
6233
6235
6241
6248
6250
6261
6263
6276
6286
6288
6291
6274
6273
6276
6285
6292
6297
6330
6331
6295
6311
6312
6325
6319
6321
6322
6325
6327
6340
6341
6350
6356
6357
6365
6370
6383
6382
6396
6394
6395
6403
6404
6399
6400
6409
6411
6414
6421
6424
6429
6430
6440
6441
6450
6455
6464
6481
6495
6474
6475
6476
6478
6482
6506
6524
6497
6490
6492
6508
6507
6511
6518
6519
6528
6554
6555
6562
6563
6571
6574
6564
6581
6582
6584
6585
6586
6587
6590
6617
6623
6653
6652
6636
6638
6640
6660
6663
6668
6673
6675
6679
6680
6683
6699
6698
6694
6701
6715
6697
6700
6706
6715
6702
6705
6707
6719
6720
6721
6722
6723
6727
6724
6725
6726
6732
6739
6741
6760
6771
6773
6772
6775
6783
6785
6791
6800
6808
6809
6810
6811
6793
6797
6799
6801
6805
6806
6833
6839
6840
6845
6846
6856
6869
6861
6878
6881
6903
6914
6915
6931
6934
6936
6938
6940
6954
6952
6953
6961
6951
6953
6961
6963
6968
6976
6977
6980
6986
6995
6996
7006
7011
6991
6992
6996
7002
7025
7029
7041
7040
7041
7033
7036
7038
7042
7044
7058
7064
7071
7076
7078
7079
7091
7090
7086
7088
7105
7140
7143
7132
7146
7137
7139
7141
7142
7151
7153
7154
7160
7162
7164
7167
7171
7183
7205
7218
7220
7252
7264
7270
7274
7275
7285
7286
7289
7311
7299
7301
7325
7331
7341
7343
7348
7380
7388
7390
7392
7400
7412
7414
7419
7448
7430
7436
7450
7451
7484
7493
7503
7494
7495
7521
7507
7514
7517
7519
7532
7558
7574
7575
7593
7595
7620
7636
7643
7644
7634
7637
7639
7650
7651
7652
7666
7673
7690
7693
7702
7703
7735
7736
7727
7743
7745
7763
7764
7734
7735
7739
7743
7744
7750
7751
7754
7759
7765
7770
7804
7808
7790
7791
7793
7794
7795
7796
7798
7808
7775
7776
7777
7799
7800
7803
7817
7818
7834
7832
7834
7843
7849
7850
7853
7856
7859
7861
7862
7864
7860
7859
7861
7862
7863
7862
7867
7853
7854
7860
7855
7859
7860
7865
7845
7855
7858
7881
7882
7899
7902
7930
7931
7932
7933
7935
7938
7941
7953
7954
7952
7965
7967
7976
7977
7980
7982
7991
8001
8017
8018
8036
8037
8047
8049
8051
8041
8043
8044
8045
8046
8047
8048
8054
8055
8082
8083
8084
8093
8094
8116
8117
8118
8124
8125
8142
8145
8150
8154
8156
8175
8176
8184
8190
8184
8200
8214
8236
8237
8253
8264
8271
8280
8282
8284
8296
8297
8299
8304
8329
8341
8345
8358
8359
8366
8370
8368
8374
8377
8378
8379
8390
8391
8394
8399
8405
8406
8405
8404
8397
8400
8406
8426
8427
8451
8457
8458
8459
8470
8448
8450
8452
8474
8494
8495
8500
8499
8496
8500
8501
8502
8503
8530
8541
8545
8547
8566
8593
8596
8597
8596
8609
8612
8627
8631
8623
8624
8626
8641
8642
8644
8646
8651
8654
8657
8666
8673
8674
8687
8707
8715
8722
8711
8712
8715
8712
8719
8722
8719
8720
8722
8723
8727
8729
8731
8732
8733
8737
8743
8741
8742
8747
8749
8753
8766
8771
8776
8784
8789
8806
8816
8840
8847
8858
8859
8860
8862
8863
8866
8867
8873
8884
8882
8884
8890
8858
8861
8862
8860
8861
8879
8900
8928
8940
8942
8940
8961
8962
8969
8988
8993
8998
9006
9011
9013
9037
9050
9060
9067
9068
9090
9108
9113
9116
9137
9138
9115
9116
9119
9125
9126
9124
9151
9161
9170
9173
9182
9187
9202
9203
9221
9223
9222
9223
9234
9235
9249
9268
9260
9284
9302
9305
9324
9325
9326
9320
9315
9317
9319
9320
9336
9347
9354
9371
9376
9386
9387
9397
9396
9397
9399
9404
9405
9407
9423
9424
9432
9434
9435
9436
9438
9448
9456
9457
9458
9457
9448
9449
9453
9454
9460
9469
9458
9459
9469
9477
9481
9482
9488
9496
9497
9498
9500
9501
9518
9520
9523
9539
9537
9548
9555
9568
9576
9579
9589
9591
9590
9594
9595
9596
9598
9605
9602
9604
9600
9613
9610
9616
9638
9639
9640
9648
9653
9667
9679
9680
9681
9677
9679
9680
9681
9706
9707
9709
9710
9714
9719
9736
9739
9762
9753
9770
9739
9752
9753
9752
9753
9762
9764
9765
9766
9769
9774
9773
9782
9792
9793
9798
9809
9810
9809
9806
9807
9806
9808
9810
9813
9818
9816
9832
9833
9831
9851
9839
9847
9849
9850
9851
9853
9854
9858
9862
9865
9872
9875
9881
9883
9884
9885
9898
9903
9904
9899
9906
9907
9909
9939
9955
9956
9957
9963
9964
9965
9969
9972
9980
10002
10003
10004
10007
10008
10015
10032
10047
10060
10066
10071
10078
10079
10083
10095
10096
10097
10090
10091
10088
10085
10095
10096
10099
10089
10108
10109
10110
10107
10112
10119
10135
10133
10121
10130
10125
10127
10128
10131
10121
10134
10137
10139
10179
10180
10182
10194

A  => data/day01_test.dat +10 -0
@@ 1,10 @@
199
200
208
210
200
207
240
269
260
263

A  => day01/day01_test.go +25 -0
@@ 1,25 @@
package day01

import "testing"

func Test1(t *testing.T) {
	res, err := calc1("../data/day01_test.dat")
	if err != nil {
		t.Errorf("error calculating: %v", err)
	}

	if res != 7 {
		t.Errorf("wrong result, expected %d, got %d", 7, res)
	}
}

func Test2(t *testing.T) {
	res, err := calc2("../data/day01_test.dat")
	if err != nil {
		t.Errorf("error calculating: %v", err)
	}

	if res != 5 {
		t.Errorf("wrong result, expected %d, got %d", 5, res)
	}
}

A  => day01/main.go +54 -0
@@ 1,54 @@
package day01

import (
	"fmt"
	"log"
)

func Run() {
	res, err := calc1("data/day01.dat")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("Part 1: %d\n", res)

	res, err = calc2("data/day01.dat")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("Part 2: %d\n", res)
}

func calc1(path string) (int, error) {
	lines, err := readFile(path)
	if err != nil {
		return 0, err
	}

	count := 0
	for i := 1; i < len(lines); i++ {
		if lines[i] > lines[i-1] {
			count++
		}
	}

	return count, err
}

func calc2(path string) (int, error) {
	lines, err := readFile(path)
	if err != nil {
		return 0, err
	}

	count := 0
	for i := 0; i < len(lines)-3; i++ {
		if lines[i] < lines[i+3] {
			count++
		}
	}

	return count, err
}

A  => day01/utils.go +29 -0
@@ 1,29 @@
package day01

import (
	"bufio"
	"os"
	"strconv"
)

func readFile(path string) ([]int, error) {
	var lines []int

	f, err := os.Open(path)
	if err != nil {
		return lines, err
	}
	defer f.Close()

	scanner := bufio.NewScanner(f)
	for scanner.Scan() {
		line, err := strconv.Atoi(scanner.Text())
		if err != nil {
			return lines, err
		}

		lines = append(lines, line)
	}

	return lines, nil
}

A  => go.mod +3 -0
@@ 1,3 @@
module git.xenrox.net/~xenrox/aoc2021

go 1.17

A  => main.go +7 -0
@@ 1,7 @@
package main

import "git.xenrox.net/~xenrox/aoc2021/day01"

func main() {
	day01.Run()
}