Skip to content

Instantly share code, notes, and snippets.

@Trinitek
Last active December 14, 2021 05:33
Show Gist options
  • Select an option

  • Save Trinitek/abb31e76c6a025a8b5e4b7878af729e1 to your computer and use it in GitHub Desktop.

Select an option

Save Trinitek/abb31e76c6a025a8b5e4b7878af729e1 to your computer and use it in GitHub Desktop.
Advent of Code 2021
void Main()
{
var measurements = Input.Trim().Split("\n").Select(s => int.Parse(s));
//measurements.Take(5).Dump();
//GetDeltas(measurements).Take(5).Dump();
var deltas = GetDeltas(measurements);
deltas.Count(d => d >= 0).Dump();
deltas.Count(d => d < 0).Dump();
}
IEnumerable<int> GetDeltas(IEnumerable<int> source)
{
int prev = source.First();
foreach (int s in source.Skip(1))
{
yield return s - prev;
prev = s;
}
}
string Input = @"
191
185
188
189
204
213
215
227
222
221
236
235
236
232
224
228
234
226
227
228
230
232
234
213
197
198
210
238
248
261
263
265
262
295
296
311
330
333
337
344
345
356
359
360
364
367
383
386
387
391
424
426
428
440
442
446
450
423
428
423
425
445
429
436
465
456
463
461
463
483
484
500
517
525
529
527
530
535
566
578
582
587
604
613
614
609
611
619
623
627
621
622
626
644
646
655
657
659
661
671
673
668
673
676
682
683
678
679
682
681
684
686
690
693
698
700
702
707
708
732
733
734
743
745
776
794
804
784
790
813
856
855
859
850
851
886
885
888
889
883
885
920
919
917
915
918
909
910
924
925
932
933
935
966
970
971
974
958
959
961
959
964
969
970
973
972
976
998
1009
1010
1011
1046
1047
1040
1041
1056
1062
1061
1062
1077
1078
1080
1082
1094
1096
1097
1103
1128
1125
1167
1176
1175
1173
1183
1182
1183
1188
1202
1204
1205
1206
1207
1212
1235
1236
1256
1268
1270
1276
1281
1283
1276
1287
1292
1295
1291
1297
1298
1301
1312
1316
1333
1327
1340
1338
1348
1364
1381
1382
1383
1394
1385
1388
1387
1388
1394
1398
1400
1397
1399
1401
1408
1410
1420
1421
1434
1433
1436
1456
1455
1479
1482
1483
1522
1526
1527
1542
1543
1544
1548
1557
1571
1574
1580
1579
1602
1618
1605
1608
1612
1622
1625
1626
1633
1648
1641
1643
1650
1652
1659
1678
1681
1688
1692
1702
1686
1688
1685
1684
1674
1694
1696
1695
1720
1729
1736
1762
1763
1767
1780
1789
1796
1798
1799
1800
1808
1800
1805
1848
1849
1867
1888
1902
1903
1920
1923
1926
1930
1933
1925
1906
1878
1898
1899
1930
1936
1948
1974
1983
1984
1986
1983
1984
1987
1985
1988
1992
2005
2009
2013
2025
2033
2043
2046
2030
2014
2009
2011
2013
2043
2049
2053
2065
2070
2079
2080
2090
2092
2102
2116
2138
2140
2141
2143
2149
2152
2153
2154
2170
2194
2192
2216
2231
2246
2261
2268
2269
2252
2260
2264
2274
2289
2293
2296
2297
2300
2305
2334
2329
2353
2357
2359
2364
2374
2377
2364
2365
2366
2360
2362
2360
2361
2367
2357
2362
2376
2379
2380
2381
2401
2436
2435
2439
2446
2454
2456
2459
2492
2493
2514
2519
2524
2529
2530
2535
2548
2549
2551
2548
2553
2552
2556
2563
2570
2603
2616
2617
2623
2630
2631
2641
2645
2660
2662
2663
2664
2662
2668
2673
2677
2687
2688
2699
2698
2691
2695
2696
2710
2711
2717
2722
2723
2747
2746
2754
2753
2752
2771
2773
2774
2777
2789
2790
2805
2807
2818
2817
2825
2818
2828
2833
2834
2837
2839
2854
2856
2858
2859
2863
2880
2882
2884
2887
2888
2889
2902
2911
2917
2936
2938
2940
2943
2944
2943
2947
2954
2956
2957
2959
2957
2958
2959
2956
2959
2960
2969
2974
2979
2983
2985
2986
2992
2993
2995
3025
3037
3036
3037
3038
3040
3043
3049
3058
3071
3072
3080
3083
3081
3090
3091
3070
3076
3079
3083
3084
3086
3101
3114
3106
3107
3137
3138
3139
3137
3133
3137
3102
3108
3109
3124
3130
3138
3149
3150
3160
3171
3191
3190
3200
3205
3229
3235
3237
3238
3239
3243
3244
3245
3246
3250
3265
3268
3269
3271
3279
3278
3279
3280
3281
3290
3295
3296
3300
3303
3304
3305
3308
3325
3313
3326
3327
3335
3336
3337
3335
3361
3378
3374
3378
3387
3406
3416
3418
3438
3454
3460
3475
3476
3477
3471
3476
3477
3486
3487
3500
3502
3503
3530
3531
3530
3556
3563
3564
3565
3566
3580
3587
3591
3598
3599
3612
3613
3624
3623
3631
3660
3661
3662
3668
3671
3672
3674
3683
3684
3693
3694
3700
3696
3699
3705
3706
3710
3717
3731
3734
3729
3735
3736
3739
3749
3734
3739
3742
3753
3756
3757
3775
3777
3774
3780
3785
3786
3790
3792
3796
3798
3802
3817
3818
3815
3822
3824
3849
3856
3871
3845
3847
3849
3851
3853
3884
3885
3887
3889
3891
3894
3895
3900
3918
3935
3936
3941
3945
3936
3942
3945
3942
3943
3965
3974
3976
3979
3975
3976
3980
3993
3992
3991
3999
4000
3996
4019
4028
4029
4031
4053
4054
4080
4087
4089
4088
4098
4100
4103
4104
4112
4125
4145
4148
4152
4153
4158
4162
4165
4177
4184
4203
4205
4206
4207
4211
4215
4221
4240
4247
4253
4261
4262
4265
4269
4273
4274
4258
4260
4264
4282
4299
4313
4284
4287
4289
4290
4293
4295
4297
4296
4310
4314
4313
4327
4329
4330
4328
4338
4347
4368
4371
4373
4379
4388
4392
4396
4393
4394
4393
4397
4406
4409
4410
4414
4437
4436
4428
4429
4434
4426
4427
4428
4445
4447
4467
4471
4470
4472
4485
4487
4493
4495
4491
4497
4500
4506
4507
4508
4511
4518
4519
4523
4520
4523
4540
4541
4548
4549
4550
4551
4560
4570
4586
4575
4581
4585
4586
4591
4601
4595
4597
4601
4613
4615
4617
4619
4604
4609
4610
4616
4640
4666
4676
4677
4678
4709
4704
4719
4727
4729
4730
4747
4753
4755
4768
4770
4772
4777
4781
4811
4814
4843
4844
4846
4850
4862
4863
4868
4869
4870
4871
4874
4881
4882
4878
4887
4895
4898
4910
4920
4908
4910
4909
4914
4916
4922
4914
4918
4926
4949
4952
4953
4955
4956
4959
4985
4986
4990
4992
5028
5029
5032
5030
5037
5038
5047
5053
5054
5059
5057
5059
5062
5067
5085
5086
5090
5084
5077
5078
5081
5091
5094
5096
5095
5097
5103
5118
5144
5146
5153
5160
5169
5173
5174
5175
5184
5187
5195
5196
5216
5225
5238
5239
5232
5235
5237
5242
5244
5247
5254
5262
5271
5281
5287
5288
5260
5264
5282
5295
5301
5304
5310
5295
5296
5297
5298
5303
5304
5305
5277
5278
5289
5295
5290
5297
5299
5320
5328
5341
5347
5356
5361
5364
5365
5378
5379
5377
5378
5367
5380
5381
5387
5385
5390
5391
5392
5415
5422
5423
5425
5439
5441
5448
5455
5470
5477
5482
5488
5489
5492
5501
5499
5496
5499
5533
5552
5562
5563
5565
5566
5572
5571
5581
5583
5589
5594
5593
5596
5602
5606
5629
5643
5644
5652
5673
5676
5680
5676
5681
5696
5703
5698
5718
5720
5733
5736
5741
5766
5771
5786
5787
5793
5790
5786
5804
5805
5808
5809
5816
5810
5811
5818
5829
5836
5839
5824
5839
5843
5845
5849
5853
5856
5861
5873
5894
5895
5896
5897
5898
5899
5900
5913
5917
5918
5923
5924
5934
5935
5952
5965
5963
5958
5961
5975
5988
5989
5996
5997
6008
6011
6023
6024
6033
6048
6050
6051
6049
6048
6043
6048
6051
6055
6081
6084
6087
6093
6092
6090
6078
6079
6103
6092
6094
6099
6100
6116
6123
6129
6127
6138
6139
6141
6143
6146
6147
6159
6162
6163
6177
6179
6183
6187
6188
6194
6198
6213
6237
6267
6282
6288
6292
6297
6310
6323
6325
6324
6347
6349
6350
6353
6363
6376
6384
6394
6397
6401
6402
6399
6415
6416
6421
6422
6423
6420
6445
6446
6449
6451
6457
6460
6461
6467
6468
6473
6474
6517
6522
6519
6515
6532
6533
6535
6530
6532
6522
6548
6549
6565
6568
6579
6556
6563
6565
6572
6576
6578
6601
6608
6611
6612
6626
6619
6651
6657
6658
6666
6665
6660
6682
6704
6705
6711
6708
6716
6720
6725
6727
6729
6733
6734
6737
6736
6741
6742
6743
6750
6756
6757
6758
6755
6774
6773
6774
6780
6781
6790
6791
6800
6812
6815
6817
6827
6826
6832
6833
6834
6833
6822
6825
6829
6836
6840
6846
6850
6861
6868
6869
6872
6879
6882
6884
6907
6917
6930
6924
6934
6931
6918
6924
6928
6934
6935
6936
6953
6955
6964
6987
6999
7009
7042
7048
7027
7054
7053
7072
7073
7055
7056
7057
7079
7080
7084
7095
7108
7107
7109
7111
7134
7135
7137
7138
7145
7151
7161
7172
7179
7183
7189
7188
7189
7195
7202
7236
7241
7250
7277
7295
7297
7294
7298
7297
7301
7289
7291
7276
7293
7295
7311
7318
7341
7378
7398
7408
7409
7412
7409
7413
7397
7399
7423
7424
7423
7426
7418
7414
7409
7412
7425
7426
7433
7439
7448
7462
7466
7467
7468
7477
7480
7481
7498
7499
7501
7507
7527
7535
7548
7551
7552
7555
7561
7554
7559
7560
7587
7590
7596
7620
7628
7645
7646
7652
7653
7654
7663
7670
7678
7683
7686
7687
7683
7692
7691
7687
7688
7691
7699
7698
7725
7733
7734
7736
7740
7751
7744
7724
7719
7729
7731
7746
7747
7749
7722
7725
7730
7735
7737
7738
7739
7724
7721
7724
7736
7727
7730
7731
7732
7736
7737
7768
7787
7797
7807
7815
7819
7825
7852
7856
7862
7869
7881
7882
7885
7888
7892
7889
7893
7895
7896
7901
7919
7921
7932
7933
7964
7979
7990
7991
7994
7997
8011
8005
8006
8014
8047
8049
8064
8065
8046
8047
8079
8081
8082
8083
8055
8052
8056
8063
8064
8066
8053
8067
8072
8073
8077
8079
8081
8076
8083
8086
8098
8100
8109
8107
8124
8125
8126
8127
8145
8146
8152
8175
8176
8177
8182
8193
8195
8197
8199
8203
8204
8213
8217
8237
8240
8239
8230
8237
8245
8259
8264
8272
8288
8285
8286
8300
8301
8304
8305
8327
8326
8327
8341
8343
8356
8357
8358
8367
8374
8375
8391
8392
8393
8394
8399
8405
8402
8404
8435
8444
8484
8481
8490
8492
8493
8494
8503
8506
8516
8515
8516
8504
8508
8513
8529
8542
8545
8541
8546
8549
8570
8552
8553
8581
8578
8585
8593
8596
8605
8606
8608
8616
8627
8628
8627
8639
8644
8645
8626
8633
8635
8636
8640
8645
8655
8673
8693
8694
8695
8696
8695
8714
8716
8742
8739
8735
8740
8763
8762
8771
8772
8777
8776
8787
8788
8795
8796
8777
8782
8783
8794
8800
8810
8827
8828
8833
8829
8841
8862
8865
8867
8869
8895
8899
8901
8904
8908
8909
8927
8928
8930
8931
8935
8945
8946
8950
8954
8957
8959
8949
8961
8976
8980
8986
8988
8992
9003
9008
9009
9029
9050
9051
9054
9055
9068
9054
9071
9082
9087
9089
9112
9113
9127
9126
9125
9129
9138
9140
9145
9149
9151
9179
9185
9187
9188
9189
9186
9190
9207
9208
9209
9221
9228
9252
9254
9264
9267
9276
9287
9293
9292
9260
9261
9260
9265
9266
9285
9287
9289
9290
9291
9292
9293
9295
9313
9314
9291
9282
9304
9315
9316
9317
9327
9345
9350
9352
9356
9366
9367
9400
9407
9408
9415
9418
9419
9432
9441
9442
9439
9440
9451
9455
9464
9472
9479
9481
9490
9514
9527
9546
9552
9556
9570
9582
9584
9592
9597
9602
9618
9619
9622
9639
9645
9648
9643
9647
9648
9650
9641
9665
9678
9681
9682
9683
9692
9703
9704
9702
9704
9712
9726
9731
9732
9733
9744
9745
9757
9755
9763
9764
9766
9768
9782
9780
9781
9783
9786
9803
9804
9821
9822
9840
9841
9843
9839
9840
9846
9856
9859
9863
9862
9864
9865
9866
9870
9878
9877
9894
9896
9937
9938
9943
9944
9943
9952
9962
9983
9985
9984
9992
10002
10003
10041
10040
10041
10040
10042
10029
10034
10033
10034
10052
10053
10062
10055
10056
10057
10069
10073
10067
10070
10065
10064
10069
10071
10092
10069
10070
10080
10095
10099
10100
10101
10099
10115
10116
10117
10122
10124
10129
10096
10101
10106
10099
10102
10143
10144
10145
10146
10148
10149
10150
10160
10132
10137
10177
10181
10178
10183
10189
10191
10192
10194
10203
10199
10207
10218
10223
10224
10225
10245
10239
10247
10252
10250
10254
10255
10256
10279
10280
10292
10293
10300
10310
10312
10321
10324
10326
10330
10329
10328
10329
10333
10355
10354
10349
10352
10357
10369
10386
10387
10402
10406
10407
10404
10405
10407
10408
10412
10413
10417
10420
10412
10426
10427
10424
10433
10434
10435
10456
10472
10492
10494
10508
10510
10511
10512
10513
10514
10507
10510
10511
10515
10525
10526
";
void Main()
{
var measurements = Input.Trim().Split("\n").Select(s => int.Parse(s));
//measurements.Take(5).Dump();
//GetDeltas(measurements).Take(5).Dump();
//var deltas = GetDeltas(measurements);
//deltas.Count(d => d >= 0).Dump();
//deltas.Count(d => d < 0).Dump();
var movingSums = GetMovingSums(measurements);
var deltas = GetDeltas(movingSums);
deltas.Count(d => d > 0).Dump();
deltas.Count(d => d < 0).Dump();
}
IEnumerable<int> GetDeltas(IEnumerable<int> source)
{
int prev = source.First();
foreach (int s in source.Skip(1))
{
yield return s - prev;
prev = s;
}
}
IEnumerable<int> GetMovingSums(IEnumerable<int> source)
{
int offset = 0;
while (true)
{
var window = source.Skip(offset).Take(3);
if (window.Count() < 3)
{
break;
}
else
{
yield return window.Sum();
offset++;
}
}
}
string Input = @"
191
185
188
189
204
213
215
227
222
221
236
235
236
232
224
228
234
226
227
228
230
232
234
213
197
198
210
238
248
261
263
265
262
295
296
311
330
333
337
344
345
356
359
360
364
367
383
386
387
391
424
426
428
440
442
446
450
423
428
423
425
445
429
436
465
456
463
461
463
483
484
500
517
525
529
527
530
535
566
578
582
587
604
613
614
609
611
619
623
627
621
622
626
644
646
655
657
659
661
671
673
668
673
676
682
683
678
679
682
681
684
686
690
693
698
700
702
707
708
732
733
734
743
745
776
794
804
784
790
813
856
855
859
850
851
886
885
888
889
883
885
920
919
917
915
918
909
910
924
925
932
933
935
966
970
971
974
958
959
961
959
964
969
970
973
972
976
998
1009
1010
1011
1046
1047
1040
1041
1056
1062
1061
1062
1077
1078
1080
1082
1094
1096
1097
1103
1128
1125
1167
1176
1175
1173
1183
1182
1183
1188
1202
1204
1205
1206
1207
1212
1235
1236
1256
1268
1270
1276
1281
1283
1276
1287
1292
1295
1291
1297
1298
1301
1312
1316
1333
1327
1340
1338
1348
1364
1381
1382
1383
1394
1385
1388
1387
1388
1394
1398
1400
1397
1399
1401
1408
1410
1420
1421
1434
1433
1436
1456
1455
1479
1482
1483
1522
1526
1527
1542
1543
1544
1548
1557
1571
1574
1580
1579
1602
1618
1605
1608
1612
1622
1625
1626
1633
1648
1641
1643
1650
1652
1659
1678
1681
1688
1692
1702
1686
1688
1685
1684
1674
1694
1696
1695
1720
1729
1736
1762
1763
1767
1780
1789
1796
1798
1799
1800
1808
1800
1805
1848
1849
1867
1888
1902
1903
1920
1923
1926
1930
1933
1925
1906
1878
1898
1899
1930
1936
1948
1974
1983
1984
1986
1983
1984
1987
1985
1988
1992
2005
2009
2013
2025
2033
2043
2046
2030
2014
2009
2011
2013
2043
2049
2053
2065
2070
2079
2080
2090
2092
2102
2116
2138
2140
2141
2143
2149
2152
2153
2154
2170
2194
2192
2216
2231
2246
2261
2268
2269
2252
2260
2264
2274
2289
2293
2296
2297
2300
2305
2334
2329
2353
2357
2359
2364
2374
2377
2364
2365
2366
2360
2362
2360
2361
2367
2357
2362
2376
2379
2380
2381
2401
2436
2435
2439
2446
2454
2456
2459
2492
2493
2514
2519
2524
2529
2530
2535
2548
2549
2551
2548
2553
2552
2556
2563
2570
2603
2616
2617
2623
2630
2631
2641
2645
2660
2662
2663
2664
2662
2668
2673
2677
2687
2688
2699
2698
2691
2695
2696
2710
2711
2717
2722
2723
2747
2746
2754
2753
2752
2771
2773
2774
2777
2789
2790
2805
2807
2818
2817
2825
2818
2828
2833
2834
2837
2839
2854
2856
2858
2859
2863
2880
2882
2884
2887
2888
2889
2902
2911
2917
2936
2938
2940
2943
2944
2943
2947
2954
2956
2957
2959
2957
2958
2959
2956
2959
2960
2969
2974
2979
2983
2985
2986
2992
2993
2995
3025
3037
3036
3037
3038
3040
3043
3049
3058
3071
3072
3080
3083
3081
3090
3091
3070
3076
3079
3083
3084
3086
3101
3114
3106
3107
3137
3138
3139
3137
3133
3137
3102
3108
3109
3124
3130
3138
3149
3150
3160
3171
3191
3190
3200
3205
3229
3235
3237
3238
3239
3243
3244
3245
3246
3250
3265
3268
3269
3271
3279
3278
3279
3280
3281
3290
3295
3296
3300
3303
3304
3305
3308
3325
3313
3326
3327
3335
3336
3337
3335
3361
3378
3374
3378
3387
3406
3416
3418
3438
3454
3460
3475
3476
3477
3471
3476
3477
3486
3487
3500
3502
3503
3530
3531
3530
3556
3563
3564
3565
3566
3580
3587
3591
3598
3599
3612
3613
3624
3623
3631
3660
3661
3662
3668
3671
3672
3674
3683
3684
3693
3694
3700
3696
3699
3705
3706
3710
3717
3731
3734
3729
3735
3736
3739
3749
3734
3739
3742
3753
3756
3757
3775
3777
3774
3780
3785
3786
3790
3792
3796
3798
3802
3817
3818
3815
3822
3824
3849
3856
3871
3845
3847
3849
3851
3853
3884
3885
3887
3889
3891
3894
3895
3900
3918
3935
3936
3941
3945
3936
3942
3945
3942
3943
3965
3974
3976
3979
3975
3976
3980
3993
3992
3991
3999
4000
3996
4019
4028
4029
4031
4053
4054
4080
4087
4089
4088
4098
4100
4103
4104
4112
4125
4145
4148
4152
4153
4158
4162
4165
4177
4184
4203
4205
4206
4207
4211
4215
4221
4240
4247
4253
4261
4262
4265
4269
4273
4274
4258
4260
4264
4282
4299
4313
4284
4287
4289
4290
4293
4295
4297
4296
4310
4314
4313
4327
4329
4330
4328
4338
4347
4368
4371
4373
4379
4388
4392
4396
4393
4394
4393
4397
4406
4409
4410
4414
4437
4436
4428
4429
4434
4426
4427
4428
4445
4447
4467
4471
4470
4472
4485
4487
4493
4495
4491
4497
4500
4506
4507
4508
4511
4518
4519
4523
4520
4523
4540
4541
4548
4549
4550
4551
4560
4570
4586
4575
4581
4585
4586
4591
4601
4595
4597
4601
4613
4615
4617
4619
4604
4609
4610
4616
4640
4666
4676
4677
4678
4709
4704
4719
4727
4729
4730
4747
4753
4755
4768
4770
4772
4777
4781
4811
4814
4843
4844
4846
4850
4862
4863
4868
4869
4870
4871
4874
4881
4882
4878
4887
4895
4898
4910
4920
4908
4910
4909
4914
4916
4922
4914
4918
4926
4949
4952
4953
4955
4956
4959
4985
4986
4990
4992
5028
5029
5032
5030
5037
5038
5047
5053
5054
5059
5057
5059
5062
5067
5085
5086
5090
5084
5077
5078
5081
5091
5094
5096
5095
5097
5103
5118
5144
5146
5153
5160
5169
5173
5174
5175
5184
5187
5195
5196
5216
5225
5238
5239
5232
5235
5237
5242
5244
5247
5254
5262
5271
5281
5287
5288
5260
5264
5282
5295
5301
5304
5310
5295
5296
5297
5298
5303
5304
5305
5277
5278
5289
5295
5290
5297
5299
5320
5328
5341
5347
5356
5361
5364
5365
5378
5379
5377
5378
5367
5380
5381
5387
5385
5390
5391
5392
5415
5422
5423
5425
5439
5441
5448
5455
5470
5477
5482
5488
5489
5492
5501
5499
5496
5499
5533
5552
5562
5563
5565
5566
5572
5571
5581
5583
5589
5594
5593
5596
5602
5606
5629
5643
5644
5652
5673
5676
5680
5676
5681
5696
5703
5698
5718
5720
5733
5736
5741
5766
5771
5786
5787
5793
5790
5786
5804
5805
5808
5809
5816
5810
5811
5818
5829
5836
5839
5824
5839
5843
5845
5849
5853
5856
5861
5873
5894
5895
5896
5897
5898
5899
5900
5913
5917
5918
5923
5924
5934
5935
5952
5965
5963
5958
5961
5975
5988
5989
5996
5997
6008
6011
6023
6024
6033
6048
6050
6051
6049
6048
6043
6048
6051
6055
6081
6084
6087
6093
6092
6090
6078
6079
6103
6092
6094
6099
6100
6116
6123
6129
6127
6138
6139
6141
6143
6146
6147
6159
6162
6163
6177
6179
6183
6187
6188
6194
6198
6213
6237
6267
6282
6288
6292
6297
6310
6323
6325
6324
6347
6349
6350
6353
6363
6376
6384
6394
6397
6401
6402
6399
6415
6416
6421
6422
6423
6420
6445
6446
6449
6451
6457
6460
6461
6467
6468
6473
6474
6517
6522
6519
6515
6532
6533
6535
6530
6532
6522
6548
6549
6565
6568
6579
6556
6563
6565
6572
6576
6578
6601
6608
6611
6612
6626
6619
6651
6657
6658
6666
6665
6660
6682
6704
6705
6711
6708
6716
6720
6725
6727
6729
6733
6734
6737
6736
6741
6742
6743
6750
6756
6757
6758
6755
6774
6773
6774
6780
6781
6790
6791
6800
6812
6815
6817
6827
6826
6832
6833
6834
6833
6822
6825
6829
6836
6840
6846
6850
6861
6868
6869
6872
6879
6882
6884
6907
6917
6930
6924
6934
6931
6918
6924
6928
6934
6935
6936
6953
6955
6964
6987
6999
7009
7042
7048
7027
7054
7053
7072
7073
7055
7056
7057
7079
7080
7084
7095
7108
7107
7109
7111
7134
7135
7137
7138
7145
7151
7161
7172
7179
7183
7189
7188
7189
7195
7202
7236
7241
7250
7277
7295
7297
7294
7298
7297
7301
7289
7291
7276
7293
7295
7311
7318
7341
7378
7398
7408
7409
7412
7409
7413
7397
7399
7423
7424
7423
7426
7418
7414
7409
7412
7425
7426
7433
7439
7448
7462
7466
7467
7468
7477
7480
7481
7498
7499
7501
7507
7527
7535
7548
7551
7552
7555
7561
7554
7559
7560
7587
7590
7596
7620
7628
7645
7646
7652
7653
7654
7663
7670
7678
7683
7686
7687
7683
7692
7691
7687
7688
7691
7699
7698
7725
7733
7734
7736
7740
7751
7744
7724
7719
7729
7731
7746
7747
7749
7722
7725
7730
7735
7737
7738
7739
7724
7721
7724
7736
7727
7730
7731
7732
7736
7737
7768
7787
7797
7807
7815
7819
7825
7852
7856
7862
7869
7881
7882
7885
7888
7892
7889
7893
7895
7896
7901
7919
7921
7932
7933
7964
7979
7990
7991
7994
7997
8011
8005
8006
8014
8047
8049
8064
8065
8046
8047
8079
8081
8082
8083
8055
8052
8056
8063
8064
8066
8053
8067
8072
8073
8077
8079
8081
8076
8083
8086
8098
8100
8109
8107
8124
8125
8126
8127
8145
8146
8152
8175
8176
8177
8182
8193
8195
8197
8199
8203
8204
8213
8217
8237
8240
8239
8230
8237
8245
8259
8264
8272
8288
8285
8286
8300
8301
8304
8305
8327
8326
8327
8341
8343
8356
8357
8358
8367
8374
8375
8391
8392
8393
8394
8399
8405
8402
8404
8435
8444
8484
8481
8490
8492
8493
8494
8503
8506
8516
8515
8516
8504
8508
8513
8529
8542
8545
8541
8546
8549
8570
8552
8553
8581
8578
8585
8593
8596
8605
8606
8608
8616
8627
8628
8627
8639
8644
8645
8626
8633
8635
8636
8640
8645
8655
8673
8693
8694
8695
8696
8695
8714
8716
8742
8739
8735
8740
8763
8762
8771
8772
8777
8776
8787
8788
8795
8796
8777
8782
8783
8794
8800
8810
8827
8828
8833
8829
8841
8862
8865
8867
8869
8895
8899
8901
8904
8908
8909
8927
8928
8930
8931
8935
8945
8946
8950
8954
8957
8959
8949
8961
8976
8980
8986
8988
8992
9003
9008
9009
9029
9050
9051
9054
9055
9068
9054
9071
9082
9087
9089
9112
9113
9127
9126
9125
9129
9138
9140
9145
9149
9151
9179
9185
9187
9188
9189
9186
9190
9207
9208
9209
9221
9228
9252
9254
9264
9267
9276
9287
9293
9292
9260
9261
9260
9265
9266
9285
9287
9289
9290
9291
9292
9293
9295
9313
9314
9291
9282
9304
9315
9316
9317
9327
9345
9350
9352
9356
9366
9367
9400
9407
9408
9415
9418
9419
9432
9441
9442
9439
9440
9451
9455
9464
9472
9479
9481
9490
9514
9527
9546
9552
9556
9570
9582
9584
9592
9597
9602
9618
9619
9622
9639
9645
9648
9643
9647
9648
9650
9641
9665
9678
9681
9682
9683
9692
9703
9704
9702
9704
9712
9726
9731
9732
9733
9744
9745
9757
9755
9763
9764
9766
9768
9782
9780
9781
9783
9786
9803
9804
9821
9822
9840
9841
9843
9839
9840
9846
9856
9859
9863
9862
9864
9865
9866
9870
9878
9877
9894
9896
9937
9938
9943
9944
9943
9952
9962
9983
9985
9984
9992
10002
10003
10041
10040
10041
10040
10042
10029
10034
10033
10034
10052
10053
10062
10055
10056
10057
10069
10073
10067
10070
10065
10064
10069
10071
10092
10069
10070
10080
10095
10099
10100
10101
10099
10115
10116
10117
10122
10124
10129
10096
10101
10106
10099
10102
10143
10144
10145
10146
10148
10149
10150
10160
10132
10137
10177
10181
10178
10183
10189
10191
10192
10194
10203
10199
10207
10218
10223
10224
10225
10245
10239
10247
10252
10250
10254
10255
10256
10279
10280
10292
10293
10300
10310
10312
10321
10324
10326
10330
10329
10328
10329
10333
10355
10354
10349
10352
10357
10369
10386
10387
10402
10406
10407
10404
10405
10407
10408
10412
10413
10417
10420
10412
10426
10427
10424
10433
10434
10435
10456
10472
10492
10494
10508
10510
10511
10512
10513
10514
10507
10510
10511
10515
10525
10526
";
void Main()
{
var lines = Input.Split("\n", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
var commands = lines.Select(l => Command.Parse(l));
//commands.Dump();
int depth = 0;
int horiz = 0;
foreach (var c in commands)
{
switch (c.Direction)
{
case Direction.Up:
depth -= c.Units;
break;
case Direction.Down:
depth += c.Units;
break;
case Direction.Forward:
horiz += c.Units;
break;
}
}
depth.Dump("Depth");
horiz.Dump("Horiz");
(depth * horiz).Dump("Product"); // not 37620, too low
}
public enum Direction { Up, Down, Forward }
public record Command(Direction Direction, int Units)
{
public static Command Parse(string input)
{
var words = input.Split(' ');
var direction = words[0] switch {
"up" => Direction.Up,
"down" => Direction.Down,
"forward" => Direction.Forward,
_ => throw new Exception("Unknown direction")
};
int units = int.Parse(words[1]);
return new (direction, units);
}
}
string TestInput = @"
forward 5
down 5
forward 8
up 3
down 8
forward 2
";
string Input = @"
forward 3
down 6
forward 7
down 4
down 8
down 6
down 4
down 6
forward 7
down 5
forward 1
up 7
up 6
down 1
down 2
forward 3
forward 3
forward 4
up 9
up 4
forward 9
down 2
down 6
forward 1
forward 8
down 2
up 5
forward 3
down 5
forward 2
forward 4
down 2
up 3
up 6
down 2
down 2
down 8
forward 6
up 3
down 1
forward 4
forward 7
up 8
forward 8
down 6
down 3
forward 9
up 9
forward 1
forward 7
down 8
forward 8
forward 2
forward 5
down 2
forward 3
forward 1
forward 3
forward 6
forward 9
up 3
down 6
down 9
down 4
down 6
forward 2
forward 8
up 8
down 9
down 1
down 8
down 7
forward 8
forward 5
down 5
up 9
up 9
forward 2
up 4
forward 4
up 4
up 3
up 3
up 4
down 7
down 9
down 9
forward 6
forward 4
down 9
down 2
down 2
down 1
down 8
down 3
up 2
down 3
down 6
down 5
up 7
forward 3
forward 3
forward 2
forward 5
forward 6
down 7
up 9
down 9
up 2
up 8
forward 2
down 1
up 7
down 8
up 1
up 2
up 1
up 1
forward 1
down 8
up 4
up 5
forward 5
up 1
down 8
up 5
down 6
forward 8
up 4
forward 7
down 9
up 2
forward 2
down 6
down 4
up 2
forward 9
down 9
forward 9
down 5
down 9
forward 5
up 8
up 6
down 4
forward 3
forward 7
forward 6
up 6
down 1
forward 9
up 5
down 2
down 1
forward 6
down 9
up 7
up 3
down 9
down 5
up 3
forward 6
up 6
up 4
down 3
down 4
down 6
down 6
up 7
forward 1
forward 6
up 5
up 2
forward 7
down 6
up 1
up 3
forward 6
up 8
down 8
down 7
down 9
forward 3
forward 7
forward 5
forward 1
down 7
forward 6
down 7
up 3
down 9
down 7
down 1
forward 9
forward 9
forward 3
down 9
down 3
forward 8
down 4
up 4
up 6
up 5
up 2
up 6
forward 1
down 1
down 5
up 7
down 4
up 2
up 4
down 1
down 7
down 9
up 1
down 1
down 3
forward 3
forward 9
forward 5
down 1
down 7
down 9
down 9
down 6
down 5
forward 4
down 8
down 2
down 9
forward 2
forward 2
forward 6
up 2
forward 6
forward 2
down 6
forward 7
forward 8
down 7
up 7
down 5
up 7
down 2
down 6
up 1
down 2
down 6
forward 3
down 9
down 3
forward 6
up 7
down 9
down 7
down 3
down 6
forward 5
forward 9
down 3
down 6
down 3
down 8
forward 9
down 8
down 4
down 6
up 8
forward 3
forward 3
down 2
down 1
forward 3
down 8
down 2
forward 4
down 2
forward 5
down 8
down 5
forward 4
down 6
forward 3
forward 4
up 5
up 5
down 8
down 1
up 5
down 7
up 3
forward 5
forward 1
forward 7
forward 6
down 5
down 9
down 5
down 9
down 6
down 4
down 7
down 5
down 9
up 4
down 2
down 4
up 6
forward 8
forward 9
up 4
down 6
down 1
forward 6
forward 1
forward 6
down 9
forward 9
down 8
up 9
down 5
forward 1
forward 5
down 7
forward 2
forward 3
down 1
down 1
up 9
down 7
down 6
forward 4
down 9
forward 8
up 7
forward 2
forward 7
forward 2
down 5
down 8
down 7
down 4
up 7
down 6
up 5
up 1
down 2
forward 2
forward 4
down 3
down 2
down 5
forward 7
forward 1
forward 7
forward 3
forward 2
forward 8
up 3
down 2
forward 6
down 6
up 2
down 4
forward 8
forward 6
up 7
down 9
forward 7
down 8
up 3
down 5
forward 7
forward 5
forward 4
up 9
down 1
down 7
forward 1
forward 8
forward 2
forward 2
forward 2
up 8
up 4
down 7
forward 3
forward 7
up 4
forward 4
down 1
forward 9
forward 3
up 2
forward 3
down 1
down 7
up 8
up 5
up 2
forward 9
up 6
forward 2
forward 4
forward 6
down 4
forward 6
down 6
down 2
down 1
up 5
down 3
forward 4
down 5
forward 3
up 6
down 1
down 3
up 3
forward 7
down 8
forward 8
forward 2
down 2
up 6
down 7
forward 6
forward 7
forward 3
down 1
forward 9
down 7
forward 8
forward 3
forward 1
forward 1
down 1
up 4
forward 9
down 1
down 1
down 5
forward 9
forward 4
forward 9
down 3
down 7
down 9
up 1
up 1
up 8
forward 3
down 8
forward 8
up 5
up 4
down 5
down 6
forward 5
down 4
forward 7
down 7
forward 2
down 4
forward 6
down 7
down 7
down 4
forward 1
forward 4
down 7
up 4
down 3
forward 8
forward 5
down 2
up 9
down 9
up 2
down 6
down 4
forward 6
down 4
up 4
up 7
up 2
down 8
up 3
down 9
up 6
down 2
forward 6
down 2
forward 8
forward 2
forward 5
up 3
down 7
down 1
forward 8
down 9
forward 5
up 9
forward 7
up 3
up 2
down 9
down 1
forward 1
forward 3
forward 2
forward 2
forward 7
up 6
forward 5
up 3
up 7
down 7
forward 7
forward 1
down 1
up 3
up 6
down 5
up 1
down 5
down 2
down 3
up 7
up 6
up 9
down 9
forward 4
up 7
forward 3
down 7
up 3
forward 1
down 7
forward 5
up 9
up 9
down 6
forward 2
up 5
forward 5
down 2
forward 6
down 4
up 1
forward 1
down 1
up 2
down 4
down 3
forward 7
up 3
down 8
forward 9
up 8
down 7
down 6
up 6
forward 5
up 8
down 1
down 4
up 3
forward 2
up 5
down 1
forward 1
forward 7
down 3
down 2
forward 8
down 4
down 3
down 6
forward 8
down 3
up 2
down 4
up 7
forward 9
up 2
up 6
down 1
down 5
up 9
forward 6
up 7
forward 8
down 7
up 1
forward 7
up 2
forward 4
forward 1
down 7
down 5
forward 3
forward 6
up 3
up 1
forward 8
forward 4
down 8
down 2
down 6
down 2
down 9
down 7
down 3
down 3
down 9
up 8
forward 1
down 5
up 4
forward 6
up 5
up 9
down 9
up 5
up 9
forward 8
up 4
forward 3
down 3
forward 4
down 8
down 8
forward 8
down 1
forward 8
down 2
forward 7
up 1
forward 6
down 8
up 1
down 6
down 1
forward 3
forward 3
down 7
up 6
up 2
down 9
up 5
forward 6
down 3
down 8
forward 6
down 7
down 5
forward 9
down 5
forward 4
down 7
forward 5
down 6
down 3
down 9
down 8
down 1
forward 4
down 9
up 4
down 3
down 8
forward 5
forward 9
up 7
up 5
up 5
up 8
down 6
up 7
forward 7
forward 4
down 6
forward 6
up 4
down 7
down 2
forward 6
down 9
down 1
forward 3
forward 9
forward 8
down 4
forward 6
forward 6
forward 7
down 8
down 8
forward 6
down 9
forward 9
down 7
down 5
down 8
forward 6
down 5
forward 9
down 6
forward 9
forward 4
forward 1
up 4
forward 5
down 6
forward 8
forward 3
up 3
up 2
up 7
forward 3
up 3
forward 4
forward 3
up 4
up 1
down 9
forward 8
down 7
down 2
down 4
up 6
forward 6
down 6
up 7
forward 4
down 4
forward 7
forward 6
down 9
down 1
up 3
forward 2
up 2
down 9
forward 6
forward 8
down 8
down 5
forward 2
forward 6
forward 9
forward 9
down 5
up 4
down 6
forward 7
forward 9
up 6
forward 4
up 7
forward 7
down 4
forward 7
forward 4
up 5
forward 6
down 2
down 3
up 2
forward 4
forward 8
up 5
up 7
down 9
forward 2
forward 9
forward 8
forward 5
down 5
down 8
down 3
up 9
down 2
down 6
up 4
forward 8
forward 8
up 6
forward 8
down 3
forward 3
up 7
forward 2
down 8
forward 8
forward 6
forward 3
up 2
forward 8
forward 5
down 9
up 1
down 3
down 1
up 5
up 7
up 8
down 9
forward 4
forward 1
down 6
forward 8
forward 8
forward 4
down 7
down 8
forward 5
down 2
forward 5
forward 9
down 7
down 8
forward 5
down 1
down 7
down 4
forward 2
down 1
forward 7
up 1
up 7
forward 4
forward 2
forward 3
forward 5
forward 7
up 3
down 1
down 9
forward 8
forward 9
forward 5
up 3
down 5
forward 4
down 9
forward 1
forward 4
up 3
forward 4
down 9
up 9
down 3
forward 1
forward 9
up 8
forward 4
up 2
down 1
down 5
down 4
down 3
forward 4
forward 9
forward 1
up 6
down 1
down 3
forward 8
forward 3
down 6
forward 2
down 6
down 2
forward 4
forward 7
forward 4
up 4
up 8
up 7
up 9
forward 3
forward 1
down 9
down 5
forward 6
forward 6
forward 2
down 8
down 4
down 2
down 7
up 2
forward 7
forward 5
forward 5
forward 1
down 9
forward 3
forward 3
down 8
forward 3
down 5
down 2
forward 3
up 3
forward 5
down 8
forward 6
forward 6
forward 9
forward 9
forward 8
forward 4
forward 6
forward 6
up 7
down 6
down 6
forward 6
up 5
forward 6
down 8
down 5
down 8
down 8
up 5
down 2
forward 4
down 2
up 6
down 8
down 4
up 3
up 2
down 1
forward 2
forward 6
down 7
forward 7
down 6
down 2
down 3
down 6
forward 4
up 1
forward 7
down 4
forward 8
forward 9
forward 6
down 1
forward 8
down 7
up 9
down 5
forward 4
forward 3
down 8
down 5
down 4
forward 7
down 9
down 2
forward 3
down 7
up 1
forward 4
down 3
up 4
down 2
down 7
down 1
down 3
forward 5
forward 5
down 2
up 2
down 8
forward 8
down 5
forward 9
down 5
forward 6
forward 9
forward 3
down 5
down 2
down 8
up 9
up 8
down 8
forward 4
up 5
forward 1
up 4
down 1
forward 2";
void Main()
{
var lines = Input.Split("\n", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
var commands = lines.Select(l => Command.Parse(l));
//commands.Dump();
int aim = 0;
int depth = 0;
int horiz = 0;
foreach (var c in commands)
{
switch (c.Direction)
{
case Direction.Up:
aim -= c.Units;
break;
case Direction.Down:
aim += c.Units;
break;
case Direction.Forward:
horiz += c.Units;
depth += (aim * c.Units);
break;
}
}
depth.Dump("Depth");
horiz.Dump("Horiz");
(depth * horiz).Dump("Product"); // not 37620, too low
}
public enum Direction { Up, Down, Forward }
public record Command(Direction Direction, int Units)
{
public static Command Parse(string input)
{
var words = input.Split(' ');
var direction = words[0] switch {
"up" => Direction.Up,
"down" => Direction.Down,
"forward" => Direction.Forward,
_ => throw new Exception("Unknown direction")
};
int units = int.Parse(words[1]);
return new (direction, units);
}
}
string TestInput = @"
forward 5
down 5
forward 8
up 3
down 8
forward 2
";
string Input = @"
forward 3
down 6
forward 7
down 4
down 8
down 6
down 4
down 6
forward 7
down 5
forward 1
up 7
up 6
down 1
down 2
forward 3
forward 3
forward 4
up 9
up 4
forward 9
down 2
down 6
forward 1
forward 8
down 2
up 5
forward 3
down 5
forward 2
forward 4
down 2
up 3
up 6
down 2
down 2
down 8
forward 6
up 3
down 1
forward 4
forward 7
up 8
forward 8
down 6
down 3
forward 9
up 9
forward 1
forward 7
down 8
forward 8
forward 2
forward 5
down 2
forward 3
forward 1
forward 3
forward 6
forward 9
up 3
down 6
down 9
down 4
down 6
forward 2
forward 8
up 8
down 9
down 1
down 8
down 7
forward 8
forward 5
down 5
up 9
up 9
forward 2
up 4
forward 4
up 4
up 3
up 3
up 4
down 7
down 9
down 9
forward 6
forward 4
down 9
down 2
down 2
down 1
down 8
down 3
up 2
down 3
down 6
down 5
up 7
forward 3
forward 3
forward 2
forward 5
forward 6
down 7
up 9
down 9
up 2
up 8
forward 2
down 1
up 7
down 8
up 1
up 2
up 1
up 1
forward 1
down 8
up 4
up 5
forward 5
up 1
down 8
up 5
down 6
forward 8
up 4
forward 7
down 9
up 2
forward 2
down 6
down 4
up 2
forward 9
down 9
forward 9
down 5
down 9
forward 5
up 8
up 6
down 4
forward 3
forward 7
forward 6
up 6
down 1
forward 9
up 5
down 2
down 1
forward 6
down 9
up 7
up 3
down 9
down 5
up 3
forward 6
up 6
up 4
down 3
down 4
down 6
down 6
up 7
forward 1
forward 6
up 5
up 2
forward 7
down 6
up 1
up 3
forward 6
up 8
down 8
down 7
down 9
forward 3
forward 7
forward 5
forward 1
down 7
forward 6
down 7
up 3
down 9
down 7
down 1
forward 9
forward 9
forward 3
down 9
down 3
forward 8
down 4
up 4
up 6
up 5
up 2
up 6
forward 1
down 1
down 5
up 7
down 4
up 2
up 4
down 1
down 7
down 9
up 1
down 1
down 3
forward 3
forward 9
forward 5
down 1
down 7
down 9
down 9
down 6
down 5
forward 4
down 8
down 2
down 9
forward 2
forward 2
forward 6
up 2
forward 6
forward 2
down 6
forward 7
forward 8
down 7
up 7
down 5
up 7
down 2
down 6
up 1
down 2
down 6
forward 3
down 9
down 3
forward 6
up 7
down 9
down 7
down 3
down 6
forward 5
forward 9
down 3
down 6
down 3
down 8
forward 9
down 8
down 4
down 6
up 8
forward 3
forward 3
down 2
down 1
forward 3
down 8
down 2
forward 4
down 2
forward 5
down 8
down 5
forward 4
down 6
forward 3
forward 4
up 5
up 5
down 8
down 1
up 5
down 7
up 3
forward 5
forward 1
forward 7
forward 6
down 5
down 9
down 5
down 9
down 6
down 4
down 7
down 5
down 9
up 4
down 2
down 4
up 6
forward 8
forward 9
up 4
down 6
down 1
forward 6
forward 1
forward 6
down 9
forward 9
down 8
up 9
down 5
forward 1
forward 5
down 7
forward 2
forward 3
down 1
down 1
up 9
down 7
down 6
forward 4
down 9
forward 8
up 7
forward 2
forward 7
forward 2
down 5
down 8
down 7
down 4
up 7
down 6
up 5
up 1
down 2
forward 2
forward 4
down 3
down 2
down 5
forward 7
forward 1
forward 7
forward 3
forward 2
forward 8
up 3
down 2
forward 6
down 6
up 2
down 4
forward 8
forward 6
up 7
down 9
forward 7
down 8
up 3
down 5
forward 7
forward 5
forward 4
up 9
down 1
down 7
forward 1
forward 8
forward 2
forward 2
forward 2
up 8
up 4
down 7
forward 3
forward 7
up 4
forward 4
down 1
forward 9
forward 3
up 2
forward 3
down 1
down 7
up 8
up 5
up 2
forward 9
up 6
forward 2
forward 4
forward 6
down 4
forward 6
down 6
down 2
down 1
up 5
down 3
forward 4
down 5
forward 3
up 6
down 1
down 3
up 3
forward 7
down 8
forward 8
forward 2
down 2
up 6
down 7
forward 6
forward 7
forward 3
down 1
forward 9
down 7
forward 8
forward 3
forward 1
forward 1
down 1
up 4
forward 9
down 1
down 1
down 5
forward 9
forward 4
forward 9
down 3
down 7
down 9
up 1
up 1
up 8
forward 3
down 8
forward 8
up 5
up 4
down 5
down 6
forward 5
down 4
forward 7
down 7
forward 2
down 4
forward 6
down 7
down 7
down 4
forward 1
forward 4
down 7
up 4
down 3
forward 8
forward 5
down 2
up 9
down 9
up 2
down 6
down 4
forward 6
down 4
up 4
up 7
up 2
down 8
up 3
down 9
up 6
down 2
forward 6
down 2
forward 8
forward 2
forward 5
up 3
down 7
down 1
forward 8
down 9
forward 5
up 9
forward 7
up 3
up 2
down 9
down 1
forward 1
forward 3
forward 2
forward 2
forward 7
up 6
forward 5
up 3
up 7
down 7
forward 7
forward 1
down 1
up 3
up 6
down 5
up 1
down 5
down 2
down 3
up 7
up 6
up 9
down 9
forward 4
up 7
forward 3
down 7
up 3
forward 1
down 7
forward 5
up 9
up 9
down 6
forward 2
up 5
forward 5
down 2
forward 6
down 4
up 1
forward 1
down 1
up 2
down 4
down 3
forward 7
up 3
down 8
forward 9
up 8
down 7
down 6
up 6
forward 5
up 8
down 1
down 4
up 3
forward 2
up 5
down 1
forward 1
forward 7
down 3
down 2
forward 8
down 4
down 3
down 6
forward 8
down 3
up 2
down 4
up 7
forward 9
up 2
up 6
down 1
down 5
up 9
forward 6
up 7
forward 8
down 7
up 1
forward 7
up 2
forward 4
forward 1
down 7
down 5
forward 3
forward 6
up 3
up 1
forward 8
forward 4
down 8
down 2
down 6
down 2
down 9
down 7
down 3
down 3
down 9
up 8
forward 1
down 5
up 4
forward 6
up 5
up 9
down 9
up 5
up 9
forward 8
up 4
forward 3
down 3
forward 4
down 8
down 8
forward 8
down 1
forward 8
down 2
forward 7
up 1
forward 6
down 8
up 1
down 6
down 1
forward 3
forward 3
down 7
up 6
up 2
down 9
up 5
forward 6
down 3
down 8
forward 6
down 7
down 5
forward 9
down 5
forward 4
down 7
forward 5
down 6
down 3
down 9
down 8
down 1
forward 4
down 9
up 4
down 3
down 8
forward 5
forward 9
up 7
up 5
up 5
up 8
down 6
up 7
forward 7
forward 4
down 6
forward 6
up 4
down 7
down 2
forward 6
down 9
down 1
forward 3
forward 9
forward 8
down 4
forward 6
forward 6
forward 7
down 8
down 8
forward 6
down 9
forward 9
down 7
down 5
down 8
forward 6
down 5
forward 9
down 6
forward 9
forward 4
forward 1
up 4
forward 5
down 6
forward 8
forward 3
up 3
up 2
up 7
forward 3
up 3
forward 4
forward 3
up 4
up 1
down 9
forward 8
down 7
down 2
down 4
up 6
forward 6
down 6
up 7
forward 4
down 4
forward 7
forward 6
down 9
down 1
up 3
forward 2
up 2
down 9
forward 6
forward 8
down 8
down 5
forward 2
forward 6
forward 9
forward 9
down 5
up 4
down 6
forward 7
forward 9
up 6
forward 4
up 7
forward 7
down 4
forward 7
forward 4
up 5
forward 6
down 2
down 3
up 2
forward 4
forward 8
up 5
up 7
down 9
forward 2
forward 9
forward 8
forward 5
down 5
down 8
down 3
up 9
down 2
down 6
up 4
forward 8
forward 8
up 6
forward 8
down 3
forward 3
up 7
forward 2
down 8
forward 8
forward 6
forward 3
up 2
forward 8
forward 5
down 9
up 1
down 3
down 1
up 5
up 7
up 8
down 9
forward 4
forward 1
down 6
forward 8
forward 8
forward 4
down 7
down 8
forward 5
down 2
forward 5
forward 9
down 7
down 8
forward 5
down 1
down 7
down 4
forward 2
down 1
forward 7
up 1
up 7
forward 4
forward 2
forward 3
forward 5
forward 7
up 3
down 1
down 9
forward 8
forward 9
forward 5
up 3
down 5
forward 4
down 9
forward 1
forward 4
up 3
forward 4
down 9
up 9
down 3
forward 1
forward 9
up 8
forward 4
up 2
down 1
down 5
down 4
down 3
forward 4
forward 9
forward 1
up 6
down 1
down 3
forward 8
forward 3
down 6
forward 2
down 6
down 2
forward 4
forward 7
forward 4
up 4
up 8
up 7
up 9
forward 3
forward 1
down 9
down 5
forward 6
forward 6
forward 2
down 8
down 4
down 2
down 7
up 2
forward 7
forward 5
forward 5
forward 1
down 9
forward 3
forward 3
down 8
forward 3
down 5
down 2
forward 3
up 3
forward 5
down 8
forward 6
forward 6
forward 9
forward 9
forward 8
forward 4
forward 6
forward 6
up 7
down 6
down 6
forward 6
up 5
forward 6
down 8
down 5
down 8
down 8
up 5
down 2
forward 4
down 2
up 6
down 8
down 4
up 3
up 2
down 1
forward 2
forward 6
down 7
forward 7
down 6
down 2
down 3
down 6
forward 4
up 1
forward 7
down 4
forward 8
forward 9
forward 6
down 1
forward 8
down 7
up 9
down 5
forward 4
forward 3
down 8
down 5
down 4
forward 7
down 9
down 2
forward 3
down 7
up 1
forward 4
down 3
up 4
down 2
down 7
down 1
down 3
forward 5
forward 5
down 2
up 2
down 8
forward 8
down 5
forward 9
down 5
forward 6
forward 9
forward 3
down 5
down 2
down 8
up 9
up 8
down 8
forward 4
up 5
forward 1
up 4
down 1
forward 2";
void Main()
{
var values = Input.Split("\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
var bins = new (int one, int zero)[values.First().Length];
foreach (var v in values)
{
for (int i = 0; i < v.Length; i++)
{
if (v[i] == '0')
{
bins[i].zero++;
}
else
{
bins[i].one++;
}
}
}
bins.Dump();
int gamma = 0;
int epsilon = 0;
string gammaString = bins.Aggregate(string.Empty, (acc, bin) => acc += (bin.zero > bin.one) ? "0" : "1").Dump();
gamma = Convert.ToInt32(gammaString, fromBase: 2);
string epsilonString = bins.Aggregate(string.Empty, (acc, bin) => acc += (bin.zero < bin.one) ? "0" : "1").Dump();
epsilon = Convert.ToInt32(epsilonString, fromBase: 2);
int result = gamma * epsilon;
gamma.Dump("Gamma");
epsilon.Dump("Epsilon");
result.Dump("Result");
}
string TestInput = @"
00100
11110
10110
10111
10101
01111
00111
11100
10000
11001
00010
01010";
string Input = @"
000011000110
100110100101
101100101001
001100010000
011000100100
110100101111
110110001001
010010100101
100111000010
001010110001
110111010001
110001011000
011110010100
001001010111
110010111111
111011010111
100010001011
010001100010
111110111111
001000101111
010111110110
000000001100
001000110101
111111010011
111010011100
111010010110
100110011000
110110000010
101101011101
111100000001
110000101011
000110111000
110101110000
110001100001
110101001101
100011011000
110101000111
100010100111
111101001100
000110000110
101011000100
011100100001
101110111010
110011011101
010111001101
110001001101
100000000101
010011100100
111001111111
101111111111
110000101010
000110100001
111100111000
000010000100
010100101001
000000111111
111100111011
000010100111
100101101110
101001110110
100101000111
111100101011
011101101000
101010110101
010011000100
111001101110
001110000110
000111001011
010110101011
100001011001
001111000111
110000111000
111111111011
100010110011
001011000100
100011101111
111101101000
111100111010
000110001100
010000110001
000101010101
110100011000
001100101111
110110101010
101111100111
011111110001
011000001100
110101100001
101010000111
101000001000
001101110100
100000111010
011101110000
011100100100
111000111010
100001111110
100001001111
011111110010
001110101011
111100011010
010100010111
000000110001
110100010001
110100111101
101110110000
111010101010
101100110001
010011011001
111000001001
100001110101
011001000110
010001100101
100111010101
100011011010
001101110011
100111101101
111000010010
011110110001
100110000010
000000100011
100010110100
101001010101
101001101100
000111111000
101010110100
010011000001
110110011101
111001010110
011100111101
001100010001
011101000001
001001101001
010111001011
111000000010
111011011101
101010011101
001001001110
001011100011
100100111111
101110101111
111001011101
000010001100
010110101010
001101000010
010011101110
110000001001
010111001111
100011000010
100000110010
100111110101
100111111011
010000000101
111000101101
010111001010
100100110101
100110000110
110010110111
000000111101
010110011100
100000101000
000110001111
001001110110
101010111001
101010100110
101101100111
001111010110
001001110100
011010011111
101100101010
001010011010
101111010100
100110100001
111001110101
110100001110
000011001100
001101011110
001011111010
101100011101
001111001110
111000111000
100111001010
010100111100
010100000111
010100101011
010100000001
100111000110
111011010000
100011011001
111001001110
000000010101
111001011110
010101011000
110010001001
100011000000
111100001100
001010000100
100000100110
100011110110
010010110001
011110000000
000000101000
010001011001
011010111010
011010101110
001101011011
111100111001
011011010110
111110100101
100001110001
010111011100
111100100001
110011100010
001010001011
100100111100
000010010001
101111010000
111000001101
000110001011
000101101001
001001011011
001001010010
011110111011
001001100001
110011001011
000011110000
001011011101
001010010010
011100111110
101000101000
110000011001
010001100001
011010100010
100101110010
111100001010
001110000010
011101000000
110100110011
010010011101
101001000100
110111110010
001100000011
000001110110
000101010010
100000011011
000000000010
011111000111
110010101011
100101101001
010110010101
000100101000
001011100010
001110100010
110111101001
101110110100
011100110101
011101100111
001100101100
111101000010
011110110100
111001100000
111110011000
001101001110
101000011111
110010010110
111011100011
110010111001
101111110111
101001100110
011010011010
000010100101
110110100001
000101001001
000001111111
010010111011
100010110111
110111011111
010001001101
000110110101
010010010100
101011001111
111000011110
110110010010
111110100110
100110000001
011111100001
001100010100
001101000101
011011100010
011110101111
001101110110
110101010110
000110101101
111010111000
011001011111
100011111101
110100111100
100111101100
001011001110
111000010100
001100000110
111011010101
000001001011
111100000000
010010111101
110011101010
011110111110
011111011110
111001001001
000100100111
001010010101
101011101101
110011010111
011000001000
111001000101
101001110011
011110110101
111101111011
111100101100
001010110100
101100111000
011011000000
101000100011
100001100110
001000011101
001110100000
011111111101
010001010111
001101001000
100101100100
000011010110
100000000100
011100011111
000010110011
100000100010
101100101110
100100000010
001001111001
011100110111
011111100011
010000101100
100101001101
000110010100
110101010010
100010100011
110101000001
010000000110
110110001011
100011001001
111111110000
111010000011
011001010101
011111101000
100010101111
010100100000
100110110100
101111010011
011101010001
100100001010
001110000000
001110000101
111010000010
101000010000
111101011111
001001110001
011001000100
000011101100
100010010111
110000101111
110010100100
100000011111
011100100011
000001101000
101010100001
010001100011
001010111110
111010111110
011011000100
001101100000
001101100011
111010011111
111110110010
010110100111
101011011010
110010011001
001011010010
000101100000
100000100011
000111100001
001111110101
000011101001
110101010100
111011010110
101111011000
001000100100
010110011001
110111000011
001010011000
110011000010
111101001000
000001010001
101011110111
011001100110
101101101101
100011010110
110001010000
110001010001
100011100110
111111011100
000101101000
110000111001
111100010011
101010110001
101100001011
110100110001
100110111011
011100100111
110001011111
011010100101
101011111100
111000010101
110110110100
111101100011
001110100101
100010111001
100010001001
100001010101
010011001100
000101010111
101100010100
000101000111
001111101100
111000001100
100110101101
000001100010
100010011011
011001000011
110000010100
010100001011
101011001110
000110110000
110011000110
101101111101
001001000111
001001011111
110100011011
101110010011
100001011000
010010110111
011001011000
011011101100
100110000100
001101110000
011011001101
111110001011
110111100101
101001010100
100101110101
100010000001
011110011010
000010011100
111011000101
100110001011
000101101011
011100100010
000010111000
000001100000
000100001000
110110101110
101000100110
100101010001
011010010100
000001111110
001100010110
001001101111
111010001011
100100101111
011100011011
100111011110
000010010101
011001110001
001011011000
011010100110
110011011111
001110011101
111101010001
101010111000
110000010110
110110001000
011000111001
111010100111
101011011110
001001011001
101011100111
111011110010
010100110101
101001111010
111110011111
110110010000
101101010101
000101111100
001110101010
111111111000
001001000100
111011011111
111000010001
111101100010
001000011100
100100000001
111101010011
001100011110
110000001100
000101011000
101000101111
100000101100
001010100001
001100111001
000110011011
000111100000
010001000001
010010111001
101111001101
110111011101
101010001110
101010100111
111101000001
101001011010
011111010100
100010111000
110111110001
001110111000
000010001111
110111001101
110110011110
000001001111
110100000000
100101011001
111101110001
001000000000
110110001010
010000101111
110000000100
111100110100
001110000011
101100111111
100101011110
010010101110
001011001001
011000101000
100000001010
010001110001
011001111001
111100001111
000111100011
110100100111
101101111011
101010111101
110000001011
011011010000
001000100000
101101001100
110111101000
111011101011
110011101100
000010010000
111100010100
000111011101
110110110011
100110100000
101010000110
101001110001
101110001101
100010111110
011001001001
011111111001
000101010110
010011110111
000000000011
001101001100
001001110101
010010101100
101100000110
010110011111
101000010110
011001011010
011111110000
101101111001
110011110110
101101101010
111111111110
011001110110
000010111101
100110110001
000111010001
000011001101
100110111111
101010011110
101010011011
110011010001
101001100000
111100000111
000111101000
011011010111
010111000011
000111100101
101111011111
101110011111
100010001000
101111000001
100101010101
101011110010
001010111111
010101010001
110101110110
000000111110
010001101000
111111001001
110111101111
100100110000
110111010010
111011000000
011100010001
001100100010
010110010011
111101010000
011010101011
100110010101
011100000110
001110011001
001010100000
101000000000
101011101110
111100110101
100111110100
011000110010
110011010011
101011011101
101001110111
011010111111
101011000010
001100110010
111100100111
100110111000
111111010010
010111010100
101000101010
011000011111
000001110100
101110111000
001001011000
011001100101
011111000000
110001101010
010000101110
000001110010
000000000101
001010111001
101101101001
110100100100
001000100011
010000000000
010111010101
011010001010
000101010011
101011001010
001010101101
101110001010
101101110000
001000010001
100001000001
010100000011
011111011010
001110011111
010000110000
100100010010
111011111101
010010010010
110010000000
011000111100
001110010101
100110011010
110101000011
110011000001
110101111000
111001011100
101010000100
001001110011
101011110101
101011010101
110011111000
100001011010
000010000111
001010110010
000110010000
101101101111
111010010000
011010000100
011110010101
011010011101
010001011010
001111101010
100001001000
010010110110
000001011101
001001101011
111001110010
101101100100
001000101110
000000010100
001010110000
011010101000
010001001001
100110111110
110111001010
111110000111
101111011110
001110110001
001101110001
111000000011
010000010001
011001111010
010100111111
111000000111
101011001100
111000100101
101001110100
101110100000
100011001110
010111101110
000100000100
110011110011
011110101010
101100001000
011010111101
111111111010
100000101011
001110101001
011100000111
010000101101
001101011000
011000101010
000100111001
110111100000
000111111101
111001011011
000011001110
011110010000
100010101110
111001110001
000101011010
110001100101
010011011000
000000100100
000101001101
111110011110
000010110110
101100001100
010111000111
000110010110
110110010100
111000110011
111011011100
011001000000
100101000110
100011010101
101011101111
010011111010
000110011100
111010010010
111010111100
010111100101
101101001101
010110100100
011100010101
000001100110
001000110110
011101000010
111100101111
110110001110
000011100010
101011000001
110100100000
001111111000
110111001111
000100111110
111100000110
010111010010
001000101001
000001010000
100010110010
101101110100
111101100001
000101111111
000101001110
110010001101
101000011001
111001001111
111000000000
000101110110
111001111001
010010010101
110011011000
011000001001
110001010010
101100110010
101011010011
000000110110
111000011000
101001101011
111100100100
111011111001
111101001110
101000001010
000111000101
110011010010
011101101001
111000110010
111010011010
110001011101
101000111100
100111011111
011000101101
011111101101
100001000111
010001101010
110100010000
110100011100
111001100001
001101010100
000101100110
001111001000
011001011100
000100011001
011100010010
101010101100
111011110101
101011000111
100111010100
111001100100
110011101011
010011000110
111101100101
101101011000
000101000100
010001001110
110000011110
100100100101
011000100000
010111010000
000101011001
110110101100
000011010000
010110100000
110010101101
111100111111
001101101001
000110000010
100101111101
101101010010
110111011000
000110000100
001000001001
010010101010
101111010101
010010000000
101011011111
111110010010
111000111011
000001011100
010101111111
011000101100
000001011001
100001011011
100001101110
110010000001
001011110100
011110010001
111100110000
101000111111
110000011011
011100111010
001010011101
100110001100
110011011010
111001000100
010100111110
010001110111
010011010010
000101001000
010011101010
000001110101
010101101101
010001100111
101001111111
111011011011
100001100011
101101111000
110011011001
001110110010
011101001101
010101010010
110001110001
010011010000
110000000111
011100110100
010000011000
011001111011
111010110010
101100010011
011011001000
111011101101
010000011101
000001010101
101011100011
010110111011
001100100000
111011100001
111111001000
111110110001
100001110000
010001001010
100111010011
000010000000
010011000010
110101110101
000110011110
011111111010
011010101101
110110000101
111000110000
111011000110
111101000011
101110010110
000001000111
001111111001
110101011001
111010110100
100000000011
010110110011
100011100111
001111101110
110010111000
001100111010
101010100101
000101110111
011001110010
010110001100
101010111111
010010011011
100110011111
100010010000
110100001000
001001000010
101010100100
100111001011
010100000000
100100100111
110001101011
011000110100
111000001000
011111110110
011111000101
000000011011
100111000111
010001110100
101000010001
010011100010
111010001010
101101110111
010100010101
000100001111
001110000001
000011110001
101000010101
111100100010
101100010110
000111001101
101100101111
110011101001
111110110101
000110011010
010100100010
111100010110
011110110110
101011101000
100001000010
001001101101
110111111101
111001110100
111001001000
011011100101
010111011110
111000011111
110111100100
010011110110
010000111011
100000001001
101110010101
100110111010
100001000000
110100110111";
void Main()
{
var values = Input.Split("\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
values.Dump();
var bins = GetBins(values).Dump();
//int gamma = 0;
//int epsilon = 0;
//
//string gammaString = bins.Aggregate(string.Empty, (acc, bin) => acc += (bin.zero > bin.one) ? "0" : "1").Dump();
//gamma = Convert.ToInt32(gammaString, fromBase: 2);
//
//string epsilonString = bins.Aggregate(string.Empty, (acc, bin) => acc += (bin.zero < bin.one) ? "0" : "1").Dump();
//epsilon = Convert.ToInt32(epsilonString, fromBase: 2);
//
//int result = gamma * epsilon;
//
//gamma.Dump("Gamma");
//epsilon.Dump("Epsilon");
//result.Dump("Result");
// Oxygen
var validOxygens = new HashSet<string>(values);
for (int i = 0; i < bins.Length; i++)
{
char criteria = (bins[i].zero > bins[i].one) ? '0' : '1';
validOxygens.RemoveWhere(v => v[i] != criteria);
bins = GetBins(validOxygens);
criteria.Dump();
validOxygens.Dump();
if (validOxygens.Count == 1)
{
validOxygens.Single().Dump();
break;
}
}
// CO2
var validCo2s = new HashSet<string>(values);
bins = GetBins(values);
for (int i = 0; i < bins.Length; i++)
{
char criteria = (bins[i].zero <= bins[i].one) ? '0' : '1';
validCo2s.RemoveWhere(v => v[i] != criteria);
bins = GetBins(validCo2s);
criteria.Dump();
validCo2s.Dump();
if (validCo2s.Count == 1)
{
validCo2s.Single().Dump();
break;
}
}
int oxygen = Convert.ToInt32(validOxygens.Single(), fromBase: 2);
int co2 = Convert.ToInt32(validCo2s.Single(), fromBase: 2);
int result = oxygen * co2;
oxygen.Dump("Oxygen");
co2.Dump("CO2");
result.Dump("Result");
}
(int one, int zero)[] GetBins(IEnumerable<string> values)
{
var bins = new (int one, int zero)[values.First().Length];
foreach (var v in values)
{
for (int i = 0; i < v.Length; i++)
{
if (v[i] == '0')
{
bins[i].zero++;
}
else
{
bins[i].one++;
}
}
}
return bins;
}
string TestInput = @"
00100
11110
10110
10111
10101
01111
00111
11100
10000
11001
00010
01010";
string Input = @"
000011000110
100110100101
101100101001
001100010000
011000100100
110100101111
110110001001
010010100101
100111000010
001010110001
110111010001
110001011000
011110010100
001001010111
110010111111
111011010111
100010001011
010001100010
111110111111
001000101111
010111110110
000000001100
001000110101
111111010011
111010011100
111010010110
100110011000
110110000010
101101011101
111100000001
110000101011
000110111000
110101110000
110001100001
110101001101
100011011000
110101000111
100010100111
111101001100
000110000110
101011000100
011100100001
101110111010
110011011101
010111001101
110001001101
100000000101
010011100100
111001111111
101111111111
110000101010
000110100001
111100111000
000010000100
010100101001
000000111111
111100111011
000010100111
100101101110
101001110110
100101000111
111100101011
011101101000
101010110101
010011000100
111001101110
001110000110
000111001011
010110101011
100001011001
001111000111
110000111000
111111111011
100010110011
001011000100
100011101111
111101101000
111100111010
000110001100
010000110001
000101010101
110100011000
001100101111
110110101010
101111100111
011111110001
011000001100
110101100001
101010000111
101000001000
001101110100
100000111010
011101110000
011100100100
111000111010
100001111110
100001001111
011111110010
001110101011
111100011010
010100010111
000000110001
110100010001
110100111101
101110110000
111010101010
101100110001
010011011001
111000001001
100001110101
011001000110
010001100101
100111010101
100011011010
001101110011
100111101101
111000010010
011110110001
100110000010
000000100011
100010110100
101001010101
101001101100
000111111000
101010110100
010011000001
110110011101
111001010110
011100111101
001100010001
011101000001
001001101001
010111001011
111000000010
111011011101
101010011101
001001001110
001011100011
100100111111
101110101111
111001011101
000010001100
010110101010
001101000010
010011101110
110000001001
010111001111
100011000010
100000110010
100111110101
100111111011
010000000101
111000101101
010111001010
100100110101
100110000110
110010110111
000000111101
010110011100
100000101000
000110001111
001001110110
101010111001
101010100110
101101100111
001111010110
001001110100
011010011111
101100101010
001010011010
101111010100
100110100001
111001110101
110100001110
000011001100
001101011110
001011111010
101100011101
001111001110
111000111000
100111001010
010100111100
010100000111
010100101011
010100000001
100111000110
111011010000
100011011001
111001001110
000000010101
111001011110
010101011000
110010001001
100011000000
111100001100
001010000100
100000100110
100011110110
010010110001
011110000000
000000101000
010001011001
011010111010
011010101110
001101011011
111100111001
011011010110
111110100101
100001110001
010111011100
111100100001
110011100010
001010001011
100100111100
000010010001
101111010000
111000001101
000110001011
000101101001
001001011011
001001010010
011110111011
001001100001
110011001011
000011110000
001011011101
001010010010
011100111110
101000101000
110000011001
010001100001
011010100010
100101110010
111100001010
001110000010
011101000000
110100110011
010010011101
101001000100
110111110010
001100000011
000001110110
000101010010
100000011011
000000000010
011111000111
110010101011
100101101001
010110010101
000100101000
001011100010
001110100010
110111101001
101110110100
011100110101
011101100111
001100101100
111101000010
011110110100
111001100000
111110011000
001101001110
101000011111
110010010110
111011100011
110010111001
101111110111
101001100110
011010011010
000010100101
110110100001
000101001001
000001111111
010010111011
100010110111
110111011111
010001001101
000110110101
010010010100
101011001111
111000011110
110110010010
111110100110
100110000001
011111100001
001100010100
001101000101
011011100010
011110101111
001101110110
110101010110
000110101101
111010111000
011001011111
100011111101
110100111100
100111101100
001011001110
111000010100
001100000110
111011010101
000001001011
111100000000
010010111101
110011101010
011110111110
011111011110
111001001001
000100100111
001010010101
101011101101
110011010111
011000001000
111001000101
101001110011
011110110101
111101111011
111100101100
001010110100
101100111000
011011000000
101000100011
100001100110
001000011101
001110100000
011111111101
010001010111
001101001000
100101100100
000011010110
100000000100
011100011111
000010110011
100000100010
101100101110
100100000010
001001111001
011100110111
011111100011
010000101100
100101001101
000110010100
110101010010
100010100011
110101000001
010000000110
110110001011
100011001001
111111110000
111010000011
011001010101
011111101000
100010101111
010100100000
100110110100
101111010011
011101010001
100100001010
001110000000
001110000101
111010000010
101000010000
111101011111
001001110001
011001000100
000011101100
100010010111
110000101111
110010100100
100000011111
011100100011
000001101000
101010100001
010001100011
001010111110
111010111110
011011000100
001101100000
001101100011
111010011111
111110110010
010110100111
101011011010
110010011001
001011010010
000101100000
100000100011
000111100001
001111110101
000011101001
110101010100
111011010110
101111011000
001000100100
010110011001
110111000011
001010011000
110011000010
111101001000
000001010001
101011110111
011001100110
101101101101
100011010110
110001010000
110001010001
100011100110
111111011100
000101101000
110000111001
111100010011
101010110001
101100001011
110100110001
100110111011
011100100111
110001011111
011010100101
101011111100
111000010101
110110110100
111101100011
001110100101
100010111001
100010001001
100001010101
010011001100
000101010111
101100010100
000101000111
001111101100
111000001100
100110101101
000001100010
100010011011
011001000011
110000010100
010100001011
101011001110
000110110000
110011000110
101101111101
001001000111
001001011111
110100011011
101110010011
100001011000
010010110111
011001011000
011011101100
100110000100
001101110000
011011001101
111110001011
110111100101
101001010100
100101110101
100010000001
011110011010
000010011100
111011000101
100110001011
000101101011
011100100010
000010111000
000001100000
000100001000
110110101110
101000100110
100101010001
011010010100
000001111110
001100010110
001001101111
111010001011
100100101111
011100011011
100111011110
000010010101
011001110001
001011011000
011010100110
110011011111
001110011101
111101010001
101010111000
110000010110
110110001000
011000111001
111010100111
101011011110
001001011001
101011100111
111011110010
010100110101
101001111010
111110011111
110110010000
101101010101
000101111100
001110101010
111111111000
001001000100
111011011111
111000010001
111101100010
001000011100
100100000001
111101010011
001100011110
110000001100
000101011000
101000101111
100000101100
001010100001
001100111001
000110011011
000111100000
010001000001
010010111001
101111001101
110111011101
101010001110
101010100111
111101000001
101001011010
011111010100
100010111000
110111110001
001110111000
000010001111
110111001101
110110011110
000001001111
110100000000
100101011001
111101110001
001000000000
110110001010
010000101111
110000000100
111100110100
001110000011
101100111111
100101011110
010010101110
001011001001
011000101000
100000001010
010001110001
011001111001
111100001111
000111100011
110100100111
101101111011
101010111101
110000001011
011011010000
001000100000
101101001100
110111101000
111011101011
110011101100
000010010000
111100010100
000111011101
110110110011
100110100000
101010000110
101001110001
101110001101
100010111110
011001001001
011111111001
000101010110
010011110111
000000000011
001101001100
001001110101
010010101100
101100000110
010110011111
101000010110
011001011010
011111110000
101101111001
110011110110
101101101010
111111111110
011001110110
000010111101
100110110001
000111010001
000011001101
100110111111
101010011110
101010011011
110011010001
101001100000
111100000111
000111101000
011011010111
010111000011
000111100101
101111011111
101110011111
100010001000
101111000001
100101010101
101011110010
001010111111
010101010001
110101110110
000000111110
010001101000
111111001001
110111101111
100100110000
110111010010
111011000000
011100010001
001100100010
010110010011
111101010000
011010101011
100110010101
011100000110
001110011001
001010100000
101000000000
101011101110
111100110101
100111110100
011000110010
110011010011
101011011101
101001110111
011010111111
101011000010
001100110010
111100100111
100110111000
111111010010
010111010100
101000101010
011000011111
000001110100
101110111000
001001011000
011001100101
011111000000
110001101010
010000101110
000001110010
000000000101
001010111001
101101101001
110100100100
001000100011
010000000000
010111010101
011010001010
000101010011
101011001010
001010101101
101110001010
101101110000
001000010001
100001000001
010100000011
011111011010
001110011111
010000110000
100100010010
111011111101
010010010010
110010000000
011000111100
001110010101
100110011010
110101000011
110011000001
110101111000
111001011100
101010000100
001001110011
101011110101
101011010101
110011111000
100001011010
000010000111
001010110010
000110010000
101101101111
111010010000
011010000100
011110010101
011010011101
010001011010
001111101010
100001001000
010010110110
000001011101
001001101011
111001110010
101101100100
001000101110
000000010100
001010110000
011010101000
010001001001
100110111110
110111001010
111110000111
101111011110
001110110001
001101110001
111000000011
010000010001
011001111010
010100111111
111000000111
101011001100
111000100101
101001110100
101110100000
100011001110
010111101110
000100000100
110011110011
011110101010
101100001000
011010111101
111111111010
100000101011
001110101001
011100000111
010000101101
001101011000
011000101010
000100111001
110111100000
000111111101
111001011011
000011001110
011110010000
100010101110
111001110001
000101011010
110001100101
010011011000
000000100100
000101001101
111110011110
000010110110
101100001100
010111000111
000110010110
110110010100
111000110011
111011011100
011001000000
100101000110
100011010101
101011101111
010011111010
000110011100
111010010010
111010111100
010111100101
101101001101
010110100100
011100010101
000001100110
001000110110
011101000010
111100101111
110110001110
000011100010
101011000001
110100100000
001111111000
110111001111
000100111110
111100000110
010111010010
001000101001
000001010000
100010110010
101101110100
111101100001
000101111111
000101001110
110010001101
101000011001
111001001111
111000000000
000101110110
111001111001
010010010101
110011011000
011000001001
110001010010
101100110010
101011010011
000000110110
111000011000
101001101011
111100100100
111011111001
111101001110
101000001010
000111000101
110011010010
011101101001
111000110010
111010011010
110001011101
101000111100
100111011111
011000101101
011111101101
100001000111
010001101010
110100010000
110100011100
111001100001
001101010100
000101100110
001111001000
011001011100
000100011001
011100010010
101010101100
111011110101
101011000111
100111010100
111001100100
110011101011
010011000110
111101100101
101101011000
000101000100
010001001110
110000011110
100100100101
011000100000
010111010000
000101011001
110110101100
000011010000
010110100000
110010101101
111100111111
001101101001
000110000010
100101111101
101101010010
110111011000
000110000100
001000001001
010010101010
101111010101
010010000000
101011011111
111110010010
111000111011
000001011100
010101111111
011000101100
000001011001
100001011011
100001101110
110010000001
001011110100
011110010001
111100110000
101000111111
110000011011
011100111010
001010011101
100110001100
110011011010
111001000100
010100111110
010001110111
010011010010
000101001000
010011101010
000001110101
010101101101
010001100111
101001111111
111011011011
100001100011
101101111000
110011011001
001110110010
011101001101
010101010010
110001110001
010011010000
110000000111
011100110100
010000011000
011001111011
111010110010
101100010011
011011001000
111011101101
010000011101
000001010101
101011100011
010110111011
001100100000
111011100001
111111001000
111110110001
100001110000
010001001010
100111010011
000010000000
010011000010
110101110101
000110011110
011111111010
011010101101
110110000101
111000110000
111011000110
111101000011
101110010110
000001000111
001111111001
110101011001
111010110100
100000000011
010110110011
100011100111
001111101110
110010111000
001100111010
101010100101
000101110111
011001110010
010110001100
101010111111
010010011011
100110011111
100010010000
110100001000
001001000010
101010100100
100111001011
010100000000
100100100111
110001101011
011000110100
111000001000
011111110110
011111000101
000000011011
100111000111
010001110100
101000010001
010011100010
111010001010
101101110111
010100010101
000100001111
001110000001
000011110001
101000010101
111100100010
101100010110
000111001101
101100101111
110011101001
111110110101
000110011010
010100100010
111100010110
011110110110
101011101000
100001000010
001001101101
110111111101
111001110100
111001001000
011011100101
010111011110
111000011111
110111100100
010011110110
010000111011
100000001001
101110010101
100110111010
100001000000
110100110111";
void Main()
{
var values = Input.Trim().Split("\r\n\r\n");
var boards = values.Skip(1).Select(v => Board.Parse(v)).ToList();
boards.Dump();
var calledNumbers = values.Take(1).First().Split(',').Select(v => int.Parse(v));
foreach (var n in calledNumbers)
{
foreach (var b in boards)
{
b.Mark(n);
if (b.WinnerColumns.Any() || b.WinnerRows.Any())
{
b.Dump();
n.Dump("Winning called number");
(b.UnmarkedSums * n).Dump("Product");
return;
}
}
}
}
public record Board(int[,] Values)
{
private static int Width => 5;
private static int Height => 5;
public bool[,] Marks { get; } = new bool[Width, Height];
public IEnumerable<int> WinnerColumns => GetWinningColumns();
public IEnumerable<int> WinnerRows => GetWinningRows();
public int UnmarkedSums => Values.Cast<int>().Zip(Marks.Cast<bool>()).Where(pair => pair.Second == false).Sum(pair => pair.First);
public void Mark(int value)
{
for (int x = 0; x < Width; x++)
{
for (int y = 0; y < Height; y++)
{
if (Values[x, y] == value)
{
Marks[x, y] = true;
}
}
}
}
public IEnumerable<int> GetWinningRows()
{
for (int x = 0; x < Width; x++)
{
bool isWinner = true;
for (int y = 0; y < Height; y++)
{
if (Marks[x, y] == false)
{
isWinner = false;
break;
}
}
if (isWinner)
{
yield return x;
}
}
}
public IEnumerable<int> GetWinningColumns()
{
for (int y = 0; y < Height; y++)
{
bool isWinner = true;
for (int x = 0; x < Height; x++)
{
if (Marks[x, y] == false)
{
isWinner = false;
break;
}
}
if (isWinner)
{
yield return y;
}
}
}
public static Board Parse(string raw)
{
var sValues = raw.Split(new string[] { "\n", " " }, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
var values = new int[Width, Height];
for (int x = 0; x < Width; x++)
{
for (int y = 0; y < Height; y++)
{
values[x, y] = int.Parse(sValues[(y * Height) + x]);
}
}
return new Board(values);
}
}
string TestInput = @"
7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1
22 13 17 11 0
8 2 23 4 24
21 9 14 16 7
6 10 3 18 5
1 12 20 15 19
3 15 0 2 22
9 18 13 17 5
19 8 7 25 23
20 11 10 24 4
14 21 16 12 6
14 21 17 24 4
10 16 15 9 19
18 8 23 26 20
22 11 13 6 5
2 0 12 3 7";
string Input = @"
72,99,88,8,59,61,96,92,2,70,1,32,18,10,95,33,20,31,66,43,26,24,91,44,11,15,48,90,27,29,14,68,3,50,69,74,54,4,16,55,64,12,73,80,58,83,6,87,30,41,25,39,93,60,9,81,63,75,46,19,78,51,21,28,94,7,17,42,53,13,97,98,34,76,89,23,86,52,79,85,67,84,47,22,37,65,71,49,82,40,77,36,62,0,56,45,57,38,35,5
91 60 70 64 83
35 41 79 55 31
7 58 25 3 47
2 23 69 59 21
11 22 8 87 90
77 95 19 21 76
93 92 62 35 3
4 29 7 41 45
80 50 83 61 64
39 32 91 56 48
47 11 39 58 97
63 51 40 74 71
12 17 68 81 44
64 85 20 84 80
0 77 5 18 50
44 82 32 1 57
98 88 33 83 85
25 61 63 99 37
0 74 7 20 39
71 72 22 80 28
78 97 0 48 41
56 51 62 58 90
8 44 98 46 1
38 40 91 20 55
88 2 32 86 14
84 50 16 45 40
9 39 60 34 46
57 20 12 3 36
58 17 72 48 83
73 85 49 67 66
4 30 73 83 57
74 23 49 19 42
72 65 8 99 13
25 6 82 53 68
20 86 46 48 50
52 29 61 16 75
36 19 2 82 9
34 90 89 43 14
69 66 20 21 11
31 53 46 18 23
37 76 34 79 99
43 5 42 91 71
47 54 19 82 81
95 78 65 60 24
32 94 92 27 66
68 61 80 90 53
33 17 52 0 23
30 71 5 85 11
27 39 41 6 9
58 98 7 74 89
31 5 55 67 51
54 86 40 25 92
91 62 9 94 7
39 0 44 52 28
12 17 26 46 32
94 80 83 88 77
65 71 31 86 0
98 55 18 92 72
6 12 30 25 34
67 53 14 20 47
81 74 14 47 1
83 82 4 89 8
43 93 63 21 44
92 61 25 77 97
12 72 35 78 52
26 39 13 37 46
87 6 58 47 19
24 35 45 95 52
5 27 42 96 0
23 64 8 29 83
53 58 18 96 93
57 90 35 88 68
91 89 7 80 47
59 86 81 24 31
43 8 66 17 94
0 97 91 67 90
93 20 36 4 42
43 64 28 94 34
31 2 7 54 71
18 35 76 86 16
55 63 26 47 0
2 23 54 25 90
36 13 85 31 15
59 51 18 88 62
44 69 9 81 58
26 97 98 42 27
3 53 91 89 93
87 57 12 18 5
29 99 86 47 64
6 28 92 79 67
4 35 45 79 16
33 95 99 80 9
60 78 57 51 50
27 5 48 21 46
19 70 32 58 18
94 82 61 66 31
14 56 76 37 28
42 81 50 10 40
2 98 47 29 62
69 90 46 44 18
87 3 8 50 17
15 90 54 45 21
6 28 43 51 32
97 84 69 30 38
98 44 88 55 83
34 19 27 43 92
81 62 52 32 39
50 29 83 25 82
60 55 49 41 97
75 94 22 69 66
59 39 96 87 65
33 18 4 71 15
22 27 92 8 29
19 5 32 85 45
91 79 35 9 3
41 53 51 68 85
72 71 94 82 81
60 38 13 16 7
49 80 10 0 54
20 39 59 64 99
37 21 90 40 73
85 75 16 34 99
84 15 25 18 27
77 32 0 76 36
13 50 68 91 12
24 26 0 14 12
89 4 15 95 73
54 2 55 84 42
30 50 81 60 87
37 94 71 91 53
52 1 81 44 34
27 60 36 19 69
98 11 49 67 56
77 72 40 48 66
84 9 37 32 51
58 15 7 36 55
94 49 69 89 87
79 70 30 77 19
68 31 56 41 53
47 85 74 54 46
64 87 23 66 0
29 98 72 82 80
70 45 46 30 37
53 54 33 86 76
6 75 71 68 2
12 31 43 80 41
37 15 13 2 3
86 61 9 17 59
55 68 72 8 1
96 26 44 73 47
67 39 95 84 10
5 88 13 81 99
68 15 98 6 17
47 85 74 32 97
58 8 16 56 42
82 31 42 84 17
25 28 2 6 12
78 57 16 97 18
87 64 54 30 65
3 77 29 49 81
24 1 43 89 46
29 78 57 14 85
9 58 53 83 35
96 42 62 68 74
67 2 39 37 51
72 26 46 52 3
91 27 41 32 53
25 36 7 63 22
56 38 93 65 9
95 19 77 64 44
21 71 13 99 39
47 17 80 85 64
5 18 48 27 81
82 23 45 57 12
83 55 26 31 32
57 13 86 69 65
42 76 35 18 39
17 91 95 43 6
55 97 22 54 14
56 0 5 60 92
87 12 46 42 35
44 6 95 30 67
51 21 68 37 59
77 65 50 69 63
33 56 24 57 28
82 87 42 99 39
38 55 74 28 6
77 66 9 80 10
47 90 32 3 98
92 52 5 94 51
16 1 87 57 66
41 70 58 31 5
71 88 17 42 76
81 40 25 89 63
92 4 61 77 64
70 28 56 51 66
44 60 25 0 45
91 78 81 95 88
75 43 57 67 32
58 27 20 82 22
16 98 82 79 90
96 4 80 69 19
9 28 33 40 94
2 99 14 73 43
76 68 74 42 30
29 42 94 45 2
25 81 46 54 26
75 99 51 58 23
76 72 71 64 63
66 70 92 44 13
2 71 39 49 95
19 84 1 7 96
9 6 60 93 78
38 91 55 36 41
64 3 10 20 74
79 80 15 69 89
36 76 83 7 72
87 34 48 0 93
5 84 77 20 75
46 27 11 55 3
82 34 4 14 74
40 39 7 6 95
11 51 78 80 29
97 81 38 9 71
22 62 19 72 68
54 70 90 43 98
12 27 57 96 62
32 76 0 86 42
88 68 81 91 50
10 94 18 71 2
90 41 29 53 58
59 62 14 85 66
25 82 68 44 93
73 32 76 67 18
94 71 83 34 37
6 72 69 33 90
87 60 66 85 16
59 80 86 47 89
32 98 17 29 5
48 27 18 57 81
10 22 98 86 82
8 66 71 14 93
87 79 40 78 49
84 63 17 54 94
35 39 47 1 96
58 60 52 6 86
41 20 66 59 2
92 79 88 40 71
96 9 25 36 17
91 32 43 38 8
74 3 64 66 68
69 37 22 76 33
17 67 29 32 27
63 49 46 21 60
35 73 9 52 50
0 91 8 26 9
3 98 79 97 7
37 61 1 60 47
86 17 11 70 15
66 53 2 90 54
68 42 0 78 16
83 88 21 87 12
50 2 29 14 63
72 90 81 71 91
54 79 94 10 4
28 63 97 31 4
50 52 43 24 16
36 77 0 9 75
83 94 69 68 27
93 82 42 56 34
24 52 66 51 82
50 30 34 93 67
56 70 53 13 78
4 84 88 57 81
80 74 5 95 98
56 64 53 52 72
51 48 50 60 49
8 46 84 95 43
91 21 7 88 33
94 57 80 25 54
70 57 62 20 18
86 45 41 76 32
87 35 52 5 2
16 77 25 39 22
38 10 6 29 98
89 54 57 80 65
0 38 94 15 6
85 76 16 83 59
92 5 53 14 95
47 35 73 98 34
64 24 90 71 69
55 35 20 98 41
94 70 10 73 16
65 84 60 7 72
83 2 22 78 99
31 81 74 56 98
13 97 95 49 67
9 47 42 99 60
38 22 65 58 21
82 45 2 28 68
90 88 28 85 51
23 93 13 55 50
63 22 3 30 39
5 71 82 95 81
57 76 12 92 56
78 12 28 6 73
59 24 43 29 31
30 34 75 52 48
62 57 23 74 50
91 92 5 95 38
95 88 13 22 10
16 4 19 37 91
50 52 60 46 77
45 55 49 41 26
21 7 67 48 18
51 79 44 16 71
6 13 12 41 97
50 25 19 63 4
98 0 23 77 31
27 57 52 99 3
86 95 7 54 84
50 33 48 16 9
82 32 38 6 34
43 80 27 37 11
89 70 41 22 45
24 3 47 68 35
85 76 8 29 4
2 10 5 28 73
92 89 50 25 56
99 57 79 19 37
0 46 72 5 20
62 28 24 53 44
84 25 63 34 9
75 1 65 59 10
95 29 97 77 45
87 90 1 17 67
57 73 35 10 30
65 14 46 60 6
70 66 56 69 92
3 27 21 64 88
20 58 53 29 66
27 6 67 89 33
88 60 79 69 97
90 3 47 68 25
48 59 42 98 39
65 90 45 97 87
75 98 7 58 42
51 4 95 88 47
94 6 11 53 63
49 80 2 48 68
3 77 42 97 82
70 58 81 18 47
78 96 62 39 56
22 87 71 31 94
34 48 57 38 88
70 36 65 33 45
71 0 59 44 1
42 37 7 5 9
11 12 91 43 27
60 21 57 61 99
76 75 56 49 2
36 57 39 64 77
95 19 35 43 97
82 34 50 44 55
45 74 15 66 29
0 75 1 78 79
13 37 48 27 14
90 50 26 92 67
89 62 87 69 33
29 47 4 2 12
74 42 24 86 61
92 66 3 65 75
7 1 77 63 64
39 91 87 28 5
30 35 41 73 96
0 81 41 15 66
62 19 86 31 40
23 94 98 82 24
61 99 1 5 60
80 64 91 33 47
16 61 56 77 57
28 59 71 45 92
53 20 35 66 73
99 3 86 31 74
94 69 84 96 90
71 56 23 76 42
90 44 58 27 15
46 18 86 63 24
69 49 82 38 43
33 51 60 66 39
75 78 38 25 76
67 3 83 90 10
40 89 47 23 88
34 21 46 16 33
9 79 50 0 26
81 75 80 23 41
62 4 76 1 63
56 39 57 28 61
20 6 79 92 84
88 3 90 16 12
87 78 3 34 63
98 21 24 9 99
62 29 57 65 27
47 52 67 76 71
11 17 93 23 82
53 68 70 38 56
62 54 25 43 35
9 3 13 15 75
59 27 26 33 83
93 40 11 64 76
27 83 26 48 77
51 20 65 18 35
80 30 60 44 89
84 82 62 91 63
12 97 11 19 34
31 28 92 48 34
9 93 61 71 60
52 18 97 81 62
80 64 57 22 30
11 88 74 29 56
57 34 90 46 73
31 0 70 66 82
45 12 40 19 87
91 24 59 83 14
80 21 13 86 89
9 8 64 48 30
6 62 28 99 41
79 45 83 7 55
15 14 54 88 12
90 74 97 96 50
50 73 58 26 12
96 98 56 34 7
51 92 14 89 16
41 70 80 55 13
37 47 2 64 99
98 9 70 17 18
39 15 88 16 47
80 41 8 51 21
54 42 31 10 59
37 92 33 62 68
60 72 51 63 29
83 39 41 24 14
34 5 94 90 56
75 80 67 17 20
47 11 58 93 42
97 7 27 42 67
12 30 91 45 52
62 50 87 92 71
99 84 33 6 46
29 55 86 47 60
25 49 55 98 22
66 9 61 59 90
45 74 77 88 5
6 76 0 36 93
23 70 33 95 2
53 92 27 86 55
66 52 26 58 38
2 78 69 62 65
30 5 1 25 99
76 43 4 13 8
18 72 51 48 39
62 19 28 44 82
54 22 38 55 83
86 93 42 9 32
11 89 27 34 68
85 99 35 88 76
10 25 33 83 70
54 81 77 73 66
4 74 96 41 86
49 3 68 65 39
71 0 70 14 31
28 23 17 43 75
13 40 38 87 97
63 93 92 89 27
58 76 24 53 54
55 58 11 38 16
98 86 13 12 8
22 10 77 61 90
37 76 2 62 45
44 30 52 70 82
89 55 12 90 63
40 88 91 22 74
8 0 25 6 79
53 23 87 77 20
11 38 78 43 94
21 14 37 8 16
29 73 67 91 56
5 90 12 92 59
64 1 42 72 94
98 86 18 69 49
79 71 82 1 77
96 39 24 60 81
49 16 12 63 14
0 32 78 37 8
92 33 15 99 65
54 11 40 55 33
58 47 4 83 94
46 96 16 28 5
0 62 95 71 39
93 59 7 75 64
";
void Main()
{
var values = Input.Trim().Split("\r\n\r\n");
var boards = values.Skip(1).Select(v => Board.Parse(v)).ToList();
boards.Dump();
var calledNumbers = values.Take(1).First().Split(',').Select(v => int.Parse(v));
int boardsRemaining = boards.Count();
foreach (var n in calledNumbers)
{
foreach (var b in boards.Where(b => !b.IsWinner))
{
b.Mark(n);
if (b.IsWinner)
{
boardsRemaining--;
if (boardsRemaining == 0)
{
b.Dump();
n.Dump("Called number");
(n * b.UnmarkedSums).Dump("Product");
}
}
}
}
}
public record Board(int[,] Values)
{
private static int Width => 5;
private static int Height => 5;
public bool[,] Marks { get; } = new bool[Width, Height];
public IEnumerable<int> WinnerColumns => GetWinningColumns();
public IEnumerable<int> WinnerRows => GetWinningRows();
public bool IsWinner => WinnerColumns.Any() || WinnerRows.Any();
public int UnmarkedSums => Values.Cast<int>().Zip(Marks.Cast<bool>()).Where(pair => pair.Second == false).Sum(pair => pair.First);
public void Mark(int value)
{
for (int x = 0; x < Width; x++)
{
for (int y = 0; y < Height; y++)
{
if (Values[x, y] == value)
{
Marks[x, y] = true;
}
}
}
}
public IEnumerable<int> GetWinningRows()
{
for (int x = 0; x < Width; x++)
{
bool isWinner = true;
for (int y = 0; y < Height; y++)
{
if (Marks[x, y] == false)
{
isWinner = false;
break;
}
}
if (isWinner)
{
yield return x;
}
}
}
public IEnumerable<int> GetWinningColumns()
{
for (int y = 0; y < Height; y++)
{
bool isWinner = true;
for (int x = 0; x < Height; x++)
{
if (Marks[x, y] == false)
{
isWinner = false;
break;
}
}
if (isWinner)
{
yield return y;
}
}
}
public static Board Parse(string raw)
{
var sValues = raw.Split(new string[] { "\n", " " }, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
var values = new int[Width, Height];
for (int x = 0; x < Width; x++)
{
for (int y = 0; y < Height; y++)
{
values[x, y] = int.Parse(sValues[(y * Height) + x]);
}
}
return new Board(values);
}
}
string TestInput = @"
7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1
22 13 17 11 0
8 2 23 4 24
21 9 14 16 7
6 10 3 18 5
1 12 20 15 19
3 15 0 2 22
9 18 13 17 5
19 8 7 25 23
20 11 10 24 4
14 21 16 12 6
14 21 17 24 4
10 16 15 9 19
18 8 23 26 20
22 11 13 6 5
2 0 12 3 7";
string Input = @"
72,99,88,8,59,61,96,92,2,70,1,32,18,10,95,33,20,31,66,43,26,24,91,44,11,15,48,90,27,29,14,68,3,50,69,74,54,4,16,55,64,12,73,80,58,83,6,87,30,41,25,39,93,60,9,81,63,75,46,19,78,51,21,28,94,7,17,42,53,13,97,98,34,76,89,23,86,52,79,85,67,84,47,22,37,65,71,49,82,40,77,36,62,0,56,45,57,38,35,5
91 60 70 64 83
35 41 79 55 31
7 58 25 3 47
2 23 69 59 21
11 22 8 87 90
77 95 19 21 76
93 92 62 35 3
4 29 7 41 45
80 50 83 61 64
39 32 91 56 48
47 11 39 58 97
63 51 40 74 71
12 17 68 81 44
64 85 20 84 80
0 77 5 18 50
44 82 32 1 57
98 88 33 83 85
25 61 63 99 37
0 74 7 20 39
71 72 22 80 28
78 97 0 48 41
56 51 62 58 90
8 44 98 46 1
38 40 91 20 55
88 2 32 86 14
84 50 16 45 40
9 39 60 34 46
57 20 12 3 36
58 17 72 48 83
73 85 49 67 66
4 30 73 83 57
74 23 49 19 42
72 65 8 99 13
25 6 82 53 68
20 86 46 48 50
52 29 61 16 75
36 19 2 82 9
34 90 89 43 14
69 66 20 21 11
31 53 46 18 23
37 76 34 79 99
43 5 42 91 71
47 54 19 82 81
95 78 65 60 24
32 94 92 27 66
68 61 80 90 53
33 17 52 0 23
30 71 5 85 11
27 39 41 6 9
58 98 7 74 89
31 5 55 67 51
54 86 40 25 92
91 62 9 94 7
39 0 44 52 28
12 17 26 46 32
94 80 83 88 77
65 71 31 86 0
98 55 18 92 72
6 12 30 25 34
67 53 14 20 47
81 74 14 47 1
83 82 4 89 8
43 93 63 21 44
92 61 25 77 97
12 72 35 78 52
26 39 13 37 46
87 6 58 47 19
24 35 45 95 52
5 27 42 96 0
23 64 8 29 83
53 58 18 96 93
57 90 35 88 68
91 89 7 80 47
59 86 81 24 31
43 8 66 17 94
0 97 91 67 90
93 20 36 4 42
43 64 28 94 34
31 2 7 54 71
18 35 76 86 16
55 63 26 47 0
2 23 54 25 90
36 13 85 31 15
59 51 18 88 62
44 69 9 81 58
26 97 98 42 27
3 53 91 89 93
87 57 12 18 5
29 99 86 47 64
6 28 92 79 67
4 35 45 79 16
33 95 99 80 9
60 78 57 51 50
27 5 48 21 46
19 70 32 58 18
94 82 61 66 31
14 56 76 37 28
42 81 50 10 40
2 98 47 29 62
69 90 46 44 18
87 3 8 50 17
15 90 54 45 21
6 28 43 51 32
97 84 69 30 38
98 44 88 55 83
34 19 27 43 92
81 62 52 32 39
50 29 83 25 82
60 55 49 41 97
75 94 22 69 66
59 39 96 87 65
33 18 4 71 15
22 27 92 8 29
19 5 32 85 45
91 79 35 9 3
41 53 51 68 85
72 71 94 82 81
60 38 13 16 7
49 80 10 0 54
20 39 59 64 99
37 21 90 40 73
85 75 16 34 99
84 15 25 18 27
77 32 0 76 36
13 50 68 91 12
24 26 0 14 12
89 4 15 95 73
54 2 55 84 42
30 50 81 60 87
37 94 71 91 53
52 1 81 44 34
27 60 36 19 69
98 11 49 67 56
77 72 40 48 66
84 9 37 32 51
58 15 7 36 55
94 49 69 89 87
79 70 30 77 19
68 31 56 41 53
47 85 74 54 46
64 87 23 66 0
29 98 72 82 80
70 45 46 30 37
53 54 33 86 76
6 75 71 68 2
12 31 43 80 41
37 15 13 2 3
86 61 9 17 59
55 68 72 8 1
96 26 44 73 47
67 39 95 84 10
5 88 13 81 99
68 15 98 6 17
47 85 74 32 97
58 8 16 56 42
82 31 42 84 17
25 28 2 6 12
78 57 16 97 18
87 64 54 30 65
3 77 29 49 81
24 1 43 89 46
29 78 57 14 85
9 58 53 83 35
96 42 62 68 74
67 2 39 37 51
72 26 46 52 3
91 27 41 32 53
25 36 7 63 22
56 38 93 65 9
95 19 77 64 44
21 71 13 99 39
47 17 80 85 64
5 18 48 27 81
82 23 45 57 12
83 55 26 31 32
57 13 86 69 65
42 76 35 18 39
17 91 95 43 6
55 97 22 54 14
56 0 5 60 92
87 12 46 42 35
44 6 95 30 67
51 21 68 37 59
77 65 50 69 63
33 56 24 57 28
82 87 42 99 39
38 55 74 28 6
77 66 9 80 10
47 90 32 3 98
92 52 5 94 51
16 1 87 57 66
41 70 58 31 5
71 88 17 42 76
81 40 25 89 63
92 4 61 77 64
70 28 56 51 66
44 60 25 0 45
91 78 81 95 88
75 43 57 67 32
58 27 20 82 22
16 98 82 79 90
96 4 80 69 19
9 28 33 40 94
2 99 14 73 43
76 68 74 42 30
29 42 94 45 2
25 81 46 54 26
75 99 51 58 23
76 72 71 64 63
66 70 92 44 13
2 71 39 49 95
19 84 1 7 96
9 6 60 93 78
38 91 55 36 41
64 3 10 20 74
79 80 15 69 89
36 76 83 7 72
87 34 48 0 93
5 84 77 20 75
46 27 11 55 3
82 34 4 14 74
40 39 7 6 95
11 51 78 80 29
97 81 38 9 71
22 62 19 72 68
54 70 90 43 98
12 27 57 96 62
32 76 0 86 42
88 68 81 91 50
10 94 18 71 2
90 41 29 53 58
59 62 14 85 66
25 82 68 44 93
73 32 76 67 18
94 71 83 34 37
6 72 69 33 90
87 60 66 85 16
59 80 86 47 89
32 98 17 29 5
48 27 18 57 81
10 22 98 86 82
8 66 71 14 93
87 79 40 78 49
84 63 17 54 94
35 39 47 1 96
58 60 52 6 86
41 20 66 59 2
92 79 88 40 71
96 9 25 36 17
91 32 43 38 8
74 3 64 66 68
69 37 22 76 33
17 67 29 32 27
63 49 46 21 60
35 73 9 52 50
0 91 8 26 9
3 98 79 97 7
37 61 1 60 47
86 17 11 70 15
66 53 2 90 54
68 42 0 78 16
83 88 21 87 12
50 2 29 14 63
72 90 81 71 91
54 79 94 10 4
28 63 97 31 4
50 52 43 24 16
36 77 0 9 75
83 94 69 68 27
93 82 42 56 34
24 52 66 51 82
50 30 34 93 67
56 70 53 13 78
4 84 88 57 81
80 74 5 95 98
56 64 53 52 72
51 48 50 60 49
8 46 84 95 43
91 21 7 88 33
94 57 80 25 54
70 57 62 20 18
86 45 41 76 32
87 35 52 5 2
16 77 25 39 22
38 10 6 29 98
89 54 57 80 65
0 38 94 15 6
85 76 16 83 59
92 5 53 14 95
47 35 73 98 34
64 24 90 71 69
55 35 20 98 41
94 70 10 73 16
65 84 60 7 72
83 2 22 78 99
31 81 74 56 98
13 97 95 49 67
9 47 42 99 60
38 22 65 58 21
82 45 2 28 68
90 88 28 85 51
23 93 13 55 50
63 22 3 30 39
5 71 82 95 81
57 76 12 92 56
78 12 28 6 73
59 24 43 29 31
30 34 75 52 48
62 57 23 74 50
91 92 5 95 38
95 88 13 22 10
16 4 19 37 91
50 52 60 46 77
45 55 49 41 26
21 7 67 48 18
51 79 44 16 71
6 13 12 41 97
50 25 19 63 4
98 0 23 77 31
27 57 52 99 3
86 95 7 54 84
50 33 48 16 9
82 32 38 6 34
43 80 27 37 11
89 70 41 22 45
24 3 47 68 35
85 76 8 29 4
2 10 5 28 73
92 89 50 25 56
99 57 79 19 37
0 46 72 5 20
62 28 24 53 44
84 25 63 34 9
75 1 65 59 10
95 29 97 77 45
87 90 1 17 67
57 73 35 10 30
65 14 46 60 6
70 66 56 69 92
3 27 21 64 88
20 58 53 29 66
27 6 67 89 33
88 60 79 69 97
90 3 47 68 25
48 59 42 98 39
65 90 45 97 87
75 98 7 58 42
51 4 95 88 47
94 6 11 53 63
49 80 2 48 68
3 77 42 97 82
70 58 81 18 47
78 96 62 39 56
22 87 71 31 94
34 48 57 38 88
70 36 65 33 45
71 0 59 44 1
42 37 7 5 9
11 12 91 43 27
60 21 57 61 99
76 75 56 49 2
36 57 39 64 77
95 19 35 43 97
82 34 50 44 55
45 74 15 66 29
0 75 1 78 79
13 37 48 27 14
90 50 26 92 67
89 62 87 69 33
29 47 4 2 12
74 42 24 86 61
92 66 3 65 75
7 1 77 63 64
39 91 87 28 5
30 35 41 73 96
0 81 41 15 66
62 19 86 31 40
23 94 98 82 24
61 99 1 5 60
80 64 91 33 47
16 61 56 77 57
28 59 71 45 92
53 20 35 66 73
99 3 86 31 74
94 69 84 96 90
71 56 23 76 42
90 44 58 27 15
46 18 86 63 24
69 49 82 38 43
33 51 60 66 39
75 78 38 25 76
67 3 83 90 10
40 89 47 23 88
34 21 46 16 33
9 79 50 0 26
81 75 80 23 41
62 4 76 1 63
56 39 57 28 61
20 6 79 92 84
88 3 90 16 12
87 78 3 34 63
98 21 24 9 99
62 29 57 65 27
47 52 67 76 71
11 17 93 23 82
53 68 70 38 56
62 54 25 43 35
9 3 13 15 75
59 27 26 33 83
93 40 11 64 76
27 83 26 48 77
51 20 65 18 35
80 30 60 44 89
84 82 62 91 63
12 97 11 19 34
31 28 92 48 34
9 93 61 71 60
52 18 97 81 62
80 64 57 22 30
11 88 74 29 56
57 34 90 46 73
31 0 70 66 82
45 12 40 19 87
91 24 59 83 14
80 21 13 86 89
9 8 64 48 30
6 62 28 99 41
79 45 83 7 55
15 14 54 88 12
90 74 97 96 50
50 73 58 26 12
96 98 56 34 7
51 92 14 89 16
41 70 80 55 13
37 47 2 64 99
98 9 70 17 18
39 15 88 16 47
80 41 8 51 21
54 42 31 10 59
37 92 33 62 68
60 72 51 63 29
83 39 41 24 14
34 5 94 90 56
75 80 67 17 20
47 11 58 93 42
97 7 27 42 67
12 30 91 45 52
62 50 87 92 71
99 84 33 6 46
29 55 86 47 60
25 49 55 98 22
66 9 61 59 90
45 74 77 88 5
6 76 0 36 93
23 70 33 95 2
53 92 27 86 55
66 52 26 58 38
2 78 69 62 65
30 5 1 25 99
76 43 4 13 8
18 72 51 48 39
62 19 28 44 82
54 22 38 55 83
86 93 42 9 32
11 89 27 34 68
85 99 35 88 76
10 25 33 83 70
54 81 77 73 66
4 74 96 41 86
49 3 68 65 39
71 0 70 14 31
28 23 17 43 75
13 40 38 87 97
63 93 92 89 27
58 76 24 53 54
55 58 11 38 16
98 86 13 12 8
22 10 77 61 90
37 76 2 62 45
44 30 52 70 82
89 55 12 90 63
40 88 91 22 74
8 0 25 6 79
53 23 87 77 20
11 38 78 43 94
21 14 37 8 16
29 73 67 91 56
5 90 12 92 59
64 1 42 72 94
98 86 18 69 49
79 71 82 1 77
96 39 24 60 81
49 16 12 63 14
0 32 78 37 8
92 33 15 99 65
54 11 40 55 33
58 47 4 83 94
46 96 16 28 5
0 62 95 71 39
93 59 7 75 64
";
void Main()
{
var sLines = Input.Split("\n", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
var lines = sLines.Select(s => Line.Parse(s)).ToList().Dump();
var grid = new int[
lines.Max(l => l.Start.X > l.End.X ? l.Start.X : l.End.X) + 1,
lines.Max(l => l.Start.Y > l.End.Y ? l.Start.Y : l.End.Y) + 1];
foreach (var line in lines.Where(l => l.IsStraight))
{
foreach (var p in line.GetPoints())
{
grid[p.X, p.Y]++;
}
}
grid.Dump();
grid.Cast<int>().Count(g => g > 1).Dump("Intersections");
}
public record Point(int X, int Y);
public record Line(Point Start, Point End)
{
public bool IsHoriz => Start.Y == End.Y;
public bool IsVert => Start.X == End.X;
public bool IsStraight => IsHoriz || IsVert;
public int DeltaX = (End.X - Start.X);
public int DeltaY = (End.Y - Start.Y);
public bool IsVertSlope => Math.Abs(DeltaY) > Math.Abs(DeltaX);
//public IEnumerable<Point> Points => GetPoints();
public IEnumerable<Point> GetPoints()
{
// x = (dx + y) / dy
if (IsVertSlope)
{
for (int y = 0; y < Math.Abs(DeltaY) + 1; y++)
{
yield return new Point(
((DeltaX * y) / Math.Abs(DeltaY)) + Start.X,
(DeltaY >= 0) ? (y + Start.Y) : (Start.Y - y));
}
}
// y = (dy * x) / dx
else
{
for (int x = 0; x < Math.Abs(DeltaX) + 1; x++)
{
yield return new Point(
(DeltaX >= 0) ? (x + Start.X) : (Start.X - x),
((DeltaY * x) / Math.Abs(DeltaX)) + Start.Y);
}
}
}
public static Line Parse(string raw)
{
var sPoints = raw.Split(new string[] { ",", "->" }, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
return new Line(
new Point(int.Parse(sPoints[0]), int.Parse(sPoints[1])),
new Point(int.Parse(sPoints[2]), int.Parse(sPoints[3])));
}
}
string TestInput = @"
0,9 -> 5,9
8,0 -> 0,8
9,4 -> 3,4
2,2 -> 2,1
7,0 -> 7,4
6,4 -> 2,0
0,9 -> 2,9
3,4 -> 1,4
0,0 -> 8,8
5,5 -> 8,2";
string Input = @"
541,808 -> 108,808
982,23 -> 45,960
558,21 -> 558,318
907,877 -> 43,13
532,213 -> 532,801
599,387 -> 870,387
762,208 -> 78,208
739,527 -> 739,907
64,21 -> 64,958
258,267 -> 929,938
22,75 -> 725,778
347,950 -> 347,345
705,906 -> 61,906
53,16 -> 950,913
468,474 -> 475,481
567,602 -> 914,602
570,531 -> 570,530
180,307 -> 180,823
546,374 -> 390,374
750,142 -> 861,31
586,631 -> 905,950
971,680 -> 784,680
428,174 -> 352,174
825,676 -> 228,676
630,617 -> 70,617
156,912 -> 944,124
805,203 -> 25,983
726,808 -> 726,96
986,564 -> 908,642
594,293 -> 594,458
182,126 -> 182,476
979,43 -> 35,987
642,272 -> 642,446
759,690 -> 891,690
951,518 -> 161,518
357,769 -> 336,769
904,297 -> 904,533
326,332 -> 326,316
758,356 -> 654,460
432,425 -> 432,819
31,602 -> 31,421
318,555 -> 898,555
326,220 -> 777,671
708,957 -> 708,273
26,24 -> 974,972
341,172 -> 341,394
33,926 -> 864,95
486,324 -> 486,704
850,82 -> 132,800
62,506 -> 113,506
816,429 -> 816,141
184,17 -> 184,328
40,680 -> 30,670
640,294 -> 127,807
654,512 -> 654,296
722,301 -> 629,301
255,430 -> 811,430
376,385 -> 376,379
227,207 -> 227,947
363,533 -> 757,533
150,616 -> 150,284
943,100 -> 79,964
275,963 -> 275,461
409,768 -> 409,574
516,349 -> 516,656
19,666 -> 847,666
962,358 -> 962,907
781,789 -> 781,870
778,380 -> 501,657
895,29 -> 12,912
12,677 -> 12,761
614,728 -> 690,652
415,786 -> 778,423
683,84 -> 683,574
973,909 -> 75,11
854,791 -> 260,197
965,55 -> 559,55
624,542 -> 235,153
924,57 -> 16,965
540,736 -> 540,65
293,293 -> 929,293
587,176 -> 587,432
389,126 -> 389,590
267,149 -> 92,149
424,596 -> 697,323
412,697 -> 773,697
473,579 -> 310,416
149,175 -> 837,863
848,984 -> 159,295
608,613 -> 292,613
344,970 -> 546,970
589,531 -> 589,74
220,727 -> 220,831
651,240 -> 318,240
717,609 -> 847,479
917,954 -> 327,364
780,102 -> 228,654
201,95 -> 201,921
403,88 -> 403,79
755,76 -> 755,529
654,762 -> 654,97
957,988 -> 44,75
899,43 -> 51,891
855,892 -> 175,212
295,962 -> 613,962
284,800 -> 946,800
494,771 -> 793,472
212,799 -> 212,784
25,829 -> 824,30
277,135 -> 396,135
981,986 -> 187,192
794,88 -> 308,88
425,140 -> 73,140
155,900 -> 155,500
339,768 -> 339,621
720,407 -> 824,303
746,679 -> 746,490
672,632 -> 30,632
74,628 -> 49,628
534,770 -> 249,485
59,802 -> 605,256
481,543 -> 723,301
163,425 -> 947,425
10,782 -> 779,782
185,851 -> 68,968
536,479 -> 536,217
987,472 -> 960,472
802,623 -> 202,23
548,73 -> 548,838
711,678 -> 711,655
91,578 -> 91,162
803,27 -> 31,27
198,524 -> 282,608
45,585 -> 45,973
741,157 -> 317,581
263,843 -> 819,843
240,786 -> 240,272
453,148 -> 657,148
646,74 -> 646,758
367,521 -> 367,185
355,356 -> 503,356
306,780 -> 41,780
783,779 -> 513,779
81,886 -> 81,531
403,592 -> 69,926
575,458 -> 575,709
406,695 -> 406,563
342,690 -> 269,690
712,766 -> 712,693
929,608 -> 929,355
562,750 -> 571,759
353,780 -> 424,780
296,111 -> 944,759
341,28 -> 859,28
415,28 -> 415,153
104,16 -> 966,878
554,780 -> 726,780
749,645 -> 749,466
188,724 -> 933,724
806,185 -> 614,185
244,181 -> 682,181
104,937 -> 367,937
400,116 -> 183,333
749,94 -> 301,542
638,543 -> 811,716
694,727 -> 694,44
46,259 -> 46,721
467,748 -> 620,595
739,543 -> 391,543
734,454 -> 734,101
200,954 -> 200,654
592,358 -> 592,581
758,29 -> 758,401
386,685 -> 519,685
538,294 -> 298,294
82,269 -> 766,269
840,114 -> 332,114
924,542 -> 185,542
936,311 -> 369,878
820,724 -> 590,724
277,689 -> 68,689
76,634 -> 167,634
255,503 -> 144,503
753,915 -> 753,27
288,329 -> 513,554
729,297 -> 447,297
128,533 -> 128,530
252,718 -> 856,114
947,498 -> 312,498
142,917 -> 950,109
815,845 -> 770,845
863,98 -> 332,98
927,694 -> 927,276
682,232 -> 227,687
640,474 -> 840,274
98,37 -> 98,149
203,170 -> 99,170
736,956 -> 736,539
686,384 -> 882,580
976,152 -> 380,748
80,859 -> 80,208
687,252 -> 687,748
819,978 -> 101,260
17,722 -> 17,306
99,96 -> 99,929
713,757 -> 157,201
469,986 -> 469,393
813,210 -> 789,186
360,319 -> 360,43
777,707 -> 606,707
928,413 -> 380,961
566,850 -> 828,850
380,650 -> 717,650
863,889 -> 373,399
521,97 -> 967,97
12,989 -> 975,26
965,974 -> 965,848
639,331 -> 639,948
815,731 -> 235,151
823,369 -> 610,369
22,930 -> 898,54
635,113 -> 635,495
462,123 -> 771,123
445,274 -> 304,133
743,633 -> 43,633
811,267 -> 811,936
745,549 -> 636,549
321,720 -> 511,530
949,138 -> 308,138
563,34 -> 720,191
449,313 -> 966,830
857,308 -> 392,773
244,80 -> 820,80
212,345 -> 327,460
28,941 -> 28,22
122,988 -> 122,50
51,889 -> 880,60
328,161 -> 328,820
703,639 -> 40,639
107,47 -> 839,779
338,260 -> 828,750
947,304 -> 276,975
509,281 -> 281,281
200,42 -> 820,662
728,940 -> 728,897
511,770 -> 376,635
197,99 -> 929,99
699,648 -> 352,301
915,291 -> 256,950
641,586 -> 641,346
337,722 -> 965,722
739,92 -> 739,884
656,676 -> 649,676
369,450 -> 686,450
33,672 -> 409,296
336,979 -> 336,595
95,289 -> 888,289
286,128 -> 985,827
471,300 -> 899,300
824,959 -> 66,201
884,104 -> 166,822
562,681 -> 562,948
987,974 -> 77,64
61,47 -> 61,528
359,647 -> 709,647
34,398 -> 270,398
526,66 -> 257,335
744,545 -> 502,787
805,726 -> 728,803
184,749 -> 184,839
136,148 -> 842,148
538,244 -> 306,476
202,698 -> 958,698
264,519 -> 903,519
367,310 -> 26,310
391,747 -> 307,831
580,945 -> 706,945
199,776 -> 98,776
408,242 -> 408,474
929,706 -> 929,570
351,524 -> 221,524
773,783 -> 274,783
770,790 -> 770,653
572,182 -> 572,574
979,13 -> 29,963
175,454 -> 457,736
170,399 -> 170,202
570,406 -> 97,406
813,37 -> 556,37
80,886 -> 465,501
317,799 -> 876,799
602,399 -> 362,639
891,257 -> 445,257
346,275 -> 297,275
345,136 -> 345,755
252,460 -> 252,731
17,573 -> 729,573
901,838 -> 230,167
754,582 -> 754,970
415,964 -> 415,605
857,758 -> 857,612
319,613 -> 256,613
34,614 -> 34,802
443,118 -> 443,891
335,300 -> 80,45
284,340 -> 552,608
154,31 -> 33,31
440,720 -> 20,720
331,219 -> 311,219
163,83 -> 868,788
775,733 -> 775,284
859,240 -> 859,159
144,249 -> 105,210
710,809 -> 710,910
76,481 -> 76,86
825,603 -> 916,603
404,575 -> 740,575
612,427 -> 612,571
63,765 -> 63,538
979,170 -> 183,966
781,372 -> 911,372
237,732 -> 321,648
457,474 -> 954,971
887,110 -> 551,446
894,962 -> 48,116
276,534 -> 800,534
40,42 -> 950,952
986,941 -> 123,78
348,857 -> 899,857
57,728 -> 57,802
776,536 -> 776,462
683,618 -> 683,443
468,914 -> 750,914
420,129 -> 984,693
254,913 -> 166,913
832,737 -> 832,422
472,724 -> 12,724
483,916 -> 483,226
206,751 -> 206,250
890,901 -> 20,31
156,198 -> 883,925
972,367 -> 67,367
409,196 -> 320,196
59,188 -> 815,188
856,856 -> 856,756
84,871 -> 942,13
475,91 -> 475,784
363,578 -> 363,405
219,976 -> 219,717
243,25 -> 243,173
115,194 -> 462,194
91,960 -> 889,162
20,957 -> 915,62
60,955 -> 250,765
882,707 -> 267,92
122,626 -> 122,202
705,74 -> 147,632
418,122 -> 976,680
500,522 -> 936,522
715,652 -> 82,19
118,872 -> 118,479
918,70 -> 918,811
968,968 -> 347,347
985,479 -> 587,877
749,259 -> 749,841
475,102 -> 200,102
808,976 -> 515,976
761,726 -> 761,358
778,523 -> 729,474
266,251 -> 396,251
46,921 -> 914,921
384,424 -> 804,844
442,359 -> 646,155
929,774 -> 920,783
344,958 -> 344,281
33,173 -> 607,173
40,125 -> 897,982
345,640 -> 432,640
845,170 -> 403,612
763,84 -> 763,885
855,388 -> 123,388
861,858 -> 861,940
449,736 -> 97,384
576,592 -> 906,262
868,817 -> 868,633
14,100 -> 610,696
878,412 -> 416,412
43,427 -> 118,502
250,829 -> 770,829
814,444 -> 814,769
647,857 -> 528,857
648,102 -> 514,102
956,12 -> 887,12
665,957 -> 665,891
760,367 -> 178,949
704,524 -> 815,524
269,88 -> 322,88
414,881 -> 414,788
550,696 -> 550,788
624,367 -> 391,367
133,536 -> 432,835
635,154 -> 169,154
396,149 -> 396,166
796,505 -> 886,505
348,235 -> 530,235
428,851 -> 240,851
535,441 -> 637,441
661,175 -> 782,175
589,780 -> 99,290
771,746 -> 771,239
16,567 -> 821,567
320,572 -> 320,136
200,990 -> 513,990
984,987 -> 11,14
60,712 -> 60,137
629,405 -> 738,405
541,536 -> 541,225
250,579 -> 507,579
825,264 -> 974,264
380,832 -> 262,832
598,695 -> 598,159
716,782 -> 418,782
124,698 -> 713,698
930,83 -> 212,801
389,287 -> 344,287
571,788 -> 106,788
519,498 -> 135,114
281,761 -> 221,761
295,133 -> 295,654
686,960 -> 592,960
984,495 -> 984,913
677,751 -> 677,102
252,326 -> 252,824
921,500 -> 357,500
608,908 -> 608,381
587,878 -> 587,677
392,929 -> 449,929
239,444 -> 822,444
87,897 -> 252,897
865,887 -> 368,887
368,934 -> 368,308
64,950 -> 182,950
747,429 -> 636,540
378,109 -> 378,865
187,266 -> 856,935
159,769 -> 708,769
71,119 -> 892,940
629,825 -> 87,283
900,903 -> 900,656
749,703 -> 812,703
225,421 -> 842,421
15,896 -> 837,74
800,887 -> 58,145
456,798 -> 679,798
434,963 -> 434,166
508,491 -> 976,959
809,540 -> 809,614
624,632 -> 975,983
733,102 -> 195,640
83,691 -> 623,151
140,257 -> 29,257
429,934 -> 429,482
702,91 -> 702,137
986,185 -> 986,386
84,920 -> 448,920
927,779 -> 927,679
903,345 -> 546,345
303,523 -> 303,862
360,877 -> 360,202
544,593 -> 544,802
27,192 -> 27,837
105,24 -> 574,24
955,783 -> 556,384
416,85 -> 416,322
923,139 -> 553,139
527,523 -> 828,523
788,320 -> 949,320
391,652 -> 391,166
754,378 -> 607,378
563,409 -> 563,27
285,169 -> 285,883
16,10 -> 988,982
452,563 -> 452,479
881,800 -> 881,542
564,272 -> 457,272
887,441 -> 887,298
941,837 -> 119,15
606,137 -> 606,152
135,472 -> 135,322
881,775 -> 881,132
566,263 -> 406,103
912,696 -> 912,965
123,554 -> 123,911
735,737 -> 533,939
61,197 -> 534,197
91,856 -> 91,465
624,411 -> 624,247
607,899 -> 607,786
139,408 -> 466,735
89,274 -> 545,730
";
void Main()
{
var sLines = Input.Split("\n", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
var lines = sLines.Select(s => Line.Parse(s)).ToList().Dump();
var grid = new int[
lines.Max(l => l.Start.X > l.End.X ? l.Start.X : l.End.X) + 1,
lines.Max(l => l.Start.Y > l.End.Y ? l.Start.Y : l.End.Y) + 1];
foreach (var line in lines)
{
foreach (var p in line.GetPoints())
{
grid[p.X, p.Y]++;
}
}
grid.Dump();
grid.Cast<int>().Count(g => g > 1).Dump("Intersections");
}
public record Point(int X, int Y);
public record Line(Point Start, Point End)
{
public bool IsHoriz => Start.Y == End.Y;
public bool IsVert => Start.X == End.X;
public bool IsStraight => IsHoriz || IsVert;
public int DeltaX = (End.X - Start.X);
public int DeltaY = (End.Y - Start.Y);
public bool IsVertSlope => Math.Abs(DeltaY) > Math.Abs(DeltaX);
//public IEnumerable<Point> Points => GetPoints();
public IEnumerable<Point> GetPoints()
{
// x = (dx + y) / dy
if (IsVertSlope)
{
for (int y = 0; y < Math.Abs(DeltaY) + 1; y++)
{
yield return new Point(
((DeltaX * y) / Math.Abs(DeltaY)) + Start.X,
(DeltaY >= 0) ? (y + Start.Y) : (Start.Y - y));
}
}
// y = (dy * x) / dx
else
{
for (int x = 0; x < Math.Abs(DeltaX) + 1; x++)
{
yield return new Point(
(DeltaX >= 0) ? (x + Start.X) : (Start.X - x),
((DeltaY * x) / Math.Abs(DeltaX)) + Start.Y);
}
}
}
public static Line Parse(string raw)
{
var sPoints = raw.Split(new string[] { ",", "->" }, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
return new Line(
new Point(int.Parse(sPoints[0]), int.Parse(sPoints[1])),
new Point(int.Parse(sPoints[2]), int.Parse(sPoints[3])));
}
}
string TestInput = @"
0,9 -> 5,9
8,0 -> 0,8
9,4 -> 3,4
2,2 -> 2,1
7,0 -> 7,4
6,4 -> 2,0
0,9 -> 2,9
3,4 -> 1,4
0,0 -> 8,8
5,5 -> 8,2";
string Input = @"
541,808 -> 108,808
982,23 -> 45,960
558,21 -> 558,318
907,877 -> 43,13
532,213 -> 532,801
599,387 -> 870,387
762,208 -> 78,208
739,527 -> 739,907
64,21 -> 64,958
258,267 -> 929,938
22,75 -> 725,778
347,950 -> 347,345
705,906 -> 61,906
53,16 -> 950,913
468,474 -> 475,481
567,602 -> 914,602
570,531 -> 570,530
180,307 -> 180,823
546,374 -> 390,374
750,142 -> 861,31
586,631 -> 905,950
971,680 -> 784,680
428,174 -> 352,174
825,676 -> 228,676
630,617 -> 70,617
156,912 -> 944,124
805,203 -> 25,983
726,808 -> 726,96
986,564 -> 908,642
594,293 -> 594,458
182,126 -> 182,476
979,43 -> 35,987
642,272 -> 642,446
759,690 -> 891,690
951,518 -> 161,518
357,769 -> 336,769
904,297 -> 904,533
326,332 -> 326,316
758,356 -> 654,460
432,425 -> 432,819
31,602 -> 31,421
318,555 -> 898,555
326,220 -> 777,671
708,957 -> 708,273
26,24 -> 974,972
341,172 -> 341,394
33,926 -> 864,95
486,324 -> 486,704
850,82 -> 132,800
62,506 -> 113,506
816,429 -> 816,141
184,17 -> 184,328
40,680 -> 30,670
640,294 -> 127,807
654,512 -> 654,296
722,301 -> 629,301
255,430 -> 811,430
376,385 -> 376,379
227,207 -> 227,947
363,533 -> 757,533
150,616 -> 150,284
943,100 -> 79,964
275,963 -> 275,461
409,768 -> 409,574
516,349 -> 516,656
19,666 -> 847,666
962,358 -> 962,907
781,789 -> 781,870
778,380 -> 501,657
895,29 -> 12,912
12,677 -> 12,761
614,728 -> 690,652
415,786 -> 778,423
683,84 -> 683,574
973,909 -> 75,11
854,791 -> 260,197
965,55 -> 559,55
624,542 -> 235,153
924,57 -> 16,965
540,736 -> 540,65
293,293 -> 929,293
587,176 -> 587,432
389,126 -> 389,590
267,149 -> 92,149
424,596 -> 697,323
412,697 -> 773,697
473,579 -> 310,416
149,175 -> 837,863
848,984 -> 159,295
608,613 -> 292,613
344,970 -> 546,970
589,531 -> 589,74
220,727 -> 220,831
651,240 -> 318,240
717,609 -> 847,479
917,954 -> 327,364
780,102 -> 228,654
201,95 -> 201,921
403,88 -> 403,79
755,76 -> 755,529
654,762 -> 654,97
957,988 -> 44,75
899,43 -> 51,891
855,892 -> 175,212
295,962 -> 613,962
284,800 -> 946,800
494,771 -> 793,472
212,799 -> 212,784
25,829 -> 824,30
277,135 -> 396,135
981,986 -> 187,192
794,88 -> 308,88
425,140 -> 73,140
155,900 -> 155,500
339,768 -> 339,621
720,407 -> 824,303
746,679 -> 746,490
672,632 -> 30,632
74,628 -> 49,628
534,770 -> 249,485
59,802 -> 605,256
481,543 -> 723,301
163,425 -> 947,425
10,782 -> 779,782
185,851 -> 68,968
536,479 -> 536,217
987,472 -> 960,472
802,623 -> 202,23
548,73 -> 548,838
711,678 -> 711,655
91,578 -> 91,162
803,27 -> 31,27
198,524 -> 282,608
45,585 -> 45,973
741,157 -> 317,581
263,843 -> 819,843
240,786 -> 240,272
453,148 -> 657,148
646,74 -> 646,758
367,521 -> 367,185
355,356 -> 503,356
306,780 -> 41,780
783,779 -> 513,779
81,886 -> 81,531
403,592 -> 69,926
575,458 -> 575,709
406,695 -> 406,563
342,690 -> 269,690
712,766 -> 712,693
929,608 -> 929,355
562,750 -> 571,759
353,780 -> 424,780
296,111 -> 944,759
341,28 -> 859,28
415,28 -> 415,153
104,16 -> 966,878
554,780 -> 726,780
749,645 -> 749,466
188,724 -> 933,724
806,185 -> 614,185
244,181 -> 682,181
104,937 -> 367,937
400,116 -> 183,333
749,94 -> 301,542
638,543 -> 811,716
694,727 -> 694,44
46,259 -> 46,721
467,748 -> 620,595
739,543 -> 391,543
734,454 -> 734,101
200,954 -> 200,654
592,358 -> 592,581
758,29 -> 758,401
386,685 -> 519,685
538,294 -> 298,294
82,269 -> 766,269
840,114 -> 332,114
924,542 -> 185,542
936,311 -> 369,878
820,724 -> 590,724
277,689 -> 68,689
76,634 -> 167,634
255,503 -> 144,503
753,915 -> 753,27
288,329 -> 513,554
729,297 -> 447,297
128,533 -> 128,530
252,718 -> 856,114
947,498 -> 312,498
142,917 -> 950,109
815,845 -> 770,845
863,98 -> 332,98
927,694 -> 927,276
682,232 -> 227,687
640,474 -> 840,274
98,37 -> 98,149
203,170 -> 99,170
736,956 -> 736,539
686,384 -> 882,580
976,152 -> 380,748
80,859 -> 80,208
687,252 -> 687,748
819,978 -> 101,260
17,722 -> 17,306
99,96 -> 99,929
713,757 -> 157,201
469,986 -> 469,393
813,210 -> 789,186
360,319 -> 360,43
777,707 -> 606,707
928,413 -> 380,961
566,850 -> 828,850
380,650 -> 717,650
863,889 -> 373,399
521,97 -> 967,97
12,989 -> 975,26
965,974 -> 965,848
639,331 -> 639,948
815,731 -> 235,151
823,369 -> 610,369
22,930 -> 898,54
635,113 -> 635,495
462,123 -> 771,123
445,274 -> 304,133
743,633 -> 43,633
811,267 -> 811,936
745,549 -> 636,549
321,720 -> 511,530
949,138 -> 308,138
563,34 -> 720,191
449,313 -> 966,830
857,308 -> 392,773
244,80 -> 820,80
212,345 -> 327,460
28,941 -> 28,22
122,988 -> 122,50
51,889 -> 880,60
328,161 -> 328,820
703,639 -> 40,639
107,47 -> 839,779
338,260 -> 828,750
947,304 -> 276,975
509,281 -> 281,281
200,42 -> 820,662
728,940 -> 728,897
511,770 -> 376,635
197,99 -> 929,99
699,648 -> 352,301
915,291 -> 256,950
641,586 -> 641,346
337,722 -> 965,722
739,92 -> 739,884
656,676 -> 649,676
369,450 -> 686,450
33,672 -> 409,296
336,979 -> 336,595
95,289 -> 888,289
286,128 -> 985,827
471,300 -> 899,300
824,959 -> 66,201
884,104 -> 166,822
562,681 -> 562,948
987,974 -> 77,64
61,47 -> 61,528
359,647 -> 709,647
34,398 -> 270,398
526,66 -> 257,335
744,545 -> 502,787
805,726 -> 728,803
184,749 -> 184,839
136,148 -> 842,148
538,244 -> 306,476
202,698 -> 958,698
264,519 -> 903,519
367,310 -> 26,310
391,747 -> 307,831
580,945 -> 706,945
199,776 -> 98,776
408,242 -> 408,474
929,706 -> 929,570
351,524 -> 221,524
773,783 -> 274,783
770,790 -> 770,653
572,182 -> 572,574
979,13 -> 29,963
175,454 -> 457,736
170,399 -> 170,202
570,406 -> 97,406
813,37 -> 556,37
80,886 -> 465,501
317,799 -> 876,799
602,399 -> 362,639
891,257 -> 445,257
346,275 -> 297,275
345,136 -> 345,755
252,460 -> 252,731
17,573 -> 729,573
901,838 -> 230,167
754,582 -> 754,970
415,964 -> 415,605
857,758 -> 857,612
319,613 -> 256,613
34,614 -> 34,802
443,118 -> 443,891
335,300 -> 80,45
284,340 -> 552,608
154,31 -> 33,31
440,720 -> 20,720
331,219 -> 311,219
163,83 -> 868,788
775,733 -> 775,284
859,240 -> 859,159
144,249 -> 105,210
710,809 -> 710,910
76,481 -> 76,86
825,603 -> 916,603
404,575 -> 740,575
612,427 -> 612,571
63,765 -> 63,538
979,170 -> 183,966
781,372 -> 911,372
237,732 -> 321,648
457,474 -> 954,971
887,110 -> 551,446
894,962 -> 48,116
276,534 -> 800,534
40,42 -> 950,952
986,941 -> 123,78
348,857 -> 899,857
57,728 -> 57,802
776,536 -> 776,462
683,618 -> 683,443
468,914 -> 750,914
420,129 -> 984,693
254,913 -> 166,913
832,737 -> 832,422
472,724 -> 12,724
483,916 -> 483,226
206,751 -> 206,250
890,901 -> 20,31
156,198 -> 883,925
972,367 -> 67,367
409,196 -> 320,196
59,188 -> 815,188
856,856 -> 856,756
84,871 -> 942,13
475,91 -> 475,784
363,578 -> 363,405
219,976 -> 219,717
243,25 -> 243,173
115,194 -> 462,194
91,960 -> 889,162
20,957 -> 915,62
60,955 -> 250,765
882,707 -> 267,92
122,626 -> 122,202
705,74 -> 147,632
418,122 -> 976,680
500,522 -> 936,522
715,652 -> 82,19
118,872 -> 118,479
918,70 -> 918,811
968,968 -> 347,347
985,479 -> 587,877
749,259 -> 749,841
475,102 -> 200,102
808,976 -> 515,976
761,726 -> 761,358
778,523 -> 729,474
266,251 -> 396,251
46,921 -> 914,921
384,424 -> 804,844
442,359 -> 646,155
929,774 -> 920,783
344,958 -> 344,281
33,173 -> 607,173
40,125 -> 897,982
345,640 -> 432,640
845,170 -> 403,612
763,84 -> 763,885
855,388 -> 123,388
861,858 -> 861,940
449,736 -> 97,384
576,592 -> 906,262
868,817 -> 868,633
14,100 -> 610,696
878,412 -> 416,412
43,427 -> 118,502
250,829 -> 770,829
814,444 -> 814,769
647,857 -> 528,857
648,102 -> 514,102
956,12 -> 887,12
665,957 -> 665,891
760,367 -> 178,949
704,524 -> 815,524
269,88 -> 322,88
414,881 -> 414,788
550,696 -> 550,788
624,367 -> 391,367
133,536 -> 432,835
635,154 -> 169,154
396,149 -> 396,166
796,505 -> 886,505
348,235 -> 530,235
428,851 -> 240,851
535,441 -> 637,441
661,175 -> 782,175
589,780 -> 99,290
771,746 -> 771,239
16,567 -> 821,567
320,572 -> 320,136
200,990 -> 513,990
984,987 -> 11,14
60,712 -> 60,137
629,405 -> 738,405
541,536 -> 541,225
250,579 -> 507,579
825,264 -> 974,264
380,832 -> 262,832
598,695 -> 598,159
716,782 -> 418,782
124,698 -> 713,698
930,83 -> 212,801
389,287 -> 344,287
571,788 -> 106,788
519,498 -> 135,114
281,761 -> 221,761
295,133 -> 295,654
686,960 -> 592,960
984,495 -> 984,913
677,751 -> 677,102
252,326 -> 252,824
921,500 -> 357,500
608,908 -> 608,381
587,878 -> 587,677
392,929 -> 449,929
239,444 -> 822,444
87,897 -> 252,897
865,887 -> 368,887
368,934 -> 368,308
64,950 -> 182,950
747,429 -> 636,540
378,109 -> 378,865
187,266 -> 856,935
159,769 -> 708,769
71,119 -> 892,940
629,825 -> 87,283
900,903 -> 900,656
749,703 -> 812,703
225,421 -> 842,421
15,896 -> 837,74
800,887 -> 58,145
456,798 -> 679,798
434,963 -> 434,166
508,491 -> 976,959
809,540 -> 809,614
624,632 -> 975,983
733,102 -> 195,640
83,691 -> 623,151
140,257 -> 29,257
429,934 -> 429,482
702,91 -> 702,137
986,185 -> 986,386
84,920 -> 448,920
927,779 -> 927,679
903,345 -> 546,345
303,523 -> 303,862
360,877 -> 360,202
544,593 -> 544,802
27,192 -> 27,837
105,24 -> 574,24
955,783 -> 556,384
416,85 -> 416,322
923,139 -> 553,139
527,523 -> 828,523
788,320 -> 949,320
391,652 -> 391,166
754,378 -> 607,378
563,409 -> 563,27
285,169 -> 285,883
16,10 -> 988,982
452,563 -> 452,479
881,800 -> 881,542
564,272 -> 457,272
887,441 -> 887,298
941,837 -> 119,15
606,137 -> 606,152
135,472 -> 135,322
881,775 -> 881,132
566,263 -> 406,103
912,696 -> 912,965
123,554 -> 123,911
735,737 -> 533,939
61,197 -> 534,197
91,856 -> 91,465
624,411 -> 624,247
607,899 -> 607,786
139,408 -> 466,735
89,274 -> 545,730
";
void Main()
{
var sAges = Input.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
var ages = sAges.Select(a => int.Parse(a)).ToList();
var fishes = new List<Lanternfish>();
fishes.AddRange(ages.Select(a => new Lanternfish(a)));
for (int days = 80; days > 0; days--)
{
var newFishes = TickAll(fishes).ToList();
fishes.AddRange(newFishes);
}
fishes.Dump();
}
public IEnumerable<Lanternfish> TickAll(IEnumerable<Lanternfish> source)
{
foreach (var fish in source)
{
if (fish.Tick() is Lanternfish newFish)
{
yield return newFish;
}
else
{
continue;
}
}
}
public record Lanternfish
{
public Lanternfish(int age) => Age = age;
public int Age { get; private set; }
public Lanternfish Tick()
{
Age--;
if (Age < 0)
{
Age = 6;
return new Lanternfish(8);
}
else
{
return null;
}
}
}
string TestInput = @"3,4,3,1,2";
string Input = @"1,1,1,2,1,1,2,1,1,1,5,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,4,1,1,1,1,3,1,1,3,1,1,1,4,1,5,1,3,1,1,1,1,1,5,1,1,1,1,1,5,5,2,5,1,1,2,1,1,1,1,3,4,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,5,4,1,1,1,1,1,5,1,2,4,1,1,1,1,1,3,3,2,1,1,4,1,1,5,5,1,1,1,1,1,2,5,1,4,1,1,1,1,1,1,2,1,1,5,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,3,1,1,3,1,3,1,4,1,5,4,1,1,2,1,1,5,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,4,1,1,4,1,1,1,1,1,1,1,5,4,1,2,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,4,1,1,1,2,1,4,1,1,1,1,1,1,1,1,1,4,2,1,2,1,1,4,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,3,2,1,4,1,5,1,1,1,4,5,1,1,1,1,1,1,5,1,1,5,1,2,1,1,2,4,1,1,2,1,5,5,3";
void Main()
{
var sAges = Input.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
var ages = sAges.Select(a => int.Parse(a)).ToList();
ulong[] fishAges = new ulong[9];
foreach (var group in ages.GroupBy(a => a))
{
fishAges[group.Key] = (ulong)group.Count();
}
for (int days = 256; days > 0; days--)
{
ulong newFish = fishAges[0];
for (int i = 1; i < 9; i++)
{
fishAges[i - 1] = fishAges[i];
}
fishAges[6] += newFish;
fishAges[8] = newFish;
}
fishAges.Dump();
fishAges.Aggregate(0ul, (acc, next) => acc + next).Dump();
}
string TestInput = @"3,4,3,1,2";
string Input = @"1,1,1,2,1,1,2,1,1,1,5,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,4,1,1,1,1,3,1,1,3,1,1,1,4,1,5,1,3,1,1,1,1,1,5,1,1,1,1,1,5,5,2,5,1,1,2,1,1,1,1,3,4,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,5,4,1,1,1,1,1,5,1,2,4,1,1,1,1,1,3,3,2,1,1,4,1,1,5,5,1,1,1,1,1,2,5,1,4,1,1,1,1,1,1,2,1,1,5,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,3,1,1,3,1,3,1,4,1,5,4,1,1,2,1,1,5,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,4,1,1,4,1,1,1,1,1,1,1,5,4,1,2,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,4,1,1,1,2,1,4,1,1,1,1,1,1,1,1,1,4,2,1,2,1,1,4,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,3,2,1,4,1,5,1,1,1,4,5,1,1,1,1,1,1,5,1,1,5,1,2,1,1,2,4,1,1,2,1,5,5,3";
void Main()
{
var sPos = Input.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
var pos = sPos.Select(s => int.Parse(s)).ToList();
//pos.Dump();
var avg = pos.Average().Dump("Average");
var stdev = Math.Sqrt(pos.Sum(p => Math.Pow((p - avg), 2)) / pos.Count).Dump("StDev");
//var outliers = pos.Where(p => !((avg + stdev) > p && (avg - stdev) < p));//.Dump("Outliers");
//var avg2 = pos.Except(outliers).Average().Dump("Average excluding outliers");
int direction = 1;
int dest = (int)avg;
int a = pos.Select(p => Math.Abs(p - dest + 1)).Sum().Dump("Pos test");
int b = pos.Select(p => Math.Abs(p - dest)).Sum().Dump("Avg test");
int c = pos.Select(p => Math.Abs(p - dest - 1)).Sum().Dump("Neg test");
int prev;
if (a < b)
{
prev = a;
direction = 1;
}
else if (c > b)
{
prev = b;
direction = -1;
}
else
{
b.Dump("Minimum");
return;
}
for (int i = 0 + direction; ; i += direction)
{
int current = pos.Select(p => Math.Abs(p - dest + i)).Sum().Dump();
if (current > prev)
{
prev.Dump("Minimum");
return;
}
else
{
prev = current;
}
}
}
string TestInput = @"16,1,2,0,4,2,7,1,2,14";
string Input = @"1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,52,1088,462,1398,576,241,636,512,28,390,168,262,6,489,1152,466,539,133,159,1481,128,198,858,57,12,1155,400,137,557,1370,440,885,1433,360,387,5,173,397,465,426,365,470,456,45,1052,1116,26,17,585,647,357,786,313,1124,346,694,941,124,825,243,852,76,618,436,596,14,958,969,895,1745,246,822,239,952,928,206,406,190,459,841,25,1087,299,962,15,1539,1003,456,51,546,858,137,1214,110,936,975,1164,51,82,947,1354,312,132,261,181,287,107,1411,332,930,60,1458,22,248,175,3,946,1097,35,231,648,109,313,1061,163,1382,80,912,89,718,1068,419,703,155,321,909,9,212,478,315,118,206,38,125,130,1391,229,8,44,571,432,24,283,0,941,422,251,686,578,154,123,489,86,1217,129,227,638,47,187,946,2,536,227,640,1170,1444,286,1280,83,1253,1735,70,52,104,658,367,302,462,394,13,798,514,104,260,479,526,632,1161,1118,320,196,262,571,1319,594,131,797,37,566,1054,271,159,1021,244,204,447,624,825,723,364,234,105,362,305,391,681,692,89,380,104,1217,814,1467,898,207,1345,94,10,1380,50,1192,178,1539,1712,145,390,9,878,144,1241,395,10,41,80,1719,1077,113,46,1699,130,91,723,359,1617,1065,530,1058,903,163,412,45,858,10,1704,141,451,1314,879,13,857,905,87,830,1228,25,1594,153,4,585,46,862,265,833,301,473,458,85,254,22,266,543,32,939,1113,228,544,205,1617,1109,445,86,5,278,16,784,303,1022,1014,162,714,447,656,834,138,448,30,85,371,951,1256,842,5,460,919,1019,785,1275,616,1593,168,1727,311,950,1299,1131,796,522,443,703,836,47,300,449,11,360,682,487,108,1396,623,1108,239,379,0,822,109,60,98,667,242,1398,650,25,376,168,46,259,138,254,1631,953,776,166,0,628,75,413,1401,69,462,883,877,96,314,825,346,932,352,1086,143,507,134,557,31,1663,565,275,207,330,702,53,1085,259,14,26,851,1571,1829,1513,356,70,1393,426,345,412,129,908,959,896,1578,617,428,222,1256,3,863,237,5,357,92,292,514,4,919,5,848,1605,149,959,376,1709,410,460,646,389,13,1388,294,1151,652,10,113,769,1519,57,685,1132,1,417,1369,1396,248,496,145,64,798,719,716,845,168,1,147,347,239,512,19,478,336,20,327,487,141,37,96,331,826,1347,479,182,601,233,564,196,0,811,19,318,86,1442,468,396,298,46,661,339,914,54,560,91,284,829,1710,478,318,780,738,807,1017,166,48,358,193,466,831,138,226,5,24,251,119,644,545,588,170,890,248,596,310,612,479,366,1374,465,32,467,79,603,220,1138,168,968,420,129,90,214,652,408,169,0,173,19,312,65,38,115,325,158,1458,744,1529,361,360,77,75,130,111,175,34,676,169,384,473,296,701,84,11,1862,223,193,118,678,403,1097,2,1318,190,590,96,47,69,212,520,786,1569,703,1776,140,12,741,906,29,115,30,196,821,23,51,540,225,891,133,907,567,143,44,371,1038,237,0,222,1327,760,854,1,29,14,65,98,25,233,423,63,382,648,257,160,71,1287,315,627,40,159,202,112,657,87,94,93,362,23,501,870,1114,946,1007,453,159,493,590,665,28,435,7,1238,1846,758,174,258,972,557,1431,482,429,57,389,651,1089,1490,821,844,458,712,259,433,418,344,466,60,123,1604,897,1346,198,143,259,49,770,1703,900,1364,450,498,30,543,322,3,533,508,444,148,927,72,321,733,689,24,44,685,1021,324,182,1737,975,387,143,176,478,602,752,203,130,169,165,41,119,35,175,763,1147,5,137,10,357,54,1209,182,298,156,1488,176,86,548,2,37,36,76,100,1369,1174,322,32,573,107,375,1210,51,597,902,878,919,379,125,26,1240,7,7,131,913,994,1097,576,112,694,805,551,512,663,361,747,161,691,63,119,47,89,6,258,57,537,654,757,1202,922,475,347,193,79,1177,443,33,1257,1070,118,810,117,37,226,230,552,618,341,530,681,1015,358,846,276,1149,210,525,1144,272,30,551,55,512,229,90,1144,389,500,372,92,58,598,1362,475,70,748,1217,442,28,334,369,768,169,405,1058,759,1087,268,714,81,594,1423,1004,694,61,1032,895,1321,95,1512,646,818,845,1275,294,883,1684,1062,2,851,304,306,128,1523,1594,190,73,809,175,321,407,424,109,48,234,437,968,284,1069,181,340,149,9,163,863,17,584,421,79,164,913,81";
void Main()
{
var sPos = Input.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
var pos = sPos.Select(s => int.Parse(s)).ToList();
//pos.Dump();
var avg = pos.Average().Dump("Average");
var stdev = Math.Sqrt(pos.Sum(p => Math.Pow((p - avg), 2)) / pos.Count).Dump("StDev");
//var outliers = pos.Where(p => !((avg + stdev) > p && (avg - stdev) < p));//.Dump("Outliers");
//var avg2 = pos.Except(outliers).Average().Dump("Average excluding outliers");
int direction = 1;
int dest = (int)avg;
int Fx(int d) => Enumerable.Range(1, d).Sum();
int Fy(int p, int d, int i)
{
int a = Math.Abs(p - d + i);
return Fx(a);
}
//Fx(16-5).Dump();
//Fx(5-1).Dump();
//Fy(1,5,0).Dump();
//int a = pos.Select(p => Math.Abs(p - dest + 1)).Sum().Dump("Pos test");
//int b = pos.Select(p => Math.Abs(p - dest)).Sum().Dump("Avg test");
//int c = pos.Select(p => Math.Abs(p - dest - 1)).Sum().Dump("Neg test");
int a = pos.Select(p => Fy(p, dest, 1)).Sum().Dump("Pos test");
int b = pos.Select(p => Fy(p, dest, 0)).Sum().Dump("Avg test");
int c = pos.Select(p => Fy(p, dest, -1)).Sum().Dump("Neg test");
int prev;
if (a < b)
{
prev = a;
direction = 1;
}
else if (c < b)
{
prev = b;
direction = -1;
}
else
{
b.Dump("Minimum");
return;
}
direction.Dump("Direction");
for (int i = 0 + direction; ; i += direction)
{
int current = pos.Select(p => Fy(p, dest, i) /*Math.Abs(p - dest + i)*/).Sum().Dump();
if (current > prev)
{
prev.Dump("Minimum");
return;
}
else
{
prev = current;
}
}
}
string TestInput = @"16,1,2,0,4,2,7,1,2,14";
string Input = @"1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,52,1088,462,1398,576,241,636,512,28,390,168,262,6,489,1152,466,539,133,159,1481,128,198,858,57,12,1155,400,137,557,1370,440,885,1433,360,387,5,173,397,465,426,365,470,456,45,1052,1116,26,17,585,647,357,786,313,1124,346,694,941,124,825,243,852,76,618,436,596,14,958,969,895,1745,246,822,239,952,928,206,406,190,459,841,25,1087,299,962,15,1539,1003,456,51,546,858,137,1214,110,936,975,1164,51,82,947,1354,312,132,261,181,287,107,1411,332,930,60,1458,22,248,175,3,946,1097,35,231,648,109,313,1061,163,1382,80,912,89,718,1068,419,703,155,321,909,9,212,478,315,118,206,38,125,130,1391,229,8,44,571,432,24,283,0,941,422,251,686,578,154,123,489,86,1217,129,227,638,47,187,946,2,536,227,640,1170,1444,286,1280,83,1253,1735,70,52,104,658,367,302,462,394,13,798,514,104,260,479,526,632,1161,1118,320,196,262,571,1319,594,131,797,37,566,1054,271,159,1021,244,204,447,624,825,723,364,234,105,362,305,391,681,692,89,380,104,1217,814,1467,898,207,1345,94,10,1380,50,1192,178,1539,1712,145,390,9,878,144,1241,395,10,41,80,1719,1077,113,46,1699,130,91,723,359,1617,1065,530,1058,903,163,412,45,858,10,1704,141,451,1314,879,13,857,905,87,830,1228,25,1594,153,4,585,46,862,265,833,301,473,458,85,254,22,266,543,32,939,1113,228,544,205,1617,1109,445,86,5,278,16,784,303,1022,1014,162,714,447,656,834,138,448,30,85,371,951,1256,842,5,460,919,1019,785,1275,616,1593,168,1727,311,950,1299,1131,796,522,443,703,836,47,300,449,11,360,682,487,108,1396,623,1108,239,379,0,822,109,60,98,667,242,1398,650,25,376,168,46,259,138,254,1631,953,776,166,0,628,75,413,1401,69,462,883,877,96,314,825,346,932,352,1086,143,507,134,557,31,1663,565,275,207,330,702,53,1085,259,14,26,851,1571,1829,1513,356,70,1393,426,345,412,129,908,959,896,1578,617,428,222,1256,3,863,237,5,357,92,292,514,4,919,5,848,1605,149,959,376,1709,410,460,646,389,13,1388,294,1151,652,10,113,769,1519,57,685,1132,1,417,1369,1396,248,496,145,64,798,719,716,845,168,1,147,347,239,512,19,478,336,20,327,487,141,37,96,331,826,1347,479,182,601,233,564,196,0,811,19,318,86,1442,468,396,298,46,661,339,914,54,560,91,284,829,1710,478,318,780,738,807,1017,166,48,358,193,466,831,138,226,5,24,251,119,644,545,588,170,890,248,596,310,612,479,366,1374,465,32,467,79,603,220,1138,168,968,420,129,90,214,652,408,169,0,173,19,312,65,38,115,325,158,1458,744,1529,361,360,77,75,130,111,175,34,676,169,384,473,296,701,84,11,1862,223,193,118,678,403,1097,2,1318,190,590,96,47,69,212,520,786,1569,703,1776,140,12,741,906,29,115,30,196,821,23,51,540,225,891,133,907,567,143,44,371,1038,237,0,222,1327,760,854,1,29,14,65,98,25,233,423,63,382,648,257,160,71,1287,315,627,40,159,202,112,657,87,94,93,362,23,501,870,1114,946,1007,453,159,493,590,665,28,435,7,1238,1846,758,174,258,972,557,1431,482,429,57,389,651,1089,1490,821,844,458,712,259,433,418,344,466,60,123,1604,897,1346,198,143,259,49,770,1703,900,1364,450,498,30,543,322,3,533,508,444,148,927,72,321,733,689,24,44,685,1021,324,182,1737,975,387,143,176,478,602,752,203,130,169,165,41,119,35,175,763,1147,5,137,10,357,54,1209,182,298,156,1488,176,86,548,2,37,36,76,100,1369,1174,322,32,573,107,375,1210,51,597,902,878,919,379,125,26,1240,7,7,131,913,994,1097,576,112,694,805,551,512,663,361,747,161,691,63,119,47,89,6,258,57,537,654,757,1202,922,475,347,193,79,1177,443,33,1257,1070,118,810,117,37,226,230,552,618,341,530,681,1015,358,846,276,1149,210,525,1144,272,30,551,55,512,229,90,1144,389,500,372,92,58,598,1362,475,70,748,1217,442,28,334,369,768,169,405,1058,759,1087,268,714,81,594,1423,1004,694,61,1032,895,1321,95,1512,646,818,845,1275,294,883,1684,1062,2,851,304,306,128,1523,1594,190,73,809,175,321,407,424,109,48,234,437,968,284,1069,181,340,149,9,163,863,17,584,421,79,164,913,81";
void Main()
{
var sLines = Input.Split("\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
var sEntries = sLines.Select(l =>
{
var split = l.Split('|', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
return (sIn: split[0].Split(' '), sOut: split[1].Split(' '));
})
.ToList();
sEntries.Dump();
//var segments = new Dictionary<int, int>
//{
// [0] = 6,
// [1] = 2,
// [2] = 5,
// [3] = 5,
// [4] = 4,
// [5] = 5,
// [6] = 6,
// [7] = 3,
// [8] = 7,
// [9] = 6
//};
sEntries.SelectMany(e => e.sOut.Select(o => o.Count())).Count(c => c is 2 or 4 or 3 or 7).Dump();
}
string TestInput = @"
be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe
edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc
fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg
fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb
aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea
fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb
dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe
bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef
egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb
gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce";
string Input = @"
abdfce bedag acdefgb cg febcga fbdac fcdg cabdg bcg bgacdf | fdcab adbcf gcb acdebf
bgeacdf dgebca gbc fbgd fceba fecdg bcgef cfgbde gb fegacd | dbfg abecf dfgb gaecdf
dfega bedag af agf fdagcb cbaedgf feac dfecg dcegfa gcfdbe | fag edcgf fga bfgcad
ca afc bdafe bgface afdebc dcab cgedf fcaed cdebfga fabged | fcdea abdc fdcbea fdbcega
gabde beacg cgafe gcfeab gebdcf fedagc edfgcba bc acfb bcg | fagedc bgc bgace cbg
df cfd geabfc ebgadcf dfae dcgfe decgb agdcfb aecdfg cgfae | fd fd ecfgd gfbcea
fcebdga cf faebgd fecgbd bcdfg egbdf cgadfe bgadc gcf cefb | fcg gfc fgc dfcega
abedcg afdcgb ae fcgad fbcge gea dfae deafgc efgca cagebfd | gea fgcbade ea ega
dc egcbf dgbce abdge acdg dbfeac dbeagf gecfbda dec cgdabe | agebcdf cadg agbfed cd
bag ecgfb beagf ga edbaf aegc bfgdac bedcgfa gabcfe fdebgc | debacfg bga degcfb bacgfde
gebcfa efbcgda fbgdae egcdb aecbg dfegac eagbf fbca ac aec | gaebdf cabf aegbdf fegba
bedg abcdg dcagef gd cfgba fdaebc cdg badgec bcaed egcadbf | gabced gd bcdag ebgd
gbdfca agedfc acedg fcgeb dbacfeg ab cba cbadeg daeb gbace | adbfgc ecfdbga ebfcg ab
bfdag cbegafd dfabeg bge ge bdcae gabfdc faeg gefdbc gdeba | dbega dgecbfa adbce fecbadg
edbf efcabg edfbgc gdcbf ecgdf egdacf cbf bf cbegfda gadcb | dfbe gfdbc fcb bf
gcefa egdb gcfeb fdgbace dfbcg be bgfdca caedfb bec cbfgde | bec dgeb ceagf egfcbda
eabcd ceagfb bdgcea cgdeb bgcfde gadc fabde abc ac dfgebca | agfcbe bcadge abc cab
agfedc edabfcg bf fgcdab ecabd dfb dfagc afbegd cbfg cfabd | fbcg cfadg geafbd deabc
afdeg ce eafbcdg bgcfa fedagb dcgbfe aedc gcaedf fcage cge | dfcbgae ec fecga caed
bec cbgedf fagbcd abdec agbed feacdb fdcab acfe dgbcafe ce | cgfbad abdge bec badcfe
begac ade egcadb dfceagb acdg degfb eafcbg da bedacf dageb | debga faedcb acgeb fgdeb
ecdga gfab adcgb cgdebaf edcbfa ab bfcdg fcegdb acbdfg bda | dcaeg egdfabc dagbfc dgabcf
agb cbgea bafcdg edbgfca egacfd edbac gacef bg gefb fbaecg | aegcbf decfga gb aecgf
bfdec fegacd cfdbeag dba fadcb bdfgae cagdfb ab acbg dcgfa | efcdag cabg geadbf ab
dfegcab cba facdbe agdcf egadb aebdgf cb cbdga gceb bedacg | bac cgeb cb cfaedb
dfbeg cdgabf efgbad cgfbdae dbfag eg beg fdebc gbacde efag | gbe eg bgfde gafe
dafce ba fbeagcd acdfb abce dab cedgaf fcedab cdbgf efgabd | bcgafed beac abd caeb
efadg ebfag cbaf bga bfecgd ab gcebda becgf eagfcbd aegcbf | dcfegb fbgea cagdebf cefdbg
fgae fcgdab dacgbef gdfba eba ae bdcfe befda gdabef ecbdag | afdgecb efadb daegfbc gdfba
edbfac begcfd acedbg decbf ead ae cfedbag ebfad bdfag afec | cfae dbcef ade debcgf
bgf gcaef fgceb fgcebad fedbc gb dcegfa abcfgd geab bcgafe | fdcabge abeg fbcagd gb
fgbcea bdf bdcae gdef fd ecfdb agfbdc fbdaecg fgdbce bcefg | cbgfe gefd fedg fbecg
edcabfg fbagce ac dcagb agc gbecd gdfab fbdecg dbcgea dace | fdagb deac adec cga
eafcbg dbage egbcdf eagbfdc gf edbfc gfb cafbde fdgeb gdcf | ebdga fbegd fg fbg
ebgaf bdegacf cbgf dcfeab fbe bgaecf cegaf egbad bf eadfcg | fb bf bcfg gcfea
cagfde eag gbcde acfebgd bcefad cafg aedcf fbdega ga gcaed | cfeda cagf ag dfcea
bdaegf bfdgac feb defa abdgcef abgfd gbfed gfbcea ef dbceg | edfbg ef dbfge fe
cefgb cegdafb begcda agb fdacg ba agbcf gdefcb agcfeb ebaf | cfegb ab gfadcbe dgbcfe
feabd fc eafdcbg gcaeb efagdb cbaef dcbagf ebfcad fca dcfe | cfaedb cbgae afc cdebfa
degfcba cga bafgce eabgd dgcba bgdcf afdc ac gfbdca fegdbc | bgcafd ca cag ac
bcdefa gf fdeabg bgf bagce gabfe dgef dfcgab fdbea cfgdeab | gf egdbaf afegb egfd
fbed gefadc dfeabc bcdae adb db dfeac gbdcfa cgeba cfegabd | cgfead dcaef dba edfb
dfcbe gd dbafec cfgedb aecdfg cgafb cfebagd gdc egdb gcdbf | dg dg gd dgc
gcef gdbac cbadfe aedfgb ecfda ge bcdfaeg gae acedg ecgafd | aeg cedfagb bacfged eagdc
de ebcdfg acgebd abegc becafg edb abged afdgbce deac gbadf | ecfagbd gabec gebda ed
gadebc gcfdaeb abefg ebgcdf eagfc ab gfbed eab fbda baegdf | edcbga abe baecfgd dbaf
bfced fe bfdac fgadbe fed cdgbe fcea adgfcb dfebagc adbfce | feac adcegfb gbfdae edgafbc
fgcbda abfdge dbe acfbe gdcebfa dgef ed gadfb gecdab eabdf | dbgace febda fdgbac dgebac
fabgce fceda faebdgc bfecd gbdfea degbfc bcdg bfd bd bcfeg | egbcf dfb gcefabd degcbf
bfdga agdbef cafdg dacgbfe afb aebd bcefga fdgeb ab decgbf | fdecbga ab bfa fbegd
cbg cfdb fabecgd acbged acefg gdbfae cb dfbegc cfegb egbdf | gdacbe gbfed cb dfbc
cabfeg ebdcfag cb dagfbc cgfda fbcd gcb ebgda dfcega gcabd | cdgafb dabeg fdgcab adcfg
gfdba fcabd ca bac fbecag abdecf cead acgebfd bedcgf cebdf | dcafb gbedcf facgedb acb
gecfbda febda fg cgdf ebacfg gbfde cdeagb gebdcf gecbd efg | egfdbc gcefba dgbfe adcgefb
egbdf ged aefgb dgfbec abfgdec cbgdf de gcadef dfgacb edbc | dfecag de gaecfdb gcefda
gacfe fbdegca gdfb edg baecfd befad aedfg bdgcae gd befgda | bafegd dgfb bdafe daebgf
becgda gd gbed bdefgac agfbce cbage dcfbga edfac agedc dgc | cgbea dgc gfabedc cdg
dgfec gaf efca gcadbf faedg efdbagc af ecfbdg gacfde abged | ecfbgd cfegd fa bgdefc
ecbadgf efbg egcdbf edf dcgfb ecdag ecfbda agbcfd dgcfe ef | gcefbd efacdbg acfegbd ebgf
dacfbg aegfdc fcgeabd dcgaf fdae fe bgeac dbfegc aegcf ecf | fe afceg fe gecdfb
bfdeg feagbd aebd gab fdcgeb begaf ba cdeafgb ecafg dbfacg | cgfbda agcef afgbe egcdfb
bafgc cgefa bdgfa gbdacf bc agefdb gbc gcfdeba bfdegc bcad | dafbg dfbcge dagfbc fcega
dbfge defbga gbeadfc bgdcfe bc gceda bcg cbdge gcaefb dbfc | cb bgc egfdcb abegcf
fda fadce da ebcaf adcb feacdb gedfc cbadgfe egabdf beafgc | egfbda bfcgade ad feabgcd
dcegf eafdcg afgc fgbeacd debcf abgedf gec eadgcb cg dgeaf | fcged afcgde dgcafe gdbecfa
becafd dafcgbe feb fgab fdebg bf abdefg gefacd gafed bedgc | faebdc fdagbe dgebf bgfa
cfgbeda ba fgacd bfca ecgfad bga gdacbf bdgac bdgfea cgbde | adfcge gfadce ab bga
dcbgafe defga edabcg cadefg dbegf facge fbaceg ead da fcda | begfd gfbcae dae eda
acebg bac dfbgca dcega cefabg ba fgdcbe aebf fcbdage fbcge | cdagfeb efba abc ab
acfge gde gecfbd ecgabf dg daceg acdegf gfda cadbe eacfdbg | dacfge fgabec gde fecgdab
edagf cfdge adf bdacfe ecdgfb cagd ad fdeacgb egfba gcfeda | fdaeg efgab ceagfd efbga
fgabd efbdg gfcde ecfadg dfcegb gecbad be efcb deb acefdgb | ecfgd bcef deb dbgaf
abgcf dgebaf eg gfbadc ega cadfe fgaec gdceafb egbc fbagce | bgafce afecdbg fcdae egcb
dbaecgf abdcgf dgbfce gdbef gcf dabegf ecfb dfcge caedg cf | gdefc cgedfab gdcbaf efcb
gcdeab acgbfd cefdg fbcgd aefbgdc bcafg fcabeg db bcd dbaf | cfedgab bdfa cbd cdgbea
gb fedbga gbdaf fbcda bdcgea gbd facdge gdceabf agefd gfeb | bgecfda gbefda gbd gcfabed
dga defcbg eabg dbcgfa ag ebcfagd gbecad fecad cegdb cegda | acbdfg cedagb ga gdeca
gcefba dabgf dcgaefb cafgd aedcg dcef cbgade dgaefc cf afc | cedf gbaced fc dfgecab
egcfa fbgce cbdfgea fgadce cbdagf edafg cade ac beagfd cag | fgbce febdgca adbgfce gac
gfdce eabdcfg ag gcadf agd cdfbge acge bdafc gefabd cedagf | gad gace gfeadb afdgeb
dfbgea bdcea cgd bcfg gc cafdge bfdga bagcfd gbdac abdgecf | cgdab dbfage fbcg dgc
cabdf bac cdgfa cdeb eabdf fedabc adfbecg dgefab ceafgb bc | fcabde bc bdcfa abedcf
fedacbg gb bgf bdag fecbda dacbf cbgfa agfce bcfadg dfcgeb | gbf dbfcea gb cbfad
fbdcea bcafe fac cfdbe cfbdeg adgbefc fgdcab af feda bgcea | cfa bfcaed cebdaf cafdeb
agf cdefg gcaebf cgbdea af begadf badf agfed dagebfc bdeag | fcegbad gbecda begda fegbad
fbdec gfbace egdfb acbfe dcba dcf gfdbcae decfag aecfdb dc | dgfcbea cd acfegb cdefab
ecfbag ba gab afbc cgabe bdecagf fecag facdeg bafged cebgd | fegadb gba cfage ba
abfeg bdgfe fbecda cbfdage egcbd gfcd efd gfcdbe df eabdcg | gfdbe dgecfb bdgeca eafgdcb
fc debfa cfb ebgcfa fgcbde acfbe dbgeac gaceb egabfcd facg | cgbae fc cgbaed cbf
ac egbfcda gfbec gecbfa dgfceb fcba dcbaeg faegc gac fdeag | gcbfae ceabfdg eadgcfb ca
bga cefbgda gfebc eafgbd edgacf cdba fcadg bagcf ab adcfgb | bgcafd gdbfac dbcgaf dcab
bdecfa gbcfa bec fbaed cbeagd cabef ec egcfbad aegbdf dcfe | edgabf cabegdf ec bdcagef
gcfaedb bfgec ceagb cbdfeg eabdcf fg fbcde gef gcdf bgafed | egf fgdc dcgaefb gfceadb
edag dab fbdag da gdcfb edacbf efagb abdecgf agebdf bagecf | deag fgdba bfeagdc efacgb
dgfc fgcbde edbacf abgef fdgbe fd dbf egcdb fbcdage aegdcb | cbdeg bcegd cbdage bdf
bcgfda dcbef facgeb gadcef bfg afdgc adgb gdfcb eacdbfg gb | cbdfaeg abgcedf egacbf becdfga
gafdbc gcefa egacb gaedbc fga fa faebcdg befa ecdgf gecbfa | egcab facdbg edgfc af
fagcde gef eagdf gfdba cdgfeb fadgbec eg badcef dfcea geca | gdabf fge adegcbf aebdgfc
bedgaf cb fcabdeg dcebfa bacgde cba gcafe dabef cbeaf fcbd | cb bdfc dafebc gceadfb
dafbe gf abdfg dfbeagc bgacd ebfg dbcefa dafgce gdf beadfg | gcdba cfegad cdfabe fgbe
dfabg cfbedg dgcbafe dceba fdagbc aedgbf fgca gc dcbag bgc | dfgceb cgb cbaedgf cgefbad
bdfegca dcegb fadc fegadb df cfbed bfd cbegaf fecba afbedc | gfacbde efbagd egcdb fbegdca
bcfgea eacgf cbdeaf fbedgac gbcfa gcadef baf gbcfd bgea ab | gaecbfd dgfbc afb dfaebc
bafdgce cbgd facde bgcaf dbacf db acgfdb aecgbf abd ebdgfa | fadce abd feacd bdcg
fgcdab efcadg gfdaebc aebfc bdefgc cefgb eg dgbe cgbfd feg | eg cegfbd dabfgc eafcb
acge bedgafc edafgc dfgbac ca bfdega cdeaf acf fdceb fdeag | facde fac ca ecfadgb
dbagf fbdeag cgbfad dbc gcfb gbdca bc ecdbaf egacd fedcbag | cb cdbfega dbc fbcg
dceab egfdacb bfc gfba fcagd bdcagf aefdcg cdafb decgfb fb | cbedfg acgdf bacfd fbc
fea bgcfe af fceag gbfdea fcagbed dgafec cfad dabgce aedgc | fea gceda edcagf fabdge
dfbga abfdce fdb bdeg adebfg gcafb daegfbc bd gcadef adfge | efdagb afgecbd fdgab bged
aebfgd gedfa bf afb ecfgda fgbe aegfcbd agdbf abdefc bcdga | gcbfaed fadeg bf cfdeab
cgaebd cg faecgbd fbagd bfecad aceg gefbdc bcdea cdg bcdga | gcabd cdg dabgc gbfad
deb cfgdeb acfebd fgbce fbdgcea bdfg cdgae dbgec bd fbaegc | ecbfg gabefc fgecbad deb
fca dfeab bacfgd gfdec ac debcfa caeb abfedg efadc bacedfg | fadce bdaefg dbfgca dfgbaec
cegfb egabd df adfcgbe efd bfedga feagdc bfad acbgde bfdeg | daegb fd efdgb bafd
agcedb egbacdf defgcb aefcgb gecab cfg acbfg bfcda gfea gf | adgcfbe cdeabfg fg fgae
fedcb caedf fgdacb dgefb cbf bc gefabd gfcaedb edgfbc bcge | cbf fcaed fbc fcebd
decaf bgfe dfage abgcdfe bfagd gde ge becagd bfgade bcdgaf | ged edg fegadb gedaf
ecgbf fabedc ebdcf fgc gc gfdbcae cbdfag dcbefg cegd ebgfa | cbadfeg fgabe feagb cfg
gfdca cgdfe gdecfa acg deag befadcg agefcb ag dbafc ecbdfg | gac agc edgfc acgdf
adfcbe fdaec agbefc gcfed cg cge fgeadc bfdge gcbefda gadc | facged cg acfde cge
edcf cbfged cbadg bfegcda eadbfg gfc bfgdc cf dfgeb ecbgfa | fc caegbdf abedfg aebgfc
edbafgc fegdba gadeb cdbega bfa afbcge bdfe fdagc fb fagbd | dcgbeaf agdceb bfecag bedf
bdefgc bcadg dfgba bedgafc edcbga cd gcd acfgbe baceg dcea | gcbadef daec bdgac ebgac
cbdag dbeg dbgafec gd cgd gabdec fcebad gbcaf eadgcf bacde | dg gdbe dbgace cgd
dfaebg dacgb bgfda egdbc gca aecbfg dcgfba ca dafc becfdga | bdcag ca ceadbgf dfac
edagc adbefg dgfae befcda gef dfcgeb bedfa afgdbce gf afgb | afdbe bfdgcae afbg gbfa
dgecba fegd begafc egfca agd fdgac aecfdg decfgba fdbca gd | abcfd gad afcbeg gd
ceabgf fbeg bacge fcedag adcbg eg gfecadb gce fbcae fcebda | defagbc cge ecagfb ge
aed fbcde aefbgcd beac gdfba ae beadf fbcaed cefadg fbcegd | ae dbefcga efbad ade
dbeagcf cdgae abfedg gfbdca cgb gdcbfe cdagb fbdag bc bacf | bc abcf cgb bcg
afbegc dabfec cega dbfag acfeb facgb gbc bgefdc efbacdg gc | egcbdf bgc edcfba bgc
bcfe cdegf bgedcf bdfga ebgcadf bfged cgedba eb egacdf dbe | febc cebf bacedgf fbgedc
fgaeb cbg bafcdg gc afgdeb eafdcbg bceda egcf acbgef cgbea | gbc gcef cbg fadgbc
cadbge dacfeg bfdage dgcab abfdc edgac gcbe bg gecadbf dbg | bg beadgfc cbge gb
geadfbc aegcdb cfdgb ebcgd ecdf fdgecb fbc dbafg geafcb cf | decf cf fc cf
cfagdb fbgac cgeaf dgfaebc faebgd ab bcad baf fgbcd bfcged | cgdfb fgcbd ab dbca
fcedg dbgcfea bg bgdf fagedc efdbgc bge aecbd bcgeaf dbegc | geb dfbg bfdg cdbea
defag bfcgde ea abfceg efbdg abde fae eagbdf aebdgfc cfgda | fea cdbfge gdcefba fdgbe
abef af gaf begfd dbfgec egcad aedfg bdaefgc bfcagd dfegab | agebfd cfabdg ebaf afeb
dfecab bcdae eabfg gc gdcfba agbce cbaged gedc cgb ebdafgc | cdeg cdegab dbeca gaceb
dbeg fecdg dcgafe abfec fdbec cfgdeb db bcgfad dbc dfgaebc | efdbc gfdacb bdc ecfba
dfecbg gdb gcde bfdce fgbeda gcdabfe dg gfcbd gcfba acefbd | gd efcagdb gacbf dbefac
fgedac dbaec febadc ag egbfc age agedbc dbag gfbcaed beacg | gae ga bgad adbfec
agfedc bdcefg fcdag gfc fbagd fdace agce cebdfa fcdegab cg | decfa fedca efadcb fcg
edcag ae gdecf ecba gaebdfc cdfbag daebfg eag gecbad abgcd | dcafebg ae egdabfc ae
fbdeag daebc dgbfac fabeg aecbgf dgfe fd daf bdecgaf adefb | dbaec edfg gfed aegbf
efacdg geb be gefdba eabf gcdeafb agbecd gedbf bgfdc daefg | efba gbe bfgcd degaf
decagfb gcfbe abdge adbgfc defagb gbdaec fdae fbgea abf fa | beadgf aedf bgade efda
aedf bagdfce cagfdb dfgac ecfgbd fe fec geabc cgeaf gafced | dcagf fgebcd cef bcefadg
dc dagbec fgbadce cde dacf dfecb fbgde afcgeb fbcdae fbeca | bcfde cd dc befdg
ebac ebfacgd cfe ec agbfe egcfab fgdcb cefgda egafbd ebfcg | cdgfb gdcafe bfgce acfedg
febdgc cge fcdgea dbgcefa bcdeg egadb dgacfb bdfgc ec ebfc | dfbgc adbfgc cefdga ce
cbd afgcedb gefdc cbgde aecdbg afcdbe bd gabce gadb gafceb | bcega ecgdb ceabfgd gebdc
dfabc agcfb gaf gf cebdfa adfbge gcafdeb cdfg bgcea cbfgda | gabcf ecbdaf dcfg fg
adebcf baefd dbegfc gedbacf fdbce fda fgbcad af afec gabed | feac ebfdgc ecgbfd gdeba
cgebad ad fcdbag dfca fbdge cabfg fgabd dag acfgbe eacfbdg | da dag fgcba ad
bface cfbgaed abegdc gdecbf aed dfeba da dgfa bdegf bafgde | dgfa ead fgad dbfgec
afgbdce ebacf abde ed ced cadfg gcdfbe ecdbaf faecd fegabc | ed bade de afdceb
aeg cdbaeg cabdfe fgceb cafgde ga adgb efdagbc eacbd cbaeg | cdaefb defgbac gae dagb
ebgf bcdef bgdca ebafdc dfegcb gf dgbcf cfg cdebgaf caefgd | cbeadgf fg fg cgf
aeg afcde cagbfe gcbdfa bafgc edbcgaf bfge acgfe ecdbag ge | ge ecadbg ecabgd ega
gfdca fabcg eafcbdg efdgc fead egacfd bdaecg da cefbdg dga | feda agd cdgabe bcafdge
gb fgbedc fegba efagbc bgca fbdea cegfa fbcadge aedcfg fbg | fcgbde bfage cgfea fbecgd
gbf acgdef dfabceg ebfadg bgde gfead cgeafb fabgd dcabf bg | fdcgaeb bg gbfcea afbgd
begcf baec cafgb fedcgba bag ba fadcg dfabeg afgbce fdbecg | bcadfeg gcfeb daegfb caeb
badgfc fdagecb bgefa egcab agbfed fa eafd dbfge dcbgfe fag | agf fa faed fga
cdabgf decbg gceabf dfeabg gfeab adb dafe bedga cadfbge da | gebdfa aefgb deaf cbedg
dfaceg fabecdg gedf gbecaf de fcaeg dec cabfd adbecg fdeac | ed cbfda de cbfeag
cgbeaf afbdc bega gbfec cea dcfgbe ae dbaegfc ebacf cegfad | gbae cefba aec gfbec
gb fgdeac efcbgda eacbd agefd gab edbag ebfgac dgfb edabgf | bfgd egdaf gb bag
fdeabcg gabdfc gedfca dabce cfge edbagf geacd dafgc ge ega | gfce ega dfcbga gfedacb
ad dca cefgba abfcdg dcbaeg dbea ecabg gdcea egfcd gafbcde | egfdcab gcdfe bgeca adc
efag eba ea abfecd cedafgb gabfec fgbdac gcdeb acfbg gceab | bae ecgab cbfga gfae
bafcged cfb dfgba afbdec cf daebc bcgfde dagbec dfcba caef | cf agbdf caefdbg fegdcb
cgfadbe dceabg adebg fgaedc gcba dca ca aedbc geafdb dbfce | cdabe gbdea eacfgd adc
eabfdg cfbdag eb bfdeca feb dfcbgae ecgfa aebfc dfcba edbc | ecfba cafge be be
ea agbde cfbdea egdbfa abdgfc ead bfdga cbged agfe begcfad | baecdf adgeb ade cbfadeg
dabfe fgceab adfec aegdb dacegb fgdb bef fb dafbeg bedfcga | abdge abgfde gfdb eagfdb
badcf egabdc gb efdgac gedafb gab fecadgb bgfe gefda abgdf | bag cbedag agdfceb dfcba
aedgcf eacdbg ea gae efcgd gcfab gcebdf facebgd gfaec faed | afde eafd ceadgb cdbage
gbeadc fgdac ecagf ebfg abdfce cgfeab ge dcgbafe aefcb ecg | ebdgca gec ecbdaf dbafec
cdfbe adcfeb acf efgbcad ac dbca befgcd gabef geadcf febac | ac eacbdf caf ecdgbf
aebcfd cdabe abfeg defbagc bfgced fd gbcdea edf fbdae dacf | dcaeb cfad dfe fcad
bdcg fecdba bd cagbef dgeab dbgcfae ebd gedcab eafdg gcaeb | cgbd aecgb bgcea ebd
bcgfe dbecgf fgdbae afgce bedcf dbeafc bg cgdb cadgefb beg | ecdfgb daegfb bfegc ecfbg
ebgcd bdecgfa gdabfe gedfc dgf fg edabcf gcaf eafcdg cfeda | dbaecf efgcd fgedab fgdeac
gefcdb gfadb ea efgab gcefb gea cefa ecgfabd bcafge egcbda | egacdbf gebfc ae ega
cgedfa afd febagdc fadeg dgcabe cabgfd acef febgd cadge fa | afedg fa abgced gacbdf
dbcfea dc dbgae egdafb bcd debgc cgad egbdafc gcebad befgc | cd dcb dgca decbg
ecfad aegcbf fedcbg edcbf gaedcb fb cgeadfb gfdb edgbc cbf | becafg bgdf fcb gecdbf
ce dgecbfa bgdac gdbfae dce egdac acdebf cfeadg adgfe fgce | gaefbcd degca fcge dbcfeag
fd eafcgb cdf dcfgeb fabce gecda dbfa beagcfd deacf abfcde | defca fecab cdaeg ecafb
cagdbf ca gacfd cgbeafd dcfge gac gafdb dacb bfgaed becgaf | gcdfa cdab dcab bcfeagd
gadef aedgc afg gcadbf ecdfag fg gfbdeac adfeb cfge bgaedc | gf bdcgfa dgafe bgcdaf
agdc gefdbc dbgfa ad cfbaed dba cbdfg ecfdagb egfba dgcabf | ecdgbf ad bgcdef abgef
cadgfb bcgfae fedac efbca cagfb eb bae ecdgabf begc agbedf | gedafb acbdegf aeb eb
cdega efbg fbdegac ef daebcf badefg efagd efd fbgdca dbfga | fadecbg bgfe ef agdbf
fbedca fbcgaed dabcg fgdbce cgfadb gb bdafc afbg dgcae dbg | bdacgf adfbc bg gedca
befcg edb bgadfc dfaecb cdfegab egda agcdbe ed dcabg debgc | geda aegd gcdafb dcefab";
void Main()
{
var sLines = Input.Split("\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
var sEntries = sLines.Select(l =>
{
var split = l.Split('|', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
return (
sIn: split[0].Split(' ').Select(s => new string(s.OrderBy(s2 => s2).ToArray())),
sOut: split[1].Split(' ').Select(s => new string(s.OrderBy(s2 => s2).ToArray())));
})
.ToList();
int sum = 0;
foreach (var se in sEntries)
{
var all = se.sIn.Concat(se.sOut);
var signals = all.Distinct().ToDictionary(keySelector: s => s, elementSelector: s => -1);
string n1 = all.First(s => s.Count() == 2);
string n4 = all.First(s => s.Count() == 4);
string n7 = all.First(s => s.Count() == 3);
string n8 = "abcdefg";
signals[n1] = 1;
signals[n4] = 4;
signals[n7] = 7;
signals[n8] = 8;
string n3 = all.First(s => s.Count() == 5 && s.Except(n1).Count() == 3);
signals[n3] = 3;
string n5 = all.First(s => s.Count() == 5 && s != n3 && s.Except(n3.Concat(n4)).Count() == 0);
signals[n5] = 5;
string n2 = all.First(s => s.Count() == 5 && s != n3 && s != n5);
signals[n2] = 2;
string n0 = all.First(s => s.Count() == 6 && s.Except(n5).Count() == 2);
signals[n0] = 0;
string n9 = all.First(s => s.Count() == 6 && s != n0 && s.Except(n3.Concat(n4)).Count() == 0);
signals[n9] = 9;
string n6 = all.First(s => s.Count() == 6 && s != n0 && s != n9);
signals[n6] = 6;
signals.Dump();
var outs = se.sOut.ToList();
int output =
signals[outs[0]] * 1000 +
signals[outs[1]] * 100 +
signals[outs[2]] * 10 +
signals[outs[3]];
output.Dump();
sum += output;
}
sum.Dump("Sum");
}
string TestInput = @"
be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe
edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc
fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg
fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb
aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea
fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb
dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe
bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef
egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb
gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce";
string Input = @"
abdfce bedag acdefgb cg febcga fbdac fcdg cabdg bcg bgacdf | fdcab adbcf gcb acdebf
bgeacdf dgebca gbc fbgd fceba fecdg bcgef cfgbde gb fegacd | dbfg abecf dfgb gaecdf
dfega bedag af agf fdagcb cbaedgf feac dfecg dcegfa gcfdbe | fag edcgf fga bfgcad
ca afc bdafe bgface afdebc dcab cgedf fcaed cdebfga fabged | fcdea abdc fdcbea fdbcega
gabde beacg cgafe gcfeab gebdcf fedagc edfgcba bc acfb bcg | fagedc bgc bgace cbg
df cfd geabfc ebgadcf dfae dcgfe decgb agdcfb aecdfg cgfae | fd fd ecfgd gfbcea
fcebdga cf faebgd fecgbd bcdfg egbdf cgadfe bgadc gcf cefb | fcg gfc fgc dfcega
abedcg afdcgb ae fcgad fbcge gea dfae deafgc efgca cagebfd | gea fgcbade ea ega
dc egcbf dgbce abdge acdg dbfeac dbeagf gecfbda dec cgdabe | agebcdf cadg agbfed cd
bag ecgfb beagf ga edbaf aegc bfgdac bedcgfa gabcfe fdebgc | debacfg bga degcfb bacgfde
gebcfa efbcgda fbgdae egcdb aecbg dfegac eagbf fbca ac aec | gaebdf cabf aegbdf fegba
bedg abcdg dcagef gd cfgba fdaebc cdg badgec bcaed egcadbf | gabced gd bcdag ebgd
gbdfca agedfc acedg fcgeb dbacfeg ab cba cbadeg daeb gbace | adbfgc ecfdbga ebfcg ab
bfdag cbegafd dfabeg bge ge bdcae gabfdc faeg gefdbc gdeba | dbega dgecbfa adbce fecbadg
edbf efcabg edfbgc gdcbf ecgdf egdacf cbf bf cbegfda gadcb | dfbe gfdbc fcb bf
gcefa egdb gcfeb fdgbace dfbcg be bgfdca caedfb bec cbfgde | bec dgeb ceagf egfcbda
eabcd ceagfb bdgcea cgdeb bgcfde gadc fabde abc ac dfgebca | agfcbe bcadge abc cab
agfedc edabfcg bf fgcdab ecabd dfb dfagc afbegd cbfg cfabd | fbcg cfadg geafbd deabc
afdeg ce eafbcdg bgcfa fedagb dcgbfe aedc gcaedf fcage cge | dfcbgae ec fecga caed
bec cbgedf fagbcd abdec agbed feacdb fdcab acfe dgbcafe ce | cgfbad abdge bec badcfe
begac ade egcadb dfceagb acdg degfb eafcbg da bedacf dageb | debga faedcb acgeb fgdeb
ecdga gfab adcgb cgdebaf edcbfa ab bfcdg fcegdb acbdfg bda | dcaeg egdfabc dagbfc dgabcf
agb cbgea bafcdg edbgfca egacfd edbac gacef bg gefb fbaecg | aegcbf decfga gb aecgf
bfdec fegacd cfdbeag dba fadcb bdfgae cagdfb ab acbg dcgfa | efcdag cabg geadbf ab
dfegcab cba facdbe agdcf egadb aebdgf cb cbdga gceb bedacg | bac cgeb cb cfaedb
dfbeg cdgabf efgbad cgfbdae dbfag eg beg fdebc gbacde efag | gbe eg bgfde gafe
dafce ba fbeagcd acdfb abce dab cedgaf fcedab cdbgf efgabd | bcgafed beac abd caeb
efadg ebfag cbaf bga bfecgd ab gcebda becgf eagfcbd aegcbf | dcfegb fbgea cagdebf cefdbg
fgae fcgdab dacgbef gdfba eba ae bdcfe befda gdabef ecbdag | afdgecb efadb daegfbc gdfba
edbfac begcfd acedbg decbf ead ae cfedbag ebfad bdfag afec | cfae dbcef ade debcgf
bgf gcaef fgceb fgcebad fedbc gb dcegfa abcfgd geab bcgafe | fdcabge abeg fbcagd gb
fgbcea bdf bdcae gdef fd ecfdb agfbdc fbdaecg fgdbce bcefg | cbgfe gefd fedg fbecg
edcabfg fbagce ac dcagb agc gbecd gdfab fbdecg dbcgea dace | fdagb deac adec cga
eafcbg dbage egbcdf eagbfdc gf edbfc gfb cafbde fdgeb gdcf | ebdga fbegd fg fbg
ebgaf bdegacf cbgf dcfeab fbe bgaecf cegaf egbad bf eadfcg | fb bf bcfg gcfea
cagfde eag gbcde acfebgd bcefad cafg aedcf fbdega ga gcaed | cfeda cagf ag dfcea
bdaegf bfdgac feb defa abdgcef abgfd gbfed gfbcea ef dbceg | edfbg ef dbfge fe
cefgb cegdafb begcda agb fdacg ba agbcf gdefcb agcfeb ebaf | cfegb ab gfadcbe dgbcfe
feabd fc eafdcbg gcaeb efagdb cbaef dcbagf ebfcad fca dcfe | cfaedb cbgae afc cdebfa
degfcba cga bafgce eabgd dgcba bgdcf afdc ac gfbdca fegdbc | bgcafd ca cag ac
bcdefa gf fdeabg bgf bagce gabfe dgef dfcgab fdbea cfgdeab | gf egdbaf afegb egfd
fbed gefadc dfeabc bcdae adb db dfeac gbdcfa cgeba cfegabd | cgfead dcaef dba edfb
dfcbe gd dbafec cfgedb aecdfg cgafb cfebagd gdc egdb gcdbf | dg dg gd dgc
gcef gdbac cbadfe aedfgb ecfda ge bcdfaeg gae acedg ecgafd | aeg cedfagb bacfged eagdc
de ebcdfg acgebd abegc becafg edb abged afdgbce deac gbadf | ecfagbd gabec gebda ed
gadebc gcfdaeb abefg ebgcdf eagfc ab gfbed eab fbda baegdf | edcbga abe baecfgd dbaf
bfced fe bfdac fgadbe fed cdgbe fcea adgfcb dfebagc adbfce | feac adcegfb gbfdae edgafbc
fgcbda abfdge dbe acfbe gdcebfa dgef ed gadfb gecdab eabdf | dbgace febda fdgbac dgebac
fabgce fceda faebdgc bfecd gbdfea degbfc bcdg bfd bd bcfeg | egbcf dfb gcefabd degcbf
bfdga agdbef cafdg dacgbfe afb aebd bcefga fdgeb ab decgbf | fdecbga ab bfa fbegd
cbg cfdb fabecgd acbged acefg gdbfae cb dfbegc cfegb egbdf | gdacbe gbfed cb dfbc
cabfeg ebdcfag cb dagfbc cgfda fbcd gcb ebgda dfcega gcabd | cdgafb dabeg fdgcab adcfg
gfdba fcabd ca bac fbecag abdecf cead acgebfd bedcgf cebdf | dcafb gbedcf facgedb acb
gecfbda febda fg cgdf ebacfg gbfde cdeagb gebdcf gecbd efg | egfdbc gcefba dgbfe adcgefb
egbdf ged aefgb dgfbec abfgdec cbgdf de gcadef dfgacb edbc | dfecag de gaecfdb gcefda
gacfe fbdegca gdfb edg baecfd befad aedfg bdgcae gd befgda | bafegd dgfb bdafe daebgf
becgda gd gbed bdefgac agfbce cbage dcfbga edfac agedc dgc | cgbea dgc gfabedc cdg
dgfec gaf efca gcadbf faedg efdbagc af ecfbdg gacfde abged | ecfbgd cfegd fa bgdefc
ecbadgf efbg egcdbf edf dcgfb ecdag ecfbda agbcfd dgcfe ef | gcefbd efacdbg acfegbd ebgf
dacfbg aegfdc fcgeabd dcgaf fdae fe bgeac dbfegc aegcf ecf | fe afceg fe gecdfb
bfdeg feagbd aebd gab fdcgeb begaf ba cdeafgb ecafg dbfacg | cgfbda agcef afgbe egcdfb
bafgc cgefa bdgfa gbdacf bc agefdb gbc gcfdeba bfdegc bcad | dafbg dfbcge dagfbc fcega
dbfge defbga gbeadfc bgdcfe bc gceda bcg cbdge gcaefb dbfc | cb bgc egfdcb abegcf
fda fadce da ebcaf adcb feacdb gedfc cbadgfe egabdf beafgc | egfbda bfcgade ad feabgcd
dcegf eafdcg afgc fgbeacd debcf abgedf gec eadgcb cg dgeaf | fcged afcgde dgcafe gdbecfa
becafd dafcgbe feb fgab fdebg bf abdefg gefacd gafed bedgc | faebdc fdagbe dgebf bgfa
cfgbeda ba fgacd bfca ecgfad bga gdacbf bdgac bdgfea cgbde | adfcge gfadce ab bga
dcbgafe defga edabcg cadefg dbegf facge fbaceg ead da fcda | begfd gfbcae dae eda
acebg bac dfbgca dcega cefabg ba fgdcbe aebf fcbdage fbcge | cdagfeb efba abc ab
acfge gde gecfbd ecgabf dg daceg acdegf gfda cadbe eacfdbg | dacfge fgabec gde fecgdab
edagf cfdge adf bdacfe ecdgfb cagd ad fdeacgb egfba gcfeda | fdaeg efgab ceagfd efbga
fgabd efbdg gfcde ecfadg dfcegb gecbad be efcb deb acefdgb | ecfgd bcef deb dbgaf
abgcf dgebaf eg gfbadc ega cadfe fgaec gdceafb egbc fbagce | bgafce afecdbg fcdae egcb
dbaecgf abdcgf dgbfce gdbef gcf dabegf ecfb dfcge caedg cf | gdefc cgedfab gdcbaf efcb
gcdeab acgbfd cefdg fbcgd aefbgdc bcafg fcabeg db bcd dbaf | cfedgab bdfa cbd cdgbea
gb fedbga gbdaf fbcda bdcgea gbd facdge gdceabf agefd gfeb | bgecfda gbefda gbd gcfabed
dga defcbg eabg dbcgfa ag ebcfagd gbecad fecad cegdb cegda | acbdfg cedagb ga gdeca
gcefba dabgf dcgaefb cafgd aedcg dcef cbgade dgaefc cf afc | cedf gbaced fc dfgecab
egcfa fbgce cbdfgea fgadce cbdagf edafg cade ac beagfd cag | fgbce febdgca adbgfce gac
gfdce eabdcfg ag gcadf agd cdfbge acge bdafc gefabd cedagf | gad gace gfeadb afdgeb
dfbgea bdcea cgd bcfg gc cafdge bfdga bagcfd gbdac abdgecf | cgdab dbfage fbcg dgc
cabdf bac cdgfa cdeb eabdf fedabc adfbecg dgefab ceafgb bc | fcabde bc bdcfa abedcf
fedacbg gb bgf bdag fecbda dacbf cbgfa agfce bcfadg dfcgeb | gbf dbfcea gb cbfad
fbdcea bcafe fac cfdbe cfbdeg adgbefc fgdcab af feda bgcea | cfa bfcaed cebdaf cafdeb
agf cdefg gcaebf cgbdea af begadf badf agfed dagebfc bdeag | fcegbad gbecda begda fegbad
fbdec gfbace egdfb acbfe dcba dcf gfdbcae decfag aecfdb dc | dgfcbea cd acfegb cdefab
ecfbag ba gab afbc cgabe bdecagf fecag facdeg bafged cebgd | fegadb gba cfage ba
abfeg bdgfe fbecda cbfdage egcbd gfcd efd gfcdbe df eabdcg | gfdbe dgecfb bdgeca eafgdcb
fc debfa cfb ebgcfa fgcbde acfbe dbgeac gaceb egabfcd facg | cgbae fc cgbaed cbf
ac egbfcda gfbec gecbfa dgfceb fcba dcbaeg faegc gac fdeag | gcbfae ceabfdg eadgcfb ca
bga cefbgda gfebc eafgbd edgacf cdba fcadg bagcf ab adcfgb | bgcafd gdbfac dbcgaf dcab
bdecfa gbcfa bec fbaed cbeagd cabef ec egcfbad aegbdf dcfe | edgabf cabegdf ec bdcagef
gcfaedb bfgec ceagb cbdfeg eabdcf fg fbcde gef gcdf bgafed | egf fgdc dcgaefb gfceadb
edag dab fbdag da gdcfb edacbf efagb abdecgf agebdf bagecf | deag fgdba bfeagdc efacgb
dgfc fgcbde edbacf abgef fdgbe fd dbf egcdb fbcdage aegdcb | cbdeg bcegd cbdage bdf
bcgfda dcbef facgeb gadcef bfg afdgc adgb gdfcb eacdbfg gb | cbdfaeg abgcedf egacbf becdfga
gafdbc gcefa egacb gaedbc fga fa faebcdg befa ecdgf gecbfa | egcab facdbg edgfc af
fagcde gef eagdf gfdba cdgfeb fadgbec eg badcef dfcea geca | gdabf fge adegcbf aebdgfc
bedgaf cb fcabdeg dcebfa bacgde cba gcafe dabef cbeaf fcbd | cb bdfc dafebc gceadfb
dafbe gf abdfg dfbeagc bgacd ebfg dbcefa dafgce gdf beadfg | gcdba cfegad cdfabe fgbe
dfabg cfbedg dgcbafe dceba fdagbc aedgbf fgca gc dcbag bgc | dfgceb cgb cbaedgf cgefbad
bdfegca dcegb fadc fegadb df cfbed bfd cbegaf fecba afbedc | gfacbde efbagd egcdb fbegdca
bcfgea eacgf cbdeaf fbedgac gbcfa gcadef baf gbcfd bgea ab | gaecbfd dgfbc afb dfaebc
bafdgce cbgd facde bgcaf dbacf db acgfdb aecgbf abd ebdgfa | fadce abd feacd bdcg
fgcdab efcadg gfdaebc aebfc bdefgc cefgb eg dgbe cgbfd feg | eg cegfbd dabfgc eafcb
acge bedgafc edafgc dfgbac ca bfdega cdeaf acf fdceb fdeag | facde fac ca ecfadgb
dbagf fbdeag cgbfad dbc gcfb gbdca bc ecdbaf egacd fedcbag | cb cdbfega dbc fbcg
dceab egfdacb bfc gfba fcagd bdcagf aefdcg cdafb decgfb fb | cbedfg acgdf bacfd fbc
fea bgcfe af fceag gbfdea fcagbed dgafec cfad dabgce aedgc | fea gceda edcagf fabdge
dfbga abfdce fdb bdeg adebfg gcafb daegfbc bd gcadef adfge | efdagb afgecbd fdgab bged
aebfgd gedfa bf afb ecfgda fgbe aegfcbd agdbf abdefc bcdga | gcbfaed fadeg bf cfdeab
cgaebd cg faecgbd fbagd bfecad aceg gefbdc bcdea cdg bcdga | gcabd cdg dabgc gbfad
deb cfgdeb acfebd fgbce fbdgcea bdfg cdgae dbgec bd fbaegc | ecbfg gabefc fgecbad deb
fca dfeab bacfgd gfdec ac debcfa caeb abfedg efadc bacedfg | fadce bdaefg dbfgca dfgbaec
cegfb egabd df adfcgbe efd bfedga feagdc bfad acbgde bfdeg | daegb fd efdgb bafd
agcedb egbacdf defgcb aefcgb gecab cfg acbfg bfcda gfea gf | adgcfbe cdeabfg fg fgae
fedcb caedf fgdacb dgefb cbf bc gefabd gfcaedb edgfbc bcge | cbf fcaed fbc fcebd
decaf bgfe dfage abgcdfe bfagd gde ge becagd bfgade bcdgaf | ged edg fegadb gedaf
ecgbf fabedc ebdcf fgc gc gfdbcae cbdfag dcbefg cegd ebgfa | cbadfeg fgabe feagb cfg
gfdca cgdfe gdecfa acg deag befadcg agefcb ag dbafc ecbdfg | gac agc edgfc acgdf
adfcbe fdaec agbefc gcfed cg cge fgeadc bfdge gcbefda gadc | facged cg acfde cge
edcf cbfged cbadg bfegcda eadbfg gfc bfgdc cf dfgeb ecbgfa | fc caegbdf abedfg aebgfc
edbafgc fegdba gadeb cdbega bfa afbcge bdfe fdagc fb fagbd | dcgbeaf agdceb bfecag bedf
bdefgc bcadg dfgba bedgafc edcbga cd gcd acfgbe baceg dcea | gcbadef daec bdgac ebgac
cbdag dbeg dbgafec gd cgd gabdec fcebad gbcaf eadgcf bacde | dg gdbe dbgace cgd
dfaebg dacgb bgfda egdbc gca aecbfg dcgfba ca dafc becfdga | bdcag ca ceadbgf dfac
edagc adbefg dgfae befcda gef dfcgeb bedfa afgdbce gf afgb | afdbe bfdgcae afbg gbfa
dgecba fegd begafc egfca agd fdgac aecfdg decfgba fdbca gd | abcfd gad afcbeg gd
ceabgf fbeg bacge fcedag adcbg eg gfecadb gce fbcae fcebda | defagbc cge ecagfb ge
aed fbcde aefbgcd beac gdfba ae beadf fbcaed cefadg fbcegd | ae dbefcga efbad ade
dbeagcf cdgae abfedg gfbdca cgb gdcbfe cdagb fbdag bc bacf | bc abcf cgb bcg
afbegc dabfec cega dbfag acfeb facgb gbc bgefdc efbacdg gc | egcbdf bgc edcfba bgc
bcfe cdegf bgedcf bdfga ebgcadf bfged cgedba eb egacdf dbe | febc cebf bacedgf fbgedc
fgaeb cbg bafcdg gc afgdeb eafdcbg bceda egcf acbgef cgbea | gbc gcef cbg fadgbc
cadbge dacfeg bfdage dgcab abfdc edgac gcbe bg gecadbf dbg | bg beadgfc cbge gb
geadfbc aegcdb cfdgb ebcgd ecdf fdgecb fbc dbafg geafcb cf | decf cf fc cf
cfagdb fbgac cgeaf dgfaebc faebgd ab bcad baf fgbcd bfcged | cgdfb fgcbd ab dbca
fcedg dbgcfea bg bgdf fagedc efdbgc bge aecbd bcgeaf dbegc | geb dfbg bfdg cdbea
defag bfcgde ea abfceg efbdg abde fae eagbdf aebdgfc cfgda | fea cdbfge gdcefba fdgbe
abef af gaf begfd dbfgec egcad aedfg bdaefgc bfcagd dfegab | agebfd cfabdg ebaf afeb
dfecab bcdae eabfg gc gdcfba agbce cbaged gedc cgb ebdafgc | cdeg cdegab dbeca gaceb
dbeg fecdg dcgafe abfec fdbec cfgdeb db bcgfad dbc dfgaebc | efdbc gfdacb bdc ecfba
dfecbg gdb gcde bfdce fgbeda gcdabfe dg gfcbd gcfba acefbd | gd efcagdb gacbf dbefac
fgedac dbaec febadc ag egbfc age agedbc dbag gfbcaed beacg | gae ga bgad adbfec
agfedc bdcefg fcdag gfc fbagd fdace agce cebdfa fcdegab cg | decfa fedca efadcb fcg
edcag ae gdecf ecba gaebdfc cdfbag daebfg eag gecbad abgcd | dcafebg ae egdabfc ae
fbdeag daebc dgbfac fabeg aecbgf dgfe fd daf bdecgaf adefb | dbaec edfg gfed aegbf
efacdg geb be gefdba eabf gcdeafb agbecd gedbf bgfdc daefg | efba gbe bfgcd degaf
decagfb gcfbe abdge adbgfc defagb gbdaec fdae fbgea abf fa | beadgf aedf bgade efda
aedf bagdfce cagfdb dfgac ecfgbd fe fec geabc cgeaf gafced | dcagf fgebcd cef bcefadg
dc dagbec fgbadce cde dacf dfecb fbgde afcgeb fbcdae fbeca | bcfde cd dc befdg
ebac ebfacgd cfe ec agbfe egcfab fgdcb cefgda egafbd ebfcg | cdgfb gdcafe bfgce acfedg
febdgc cge fcdgea dbgcefa bcdeg egadb dgacfb bdfgc ec ebfc | dfbgc adbfgc cefdga ce
cbd afgcedb gefdc cbgde aecdbg afcdbe bd gabce gadb gafceb | bcega ecgdb ceabfgd gebdc
dfabc agcfb gaf gf cebdfa adfbge gcafdeb cdfg bgcea cbfgda | gabcf ecbdaf dcfg fg
adebcf baefd dbegfc gedbacf fdbce fda fgbcad af afec gabed | feac ebfdgc ecgbfd gdeba
cgebad ad fcdbag dfca fbdge cabfg fgabd dag acfgbe eacfbdg | da dag fgcba ad
bface cfbgaed abegdc gdecbf aed dfeba da dgfa bdegf bafgde | dgfa ead fgad dbfgec
afgbdce ebacf abde ed ced cadfg gcdfbe ecdbaf faecd fegabc | ed bade de afdceb
aeg cdbaeg cabdfe fgceb cafgde ga adgb efdagbc eacbd cbaeg | cdaefb defgbac gae dagb
ebgf bcdef bgdca ebafdc dfegcb gf dgbcf cfg cdebgaf caefgd | cbeadgf fg fg cgf
aeg afcde cagbfe gcbdfa bafgc edbcgaf bfge acgfe ecdbag ge | ge ecadbg ecabgd ega
gfdca fabcg eafcbdg efdgc fead egacfd bdaecg da cefbdg dga | feda agd cdgabe bcafdge
gb fgbedc fegba efagbc bgca fbdea cegfa fbcadge aedcfg fbg | fcgbde bfage cgfea fbecgd
gbf acgdef dfabceg ebfadg bgde gfead cgeafb fabgd dcabf bg | fdcgaeb bg gbfcea afbgd
begcf baec cafgb fedcgba bag ba fadcg dfabeg afgbce fdbecg | bcadfeg gcfeb daegfb caeb
badgfc fdagecb bgefa egcab agbfed fa eafd dbfge dcbgfe fag | agf fa faed fga
cdabgf decbg gceabf dfeabg gfeab adb dafe bedga cadfbge da | gebdfa aefgb deaf cbedg
dfaceg fabecdg gedf gbecaf de fcaeg dec cabfd adbecg fdeac | ed cbfda de cbfeag
cgbeaf afbdc bega gbfec cea dcfgbe ae dbaegfc ebacf cegfad | gbae cefba aec gfbec
gb fgdeac efcbgda eacbd agefd gab edbag ebfgac dgfb edabgf | bfgd egdaf gb bag
fdeabcg gabdfc gedfca dabce cfge edbagf geacd dafgc ge ega | gfce ega dfcbga gfedacb
ad dca cefgba abfcdg dcbaeg dbea ecabg gdcea egfcd gafbcde | egfdcab gcdfe bgeca adc
efag eba ea abfecd cedafgb gabfec fgbdac gcdeb acfbg gceab | bae ecgab cbfga gfae
bafcged cfb dfgba afbdec cf daebc bcgfde dagbec dfcba caef | cf agbdf caefdbg fegdcb
cgfadbe dceabg adebg fgaedc gcba dca ca aedbc geafdb dbfce | cdabe gbdea eacfgd adc
eabfdg cfbdag eb bfdeca feb dfcbgae ecgfa aebfc dfcba edbc | ecfba cafge be be
ea agbde cfbdea egdbfa abdgfc ead bfdga cbged agfe begcfad | baecdf adgeb ade cbfadeg
dabfe fgceab adfec aegdb dacegb fgdb bef fb dafbeg bedfcga | abdge abgfde gfdb eagfdb
badcf egabdc gb efdgac gedafb gab fecadgb bgfe gefda abgdf | bag cbedag agdfceb dfcba
aedgcf eacdbg ea gae efcgd gcfab gcebdf facebgd gfaec faed | afde eafd ceadgb cdbage
gbeadc fgdac ecagf ebfg abdfce cgfeab ge dcgbafe aefcb ecg | ebdgca gec ecbdaf dbafec
cdfbe adcfeb acf efgbcad ac dbca befgcd gabef geadcf febac | ac eacbdf caf ecdgbf
aebcfd cdabe abfeg defbagc bfgced fd gbcdea edf fbdae dacf | dcaeb cfad dfe fcad
bdcg fecdba bd cagbef dgeab dbgcfae ebd gedcab eafdg gcaeb | cgbd aecgb bgcea ebd
bcgfe dbecgf fgdbae afgce bedcf dbeafc bg cgdb cadgefb beg | ecdfgb daegfb bfegc ecfbg
ebgcd bdecgfa gdabfe gedfc dgf fg edabcf gcaf eafcdg cfeda | dbaecf efgcd fgedab fgdeac
gefcdb gfadb ea efgab gcefb gea cefa ecgfabd bcafge egcbda | egacdbf gebfc ae ega
cgedfa afd febagdc fadeg dgcabe cabgfd acef febgd cadge fa | afedg fa abgced gacbdf
dbcfea dc dbgae egdafb bcd debgc cgad egbdafc gcebad befgc | cd dcb dgca decbg
ecfad aegcbf fedcbg edcbf gaedcb fb cgeadfb gfdb edgbc cbf | becafg bgdf fcb gecdbf
ce dgecbfa bgdac gdbfae dce egdac acdebf cfeadg adgfe fgce | gaefbcd degca fcge dbcfeag
fd eafcgb cdf dcfgeb fabce gecda dbfa beagcfd deacf abfcde | defca fecab cdaeg ecafb
cagdbf ca gacfd cgbeafd dcfge gac gafdb dacb bfgaed becgaf | gcdfa cdab dcab bcfeagd
gadef aedgc afg gcadbf ecdfag fg gfbdeac adfeb cfge bgaedc | gf bdcgfa dgafe bgcdaf
agdc gefdbc dbgfa ad cfbaed dba cbdfg ecfdagb egfba dgcabf | ecdgbf ad bgcdef abgef
cadgfb bcgfae fedac efbca cagfb eb bae ecdgabf begc agbedf | gedafb acbdegf aeb eb
cdega efbg fbdegac ef daebcf badefg efagd efd fbgdca dbfga | fadecbg bgfe ef agdbf
fbedca fbcgaed dabcg fgdbce cgfadb gb bdafc afbg dgcae dbg | bdacgf adfbc bg gedca
befcg edb bgadfc dfaecb cdfegab egda agcdbe ed dcabg debgc | geda aegd gcdafb dcefab";
void Main()
{
var sMap = Input.Split("\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
sMap.Dump(); sMap.Length.Dump();
int[,] map = new int[sMap.Length, sMap.First().Length];
for (int y = 0; y < sMap.First().Length; y++)
{
for (int x = 0; x < sMap.Length; x++)
{
map[x, y] = int.Parse(sMap[x][y].ToString());
}
}
map.Dump();
var lowPoints = FindLowPoints(map).Dump();
lowPoints.Select(p => map[p.y, p.x] + 1).Sum().Dump("Sum");
}
IEnumerable<(int x, int y)> FindLowPoints(int[,] map)
{
int height = map.GetLength(0).Dump("Height");
int width = map.GetLength(1).Dump("Width");
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
int Top() => y > 0 ? map[y - 1, x] : int.MaxValue;
int Bottom() => y < height - 1 ? map[y + 1, x] : int.MaxValue;
int Left() => x > 0 ? map[y, x - 1] : int.MaxValue;
int Right() => x < width - 1 ? map[y, x + 1] : int.MaxValue;
int current = map[y, x];
if (current < Top() &&
current < Bottom() &&
current < Left() &&
current < Right())
{
yield return (x, y);
}
}
}
}
string TestInput = @"
2199943210
3987894921
9856789892
8767896789
9899965678";
string Input = @"
9874321292198975458901239986401245679543234590129878943236789999863345679876578901978456778910976423
9965434789987854346893498793212357898753125789998767954345789987651266799765457899854234567899997910
9876545695986543234989987654323569999654247999898757895456793499540656989755348999765195678978999891
5988856894597654345678999876435678998765348998789546796569894568932349876543257998976989989569998789
6799768943498785656789456987545989579876456789689235689878965679899499986432167577989878993468987678
7999879894679896777892349987656993467987598996563124598989876799767989997621012356798767892389898465
9899998796789987888921298798867894678998789876432012457899987987655678998543143456789659910198764343
5789997689891298999210987689988965789469898765432123678989999876543568987654554567998799791999953212
4579886578910989434991396578999879894398979876543267989567789998712456999875665678929898679899999923
6797675487899876526889987467899989999987654998665348995434678939901267899988776899019976535678987899
8965452346789865435679876578999894698996543239765467894324579129894345678999988992198765324579876798
9894321257894976576789987889698743987989992123986567975434598999789966989129999789349896545698654567
6789432345995987987999999996569654596577889965987678996945997876567897891098945689467987657976543456
5678943489989998998999898995459875987465679896799789879899876743456789932987334999978998798989942465
4599976568978989999998767889310989876323568789989898965789985432579899949996229879899869939399861254
7678997679767869899987656778921299975212345679765977896895796431298989898765109768789654321298750123
8799398989756556799786545568942349954326656789763256789954989910987676789843297655678969572359842354
9892129996545445988654335459959498765545767899854345898769878899886545998764987643789998765498756878
3932099987632339876543212367898999876787878998765656789899765798765434899979843212456999879699867889
2393989998741024987543101234567899987899989659878767893987654597654323789998732104767898998789978998
1989878999843266898754215345788969998930296545989979992098543129973212679876543212378987679992989456
9876767998764356999865326456799457999321989432599898789198762098765323567999698345679996565894599568
8765659899875667899987547567892398998949878921398779564989654599896464778998796456789876434789798999
8954345799986878989798658789943456987894567892987654453578966789987975689999987967894989545678987989
7543234689498989877659879999654667976789779999876543212346987894398986799989598978943498956989876567
5432129795239998767545990198765678985678989998987662103567899999459997898765439989912987967898965475
6554578894346899843235689239876789876789697897998743215678912398967998999875323499899986898987893234
7685678965456987656123579345987899998993466976899764376789904987899899789996784789798765989656999645
9796789876767999764334989956798999659201245998939878988897899896789653678987895679679989878537898997
9898998989878998765445996898989998995313359899910989999976798765678932489899998789543298767423957989
3959987693989989876567895789978987989924599789892997896545987654687893599767999896532129854212345678
2348799432397879997678964598767576567895978656789765987659976743556789678956799974321045965102389789
0147698921236568998989532349754321389999767545699986798798765432345678989347899865432129873216578995
1234597990123459219297543498765410499997656434987897899979987631496789690157899976559998765323679343
2349986789245569109109694589879531459876542123456789999762198542387899532378989987698759865445789212
3498965678976678998999887678998952378997683012567890198951019653498978943489678998797643986776789101
4987654549797789456789998789987967456789794324778932987943434966579769894596559879898759997887893212
5698643235679896567899989899876798767898765446989993986799659899789656789689349765929898999998985543
6987654456998997678999978989765989898959898767897989985678969768997647898789234954310987894319976754
7898765769897898899998765678954578989431939878956879874789498756795438999892129865499876789423987976
8999879898756789910987654567893465678910123989543768953499319897976656796931012976987654597975699987
9998989987645699991296423458921234567891234599532359767988998969988768895432323987899543456797893499
9997698765436987889999101568953345798932359698763579899876797655399879996654435699998932345689932349
9876579876545696877898242679854656799985498987654578999754986543212989989766545998767891234579321098
9775454987679985656987656898765767899876997899786799999643497654523599978987699897658799545678932987
8654323498798974345798987999976898954989876899999899878932198976654569867899989654347678968799899876
6543212349987661256999098998989999743299987988899989768921019899767698754568979792124567899896799765
7684102478999543569892129897991987654368999876789878959432398798998979843979757989235678998975678976
8878523567987654799789246796510199875456798765198766698943497656789567959897646879345789597643467897
9865439798998786987678957895423469976788899854097954577894989899993469869765434567976898489932345699
6976598989459897976568978976534567897899998762196543456789878978932346979887123578987897567896556789
5987987978969989875459899987676699989998999973987654567899955767891237898765012356899998989997678998
4699876567898776984345789998787988878987998765698765678998643456899998999654323589999989794649789026
3498765456799665695656898999899867569876649976799876789987654667978789998765537678989976543239893245
2239875349896543469868976989998754398764534989890987997699768778965678999877645789667899694398999656
1099874235789662356989765678987654239973223498921298986543979899354567895988789897545798989987698787
2987663124578954967999854579998766345985104567892349897932989943213678934599996936435987879543459898
3976543023679869899898743498989897459876715779954556789893497654101289025698654321029976768932346999
9865432146789998789797654987678989968987896898767967896789589864262568934989896543198765457891097989
9876563237899987698689765976565679899998997999979878985679678987653478949876987654239985376789989674
5988678945999876576578996985434598778999698987989989764568989698754567899545799865349873265679976543
4399989856789986432456789543129987669899899996592099543456996549765678978426578976598762123457897632
3297798767899987964589899653298976545799998789439978432349897639876989764212376987679854348967898544
9975689899978998875678978969987895434598998677998764321298789321987899543101345698889975457898999656
8764789934569899876789467998976789321987797566899954210965678939998998654213456899999876567899789767
9643489946698797997892348987675699490196542365789854399899789998999897654338767998754988678925678979
8776567897997676798951257896544568989984321234698769988678991987898798965445698999543298789434567899
9887879999876545679432345986432345678976542345799998776589890976765679896676789989694349897547698998
6998999989987858989543456796543456789987653456967897655458789865454598779788895878989459987698789476
4239998975498767897654568987994579896498764878943498432345678986323989568999934567979598998789892345
5345987654329878969795979099876689965349876989432987651234789875459876479989423989867987989899954756
5467898743210989978976789123997791094234997896521098862345699986599765345678964698754346678999865677
6568929854332397899987898236789892989375698997432129877657789997989876234599879989543234598987987789
7679019965465456794598997545899919879986999989643334998779996899878987945789998767434123457896598892
8989998987698767893459989656898939767899898879965455799892025698767998986898987654321012356789439993
9797897698799988976569878967897898656789767767896566893943934599748799998967899976542153467899546789
5556986439999799897898769898956984345697656856789677892969895987635689869456789987654767578998958893
4349987746997689789997657799439876767987643447899789999898789997546789954347894398786777679997899932
4298987659876545678976546689323998998988532138967992398765678999869899875956901239898898789876689321
9987598767989756789683634578939889319875421012347890239854789998978954989898913398999989897664598910
8976459889899867897542123456998778929876732123456789398753678987989763098789994987999878976543767891
7984341996789978965432012359894567999998543234687893987654567896799862198697889996789767989432349943
6543210345678989997543143598763456789497654356798901999865678965679654297576678945678959876543998964
8765431256789899987656264598654567892398767467899219865976789954778976986464569123799643988999897895
9996932345698798999894347698765678901299978578989397654989899853567897985323678934895432499987656989
9889893476789577899975498979878789312987989989679986543296998762456789875412357895996591991298545678
9765789687895456789989569656989897993976593096578997410145699851267899965101345976789989789987656789
9896999798954345878999678948997976889998432123479994321234987540348999754212468897997875679898787898
9987979899999234569898789139986565678987643234567989932355699631259398767323456789966764598769898957
8998967999887956779789894398765454568998754645679878895456798743459219975456567898755323987654929346
7899543597676799898657999999654323456799876896998768789578899854598934989567778999544212598732101245
6789432976545678987545298898743212347913987939876456699789967967987895698779899989432103496543212356
5678943987435899998932187799993201237895698924954334578994359879896789789989999978999312987695323467
3567899876596910976543345698789513456987789939890123689965212996785678996490198969988924598987834678
2778943989989921297655456898689434589998999899789235789754329985634579987321987858877895989898945689
3469642498979892398986987996578995678919988689699946899866598764323789996469976646566789977659867792
6578931987656789989497899975434989789109876534587897896977899876545678987998765431345699867345978893
7989649896648799875398989764325678997219765423466798954989965998656789599869896542476789643236989954
8999798765536689953239579875537889765329899312345899653297543569767894469953987656789898754547897995
9212987654324567892123457986756999976434987501234999867898321349898902398654599877899999865679976789";
void Main()
{
var sMap = Input.Split("\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
sMap.Dump(); sMap.Length.Dump();
int[,] map = new int[sMap.Length, sMap.First().Length];
for (int y = 0; y < sMap.First().Length; y++)
{
for (int x = 0; x < sMap.Length; x++)
{
map[x, y] = int.Parse(sMap[x][y].ToString());
}
}
map.Dump();
bool[,] basinMap = new bool[map.GetLength(0), map.GetLength(1)];
for (int y = 0; y < basinMap.GetLength(0); y++)
{
for (int x = 0; x < basinMap.GetLength(1); x++)
{
basinMap[y, x] = map[y, x] < 9;
}
}
basinMap.Dump();
var sizes = GetBasinSizes(basinMap).OrderByDescending(s => s).ToList().Dump("Basin sizes");
sizes.Take(3).Aggregate((acc, next) => acc * next).Dump("Product of 3 largest basins");
}
IEnumerable<int> GetBasinSizes(bool[,] map)
{
int height = map.GetLength(0).Dump("Height");
int width = map.GetLength(1).Dump("Width");
bool[,] visited = new bool[height, width];
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
if (visited[y, x]) continue;
visited[y, x] = true;
int size = 0;
if (map[y, x]) size++;
else continue;
IEnumerable<(int y, int x)> Neighbors(int ny, int nx)
{
if (ny > 0 && !visited[ny - 1, nx] && map[ny - 1, nx])
yield return (ny - 1, nx);
if (ny < height - 1 && !visited[ny + 1, nx] && map[ny + 1, nx])
yield return (ny + 1, nx);
if (nx > 0 && !visited[ny, nx - 1] && map[ny, nx - 1])
yield return (ny, nx - 1);
if (nx < width - 1 && !visited[ny, nx + 1] && map[ny, nx + 1])
yield return (ny, nx + 1);
}
IEnumerable<(int y, int x)> MarkAndGetNext(IEnumerable<(int y, int x)> neighbors)
{
//visited.Dump();
//neighbors.Dump();
foreach (var n in neighbors)
{
n.ToString().Dump();
visited[n.y, n.x] = true;
size++;
foreach (var n2 in MarkAndGetNext(Neighbors(n.y, n.x)))
{
yield return n2;
}
}
}
var next = Neighbors(y, x);
while (next.Any())
{
next = MarkAndGetNext(next);
}
yield return size.Dump("Size");
}
}
visited.Dump();
}
string TestInput = @"
2199943210
3987894921
9856789892
8767896789
9899965678";
string Input = @"
9874321292198975458901239986401245679543234590129878943236789999863345679876578901978456778910976423
9965434789987854346893498793212357898753125789998767954345789987651266799765457899854234567899997910
9876545695986543234989987654323569999654247999898757895456793499540656989755348999765195678978999891
5988856894597654345678999876435678998765348998789546796569894568932349876543257998976989989569998789
6799768943498785656789456987545989579876456789689235689878965679899499986432167577989878993468987678
7999879894679896777892349987656993467987598996563124598989876799767989997621012356798767892389898465
9899998796789987888921298798867894678998789876432012457899987987655678998543143456789659910198764343
5789997689891298999210987689988965789469898765432123678989999876543568987654554567998799791999953212
4579886578910989434991396578999879894398979876543267989567789998712456999875665678929898679899999923
6797675487899876526889987467899989999987654998665348995434678939901267899988776899019976535678987899
8965452346789865435679876578999894698996543239765467894324579129894345678999988992198765324579876798
9894321257894976576789987889698743987989992123986567975434598999789966989129999789349896545698654567
6789432345995987987999999996569654596577889965987678996945997876567897891098945689467987657976543456
5678943489989998998999898995459875987465679896799789879899876743456789932987334999978998798989942465
4599976568978989999998767889310989876323568789989898965789985432579899949996229879899869939399861254
7678997679767869899987656778921299975212345679765977896895796431298989898765109768789654321298750123
8799398989756556799786545568942349954326656789763256789954989910987676789843297655678969572359842354
9892129996545445988654335459959498765545767899854345898769878899886545998764987643789998765498756878
3932099987632339876543212367898999876787878998765656789899765798765434899979843212456999879699867889
2393989998741024987543101234567899987899989659878767893987654597654323789998732104767898998789978998
1989878999843266898754215345788969998930296545989979992098543129973212679876543212378987679992989456
9876767998764356999865326456799457999321989432599898789198762098765323567999698345679996565894599568
8765659899875667899987547567892398998949878921398779564989654599896464778998796456789876434789798999
8954345799986878989798658789943456987894567892987654453578966789987975689999987967894989545678987989
7543234689498989877659879999654667976789779999876543212346987894398986799989598978943498956989876567
5432129795239998767545990198765678985678989998987662103567899999459997898765439989912987967898965475
6554578894346899843235689239876789876789697897998743215678912398967998999875323499899986898987893234
7685678965456987656123579345987899998993466976899764376789904987899899789996784789798765989656999645
9796789876767999764334989956798999659201245998939878988897899896789653678987895679679989878537898997
9898998989878998765445996898989998995313359899910989999976798765678932489899998789543298767423957989
3959987693989989876567895789978987989924599789892997896545987654687893599767999896532129854212345678
2348799432397879997678964598767576567895978656789765987659976743556789678956799974321045965102389789
0147698921236568998989532349754321389999767545699986798798765432345678989347899865432129873216578995
1234597990123459219297543498765410499997656434987897899979987631496789690157899976559998765323679343
2349986789245569109109694589879531459876542123456789999762198542387899532378989987698759865445789212
3498965678976678998999887678998952378997683012567890198951019653498978943489678998797643986776789101
4987654549797789456789998789987967456789794324778932987943434966579769894596559879898759997887893212
5698643235679896567899989899876798767898765446989993986799659899789656789689349765929898999998985543
6987654456998997678999978989765989898959898767897989985678969768997647898789234954310987894319976754
7898765769897898899998765678954578989431939878956879874789498756795438999892129865499876789423987976
8999879898756789910987654567893465678910123989543768953499319897976656796931012976987654597975699987
9998989987645699991296423458921234567891234599532359767988998969988768895432323987899543456797893499
9997698765436987889999101568953345798932359698763579899876797655399879996654435699998932345689932349
9876579876545696877898242679854656799985498987654578999754986543212989989766545998767891234579321098
9775454987679985656987656898765767899876997899786799999643497654523599978987699897658799545678932987
8654323498798974345798987999976898954989876899999899878932198976654569867899989654347678968799899876
6543212349987661256999098998989999743299987988899989768921019899767698754568979792124567899896799765
7684102478999543569892129897991987654368999876789878959432398798998979843979757989235678998975678976
8878523567987654799789246796510199875456798765198766698943497656789567959897646879345789597643467897
9865439798998786987678957895423469976788899854097954577894989899993469869765434567976898489932345699
6976598989459897976568978976534567897899998762196543456789878978932346979887123578987897567896556789
5987987978969989875459899987676699989998999973987654567899955767891237898765012356899998989997678998
4699876567898776984345789998787988878987998765698765678998643456899998999654323589999989794649789026
3498765456799665695656898999899867569876649976799876789987654667978789998765537678989976543239893245
2239875349896543469868976989998754398764534989890987997699768778965678999877645789667899694398999656
1099874235789662356989765678987654239973223498921298986543979899354567895988789897545798989987698787
2987663124578954967999854579998766345985104567892349897932989943213678934599996936435987879543459898
3976543023679869899898743498989897459876715779954556789893497654101289025698654321029976768932346999
9865432146789998789797654987678989968987896898767967896789589864262568934989896543198765457891097989
9876563237899987698689765976565679899998997999979878985679678987653478949876987654239985376789989674
5988678945999876576578996985434598778999698987989989764568989698754567899545799865349873265679976543
4399989856789986432456789543129987669899899996592099543456996549765678978426578976598762123457897632
3297798767899987964589899653298976545799998789439978432349897639876989764212376987679854348967898544
9975689899978998875678978969987895434598998677998764321298789321987899543101345698889975457898999656
8764789934569899876789467998976789321987797566899954210965678939998998654213456899999876567899789767
9643489946698797997892348987675699490196542365789854399899789998999897654338767998754988678925678979
8776567897997676798951257896544568989984321234698769988678991987898798965445698999543298789434567899
9887879999876545679432345986432345678976542345799998776589890976765679896676789989694349897547698998
6998999989987858989543456796543456789987653456967897655458789865454598779788895878989459987698789476
4239998975498767897654568987994579896498764878943498432345678986323989568999934567979598998789892345
5345987654329878969795979099876689965349876989432987651234789875459876479989423989867987989899954756
5467898743210989978976789123997791094234997896521098862345699986599765345678964698754346678999865677
6568929854332397899987898236789892989375698997432129877657789997989876234599879989543234598987987789
7679019965465456794598997545899919879986999989643334998779996899878987945789998767434123457896598892
8989998987698767893459989656898939767899898879965455799892025698767998986898987654321012356789439993
9797897698799988976569878967897898656789767767896566893943934599748799998967899976542153467899546789
5556986439999799897898769898956984345697656856789677892969895987635689869456789987654767578998958893
4349987746997689789997657799439876767987643447899789999898789997546789954347894398786777679997899932
4298987659876545678976546689323998998988532138967992398765678999869899875956901239898898789876689321
9987598767989756789683634578939889319875421012347890239854789998978954989898913398999989897664598910
8976459889899867897542123456998778929876732123456789398753678987989763098789994987999878976543767891
7984341996789978965432012359894567999998543234687893987654567896799862198697889996789767989432349943
6543210345678989997543143598763456789497654356798901999865678965679654297576678945678959876543998964
8765431256789899987656264598654567892398767467899219865976789954778976986464569123799643988999897895
9996932345698798999894347698765678901299978578989397654989899853567897985323678934895432499987656989
9889893476789577899975498979878789312987989989679986543296998762456789875412357895996591991298545678
9765789687895456789989569656989897993976593096578997410145699851267899965101345976789989789987656789
9896999798954345878999678948997976889998432123479994321234987540348999754212468897997875679898787898
9987979899999234569898789139986565678987643234567989932355699631259398767323456789966764598769898957
8998967999887956779789894398765454568998754645679878895456798743459219975456567898755323987654929346
7899543597676799898657999999654323456799876896998768789578899854598934989567778999544212598732101245
6789432976545678987545298898743212347913987939876456699789967967987895698779899989432103496543212356
5678943987435899998932187799993201237895698924954334578994359879896789789989999978999312987695323467
3567899876596910976543345698789513456987789939890123689965212996785678996490198969988924598987834678
2778943989989921297655456898689434589998999899789235789754329985634579987321987858877895989898945689
3469642498979892398986987996578995678919988689699946899866598764323789996469976646566789977659867792
6578931987656789989497899975434989789109876534587897896977899876545678987998765431345699867345978893
7989649896648799875398989764325678997219765423466798954989965998656789599869896542476789643236989954
8999798765536689953239579875537889765329899312345899653297543569767894469953987656789898754547897995
9212987654324567892123457986756999976434987501234999867898321349898902398654599877899999865679976789";
void Main()
{
var lines = Input.Split("\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
var badClosings = GetBadClosingCharacters(lines).Dump();
badClosings
.Select(tuple =>
tuple.actual switch
{
')' => 3,
']' => 57,
'}' => 1197,
'>' => 25137,
_ => throw new Exception("Unexpected char")
})
.Dump()
.Sum().Dump("Points");
}
Dictionary<char, char> Lookup { get; } = new Dictionary<char, char>()
{
['('] = ')',
['['] = ']',
['{'] = '}',
['<'] = '>'
};
IEnumerable<(int position, char expected, char actual)> GetBadClosingCharacters(IEnumerable<string> lines)
{
var stack = new Stack<char>();
foreach (var l in lines)
{
for (int i = 0; i < l.Length; i++)
{
char c = l[i];
if (Lookup.ContainsKey(c))
{
stack.Push(c);
}
else
{
char expectedOpening = stack.Peek();
if (Lookup[expectedOpening] == c)
{
stack.Pop();
continue;
}
yield return (i, Lookup[expectedOpening], c);
break;
}
}
}
}
string TestInput = @"
[({(<(())[]>[[{[]{<()<>>
[(()[<>])]({[<{<<[]>>(
{([(<{}[<>[]}>{[]{[(<()>
(((({<>}<{<{<>}{[]{[]{}
[[<[([]))<([[{}[[()]]]
[{[{({}]{}}([{[{{{}}([]
{<[[]]>}<{[{[{[]{()[[[]
[<(<(<(<{}))><([]([]()
<{([([[(<>()){}]>(<<{{
<{([{{}}[<[[[<>{}]]]>[]]";
string Input = @"
({<{({([<<{<[<<><>><<>>](<()()>)><{{{}<>}}<<<>{}>[<>[]]>>}{[<<[]{}>[<>()]>[(()[])]]<{{<><>}[[]<>]}{<
[(<[[([[(([<{{[]{}}([][])}<<{}[]>([]{})>><{<()()><[][]>}{[()]<()[]>}>]<{({()()}){[{}[]][<>()]}}[{[{}<>]
{{(<[[(<<<(<<[{}{}]{<>()}><{[]{}}([]{})>>([([][]){{}<>}][<()<>>[(){}]]))<{<(<>())[{}<>]>{{[]{}}<<>{}>}}({<
<([({[<[(([[<(()<>){[]<>}><<(){}>{()()}>]](<(({}[]){[][]})<{<>())[<>[]]>>{{{()<>}{(){}}}{[<>()]<{}[]>}
<(((<{<(<{{[[[()<>]{[]()}]][{<()[]><<>{}>}]}}[<{[{[][]}[<><>]]}{{{(){}}[<>()]}{[[]()]{<>[]}}}>{[({{}
{{({[({(({{[<[{}()]([]<>)><<{}()>[<>[]]>]<<{[]{}}([]<>)>{{<>}{<>{}}}}}{{<<[]<>>{<>()}>}<({[]<>}
(([{[(<(<[[(([()[]][{}()])(([][])<{}<>>))]]>)[<(<{{<<><>>(<>[])}<([]<>)[[]{}]>}((<{}[]>[<><>]){{[
{{[<<{<<(<([<<[]()>[[][]]>{[()[]]<()[]>}]){(<(<>{})([])>{<(){}>{<>()]}){[<[]()><<>()>](([][
((<{[{{(<<[(<{<>{}}[<>[]]>{<{}<>>{{}[]}})]>><{([<(<>())[{}()]>{<<>{}>{[]{}}}><([[]()]<[]<>>)(<[]>{()()})>)}>)
{<({{{(<[([<{(<>[])<()[]>}([[]]([]{}))>])[{{[([]){[]{}}]}}{[[{(){}}{<>{}}][[(){}]]]<([<>{}]{{}<>})(
([([{{{[[<<[[(()[])<<><>>]{({}[])}]((([]{})<<>>)({[]<>}[<>[]]))>{(({<>()})([{}[]]<()<>>)){[
{[<(({[<<{{{[({}[]){<>()}]{[()()]{[]()}}}[{<<><>>{<>[]}}<{()()}<()>>]}({<(<><>)[()[]]>([{}()])}{[(<>())(()
<{{[[<{{(<<{<[{}{}]<{}[]>>[{{}[]}[{}()]]}((<()()>{(){}})<((){})>)>[{<({})[[]{}]>([{}<>])}{{[{}()]}{<[
[{[<{<[[({([(<{}<>>[<>()])]<<<{}{}>({}<>)>>)<{(({}[])({}<>))}<{<[]>({}<>)}{{()()}([]())}>>}){<[<[[{}<>]<
{(<{{<{<<(<<<[{}{}]((){})>>{<<{}{}>{()[]}>}>)([({(<>())<<>()>>)(<<()[]>(<>())><<()()>({}())>)]{(<[<><
[{<{[<{([{[({<(){}>([]())}[<<>[]>([]())]){{<(){}>{{}[]}}<[()[]]({})]}](((<{}()>{{}()})))}[[(
<<[{{[<<(<{({{[]{}}{()()}}){<<{}()>({}<>)>(({}<>)[()<>])}}<[[([]{})[<><>]]]((<()()>{<>[]}){{[]{
[[({[({[([({{<[]{}>{(){}}}{[[][]][()()]}}[{<{}><{}()>}({()[]})]){{[[()<>]<[][]>][({}<>)]}}](<({<{}(
[[[((([((<{{[(<>())[{}[]]]{{<>{}}}}}>))<[[[({{{}{}}(()())})({([]{})[<><>]}[([]{}){()[]}])]<{<[{
[{[<[{{([[{(({()()}<{}[]>){{()<>}{{}()}})<<<{}[]>>{<<>[]><{}{}>}>}]{{{[{()()}[<>()}]{{{}}[(){}]}}}
[[{[(({[[[[{(<<>()>(<>()))[<{}[]>{[]<>}]}{{{()<>}<()()>}}]<[<([]<>}{<>[]}>]>](((<{()()}<()()>><<<>[]><<>
({[{({(<{((<<[()[]]<()<>>]<([][])>>[([{}()]<{}{}>){<{}{}>(()[])}])[{([<>()]{()[]}){[()[]]}}([{()<>}
[(({(([[{(<{{<[][]>(()()}}[({}[])]}[(<<>[]><()[]>)]>)<{({{[]{}}[()[]]}[<<>()>(()())])}{(((()[])<[]>)
<(<([[({[((((<{}[]>[{}{}]){[{}<>](<><>)})(([()<>]({})){[{}{}]{[]<>}}))[({(()[])<<>[]>}[[()<>]<()
{[(<<({([{[(<<[][]>(<>())>){<[<>()][[]{}]>(({}[])[(){}])}][(({{}<>}))(<[()()]<()()>>}]}{[{<(<>
[{{({<({<(<[[<{}<>>{()[]}][{()()}]]>){[<{{()[]}[{}()]}>([<()[]><{}<>>](<()[]>))]{[<[<><>]{<>[]}>[<()
{[<<[{<<[[(<(<[][]>[()()])>){<(([]()){{}[]})><<[{}()]<<>>>>}}[[([<{}[]><(){}>][({}())[()<>]])[[{<>[]
{((<[{{<{[<[((()<>)<()()>)]>]}>}((([{[[<<>[]>[[][]]]<[[]()]({}[])]]{[([]{}){()()}]}}<((<[]<
{[[({<{<<{<{{{[]{}}}}>}[[{(([][]){<>[]}){{()<>}}}<<<()[]>[{}[]]>>]<[{[()[]]({}{})}{[{}()]}]>]>>}>}<
[{[(<({{(<(([{()<>}{()<>}]{{[]}(()())]))>(<<{[<><>]<()<>>}[(<>{})<<>{}>]>[{{<>{}}{{}[]}}<[<
{{((<[(([<{{([()][(){}])({<>()}[()<>])}[{[{}<>]<()()>}<{{}}([]<>)>>}(<<[[]{}]<[]<>>>[([]()){[]{}}]>((<<>(
(<<<(<([<<({<<<><>>[{}<>]>{<()>([]<>)}}{{(<><>)}<{<>()}{{}()}>})<<<({}{})<[]<>>>>>]{({({[][]}[{}()])([<>()](
([(<<<(<(([([{<>{}}<(){}>](<{}<>>[{}{}]})][([<()>{{}[]}](<<>()><()[]>))[[{<>()}[<>[]]]{<<>[]>
(<{[[<<<({[<<([]())[()()]>([()[]]{<>{}})>]})[[{<[{<>()}({}{})><(()<>)([]{})>><<<<>()><<>()
[[[{(<[[((<[{<<>[]>({}[])}<[{}{}]{[]<>}>]<{({}{})}{[{}<>]{<><>}}>>([{[[]<>](()<>)}{{<>{}}(<>[]))]{[{{}{}}]})
[(<([[[{<[[<((()()){[][]})>((<{}[]>[()<>])<([]()){<>[]}>)]<<{<<><>>}{{(){}}}>>]<{[<<(){}>({}<>)><<<>()>([]<>
[<((<<[<{[{[{[()[]]{()<>}}(<<>()>[<>()])]}{<[[(){}]{(){}}]{[()]{<>[]}}>{{<[][]>[()()]}[(<>{
[({{([([{[[([<<>{}>[[]()]]({{}()}))][<{{()[]}}<<{}{}>>><[[{}[]][<>()]][{{}[]}(<>{}))>]][{((((){
((<<{(([[[{{<[()[]]({}())>}<[{(){}}]<({}{})<()[]>>>}{((<()<>>([]<>)){[()][()[]]})([{()}<[]{}>]<(<><>
<<<<[([<<(({<[[]()]<<><>>>({[][]})}{([<>{}]<<>()>){{[]{}}}})){[[[[[]{}][(){})]{(()[])(()<>)}]{{[[]<>][{}(
[({{([<{({{[{(()[])<<><>>}(((){})[<>()])>}{{{{{}<>}<{}[]>}{[(){}](()[])}}}}([(([<>{}](<>[]))
([(<({{(<<[([[<>][<>()]])<[{()[]}([]{})]{[()<>][[]{}]}>]><<{[{<><>}<()()>]{{<>[]}>}>>><[<{{
({{(([({{<[<[{{}{}}{{}<>}]((<>{})[[]<>])>(((<><>)<{}()>){{{}{}}{{}{}}})]({<{{}}([][])><<[]{}>
[(<{({{(<<<(<[{}[]]{(){}}>(([]()){<>[])))[{{[]{}}{()()}}{[<>{}][<>]}]>[((<{}<>>[<>[]])[({}[])<[]{}>])[<[{
[(<<<[<<({{{[[(){}]]{<<>{}>{()[]}}}{({<>{}}{[][]})}}{<([()[]]<{}<>>)([{}()]({}[]))>[(<<>()>{[]()})]}}{([{{(
{[{{(({[{<{{[[()<>]<[]<>>]({{}{}}[{}{}])}{(<<>[]>{[]})[[[]{}]{()<>}>}}{<<{{}{}}(()[])>>{{[[]()]
[<[[{(([<<[<[([][])<[]{}}]{<(){}>}>(<<()<>><[][]>><<{}[]>[{}()]>)]><([([[]<>](()[]))[(()<>)<(){}>]][({
<{{<([<([{{{(<[]{}>[[]{}])[{<>{}}([])]}}[<[<<><>>({}<>)]{((){})[[]<>]}><[{()[]}<<>{}>]{{()()
{[<<<([{([{<<(()[]){{}{}}>[(<>{}){{}()}]><[[{}<>][[]()]](<{}()>([]()))>}]){{<{<[()<>][<>()]><
<{[<<[([[{[({[[]<>](<>[])})({([]<>)<[]()>}<([]<>)[<>[]]>)]}[[{[{()<>}{<>{}}][<[]{}>(<>[])]}<({[]<>
[[[[([({(((<<[()<>]>[(()())]>{[{{}()}[[]()]]{[<>()]([][])}})))}(<({(({()[]}[<>()]))<[[()<>]]<{{}()}[()<>]
{[([([<[(<<[<[[]()]<[]<>>>][{<[][]>[<>()]}{({}<>)<()[]>}]><{({<>()}{<><>})<{(){}}({}{})>}<{(
<<({[<<{(<[<({{}[]}{<>[]})[<()()>]>(([<>()][<><>])(<<>{}><()[]>))](<[<{}<>>[{}[]]]({{}{}}(
[<<{<(([<[{(([()<>]({}{})){<<>[]>[()()]})({([])(<>())}[{[][]}[{}[]]])}{({(()())[()[]]}({[]<>}([][])))
((({<[{([(<[(<[]()>)](<[{}()]<[]{}>>(({}())<()[]>))>)[(<[([]<>)(<>{})]>)]][({({[()[]]{<>}}[[[]{}]{()[]}])([<<
[[[(({[<[((({([]){<>{}}})[[{()[]}[{}[]]][{[]<>}]])<<(<[]{}>[<>[]])[<[][]>[{}[]]]>>)[([{{<><>}[[][]]
({<(({{[{{<[((<>())(<>[]))<<<><>>((){})>]([<[][]><{}{}>][[{}()]<<>()>])>((<[[]()]([][])>[<{}[]>{
(({<<([[<[[{<[()()]<[][]}>[{(){}}[{}<>]]}(<{{}<>}{[]<>}>{<(){}>{<><>}})]<<{<<>[]>[<>[]]}{{
<[{([<[({<((<[{}()]([]<>))[(()[])])((({}{})<()<>>){(()<>)}))>{[<<[<>{}][(){}]>{<<><>>(<>[])}>{[
{[([[[{{<<[<<<()()>(()<>)>[({}{})[<>{}]]>([[[]<>]]{<<>>[[][]]})]><<[{(()[])][<()>[{}[]]]]<([{}{}][()<>])(
{(({{<<((<{<<<[]{}>{{}()}><<<>()><()[]>>><<[<>[]]](({}[])[[]{}])>}[[({<>()}{()}){[[]{}]({}())}
<[[{<[({<([<<<()<>>>>([[[]()]{<><>}](<<>[]>[<>]))])(({({[]{}}){{{}()}{(){}}}}[{(()<>)[[]()]}[{<>()}{[][]}]]))
{<[[([{<<<{{[<[]{}>[[]<>]]{({}())<[][]>}}<<<{}{}>>({(){}})>}([{({}())}<([]())[()()]>])>({{[[<>()]{{}{
<{(<[{[[{[<<<{(){}}[<>{}]>{{{}[]}<<>()>}>{[{[]()}<<>>]{<[]{}>[()()]}}>][[[{<<>())[[]<>]}<(<>
[{{<<{{([(<<{{{}}[()]}<(()())(<>())>>(<{[]()}[[]<>]>)>[((<()()><[]{}>}({[]<>}))(({[][]}{[]<>})<(()[])(()[]
([(<<[<{({[[[(()<>)<{}()>]{[{}()]{<>{}}}]{(<(){}>{{}[]}){<<><>><{}[]>}}]}<{[[[()()]{{}{}}]]
{<(((<({<((([<(){}>]){{{<><>}{{}()}}})({<[[]{}]>{({}())}}))>})([[<<<{[{}[]]{[]{}}}<{()<>}({}[])>>>{[
{([[{[[[<<<({{()<>}}(<[]<>>[<><>]))[[[[]<>][{}()]]]>{<<[<>()][[][]]](<{}{}>{[]{}})>[<(<>{}){<><>}>([{}[]]
[[{(<{{{<(<{[[{}()](()[])]}<<{(){}}[()[]]>{[()()]([]())}>>)>[(<<<{[][]}>>[{([][])[(){}]}[(<
<{[(<{<{(<<{<{()[]}(()[])>(([]<>)([]()))}>{((({}[]))<{[]()}{{}()>>)<{<(){}>}<{<>()}<()()>>
<(<[{{[[{<{[{[<>][<>[]]}]{[(<>[])][<{}{}>{<>}]}}(({[()<>]{[]<>}}<{(){}}[[]{}]>)([[<><>]<()()>]<({}[])([]())
{(<{[{[{({{(<<<>{}>><({}())(<>())>)}}{(<<<(){}>{(){}}>(<{}()>(<>()))><[{<>()}{{}()}][{[]<>}(()())]>){<[{{}[]
{[((((({<(([(<[]<>><[]<>>)<<{}()>>](<{()[]}(()<>)>{{{}{}}([]{})})))[<[{([])[<>]}(([]())<{}{}>]]{
(<{[((([{(<<{(()<>){{}[]}}>><<<({}<>)[[]()]>{(<>[])[()()]}>{{{<><>}([]())}}>)[{(([[]()][<>(
<[<<<[(<[[(<<([]{})>([[][]][{}{}])><[<<>[]>[{}[]]]<[<>][()()]>>)][[<<{()[]}(<><>)><<()()>[()<>]>>][{[{[]()
<<{([[<[[<[({[<>[]](()<>)}{({}[]){()[]}}){({{}[]}(<>()))}]<[[<[][]>[[]<>]]<[{}<>]<[]{}>>)>>]<
[((([[{<<[[<{{{}[]}[()<>]}>(<<{}{}>[(){}]>({<>[]}<{}<>>))][<{[{}<>]{[]}}>({[{}{}}[[][]]})]](({[{[][]}]{[{}
[([{<[[{<((<<{[]<>}(()<>)>>{(<<>{}>(()<>))}))[(<[[[][]][<>{}]]{[()[]](()())}><({{}{}}}[({}())]>
{{[({<(({{[({{[]()}<()<>>}{([]()){[]{}}}){[<<>>[<><>]][<{}<>><()[]>]}][{<({}{}><[][]>>{{{}()}<(){}>}}]}}))>}<
{[{[<{{({[({[[{}()][(){}]]{{[][]}<<>()>}}[[(<>[])<[]{}>]((<>[])[{}()])])]})}}>{({{<([{<([]())[{}{}]>{
<{{[{<{<<{{({<{}[]>[(){}]}[[<>()]{(){}}])}}[{{[(()<>)(<><>)]<{()<>}{<>()}>}{({[]()}{{}()})<{{
((((([{{<<[<({()<>}<<>{}))<{{}<>}(<>[])>>{<{(){}}[{}[]]>}]{<<[{}{}]>{{()()}[{}<>]}>}>>([[({(()())<()
(({{[[<[[<<<<<[]()>[{}<>]]>>({[<<><>><{}()>]{{(){}}[<>{}]}}[[([]<>)({}<>)]])>{<[[<{}[]><{}<>>][<<>[]>]](<<[]
<[<([<<[([[[[<{}[]><()>][(<>{}){[]}]]{({()[]}[<>{}])}]([((<>[])(<>[]))[{<>[]}{[]<>}]][(([]{})({}<>
<((<{{({{([<([<>{}](()()))<<(){}>[<>[]>>>({<<>>([]{})})]<[[([]())<<>>]{{<>{}}(()<>)}]>)<[(((<>)<{}<>>)({<>(
{({<({<<[[{[((<>())<()<>>)<(<>[])((){})>]({{[]()}[{}()]}[[{}{}]<{}[])])}({<[(){}](<><>)><{()<>}[{}[]
<[(<<[((([(([[[]<>][<><>]]{{{}{}}[{}[]]}){(({}())<[]{}>)})<(<(()[]){()()}>{<()>[[]{}]}){{[[]{}]([]<
{(<(([{[[<[[[{<>{}}{[]{}}]({(){}})]<[[()()]][[{}[]]]>]{<<{{}{}}[{}{}]>>[(<{}()>([]{}))(<(){}>{<><>}
((<<({({<{<<[<[]{}><()[]>]<(<>()){()[]}>>>}{(((({}<>)({}()))<{[]{}}<<>[]>>)<({[][]}<(){}>){
[[<{((({{{(<{[[]{}}{{}}}<{[]{}}<()>>>{<{{}[]}<[]()>>{[()[]]{[][]}}})([{[[][]]}(([]{})<<><>>)][(<[][]>{{}
(<({[{[(<<(((([]())[<><>]}([<><>]))<[[()<>]<<><>>]{<[]()>{()<>}}>)[<<{[]()}(())>><[<(){}><<>{}
(<<[<(<{<({<[{(){}}{<><>}][<<>()>]>}<[<[()[]]<{}[]>>]<<({}[]]><[[][]]<[]()>>>>)>}><[((<[<<[]<>>>[[<>()][{}(
[((<[{[[([{[[<<>>{<>()}]<[[]{}]<[]<>>>]}<({(()<>))<<<>()><<>[]>>)<{<[]{}>((){})}[({}[]){()()}]>
<<{{({{([{{<<{{}{}}(<>{})><{()()}[{}<>]>><{<[]<>>[[]()]}[<<><>>({})]>}(((<<>{}><{}{}>)([<>{}][{}]))[{";
void Main()
{
var lines = Input.Split("\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
var badClosings = GetBadClosingCharacters(lines).Dump();
var scores = badClosings
.Where(tuple => tuple.remainder is not null)
.Select(tuple => tuple.remainder
.Aggregate(seed: 0L, (acc, next) =>
acc * 5 + next switch
{
')' => 1,
']' => 2,
'}' => 3,
'>' => 4,
_ => throw new Exception("Unknown char")
}))
.Dump()
.OrderByDescending(s => s)
.ToList()
.Dump();
scores[scores.Count / 2].Dump("Middle score"); // not 672870911, too low
}
Dictionary<char, char> Lookup { get; } = new Dictionary<char, char>()
{
['('] = ')',
['['] = ']',
['{'] = '}',
['<'] = '>'
};
IEnumerable<(string line, int position, char expected, char actual, string remainder)> GetBadClosingCharacters(IEnumerable<string> lines)
{
var stack = new Stack<char>();
foreach (var l in lines)
{
for (int i = 0; i < l.Length; i++)
{
char c = l[i];
if (Lookup.ContainsKey(c))
{
stack.Push(c);
}
else
{
char expectedOpening = stack.Peek();
if (Lookup[expectedOpening] == c)
{
stack.Pop();
continue;
}
else
{
yield return (l, i, Lookup[expectedOpening], c, null);
stack.Clear();
break;
}
}
}
if (stack.Any())
{
yield return (l, 0, default, default, stack.Aggregate<char, string>(seed: "", (acc, next) => acc += Lookup[next].ToString()));
stack.Clear();
}
}
}
string TestInput = @"
[({(<(())[]>[[{[]{<()<>>
[(()[<>])]({[<{<<[]>>(
{([(<{}[<>[]}>{[]{[(<()>
(((({<>}<{<{<>}{[]{[]{}
[[<[([]))<([[{}[[()]]]
[{[{({}]{}}([{[{{{}}([]
{<[[]]>}<{[{[{[]{()[[[]
[<(<(<(<{}))><([]([]()
<{([([[(<>()){}]>(<<{{
<{([{{}}[<[[[<>{}]]]>[]]";
string Input = @"
({<{({([<<{<[<<><>><<>>](<()()>)><{{{}<>}}<<<>{}>[<>[]]>>}{[<<[]{}>[<>()]>[(()[])]]<{{<><>}[[]<>]}{<
[(<[[([[(([<{{[]{}}([][])}<<{}[]>([]{})>><{<()()><[][]>}{[()]<()[]>}>]<{({()()}){[{}[]][<>()]}}[{[{}<>]
{{(<[[(<<<(<<[{}{}]{<>()}><{[]{}}([]{})>>([([][]){{}<>}][<()<>>[(){}]]))<{<(<>())[{}<>]>{{[]{}}<<>{}>}}({<
<([({[<[(([[<(()<>){[]<>}><<(){}>{()()}>]](<(({}[]){[][]})<{<>())[<>[]]>>{{{()<>}{(){}}}{[<>()]<{}[]>}
<(((<{<(<{{[[[()<>]{[]()}]][{<()[]><<>{}>}]}}[<{[{[][]}[<><>]]}{{{(){}}[<>()]}{[[]()]{<>[]}}}>{[({{}
{{({[({(({{[<[{}()]([]<>)><<{}()>[<>[]]>]<<{[]{}}([]<>)>{{<>}{<>{}}}}}{{<<[]<>>{<>()}>}<({[]<>}
(([{[(<(<[[(([()[]][{}()])(([][])<{}<>>))]]>)[<(<{{<<><>>(<>[])}<([]<>)[[]{}]>}((<{}[]>[<><>]){{[
{{[<<{<<(<([<<[]()>[[][]]>{[()[]]<()[]>}]){(<(<>{})([])>{<(){}>{<>()]}){[<[]()><<>()>](([][
((<{[{{(<<[(<{<>{}}[<>[]]>{<{}<>>{{}[]}})]>><{([<(<>())[{}()]>{<<>{}>{[]{}}}><([[]()]<[]<>>)(<[]>{()()})>)}>)
{<({{{(<[([<{(<>[])<()[]>}([[]]([]{}))>])[{{[([]){[]{}}]}}{[[{(){}}{<>{}}][[(){}]]]<([<>{}]{{}<>})(
([([{{{[[<<[[(()[])<<><>>]{({}[])}]((([]{})<<>>)({[]<>}[<>[]]))>{(({<>()})([{}[]]<()<>>)){[
{[<(({[<<{{{[({}[]){<>()}]{[()()]{[]()}}}[{<<><>>{<>[]}}<{()()}<()>>]}({<(<><>)[()[]]>([{}()])}{[(<>())(()
<{{[[<{{(<<{<[{}{}]<{}[]>>[{{}[]}[{}()]]}((<()()>{(){}})<((){})>)>[{<({})[[]{}]>([{}<>])}{{[{}()]}{<[
[{[<{<[[({([(<{}<>>[<>()])]<<<{}{}>({}<>)>>)<{(({}[])({}<>))}<{<[]>({}<>)}{{()()}([]())}>>}){<[<[[{}<>]<
{(<{{<{<<(<<<[{}{}]((){})>>{<<{}{}>{()[]}>}>)([({(<>())<<>()>>)(<<()[]>(<>())><<()()>({}())>)]{(<[<><
[{<{[<{([{[({<(){}>([]())}[<<>[]>([]())]){{<(){}>{{}[]}}<[()[]]({})]}](((<{}()>{{}()})))}[[(
<<[{{[<<(<{({{[]{}}{()()}}){<<{}()>({}<>)>(({}<>)[()<>])}}<[[([]{})[<><>]]]((<()()>{<>[]}){{[]{
[[({[({[([({{<[]{}>{(){}}}{[[][]][()()]}}[{<{}><{}()>}({()[]})]){{[[()<>]<[][]>][({}<>)]}}](<({<{}(
[[[((([((<{{[(<>())[{}[]]]{{<>{}}}}}>))<[[[({{{}{}}(()())})({([]{})[<><>]}[([]{}){()[]}])]<{<[{
[{[<[{{([[{(({()()}<{}[]>){{()<>}{{}()}})<<<{}[]>>{<<>[]><{}{}>}>}]{{{[{()()}[<>()}]{{{}}[(){}]}}}
[[{[(({[[[[{(<<>()>(<>()))[<{}[]>{[]<>}]}{{{()<>}<()()>}}]<[<([]<>}{<>[]}>]>](((<{()()}<()()>><<<>[]><<>
({[{({(<{((<<[()[]]<()<>>]<([][])>>[([{}()]<{}{}>){<{}{}>(()[])}])[{([<>()]{()[]}){[()[]]}}([{()<>}
[(({(([[{(<{{<[][]>(()()}}[({}[])]}[(<<>[]><()[]>)]>)<{({{[]{}}[()[]]}[<<>()>(()())])}{(((()[])<[]>)
<(<([[({[((((<{}[]>[{}{}]){[{}<>](<><>)})(([()<>]({})){[{}{}]{[]<>}}))[({(()[])<<>[]>}[[()<>]<()
{[(<<({([{[(<<[][]>(<>())>){<[<>()][[]{}]>(({}[])[(){}])}][(({{}<>}))(<[()()]<()()>>}]}{[{<(<>
[{{({<({<(<[[<{}<>>{()[]}][{()()}]]>){[<{{()[]}[{}()]}>([<()[]><{}<>>](<()[]>))]{[<[<><>]{<>[]}>[<()
{[<<[{<<[[(<(<[][]>[()()])>){<(([]()){{}[]})><<[{}()]<<>>>>}}[[([<{}[]><(){}>][({}())[()<>]])[[{<>[]
{((<[{{<{[<[((()<>)<()()>)]>]}>}((([{[[<<>[]>[[][]]]<[[]()]({}[])]]{[([]{}){()()}]}}<((<[]<
{[[({<{<<{<{{{[]{}}}}>}[[{(([][]){<>[]}){{()<>}}}<<<()[]>[{}[]]>>]<[{[()[]]({}{})}{[{}()]}]>]>>}>}<
[{[(<({{(<(([{()<>}{()<>}]{{[]}(()())]))>(<<{[<><>]<()<>>}[(<>{})<<>{}>]>[{{<>{}}{{}[]}}<[<
{{((<[(([<{{([()][(){}])({<>()}[()<>])}[{[{}<>]<()()>}<{{}}([]<>)>>}(<<[[]{}]<[]<>>>[([]()){[]{}}]>((<<>(
(<<<(<([<<({<<<><>>[{}<>]>{<()>([]<>)}}{{(<><>)}<{<>()}{{}()}>})<<<({}{})<[]<>>>>>]{({({[][]}[{}()])([<>()](
([(<<<(<(([([{<>{}}<(){}>](<{}<>>[{}{}]})][([<()>{{}[]}](<<>()><()[]>))[[{<>()}[<>[]]]{<<>[]>
(<{[[<<<({[<<([]())[()()]>([()[]]{<>{}})>]})[[{<[{<>()}({}{})><(()<>)([]{})>><<<<>()><<>()
[[[{(<[[((<[{<<>[]>({}[])}<[{}{}]{[]<>}>]<{({}{})}{[{}<>]{<><>}}>>([{[[]<>](()<>)}{{<>{}}(<>[]))]{[{{}{}}]})
[(<([[[{<[[<((()()){[][]})>((<{}[]>[()<>])<([]()){<>[]}>)]<<{<<><>>}{{(){}}}>>]<{[<<(){}>({}<>)><<<>()>([]<>
[<((<<[<{[{[{[()[]]{()<>}}(<<>()>[<>()])]}{<[[(){}]{(){}}]{[()]{<>[]}}>{{<[][]>[()()]}[(<>{
[({{([([{[[([<<>{}>[[]()]]({{}()}))][<{{()[]}}<<{}{}>>><[[{}[]][<>()]][{{}[]}(<>{}))>]][{((((){
((<<{(([[[{{<[()[]]({}())>}<[{(){}}]<({}{})<()[]>>>}{((<()<>>([]<>)){[()][()[]]})([{()}<[]{}>]<(<><>
<<<<[([<<(({<[[]()]<<><>>>({[][]})}{([<>{}]<<>()>){{[]{}}}})){[[[[[]{}][(){})]{(()[])(()<>)}]{{[[]<>][{}(
[({{([<{({{[{(()[])<<><>>}(((){})[<>()])>}{{{{{}<>}<{}[]>}{[(){}](()[])}}}}([(([<>{}](<>[]))
([(<({{(<<[([[<>][<>()]])<[{()[]}([]{})]{[()<>][[]{}]}>]><<{[{<><>}<()()>]{{<>[]}>}>>><[<{{
({{(([({{<[<[{{}{}}{{}<>}]((<>{})[[]<>])>(((<><>)<{}()>){{{}{}}{{}{}}})]({<{{}}([][])><<[]{}>
[(<{({{(<<<(<[{}[]]{(){}}>(([]()){<>[])))[{{[]{}}{()()}}{[<>{}][<>]}]>[((<{}<>>[<>[]])[({}[])<[]{}>])[<[{
[(<<<[<<({{{[[(){}]]{<<>{}>{()[]}}}{({<>{}}{[][]})}}{<([()[]]<{}<>>)([{}()]({}[]))>[(<<>()>{[]()})]}}{([{{(
{[{{(({[{<{{[[()<>]<[]<>>]({{}{}}[{}{}])}{(<<>[]>{[]})[[[]{}]{()<>}>}}{<<{{}{}}(()[])>>{{[[]()]
[<[[{(([<<[<[([][])<[]{}}]{<(){}>}>(<<()<>><[][]>><<{}[]>[{}()]>)]><([([[]<>](()[]))[(()<>)<(){}>]][({
<{{<([<([{{{(<[]{}>[[]{}])[{<>{}}([])]}}[<[<<><>>({}<>)]{((){})[[]<>]}><[{()[]}<<>{}>]{{()()
{[<<<([{([{<<(()[]){{}{}}>[(<>{}){{}()}]><[[{}<>][[]()]](<{}()>([]()))>}]){{<{<[()<>][<>()]><
<{[<<[([[{[({[[]<>](<>[])})({([]<>)<[]()>}<([]<>)[<>[]]>)]}[[{[{()<>}{<>{}}][<[]{}>(<>[])]}<({[]<>
[[[[([({(((<<[()<>]>[(()())]>{[{{}()}[[]()]]{[<>()]([][])}})))}(<({(({()[]}[<>()]))<[[()<>]]<{{}()}[()<>]
{[([([<[(<<[<[[]()]<[]<>>>][{<[][]>[<>()]}{({}<>)<()[]>}]><{({<>()}{<><>})<{(){}}({}{})>}<{(
<<({[<<{(<[<({{}[]}{<>[]})[<()()>]>(([<>()][<><>])(<<>{}><()[]>))](<[<{}<>>[{}[]]]({{}{}}(
[<<{<(([<[{(([()<>]({}{})){<<>[]>[()()]})({([])(<>())}[{[][]}[{}[]]])}{({(()())[()[]]}({[]<>}([][])))
((({<[{([(<[(<[]()>)](<[{}()]<[]{}>>(({}())<()[]>))>)[(<[([]<>)(<>{})]>)]][({({[()[]]{<>}}[[[]{}]{()[]}])([<<
[[[(({[<[((({([]){<>{}}})[[{()[]}[{}[]]][{[]<>}]])<<(<[]{}>[<>[]])[<[][]>[{}[]]]>>)[([{{<><>}[[][]]
({<(({{[{{<[((<>())(<>[]))<<<><>>((){})>]([<[][]><{}{}>][[{}()]<<>()>])>((<[[]()]([][])>[<{}[]>{
(({<<([[<[[{<[()()]<[][]}>[{(){}}[{}<>]]}(<{{}<>}{[]<>}>{<(){}>{<><>}})]<<{<<>[]>[<>[]]}{{
<[{([<[({<((<[{}()]([]<>))[(()[])])((({}{})<()<>>){(()<>)}))>{[<<[<>{}][(){}]>{<<><>>(<>[])}>{[
{[([[[{{<<[<<<()()>(()<>)>[({}{})[<>{}]]>([[[]<>]]{<<>>[[][]]})]><<[{(()[])][<()>[{}[]]]]<([{}{}][()<>])(
{(({{<<((<{<<<[]{}>{{}()}><<<>()><()[]>>><<[<>[]]](({}[])[[]{}])>}[[({<>()}{()}){[[]{}]({}())}
<[[{<[({<([<<<()<>>>>([[[]()]{<><>}](<<>[]>[<>]))])(({({[]{}}){{{}()}{(){}}}}[{(()<>)[[]()]}[{<>()}{[][]}]]))
{<[[([{<<<{{[<[]{}>[[]<>]]{({}())<[][]>}}<<<{}{}>>({(){}})>}([{({}())}<([]())[()()]>])>({{[[<>()]{{}{
<{(<[{[[{[<<<{(){}}[<>{}]>{{{}[]}<<>()>}>{[{[]()}<<>>]{<[]{}>[()()]}}>][[[{<<>())[[]<>]}<(<>
[{{<<{{([(<<{{{}}[()]}<(()())(<>())>>(<{[]()}[[]<>]>)>[((<()()><[]{}>}({[]<>}))(({[][]}{[]<>})<(()[])(()[]
([(<<[<{({[[[(()<>)<{}()>]{[{}()]{<>{}}}]{(<(){}>{{}[]}){<<><>><{}[]>}}]}<{[[[()()]{{}{}}]]
{<(((<({<((([<(){}>]){{{<><>}{{}()}}})({<[[]{}]>{({}())}}))>})([[<<<{[{}[]]{[]{}}}<{()<>}({}[])>>>{[
{([[{[[[<<<({{()<>}}(<[]<>>[<><>]))[[[[]<>][{}()]]]>{<<[<>()][[][]]](<{}{}>{[]{}})>[<(<>{}){<><>}>([{}[]]
[[{(<{{{<(<{[[{}()](()[])]}<<{(){}}[()[]]>{[()()]([]())}>>)>[(<<<{[][]}>>[{([][])[(){}]}[(<
<{[(<{<{(<<{<{()[]}(()[])>(([]<>)([]()))}>{((({}[]))<{[]()}{{}()>>)<{<(){}>}<{<>()}<()()>>
<(<[{{[[{<{[{[<>][<>[]]}]{[(<>[])][<{}{}>{<>}]}}(({[()<>]{[]<>}}<{(){}}[[]{}]>)([[<><>]<()()>]<({}[])([]())
{(<{[{[{({{(<<<>{}>><({}())(<>())>)}}{(<<<(){}>{(){}}>(<{}()>(<>()))><[{<>()}{{}()}][{[]<>}(()())]>){<[{{}[]
{[((((({<(([(<[]<>><[]<>>)<<{}()>>](<{()[]}(()<>)>{{{}{}}([]{})})))[<[{([])[<>]}(([]())<{}{}>]]{
(<{[((([{(<<{(()<>){{}[]}}>><<<({}<>)[[]()]>{(<>[])[()()]}>{{{<><>}([]())}}>)[{(([[]()][<>(
<[<<<[(<[[(<<([]{})>([[][]][{}{}])><[<<>[]>[{}[]]]<[<>][()()]>>)][[<<{()[]}(<><>)><<()()>[()<>]>>][{[{[]()
<<{([[<[[<[({[<>[]](()<>)}{({}[]){()[]}}){({{}[]}(<>()))}]<[[<[][]>[[]<>]]<[{}<>]<[]{}>>)>>]<
[((([[{<<[[<{{{}[]}[()<>]}>(<<{}{}>[(){}]>({<>[]}<{}<>>))][<{[{}<>]{[]}}>({[{}{}}[[][]]})]](({[{[][]}]{[{}
[([{<[[{<((<<{[]<>}(()<>)>>{(<<>{}>(()<>))}))[(<[[[][]][<>{}]]{[()[]](()())}><({{}{}}}[({}())]>
{{[({<(({{[({{[]()}<()<>>}{([]()){[]{}}}){[<<>>[<><>]][<{}<>><()[]>]}][{<({}{}><[][]>>{{{}()}<(){}>}}]}}))>}<
{[{[<{{({[({[[{}()][(){}]]{{[][]}<<>()>}}[[(<>[])<[]{}>]((<>[])[{}()])])]})}}>{({{<([{<([]())[{}{}]>{
<{{[{<{<<{{({<{}[]>[(){}]}[[<>()]{(){}}])}}[{{[(()<>)(<><>)]<{()<>}{<>()}>}{({[]()}{{}()})<{{
((((([{{<<[<({()<>}<<>{}))<{{}<>}(<>[])>>{<{(){}}[{}[]]>}]{<<[{}{}]>{{()()}[{}<>]}>}>>([[({(()())<()
(({{[[<[[<<<<<[]()>[{}<>]]>>({[<<><>><{}()>]{{(){}}[<>{}]}}[[([]<>)({}<>)]])>{<[[<{}[]><{}<>>][<<>[]>]](<<[]
<[<([<<[([[[[<{}[]><()>][(<>{}){[]}]]{({()[]}[<>{}])}]([((<>[])(<>[]))[{<>[]}{[]<>}]][(([]{})({}<>
<((<{{({{([<([<>{}](()()))<<(){}>[<>[]>>>({<<>>([]{})})]<[[([]())<<>>]{{<>{}}(()<>)}]>)<[(((<>)<{}<>>)({<>(
{({<({<<[[{[((<>())<()<>>)<(<>[])((){})>]({{[]()}[{}()]}[[{}{}]<{}[])])}({<[(){}](<><>)><{()<>}[{}[]
<[(<<[((([(([[[]<>][<><>]]{{{}{}}[{}[]]}){(({}())<[]{}>)})<(<(()[]){()()}>{<()>[[]{}]}){{[[]{}]([]<
{(<(([{[[<[[[{<>{}}{[]{}}]({(){}})]<[[()()]][[{}[]]]>]{<<{{}{}}[{}{}]>>[(<{}()>([]{}))(<(){}>{<><>}
((<<({({<{<<[<[]{}><()[]>]<(<>()){()[]}>>>}{(((({}<>)({}()))<{[]{}}<<>[]>>)<({[][]}<(){}>){
[[<{((({{{(<{[[]{}}{{}}}<{[]{}}<()>>>{<{{}[]}<[]()>>{[()[]]{[][]}}})([{[[][]]}(([]{})<<><>>)][(<[][]>{{}
(<({[{[(<<(((([]())[<><>]}([<><>]))<[[()<>]<<><>>]{<[]()>{()<>}}>)[<<{[]()}(())>><[<(){}><<>{}
(<<[<(<{<({<[{(){}}{<><>}][<<>()>]>}<[<[()[]]<{}[]>>]<<({}[]]><[[][]]<[]()>>>>)>}><[((<[<<[]<>>>[[<>()][{}(
[((<[{[[([{[[<<>>{<>()}]<[[]{}]<[]<>>>]}<({(()<>))<<<>()><<>[]>>)<{<[]{}>((){})}[({}[]){()()}]>
<<{{({{([{{<<{{}{}}(<>{})><{()()}[{}<>]>><{<[]<>>[[]()]}[<<><>>({})]>}(((<<>{}><{}{}>)([<>{}][{}]))[{";
void Main()
{
var sOctos = Input.Split("\n", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)
.Select(l => l.Select(c => int.Parse(c.ToString())).ToArray()).ToArray();
int[,] octos = new int[10, 10];
for (int y = 0; y < 10; y++)
{
for (int x = 0; x < 10; x++)
{
octos[y, x] = sOctos[y][x];
}
}
octos.Dump();
int totalFlashes = 0;
for (int steps = 0; steps < 100; steps++)
{
int flashes = Step(octos);
octos.Dump();
flashes.Dump();
totalFlashes += flashes;
//octos.Cast<int>().Count(o => o == 0).Dump();
}
totalFlashes.Dump();
}
int Step(int[,] octos)
{
int totalFlashes = 0;
for (int y = 0; y < 10; y++)
{
for (int x = 0; x < 10; x++)
{
int Next(int ny, int nx)
{
int flashes = 0;
if (++octos[ny, nx] == 10)
{
//octos[ny, nx] = 0;
flashes++;
int Access(int oy, int ox) => ((oy >= 0 && oy < 10) && (ox >= 0 && ox < 10)) ? Next(oy, ox) : 0;
flashes
+= Access(ny - 1, nx - 1)
+ Access(ny - 1, nx)
+ Access(ny - 1, nx + 1)
+ Access(ny, nx - 1)
+ Access(ny, nx + 1)
+ Access(ny + 1, nx - 1)
+ Access(ny + 1, nx)
+ Access(ny + 1, nx + 1);
}
return flashes;
}
totalFlashes += Next(y, x);
}
}
// Clean up flashed octos
for (int y = 0; y < 10; y++)
{
for (int x = 0; x < 10; x++)
{
if (octos[y, x] >= 10)
{
octos[y, x] = 0;
}
}
}
return totalFlashes;
}
string TestInput = @"
5483143223
2745854711
5264556173
6141336146
6357385478
4167524645
2176841721
6882881134
4846848554
5283751526";
string Input = @"
1172728874
6751454281
2612343533
1884877511
7574346247
2117413745
7766736517
4331783444
4841215828
6857766273";
void Main()
{
var sOctos = Input.Split("\n", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)
.Select(l => l.Select(c => int.Parse(c.ToString())).ToArray()).ToArray();
int[,] octos = new int[10, 10];
for (int y = 0; y < 10; y++)
{
for (int x = 0; x < 10; x++)
{
octos[y, x] = sOctos[y][x];
}
}
octos.Dump();
for (int steps = 0; ; steps++)
{
int flashes = Step(octos);
octos.Dump();
flashes.Dump();
if (flashes == 10 * 10)
{
(steps + 1).Dump("Steps"); // not 228
break;
}
}
}
int Step(int[,] octos)
{
int totalFlashes = 0;
for (int y = 0; y < 10; y++)
{
for (int x = 0; x < 10; x++)
{
int Next(int ny, int nx)
{
int flashes = 0;
if (++octos[ny, nx] == 10)
{
//octos[ny, nx] = 0;
flashes++;
int Access(int oy, int ox) => ((oy >= 0 && oy < 10) && (ox >= 0 && ox < 10)) ? Next(oy, ox) : 0;
flashes
+= Access(ny - 1, nx - 1)
+ Access(ny - 1, nx)
+ Access(ny - 1, nx + 1)
+ Access(ny, nx - 1)
+ Access(ny, nx + 1)
+ Access(ny + 1, nx - 1)
+ Access(ny + 1, nx)
+ Access(ny + 1, nx + 1);
}
return flashes;
}
totalFlashes += Next(y, x);
}
}
// Clean up flashed octos
for (int y = 0; y < 10; y++)
{
for (int x = 0; x < 10; x++)
{
if (octos[y, x] >= 10)
{
octos[y, x] = 0;
}
}
}
return totalFlashes;
}
string TestInput = @"
5483143223
2745854711
5264556173
6141336146
6357385478
4167524645
2176841721
6882881134
4846848554
5283751526";
string Input = @"
1172728874
6751454281
2612343533
1884877511
7574346247
2117413745
7766736517
4331783444
4841215828
6857766273";
void Main()
{
var sCaves = Input.Split("\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
.Select(l =>
{
var s = l.Split('-');
return (s[0], s[1]);
}).Dump();
var connections = new Dictionary<string, List<string>>();
void AddConnection(string key, string value)
{
if (!connections.TryGetValue(key, out var list))
{
connections[key] = new List<string>();
}
connections[key].Add(value);
}
foreach (var sc in sCaves)
{
AddConnection(sc.Item1, sc.Item2);
AddConnection(sc.Item2, sc.Item1);
}
foreach (var lists in connections.Values)
{
lists.Sort((x, y) =>
{
if (x == "start") return -1;
if (y == "start") return 1;
if (x == "end") return 1;
if (y == "end") return -1;
return StringComparer.Ordinal.Compare(x, y);
});
}
connections.Dump();
var paths = GetPaths(connections).ToList();
paths.Select(p => p.ToString()).Dump();
paths.Count.Dump("Count");
}
IEnumerable<Path> GetPaths(Dictionary<string, List<string>> connections)
{
var paths = new List<Path>();
var position = new Stack<string>();
void Visit(string cave)
{
position.Push(cave);
foreach (var nextCave in connections[cave])
{
if (nextCave == "start")
{
continue;
}
else if (nextCave == "end")
{
position.Push(nextCave);
paths.Add(new Path(position.Reverse()));
position.Pop();
break;
}
else if (char.IsLower(nextCave[0]))
{
if (position.Contains(nextCave))
{
continue;
}
}
Visit(nextCave);
}
position.Pop();
}
Visit("start");
return paths;
}
class Path
{
public Path(IEnumerable<string> caves) => _caves = new List<string>(caves);
private readonly List<string> _caves;
public override string ToString() => _caves.Aggregate(string.Empty, (acc, next) => $"{acc},{next}").TrimStart(',');
}
string TestInput = @"
start-A
start-b
A-c
A-b
b-d
A-end
b-end";
string TestInput2 = @"
dc-end
HN-start
start-kj
dc-start
dc-HN
LN-dc
HN-end
kj-sa
kj-HN
kj-dc";
string TestInput3 = @"
fs-end
he-DX
fs-he
start-DX
pj-DX
end-zg
zg-sl
zg-pj
pj-he
RW-he
fs-DX
pj-RW
zg-RW
start-pj
he-WI
zg-he
pj-fs
start-RW";
string Input = @"
BC-gt
gt-zf
end-KH
end-BC
so-NL
so-ly
start-BC
NL-zf
end-LK
LK-so
ly-KH
NL-bt
gt-NL
start-zf
so-zf
ly-BC
BC-zf
zf-ly
ly-NL
ly-LK
IA-bt
bt-so
ui-KH
gt-start
KH-so";
void Main()
{
var sCaves = Input.Split("\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
.Select(l =>
{
var s = l.Split('-');
return (s[0], s[1]);
}).Dump();
var connections = new Dictionary<string, List<string>>();
void AddConnection(string key, string value)
{
if (!connections.TryGetValue(key, out var list))
{
connections[key] = new List<string>();
}
connections[key].Add(value);
}
foreach (var sc in sCaves)
{
AddConnection(sc.Item1, sc.Item2);
AddConnection(sc.Item2, sc.Item1);
}
foreach (var lists in connections.Values)
{
lists.Sort((x, y) =>
{
if (x == "start") return -1;
if (y == "start") return 1;
if (x == "end") return 1;
if (y == "end") return -1;
return StringComparer.Ordinal.Compare(x, y);
});
}
connections.Dump();
var paths = GetPaths(connections).ToList();
paths.Select(p => p.ToString()).Dump();
paths.Count.Dump("Count");
}
IEnumerable<Path> GetPaths(Dictionary<string, List<string>> connections)
{
var paths = new List<Path>();
var position = new Stack<string>();
void Visit(string cave)
{
position.Push(cave);
foreach (var nextCave in connections[cave])
{
if (nextCave == "start")
{
continue;
}
else if (nextCave == "end")
{
position.Push(nextCave);
paths.Add(new Path(position.Reverse()));
position.Pop();
break;
}
else if (char.IsLower(nextCave[0]))
{
if (position.Where(p => char.IsLower(p[0])).GroupBy(p => p).Any(g => g.Count() == 2)
&& position.Contains(nextCave))
{
continue;
}
}
Visit(nextCave);
}
position.Pop();
}
Visit("start");
return paths;
}
class Path
{
public Path(IEnumerable<string> caves) => _caves = new List<string>(caves);
private readonly List<string> _caves;
public override string ToString() => _caves.Aggregate(string.Empty, (acc, next) => $"{acc},{next}").TrimStart(',');
}
string TestInput = @"
start-A
start-b
A-c
A-b
b-d
A-end
b-end";
string TestInput2 = @"
dc-end
HN-start
start-kj
dc-start
dc-HN
LN-dc
HN-end
kj-sa
kj-HN
kj-dc";
string TestInput3 = @"
fs-end
he-DX
fs-he
start-DX
pj-DX
end-zg
zg-sl
zg-pj
pj-he
RW-he
fs-DX
pj-RW
zg-RW
start-pj
he-WI
zg-he
pj-fs
start-RW";
string Input = @"
BC-gt
gt-zf
end-KH
end-BC
so-NL
so-ly
start-BC
NL-zf
end-LK
LK-so
ly-KH
NL-bt
gt-NL
start-zf
so-zf
ly-BC
BC-zf
zf-ly
ly-NL
ly-LK
IA-bt
bt-so
ui-KH
gt-start
KH-so";
void Main()
{
var sIn = Input.Split("\r\n\r\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).Dump();
var points = sIn[0].Split("\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
.Select(l => l.Split(','))
.Select(sp => new Point(int.Parse(sp[1]), int.Parse(sp[0])))
.ToList().Dump();
var folds = sIn[1].Split("\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
.Select(l => l.Split('='))
.Select(sp => new Fold(int.Parse(sp[1]), isHoriz: sp[0].Last() == 'y'))
.ToList().Dump();
//PaintGrid(points).Dump();
//PaintGrid(FoldPoints(points, folds[0])).Dump();
//PaintGrid(FoldPoints(FoldPoints(points, folds[0]), folds[1])).Dump();
FoldPoints(points, folds[0]).Distinct().Count().Dump("Dots");
}
char[,] PaintGrid(IEnumerable<Point> points)
{
var grid = MakeGrid(points.Max(p => p.y) + 1, points.Max(p => p.x) + 1, '.');
foreach (var p in points)
{
grid[p.y, p.x] = '#';
}
return grid;
}
T[,] MakeGrid<T>(int height, int width, T fill)
{
var grid = new T[height, width];
for (int y = 0; y < grid.GetLength(0); y++)
{
for (int x = 0; x < grid.GetLength(1); x++)
{
grid[y, x] = fill;
}
}
return grid;
}
IEnumerable<Point> FoldPoints(IEnumerable<Point> points, Fold fold)
{
foreach (var p in points)
{
if (fold.isHoriz)
{
int newY = (p.y < fold.line) ? p.y : (fold.line - (p.y - fold.line));
yield return p with { y = newY };
}
else
{
int newX = (p.x < fold.line) ? p.x : (fold.line - (p.x - fold.line));
yield return p with { x = newX };
}
}
}
record Point(int y, int x);
record Fold(int line, bool isHoriz);
string TestInput = @"
6,10
0,14
9,10
0,3
10,4
4,11
6,0
6,12
4,1
0,13
10,12
3,4
3,0
8,4
1,10
2,14
8,10
9,0
fold along y=7
fold along x=5";
string Input = @"
1118,85
1064,690
560,670
68,446
769,668
88,219
120,255
925,879
112,512
1064,652
1046,233
902,417
523,33
1012,280
1210,135
410,142
689,497
698,211
981,259
465,610
689,621
1093,887
114,728
790,809
139,59
798,257
390,457
482,281
701,190
840,283
320,723
498,504
256,397
100,115
401,92
796,780
239,729
755,539
736,870
676,567
484,560
405,511
187,387
356,155
42,659
182,508
256,374
572,320
738,207
328,80
70,528
1111,752
648,54
33,308
716,704
701,798
700,324
10,260
1076,401
554,533
592,885
269,575
492,528
646,837
1134,268
1290,619
442,248
549,519
908,647
402,280
1081,428
768,575
1277,525
472,121
985,635
912,374
512,499
708,807
1054,558
305,856
401,756
8,53
1044,256
607,581
156,840
756,331
771,609
276,456
1268,842
1123,387
155,526
1125,380
612,52
864,772
572,126
1084,597
666,397
574,169
33,481
1098,280
468,215
370,3
639,204
1230,466
512,684
705,161
738,126
355,376
1096,736
1166,476
1036,135
912,782
947,32
636,50
623,250
1257,215
416,672
989,74
1300,852
776,659
1196,838
1064,304
252,471
994,410
459,33
567,361
489,159
1240,528
58,506
944,339
788,0
319,857
644,215
787,33
1198,767
798,843
920,233
760,411
1300,626
52,311
812,558
378,227
226,437
386,444
169,291
308,172
698,618
514,231
761,235
157,774
798,684
902,29
428,37
698,52
405,383
1104,256
1058,784
299,518
617,332
346,498
1178,89
1290,275
1196,166
293,425
895,567
1034,662
596,56
687,250
534,255
623,698
1309,719
92,347
226,297
736,253
497,155
736,528
776,780
223,42
465,732
900,53
493,411
909,838
542,512
385,659
537,590
1228,80
420,462
761,519
879,852
1277,693
908,838
890,324
1092,383
691,862
602,378
416,224
296,598
666,215
234,347
902,142
1101,253
581,362
316,567
28,255
929,824
117,77
848,515
701,704
1136,233
485,680
1233,511
788,357
246,304
500,505
1144,63
738,320
964,620
623,413
26,495
58,390
82,590
930,311
239,578
748,784
873,518
385,879
311,242
1036,666
1230,641
1032,224
80,325
1233,383
1290,171
31,413
1076,493
402,838
731,690
977,522
92,36
144,476
520,365
428,396
1196,390
100,149
818,752
142,637
21,882
295,61
631,435
731,204
676,584
68,448
748,544
560,224
1,719
683,152
490,590
909,373
517,568
967,690
1015,450
1092,175
729,532
676,248
912,858
1180,0
174,233
73,586
403,292
325,635
308,474
733,511
38,787
278,222
562,36
485,603
296,822
428,149
433,494
1240,120
136,175
1240,366
1240,774
485,214
73,745
668,364
1071,119
185,514
882,268
544,614
540,838
139,773
1005,236
156,280
1290,584
813,155
209,826
773,572
715,852
11,700
562,350
209,701
293,33
117,301
1248,710
343,690
274,359
1146,646
930,666
189,162
161,383
485,291
912,558
252,784
1237,745
35,32
105,235
760,483
62,821
977,372
366,591
221,848
120,108
991,857
909,381
355,518
316,791
445,583
422,710
510,508
52,516
349,236
277,201
276,662
676,758
502,455
353,844
415,316
28,404
498,558
554,107
1101,701
935,873
865,701
1071,327
497,409
756,626
1272,555
1118,851
1073,280
385,463
954,827
1048,845
402,59
602,807
577,511
234,509
642,880
97,428
705,226
73,532
1179,33
74,87
226,361
256,484
1154,280
989,887
982,696
977,74
566,51
480,45
398,72
142,283
848,851
957,844
390,233
999,242
366,339
776,255
1096,830
845,162
403,826
1078,264
274,666
622,506
70,366
64,49
579,690
373,490
738,350
667,362
134,591
1064,808
438,212
53,215
226,533
359,416
989,603
1262,357
1096,64
701,544
890,570
358,296
821,175
851,33
356,826
1094,212
1213,428
596,390
1066,814
80,466
273,824
35,862
877,235
484,616
103,42
1181,810
385,435
768,736
1289,539
1173,568
760,847
826,726
808,631
714,388
274,135
900,752
808,263
810,57
468,887
38,824
907,826
1277,586
33,362
497,215
912,820
1054,397
512,658
64,497
410,814
689,301
756,533
1029,311
470,891
525,84
1002,474
540,248
664,501
912,72
70,8
353,162
1155,368
156,558
808,487
156,54
1300,260
192,67
33,273
338,266
909,92
117,814
1158,36
356,778
1258,516
1066,798
957,162
1228,768
361,469
157,215
810,505
687,413
335,37
1058,23
920,498
714,623
1282,137
1202,413
1076,122
251,327
310,469
1190,108
687,385
621,593
403,567
623,196
882,793
1228,590
408,477
296,72
114,248
808,256
469,828
825,456
718,9
1071,165
301,550
1169,882
1041,459
944,303
560,710
522,357
338,215
537,145
687,698
972,215
328,814
1265,404
321,74
909,597
1242,448
33,525
120,786
684,379
164,248
537,817
1158,401
329,259
349,210
1190,3
550,847
649,522
276,214
933,609
1248,73
542,158
842,332
842,108
726,366
1054,334
1168,645
252,871
681,792
602,29
1141,291
912,385
462,379
1174,495
633,38
20,310
1193,814
169,774
643,252
554,779
1002,722
1258,67
298,378
1054,547
502,858
1126,89
333,74
1014,520
1081,690
45,796
1081,466
146,469
909,166
902,752
1250,32
663,409
131,861
840,197
174,45
152,858
186,679
74,59
164,590
622,394
964,396
141,882
1153,663
584,8
909,728
321,7
1222,135
277,693
252,423
890,509
162,287
1071,266
110,627
305,38
1275,862
298,166
838,569
1054,484
493,595
110,491
381,455
572,687
70,120
773,817
229,204
566,135
18,50
114,390
565,26
902,466
1135,674
308,26
1210,485
502,493
944,555
256,560
1153,774
865,68
28,137
184,197
962,809
894,222
634,567
622,58
808,183
539,285
1277,397
522,537
112,158
1136,661
114,646
1200,280
1263,89
356,827
87,640
462,809
21,539
52,378
771,285
293,273
246,735
564,772
714,390
565,868
401,597
1034,438
621,621
1154,838
92,99
1300,186
1237,532
321,603
664,837
445,193
1092,831
234,401
100,745
1258,378
1198,127
550,411
1034,456
112,127
11,194
730,535
872,614
977,455
1174,719
937,190
950,836
237,280
661,344
246,204
1193,301
165,383
164,764
1009,102
994,268
373,190
1174,175
62,73
907,567
356,728
120,3
1252,56
209,641
113,226
821,595
738,277
1176,533
1009,498
687,196
1278,52
1179,861
502,519
1076,547
1169,12
882,37
244,814
661,550
925,659
1171,59
339,362
1076,285
1084,533
1210,745
808,519
764,749
689,273
1092,511
514,332
398,173
1014,72
401,138
1190,255
1250,862
622,388
687,478
333,372
370,190
694,385
1124,556
1056,749
649,792
154,729
301,844
329,635
58,838
940,190
281,641
515,387
813,215
841,262
617,556
1230,204
930,379
1012,291
1218,795
428,268
21,486
185,380
1029,583
315,586
281,583
100,268
1088,859
971,308
88,395
597,207
621,273
10,186
370,704
714,504
427,770
256,385
1218,544
485,829
59,318
744,135
160,607
972,716
440,736
291,862
20,584
840,891
294,500
920,457
776,639
679,435
276,227
1123,835
216,491
410,53
646,841
513,12
32,282
643,700
1158,455
1171,773
216,212
0,287
146,425
380,807
1138,57
932,227
555,539
21,42
346,396
688,282
385,431
398,273
428,857
132,313
540,646
52,827
161,859
1037,439
641,446
574,477
281,311
1198,158
1200,715
70,558
139,387
932,848
744,311
1002,172
964,26
169,120
301,498
642,364
580,731
909,354
217,7
1041,575
1289,38
1022,833
1279,481
1154,558
1196,504
104,607
415,809
1275,32
398,334
756,50
182,773
208,772
1154,728
1158,858
730,59
62,184
957,344
890,547
1176,591
73,362
515,507
1145,511
1277,621
62,9
1277,413
361,873
786,0
483,857
534,780
1252,838
796,332
1083,803
662,840
682,399
798,499
925,459
1228,687
895,316
541,276
208,324
523,705
907,292
468,332
1289,355
667,700
402,647
416,387
1054,560
31,481
920,396
234,45
fold along x=655
fold along y=447
fold along x=327
fold along y=223
fold along x=163
fold along y=111
fold along x=81
fold along y=55
fold along x=40
fold along y=27
fold along y=13
fold along y=6";
void Main()
{
var sIn = Input.Split("\r\n\r\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).Dump();
var points = sIn[0].Split("\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
.Select(l => l.Split(','))
.Select(sp => new Point(int.Parse(sp[1]), int.Parse(sp[0])))
.ToList().Dump();
var folds = sIn[1].Split("\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
.Select(l => l.Split('='))
.Select(sp => new Fold(int.Parse(sp[1]), isHoriz: sp[0].Last() == 'y'))
.ToList().Dump();
//PaintGrid(points).Dump();
//PaintGrid(FoldPoints(points, folds[0])).Dump();
//PaintGrid(FoldPoints(FoldPoints(points, folds[0]), folds[1])).Dump();
IEnumerable<Point> current = points;
foreach (var fold in folds)
{
current = FoldPoints(current, fold);
}
PaintGrid(current.Distinct()).Dump();
}
char[,] PaintGrid(IEnumerable<Point> points)
{
var grid = MakeGrid(points.Max(p => p.y) + 1, points.Max(p => p.x) + 1, '.');
foreach (var p in points)
{
grid[p.y, p.x] = '#';
}
return grid;
}
T[,] MakeGrid<T>(int height, int width, T fill)
{
var grid = new T[height, width];
for (int y = 0; y < grid.GetLength(0); y++)
{
for (int x = 0; x < grid.GetLength(1); x++)
{
grid[y, x] = fill;
}
}
return grid;
}
IEnumerable<Point> FoldPoints(IEnumerable<Point> points, Fold fold)
{
foreach (var p in points)
{
if (fold.isHoriz)
{
int newY = (p.y < fold.line) ? p.y : (fold.line - (p.y - fold.line));
yield return p with { y = newY };
}
else
{
int newX = (p.x < fold.line) ? p.x : (fold.line - (p.x - fold.line));
yield return p with { x = newX };
}
}
}
record Point(int y, int x);
record Fold(int line, bool isHoriz);
string TestInput = @"
6,10
0,14
9,10
0,3
10,4
4,11
6,0
6,12
4,1
0,13
10,12
3,4
3,0
8,4
1,10
2,14
8,10
9,0
fold along y=7
fold along x=5";
string Input = @"
1118,85
1064,690
560,670
68,446
769,668
88,219
120,255
925,879
112,512
1064,652
1046,233
902,417
523,33
1012,280
1210,135
410,142
689,497
698,211
981,259
465,610
689,621
1093,887
114,728
790,809
139,59
798,257
390,457
482,281
701,190
840,283
320,723
498,504
256,397
100,115
401,92
796,780
239,729
755,539
736,870
676,567
484,560
405,511
187,387
356,155
42,659
182,508
256,374
572,320
738,207
328,80
70,528
1111,752
648,54
33,308
716,704
701,798
700,324
10,260
1076,401
554,533
592,885
269,575
492,528
646,837
1134,268
1290,619
442,248
549,519
908,647
402,280
1081,428
768,575
1277,525
472,121
985,635
912,374
512,499
708,807
1054,558
305,856
401,756
8,53
1044,256
607,581
156,840
756,331
771,609
276,456
1268,842
1123,387
155,526
1125,380
612,52
864,772
572,126
1084,597
666,397
574,169
33,481
1098,280
468,215
370,3
639,204
1230,466
512,684
705,161
738,126
355,376
1096,736
1166,476
1036,135
912,782
947,32
636,50
623,250
1257,215
416,672
989,74
1300,852
776,659
1196,838
1064,304
252,471
994,410
459,33
567,361
489,159
1240,528
58,506
944,339
788,0
319,857
644,215
787,33
1198,767
798,843
920,233
760,411
1300,626
52,311
812,558
378,227
226,437
386,444
169,291
308,172
698,618
514,231
761,235
157,774
798,684
902,29
428,37
698,52
405,383
1104,256
1058,784
299,518
617,332
346,498
1178,89
1290,275
1196,166
293,425
895,567
1034,662
596,56
687,250
534,255
623,698
1309,719
92,347
226,297
736,253
497,155
736,528
776,780
223,42
465,732
900,53
493,411
909,838
542,512
385,659
537,590
1228,80
420,462
761,519
879,852
1277,693
908,838
890,324
1092,383
691,862
602,378
416,224
296,598
666,215
234,347
902,142
1101,253
581,362
316,567
28,255
929,824
117,77
848,515
701,704
1136,233
485,680
1233,511
788,357
246,304
500,505
1144,63
738,320
964,620
623,413
26,495
58,390
82,590
930,311
239,578
748,784
873,518
385,879
311,242
1036,666
1230,641
1032,224
80,325
1233,383
1290,171
31,413
1076,493
402,838
731,690
977,522
92,36
144,476
520,365
428,396
1196,390
100,149
818,752
142,637
21,882
295,61
631,435
731,204
676,584
68,448
748,544
560,224
1,719
683,152
490,590
909,373
517,568
967,690
1015,450
1092,175
729,532
676,248
912,858
1180,0
174,233
73,586
403,292
325,635
308,474
733,511
38,787
278,222
562,36
485,603
296,822
428,149
433,494
1240,120
136,175
1240,366
1240,774
485,214
73,745
668,364
1071,119
185,514
882,268
544,614
540,838
139,773
1005,236
156,280
1290,584
813,155
209,826
773,572
715,852
11,700
562,350
209,701
293,33
117,301
1248,710
343,690
274,359
1146,646
930,666
189,162
161,383
485,291
912,558
252,784
1237,745
35,32
105,235
760,483
62,821
977,372
366,591
221,848
120,108
991,857
909,381
355,518
316,791
445,583
422,710
510,508
52,516
349,236
277,201
276,662
676,758
502,455
353,844
415,316
28,404
498,558
554,107
1101,701
935,873
865,701
1071,327
497,409
756,626
1272,555
1118,851
1073,280
385,463
954,827
1048,845
402,59
602,807
577,511
234,509
642,880
97,428
705,226
73,532
1179,33
74,87
226,361
256,484
1154,280
989,887
982,696
977,74
566,51
480,45
398,72
142,283
848,851
957,844
390,233
999,242
366,339
776,255
1096,830
845,162
403,826
1078,264
274,666
622,506
70,366
64,49
579,690
373,490
738,350
667,362
134,591
1064,808
438,212
53,215
226,533
359,416
989,603
1262,357
1096,64
701,544
890,570
358,296
821,175
851,33
356,826
1094,212
1213,428
596,390
1066,814
80,466
273,824
35,862
877,235
484,616
103,42
1181,810
385,435
768,736
1289,539
1173,568
760,847
826,726
808,631
714,388
274,135
900,752
808,263
810,57
468,887
38,824
907,826
1277,586
33,362
497,215
912,820
1054,397
512,658
64,497
410,814
689,301
756,533
1029,311
470,891
525,84
1002,474
540,248
664,501
912,72
70,8
353,162
1155,368
156,558
808,487
156,54
1300,260
192,67
33,273
338,266
909,92
117,814
1158,36
356,778
1258,516
1066,798
957,162
1228,768
361,469
157,215
810,505
687,413
335,37
1058,23
920,498
714,623
1282,137
1202,413
1076,122
251,327
310,469
1190,108
687,385
621,593
403,567
623,196
882,793
1228,590
408,477
296,72
114,248
808,256
469,828
825,456
718,9
1071,165
301,550
1169,882
1041,459
944,303
560,710
522,357
338,215
537,145
687,698
972,215
328,814
1265,404
321,74
909,597
1242,448
33,525
120,786
684,379
164,248
537,817
1158,401
329,259
349,210
1190,3
550,847
649,522
276,214
933,609
1248,73
542,158
842,332
842,108
726,366
1054,334
1168,645
252,871
681,792
602,29
1141,291
912,385
462,379
1174,495
633,38
20,310
1193,814
169,774
643,252
554,779
1002,722
1258,67
298,378
1054,547
502,858
1126,89
333,74
1014,520
1081,690
45,796
1081,466
146,469
909,166
902,752
1250,32
663,409
131,861
840,197
174,45
152,858
186,679
74,59
164,590
622,394
964,396
141,882
1153,663
584,8
909,728
321,7
1222,135
277,693
252,423
890,509
162,287
1071,266
110,627
305,38
1275,862
298,166
838,569
1054,484
493,595
110,491
381,455
572,687
70,120
773,817
229,204
566,135
18,50
114,390
565,26
902,466
1135,674
308,26
1210,485
502,493
944,555
256,560
1153,774
865,68
28,137
184,197
962,809
894,222
634,567
622,58
808,183
539,285
1277,397
522,537
112,158
1136,661
114,646
1200,280
1263,89
356,827
87,640
462,809
21,539
52,378
771,285
293,273
246,735
564,772
714,390
565,868
401,597
1034,438
621,621
1154,838
92,99
1300,186
1237,532
321,603
664,837
445,193
1092,831
234,401
100,745
1258,378
1198,127
550,411
1034,456
112,127
11,194
730,535
872,614
977,455
1174,719
937,190
950,836
237,280
661,344
246,204
1193,301
165,383
164,764
1009,102
994,268
373,190
1174,175
62,73
907,567
356,728
120,3
1252,56
209,641
113,226
821,595
738,277
1176,533
1009,498
687,196
1278,52
1179,861
502,519
1076,547
1169,12
882,37
244,814
661,550
925,659
1171,59
339,362
1076,285
1084,533
1210,745
808,519
764,749
689,273
1092,511
514,332
398,173
1014,72
401,138
1190,255
1250,862
622,388
687,478
333,372
370,190
694,385
1124,556
1056,749
649,792
154,729
301,844
329,635
58,838
940,190
281,641
515,387
813,215
841,262
617,556
1230,204
930,379
1012,291
1218,795
428,268
21,486
185,380
1029,583
315,586
281,583
100,268
1088,859
971,308
88,395
597,207
621,273
10,186
370,704
714,504
427,770
256,385
1218,544
485,829
59,318
744,135
160,607
972,716
440,736
291,862
20,584
840,891
294,500
920,457
776,639
679,435
276,227
1123,835
216,491
410,53
646,841
513,12
32,282
643,700
1158,455
1171,773
216,212
0,287
146,425
380,807
1138,57
932,227
555,539
21,42
346,396
688,282
385,431
398,273
428,857
132,313
540,646
52,827
161,859
1037,439
641,446
574,477
281,311
1198,158
1200,715
70,558
139,387
932,848
744,311
1002,172
964,26
169,120
301,498
642,364
580,731
909,354
217,7
1041,575
1289,38
1022,833
1279,481
1154,558
1196,504
104,607
415,809
1275,32
398,334
756,50
182,773
208,772
1154,728
1158,858
730,59
62,184
957,344
890,547
1176,591
73,362
515,507
1145,511
1277,621
62,9
1277,413
361,873
786,0
483,857
534,780
1252,838
796,332
1083,803
662,840
682,399
798,499
925,459
1228,687
895,316
541,276
208,324
523,705
907,292
468,332
1289,355
667,700
402,647
416,387
1054,560
31,481
920,396
234,45
fold along x=655
fold along y=447
fold along x=327
fold along y=223
fold along x=163
fold along y=111
fold along x=81
fold along y=55
fold along x=40
fold along y=27
fold along y=13
fold along y=6";
void Main()
{
var sIn = Input.Split("\r\n\r\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
string template = sIn[0];
var rules = sIn[1].Split("\n")
.Select(s => s.Split("->", StringSplitOptions.TrimEntries))
.Select(r => new Rule(r[0][0], r[0][1], r[1][0])).ToList();
template.Dump();
IEnumerable<char> next = template;
for (int i = 0; i < 10; i++)
{
next = Step(next.ToList(), rules);
new string(next.ToArray()).Dump();
}
var occurrences = next.GroupBy(c => c).Select(g => (c: g.Key, count: g.Count())).Dump();
(occurrences.Max(o => o.count) - occurrences.Min(o => o.count)).Dump();
}
IEnumerable<char> Step(IList<char> sequence, IEnumerable<Rule> rules)
{
for (int i = 0; i < sequence.Count - 1; i++)
{
char s1 = sequence[i];
char s2 = sequence[i + 1];
yield return s1;
foreach (var rule in rules)
{
if (rule.p1 == s1 && rule.p2 == s2)
{
yield return rule.insert;
break;
}
}
}
yield return sequence.Last();
}
record Rule(char p1, char p2, char insert);
string TestInput = @"
NNCB
CH -> B
HH -> N
CB -> H
NH -> C
HB -> C
HC -> B
HN -> C
NN -> C
BH -> H
NC -> B
NB -> B
BN -> B
BB -> N
BC -> B
CC -> N
CN -> C";
string Input = @"
FSHBKOOPCFSFKONFNFBB
FO -> K
FF -> H
SN -> C
CC -> S
BB -> V
FK -> H
PC -> P
PH -> N
OB -> O
PV -> C
BH -> B
HO -> C
VF -> H
HB -> O
VO -> N
HK -> N
OF -> V
PF -> C
KS -> H
KV -> F
PO -> B
BF -> P
OO -> B
PS -> S
KC -> P
BV -> K
OC -> B
SH -> C
SF -> P
NH -> C
BS -> C
VH -> F
CH -> S
BC -> B
ON -> K
FH -> O
HN -> O
HS -> C
KK -> V
OK -> K
VC -> H
HV -> F
FS -> H
OV -> P
HF -> F
FB -> O
CK -> O
HP -> C
NN -> V
PP -> F
FC -> O
SK -> N
FN -> K
HH -> F
BP -> O
CP -> K
VV -> S
BO -> N
KN -> S
SB -> B
SC -> H
OS -> S
CF -> K
OP -> P
CO -> C
VK -> C
NB -> K
PB -> S
FV -> B
CS -> C
HC -> P
PK -> V
BK -> P
KF -> V
NS -> P
SO -> C
CV -> P
NP -> V
VB -> F
KO -> C
KP -> F
KH -> N
VN -> S
NO -> P
NF -> K
CB -> H
VS -> V
NK -> N
KB -> C
SV -> F
NC -> H
VP -> K
PN -> H
OH -> K
CN -> N
BN -> F
NV -> K
SP -> S
SS -> K
FP -> S";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment