summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--2021/01/input2000
-rw-r--r--2021/02/input1000
-rw-r--r--2021/02/part1.tl1010
-rw-r--r--2021/02/part2.tl1016
-rw-r--r--2021/03/code.tl26
-rw-r--r--2021/03/input1000
-rw-r--r--2021/04/bingo.tl130
-rw-r--r--2021/04/input601
-rw-r--r--2021/05/input500
-rw-r--r--2021/05/scratch15
-rw-r--r--2021/05/segs.tl201
-rw-r--r--2021/05/testinput10
-rw-r--r--2021/06/input1
-rw-r--r--2021/06/sim.tl31
-rw-r--r--2021/06/testinput1
-rw-r--r--2021/07/calc.tl22
-rw-r--r--2021/07/input1
-rw-r--r--2021/07/testinput1
-rw-r--r--2021/08/input200
-rw-r--r--2021/08/one.tl7
-rw-r--r--2021/08/two.tl42
-rw-r--r--2021/09/code.tl59
-rw-r--r--2021/09/input100
-rw-r--r--2021/10/code.tl35
-rw-r--r--2021/10/input102
-rw-r--r--2021/10/testinput10
-rw-r--r--2021/11/code.tl78
-rw-r--r--2021/11/input10
-rw-r--r--2021/11/testinput10
-rw-r--r--2021/11/testinput-small5
-rw-r--r--2021/12/input23
-rw-r--r--2021/12/one.tl49
-rw-r--r--2021/12/testinput7
-rw-r--r--2021/12/two.tl68
-rw-r--r--2021/17/code.tl46
-rw-r--r--2021/17/errors.err2
-rw-r--r--2021/17/input1
-rw-r--r--2021/17/testinput1
-rw-r--r--2021/18/code.tl75
-rw-r--r--2021/18/code2.tl75
-rw-r--r--2021/18/input100
-rw-r--r--2021/18/testinput10
-rw-r--r--2021/18/testinput210
-rw-r--r--2021/19/code.tl164
-rw-r--r--2021/19/input975
-rw-r--r--2021/19/input.txr9
-rw-r--r--2021/19/scratch4
-rw-r--r--2021/19/testinput136
-rw-r--r--2021/20/code.tl73
-rw-r--r--2021/20/input102
-rw-r--r--2021/20/testinput7
-rw-r--r--2021/21/code.tl52
-rw-r--r--2021/21/input2
-rw-r--r--2021/21/testinput2
54 files changed, 10217 insertions, 0 deletions
diff --git a/2021/01/input b/2021/01/input
new file mode 100644
index 0000000..7e216a8
--- /dev/null
+++ b/2021/01/input
@@ -0,0 +1,2000 @@
+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
diff --git a/2021/02/input b/2021/02/input
new file mode 100644
index 0000000..d5c08db
--- /dev/null
+++ b/2021/02/input
@@ -0,0 +1,1000 @@
+forward 9
+forward 9
+forward 3
+down 2
+forward 8
+down 8
+forward 1
+down 6
+down 9
+down 9
+forward 1
+up 5
+up 4
+up 8
+down 6
+down 7
+forward 4
+forward 6
+forward 2
+forward 2
+forward 4
+down 2
+down 6
+forward 6
+forward 9
+up 4
+up 6
+down 2
+forward 7
+up 7
+down 8
+down 4
+down 6
+forward 1
+down 2
+up 1
+forward 8
+down 9
+forward 6
+up 9
+down 8
+forward 5
+forward 8
+down 8
+up 3
+up 9
+down 2
+down 2
+forward 5
+up 7
+forward 5
+down 6
+forward 4
+down 2
+up 2
+up 7
+up 1
+down 4
+down 8
+forward 6
+down 2
+forward 7
+down 1
+forward 7
+forward 1
+up 1
+down 4
+down 3
+down 4
+down 4
+up 8
+down 1
+up 7
+forward 8
+down 5
+up 1
+down 4
+down 3
+forward 4
+up 7
+forward 1
+down 4
+down 2
+down 4
+up 8
+up 6
+down 1
+up 3
+down 5
+forward 4
+down 3
+forward 9
+down 9
+forward 2
+down 4
+up 3
+down 4
+forward 1
+forward 7
+forward 9
+forward 7
+forward 3
+forward 6
+down 4
+forward 7
+down 5
+down 1
+forward 7
+up 1
+down 8
+down 7
+down 7
+down 7
+down 3
+forward 4
+forward 6
+forward 6
+forward 1
+down 7
+down 6
+down 8
+up 5
+down 7
+up 6
+forward 9
+down 7
+down 1
+down 9
+forward 8
+up 5
+down 6
+forward 3
+up 2
+down 1
+forward 2
+down 3
+up 6
+forward 8
+forward 1
+forward 3
+down 9
+forward 1
+down 3
+up 7
+forward 8
+up 8
+down 7
+down 2
+forward 3
+up 7
+forward 6
+down 7
+down 6
+up 5
+forward 9
+down 7
+up 5
+forward 6
+up 5
+up 6
+forward 6
+down 8
+down 1
+forward 7
+forward 6
+down 5
+down 6
+forward 9
+down 6
+up 5
+forward 9
+forward 4
+down 1
+forward 5
+down 4
+forward 5
+forward 1
+down 1
+forward 4
+down 5
+forward 4
+up 8
+down 1
+forward 6
+down 5
+forward 8
+forward 8
+forward 5
+down 7
+down 4
+forward 4
+up 1
+up 8
+down 6
+up 5
+forward 6
+forward 5
+forward 9
+down 3
+down 5
+forward 3
+down 6
+forward 6
+up 7
+up 6
+down 6
+down 1
+forward 8
+forward 9
+up 5
+forward 8
+forward 9
+forward 9
+down 2
+down 8
+forward 8
+down 2
+up 8
+down 2
+down 2
+up 1
+down 5
+down 6
+down 1
+down 8
+down 9
+forward 3
+forward 2
+down 6
+up 8
+forward 9
+forward 7
+forward 1
+down 8
+up 8
+forward 8
+down 5
+down 3
+up 3
+forward 6
+forward 5
+down 4
+forward 4
+down 4
+forward 5
+forward 9
+forward 2
+forward 9
+down 1
+down 3
+down 6
+forward 6
+down 7
+forward 3
+forward 4
+forward 1
+down 6
+forward 1
+forward 4
+forward 2
+forward 2
+forward 1
+forward 2
+down 1
+up 2
+forward 1
+down 3
+forward 8
+down 3
+down 9
+forward 5
+down 3
+down 3
+forward 2
+forward 9
+down 9
+forward 4
+down 2
+forward 5
+up 8
+down 4
+forward 5
+down 1
+forward 9
+down 1
+forward 7
+forward 2
+down 2
+down 6
+up 3
+forward 7
+up 4
+forward 7
+forward 6
+down 8
+forward 2
+down 3
+forward 9
+forward 4
+forward 8
+down 6
+forward 8
+down 9
+down 2
+down 3
+forward 1
+down 5
+down 3
+forward 2
+forward 7
+down 4
+down 3
+forward 9
+down 2
+forward 2
+forward 1
+up 6
+up 4
+down 5
+forward 5
+up 8
+down 7
+forward 6
+down 5
+forward 3
+forward 3
+forward 7
+up 9
+up 6
+down 5
+up 7
+forward 2
+forward 5
+down 9
+down 6
+forward 7
+down 9
+up 2
+up 5
+forward 1
+forward 8
+forward 9
+up 8
+forward 9
+forward 5
+up 9
+down 4
+down 7
+forward 2
+forward 1
+down 4
+up 8
+down 5
+down 7
+down 9
+down 3
+down 9
+up 8
+up 7
+up 8
+down 8
+down 2
+down 6
+down 6
+up 5
+up 9
+forward 1
+down 8
+up 4
+up 3
+forward 7
+up 7
+down 3
+up 1
+forward 3
+down 7
+forward 8
+forward 2
+down 6
+down 2
+up 7
+up 5
+forward 7
+forward 1
+forward 6
+up 6
+forward 5
+down 2
+up 4
+forward 2
+down 9
+forward 6
+forward 3
+forward 3
+forward 4
+forward 2
+down 6
+forward 9
+forward 7
+down 4
+up 1
+forward 4
+down 6
+down 6
+up 1
+up 1
+forward 3
+down 5
+up 5
+down 3
+down 6
+up 8
+down 2
+up 6
+up 1
+forward 8
+up 6
+down 8
+forward 9
+forward 4
+forward 9
+down 7
+down 9
+down 6
+down 1
+forward 9
+forward 9
+down 6
+down 5
+up 6
+down 9
+up 4
+up 5
+forward 8
+down 4
+down 5
+forward 8
+forward 7
+down 2
+forward 2
+forward 6
+forward 7
+down 1
+down 7
+down 1
+down 6
+forward 2
+up 2
+down 4
+down 8
+forward 1
+down 1
+down 3
+down 3
+up 9
+down 9
+forward 3
+up 4
+forward 1
+down 9
+down 8
+down 9
+forward 5
+forward 4
+up 3
+down 8
+forward 2
+down 3
+up 5
+forward 4
+down 7
+down 8
+down 9
+forward 8
+down 8
+forward 4
+down 6
+down 3
+forward 5
+down 3
+down 9
+down 4
+up 8
+forward 4
+up 6
+down 3
+forward 6
+down 9
+down 7
+forward 7
+forward 3
+forward 2
+forward 4
+down 4
+down 5
+up 9
+down 2
+down 6
+down 9
+forward 7
+forward 3
+up 3
+forward 3
+down 4
+down 7
+forward 2
+down 2
+forward 3
+down 8
+down 7
+down 7
+forward 2
+forward 2
+up 6
+forward 8
+forward 9
+up 3
+forward 8
+forward 5
+forward 7
+up 3
+forward 3
+forward 6
+down 5
+down 5
+down 4
+forward 1
+forward 8
+forward 4
+forward 3
+down 1
+forward 8
+down 4
+up 5
+forward 4
+down 2
+forward 7
+down 2
+forward 9
+down 1
+forward 6
+forward 8
+forward 6
+forward 7
+forward 1
+forward 6
+down 5
+up 3
+forward 7
+down 6
+forward 2
+down 2
+forward 8
+forward 9
+up 7
+forward 1
+forward 1
+up 1
+forward 1
+down 2
+forward 6
+down 9
+up 1
+up 2
+forward 6
+forward 1
+forward 7
+down 1
+up 8
+forward 7
+up 6
+up 4
+down 1
+forward 2
+down 4
+down 1
+down 7
+down 4
+up 3
+forward 8
+forward 3
+forward 5
+down 7
+down 8
+forward 5
+forward 2
+down 5
+down 2
+forward 2
+up 9
+down 3
+down 5
+up 7
+down 4
+down 2
+down 7
+forward 6
+down 2
+forward 1
+up 4
+forward 2
+forward 2
+down 5
+down 1
+down 1
+forward 7
+forward 6
+down 7
+down 5
+up 1
+up 3
+forward 3
+forward 9
+forward 4
+down 1
+down 5
+forward 3
+forward 7
+down 8
+forward 8
+forward 2
+forward 7
+up 7
+down 7
+down 4
+down 2
+up 6
+up 1
+forward 8
+up 8
+up 6
+down 8
+forward 1
+down 5
+forward 3
+down 3
+down 3
+forward 1
+up 3
+up 3
+forward 8
+forward 8
+down 8
+forward 6
+forward 2
+down 7
+forward 8
+down 7
+up 5
+forward 7
+down 1
+forward 9
+up 6
+down 2
+up 2
+up 5
+forward 6
+forward 9
+forward 3
+down 8
+forward 8
+down 2
+up 5
+down 9
+forward 5
+down 6
+down 3
+down 9
+up 8
+up 3
+down 2
+forward 7
+forward 4
+forward 4
+forward 8
+up 6
+up 4
+forward 9
+down 6
+down 8
+up 3
+up 5
+forward 8
+forward 7
+forward 4
+down 8
+forward 1
+forward 5
+down 9
+forward 8
+up 6
+down 6
+down 8
+down 2
+forward 4
+forward 9
+forward 2
+forward 7
+down 3
+forward 3
+up 6
+down 4
+forward 2
+up 4
+down 4
+forward 4
+forward 3
+forward 1
+up 6
+forward 1
+down 1
+forward 7
+up 4
+forward 3
+down 4
+up 6
+up 2
+up 8
+down 1
+down 6
+down 6
+down 1
+down 7
+forward 8
+down 9
+forward 5
+up 2
+up 7
+up 5
+down 6
+up 1
+up 6
+forward 4
+down 7
+forward 5
+forward 1
+down 6
+forward 2
+down 2
+forward 9
+down 9
+up 6
+forward 1
+up 7
+down 7
+forward 1
+down 6
+up 1
+forward 2
+forward 1
+down 4
+forward 9
+forward 7
+forward 5
+down 1
+forward 2
+down 2
+down 2
+down 5
+forward 1
+up 8
+forward 9
+down 7
+forward 9
+down 2
+up 5
+down 9
+down 8
+down 5
+forward 8
+forward 4
+down 4
+down 6
+forward 1
+down 5
+up 6
+down 3
+down 3
+forward 9
+down 9
+forward 6
+down 5
+up 6
+down 5
+up 7
+forward 9
+down 2
+down 4
+down 8
+forward 4
+up 7
+forward 9
+forward 7
+up 5
+down 7
+down 5
+down 1
+forward 5
+forward 4
+down 2
+up 3
+forward 1
+up 4
+up 9
+down 4
+forward 3
+down 4
+down 9
+forward 4
+up 2
+up 3
+forward 7
+up 6
+down 8
+down 8
+forward 6
+forward 2
+forward 3
+forward 9
+forward 7
+down 6
+down 7
+down 4
+down 2
+forward 8
+down 6
+forward 6
+forward 6
+forward 9
+down 8
+down 1
+up 5
+down 1
+forward 9
+down 1
+up 8
+forward 8
+down 3
+forward 1
+down 9
+forward 6
+forward 4
+forward 8
+down 2
+up 8
+down 2
+up 8
+down 9
+down 4
+up 7
+forward 7
+forward 5
+down 5
+down 4
+up 8
+forward 1
+down 7
+forward 1
+up 9
+forward 9
+forward 7
+forward 9
+down 9
+forward 4
+down 7
+forward 6
+forward 6
+up 3
+forward 2
+down 5
+up 8
+down 1
+up 8
+down 4
+down 1
+up 6
+forward 4
+forward 3
+forward 6
+down 3
+forward 4
+forward 4
+forward 4
+down 8
+forward 3
+up 8
+up 8
+down 8
+forward 6
+forward 8
+up 5
+forward 6
+down 8
+down 7
+up 4
+forward 6
+forward 9
+down 9
+forward 4
+up 2
+forward 1
+up 3
+down 9
+down 8
+forward 8
+forward 8
+forward 7
+down 6
+down 1
+up 6
+up 6
+forward 9
+forward 7
+forward 7
+down 3
+down 6
+down 9
+down 4
+forward 7
+forward 3
+forward 3
+down 7
+up 5
+down 3
+forward 6
+forward 3
+forward 5
+up 3
+down 7
+forward 2
+up 7
+forward 9
+down 3
+down 9
+forward 8
+forward 5
+up 7
+up 2
+up 8
+forward 6
+down 8
+forward 2
+forward 4
+up 2
+forward 2
+forward 8
+forward 4
+down 8
+forward 5
+down 4
+down 7
+forward 3
+down 3
+up 1
+down 9
+forward 9
+down 2
+down 1
+forward 1
+down 6
+down 3
+forward 5
+down 3
+down 8
+up 7
+down 1
+up 9
+down 4
+forward 9
+down 4
+forward 3
+forward 6
+down 3
+forward 3
+down 2
+down 7
+down 1
+up 4
+down 9
+down 1
+down 3
+down 4
+down 8
+down 7
+forward 4
+down 4
+down 9
+forward 2
+forward 7
+forward 2
+down 6
+up 8
+forward 6
+down 2
+forward 6
+up 8
+forward 6
+down 9
+forward 2
+forward 6
diff --git a/2021/02/part1.tl b/2021/02/part1.tl
new file mode 100644
index 0000000..983506a
--- /dev/null
+++ b/2021/02/part1.tl
@@ -0,0 +1,1010 @@
+(defvar x 0)
+(defvar y 0)
+(defvar aim 0)
+
+(defun forward (n) (inc x n))
+(defun down (n) (inc y n))
+(defun up (n) (dec y n))
+
+(forward 9)
+(forward 9)
+(forward 3)
+(down 2)
+(forward 8)
+(down 8)
+(forward 1)
+(down 6)
+(down 9)
+(down 9)
+(forward 1)
+(up 5)
+(up 4)
+(up 8)
+(down 6)
+(down 7)
+(forward 4)
+(forward 6)
+(forward 2)
+(forward 2)
+(forward 4)
+(down 2)
+(down 6)
+(forward 6)
+(forward 9)
+(up 4)
+(up 6)
+(down 2)
+(forward 7)
+(up 7)
+(down 8)
+(down 4)
+(down 6)
+(forward 1)
+(down 2)
+(up 1)
+(forward 8)
+(down 9)
+(forward 6)
+(up 9)
+(down 8)
+(forward 5)
+(forward 8)
+(down 8)
+(up 3)
+(up 9)
+(down 2)
+(down 2)
+(forward 5)
+(up 7)
+(forward 5)
+(down 6)
+(forward 4)
+(down 2)
+(up 2)
+(up 7)
+(up 1)
+(down 4)
+(down 8)
+(forward 6)
+(down 2)
+(forward 7)
+(down 1)
+(forward 7)
+(forward 1)
+(up 1)
+(down 4)
+(down 3)
+(down 4)
+(down 4)
+(up 8)
+(down 1)
+(up 7)
+(forward 8)
+(down 5)
+(up 1)
+(down 4)
+(down 3)
+(forward 4)
+(up 7)
+(forward 1)
+(down 4)
+(down 2)
+(down 4)
+(up 8)
+(up 6)
+(down 1)
+(up 3)
+(down 5)
+(forward 4)
+(down 3)
+(forward 9)
+(down 9)
+(forward 2)
+(down 4)
+(up 3)
+(down 4)
+(forward 1)
+(forward 7)
+(forward 9)
+(forward 7)
+(forward 3)
+(forward 6)
+(down 4)
+(forward 7)
+(down 5)
+(down 1)
+(forward 7)
+(up 1)
+(down 8)
+(down 7)
+(down 7)
+(down 7)
+(down 3)
+(forward 4)
+(forward 6)
+(forward 6)
+(forward 1)
+(down 7)
+(down 6)
+(down 8)
+(up 5)
+(down 7)
+(up 6)
+(forward 9)
+(down 7)
+(down 1)
+(down 9)
+(forward 8)
+(up 5)
+(down 6)
+(forward 3)
+(up 2)
+(down 1)
+(forward 2)
+(down 3)
+(up 6)
+(forward 8)
+(forward 1)
+(forward 3)
+(down 9)
+(forward 1)
+(down 3)
+(up 7)
+(forward 8)
+(up 8)
+(down 7)
+(down 2)
+(forward 3)
+(up 7)
+(forward 6)
+(down 7)
+(down 6)
+(up 5)
+(forward 9)
+(down 7)
+(up 5)
+(forward 6)
+(up 5)
+(up 6)
+(forward 6)
+(down 8)
+(down 1)
+(forward 7)
+(forward 6)
+(down 5)
+(down 6)
+(forward 9)
+(down 6)
+(up 5)
+(forward 9)
+(forward 4)
+(down 1)
+(forward 5)
+(down 4)
+(forward 5)
+(forward 1)
+(down 1)
+(forward 4)
+(down 5)
+(forward 4)
+(up 8)
+(down 1)
+(forward 6)
+(down 5)
+(forward 8)
+(forward 8)
+(forward 5)
+(down 7)
+(down 4)
+(forward 4)
+(up 1)
+(up 8)
+(down 6)
+(up 5)
+(forward 6)
+(forward 5)
+(forward 9)
+(down 3)
+(down 5)
+(forward 3)
+(down 6)
+(forward 6)
+(up 7)
+(up 6)
+(down 6)
+(down 1)
+(forward 8)
+(forward 9)
+(up 5)
+(forward 8)
+(forward 9)
+(forward 9)
+(down 2)
+(down 8)
+(forward 8)
+(down 2)
+(up 8)
+(down 2)
+(down 2)
+(up 1)
+(down 5)
+(down 6)
+(down 1)
+(down 8)
+(down 9)
+(forward 3)
+(forward 2)
+(down 6)
+(up 8)
+(forward 9)
+(forward 7)
+(forward 1)
+(down 8)
+(up 8)
+(forward 8)
+(down 5)
+(down 3)
+(up 3)
+(forward 6)
+(forward 5)
+(down 4)
+(forward 4)
+(down 4)
+(forward 5)
+(forward 9)
+(forward 2)
+(forward 9)
+(down 1)
+(down 3)
+(down 6)
+(forward 6)
+(down 7)
+(forward 3)
+(forward 4)
+(forward 1)
+(down 6)
+(forward 1)
+(forward 4)
+(forward 2)
+(forward 2)
+(forward 1)
+(forward 2)
+(down 1)
+(up 2)
+(forward 1)
+(down 3)
+(forward 8)
+(down 3)
+(down 9)
+(forward 5)
+(down 3)
+(down 3)
+(forward 2)
+(forward 9)
+(down 9)
+(forward 4)
+(down 2)
+(forward 5)
+(up 8)
+(down 4)
+(forward 5)
+(down 1)
+(forward 9)
+(down 1)
+(forward 7)
+(forward 2)
+(down 2)
+(down 6)
+(up 3)
+(forward 7)
+(up 4)
+(forward 7)
+(forward 6)
+(down 8)
+(forward 2)
+(down 3)
+(forward 9)
+(forward 4)
+(forward 8)
+(down 6)
+(forward 8)
+(down 9)
+(down 2)
+(down 3)
+(forward 1)
+(down 5)
+(down 3)
+(forward 2)
+(forward 7)
+(down 4)
+(down 3)
+(forward 9)
+(down 2)
+(forward 2)
+(forward 1)
+(up 6)
+(up 4)
+(down 5)
+(forward 5)
+(up 8)
+(down 7)
+(forward 6)
+(down 5)
+(forward 3)
+(forward 3)
+(forward 7)
+(up 9)
+(up 6)
+(down 5)
+(up 7)
+(forward 2)
+(forward 5)
+(down 9)
+(down 6)
+(forward 7)
+(down 9)
+(up 2)
+(up 5)
+(forward 1)
+(forward 8)
+(forward 9)
+(up 8)
+(forward 9)
+(forward 5)
+(up 9)
+(down 4)
+(down 7)
+(forward 2)
+(forward 1)
+(down 4)
+(up 8)
+(down 5)
+(down 7)
+(down 9)
+(down 3)
+(down 9)
+(up 8)
+(up 7)
+(up 8)
+(down 8)
+(down 2)
+(down 6)
+(down 6)
+(up 5)
+(up 9)
+(forward 1)
+(down 8)
+(up 4)
+(up 3)
+(forward 7)
+(up 7)
+(down 3)
+(up 1)
+(forward 3)
+(down 7)
+(forward 8)
+(forward 2)
+(down 6)
+(down 2)
+(up 7)
+(up 5)
+(forward 7)
+(forward 1)
+(forward 6)
+(up 6)
+(forward 5)
+(down 2)
+(up 4)
+(forward 2)
+(down 9)
+(forward 6)
+(forward 3)
+(forward 3)
+(forward 4)
+(forward 2)
+(down 6)
+(forward 9)
+(forward 7)
+(down 4)
+(up 1)
+(forward 4)
+(down 6)
+(down 6)
+(up 1)
+(up 1)
+(forward 3)
+(down 5)
+(up 5)
+(down 3)
+(down 6)
+(up 8)
+(down 2)
+(up 6)
+(up 1)
+(forward 8)
+(up 6)
+(down 8)
+(forward 9)
+(forward 4)
+(forward 9)
+(down 7)
+(down 9)
+(down 6)
+(down 1)
+(forward 9)
+(forward 9)
+(down 6)
+(down 5)
+(up 6)
+(down 9)
+(up 4)
+(up 5)
+(forward 8)
+(down 4)
+(down 5)
+(forward 8)
+(forward 7)
+(down 2)
+(forward 2)
+(forward 6)
+(forward 7)
+(down 1)
+(down 7)
+(down 1)
+(down 6)
+(forward 2)
+(up 2)
+(down 4)
+(down 8)
+(forward 1)
+(down 1)
+(down 3)
+(down 3)
+(up 9)
+(down 9)
+(forward 3)
+(up 4)
+(forward 1)
+(down 9)
+(down 8)
+(down 9)
+(forward 5)
+(forward 4)
+(up 3)
+(down 8)
+(forward 2)
+(down 3)
+(up 5)
+(forward 4)
+(down 7)
+(down 8)
+(down 9)
+(forward 8)
+(down 8)
+(forward 4)
+(down 6)
+(down 3)
+(forward 5)
+(down 3)
+(down 9)
+(down 4)
+(up 8)
+(forward 4)
+(up 6)
+(down 3)
+(forward 6)
+(down 9)
+(down 7)
+(forward 7)
+(forward 3)
+(forward 2)
+(forward 4)
+(down 4)
+(down 5)
+(up 9)
+(down 2)
+(down 6)
+(down 9)
+(forward 7)
+(forward 3)
+(up 3)
+(forward 3)
+(down 4)
+(down 7)
+(forward 2)
+(down 2)
+(forward 3)
+(down 8)
+(down 7)
+(down 7)
+(forward 2)
+(forward 2)
+(up 6)
+(forward 8)
+(forward 9)
+(up 3)
+(forward 8)
+(forward 5)
+(forward 7)
+(up 3)
+(forward 3)
+(forward 6)
+(down 5)
+(down 5)
+(down 4)
+(forward 1)
+(forward 8)
+(forward 4)
+(forward 3)
+(down 1)
+(forward 8)
+(down 4)
+(up 5)
+(forward 4)
+(down 2)
+(forward 7)
+(down 2)
+(forward 9)
+(down 1)
+(forward 6)
+(forward 8)
+(forward 6)
+(forward 7)
+(forward 1)
+(forward 6)
+(down 5)
+(up 3)
+(forward 7)
+(down 6)
+(forward 2)
+(down 2)
+(forward 8)
+(forward 9)
+(up 7)
+(forward 1)
+(forward 1)
+(up 1)
+(forward 1)
+(down 2)
+(forward 6)
+(down 9)
+(up 1)
+(up 2)
+(forward 6)
+(forward 1)
+(forward 7)
+(down 1)
+(up 8)
+(forward 7)
+(up 6)
+(up 4)
+(down 1)
+(forward 2)
+(down 4)
+(down 1)
+(down 7)
+(down 4)
+(up 3)
+(forward 8)
+(forward 3)
+(forward 5)
+(down 7)
+(down 8)
+(forward 5)
+(forward 2)
+(down 5)
+(down 2)
+(forward 2)
+(up 9)
+(down 3)
+(down 5)
+(up 7)
+(down 4)
+(down 2)
+(down 7)
+(forward 6)
+(down 2)
+(forward 1)
+(up 4)
+(forward 2)
+(forward 2)
+(down 5)
+(down 1)
+(down 1)
+(forward 7)
+(forward 6)
+(down 7)
+(down 5)
+(up 1)
+(up 3)
+(forward 3)
+(forward 9)
+(forward 4)
+(down 1)
+(down 5)
+(forward 3)
+(forward 7)
+(down 8)
+(forward 8)
+(forward 2)
+(forward 7)
+(up 7)
+(down 7)
+(down 4)
+(down 2)
+(up 6)
+(up 1)
+(forward 8)
+(up 8)
+(up 6)
+(down 8)
+(forward 1)
+(down 5)
+(forward 3)
+(down 3)
+(down 3)
+(forward 1)
+(up 3)
+(up 3)
+(forward 8)
+(forward 8)
+(down 8)
+(forward 6)
+(forward 2)
+(down 7)
+(forward 8)
+(down 7)
+(up 5)
+(forward 7)
+(down 1)
+(forward 9)
+(up 6)
+(down 2)
+(up 2)
+(up 5)
+(forward 6)
+(forward 9)
+(forward 3)
+(down 8)
+(forward 8)
+(down 2)
+(up 5)
+(down 9)
+(forward 5)
+(down 6)
+(down 3)
+(down 9)
+(up 8)
+(up 3)
+(down 2)
+(forward 7)
+(forward 4)
+(forward 4)
+(forward 8)
+(up 6)
+(up 4)
+(forward 9)
+(down 6)
+(down 8)
+(up 3)
+(up 5)
+(forward 8)
+(forward 7)
+(forward 4)
+(down 8)
+(forward 1)
+(forward 5)
+(down 9)
+(forward 8)
+(up 6)
+(down 6)
+(down 8)
+(down 2)
+(forward 4)
+(forward 9)
+(forward 2)
+(forward 7)
+(down 3)
+(forward 3)
+(up 6)
+(down 4)
+(forward 2)
+(up 4)
+(down 4)
+(forward 4)
+(forward 3)
+(forward 1)
+(up 6)
+(forward 1)
+(down 1)
+(forward 7)
+(up 4)
+(forward 3)
+(down 4)
+(up 6)
+(up 2)
+(up 8)
+(down 1)
+(down 6)
+(down 6)
+(down 1)
+(down 7)
+(forward 8)
+(down 9)
+(forward 5)
+(up 2)
+(up 7)
+(up 5)
+(down 6)
+(up 1)
+(up 6)
+(forward 4)
+(down 7)
+(forward 5)
+(forward 1)
+(down 6)
+(forward 2)
+(down 2)
+(forward 9)
+(down 9)
+(up 6)
+(forward 1)
+(up 7)
+(down 7)
+(forward 1)
+(down 6)
+(up 1)
+(forward 2)
+(forward 1)
+(down 4)
+(forward 9)
+(forward 7)
+(forward 5)
+(down 1)
+(forward 2)
+(down 2)
+(down 2)
+(down 5)
+(forward 1)
+(up 8)
+(forward 9)
+(down 7)
+(forward 9)
+(down 2)
+(up 5)
+(down 9)
+(down 8)
+(down 5)
+(forward 8)
+(forward 4)
+(down 4)
+(down 6)
+(forward 1)
+(down 5)
+(up 6)
+(down 3)
+(down 3)
+(forward 9)
+(down 9)
+(forward 6)
+(down 5)
+(up 6)
+(down 5)
+(up 7)
+(forward 9)
+(down 2)
+(down 4)
+(down 8)
+(forward 4)
+(up 7)
+(forward 9)
+(forward 7)
+(up 5)
+(down 7)
+(down 5)
+(down 1)
+(forward 5)
+(forward 4)
+(down 2)
+(up 3)
+(forward 1)
+(up 4)
+(up 9)
+(down 4)
+(forward 3)
+(down 4)
+(down 9)
+(forward 4)
+(up 2)
+(up 3)
+(forward 7)
+(up 6)
+(down 8)
+(down 8)
+(forward 6)
+(forward 2)
+(forward 3)
+(forward 9)
+(forward 7)
+(down 6)
+(down 7)
+(down 4)
+(down 2)
+(forward 8)
+(down 6)
+(forward 6)
+(forward 6)
+(forward 9)
+(down 8)
+(down 1)
+(up 5)
+(down 1)
+(forward 9)
+(down 1)
+(up 8)
+(forward 8)
+(down 3)
+(forward 1)
+(down 9)
+(forward 6)
+(forward 4)
+(forward 8)
+(down 2)
+(up 8)
+(down 2)
+(up 8)
+(down 9)
+(down 4)
+(up 7)
+(forward 7)
+(forward 5)
+(down 5)
+(down 4)
+(up 8)
+(forward 1)
+(down 7)
+(forward 1)
+(up 9)
+(forward 9)
+(forward 7)
+(forward 9)
+(down 9)
+(forward 4)
+(down 7)
+(forward 6)
+(forward 6)
+(up 3)
+(forward 2)
+(down 5)
+(up 8)
+(down 1)
+(up 8)
+(down 4)
+(down 1)
+(up 6)
+(forward 4)
+(forward 3)
+(forward 6)
+(down 3)
+(forward 4)
+(forward 4)
+(forward 4)
+(down 8)
+(forward 3)
+(up 8)
+(up 8)
+(down 8)
+(forward 6)
+(forward 8)
+(up 5)
+(forward 6)
+(down 8)
+(down 7)
+(up 4)
+(forward 6)
+(forward 9)
+(down 9)
+(forward 4)
+(up 2)
+(forward 1)
+(up 3)
+(down 9)
+(down 8)
+(forward 8)
+(forward 8)
+(forward 7)
+(down 6)
+(down 1)
+(up 6)
+(up 6)
+(forward 9)
+(forward 7)
+(forward 7)
+(down 3)
+(down 6)
+(down 9)
+(down 4)
+(forward 7)
+(forward 3)
+(forward 3)
+(down 7)
+(up 5)
+(down 3)
+(forward 6)
+(forward 3)
+(forward 5)
+(up 3)
+(down 7)
+(forward 2)
+(up 7)
+(forward 9)
+(down 3)
+(down 9)
+(forward 8)
+(forward 5)
+(up 7)
+(up 2)
+(up 8)
+(forward 6)
+(down 8)
+(forward 2)
+(forward 4)
+(up 2)
+(forward 2)
+(forward 8)
+(forward 4)
+(down 8)
+(forward 5)
+(down 4)
+(down 7)
+(forward 3)
+(down 3)
+(up 1)
+(down 9)
+(forward 9)
+(down 2)
+(down 1)
+(forward 1)
+(down 6)
+(down 3)
+(forward 5)
+(down 3)
+(down 8)
+(up 7)
+(down 1)
+(up 9)
+(down 4)
+(forward 9)
+(down 4)
+(forward 3)
+(forward 6)
+(down 3)
+(forward 3)
+(down 2)
+(down 7)
+(down 1)
+(up 4)
+(down 9)
+(down 1)
+(down 3)
+(down 4)
+(down 8)
+(down 7)
+(forward 4)
+(down 4)
+(down 9)
+(forward 2)
+(forward 7)
+(forward 2)
+(down 6)
+(up 8)
+(forward 6)
+(down 2)
+(forward 6)
+(up 8)
+(forward 6)
+(down 9)
+(forward 2)
+(forward 6)
+
+(put-line `x = @x, y = @y, aim = @aim, (* x y) = @(* x y)`)
diff --git a/2021/02/part2.tl b/2021/02/part2.tl
new file mode 100644
index 0000000..8bd775f
--- /dev/null
+++ b/2021/02/part2.tl
@@ -0,0 +1,1016 @@
+(defvar x 0)
+(defvar y 0)
+(defvar aim 0)
+
+(defun forward (n)
+ (inc x n)
+ (inc y (* n aim)))
+
+(defun down (n)
+ (inc aim n))
+
+(defun up (n)
+ (dec aim n))
+
+(forward 9)
+(forward 9)
+(forward 3)
+(down 2)
+(forward 8)
+(down 8)
+(forward 1)
+(down 6)
+(down 9)
+(down 9)
+(forward 1)
+(up 5)
+(up 4)
+(up 8)
+(down 6)
+(down 7)
+(forward 4)
+(forward 6)
+(forward 2)
+(forward 2)
+(forward 4)
+(down 2)
+(down 6)
+(forward 6)
+(forward 9)
+(up 4)
+(up 6)
+(down 2)
+(forward 7)
+(up 7)
+(down 8)
+(down 4)
+(down 6)
+(forward 1)
+(down 2)
+(up 1)
+(forward 8)
+(down 9)
+(forward 6)
+(up 9)
+(down 8)
+(forward 5)
+(forward 8)
+(down 8)
+(up 3)
+(up 9)
+(down 2)
+(down 2)
+(forward 5)
+(up 7)
+(forward 5)
+(down 6)
+(forward 4)
+(down 2)
+(up 2)
+(up 7)
+(up 1)
+(down 4)
+(down 8)
+(forward 6)
+(down 2)
+(forward 7)
+(down 1)
+(forward 7)
+(forward 1)
+(up 1)
+(down 4)
+(down 3)
+(down 4)
+(down 4)
+(up 8)
+(down 1)
+(up 7)
+(forward 8)
+(down 5)
+(up 1)
+(down 4)
+(down 3)
+(forward 4)
+(up 7)
+(forward 1)
+(down 4)
+(down 2)
+(down 4)
+(up 8)
+(up 6)
+(down 1)
+(up 3)
+(down 5)
+(forward 4)
+(down 3)
+(forward 9)
+(down 9)
+(forward 2)
+(down 4)
+(up 3)
+(down 4)
+(forward 1)
+(forward 7)
+(forward 9)
+(forward 7)
+(forward 3)
+(forward 6)
+(down 4)
+(forward 7)
+(down 5)
+(down 1)
+(forward 7)
+(up 1)
+(down 8)
+(down 7)
+(down 7)
+(down 7)
+(down 3)
+(forward 4)
+(forward 6)
+(forward 6)
+(forward 1)
+(down 7)
+(down 6)
+(down 8)
+(up 5)
+(down 7)
+(up 6)
+(forward 9)
+(down 7)
+(down 1)
+(down 9)
+(forward 8)
+(up 5)
+(down 6)
+(forward 3)
+(up 2)
+(down 1)
+(forward 2)
+(down 3)
+(up 6)
+(forward 8)
+(forward 1)
+(forward 3)
+(down 9)
+(forward 1)
+(down 3)
+(up 7)
+(forward 8)
+(up 8)
+(down 7)
+(down 2)
+(forward 3)
+(up 7)
+(forward 6)
+(down 7)
+(down 6)
+(up 5)
+(forward 9)
+(down 7)
+(up 5)
+(forward 6)
+(up 5)
+(up 6)
+(forward 6)
+(down 8)
+(down 1)
+(forward 7)
+(forward 6)
+(down 5)
+(down 6)
+(forward 9)
+(down 6)
+(up 5)
+(forward 9)
+(forward 4)
+(down 1)
+(forward 5)
+(down 4)
+(forward 5)
+(forward 1)
+(down 1)
+(forward 4)
+(down 5)
+(forward 4)
+(up 8)
+(down 1)
+(forward 6)
+(down 5)
+(forward 8)
+(forward 8)
+(forward 5)
+(down 7)
+(down 4)
+(forward 4)
+(up 1)
+(up 8)
+(down 6)
+(up 5)
+(forward 6)
+(forward 5)
+(forward 9)
+(down 3)
+(down 5)
+(forward 3)
+(down 6)
+(forward 6)
+(up 7)
+(up 6)
+(down 6)
+(down 1)
+(forward 8)
+(forward 9)
+(up 5)
+(forward 8)
+(forward 9)
+(forward 9)
+(down 2)
+(down 8)
+(forward 8)
+(down 2)
+(up 8)
+(down 2)
+(down 2)
+(up 1)
+(down 5)
+(down 6)
+(down 1)
+(down 8)
+(down 9)
+(forward 3)
+(forward 2)
+(down 6)
+(up 8)
+(forward 9)
+(forward 7)
+(forward 1)
+(down 8)
+(up 8)
+(forward 8)
+(down 5)
+(down 3)
+(up 3)
+(forward 6)
+(forward 5)
+(down 4)
+(forward 4)
+(down 4)
+(forward 5)
+(forward 9)
+(forward 2)
+(forward 9)
+(down 1)
+(down 3)
+(down 6)
+(forward 6)
+(down 7)
+(forward 3)
+(forward 4)
+(forward 1)
+(down 6)
+(forward 1)
+(forward 4)
+(forward 2)
+(forward 2)
+(forward 1)
+(forward 2)
+(down 1)
+(up 2)
+(forward 1)
+(down 3)
+(forward 8)
+(down 3)
+(down 9)
+(forward 5)
+(down 3)
+(down 3)
+(forward 2)
+(forward 9)
+(down 9)
+(forward 4)
+(down 2)
+(forward 5)
+(up 8)
+(down 4)
+(forward 5)
+(down 1)
+(forward 9)
+(down 1)
+(forward 7)
+(forward 2)
+(down 2)
+(down 6)
+(up 3)
+(forward 7)
+(up 4)
+(forward 7)
+(forward 6)
+(down 8)
+(forward 2)
+(down 3)
+(forward 9)
+(forward 4)
+(forward 8)
+(down 6)
+(forward 8)
+(down 9)
+(down 2)
+(down 3)
+(forward 1)
+(down 5)
+(down 3)
+(forward 2)
+(forward 7)
+(down 4)
+(down 3)
+(forward 9)
+(down 2)
+(forward 2)
+(forward 1)
+(up 6)
+(up 4)
+(down 5)
+(forward 5)
+(up 8)
+(down 7)
+(forward 6)
+(down 5)
+(forward 3)
+(forward 3)
+(forward 7)
+(up 9)
+(up 6)
+(down 5)
+(up 7)
+(forward 2)
+(forward 5)
+(down 9)
+(down 6)
+(forward 7)
+(down 9)
+(up 2)
+(up 5)
+(forward 1)
+(forward 8)
+(forward 9)
+(up 8)
+(forward 9)
+(forward 5)
+(up 9)
+(down 4)
+(down 7)
+(forward 2)
+(forward 1)
+(down 4)
+(up 8)
+(down 5)
+(down 7)
+(down 9)
+(down 3)
+(down 9)
+(up 8)
+(up 7)
+(up 8)
+(down 8)
+(down 2)
+(down 6)
+(down 6)
+(up 5)
+(up 9)
+(forward 1)
+(down 8)
+(up 4)
+(up 3)
+(forward 7)
+(up 7)
+(down 3)
+(up 1)
+(forward 3)
+(down 7)
+(forward 8)
+(forward 2)
+(down 6)
+(down 2)
+(up 7)
+(up 5)
+(forward 7)
+(forward 1)
+(forward 6)
+(up 6)
+(forward 5)
+(down 2)
+(up 4)
+(forward 2)
+(down 9)
+(forward 6)
+(forward 3)
+(forward 3)
+(forward 4)
+(forward 2)
+(down 6)
+(forward 9)
+(forward 7)
+(down 4)
+(up 1)
+(forward 4)
+(down 6)
+(down 6)
+(up 1)
+(up 1)
+(forward 3)
+(down 5)
+(up 5)
+(down 3)
+(down 6)
+(up 8)
+(down 2)
+(up 6)
+(up 1)
+(forward 8)
+(up 6)
+(down 8)
+(forward 9)
+(forward 4)
+(forward 9)
+(down 7)
+(down 9)
+(down 6)
+(down 1)
+(forward 9)
+(forward 9)
+(down 6)
+(down 5)
+(up 6)
+(down 9)
+(up 4)
+(up 5)
+(forward 8)
+(down 4)
+(down 5)
+(forward 8)
+(forward 7)
+(down 2)
+(forward 2)
+(forward 6)
+(forward 7)
+(down 1)
+(down 7)
+(down 1)
+(down 6)
+(forward 2)
+(up 2)
+(down 4)
+(down 8)
+(forward 1)
+(down 1)
+(down 3)
+(down 3)
+(up 9)
+(down 9)
+(forward 3)
+(up 4)
+(forward 1)
+(down 9)
+(down 8)
+(down 9)
+(forward 5)
+(forward 4)
+(up 3)
+(down 8)
+(forward 2)
+(down 3)
+(up 5)
+(forward 4)
+(down 7)
+(down 8)
+(down 9)
+(forward 8)
+(down 8)
+(forward 4)
+(down 6)
+(down 3)
+(forward 5)
+(down 3)
+(down 9)
+(down 4)
+(up 8)
+(forward 4)
+(up 6)
+(down 3)
+(forward 6)
+(down 9)
+(down 7)
+(forward 7)
+(forward 3)
+(forward 2)
+(forward 4)
+(down 4)
+(down 5)
+(up 9)
+(down 2)
+(down 6)
+(down 9)
+(forward 7)
+(forward 3)
+(up 3)
+(forward 3)
+(down 4)
+(down 7)
+(forward 2)
+(down 2)
+(forward 3)
+(down 8)
+(down 7)
+(down 7)
+(forward 2)
+(forward 2)
+(up 6)
+(forward 8)
+(forward 9)
+(up 3)
+(forward 8)
+(forward 5)
+(forward 7)
+(up 3)
+(forward 3)
+(forward 6)
+(down 5)
+(down 5)
+(down 4)
+(forward 1)
+(forward 8)
+(forward 4)
+(forward 3)
+(down 1)
+(forward 8)
+(down 4)
+(up 5)
+(forward 4)
+(down 2)
+(forward 7)
+(down 2)
+(forward 9)
+(down 1)
+(forward 6)
+(forward 8)
+(forward 6)
+(forward 7)
+(forward 1)
+(forward 6)
+(down 5)
+(up 3)
+(forward 7)
+(down 6)
+(forward 2)
+(down 2)
+(forward 8)
+(forward 9)
+(up 7)
+(forward 1)
+(forward 1)
+(up 1)
+(forward 1)
+(down 2)
+(forward 6)
+(down 9)
+(up 1)
+(up 2)
+(forward 6)
+(forward 1)
+(forward 7)
+(down 1)
+(up 8)
+(forward 7)
+(up 6)
+(up 4)
+(down 1)
+(forward 2)
+(down 4)
+(down 1)
+(down 7)
+(down 4)
+(up 3)
+(forward 8)
+(forward 3)
+(forward 5)
+(down 7)
+(down 8)
+(forward 5)
+(forward 2)
+(down 5)
+(down 2)
+(forward 2)
+(up 9)
+(down 3)
+(down 5)
+(up 7)
+(down 4)
+(down 2)
+(down 7)
+(forward 6)
+(down 2)
+(forward 1)
+(up 4)
+(forward 2)
+(forward 2)
+(down 5)
+(down 1)
+(down 1)
+(forward 7)
+(forward 6)
+(down 7)
+(down 5)
+(up 1)
+(up 3)
+(forward 3)
+(forward 9)
+(forward 4)
+(down 1)
+(down 5)
+(forward 3)
+(forward 7)
+(down 8)
+(forward 8)
+(forward 2)
+(forward 7)
+(up 7)
+(down 7)
+(down 4)
+(down 2)
+(up 6)
+(up 1)
+(forward 8)
+(up 8)
+(up 6)
+(down 8)
+(forward 1)
+(down 5)
+(forward 3)
+(down 3)
+(down 3)
+(forward 1)
+(up 3)
+(up 3)
+(forward 8)
+(forward 8)
+(down 8)
+(forward 6)
+(forward 2)
+(down 7)
+(forward 8)
+(down 7)
+(up 5)
+(forward 7)
+(down 1)
+(forward 9)
+(up 6)
+(down 2)
+(up 2)
+(up 5)
+(forward 6)
+(forward 9)
+(forward 3)
+(down 8)
+(forward 8)
+(down 2)
+(up 5)
+(down 9)
+(forward 5)
+(down 6)
+(down 3)
+(down 9)
+(up 8)
+(up 3)
+(down 2)
+(forward 7)
+(forward 4)
+(forward 4)
+(forward 8)
+(up 6)
+(up 4)
+(forward 9)
+(down 6)
+(down 8)
+(up 3)
+(up 5)
+(forward 8)
+(forward 7)
+(forward 4)
+(down 8)
+(forward 1)
+(forward 5)
+(down 9)
+(forward 8)
+(up 6)
+(down 6)
+(down 8)
+(down 2)
+(forward 4)
+(forward 9)
+(forward 2)
+(forward 7)
+(down 3)
+(forward 3)
+(up 6)
+(down 4)
+(forward 2)
+(up 4)
+(down 4)
+(forward 4)
+(forward 3)
+(forward 1)
+(up 6)
+(forward 1)
+(down 1)
+(forward 7)
+(up 4)
+(forward 3)
+(down 4)
+(up 6)
+(up 2)
+(up 8)
+(down 1)
+(down 6)
+(down 6)
+(down 1)
+(down 7)
+(forward 8)
+(down 9)
+(forward 5)
+(up 2)
+(up 7)
+(up 5)
+(down 6)
+(up 1)
+(up 6)
+(forward 4)
+(down 7)
+(forward 5)
+(forward 1)
+(down 6)
+(forward 2)
+(down 2)
+(forward 9)
+(down 9)
+(up 6)
+(forward 1)
+(up 7)
+(down 7)
+(forward 1)
+(down 6)
+(up 1)
+(forward 2)
+(forward 1)
+(down 4)
+(forward 9)
+(forward 7)
+(forward 5)
+(down 1)
+(forward 2)
+(down 2)
+(down 2)
+(down 5)
+(forward 1)
+(up 8)
+(forward 9)
+(down 7)
+(forward 9)
+(down 2)
+(up 5)
+(down 9)
+(down 8)
+(down 5)
+(forward 8)
+(forward 4)
+(down 4)
+(down 6)
+(forward 1)
+(down 5)
+(up 6)
+(down 3)
+(down 3)
+(forward 9)
+(down 9)
+(forward 6)
+(down 5)
+(up 6)
+(down 5)
+(up 7)
+(forward 9)
+(down 2)
+(down 4)
+(down 8)
+(forward 4)
+(up 7)
+(forward 9)
+(forward 7)
+(up 5)
+(down 7)
+(down 5)
+(down 1)
+(forward 5)
+(forward 4)
+(down 2)
+(up 3)
+(forward 1)
+(up 4)
+(up 9)
+(down 4)
+(forward 3)
+(down 4)
+(down 9)
+(forward 4)
+(up 2)
+(up 3)
+(forward 7)
+(up 6)
+(down 8)
+(down 8)
+(forward 6)
+(forward 2)
+(forward 3)
+(forward 9)
+(forward 7)
+(down 6)
+(down 7)
+(down 4)
+(down 2)
+(forward 8)
+(down 6)
+(forward 6)
+(forward 6)
+(forward 9)
+(down 8)
+(down 1)
+(up 5)
+(down 1)
+(forward 9)
+(down 1)
+(up 8)
+(forward 8)
+(down 3)
+(forward 1)
+(down 9)
+(forward 6)
+(forward 4)
+(forward 8)
+(down 2)
+(up 8)
+(down 2)
+(up 8)
+(down 9)
+(down 4)
+(up 7)
+(forward 7)
+(forward 5)
+(down 5)
+(down 4)
+(up 8)
+(forward 1)
+(down 7)
+(forward 1)
+(up 9)
+(forward 9)
+(forward 7)
+(forward 9)
+(down 9)
+(forward 4)
+(down 7)
+(forward 6)
+(forward 6)
+(up 3)
+(forward 2)
+(down 5)
+(up 8)
+(down 1)
+(up 8)
+(down 4)
+(down 1)
+(up 6)
+(forward 4)
+(forward 3)
+(forward 6)
+(down 3)
+(forward 4)
+(forward 4)
+(forward 4)
+(down 8)
+(forward 3)
+(up 8)
+(up 8)
+(down 8)
+(forward 6)
+(forward 8)
+(up 5)
+(forward 6)
+(down 8)
+(down 7)
+(up 4)
+(forward 6)
+(forward 9)
+(down 9)
+(forward 4)
+(up 2)
+(forward 1)
+(up 3)
+(down 9)
+(down 8)
+(forward 8)
+(forward 8)
+(forward 7)
+(down 6)
+(down 1)
+(up 6)
+(up 6)
+(forward 9)
+(forward 7)
+(forward 7)
+(down 3)
+(down 6)
+(down 9)
+(down 4)
+(forward 7)
+(forward 3)
+(forward 3)
+(down 7)
+(up 5)
+(down 3)
+(forward 6)
+(forward 3)
+(forward 5)
+(up 3)
+(down 7)
+(forward 2)
+(up 7)
+(forward 9)
+(down 3)
+(down 9)
+(forward 8)
+(forward 5)
+(up 7)
+(up 2)
+(up 8)
+(forward 6)
+(down 8)
+(forward 2)
+(forward 4)
+(up 2)
+(forward 2)
+(forward 8)
+(forward 4)
+(down 8)
+(forward 5)
+(down 4)
+(down 7)
+(forward 3)
+(down 3)
+(up 1)
+(down 9)
+(forward 9)
+(down 2)
+(down 1)
+(forward 1)
+(down 6)
+(down 3)
+(forward 5)
+(down 3)
+(down 8)
+(up 7)
+(down 1)
+(up 9)
+(down 4)
+(forward 9)
+(down 4)
+(forward 3)
+(forward 6)
+(down 3)
+(forward 3)
+(down 2)
+(down 7)
+(down 1)
+(up 4)
+(down 9)
+(down 1)
+(down 3)
+(down 4)
+(down 8)
+(down 7)
+(forward 4)
+(down 4)
+(down 9)
+(forward 2)
+(forward 7)
+(forward 2)
+(down 6)
+(up 8)
+(forward 6)
+(down 2)
+(forward 6)
+(up 8)
+(forward 6)
+(down 9)
+(forward 2)
+(forward 6)
+
+(put-line `x = @x, y = @y, aim = @aim, (* x y) = @(* x y)`)
diff --git a/2021/03/code.tl b/2021/03/code.tl
new file mode 100644
index 0000000..4ffd1f4
--- /dev/null
+++ b/2021/03/code.tl
@@ -0,0 +1,26 @@
+(defun funny-less (left right)
+ (let ((ll (len left))
+ (lr (len right)))
+ (or (< ll lr)
+ (if (eql ll lr)
+ (< (car left) (car right))))))
+
+(defun funny-greater (left right)
+ (let ((ll (len left))
+ (lr (len right)))
+ (or (> ll lr)
+ (if (eql ll lr)
+ (> (car left) (car right))))))
+
+(defun maj-pare-down (list pos)
+ (cdr [find-max [group-by (op ref @1 pos) list] funny-greater]))
+
+(defun min-pare-down (list pos)
+ (cdr [find-min [group-by (op ref @1 pos) list] funny-less]))
+
+(let ((list *2))
+ (each ((i 0..12))
+ (upd list (min-pare-down @1 i)))
+ list)
+
+[apply * (mapcar (op toint @1 2) (flatten results))] ;; results contains two numbers in text form
diff --git a/2021/03/input b/2021/03/input
new file mode 100644
index 0000000..4c5a9e7
--- /dev/null
+++ b/2021/03/input
@@ -0,0 +1,1000 @@
+010011001001
+110101011110
+111111000101
+100111111001
+000000011111
+111100100111
+011111100000
+001001011100
+101100111011
+010001010100
+111011001010
+010001100011
+110110011011
+011011000001
+001100101100
+001000101100
+100000001010
+001111110000
+100101000000
+010000100000
+010100110000
+110000111101
+000001011010
+000011011001
+011000101110
+100011100101
+110010010100
+001110110101
+100011000000
+110100111100
+100100001111
+010110011001
+000001111101
+100001000010
+110010101110
+000101001100
+100100010010
+111111101000
+001010111001
+100101000001
+001101101110
+101100011010
+100100011100
+111100000111
+101011000100
+110000101010
+101100111010
+101100010101
+001011111101
+011010000110
+001101000011
+110001001110
+011010101111
+001111111011
+001100100001
+111010110001
+011011111100
+001011111001
+111110111110
+011111001011
+110110011101
+111110011011
+101101010010
+110111011110
+111011110100
+111110001011
+110100000010
+000011111001
+100001001111
+101110101010
+000111111011
+011110110001
+000011110110
+011101001011
+010011001110
+101110011110
+110101010011
+111010100011
+010101011001
+011011010101
+000010110100
+010011001000
+110000010010
+101111111001
+000100111011
+011101010101
+100011101111
+001010110100
+101101000110
+011100111011
+000100010111
+010111100000
+100100111110
+110110001111
+010010010111
+001000001110
+001110000101
+001111101100
+101100111110
+111011010111
+110110111000
+000111110001
+111001101001
+011111001000
+001110100011
+111100100010
+010111101000
+111100110101
+111100111010
+010100110110
+100101111100
+101000011000
+011011111111
+010000111100
+101111000000
+100001011000
+110010010110
+111000011011
+010100110111
+100100110011
+000010011101
+010001100111
+011000110011
+100101001101
+110111011011
+000100001000
+011111100101
+110110111100
+100010010100
+110110110111
+111000111011
+101101111000
+000000110110
+101111111010
+000110000001
+011111000110
+110010100111
+111010101111
+101011000010
+011001010111
+010100111110
+110001111000
+110101101111
+011001000110
+111000111111
+010100100111
+100001100001
+110101011010
+000110111000
+101101001010
+010110100110
+111101101010
+110100011111
+101010010000
+001100001001
+001000000101
+111000010001
+100100101100
+001111100011
+110110010000
+011010111010
+011001110110
+000000100111
+011110111100
+011101000101
+011000111010
+110110100011
+101110101000
+111001111001
+010001000001
+111000111100
+001011101011
+110111111111
+010111011101
+110010001010
+011111000100
+011001100110
+011100000010
+000101100010
+000111111010
+000000010101
+010011110110
+000111111101
+101101000010
+101111010001
+011110001101
+100000000111
+110111111110
+000010011110
+111000010010
+110011110011
+101101101011
+011011101110
+101011011000
+000101101001
+010110100011
+011001100111
+011101000011
+001110010110
+001001010010
+111110101001
+001111001001
+010101001111
+100111100001
+011100010101
+100001110011
+010001110001
+101011010101
+000100000110
+100101110001
+100101110010
+111011011001
+100110101101
+101100110001
+101111100101
+001010000000
+011000100011
+010010001111
+011100011101
+001100110010
+000001011111
+101111000011
+111000111110
+011111100100
+100110000000
+011110110100
+001100101011
+110010101010
+010011100100
+011000010100
+001101100101
+101010101000
+011110011010
+010010001100
+010100010001
+010001011011
+110010011001
+010111000101
+111011010110
+111010111100
+011111101000
+100110010100
+010101011011
+010111001011
+011110010011
+011000011110
+100001000111
+000011111101
+111100101001
+000000100011
+110011100100
+101111100001
+010011110111
+101000001011
+001101111001
+100111000011
+000001000100
+100100010000
+000010010100
+000111111001
+000100100010
+011011011111
+010110011110
+001101010011
+110111101001
+111011101111
+100110000100
+001101110111
+010101101110
+011010100011
+010010100101
+101110110110
+111000001011
+010001101000
+111101100110
+100111010001
+100010011010
+101111001000
+011000100000
+111000010101
+100101011001
+011011110011
+110011001010
+000110010111
+101000010011
+100100111100
+001111000001
+001110101101
+100111100011
+011001011101
+111000000000
+101001010011
+000000111101
+000011000000
+001011000100
+011111111011
+000111101111
+101100011000
+111011000001
+101000000111
+111110000100
+101001110100
+010111000001
+010010101001
+110011001111
+100010000010
+001001001010
+100110010110
+101100110010
+111000111010
+101110011111
+110111111001
+011010110011
+111010100010
+110000011000
+011000101011
+001001000001
+000100110010
+111100000000
+001010100101
+101011010110
+110001010100
+101111010000
+000110000000
+111110011000
+110011110111
+011010111001
+001100110110
+111111111101
+001010010001
+101001111000
+000100110101
+000100111111
+100000110111
+001011100001
+001010111000
+100010101100
+110110000111
+100101010010
+101001001010
+110000011101
+111010010101
+001011011000
+101101101001
+010101111011
+101010011100
+000010000011
+001110110110
+111100001111
+011000000001
+000000111010
+000110011110
+010100110010
+000111010000
+110111110111
+110000000101
+011111111111
+010101000011
+110000101000
+000001110001
+010001010010
+100100010110
+000100101110
+100011011000
+000110010001
+100000001001
+011010010001
+010111101011
+101101101100
+001101100001
+010101111101
+001010101110
+001110001001
+100101110110
+001000110011
+010001011110
+100110011001
+010100101110
+101101111011
+001110110011
+000111001111
+100100110110
+101000111101
+100000111100
+111000101100
+000010010011
+001100001101
+111101011011
+001100101010
+001000010001
+011001010010
+111011101011
+010010001101
+000100100011
+111110001111
+110010001111
+010001100010
+101101110001
+101100110011
+110111111011
+011011010100
+011101100101
+111111000100
+101111001001
+010000000100
+011001111110
+110101111100
+111111100001
+111011000100
+100110100001
+101001110000
+001011010010
+011010001000
+110010001110
+000101111001
+010100100110
+011100110100
+000011111000
+100100000111
+110111001000
+111100001110
+001010101100
+010111111011
+111010100100
+101000011101
+110111100110
+111100110100
+000010011010
+000110101111
+001101010001
+010010000111
+011000100001
+110111100100
+010011100101
+011001001011
+101101010100
+010000010001
+001001110001
+100010000110
+111101111011
+011110100101
+000101001000
+111110011100
+000001101110
+111101000001
+100111000100
+011110100011
+110000101011
+000010011111
+000101011001
+101100111001
+011010000111
+000010001011
+010001111110
+000010111110
+101001111110
+000110001101
+001100101001
+000101111011
+110000100110
+110001000011
+000001111100
+010100111010
+011001000001
+110111000010
+110011101010
+001101101000
+100110100011
+000010101010
+101101111010
+111111100111
+010101000000
+011010011110
+011110100100
+100000110000
+011111011100
+011000001110
+000010000010
+101011010010
+010101110000
+110001000000
+011111111100
+101110110010
+111111011001
+100000110110
+111010100111
+000001100101
+101010010111
+010000110110
+001000010111
+101000100000
+100101000011
+111100011011
+010110001101
+101010100110
+101111111101
+100000111001
+011100001000
+110111011000
+100011101101
+101101110011
+000010101100
+000011000001
+011110110110
+001100011110
+010100111111
+011111101011
+000011110100
+001000100111
+010000000101
+111001111000
+111001010001
+001100000001
+110110111010
+101000011010
+010100111001
+000100111100
+110000100011
+100000101011
+001001001110
+101110111101
+110101001110
+101110110100
+001111110101
+100000010101
+110000011010
+111101100011
+101001100100
+100010100001
+011001010000
+111001110000
+101000100111
+100111011110
+000000101111
+101000110000
+110100001111
+001101101010
+010011001101
+000110011101
+101011110000
+100010011110
+101010100011
+000110111011
+000101110110
+001000000011
+011011111010
+101011101111
+000011010101
+010001011101
+001010011100
+011111111000
+111011100111
+010111010001
+010111101001
+101000110100
+000001010000
+010001000101
+000010111101
+010101101111
+010100001010
+100010011101
+011111011001
+111010001001
+000110011011
+000001001000
+100011011111
+110001011000
+001101011000
+000010001101
+100100101111
+110101111011
+000010010110
+001110011010
+100110101000
+100101101100
+110011101101
+000011011011
+110110010110
+001111011110
+100111010100
+011001000000
+011011100001
+101100111000
+010001000011
+010110010110
+101010110100
+101011100100
+110001110101
+110110001100
+000100011011
+110100010000
+101010110001
+110010111000
+110011100101
+010000100100
+101100000011
+111101111101
+000100001100
+000000101011
+101101100000
+000111000110
+010100001000
+011110100001
+101101110010
+110010001101
+011100001001
+001100111111
+000011011010
+001110011110
+000010011000
+111001100010
+110100010001
+100001000100
+000110100000
+111011110111
+001011110000
+000001100010
+001000110001
+110001000010
+010100000011
+010110001111
+100111001001
+011100011011
+011101101111
+110000101100
+101111011111
+101111000110
+111001101011
+011011101111
+010110010101
+100001001100
+011101110011
+000001100001
+001000110111
+011000110001
+111000000111
+000100101001
+101100101101
+000100010110
+110010101001
+100110011100
+000111010011
+110100000100
+101011001110
+010011110001
+010110110100
+111111001000
+010100101111
+101111101000
+011110101000
+001011111000
+111110010111
+101101010000
+111111010100
+100111010011
+011101010011
+100000111110
+100010111111
+011011100010
+111000011101
+010100001101
+010100001011
+001111101001
+011001111100
+111101000111
+000100000000
+110101111001
+111010011111
+010010011101
+001101101011
+110111101111
+001000111001
+100010110000
+000000000101
+101001000001
+001110001101
+110111001101
+111010101110
+101001000110
+000011100011
+010101001101
+000111000001
+001011011101
+111100011101
+111101000110
+101101001011
+101110010101
+110100111000
+000010101101
+000110000110
+100001110001
+011010010000
+110000011111
+101011011110
+000010001111
+100001100101
+111010000001
+010010001011
+011111110100
+000001010010
+110010010111
+011000001000
+011101010100
+111110111101
+111100010100
+001101111000
+011110000001
+111011111001
+111011011011
+001010010011
+011011001110
+101101111111
+001101011001
+010111001000
+101110001011
+111101100111
+001101110010
+100001100110
+010100010100
+110010111011
+110011110110
+010110011101
+101101011001
+001111110011
+100000001100
+110010000000
+001011001100
+001111111100
+110010100101
+100000101100
+011000101101
+000101000010
+100100110001
+010111111110
+101111110100
+100001101011
+111010100001
+100111101010
+100110110000
+000101011000
+100011110011
+110100101101
+010011011011
+011010000001
+010000100001
+001101111110
+110000000010
+011010000000
+100110111001
+101011000011
+100101010101
+001100110111
+001111011001
+110000110100
+111101000000
+110101010100
+011100110111
+001100100000
+111110010110
+101010111010
+110100011010
+110010010010
+101000101101
+111110010010
+100111001000
+110000101110
+100001101110
+100011010110
+000101000001
+000010110111
+000110000100
+011101110101
+111100011010
+000000010100
+111100011000
+110110101011
+001100010101
+000010010010
+010100110001
+001001010110
+100110000011
+110100100001
+000111110010
+011000011011
+111101001000
+001101110101
+001101110110
+010101101010
+110111000011
+011110000010
+011010011011
+111100110001
+010001001000
+000101100110
+010001110111
+010000101000
+000000100000
+100011001011
+100001111110
+100011111101
+101101001110
+101110110011
+100000011111
+001101010111
+111101100000
+011010001111
+101001010010
+100010100000
+011000100111
+101100100000
+011011000011
+001101001011
+001010001011
+110100000001
+111110001000
+101000010101
+100011000010
+010110101000
+011101011111
+000110001000
+101100000111
+110100101001
+101001101001
+010111000011
+011101000001
+101011001000
+110101001101
+010010100110
+111001110011
+010111010010
+010011101100
+001110111100
+010111011110
+000010001100
+111000001001
+001100101110
+111001100011
+010000011001
+111010111111
+010011111111
+011100100110
+001001101111
+001000111110
+010101111000
+011011001011
+101110001100
+010100010010
+000001011011
+000001100100
+000000010011
+000001110011
+010101001000
+110110100001
+001101101101
+011010001110
+101011100110
+110001100101
+110100100110
+101010110000
+110100110101
+011101000100
+101110001010
+001100110101
+000100011110
+101110111001
+011111101010
+010110001010
+110111110010
+001000101110
+100011001100
+010011010101
+100101001001
+111011001110
+101100000100
+000010111100
+111000101111
+010001001100
+010011110100
+010010110000
+001111101110
+111110110111
+101010000010
+010001101101
+111001000000
+100011001010
+100000111111
+110000001101
+000000111110
+010011100111
+010110110010
+010110010000
+011010001001
+101000110101
+111110001010
+100101001010
+011000001001
+011100010111
+111010111000
+011011001100
+001010000100
+011100001110
+001001110010
+110001000110
+100100010111
+101110001101
+000100001001
+001001011111
+100111100100
+100001100011
+000011011110
+101011111110
+111000011000
+000100001010
+011111010111
+011001010100
+011101110111
+001100000110
+100011011101
+011010111111
+010110100111
+011000111001
+000100111010
+011001001110
+111010001000
+110011000101
+110001101010
+001101100111
+101011101010
+000001001010
+110110010100
+100000000001
+000011011101
+010011101110
+101001100110
+111110011001
+110010100000
+100011000100
+111111000001
+010000100011
+000100010010
+010111000010
+011111101001
+101101100100
+011011000101
+111110010000
+001000000000
+011000001011
+111111110110
+011010110110
+000001111110
+011101001000
+110101010000
+110001010000
+101000100001
+111100001001
+000000000110
+100000011101
+101001011011
+000001001100
+110000010110
+110000001011
+000101101101
+001011000111
+100110011111
+011111011101
+110010101111
+000000000001
+000101110001
+100011000001
+100101010011
+100011010111
+001101100000
+001100111110
+100101000111
+100011110111
+100000110011
+111010000101
+010101110110
+101010001011
+011001100100
+111101110011
+110011000001
+111011101100
+110010011010
+111100010011
+001011011001
+000000000000
+001000001101
+001110010001
+000011010100
+100001010101
+101010001000
+110100011011
+011100111000
+111111111001
+100101001110
+100011100011
+101000101000
+010101110101
+011100011100
diff --git a/2021/04/bingo.tl b/2021/04/bingo.tl
new file mode 100644
index 0000000..cd82c47
--- /dev/null
+++ b/2021/04/bingo.tl
@@ -0,0 +1,130 @@
+(defstruct board ()
+ rows)
+
+(defstruct bingo ()
+ numbers
+ boards)
+
+(defun read-bingo (name)
+ (let* ((lines (remqual "" (file-get-lines name)))
+ (numbers [mapcar toint (spl "," (pop lines))])
+ (boards (mapcar (do new board rows @1)
+ (tuples 5 (mapcar (opip (tok #/\d+/) (mapcar toint))
+ lines)))))
+ (new bingo numbers numbers boards boards)))
+
+(defmeth board check (bo)
+ (when-match @(or @(some (* * * * *))
+ ((* . @nil)
+ (* . @nil)
+ (* . @nil)
+ (* . @nil)
+ (* . @nil))
+ ((@nil * . @nil)
+ (@nil * . @nil)
+ (@nil * . @nil)
+ (@nil * . @nil)
+ (@nil * . @nil))
+ ((@nil @nil * . @nil)
+ (@nil @nil * . @nil)
+ (@nil @nil * . @nil)
+ (@nil @nil * . @nil)
+ (@nil @nil * . @nil))
+ ((@nil @nil @nil * . @nil)
+ (@nil @nil @nil * . @nil)
+ (@nil @nil @nil * . @nil)
+ (@nil @nil @nil * . @nil)
+ (@nil @nil @nil * . @nil))
+ ((@nil @nil @nil @nil * . @nil)
+ (@nil @nil @nil @nil * . @nil)
+ (@nil @nil @nil @nil * . @nil)
+ (@nil @nil @nil @nil * . @nil)
+ (@nil @nil @nil @nil * . @nil)))
+ bo.rows t))
+
+(defmeth board daub (bo num)
+ (upd bo.rows
+ (mapcar (op mapcar (iffi (op eql num) (ret '*)))))
+ bo)
+
+(defmeth board value (bo)
+ (sum bo.rows (op sum @1 [iff numberp use (ret 0)])))
+
+(defmeth bingo solve (bi)
+ (each ((x bi.numbers))
+ (each ((bo bi.boards))
+ (if bo.(daub x).(check)
+ (return-from solve (* x bo.(value)))))))
+
+(defmeth bingo solve-last (bi)
+ (each ((x bi.numbers))
+ (each ((bo bi.boards))
+ (if (and bo.(daub x).(check)
+ (empty (upd bi.boards (remq bo))))
+ (return-from solve-last (* x bo.(value)))))))
+
+(defun tests ()
+ (assert (new board rows '((* * * * *))).(check))
+ (assert (new board rows '((1 2 3 4 5) (* * * * *))).(check))
+ (assert (new board rows '((* 2 3 4 5)
+ (* 2 3 4 5)
+ (* 2 3 4 5)
+ (* 2 3 4 5)
+ (* 2 3 4 5))).(check))
+ (assert (new board rows '((2 * 3 4 5)
+ (2 * 3 4 5)
+ (2 * 3 4 5)
+ (2 * 3 4 5)
+ (2 * 3 4 5))).(check))
+ (assert (new board rows '((2 3 * 4 5)
+ (2 3 * 4 5)
+ (2 3 * 4 5)
+ (2 3 * 4 5)
+ (2 3 * 4 5))).(check))
+ (assert (new board rows '((2 3 4 * 5)
+ (2 3 4 * 5)
+ (2 3 4 * 5)
+ (2 3 4 * 5)
+ (2 3 4 * 5))).(check))
+ (assert (new board rows '((2 3 4 5 *)
+ (2 3 4 5 *)
+ (2 3 4 5 *)
+ (2 3 4 5 *)
+ (2 3 4 5 *))).(check))
+ (assert (not (new board rows '((* * 3 * *))).(check)))
+ (assert (not (new board rows '((1 2 3 4 5) (* * * * 3))).(check)))
+ (assert (not (new board rows '((* 2 3 4 5)
+ (6 2 3 4 5)
+ (* 2 3 4 5)
+ (* 2 3 4 5)
+ (* 2 3 4 5))).(check)))
+ (assert (not (new board rows '((2 6 3 4 5)
+ (2 * 3 4 5)
+ (2 * 3 4 5)
+ (2 * 3 4 5)
+ (2 * 3 4 5))).(check)))
+ (assert (not (new board rows '((2 3 * 4 5)
+ (2 3 * 4 5)
+ (2 3 * 4 5)
+ (2 3 6 4 5)
+ (2 3 * 4 5))).(check)))
+ (assert (not (new board rows '((2 3 4 * 5)
+ (2 3 4 * 5)
+ (2 3 4 6 5)
+ (2 3 4 * 5)
+ (2 3 4 * 5))).(check)))
+ (assert (not (new board rows '((2 3 4 5 *)
+ (2 3 4 5 *)
+ (2 3 4 5 *)
+ (2 3 4 5 *)
+ (2 3 4 5 6))).(check)))
+ (assert (equal (new board rows '((1 2 3 4 5)
+ (6 7 8 9 10)
+ (11 12 13 14 15))).(daub 8).rows
+ '((1 2 3 4 5)
+ (6 7 * 9 10)
+ (11 12 13 14 15))))
+ (assert (eq (new board rows '((1 * * * *)
+ (* * * * 2)
+ (* * 3 * *))).(value)
+ 6)))
diff --git a/2021/04/input b/2021/04/input
new file mode 100644
index 0000000..2ad5f8f
--- /dev/null
+++ b/2021/04/input
@@ -0,0 +1,601 @@
+17,58,52,49,72,33,55,73,27,69,88,80,9,7,59,98,63,42,84,37,87,28,97,66,79,77,61,48,83,5,94,26,70,12,51,82,99,45,22,64,10,78,13,18,15,39,8,30,68,65,40,21,6,86,90,29,60,4,38,3,43,93,44,50,41,96,20,62,19,91,23,36,47,92,76,31,67,11,0,56,95,85,35,16,2,14,75,53,1,57,81,46,71,54,24,74,89,32,25,34
+
+59 98 84 27 56
+17 35 18 64 34
+62 16 74 26 55
+21 99 1 19 93
+65 68 53 24 73
+
+ 1 86 98 16 6
+93 69 33 49 71
+54 43 77 29 47
+82 73 99 31 27
+28 48 36 89 20
+
+80 92 52 23 67
+47 38 4 25 65
+54 31 77 13 39
+18 70 17 22 24
+14 99 30 96 8
+
+88 97 17 48 71
+60 50 15 37 24
+78 6 79 56 91
+70 30 72 46 73
+41 42 32 7 59
+
+37 20 34 32 3
+48 40 4 27 42
+94 87 14 24 57
+17 18 90 44 76
+43 28 46 5 19
+
+ 3 69 88 77 74
+ 6 44 12 81 49
+73 23 32 97 53
+83 4 85 38 61
+10 87 50 60 47
+
+84 17 58 31 79
+25 97 35 72 16
+11 91 75 67 41
+ 6 85 27 44 86
+43 40 54 95 68
+
+70 55 88 22 50
+96 98 48 85 75
+95 72 8 26 14
+16 63 46 91 78
+93 3 83 99 21
+
+29 7 6 75 36
+37 93 23 63 65
+56 79 87 48 49
+27 24 80 53 33
+86 46 95 99 42
+
+33 30 72 99 65
+49 93 76 36 53
+26 35 86 97 12
+47 19 54 25 3
+75 34 50 8 95
+
+41 69 49 0 48
+73 9 72 61 85
+56 20 58 57 1
+12 82 38 21 46
+34 83 11 68 53
+
+54 79 35 24 33
+89 77 75 76 96
+94 2 38 39 40
+63 51 34 12 30
+20 21 70 26 23
+
+82 62 87 42 19
+94 65 18 4 33
+ 0 30 27 55 66
+76 46 78 14 48
+57 53 43 15 75
+
+94 38 96 44 46
+10 14 75 97 76
+ 7 61 56 36 1
+81 67 49 78 86
+31 65 88 24 63
+
+22 2 51 36 24
+78 62 67 13 84
+32 91 59 66 33
+73 80 54 3 85
+65 70 98 79 55
+
+80 1 23 70 47
+91 88 24 56 11
+98 79 72 31 86
+ 7 87 28 25 92
+74 20 62 46 71
+
+62 45 91 49 96
+73 3 57 30 95
+74 31 12 17 40
+53 39 63 55 1
+58 82 23 64 84
+
+11 71 60 51 63
+90 64 79 88 39
+65 13 76 66 26
+20 34 40 0 95
+21 72 62 83 77
+
+24 70 72 60 63
+53 69 94 74 57
+25 41 20 84 45
+76 68 16 15 18
+75 58 0 10 47
+
+17 23 90 8 4
+88 24 74 12 18
+62 99 67 49 92
+29 64 16 21 25
+ 9 19 30 60 53
+
+28 85 61 76 29
+15 33 89 48 1
+68 77 11 93 51
+87 59 8 5 54
+65 34 18 81 43
+
+53 9 31 23 35
+17 59 91 43 25
+ 7 90 5 33 58
+21 68 29 52 15
+86 3 48 11 26
+
+78 77 63 91 24
+40 31 54 17 72
+84 21 69 45 38
+89 12 70 42 65
+27 52 97 64 94
+
+36 23 33 20 70
+35 10 52 18 34
+22 19 98 93 5
+67 94 90 51 62
+38 6 53 64 76
+
+90 69 16 70 34
+57 94 3 61 36
+60 22 47 97 31
+30 8 4 84 91
+12 65 37 18 72
+
+12 93 39 1 96
+ 0 13 67 55 72
+84 9 30 40 62
+10 74 79 41 85
+51 52 47 98 75
+
+63 82 76 42 50
+40 75 85 10 99
+ 6 34 22 43 15
+87 57 79 66 55
+97 24 72 54 68
+
+68 39 48 66 81
+26 9 96 5 38
+22 1 57 30 98
+ 2 43 14 50 97
+56 37 62 13 29
+
+ 4 9 98 28 11
+21 20 10 39 69
+85 47 87 94 36
+88 75 35 22 91
+86 44 2 56 12
+
+98 65 26 91 86
+ 7 25 45 80 22
+39 2 95 69 46
+84 49 68 85 47
+23 90 40 4 44
+
+63 2 32 56 52
+30 11 33 10 70
+36 34 88 82 37
+62 57 40 28 96
+58 73 41 69 85
+
+ 8 27 64 80 19
+87 79 99 53 95
+84 6 31 22 3
+44 91 47 41 82
+16 74 43 29 70
+
+32 67 62 81 36
+47 61 74 60 57
+27 35 38 4 26
+34 72 2 21 90
+49 84 42 31 76
+
+ 3 53 26 35 12
+20 30 0 76 80
+96 46 89 83 48
+ 7 13 98 66 75
+97 82 55 5 68
+
+22 61 69 36 77
+95 53 4 21 94
+ 5 17 18 2 96
+ 0 81 56 31 66
+70 75 55 58 42
+
+97 10 40 80 43
+57 90 53 34 13
+38 7 47 86 89
+51 65 76 85 0
+48 62 28 42 35
+
+ 6 21 88 78 22
+30 90 65 53 66
+31 36 3 99 32
+52 13 69 68 72
+57 97 79 73 94
+
+77 76 81 94 20
+45 17 52 49 18
+98 56 21 32 80
+63 99 87 24 43
+61 1 16 3 40
+
+ 3 45 98 84 31
+99 23 90 71 27
+24 60 46 69 37
+83 62 6 36 49
+42 55 11 68 17
+
+60 22 98 46 0
+59 9 28 16 26
+56 33 43 93 31
+73 27 29 6 94
+13 12 51 61 45
+
+85 22 48 27 58
+86 23 65 19 91
+50 36 97 10 78
+15 9 3 72 96
+31 1 87 8 14
+
+79 48 30 50 77
+92 71 90 25 14
+39 45 98 1 84
+47 8 66 60 74
+80 75 55 62 35
+
+45 60 77 16 18
+78 21 23 44 56
+36 27 99 80 61
+81 71 75 58 5
+53 49 46 9 38
+
+56 6 53 79 33
+ 3 62 30 83 96
+ 1 34 12 44 47
+58 35 87 91 69
+20 85 0 60 4
+
+ 9 87 28 94 66
+ 3 10 27 13 54
+40 0 43 35 85
+67 34 81 92 58
+21 53 79 6 19
+
+23 72 9 1 57
+61 73 33 52 64
+ 7 21 92 84 46
+50 56 38 25 76
+75 67 47 81 37
+
+50 4 98 48 85
+46 39 45 93 69
+60 5 79 68 21
+31 67 8 74 16
+88 3 15 84 23
+
+53 61 99 17 25
+16 86 27 83 46
+ 9 75 67 19 10
+84 81 76 88 8
+49 97 79 3 21
+
+69 40 56 75 4
+34 16 79 46 77
+19 54 35 74 84
+73 50 20 47 10
+62 99 51 6 92
+
+53 79 80 96 45
+28 0 2 35 33
+51 70 34 90 72
+30 54 41 38 15
+91 73 97 23 49
+
+20 78 55 10 18
+61 89 14 2 17
+93 96 41 70 76
+19 37 47 80 71
+82 92 90 0 57
+
+29 40 64 62 32
+56 58 7 68 67
+16 76 4 50 13
+37 90 66 60 83
+33 97 25 80 54
+
+56 91 67 49 98
+85 15 25 1 32
+24 93 86 54 52
+22 73 23 63 94
+65 72 14 26 55
+
+74 38 19 20 11
+57 86 87 29 89
+13 21 75 85 44
+33 84 56 76 92
+52 37 64 72 73
+
+45 14 60 32 59
+66 49 16 2 94
+19 10 68 90 78
+95 8 93 61 24
+85 48 29 28 84
+
+ 6 74 4 42 86
+88 79 8 96 66
+63 85 89 9 12
+57 1 67 38 32
+87 26 71 78 46
+
+78 49 54 77 56
+18 4 50 14 23
+16 12 25 64 39
+75 2 22 41 37
+88 19 93 85 53
+
+79 6 52 48 37
+51 67 66 42 3
+63 43 39 56 91
+ 8 18 7 29 89
+55 71 45 36 38
+
+ 9 8 42 35 79
+11 62 7 93 68
+28 26 61 96 19
+29 88 81 43 98
+84 80 23 77 17
+
+90 21 51 43 60
+95 12 34 77 29
+75 82 47 92 15
+56 73 52 64 7
+17 85 94 41 46
+
+43 75 58 76 35
+37 41 65 60 14
+90 51 83 32 88
+26 99 16 68 64
+44 97 24 29 20
+
+50 32 90 95 27
+34 38 82 39 15
+60 66 68 40 22
+85 98 87 58 7
+30 54 97 11 33
+
+77 30 84 12 0
+34 6 5 70 44
+87 67 4 61 75
+31 96 52 57 8
+21 41 13 45 62
+
+ 6 26 69 27 75
+61 33 88 38 20
+ 9 56 70 98 82
+80 76 55 66 29
+97 84 42 77 73
+
+83 35 25 47 69
+70 31 93 56 57
+97 14 26 55 27
+51 39 98 77 17
+45 86 6 95 89
+
+18 9 29 14 38
+69 64 30 90 57
+75 97 80 94 44
+85 41 11 96 86
+33 81 58 26 49
+
+31 11 12 75 96
+68 85 95 2 47
+35 57 87 41 6
+65 50 74 25 59
+26 9 30 17 88
+
+54 59 23 46 37
+56 43 91 75 1
+18 96 11 84 14
+30 94 82 2 8
+67 90 99 33 34
+
+51 90 80 71 32
+73 18 8 35 58
+53 91 60 74 37
+76 9 25 17 31
+54 84 43 88 34
+
+20 8 27 64 40
+11 99 85 72 32
+62 7 55 83 35
+96 48 12 33 30
+73 4 21 16 75
+
+14 15 52 30 88
+97 94 59 56 77
+31 12 41 36 20
+62 3 2 38 82
+68 45 33 91 61
+
+ 4 11 9 89 60
+97 70 18 57 40
+98 75 6 50 88
+56 30 21 80 83
+ 7 73 65 23 69
+
+70 23 49 90 82
+ 1 68 95 33 76
+72 89 39 51 59
+ 8 65 88 73 24
+47 26 80 5 34
+
+13 50 15 43 51
+ 7 58 40 68 91
+62 18 47 79 42
+60 1 74 71 86
+25 53 36 10 70
+
+92 96 37 63 61
+49 94 65 13 23
+15 75 52 10 82
+30 59 14 43 48
+53 62 21 35 0
+
+79 84 95 93 41
+58 94 6 20 92
+88 0 78 16 21
+40 96 24 2 66
+85 87 13 14 80
+
+33 53 54 20 37
+18 88 70 61 85
+90 76 12 44 79
+81 69 9 98 74
+14 13 15 36 93
+
+61 46 67 24 98
+80 36 41 86 9
+82 75 40 42 58
+49 51 99 5 90
+91 97 26 20 56
+
+90 22 94 41 7
+13 16 51 44 32
+ 5 43 60 19 49
+38 96 23 12 79
+57 85 58 3 48
+
+52 3 40 90 43
+14 64 59 93 56
+99 94 61 72 46
+84 87 48 22 91
+ 2 67 35 76 92
+
+48 82 26 38 90
+50 98 30 76 60
+ 1 49 92 99 77
+59 97 22 47 93
+81 35 43 23 53
+
+41 5 57 29 2
+90 23 55 75 96
+48 60 86 67 8
+34 12 59 6 45
+89 1 44 49 76
+
+76 81 4 44 22
+89 84 85 70 11
+51 97 50 25 95
+31 27 21 40 87
+65 91 69 58 23
+
+96 42 98 38 52
+39 57 40 94 91
+87 79 23 36 82
+ 4 72 95 22 43
+51 73 59 15 44
+
+99 29 30 90 33
+60 61 65 8 56
+89 87 25 95 55
+ 6 39 69 98 20
+76 81 85 16 93
+
+86 35 92 90 19
+26 55 21 12 33
+ 3 82 41 47 15
+14 94 63 62 23
+95 65 2 0 72
+
+22 8 49 39 36
+63 7 61 92 51
+25 96 43 1 46
+28 64 59 47 27
+87 65 48 88 37
+
+58 59 93 23 70
+18 97 83 73 21
+90 14 13 95 45
+44 6 10 80 15
+92 56 26 76 52
+
+34 68 7 52 51
+17 25 97 35 78
+ 2 40 89 67 24
+73 37 45 0 64
+57 66 47 4 12
+
+11 35 14 69 13
+86 90 2 19 27
+70 0 6 31 98
+64 23 54 88 26
+94 43 59 71 36
+
+28 9 67 39 20
+16 44 47 69 96
+19 45 30 91 68
+75 56 37 35 52
+27 42 93 43 84
+
+24 67 39 70 93
+71 72 12 85 1
+77 59 66 5 76
+54 13 35 40 82
+51 25 64 6 19
+
+65 36 92 51 74
+55 90 68 9 97
+28 56 35 34 73
+50 10 61 37 30
+79 49 96 18 1
+
+57 8 17 51 19
+86 97 21 84 20
+32 44 33 27 62
+ 3 76 70 58 79
+36 74 75 65 71
+
+24 65 37 29 66
+26 60 49 45 61
+23 22 83 71 10
+46 59 86 40 12
+64 74 27 8 78
+
+63 79 80 54 68
+16 89 60 96 31
+ 6 91 32 37 86
+93 20 61 70 21
+58 88 11 15 39
+
+36 44 75 3 29
+58 32 84 37 48
+76 99 65 91 24
+22 20 42 57 49
+50 85 52 2 54
+
+77 65 38 15 12
+50 53 10 34 40
+87 60 4 68 71
+ 5 35 28 63 66
+11 86 9 8 49
+
+ 3 71 46 10 1
+83 12 52 99 24
+96 87 85 51 33
+11 69 62 34 41
+88 22 89 21 49
+
+55 0 82 40 48
+71 32 3 90 92
+39 69 63 86 60
+51 36 66 12 46
+73 57 58 33 94
diff --git a/2021/05/input b/2021/05/input
new file mode 100644
index 0000000..04fa5cb
--- /dev/null
+++ b/2021/05/input
@@ -0,0 +1,500 @@
+657,934 -> 657,926
+130,34 -> 570,474
+478,716 -> 226,464
+861,110 -> 861,167
+448,831 -> 370,831
+75,738 -> 390,738
+26,880 -> 864,42
+965,658 -> 527,220
+208,381 -> 80,381
+523,475 -> 807,475
+219,69 -> 219,434
+793,538 -> 534,797
+754,602 -> 754,148
+443,327 -> 443,611
+606,395 -> 546,395
+980,56 -> 51,985
+619,325 -> 354,325
+342,123 -> 819,600
+290,533 -> 374,533
+598,77 -> 598,75
+605,302 -> 605,636
+97,981 -> 692,386
+278,779 -> 278,800
+661,377 -> 661,10
+726,108 -> 518,316
+271,883 -> 271,50
+382,271 -> 606,271
+963,358 -> 891,286
+496,880 -> 496,855
+211,142 -> 211,49
+841,866 -> 260,285
+841,849 -> 173,181
+927,326 -> 391,862
+396,558 -> 459,558
+753,183 -> 953,183
+941,698 -> 941,407
+347,612 -> 347,476
+18,340 -> 18,612
+140,299 -> 797,956
+714,907 -> 714,228
+966,155 -> 194,927
+769,674 -> 712,674
+644,675 -> 948,979
+703,872 -> 812,763
+26,629 -> 120,535
+844,738 -> 844,253
+798,133 -> 798,795
+27,318 -> 288,57
+38,545 -> 872,545
+827,351 -> 195,983
+818,45 -> 21,842
+257,559 -> 626,928
+145,925 -> 886,184
+83,618 -> 590,111
+326,243 -> 53,243
+489,278 -> 526,278
+783,693 -> 783,525
+495,636 -> 495,585
+374,716 -> 215,557
+839,536 -> 839,966
+850,468 -> 955,468
+55,799 -> 55,447
+472,722 -> 296,898
+390,731 -> 120,461
+405,493 -> 208,296
+807,42 -> 56,793
+476,327 -> 655,327
+24,965 -> 967,22
+776,211 -> 776,850
+489,20 -> 822,20
+630,740 -> 871,499
+743,493 -> 283,953
+62,429 -> 62,720
+806,270 -> 806,332
+550,154 -> 107,597
+71,713 -> 533,251
+620,575 -> 620,156
+726,829 -> 143,246
+944,553 -> 468,553
+185,582 -> 185,468
+845,266 -> 212,899
+654,97 -> 265,486
+726,609 -> 726,147
+631,76 -> 860,76
+835,24 -> 928,24
+712,719 -> 74,81
+616,478 -> 616,117
+903,226 -> 903,577
+440,699 -> 136,395
+215,705 -> 890,30
+20,24 -> 981,985
+102,144 -> 850,892
+695,967 -> 582,967
+219,284 -> 219,388
+359,833 -> 665,833
+389,55 -> 305,55
+59,32 -> 957,930
+815,198 -> 64,949
+699,540 -> 717,558
+215,682 -> 182,682
+805,489 -> 328,489
+43,546 -> 578,546
+489,181 -> 489,363
+266,391 -> 266,582
+863,368 -> 448,368
+83,236 -> 83,487
+874,875 -> 874,413
+799,90 -> 799,802
+253,29 -> 253,905
+136,446 -> 435,745
+830,534 -> 550,534
+183,785 -> 107,785
+81,517 -> 159,517
+359,941 -> 359,560
+71,546 -> 948,546
+596,811 -> 596,791
+255,960 -> 255,159
+788,15 -> 788,682
+240,55 -> 240,244
+51,423 -> 137,423
+504,418 -> 809,723
+131,842 -> 914,59
+727,790 -> 82,145
+281,509 -> 841,509
+797,807 -> 834,807
+333,499 -> 790,499
+215,328 -> 215,139
+500,898 -> 500,862
+75,217 -> 777,919
+17,264 -> 17,446
+852,755 -> 150,755
+865,186 -> 385,186
+158,192 -> 158,733
+196,261 -> 196,128
+989,960 -> 131,102
+807,393 -> 807,153
+507,579 -> 507,764
+468,76 -> 535,76
+381,357 -> 659,357
+794,277 -> 749,277
+51,152 -> 546,647
+797,959 -> 458,959
+82,156 -> 967,156
+261,624 -> 460,624
+597,53 -> 197,53
+153,507 -> 411,765
+305,717 -> 768,717
+344,954 -> 344,217
+194,432 -> 545,432
+346,46 -> 557,46
+685,599 -> 685,312
+49,719 -> 49,631
+499,668 -> 304,863
+262,405 -> 554,405
+87,64 -> 295,64
+859,675 -> 74,675
+663,776 -> 99,212
+232,189 -> 232,904
+777,276 -> 703,276
+704,492 -> 86,492
+142,736 -> 514,364
+418,611 -> 224,417
+602,571 -> 602,424
+152,603 -> 248,603
+915,673 -> 143,673
+538,32 -> 128,32
+975,885 -> 975,344
+870,511 -> 870,756
+330,798 -> 46,798
+440,195 -> 587,195
+739,237 -> 568,66
+54,838 -> 196,980
+370,556 -> 47,556
+124,575 -> 748,575
+261,283 -> 880,902
+784,91 -> 426,449
+764,670 -> 148,670
+32,51 -> 967,986
+807,906 -> 10,906
+470,488 -> 579,597
+274,649 -> 285,649
+221,540 -> 221,94
+914,957 -> 914,510
+879,825 -> 145,91
+438,833 -> 438,775
+191,844 -> 911,124
+145,763 -> 595,763
+504,81 -> 622,199
+834,206 -> 834,704
+908,308 -> 815,308
+929,567 -> 929,322
+805,50 -> 620,235
+36,409 -> 133,312
+345,375 -> 19,701
+468,948 -> 468,108
+109,547 -> 446,547
+929,916 -> 69,56
+927,857 -> 318,248
+833,948 -> 833,61
+559,787 -> 559,982
+293,825 -> 293,775
+508,744 -> 545,744
+827,713 -> 753,639
+88,775 -> 555,775
+523,812 -> 684,812
+307,142 -> 307,265
+636,40 -> 355,321
+891,875 -> 891,25
+301,423 -> 712,12
+922,187 -> 219,890
+45,447 -> 230,262
+114,568 -> 233,687
+573,398 -> 677,398
+334,101 -> 324,101
+957,277 -> 957,652
+943,834 -> 610,834
+523,632 -> 523,379
+958,361 -> 90,361
+408,824 -> 380,824
+647,314 -> 647,449
+747,83 -> 59,83
+776,104 -> 937,104
+16,984 -> 989,11
+362,581 -> 362,226
+72,962 -> 940,94
+319,877 -> 319,122
+310,206 -> 986,882
+794,877 -> 267,877
+855,58 -> 976,58
+699,971 -> 598,971
+162,556 -> 162,440
+494,859 -> 494,255
+794,210 -> 142,862
+275,510 -> 548,510
+739,592 -> 739,793
+376,985 -> 376,990
+755,264 -> 280,739
+187,34 -> 187,688
+770,827 -> 770,548
+10,68 -> 913,971
+571,427 -> 571,944
+153,211 -> 153,560
+976,972 -> 55,51
+103,611 -> 674,40
+95,972 -> 924,143
+929,94 -> 38,985
+777,330 -> 60,330
+312,430 -> 312,326
+549,433 -> 269,433
+477,267 -> 477,403
+598,375 -> 19,375
+512,799 -> 512,831
+348,700 -> 348,43
+165,97 -> 63,199
+38,835 -> 38,828
+282,334 -> 282,909
+14,891 -> 390,515
+930,657 -> 334,61
+630,341 -> 630,85
+671,464 -> 319,112
+949,340 -> 894,285
+663,916 -> 245,916
+114,395 -> 286,223
+335,804 -> 529,804
+567,338 -> 14,891
+623,705 -> 379,949
+82,864 -> 545,401
+932,128 -> 932,134
+291,294 -> 291,101
+739,765 -> 739,757
+460,94 -> 892,94
+375,673 -> 367,681
+81,831 -> 90,831
+890,402 -> 890,138
+775,547 -> 790,547
+49,927 -> 966,10
+23,116 -> 257,116
+923,75 -> 18,980
+63,986 -> 687,362
+369,844 -> 357,844
+790,188 -> 644,188
+557,282 -> 557,669
+861,173 -> 390,644
+480,529 -> 893,529
+32,960 -> 830,162
+368,725 -> 368,40
+502,600 -> 701,600
+63,977 -> 873,167
+463,518 -> 788,193
+738,406 -> 324,406
+162,931 -> 822,931
+377,487 -> 707,817
+610,319 -> 901,319
+586,658 -> 690,658
+25,288 -> 53,288
+760,602 -> 760,628
+294,62 -> 951,62
+222,773 -> 661,334
+151,483 -> 646,483
+272,852 -> 317,852
+557,906 -> 503,960
+736,445 -> 736,703
+241,376 -> 241,692
+835,41 -> 835,369
+987,743 -> 987,210
+42,700 -> 42,244
+646,136 -> 646,440
+544,751 -> 404,751
+295,651 -> 295,805
+687,878 -> 113,878
+290,142 -> 604,142
+579,920 -> 579,807
+12,985 -> 987,10
+919,940 -> 919,808
+770,143 -> 770,832
+114,76 -> 962,76
+876,882 -> 428,434
+861,139 -> 861,320
+888,59 -> 888,39
+629,823 -> 707,823
+296,598 -> 296,305
+61,54 -> 578,54
+864,58 -> 253,58
+71,861 -> 306,861
+682,181 -> 326,537
+307,418 -> 307,910
+810,251 -> 810,431
+151,836 -> 602,385
+954,987 -> 243,276
+724,272 -> 350,646
+134,295 -> 434,295
+178,235 -> 802,859
+832,688 -> 832,573
+165,334 -> 165,378
+816,26 -> 114,728
+668,192 -> 540,192
+730,341 -> 969,341
+951,169 -> 286,834
+647,115 -> 886,115
+664,288 -> 507,131
+609,362 -> 609,295
+747,479 -> 287,19
+350,967 -> 350,725
+117,383 -> 311,383
+871,124 -> 292,124
+654,271 -> 547,271
+525,773 -> 345,953
+401,670 -> 610,670
+930,196 -> 301,825
+336,37 -> 961,662
+714,212 -> 714,667
+454,848 -> 454,107
+587,390 -> 587,577
+530,437 -> 542,437
+304,229 -> 517,229
+340,571 -> 766,571
+727,941 -> 138,352
+831,325 -> 11,325
+241,294 -> 403,456
+788,658 -> 788,126
+337,360 -> 337,589
+799,402 -> 342,402
+530,820 -> 530,319
+982,27 -> 20,989
+923,936 -> 923,721
+581,395 -> 64,912
+61,509 -> 61,827
+989,580 -> 610,580
+477,592 -> 219,592
+296,775 -> 296,58
+204,12 -> 204,457
+190,171 -> 190,673
+939,200 -> 939,457
+472,282 -> 472,631
+983,331 -> 734,331
+365,609 -> 365,817
+640,698 -> 145,698
+103,618 -> 549,618
+454,319 -> 454,346
+650,815 -> 381,546
+624,603 -> 507,603
+966,445 -> 723,445
+763,129 -> 763,784
+695,145 -> 695,511
+498,84 -> 435,147
+188,716 -> 967,716
+810,446 -> 810,924
+731,483 -> 731,51
+307,783 -> 307,533
+15,956 -> 956,15
+192,210 -> 882,210
+303,173 -> 38,438
+769,952 -> 769,863
+135,781 -> 405,781
+494,436 -> 494,892
+705,394 -> 714,394
+164,37 -> 164,633
+813,232 -> 813,620
+227,906 -> 222,906
+542,432 -> 414,432
+549,858 -> 88,397
+200,101 -> 958,859
+235,565 -> 469,331
+492,871 -> 503,882
+704,398 -> 869,563
+450,736 -> 746,736
+420,706 -> 420,635
+717,493 -> 686,524
+187,554 -> 717,24
+31,851 -> 315,851
+800,230 -> 466,230
+226,324 -> 226,614
+937,927 -> 937,798
+143,26 -> 534,417
+952,344 -> 12,344
+181,361 -> 782,361
+925,906 -> 415,396
+685,944 -> 470,944
+200,627 -> 290,627
+728,285 -> 728,326
+271,864 -> 271,34
+802,558 -> 207,558
+963,26 -> 84,905
+504,60 -> 529,60
+840,292 -> 180,292
+914,272 -> 914,330
+82,107 -> 925,950
+33,245 -> 33,134
+463,663 -> 463,82
+27,305 -> 27,675
+276,894 -> 891,279
+746,325 -> 746,948
+249,657 -> 341,749
+530,848 -> 28,346
+798,617 -> 798,609
+119,767 -> 312,767
+80,18 -> 674,18
+723,374 -> 583,374
+582,985 -> 239,642
+217,765 -> 217,395
+811,159 -> 609,159
+689,896 -> 501,896
+562,881 -> 562,96
+244,621 -> 629,621
+277,379 -> 277,287
+856,153 -> 20,153
+518,228 -> 518,898
+230,789 -> 243,789
+534,335 -> 534,592
+240,790 -> 413,617
+768,615 -> 768,560
+773,101 -> 912,101
+252,571 -> 767,56
+370,595 -> 681,906
+565,176 -> 565,318
+750,465 -> 750,724
+979,130 -> 120,989
+160,153 -> 160,785
+610,222 -> 610,191
+873,124 -> 130,867
+519,593 -> 519,32
+525,947 -> 525,562
+50,292 -> 291,533
+558,927 -> 960,525
+536,694 -> 249,981
+954,896 -> 277,896
+732,202 -> 732,288
+447,989 -> 541,895
+890,754 -> 367,231
+368,89 -> 564,285
+588,100 -> 588,156
+282,313 -> 943,974
+16,792 -> 495,792
+111,591 -> 111,493
+57,713 -> 685,85
+676,632 -> 676,575
+560,708 -> 560,602
+489,288 -> 489,404
+904,515 -> 443,54
+70,977 -> 985,62
+11,119 -> 11,403
+215,859 -> 937,137
+78,469 -> 110,437
+747,605 -> 747,369
+847,598 -> 847,299
+742,695 -> 159,112
+986,370 -> 986,460
+631,900 -> 771,760
+228,406 -> 683,861
+189,639 -> 61,639
+221,650 -> 820,650
+558,569 -> 834,845
+655,533 -> 558,630
+967,921 -> 967,169
+230,308 -> 429,308
+873,762 -> 873,528
+412,151 -> 412,538
+881,587 -> 881,21
+941,45 -> 26,960
+377,126 -> 700,126
diff --git a/2021/05/scratch b/2021/05/scratch
new file mode 100644
index 0000000..d3975a7
--- /dev/null
+++ b/2021/05/scratch
@@ -0,0 +1,15 @@
+525,947 -> 525,562
+
+689,896 -> 501,896
+954,896 -> 277,896
+
+
+
+947 *
+ |
+896 *--->*-----+----------*<--------*
+ |
+562 *
+
+
+ 277 501 525 689 954
diff --git a/2021/05/segs.tl b/2021/05/segs.tl
new file mode 100644
index 0000000..33f06a6
--- /dev/null
+++ b/2021/05/segs.tl
@@ -0,0 +1,201 @@
+(defun read-segs (name)
+ (mapcar (do match `@x0,@y0 -> @x1,@y1` @1
+ (list (tofloat x0) (tofloat y0) (tofloat x1) (tofloat y1)))
+ (file-get-lines name)))
+
+(defun read-int-segs (name)
+ (mapcar (do match `@x0,@y0 -> @x1,@y1` @1
+ (list (toint x0) (toint y0) (toint x1) (toint y1)))
+ (file-get-lines name)))
+
+(defun ccw-from (x0 y0 x1 y1 x2 y2)
+ (let ((dx1 (- x1 x0))
+ (dy1 (- y1 y0))
+ (dx2 (- x2 x0))
+ (dy2 (- y2 y0)))
+ (> (* dx1 dy2) (* dx2 dy1))))
+
+(defun intersect (ax0 ay0 ax1 ay1 bx0 by0 bx1 by1)
+ (and (neq (ccw-from ax0 ay0 ax1 ay1 bx0 by0)
+ (ccw-from ax0 ay0 ax1 ay1 bx1 by1))
+ (neq (ccw-from bx0 by0 bx1 by1 ax0 ay0)
+ (ccw-from bx0 by0 bx1 by1 ax1 ay1))))
+
+(defun b-proj-a (ax0 ay0 ax1 ay1 bx by)
+ (let* ((adx (- ax1 ax0))
+ (ady (- ay1 ay0))
+ (bdx (- bx ax0))
+ (bdy (- by ay0))
+ (a*b (+ (* adx bdx) (* ady bdy)))
+ (a*a (+ (* adx adx) (* ady ady)))
+ (b/a (/ a*b a*a)))
+ (list (+ ax0 (* b/a adx))
+ (+ ay0 (* b/a ady)))))
+
+(defun isecpoint (ax0 ay0 ax1 ay1 bx0 by0 bx1 by1)
+ (tree-bind (x0 y0) (b-proj-a ax0 ay0 ax1 ay1 bx0 by0)
+ (tree-bind (x1 y1) (b-proj-a ax0 ay0 ax1 ay1 bx1 by1)
+ (list (+ x0 (/ (- x1 x0) 2))
+ (+ y0 (/ (- y1 y0) 2))))))
+
+(defun collinear (ax0 ay0 ax1 ay1 bx0 by0 bx1 by1)
+ (and (not (ccw-from ax0 ay0 ax1 ay1 bx0 by0))
+ (not (ccw-from ax0 ay0 ax1 ay1 bx1 by1))
+ (not (ccw-from bx0 by0 bx1 by1 ax0 ay0))
+ (not (ccw-from bx0 by0 bx1 by1 ax1 ay1))
+ (and (or (<= ax0 bx0 ax1) (>= ax0 bx0 ax1)
+ (<= bx0 ax0 bx1) (>= bx0 ax0 bx1)))
+ (and (or (<= ay0 by0 ay1) (>= ay0 by0 ay1)
+ (<= by0 ay0 by1) (>= by0 ay0 by1)))))
+
+(defun dist (x0 y0 x1 y1)
+ (sqrt (+ (square (- x1 x0)) (square (- y1 y0)))))
+
+(defun lap-length (ax0 ay0 ax1 ay1 bx0 by0 bx1 by1)
+ (let ((a0-between (or (and (<= bx0 ax0 bx1) (<= by0 ay0 by1))
+ (and (>= bx0 ax0 bx1) (>= by0 ay0 by1))))
+ (a1-between (or (and (<= bx0 ax1 bx1) (<= by0 ay1 by1))
+ (and (>= bx0 ax1 bx1) (>= by0 ay1 by1))))
+ (b0-between (or (and (<= ax0 bx0 ax1) (<= ay0 by0 ay1))
+ (and (>= ax0 bx0 ax1) (>= ay0 by0 ay1))))
+ (b1-between (or (and (<= ax0 bx1 ax1) (<= ay0 by1 ay1))
+ (and (>= ax0 bx1 ax1) (>= ay0 by1 ay1)))))
+ (cond
+ ((and a0-between a1-between) (dist ax0 ay0 ax1 ay1))
+ ((and b0-between b1-between) (dist bx0 by0 bx1 by1))
+ (a0-between (if b0-between
+ (dist bx0 by0 ax0 ay0)
+ (dist bx1 by1 ax0 ay0)))
+ (t (if b0-between
+ (dist bx0 by0 ax1 ay1)
+ (dist bx0 by0 ax1 ay1))))))
+
+(defun clip (ax0 ay0 ax1 ay1 bx0 by0 bx1 by1)
+ (let ((a0-between (or (and (<= bx0 ax0 bx1) (<= by0 ay0 by1))
+ (and (>= bx0 ax0 bx1) (>= by0 ay0 by1))))
+ (a1-between (or (and (<= bx0 ax1 bx1) (<= by0 ay1 by1))
+ (and (>= bx0 ax1 bx1) (>= by0 ay1 by1))))
+ (b0-between (or (and (<= ax0 bx0 ax1) (<= ay0 by0 ay1))
+ (and (>= ax0 bx0 ax1) (>= ay0 by0 ay1))))
+ (b1-between (or (and (<= ax0 bx1 ax1) (<= ay0 by1 ay1))
+ (and (>= ax0 bx1 ax1) (>= ay0 by1 ay1)))))
+ (assert (or a0-between a1-between b0-between b1-between)
+ "clip: problem with ~s" (list ax0 ay0 ax1 ay1 bx0 by0 bx1 by1))
+ (cond
+ ((and a0-between a1-between) (list ax0 ay0 ax1 ay1))
+ ((and b0-between b1-between) (list bx0 by0 bx1 by1))
+ (a0-between (if b0-between
+ (list bx0 by0 ax0 ay0)
+ (list bx1 by1 ax0 ay0)))
+ (t (if b0-between
+ (list bx0 by0 ax1 ay1)
+ (list bx0 by0 ax1 ay1))))))
+
+(defun unify (ax0 ay0 ax1 ay1 bx0 by0 bx1 by1)
+ (let ((a0-between (or (and (<= bx0 ax0 bx1) (<= by0 ay0 by1))
+ (and (>= bx0 ax0 bx1) (>= by0 ay0 by1))))
+ (a1-between (or (and (<= bx0 ax1 bx1) (<= by0 ay1 by1))
+ (and (>= bx0 ax1 bx1) (>= by0 ay1 by1))))
+ (b0-between (or (and (<= ax0 bx0 ax1) (<= ay0 by0 ay1))
+ (and (>= ax0 bx0 ax1) (>= ay0 by0 ay1))))
+ (b1-between (or (and (<= ax0 bx1 ax1) (<= ay0 by1 ay1))
+ (and (>= ax0 bx1 ax1) (>= ay0 by1 ay1)))))
+ (cond
+ ((and a0-between a1-between) (list bx0 by0 bx1 by1))
+ ((and b0-between b1-between) (list ax0 ay0 ax1 ay1))
+ (a0-between (if b0-between
+ (list bx0 by0 ax1 ay1)
+ (list bx0 by0 ax1 ay1)))
+ (t (if b0-between
+ (list bx1 by1 ax0 ay0)
+ (list bx0 by0 ax0 ay0))))))
+
+(defun rectilinear (x0 y0 x1 y1)
+ (or (= x0 x1) (= y0 y1)))
+
+(defun point-on-segment (x0 y0 x1 y1 px py)
+ (and (or (<= x0 px x1) (<= x1 px x0))
+ (or (<= y0 py y1) (<= y1 py y0))
+ (not (ccw-from x0 y0 x1 y1 px py))
+ (not (ccw-from x1 y1 x0 y0 px py))))
+
+(defun solve-1 (segs)
+ (let (isegs points)
+ (each-match (((@ax0 @ay0 @ax1 @ay1)
+ (@bx0 @by0 @bx1 @by1))
+ (comb segs 2))
+ (when (and (rectilinear ax0 ay0 ax1 ay1)
+ (rectilinear bx0 by0 bx1 by1))
+ (cond
+ ((collinear ax0 ay0 ax1 ay1 bx0 by0 bx1 by1)
+ (push (clip ax0 ay0 ax1 ay1 bx0 by0 bx1 by1) isegs))
+ ((intersect ax0 ay0 ax1 ay1 bx0 by0 bx1 by1)
+ (push (isecpoint ax0 ay0 ax1 ay1 bx0 by0 bx1 by1) points)))))
+ (prinl ^(len points 0 ,(len points)))
+ #;(prinl points)
+ (upd points uniq)
+ (prinl ^(len points 1 ,(len points)))
+ #;(prinl points)
+ (set points (append-matches (@(as p (@px @py)) points)
+ (block nil
+ (each-match ((@x0 @y0 @x1 @y1) isegs)
+ (if (point-on-segment x0 y0 x1 y1 px py)
+ (return)))
+ (list p))))
+ (prinl ^(len points 2 ,(len points)))
+ #;(prinl points)
+ (prinl isegs)
+ (let ((nl (len isegs))
+ (l 0))
+ (while (neq nl l)
+ (let (nsegs pairs (count 0))
+ (set l nl)
+ (each-match ((@(as l0 (@ax0 @ay0 @ax1 @ay1))
+ @(as l1 (@bx0 @by0 @bx1 @by1)))
+ (comb isegs 2))
+ (cond
+ ((collinear ax0 ay0 ax1 ay1 bx0 by0 bx1 by1)
+ (push (list l0 l1) pairs))))
+ (each-match ((@(as l0 (@ax0 @ay0 @ax1 @ay1))
+ @(as l1 (@bx0 @by0 @bx1 @by1)))
+ pairs)
+ (if (and (member l0 isegs)
+ (member l1 isegs))
+ (upd isegs (opip (remq l0)
+ (remq l1)
+ (push (unify ax0 ay0 ax1 ay1 bx0 by0 bx1 by1))))))
+ (set nl (len isegs)))))
+ (prinl isegs)
+ (prinl (len isegs))
+ (+ (len points)
+ (len isegs)
+ [sum isegs (lambda-match
+ (((@x0 @y0 @x1 @y1)) (dist x0 y0 x1 y1)))])))
+
+(defun easy-solve-1 (segs)
+ (let ((ph (hash)))
+ (each-match ((@x0 @y0 @x1 @y1) segs)
+ (cond
+ ((eql x0 x1)
+ (each ((y (range y0 y1)))
+ (inc [ph (list x0 y) 0])))
+ ((eql y0 y1)
+ (each ((x (range x0 x1)))
+ (inc [ph (list x y0) 0])))))
+ [count-if (op < 1) ph cdr]))
+
+(defun easy-solve-2 (segs)
+ (let ((ph (hash)))
+ (each-match ((@x0 @y0 @x1 @y1) segs)
+ (cond
+ ((eql x0 x1)
+ (each ((y (range y0 y1)))
+ (inc [ph (list x0 y) 0])))
+ ((eql y0 y1)
+ (each ((x (range x0 x1)))
+ (inc [ph (list x y0) 0])))
+ ((eql (abs (- x1 x0)) (abs (- y1 y0)))
+ (each ((x (range x0 x1))
+ (y (range y0 y1)))
+ (inc [ph (list x y) 0])))))
+ [count-if (op < 1) ph cdr]))
diff --git a/2021/05/testinput b/2021/05/testinput
new file mode 100644
index 0000000..b258f68
--- /dev/null
+++ b/2021/05/testinput
@@ -0,0 +1,10 @@
+0,9 -> 5,9
+8,0 -> 0,8
+9,4 -> 3,4
+2,2 -> 2,1
+7,0 -> 7,4
+6,4 -> 2,0
+0,9 -> 2,9
+3,4 -> 1,4
+0,0 -> 8,8
+5,5 -> 8,2
diff --git a/2021/06/input b/2021/06/input
new file mode 100644
index 0000000..66ede3c
--- /dev/null
+++ b/2021/06/input
@@ -0,0 +1 @@
+3,5,2,5,4,3,2,2,3,5,2,3,2,2,2,2,3,5,3,5,5,2,2,3,4,2,3,5,5,3,3,5,2,4,5,4,3,5,3,2,5,4,1,1,1,5,1,4,1,4,3,5,2,3,2,2,2,5,2,1,2,2,2,2,3,4,5,2,5,4,1,3,1,5,5,5,3,5,3,1,5,4,2,5,3,3,5,5,5,3,2,2,1,1,3,2,1,2,2,4,3,4,1,3,4,1,2,2,4,1,3,1,4,3,3,1,2,3,1,3,4,1,1,2,5,1,2,1,2,4,1,3,2,1,1,2,4,3,5,1,3,2,1,3,2,3,4,5,5,4,1,3,4,1,2,3,5,2,3,5,2,1,1,5,5,4,4,4,5,3,3,2,5,4,4,1,5,1,5,5,5,2,2,1,2,4,5,1,2,1,4,5,4,2,4,3,2,5,2,2,1,4,3,5,4,2,1,1,5,1,4,5,1,2,5,5,1,4,1,1,4,5,2,5,3,1,4,5,2,1,3,1,3,3,5,5,1,4,1,3,2,2,3,5,4,3,2,5,1,1,1,2,2,5,3,4,2,1,3,2,5,3,2,2,3,5,2,1,4,5,4,4,5,5,3,3,5,4,5,5,4,3,5,3,5,3,1,3,2,2,1,4,4,5,2,2,4,2,1,4
diff --git a/2021/06/sim.tl b/2021/06/sim.tl
new file mode 100644
index 0000000..69d9ac2
--- /dev/null
+++ b/2021/06/sim.tl
@@ -0,0 +1,31 @@
+(defun read-fish (name)
+ (flow
+ (file-get-string name)
+ (tok #/\d+/)
+ (mapcar toint)))
+
+(defun sim-naive (input n)
+ (while (plusp (pdec n))
+ (upd input (mappend [iff zerop (ret '(6 8)) [chain pred list]])))
+ (len input))
+
+(defun sim (input n)
+ (let ((phase (vector 9 0)))
+ (each ((i input))
+ (inc [phase i]))
+ (while (plusp (pdec n))
+ (rotate [phase 0] [phase 1] [phase 2]
+ [phase 3] [phase 4] [phase 5]
+ [phase 6] [phase 7] [phase 8])
+ (inc [phase 6] [phase 8]))
+ (sum phase)))
+
+(defun sim2 (input n)
+ (let ((phase (vector 9 0)))
+ (each ((i input))
+ (inc [phase i]))
+ (while (plusp (pdec n))
+ (pset [phase 8] [phase 0]
+ [phase 0..8] [phase 1..9])
+ (inc [phase 6] [phase 8]))
+ (sum phase)))
diff --git a/2021/06/testinput b/2021/06/testinput
new file mode 100644
index 0000000..55129f1
--- /dev/null
+++ b/2021/06/testinput
@@ -0,0 +1 @@
+3,4,3,1,2
diff --git a/2021/07/calc.tl b/2021/07/calc.tl
new file mode 100644
index 0000000..b6dac9c
--- /dev/null
+++ b/2021/07/calc.tl
@@ -0,0 +1,22 @@
+(defun read-crab (name)
+ (flow
+ (file-get-string name)
+ (tok #/\d+/)
+ (mapcar toint)))
+
+(defun calc (input)
+ (let* ((mn (find-min input))
+ (mx (find-max input))
+ (rg (range mn mx))
+ (cost (op sum input (op abs (- @1 @@1)))))
+ [cost (find-min rg : cost)]))
+
+(defun calc2 (input)
+ (let* ((mn (find-min input))
+ (mx (find-max input))
+ (rg (range mn mx))
+ (cost (op sum input (opip (- @@1) abs (* @1 (succ @1)) (trunc @1 2))
+ #;(lambda (x)
+ (let ((n (abs (- x @1))))
+ (trunc (* n (succ n)) 2))))))
+ [cost (find-min rg : cost)]))
diff --git a/2021/07/input b/2021/07/input
new file mode 100644
index 0000000..4ac01fd
--- /dev/null
+++ b/2021/07/input
@@ -0,0 +1 @@
+1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,601,578,981,315,530,525,671,1501,616,214,724,1247,543,58,183,282,242,54,90,130,1788,360,1719,710,1165,1476,29,744,164,293,1360,274,47,119,16,387,134,547,72,48,77,416,863,39,65,144,500,678,430,160,1689,550,753,1478,480,56,583,85,206,93,335,990,174,276,1119,52,308,470,563,387,897,21,85,720,983,178,383,134,299,722,57,391,489,768,232,646,1312,1316,31,57,927,176,531,421,1162,369,934,7,172,237,340,169,261,1371,1351,1268,72,58,375,1570,1238,55,513,403,1462,141,263,419,1316,852,251,39,358,209,204,439,150,1667,344,205,1299,1226,992,967,536,1160,1503,1154,1323,486,1079,329,823,506,1252,387,28,69,649,296,233,62,219,344,464,1284,291,234,47,949,1126,935,1367,1450,1431,379,344,478,731,648,77,184,927,211,262,728,1093,381,140,239,332,1436,78,665,1486,601,1444,364,1057,753,488,127,1001,350,1016,357,638,309,40,333,136,655,779,821,414,275,140,149,185,445,1169,476,196,907,1570,193,161,43,204,1489,1125,1024,101,17,592,1378,338,1625,3,269,1568,254,803,25,776,109,52,291,1595,255,739,34,768,378,632,4,181,373,162,562,74,85,160,16,47,38,266,1610,9,7,1398,358,287,450,188,1390,37,98,80,685,1645,50,55,16,542,20,443,848,49,808,76,233,69,110,471,73,408,638,89,861,280,1062,75,314,808,237,96,401,57,48,1306,115,1164,1533,5,1032,1314,66,630,96,496,116,1558,438,13,182,1360,802,101,327,370,444,335,812,430,900,1259,1117,318,118,433,501,401,101,582,27,454,981,776,14,26,163,384,1652,87,788,474,588,155,845,207,33,200,622,840,1360,432,11,525,86,296,481,200,529,95,924,431,40,846,220,285,14,66,755,111,647,643,1201,81,483,555,125,426,1499,29,115,48,39,92,316,434,217,218,116,9,33,496,358,1106,736,1181,1153,117,20,1719,1113,1620,26,581,407,114,1559,6,1918,964,909,340,630,817,473,111,1485,434,262,1702,651,11,182,1043,1904,633,336,252,677,1238,637,1008,82,327,171,185,19,141,395,1209,53,798,836,1378,598,262,298,265,287,85,21,249,848,162,89,1050,108,34,41,25,291,918,28,1234,139,351,867,146,79,995,1173,635,24,31,81,214,1114,155,1256,159,206,586,426,452,650,1653,47,42,264,240,500,864,893,1308,1249,853,286,62,592,102,77,1082,91,120,625,211,978,319,655,200,152,86,396,52,308,1479,38,41,53,179,648,216,41,641,659,1556,226,1421,291,33,1461,1095,529,309,1100,314,1695,505,1200,150,946,53,124,139,1506,52,33,463,613,33,1264,386,678,563,564,318,273,912,60,31,150,1321,133,1333,302,1243,49,421,808,1399,555,195,611,268,39,1302,1154,92,664,117,92,124,332,561,1436,865,198,71,271,909,40,1185,664,251,422,306,122,814,158,1676,122,217,312,952,845,104,572,1796,392,651,176,714,44,757,111,56,489,333,738,369,304,1239,105,297,277,674,213,938,2,681,336,171,1252,166,88,489,273,260,565,231,319,1085,650,211,510,12,511,325,46,107,980,1136,16,95,308,935,514,469,20,44,209,345,467,1310,500,75,594,166,199,741,193,28,52,106,1437,366,575,1200,609,678,534,573,723,325,8,386,268,690,321,186,375,2,104,657,1341,601,175,0,745,146,508,180,426,811,7,215,300,86,25,372,233,900,276,1625,808,1941,510,234,813,131,334,58,783,992,236,244,174,609,1581,1767,204,187,208,1340,347,803,146,299,140,142,339,60,118,300,809,276,413,267,946,77,154,466,425,193,187,852,674,2,17,1006,1007,166,195,137,97,41,407,65,1072,20,789,311,1227,20,132,1536,995,194,506,635,115,1500,529,93,72,950,208,944,1177,476,207,1228,5,974,226,225,290,690,581,218,401,49,361,1408,242,254,24,313,441,635,126,513,994,299,1722,52,1123,44,1332,628,534,789,298,692,45,596,1583,77,15,38,1293,1181,1498,772,148,297,49,692,87,594,49,148,170,54,1079,7,468,847,336,421,34,1108,406,892,689,245,298,85,1187,1142,286,310,207,34,660,549,39,1172,97,1,750,47,0,77,1632,135,54,18,22,1292,230,1031,11,225,820,461,1208,108,1443,274,1134,41,287,166,274,1032,585,1491,75,549,1231,1314,443,212,395,386,698,58,644,395,81,905,366,233,716,656,799,643,1011,173,790,360,269,930,13,606,488,387,1206,51
diff --git a/2021/07/testinput b/2021/07/testinput
new file mode 100644
index 0000000..18bd32a
--- /dev/null
+++ b/2021/07/testinput
@@ -0,0 +1 @@
+16,1,2,0,4,2,7,1,2,14
diff --git a/2021/08/input b/2021/08/input
new file mode 100644
index 0000000..ce56799
--- /dev/null
+++ b/2021/08/input
@@ -0,0 +1,200 @@
+fgcae ebafc cabdef eg abecfg abgfed feg gafdc bceg ebgcadf | defagbc faecg cfdag gecb
+eagd cad fgadbc aefdcg dcebfg fcegd cbeaf ad dbgfeca defca | cfdeg gdcabf fcgde afgced
+gfdeca aeb eb fbdag eafdc adfbe cefdab bdaegcf efbc ecadgb | eb dbafe eab faecd
+facbdge efdg gcafd daegc caegb aecfdb ade ed gafbdc dgfeac | de abcdef faedcg dfgca
+dcaegbf bc dcgeab cbgad cebg cdfaeb fbadg acdge cefdga cdb | gdcfae gbec gdace cgadfe
+ceagfbd fbaeg fadge fbegad abgecf dafcg ed edab ged dfcbeg | gebfa de gbafec ed
+acedbf adfbg cgafedb geac cgb befcgd bcgaf bfgace cg bfeac | bcdfeg fecba cafgeb bgdfa
+egadc cea ac agbcedf cgab bgcade fbcaed eadfbg fegdc ebdag | fdecabg fcged cdbage efgdab
+cbfge gdc cdea efdag dc cdfeg gfbcad gcdeaf cdeagbf egfadb | dfcge egcfd fcdbag dc
+gaedb fbced gcdbef cge gc decgb dcbgfea cgfb cgdfea fbcade | fdegbac fecbd ecg degba
+geaf bcfedg agbcd bfeagd dgfbe cbdaef beacdfg abe agebd ea | fbecdg geaf gebfad adgbc
+bed afgebd adecf bafgedc dbca cfegb becdf fabdce bd gcfdea | gfdaeb ebfgad dbefc cbda
+gacfebd ag bedfca agbfde egfcab dfga degab fbade bag bdecg | dgaf abcfed agb bfecag
+afebg afdeg gcbe acebdf cfbage cafeb gab decgabf bg gcfdba | gb caebf abgef acfebd
+efdab fabdgce gcbfa eg gacbfe beg ecag beafg dfabcg bgecfd | bge fgdcbe gcfdba ebdaf
+aecbd bdagef gd bfega aefgcbd gfde gfdcab dbg edgba febagc | dg dagfbc dgfe eabdgf
+gdfba egfacbd gdcefa baf gcba fdagcb dgfac ab dcfeba ebgdf | dcfag bfa gafcd cbag
+afbe bdagc cedfb defcab ebfdgac gfedbc cbfad af adgcfe adf | dafbc dfbac fdcegb gadcb
+fcgedb ca fdcage cagdbef ceab acedfb fdbce cafdb cda afgbd | ac dcafb efgdac ebcfda
+fbad gbcda dcefgb cfeadg dgbcaf bcafdeg ad gcabe adc dfbcg | gbcdef bcfdg cgbfd bfadgc
+afcgeb bedag bdecafg agb bedfga fdagce bg bgfd dfgea cdabe | badge cagdfe efdag afegbd
+gfed dcaef ge bafdce daceg acebfg cefadg egc ecdabfg gacdb | bcgad bcegaf agecd degcafb
+deacb adcge ab acb fbdce faedbgc fgadec gabd deabgc ecbfag | dfbec ab cbagfe bcfgae
+gcabfde ecf cbdeg bacgf fedg ecfgb gfedcb fcaedb cebdag fe | dbcegf bcgdfe gfde defg
+daefb bfg gedafb fabge dbafec cfega bdga cgbdfe gb gbacedf | aecfg bcedaf begdcf dgba
+bagce bf bdacfeg efbg fcb cefab gbfadc cafebg ecdfa bacdge | fegb cegba bagce efbg
+becag cfeg cefgbad fbace gfeacb acdegb bef ef adbcf fdabge | ef bdfac cbegad gbeac
+egb afcbe fbaeg eabgfdc gcab gb gfdea fgbecd bcdafe gafbec | fcdgeb edcgbfa gbe fgeba
+dga caebd ecdag cegfd abdfce dafbge ecbgda bcdgefa ga agbc | afdbec ecfdab gdaec gad
+fc gbdefc cfe ebdaf fcbeda gbafde edacg bfcdgae dacef cabf | decgfba cdbefg cf ecdabf
+febgd dafgbc caed cgd ceadgf fbecga dcgfe aegfc gbedfca cd | dgfeb fgced dcafebg agdfce
+ecdafgb bgade bgd fabd gbaef bd egadbf ceadg cfbgea dgbfec | edagc bdage bfda dbgae
+cgeba aefgcd dfceagb dc ced facbed cdfb dbaec adfeb fgedba | fbdea bgcae efbda fcdeag
+caegbf dcfga afcedgb afgdcb fcedag ab edbcg dbfa gdcab abg | bag cbdag agb ab
+gadfecb befc fgdbea cf fedagc fac bcgfa agbfe adgcb feagcb | gbcda cgbad bcgfa cf
+dae aefcb dgabec dacfg afebdc ebfd afecgb aedcf fbcagde ed | ecabfgd bedf bcadef egdacfb
+abcf fcega fdgce fegbda eafdcgb ac gabecd gbfae beagfc eca | edbgca edbfga cae gface
+bgedcf afcdbg ag gcbaef fcedgab afgdb cfgbd befda acdg agf | fdbga ceadbfg egfbac fag
+bad edafc bdeg abcgde ecafgbd gfadcb bgaec db edcba geafcb | cdafe fdcabg cdfageb dbge
+geb bgcf agfcde gb befag gfbcae defab gabdec eacfg gabecfd | afbedgc gceabf abgef egacf
+fdeac acg cfegda cbeadf fegdbca ag acefg adge bfdgca gbcfe | gecdaf efgca cgbafd cfgeb
+begdf bdfgc ebcf adfcg cdegbf dgeafb cbg cb bfeagdc gbdcea | acgedb fagdbe bgfde dfgac
+afcgdb aedc bedgf egafcd afdge gecaf fcgebda gda da ceabfg | gedbf gacfe adg agdef
+bdeafg acgebdf dgcfa fa cafe dgfbc gaf edagfc cgabde agedc | fadbge bdgfcea dgcefa cgeda
+gacfbde defag cbgef gbca efadcb afcbeg cgbdfe ba eba gefab | fegab abe ebfcgd fbgae
+gfbdec fbcade cabdegf ebdg bfd dcfgb cadgf gebcf db fcabge | eacdgfb bdge ebdg ecafdb
+egcfba fdcae fcdaeb gcfdae fabd ba cdeab fcdbaeg eba decbg | cabed facbed cbade dfcea
+agdfe acfdeg fcdbeg dgf gdaec df cadf ceagbfd abgfe gbdaec | bgcdef abfge gbefcd df
+dgebf afgdb bfa fcbade af dcafgb agcf gcbda dabgecf gadecb | dbcga abcdge fadgbce eagcbd
+dbcga bea egacdf dageb be efbd abgfce gadfe fcbegad aebfdg | eba be bdage bedga
+gcbd egbdafc fgc fbgedc gc aedbfg cefgb fedbg cfaegd efabc | bface egfbc bgdacfe gc
+fdgae dc ced gbcd gbcefd decfba becfg ecfabg cgfde gbcadfe | edbcfg cd cafgbe cdegbf
+geadcf efg gadef fg fecad acbgfe dagecbf dcgf gadbe afbdce | edafcg bgcfade gfdc abedg
+edcba ecgdb aedbcf aebf dabfc fdacge badgfc ae ead gfcbade | gcebdaf degbc ebfadc efdcba
+caedbg dbgec dcbf ecgdbf cgdef dgf bgaedcf egacf afebgd fd | cdfbeg ecfbgda gcbfed cbgedf
+bdag acdeb ecgdb egbcfa fcdbega gb dbecag cbdafe ebg gdcef | bedgc abdfcge efagcb cdgef
+bfade bfdga dfbgec cagbfd dfgacbe gba gacf ag gdcbf abgedc | cfag abdcge ebafd abefd
+agcdef bcfda bdgca aebdfcg eagdc gb dbg gbea cedagb bfgdec | dfabgec eafdgc acdge gdecab
+ebacdfg cgbfad egdbc bdgfa daef bae gabed febadg ae gacbef | fagdb daebgf fgdab bea
+dcgbf cbedf degc bgc fcgdbea fbadg cfdgbe gc efacgb fdbace | edfcb cfeabg cg edbacf
+bcdagfe dfacb cbfdge bgcdf fdgeac acd agbd acbef da dcgfba | cbgdf dgab ad gbdcaf
+edgfbca gbe be ceba bdaecg gefcd dbagc egbadf dcegb dfgabc | gcfde gfceabd gfbcad eagfdb
+dfcbg fcdga efgb gecbfd gecbda dfbgaec bedfc dgb bfadce bg | dbcgf bfge dacgf dfgcbe
+cga ebdgaf bfdag cbgfe bfadgc gbfeadc ac cagfb cdba cgadef | bfdag agedcf aegcbfd gcfab
+gcead gfdbec cbdge gabfce eb dfgcba ecfdgab befd dgcbf ebg | cdgae fbdegc bcdge gcdfb
+da ebgfda fcdeagb acgbfe gedba dbegc agdecf dae bafeg bfda | gdafec fegba edfbga aed
+fbagec gdfba bcg gebcfd cbafg bcdfgea ebac cefag faedcg bc | gfbac baegcfd fabegc dgeacbf
+dfbeag fabdg fdbe abdeg eb dcega gcefba cfdbag dgcfbae geb | cgbafd bdef dcage eb
+abdcfe gba dagf cagbefd fdbea bfega ag dafbge dcbeag gfceb | afbcde ecgfb dfbega bdgeca
+dg dge gdbc cfdae bcgae cbdage abgfde cfedagb cdgae eacgbf | eabgc bgeac bcdg cagbe
+bfd dgaeb gcabde fd bfgce dgfa dbefg gadbfce dbafge fabcde | edfcba efbcg df bdf
+gcbfd agbecd fedc edcbfg fdb eadfbg bcfag fd gedcb gbacdef | fgbac bdagfec gfbdaec aegbdc
+cgbdfe ce acedg adcfeg bcfegad fcea ceg abdeg afbdcg fcgda | ecg aefdcg dacge ec
+egbdfca efacb agcdbe cbaed bdafgc dfaecg debg bd bda agced | geadbc efbca gabfdc bd
+edcfb bfgecd ecabfd eca abcd fgeab fedcag abfedgc ac bfeca | bgfae eca cdgfeb bfaec
+cadef cebdga ebd bacdfe dagfec dbfa fcebg ecbgfad db fdecb | befcd acgdeb abdf dbfa
+gbfecda bfd cdagb fbdacg fgdbec gbaf cbadf aefdc eadcgb bf | adcgb dfbca agbf dafcb
+abedg acbgf fd gaefcb cagbdef cdaf dcbfeg bdagf dgcbfa bfd | gbadcef df fadgb gabcdf
+fbgadc dbcfg dcega cgdfe cfedbg caefgb ef gef gfaebcd fedb | fcedg febd gbcdfa cdgfab
+bg adgb fcaedbg cgfda fcbae bcg dfacge fgcdba decgfb bcagf | cgafb dbfcage bdgcfe dbga
+ed afbdg acefb aecbfg cfdabeg gedfcb fcdabe ecda def ebdfa | gbafd gedfcb dfegcb dfgba
+gcdfae efgdb abdfcg fde gdabf dbcegfa fedgab efab ef ebdcg | eafb gbfda gacedf cbdge
+edagfc gfaecbd bgced cbegfd cb gefdc badgfc bdc efbc adegb | dgbec cegafd dcbgef dgecb
+gedcab beg eg cafgb fbegc gdfe bdgfec gabcedf bdafce bcdfe | gcefb afcbed ge gdfe
+fdbagc cdgefab edacf ceba ea cfbaed ecfdg abfegd adfbc eda | ea beadfc abcgdef ecdgf
+fbc gfbacd fecda cbdfa dbgf dceabg gbcdfea efbgac cdabg bf | gbdf agbced gaedbc gfdb
+aegcb bfgecd fbegad fcagdbe dfgce fcbd gdeacf fb bgf bgfce | bgafedc gcdaef dgfcbe eadgcf
+def dbce agdfeb ed fdgbcea dgcfb aegfc dfgbac gecfd cdfgbe | cdfegb ed cdgfaeb ebdc
+ecbfad afdb eagbfc caebgdf edfcb dgfec cgdbae bd bcafe bdc | bfacegd fbdcae dbc bgfdcea
+dfgba eg cfbead gde bfedgc dceab cabfdge gdbae aecg aedgcb | egd adebg gde debcfa
+cadfb egfb afgbc adbegc ecgadf ecagb fga ecfgab bgacfde fg | afcbg cgfba gf dacbge
+cegbf dec efcdg facdge dfae dcbafge ed adgfc fdbagc cgaebd | dce gbcfe afcdgbe dcgabf
+cfabe fa eabgfc cgaf fba gfbce dcfbge edbgcfa efbadg acebd | cfebga bfa fedcagb abfce
+acdfb dbagf afcebgd beag afgedb gfdea gbd fgdcbe gb cdeagf | dafge gafed gfacde gb
+gdfeac dfgce ebfadcg edagc dacf baegdc fd gdf egcfb dabgef | degfbac cfdeg daebgf cdeagb
+fcgabe ebcd ecfdg dabcgf gfecabd cfd ebcfg dc bcfegd adefg | agedf cd bcefg dc
+cbaeg bcfea fb feb gfaceb gdfbec dagbec gfab deacf bgcaedf | acbfge bf afgb efb
+egdba cadgfbe efadbg cg begc bfgdca caegd abcegd dcg acdfe | fbegcad bceg gcd cdgebaf
+agbcd dafcgb cfdg ceadb fdgeba eafbcg gfdab gbc bgdcafe cg | gfadcbe fbagd decba gc
+gfbec adgc dge egdcfa abgfde abgdfce dg eacfdb fdaec gdfce | fecgd gd fgcbe acdef
+fdbceg bfedc af fegcad cbdag daf efab dabcef fbeadgc cbfad | fcabd cbfad gcfdbe gadbc
+ebgac fabdeg bedca cg aegdcfb geacbf ceg efgba facg fbedcg | gecdfb aebfg fagc ceg
+eagb dcgeb ba abd cbeagd cdgafb fecbdga fgedcb dacfe dacbe | bdfeacg cadgbf bgedfc fcdae
+dbac cfgae cbfgde ba bga gcfbad dcfebga gcdbf feagbd cgbaf | cgafb fagbdc dcfbg afgebd
+adbgfe fgb egdafc cbafd dfegbc edgafbc egfcd cegb gfcdb gb | bg fdacge efcadg egdfba
+agfbe cgaefdb gbdf edagb afg cdgafe gfedab fg egcdba fabec | fcbdega fag agf agf
+cae edabfc cdfega ca cfba gadeb fdecb ecagfbd cbgdef acdeb | facdeb fgecad bfadce efcgbad
+facb dbfec dceabf efgcd cb aecfbgd dgfbae eafdb ebdagc bcd | bfedc cdegab cbdfe adefb
+fecbga badgc dga bfgadec dg geacb cgedba dfebag gcde fcabd | decg gda baceg gd
+gecbd gcbdfea cbfg bg bge egbcdf dcbef beafdc cdeag bfgeda | agcde dceag gfabde beg
+gefba gacfbe facdeg cg cgab gfc efbdcag cfgeb cefbd afegbd | gfc afbge dafegb aebcgf
+egd aebfgd gefc ge gedbfca bdcfe dfcegb gecdb edbacf cdbag | dacbg edcfbg bcdfe ge
+df ebdga gcdefa cfbd bgdfa afgcb dfeagbc bfacgd fgd facebg | gaebd gecbaf fdcb dfbag
+fag cegfdab cadebg dabcgf abefg eafc ecafgb ebacg fbdge fa | ebfag dbcgfae gbecad fdbgac
+gecbd gefa gfc fabdcg bfaecd ecgafbd fg befgc efabc gecbfa | gfae gcf egbdafc edgbc
+bfgae fcebag fdbe fd fedag adgfbc fdbgea ecagd agcbfed fad | fgabe dfeb ebfd gefba
+ecdgfb afge bdage ebcda eg abdgef fgadb gabcfd dge bcdagef | gdebfa eg agfbdec afeg
+dbc acefd cegadbf fbcde afcb fdcaeg bc acdbge febdac debfg | ceafd caefd gfbaced dcb
+fecgb fgacd gdcefba de gbafce febd gecfd edc fecdbg ecbgda | becdfg ed becgad gcdeba
+agfdbe fbac bcd edacfb bgecfd cb cdeba cfgdeab acged edfab | cb dbc adbce bdfae
+dgacef bdfa ecgbf ab fegba dgafe efdbgca abg acebdg afbdge | gefda ecgafd ecfbg begcad
+gbfcea bgfa afdebc aegdcb af bgcdfea bgeac gecdf afc fgace | bfgecad fca afc abfg
+cfe dgcfe fdagcb gebdc egfa gbcdefa dcebfa fe agdfc fgaedc | dfgac fe fce fcdbega
+fecgab gcbdef cbaefgd dfgbe dgcfe eb bfe dbfga edbc acfegd | fbdeg fdgeca agefbc egcfd
+aecd bac dfacbe cafdb ac gefcab gfcdbe fcbde gbdaf cbdegaf | gcdbefa fbgcae ecad fagecb
+eagbf cagedf geafdbc fdgbce adefb aecfd adcb deb faecbd bd | ebd deabf fadcge cdagfe
+gadefcb bfcga eadcgb egdbfc deag ecg edabc acedbf eg abgce | gdea bagce gce gce
+agcfe bec gecab gbeda facb dbfgec fcegab gfacde gfdaceb cb | cb cefdgb cadefgb bc
+fdgb df egabcf fegda cedga fegab efdbac def cgdefba gafedb | facdbe bafceg agedf fdebga
+fdaecg dbcafg abfgec dc caefg cedg aecfd abdgfce eadbf fcd | cgefab gbfacd fbegac fabecg
+dfecabg bcfeag gdafce dagbfc cdefb dca gafbc dbag da bcadf | dca bagfce cbfda cdagbf
+dabfgec febadg gbcdae gfbe adebf ef cabdf edfgca ebgda eaf | gfacbed abgced egdfca egfb
+cfdea dc fdagebc fegcbd agdc gcfade fcabe cfd efdgba gfead | bdfcge agdc dgefa cfd
+gbfca febadcg bc bdegcf beca begaf gabedf cgfbae cgfad cbg | bcg dcaefgb dfgceb afebdg
+cg cgbf bedcg fcagde adefbcg efdgcb ebacd cgd edbfg egdafb | cfgedb bgcf acegdf cfgb
+bfad adcgbe faceg fagbdc df afdgc efcbdag dfbegc gfd badcg | gfd abgcd fgd abfd
+bcadgf cgdfb adgcb gf gafc dcfeabg bdagce dgf dfbega cebdf | adcbfg gfca fdcbe gfac
+daebf fcabgde bgdcef gab ga edbcga afcg ebfga aefbgc egbcf | ebcfg ebcgfa fcgebd agcf
+gedab fg afgecb cfgd feg cfabed befdc fgdcbe gdceafb befgd | ecafbg ecfbd febdc gf
+gcbadf ce gfcdb fec feabd gbecdf dbcfage febdc agcdfe egbc | bafed gcbe gefcbd egcb
+cbdfg gbcafd feb gaecf gcbfe gfbdae be fcgabde bdgcef becd | abgedf gdfebc aedgfb fbe
+edacgbf fbdae edgac bg gab bagdec dagfce fadbgc cebg bgdea | aedgb bg cebg adcge
+bda gbfea gedcab gfbceda bgdfa bfcdg febcdg bagcfd cfad da | dbecag bgfdc gdbfa facd
+ceabd dabfe acgde bc fbca cgbfde febgda dfecagb ebafdc bdc | cbdae dbfea fgdceb gbfedc
+acg fadbgce cfgdeb dbgce efdca ag dbga cagbef egacd cdgbea | gdecabf gcbfea ecbdg gac
+dfgacb ged egfdab efcgbda gcefbd debga ebadc ge aegf gfdab | cdfgab cdafgb bfcgda ge
+gdbeca bcfde eafg cefbgad dgafcb ge degfb adefbg dgfba bge | bdfeg begdf ebfadg eabdfgc
+cfbdgae gbaec bagfcd gfcba dcaeg bacfeg dbeacf bec efgb eb | ceb egcab cagfb dgcae
+fdcagb gdaecb fcadg bcdgaef gd dfcea gbcaf aecgfb cgd dgbf | gfadc gfdb badgfc gbfca
+bcafed defgcab fgcb cfbae cagde agebfc gbcae gbe gadefb gb | bg gfcaeb bg aedgc
+bcfadeg gbfd eacfbd gdafe afebg bafegd geafcd gebca fb bfa | agdefc eafbdg fgead gedaf
+fcgeabd dgeaf ebgfad gceafb geadc ac aec ebcdg cafd adgefc | gbfadec egcbd acfd dgabef
+eac fbdgec ea eadb cbaeg agfdecb eafdgc dcgbe bcfga adcbeg | aec abde eac ea
+cedb gcadbe ed edgfbac fbega abdge gacdb fdacgb dcefag aed | cdagb gbcafd gdefac gedafc
+cae agfbec ae begcd feab fadgbc ecfadg ecabg cdgbefa cabfg | ecgba afcgb efba dgeafc
+fecgabd badf efadg abedfg fea fdgceb fedgb aebfgc af gdcae | ebfgca fae fea af
+bgedac gbfae dcbefg acbf fb gaedf cagedbf aebgc gebfca fgb | aedgf fdgea bgfae bfdgeac
+bagcfe eadcb gb facegdb bgc fdcag efbcad beadgc bgadc ebgd | gbc fbcage becad gbfcae
+cagde gbca dcgbea gc efcad dbgfea dfgecb caedbfg adgbe cdg | gc egdfbc bcga cg
+efgcbd aebgcd dfe eadfb abged abdcefg bacfd ef bdfaeg faeg | fgae cgdaeb adefb afcbd
+cgbfea gcbda gefdcb eadf febag bdf fd febgad fadbegc bgadf | gebcfd fgdbea dfb dbf
+dg cdgfe gecfad dfbce bgefda fgd eafcg efcbag dgac bcdagfe | afdebg gfd aecgf gfcea
+edfga cgefda gcdbe fbae ab egdabf cfgbda deabg bad adefcgb | ebadg agdeb fbae gbdae
+gbdcfa gbade ebgac ecbfa adfgbec badecf bgc gcef fbgace gc | gc fcge gacefdb ebgca
+acefgd ebgaf egfda egcd bgfaecd dgcfa ed abcefd efd abdgcf | def ebgaf fed befcda
+fecag cag cfagbd agfcbde fabec eabg fdcge cgbfea fadebc ag | cfgbda dfgbeca efdcg dfgcaeb
+bgecfda ecdag dgfcbe bdgac adbgf afgdbe bfac gdcabf cbd bc | bc acbgefd fagcdb fcba
+ba efacg cfbgde cfdbg bacgf bgfdea abf bcad cfbeadg bgcfad | bcdgef fdgaeb ab cagfe
+cbdaf bafdgc eacbd fd dcf fcabg bcdfeg bedgcfa dgfa agbecf | dfga bgfac df agdf
+edcabf cadbf bgfdcea bgcfad bgcde dfg fg bdfgc cgadfe abfg | adfecg gfbcd acgdfeb cbgdaf
+badgfc dg bagcde bceda dbcfea beafg debag adg fcbadeg edgc | gebda dcagbf dceba egfab
+edcf dacfbg dbcefag fbd df bdegfc ebdagc bgfea begcd bfedg | dgebc cbgde dgfbac bdf
+bdcfg acegfb acebfd fdcag egadcf da daf cgeaf edag bafcegd | gdcaf fgaec bafdec fdaecb
+cagefd fde gdfba fcgaedb abefd ef dafbeg ebfg afcbgd ebdca | egdbfa bceda dfabg bdace
+fcgb gcdae bg gfadeb cbfegd fcabed bdg gcdbe fdcbe adbefcg | dgb gfbdec befdc gfbc
+fabde bgfde bgecda cedgb gf cabfdeg ebfdgc fgbeac fcdg gfb | fgbde efdgb edgbc afedb
+ebacf cedfab fde eabfd fd baecgf bagde agdebfc dfcb egfadc | ebfdgac acdegf abdefc ebfad
+gdcb cd cfgae cgbedf fbegd efgdc fadcbe gfeacdb dce dfagbe | gbcd cde gacfe gefdbc
+geb afedgb bfegca bgade eg dgef gadbc eafdb afebdcg fcbead | cagbd defcba dbafec geafcb
+fgbdc gbfade gba gefa dbafg cbadge bfgecda ga edbafc dfabe | afbdeg dgfba bgdfa dcfgb
+agef badce ef febad cabfdg gdfab cbgeafd egfbdc defgba fbe | abefd geaf gafdbe ebcad
+gd gad bfdg gecba fedabcg fcgeda aedfbc adebf agbdfe dgeab | ebcdaf agd gcfbdae egacb
+cedbfa ba cgbfa abf dfegac cafeg gabe befgca ebdfcag cbfdg | fab aegcf faecbd fdcebga
+daefg febdga aegfdbc efgdca eafb bge eb agbdec febgd gbdfc | gbcfd edbfg egb bacegd
+fbdecg bdafec cfaeb gedac def dceaf abfd fd gfecba gfdaecb | ebfac bdfa gbcdef fd
+fcbga cbdfeag bafgce fdacg dc fcd fcgbad fadge efcdgb cdab | gaefcb bafegcd acdb abcgf
+ecgabd acgdf abge ae bcfead fgdaceb ead daegc bcdefg gcbed | egba gaecd cgadbe gdbce
+aegfbc gf afebdc agebdfc ebcdf feg dcefg bdfg dcgea bgedcf | edbfcg fdgb bdgafce febgcd
+dcg bcdefa dbfceg fdeacg acbeg bfeagcd cfdae dg dfag agdec | dfcgea dg egdca edagc
+agcfeb fagbed fdbceg bag gebfd afgd agbfcde acbed ag badeg | cbdea fcedgb gfebac abcegf
+adbegfc fgdace cadge afcg ebdfca ebgad eac bfgdce cgefd ca | acged fcedg ebagd dgacefb
+gfeadb gfeab bcfa agebcfd aebgfc fecgbd efc fc gadec egcfa | fgbace fc debgcf afgceb
+bacg ab cfgbd bfadge acfed fgdecb agedcbf fcabgd bfa dbafc | gfdcb cbga abcg afecbdg
+ge beagc cfgabd bgaced bgcda fbadgec age ecdagf egbd fcbae | aeg gedbac cadfeg fbgcda
+dgbafe abfdgec gdf fd agebcf gadec dfcgba befd edfga aebfg | abcgefd dagec dfg df
+edfcga bcegd baeg cbgdae agdbc gce acgdebf eg gfadbc cefbd | dcbeg bgedc cedbg edcbg
+adfbe dg cagef dfgb gdbeca aefdg gda edcbaf fdgeba gdecbfa | cdabef eafbd bafcegd dg
+cd edcbfg dbage fcaebdg facd bgcfea afbedc afbec dbc adecb | adegb bcefag abegd cbgedf
+gdcbf da ecgbfda adc adgb bagcfd dfbcea egfac dfbceg gdacf | gdba cfdbg adbfec fcaeg
+bcg bc gdcbae dbca abfgde gdeba ebfacdg egcba faceg dgfbce | geadb badecg ecbfgd baecg
diff --git a/2021/08/one.tl b/2021/08/one.tl
new file mode 100644
index 0000000..13ed27d
--- /dev/null
+++ b/2021/08/one.tl
@@ -0,0 +1,7 @@
+(defun solve (: (name "input"))
+ (flow
+ (file-get-lines name)
+ (mapcar (do match `@a | @b` @1 b))
+ (mapcar (opip (spl " ") (mapcar len)))
+ (flatten)
+ (count-if (op meql @1 2 4 3 7))))
diff --git a/2021/08/two.tl b/2021/08/two.tl
new file mode 100644
index 0000000..f436779
--- /dev/null
+++ b/2021/08/two.tl
@@ -0,0 +1,42 @@
+(defstruct entry ()
+ digs
+ value)
+
+(defun read-input (: (name "input"))
+ (flet ((str-to-syms (str)
+ (flow str
+ (spl " ")
+ (mapcar (opip (tuples 1)
+ (mapcar intern-fb))))))
+ (flow
+ (file-get-lines name)
+ (mapcar (do match `@a | @b` @1
+ (new entry
+ digs (str-to-syms a)
+ value (str-to-syms b)))))))
+
+(defun match-dig (syms)
+ (match-case syms
+ ((a b c e f g) 0)
+ ((c f) 1)
+ ((a c d e g) 2)
+ ((a c d f g) 3)
+ ((b c d f) 4)
+ ((a b d f g) 5)
+ ((a b d e f g) 6)
+ ((a c f) 7)
+ ((a b c d e f g) 8)
+ ((a b c d f g) 9)))
+
+(defmeth entry solve (e)
+ (each ((p (perm '(a b c d e f g))))
+ (let* ((map (relate '(a b c d e f g) p))
+ (interp (mapcar (opip (mapcar map) sort) e.digs))
+ (digs (remq nil [mapcar match-dig interp])))
+ (if (eql 10 (len digs))
+ (return (flow e.value
+ (mapcar (opip (mapcar map) sort match-dig))
+ (poly 10)))))))
+
+(defun solve (input)
+ (sum input .(solve)))
diff --git a/2021/09/code.tl b/2021/09/code.tl
new file mode 100644
index 0000000..a0e223e
--- /dev/null
+++ b/2021/09/code.tl
@@ -0,0 +1,59 @@
+(defstruct board ()
+ w h a
+
+ (:method lambda (me x y)
+ (if (or (minusp x)
+ (minusp y)
+ (<= me.w x)
+ (<= me.h y))
+ #\9
+ [[me.a y] x]))
+
+ (:method lambda-set (me x y nv)
+ (set [[me.a y] x] nv)))
+
+(defun read-input (: (name "input"))
+ (flow (file-get-lines name)
+ vec-list
+ (new board
+ h (len @1)
+ w (len (first @1))
+ a @1)))
+
+;;-----------------------------------------------------------------------------
+
+(defun solve-one (bo)
+ (sum-each-prod ((y 0..bo.h)
+ (x 0..bo.w))
+ (let ((c [bo x y])
+ (u [bo x (pred y)])
+ (d [bo x (succ y)])
+ (l [bo (pred x) y])
+ (r [bo (succ x) y]))
+ (if (and (< c u) (< c d) (< c l) (< c r))
+ (+ 1 (chr-digit c))
+ 0))))
+
+;;-----------------------------------------------------------------------------
+
+(defmeth board basin-size (bo x y)
+ (caseq [bo x y]
+ ((#\9 #\space) 0)
+ (t (set [bo x y] #\space)
+ (+ 1
+ bo.(basin-size x (pred y))
+ bo.(basin-size x (succ y))
+ bo.(basin-size (pred x) y)
+ bo.(basin-size (succ x) y)))))
+
+(defun solve-two (bo)
+ (flow
+ (build
+ (each-prod ((y 0..bo.h)
+ (x 0..bo.w))
+ (let* ((bs bo.(basin-size x y)))
+ (if (plusp bs)
+ (add bs)))))
+ sort
+ (nthlast 3)
+ prod))
diff --git a/2021/09/input b/2021/09/input
new file mode 100644
index 0000000..d304456
--- /dev/null
+++ b/2021/09/input
@@ -0,0 +1,100 @@
+6543656799989432399987654342234567896545789323988432145689954545656789543434567987757565678995432345
+7432345678978921987896543210145679987326891019876321034567893234345878952129679876543454599989501234
+6543456789567899876789654321234798765434989198765432123458932101234567891098998987432323989878912449
+7854587893458998765678965536545679878545678949898743234567893234569678932987997654321019878767893598
+8967678932347893234589876545656989987656799656987654345698954345998999549876789765432198765456789987
+9878989543456789355999989678789897698967999769898767456789765659896789698765698976745297672347895656
+9989697659567998767899896989898789549879878998769876567899876798785678987664567897856398561238954345
+9894598798979899878998765499989678934998767897654987878999987899654569876573456989878987432367890166
+8743459987898789989999876349878567923987656798543498989989698998743498765432345678989876543456921278
+7652369896987678999898765498765456899832545987659569999976549987656987674321256989094998654567896389
+8993498765879567898789978987654345789721234598798978998765434798767896543210127892123989767879965456
+9889987654568456789678999896543236679654345679987899987654323679878987654321234989239879878989999967
+8778998543212347994599898765432124568965458789876796598795434567989398765432345678998767989998988898
+7659989654301498923989779896545235678976567898765689999886745699999499976843476799989854599987676789
+6745878967499989219876567987656776789987678987654577899987876789898989987654569899878943459876545679
+5434767898988978909765456798789887893498989876543656989998997898787679998765678999765452565989934989
+4321456989976567898954345999899998912349998765432345678999989989656567899876789988674341234598747899
+4210345678965454967895499888999999323456999998321234567898978978943456789987899876543210346987656789
+4321256789654323459999988767778987654567899987432346798987569765732369895498987999694321234598987890
+7652345678964012378998767654667898775678959876543456789876458954321298954329476988989432349679198991
+6543456799743233456789656543456789897899345989664567898985347895630987893214345977678943458989019789
+7654567897654356967898743212349891998921296799875678987897656789732396789101299867567894567894125678
+8765678989865767898987655623458910989890989892986789876798789899849985678912987756456789878943234567
+9876789878976788989198768784767899678789878901297898765689899932998764567923496544367999989654356789
+9987898767987899771019899895878998547679967892998954564567999891239965678994985431256789998765467897
+8598989658998987654123999976989987434567898999879543423456789789349876789989876542345678969879879986
+7439878946779998993234998989399896523456789898765432014567895678959989899879876543467789654989989345
+6598765234568969874349877691289765434567895679876743125778934589998993998765987654578996543499995459
+7989654145989459765698765430178998765678934567987654236799547678987892989654698765678965432989897598
+9978543036789398976798764321467999876789323456798885349899956789876799878543459876789999569878789987
+8765432123678967899899875432349899987893212347899976459999897899765678965432347989899878998765678996
+9878543954589656789949876545498789998954393958999876598798799997654569896547656799989767897654567895
+6999999895694345678932987676987678999995989899996987997678678998543456797656769898765656789423478954
+5439889789789234568991998989976567999989876789987999876543588999654567898767878987654545678912589895
+4329768678990123456789769899865456789878965678999864998654567898785678949878999876543434567893456789
+5498656567943234567895456798954347898767834567894212398765678959897899034999989997432123456789587894
+6987543456794589678999347987643234589656725989992101239876789543998979124989878989543014567897698943
+9876432369895678989998958998754395678943419898989232345987895432129568939878767678952165678999789432
+9987571456996989599997899129876786789532109787678949456798954321012367898965654589643236789999894321
+9898682367987897459876789098987897899676219654567898987899875432123456987654323456954347999989943210
+8789793478999976598765699987698998998754398743234767898987986593245787898645212367896788999878799321
+5679876567898987989854789996549679349765987432101256999656987989356898999432103798987899698765678932
+4345987878987899879765678989698543239879876545212345896543299878967939998543224678998996549876989548
+1239998989766798769876789878987832125989989854345456789951098767898920987654335699889975433987897656
+0198999997654987654987898969876543034799998765456587897892197656789439899876445789779894321098998769
+9987789898769898743298997654987969125678959876568698956789986543678998767986556899669789432999239898
+8766676789898765210129789743499898945789545987678979645678975212567897656597678998455678949890124987
+7655445678987654321335678954598787896995434598789765435889854501456898747498789987324567998789239876
+8943234567898765765456789767679656897894323359899987576798763212367895432329899876212678987678998765
+7632123456789896876569899898796545679932101248999998697899874363678976791012998765423799876567987654
+6543012378899987987678943939987656989653212357898989789901965654567897989134569876534899985459876543
+5432143567899899798989432123498777899654543467997679893212398765679999878965678988945678954349965632
+6743254578998767679996593234989898978965654578986567994343999878789998769896899599656789965498754321
+7654345679899656567897989345978939567896795989985456789959878999895987658789943498787899876569964320
+8765456789789543458999878959865323456789989899872347899898767891964596545678954679898954987699875431
+9876568895678932369898767898754212387899878789765478999765656792943997656789765678999123498789976842
+7987679954569893498787856789543201238998765678976569998654534989899898767899878989891012349997987653
+6598989963456789987696545678964912469899854587897678959432129876789769878999989998789124598756798969
+5439398894569899976543234569899893456798763456789989645944098965678954989998999899678935987645439878
+4321256797678998797432123498788789767987654567897896539895987654789943299987987656567896799732323989
+5410147889789789654321034987674678989998765879976989698789999769897893129996898543458999898721012996
+4321235678997698765453239876543799999989896789895467987678987989956789098989987632569998987632129864
+5452345678996559876574398983412989989876969898789329876569996492345689987678998543678987896543298765
+6543458789589434987865987632109878978965459987698910987678954321456789876567898654567896789654989876
+7655678993478949998978996543298767769896998654567891298799765210127896987878949987689965678969976987
+8768789012367898769989679984987658658789876743456932349898954323456965498989234598798954567898765498
+9989894323456987654399498765698743234678965432348946569977899436767899569993195679897893456789864329
+1099965454597898765458999876987652123489654321237898698765678945698948999854989799976789667898763212
+2149876585989909876567890989876541014569793210126789789854567896789236789769878989765678998987652103
+3234997679878919987888941296985432123678989321235678999843458999892125678998769878954586789698743214
+4349998798767898998999432345796554254689678932548789698756567898943234589989658769892345896549654325
+5498989997656567789998743659987674345679569893656896569869878997654445679876547658789456789439795456
+6987679886545456678999654798798765456893456789867975479878989549876596798765432745678998899598989578
+9832598767431345578999865987659876569932345678998964345989297632987678999874321234789769978997878989
+8763459854320123456789878997543989678921236789999651234599199754998789989985210165678954567976567992
+7654678975431234567898989986432395989433445699876540123498988969879899879876543278789323459876447893
+8765899987632345678987899876521234596554656789998431235987877898767998965987654349893212567987236789
+9896789798785456789876789987760235987675878992987542949876456789656987854398765998989543456798545699
+1997899659876569896545679999854345699876989991998659898765345678949876543239899887678954567987656789
+0129998943987689965634568999875456789989799989899798789894256789434987432123988776567895678998787891
+1998987892199897654323459999876567899995678976789987678989369892129876543459879655456789789899898990
+9897656789012976543212367987987678969876989765679876567678978991019989654598768542345899898785979789
+8765545678923987654393479876598989654987898754598765456567899689198698769987654431236789987654565678
+7654234789434798789989598765459896543298989885987654323456789567987549878996543210345678998743234569
+8985345678995679899978999654345789932129678976798778954767893459876434989898654321456789019859395698
+9876656889789989999867999963234567891012568987899989965678932598765323496789765632567892129998989987
+7998767995695399998758789892123678932343489998923499876889745699893212345779898743678989298987678976
+6779878954789299876545679791014567893654678999895901987899656987932101234567969898789678997876567895
+5665989543998989997732345692123456789765789998789892398998769876543242347698954989894569986765456964
+4734897699867879876521034789234877899878999989656789989769878987654343456789765678943598765654345893
+3123698987656767965432123678945989998989239876545679876758989998965654567899876789432459654321256789
+9234569976545659876543234567896799987690198765434398965347899899998765698945987898521345987210145698
+8945798765432345998754345678987899876541987654323287893256798789879877899436898986410129876541234567
+7899899984321656789765458789098936987632998795410126789143987654567989987547999874323498765432356678
+6798999873210127899876569999129325698549879987323245891012998543456799998958998765454599876543467789
+5487897654321678999987678998939214569698969876564346789199875432345678989869989877665678987654568993
+4376798965434567898798789987898923998797654989675678999987654321234789673979873989876989998777679212
+3235789876565678987659897896567939869986543298786789998999976532345895432399762094989997899888789349
+2123678987676789876543956989457898752597632129897899876543987543456954321987654123499876799999895458
+1014569998788899985432345678998976543498743234998932987612398754567896410198965234598765789212976567
diff --git a/2021/10/code.tl b/2021/10/code.tl
new file mode 100644
index 0000000..4e020cb
--- /dev/null
+++ b/2021/10/code.tl
@@ -0,0 +1,35 @@
+(defun corrupt (str)
+ (if-match (@pos . @len) (search-str-tree str '("(]" "(}" "(>"
+ "[)" "[}" "[>"
+ "{)" "{]" "{>"
+ "<)" "<]" "<}"))
+ pos))
+
+(defun reduxe (str)
+ (while-match (@pos . @len) (search-str-tree str '("()" "[]" "{}" "<>"))
+ (del [str pos..(ssucc pos)]))
+ str)
+
+(defun solve-part-one (: (name "input"))
+ (with-stream (s (open-file name))
+ (let ((score 0))
+ (whilet ((line (get-line s)))
+ (let ((rline (reduxe line)))
+ (iflet ((pos (corrupt rline)))
+ (inc score
+ (ecaseq [rline (succ pos)]
+ (#\) 3)
+ (#\] 57)
+ (#\} 1197)
+ (#\> 25137))))))
+ score)))
+
+(defun solve-part-two (: (name "input"))
+ (flow
+ (file-get-lines name)
+ (mapcar reduxe)
+ (remove-if [orf corrupt empty])
+ (mapcar (opip (mapcar (relate "([{<" #(1 2 3 4)))
+ (rpoly 5)))
+ (sort)
+ [callf ref use [chain len (lop trunc 2)]]))
diff --git a/2021/10/input b/2021/10/input
new file mode 100644
index 0000000..3095eaa
--- /dev/null
+++ b/2021/10/input
@@ -0,0 +1,102 @@
+((((<([<{(<(<[<><>>[{}()]>{{()[]}<[][]>}){{(()<>)(<>())}}>{<(([]())({}<>))[<{}()>{{}{}}]>}){{<
+<{<[([{<{{<{[({}())[<>()]]([{}()]{{}[]})}{([[]]<{}[]>){<<>[]><<>[]>}}>}}{[{[{[[]{}]<[][]>>{[<
+[([<[(({(<[<[(<><>)([]())][((){})<<>[]>]>{([<>()]<<>[]>)({{}<>})}][{(<()()>{<><>}){[<>[]][<
+[<[[[{{<{{((<[[][]][[]<>]><({}[])>){{[<>()]{{}{}}}<(()())[<>[]]}}){[(({}{}))](<(<>)>{(<>())(<>[])})}}<<[<<<><
+{{{[{[[{{{{{<<{}<>>{{}[]}>[{<>()}<<>{}>]}<{<<>{}>{[]<>}}({<>()}<(){}>)>}[[(([]<>)<{}()>)]{{[<>{}](<><>)}{([
+{{<[([<[({(<{([][])[{}{}]>([{}<>](<><>))><[[<>{}]]<{<><>}{{}()}>>)<[[([]{})]([<>[]]({}[]))]({(
+({(([[<<([(([([]())<{}<>>](<()[]>[[]{}])){{{()[]}<<><>>}})<{((<><>)[()[]]]}>])><{<(([{()[]}])[{[{}<>]({
+{[<{(([{[([(<[(){}]<()[]>>[<{}<>>[[]<>]>)]{{({[]}({}()))<<{}<>>{<>{}}>}[({<>[]}[[]<>])([{}[]](<>[]))]})
+[({<({([<{<<({()()}<[]{}>)<<<>()>[<>()])>[(<{}<>>[[]()])<(()()){[]<>}>]>}[([<<{}<>>({}{})>[<[]<>><<>()
+[([(<[([<[([[((){})<()[]>]([{}[]](<>()))]){<[<<>()>(<>{})][[<><>]]>({([][]){<>[]}}[{{}}<()()>])}
+{{[[(([{{((<{[{}[]][{}()]}{((){})<()()>}>(<[{}{}]{()<>}>(<{}()>(()()))))){[[[<{}[]><[]<>>][[{}[]]{
+[{(<{<[<(<{({[()[]]([]<>)}[[<>()]{(){}}])}({{<{}<>><{}()>}{([]())[()<>]}}[(((){})<<>[]>)])><([[<()
+[{<[<{<(({<<{{{}<>}}{[[]()]}>>}[((<[<>][[]<>]>))(({[()<>]<<>()>}<{[][]}<[][]>>))>))>}><[<<<([{{([][])({}<>)
+<{([({[<{{{<(<[]()>[()<>])({<><>}[{}])}}<[(<[]<>>((){})){({}[])(<><>)}]<[[<>[]]<{}()>]>>}{[<<([
+<[{[[[{<{[<({[[]{}]{<>]}[[[]{}]<[]<>>])>]}{{{({<<>{}>(<><>)}[<{}[]>]){([[][]](<>{}))}}{<[(()())(<>(
+(<{(<[({<(<((<(){}>[{}<>])<{(){}}({}[])>)<{<{}[]>{()[]}}([()<>]<<>[]>)>){<<<{}()><{}[]>>{{[][]}}
+[((((<[(([[<{{()[]}{<>()}}{<[]{}>{<>[]}}>[[{<>{}}([]{})]]][([<()<>><{}{}>]<<[]()>{{}()}>)]](<{[[
+<(({<{[(([<[{(<>)<<>{}>}[(<>{}){{}<>}]]>(((([][])(<>{}))))](([{{<>()}(()[])}{<<>>}][([{}{}]
+[{({[[[[<{(<[{()}<[]<>>]{([])}>[(<()<>>({}<>))[({})]]){<<[[]]{<>{}}>{({}{})[<>()]}><{{()<>}({}[])
+[[([[{(((<{(({(){}}[[]{}])[{{}()}[{}()]])[<<{}[]>((){})>]}>{<<[<(){}>](<[]<>>{{}<>})>>}))[{{(({[<><>][
+{({{[{{<<<<<((<>())<[]<>>)<<()<>>({}[])>>>(<{[[]{}]{<>[]}}(<()<>>{[]<>})>({{[][]}([]())}{({}{})[[]
+(((<(([<[[{<{[[]<>][[]<>]}>{<<<>[]>>([[]()][{}()])}}]<{<{(()<>)[<>()>}[[{}[]]]>[<[<>[]]([]
+{[<[<[[<[[<([{{}{}}<[]()>](<{}<>>(()())))<[([]<>){[]<>}]<[<>{}]<[]{}>>>>[([([])[[]{}]]{<{}<>><[]<
+<({<[<{<[<{[(<{}()>)[[[][]]<<>{}>]]{[[()()]<[]<>>][<[]()>{{}[]}]}}[({<{}<>>})<[{{}()}{()<>}]{<[]<>>(
+({<[<<{<[[<{(<{}()><(){}>)<<[][]>{{}{}}>}[<[{}<>][<>[]]>({()()}<[][]>)]>]}({(<(<<>[]>[<>()])><
+[({((({[<{<{{[<>{}]({}{})}}><<({()[]}{(){}})([[][]]<<>[]>)>{<{()}(<>)>}>}><{<(<<{}>(()[])>)
+<{<([<{{[(<({<{}[]><[][]>}<{(){}}<[]>>)<<({}{})>[{(){}}<[]()>]>>{<{{[]<>)[[]()]}{(<>[])[()<>]}>[
+[<<{(<[{[{<{<[(){}]><{<>}<[]()>>}{<[<>{}](<>>>}>[[<{()()}[()[]]>{[{}()]<{}[]>}]]}]}]>{{<[<[<<{()[]}[[]()]>
+<(<{<[[{<<((<(<>[])(<>{})><[[][]]({}[])>))>(<{<<<>[]>{{}[]}>[({}<>)[()<>]]}>)>}]]>}{{(<<<[
+<[((([<{({({[({}<>}({}{})]<(()())[<>()]>}{{<()[]>}{<<>()>(<>{})}})[<[({}())(<>[])]<{{}()}>>
+[{(<[<((<(({<([]())({}[])>([<>()]{[][]})}){<[([]())({}[])]<<<>()>>>})>{<{<([[]{}][[]()])<(()<>)(<>{})>>}{<{{
+<{[[{({[{[<{(([]<>)<(){}>)<<<><>>[[]<>]>}>{({{()[]}(()[])}<[[]()]>){[([]<>)<[]{}>]}}](<<{[(){}]{<>}}{([]<>)(
+<{(<<[<[[<[[[{()[]}[<>{}]](<<>{}><[][]>)]{(([]){[][]})<<()<>>>}]>[<[({(){}]){<{}{}>([][])}]>(({[<>[]
+<{[<<({[(<({([()][{}()])}([{{}{}}([]<>)]{{{}}<{}()>})){<{{{}}(()[])}([[]<>]{()[]})><<(<>[]
+{({[{[(<<[<{[<<>()>[[]<>>](<<>()>[<>()])}<<[()[]]<<>{}>>{{(){}}[[][]]}>>]>>[(({({([]{})<<>{}>}<{()[]}{[]{}}
+([(({[{<{{[<{<{}{}>(<>{})}>([<{}[]><<><>>]{(()<>){<><>}})]}[([<[()[]]{<><>}><{[]}{{}[])>]([({}<>)<()<>>]))
+{<<<[([(<<<{<{{}[]}{<>()}><<{}()><(){}>>}>[<<[<><>]<()()>><<(){}>{[]<>}>)(<{(){}}({}{})>{[
+(({({[<[(([[(({}[]){<>()})]]<([([]())<{}[]>]){{{{}[]}{<>()}}([[][]](<>{}))}>)[<[{<{}()>{{}<>}}]<<
+{{(({{<((<<({[(){}]<[]()>}(<{}()>[<>()]))[{{{}<>}[<>()]}[{[]}{()()}]]>][(<<<[]<>>{{}()}>(<{}{}>{<>{
+({([{<{{{[{({{[]()}<[]{}>})[{<<>()>{[]}}<({}{})({}<>)>]}<{[[[]<>][{}()]][[()<>]([]<>)]}({[<>[]]<{}<>>}<
+[[(<[[({<[{({<{}()>[()[]]}{{[]()}{[][]}})[(({}<>)<<><>>)[([]<>)<{}[]>]]}]>>[{<<(<[[]<>](()[])>[<{}><[]()>
+(<<<<[{<{({<(<{}<>>)>{({[]{}}<<>{}>)<[{}<>]<[]()>>}}){{{{([]<>){(){}}}[{[]<>}[[]{})]}[({(){}
+({[{{[{[[<([[<{}()>[[][]]]{((){}){()<>}}](([{}[]][[][]])[([]())]))>]]{<<<<([{}[]])<([])[{}{}
+({(((({{{[[[[{<><>}]<[<><>][(){}]>]{{(<>()){<>[]}}{<()<>>{<>}}}]]}}<[<<((<{}<>><<>[]>){<<><>>{()
+{{<<{{[<<[[<[<{}>[{}<>]]<<<><>>([]())>>(<(<>())(<>{})>(({}{})(<><>)))]<{{{[]{}}[<>{}]}(<(){}>[()()]
+[<(<<{(([{{(((()()){<>()}){[[]()]})((<{}()>[<><>])[({}[])([]<>)])}{([(<>[])<{}<>>]{[()()][{}()]}){[{<>()}<<>
+(<{(<<{[({{([[[]<>][[][]]][<<>()>[[][]]])}[<<([]())<()()>>{[{}()]<[]()>}><({{}[]}{<>()})>]})[{[[([{}]<{
+<<[[(((({<({{([][]){<>()}}}<{(()())<{}()>}{[[][]]<<>()>}>)>})[{{<{[{<><>}[(){}]]((()[])(<><>))}>([<
+<([<{<{{[[[{<{{}<>}<{}]>({<>{}}[{}<>])}(((<>())<[]()>)((()<>){{}[]}))]<{[[<>][<>{}]][([]())]}([[()<>]{(
+{<((<[[{{([<[[()[]]]<{[]{}}{{}}>>(<(()<>)<[]<>>>[<<>()>[{}<>]])]){([[<[]{}>([]())][{()<>}]]<{<
+((([[<(<<(<({{()[]}{[][]}}{<[]()>[{}()]})[(<<>()>([]<>))<[<>{}]>]>)<<[<[[]<>]>{(()[]){()<>}}]{(
+(<({<{<{[([{{<<>{}>(()[])}}[(({}())([][]))[{{}{}}([]<>)]]](<([[]{}]([]{}))([<><>](()<>))>{[({}{})[()()]][
+{<{{{{{(<{((({{}}[[][]]){([]{}>})<{{()()}[{}<>]}([(){}])>)<<([<>[]]<<>>)[(()<>)([])]><{<()<>>}(<<><
+{{<[{([{{<{([<[]<>>[<>{}]][({}()><<>()>])[<[()[]](()())><[[]]<[]()>>]}{[([<>[]])[<[]{}>]]{{(<><>){{}<>}}(
+[(<({<[{<({[[{[]<>}[[][]]]<{[]()}<[]()>>]<[[[][]]{[]<>}][<[]<>>{[]()}]>}[<<(<>{})[{}{}]>[{{}()}[()()]]><[(
+<([[<(({<{[{{<()[]><{}()>}{{{}<>}}}([{{}[]}<{}<>>]{<[]<>>({}[])})]}>((([{<[]<>>{<>[])}(<<>[]
+({{<[[([{<{{<[<>{}](()<>)><(()())>}[[<{}[]><<>()}]<{()<>}[()()]>]}>{<<([<>()]([]{}))((<>())[[][]])>
+([((([[[{{<((<<><>>{[]})<(<><>)<()<>>>){([[]{}][[][]])<<{}<>>{{}<>}>}>{<<[(){}][()()]>[<[]()><
+[<<[[({<<[[<<<()<>>[()[]]><(()())>>(((()[])[(){}])((<>[]){{}[]>))]<<{[[]()][()]}>{(<{}<>>(<><>))<[<>()][
+{{{[([(({{{(([{}[]](()<>))({{}{}})){[({}())(<>[])]}}{<(([][])[<>()])([(){}][{}[]])>[[[[]()]]({<>()}<<>>)]}
+{<(<(([<[<<[[({}[])<<><>>]]({<[]()>}({[]()}<[]()>))><<(((){})(<>[]))>({{<>[]}({}<>)}{<{}()>(()())})>>([<{{
+[<{[[<[({{{<{{[]{}}<[]{}>}{<<><>>}>}[{[([][])<{}()>]({[]<>}[()()])}[([{}[]][[]<>])]]}}<<{[([{}(
+{[([(<{{{([{<[<><>]<<>{}>>[<{}[]>[[]<>]]}])<({[<[][]><[]<>>][<<><>><{}()>]})>}(<{<[(()[])<()
+{((((<{[[[{([(()[])[<>()]]){[{{}()}]}}{{{({}[]){[][]}}[<[]()>]}}]]{[[<({<><>}(<>[]))[({}{})<()()>]>]{{[
+[(({[[<<{<[[(({}{}){{}{}}>[[[][]]<{}<>>]][{{<>()}{[][]}}]]>[[[<<{}[]>>[[<>[]][<>{}]]]{{{{}(
+[([[[[{((<([{[{}{}]([]())}{[()()][{}<>]}])<({{{}{}}<()()>}<([]{})[(){}]>)<({{}{}}<<>[]>)<[<><>][(){}]>>>>[[
+[{{<[{<((([{{<[][]>{<>[]}}({<><>}<<><>>)}<<<{}{}>{[]{}}>{[[]<>]({})}>][<<{{}}(<>())>{{[][]}<[]>}>
+[(([({<(<{[{<{<>{}}><[()()]<()[]>>}{((()())<<><>>)[<{}<>>[<>()]]}]}{{{(<{}{}><<>[]>){{{}}[(){}]}}}{[<{[]{}}>{
+{[[{<[(<<[({({{}{}}[{}<>])[(<>{})<<><>>]}(([{}{}](()()))(<[]>[<>[]])))<({<[]()>}[[<><>]<()
+<[({({<[((<[<({}<>)({}())>]>[({{[]}<{}()>})((<[][]>((){}))[<(){}><()()>])])([[([{}{}]<(){}>)](<<{}[]>{{}<>}>)
+<<<[<{[[<{[<<([]<>}[{}{}]>>{[(()()){()<>}][<<>{}>{{}{}}]}][[<[[]<>]{<>}><{[]<>}{{}{}}>]<[{()
+([({{[({{{({<[[]]<{}[]>>}{{<[]()]<<><>>}{[()<>]([]())}}){{[<<><>><<>{}>]<(<><>)([]{})>}}}(
+{[[[({{({[((<[[])(<>{})>{[[]<>]<()>})[[<[]<>>[()()]][{[]<>}<<>[]>]])[<{<{}{}>([]())}{[<>{}]}>]]}[((<
+[<(<<<{{((<<({[]{}}([]{})><({}{})>><({<>{}}<()[]>)({[]()}[{}()])>>(([[()[]]<<>[]>](<<>()>({}<>)))<<([
+{[[{{<<[[[[[([()()}(<>[]))]((<<><>>[[]{}])(<{}[]>[{}()]))]{<{{{}<>}}({<>()}{()()})>{{<{}()><{}<>>}}}]]<({<
+<<<[[{(<{({([{<><>}<[][]>]<([]())[{}]>)})<<[<{[]()}({}{})>](<{{}[]}[()[]]>(<[]<>><<>()>)))>}
+([([((([(<({<[[]<>][()()]>})[[<<<>><<>[]>>({()()}([][]))][<({}[])<<>[]>>{{{}()}{[]{}}}]]><<[<{(){
+{[([{{<{{[{{{<<>{}>}}<[(())(<>{})]{({}<>)[{}[]>}>}{<([[]()]([][]))[[<>[]]<()[]>]>}]({{{[[]{}]{{}()}}}}([[
+{[<[(<<<[<{([(<>[])<{}()>]{[[]{}]<[]<>>})}>]{{[(<{<><>}[{}()]>{[[]{}][{}{}]}){[([]<>)({}())]{{(){}}({
+((({<{<[[[({<[[]()]{()()}><[<>()][{}[]]>}<(<{}[]>)((<><>)<{}{}>)>)]]{((<<[{}{}][[]()]>(([]<>)[[]{}])><[{[
+{<[<<([<<<{([{<>[]}[()[]]]([{}<>]<[]<>>))<[{<>[]}[{}]]>}[[<[<><>](<>{})>{[()<>)[{}()]}](<((){})([]<>)>)]>
+{[((<[<((<<<{{{}<>}(<>[])}({<><>}(<>{}))>[[<(){}>((){})]((()[]){<>()})]>[<{[[]{}][{}()]}({(){}}<{}
+[{[<{<(([[([(<[]()>((){}))[([]{})[<>{}]]]{<{{}()}(<>{})>})<{(<{}{}>((){}))<{<>[]}<<>()>>}>]({<([{}<>]{<>(
+<{(<([<<{([<{([]{})<[]()>}<{[][]}({}[])>>{(<<>{}>){[()[]]<()()>}}]<[<(<>())><{()()}[()<>]>]>){<{[<(){}><
+(<([([<{<{[<(({}[])((){}))[[{}()](<>())]>][[{[[]()]<()()>]]<<{[]()}>{[{}<>]<[]()>}>]}<<([{{}<>}<()
+[({(({[[[[({{[{}{}]}{(()())[<>[]]}}<{<<>()>(<>[])}(([]){<>{}})>)<<{{[]}[<>()]}{{<>[]}<[]()>})>]]]]})[<[
+<((([[{({(<[<{{}<>>[[]()]><<[][]>[{}()]>][<<{}[]><{}<>>>{[{}()]{<>{}}}]><[{<(){}>{()()}}<(<>{
+[{<{(<{[((<{<{{}[]}({}{})>{({}[])[<>[]]}}{({[]()}){[{}()]<()>}}><<([[]]{<><>}){[[]()](<>{})}>{(<(){}>{[]
+<<([{(<<(([{[{<><>}<{}<>>][[()<>]]}([(()[])[[]()]}<<<>{}>{(){}}>)])[(<<{()()}><[()[]]{<>()}>><(([]{})
+[(<([<{<{{((<((){})<[]{}>>({()[]}({}<>))))}([<[(<>())[{}[]]]((<>[])[{}[]])>[[[(){}]{<>{}}]]])}[{({(<()()){{}
+{({<(<(<{{(({{<>[]}{<>[]}}[{{}}<<>>]))<<[<()[]><()[]>]<({}{})<<>[]>>>{[[[]())<[]()>]}>}{{{(<[]<>><
+{[{{[(<[[[({[{[]()}[[]]]<<<>[]><()()>>})][[(([<>{}]{{}()}){<{}<>>{[]<>}})[{({}<>)}]]<<{(<><>)<{}()>}<(<>())<<
+<{<{{[<[<{<(([[]{}])[[{}{}]{()[]}])<<{()()}{()<>)>>>}<[<[[{}{}][()[]]]<<[]()>(<>[])>>[(([])
+(([{([<<{{((({()()}[()<>])({<><>}))<<{[][]}[{}()]>{([]{})}>)}}(<<{(<[]()>{[]()})((()()){<><
+[[{<{{{{<(<{{{()[]}{{}[]}}}><<<<{}[]>{{}()}><[{}<>](()[])>>{{({}()><(){}>}<{[]()}[{}]>}>)>[[[{[[{}<>]<()()>][
+[(<<{[{([{[[[{(){}}]<[[][]][<>[]]>]<[<()[]>(()<>)]<<[]()>{[]<>}>>]<<{<{}{}>{{}<>}}{<<><>>[{}<>]}>[
+<[{[({[[[[([([[]<>]<<>{}>)(<{}[]>[<><>])]{[[[]<>}{<><>}]{(()())[()[]]}}){<(<()[]><{}{}>)>{((<><>)[<><>]){{<>
+{([((<{[<({{(<[]>({}{})]{[<>{}]<{}()>}}{([<>{}]<(){}>)[[<>{}](())]}})>[{{<[<<>[]>({}[])]<<{}{}>{
+[<<{([{{{([(<[<>[]][()<>]>(<[]()><<>[]>))(((()()){{}()})<<<>{}>[()<>]>)][{({[]{}}(<><>))[{(){}]]}{<([]<>)
+{[<(([[[{{[{<(<><>)<<>{}>>}]{<{<<><>>}>{[{[]()}[<><>]]([()()][()()])}}}<[{(<()<>>{{}<>})}]{{[<()>{{}[]}]{{{}
+[<[{({{{[<[({<<>{}>{{}{}}})<((<>{}))[{(){}}]>]><((<{[]()}>[([][])]))[[(<()()><{}{}>)[[{}<>]<<>{}}]]{[[<><>
+([{<(([(((<{({()[]}{[]<>})[{[]{}}]}>(<{<()[]>}(([]{})[[]])>)){{{({{}()})(<<>()><[]<>>)}<[{[]{}}]<(()[]>([](
diff --git a/2021/10/testinput b/2021/10/testinput
new file mode 100644
index 0000000..b1518d9
--- /dev/null
+++ b/2021/10/testinput
@@ -0,0 +1,10 @@
+[({(<(())[]>[[{[]{<()<>>
+[(()[<>])]({[<{<<[]>>(
+{([(<{}[<>[]}>{[]{[(<()>
+(((({<>}<{<{<>}{[]{[]{}
+[[<[([]))<([[{}[[()]]]
+[{[{({}]{}}([{[{{{}}([]
+{<[[]]>}<{[{[{[]{()[[[]
+[<(<(<(<{}))><([]([]()
+<{([([[(<>()){}]>(<<{{
+<{([{{}}[<[[[<>{}]]]>[]]
diff --git a/2021/11/code.tl b/2021/11/code.tl
new file mode 100644
index 0000000..9dc724b
--- /dev/null
+++ b/2021/11/code.tl
@@ -0,0 +1,78 @@
+(defstruct board ()
+ w h a s
+
+ (:postinit (bo)
+ (set bo.s (* bo.w bo.h)))
+
+ (:method count-flashes (bo)
+ (sum bo.a (op countql #\0)))
+
+ (:method all-flash (bo)
+ (eql bo.s bo.(count-flashes)))
+
+ (:method lambda (me x y)
+ (if (or (minusp x)
+ (minusp y)
+ (<= me.w x)
+ (<= me.h y))
+ #\0
+ [[me.a y] x]))
+
+ (:method lambda-set (me x y nv)
+ (unless (or (minusp x)
+ (minusp y)
+ (<= me.w x)
+ (<= me.h y))
+ (set [[me.a y] x] nv))))
+
+(defmacro forxy (x y bo . body)
+ ^(each-prod ((,y 0..(qref ,bo h))
+ (,x 0..(qref ,bo w)))
+ ,*body))
+
+(defmacro incnz (place)
+ (with-gensyms (p)
+ ^(placelet ((,p (read-once ,place)))
+ (if (eql #\0 ,p) #\0 (inc ,p)))))
+
+(defmacro mincnz (. places)
+ ^(progn ,*(mapcar (ret ^(incnz ,@1)) places)))
+
+(defun read-board-file (: (name "input"))
+ (flow (file-get-lines name)
+ vec-list
+ (new board
+ h (len @1)
+ w (len (first @1))
+ a @1)))
+
+(defmeth board step (bo)
+ (forxy x y bo
+ (inc [bo x y]))
+ (let ((flashed t))
+ (while flashed
+ (zap flashed)
+ (forxy x y bo
+ (when (> [bo x y] #\9)
+ (set flashed t
+ [bo x y] #\0)
+ (let ((x- (pred x)) (x+ (succ x))
+ (y- (pred y)) (y+ (succ y)))
+ ;; "multi increment, from non-zero"
+ (mincnz [bo x- y-] [bo x y-] [bo x+ y-]
+ [bo x- y] [bo x+ y]
+ [bo x- y+] [bo x y+] [bo x+ y+]))))))
+ bo)
+
+(defun solve-part-one (: (name "input"))
+ (let ((bo (read-board-file name))
+ (tf 0))
+ (dotimes (i 100 tf)
+ (inc tf bo.(step).(count-flashes)))))
+
+(defun solve-part-two (: (name "input"))
+ (for ((bo (read-board-file name))
+ (i 0))
+ ((not bo.(all-flash)) i)
+ (bo.(step)
+ (inc i))))
diff --git a/2021/11/input b/2021/11/input
new file mode 100644
index 0000000..497e9f0
--- /dev/null
+++ b/2021/11/input
@@ -0,0 +1,10 @@
+8258741254
+3335286211
+8468661311
+6164578353
+2138414553
+1785385447
+3441133751
+3586862837
+7568272878
+6833643144
diff --git a/2021/11/testinput b/2021/11/testinput
new file mode 100644
index 0000000..03743f6
--- /dev/null
+++ b/2021/11/testinput
@@ -0,0 +1,10 @@
+5483143223
+2745854711
+5264556173
+6141336146
+6357385478
+4167524645
+2176841721
+6882881134
+4846848554
+5283751526
diff --git a/2021/11/testinput-small b/2021/11/testinput-small
new file mode 100644
index 0000000..ae21dd2
--- /dev/null
+++ b/2021/11/testinput-small
@@ -0,0 +1,5 @@
+11111
+19991
+19191
+19991
+11111
diff --git a/2021/12/input b/2021/12/input
new file mode 100644
index 0000000..756681b
--- /dev/null
+++ b/2021/12/input
@@ -0,0 +1,23 @@
+pn-TY
+rp-ka
+az-aw
+al-IV
+pn-co
+end-rp
+aw-TY
+rp-pn
+al-rp
+end-al
+IV-co
+end-TM
+co-TY
+TY-ka
+aw-pn
+aw-IV
+pn-IV
+IV-ka
+TM-rp
+aw-PD
+start-IV
+start-co
+start-pn
diff --git a/2021/12/one.tl b/2021/12/one.tl
new file mode 100644
index 0000000..70e36d5
--- /dev/null
+++ b/2021/12/one.tl
@@ -0,0 +1,49 @@
+(defvar %cave-hash% (hash))
+
+(defstruct cave ()
+ name
+ neighbors
+
+ (:postinit (cv)
+ (assert cv.name)
+ (set [%cave-hash% cv.name] cv)))
+
+(defstruct small-cave cave
+ (:method visit (cv path fn)
+ (unless (member cv path)
+ (push cv path)
+ (each ((n cv.neighbors))
+ n.(visit path fn)))))
+
+(defstruct big-cave cave
+ (:method visit (cv path fn)
+ (push cv path)
+ (each ((n cv.neighbors))
+ n.(visit path fn))))
+
+(defstruct end-cave cave
+ (:method visit (cv path fn)
+ (push cv path)
+ [fn path]))
+
+(defun ensure-cave (name)
+ (or [%cave-hash% name]
+ (set [%cave-hash% name]
+ (match-case name
+ ("end" (new end-cave name name))
+ (@[all @str chr-islower] (new small-cave name name))
+ (@else (new big-cave name name))))))
+
+(defun read-caves (: (name "input"))
+ (with-stream (s (open-file name))
+ (whilet ((line (get-line s)))
+ (match `@a-@b` line
+ (let ((ca (ensure-cave a))
+ (cb (ensure-cave b)))
+ (pushnew cb ca.neighbors)
+ (pushnew ca cb.neighbors))))))
+
+(defun find-paths (fn)
+ (let ((start [%cave-hash% "start"]))
+ (assert start)
+ start.(visit nil fn)))
diff --git a/2021/12/testinput b/2021/12/testinput
new file mode 100644
index 0000000..6fd8c41
--- /dev/null
+++ b/2021/12/testinput
@@ -0,0 +1,7 @@
+start-A
+start-b
+A-c
+A-b
+b-d
+A-end
+b-end
diff --git a/2021/12/two.tl b/2021/12/two.tl
new file mode 100644
index 0000000..69f179a
--- /dev/null
+++ b/2021/12/two.tl
@@ -0,0 +1,68 @@
+(defvar %cave-hash% (hash))
+
+(defstruct cave ()
+ name
+ neighbors
+
+ (:postinit (cv)
+ (assert cv.name)
+ (set [%cave-hash% cv.name] cv)))
+
+(defstruct end-cave cave
+ (:method visit (cv path fn)
+ (push cv path)
+ [fn (remq t path)]))
+
+(defstruct start-cave cave
+ (:method visit (cv path fn)
+ (unless (member cv path)
+ (push cv path)
+ (each ((n cv.neighbors))
+ n.(visit path fn)))))
+
+(defstruct small-cave cave
+ (:method visit (cv path fn)
+ (let ((in-path (member cv path)))
+ (when (or (not in-path)
+ (not (member t path)))
+ (push cv path)
+ (if in-path
+ (push t path))
+ (each ((n cv.neighbors))
+ n.(visit path fn))))))
+
+(defstruct big-cave cave
+ (:method visit (cv path fn)
+ (push cv path)
+ (each ((n cv.neighbors))
+ n.(visit path fn))))
+
+(defun ensure-cave (name)
+ (or [%cave-hash% name]
+ (set [%cave-hash% name]
+ (match-case name
+ ("end" (new end-cave name name))
+ ("start" (new start-cave name name))
+ (@[all @str chr-islower] (new small-cave name name))
+ (@else (new big-cave name name))))))
+
+(defun read-caves (: (name "input"))
+ (with-stream (s (open-file name))
+ (whilet ((line (get-line s)))
+ (match `@a-@b` line
+ (let ((ca (ensure-cave a))
+ (cb (ensure-cave b)))
+ (pushnew cb ca.neighbors)
+ (pushnew ca cb.neighbors))))))
+
+(defun find-paths (fn)
+ (let ((start [%cave-hash% "start"]))
+ (assert start)
+ start.(visit nil fn)))
+
+(defun solve (: (name "input"))
+ (let (paths)
+ (read-caves name)
+ (find-paths (opip reverse (mapcar .name) (push @1 paths)))
+ (mapdo [chain (ap join-with ",") pprinl] paths)
+ (len paths)))
diff --git a/2021/17/code.tl b/2021/17/code.tl
new file mode 100644
index 0000000..af76de0
--- /dev/null
+++ b/2021/17/code.tl
@@ -0,0 +1,46 @@
+(defstruct spec ()
+ x0 x1
+ y0 y1)
+
+(defun read-input (: (name "input"))
+ (flow name
+ file-get-string
+ (match `target area: x=@x0..@x1, y=@y0..@y1\n@nil` @1
+ (new spec x0 (toint x0) x1 (toint x1) y0 (toint y0) y1 (toint y1)))))
+
+(defun simulate-shot (sp xv yv)
+ (let ((x0 sp.x0) (x1 sp.x1)
+ (y0 sp.y0) (y1 sp.y1))
+ (for ((x 0) (y 0) (maxy -1000)) () ()
+ (cond
+ ((or (< y y0) (> x x1))
+ (return))
+ ((and (<= x0 x x1) (<= y0 y y1))
+ (return maxy)))
+ (inc x xv)
+ (inc y yv)
+ (upd maxy (max y maxy))
+ (dec xv (signum xv))
+ (dec yv 1))))
+
+(defun solve-one (: (name :))
+ (let ((sp (read-input name)))
+ (flow
+ (build
+ (each-prod ((xv 1..40)
+ (yv 1..700))
+ (iflet ((maxy (simulate-shot sp xv yv)))
+ (add (list xv yv maxy)))))
+ (find-max @1 : caddr))))
+
+(defun solve-two (: (name :))
+ (let ((sp (read-input name)))
+ (flow
+ (build
+ (each-prod ((xv 1..300)
+ (yv -100..400))
+ (iflet ((maxy (simulate-shot sp xv yv)))
+ (add (list xv yv maxy)))))
+ (mapcar (ap list @1 @2))
+ uniq
+ len)))
diff --git a/2021/17/errors.err b/2021/17/errors.err
new file mode 100644
index 0000000..6bff0b0
--- /dev/null
+++ b/2021/17/errors.err
@@ -0,0 +1,2 @@
+defmicro: error: expansion is larger than original form: switch to defmacro.
+1>
diff --git a/2021/17/input b/2021/17/input
new file mode 100644
index 0000000..d9179a5
--- /dev/null
+++ b/2021/17/input
@@ -0,0 +1 @@
+target area: x=240..292, y=-90..-57
diff --git a/2021/17/testinput b/2021/17/testinput
new file mode 100644
index 0000000..a07e02d
--- /dev/null
+++ b/2021/17/testinput
@@ -0,0 +1 @@
+target area: x=20..30, y=-10..-5
diff --git a/2021/18/code.tl b/2021/18/code.tl
new file mode 100644
index 0000000..92b17e3
--- /dev/null
+++ b/2021/18/code.tl
@@ -0,0 +1,75 @@
+(defun read-string (str)
+ (flow str (mapcar (relate '(#\[ #\] #\,) '(#\( #\) #\space))) read))
+
+(defun read-input (: (name "input"))
+ (flow name file-get-lines (mapcar read-string)))
+
+(defun ladd (n sn)
+ (tree-case sn
+ ((a b) ^(,(ladd n a) ,b))
+ (m (+ n m))))
+
+(defun radd (sn n)
+ (tree-case sn
+ ((a b) ^(,a ,(radd b n)))
+ (m (+ m n))))
+
+(defun explode (sn)
+ (match-case sn
+ (^(((((,a ,b) ,x) ,y) ,z) ,w) ^((((0 ,(ladd b x)) ,y) ,z) ,w))
+ (^((((,x (,a ,b)) ,y) ,z) ,w) ^((((,(radd x a) 0) ,(ladd b y)) ,z) ,w))
+ (^(((,y ((,a ,b) ,x)) ,z) ,w) ^(((,(radd y a) (0 ,(ladd b x))) ,z) ,w))
+ (^(((,y (,x (,a ,b))) ,z) ,w) ^(((,y (,(radd x a) 0)) ,(ladd b z)) ,w))
+ (^((,z (((,a ,b) ,x) ,y)) ,w) ^((,(radd z a) ((0 ,(ladd b x)) ,y)) ,w))
+ (^((,z ((,x (,a ,b)) ,y)) ,w) ^((,z ((,(radd x a) 0) ,(ladd b y))) ,w))
+ (^((,z (,y ((,a ,b) ,x))) ,w) ^((,z (,(radd y a) (0 ,(ladd b x)))) ,w))
+ (^((,z (,y (,x (,a ,b)))) ,w) ^((,z (,y (,(radd x a) 0))) ,(ladd b w)))
+ (^(,w ((((,a ,b) ,x) ,y) ,z)) ^(,(radd w a) (((0 ,(ladd b x)) ,y) ,z)))
+ (^(,w (((,x (,a ,b)) ,y) ,z)) ^(,w (((,(radd x a) 0) ,(ladd b y)) ,z)))
+ (^(,w ((,y ((,a ,b) ,x)) ,z)) ^(,w ((,(radd y a) (0 ,(ladd b x))) ,z)))
+ (^(,w ((,y (,x (,a ,b))) ,z)) ^(,w ((,y (,(radd x a) 0)) ,(ladd b z))))
+ (^(,w (,z (((,a ,b) ,x) ,y))) ^(,w (,(radd z a) ((0 ,(ladd b x)) ,y))))
+ (^(,w (,z ((,x (,a ,b)) ,y))) ^(,w (,z ((,(radd x a) 0) ,(ladd b y)))))
+ (^(,w (,z (,y ((,a ,b) ,x)))) ^(,w (,z (,(radd y a) (0 ,(ladd b x))))))
+ (^(,w (,z (,y (,x (,a ,b))))) ^(,w (,z (,y (,(radd x a) 0)))))
+ (@else else)))
+
+(defun splt (sn)
+ (tree-case sn
+ ((a b)
+ (let ((as (splt a))
+ (bs (splt b)))
+ (cond
+ ((neq a as) ^(,as ,b))
+ ((neq b bs) ^(,a ,bs))
+ (t sn))))
+ (m (if (< m 10)
+ m
+ (let* ((x (trunc m 2))
+ (y (- m x)))
+ ^(,x ,y))))))
+
+(defun reduce (sn)
+ (let (sn*)
+ (while* (neq sn* sn)
+ (while* (neq sn* sn)
+ (shift sn* sn (explode sn)))
+ (shift sn* sn (splt sn)))
+ sn))
+
+(defun add (sn0 sn1)
+ (reduce (list sn0 sn1)))
+
+(defun mag (sn)
+ (tree-case sn
+ ((a b) (+ (* 3 (mag a)) (* 2 (mag b))))
+ (m m)))
+
+(defun solve-one (: (name :))
+ (flow name read-input (reduce-left add) mag))
+
+(defun solve-two (: (name :))
+ (flow name read-input (comb @1 2)
+ (mappend [juxt [chain [apf add] mag]
+ [chain [apf [flipargs add]] mag]])
+ find-max))
diff --git a/2021/18/code2.tl b/2021/18/code2.tl
new file mode 100644
index 0000000..58e2e32
--- /dev/null
+++ b/2021/18/code2.tl
@@ -0,0 +1,75 @@
+(defun read-string (str)
+ (flow str (mapcar (relate '(#\[ #\] #\,) '(#\( #\) #\space))) read))
+
+(defun read-input (: (name "input"))
+ (flow name file-get-lines (mapcar read-string)))
+
+(defun ladd (n sn)
+ (tree-case sn
+ ((a b) ^(,(ladd n a) ,b))
+ (m (+ n m))))
+
+(defun radd (sn n)
+ (tree-case sn
+ ((a b) ^(,a ,(radd b n)))
+ (m (+ m n))))
+
+(defun explode (sn)
+ (tree-case sn
+ ((((((a b) x) y) z) w) ^((((0 ,(ladd b x)) ,y) ,z) ,w))
+ (((((x (a b)) y) z) w) ^((((,(radd x a) 0) ,(ladd b y)) ,z) ,w))
+ ((((y ((a b) x)) z) w) ^(((,(radd y a) (0 ,(ladd b x))) ,z) ,w))
+ ((((y (x (a b))) z) w) ^(((,y (,(radd x a) 0)) ,(ladd b z)) ,w))
+ (((z (((a b) x) y)) w) ^((,(radd z a) ((0 ,(ladd b x)) ,y)) ,w))
+ (((z ((x (a b)) y)) w) ^((,z ((,(radd x a) 0) ,(ladd b y))) ,w))
+ (((z (y ((a b) x))) w) ^((,z (,(radd y a) (0 ,(ladd b x)))) ,w))
+ (((z (y (x (a b)))) w) ^((,z (,y (,(radd x a) 0))) ,(ladd b w)))
+ ((w ((((a b) x) y) z)) ^(,(radd w a) (((0 ,(ladd b x)) ,y) ,z)))
+ ((w (((x (a b)) y) z)) ^(,w (((,(radd x a) 0) ,(ladd b y)) ,z)))
+ ((w ((y ((a b) x)) z)) ^(,w ((,(radd y a) (0 ,(ladd b x))) ,z)))
+ ((w ((y (x (a b))) z)) ^(,w ((,y (,(radd x a) 0)) ,(ladd b z))))
+ ((w (z (((a b) x) y))) ^(,w (,(radd z a) ((0 ,(ladd b x)) ,y))))
+ ((w (z ((x (a b)) y))) ^(,w (,z ((,(radd x a) 0) ,(ladd b y)))))
+ ((w (z (y ((a b) x)))) ^(,w (,z (,(radd y a) (0 ,(ladd b x))))))
+ ((w (z (y (x (a b))))) ^(,w (,z (,y (,(radd x a) 0)))))
+ (else else)))
+
+(defun splt (sn)
+ (tree-case sn
+ ((a b)
+ (let ((as (splt a))
+ (bs (splt b)))
+ (cond
+ ((neq a as) ^(,as ,b))
+ ((neq b bs) ^(,a ,bs))
+ (t sn))))
+ (m (if (< m 10)
+ m
+ (let* ((x (trunc m 2))
+ (y (- m x)))
+ ^(,x ,y))))))
+
+(defun reduce (sn)
+ (let (sn*)
+ (while* (neq sn* sn)
+ (while* (neq sn* sn)
+ (shift sn* sn (explode sn)))
+ (shift sn* sn (splt sn)))
+ sn))
+
+(defun add (sn0 sn1)
+ (reduce (list sn0 sn1)))
+
+(defun mag (sn)
+ (tree-case sn
+ ((a b) (+ (* 3 (mag a)) (* 2 (mag b))))
+ (m m)))
+
+(defun solve-one (: (name :))
+ (flow name read-input (reduce-left add) mag))
+
+(defun solve-two (: (name :))
+ (flow name read-input (comb @1 2)
+ (mappend [juxt [chain [apf add] mag]
+ [chain [apf [flipargs add]] mag]])
+ find-max))
diff --git a/2021/18/input b/2021/18/input
new file mode 100644
index 0000000..5116955
--- /dev/null
+++ b/2021/18/input
@@ -0,0 +1,100 @@
+[[2,[2,[4,0]]],[6,1]]
+[[3,[4,[2,4]]],[[6,9],[6,1]]]
+[7,[8,[8,[0,8]]]]
+[[[[2,9],5],5],[[[0,1],8],[[7,9],5]]]
+[[[[3,0],[7,0]],[[9,6],[1,9]]],4]
+[[[0,[4,8]],8],[[[2,1],9],6]]
+[[[5,[7,7]],[[9,6],2]],[[[5,8],8],0]]
+[[0,3],[[8,2],[6,[2,2]]]]
+[[[9,0],[4,[4,7]]],[7,[[9,1],9]]]
+[0,[7,[1,1]]]
+[[[4,[0,1]],[[1,0],8]],[[[3,9],[0,1]],[[9,1],[8,8]]]]
+[[[6,0],3],2]
+[[[[4,1],[2,7]],[9,[8,9]]],[[3,0],0]]
+[[[[2,4],[8,7]],[9,[9,7]]],[[[2,5],6],9]]
+[[7,6],[[4,[2,4]],[3,8]]]
+[[7,2],[[8,8],7]]
+[[[[6,0],4],[[4,7],4]],[[6,[2,7]],[[6,5],3]]]
+[[[[8,8],[7,6]],4],5]
+[[0,[[6,9],[7,9]]],[9,5]]
+[9,[[[0,4],6],[[7,0],0]]]
+[[[[4,4],0],[3,[3,9]]],[[7,5],[5,[7,2]]]]
+[[[8,3],[[8,5],[4,4]]],[0,[0,3]]]
+[[9,[3,[6,7]]],[[7,0],[[9,2],7]]]
+[[[3,7],[[3,6],9]],7]
+[[2,[2,[5,7]]],[[[6,4],5],[4,7]]]
+[[[[9,0],2],[[4,4],6]],[[[3,2],[5,5]],[[5,9],7]]]
+[[[[2,5],4],[8,5]],6]
+[[[3,2],[[1,7],5]],[[8,1],[1,[1,2]]]]
+[8,[[3,[5,4]],5]]
+[[[2,[5,9]],[1,3]],[[[2,3],[8,3]],[[5,1],[8,9]]]]
+[[[2,0],[[3,3],[4,7]]],[[[8,7],[7,4]],1]]
+[[[[7,4],9],[3,[4,1]]],[[[8,4],5],7]]
+[[[[0,2],9],3],[9,[5,3]]]
+[3,4]
+[[[1,[0,2]],[[9,9],[8,2]]],6]
+[[[[2,9],[3,5]],9],[[9,3],[3,[6,7]]]]
+[[0,[[4,6],4]],[2,[5,2]]]
+[9,[[9,[6,8]],8]]
+[3,[[[1,2],[0,9]],[[4,9],1]]]
+[[[[8,7],[1,7]],[[2,6],[8,5]]],[3,[[8,0],[6,9]]]]
+[[8,[[4,9],7]],[3,[9,4]]]
+[[0,[[3,2],[2,2]]],0]
+[[[2,7],[[5,7],4]],[[[6,0],[2,1]],[[4,1],[1,6]]]]
+[[[[9,6],[0,3]],[[0,6],[0,4]]],[[[3,7],[6,7]],7]]
+[[[[1,1],6],[[5,6],4]],[[5,[0,7]],1]]
+[[[3,9],[[7,3],[1,5]]],[[[1,2],3],[0,[5,6]]]]
+[[[[4,4],[0,5]],6],[[7,[2,0]],6]]
+[[[[2,2],6],9],[[[9,1],2],[[8,6],8]]]
+[[[[5,0],8],[[5,7],7]],[6,[5,3]]]
+[[[[8,2],[8,4]],1],[[1,[7,3]],8]]
+[[[[3,2],2],[[4,9],[5,4]]],[[[9,2],4],[5,[6,0]]]]
+[[1,[[0,6],0]],[[[1,5],2],[[6,0],[3,7]]]]
+[4,[7,[6,[3,3]]]]
+[[[0,[2,5]],2],5]
+[[[0,[5,7]],9],[[[2,3],[3,4]],[[0,4],9]]]
+[[3,1],[[[4,1],9],[[0,5],[8,6]]]]
+[[9,[2,0]],[[0,[1,7]],[9,[6,4]]]]
+[[[[6,5],5],5],[5,8]]
+[[[[2,8],[1,3]],[[5,4],2]],[[[0,8],[5,1]],[9,[5,6]]]]
+[[[[6,9],7],[9,7]],2]
+[[[[1,7],8],[8,7]],[[[3,5],4],8]]
+[[[[1,8],[1,0]],0],[[7,1],5]]
+[[[9,[6,8]],3],[[5,1],[4,[8,2]]]]
+[[[0,[2,1]],1],[3,[9,[5,5]]]]
+[[2,5],[2,5]]
+[[[[1,1],[8,3]],[[1,9],[4,9]]],[[5,[4,8]],[[5,0],0]]]
+[[[0,7],[[3,4],1]],[[[1,2],[2,9]],[[2,0],9]]]
+[3,2]
+[[[9,[8,2]],[7,3]],7]
+[[[[6,9],9],[3,2]],0]
+[[3,[[6,1],8]],6]
+[[[[5,9],9],[[4,4],7]],[7,5]]
+[1,[[2,8],0]]
+[[2,[0,6]],[[[3,3],[0,4]],8]]
+[[[[4,8],9],[0,[3,0]]],[[0,[3,1]],[8,[7,4]]]]
+[[[6,[8,0]],[0,[8,9]]],[3,8]]
+[[[[0,8],[9,4]],[1,[2,0]]],1]
+[[7,6],[[[0,2],9],3]]
+[[[[1,0],3],2],1]
+[[[[1,2],8],5],7]
+[0,[[3,0],7]]
+[[7,[[0,9],[8,4]]],[[2,0],[[2,8],1]]]
+[[[1,8],[[8,1],1]],[3,[8,9]]]
+[4,[[3,7],[[5,2],9]]]
+[[[[3,8],[2,9]],[3,9]],[[[3,7],[6,9]],[[1,7],2]]]
+[9,[[[3,7],9],[[4,9],[8,6]]]]
+[[7,[3,9]],[0,7]]
+[[[1,6],0],[[7,[8,1]],[6,3]]]
+[[[[3,9],3],[[2,6],[8,0]]],[[3,3],9]]
+[[[1,2],[1,6]],[[1,[4,2]],0]]
+[[[0,[3,0]],2],[[7,[9,4]],[6,8]]]
+[6,[[[3,1],1],5]]
+[[[3,4],[[5,9],[1,1]]],[[2,[0,1]],3]]
+[[2,[[1,5],7]],[0,2]]
+[[1,[[6,7],7]],4]
+[6,[5,[[3,2],[6,8]]]]
+[[[3,9],[[4,0],6]],[8,[3,[5,2]]]]
+[[5,[[7,3],[2,2]]],[[7,7],7]]
+[[[1,2],[[2,4],[6,1]]],[[0,[4,2]],[[5,7],[2,3]]]]
+[[[8,7],8],[[7,[3,6]],[[1,0],4]]]
diff --git a/2021/18/testinput b/2021/18/testinput
new file mode 100644
index 0000000..70e9071
--- /dev/null
+++ b/2021/18/testinput
@@ -0,0 +1,10 @@
+[[[0,[4,5]],[0,0]],[[[4,5],[2,6]],[9,5]]]
+[7,[[[3,7],[4,3]],[[6,3],[8,8]]]]
+[[2,[[0,8],[3,4]]],[[[6,7],1],[7,[1,6]]]]
+[[[[2,4],7],[6,[0,5]]],[[[6,8],[2,8]],[[2,1],[4,5]]]]
+[7,[5,[[3,8],[1,4]]]]
+[[2,[2,2]],[8,[8,1]]]
+[2,9]
+[1,[[[9,3],9],[[9,0],[0,7]]]]
+[[[5,[7,4]],7],1]
+[[[[4,2],2],6],[8,7]]
diff --git a/2021/18/testinput2 b/2021/18/testinput2
new file mode 100644
index 0000000..1368dc4
--- /dev/null
+++ b/2021/18/testinput2
@@ -0,0 +1,10 @@
+[[[0,[5,8]],[[1,7],[9,6]]],[[4,[1,2]],[[1,4],2]]]
+[[[5,[2,8]],4],[5,[[9,9],0]]]
+[6,[[[6,2],[5,6]],[[7,6],[4,7]]]]
+[[[6,[0,7]],[0,9]],[4,[9,[9,0]]]]
+[[[7,[6,4]],[3,[1,3]]],[[[5,5],1],9]]
+[[6,[[7,3],[3,2]]],[[[3,8],[5,7]],4]]
+[[[[5,4],[7,7]],8],[[8,3],8]]
+[[9,3],[[9,9],[6,[4,9]]]]
+[[2,[[7,7],7]],[[5,8],[[9,3],[0,2]]]]
+[[[[5,2],5],[8,[3,7]]],[[5,[7,5]],[4,4]]]
diff --git a/2021/19/code.tl b/2021/19/code.tl
new file mode 100644
index 0000000..97dd3f3
--- /dev/null
+++ b/2021/19/code.tl
@@ -0,0 +1,164 @@
+(defstruct scanner ()
+ id
+ data
+ rot
+ pref
+ delta
+ nei)
+
+(defun read-input (: (name "input"))
+ (with-stream (s (open-file name))
+ (build
+ (let (scnr)
+ (while-match-case (get-line s)
+ ("")
+ (`@x,@y,@z` (push (vec (toint x) (toint y) (toint z)) scnr.data))
+ (`--- scanner @n ---` (set scnr (new scanner id (toint n))) (add scnr)))))))
+
+(defmacro x (p) ^[,p 0])
+(defmacro y (p) ^[,p 1])
+(defmacro z (p) ^[,p 2])
+
+(defmacro rot-z (p)
+ (with-gensyms (tp)
+ ^(let ((,tp ,p))
+ (vec (- (y ,tp)) (x ,tp) (z ,tp)))))
+
+(defmacro rot-y (p)
+ (with-gensyms (tp)
+ ^(let ((,tp ,p))
+ (vec (z ,tp) (y ,tp) (- (x ,tp))))))
+
+(defmacro rot-x (p)
+ (with-gensyms (tp)
+ ^(let ((,tp ,p))
+ (vec (x ,tp) (- (z ,tp)) (y ,tp)))))
+
+(defmacro psub (p0 p1)
+ (with-gensyms (tp0 tp1)
+ ^(let ((,tp0 ,p0) (,tp1 ,p1))
+ (vec (- (x ,tp0) (x ,tp1))
+ (- (y ,tp0) (y ,tp1))
+ (- (z ,tp0) (z ,tp1))))))
+
+(defmacro padd (p0 p1)
+ (with-gensyms (tp0 tp1)
+ ^(let ((,tp0 ,p0) (,tp1 ,p1))
+ (vec (+ (x ,tp0) (x ,tp1))
+ (+ (y ,tp0) (y ,tp1))
+ (+ (z ,tp0) (z ,tp1))))))
+
+(defmeth scanner gen-rot (sc)
+ (set sc.rot (vec))
+ (dotimes (i 24)
+ (vec-push sc.rot (vec)))
+
+ (each ((rA sc.data))
+ (let* ( (rB (rot-x rA)) (rC (rot-x rB)) (rD (rot-x rC))
+ (rE (rot-z rA)) (rF (rot-y rE)) (rG (rot-y rF)) (rH (rot-y rG))
+ (rI (rot-z rE)) (rJ (rot-x rI)) (rK (rot-x rJ)) (rL (rot-x rK))
+ (rM (rot-z rI)) (rN (rot-y rM)) (rO (rot-y rN)) (rP (rot-y rO))
+ (rQ (rot-y rA)) (rR (rot-z rQ)) (rS (rot-z rR)) (rT (rot-z rS))
+ (rU (rot-y (rot-y rQ))) (rV (rot-z rU)) (rW (rot-z rV)) (rX (rot-z rW)))
+ (vec-push [sc.rot 0] rA) (vec-push [sc.rot 1] rB)
+ (vec-push [sc.rot 2] rC) (vec-push [sc.rot 3] rD)
+ (vec-push [sc.rot 4] rE) (vec-push [sc.rot 5] rF)
+ (vec-push [sc.rot 6] rG) (vec-push [sc.rot 7] rH)
+ (vec-push [sc.rot 8] rI) (vec-push [sc.rot 9] rJ)
+ (vec-push [sc.rot 10] rK) (vec-push [sc.rot 11] rL)
+ (vec-push [sc.rot 12] rM) (vec-push [sc.rot 13] rN)
+ (vec-push [sc.rot 14] rO) (vec-push [sc.rot 15] rP)
+ (vec-push [sc.rot 16] rQ) (vec-push [sc.rot 17] rR)
+ (vec-push [sc.rot 18] rS) (vec-push [sc.rot 19] rT)
+ (vec-push [sc.rot 20] rU) (vec-push [sc.rot 21] rV)
+ (vec-push [sc.rot 22] rW) (vec-push [sc.rot 23] rX))))
+
+(defun overlap-delta (pvec0 pvec1 amt)
+ (each-prod ((p0 pvec0)
+ (p1 pvec1))
+ (let* ((delta (psub p1 p0))
+ (novl (len (isec pvec0
+ (mapcar (do psub @1 delta) pvec1)))))
+ (when (>= novl amt)
+ (return delta)))))
+
+(defun overlaps-with (s0 s1 : (amt 12))
+ (for* ((r 0) (r0 [s0.rot (or s0.pref 0)]) (rot1 s1.rot) (n (len rot1)))
+ ((< r n))
+ ((inc r))
+ (whenlet ((delta (overlap-delta r0 [rot1 r] amt)))
+ (return (cons delta r)))))
+
+(defun link-graph (slist)
+ (let ((sf (car slist))
+ (backref)
+ (count 0))
+ (flet ((lnk (s0 s1)
+ (tree-case (overlaps-with s0 s1)
+ ((delta . r)
+ (prinl ^(:lap ,s0.id ,s1.id ,r ,delta))
+ (cond
+ ((and (neq s0 sf) (null s0.pref))
+ (push (cons s0 s1) backref))
+ (t
+ (set s1.pref r)
+ (push (list* s1 r delta) s0.nei)))))))
+ (each-match ((@s0 @s1) (comb slist 2))
+ (prinl ^(,(inc count) ,s0.id ,s1.id))
+ (cond
+ ((null s1.pref) (lnk s0 s1))
+ ((null s0.pref) (lnk s1 s0))))
+ (while backref
+ (set count 0)
+ (put-line "backref")
+ (each-match ((@s0 . @s1) (zap backref))
+ (prinl ^(,(inc count) ,s0.id ,s1.id))
+ (cond
+ ((null s1.pref) (lnk s0 s1))
+ ((null s0.pref) (lnk s1 s0))))))
+ (keep-if .nei slist)))
+
+(defun assemble-map (slist)
+ (let ((out (vec)))
+ (labels ((visit (sn r delta)
+ (prinl ^(:visit ,sn.id ,r))
+ (set sn.delta delta)
+ (each ((p [sn.rot r]))
+ (vec-push out (psub p delta)))
+ (each-match ((@n @nr . @ndelta) sn.nei)
+ (visit n nr (padd delta ndelta)))))
+ (visit (car slist) 0 #(0 0 0)))
+ (prinl ^(:len out ,(len out)))
+ (uniq out)))
+
+;; answer is 438
+(defun solve-one (: (name :))
+ (flow name
+ read-input
+ (progn (mapdo .(gen-rot) @1) @1)
+ link-graph
+ assemble-map))
+
+(defun manhattan (p)
+ [sum p abs])
+
+(defun max-manhattan-delta (slist)
+ (let ((maxhattan 0))
+ (each-match ((@s0 @s1) (comb slist 2))
+ (prinl ^(:delta ,s0.id ,s0.delta ,s1.id ,s1.delta))
+ (let ((mhdelta (manhattan (psub s0.delta s1.delta))))
+ (upd maxhattan (max mhdelta))))
+ maxhattan))
+
+;; answer is 11985
+(defun solve-two (: (name :))
+ (flow name
+ read-input
+ (let ((orig @1))
+ (flow orig
+ (progn (mapdo .(gen-rot) @1) @1)
+ link-graph
+ assemble-map)
+ (flow orig
+ (keep-if .delta)
+ max-manhattan-delta))))
diff --git a/2021/19/input b/2021/19/input
new file mode 100644
index 0000000..f98aaec
--- /dev/null
+++ b/2021/19/input
@@ -0,0 +1,975 @@
+--- scanner 0 ---
+592,476,409
+451,462,-479
+840,-352,632
+619,398,366
+584,458,-482
+794,-340,778
+462,524,-410
+-26,36,-166
+-518,712,-554
+-524,544,-667
+-364,758,518
+542,430,440
+87,115,17
+-380,-427,-609
+863,-333,586
+-422,566,-511
+-756,-510,685
+-806,-704,722
+-408,800,678
+-450,839,466
+-514,-291,-633
+-485,-380,-513
+557,-392,-606
+-788,-610,775
+481,-347,-441
+578,-334,-581
+
+--- scanner 1 ---
+-583,-765,-719
+632,295,485
+636,327,350
+-657,380,343
+599,-732,-645
+-621,253,313
+678,357,398
+-736,626,-578
+-503,-949,296
+-740,733,-663
+-719,286,402
+554,772,-816
+590,-602,633
+692,727,-916
+-601,-833,-688
+538,-677,-732
+-622,-850,299
+-13,-191,-155
+580,-630,724
+-562,-977,-745
+566,-781,-633
+538,732,-855
+-499,-953,313
+-72,-48,-13
+686,-608,696
+-800,649,-736
+
+--- scanner 2 ---
+-516,-454,605
+408,-415,759
+-693,-252,-394
+809,-355,-358
+594,799,-361
+539,788,-397
+-538,-352,761
+-430,654,790
+362,648,691
+420,627,666
+-496,532,862
+-34,99,76
+767,-316,-493
+-684,-448,718
+-752,-304,-381
+615,807,-538
+-649,805,-656
+375,551,831
+-646,815,-771
+-489,744,-720
+-434,521,793
+455,-310,663
+-694,-298,-575
+824,-304,-343
+319,-444,639
+
+--- scanner 3 ---
+515,800,717
+476,790,601
+463,-650,526
+-140,-121,-18
+-406,578,666
+-886,-536,558
+-725,355,-610
+-512,-509,-627
+516,383,-474
+-745,-517,634
+398,785,695
+-563,-580,-470
+-884,343,-589
+473,-634,436
+-627,-519,-630
+-417,508,572
+376,-469,-446
+678,337,-535
+473,-689,409
+-821,358,-537
+-922,-525,613
+372,-374,-564
+-420,562,489
+-19,59,-29
+663,476,-423
+426,-365,-376
+
+--- scanner 4 ---
+-946,524,517
+439,453,813
+-634,505,-587
+-503,-517,-469
+-780,-589,508
+381,521,728
+-797,-767,569
+593,-977,-487
+483,-865,-448
+-420,-477,-415
+-490,572,-567
+595,425,-582
+254,498,748
+-820,-706,431
+-805,477,427
+-887,597,486
+314,-917,364
+-36,-47,-34
+-481,-604,-352
+463,425,-692
+344,-786,331
+686,-924,-419
+326,-647,357
+-566,700,-552
+418,420,-649
+
+--- scanner 5 ---
+574,-507,745
+-493,482,-596
+449,416,545
+413,561,535
+512,747,-503
+-777,-627,794
+449,-632,765
+450,437,649
+-503,-655,-745
+177,20,135
+-677,527,-582
+562,-591,810
+-725,487,-566
+-676,-729,744
+695,664,-510
+-599,-663,-763
+551,-622,-262
+-707,549,456
+631,756,-530
+-706,-601,686
+-638,567,415
+-480,-591,-682
+564,-803,-306
+-561,510,377
+530,-760,-396
+170,-156,-5
+
+--- scanner 6 ---
+70,-153,-116
+823,-780,467
+-428,-886,547
+-784,264,367
+-746,384,336
+917,352,819
+-362,-779,548
+-437,-518,-418
+850,474,816
+489,421,-516
+706,-590,-600
+670,-523,-575
+769,-585,-563
+-787,248,448
+769,-792,536
+-426,-867,418
+-763,498,-449
+505,470,-357
+-635,-520,-504
+60,8,77
+879,-854,614
+489,583,-406
+-543,-530,-503
+-744,491,-470
+-571,495,-377
+856,368,801
+
+--- scanner 7 ---
+-816,-494,765
+551,-688,-507
+664,410,435
+-531,464,-659
+-91,59,74
+-940,-528,-685
+484,-511,-502
+-113,-91,-60
+-972,-605,-759
+581,473,-782
+-800,755,444
+646,-686,895
+441,-556,-507
+714,-779,842
+-894,-578,-716
+-707,-614,769
+566,397,-654
+546,541,-587
+-801,-574,674
+-700,797,517
+781,388,522
+-612,378,-607
+718,327,395
+-641,795,445
+-570,422,-447
+685,-576,783
+
+--- scanner 8 ---
+683,432,-620
+648,388,326
+428,-449,737
+760,479,420
+-726,438,680
+428,411,-643
+-690,-771,-767
+735,-428,-659
+-761,-788,-777
+762,412,440
+635,480,-635
+794,-362,-603
+783,-437,-546
+-559,-547,411
+-710,356,690
+-615,-756,-760
+-761,439,-479
+366,-495,650
+-121,87,50
+-531,-537,502
+38,-53,47
+-838,386,559
+398,-491,785
+-537,-441,439
+-781,519,-567
+-756,402,-414
+
+--- scanner 9 ---
+16,20,38
+-613,-770,-662
+708,849,522
+799,-809,823
+-617,-793,-713
+-498,-465,324
+-527,-614,325
+-557,767,-441
+-535,610,807
+-570,740,-455
+-432,555,805
+349,843,-447
+567,-815,-695
+761,-809,-753
+649,-797,766
+570,861,594
+784,-758,808
+326,893,-504
+426,832,-403
+-437,-493,409
+587,820,497
+-483,712,806
+-109,77,-106
+748,-861,-694
+-458,691,-434
+-534,-877,-758
+
+--- scanner 10 ---
+-639,700,813
+733,-498,-443
+-864,487,-594
+-796,678,855
+-574,-478,-653
+549,-858,511
+452,-899,528
+-802,407,-710
+728,631,-683
+280,759,449
+-645,-785,574
+-494,-498,-741
+238,720,314
+-100,58,-138
+-173,-132,-72
+-773,627,813
+-885,333,-648
+-457,-503,-806
+592,765,-707
+223,771,299
+524,-887,390
+639,660,-803
+-653,-855,507
+716,-569,-453
+4,-129,49
+701,-644,-460
+-576,-665,484
+
+--- scanner 11 ---
+731,717,-760
+668,-387,-578
+-380,926,-955
+1,118,-6
+-380,-650,-917
+739,-544,-527
+-312,-655,378
+729,-547,-642
+-392,869,-805
+-374,-592,-723
+779,-363,361
+-431,911,-940
+-724,427,342
+-419,-559,457
+559,492,458
+27,-15,-183
+874,-481,357
+-575,428,371
+723,696,-937
+-396,-610,461
+598,609,448
+614,519,458
+-328,-591,-904
+883,-293,411
+-696,512,281
+712,641,-901
+
+--- scanner 12 ---
+-128,119,58
+818,-391,610
+-735,-368,-468
+-737,629,862
+650,486,-431
+377,-491,-459
+-595,-643,561
+740,-434,583
+672,642,-533
+754,454,442
+-693,834,-723
+758,457,575
+-638,-648,516
+-720,-496,-392
+-781,570,861
+-785,644,-718
+416,-703,-417
+-761,818,-651
+-855,750,871
+-18,-14,-89
+458,-543,-373
+692,385,453
+504,529,-527
+-700,-563,-536
+786,-465,533
+-705,-643,693
+
+--- scanner 13 ---
+799,-448,728
+-781,-606,-858
+-598,-623,566
+-603,-446,633
+-855,-529,-890
+-603,-578,523
+578,-560,-719
+746,-355,796
+401,551,543
+406,614,580
+-812,-556,-812
+687,-558,767
+608,551,-556
+596,497,-487
+-552,464,-821
+-605,831,496
+339,650,555
+-536,403,-839
+-767,831,386
+673,-520,-625
+-166,56,-81
+-658,470,-836
+-654,815,337
+670,441,-634
+669,-640,-734
+-107,152,79
+
+--- scanner 14 ---
+572,547,-573
+-659,601,-306
+-55,-17,-88
+855,-838,-532
+662,-712,809
+64,-82,103
+642,-645,665
+814,337,879
+795,-763,-468
+-604,459,409
+760,377,796
+-722,-457,-330
+-599,-443,-433
+-516,-665,828
+584,524,-534
+-545,387,411
+804,-849,-560
+677,-840,733
+-620,544,-450
+-704,386,451
+-718,-440,-334
+-435,-717,742
+877,464,818
+-474,-505,784
+570,565,-740
+-638,575,-518
+
+--- scanner 15 ---
+25,3,138
+668,345,-425
+566,-777,422
+800,546,390
+751,513,371
+-528,311,-610
+413,-799,449
+-826,-657,-821
+826,405,-436
+-510,382,590
+-876,-642,-818
+-550,269,-453
+-601,311,-476
+547,-339,-463
+552,-385,-517
+698,296,-450
+-740,-664,-755
+549,-846,550
+697,664,367
+-941,-796,935
+-110,-62,24
+-884,-817,715
+550,-500,-487
+-863,-710,801
+-580,368,636
+-590,296,676
+
+--- scanner 16 ---
+-439,-831,824
+-779,377,-635
+-555,704,405
+406,-895,656
+725,-844,-276
+-594,-569,-449
+709,-826,-337
+494,381,-704
+656,491,-704
+-735,778,395
+-613,-556,-328
+449,-817,683
+-25,68,-10
+-370,-769,813
+663,561,750
+658,628,573
+-614,660,404
+-853,470,-705
+480,-863,733
+607,332,-688
+-565,-609,-299
+-862,411,-632
+603,-841,-343
+658,518,705
+-442,-835,691
+-129,-31,97
+
+--- scanner 17 ---
+701,-567,-678
+-856,-402,-936
+-819,733,344
+733,453,-744
+-771,775,374
+-856,-524,270
+-684,729,312
+569,862,740
+-445,677,-613
+573,-570,-760
+319,-421,720
+625,796,681
+-473,783,-591
+-826,-560,397
+275,-321,716
+707,-712,-747
+726,468,-669
+-870,-525,-833
+-767,-622,303
+480,-348,692
+-536,687,-585
+-873,-406,-932
+-86,62,-41
+743,436,-815
+512,787,729
+
+--- scanner 18 ---
+824,596,800
+-375,-387,825
+742,692,-620
+-595,-828,-727
+-317,-417,904
+-444,436,525
+593,-719,531
+83,56,92
+-667,690,-647
+-417,-496,866
+787,697,-577
+-598,-745,-761
+441,-580,-478
+442,-521,-434
+-668,-819,-668
+610,692,-510
+432,-701,-360
+-504,367,620
+-444,529,688
+-667,528,-757
+24,-92,-26
+508,-656,667
+-651,641,-806
+468,-795,599
+951,619,820
+766,664,885
+
+--- scanner 19 ---
+572,-510,-553
+-15,68,35
+-141,1,151
+-776,814,752
+-443,645,-424
+-420,-729,496
+641,-658,875
+468,-538,-454
+-485,545,-351
+-600,-460,-306
+399,650,478
+-862,733,700
+517,-571,-466
+296,527,492
+-639,-576,-224
+300,531,475
+-818,775,540
+416,629,-509
+619,-552,903
+-445,704,-352
+272,590,-566
+647,-562,812
+-656,-400,-219
+-470,-535,533
+-438,-635,443
+484,611,-540
+
+--- scanner 20 ---
+-770,599,586
+683,836,701
+-556,-879,621
+-662,582,636
+612,796,-777
+799,-663,-898
+-652,-884,499
+542,826,-745
+569,778,813
+673,-742,-862
+537,-779,665
+-725,406,578
+576,-868,615
+-410,-392,-888
+761,-730,-884
+-679,674,-590
+562,-943,717
+436,830,-772
+-534,-403,-830
+72,-129,67
+108,1,-113
+-455,-920,548
+-632,731,-469
+-688,645,-337
+-550,-386,-896
+673,785,779
+
+--- scanner 21 ---
+-661,-356,-544
+912,680,752
+-722,-409,263
+-662,-480,-390
+-473,648,-554
+731,750,711
+648,-303,-658
+-652,-531,-491
+830,-518,773
+645,-375,-466
+879,441,-445
+-559,823,338
+759,410,-483
+862,-729,816
+-374,507,-530
+-599,845,329
+-726,-462,310
+880,-602,809
+-722,834,307
+895,522,-442
+910,674,720
+-668,-345,354
+-20,-25,-124
+-413,613,-578
+75,88,4
+652,-396,-485
+
+--- scanner 22 ---
+747,-397,-696
+-259,-670,-571
+-603,633,778
+-274,-732,715
+442,867,939
+-580,823,701
+-534,852,-485
+679,-384,923
+-513,753,709
+-232,-710,558
+854,-376,-610
+-331,-680,-531
+-274,-659,581
+694,-434,926
+833,-319,-830
+701,-520,860
+727,479,-630
+907,558,-616
+-546,799,-681
+395,889,769
+845,474,-523
+20,-79,57
+101,89,5
+559,852,799
+-345,-750,-485
+-492,867,-609
+
+--- scanner 23 ---
+530,607,-919
+-568,473,664
+55,-137,-99
+-457,319,-779
+492,-777,409
+-608,444,814
+-472,-950,-867
+425,-700,-843
+471,732,408
+-843,-846,837
+-360,-814,-826
+-555,492,785
+581,597,-818
+406,606,-765
+378,658,478
+412,741,481
+446,-707,-824
+-391,-934,-864
+382,-615,409
+-840,-724,770
+-598,418,-755
+-825,-830,776
+353,-703,-651
+-563,358,-731
+333,-728,425
+
+--- scanner 24 ---
+-37,35,-48
+836,582,-476
+822,520,676
+597,-887,463
+-280,-388,443
+742,483,-504
+760,636,756
+-474,-568,-719
+754,-929,485
+-714,801,-463
+711,516,-559
+731,-887,536
+782,-853,-733
+-265,-373,392
+-634,633,398
+-681,729,503
+757,-902,-763
+-770,609,532
+843,574,830
+94,-88,14
+771,-793,-891
+-550,-427,-700
+-322,-523,404
+-495,-391,-711
+-669,636,-539
+-727,661,-560
+
+--- scanner 25 ---
+-562,-274,-592
+-169,152,-4
+-575,520,-828
+-459,-276,-537
+560,-584,-802
+-525,-757,483
+216,761,734
+587,541,-609
+622,-315,815
+497,610,-729
+-717,459,544
+772,-258,827
+258,738,683
+258,604,756
+-510,-275,-694
+-458,380,-843
+-710,393,458
+-695,396,408
+-34,8,98
+681,-559,-831
+543,-487,-843
+-464,-672,511
+-554,-756,632
+564,618,-799
+757,-273,776
+-411,550,-865
+
+--- scanner 26 ---
+594,573,-519
+-440,825,-580
+682,-603,463
+540,-658,-252
+-546,-834,-618
+-536,327,553
+57,-24,115
+-505,787,-628
+-558,-769,-421
+804,815,933
+677,878,872
+755,-703,505
+566,-637,-464
+-661,-587,447
+576,571,-686
+-573,-585,481
+764,761,850
+754,-544,465
+-422,-805,-494
+597,-619,-396
+617,585,-480
+-43,68,-5
+-522,847,-506
+-736,364,530
+-733,-581,430
+-632,377,621
+
+--- scanner 27 ---
+710,798,653
+-745,352,513
+-927,692,-562
+-942,-757,-894
+481,-661,637
+-838,-386,810
+-168,-76,-145
+-716,-389,743
+-124,46,-8
+-963,547,-552
+569,662,-427
+355,673,-369
+-806,-869,-853
+-926,671,-666
+500,-674,758
+452,-621,787
+751,841,731
+-926,-838,-891
+-681,444,493
+-822,-404,749
+-864,361,486
+327,-772,-806
+426,-631,-782
+360,688,-386
+366,-666,-758
+772,705,659
+
+--- scanner 28 ---
+-648,648,-709
+-542,-550,535
+771,449,693
+672,456,769
+702,-310,-612
+-117,25,-97
+659,470,742
+-522,-413,-805
+731,-309,-463
+-574,-556,727
+616,677,-768
+-609,730,-617
+797,-790,557
+612,728,-791
+-597,861,419
+695,773,-875
+694,-792,612
+-637,794,504
+792,-394,-491
+-32,148,17
+-720,663,-565
+-410,-281,-789
+-689,894,537
+-506,-331,-640
+-489,-424,651
+746,-791,714
+
+--- scanner 29 ---
+295,-675,611
+-385,714,686
+781,901,-278
+-712,-652,496
+-467,738,727
+629,795,754
+429,-696,749
+-336,510,-431
+17,-19,12
+65,131,149
+645,919,668
+709,922,-414
+-613,742,692
+-512,-777,-427
+-732,-777,621
+572,922,732
+543,-531,-675
+-502,-813,-572
+-319,505,-446
+536,-714,-758
+339,-662,792
+563,-595,-767
+703,860,-321
+-777,-664,580
+-616,-776,-448
+-377,719,-457
+
+--- scanner 30 ---
+250,687,-614
+-588,536,800
+-175,148,-171
+379,660,-585
+-157,-10,-10
+-585,-712,773
+629,-588,-789
+-506,-425,-711
+-571,-840,664
+236,-765,556
+-611,587,758
+-21,15,-188
+455,496,687
+288,741,-662
+541,576,773
+232,-711,405
+-560,-682,724
+-499,881,-703
+255,-814,523
+-520,727,-649
+501,566,701
+-582,807,-765
+-631,-508,-645
+694,-557,-754
+-745,514,758
+596,-588,-632
+-600,-453,-612
+
+--- scanner 31 ---
+625,-736,-620
+-599,-557,877
+-827,629,-456
+-682,563,543
+894,-512,638
+504,-661,-646
+-677,-757,890
+-692,566,428
+466,551,-556
+84,22,78
+-677,-895,-740
+900,-585,659
+-621,723,479
+427,460,818
+927,-573,750
+375,519,805
+421,518,624
+-666,-896,-531
+-836,817,-510
+-589,-889,-689
+10,-134,-93
+-606,-643,785
+443,500,-560
+482,-784,-562
+359,455,-477
+-732,747,-460
+
+--- scanner 32 ---
+-747,-436,-842
+729,-654,591
+-514,-782,535
+-849,537,719
+654,-393,-375
+-586,-821,688
+-911,438,-549
+-786,-558,-874
+304,373,491
+-890,356,649
+347,616,-427
+663,-761,590
+-954,406,-760
+-947,388,-633
+345,509,379
+-447,-786,617
+665,-742,461
+328,623,-406
+456,-395,-461
+548,-405,-460
+307,389,410
+-858,358,643
+-773,-302,-847
+-54,-4,19
+520,620,-334
+
+--- scanner 33 ---
+666,261,-636
+623,-361,427
+-931,538,-515
+-942,524,660
+-126,-99,-69
+-408,-920,565
+-414,-912,705
+-901,597,559
+687,395,-498
+-425,-854,581
+577,562,345
+-747,-501,-520
+384,554,390
+-723,-419,-561
+709,-493,483
+655,-811,-667
+653,305,-455
+768,-766,-626
+652,-614,436
+-928,611,-579
+-906,475,463
+560,612,453
+1,-55,105
+-751,-647,-555
+643,-746,-751
+-804,595,-493
+
+--- scanner 34 ---
+-553,-629,693
+844,-693,-278
+-579,-390,-633
+569,260,-620
+425,774,376
+794,-708,-275
+476,759,391
+518,218,-643
+-700,294,-671
+-858,354,-660
+-18,-135,69
+708,-715,-341
+-730,245,-646
+-514,-639,810
+-582,-551,-609
+-584,-436,-579
+-678,756,606
+769,-523,875
+437,624,433
+-667,720,661
+620,-552,874
+496,260,-486
+-686,579,585
+-569,-639,783
+741,-462,790
diff --git a/2021/19/input.txr b/2021/19/input.txr
new file mode 100644
index 0000000..adbc19f
--- /dev/null
+++ b/2021/19/input.txr
@@ -0,0 +1,9 @@
+@(collect)
+--- scanner @s ---
+@ (collect :vars (p))
+@x,@y,@z
+@ (bind p @(vec (toint x) (toint y) (toint z)))
+@ (until)
+
+@ (end)
+@(end)
diff --git a/2021/19/scratch b/2021/19/scratch
new file mode 100644
index 0000000..af3a476
--- /dev/null
+++ b/2021/19/scratch
@@ -0,0 +1,4 @@
+for each point p0 in vec0
+ for point in p1 in vec1
+ translate vec1 by (p1 - p0)
+ intersect and count
diff --git a/2021/19/testinput b/2021/19/testinput
new file mode 100644
index 0000000..4e496e9
--- /dev/null
+++ b/2021/19/testinput
@@ -0,0 +1,136 @@
+--- scanner 0 ---
+404,-588,-901
+528,-643,409
+-838,591,734
+390,-675,-793
+-537,-823,-458
+-485,-357,347
+-345,-311,381
+-661,-816,-575
+-876,649,763
+-618,-824,-621
+553,345,-567
+474,580,667
+-447,-329,318
+-584,868,-557
+544,-627,-890
+564,392,-477
+455,729,728
+-892,524,684
+-689,845,-530
+423,-701,434
+7,-33,-71
+630,319,-379
+443,580,662
+-789,900,-551
+459,-707,401
+
+--- scanner 1 ---
+686,422,578
+605,423,415
+515,917,-361
+-336,658,858
+95,138,22
+-476,619,847
+-340,-569,-846
+567,-361,727
+-460,603,-452
+669,-402,600
+729,430,532
+-500,-761,534
+-322,571,750
+-466,-666,-811
+-429,-592,574
+-355,545,-477
+703,-491,-529
+-328,-685,520
+413,935,-424
+-391,539,-444
+586,-435,557
+-364,-763,-893
+807,-499,-711
+755,-354,-619
+553,889,-390
+
+--- scanner 2 ---
+649,640,665
+682,-795,504
+-784,533,-524
+-644,584,-595
+-588,-843,648
+-30,6,44
+-674,560,763
+500,723,-460
+609,671,-379
+-555,-800,653
+-675,-892,-343
+697,-426,-610
+578,704,681
+493,664,-388
+-671,-858,530
+-667,343,800
+571,-461,-707
+-138,-166,112
+-889,563,-600
+646,-828,498
+640,759,510
+-630,509,768
+-681,-892,-333
+673,-379,-804
+-742,-814,-386
+577,-820,562
+
+--- scanner 3 ---
+-589,542,597
+605,-692,669
+-500,565,-823
+-660,373,557
+-458,-679,-417
+-488,449,543
+-626,468,-788
+338,-750,-386
+528,-832,-391
+562,-778,733
+-938,-730,414
+543,643,-506
+-524,371,-870
+407,773,750
+-104,29,83
+378,-903,-323
+-778,-728,485
+426,699,580
+-438,-605,-362
+-469,-447,-387
+509,732,623
+647,635,-688
+-868,-804,481
+614,-800,639
+595,780,-596
+
+--- scanner 4 ---
+727,592,562
+-293,-554,779
+441,611,-461
+-714,465,-776
+-743,427,-804
+-660,-479,-426
+832,-632,460
+927,-485,-438
+408,393,-506
+466,436,-512
+110,16,151
+-258,-428,682
+-393,719,612
+-211,-452,876
+808,-476,-593
+-575,615,604
+-485,667,467
+-680,325,-822
+-627,-443,-432
+872,-547,-609
+833,512,582
+807,604,487
+839,-516,451
+891,-625,532
+-652,-548,-490
+30,-46,-14
diff --git a/2021/20/code.tl b/2021/20/code.tl
new file mode 100644
index 0000000..dcc4933
--- /dev/null
+++ b/2021/20/code.tl
@@ -0,0 +1,73 @@
+(defvarl h2b (relate ".#" #(0 1)))
+
+(defvarl b2h ".#")
+
+(defstruct ctx ()
+ alg
+ (hash (hash))
+ grid
+ (min-x 0) (min-y 0)
+ (max-x 0) (max-y 0)
+ toggle
+
+ (:postinit (me)
+ (if (nzerop [me.alg 0])
+ (set me.toggle 0))
+ (each ((line me.grid)
+ (y 0))
+ (each ((bit line)
+ (x 0))
+ (set [me.hash x..y] [h2b bit])
+ (upd me.max-x (max x))
+ (upd me.max-y (max y)))))
+
+ (:method lambda (me x y)
+ (or [me.hash x..y]
+ me.toggle
+ 0))
+
+ (:method lambda-set (me x y nv)
+ (set [me.hash x..y] nv)
+ (upd me.max-x (max x))
+ (upd me.min-x (min x))
+ (upd me.max-y (max y))
+ (upd me.min-y (min y)))
+
+ (:method print (me stream pretty-p)
+ (each ((y me.min-y..(succ me.max-y)))
+ (each ((x me.min-x..(succ me.max-x)))
+ (put-char [b2h [me x y]] stream))
+ (put-line : stream))))
+
+(defmeth ctx step (me)
+ (let ((nme (copy me)))
+ (set nme.hash (hash))
+ (each-prod ((y (pred me.min-y)..(ssucc me.max-y))
+ (x (pred me.min-x)..(ssucc me.max-x)))
+ (let* ((x- (pred x)) (x+ (succ x))
+ (y- (pred y)) (y+ (succ y))
+ (bits (flow (vec [me x- y-] [me x y-] [me x+ y-]
+ [me x- y] [me x y] [me x+ y]
+ [me x- y+] [me x y+] [me x+ y+])
+ (poly 2))))
+ (set [nme x y] [me.alg bits])))
+ (replace-struct me nme)
+ (upd me.toggle [iff true (op - 1)])
+ me))
+
+(defun read-input (: (name "input"))
+ (flow (file-get-lines name)
+ (match (@alg "" . @grid) @1
+ (new ctx
+ alg [mapcar h2b alg]
+ grid grid))))
+
+;; answers; 5291, 16665.
+(defun solve (steps : (name :))
+ (flow name
+ (read-input)
+ (dotimes (i steps @1)
+ (put-line `step @i`)
+ @1.(step))
+ .hash
+ (count-if plusp @1 cdr)))
diff --git a/2021/20/input b/2021/20/input
new file mode 100644
index 0000000..5ae298c
--- /dev/null
+++ b/2021/20/input
@@ -0,0 +1,102 @@
+#.#.###........##....#.......#..##.#.##...#..##...#..##.......##..##.#..####.#.#..#..#...#.##...##.####..###.#.###.#####...##.#.###..#..#.##...##..####...#..#.#.###....####.####.##.####.#..##.##...#####.##.#.##.#..##.##.##.###.#..##.#.##...###.###..###....#.########..##..#...#....###.####.#######..#.##.##...####.#.#.###.#..#.......#..##..##.##....####.##.#.#.##.#.#.#.##.#..##..##.#..####.#....##.#...#.##.#....#......#...##.##.#.#...#.#.#.#..#.##.#..##...##.#.#.##..###.##.#.###..#####.#...###..#.....#....#..
+
+..#.#...##.......#.####...##....##.###.####.##..###..#####......##.###.##.##.#...#....#####.#####.##
+.###.#####...##....#.##...#.###.#.#.####.......#.##.#.#.#.###..####.####.#...###.#.#.#.....###......
+#..##..#.##.#...#.##..#.##.#####.###.###....##.#...#...#.##.#..#..###.####..#..####.....#####.#.#..#
+.######........####.##.....####.###..###.####..#....##.###.#..#..####.#..##.###.#.#..#.#.###.##.##.#
+.#.##.#.#...#..#.#.###.###.###.###.########..#..#...######....###.#..##.#.##...###..#..#..#.#.##....
+#.#..##.#....#.#.#...#.....#..##.#.####.#.###.##.###.####.#.#.##.#..#.#.......#....#.#####...#..##.#
+.##....##.########.#####....##.#..##.#######.##.##.#...#..##.#.#####.....#...##..#.#.#.##.##....##..
+#.##.#.##..##..##.#......##.#.##..#.##..#.#..#.........#..#.#.##.##.#....##.##..#.##.##.#.##..##..#.
+.....#####.#........###.#.##.######....###..##.#..#.###..#..####.##..###.###.#.###..#..####.##......
+.#.#.######..##.#..##..##.#.......#....#..#.#####.#....#....####..##...##.#.....#.###...##.#.#....##
+..#####...#.##.#.##..#..#....#.###.#####.#.##..#...#....#...#.###...##....#####.#....#..#......##.#.
+.#.#.#..#..#.#.#.....#.###..#..##.#.......#...#..#..###.....#...#......#.#.####....#...#.#.....##.##
+.#.##.#..######..#...#######.###.#...#.#.##.....##.####...##.##.##.#...##.#.#....#.#.....#.#..#....#
+###.########..##.#.#...#.##..#.#.....#.##..###.#..#...#.#.####....#..##..#.#..##.#..#..#.....#.###..
+...######...#...##.#.#...###..##.###.####.....#.#.#...##..#.####.#.####...########..#.#......###..##
+##..####.####....##....#..#.##.###...#.####....##.....##......#.....#..#.##.###.##..##.....##..#...#
+#..##.######.#.#.#..#.#.###....###.#.#...#..###...##..###....###....#.###.#.#...#.###.#...##.##.#.#.
+.######.##.#.####.#..#...##.....##.##..#.#.#..##....#.####.#..#..##.#.#.#.......#...##...###.###.##.
+#.#.######.#.####.....#.#.##.#.####..#####.#.##.#..#.#..#####.####.##..##.#....#..#...#.##..###.###.
+###.###....####...#.###.#.####..###.#..###..#.##.#.##..##..#.####...#########.##.####.####...#.###..
+#.##..##..#.##.#.##.##..#.##..#####.#.###.#...##.#.##.###..##.#.##.#..####.####...###.#.#.#...####.#
+..####..########..#.#.#.#.###.#..#...###..###.#..#####.##.#....##.#..##.##......#..###.##..##...#..#
+.#..#...#..##..#..####.#.#.#.#...#.##...##...#########.##..#.###..##.###.....#.#...###...###.####..#
+.#.......#.##.#..###.#......#..###..#...##.###...#.#.#.###....####..##.##...##.####..#..#.#..#####.#
+#.#.#####..#.#.#######...###.###.##..#.#.#.#....#.###....#.#.#####.###..#..#........##.#.#.....#..##
+#.##...##...#..#########.###.....######.....##.#.#.##.###..#..#...####..##..#..#.#..#.#.####.#..#...
+..#.#..#..####.#.##.#...###.###.#.#..##..##.##.##.###.....#..##.###..##..#..#.......###...#.##...###
+.##.##.##.......#........#.##..#.###...##....###.##..#..#....##.##..####.##.#.####..#.#.#.#.#.#.#.##
+.#..#.#..####....##.##.#...###..##.#.#####.###.#.##..###.##...######.#.#...#...#..#.#.#.#..#..######
+.###.##..#..#..###...#.#.#...##..#...##...##.#.#####.##.#.######.##..#.#####.####.#.....#.##.###.#.#
+.###.######...#.####...#.#..#...##...###.###########.#.##.#######.##.##.###..###...#####...#.#..####
+.####...#.#...#..####.#.##...#.##..#..#..###.#.##..#.##..#...##.#...#########.#..#....##..#...##....
+.##.##.####.###...#####.#.##.#...###.###.#.#.#####.#..###.##.#..##.####.....#.....#.####.##.#.##.###
+###.....#.##...#.##....#...#.#.#.#..#..##.....###..##.###..#....#.....#####..########.#.###.##.#####
+..#.......#.#..#..#..##.#...#####..#..###.#..#.#.#...####.#.....####.#..###.#...##.####.##.#.#..#.#.
+#.###..###..#.####.#.####.####..#.##.#.....#...######..##..###..##..#.#####...##....#.##.#.##.##.###
+###..#...#########...####..#.###...####.#..#.###.....#.#....####....###.###...#.###.#..#...#.###..#.
+...####.#..#.##.###.#.#..#.##.#.####....##.##.#.#.#..#.##..#.#...#.##.###..###...#..#..#.#.#.##....#
+##.#.#...##...##.##.#.##..#......###..#..#....##.#.##.##.#####..##....###..###.#....##..##....#..###
+.#.#.##..##.#.........#..#..#.#.##..#.##...#.#.###.###.#####...#.###.##..###.#.##.#.#.......##....#.
+#..#.###.##.###.##...#.#...##..#.#.##..##..#..##..###....##..#...#####.....#.#.#####.#.#.##..##.##.#
+#..#.##..##......##.#.##.####...#..#..#..##..#.##.#######.##.#....##..##.##.##..###.#...####.#.##..#
+#.....###.####..#.#####.#.###.##....####..#.##..#....#####..###.#.#.#.###...#.#.#.#.##...##.####.##.
+#..#.#..#..#.#...#.#.#...#.#.##......#..###.##.#.###..###...#.#..##..#....#.####..#.#####.######....
+#...#.#..#####.##..####..#.#####.....##...#..####.##..........#.#.....##.##.#.#.####.###...#......#.
+###.######.####.##.###.#....#####.....###.##..##..##.######.#.#...##.##.##.###...##..####..##..#.#.#
+##...####..##...#..#.#.##..###.##..#.####...#..##.#.#.....######..##..#..#.##...##.##.#....#########
+..#...###..#.##.#...###.##.#.########.....#..#...#.#.#....#..######.##.#####.#.##....###.#......##.#
+#.###.#..#.....######.#..#..###.#...####.##...####.#...#...####.##..###..#.##.#######....##.#..#####
+##..##...#..##.#.#.....#.#.#.###.####.##.###..#..####...#########.#.#.##...#.#..###.##.#.###.#.##..#
+.#...#....###.#.###..####..#.##..#..##..##......#.#..##....#...##.#...#.#.....###.#...#.##....##....
+.#.............#####.....#.###.###.#.######.......#.#.#...####......#...#..####...##.##.###....#.###
+....##########.#.#..####.......#.#......#####.##.##....#..#.#.###..#...#..#..##..#..##.#..#..#.....#
+......#####..####.#..##.#.#.##..#.###......#...##..####....#...##..#..#.####.##.#...##.###.#..###...
+##......#..#.###.#....#...#..#..##.###..#.##..####.#.##..##..##..##.#....#.##.##.#..........####.#.#
+###....##.#.##.##.#####.##.#.##..##.##.#..###...#..#..##.....##..#.#....##...####.##....#.##########
+#.########..####...##.#...#..###....#...####..##.##.#..###.....#.#.#.#.#.##.##..#....#..##.###..#.##
+.....##.###...##...###.##.#####.##..####..####........#...###.####...#..####......#.....###...###.#.
+#.#.##.#.....#...###..##..#....##.########.#..#####.##.####..#####.##..###.#.##..##.###.#.#..##...##
+####.##.##.##.##..#.##.#.##..###....#.######..#.##.##.....#..#.#.##.##.#...#####.#.#.###..##.#.#.#.#
+#...##..#.#####.#..###...#..#.######.##..######...#.#.#...#...#.....#..#.##.###...###.######.##.#..#
+.........#...#.#.#.##..##......##.##.#.####.#....##..#.#.#.#..##..#.#....##...##.#####.#..#.#.#..###
+####..##.#.##.#..#..###..####.####.#.#..#.#....##.....##.#.#.#####..#...##.#.##.#.#...##.#.###...###
+.#..###.#.##.#####.....##.#..#..#.#####.#.#.#.####...#....#.......##..#.###.##..#.##.##..#..##.#####
+.##.......##.#.#.#.####....##..###.#..###..#.....#.##.#....##.#......#..##.##.##..##.###.####.#.....
+#######...#####...#...#.#.#####..##.###..#.#.#..###.#.....#####.#....##.#...####.###..#....##.#..###
+..#....#.#.#..#...#...###..#.######.##...###.##....##.#..#.#.#...####.#....####.#.###....######.#...
+.##...#....###..#.##..###...#.####.#.#####..#.....##.#....#.####.#..######.##..#.##.##...##..##.##..
+###.#..##.##.###.#.......#.#......###.#.##.###....##..####..#.#.#.##..###...##..##.##..#.#######...#
+...##.##..##.###...#..##.##.#..#..#.#..####.#.....###..####.#.##.###...##.##.####.#.#..#####.##.....
+..##.##.##..##......#..##.#.####.##.#.##.....##.##.####..#..###.###...#.#....#.#.###.##......###.##.
+##..##.#...#.#.##.....#.#..###..#.#..........#.#####......#...##..#..#..#.#....##...########.####...
+####...##.##.#.#.#.#.#..#######..#..#####..##..##.#.#.##...###...#..####.###.###.#....###.#...#.#.#.
+##..#.#.#####.###.###.###...##..#..#.#..##.#..#.#..##....#....###.####.#..#.#.##.##...###.###..###.#
+#.##..#...#....###...#.##.##..###..##............##....#.##...#.##.#.#..#####...#...#..#.#....##.#..
+####.#..#.##.......###.##.....#.#.##.#......##.#.#.###.#..####.#.......####..##..##.##.####....#.###
+.##.#.###.##.#####..##.#.#...#.####.##.##.#..#..#....#..####.#.###...#....##...#.##.#.###.....##...#
+.#...#.##.######.#.###.#....#.#..#.#.#.#.#...#.#.....#....##...#...##..###.#..#...#.#..####.#.#..#..
+..##...##....#..#...#.#.####.####....###...#.#...#####...#..##..##..#.#####...##..##..##......#.....
+.#.#.....####....#####.#.######.#..#####.#..#..####...#.#.###..#..##....#....##...#.######.#.#.....#
+###..###.#.##..#.####.#.##########.#.####..#...#.#.#...#.##...#.##..#..#..#...#.....#....#..####..##
+.#..#.#.##...##.###.##.#####....####...##.##.#..#.#.#..##.###.#...###.#.####.###########.#...#...##.
+##.#...#..###..#.#...#.##.##....#.#.##.#####..#....#.###..#.####.###..##..##..#...#.#..#.........###
+.......#...#.##.###..#.#.#...#........#.#.##.##.####..#.#..#..##..#....####.###........#...##.###...
+..#####...#.###...##.#.#.##...#...#####.##.###.#.#.####.#....##...#..####..#.#.####.....#.####...###
+#.###.#.......###..##.#..#.###.###.####.#....#..#..#.##.####..##..#.#..#...##.##.#..###....#####....
+......##..##.#.###.###.....#.##.#.#.##.######..#..######..#..#...#..#....#..#.##.####..#.#..#....#.#
+.#..####..####.#..##.###.####....#..#.....##.##.#..##..###..####.##.##.#...###...#.#.####..##.#....#
+.#....#.###.###.....##....#...#..#....##....#...#.######..##.........######.####..#.#..#..##....##.#
+.#####.##....###....###...#.##...#...#...##..##.#.#.###.##..###.#.#.#.###.#######..#....#.###..##...
+..##...#.###.#.#..#.#.......#..##.###.##..#..####..#...#...###....#.#...#...#.#...###.##...##.##.#..
+..#....#####..###.##.##.##...##..#.#.#.....##..##..##..###..#...###.###.#.#.####.##.###..#..####.##.
+.#.#...##.##..#...#.#....##.##.##.###..#.#.##.##......########....##.#.#.#....##....##.......#.#.#..
+#.#.##.#.####.#...##.#..##.....#####...##.#.##.#.##.##.####..##.#...#.#######.##..#....##..#........
+###.....#........##......##..###.##.#...###..#.#..#.###..#..##.##.#..#.#...#.#.##.#.###.####.##....#
+###.#..#..#..##.......##.###.###.......####....#..##..#...#..#####.....####.###..#.#..####...#.#...#
+.#...##.###.#######..#.#.####.#.....#.###.#....#.....#...######.#.#.#.#.....###..##..##..#####....##
+#.####.#..#...#.######.#.#.#....####.#######.#..###.#...####..#..#.....###.#....#.#.#.#..#.####..###
+.##..#..#..###..#..#.###....#....#.....##...#..#.#########..###########..#.#####..##.#.####......###
+##.###....##....##.#.##.##.##.......######.#.#.###.###.#####.#..##.##...####..##.######.####.#.....#
diff --git a/2021/20/testinput b/2021/20/testinput
new file mode 100644
index 0000000..8fa4bd4
--- /dev/null
+++ b/2021/20/testinput
@@ -0,0 +1,7 @@
+..#.#..#####.#.#.#.###.##.....###.##.#..###.####..#####..#....#..#..##..###..######.###...####..#..#####..##..#.#####...##.#.#..#.##..#.#......#.###.######.###.####...#.##.##..#..#..#####.....#.#....###..#.##......#.....#..#..#..##..#...##.######.####.####.#.#...#.......#..#.#.#...####.##.#......#..#...##.#.##..#...##.#.##..###.#......#.#.......#.#.#.####.###.##...#.....####.#..#..#.##.#....##..#.####....##...##..#...#......#.#.......#.......##..####..#...#.#.#...##..#.#..###..#####........#..####......#..#
+
+#..#.
+#....
+##..#
+..#..
+..###
diff --git a/2021/21/code.tl b/2021/21/code.tl
new file mode 100644
index 0000000..3622b02
--- /dev/null
+++ b/2021/21/code.tl
@@ -0,0 +1,52 @@
+(defstruct player ()
+ num
+ pos
+ (val 0))
+
+(defun read-input (: (name "input"))
+ (flow (file-get-lines name)
+ (keep-matches (`Player @num starting position: @pos` @1)
+ (new player num (toint num) pos (pred (toint pos))))))
+
+(defun counter (start)
+ (lambda () (pinc start)))
+
+(defun solve-one (: (name :))
+ (let ((count 0)
+ (die (counter 1)))
+ (buildn
+ (pend (read-input name))
+ (whilet ((p (del)))
+ (inc count)
+ (upd p.pos (+ [die] [die] [die]) (mod @1 10))
+ (if (>= (inc p.val (succ p.pos)) 1000)
+ (return (* count 3 (del).val)))
+ (add p)))))
+
+(defstruct game
+ players)
+
+(defun quantum-turn (ga)
+
+(defun solve-two (: (name :))
+ (let ((ga (new game players (read-input name))))
+ (
+
+
+ (die (counter 1))
+ (player-stream (repeat (read-input name))))
+ (each ((p player-stream))
+ (let ((npos (mod (+ p.pos [die die die] 10)))
+ (nval (
+ (if (>= npos 21))
+ ((
+
+
+ (buildn
+ (pend (read-input name))
+ (whilet ((p (del)))
+ (inc count)
+ (upd p.pos (+ [die] [die] [die]) (mod @1 10))
+ (if (>= (inc p.val (succ p.pos)) 21)
+ (return p))
+ (add p)))))
diff --git a/2021/21/input b/2021/21/input
new file mode 100644
index 0000000..9e88c73
--- /dev/null
+++ b/2021/21/input
@@ -0,0 +1,2 @@
+Player 1 starting position: 8
+Player 2 starting position: 7
diff --git a/2021/21/testinput b/2021/21/testinput
new file mode 100644
index 0000000..3f69194
--- /dev/null
+++ b/2021/21/testinput
@@ -0,0 +1,2 @@
+Player 1 starting position: 4
+Player 2 starting position: 8