commit 284827dec47bbd4debe8a9c0a1d0c8ccb949189e
parent 37888633a8820f4e3166ac5e4b51156a239f3115
Author: Sebastiano Tronto <sebastiano@tronto.net>
Date: Thu, 26 Jun 2025 09:47:23 +0200
Added 2022, first few problems
Diffstat:
48 files changed, 10384 insertions(+), 0 deletions(-)
diff --git a/2022/01/a.rs b/2022/01/a.rs
@@ -0,0 +1,8 @@
+mod common;
+use common::*;
+
+fn main() {
+ let e = get_elves_from_stdin();
+ let m: i64 = e.iter().map(|a| a.iter().sum()).max().unwrap();
+ println!("{m}");
+}
diff --git a/2022/01/b.rs b/2022/01/b.rs
@@ -0,0 +1,9 @@
+mod common;
+use common::*;
+
+fn main() {
+ let e = get_elves_from_stdin();
+ let mut w = e.iter().map(|a| a.iter().sum()).collect::<Vec<i64>>();
+ w.sort_by(|a, b| b.cmp(a));
+ println!("{}", w[0] + w[1] + w[2]);
+}
diff --git a/2022/01/common.rs b/2022/01/common.rs
@@ -0,0 +1,18 @@
+pub fn get_elves_from_stdin() -> Vec<Vec<i64>> {
+ let mut e = Vec::<Vec::<i64>>::new();
+ e.push(Vec::<i64>::new());
+ let mut line = String::new();
+ loop {
+ match std::io::stdin().read_line(&mut line).unwrap() {
+ 0 => break,
+ 1 => e.push(Vec::<i64>::new()),
+ _ => {
+ let n = line.trim().parse::<i64>().unwrap();
+ let last = e.len() - 1;
+ e[last].push(n);
+ }
+ }
+ line.clear();
+ }
+ e
+}
diff --git a/2022/01/input b/2022/01/input
@@ -0,0 +1,2249 @@
+4887
+9307
+8895
+8136
+6292
+10177
+4077
+8228
+
+5533
+7981
+5396
+4909
+5657
+7587
+9651
+1583
+8058
+
+5201
+4782
+5956
+5327
+2029
+3455
+6148
+5468
+2177
+5352
+5373
+5442
+4888
+
+36630
+9196
+
+28629
+
+9252
+1098
+9842
+7347
+3616
+5157
+8546
+
+8031
+7718
+6690
+7819
+10921
+12059
+10334
+
+3455
+1687
+3740
+2666
+6672
+3264
+4330
+4673
+5550
+1754
+4161
+2764
+6355
+
+2711
+3232
+1429
+2381
+5990
+4482
+3091
+2745
+1886
+5648
+4776
+2696
+2846
+4177
+5781
+
+6379
+12826
+3706
+12650
+5875
+11396
+
+10381
+2204
+5950
+11465
+11501
+13306
+
+4006
+6635
+5139
+5290
+4562
+5558
+2788
+1242
+5308
+6704
+6858
+3751
+
+3574
+5601
+4492
+4795
+2135
+3295
+6150
+4786
+6761
+5098
+6646
+5839
+1989
+
+14468
+13500
+11544
+2195
+6282
+
+1400
+3519
+6010
+4063
+4077
+1583
+2044
+5089
+3588
+6061
+1634
+1358
+2241
+2351
+6075
+
+2658
+5979
+4727
+4991
+2198
+4491
+2206
+2601
+3637
+1955
+1618
+5849
+4662
+2457
+2479
+
+7450
+2813
+1678
+5678
+6688
+3338
+3708
+4898
+4542
+4800
+3127
+3338
+
+2747
+6148
+6301
+6097
+6988
+2280
+4093
+8031
+4865
+7293
+1528
+
+7851
+3366
+10761
+12012
+
+7487
+1457
+3109
+7722
+6730
+1528
+8678
+5243
+3434
+7351
+
+7661
+2803
+7796
+7485
+6268
+7251
+7346
+8521
+5165
+8506
+
+6788
+10715
+3520
+6591
+5738
+7419
+
+37041
+22858
+
+18343
+19902
+15427
+
+13379
+7285
+11836
+9418
+9597
+
+2796
+3345
+2704
+5395
+5386
+2687
+4133
+1749
+5117
+3822
+4244
+6093
+3108
+2015
+1322
+
+3640
+6611
+5160
+6176
+4105
+3796
+4651
+6634
+3804
+3308
+3206
+6686
+3122
+
+15465
+12326
+11646
+3744
+2857
+
+2724
+3037
+3333
+6247
+9610
+7087
+2883
+6291
+6549
+
+2860
+4870
+8726
+4865
+7283
+6364
+4892
+8653
+1937
+1356
+
+6900
+4695
+4167
+6336
+1515
+3047
+6735
+4487
+1255
+3833
+3786
+1489
+5117
+
+8133
+11386
+1756
+2859
+7861
+4284
+9113
+
+2766
+8069
+1212
+2325
+6421
+7231
+6566
+1833
+2677
+3622
+6814
+
+7498
+5282
+7407
+3241
+5596
+3862
+7268
+
+12142
+3155
+7969
+6330
+10030
+
+2534
+2657
+3129
+1604
+5325
+6252
+1007
+4982
+4123
+6270
+2391
+
+9554
+15638
+14218
+15314
+
+17850
+
+4336
+7216
+8068
+2602
+7176
+5411
+1504
+7965
+5582
+
+1910
+10293
+9366
+1653
+7607
+1238
+6089
+9832
+
+8438
+18781
+8544
+14156
+
+3472
+8118
+2455
+1789
+7535
+6667
+2003
+1025
+7340
+
+2807
+9390
+13476
+10938
+2272
+5114
+
+3311
+13209
+
+10615
+15963
+6233
+9368
+13767
+
+11712
+3170
+13964
+
+3689
+9486
+9551
+3456
+4882
+11211
+1600
+
+6760
+5563
+3589
+8736
+7398
+4388
+
+9518
+4642
+3473
+11134
+1020
+3983
+1012
+
+3776
+1573
+6476
+6958
+2257
+2912
+2577
+3201
+5425
+2764
+6006
+4068
+3984
+
+3516
+
+12606
+33693
+
+22285
+30183
+
+6732
+2689
+7685
+5674
+1023
+2447
+5675
+6507
+7257
+4059
+2773
+
+14742
+13724
+5856
+
+19020
+15808
+15831
+
+6871
+5101
+5123
+7918
+1663
+4364
+5111
+6205
+6680
+
+5241
+1029
+5194
+2693
+7420
+4095
+3765
+3433
+1752
+1822
+
+4311
+10029
+9151
+9518
+2511
+2363
+6980
+
+6760
+4212
+21929
+
+5789
+2855
+7378
+1525
+3127
+6001
+8351
+8353
+4445
+2987
+
+5246
+2746
+1650
+5781
+5816
+1068
+4261
+4453
+6656
+1395
+2589
+4375
+4263
+
+2133
+10539
+2325
+2094
+9071
+4830
+5758
+2060
+
+2173
+6292
+5585
+2040
+3758
+2941
+4877
+3816
+6376
+1493
+4425
+3327
+3551
+
+2469
+3948
+6275
+3614
+2736
+6400
+5997
+6010
+4231
+4716
+5492
+2055
+1836
+
+7704
+6489
+3032
+8583
+7929
+8709
+7837
+5110
+3939
+4258
+
+3360
+6562
+19776
+
+12387
+9654
+1246
+12376
+12271
+6105
+
+2945
+14862
+15087
+15649
+2445
+
+3191
+4141
+4266
+3335
+2222
+3679
+5209
+5109
+6873
+6313
+2765
+2442
+2133
+
+10886
+3410
+16022
+19192
+
+14993
+2080
+9131
+19401
+
+1222
+4856
+5484
+4898
+3546
+3996
+1054
+6444
+2077
+1460
+4349
+2253
+5826
+6257
+
+7221
+11757
+1038
+4768
+12836
+13339
+
+4975
+17027
+
+2688
+1733
+3844
+6205
+3089
+1343
+7323
+2613
+1223
+4277
+5551
+3968
+
+3475
+4760
+6351
+7360
+2946
+1337
+3434
+2485
+6407
+3266
+3517
+2125
+
+21512
+23024
+
+27755
+1947
+
+6307
+1957
+6982
+1516
+1671
+1054
+4311
+4235
+6952
+8129
+
+6734
+11365
+9035
+9922
+7310
+4799
+5883
+
+59886
+
+1919
+10200
+5393
+6601
+4924
+10451
+10218
+3175
+
+2360
+4470
+1823
+3699
+4974
+3365
+2002
+5251
+1188
+3192
+2328
+2461
+1931
+1506
+2544
+
+6131
+4712
+4994
+5450
+3023
+2002
+6108
+1591
+1011
+1689
+3003
+3970
+3613
+
+7374
+2176
+5878
+4112
+1213
+5819
+3944
+3250
+5839
+1207
+4641
+
+4375
+2510
+1107
+1717
+4333
+5631
+2499
+4002
+3822
+3618
+5259
+7133
+
+6307
+6702
+1754
+4893
+4003
+5101
+3275
+3579
+2235
+6823
+
+7388
+6708
+2218
+2220
+5287
+8692
+8143
+5692
+4287
+7770
+
+5881
+1741
+7408
+2466
+14095
+
+9268
+2524
+2958
+15427
+14742
+
+3955
+7993
+6342
+2637
+5825
+3660
+5537
+1832
+
+1022
+3769
+2113
+5734
+4382
+5338
+4904
+3631
+1073
+4992
+4134
+1773
+2645
+4100
+3882
+
+31354
+
+22767
+13308
+3424
+
+18428
+9719
+
+13154
+13267
+1035
+10201
+3948
+
+3104
+2047
+2790
+6051
+3733
+4667
+3701
+2668
+2197
+3221
+3145
+1999
+3303
+
+1703
+1792
+4827
+5038
+1712
+2516
+4798
+1464
+3073
+4214
+4870
+5705
+4507
+5712
+
+2151
+4888
+2967
+1081
+1474
+2949
+1942
+4762
+1432
+5156
+2345
+5225
+3496
+6123
+
+2205
+2399
+5266
+8514
+8150
+7435
+4416
+5244
+2903
+7406
+
+4278
+3403
+6713
+8407
+3593
+7880
+8196
+7305
+1762
+
+4341
+19333
+3617
+
+7586
+
+16168
+1909
+8778
+4452
+4148
+
+3790
+3233
+2400
+6936
+1376
+4576
+6698
+1305
+4930
+5510
+2721
+1772
+2293
+
+5791
+2163
+1948
+3948
+8564
+6399
+8272
+9733
+
+5423
+6215
+1459
+6879
+4283
+4006
+5135
+5086
+3024
+2603
+3646
+3998
+2984
+
+4991
+8870
+9477
+6827
+4847
+8241
+6970
+6532
+
+3660
+36765
+
+2699
+7895
+2763
+2460
+2477
+4390
+1370
+5744
+7657
+
+3183
+2115
+2175
+2887
+2336
+8459
+8135
+1868
+1095
+6213
+
+5677
+2990
+5916
+6344
+5605
+2072
+2173
+3704
+2888
+1999
+7661
+
+24731
+13470
+5599
+
+8873
+6995
+5302
+12016
+8988
+4674
+10185
+
+5528
+19366
+18649
+9187
+
+7428
+3617
+5583
+6033
+8532
+3632
+2565
+
+6725
+1708
+1735
+1662
+4790
+3215
+4378
+2562
+3136
+2268
+3323
+6101
+3908
+
+67860
+
+3912
+2698
+2610
+1883
+7163
+7834
+8215
+4361
+4631
+6559
+
+61469
+
+1752
+3571
+5372
+1210
+2232
+4724
+2075
+4374
+6962
+1331
+3080
+
+4392
+3755
+8553
+10430
+2077
+6502
+9329
+8373
+
+4642
+6832
+6307
+5022
+4373
+5532
+4745
+1098
+6005
+4653
+4683
+6255
+6875
+
+7024
+1051
+5664
+1399
+7333
+4725
+3375
+3832
+7361
+6068
+1187
+1447
+
+19585
+7175
+19834
+13102
+
+6423
+10860
+6839
+
+6385
+7387
+13727
+13764
+13174
+
+3453
+1935
+6047
+2440
+6454
+2789
+5995
+5238
+2206
+5418
+2905
+5424
+6725
+
+20427
+11408
+21179
+
+1648
+6294
+5757
+6484
+6851
+6987
+4177
+4898
+6845
+7343
+1573
+
+23105
+
+4696
+5155
+3429
+2107
+6849
+1619
+2146
+2232
+1080
+8086
+7818
+
+4525
+3467
+1486
+8013
+7366
+3654
+5303
+7754
+6469
+1468
+3874
+
+8007
+5589
+6424
+9322
+10417
+1508
+5900
+
+3644
+2169
+8705
+1837
+3247
+8079
+7704
+2387
+2802
+4142
+
+5554
+4692
+1368
+2623
+4146
+3634
+3354
+5121
+2171
+3418
+7129
+1334
+
+18870
+23687
+
+13467
+5594
+13229
+2978
+7542
+
+2239
+7363
+3465
+7284
+2900
+7929
+5295
+4752
+2225
+
+4445
+15568
+
+3892
+2012
+2469
+1666
+1613
+3789
+5048
+1514
+2444
+3556
+3011
+5467
+5248
+4722
+2803
+
+4793
+3118
+1831
+2977
+3936
+1036
+4325
+4205
+5869
+4957
+5223
+4290
+4719
+2397
+4679
+
+4298
+5696
+5284
+1761
+6972
+1749
+1766
+3024
+2173
+6806
+6209
+
+4805
+2409
+5913
+1863
+6111
+3958
+1514
+1970
+6399
+1839
+5697
+3174
+6203
+
+12825
+8917
+10603
+6987
+8314
+
+16810
+10340
+21902
+
+1836
+3878
+1856
+2099
+6527
+4670
+2388
+1364
+2119
+5725
+2976
+
+2368
+15063
+12997
+6731
+3508
+
+3583
+4242
+5197
+2541
+3058
+5540
+4464
+4867
+3424
+6194
+2071
+1310
+5976
+5290
+
+4262
+5256
+1625
+3579
+2688
+2816
+5619
+5282
+2163
+1264
+1820
+2748
+1064
+3239
+3082
+
+8888
+17024
+18873
+12576
+
+5571
+2530
+4707
+6564
+2637
+6947
+4981
+1116
+3747
+1187
+3968
+6569
+6926
+
+5158
+4884
+2078
+1283
+6676
+4477
+7153
+3696
+1282
+3218
+6716
+2714
+
+68708
+
+12439
+12815
+12165
+6292
+8568
+7503
+
+18845
+9399
+
+3205
+33907
+
+2754
+2530
+2082
+2114
+5490
+2469
+5103
+5656
+1633
+5631
+1633
+5003
+5194
+3584
+2830
+
+4197
+11261
+3154
+5946
+7624
+4258
+
+1338
+
+4227
+8355
+5986
+8348
+4869
+6318
+6432
+7363
+6661
+
+9115
+3231
+
+9797
+4164
+16220
+
+4412
+2616
+1705
+3033
+5695
+4241
+4252
+2810
+4176
+2554
+6251
+1751
+5832
+5548
+
+3098
+4538
+5763
+4913
+3322
+5956
+1910
+4210
+3629
+5531
+1243
+5258
+4642
+5572
+3838
+
+10520
+2932
+18639
+7802
+
+15433
+3635
+
+4777
+5260
+1283
+7917
+5860
+1376
+8001
+1209
+6245
+5939
+4721
+
+6893
+4349
+1011
+1314
+5878
+3129
+1410
+4377
+2089
+3518
+3560
+1205
+6452
+
+16914
+17575
+8660
+17142
+
+15028
+10221
+16158
+
+11777
+10449
+13633
+19094
+
+10289
+9390
+3685
+3979
+12643
+
+15858
+24129
+9740
+
+2707
+1840
+3010
+1744
+1509
+5039
+4158
+2900
+4999
+3619
+5309
+4386
+2105
+2919
+2327
+
+2358
+1502
+6302
+1270
+3358
+2033
+5857
+1125
+6738
+5707
+3960
+6751
+2829
+
+2690
+2401
+4685
+1891
+4701
+4503
+5740
+6441
+1119
+4211
+2072
+1476
+1779
+1943
+
+1490
+12834
+3680
+13513
+1055
+9731
+
+5322
+13458
+2941
+1758
+11817
+4550
+
+3688
+4536
+5079
+4031
+5642
+5920
+5061
+4114
+3118
+3316
+1980
+5607
+2845
+
+4372
+7991
+11604
+6661
+12052
+1241
+
+4013
+4554
+5176
+4386
+6064
+1319
+4562
+1902
+4010
+3954
+1265
+4361
+2068
+3759
+4652
+
+11866
+
+4305
+1270
+2941
+6582
+3164
+3522
+4611
+4191
+3659
+7416
+4855
+
+5179
+8236
+3392
+11505
+8487
+4344
+
+7032
+27996
+
+5322
+4909
+4858
+1281
+5937
+1289
+4176
+5993
+2841
+2188
+4192
+3398
+1800
+2678
+
+5789
+13043
+4951
+
+4119
+10014
+8815
+6749
+4545
+7692
+8436
+6740
+
+10382
+8802
+7279
+4950
+1653
+3537
+10285
+7896
+
+9975
+
+3544
+5188
+5111
+2576
+7568
+7371
+6930
+4818
+7435
+6810
+2847
+
+52788
+
+2951
+8272
+6521
+5428
+6863
+3722
+6443
+1114
+7114
+2776
+
+4386
+1913
+7477
+2665
+7932
+4653
+5426
+4484
+1108
+
+3541
+3719
+3868
+1077
+4637
+2936
+3503
+5201
+5315
+5940
+2278
+6496
+1172
+4755
+
+6439
+5144
+6491
+1234
+1459
+1968
+5797
+4909
+5923
+6534
+5268
+2147
+5632
+
+2993
+3284
+4366
+5384
+4598
+1051
+3969
+2961
+7025
+2727
+4233
+3326
+
+9727
+15517
+19290
+
+17096
+1375
+14129
+10456
+
+4103
+6099
+2887
+2589
+2957
+6664
+6948
+5126
+2427
+3269
+2868
+6296
+4641
+
+1935
+5903
+3249
+1842
+4289
+5319
+2667
+4309
+2668
+3080
+3400
+3762
+2166
+2408
+
+7866
+7422
+14288
+15942
+6371
+
+1693
+2509
+6586
+4294
+7542
+1271
+8072
+4193
+8047
+
+1925
+1564
+6018
+6894
+3300
+4040
+4154
+1720
+5159
+5001
+1605
+6080
+2792
+
+16335
+11723
+7586
+12891
+13423
+
+12011
+11646
+5317
+2769
+9679
+
+6924
+1571
+3645
+4124
+5594
+7185
+7705
+2532
+7397
+5459
+1037
+
+3948
+4286
+6395
+2645
+1835
+4764
+2649
+3403
+2704
+4039
+4581
+5278
+4128
+6174
+
+5567
+8309
+4782
+5394
+4052
+5453
+7241
+
+8673
+2968
+6481
+3887
+8279
+7800
+2025
+4775
+4627
+
+6856
+1361
+6648
+7563
+4239
+10679
+8050
+8027
+
+4905
+11553
+2902
+12065
+5974
+9578
+9837
+
+6128
+6201
+2999
+6195
+1121
+2830
+4668
+5007
+1825
+2830
+5287
+5471
+5759
+1805
+
+6515
+17925
+23344
+
+4610
+2265
+7019
+2395
+3396
+5131
+7067
+5803
+1994
+6492
+3618
+
+7951
+1762
+7521
+4837
+1589
+6260
+5765
+7442
+6185
+2695
+5675
+
+4104
+6509
+5143
+2862
+5655
+2104
+5772
+6257
+2689
+3244
+3501
+2054
+
+3967
+1326
+5906
+2740
+3487
+6586
+2908
+
+43279
+
+4935
+6761
+6021
+4857
+3040
+1491
+3820
+2741
+7058
+3114
+5775
+
+6458
+8250
+3691
+7478
+4003
+6917
+8033
+1181
+6882
+6533
+
+12020
+5725
+24247
+
+6550
+1033
+1841
+5367
+1621
+6554
+5355
+7437
+8079
+5876
+
+9079
+12200
+16431
+8582
+15548
+
+7910
+16510
+25149
+
+2569
+3570
+6639
+1706
+7204
+4964
+3314
+1862
+4344
+3529
+7688
+
+9213
+15614
+12172
+15703
+6499
+
+4927
+2418
+4565
+2409
+5355
+1464
+4788
+2040
+
+1499
+5180
+2638
+5857
+2693
+5068
+3382
+1202
+5745
+3817
+1174
+3182
+3011
+5823
+4302
+
+1992
+1060
+1356
+5702
+2700
+2129
+4364
+5380
+2317
+2392
+1269
+6268
+3462
+5392
+
+4601
+1395
+8724
+2017
+11000
+2414
+9399
+
+5998
+4595
+1327
+9386
+6206
+2712
+9617
+5234
+7096
+
+5436
+6415
+4210
+1032
+1825
+4408
+4903
+3803
+1197
+2849
+4106
+5611
+4553
+
+3572
+6127
+6035
+6950
+4353
+1660
+2135
+2866
+1322
+4847
+
+2181
+4407
+2006
+5437
+
+3560
+4717
+5998
+6944
+2180
+6922
+8628
+2761
+3524
+2473
+
+6215
+2369
+5907
+6959
+7105
+4982
+5255
+2650
+1834
+7016
+3072
+
+1564
+6445
+6037
+6545
+4622
+6301
+1712
+2949
+3608
+3965
+2602
+5065
+6050
+
+12326
+10342
+12805
+11947
+2641
+10687
+
+15426
+
+19377
+13829
+6477
+11837
+
+7159
+7868
+6373
+10135
+10731
+6850
+5819
+
+6938
+25628
+22954
+
+5570
+5782
+8571
+7353
+2189
+6056
+2774
+7061
+6279
+1923
+
+1200
+5306
+6067
+2575
+4613
+1321
+1525
+1545
+1059
+5337
+1920
+1367
+
+9230
+8121
+5933
+11082
+5561
+
+6447
+3340
+6950
+2194
+3685
+5311
+3610
+4332
+6755
+4780
+1164
+4978
+2476
+
+3111
+6078
+2022
+7748
+5569
+2895
+4911
+7478
+4002
+
+2414
+3673
+3897
+11893
+4984
+3471
+
+6240
+6211
+5245
+15319
+6704
diff --git a/2022/01/test b/2022/01/test
@@ -0,0 +1,14 @@
+1000
+2000
+3000
+
+4000
+
+5000
+6000
+
+7000
+8000
+9000
+
+10000
diff --git a/2022/02/a.rs b/2022/02/a.rs
@@ -0,0 +1,13 @@
+mod common;
+use common::*;
+
+pub fn main() {
+ let play_score = |s: &[u8]| (s[2] as i64) - ('X' as i64) + 1;
+ let win_score = |s: &[u8]| {
+ let other = s[0] as i64 - ('A' as i64);
+ let me = s[2] as i64 - ('X' as i64);
+ 3 * ((me - other + 4) % 3)
+ };
+ let score = get_score(play_score, win_score);
+ println!("{score}");
+}
diff --git a/2022/02/b.rs b/2022/02/b.rs
@@ -0,0 +1,13 @@
+mod common;
+use common::*;
+
+pub fn main() {
+ let play_score = |s: &[u8]| {
+ let other = s[0] as i64 - ('A' as i64);
+ let w = s[2] as i64 - ('X' as i64);
+ (other + w + 2) % 3 + 1
+ };
+ let win_score = |s: &[u8]| 3 * ((s[2] as i64) - ('X' as i64));
+ let score = get_score(play_score, win_score);
+ println!("{score}");
+}
diff --git a/2022/02/common.rs b/2022/02/common.rs
@@ -0,0 +1,10 @@
+pub fn get_score(play_score: fn(&[u8]) -> i64, win_score: fn(&[u8]) -> i64) -> i64 {
+ let mut score = 0;
+ let mut line = String::new();
+ while std::io::stdin().read_line(&mut line).unwrap() > 0 {
+ let l = line.as_bytes();
+ score += play_score(l) + win_score(l);
+ line.clear();
+ }
+ score
+}
diff --git a/2022/02/input b/2022/02/input
@@ -0,0 +1,2500 @@
+C Y
+C Y
+C Y
+B Z
+C Y
+C Z
+C Y
+C Y
+C Z
+B Y
+C Y
+C Y
+C Y
+C Y
+C Y
+B Z
+A X
+C Y
+B Y
+A X
+C Z
+C Y
+C Y
+C Y
+B Z
+B X
+C Y
+A X
+A X
+A X
+C X
+A X
+C X
+B X
+C Y
+C Y
+A X
+A Y
+C Y
+C Y
+C Y
+C Y
+B X
+A X
+B Y
+C Y
+C Y
+C Z
+A Y
+B X
+B Z
+C Z
+C Z
+A X
+A X
+B X
+C Z
+C X
+A Y
+C X
+C Y
+A X
+A X
+A X
+C Y
+C Z
+C X
+C Y
+A X
+C Y
+C Z
+C Y
+B Z
+C Y
+A X
+C Z
+C Y
+C Y
+C Y
+A X
+A X
+A X
+B X
+A Z
+A X
+C Y
+A Y
+C Y
+B X
+B Z
+B Z
+B Z
+B X
+C X
+A X
+A X
+A X
+C Z
+A Y
+C X
+C Y
+B X
+C Y
+C Y
+A X
+C Y
+C Y
+C Y
+A X
+C Y
+A X
+C Y
+A X
+C Y
+B X
+C Z
+C Y
+A X
+C Z
+B Z
+A Z
+B Z
+C Y
+B X
+A X
+C Y
+B X
+A X
+A X
+A Y
+B Z
+C Y
+A X
+C Y
+C Y
+A X
+C Y
+C Y
+A X
+C Y
+A X
+C X
+B Y
+C Z
+B Z
+C Y
+C Y
+A X
+B X
+A X
+C Y
+C Y
+A X
+B X
+C Y
+B X
+C Z
+B Z
+C Y
+C Y
+C X
+A X
+C Y
+A X
+C Y
+C Y
+C Y
+C Z
+A X
+C Y
+A X
+A X
+B X
+C Y
+C Y
+A X
+B X
+A X
+A X
+A X
+B Z
+C Y
+C Y
+C Y
+A X
+A X
+A Y
+A X
+B X
+B Z
+B Z
+C Y
+B Z
+A X
+B Z
+C Y
+C Y
+C Y
+C Y
+C Y
+A X
+A X
+A Z
+B Y
+C Y
+C Y
+C Y
+A X
+B X
+A X
+A X
+C X
+C Y
+B Z
+C Y
+C Y
+B X
+A X
+A X
+B Z
+C Y
+B Z
+C Y
+C Y
+C Y
+A X
+C Y
+C Y
+A X
+C Z
+B X
+B Z
+C Y
+C X
+C Y
+A X
+C Z
+B Z
+A X
+B X
+C X
+A X
+C Y
+C Y
+B Z
+A Z
+B X
+B X
+A X
+A X
+A X
+C Y
+C Y
+C Z
+A X
+C X
+C Y
+C Y
+A X
+B X
+A Z
+B X
+B X
+C Y
+B X
+B Y
+B Z
+A X
+B X
+B Y
+C X
+A Y
+A Y
+C Y
+A X
+C Y
+B X
+C Z
+C X
+A Z
+C Z
+C Y
+C Y
+B X
+B X
+C Y
+A X
+C Z
+C X
+C Z
+B X
+A X
+A X
+A X
+B Z
+B X
+B Z
+C Y
+C Y
+C Y
+B X
+C Z
+C Y
+A X
+C Y
+C Y
+A X
+A X
+C Y
+C Y
+C Y
+C Y
+C Y
+C Y
+A X
+C Y
+C Y
+C Y
+C Y
+C Z
+C Y
+A X
+A X
+C Y
+A Y
+B Z
+C X
+C Y
+B X
+A Y
+C Y
+C Y
+C Y
+A Y
+B X
+A X
+B Y
+C Y
+C Y
+C Z
+B Z
+C Y
+A X
+A Y
+C Y
+C Y
+C Y
+C Y
+A Y
+B Z
+A X
+C Y
+C X
+C Y
+C Y
+C Y
+C Z
+C Y
+C Y
+C Y
+B Y
+C Y
+B Z
+C Y
+A X
+C Y
+B Z
+C Y
+C Y
+A X
+A X
+B Z
+C Y
+C Y
+C X
+B X
+C Z
+A X
+A X
+B X
+C Y
+B Y
+C Y
+A Y
+C X
+A X
+C X
+C Y
+C Y
+B X
+C Y
+C Y
+B Z
+C Z
+C Y
+C Y
+A X
+C Y
+C Y
+A X
+C Y
+B X
+C Y
+C X
+A X
+C X
+A X
+C Y
+A X
+C Y
+C Y
+C Y
+C Z
+C Z
+B Z
+C Z
+C Y
+B X
+C Z
+C Y
+A X
+A X
+C Y
+C Y
+C Y
+B X
+C X
+A X
+C Y
+A X
+C Y
+A X
+C X
+B X
+A X
+C Y
+C Y
+B X
+A X
+A X
+C Z
+C X
+A X
+A X
+B X
+A Z
+A X
+C X
+C Y
+A X
+B X
+C Y
+A X
+C Y
+C Y
+B X
+C Y
+C Y
+A X
+C Z
+C Y
+B X
+C X
+B X
+C Y
+C Y
+B X
+B Z
+B Z
+C Y
+C Y
+B X
+C Y
+B Z
+C X
+A Z
+A X
+A X
+C Y
+C Y
+C Y
+C Y
+C Y
+C Y
+B Z
+B X
+C Y
+B Z
+C Y
+A X
+A X
+C Y
+A X
+A X
+C Y
+C Y
+A Z
+C Y
+A X
+C Y
+C Y
+C Y
+C Y
+C Y
+A X
+B Z
+A X
+C X
+B X
+C Y
+B Z
+C Y
+B X
+B X
+C Y
+C Y
+C X
+C Y
+C Y
+A X
+C X
+A X
+C Y
+B X
+A X
+B Y
+A X
+B X
+C Y
+C X
+C Y
+C Y
+A X
+C Y
+C Y
+A X
+C Z
+B X
+A X
+C Y
+A X
+A X
+C Y
+A X
+C X
+B X
+A X
+A X
+B X
+A X
+C X
+A Z
+B Z
+C Y
+C Y
+A X
+C Y
+C Y
+B X
+A X
+C Y
+A Y
+B X
+C Y
+C Y
+A X
+C X
+C Y
+C Y
+A X
+C X
+B Y
+C Y
+C X
+C Y
+C Y
+C Y
+C Z
+A X
+C Y
+C X
+C Y
+A Z
+A X
+C Y
+B X
+C Y
+B Z
+A X
+C Y
+C Y
+A X
+A X
+C Y
+B X
+A Z
+B Z
+C Y
+C Z
+A X
+A X
+A X
+B Z
+A Z
+C Y
+C Y
+C Y
+C Y
+C Y
+B Z
+B X
+A Y
+B X
+C Y
+A X
+C X
+A X
+A X
+C Y
+A X
+C Y
+C Y
+A X
+C Y
+C Y
+C Y
+C Y
+B Z
+B X
+C Y
+C Y
+A X
+C Y
+B X
+C Y
+C Z
+C Y
+B X
+C Y
+C Y
+B Z
+A Y
+C Z
+B X
+C Z
+C Y
+A Y
+A X
+A X
+C Y
+B X
+A X
+A Y
+C X
+A Y
+C Y
+C Y
+C X
+C Y
+C Z
+C X
+B X
+C Y
+C Z
+A X
+C Y
+A X
+C Y
+C Y
+A Z
+A X
+C Z
+B X
+C X
+B X
+B Y
+C Y
+C Y
+B Z
+C Y
+B X
+B Z
+C Y
+C Y
+C Y
+B X
+B Z
+C Y
+B Z
+B X
+A Z
+A X
+C Y
+C Y
+B X
+B Z
+A X
+C Y
+C Y
+C Z
+C Y
+C Y
+C Y
+B Z
+C Y
+C Y
+B Z
+C Y
+C Y
+C Y
+C Y
+C Y
+C Z
+C X
+C Y
+C Y
+C Z
+C Y
+B Z
+C Z
+A X
+C Y
+B X
+C Y
+A X
+C Y
+A X
+C Y
+C Y
+C Y
+C Y
+B X
+C Y
+C Y
+A X
+C Z
+A X
+A X
+C Y
+B X
+C Y
+C Y
+C Y
+A X
+A X
+C Y
+B X
+B X
+C Y
+B X
+C Y
+C Z
+C Z
+A X
+C Y
+C X
+C X
+C Z
+C X
+C Y
+A X
+C Y
+C Y
+C Y
+A X
+A X
+C X
+C Y
+C Y
+A X
+A Z
+C Z
+C Y
+C Z
+A X
+C Z
+C Y
+C Y
+A X
+C Y
+B Z
+B X
+A X
+C Y
+C Z
+A X
+C X
+C Y
+C Y
+B X
+C Y
+C Y
+C Y
+B X
+B Z
+B Z
+A X
+A X
+C Z
+C Y
+C Y
+C Y
+B Z
+A X
+C Y
+C Y
+C Z
+B X
+A X
+C Y
+B Z
+C Y
+A X
+B Z
+A X
+A X
+A X
+A Y
+C Z
+A X
+A X
+B X
+A X
+C Y
+C Y
+A X
+C Z
+A X
+A X
+C Y
+A X
+B X
+A X
+C Y
+A X
+C Y
+C Z
+C Y
+C Y
+C Z
+C Y
+C X
+A Y
+A Z
+B Z
+B X
+C Y
+C X
+B X
+A X
+A Y
+A X
+A X
+C Y
+B X
+A X
+C Y
+B Z
+C Y
+C Y
+C Y
+C Y
+A X
+B X
+C Y
+A X
+A Y
+C Y
+B X
+C Y
+B Y
+C Y
+B X
+C Y
+C Y
+C Y
+C X
+A X
+B Z
+C Y
+C Y
+B X
+C Y
+C Y
+B Z
+A X
+C Y
+C Y
+A Y
+C Y
+B Z
+C Y
+C Y
+A X
+A X
+A X
+C Z
+B X
+C X
+A X
+C Y
+C Z
+A X
+B X
+A X
+B X
+C Z
+C X
+C Y
+B X
+C Z
+C Z
+C Y
+A X
+C Y
+C X
+B X
+C Y
+C Y
+A Y
+C Y
+C Z
+C Y
+C Y
+B Z
+C Y
+C Y
+C Z
+B X
+B X
+C Y
+B Z
+C Y
+A X
+C Z
+C Z
+A X
+A X
+A X
+A X
+C Y
+C Y
+B X
+C Y
+B X
+A X
+C Y
+C Y
+C Y
+A X
+B Z
+A X
+C Y
+C Y
+C Y
+A X
+C Y
+C Y
+B Z
+B Z
+A X
+C Y
+C Y
+B Y
+C Y
+C Z
+A X
+C Y
+C Z
+A X
+A X
+C X
+C Y
+A X
+A X
+C Y
+C Y
+A X
+A X
+A X
+C Y
+C Y
+B Z
+C Y
+B X
+A X
+A X
+C Z
+C Y
+A X
+C Y
+A X
+C Y
+C Z
+C Z
+C Y
+A X
+C Y
+C X
+C Y
+B X
+C Y
+A X
+B Z
+C Z
+C Z
+C Y
+B X
+C Y
+C Y
+C Y
+A X
+A X
+A X
+C Y
+B Z
+A X
+C Y
+C Y
+C Y
+A X
+C Y
+C Y
+A X
+C Y
+C X
+A X
+C Y
+C Y
+C Z
+C Z
+C Y
+C Y
+C Y
+C Y
+C Z
+B X
+C Y
+C Y
+A Y
+C Z
+B Z
+C Y
+C Y
+A X
+B X
+A X
+C Z
+C Y
+B Y
+C Y
+A Z
+C Y
+B Z
+B Z
+C Y
+A X
+C Y
+B Z
+B X
+B Z
+A X
+B X
+A X
+C X
+A X
+B X
+A Y
+B Z
+C Z
+C Y
+A X
+A X
+C Y
+C X
+A Y
+C Z
+C Y
+C Y
+A X
+A Z
+A Y
+C Y
+B X
+A X
+C Y
+C Z
+B X
+A X
+B X
+C Y
+C Z
+B X
+C Y
+C Y
+C Y
+A X
+C Y
+C Y
+C Y
+C Y
+C Y
+C X
+C X
+C Y
+C Y
+C Y
+A Y
+C Y
+A X
+C Z
+C Z
+C Y
+C Y
+C Y
+B X
+A Z
+C Y
+C Z
+C Y
+A X
+C Y
+A Y
+A X
+C Y
+C Y
+A Z
+B X
+C Z
+B X
+C Y
+C Z
+C Y
+C Y
+C Y
+C Y
+C Y
+C Y
+B Z
+C Z
+A X
+A Z
+C Z
+B Y
+B Z
+C Z
+C Z
+A X
+B X
+B X
+C Y
+C Y
+A X
+A X
+C Y
+C Y
+A X
+C Y
+A Z
+C Z
+C Y
+A X
+C Y
+C Y
+A X
+A X
+C Y
+C Y
+B Z
+B X
+C Y
+C Y
+A Z
+C X
+C Y
+B X
+C Z
+A X
+C Z
+C Y
+A X
+B Z
+C Y
+C Y
+B X
+A Z
+C Y
+B Z
+A X
+C Y
+C X
+A X
+C Y
+C Y
+C Z
+A X
+B X
+B Z
+C X
+C Y
+C Y
+A X
+C Y
+B X
+A X
+A X
+C Y
+A X
+A X
+A X
+A Y
+A Z
+A X
+A X
+C Y
+C X
+C Z
+C Y
+C Y
+C X
+C Y
+A X
+A X
+A Y
+C Z
+C Z
+C X
+B Z
+C Y
+A X
+C Y
+B Z
+A X
+C Z
+C Y
+A Y
+A X
+B Z
+A X
+C Y
+B X
+B Z
+A X
+B X
+B X
+C Y
+C X
+C Y
+C Y
+C Y
+C Z
+B Z
+C Y
+C Y
+C Z
+C Y
+C Y
+C Y
+A X
+A X
+C Z
+A X
+C Y
+C Y
+B Z
+A X
+A Z
+C Z
+C Y
+C Y
+C Y
+C Z
+C Y
+C Y
+C Y
+C Y
+B Z
+C Y
+C Z
+C Z
+C Y
+B Z
+A X
+C Y
+B X
+C X
+A X
+A X
+B X
+C Y
+C Y
+C Y
+C X
+B Z
+C Y
+A X
+C Z
+A X
+A Z
+C Z
+C Y
+C Y
+C Y
+C X
+A X
+C Y
+A Y
+C Y
+B Z
+A Y
+C Y
+A X
+C Y
+A X
+C Y
+C Y
+C Y
+B X
+C Y
+C Y
+A X
+C Y
+C Y
+C Y
+C Y
+A X
+B Z
+B X
+A X
+C Y
+C X
+C Y
+B X
+C X
+C Y
+C Y
+A X
+A X
+C Y
+C Z
+A X
+C Y
+A X
+C Y
+C X
+C Y
+B Y
+A Y
+C Y
+C Z
+A X
+B X
+C Y
+B X
+A X
+C Y
+B X
+A Z
+C Y
+B X
+C Y
+A X
+B X
+C Z
+A X
+B X
+C Y
+A X
+A X
+B X
+C Y
+A X
+C Z
+A X
+C Y
+A X
+B X
+C Y
+C Y
+C Y
+C Y
+C Y
+A X
+A Z
+C Y
+A X
+C Y
+C Y
+B X
+C Y
+A X
+C Y
+C Z
+C Y
+C Y
+A X
+A X
+A X
+C Y
+C Y
+C Y
+C Z
+C Y
+C Y
+C Y
+C Y
+C Z
+C X
+C Y
+C Z
+C Y
+C Y
+C Y
+C Y
+A X
+B X
+C Z
+A X
+C Z
+C Y
+C Y
+C Y
+C Y
+A Z
+B X
+A X
+B Z
+C Y
+C Y
+C X
+C Y
+B Y
+B X
+C X
+C X
+A X
+C Y
+C Y
+A X
+A X
+B Z
+C Y
+C Y
+C Y
+A X
+A X
+C Y
+C X
+C Y
+A X
+C X
+B Y
+C X
+C Y
+C Y
+A X
+B Z
+C Y
+B X
+A X
+B Y
+C Y
+C Y
+C Y
+A X
+A X
+C Y
+C Y
+A X
+C Y
+C X
+C Y
+B Z
+C Y
+C Y
+A Z
+C Y
+C Z
+C Z
+C X
+C Y
+C Y
+C Y
+C Y
+C Y
+C Y
+C Y
+A X
+C Y
+B X
+C Z
+C Y
+C X
+C X
+A Y
+C Y
+A X
+A X
+B Z
+C Y
+C Y
+A X
+A Z
+B X
+C Y
+C Y
+B Y
+C Y
+C Y
+C Y
+C Y
+A X
+C Z
+C Y
+C Z
+A Y
+C Y
+A X
+A X
+C Y
+C Y
+C Y
+B X
+B X
+B Z
+A X
+C Z
+C X
+A X
+C Y
+C Y
+C Y
+C Y
+C X
+C X
+B Z
+A Z
+C Y
+B Z
+C Z
+A X
+C Z
+A X
+C Y
+A X
+C Y
+A X
+A X
+C Y
+A X
+C Y
+C Y
+C Y
+B X
+C Y
+C X
+C Y
+C Z
+C Y
+A X
+C Y
+C Y
+C Y
+B Z
+C Y
+A X
+B X
+C Y
+C Y
+B Y
+C Z
+C Z
+C Y
+A X
+C Y
+C Y
+A X
+C X
+B X
+A X
+A X
+C Y
+C Y
+C Y
+C Y
+C Y
+A X
+A X
+C Y
+C Y
+B X
+C Y
+C Y
+C X
+C Y
+C Z
+B Z
+C Z
+C Y
+B X
+C Y
+C X
+A X
+C Y
+B X
+B X
+A X
+C Y
+A X
+C Y
+A X
+C X
+C Y
+C Y
+B X
+C Y
+C Y
+C Y
+C Y
+C X
+B Z
+A X
+A X
+C X
+C X
+C Y
+A X
+C Z
+C Y
+C Z
+A X
+A X
+C X
+C X
+C Z
+B X
+A X
+C Y
+B X
+C Y
+B X
+C Y
+C Y
+C Y
+C Y
+C Y
+C Y
+C Y
+B Z
+C Z
+A Z
+B X
+C Z
+C Z
+C Y
+B Z
+C Y
+A X
+C Y
+C Y
+C Y
+B Z
+C Y
+A X
+B Z
+B Z
+C Z
+A Y
+C Z
+A X
+C Y
+C Z
+C X
+A X
+B X
+C Y
+C Y
+C Y
+A X
+A Y
+C Y
+C Y
+C Y
+A X
+C Y
+B X
+A X
+A X
+B X
+C Z
+C Y
+B Z
+C Y
+A Y
+B X
+C Z
+B Z
+B Z
+C X
+B Z
+C X
+A X
+C Y
+B X
+C Y
+A X
+C Y
+A X
+C Y
+C Y
+C Z
+C Y
+A X
+B X
+C Y
+A X
+B X
+C Y
+C X
+C Y
+C Y
+A X
+C Y
+A X
+B X
+C Y
+B X
+B X
+C Y
+A X
+C X
+C X
+B X
+B Z
+C Y
+B X
+C Y
+C Y
+B X
+A X
+C Z
+A Y
+C Y
+C Z
+A X
+A X
+C Y
+A X
+B Z
+A X
+A X
+C Y
+B Z
+B Z
+C Y
+B X
+B X
+A X
+A X
+C Y
+C Z
+C X
+C Y
+A X
+B Y
+A X
+C Y
+B Z
+B X
+A Y
+A X
+C Y
+A X
+A X
+C Y
+C Y
+C Y
+C Z
+C Z
+A X
+B Z
+A Z
+A X
+C Y
+B Z
+C X
+C Y
+C Z
+C Z
+B X
+B Z
+B X
+C Y
+B X
+B X
+C Y
+C Y
+C X
+B X
+A X
+C Z
+A X
+C Y
+A X
+A X
+C Y
+B X
+B X
+A X
+B X
+B Y
+C Y
+A X
+A X
+A X
+B X
+C Y
+B Z
+C Z
+B X
+C Y
+C Z
+A X
+C Y
+C Y
+B Z
+C Z
+C Y
+C Z
+A X
+B X
+A Z
+C Z
+B Z
+A X
+A X
+B X
+A X
+C Y
+C Y
+C Y
+C Y
+A X
+C Y
+C Z
+C Z
+B X
+A X
+A X
+B X
+B X
+B X
+C Y
+C Y
+A X
+C Y
+B Z
+C Y
+C Y
+B Z
+A Z
+C X
+C Z
+B X
+C Y
+A X
+A X
+C Y
+C Y
+C Y
+C Z
+A X
+C X
+B X
+C Y
+A X
+C Y
+C X
+A X
+A Z
+C X
+C Z
+A X
+C Y
+C Y
+C Y
+A X
+A X
+A X
+B Z
+C Z
+C Z
+A X
+B X
+B X
+A X
+C Y
+B X
+C Z
+B Y
+A X
+C Z
+A Z
+C Y
+C Y
+A X
+A X
+B X
+C Y
+B Z
+C Y
+A X
+A X
+A X
+C Y
+A X
+C Y
+C Y
+C Y
+B X
+A X
+B Z
+C Y
+A X
+A X
+A Z
+A X
+A Y
+A X
+C Y
+C Y
+B X
+A Y
+C Y
+C Y
+A X
+A Y
+C Y
+B X
+C Y
+C Y
+C Y
+C Y
+C Y
+B X
+C Y
+C Y
+C X
+C Y
+A X
+B Z
+B X
+B X
+C Y
+A X
+C Y
+C X
+C X
+C Y
+C Y
+C Z
+C Y
+A X
+C Y
+A X
+C Y
+A X
+A X
+C Y
+C Y
+B X
+B Y
+C Y
+A X
+B Z
+C Y
+C Y
+C Y
+A X
+A X
+A X
+C Z
+C Y
+C Z
+C Y
+C Y
+C Y
+A X
+C Y
+C Y
+C Y
+B X
+A X
+C Y
+C Y
+C Z
+A X
+A X
+C Y
+C Y
+B X
+A Z
+C Y
+C Y
+C Y
+C Z
+C Y
+A Y
+C Y
+C Y
+C Y
+B Z
+C Y
+B X
+C Y
+C Y
+B Z
+A X
+C X
+C Y
+A Y
+A X
+C X
+C Y
+C Y
+A Y
+B X
+A X
+A Y
+C Y
+C Y
+C Y
+A X
+A X
+A X
+B X
+A X
+C Y
+C Y
+C Z
+C Y
+C Y
+C Y
+C Y
+C Y
+C Z
+C Y
+B Z
+A X
+B X
+A X
+C Y
+A X
+C Z
+B X
+B X
+B Z
+C Y
+C Y
+C Z
+C Y
+C Z
+B Z
+C Z
+A X
+C Y
+B Z
+B Z
+C Y
+A Y
+B Z
+B Y
+C Z
+C Y
+C Y
+B X
+A X
+C Y
+B Y
+A X
+A X
+C Y
+C X
+C Y
+B Z
+A X
+C Y
+A X
+C Z
+C Y
+B Z
+C Y
+B Y
+A X
+C Y
+A X
+B X
+A Y
+C Y
+C Y
+B X
+C Y
+C Z
+A X
+C Y
+B X
+C Y
+B Z
+C Y
+B X
+B Z
+C X
+C Y
+C Z
+C Y
+C Y
+C Y
+C Y
+C Y
+C Y
+A X
+A X
+A X
+A X
+A X
+A X
+C Y
+A X
+B Z
+B X
+C Y
+C Y
+C Y
+C X
+A X
+C X
+A X
+C Y
+B X
+B X
+C Z
+C Y
+C Y
+A Y
+C Y
+C X
+A X
+B Z
+C Y
+C Z
+A X
+B Z
+B Z
+A X
+A X
+C Z
+C Y
+B Z
+A X
+B X
+A Y
+B Z
+A X
+C Z
+C X
+C Y
+C X
+C Y
+C Y
+A X
+C Y
+C Y
+C Z
+A X
+B Z
+C Y
+C Z
+A Y
+C Y
+C Y
+A Z
+C Y
+C Y
+C Z
+C Y
+C Y
+C Z
+C Z
+C Y
+A Y
+B X
+B Z
+A Y
+A X
+B X
+C Y
+C Y
+C Y
+A X
+C Y
+A X
+B X
+C Y
+C Y
+B X
+C Y
+A X
+A Z
+B Z
+B Z
+A X
+A Y
+A X
+A X
+C Y
+C Z
+A X
+B X
+C Y
+B X
+C Y
+C Z
+B X
+C Y
+C Z
+A X
+C Y
+C Y
+C Y
+B X
+C Z
+A X
+A X
+C Y
+C X
+A X
+C Y
+C Y
+C Z
+A X
+B X
+A X
+C Y
+C Y
+C Y
+C Y
+B X
+B Z
+C Z
+A X
+A X
+A X
+A X
+A X
+A X
+C Y
+C Y
+C Y
+B Z
+C Z
+C Y
+C Y
+C Y
+C Z
+A X
+C Y
+B X
+A X
+A X
+C Z
+B X
+C Z
+B Z
+C Y
+A X
+A X
+C Y
+C Y
+C Y
+C Y
+C Y
+A X
+C Y
+A X
+C Y
+A X
+C Y
+C Y
+C Y
+C Y
+A X
+A X
+C Y
+C Y
+C Y
+B X
+A X
+C Y
+C Y
+C X
+A X
+A X
+C X
+C Y
+C Y
+C Y
+C Y
+C Y
+C Y
+C Y
+C Y
+C X
+C Y
+B X
+B Z
+C Z
+C Y
+C Y
+C Y
+C Y
+B X
+C Y
+C Y
+C Y
+C Y
+B Z
+A X
+C Y
+A X
+C Y
+A X
+C Y
+C Y
+A X
+C Y
+C Y
+A X
+A Z
+A X
+C Z
+C Z
+C Y
+B X
+C X
+C Y
+C Y
+C Y
+B Z
+B Y
+A X
+B Z
+A X
+A X
+A X
+B X
+B X
+A X
+C Y
+C Z
+A X
+C Y
+C Y
+C Y
+A X
+C Y
+C Y
+C Y
+A X
+A Y
+A X
+C Y
+C Y
+C Z
+C Y
+C Y
+C X
+A X
+C Y
+A X
+A X
+A X
+C Y
+C Y
+C X
+A X
+A X
+B Z
+A X
+C Y
+A X
+B Z
+C Z
+A X
+C Y
+A X
+B X
+C Y
+C Z
+A X
+A X
+C Y
+A X
+A X
+C Z
+B X
+A X
+A X
+B X
+C Y
+B X
+C Y
+A X
+B X
+C Y
+C Y
+A X
+B X
+C Y
+C Y
+B X
+A X
+B X
+A Y
+C Y
+C Y
+C Y
+A X
+C Y
+A X
+B Z
+B X
+C Y
+B Z
+A X
+C Z
+C X
+C Y
+C Y
+A X
+A X
+A X
+C Y
+A X
+B Z
+B Z
+C Y
+B X
+C X
+C X
+B X
+C Y
+C Y
+C Y
+C Y
+B Z
+C Y
+C Y
+C Y
+A X
+C Y
+A Y
+B X
+C Y
+C Y
+B X
+A X
+B Z
+C Z
+A X
+C Y
+C Y
+C Z
+C Y
+C Y
+C Y
+C Y
+B Y
+C Z
+C Y
+C X
+A X
+A Z
+C Y
+A X
+A Y
+B X
+C X
+B X
+B X
+B X
+C X
+C Y
+C Y
+C Y
+A Z
+A X
+C Y
+C X
+A Y
+A X
diff --git a/2022/02/test b/2022/02/test
@@ -0,0 +1,3 @@
+A Y
+B X
+C Z
diff --git a/2022/03/a.rs b/2022/03/a.rs
@@ -0,0 +1,26 @@
+mod common;
+use common::*;
+
+fn get_rep_val(rucksack: &[u8]) -> i64 {
+ let mut seen = [false; 256];
+ let mid = rucksack.len()/2;
+ for i in 0..mid {
+ seen[rucksack[i] as usize] = true;
+ }
+ for i in mid..rucksack.len() {
+ if seen[rucksack[i] as usize] {
+ return value(rucksack[i] as char);
+ }
+ }
+ panic!("Could not find repeated char");
+}
+
+fn main() {
+ let mut sum = 0;
+ let mut line = String::new();
+ while std::io::stdin().read_line(&mut line).unwrap() > 0 {
+ sum += get_rep_val(line.as_bytes());
+ line.clear();
+ }
+ println!("{sum}");
+}
diff --git a/2022/03/b.rs b/2022/03/b.rs
@@ -0,0 +1,29 @@
+mod common;
+use common::*;
+
+fn get_rep_val(e: &[String; 3]) -> i64 {
+ let mut seen = [[false; 256]; 2];
+ for i in 0..2 {
+ for c in e[i].chars() {
+ seen[i][c as usize] = true;
+ }
+ }
+ for c in e[2].chars() {
+ if seen[0][c as usize] && seen[1][c as usize] {
+ return value(c);
+ }
+ }
+ panic!("Could not find repeated char");
+}
+
+fn main() {
+ let mut sum = 0;
+ let mut lines: [String; 3] = Default::default();
+ while std::io::stdin().read_line(&mut lines[0]).unwrap() > 0 {
+ let _ = std::io::stdin().read_line(&mut lines[1]);
+ let _ = std::io::stdin().read_line(&mut lines[2]);
+ sum += get_rep_val(&lines);
+ for l in &mut lines { l.clear(); }
+ }
+ println!("{sum}");
+}
diff --git a/2022/03/common.rs b/2022/03/common.rs
@@ -0,0 +1,7 @@
+pub fn value(c: char) -> i64 {
+ match c {
+ 'a'..='z' => (c as i64) - ('a' as i64) + 1,
+ 'A'..='Z' => (c as i64) - ('A' as i64) + 27,
+ _ => panic!("Error: unexpected character '{}'", c)
+ }
+}
diff --git a/2022/03/input b/2022/03/input
@@ -0,0 +1,300 @@
+QtGHnGlcwQGvHwMHGnnGfRFCJnRBfVVJRVBfCFBh
+qsDjzNWhmspNNqVrfjVfjJCbBVfB
+DLhPTmNDTzTqzpmzLpswGMHtMgwglcPQMQvSGM
+ctwDjvgtltgglHrSHCsQWBBDfS
+ZJZdVnmhmfCprnBTfS
+dNddhhdPRRdbdNcvwCPCgCctjPlF
+MNNDGMWrQsfhtrTnrm
+jcvRPRPJdvccRNFNCjLdcwJCSHtHPmzhsSzPHmfhnftnTffH
+RddRcjRvZgZNWNgQQb
+fPrvhqhRPSfCCfhrqtbtLcmZmtHCtpCFcc
+WFQJlTdzgGJVQGWQTzdJcHbQZtLtHmbbZMZHsZQm
+JFNlzTBNJGlNPSRhfqRRrN
+tdVVgttdDtJJsNPmzdQmjcPP
+CBTMmmmbTBHqHMwQcZPWWsWnzbbnzW
+CGlLFCTMGvqBGvGvGSRSRfmtRRtgVgrSLS
+LHSGJLWZLqHQHpRHRz
+bpBPVtpCwPgBCtqqvzfzMQvjbbjz
+lhVsTgPlBNThpBNwBtVThPnrGGWJZnLZFnFrGWsFrWZr
+nQbbbjpnsdsGCSlmHtJmvljHMjWt
+cDcgThLVcPTHVlVlHllvWp
+cwpgghTcRRczDhnQGGCSdfszdSbS
+vTMFDNTlDhjTDNMNJDwmWWWfGPfLnnzLGfMmmL
+bVQgbpqqtctzLflltnCz
+VSqlVSHRFvNwJSDj
+RfZfjljffssWLWPTGPjhzT
+FDCvMDMJJpBJpBFJCMBDMtPbWbLVPGztWPVTtPmLWGhQ
+DpgHggpwBJwzJMrFFvrCrHsffnRScNsdclSnnRnSNs
+wTvfHSvSwssPGCLCPhgSCn
+QNpMRqRJQMZlBBbRRRMfbZlBhPChghhlChGCtnthctjPhchh
+rrrNBbMZqRbqDsFHTwfWTFFwrF
+fVgfQhhgfTLHSLNZZHfZ
+CDtsqrqlDtqDddsqjsstHrSlNLWLcSZScFWWcNBFcBcc
+jrCJrHjDCMMDsJjJMstThppgwvGzVGQzhJvvng
+DGlTlSzbSnzmwbmblTBBPgffpNjFHppZBH
+WqQdWqqJdCrtvQtJLQjtdcBNfPsNZfHZZsHNNZHsBBHL
+cCJcjdRvqrQhqvWMzlbDGVGbSMSnbR
+BfQmpfpmsRCRPDSZVSjjSg
+MhNJGMTMHGGTbnGMJrbJHTzzdPgSwSqqPjPdZddSqNSwPZDw
+TWbWbhnHWBFBFBDD
+FrlJbTcBTcrlTlqwZTwWdhWLChLtVhdfLhmwWC
+pppSpzBGMMMjSSMSzMNzHRSDVWGWDWVCDtGdtdhLhftthd
+RNNgpMPRNgzggFJcBPqFZJZrbc
+SdvnnvvntnbDDqtz
+wRpFRRspZhgZgFggFMgtczcGGDzQcGlGDMqcDG
+CLLCFNZhsppRvvttBPCjStdT
+JJDMhSwmMwBnnJPJmQcFtfQtfgQhQQfcgH
+ZvCvTGqGVWTZZWptQggGtHfDgcpz
+dsVCvDTZWWbZqqCZqVsqsqmNlPNnSJmbNNmlmMSnJLBl
+MGnMBMBJFpBcNpdwRWRvRNdblmwW
+LSgtPCChgjCPgSSzCSqWLLbrdWlmwmwmFvml
+QhHPVSHghCtQFgCzgQhVnDGMGffnpcZMcMfJDf
+QwrJqMLRLtBQRtWLJLvQLMrMgNNzPDngNHlHnbbbggHlgZNt
+GdfThGcmShTGSfppmFfTHDNNblSZDbbzlBzZZHHg
+TffmGBBFcCFFmTGFhBwjJQJMQWqWQCrrvQMR
+mRbrjZzRLchHqqdLDllh
+mCGCsJSggCmgSGShlhhDVVVwhqSltV
+PsfsGNGJvGPfspvcmrTRBrjTZzvT
+NRNqFFtqqFrDDQRcJJJNrWDswHwWwbDVTgTwLbVlVD
+ZpdHHGPmgwTwldbw
+HnnnMPMzChPmnpnmfFJCRqcJqJRRrrtSBc
+LnNNLBmTNBNTwNZZjZmRMHJwMHvbWrvPMMWdcP
+GtSFDFpzsGVvMJdJsrMbvr
+SqQQGGtqqSVtDpGtplVDpVJClmnhnTZNjNfmnmBChCZL
+CHltTDsjHNHHdpDRmqdPQpzd
+fMMbbZwLJgMVVFmcRqRpzdqbRm
+MJJWfnVhMzTNGlNTsh
+WtWbtWvrrQGrbcSWHHfSHfgdWJ
+zpnPhLPhPnTMMnzMzpMnDzLPjTVjccSgdmjdvSJdHSgdjScj
+qqvMMCnDCCCzqqCzhPlLsRsGtrsNlRbZtBRtbrrQ
+mPTmlGQnjNTPQQNljnlQnmmCtgRPhghqgqgzqLRPtMqqMzhq
+pDsVSZcdVspbdBpcBHBcHhqLWzMbfhMMrMgMgzLRft
+pFZpJJFSBFRllvlFNC
+pbMVjJbwbbLqlZlstRhjstsN
+FSTnfCBcnBSBvSmmCFCCRQhZBZNsRGlsQQNsqZlG
+dvcdfFcqmfcmdMdJgwJJHMbH
+QSRlWDhQQqDqlTCjTRCSljSmVsPmmGmzsgvppzPVVzdPSP
+HHwtMNMZvfPGbdwdggwG
+ZFcNMFFvHLMjlCWrqhqchh
+jccDSGVVlRLVSVVScWZZwLvbphgwdpLwZv
+BQHBtfQQHBfmMtmFznrHzmDwghWphvZZFpDhZvgvpZhh
+DmQrPQnBtTnzrrfHrtfMrmTCGqPNjSPCRRGjRCRRqCNjVN
+bRDbbtVgPFFbDfgVCtPcGsNNsHccqcGGWCNNzW
+ZwlmJwwRSmlJdQRhqGNTqzGTwzqGhc
+ZQdZjpljldrSMjmjdRLdmdbVvvtDVFFffvBFPVBgMnBg
+rzwGrwPGppqzPMzrdqsssSsvgtQgTTTJsH
+LCNNHLmHWvCJstsJss
+cfVLLNBmZBVMVDHGwrhM
+FCGFrJltMGdFdGtlFtCgFzQfQnZfVVVMDcQDVzVjfD
+PSPSPZPRbPRsbBRbHBTPvfVzQcDQqWWnDjnnHDjzcz
+RmSTPwSTRpvSlZglgZprZtNp
+njtLGLbcNTbbLnLmNTtqnFzVPwJFFzPVFPwMVmfMmV
+srpZlSpsSVqgSPJJ
+HZsHsrZhrBQpqQvpdprnTnnHTbGLbHnjHGbjbT
+vFFnJjvnVSjgCqSCDZ
+lswrrcsQrHTHwdrDdhmqqsRhzmggghgsGC
+QPrWQWcDNDHdddNrQPfDMLMLtvvMbnBpPFvpFFvL
+LgltlRMtcccgMdlzqTVwwrdsqm
+FpvfSDNzSpnvGSnNpmsmVqVVrHwvTqVmmw
+pGjDFFDpffnWQbnzjLJhhLchPPJMPBLt
+lJqBqPvtvVPnttnJjJBjVMzMrFhdQrQFbGbQnrbzGG
+msRgTgmTLLmsTDRfQRllMdGzdRbMHQFF
+msfDWglWTpSLCgTpSCDsfPjvjtwVjJZqqSSvPVZSqB
+VZZWGZGlZZZMZrGMlQBQGWltFzqvzzcVcgzvmgzddccgvqFc
+rLjNrDRLDRLTqdCqFCNzFgqg
+TJSSbHfDDfSnbpHpJnGhWPtrZWnPhBwWPWBt
+ssvsDDjNwhjNhGGgDDRZllltLCLvCWbMffLCfWzb
+qVRmJFSQqqVcqSMWMWLMlllbtbVM
+PqQBPcFJFcmdrJPJrFrQpsNjnTGgwTwGssRNRnRBsG
+sHsJJfSsrpBLHCLJmdqgdZgRNZQlgRNC
+VtnFbhFhwjwVPPjhbccQDQqgRlWDQmdWZZDd
+hFhFvbhGwzvFbtbPnttGbtjsLBfspSrMvJLrpJTrMsLZrH
+nzJDJvvZznnqnZrpTgTpzzTNjlmtsglBjjttQQCgCCtlBj
+SRLRfdVfSVcfHdVVdSLdMHQjPtClsmcwNQltjwjCQQwm
+RShVLWWfWWGvsTZz
+vcdptvndNzrndjctrvcnvtTdbwwRTgwbHDFDTWgqWlWqwqbl
+ffVBmQPhshhfPmSfBPfChmmCWFWbDWFbWwwqRDbsgwWMbWFb
+SJJCBLZBhfvnJnpGtvRc
+HLMMHHpNqWHqFqppPWnshtsLhBnVDtthLLms
+JgmSRgCRGbgwGSbgJJjRRDntztrVhnsDrllllwhhzt
+bRRCCjgRvJQQdcdjjvRcQdgbZPZpqfqpHHMfNFqNTPWqQWmq
+PPwQTlFrLqrLQrPfPJrHtcjtSvdCNNctLCjNdc
+DGZMhmVRMGqVmVDnGMbBZhsjHNvjdstddjdjccSBSjds
+mqzVnWDmmGzRhqRbbWQQFwPQQTlzPFpTlPJJ
+RMmnMrZMlQQpGrQt
+gPPgcDBcjdgjBCBcQtNDNzzthltGphhz
+FSvPSSjFWFScSWdjWvbTwWJQZQVRsMTQVwTmVR
+PwlbMTDQDvMwttThPthhvhvvZzNLzNZjQCNNLWLCRZWQRzNW
+VpJHFpgfqdFqqHFGHVSdGmZZRnSsnLjNZCWmmszLSz
+drrJRGJVrcMBDwhDbcMh
+hghHTgbwHbDqHrgbbbSLzzFNnsVqNVBnLnfs
+jMlcMRRmGcRlZQMMJRJSPPmCFzBBzpfBfLfpFLszLNNFVCfz
+JlmGlZmvRMgvrgbrrSTw
+ZtTTHpprHtQtHtpqPmjVSScjVSjjSNqw
+nRvGWhRbnRGzvWCBGPjNdwcSwcnlJdmmSj
+vCbsmbWfRsRWWzsMWBQFFrDZpgpFHLgQLMgQ
+QlJBfZssjgZsQsDNbScdDZdNcvvF
+zrGrVVpVMWMwMVLMwqVWpRdNFSDcFNDFbSddqHldDdqd
+VLVtrWpMRCRLWGWMRwVGCVPfCPJnBTQsJlmjsfsPBQjC
+GQqpnnFWFcnWpBMhhSZRhQCCCfRQRD
+HsbcczlrjzflffLVfDlt
+jssvwsHPsjzWdMcgBnvqMB
+JMJdMptTbbtpJZhtTMZwJdNWQBPNBlwNBNQWHBCHHPlg
+rVqsvVmjrcCqCPsPNQgnsnQglW
+rVvzfqvLjFVDVcLjCqLmJFGbpJpRJTGMtbRpdGRG
+LrmwdZHlSlcVlSrrDWCzbtpjpgzjtD
+gBGgPTTBqPQTqnnPJhMTTCzzppnCvptpnCtzNpDntz
+qQPTTPshRRQqcgsflHZcsSLV
+smvdTvlPzslmVjMhJlbjrblJ
+cqFffFffcwFfpcDSjcnZwZWrQVDrQBhNbrrNBbWVbNhr
+nSpRZRjpcHqpCpqnqFRGmvPLtLGmCdCsGLLdtC
+PJPLPPHDdPvdnbctfcpt
+NRrGNjNzLjltppvpRSRS
+LzVWLjTWGLQqBgZWJWBBFg
+znzccGnswWrWNCpvvdTCzddC
+RfZlRDDDZflSBMhhhPSMMZpmpHHGNCGTmCJTmvmCvJGR
+GbBMhhbSMhMffDMZPggSGfhVWLwjsLttWtrjWscVLWnQWswn
+jwRzdZZhwhwHSQqpStJHhp
+GVGPBvNPvffpvtvp
+nsGGDVtFNGgGWjWlTwrwTmjwTR
+MQtmmMMmnHGGTmhw
+llqvqvvpqdvvrSfrpSfdfnhFSTMNDHFMNFFSGFwMHT
+JqvvRgpCfrzCpqqzdfRpRllWZZBQJbVVtMttsVWJbjPbcc
+zgqBczqBbBGjdHVgdDFd
+lNVhNNnLtZZZGWjdWrSW
+PCQhNflCtCwtJwhClMmVcRmpbPqTcmBqpm
+wWbqbTwVrQLqlMtrZtZffNfMfP
+vhjqqRpRvZsfssZN
+ccBjJBqGpRhDGbJldHlgLwddLd
+hVScjtgcchVhSgZJSchVwLbNLWnLNwwnwrbWNLgr
+BzMdBqzBQzZQPpfrsrbrNdNLsrRR
+zPMzmmGpmzGlFQPPmlZPzSVTSVJJcSlcDhTlvSCtjJ
+hzdwlqngZQvDfmzF
+vcRrcsVNpVQsFfBfPPQB
+HCHVWVcCpNMHWRjLwhvhggdjvggM
+LBHCTPzHHBcClwppwjjNNl
+JddZMRmmssVmvDvJddSJWVWBwpQvwfpwvwwfrrFNQfwjpl
+BsVMVZDVZssZhMhJqLzhzzHzPTPnLGqb
+bcnNQnBTvvvWTQTJhdHJzhSjpJJjStjd
+mMwqwVMMRwhBtjdSVBVl
+GfsrwCRmZBcZTvBf
+bBjQmmmqWdLqvLbWLtNJccNZZgCBCZgCTg
+phfpfzpHPDwfMwvVzlhlJJlggcZgZcRFFlCgZg
+zfhpMMDpVVzzhHhzzMMwfnMfSmQmbQvvWqWjmLSqdQmrqjjn
+ZzdcbGTwLZwPPwpMPWpjWPpWChBC
+nmznNRFHQrqQvqqmmMfWWWpMFjspWFMWjB
+zqRDSmDrmvnvntGccGdcTVtLTlVG
+nfnVscTcDzsZqmRtjtsqjJ
+wnnhWPWLBNwPLHdQdWdHPHLdJjqRRqrvjrmqFtvRqtQRqFjm
+bWhHdBBLdLnShWHcTVzCfCpVDTblpT
+WSjVFSVTSWvgvFwpgTTFsfdVclhNCfsHnHlHsCfV
+zRqLqZqZZQcdNltfHzsd
+ZqBqGLLRcjWWBvTT
+wwBqgZfbgbZsvWmfJrtFrdDttqdFdLct
+SNSSVTnnThnCSPPnzVztQJJQdLPtFcGLdFGDsD
+lSlszRVsRjmmfjfRRf
+NGzGWSLzMdQtcctbgWjt
+vqTnfVVHBffnCmHgMtrrrHrgtcrt
+vqCDVlFnnCnnBSzlspSzLSNMLL
+rwVlfVMRSTqTgRhT
+pppjLtpZjHFHNhsctSqDDVtnns
+HNjJLFBFHZZzWbVBZGfwdGrMfCCfGvmzlM
+zFzztqWnJttqqzJtdqbtqbPVMGcGZwgPGVwGQjwCCggMZQ
+hssLlrsSrBmBrZGSfgwgSwQCcj
+BmBBDBHLrlNhLNHrpsDvLJNtddczdRzzcTqJzzdWnc
+pLWcpGSscLQPDzLBgdbmdZHBHmZB
+lntfCfVMvtttqVqnZHHbbBZmwwwCdHhc
+qqRJFfRFRNlTzSSWWzSJpc
+DrphDfFrdGGjTTgTgCSV
+vbsMZPnPvqHMQvtZZPWBBVVBJjWSVTPjJC
+nMbnsRSQvvLRMsssQhdFrcwczLlDrrDzhz
+LLlDQlcLDqLSlCDRlRDCqTTzzgNzShSBdZGBFBBgNG
+nHnMwPPbrWwpmztdMtzFZZFtTN
+PJfbZmHrpJfZDRLlDlLcVsVJ
+wZwQsrrzQFQSrRSFbzDglcdCcdljjdlljcvslLhv
+VPqGJtqqfnJcCLFllFMGcd
+fNHPJWpmHfffqJHmwzgbrBDZrDbFRQ
+HggtSJtzrgltshlTsrzbzsgbFddfffDZwZRZZZGfGDRTNNZZ
+LnjWccmQBPWqmWPqMfFNdGBRCDFFSfDfRd
+WpMjWpMcWSjqqPjQLmvmjMgllsbgbtvsrrtvJgJHhrHl
+PMcMcBpztMztzPPhbSgGSvgfHD
+nsmsVQVZVQmTRmddrLgfFhfLgLDzgvffDhbF
+dwsjrQQrVwTmZRTzsTdBcjqlqWpcCCppcllltC
+DbVjbjwNMDTCVbhbTNDrVTTmzFGLFLHcLHzmcWFczLHwmH
+PPWsfBZngtZqZZnPgZnPqvmFmczgRHGmGSRRSSLGFF
+sntBlWPdnspnnPQZtnNNNMjhMNrVMjMThjpr
+rCrCWVvvWDnBWvDnWDMCMZTpThhGGhGRGqGqZmhZqV
+NNjQMzNzQjjwNmJNmZddpdTG
+QwtwLPcjPtQlHSSslzwHSlPQDfDWsggsvvBvDvnvgngCnvFM
+ZDCbvbDvvHbCGTWpZTtWWQnn
+hLqzLVhVwNwVfMnJrfqMzWrQddgmQQGdgpgQGmgjTj
+wlVNwJJfVRLPRnHRbFHRsP
+lLmvLGRCrmDwVPVsjmtBBQmt
+NSHWNbzSHWpSpfChqqJPnzBJsBPPJnQJ
+pWcHbNfWpgZcWbhbZSgchWpRdCZMMdGDFFrLwlwMRRZFdd
+PnNrFVZQHNDrmNQPflbhbfqbvhwbVfvq
+TCdTtpCtCWTBMtjTJMWtBMCLSfvbqqzqbljflwDLvLjLLf
+MCCGcpCJRWTTMGmPnDFNQQnDns
+FhSmttZmgLjJVMlVGllGjcrj
+NRNvNWNCdnNrBvWvwRdWvvvRCGcbVVQbMQGcGcVcMclzVVlG
+qwBsBWwnvdtHJJSrtHsr
+wnwPrnBBPgqRPjhgCRGCLvvbRZcJvCbb
+dWVdVdlMHtsTslMtzztFGGczvvGJzL
+fMflHpddJfNNVfNWWmDqQpwBgwnjPBQDjqBh
+WttGctsNCNrfwTMlBtlr
+HJLzLJJVnFjHbnbVjDHDdFqwwffTTfTGwrqwBBTT
+jgVgJSbnHjNWsWCSWWGG
+ssLfHLvrrfMMlBMRMfpd
+qbbhmGCCVDQhQQVzDDbqmhMBtDZdBZHlddpltpBpdlJd
+QhQbzqCGzVzSbqzLHjLgrcjvPSnnSL
+NGGZGsGFCGvCcnCcgnZWrPHjsJjHjTDjJHfrjHDP
+RzzQmwwmdRRwMqRQmZwtfrDPfTfrbjHqrDPTHr
+MBLphmLpSzdRlnWZCNcGLgLG
+LwPPHZLLWRMWMsHqTCjmTTjSTn
+lFpNNpzplbfphzNcQzVcpvzsnqTsggmnjfgqCDsnCDqsgS
+vFJJhQVhbcVddLtmWZJdmm
+GwMNMGBMRMGjdSGsDntglDrDGQ
+WTmPPzfmlQrsnQmg
+ZPTJVvllhBwvLvwRwj
+nlSvqqFqzfnbnvFwwsGHTBHgPfWsTrRPgG
+dMdjphVhhgdLVJhNRBGPRWWBBGPTTGHV
+thJgLpghLNLhNQMCtdMhSmFlQnzzwnbzlbqqSQFb
+ZJJLBWhJBNwJwLvgRgGRgbZqbHTbGT
+cCrfFFnzjmdrdrmmzsgSPSHSbHWPRgrgGR
+dmCFntnFctjfdVtttjtDVncfBDlNJJppwQMwNBNvvplppWNh
+GGNNNbNbqmsmTVbCDQQhDJQT
+rgPvdgMdPdBddvMcrMnvgcSwhClTTJCwClDTvLJJthTlth
+zBdWpnDBDmfFGRffzH
+WNNNWcDcdVHNQTNT
+lLvLctvrvvvPCpHLQQTZVQLTTHBV
+zltgpbPCrrmtlmrlhhbqcWMqDDMDFMfbGScc
+dzSHRCGZGdRQWQWtllWB
+mNmbLbbmwjsmsNjDmcPvpVHBVPQvWDWBBpvB
+jnmNNrLcnnjjHhSCdGMSfrfd
+mgGvfvJSmSSrbvScmGccTPCqNnRjlpNNfNjqwqlpNpfw
+zZLLQFFFtsFwWjjRqbbCsW
+hBBLBdFHddVrGbVc
+bJGchsCcHwbHfgvg
+qdlSSNqLPqlPQZDffgfZRZMghvZr
+PLtqtFTPNLlWlqtQqqQzBBmcnschGtjtnChmzC
+llNLDLzjDtCTVtClCDMHSlmwdmmdSmddwZSS
+gPJszvsBPbwSHZRQSJQJ
+bgFssFPcWhDjCzLcnNDD
+ZTGMwdhMwMJphZMJlNdVBCnncNPLBCCRPnCncn
+fWsqmfSsqvfFFFvmWjfSSsPLCwVPRnPRCmRnRRCVzRCV
+FQfQfvStwjtqsjvvQWFfWqWtlMDdGTJJGdMdhJtDMbllDZ
+DzZLpBDptpVPrrrFPqRmBj
+WsfCTTgMllCWJMlhslNsCFJrGqvmRPqmqZjGFjvmvm
+HfghcNghHhgNNfbDDZdcdpndDzpt
+RRBRdJfccVRdDJqdDrvwShwvztWJlWwSJn
+mPtCHPPmHbmHNZjjjQHbMSgrSWhWzWnnQwvzzrlrll
+tpFmjpmjFMCmppmVTVLFVfBqTqVDLd
+jtljZcTcVVtdggVmdczzzDPzvCsvRbDsDmvm
+MHHnnJMFMNpwSNprpMJrfsbPRRbWDGLbHLDRvzzssR
+rJFNvQfBSwQBwNwldZTqTtctQchthc
+WsWTWsfjgTJGSnTz
+RHNmvRLCpJclcNcvHpNcPBzgQgMnnGFnLFgPgnPF
+mHlcdbbccZcCCCNZZNcCWtthWbWqwwJsbDfthfwW
+vFFzppnHFrjmpljQhg
+JPGfPWVdwfPgQzVQlTrQrZ
+PwRJfGDBfCHMzRHNHMNR
diff --git a/2022/03/test b/2022/03/test
@@ -0,0 +1,6 @@
+vJrwpWtwJgWrhcsFMMfFFhFp
+jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
+PmmdzqPrVvPwwTWBwg
+wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
+ttgJtRGJQctTZtZT
+CrZsJsPPZsGzwwsLwLmpwMDw
diff --git a/2022/04/a.rs b/2022/04/a.rs
@@ -0,0 +1,7 @@
+mod common;
+use common::*;
+
+fn main() {
+ let contained = |a: (i64, i64), b: (i64, i64)| a.0 >= b.0 && a.1 <= b.1;
+ println!("{}", count(|a, b| contained(a, b) || contained(b, a)));
+}
diff --git a/2022/04/b.rs b/2022/04/b.rs
@@ -0,0 +1,8 @@
+mod common;
+use common::*;
+
+fn main() {
+ let overlap = |a: (i64, i64), b: (i64, i64)|
+ (a.0 >= b.0 && a.0 <= b.1) || (b.0 >= a.0 && b.0 <= a.1);
+ println!("{}", count(overlap));
+}
diff --git a/2022/04/common.rs b/2022/04/common.rs
@@ -0,0 +1,20 @@
+fn get_ints(line: &str) -> ((i64, i64), (i64, i64)) {
+ let i = line.find('-').unwrap();
+ let j = line.find(',').unwrap();
+ let k = line[j..].find('-').unwrap() + j;
+ ((line[..i].parse().unwrap(), line[i+1..j].parse().unwrap()),
+ (line[j+1..k].parse().unwrap(), line[k+1..line.len()-1].parse().unwrap()))
+}
+
+pub fn count<F: Fn((i64, i64), (i64, i64)) -> bool>(condition: F) -> i64 {
+ let mut line = String::new();
+ let mut sum = 0;
+ while std::io::stdin().read_line(&mut line).unwrap() > 0 {
+ let (a, b) = get_ints(&line);
+ if condition(a, b) {
+ sum += 1;
+ }
+ line.clear();
+ }
+ sum
+}
diff --git a/2022/04/input b/2022/04/input
@@ -0,0 +1,1000 @@
+5-96,6-99
+29-97,80-97
+3-87,3-4
+12-12,6-12
+64-65,24-66
+52-54,1-53
+86-89,85-88
+37-69,38-38
+81-96,47-75
+1-13,18-44
+46-93,46-63
+12-75,65-75
+27-58,27-34
+10-74,83-87
+17-19,18-95
+96-96,10-95
+1-90,7-89
+62-79,90-98
+5-93,6-96
+17-82,31-82
+1-2,1-12
+37-50,49-92
+21-65,20-79
+7-61,8-91
+2-6,1-99
+51-92,51-52
+18-18,20-94
+21-26,27-69
+7-86,6-86
+71-71,72-99
+34-96,95-95
+63-64,11-71
+85-87,42-86
+3-4,4-74
+14-14,13-97
+8-12,9-10
+70-78,65-79
+6-10,5-5
+4-78,46-78
+21-21,22-94
+20-21,19-19
+7-56,6-56
+16-84,84-84
+8-14,15-88
+61-90,60-63
+25-75,42-75
+39-54,50-54
+48-86,48-71
+4-45,5-5
+55-55,57-87
+1-97,1-54
+39-44,39-41
+10-41,40-41
+75-87,4-88
+11-88,87-89
+10-74,75-75
+4-98,5-95
+1-70,5-93
+85-90,85-91
+11-33,8-32
+6-79,5-79
+51-97,50-96
+16-29,16-20
+49-56,9-56
+35-91,34-91
+2-6,10-58
+29-55,54-55
+15-53,15-59
+39-91,44-46
+96-96,95-99
+33-49,33-48
+61-96,61-95
+20-86,18-86
+18-98,17-84
+13-20,8-14
+25-39,24-25
+23-32,27-37
+25-51,5-24
+44-91,45-91
+83-83,37-84
+87-87,17-86
+24-42,23-42
+1-62,49-62
+40-82,88-91
+58-91,59-93
+12-62,11-53
+17-36,37-74
+13-70,71-71
+17-60,17-77
+15-48,63-74
+3-89,10-90
+35-36,35-82
+74-99,23-87
+15-94,15-91
+99-99,23-86
+60-89,88-89
+25-83,33-84
+12-83,12-13
+9-68,8-68
+57-99,18-57
+24-31,24-64
+70-97,71-86
+10-22,15-79
+24-77,16-77
+82-84,66-85
+83-84,50-84
+9-98,8-98
+5-77,76-77
+5-94,6-90
+48-57,34-64
+18-49,25-50
+15-85,1-14
+15-72,15-91
+10-82,9-96
+4-4,3-87
+9-93,10-10
+2-92,2-85
+20-95,21-21
+53-67,66-67
+2-97,1-97
+49-72,12-66
+48-57,47-47
+86-95,95-95
+41-87,41-75
+37-83,62-84
+75-90,38-63
+35-95,22-36
+70-78,42-77
+23-99,98-98
+49-58,2-62
+16-35,10-18
+24-63,91-98
+34-36,35-72
+19-94,88-94
+5-28,3-3
+9-81,10-82
+68-94,99-99
+5-53,3-54
+56-91,2-91
+7-9,10-43
+17-71,72-84
+19-55,18-20
+13-93,85-94
+4-6,5-53
+13-99,69-99
+29-31,29-40
+47-81,48-48
+78-96,79-99
+14-88,89-89
+42-51,43-75
+86-98,84-96
+36-57,29-37
+71-84,83-83
+5-68,5-88
+3-86,29-86
+79-97,7-63
+36-49,47-63
+17-45,4-42
+2-17,16-83
+53-66,54-86
+81-99,17-80
+9-37,29-38
+49-50,22-50
+81-81,43-80
+28-75,37-76
+4-98,3-98
+5-11,11-86
+5-70,69-81
+70-70,69-87
+17-57,16-57
+16-92,14-92
+19-22,13-22
+32-90,5-91
+37-73,8-73
+4-84,1-2
+22-53,22-61
+75-99,74-97
+57-81,13-81
+32-33,12-33
+56-78,56-92
+11-84,85-85
+8-49,49-74
+6-91,7-70
+38-93,93-93
+92-92,35-91
+95-98,10-90
+5-36,4-92
+36-36,14-36
+1-59,42-59
+88-92,8-47
+21-57,6-22
+7-86,12-99
+29-63,97-99
+12-79,80-80
+20-22,24-92
+95-96,25-96
+12-26,13-16
+54-58,32-58
+64-65,60-64
+36-78,35-35
+3-55,1-2
+9-56,4-40
+32-36,76-96
+1-2,3-99
+69-95,14-97
+93-93,78-93
+78-78,59-79
+23-77,10-78
+7-71,70-71
+8-93,2-94
+3-3,4-98
+77-98,5-98
+16-16,16-98
+17-48,16-17
+98-99,3-80
+41-63,41-55
+54-54,53-86
+32-63,40-46
+77-78,18-77
+32-55,33-33
+89-97,66-97
+6-90,90-97
+3-81,3-64
+9-99,3-93
+6-99,5-94
+62-93,86-94
+95-95,11-95
+17-99,8-13
+34-84,35-97
+23-23,22-85
+85-85,22-85
+8-24,7-44
+9-92,9-33
+1-63,1-96
+28-97,30-97
+12-90,8-89
+14-14,2-15
+38-79,38-39
+54-55,55-57
+46-80,34-79
+12-80,11-95
+9-56,8-56
+64-94,28-93
+14-14,15-95
+3-43,44-51
+19-61,5-5
+62-99,15-95
+67-78,77-79
+23-40,24-40
+1-55,9-54
+6-81,1-80
+4-84,4-85
+4-4,6-94
+68-89,20-67
+10-79,9-11
+26-52,26-27
+16-60,12-60
+92-92,7-92
+51-51,56-72
+2-7,6-99
+35-36,36-36
+98-99,8-97
+87-87,4-86
+83-89,68-75
+6-92,6-91
+64-74,65-65
+14-70,15-73
+18-22,18-56
+3-99,2-99
+7-95,2-96
+34-82,34-34
+46-94,45-94
+14-52,1-13
+29-93,28-28
+1-40,2-32
+24-28,23-28
+55-83,18-65
+3-84,1-84
+2-57,7-58
+7-21,3-22
+20-78,20-79
+88-99,32-46
+25-58,57-99
+37-84,37-70
+18-76,18-80
+14-99,31-98
+54-83,54-83
+14-14,2-13
+1-81,1-20
+3-54,4-89
+15-48,14-14
+7-76,75-76
+4-4,3-16
+11-12,11-97
+27-90,28-60
+4-99,1-39
+10-62,41-62
+8-93,9-92
+14-78,27-87
+10-25,24-25
+16-42,15-93
+25-68,76-89
+46-46,2-47
+67-96,65-89
+53-54,53-53
+40-74,15-26
+58-75,57-59
+12-17,16-17
+11-31,30-66
+16-49,17-49
+7-82,15-82
+42-60,41-41
+32-34,3-33
+5-7,6-59
+27-64,94-99
+17-72,34-73
+12-97,12-13
+53-61,52-65
+1-97,1-96
+85-86,27-86
+11-85,10-85
+78-98,19-77
+6-99,98-99
+58-58,10-57
+13-91,12-93
+77-80,76-80
+22-24,23-80
+80-80,28-81
+21-74,5-19
+35-87,36-74
+7-68,82-82
+2-35,10-74
+39-66,40-54
+21-38,29-61
+18-59,41-60
+14-94,97-99
+47-53,54-71
+28-84,49-85
+71-95,70-88
+6-98,6-51
+7-26,27-27
+18-79,2-81
+29-79,28-88
+16-16,16-61
+11-49,48-54
+28-28,27-84
+9-94,94-95
+3-8,2-43
+3-89,89-89
+57-79,60-78
+27-96,28-94
+5-81,61-80
+34-63,64-79
+12-14,15-96
+8-99,24-99
+14-14,15-81
+3-78,12-95
+48-92,48-93
+80-99,1-98
+79-98,87-95
+5-77,77-78
+36-41,36-40
+5-86,1-6
+10-66,11-11
+48-74,76-84
+66-98,19-66
+8-53,52-52
+28-99,19-28
+9-68,63-65
+2-6,1-97
+22-74,22-86
+5-8,7-50
+8-80,7-87
+91-95,77-82
+2-21,97-99
+1-2,3-74
+2-94,1-98
+3-93,94-96
+1-2,1-25
+30-67,30-70
+52-96,96-98
+81-82,71-82
+24-48,4-25
+4-50,6-50
+89-89,88-88
+97-97,18-97
+47-95,46-96
+5-81,4-92
+1-1,2-84
+97-97,1-98
+8-32,2-33
+5-57,4-56
+30-53,25-29
+6-16,4-11
+90-90,33-89
+80-81,80-96
+1-2,1-61
+62-73,62-72
+47-82,47-83
+17-97,17-17
+8-89,2-7
+2-91,67-91
+29-67,29-66
+2-99,3-96
+59-89,88-88
+43-73,43-72
+23-67,23-68
+5-75,75-75
+10-97,9-11
+33-82,33-34
+45-89,46-46
+4-97,4-93
+7-16,16-79
+17-21,20-36
+65-95,96-96
+36-63,37-37
+3-78,77-77
+4-96,5-76
+21-72,20-20
+46-73,46-72
+70-98,71-99
+48-99,8-99
+1-98,1-65
+69-69,20-70
+10-37,38-55
+45-46,36-46
+35-47,35-48
+8-86,7-86
+12-77,38-77
+9-26,5-26
+12-89,12-88
+11-68,29-69
+72-72,5-73
+50-83,10-82
+3-67,3-67
+12-97,12-89
+14-99,15-95
+17-67,18-39
+4-88,4-87
+28-28,22-29
+31-38,31-32
+6-46,6-16
+48-48,47-54
+24-95,25-40
+73-89,73-91
+13-17,11-20
+29-51,30-52
+12-86,12-85
+36-52,35-52
+6-99,7-7
+6-6,2-5
+41-74,73-86
+31-87,73-87
+20-90,20-87
+47-76,46-76
+36-37,38-78
+74-97,73-73
+63-85,62-93
+1-95,97-98
+5-90,5-93
+19-65,52-65
+4-54,21-54
+8-8,7-86
+94-98,2-85
+46-46,47-49
+53-53,52-61
+15-94,13-15
+56-73,27-74
+95-95,3-95
+61-63,7-62
+29-85,97-99
+39-74,73-75
+6-95,43-94
+3-3,3-16
+3-98,99-99
+35-94,36-94
+14-75,76-77
+39-45,38-38
+6-6,7-94
+3-56,7-55
+92-96,36-81
+17-85,18-85
+87-90,10-86
+19-91,18-96
+61-72,60-60
+62-86,85-87
+87-87,23-86
+36-89,37-37
+1-94,1-95
+5-60,5-61
+96-97,96-99
+23-31,15-30
+14-52,52-52
+44-87,43-87
+25-99,20-26
+53-85,55-85
+44-62,43-98
+77-78,64-78
+85-86,85-90
+25-43,41-43
+32-65,64-66
+18-87,18-81
+6-60,7-7
+32-79,78-80
+13-18,13-13
+14-92,14-14
+1-98,1-97
+21-23,22-98
+19-61,18-18
+1-98,3-97
+6-64,14-64
+2-7,33-96
+75-77,11-76
+40-52,31-77
+21-35,15-36
+31-64,13-32
+89-90,51-90
+14-77,34-78
+51-85,52-96
+73-73,20-74
+36-44,41-44
+8-36,32-40
+44-94,93-98
+5-54,5-53
+45-97,4-42
+28-50,25-27
+58-76,58-76
+6-78,77-78
+19-96,20-90
+85-86,1-86
+12-70,11-11
+9-85,86-86
+45-46,44-70
+43-74,10-73
+60-91,11-91
+1-65,64-87
+13-14,14-79
+46-46,45-45
+58-89,59-59
+3-98,1-98
+23-53,8-53
+9-99,8-10
+12-75,12-74
+8-70,24-71
+57-94,8-94
+78-92,77-92
+3-54,1-36
+89-99,87-92
+2-86,86-86
+76-84,83-93
+17-70,18-72
+11-89,10-82
+8-99,9-18
+39-53,39-53
+13-46,13-57
+2-95,49-56
+52-54,52-57
+30-58,31-58
+10-45,10-46
+9-75,8-72
+5-75,1-75
+2-67,4-66
+9-93,10-10
+1-99,75-99
+24-90,24-25
+15-91,15-93
+49-58,64-92
+33-73,73-74
+10-76,12-77
+16-88,87-87
+60-91,50-61
+40-61,39-75
+61-62,2-62
+7-88,7-8
+22-97,21-94
+61-61,25-60
+21-81,9-36
+66-95,16-94
+3-97,1-1
+22-81,21-21
+36-48,35-74
+19-57,29-56
+81-82,14-82
+31-73,73-76
+4-92,8-92
+16-17,16-17
+9-97,10-99
+62-64,63-95
+10-18,3-17
+63-63,63-94
+13-88,8-88
+45-48,7-47
+2-65,3-98
+6-17,5-13
+54-79,53-79
+58-63,58-58
+42-64,8-49
+58-91,2-57
+25-98,12-26
+11-17,10-81
+23-23,18-22
+34-98,33-58
+28-56,29-57
+46-99,16-98
+16-78,17-17
+41-42,37-42
+15-31,14-14
+20-60,61-61
+29-48,23-26
+24-88,5-47
+17-86,4-16
+31-95,31-96
+15-62,22-62
+36-46,7-45
+13-94,9-10
+67-67,3-66
+33-33,21-34
+1-94,3-94
+5-99,6-97
+85-92,19-43
+67-90,81-90
+1-8,9-96
+30-30,31-53
+8-37,7-25
+8-82,4-28
+17-18,17-76
+59-69,34-58
+5-93,20-93
+3-97,99-99
+20-88,94-96
+14-94,92-99
+21-99,22-97
+24-91,23-23
+27-66,28-67
+98-99,1-96
+61-76,18-80
+30-86,85-85
+21-96,20-98
+47-83,10-47
+37-40,36-58
+80-81,21-80
+25-74,4-87
+4-68,67-68
+17-22,5-7
+17-67,25-67
+1-99,1-2
+88-96,84-93
+5-93,97-98
+4-89,90-93
+41-45,42-42
+16-80,15-83
+23-94,23-88
+1-1,2-80
+28-58,59-59
+35-36,36-36
+1-48,1-75
+1-5,14-99
+44-60,44-77
+97-97,6-98
+24-61,3-68
+23-35,24-35
+91-91,92-93
+30-48,29-58
+20-83,13-82
+17-88,18-99
+2-3,2-98
+63-63,59-64
+94-94,1-93
+40-47,5-46
+16-88,16-88
+26-84,25-99
+32-88,31-33
+29-80,30-75
+98-99,14-94
+10-34,35-35
+74-85,75-80
+43-88,42-89
+3-93,17-94
+5-10,4-43
+89-99,81-85
+45-71,46-46
+7-89,6-82
+2-2,2-88
+32-85,5-97
+55-91,54-56
+72-97,21-96
+18-97,18-19
+18-73,19-74
+92-99,7-88
+35-81,36-36
+3-59,60-99
+3-4,3-87
+36-97,28-97
+16-51,38-52
+5-25,4-18
+49-92,28-46
+2-3,4-92
+85-85,47-85
+4-77,78-78
+45-70,71-78
+93-99,79-99
+84-98,48-99
+1-1,1-99
+14-94,13-95
+21-44,22-45
+87-88,6-88
+52-96,95-95
+12-87,11-91
+47-72,11-52
+64-72,34-63
+25-78,26-26
+84-87,82-86
+55-63,23-62
+8-60,59-60
+9-40,3-10
+43-97,80-97
+8-95,3-95
+56-58,57-90
+14-52,15-52
+11-11,11-35
+20-56,21-57
+2-89,2-76
+1-72,3-73
+25-27,26-59
+35-97,35-42
+24-88,1-67
+71-83,71-75
+30-33,32-33
+2-97,2-2
+12-56,5-55
+18-67,23-94
+42-67,68-68
+70-89,18-58
+71-82,27-71
+24-69,25-50
+9-64,8-10
+68-83,9-83
+17-95,98-98
+8-17,16-18
+12-43,15-97
+30-76,30-96
+41-52,10-51
+29-95,2-95
+1-91,90-91
+10-89,8-90
+1-99,31-99
+62-83,33-82
+54-56,11-55
+4-54,53-55
+69-69,26-70
+47-93,46-46
+8-85,9-85
+48-61,48-97
+33-79,32-97
+1-47,9-48
+29-63,64-64
+32-93,27-90
+70-70,67-69
+66-97,67-68
+28-68,28-67
+21-92,4-91
+1-87,3-88
+25-76,21-75
+69-76,72-76
+88-89,40-89
+37-38,37-97
+41-61,60-61
+39-76,75-77
+14-28,3-13
+56-96,56-92
+85-86,9-85
+82-82,68-81
+46-78,40-78
+45-68,44-44
+70-83,30-83
+93-95,20-92
+18-33,29-30
+24-91,66-91
+1-77,14-97
+24-72,73-73
+15-71,15-16
+8-93,7-24
+14-44,43-43
+15-66,15-65
+4-58,9-61
+15-49,33-61
+1-59,1-60
+39-97,38-96
+91-92,4-92
+6-79,3-96
+9-94,95-95
+12-60,23-75
+51-59,40-50
+19-30,20-99
+72-97,97-98
+33-60,58-61
+3-10,3-9
+21-34,20-98
+3-65,53-78
+7-48,7-7
+61-71,59-60
+5-10,4-4
+87-88,8-88
+1-19,12-26
+6-89,26-89
+74-96,74-74
+16-40,10-12
+87-87,9-86
+5-7,8-92
+7-89,6-6
+44-95,45-59
+87-92,4-85
+62-63,43-63
+4-22,4-93
+22-71,21-38
+46-57,56-57
+39-90,39-92
+3-28,2-86
+35-84,84-84
+4-69,9-69
+34-34,35-95
+67-96,1-90
+10-54,45-95
+4-85,3-88
+26-97,25-99
+14-21,22-22
+52-66,24-86
+7-53,8-91
+99-99,7-61
+1-3,4-99
+24-87,24-94
+17-89,16-18
+13-55,30-42
+2-48,21-48
+31-38,37-37
+1-98,1-97
+4-21,1-3
+7-7,6-10
+14-77,68-77
+45-98,50-98
+4-96,5-96
+43-77,15-78
+32-51,24-60
+99-99,1-98
+41-41,42-67
+7-73,9-72
+16-77,15-15
+9-44,43-43
+13-76,14-61
+14-16,15-56
+1-65,8-66
+18-57,18-19
+24-24,31-46
+7-90,90-90
+1-81,13-81
+39-88,40-59
+2-95,1-1
+48-48,22-49
+12-90,11-91
+4-96,1-65
+13-63,36-64
+4-90,5-86
+24-93,96-97
+11-90,89-89
+30-91,30-31
+99-99,28-94
+18-55,14-94
+79-89,10-90
+98-98,27-97
+12-71,4-11
+89-97,21-92
+19-80,18-91
+51-58,13-55
+42-56,41-79
+57-75,57-70
+19-63,33-62
+77-82,7-85
+45-95,96-96
+97-98,11-98
+6-87,6-7
+3-85,67-86
+50-97,50-50
+26-50,50-68
+37-53,12-54
+8-29,8-29
+82-98,1-97
+16-16,17-98
+93-93,91-92
+5-99,4-76
+2-56,2-3
+6-7,6-61
+68-81,3-69
+6-84,7-84
+13-65,64-64
+92-98,5-91
+31-70,32-92
+1-51,51-51
+3-30,3-92
+68-77,53-69
+43-52,46-48
+82-96,69-81
+13-36,12-74
+28-75,61-76
+7-61,8-8
+20-80,20-51
+33-89,83-90
+13-13,14-92
+1-1,1-99
+8-16,15-97
+26-28,26-41
+62-80,62-62
+1-76,35-75
+7-56,7-98
+33-76,32-38
+8-9,8-50
+1-61,61-61
+14-73,14-96
+62-89,89-89
+9-9,8-99
+3-4,4-95
+9-72,8-10
+37-37,36-36
+18-79,24-80
+92-92,9-91
+29-50,29-30
+68-68,65-67
+39-83,79-83
+60-82,39-51
+13-96,95-96
+4-85,68-85
+44-49,48-48
+31-42,30-73
+10-74,9-73
+65-65,32-65
+91-92,8-92
+14-85,84-85
+34-41,14-40
+1-32,1-88
+78-80,74-79
+29-85,86-93
+24-27,28-97
+85-86,57-79
+22-46,41-54
+74-99,5-31
+8-11,11-85
+25-71,24-24
+29-95,11-96
+65-65,66-92
+9-53,4-53
+18-98,19-75
+32-39,35-86
+4-98,2-2
+10-69,1-70
+55-93,94-97
+6-99,2-7
+62-90,70-74
+48-74,26-97
+5-80,15-37
+1-97,84-98
+2-98,68-79
+96-97,46-97
+34-99,98-98
+66-73,65-67
+42-43,25-44
+5-99,5-98
+4-5,4-58
+78-91,6-91
+91-95,16-90
+32-88,88-88
+56-89,55-93
+5-25,4-4
+60-98,61-96
+58-61,57-62
+13-60,59-60
+19-29,20-44
+15-29,14-94
+4-4,5-11
+46-78,6-78
+29-29,29-72
+1-95,68-94
+36-51,50-51
+10-85,9-9
+15-60,16-93
+3-60,5-61
+7-70,11-69
+6-68,5-6
+49-84,40-54
+63-89,76-90
+6-13,9-72
+98-99,5-97
+71-71,33-73
+19-63,18-64
+32-76,20-77
+11-97,12-93
+11-11,3-11
+29-65,19-48
+63-64,13-64
+2-91,92-92
+85-91,86-91
+10-85,11-64
diff --git a/2022/04/test b/2022/04/test
@@ -0,0 +1,6 @@
+2-4,6-8
+2-3,4-5
+5-7,7-9
+2-8,3-7
+6-6,4-6
+2-6,4-8
diff --git a/2022/05/a.rs b/2022/05/a.rs
@@ -0,0 +1,17 @@
+mod common;
+use common::*;
+
+fn apply_move(grid: &mut Vec::<Vec::<char>>, line: &str) {
+ let (n, from, to) = read_move(&line);
+
+ for _ in 0..n {
+ let x = grid[from-1].pop().unwrap();
+ grid[to-1].push(x);
+ }
+}
+
+fn main() {
+ let mut grid = get_grid_from_stdin();
+ apply_moves_from_stdin(&mut grid, apply_move);
+ print_top(&grid);
+}
diff --git a/2022/05/b.rs b/2022/05/b.rs
@@ -0,0 +1,20 @@
+mod common;
+use common::*;
+
+fn apply_move(grid: &mut Vec::<Vec::<char>>, line: &str) {
+ let (n, from, to) = read_move(&line);
+
+ let first_moved = grid[from-1].len()-n;
+ let len = grid[from-1].len();
+ for i in first_moved..len {
+ let x = grid[from-1][i];
+ grid[to-1].push(x);
+ }
+ grid[from-1].drain(first_moved..len);
+}
+
+fn main() {
+ let mut grid = get_grid_from_stdin();
+ apply_moves_from_stdin(&mut grid, apply_move);
+ print_top(&grid);
+}
diff --git a/2022/05/common.rs b/2022/05/common.rs
@@ -0,0 +1,73 @@
+pub type Grid = Vec<Vec<char>>;
+
+fn read_rows() -> Vec<Vec<char>> {
+ let mut rows = Vec::<Vec::<char>>::new();
+ let mut line = String::new();
+ loop {
+ let mut row = Vec::<char>::new();
+
+ std::io::stdin().read_line(&mut line).unwrap();
+ let line_chars = line.as_bytes();
+ if line_chars[1] == '1' as u8 {
+ let _ = std::io::stdin().read_line(&mut line);
+ break;
+ }
+
+ let mut i = 0;
+ while i < line_chars.len() {
+ row.push(line_chars[i+1] as char);
+ i += 4;
+ }
+
+ rows.push(row);
+ line.clear();
+ }
+
+ rows
+}
+
+fn rows_to_grid(rows: &Vec<Vec<char>>) -> Grid {
+ let mut grid = vec![Vec::<char>::new(); rows[0].len()];
+ for row in rows.iter().rev() {
+ for i in 0..row.len() {
+ if row[i] != ' ' {
+ grid[i].push(row[i]);
+ }
+ }
+ }
+ grid
+}
+
+fn next_usize(line: &str, s: usize) -> (usize, usize) {
+ let i = line[s..].find(|c: char| c.is_digit(10)).unwrap() + s;
+ let j = line[i..].find(|c: char| c.is_whitespace()).unwrap() + i;
+ (line[i..j].parse::<usize>().unwrap(), j)
+}
+
+pub fn read_move(line: &str) -> (usize, usize, usize) {
+ let (n, i) = next_usize(line, 0);
+ let (from, i) = next_usize(line, i);
+ let (to, _) = next_usize(line, i);
+
+ (n, from, to)
+}
+
+pub fn get_grid_from_stdin() -> Grid {
+ rows_to_grid(&read_rows())
+}
+
+pub fn apply_moves_from_stdin<F: Fn(&mut Grid, &str) -> ()>(grid: &mut Grid, apply_move: F) {
+ let mut line = String::new();
+ while std::io::stdin().read_line(&mut line).unwrap() > 0 {
+ apply_move(grid, &line);
+ line.clear();
+ }
+}
+
+pub fn print_top(grid: &Grid) {
+ for column in grid {
+ let c = match column.last() { Some(d) => d, None => &'_' };
+ print!("{}", c);
+ }
+ println!();
+}
diff --git a/2022/05/input b/2022/05/input
@@ -0,0 +1,511 @@
+[N] [R] [C]
+[T] [J] [S] [J] [N]
+[B] [Z] [H] [M] [Z] [D]
+[S] [P] [G] [L] [H] [Z] [T]
+[Q] [D] [F] [D] [V] [L] [S] [M]
+[H] [F] [V] [J] [C] [W] [P] [W] [L]
+[G] [S] [H] [Z] [Z] [T] [F] [V] [H]
+[R] [H] [Z] [M] [T] [M] [T] [Q] [W]
+ 1 2 3 4 5 6 7 8 9
+
+move 3 from 9 to 7
+move 4 from 4 to 5
+move 2 from 4 to 6
+move 4 from 7 to 5
+move 3 from 7 to 3
+move 2 from 5 to 9
+move 5 from 6 to 3
+move 5 from 9 to 1
+move 3 from 8 to 4
+move 3 from 4 to 6
+move 8 from 1 to 8
+move 1 from 8 to 6
+move 2 from 8 to 2
+move 5 from 8 to 4
+move 1 from 8 to 1
+move 6 from 6 to 4
+move 1 from 7 to 9
+move 5 from 1 to 7
+move 1 from 1 to 2
+move 2 from 9 to 8
+move 6 from 4 to 9
+move 1 from 6 to 8
+move 3 from 2 to 7
+move 4 from 2 to 8
+move 4 from 9 to 3
+move 6 from 5 to 4
+move 7 from 8 to 1
+move 10 from 4 to 1
+move 12 from 1 to 5
+move 1 from 4 to 9
+move 1 from 2 to 3
+move 2 from 9 to 1
+move 1 from 9 to 3
+move 1 from 6 to 7
+move 1 from 9 to 1
+move 3 from 1 to 3
+move 9 from 5 to 9
+move 2 from 2 to 7
+move 2 from 7 to 4
+move 3 from 9 to 4
+move 7 from 5 to 7
+move 5 from 1 to 3
+move 2 from 4 to 5
+move 1 from 4 to 6
+move 1 from 6 to 9
+move 4 from 9 to 2
+move 12 from 7 to 9
+move 2 from 4 to 9
+move 6 from 5 to 9
+move 3 from 7 to 6
+move 12 from 9 to 6
+move 5 from 9 to 1
+move 1 from 7 to 6
+move 14 from 6 to 1
+move 20 from 3 to 5
+move 5 from 9 to 5
+move 3 from 2 to 8
+move 1 from 6 to 4
+move 1 from 9 to 2
+move 1 from 4 to 6
+move 1 from 2 to 6
+move 16 from 1 to 5
+move 1 from 2 to 1
+move 12 from 5 to 6
+move 1 from 8 to 4
+move 29 from 5 to 1
+move 5 from 6 to 9
+move 20 from 1 to 3
+move 4 from 1 to 3
+move 11 from 3 to 8
+move 1 from 4 to 3
+move 4 from 9 to 8
+move 7 from 1 to 8
+move 2 from 3 to 2
+move 2 from 6 to 7
+move 1 from 9 to 8
+move 10 from 3 to 5
+move 1 from 6 to 1
+move 1 from 7 to 2
+move 3 from 1 to 2
+move 6 from 2 to 4
+move 2 from 6 to 3
+move 4 from 6 to 5
+move 1 from 6 to 2
+move 1 from 2 to 9
+move 6 from 5 to 2
+move 1 from 9 to 3
+move 24 from 8 to 7
+move 1 from 4 to 8
+move 5 from 5 to 4
+move 1 from 4 to 8
+move 1 from 8 to 7
+move 2 from 8 to 9
+move 1 from 9 to 7
+move 6 from 2 to 4
+move 10 from 3 to 7
+move 3 from 5 to 3
+move 1 from 9 to 8
+move 3 from 3 to 8
+move 4 from 8 to 7
+move 1 from 4 to 6
+move 1 from 6 to 4
+move 13 from 4 to 3
+move 17 from 7 to 6
+move 1 from 6 to 3
+move 2 from 4 to 8
+move 3 from 7 to 5
+move 14 from 6 to 7
+move 1 from 5 to 9
+move 1 from 5 to 9
+move 2 from 6 to 7
+move 1 from 5 to 1
+move 1 from 1 to 6
+move 1 from 9 to 3
+move 29 from 7 to 4
+move 10 from 4 to 3
+move 6 from 7 to 5
+move 1 from 6 to 5
+move 1 from 9 to 7
+move 1 from 7 to 2
+move 4 from 3 to 2
+move 1 from 2 to 9
+move 1 from 8 to 5
+move 11 from 3 to 4
+move 24 from 4 to 7
+move 2 from 2 to 5
+move 10 from 3 to 2
+move 6 from 2 to 1
+move 5 from 4 to 7
+move 1 from 9 to 2
+move 3 from 5 to 1
+move 1 from 4 to 6
+move 4 from 2 to 3
+move 5 from 5 to 7
+move 2 from 5 to 3
+move 32 from 7 to 5
+move 16 from 5 to 1
+move 1 from 1 to 2
+move 3 from 2 to 9
+move 1 from 8 to 6
+move 3 from 7 to 6
+move 1 from 2 to 4
+move 5 from 6 to 8
+move 5 from 8 to 6
+move 2 from 9 to 3
+move 1 from 7 to 5
+move 9 from 5 to 4
+move 1 from 9 to 1
+move 2 from 3 to 1
+move 4 from 3 to 6
+move 1 from 3 to 8
+move 6 from 4 to 6
+move 6 from 5 to 9
+move 1 from 9 to 6
+move 1 from 5 to 1
+move 1 from 5 to 4
+move 1 from 3 to 6
+move 1 from 8 to 3
+move 1 from 4 to 2
+move 1 from 2 to 3
+move 17 from 6 to 4
+move 4 from 1 to 8
+move 3 from 9 to 6
+move 1 from 8 to 4
+move 1 from 9 to 7
+move 2 from 6 to 2
+move 1 from 7 to 8
+move 12 from 1 to 9
+move 8 from 9 to 2
+move 1 from 6 to 9
+move 6 from 2 to 8
+move 2 from 8 to 3
+move 18 from 4 to 9
+move 2 from 1 to 6
+move 1 from 6 to 5
+move 3 from 4 to 3
+move 7 from 3 to 8
+move 4 from 2 to 7
+move 1 from 4 to 6
+move 2 from 6 to 4
+move 13 from 9 to 6
+move 1 from 5 to 2
+move 5 from 9 to 3
+move 9 from 1 to 2
+move 1 from 1 to 8
+move 1 from 2 to 6
+move 3 from 7 to 6
+move 2 from 2 to 6
+move 9 from 8 to 6
+move 1 from 7 to 8
+move 1 from 8 to 7
+move 2 from 4 to 6
+move 5 from 3 to 6
+move 17 from 6 to 9
+move 7 from 8 to 4
+move 4 from 2 to 3
+move 17 from 6 to 2
+move 1 from 6 to 4
+move 1 from 7 to 8
+move 1 from 8 to 9
+move 24 from 9 to 6
+move 4 from 3 to 1
+move 1 from 1 to 5
+move 20 from 6 to 4
+move 4 from 6 to 9
+move 1 from 5 to 7
+move 2 from 4 to 2
+move 1 from 9 to 7
+move 25 from 4 to 3
+move 1 from 4 to 2
+move 2 from 1 to 6
+move 3 from 9 to 4
+move 2 from 4 to 7
+move 2 from 7 to 5
+move 1 from 4 to 2
+move 1 from 6 to 3
+move 1 from 1 to 5
+move 5 from 3 to 9
+move 1 from 5 to 6
+move 10 from 2 to 8
+move 9 from 2 to 5
+move 21 from 3 to 6
+move 1 from 7 to 6
+move 2 from 6 to 5
+move 5 from 9 to 7
+move 6 from 7 to 8
+move 19 from 6 to 9
+move 1 from 6 to 1
+move 8 from 8 to 1
+move 1 from 6 to 1
+move 2 from 8 to 5
+move 5 from 9 to 2
+move 6 from 8 to 2
+move 2 from 9 to 7
+move 9 from 9 to 4
+move 7 from 2 to 4
+move 1 from 6 to 4
+move 14 from 5 to 9
+move 1 from 1 to 8
+move 1 from 7 to 9
+move 4 from 2 to 9
+move 16 from 4 to 6
+move 3 from 2 to 8
+move 1 from 6 to 2
+move 2 from 8 to 9
+move 1 from 8 to 7
+move 1 from 8 to 3
+move 3 from 2 to 7
+move 1 from 3 to 9
+move 8 from 9 to 3
+move 4 from 7 to 8
+move 1 from 5 to 4
+move 4 from 6 to 3
+move 1 from 4 to 2
+move 9 from 3 to 8
+move 10 from 9 to 5
+move 8 from 6 to 7
+move 13 from 8 to 4
+move 8 from 5 to 2
+move 3 from 6 to 3
+move 7 from 9 to 6
+move 7 from 7 to 2
+move 2 from 4 to 6
+move 5 from 6 to 2
+move 3 from 1 to 5
+move 5 from 5 to 8
+move 4 from 6 to 2
+move 4 from 1 to 8
+move 15 from 2 to 6
+move 11 from 4 to 9
+move 12 from 6 to 8
+move 1 from 6 to 9
+move 5 from 3 to 7
+move 2 from 2 to 6
+move 6 from 7 to 1
+move 3 from 1 to 3
+move 1 from 4 to 1
+move 1 from 3 to 9
+move 1 from 3 to 9
+move 1 from 7 to 6
+move 1 from 3 to 2
+move 4 from 2 to 6
+move 4 from 2 to 7
+move 1 from 2 to 6
+move 4 from 1 to 6
+move 12 from 6 to 7
+move 2 from 6 to 1
+move 8 from 9 to 6
+move 1 from 7 to 4
+move 14 from 8 to 1
+move 8 from 1 to 5
+move 1 from 3 to 9
+move 5 from 9 to 5
+move 1 from 8 to 9
+move 1 from 9 to 2
+move 1 from 9 to 3
+move 5 from 8 to 3
+move 12 from 5 to 4
+move 1 from 9 to 2
+move 6 from 7 to 3
+move 7 from 3 to 2
+move 1 from 5 to 1
+move 1 from 8 to 3
+move 2 from 1 to 3
+move 2 from 6 to 9
+move 5 from 6 to 5
+move 5 from 1 to 7
+move 4 from 4 to 1
+move 7 from 2 to 8
+move 4 from 3 to 8
+move 1 from 9 to 3
+move 1 from 9 to 5
+move 4 from 1 to 8
+move 10 from 7 to 9
+move 1 from 6 to 7
+move 2 from 8 to 6
+move 6 from 4 to 2
+move 5 from 3 to 1
+move 2 from 6 to 3
+move 2 from 7 to 1
+move 5 from 2 to 5
+move 2 from 7 to 1
+move 7 from 5 to 7
+move 2 from 5 to 6
+move 2 from 5 to 3
+move 3 from 2 to 9
+move 9 from 9 to 3
+move 1 from 6 to 4
+move 3 from 3 to 1
+move 9 from 8 to 2
+move 6 from 3 to 6
+move 8 from 7 to 9
+move 4 from 9 to 8
+move 14 from 1 to 5
+move 1 from 9 to 2
+move 1 from 1 to 5
+move 2 from 3 to 6
+move 12 from 5 to 3
+move 2 from 2 to 8
+move 7 from 6 to 2
+move 12 from 2 to 8
+move 2 from 6 to 2
+move 6 from 9 to 6
+move 1 from 1 to 2
+move 1 from 9 to 3
+move 2 from 5 to 9
+move 1 from 9 to 2
+move 1 from 9 to 4
+move 1 from 3 to 2
+move 2 from 6 to 7
+move 2 from 6 to 9
+move 5 from 4 to 2
+move 14 from 3 to 9
+move 15 from 9 to 4
+move 1 from 7 to 4
+move 10 from 8 to 6
+move 1 from 5 to 9
+move 2 from 9 to 5
+move 10 from 8 to 1
+move 1 from 7 to 4
+move 5 from 1 to 2
+move 2 from 1 to 5
+move 3 from 4 to 6
+move 4 from 5 to 8
+move 5 from 8 to 6
+move 14 from 2 to 9
+move 2 from 6 to 7
+move 3 from 2 to 9
+move 3 from 1 to 7
+move 1 from 7 to 3
+move 3 from 7 to 1
+move 1 from 3 to 6
+move 1 from 7 to 6
+move 1 from 8 to 9
+move 2 from 1 to 4
+move 1 from 1 to 2
+move 16 from 9 to 4
+move 7 from 4 to 8
+move 5 from 8 to 1
+move 2 from 8 to 3
+move 2 from 1 to 7
+move 13 from 6 to 7
+move 2 from 2 to 3
+move 4 from 7 to 4
+move 6 from 4 to 5
+move 4 from 7 to 6
+move 3 from 1 to 2
+move 2 from 2 to 6
+move 3 from 3 to 8
+move 5 from 5 to 3
+move 2 from 9 to 6
+move 3 from 3 to 7
+move 1 from 8 to 1
+move 22 from 4 to 8
+move 1 from 4 to 3
+move 9 from 6 to 3
+move 1 from 2 to 1
+move 4 from 3 to 4
+move 2 from 4 to 5
+move 1 from 1 to 7
+move 4 from 3 to 7
+move 2 from 6 to 1
+move 1 from 6 to 7
+move 18 from 8 to 7
+move 2 from 6 to 5
+move 2 from 3 to 4
+move 1 from 5 to 4
+move 30 from 7 to 6
+move 2 from 1 to 3
+move 18 from 6 to 8
+move 12 from 6 to 4
+move 13 from 4 to 9
+move 2 from 3 to 8
+move 1 from 6 to 2
+move 3 from 7 to 2
+move 1 from 1 to 2
+move 2 from 5 to 9
+move 8 from 8 to 1
+move 1 from 7 to 8
+move 7 from 1 to 3
+move 2 from 4 to 9
+move 1 from 1 to 6
+move 4 from 2 to 1
+move 16 from 8 to 1
+move 1 from 2 to 6
+move 2 from 4 to 8
+move 2 from 5 to 1
+move 4 from 3 to 7
+move 3 from 7 to 1
+move 1 from 6 to 8
+move 1 from 8 to 9
+move 1 from 7 to 3
+move 6 from 3 to 5
+move 1 from 3 to 8
+move 1 from 6 to 9
+move 16 from 9 to 5
+move 4 from 5 to 3
+move 15 from 5 to 1
+move 1 from 5 to 8
+move 3 from 9 to 8
+move 9 from 8 to 5
+move 6 from 5 to 1
+move 4 from 5 to 6
+move 2 from 6 to 4
+move 1 from 6 to 4
+move 1 from 8 to 4
+move 3 from 3 to 6
+move 3 from 6 to 8
+move 1 from 6 to 8
+move 21 from 1 to 9
+move 4 from 8 to 5
+move 3 from 5 to 7
+move 2 from 5 to 1
+move 2 from 4 to 8
+move 2 from 8 to 2
+move 2 from 7 to 8
+move 1 from 7 to 9
+move 1 from 8 to 7
+move 5 from 1 to 8
+move 1 from 7 to 8
+move 4 from 8 to 4
+move 2 from 4 to 5
+move 1 from 2 to 7
+move 1 from 2 to 7
+move 2 from 7 to 6
+move 2 from 6 to 9
+move 1 from 4 to 9
+move 1 from 3 to 4
+move 16 from 1 to 5
+move 16 from 5 to 7
+move 2 from 5 to 4
+move 14 from 9 to 6
+move 5 from 4 to 3
+move 3 from 3 to 6
+move 5 from 1 to 4
+move 2 from 4 to 7
+move 7 from 9 to 4
+move 2 from 9 to 7
+move 10 from 6 to 9
+move 8 from 4 to 6
+move 1 from 8 to 4
+move 1 from 1 to 9
+move 14 from 6 to 3
+move 10 from 3 to 2
+move 3 from 7 to 8
+move 6 from 3 to 1
+move 2 from 7 to 9
+move 5 from 7 to 9
+move 10 from 9 to 1
+move 2 from 4 to 3
+move 1 from 2 to 1
+move 16 from 1 to 4
+move 1 from 6 to 1
+move 2 from 3 to 9
+move 3 from 8 to 5
+move 8 from 7 to 1
+move 3 from 5 to 9
+move 7 from 4 to 6
+move 7 from 1 to 5
+move 2 from 8 to 3
+move 1 from 7 to 8
diff --git a/2022/05/test b/2022/05/test
@@ -0,0 +1,9 @@
+ [D]
+[N] [C]
+[Z] [M] [P]
+ 1 2 3
+
+move 1 from 2 to 1
+move 3 from 1 to 3
+move 2 from 2 to 1
+move 1 from 1 to 2
diff --git a/2022/06/a.rs b/2022/06/a.rs
@@ -0,0 +1,9 @@
+mod common;
+use common::*;
+
+fn main() {
+ let mut line = String::new();
+ std::io::stdin().read_line(&mut line).unwrap();
+ let i = first_index_n_distinct(line.as_bytes(), 4) + 1;
+ println!("{i}");
+}
diff --git a/2022/06/b.rs b/2022/06/b.rs
@@ -0,0 +1,9 @@
+mod common;
+use common::*;
+
+fn main() {
+ let mut line = String::new();
+ std::io::stdin().read_line(&mut line).unwrap();
+ let i = first_index_n_distinct(line.as_bytes(), 14) + 1;
+ println!("{i}");
+}
diff --git a/2022/06/common.rs b/2022/06/common.rs
@@ -0,0 +1,20 @@
+fn all_distinct<T: PartialEq>(a: &[T]) -> bool {
+ for i in 0..a.len() {
+ for j in i+1..a.len() {
+ if a[i] == a[j] {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+pub fn first_index_n_distinct(a: &[u8], n: usize) -> usize {
+ assert!(n > 0, "{} must be greater than 0", n);
+ for i in 0..a.len()-n+1 {
+ if all_distinct(&a[i..i+n]) {
+ return i+n-1;
+ }
+ }
+ panic!("Cannot find {} distinct in a row", n);
+}
diff --git a/2022/06/input b/2022/06/input
@@ -0,0 +1 @@
+qvllndllhzhfzhhdzhddhjdjggvnvhvccmffwllqgqmmfjfqfhhtrrzczjczzlplddfpptqqfbqffmnmjnnqppfjfccgnnmqqsvvdbbgppjvpjvpjjctjjttwtrrdldlcddrvddqndqnqwqwzwfwwzczggcppgzpzhpzhppprfffbhhwmhhtftstrsrvsrvsrvvshvssnwwpllhfhnnfflcltlblzlqlvqlvlcldcccpptggtdgdjdbbrggmbmnncscbssqrrjddvcvgvfflpppgpvphvphhpcpzpzvvctvctvthtwtfwwbrrhhlplmlwwlqlnlhhtmhmmqlqplllrvrgvrvrffzfgfjfjtjmjvmjmwmvvjffmpfphfhvfvmfvmmhpphhltthgttgccqggpzpfpqpcpvcpvcvvqtqvqbbrlrtllmrmllhmhvmhhvzhvzvrrrzjzbbtvvbgvbbfnnqndqnnpnbnbnlnggwqggmgmqmgmbbmccgqcqbccpvcvnnhvvrvlrrcwrcwrcwrwbrwwzbwbdbfddpttntzzjszsnznbndnzngzgccjrcjchcffmlmqqlrqqzsqzzsbsnsttzpztpzpggzrrttbqqplpqlqjjqcqvccdzdccthccvfcvvqvhqhfhhzwzpzwppgpttntssflfjjrwrqrjrppptlltptpvttpfpwpswpppzzsrzssqllbnlljpllrjllsrlrhrdrmdrmrrpsrprnrffgrffdqdhdqhhrhggwqqlddsbsqbqtqdtdhdvhhbdhdzhdhhtrrppzddgfgzgpzpvpfpnpptggltggbnbppqffzfrzzzsbsrrdgrddwsdsqddhpdpbpvpfvppfsfgfngffzmzbzlblclsccvqvqmmjtjqtjjlcjllsddjqddhldlvlrrbgbrgbrrdzzpfpggqnqbqrrqbbgjgppqgpgwgqqndncndnpdnnbvbnvnwnjjgppzlplqqdgqghqgqzggjssqmmwwcfcpptrpprggrppgbplmzwmdtnpqwzcrthqbppwbgcvgqrpfpnbscnhvrllpvpqwnsslcjrqtvdccprvqfrpswtpvzdzlgtmmvppdmhgdbbsmrbqpqspdhpqgfjznqzphrnggcbzhdqrgvzcfzrhtrlssgmjjghqsjtghhnwjffqrrfslfnsvvdvfjqbfpffrrstdhggvbfwtfpfgswqlfdrnjpjmwzptlbmwgghgwqrphcrvfmhrplllgbnjlprllmjwccphsflntgpnbmdbfqcdsbgvrnfznfrlcfvswqfrqvdnbjsflnsmlcrdstzppmcvbgdtcvgztbdzqbwhmwcfvbwjjcdgbnwjwzrrdqhpgscwtnztjsfstzfwftcldjgvdvwbzrlbdslwttbqpnlwbjcjwqgtrgcglsgtdqbqbnqznptzzbwffwlwzvvtdpcjbvhnswzptclpbndcdvsfmcrmwwgzdfsszqjjdztmtsqgfqzjpctfdpwnzbpnzzwngqnghntblndfrnjzdrmgbqmzbdqfzctrgshwqgfgqssqjltrqlzjswjhmpgwwjdwcjpnsvgrvbfpmlmmwzmbdjwsrjthppfrccjgnmwlvqlprgslbwtbbzlqbznczmsmhsfdcqnwblprcpbzzwfllbnldvpjcwsdhglrzjsptmsjdjqzsmgvhjfjrrtvvbjlmzjsntnrggwbpjlrjggfgqzvswtggthzfmfjnmrzrttbzqpwpsnmdtnbfblpfgslgcmjlbdpshnnrbhvwsbrnvdmjqhvhdjhbfzjmqrmqmdthhzvnrmqcnbtwcdjdqfvdgvmfbhrfqnmdncrddggtcppjlznbsnntppjtnsqsrjwvfrzpnzqcrzhhdflfmmtmwcvtpzbqhdwsczffcqhtdbdjblmgnrmhlqcsvcpgghhvwqhdtzpzlpfllchzltqgcwgfqnbzhgzmdwqdlwnvhqmpqjqnjbhjctslghdqvctdmjfwdfpdjnhdndzwsfjzlmsbmfmzvnvpqgqhtngvgqmlrrzsfmwlcwsscvghjvrzjjqbnplnjzqswpblwzwczhwbhhnjmctnmwlbqqfmnlwdcrptlmfjpjrnpcvmhffjhwhmntdzpdjzwzhrrsdvmjlwdtcpvjfmfzfsrgjghhlvmjjjczgmhvrfpgqbnhldwbrjgzmnszzbssfzcggrwmdfvddwsdmnwtwfwlfnwlvzlctfblbtrjvcwjjdljplcrjhwqslppwwtvfqwsjlfmdznmcdzdmgvmmsrfcclcvhtrhlsjzrbjwrjlfnvqhqvmpzmdttnbhfcvnqlrqbcsvtvwfccjstjpmhqgwlnrzjjmfdszflmglrdbpqhqhqsdfzrcljbdvvnlcqfllmnqcjfzjppdsjwshfschzqbnwfqnpwhqnmwsjbtcgvrljsrtzvcvghcjjlqsngglcggqpntrrhbjpbfhmvpltmnfmfdtwnczwfbvjcqnhvppjftwvwsrlhvvcjtsfptpqgrmrqwwddnqmnmfgrlnphbpqhhhvglqgtwvnwvnbssftmwttmfrffwtzhrpqspclvgchwqwcsgwqwwvpgcwngrcfmhbhflwfbfchlphdzdcrflfmfclsngtlwrqcrsgrdzcpdsvvcdbhgtljmbntbbcqgjqfsbfwzlfsnljpjdcnmjlqrwpmlvwgdlrrdgfhdqhzgltmclzgzzhmrbggsmgtpqdrgmjtlzwstrwbpvhppvsmdqvvwwglzjgdswjszqmrdbmshbhhcstpcsjdbvgjnvcmvhbtclrlmlgnvppgvncsrfchdbqjrclwwlnchmcgvshfsbsvvcvjrsgjlnsfqtqmgntffwnqjtldcqbcqhsgztllstswwqnfrswpchqhnfzzzszqjztzfrgrbjdbjlpvqfqrlrmmpbfbbcclrgmnlzwqrjhqrstswjpgsrtnlwsbqthzpvdzllzqmdmbvvtcztftvlwphhjzbfnrvccfmhmvmzlbrzlnppfzcsffjvjmbgpvlwgwszpztjpsrbnftqtdrbnljtbrjzzbwlsvtwtlwptdtnmtncvcblcmdngjzmctlqtzchncccnwjzrrmmmnllbhrnhwtqjsnvcslrqjfbfndqvdlrjshdzmlprtzbtnhthdqhplwzdbnjmgzlzrbzrvrqnflwfmsmbssqnbcddnvdpltpmplpdzvtjrslcdcnrdplwtjtvctwfzhlvwwqqtbqcjjwhhnpmvgzhqmqfgthwbphrmrtdghchsmwghdqjgjgmpddbrtngtvhqgjfrplrdgpbnhqvswrmqhcmsqvsqmqsgwjndwjrbrhvrctmmrmfwpsgfgdlrzpslpflgvwrgcthgcrnhgrzsmqdgdssjgspfhmqfmjfpmwqhnfjdvqzhpndvnbmqglbrjmdrwgmgctrgzpsdvfbmcstcslblmvnprphntgslmlrqwthrndrhtbccgzzfsglhgqztcsnqjwfzbzlvrpbvswbhrwdsrhrrpnrmsbvbvjccbdsdcfrrzpgwjtnnnvjwlcppwzdqsbdzpfjplrlfgvjpsmbzwpwlghnvqgddfjvrsztrpzlfgmqqzrfcgglghndbhgbmldglclhldljjdslvhzshshtqwhqnbzhvqrcmwdmcmhjcrmdmhrwnwcbhvbbrwrbtfdnztwnbpdfjfhgrmcpngftsvbsmsptnwcvvllnmbnsntbzmwnhfdptbtzswtjzdqwjdhprnjwvhzpscjvlsgrhdrmmrmhzhwwtslzdjqmzfncnmgplhnmwrvqhslvchtjcmpzpjpnpfbjptvvwcsmhgdjtsqrjlfpnfdncpqqmpgpvtlvwljlsqbnhtsqgfwlsmdjpgtvgjvjcrnnzmbllqzlrfdnlffgmtphhhgbcjgdlpzqpwmjwtcmdrsmtnmddftwczbsddtppsptbwfvpnfnsqmsgcfqfmnzffzqgcdvwzrgdwhmnzmrlhcdpdsltnsmjzdqwmmpwvjqbbwsrfgzh
diff --git a/2022/06/test b/2022/06/test
@@ -0,0 +1 @@
+mjqjpqmgbljsphdztnvjfqwrcgsmlb
diff --git a/2022/07/a.rs b/2022/07/a.rs
@@ -0,0 +1,12 @@
+mod common;
+use common::*;
+
+fn main() {
+ let fs = FileSystem::build_from_stdin();
+ let sum: usize = fs.iter()
+ .filter(|f| matches!(f.kind, FileType::Directory(_)))
+ .map(|f| f.real_size(&fs))
+ .filter(|s| *s <= 100000)
+ .sum();
+ println!("{sum}");
+}
diff --git a/2022/07/b.rs b/2022/07/b.rs
@@ -0,0 +1,13 @@
+mod common;
+use common::*;
+
+fn main() {
+ let fs = FileSystem::build_from_stdin();
+ let remaining = 70000000 - fs[0].real_size(&fs);
+ let ds: usize = fs.iter()
+ .filter(|f| matches!(f.kind, FileType::Directory(_)))
+ .map(|f| f.real_size(&fs))
+ .filter(|s| *s + remaining >= 30000000)
+ .min().unwrap();
+ println!("{ds}");
+}
diff --git a/2022/07/common.rs b/2022/07/common.rs
@@ -0,0 +1,130 @@
+use std::ops;
+
+pub enum FileType {
+ File(usize),
+ Directory(Vec<usize>)
+}
+
+pub struct File {
+ pub kind: FileType,
+ name: String
+}
+
+impl File {
+ pub fn real_size(&self, fs: &FileSystem) -> usize {
+ match &self.kind {
+ FileType::File(s) => *s,
+ FileType::Directory(c) =>
+ c.iter().map(|x: &usize| fs[*x].real_size(&fs)).sum()
+ }
+ }
+}
+
+pub struct FileSystem {
+ files: Vec<File>
+}
+
+impl FileSystem {
+ fn new() -> Self {
+ Self {
+ files: vec![File {
+ kind: FileType::Directory(Vec::<usize>::new()),
+ name: String::from("/")
+ }]
+ }
+ }
+
+ pub fn build_from_stdin() -> Self {
+ let mut fs = FileSystem::new();
+ let mut path = Path::new();
+ let mut line = String::new();
+ while std::io::stdin().read_line(&mut line).unwrap() > 0 {
+ if &line[..5] == "$ cd " {
+ exec_cd(&line[5..], &mut path, &fs);
+ } else if &line[..3] == "dir" {
+ fs.add_dir(&line[4..line.len()-1], path.last());
+ } else if line.as_bytes()[0] != '$' as u8 {
+ let i = line.find(' ').unwrap();
+ let size = line[0..i].parse::<usize>().unwrap();
+ fs.add_file(&line[i+1..line.len()-1], size, path.last());
+ }
+ line.clear();
+ }
+ fs
+ }
+
+ fn make_parent(&mut self, id: usize, parent: usize) {
+ let p = &mut self.files[parent];
+ if let FileType::Directory(v) = &mut p.kind {
+ v.push(id);
+ } else {
+ panic!("Parent is not a directory");
+ }
+ }
+
+ fn add_dir(&mut self, name: &str, parent: usize) {
+ let id = self.files.len();
+ self.files.push(
+ File {
+ kind: FileType::Directory(Vec::<usize>::new()),
+ name: String::from(name)
+ }
+ );
+ self.make_parent(id, parent);
+ }
+
+ fn add_file(&mut self, name: &str, size: usize, parent: usize) {
+ let id = self.files.len();
+ self.files.push(
+ File {
+ kind: FileType::File(size),
+ name: String::from(name)
+ }
+ );
+ self.make_parent(id, parent);
+ }
+
+ pub fn iter(&self) -> impl Iterator<Item = &File>{
+ self.files.iter()
+ }
+}
+
+impl ops::Index<usize> for FileSystem {
+ type Output = File;
+ fn index(&self, i: usize) -> &File {
+ &self.files[i]
+ }
+}
+
+struct Path {
+ stack: Vec<usize>
+}
+
+impl Path {
+ fn new() -> Self { Self { stack: vec![0] } } // 0 is the id of "/"
+ fn last(&self) -> usize { *self.stack.last().unwrap() }
+ fn clear(&mut self) { self.stack.drain(1..); }
+ fn pop(&mut self) { self.stack.pop(); }
+ fn push(&mut self, dir_id: usize) { self.stack.push(dir_id); }
+}
+
+fn exec_cd(line: &str, path: &mut Path, fs: &FileSystem) {
+ if line.as_bytes()[0] == '/' as u8 {
+ path.clear();
+ } else if &line[..2] == ".." {
+ path.pop();
+ } else {
+ let current_dir = &fs[path.last()];
+ if let FileType::Directory(children) = ¤t_dir.kind {
+ for c in children {
+ if fs[*c].name == &line[..line.len()-1] {
+ path.push(*c);
+ return;
+ }
+ }
+ } else {
+ panic!("Non-directory in path");
+ }
+ panic!("Directory not found in current path");
+ }
+}
diff --git a/2022/07/input b/2022/07/input
@@ -0,0 +1,986 @@
+$ cd /
+$ ls
+dir bnl
+dir dmpsnhdh
+272080 dncdssn.hdr
+dir fcnqg
+6067 hjpmqrq
+dir jvwtm
+dir ldztz
+dir lmmw
+dir wthvqw
+dir zpdnprb
+$ cd bnl
+$ ls
+dir dhw
+dir dmpsnhdh
+dir lmw
+dir vgbqbrst
+$ cd dhw
+$ ls
+237421 vccwmhl
+$ cd ..
+$ cd dmpsnhdh
+$ ls
+dir chf
+dir mjpbhjm
+dir zwhpwp
+$ cd chf
+$ ls
+4679 lmw.wmp
+217367 wwnfv.qqr
+dir zfgznbz
+$ cd zfgznbz
+$ ls
+179409 cnj.gdn
+171574 vglqg
+$ cd ..
+$ cd ..
+$ cd mjpbhjm
+$ ls
+dir crf
+dir hqnj
+dir lmw
+18783 lmw.rwr
+302608 twpq
+166891 vqczlg
+$ cd crf
+$ ls
+32183 dltmqht
+240428 frqqdsr.hbf
+224910 sgtnrvrt
+$ cd ..
+$ cd hqnj
+$ ls
+261723 cgstb
+77979 dmpsnhdh.cmd
+$ cd ..
+$ cd lmw
+$ ls
+50307 fcqrwd
+$ cd ..
+$ cd ..
+$ cd zwhpwp
+$ ls
+141133 gdngm.mps
+$ cd ..
+$ cd ..
+$ cd lmw
+$ ls
+dir dvv
+267473 jmqgrh.dlz
+295139 rrqjwpm
+$ cd dvv
+$ ls
+114536 gmlmbrrw.wdm
+102061 lmw
+$ cd ..
+$ cd ..
+$ cd vgbqbrst
+$ ls
+105102 dmpsnhdh.bgl
+269054 gmwgjf.fzz
+dir jbdtpnw
+245266 jzsjvgl
+216220 lmw.gtb
+dir rflp
+dir twpq
+$ cd jbdtpnw
+$ ls
+27543 cjvvmzp
+$ cd ..
+$ cd rflp
+$ ls
+137601 frqqdsr.hbf
+83444 rrqjwpm
+$ cd ..
+$ cd twpq
+$ ls
+dir rlbsdj
+36846 tnrqzjdd
+$ cd rlbsdj
+$ ls
+56078 bvndq
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd dmpsnhdh
+$ ls
+dir fnpwwhtj
+dir lmw
+9090 mgjpsvl.jlh
+186374 pbb.zln
+$ cd fnpwwhtj
+$ ls
+dir cgp
+$ cd cgp
+$ ls
+81938 hjpmqrq
+281971 jvszf
+151057 wmr.bnf
+$ cd ..
+$ cd ..
+$ cd lmw
+$ ls
+dir bfbv
+56929 pbb.zln
+dir rrqjwpm
+dir sngm
+$ cd bfbv
+$ ls
+92667 qrrttb.jgp
+$ cd ..
+$ cd rrqjwpm
+$ ls
+25739 cqljn.zqw
+91325 dncdssn.hdr
+$ cd ..
+$ cd sngm
+$ ls
+282163 jgrj
+dir lmw
+237524 lmw.dff
+153497 lmw.ntg
+dir lqd
+dir szn
+143535 tvpvc.qpr
+98326 vbfgh
+$ cd lmw
+$ ls
+32484 dncdssn.hdr
+dir glwr
+$ cd glwr
+$ ls
+144719 frqqdsr.hbf
+$ cd ..
+$ cd ..
+$ cd lqd
+$ ls
+231401 dncdssn.hdr
+dir jnjqmvg
+dir lmw
+199704 rrqjwpm
+$ cd jnjqmvg
+$ ls
+104947 trpsrfjz.brg
+$ cd ..
+$ cd lmw
+$ ls
+230298 rrqjwpm.nnv
+158947 wfv.qrb
+$ cd ..
+$ cd ..
+$ cd szn
+$ ls
+197974 frqqdsr.hbf
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd fcnqg
+$ ls
+251609 dncdssn.hdr
+289497 jdjmftqs
+228459 qbmthcq
+$ cd ..
+$ cd jvwtm
+$ ls
+dir dmpsnhdh
+47959 pbb.zln
+dir tlr
+dir twpq
+dir wbgcsw
+dir zjmldjdh
+$ cd dmpsnhdh
+$ ls
+247567 bnl
+102471 bnl.wdm
+80054 fhqvp.hfm
+dir llhp
+dir mnsbh
+dir mpplsfjp
+20844 mtvl.lmp
+$ cd llhp
+$ ls
+180255 dmpsnhdh
+$ cd ..
+$ cd mnsbh
+$ ls
+267627 dmpsnhdh
+$ cd ..
+$ cd mpplsfjp
+$ ls
+dir bnl
+233742 tcnpvqc.tdr
+$ cd bnl
+$ ls
+243223 fcqrwd
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd tlr
+$ ls
+dir vcsngm
+dir wndmt
+$ cd vcsngm
+$ ls
+36434 czs.dnv
+$ cd ..
+$ cd wndmt
+$ ls
+dir fvmtfcqd
+dir nvdb
+dir nwqqgl
+dir sbspgnpm
+$ cd fvmtfcqd
+$ ls
+237025 nzttjt.rzh
+$ cd ..
+$ cd nvdb
+$ ls
+235328 dnrqwqtp.vfc
+51984 rhblt.mfz
+51332 rjhvhw
+$ cd ..
+$ cd nwqqgl
+$ ls
+203534 cjghw
+dir cljbrh
+$ cd cljbrh
+$ ls
+133820 lmw.dnd
+$ cd ..
+$ cd ..
+$ cd sbspgnpm
+$ ls
+270010 hjpmqrq
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd twpq
+$ ls
+dir dmpsnhdh
+dir hbchdjjp
+247649 hjpmqrq
+29891 rrqjwpm
+72407 twpq.crb
+$ cd dmpsnhdh
+$ ls
+251490 dncdssn.hdr
+222231 hjpmqrq
+102058 pbb.zln
+$ cd ..
+$ cd hbchdjjp
+$ ls
+70058 dprrmd.qcd
+230958 tsdbl.bnq
+$ cd ..
+$ cd ..
+$ cd wbgcsw
+$ ls
+292028 bhtfcf
+dir bnl
+dir bqq
+dir ctnlpgt
+247888 hblhfvwj
+dir hbqm
+277949 pbb.zln
+106225 rrqjwpm
+125927 ssqpmlfb.gwm
+dir zqmjwsgz
+dir zwwphs
+$ cd bnl
+$ ls
+dir fbbr
+240500 frqqdsr.hbf
+dir mzfrdl
+25137 srqlww.mcj
+dir tqgrdz
+dir ztrnq
+$ cd fbbr
+$ ls
+84414 mjbw.dhs
+$ cd ..
+$ cd mzfrdl
+$ ls
+135647 bccwgn
+dir cjdptqgh
+dir hwdnrqns
+dir prq
+$ cd cjdptqgh
+$ ls
+147946 mdgl.drz
+11972 pbb.zln
+$ cd ..
+$ cd hwdnrqns
+$ ls
+dir dmpsnhdh
+$ cd dmpsnhdh
+$ ls
+254432 phthmn
+$ cd ..
+$ cd ..
+$ cd prq
+$ ls
+75827 dmpsnhdh.rtl
+$ cd ..
+$ cd ..
+$ cd tqgrdz
+$ ls
+251475 bjwnll.rlw
+$ cd ..
+$ cd ztrnq
+$ ls
+208497 bnl.dtr
+179376 gqnbswcj.hht
+$ cd ..
+$ cd ..
+$ cd bqq
+$ ls
+202201 bnl.lbm
+$ cd ..
+$ cd ctnlpgt
+$ ls
+269484 vsfvzrpr
+$ cd ..
+$ cd hbqm
+$ ls
+74455 bvnfz
+42748 pbb.zln
+$ cd ..
+$ cd zqmjwsgz
+$ ls
+146194 pbb.zln
+$ cd ..
+$ cd zwwphs
+$ ls
+209587 mtbzd.nwb
+$ cd ..
+$ cd ..
+$ cd zjmldjdh
+$ ls
+dir cdq
+dir mdclfbs
+dir tfc
+132043 wrm
+$ cd cdq
+$ ls
+289173 twpq.mrn
+$ cd ..
+$ cd mdclfbs
+$ ls
+64639 bnl.jwf
+dir hpdgt
+72868 hznfj.nmj
+159467 lmw.bfz
+$ cd hpdgt
+$ ls
+52760 fcqrwd
+54661 tzgt.hvh
+$ cd ..
+$ cd ..
+$ cd tfc
+$ ls
+185481 bwntlh
+18925 fcqrwd
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ldztz
+$ ls
+128430 bwz.fcz
+dir dmpsnhdh
+dir lbqgz
+dir znrnj
+$ cd dmpsnhdh
+$ ls
+238193 dncdssn.hdr
+285939 hwfngq.dpw
+$ cd ..
+$ cd lbqgz
+$ ls
+171931 vgrp
+$ cd ..
+$ cd znrnj
+$ ls
+153738 vmwwbjqd
+$ cd ..
+$ cd ..
+$ cd lmmw
+$ ls
+dir bqqnsfdj
+163303 fcqrwd
+43453 frqqdsr.hbf
+33319 hjpmqrq
+dir rlpcqtzg
+$ cd bqqnsfdj
+$ ls
+dir bnl
+2251 hjpmqrq
+14707 rrqjwpm
+dir tlnbvhdl
+$ cd bnl
+$ ls
+33357 bnl.fqp
+151237 bnl.vbs
+40294 dmpsnhdh.hwz
+76455 dncdssn.hdr
+290341 hjpmqrq
+dir lmw
+dir nqw
+$ cd lmw
+$ ls
+dir sfj
+$ cd sfj
+$ ls
+156532 fcqrwd
+$ cd ..
+$ cd ..
+$ cd nqw
+$ ls
+59928 dncdssn.hdr
+$ cd ..
+$ cd ..
+$ cd tlnbvhdl
+$ ls
+183301 hjpmqrq
+$ cd ..
+$ cd ..
+$ cd rlpcqtzg
+$ ls
+258638 dqt.mlc
+$ cd ..
+$ cd ..
+$ cd wthvqw
+$ ls
+224501 pbb.zln
+$ cd ..
+$ cd zpdnprb
+$ ls
+dir bnl
+dir ffg
+dir jljlwpsv
+212081 lrzc.lhj
+dir rrqjwpm
+dir twpq
+dir vlgsrtm
+$ cd bnl
+$ ls
+124009 hjgjf
+74860 hjpmqrq
+84996 lrdl.swf
+dir pnzmp
+$ cd pnzmp
+$ ls
+dir btbtlrs
+128636 nfzf
+$ cd btbtlrs
+$ ls
+107651 hhzbwd.wzj
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ffg
+$ ls
+57918 jwzbs.tnt
+$ cd ..
+$ cd jljlwpsv
+$ ls
+188175 dmpsnhdh.nnb
+46693 fcqrwd
+111557 pbb.zln
+$ cd ..
+$ cd rrqjwpm
+$ ls
+dir bftw
+dir ccsfws
+87225 mccw
+290654 pbb.zln
+147394 twzqc.pbz
+52983 wsvgf
+dir wwfgbzqh
+$ cd bftw
+$ ls
+dir brl
+167154 crs
+dir lmw
+dir rrqjwpm
+dir twpq
+174963 twpq.wjl
+dir vnfhb
+dir wcldzp
+$ cd brl
+$ ls
+297937 wspcnp
+$ cd ..
+$ cd lmw
+$ ls
+166695 mcjql.jrv
+$ cd ..
+$ cd rrqjwpm
+$ ls
+198762 mwn
+$ cd ..
+$ cd twpq
+$ ls
+141835 jlwf.hcd
+$ cd ..
+$ cd vnfhb
+$ ls
+128626 tvmwhq.wfn
+$ cd ..
+$ cd wcldzp
+$ ls
+dir ncq
+dir twpq
+$ cd ncq
+$ ls
+dir wrtw
+$ cd wrtw
+$ ls
+133331 fcqrwd
+$ cd ..
+$ cd ..
+$ cd twpq
+$ ls
+151811 fcqrwd
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ccsfws
+$ ls
+100548 twpq.ppm
+$ cd ..
+$ cd wwfgbzqh
+$ ls
+dir lmw
+dir mfms
+dir pjbjgbcl
+204154 qtflzwm
+226500 vdmjj.htj
+dir wzqbwr
+$ cd lmw
+$ ls
+dir bgl
+95150 dncdssn.hdr
+119653 frqqdsr.hbf
+97941 hjpmqrq
+dir jqthwzj
+$ cd bgl
+$ ls
+dir lmw
+dir rrqjwpm
+$ cd lmw
+$ ls
+233655 wmdldvbz
+$ cd ..
+$ cd rrqjwpm
+$ ls
+242918 frqqdsr.hbf
+227581 hjpmqrq
+dir hsvnmlp
+dir nsch
+25524 pbb.zln
+dir qlgg
+dir twpq
+67453 twpq.fms
+$ cd hsvnmlp
+$ ls
+264517 pbb.zln
+$ cd ..
+$ cd nsch
+$ ls
+7898 cmsdzh
+233270 dmpsnhdh.bsq
+101256 frl
+133902 jzvh.vdv
+dir lmw
+dir sgjsg
+130245 wcftvft
+$ cd lmw
+$ ls
+69572 bnjnc.csp
+$ cd ..
+$ cd sgjsg
+$ ls
+38856 tnzpz.tbq
+$ cd ..
+$ cd ..
+$ cd qlgg
+$ ls
+276013 frbstg.pzb
+$ cd ..
+$ cd twpq
+$ ls
+136454 fhwz.bqb
+94099 rglp
+114026 tsrt.cbd
+26252 zhclpzm.rqf
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd jqthwzj
+$ ls
+128200 lmw.btl
+$ cd ..
+$ cd ..
+$ cd mfms
+$ ls
+274935 dmpsnhdh
+76547 lchwq.dsd
+215701 pbb.zln
+dir rmwtvjt
+$ cd rmwtvjt
+$ ls
+74490 hjpmqrq
+$ cd ..
+$ cd ..
+$ cd pjbjgbcl
+$ ls
+231757 cjcpwwc.wbf
+dir cswvftzs
+dir jtvtg
+dir lmw
+dir tnctbjr
+dir tqsrfhdr
+$ cd cswvftzs
+$ ls
+dir dchqnbns
+dir smf
+$ cd dchqnbns
+$ ls
+94111 szl.hqs
+$ cd ..
+$ cd smf
+$ ls
+dir dlnsgvl
+dir zglt
+$ cd dlnsgvl
+$ ls
+dir dsz
+$ cd dsz
+$ ls
+156473 hjpmqrq
+$ cd ..
+$ cd ..
+$ cd zglt
+$ ls
+295383 frgg.sdp
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd jtvtg
+$ ls
+202254 bftv.rqb
+58419 lmw
+$ cd ..
+$ cd lmw
+$ ls
+8097 fcqrwd
+$ cd ..
+$ cd tnctbjr
+$ ls
+250830 frqqdsr.hbf
+dir gzrcqr
+$ cd gzrcqr
+$ ls
+dir fnzgsnv
+$ cd fnzgsnv
+$ ls
+117215 hjpmqrq
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd tqsrfhdr
+$ ls
+96381 lmw
+$ cd ..
+$ cd ..
+$ cd wzqbwr
+$ ls
+149066 dmpsnhdh.vnd
+dir dpbcgfdr
+dir swp
+14495 twpq.gsb
+dir zhj
+$ cd dpbcgfdr
+$ ls
+12909 dmpsnhdh
+dir jvn
+173491 mnhpr.lpr
+222018 rfqfjmd.jqq
+205077 wbbdrpr.hzj
+dir wzpbbbhm
+$ cd jvn
+$ ls
+117656 vqddrqlq.nfd
+233109 vqqvh.swz
+$ cd ..
+$ cd wzpbbbhm
+$ ls
+143534 pbb.zln
+$ cd ..
+$ cd ..
+$ cd swp
+$ ls
+131295 pbb.zln
+$ cd ..
+$ cd zhj
+$ ls
+166268 pbb.zln
+33734 rrqjwpm.blg
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd twpq
+$ ls
+dir bppvlwqs
+dir bvh
+dir rmcdr
+dir tdn
+2230 whb.lfb
+dir wwtwnvh
+$ cd bppvlwqs
+$ ls
+195026 hvlhgsw
+279259 rrqjwpm
+$ cd ..
+$ cd bvh
+$ ls
+dir lmw
+$ cd lmw
+$ ls
+66958 pdqnd
+$ cd ..
+$ cd ..
+$ cd rmcdr
+$ ls
+dir dmpsnhdh
+182930 grj
+dir pmrdhrth
+119725 qpcqclqh
+77890 sjgfjz
+142855 twpq
+dir zbmcrvbh
+$ cd dmpsnhdh
+$ ls
+dir rrqjwpm
+188474 zgjzpbl.vgv
+$ cd rrqjwpm
+$ ls
+dir bnl
+dir lmw
+7598 vsntvs.pdv
+$ cd bnl
+$ ls
+245600 lmw.mgf
+$ cd ..
+$ cd lmw
+$ ls
+73396 hjpmqrq
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd pmrdhrth
+$ ls
+173155 rrqjwpm.pjw
+178530 smgpzs.qtj
+$ cd ..
+$ cd zbmcrvbh
+$ ls
+124201 fcqrwd
+135578 hjpmqrq
+54356 hnztplsp.qlh
+dir lmw
+58350 pbb.zln
+dir qfrvdm
+dir rcg
+15267 rwbzjpt.djn
+$ cd lmw
+$ ls
+dir bbbll
+28362 bfgfwlf.wvg
+229637 dmpndms.fln
+146121 dncdssn.hdr
+131039 frqqdsr.hbf
+152805 hjpmqrq
+dir mlz
+$ cd bbbll
+$ ls
+169940 dncdssn.hdr
+216888 pbb.zln
+248369 tjpmlr.vmf
+$ cd ..
+$ cd mlz
+$ ls
+115167 bhfv.fts
+$ cd ..
+$ cd ..
+$ cd qfrvdm
+$ ls
+284564 pbb.zln
+$ cd ..
+$ cd rcg
+$ ls
+dir sqzjz
+$ cd sqzjz
+$ ls
+116435 jrstpcpl.zsq
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd tdn
+$ ls
+143971 cmg
+133317 fcqrwd
+dir pstpclp
+133161 tddv
+$ cd pstpclp
+$ ls
+267351 hjpmqrq
+86930 rrqjwpm.dvl
+$ cd ..
+$ cd ..
+$ cd wwtwnvh
+$ ls
+256584 frqqdsr.hbf
+114564 twpq.wrd
+$ cd ..
+$ cd ..
+$ cd vlgsrtm
+$ ls
+148089 bnl.jzj
+119796 cjfphsfw.hnd
+197668 cpw
+dir dmpsnhdh
+dir fjsglr
+dir lmw
+dir lqgrft
+9231 pltdltrs
+dir rmdp
+109777 rncfff.fll
+dir vgjzqjpq
+dir ztnqnfnq
+$ cd dmpsnhdh
+$ ls
+dir lltnrdtv
+dir scthsg
+$ cd lltnrdtv
+$ ls
+179511 pcvmpz
+90913 tbr
+$ cd ..
+$ cd scthsg
+$ ls
+dir rrqjwpm
+$ cd rrqjwpm
+$ ls
+188629 fcqrwd
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd fjsglr
+$ ls
+139754 fcqrwd
+dir pnsjwfzc
+$ cd pnsjwfzc
+$ ls
+113848 lmw
+$ cd ..
+$ cd ..
+$ cd lmw
+$ ls
+54999 dmpsnhdh
+dir ffhcf
+251476 frqqdsr.hbf
+dir jpgqspqw
+198972 nhfclq.pbh
+180380 nqmjnvc.fvr
+dir pfsjwmbc
+213768 rcvccgcd
+$ cd ffhcf
+$ ls
+40478 svmwstq.sjj
+$ cd ..
+$ cd jpgqspqw
+$ ls
+22181 hjpmqrq
+$ cd ..
+$ cd pfsjwmbc
+$ ls
+dir bcvchw
+$ cd bcvchw
+$ ls
+225892 bnl.nwc
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd lqgrft
+$ ls
+dir rrqjwpm
+dir twpq
+$ cd rrqjwpm
+$ ls
+54786 fcqrwd
+3053 tthhqjm.ntd
+$ cd ..
+$ cd twpq
+$ ls
+109355 bnl
+dir lmw
+dir mhgqt
+301291 rrqjwpm.lrm
+271233 twpq.srp
+$ cd lmw
+$ ls
+dir lmw
+dir lngbszqm
+$ cd lmw
+$ ls
+139640 pbb.zln
+$ cd ..
+$ cd lngbszqm
+$ ls
+98279 mqvq.gsj
+283599 rvjd.dvt
+$ cd ..
+$ cd ..
+$ cd mhgqt
+$ ls
+208165 fcqrwd
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd rmdp
+$ ls
+dir bqn
+170956 fcqrwd
+90954 snnttp.gld
+$ cd bqn
+$ ls
+75628 hdrgbrpc
+$ cd ..
+$ cd ..
+$ cd vgjzqjpq
+$ ls
+dir bnl
+dir wpfw
+$ cd bnl
+$ ls
+25911 pbb.zln
+$ cd ..
+$ cd wpfw
+$ ls
+247784 bzll.ltc
+$ cd ..
+$ cd ..
+$ cd ztnqnfnq
+$ ls
+dir dtpzsrfc
+214055 srgzhp.nlr
+$ cd dtpzsrfc
+$ ls
+142652 bhgwj
diff --git a/2022/07/test b/2022/07/test
@@ -0,0 +1,23 @@
+$ cd /
+$ ls
+dir a
+14848514 b.txt
+8504156 c.dat
+dir d
+$ cd a
+$ ls
+dir e
+29116 f
+2557 g
+62596 h.lst
+$ cd e
+$ ls
+584 i
+$ cd ..
+$ cd ..
+$ cd d
+$ ls
+4060174 j
+8033020 d.log
+5626152 d.ext
+7214296 k
diff --git a/2022/08/a.rs b/2022/08/a.rs
@@ -0,0 +1,42 @@
+use std::cmp::max;
+mod common;
+use common::*;
+
+fn mark_visible(grid: &mut Grid) {
+ let update = |elem: &mut (i8, bool), m: &mut i8| {
+ elem.1 = elem.1 || elem.0 > *m;
+ *m = max(*m, elem.0);
+ };
+
+ for row in &mut *grid {
+ // From left
+ let mut m = -1;
+ for t in &mut *row { update(t, &mut m); }
+
+ // From right
+ let mut m = -1;
+ for t in &mut row.iter_mut().rev() { update(t, &mut m); }
+ }
+
+ for j in 0..grid[0].len() {
+ // From top
+ let mut m = -1;
+ for i in 0..grid.len() { update(&mut grid[i][j], &mut m); }
+
+ // From bottom
+ let mut m = -1;
+ for i in (0..grid.len()).rev() { update(&mut grid[i][j], &mut m); }
+ }
+}
+
+fn count_visible(grid: &Grid) -> usize {
+ grid.iter()
+ .map(|row| row.iter().filter(|c| c.1).count())
+ .sum()
+}
+
+fn main() {
+ let mut grid = read_grid_from_stdin();
+ mark_visible(&mut grid);
+ println!("{}", count_visible(&grid));
+}
diff --git a/2022/08/b.rs b/2022/08/b.rs
@@ -0,0 +1,47 @@
+use std::cmp::max;
+mod common;
+use common::*;
+
+fn count_visible_from(grid: &Grid, i0: usize, j0: usize) -> usize {
+ let x = grid[i0][j0].0;
+ let mut top = 0;
+ for i in (0..i0).rev() {
+ top += 1;
+ if grid[i][j0].0 >= x { break; }
+ }
+
+ let mut bottom = 0;
+ for i in i0+1..grid.len() {
+ bottom += 1;
+ if grid[i][j0].0 >= x { break; }
+ }
+
+ let mut left = 0;
+ for j in (0..j0).rev() {
+ left += 1;
+ if grid[i0][j].0 >= x { break; }
+ }
+
+ let mut right = 0;
+ for j in j0+1..grid[0].len() {
+ right += 1;
+ if grid[i0][j].0 >= x { break; }
+ }
+
+ top * bottom * left * right
+}
+
+fn max_view_factor(grid: &Grid) -> usize {
+ let mut m = 0;
+ for i in 0..grid.len() {
+ for j in 0..grid[0].len() {
+ m = max(m, count_visible_from(grid, i, j));
+ }
+ }
+ m
+}
+
+fn main() {
+ let grid = read_grid_from_stdin();
+ println!("{}", max_view_factor(&grid));
+}
diff --git a/2022/08/common.rs b/2022/08/common.rs
@@ -0,0 +1,13 @@
+pub type Grid = Vec<Vec<(i8, bool)>>;
+
+pub fn read_grid_from_stdin() -> Grid {
+ let mut grid = Vec::<Vec<(i8, bool)>>::new();
+ let mut line = String::new();
+ while std::io::stdin().read_line(&mut line).unwrap() > 0 {
+ let row = line[..line.len()-1].as_bytes().iter()
+ .map(|b| ((*b as i8) - ('0' as i8), false)).collect();
+ grid.push(row);
+ line.clear();
+ }
+ grid
+}
diff --git a/2022/08/input b/2022/08/input
@@ -0,0 +1,99 @@
+112121202020313300020340412130241443213110212555412551412441344012102310202342110301131001201210222
+002220000133232333300400324440200340331442222154322435351134115104433131022400301210231103320120102
+002111110023312202140422121302301411425412143121451113531553512221212012141140202223332010130102121
+200121112032232121304410232442313124341433152252314544515325125233341244332012020324021110233002001
+201022212100303122230042110420411144235142233535353242115241433555244414021310121244221013322222121
+011133013013221340022444040034222334222333233513241314324332525223122512421234021412140011030323220
+210300120303001122232014221422523555232331235422254211412225214325215241553042040303041423101011002
+003120002332341304133020544511125535535541345465624233512532523153125344553310344313112440310203011
+131130201012400142322154551413323211211264453362355545322422255141341455331312144311201120100013210
+231231113320032112042452344144421222532325455233246353364224262633314514222114310222010411123020310
+130132323324003111222144335255232253526222366424453236522644225645542113443452221300403213402211010
+113120324042321002433123114511424246663652545323562652666642343346224141215312351154031420431123313
+322103103420203222134243312435226546235454342354423362646633563243445363453321134444313221424211210
+222002200102244012425542311135622554533554536552565362325262535422342364211432245513321404214403103
+020312030211000311145233135522425335364263235236633766423525523653365556233412434131421431421413032
+210200210122104332244324435223345455654634767746775377345346266325246256554325112245151433442112120
+122021103003325452113155263653362555455536744343555667465337737332644556355541512314415321432122010
+302130331324344154351152233526435626553676357536566754666777544543643553226655255322235341014410100
+314012231321215344153565545233452474545654556345434346477343637634766266254223421545221444103004003
+203142142342444551513532553564436657337357765377547636675373434576744336526346456543411441023143110
+012342201025331211122452444533576366457663645436375557334447647673566472636623645223251551503132201
+242040141354332534632526224223663666376753663766575676333754654644753446365223356333455541211334020
+304212105422512243642223324443434437444774475647656876467367634464365546355325563651434541552020333
+411420043555145455366465334765477455434665856478775445748748844536643753776566362432434143454420144
+401414045521554536566434665734634475568447478784884574576588667675763475753664255466323144315114340
+403203444553445263226363636763747365744764846865845556768875448846334555367546232343531522434303222
+320101251535223652234326457665537657586786457478765885578775686476536463546335334642346321452233131
+101012145413152534234557444577344864876885844857544755664447444658566665757343254462522531514251101
+340341152532244444232667437647346678855466568676685668454547775878787354745333434364264512332351234
+034022314552563333466574354365446884777648857896869775765876486687448874547744636623356245124411300
+434115222252325233267546336767445666887887795778879879888964665878876674757366746353365644321332143
+312035533543623363556753755356877487485687695957956976755556874674844755665746737526623244522514143
+420252322135326524253347754684544485747997555758865876756898776645768885645667637664454254124241132
+042551521433445422576644675485868857686859585876589677967989879564666758475665333623554365252143351
+404455122524562436436545777675857467559889565668857859685895859976758774886545433533522546412531113
+402414213444443632667535548848565847669657785977756989557799965677887465558473374753636263414433431
+022221152324544456367356377556875457665895668676988667859858876695687554757534736365524353324555445
+344111222625453364363635787885744595658769866898866968696568596595864444764473337656423523432142535
+225434342232366345537763675578769565995877778767697786787965759585779855884865343633323444422312351
+035315413543653543334365848874759855766697967679779767999679566665785768858653734543735645643221454
+023235144645352563656735676476699588575688669887679986967789786578779847658656675663653453233341153
+142225254342433566337738656784888579869898976766696886867989878587588888556744335476656546565134514
+332531546644465434575456856855557977598878768976688677796996689765566874765455375433552656652141222
+245115244422246534474538846486987698857687868676878977996687768986655856867454644744464462545223145
+534255233266234565357356454786989999898896977688879977977896669857699764786566736463343326443154122
+454354332542262477736688458567665797769979688789788788987866776769877696655848467435475444463335241
+512543144352562655357675475585978965976868699798788899789679876985786899685774865763673624244331431
+324412256535565334657448674688895886877986668889799998798889878866685759475645457456546355544251525
+115513233345333374765468446775577596767887988887878879877777968697669577748775734356333445243551434
+415151565352224735474558556859799577886898999998979889789968896887667799778755865475767222365331232
+341542233524534557363486747546566765697666978897898998779776898687767558456588645347447452326635211
+141352533235633637755547684876556558796988688897999988799797887989695558885678545676777233242514541
+521224242633256545773565667556868787766779689977797878779776688978856968445584875373474655564453414
+212223344626635634464468564667887899889688667779987877977666888978896755878447456437466626246242154
+234115532222663767644584477756969899977977999989879987999976887779867996588585775466444223626514313
+135352514355535475547475454586885687868789797787897877999696989878678658675857877374766244666335415
+245312112534242364465384488548568678767769779778898997999876767795755964548464847565732454524524223
+021525515246626734753566444568597959566979986967678896977989678777787774766445653374342254643512525
+154333554224543664547576668488558779569899998698676696676768688689695868756558334756732443435414211
+241121123663636476553777547778679898575887899887676677898688967655685877474554463766356464665314411
+042314546263224256647665654464888598856776787699868899986977858568579785688458575346453652462152344
+123331145253442347344577548844655756795759896669869969898669978977675445684486336563564633463521424
+441245214645233266655474685847446687769676869796966869876898656576557445456865677774743333555121233
+125144145355562535553453348876854556596588579796889867979959976599967847546665344765436664421452124
+005214145522463625374665767445668477766757899558986688996855569799556464475877546663265544522533142
+424213534345444245575767446587747766879868999866679969656557796695754688786576454364542222333552433
+340123443165235626753533465668444668759977876797965776795859756987877778467766435676633663325451242
+003233434214334366657377335845776467875798576979767697579687977648857565845364473624435244552521232
+424135233343456444347333753548856886767998675667957686789866998677467875563746577654546663332345512
+142144412143652453363555366356464857764776776669865675576766767657655474454367647255355333454132411
+114044434535536365647343757563768767554848877759975798758895468485667587677463336535634542315521124
+243044411234356654655645476665375787765667655868887868786658648788875454747665334553525245122313313
+223005135155362266463337346655467578858875455446758445778678456564555447754654655642444335244151100
+441031313535133543536645563565447868478877557885475885785484588664864367437333352334646552545540434
+230403434533122325663365655775564467566764578557546875654785658764434354637753535553443132323132432
+231103055415354435244636576576467643575457665666647886566848556463753663346723326243525141135130424
+234240311433354434253255264577573744567747565865655865884455858675735663776644624454624322251114322
+001140425351442116425436424534333635755754445857766654848476464365374745573246334553145131221240002
+423442125121142242554242262463344446436337646568454446465366647477574476743566434562422322213241112
+041120244223522424262622532426564364336575645645643473455773734743736536462532635531424223442140002
+333213342044141312256465444645743463747737775353476574446663366477433766453534634424144243324342330
+123301211302132311214446544655333545346646756574364363763577337443636433244534466131243245142313041
+333302233005545533332445234232634365637756745756665533337455656536362324645335641322232425441330441
+210101031320143231223346443232362353735643457655456457447337655745423533326242244322432513011341141
+103110441134453455534214566635432365634456656643365735556363677266633236436433421143354400234124322
+210103104441245232113425543552436226532532734735737666776674646353226636524623254312414101401413013
+020024442231000453252454154546643563663622535463445755356246553442265263346551444421542422240011133
+031020232402201014325415255432463233224332466352332362464633465245446636555422514435430143120003112
+310302320413232125411435155524536333442626366353663655223253243262552253454113353253031242202102210
+221201232400342023452154554354353535536252463345626432342652363255555242425543353242440134432103103
+210032311140434341431423452253535242446256556466223466635264232223251545121524142114121403343313003
+120033031102121020314222514435233222253442525525522546426665636231521441532113451340400133032210231
+210023013101112320231215311434153455555125335452263535435665554254354533423243412221004001101231111
+221223223131114201030343552243332413432225514566333324653532145252122232542252133334211422030222312
+222331111212014202022011214444443411412221134525134425141412252142514152354243232311422120203312310
+110131122101302404410231242111542122454123223331222324435451342542314134420104111021220102332003000
+201221202213022021032201013424223253221544343453433115235543553513232252242121443333323311020103222
+001200323302010132410244321011414224212135145444322543324442532241244022442341044312322333033210110
+012221120210002201233041204141124034134123443133233422423453224352410321301023102020300131022311221
diff --git a/2022/08/test b/2022/08/test
@@ -0,0 +1,5 @@
+30373
+25512
+65332
+33549
+35390
diff --git a/2022/09/a.rs b/2022/09/a.rs
@@ -0,0 +1,6 @@
+mod common;
+use common::*;
+
+fn main() {
+ println!("{}", simulate(2).len());
+}
diff --git a/2022/09/b.rs b/2022/09/b.rs
@@ -0,0 +1,6 @@
+mod common;
+use common::*;
+
+fn main() {
+ println!("{}", simulate(10).len());
+}
diff --git a/2022/09/common.rs b/2022/09/common.rs
@@ -0,0 +1,46 @@
+use std::collections::HashSet;
+
+fn get_dir(c: char) -> (i64, i64) {
+ match c {
+ 'R' => (1, 0),
+ 'L' => (-1, 0),
+ 'U' => (0, 1),
+ 'D' => (0, -1),
+ _ => panic!("Unexpected char")
+ }
+}
+
+fn follow(lead: (i64, i64), trail: (i64, i64)) -> (i64, i64) {
+ let max1 = |x: i64| x / (2 - (x%2).abs());
+ let d = (max1(lead.0 - trail.0), max1(lead.1 - trail.1));
+ (trail.0 + d.0, trail.1 + d.1)
+}
+
+fn step(r: &mut Vec<(i64, i64)>, d: (i64, i64)) {
+ r[0] = (r[0].0 + d.0, r[0].1 + d.1);
+ for i in 1..r.len() {
+ if (r[i].0 - r[i-1].0).abs() > 1 || (r[i].1 - r[i-1].1).abs() > 1 {
+ r[i] = follow(r[i-1], r[i]);
+ } else {
+ break;
+ }
+ }
+}
+
+pub fn simulate(n: usize) -> HashSet<(i64, i64)> {
+ let mut r = vec![(0, 0); n];
+ let mut visited = HashSet::<(i64, i64)>::new();
+ visited.insert(r[n-1]);
+
+ let mut line = String::new();
+ while std::io::stdin().read_line(&mut line).unwrap() > 0 {
+ let dir = get_dir(line.chars().nth(0).unwrap());
+ let l = line[2..line.len()-1].parse::<usize>().unwrap();
+ for _ in 0..l {
+ step(&mut r, dir);
+ visited.insert(r[n-1]);
+ }
+ line.clear();
+ }
+ visited
+}
diff --git a/2022/09/input b/2022/09/input
@@ -0,0 +1,2000 @@
+R 2
+D 2
+U 2
+D 1
+L 1
+D 2
+R 2
+L 2
+R 1
+D 2
+L 1
+U 2
+R 1
+D 1
+R 1
+L 1
+D 1
+R 2
+U 2
+L 2
+R 2
+U 2
+R 1
+L 1
+D 2
+R 1
+D 1
+R 1
+D 1
+R 1
+L 2
+R 1
+D 1
+L 1
+U 2
+L 1
+D 1
+L 1
+R 1
+U 2
+D 1
+U 2
+L 2
+R 2
+D 1
+L 1
+R 1
+D 1
+L 1
+U 1
+R 2
+D 1
+R 1
+D 2
+L 1
+D 2
+L 1
+D 2
+R 1
+L 1
+D 2
+L 1
+R 1
+D 2
+L 2
+R 2
+L 1
+U 2
+R 1
+U 2
+R 2
+U 1
+D 1
+U 2
+L 1
+D 2
+L 2
+R 2
+L 1
+R 1
+U 2
+D 1
+R 1
+L 2
+U 1
+D 2
+U 1
+L 2
+R 2
+D 1
+U 1
+L 2
+U 2
+L 1
+R 1
+D 1
+R 2
+D 1
+R 1
+D 2
+R 1
+D 1
+R 1
+D 2
+L 2
+U 2
+L 1
+D 1
+L 1
+R 2
+U 1
+D 1
+U 2
+L 2
+D 3
+L 3
+U 3
+R 1
+D 3
+R 1
+D 3
+R 2
+D 2
+U 3
+D 2
+L 3
+R 3
+U 3
+R 1
+U 3
+D 3
+L 1
+D 2
+U 1
+R 2
+L 2
+R 3
+L 2
+D 3
+L 2
+R 1
+D 1
+U 1
+D 2
+R 2
+L 1
+U 1
+R 3
+U 2
+D 3
+L 3
+U 2
+L 3
+R 2
+D 2
+U 2
+R 1
+U 3
+R 2
+D 1
+U 2
+D 3
+U 2
+R 3
+U 2
+L 3
+U 3
+D 2
+R 3
+U 3
+L 3
+U 2
+L 1
+D 3
+L 2
+D 3
+R 3
+L 2
+R 3
+D 1
+U 1
+L 3
+R 3
+D 2
+L 3
+U 2
+R 2
+U 1
+R 3
+D 3
+R 1
+U 2
+L 2
+U 1
+R 1
+U 1
+D 2
+L 2
+R 1
+D 3
+R 1
+D 3
+U 1
+R 2
+U 2
+L 2
+U 2
+L 3
+D 3
+U 2
+L 3
+U 1
+L 2
+D 1
+U 3
+L 2
+R 3
+D 1
+R 3
+L 3
+U 1
+L 3
+R 2
+D 3
+U 3
+L 3
+D 4
+L 1
+U 1
+R 3
+L 1
+D 4
+U 4
+L 4
+D 4
+U 1
+D 3
+R 1
+D 4
+L 1
+U 2
+D 1
+R 3
+L 4
+D 2
+U 2
+R 1
+L 4
+U 4
+R 4
+D 1
+R 3
+D 1
+R 4
+U 4
+D 1
+U 3
+D 4
+L 3
+R 2
+D 4
+L 2
+U 4
+D 3
+U 4
+D 2
+U 2
+L 3
+R 4
+L 4
+U 2
+L 1
+U 4
+D 4
+R 4
+U 4
+R 2
+U 4
+R 1
+U 3
+R 3
+U 4
+R 4
+U 2
+L 1
+U 3
+D 4
+L 1
+R 1
+L 2
+R 2
+D 2
+U 3
+R 3
+L 1
+D 2
+R 4
+D 1
+R 4
+L 2
+U 4
+D 2
+R 4
+U 2
+D 4
+R 1
+U 3
+L 3
+D 2
+R 2
+U 1
+L 4
+R 1
+U 2
+R 4
+D 3
+R 1
+L 2
+U 1
+R 2
+L 2
+U 2
+R 3
+L 2
+D 4
+U 4
+L 1
+U 2
+D 1
+U 2
+D 1
+L 2
+R 4
+L 5
+D 2
+U 5
+L 1
+R 2
+L 3
+U 3
+D 3
+L 1
+D 1
+U 4
+L 4
+U 3
+D 5
+R 1
+L 4
+U 1
+L 2
+R 4
+D 1
+L 4
+D 1
+U 4
+D 1
+L 2
+D 5
+L 5
+D 4
+R 3
+U 2
+L 4
+U 4
+L 4
+R 5
+D 1
+L 2
+R 5
+U 4
+D 5
+L 2
+U 4
+D 1
+L 3
+R 5
+D 4
+L 1
+D 3
+L 3
+U 2
+R 2
+D 4
+L 4
+U 1
+D 2
+L 5
+D 2
+L 2
+U 3
+R 3
+U 3
+D 2
+U 4
+R 3
+L 3
+D 2
+L 2
+R 3
+D 2
+L 3
+R 4
+U 4
+R 4
+D 2
+R 1
+D 1
+L 4
+R 4
+D 3
+R 2
+U 4
+L 2
+D 3
+U 4
+L 3
+R 5
+L 2
+R 1
+D 4
+L 5
+D 2
+U 5
+L 4
+U 2
+R 3
+L 4
+R 1
+U 3
+R 3
+L 2
+U 2
+L 3
+R 5
+L 3
+R 3
+U 3
+L 3
+U 5
+D 4
+U 5
+D 4
+L 4
+D 2
+R 5
+L 3
+U 2
+D 3
+L 4
+R 1
+D 1
+R 5
+L 3
+R 2
+L 3
+U 3
+D 1
+U 5
+R 2
+L 2
+D 5
+R 3
+U 4
+R 3
+L 1
+R 6
+L 4
+D 4
+U 4
+R 4
+U 2
+R 4
+D 1
+U 3
+R 1
+U 5
+D 3
+L 4
+R 5
+L 3
+U 6
+L 5
+D 3
+R 1
+D 2
+U 5
+L 1
+R 5
+U 4
+R 1
+U 1
+R 3
+L 2
+D 5
+U 4
+L 1
+U 2
+R 3
+L 5
+R 2
+D 3
+U 3
+D 6
+R 1
+D 2
+L 3
+R 3
+L 3
+U 4
+R 4
+U 4
+R 6
+U 1
+L 6
+R 6
+L 4
+U 6
+L 2
+D 1
+R 5
+L 5
+U 3
+D 6
+U 5
+L 4
+U 2
+R 1
+L 3
+D 6
+U 5
+R 4
+U 2
+D 3
+R 4
+L 1
+D 4
+U 6
+R 1
+D 6
+U 2
+D 5
+U 4
+L 4
+R 6
+D 2
+R 6
+L 1
+R 3
+D 4
+R 5
+L 6
+U 5
+L 3
+R 6
+U 1
+L 3
+D 7
+U 2
+D 5
+R 5
+D 7
+R 6
+D 6
+R 7
+D 7
+L 3
+R 4
+L 1
+U 6
+R 2
+L 7
+U 7
+D 1
+R 1
+D 1
+U 5
+R 4
+U 2
+D 5
+U 6
+L 2
+R 1
+U 5
+L 1
+U 7
+R 1
+D 2
+L 4
+D 4
+L 5
+U 4
+L 2
+D 5
+R 7
+D 7
+R 5
+L 3
+U 7
+R 7
+D 1
+L 2
+U 3
+L 2
+U 7
+L 2
+U 3
+L 6
+D 6
+L 2
+D 6
+L 6
+U 3
+L 3
+U 7
+D 3
+L 4
+U 5
+D 5
+L 4
+D 7
+U 3
+R 7
+D 5
+R 3
+L 6
+U 2
+L 2
+U 1
+L 1
+U 4
+D 7
+L 7
+D 2
+U 6
+L 2
+U 2
+L 4
+R 3
+L 6
+R 2
+D 7
+L 6
+D 3
+L 6
+R 1
+U 4
+R 6
+L 7
+D 7
+R 4
+U 7
+L 6
+R 3
+D 1
+U 3
+D 2
+U 3
+R 2
+L 7
+U 1
+R 4
+D 4
+U 2
+R 5
+D 5
+R 4
+L 3
+U 1
+R 7
+L 5
+D 4
+L 3
+D 7
+U 2
+D 4
+U 4
+L 1
+D 4
+R 7
+L 6
+U 3
+L 4
+D 5
+U 1
+D 1
+L 6
+R 7
+D 1
+L 4
+D 1
+L 5
+R 8
+D 4
+L 8
+R 4
+D 4
+U 3
+L 5
+R 5
+L 8
+U 4
+R 2
+D 6
+R 5
+L 1
+U 8
+L 1
+D 5
+U 5
+D 4
+L 6
+U 6
+D 8
+R 6
+D 3
+U 7
+R 8
+D 7
+L 2
+U 4
+D 4
+L 2
+R 2
+U 5
+L 4
+R 3
+L 2
+U 5
+D 8
+L 8
+D 3
+U 4
+D 2
+L 2
+U 4
+R 5
+L 6
+U 4
+R 5
+U 4
+L 7
+D 8
+R 8
+D 7
+R 5
+D 6
+U 2
+R 1
+D 3
+L 6
+U 3
+D 5
+U 6
+L 7
+R 1
+L 4
+R 4
+L 4
+R 3
+L 4
+U 3
+D 7
+U 8
+D 4
+R 6
+L 7
+R 2
+L 2
+U 7
+D 2
+R 1
+D 5
+U 1
+D 7
+R 2
+L 8
+R 8
+U 4
+R 9
+L 4
+R 5
+L 2
+D 6
+L 9
+U 2
+R 5
+D 4
+R 9
+U 4
+D 8
+R 9
+U 5
+D 4
+U 4
+L 4
+U 3
+R 5
+L 8
+D 9
+U 2
+L 8
+U 5
+D 4
+L 1
+D 4
+U 3
+D 7
+U 5
+D 5
+R 9
+L 2
+D 5
+L 7
+D 1
+L 2
+R 6
+D 9
+U 1
+L 6
+R 2
+D 2
+R 5
+D 8
+R 2
+D 3
+L 4
+D 5
+R 2
+D 8
+L 3
+D 6
+U 2
+L 4
+D 9
+L 6
+R 5
+L 7
+U 2
+D 8
+U 5
+L 6
+U 1
+L 9
+R 9
+D 1
+R 3
+U 9
+L 2
+U 8
+R 8
+D 8
+R 7
+U 7
+R 6
+L 2
+U 4
+D 2
+L 4
+U 4
+D 2
+R 8
+L 6
+R 9
+D 9
+L 6
+D 4
+L 5
+U 8
+D 2
+R 6
+D 7
+U 3
+R 6
+L 9
+U 6
+L 8
+U 8
+D 6
+U 9
+D 5
+U 8
+L 6
+R 6
+L 6
+R 9
+L 2
+U 4
+L 4
+U 1
+D 4
+R 1
+U 7
+D 5
+R 4
+U 4
+D 5
+L 9
+R 2
+U 5
+L 2
+R 10
+L 5
+R 1
+L 2
+U 3
+D 2
+R 7
+L 2
+R 6
+L 3
+R 6
+U 7
+L 1
+U 6
+R 6
+U 2
+L 3
+R 3
+L 1
+R 9
+L 5
+U 9
+L 9
+D 9
+U 4
+D 2
+R 6
+D 6
+R 8
+D 2
+U 6
+L 5
+R 2
+U 10
+L 3
+D 6
+R 3
+D 6
+U 2
+D 7
+R 1
+U 7
+D 2
+R 8
+L 5
+U 4
+L 5
+R 6
+U 6
+D 1
+L 5
+D 5
+R 5
+D 4
+L 5
+U 3
+R 4
+L 5
+R 2
+L 5
+D 10
+R 4
+L 2
+R 4
+L 7
+U 9
+R 3
+D 6
+R 7
+L 10
+D 7
+U 4
+L 9
+D 6
+L 7
+R 3
+U 7
+R 5
+U 6
+L 1
+U 2
+L 5
+D 6
+R 8
+L 7
+R 7
+D 1
+U 9
+R 1
+L 4
+U 4
+R 1
+L 3
+D 2
+L 8
+D 10
+L 9
+D 8
+R 5
+D 6
+L 7
+D 2
+U 11
+D 2
+U 6
+L 3
+U 8
+D 11
+U 9
+D 9
+R 11
+U 11
+L 8
+U 11
+R 11
+U 2
+D 6
+R 11
+D 7
+L 6
+U 5
+R 1
+L 3
+D 11
+U 3
+D 5
+R 4
+U 4
+D 8
+L 6
+U 1
+R 10
+L 5
+D 3
+U 8
+R 7
+L 8
+R 2
+U 6
+D 9
+R 1
+D 1
+R 3
+U 3
+L 10
+U 7
+R 1
+D 3
+U 6
+L 10
+R 6
+L 6
+R 4
+L 2
+R 10
+L 11
+U 5
+R 5
+U 5
+R 2
+D 10
+L 8
+U 9
+D 11
+R 10
+D 11
+R 11
+D 2
+U 7
+R 11
+U 2
+L 9
+R 11
+U 1
+R 8
+L 5
+U 6
+D 5
+L 10
+U 1
+L 4
+R 7
+L 5
+D 2
+R 9
+D 10
+U 4
+R 1
+D 7
+R 10
+D 10
+L 5
+R 3
+L 8
+R 8
+U 10
+R 9
+D 11
+R 1
+D 9
+R 5
+L 3
+D 5
+L 8
+U 8
+R 10
+D 10
+U 1
+D 3
+R 6
+U 1
+L 2
+U 6
+L 7
+R 11
+U 2
+R 2
+L 5
+U 5
+R 2
+D 12
+U 3
+L 2
+D 5
+U 3
+R 11
+D 5
+R 10
+U 8
+L 7
+R 6
+D 2
+U 11
+L 10
+R 12
+D 8
+U 12
+L 7
+D 5
+R 11
+U 10
+R 12
+U 1
+L 1
+U 10
+L 2
+R 9
+U 1
+R 4
+U 2
+R 8
+D 1
+R 2
+L 3
+R 7
+D 7
+L 10
+R 2
+U 11
+R 8
+U 11
+D 12
+U 8
+L 5
+U 12
+L 12
+U 12
+L 7
+R 5
+D 4
+U 9
+L 5
+R 7
+L 10
+R 4
+L 11
+D 3
+R 1
+D 12
+U 10
+R 10
+D 5
+R 11
+U 2
+L 8
+R 4
+D 1
+L 10
+R 2
+D 11
+L 4
+U 12
+D 11
+L 11
+U 3
+L 9
+U 8
+D 8
+R 10
+L 8
+U 2
+D 9
+U 12
+D 7
+U 8
+L 8
+D 9
+L 6
+U 8
+D 11
+U 12
+D 9
+L 1
+D 4
+R 2
+U 10
+D 2
+L 10
+U 6
+L 9
+D 4
+U 4
+R 4
+L 5
+R 9
+U 2
+R 5
+U 4
+D 12
+R 3
+L 10
+U 7
+D 1
+U 9
+R 6
+L 4
+U 9
+L 13
+D 2
+L 8
+R 12
+D 7
+U 13
+D 6
+U 12
+L 4
+R 4
+D 10
+U 8
+L 4
+R 4
+D 2
+U 9
+L 9
+D 11
+L 6
+R 2
+L 8
+R 9
+L 6
+U 13
+R 10
+D 3
+U 10
+L 12
+R 9
+U 12
+R 10
+U 10
+D 11
+L 7
+R 5
+L 13
+U 11
+R 13
+U 11
+R 12
+U 8
+R 12
+D 4
+L 10
+R 1
+L 9
+R 13
+L 2
+U 7
+L 13
+R 4
+U 13
+L 6
+R 12
+D 1
+U 7
+L 10
+R 6
+D 6
+U 2
+R 2
+L 8
+D 5
+U 9
+D 5
+L 9
+R 1
+U 5
+L 13
+D 1
+R 5
+L 8
+U 5
+R 2
+U 8
+L 1
+U 13
+R 6
+U 12
+L 3
+D 1
+U 4
+L 12
+R 1
+D 6
+L 11
+U 7
+D 1
+L 9
+R 4
+U 7
+D 7
+U 9
+D 1
+L 10
+D 14
+U 3
+D 9
+L 7
+U 1
+L 9
+R 13
+L 14
+R 11
+D 8
+L 12
+U 11
+R 11
+U 9
+R 2
+U 13
+R 5
+D 3
+U 3
+R 9
+D 14
+U 2
+D 8
+L 7
+D 2
+U 8
+L 12
+U 7
+D 12
+R 11
+D 14
+R 13
+L 13
+R 9
+L 7
+U 4
+D 9
+U 9
+L 12
+U 3
+D 4
+R 5
+D 14
+L 9
+D 14
+U 3
+L 8
+R 1
+U 2
+R 14
+D 5
+L 6
+R 9
+D 12
+R 3
+D 1
+L 8
+U 11
+D 11
+L 7
+R 14
+D 9
+L 9
+R 13
+L 4
+D 11
+R 14
+U 6
+L 10
+R 7
+D 9
+U 7
+D 5
+R 8
+U 2
+R 9
+D 6
+R 13
+U 1
+L 14
+R 6
+L 9
+D 11
+L 3
+U 5
+R 12
+U 8
+L 3
+D 5
+U 7
+R 2
+D 14
+R 14
+L 2
+U 5
+L 11
+U 7
+L 14
+U 5
+D 6
+R 14
+D 12
+U 4
+D 5
+R 14
+L 14
+D 12
+L 10
+D 2
+L 1
+R 5
+D 8
+R 2
+L 14
+R 5
+L 12
+D 9
+L 6
+D 8
+L 8
+R 12
+U 1
+L 11
+U 3
+D 7
+R 11
+D 15
+L 4
+U 9
+R 15
+U 8
+D 4
+L 10
+U 2
+L 13
+U 9
+L 5
+D 13
+L 5
+R 1
+D 3
+U 11
+D 5
+L 13
+R 3
+D 4
+U 3
+R 5
+U 14
+R 4
+D 9
+R 3
+D 11
+U 13
+R 7
+U 10
+R 1
+L 9
+D 15
+R 6
+U 12
+L 4
+R 13
+U 7
+D 10
+R 13
+U 1
+R 4
+D 15
+L 10
+R 11
+U 9
+L 1
+D 6
+R 15
+U 10
+L 10
+D 6
+U 10
+L 8
+R 5
+L 14
+D 6
+L 2
+U 2
+L 9
+U 2
+L 7
+U 9
+L 2
+D 8
+R 6
+D 6
+R 7
+U 2
+L 13
+R 13
+U 3
+D 13
+U 14
+R 9
+L 4
+U 15
+R 1
+D 2
+U 15
+R 12
+U 12
+L 12
+U 9
+R 8
+U 3
+L 7
+D 3
+U 2
+R 7
+D 4
+R 6
+U 13
+D 7
+U 7
+D 8
+R 13
+U 10
+D 16
+L 12
+U 8
+R 6
+U 10
+L 14
+D 12
+R 2
+L 9
+U 8
+D 7
+U 6
+R 7
+L 14
+D 6
+L 10
+U 11
+L 3
+D 6
+R 2
+U 8
+L 2
+D 10
+R 16
+U 14
+R 10
+D 13
+R 3
+D 8
+R 2
+D 16
+L 12
+D 13
+U 6
+D 2
+L 4
+R 14
+D 16
+U 12
+L 1
+D 9
+L 7
+U 1
+L 3
+U 7
+R 7
+D 3
+L 11
+R 9
+D 5
+R 10
+D 12
+R 1
+U 8
+L 8
+D 5
+R 12
+U 8
+R 11
+U 3
+D 5
+R 9
+L 11
+U 14
+L 14
+D 5
+U 12
+L 9
+D 2
+U 6
+L 7
+D 6
+L 2
+R 2
+D 11
+R 13
+D 10
+U 4
+L 13
+U 5
+L 6
+R 3
+U 16
+D 13
+R 1
+U 2
+D 4
+R 3
+U 10
+D 16
+L 1
+U 1
+R 16
+D 6
+U 7
+D 3
+R 4
+U 2
+D 4
+L 8
+U 9
+R 8
+U 15
+D 4
+R 11
+D 4
+R 12
+U 1
+D 2
+R 4
+D 17
+L 4
+U 1
+D 1
+L 3
+R 16
+D 12
+R 6
+U 3
+R 4
+U 2
+D 8
+R 5
+D 4
+R 1
+U 5
+L 12
+D 1
+R 12
+U 3
+D 13
+L 13
+U 11
+D 8
+R 3
+D 14
+L 10
+D 1
+L 4
+D 4
+R 9
+L 10
+U 6
+L 8
+R 7
+L 2
+R 1
+L 4
+D 8
+R 14
+U 8
+L 13
+D 12
+R 17
+D 2
+R 5
+U 12
+R 8
+D 16
+L 6
+R 14
+D 9
+U 7
+L 5
+U 14
+L 10
+U 5
+L 4
+U 7
+R 17
+D 1
+U 6
+L 12
+D 10
+L 2
+D 17
+L 14
+R 3
+D 6
+U 11
+R 14
+L 11
+D 8
+U 1
+R 1
+L 14
+U 17
+L 15
+U 3
+R 5
+D 3
+L 12
+R 10
+U 17
+R 7
+D 2
+U 16
+D 10
+L 12
+R 5
+D 10
+L 14
+D 17
+U 4
+L 9
+D 11
+R 5
+D 4
+U 5
+L 16
+D 16
+L 5
+U 10
+D 8
+L 14
+U 11
+L 17
+D 1
+U 10
+R 9
+U 17
+L 8
+R 11
+L 15
+D 9
+U 18
+D 3
+R 4
+L 7
+R 2
+U 5
+L 17
+U 2
+R 11
+L 11
+U 7
+D 17
+U 11
+R 5
+D 14
+U 7
+R 17
+D 10
+U 18
+D 15
+L 7
+U 2
+D 3
+U 14
+R 6
+D 2
+L 5
+R 16
+D 8
+U 2
+D 16
+R 9
+U 12
+R 4
+D 14
+R 10
+U 1
+R 1
+L 8
+D 15
+L 8
+D 16
+U 9
+R 11
+L 17
+U 18
+L 2
+R 4
+L 1
+U 9
+L 13
+R 1
+U 17
+L 12
+R 3
+D 15
+R 3
+U 3
+D 8
+L 6
+R 4
+D 13
+U 2
+R 1
+L 10
+U 9
+R 2
+D 16
+R 9
+U 15
+R 10
+U 4
+R 6
+D 10
+U 4
+R 11
+D 1
+R 10
+U 17
+R 4
+D 9
+U 17
+R 7
+U 11
+L 10
+R 10
+L 10
+U 8
+L 18
+U 14
+R 16
+L 12
+U 18
+R 1
+D 4
+L 9
+R 18
+D 12
+L 17
+D 12
+U 4
+D 1
+U 16
+R 17
+U 3
+D 13
+L 14
+D 9
+L 19
+U 13
+L 2
+U 9
+D 7
+U 7
+D 4
+L 10
+R 6
+D 11
+R 7
+U 10
+D 13
+U 18
+L 14
+D 7
+L 4
+R 11
+D 8
+L 8
+R 9
+L 2
+U 11
+R 13
+L 13
+R 11
+L 16
+D 10
+L 6
+R 3
+D 8
+L 19
+U 18
+L 14
+D 15
+U 10
+D 11
+R 19
+D 14
+U 2
+R 7
+U 6
+D 15
+U 10
+D 4
+U 10
+L 9
+R 15
+L 8
+U 7
+R 4
+D 5
+R 18
+L 3
+R 11
+D 11
+R 2
+U 1
+L 6
+D 18
+R 15
+U 2
+R 10
+L 18
+R 1
+U 19
+D 15
+R 18
+L 18
+R 4
+L 7
+D 18
+R 19
+U 11
+D 3
+L 3
+R 11
+U 16
+R 3
+D 4
+U 2
+R 10
+U 9
+L 18
+U 6
+L 5
+D 7
+L 17
+U 3
+L 5
+D 6
+U 19
+R 14
+U 3
+D 1
+U 16
+L 16
+D 12
+L 11
+D 16
+R 15
+U 5
+D 14
+L 3
+U 18
+L 8
+U 10
+L 10
+D 10
+R 5
diff --git a/2022/09/test b/2022/09/test
@@ -0,0 +1,8 @@
+R 4
+U 4
+L 3
+D 1
+R 4
+D 1
+L 5
+R 2
diff --git a/2022/09/test2 b/2022/09/test2
@@ -0,0 +1,8 @@
+R 5
+U 8
+L 8
+D 3
+R 17
+D 10
+L 25
+U 20
diff --git a/2022/README.md b/2022/README.md
@@ -0,0 +1,12 @@
+# Advent of Code 2022
+
+I did not solve these problems in 2022, but in 2025, as a playground
+to learn Rust.
+
+## Usage
+
+To run this code you'll need the `rustc` compiler (no `cargo`).
+
+From this folder run: `./run.sh day part`, for example `./run.sh 03 a`.
+Input is read from standard input; paste your input in the terminal or
+read it from a file with e.g. `<input.txt`.
diff --git a/2022/run.sh b/2022/run.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+usage() {
+ echo "Usage: $0 day part"
+ echo "Example: $0 07 b"
+}
+
+[ -n "$1" ] && [ -n "$2" ] || (usage; exit 1)
+[ -d "$1" ] || (echo "Directory $1 does not exist"; exit 1)
+[ -f "$1/$2.rs" ] || (echo "File $1/$2.rs does not exist"; exit 2)
+
+rustc "$1/$2.rs" -o "$1/$2.out" && time "./$1/$2.out"