aboutsummaryrefslogtreecommitdiff
path: root/2021
diff options
context:
space:
mode:
authorjacopograndi <jacopo.grandi@outlook.it>2022-01-06 18:42:22 +0100
committerjacopograndi <jacopo.grandi@outlook.it>2022-01-06 18:42:22 +0100
commit9f7b0cd76272068588d0a7220408f91390c5b583 (patch)
tree49a517f0303c951023554ba6b3fb8cc3d5eb1234 /2021
parent72a3388c042f4812e2db33f6d6a1b757392a18a6 (diff)
moved
Diffstat (limited to '2021')
-rwxr-xr-x2021/day01/day01bin0 -> 79296 bytes
-rw-r--r--2021/day01/day01.cpp52
-rw-r--r--2021/day01/day01_input.txt2000
-rw-r--r--2021/day01/day01_input_ez.txt10
-rw-r--r--2021/day01/makefile2
-rwxr-xr-x2021/day02/day02bin0 -> 47672 bytes
-rw-r--r--2021/day02/day02.cpp50
-rw-r--r--2021/day02/day02_input.txt1000
-rw-r--r--2021/day02/makefile2
-rwxr-xr-x2021/day03/day03bin0 -> 83112 bytes
-rw-r--r--2021/day03/day03.cpp96
-rw-r--r--2021/day03/day03_input.txt1000
-rw-r--r--2021/day03/day03_input_ez.txt12
-rw-r--r--2021/day03/makefile2
-rwxr-xr-x2021/day04/day04bin0 -> 116280 bytes
-rw-r--r--2021/day04/day04.cpp134
-rw-r--r--2021/day04/day04_input.txt601
-rw-r--r--2021/day04/day04_input_ez.txt19
-rw-r--r--2021/day04/makefile2
-rwxr-xr-x2021/day05/day05bin0 -> 104096 bytes
-rw-r--r--2021/day05/day05.cpp100
-rw-r--r--2021/day05/day05_input.txt500
-rw-r--r--2021/day05/day05_input_ez.txt10
-rw-r--r--2021/day05/makefile2
-rwxr-xr-x2021/day06/day06bin0 -> 76512 bytes
-rw-r--r--2021/day06/day06.cpp47
-rw-r--r--2021/day06/day06_input.txt1
-rw-r--r--2021/day06/day06_input_ez.txt1
-rw-r--r--2021/day06/makefile2
-rwxr-xr-x2021/day07/day07bin0 -> 76312 bytes
-rw-r--r--2021/day07/day07.cpp40
-rw-r--r--2021/day07/day07_input.txt1
-rw-r--r--2021/day07/day07_input_ez.txt1
-rw-r--r--2021/day07/makefile2
-rwxr-xr-x2021/day08/day08bin0 -> 84872 bytes
-rw-r--r--2021/day08/day08.cpp72
-rw-r--r--2021/day08/day08_input.txt200
-rw-r--r--2021/day08/day08_input_ez.txt10
-rw-r--r--2021/day08/makefile2
-rw-r--r--2021/utils.h26
40 files changed, 5999 insertions, 0 deletions
diff --git a/2021/day01/day01 b/2021/day01/day01
new file mode 100755
index 0000000..8fb500a
--- /dev/null
+++ b/2021/day01/day01
Binary files differ
diff --git a/2021/day01/day01.cpp b/2021/day01/day01.cpp
new file mode 100644
index 0000000..113f86d
--- /dev/null
+++ b/2021/day01/day01.cpp
@@ -0,0 +1,52 @@
+#include <iostream>
+#include <string>
+#include <vector>
+#include <algorithm>
+
+std::string read (char* name) {
+ FILE *f = fopen(name, "r");
+ char c = fgetc(f); std::string txt;
+ while (c != EOF) { txt += c; c = fgetc(f); }
+ fclose(f);
+ return txt;
+}
+
+std::vector<std::string> split (std::vector<std::string> vec, std::string name) {
+ auto token = name.find("\n");
+ if (token != std::string::npos) {
+ vec.push_back(name.substr(0, token));
+ return split(vec, name.substr(token+1));
+ } else if (name.size() > 1) {
+ vec.push_back(name);
+ }
+ return vec;
+}
+
+int main (int argc, char* argv[]) {
+ if (argc < 2 && argc > 3) return 1;
+ std::string txt = read(argv[1]);
+
+ std::vector<std::string> vec;
+ vec = split(vec, txt);
+ std::vector<int> depths;
+ for (auto v : vec) {
+ depths.push_back(std::stoi(v));
+ }
+
+ int window = 1;
+ if (argc == 3) { window = atoi(argv[2]); }
+
+ int inc = 0;
+ for (std::size_t i=0; i<depths.size(); i++) {
+ if (i >= window) {
+ int sum0 = 0, sum1 = 0;
+ for (int j=0; j<window; j++) sum0 += depths[i-j-1];
+ for (int j=0; j<window; j++) sum1 += depths[i-j];
+ if (sum1 > sum0) inc ++;
+ }
+ }
+
+ std::cout << "The number of depth increases is " << inc << std::endl;
+
+ return 0;
+}
diff --git a/2021/day01/day01_input.txt b/2021/day01/day01_input.txt
new file mode 100644
index 0000000..b3ee114
--- /dev/null
+++ b/2021/day01/day01_input.txt
@@ -0,0 +1,2000 @@
+198
+208
+209
+212
+213
+217
+218
+223
+222
+224
+216
+233
+238
+239
+240
+250
+263
+264
+267
+274
+288
+316
+319
+330
+340
+347
+349
+354
+350
+349
+351
+352
+353
+371
+383
+385
+405
+413
+455
+451
+459
+458
+459
+461
+463
+475
+480
+486
+489
+497
+502
+512
+513
+516
+517
+528
+559
+560
+558
+565
+566
+567
+571
+573
+574
+582
+583
+585
+589
+597
+608
+607
+614
+619
+608
+624
+665
+666
+675
+695
+698
+703
+711
+733
+738
+739
+742
+743
+763
+775
+778
+804
+806
+810
+812
+818
+819
+828
+867
+866
+876
+878
+881
+875
+881
+858
+859
+868
+869
+860
+888
+890
+891
+893
+894
+919
+924
+925
+933
+937
+950
+955
+966
+984
+989
+993
+996
+997
+1015
+1031
+1035
+1039
+1055
+1057
+1058
+1059
+1060
+1061
+1067
+1069
+1070
+1059
+1060
+1077
+1079
+1078
+1080
+1087
+1088
+1090
+1097
+1082
+1102
+1105
+1106
+1120
+1125
+1130
+1132
+1154
+1141
+1135
+1131
+1133
+1134
+1137
+1138
+1141
+1142
+1143
+1166
+1175
+1193
+1201
+1236
+1238
+1234
+1240
+1242
+1243
+1271
+1276
+1277
+1272
+1286
+1288
+1290
+1292
+1317
+1341
+1361
+1363
+1375
+1376
+1377
+1383
+1387
+1390
+1402
+1404
+1412
+1418
+1426
+1429
+1466
+1480
+1483
+1478
+1484
+1486
+1488
+1491
+1486
+1489
+1492
+1517
+1520
+1523
+1539
+1546
+1551
+1521
+1517
+1518
+1522
+1525
+1526
+1539
+1540
+1544
+1545
+1561
+1571
+1572
+1574
+1575
+1568
+1573
+1587
+1588
+1600
+1603
+1627
+1629
+1633
+1645
+1670
+1671
+1685
+1690
+1696
+1698
+1703
+1698
+1699
+1702
+1714
+1716
+1709
+1738
+1753
+1761
+1766
+1769
+1772
+1761
+1763
+1774
+1781
+1782
+1799
+1802
+1816
+1818
+1819
+1805
+1810
+1817
+1819
+1831
+1834
+1835
+1852
+1855
+1858
+1859
+1856
+1857
+1868
+1885
+1891
+1893
+1890
+1891
+1892
+1893
+1896
+1911
+1912
+1914
+1916
+1914
+1918
+1930
+1932
+1958
+1966
+1976
+1982
+1985
+1986
+1987
+1992
+1997
+2031
+2041
+2042
+2044
+2058
+2060
+2075
+2073
+2084
+2087
+2090
+2125
+2128
+2129
+2130
+2131
+2136
+2137
+2145
+2150
+2152
+2155
+2161
+2162
+2165
+2167
+2189
+2197
+2199
+2214
+2226
+2233
+2234
+2241
+2242
+2256
+2259
+2263
+2257
+2267
+2270
+2269
+2272
+2273
+2275
+2279
+2284
+2285
+2266
+2271
+2287
+2291
+2310
+2313
+2314
+2317
+2311
+2312
+2311
+2312
+2326
+2331
+2332
+2338
+2340
+2352
+2355
+2360
+2361
+2357
+2371
+2384
+2380
+2392
+2393
+2396
+2397
+2400
+2417
+2420
+2421
+2422
+2444
+2457
+2458
+2464
+2467
+2494
+2495
+2498
+2510
+2514
+2521
+2526
+2525
+2533
+2536
+2547
+2544
+2547
+2556
+2557
+2558
+2561
+2570
+2571
+2573
+2575
+2583
+2584
+2585
+2572
+2574
+2575
+2587
+2589
+2590
+2602
+2603
+2604
+2605
+2589
+2603
+2608
+2611
+2616
+2613
+2617
+2618
+2619
+2628
+2629
+2630
+2631
+2639
+2645
+2649
+2657
+2665
+2673
+2680
+2679
+2680
+2702
+2703
+2709
+2711
+2714
+2715
+2716
+2715
+2721
+2720
+2739
+2745
+2748
+2752
+2749
+2748
+2749
+2751
+2752
+2750
+2760
+2777
+2778
+2779
+2780
+2787
+2800
+2805
+2810
+2812
+2820
+2821
+2843
+2846
+2853
+2862
+2861
+2867
+2880
+2890
+2891
+2892
+2885
+2887
+2890
+2894
+2897
+2925
+2926
+2931
+2933
+2940
+2943
+2941
+2959
+2971
+2982
+2984
+3002
+3006
+3008
+3012
+3013
+3034
+3043
+3059
+3063
+3064
+3060
+3075
+3090
+3091
+3104
+3108
+3114
+3117
+3106
+3104
+3110
+3113
+3114
+3126
+3119
+3138
+3140
+3141
+3143
+3139
+3145
+3147
+3153
+3161
+3170
+3168
+3180
+3181
+3177
+3196
+3210
+3216
+3232
+3233
+3234
+3235
+3239
+3240
+3242
+3243
+3244
+3243
+3248
+3249
+3275
+3276
+3278
+3280
+3286
+3291
+3293
+3294
+3301
+3310
+3319
+3326
+3338
+3339
+3348
+3366
+3376
+3371
+3372
+3404
+3407
+3408
+3425
+3444
+3451
+3457
+3452
+3459
+3468
+3491
+3475
+3476
+3481
+3505
+3516
+3519
+3542
+3543
+3541
+3542
+3541
+3551
+3553
+3552
+3533
+3542
+3543
+3561
+3562
+3563
+3566
+3571
+3572
+3596
+3600
+3603
+3607
+3608
+3609
+3613
+3654
+3665
+3672
+3661
+3662
+3663
+3670
+3676
+3683
+3707
+3709
+3714
+3717
+3709
+3710
+3713
+3714
+3715
+3716
+3735
+3749
+3763
+3770
+3784
+3782
+3786
+3790
+3792
+3794
+3803
+3805
+3819
+3823
+3826
+3828
+3838
+3839
+3843
+3870
+3877
+3888
+3889
+3891
+3892
+3893
+3894
+3880
+3860
+3878
+3880
+3888
+3893
+3898
+3904
+3906
+3907
+3910
+3918
+3927
+3946
+3973
+3982
+3979
+3980
+3993
+3984
+3988
+3986
+3987
+3988
+3989
+3997
+4000
+4001
+4025
+4030
+4034
+4038
+4040
+4044
+4046
+4048
+4057
+4067
+4079
+4092
+4094
+4122
+4124
+4128
+4127
+4128
+4132
+4136
+4141
+4146
+4151
+4153
+4163
+4167
+4168
+4170
+4172
+4176
+4177
+4178
+4194
+4198
+4199
+4201
+4203
+4204
+4205
+4204
+4209
+4211
+4213
+4224
+4240
+4242
+4255
+4266
+4280
+4284
+4295
+4310
+4323
+4343
+4351
+4359
+4383
+4387
+4388
+4397
+4401
+4403
+4404
+4405
+4425
+4431
+4435
+4439
+4444
+4452
+4461
+4470
+4466
+4467
+4469
+4481
+4482
+4498
+4496
+4504
+4505
+4512
+4518
+4520
+4521
+4523
+4534
+4516
+4527
+4525
+4534
+4535
+4551
+4565
+4570
+4571
+4578
+4584
+4595
+4609
+4610
+4618
+4628
+4629
+4630
+4634
+4636
+4637
+4640
+4659
+4664
+4669
+4665
+4673
+4687
+4688
+4693
+4694
+4697
+4667
+4678
+4679
+4702
+4707
+4706
+4709
+4711
+4718
+4725
+4716
+4718
+4723
+4724
+4726
+4727
+4729
+4735
+4736
+4738
+4739
+4758
+4763
+4773
+4774
+4776
+4777
+4778
+4777
+4785
+4786
+4771
+4773
+4774
+4777
+4781
+4783
+4788
+4791
+4794
+4807
+4816
+4818
+4825
+4828
+4838
+4822
+4831
+4837
+4841
+4851
+4854
+4870
+4876
+4888
+4889
+4900
+4906
+4909
+4910
+4917
+4919
+4920
+4926
+4928
+4934
+4941
+4943
+4945
+4948
+4950
+4956
+4951
+4948
+4954
+4958
+4960
+4959
+4962
+4969
+4982
+4986
+4994
+5000
+5009
+5027
+5025
+5029
+5033
+5037
+5036
+5037
+5040
+5032
+5033
+5034
+5039
+5045
+5050
+5045
+5076
+5077
+5082
+5083
+5106
+5107
+5114
+5117
+5137
+5138
+5143
+5147
+5153
+5156
+5171
+5182
+5183
+5184
+5185
+5189
+5182
+5189
+5194
+5201
+5205
+5213
+5218
+5221
+5223
+5230
+5231
+5243
+5255
+5230
+5228
+5237
+5245
+5248
+5259
+5260
+5272
+5278
+5281
+5287
+5286
+5287
+5298
+5328
+5329
+5333
+5335
+5337
+5339
+5341
+5346
+5349
+5350
+5351
+5358
+5359
+5360
+5374
+5376
+5359
+5360
+5388
+5401
+5406
+5410
+5412
+5413
+5414
+5415
+5435
+5436
+5441
+5443
+5448
+5446
+5448
+5449
+5464
+5465
+5466
+5469
+5470
+5492
+5493
+5494
+5509
+5520
+5528
+5530
+5537
+5541
+5542
+5559
+5562
+5563
+5588
+5595
+5596
+5601
+5618
+5626
+5627
+5641
+5667
+5679
+5685
+5693
+5695
+5717
+5733
+5734
+5754
+5755
+5757
+5758
+5759
+5760
+5761
+5771
+5774
+5780
+5784
+5785
+5787
+5788
+5790
+5800
+5811
+5814
+5810
+5811
+5794
+5792
+5803
+5804
+5812
+5814
+5815
+5836
+5852
+5853
+5855
+5878
+5879
+5880
+5883
+5889
+5897
+5911
+5932
+5934
+5935
+5936
+5938
+5939
+5941
+5951
+5955
+5950
+5951
+5954
+5970
+5971
+5974
+5977
+5978
+5985
+5986
+6013
+6024
+6031
+6037
+6043
+6052
+6051
+6053
+6076
+6096
+6101
+6106
+6108
+6115
+6125
+6106
+6107
+6104
+6114
+6142
+6143
+6162
+6169
+6170
+6171
+6181
+6198
+6199
+6202
+6206
+6207
+6244
+6246
+6249
+6250
+6254
+6264
+6271
+6276
+6277
+6268
+6271
+6288
+6293
+6308
+6309
+6326
+6341
+6345
+6344
+6341
+6364
+6365
+6366
+6370
+6371
+6373
+6376
+6377
+6378
+6377
+6379
+6386
+6396
+6397
+6420
+6422
+6429
+6433
+6463
+6472
+6473
+6490
+6491
+6492
+6497
+6522
+6523
+6524
+6519
+6520
+6521
+6525
+6530
+6531
+6534
+6535
+6543
+6552
+6558
+6584
+6586
+6587
+6588
+6606
+6614
+6618
+6646
+6650
+6651
+6654
+6677
+6663
+6665
+6676
+6655
+6653
+6655
+6665
+6667
+6682
+6692
+6703
+6704
+6707
+6715
+6719
+6730
+6731
+6733
+6743
+6747
+6748
+6750
+6759
+6771
+6772
+6776
+6775
+6776
+6782
+6785
+6812
+6841
+6858
+6860
+6859
+6877
+6886
+6895
+6914
+6919
+6922
+6924
+6933
+6935
+6936
+6937
+6938
+6952
+6962
+6965
+6984
+6987
+6986
+6985
+6977
+6967
+6968
+6966
+6980
+6997
+6994
+7002
+7008
+7000
+6975
+7009
+7014
+7015
+7026
+7027
+7034
+7036
+7041
+7040
+7041
+7045
+7048
+7065
+7074
+7075
+7082
+7087
+7092
+7098
+7097
+7111
+7127
+7124
+7135
+7136
+7137
+7140
+7153
+7156
+7158
+7174
+7176
+7177
+7163
+7166
+7159
+7157
+7158
+7164
+7165
+7172
+7190
+7194
+7199
+7200
+7205
+7208
+7207
+7222
+7227
+7244
+7249
+7271
+7272
+7273
+7274
+7281
+7286
+7288
+7314
+7315
+7317
+7318
+7319
+7304
+7307
+7308
+7309
+7312
+7319
+7322
+7337
+7338
+7345
+7346
+7350
+7360
+7361
+7362
+7360
+7395
+7400
+7404
+7405
+7407
+7406
+7411
+7420
+7435
+7440
+7442
+7446
+7453
+7446
+7448
+7467
+7471
+7469
+7470
+7482
+7485
+7492
+7488
+7489
+7492
+7493
+7494
+7497
+7504
+7520
+7525
+7547
+7554
+7543
+7553
+7560
+7561
+7577
+7589
+7591
+7593
+7587
+7596
+7597
+7584
+7590
+7591
+7599
+7626
+7627
+7628
+7630
+7645
+7639
+7645
+7652
+7657
+7662
+7664
+7674
+7680
+7681
+7694
+7698
+7716
+7704
+7705
+7706
+7708
+7712
+7716
+7715
+7717
+7722
+7723
+7728
+7721
+7722
+7724
+7727
+7735
+7737
+7725
+7746
+7747
+7750
+7761
+7762
+7765
+7777
+7780
+7776
+7777
+7778
+7759
+7769
+7770
+7787
+7797
+7798
+7804
+7803
+7804
+7805
+7811
+7825
+7824
+7826
+7827
+7828
+7851
+7867
+7887
+7889
+7890
+7900
+7904
+7917
+7918
+7935
+7941
+7942
+7946
+7947
+7948
+7949
+7976
+7979
+7981
+7983
+7988
+7999
+8000
+8009
+8011
+8012
+8019
+8021
+8025
+8027
+8006
+8011
+8034
+8036
+8037
+8038
+8013
+8024
+8029
+8032
+8033
+8034
+8032
+8034
+8036
+8059
+8060
+8063
+8064
+8081
+8090
+8097
+8122
+8135
+8147
+8149
+8150
+8151
+8162
+8174
+8154
+8158
+8162
+8170
+8171
+8188
+8189
+8190
+8191
+8196
+8205
+8216
+8217
+8222
+8233
+8239
+8240
+8242
+8257
+8249
+8262
+8264
+8274
+8309
+8311
+8328
+8333
+8335
+8338
+8344
+8350
+8349
+8350
+8363
+8366
+8370
+8371
+8395
+8398
+8401
+8410
+8425
+8429
+8430
+8441
+8443
+8445
+8451
+8452
+8455
+8458
+8431
+8443
+8453
+8459
+8477
+8474
+8479
+8476
+8487
+8488
+8489
+8500
+8501
+8503
+8504
+8538
+8523
+8529
+8530
+8556
+8573
+8576
+8589
+8595
+8624
+8632
+8634
+8628
+8636
+8635
+8636
+8644
+8659
+8661
+8641
+8652
+8659
+8650
+8664
+8667
+8674
+8676
+8678
+8686
+8696
+8697
+8735
+8740
+8749
+8767
+8769
+8747
+8751
+8760
+8755
+8766
+8768
+8777
+8782
+8788
+8796
+8799
+8801
+8809
+8807
+8816
+8827
+8831
+8835
+8836
+8843
+8844
+8845
+8851
+8858
+8860
+8862
+8863
+8889
+8891
+8912
+8913
+8924
+8928
+8929
+8939
+8955
+8957
+8958
+8963
+8988
+8989
+8997
+8995
+8999
+8968
+8990
+8991
+8992
+8994
+8996
+9013
+9024
+9026
+9035
+9046
+9047
+9083
+9084
+9089
+9096
+9108
+9107
+9116
+9123
+9122
+9128
+9132
+9151
+9155
+9163
+9174
+9178
+9183
+9199
+9209
+9217
+9219
+9232
+9233
+9232
+9237
+9241
+9244
+9245
+9247
+9251
+9252
+9266
+9285
+9284
+9291
+9294
+9295
+9296
+9300
+9322
+9328
+9333
+9337
+9345
+9346
+9347
+9371
+9375
+9394
+9397
+9404
+9406
+9422
+9425
+9438
+9440
+9435
+9442
+9455
+9473
+9475
+9496
+9499
+9500
+9511
+9512
+9513
+9539
+9540
+9543
+9547
+9550
+9557
+9571
+9577
+9593
+9600
+9609
+9615
+9620
+9621
+9616
+9625
+9626
+9637
+9638
+9642
+9648
+9656
+9654
+9661
+9665
+9696
+9705
+9710
+9719
+9720
+9717
+9718
+9717
+9719
+9724
+9725
+9738
+9741
+9743
+9744
+9745
+9765
+9778
+9779
+9789
+9791
+9773
+9778
+9780
+9782
+9783
+9782
+9797
+9799
+9800
+9801
+9823
+9824
+9834
+9836
+9841
+9845
+9847
+9865
+9868
+9883
+9884
+9887
+9890
+9892
+9899
+9908
+9910
+9911
+9915
+9918
+9922
+9926
+9923
+9944
+9947
+9948
+9949
+9958
+9959
+9961
+9973
+9954
+9976
+9978
+10001
+10000
+9992
+9997
+9985
+9995
+9996
+10005
+9999
+10001
+10002
+10009
+10041
+10045
+10051
+10070
+10071
+10073
+10100
+10099
+10100
+10101
+10102
+10105
+10082
+10083
+10082
+10086
+10112
+10113
+10114
+10122
+10124
+10127
+10140
+10156
+10157
+10158
+10159
+10162
+10163
+10166
+10177
+10178
+10180
+10178
+10179
+10191
+10186
+10198
+10201
+10204
+10227
+10229
+10232
+10234
+10246
+10247
+10248
+10249
+10250
+10269
+10277
+10278
+10279
+10289
+10291
+10294
+10292
+10304
+10324
+10339
+10342
+10343
+10349
+10354
+10371
+10370
+10374
+10376
+10379
+10405
+10406
+10405
+10403
+10411
+10412
+10411
+10419
+10422
+10435
+10437
+10438
+10437
+10440
+10427
+10421
+10432
+10434
+10439
+10449
+10442
+10469
+10471
+10476
+10480
+10481
+10485
+10507
+10508
+10511
+10512
+10513
+10523
+10524
+10529
+10536
+10552
+10563
+10569
+10573
+10575
+10576
+10578
+10596
+10602
+10630
+10647
+10657
+10659
+10684
+10687
+10692
+10693
+10700
+10702
+10703
+10709
+10714
+10716
+10727
+10746
+10744
+10754
+10753
+10754
+10755
+10759
+10763
+10764
+10765
+10769
+10770
+10771
+10777
+10796
+10807
+10813
+10818
+10825
+10830
+10835
+10836
+10849
+10858
+10873
+10882
+10879
+10882
+10886
+10902
+10903
+10931
+10930
diff --git a/2021/day01/day01_input_ez.txt b/2021/day01/day01_input_ez.txt
new file mode 100644
index 0000000..167e291
--- /dev/null
+++ b/2021/day01/day01_input_ez.txt
@@ -0,0 +1,10 @@
+199
+200
+208
+210
+200
+207
+240
+269
+260
+263
diff --git a/2021/day01/makefile b/2021/day01/makefile
new file mode 100644
index 0000000..92fb064
--- /dev/null
+++ b/2021/day01/makefile
@@ -0,0 +1,2 @@
+all day01.cpp:
+ g++ -std=c++20 -o day01 day01.cpp
diff --git a/2021/day02/day02 b/2021/day02/day02
new file mode 100755
index 0000000..8755c57
--- /dev/null
+++ b/2021/day02/day02
Binary files differ
diff --git a/2021/day02/day02.cpp b/2021/day02/day02.cpp
new file mode 100644
index 0000000..dccb44a
--- /dev/null
+++ b/2021/day02/day02.cpp
@@ -0,0 +1,50 @@
+#include <iostream>
+
+int main (int argc, char *argv[]) {
+ if (argc != 2) return 1;
+
+ int depth = 0;
+ int forward = 0;
+
+ int aim = 0;
+ int aim_depth = 0;
+
+ FILE *f = fopen(argv[1], "r");
+ char c = fgetc(f);
+ std::string command;
+ while (c != EOF) {
+ if (c == '\n') {
+ auto token_space = command.find(" ");
+ if (token_space != std::string::npos) {
+ std::string op = command.substr(0, token_space);
+ int amt = std::stoi(command.substr(token_space+1));
+ if (op == "forward") {
+ forward += amt;
+ aim_depth += aim * amt;
+ }
+ if (op == "down") {
+ depth += amt;
+ aim += amt;
+ }
+ if (op == "up") {
+ depth -= amt;
+ aim -= amt;
+ }
+ }
+ command = "";
+ }
+ else command += c;
+ c = fgetc(f);
+ }
+
+ std::cout << "depth " << depth << ", "
+ << "forward " << forward << ", "
+ << "product " << depth * forward << std::endl;
+
+ std::cout << "using aim: depth " << aim_depth << ", "
+ << "forward " << forward << ", "
+ << "aim " << aim << ", "
+ << "product " << aim_depth * forward << std::endl;
+
+ return 0;
+}
diff --git a/2021/day02/day02_input.txt b/2021/day02/day02_input.txt
new file mode 100644
index 0000000..7834464
--- /dev/null
+++ b/2021/day02/day02_input.txt
@@ -0,0 +1,1000 @@
+forward 8
+forward 9
+forward 9
+down 3
+forward 9
+down 1
+down 7
+down 7
+down 4
+down 2
+down 6
+down 6
+down 2
+forward 6
+forward 6
+forward 2
+forward 2
+forward 7
+forward 6
+up 6
+up 8
+forward 5
+forward 4
+down 6
+forward 7
+down 5
+forward 5
+down 8
+down 8
+down 7
+forward 4
+down 2
+forward 7
+up 8
+forward 3
+down 2
+forward 1
+up 3
+forward 3
+up 1
+down 3
+up 7
+up 2
+down 4
+down 2
+forward 9
+forward 3
+down 8
+forward 5
+up 9
+up 4
+forward 9
+down 1
+forward 6
+down 3
+forward 8
+up 2
+forward 3
+up 7
+down 4
+forward 2
+forward 7
+forward 3
+down 1
+down 3
+up 5
+forward 6
+down 5
+down 4
+down 8
+down 2
+up 5
+forward 7
+up 8
+forward 2
+down 5
+forward 3
+up 1
+up 5
+down 8
+down 3
+forward 4
+forward 4
+forward 1
+up 8
+down 9
+forward 7
+forward 9
+down 5
+up 3
+down 9
+up 6
+forward 1
+forward 3
+forward 5
+down 5
+forward 6
+down 3
+down 8
+forward 3
+forward 5
+forward 7
+forward 6
+down 9
+down 5
+down 6
+down 5
+down 1
+down 8
+forward 3
+down 9
+down 5
+down 5
+forward 9
+forward 2
+down 7
+forward 9
+forward 9
+up 1
+forward 3
+up 9
+forward 5
+forward 7
+down 7
+forward 2
+up 8
+up 6
+down 7
+down 3
+down 5
+down 2
+forward 6
+forward 6
+up 6
+up 2
+forward 4
+forward 7
+forward 1
+down 4
+up 8
+down 3
+up 1
+down 2
+forward 4
+forward 7
+up 1
+down 7
+forward 8
+up 2
+down 8
+up 4
+up 4
+up 2
+down 8
+up 4
+down 6
+up 8
+down 5
+up 5
+down 8
+forward 9
+down 1
+down 5
+forward 3
+forward 3
+up 9
+down 2
+forward 3
+down 6
+forward 1
+forward 9
+forward 3
+down 8
+up 4
+down 1
+down 8
+up 1
+forward 2
+down 7
+up 3
+up 8
+down 2
+up 6
+forward 6
+down 9
+forward 4
+forward 7
+up 9
+forward 3
+forward 2
+down 8
+down 2
+down 5
+down 5
+down 1
+up 7
+down 4
+forward 5
+down 9
+down 5
+down 1
+down 6
+forward 9
+down 6
+forward 3
+down 3
+up 6
+forward 2
+forward 6
+down 2
+down 9
+down 6
+down 1
+down 7
+down 6
+down 6
+up 1
+forward 8
+down 9
+down 6
+down 8
+down 8
+down 6
+down 3
+forward 9
+forward 6
+down 9
+forward 5
+down 6
+down 6
+down 9
+down 7
+down 3
+forward 1
+up 9
+forward 9
+down 7
+forward 4
+down 1
+forward 9
+up 9
+down 7
+forward 5
+down 3
+up 7
+forward 9
+forward 6
+forward 3
+forward 8
+down 4
+down 1
+down 7
+down 7
+up 4
+down 9
+forward 6
+forward 7
+down 8
+forward 2
+forward 2
+forward 9
+forward 6
+forward 9
+up 6
+up 8
+forward 2
+up 3
+forward 9
+forward 1
+down 4
+forward 8
+down 4
+forward 5
+forward 7
+up 2
+forward 5
+down 4
+forward 3
+down 5
+forward 9
+up 3
+forward 8
+down 7
+down 7
+down 9
+forward 2
+down 1
+down 6
+up 8
+down 2
+down 1
+up 3
+down 3
+forward 2
+forward 6
+up 6
+down 3
+up 9
+up 3
+down 8
+up 6
+down 2
+forward 4
+up 1
+down 5
+down 4
+up 9
+up 7
+forward 7
+down 9
+forward 9
+forward 5
+forward 3
+down 4
+up 6
+up 7
+down 7
+down 6
+up 9
+up 4
+down 7
+forward 7
+forward 8
+down 9
+forward 5
+forward 4
+down 5
+forward 8
+forward 5
+up 3
+down 9
+forward 1
+forward 2
+up 3
+down 2
+down 1
+forward 5
+forward 5
+forward 6
+up 2
+forward 3
+down 7
+down 6
+up 3
+down 4
+down 4
+forward 5
+down 3
+up 6
+forward 1
+up 8
+forward 7
+forward 1
+forward 9
+down 2
+up 8
+up 1
+up 4
+forward 9
+forward 3
+forward 5
+down 1
+up 9
+down 1
+forward 3
+down 6
+down 8
+up 4
+forward 6
+up 7
+down 8
+forward 9
+up 2
+down 7
+down 1
+forward 9
+up 7
+forward 3
+forward 9
+forward 1
+forward 1
+down 9
+forward 1
+up 4
+down 5
+forward 4
+down 1
+forward 4
+forward 9
+up 4
+down 3
+down 6
+up 2
+down 6
+down 5
+forward 5
+up 1
+up 9
+forward 8
+up 3
+down 1
+forward 3
+forward 7
+up 6
+up 3
+down 6
+forward 7
+up 6
+down 7
+forward 8
+up 4
+down 8
+up 9
+up 3
+down 3
+forward 8
+down 4
+down 9
+forward 2
+down 7
+up 1
+forward 9
+forward 5
+up 8
+forward 9
+forward 4
+forward 9
+forward 7
+down 4
+up 4
+down 7
+down 4
+down 4
+down 1
+forward 5
+forward 4
+down 1
+down 4
+down 8
+down 3
+forward 7
+forward 4
+down 1
+down 9
+up 3
+forward 2
+down 8
+down 9
+down 2
+down 5
+up 9
+down 9
+up 9
+forward 5
+forward 8
+forward 9
+down 5
+forward 6
+down 8
+down 9
+forward 8
+up 5
+up 9
+up 7
+up 8
+forward 9
+forward 1
+up 6
+down 8
+down 8
+forward 1
+up 1
+forward 8
+forward 6
+down 4
+forward 1
+down 7
+forward 8
+forward 3
+up 3
+down 4
+down 2
+forward 2
+forward 3
+up 4
+down 3
+forward 2
+down 8
+forward 7
+up 3
+down 2
+forward 2
+down 5
+up 6
+up 6
+forward 4
+up 4
+down 8
+forward 8
+down 9
+down 9
+down 6
+down 2
+forward 2
+up 6
+up 5
+forward 3
+forward 3
+up 9
+down 3
+forward 8
+down 5
+forward 5
+forward 7
+down 3
+down 4
+down 1
+down 8
+down 1
+down 1
+forward 9
+forward 3
+down 8
+down 6
+up 9
+forward 1
+forward 5
+up 9
+up 8
+forward 2
+up 8
+down 9
+up 2
+forward 5
+forward 1
+forward 8
+down 3
+forward 4
+down 5
+up 6
+forward 8
+forward 9
+forward 3
+down 1
+down 3
+down 3
+up 4
+forward 9
+down 3
+down 6
+forward 3
+forward 2
+down 6
+down 8
+forward 6
+up 8
+up 3
+up 4
+forward 2
+forward 4
+forward 4
+forward 7
+down 6
+up 8
+down 3
+forward 8
+forward 4
+down 7
+down 5
+forward 6
+forward 4
+forward 6
+down 3
+forward 3
+down 1
+down 7
+forward 3
+forward 2
+forward 7
+down 5
+up 4
+down 6
+down 9
+forward 3
+forward 5
+forward 3
+down 1
+forward 2
+up 5
+up 6
+forward 2
+down 4
+forward 3
+down 4
+down 1
+forward 8
+up 2
+down 3
+down 6
+up 5
+forward 3
+forward 6
+down 3
+forward 1
+down 7
+forward 2
+forward 1
+forward 6
+forward 5
+forward 3
+down 4
+down 8
+forward 1
+up 2
+up 8
+down 4
+forward 9
+up 6
+forward 5
+forward 7
+down 5
+forward 5
+down 1
+forward 4
+forward 5
+up 2
+forward 5
+up 8
+up 1
+forward 2
+down 4
+down 6
+forward 4
+down 2
+down 3
+forward 2
+up 3
+up 4
+forward 2
+down 6
+forward 1
+forward 4
+down 6
+forward 7
+up 2
+forward 7
+forward 6
+up 2
+forward 8
+forward 4
+forward 9
+down 1
+down 8
+forward 3
+forward 2
+down 8
+up 1
+forward 4
+down 8
+forward 2
+forward 8
+up 2
+down 1
+forward 4
+forward 2
+up 4
+up 2
+down 3
+up 8
+forward 3
+up 8
+forward 9
+up 1
+up 5
+down 5
+down 6
+forward 1
+up 5
+up 8
+forward 7
+down 5
+up 4
+forward 2
+up 4
+up 4
+down 2
+forward 6
+forward 2
+down 7
+down 5
+forward 1
+down 2
+down 5
+down 7
+up 8
+down 8
+up 5
+down 1
+forward 5
+down 2
+forward 5
+down 1
+up 7
+up 2
+forward 2
+forward 3
+forward 6
+forward 3
+down 8
+up 8
+forward 8
+forward 1
+forward 7
+up 2
+forward 9
+down 1
+forward 5
+up 9
+forward 3
+forward 7
+forward 8
+up 1
+down 3
+forward 5
+down 2
+forward 6
+forward 3
+down 9
+up 5
+forward 2
+down 4
+up 1
+forward 4
+up 4
+down 8
+down 8
+forward 3
+forward 8
+down 7
+up 3
+forward 1
+up 3
+forward 9
+forward 7
+forward 1
+down 6
+forward 3
+down 1
+down 8
+forward 5
+forward 3
+up 6
+forward 5
+forward 4
+forward 3
+forward 9
+forward 8
+down 6
+down 2
+forward 7
+forward 6
+up 6
+down 6
+down 4
+down 3
+forward 8
+down 9
+up 5
+forward 3
+forward 2
+down 5
+up 4
+down 6
+down 3
+forward 9
+down 2
+forward 9
+forward 8
+up 1
+down 2
+forward 7
+up 5
+up 6
+down 8
+up 9
+up 8
+forward 1
+forward 5
+down 9
+forward 8
+down 8
+up 1
+down 7
+forward 7
+up 3
+down 3
+down 1
+forward 2
+down 3
+forward 9
+forward 2
+down 8
+down 2
+forward 5
+down 9
+down 1
+down 5
+down 6
+up 4
+up 3
+down 1
+up 7
+forward 6
+down 3
+down 6
+up 5
+forward 8
+up 8
+down 1
+down 2
+up 8
+down 7
+forward 7
+forward 4
+down 8
+down 3
+forward 3
+down 4
+forward 3
+down 6
+forward 4
+forward 7
+forward 9
+up 7
+forward 1
+down 7
+down 8
+down 8
+up 6
+down 3
+forward 5
+forward 5
+forward 9
+forward 4
+down 4
+down 8
+down 7
+down 1
+forward 2
+forward 4
+down 3
+down 6
+down 7
+forward 5
+down 8
+down 1
+forward 4
+forward 3
+forward 1
+down 6
+down 7
+down 1
+forward 6
+down 4
+up 2
+forward 4
+down 2
+up 5
+down 2
+down 6
+up 7
+forward 4
+forward 7
+forward 9
+up 5
+down 9
+up 5
+forward 6
+down 2
+up 8
+up 9
+up 9
+forward 5
+down 2
+forward 2
+down 7
+forward 5
+forward 9
+up 8
+down 8
+forward 1
+down 2
+up 3
+forward 3
+down 5
+forward 4
+down 3
+forward 4
+forward 9
+forward 3
+down 5
+forward 4
+down 2
+forward 5
+forward 8
+up 6
+up 2
+down 3
+forward 6
+down 5
+down 4
+down 4
+down 4
+up 2
+up 2
+forward 6
+forward 2
+forward 9
+down 2
+down 9
+down 8
+forward 2
+down 3
+up 3
+forward 5
+down 4
+up 3
+forward 3
+down 1
+forward 7
+forward 5
+forward 6
+down 8
+down 5
+down 5
+down 9
+up 2
+forward 3
+down 4
+down 9
+forward 3
+forward 9
+forward 2
+forward 4
+up 6
+down 6
+up 9
+forward 8
+down 7
+forward 1
+forward 4
+up 1
+up 2
+down 9
+forward 6
+down 6
+down 1
+down 4
+down 7
+down 6
+forward 5
+up 1
+up 7
+down 2
+down 8
+down 2
+down 7
+down 3
+up 9
+down 7
+down 5
+down 6
+forward 9
+up 3
+forward 2
+down 8
+forward 4
+down 6
+forward 3
+up 3
+down 5
+up 4
+forward 6
+forward 7
+forward 9
+down 3
+forward 7
+forward 3
+down 4
+up 4
+down 8
+forward 6
+forward 7
+forward 9
+forward 4
+down 3
+up 5
+down 7
+down 7
+forward 9
diff --git a/2021/day02/makefile b/2021/day02/makefile
new file mode 100644
index 0000000..61ca2f4
--- /dev/null
+++ b/2021/day02/makefile
@@ -0,0 +1,2 @@
+all day02.cpp:
+ g++ -std=c++20 -o day02 day02.cpp
diff --git a/2021/day03/day03 b/2021/day03/day03
new file mode 100755
index 0000000..ccb1732
--- /dev/null
+++ b/2021/day03/day03
Binary files differ
diff --git a/2021/day03/day03.cpp b/2021/day03/day03.cpp
new file mode 100644
index 0000000..036cd07
--- /dev/null
+++ b/2021/day03/day03.cpp
@@ -0,0 +1,96 @@
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
+
+int bin_to_dec (std::string bin) {
+ int dec = 0, pow = 1;
+ for (std::size_t i=bin.size(); i > 0; i--) {
+ dec += pow * (bin[i-1] == '0' ? 0 : 1);
+ pow *= 2;
+ }
+ return dec;
+}
+
+std::vector<int> get_freq (std::vector<std::string> bits) {
+ std::vector<int> freq;
+ for (std::size_t i=0; i<bits[0].size(); i++) {
+ freq.push_back(0);
+ }
+
+ for (auto b : bits) {
+ for (std::size_t i=0; i< b.size(); i++) {
+ freq[i] += (b[i] == '0' ? 0 : 1)*2-1;
+ }
+ }
+ return freq;
+}
+
+std::vector<std::string> filter (std::vector<std::string> bits, int inv, int sel) {
+ std::vector<std::string> res;
+ auto freq = get_freq(bits);
+
+ for (auto b : bits) {
+ int f = freq[sel] * inv;
+ if (f == 0) f += inv;
+ if ((f > 0 ? '0' : '1') == b[sel]) {
+ res.push_back(b);
+ }
+ }
+
+ return res;
+}
+
+int main (int argc, char *argv[]) {
+ if (argc != 2) return 1;
+
+ std::string raw;
+ std::getline(std::ifstream(argv[1]), raw, '\0');
+
+ std::vector<std::string> bits;
+
+ while (1) {
+ auto token = raw.find("\n");
+ if (token != std::string::npos) {
+ bits.push_back(raw.substr(0, token));
+ raw = raw.substr(token+1);
+ } else {
+ if (raw.size() > 0) bits.push_back(raw);
+ break;
+ }
+ }
+
+ auto freq = get_freq(bits);
+
+ std::string gamma = "", epsilon = "";
+ for (std::size_t i=0; i<freq.size(); i++) {
+ gamma += freq[i] > 0 ? "1" : "0";
+ epsilon += freq[i] > 0 ? "0" : "1";
+ }
+
+ int g = bin_to_dec(gamma);
+ int e = bin_to_dec(epsilon);
+ std::cout << "power level " << e*g << ", "
+ << "epsilon " << e << " (" << epsilon << "), "
+ << "gamma " << g << " (" << gamma << ")" << std::endl;
+
+ std::vector<std::string> o2 = bits;
+ for (std::size_t i=0; i<freq.size(); i++) {
+ o2 = filter(o2, 1, i);
+ if (o2.size() == 1) break;
+ }
+
+ std::vector<std::string> co2 = bits;
+ for (std::size_t i=0; i<freq.size(); i++) {
+ co2 = filter(co2, -1, i);
+ if (co2.size() == 1) break;
+ }
+
+ int generator = bin_to_dec(o2[0]);
+ int scrubber = bin_to_dec(co2[0]);
+ std::cout << "oxigen generator rating " << scrubber*generator << ", "
+ << "epsilon " << generator << " (" << o2[0] << "), "
+ << "gamma " << scrubber << " (" << co2[0] << ")" << std::endl;
+
+ return 0;
+}
diff --git a/2021/day03/day03_input.txt b/2021/day03/day03_input.txt
new file mode 100644
index 0000000..ac22a69
--- /dev/null
+++ b/2021/day03/day03_input.txt
@@ -0,0 +1,1000 @@
+011001101000
+010101111100
+000000111101
+001001001010
+010011000001
+111111001110
+001011101111
+110011010110
+100011111110
+101110000111
+000011011100
+001111111011
+011101001111
+111001010110
+011100011110
+001011000010
+100010111011
+000101010011
+000001101100
+010001011110
+100010101000
+111101011101
+110000100001
+011011010101
+110101100110
+001101101010
+111010110011
+011111111000
+010001010001
+000001010101
+001001011011
+101111110011
+100011010001
+111010010111
+011010011010
+101111011011
+101010111100
+001111100110
+010100110111
+010110101100
+000111110101
+111110101110
+111010000000
+011111111010
+000101011100
+000001010110
+101000100101
+100001011001
+011101110010
+110111100100
+110011001011
+000010001111
+000100010101
+110111001100
+010001100000
+101111110101
+111000011011
+000100001001
+101101011101
+001001011110
+101100111010
+011011000010
+110010010111
+101001010101
+000000101110
+000011011111
+010001000011
+011011001010
+101101111011
+100010001010
+001001011100
+010011110001
+000001111101
+100001000101
+011101011010
+000010101110
+001010101010
+101010011011
+000111001011
+000011101000
+110100101001
+000111111010
+100111100101
+111010001111
+111100110001
+011111101010
+110101000011
+001111101100
+101000100110
+100101100011
+000011010011
+010101011111
+010000110111
+110011001001
+101011011101
+001011100001
+000001100101
+001001001101
+001101001111
+001110110001
+010110101110
+001100110110
+001000001111
+101101001001
+011111011010
+111111101110
+111001100000
+100101011001
+010101100101
+100000110100
+011001001000
+111100110011
+111011110001
+110011111010
+001101001010
+111110011111
+110101100000
+111001000101
+010001111110
+111011010100
+110011010111
+100100110111
+111111011010
+011110101111
+001011110010
+010111011010
+011101101101
+011010101110
+011000110001
+010110101010
+011110010000
+111111011100
+111011000101
+100110101110
+010101100010
+101100011110
+000010110101
+010010011110
+110000000110
+011111010101
+000110110011
+101011000010
+000011000111
+101011010000
+101101101001
+010000101010
+101001001001
+111010110110
+111000111101
+000001010111
+101110001100
+110010110001
+100000110001
+101100101011
+100000111001
+010110100111
+101011001111
+101010111001
+010010110000
+001110010011
+010101101110
+011000010100
+100111111000
+011110100011
+110100100111
+101110101000
+101010101111
+101001000000
+111010000110
+101001000100
+010001100111
+011011010001
+000101010101
+010110000011
+100000101110
+110010001000
+111000100001
+001001101001
+110010001001
+100001111011
+101010010100
+110011100101
+010101100001
+011101010100
+110100101111
+110100001111
+011000101101
+001011101100
+010010010101
+011011111010
+010101000001
+100101100000
+101001111101
+010000000100
+110000110100
+000000001101
+100100111101
+111100110010
+001011001111
+101100001011
+001111010001
+101100011001
+100110110001
+010111000011
+011010110101
+100111100011
+000111110011
+010101111101
+010010000000
+011000011011
+001100011001
+001011001001
+101110101101
+101111110111
+101011100100
+000100110100
+110000101111
+011001111101
+000000000111
+111001001010
+110100001100
+000001001110
+111001101011
+100011011111
+110000001000
+110101011011
+001010000101
+001011111001
+011011111100
+010100110101
+110101111001
+010110010101
+010010001000
+001001110111
+011111111111
+100011100010
+000110001101
+011111010000
+010111110010
+110010100011
+101011110101
+110011011110
+010000000101
+011101100100
+110010011100
+011101101100
+000010001001
+000011101101
+000101100011
+010111111000
+010111100111
+010101000101
+110111100010
+110001101011
+111010100000
+101010101011
+011101010101
+000100110111
+000111100111
+000100111111
+111100001001
+010000100001
+110101011111
+100010000100
+000011011000
+111011110000
+101000011100
+110001001010
+001000010101
+110110000101
+100000011110
+001101111010
+010111001100
+111011111100
+100101001000
+010111101001
+110010010000
+110011010000
+000010100111
+100101111101
+110101100010
+110100011110
+101111010110
+110001001111
+011101000111
+001011001101
+110001000010
+011110100110
+000101100110
+000110111110
+001010111010
+100110000111
+001000010110
+100001110100
+000111000110
+101100011100
+110100110110
+100011010111
+000101110001
+001010010110
+101000000101
+100101101000
+000111111110
+010010010111
+110010001010
+001100110111
+110110110101
+011111011101
+110101100111
+100100100111
+011011000000
+111101001100
+011101000011
+011101001010
+101101101101
+100100110010
+001000000010
+010010001010
+111110111001
+000111010001
+011100111111
+011111011001
+110101000000
+011110000010
+001111010110
+010011111111
+110101111011
+101110111111
+001001100001
+011100111100
+110111001110
+011000000111
+001100010111
+001011010010
+010010001011
+101110000011
+100000101000
+100010100100
+000111011101
+001000111011
+010010101010
+111011010011
+110100010001
+011110001110
+111010110001
+010000010111
+010110101101
+111101100001
+110011100110
+000101111110
+110010101010
+000001010000
+001101111101
+011011110100
+110001010101
+011001000001
+001101101100
+100011011011
+101011100010
+011011100101
+100110110101
+110111001011
+000100101011
+001101010100
+010000011100
+101100111011
+011001011100
+011011010100
+011100110001
+010010110011
+101000110011
+111101010001
+111000000100
+101101100111
+001011111000
+010100000111
+011110101101
+111011101100
+110101110001
+001110010000
+010010000111
+101001111011
+100100111100
+000101101101
+101111110100
+100000101111
+011001110000
+011110011001
+000101010110
+000000000101
+110010001100
+000111100100
+010010011010
+001111110100
+011010001010
+101100101111
+011001001011
+100011111101
+101100000001
+100100101010
+000000000100
+111001110101
+000010011110
+110110100100
+111010010001
+011101010010
+011100101111
+010110000010
+010000110101
+110101010011
+001110011110
+111010011010
+000110101000
+001111000001
+010110110000
+001100110001
+110011011111
+000100111011
+110001000111
+011010111101
+000010100110
+010100101001
+010001000010
+000101110101
+101100110100
+111000110010
+111011110010
+010111001111
+100000101101
+101100001010
+100100001001
+111111111101
+001010101001
+000011011010
+101011010010
+111001000110
+111100010011
+111010011100
+100000111100
+011100001101
+110001101000
+101111011001
+001100001000
+101110010111
+011111100000
+001011100000
+101011101010
+110010101111
+001110000101
+001111011011
+011110101000
+111000001000
+010100111010
+010010111001
+110000110001
+110011000101
+001110000100
+010100101101
+101010110100
+100001010100
+100011010011
+100000010010
+011101010111
+001000010111
+001100111100
+000110100011
+101111101010
+010001010000
+001100100110
+111001111110
+101000001001
+000010110010
+110111101011
+101011000011
+001000111111
+100011001101
+011010010101
+110011100011
+110010011010
+110001010100
+100010111101
+101110000110
+010111001011
+110011011100
+110001100011
+000100011010
+111011100010
+011110110011
+011111100010
+000100001101
+100010010000
+110000000011
+101001011000
+101100110101
+001010101011
+011001011010
+001010001001
+001111011100
+111100010001
+100011010110
+001000110111
+011011010011
+001100000000
+100001111100
+000011110101
+100010000111
+000010110011
+000010111110
+011110000101
+010000001011
+001111110010
+001110001001
+011101111111
+010110110001
+110000000111
+010101011101
+010111001001
+100100010010
+101001101110
+100001001010
+010001011101
+100111010101
+100000101011
+000100101001
+110111001001
+100100000001
+010111010010
+111101111011
+011010010010
+111101101000
+100110111101
+010010001001
+100111011000
+110101111111
+111010101110
+010011110010
+101001100100
+010000101111
+010011001111
+110010011111
+101110100111
+011010100101
+111111001001
+010101100110
+101001001101
+001000101010
+010001001100
+101001101000
+110110100000
+011101000101
+100101010101
+101110111011
+010010101001
+110100011000
+110101111010
+110000100000
+010011101101
+111011001101
+100100011101
+110100010111
+011100110100
+010111011001
+011101010001
+101000000010
+100111111001
+100100001000
+001000001000
+001000000100
+011110110010
+010101010011
+101101101100
+110111111001
+010000010011
+100010100001
+000110101111
+101010101101
+100101111100
+000111010110
+001101101111
+110010000011
+110100001110
+011111111101
+111011010101
+001010100010
+100010100110
+101101110111
+010110011011
+111001110110
+011110101001
+110011100111
+000100111101
+101100011000
+101101001010
+011111100111
+010000011000
+100001100110
+000000101101
+000111010010
+110000001100
+111111101010
+001000100010
+111111111011
+001011100111
+000101110010
+010111110011
+010000011001
+111001111101
+110100001101
+010001101000
+110000101011
+011011000110
+110010111011
+100111101010
+011001101011
+001101010011
+011000100101
+110111101111
+001000100001
+010010111101
+101101101011
+011111011100
+111111010110
+001110000000
+101011110010
+011101011111
+001001101101
+011101110000
+011100011101
+111101001101
+010111010101
+010111101010
+001000101101
+100000000011
+111110101111
+000111101111
+001110010101
+101111001101
+111100110000
+110010100000
+011101110100
+100011001111
+010110001001
+111100101100
+101001110100
+011010010111
+011000100100
+001100110100
+001001111000
+001000000111
+110100000111
+011000001011
+001011000000
+110110110111
+000010111011
+001001000011
+000011100111
+110011001111
+010000111101
+001110100010
+000011110001
+011001111011
+110111000001
+111111000001
+011001100110
+110010101100
+111101010100
+010010000101
+000011011011
+110110010001
+010111111010
+010000010101
+110000011010
+110001101110
+000110101011
+101111000111
+001101100000
+010100000001
+111110001001
+000011110000
+111100111001
+000001001011
+011000010110
+000001000100
+011100111000
+001011111110
+011100000000
+000101001011
+111111110110
+111010011000
+001000111101
+011001110010
+001101011100
+100110001111
+110110111010
+001110101100
+010000101100
+010011000011
+100101110010
+000000111010
+000001111001
+111101011000
+101000011001
+111110000101
+101111111011
+100110111110
+000110010110
+011011101110
+100000010111
+110111001000
+000010101010
+001010011011
+101010101010
+101100000000
+000101101011
+010110100110
+110010010100
+001010110101
+001110000001
+010001101010
+111111110100
+001101110110
+111101010111
+101011101100
+110001101010
+100111010100
+101101111001
+001011100110
+010010001111
+100101110110
+110011000010
+001111010100
+000101011011
+110000000001
+011011001001
+001001011111
+000111011111
+100001001100
+111011010010
+010101011001
+000001110100
+000010100101
+110110010010
+100010111110
+011110111110
+000001101000
+001011000110
+000010001010
+101101010100
+011011010000
+000011111000
+101000001110
+011110101011
+110100111000
+000011000010
+111111010001
+011101110001
+100000111101
+110100101101
+110000100101
+011001110110
+110001010010
+010010110110
+011110001000
+111010110100
+101111110010
+110000110111
+111101110100
+110111101110
+100110010111
+001001100011
+001110111000
+101110100100
+010000101101
+010111100101
+011001100010
+011100000101
+101001111001
+100011001010
+100010000010
+100101000010
+111111100101
+100001101110
+101001010110
+100000100011
+100000011000
+000110000001
+000000011011
+011000110101
+011010111011
+111110000001
+001001110100
+001011011110
+110111010110
+011101110101
+101111000101
+100001010010
+000001111000
+001110010100
+111111101100
+001011010001
+111001111001
+100101101010
+111000000010
+010101001010
+001010000010
+101011000110
+110011001010
+001000011000
+001010010011
+110000111101
+001001100000
+111101100111
+011001001100
+001100111011
+100001010101
+111010100011
+111000011111
+001000000000
+101110011001
+000000000011
+111011000111
+011010100011
+110000110000
+000011001001
+011000010001
+011110000011
+011101000000
+010100110011
+010110010001
+111001101111
+110111110100
+110111110110
+100111001011
+111100110110
+101010001110
+100110000010
+011011100001
+001101010010
+010001110011
+010011110000
+110010100111
+001101110100
+101010101100
+110000111000
+011101110110
+101011110001
+110011000000
+010000011011
+001011010000
+010111010001
+010100010101
+110101000100
+010011101011
+010110111001
+101111000011
+011011100000
+000010100010
+001100110000
+110000111001
+100100100000
+001101000010
+100000010011
+100010011110
+110101010000
+000100000101
+000111000001
+000001111011
+100111011101
+110111110111
+011101111000
+001001000110
+100110010011
+100011100111
+010011010000
+010011010111
+001101100101
+010000010110
+000101010001
+011111010100
+010010111100
+001010101110
+110000001011
+011001010101
+000001111110
+010111111011
+011110010010
+001001101100
+101100101000
+100000001110
+110001001110
+011110111011
+001000110011
+111100110111
+001101100111
+000110110000
+000010011011
+100110111010
+111110001100
+000000101100
+110000111100
+100110111100
+110111111100
+110000111010
+100001100100
+100010011010
+011011100110
+110100010110
+001001010101
+000110101110
+101001100000
+100010110011
+111000001101
+101110100110
+100010111100
+000101110110
+000011011001
+000001010100
+101100111001
+011101111101
+011110011000
+111010001011
+010101110101
+100001100101
+100110100010
+100110011000
+001010100110
+011001010111
+111111001010
+111111001000
+111110100101
+000101000011
+110101101111
+110100010010
+011100000010
+001000010100
+101100000111
+001010111111
+101001010011
+101011001000
+001100000011
+010010101000
+101101111101
+101001010010
+100101111011
+101110101110
+100000100100
+000000000010
+011101100011
+110000110110
+101000110000
+111011111010
+010111000110
+001111110110
+100111110110
+100110011101
+000000001000
+101110111010
+000101011000
+001011100011
+011101100111
+000011000011
+000101011001
+110101101101
+101000001111
+111000010101
+000011100010
+011010111001
+001100100101
+010111111101
+010101111011
+000101001100
+101010000111
+111100111111
+100000000111
+110111110011
+000110110111
+010011011111
+100110010100
+000100111110
+001000111001
+011111000001
+001010100101
+101010001100
+011100001011
+000101001111
+010010101111
+101000111011
+001101000001
+100100100001
+100010101111
+100111111110
+011011111001
+101000000001
+111001101101
+101011010101
+111111100110
+001010010100
+011101111001
+001100100000
+101001110110
diff --git a/2021/day03/day03_input_ez.txt b/2021/day03/day03_input_ez.txt
new file mode 100644
index 0000000..a6366a8
--- /dev/null
+++ b/2021/day03/day03_input_ez.txt
@@ -0,0 +1,12 @@
+00100
+11110
+10110
+10111
+10101
+01111
+00111
+11100
+10000
+11001
+00010
+01010
diff --git a/2021/day03/makefile b/2021/day03/makefile
new file mode 100644
index 0000000..7c21cf0
--- /dev/null
+++ b/2021/day03/makefile
@@ -0,0 +1,2 @@
+all day03.cpp:
+ g++ -std=c++20 -o day03 day03.cpp
diff --git a/2021/day04/day04 b/2021/day04/day04
new file mode 100755
index 0000000..b28d295
--- /dev/null
+++ b/2021/day04/day04
Binary files differ
diff --git a/2021/day04/day04.cpp b/2021/day04/day04.cpp
new file mode 100644
index 0000000..7736eff
--- /dev/null
+++ b/2021/day04/day04.cpp
@@ -0,0 +1,134 @@
+#include <iostream>
+#include <fstream>
+#include <vector>
+
+void split (std::vector<std::string> &vec, std::string str, std::string del) {
+ auto token = str.find(del);
+ if (token != std::string::npos) {
+ vec.push_back(str.substr(0, token));
+ split(vec, str.substr(token+del.size()), del);
+ } else { vec.push_back(str); }
+}
+
+class Board {
+ public:
+ Board(std::string repr) {
+ std::vector<std::string> lines;
+ split(lines, repr, "\n");
+ for (auto line : lines) {
+ std::vector<std::string> strcells;
+ split(strcells, line, " ");
+ size = 0;
+ for (auto strcell : strcells) {
+ if (strcell.size() == 0) continue;
+ cells.push_back(std::stoi(strcell));
+ state.push_back(0);
+ size++;
+ }
+ }
+
+ }
+
+ int size;
+ std::vector<int> cells;
+ std::vector<int> state;
+
+ void mark (int ex) {
+ for (int y=0; y<size; y++) {
+ for (int x=0; x<size; x++) {
+ int i = x + y*size;
+ if (cells[i] == ex) {
+ state[i] = 1;
+ }
+ }
+ }
+ }
+
+ bool win () {
+ for (int y=0; y<size; y++) {
+ int sum_row = 0;
+ for (int x=0; x<size; x++) {
+ int i = x + y*size;
+ sum_row += state[i];
+ }
+ if (sum_row == size) return true;
+ }
+ for (int x=0; x<size; x++) {
+ int sum_col = 0;
+ for (int y=0; y<size; y++) {
+ int i = x + y*size;
+ sum_col += state[i];
+ }
+ if (sum_col == size) return true;
+ }
+ return false;
+ }
+
+ int score () {
+ int sum = 0;
+ for (int y=0; y<size; y++) {
+ for (int x=0; x<size; x++) {
+ int i = x + y*size;
+ if (state[i] == 0) {
+ sum += cells[i];
+ }
+ }
+ }
+ return sum;
+ }
+};
+
+int main (int argc, char *argv[]) {
+ if (argc != 2) return 1;
+ std::string raw;
+ std::getline(std::ifstream(argv[1]), raw, '\0');
+
+ std::vector<int> extract;
+ auto token = raw.find("\n");
+ if (token != std::string::npos) {
+ std::string ex = raw.substr(0, token);
+ std::vector<std::string> vec;
+ split(vec, ex, ",");
+ for (auto v : vec) { extract.push_back(std::stoi(v)); }
+
+ raw = raw.substr(token+2);
+ if (raw[raw.size()-1] == '\n') raw = raw.substr(0, raw.size()-1);
+ } else return 1;
+
+ std::vector<Board> boards;
+
+ std::vector<std::string> str_boards;
+ split(str_boards, raw, "\n\n");
+ for (auto s : str_boards) {
+ boards.emplace_back(s);
+ }
+
+ bool flag = false;
+ std::vector<Board> filtered = boards;
+ for (int ex : extract) {
+ std::cout << ex << " " << filtered.size() << std::endl;
+ std::vector<Board> next;
+ int size = filtered.size(), seen = 0;;
+ for (auto& board : filtered) {
+ board.mark(ex);
+ if (board.win() && filtered.size() != 1) {
+ if (!flag) {
+ std::cout << "first winner product: " << ex * board.score() << ", "
+ << "ex: " << ex << ", score: " << board.score() << std::endl;
+ flag = true;
+ }
+ } else {
+ next.push_back(board);
+ }
+ }
+ if (next.size() == 1 && next[0].win()) {
+ int score = next[0].score();
+ std::cout << "last winner product: " << ex * score << ", "
+ << "ex: " << ex << ", score: " << score << std::endl;
+ break;
+ }
+ filtered = next;
+ }
+
+ return 0;
+}
diff --git a/2021/day04/day04_input.txt b/2021/day04/day04_input.txt
new file mode 100644
index 0000000..033baa2
--- /dev/null
+++ b/2021/day04/day04_input.txt
@@ -0,0 +1,601 @@
+38,54,68,93,72,12,33,8,98,88,21,91,53,61,26,36,18,80,73,47,3,5,55,92,67,52,25,40,56,95,9,62,30,31,85,65,14,2,78,75,15,39,87,27,58,42,60,32,41,83,51,77,10,66,70,4,37,6,89,23,16,49,48,63,94,97,86,64,74,82,7,0,11,71,44,43,50,69,45,81,20,28,46,79,90,34,35,96,99,59,1,76,22,24,17,57,13,19,84,29
+
+57 7 8 38 31
+17 96 5 12 18
+58 45 81 89 4
+73 51 93 32 10
+74 50 26 0 24
+
+79 67 21 84 71
+25 22 19 80 13
+10 63 90 78 33
+93 50 89 58 87
+91 7 45 6 41
+
+66 85 4 91 41
+59 69 16 0 90
+35 13 64 61 93
+11 20 29 67 77
+92 75 58 3 34
+
+19 1 34 50 76
+26 75 8 28 20
+96 64 49 77 2
+18 58 62 53 60
+82 99 38 10 83
+
+89 69 97 16 48
+32 3 83 17 33
+82 53 15 50 94
+52 0 86 25 81
+42 38 84 73 76
+
+68 18 44 61 66
+24 21 22 6 41
+48 29 4 64 78
+93 25 88 95 96
+72 49 51 2 5
+
+35 41 59 23 21
+ 0 66 34 12 85
+61 26 29 68 5
+28 69 90 2 96
+ 1 16 32 24 44
+
+98 73 33 82 18
+51 62 88 67 6
+99 44 53 39 36
+34 90 50 72 43
+64 40 11 26 5
+
+88 8 81 57 99
+61 16 22 50 5
+26 84 85 7 15
+97 27 47 18 21
+ 3 78 66 94 58
+
+56 40 68 20 24
+26 98 6 76 89
+61 63 22 99 83
+31 5 32 54 82
+18 23 17 46 13
+
+35 95 67 73 13
+86 33 7 9 43
+44 28 55 32 52
+54 91 84 97 98
+17 49 93 23 56
+
+22 90 61 12 13
+87 4 46 25 88
+70 38 53 80 11
+75 56 96 49 32
+ 3 55 43 19 67
+
+40 17 70 76 61
+82 86 37 8 28
+60 48 24 83 53
+57 87 44 92 63
+10 49 88 15 55
+
+36 80 47 46 84
+25 70 2 79 75
+55 5 13 99 45
+54 73 83 59 67
+57 0 69 33 68
+
+51 52 21 44 36
+17 30 15 42 18
+ 6 3 47 94 2
+57 77 45 70 90
+29 60 19 9 84
+
+16 12 37 6 27
+86 87 21 70 71
+84 0 11 67 83
+ 5 68 33 23 26
+51 43 28 79 49
+
+22 5 53 12 42
+29 81 46 13 88
+80 65 8 62 33
+72 67 34 21 35
+38 77 90 52 44
+
+63 57 52 82 96
+46 11 32 20 58
+35 15 83 1 55
+18 16 73 19 17
+22 88 45 95 47
+
+43 15 7 97 88
+96 52 84 86 49
+80 13 21 28 29
+16 36 98 82 41
+32 10 62 68 24
+
+46 69 8 55 50
+28 21 92 79 73
+19 71 74 53 44
+24 27 10 14 85
+ 2 39 58 81 72
+
+68 74 43 62 61
+82 73 37 40 93
+16 7 41 54 96
+10 3 85 70 65
+69 71 94 5 81
+
+17 53 87 80 98
+76 41 30 25 58
+29 14 73 74 43
+20 91 24 70 39
+46 48 51 9 18
+
+20 41 36 81 93
+46 75 33 73 78
+26 16 80 54 90
+87 17 12 67 1
+51 10 39 91 45
+
+76 21 31 3 69
+27 42 97 32 87
+26 22 4 63 38
+46 77 67 80 43
+37 50 59 88 96
+
+17 16 10 68 76
+ 2 45 94 29 40
+ 1 54 60 66 93
+ 0 13 42 39 70
+ 6 82 46 74 43
+
+87 95 31 22 94
+86 30 39 56 18
+89 74 23 11 64
+63 48 85 20 49
+27 15 40 83 50
+
+81 48 47 73 95
+40 65 89 69 5
+38 76 85 30 11
+31 61 8 67 62
+41 68 42 78 20
+
+46 85 96 83 20
+94 52 7 97 31
+29 95 99 34 62
+ 8 69 6 51 54
+38 59 5 56 55
+
+18 15 10 35 96
+44 66 58 91 9
+12 2 45 98 80
+22 69 37 67 79
+46 36 23 51 75
+
+11 58 64 85 26
+21 43 32 36 65
+94 61 40 68 67
+14 23 6 53 2
+93 9 74 3 90
+
+73 82 46 37 20
+47 75 38 45 54
+76 34 65 44 58
+93 89 27 13 33
+85 67 40 42 17
+
+13 66 2 65 10
+98 4 83 79 92
+22 48 93 6 23
+24 39 17 60 9
+77 49 16 19 35
+
+96 37 88 4 32
+80 89 59 39 63
+67 19 35 10 40
+91 66 47 9 79
+45 21 86 92 30
+
+76 85 37 32 29
+59 41 44 23 93
+86 24 83 81 57
+22 21 82 53 16
+38 99 79 49 30
+
+54 29 64 65 62
+44 59 83 75 56
+11 13 34 12 24
+96 39 31 95 16
+41 38 21 25 60
+
+49 8 3 67 2
+30 81 39 26 33
+83 73 47 32 65
+48 20 75 24 40
+74 28 11 19 96
+
+87 25 49 81 7
+99 34 35 50 86
+18 24 68 4 78
+59 8 71 0 41
+92 54 64 75 46
+
+ 2 19 73 29 10
+55 6 43 48 22
+64 14 62 39 97
+99 26 68 25 12
+98 72 45 38 40
+
+59 76 40 37 9
+42 23 1 12 54
+49 51 17 11 34
+74 95 26 78 67
+65 32 98 80 45
+
+50 86 95 29 38
+ 6 11 24 10 73
+63 28 30 46 68
+34 9 20 58 77
+88 52 79 89 98
+
+32 20 93 39 80
+67 98 99 4 26
+22 89 97 13 73
+88 11 72 31 78
+76 95 64 43 75
+
+75 23 81 89 90
+98 86 88 38 99
+51 7 65 2 3
+16 59 49 41 87
+57 20 58 72 83
+
+21 81 24 43 12
+55 74 2 90 5
+13 89 59 42 3
+47 66 38 20 62
+61 56 72 84 41
+
+83 68 73 77 66
+96 48 24 7 98
+57 4 86 10 34
+22 46 80 75 49
+89 35 60 79 37
+
+27 50 90 37 28
+81 74 58 39 61
+ 8 72 31 85 57
+52 43 9 5 91
+68 86 0 4 89
+
+14 41 70 67 59
+13 94 31 69 65
+76 19 9 79 1
+33 20 53 91 36
+80 50 21 37 85
+
+16 47 62 33 12
+11 74 44 63 60
+ 2 23 84 80 42
+14 58 67 81 24
+ 8 29 31 91 43
+
+62 86 26 57 74
+ 9 46 47 81 39
+ 4 99 59 89 3
+20 76 51 70 84
+95 72 43 67 61
+
+75 93 56 15 30
+11 49 97 16 45
+52 91 21 92 62
+ 0 74 85 48 63
+28 76 59 79 60
+
+36 18 0 69 10
+34 33 21 5 23
+73 42 50 14 11
+75 26 95 79 51
+76 93 1 43 22
+
+86 64 25 9 54
+67 79 49 1 8
+63 47 60 4 46
+94 97 57 38 30
+91 87 0 68 15
+
+94 46 6 69 9
+18 49 43 30 31
+79 35 76 45 92
+67 89 82 2 57
+65 21 24 81 52
+
+ 5 58 43 37 61
+65 67 54 15 50
+69 75 14 17 96
+23 95 71 33 9
+68 82 10 3 29
+
+56 43 88 35 82
+44 14 64 60 23
+33 5 96 86 47
+70 74 27 4 1
+51 71 95 59 11
+
+46 14 44 6 19
+54 81 59 31 28
+ 7 67 73 23 86
+25 91 57 43 92
+65 76 80 47 77
+
+ 3 39 70 90 23
+64 77 33 83 22
+ 6 36 81 80 68
+85 45 72 53 42
+ 7 19 88 13 9
+
+88 3 72 6 29
+33 13 1 85 68
+28 32 78 8 63
+15 99 35 80 41
+61 50 43 53 39
+
+22 88 19 86 54
+78 3 70 65 85
+18 12 21 14 17
+ 5 48 64 81 71
+89 91 55 30 87
+
+35 82 37 42 25
+44 53 12 2 73
+18 24 0 75 51
+34 26 54 52 86
+56 64 31 57 80
+
+45 97 83 15 5
+40 77 1 53 84
+67 44 52 37 20
+36 64 33 82 90
+49 22 6 65 99
+
+18 69 23 78 55
+45 4 31 54 44
+16 97 13 81 86
+77 87 91 53 33
+ 1 84 83 75 40
+
+95 46 89 7 38
+83 32 99 44 20
+ 6 57 37 34 48
+69 5 84 29 54
+62 27 13 80 53
+
+45 92 59 71 83
+52 75 42 46 86
+76 33 50 80 69
+36 89 90 3 31
+ 7 5 48 38 53
+
+86 80 77 18 87
+79 93 52 17 20
+30 68 48 12 91
+25 98 13 9 47
+45 73 97 15 59
+
+93 60 34 18 25
+38 80 81 91 40
+43 87 20 79 7
+70 68 6 24 23
+46 97 32 78 67
+
+ 9 6 28 17 42
+ 2 86 84 90 13
+91 58 16 37 76
+15 3 45 51 4
+64 99 41 59 39
+
+44 3 85 80 93
+ 0 43 90 40 89
+82 91 55 79 75
+30 5 68 50 1
+37 24 59 62 66
+
+38 55 21 45 1
+23 14 95 25 22
+84 10 39 9 0
+17 15 58 70 49
+62 44 77 65 88
+
+ 8 62 25 75 39
+20 95 65 11 32
+ 5 92 15 86 66
+64 34 60 7 85
+10 76 6 53 61
+
+71 61 62 25 35
+23 30 37 14 9
+99 98 52 51 19
+77 57 17 72 85
+33 91 31 43 67
+
+76 66 39 36 44
+49 97 93 33 52
+13 70 21 17 32
+71 98 80 19 60
+73 15 99 74 9
+
+41 8 33 29 87
+42 86 66 31 50
+45 60 83 81 21
+36 4 98 43 0
+49 76 18 90 16
+
+83 53 34 39 58
+91 68 17 62 4
+ 2 76 44 31 35
+14 61 49 84 92
+73 6 86 27 65
+
+56 70 47 60 97
+35 89 26 99 59
+67 23 27 74 65
+61 62 15 18 45
+54 93 0 9 71
+
+11 24 97 15 30
+46 74 17 48 43
+16 64 72 60 37
+63 90 41 91 66
+25 95 1 54 49
+
+87 67 27 26 38
+63 44 65 25 81
+ 1 66 96 62 17
+82 2 58 4 86
+61 64 54 24 90
+
+72 94 69 85 43
+38 11 93 39 13
+86 92 12 42 75
+ 6 89 58 88 52
+79 19 20 55 14
+
+77 93 58 6 52
+27 48 29 60 71
+87 24 25 54 49
+53 38 90 51 80
+57 50 18 1 13
+
+85 84 54 2 51
+33 41 0 38 80
+ 5 62 1 28 96
+17 88 64 26 90
+78 91 56 34 74
+
+83 14 82 6 55
+30 13 99 57 39
+93 73 37 19 8
+29 49 76 22 92
+69 66 9 60 53
+
+51 78 52 72 79
+42 55 74 88 44
+90 75 65 87 69
+22 35 64 36 86
+63 41 19 59 49
+
+49 86 81 23 12
+93 16 9 8 95
+68 33 4 82 61
+45 28 85 87 38
+35 70 63 18 52
+
+63 93 38 34 61
+75 21 86 42 25
+52 85 99 24 36
+41 11 79 54 47
+44 84 65 28 89
+
+91 37 30 39 59
+ 7 94 90 38 40
+72 21 75 31 61
+68 42 34 20 8
+ 3 16 76 44 57
+
+32 55 36 81 42
+21 75 68 28 65
+46 70 29 54 64
+66 89 96 25 43
+79 76 41 77 71
+
+41 29 60 74 34
+84 49 83 72 92
+22 6 21 17 94
+15 44 62 28 2
+25 93 64 1 42
+
+68 76 23 62 10
+36 87 15 12 57
+79 46 18 83 11
+48 81 58 52 28
+72 40 64 55 21
+
+25 51 42 63 41
+ 0 72 92 23 13
+65 1 69 33 2
+78 27 95 61 55
+30 54 48 3 57
+
+50 40 58 66 59
+84 79 64 75 44
+88 93 41 25 97
+19 86 37 91 81
+10 26 94 77 34
+
+76 44 11 16 60
+19 92 91 58 50
+97 5 46 4 52
+87 42 65 75 15
+12 2 54 27 86
+
+77 38 51 29 89
+ 7 76 54 48 44
+88 50 2 5 53
+12 70 26 57 74
+31 19 18 34 47
+
+35 99 86 96 62
+61 97 71 70 66
+49 55 36 76 3
+94 23 31 91 26
+80 8 20 95 15
+
+ 4 96 40 36 12
+87 75 38 30 11
+69 29 23 85 91
+49 5 14 57 24
+88 20 99 78 65
+
+34 65 71 79 67
+28 1 33 47 11
+15 86 84 83 55
+35 10 19 63 23
+58 66 45 77 26
+
+74 13 25 39 8
+46 47 77 37 0
+60 1 81 42 18
+ 5 51 78 30 4
+36 12 10 32 82
+
+51 83 58 10 56
+28 18 43 99 14
+ 3 57 30 49 88
+20 68 76 73 82
+ 1 85 77 22 47
+
+50 12 11 97 83
+40 10 49 81 63
+43 15 91 3 2
+52 20 53 89 33
+42 94 59 78 46
+
+19 63 86 82 9
+69 13 27 88 37
+45 51 79 11 8
+ 2 29 41 84 73
+76 24 78 96 38
+
+15 19 88 95 54
+28 94 96 27 26
+ 8 82 68 6 71
+33 9 99 62 63
+38 83 41 14 79
+
+67 57 2 21 19
+11 79 74 45 95
+42 90 68 47 62
+80 61 1 0 39
+43 76 40 27 66
diff --git a/2021/day04/day04_input_ez.txt b/2021/day04/day04_input_ez.txt
new file mode 100644
index 0000000..669a51d
--- /dev/null
+++ b/2021/day04/day04_input_ez.txt
@@ -0,0 +1,19 @@
+7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1
+
+22 13 17 11 0
+ 8 2 23 4 24
+21 9 14 16 7
+ 6 10 3 18 5
+ 1 12 20 15 19
+
+ 3 15 0 2 22
+ 9 18 13 17 5
+19 8 7 25 23
+20 11 10 24 4
+14 21 16 12 6
+
+14 21 17 24 4
+10 16 15 9 19
+18 8 23 26 20
+22 11 13 6 5
+ 2 0 12 3 7
diff --git a/2021/day04/makefile b/2021/day04/makefile
new file mode 100644
index 0000000..ef809af
--- /dev/null
+++ b/2021/day04/makefile
@@ -0,0 +1,2 @@
+all day04.cpp:
+ g++ -std=c++20 -o day04 day04.cpp
diff --git a/2021/day05/day05 b/2021/day05/day05
new file mode 100755
index 0000000..78ac4fc
--- /dev/null
+++ b/2021/day05/day05
Binary files differ
diff --git a/2021/day05/day05.cpp b/2021/day05/day05.cpp
new file mode 100644
index 0000000..895dba0
--- /dev/null
+++ b/2021/day05/day05.cpp
@@ -0,0 +1,100 @@
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
+#include <map>
+
+#include "../utils.h"
+
+class Line {
+ public:
+ Line (int a, int b, int c, int d) : a(a), b(b), c(c), d(d) { }
+ Line (std::string line) {
+ std::vector<std::string> parts, start, end;
+ split(parts, line, "->");
+ split(start, parts[0], ",");
+ split(end, parts[1], ",");
+ a = std::stoi(start[0]);
+ b = std::stoi(start[1]);
+ c = std::stoi(end[0]);
+ d = std::stoi(end[1]);
+ if (c-a == 0) xdir = 0;
+ else { xdir = (c-a) > 0 ? 1 : -1; }
+ if (d-b == 0) ydir = 0;
+ else { ydir = (d-b) > 0 ? 1 : -1; }
+ }
+ int a, b, c, d, xdir, ydir;
+
+ int length () { return abs(a-c) + abs(b-d); }
+
+ bool operator==(Line& oth) {
+ return a == oth.a && b == oth.b && c == oth.c && d == oth.d;
+ }
+};
+
+int main (int argc, char *argv[]) {
+ std::string raw;
+ std::getline(std::ifstream(argv[1]), raw, '\0');
+
+ std::vector<Line> lines;
+ std::vector<std::string> strlines;
+ split(strlines, raw, "\n");
+ for (auto strline : strlines) {
+ if (strline.size() == 0) continue;
+ Line line { strline };
+ if (line.xdir != 0 && line.ydir != 0
+ && std::stoi(argv[2]) == 0) continue;
+ lines.push_back(line);
+ }
+
+ int intersections = 0;
+ std::map<std::pair<int, int>, int> overlaps;
+ for (auto& line : lines) {
+ int dist = 0;
+ bool straight = true;
+ if (line.xdir != 0 && line.ydir != 0) straight = false;
+ for (int i=0; dist<line.length()+1; i++) {
+ std::pair pair { line.a + line.xdir*i, line.b + line.ydir*i };
+ if (overlaps.count(pair) == 0) overlaps[pair] = 1;
+ else {
+ if (overlaps[pair] == 1) intersections += 1;
+ overlaps[pair] += 1;
+ }
+ if (straight) dist ++;
+ else dist += 2;
+ }
+ }
+
+
+ int minx = 200;
+ int maxx = -200;
+ int miny = 200;
+ int maxy = -200;
+ for (auto& line : lines) {
+ minx = std::min(minx, std::min(line.a, line.c));
+ maxx = std::max(maxx, std::max(line.a, line.c));
+ miny = std::min(miny, std::min(line.b, line.d));
+ maxy = std::max(maxy, std::max(line.b, line.d));
+ }
+
+ std::cout << "bounds: "
+ << minx << " " << maxx << " "
+ << miny << " " << maxx << std::endl;
+
+ /* visualizer
+ for (int y=miny; y<maxy+1; y++) {
+ for (int x=minx; x<maxx+1; x++) {
+ int amt = overlaps[std::make_pair(x, y)];
+ if (amt > 9) amt = 9;
+ if (amt > 0) std::cout << amt;
+ else std::cout << ".";
+
+ }
+ std::cout << std::endl;
+ }
+ */
+
+ std::cout << "intersections: " << intersections << std::endl;
+
+ return 0;
+}
diff --git a/2021/day05/day05_input.txt b/2021/day05/day05_input.txt
new file mode 100644
index 0000000..58fb409
--- /dev/null
+++ b/2021/day05/day05_input.txt
@@ -0,0 +1,500 @@
+682,519 -> 682,729
+852,131 -> 25,958
+303,481 -> 206,481
+199,682 -> 183,666
+363,190 -> 571,190
+930,290 -> 221,290
+364,627 -> 952,39
+234,309 -> 234,821
+130,864 -> 130,886
+462,347 -> 699,110
+375,969 -> 481,969
+989,859 -> 275,145
+221,748 -> 212,748
+870,173 -> 106,937
+604,33 -> 604,142
+780,35 -> 780,206
+636,808 -> 721,808
+944,989 -> 334,989
+477,113 -> 192,113
+879,265 -> 879,358
+754,974 -> 17,974
+10,989 -> 989,10
+337,320 -> 674,657
+225,96 -> 557,428
+129,354 -> 299,354
+717,695 -> 695,695
+94,255 -> 317,478
+90,87 -> 90,187
+77,942 -> 952,67
+804,315 -> 989,315
+619,470 -> 491,342
+466,90 -> 466,755
+840,121 -> 840,469
+638,127 -> 638,77
+844,40 -> 151,40
+653,987 -> 653,631
+195,583 -> 195,623
+88,985 -> 570,503
+921,897 -> 165,141
+230,27 -> 171,27
+737,771 -> 832,771
+563,365 -> 665,467
+942,940 -> 776,774
+12,903 -> 644,903
+308,390 -> 308,971
+572,943 -> 572,15
+104,389 -> 104,73
+346,721 -> 974,93
+30,53 -> 562,53
+804,682 -> 804,120
+952,45 -> 15,982
+475,456 -> 475,348
+409,247 -> 664,247
+345,18 -> 816,489
+571,158 -> 505,158
+59,195 -> 27,195
+230,681 -> 23,681
+258,711 -> 921,711
+658,112 -> 366,404
+842,220 -> 842,825
+815,744 -> 540,744
+192,314 -> 703,825
+869,573 -> 869,888
+603,268 -> 603,301
+816,668 -> 816,189
+148,606 -> 948,606
+117,461 -> 506,461
+986,955 -> 986,315
+131,250 -> 192,189
+988,148 -> 518,618
+682,900 -> 31,900
+652,839 -> 652,236
+466,812 -> 466,611
+881,346 -> 401,346
+229,639 -> 731,639
+104,476 -> 840,476
+10,988 -> 988,10
+29,15 -> 987,973
+825,348 -> 825,240
+989,989 -> 10,10
+430,796 -> 926,796
+49,293 -> 610,854
+325,288 -> 918,288
+625,309 -> 439,495
+536,150 -> 356,150
+834,558 -> 822,558
+315,408 -> 315,635
+257,973 -> 813,973
+713,52 -> 122,52
+323,970 -> 578,970
+447,49 -> 829,49
+941,709 -> 941,390
+148,323 -> 391,80
+23,171 -> 23,49
+475,265 -> 322,112
+506,407 -> 69,844
+567,284 -> 483,368
+114,745 -> 114,765
+392,252 -> 109,535
+65,188 -> 455,188
+732,779 -> 732,52
+233,214 -> 759,214
+232,969 -> 957,244
+20,669 -> 20,308
+49,972 -> 285,972
+501,383 -> 433,383
+918,15 -> 32,901
+255,268 -> 935,948
+757,588 -> 757,919
+530,803 -> 284,557
+688,926 -> 48,286
+331,245 -> 331,777
+448,544 -> 209,544
+10,970 -> 951,29
+233,11 -> 897,11
+145,392 -> 628,392
+935,971 -> 935,280
+169,632 -> 54,632
+155,244 -> 155,334
+56,284 -> 205,284
+553,428 -> 553,520
+977,176 -> 497,656
+323,339 -> 971,987
+616,355 -> 616,248
+72,660 -> 72,334
+644,822 -> 510,956
+356,841 -> 587,841
+413,468 -> 605,468
+85,22 -> 645,582
+924,850 -> 522,850
+448,45 -> 345,148
+102,566 -> 551,566
+80,39 -> 847,806
+936,436 -> 934,436
+53,24 -> 495,466
+234,173 -> 282,173
+145,680 -> 456,680
+960,759 -> 960,282
+984,814 -> 308,138
+398,808 -> 716,808
+509,536 -> 25,52
+289,777 -> 803,263
+766,892 -> 257,892
+301,733 -> 688,733
+24,109 -> 887,972
+180,32 -> 577,429
+985,801 -> 687,503
+901,582 -> 586,582
+50,56 -> 50,267
+344,373 -> 437,373
+542,133 -> 905,496
+420,624 -> 420,716
+645,106 -> 645,574
+356,37 -> 114,37
+324,919 -> 357,919
+126,797 -> 120,797
+288,689 -> 435,836
+93,915 -> 639,369
+106,391 -> 478,19
+277,501 -> 714,64
+253,277 -> 643,277
+568,972 -> 350,972
+213,235 -> 213,406
+595,888 -> 595,233
+577,63 -> 37,603
+649,732 -> 931,732
+469,892 -> 549,892
+953,895 -> 953,457
+222,213 -> 290,213
+841,800 -> 841,336
+685,143 -> 25,143
+441,127 -> 441,146
+646,586 -> 56,586
+698,122 -> 465,122
+641,502 -> 641,240
+111,91 -> 185,91
+927,755 -> 874,808
+108,151 -> 108,567
+309,453 -> 309,210
+890,657 -> 491,657
+404,244 -> 404,123
+939,28 -> 26,941
+596,970 -> 596,870
+489,556 -> 489,589
+607,621 -> 903,325
+912,284 -> 571,284
+921,702 -> 743,524
+719,36 -> 719,394
+100,905 -> 798,207
+316,260 -> 316,887
+799,940 -> 885,940
+835,287 -> 199,923
+422,760 -> 64,760
+727,113 -> 727,679
+733,56 -> 59,730
+141,399 -> 485,743
+769,629 -> 769,797
+62,486 -> 62,205
+192,332 -> 800,332
+15,931 -> 727,931
+854,915 -> 988,915
+349,610 -> 886,610
+72,110 -> 72,903
+955,110 -> 78,987
+591,553 -> 591,428
+708,467 -> 516,467
+397,589 -> 353,589
+930,336 -> 930,532
+639,50 -> 228,50
+472,17 -> 472,244
+420,825 -> 420,562
+203,197 -> 203,35
+984,964 -> 223,203
+944,269 -> 935,260
+933,119 -> 87,965
+696,290 -> 696,580
+925,960 -> 52,87
+451,470 -> 235,254
+562,71 -> 562,149
+405,126 -> 405,67
+356,424 -> 356,673
+859,649 -> 859,291
+210,651 -> 210,544
+403,783 -> 403,122
+672,87 -> 586,87
+409,668 -> 984,668
+917,352 -> 511,758
+395,953 -> 141,953
+152,795 -> 152,313
+839,344 -> 811,372
+114,649 -> 650,649
+60,517 -> 60,27
+448,392 -> 845,392
+33,849 -> 719,163
+151,988 -> 876,988
+805,556 -> 124,556
+361,538 -> 706,193
+974,941 -> 141,108
+271,813 -> 968,116
+500,697 -> 80,277
+586,731 -> 586,480
+128,147 -> 174,101
+882,681 -> 882,745
+531,730 -> 677,730
+989,11 -> 11,989
+74,332 -> 234,492
+360,326 -> 932,898
+136,288 -> 113,311
+666,645 -> 916,895
+977,478 -> 561,62
+20,83 -> 566,83
+331,942 -> 331,646
+180,291 -> 405,291
+637,763 -> 637,941
+120,138 -> 120,820
+951,24 -> 14,961
+204,304 -> 204,51
+84,168 -> 880,168
+955,145 -> 955,903
+437,427 -> 437,354
+875,67 -> 189,753
+46,767 -> 802,11
+52,59 -> 889,896
+926,56 -> 102,880
+500,30 -> 964,30
+329,488 -> 329,972
+63,11 -> 889,837
+707,168 -> 707,584
+580,10 -> 735,10
+105,620 -> 105,110
+187,531 -> 323,531
+82,947 -> 82,941
+737,199 -> 737,851
+612,650 -> 217,650
+971,15 -> 82,904
+16,590 -> 506,100
+950,877 -> 832,759
+570,470 -> 570,276
+213,411 -> 213,195
+670,755 -> 89,755
+906,963 -> 906,984
+458,463 -> 442,463
+956,969 -> 10,23
+87,215 -> 195,107
+819,454 -> 819,467
+594,793 -> 686,793
+395,724 -> 787,332
+315,461 -> 644,461
+448,247 -> 249,48
+620,302 -> 247,675
+607,134 -> 932,134
+312,776 -> 312,289
+850,942 -> 54,146
+31,538 -> 851,538
+729,126 -> 640,126
+702,199 -> 702,706
+402,783 -> 254,783
+110,59 -> 203,59
+27,10 -> 965,948
+747,261 -> 47,261
+628,742 -> 972,742
+712,742 -> 657,797
+877,871 -> 877,758
+665,313 -> 449,529
+498,157 -> 498,68
+870,922 -> 27,79
+856,697 -> 856,429
+447,271 -> 963,787
+495,302 -> 495,520
+526,47 -> 721,47
+826,179 -> 826,741
+565,461 -> 893,461
+512,328 -> 127,328
+487,920 -> 522,920
+614,452 -> 614,146
+331,574 -> 331,840
+985,79 -> 285,779
+812,320 -> 985,320
+118,69 -> 429,69
+644,525 -> 644,878
+271,132 -> 156,132
+955,782 -> 565,392
+630,939 -> 630,372
+51,203 -> 840,203
+202,490 -> 202,479
+579,868 -> 579,92
+979,336 -> 979,623
+843,865 -> 260,282
+685,872 -> 685,503
+721,193 -> 721,510
+908,661 -> 908,955
+19,950 -> 715,254
+233,730 -> 233,101
+922,954 -> 27,954
+399,444 -> 399,403
+380,712 -> 380,718
+238,264 -> 849,875
+458,577 -> 458,139
+418,244 -> 469,295
+460,375 -> 964,879
+276,445 -> 815,445
+463,910 -> 648,725
+26,384 -> 968,384
+955,385 -> 955,143
+942,775 -> 733,566
+425,326 -> 531,326
+364,545 -> 364,873
+182,759 -> 182,819
+390,757 -> 390,475
+217,417 -> 217,157
+669,286 -> 65,890
+257,11 -> 257,858
+557,397 -> 557,20
+888,946 -> 32,90
+971,938 -> 971,578
+874,248 -> 874,485
+87,268 -> 87,135
+756,679 -> 103,26
+771,250 -> 771,107
+320,711 -> 967,711
+293,219 -> 293,706
+103,565 -> 103,538
+388,256 -> 388,261
+468,953 -> 503,953
+424,142 -> 287,142
+24,930 -> 850,930
+316,167 -> 316,161
+481,421 -> 208,148
+938,926 -> 938,933
+701,653 -> 701,780
+536,390 -> 536,559
+40,954 -> 829,165
+404,985 -> 247,985
+94,628 -> 94,500
+441,637 -> 441,271
+766,946 -> 97,277
+428,363 -> 428,37
+542,694 -> 542,347
+11,16 -> 979,984
+938,651 -> 632,957
+779,127 -> 243,663
+636,294 -> 636,787
+533,744 -> 636,641
+521,950 -> 458,950
+988,12 -> 18,982
+954,621 -> 954,271
+638,951 -> 813,951
+822,911 -> 632,911
+714,849 -> 512,849
+696,88 -> 385,88
+65,451 -> 65,687
+976,973 -> 976,907
+368,489 -> 368,571
+358,831 -> 690,499
+436,704 -> 178,704
+690,619 -> 606,535
+96,701 -> 358,701
+885,562 -> 420,562
+581,480 -> 613,512
+44,970 -> 970,44
+216,796 -> 892,120
+72,623 -> 72,72
+896,283 -> 896,326
+794,195 -> 22,967
+134,326 -> 134,889
+420,141 -> 944,665
+941,194 -> 941,421
+940,525 -> 298,525
+653,300 -> 769,300
+227,424 -> 406,603
+275,850 -> 113,850
+648,850 -> 92,850
+638,389 -> 638,10
+379,404 -> 584,609
+833,931 -> 833,520
+772,286 -> 500,558
+372,262 -> 333,262
+689,18 -> 131,576
+687,499 -> 687,188
+344,499 -> 37,806
+778,496 -> 134,496
+938,87 -> 344,681
+788,401 -> 479,401
+828,903 -> 756,903
+423,625 -> 285,763
+218,489 -> 218,819
+488,384 -> 891,787
+817,532 -> 788,532
+512,27 -> 512,149
+369,794 -> 54,794
+534,590 -> 827,883
+84,310 -> 39,265
+357,545 -> 665,545
+539,807 -> 539,781
+378,683 -> 22,327
+71,909 -> 943,37
+740,552 -> 348,552
+698,315 -> 45,968
+516,835 -> 360,835
+629,141 -> 629,385
+695,908 -> 303,908
+795,707 -> 386,707
+211,397 -> 291,397
+64,620 -> 236,620
+97,638 -> 97,445
+46,103 -> 893,950
+468,122 -> 979,122
+810,486 -> 433,486
+532,899 -> 461,970
+232,60 -> 235,60
+549,708 -> 549,90
+294,978 -> 294,124
+865,406 -> 640,406
+755,305 -> 664,305
+12,989 -> 987,14
+275,249 -> 260,234
+502,783 -> 67,783
+863,938 -> 297,372
+516,961 -> 516,272
+67,510 -> 611,510
+980,951 -> 312,283
+325,512 -> 325,169
+142,429 -> 542,29
+273,964 -> 822,964
+370,217 -> 508,217
+131,131 -> 331,331
+734,824 -> 734,817
+75,89 -> 687,701
+155,255 -> 702,802
+577,395 -> 130,395
+684,94 -> 555,94
+393,881 -> 173,881
+894,750 -> 773,750
+380,269 -> 380,338
+427,36 -> 427,77
+637,107 -> 637,846
+53,437 -> 53,221
+128,979 -> 960,147
+838,211 -> 838,645
+898,39 -> 849,39
+862,495 -> 951,495
+754,406 -> 76,406
+951,960 -> 113,122
+830,125 -> 15,940
+190,117 -> 190,973
+192,956 -> 718,430
+895,162 -> 88,969
+135,196 -> 70,131
+578,642 -> 578,789
+713,268 -> 625,268
+938,719 -> 938,604
+30,863 -> 99,863
+844,309 -> 287,309
+131,837 -> 459,509
+61,206 -> 722,867
+95,974 -> 283,974
+746,672 -> 558,672
+552,32 -> 352,32
+21,637 -> 21,781
+945,847 -> 945,303
diff --git a/2021/day05/day05_input_ez.txt b/2021/day05/day05_input_ez.txt
new file mode 100644
index 0000000..b258f68
--- /dev/null
+++ b/2021/day05/day05_input_ez.txt
@@ -0,0 +1,10 @@
+0,9 -> 5,9
+8,0 -> 0,8
+9,4 -> 3,4
+2,2 -> 2,1
+7,0 -> 7,4
+6,4 -> 2,0
+0,9 -> 2,9
+3,4 -> 1,4
+0,0 -> 8,8
+5,5 -> 8,2
diff --git a/2021/day05/makefile b/2021/day05/makefile
new file mode 100644
index 0000000..a197e7d
--- /dev/null
+++ b/2021/day05/makefile
@@ -0,0 +1,2 @@
+all day05.cpp:
+ g++ -std=c++20 -o day05 day05.cpp
diff --git a/2021/day06/day06 b/2021/day06/day06
new file mode 100755
index 0000000..ccf553a
--- /dev/null
+++ b/2021/day06/day06
Binary files differ
diff --git a/2021/day06/day06.cpp b/2021/day06/day06.cpp
new file mode 100644
index 0000000..38d602b
--- /dev/null
+++ b/2021/day06/day06.cpp
@@ -0,0 +1,47 @@
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
+
+#include "../utils.h"
+
+long sum (std::vector<long> vec) {
+ long s = 0; for (long v : vec) s += v; return s;
+}
+
+int main (int argc, char *argv[]) {
+ std::string raw;
+ std::getline(std::ifstream(argv[1]), raw, '\0');
+ std::vector<std::string> strfish;
+ split(strfish, raw, ",");
+
+ std::vector<long> fish;
+ for (int i=0; i<9; i++) { fish.push_back(0); }
+ for (std::string str : strfish) fish[std::stoi(str)] += 1;
+
+ int days = 80;
+ if (argc > 2) days = std::stoi(std::string(argv[2]));
+ for (int i=0; i<days; i++) {
+ long born = fish[0];
+ fish[0] = 0;
+ for (int j=1; j<9; j++) {
+ fish[j-1] += fish[j];
+ fish[j] = 0;
+ }
+ fish[6] += born;
+ fish[8] = born;
+
+ if (argc > 3 && std::string(argv[3]) == "-w") {
+ std::cout << "day " << i+1 << "/" << days
+ << " current fish: " << sum(fish) << std::endl;
+ }
+ if (argc > 3 && std::string(argv[3]) == "-v") {
+ std::cout << "day " << i+1 << ": ";
+ for (auto f : fish) std::cout << f << ",";
+ std::cout << std::endl;
+ }
+ }
+
+ std::cout << "fish: " << sum(fish) << std::endl;
+ return 0;
+}
diff --git a/2021/day06/day06_input.txt b/2021/day06/day06_input.txt
new file mode 100644
index 0000000..5b38bce
--- /dev/null
+++ b/2021/day06/day06_input.txt
@@ -0,0 +1 @@
+4,1,1,4,1,1,1,1,1,1,1,1,3,4,1,1,1,3,1,3,1,1,1,1,1,1,1,1,1,3,1,3,1,1,1,5,1,2,1,1,5,3,4,2,1,1,4,1,1,5,1,1,5,5,1,1,5,2,1,4,1,2,1,4,5,4,1,1,1,1,3,1,1,1,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,2,1,1,1,1,1,1,1,2,4,4,1,1,3,1,3,2,4,3,1,1,1,1,1,2,1,1,1,1,2,5,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,4,1,5,1,3,1,1,1,1,1,5,1,1,1,3,1,2,1,2,1,3,4,5,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,3,1,1,3,1,1,4,1,1,1,1,1,2,1,1,1,1,3,2,1,1,1,4,2,1,1,1,4,1,1,2,3,1,4,1,5,1,1,1,2,1,5,3,3,3,1,5,3,1,1,1,1,1,1,1,1,4,5,3,1,1,5,1,1,1,4,1,1,5,1,2,3,4,2,1,5,2,1,2,5,1,1,1,1,4,1,2,1,1,1,2,5,1,1,5,1,1,1,3,2,4,1,3,1,1,2,1,5,1,3,4,4,2,2,1,1,1,1,5,1,5,2
diff --git a/2021/day06/day06_input_ez.txt b/2021/day06/day06_input_ez.txt
new file mode 100644
index 0000000..55129f1
--- /dev/null
+++ b/2021/day06/day06_input_ez.txt
@@ -0,0 +1 @@
+3,4,3,1,2
diff --git a/2021/day06/makefile b/2021/day06/makefile
new file mode 100644
index 0000000..2bc132f
--- /dev/null
+++ b/2021/day06/makefile
@@ -0,0 +1,2 @@
+all day06.cpp:
+ g++ -std=c++20 -o day06 day06.cpp
diff --git a/2021/day07/day07 b/2021/day07/day07
new file mode 100755
index 0000000..4cbc735
--- /dev/null
+++ b/2021/day07/day07
Binary files differ
diff --git a/2021/day07/day07.cpp b/2021/day07/day07.cpp
new file mode 100644
index 0000000..f9bbd1a
--- /dev/null
+++ b/2021/day07/day07.cpp
@@ -0,0 +1,40 @@
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
+
+#include "../utils.h"
+
+long sumdist (std::vector<int> pos, int pole, int inc) {
+ long sd = 0;
+ for (auto p : pos) {
+ int n = abs(p-pole);
+ if (inc == 1) n = (n * (n+1)) / 2;
+ sd += n;
+ }
+ return sd;
+}
+
+int main (int argc, char *argv[]) {
+ std::string raw;
+ std::getline(std::ifstream(argv[1]), raw, '\0');
+ std::vector<std::string> vec;
+ split(vec, raw, ",");
+ std::vector<int> pos;
+ for (auto s : vec) pos.push_back(std::stoi(s));
+
+ int minp = 10000, maxp = -10000;
+ for (auto p : pos) {
+ minp = std::min(minp, p);
+ maxp = std::max(maxp, p);
+ }
+ int inc = argc > 2 ? atoi(argv[2]) : 0;
+ long fuel = 100000000000;
+ for (int i=minp; i<maxp; i++) {
+ fuel = std::min(fuel, sumdist(pos, i, inc));
+ }
+
+ std::cout << "fuel: " << fuel << std::endl;
+
+ return 0;
+}
diff --git a/2021/day07/day07_input.txt b/2021/day07/day07_input.txt
new file mode 100644
index 0000000..4ac01fd
--- /dev/null
+++ b/2021/day07/day07_input.txt
@@ -0,0 +1 @@
+1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,601,578,981,315,530,525,671,1501,616,214,724,1247,543,58,183,282,242,54,90,130,1788,360,1719,710,1165,1476,29,744,164,293,1360,274,47,119,16,387,134,547,72,48,77,416,863,39,65,144,500,678,430,160,1689,550,753,1478,480,56,583,85,206,93,335,990,174,276,1119,52,308,470,563,387,897,21,85,720,983,178,383,134,299,722,57,391,489,768,232,646,1312,1316,31,57,927,176,531,421,1162,369,934,7,172,237,340,169,261,1371,1351,1268,72,58,375,1570,1238,55,513,403,1462,141,263,419,1316,852,251,39,358,209,204,439,150,1667,344,205,1299,1226,992,967,536,1160,1503,1154,1323,486,1079,329,823,506,1252,387,28,69,649,296,233,62,219,344,464,1284,291,234,47,949,1126,935,1367,1450,1431,379,344,478,731,648,77,184,927,211,262,728,1093,381,140,239,332,1436,78,665,1486,601,1444,364,1057,753,488,127,1001,350,1016,357,638,309,40,333,136,655,779,821,414,275,140,149,185,445,1169,476,196,907,1570,193,161,43,204,1489,1125,1024,101,17,592,1378,338,1625,3,269,1568,254,803,25,776,109,52,291,1595,255,739,34,768,378,632,4,181,373,162,562,74,85,160,16,47,38,266,1610,9,7,1398,358,287,450,188,1390,37,98,80,685,1645,50,55,16,542,20,443,848,49,808,76,233,69,110,471,73,408,638,89,861,280,1062,75,314,808,237,96,401,57,48,1306,115,1164,1533,5,1032,1314,66,630,96,496,116,1558,438,13,182,1360,802,101,327,370,444,335,812,430,900,1259,1117,318,118,433,501,401,101,582,27,454,981,776,14,26,163,384,1652,87,788,474,588,155,845,207,33,200,622,840,1360,432,11,525,86,296,481,200,529,95,924,431,40,846,220,285,14,66,755,111,647,643,1201,81,483,555,125,426,1499,29,115,48,39,92,316,434,217,218,116,9,33,496,358,1106,736,1181,1153,117,20,1719,1113,1620,26,581,407,114,1559,6,1918,964,909,340,630,817,473,111,1485,434,262,1702,651,11,182,1043,1904,633,336,252,677,1238,637,1008,82,327,171,185,19,141,395,1209,53,798,836,1378,598,262,298,265,287,85,21,249,848,162,89,1050,108,34,41,25,291,918,28,1234,139,351,867,146,79,995,1173,635,24,31,81,214,1114,155,1256,159,206,586,426,452,650,1653,47,42,264,240,500,864,893,1308,1249,853,286,62,592,102,77,1082,91,120,625,211,978,319,655,200,152,86,396,52,308,1479,38,41,53,179,648,216,41,641,659,1556,226,1421,291,33,1461,1095,529,309,1100,314,1695,505,1200,150,946,53,124,139,1506,52,33,463,613,33,1264,386,678,563,564,318,273,912,60,31,150,1321,133,1333,302,1243,49,421,808,1399,555,195,611,268,39,1302,1154,92,664,117,92,124,332,561,1436,865,198,71,271,909,40,1185,664,251,422,306,122,814,158,1676,122,217,312,952,845,104,572,1796,392,651,176,714,44,757,111,56,489,333,738,369,304,1239,105,297,277,674,213,938,2,681,336,171,1252,166,88,489,273,260,565,231,319,1085,650,211,510,12,511,325,46,107,980,1136,16,95,308,935,514,469,20,44,209,345,467,1310,500,75,594,166,199,741,193,28,52,106,1437,366,575,1200,609,678,534,573,723,325,8,386,268,690,321,186,375,2,104,657,1341,601,175,0,745,146,508,180,426,811,7,215,300,86,25,372,233,900,276,1625,808,1941,510,234,813,131,334,58,783,992,236,244,174,609,1581,1767,204,187,208,1340,347,803,146,299,140,142,339,60,118,300,809,276,413,267,946,77,154,466,425,193,187,852,674,2,17,1006,1007,166,195,137,97,41,407,65,1072,20,789,311,1227,20,132,1536,995,194,506,635,115,1500,529,93,72,950,208,944,1177,476,207,1228,5,974,226,225,290,690,581,218,401,49,361,1408,242,254,24,313,441,635,126,513,994,299,1722,52,1123,44,1332,628,534,789,298,692,45,596,1583,77,15,38,1293,1181,1498,772,148,297,49,692,87,594,49,148,170,54,1079,7,468,847,336,421,34,1108,406,892,689,245,298,85,1187,1142,286,310,207,34,660,549,39,1172,97,1,750,47,0,77,1632,135,54,18,22,1292,230,1031,11,225,820,461,1208,108,1443,274,1134,41,287,166,274,1032,585,1491,75,549,1231,1314,443,212,395,386,698,58,644,395,81,905,366,233,716,656,799,643,1011,173,790,360,269,930,13,606,488,387,1206,51
diff --git a/2021/day07/day07_input_ez.txt b/2021/day07/day07_input_ez.txt
new file mode 100644
index 0000000..18bd32a
--- /dev/null
+++ b/2021/day07/day07_input_ez.txt
@@ -0,0 +1 @@
+16,1,2,0,4,2,7,1,2,14
diff --git a/2021/day07/makefile b/2021/day07/makefile
new file mode 100644
index 0000000..2856268
--- /dev/null
+++ b/2021/day07/makefile
@@ -0,0 +1,2 @@
+all day07.cpp:
+ g++ -std=c++20 -o day07 day07.cpp
diff --git a/2021/day08/day08 b/2021/day08/day08
new file mode 100755
index 0000000..7f591be
--- /dev/null
+++ b/2021/day08/day08
Binary files differ
diff --git a/2021/day08/day08.cpp b/2021/day08/day08.cpp
new file mode 100644
index 0000000..30b818b
--- /dev/null
+++ b/2021/day08/day08.cpp
@@ -0,0 +1,72 @@
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <string>
+
+#include "../utils.h"
+
+int distance (std::string a, std::string b) {
+ int d = 0;
+ for (auto k : b) {
+ if (a.find(k) == std::string::npos) d++;
+ } return d;
+}
+
+int map (std::vector<std::string> tries, std::string dig) {
+ if (dig.size() == 2) return 1;
+ if (dig.size() == 3) return 7;
+ if (dig.size() == 4) return 4;
+ if (dig.size() == 7) return 8;
+ if (dig.size() == 4) return 8;
+
+ std::string one = *std::find_if(std::begin(tries), std::end(tries),
+ [](std::string &str){ return str.size() == 2; });
+ std::string four = *std::find_if(std::begin(tries), std::end(tries),
+ [](std::string &str){ return str.size() == 4; });
+ if (dig.size() == 5) {
+ if (distance(dig, one) == 0) return 3;
+ if (distance(dig, four) == 1) return 5;
+ return 2;
+ }
+ if (dig.size() == 6) {
+ if (distance(dig, one) == 1) return 6;
+ if (distance(dig, four) == 0) return 9;
+ }
+ return 0;
+}
+
+int main (int argc, char *argv[]) {
+ std::string raw;
+ std::getline(std::ifstream(argv[1]), raw, '\0');
+ std::vector<std::string> lines, parts;
+ split(lines, raw, "\n");
+
+ std::vector<int> count;
+ for (int i=0; i<8; i++) count.push_back(0);
+
+ int sum = 0;
+ for (auto line : lines) {
+ if (line.size() == 0) continue;
+ parts.clear();
+ split(parts, line, " | ");
+
+ std::vector<std::string> tries, digits;
+ split(tries, parts[0], " ");
+ split(digits, parts[1], " ");
+
+ int i = 1000;
+ int num = 0;
+ for (auto dig : digits) {
+ count[dig.size()]++;
+ num += i*map(tries, dig);
+ i/=10;
+ }
+ sum += num;
+ }
+
+ std::cout << "digits: " << count[2] + count[3] + count[4] + count[7]
+ << std::endl;
+ std::cout << "sum: " << sum << std::endl;
+
+ return 0;
+}
diff --git a/2021/day08/day08_input.txt b/2021/day08/day08_input.txt
new file mode 100644
index 0000000..cf25f77
--- /dev/null
+++ b/2021/day08/day08_input.txt
@@ -0,0 +1,200 @@
+bfdcga cgdfe egfda cbfeda ec efc gcfbd ebcg gdfbec adcgfeb | bgdfc ec dfgae gefcd
+cafgbd bc gfdbae eacfb cbf debaf cdgefba fecag fbcdae ecbd | cdfabg cb adgfcb bface
+afg daecgf aefbgdc fbge fg dabfg efabgd cbadge abcfd gbaed | acbdf egbda adbge fg
+cbeafg fadce cdeabfg gbdefc ged ebcgf bfgd dg ecdgf bgedac | fgdb afcbeg gcfeba edg
+efd aegdb efgdcb bafcd acef dfaeb ef fgbadec cadfgb bfecda | fedgcb begcfd def gfdbac
+badce gbcda gad fgdc acbgf cfbage gcfbad gd dbafeg afcbged | ebdfag dfcbag gd fdeagb
+gdbcaf da dcbeg cad edcbfg gdea baedc afbec baegdc gbfaedc | gbdcaf dbgec da gaed
+bedga agbefd dbgfca gcafdbe begcdf gdabf abegc deb ed adef | bgade gacbe ebd cbefdg
+eg edfcab gfde abedf fbgdea bgcad gefcba agbed ebg eafbcgd | ge fbdeca bdcfega cgadb
+dgbaecf fegbd de fbgade fde gecfb ebda dbgfa dfegca dfagbc | afcegd fgdabce de efgdac
+dgafe deafbg gdecbfa fgcad beagd gfbcae efa dbfe ef dcgeba | gafedb debacg ef dfbe
+gbadcf bcade efdgbac bcf acebf bf egcfa ebdf acbgde cdabfe | fbcea eafcg fcbea dcbafge
+dcfbge ecdabg gfbdae afecb cbg cbgae gacedbf gadc cg bedag | bgdae becga bdcgfe ebcgda
+bde eb cgbfade cdgbef beag gabdf dafeb cadfe agdfcb eadgfb | begfdc dfbcga abfdg edagbf
+dcbgea fced cgeaf cfaged gdeac dgbfca fc badgfce cfg egbfa | fbcdag feagb cdef fcg
+gfdbc adebcg cbg dfcaeb cg bcaefdg bdgfec bdagf dcfeb egcf | fbgda aedfcb cfgbde defgcb
+daf cagfeb adeg dcbef cdgbaf da efcag fbdegca ecafd dcaegf | da bgeafc bgdfac ecgdaf
+gfdaeb gfde agebf bgf fg bgcfad afbde fdaecb dbeacfg eabcg | gecab baedf eadfb gcbdfa
+bagcfed eafb acfgd cebdfg ead agbdef baedcg egfbd agefd ea | gacfd bgfed fgdae bfdeg
+cgfab adcfebg cgdef eabc feagbd ebcfg feb eb bdfcga gbcfae | defgc bdcafg fgdec cegbf
+cdfab gdf cfebg decbaf gd dcgbaf gcbfd cgad egdbaf badcfeg | gfcbd gd cbgfe ecbafd
+faebd ba efacgd baedcf adcef abf dcfbgae dbac gdbfe begcaf | dcab dafec fecadg ebdfa
+dfceab egbadcf ba fdcbg feba cgdfae dbegac abdfc cba ecfad | defacg dgbcf gbdcf efcdbga
+cadgb bedg fgaceb eacbgd egbac cefadg gd cafdb eabgdfc gad | afgdce adcgb gbacd adg
+acb adcgf adcfeb baedg cb becagd bfcadge abcdg ebgc gfdeba | gdafc acfdeb cb aebgd
+fabcgd fcdgae facde bcafeg da geda gcebadf befcd eagfc adf | cfage fgeac fgdbaec fgeac
+bafeg fabcdg efdgabc fgdbea gdae ae dgafb bae ebgcf fcadbe | begcf abgfe aegbf efbadc
+fdeca cadegbf gce bafdge abcdeg dcgb ebcfga cg deagb dagce | bdeag aebdgf gce dbage
+fcgbde cdgaebf dgbaef fed bade ed adfgb efdag fdabcg agefc | gfdab adbcfg gcfae dfagb
+ebdgfc febad adbfc fc bdfcea badfge cfb eafc acdgb egcfdba | acbgd bgfead dfabc fcea
+eb ebaf cbdgef gaedb afgebdc febdag dgefac agbcd beg deagf | dgfcea efabdg egabd geafd
+cedfba efgbd gfbdac gfaecd bfa gdfba bcag ab cgdfa begdafc | dfbace dfgeb eafcdbg dfcag
+cfdbge gdbefac dabf dgbcfa gacdf gebca fb agefdc bcgaf fbc | afbd gbcafed acgeb ebgfdc
+fgbec fbgcd fdbaceg gafedc bfacge fge eafb agbced cbgea fe | abgce fadegc ebacg fagecd
+bdgec bgecfa fcbed debfcg acebfd gcb adbecgf gb aegcd gbdf | ebgfdc geacbfd gcb gb
+fbea bdfcag dceabg egfcd edcfbga abdge af adf dfbage egfad | fa deacgb agfdbce ebdag
+abdecfg gbacf fdbcge gfd dg gdafbc adgb acfde fadgc fbeagc | dcgebf dacgf agfbc cdagbf
+agcefd ged bdfagc ed ebdgf fcdbge dgfbc abegf cdfegab debc | cagdfe ged cgdafb bafdcg
+cebgad fdgea abgf fdbcae af baedg dgfeba dfbagce edgfc fea | dabegcf agdbe afe acfedb
+agdfe fedbcga gfedbc agcbe edb db fdba edbgaf gedafc abdeg | cdgabfe afegbd fegbcd eafgd
+dea abgdfe edgfbac egdab de cadbef adfbg gbcea gfde dabgfc | cdafeb ed bafgde ed
+adgfb cdgefa ea fea bcdef cfagbd fgecabd febda agbe fgabed | cdefb gbea bdacfg dcbef
+cadbg ea fdgeab afcedg dae ebcfdga cdfge afec dbfgce ceagd | fbeacdg dgcab bgdca dae
+ecdbfg caebd fcgde fgda aefbcg afedc fcabegd aef gcdaef af | ecdfa bdecfg fea dgcfbea
+dbcagf afgec fcadb ead daefc dbcgae edfb cagbdfe fcdbae de | egdabc fdagbc cgafbd afdec
+dgfabe egdcbfa beacdg dbcfg aefc cdbaf fbadec fa aedbc fab | eacf bcdfg efca ecbad
+defbgc gbdef cg edgc egbadfc cbgef gafdeb gcf eacbf gbfdca | fbedg decg cgf egfcb
+cfdgae abdgf gbcd cfdaeb afebcgd cafgd bdf bcfgad db gefba | egfba decgfa abfeg eafdcg
+dfagb gdbface adefbc gbfae gae begc acebgf fdgeca ge cefba | cgefab dfgace fecagd beadfc
+fedacgb ed cabdfg bfgade dbaefc gdfba def gead bgcfe bdfeg | adcefb gdbaf egad caebdf
+agfbed ecfbg cdge cgb fcgbde ebcaf adfbcg dcegabf cg efdgb | bdfcga bfeadg ecgfb cg
+bec becfdag bgcaf eb debf adcef cefba fbcade acbged fcadge | edacfb fdeca fgabc cgafb
+bfcae gabc fegcdb adefgbc bcgfae gfb fbgea fdabec adgfe bg | dfcgeb fgbae fgb bedgfc
+afedcbg ed dfagc gefcd dec agbdec bfecg gfedca efad dfabcg | edaf dec begadc dfagbc
+cgebd befcadg ecg ec fcde dbfgc fgdabc becfga aegbd bfcged | cbgafd bcgfd fedc gfdbec
+dfabeg acfebd bgfcde begfd bcagd cdafgbe gabed aeb fgae ea | gbedf gdebfa bfegcd bgefd
+gdf dagec gf cfdbega cfdba edbcga ceadfg fcdag aegf cdbfge | eafg fgd dfg bdegcf
+bcfae fabge cdegabf cdae ebc dfcba ecbdfg ce dagcfb fbedca | fdagcb bcedfa fceabdg adce
+cgbaf ad fgcadeb cbfdae fbgdac bgda egdfc cefbag adc fcadg | cfdgbae adc ecafgb dgabfc
+bafdc cfb cf abcfged acdbge dbgca aefdb afcg afcdgb gbefdc | dabfc cagf efbcgd abecdgf
+de abgefdc fbed adbcgf gaecf eda aebdgf adbecg fegda bfagd | feagbd dbgfac ade adgfe
+gacefb faebcgd decfgb fa abdgfe afb fdbge dacbg adfgb edfa | dgbac abcgd gbadc adbgf
+fbadg fgbde fagebd agbcf gad gfcbed abde da cbdfaeg afegdc | ecfbdg agd efdgcba aefbdg
+cbdge gfecd cfe cafgd dbfe fe bgefdca gedfcb gebfac dgbcea | dgecb bagcfde gecbaf gacbef
+dfgecb agbfe dbeacf ebcdf cbad cadfbeg ca cfa abcef edfcga | afgdbce cabd fcbdae becaf
+abcd fbade befdcag da fecdag ecfdab bgfced bfedc dae gbaef | da ebfdc cabd cfedbg
+ecdab cfaged cbfd cfebad begda agbfce fecba cd acd fedcbga | cfdage daecb febca ebacf
+fcdageb beadf dag dacfbg bacge deabg dfcabe gdbaef degf gd | bafcdg dgafbc bdaef gd
+febcg cefbagd fegdbc bfeac ab gcba bfa fdbega cedfa cgfeab | eagbcf cbgef afb fcgbae
+egfac acbdge fadcbg bgcedfa bdcafe bf ecadb fdeb fecba bfc | fgdcabe dcbfga aegcf fbcadeg
+gcfebd acdgb faedcb gcdfb fd gdfe fcgbe fgacdeb baefcg dbf | cgfdb bgdcf gabcd edcbgf
+aced fbacg adbcf cd fbade cdb decfbg faegdcb gedabf ecdfba | bdfae fdgcbae fdbgec fdecgb
+gdbeac dfcaeb afbgecd dbcgf af fbacg cegbfa fba cagbe geaf | fgbdcae eabcg caebg afeg
+ebfda dgfbe ae fcbgead deafgc fdbac eaf gaeb ecdbgf ebfgad | baedf debgfca efcbdg ea
+dgcfe acbef cgaef fbdgace ecafbd gcebfa ga age gdfeba bgac | adfbce ga cegfa abcg
+abcgd facd fag eacfbg gafdb fa bgfacd dcgeba befgd efgacbd | bdcegfa gbdaf cbgda egabcfd
+bdefcga aecbg cgde agbed ecabfg dgb befda gcadbe gdbcfa dg | acgdeb dgb bfaed adbeg
+cefgb bde adgceb dafgebc aefd debgaf gfedb agfdb de cgdfba | defa edbgf afbdg bgfad
+fa caefg egcab fca gdbcea abef bceagdf dcfge acgfdb afbgec | abfe faebcg acgef geacf
+cbfed egacdb eabfgd gdbac deacgfb aeb eacdb gacfbd ea cage | dbegacf aecdbg cage dcgbae
+efgad agedcbf bcea ba ebdcfg efbcag bgaef gfabcd bga gfbce | fgdae ba fedgbc egfba
+dbcfa bcagd gdbfae cdfg fecab bcfadg dcbgae dfb fd bcadfeg | daegbc befca cbfae dbgcae
+egfa bcgdafe dcfea dcfeba cafgbd gf edgbc gfd egfdc edcgaf | gf dgafce fdg efcbda
+fgecd afgcde gfcadeb dbcg dcfbeg facbe gbf gfbec gdeafb gb | abdgfe cegdf bgf ecgfbad
+gdcbafe gaf agcfe bafc gfdcbe gbfdea cfegb gaedc gfbace fa | bfeacg acgfe bcaf gcade
+egbcf fgcea decbf dgabef gb fabedc fbecdag fgdbec bcdg beg | bgdfaec acgdbfe defbca fcdeb
+bdeafc cabegd acdbe fdba cfb bf edcfagb fecag cbafe bcfgde | bfda fdgaebc dbaec fb
+bc ebdcg agcfebd cadeg ecb fdbaec befgd cbdgfe gabfed bgfc | dagbef bcgdfe bgedaf gdace
+eb ebf gaedfc fagdb cabe fabecg bagef bdgafce cgdefb efcga | beacfgd efgbca efbgca ebfgac
+cagdf gdacef fcdbga cb gcadb bgc fcab dbfcage baged gbdecf | aefcdg cb agdfc bdgfec
+dfbaec abegdf daf edbgcaf bgfd eafgc gafed fd bedag gebdca | ecfgbda beafdgc facebd bdeag
+bfaegd dbecga fcadbg dcfg dabcg gf acbfe fgbca fga aegdfcb | cegbda ecabdgf egcafdb fgcd
+dbgcea agc aegbc fgceda abdfce cbdg begaf adbcefg cbade gc | dfecba gbedac cdfeab abecg
+cfdeab fgbec eadg bga ga dcebagf beadgc gaebc bgfdca bcead | bgaced bdeacg cbgea beacgdf
+bagfce ebcdfg fa cgade cfa bfcgeda ecbdf adfb fecbad efadc | ecdbf cfa bfceag bdfeac
+af egdaf aef eacdg fdgeca cafg cdgfabe baedgc edfbg acbdef | edfga decagb bdecfa dacfge
+dab gfbed bfdage ebdcgf baecg da dfacbeg eagbd beacfd gadf | egbda cbdfae cfadeb egabfd
+bcgfaed bfgade bd gfcda acgedb bacefg caebg cbed abdcg bdg | cebag fcebag dbcaeg gbd
+dgcfb begdf def fbaegd fegab ed cebagf cefdgab cebdfa gade | ebgdacf aefbgd de gfdbae
+ab abdf agbcde aegfb eafgc fgcdeb fbged bea bgafced efdbga | gbafe gbafed gaefdcb gdfbec
+eafbg abgdf eg aceg gabfce fge fcbedg ecfabd bafdceg caebf | cedbfa gbface eg fagbe
+face bfe adgfeb acebg cdbfg fe gacbdfe gcaedb cgebf cgaefb | aefc gdbcf gecab gfcbd
+agfecd fa gbfa fbdce gdfeacb dabfe fbadeg bgdaec begad afd | fda bdefc egadbf fa
+ab bfedcg gfdcb deacg abdfce gcabd adcgfb eabfcdg abc abgf | decga debfac fcbdg gecdbaf
+gfadcb dcgab abfgde fdcega acd adbgf cgdeb ac acfb befdcag | dbagf ca gdcfab gaebcdf
+efcagd dbcef bgda gbf dfaegb cfegab bfged bg agcfbde afegd | bfagce cefdb fgeda aegfcd
+cedafgb cbfeda bcegf gdbe gb fcgbad cedbgf gcaef bgf cefdb | ceagf dbfcge afdcbe ebdfgc
+cgfed acfge bdecaf fdag fecgad fedgbc bacge af efa afegcbd | cgadbef gbdecf fgced fa
+abegf fagcde ceb feabc ecfda cb acdb efcgdab cbgdfe ecadbf | eafcb ceb cadb bdeafc
+fbgae begd abcfegd bfeda efd eagfdb de fgaecb acgdef dacbf | dagfce adefb bdfac dfegab
+fd fed fgad dfecag gaedbfc gecafb bdceg cbdafe efcgd fcega | agfd dgaf gdafce eafcdb
+befagd dfeb bf caebdg ebgda egfcba bgf gcadf gafbd fabgdec | agdefb eagcfb edacbg badfg
+eagcd bdacgf gfeb fdgba be deb cefagdb afcdbe bdgae aegbfd | cfbgad dbage eb bgeadf
+eacbfg debgac dbfcage dc eagbc cda cabdfe dfgea bgdc adegc | becag efbacg caebg cdgae
+fed fcbagd acdebf gaef ef fgdec fecbagd dcegaf cbdeg agcfd | bdeacfg ef cadgf dcbeg
+efc becdag afedc edgaf fc badgcfe fcdbge adfcbe cafb eabdc | dfebca acbed fc efacd
+abfed dc fdcegb cgbfe cagfeb fdecb gbcadfe bgadcf gcde cdf | gecafb fbegdc febcdg cegafb
+feagc daecfbg gdca dg fgd fdgec cebdf eagcfb efcgda fbdeag | defagb aedbfg gfd faegbc
+cagdf ce bcegdf dbafeg cbeadf gbdaefc caeb cfe feadb efadc | ecba dcfae ec ce
+fgabd abgdc dbcae cfadge cag cbge cg ebcadg cgfdeba fcbeda | dgabce dacegf baecd cfabed
+efagc fdcgea geb bfdgec cgba fdcbgae adbfe bg bfcaeg fgeba | afegb daebf ceagdf agbc
+ecgfbad ceg deca gbfed bagfdc cegfba cabdg ec agcdbe bdegc | agbcd ecbdg bcadg dcagb
+aedbg bedca efbdag dgcb bfeac efgadc abegdc bfdegca cd edc | cbdae edcgfba ecd fdagbe
+cfeagbd cfab bgc fbgdae fgdce gfadb bc ecadgb bcdfga gdbcf | cbfa cbadgf bfcdg abcf
+edacg cdfbag fbeagdc cdgaef fc bagfe fac edabgc defc gcefa | dagcfb aegcf fc fegac
+gfdabc dbgaef agbe cegadfb bdgaf gedafc fbced ge gfe befdg | dfcbga adbfge bdfeg cfadge
+bcafge gbcd bc bfgdea cafdb fabdg acfdbg acefdgb acfde bfc | bfdac cbf fdabc edfca
+gdcab cegd ebdcfga egb eg afceb cdgbfa acbge gdebaf bgcdea | agbce fceab dagfbe acebg
+bagc cgf bacfd begfdc afdge bcagdf bcedfa cg becgafd dgfac | bdacf cfedab abcefd cafbd
+ca cag gbfdc cadfbg eafcdg afcb edgab dgcbef cbgad abfdgce | cdbga bacf fgdace dcfgb
+dcebf aefcbd gdcf fcbgde cbgef beacg gfebda gf fcdbgae feg | bfcadge cfbeg fg becgf
+dcabfeg fbc cfgba dfabgc becadg fc dgebcf cfad cbagd gbeaf | ecadbg degabc aecbgd cf
+cba efabd ebdcga cgeafbd cdabf fbce dbfcae bc cgdfa egbafd | abedf facdg ebcf cb
+db efdcag dabf cagfdbe caegb decba bfcdeg fcabed fedca bde | edfacb adefc dbe dbe
+fdabg efca bac ca fdacb becafdg fcdbe bcegad begdfc afbdce | gecdbf faec fadcb dbcaf
+eg egad egfbadc bdecf feg agfcbe decfag dfceg cfgda cfbadg | fcabdg gef eg fecadg
+fgad bgfde afe acebd dgfcbe af beadf ecabgf fbcedga abefgd | cbdegf edfab fegacb fa
+efcgb beacfg gbecfda bfac afg dbfgce bfgdea fagce caedg af | gcebf aedfbg eafcbg fabecgd
+bfdecga gaedfc ecga begcfd cfdab gbfade efa caedf ae defcg | daecf egca afcdeg caefd
+decab efa dagefbc dagbce fcadg abdegf fe eafdc ebcf dcfabe | ebcf fe ebcf fae
+begfd agedfc dabfce eadgf adf eacgfb afecbdg da feacg dcag | abcdfe daf debgf dbfeac
+gbdfca gbefca cba cb ebcfagd gbafd fdacb fdgeab bcdg cadef | afbdc efdgabc dbagf gfdab
+efdagb dae fcabedg caedb fdaecb ad ebdfc cdgfeb dfca eacbg | bedfgc fecdb edgfba cedfab
+cd afdc cdg cbdgaf eagbd gacfb befdcga bdacg cbeafg ecfbgd | bdgacf dcfbeg dacgbf dagcb
+begdaf gedbcfa dafc fea dfgce dgacfe gbedfc cfeag cbgea af | gecba agfbedc cbage egfdc
+dc fgcd baefcg afbgecd bgeda ced baedfc cdeag gdafec efgca | bacfge bgdae abegfc afgbced
+fc afcbgd bcf afebcgd bgdcf acdf bdfeg ecbagf cbdega adcgb | ceagbf befdcga edfagcb acdf
+dbcgf degc bfgad bcfed gcb fceabdg gbfcde gc fbdaec afgebc | fecbdag fadgecb afbdg dgecfb
+abcfg cfb eafgb bc cgbfda adfcge afdcg cfbgde cadb efgbcda | acgfb cb dfcag gdecfb
+cdefb cfga edcgbfa cab abfge acfbe ca bcgaed bcaefg bdegaf | dbfce gdfcaeb fedabg fbcea
+fgcae gafd eacdfgb baceg cadebf cfbged daefcg fge fg fceda | gceadbf dcbfage cafed ebacdf
+fabdceg abcgde acebdf cfaeb fa egfcb dbfa fac abecd agefcd | cfeab edcbag acf dcabefg
+dgbecfa abdfe acegd fdgabc gadef gfce ecbagd edagcf fg dfg | gdf fcegbda agcde fgd
+dagf bcdaef ad acd cbeag febagdc dgbfac dgcab fcdbge bdgcf | fdbeac gcbda bcfdg bfcgd
+fgdc gc gefdcab bdgec dbcefa gce bfgdec gcefab degab cebfd | bdfce gbecfd gadbe ebcadgf
+fagc bdcfag fdacb agbedf daf aedgbc dbcga ebdgcfa cbdfe fa | febdc cfag af cadbg
+bcd bfec dagbcf egcbfd bc edfgc bdecg edabg dcgeabf gdefca | bedag dbc fgcdbe ebdfcg
+gedafcb dbagcf bcadeg fc gfc cebf edgfc cgdbe bcfdge egdfa | fc dabgec bdcge ebfc
+gafbd ef becga ebgcaf agbef gfe gebcda gbfdce afce dbcgefa | ef gfe cabfeg gabecf
+deab fbedgc eb bdacg dagcfbe abecg cfdagb beg baedcg gacfe | gacdb dbfgace dbea cadbg
+badceg ced fecba fbdc adfec ebfcgad gecafb faedcb gfeda cd | fcead fbcaged adebgc ceabgd
+bd bdcg fgcab abd cfaebd baecgf fecbgad agdfb efdga gfdacb | afebcd bfadg egbfca cgbfea
+da decbf afdec begcad dcgefb gcafe edbfca dca fdab begdfca | efadc abdf ebcdfa fegac
+gcbeaf geadbc fdbeagc bfdec cdbae ea agfdcb dabcg eac adeg | gcdba cebdf abecd gedcab
+bcdae abedg ebg bfadec eg dbgaf egafcb gcadeb egdc abedfcg | dagfb ebg gebcaf eg
+afb abgfed caegfd cfbd becag dcbgfea bf decaf faecb bedfac | daegfb dbaefc gacedf bfa
+bgecf becfad ea adebgc cfdbgea dabcg eca eagd acbeg adfcgb | agdbc bagcd bgcda aedg
+bf fagcde cfdb acfgd gfdaeb acdfegb gfacb bfg bgeca bcgafd | gfb gfacd agfdeb abcge
+aegfd efcd bedfagc bacdgf gecadf aed egbdac fcagd ed afbeg | daefg dagfc acdbfg gbacfd
+decga efbcd badcgf cfgdbe agefcbd fa ebcdaf fcdea eafb fda | dcfea fad ebadgfc afedcb
+bf gebfcd bagfed bdagcfe cegbd fgbdc gfb ecgbad gdafc befc | fadbeg bcgde gbf bfg
+df cbfged fgbca fbd bcafge bdeac agbfecd adcbf gdaf dabgfc | bcdea cafbd afdg gacfb
+ecdbfa fadgce aceb fgebd bfcgad cdfae afgbced dfebc cfb cb | cfead fcb bc bedcf
+fdbega cfegd cdbgae cdfebga fecadb aeg cbag ag adceb dcage | ebcagd gcead egdfc dagecb
+cdbfeag gfdeba edfgca cead geadf gac fcbdg afgcd cabegf ca | fecgad gefda dafcg fdgca
+cfgbae cgefb egdbfc dcg dfcbg ecbgfda badcf gfed edcgba gd | gd cbefdg adbceg badcf
+bf bgf debfg bgade egbfcd cebdafg agdfce fgced dcbfag fcbe | adcgfe fdgeac fb ebfc
+gefdc fdagcb gfdac bdafce caf ac daegcbf febgda cbga dbafg | dagbf ac faedcgb dfagb
+ecfgadb dbgacf abfegc gd cefad fcgde cefdgb fcbge gdeb dgf | efacd bcegdaf bdgacf gd
+cdfgb bdf fdcag bd cdba gbecf dfecga cfgebda gdefab dcbagf | begfc bcgfd gfbce afbgcd
+fbe facb decgaf afdce fb bcdeaf bagdfe ecdbg dfbce bgedcfa | abdgfe eafdc efdbca acfgde
+bgdcf cbaegd eabfdcg ceg eg aedcb deabfc dgea gfcaeb gecdb | eacgdb ge daebcf eg
+egbdcaf gd cefabg dfge bcfagd afdegc caedg baecd gad caefg | gcedaf efgabc dag deagc
+cdabf bgcfde afedgc fcb gcba gfacd bdaef bdegfac cb bdfagc | bcf bcedfg gaecdf cdgeabf
+gf dcbfeg fcgdbea fge gedacb aefbg bgead gfad dfegba aebfc | aedgfb gf egf dfag
+gbeacfd gacbd dcgfbe fg fgd dbacge bdagcf dfcea gafb fgadc | deagcb gf degfbc edcgbaf
+ce gdbcae debcf cfdabe eacfbdg acef fgdbc begadf ecd afdbe | dbefa abegdc cbdfg acfbed
+begdfc gbdc gedaf dc edgfc cdf fgbec ecdafb ebgafc degcbfa | egdfa edgbfca cbefg fagcbe
+efcab dgbfc ag agdc cfagbde fbgeda fag acgdfb fcbga gbefcd | gacd gdac dcag gdac
+bdage bdaefg gbe eb edfb bgafec dgbecaf egadf fdaecg dbacg | geb afgdbe dfbegac efgcba
+ecgfa bec be ebfgc dgbcea adefgc egafbc egbafcd bafe gbfdc | aefb bce befa gfecab
+ebgdc cbe ecdgab gacb gfced dbgea edbcfa fagcdeb gabfde bc | dgfec aebdgf abcdfeg fbaedc
+daegbf adef dgcabe cafdgbe adcgfb dbegf ebgcf dbf ebadg fd | fcbge bgcef acfgdb efbgd
+cdbge cfe adbcef fedgcb gfebcda cedgf edagf gdbcae cf gcfb | cdbeg gcdfe fabgdce aecbfd
+beacg dafge gbeadc fcba bgdeafc begfa bf eabcfg ebgcdf bfg | gaefb bcfged degcab egdaf
+acgefbd feb bf cdaef beadf gbaed abgced gabdef abfg gbfedc | begfda efcda bfe dgacbe
+eacfgd fbdgce abfcge bcfea cafeg cagdbfe ebf debca bf fgba | fb fb acdbe cfdage
+bfec cedagf aef ef degba bagcef dgcfab fgeab fecdgba bacfg | cbgaef efacgd aegfb aef
+dbacfe edfc ec caebd agfebc cbe cbdag gfcbead bgfead bafde | deabc dfagbe cgbfea ec
+ed dfgbec dfabg fbaec feacbg edafb aedc eadfcgb ebdacf dbe | deac bgeafc cebfdg fcdegb
diff --git a/2021/day08/day08_input_ez.txt b/2021/day08/day08_input_ez.txt
new file mode 100644
index 0000000..c9f629b
--- /dev/null
+++ b/2021/day08/day08_input_ez.txt
@@ -0,0 +1,10 @@
+be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe
+edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc
+fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg
+fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb
+aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea
+fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb
+dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe
+bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef
+egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb
+gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce
diff --git a/2021/day08/makefile b/2021/day08/makefile
new file mode 100644
index 0000000..5c81ee3
--- /dev/null
+++ b/2021/day08/makefile
@@ -0,0 +1,2 @@
+all day08.cpp:
+ g++ -std=c++20 -o day08 day08.cpp
diff --git a/2021/utils.h b/2021/utils.h
new file mode 100644
index 0000000..b96f570
--- /dev/null
+++ b/2021/utils.h
@@ -0,0 +1,26 @@
+#ifndef UTILS_H
+#define UTILS_H
+
+void split (std::vector<std::string> &vec, std::string str, std::string del) {
+ auto token = str.find(del);
+ if (token != std::string::npos) {
+ vec.push_back(str.substr(0, token));
+ split(vec, str.substr(token+del.size()), del);
+ } else { vec.push_back(str); }
+}
+
+// trim
+static inline void ltrim(std::string &s) {
+ s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) {
+ return !std::isspace(ch);
+ }));
+}
+static inline void rtrim(std::string &s) {
+ s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) {
+ return !std::isspace(ch);
+ }).base(), s.end());
+}
+static inline void trim(std::string &s) { ltrim(s); rtrim(s); }
+
+
+#endif