summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--1.txt2250
-rw-r--r--1a.c34
-rw-r--r--1b.c56
-rw-r--r--2.txt2500
-rw-r--r--2a.c78
-rw-r--r--2b.c90
-rw-r--r--3.txt300
-rw-r--r--3a.c65
-rw-r--r--3b.c87
-rw-r--r--4.txt1000
-rw-r--r--4a.c53
-rw-r--r--4b.c51
-rw-r--r--makefile10
14 files changed, 6575 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+bin
diff --git a/1.txt b/1.txt
new file mode 100644
index 0000000..da4f98e
--- /dev/null
+++ b/1.txt
@@ -0,0 +1,2250 @@
+9609
+7601
+7142
+5278
+9374
+6815
+1050
+6329
+8016
+
+12477
+28601
+
+1056
+5037
+1660
+3786
+2611
+6689
+3159
+2973
+5286
+2401
+6231
+7460
+
+3689
+3909
+9254
+5704
+10307
+10173
+9336
+4586
+
+5476
+16022
+9109
+11504
+6746
+
+1006
+1685
+2688
+4776
+6234
+5807
+4943
+4944
+4982
+1731
+3196
+5573
+5269
+1266
+
+12097
+15573
+1113
+8920
+14145
+
+4723
+2428
+3864
+4657
+5046
+5135
+5104
+1867
+5130
+1751
+6029
+4551
+1924
+4998
+4255
+
+2706
+5595
+10508
+3676
+11580
+6061
+7902
+
+2523
+11236
+1915
+15774
+7639
+
+2996
+3656
+4491
+4493
+6136
+3112
+7342
+3600
+6111
+4229
+7548
+
+4200
+8635
+1003
+1223
+3096
+10734
+8319
+3772
+
+7063
+3538
+4856
+1250
+1917
+4852
+4792
+7407
+3413
+7326
+7378
+1778
+
+1659
+3390
+2802
+3226
+3993
+9583
+6504
+3296
+5998
+
+1800
+1144
+2569
+4426
+5871
+4988
+1309
+2330
+3236
+3217
+3778
+2636
+3116
+2300
+1428
+
+69249
+
+6905
+2506
+2429
+3904
+2960
+1420
+2687
+7150
+1368
+4253
+3584
+1302
+
+9585
+34214
+
+5442
+8217
+2320
+6864
+1354
+5791
+5492
+4979
+1760
+7753
+
+18036
+11876
+1936
+4605
+
+10819
+13733
+13726
+10233
+
+5450
+4315
+3008
+3419
+5434
+1601
+6834
+2144
+3943
+3573
+6366
+6680
+1197
+
+3681
+4233
+3461
+1646
+5161
+3542
+5489
+4635
+1776
+4811
+3026
+4858
+4207
+5716
+4751
+
+3271
+5205
+7916
+7618
+8354
+4445
+4604
+
+2489
+7439
+6911
+5378
+7363
+2207
+7303
+4757
+5989
+4902
+6889
+5074
+
+4451
+34499
+
+6519
+7439
+2225
+1237
+2167
+2041
+3403
+8289
+3545
+2936
+
+25613
+23988
+15999
+
+10278
+9240
+8736
+10445
+5005
+9339
+9059
+9198
+
+14821
+8000
+15113
+10430
+11981
+
+2745
+6427
+3564
+3822
+1674
+6615
+4817
+5026
+6243
+5295
+4027
+4861
+6554
+
+24901
+7628
+
+10299
+8153
+3359
+5982
+5207
+4491
+5267
+5364
+
+7962
+12190
+1998
+10722
+2890
+
+27425
+19199
+
+5347
+3738
+2833
+12747
+6505
+3476
+
+2360
+6688
+11640
+13899
+
+5152
+4272
+7284
+3491
+4225
+3271
+7751
+6376
+2695
+
+8227
+7171
+3366
+1663
+4466
+2444
+7239
+3673
+5321
+6363
+
+6362
+4237
+7358
+1723
+7514
+5741
+2621
+4413
+5502
+5875
+
+13451
+12610
+8672
+2841
+
+1956
+3310
+3011
+2938
+5046
+4571
+3326
+2013
+5980
+5145
+3226
+5073
+3676
+2763
+4542
+
+4200
+9203
+6238
+9501
+3972
+6776
+2730
+6126
+
+13151
+2622
+2592
+10013
+10227
+4677
+
+3151
+2107
+7564
+3219
+1353
+7924
+7287
+3273
+2117
+4211
+
+6914
+1354
+3517
+1835
+1694
+4044
+2569
+4755
+6720
+1104
+
+10704
+2576
+2773
+9002
+3321
+9443
+8346
+9054
+
+4584
+2075
+3303
+2156
+1250
+4717
+1391
+2977
+3845
+1433
+3112
+5675
+6058
+1451
+5500
+
+8712
+8235
+2732
+5337
+11076
+9434
+1593
+
+27831
+3385
+
+1497
+7378
+3442
+1957
+2620
+2208
+3808
+1793
+1306
+6721
+4098
+5050
+
+3197
+1377
+2289
+7534
+8484
+5831
+3671
+2524
+6756
+
+24827
+5119
+
+1701
+5156
+3625
+2469
+5728
+5698
+4538
+1505
+1475
+3934
+3758
+5405
+1549
+5019
+1433
+
+12606
+14593
+14761
+12375
+
+9284
+16208
+6022
+5550
+
+8956
+1473
+10077
+2220
+7314
+3561
+6013
+
+1064
+1538
+3292
+3854
+3882
+6008
+5364
+4326
+1958
+4712
+3389
+4496
+5501
+2181
+1666
+
+2424
+5342
+11963
+1108
+6698
+7440
+4334
+
+7167
+3677
+4923
+9204
+4469
+5934
+6071
+8355
+
+4457
+2779
+5014
+6156
+7431
+1879
+2349
+4038
+7353
+1453
+6980
+1890
+
+1348
+8892
+13667
+2877
+9049
+8967
+
+7904
+6871
+7301
+7952
+5953
+7562
+3289
+6654
+
+13903
+9705
+11858
+7619
+12963
+5629
+
+31307
+5533
+
+1431
+5521
+3430
+4972
+4077
+1771
+2134
+2614
+1464
+1882
+1471
+2024
+4789
+4419
+
+8927
+9768
+1070
+12640
+3597
+5034
+
+4369
+5821
+4181
+2802
+6503
+2530
+1530
+1047
+3537
+2732
+5169
+4156
+4348
+1831
+
+9491
+6837
+3855
+2320
+1689
+3393
+6974
+5192
+9255
+
+2791
+3416
+2183
+2919
+3732
+3010
+5213
+7927
+4855
+4468
+
+7089
+36535
+
+9669
+2139
+10069
+7918
+9942
+1446
+
+4381
+3053
+3216
+4395
+2710
+3329
+2837
+1395
+3310
+1598
+1620
+6310
+3405
+4005
+
+3639
+1485
+5221
+5767
+2415
+5401
+4011
+3377
+2977
+6529
+1921
+5012
+4426
+
+4202
+17425
+
+1350
+1077
+4747
+1735
+4362
+6110
+5006
+8519
+7785
+
+10393
+3532
+4113
+8856
+11626
+7552
+11220
+
+8925
+8081
+2340
+2296
+9558
+6452
+3604
+8601
+1958
+
+4519
+2675
+1343
+4853
+5372
+2362
+4274
+4636
+3144
+5231
+4867
+5533
+1505
+5978
+1649
+
+4955
+6133
+6469
+5120
+4257
+3936
+3661
+4995
+6040
+2616
+5863
+6886
+1653
+
+4106
+1467
+2641
+1772
+4588
+1750
+1333
+4312
+4852
+1508
+5620
+4535
+3888
+4007
+2194
+
+27508
+
+10203
+6474
+2054
+11285
+12800
+
+10249
+7004
+6396
+1990
+5883
+9275
+4687
+
+22359
+8260
+9536
+
+2657
+6895
+4538
+4635
+1259
+1819
+2679
+3703
+6127
+4197
+4009
+4652
+2708
+
+49278
+
+16243
+33427
+
+5219
+3052
+4510
+9946
+5429
+5163
+2653
+
+4676
+5247
+6267
+2648
+1257
+2335
+3737
+1443
+2726
+2361
+2134
+1952
+1021
+1753
+
+4671
+7281
+8217
+6170
+1182
+8778
+5289
+5035
+
+6067
+3461
+7448
+2117
+8702
+2849
+9659
+1410
+9402
+
+10607
+5652
+3127
+5594
+2423
+2591
+
+2138
+4007
+6383
+5597
+3074
+5811
+2178
+6220
+2212
+4271
+5410
+6677
+
+5313
+5507
+7753
+5492
+5041
+4967
+7644
+10538
+
+2062
+7568
+1439
+1621
+8216
+4952
+4358
+3391
+4776
+
+4015
+4854
+2935
+5177
+2131
+5192
+3300
+3337
+5223
+6469
+6101
+3917
+3492
+3986
+
+8942
+9447
+6152
+2764
+6196
+3116
+6478
+9334
+9346
+
+10560
+5894
+12105
+4239
+4573
+
+1752
+6751
+3684
+2236
+6195
+11108
+5450
+
+32451
+29152
+
+13915
+7001
+11778
+2626
+3026
+12725
+
+6410
+4265
+10923
+9587
+7411
+
+4943
+5272
+2453
+7324
+3815
+6049
+2936
+5905
+3187
+3675
+3860
+7143
+
+58413
+
+6544
+11733
+11746
+3288
+5411
+5555
+3796
+
+4852
+6567
+1494
+4644
+6183
+2444
+5145
+1015
+5088
+7905
+6491
+
+3550
+5679
+4312
+2128
+2262
+3597
+2249
+2472
+4758
+3927
+5369
+2278
+
+1399
+3791
+4817
+13948
+10037
+6154
+
+7877
+16900
+10571
+18965
+
+4836
+5457
+6380
+4241
+4969
+3635
+4160
+5451
+6164
+5334
+
+4961
+2514
+1620
+2494
+6373
+4040
+7544
+2595
+2330
+6927
+7906
+
+8023
+6672
+3565
+9038
+7154
+5236
+
+4297
+3122
+4779
+3937
+3165
+5012
+1298
+5405
+6175
+3862
+3469
+3533
+5411
+6349
+
+36291
+32851
+
+7992
+4095
+4841
+6728
+2275
+1549
+8143
+8494
+7144
+5800
+
+3064
+1314
+4224
+5969
+2913
+2622
+4833
+3113
+3663
+5351
+5102
+2930
+6048
+5658
+4773
+
+1771
+9851
+9844
+4001
+1343
+6124
+3826
+7647
+
+8488
+7700
+19028
+2822
+
+4541
+6311
+6499
+1043
+5888
+2631
+3824
+3137
+6957
+1372
+1755
+5852
+4944
+
+7010
+7705
+7380
+5693
+6466
+2388
+4584
+1309
+5295
+4232
+
+8997
+11222
+12715
+13341
+
+3389
+5375
+6730
+1723
+4179
+6599
+8482
+9599
+8903
+
+1774
+6964
+3739
+6345
+4881
+5381
+2415
+7900
+8778
+
+10638
+20181
+4651
+
+11271
+3243
+11634
+2919
+8121
+9706
+7354
+
+2675
+2809
+5554
+4439
+1626
+4173
+4273
+2551
+2302
+4167
+1929
+
+2641
+1264
+2074
+8265
+1089
+5010
+2591
+5610
+4610
+
+8082
+11994
+3820
+2770
+9252
+3948
+7731
+
+9429
+7117
+13052
+8925
+1844
+11783
+
+1288
+5874
+3708
+4770
+6241
+1823
+2081
+4040
+1675
+3309
+
+6185
+5449
+1262
+4549
+5293
+4790
+1854
+4853
+1727
+5514
+5256
+4148
+5514
+
+6609
+15270
+13973
+10316
+
+8083
+8381
+4788
+1606
+5118
+1520
+8152
+2433
+2999
+1784
+
+1178
+5284
+8781
+5156
+6160
+1957
+3163
+5129
+
+6123
+8854
+2776
+8899
+1728
+1459
+6248
+1676
+6804
+
+11240
+11672
+1993
+12007
+
+11441
+8463
+3348
+3292
+6021
+
+3765
+7412
+2551
+3571
+2806
+3018
+7255
+4727
+1812
+5666
+
+1111
+7513
+4547
+8423
+6838
+8520
+5818
+7891
+7659
+1029
+
+21630
+17117
+
+4790
+2925
+1959
+7089
+5283
+6020
+2522
+2052
+1519
+1591
+
+6012
+10136
+10443
+7841
+6019
+1279
+3540
+9068
+
+3937
+12491
+9763
+7498
+1701
+
+11876
+9043
+4713
+2987
+8774
+11370
+
+4885
+5614
+2665
+7454
+1350
+1832
+8687
+9477
+
+10654
+8624
+6594
+13129
+10246
+
+25357
+10959
+23864
+
+2554
+4768
+6464
+2757
+1927
+1861
+2175
+2322
+4198
+4037
+4752
+2082
+6003
+5328
+
+1820
+4090
+7653
+2160
+3455
+2144
+12128
+
+29265
+30377
+
+2359
+3949
+6123
+2235
+4210
+5808
+2377
+6678
+2039
+1324
+2104
+5407
+
+1955
+4478
+3696
+6486
+2206
+3083
+2843
+5454
+4294
+3972
+2556
+5795
+3319
+2315
+
+6188
+1383
+3880
+3153
+5842
+3400
+5504
+1353
+1257
+3639
+
+5550
+5255
+4095
+3951
+3104
+2344
+4580
+3980
+1482
+2521
+2764
+1607
+5699
+2350
+1175
+
+3326
+5681
+5905
+7268
+6083
+1407
+1434
+3186
+5744
+6268
+5533
+2245
+
+2994
+1141
+10449
+6013
+5210
+8014
+3136
+8434
+
+28983
+19936
+
+4560
+8754
+6220
+12071
+5989
+2858
+6333
+
+1928
+22562
+
+3804
+7720
+6499
+7651
+1860
+1193
+8243
+2693
+2515
+4517
+
+2762
+1303
+5390
+4371
+2424
+5039
+5875
+1354
+4039
+1883
+1398
+5544
+3698
+
+1312
+5037
+2534
+3404
+3494
+5859
+7520
+3173
+4187
+5593
+4094
+
+1938
+4558
+3961
+8752
+6733
+8402
+2351
+7059
+
+4650
+5453
+5251
+2503
+7601
+6322
+7193
+3568
+6734
+1254
+7263
+
+15442
+18712
+
+2671
+34633
+
+8092
+6200
+3593
+12427
+11897
+5342
+
+12145
+20778
+25515
+
+4318
+7326
+6324
+3726
+6176
+2530
+4017
+5504
+2930
+4978
+1941
+3893
+
+7431
+2579
+2463
+5818
+2616
+7477
+8840
+2943
+
+28974
+26077
+
+4317
+2950
+2298
+4360
+2323
+5028
+6040
+1223
+2836
+5338
+6002
+4551
+4505
+1046
+5007
+
+5979
+1142
+5901
+4646
+5486
+5184
+6255
+1473
+6420
+5358
+2502
+4997
+6331
+5529
+
+3641
+1705
+3924
+3952
+3856
+4687
+4962
+3754
+2049
+5361
+5286
+4157
+5753
+2937
+1996
+
+9825
+2077
+12304
+8296
+
+5576
+4979
+5746
+3423
+1339
+5466
+2956
+3201
+4612
+5538
+4957
+3095
+3211
+
+6162
+6797
+12282
+3848
+14760
+
+8520
+6433
+5529
+5617
+4572
+2395
+3228
+6012
+
+36432
+12115
+
+3396
+3826
+2514
+5297
+5768
+4673
+6134
+2153
+4533
+5530
+2289
+3910
+3429
+6315
+
+9288
+7564
+2801
+7672
+3580
+6425
+5047
+9141
+
+6455
+4624
+7937
+6151
+9671
+2857
+
+5789
+7291
+3051
+4587
+4527
+5970
+5863
+
+7496
+2170
+3522
+1108
+4284
+1214
+5981
+4240
+4880
+2816
+3638
+
+1458
+4890
+4046
+5337
+6192
+3705
+1362
+3330
+3593
+1036
+3842
+6485
+2170
+1176
+
+4669
+7457
+3290
+1471
+1471
+4983
+8120
+3964
+2012
+
+12196
+12907
+1360
+2359
+4034
+12061
+
+2023
+2376
+4602
+2529
+2091
+7266
+3696
+4104
+7007
+4183
+2551
+4913
+
+12264
+2297
+16633
+19219
+
+5963
+5584
+1534
+6499
+5988
+1160
+5186
+4313
+4579
+2978
+6075
+5821
+3288
+
+2456
+1103
+2492
+1484
+3089
+2519
+2596
+3462
+4707
+2403
+5042
+2345
+1841
+3924
+3674
+
+15955
+14482
+19975
+7828
+
+7686
+33030
+
+9367
+6387
+4450
+1301
+6652
+
+2436
+8020
+9634
+1189
+
+13768
+4937
+6445
+2333
+8688
+2282
+
+2632
+2386
+1540
+1313
+5560
+3191
+3768
+6455
+1771
+5707
+6503
+3702
+2690
+6410
+
+4254
+9381
+10720
+6622
+4502
+3229
+
+10702
+25975
+21218
+
+1824
+3787
+1017
+3211
+1954
+3263
+1654
+5116
+5383
+6081
+5917
+3708
+3770
+3332
+1564
+
+8659
+
+1918
+13752
+13443
+2032
+8928
+
+8167
+4650
+4066
+8487
+5484
+2973
+1974
+8716
+3918
+6829
+
+8569
+4604
+3930
+4567
+15587
+
+8510
+8686
+2757
+10057
+2681
+7895
+6610
+10350
+
+27009
+
+3554
+8125
+6661
+1517
+1293
+6747
+3910
+4998
+3100
+
+58602
+
+2960
+5646
+4133
+3192
+5660
+3224
+4699
+6106
+4147
+4855
+1950
+1195
+5861
+3613
+5095
+
+2481
+11509
+
+9922
+2887
+1722
+10604
+6329
+6330
+3934
+5424
+
+7492
+6265
+3838
+8041
+6266
+4794
+2524
+6684
+2734
+7338
+
+6263
+8780
+6447
+20087
+
+6388
+9789
+4219
+6199
+1753
+7765
+2130
+5475
+
+6043
+4380
+7928
+3807
+5877
+1736
+6191
+4348
+5699
+2381
+
+2683
+4364
+6323
+2128
+3828
+1657
+3885
+3426
+6137
+4427
+2592
+6245
+6142
+5680
+
+4812
+8631
+7556
+6549
+4494
+7671
+2664
+3702
+3551
+1289
+
+8546
+
+5793
+8055
+4733
+3781
+4359
+1127
+5052
+7333
+1533
+3232
+6713
+
+9850
+
+6386
+8256
+12527
+10704
+11625
+6314
+
+36312
+9909
+
+2500
+5131
+12716
+2449
+10252
+2989
+
+10080
+7372
+4650
+4148
+1543
+7025
+4075
+5975
+
+6493
+1969
+3498
+5752
+5231
+5688
+3805
+2245
+3355
+7015
+2001
+1980
+
+5498
+10487
+6072
+5136
+4464
+1645
+
+5765
+1637
+4963
+3317
+2151
+4765
+4234
+4268
+3791
+1371
+5906
+5800
+4684
+5872
+1032
+
+7693
+5165
+3321
+7593
+6652
+4856
+7244
+3238
+5442
+6728
+
+8940
+2746
+4620
+4575
+1794
+8580
+6018
+1198
+2470
+
+10302
+5070
+4341
+2533
+4345
+11497
+
+11333
+1604
+6233
+6784
+5614
+10283
+5386
+
+2715
+3782
+4739
+5782
+3541
+3544
+3591
+4748
+7392
+3361
+5764
+6413
+
+9117
+1201
+6914
+1214
+3645
+3711
+1825
+10249
+
+4719
+8388
+1460
+4555
+1038
+8967
+2147
+2943
+
+3372
+3381
+3607
+5180
+2115
+1071
+2218
+5102
+3133
+5809
+3920
+2758
+1729
+2132
+
+1332
+6802
+5791
+3281
+6624
+1692
+5105
+5160
+3082
+6840
+1613
+4749
+
+5211
+2825
+6050
+2913
+2542
+2466
+2411
+2101
+5822
+1972
+3409
+2738
+5032
+5715
+
+8421
+5749
+1746
+1424
+4398
+5048
+1450
+2122
+7937
+4488
+
+17962
+
+1415
+5018
+11466
+17007
+
+8818
+9115
+4789
+1919
+8398
+3807
+
+13697
+10141
+5675
+2146
+1954
+6312
+
+8363
+2872
+1505
+7354
+1868
+3313
+6657
+3468
+7434
+
+2157
+2904
+3745
+6707
+4194
+2956
+5377
+3130
+7664
+7595
+7477
+
+22149
+
+5662
+4865
+5971
+6008
+6761
+5764
+4321
+1546
+1705
+6056
+3990
+3953
+
+7794
+1246
+5418
+2460
+7858
+6992
+5897
+3459
+2915
+2227
+1517
+
+7873
+3664
+6050
+9000
+8922
+8817
+4514
+
+20975
+
+4983
+11133
+4400
+6751
+2763
+2781
+11806
diff --git a/1a.c b/1a.c
new file mode 100644
index 0000000..fa93b39
--- /dev/null
+++ b/1a.c
@@ -0,0 +1,34 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main()
+{
+ char buf[BUFSIZ];
+ long cal = 0, maxcal = 0, elf = 0, maxelf = 0;
+
+ while (fgets(buf, sizeof(buf), stdin)) {
+ char * pbuf = buf;
+ long n;
+ if ((n = strtol(buf, &pbuf, 10)) == 0 && pbuf == buf) {
+ if (cal > maxcal) {
+ maxcal = cal;
+ maxelf = elf;
+ }
+ cal = 0;
+ ++elf;
+ }
+ else {
+ cal += n;
+ }
+ }
+ if (cal > maxcal) {
+ maxcal = cal;
+ maxelf = elf;
+ }
+
+ printf("maxcal: %ld (elf: %ld)\n", maxcal, maxelf);
+
+ return 0;
+}
+
diff --git a/1b.c b/1b.c
new file mode 100644
index 0000000..a1fce37
--- /dev/null
+++ b/1b.c
@@ -0,0 +1,56 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+#define arrlen(x) (sizeof(x) / sizeof(x[0]))
+
+
+long
+checkmax(long * maxcals, long * maxelfs, int n, int cal, int elf)
+{
+ long i, j;
+
+ for (i = 0; i < n; ++i) {
+ if (cal > maxcals[i]) {
+ if ((j = i + 1) < n) {
+ memmove(maxcals + j, maxcals + i, (n - j) * sizeof(long));
+ memmove(maxelfs + j, maxelfs + i, (n - j) * sizeof(long));
+ }
+ maxcals[i] = cal;
+ maxelfs[i] = elf;
+ break;
+ }
+ }
+
+ return i;
+}
+
+
+int
+main()
+{
+ char buf[BUFSIZ];
+ long cal = 0, maxcal[3] = {0}, elf = 0, maxelf[3] = {0};
+
+ while (fgets(buf, sizeof(buf), stdin)) {
+ char * pbuf = buf;
+ long n;
+ if ((n = strtol(buf, &pbuf, 10)) == 0 && pbuf == buf) {
+ checkmax(maxcal, maxelf, arrlen(maxcal), cal, elf);
+ cal = 0;
+ ++elf;
+ }
+ else {
+ cal += n;
+ }
+ }
+ checkmax(maxcal, maxelf, arrlen(maxcal), cal, elf);
+
+ printf("maxcal: %ld (elf: %ld/%ld/%ld)\n",
+ maxcal[0] + maxcal[1] + maxcal[2],
+ maxelf[0], maxelf[1], maxelf[2]);
+
+ return 0;
+}
+
diff --git a/2.txt b/2.txt
new file mode 100644
index 0000000..d7d6a83
--- /dev/null
+++ b/2.txt
@@ -0,0 +1,2500 @@
+B Z
+B Z
+C Z
+C Z
+B X
+C Y
+A Y
+B Z
+A Z
+A Y
+C Z
+C X
+C Z
+C X
+B X
+B Z
+B Z
+A Z
+C Z
+C Z
+C Y
+C Z
+B Z
+B Z
+A X
+A Y
+B Z
+B Z
+C Z
+B Z
+B Z
+C X
+C Z
+A Y
+A X
+A X
+C Z
+C Z
+B X
+C X
+B Z
+A Z
+B X
+B Z
+B Z
+A Z
+B Z
+A Y
+C Z
+C Z
+B X
+C Z
+A Z
+C Z
+C Z
+C Z
+C Z
+A Z
+B Z
+C Z
+A Z
+C Z
+C Z
+C Y
+A Y
+C X
+C Z
+C Z
+C Z
+C Z
+A Y
+C X
+A Y
+A Y
+C X
+B Z
+A Y
+C Y
+C Z
+B Z
+C Z
+B Z
+B Z
+B Z
+C Y
+B Z
+A Y
+C Z
+C Z
+A X
+C X
+C Z
+A X
+C Z
+C Z
+C X
+A Z
+C Z
+C Z
+B Z
+C Y
+A Y
+C Y
+C Y
+A Z
+B Z
+C Z
+C Z
+C Z
+A Z
+C Z
+B X
+C Z
+A Y
+C Z
+C X
+C Y
+C Y
+B Z
+C Z
+C Z
+A X
+C X
+C Z
+C Z
+A Z
+B Z
+B Z
+C X
+C Z
+B Z
+C X
+B Z
+C Z
+B Z
+B Z
+B Z
+B Z
+C Y
+C Z
+B Z
+C Z
+C Z
+C Z
+C Z
+B Z
+C Z
+B Z
+C Z
+B Z
+C Z
+C Y
+C Z
+C Z
+C X
+C Z
+C Z
+C Y
+C Z
+C Y
+C X
+B Z
+B Z
+C Z
+A Z
+C Z
+C Z
+C Z
+B Z
+C Z
+B Z
+C Z
+B Z
+C Z
+C Z
+B X
+B Z
+C Z
+C Z
+A Z
+A Z
+B Z
+C Z
+C Z
+A Z
+B X
+C X
+A Z
+C Z
+C Z
+B Y
+B Z
+B Z
+A Y
+B Z
+C Z
+C Z
+A Y
+B Z
+C Y
+A Z
+C X
+A Z
+A Y
+C X
+C Y
+C Z
+B Z
+C Z
+A Y
+B Z
+B Z
+C Z
+C Z
+C Z
+C Z
+C Z
+B Z
+C Z
+A X
+C Z
+C Z
+A Y
+C Z
+A Y
+C Z
+B Z
+C Z
+A Y
+C Z
+C Y
+C Z
+B Z
+C X
+A Y
+C X
+A Y
+B X
+C Y
+B X
+C Z
+C Y
+C Z
+C Y
+C Y
+B Z
+C Z
+A Y
+C X
+C Z
+C Z
+B Z
+A Z
+C Z
+C Z
+C Y
+C Z
+C Y
+B X
+C Z
+C Z
+C Z
+C X
+A Y
+B Z
+C Z
+C Z
+C Z
+B Z
+A Y
+A Z
+A Y
+B Z
+A Z
+A Y
+B Z
+C Z
+A Y
+A Z
+B Z
+B Z
+B Z
+C Z
+C Z
+C Z
+C Z
+C Z
+C Z
+B Z
+C Z
+C Z
+C Z
+A Z
+A Y
+C X
+C Z
+A Z
+C Z
+A Y
+C Z
+A Y
+C Z
+C Z
+A X
+C Y
+C Z
+A X
+C X
+A X
+B Z
+C Z
+A X
+C Z
+B Z
+A X
+C Z
+A Y
+A Z
+C Y
+A Y
+C Y
+A Z
+B Z
+A Z
+B Z
+C X
+C X
+C Z
+C Z
+B Z
+A Y
+C Z
+A Y
+C Z
+B Z
+B X
+B X
+B X
+A Z
+B Z
+C X
+C Z
+A Y
+C Z
+B X
+A Y
+C X
+B Z
+C Z
+C Z
+C Z
+C Z
+A Z
+B Z
+B Z
+B X
+A Y
+C Z
+C X
+A Y
+C Z
+C Z
+C Z
+A Y
+A X
+B Z
+C Z
+A Z
+C Y
+A Z
+B Z
+A Y
+C Z
+C Z
+B Z
+A Y
+B Z
+A Z
+A Y
+C Z
+A X
+C Z
+C Z
+B Z
+C Z
+C X
+A Y
+A Y
+B Z
+C Z
+B X
+A Y
+C Z
+C Z
+A X
+A Z
+C Z
+C Z
+A Y
+C Z
+C Y
+A Y
+A Y
+B Z
+C Z
+C Z
+C X
+C Z
+A Y
+B Z
+C Z
+C Z
+A Y
+B Z
+C Z
+C Z
+B Z
+A Y
+B Z
+C Z
+C Z
+C Z
+C X
+C Z
+C Z
+C Z
+C Y
+C X
+C Y
+C Z
+B Z
+A Y
+C X
+B Z
+C X
+C X
+C Z
+A Z
+C Z
+B X
+A Y
+C Z
+B Z
+A X
+B X
+C X
+C Z
+C Z
+B Z
+B Z
+C Z
+C Z
+A Y
+B Z
+A Z
+B Z
+A Z
+A X
+C Z
+A Z
+A Z
+B X
+A Z
+B Z
+B Z
+A Y
+C Y
+B Z
+B Z
+B Z
+B Z
+C Z
+B Z
+C Z
+B Z
+C Y
+C Z
+C Z
+C X
+C Z
+C Y
+C Y
+C X
+A Y
+C Y
+B Z
+C Z
+A Y
+A Z
+B X
+C Z
+C Z
+A Y
+A Y
+A Y
+C Z
+A Z
+C Z
+B Y
+A X
+A Y
+C Z
+A X
+B Z
+C Z
+C Z
+B Z
+C Z
+A Z
+C X
+C Z
+B Z
+B Z
+C Z
+B Z
+A Z
+C Z
+C Z
+A Y
+B Z
+A Y
+B Z
+C Z
+B Z
+C Z
+B Z
+B Z
+A Y
+C Y
+B Z
+C Z
+A Z
+B Z
+C Z
+C Z
+A Z
+B Z
+C Z
+A Y
+A Z
+C X
+B Z
+A Y
+A Y
+C Z
+A Z
+B Z
+B Z
+C Z
+C Z
+C Z
+C Z
+A Y
+A X
+C Z
+B Z
+C Z
+C Z
+C Y
+C Z
+A X
+A Z
+C Z
+B X
+A Z
+B X
+B X
+A Y
+A Y
+A Y
+C Z
+C Z
+C Z
+A Z
+C X
+A Y
+C Z
+B Z
+C Z
+A X
+B Z
+A X
+A Z
+C Z
+C Z
+C Z
+B X
+B Z
+C X
+B Z
+C Z
+C Z
+C Z
+A Y
+B Z
+B Z
+C Z
+A X
+B Z
+A Y
+C Z
+A Y
+A Y
+C Z
+C Z
+A Y
+C X
+C Z
+A Y
+C Z
+B Z
+B Z
+C Z
+C Y
+B Z
+B Z
+C Z
+A Y
+C Z
+B Z
+B X
+A Y
+A Z
+C Z
+B Z
+C Z
+C X
+A Y
+A Z
+A Y
+B Z
+A Z
+B Z
+A Y
+A Y
+B Z
+C Z
+C Z
+C Z
+A Y
+A X
+B Z
+A Y
+C Z
+B X
+C Z
+C Z
+A Y
+C Z
+C Z
+C Y
+C Z
+C Y
+B Z
+B Z
+C Z
+C Z
+B Z
+B Z
+B Z
+C Z
+B Z
+B Z
+C Z
+C Z
+C X
+C Z
+C Z
+B Z
+B Z
+C X
+A Y
+C Y
+C X
+B Z
+C X
+B Z
+C Z
+A Z
+C Y
+C Z
+C X
+B X
+A Y
+C Y
+A X
+C Z
+C Z
+C Z
+C Z
+A Y
+C Y
+C Z
+A Y
+C Z
+C Z
+B Z
+B Z
+B Z
+C Z
+C Z
+C Z
+C Z
+C Z
+C Z
+B Z
+C Z
+B Z
+C Z
+B Z
+C Z
+C Z
+B Z
+C Z
+C Z
+C Z
+A Y
+C Z
+C Z
+A X
+C Z
+C Z
+A X
+B Z
+C Z
+A Y
+C X
+C Z
+A Z
+C Y
+A Y
+C Z
+B Z
+C Z
+B Z
+C X
+C Y
+B Z
+C Z
+C Z
+A Y
+C X
+C Z
+C Z
+B X
+C Z
+C Z
+C Z
+C Z
+A Z
+A Y
+C Z
+B Z
+C Z
+B Z
+A Y
+B Z
+C Z
+B Z
+B Y
+C Z
+B Z
+A Y
+C Z
+C Y
+C Z
+A X
+B Z
+C Z
+A Z
+A Z
+B Z
+A X
+B Z
+B Z
+C Y
+C Z
+C Z
+B Y
+B Z
+C Z
+A Y
+B X
+B Z
+C Z
+C Z
+C Z
+B X
+A Y
+A Y
+B Z
+B Z
+C Z
+B Z
+C Z
+C Y
+B Z
+B Z
+B X
+A Y
+A Y
+A Y
+B X
+C Z
+C Z
+B Z
+C Z
+C X
+B Z
+C Z
+C Z
+B Z
+C Z
+C Z
+A Y
+B Z
+A Y
+C Y
+B Z
+B Z
+B Z
+C X
+C Z
+C Z
+C Z
+C X
+C Z
+A X
+B Z
+C Z
+C Z
+A Y
+B Z
+C Z
+A Y
+C Z
+B Z
+C Z
+C Z
+B Z
+B Z
+C Z
+C Z
+C Y
+C Z
+C Y
+C X
+C Z
+C Y
+C Z
+A Y
+B Z
+B Z
+A Y
+B Z
+B X
+B X
+A Z
+C Y
+C Z
+C Z
+B Z
+C Z
+C Z
+C Z
+C Z
+C Y
+C Z
+B Z
+C Z
+C Z
+C Z
+B Z
+B Z
+C Z
+B X
+C Y
+A X
+C Z
+A Z
+C Y
+C Z
+C Z
+B Z
+C Z
+C Z
+C Z
+B Z
+A Y
+A Z
+B X
+C X
+A Y
+A Y
+C Z
+C Z
+C Z
+C Z
+C Z
+C Z
+C Y
+C Z
+C Z
+C Z
+A Y
+A Z
+C Z
+A Y
+C Z
+C Z
+B Z
+B Z
+B X
+A Y
+B Z
+C Y
+C Z
+B Z
+A Z
+A Y
+A X
+C Z
+B Z
+C Z
+B Z
+B Z
+C Z
+C Z
+C Z
+C Z
+A Y
+A Z
+C Z
+C Z
+A Y
+C Y
+C Z
+A X
+B X
+B X
+C Z
+C Z
+B Z
+A Y
+A Y
+A Y
+A X
+C Z
+B Z
+B Z
+B Z
+A Y
+C Y
+B Z
+A Z
+C Z
+B X
+C Z
+C Z
+C X
+C X
+C Z
+A Y
+B Z
+C Z
+A Y
+C Z
+A X
+C Z
+B Z
+B Z
+B Z
+C Z
+B Z
+C Z
+A Z
+C Z
+B Z
+C Z
+A Y
+C Z
+A Z
+C Z
+C Y
+B Z
+A Z
+C Z
+B Y
+A Z
+C Z
+A X
+C Z
+B Z
+A X
+C Z
+B Z
+C Z
+C X
+A Y
+C Z
+B Z
+A X
+C Z
+B Z
+C Z
+A Y
+C Z
+C Z
+C Z
+B Z
+C Y
+C Z
+C X
+A Z
+C Z
+C Z
+B Z
+C Z
+C Z
+C Z
+A Z
+C Z
+A Y
+A X
+C Z
+A Y
+C X
+C Z
+B Z
+C Z
+B Z
+B Z
+A Y
+B Z
+A Y
+A Y
+C X
+B Z
+C Z
+C Z
+C Z
+C Z
+C Z
+A Y
+B Z
+C Z
+A Y
+B Z
+C Z
+C Z
+A Y
+B Z
+C Z
+C Y
+B Z
+C Z
+B Z
+A Z
+C X
+B Z
+C Y
+C Z
+C Z
+C X
+C X
+A X
+C Z
+B Z
+A Z
+C Z
+B Z
+B X
+C Z
+C Z
+C Z
+C Z
+B Z
+B X
+C Z
+C Z
+C Z
+B Z
+C Y
+B Z
+B X
+C Y
+C Z
+C Z
+B Z
+A Z
+C Y
+C X
+C Z
+B Z
+C Z
+C Z
+C Z
+B Z
+B X
+C Z
+C Z
+A Y
+C Z
+C Y
+A Y
+A Z
+B Y
+C Z
+A Y
+C X
+C X
+C X
+C Z
+B Z
+C Z
+C Z
+B Z
+C Z
+A Y
+C Z
+C Z
+B Z
+C X
+C Z
+B Z
+C Z
+A Y
+C Z
+C Z
+C X
+C Z
+B Z
+C Y
+C Z
+A Z
+C Z
+B Z
+A Z
+B Z
+C Z
+A Y
+B Z
+C Z
+C Z
+B Z
+A Z
+C Z
+C X
+C Z
+C Z
+A Y
+A Y
+A Z
+C Z
+A Y
+A X
+C Z
+C Z
+C Z
+C X
+A Z
+C Z
+A Y
+C Z
+C Z
+C Y
+C Z
+C Z
+B Z
+C Z
+C Z
+B Z
+B Z
+C Z
+C Z
+C Z
+B Z
+C Z
+C Z
+C Y
+B Z
+C Y
+B Z
+B X
+C Z
+C Z
+A Y
+B Z
+C Y
+B Z
+B Z
+B Z
+B Z
+C Z
+C Y
+A X
+C Z
+C Z
+C Z
+C Z
+C Z
+B Z
+C Z
+A Y
+C Z
+C Z
+A Y
+A Y
+C Z
+C Z
+B Z
+B Z
+C X
+C Z
+C Z
+A X
+C Z
+C Y
+C Z
+B Z
+C Z
+A Y
+C Z
+C Z
+C Z
+C X
+A Y
+C Z
+C X
+B Z
+C Z
+C Z
+C Y
+C Z
+A Y
+B Z
+B Z
+A X
+C Y
+C Z
+B X
+A X
+C Z
+C Z
+C Z
+C Z
+C Y
+A X
+B Z
+C Z
+C Z
+A Y
+B X
+A Z
+A Y
+B Z
+C Z
+C X
+A X
+C X
+C Y
+C Z
+B X
+A X
+C Z
+C Z
+B X
+A Y
+A Y
+A Y
+C Z
+C Z
+A Y
+C Z
+A Z
+A Y
+C Z
+B X
+C Z
+C Z
+C X
+C Z
+C Z
+A Z
+B Z
+A Z
+C Y
+C Y
+C Y
+C Z
+C X
+C Z
+A Y
+B Z
+C Z
+B Z
+C Z
+A Y
+C X
+C Z
+C Z
+B Z
+C Z
+C Y
+A Y
+B Z
+B Z
+B X
+B Z
+C Z
+A Y
+C Z
+B Z
+A Y
+C Z
+C Z
+B Z
+A Y
+C Z
+C Z
+C Z
+C Z
+A Z
+A Y
+C Z
+C X
+A Z
+A Z
+C Z
+C Z
+C Z
+A Y
+B Z
+B Z
+B Z
+B Z
+C Z
+C X
+C Z
+C Z
+B Z
+B Z
+C Z
+C X
+A Z
+A Y
+C Z
+B Z
+C X
+C X
+A Y
+A Y
+C Z
+B X
+C Z
+C Y
+C X
+A Y
+C Y
+C Z
+C Z
+B Z
+A Z
+C Z
+C Z
+C Z
+C X
+C Z
+B Z
+A Y
+C Z
+B Z
+C Z
+A Y
+A Y
+B X
+B X
+B Z
+C Z
+C Z
+C Z
+C Z
+C X
+C Z
+B Z
+C X
+C X
+A Z
+B Y
+C Z
+C Z
+C X
+B Z
+C Z
+C Z
+A Z
+C Z
+C X
+A Y
+A Z
+C Z
+B Z
+C Z
+B X
+A Y
+C Z
+C Z
+B Z
+C X
+B Z
+B Z
+C Z
+C Z
+C Z
+B Z
+A Z
+C Z
+A X
+C Z
+C Z
+C Z
+C X
+C X
+B Z
+C Y
+C Z
+C Y
+A Z
+A Y
+A X
+B Z
+A Y
+C Z
+C Y
+B Z
+B Z
+B Z
+B Y
+B Z
+A X
+C Z
+A Y
+B Z
+A Y
+C Z
+C Z
+C Z
+A Y
+C Z
+B Z
+C Z
+A Z
+C Y
+C X
+A Y
+A Y
+A Y
+B Z
+C Y
+C Z
+C Z
+C X
+B Z
+A Y
+C Z
+C Z
+B Z
+A Z
+C Z
+B Z
+C X
+C Z
+B Z
+C Z
+C Z
+B Y
+B Z
+C Y
+B Z
+A X
+C Y
+B Z
+C Z
+A Y
+C Z
+A Z
+C Z
+B Z
+A X
+C Y
+C Y
+A Y
+A Z
+B Z
+A Z
+C Z
+C Y
+C X
+C Z
+A Y
+C Z
+A Y
+C Z
+C Z
+C Z
+C Y
+C X
+C X
+B Z
+A Y
+C Z
+A X
+C Z
+A Z
+C X
+A X
+A Z
+A Y
+C Z
+C Z
+C Z
+B Z
+B Z
+C Z
+C Z
+C Z
+A Y
+C Z
+A Z
+C Z
+C Z
+C X
+C X
+C Z
+C Z
+C Z
+C Z
+C Z
+A Y
+B Z
+B Z
+C Z
+B X
+C Y
+C Z
+C Z
+C Z
+A Y
+B X
+C Z
+C X
+B Z
+A Z
+B X
+C Z
+C Z
+B Z
+C X
+B Z
+C Z
+A Y
+C X
+A Y
+A Z
+C Y
+C Z
+C Y
+C Z
+C X
+C Z
+C Z
+C Z
+C Z
+C Z
+C Z
+B Z
+C Z
+B Z
+C X
+C Z
+C X
+B Z
+A Z
+A X
+C Z
+A Y
+C Y
+C Z
+C Z
+C Z
+B Z
+B Z
+A X
+C Z
+B Z
+C Z
+C Z
+A X
+C Z
+B Z
+C X
+C Z
+C Z
+C Z
+C Z
+B X
+C X
+B Z
+C Z
+B Z
+A Y
+C Z
+A Y
+B X
+C Z
+C Z
+C Z
+C Z
+A Y
+C Z
+C Z
+B Z
+C Z
+C Z
+B Z
+A Y
+C X
+C Z
+C Z
+A Y
+C X
+B Z
+B Z
+A Y
+C Z
+B Z
+C Z
+A Y
+B Z
+A Z
+C Z
+B Z
+C Z
+B Z
+C X
+B Z
+C Z
+C Z
+C Z
+A Y
+A Y
+C Z
+B Z
+A Y
+B X
+C Z
+B Z
+C X
+C Z
+B Z
+B Z
+C Y
+C Y
+A Z
+C X
+C Z
+B Z
+A Y
+C Z
+C Z
+B Z
+A Y
+B Z
+A Z
+C Z
+B Z
+B Z
+B Z
+C Z
+C X
+B Z
+C Z
+B Z
+C Z
+C Z
+A Y
+A Y
+C Z
+C X
+A Y
+B Z
+C Z
+A Z
+C Z
+B Z
+A Y
+C Z
+C X
+C Z
+C Z
+C Z
+C Z
+A Y
+C Z
+C X
+B Z
+B X
+C Z
+A Y
+C Y
+C Z
+C Z
+C X
+C Z
+C X
+C X
+C Z
+B Z
+B X
+A Z
+A Z
+C Z
+C Y
+A Y
+C Z
+A Y
+C Z
+C Z
+C Z
+B Z
+B Z
+C Z
+B Z
+C Z
+C Z
+C Y
+B Z
+B Z
+C Z
+C Z
+B Z
+C X
+A Z
+C Z
+C Z
+A Y
+A Y
+A Y
+C Z
+C Z
+B Z
+A Z
+A X
+A Y
+C X
+C Z
+B Z
+C X
+C X
+B Z
+B Z
+B X
+C Z
+C Y
+B Y
+C Z
+C Z
+C Z
+B Y
+A Y
+A Y
+C Z
+C Z
+C Z
+C Z
+C Z
+C Z
+C Z
+C Z
+B X
+A Z
+A X
+C Z
+A Y
+A Z
+C X
+C Z
+C Y
+C Z
+C Z
+C Z
+B Z
+B Z
+A Y
+A Z
+C X
+B X
+B X
+C Z
+C Y
+C Z
+C Z
+C Y
+C Z
+C Z
+A Z
+B Z
+C Z
+A Y
+C Z
+C Z
+C Z
+A Y
+C Z
+B Y
+B X
+C Z
+A Y
+B X
+C Y
+A Y
+C Z
+C Z
+C Y
+A Z
+B Z
+C Z
+C Z
+B Z
+C Y
+C X
+C Y
+C Y
+B Z
+C Z
+B Z
+C Z
+A Y
+A Y
+A Y
+B Z
+C Z
+A Z
+C Z
+C Y
+B Z
+B Z
+C Y
+C Z
+C Z
+A Y
+C Z
+C Z
+B Z
+C Z
+C X
+A X
+A Y
+A Y
+B Z
+C Z
+B X
+A Y
+B Z
+C Z
+C Z
+B Z
+A Y
+C Z
+C Z
+B X
+A Y
+C Z
+B X
+A Y
+C Z
+C X
+A Z
+B Z
+B Z
+C Z
+C X
+A Y
+C Z
+C Z
+A Y
+B Z
+C Z
+A Y
+C Z
+A Y
+C Z
+B Z
+C Z
+A X
+B Z
+C Z
+C Z
+C X
+B Y
+A Y
+A X
+C X
+B Z
+C Z
+C X
+B Z
+C Z
+C Z
+C Z
+C Z
+A Z
+C Z
+A Y
+B X
+C Z
+C Z
+B Z
+B Z
+C X
+B Z
+B X
+C Z
+C Z
+C Z
+A Y
+C Z
+C Z
+C Z
+C Z
+A Y
+A Z
+B Z
+C Y
+A Z
+C Z
+C Z
+C Z
+B X
+B Z
+C Z
+B Z
+C Z
+C X
+C Z
+A X
+C Z
+C Z
+C Z
+C Z
+C Z
+A Y
+A Y
+B Z
+B Z
+B Z
+B Z
+C Z
+C Z
+C Z
+C Z
+A Z
+A Y
+C Z
+A Z
+A Y
+C Z
+C Z
+C Y
+A Y
+B Z
+C X
+B Z
+A Y
+C Z
+A Y
+C Z
+B Z
+B Z
+B Z
+C Z
+C Z
+A Z
+A Y
+C X
+A Y
+C Z
+A Y
+C Z
+C Z
+A Y
+B Z
+C Z
+C Y
+C Z
+B Z
+B Z
+B Z
+C Y
+C Z
+B Z
+C X
+B Z
+A Y
+B Z
+C Z
+A Y
+C Z
+C Y
+C Z
+C Z
+C Z
+C Z
+B X
+B Z
+C Z
+C Z
+A Y
+C Y
+C Z
+C Z
+C Z
+C Z
+C Z
+C X
+B Z
+C X
+A Y
+B X
+A Y
+C Z
+B Z
+A Y
+B Z
+C Z
+A Y
+C Z
+C Z
+C X
+C X
+C Z
+B Z
+C X
+C Z
+A X
+A Z
+C Z
+C Y
+A Y
+A X
+B Z
+C Z
+C Z
+B Z
+A Y
+C Z
+A X
+B Z
+B Z
+A X
+C Y
+C Z
+A Y
+B Z
+C Z
+C Z
+C Z
+B Z
+C Z
+B Z
+C Z
+B X
+B Z
+C Z
+A X
+C Z
+A X
+C Z
+A Y
+C Z
+A Z
+C Z
+C Z
+C Z
+B X
+A Y
+A Y
+A X
+B Z
+B Z
+C Y
+C Z
+B Z
+A X
+C Z
+A Y
+C Z
+C Z
+B Z
+C Z
+C X
+B X
+B Z
+B X
+C Z
+C Z
+B Z
+A Z
+C Z
+C Y
+C Y
+C Z
+C Z
+C Z
+C Z
+C Z
+C Z
+A X
+A Z
+C Z
+B Z
+B Z
+B Z
+C X
+A Z
+C Z
+C Z
+B Z
+B Z
+C Z
+B X
+C Z
+B Z
+C Z
+C Z
+C Z
+C Z
+A X
+A Z
+A Y
+C Z
+A Z
+A Y
+C Z
+A Z
+C Z
+A Y
+C Z
+B Z
+C Z
+A Y
+C Y
+A Y
+B Z
+A Y
+B Z
+C Z
+B X
+C X
+C Z
+B Z
+A Z
+C Z
+B X
+C Y
+C Z
+C Y
+A X
+C X
+C X
+B Z
+A Y
+C Z
+A Z
+B Z
+C Z
+C X
+C Z
+C Z
+C Z
+C Z
+C Z
+B Z
+B Z
+C Z
+C Z
+C Z
+C Z
+C X
+A Z
+C Z
+A Y
+A Y
+C Z
+C Z
+C Y
+C Z
+A Y
+C Z
+B Z
+B X
+A Z
+A Y
+A Y
+C Z
+A Y
+C Z
+A X
+A Y
+B X
+C Z
+C Z
+A Z
+C Z
+A Y
+B Z
+A Y
+C Z
+C Z
+B Z
+C X
+C Z
+C Z
+C Z
+C Y
+C Z
+B X
+C Z
+C Z
+B X
+A Z
+C Z
+C X
+C X
+B Z
+C Z
+C Z
+B Z
+C Z
+C Z
+B Z
+B Z
+B Z
+B Z
+B Z
+A Z
+C X
+C Y
+C Z
+A Y
+C Z
+B Z
+A Y
+C Z
+C Z
+B Z
+B Z
+C Z
+A Z
+A X
+A Y
+C Z
+A Z
+C Z
+C X
+B Z
+C Z
+A X
+B Z
+B X
+C Z
+C Z
+C Z
+B X
+C Z
+B Z
+B Z
+A Y
+A Y
+A Z
+C Z
+C Z
+C Z
+B Z
+C Z
+B Z
+C Z
+A Z
+C Z
+C X
+C Z
+C Z
+C Z
+B Z
+A Y
+C Y
+C Z
+C Z
+C Z
+C Z
+B Z
+C Y
+C Z
+A Z
+C Y
+C Z
+B X
+A Y
+A Y
+A X
+B Z
+B Z
+C Z
+A Y
+B X
+A Y
+C X
+C Z
+A Y
+C X
+C Z
+C Z
+A Z
+C X
+C Z
+C X
+C Z
+A Y
+C Z
+C Z
+B Z
+C Z
+C Y
+A Z
+C X
+C Y
+C Z
+C Z
+C Y
+B Z
+B Z
+C X
+C Z
+C Z
+C Z
+C Z
+B Z
+C Z
+C Z
+C Z
+B Y
+C Y
+C Z
+B Z
+C Z
+C Z
+C Y
+B Z
+A Y
+A Z
+C Y
+C Y
+C Z
+C X
+C Z
+A Z
+C Z
+C Z
+A Y
+A Z
+C Z
+A Z
+C Z
+B Z
+B X
+B Z
+B Z
+A Z
+C Z
+A Y
+C Z
+C Y
+C Z
+A Z
+B Z
+B Z
+B Z
+C Z
+B Z
+A Z
+A Y
+C Z
+C Z
+C Z
+C Z
+C Z
+A Z
+C Z
+A Z
+A X
+B Z
+A Y
+C X
+A Z
+B X
+B Y
+A Y
+B Z
+A Z
+B Z
+B Z
+C Z
+A Z
+B Z
+B Z
+A Y
+C Y
+C Y
+A X
+C Z
+C Z
+C Z
+C X
+C Z
+C Z
+C Z
+C Z
+B Z
+A Y
+C Z
+C Z
+C Z
+A Z
+C X
+C Z
+B Z
+C Y
+B X
+B Y
+C Z
+C Z
+A X
+C Y
+C X
+B Z
+B Z
+C Z
+B Z
+C Y
+C Y
+C Y
+C X
+C Z
+C Z
+C Z
+C X
+A Y
+C Z
+C Z
+B Z
+A Z
+C Z
+A Y
+B X
+C Z
+C X
+C Z
+A Z
+B Z
+A Y
+C Z
+C Z
+C Z
+A Z
+C Z
+C Z
+C X
+C Z
+C Z
+B Z
+C Z
+B Z
+C X
+C Z
+A Y
+A Y
+C Z
+C Z
+B Z
+C Z
+C Z
+C X
+C Z
+A Y
+C Z
+C Z
+C Z
+B Z
+C Z
+A Y
diff --git a/2a.c b/2a.c
new file mode 100644
index 0000000..0985442
--- /dev/null
+++ b/2a.c
@@ -0,0 +1,78 @@
+
+#include <stdio.h>
+#include <string.h>
+
+
+enum RPS {
+ ROCK,
+ PAPR,
+ SCRS,
+};
+
+
+enum RPS
+rps_beats(enum RPS rps)
+{
+ switch (rps) {
+ case ROCK: return SCRS;
+ case PAPR: return ROCK;
+ case SCRS: return PAPR;
+ }
+ return -1;
+}
+
+
+int
+rps_pickscore(enum RPS rps)
+{
+ switch (rps) {
+ case ROCK: return 1;
+ case PAPR: return 2;
+ case SCRS: return 3;
+ }
+ return 0;
+}
+
+
+int
+rps_gamescore_b(enum RPS a, enum RPS b)
+{
+ if (b == a)
+ return 3;
+ if (rps_beats(b) == a)
+ return 6;
+ return 0;
+}
+
+
+int
+main()
+{
+ char buf[BUFSIZ];
+ int score = 0;
+
+ while (fgets(buf, sizeof(buf), stdin)) {
+ enum RPS a, b;
+
+ if (strlen(buf) != 4)
+ break;
+ switch (buf[0]) {
+ case 'A': a = ROCK; break;
+ case 'B': a = PAPR; break;
+ case 'C': a = SCRS; break;
+ default: return 1;
+ }
+ switch (buf[2]) {
+ case 'X': b = ROCK; break;
+ case 'Y': b = PAPR; break;
+ case 'Z': b = SCRS; break;
+ default: return 1;
+ }
+ score += rps_pickscore(b) + rps_gamescore_b(a, b);
+ }
+
+ printf("Score: %d\n", score);
+
+ return 0;
+}
+
diff --git a/2b.c b/2b.c
new file mode 100644
index 0000000..640d6e4
--- /dev/null
+++ b/2b.c
@@ -0,0 +1,90 @@
+
+#include <stdio.h>
+#include <string.h>
+
+
+enum RPS {
+ ROCK,
+ PAPR,
+ SCRS,
+};
+
+
+enum RPS
+rps_beats(enum RPS rps)
+{
+ switch (rps) {
+ case ROCK: return SCRS;
+ case PAPR: return ROCK;
+ case SCRS: return PAPR;
+ }
+ return -1;
+}
+
+
+enum RPS
+rps_loses(enum RPS rps)
+{
+ switch (rps) {
+ case ROCK: return PAPR;
+ case PAPR: return SCRS;
+ case SCRS: return ROCK;
+ }
+ return -1;
+}
+
+
+int
+rps_pickscore(enum RPS rps)
+{
+ switch (rps) {
+ case ROCK: return 1;
+ case PAPR: return 2;
+ case SCRS: return 3;
+ }
+ return 0;
+}
+
+
+int
+rps_gamescore_b(enum RPS a, enum RPS b)
+{
+ if (b == a)
+ return 3;
+ if (rps_beats(b) == a)
+ return 6;
+ return 0;
+}
+
+
+int
+main()
+{
+ char buf[BUFSIZ];
+ int score = 0;
+
+ while (fgets(buf, sizeof(buf), stdin)) {
+ enum RPS a, b;
+
+ if (strlen(buf) != 4)
+ break;
+ switch (buf[0]) {
+ case 'A': a = ROCK; break;
+ case 'B': a = PAPR; break;
+ case 'C': a = SCRS; break;
+ default: return 1;
+ }
+ switch (buf[2]) {
+ case 'X': b = rps_beats(a); break;
+ case 'Y': b = a; break;
+ case 'Z': b = rps_loses(a); break;
+ default: return 1;
+ }
+ score += rps_pickscore(b) + rps_gamescore_b(a, b);
+ }
+
+ printf("Score: %d\n", score);
+
+ return 0;
+}
+
diff --git a/3.txt b/3.txt
new file mode 100644
index 0000000..192455a
--- /dev/null
+++ b/3.txt
@@ -0,0 +1,300 @@
+sfDRhjhHsHhgWPJvPmmQnmPqnW
+pTddGVwcpMTTCdnQJqqQqqqVtVms
+MdZCZGdcrCNRFZRhFssL
+CttWnSnNfSnCHsWrTlTPPpPCTRrLpl
+DgqqghjqJBVgDMTPGVlRGwbfLLGP
+cgqBBhjqcBdMcWQcQNnNzsfv
+lnDWMgTLlTFlHHgDDgngWFnlBWNcBQrdjcrrdQrPBrdjhWhj
+JqSVRRVmmRqJJbZGGJqJvbmBNcjPNQNssQPhSSdwPwwwQr
+bCRJqGJJmzmJZRCmFNTLTttTzfFfLglf
+SPWvWMvCSPcjzjDbcwfjTl
+lLNRNLqhhQVQJlRjrjrDwTzzqzzfrb
+GRnRVhRJLFnnhtJQNVdLdLgWCmmZlMlgSCSWSgpZtPBM
+pTGFrLFTFWFprLDBmLbSbtmBDb
+MqjwqJwZlqJjHlqjHHPmSbsffDmsStDnHnQmsm
+ZPJjVPZbVMRRPZwMJZVMNJMcGWpWFcWFFNFGrWTzWzFrzG
+MffZZtMTnTtSZLdfgSMtCHSbmWsGwbHGSqvmCqWb
+lzpQhrhphhlzDDhRPmBvqHGRbBbwbbssCB
+JJljpvhFrrjhptnddMJfdtgnMT
+drCtpNLCLpTpJSdswQhvDbHZHDLDHQ
+WmWgBWRcRzVVWVBgBBnnlfgWHjmvjQhwbbbshQvZDQQjsHZC
+fqBzggWPPzBWBzffcfnMJdtFtrpqrGMpdCCTdM
+JwJWqNBNNdzzBSzGsqbdNJbVMpptPmZMrVZrrZMtPmPwDp
+THgfgffffHRhQRLVMGVQmGtLDGmM
+TjGchhlHhGfhRHgRgWJSqzJWWlqNSzsWSJ
+dNmPlzdvdspsFWwQmG
+bhZSbVJBJnLNTnwWVHMGwQsGMFFw
+RnnbbTnSnSSTTnLfRCCPqDPDNDlfCfDDcr
+lhhTcnPchPPHCCStwWTHbS
+GDRFNqlQJsGJqGJDqVNsqssDQBSZWHQBCZHHwbZbtHtwCbZW
+RNJrFJFJDrmqsVjNmDvrvfzfffcvdpMrvlfh
+DtLdNGHNfwBJQwgCrncgpSpcnlfC
+sGqWPMPTvPPhTjjsqRqPvSlzFFpjnnSrjczprgllFF
+vVPGPGMbPGqTRWsMqZhqvbZNLLmLQddQdmBtBwBNBwNB
+ChVzhwpdpqHhtNmHHNHt
+QsjGTQcTWQjfjbssQDPmHgfrrVrPZnntZD
+jTGJSGvWJwqlvlCBqV
+pRVcSRffTPfBWfNVfWBWdJdwhvvwGjjFmGvhLTdh
+qsrHqtbDZqsnsZqCQDtHnQQLwFvJFhGJwddvwLcCwJJJdv
+sgcqHnzqqzgnHnqrstZzqsnSPllRlVVSNpWVNVRgMBlVPW
+WRQTtHrTrrDRvQDHrbtJlpdhLdGsDllfspLpphhs
+GzCSqCSmSmVSpsljphlpsL
+gVwCVGzmNmCNRQTvJQJHnvwQ
+psBDsswNjBcqtHtsTHsqtM
+vQrPqZPmvgQZrfgmPrfJQlLvnLzVHLnSnnTLTnnHMt
+PRCJRPgmqrmZmmqQQDDRwwNwjwDwpFjDDW
+VtBgCqbVjPbSbHtPRdrssZMFZlrRsBRw
+LzWmhcDqTDvnDWTFMrwRvwFrGZdGlZ
+zJLczJDnWDpDNzmDczWLzWzWNCbbttHPCHbSVbqgHSCjffQf
+TjTfvJjjvcjTQcDzMDfQTLLbLgVVVhMrWWblghbbLN
+dZHFSpqpqpbWrhhlWh
+dFwPBHqFSqwZSmZmSlqZjTvvJTmzcJsTTTjfvsfQ
+qqqNTlfjzbMGJlHMSZtZzZgRZDgZDzdS
+nLCCVVcmgCdZdSlg
+cmQscBVpFsppsVlffQGJHjlWHJGq
+whwVGGZhVLwhsFFDCTrDccCctrcctL
+CzSSvPSzTBStSWND
+HllCHvHJPPqjCPvbfdvvbsmhdRRRsmZhsRdMFQMRFQ
+gFCfCVfCsLCftsBsDbSHrbJRJJtrmrddrd
+hqQpqWhlNlpMlppfdTRhmbmTdbdHJH
+NGvvjvpvpfGgGGDCZZBg
+rmBtgdddtqmmrqBGbLGJlmctWWvbNzvfpsVVfzzSVSTsWNpz
+RPDRjMhDFljvsvzlSs
+wDChhnCQwDwmgJclqrgm
+WHrrDbWHQPzNrrRVMQJMQGvvsvvjnDLvfsjsvwfGws
+dhdhZhcphZZZmtFFTcZSmcZsnfqjLRnngnpwnGfqfvvnRs
+FZcZhtmhFCttldFlSSmlSthQJzNVMbRPWWPJzrbbJCNMPH
+wMFBpvTppLpwfNfjggmNmGTj
+ddSDDbGHnRDQDZRHSZSdRZDQzjjrzNNNfnmNrllhgglhfgWg
+bCQqsJqGDZCHbppwvtVMMvJcLL
+pSpSVdLDFCvDDvCFvJgwjsJbNtmtJgSjmj
+ZcWNNBQfwjsttsbc
+WNQMBflQQNGQrFpFVVRDHpCMDR
+PfPvqLphWpWLtZSWpWLPjwJbmDwJbbDbmJVjPQ
+lQQnRGMllMjswrmwJM
+ggRGFFGGdlGGzFFzzFFcNBvSfLQZShZTtdLWWZWSWZSp
+lCfgHsVHJDdswNRmsMRQ
+vccvvFVrPcvQNRdnmqdR
+rctPBrPBTTpPFBLZZcCCgVHJHVjjbLHfCjfS
+dfGdsGGrlFFlbWjfgblhJhLDLDDMLNvJNLLBnmLB
+tSppwQQHSSVtwStSpZZVqRJmBDzLvwPmzJznBDDmLBBJ
+cHvtpRSvptCRbbjrrcfjrWjf
+BBdHdjgQdjMMsHJscFnrzLpLgznLFzcF
+wvllmNmVvZfvmZWqcPptPztFSWLFGrrFnt
+ZbCvqqmNvflfVTbZfNllsjHdjdhhHDTHRBJjjMsc
+FNCPtPtgLFJwPwflFwSrLFcMczQZTbMVmzzVZMcNVVVb
+DhRDdhpWQDZmzVSQ
+vnhBSHppjRBHqpWvrPFtJLJlLvfLPF
+nmcSnnWjmfCTcHPHJCvh
+zdDdlrrzGFFLPtPhBBhH
+NGNGrzrRrzphwwwMmqqfnsfZZNbSjQSN
+lgznQGWQLQWlnSzHSQlwnlDhCbZhZhZChPChwDcDphcb
+jTRvVVrMvmLCPNcNZhRNcD
+jfftvsrVJLsVvJqsmfqjfjlQgzlQWFzHFGGBQgtFgnnH
+sllpwssrsCwrTRgCHGCTcnZD
+jjzJtSdhdzbJWhdQqLdzqSHmDZBGZmmcGGgBGTDRBQTD
+SVjgVhgtbVzJPfFpvvNrNswV
+StzdmmnnjSRRdhPPdZZd
+VbTbCqFFMbZTFcNQLgRgQbvvRh
+pGsqGGGfHGfZVffzwtrHnmJHllznrS
+NLWJvtLjtLzBjNSvSMDCHfwHSlDMlSSHfZ
+RTPTVmhpnprfcfgZwgRD
+PnPGFhGsTphsFpdPnpVdmhwFvBJzbdWNtJJjtNJNjbvJtttN
+RvmgjDqqjqRgZRMRDpQjQhWsbPLPFnPFFbVVLbdSbnPSvP
+NwczHBrJTzcBJHrfWJBCJcrCdnPPPNSlLnsnbFnnLlbSFddS
+rGJwCCCJHwBGGctGDtphQQMppQWZmRpD
+RPhhSMqRccBDZPPPRhPcNZSzzTLJrWZLmVVQLWZdTQQJWL
+nwggfwCvbjwvbwpzWLpWVLdrrrQVTm
+vgnGGCsCtntbFsgqlRVMSqNVBDtPSc
+mtstjJmvTNBcjRRCHCfH
+gLpglwwlgHbZbgpgFrdBBBfdfSPBLSSrcS
+GQGglGWWgMglQFHgbmTmNtDqnDDVJMDMNJ
+ZMbBZfvVfFfBbMvfMhgbfDsrSTTszcldmTTPmcPFDz
+QqQQnwrqWQpwRWWpWwJRwNzTTSPpzPPdTPpSPmdSscmS
+GjjtJRWtwGQjRZVChZMjVCrMMf
+fJNPTvDPTpHHTPwvjNNHDfTWthhgQQGdBddtlvMsMQMvQh
+rFbZVZrLmLdGrrhMBQWg
+FmnzVRFLqVqqVLVRRFZSFmTwfHHjHCNCCDGwjnCDDfNH
+gQHHQJgCnNJnQFQPRbDQzLRR
+mwrdpctWtrMvvrrWwGMmGWWPLzFFLSbLnDFsLPdDFbZRLz
+vGcmGwBBMGtmmrvlMrGlqNghlVjCCnTHHCHgCCjh
+LmLvVjVjsrmrtmmr
+tfcnbScRnlMZtHQPCgSQssPdHC
+RGGGGnRfcwnGbbJRBRcwJfnGtBDhhVptNhDvLLhVvvjBWNvT
+dZWNQZgQbbNvdWGgZvbTfLrjtrPlGJfrLqLJlj
+TMmDpwzmVMHpBLfrcccMfqLjct
+SwnSBTDDTwwzwnnsFSZdRNbQZWRvgSCvbQ
+WPgZgQLLbMgdBrdnGqqfdhVVvR
+HzssNTzwlwHHcczwFjMFHjVGrqRqnVThVqrGrGTRqvrf
+zFzcHFNlzJBLgMQLJCZL
+nPLNcWtNtlLMccLlWdTjzzbBfBQSzqzBqPqS
+RbbDZZrGRJhJjgJQSjCfqQCC
+rrmRbDDwvZDpprbGrbDvtctlVVVHvdtlcMtWHMHV
+DWrZJrQjWwFcrhzVzbpmpcVqhb
+MFnFHMNSqbMpMMmG
+FNngNRBRCgnHCCHRPvLNdgJWwJDlJJDssZDLWWlWQlsl
+BQqNsGrbBCNbNCrMpGpbHhthRCDRDRJCmDVRhRJP
+nfvWvcnSWncSTdzzFLJtRmhHmPPVPVTwwHHtTh
+WfLfnfSJZJvdLFZWngfBMGMppGMrNBbGMpZjrj
+rccMjBMVJcjjjNNqmmCf
+LLspTTGsTGntsntTFwnNNfFqQmmNgNqfNQmZvQ
+tpDTwlGDTGPPsbtsLsnnqGTJzJrJBzHzMVrMRzBMlShVBR
+PsrNPRjjPbjzjLRWLbjmvtCnMntnpfmtNZNCNv
+dDlfwwJllhJTcllScSCQvmtCnmtCmQmQmG
+TTFcdhJwhBFfwJJHhdchVclrsbWsbzqLgbzrrjgVRgsqgW
+vvcvvDJFcDZPTzwfcwSLczzScz
+VNnnVVsqGNntsqtBRblqBndSfzCCRzwRfCHSjdfSjzSH
+pppsMVlGGhhrZwMMDP
+LltNHMZNHMfNnfgtLHWWbhWjcblSbVbcTWVP
+vFmCZsqRRBqrVPWsWTWPWb
+mQBqJRdqQBqQzzRQztgLgntGZttddLMggw
+ZTCCrCWfGLGBWSwHvHHmHvmTTH
+bllhnsbjDlqFfqjhnFRppwmvJppmpRRwMNSmmw
+FlnFDjdtqhDdfZZBrtBrrPLt
+CRCTHHJcCmJgTSTRcSMcRMVstssSrtprppVFtdrdspNb
+jjllnvgBLqdsGprtqtFG
+vQjzWnWZWjBLhjgwcccRJgZPCmJm
+VRNmBBRNRFcCRcFVRSVSqZLLvvlLqvLfzfMhjJLC
+TdHsHbDsbHMJLqlLzl
+bgQGsgWWGGgbDgwGzBNSFrFtVSmwRRNFtn
+pCCggQPPzWnvlDcWVHGJcNBl
+LhsLMrwwGlnMBlNG
+mmhwZmqSLwjLttnFbvgFTpPtPtgFCz
+TtZSJzFZhZzTFcgFFcmRRmJJQllCHvPshVQsCrshsCssHVHW
+GjGGDGqdGfbpDBjMdjpBjBNbVHtsWWPHlMlrrrrWWlVlVsCs
+dBdDdfqLdBjjFRFScRStmLnL
+GtVppGGPbVgTVFQrZzfrJfJJtMJr
+DslmNmLsnmNHNNnnqQRZSJSQfqrJzSJn
+BNljDHsHlvhmBshDljWsDWlHdgvpVTFggVgGcTTpvFPTzGCV
+GRcnTRtcQTcBTsNtpvhFCmmFhZvFPC
+bBJMgqWfdwBJfMPPPmvPqhmjvvPC
+SMJMdJbdfwJgVglMWWVdcQnBzSQDzGGQzRQDTQSB
+mvjVzLgTzVzvVjJrJgrlMhZRFTtRlRhMRRRtFZ
+HGqnNNqfnHNGGfCHndBqnqfFlcppsJMZplMFpMtlscRlpC
+qSnPGqqbnSdVrvQrrSJjSV
+lWFSWZZvVqnqfnSrJzMcPDjJBJcBMPFJ
+NGppNgHdHbRsHPbsgGspTwHTMcmMDdJMMmzBDcMBMDQmjMBd
+TGGLRGwHsGtpHgHpNbpttwrvCnvCrqSSLvWqPqSSnWvn
+jwcqBNNdZLjSfvPdddRlfb
+CDVmsgMHCnnDnhVghmDnDCzRRrSrbrlTbsSTlzzlvzPb
+gCCFmCWDnChGCFHnGCLBcwwjvZQZNtGqqNZc
+LBDcNstdNJscccVDhLHNDHVtFvdldlFvCSnSvjSSbblgvZjF
+rWznQqGMMrmmRZbbwvSFgjwbwm
+RQnTQfWqqTzTLJJLVtBTsc
+SvwCTHqCqqqHtwtnnHHDtWgrBQLzzVLLzSQVFhbrSFLL
+cZmPNmPJdmPjPdcclRPPdhBCFVVVrQzQCCLbcgVbBV
+fNlmfZfpfWMCtGGpnM
+bSNssNssbPHVccPhclPGpP
+ffQfZdZZBDDZgLvhmhzVmVppmlpGgh
+jdQQQJRljSFFTWCT
+lvlLtvnhnfvMgtrvWjmTmPPzjHcrmdcjdd
+qCbssCJbppQZQbRJDQSZCJRpzhmcQjdcTBmmGzmdcmjGmdmT
+SqwSbJZSpwwFJFDDbqtNVMwVMMlVNgNVlLhV
+DqGFQGNMGMQwCcgtCJcr
+sVfjWlzzVsmzVZsdVlHrhjppcgpjrhpphcSJ
+LRdLsZBWWmlZldZRmzPDvDTTDMGTPFPvBTTc
+jzzzpjgBzTDQQHPH
+gLLtZVdCdsLfnbZCbdZtHDfHTJJPPmJJfmHQDJqD
+bVtWndLtcZgnhsvMSBrMFrvBWNrB
+sfqhLDcqfqRRqQhQRqMcvlJpJwFgzwpjplwbgpwzLz
+CrGttnhTWtmSnGrtTtSCZGFzbgHHFFFjljHjZHHFwgwl
+mBnrrTmWWCGStVCmMcDPcPBqcsRhcvPR
+GLZLBNrGZdGGVgMVJVhnvn
+dmWlcqcQMWCJVhMn
+cdpPqtQbcHlmQjmZswFfTRFpBTfwwT
+ZhtZpvbnbpPbtLHLvdsNdcRLNd
+jDDjlCflGwsHfdrfTLrrdN
+MzmljBMBWPtsbtSQtW
+GHrzPSrNLFnMtSBZjZBB
+WWbfDmVmwmmlbVDldWslNnBMJJNZZJCtJJJn
+vwDfffVvmDwdTvDRQvpLNpLpcRFpphhHLPHg
+scsTslgcnCTCScSTcqLLWlFWLLqbGvRbpL
+NZMBdBPtNbbrLGqqqGvqZF
+NttdbhMPfjQfNtbMbMmNjhNcCzczSSCSJTSzTCScnfnzwC
+pjdjCGGGWPCMSDfS
+JhFMFcrgBHPnSnWFWDDn
+HVBBJctBccghsJhgrbwLGTTdtjLdbmTMMb
+DtGHgDPfGfPhfLwNWSSJQcpHcr
+dvlMCzdnMRFCCTjnZNpNQJcSbrWzrpSQWS
+TVvFJJMjJdlMvRvMClllZZgPtPGsftfDqtGfVGsGtqqq
+jSmmcjmJqcBgwmWMCLLzCsMz
+TnTQVDGQTpZGNQHDZDHHQDwsCCdLrflsrCVzVrwWzwrr
+zDFpppnNQtnTQQvZZZNvnhqqjtRccRbgqqbSSSjPRg
+FwClNSwCFstWZLDLvhvjvtjhhD
+TmsHmsmrggzmqnnGGvPGjTbbRGBhbB
+cHVqgcrVzrQqzHmMcrMnczzcWFVCCFNJZWJZswwFCZWwffwS
+mzbsmbmLRCZTRbSJFvPLPJPJpJffcP
+QqWqNVNNNllnnWTglqTVlGNPJDvwcJpwfwccPgccPJDfJF
+HMGnNMltqGMjHGqMzmTSmzTsRSszSm
+qlGDfljllCTgqCTvCDfBHHQsbrSZZHSHWtvWZB
+NzpnNpRnLLwRpdwpVhtqQbSbsWQWbSWnrrnH
+cFqwFNpLdVcDJlDgccTD
+BRqjnSBNBpRHHpjpBSnHnRBQfQzzCvzWrsWCTvfsvCsCCsfC
+ZMVbhqbMdlbLTdsWvfPdPC
+hlZVDMZcwJNSgjJgJFnq
+CZwZssQQZrmsCmNNDpDGFblclD
+HMjWMbBVfnnbMbnzMpFhlNSNFFSDcDGSzN
+LnLLqjnBMjMngHbnWrTgZsCsgZvvvQrvQs
+RCFCCJQbCQcprRlHHPpHhd
+tWWLwvswfvZshgqDpdpBgfdf
+mZtvZtMpjZzwWFjJTcQQbjjnSQ
+fBfVwtttLDFctDtwFPWfTppWfmHCHdJhdChT
+bGMRsbsvMQSSzMzZSNzsZvRNWTZJlmgZTJJdhhmppHTJCgTg
+jssjNSSGMsQHbsRvHNPjtDcDcLPPPPDwLDDV
+pClhQjJccrpbpqHhMhVhSMqHPt
+dBZGZdgBzRsBsvMwGGVPVqMGwtVH
+ZvDddZvDBdDdDmgCmVmbbCNpCCbljW
+DTMCpdCnwRDwdfMCDDCssfZmGrBrjpttjrNrgctmGpGr
+VVqJQgSSWzhPGGrPtNNQtm
+bFvhgWzHJlDdffswTvRd
+jwCCPPTtCswCCNTsqRNbMqQMVvVzMMMQSGvQqn
+hprHlmFcHcdhWWLchZzHrLMvvnBvJJSBJMVMnnmMnMMJ
+WppLcZdHWHplZWlDHhHTfzRzCCsTTtNNgtjgDw
+vhmDFcDZmczMrwcqrMrmDFrvggtVSWgtSNwsjBtNVSnBsjsS
+dbbRJHbpCWBBpZVgSS
+LZLdHlClPmqLGDvMDv
+mFbWsvsJVtbbRwfTSP
+BGpQllhLGqhplBGZBfLMTSTLwwfwMJwMPT
+GlDnDpQZlZZpZBlpWDNcmrgrWmNdNJvc
+zbtqTtHQbZZpqbPpvGJdvQdhrhQjdQGs
+qDFLLSNqcWwsGhGDJh
+LgBcfnFCSFnLccggSVCVtHZlpqPPtTRMftHMbMzb
+hzrrWnzRZRnbWVRzjcRHMDdqqQdNMHqHQQjlHM
+sGCpCtppBfCTgwBBCwPBCssQqMQvNlSMMQDQNqHGHvDSbQ
+tpLFPgfbCsfbzzcnJhRhZLhc
+qzzGqfpFvWFmRSPjPjRP
+cwwVssBMtNMNLngstgVBnrsPmHSJJmjllhQdQldmhdrjQJ
+nDVSsLwcVcMnBGzTDDCvpvfzGT
+bcTbbcZGZLPgTMWZpLLDQnrvPVnVmmjmRPFVrF
+HJCJqlzBdsSjzCJRmlrlrnVQQDFnVF
+BfwffNdNswLtbWbNcpjt
+smJwSNNFMzFNDrvbrbfJHvbl
+BRQjqZQcBhrbTsbTnfcn
+ZLQRZRBjjPWSsmCdSWMgSN
+NhwlDpbWggdSBvBggLFg
+fRrZsVfjqljmsQQVmmsnFMFSBLLRvFTFMBSvFF
+QfqVVzcsQmcQqrcsNwzzzPphHlwNppPH
+nnFdsjVdmpBsBVFHzjpvlTfQdPcQQPGPcvlGPv
+DWMDCCWbNJhLtMgJMNLgtMgQflZQlfQGjZZhQZGhTfQcQP
+rCrtJJgLLMbgDgMDWNRrWRnzsjpFzBzSHmmqHmqnHH
+rmjjJmmdwSmGhdsjJtsgGNzFWQFnBFVWHdFQcLLcNz
+RCCbfRlvvPfvCTnHLLnNbNLczHnQ
+lqZTllRRpDMlpfZRvgQpSmwwtggQjJgtpS
+LDsGvTSSsswCwTrLZDqQWHMWbphlHMpGGpQz
+RRPfPRccBdVjPcFlpMpMQWzMWfpF
+RjPRjRtczcNBJRSCtLDTvTSDCCST
+pqQNgNnSntwgqzzQCzNwCNBRcWtBjZcZGrBMcHMGvWcr
+mmJdJPFVbJbPPGZbMRbvvrjcMj
+lTMVVlLPfLNQhpgqLSLn
+HlBHFrgBvlfzFzqvnvFqpCJbJfQpQpLcmhbcmtmm
+jDjPGsRRTMMPjdJmjmLpCLth
+MRMZMWsNpFFFVFHW
+RGgwWcppGSWcWSRWmGdWcttHQFJHfbQwBQJTJQBQfJ
+njjZZCMlCZjqMBFbJQZHJHBQft
+DsjCPDDvjFNsMNjNqpGspcsGSmcpccrGWS
+cVwMZGVZwHNPgPwRZwHttThlHllvlzQpptzppl
+DsCWdqLdDCnfJLSCqsqWRsBdlhjlhzlttzQhhtvlhnhhhbzT
+JCWWRWCrLDDdBdLsSsLLSCrCNZMVcmMZMFwMZwNZPZVGFPmr
+hhPzDzPhPNbfpzhBbdNbDhttzqWtwttHWwntjqmwmWFm
+LgGZSdMMrgTLrZLdgLSgsGTFFjrWtFFmmmFtWjqHFnFtjn
+vZgdLvZLZQLRQZQQdMZLdQvVpRhNNPfJDbcBbbhVNJNNhf
diff --git a/3a.c b/3a.c
new file mode 100644
index 0000000..676db86
--- /dev/null
+++ b/3a.c
@@ -0,0 +1,65 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+int
+chrcmp(void const * a, void const * b)
+{
+ return (*(char const *) a) - *((char const *) b);
+}
+
+
+int
+priority(int c)
+{
+ if (c >= 'A' && c <= 'Z')
+ return 27 + c - 'A';
+ if (c >= 'a' && c <= 'z')
+ return 1 + c - 'a';
+ fprintf(stderr, "Unexpected priority request: %c\n", c);
+ return -1;
+}
+
+
+int
+main()
+{
+ char buf[BUFSIZ];
+ int score = 0;
+
+ while (fgets(buf, sizeof(buf), stdin)) {
+ int len, i, j;
+
+ len = strlen(buf);
+ if (len && buf[len - 1] == '\n')
+ --len;
+ if (len % 2 == 1)
+ fprintf(stderr, "Unexpected length: %d\n", len);
+
+ qsort(buf, len / 2, 1, chrcmp);
+ qsort(buf + len / 2, len / 2, 1, chrcmp);
+
+ i = 0;
+ j = len / 2;
+ while (i < len / 2 && j < len) {
+ if (buf[i] < buf[j])
+ ++i;
+ else if (buf[j] < buf[i])
+ ++j;
+ else
+ break;
+ }
+ if (i >= len / 2 || j >= len) {
+ fprintf(stderr, "No match found in %s\n", buf);
+ return -1;
+ }
+ score += priority(buf[i]);
+ }
+
+ printf("Score: %d\n", score);
+
+ return 0;
+}
+
diff --git a/3b.c b/3b.c
new file mode 100644
index 0000000..84455e1
--- /dev/null
+++ b/3b.c
@@ -0,0 +1,87 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+int
+chrcmp(void const * a, void const * b)
+{
+ return (*(char const *) a) - *((char const *) b);
+}
+
+
+int
+priority(int c)
+{
+ if (c >= 'A' && c <= 'Z')
+ return 27 + c - 'A';
+ if (c >= 'a' && c <= 'z')
+ return 1 + c - 'a';
+ fprintf(stderr, "Unexpected priority request: %c\n", c);
+ return -1;
+}
+
+
+int
+min(int a, int b)
+{
+ return a < b ? a : b;
+}
+
+
+int
+min3(int a, int b, int c)
+{
+ return min(min(a, b), c);
+}
+
+
+int
+main()
+{
+ char buf[3][BUFSIZ];
+ int score = 0;
+
+ while (fgets(buf[0], sizeof(buf[0]), stdin)
+ && fgets(buf[1], sizeof(buf[1]), stdin)
+ && fgets(buf[2], sizeof(buf[2]), stdin))
+ {
+ int n, i, j, k;
+
+ for (n = 0; n < 3; ++n) {
+ int len = strlen(buf[n]);
+ if (len && buf[n][len - 1] == '\n') {
+ --len;
+ buf[n][len] = '\0';
+ }
+ if (len % 2 == 1)
+ fprintf(stderr, "Unexpected length: %d\n", len);
+
+ qsort(buf[n], len, 1, chrcmp);
+ }
+
+ i = 0; j = 0; k = 0;
+ while (buf[0][i] != '\0' && buf[1][j] != '\0' && buf[2][k] != '\0') {
+ int n = min3(buf[0][i], buf[1][j], buf[2][k]);
+ if (buf[0][i] == n && buf[1][j] == n && buf[2][k] == n)
+ break;
+ if (buf[0][i] == n)
+ ++i;
+ if (buf[1][j] == n)
+ ++j;
+ if (buf[2][k] == n)
+ ++k;
+ }
+ if (buf[0][i] == '\0' || buf[1][j] == '\0' || buf[2][k] == '\0') {
+ fprintf(stderr, "No match found in %s/%s/%s\n", buf[0], buf[1], buf[2]);
+ return -1;
+ }
+ score += priority(buf[0][i]);
+ }
+
+ printf("Score: %d\n", score);
+
+ return 0;
+}
+
diff --git a/4.txt b/4.txt
new file mode 100644
index 0000000..1d9c7dd
--- /dev/null
+++ b/4.txt
@@ -0,0 +1,1000 @@
+35-73,35-82
+9-27,10-80
+25-93,2-42
+37-54,52-53
+3-8,2-97
+46-89,45-49
+52-76,75-75
+26-27,21-27
+22-96,21-80
+98-99,6-99
+4-9,8-91
+32-46,39-54
+14-14,15-51
+49-56,65-87
+16-16,16-33
+63-96,95-97
+3-81,3-96
+3-69,3-68
+9-93,11-93
+3-8,8-94
+94-97,5-92
+35-73,53-73
+17-17,17-84
+88-88,5-89
+11-99,12-62
+31-33,23-34
+98-98,10-99
+26-26,26-86
+21-63,22-50
+44-81,20-45
+40-41,16-42
+1-39,38-40
+33-97,97-97
+8-9,8-77
+3-76,2-75
+71-82,71-81
+65-85,84-86
+13-71,12-14
+57-95,28-96
+10-35,3-35
+4-99,98-99
+53-60,54-85
+39-43,16-43
+1-86,85-86
+6-7,6-35
+3-3,4-69
+15-72,3-16
+25-48,24-48
+12-33,12-34
+61-63,8-62
+76-76,59-77
+18-82,81-81
+83-91,24-87
+2-2,9-9
+29-94,29-29
+41-87,41-93
+43-44,44-81
+9-83,82-83
+78-97,9-97
+11-26,12-49
+2-20,1-72
+29-97,28-88
+54-73,30-55
+30-77,96-97
+4-62,62-62
+25-60,60-60
+12-89,4-99
+96-98,4-83
+20-68,12-14
+76-76,19-76
+2-93,5-93
+64-64,46-65
+14-61,14-15
+19-85,18-86
+4-85,16-85
+88-88,15-89
+66-66,66-73
+1-93,1-2
+16-81,10-81
+79-89,3-88
+57-94,79-95
+52-52,12-53
+13-27,27-27
+13-13,14-14
+82-84,22-82
+68-93,25-69
+43-85,44-85
+2-27,24-75
+34-44,31-43
+6-47,12-54
+43-75,42-74
+12-91,7-90
+48-54,53-66
+40-54,53-90
+11-61,12-95
+16-86,17-85
+10-94,11-11
+86-88,4-87
+17-94,16-93
+16-55,15-17
+29-50,28-49
+12-75,13-76
+27-37,33-36
+9-9,9-95
+47-99,98-98
+35-87,87-87
+38-99,39-99
+5-58,16-57
+84-86,84-88
+73-75,74-76
+10-92,11-92
+6-51,50-52
+3-21,20-21
+15-55,14-15
+50-50,50-98
+5-55,6-66
+44-97,86-96
+2-62,3-63
+3-98,1-99
+32-75,75-76
+71-71,70-79
+46-89,5-61
+79-95,80-94
+71-88,69-89
+49-72,48-80
+3-56,8-76
+10-79,12-89
+33-97,33-96
+41-91,90-90
+32-44,31-32
+25-52,45-47
+38-57,38-57
+88-88,13-89
+23-45,22-44
+12-93,13-69
+76-76,27-77
+16-17,16-24
+16-92,91-93
+8-95,8-85
+4-64,3-65
+18-94,17-34
+43-52,43-52
+16-97,15-95
+10-39,15-38
+33-33,10-34
+35-56,34-48
+97-99,41-95
+45-49,44-49
+5-94,7-94
+2-98,1-7
+17-73,16-74
+11-20,9-12
+27-27,26-64
+5-93,8-92
+16-77,16-76
+58-90,93-94
+36-59,40-59
+72-84,72-84
+2-81,4-95
+31-63,32-76
+4-88,4-5
+18-20,19-87
+84-84,84-95
+26-76,75-75
+7-79,42-79
+29-37,23-29
+28-51,28-50
+38-65,8-39
+55-89,56-90
+6-6,6-49
+14-18,23-43
+61-70,2-70
+5-92,92-92
+6-71,7-75
+41-59,42-59
+99-99,7-46
+15-50,51-57
+17-95,16-17
+54-88,55-87
+36-36,36-73
+79-87,27-79
+38-85,32-39
+91-93,41-92
+71-75,52-74
+37-52,37-53
+33-67,4-68
+27-94,27-99
+12-90,89-90
+7-70,6-69
+97-99,96-98
+91-95,7-92
+23-95,24-74
+8-35,34-53
+26-94,26-94
+90-90,71-91
+8-16,7-15
+3-97,3-98
+23-23,22-24
+25-65,24-40
+24-24,13-25
+1-83,3-82
+10-11,10-65
+40-41,41-41
+91-91,2-92
+70-95,94-95
+2-86,3-83
+10-12,11-93
+77-90,38-71
+25-25,12-26
+75-77,5-76
+9-85,7-10
+7-94,87-93
+95-95,41-96
+51-75,50-52
+40-87,41-41
+23-47,47-72
+21-98,20-98
+10-63,10-53
+68-82,68-68
+18-78,18-50
+29-60,33-96
+2-53,9-53
+5-97,1-5
+23-49,48-78
+23-70,23-24
+4-95,3-96
+14-35,13-34
+41-67,40-40
+4-96,3-81
+54-55,54-70
+7-79,18-81
+61-71,61-70
+9-9,9-76
+69-91,69-92
+10-90,11-95
+95-97,67-96
+85-94,86-91
+70-73,68-73
+23-76,92-99
+1-12,11-94
+46-77,46-78
+65-73,52-72
+27-62,28-98
+30-76,73-75
+5-45,5-71
+11-90,89-89
+14-92,14-15
+62-75,61-87
+25-88,84-94
+16-84,17-95
+18-93,17-93
+27-59,27-27
+36-43,36-42
+42-42,43-56
+7-41,40-41
+6-95,6-7
+23-98,12-98
+6-87,52-88
+54-62,53-68
+33-86,18-37
+2-98,12-98
+78-96,73-81
+93-97,93-96
+7-7,6-91
+34-49,34-48
+43-65,61-66
+57-72,67-98
+16-89,15-89
+3-66,2-65
+21-45,22-31
+7-47,47-54
+1-78,1-79
+31-77,32-77
+88-91,18-88
+15-82,11-16
+37-90,20-90
+18-52,21-81
+1-96,2-96
+6-54,5-25
+20-46,17-47
+2-7,7-94
+10-42,16-43
+25-43,26-56
+11-99,11-12
+4-95,3-94
+61-63,69-88
+1-93,37-99
+94-94,14-95
+4-43,3-46
+79-98,78-78
+2-78,2-78
+48-72,48-72
+10-98,3-99
+22-47,35-54
+8-62,9-16
+2-22,3-8
+4-93,5-91
+3-84,72-84
+18-32,18-19
+40-65,51-64
+34-36,34-34
+11-65,12-64
+23-98,24-97
+23-75,74-75
+4-6,5-72
+5-89,5-88
+25-86,85-87
+65-91,2-91
+93-94,2-81
+11-54,23-54
+57-94,93-99
+18-23,22-23
+88-88,4-87
+97-97,1-98
+6-99,5-5
+15-49,16-48
+41-68,68-68
+40-88,89-89
+89-91,7-90
+5-87,52-86
+31-39,32-38
+98-99,1-99
+36-49,48-49
+15-61,14-41
+41-53,42-63
+2-21,12-20
+37-47,47-47
+21-21,22-94
+48-65,49-69
+38-80,10-39
+7-7,7-85
+32-85,32-33
+42-79,78-78
+22-92,21-23
+1-35,3-47
+6-92,7-93
+40-94,6-87
+48-96,8-95
+45-95,79-94
+1-92,9-89
+21-64,20-65
+7-76,7-8
+1-59,3-45
+9-9,8-85
+16-32,31-70
+56-93,56-56
+8-15,13-89
+43-43,42-60
+31-73,6-74
+24-24,20-25
+36-72,36-37
+74-96,75-75
+6-94,5-93
+13-97,5-14
+10-22,22-22
+39-86,39-39
+75-75,75-83
+25-76,14-77
+9-67,66-66
+6-25,24-26
+8-8,15-62
+23-61,8-61
+32-34,6-33
+38-78,77-79
+52-77,53-77
+17-86,9-12
+88-90,2-89
+10-25,15-26
+25-86,24-24
+35-92,40-91
+19-79,83-86
+1-1,4-64
+66-72,71-79
+43-45,42-44
+7-93,6-89
+1-75,1-76
+7-8,7-99
+11-54,10-44
+5-6,1-6
+24-41,5-25
+7-93,7-85
+96-96,71-93
+41-84,41-83
+50-72,65-81
+23-24,23-77
+7-97,3-62
+26-26,25-32
+36-65,30-66
+83-83,77-82
+10-75,74-75
+10-90,11-89
+98-99,19-99
+98-99,1-94
+7-39,14-39
+8-8,9-91
+27-77,26-26
+22-78,36-78
+51-67,67-68
+12-35,11-49
+27-61,60-62
+23-51,26-94
+48-79,49-96
+13-95,6-39
+75-84,76-80
+18-67,19-68
+51-76,46-76
+40-93,33-41
+37-80,66-90
+16-50,15-95
+6-81,5-7
+10-94,9-65
+42-96,43-97
+16-71,17-72
+1-38,36-39
+62-63,62-86
+5-99,1-99
+71-72,8-72
+4-35,2-36
+1-52,51-53
+70-80,79-81
+46-47,47-82
+29-65,40-67
+42-60,35-54
+39-74,7-74
+74-97,4-97
+62-97,55-75
+8-36,7-35
+31-75,74-81
+12-34,11-85
+49-79,14-50
+52-53,53-63
+93-94,62-85
+85-93,13-87
+60-61,62-95
+2-5,4-80
+60-61,60-98
+24-58,24-59
+13-67,14-80
+13-80,14-81
+6-36,5-73
+9-76,80-81
+11-96,11-98
+20-97,88-98
+6-78,5-77
+7-7,19-47
+35-41,84-88
+57-59,44-59
+24-55,24-54
+13-80,13-14
+5-6,5-42
+51-90,52-52
+18-92,19-93
+20-20,23-94
+91-91,23-90
+22-77,98-98
+14-33,15-96
+28-34,28-29
+26-73,96-96
+45-86,44-87
+40-95,21-93
+15-20,14-14
+5-99,2-99
+89-89,23-88
+35-92,73-92
+92-92,36-93
+6-70,16-70
+18-85,19-85
+44-51,43-56
+17-88,16-48
+7-94,8-96
+90-90,34-83
+53-66,68-70
+19-82,18-81
+10-91,9-91
+22-76,31-77
+55-55,15-55
+2-61,2-3
+18-75,37-74
+36-95,35-37
+57-65,64-66
+89-91,10-90
+35-40,34-35
+6-90,6-6
+6-27,17-85
+9-10,10-30
+7-85,8-84
+60-60,34-60
+74-75,20-76
+58-94,7-93
+83-98,14-93
+10-86,9-62
+46-87,76-87
+34-73,34-74
+35-66,13-66
+99-99,4-93
+56-83,52-83
+3-90,2-98
+34-97,33-87
+71-71,10-71
+4-8,8-96
+81-89,17-81
+46-96,46-95
+20-34,19-32
+77-89,71-74
+18-71,19-20
+43-88,44-85
+40-94,40-40
+7-73,72-73
+98-99,50-97
+8-45,7-46
+33-73,33-73
+38-97,96-96
+24-86,24-87
+17-54,17-17
+46-84,43-84
+5-92,4-31
+58-93,99-99
+33-35,34-98
+43-74,36-49
+9-76,10-83
+4-93,3-92
+67-83,66-89
+17-54,15-17
+86-89,88-89
+16-50,4-51
+10-11,9-11
+41-94,94-94
+58-74,59-92
+19-35,34-36
+4-5,4-99
+38-75,56-76
+50-84,58-85
+1-35,34-35
+36-37,37-89
+1-47,15-95
+67-68,67-69
+50-94,93-98
+59-59,37-59
+62-63,63-79
+31-98,30-82
+32-91,31-92
+3-91,5-91
+1-1,2-92
+19-42,18-44
+62-70,22-64
+79-87,79-86
+3-86,2-2
+88-92,52-95
+3-49,1-7
+9-60,10-70
+70-94,40-71
+15-43,16-44
+62-94,93-94
+19-64,24-64
+7-75,74-99
+14-14,15-60
+9-71,9-71
+4-80,2-81
+39-78,49-78
+1-98,5-98
+1-14,2-44
+7-20,6-19
+41-41,40-84
+90-95,90-90
+11-16,15-45
+11-82,81-83
+20-73,15-73
+50-62,50-61
+11-88,12-95
+76-76,15-77
+4-6,5-64
+88-88,47-89
+68-81,8-69
+80-82,81-81
+54-93,20-56
+56-65,64-85
+50-90,15-90
+39-89,1-58
+50-77,76-78
+1-84,2-90
+46-87,45-87
+7-61,60-60
+35-99,36-80
+98-99,6-99
+53-62,33-54
+44-94,2-76
+2-93,4-93
+2-36,2-36
+74-76,6-75
+20-77,21-83
+8-9,8-97
+37-84,37-83
+11-54,54-54
+39-99,38-98
+17-37,33-76
+98-98,5-99
+33-66,34-59
+38-44,37-74
+54-59,59-59
+7-31,6-57
+14-19,15-44
+11-77,1-10
+26-70,27-70
+60-71,48-76
+45-50,49-92
+21-95,3-90
+63-79,64-99
+1-97,4-96
+28-69,30-68
+39-86,85-85
+28-28,3-29
+55-55,56-94
+31-87,30-31
+75-77,74-76
+19-19,19-99
+81-89,82-86
+37-68,16-68
+65-89,5-61
+71-97,72-96
+18-31,30-82
+74-96,75-75
+37-87,38-86
+13-46,13-14
+64-99,41-86
+50-95,49-97
+73-82,49-81
+13-39,22-40
+6-68,6-68
+51-88,51-90
+5-99,2-3
+99-99,73-96
+36-82,53-82
+12-79,13-79
+54-56,16-55
+7-52,15-63
+17-30,18-30
+21-59,22-59
+55-77,54-77
+5-81,4-4
+13-75,9-59
+42-53,52-52
+15-51,52-52
+8-31,7-7
+76-84,7-77
+22-99,22-23
+2-90,2-2
+32-73,72-72
+10-36,36-36
+30-52,53-79
+9-9,6-8
+91-94,1-95
+72-78,24-73
+40-86,85-87
+53-97,53-98
+15-49,25-49
+12-96,4-96
+17-97,99-99
+29-74,73-74
+64-98,63-99
+87-94,93-93
+2-90,5-89
+4-88,97-98
+10-77,11-78
+6-68,4-6
+16-64,11-21
+3-28,5-77
+29-87,29-88
+56-80,9-56
+2-41,40-46
+48-49,48-64
+46-46,5-46
+37-65,64-64
+6-53,7-54
+10-31,18-62
+47-56,53-56
+5-97,96-98
+18-97,19-57
+50-83,23-84
+47-57,2-58
+26-70,11-71
+26-28,27-80
+1-99,3-98
+80-91,79-81
+16-24,10-21
+5-98,6-97
+36-71,37-72
+67-69,2-68
+14-99,14-90
+33-72,23-34
+8-85,12-85
+4-77,3-67
+22-24,13-23
+27-90,22-28
+20-87,8-82
+73-74,29-74
+99-99,9-39
+14-64,65-65
+18-68,14-69
+24-43,42-96
+98-99,38-99
+4-7,6-83
+1-12,13-93
+16-38,2-39
+36-87,21-29
+24-26,76-92
+6-69,7-7
+8-22,4-11
+33-79,31-80
+73-73,72-73
+36-48,37-48
+6-9,8-80
+1-36,1-1
+5-33,33-33
+89-96,26-89
+42-54,43-56
+40-49,39-49
+60-60,61-81
+66-95,65-65
+5-96,6-6
+24-75,23-76
+82-89,32-45
+17-21,21-61
+39-66,39-40
+3-93,4-94
+10-35,9-79
+65-94,64-64
+77-77,76-76
+29-94,28-76
+10-83,11-84
+1-13,12-12
+92-92,39-93
+87-89,52-88
+55-70,55-71
+21-21,20-22
+2-99,98-99
+3-34,25-84
+58-68,58-69
+5-92,24-91
+1-55,2-66
+5-97,97-99
+49-56,48-50
+62-77,1-76
+27-73,28-73
+66-74,58-74
+4-38,1-38
+69-69,69-76
+8-95,9-97
+84-97,83-96
+24-26,12-25
+34-36,35-37
+28-50,28-49
+37-93,4-94
+42-94,20-95
+7-9,9-86
+2-5,10-85
+29-45,45-99
+59-74,56-74
+68-93,97-99
+10-10,9-9
+9-72,8-69
+52-52,21-53
+75-88,7-76
+3-90,4-99
+16-92,10-92
+1-96,95-98
+10-78,11-79
+28-58,29-59
+11-60,17-61
+33-97,32-95
+5-46,43-50
+27-96,26-66
+8-38,38-94
+19-61,61-61
+24-58,71-90
+13-96,10-14
+47-88,47-87
+77-99,44-98
+2-4,1-34
+25-88,26-64
+13-38,10-53
+31-45,44-75
+1-51,1-52
+69-90,68-88
+12-12,13-13
+14-95,13-89
+51-52,50-87
+32-32,33-77
+46-54,80-95
+28-79,65-78
+22-56,21-57
+51-75,52-75
+49-51,29-90
+14-70,11-70
+2-95,94-96
+36-64,6-36
+22-60,22-61
+68-68,59-68
+1-48,2-2
+5-92,6-69
+5-84,6-85
+15-84,47-93
+13-93,97-98
+30-69,29-70
+87-95,2-75
+53-53,18-54
+93-99,50-93
+40-42,6-41
+10-73,10-10
+1-2,1-98
+55-57,53-57
+26-27,27-27
+72-72,71-94
+13-99,4-77
+37-94,12-93
+41-54,53-55
+23-24,23-63
+28-61,7-29
+3-89,4-88
+58-59,26-58
+3-5,4-94
+13-15,14-63
+10-67,11-78
+57-72,56-70
+2-96,2-97
+9-11,10-80
+80-83,80-82
+97-99,1-98
+24-54,25-33
+19-24,20-29
+1-98,2-97
+13-92,12-92
+74-90,91-91
+26-40,27-38
+51-81,18-81
+37-71,37-38
+7-67,3-4
+88-88,13-88
+9-25,24-93
+90-90,41-90
+41-52,40-86
+2-8,9-92
+6-56,6-56
+18-22,19-78
+29-56,55-99
+20-83,21-84
+21-21,21-67
+17-87,13-19
+64-66,65-86
+32-79,1-73
+13-97,12-86
+91-91,4-92
+43-61,61-61
+10-95,11-99
+3-95,8-96
+6-85,5-7
+2-92,1-93
+59-59,20-59
+14-93,92-94
+19-20,19-52
+47-64,46-51
+3-4,3-95
+5-90,5-91
+66-96,12-74
+39-93,40-95
+3-5,4-96
+39-80,2-40
+8-87,9-87
+12-91,2-12
+79-88,43-88
+29-64,64-64
+17-76,16-75
+14-97,14-15
+88-88,43-89
+40-60,34-40
+16-24,15-16
+16-94,47-89
+32-40,32-80
+93-93,12-94
+23-66,31-66
+60-78,37-39
+38-65,9-65
+28-28,27-29
+24-77,1-10
+14-59,15-95
+15-15,16-81
+83-86,7-83
+6-63,3-63
+54-71,56-70
+43-90,42-44
+7-63,6-44
+44-78,44-77
+63-82,81-81
+31-96,31-97
+27-45,28-34
+47-78,47-48
+90-95,12-95
+23-46,23-46
+1-50,51-81
+23-24,24-24
+4-22,21-44
+10-72,9-22
+66-67,22-67
+1-63,2-33
+62-62,17-61
+34-75,35-42
+30-45,29-44
+2-92,3-94
+50-51,41-51
+31-44,44-45
+7-27,6-73
+34-93,35-94
+23-74,38-74
+24-97,38-99
+9-9,10-73
+35-36,35-99
+67-76,4-75
+95-97,20-96
+69-69,61-70
+21-98,20-20
+96-98,52-97
+49-49,16-49
+11-84,11-12
+34-42,42-43
+53-58,16-56
+24-86,24-24
+29-63,29-29
+21-84,5-80
+94-96,23-95
+11-31,12-30
+54-86,53-85
+16-87,17-88
+9-90,8-10
+12-78,11-77
+11-84,12-85
+26-33,27-40
+63-77,69-95
+40-87,41-88
+5-94,4-6
+40-82,37-51
+44-52,41-51
+52-97,53-99
+57-58,51-58
+13-80,76-79
+58-67,29-67
+59-91,58-59
+49-83,13-75
+6-21,9-85
+86-99,98-99
+11-79,96-97
+3-4,3-97
+21-95,95-97
+84-89,47-86
+29-87,63-89
+5-89,90-92
+27-45,28-44
+53-90,52-91
+7-7,2-7
+51-66,51-51
+45-47,18-46
+37-48,36-38
+9-28,25-28
+55-98,55-99
+35-39,40-99
+31-69,1-69
+43-60,36-60
+16-36,30-35
+65-66,65-80
+12-88,12-12
+53-53,53-63
+17-18,16-18
+30-56,10-30
+7-38,10-46
+1-77,78-78
+6-94,5-78
+5-57,58-60
+49-76,48-75
+26-96,95-96
+45-47,11-46
+55-56,22-56
+29-83,84-84
+51-72,46-52
+67-83,68-87
+76-91,51-91
+25-97,25-26
+3-92,17-92
+55-68,68-69
+39-95,38-96
+1-83,82-83
+7-47,48-67
+45-73,72-73
+9-99,3-55
+81-82,31-82
+5-5,4-32
+14-23,22-87
+48-51,24-50
+23-23,22-46
+50-51,18-50
+17-91,3-17
+31-89,30-88
+11-74,7-12
diff --git a/4a.c b/4a.c
new file mode 100644
index 0000000..76d5e0c
--- /dev/null
+++ b/4a.c
@@ -0,0 +1,53 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+
+
+char *
+getsect(int * dest, char * pch, char expect)
+{
+ char * end;
+
+ if (!pch)
+ return NULL;
+ *dest = strtol(pch, &end, 10);
+ if (*dest == 0 && end == pch)
+ return NULL;
+ if (*end != expect)
+ return NULL;
+ if (expect)
+ ++end;
+ return end;
+}
+
+
+int
+main()
+{
+ char buf[BUFSIZ];
+ int overlaps = 0;
+
+ while (fgets(buf, sizeof(buf), stdin)) {
+ int n[4];
+ char * pbuf;
+
+ pbuf = getsect(&n[0], buf, '-');
+ pbuf = getsect(&n[1], pbuf, ',');
+ pbuf = getsect(&n[2], pbuf, '-');
+ pbuf = getsect(&n[3], pbuf, '\n');
+ if (!pbuf) {
+ fprintf(stderr, "Unexpected line: %s\n", buf);
+ return -1;
+ }
+ if ((n[2] >= n[0] && n[3] <= n[1])
+ || (n[0] >= n[2] && n[1] <= n[3]))
+ {
+ ++overlaps;
+ }
+ }
+
+ printf("Overlaps: %d\n", overlaps);
+
+ return 0;
+}
+
diff --git a/4b.c b/4b.c
new file mode 100644
index 0000000..6f43c21
--- /dev/null
+++ b/4b.c
@@ -0,0 +1,51 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+
+
+char *
+getsect(int * dest, char * pch, char expect)
+{
+ char * end;
+
+ if (!pch)
+ return NULL;
+ *dest = strtol(pch, &end, 10);
+ if (*dest == 0 && end == pch)
+ return NULL;
+ if (*end != expect)
+ return NULL;
+ if (expect)
+ ++end;
+ return end;
+}
+
+
+int
+main()
+{
+ char buf[BUFSIZ];
+ int overlaps = 0;
+
+ while (fgets(buf, sizeof(buf), stdin)) {
+ int n[4];
+ char * pbuf;
+
+ pbuf = getsect(&n[0], buf, '-');
+ pbuf = getsect(&n[1], pbuf, ',');
+ pbuf = getsect(&n[2], pbuf, '-');
+ pbuf = getsect(&n[3], pbuf, '\n');
+ if (!pbuf) {
+ fprintf(stderr, "Unexpected line: %s\n", buf);
+ return -1;
+ }
+ if (!(n[3] < n[0] || n[2] > n[1])) {
+ ++overlaps;
+ }
+ }
+
+ printf("Overlaps: %d\n", overlaps);
+
+ return 0;
+}
+
diff --git a/makefile b/makefile
new file mode 100644
index 0000000..6b7b00a
--- /dev/null
+++ b/makefile
@@ -0,0 +1,10 @@
+
+CFLAGS=-Wall
+
+all: bin/1a bin/1b \
+ bin/2a bin/2b \
+ bin/3a bin/3b \
+ bin/4a bin/4b \
+
+bin/%: %.c
+ $(CC) $(CFLAGS) -o $@ $<