summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Pickering <alex@cogarr.net>2025-02-07 12:49:48 -0600
committerAlex Pickering <alex@cogarr.net>2025-02-07 12:49:48 -0600
commit3555be54c2abb8d5ece008a60dbdfbde0ffbddd7 (patch)
tree278876284d07118ecdea5c48cb6453f3122887f0
downloadadvent_of_code_2022-3555be54c2abb8d5ece008a60dbdfbde0ffbddd7.tar.gz
advent_of_code_2022-3555be54c2abb8d5ece008a60dbdfbde0ffbddd7.tar.bz2
advent_of_code_2022-3555be54c2abb8d5ece008a60dbdfbde0ffbddd7.zip
inital commitHEADmaster
-rw-r--r--01/1.lua10
-rw-r--r--01/2.lua10
-rw-r--r--01/example.txt14
-rwxr-xr-x01/ext.lua62
-rw-r--r--01/input.txt2252
-rw-r--r--02/1.lua21
-rw-r--r--02/2.lua21
-rw-r--r--02/example.txt3
-rwxr-xr-x02/ext.lua62
-rw-r--r--02/input.txt2500
-rw-r--r--03/1.lua26
-rw-r--r--03/2.lua33
-rw-r--r--03/example.txt6
-rwxr-xr-x03/ext.lua62
-rw-r--r--03/input.txt300
-rw-r--r--04/1.lua11
-rw-r--r--04/2.lua16
-rwxr-xr-x04/ext.lua62
-rw-r--r--04/input.txt1000
-rw-r--r--04/sample.txt6
-rw-r--r--05/1.lua29
-rw-r--r--05/2.lua38
-rwxr-xr-x05/ext.lua62
-rw-r--r--05/input.txt512
-rw-r--r--05/sample.txt9
-rw-r--r--06/1.lua28
-rw-r--r--06/2.lua0
-rwxr-xr-x06/ext.lua62
-rwxr-xr-x07/1.lua53
-rw-r--r--07/2.lua57
-rwxr-xr-x07/ext.lua62
-rw-r--r--07/input.txt942
-rw-r--r--07/sample.txt23
-rw-r--r--08/1.lua49
-rw-r--r--08/2.lua68
-rwxr-xr-x08/ext.lua62
-rw-r--r--08/input.txt99
-rw-r--r--08/sample.txt5
-rw-r--r--09/1.lua48
-rwxr-xr-x09/ext.lua62
-rw-r--r--09/input.txt2000
-rw-r--r--09/sample.txt8
-rw-r--r--09/sample2.txt8
-rw-r--r--10/1.lua41
-rw-r--r--10/2.lua46
-rwxr-xr-x10/ext.lua62
-rw-r--r--10/input.txt137
-rw-r--r--10/sample.txt146
-rw-r--r--11/1.lua49
-rw-r--r--11/2.lua54
-rwxr-xr-x11/ext.lua62
-rwxr-xr-x11/input.txt55
-rw-r--r--11/sample.txt27
-rw-r--r--12/1.lua39
-rw-r--r--12/2.lua42
-rwxr-xr-x12/ext.lua62
-rw-r--r--12/input.txt41
-rw-r--r--12/sample.txt5
-rw-r--r--13/1.lua43
-rw-r--r--13/2.lua64
-rwxr-xr-x13/ext.lua62
-rw-r--r--13/input.txt449
-rw-r--r--13/sample.txt23
-rw-r--r--14/1.lua83
-rw-r--r--14/2.lua87
-rwxr-xr-x14/ext.lua62
-rw-r--r--14/input.txt148
-rw-r--r--14/sample.txt2
-rwxr-xr-x15/ext.lua62
-rw-r--r--19/1.lua129
-rw-r--r--19/1_2.lua172
-rwxr-xr-x19/ext.lua62
-rw-r--r--19/input.txt3
-rw-r--r--19/input2.txt30
-rw-r--r--19/sample.txt2
-rw-r--r--22/1.lua144
-rw-r--r--22/2.lua358
-rwxr-xr-x22/ext.lua62
-rw-r--r--22/input.txt202
-rw-r--r--22/input_plan.txt207
-rw-r--r--22/output.txt15014
-rw-r--r--22/sample.txt14
-rw-r--r--23/1.lua173
-rwxr-xr-x23/ext.lua62
-rw-r--r--23/input.txt72
-rw-r--r--23/sample.txt7
-rw-r--r--23/sample2.txt6
-rw-r--r--24/1.lua196
-rw-r--r--24/1_1.lua192
-rw-r--r--24/2.lua289
-rwxr-xr-x24/ext.lua62
-rw-r--r--24/input.txt27
-rw-r--r--24/sample.txt7
-rw-r--r--24/sample2.txt6
-rw-r--r--24/scratch7
-rw-r--r--25/1.lua74
-rwxr-xr-x25/ext.lua62
-rw-r--r--25/input.txt119
-rw-r--r--25/sample.txt13
99 files changed, 30489 insertions, 0 deletions
diff --git a/01/1.lua b/01/1.lua
new file mode 100644
index 0000000..52cb7f2
--- /dev/null
+++ b/01/1.lua
@@ -0,0 +1,10 @@
+local max, calories = 0, {0}
+for line in io.lines() do
+ if line == "" then
+ calories[#calories + 1] = 0
+ else
+ calories[#calories] = calories[#calories] + tonumber(line)
+ end
+end
+table.sort(calories)
+print(calories[#calories])
diff --git a/01/2.lua b/01/2.lua
new file mode 100644
index 0000000..304d13a
--- /dev/null
+++ b/01/2.lua
@@ -0,0 +1,10 @@
+local calories = {0}
+for line in io.lines() do
+ if line == "" then
+ calories[#calories + 1] = 0
+ else
+ calories[#calories] = calories[#calories] + tonumber(line)
+ end
+end
+table.sort(calories, function(a,b) return a > b end)
+print(calories[1] + calories[2] + calories[3])
diff --git a/01/example.txt b/01/example.txt
new file mode 100644
index 0000000..2094f91
--- /dev/null
+++ b/01/example.txt
@@ -0,0 +1,14 @@
+1000
+2000
+3000
+
+4000
+
+5000
+6000
+
+7000
+8000
+9000
+
+10000
diff --git a/01/ext.lua b/01/ext.lua
new file mode 100755
index 0000000..4a58a7e
--- /dev/null
+++ b/01/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:append(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:append(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/01/input.txt b/01/input.txt
new file mode 100644
index 0000000..f9c8e4b
--- /dev/null
+++ b/01/input.txt
@@ -0,0 +1,2252 @@
+2494
+8013
+1055
+5425
+9104
+10665
+
+10642
+10677
+10300
+7374
+9085
+8508
+7569
+6214
+
+5300
+5960
+8252
+5852
+4308
+9991
+6367
+
+1361
+5356
+6114
+3379
+5996
+3822
+3785
+1622
+1143
+6009
+2211
+4951
+3093
+6395
+
+4892
+6648
+3022
+6063
+5436
+2174
+4264
+2004
+6444
+2926
+2651
+2749
+
+17121
+17879
+11056
+15642
+
+3926
+6751
+2643
+7882
+4006
+1351
+4912
+2735
+2985
+4015
+
+3043
+6923
+10352
+9998
+2470
+7346
+1077
+3024
+
+21632
+34735
+
+8525
+1982
+9285
+4188
+7017
+6666
+6538
+
+7019
+2696
+2707
+3639
+3674
+3642
+4837
+3804
+
+3570
+8191
+6054
+8727
+7323
+3522
+
+1442
+5794
+3774
+2398
+5615
+5786
+1832
+2234
+7906
+4799
+
+12978
+17621
+9788
+9237
+
+3006
+2799
+5627
+2478
+3159
+6430
+3843
+1469
+2006
+4131
+2269
+6201
+3593
+1423
+
+30560
+
+5281
+3850
+2894
+4056
+4341
+4117
+8216
+2700
+1327
+2379
+
+1597
+7217
+1003
+2555
+4820
+2881
+4051
+4550
+2457
+6518
+5480
+3044
+
+9465
+4325
+5593
+5606
+9317
+1026
+3707
+9456
+7801
+
+6217
+7814
+3159
+3866
+1035
+4302
+1498
+1160
+1510
+4650
+
+13306
+15884
+9699
+11206
+
+24775
+21119
+12643
+
+12737
+10893
+3450
+10732
+8670
+7597
+
+35714
+
+3380
+3513
+6559
+6891
+7767
+5311
+7086
+5345
+3498
+3091
+2516
+
+11565
+12877
+13416
+10568
+16033
+
+1380
+4192
+5815
+6230
+2434
+2443
+3682
+5568
+6134
+3316
+5878
+4493
+3857
+2110
+
+4341
+2469
+5606
+4268
+3525
+5555
+5771
+2284
+1921
+3279
+1901
+5991
+2868
+4866
+2310
+
+5969
+18172
+1931
+
+3598
+2837
+1105
+7300
+11781
+10686
+
+3698
+4698
+3891
+4481
+4089
+3511
+4949
+2148
+4017
+2529
+3572
+1912
+1837
+1937
+2688
+
+6485
+7072
+7964
+13114
+5864
+5280
+
+12413
+7196
+12856
+18069
+
+1367
+2238
+3089
+3189
+5022
+3877
+5238
+3566
+1081
+1525
+1958
+5796
+2498
+1517
+1481
+
+25527
+17474
+4705
+
+6722
+2844
+3856
+1780
+4518
+5679
+4775
+6067
+2695
+5979
+2488
+1515
+5071
+
+7155
+4147
+4406
+4169
+2156
+7110
+6837
+4673
+3599
+2672
+2768
+3195
+
+8040
+5248
+6440
+1830
+2281
+4938
+6116
+6842
+5743
+5788
+5703
+
+2527
+3362
+5630
+4976
+1989
+5157
+4951
+3382
+4525
+4057
+4077
+3717
+4035
+4907
+1795
+
+1069
+7242
+2438
+7224
+8058
+6215
+7770
+5958
+2445
+1702
+3558
+
+6075
+4164
+5797
+1051
+3104
+2966
+3653
+3933
+1546
+5111
+4811
+4145
+3532
+2289
+1468
+
+9540
+
+1830
+6422
+7523
+2131
+3072
+2873
+1423
+7560
+4640
+4476
+
+10022
+15927
+14403
+2312
+
+3056
+5371
+4501
+6465
+4761
+2050
+4187
+1179
+3746
+6089
+1365
+6495
+4844
+4984
+
+1812
+2671
+1805
+4200
+1986
+5327
+5548
+1872
+4364
+3147
+5447
+5882
+2602
+5501
+2446
+
+9725
+8080
+9941
+10636
+6852
+5378
+4137
+
+25228
+22215
+10199
+
+15394
+28799
+
+3620
+1758
+4663
+2715
+5642
+6209
+5361
+4582
+2165
+7485
+7611
+
+6910
+6782
+2177
+2763
+6877
+3922
+1355
+2400
+6139
+5362
+5737
+3766
+3535
+
+6587
+6770
+3729
+3316
+4161
+2828
+3886
+7483
+2746
+5923
+
+1647
+6201
+1200
+5810
+4493
+5373
+1856
+5507
+1833
+4277
+2897
+4473
+4433
+4352
+
+3807
+18028
+7426
+18476
+
+6493
+1157
+3125
+7736
+1208
+3243
+7737
+1953
+1970
+3245
+1600
+
+12034
+12959
+9334
+
+8432
+3424
+4506
+5758
+10840
+11056
+
+7284
+4013
+4217
+7307
+6367
+1977
+3617
+2165
+2969
+6595
+6651
+2446
+
+1083
+5636
+1785
+2553
+4634
+3790
+7465
+2970
+2725
+4267
+2861
+
+3145
+7872
+5049
+3368
+4009
+2348
+6877
+6956
+2359
+8064
+4386
+
+4764
+6236
+4923
+4395
+2974
+3985
+2725
+1831
+2755
+4068
+2383
+2138
+2998
+4346
+
+6673
+2519
+2754
+5734
+4796
+3389
+6931
+5771
+5936
+2328
+5684
+3171
+4608
+
+15166
+11415
+9051
+3437
+10405
+
+1590
+7370
+7003
+5030
+3852
+6353
+7054
+3765
+2925
+6968
+
+9678
+2846
+8939
+10270
+7196
+11860
+4221
+
+4447
+5407
+1459
+1693
+3774
+3978
+5240
+2331
+1903
+4421
+1152
+5084
+1969
+2365
+4526
+
+5249
+5631
+3701
+6419
+6003
+6884
+2315
+5745
+1341
+6370
+5430
+6442
+3156
+
+2112
+3970
+1000
+1981
+3528
+3490
+1510
+1629
+5413
+4277
+6347
+6134
+1855
+
+8848
+3187
+9361
+16338
+5644
+
+8477
+6983
+8052
+4156
+8204
+3216
+4797
+3024
+3499
+6006
+
+7326
+14394
+7169
+17160
+
+3282
+5582
+6657
+5435
+2096
+3038
+5747
+2545
+1927
+6331
+6785
+1199
+1794
+
+1471
+4089
+8406
+3811
+7060
+1164
+1042
+5968
+8721
+
+6191
+17967
+6680
+15071
+
+1811
+2960
+4046
+4196
+5271
+1982
+2324
+8928
+4517
+
+12525
+5174
+5986
+14713
+15516
+
+4412
+5282
+6035
+5882
+5488
+5797
+1101
+2763
+6159
+3886
+5358
+5802
+4033
+3113
+
+9534
+4195
+9134
+4093
+2988
+7170
+10552
+1724
+
+1768
+8793
+5606
+8771
+5365
+9465
+6618
+3528
+
+2206
+4623
+4108
+3138
+5818
+4907
+2036
+1646
+5703
+3097
+3475
+1167
+2515
+5095
+4964
+
+3633
+6926
+5402
+4602
+8429
+9575
+7807
+3691
+1060
+
+1142
+10612
+6215
+9965
+6377
+2889
+
+3544
+3870
+1373
+1166
+2068
+5111
+1958
+4383
+1868
+5305
+3620
+5304
+3126
+2972
+
+36719
+
+6297
+1347
+1423
+7325
+1798
+7102
+2585
+7973
+7084
+6963
+2423
+
+23242
+10969
+22162
+
+13407
+
+3392
+4473
+1448
+4470
+2740
+2249
+1154
+2212
+3078
+3817
+6471
+3506
+3395
+1906
+
+4808
+1923
+8332
+8636
+2919
+5259
+7210
+10191
+
+7183
+4475
+5652
+6992
+7492
+7906
+7275
+6680
+5776
+
+2752
+9069
+11736
+9659
+11337
+1120
+9412
+
+3199
+3488
+13447
+10265
+6076
+13516
+
+1651
+3970
+7077
+6774
+6915
+4838
+10860
+
+5737
+6268
+1718
+10759
+3572
+5494
+
+24537
+10330
+
+10316
+2956
+5555
+6248
+5263
+1249
+5783
+5774
+
+3525
+2066
+2616
+7191
+3926
+1532
+5964
+5512
+1695
+2512
+6491
+
+2975
+1916
+10644
+5182
+5339
+8680
+3275
+10289
+
+4593
+4274
+4044
+4904
+1989
+4851
+1555
+3703
+5231
+2427
+3096
+4461
+5178
+5241
+1141
+
+2331
+1706
+5359
+5149
+3273
+4602
+3067
+6598
+6665
+3244
+2654
+
+2959
+3036
+1202
+4882
+1152
+1667
+4291
+2393
+3774
+5366
+1414
+3985
+4260
+2775
+3831
+
+2474
+1259
+2835
+6583
+6997
+6502
+5069
+6551
+3077
+5282
+2469
+7110
+
+8600
+5500
+15337
+13901
+1000
+
+18310
+10484
+
+6280
+8351
+4405
+5826
+1032
+6646
+1367
+3758
+7046
+2308
+
+4888
+8942
+6060
+2012
+9154
+6142
+1923
+7135
+3387
+
+9170
+5125
+1487
+6729
+8642
+10296
+7469
+
+1373
+9559
+6106
+2405
+7721
+5877
+5946
+6080
+
+4164
+2747
+4312
+5824
+2960
+2506
+6274
+5887
+4796
+3492
+4477
+2933
+1811
+4957
+
+8728
+9090
+7028
+8869
+3362
+3784
+7482
+8101
+3665
+
+5341
+8591
+3108
+9080
+6248
+6100
+
+7454
+28472
+
+7151
+4060
+9436
+9008
+1333
+6366
+8098
+7046
+1869
+
+34017
+11550
+
+4232
+6470
+3007
+4974
+6384
+5389
+2818
+3389
+2533
+6309
+2500
+2012
+2348
+3439
+
+2004
+2786
+6125
+2455
+3910
+2408
+1037
+2979
+3755
+3838
+2639
+5705
+4765
+3057
+
+2257
+2999
+6940
+2994
+5671
+1779
+2765
+5705
+2980
+4426
+6194
+4142
+5594
+
+31017
+14466
+
+5123
+4500
+5594
+2181
+3229
+4797
+3006
+5755
+3988
+3184
+2501
+5516
+5401
+
+23717
+19963
+23101
+
+22339
+24909
+1460
+
+4560
+2544
+3862
+4631
+2156
+7098
+3945
+1190
+1009
+1850
+2418
+2600
+
+3012
+1803
+1248
+1391
+3975
+4870
+6010
+4507
+5351
+2986
+6310
+4678
+4341
+4420
+
+18246
+20268
+12620
+
+2308
+9249
+3234
+11647
+5717
+10514
+10348
+
+6993
+14784
+22089
+
+2456
+7956
+4644
+11788
+10286
+10176
+6059
+
+7692
+10510
+11255
+
+6235
+2861
+1136
+
+11444
+
+11241
+2893
+3679
+12208
+
+8913
+9505
+3537
+15868
+
+4555
+9248
+18262
+
+12005
+1419
+5608
+3454
+
+14026
+3426
+9822
+6157
+1034
+
+3063
+1146
+10723
+1798
+10569
+3361
+8119
+5926
+
+11894
+8410
+3507
+8343
+15469
+
+16610
+3588
+11982
+2953
+
+3112
+4710
+4522
+2766
+4143
+3462
+1736
+2128
+2889
+4421
+2772
+1153
+4622
+3897
+4013
+
+3483
+1728
+3257
+4736
+11723
+2254
+7438
+
+4465
+5761
+1625
+5566
+1391
+5720
+2158
+5331
+1482
+1734
+4974
+1276
+2704
+1386
+5426
+
+18780
+10740
+
+5245
+1769
+7853
+
+2539
+6400
+4704
+3929
+6819
+4483
+1535
+1689
+6851
+2644
+1799
+6513
+4817
+
+6631
+13675
+2737
+15282
+10426
+
+4102
+2574
+4427
+2824
+1083
+4480
+3898
+2459
+4123
+4502
+2174
+4804
+3109
+3121
+3408
+
+9018
+2604
+9256
+6568
+4487
+4133
+3395
+9266
+2025
+
+3920
+1556
+6177
+5349
+6296
+13639
+
+4313
+1156
+8342
+7415
+4000
+11858
+4709
+
+8780
+5173
+6162
+6344
+1941
+
+1301
+4685
+1841
+2222
+3305
+3965
+6551
+7114
+5399
+3747
+1839
+6706
+
+7853
+11264
+
+14768
+14746
+5840
+1731
+
+4166
+1442
+2971
+8507
+1859
+5344
+
+2874
+1080
+4159
+2491
+3860
+6050
+6523
+1136
+1478
+6370
+6541
+3607
+1908
+
+4652
+5783
+4407
+5261
+1017
+3165
+3589
+1771
+1700
+1308
+2280
+5742
+
+4598
+4281
+2933
+5351
+2897
+3983
+6840
+4827
+3726
+7356
+5221
+4955
+
+5184
+9444
+4616
+2549
+4979
+4577
+
+4998
+1639
+1189
+2612
+1072
+2130
+1044
+3009
+4132
+2712
+1223
+5394
+4698
+3702
+2456
+
+5523
+6843
+6182
+4741
+6514
+5068
+4521
+2424
+6076
+7273
+3125
+6378
+
+5675
+5075
+4462
+2155
+2621
+6955
+6893
+5037
+1935
+6837
+2225
+5190
+
+23738
+30667
+
+3332
+4507
+4454
+3274
+6417
+5739
+1855
+5078
+2040
+2472
+6068
+5696
+1449
+
+12606
+17528
+
+1761
+8980
+8137
+12561
+1838
+
+23685
+5576
+2070
+
+2014
+2573
+1478
+3902
+6247
+5167
+3393
+3723
+6336
+4675
+6430
+5310
+1484
+4109
+
+9842
+3374
+4250
+6939
+3975
+5106
+4823
+
+27517
+29161
+
+3861
+2633
+15717
+
+4392
+3840
+3178
+4148
+1419
+4242
+5498
+3890
+6033
+4700
+6624
+4499
+
+7872
+1829
+9261
+3780
+3815
+11309
+5207
+
+10646
+3597
+8139
+4802
+6588
+8367
+9006
+
+3268
+4153
+4070
+3310
+1132
+6237
+3285
+4461
+1418
+3315
+5840
+3931
+4168
+4059
+
+12562
+15842
+4084
+5075
+4652
+
+13950
+9685
+24437
+
+13322
+17454
+3563
+6272
+
+3171
+4566
+2828
+2367
+3947
+3408
+4149
+3323
+2995
+5217
+2740
+5365
+1857
+3393
+5257
+
+25535
+4255
+4792
+
+2725
+7987
+4898
+4443
+6620
+7232
+5562
+8511
+8551
+6817
+
+4986
+1999
+9609
+4028
+7978
+7833
+
+7122
+3544
+1386
+6190
+2119
+3479
+3638
+2645
+4651
+6909
+3419
+6260
+
+4884
+24630
+16892
+
+1404
+3127
+3142
+5332
+1979
+1038
+4098
+3841
+3620
+3092
+5325
+3685
+5385
+3439
+
+25512
+4994
+1339
+
+65852
+
+5886
+2370
+2424
+7331
+4765
+8599
+3997
+4213
+1185
+4739
+
+3268
+6752
+3238
+8925
+4044
+9369
+4423
+6024
+
+7615
+7582
+1946
+6493
+6969
+2369
+2498
+4231
+6898
+2301
+
+13338
+15159
+1007
+1579
+4532
+
+3111
+4477
+2628
+2009
+1361
+3171
+5895
+5000
+3213
+5536
+
+3384
+6723
+5558
+3445
+7104
+4590
+2005
+1142
+4239
+2804
+2136
+5493
+
+8745
+8221
+2669
+3171
+5469
+2077
+7506
+1388
+6350
+
+1347
+1620
+2690
+4070
+4859
+6068
+4170
+4634
+2749
+3346
+3541
+3841
+3558
+5879
+1725
+
+1630
+8268
+4370
+1609
+6617
+5419
+4991
+3865
+5722
+4530
+
+5677
+17141
+16522
+13806
+
+18659
+25364
+19945
+
+27851
+31094
+
+4535
+5908
+4391
+1243
+1037
+4963
+1570
+5836
+3720
+3066
+2995
+4234
+3073
+5882
+
+37830
+
+8609
+8530
+6527
+2145
+8647
+7720
+5906
+2524
+8666
+
+1143
+1080
+4034
+2107
+2539
+4458
+5898
+2709
+4941
+1011
+1232
+3069
+1527
+2769
+5071
+
+2092
+6346
+6041
+8472
+10954
+2509
+3632
+
+23978
+1578
+23954
+
+3027
+2598
+1818
+5892
+2519
+5083
+3793
+5849
+1488
+3357
+1350
+6813
+4486
+
+2282
+6271
+2548
+6333
+7978
+4451
+5808
+5716
+7485
+6615
+2823
+
+63025
+
+5701
+2013
+5327
+3534
+4144
+1980
+5576
+5075
+5456
+3808
+2466
+5444
+4918
+6048
+4177
+
+3240
+1730
+5306
+7215
+2278
+4619
+3812
+4873
+4453
+
+1467
+2152
+6616
+3839
+3422
+3110
+4447
+6771
+2967
+4994
+6764
+5722
+3680
+
+58287
+
+6434
+1137
+15936
+15651
+14632
+
+1074
+5120
+1340
+4497
+4947
+2195
+1243
+5123
+2076
+4464
+2615
+3780
+5693
+1208
+2180
+
+14965
+10684
+2049
+10628
+9532
+
+24592
+
+4560
+4156
+3363
+1751
+4886
+5216
+2888
+1327
+1285
+6123
+2701
+4501
+6007
+
+6445
+1701
+3886
+3597
+3854
+2593
+3249
+3424
+1703
+3036
+1670
+5705
+5781
+1953
+
+11411
+7632
+1419
+5620
+7953
+7273
+10715
+
+12735
+1860
+6909
+9353
+
+6189
+10627
+9335
+5646
+5375
+6886
+3897
+5716
+
+8653
+12542
+6082
+15244
+
+4819
+1613
+1332
+3125
+1897
+3675
+3688
+3393
+3794
+1146
+
+2603
+6838
+6037
+5540
+2335
+6837
+4425
+3437
+5965
+3449
+4752
+5173
+1971
+
+25800
+14272
+12870
+
+4840
+6051
+2429
+2372
+2533
+4184
+4051
+5449
+1321
+2738
+4450
+4473
+4618
+2936
+5818
+
+9966
+9565
+4598
+6548
+6832
+1749
+
+6333
+7723
+7084
+7305
+2609
+8143
+10400
+7867
+
+2652
+6421
+6630
+4124
+8490
+8618
+6380
+2636
+8045
+
+1382
+6541
+2533
+3419
+3661
+4779
+5466
+6163
+5536
+4844
+2600
+1126
+4297
+
+4541
+10317
+5900
+4278
+2540
+4385
+3048
+3079
+
+7542
+4938
+1913
+7746
+7472
+7621
+1307
+2142
+
+12358
+6813
+15347
+14448
+4584
+
+8653
+14358
+1689
+3466
+13581
+
+18460
+15717
+11921
+
+5002
+1450
+1233
+5553
+2723
+3811
+4765
+1001
+4513
+5847
+4403
+
+20065
+10696
+
+8007
+1090
+2875
+4585
+7707
+7823
+2009
+8498
+
+9586
+8143
+8021
+4245
+7291
+3936
+11899
+
+26024
+
+14163
+9586
+12371
+2127
+4436
+
+2613
+6450
+3236
+7142
+6570
+6405
+2444
+3243
+6166
+7090
+3461
+6534
+
+3176
+4477
+4562
+3589
+5280
+5548
+3708
+4632
+3836
+4171
+5284
+3667
+3313
+4312
+
+12262
+7518
+13586
+14339
+2951
+
+30207
+
+3979
+2163
+7147
+3726
+4358
+7572
+3345
+1296
+2755
+4608
+
+5723
+3754
+2684
+
+19384
+3722
+
+2024
+8540
+6504
+12081
+4812
+3647
+2731
+
+18117
+13193
+13899
+19853
+
+3533
+4991
+2034
+3914
+5920
+2455
+2660
+3175
+1410
+1127
+2272
+3689
+5804
+1311
+1121
+
diff --git a/02/1.lua b/02/1.lua
new file mode 100644
index 0000000..534bbb7
--- /dev/null
+++ b/02/1.lua
@@ -0,0 +1,21 @@
+require("ext")
+
+local points = {
+ ["A X"] = 1 + 3,
+ ["A Y"] = 2 + 6,
+ ["A Z"] = 3 + 0,
+
+ ["B X"] = 1 + 0,
+ ["B Y"] = 2 + 3,
+ ["B Z"] = 3 + 6,
+
+ ["C X"] = 1 + 6,
+ ["C Y"] = 2 + 0,
+ ["C Z"] = 3 + 3,
+}
+
+local score = 0
+for line in io.lines() do
+ score = score + points[line]
+end
+print(score)
diff --git a/02/2.lua b/02/2.lua
new file mode 100644
index 0000000..40ed0d3
--- /dev/null
+++ b/02/2.lua
@@ -0,0 +1,21 @@
+require("ext")
+
+local points = {
+ ["A X"] = 3 + 0,
+ ["A Y"] = 1 + 3,
+ ["A Z"] = 2 + 6,
+
+ ["B X"] = 1 + 0,
+ ["B Y"] = 2 + 3,
+ ["B Z"] = 3 + 6,
+
+ ["C X"] = 2 + 0,
+ ["C Y"] = 3 + 3,
+ ["C Z"] = 1 + 6,
+}
+
+local score = 0
+for line in io.lines() do
+ score = score + points[line]
+end
+print(score)
diff --git a/02/example.txt b/02/example.txt
new file mode 100644
index 0000000..db60e36
--- /dev/null
+++ b/02/example.txt
@@ -0,0 +1,3 @@
+A Y
+B X
+C Z
diff --git a/02/ext.lua b/02/ext.lua
new file mode 100755
index 0000000..4a58a7e
--- /dev/null
+++ b/02/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:append(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:append(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/02/input.txt b/02/input.txt
new file mode 100644
index 0000000..a6dd261
--- /dev/null
+++ b/02/input.txt
@@ -0,0 +1,2500 @@
+B Y
+A Y
+B Z
+A Z
+A Y
+B Z
+C X
+C X
+C X
+C Y
+C Z
+B Y
+C Y
+C Z
+A Y
+B Y
+C Y
+B Y
+B Y
+B Y
+C X
+B Z
+A X
+A Z
+C Z
+C Y
+C Y
+B Y
+B X
+C Z
+B Y
+B Y
+C Y
+B Y
+B Z
+B Z
+B Y
+A Y
+A Y
+B Z
+B Y
+B Y
+B Y
+C Y
+A Y
+B Y
+C Z
+B Y
+B Y
+A Z
+B Y
+A Y
+B Y
+B Z
+C Y
+C Z
+A Z
+C Z
+B Y
+A X
+C Z
+A X
+A Z
+B Y
+B Y
+A Y
+C Z
+B Y
+B Z
+B Z
+B X
+C Y
+B Y
+A Y
+A Y
+B Y
+A Z
+B X
+B Y
+B Y
+C Y
+C Z
+A Z
+B Y
+A Y
+B Z
+B Y
+B Y
+B Y
+C X
+C Y
+B Y
+B Y
+B Z
+B Y
+C X
+B Y
+B Y
+C Z
+C Z
+A X
+A X
+A X
+A X
+B Y
+C Z
+B Z
+B Y
+C Z
+B Y
+B Z
+B Y
+C X
+B Y
+C X
+C Z
+B Z
+C Z
+C Y
+B Y
+B Y
+A Z
+C Z
+C Y
+C Y
+B Y
+B X
+C Y
+B Z
+C Z
+C Z
+A Z
+B Y
+B Y
+B Z
+B Y
+B Y
+C X
+A Z
+A Y
+B Y
+C Y
+B X
+C Y
+C X
+C Y
+A Y
+B Y
+A Y
+A Z
+C Z
+C Z
+A Z
+C Y
+B Y
+C Z
+C Y
+B Y
+B Y
+C X
+B Y
+B Y
+C Y
+C X
+B X
+C Y
+A Z
+B Y
+A Z
+C Y
+C Z
+B Y
+A Z
+C X
+C X
+B Y
+B Y
+C Z
+B Y
+A Y
+B Y
+A Z
+A X
+A Y
+B Y
+B Y
+A Y
+C Z
+B Z
+B Y
+B Y
+B Y
+B Y
+C X
+C Z
+C Y
+B Y
+A Y
+A Z
+C Y
+B Y
+B Y
+B Z
+B Z
+B Z
+A Y
+B Z
+B Y
+C Y
+B Y
+C X
+C Y
+C Y
+B Y
+A Y
+A Z
+B Y
+B Y
+A Y
+C X
+C X
+B Y
+A Z
+A X
+C Y
+C Y
+C Y
+C X
+C Y
+B Y
+B Z
+B Y
+B X
+A Z
+B Y
+B Z
+A X
+B Y
+C Z
+B Y
+B Z
+B Y
+B Y
+B Y
+B X
+C Z
+C Z
+A Y
+B Y
+C Y
+A Y
+C X
+C Z
+A Z
+C Y
+B Y
+B Y
+C Z
+A Z
+C Y
+C X
+C Z
+B X
+B Y
+C Y
+B Y
+C X
+B Y
+A X
+B Y
+B Y
+A Z
+B Y
+B Y
+C X
+B Y
+A X
+A Y
+B Y
+A Y
+C Y
+C X
+C X
+B Z
+B Y
+C Y
+C Y
+C Y
+B Y
+A Y
+C Y
+B Y
+B Y
+B Y
+B Y
+A Z
+B Y
+B Y
+A Z
+B Y
+C Z
+C Y
+B Y
+B Z
+A Y
+B Y
+A Z
+C Z
+B Y
+C Z
+B Z
+B Z
+A X
+A Z
+C Z
+B Y
+A Y
+C Z
+C Y
+B Y
+B X
+B Y
+C Y
+C Y
+C Y
+C X
+C Y
+B Y
+B Y
+C Y
+B Y
+C Z
+C Z
+B Y
+A Y
+C Y
+B Z
+C X
+C Y
+B Y
+B Y
+B Y
+C Z
+B Z
+B Y
+A Y
+B Y
+A Z
+B Y
+B Z
+B Y
+B Z
+B Y
+B Z
+C Z
+C Z
+A X
+A Y
+B Y
+C Z
+C Y
+B Z
+A Y
+A X
+B Y
+B Y
+B Y
+B Z
+B Y
+B Y
+C Y
+B Y
+B Y
+C Y
+B Y
+A Z
+C Z
+C Z
+C Z
+A Z
+B Y
+B Z
+B Y
+A Z
+B Y
+B Y
+B Y
+B Y
+B Y
+A X
+C Y
+B Y
+C Z
+B Y
+B Y
+B Y
+C Y
+A Z
+B Y
+B Z
+B Y
+B Y
+B Y
+B Y
+B Y
+C Y
+B Z
+A Z
+C Y
+C X
+C X
+B Y
+C Z
+B Z
+B Z
+B Y
+B Y
+B Y
+A Z
+B Z
+A Z
+B Z
+A Z
+B Y
+B X
+B Y
+C Z
+C Y
+B Y
+A Z
+A Z
+B Y
+B Y
+B Y
+B Y
+A Z
+B Z
+B Y
+B Y
+B Z
+B Y
+C Z
+B Y
+C Y
+B Y
+C Y
+B Y
+A Z
+B Y
+A Z
+C Z
+C Y
+A Z
+A Y
+A Y
+A X
+A Y
+B Y
+B Z
+A X
+C X
+C Z
+B Y
+A Z
+A X
+B Y
+B Y
+B Y
+B Z
+C Y
+C X
+B Z
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+A Z
+C Y
+B Z
+B Y
+B Y
+B Y
+A X
+B Z
+A Y
+C Z
+B Z
+B Y
+B Y
+C Y
+A Y
+C Y
+B Y
+B Y
+A X
+C X
+B Z
+C Y
+B Y
+B Z
+C Y
+B Y
+B Z
+B X
+B Y
+A Z
+B Y
+B Z
+B Y
+B Y
+A Z
+A X
+A Z
+B Z
+A X
+C Y
+B Z
+B Y
+B X
+A X
+C Y
+C X
+A Y
+B Z
+B Y
+A X
+A Z
+C X
+C Z
+B Z
+C X
+C X
+B Y
+A Y
+B Y
+B Y
+C Z
+A X
+C X
+B Y
+B Y
+B Y
+B Y
+C X
+B Z
+B Y
+B Y
+C X
+B X
+B Y
+C X
+A Z
+A Y
+B Y
+B Y
+B Y
+C Z
+B Y
+C X
+C X
+B Z
+B Z
+B Z
+B X
+B Y
+C Y
+B Z
+B Y
+B Y
+B Y
+B Z
+B Y
+C Y
+B Y
+B Y
+B Y
+B Y
+B Z
+C Z
+A Y
+C Y
+B Y
+B Y
+A Z
+C Z
+B Y
+B Y
+A Y
+B Y
+C Z
+C Z
+B Y
+A Y
+A Y
+C Y
+B Z
+B Z
+C X
+B Y
+C X
+B Z
+C Z
+A Z
+A Y
+B Z
+C X
+B Y
+A X
+A Z
+A Y
+B Y
+B X
+B Z
+A Z
+B Z
+A X
+A X
+A Y
+B Y
+C Y
+B Y
+B Y
+C Z
+B Y
+A X
+B Y
+C Y
+B Z
+C X
+B Y
+B Y
+B Z
+A Z
+B Y
+C Z
+B Y
+C Y
+B Y
+A Y
+B Y
+B Y
+A Z
+A Y
+C Y
+B Y
+B Z
+C Y
+B Y
+B Y
+C Z
+B Y
+C Z
+A X
+A Z
+B Y
+B Y
+C Z
+B Y
+B Y
+C Y
+A X
+C Z
+B Y
+A Y
+B Y
+A X
+A Z
+B Z
+B Z
+B Y
+B Y
+C Y
+A Y
+C X
+B Y
+A Z
+C Y
+C X
+A Y
+A Z
+C X
+C Z
+A Y
+B Y
+B Y
+C X
+B Y
+A Y
+B Z
+A X
+C Z
+A X
+B Z
+A Z
+A Z
+B Z
+B Y
+B Y
+B Y
+B Y
+C Y
+B Y
+A X
+A Y
+A Y
+B Y
+B Y
+C Z
+A Y
+B Z
+B Y
+C Y
+A X
+B Y
+A X
+A X
+A Z
+C Y
+A Z
+C Z
+B Y
+B Y
+B Y
+A X
+B Z
+C Z
+A X
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+C Y
+B Y
+B Y
+C Y
+C Y
+C Z
+A Y
+C Y
+B Z
+B Y
+C Y
+B Y
+C Y
+A Y
+B Y
+B Y
+B Y
+B Z
+B Z
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+C X
+A Z
+A X
+B Y
+B Z
+A Z
+A Z
+B Y
+B Y
+A Z
+A Y
+A Z
+A Z
+A Y
+B Y
+B Y
+B Y
+B Y
+C X
+B Y
+B Y
+B Y
+B Y
+B Z
+B Z
+B Y
+C Z
+A Z
+A Y
+B Y
+B X
+C Y
+C Y
+A Z
+A X
+B Y
+A X
+B Y
+C Z
+B Y
+C X
+B Y
+B Y
+B Y
+C X
+C Y
+B Y
+B Y
+B Y
+A Y
+B Y
+C X
+B Z
+B Y
+B Y
+C Z
+B Y
+B Y
+A Z
+B Z
+B Y
+B Z
+B X
+A Y
+B Y
+B Y
+B Y
+B Y
+C X
+C Y
+B Y
+A Z
+A Y
+B Y
+B Y
+B Y
+B Y
+B Y
+B Z
+C Z
+A X
+B Y
+A Y
+B Y
+B Y
+B Y
+B Y
+B Y
+A Y
+B Z
+B Y
+B Y
+C Y
+A X
+A X
+B X
+C Y
+B Y
+A Y
+B Y
+B Z
+B Y
+C Y
+B Z
+B Z
+A Y
+A Y
+C Z
+B Y
+C Z
+C X
+A Y
+B Y
+A Y
+A X
+B Y
+C Y
+A Z
+B Y
+B Y
+B Y
+A Z
+B Y
+A X
+C X
+A X
+B Z
+C Y
+A X
+C Y
+A Z
+C Y
+B Y
+B Y
+B Y
+B Y
+C Y
+C Z
+A Z
+B Z
+B Z
+C Z
+B Y
+A Y
+B Z
+B Z
+A Y
+B Z
+C Z
+C Y
+C X
+C Z
+C X
+B Y
+A X
+B Z
+B Y
+A X
+B Y
+B Y
+B Z
+C Y
+C Z
+C Y
+B Y
+B Y
+B Z
+A X
+B Y
+A X
+B Z
+A Z
+A Z
+B Y
+C Y
+C Y
+C Y
+B Y
+A Z
+B Z
+B Z
+C Y
+A Y
+A Y
+A Z
+B Y
+A X
+B Z
+C X
+B Z
+B Y
+A Y
+A Y
+C Y
+A Z
+B X
+A X
+C Y
+B Y
+B Y
+C Y
+B Z
+C X
+C Y
+B Y
+C Y
+B Y
+B Y
+C Y
+B X
+A Z
+B Z
+B Y
+A Z
+B Z
+B Y
+A Z
+C Y
+C Y
+B Y
+C Y
+B Y
+B Y
+B Y
+B Y
+B Z
+B Y
+C Y
+C Z
+B Y
+B Y
+A Z
+B Y
+B Z
+A Y
+A Y
+C Y
+A Z
+C Y
+B Z
+B Y
+C Y
+B Z
+C Y
+A Z
+B Y
+B Y
+B Y
+B Y
+C Z
+A Y
+A X
+C X
+A Y
+C Y
+C X
+B Y
+C Y
+A Y
+B Y
+C Y
+B Y
+A X
+B Y
+B Y
+B Z
+C Y
+C Y
+A X
+B Z
+A Z
+B Y
+B Y
+B Y
+B X
+B Y
+B Y
+C Y
+B Y
+C X
+A Y
+B Y
+B Y
+A Z
+C X
+A X
+A X
+C X
+B Y
+C Z
+B Y
+A Z
+C Y
+B Y
+B Y
+C X
+B Z
+C Y
+A X
+A Y
+C Y
+A Z
+B Y
+B Z
+C Y
+A Z
+A Y
+A Y
+B Y
+A X
+B Z
+B X
+B Z
+B Y
+B Y
+A Y
+C Y
+B Y
+B Z
+B Y
+A Y
+C Y
+C Y
+A X
+B Y
+A X
+C X
+A Z
+A Y
+B Z
+B Y
+B Y
+B Y
+C Y
+A X
+B Z
+A X
+C Y
+C Z
+A X
+B Z
+C X
+B Y
+B Y
+A Y
+B Z
+B X
+B Y
+B Y
+A Z
+C Y
+B Y
+B Y
+C Y
+B Y
+A X
+B Y
+B Y
+B Z
+B Y
+A Y
+A Z
+B Y
+B Y
+A Y
+A Z
+A Z
+A Y
+B Y
+A Y
+B Z
+B Y
+B Y
+A Z
+B Y
+B Y
+B X
+A X
+B Y
+B Y
+C Z
+C X
+A Y
+B Z
+B Y
+C Y
+B Y
+B Y
+B Y
+A X
+A Y
+B Y
+C Z
+B Y
+B Y
+B Y
+C Z
+B Y
+B Z
+B Y
+B Y
+B Y
+C Y
+B Y
+B Y
+C Y
+C Y
+A X
+C Y
+A Y
+B Y
+B Y
+B Y
+B Y
+A Y
+A Y
+C X
+B Y
+C Z
+A X
+B X
+C Z
+C Y
+B Y
+B Y
+B X
+B Z
+C Y
+B Z
+B Y
+B Y
+B Y
+B Y
+C Z
+C Y
+C Y
+A Y
+B Y
+B Z
+B Y
+C Z
+B Y
+B Y
+C Y
+B Y
+B Z
+B Z
+B Y
+C Z
+B Y
+B Y
+B Y
+B Y
+B Y
+A Y
+C X
+A Z
+A Y
+B Y
+C X
+B Z
+B Y
+C Y
+B Y
+A Y
+B Y
+B Y
+B Y
+A Z
+A Z
+B Y
+B Y
+B Z
+A Z
+C Y
+C Y
+C Y
+C Z
+B Y
+C Y
+C X
+A Z
+B Z
+B X
+B X
+C Y
+B Y
+A Z
+B Z
+B Y
+B Y
+B Z
+B Y
+B Y
+B X
+B Y
+B Y
+A Z
+A Z
+A Y
+B Z
+B Y
+A Y
+B Y
+A Z
+B Y
+B Y
+A X
+B Z
+C Y
+A Z
+C Y
+C Y
+B Y
+C X
+C Y
+A X
+A Z
+C Z
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+C X
+C Y
+C Y
+C Y
+B Y
+B Y
+C Y
+C Y
+A X
+B X
+C X
+C Z
+B Y
+A Y
+A Z
+B Y
+C Y
+C Z
+B Y
+A Y
+C Y
+B Y
+A Y
+B Y
+A Y
+C Z
+C Y
+A Y
+A Z
+B Y
+C Y
+B Y
+B Y
+B Y
+B Y
+B Z
+C Z
+B Y
+B Y
+C Z
+A Y
+B Y
+C Y
+B Y
+A X
+B Y
+B Y
+A Y
+B Y
+B Y
+A X
+B Y
+B Z
+B Y
+B Y
+B Y
+C Z
+C Y
+A Z
+B Y
+C Y
+C Z
+B Y
+A Y
+B Y
+B Y
+B Y
+C X
+B Z
+C Y
+C X
+A X
+C Y
+B Y
+B Y
+B Y
+B Y
+B Y
+B Z
+C Y
+B Y
+C X
+B Y
+B Y
+B Y
+B Z
+A Y
+A Y
+A Z
+B Y
+C Y
+A Y
+A X
+B Z
+C Y
+B Y
+B Y
+B Y
+B Y
+B Z
+A Y
+B Y
+C Y
+C Z
+B X
+B Z
+B Y
+B Y
+C Y
+B X
+A Y
+C Y
+B Y
+C Y
+C X
+A Y
+B Y
+B Z
+C Z
+B Y
+B Y
+C Z
+A Z
+A Y
+B Y
+B Y
+B Y
+C Y
+B Y
+B Y
+B Z
+B Z
+C Y
+B Y
+A Z
+C Y
+C Y
+B Y
+A Z
+B Y
+B Y
+B Y
+A Y
+A X
+C Y
+C Z
+C Y
+B Z
+B Y
+B Y
+B Y
+C Y
+B Y
+B Y
+B Y
+B Z
+B Y
+B Y
+C X
+C Y
+A Z
+C X
+B Y
+B Y
+B Z
+B Y
+A X
+A X
+C X
+B Y
+B Y
+B Y
+A Z
+B Z
+B Z
+B Y
+C Y
+B Y
+B Y
+C Y
+A Z
+C Y
+B Y
+B Z
+A Z
+A Y
+B Z
+A Z
+B Y
+B Y
+A Z
+B Y
+C Z
+B Y
+B Y
+B Z
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+A Z
+B Y
+B Y
+C Y
+B Y
+A Y
+B Y
+C Y
+B Y
+B Y
+B Y
+C Z
+C Y
+C X
+B Y
+A X
+C Y
+B Z
+C Y
+B Y
+C X
+A Y
+B Y
+A Z
+A X
+B Z
+C Y
+C Y
+A Z
+C Z
+B Z
+B Y
+B Y
+B Y
+B Y
+A Y
+A Z
+B Y
+B Y
+A Y
+C X
+B Y
+B Y
+C Y
+C X
+B X
+C Y
+B Y
+A Y
+B Y
+B Y
+B Y
+C Y
+B Y
+B Y
+A Z
+B Y
+A Z
+B Y
+B Y
+B Z
+B Y
+C Y
+B Y
+A Y
+B Y
+A Y
+B Y
+B Z
+B Y
+B Y
+C X
+B Y
+B Y
+C X
+C Z
+C Z
+B Y
+B Z
+B Y
+A Y
+B Y
+A Y
+B Y
+C Y
+A Y
+B Y
+C Y
+B Y
+B Y
+B Y
+A Y
+C Y
+C Z
+C X
+C Y
+C X
+C Y
+B Y
+C Z
+C Z
+B Y
+A Z
+B Z
+B X
+C Y
+A Y
+C Y
+C Y
+B Y
+B Y
+B Y
+B Y
+C X
+B Y
+C Y
+C X
+C Y
+C X
+B Y
+A Y
+A Y
+B Y
+C X
+C X
+C X
+C X
+C X
+B Y
+B Y
+B Y
+C Y
+C Z
+C Y
+B Y
+A Y
+C Z
+B Y
+B Y
+A Y
+B Y
+C Y
+A Z
+B Y
+A Z
+C X
+C Y
+C Y
+A X
+C Y
+C Z
+B Y
+B Y
+C Y
+B Z
+B Z
+B Y
+A Z
+A X
+B Y
+B Y
+A Z
+C Y
+C Z
+A Z
+C Z
+B Y
+C Y
+B Z
+C Z
+C Y
+A X
+A Y
+B Z
+C Z
+B Y
+B Y
+C Z
+C X
+B Y
+B Y
+B Z
+B Y
+A Y
+A Z
+B Y
+A Y
+B Y
+B Y
+A Z
+C X
+C Y
+B Y
+B Y
+A X
+B Y
+B Z
+C Y
+A Y
+C Y
+B Y
+C Y
+B Y
+B Y
+B Y
+C X
+B X
+B Y
+B Y
+B Y
+B Z
+B Z
+B Y
+B X
+B Y
+B X
+B Z
+A X
+C X
+B Y
+B Y
+A Z
+C X
+A Y
+B Y
+B Z
+C Z
+B Y
+B Z
+A Y
+A Z
+B Y
+C Z
+B Y
+A Z
+B Y
+A Z
+A Y
+C Y
+B Y
+B Y
+A X
+C Y
+B Y
+A X
+B Y
+C Z
+A Z
+B Y
+B X
+A Y
+C Y
+B Z
+C Y
+B Y
+B Z
+A Y
+A Z
+B Y
+B Y
+A Z
+A X
+C Y
+B Z
+B Z
+B Y
+C Z
+C Y
+C Z
+B Y
+B Y
+B Z
+B Y
+B Y
+A X
+B Y
+B Y
+C X
+C Z
+B Y
+B Y
+A X
+B Y
+B Z
+C Z
+B Z
+A Y
+B Y
+B Z
+B Y
+C Y
+C Y
+B Y
+B Y
+B Z
+A X
+B Z
+B Y
+C Y
+A X
+B Y
+A Y
+B Z
+A Y
+B Y
+B Y
+B Z
+C Y
+C Y
+B Z
+C Y
+B Y
+C Y
+B Y
+A Z
+A Z
+C Z
+B Y
+B Y
+A Z
+B Z
+B Z
+C Y
+B Y
+B Y
+B Z
+C Y
+A Z
+C Y
+C Z
+C Z
+A Y
+B Y
+C Y
+B Z
+B Y
+C Z
+B Y
+B Y
+A X
+B Y
+B Y
+B Y
+B Y
+A Z
+C Y
+A Y
+B Y
+B Y
+C Z
+B Y
+B Y
+B Y
+B Z
+B Y
+B X
+C Y
+B Y
+B Y
+A X
+C X
+A X
+B Z
+A Z
+B Y
+B Y
+C X
+B Z
+B Y
+B Z
+B Y
+C Z
+A X
+B Z
+B Y
+B Y
+B Z
+B Y
+B Y
+A Y
+B Y
+A X
+B Z
+C X
+B Y
+B Y
+B Y
+B Y
+B Y
+B Z
+B Y
+B Y
+C Z
+B Y
+A Y
+A X
+C Y
+B Z
+B Z
+B Y
+B Y
+A Y
+B Z
+B Y
+B Y
+B Y
+B Y
+B Z
+B X
+B Y
+B Y
+C Y
+B Y
+B Y
+B Y
+B Z
+B Z
+B Y
+B Y
+B Y
+C X
+C Z
+C Z
+A Z
+A Y
+C Y
+B Y
+C Z
+C Y
+C X
+B Y
+B Y
+A X
+A Y
+C X
+B Y
+B Y
+C Y
+B Y
+B Y
+B Y
+C Z
+B Y
+C Z
+C Y
+B Z
+B Y
+B Y
+A X
+C Z
+C Y
+B Y
+B Y
+C Y
+C Y
+B Z
+B Y
+B Z
+B Y
+C Y
+B Y
+C Y
+B Y
+C Y
+C X
+B Y
+C Y
+B Y
+A Z
+B Y
+A Y
+C Y
+C Y
+B Y
+B Y
+C X
+A Z
+A X
+B Z
+B Y
+B Z
+A Z
+C Y
+A Y
+A X
+C Y
+A Y
+A Y
+C Z
+B Y
+B Y
+B Y
+C X
+B Y
+A X
+B Y
+B Y
+B Y
+A Z
+A X
+B Y
+C Y
+B Y
+A X
+B Z
+A Y
+A X
+A Z
+C Z
+B Z
+C X
+B Y
+A X
+B Z
+A Z
+B Y
+A Z
+B Y
+A Z
+C Z
+A Y
+B Y
+B Y
+A X
+B Y
+A X
+B Y
+A Z
+C Z
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+A Y
+C X
+C Y
+C Z
+B Y
+B Y
+A X
+C Z
+A Y
+B Y
+B Y
+C Z
+B Z
+B Y
+B Z
+B Y
+B Y
+B Y
+C Y
+A Y
+C Z
+B Y
+A X
+B Y
+C Y
+B Y
+A X
+A X
+B Y
+C Y
+B Y
+B Y
+A Y
+C X
+C Y
+C X
+A Y
+B Y
+B Y
+A Y
+B Y
+C Y
+C Z
+B Z
+B Y
+B Y
+C Y
+B Z
+B Y
+B Y
+B Y
+C Y
+B Y
+C Y
+B Y
+C Z
+B Y
+B Z
+B Y
+B Y
+A Z
+B Y
+B Z
+B Y
+B Z
+A Y
+B Y
+B Y
+B Y
+A Y
+C X
+B Y
+C Y
+B Y
+B Y
+B Y
+C Y
+B Y
+B Y
+C Z
+B Y
+A Z
+C Y
+C Z
+B Y
+B Y
+C Y
+B Z
+B Y
+A Y
+A Y
+B Y
+B Y
+B Y
+B X
+B Z
+A X
+C Z
+B Z
+A Z
+B Y
+B Y
+A X
+A Y
+C Y
+B Y
+B Z
+B Y
+B Y
+B Y
+B Z
+A Y
+B Y
+B Y
+B Y
+C Z
+C Z
+B Y
+B Z
+B Y
+B Y
+B Y
+C Y
+A Z
+B Y
+B Y
+B Z
+B Y
+B Y
+B Y
+A X
+B Y
+B Y
+B Y
+C Y
+B Y
+B Y
+C Z
+B Z
+C Y
+B Y
+B Z
+C Y
+B Y
+B Z
+B Y
+B Y
+A Z
+C Z
+C Y
+B Y
+C X
+B Y
+B Y
+B Z
+B Y
+B Y
+A Y
+B Z
+C Y
+C Y
+A Y
+B Z
+C X
+C Y
+C X
+A Z
+A X
+B Y
+C X
+B Y
+B Y
+B Z
+A Z
+B Z
+B X
+B Y
+B Z
+B Y
+B X
+A Y
+B Y
+C X
+A Z
+A X
+B Y
+B Y
+B Y
+B Z
+B Y
+A X
+C Z
+B Z
+B Z
+B Z
+A Y
+B Y
+B Y
+C X
+B Y
+A Y
+A Z
+B Z
+B Z
+B Y
+B Y
+C Y
+C Y
+C X
+B Y
+C Z
+B Z
+B Y
+B Y
+B Y
+B Z
+C X
+C X
+B Y
+B Y
+B Z
+B Y
+A Y
+B Y
+B Y
+A X
+B Y
+B Y
+B Z
+A Y
+B Y
+A X
+B X
+A Y
+C Y
+B Y
+B X
+A X
+B Y
+B Z
+A Y
+B Z
+B Y
+B Y
+C Y
+B Y
+B Y
+B Y
+B Y
+B Y
+A Y
+B Y
+A Y
+B Y
+A Y
+B Y
+B Y
+B Y
+A X
+A Y
+A Y
+A X
+B Z
+A X
+C Y
+C Y
+B Y
+A X
+B Y
+A Y
+B Y
+B Y
+B Y
+C X
+C Y
+B Y
+C X
+C Y
+B Y
+B Y
+C Y
+B Y
+B Y
+B Y
+B Z
+A Z
+B Y
+B Z
+B Z
+A X
+C Z
+B Y
+C Z
+B Y
+C Z
+B Y
+A X
+C Y
+C Z
+A Z
+A Y
+B Y
+A Y
+B Y
+B Y
+B Y
+B Y
+B Y
+A Y
+C Y
+C Y
+B Z
+B Y
+B Y
+B Z
+A Z
+A X
+C Z
+B Y
+B Y
+A X
+C Y
+A Y
+B Y
+A Y
+B Y
+B Z
+C Y
+C Z
+B Y
+A Y
+B Y
+C Z
+C Z
+A X
+A X
+C Z
+A X
+A Z
+B Y
+B Y
+C Z
+C Y
+C Z
+A X
+A X
+B Z
+B Y
+B Y
+A X
+B Y
+B Z
+C Y
+C X
+B Y
+C Z
+B Y
+C Z
+B Y
+B Z
+B Y
+C Y
+A Z
+B Y
+B Y
+A X
+A Z
+A X
+C Y
+B Y
+B Y
+C Z
+B Z
+C X
+B Y
+C Y
+C Y
+A Z
+C Z
+B Z
+B Y
+B Z
+B Y
+A Z
+A Y
+A Y
+A X
+B Z
+C Z
+C X
+B Y
+A X
+C X
+A Y
+B Y
+B Y
+B Y
+A Z
+B Y
+C X
+B Y
+A Z
+B Z
+B Z
+C Y
+B Y
+C X
+C X
+C Y
+C Y
+C Z
+C X
+B Y
+C Y
+C Y
+B Z
+B Y
+A Y
+B Z
+A X
+B Y
+A Z
+C Y
+B Y
+C Z
+B Y
+A X
+C Z
+B Z
+B Y
+B Y
+B Y
+B Y
+B Y
+C Z
+A Z
+C Y
+A Z
+B Y
+C X
+C X
+A X
+A Y
+B Z
+C Y
+C X
+C X
+C Y
+C X
+B Y
+C X
+A Y
+C Z
+B Y
+B Z
+B Y
+A X
+B Y
+A Z
+A Y
+C X
+A X
+B X
+C X
+C Z
+C X
+A Y
+A Z
+B Y
+A Y
diff --git a/03/1.lua b/03/1.lua
new file mode 100644
index 0000000..b9a97a3
--- /dev/null
+++ b/03/1.lua
@@ -0,0 +1,26 @@
+#!/usr/bin/env lua
+require("ext")
+local sacks = {}
+local common = {}
+for line in io.lines() do
+ local compart_1 = {}
+ for i = 1,(#line/2) do
+ compart_1[line:sub(i,i)] = true
+ end
+ for i = (#line/2+1), #line do
+ local sb = line:sub(i,i)
+ if compart_1[sb] then
+ table.insert(common,sb)
+ break
+ end
+ end
+end
+local sum = 0
+for _, p in pairs(common) do
+ if p >= 'a' and p <= 'z' then
+ sum = sum + (p:byte() - ('a'):byte() + 1)
+ elseif p >= 'A' and p <= 'Z' then
+ sum = sum + (p:byte() - ('A'):byte() + 1) + 26
+ end
+end
+print(sum)
diff --git a/03/2.lua b/03/2.lua
new file mode 100644
index 0000000..8c2d155
--- /dev/null
+++ b/03/2.lua
@@ -0,0 +1,33 @@
+#!/usr/bin/env lua
+require("ext")
+local items = {}
+for start, finish in pairs({a = 'z', A = 'Z'}) do
+ for k = start:byte(), finish:byte() do
+ items[string.char(k)] = true
+ end
+end
+
+local groups = {}
+for line in io.lines() do
+ local expanded = {}
+ line:gsub("(%w)",function(w) expanded[w] = true end)
+ table.insert(groups,expanded)
+end
+local common = {}
+for i = 1,#groups,3 do
+ for item, _ in pairs(items) do
+ if groups[i][item] and groups[i + 1][item] and groups[i + 2][item] then
+ table.insert(common, item)
+ break
+ end
+ end
+end
+local sum = 0
+for _, p in pairs(common) do
+ if p >= 'a' and p <= 'z' then
+ sum = sum + (p:byte() - ('a'):byte() + 1)
+ elseif p >= 'A' and p <= 'Z' then
+ sum = sum + (p:byte() - ('A'):byte() + 1) + 26
+ end
+end
+print(sum)
diff --git a/03/example.txt b/03/example.txt
new file mode 100644
index 0000000..f17e726
--- /dev/null
+++ b/03/example.txt
@@ -0,0 +1,6 @@
+vJrwpWtwJgWrhcsFMMfFFhFp
+jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
+PmmdzqPrVvPwwTWBwg
+wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
+ttgJtRGJQctTZtZT
+CrZsJsPPZsGzwwsLwLmpwMDw
diff --git a/03/ext.lua b/03/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/03/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/03/input.txt b/03/input.txt
new file mode 100644
index 0000000..cb4dee4
--- /dev/null
+++ b/03/input.txt
@@ -0,0 +1,300 @@
+rNZNWvMZZmDDmwqNdZrWTqhJMhhgzggBhzBJBchQzzJJ
+pHlSVbVbFHgHBzzhQHqg
+nVsqGpbbtDtTNmrmfZ
+zrBMnbzBchshsttfbMRBgmJggmmCHGgDhDgNDGHL
+VddZqQqdvSQMJHJGdCDCDDmH
+pZWWllPQlPZQvZvwpSVlqlvtfswMRzBbntzRbzbfstsRzF
+NnjjRlnWNSWWbGwccbcchfPfTvfjfTBBpvmdMjTfvB
+FVzJtDDJDqTMlmlM
+gVQZlFLlzHhLGShGww
+rPZtvtFrFPgWjQvCBlcqMzlqQC
+QGVDJJnLnVTCJBczqqTM
+fNSSnmLDSVLhhhSNSLhGSGfVPjrFHwmQwtwWFRWRjWPHrwgt
+SvmlrVrCvmNhSSVZVCrsgqPfbwGFwwwsflbbGb
+QHffdnHDDQdMGbgqPwztdPds
+DjBjWHfQDfTQWTBfpMBQLVmmmcCCcVhCBBBhhCmC
+trLHFFQHTLHJQrflfCnLLHrRfRRPqSRPbPbbsRGqqGqhjj
+mcMpNWVVNmNVsSbSJPcGhPRR
+NpzNgwzZDVNZVWNpHJQLQHtQrZQHrBCl
+JVCMfgJVrJtMBhhrfVVfhVsjvpFGFgjSSgFdSGGqjvjvqF
+mHllHlHpmWlDSFqbdSTS
+nmZRLzQnWVpctMVpQs
+BrvRzWBPWbRwGRjbbRGrtrfqjCJCjCJgJsZJscFCZcJC
+MnnnVMVhTMQhsccVfwqFJgqf
+mMShHHppQmHrrBzwtSbWwR
+pWWGJMJJwlnZSqjWmvSWZC
+gtHrLttDtgFjjqRZZCrjpp
+bFtbTpHFHLbfLFbHVttccttddJGQdJzTwdTzJlMnMBwwJJ
+JhqHFhVMzJPQcdcVncdc
+NhgfwSjwCWwltSfnrnRWZdpcPrrRnp
+NNhlltBjssNBgwLFFvDmDqLzHqBB
+LnFrnddfrLnMFjWzpFhcWpjpFc
+ntCwgtNggCqCgCqqPPltvcjjhvmWhmvDzTzDzD
+lqlVQgVCSPVllVQSNGMHHrdQsHrJJBnMHHJf
+ZGZcRZNWpcHZhJfbbNblrfrgllNr
+stBMtzCCsHMfFQjfSSPgtt
+qmszdsCzMncdGwdWZGvH
+PccqPqbhvSvvvtWNjTtWsWcscp
+gRwdDzHJQgHzfdRhgHRffzwsTTjTTCjNjssCpmWWDjtCLW
+zdRMwdRHhGJwgHlnGGSFvvSrnSrr
+rRpMJtPwrcCTNNQNMZQm
+mDWdWVddbbbmBflFhvTHjjQjfZTgZgLLfH
+bhBbFFnDVhdddFBhdmpJRrzStJmwnPzcsJ
+RjlpRRWzzRGRmGzlCRRlQjCgtvTJTtJrTPttrWTwhFvvVJFT
+bSBdLLqbcqcLndLHZNqcZdBDPrVTDDTJSFrJJvVthTwwDS
+cqVsnBfHffVdqnZccGMmCsGzQmjsjlljgz
+wMzJhLtwbnMWtHcFCCFqFNNbgq
+fMlMfjrRRmdmGCGVVCHcVqcVTC
+MmRRRlvmQWzpvnZpwJ
+gRmgMRMmRwzzmwHbwcTNqPDVBbPTZVqPNZ
+fWHphpGFpfJrrhPsNTNZVsNVhT
+WGfJdvltJJfHrJpRgvMRMSwRznwMmw
+htJFGsGspCppCFCGthCdpmJmgmWZfqqzWzlWcfgZHgzHlg
+nwVMjVcVcWlbnBlfWB
+wcNDTvPPDMFJLLppDGDD
+hjCBgPbvMvmQDzlWnWjm
+HrHtgZRRRNwczDWwwDzsQQWW
+LpTqNtFtLFqHLHRrqgFHffVVBChvhhVPBCPhbPbp
+CwpbCwjGqSjVllpGCllBfhZZRDPNcPPNvLLLDSDN
+WshFFWsgTHsdMzQvPczLfLZDZRcLfR
+rWsJQTMhWWHdsQTgsFJgllClVpqVbqnGblCppCVr
+gRBSGcBDBSJSvPQwrTFLjggQTQ
+HMMnHHHZfFVFrrMT
+HhlhppCNcJzCTtBT
+CCffCCmRLTsQRPHQQMPF
+dWdbgcDSNclbbdwdSqHsvHPQPTPJplPMFMGJ
+DWbDNcqZDSWSccNTVBCzVVfmBVZnVz
+BnsrrvZwBsBSJrrrqSTgJQjCbCjgbCHDJgJFjQ
+hLmGlnLmGWcjGDgfFFjQdF
+hhWPmhPtczWpNRmppzRhLchMsnwZvTMZvVSwwrsNwSsBvr
+tDCCltNVttJhNGlMPSWdqBqSjM
+RFQcpcRTpFcnFzdLmLSWjMSSBLSQ
+jwzzczpFbwnHcDCsthDJJsNbst
+dLRWTHSwTmTwTcTWvQNVVQCvVvNFps
+GnBPtBMJBPrjGGJMjrlqChNpNlsnhVFhQsVQ
+JtMtGJfrJgDJjPjRTZLdFcRZRmwSDH
+VSccPJSBLgZPDLDQ
+zfpLMmLsHQGqgQHnDD
+zdLLMssmrdfhddcVdJtScB
+VvpTVQHSqSHSHqqHJVmRJVHpgDBwDgjcDDDgZjBZBjwBZbRw
+PCdssGlstdWslFPfNPrtClGjwBgBJgJNwcjBjBgZwwMBJD
+tlJldhdhdsdhTqSTqVQqQq
+VGqTcTqbpPwrjfbl
+BvntnZNNsLZvLszSnCsvJthlfjTrZwlrjrpPlwlhfwrl
+QBtNtJLvTsFdQcqWmQRR
+fjcjhmjBvcvcSvcZ
+HMwZtRQQpGGRgzMvLnWWnbLlSntlbv
+JQPzzJHqQRqGMMQwHwzDZZhmmPfjDjmjsCZhPj
+cBlZZMfBrCBMwBMCvQzTwFbQzPnbwjTbTg
+WtzpVDzmtthzGFQTbTThnnTQQg
+sGWstpHdpGDmdHdmGmmmJNstRMrCcBSfBSzNBNRrSRNMcMMv
+mMPDVBZZLSmRdcFpjr
+fggGGfbfgQStjjsdbtdt
+gNqQgCQlNCCJgJHvnvnHMjPHjv
+bLsRQrQsGQbLrbRZMGgbJJBJFtlFFngJphhcfBBq
+jjdHCCjfVNmmmNDFcBcpBthcplFDFq
+jmvvmWVjjHTCVvNjSbQGLrRzwMWsMRwfGG
+sJNCsCFFCNPhCzlrSvRrvwhRjj
+MMGMTwpMHGzrGczzlG
+qVmwgHtDtmCdWCsNFmNJ
+fmhWhjVjNpqRRJjwRw
+gnGQGDDCgSsCvPlvPgnPgnPtwqbpHRHqHdJpzpQJJJRJRF
+wgPGsDGPsZgGgBmBWNZNfLWWrZ
+WdsCVtjWWWHRRqLLHncC
+fbSpMSPSZHRRcqlpRc
+cGMmJmfMPPPccZMNQPWvjTtdTjvgmdtTsggw
+tPBQhHWBtQHgWQCtLwddcGnfpGpwwnbhVb
+vqQzTNJJJTvRrTNFJsZrrzFlbbfcnVbbcwmGGGpVzmddcdfd
+NSSqJvFFFFFQjQCjQDSDPD
+rQZnVVrZmZmgSWqHrSzHPC
+LGFLwcMBcllBjFNwGjltggSqSWCCzvNgSqSHtt
+wdhqqGBwwqGMcDhcwdFFbbJppZbssbfZQsQsdVQm
+lqBZlsjVTbVqmFrSnTFSvwncPP
+zQztHfZQtWLJzPFnnQScFcFrvS
+ftHJWHhfttHWffhtgLNfZDWbdqBqjbVssBDCqCdCsmClGG
+MlbWFTJQFbFFzRdNjNtjdtBT
+srwnrsLVHzQPQsjjSQ
+gLpnwgnwnHCvcHHcvwgCvGFFhWGmFmqMMbQFQFFhlGmJ
+qqNcJgJccdqhsqgsggdgqgcrtfNWNZzVbvVFzttMfzbVMZ
+GLlpPpCpwPLDGvrFVWrWWbZt
+DlRCDDLSjTjDjSRSjPClwnwSHHHQmmQvTJcQgvddHsqdcgmB
+jmRjRbRQLLZbPnbrcTTHHHNn
+MfhhmmwtvStrpnJJHc
+fgqlvfhvFzMwqfvMfFWlmMvLZsdQsZVdCdLZdGQjRzdQjD
+lTPcDlVdTlVVMSDfTJccVzdlmMgGBmppgBmnHGHqHqQqqQMH
+ZRjWFPsLNLLrPhWNtnBBvnpGpHGpQmHnmR
+CtwssCNLrsZWjrjcbfPzwJJJffDbTl
+cjMvvqpJFqhShNCRQR
+ldtDgQZDPdzztLZgPTtfbnStfBSbNNSbnbhhSS
+TDsrzsZZZTFHmVHjcsQW
+BQmQchrmBddcmZZdpSgrpswWWswVsnnnDJVnnZFnGN
+TfStMPLTHvbvRVGnHGsNnJWFNV
+qtvMRMMPbbPMLqRPvRTRzMjSSmprpQdBchlmmgldgjzm
+nRRnvNPhrbZDLjvS
+HCszMwcHHcLDrbQDWr
+ptszqwdMbnnhPBqN
+QbzhhfbFhBbpbzwwLjLJjSjltL
+mNndGrSStHJTJLln
+rDMMNVWdVpCbSbSp
+tDTSTSTTTTJDwqjWqBWttdjg
+nNPmVfnGfPNVLmNzfnzPVFMjdpBwWZwZHwBLBqgjqpWH
+dfGPfVQGVPhGzlmnzSvsSTDJhTbTTrrSRD
+ZfgtZBptBfRQNQggjjrjjwmwsQJPzrwm
+TwTGGwTwzzsJzTsH
+lFvwqFLhFMnqcLlVLMLfptNWppppDBDbDfbFgW
+mjftBfVPjttmjcSjcPttzJlvnrwvTRrTnvwvlRrHHTHRTR
+WZDWDNLFWbZbcMDWGZDbNdMCRsnTdTvdnqrHCTrvsRRvwC
+DQFZLNNgtBJQcBzJ
+HbZQZFVbQVpQplQZGbGchDffltfLtmdgDjggTmtm
+zWzRCdnCRBRdJrzDjLhDthjLJTTtjq
+CPPnwSrRdRSzCGMcZZZMwFwMZF
+WBQqNQnQllwnWQlvBBMlljHTqqFdGfmTdFfcFTFFcqmP
+rsRRVrZhrzbtpZRRhFDmPvfFFrfTdFHGvc
+VtSCtSLbtsZVtttthCbJSWSlJlwJQggWWglvwW
+QfFLWCvRfSLFCtvtFhNcqDDcGVbhGcqh
+ZVgrdZZPPZZzPwdjzZhmccsqJGqDdsDDNddD
+pzzwpgZzZZTznZnjZZzPVRLQLlvfSlQRSpWlCvtSQv
+RtcHhRMcrHhBrrTNDVBNLqLqQqfBPm
+wCbWzWbvdWCjbWppmtmNmqmLLsfsNV
+lwjWdbztgHTgggnnnR
+flBbzbMfbrTlrMvBCcwPggdmcdmg
+VDVVRFZRZSFFhQLSGFQhjSVZCgpvPwLCzpdWWzccwdvvvwcC
+hDHRGQVHHQVRZSQGbqqfNTlbHzrbbsqb
+MTFdTsZpPTcMpFCPdCBmMBmRfRGBmQgQRRgt
+vbDSwvhzznnbbhDWnvSzRBgQQLgLQltqtqlmwfGB
+jVjhfSnNDNbzzWzjWSjrCFNpcHdpTTJddJFpsJcc
+ZrrZPHfChPdDPVVdDq
+vFmsbTsmSbbBJssmSBvTmmnTrnrwlWqwVlLrVTLLTWqL
+JrFbpsvFBMBmzBzFStcRhjZjfCCpZNCtct
+TGgRrTggwwtvtQtdCdQNqN
+sJHZJVZHDBpFBZBBNzNdhzdpSzddvqhN
+VZcvFsJVFvsmvssbcnrwbrnGMbMlRn
+SdcdWzMJdSMWMddZJdVcmBmwrwqrrnVnVNtr
+mlQHCfgbjsfQTbfCBNtVhVnntVBnVh
+HLDslDDmblgHfvLHPJFSZPpDFpFFpdPS
+qNqPNJvcSzGGPQnGQp
+bWhbgsshZWBhltthhbWtCsZNjrzpnQnnznnjtQFrjGjVFGnn
+bRDNddhNdDsZdNChmvDmmwqqvLqwSJDq
+TnSfPnCSmnSgpSTmfLzfMFLWFJJLWWsBsr
+jdQjcdqDVVwDcPsPzMRJMLqPqR
+PGhGchjhtZlTGTHCCb
+ZZRrJJqSqJwNFFphsGsLPJ
+blcMCflvTTPFFNpVvsFv
+CcTlltTmtmMdmCmnlllBDDSDQSwSjRDQSdswjR
+MCCPNsnQFWbvvTPF
+CcCVJJhjVJZRtcCclDDlbcbTcGFFDz
+HpjtVwVZfpjJVhZgCVtLmrBwdMrLsNNsMmdLqB
+TJTDTnrFzzdWgWGJSSMJwg
+LhPVttjtLmsPqqqVsVpsjLlgWlwHvGnlHWlgHlGgwvlP
+mQshLhmsnsqZcqhZqpshsLVpNTNbBfzTRBQdFRzNNFBTdbzR
+ZGqMLGqvJsJsMJmd
+PDVQPfPcrrcFrrzrTdgCjSSCzgszmlJjBj
+PfRtVfttVcWtVJrfbGqvwqLpRRwvpppH
+HmLmMSnnWnrTrnvpqFCHVGfzVFVHQj
+ttsstRhhcNwbswNtdwsdNPFfjzQppQPjfGGfQVPCpR
+bbsDNtDcbhstsSZLDmSSgCmnSS
+tfwBBLcJVrDnqvLv
+zmWWJRZhWRRRGRNdgSZGgWTvpnjvrDqvpHjjzrpnrPDnHj
+NdJmSGZWRhRNsghWTJmdGfQCtllCcFMwffBftsfMQc
+lTLgTghpGZJDBrnGWnnm
+VlRwlHttwqmHHbDWHJ
+twldzCvsRdsFFtRtSczTjSgMcfSpSzTM
+pBpMBTcSlNtMcTfFCmbPDzCDLb
+JgrjjJqhGZQrQrZhnJGDDCZfvPDdDzFFdzfmZL
+QHhqqnrVJJPhHrnGQgwMNwMMctcWRWSBMNtNsW
+FJrlhpcfDCcFWpNpwWwjNQwz
+RTTvPdbjWzMbnNNM
+GRZTGggGgtvjGcqrBcttcDlFhr
+pMRVdVbbMMMSdWWqHpCTvTjnBBBFFGGB
+smNfZgcsNrcmzggZszsgRnPGFHjBPTBTjGjPTBNj
+RmwgsmgfrzzsZtfgZLQQSVWlwbdMhlwdqQ
+mRRjPmLrrSmzSczSzPgVZFpTCpZCMWrZQMQrZJZT
+BvdbHNdnJtvBDbqqdBlvwvqpDQMpZQFMCsQCspZTMMCZCF
+nBlfbfbndJBHPfLRfmhhhhPL
+ScJDFBNLLbVRqVfZ
+rWrgmdMgnnBhBtnntf
+CwBWWMgCwddCgwsQjsrvNvlTJzSNHwNTHFJHzS
+vnddCrNpCgtjLdSdgCgCCvLnWqDhWBQhHqQHDqBhQHDHNNDl
+wPTVfVTJmZGJVJGffZBwHMWlWlHlWtbQDqbl
+mGsJVVJsTVTTmtJVzzTJjdSjjprzCvpSLSCjdnLg
+zLNggsVHmNNsssLmwzLQZLwDRvGQBqGGDDBBvvDBDqPhRG
+WrCjbtJdbFhBRglGgjqv
+JWCJcWcSdWcctnJCcJJJbcbmzwwznmgLzNzmLHmHZMwsZL
+JRRDNNhhszMTzNMwCG
+MnHPqmgmHjPnnvjqdmjFLQwLwTLwzTwTdGLCzS
+BnPPZqmcfqgqnnZmBmqjqhfWVJlRMlhWlRDlVsssbh
+nmTLTqsvqnwqsvwDPnLHdNVrMMHHCBlmVdmGNV
+RgRpcJhQRfQZcJbWhQpBHCjVCdjCVGdddMllHp
+fczbZhzbtcZfgRRBcWSPPwFsLSDswSwTsSzw
+rbFpzFCVBrrBZCjbCzHHBVdJllGDLsLrDtsswswstGJs
+QNhNNnNnnQhNWSnRhnJtdpJpJtMDGsGLLtsQ
+ScmRvNRNnWWvNvNvfpTccjVZbqgZgVzqHjCjTVTVVq
+BTppwCwBpwwBqnjlHcLBTHnbbSbDthsSSJgsnDDRgJRD
+FVGzzvrdMGSSsdtZtZgd
+QvQtvtGFlBLLjLQL
+gsWWsNMjwgPMPWnMjShHHZSZbmZbbmTSnb
+rlCvVQrCfqffpVjQRqCCvDDTTTmmZhZTmZhThFmhhZZhqb
+CDDVJpVfrJJVJLMNzMwWwLwj
+nHrcsZrssPcBPtQJLJtQQCZQpV
+GFWzNzNFdNbTMMqbGTqTqzqqdLCpfDQCtRVVCLtdCfQsdCCt
+TlNqGTWFNmMMszhGsmFTWGFzwHnvSjgPgvgSjllBvBnvwPBB
+mpMggjgMlmtjtGMwZpcSscBlcsSblhsfSdfs
+zzPVDRrLrCTQNCzNRTVFNLhBhBSqdQbcfSsJBJdbjJfB
+RPTRPTVNTFzVrHVDCrTHmHtwMvwWMmtwmGjWgvGv
+rLMcvfHVfMgLFvfNnBBzwRbBwnrGNs
+dttJjJCtdjmwzwBCRRCqcs
+TddDQDJDtQJtcJFpPQHPQMvfQlFL
+LQSqqpqTCSJcsDcqQMMhnnjMjppZhwHZbZ
+NRtvtmgmvdBffgtVCBWVRgFbPzHbMHbnwwjMPZfHbPjzPP
+RNtvCvNdgtNNmldgvCFRNVLsQLqJcQGJJrccGSlDLDLr
+GdwwqqqwGVtjdPvTCplbHTPbPzPTpp
+RpLmLLpFfNsgTzclhzClThgH
+ZFsWZLFZJsNsnWsnRsRfnfJQGBttjdGJjBvvwjdpjjttvj
+tfPzzLrrdrQlTlvn
+qJRBhNhNGVRBFRTlnJvCmvmJPCCl
+VVPDNchNMVFGRMFcRVBjsZZcttSLSZzzStcWtZ
+pTrwTrnjtttjprTSTNTQfcjcgPsPZfPgjdgdsQ
+mCmCzvzhmJDHzJDbhFCDPsgddcsfcdsbdgVRpdVs
+zqJzFCDhmqvGhMmCvmGhMCGJnSlnllSBLllLMtNpWtpNBnlt
+JBhJrFLhGrnJZrlcbffndnggfggf
+jqmWMGGSsqCsmpjmsDQzlcHgbtdzjjlVfctjHV
+GWSmSCspCsMSpRmSmqMMCBvFLJLhTTwFhRFLLBTwrv
+BCdWccqcqpQqrsNgGsWMgfNW
+lFttLzzLwnfsLrsNsNLG
+zjNlznlwvRPZnltwvPFnZRCbmjCcqjpcpQcqVVdbdVBm
+CwTbbCGNFHtHwwjSjJpzjLMdMMzT
+rscqqVvWgWrZMjrlmSzzmLrM
+WPqqZnPqgncnBQQVRbCDwRHGSFHPwRNw
+ZQnZwWjFvdsHwBJltfmfSlsqlJ
+gPprhMDTpMpPMVNqNRqNlJhltJdJ
+pLGCcCrgppCrVcMpdzjvzvjLwQQzFjwzHF
+NmmmvfqcvmLSQhCLvtvL
+TVlWTZVJZJsFbwWbQQhtQgLFCnSgghLt
+hZJTJZhwZlRJrJWHVlblMBffmqfdNMjdGdBBqqcH
+GJJfLfptGqqqnsVqVVjjDnNc
+mZPSvPmBCdmwdCLDshSbRnnDDhRL
+gvBrBvPBPPZCTLZmwmrgQdwfTJMHGzHfWffJzFzttHWFzW
+sBMvmzWzmFmNWJfffZNLfbqZbtZq
+jRQVRnhhppnVhjgnDLttLqbLqLQfDLss
+jRRgpGVGhwhnspgpRppwSnBvMMcWvGczGJJHdmHJmJFF
+VCLHFwHMhLghHHWhFFgWNMMVzmdmbvWdJqBPJPPBppqmBdzm
+SRTsjGZTsZZnSnGZGqdBmrqPvmqqqsPpmv
+GvQSGtZSQllVhtLMcLLNMH
+GsNdWpdVWGSHjFCWCqFFgqngvW
+mRQTcrLRmZTPRLPZfqqqHbDDDgFvFnvqzQ
+hfZHrwwmcZRwlLfwlmrRjMJJsVjslVNBGNjpVBBG
+pllpztRqBBvvGPpG
+QQhhZQbVcZQTPMWWGbvvbMHM
+cwgCQCLZChQwwLZVzCrzzqNCzrDqdFPF
+bgcLPvvpcbdsbpSsHRTCqsRfWfsHRm
+lZlQtthrnlVMmTHqqqqHSChB
+rDtlzttnlSNrMtQjZVrcgGDLLddcdcpPgPGJJd
+jvGbvLLQDSGlRmmSLjlDmRQggFBrMCwWdsBFWBFjdrrWrr
+PpTfcPZpNTVNpHzTzzzpPJhBcwrrhFsrMdFcMCBFhgMF
+JTTqdtfzfzJpqffNdTTHGtQRnmDQGGLQQlQRbblD
+CQQCshCMwgQhMdjWJFBPpbjgmmWj
+SNNvcGNSZSTDtGDcczJJBmzbjBJjmppbppms
+cDtfDVNTGGGNNrwLLwHdqLhfLs
+ngghZCChzhNjjNbbJfdh
+slPPRLlBBlVRMvRllLLHvcpcdFfJjvdFpfHfcZ
+RDZPZBLmPVWDVrQtnzSTmgTwmTSg
diff --git a/04/1.lua b/04/1.lua
new file mode 100644
index 0000000..100da50
--- /dev/null
+++ b/04/1.lua
@@ -0,0 +1,11 @@
+#!/usr/bin/env lua
+
+local c = 0
+for line in io.lines() do
+ local s1, e1, s2, e2 = line:match("(%d+)-(%d+),(%d+)-(%d+)")
+ s1, e1, s2, e2 = tonumber(s1), tonumber(e1), tonumber(s2), tonumber(e2)
+ if (s1 >= s2 and e1 <= e2) or (s2 >= s1 and e2 <= e1) then
+ c = c + 1
+ end
+end
+print(c)
diff --git a/04/2.lua b/04/2.lua
new file mode 100644
index 0000000..ae7d546
--- /dev/null
+++ b/04/2.lua
@@ -0,0 +1,16 @@
+#!/usr/bin/env lua
+
+local c = 0
+for line in io.lines() do
+ local s1, e1, s2, e2 = line:match("(%d+)-(%d+),(%d+)-(%d+)")
+ s1, e1, s2, e2 = tonumber(s1), tonumber(e1), tonumber(s2), tonumber(e2)
+ if
+ (s2 >= s1 and s2 <= e1) or
+ (e2 >= s1 and e2 <= e1) or
+ (s1 >= s2 and e1 <= e2) or
+ (s2 >= s1 and e2 <= e1)
+ then
+ c = c + 1
+ end
+end
+print(c)
diff --git a/04/ext.lua b/04/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/04/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/04/input.txt b/04/input.txt
new file mode 100644
index 0000000..c2c3af1
--- /dev/null
+++ b/04/input.txt
@@ -0,0 +1,1000 @@
+24-91,80-92
+28-93,5-94
+30-81,33-82
+28-97,59-72
+65-66,54-70
+35-35,5-36
+3-5,4-91
+73-97,20-72
+53-77,2-54
+47-96,48-95
+7-75,8-75
+66-89,67-86
+23-25,24-95
+97-98,5-98
+58-61,13-57
+53-62,52-52
+5-93,92-93
+52-61,34-61
+83-85,82-92
+90-90,46-91
+35-95,94-98
+89-91,72-90
+3-98,81-97
+26-26,27-96
+41-54,53-55
+9-43,8-54
+14-14,14-86
+36-50,50-50
+79-84,78-78
+44-69,70-73
+6-51,5-5
+40-40,39-73
+10-65,9-11
+1-2,4-99
+8-36,5-5
+72-72,25-71
+66-66,67-96
+69-79,62-68
+46-57,5-56
+97-98,39-98
+98-99,4-97
+9-94,10-84
+3-15,6-14
+9-10,11-80
+9-9,9-69
+60-79,78-82
+50-70,70-90
+12-12,13-64
+8-92,3-8
+29-79,30-78
+96-97,5-97
+13-75,59-63
+45-78,45-79
+38-70,38-69
+13-33,19-25
+79-87,47-88
+9-67,8-67
+51-59,58-60
+28-61,28-62
+7-90,33-87
+5-5,5-33
+78-85,43-84
+18-94,18-95
+42-42,42-81
+12-93,11-92
+16-64,17-64
+2-99,1-98
+32-68,31-69
+14-73,15-15
+43-55,43-81
+13-65,66-66
+79-85,79-91
+81-84,52-80
+21-68,22-67
+32-80,33-80
+17-76,83-83
+11-65,39-65
+32-85,33-84
+25-58,26-57
+14-28,8-15
+64-87,20-86
+62-99,29-61
+26-40,27-47
+9-76,9-83
+42-90,43-89
+5-97,5-93
+6-16,15-87
+45-91,9-91
+34-34,35-85
+21-56,21-21
+38-79,47-80
+79-98,36-96
+25-99,73-99
+4-51,12-50
+9-10,14-50
+65-89,26-48
+17-19,18-18
+39-60,34-75
+61-76,61-61
+38-90,37-37
+36-67,68-68
+6-19,10-20
+3-91,3-97
+35-93,35-94
+63-89,59-62
+46-76,66-76
+31-63,31-64
+17-44,33-37
+35-43,35-68
+11-13,12-90
+39-83,40-63
+41-99,24-86
+41-76,41-56
+9-62,10-62
+3-92,92-92
+36-41,36-46
+6-21,5-26
+7-98,5-97
+24-95,9-35
+4-82,3-81
+45-74,7-35
+7-74,59-75
+62-68,32-61
+45-66,44-83
+36-94,36-37
+57-76,57-77
+34-71,71-72
+95-95,95-95
+58-75,57-79
+48-75,40-53
+21-94,21-31
+55-55,3-56
+48-80,3-80
+10-81,9-81
+13-66,6-7
+1-91,90-92
+4-5,4-83
+22-76,20-45
+4-13,3-3
+10-22,6-6
+18-91,18-90
+50-53,51-52
+23-33,21-24
+1-49,1-48
+8-40,8-39
+11-97,2-96
+79-81,55-75
+82-95,81-81
+9-10,10-68
+59-59,58-58
+2-99,2-2
+22-36,21-22
+49-77,49-50
+7-21,7-7
+65-98,66-72
+1-43,39-40
+25-60,25-25
+12-79,38-80
+89-90,26-90
+52-72,53-53
+15-96,97-99
+4-8,4-72
+2-73,72-72
+11-35,15-35
+99-99,1-98
+72-83,8-88
+29-35,1-3
+32-72,15-33
+50-86,51-51
+27-65,59-87
+11-11,11-52
+16-87,17-87
+60-62,61-61
+50-90,81-92
+86-86,43-86
+42-82,11-82
+93-94,3-94
+22-91,90-92
+14-91,13-75
+11-28,14-19
+76-85,75-77
+7-98,6-98
+25-40,2-41
+4-96,12-90
+61-75,1-62
+17-97,16-17
+38-93,38-52
+16-34,17-39
+61-78,29-79
+7-91,90-90
+30-59,20-60
+5-98,4-98
+55-55,55-99
+1-95,1-94
+15-87,14-14
+56-92,23-55
+9-97,46-58
+9-93,8-94
+4-10,16-96
+52-53,24-53
+11-59,10-59
+61-76,53-65
+26-45,45-46
+4-38,38-92
+46-46,46-87
+41-61,40-95
+7-17,2-17
+26-27,27-33
+58-92,58-90
+13-96,13-98
+76-76,1-77
+12-97,12-96
+30-30,29-79
+38-86,38-86
+6-94,93-93
+5-9,11-55
+52-52,51-51
+29-88,29-29
+22-65,2-22
+51-60,57-77
+16-78,4-77
+99-99,40-98
+90-90,71-91
+16-86,16-87
+37-92,37-86
+42-79,48-56
+25-47,24-49
+32-35,33-36
+64-75,5-53
+18-53,32-54
+59-74,64-75
+22-76,21-76
+3-90,3-90
+98-98,15-99
+4-17,17-77
+97-97,7-97
+94-95,13-95
+19-56,4-56
+8-12,12-95
+9-75,9-21
+1-45,25-43
+65-82,65-66
+27-63,27-27
+97-99,5-96
+15-85,14-15
+24-75,24-74
+34-81,34-82
+29-97,18-96
+13-80,13-17
+7-93,8-93
+81-82,16-82
+16-59,60-98
+88-93,22-88
+91-93,41-92
+16-57,16-85
+19-46,15-20
+16-52,16-72
+7-7,8-61
+80-86,80-82
+65-75,1-88
+7-78,1-77
+5-94,4-94
+59-88,60-87
+69-73,69-70
+16-16,17-52
+50-91,51-91
+39-57,38-40
+12-73,72-74
+2-4,10-66
+36-38,36-71
+23-80,63-98
+85-91,40-84
+47-48,6-48
+1-3,3-97
+33-33,33-34
+16-18,17-61
+81-83,1-82
+53-82,15-54
+54-84,63-84
+1-98,97-97
+3-77,4-61
+34-79,35-54
+24-24,25-82
+6-99,4-6
+29-49,30-49
+1-2,1-90
+1-37,1-1
+3-4,8-62
+10-85,11-86
+57-59,54-63
+3-93,1-93
+58-59,9-59
+37-38,25-38
+32-96,31-96
+2-91,23-90
+31-70,37-47
+18-77,67-76
+58-91,66-97
+21-44,45-45
+60-61,61-78
+12-12,11-55
+43-65,15-66
+21-70,20-21
+10-10,10-88
+11-71,12-72
+75-75,50-76
+29-29,11-28
+4-81,1-98
+36-54,37-53
+8-92,91-93
+37-76,37-77
+74-99,75-99
+3-98,12-97
+19-83,20-83
+97-99,2-96
+45-45,45-95
+3-87,2-86
+66-74,50-65
+12-12,12-77
+1-93,5-85
+40-52,43-82
+5-69,9-70
+2-11,10-31
+31-74,31-99
+40-96,41-64
+12-38,11-13
+18-55,18-88
+54-84,53-54
+10-95,5-94
+32-70,63-71
+20-84,8-47
+61-87,86-87
+16-31,4-16
+1-97,1-96
+1-5,6-28
+73-73,38-72
+23-50,22-22
+27-93,27-36
+99-99,6-99
+99-99,1-99
+99-99,34-75
+7-24,18-24
+5-43,9-18
+3-6,5-62
+35-67,17-66
+16-45,8-44
+2-90,2-91
+48-97,96-97
+35-74,7-73
+25-86,85-85
+13-78,13-89
+2-79,79-79
+5-98,1-98
+66-66,64-68
+15-85,20-86
+25-41,42-73
+18-30,29-29
+16-20,16-75
+4-6,5-89
+7-56,8-57
+11-64,11-65
+7-7,9-86
+6-68,6-72
+4-92,4-91
+26-28,25-65
+2-57,1-58
+96-98,22-95
+2-82,82-82
+96-98,95-97
+11-91,90-90
+8-87,7-8
+64-92,76-93
+2-4,4-30
+53-92,49-61
+17-50,18-51
+8-64,7-64
+35-60,5-36
+1-6,6-85
+7-62,62-62
+38-42,50-54
+3-3,3-60
+39-48,50-86
+1-97,16-89
+44-72,73-84
+14-68,16-68
+7-55,8-8
+13-79,19-79
+31-94,95-97
+30-63,19-31
+15-83,52-83
+27-27,27-83
+72-72,3-71
+35-99,1-98
+29-80,29-88
+40-71,20-70
+61-93,60-94
+3-93,1-93
+4-4,5-99
+22-69,10-26
+42-74,42-75
+18-39,19-38
+37-43,43-92
+29-31,16-30
+7-95,7-7
+72-73,72-72
+9-90,91-98
+7-51,8-47
+28-88,89-94
+3-94,4-94
+20-41,37-51
+19-34,4-34
+13-63,64-68
+5-98,5-90
+24-93,24-73
+26-56,11-56
+2-75,33-76
+1-99,2-96
+44-55,54-56
+64-99,64-80
+41-64,41-64
+15-80,17-75
+57-59,58-90
+5-12,7-58
+16-50,17-17
+41-48,40-47
+31-32,31-92
+1-91,1-37
+53-67,49-77
+3-75,2-79
+55-76,47-60
+42-42,42-58
+20-42,20-41
+94-98,51-97
+1-44,1-45
+19-50,2-51
+28-82,29-94
+18-97,18-18
+41-89,14-41
+3-36,5-35
+64-85,31-86
+72-96,95-96
+11-18,18-87
+19-63,62-62
+16-17,16-94
+97-97,1-98
+22-95,23-96
+16-16,17-35
+25-96,43-96
+50-87,50-50
+3-92,3-89
+20-78,20-20
+53-53,54-89
+5-43,8-44
+39-85,38-38
+47-76,46-77
+35-78,77-79
+28-47,27-29
+39-39,36-40
+87-98,76-78
+30-35,30-63
+39-53,21-30
+30-30,30-93
+65-97,19-96
+74-77,73-98
+21-95,6-22
+36-89,47-88
+99-99,8-98
+22-68,25-69
+38-90,38-42
+39-88,17-39
+79-85,78-84
+11-74,7-7
+38-45,38-45
+57-90,56-58
+1-2,3-83
+2-48,7-49
+30-95,30-96
+71-96,71-79
+4-89,96-99
+44-93,44-99
+16-16,15-98
+7-95,10-91
+12-15,23-41
+39-62,38-92
+5-10,7-12
+51-91,14-52
+12-12,12-76
+54-58,56-59
+9-9,10-56
+11-42,49-70
+14-76,19-77
+24-33,27-33
+23-98,23-88
+35-78,51-85
+1-1,3-86
+1-2,2-94
+30-36,22-58
+48-48,47-51
+7-82,83-99
+31-77,31-31
+4-6,9-97
+63-85,10-86
+30-80,28-81
+1-1,1-98
+7-97,18-89
+52-89,21-88
+9-69,14-70
+71-72,34-72
+55-61,10-97
+59-88,55-55
+31-54,31-53
+26-35,45-98
+36-79,6-99
+2-3,2-41
+6-85,6-84
+9-97,1-95
+16-45,43-46
+5-81,4-80
+4-91,90-92
+44-86,30-87
+72-74,53-73
+20-20,15-15
+40-62,40-40
+28-99,34-62
+4-89,4-94
+42-58,46-59
+43-72,42-81
+81-83,22-82
+29-43,10-53
+47-55,46-70
+10-84,4-5
+10-93,11-94
+38-74,74-74
+14-48,13-14
+11-91,10-10
+9-11,10-10
+7-60,6-42
+3-93,92-92
+14-69,14-68
+32-45,41-46
+2-99,3-99
+16-83,15-83
+39-44,39-40
+2-76,75-77
+91-92,20-82
+19-50,24-51
+31-77,9-78
+3-99,70-99
+35-36,36-65
+6-24,7-68
+64-91,64-92
+95-96,95-96
+44-58,2-57
+61-61,44-62
+11-98,11-55
+38-47,20-46
+8-15,8-97
+29-53,27-29
+84-95,59-89
+61-62,61-85
+19-77,20-46
+88-92,92-92
+2-99,98-99
+10-79,10-10
+6-91,20-88
+14-74,10-10
+13-34,12-35
+27-87,86-86
+1-1,1-86
+28-31,27-79
+38-80,21-73
+23-64,22-24
+38-94,93-95
+96-98,10-95
+50-51,49-50
+74-88,81-89
+27-62,24-28
+49-49,48-92
+3-5,5-8
+47-87,47-76
+66-86,50-67
+78-96,77-77
+3-91,2-92
+88-91,5-87
+47-88,49-88
+56-80,55-79
+96-96,2-96
+19-38,30-39
+6-93,93-93
+36-98,36-36
+37-37,14-37
+17-17,18-67
+10-83,66-88
+25-89,28-88
+47-99,1-97
+87-87,18-86
+55-60,55-55
+15-15,23-61
+33-67,32-77
+37-42,38-42
+41-41,23-40
+54-66,53-68
+57-98,53-76
+14-92,14-93
+12-96,12-13
+43-43,14-42
+23-91,45-54
+36-59,58-58
+6-6,7-90
+31-38,37-39
+8-94,7-94
+94-94,87-94
+35-78,36-91
+37-90,68-75
+93-93,9-92
+39-80,35-84
+16-89,16-82
+1-86,2-37
+22-75,31-97
+1-97,96-98
+70-82,66-81
+8-94,93-94
+5-94,5-5
+4-75,5-74
+65-65,44-80
+33-97,96-97
+4-58,48-59
+5-99,5-5
+62-70,49-69
+37-42,36-41
+1-98,1-99
+91-92,5-92
+80-89,1-80
+15-92,74-93
+26-93,25-25
+43-46,41-45
+14-14,15-75
+29-29,30-99
+64-98,64-97
+14-86,87-99
+5-6,5-27
+50-75,34-75
+9-24,23-94
+77-78,76-77
+11-27,2-43
+98-99,58-99
+8-87,8-9
+35-35,35-38
+22-85,2-23
+39-84,49-70
+7-15,15-77
+98-98,7-97
+42-47,15-41
+27-34,27-27
+37-37,38-91
+33-81,33-80
+30-51,11-52
+79-80,76-80
+59-98,13-77
+52-55,33-53
+3-67,68-68
+3-72,72-83
+20-43,24-51
+75-89,29-76
+31-56,55-56
+25-50,24-49
+93-99,98-98
+2-76,2-75
+8-80,8-81
+16-18,45-60
+1-1,2-96
+55-82,54-93
+60-89,83-88
+55-88,11-66
+2-99,98-98
+83-85,11-84
+54-69,12-55
+10-10,10-74
+11-21,16-22
+50-71,68-75
+28-99,11-78
+41-51,39-87
+10-11,16-92
+72-72,13-72
+92-92,2-91
+27-46,45-47
+13-47,9-46
+1-99,2-18
+21-96,21-95
+5-5,5-61
+66-66,59-66
+30-82,30-77
+19-19,20-58
+82-89,2-99
+15-15,15-99
+10-10,11-51
+47-97,47-92
+18-20,19-56
+7-11,20-82
+24-73,24-70
+45-45,46-50
+13-91,65-74
+19-82,19-77
+26-98,2-58
+87-88,17-87
+44-51,22-51
+3-95,11-86
+5-49,15-50
+14-77,13-77
+98-99,1-99
+15-60,14-65
+4-8,8-21
+39-86,85-97
+25-92,24-24
+29-29,29-78
+9-63,8-8
+76-76,14-55
+15-88,16-84
+9-89,90-94
+4-89,3-90
+4-33,32-64
+4-98,2-98
+78-86,20-81
+63-89,62-88
+8-56,7-97
+25-44,25-45
+3-32,4-8
+53-86,53-87
+5-85,3-95
+18-24,8-94
+93-98,92-94
+39-53,54-69
+28-73,17-72
+3-93,4-9
+8-46,8-16
+3-3,2-78
+13-22,23-26
+71-72,47-72
+3-8,7-20
+6-73,1-6
+31-99,33-91
+90-99,89-89
+9-81,7-7
+58-59,58-63
+64-83,83-83
+4-5,4-5
+54-92,19-86
+7-8,8-63
+31-48,48-80
+22-86,8-22
+76-91,73-76
+62-78,9-79
+16-93,19-94
+5-95,5-93
+13-80,14-81
+6-80,79-79
+78-84,77-79
+40-83,78-84
+11-68,5-6
+81-81,23-82
+1-27,29-29
+50-60,51-53
+44-49,44-45
+52-62,51-98
+1-98,1-99
+39-97,98-99
+25-52,15-92
+34-99,34-34
+10-35,5-69
+11-11,12-69
+47-53,53-53
+92-94,7-93
+8-8,8-81
+28-85,28-84
+39-88,33-34
+66-83,65-86
+45-94,45-61
+36-60,14-36
+10-40,11-90
+23-75,24-51
+61-63,7-62
+68-83,82-82
+55-60,55-73
+9-44,2-44
+11-95,95-97
+10-62,9-65
+81-81,82-98
+6-56,6-57
+17-50,34-50
+4-34,34-34
+20-98,19-21
+25-39,25-58
+40-79,8-80
+14-57,14-58
+94-95,67-95
+17-24,15-24
+16-18,17-89
+6-58,5-57
+6-99,6-37
+3-3,3-17
+46-74,47-66
+16-38,17-17
+22-97,13-23
+99-99,38-99
+52-65,62-62
+22-24,17-23
+60-98,1-97
+3-71,7-21
+10-94,10-95
+38-90,38-89
+24-45,23-62
+12-14,13-95
+37-87,38-53
+14-45,13-45
+77-77,27-77
+25-83,17-25
+21-94,9-99
+73-73,49-73
+50-82,49-64
+7-95,95-95
+64-86,63-87
+33-85,2-50
+33-87,34-53
+13-31,30-31
+62-63,63-91
+9-91,91-92
+16-72,15-72
+32-40,39-40
+10-98,10-93
+1-3,2-18
+12-62,12-43
+35-68,34-69
+50-52,32-51
+4-37,4-35
+6-94,65-96
+63-88,44-62
+17-49,9-49
+20-49,20-48
+7-91,6-91
+33-63,34-63
+62-63,63-89
+9-62,10-62
+31-31,32-38
+77-87,15-87
+34-89,42-89
+1-2,3-79
+59-65,58-87
+4-57,2-56
+34-54,13-34
+41-95,5-54
+28-76,77-86
+13-13,12-42
+12-97,12-96
+20-27,26-50
+70-84,70-72
+47-75,48-69
+5-75,75-75
+25-80,22-79
+28-78,79-79
+89-89,11-93
+39-74,75-75
+20-88,20-87
+79-80,37-78
+7-17,16-18
+31-68,31-68
+18-36,18-18
+73-96,35-73
+28-98,27-29
+26-75,19-74
+2-4,3-48
+2-3,4-79
+4-93,92-92
+58-89,70-89
+1-99,2-68
+57-78,56-56
+10-46,10-39
+6-61,6-60
+51-90,50-90
+27-90,27-28
+45-45,1-44
+18-31,13-31
+25-51,18-52
+7-28,4-29
+93-93,6-93
+9-50,8-51
+92-94,1-93
+29-91,30-30
+25-75,24-75
+55-55,15-55
+70-73,62-71
+8-84,8-42
+50-76,46-57
+45-80,44-79
+6-86,7-87
+8-83,7-82
+4-30,8-31
+57-95,58-96
+49-50,50-79
+90-92,89-95
+24-24,25-98
+60-75,69-75
+9-83,20-69
+32-33,32-36
+3-3,2-98
+1-84,83-85
+69-99,99-99
+92-97,87-92
+71-96,72-97
+49-49,49-66
+18-18,35-75
+7-94,7-7
+3-48,45-92
+47-86,86-86
+10-42,7-66
+11-85,12-96
+39-77,17-39
+14-24,3-23
+23-23,23-23
+66-66,54-67
+29-29,30-71
+20-89,56-90
+41-56,40-57
+1-99,3-97
+4-92,4-98
+7-39,38-38
+69-71,68-73
+95-97,13-96
+55-84,54-75
+61-79,64-88
+97-98,3-98
+9-42,6-41
+36-86,35-36
+8-91,9-86
+16-45,58-79
+43-43,11-44
+8-74,9-73
+2-78,3-78
+76-86,83-94
+1-96,2-97
+49-79,49-78
+1-1,3-76
+74-89,21-90
+7-97,1-2
+38-73,73-73
+24-76,29-77
+4-43,2-2
+19-20,20-96
+56-77,51-77
+10-82,10-65
+58-71,17-94
+20-74,74-87
+28-84,28-83
+5-81,87-89
+9-40,9-24
+38-80,39-81
+36-36,36-37
+76-76,33-76
+62-62,1-62
+11-27,21-25
+13-59,44-59
+36-89,36-37
+53-70,45-69
+5-42,41-41
+49-49,9-50
+35-59,12-35
+32-63,18-63
+38-69,37-71
+70-97,96-96
+52-80,53-75
+43-43,44-94
+49-83,52-84
+11-76,10-98
+4-91,90-92
+26-54,26-30
+57-86,57-58
+3-97,96-96
+1-1,3-98
+24-36,36-67
+8-64,3-64
+39-98,14-98
+59-62,59-63
+30-42,30-31
+3-87,2-4
+6-79,7-80
+7-66,67-80
+30-48,18-47
+91-96,82-95
+4-78,4-5
+67-68,24-68
+7-7,8-59
+1-83,5-79
+50-67,34-66
+27-74,26-73
+7-94,94-97
+2-27,3-18
+13-55,56-56
+3-3,4-40
+52-66,52-52
+40-40,39-81
+3-54,1-47
diff --git a/04/sample.txt b/04/sample.txt
new file mode 100644
index 0000000..9f9e9cf
--- /dev/null
+++ b/04/sample.txt
@@ -0,0 +1,6 @@
+2-4,6-8
+2-3,4-5
+5-7,7-9
+2-8,3-7
+6-6,4-6
+2-6,4-8
diff --git a/05/1.lua b/05/1.lua
new file mode 100644
index 0000000..e4eaa6a
--- /dev/null
+++ b/05/1.lua
@@ -0,0 +1,29 @@
+#!/usr/bin/env lua
+local stacks
+for line in io.lines() do
+ if not stacks then -- first line
+ stacks = {}
+ local num_stacks = math.ceil(#line / 4)
+ for i = 1, num_stacks do
+ stacks[i] = {}
+ end
+ end
+ if line:sub(2,2) == "1" then break end -- end of crates
+ for i = 1, #line, 4 do
+ local letter = line:sub(i+1,i+1)
+ if letter ~= " " then
+ local stacknum = math.ceil(i/4)
+ table.insert(stacks[stacknum],1,letter)
+ end
+ end
+end
+for line in io.lines() do break end -- empty line between crates and orders
+for line in io.lines() do
+ local amt, from, to = line:match("move (%d+) from (%d+) to (%d+)")
+ amt, from, to = tonumber(amt), tonumber(from), tonumber(to)
+ for i = 1, amt do
+ table.insert(stacks[to],table.remove(stacks[from]))
+ end
+end
+table.insert(stacks,{"\n"})
+for _,c in ipairs(stacks) do io.write(c[#c]) end
diff --git a/05/2.lua b/05/2.lua
new file mode 100644
index 0000000..a132630
--- /dev/null
+++ b/05/2.lua
@@ -0,0 +1,38 @@
+#!/usr/bin/env lua
+
+local stacks
+for line in io.lines() do
+ if not stacks then -- first line
+ stacks = {}
+ local num_stacks = math.ceil(#line / 4)
+ for i = 1, num_stacks do
+ stacks[i] = {}
+ end
+ end
+ if line:sub(2,2) == "1" then
+ break -- end of crates
+ end
+ for i = 1, #line, 4 do
+ local letter = line:sub(i+1,i+1)
+ if letter ~= " " then
+ table.insert(stacks[math.ceil(i/4)],1,letter)
+ end
+ end
+end
+for line in io.lines() do break end -- empty line between crates and orders
+for line in io.lines() do
+ local amt, from, to = line:match("move (%d+) from (%d+) to (%d+)")
+ amt, from, to = tonumber(amt), tonumber(from), tonumber(to)
+ local crates = {}
+ for i = 1, amt do
+ table.insert(crates, table.remove(stacks[from]))
+ end
+ for i = 1, #crates do
+ table.insert(stacks[to], table.remove(crates))
+ end
+end
+local msg = {}
+for _,c in pairs(stacks) do
+ table.insert(msg,c[#c])
+end
+print(table.concat(msg))
diff --git a/05/ext.lua b/05/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/05/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/05/input.txt b/05/input.txt
new file mode 100644
index 0000000..6b8d095
--- /dev/null
+++ b/05/input.txt
@@ -0,0 +1,512 @@
+ [V] [G] [H]
+[Z] [H] [Z] [T] [S]
+[P] [D] [F] [B] [V] [Q]
+[B] [M] [V] [N] [F] [D] [N]
+[Q] [Q] [D] [F] [Z] [Z] [P] [M]
+[M] [Z] [R] [D] [Q] [V] [T] [F] [R]
+[D] [L] [H] [G] [F] [Q] [M] [G] [W]
+[N] [C] [Q] [H] [N] [D] [Q] [M] [B]
+ 1 2 3 4 5 6 7 8 9
+
+move 3 from 2 to 5
+move 2 from 9 to 6
+move 4 from 7 to 1
+move 7 from 3 to 4
+move 2 from 9 to 8
+move 8 from 8 to 6
+move 1 from 7 to 4
+move 8 from 6 to 4
+move 4 from 5 to 7
+move 3 from 4 to 9
+move 2 from 6 to 3
+move 11 from 4 to 1
+move 1 from 3 to 4
+move 2 from 3 to 1
+move 1 from 7 to 6
+move 14 from 1 to 6
+move 7 from 4 to 3
+move 2 from 5 to 9
+move 5 from 6 to 4
+move 9 from 6 to 1
+move 3 from 4 to 8
+move 1 from 7 to 6
+move 3 from 4 to 1
+move 7 from 3 to 8
+move 5 from 9 to 5
+move 4 from 1 to 4
+move 3 from 7 to 2
+move 5 from 6 to 2
+move 3 from 4 to 1
+move 7 from 8 to 5
+move 3 from 6 to 8
+move 11 from 2 to 1
+move 1 from 4 to 3
+move 1 from 3 to 9
+move 2 from 2 to 9
+move 8 from 5 to 4
+move 1 from 1 to 7
+move 1 from 9 to 5
+move 8 from 4 to 1
+move 1 from 6 to 8
+move 2 from 9 to 1
+move 4 from 5 to 3
+move 2 from 7 to 3
+move 40 from 1 to 2
+move 24 from 2 to 9
+move 1 from 5 to 6
+move 11 from 2 to 3
+move 9 from 3 to 5
+move 12 from 9 to 4
+move 6 from 5 to 7
+move 4 from 7 to 4
+move 2 from 5 to 1
+move 2 from 1 to 9
+move 1 from 6 to 8
+move 9 from 4 to 8
+move 6 from 4 to 9
+move 17 from 9 to 6
+move 1 from 4 to 6
+move 17 from 6 to 5
+move 1 from 1 to 4
+move 2 from 7 to 9
+move 1 from 6 to 7
+move 2 from 2 to 9
+move 2 from 7 to 2
+move 6 from 3 to 8
+move 3 from 5 to 9
+move 1 from 4 to 9
+move 2 from 3 to 7
+move 4 from 5 to 6
+move 1 from 7 to 4
+move 1 from 4 to 2
+move 1 from 7 to 5
+move 9 from 8 to 1
+move 1 from 1 to 2
+move 2 from 9 to 3
+move 7 from 2 to 7
+move 1 from 9 to 5
+move 12 from 8 to 7
+move 3 from 1 to 9
+move 2 from 6 to 4
+move 9 from 9 to 3
+move 1 from 6 to 7
+move 1 from 9 to 5
+move 1 from 6 to 1
+move 9 from 7 to 1
+move 7 from 1 to 8
+move 4 from 3 to 9
+move 5 from 7 to 1
+move 3 from 9 to 1
+move 4 from 7 to 2
+move 12 from 1 to 5
+move 2 from 9 to 4
+move 7 from 8 to 2
+move 7 from 5 to 7
+move 4 from 3 to 4
+move 1 from 8 to 1
+move 2 from 2 to 1
+move 2 from 3 to 1
+move 3 from 2 to 7
+move 13 from 5 to 4
+move 1 from 8 to 3
+move 1 from 3 to 8
+move 1 from 3 to 5
+move 1 from 8 to 7
+move 17 from 4 to 8
+move 5 from 2 to 6
+move 2 from 1 to 6
+move 5 from 6 to 3
+move 9 from 7 to 1
+move 4 from 4 to 3
+move 1 from 6 to 2
+move 4 from 7 to 4
+move 1 from 6 to 5
+move 2 from 3 to 2
+move 15 from 1 to 4
+move 6 from 5 to 4
+move 4 from 3 to 5
+move 4 from 5 to 2
+move 2 from 2 to 4
+move 11 from 8 to 1
+move 2 from 8 to 3
+move 5 from 3 to 7
+move 4 from 2 to 8
+move 2 from 2 to 9
+move 4 from 7 to 8
+move 11 from 4 to 6
+move 2 from 5 to 4
+move 3 from 6 to 9
+move 4 from 1 to 4
+move 15 from 4 to 9
+move 1 from 7 to 3
+move 2 from 1 to 2
+move 6 from 4 to 5
+move 11 from 8 to 2
+move 16 from 9 to 4
+move 2 from 9 to 1
+move 4 from 2 to 3
+move 8 from 4 to 9
+move 1 from 8 to 7
+move 5 from 4 to 7
+move 6 from 7 to 3
+move 10 from 9 to 5
+move 5 from 3 to 1
+move 1 from 1 to 4
+move 5 from 1 to 9
+move 5 from 1 to 7
+move 5 from 4 to 1
+move 4 from 1 to 6
+move 3 from 1 to 9
+move 10 from 5 to 9
+move 2 from 7 to 1
+move 5 from 3 to 6
+move 4 from 5 to 7
+move 4 from 2 to 6
+move 2 from 5 to 6
+move 5 from 2 to 7
+move 18 from 6 to 1
+move 5 from 9 to 2
+move 7 from 9 to 6
+move 16 from 1 to 7
+move 4 from 6 to 1
+move 1 from 2 to 6
+move 2 from 2 to 6
+move 1 from 2 to 4
+move 4 from 9 to 3
+move 1 from 2 to 8
+move 5 from 7 to 5
+move 2 from 9 to 3
+move 1 from 5 to 9
+move 7 from 3 to 4
+move 1 from 9 to 7
+move 8 from 1 to 9
+move 1 from 8 to 9
+move 3 from 6 to 9
+move 17 from 7 to 5
+move 3 from 4 to 8
+move 3 from 4 to 2
+move 3 from 8 to 3
+move 3 from 3 to 7
+move 7 from 9 to 3
+move 6 from 5 to 9
+move 4 from 9 to 3
+move 10 from 7 to 2
+move 15 from 5 to 2
+move 4 from 6 to 3
+move 1 from 3 to 2
+move 23 from 2 to 5
+move 2 from 4 to 6
+move 2 from 6 to 7
+move 1 from 7 to 2
+move 1 from 6 to 9
+move 5 from 9 to 8
+move 3 from 8 to 7
+move 5 from 2 to 6
+move 2 from 2 to 3
+move 2 from 6 to 3
+move 3 from 6 to 2
+move 3 from 6 to 8
+move 10 from 5 to 9
+move 2 from 7 to 5
+move 1 from 5 to 8
+move 13 from 9 to 5
+move 6 from 5 to 6
+move 1 from 6 to 1
+move 1 from 7 to 3
+move 1 from 7 to 3
+move 13 from 5 to 6
+move 3 from 3 to 5
+move 1 from 2 to 1
+move 4 from 8 to 9
+move 2 from 2 to 6
+move 2 from 5 to 3
+move 2 from 3 to 6
+move 5 from 6 to 4
+move 9 from 5 to 9
+move 10 from 6 to 9
+move 1 from 1 to 7
+move 3 from 3 to 9
+move 1 from 8 to 1
+move 3 from 6 to 3
+move 1 from 7 to 6
+move 1 from 8 to 7
+move 2 from 6 to 1
+move 2 from 6 to 4
+move 3 from 4 to 6
+move 2 from 1 to 4
+move 10 from 9 to 6
+move 6 from 4 to 9
+move 17 from 9 to 1
+move 4 from 9 to 5
+move 19 from 1 to 7
+move 4 from 5 to 6
+move 1 from 9 to 3
+move 5 from 3 to 4
+move 5 from 4 to 8
+move 17 from 6 to 9
+move 17 from 9 to 2
+move 1 from 6 to 1
+move 1 from 1 to 2
+move 1 from 8 to 3
+move 2 from 3 to 2
+move 5 from 7 to 1
+move 1 from 7 to 3
+move 5 from 2 to 9
+move 4 from 8 to 2
+move 2 from 7 to 8
+move 3 from 9 to 3
+move 7 from 3 to 9
+move 2 from 8 to 7
+move 8 from 2 to 9
+move 5 from 9 to 6
+move 4 from 3 to 9
+move 11 from 2 to 3
+move 2 from 6 to 5
+move 1 from 9 to 4
+move 10 from 7 to 3
+move 3 from 1 to 8
+move 2 from 6 to 7
+move 15 from 3 to 8
+move 2 from 3 to 2
+move 2 from 1 to 3
+move 14 from 9 to 6
+move 1 from 4 to 9
+move 14 from 6 to 3
+move 5 from 7 to 2
+move 2 from 9 to 2
+move 1 from 5 to 3
+move 1 from 5 to 8
+move 12 from 3 to 7
+move 13 from 7 to 8
+move 1 from 6 to 7
+move 5 from 2 to 6
+move 1 from 6 to 2
+move 1 from 7 to 6
+move 4 from 6 to 8
+move 31 from 8 to 7
+move 15 from 7 to 8
+move 7 from 7 to 5
+move 4 from 2 to 3
+move 1 from 6 to 2
+move 3 from 5 to 8
+move 9 from 7 to 4
+move 2 from 2 to 9
+move 4 from 5 to 6
+move 13 from 3 to 9
+move 3 from 3 to 5
+move 13 from 9 to 1
+move 1 from 3 to 2
+move 2 from 6 to 5
+move 1 from 3 to 4
+move 2 from 6 to 5
+move 1 from 9 to 1
+move 6 from 8 to 9
+move 5 from 5 to 2
+move 2 from 9 to 8
+move 2 from 1 to 6
+move 1 from 9 to 4
+move 12 from 8 to 4
+move 2 from 6 to 9
+move 11 from 4 to 3
+move 9 from 4 to 2
+move 4 from 9 to 7
+move 2 from 5 to 6
+move 8 from 3 to 4
+move 2 from 3 to 9
+move 2 from 8 to 9
+move 4 from 4 to 9
+move 2 from 6 to 7
+move 1 from 3 to 7
+move 2 from 9 to 1
+move 5 from 4 to 2
+move 9 from 1 to 8
+move 1 from 4 to 9
+move 4 from 9 to 3
+move 1 from 3 to 6
+move 4 from 8 to 7
+move 1 from 3 to 6
+move 4 from 1 to 7
+move 1 from 3 to 8
+move 1 from 1 to 8
+move 2 from 6 to 7
+move 2 from 9 to 1
+move 1 from 4 to 5
+move 1 from 1 to 5
+move 11 from 8 to 4
+move 12 from 2 to 8
+move 1 from 9 to 8
+move 2 from 4 to 5
+move 1 from 1 to 8
+move 5 from 2 to 1
+move 1 from 3 to 2
+move 9 from 7 to 3
+move 6 from 7 to 5
+move 1 from 3 to 4
+move 1 from 5 to 1
+move 4 from 2 to 5
+move 4 from 4 to 1
+move 2 from 7 to 3
+move 3 from 4 to 1
+move 6 from 3 to 7
+move 9 from 8 to 7
+move 3 from 8 to 7
+move 11 from 5 to 9
+move 2 from 4 to 8
+move 5 from 8 to 7
+move 1 from 9 to 8
+move 12 from 9 to 5
+move 1 from 4 to 5
+move 5 from 1 to 8
+move 6 from 8 to 3
+move 1 from 3 to 8
+move 3 from 7 to 9
+move 4 from 7 to 6
+move 3 from 1 to 3
+move 3 from 1 to 6
+move 1 from 8 to 1
+move 7 from 6 to 2
+move 3 from 1 to 8
+move 7 from 3 to 4
+move 3 from 4 to 1
+move 1 from 4 to 2
+move 3 from 1 to 2
+move 1 from 7 to 6
+move 1 from 8 to 5
+move 9 from 5 to 3
+move 1 from 6 to 9
+move 11 from 3 to 6
+move 1 from 4 to 1
+move 1 from 3 to 4
+move 8 from 6 to 9
+move 1 from 3 to 1
+move 1 from 9 to 1
+move 2 from 6 to 2
+move 5 from 5 to 7
+move 5 from 9 to 3
+move 2 from 8 to 5
+move 1 from 1 to 2
+move 1 from 9 to 1
+move 15 from 7 to 4
+move 1 from 1 to 6
+move 1 from 6 to 9
+move 3 from 9 to 3
+move 1 from 3 to 5
+move 5 from 5 to 3
+move 9 from 2 to 9
+move 5 from 4 to 1
+move 1 from 6 to 7
+move 7 from 9 to 3
+move 1 from 4 to 7
+move 1 from 9 to 6
+move 1 from 6 to 5
+move 2 from 1 to 4
+move 3 from 9 to 3
+move 1 from 5 to 6
+move 7 from 4 to 3
+move 1 from 9 to 3
+move 16 from 3 to 1
+move 9 from 1 to 3
+move 5 from 4 to 2
+move 1 from 6 to 9
+move 12 from 1 to 9
+move 3 from 2 to 9
+move 5 from 7 to 3
+move 2 from 4 to 8
+move 2 from 7 to 2
+move 12 from 3 to 5
+move 6 from 2 to 9
+move 12 from 3 to 1
+move 2 from 8 to 6
+move 1 from 6 to 1
+move 6 from 5 to 8
+move 5 from 3 to 2
+move 2 from 5 to 8
+move 8 from 1 to 8
+move 13 from 9 to 7
+move 4 from 7 to 5
+move 4 from 1 to 4
+move 8 from 5 to 6
+move 1 from 1 to 6
+move 4 from 7 to 3
+move 1 from 3 to 1
+move 1 from 1 to 9
+move 4 from 9 to 5
+move 3 from 3 to 7
+move 12 from 8 to 7
+move 2 from 4 to 3
+move 2 from 6 to 9
+move 4 from 8 to 2
+move 2 from 3 to 9
+move 2 from 4 to 7
+move 3 from 5 to 7
+move 2 from 9 to 7
+move 3 from 6 to 1
+move 4 from 6 to 7
+move 1 from 5 to 4
+move 1 from 9 to 3
+move 12 from 2 to 5
+move 4 from 9 to 7
+move 11 from 5 to 1
+move 1 from 6 to 5
+move 1 from 1 to 4
+move 10 from 1 to 2
+move 2 from 5 to 1
+move 1 from 3 to 5
+move 7 from 2 to 5
+move 8 from 7 to 8
+move 2 from 2 to 8
+move 3 from 9 to 4
+move 5 from 4 to 3
+move 1 from 5 to 7
+move 3 from 7 to 1
+move 3 from 5 to 8
+move 1 from 2 to 5
+move 12 from 7 to 6
+move 4 from 1 to 3
+move 2 from 5 to 6
+move 7 from 3 to 7
+move 14 from 6 to 4
+move 1 from 5 to 6
+move 3 from 1 to 3
+move 4 from 3 to 2
+move 2 from 5 to 8
+move 11 from 7 to 4
+move 7 from 4 to 5
+move 1 from 3 to 4
+move 1 from 5 to 6
+move 14 from 8 to 7
+move 11 from 7 to 3
+move 2 from 2 to 6
+move 1 from 2 to 3
+move 5 from 5 to 4
+move 4 from 6 to 4
+move 8 from 7 to 8
+move 3 from 7 to 3
+move 1 from 2 to 1
+move 5 from 8 to 2
+move 4 from 4 to 3
+move 1 from 2 to 9
+move 1 from 1 to 9
+move 3 from 2 to 1
+move 1 from 5 to 4
+move 3 from 8 to 1
+move 1 from 7 to 4
+move 4 from 3 to 9
+move 1 from 8 to 7
+move 2 from 9 to 1
+move 6 from 3 to 4
+move 28 from 4 to 7
+move 15 from 7 to 8
+move 3 from 3 to 8
+move 1 from 2 to 9
+move 2 from 3 to 2
+move 7 from 1 to 4
+move 10 from 4 to 5
+move 10 from 5 to 6
+move 3 from 8 to 2
+move 1 from 1 to 7
+move 1 from 4 to 7
+move 1 from 9 to 6
+move 9 from 6 to 7
+move 1 from 2 to 4
+move 1 from 9 to 5
diff --git a/05/sample.txt b/05/sample.txt
new file mode 100644
index 0000000..84933bb
--- /dev/null
+++ b/05/sample.txt
@@ -0,0 +1,9 @@
+ [D]
+[N] [C]
+[Z] [M] [P]
+ 1 2 3
+
+move 1 from 2 to 1
+move 3 from 1 to 3
+move 2 from 2 to 1
+move 1 from 1 to 2
diff --git a/06/1.lua b/06/1.lua
new file mode 100644
index 0000000..68ea3e2
--- /dev/null
+++ b/06/1.lua
@@ -0,0 +1,28 @@
+require("ext")
+local line = io.read("*a")
+
+local buf = {}
+for i = 1,14 do
+ table.insert(buf, line:sub(i,i))
+end
+function checkbuf()
+ local s,u = {},0
+ for _,v in pairs(buf) do
+ if not s[v] then
+ s[v] = true
+ u = u + 1
+ end
+ end
+ if u == 14 then
+ return true
+ end
+end
+if checkbuf() then print(14) end
+for i = 15,#line do
+ table.remove(buf,1)
+ table.insert(buf,line:sub(i,i))
+ if checkbuf() then
+ print(i)
+ break
+ end
+end
diff --git a/06/2.lua b/06/2.lua
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/06/2.lua
diff --git a/06/ext.lua b/06/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/06/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/07/1.lua b/07/1.lua
new file mode 100755
index 0000000..c877b9b
--- /dev/null
+++ b/07/1.lua
@@ -0,0 +1,53 @@
+#!/usr/bin/env lua
+local ds = {} -- unique value
+local pwd, tree, output = {}, {[ds]=0}, error
+local allfolders = {tree}
+--[[Walk a tree and call a function on each node]]
+local function walk(dir, path, f)
+ local cursor = dir
+ for _,v in ipairs(path) do
+ f(cursor)
+ cursor = cursor[v]
+ end
+ f(cursor)
+ return cursor
+end
+local commands = {}
+function commands.cd(arg)
+ if arg == "/" then pwd = {}
+ elseif arg == ".." then table.remove(pwd)
+ else table.insert(pwd, arg) end
+end
+function commands.ls()
+ local cursor = walk(tree, pwd, function() end)
+ output = function(line)
+ if line:match("^dir") then
+ local dirname = line:match("^dir (%w+)$")
+ cursor[dirname] = {[ds]=0}
+ table.insert(allfolders, cursor[dirname])
+ else
+ local filesize, filename = line:match("(%d+) ([%w.]+)")
+ walk(tree, pwd, function(f)
+ f[ds] = f[ds] + tonumber(filesize)
+ end)[filename] = filesize
+ end
+ end
+
+end
+for line in io.lines() do
+ if line:match("^%$") then --it's a command
+ local line_split = {}
+ line:gsub("(%S+)", function(w) table.insert(line_split,w) end)
+ table.remove(line_split, 1) -- remove '$'
+ -- remove command and call the appropriate function
+ commands[table.remove(line_split, 1)](table.unpack(line_split))
+ else output(line) end
+end
+local needs = 3e7 - (7e7 - tree[ds])
+table.sort(allfolders, function(a,b) return a[ds] < b[ds] end)
+for i = 1,#allfolders do
+ if allfolders[i][ds] > needs then
+ print(allfolders[i][ds])
+ break
+ end
+end
diff --git a/07/2.lua b/07/2.lua
new file mode 100644
index 0000000..93c90df
--- /dev/null
+++ b/07/2.lua
@@ -0,0 +1,57 @@
+local ds = {} -- unique value
+local pwd, tree, output = {}, {[ds]=0}, error
+local allfolders = {tree}
+local function walk(dir, path, f)
+ local cursor = dir
+ for _,v in ipairs(path) do
+ f(cursor)
+ cursor = cursor[v]
+ end
+ f(cursor)
+ return cursor
+end
+local commands = {}
+function commands.cd(arg)
+ if arg == "/" then pwd = {}
+ elseif arg == ".." then table.remove(pwd)
+ else table.insert(pwd, arg) end
+end
+function commands.ls()
+ local cursor = walk(tree, pwd, function() end)
+ output = function(line)
+ if line:match("^dir") then
+ local dirname = line:match("^dir (%w+)$")
+ cursor[dirname] = {[ds]=0}
+ table.insert(allfolders,cursor[dirname])
+ else
+ local filesize, filename = line:match("(%d+) ([%w.]+)")
+ walk(
+ tree,
+ pwd,
+ function(f) f[ds] = f[ds] + tonumber(filesize) end
+ )[filename] = filesize
+ end
+ end
+
+end
+for line in io.lines() do
+ if line:match("^%$") then
+ local line_split = {}
+ for chunk in line:gmatch("(%S+)") do
+ table.insert(line_split,chunk)
+ end
+ table.remove(line_split,1) -- remove '$'
+ -- remove command before calling it
+ commands[table.remove(line_split,1)](table.unpack(line_split))
+ else
+ output(line)
+ end
+end
+local needs = 3e7 - (7e7 - tree[ds])
+table.sort(allfolders,function(a,b) return a[ds] < b[ds] end )
+for i = 1,#allfolders do
+ if allfolders[i][ds] > needs then
+ print(allfolders[i][ds])
+ break
+ end
+end
diff --git a/07/ext.lua b/07/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/07/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/07/input.txt b/07/input.txt
new file mode 100644
index 0000000..d083766
--- /dev/null
+++ b/07/input.txt
@@ -0,0 +1,942 @@
+$ cd /
+$ ls
+dir gts
+68377 jvdqjhr.jvp
+dir lwhbw
+228884 nqth.gcn
+dir pcqjnl
+94844 ppwv.zsh
+97889 rqpw
+dir sqhw
+dir vllgn
+dir wdtm
+dir ztfdwp
+$ cd gts
+$ ls
+846 grwwbrgz.wft
+72000 mrnhn.psz
+155241 qvnbd.dqs
+6655 tndtmwfv
+$ cd ..
+$ cd lwhbw
+$ ls
+99946 lrrl.lth
+$ cd ..
+$ cd pcqjnl
+$ ls
+76420 gdg.lvr
+dir gljcvm
+161390 hlnrq.mjj
+dir lqwntmdg
+dir lrrl
+dir qgpr
+222006 tndtmwfv
+$ cd gljcvm
+$ ls
+264381 tmwzlzn
+$ cd ..
+$ cd lqwntmdg
+$ ls
+dir jjfwr
+dir rfqbmb
+$ cd jjfwr
+$ ls
+dir cfhjvmh
+$ cd cfhjvmh
+$ ls
+dir gzfgc
+$ cd gzfgc
+$ ls
+134989 cfhjvmh.wwh
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd rfqbmb
+$ ls
+dir cbrvhz
+dir flcw
+dir mnd
+$ cd cbrvhz
+$ ls
+131072 wdtm.rjr
+$ cd ..
+$ cd flcw
+$ ls
+216675 wlfwpb.wpg
+$ cd ..
+$ cd mnd
+$ ls
+28976 hzzzzvmr.lsz
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd lrrl
+$ ls
+dir cpmvnf
+dir dcfmtw
+dir ggnwqcj
+7864 lgsc.smg
+42042 mjfdjrgt
+dir mrnhn
+258288 nqth.gcn
+dir nwjggvr
+249578 qfnnncr.ftw
+dir sqpgr
+dir wgpqg
+3196 wtpmdqhd.snd
+$ cd cpmvnf
+$ ls
+dir srtqvcv
+$ cd srtqvcv
+$ ls
+dir mrnhn
+$ cd mrnhn
+$ ls
+dir fbrwd
+$ cd fbrwd
+$ ls
+163166 nqth.gcn
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd dcfmtw
+$ ls
+31712 mrnhn.tgg
+dir nzpdtfr
+dir sntcbctt
+dir vzhvjp
+dir wdtm
+$ cd nzpdtfr
+$ ls
+dir qwtwps
+130527 rhhlfg.tcj
+160893 rwbwp.rmr
+dir vcthd
+$ cd qwtwps
+$ ls
+dir cmf
+$ cd cmf
+$ ls
+73595 wdsjg.thm
+$ cd ..
+$ cd ..
+$ cd vcthd
+$ ls
+15016 cfhjvmh
+$ cd ..
+$ cd ..
+$ cd sntcbctt
+$ ls
+dir lrrl
+dir mjfdjrgt
+dir npqj
+$ cd lrrl
+$ ls
+258433 clgfwbb.htg
+166151 fbt.cnp
+$ cd ..
+$ cd mjfdjrgt
+$ ls
+64472 csphnrqr
+222554 fbt.cnp
+30487 vqb.grr
+$ cd ..
+$ cd npqj
+$ ls
+154071 mtn.pjq
+185929 nqth.gcn
+$ cd ..
+$ cd ..
+$ cd vzhvjp
+$ ls
+161341 mrnhn.wvw
+$ cd ..
+$ cd wdtm
+$ ls
+224565 cdd
+dir jrswcjq
+dir smgbdw
+$ cd jrswcjq
+$ ls
+173122 blm.znb
+$ cd ..
+$ cd smgbdw
+$ ls
+307533 cfhjvmh.ppp
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ggnwqcj
+$ ls
+dir bfjvt
+146815 fbt.cnp
+279655 nljrr
+152735 qpv
+$ cd bfjvt
+$ ls
+193338 qlfcz
+238188 qnz.llm
+$ cd ..
+$ cd ..
+$ cd mrnhn
+$ ls
+dir cfhjvmh
+dir cjsrvg
+32604 fbt.cnp
+231569 fpjfth.mmc
+dir hghjzpgc
+270425 mjfdjrgt.fdt
+273944 mjfdjrgt.twj
+141791 ztswsbs.pjs
+$ cd cfhjvmh
+$ ls
+306620 lrrl.mgd
+$ cd ..
+$ cd cjsrvg
+$ ls
+303619 dffrqscq.nct
+16738 lrrl.rbb
+63842 zbbwj
+$ cd ..
+$ cd hghjzpgc
+$ ls
+dir mgnq
+273152 mnszcbnv.fzj
+$ cd mgnq
+$ ls
+dir ttmctqlc
+250332 wdsjg.thm
+20054 zpzml
+$ cd ttmctqlc
+$ ls
+9006 nqth.gcn
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd nwjggvr
+$ ls
+dir bwmglvmt
+202937 lqqmqzl.vqj
+dir lrrl
+dir wmjp
+dir zvlhngjm
+$ cd bwmglvmt
+$ ls
+dir bszd
+244726 dnwvnsn.npc
+dir dqdrngf
+226857 jvcn
+dir lrrl
+288079 mjfdjrgt.ttw
+172669 vqr
+dir wtqgd
+$ cd bszd
+$ ls
+3937 csn.mft
+198599 vpbccpm
+$ cd ..
+$ cd dqdrngf
+$ ls
+26680 lrrl.gch
+150627 tndtmwfv
+$ cd ..
+$ cd lrrl
+$ ls
+dir bzrs
+27874 grjbtv
+$ cd bzrs
+$ ls
+71351 wlfwpb.wpg
+$ cd ..
+$ cd ..
+$ cd wtqgd
+$ ls
+58033 lrrl.cgp
+16732 vnznzhc.bzr
+137407 wlfwpb.wpg
+$ cd ..
+$ cd ..
+$ cd lrrl
+$ ls
+dir wrtp
+$ cd wrtp
+$ ls
+267582 nwmj.rlb
+$ cd ..
+$ cd ..
+$ cd wmjp
+$ ls
+155158 szhljp
+dir tzqqmmp
+163989 zwz.jvq
+$ cd tzqqmmp
+$ ls
+140115 qgwcfnvr.fzt
+$ cd ..
+$ cd ..
+$ cd zvlhngjm
+$ ls
+dir fjt
+214803 mjfdjrgt.zrb
+dir qsvwfb
+187556 tcqgvqr.gmv
+185730 tndtmwfv
+301659 wlfwpb.wpg
+$ cd fjt
+$ ls
+57947 mnchj
+$ cd ..
+$ cd qsvwfb
+$ ls
+23145 dzrgbhgf.dcm
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd sqpgr
+$ ls
+dir bpnlrhsb
+dir jvdh
+dir zplwvj
+$ cd bpnlrhsb
+$ ls
+22875 wdsjg.thm
+$ cd ..
+$ cd jvdh
+$ ls
+95461 ftmzfwt
+$ cd ..
+$ cd zplwvj
+$ ls
+dir gtd
+$ cd gtd
+$ ls
+50675 lgjbhr.jmc
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd wgpqg
+$ ls
+65679 wlfwpb.wpg
+$ cd ..
+$ cd ..
+$ cd qgpr
+$ ls
+dir fhnnc
+dir jzmpcc
+dir lrrl
+dir wdtm
+$ cd fhnnc
+$ ls
+84726 tndtmwfv
+$ cd ..
+$ cd jzmpcc
+$ ls
+dir mjfdjrgt
+dir mrnhn
+dir wdtm
+120156 whz.cts
+134435 wlfwpb.wpg
+$ cd mjfdjrgt
+$ ls
+234188 wdtm.bpt
+$ cd ..
+$ cd mrnhn
+$ ls
+dir gphqmvpn
+dir gvtgqn
+$ cd gphqmvpn
+$ ls
+23807 nzl.hzv
+$ cd ..
+$ cd gvtgqn
+$ ls
+225267 fbt.cnp
+132455 mrnhn.vcn
+$ cd ..
+$ cd ..
+$ cd wdtm
+$ ls
+dir cfhjvmh
+dir mjfdjrgt
+119601 mjfdjrgt.rhc
+226225 wdsjg.thm
+191042 wdtm
+$ cd cfhjvmh
+$ ls
+130491 dgdcbwqp.czm
+$ cd ..
+$ cd mjfdjrgt
+$ ls
+87408 djd.ccj
+152868 mjfdjrgt.zcn
+22605 srdfwwtj.rcp
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd lrrl
+$ ls
+26548 zwrctnn.lln
+$ cd ..
+$ cd wdtm
+$ ls
+dir jszntstc
+$ cd jszntstc
+$ ls
+210953 gwgmnvsh.nhb
+277302 msqjtrdm
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd sqhw
+$ ls
+dir djw
+dir dqnhzbh
+dir lwp
+dir mjfdjrgt
+211273 mjfdjrgt.hls
+dir mrnhn
+$ cd djw
+$ ls
+98290 cfhjvmh.jpr
+$ cd ..
+$ cd dqnhzbh
+$ ls
+43311 bdf.pzd
+68801 cfwdq.rbz
+dir cmfhw
+dir cwtm
+77978 nnzhntgh
+138343 nqth.gcn
+81692 tzhltsq
+dir zwhs
+$ cd cmfhw
+$ ls
+dir dsbjlmrf
+215307 fbt.cnp
+dir lch
+217372 mjfdjrgt.dzq
+228751 tndtmwfv
+dir tpgszv
+$ cd dsbjlmrf
+$ ls
+92510 pzq.hcl
+$ cd ..
+$ cd lch
+$ ls
+171339 czhsjn.ttq
+$ cd ..
+$ cd tpgszv
+$ ls
+215263 nvgcfqzb.gww
+$ cd ..
+$ cd ..
+$ cd cwtm
+$ ls
+105200 twrb.ljq
+$ cd ..
+$ cd zwhs
+$ ls
+35576 gnt.zdh
+68204 mfg
+207974 njb.lzw
+$ cd ..
+$ cd ..
+$ cd lwp
+$ ls
+65175 jcwncw.tms
+208506 tndtmwfv
+$ cd ..
+$ cd mjfdjrgt
+$ ls
+dir hlgqdqb
+153252 mjfdjrgt.njp
+dir pdsdjdlz
+144949 phsnm.bvl
+287686 zlszpmlv.gsf
+$ cd hlgqdqb
+$ ls
+128570 fdbls
+dir lmhrtp
+dir mjfdjrgt
+184639 mjfdjrgt.lct
+168706 mmlfd
+159454 mrdljff
+dir pzcnzs
+dir rcmzfm
+86088 tndtmwfv
+$ cd lmhrtp
+$ ls
+251922 cfhjvmh.njw
+$ cd ..
+$ cd mjfdjrgt
+$ ls
+61866 nqtrmm.zts
+24980 wlfwpb.wpg
+$ cd ..
+$ cd pzcnzs
+$ ls
+123265 fbt.cnp
+$ cd ..
+$ cd rcmzfm
+$ ls
+dir gjls
+$ cd gjls
+$ ls
+109021 cnzz
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd pdsdjdlz
+$ ls
+103346 zhfhrzmr.qqm
+$ cd ..
+$ cd ..
+$ cd mrnhn
+$ ls
+dir tmldr
+140361 tndtmwfv
+$ cd tmldr
+$ ls
+169607 dvchnsqr.ltc
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd vllgn
+$ ls
+58389 tndtmwfv
+$ cd ..
+$ cd wdtm
+$ ls
+dir cfhjvmh
+dir cpcqz
+dir gmrgsmpp
+290978 jbfn
+179525 mjfdjrgt
+dir mrnhn
+dir nvgmrpdf
+dir vpm
+67780 wlfwpb.wpg
+dir ztp
+$ cd cfhjvmh
+$ ls
+dir hqf
+218467 lfl.vpp
+dir rgq
+147778 rhntpj
+dir tgmw
+$ cd hqf
+$ ls
+207656 blvtl.zhg
+$ cd ..
+$ cd rgq
+$ ls
+54691 cfhjvmh.mhw
+201230 jjhr.lml
+22759 mgqdg.qsj
+$ cd ..
+$ cd tgmw
+$ ls
+153570 nqth.gcn
+$ cd ..
+$ cd ..
+$ cd cpcqz
+$ ls
+dir cfhjvmh
+17143 fbt.cnp
+dir ftpm
+dir lrrl
+92760 lwdzptgw.gfv
+dir mrnhn
+151636 tndtmwfv
+dir vqt
+$ cd cfhjvmh
+$ ls
+17554 wlfwpb.wpg
+$ cd ..
+$ cd ftpm
+$ ls
+244476 crpfc.bwn
+290894 dhdnh
+210196 lhf
+58166 nqth.gcn
+$ cd ..
+$ cd lrrl
+$ ls
+229894 btrbfh.twr
+269093 cfhjvmh.pbb
+277722 fvhtjpg.pvb
+236232 gztc.lbh
+dir mjfdjrgt
+230753 qgjrh.zsf
+dir sdvhlnz
+$ cd mjfdjrgt
+$ ls
+186105 lrrl.zng
+226081 lsdzz.gsj
+33416 nqth.gcn
+109966 wgtclbvt.nct
+160015 wlfwpb.wpg
+$ cd ..
+$ cd sdvhlnz
+$ ls
+219905 cngbvwz.zsm
+284092 dgjz
+dir lcmlmr
+22135 lrrl
+dir vdcbcvzv
+dir wdwgp
+dir zllqgnhj
+$ cd lcmlmr
+$ ls
+dir lrrl
+$ cd lrrl
+$ ls
+104034 cpv
+$ cd ..
+$ cd ..
+$ cd vdcbcvzv
+$ ls
+263858 qwsmpvdv.lfr
+dir sldsnqld
+$ cd sldsnqld
+$ ls
+3116 hvsb.vrj
+166766 wqfg.ztg
+$ cd ..
+$ cd ..
+$ cd wdwgp
+$ ls
+11714 wdsjg.thm
+$ cd ..
+$ cd zllqgnhj
+$ ls
+113285 hrjtqzvf
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd mrnhn
+$ ls
+212363 bhldtsnn.jbp
+194936 wdsjg.thm
+$ cd ..
+$ cd vqt
+$ ls
+46371 lrrl.ztz
+215875 rnggjsg.hsw
+255959 vnjhm.frz
+277765 vwvjnrjp.mwq
+$ cd ..
+$ cd ..
+$ cd gmrgsmpp
+$ ls
+dir fbcv
+275639 fbt.cnp
+dir tnrmj
+65119 vtfjqtw.tqg
+117334 zsg.grj
+$ cd fbcv
+$ ls
+dir htmwl
+292840 wwwspsb.hrb
+$ cd htmwl
+$ ls
+34803 dshcw
+10573 dwtd
+$ cd ..
+$ cd ..
+$ cd tnrmj
+$ ls
+dir cfhjvmh
+dir wqtnrwg
+$ cd cfhjvmh
+$ ls
+110464 wlfwpb.wpg
+$ cd ..
+$ cd wqtnrwg
+$ ls
+283055 mfgllgv
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd mrnhn
+$ ls
+2633 tndtmwfv
+$ cd ..
+$ cd nvgmrpdf
+$ ls
+32919 pnc
+$ cd ..
+$ cd vpm
+$ ls
+dir ddz
+dir dhmphrn
+dir grr
+132419 mgfdgw.vlt
+dir nbccdd
+dir plw
+183717 pvgbbjgt.wbt
+dir qsmg
+120729 stbh.rvz
+101652 ttqc
+$ cd ddz
+$ ls
+4672 hrnnrzd
+217020 wdtm
+$ cd ..
+$ cd dhmphrn
+$ ls
+dir fwbmb
+dir gdq
+dir lrrl
+dir mrcnm
+dir mrmmr
+161427 rllvrpzl.vcg
+$ cd fwbmb
+$ ls
+258937 dfd.wrl
+103543 gtfgscfg.jjc
+$ cd ..
+$ cd gdq
+$ ls
+133691 bzgt.llh
+278010 cfhjvmh.nhj
+191344 cjbcnfz.rjb
+269115 fbt.cnp
+$ cd ..
+$ cd lrrl
+$ ls
+dir gqqsg
+dir gwbtt
+dir mrnhn
+140500 nqth.gcn
+dir pdtm
+220764 tndtmwfv
+dir vvsvfchb
+$ cd gqqsg
+$ ls
+dir gvn
+dir hzfmdhw
+34666 vfzbvl
+dir wdtm
+$ cd gvn
+$ ls
+206457 cfhjvmh.thh
+133435 hsdsstt
+dir lrrl
+dir rwvbmlq
+127003 sjqvt.lzl
+136402 wlfwpb.wpg
+60537 zwjfrqf.nvl
+$ cd lrrl
+$ ls
+15291 mrnhn.ltr
+190429 wlfwpb.wpg
+119328 wln.msz
+86384 zbhzvrc.gbj
+$ cd ..
+$ cd rwvbmlq
+$ ls
+186907 nqth.gcn
+$ cd ..
+$ cd ..
+$ cd hzfmdhw
+$ ls
+9653 fbt.cnp
+dir lvdhtg
+301280 nqth.gcn
+dir nwnp
+241354 vzrbbj.bfb
+$ cd lvdhtg
+$ ls
+dir cfhjvmh
+dir hzpzz
+296694 mjfdjrgt.mpj
+65800 nqth.gcn
+dir pbfhn
+dir wljjgs
+$ cd cfhjvmh
+$ ls
+87654 htlq
+203005 vhmthzjb
+$ cd ..
+$ cd hzpzz
+$ ls
+153446 brfstm.nwc
+47585 cfhjvmh
+258754 wdtm.gpt
+150809 zlwq.hgr
+$ cd ..
+$ cd pbfhn
+$ ls
+dir mjfdjrgt
+$ cd mjfdjrgt
+$ ls
+16108 rmfwpm.fnt
+$ cd ..
+$ cd ..
+$ cd wljjgs
+$ ls
+228757 bqf.jll
+$ cd ..
+$ cd ..
+$ cd nwnp
+$ ls
+124842 lrrl
+$ cd ..
+$ cd ..
+$ cd wdtm
+$ ls
+122771 fbt.cnp
+252697 lpqf.bvg
+264813 mrnhn
+165228 pgn.wnw
+dir vsls
+292567 wlfwpb.wpg
+$ cd vsls
+$ ls
+250070 dvbv
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd gwbtt
+$ ls
+dir mjfdjrgt
+2327 nqth.gcn
+20064 sdjvgv.sfr
+$ cd mjfdjrgt
+$ ls
+96726 fbt.cnp
+4801 lrrl.fgv
+180291 wspcp.brw
+$ cd ..
+$ cd ..
+$ cd mrnhn
+$ ls
+dir lrrl
+dir mqcstf
+271459 nqth.gcn
+190006 zdln
+$ cd lrrl
+$ ls
+160260 fbt.cnp
+281732 tfpprjj
+$ cd ..
+$ cd mqcstf
+$ ls
+222125 gntrdss.zcw
+dir pdbbbmn
+58613 stwlp.wpl
+$ cd pdbbbmn
+$ ls
+250947 mjfdjrgt
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd pdtm
+$ ls
+55975 wdhn
+$ cd ..
+$ cd vvsvfchb
+$ ls
+10547 hpwmnjgc
+157960 tcc
+$ cd ..
+$ cd ..
+$ cd mrcnm
+$ ls
+106708 cfhjvmh
+264809 ffqfm.slz
+dir lrrl
+dir mjfdjrgt
+174610 wlfwpb.wpg
+90207 wwhwvdc.zvc
+$ cd lrrl
+$ ls
+305034 fbt.cnp
+240756 jmfwlmzv.gjc
+77875 wgfpcscz.mdn
+$ cd ..
+$ cd mjfdjrgt
+$ ls
+26073 mrnhn
+$ cd ..
+$ cd ..
+$ cd mrmmr
+$ ls
+287663 qlc
+$ cd ..
+$ cd ..
+$ cd grr
+$ ls
+dir tgb
+$ cd tgb
+$ ls
+203808 psssw.nzs
+$ cd ..
+$ cd ..
+$ cd nbccdd
+$ ls
+62162 wfmhzh
+$ cd ..
+$ cd plw
+$ ls
+185632 ljwvnppm.bcc
+$ cd ..
+$ cd qsmg
+$ ls
+164538 lrrl.flr
+dir vbvtzmsg
+dir wrrtctvd
+$ cd vbvtzmsg
+$ ls
+15318 mrnhn.qlh
+$ cd ..
+$ cd wrrtctvd
+$ ls
+249219 lggjwn.mfj
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ztp
+$ ls
+241178 fzc.swf
+dir hns
+223340 lbmzvf
+dir wdtm
+195144 wlfwpb.wpg
+$ cd hns
+$ ls
+dir fshzss
+77792 mjfdjrgt.qcm
+85013 nlpsw
+274710 pmclgp.lvz
+dir spdzjs
+$ cd fshzss
+$ ls
+297058 fbj.qjm
+131320 wjbhllz.mnf
+$ cd ..
+$ cd spdzjs
+$ ls
+165766 nrzthq.rvj
+10584 zfhqhm.njj
+$ cd ..
+$ cd ..
+$ cd wdtm
+$ ls
+dir vnmg
+$ cd vnmg
+$ ls
+83938 mrnhn.wwd
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ..
+$ cd ztfdwp
+$ ls
+152895 swjdzqdh.ngv
+215804 tndtmwfv
+68954 wdsjg.thm
diff --git a/07/sample.txt b/07/sample.txt
new file mode 100644
index 0000000..09a921e
--- /dev/null
+++ b/07/sample.txt
@@ -0,0 +1,23 @@
+$ cd /
+$ ls
+dir a
+14848514 b.txt
+8504156 c.dat
+dir d
+$ cd a
+$ ls
+dir e
+29116 f
+2557 g
+62596 h.lst
+$ cd e
+$ ls
+584 i
+$ cd ..
+$ cd ..
+$ cd d
+$ ls
+4060174 j
+8033020 d.log
+5626152 d.ext
+7214296 k
diff --git a/08/1.lua b/08/1.lua
new file mode 100644
index 0000000..326b8c4
--- /dev/null
+++ b/08/1.lua
@@ -0,0 +1,49 @@
+local heights = {}
+
+for line in io.lines() do
+ local trees = {}
+ line:gsub("%d",function(t)
+ local tree = {
+ height=tonumber(t),
+ visible={up=false,down=false,left=false,right=false},
+ }
+ table.insert(trees,tree)
+ end)
+ table.insert(heights,trees)
+end
+local nrow,ncol = #heights, #heights[1]
+for i = 1,nrow do
+ heights[i][1].visible.left = true
+ heights[i][ncol].visible.right = true
+end
+for i = 1,ncol do
+ heights[1][i].visible.up = true
+ heights[nrow][i].visible.down = true
+end
+local total_visible = (nrow*2) + (ncol*2) - 4
+local directions = {up={1,0},down={-1,0},left={0,1},right={0,-1}}
+local function calc_visible(row,col)
+ local t = heights[row][col]
+ for name,direction in pairs(directions) do
+ local i,j = row - direction[1], col - direction[2]
+ while heights[i] and heights[i][j] do
+ if t.height > heights[i][j].height and heights[i][j].visible[name] then
+ t.visible[name] = true
+ break
+ elseif t.height <= heights[i][j].height then
+ t.visible[name] = false
+ break
+ end
+ i,j = i - direction[1], j - direction[2]
+ end
+ end
+ if t.visible.left or t.visible.right or t.visible.up or t.visible.down then
+ total_visible = total_visible + 1
+ end
+end
+for row = 2, nrow-1 do
+ for col = 2, ncol-1 do
+ calc_visible(row,col)
+ end
+end
+print(total_visible)
diff --git a/08/2.lua b/08/2.lua
new file mode 100644
index 0000000..691123c
--- /dev/null
+++ b/08/2.lua
@@ -0,0 +1,68 @@
+require "ext"
+local heights = {}
+
+for line in io.lines() do
+ local trees = {}
+ line:gsub("%d",function(t)
+ local tree = {
+ height=tonumber(t),
+ scene = {up=0,down=0,left=0,right=0}
+ }
+ table.insert(trees,tree)
+ end)
+ table.insert(heights,trees)
+end
+print("heights:",heights)
+local nrow,ncol = #heights, #heights[1]
+local maxscene = 0
+local function is_visible(row,col)
+ print("examining tree at ",row,col,heights[row][col].height)
+ local this_tree = heights[row][col]
+ --up
+ for i = row-1,1,-1 do
+ if this_tree.height > heights[i][col].height then
+ this_tree.scene.up = this_tree.scene.up + 1
+ else
+ this_tree.scene.up = this_tree.scene.up + 1
+ break
+ end
+ end
+ --down
+ for i = row+1,nrow do
+ if this_tree.height > heights[i][col].height then
+ this_tree.scene.down = this_tree.scene.down + 1
+ else
+ this_tree.scene.down = this_tree.scene.down + 1
+ break
+ end
+ end
+ --left
+ for i = col-1,1,-1 do
+ if this_tree.height > heights[row][i].height then
+ this_tree.scene.left = this_tree.scene.left + 1
+ else
+ this_tree.scene.left = this_tree.scene.left + 1
+ break
+ end
+ end
+ --right
+ for i = col+1,ncol do
+ if this_tree.height > heights[row][i].height then
+ this_tree.scene.right = this_tree.scene.right + 1
+ else
+ this_tree.scene.right = this_tree.scene.right + 1
+ break
+ end
+ end
+ local s = this_tree.scene
+ this_tree.scenescore = s.up * s.down * s.left * s.right
+ if this_tree.scenescore > maxscene then
+ maxscene = this_tree.scenescore
+ end
+end
+for row = 2, nrow-1 do
+ for col = 2, ncol-1 do
+ is_visible(row,col)
+ end
+end
+print(maxscene)
diff --git a/08/ext.lua b/08/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/08/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/08/input.txt b/08/input.txt
new file mode 100644
index 0000000..7366eef
--- /dev/null
+++ b/08/input.txt
@@ -0,0 +1,99 @@
+002220021312231312222033343421330303240001434141231331323404031022114013434333010230221020221020022
+121122120202012020121043013102221221435521112422443242343123513341010302410221342010223030013102200
+000102113102200232304033323331230042243225545423222145155353323244444103030341114102200110230210210
+210000210011313230124421403131035424212553341224354235111554525424232312243334330011232213102110221
+011221213013233101202214421014211444113354135545433143234341354155455431402040121341332111001213200
+102011200323032042010300400433425523314114545134123354514144125244221425322110331241203233303212321
+102333112233124011310312033433351241332441511153434514142551252434413454525133430430232301313012101
+211211123303442031043123115213455152541435522242266645543311341343514541312331003041323121132333230
+001321210013322412003145152352533215251266535255436246225646232235155455213434510131104234003003222
+223300223021202423423443531414132551356424245326334266655533565213421321535315422410221142133031312
+222100212043241001125454253523452134533223365232264243252423323432612224141255512031323011313003103
+021121103403121443434132421553436423352664246453242666446362544432226535142445142544021324240001211
+133332012412432333133345415214366446545565543462332546664335363355632655443241344522421402100130202
+203311422144324333445534552346564665545464453356346434642563543262655253451122554135410444243311311
+322001144142332343512222522324564232262466666644733543366455434326365635422423142542532442322034233
+101313214102402432135211163436536554325523756753777636774442234646434532462532323552412110323232323
+001234101142053124341452526452436566623744636336343435367647546635623353553555534224231314214100212
+011340142113121313424442565642324364776443464557637463364534454646665424552553413532212514302012341
+131222200221422152343654426266433667545366347373774775466374344436764353332356464535514434324340110
+111003023342553555436244262523625335453474533637454347543437747544744452225334642442335223143444444
+321342121452254343244365542366665534457746575473573344454777777733474472444242626215251353540020101
+112143303315213335256234665554477437377636773577545734476555474364535534426563254464121321342443010
+234221035235112225663223532437466537576546445657685585555367446553357466742263556432335535233141333
+222423221324421313653564633554665443633556667677566864675574576677657463472426635262534215124024221
+324331152222354262443463537535377475436657674545875474876844577557734435563264343363652233415524410
+213342122353141336533663276453775344477647556654774756865757686866756357447742256452564542442334022
+031310253121515643256663543343774374464475868668856447745665786466775333667666543356266334544230111
+003414153141543253444633475333643566678746567545465484644456865746567655663777455623456224131310102
+330142523253452632255556734446376546656754857454455688868674648457646443377555553462454615251453442
+133235545322333532564577755447648846778644645755887995696448544647577553657663736532335515233432204
+334335524535365552354756376746487575645445659755695765666787544578886583475443775453346362431143131
+341031551123323343266454736348684858484889599858696567585876875856777548475375347666344435552535130
+330124132352653624374474564584845574667585775689557998777788587447485878554574675446242255332135430
+022332341314322336445375435566746866478875855558865695755978785575785875787557756366564323334355421
+422512114322233253336344454648844756687768565958568995898568666686676864785573463376463556254314532
+103452142442634255644464378667858765668577695986766569979865855566666464448666555466453356541352555
+241112442533463566644466384475785778588865998998987687878685758585665474766754566466245444341351111
+242331514626445247647536577786867686956757887867997868868565789798577586688475374636425346525131421
+243314253655642337357775774485658855797598667666899989967796597576898668686444477753324232232351154
+141212322533446654653434488448555885596757899977797669696788657787555457687585673655426445422433424
+342122455562335353366637887665858986966688896796677969888697689675958786488564747444335354224244114
+312551335256534266765767457478789957996778878677968997797796765897866875565887677747646635544512542
+211534134626623545346577744877677876857796986969678796966776968959655984565744445456734645346232512
+032231543234465677337374577887787968857667678778778977789989896785756795858858774466662336446214512
+324534154425536743565446458446858967886787686879898778778766688758858698485648874353672463266531234
+435134112333555443375367474578758968688997879997977798878668997879689696565868444476554256336155424
+415141242653322635673376487876767958867777897899878989988966688858578595645554834563765634653311443
+333153263566332363556565647675776889997977998798979989789779878767599668677764763567736353533453222
+324533443324323546474686475757577689889799697979879899988679887776859589545565675357363456543514214
+541212526226223464775746748666766598968767978778799799798889796767886998655687843577354334262542222
+254152122622335364377555764858997897878877898777778878987979889696555579776547754776646635325242443
+233322465646563366564454647465965779689999699998999997777987688766899995784766835357675264423235125
+535451544662624547343458788846585555988689797879987987777878766896757589544864553377356554234332115
+244155565332636373565485774649696779997697667779778999898989987886985757674786675646374345632323155
+541445123454425766545765876866698666699986888787877988888968997758669898748856774455664363534535245
+455333345362435745575658765456987788888989966788777799798897779657686755844678835677774462453432523
+221534413542463536734757867768888675877686879688897878998879669688977768885557754643352225526224333
+221234516433463336765777686785786979666796878779797869789769666688997978844648636667643543232444133
+332215426646234434537648668445869988799778678686878967687668768657879955656846347743656535222133422
+031553553463354667655574475474488786777686996886779777887886867775767548458866434657666522253512145
+331532316364356445453744448764666787785586687678778969697798769655779847465578374664546445324424334
+231442532632664337564767657644566986698596889799897977969897769799988688455757473356424325365512353
+411553532344436334565736755688777565758689667688779789696666578858657666568855774576363253255223545
+142243141626243333657765468644745995798775976978979869767759758699574774455763666347225335254143154
+434542532345526233743743645456757487695765886898969876785665857797756868557564677455336336551245453
+242111213336234342634744347655654759597665895975786988997859879785674785466364664476642426523334413
+240432541545646555637655375878747648689956699797668787668987857785877748855353544573343263423351451
+233353541126663465447637576756467765799985779857685597778958855944587564657567344425653566513324251
+202133125415524635556354365368576748667886559966988689898777998784678575655573455765246634331111323
+214241132111456463244677753468567888865459986568778556756857554488444844574373477643253433514113414
+404043331523632565246656343354566578548867897777799576599855576486586885647776646654645643421251434
+321431341441524644343774675764678486487885575766685789987548644455655465455574763334325643223532112
+312044135522435234264466734356344664746887668755765684564685544655877565747654532452656321312254240
+221443411432246553232444575537753577667488768677578665484847677754883754573376245624364553144524310
+333011355143132662522563635437666768647485448557477746476767655566765543476573262345334242422532040
+130221313353423632635345377635457345475858877766844478544578458753453567556654264564563111241221424
+420000412311333223455353344535675346674758458678588744648777864536643447536366432335235213533510131
+033211203422344216654546246576546347545346767685845774858574755653734736666352442234431433312122020
+420112221555544554533234236234734667465467566545488844644654555366376734646542254343325451511102040
+120131424153254535662246332535575674733567577374535555633745576736633645534235222461444514331311422
+213413130454123421355422255452563464655444643735457443555675634373377635255435222352513552212031020
+003020114244244432233353656455567667744454636765475774754663376447476625234623436352314413331402042
+324044223442544345113455525643466577777675355766774773637445365463522332325642562435514442142404141
+210441410124444533445153545634656623447563677736473335673574337754666335462353221213524122021303233
+220001402334314112552325546465543662455673446333744466773363533553456364646542224332314211402042433
+023121402021311422535432445424233646345224547753633435644474236362532444465321253221141144332413310
+323020230034123314134444533446535564436335465334366443566523243354226225646253351453120014034104303
+312321342442214055412542111145545344545643544554353232456465256462323445343525123442530123340220021
+123101342024104423223521423214332556563335635536633462555625643665222463242344244522332431230422020
+300202224124443140142225324453536234525546225346366434644466234244662333545341335424243412214111222
+230103311300324320142422532144424144356464635656343323243433326662623345523535351332140310322302320
+102213121041413130343312325141341341255366646363663225633336454234535134543235451400033131103312302
+220010012323010223213414114534555442121353366562642344263362424334153543414344531223433101022121003
+111303131132410340323210521254433532435211213444624335211322534254443353121223030123212013112122222
+221300032203340322340214302442511523252243154411411131132224142542512334245223323243012130220310111
+210202131021310312212042132343151311311552432124522351251323142332524114321412240003424203112223000
+120001230322001230123443443202113524332314432515141344214224414354425231021342403441230201112313220
+000101310102010302144343300032331251425155511533145124553435221424141440223210230440103301210001022
+111021010130123300013234210112002104312354542225421421441334253132031032244142134422332001101011222
diff --git a/08/sample.txt b/08/sample.txt
new file mode 100644
index 0000000..16d6fbd
--- /dev/null
+++ b/08/sample.txt
@@ -0,0 +1,5 @@
+30373
+25512
+65332
+33549
+35390
diff --git a/09/1.lua b/09/1.lua
new file mode 100644
index 0000000..8757767
--- /dev/null
+++ b/09/1.lua
@@ -0,0 +1,48 @@
+local knots, tail_moved = {}, {}
+for i = 1,10 do table.insert(knots,{1,1}) end
+local directions = {
+ R = {1,0},
+ U = {0,1},
+ L = {-1,0},
+ D = {0,-1},
+}
+local sfmt = "%d - %d"
+local motion = {}
+for i = -2,2 do
+ for j = -2, 2 do
+ if math.abs(i)^2 + math.abs(j)^2 > 2 then
+ motion[sfmt:format(i,j)] = {
+ i == 0 and 0 or math.abs(i)/i,
+ j == 0 and 0 or math.abs(j)/j
+ }
+ else
+ motion[sfmt:format(i,j)] = {0,0}
+ end
+ end
+end
+local function insert_tail_pos()
+ local tail = knots[#knots]
+ tail_moved[string.format(sfmt,tail[1],tail[2])] = true
+end
+local function move_knot(knot,twords)
+ local x,y = twords[1] - knot[1], twords[2] - knot[2]
+ local direction = motion[string.format("%d - %d",x,y)]
+ knot[1],knot[2] = knot[1] + direction[1], knot[2] + direction[2]
+end
+insert_tail_pos()
+for line in io.lines() do
+ local direction, steps = line:match("([RULD]) (%d+)")
+ direction = directions[direction]
+ for i = 1,steps do
+ knots[1][1], knots[1][2] = knots[1][1] + direction[1], knots[1][2] + direction[2]
+ for j = 2,#knots do
+ move_knot(knots[j],knots[j-1])
+ insert_tail_pos()
+ end
+ end
+end
+local tmr = {}
+for p,_ in pairs(tail_moved) do
+ table.insert(tmr,p)
+end
+print(#tmr)
diff --git a/09/ext.lua b/09/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/09/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/09/input.txt b/09/input.txt
new file mode 100644
index 0000000..fc0dcd9
--- /dev/null
+++ b/09/input.txt
@@ -0,0 +1,2000 @@
+L 1
+U 2
+L 1
+U 2
+L 2
+R 1
+L 1
+U 2
+D 1
+R 1
+D 2
+L 2
+D 2
+L 2
+R 1
+U 2
+L 2
+R 1
+D 1
+R 2
+D 1
+R 1
+L 2
+U 1
+D 1
+U 2
+R 1
+L 1
+U 1
+L 1
+D 2
+L 2
+U 1
+L 1
+U 1
+D 1
+L 2
+D 2
+U 1
+R 1
+L 1
+U 2
+D 1
+U 1
+L 2
+U 2
+L 2
+R 2
+U 2
+L 1
+U 2
+R 1
+D 1
+R 2
+D 1
+R 2
+L 2
+D 1
+R 1
+D 1
+R 2
+L 2
+U 1
+D 1
+L 2
+U 2
+D 1
+L 1
+U 2
+R 1
+D 2
+R 1
+U 2
+L 1
+U 1
+L 2
+U 1
+R 1
+D 2
+L 2
+R 2
+D 2
+U 1
+L 2
+D 2
+L 2
+D 2
+L 2
+D 2
+L 1
+U 1
+L 2
+U 2
+L 2
+D 1
+U 2
+R 1
+U 2
+L 1
+U 2
+R 1
+D 2
+U 2
+D 1
+U 1
+D 1
+R 1
+U 2
+L 2
+U 1
+R 2
+U 1
+R 1
+L 1
+R 3
+L 2
+R 1
+L 3
+R 2
+D 1
+U 3
+L 2
+U 3
+R 3
+D 2
+U 2
+D 2
+L 1
+D 2
+U 1
+L 3
+U 1
+R 2
+L 2
+R 3
+D 2
+L 1
+D 2
+U 1
+L 2
+U 1
+R 2
+L 1
+U 1
+D 2
+R 2
+U 2
+D 1
+L 2
+D 2
+U 3
+L 3
+D 3
+U 3
+L 3
+R 1
+L 1
+U 1
+L 3
+D 1
+R 3
+D 1
+R 2
+L 1
+R 3
+D 3
+U 1
+R 2
+D 3
+L 1
+U 1
+D 3
+L 2
+U 2
+R 1
+U 3
+D 2
+L 2
+U 1
+L 2
+R 3
+L 1
+R 1
+U 2
+R 3
+U 2
+L 1
+U 3
+L 2
+R 3
+D 1
+L 3
+R 3
+D 3
+U 2
+R 2
+L 1
+R 2
+U 3
+D 2
+U 2
+R 3
+D 3
+R 2
+U 2
+D 2
+U 1
+L 1
+U 2
+L 3
+D 2
+L 3
+U 2
+R 3
+L 3
+D 2
+R 1
+L 2
+R 2
+U 3
+R 1
+U 2
+R 1
+L 4
+U 4
+L 4
+D 2
+U 1
+L 2
+R 4
+U 4
+D 2
+L 1
+D 1
+R 2
+D 2
+R 4
+L 1
+U 2
+D 2
+U 1
+D 2
+L 2
+U 2
+R 4
+D 3
+U 4
+D 1
+U 4
+R 4
+L 1
+U 2
+L 4
+U 2
+R 2
+D 2
+L 1
+U 1
+R 3
+L 4
+D 2
+R 4
+U 1
+R 4
+U 2
+D 2
+U 3
+R 3
+L 1
+U 2
+L 2
+R 4
+L 2
+R 4
+D 2
+U 4
+D 2
+U 1
+R 4
+D 4
+U 4
+L 2
+D 2
+R 4
+L 2
+D 1
+L 4
+D 2
+L 3
+U 3
+L 1
+D 2
+R 1
+D 4
+R 3
+D 4
+L 1
+U 4
+D 2
+U 3
+D 1
+R 2
+L 1
+D 4
+R 3
+U 1
+L 1
+U 1
+D 3
+R 1
+L 3
+R 1
+U 2
+R 4
+U 2
+R 3
+D 4
+R 2
+U 3
+D 3
+L 1
+U 4
+D 3
+R 2
+D 3
+U 2
+L 1
+U 1
+R 3
+D 3
+L 1
+D 1
+L 4
+U 2
+R 3
+L 4
+R 5
+D 1
+L 3
+R 1
+D 4
+L 3
+D 3
+R 1
+U 3
+L 4
+U 2
+R 1
+D 3
+L 1
+D 5
+R 4
+D 1
+U 1
+D 5
+R 1
+U 5
+D 1
+L 4
+D 1
+R 2
+U 4
+L 5
+D 4
+R 1
+L 1
+R 2
+D 3
+L 2
+R 2
+D 4
+U 1
+R 4
+U 4
+L 2
+D 1
+L 4
+U 3
+L 4
+U 3
+L 1
+R 2
+L 3
+R 1
+L 1
+D 3
+R 2
+U 5
+L 2
+D 3
+R 3
+D 5
+L 3
+R 3
+U 5
+R 1
+L 3
+D 4
+R 4
+D 5
+R 1
+U 3
+D 5
+U 2
+R 3
+U 4
+R 2
+L 2
+D 3
+L 4
+R 3
+D 3
+U 2
+D 4
+U 1
+L 1
+R 4
+D 5
+U 5
+R 2
+D 1
+R 1
+D 2
+R 5
+U 4
+R 3
+D 3
+L 4
+D 1
+L 4
+R 3
+D 4
+U 2
+D 4
+U 5
+L 3
+D 4
+U 2
+R 4
+L 2
+D 1
+R 4
+U 2
+R 2
+D 4
+L 1
+R 3
+D 2
+U 2
+L 6
+D 4
+U 2
+L 2
+D 5
+R 3
+L 6
+U 3
+L 6
+U 3
+R 2
+U 3
+L 1
+U 2
+R 6
+U 2
+R 6
+L 5
+U 2
+R 5
+U 5
+L 4
+U 1
+R 2
+D 2
+U 5
+R 3
+L 1
+D 1
+R 6
+L 1
+U 3
+L 6
+U 5
+R 3
+L 3
+U 1
+R 1
+U 1
+R 4
+U 5
+R 1
+D 1
+R 5
+L 5
+D 4
+R 4
+L 1
+D 6
+L 1
+D 2
+U 6
+L 3
+U 1
+R 3
+U 1
+R 2
+U 3
+L 6
+R 6
+U 2
+R 3
+U 6
+L 1
+D 2
+U 2
+L 5
+R 1
+L 5
+D 5
+R 3
+D 2
+L 5
+R 6
+D 2
+U 1
+L 4
+D 2
+L 4
+U 5
+L 1
+R 2
+L 1
+R 3
+L 6
+R 3
+D 3
+R 6
+D 1
+U 2
+R 2
+L 4
+U 6
+D 1
+R 6
+L 2
+D 6
+U 3
+R 1
+U 1
+D 6
+U 2
+L 4
+D 6
+L 6
+U 3
+R 5
+U 2
+L 1
+U 4
+R 6
+U 4
+D 5
+L 1
+D 3
+L 2
+D 6
+L 1
+D 7
+U 4
+D 2
+L 6
+U 3
+D 6
+R 6
+D 3
+R 4
+U 2
+R 6
+D 7
+L 2
+D 4
+L 3
+D 4
+U 1
+R 4
+L 2
+R 4
+L 1
+R 4
+L 4
+U 7
+L 5
+U 1
+D 1
+L 6
+D 4
+R 6
+D 6
+U 2
+D 5
+L 7
+D 5
+L 1
+U 7
+L 2
+R 6
+D 6
+U 2
+R 6
+D 5
+R 7
+L 3
+R 3
+D 1
+U 1
+L 2
+D 5
+R 1
+U 6
+R 1
+D 1
+U 5
+D 4
+U 7
+D 4
+U 2
+D 1
+U 4
+D 3
+R 1
+U 6
+D 3
+U 5
+L 3
+D 7
+R 3
+D 2
+R 4
+D 2
+R 6
+L 5
+D 6
+L 3
+U 5
+L 1
+R 2
+U 2
+R 6
+U 3
+R 7
+L 7
+R 5
+L 6
+D 4
+R 3
+D 7
+U 5
+L 1
+R 1
+U 4
+L 7
+R 1
+D 4
+U 2
+L 3
+D 2
+L 8
+R 6
+L 4
+U 4
+L 5
+R 4
+L 6
+D 1
+U 1
+L 4
+U 2
+R 1
+U 6
+R 6
+U 5
+R 2
+L 1
+D 3
+R 3
+D 8
+U 5
+R 1
+L 1
+U 3
+R 1
+D 4
+L 6
+D 8
+R 7
+U 2
+R 1
+L 6
+U 7
+R 1
+D 6
+U 1
+R 3
+L 5
+U 1
+R 6
+L 8
+U 6
+D 5
+L 8
+U 5
+R 8
+U 3
+L 2
+D 8
+U 5
+D 4
+L 1
+R 8
+U 2
+D 6
+R 1
+D 4
+R 8
+U 8
+L 1
+U 4
+R 2
+L 2
+D 3
+U 1
+R 4
+U 6
+D 6
+L 3
+R 4
+D 7
+R 5
+D 8
+R 6
+U 4
+L 7
+D 5
+U 5
+L 5
+D 4
+U 4
+D 7
+R 8
+L 2
+R 1
+D 8
+R 4
+U 4
+R 6
+D 7
+U 6
+D 5
+R 6
+L 6
+U 6
+R 7
+D 3
+L 4
+R 5
+D 4
+L 3
+D 3
+U 3
+D 6
+U 7
+D 1
+L 1
+U 6
+D 7
+R 8
+U 2
+D 1
+R 6
+D 6
+L 6
+U 1
+D 9
+U 3
+R 1
+D 9
+R 4
+D 2
+R 4
+D 1
+U 9
+D 4
+R 5
+U 5
+L 2
+U 7
+L 8
+U 7
+L 5
+U 6
+R 5
+U 5
+D 9
+R 3
+D 2
+U 6
+L 3
+U 9
+R 9
+L 4
+U 9
+L 7
+D 2
+L 6
+D 8
+L 1
+R 5
+U 8
+D 1
+R 4
+L 3
+U 7
+D 4
+U 2
+L 4
+R 4
+L 1
+R 5
+L 6
+R 9
+D 1
+U 4
+D 9
+R 4
+L 6
+D 7
+L 7
+D 8
+R 4
+D 7
+R 6
+U 2
+R 1
+D 3
+U 8
+R 4
+L 7
+U 9
+R 9
+U 1
+D 4
+L 2
+R 4
+L 1
+D 3
+R 8
+U 5
+L 6
+R 8
+U 6
+R 4
+U 7
+R 7
+L 6
+D 3
+U 1
+D 8
+L 9
+U 3
+D 1
+L 8
+D 3
+U 1
+D 2
+R 3
+D 6
+R 4
+U 2
+L 4
+D 7
+R 1
+D 1
+R 3
+D 5
+U 3
+R 4
+L 2
+D 6
+U 1
+R 5
+U 5
+D 1
+R 10
+U 10
+L 3
+R 1
+L 2
+U 10
+R 1
+U 7
+R 7
+D 2
+U 8
+L 9
+D 4
+U 7
+L 8
+D 2
+L 5
+U 9
+R 9
+U 6
+L 7
+R 1
+D 8
+L 2
+U 1
+L 2
+R 6
+D 5
+U 10
+R 10
+L 2
+R 1
+L 1
+D 2
+U 7
+D 10
+R 2
+D 1
+R 5
+U 4
+D 8
+R 9
+U 10
+L 6
+R 4
+L 10
+R 8
+L 9
+D 5
+R 6
+U 9
+L 6
+D 2
+U 9
+D 1
+U 7
+L 2
+U 1
+D 8
+R 2
+U 3
+L 5
+R 1
+D 8
+R 1
+D 7
+R 6
+U 2
+L 4
+D 8
+R 4
+U 3
+D 10
+L 6
+D 5
+L 1
+U 8
+D 4
+R 8
+D 10
+R 7
+U 5
+R 5
+L 10
+D 1
+R 8
+U 1
+L 8
+U 10
+R 3
+U 6
+L 1
+R 3
+L 6
+D 8
+L 4
+R 6
+L 1
+D 10
+R 1
+D 5
+R 5
+D 8
+U 2
+R 2
+U 1
+D 1
+L 10
+R 10
+D 1
+U 10
+L 11
+R 2
+L 1
+D 5
+L 5
+R 7
+U 10
+D 8
+L 1
+R 9
+D 11
+R 7
+L 1
+R 4
+D 2
+L 9
+U 2
+R 11
+L 2
+R 11
+U 7
+R 4
+U 5
+L 7
+D 10
+L 3
+D 6
+L 3
+D 1
+L 7
+R 10
+D 4
+U 8
+D 11
+L 4
+U 3
+R 11
+U 9
+L 4
+U 11
+R 9
+U 6
+L 1
+D 11
+R 6
+L 10
+R 5
+D 7
+R 5
+L 1
+R 4
+D 6
+L 3
+U 6
+D 8
+R 6
+L 4
+R 2
+L 9
+R 5
+D 3
+R 6
+D 7
+L 1
+U 4
+D 11
+U 10
+R 1
+U 6
+R 1
+D 4
+U 7
+R 9
+U 6
+R 10
+L 2
+D 8
+U 8
+D 2
+U 6
+L 3
+R 10
+U 11
+R 2
+D 6
+L 10
+U 11
+R 11
+D 11
+U 11
+R 5
+D 9
+R 8
+U 4
+L 3
+D 4
+L 2
+R 11
+U 9
+D 1
+U 8
+R 9
+L 6
+U 8
+D 10
+U 7
+L 7
+R 1
+D 10
+U 2
+R 2
+L 10
+U 4
+R 1
+L 3
+D 3
+R 11
+L 4
+R 6
+L 6
+D 5
+R 10
+U 1
+D 5
+U 7
+D 10
+R 9
+L 1
+U 9
+R 10
+D 9
+U 2
+R 7
+D 5
+R 7
+U 2
+D 1
+R 3
+L 12
+R 6
+U 8
+L 7
+R 7
+D 11
+L 8
+U 2
+L 1
+U 9
+L 5
+R 3
+L 10
+U 6
+L 10
+D 2
+R 5
+D 7
+L 11
+R 12
+D 11
+U 2
+R 11
+D 9
+R 2
+U 9
+D 10
+U 4
+R 7
+L 12
+D 7
+R 3
+L 6
+D 3
+R 7
+D 8
+R 5
+U 7
+R 8
+D 3
+R 5
+D 4
+U 4
+L 3
+D 2
+L 5
+D 4
+L 8
+U 1
+R 4
+L 6
+D 1
+U 11
+R 5
+L 6
+R 2
+L 6
+D 1
+R 10
+U 9
+L 7
+U 6
+D 3
+L 10
+D 11
+L 1
+U 9
+L 11
+R 2
+D 2
+R 5
+L 5
+U 7
+R 5
+U 12
+D 10
+R 5
+L 12
+R 10
+U 2
+R 7
+U 7
+D 6
+U 6
+L 13
+R 12
+L 9
+R 6
+L 5
+R 11
+U 10
+R 13
+L 7
+D 10
+U 11
+R 7
+U 5
+L 5
+D 1
+L 2
+D 7
+U 10
+R 4
+L 4
+R 9
+U 7
+L 13
+U 8
+L 1
+D 2
+R 5
+L 4
+D 9
+U 9
+L 13
+D 3
+L 5
+U 9
+L 1
+R 11
+L 6
+D 8
+R 10
+D 13
+U 10
+L 8
+D 7
+R 13
+L 6
+U 7
+L 2
+D 13
+U 4
+L 10
+U 10
+R 13
+L 10
+U 5
+R 1
+L 1
+R 1
+D 9
+R 8
+D 9
+R 5
+D 1
+R 5
+U 4
+R 9
+D 12
+R 4
+U 2
+R 2
+U 5
+D 1
+R 10
+L 7
+D 8
+R 3
+L 5
+D 7
+L 4
+D 6
+U 11
+D 8
+U 13
+R 8
+U 1
+D 11
+R 8
+D 1
+U 13
+L 10
+R 11
+D 3
+L 11
+U 4
+D 13
+R 9
+L 1
+D 1
+U 3
+L 8
+U 11
+R 1
+L 6
+U 7
+R 9
+U 8
+D 6
+L 10
+U 11
+L 9
+D 7
+U 7
+R 5
+L 3
+R 8
+U 1
+L 13
+R 5
+L 11
+U 5
+R 9
+L 14
+R 1
+L 12
+R 11
+D 4
+R 11
+U 5
+R 10
+D 10
+U 7
+R 2
+L 5
+R 4
+L 2
+R 1
+D 6
+R 7
+L 4
+U 6
+D 12
+L 12
+D 6
+U 9
+D 12
+L 9
+R 1
+L 11
+U 5
+D 12
+U 6
+D 1
+U 7
+D 7
+U 7
+D 1
+R 14
+D 1
+R 5
+U 12
+D 1
+R 2
+U 12
+R 6
+U 6
+L 3
+U 8
+R 5
+U 4
+R 14
+D 1
+U 12
+R 10
+D 12
+R 11
+L 8
+D 2
+R 5
+U 12
+R 11
+L 5
+R 7
+L 6
+U 3
+L 3
+R 5
+D 12
+L 9
+U 13
+L 3
+D 3
+U 10
+R 6
+U 11
+L 12
+R 11
+U 2
+D 9
+U 11
+L 5
+U 14
+R 3
+U 13
+D 7
+L 2
+D 9
+R 3
+D 1
+U 14
+D 3
+U 14
+D 14
+L 10
+U 4
+D 2
+R 4
+U 14
+L 8
+U 6
+D 6
+L 4
+D 9
+R 4
+U 13
+D 8
+U 4
+R 13
+U 3
+R 3
+D 5
+R 1
+U 13
+L 4
+U 4
+D 6
+U 3
+R 6
+U 14
+R 7
+U 9
+L 8
+R 8
+L 4
+R 9
+U 8
+R 10
+D 12
+U 1
+D 1
+U 7
+L 15
+R 7
+U 8
+D 14
+L 10
+R 5
+U 4
+L 14
+U 7
+D 7
+L 13
+R 11
+L 11
+U 4
+D 11
+L 2
+U 15
+L 2
+U 10
+D 12
+L 4
+R 7
+L 3
+U 13
+R 3
+U 6
+D 7
+U 9
+R 5
+D 9
+U 4
+L 10
+D 7
+R 12
+U 11
+L 9
+D 3
+U 6
+R 11
+D 4
+L 4
+R 12
+D 3
+R 12
+D 10
+R 13
+U 1
+D 15
+L 8
+U 14
+L 8
+R 2
+L 8
+D 7
+R 11
+U 8
+R 13
+L 7
+U 5
+R 6
+U 1
+R 6
+D 3
+R 10
+D 11
+U 9
+R 7
+L 3
+R 1
+U 2
+R 15
+L 15
+R 3
+L 8
+D 15
+R 8
+L 1
+R 12
+L 5
+U 15
+D 11
+R 3
+L 12
+D 15
+R 10
+D 11
+R 11
+L 7
+D 12
+L 8
+D 11
+L 11
+D 12
+L 5
+D 8
+R 11
+U 5
+L 7
+R 7
+U 13
+D 2
+U 2
+L 16
+R 15
+L 13
+R 5
+U 8
+L 8
+R 16
+D 12
+R 12
+L 11
+D 8
+L 2
+D 9
+R 13
+L 3
+U 5
+R 11
+U 16
+L 1
+U 14
+L 3
+D 3
+U 1
+D 5
+R 11
+D 4
+L 9
+U 1
+L 9
+R 1
+D 13
+L 9
+U 13
+L 3
+U 9
+D 9
+R 1
+U 13
+D 4
+U 16
+R 15
+L 10
+D 15
+U 6
+D 1
+R 15
+D 8
+R 10
+D 5
+U 7
+R 7
+L 14
+U 1
+D 3
+R 8
+D 7
+L 3
+U 13
+D 14
+R 4
+L 9
+R 13
+D 15
+R 9
+D 14
+R 10
+U 5
+L 5
+U 10
+D 14
+U 8
+D 8
+L 6
+U 1
+R 15
+D 2
+R 6
+L 9
+D 2
+R 11
+U 2
+L 5
+D 9
+R 4
+L 14
+D 9
+R 5
+D 8
+L 9
+R 15
+L 5
+D 1
+L 8
+U 12
+R 14
+L 7
+U 12
+R 3
+D 15
+R 6
+U 9
+L 13
+U 11
+R 9
+U 7
+D 16
+R 14
+L 1
+D 8
+U 8
+R 1
+D 2
+L 4
+U 8
+L 9
+U 17
+L 17
+D 16
+R 1
+U 7
+R 5
+D 1
+R 9
+U 1
+D 6
+L 8
+U 8
+D 14
+L 4
+U 10
+L 17
+R 15
+L 8
+D 3
+U 16
+R 8
+L 11
+R 17
+L 12
+D 11
+L 16
+U 4
+D 13
+U 13
+L 17
+R 12
+U 16
+R 14
+D 10
+U 14
+D 1
+L 9
+U 4
+D 14
+U 7
+L 3
+R 11
+D 17
+L 2
+R 12
+L 4
+U 5
+R 1
+D 2
+R 8
+D 7
+R 10
+D 16
+R 8
+L 2
+D 12
+U 5
+R 4
+D 6
+U 17
+L 11
+D 13
+L 6
+R 17
+U 5
+D 5
+L 6
+R 4
+U 4
+L 6
+U 8
+L 4
+U 17
+R 1
+L 17
+R 17
+L 10
+D 17
+L 11
+U 17
+L 13
+R 15
+L 9
+U 3
+R 15
+L 12
+R 7
+D 13
+U 7
+L 3
+R 2
+U 15
+R 16
+U 2
+D 6
+U 15
+D 3
+R 4
+L 18
+D 6
+L 9
+U 15
+D 12
+R 5
+U 11
+L 5
+D 9
+R 4
+L 11
+R 8
+L 18
+D 2
+L 9
+U 11
+R 4
+U 10
+R 12
+L 7
+U 10
+D 16
+U 1
+L 17
+R 10
+U 3
+R 7
+U 11
+R 8
+D 10
+R 9
+L 10
+D 10
+R 17
+D 13
+U 5
+R 3
+D 4
+R 16
+L 14
+U 14
+R 5
+U 15
+L 16
+U 13
+L 18
+U 2
+L 3
+D 10
+L 15
+D 6
+U 18
+L 16
+D 3
+R 10
+L 14
+D 18
+L 10
+D 14
+U 11
+L 1
+U 17
+R 3
+L 17
+U 6
+D 18
+R 16
+D 14
+L 12
+R 9
+U 2
+R 8
+D 1
+U 3
+D 16
+R 18
+D 6
+R 1
+L 6
+D 14
+U 5
+D 18
+L 3
+U 7
+L 2
+D 12
+L 7
+U 8
+L 11
+R 1
+U 8
+L 10
+D 9
+U 13
+R 1
+L 8
+D 12
+U 8
+R 4
+U 7
+R 11
+L 17
+U 9
+D 13
+R 18
+U 10
+L 19
+D 18
+U 13
+D 16
+U 5
+L 1
+D 6
+R 16
+U 7
+D 14
+R 13
+U 12
+L 18
+R 6
+U 12
+L 18
+R 9
+L 18
+R 18
+D 1
+L 17
+D 9
+U 6
+R 18
+D 15
+R 1
+D 7
+R 9
+D 1
+L 9
+R 4
+D 1
+L 18
+D 1
+U 19
+L 7
+R 11
+U 3
+R 2
+L 10
+U 6
+D 9
+R 14
+D 16
+L 8
+D 12
+R 2
+D 1
+U 19
+L 18
+D 13
+L 18
+R 14
+L 11
+U 17
+D 6
+L 9
+R 3
+U 15
+L 6
+U 12
+R 8
+U 4
+R 3
+U 15
+L 12
+U 10
+L 17
+R 10
+L 4
+R 13
+D 13
+U 18
+D 3
+L 4
+R 1
+D 17
+R 1
+U 19
+L 17
+D 15
+R 17
+U 10
+D 8
+U 11
+L 14
+R 9
+L 1
+R 8
+L 7
+U 8
+R 4
+D 6
+R 5
+U 17
+D 6
+U 6
+L 8
+D 5
+L 19
+D 19
+R 12
+D 3
+U 6
+D 17
diff --git a/09/sample.txt b/09/sample.txt
new file mode 100644
index 0000000..9874df2
--- /dev/null
+++ b/09/sample.txt
@@ -0,0 +1,8 @@
+R 4
+U 4
+L 3
+D 1
+R 4
+D 1
+L 5
+R 2
diff --git a/09/sample2.txt b/09/sample2.txt
new file mode 100644
index 0000000..60bd43b
--- /dev/null
+++ b/09/sample2.txt
@@ -0,0 +1,8 @@
+R 5
+U 8
+L 8
+D 3
+R 17
+D 10
+L 25
+U 20
diff --git a/10/1.lua b/10/1.lua
new file mode 100644
index 0000000..b20d193
--- /dev/null
+++ b/10/1.lua
@@ -0,0 +1,41 @@
+require "ext"
+
+local cpu = {
+ r = {x = 1},
+ isa = {
+ addx = {
+ nargs = 1,
+ cycles = 2,
+ f = function(self,v)
+ self.r.x = self.r.x + tonumber(v)
+ end
+ },
+ noop = {
+ nargs = 0,
+ cycles = 1,
+ f = function(self) end
+ }
+ }
+}
+
+local strength_sum = 0
+local cycle = 1
+for line in io.lines() do
+ local parts = {}
+ for part in line:gmatch("(%S+)") do
+ table.insert(parts,part)
+ end
+ local insn = table.remove(parts,1)
+ local ins = cpu.isa[insn]
+ assertf(ins, "No instruction %s in %s",insn,line)
+ for i = cycle,cycle + ins.cycles - 1 do
+ if (i - 20) % 40 == 0 then
+ local strength = i * cpu.r.x
+ strength_sum = strength_sum + strength
+ break
+ end
+ end
+ cycle = cycle + ins.cycles
+ ins.f(cpu,table.unpack(parts))
+end
+print(strength_sum)
diff --git a/10/2.lua b/10/2.lua
new file mode 100644
index 0000000..377870d
--- /dev/null
+++ b/10/2.lua
@@ -0,0 +1,46 @@
+require "ext"
+
+local w, h = 40, 6
+local cpu = {
+ r = {x = 1},
+ isa = {
+ addx = {
+ nargs = 1,
+ cycles = 2,
+ f = function(self,v)
+ self.r.x = self.r.x + tonumber(v)
+ end
+ },
+ noop = {
+ nargs = 0,
+ cycles = 1,
+ f = function(self) end
+ }
+ }
+}
+
+local strength_sum = 0
+local cycle = 1
+for line in io.lines() do
+ local parts = {}
+ for part in line:gmatch("(%S+)") do
+ table.insert(parts,part)
+ end
+ local insn = table.remove(parts,1)
+ local ins = cpu.isa[insn]
+ assertf(ins, "No instruction %s in %s",insn,line)
+ for i = cycle,cycle + ins.cycles - 1 do
+ local crtpos = (i-1) % w
+ if crtpos + 1 == cpu.r.x or crtpos == cpu.r.x or crtpos - 1 == cpu.r.x then
+ io.write("#")
+ else
+ io.write(" ")
+ end
+ if i % 40 == 0 then
+ io.write("\n")
+ end
+ end
+ cycle = cycle + ins.cycles
+ ins.f(cpu,table.unpack(parts))
+end
+print(strength_sum)
diff --git a/10/ext.lua b/10/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/10/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/10/input.txt b/10/input.txt
new file mode 100644
index 0000000..0abc374
--- /dev/null
+++ b/10/input.txt
@@ -0,0 +1,137 @@
+noop
+addx 22
+addx -17
+addx 1
+addx 4
+addx 17
+addx -16
+addx 4
+addx 1
+addx 21
+addx -17
+addx -10
+noop
+addx 17
+addx -1
+addx 5
+addx -1
+noop
+addx 4
+addx 1
+noop
+addx -37
+addx 5
+addx 27
+addx -22
+addx -2
+addx 2
+addx 5
+addx 2
+addx 5
+noop
+noop
+addx -2
+addx 5
+addx 16
+addx -11
+addx -2
+addx 2
+addx 5
+addx 2
+addx -8
+addx 9
+addx -38
+addx 5
+addx 20
+addx -16
+addx 8
+addx -5
+addx 1
+addx 4
+noop
+noop
+addx 5
+addx -2
+noop
+noop
+addx 18
+noop
+addx -8
+addx 2
+addx 7
+addx -2
+noop
+noop
+noop
+noop
+noop
+addx -35
+noop
+addx 32
+addx -26
+addx 12
+addx -8
+addx 3
+noop
+addx 2
+addx 16
+addx -24
+addx 11
+addx 3
+addx -17
+addx 17
+addx 5
+addx 2
+addx -15
+addx 22
+addx 3
+noop
+addx -40
+noop
+addx 2
+noop
+addx 3
+addx 13
+addx -6
+addx 10
+addx -9
+addx 2
+addx 22
+addx -15
+addx 8
+addx -7
+addx 2
+addx 5
+addx 2
+addx -32
+addx 33
+addx 2
+addx 5
+addx -39
+addx -1
+addx 3
+addx 4
+addx 1
+addx 4
+addx 21
+addx -20
+addx 2
+addx 12
+addx -4
+noop
+noop
+noop
+noop
+noop
+addx 4
+noop
+noop
+noop
+addx 6
+addx -27
+addx 31
+noop
+noop
+noop
+noop
+noop
diff --git a/10/sample.txt b/10/sample.txt
new file mode 100644
index 0000000..37ee8ee
--- /dev/null
+++ b/10/sample.txt
@@ -0,0 +1,146 @@
+addx 15
+addx -11
+addx 6
+addx -3
+addx 5
+addx -1
+addx -8
+addx 13
+addx 4
+noop
+addx -1
+addx 5
+addx -1
+addx 5
+addx -1
+addx 5
+addx -1
+addx 5
+addx -1
+addx -35
+addx 1
+addx 24
+addx -19
+addx 1
+addx 16
+addx -11
+noop
+noop
+addx 21
+addx -15
+noop
+noop
+addx -3
+addx 9
+addx 1
+addx -3
+addx 8
+addx 1
+addx 5
+noop
+noop
+noop
+noop
+noop
+addx -36
+noop
+addx 1
+addx 7
+noop
+noop
+noop
+addx 2
+addx 6
+noop
+noop
+noop
+noop
+noop
+addx 1
+noop
+noop
+addx 7
+addx 1
+noop
+addx -13
+addx 13
+addx 7
+noop
+addx 1
+addx -33
+noop
+noop
+noop
+addx 2
+noop
+noop
+noop
+addx 8
+noop
+addx -1
+addx 2
+addx 1
+noop
+addx 17
+addx -9
+addx 1
+addx 1
+addx -3
+addx 11
+noop
+noop
+addx 1
+noop
+addx 1
+noop
+noop
+addx -13
+addx -19
+addx 1
+addx 3
+addx 26
+addx -30
+addx 12
+addx -1
+addx 3
+addx 1
+noop
+noop
+noop
+addx -9
+addx 18
+addx 1
+addx 2
+noop
+noop
+addx 9
+noop
+noop
+noop
+addx -1
+addx 2
+addx -37
+addx 1
+addx 3
+noop
+addx 15
+addx -21
+addx 22
+addx -6
+addx 1
+noop
+addx 2
+addx 1
+noop
+addx -10
+noop
+noop
+addx 20
+addx 1
+addx 2
+addx 2
+addx -6
+addx -11
+noop
+noop
+noop
diff --git a/11/1.lua b/11/1.lua
new file mode 100644
index 0000000..7204e49
--- /dev/null
+++ b/11/1.lua
@@ -0,0 +1,49 @@
+local monkeys = {}
+
+for line in io.lines() do
+ if line:match("^Monkey") then
+ local id = line:match("Monkey (%d+)")
+ table.insert(monkeys,{items={},inspected= 0, id=id})
+ elseif line:match("Starting items:") then
+ for item in line:gmatch("(%d+)") do
+ table.insert(monkeys[#monkeys].items,tonumber(item))
+ end
+ elseif line:match("Operation:") then
+ op, val = line:match("new = old (.) (%S+)")
+ monkeys[#monkeys].op = op
+ monkeys[#monkeys].val = val
+ elseif line:match("Test:") then
+ monkeys[#monkeys].test = tonumber(line:match("Test: divisible by (%d+)"))
+ elseif line:match("If true:") then
+ monkeys[#monkeys].t = tonumber(line:match("throw to monkey (%d+)")) + 1
+ elseif line:match("If false:") then
+ monkeys[#monkeys].f = tonumber(line:match("throw to monkey (%d+)")) + 1
+ end
+end
+
+for round = 1,20 do
+ for turn, monkey in ipairs(monkeys) do
+ monkey.inspected = monkey.inspected + #monkey.items
+ for _,item in ipairs(monkey.items) do
+ local worry = item
+ if monkey.op == "+" and monkey.val == "old" then
+ worry = worry * 2
+ elseif monkey.op == "*" and monkey.val == "old" then
+ worry = worry * worry
+ elseif monkey.op == "+" and tonumber(monkey.val) then
+ worry = worry + tonumber(monkey.val)
+ elseif monkey.op == "*" and tonumber(monkey.val) then
+ worry = worry * tonumber(monkey.val)
+ end
+ local newworry = math.floor(worry / 3)
+ if newworry % monkey.test == 0 then
+ table.insert(monkeys[monkey.t].items,newworry)
+ else
+ table.insert(monkeys[monkey.f].items,newworry)
+ end
+ end
+ monkey.items = {}
+ end
+end
+table.sort(monkeys, function(a,b) return a.inspected > b.inspected end)
+print(monkeys[1].inspected * monkeys[2].inspected)
diff --git a/11/2.lua b/11/2.lua
new file mode 100644
index 0000000..e26ddd2
--- /dev/null
+++ b/11/2.lua
@@ -0,0 +1,54 @@
+local monkeys = {}
+
+for line in io.lines() do
+ if line:match("^Monkey") then
+ local id = line:match("Monkey (%d+)")
+ table.insert(monkeys,{items={},inspected= 0, id=id})
+ elseif line:match("Starting items:") then
+ for item in line:gmatch("(%d+)") do
+ table.insert(monkeys[#monkeys].items,tonumber(item))
+ end
+ elseif line:match("Operation:") then
+ op, val = line:match("new = old (.) (%S+)")
+ monkeys[#monkeys].op = op
+ monkeys[#monkeys].val = val
+ elseif line:match("Test:") then
+ monkeys[#monkeys].test = tonumber(line:match("Test: divisible by (%d+)"))
+ elseif line:match("If true:") then
+ monkeys[#monkeys].t = tonumber(line:match("throw to monkey (%d+)")) + 1
+ elseif line:match("If false:") then
+ monkeys[#monkeys].f = tonumber(line:match("throw to monkey (%d+)")) + 1
+ end
+end
+local divisor = 1
+for _, monkey in pairs(monkeys) do
+ divisor = divisor * monkey.test
+end
+
+
+for round = 1,10000 do
+ for turn, monkey in ipairs(monkeys) do
+ monkey.inspected = monkey.inspected + #monkey.items
+ for _,item in ipairs(monkey.items) do
+ local worry = item
+ if monkey.op == "+" and monkey.val == "old" then
+ worry = worry * 2
+ elseif monkey.op == "*" and monkey.val == "old" then
+ worry = worry * worry
+ elseif monkey.op == "+" and tonumber(monkey.val) then
+ worry = worry + tonumber(monkey.val)
+ elseif monkey.op == "*" and tonumber(monkey.val) then
+ worry = worry * tonumber(monkey.val)
+ end
+ local newworry = worry % divisor
+ if newworry % monkey.test == 0 then
+ table.insert(monkeys[monkey.t].items,newworry)
+ else
+ table.insert(monkeys[monkey.f].items,newworry)
+ end
+ end
+ monkey.items = {}
+ end
+end
+table.sort(monkeys, function(a,b) return a.inspected > b.inspected end)
+print(monkeys[1].inspected * monkeys[2].inspected)
diff --git a/11/ext.lua b/11/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/11/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/11/input.txt b/11/input.txt
new file mode 100755
index 0000000..b928712
--- /dev/null
+++ b/11/input.txt
@@ -0,0 +1,55 @@
+Monkey 0:
+ Starting items: 71, 56, 50, 73
+ Operation: new = old * 11
+ Test: divisible by 13
+ If true: throw to monkey 1
+ If false: throw to monkey 7
+
+Monkey 1:
+ Starting items: 70, 89, 82
+ Operation: new = old + 1
+ Test: divisible by 7
+ If true: throw to monkey 3
+ If false: throw to monkey 6
+
+Monkey 2:
+ Starting items: 52, 95
+ Operation: new = old * old
+ Test: divisible by 3
+ If true: throw to monkey 5
+ If false: throw to monkey 4
+
+Monkey 3:
+ Starting items: 94, 64, 69, 87, 70
+ Operation: new = old + 2
+ Test: divisible by 19
+ If true: throw to monkey 2
+ If false: throw to monkey 6
+
+Monkey 4:
+ Starting items: 98, 72, 98, 53, 97, 51
+ Operation: new = old + 6
+ Test: divisible by 5
+ If true: throw to monkey 0
+ If false: throw to monkey 5
+
+Monkey 5:
+ Starting items: 79
+ Operation: new = old + 7
+ Test: divisible by 2
+ If true: throw to monkey 7
+ If false: throw to monkey 0
+
+Monkey 6:
+ Starting items: 77, 55, 63, 93, 66, 90, 88, 71
+ Operation: new = old * 7
+ Test: divisible by 11
+ If true: throw to monkey 2
+ If false: throw to monkey 4
+
+Monkey 7:
+ Starting items: 54, 97, 87, 70, 59, 82, 59
+ Operation: new = old + 8
+ Test: divisible by 17
+ If true: throw to monkey 1
+ If false: throw to monkey 3
diff --git a/11/sample.txt b/11/sample.txt
new file mode 100644
index 0000000..aa6f21a
--- /dev/null
+++ b/11/sample.txt
@@ -0,0 +1,27 @@
+Monkey 0:
+ Starting items: 79, 98
+ Operation: new = old * 19
+ Test: divisible by 23
+ If true: throw to monkey 2
+ If false: throw to monkey 3
+
+Monkey 1:
+ Starting items: 54, 65, 75, 74
+ Operation: new = old + 6
+ Test: divisible by 19
+ If true: throw to monkey 2
+ If false: throw to monkey 0
+
+Monkey 2:
+ Starting items: 79, 60, 97
+ Operation: new = old * old
+ Test: divisible by 13
+ If true: throw to monkey 1
+ If false: throw to monkey 3
+
+Monkey 3:
+ Starting items: 74
+ Operation: new = old + 3
+ Test: divisible by 17
+ If true: throw to monkey 0
+ If false: throw to monkey 1 \ No newline at end of file
diff --git a/12/1.lua b/12/1.lua
new file mode 100644
index 0000000..4296caf
--- /dev/null
+++ b/12/1.lua
@@ -0,0 +1,39 @@
+#!/usr/bin/env lua
+local heights = {}
+for i = string.byte('a'),string.byte('z') do
+ heights[string.char(i)] = i - string.byte('a')
+end
+heights.S, heights.E = heights.a, heights.z
+
+local map = {}
+local start, endpos
+for line in io.lines() do
+ map[#map+1] = {}
+ for char in line:gmatch("(.)") do
+ table.insert(map[#map],{height = heights[char], wts = math.huge})
+ if char == "S" then
+ start = {#map,#map[#map]}
+ map[#map][#map[#map]].wts = 0
+ elseif char == "E" then
+ endpos = {#map,#map[#map]}
+ end
+ end
+end
+
+local adjacents = {{-1,0},{1,0},{0,-1},{0,1}} -- up, down, left, right
+local seen,unseen = {},{start}
+while #unseen > 0 do
+ local vertex = table.remove(unseen,1)
+ local data = map[vertex[1]][vertex[2]]
+ for _, offset in pairs(adjacents) do
+ local row,col = vertex[1] + offset[1], vertex[2] + offset[2]
+ if map[row] and map[row][col] and (map[row][col].height <= data.height + 1) then
+ local adata = map[row][col]
+ if adata.wts > data.wts + 1 then
+ adata.wts = data.wts + 1
+ table.insert(unseen,{row,col})
+ end
+ end
+ end
+end
+print(map[endpos[1]][endpos[2]].wts)
diff --git a/12/2.lua b/12/2.lua
new file mode 100644
index 0000000..e4f2c1f
--- /dev/null
+++ b/12/2.lua
@@ -0,0 +1,42 @@
+#!/usr/bin/env lua
+
+local heights = {}
+for i = string.byte('a'),string.byte('z') do
+ heights[string.char(i)] = i - string.byte('a')
+end
+heights.S, heights.E = heights.a, heights.z
+
+local map = {}
+local seen, unseen = {},{}
+local endpos
+for line in io.lines() do
+ map[#map+1] = {}
+ for char in line:gmatch("(.)") do
+ table.insert(map[#map],{height = heights[char], wts = math.huge})
+ if char == "S" then
+ start = {#map,#map[#map]}
+ map[#map][#map[#map]].wts = 0
+ elseif char == "E" then
+ endpos = {#map,#map[#map]}
+ elseif char == "a" then
+ table.insert(unseen, {#map,#map[#map]})
+ map[#map][#map[#map]].wts = 0
+ end
+ end
+end
+local adjacents = {{-1,0},{1,0},{0,-1},{0,1}}
+while #unseen > 0 do
+ local vertex = table.remove(unseen,1)
+ local data = map[vertex[1]][vertex[2]]
+ for _, offset in pairs(adjacents) do
+ local row,col = vertex[1] + offset[1], vertex[2] + offset[2]
+ if map[row] and map[row][col] and (map[row][col].height <= data.height + 1) then
+ local adata = map[row][col]
+ if adata.wts > data.wts + 1 then
+ adata.wts = data.wts + 1
+ table.insert(unseen,{row,col})
+ end
+ end
+ end
+end
+print(map[endpos[1]][endpos[2]].wts)
diff --git a/12/ext.lua b/12/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/12/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/12/input.txt b/12/input.txt
new file mode 100644
index 0000000..bac8753
--- /dev/null
+++ b/12/input.txt
@@ -0,0 +1,41 @@
+abccccccccccccccccccaaaaaaaaacccccccccccccccccccccccccccccccccccccaaaa
+abcccccccccccccccaaaaaaaaaaacccccccccccccccccccccccccccccccccccccaaaaa
+abcaaccaacccccccccaaaaaaaaaacccccccccccccccccccccaaacccccccccccccaaaaa
+abcaaaaaaccccccccaaaaaaaaaaaaacccccccccccccccccccaacccccccccccccaaaaaa
+abcaaaaaacccaaacccccaaaaaaaaaaaccccccccccccccccccaaaccccccccccccccccaa
+abaaaaaaacccaaaaccccaaaaaacaaaacccccccccccaaaacjjjacccccccccccccccccca
+abaaaaaaaaccaaaaccccaaaaaaccccccaccccccccccaajjjjjkkcccccccccccccccccc
+abaaaaaaaaccaaacccccccaaaccccccaaccccccccccajjjjjjkkkaaacccaaaccaccccc
+abccaaacccccccccccccccaaccccaaaaaaaacccccccjjjjoookkkkaacccaaaaaaccccc
+abcccaacccccccccccccccccccccaaaaaaaaccccccjjjjoooookkkkcccccaaaaaccccc
+abcccccccaacccccccccccccccccccaaaacccccccijjjoooooookkkkccaaaaaaaccccc
+abccaaccaaaccccccccccccccccccaaaaacccccciijjooouuuoppkkkkkaaaaaaaacccc
+abccaaaaaaaccccccccccaaaaacccaacaaaccciiiiiooouuuuupppkkklllaaaaaacccc
+abccaaaaaacccccccccccaaaaacccacccaaciiiiiiqooouuuuuupppkllllllacaccccc
+abcccaaaaaaaacccccccaaaaaaccccaacaiiiiiqqqqoouuuxuuupppppplllllccccccc
+abccaaaaaaaaaccaaaccaaaaaaccccaaaaiiiiqqqqqqttuxxxuuuppppppplllccccccc
+abccaaaaaaaacccaaaaaaaaaaacccaaaahiiiqqqttttttuxxxxuuuvvpppplllccccccc
+abcaaaaaaacccaaaaaaaaaaacccccaaaahhhqqqqtttttttxxxxuuvvvvvqqlllccccccc
+abcccccaaaccaaaaaaaaaccccccccacaahhhqqqttttxxxxxxxyyyyyvvvqqlllccccccc
+abcccccaaaccaaaaaaaacccccccccccaahhhqqqtttxxxxxxxyyyyyyvvqqqlllccccccc
+SbcccccccccccaaaaaaaaaccccccccccchhhqqqtttxxxxEzzzyyyyvvvqqqmmlccccccc
+abcccccccccccaaaaaaaacccaacccccccchhhppptttxxxxyyyyyvvvvqqqmmmcccccccc
+abccccccccccaaaaaaaaaaccaacccccccchhhpppptttsxxyyyyyvvvqqqmmmccccccccc
+abcaacccccccaaaaaaacaaaaaaccccccccchhhppppsswwyyyyyyyvvqqmmmmccccccccc
+abaaaacccccccaccaaaccaaaaaaacccccccchhhpppsswwyywwyyyvvqqmmmddcccccccc
+abaaaaccccccccccaaaccaaaaaaacccccccchhhpppsswwwwwwwwwvvqqqmmdddccccccc
+abaaaacccccccccaaaccaaaaaaccccccccccgggpppsswwwwrrwwwwvrqqmmdddccccccc
+abccccccaaaaaccaaaacaaaaaaccccccaacccggpppssswwsrrrwwwvrrqmmdddacccccc
+abccccccaaaaaccaaaacccccaaccccaaaaaacggpppssssssrrrrrrrrrnmmdddaaccccc
+abcccccaaaaaaccaaaccccccccccccaaaaaacggppossssssoorrrrrrrnnmdddacccccc
+abcccccaaaaaaccccccccaaaaccccccaaaaacgggoooossoooonnnrrnnnnmddaaaacccc
+abccccccaaaaaccccccccaaaacccccaaaaaccgggoooooooooonnnnnnnnndddaaaacccc
+abccccccaaaccccccccccaaaacccccaaaaacccgggoooooooffennnnnnnedddaaaacccc
+abcccccccccccccccccccaaacccccccaacccccggggffffffffeeeeeeeeeedaaacccccc
+abccccccccccccccccccaaacccccaccaaccccccggfffffffffeeeeeeeeeecaaacccccc
+abccccccccccccccccccaaaacccaaaaaaaaaccccfffffffaaaaaeeeeeecccccccccccc
+abccccccccaacaaccccaaaaaacaaaaaaaaaaccccccccccaaaccaaaaccccccccccccccc
+abccccccccaaaaacccaaaaaaaaaaacaaaaccccccccccccaaaccccaaccccccccccaaaca
+abcccccccaaaaaccccaaaaaaaaaaacaaaaacccccccccccaaaccccccccccccccccaaaaa
+abcccccccaaaaaacccaaaaaaaaaacaaaaaacccccccccccaaccccccccccccccccccaaaa
+abcccccccccaaaaccaaaaaaaaaaaaaaccaaccccccccccccccccccccccccccccccaaaaa
diff --git a/12/sample.txt b/12/sample.txt
new file mode 100644
index 0000000..86e9cac
--- /dev/null
+++ b/12/sample.txt
@@ -0,0 +1,5 @@
+Sabqponm
+abcryxxl
+accszExk
+acctuvwj
+abdefghi
diff --git a/13/1.lua b/13/1.lua
new file mode 100644
index 0000000..94d8bd9
--- /dev/null
+++ b/13/1.lua
@@ -0,0 +1,43 @@
+
+local lines = {}
+for line in io.lines() do table.insert(lines,line) end
+
+local sum = 0
+for i = 1,#lines,3 do
+ local l1,l2 = lines[i], lines[i+1]
+ l1 = l1:gsub("%[","{"):gsub("]","}")
+ l2 = l2:gsub("%[","{"):gsub("]","}")
+ l1 = load("return "..l1)()
+ l2 = load("return "..l2)()
+ local function compare(a,b) -- return true if a comes before b
+ assert(a ~= nil)
+ assert(b ~= nil)
+ if type(a) == "number" and type(b) == "number" then
+ if a < b then return true
+ elseif a > b then return false
+ else return nil end
+ elseif type(a) == "table" and type(b) == "table" then
+ for i = 1,math.min(#a,#b) do
+ local result = compare(a[i],b[i])
+ if result ~= nil then
+ return result
+ end
+ end
+ if #a < #b then
+ return true
+ elseif #a > #b then
+ return false
+ else
+ return nil
+ end
+ elseif type(a) == "number" and type(b) == "table" then
+ return compare({a},b)
+ elseif type(a) == "table" and type(b) == "number" then
+ return compare(a,{b})
+ end
+ end
+ if compare(l1,l2) then
+ sum = sum + ((i+2)/3)
+ end
+end
+print(sum)
diff --git a/13/2.lua b/13/2.lua
new file mode 100644
index 0000000..4af213c
--- /dev/null
+++ b/13/2.lua
@@ -0,0 +1,64 @@
+require "ext"
+local lines = {}
+for line in io.lines() do table.insert(lines,line) end
+
+local sum = 0
+local loaded = {{{6}},{{2}}}
+for i = 1,#lines,3 do
+ local l1,l2 = lines[i], lines[i+1]
+ l1 = l1:gsub("%[","{"):gsub("]","}")
+ l2 = l2:gsub("%[","{"):gsub("]","}")
+ l1 = load("return "..l1)()
+ l2 = load("return "..l2)()
+ table.insert(loaded,l1)
+ table.insert(loaded,l2)
+end
+
+local function compare(a,b) -- return true if a comes before b
+ assert(a ~= nil)
+ assert(b ~= nil)
+ if type(a) == "number" and type(b) == "number" then
+ if a < b then return true
+ elseif a > b then return false
+ else return nil end
+ elseif type(a) == "table" and type(b) == "table" then
+ for i = 1,math.min(#a,#b) do
+ local result = compare(a[i],b[i])
+ if result ~= nil then
+ return result
+ end
+ end
+ if #a < #b then
+ return true
+ elseif #a > #b then
+ return false
+ else
+ return nil
+ end
+ elseif type(a) == "number" and type(b) == "table" then
+ return compare({a},b)
+ elseif type(a) == "table" and type(b) == "number" then
+ return compare(a,{b})
+ end
+end
+table.sort(loaded,compare)
+local i2, i6
+for i = 1,#loaded do
+ local function eq(n)
+ return loaded[i] and
+ type(loaded[i]) == "table" and
+ #loaded[i] == 1 and
+ type(loaded[i][1]) == "table" and
+ #loaded[i][1] == 1 and
+ loaded[i][1][1] == n
+ end
+ if eq(6) then
+ print("Found 6 at ",i)
+ i6 = i
+ end
+ if eq(2) then
+ print("Found 2 at ",i)
+ i2 = i
+ end
+end
+print(i6 * i2)
diff --git a/13/ext.lua b/13/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/13/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/13/input.txt b/13/input.txt
new file mode 100644
index 0000000..b34d95a
--- /dev/null
+++ b/13/input.txt
@@ -0,0 +1,449 @@
+[[],[10,[[6,10,0],1,[4,4,5],[4,9,4]],7,[[4,7]]],[2,[9,2],2,[]],[9,[[1,7,10,8]]]]
+[[[[7,8,10,10],3,[6,7,8]],10,[[],2,1,[2,1,1,3],[10,0,8,7,8]],[0]],[5,[[2,1,10,8,6],[7,0,1,2,6],9,[6]],[4],[[4],10,[1,9]],[]],[5,4,[3,8,[2],[3,8],[1,10]],9]]
+
+[[3,8],[[5],[[10,4]],7,[6,[1,2],8]]]
+[[[],[],[3,[3],3],8,[[10],2,[0,8],[8],[8,7,4,2,3]]],[],[[1,6,8,[3,9],[0]],[6,8,[5,10,3]],3,8],[1,10,0,5]]
+
+[[],[6,7,[[9,6,6,3],2,0],6,8],[[],9,[0,[9,1,2]],2],[[9,3,5,[],[7,5,10,6]],[6,[5,4]]]]
+[[10,[9]]]
+
+[[[[],[6,0,7],[],[5]],9]]
+[[[[7,2,10,9,7]],5,[6,[2,9,7,10],[],[10,8,9,7,8],4],[],10],[0,4,[3,[7,3,2,6],6],[[1,4,0,0,3],[5,4],[3,2],4],6]]
+
+[[[[9],[10,8],[4,6],4,[7,6,6]]],[[[],6,0],0,[[5,9],[],[4],[10,9,7,3],[9]],9]]
+[[6,[9]],[7,2]]
+
+[[7,[[7]],[0,[8,0,0,7,10],7,[0,10,9]],[2,[]]],[10,3],[[]],[8,10,[0]]]
+[[[[4],[],8,[4,9,4,1],[3,2]],[9],0,10],[[[],[],1,[9],3],2,0,[1],[[8,5,6],[7,2],[2,1],10,9]],[2,8],[5,[9,[10,9]],6,[],[[1,3,3],0,[5,0]]]]
+
+[[[[0,3,0,6,9],[2,8,2],[],[7]],6]]
+[[[10],[2,9,[2,10,3],[]],2,[0,[3]],[2,[2,5],8,[],5]],[],[[],7],[[0,9,[],[]]]]
+
+[[1]]
+[[],[]]
+
+[[10,[[5,8,2],[6,0]],5,[]],[[4],[[9,5,8,1],[4],10,[10,1,0,4],[3,2,3,6,8]],2],[0,[[7],6],4,[]],[1,[],10],[[[5,2,8,6],[]],9,1,[],1]]
+[[3,9,[],[10,2,[7,9],[]]]]
+
+[[[3,6,6,[10,1,6,1]],[]],[[]]]
+[[5,1],[3,3,[[6,2,8],2]]]
+
+[[[],3,[[4,6],7],1],[[[7,8,7,1,4],[8,1,0,6],[],[4,0,2]],[[4,4,6],10],[[2,7,4,9],1,10,[]],3,[]],[8]]
+[[],[0]]
+
+[[[8,[0,8,2,2,5],[4],7,2],[7],7,[[7,0,1,8],[],8,8],1],[]]
+[[9,2,[[8,8],7,[0,3],[9]]],[7,[[0,10,8]],10,[8]],[[3,4,2],[10,[7],[10,0],[],1]]]
+
+[[[3],9]]
+[[6],[0]]
+
+[[[],[],[0]],[[[6],3,[9,2,9,2,2],[0]],6],[10,[[6],6,0,2,1],[0,[1,2,6,5]]],[[0]]]
+[[4,7],[[9,[10,9,6,6]],[[5,0],[9],7],10],[1,[[6,3,5],0],[[],[7,9],2],[6,[9,8,8]]],[[[1],[7],[7],3],[],[[9,7,0],0,[6,8],[6,9,10,9]],10]]
+
+[[[0,[5,1,6,3,4],3,[6,3,2]]],[1,[1,[4,5]],0],[3,0,[1,4],10],[]]
+[[9,[6,0,[10,6],2],7],[9,[[8,3,3,2],8,[9,1,0],6],4,7],[[2,[]],7,[[4],[4],[2,3,9],2],8],[]]
+
+[[5,[[9,5,3,4,7],8],[6,0,[9,1,1,4],[3]],6],[2,[],9],[[[3,9,7,10,0]],10,10,1]]
+[[1],[6,10,[[10,9,5]],7,3],[],[7,[8,1,6,[7,8,6],[]],[[6],[],6,9,6],[],[]]]
+
+[[],[5,[]],[[4,[0,6,10],[2,8,1,5,8],6],3,4,[[],7,[6,8],[1]],[0,8,5,1,[]]],[10,3,[],9],[[[8,6,0,6,2],8,8],[0],[],[[10,2,0,6],[5,10,5,9,7]],4]]
+[[5,7,1,[7,8,8],10],[]]
+
+[[5,[0,3,[4,1,9],[1,2],[3,6,2,5,3]],3],[[5,[7,1,8],[],2,0],1,[[9,1,0,2],7,3,0],8,5],[]]
+[[[0,0]],[[]],[8,7,[],4,7],[[[9,3,10]],0,[8,[0,0],3,[7,2,4,10],0]],[[8,[]],7,[[7,1,3,9]],[7]]]
+
+[[[],[7,0,4,5,[4]],6,[[5,7,9,7,1],8]],[9],[]]
+[[],[7,6,3,3,9],[[[10,7,10,9],[4],[1,3,1],0],9,[],10,5]]
+
+[[4,[0,[0,7,8,2,3],7,[3,0,9,0],0]],[10,3,[[1,10],[2,6],7,5,1],1],[]]
+[[[[6,2,1],[4,2,5,2]],0,4,[[10,3,3,9],[1]]],[4],[[7,[],1],3]]
+
+[[[],[6,8,[8,2,10,7,7],8]],[[5,5,7]],[[8,8,8,9,2],[[],5,9,[1],0],[],[]],[[[4,8,3],[]],[[1,5,0,1],[5,0,9,10,8]],[7,9,0,[8,5,4,2,6],5]],[10,[10]]]
+[[9,[3,[8]],[[4,0,7,10,8],[5,5],7,5,3],2],[],[[],[[],[0],[5,2,4],8]],[5,4,8],[]]
+
+[[4,[[2,7,5,5,3]],2],[9,[4,[3,1,2,7,6]],9,[[2,8,6],[7,1,4],[4,3,6],[6],1]],[[],[[6,6,0],8,[0,8],5],[[1,3],[0],10]],[[9,2,10,5]],[[[10,7,7,3,1],9,[5,2],8],7]]
+[[[4],[],[10,6],4],[6],[[9,[1,3,10],[4,7,6,5,8],8,[6,7,10,0]],0,[[],[8],8,8]],[],[[[5,6,4,3],4,[1,6,8,9],1,0],[[9,10,9,4],[1],6,5],10]]
+
+[[[[4,9,5],5,0]],[1,9,[10,9,5,[9,4]],[[5,8,2,1]]],[10,[7,4,10,6]],[[0,0,[],8,2]],[]]
+[[[[6,9,9],[9,6],8,8],[10]],[1,[[8,6],[8,8]],[6,[],[3,7,9],6],[2,6,[5,8,0]]]]
+
+[[3],[],[],[[6,6,6],[[0,0,6,4],2],[[3],[7,4,10,4],10],[[7]],[[6],[5,8,6],[0,6],5,[6,2,6,8,1]]]]
+[[5,[2,[]],[]],[2,[],[[],8,5,[]],[]],[[[3],[7,4,8,3],[8,9,6],[]],4,[],[[10],[7],[0,2],[0,1,9,2,4],7],10],[[],[5,5,[8,2,4,7],5,[1,4,6,8,10]],[2]]]
+
+[[10],[],[[[],[5,9,3,1,8],[10]],7,4,[[4,3],7],3],[],[]]
+[[0,3,2,2]]
+
+[[[],[7,1,6,3,[7,6,8]],8]]
+[[3,7,6,[5,[],[],4,4]],[[10,7,9]],[[[9],4,[],1,10],[6,[0],1],[[8,3,1,2,6],5,[2,10,5,9],4,[]]]]
+
+[[2],[[[6],3,9,[1],2]],[[8,[0],0],9,2],[2,[[9,1]]],[]]
+[[],[10,4,[9,3,[9,7,1],7,6]],[2,[[8,4,7],9,[3,1,6,3]]],[4,5,[8]],[[[5,10,10,10,4],[8,10,8,10,0],5,3,5],10,7]]
+
+[[4,[[],3,[8,4]],[6,[7,5,4]],[[10],9,8,10,[9]],1],[[[3,0,2,6],[0,4,10,8,10]],7,1,[[4,6,3,0,5],1,[8,4],10,[1,9,0,4,7]]],[]]
+[[5,4,[],[[10,8,9,7],[4,10]],2],[7,[6]],[0,[[10,5],[2,2,4,10,10]],2,8],[9,[[0,9],7,[0]],6,[[],7,[]]],[6]]
+
+[[[3,5,[9,1],[4,6]],[[5,8,7,1,8],[7,7,2]],[[],4,[8,6,1],[]],[6,9,8],0],[7],[5,[3,8,[4],10,8],[],7],[2,[[4,10],[5,3,6,7],[10,7],5,[7,8,5,4,5]],[]],[[1,3,[4,0,0,3,4],[6,6],[8,0,8,4]]]]
+[[],[[0,2,[3,0]],1,8,[8,[],[5,0,5,10,7],[4,9,6,3,5]]],[6,[[9,10],4],5,8,8],[[]],[10,5,10]]
+
+[[1,7,7],[9]]
+[[4,8,[[]]],[2,5],[],[],[0,[0,[],[9,9,6,7],3]]]
+
+[[6,9,9],[2,[10,6]]]
+[[1,7,6,[]],[3],[[[9],[5,3,6],0,3,3],4,[],6,[0,[7,1,1,4,3],0,8]]]
+
+[[],[[3,[6],9,4,4],2]]
+[[],[[3,4],[8,3,[6,8,6],0],7,[6,2,[7]],10],[[2],[[10,2],[],[1,3],0,[9,5,8,0,0]],1,[8,5,10],[5,4,1,1]],[0,[1],[8,4,[]],[6]]]
+
+[[[[9],8,0],[0,1,10]],[1,10,[6,[2,8,7],6],2,[[3],[2,0],[4,4,3,3]]]]
+[[8,[[7,6],[],5,8,[9,9,2,6,2]],[6,[],9,[6,2,1,4,6]]],[[1,[8,1,5,2]],[7,1,4,[10]],4,4,[5]],[],[[10,1,3,[5,8,3],[7,1,1,7]]]]
+
+[[1,[9,[7,8],4,[6,2,6,4,0]],[[9,4,10],[4,8,5,3]],6,[[0,2,0,5,7],10,[10,0,4,3],9]]]
+[[[[10,1,6]],10,7,[9,7,0,5]],[],[[2,5,5,8]],[10,3,[6,4,7,[7]],9],[[[4,5,7,3,2],[9,10],2,2],[]]]
+
+[[[],9,[9]],[],[9],[],[7,7,[[6,4],3,0],[0,8,[9],[0,6,0,10,1],[1,9,2,5,1]]]]
+[[4,5,[[7,5],[1],3,[6,4,0,10],3],[3]],[[2,[7,0,6],10],[[3,0,5,6],[],[0,4,9,1],[3,10]]],[[[3,0,4,5,1],[4],[6,2,2]],0],[[2,[5,1],[10,9],[8,1],[5,6,7,4,3]],[],[[8,2,6,10],[8,2,0]],9,0]]
+
+[0,7,5,6]
+[0,7,5,6,8]
+
+[[[0,6,[6,8,6,2,2]],1,[[5,7],[10,3],[0,10,4,2],2,7],3]]
+[[[]],[],[[],[8,[8,4,3,2,9],9,7,10]],[[0],0,6,5,9]]
+
+[[[],1,[8],0,[[2],[10,1,5,4,3],[10,1],1]],[0,8,[8,[]],7,[9,10]],[1,[[6],[9,3]],[1,0]]]
+[[4,1,0,2,4],[6,[[9,4,6,1],0,3],[],[1,[9]],[8,5]],[[6,6,6,2]],[6,7,10],[[1,1,[7],9],[[0,1,5],[9,4],10,5,7]]]
+
+[[6,3,[3]],[9,9,3]]
+[[2,5,1],[[[3],2,1,2],6],[8,[6],[9,[6,5,4],[9,1,9,0],[],[7,0]]],[9,8,4,4,[]],[[7,[4,6,6,1],0,1],[[9,3,8],[10,6,3,8]],3,[[],[2,0,10,6],[2,5,9]]]]
+
+[[[7,7,[7,1,10,7,4]],[1,1],1],[[2,6,[9,4,5,10],8,3]],[[4,[3,7,8,2,1],7,3],8,1]]
+[[4,3],[[[2,10,9,9,10],[1,0],5,[1,1,0,8]],0],[7]]
+
+[[8,[[2,5],[5]],[9,[]]],[0,[10],[],3]]
+[[2,3,[9,[4,0,7]],[[6,4],[7,3],5,[]],1],[1,7,10]]
+
+[[[6],0],[10,[5,[6],0,[8,4],0]]]
+[[5,[4,9],[]],[[7,2,[10,6,6,4,2],4],3,9,6,6],[[[3,1,5],0],2,[[8],1,1],4],[]]
+
+[[[[6,9],[7],[7,6]],1,[[10,10,7,5,3],2],[],[[8],5,[1,3,10,0]]],[[[10,1,10,5,8],[8,6,8,3,5],[],[5,3,5,1],0],0,1,[2,0,[4,4,5,10],4],[]],[[10,4],3,[[],5,[3,1,9],1,[1]],2,[6]]]
+[[[0,10,[7,9,7,0,1],[2,2,8,7],[3]],4,[9,[]],[[7],1,2],7],[3,1,1]]
+
+[[[[1],7,0],3],[6,10,[[0]]],[9,[]]]
+[[[[0,2,7],4],[],10,6],[5],[6,7],[[1,5,4,8],[8,[2,5,1],6],4,[[8,9,7,9],[]]],[[],[4,7,[7,9,7]],[[4,3,7],7,[9,1,3]],5,[2,9,5,[0,2],5]]]
+
+[[[[],[],[],[0]],[[]],8],[0,[[7,6],[8],[],6,[8]],[5,7,[7,6,1,7,4],[10,3],[]],[[],[4,6,10,7,7],3],1],[[[]],[9,[8,4,8,5,4],3,8],4],[[[2,1,3]],[[9,3,5]],[[],1],7,[9,[],3,9,9]]]
+[[0]]
+
+[[],[[],4,[]],[[8]],[[[4,9],4,2],6,[[7,4],[1,4],9,9,[2,5,4]]]]
+[[0,5,[10,3],3],[],[[10,[0,0,3,6,3],[9,9,2,7],[1,3,9]],[[2,2],9,[1,0]]]]
+
+[[[6,1,2,[1],4],[8,[8],7,7],2],[[3,[1],0],10,[],1],[7,5,7,4]]
+[[9,[9,7,1,8]],[[2,0,3],[[9,7,6,8,9],3,[7]],3,[3,[1,4,6,2],[],10,5]],[]]
+
+[[[],[8,1,[10,2,7,9,8],9],2,[]],[[[9,9,7],[4,10],2,10],5,[[5]]],[9],[2,[[9,3,3,5,3],1,10],5,[],[9,[2,5,10,3,1],[7,5,3,0],6]],[9,2]]
+[[3,4,7,[3,5]],[5,[[],5],[10,[5,5,5],[7,10,4],[4,0,6]],[[9,9],10,[5,7]],8],[6,[[6,0],[6],[0,5,8],1,4],[0,7,2],9],[],[3,7,[],0,8]]
+
+[[[],[[2,2,6,5,10],10],[[],4,[4],[7,5,4,2,4]]],[]]
+[[5,0],[[[0,2,5,3,3],[3,2,1]],6,[[10,5,9,8],[2,4,0,10,3],7,6],9,[[5,1,2,10],[10],3,0]],[4,3],[[],[[8,6,1,2],2,9,[2,4,1,2],5],[[],[8,7,7]]]]
+
+[[[[0,6,6,8,4],7,5,3,4],0,[1,4,[0,10,9]],[3,3,[7,2,10]]],[10,4],[[],2,[[9,5,1,7,10],2,1,10,[]],10],[[[8,5,7],[2,9]]],[8,[8,6],[6],8,[5,3,3,1,5]]]
+[[[[3],7],[3,[1,8],10,[1,1,3],2]],[7,[[2,10],5,[1,6,10]],10,2],[]]
+
+[[],[7,[6,5,[3,1],2],[[1,7],1]],[5,[[6,4,7,8],4],1,[],1],[[[7,5,7],[2,10,2,1],8,7],[],[[],3,[8,5,3],1,4]]]
+[[],[3,6,6,[3,0,6,3]],[[6,8,4,[],9],[[5,4,0,2,4],0,[]]],[0,8,7],[[],1,1]]
+
+[[[8],[5,0,6,0]]]
+[[[],3,5,[]],[7,[[],[10,5,5,6,7],9,[1,8,5,9,6],[4]],[[7,3,0,7],[3,6,5,3]],[[1,4,0,5],[6,2,8,3],8,[9,7,10,10,4]],4],[]]
+
+[[[],[6,[],[1,10]]]]
+[[[7,[8]],[[],[0,2]],[[2,10,5,3],1,7,4,[8]]],[[[7,8,4,9,0]],[]],[2,[[6,7],[9,5,7],[1,4,8,5],0,[]]],[]]
+
+[[[],9,[[1,6,2,8],[1,2,5],[],[2,8,8,2],[6]]],[0,9,[4,1,[5,0],6,6],[2],5],[]]
+[[[],[[4,7,7,5,4],5],[],[[],[2],3,[0,1,4,8],9],[8,4,[],8,[]]],[2,[[4,0,8],[2,8],[3,10],[6,8]],2],[8],[6,6,9,[3,1],[10,6,5,[1,10]]],[9,[[],5],[5,[9,4,10,8]]]]
+
+[[7,7,[7,3],5,[6,[2,7,9],[6,0,3],[5,1],9]],[]]
+[[5,2,[6,8,4,7],2],[[],[[],0,[3,2,8]],10],[3,[],7],[[]],[]]
+
+[[],[8,[9,1,9,[9,3,0],8],[0,8,[0,3,7,0,2]]],[6,0,2,5],[0,[[9,5,6,2],1],2],[[8,5],[],[[]],6]]
+[[9,2,[6,[8,5,2,4]],[1,7,[3,5],[],[9,1,3]]],[[1],6,[[5,3,6,9],0,8]],[[7,5,[9,7,9],[7,4,7],[3,4,3,10]],[10,[10],[7,1,5,0],[6,7,8,9,10],7],[5,5],[[9,4],10],[6,[0,2,0],[10,5,5]]],[0],[0,5,[]]]
+
+[[9,[3,5,[8],[8],[3,0,4]],[]],[8,2],[],[3,[[0,9,10,8,1],1,[5,0,7,3,8],2,[]],[]],[]]
+[[[],[[10,9,5],0,[7,3,8],[3]],8,[[6],5,[9,1,10,6,6]],7],[[2],7]]
+
+[[[[],3],[[0,10,2,0,0],10,[2],3,[1,0,8]],[[1,8,6,2],[5],0,2,[1,10,8,6,2]],0,7],[[],[[8,5,3,8,9],[7,7,6,10,5],6,[2,7]],[0,[10,2],[6,8,10,1],[3,6],1]],[]]
+[[[1,5,[],9,[2,8,8,1]],[[6]],[9]]]
+
+[[[[10],[7],1,[10,0,7]],[2,[],[6,7,4],[5,3,1,7,5],0],[2,[],[8,8],[9,7,4,6]],[6],8],[6,[[9,5,1],7,[0,5,0,2],2],[9,[],7],5,[]],[10,[8,4,6,7]],[[],[3,[3],[1,9],[9,6,9,7],9]],[5,[[10,1,8,7,8]]]]
+[[7,2,8,[8,[6,4,0,4,4],8,[9,5,9,6,9],5]],[]]
+
+[[[5,9,9,[4,3,7]],7,[[0,3,3,1]]],[[6,9],[[4,1,10,9,8]]],[[],[6,[8],7,[6,3],[]],5,9,2],[]]
+[[[],10,[[0,10,3],0],[[0,4,2,5,5],8,[0,9,5,4]],1],[[[3],6,[],[8,8,0,5],7],2],[7,[5,2,[4,9,5],[7,2]],[7,0],[[1,10,0,6,6],8,[8],10]]]
+
+[[],[8,[],7],[],[[],[0,[1],[6,7],[5]],[[0,2],[3,6,1]],6,[8,6,1]],[10,3,2,[[1,10,9,9]]]]
+[[]]
+
+[[8,7,4,7],[],[10],[[[8,7,9,10],0],5]]
+[[6,9,[2,[],1],[],3],[[[9,0,5,2,10],[6,4,0]],5]]
+
+[[[],[[0,5,3]]]]
+[[[],[7,3],[]],[[5,[2,6,3],[10]]],[2,[[8,0,6,5,5]],8,7,[2,[],1,9,1]],[]]
+
+[[],[7,5,[[],7,7],6],[]]
+[[0,[[0],[],8],[]],[1,10],[],[10,[[7,2,0],4,0]]]
+
+[[5]]
+[[[[],[4,3,7,2,3]],7,10,[4,[10,7,5],0,7]],[[[2],[0,8],[1,8],[7,8,2,2,10],4],[[5,4,6],[3],[7]]]]
+
+[[[]]]
+[[[[7,6,3],[4,2,8,4,0],[2,4,6,7,5],[9,4,4],[6,8,1,4,10]],7],[6,[4]],[[[],[8],8,6,[0,5]]]]
+
+[[5,7,8]]
+[[],[[],[[1,1,0],[1,1,7,0],6]],[3,4],[[[9,5,8,10],6,[10],[5,5,9],[2,5,10,1,1]],3,2,[10,[1,3,10,3],10,8],1],[[],7,10,[9,6,4,7],[10,[8,1],[1,10,9,5]]]]
+
+[8,8,6,2,5]
+[8,8,6,2]
+
+[[2,8,[[],0,2,0,0],[],[[],[5,10,8,6,5],[4,4],6,2]],[],[3,8,[],[10,10,[7,4,4]]],[5]]
+[[[[],[2,5,1,0]],[1,[2,10,8,8,2],1,10,2],8,8,1]]
+
+[[[],[[9]]],[[[8,7,8],8,[]],0,[[6],[],7]],[[7,[4,2,0,4,9],2],[5],[[8],[6],[6,0]],8],[5,[10,[6,10],[],[7,0]],5],[1,6]]
+[[],[[],[5,[7,9,10,7],8],8,9],[]]
+
+[[1,[]]]
+[[0,[8,10,[],5]],[[],[6,6,[1],[9,2,0]],[[1,0,5,2]],5]]
+
+[[[1,[8,9,3,1,2]],[1,6,[7,8,3,8,8],4,8],[8,[4,3,5,1],[0]]]]
+[[[1],[4]],[],[[0,[7,8,5,4],10],[[7,6,8,7,2],[4,7,3,8,0],2],[0,2],[[2,4,5]],3],[[[0,1,10,9],4,9],[[8,4,8],5,[2,3,10,10,3]],6,[9,[2,0],[1,7,8,10],[],7],3]]
+
+[[[2,[7,5,9,0,5],3]],[],[[[2],7],7,[[5,9,2],4,[6]],4],[]]
+[[[]],[[],[],[[1,8]]],[[7,[7,2,10],[7,4,10,5,3],[3,8,3,10,9]]],[6,[[0],10,1,[2,9,1,5]],7,6,[4,[7],[5,6,0],2]]]
+
+[[],[[4],[8,0]],[10,5,9,3],[],[]]
+[[1,7,[[2],10,[2,0,2,10,4],0,4],[5],4],[[1,[7,5],4,8,0]],[[3,[],0,[9,4,8,5,0]],1,0,4],[9,4,5,10],[2,1]]
+
+[[4,5,3],[5,[9,9,[5,6,8,4,0],[8,4,8,4,5]],[[2],2,9,[8,1,8,8]],[9,2],[0,[3,2]]],[[[1,4,2],10,[5,1]],[[1,2,5,4,5]],[[],10,[7,7]]]]
+[[[[4,1,2]],9,[2,[2,9,3,8,6],8,0,1],1,2],[[[7,0,9,6,5],[10,7,5,10],[9,2,4]]],[],[[[]]]]
+
+[[],[[]],[[[2,10],[8],[2,5,3,1,0],1,[1,10]],[[9,5,8,0],8,[9],5],[[3,4,7],3,5,[10],[]],10,3],[[],[[7,0,4],9],[10,[3,2,7],[],[1,9],9],4,[]],[5]]
+[[],[8,5,[[0,0,3,3,7],[1,0,6,0],1,1,7],10,3]]
+
+[[5,[],[],7],[[[6,4],[3]],0,5,2],[],[7,0,[]],[5,[[3],[]],[[],0,[4,6],[4,5,9,2,2],[5,2,5,0,7]],[4,[],7],3]]
+[[],[4,8,[5,7],[],6],[[]],[]]
+
+[[2,8,[[0,6]],[[5,6,8,8],0],3],[[6,0,[10,2,7]]],[],[1,8,[],[8,2,9]],[3,[1,[8,7,1,0,10],9,[],[]],[]]]
+[[[8],[[6,3,1],3],[5]],[[[2,7,1],[10,0,4,1],[2,9,2,1,2],5,9],9,3],[[4,[4],[2]],2],[7],[1,[[5,10,7]],[[3,10],8,3],[],[[7,0,1,3,1],6,[9,0,2,9,3]]]]
+
+[[[],7,[4],[]]]
+[[4,3,7,[4,[8,10,0,7,8],4,7,[]]],[1,[],6],[]]
+
+[[[5,0,5,[0,10,0,9,0],0],4,8,0],[6]]
+[[],[8,[[]],[[2,5,10],[2,7,10],5,3,[5]],[1,[6,0,1,5,0],6,0,[5,2,3]],[[5],1,2,1,7]]]
+
+[[[[]],10,[5,[7],2]],[6],[[],5]]
+[[8,[],[[0,9,0,0,1]],1,8],[[[7,2,7],[10,10,2],3,[]],8],[10,[],[7,[5],7]],[[[0,7,10,7]],6,[[4,1,7,3,5]]]]
+
+[[5,10,[]],[2,[]],[[[3,7,10,0,5]],[[1,2,4,8],9,6,[7,0,8,5,1],8],5,5]]
+[[[0,3],[3,[2,9,8,3,8],9]],[],[[6,[8,7,5,8],[8]],6,5,[7,6,4,[4,6,4],2],2],[[0],2,[],[10]],[[4,4,9],3]]
+
+[[],[[],[[1,5,5,6,3],[0,10,3],8,0]],[],[1,1,4,4,2],[2,[2,[1,7],[1,9,9]],3,[]]]
+[[[[3,1,7]],[9,[9,8,7,8,4],4],3,8,[[0],[],7]],[5],[[],2,[5,[0],[0,8,4]],1,2]]
+
+[[4,8,7,9,[[8],[5],[],10]]]
+[[7,[10,[8,2,2,8],[2,9,7,5],[3,9,2,10,5]],[],4,[[7,1,8,0,0],[10,5],2,[]]],[7,6,7],[8,1,4,[]],[],[]]
+
+[[],[[[6,5,7,0],4,9],[[3,3],6,10,[0,9]],[9,3,7,6,[1,8,8]],8]]
+[[[[8],[9,2],[4,1,6,5],[6,0]],9]]
+
+[[[5,4],9,5,1],[[[7,9,3],[1,0,0,0,4],[5,5,0,2,3],4],4,2,7,2],[[6,7],[[],2,6],5,[[8],2,10]]]
+[[3,[0,10,0,[7,3,5],10],[[],[9,6]]],[0,[7,[6,2,1]],[[10,10,1,5],3,5,[2,7,3,1,0],[]],4,1],[]]
+
+[[[8,[1,6,1,0],0,[0,9]],[[5],[10,8,5],[9,5,8,6],[],[0,8]],9,7],[],[[[9,8]]]]
+[[[6,[6,10]],[3]],[7,[[5],[8,3,9,5],[8,1],8,[5,0,10,6,8]],1,[[1,5],[1,3],1]],[[6],[1,3,[9]],[7]]]
+
+[[[[8,5,0,10,6],[]]],[7,9,7,10],[[10,[7,7,5,9,0],[6],10]],[[7,[5,6,3],[10,4,9,7,5]],8,[],[[9,1,9,8],7,[7,1,10],[3]]]]
+[[],[[[]]],[8,[5,[2,9,1]],7],[],[]]
+
+[[2],[[[],1,4,[0]],1,1,[8,9]],[[[8,0],[6,5,3,4,7],7,9,7],[0,9],6],[[6,[9],1],6,9,[],0]]
+[]
+
+[[3,[[4,0,8],[9,10,3,10],[10,10,4,1],[4],5]],[[[0,1,6],1],[[5,7,1],[0,5,7],[4],[2,5,1]],2,2,[6,[],[1,5],3,[5,10,4]]]]
+[[[8,[6,5,6,5],[3,8,6,8],3,6]],[],[]]
+
+[[[4,0],9,1,2,[[0,4,8,10,4],[],7,2,2]],[1,[[0,4]]],[8,[8,[5,2,7,8,6],[6,9]],[[4,9,10,7],0,7],[[7]],5]]
+[[[[5,6],7,6,[9,8,9,8,7]],1,3,10,1],[0,7,[[5,2,5,1,6],[6,2,3,4,6],0],7],[[4,[]]]]
+
+[[1,[[8]],2,[8,[],[4,1,0],[1,8,9,2],[10,2,2,9,7]],3],[[[3,7]]],[],[]]
+[[],[2,3]]
+
+[[[[0,9],[0,9]],[]]]
+[[10,2,[[4,6],[5,8,3],[1,4,6],5,4],[[]],9],[6,[]],[],[[[10,9,1,2,8],8],8,4],[[5],2,[[9],5,8],[[],1,[9],10]]]
+
+[[[],[[]],[],[[0,4,10,7,5],3,[8,6],[]]],[]]
+[[[4,4,[5,2,1],5],0,[3,[9,8,5,4,7],[]]],[5],[[2,[7,8],[]],[0,9,2],[],7],[[4,[2],[1,6]],5,[[4],[1,2,3,2],0,7,2],[[3],4,[2,7,2,4,1],10,5],9]]
+
+[[[[4,8,9],0,[6,6,6,4],7,3],5,10]]
+[[9,[5,[6,9],2],4],[6]]
+
+[[],[9,9,[0],[9],[8]],[6,1],[8]]
+[[],[[7,[0,4,7],6,[2,0,7,3,4]],[[1,2,7]],[6,7,[10,8]]],[[[2,1],[5,6,4],10,8],[[8,4,4,4]],2,[5,[3],2,[]],[1]]]
+
+[[[[3,6,7],5,5,[10,4,3],9],10,2],[1,[]]]
+[[],[],[[2,[7],4,7,[1,6,5]],7,[7,9]]]
+
+[[10,10,[],[[10],[]]],[[[1,8],[3,0,0],7,0],[0,5,4,[7,1,4],5],[[9,9,7,8],3,[1,6],8],[[10,7,3]]]]
+[[[4,[9,0,2,7,8],8],3,5,[[3,6],7,7]],[[[3,1],2,5,0,0],8],[[[9],3,1,7,3],[5,3,[],5],9,4,4],[],[9]]
+
+[[3,[7],[[3],[2,5,2],[],8,0],1],[8,[],9],[10,[],4],[]]
+[[[[1],[3,8],[10]],3,[8],0],[6,[6],[[]],3,[[5,7,2,9]]],[],[9,4,7,7],[3,9,[2],[[4,6,0,2,10]]]]
+
+[[6,[4,[9,3,4],0,[10,6,9,9]]],[[[8,2,2],[9,8],[0]],1,[[4,8],1,[4,1,0,6,7]]]]
+[[5,[4],[1]],[6],[[0,[6],3,7],6,[10]]]
+
+[[2,10,[8,6,[8,9,3],3,10]],[]]
+[[[[8],9,5],[[3,1,3,2,2]],6,8]]
+
+[[6],[8],[[[8],9],5,[[7,4,3],0,[9,6,10]]],[10,[10,[6,3,2,9],[0,4,1],[]],[[],[6]]],[5,[[3,10,9,0]],2,7,5]]
+[[0,[],[1,[7,5],8,6,[4,7,5,4]],10],[]]
+
+[[7,10,[[7,8,1,4],6,[9,6,10],8],10],[[9,8],[6,[4,4,5,7,7],3],6]]
+[[9,[7],[[4,0]]],[[[0,7,6,0,10]],2]]
+
+[[10],[[5,[2],[]]]]
+[[0,4,2,[[3,0,5,8],6,[1,5,6],7,10]],[3,[[6,6,1,9,0],[0,2,1,6,2],[],[2,5,9,3,9],8],1,10,[[5],[9,7],4,8]],[[[3,9,2],1,[6,2,9],[9,10,8,7,3],[10,0]],8,[2,7],[10,[1,2,10,0,3],7],[[7]]],[10,8],[[[0],1],0,[[6],4],5]]
+
+[[[3,6,2,[1,0,0,7],[1,2]]],[[],[3,[],[10,2,3,5],2],8],[8,10],[]]
+[[10,10,3,9]]
+
+[[[[0,2],[],5,[],[3,8]],[],[[1,7],[],[2],[4,2,9,6],[9,0,0,2,8]],[[0,1,8,7]],[[]]],[[[]]]]
+[[[10,5,8,5,[6,2,7,2]],[[6],[3,7,7,2,3],9],[9,4],3,[[3,10,4],[6,3,10,9],3,5]],[[0]],[6],[6,[[3,5,0,9,8],7,0,10]],[4,8,[[3,1,1],5,5,0],0]]
+
+[[3,1,[8,[],1,[3],[8,0,10,6,8]],10,[1,8,6]]]
+[[[],[9,[7,2,4],7],[4,[2,8],5,5,4]],[[],4,[5],5,9],[[3,3,9],3,10,[10,10,[1],1]],[10,8,[8,[5],10,[4,2]],[0,8,[8,8],8,1],[[1,10,0,3,10],[1],[0]]],[[[7,7],[9,10],[2,5,10]],[1,[2,2,0,0],5,[9]],6,[10,[8,8,9,2,6],[],1,[]]]]
+
+[[[0,[0],[7,5]],8],[[[0]]],[3]]
+[[[[],3,8,6,4],[[4],5,[1,0,9,9]],9,[2]],[7],[10,[],[[10,5,0],[6],8,1,[]],[5,[10]],8]]
+
+[[[[5,9,2,3,2],[5,6],[2],[10,9,5,1],6],6,1,[10,[],9],[7]],[2,[3,2,2,7,[10,1,9]],1,[2,7,[6,9],[3,3,9,7]]],[6,4,[]],[10],[[[0,1],2,7,2],7,[8,[4],[0,6,9,6,3],6,[4,8,9,7]],[[7,0],3,[6,8,6],[],[9,4,10,5,10]],[3,2,6,[2,4,0,6,3]]]]
+[[1,[],[[6,6,10,3,3]],[1,7],[[3,9,9]]]]
+
+[[[[4,4,9],6,[2,9,9]]],[10,[7,[],1],8,[],3],[4,3,4],[]]
+[[1,[[],[8,5],[10,7],[2,9,5,9,3],5]]]
+
+[[0,[1,2,[0,1,6,2]],[4]]]
+[[[10,6,5,8,[3,1]],[8,[3,0],3]],[[],[[9,10],6,3,[5,7,3,9,5],3],[10,6,3],[[10,9,0,0,4],[2],[9,5,7],[],0]],[2,0,[[10,6,2,1,2],0,0],1,[[8,10,9,6,0],[],3,[]]],[8,9,7,9,4]]
+
+[[3,9,4,[3,4,[5,5,1,3],[]]],[1,[[],[8,10],[7,9,0,1,9]],10],[[],[1,2]],[[1,[5,5,4,0,9],[],[10,4,2,6,5],1],7,10,[[8,2,5,6],[8,10,0],4,9,[4,2,4]]]]
+[[],[[[],0,[4]]]]
+
+[[7,7],[],[],[[9,[9],5],[10,8,[6,10],1],[[3],[6,5,4,4,1]]]]
+[[],[8,4,0,[[7,1,10,9],[5],0],10]]
+
+[[1,3,[5,0,[],[6,10,4]]]]
+[[9,10,[]],[7,[[1,9,7,3],0,[5,5,8],7,4],9],[]]
+
+[[7,10],[6]]
+[[[[9]],1,[[],[0,0,7]]],[[7,0,5],[1,[1,4],3,[]]],[[],[0],[2],[[0,4,5],1]],[6,[[1,3],[1,7,1],[6],[1,7,7,6,2]]]]
+
+[[[[8]],8,[2,[8],1,[],1],[1]],[3,[[3,5,1],6,[1,5],[],[6,1,7]],2],[10,4],[]]
+[[[3,1,[],[1,4,9],4],[4,2,[6]],[6,[7],[6,10,10,3,10]],6],[1,0,[1,[7,4,8]],[5,[10,1,4,8,3],[5,4,8,3,9]],0]]
+
+[[],[7],[],[3,[],[6,[2,4],8],[[]]]]
+[[5,[[],1,0],3,[]],[1],[]]
+
+[[0,6,[[2,9,8,2,0]],0],[10,8],[[[0],[],[],4,10],[5,8,3,[]],9,1,4]]
+[[],[1,[[1,0,10,0]]],[[10,3,5,10],[[3],9,6,0,9],[[2,3,9,10,7],4],[],1],[],[0,3,[[4,10,2,4,0],[],5,[5,6,5,8,3],[3]],[10,[8,6],4,[2,4],1]]]
+
+[[0,7,4,[],[[9,7,9],[3]]],[6],[[[7],[3,3,5,5],[]],[],9,3,3]]
+[[3,8,[[4,4,7],0],[5,1,[]]],[[[4],4],1,[],8],[5],[3,[[8,0,1]],[[4,0,7]]]]
+
+[[],[9]]
+[[[]],[10],[[6],[[7,7,2,3,3],4],0,6,[[9,5,1,0,8],[2,7],2,10,4]]]
+
+[[[[2,7],[1],7],[4],7,6,3],[3,[],2,[3,8,4,[9,5,9,4,5],7]],[[[5,7,6],[],7],[[9,5,1],[10,7,8,7,7],[10,1],3,[0,3,1,3,6]],[8,7,4,2,9],9]]
+[[5,[9,7],[[4,1],6],1],[[[1,1,10,0,6],8,[1,7,4,8,1]],0],[[],9,7,5,3]]
+
+[[7,[],5,4,6],[[2,[5,8,6],10],[],[0]]]
+[[[0,[5,10,4,3]],[6,[10,8]],[0,3,1]],[[7]],[]]
+
+[[[[8],0,6,0],10]]
+[[[4,6]],[6,[[1,1,8,1,0],0],[[1,4,1,1,4],[10,10,8],[7,7,7],[2,0]],8,[9,7,[8,9]]],[],[9,[1,[],[10,6],6]],[]]
+
+[[4,[[6,5]],6],[],[],[[[0,9,6],2,[2,1,2,10,9]],[10,8,8,3],10]]
+[[],[[[],7,7,0,[1,2,7,4]],[[10,9,0,3],[7,10,3],[],10,8],[[1,7],0,[1,3,9],[8,3],2]]]
+
+[[[10]],[],[9,3,2],[3],[9,[[10,6,0,10],5,0],0,8]]
+[[[6,[5,4],[7,8,4],6],4,[[4,1],[5,1,0,7],5,0,[8,6,8,1,0]],[[5,10,0,7],6,8,1]],[1,[0]],[8,[7,[9,7],[6,6,9,3,0],9],4,[7,8,[6,8],[5,7,10,3],4],[[],4]],[2,[1,[1]],[],[4,9,[6,2,3,3],6,4],[[10,7]]],[1,5,9,[[10,9,7],[],4,[2,2,8,9]]]]
+
+[[],[[1],[2,2],8]]
+[[[[3,8,2,10,0],7,[],[2,8,0]],2,[4],[]],[6,5,1]]
+
+[[4],[5,6,[2],9],[7,[[],[10,1,6,7],5],9,3]]
+[[1,10,10,8,3],[[],[[4,1,6,8]]],[[5,[],9],[5,[7],1,5],[8,[3,9],[7,10,0,4,7],9],[[4,4,8,9,0],10,[]],1],[5]]
+
+[[[1,8,[],[]],9,3],[2]]
+[[2,[],0,[[],3]],[[[9]],9,[[1],10],3,3],[[8,[6,3,8,0],10,[9,3,8]],0]]
+
+[[[[7,1,7,5,6],6,[0]],2],[[6,[10,10,2,3],3,3],2,9,6],[[4],[10,0,4,1,[1,10,5,1,6]],[[10,3,0]],[10,9,9,0],2],[[8],[5]],[[[],8]]]
+[[10,[9,[8,0,8,6,5],[7,8,6,3]],4],[[],[6,0]],[8,[6],[0],[[7,4],8,[4,4,8,5,7],[10,4,1,5,4],[9,1,9,2,7]]]]
+
+[[],[[7,[6,9,0,7],8,[7,8,2,0,5],[10,1,8,10]]],[2],[6],[2]]
+[[[4,[5,0,1],[1,4,1,2,8]],[4],2,4,[]],[7,[[]],[[1,0,6,3,8],10,1]],[3,[[10,6,4,3,5],1,5,7],[[0,2],[6,4],[1],[2,7,6,6,6]],[]],[],[0,[[2,7],4,7,[5,6,5,7]],[]]]
+
+[[[],7,7,2,3]]
+[[],[2,[[1,8,6]],5],[],[1,[[6,9,1,6,4]],6,[[1,2,8,5],8,1,6],0],[4]]
+
+[[10,1,9,2],[[[9,10],[]],9,[],[[0,4,5,8]]],[4]]
+[[[9,[6,4]]],[[6,3,6],5,9,[[3,5,3,8,9],6,[9]]],[[[4,8,4]],2,[9]],[],[[[],[],[4]],2,[[10,4,0],8,[8,5,7,4,3],10]]]
+
+[[[[3,5,4]],2,[[7,4,4,4],2,3,[],10]],[3,[9,3],6,4,[9,[2,4,5],4]],[2,9,10,5],[6,[[3,7,3,9,7],[4,7]]],[]]
+[[[[6,4],[4,4,4,1,6]],6,3,[0,[0,7,4],8],8],[],[[[3,9,7,10,2],7],6,0,[[5],3,5,[1],6],3]]
+
+[[[],[7,[7,0,4,5,7],[7,3,0,2,2]],6],[]]
+[[9,[8,6,8,1,[]],[[7,5,5,10],0,[9,3]],[[10],0,2],[5]],[5,0,[[],10,6,[2,8,3],3],[[2,0,10,3,1],7,7,[3,9,0]]]]
+
+[[],[3,[8,5,[10,2,2],[10,0,1,8,8]],0,8,3]]
+[[0,[[10,2,7,1],[0],[5,6],[10]],[[2,9,7,2,2],9,[9,0],8]],[[[5,4,10,5,0],2,1,3,5],[10,[9,8,5,2],[2,7,7,6]],0,8]]
+
+[[8,2,[[4,10,2],[0,6,5,10,1],8]],[]]
+[[[6],5,[[6,9,9,0,10],8],6,[[3,6],7]]]
+
+[[[7,[5,2,10,0],[7,7,7,4,1],2,0]],[9]]
+[[4,5,[0,[4,8],7,[3],[2,3,3]],[7]]]
+
+[[[[0],[6,4,0,6]],[2,[4,2,2,0,9],2]],[[1,10,[2,4,10],9],[[],[10]],[1,8,[6,1,5,0]],[[],[0,4,5,5,2],9,1],9]]
+[[[[8,2,3,0,3],8],[8,2]]]
+
+[[4,[10,[5,6],3],[]],[9,8],[[9,[1],6,0],[[2,2,2,2,3]]]]
+[[[10,6,[1,9,2,6],9,[5,5]],9,[[6,3]]],[8,9,10,[]],[3,9]]
+
+[[[7],4],[0,[[2,10,6,8],[3],[9,5],5]],[],[10]]
+[[[[4],[7]],[[9,0,9,1],8],[4,[7,9,8],10,[]],[5,8,[2],0],8],[[0,[10],1,[]],[[5,3,2,0,4],[10,3,1,7,0],[7,9,1,4,3],9,[]],[3,[],8],[[5,0,8],[3,1,9,8,6],5,[2,2,8,3]]],[2,4],[[10,[0,0,2,2,4],[]],4,8,8,0],[9,7,7,[10,[8],[3,2,7],3],4]]
+
+[[[[6,2,6],[10,8,4,6,10],5,[8,10,0,3],7],[2,[5,7]],[1,[3],[0,9,2,6,0],[5,5,5,9,2],1],8]]
+[[4,[10],[4,2,10,[9,7,6,6,9]],[]],[[1,4,[]]],[[3,6,1,6,[0,3,10,0]],[6,[4,10],10,[7,10,4,4],7],[7,[6,8],0,8],[0,[9,9,8,2],6,3,[2,8,9,10,9]],[8]],[],[]]
+
+[[[[],1,[0,3]]],[[],[10,10,8,[3]],3,8,[4,0,5]],[]]
+[[7,2,9],[[],[[7,6,0,10,6],[],1],7,7,8]]
+
+[[2],[4,[[4,5]],2],[3],[[],1]]
+[[8,[7,5,[2,5],[],[10,6,3]]],[3,8,6],[1,[10],[]]]
+
+[[[[1,10,7,2],[1,9,4,3,2],[],8,[3]],10],[4,[],5]]
+[[],[[[1,0,8],4],6,9,[[7,8,1,4,4],7],7],[2,8,[[3,5,1,1],0],[[5]],[[7,8,7,3]]],[10],[6,[],1,5,7]]
+
+[[9,5,8],[[8,[2],[5,9,0,8,7],[1,8,4],4],[2],0,[6]]]
+[[9,8,7,[3,8,[8,1],[7],6]],[1],[6,[6,[3,9],[6,3,6,7,5]]],[[8],3,1,[2]]]
+
+[[],[0],[[5,0,9,[3],[4]],[10,[9,0],[3,5,6,10,1]],7,[]]]
+[[[[]],[]],[1,9,[[5,4,9,9]],[9,[4,1]],[6,4,7]]]
+
+[[0,9],[6,10,5,[]]]
+[[[9,3],[7],[[5,2,2]],[9],9]]
+
+[[6,3,[[4],2]],[1]]
+[[[7],1],[],[10,8],[9,[10,5,0,[5,7,9,8,9],7]]]
+
+[[2,7,[[1]],10,[[2,6,3,6],9,[9,8,8]]],[2,[2]]]
+[[],[],[[1],[0,[3,8,10,9],[2,2]],10,[4,8,4,[6,5,10,1]],1]]
+
+[[9,10,[],6],[[8,5,[3,6],5],[[7,6],[],3,8,7]],[6],[[[0,4,8,0],[5,2,7,9]],6,6,10,1]]
+[[1,[],8,[6,10,[10,2],3]],[3],[],[[],[[4]],8]]
diff --git a/13/sample.txt b/13/sample.txt
new file mode 100644
index 0000000..af73fbb
--- /dev/null
+++ b/13/sample.txt
@@ -0,0 +1,23 @@
+[1,1,3,1,1]
+[1,1,5,1,1]
+
+[[1],[2,3,4]]
+[[1],4]
+
+[9]
+[[8,7,6]]
+
+[[4,4],4,4]
+[[4,4],4,4,4]
+
+[7,7,7,7]
+[7,7,7]
+
+[]
+[3]
+
+[[[]]]
+[[]]
+
+[1,[2,[3,[4,[5,6,7]]]],8,9]
+[1,[2,[3,[4,[5,6,0]]]],8,9]
diff --git a/14/1.lua b/14/1.lua
new file mode 100644
index 0000000..f774175
--- /dev/null
+++ b/14/1.lua
@@ -0,0 +1,83 @@
+require "ext"
+local cave = {}
+local lowest = 0
+for line in io.lines() do
+ print("line:",line)
+ local cursor = nil
+ for pair in line:gmatch("([0-9,]+)") do
+ local col,row = pair:match("(%d+),(%d+)")
+ col,row = tonumber(col),tonumber(row)
+ if cursor then
+ for rown = math.min(cursor[1],row), math.max(cursor[1],row) do
+ for coln = math.min(cursor[2],col), math.max(cursor[2],col) do
+ cave[rown] = cave[rown] or {}
+ printf("Setting %d %d to true",rown,coln)
+ cave[rown][coln] = true
+ end
+ end
+ end
+ lowest = math.max(row,lowest)
+ cursor = {row,col}
+ end
+end
+
+local sand = {}
+function print_puzzle()
+ for row = 0, 500 do
+ for col = 0,100 do
+ local data = cave[row] and cave[row][col]
+ if data == "s" then
+ io.write("O")
+ elseif data then
+ io.write("#")
+ else
+ io.write(".")
+ end
+ end
+ io.write("\n")
+ end
+ for _,row in pairs(cave) do
+ for _,col in pairs(row) do
+ end
+ end
+end
+print_puzzle()
+print("lowest:",lowest)
+local floor = lowest + 2
+
+local sandpoint = {0,500}
+local movement = {
+ {1,0},
+ {1,-1},
+ {1,1}
+}
+local x = 0
+while true do
+ for k,v in pairs(sandpoint) do
+ sand[k] = v
+ end
+ local could_move = false
+ repeat
+ could_move = false
+ for _,move in ipairs(movement) do
+ local drow, dcol = sand[1] + move[1], sand[2] + move[2]
+ if not cave[drow] or cave[drow][dcol] == nil then
+ could_move = true
+ sand[1] = drow
+ sand[2] = dcol
+ break
+ end
+ end
+ until not could_move or sand[1] = floor
+ if not could_move then
+ cave[sand[1]] = cave[sand[1]] or {}
+ cave[sand[1]][sand[2]] = "s"
+ end
+ if sand[1] == 500 then
+ print("sand stopped falling")
+ break
+ end
+ x = x + 1
+end
+print_puzzle()
+print(x)
diff --git a/14/2.lua b/14/2.lua
new file mode 100644
index 0000000..abc6ccd
--- /dev/null
+++ b/14/2.lua
@@ -0,0 +1,87 @@
+require "ext"
+local cave = {}
+local lowest = 0
+for line in io.lines() do
+ print("line:",line)
+ local cursor = nil
+ for pair in line:gmatch("([0-9,]+)") do
+ local col,row = pair:match("(%d+),(%d+)")
+ col,row = tonumber(col),tonumber(row)
+ if cursor then
+ for rown = math.min(cursor[1],row), math.max(cursor[1],row) do
+ for coln = math.min(cursor[2],col), math.max(cursor[2],col) do
+ cave[rown] = cave[rown] or {}
+ printf("Setting %d %d to true",rown,coln)
+ cave[rown][coln] = true
+ end
+ end
+ end
+ lowest = math.max(row,lowest)
+ cursor = {row,col}
+ end
+end
+
+local sand = {}
+function print_puzzle()
+ for row = 0, 11 do
+ for col = 480,520 do
+ local data = cave[row] and cave[row][col]
+ if data == "s" then
+ io.write("O")
+ elseif data then
+ io.write("#")
+ else
+ io.write(".")
+ end
+ end
+ io.write("\n")
+ end
+ for _,row in pairs(cave) do
+ for _,col in pairs(row) do
+ end
+ end
+end
+print_puzzle()
+print("lowest:",lowest)
+local floor = lowest + 2
+cave[floor] = {}
+for i = -(500 - floor), (500 + floor) do
+ cave[floor][i] = true
+end
+
+local sandpoint = {0,500}
+local movement = {
+ {1,0},
+ {1,-1},
+ {1,1}
+}
+local x = 0
+while true do
+ for k,v in pairs(sandpoint) do
+ sand[k] = v
+ end
+ local could_move = false
+ repeat
+ could_move = false
+ for _,move in ipairs(movement) do
+ local drow, dcol = sand[1] + move[1], sand[2] + move[2]
+ if not cave[drow] or cave[drow][dcol] == nil then
+ could_move = true
+ sand[1] = drow
+ sand[2] = dcol
+ break
+ end
+ end
+ until not could_move or sand[1] == floor
+ if not could_move then
+ cave[sand[1]] = cave[sand[1]] or {}
+ cave[sand[1]][sand[2]] = "s"
+ end
+ if sand[1] == 0 then
+ print("sand stopped falling")
+ break
+ end
+ x = x + 1
+end
+print_puzzle()
+print(x + 1)
diff --git a/14/ext.lua b/14/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/14/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/14/input.txt b/14/input.txt
new file mode 100644
index 0000000..edade8f
--- /dev/null
+++ b/14/input.txt
@@ -0,0 +1,148 @@
+461,87 -> 461,80 -> 461,87 -> 463,87 -> 463,80 -> 463,87 -> 465,87 -> 465,80 -> 465,87 -> 467,87 -> 467,86 -> 467,87
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+460,159 -> 460,154 -> 460,159 -> 462,159 -> 462,151 -> 462,159 -> 464,159 -> 464,152 -> 464,159
+464,109 -> 464,111 -> 463,111 -> 463,118 -> 473,118 -> 473,111 -> 468,111 -> 468,109
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+478,33 -> 478,37 -> 471,37 -> 471,41 -> 483,41 -> 483,37 -> 482,37 -> 482,33
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+466,96 -> 470,96
+494,22 -> 499,22
+499,13 -> 499,16 -> 498,16 -> 498,19 -> 507,19 -> 507,16 -> 501,16 -> 501,13
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+460,145 -> 460,146 -> 462,146
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+460,159 -> 460,154 -> 460,159 -> 462,159 -> 462,151 -> 462,159 -> 464,159 -> 464,152 -> 464,159
+454,168 -> 458,168
+476,60 -> 476,61 -> 489,61
+502,26 -> 507,26
+447,106 -> 452,106
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+498,24 -> 503,24
+478,33 -> 478,37 -> 471,37 -> 471,41 -> 483,41 -> 483,37 -> 482,37 -> 482,33
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+499,13 -> 499,16 -> 498,16 -> 498,19 -> 507,19 -> 507,16 -> 501,16 -> 501,13
+457,166 -> 461,166
+478,33 -> 478,37 -> 471,37 -> 471,41 -> 483,41 -> 483,37 -> 482,37 -> 482,33
+464,109 -> 464,111 -> 463,111 -> 463,118 -> 473,118 -> 473,111 -> 468,111 -> 468,109
+499,13 -> 499,16 -> 498,16 -> 498,19 -> 507,19 -> 507,16 -> 501,16 -> 501,13
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+478,33 -> 478,37 -> 471,37 -> 471,41 -> 483,41 -> 483,37 -> 482,37 -> 482,33
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+457,99 -> 461,99
+499,13 -> 499,16 -> 498,16 -> 498,19 -> 507,19 -> 507,16 -> 501,16 -> 501,13
+463,162 -> 467,162
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+457,104 -> 462,104
+450,104 -> 455,104
+476,60 -> 476,61 -> 489,61
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+462,143 -> 473,143 -> 473,142
+483,44 -> 483,48 -> 481,48 -> 481,55 -> 489,55 -> 489,48 -> 487,48 -> 487,44
+463,99 -> 467,99
+461,87 -> 461,80 -> 461,87 -> 463,87 -> 463,80 -> 463,87 -> 465,87 -> 465,80 -> 465,87 -> 467,87 -> 467,86 -> 467,87
+478,33 -> 478,37 -> 471,37 -> 471,41 -> 483,41 -> 483,37 -> 482,37 -> 482,33
+472,168 -> 476,168
+472,123 -> 472,124 -> 476,124
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+483,44 -> 483,48 -> 481,48 -> 481,55 -> 489,55 -> 489,48 -> 487,48 -> 487,44
+489,30 -> 494,30
+462,143 -> 473,143 -> 473,142
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+461,87 -> 461,80 -> 461,87 -> 463,87 -> 463,80 -> 463,87 -> 465,87 -> 465,80 -> 465,87 -> 467,87 -> 467,86 -> 467,87
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+482,30 -> 487,30
+461,87 -> 461,80 -> 461,87 -> 463,87 -> 463,80 -> 463,87 -> 465,87 -> 465,80 -> 465,87 -> 467,87 -> 467,86 -> 467,87
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+460,145 -> 460,146 -> 462,146
+460,168 -> 464,168
+460,159 -> 460,154 -> 460,159 -> 462,159 -> 462,151 -> 462,159 -> 464,159 -> 464,152 -> 464,159
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+492,28 -> 497,28
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+464,109 -> 464,111 -> 463,111 -> 463,118 -> 473,118 -> 473,111 -> 468,111 -> 468,109
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+466,164 -> 470,164
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+464,109 -> 464,111 -> 463,111 -> 463,118 -> 473,118 -> 473,111 -> 468,111 -> 468,109
+461,87 -> 461,80 -> 461,87 -> 463,87 -> 463,80 -> 463,87 -> 465,87 -> 465,80 -> 465,87 -> 467,87 -> 467,86 -> 467,87
+478,33 -> 478,37 -> 471,37 -> 471,41 -> 483,41 -> 483,37 -> 482,37 -> 482,33
+460,96 -> 464,96
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+472,123 -> 472,124 -> 476,124
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+460,159 -> 460,154 -> 460,159 -> 462,159 -> 462,151 -> 462,159 -> 464,159 -> 464,152 -> 464,159
+461,87 -> 461,80 -> 461,87 -> 463,87 -> 463,80 -> 463,87 -> 465,87 -> 465,80 -> 465,87 -> 467,87 -> 467,86 -> 467,87
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+499,13 -> 499,16 -> 498,16 -> 498,19 -> 507,19 -> 507,16 -> 501,16 -> 501,13
+464,109 -> 464,111 -> 463,111 -> 463,118 -> 473,118 -> 473,111 -> 468,111 -> 468,109
+463,166 -> 467,166
+483,44 -> 483,48 -> 481,48 -> 481,55 -> 489,55 -> 489,48 -> 487,48 -> 487,44
+491,24 -> 496,24
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+488,26 -> 493,26
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+483,44 -> 483,48 -> 481,48 -> 481,55 -> 489,55 -> 489,48 -> 487,48 -> 487,44
+460,159 -> 460,154 -> 460,159 -> 462,159 -> 462,151 -> 462,159 -> 464,159 -> 464,152 -> 464,159
+499,13 -> 499,16 -> 498,16 -> 498,19 -> 507,19 -> 507,16 -> 501,16 -> 501,13
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+453,102 -> 458,102
+485,28 -> 490,28
+461,106 -> 466,106
+454,106 -> 459,106
+464,109 -> 464,111 -> 463,111 -> 463,118 -> 473,118 -> 473,111 -> 468,111 -> 468,109
+478,33 -> 478,37 -> 471,37 -> 471,41 -> 483,41 -> 483,37 -> 482,37 -> 482,33
+503,30 -> 508,30
+461,87 -> 461,80 -> 461,87 -> 463,87 -> 463,80 -> 463,87 -> 465,87 -> 465,80 -> 465,87 -> 467,87 -> 467,86 -> 467,87
+466,90 -> 470,90
+460,159 -> 460,154 -> 460,159 -> 462,159 -> 462,151 -> 462,159 -> 464,159 -> 464,152 -> 464,159
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+460,164 -> 464,164
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+496,30 -> 501,30
+461,87 -> 461,80 -> 461,87 -> 463,87 -> 463,80 -> 463,87 -> 465,87 -> 465,80 -> 465,87 -> 467,87 -> 467,86 -> 467,87
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+472,96 -> 476,96
+510,30 -> 515,30
+463,93 -> 467,93
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+475,99 -> 479,99
+466,168 -> 470,168
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+469,99 -> 473,99
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+464,109 -> 464,111 -> 463,111 -> 463,118 -> 473,118 -> 473,111 -> 468,111 -> 468,109
+499,13 -> 499,16 -> 498,16 -> 498,19 -> 507,19 -> 507,16 -> 501,16 -> 501,13
+483,44 -> 483,48 -> 481,48 -> 481,55 -> 489,55 -> 489,48 -> 487,48 -> 487,44
+495,26 -> 500,26
+460,159 -> 460,154 -> 460,159 -> 462,159 -> 462,151 -> 462,159 -> 464,159 -> 464,152 -> 464,159
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+499,28 -> 504,28
+483,44 -> 483,48 -> 481,48 -> 481,55 -> 489,55 -> 489,48 -> 487,48 -> 487,44
+461,87 -> 461,80 -> 461,87 -> 463,87 -> 463,80 -> 463,87 -> 465,87 -> 465,80 -> 465,87 -> 467,87 -> 467,86 -> 467,87
+483,44 -> 483,48 -> 481,48 -> 481,55 -> 489,55 -> 489,48 -> 487,48 -> 487,44
+461,87 -> 461,80 -> 461,87 -> 463,87 -> 463,80 -> 463,87 -> 465,87 -> 465,80 -> 465,87 -> 467,87 -> 467,86 -> 467,87
+469,93 -> 473,93
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+506,28 -> 511,28
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+469,166 -> 473,166
+460,159 -> 460,154 -> 460,159 -> 462,159 -> 462,151 -> 462,159 -> 464,159 -> 464,152 -> 464,159
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+468,137 -> 468,132 -> 468,137 -> 470,137 -> 470,130 -> 470,137 -> 472,137 -> 472,136 -> 472,137 -> 474,137 -> 474,127 -> 474,137 -> 476,137 -> 476,131 -> 476,137 -> 478,137 -> 478,130 -> 478,137 -> 480,137 -> 480,128 -> 480,137 -> 482,137 -> 482,128 -> 482,137 -> 484,137 -> 484,133 -> 484,137
+466,74 -> 466,71 -> 466,74 -> 468,74 -> 468,64 -> 468,74 -> 470,74 -> 470,65 -> 470,74 -> 472,74 -> 472,68 -> 472,74 -> 474,74 -> 474,68 -> 474,74 -> 476,74 -> 476,71 -> 476,74 -> 478,74 -> 478,65 -> 478,74 -> 480,74 -> 480,73 -> 480,74 -> 482,74 -> 482,64 -> 482,74
+461,87 -> 461,80 -> 461,87 -> 463,87 -> 463,80 -> 463,87 -> 465,87 -> 465,80 -> 465,87 -> 467,87 -> 467,86 -> 467,87
diff --git a/14/sample.txt b/14/sample.txt
new file mode 100644
index 0000000..4e87bb5
--- /dev/null
+++ b/14/sample.txt
@@ -0,0 +1,2 @@
+498,4 -> 498,6 -> 496,6
+503,4 -> 502,4 -> 502,9 -> 494,9
diff --git a/15/ext.lua b/15/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/15/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/19/1.lua b/19/1.lua
new file mode 100644
index 0000000..209efc1
--- /dev/null
+++ b/19/1.lua
@@ -0,0 +1,129 @@
+require "ext"
+local blueprints = {}
+for line in io.lines() do
+ local bpn = line:match("Blueprint (%d+):")
+ bpn = tonumber(bpn)
+ blueprints[bpn] = {}
+ for robot, cost in line:gmatch("Each (%w+) robot costs (%d+) ore.") do --ore and clay
+ blueprints[bpn][robot] = {ore = tonumber(cost)}
+ end
+ for robot, c1, r1, c2, r2 in line:gmatch("Each (%w+) robot costs (%d+) (%w+) and (%w+) (%w+).") do
+ --obsidian and geode
+ blueprints[bpn][robot] = {[r1] = tonumber(c1),[r2]=tonumber(c2)}
+ end
+end
+print("Blueprints:")
+print(blueprints)
+local time = 24
+
+local function perm_yields(n)
+ local memgen = {} -- memoize generation
+ -- permutate all the ways to yield n geodes
+ local function permgen(left,tbl)
+ --print("Perm",left)
+ if left < 0 then return end
+ if left == 0 then
+ local ty = table.concat(tbl)
+ if memgen[ty] == nil then
+ coroutine.yield(tbl)
+ memgen[ty] = true
+ end
+ end
+ for i = time - 1,time-left - 1,-1 do
+ local minesfor = time - i
+ if tbl[i] == nil and (minesfor <= left) then
+ tbl[i] = "geode"
+ permgen(left - minesfor,tbl)
+ tbl[i] = nil
+ end
+ end
+ end
+ return coroutine.wrap(function() permgen(n,{}) end)
+end
+
+local dependencies = {"clay","obsidian"}
+local function rperm(a,n,perm)
+ local function rperm_helper(a,n,rst,restrict)
+ if n == 0 then
+ coroutine.yield(rst)
+ else
+ for _,v in pairs(a) do
+ local lc = #rst
+ rst[lc + 1] = v
+ rperm_helper(a,n-1,rst)
+ rst[lc + 1] = nil
+ end
+ end
+ end
+ return coroutine.wrap(function() rperm_helper(a,n,{}) end)
+end
+
+local state = {
+ minute = 0,
+ resources = {ore = 0, clay = 0, obsidian = 0, geode = 0},
+ robots = {ore = 1, clay = 0, obsidian = 0, geode = 0}
+}
+
+local function copy_state(tbl)
+ local newtbl = {}
+ for k,v in pairs(tbl) do
+ newtbl[k] = v
+ end
+ for _,n in pairs({"resources","robots"}) do
+ newtbl[n] = {}
+ for k,v in pairs(tbl[n]) do
+ newtbl[n][k] = v
+ end
+ end
+ return newtbl
+end
+
+local function can_build(state,blueprint,name)
+ ---print("state",state,"blueprint",blueprint,"name",name)
+ for res, amt in pairs(blueprint[name]) do
+ if state.resources[res] < amt then
+ return false
+ end
+ end
+ return true
+end
+
+local function simulate(blueprint, state, build_order, geode_times)
+ while state.minute <= time do
+ if geode_times[state.minute] then
+ if not can_build(state,blueprint,"geode") then
+ print("Failed to build geode at",state.minute)
+ return false
+ end
+ elseif #build_order > 0 and can_build(state,blueprint,build_order[1]) then
+ local rname = build_order[1]
+ for res,amt in pairs(blueprint[rname]) do
+ state.resources[res] = state.resources[res] - amt
+ end
+ state.robots[rname] = state.robots[rname] + 1
+ table.remove(build_order,1)
+ end
+ for res,count in pairs(state.robots) do
+ state.resources[res] = state.resources[res] + count
+ end
+ state.minute = state.minute + 1
+ end
+ return true
+end
+
+local function feasable(blueprint, geode_times)
+ for i = 1,12 do
+ print("Trying with",i,"other robots")
+ for perm in rperm({"ore","clay","obsidian"},i) do
+ local state = copy_state(state)
+ if simulate(blueprint, state, perm, geode_times) then
+ print("Successful simulation")
+ return true
+ end
+ end
+ end
+end
+
+for combo in perm_yields(56) do
+ print("combo:",combo)
+end
diff --git a/19/1_2.lua b/19/1_2.lua
new file mode 100644
index 0000000..6752862
--- /dev/null
+++ b/19/1_2.lua
@@ -0,0 +1,172 @@
+require "ext"
+local blueprints = {}
+for line in io.lines() do
+ local bpn = line:match("Blueprint (%d+):")
+ bpn = tonumber(bpn)
+ blueprints[bpn] = {}
+ for robot, cost in line:gmatch("Each (%w+) robot costs (%d+) ore.") do --ore and clay
+ blueprints[bpn][robot] = {ore = tonumber(cost)}
+ end
+ for robot, c1, r1, c2, r2 in line:gmatch("Each (%w+) robot costs (%d+) (%w+) and (%w+) (%w+).") do
+ --obsidian and geode
+ blueprints[bpn][robot] = {[r1] = tonumber(c1),[r2]=tonumber(c2)}
+ end
+end
+print("Blueprints:")
+print(blueprints)
+local time = 24
+local speculative_geodes = 0
+-- 8 was originally 4 (since building clay, obsidian, and geode would be on
+-- turn 4, 8 was found experimentally based on input.
+for i = 4,time do --assume we build clay, obsidian, and geode immediately,
+ --how many geodes can we mine?
+ speculative_geodes = speculative_geodes + i
+end
+
+local state = {
+ minute = 0,
+ resources = {ore = 0, clay = 0, obsidian = 0, geode = 0},
+ robots = {ore = 1, clay = 0, obsidian = 0, geode = 0},
+ buildorder = {},
+ max_geodes = speculative_geodes
+}
+
+local function copy_state(tbl)
+ local resources, robots = tbl.resources, tbl.robots
+ local newtbl = {
+ minute = tbl.minute,
+ resources = {
+ ore = resources.ore,
+ clay = resources.clay,
+ obsidian = resources.obsidian,
+ geode = resources.geode
+ },
+ robots = {
+ ore = robots.ore,
+ clay = robots.clay,
+ obsidian = robots.obsidian,
+ geode = robots.geode
+ },
+ max_geodes = tbl.max_geodes
+ }
+ local buildorder = {}
+ for k,v in ipairs(tbl.buildorder) do
+ buildorder[k] = v
+ end
+ newtbl.buildorder = buildorder
+ return newtbl
+end
+
+local function can_build(state,blueprint,name)
+ local resources = state.resources
+ for res, amt in pairs(blueprint[name]) do
+ if resources[res] < amt then
+ return false
+ end
+ end
+ return true
+end
+
+local function step(state)
+ local resources = state.resources
+ for name, amt in pairs(state.robots) do
+ resources[name] = resources[name] + amt
+ end
+ state.minute = state.minute + 1
+end
+
+local table_concat = table.concat
+local function bo_to_s(state)
+ -- a short representaiton of our build order, to use less memory
+ local s = {}
+ for _,v in ipairs(state.buildorder) do
+ s[#s + 1] = v:sub(2,2)
+ end
+ return table_concat(s)
+end
+
+local prl = {"ore","clay","obsidian"}
+local table_remove = table.remove
+local function simulate(blueprint)
+ print("Examining blueprint",blueprint)
+ local scpy = copy_state(state)
+ local branch = {scpy}
+ local known_builds = {} -- memoize build order
+ setmetatable(known_builds,{__mode="kv"})
+ local nbranches = 0
+ local max_geodes = 0
+ local max_cost = {ore=0,clay=0,obsidian=0}
+ -- examin our blueprint. If we have enouch ore robots to build anything
+ -- next turn, we never need to buid another ore robot.
+ -- Likewise, if we have enough clay robots to build anything next turn,
+ -- we never need another clay robot.
+ for robot, resources in pairs(blueprint) do
+ for res, amt in pairs(resources) do
+ max_cost[res] = math.max(max_cost[res],amt)
+ end
+ end
+ while #branch > 0 do
+ local tbranch = table_remove(branch)
+ --print("Examining ",tbranch)
+ if nbranches % 1000000 == 0 then
+ print("examined",nbranches,"branches",#branch,"active")
+ print("Curently examinig build order:")
+ print(bo_to_s(tbranch), #tbranch.buildorder)
+ print("Max geodes on this branch were:",tbranch.max_geodes, "vs", max_geodes, "at",tbranch.minute)
+ end
+ nbranches = nbranches + 1
+ if tbranch.minute == time then
+ if tbranch.resources.geode > max_geodes then
+ max_geodes = tbranch.resources.geode
+ print("New maximum:",max_geodes)
+ end
+ else
+ --only consider robots we don't have enough of
+ local robots = {}
+ for _, resource in ipairs(prl) do
+ if tbranch.robots[resource] < max_cost[resource] then
+ robots[#robots + 1] = resource
+ end
+ end
+ robots[#robots + 1] = "geode"
+ for _, robot in ipairs(robots) do
+ if can_build(tbranch, blueprint, robot) then
+ --a branch where we built the robot,
+ local ns = copy_state(tbranch)
+ for res, amt in pairs(blueprint[robot]) do
+ ns.resources[res] = ns.resources[res] - amt
+ end
+ step(ns)
+ local time_remaining = time - ns.minute
+ if robot ~= "geode" then
+ ns.max_geodes = ns.max_geodes - time_remaining
+ end
+ ns.robots[robot] = ns.robots[robot] + 1
+ ns.buildorder[#ns.buildorder + 1] = robot
+ local boc = bo_to_s(ns)
+ if not known_builds[boc] and ns.max_geodes > max_geodes then
+ known_builds[boc] = true
+ branch[#branch + 1] = ns
+ end
+ end
+ end
+ --a branch where we don't
+ step(tbranch)
+ local time_remaining = time - tbranch.minute
+ tbranch.max_geodes = tbranch.max_geodes - time_remaining
+ if tbranch.max_geodes > max_geodes then
+ branch[#branch + 1] = tbranch
+ end
+ end
+ end
+ print("Max geodes for blueprint was",max_geodes)
+ return max_geodes
+end
+
+
+local sum = 0
+for bpn, blueprint in pairs(blueprints) do
+ max_geodes = simulate(blueprint)
+ sum = sum + (bpn * max_geodes)
+end
+print(sum)
diff --git a/19/ext.lua b/19/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/19/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/19/input.txt b/19/input.txt
new file mode 100644
index 0000000..5d340c6
--- /dev/null
+++ b/19/input.txt
@@ -0,0 +1,3 @@
+Blueprint 1: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 16 clay. Each geode robot costs 3 ore and 9 obsidian.
+Blueprint 2: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 19 clay. Each geode robot costs 3 ore and 19 obsidian.
+Blueprint 3: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 14 clay. Each geode robot costs 4 ore and 19 obsidian.
diff --git a/19/input2.txt b/19/input2.txt
new file mode 100644
index 0000000..5c80431
--- /dev/null
+++ b/19/input2.txt
@@ -0,0 +1,30 @@
+Blueprint 1: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 16 clay. Each geode robot costs 3 ore and 9 obsidian.
+Blueprint 2: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 19 clay. Each geode robot costs 3 ore and 19 obsidian.
+Blueprint 3: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 14 clay. Each geode robot costs 4 ore and 19 obsidian.
+Blueprint 4: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 14 clay. Each geode robot costs 3 ore and 8 obsidian.
+Blueprint 5: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 14 clay. Each geode robot costs 4 ore and 9 obsidian.
+Blueprint 6: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 7 clay. Each geode robot costs 3 ore and 20 obsidian.
+Blueprint 7: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 19 clay. Each geode robot costs 2 ore and 18 obsidian.
+Blueprint 8: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 17 clay. Each geode robot costs 3 ore and 19 obsidian.
+Blueprint 9: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 19 clay. Each geode robot costs 3 ore and 8 obsidian.
+Blueprint 10: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 14 clay. Each geode robot costs 4 ore and 11 obsidian.
+Blueprint 11: Each ore robot costs 2 ore. Each clay robot costs 2 ore. Each obsidian robot costs 2 ore and 15 clay. Each geode robot costs 2 ore and 7 obsidian.
+Blueprint 12: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 19 clay. Each geode robot costs 4 ore and 8 obsidian.
+Blueprint 13: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 16 clay. Each geode robot costs 2 ore and 9 obsidian.
+Blueprint 14: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 15 clay. Each geode robot costs 3 ore and 16 obsidian.
+Blueprint 15: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 20 clay. Each geode robot costs 2 ore and 9 obsidian.
+Blueprint 16: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 14 clay. Each geode robot costs 3 ore and 19 obsidian.
+Blueprint 17: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 9 clay. Each geode robot costs 3 ore and 15 obsidian.
+Blueprint 18: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 6 clay. Each geode robot costs 2 ore and 20 obsidian.
+Blueprint 19: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 15 clay. Each geode robot costs 4 ore and 20 obsidian.
+Blueprint 20: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 11 clay. Each geode robot costs 3 ore and 14 obsidian.
+Blueprint 21: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 19 clay. Each geode robot costs 4 ore and 11 obsidian.
+Blueprint 22: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 20 clay. Each geode robot costs 4 ore and 7 obsidian.
+Blueprint 23: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 9 clay. Each geode robot costs 2 ore and 20 obsidian.
+Blueprint 24: Each ore robot costs 2 ore. Each clay robot costs 2 ore. Each obsidian robot costs 2 ore and 17 clay. Each geode robot costs 2 ore and 10 obsidian.
+Blueprint 25: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 16 clay. Each geode robot costs 3 ore and 13 obsidian.
+Blueprint 26: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 14 clay. Each geode robot costs 4 ore and 10 obsidian.
+Blueprint 27: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 20 clay. Each geode robot costs 2 ore and 12 obsidian.
+Blueprint 28: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 18 clay. Each geode robot costs 2 ore and 11 obsidian.
+Blueprint 29: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 5 clay. Each geode robot costs 4 ore and 11 obsidian.
+Blueprint 30: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 20 clay. Each geode robot costs 2 ore and 17 obsidian.
diff --git a/19/sample.txt b/19/sample.txt
new file mode 100644
index 0000000..f39c094
--- /dev/null
+++ b/19/sample.txt
@@ -0,0 +1,2 @@
+Blueprint 1: Each ore robot costs 4 ore. Each clay robot costs 2 ore. Each obsidian robot costs 3 ore and 14 clay. Each geode robot costs 2 ore and 7 obsidian.
+Blueprint 2: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 8 clay. Each geode robot costs 3 ore and 12 obsidian.
diff --git a/22/1.lua b/22/1.lua
new file mode 100644
index 0000000..fd946bb
--- /dev/null
+++ b/22/1.lua
@@ -0,0 +1,144 @@
+require "ext"
+local parse_map = true
+local map = {}
+local row,col = 0,0
+local start
+local commands = {}
+local face_size =
+for line in io.lines() do
+ row = row + 1
+ if line ~= "" and parse_map then
+ col = 0
+ for char in line:gmatch("(.)") do
+ col = col + 1
+ local locf = string.format("%d,%d",row,col)
+ if char == "." then
+ if start == nil then
+ start = locf
+ end
+ map[locf] = true
+ elseif char == "#" then
+ map[locf] = false
+ end --else, it's nil
+ end
+ elseif line == "" and parse_map then
+ parse_map = false
+ elseif not parse_map then
+ local ccursor = line
+ while ccursor ~= "" do
+ if ccursor:find("^%d") then
+ table.insert(commands,{type="walk",n=ccursor:match("^(%d+)")})
+ ccursor = ccursor:gsub("^(%d+)","")
+ elseif ccursor:find("^[LR]") then
+ table.insert(commands,{type="turn",n=ccursor:match("^([LR])")})
+ ccursor = ccursor:gsub("^[LR]","")
+ end
+ end
+ end
+end
+
+local directions = {
+ up = {-1, 0},
+ down = {1,0},
+ left = {0,-1},
+ right = {0,1}
+}
+local dirmap = {
+ [0] = {
+ name = "right",
+ R = 1,
+ L = 3
+ },
+ [1] = {
+ name = "down",
+ R = 2,
+ L = 0
+ },
+ [2] = {
+ name = "left",
+ R = 3,
+ L = 1
+ },
+ [3] = {
+ name = "up",
+ R = 0,
+ L = 2
+ }
+}
+
+local mem_loop = {}
+local function find_loop_loc(sloc, direction)
+ print("Finding loop location from",sloc,"dir",direction)
+ if mem_loop[sloc] and mem_loop[sloc][direction] then
+ return mem_loop[sloc][direction]
+ end
+ local srow, scol = sloc:match("(%d+),(%d+)")
+ local radd, cadd = -direction[1], -direction[2]
+ while map[string.format("%d,%d",srow,scol)] ~= nil do
+ print("Examining",string.format("%d,%d",srow,scol),"was not nil")
+ srow, scol = srow + radd, scol + cadd
+ end
+ print("Examining",string.format("%d,%d",srow,scol),"was nil")
+ local ret = string.format("%d,%d",srow + direction[1],scol + direction[2])
+ mem_loop[ret] = mem_loop[ret] or {}
+ mem_loop[ret][direction] = ret
+ print("Returning",ret)
+ return ret
+end
+print("map",map)
+print("commands",commands)
+local state = {
+ location = start,
+ direction = 0
+}
+print("Starting state:",state)
+
+local function open(location,direction)
+ local crow, ccol = state.location:match("(%d+),(%d+)")
+ local rrow, rcol = crow + direction[1], ccol + direction[2]
+ local rloc = string.format("%d,%d",rrow,rcol)
+ if map[rloc] then
+ return true, rloc
+ elseif map[rloc] == false then
+ return false
+ else
+ local loop_loc = find_loop_loc(location,direction)
+ assert(map[loop_loc] ~= nil)
+ if map[loop_loc] then
+ return true, loop_loc
+ else
+ return false
+ end
+ end
+end
+
+local function run(state, instructions)
+ local function walk(state,n)
+ for i = 1, n do
+ local dir = directions[dirmap[state.direction].name]
+ local isopen, newloc = open(state.location,dir)
+ if isopen then
+ print("Walked to",newloc)
+ state.location = newloc
+ else
+ break
+ end
+ end
+ end
+ local function turn(state,dir)
+ state.direction = dirmap[state.direction][dir]
+ end
+ while #instructions > 0 do
+ local ins = table.remove(instructions,1)
+ if ins.type == "walk" then
+ walk(state,ins.n)
+ elseif ins.type == "turn" then
+ turn(state,ins.n)
+ end
+ end
+end
+
+run(state,commands)
+print(state)
+local row, col = state.location:match("(%d+),(%d+)")
+print((row*1000) + (col * 4) + state.direction)
diff --git a/22/2.lua b/22/2.lua
new file mode 100644
index 0000000..769e0e8
--- /dev/null
+++ b/22/2.lua
@@ -0,0 +1,358 @@
+require "ext"
+local parse_map = true
+local map = {}
+local row,col = 0,0
+ local start
+ local commands = {}
+
+ local function parse_command(line)
+ local commands = {}
+ local ccursor = line
+ while ccursor ~= "" do
+ if ccursor:find("^%d") then
+ table.insert(commands,{type="walk",n=ccursor:match("^(%d+)")})
+ ccursor = ccursor:gsub("^(%d+)","")
+ elseif ccursor:find("^[LR]") then
+ table.insert(commands,{type="turn",n=ccursor:match("^([LR])")})
+ ccursor = ccursor:gsub("^[LR]","")
+ end
+ end
+ return commands
+end
+
+for line in io.lines() do
+ row = row + 1
+ if line ~= "" and parse_map then
+ col = 0
+ for char in line:gmatch("(.)") do
+ col = col + 1
+ local locf = string.format("%d,%d",row,col)
+ if char == "." then
+ if start == nil then
+ start = locf
+ end
+ map[locf] = true
+ elseif char == "#" then
+ map[locf] = false
+ end --else, it's nil
+ end
+ elseif line == "" and parse_map then
+ parse_map = false
+ elseif not parse_map then
+ commands = parse_command(line)
+ end
+end
+
+local directions = {
+ up = {-1, 0},
+ down = {1,0},
+ left = {0,-1},
+ right = {0,1}
+}
+local dirmap = {
+ [0] = {
+ name = "right",
+ R = 1,
+ L = 3
+ },
+ [1] = {
+ name = "down",
+ R = 2,
+ L = 0
+ },
+ [2] = {
+ name = "left",
+ R = 3,
+ L = 1
+ },
+ [3] = {
+ name = "up",
+ R = 0,
+ L = 2
+ }
+}
+local dirnames = {
+ [directions.up] = "up",
+ [directions.down] = "down",
+ [directions.left] = "left",
+ [directions.right] = "right"
+}
+local rev_dirmap = {}
+for i,t in pairs(dirmap) do
+ rev_dirmap[t.name] = i
+end
+
+
+local mem_loop = {}
+--Planning:
+-- 6 <-> 7
+-- 5 <-> 9
+-- 13 <-> 12
+--
+-- 1 <-> 11
+-- 2 <-> 14
+-- 4 <-> 10
+-- 8 <-> 3
+local function find_loop_loc(sloc, direction)
+ print("Finding loop location from",sloc,"dir",dirnames[direction])
+ --[[
+ if mem_loop[sloc] and mem_loop[sloc][direction] then
+ return mem_loop[sloc][direction][1], mem_loop[sloc][direction][2]
+ end
+ ]]
+ local srow, scol = sloc:match("(%d+),(%d+)")
+ srow, scol = tonumber(srow),tonumber(scol)
+ --just hard-code looping rules
+ local rloc, rdir
+ if srow == 1 and scol > 50 and scol <= 100 and direction == directions.up then -- 1 -> 11
+ print("1->11")
+ rloc = string.format("%d,%d",100+scol,1)
+ rdir = rev_dirmap.right
+ elseif scol == 1 and srow > 150 and srow <= 200 and direction == directions.left then -- 11 -> 1
+ print("11->1")
+ rloc = string.format("%d,%d",1,srow - 100)
+ rdir = rev_dirmap.down
+ elseif srow == 1 and scol > 100 and scol <= 150 and direction == directions.up then -- 2 -> 14
+ print("2->14")
+ rloc = string.format("%d,%d", 200, scol - 100)
+ rdir = rev_dirmap.up
+ elseif srow == 200 and scol > 0 and scol <= 50 and direction == directions.down then -- 14 ->2
+ print("14->2")
+ rloc = string.format("%d,%d", 1, scol + 100)
+ rdir = rev_dirmap.down
+ elseif scol == 51 and srow > 0 and srow <= 50 and direction == directions.left then -- 3 -> 8
+ print("3->8")
+ rloc = string.format("%d,%d", (50 - srow) + 101, 1)
+ rdir = rev_dirmap.right
+ elseif scol == 1 and srow > 100 and srow <= 150 and direction == directions.left then -- 8 -> 3
+ print("8->3")
+ rloc = string.format("%d,%d", ((150 - srow) - 100) + 101, 51)
+ rdir = rev_dirmap.right
+ elseif scol == 150 and srow > 0 and srow <= 100 and direction == directions.right then -- 4 -> 10
+ print("4->10")
+ rloc = string.format("%d,%d", (50 - srow) + 101, 100)
+ rdir = rev_dirmap.left
+ elseif scol == 100 and srow > 100 and srow <= 150 and direction == directions.right then -- 10 -> 4
+ print("10->4")
+ rloc = string.format("%d,%d", (151 - srow), 150)
+ rdir = rev_dirmap.left
+ elseif scol == 51 and srow > 50 and srow <= 100 and direction == directions.left then -- 5 -> 9
+ print("5->9")
+ rloc = string.format("%d,%d", 101, srow-50)
+ rdir = rev_dirmap.down
+ elseif srow == 101 and scol > 0 and scol <= 50 and direction == directions.up then -- 9 -> 5
+ print("9->5")
+ rloc = string.format("%d,%d", scol + 50, 51)
+ rdir = rev_dirmap.right
+ elseif srow == 50 and scol > 100 and scol <= 150 and direction == directions.down then -- 6 -> 7
+ print("6->7")
+ rloc = string.format("%d,%d", scol - 50, 100)
+ rdir = rev_dirmap.left
+ elseif scol == 100 and srow > 50 and srow <= 100 and direction == directions.right then -- 7 -> 6
+ print("7->6")
+ rloc = string.format("%d,%d", 50, srow + 50)
+ rdir = rev_dirmap.up
+ elseif srow == 150 and scol > 50 and scol <= 100 and direction == directions.down then -- 12 -> 13
+ print("12->13")
+ rloc = string.format("%d,%d", scol + 100, 50)
+ rdir = rev_dirmap.left
+ elseif scol == 50 and srow > 150 and srow <= 200 and direction == directions.right then -- 13 -> 12
+ print("13->12")
+ rloc = string.format("%d,%d", 150, srow - 100)
+ rdir = rev_dirmap.up
+ else
+ error(string.format("Unknown location + direction: %d,%d %s",srow, scol, tostring(direction)))
+ end
+ print("Returning",rloc,rdir)
+ assert(rloc)
+ assert(rdir)
+ assert(map[rloc] ~= nil)
+
+ mem_loop[rloc] = mem_loop[rloc] or {}
+ mem_loop[rloc][direction] = {rloc,rdir}
+ return rloc, rdir
+end
+
+print(map)
+local state = {
+ location = start,
+ direction = 0
+}
+print("Starting state:",state)
+
+local function open(location,direction)
+ local crow, ccol = location:match("(%d+),(%d+)")
+ local rrow, rcol = crow + direction[1], ccol + direction[2]
+ local rloc = string.format("%d,%d",rrow,rcol)
+ if map[rloc] then
+ return rloc, rev_dirmap[dirnames[direction]]
+ elseif map[rloc] == false then
+ return false
+ else
+ local loop_loc,newdir = find_loop_loc(location,direction)
+ assert(map[loop_loc] ~= nil)
+ if map[loop_loc] then
+ return loop_loc,newdir
+ else
+ return false
+ end
+ end
+end
+
+-- temporary function to test our cube is put togeather correctly
+local function exists(location,direction)
+ assert(type(location) == "string")
+ assert(type(direction) == "table")
+ print("Exists",location,dirnames[direction])
+ local crow, ccol = location:match("(%d+),(%d+)")
+ local rrow, rcol = crow + direction[1], ccol + direction[2]
+ local rloc = string.format("%d,%d",rrow,rcol)
+ print("checking existance of",rloc)
+ if map[rloc] ~= nil then
+ print("Exists in map")
+ return rloc,rev_dirmap[dirnames[direction]]
+ else
+ print("Looping around")
+ local loop_loc,newdir = find_loop_loc(location,direction)
+ assert(map[loop_loc] ~= nil)
+ assert(type(newdir) == "number")
+ return loop_loc,newdir
+ end
+
+end
+
+local corners = {
+ {1,51, directions.up},
+ {1,100, directions.right},
+ {50,51},
+ {50,100},
+ {50,101},
+ {51,51},
+ {51,100},
+ {101,1},
+ {101,50},
+ {101,51},
+ {101,100},
+ {150,1},
+ {150,50},
+ {150,51},
+ {150,100},
+ {200,1},
+ {200,50}
+}
+local edges = {
+
+}
+
+--[[
+-- test find_loop_loc, at each of our box corners, move around and make sure we end up back where we started
+for _, corner in pairs(corners) do
+
+ print("Checking counter-clockwise",corner)
+ -- counter-clockwise
+ local s,d = corner, directions.up
+ local ns, nd = exists(s,d)
+ print("Returns from exists 1:",ns,nd)
+ s = assert(e)
+ d = directions[dirmap[d].L]
+ e, d = exists(u,d)
+ s = assert(e)
+ d = directions[dirmap[d].L]
+ e, d = exists(u,d)
+ s = assert(e)
+ assert(s == corner,s .. " was not " .. corner)
+end
+]]
+
+local function run(state, instructions)
+ local function walk(state,n)
+ print("Walking",state,n)
+ for i = 1, n do
+ local dir = directions[dirmap[state.direction].name]
+ local newloc, newdir = open(state.location,dir)
+ --local newloc, newdir = exists(state.location,dir)
+ if newloc then
+ print("Walked to",newloc)
+ state.location = newloc
+ state.direction = newdir
+ else
+ break
+ end
+ end
+ end
+ local function turn(state,dir)
+ print("Turning",state)
+ assert(type(state.location) == "string")
+ assert(type(state.direction) == "number")
+ state.direction = dirmap[state.direction][dir]
+ end
+ while #instructions > 0 do
+ local ins = table.remove(instructions,1)
+ if ins.type == "walk" then
+ walk(state,ins.n)
+ elseif ins.type == "turn" then
+ turn(state,ins.n)
+ end
+ end
+end
+-- test that it works
+local ghosts = {
+ {1,51,rev_dirmap.up,"1L1L1"},
+ {1,51,rev_dirmap.left,"1R1R1"},
+ {1,100,rev_dirmap.up,"1R1R1"},
+ {1,100,rev_dirmap.right,"1L1L1"},
+ {1,101,rev_dirmap.up,"1L1L1"},
+ {1,101,rev_dirmap.left,"1R1R1"},
+ {1,150,rev_dirmap.up,"1R1R1"},
+ {1,150,rev_dirmap.right,"1L1L1"},
+ {50,51,rev_dirmap.left,"1L1L1"},
+ {50,51,rev_dirmap.down,"1R1R1"},
+ {50,100,rev_dirmap.right,"1R1R1"},
+ {50,100,rev_dirmap.down,"1L1L1"},
+ {50,150,rev_dirmap.right,"1R1R1"},
+ {50,150,rev_dirmap.down,"1L1L1"},
+ {51,51,rev_dirmap.left,"1R1R1"},
+ {51,51,rev_dirmap.up,"1L1L1"},
+ {51,100,rev_dirmap.up,"1R1R1"},
+ {51,100,rev_dirmap.right,"1L1L1"},
+ {100,51,rev_dirmap.left,"1L1L1"},
+ {100,51,rev_dirmap.down,"1R1R1"},
+ {100,100,rev_dirmap.right,"1R1R1"},
+ {100,100,rev_dirmap.down,"1L1L1"},
+ {101,1,rev_dirmap.up,"1L1L1"},
+ {101,1,rev_dirmap.left,"1R1R1"},
+ {101,50,rev_dirmap.up,"1R1R1"},
+ {101,50,rev_dirmap.right,"1L1L1"},
+ {101,51,rev_dirmap.left,"1R1R1"},
+ {101,51,rev_dirmap.up,"1L1L1"},
+ {101,100,rev_dirmap.right,"1L1L1"},
+ {101,100,rev_dirmap.up,"1R1R1"},
+ {150,1,rev_dirmap.left,"1L1L1"},
+ {150,1,rev_dirmap.down,"1R1R1"},
+ {150,50,rev_dirmap.right,"1R1R1"},
+ {150,50,rev_dirmap.down,"1L1L1"},
+ {150,51,rev_dirmap.left,"1L1L1"},
+ {150,51,rev_dirmap.down,"1R1R1"},
+ {150,100,rev_dirmap.right,"1R1R1"},
+ {150,100,rev_dirmap.down,"1L1L1"}
+}
+--[[
+for _,ghost in pairs(ghosts) do
+ print("=========================")
+ print("Checking location:",ghost)
+ local c = parse_command(ghost[4])
+ local locc = string.format("%d,%d",ghost[1],ghost[2])
+ local istate = {
+ location = locc,
+ direction = ghost[3]
+ }
+ run(istate,c)
+ assert(istate.location == locc)
+end
+os.exit(0)
+]]
+
+run(state,commands)
+print(state)
+local row, col = state.location:match("(%d+),(%d+)")
+print((row*1000) + (col * 4) + state.direction)
diff --git a/22/ext.lua b/22/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/22/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/22/input.txt b/22/input.txt
new file mode 100644
index 0000000..10403d1
--- /dev/null
+++ b/22/input.txt
@@ -0,0 +1,202 @@
+ .........#.....#...#.......................#....#...............#.....#...#...............#.........
+ ....#........##.......#...#........#....#...#......#....#..#...........#..#..........#........#.....
+ ..............#..............#......#.................#.....#...................#...................
+ ##..................................#...##.#.....#....##......#.......#..........................#..
+ ..#...###..........................#..........................................#.....................
+ ............##................#.................#.#........#..........#...........#.........#...#...
+ ..#..##.#...#....#................#.............##................#........#..#.............#.#.....
+ ................................#...##......#....#....#..#....#...................................#.
+ ...#.#........#.............#...##...#..#.............#.................#..#........................
+ .....#......#.........................#.......#........#......#.................#...........#.......
+ ..........................#........#....................#...#..........#.........#...#..............
+ ............#..###..#..#.......#..............#...#..........#.....................#.......#.....#..
+ ................#......#.......#........#............#.......#..#..#....#......................#.#.#
+ .................#..................#...#............#......#...........#.............#.........#...
+ ..#.#...#............#......#.....#..#.#..#.......#....#..........#.................................
+ ........#..................#......#......#.........#.....................#....................#.....
+ ....................#...............#...##...#.......#..#..............#.#.....#.......#...#....#...
+ ..........#.#.#.......................#............#........#.......................................
+ ............#...#..#.........#.......#..#..........#.............#...#..................#...........
+ ...#..........................................................#..#.#...........................#.#..
+ #............#.......#.........................#..#....#.#..#.......#.....#...#....#...........#....
+ .............#..#....................#...............#..........#...#..#..................#.#..#.#..
+ ....#....#........#........#...............#..................#........................#.......###..
+ ....#......#.#.........................................................#.....##..............#.....#
+ ....................#....#.#.....#.#....#..#.#.............#........#..#.........#...#....#.........
+ ###.#..#...#..............#..........................#.......#.#........................#.......##.#
+ ......#..................#............#................#...#.........#...........#....#.............
+ .#...#.....#......................................#...................#...........................#.
+ ........#....#....#.................#.......#......#....#..#.#............#.....#...##.......#..#...
+ ....#....#...........#...#...#.....#...........#..........#......................#......#.#.........
+ ........................#.......##............................#....................................#
+ .....##...............#........#......#...................................#....#....................
+ .....#....#....#.......#..#..#.#.#..#.##..#...............#..................#.#.#..................
+ .....#..........#....##.......#..#............#..............#.#.......#.............#..............
+ .........#..........#..#........#..........#.......................#.........#.#....#....#..........
+ ...#.....#..............................#.........##.....##..#...............#.....................#
+ ............#......#.......##.......#.#.............#..............#...#..........................#.
+ ..#......#.#...#..#...#.......#.......#.............#......#.................................#......
+ ..............#.....#.......#.....#........................#..........#.................#.........#.
+ ................#.................................#........#......................#........#....#...
+ .#..#...#..##..#...................#..................#......#..............#.......#..........#....
+ ........#........................##...#...............#............#................................
+ ..##..............#......................#..........#.##......#.......................#.............
+ #............................#........#.........#.#...#.........#.#.......#.........#...............
+ ........##.........#........#..#........#.#...#...............#..#.....#.........#.............#....
+ .....#..#..##.............#................#....##.....................#..........#.................
+ #...#.............#......##...#...................#....................................#.....#......
+ .#...#.........#........#....##......#.....##......#..#....#.#....#....#......##....#......#.....#..
+ ...............................##.............#............#.......#........#.......................
+ ............###......................#.....#........##.......#......................................
+ ...#..#......#...................#............#...
+ ...##.........###......#.............#............
+ .....#..........................................#.
+ .........##....#.................##.#.............
+ #....#...................#...............#........
+ ..........#.........#...........................#.
+ .#............#......................#....#.......
+ ......#.........#.....#...##.....##......#........
+ .....##......#..#...........................#.....
+ .....#.#............#......#...#...#....#.........
+ ......#.#.............#......................#....
+ ........#.....................#......#.........#..
+ ....#........................#....#.....##..#.....
+ ..................##.........#.##..#..............
+ ................#......#.............#......#....#
+ .....#......#.......#...............#.#...........
+ ..#....#...#....#.....#.....#..............#...#..
+ .......#.......#...............#.........#.......#
+ .....#................#...........#.....#........#
+ ..........#.#...........##.......#.......#........
+ ...................#........................#....#
+ ..........#.##..#..#.....#.##.#..................#
+ ........................#.#...........#...........
+ ....#...........#....#.....#.#...#.#.#.....###....
+ .#..........................##...#.............#.#
+ #...............#.....##............#....#......#.
+ ....#..#.#.#..#.........#....#....................
+ ....#.....#.#...........#..............#.#.....#..
+ ..............#.......#.........#....#.........##.
+ ...............................................#..
+ ...................#.....#...............#........
+ ........#....................#.....#.#.#.#........
+ ....#...#.#..................................#...#
+ .........#............#....#...............#......
+ ..#........#.......#.#.##....#............##......
+ .#...#...##.....#..............#............#...##
+ #....#...............#...#.#........#........#....
+ ..........#...................#.....#.............
+ ............#.............#.#.#...................
+ ......................#.##............#....#......
+ ...............#........................#.#.......
+ ..........#..#...#...####.#.....#.................
+ ...##..#....##.#...#.......#...#..##.......#......
+ ....#............#..................#.............
+ ...............##....#.......#..#.........#......#
+ .#.....#..#.#.....#..#........##...#.#...#........
+ ......#....#.............................#..#..#..
+ ..........#..#.........#..#....#.#...........#....
+ ..........#.........................#.....#...#...
+ .......#...#........................#.............
+........#.........#.....#........#....................................#......#............#..#.....#
+.........#........#....#...................#......#..........#.................#...#..........#..##.
+......#.......................##............#...........#....#.................#.....#..............
+....#....#....#.................#.##..................#.....#............#.....#...#....#...........
+#..#.........#......#....#............#..........................#.........#..............#.#...#...
+........#....#..#.........#.#.......#.........#.....................#...........#......#.#........#.
+..#.............#.........................#.....#...#.................#...#......#........#......#..
+.........#....#..............#.#......................#..#............................#.............
+...#............................#.....#.....#..............#..............................#........#
+....#..............#.#.........#............#.......#...#.........#....#.............#.....#.#......
+.............#.........#................#............................#................#.............
+.....#...................................#.....#.................#........#......................#.#
+.............#...#..........#..#.........................#..#..............#..#.....#.#.........#..#
+....#........#.........#...#....#.#.........#..#..##........#....#.##......#....................##..
+...........#...#...............#..........................#............#................#.#.........
+#...#.....#.....#......#......#.#........................#..#...#..#.#...#.........#...........#...#
+..#.....#...........#...#.....................................#...#..#............................#.
+.....#.....#...........#....#...............................##...#.#..#.#........#..................
+#...#.##.................#.......#...##.##...........#.....................##.....#.....#.#........#
+....#.......#...#.....................#..#.......................................#..................
+...............#....#.............#.........#....##.......................#.....#...................
+....#..#...........................................##.......................#.......................
+.....#..#................#...#....#..................................................#....#.........
+.#..........#.#.......#...##....................#................................................#..
+#........#.#..#............................#.......#..#.#.......................#....#..........#...
+..............#..................##.............##...#................#.#..#........................
+..#........#.#..........##.....#..................#.................................................
+....#.................#..#....................#.........#.#.........................................
+...#.....#.............#....#.#.#..#...#...................................#....#...##..............
+........#..#...#............#..##...........#.......................................................
+.......#............#............#........#.........#........##...#....#............................
+.................................................................#....#.............................
+............#.........#...#...................##.#.....#..##......#......#.........#................
+......###..........................#.#...........#.#...#....#.......#...................#..##......#
+.........#............#..............#........................#............#........#....##.#....#..
+....................#...........#.........#...#......#.#......................#..#..........#.......
+.........................#.....#.............#.........#.......#.....#....#........###.............#
+................#.##.........#...##......#.................#.......#.....##.........................
+............#..#....#..........#............................#...##...#............#...........#...#.
+.......#.............#.....................#..#......#.#............#...................#.......#.#.
+........#..#......................#.......#....#..#.........#................#.#....................
+.#.................#..........#..#...#.....................#................#.....................#.
+.#....#............#.............#.#..#...#.............###.#.......................................
+...#................#...#..........#....#...#.....................................#.................
+...............#..........................##.............#.......................................#..
+.#.....#........##..........#..............###....#...........#....#..#.................#........#..
+..#...#.....#...........#.................#..##.................##.......##.....................#...
+.#........#........#...............................................................#................
+..............#..............#.#......#.....#............#..#..#.......................#...#........
+.........#.................#............................#.......#....#.........#.#..........#.....#.
+..#.#..#......................#....#..............
+................#................##....#..........
+#.#.....#.........#..............#....#..........#
+..............#..#................#....#.........#
+...........#...............................#......
+........................#..#...........##....##...
+##......#........#.....#..........................
+...#.......##.........#........#..##....##.#.#..#.
+#.................................................
+...#...##....#.............#......................
+..........#........................#.....##.......
+......................................#..#.#.....#
+.........#...#............#....##.................
+#....#..#...#...........#.....................#...
+.....................#...................##.#.....
+..................#.#..................#.#........
+..#....................#...#..........#....#......
+......#...#.........................#....#........
+..#.....#.#.....#...........#.....................
+........#..#.........#..##..#........#......#.....
+#.......#..........#..........#......#........#.#.
+........#......#..........................#.......
+..#........#................................#.....
+.....#.....#.....#.............##......#...#.....#
+.........#.............#......#..........##......#
+............#.........##.......#..................
+.#..#.........................#......##....#......
+#......#...#..#.............#..#..........#....#..
+.......#....#......#.....#..#...#.#...#...#.....#.
+.#...#......#..................#.....#............
+.......#.......#....##...##...............#.......
+..#...................#................#........##
+..........#...................#...#.....#.........
+........#...#...#......................#....#.....
+.....#..#....#...........#...#...#..#.#...........
+.........#............#.#.#................#......
+...................#.......#..............#....#..
+.#....................#.........#.......#........#
+.#.........#.....##...............................
+....#..........................#.....#........#...
+#.#...#...........................#...............
+.............#........#..#..........##.........#..
+................#...............#..#.#.........#..
+..........#.......##..#......#.......#........#...
+...............#..................................
+.......#.....#.....#.....#........................
+....###......#..#.........#...........#..#........
+..................................#...............
+...#...#.....#........##.......#.........#...#.#..
+#...........#..#........#......#.#.#.#............
+
+12R25R28R21L15R49L21R10R27R28L47L18R43L1R8L34R4R34L48L42L19R32R30R34L11L49L6R49L5R45R11L6R47L27L12R46L40R46L33L14R18R41R12L25L35L29L16R41L14R32L29L49L24L35R39L8R34L20L19L14R44R12L35R10L35L11L46R35R14R21L10R10L31L2L47L10L40R43L8L8L38L6L49L27L14L21L49L45L29L7L28L41L10L4R28R7R48L5R6L25L47R40R30R34L39R35L46L39R24L45L26R44R13L36L15R35R7R42R34L3L28R42R2R32R42R22R23R9R34R32R34L10L22R10L31L17L23L45R14R2R34R10R45L28R30L25R20R41L1L29R31R11R37R18L50L50R12L33L6R49L50R12R2L3R42R9L7L44R30L26L1R37R22R18R50R17L23L5R8R48L30R33L2R46L49L1L18R37R50L10R8L7R8R37R30R14R40L36L15L41L46R39R8L4L34R11L25R37L23R18R47L23R32L26R49R16R30R12R39L7L43R38R45L50L35R46L24L41R3R18R5L12L39R41L46R31L12L48L7R21L22R5L27R42L26R20R40R9R8R22R6R41R40L33L24L30L45L29R18R20R5L31L4L40L49R37R9L17R4R34R47L18L48L4L8R4L5L40L7R47L29R49R50R50L22R23R21L50L17L28L41L38R6R36L12L9R9R40L16L4R44L7L37R14L10R16R38R44L35R19R47R18R29L31L40L47R35L42L7L34L49R10L29L14R12R24R13L29L12R45R8R50R39R34L50L10R44L32L31L24L30R47R41R2L7R3R31R38R33R35R46L22R12R47L20L36R49R27L3R25L2L12R13L28L17L29L44L18L35L18R6R22R24L38L31R23R26L39R40R13L37L24R1R14L20L14R43R14R45R36R22R47R22L18R17L28L45R22L20L19R37R20L43L43L14L8R16R6L13R6L23R16L1L45R9R36R17L45L30R43L31L38L4L28L27R12L7R27R50R49L4L30L21R27R46L44R17L15L5L4L29R31R19L13R48L36L8L17R23R1R40L33R50R12L36L19L6L45L17L14R12R3L36L35L19R46R21L8L33L11L34L25L2R32R10R30R15R46R37R24R39R7R39R43L29R39L34R29R19R49R41L38R11L43R17L35L45R41L22R48R25R8R45R39R13R8L36R2R5R50L40L12L23R42L2R41R14R19R28L25L49R39R9R13L43L20L28L46R19R36R46R12L9R7R30R30R9R43R26R36L11L34R41L42L19R2L18R9R20R11L11L2L10L24R25R32L44R14R4R24R10R24L5R4L13R35R35R22L18L24R46L32L47L37R21R49R6R12L16L31L39L26L48L8L26R27R16L48L30R36L24L48R36L1L1R16L38R1R26L11L29R20L50R22R44R4L18R37L6L19L44R20R14R37R3L39R12L23L46L19L45R35L12L7L28R46L18R25R38R10L22R18R34L25R4L15L2L9L35L24R6R27R22R32L22L49R22L39L27L38R38R12R28L27R2R14R10R30L25R4L15L40R34R42R38R9R12L14L15R34R6R9R41R11R47R23R25R37R31L21R37R4R15L20R37R33L13R23R38R23R42R37L17L34R21R36R21R39R14L35R3R9L33R45R37R32R18R26L27R39R50R37R34L41R48L43L37L23L42L8L2R25R16L6R11L2L5L41L25L6L41L46L1R25L31R26L25L26R18L46R1R14R15R29R29R34R19R28L50R35R10R10L41L4R15R36L7L36L7R36L40R16L33L16L23R45R32R43L10L42R11L7R18L17R14R25L47L38R46L28R21L43R29R44L20R45L29R3L1L38R32R42L15L46L22R22L26R42R12R38R3L5R4R17L1L34R33R9L39R32R22R19R43L50L32R15R21L14L35L7L31R9R28R50R25R13L22L32R46L37L16L39L19L31R17R47R29R21L24L49L9R48L13R26L43L35L5L4R45L38R29R1L40L5R50R1L49R46L40L30R41R4L11R40R35L14L15R21R17L22L18R37R49R3L21R22L36L14R43R9L24L39R11L39L6L49R46R39L15L37L44R25R48R46L38R7L12R18R12R14R44R37R23R42R37L50L9L27R36L18R14R3L5R38R44L35R36L12L41L15R6L39L40R5L2R18R36R38L26R38L22R21R5R1L11L29R2L34L41L29R32R25L37R3L34L18L14L33L17R48L47L12R26R35L22L16R20R24R22R38R18R13R37R31R22R42R37R34R45R21L27L14L29L16R15L1L9R49L14R40R33R3L30L32L32R16L22R44L43R22R39L9L50L16R9R18L12R27R10R10R27L27R40R10L46R32L44L9L48R28R29R23L45L26L37L38L29R27R35R19L46R44R13R2L27R46R48L42R27R43R27R23R20R23L40L36R29R2L22R15R14R33L45R14R32R1R43L20R20L15L44L22L4L24R22L23R29R34L28L15R48L28L26L26R16L40L11L27R29L27R28L5L6R30L8R35R44L29L48L11L29R2L21R10R29L45L31L16L12R16R14R25R49R17L41R31R2R45L11R10R41R34R12R39R9R6R9L29R19R43R3R28L29L9R27R3R9L40R36R47L9L11L44L31R16L50R32L7L49R26R33R48L49L34R43R1L14L1R19R4L15R11R34L13R36L2R32L33R19L16L22R6R9L23R25L9L35L46R15L26L7R40L35R45L49L47R27R3R39R17R46L47R46L23L36R50L16R45R1L4R39R32L33R18L35R41R44L20R39L37L14L33L23L23R22L13L14R43R31R2L24L26R49L38R38L25L28L29R50L16L31L20R38R42L7R20L42L12R39L35L16L11L22L28L7L16L50L3L42L38R23R37R30R48L16R36R49R27R19R39R14L35L12R14R14R1R19L50R28R26L33L28R35L25R24R48R27L44L34L46R49L6R24R19L7L39R6L28L43L14L40R10L27R12R45L4L7R35L38R45L50L8L33L22R28R27R30R30R3L23R28R9L39L7L21L40L18R43R50R31R33L26L34R25L1L43L21L50R14L20R2R4L13L24R38L10L43R34L30R21L20R12R12R16R23L21L46R39R32R7R20R19R37L48L12L40R14L33R17L32R24L28L45R17L13R6L9R28L46L35R49R9L4L43L38L22R15L48L11R38L24R5R2R49R43R12L18R21R36L24R3L30R10L30R47R48R46R31L9L45R1L48R21R14R5R2L46L10L27L22R15R34R42L26R43R17L36R13R14R44L24L34L9L29L38R16L40R39R29L15R42L18L3R40L30R40L2L29R38L43R32R34L3L4R32L28L49L4R42R37L16L46R27L15R5R28L36R24L27R22L37L23R21R1R24L13R3L43R8L30R16R36L46L21L46L27L30L2R4L8R34R1R2L9R8R18L50L13L26L37L18L43L42R39R33R27R24L49R24L9L50L45L32R33R10L12R28R15R14L44L45L20R41L5R30L33R15L22L41R46R20L36R23R2L29L45L26R44R25R21R6R45R3L41L49L48L43R43R49R6R17L48R7R21L36L49L15R43R36L28R40L9R23L19L10R4R14L20L7L21L46R12R28R32L39R4R19L25R7L34R38R22L7L5L22R44R20R10R24L45R45L11L48L23L8L34R27L17R27L47L2L9L49R1R32R40L39R1R18R50L29L19R32R38L26L17R36R40R31L29L29R44L25R37R3R13L43L18R33R5R9R31L23L17R1R10R37R12L21L6R47R38R44R3L11R13L41L24R39L14L7R21L25R39R45R44L34L1L41R7L44L8L19R30R7L7R44L9L8L46L19R31R44L19R41L21R4L34L12L44R4R20R19R34L7L8L9R34R34R4L12R2R41L50R11L6R14R40R35L43L47L7R40R29L11L45R32R10R1R25L14R19L38L20L7L29R19L30R3R23L34R40L34R2R40L46R8R27R32R45R39L13L37L40R22L50R49R10L22R3L27L11L34R35L4R1R38R20L2L48R21L15R5R11L37L44L26L30L7R39R50L43L41L22R7L47R7L18R9R30R50L22R37R8R17R45R41R16R23L28L13L7R41L24L7L30R47L15L49L44R33R48L47R38L21L37R2R29L32L13L6R30R42R42L12R8R36R6R13R22R42L44R6R4R19L22R15L27L41L13L26R35L11L15L31R17L34R6R20R41R24L22R40R7L20L20R28L43L15R35R5L41R40L8L25L43R45R39L41R5L17R32R19L21R1R15L8L20R13R46L12R6L16R49L39R43L31R24R29R48L23L19L44R32L25L2L6R11L11L31R39R20R30L7R16L17R42L4L44L8L26L39L41L45L16R37R6L35R33L42L16R50R21L43R22R25L43R46L45L12R40L13L3L9R32R15R21R20L12L4L7L13L48L39L9R19R48R3L31R39R49L35R2R5L33R26R43L11R49R20L30R12L31R43R36R49L30L47R18L9L48R47L11R29L1R45R37L29L50R39L16R27L26L19L21R9R20R28R20R8R2R39R31L2R14L36L39L10R8R40L40R14R32L33L23L38L46R34L19R35R36L20R16L49L17R48R12R15R21L6L45L26L19R43R5R20R19L21L44R31R6R16R49R34L34R49R41R25R47R11L29R34R20L29L35L20L11R15L50L17R2
diff --git a/22/input_plan.txt b/22/input_plan.txt
new file mode 100644
index 0000000..cc7f512
--- /dev/null
+++ b/22/input_plan.txt
@@ -0,0 +1,207 @@
+
+ 1 2
+ .........#.....#...#.......................#....#...............#.....#...#...............#.........
+ ....#........##.......#...#........#....#...#......#....#..#...........#..#..........#........#.....
+ ..............#..............#......#.................#.....#...................#...................
+ ##..................................#...##.#.....#....##......#.......#..........................#..
+ ..#...###..........................#..........................................#.....................
+ ............##................#.................#.#........#..........#...........#.........#...#...
+ ..#..##.#...#....#................#.............##................#........#..#.............#.#.....
+ ................................#...##......#....#....#..#....#...................................#.
+ ...#.#........#.............#...##...#..#.............#.................#..#........................
+ .....#......#.........................#.......#........#......#.................#...........#.......
+ ..........................#........#....................#...#..........#.........#...#..............
+ ............#..###..#..#.......#..............#...#..........#.....................#.......#.....#..
+ ................#......#.......#........#............#.......#..#..#....#......................#.#.#
+ .................#..................#...#............#......#...........#.............#.........#...
+ ..#.#...#............#......#.....#..#.#..#.......#....#..........#.................................
+ ........#..................#......#......#.........#.....................#....................#.....
+ ....................#...............#...##...#.......#..#..............#.#.....#.......#...#....#...
+ ..........#.#.#.......................#............#........#.......................................
+ ............#...#..#.........#.......#..#..........#.............#...#..................#...........
+ ...#..........................................................#..#.#...........................#.#..
+ #............#.......#.........................#..#....#.#..#.......#.....#...#....#...........#....
+ .............#..#....................#...............#..........#...#..#..................#.#..#.#..
+ ....#....#........#........#...............#..................#........................#.......###..
+ ....#......#.#.........................................................#.....##..............#.....#
+ 3 ....................#....#.#.....#.#....#..#.#.............#........#..#.........#...#....#......... 4
+ ###.#..#...#..............#..........................#.......#.#........................#.......##.#
+ ......#..................#............#................#...#.........#...........#....#.............
+ .#...#.....#......................................#...................#...........................#.
+ ........#....#....#.................#.......#......#....#..#.#............#.....#...##.......#..#...
+ ....#....#...........#...#...#.....#...........#..........#......................#......#.#.........
+ ........................#.......##............................#....................................#
+ .....##...............#........#......#...................................#....#....................
+ .....#....#....#.......#..#..#.#.#..#.##..#...............#..................#.#.#..................
+ .....#..........#....##.......#..#............#..............#.#.......#.............#..............
+ .........#..........#..#........#..........#.......................#.........#.#....#....#..........
+ ...#.....#..............................#.........##.....##..#...............#.....................#
+ ............#......#.......##.......#.#.............#..............#...#..........................#.
+ ..#......#.#...#..#...#.......#.......#.............#......#.................................#......
+ ..............#.....#.......#.....#........................#..........#.................#.........#.
+ ................#.................................#........#......................#........#....#...
+ .#..#...#..##..#...................#..................#......#..............#.......#..........#....
+ ........#........................##...#...............#............#................................
+ ..##..............#......................#..........#.##......#.......................#.............
+ #............................#........#.........#.#...#.........#.#.......#.........#...............
+ ........##.........#........#..#........#.#...#...............#..#.....#.........#.............#....
+ .....#..#..##.............#................#....##.....................#..........#.................
+ #...#.............#......##...#...................#....................................#.....#......
+ .#...#.........#........#....##......#.....##......#..#....#.#....#....#......##....#......#.....#..
+ ...............................##.............#............#.......#........#.......................
+ ............###......................#.....#........##.......#......................................
+ ...#..#......#...................#............#... 6
+ ...##.........###......#.............#............
+ .....#..........................................#.
+ .........##....#.................##.#.............
+ #....#...................#...............#........
+ ..........#.........#...........................#.
+ .#............#......................#....#.......
+ ......#.........#.....#...##.....##......#........
+ .....##......#..#...........................#.....
+ .....#.#............#......#...#...#....#.........
+ ......#.#.............#......................#....
+ ........#.....................#......#.........#..
+ ....#........................#....#.....##..#.....
+ ..................##.........#.##..#..............
+ ................#......#.............#......#....#
+ 5 .....#......#.......#...............#.#........... 7
+ ..#....#...#....#.....#.....#..............#...#..
+ .......#.......#...............#.........#.......#
+ .....#................#...........#.....#........#
+ ..........#.#...........##.......#.......#........
+ ...................#........................#....#
+ ..........#.##..#..#.....#.##.#..................#
+ ........................#.#...........#...........
+ ....#...........#....#.....#.#...#.#.#.....###....
+ .#..........................##...#.............#.#
+ #...............#.....##............#....#......#.
+ ....#..#.#.#..#.........#....#....................
+ ....#.....#.#...........#..............#.#.....#..
+ ..............#.......#.........#....#.........##.
+ ...............................................#..
+ ...................#.....#...............#........
+ ........#....................#.....#.#.#.#........
+ ....#...#.#..................................#...#
+ .........#............#....#...............#......
+ ..#........#.......#.#.##....#............##......
+ .#...#...##.....#..............#............#...##
+ #....#...............#...#.#........#........#....
+ ..........#...................#.....#.............
+ ............#.............#.#.#...................
+ ......................#.##............#....#......
+ ...............#........................#.#.......
+ ..........#..#...#...####.#.....#.................
+ ...##..#....##.#...#.......#...#..##.......#......
+ ....#............#..................#.............
+ ...............##....#.......#..#.........#......#
+ .#.....#..#.#.....#..#........##...#.#...#........
+ ......#....#.............................#..#..#..
+ ..........#..#.........#..#....#.#...........#....
+ ..........#.........................#.....#...#...
+ 9 .......#...#........................#.............
+ ........#.........#.....#........#....................................#......#............#..#.....#
+ .........#........#....#...................#......#..........#.................#...#..........#..##.
+ ......#.......................##............#...........#....#.................#.....#..............
+ ....#....#....#.................#.##..................#.....#............#.....#...#....#...........
+ #..#.........#......#....#............#..........................#.........#..............#.#...#...
+ ........#....#..#.........#.#.......#.........#.....................#...........#......#.#........#.
+ ..#.............#.........................#.....#...#.................#...#......#........#......#..
+ .........#....#..............#.#......................#..#............................#.............
+ ...#............................#.....#.....#..............#..............................#........#
+ ....#..............#.#.........#............#.......#...#.........#....#.............#.....#.#......
+ .............#.........#................#............................#................#.............
+ .....#...................................#.....#.................#........#......................#.#
+ .............#...#..........#..#.........................#..#..............#..#.....#.#.........#..#
+ ....#........#.........#...#....#.#.........#..#..##........#....#.##......#....................##..
+ ...........#...#...............#..........................#............#................#.#.........
+ #...#.....#.....#......#......#.#........................#..#...#..#.#...#.........#...........#...#
+ ..#.....#...........#...#.....................................#...#..#............................#.
+ .....#.....#...........#....#...............................##...#.#..#.#........#..................
+ 8 #...#.##.................#.......#...##.##...........#.....................##.....#.....#.#........# 10
+ ....#.......#...#.....................#..#.......................................#..................
+ ...............#....#.............#.........#....##.......................#.....#...................
+ ....#..#...........................................##.......................#.......................
+ .....#..#................#...#....#..................................................#....#.........
+ .#..........#.#.......#...##....................#................................................#..
+ #........#.#..#............................#.......#..#.#.......................#....#..........#...
+ ..............#..................##.............##...#................#.#..#........................
+ ..#........#.#..........##.....#..................#.................................................
+ ....#.................#..#....................#.........#.#.........................................
+ ...#.....#.............#....#.#.#..#...#...................................#....#...##..............
+ ........#..#...#............#..##...........#.......................................................
+ .......#............#............#........#.........#........##...#....#............................
+ .................................................................#....#.............................
+ ............#.........#...#...................##.#.....#..##......#......#.........#................
+ ......###..........................#.#...........#.#...#....#.......#...................#..##......#
+ .........#............#..............#........................#............#........#....##.#....#..
+ ....................#...........#.........#...#......#.#......................#..#..........#.......
+ .........................#.....#.............#.........#.......#.....#....#........###.............#
+ ................#.##.........#...##......#.................#.......#.....##.........................
+ ............#..#....#..........#............................#...##...#............#...........#...#.
+ .......#.............#.....................#..#......#.#............#...................#.......#.#.
+ ........#..#......................#.......#....#..#.........#................#.#....................
+ .#.................#..........#..#...#.....................#................#.....................#.
+ .#....#............#.............#.#..#...#.............###.#.......................................
+ ...#................#...#..........#....#...#.....................................#.................
+ ...............#..........................##.............#.......................................#..
+ .#.....#........##..........#..............###....#...........#....#..#.................#........#..
+ ..#...#.....#...........#.................#..##.................##.......##.....................#...
+ .#........#........#...............................................................#................
+ ..............#..............#.#......#.....#............#..#..#.......................#...#........
+ .........#.................#............................#.......#....#.........#.#..........#.....#.
+ ..#.#..#......................#....#.............. 12
+ ................#................##....#..........
+ #.#.....#.........#..............#....#..........#
+ ..............#..#................#....#.........#
+ ...........#...............................#......
+ ........................#..#...........##....##...
+ ##......#........#.....#..........................
+ ...#.......##.........#........#..##....##.#.#..#.
+ #.................................................
+ ...#...##....#.............#......................
+ ..........#........................#.....##.......
+ ......................................#..#.#.....#
+ .........#...#............#....##.................
+ 11 #....#..#...#...........#.....................#... 13
+ .....................#...................##.#.....
+ ..................#.#..................#.#........
+ ..#....................#...#..........#....#......
+ ......#...#.........................#....#........
+ ..#.....#.#.....#...........#.....................
+ ........#..#.........#..##..#........#......#.....
+ #.......#..........#..........#......#........#.#.
+ ........#......#..........................#.......
+ ..#........#................................#.....
+ .....#.....#.....#.............##......#...#.....#
+ .........#.............#......#..........##......#
+ ............#.........##.......#..................
+ .#..#.........................#......##....#......
+ #......#...#..#.............#..#..........#....#..
+ .......#....#......#.....#..#...#.#...#...#.....#.
+ .#...#......#..................#.....#............
+ .......#.......#....##...##...............#.......
+ ..#...................#................#........##
+ ..........#...................#...#.....#.........
+ ........#...#...#......................#....#.....
+ .....#..#....#...........#...#...#..#.#...........
+ .........#............#.#.#................#......
+ ...................#.......#..............#....#..
+ .#....................#.........#.......#........#
+ .#.........#.....##...............................
+ ....#..........................#.....#........#...
+ #.#...#...........................#...............
+ .............#........#..#..........##.........#..
+ ................#...............#..#.#.........#..
+ ..........#.......##..#......#.......#........#...
+ ...............#..................................
+ .......#.....#.....#.....#........................
+ ....###......#..#.........#...........#..#........
+ ..................................#...............
+ ...#...#.....#........##.......#.........#...#.#..
+ #...........#..#........#......#.#.#.#............
+ 14
+
+
+
+12R25R28R21L15R49L21R10R27R28L47L18R43L1R8L34R4R34L48L42L19R32R30R34L11L49L6R49L5R45R11L6R47L27L12R46L40R46L33L14R18R41R12L25L35L29L16R41L14R32L29L49L24L35R39L8R34L20L19L14R44R12L35R10L35L11L46R35R14R21L10R10L31L2L47L10L40R43L8L8L38L6L49L27L14L21L49L45L29L7L28L41L10L4R28R7R48L5R6L25L47R40R30R34L39R35L46L39R24L45L26R44R13L36L15R35R7R42R34L3L28R42R2R32R42R22R23R9R34R32R34L10L22R10L31L17L23L45R14R2R34R10R45L28R30L25R20R41L1L29R31R11R37R18L50L50R12L33L6R49L50R12R2L3R42R9L7L44R30L26L1R37R22R18R50R17L23L5R8R48L30R33L2R46L49L1L18R37R50L10R8L7R8R37R30R14R40L36L15L41L46R39R8L4L34R11L25R37L23R18R47L23R32L26R49R16R30R12R39L7L43R38R45L50L35R46L24L41R3R18R5L12L39R41L46R31L12L48L7R21L22R5L27R42L26R20R40R9R8R22R6R41R40L33L24L30L45L29R18R20R5L31L4L40L49R37R9L17R4R34R47L18L48L4L8R4L5L40L7R47L29R49R50R50L22R23R21L50L17L28L41L38R6R36L12L9R9R40L16L4R44L7L37R14L10R16R38R44L35R19R47R18R29L31L40L47R35L42L7L34L49R10L29L14R12R24R13L29L12R45R8R50R39R34L50L10R44L32L31L24L30R47R41R2L7R3R31R38R33R35R46L22R12R47L20L36R49R27L3R25L2L12R13L28L17L29L44L18L35L18R6R22R24L38L31R23R26L39R40R13L37L24R1R14L20L14R43R14R45R36R22R47R22L18R17L28L45R22L20L19R37R20L43L43L14L8R16R6L13R6L23R16L1L45R9R36R17L45L30R43L31L38L4L28L27R12L7R27R50R49L4L30L21R27R46L44R17L15L5L4L29R31R19L13R48L36L8L17R23R1R40L33R50R12L36L19L6L45L17L14R12R3L36L35L19R46R21L8L33L11L34L25L2R32R10R30R15R46R37R24R39R7R39R43L29R39L34R29R19R49R41L38R11L43R17L35L45R41L22R48R25R8R45R39R13R8L36R2R5R50L40L12L23R42L2R41R14R19R28L25L49R39R9R13L43L20L28L46R19R36R46R12L9R7R30R30R9R43R26R36L11L34R41L42L19R2L18R9R20R11L11L2L10L24R25R32L44R14R4R24R10R24L5R4L13R35R35R22L18L24R46L32L47L37R21R49R6R12L16L31L39L26L48L8L26R27R16L48L30R36L24L48R36L1L1R16L38R1R26L11L29R20L50R22R44R4L18R37L6L19L44R20R14R37R3L39R12L23L46L19L45R35L12L7L28R46L18R25R38R10L22R18R34L25R4L15L2L9L35L24R6R27R22R32L22L49R22L39L27L38R38R12R28L27R2R14R10R30L25R4L15L40R34R42R38R9R12L14L15R34R6R9R41R11R47R23R25R37R31L21R37R4R15L20R37R33L13R23R38R23R42R37L17L34R21R36R21R39R14L35R3R9L33R45R37R32R18R26L27R39R50R37R34L41R48L43L37L23L42L8L2R25R16L6R11L2L5L41L25L6L41L46L1R25L31R26L25L26R18L46R1R14R15R29R29R34R19R28L50R35R10R10L41L4R15R36L7L36L7R36L40R16L33L16L23R45R32R43L10L42R11L7R18L17R14R25L47L38R46L28R21L43R29R44L20R45L29R3L1L38R32R42L15L46L22R22L26R42R12R38R3L5R4R17L1L34R33R9L39R32R22R19R43L50L32R15R21L14L35L7L31R9R28R50R25R13L22L32R46L37L16L39L19L31R17R47R29R21L24L49L9R48L13R26L43L35L5L4R45L38R29R1L40L5R50R1L49R46L40L30R41R4L11R40R35L14L15R21R17L22L18R37R49R3L21R22L36L14R43R9L24L39R11L39L6L49R46R39L15L37L44R25R48R46L38R7L12R18R12R14R44R37R23R42R37L50L9L27R36L18R14R3L5R38R44L35R36L12L41L15R6L39L40R5L2R18R36R38L26R38L22R21R5R1L11L29R2L34L41L29R32R25L37R3L34L18L14L33L17R48L47L12R26R35L22L16R20R24R22R38R18R13R37R31R22R42R37R34R45R21L27L14L29L16R15L1L9R49L14R40R33R3L30L32L32R16L22R44L43R22R39L9L50L16R9R18L12R27R10R10R27L27R40R10L46R32L44L9L48R28R29R23L45L26L37L38L29R27R35R19L46R44R13R2L27R46R48L42R27R43R27R23R20R23L40L36R29R2L22R15R14R33L45R14R32R1R43L20R20L15L44L22L4L24R22L23R29R34L28L15R48L28L26L26R16L40L11L27R29L27R28L5L6R30L8R35R44L29L48L11L29R2L21R10R29L45L31L16L12R16R14R25R49R17L41R31R2R45L11R10R41R34R12R39R9R6R9L29R19R43R3R28L29L9R27R3R9L40R36R47L9L11L44L31R16L50R32L7L49R26R33R48L49L34R43R1L14L1R19R4L15R11R34L13R36L2R32L33R19L16L22R6R9L23R25L9L35L46R15L26L7R40L35R45L49L47R27R3R39R17R46L47R46L23L36R50L16R45R1L4R39R32L33R18L35R41R44L20R39L37L14L33L23L23R22L13L14R43R31R2L24L26R49L38R38L25L28L29R50L16L31L20R38R42L7R20L42L12R39L35L16L11L22L28L7L16L50L3L42L38R23R37R30R48L16R36R49R27R19R39R14L35L12R14R14R1R19L50R28R26L33L28R35L25R24R48R27L44L34L46R49L6R24R19L7L39R6L28L43L14L40R10L27R12R45L4L7R35L38R45L50L8L33L22R28R27R30R30R3L23R28R9L39L7L21L40L18R43R50R31R33L26L34R25L1L43L21L50R14L20R2R4L13L24R38L10L43R34L30R21L20R12R12R16R23L21L46R39R32R7R20R19R37L48L12L40R14L33R17L32R24L28L45R17L13R6L9R28L46L35R49R9L4L43L38L22R15L48L11R38L24R5R2R49R43R12L18R21R36L24R3L30R10L30R47R48R46R31L9L45R1L48R21R14R5R2L46L10L27L22R15R34R42L26R43R17L36R13R14R44L24L34L9L29L38R16L40R39R29L15R42L18L3R40L30R40L2L29R38L43R32R34L3L4R32L28L49L4R42R37L16L46R27L15R5R28L36R24L27R22L37L23R21R1R24L13R3L43R8L30R16R36L46L21L46L27L30L2R4L8R34R1R2L9R8R18L50L13L26L37L18L43L42R39R33R27R24L49R24L9L50L45L32R33R10L12R28R15R14L44L45L20R41L5R30L33R15L22L41R46R20L36R23R2L29L45L26R44R25R21R6R45R3L41L49L48L43R43R49R6R17L48R7R21L36L49L15R43R36L28R40L9R23L19L10R4R14L20L7L21L46R12R28R32L39R4R19L25R7L34R38R22L7L5L22R44R20R10R24L45R45L11L48L23L8L34R27L17R27L47L2L9L49R1R32R40L39R1R18R50L29L19R32R38L26L17R36R40R31L29L29R44L25R37R3R13L43L18R33R5R9R31L23L17R1R10R37R12L21L6R47R38R44R3L11R13L41L24R39L14L7R21L25R39R45R44L34L1L41R7L44L8L19R30R7L7R44L9L8L46L19R31R44L19R41L21R4L34L12L44R4R20R19R34L7L8L9R34R34R4L12R2R41L50R11L6R14R40R35L43L47L7R40R29L11L45R32R10R1R25L14R19L38L20L7L29R19L30R3R23L34R40L34R2R40L46R8R27R32R45R39L13L37L40R22L50R49R10L22R3L27L11L34R35L4R1R38R20L2L48R21L15R5R11L37L44L26L30L7R39R50L43L41L22R7L47R7L18R9R30R50L22R37R8R17R45R41R16R23L28L13L7R41L24L7L30R47L15L49L44R33R48L47R38L21L37R2R29L32L13L6R30R42R42L12R8R36R6R13R22R42L44R6R4R19L22R15L27L41L13L26R35L11L15L31R17L34R6R20R41R24L22R40R7L20L20R28L43L15R35R5L41R40L8L25L43R45R39L41R5L17R32R19L21R1R15L8L20R13R46L12R6L16R49L39R43L31R24R29R48L23L19L44R32L25L2L6R11L11L31R39R20R30L7R16L17R42L4L44L8L26L39L41L45L16R37R6L35R33L42L16R50R21L43R22R25L43R46L45L12R40L13L3L9R32R15R21R20L12L4L7L13L48L39L9R19R48R3L31R39R49L35R2R5L33R26R43L11R49R20L30R12L31R43R36R49L30L47R18L9L48R47L11R29L1R45R37L29L50R39L16R27L26L19L21R9R20R28R20R8R2R39R31L2R14L36L39L10R8R40L40R14R32L33L23L38L46R34L19R35R36L20R16L49L17R48R12R15R21L6L45L26L19R43R5R20R19L21L44R31R6R16R49R34L34R49R41R25R47R11L29R34R20L29L35L20L11R15L50L17R2
diff --git a/22/output.txt b/22/output.txt
new file mode 100644
index 0000000..98efdf9
--- /dev/null
+++ b/22/output.txt
@@ -0,0 +1,15014 @@
+{
+ 91,86 : true
+ 42,150 : true
+ 61,86 : true
+ 98,80 : true
+ 81,86 : true
+ 71,86 : true
+ 47,70 : true
+ 58,80 : true
+ 67,70 : true
+ 57,70 : true
+ 28,80 : true
+ 18,80 : true
+ 48,80 : false
+ 17,70 : true
+ 104,33 : false
+ 46,104 : true
+ 77,70 : true
+ 26,104 : false
+ 16,104 : true
+ 16,110 : true
+ 106,95 : true
+ 36,110 : true
+ 46,110 : true
+ 32,150 : true
+ 22,150 : true
+ 12,150 : true
+ 151,1 : true
+ 94,86 : true
+ 97,80 : true
+ 84,86 : true
+ 54,86 : true
+ 64,86 : false
+ 34,86 : true
+ 48,70 : true
+ 58,70 : true
+ 68,70 : true
+ 17,80 : true
+ 27,80 : true
+ 37,80 : true
+ 47,80 : true
+ 134,33 : true
+ 100,67 : true
+ 78,70 : true
+ 88,70 : true
+ 98,70 : true
+ 25,110 : false
+ 15,110 : true
+ 45,110 : true
+ 35,110 : true
+ 21,150 : true
+ 31,150 : false
+ 110,12 : true
+ 11,150 : true
+ 97,86 : true
+ 87,86 : true
+ 89,83 : true
+ 99,83 : true
+ 125,24 : true
+ 117,48 : true
+ 98,92 : true
+ 39,70 : true
+ 72,94 : true
+ 62,94 : true
+ 58,92 : false
+ 48,92 : true
+ 32,94 : true
+ 37,86 : true
+ 27,86 : true
+ 103,37 : true
+ 99,70 : true
+ 89,70 : true
+ 24,104 : true
+ 14,104 : false
+ 44,104 : true
+ 34,104 : true
+ 38,83 : true
+ 48,110 : false
+ 18,110 : true
+ 28,110 : true
+ 78,83 : true
+ 68,83 : true
+ 58,83 : true
+ 48,83 : true
+ 92,86 : true
+ 101,51 : true
+ 52,86 : true
+ 62,86 : true
+ 93,94 : false
+ 82,86 : false
+ 12,86 : true
+ 59,80 : true
+ 32,86 : true
+ 42,86 : true
+ 39,92 : true
+ 49,92 : true
+ 13,94 : true
+ 29,92 : true
+ 127,73 : true
+ 114,33 : false
+ 35,104 : true
+ 19,80 : false
+ 15,104 : true
+ 25,104 : true
+ 47,110 : true
+ 37,110 : true
+ 27,110 : false
+ 19,83 : true
+ 69,83 : true
+ 79,83 : false
+ 49,83 : false
+ 59,83 : true
+ 75,86 : true
+ 65,86 : true
+ 95,86 : true
+ 85,86 : true
+ 33,70 : true
+ 23,70 : true
+ 53,70 : true
+ 43,70 : true
+ 15,86 : true
+ 35,86 : true
+ 25,86 : false
+ 55,86 : true
+ 45,86 : true
+ 125,13 : true
+ 101,35 : true
+ 18,73 : true
+ 28,73 : true
+ 129,64 : true
+ 176,16 : true
+ 78,73 : true
+ 88,73 : true
+ 98,73 : true
+ 83,70 : true
+ 38,73 : false
+ 48,73 : true
+ 58,73 : false
+ 68,73 : true
+ 88,86 : true
+ 98,86 : true
+ 68,86 : true
+ 78,86 : true
+ 24,70 : true
+ 34,70 : true
+ 44,70 : true
+ 54,70 : true
+ 18,86 : true
+ 130,19 : true
+ 48,86 : true
+ 58,86 : true
+ 28,86 : true
+ 38,86 : true
+ 113,37 : true
+ 27,73 : true
+ 17,73 : true
+ 13,104 : false
+ 8,128 : true
+ 5,128 : true
+ 43,104 : true
+ 64,70 : false
+ 74,70 : true
+ 1,128 : true
+ 94,70 : true
+ 47,73 : true
+ 37,73 : true
+ 67,73 : false
+ 57,73 : true
+ 126,29 : true
+ 101,70 : true
+ 40,150 : true
+ 30,150 : true
+ 96,80 : true
+ 65,70 : true
+ 76,80 : true
+ 66,80 : true
+ 56,80 : true
+ 46,80 : true
+ 15,70 : true
+ 26,80 : true
+ 16,80 : true
+ 38,104 : true
+ 28,104 : true
+ 105,13 : true
+ 48,104 : true
+ 196,16 : true
+ 95,70 : true
+ 85,70 : false
+ 75,70 : true
+ 120,75 : true
+ 20,150 : true
+ 10,150 : true
+ 190,44 : true
+ 18,104 : true
+ 66,86 : true
+ 76,86 : true
+ 86,86 : true
+ 96,86 : false
+ 95,80 : false
+ 101,9 : false
+ 56,70 : true
+ 66,70 : true
+ 55,80 : true
+ 65,80 : true
+ 35,80 : true
+ 26,70 : true
+ 15,80 : true
+ 56,86 : true
+ 49,104 : true
+ 29,104 : true
+ 39,104 : true
+ 96,70 : true
+ 29,73 : true
+ 76,70 : true
+ 86,70 : true
+ 79,73 : false
+ 69,73 : false
+ 59,73 : true
+ 49,73 : true
+ 180,44 : true
+ 19,104 : true
+ 99,73 : true
+ 89,73 : true
+ 101,52 : true
+ 39,86 : true
+ 101,20 : true
+ 59,86 : true
+ 146,29 : false
+ 29,86 : true
+ 19,86 : true
+ 144,87 : true
+ 89,86 : true
+ 79,86 : true
+ 119,8 : false
+ 99,86 : true
+ 24,73 : true
+ 34,73 : false
+ 44,73 : true
+ 54,73 : true
+ 64,73 : true
+ 74,73 : true
+ 84,73 : false
+ 94,73 : true
+ 158,28 : true
+ 163,4 : true
+ 14,73 : true
+ 10,70 : true
+ 20,70 : true
+ 30,70 : true
+ 8,76 : true
+ 136,29 : true
+ 119,71 : true
+ 108,87 : false
+ 112,56 : true
+ 33,73 : true
+ 19,111 : true
+ 53,73 : true
+ 43,73 : true
+ 73,73 : true
+ 63,73 : true
+ 93,73 : true
+ 83,73 : true
+ 90,70 : true
+ 148,28 : true
+ 173,4 : true
+ 50,70 : true
+ 60,70 : true
+ 70,70 : true
+ 80,70 : true
+ 11,70 : true
+ 137,100 : false
+ 171,9 : false
+ 51,70 : true
+ 41,70 : true
+ 31,70 : true
+ 21,70 : true
+ 129,71 : true
+ 142,56 : true
+ 139,8 : true
+ 162,45 : true
+ 101,21 : true
+ 26,73 : true
+ 139,82 : true
+ 96,73 : true
+ 81,70 : false
+ 71,70 : false
+ 12,117 : true
+ 56,73 : true
+ 66,73 : true
+ 42,117 : true
+ 46,73 : true
+ 141,9 : false
+ 12,70 : true
+ 42,70 : true
+ 52,70 : true
+ 22,70 : true
+ 32,70 : true
+ 132,56 : true
+ 152,45 : true
+ 128,87 : true
+ 25,73 : true
+ 15,73 : true
+ 137,83 : true
+ 166,16 : true
+ 82,70 : true
+ 95,73 : true
+ 62,70 : true
+ 75,73 : true
+ 65,73 : true
+ 55,73 : true
+ 45,73 : true
+ 43,117 : true
+ 117,100 : true
+ 151,9 : true
+ 114,65 : true
+ 121,1 : true
+ 114,58 : true
+ 140,25 : true
+ 90,73 : false
+ 118,87 : true
+ 107,83 : true
+ 50,73 : true
+ 60,73 : true
+ 70,73 : true
+ 80,73 : true
+ 10,73 : true
+ 20,73 : true
+ 30,73 : true
+ 40,73 : true
+ 123,4 : true
+ 118,28 : true
+ 139,85 : true
+ 124,65 : true
+ 114,59 : true
+ 121,44 : true
+ 151,42 : true
+ 111,1 : true
+ 143,84 : true
+ 130,25 : true
+ 35,111 : true
+ 106,16 : true
+ 15,111 : true
+ 25,111 : true
+ 133,4 : true
+ 108,28 : true
+ 148,83 : true
+ 101,42 : true
+ 124,59 : true
+ 101,1 : true
+ 120,25 : true
+ 138,87 : true
+ 102,56 : true
+ 46,111 : true
+ 52,73 : true
+ 22,73 : true
+ 32,73 : false
+ 82,73 : true
+ 92,73 : false
+ 62,73 : true
+ 72,73 : true
+ 3,76 : true
+ 2,76 : true
+ 1,76 : true
+ 7,76 : true
+ 12,73 : true
+ 5,76 : true
+ 4,76 : true
+ 2,126 : true
+ 104,65 : true
+ 4,126 : true
+ 5,126 : true
+ 6,126 : true
+ 7,126 : false
+ 104,58 : true
+ 101,44 : true
+ 110,25 : true
+ 181,9 : true
+ 1,126 : true
+ 51,73 : true
+ 41,73 : true
+ 31,73 : true
+ 47,111 : true
+ 91,73 : true
+ 81,73 : true
+ 71,73 : true
+ 61,73 : false
+ 193,4 : true
+ 11,73 : true
+ 129,85 : false
+ 109,61 : true
+ 119,6 : true
+ 48,111 : true
+ 38,111 : true
+ 28,111 : true
+ 102,34 : true
+ 114,60 : true
+ 118,76 : true
+ 104,4 : true
+ 119,61 : true
+ 170,42 : true
+ 121,12 : true
+ 104,60 : true
+ 151,21 : true
+ 114,4 : true
+ 11,111 : false
+ 21,111 : false
+ 31,111 : true
+ 41,111 : true
+ 62,85 : true
+ 52,85 : true
+ 42,85 : false
+ 32,85 : true
+ 22,85 : true
+ 12,85 : true
+ 92,85 : true
+ 82,85 : true
+ 72,85 : true
+ 134,60 : true
+ 138,76 : true
+ 143,19 : true
+ 12,111 : true
+ 32,111 : true
+ 22,111 : true
+ 181,21 : false
+ 42,111 : true
+ 110,19 : true
+ 1,51 : true
+ 2,51 : true
+ 173,3 : false
+ 114,28 : false
+ 7,51 : true
+ 8,51 : true
+ 9,51 : true
+ 3,51 : true
+ 4,51 : false
+ 5,51 : true
+ 6,51 : true
+ 113,19 : true
+ 112,34 : true
+ 124,60 : true
+ 108,76 : true
+ 13,111 : true
+ 131,21 : false
+ 144,93 : true
+ 43,111 : true
+ 23,111 : true
+ 33,111 : true
+ 40,85 : true
+ 30,85 : true
+ 60,85 : true
+ 50,85 : true
+ 109,41 : true
+ 20,85 : true
+ 10,85 : true
+ 159,6 : true
+ 131,51 : true
+ 80,85 : true
+ 70,85 : true
+ 90,85 : true
+ 198,28 : true
+ 104,87 : true
+ 102,78 : true
+ 163,19 : true
+ 103,81 : true
+ 102,89 : true
+ 14,111 : false
+ 8,122 : true
+ 9,122 : true
+ 116,82 : true
+ 3,122 : true
+ 44,111 : true
+ 34,111 : true
+ 24,111 : true
+ 51,85 : true
+ 61,85 : true
+ 31,85 : true
+ 41,85 : true
+ 11,85 : true
+ 21,85 : true
+ 153,3 : false
+ 136,73 : true
+ 91,85 : true
+ 71,85 : true
+ 81,85 : true
+ 149,85 : true
+ 114,87 : true
+ 128,76 : true
+ 113,81 : true
+ 133,19 : true
+ 104,59 : true
+ 191,21 : true
+ 36,85 : true
+ 26,85 : true
+ 16,85 : false
+ 76,85 : true
+ 66,85 : true
+ 56,85 : true
+ 46,85 : true
+ 179,6 : true
+ 96,85 : true
+ 86,85 : true
+ 105,53 : true
+ 121,52 : true
+ 162,34 : true
+ 178,28 : true
+ 123,81 : true
+ 141,58 : true
+ 136,82 : false
+ 139,61 : false
+ 127,48 : true
+ 141,51 : false
+ 149,6 : true
+ 111,52 : true
+ 112,78 : true
+ 153,19 : false
+ 101,12 : true
+ 108,100 : true
+ 106,82 : true
+ 171,21 : true
+ 14,85 : true
+ 195,28 : true
+ 34,85 : true
+ 24,85 : true
+ 54,85 : false
+ 44,85 : true
+ 74,85 : true
+ 64,85 : true
+ 94,85 : true
+ 84,85 : true
+ 160,19 : true
+ 10,91 : true
+ 20,91 : true
+ 30,91 : true
+ 40,91 : true
+ 50,111 : true
+ 40,111 : true
+ 30,111 : true
+ 20,111 : true
+ 10,111 : true
+ 145,91 : true
+ 121,58 : true
+ 191,12 : true
+ 25,85 : true
+ 35,85 : true
+ 187,48 : false
+ 15,85 : false
+ 65,85 : true
+ 75,85 : true
+ 45,85 : true
+ 55,85 : true
+ 135,53 : true
+ 169,6 : true
+ 85,85 : true
+ 95,85 : true
+ 170,19 : true
+ 27,104 : true
+ 37,104 : true
+ 47,104 : true
+ 155,13 : true
+ 118,79 : true
+ 17,104 : false
+ 197,48 : true
+ 173,37 : true
+ 91,91 : false
+ 141,70 : true
+ 61,91 : true
+ 51,91 : true
+ 81,91 : true
+ 71,91 : true
+ 32,91 : true
+ 42,91 : true
+ 12,91 : true
+ 22,91 : true
+ 145,13 : true
+ 122,34 : true
+ 108,79 : true
+ 167,48 : true
+ 13,85 : true
+ 23,85 : true
+ 100,78 : true
+ 43,85 : true
+ 53,85 : true
+ 63,85 : false
+ 73,85 : true
+ 83,85 : true
+ 93,85 : false
+ 50,91 : true
+ 60,91 : false
+ 70,91 : true
+ 80,91 : true
+ 21,91 : true
+ 11,91 : true
+ 41,91 : true
+ 31,91 : true
+ 131,58 : true
+ 177,48 : true
+ 193,37 : true
+ 186,29 : true
+ 115,91 : false
+ 133,67 : false
+ 93,91 : true
+ 83,91 : true
+ 73,91 : true
+ 63,91 : false
+ 53,91 : true
+ 110,99 : true
+ 186,20 : true
+ 32,104 : true
+ 22,104 : false
+ 12,104 : true
+ 42,104 : true
+ 123,52 : true
+ 98,83 : true
+ 88,83 : true
+ 176,29 : true
+ 105,91 : false
+ 123,67 : true
+ 92,91 : true
+ 72,91 : true
+ 82,91 : true
+ 52,91 : true
+ 62,91 : true
+ 43,91 : true
+ 33,91 : true
+ 100,99 : true
+ 13,91 : false
+ 161,12 : true
+ 132,34 : true
+ 195,13 : true
+ 175,28 : true
+ 124,96 : true
+ 113,67 : true
+ 114,84 : true
+ 166,20 : true
+ 10,104 : true
+ 30,104 : true
+ 20,104 : true
+ 50,104 : false
+ 40,104 : true
+ 103,52 : true
+ 171,12 : true
+ 140,78 : true
+ 185,28 : true
+ 125,91 : true
+ 196,29 : true
+ 103,67 : true
+ 104,84 : false
+ 189,8 : true
+ 120,99 : true
+ 176,20 : true
+ 107,57 : true
+ 21,104 : true
+ 31,104 : true
+ 11,104 : true
+ 138,79 : true
+ 41,104 : true
+ 181,12 : true
+ 133,52 : true
+ 119,95 : true
+ 113,62 : true
+ 37,91 : true
+ 27,91 : true
+ 17,91 : false
+ 77,91 : true
+ 67,91 : true
+ 57,91 : true
+ 47,91 : true
+ 11,119 : true
+ 21,119 : false
+ 97,91 : true
+ 87,91 : true
+ 10,57 : true
+ 22,76 : true
+ 30,57 : true
+ 40,57 : true
+ 50,57 : true
+ 60,57 : true
+ 70,57 : true
+ 80,57 : true
+ 72,76 : false
+ 92,76 : true
+ 42,76 : true
+ 32,76 : true
+ 62,76 : true
+ 52,76 : true
+ 129,95 : true
+ 134,5 : true
+ 103,62 : false
+ 28,91 : true
+ 78,91 : true
+ 88,91 : true
+ 98,91 : true
+ 38,91 : true
+ 102,13 : true
+ 58,91 : true
+ 68,91 : true
+ 13,76 : true
+ 23,76 : true
+ 145,99 : true
+ 53,90 : true
+ 43,90 : true
+ 73,76 : true
+ 83,76 : true
+ 93,90 : true
+ 83,90 : true
+ 73,90 : true
+ 63,90 : true
+ 29,91 : true
+ 19,91 : false
+ 89,91 : true
+ 79,91 : true
+ 99,91 : true
+ 49,91 : true
+ 39,91 : true
+ 69,91 : false
+ 59,91 : true
+ 22,57 : true
+ 32,57 : false
+ 12,57 : true
+ 62,57 : true
+ 72,57 : true
+ 90,90 : true
+ 52,57 : true
+ 70,90 : true
+ 68,76 : true
+ 50,90 : true
+ 48,76 : true
+ 30,90 : true
+ 40,90 : true
+ 98,76 : true
+ 88,76 : true
+ 113,42 : true
+ 181,17 : true
+ 164,33 : true
+ 136,51 : true
+ 120,1 : true
+ 143,67 : true
+ 146,79 : true
+ 122,13 : true
+ 31,57 : true
+ 21,57 : true
+ 11,76 : true
+ 21,76 : true
+ 71,57 : true
+ 61,57 : false
+ 51,57 : false
+ 41,57 : true
+ 71,76 : true
+ 81,76 : false
+ 91,57 : true
+ 81,57 : true
+ 31,76 : true
+ 100,55 : true
+ 51,76 : true
+ 61,76 : true
+ 140,23 : true
+ 112,39 : true
+ 103,42 : true
+ 174,33 : false
+ 11,90 : true
+ 126,51 : true
+ 123,29 : true
+ 130,9 : false
+ 112,13 : true
+ 149,49 : true
+ 148,71 : true
+ 16,76 : true
+ 36,76 : true
+ 26,76 : true
+ 56,76 : true
+ 46,76 : true
+ 76,76 : true
+ 66,76 : true
+ 96,76 : true
+ 86,76 : true
+ 82,90 : false
+ 92,90 : true
+ 130,23 : true
+ 102,39 : true
+ 143,62 : true
+ 12,90 : true
+ 113,29 : false
+ 178,10 : true
+ 128,82 : true
+ 97,90 : true
+ 87,90 : true
+ 77,90 : true
+ 67,90 : true
+ 57,90 : true
+ 47,90 : true
+ 37,90 : true
+ 67,76 : true
+ 77,76 : true
+ 47,76 : false
+ 57,76 : true
+ 189,16 : true
+ 87,76 : false
+ 97,76 : true
+ 13,90 : true
+ 133,62 : true
+ 103,29 : true
+ 132,13 : true
+ 138,82 : true
+ 110,9 : true
+ 181,3 : true
+ 48,119 : true
+ 38,119 : true
+ 28,119 : true
+ 18,119 : true
+ 44,90 : true
+ 54,90 : true
+ 24,90 : true
+ 34,90 : true
+ 84,90 : true
+ 94,90 : true
+ 64,90 : true
+ 74,90 : true
+ 109,95 : true
+ 14,90 : true
+ 123,62 : true
+ 162,13 : true
+ 120,9 : true
+ 133,81 : true
+ 148,82 : true
+ 140,55 : true
+ 132,81 : true
+ 15,76 : true
+ 25,76 : false
+ 35,76 : true
+ 45,76 : true
+ 55,76 : false
+ 65,76 : true
+ 75,76 : true
+ 85,76 : true
+ 95,76 : true
+ 91,90 : true
+ 81,90 : true
+ 141,54 : true
+ 152,39 : true
+ 125,87 : true
+ 144,5 : true
+ 200,23 : true
+ 142,45 : true
+ 25,90 : true
+ 102,70 : true
+ 143,81 : true
+ 184,19 : true
+ 169,16 : true
+ 76,90 : true
+ 86,90 : true
+ 96,90 : true
+ 26,119 : true
+ 46,90 : true
+ 56,90 : true
+ 66,90 : true
+ 143,42 : true
+ 140,35 : true
+ 149,68 : true
+ 142,39 : true
+ 135,87 : true
+ 112,70 : true
+ 132,45 : true
+ 16,90 : true
+ 26,90 : true
+ 139,16 : false
+ 153,29 : true
+ 127,58 : true
+ 39,119 : true
+ 49,119 : true
+ 19,119 : true
+ 29,119 : true
+ 133,42 : true
+ 130,35 : true
+ 139,68 : true
+ 110,44 : true
+ 124,4 : true
+ 172,13 : true
+ 120,23 : true
+ 139,59 : true
+ 164,5 : true
+ 27,90 : true
+ 17,90 : true
+ 109,16 : true
+ 103,25 : true
+ 143,29 : true
+ 142,93 : true
+ 98,90 : true
+ 44,119 : true
+ 78,90 : false
+ 88,90 : true
+ 58,90 : true
+ 68,90 : true
+ 38,90 : true
+ 48,90 : true
+ 123,42 : true
+ 160,35 : true
+ 14,119 : true
+ 99,76 : true
+ 122,39 : true
+ 110,23 : true
+ 59,76 : true
+ 69,76 : true
+ 79,76 : true
+ 89,76 : true
+ 18,90 : true
+ 28,90 : true
+ 39,76 : true
+ 49,76 : true
+ 135,52 : true
+ 159,16 : true
+ 133,29 : true
+ 85,90 : true
+ 75,90 : true
+ 95,90 : true
+ 45,90 : true
+ 35,90 : true
+ 65,90 : true
+ 55,90 : true
+ 150,35 : true
+ 192,13 : true
+ 98,85 : true
+ 104,5 : false
+ 101,54 : true
+ 68,85 : true
+ 58,85 : false
+ 88,85 : true
+ 78,85 : true
+ 28,85 : true
+ 18,85 : true
+ 48,85 : true
+ 38,85 : true
+ 19,90 : true
+ 171,17 : true
+ 39,90 : true
+ 102,45 : true
+ 32,119 : true
+ 22,119 : false
+ 2,66 : true
+ 42,119 : true
+ 4,66 : true
+ 5,66 : true
+ 6,66 : true
+ 7,66 : true
+ 8,66 : true
+ 9,66 : true
+ 120,44 : true
+ 12,119 : true
+ 124,84 : true
+ 99,85 : true
+ 113,25 : true
+ 79,85 : true
+ 89,85 : true
+ 59,85 : true
+ 69,85 : false
+ 39,85 : false
+ 49,85 : true
+ 19,85 : true
+ 29,85 : true
+ 140,1 : true
+ 177,40 : true
+ 115,52 : true
+ 45,119 : true
+ 25,119 : false
+ 35,119 : true
+ 106,83 : true
+ 173,42 : true
+ 15,119 : true
+ 120,36 : true
+ 124,5 : true
+ 164,4 : true
+ 190,9 : true
+ 112,21 : true
+ 122,45 : true
+ 105,52 : true
+ 151,17 : true
+ 100,52 : true
+ 163,42 : true
+ 129,68 : true
+ 129,49 : true
+ 200,44 : true
+ 97,85 : true
+ 133,25 : true
+ 162,39 : false
+ 114,5 : false
+ 57,85 : true
+ 67,85 : true
+ 77,85 : true
+ 87,85 : true
+ 17,85 : true
+ 102,21 : true
+ 37,85 : true
+ 47,85 : true
+ 118,61 : false
+ 141,17 : true
+ 157,40 : true
+ 59,90 : true
+ 49,90 : true
+ 43,119 : true
+ 69,90 : true
+ 99,90 : true
+ 89,90 : true
+ 133,33 : true
+ 130,77 : true
+ 130,44 : true
+ 13,119 : true
+ 111,3 : true
+ 105,59 : true
+ 112,69 : true
+ 118,45 : true
+ 126,7 : true
+ 105,22 : true
+ 128,61 : true
+ 120,14 : true
+ 120,52 : true
+ 38,117 : true
+ 48,117 : false
+ 18,117 : true
+ 28,117 : true
+ 112,12 : true
+ 131,60 : true
+ 142,69 : true
+ 122,21 : true
+ 128,45 : true
+ 191,42 : true
+ 116,7 : true
+ 195,47 : true
+ 115,22 : true
+ 170,25 : false
+ 125,76 : true
+ 96,67 : true
+ 80,65 : true
+ 76,67 : false
+ 66,67 : true
+ 56,67 : true
+ 46,67 : true
+ 36,67 : true
+ 81,75 : true
+ 71,75 : true
+ 61,75 : true
+ 51,75 : true
+ 41,75 : true
+ 31,75 : false
+ 21,75 : true
+ 11,75 : true
+ 132,69 : true
+ 165,47 : true
+ 134,65 : true
+ 139,95 : false
+ 129,50 : true
+ 108,61 : true
+ 150,32 : true
+ 135,73 : true
+ 135,93 : false
+ 140,52 : true
+ 113,94 : true
+ 124,19 : true
+ 110,41 : true
+ 111,60 : true
+ 110,36 : true
+ 142,21 : true
+ 144,65 : true
+ 136,7 : true
+ 149,95 : true
+ 105,76 : false
+ 150,25 : true
+ 110,14 : true
+ 109,82 : true
+ 145,93 : true
+ 130,52 : true
+ 123,94 : true
+ 101,60 : true
+ 140,36 : true
+ 134,19 : true
+ 121,83 : true
+ 139,66 : false
+ 180,36 : true
+ 22,65 : true
+ 12,65 : true
+ 115,76 : true
+ 137,2 : true
+ 73,67 : true
+ 83,67 : true
+ 93,67 : true
+ 31,65 : true
+ 43,67 : true
+ 53,67 : true
+ 63,67 : true
+ 50,75 : true
+ 14,117 : true
+ 70,75 : false
+ 80,75 : true
+ 44,117 : false
+ 20,75 : true
+ 24,117 : true
+ 40,75 : true
+ 131,83 : true
+ 116,51 : true
+ 155,47 : true
+ 149,66 : true
+ 170,36 : true
+ 138,61 : true
+ 13,67 : false
+ 23,67 : true
+ 155,22 : true
+ 102,69 : true
+ 74,65 : true
+ 93,57 : true
+ 54,65 : true
+ 44,65 : true
+ 63,57 : true
+ 53,57 : true
+ 94,65 : true
+ 84,65 : true
+ 15,117 : false
+ 45,75 : true
+ 43,57 : true
+ 25,75 : true
+ 95,75 : true
+ 85,75 : false
+ 75,75 : true
+ 65,75 : true
+ 106,51 : true
+ 160,36 : true
+ 192,21 : true
+ 20,65 : true
+ 10,65 : true
+ 149,16 : true
+ 125,22 : true
+ 95,67 : false
+ 5,118 : true
+ 75,67 : true
+ 85,67 : true
+ 55,67 : true
+ 65,67 : false
+ 56,57 : true
+ 66,57 : true
+ 16,117 : true
+ 46,57 : true
+ 36,117 : true
+ 46,117 : true
+ 32,75 : true
+ 9,118 : true
+ 8,118 : true
+ 7,118 : true
+ 130,99 : true
+ 108,45 : true
+ 150,36 : true
+ 182,21 : true
+ 15,67 : true
+ 1,142 : true
+ 2,142 : true
+ 3,142 : true
+ 4,142 : true
+ 5,142 : true
+ 6,142 : true
+ 7,142 : true
+ 82,65 : true
+ 72,65 : true
+ 190,25 : true
+ 94,67 : true
+ 44,67 : true
+ 75,57 : true
+ 64,67 : true
+ 54,67 : true
+ 45,57 : true
+ 35,57 : true
+ 47,117 : true
+ 37,117 : true
+ 145,47 : true
+ 102,12 : true
+ 10,117 : true
+ 20,117 : true
+ 116,67 : true
+ 149,50 : true
+ 13,75 : true
+ 132,92 : true
+ 196,48 : true
+ 16,65 : true
+ 198,45 : true
+ 36,65 : true
+ 40,117 : true
+ 68,57 : true
+ 57,67 : true
+ 67,67 : false
+ 77,67 : true
+ 87,67 : true
+ 97,67 : true
+ 192,12 : true
+ 24,75 : true
+ 34,75 : true
+ 44,75 : true
+ 54,75 : true
+ 64,75 : true
+ 74,75 : true
+ 84,75 : true
+ 94,75 : true
+ 21,117 : true
+ 11,117 : true
+ 196,7 : true
+ 106,67 : true
+ 159,50 : true
+ 14,75 : true
+ 142,92 : true
+ 17,67 : true
+ 27,67 : true
+ 35,65 : true
+ 77,57 : true
+ 67,57 : true
+ 97,57 : false
+ 87,57 : true
+ 119,64 : true
+ 133,78 : true
+ 133,89 : true
+ 17,57 : true
+ 130,85 : true
+ 37,57 : true
+ 27,57 : false
+ 57,57 : true
+ 47,57 : true
+ 105,98 : true
+ 15,75 : true
+ 117,2 : true
+ 112,92 : true
+ 34,65 : true
+ 24,65 : true
+ 14,65 : true
+ 148,10 : true
+ 63,65 : true
+ 73,65 : true
+ 49,67 : true
+ 53,65 : true
+ 89,67 : true
+ 99,67 : true
+ 46,75 : true
+ 56,75 : true
+ 26,75 : true
+ 36,75 : true
+ 86,75 : true
+ 96,75 : true
+ 66,75 : true
+ 76,75 : true
+ 115,98 : true
+ 132,70 : true
+ 16,75 : true
+ 190,36 : true
+ 122,92 : true
+ 107,2 : true
+ 29,67 : true
+ 33,65 : true
+ 158,10 : true
+ 19,67 : false
+ 58,67 : false
+ 48,67 : true
+ 76,65 : true
+ 68,67 : true
+ 96,65 : true
+ 86,65 : true
+ 33,75 : true
+ 23,75 : true
+ 53,75 : true
+ 43,75 : true
+ 73,75 : false
+ 63,75 : true
+ 93,75 : true
+ 83,75 : true
+ 142,70 : true
+ 125,98 : true
+ 166,7 : true
+ 145,24 : true
+ 10,105 : true
+ 40,105 : true
+ 50,105 : true
+ 20,105 : true
+ 30,105 : true
+ 143,78 : true
+ 160,14 : false
+ 142,3 : true
+ 126,91 : true
+ 100,85 : true
+ 146,67 : true
+ 121,3 : true
+ 14,91 : false
+ 24,91 : true
+ 34,91 : true
+ 44,91 : true
+ 54,91 : true
+ 64,91 : true
+ 74,91 : true
+ 84,91 : true
+ 94,91 : true
+ 115,84 : true
+ 143,94 : true
+ 114,52 : false
+ 121,99 : true
+ 174,28 : true
+ 116,91 : true
+ 170,14 : true
+ 108,10 : false
+ 165,24 : true
+ 15,91 : true
+ 35,91 : true
+ 25,91 : false
+ 55,91 : true
+ 45,91 : false
+ 75,91 : true
+ 12,105 : true
+ 95,91 : true
+ 85,91 : true
+ 42,105 : false
+ 178,45 : true
+ 149,79 : true
+ 110,32 : false
+ 172,12 : true
+ 104,52 : true
+ 111,99 : true
+ 144,28 : true
+ 173,29 : true
+ 101,3 : true
+ 122,69 : true
+ 118,10 : true
+ 26,91 : true
+ 36,91 : false
+ 16,91 : true
+ 66,91 : true
+ 76,91 : true
+ 46,91 : true
+ 56,91 : true
+ 31,105 : true
+ 21,105 : true
+ 86,91 : true
+ 96,91 : true
+ 139,79 : true
+ 134,52 : false
+ 182,12 : true
+ 150,14 : true
+ 136,91 : true
+ 105,73 : true
+ 111,65 : true
+ 148,8 : true
+ 96,81 : false
+ 86,81 : true
+ 76,81 : true
+ 66,81 : true
+ 165,10 : true
+ 200,38 : false
+ 19,81 : true
+ 13,102 : true
+ 34,93 : true
+ 49,81 : true
+ 14,93 : true
+ 24,93 : true
+ 123,1 : true
+ 117,71 : true
+ 94,93 : true
+ 74,93 : true
+ 84,93 : true
+ 115,73 : true
+ 158,8 : true
+ 87,81 : true
+ 97,81 : true
+ 67,81 : true
+ 77,81 : true
+ 65,93 : true
+ 55,93 : true
+ 45,93 : false
+ 35,93 : true
+ 56,81 : true
+ 46,81 : true
+ 36,81 : true
+ 26,81 : true
+ 139,2 : true
+ 95,93 : false
+ 85,93 : false
+ 75,93 : true
+ 101,98 : true
+ 1,92 : true
+ 2,92 : true
+ 102,42 : true
+ 68,81 : true
+ 58,81 : true
+ 88,81 : false
+ 78,81 : true
+ 104,51 : true
+ 25,102 : true
+ 15,102 : true
+ 103,1 : true
+ 124,86 : true
+ 45,102 : true
+ 35,102 : true
+ 111,98 : true
+ 194,48 : true
+ 178,16 : true
+ 147,79 : true
+ 138,8 : true
+ 99,81 : true
+ 59,81 : true
+ 69,81 : true
+ 79,81 : true
+ 89,81 : false
+ 12,102 : true
+ 18,81 : true
+ 48,81 : false
+ 38,81 : false
+ 133,1 : true
+ 107,71 : false
+ 107,24 : true
+ 32,102 : true
+ 42,102 : true
+ 188,8 : true
+ 111,37 : true
+ 42,142 : true
+ 32,142 : true
+ 158,45 : true
+ 13,69 : true
+ 33,69 : true
+ 23,69 : false
+ 53,69 : true
+ 43,69 : false
+ 73,69 : true
+ 63,69 : true
+ 93,69 : true
+ 83,69 : true
+ 10,93 : true
+ 60,93 : true
+ 70,93 : true
+ 40,93 : true
+ 50,93 : true
+ 115,90 : true
+ 80,93 : true
+ 90,93 : true
+ 105,83 : true
+ 104,86 : true
+ 174,48 : true
+ 101,37 : true
+ 115,83 : true
+ 33,142 : true
+ 43,142 : true
+ 198,16 : true
+ 168,45 : true
+ 12,69 : true
+ 22,69 : true
+ 32,69 : true
+ 42,69 : true
+ 52,69 : true
+ 62,69 : true
+ 72,69 : true
+ 31,93 : true
+ 92,69 : true
+ 14,102 : true
+ 24,102 : true
+ 5,92 : true
+ 61,93 : true
+ 3,92 : true
+ 41,93 : true
+ 105,90 : true
+ 91,93 : false
+ 81,93 : true
+ 34,102 : true
+ 44,102 : true
+ 184,48 : true
+ 113,13 : true
+ 50,142 : true
+ 40,142 : false
+ 120,38 : true
+ 129,88 : true
+ 106,40 : true
+ 36,93 : true
+ 46,93 : true
+ 56,93 : true
+ 66,93 : true
+ 11,102 : true
+ 31,102 : true
+ 26,93 : true
+ 41,102 : true
+ 135,90 : false
+ 76,93 : true
+ 86,93 : true
+ 10,142 : true
+ 103,13 : true
+ 135,83 : true
+ 41,142 : true
+ 114,34 : true
+ 130,38 : true
+ 108,95 : true
+ 196,11 : true
+ 47,93 : true
+ 37,93 : true
+ 67,93 : true
+ 57,93 : false
+ 102,25 : true
+ 27,93 : true
+ 17,93 : true
+ 125,90 : true
+ 87,93 : true
+ 31,142 : true
+ 11,142 : true
+ 126,40 : true
+ 180,38 : false
+ 148,16 : true
+ 104,34 : true
+ 47,69 : false
+ 37,69 : true
+ 67,69 : true
+ 57,69 : true
+ 70,72 : true
+ 60,72 : true
+ 90,72 : true
+ 80,72 : true
+ 132,99 : true
+ 122,42 : true
+ 87,69 : true
+ 77,69 : true
+ 38,116 : true
+ 28,116 : true
+ 48,116 : true
+ 23,147 : false
+ 33,147 : true
+ 43,147 : true
+ 190,38 : false
+ 116,40 : true
+ 185,19 : true
+ 158,16 : true
+ 36,69 : true
+ 46,69 : true
+ 56,69 : true
+ 66,69 : true
+ 16,69 : true
+ 26,69 : true
+ 142,99 : false
+ 152,42 : true
+ 103,9 : true
+ 76,69 : true
+ 86,69 : true
+ 96,69 : false
+ 98,65 : true
+ 88,65 : true
+ 78,65 : true
+ 68,65 : true
+ 58,65 : true
+ 48,65 : true
+ 38,65 : true
+ 28,65 : true
+ 18,65 : false
+ 146,40 : true
+ 160,38 : true
+ 105,10 : true
+ 44,142 : true
+ 34,142 : true
+ 31,69 : true
+ 36,116 : true
+ 11,69 : true
+ 16,116 : true
+ 71,69 : true
+ 61,69 : true
+ 51,69 : true
+ 41,69 : true
+ 182,42 : true
+ 91,69 : true
+ 81,69 : true
+ 153,9 : false
+ 21,147 : true
+ 31,147 : true
+ 11,147 : true
+ 41,147 : true
+ 170,38 : false
+ 119,88 : true
+ 35,142 : true
+ 45,142 : true
+ 20,69 : true
+ 30,69 : true
+ 141,65 : true
+ 10,69 : true
+ 60,69 : true
+ 70,69 : true
+ 40,69 : true
+ 50,69 : true
+ 132,42 : true
+ 125,36 : true
+ 80,69 : true
+ 90,69 : true
+ 19,116 : false
+ 29,116 : true
+ 39,116 : true
+ 12,147 : true
+ 25,142 : true
+ 32,147 : true
+ 22,147 : true
+ 42,147 : true
+ 109,88 : true
+ 108,16 : true
+ 166,40 : false
+ 144,58 : true
+ 24,116 : true
+ 14,116 : true
+ 44,116 : true
+ 34,116 : true
+ 124,48 : true
+ 164,36 : true
+ 38,75 : true
+ 48,75 : false
+ 58,75 : true
+ 78,93 : true
+ 99,65 : true
+ 18,75 : true
+ 28,75 : true
+ 37,147 : true
+ 47,147 : true
+ 79,65 : false
+ 89,65 : true
+ 48,93 : true
+ 58,93 : true
+ 17,147 : false
+ 38,93 : true
+ 118,16 : true
+ 102,67 : true
+ 156,40 : false
+ 107,8 : true
+ 37,116 : true
+ 47,116 : true
+ 3,56 : true
+ 2,56 : true
+ 5,56 : true
+ 4,56 : true
+ 7,56 : false
+ 6,56 : true
+ 47,75 : true
+ 37,75 : true
+ 79,93 : true
+ 69,93 : true
+ 27,75 : true
+ 17,75 : true
+ 30,147 : true
+ 20,147 : true
+ 10,147 : true
+ 122,25 : true
+ 87,75 : true
+ 77,75 : false
+ 50,147 : true
+ 40,147 : false
+ 128,16 : true
+ 117,8 : true
+ 102,60 : true
+ 186,40 : true
+ 65,69 : true
+ 55,69 : true
+ 45,69 : true
+ 35,69 : true
+ 92,72 : false
+ 42,116 : true
+ 72,72 : true
+ 22,116 : true
+ 113,9 : true
+ 100,56 : true
+ 143,1 : true
+ 12,72 : true
+ 95,69 : true
+ 85,69 : true
+ 75,69 : true
+ 77,65 : false
+ 87,65 : true
+ 57,65 : false
+ 67,65 : true
+ 37,65 : true
+ 47,65 : true
+ 17,65 : true
+ 27,65 : true
+ 122,67 : true
+ 127,8 : true
+ 176,40 : true
+ 54,69 : true
+ 51,72 : true
+ 34,69 : true
+ 44,69 : true
+ 81,72 : true
+ 91,72 : true
+ 61,72 : true
+ 71,72 : true
+ 69,75 : true
+ 59,75 : true
+ 49,75 : true
+ 39,75 : true
+ 29,75 : true
+ 11,72 : true
+ 74,69 : true
+ 84,69 : true
+ 46,147 : true
+ 36,147 : true
+ 136,87 : true
+ 99,75 : true
+ 89,75 : true
+ 79,75 : true
+ 126,75 : true
+ 17,145 : true
+ 122,60 : true
+ 111,69 : true
+ 102,4 : true
+ 123,58 : true
+ 119,45 : true
+ 171,7 : true
+ 126,22 : true
+ 28,145 : true
+ 38,145 : true
+ 48,145 : true
+ 105,11 : true
+ 116,75 : true
+ 105,19 : true
+ 112,60 : true
+ 97,98 : false
+ 87,98 : true
+ 77,98 : true
+ 112,4 : true
+ 190,5 : false
+ 141,69 : true
+ 102,7 : true
+ 141,7 : true
+ 136,22 : true
+ 196,40 : true
+ 44,147 : true
+ 34,147 : true
+ 24,147 : true
+ 14,147 : false
+ 133,72 : true
+ 106,96 : true
+ 115,19 : true
+ 146,75 : true
+ 186,28 : true
+ 138,95 : true
+ 19,145 : true
+ 112,7 : true
+ 19,147 : true
+ 151,7 : true
+ 49,147 : true
+ 29,147 : false
+ 39,147 : true
+ 199,5 : true
+ 100,90 : true
+ 123,72 : true
+ 136,75 : true
+ 125,19 : true
+ 148,95 : true
+ 132,60 : true
+ 121,69 : true
+ 122,7 : true
+ 156,22 : true
+ 37,145 : true
+ 27,145 : true
+ 47,145 : true
+ 113,72 : true
+ 99,61 : false
+ 133,85 : true
+ 59,61 : true
+ 69,61 : true
+ 79,61 : true
+ 89,61 : true
+ 19,61 : true
+ 29,61 : true
+ 39,61 : true
+ 49,61 : true
+ 123,23 : true
+ 120,82 : false
+ 136,94 : true
+ 49,98 : true
+ 39,98 : true
+ 69,98 : true
+ 59,98 : true
+ 103,72 : true
+ 29,98 : true
+ 19,98 : true
+ 143,85 : true
+ 196,28 : true
+ 145,19 : true
+ 101,69 : true
+ 132,93 : true
+ 130,82 : true
+ 153,23 : true
+ 18,147 : true
+ 41,145 : true
+ 181,7 : true
+ 48,147 : true
+ 38,147 : true
+ 28,147 : true
+ 150,90 : true
+ 127,53 : true
+ 188,18 : true
+ 98,98 : true
+ 78,98 : false
+ 88,98 : true
+ 102,93 : true
+ 180,5 : true
+ 143,23 : true
+ 106,22 : true
+ 191,7 : false
+ 100,74 : true
+ 67,98 : false
+ 57,98 : true
+ 47,98 : true
+ 37,98 : true
+ 27,98 : true
+ 17,98 : true
+ 176,28 : true
+ 89,98 : true
+ 79,98 : false
+ 165,19 : true
+ 99,98 : true
+ 112,93 : true
+ 170,5 : true
+ 109,45 : false
+ 5,134 : true
+ 4,134 : true
+ 3,134 : true
+ 2,134 : true
+ 9,134 : true
+ 8,134 : true
+ 7,134 : true
+ 6,134 : true
+ 58,98 : true
+ 68,98 : true
+ 38,98 : true
+ 48,98 : true
+ 18,98 : true
+ 28,98 : true
+ 173,13 : true
+ 168,18 : true
+ 101,81 : true
+ 149,88 : false
+ 175,11 : true
+ 169,31 : true
+ 141,34 : true
+ 147,91 : true
+ 40,145 : true
+ 50,145 : true
+ 185,22 : true
+ 15,61 : true
+ 25,61 : true
+ 35,61 : true
+ 45,61 : true
+ 55,61 : true
+ 65,61 : true
+ 75,61 : true
+ 85,61 : true
+ 95,61 : true
+ 11,81 : true
+ 21,81 : true
+ 178,18 : true
+ 163,13 : true
+ 113,23 : true
+ 185,11 : true
+ 10,145 : true
+ 20,145 : true
+ 30,145 : true
+ 90,78 : true
+ 43,110 : true
+ 60,78 : false
+ 50,78 : true
+ 36,61 : true
+ 30,102 : true
+ 40,102 : true
+ 50,102 : true
+ 40,78 : true
+ 66,61 : true
+ 96,61 : false
+ 86,61 : false
+ 191,40 : true
+ 80,81 : true
+ 70,81 : true
+ 153,13 : true
+ 90,81 : true
+ 155,11 : true
+ 103,23 : true
+ 31,145 : true
+ 21,145 : true
+ 11,145 : true
+ 119,5 : false
+ 50,76 : true
+ 40,76 : true
+ 42,145 : true
+ 32,93 : true
+ 42,93 : true
+ 80,76 : true
+ 70,76 : false
+ 60,76 : true
+ 53,81 : true
+ 63,81 : true
+ 33,81 : true
+ 43,81 : true
+ 13,81 : true
+ 23,81 : true
+ 119,66 : true
+ 181,40 : true
+ 71,81 : true
+ 81,81 : true
+ 91,81 : true
+ 143,13 : true
+ 10,110 : true
+ 20,110 : true
+ 22,145 : true
+ 32,145 : true
+ 109,5 : true
+ 12,145 : true
+ 13,93 : true
+ 33,93 : false
+ 23,93 : true
+ 53,93 : true
+ 43,93 : true
+ 73,93 : true
+ 63,93 : true
+ 40,81 : true
+ 30,81 : true
+ 60,81 : true
+ 50,81 : true
+ 20,81 : true
+ 10,81 : true
+ 102,99 : false
+ 92,81 : true
+ 82,81 : true
+ 72,81 : false
+ 118,82 : false
+ 181,34 : true
+ 11,110 : true
+ 135,11 : true
+ 31,110 : true
+ 21,110 : true
+ 63,78 : true
+ 73,78 : true
+ 83,78 : true
+ 15,81 : true
+ 25,81 : true
+ 35,81 : true
+ 45,81 : true
+ 55,81 : true
+ 71,61 : true
+ 81,61 : true
+ 91,61 : true
+ 13,78 : true
+ 31,61 : true
+ 41,61 : true
+ 51,61 : true
+ 61,61 : true
+ 116,87 : true
+ 93,81 : true
+ 73,81 : true
+ 83,81 : true
+ 145,11 : true
+ 12,110 : true
+ 22,110 : true
+ 32,110 : true
+ 74,78 : false
+ 64,78 : true
+ 22,61 : true
+ 84,78 : false
+ 146,96 : true
+ 137,91 : true
+ 82,61 : true
+ 72,61 : false
+ 42,81 : true
+ 32,81 : true
+ 34,78 : true
+ 32,61 : true
+ 62,61 : true
+ 52,61 : true
+ 140,82 : true
+ 122,99 : true
+ 121,91 : true
+ 179,45 : true
+ 74,81 : true
+ 64,81 : true
+ 94,81 : true
+ 84,81 : true
+ 33,110 : true
+ 23,110 : true
+ 13,110 : true
+ 115,11 : true
+ 81,78 : true
+ 17,81 : true
+ 61,78 : true
+ 71,78 : true
+ 47,81 : false
+ 57,81 : true
+ 27,81 : true
+ 17,61 : true
+ 67,61 : true
+ 77,61 : true
+ 84,76 : true
+ 74,76 : true
+ 64,76 : true
+ 54,76 : true
+ 44,76 : true
+ 31,78 : true
+ 137,58 : true
+ 112,99 : true
+ 131,91 : true
+ 189,45 : true
+ 65,81 : true
+ 75,81 : true
+ 85,81 : true
+ 95,81 : true
+ 24,110 : true
+ 34,110 : true
+ 125,11 : true
+ 14,110 : true
+ 92,78 : true
+ 82,78 : true
+ 72,78 : false
+ 62,78 : true
+ 38,61 : true
+ 28,61 : true
+ 54,81 : true
+ 44,81 : true
+ 78,61 : false
+ 68,61 : true
+ 58,61 : true
+ 48,61 : true
+ 52,78 : true
+ 42,78 : true
+ 32,78 : true
+ 22,78 : true
+ 58,88 : true
+ 68,88 : true
+ 78,88 : true
+ 88,88 : true
+ 18,88 : true
+ 28,88 : true
+ 38,88 : true
+ 48,88 : false
+ 199,8 : false
+ 120,84 : true
+ 105,62 : true
+ 1,146 : true
+ 4,146 : true
+ 5,146 : true
+ 2,146 : true
+ 3,146 : true
+ 125,29 : true
+ 162,1 : true
+ 125,67 : true
+ 67,88 : true
+ 57,88 : false
+ 87,88 : true
+ 77,88 : true
+ 27,88 : true
+ 17,88 : true
+ 47,88 : true
+ 37,88 : true
+ 102,65 : true
+ 107,70 : true
+ 115,29 : true
+ 98,88 : true
+ 134,79 : true
+ 112,1 : true
+ 76,88 : true
+ 86,88 : true
+ 56,88 : true
+ 66,88 : true
+ 36,88 : true
+ 46,88 : true
+ 16,88 : true
+ 26,88 : true
+ 100,84 : true
+ 195,44 : true
+ 122,4 : true
+ 103,95 : true
+ 117,70 : false
+ 23,148 : false
+ 33,148 : true
+ 43,148 : true
+ 105,29 : true
+ 97,88 : true
+ 102,1 : true
+ 85,88 : true
+ 75,88 : true
+ 65,88 : false
+ 55,88 : true
+ 45,88 : true
+ 35,88 : true
+ 25,88 : true
+ 13,148 : false
+ 8,146 : true
+ 9,146 : true
+ 6,146 : true
+ 7,146 : true
+ 132,4 : true
+ 127,70 : true
+ 113,95 : true
+ 139,90 : true
+ 132,1 : true
+ 96,88 : false
+ 2,82 : true
+ 1,82 : true
+ 139,57 : true
+ 130,81 : true
+ 14,80 : true
+ 9,82 : true
+ 34,80 : true
+ 24,80 : true
+ 6,82 : true
+ 44,80 : false
+ 74,80 : false
+ 64,80 : false
+ 94,80 : true
+ 84,80 : true
+ 175,44 : true
+ 129,31 : false
+ 145,62 : true
+ 149,90 : true
+ 132,9 : true
+ 122,1 : true
+ 169,45 : true
+ 49,71 : true
+ 39,71 : false
+ 69,71 : true
+ 59,71 : true
+ 29,71 : true
+ 19,71 : true
+ 169,8 : true
+ 13,80 : true
+ 23,80 : true
+ 33,80 : false
+ 43,80 : true
+ 79,71 : true
+ 63,80 : false
+ 73,80 : true
+ 83,80 : true
+ 93,80 : true
+ 135,62 : true
+ 108,73 : true
+ 140,13 : true
+ 101,91 : false
+ 147,70 : true
+ 139,45 : true
+ 196,19 : true
+ 183,49 : true
+ 113,86 : true
+ 130,37 : true
+ 179,8 : false
+ 148,64 : true
+ 117,57 : true
+ 125,62 : true
+ 118,73 : false
+ 106,36 : true
+ 107,51 : true
+ 59,88 : true
+ 49,88 : true
+ 39,88 : true
+ 29,88 : true
+ 99,88 : true
+ 89,88 : true
+ 79,88 : false
+ 69,88 : true
+ 175,48 : true
+ 9,147 : true
+ 8,147 : true
+ 7,147 : true
+ 6,147 : false
+ 5,147 : true
+ 4,147 : true
+ 3,147 : true
+ 145,44 : false
+ 116,36 : true
+ 160,13 : true
+ 159,45 : true
+ 66,71 : false
+ 76,71 : true
+ 86,71 : true
+ 96,71 : true
+ 119,87 : true
+ 103,56 : true
+ 40,80 : true
+ 30,80 : false
+ 60,80 : true
+ 16,71 : true
+ 26,71 : true
+ 37,131 : true
+ 47,131 : true
+ 10,80 : true
+ 127,51 : false
+ 182,4 : true
+ 80,80 : true
+ 70,80 : true
+ 90,80 : true
+ 41,113 : true
+ 31,113 : false
+ 31,148 : true
+ 41,148 : true
+ 21,113 : true
+ 21,148 : true
+ 75,71 : true
+ 65,71 : true
+ 95,71 : true
+ 85,71 : true
+ 145,42 : true
+ 15,71 : true
+ 35,71 : false
+ 28,131 : true
+ 55,71 : true
+ 48,131 : true
+ 192,4 : true
+ 192,1 : true
+ 30,113 : true
+ 40,113 : true
+ 50,113 : true
+ 45,145 : true
+ 35,145 : true
+ 40,148 : true
+ 20,113 : false
+ 149,28 : true
+ 183,3 : true
+ 39,131 : true
+ 49,131 : true
+ 19,131 : true
+ 29,131 : false
+ 32,80 : true
+ 22,80 : true
+ 12,80 : true
+ 135,42 : true
+ 72,80 : true
+ 62,80 : true
+ 52,80 : true
+ 42,80 : true
+ 92,80 : true
+ 82,80 : false
+ 182,1 : true
+ 124,83 : true
+ 128,8 : true
+ 152,9 : true
+ 112,59 : true
+ 129,87 : true
+ 136,71 : true
+ 21,80 : true
+ 31,80 : true
+ 125,42 : true
+ 11,80 : true
+ 61,80 : true
+ 71,80 : true
+ 41,80 : true
+ 51,80 : true
+ 81,80 : true
+ 91,80 : true
+ 42,148 : true
+ 32,148 : true
+ 22,148 : false
+ 12,148 : false
+ 92,71 : true
+ 102,59 : true
+ 52,71 : true
+ 62,71 : true
+ 72,71 : true
+ 82,71 : true
+ 13,131 : true
+ 22,71 : true
+ 33,131 : true
+ 42,71 : true
+ 138,24 : true
+ 142,4 : true
+ 133,64 : true
+ 123,95 : true
+ 45,148 : true
+ 25,148 : true
+ 35,148 : true
+ 14,145 : true
+ 24,145 : true
+ 34,145 : true
+ 44,145 : true
+ 91,71 : true
+ 119,28 : true
+ 142,14 : true
+ 61,71 : true
+ 51,71 : true
+ 81,71 : true
+ 71,71 : true
+ 24,131 : true
+ 11,71 : true
+ 44,131 : true
+ 31,71 : true
+ 128,24 : true
+ 37,59 : true
+ 47,59 : true
+ 57,59 : true
+ 67,59 : true
+ 133,95 : true
+ 17,59 : true
+ 27,59 : true
+ 34,148 : true
+ 49,145 : true
+ 39,145 : true
+ 44,148 : true
+ 77,59 : true
+ 87,59 : true
+ 97,59 : true
+ 155,29 : true
+ 88,71 : true
+ 98,71 : true
+ 68,71 : true
+ 78,71 : true
+ 123,56 : true
+ 103,49 : true
+ 15,131 : true
+ 48,71 : true
+ 58,71 : true
+ 28,71 : true
+ 38,71 : true
+ 48,59 : true
+ 38,59 : true
+ 68,59 : true
+ 58,59 : true
+ 28,59 : true
+ 18,59 : true
+ 142,1 : true
+ 112,9 : true
+ 143,95 : true
+ 36,145 : true
+ 78,59 : true
+ 16,145 : false
+ 26,145 : true
+ 97,71 : true
+ 87,71 : true
+ 77,71 : true
+ 67,71 : true
+ 106,76 : true
+ 113,56 : true
+ 155,36 : true
+ 16,131 : true
+ 165,42 : false
+ 188,24 : true
+ 57,71 : true
+ 47,71 : true
+ 37,71 : true
+ 27,71 : true
+ 59,59 : true
+ 69,59 : true
+ 39,59 : true
+ 49,59 : true
+ 19,59 : true
+ 29,59 : false
+ 122,9 : true
+ 46,148 : true
+ 36,148 : true
+ 26,148 : false
+ 23,145 : true
+ 13,145 : true
+ 79,59 : true
+ 33,145 : true
+ 18,113 : true
+ 28,113 : true
+ 38,113 : true
+ 48,113 : true
+ 125,75 : true
+ 132,77 : true
+ 114,80 : true
+ 120,56 : true
+ 113,3 : true
+ 173,9 : true
+ 174,7 : true
+ 114,24 : false
+ 172,25 : true
+ 29,113 : true
+ 19,113 : true
+ 49,113 : true
+ 39,113 : true
+ 106,11 : true
+ 106,19 : true
+ 115,75 : true
+ 124,80 : true
+ 110,56 : true
+ 1,104 : true
+ 2,104 : true
+ 3,104 : true
+ 10,131 : false
+ 5,104 : true
+ 30,131 : true
+ 20,131 : true
+ 8,104 : true
+ 40,131 : true
+ 162,25 : true
+ 104,24 : true
+ 19,69 : true
+ 94,71 : true
+ 59,69 : true
+ 49,69 : true
+ 16,113 : true
+ 29,69 : false
+ 34,71 : true
+ 44,71 : true
+ 11,131 : true
+ 24,71 : true
+ 134,80 : true
+ 140,56 : false
+ 200,30 : true
+ 99,69 : true
+ 89,69 : true
+ 79,69 : true
+ 69,69 : true
+ 152,25 : true
+ 194,7 : true
+ 6,132 : true
+ 5,132 : true
+ 8,132 : true
+ 7,132 : true
+ 47,113 : true
+ 37,113 : true
+ 27,113 : true
+ 17,113 : true
+ 43,71 : true
+ 33,71 : true
+ 23,71 : true
+ 13,71 : true
+ 144,80 : true
+ 130,56 : true
+ 103,3 : true
+ 88,69 : true
+ 98,69 : true
+ 68,69 : true
+ 78,69 : true
+ 24,113 : true
+ 34,113 : true
+ 44,113 : true
+ 123,93 : true
+ 104,53 : true
+ 134,85 : true
+ 169,28 : true
+ 136,19 : true
+ 14,113 : true
+ 154,24 : true
+ 120,30 : true
+ 150,67 : true
+ 35,113 : true
+ 25,113 : true
+ 133,93 : true
+ 45,113 : false
+ 114,53 : true
+ 199,28 : true
+ 144,85 : true
+ 197,18 : true
+ 174,3 : true
+ 146,19 : true
+ 15,113 : true
+ 150,56 : true
+ 144,24 : true
+ 107,100 : true
+ 184,7 : true
+ 42,113 : true
+ 103,93 : true
+ 22,113 : true
+ 32,113 : true
+ 189,28 : true
+ 12,113 : true
+ 156,19 : true
+ 105,75 : true
+ 127,83 : true
+ 20,71 : true
+ 30,71 : true
+ 193,9 : true
+ 10,71 : true
+ 60,71 : false
+ 70,71 : true
+ 40,71 : true
+ 50,71 : true
+ 80,71 : true
+ 90,71 : true
+ 113,93 : true
+ 43,113 : false
+ 33,113 : true
+ 23,113 : false
+ 13,113 : true
+ 154,3 : true
+ 166,19 : false
+ 137,51 : true
+ 110,30 : true
+ 124,24 : true
+ 144,53 : true
+ 163,49 : true
+ 147,60 : true
+ 147,18 : true
+ 147,69 : true
+ 30,88 : true
+ 40,88 : true
+ 50,88 : false
+ 60,88 : true
+ 6,114 : true
+ 128,47 : false
+ 10,88 : true
+ 20,88 : true
+ 200,49 : true
+ 30,110 : true
+ 144,92 : true
+ 200,47 : true
+ 70,88 : true
+ 80,88 : true
+ 90,88 : true
+ 200,46 : true
+ 134,21 : true
+ 71,90 : true
+ 153,49 : true
+ 200,42 : true
+ 200,41 : true
+ 134,34 : true
+ 12,131 : true
+ 200,39 : true
+ 200,37 : true
+ 200,36 : false
+ 137,69 : true
+ 137,60 : true
+ 200,35 : true
+ 157,18 : false
+ 195,29 : true
+ 125,44 : false
+ 44,87 : true
+ 100,68 : true
+ 200,33 : true
+ 200,32 : false
+ 138,47 : true
+ 121,55 : true
+ 129,65 : true
+ 184,24 : true
+ 200,28 : true
+ 114,92 : true
+ 200,27 : true
+ 158,9 : true
+ 200,25 : false
+ 125,96 : true
+ 100,81 : true
+ 200,24 : true
+ 200,22 : true
+ 143,49 : true
+ 163,26 : true
+ 123,53 : true
+ 124,34 : true
+ 200,19 : true
+ 200,18 : true
+ 200,17 : true
+ 127,60 : true
+ 136,68 : true
+ 99,57 : true
+ 127,69 : true
+ 200,14 : true
+ 185,29 : true
+ 115,44 : true
+ 200,13 : false
+ 157,24 : false
+ 130,67 : true
+ 200,12 : true
+ 200,11 : true
+ 146,31 : true
+ 200,9 : true
+ 200,8 : true
+ 53,53 : true
+ 124,92 : true
+ 174,24 : true
+ 36,120 : true
+ 146,58 : true
+ 186,7 : true
+ 135,79 : true
+ 176,45 : true
+ 200,3 : true
+ 133,49 : true
+ 134,53 : true
+ 147,58 : true
+ 200,1 : false
+ 121,7 : true
+ 199,50 : true
+ 199,49 : true
+ 154,34 : true
+ 117,69 : true
+ 117,60 : true
+ 199,48 : false
+ 199,47 : true
+ 175,29 : true
+ 105,44 : true
+ 199,46 : false
+ 177,18 : true
+ 199,45 : true
+ 15,145 : true
+ 120,67 : true
+ 187,24 : true
+ 199,43 : true
+ 199,42 : false
+ 199,41 : true
+ 199,40 : true
+ 164,24 : true
+ 145,56 : true
+ 136,58 : true
+ 178,17 : true
+ 132,90 : true
+ 120,13 : false
+ 164,16 : true
+ 145,96 : true
+ 199,35 : true
+ 199,34 : true
+ 199,33 : true
+ 199,32 : false
+ 105,96 : true
+ 131,7 : true
+ 137,79 : true
+ 199,31 : true
+ 48,91 : true
+ 103,99 : true
+ 165,29 : true
+ 31,136 : true
+ 123,97 : true
+ 107,60 : true
+ 199,25 : true
+ 166,22 : true
+ 117,24 : true
+ 14,88 : true
+ 24,88 : true
+ 34,88 : true
+ 44,88 : true
+ 54,88 : true
+ 64,88 : true
+ 74,88 : false
+ 84,88 : true
+ 94,88 : true
+ 117,79 : true
+ 199,22 : true
+ 10,99 : true
+ 9,132 : true
+ 154,16 : true
+ 98,77 : false
+ 199,18 : true
+ 148,30 : true
+ 174,34 : true
+ 199,16 : true
+ 187,30 : true
+ 115,96 : true
+ 101,7 : true
+ 127,79 : true
+ 199,14 : false
+ 117,10 : true
+ 146,95 : true
+ 199,11 : true
+ 177,39 : false
+ 141,87 : true
+ 176,22 : true
+ 123,51 : true
+ 13,88 : true
+ 119,31 : true
+ 33,88 : true
+ 23,88 : true
+ 53,88 : true
+ 43,88 : true
+ 73,88 : true
+ 63,88 : true
+ 60,86 : false
+ 83,88 : true
+ 40,86 : true
+ 50,86 : true
+ 199,6 : true
+ 137,55 : true
+ 80,86 : true
+ 90,86 : true
+ 199,3 : true
+ 199,2 : true
+ 131,93 : true
+ 93,86 : false
+ 83,86 : true
+ 73,86 : true
+ 63,86 : true
+ 53,86 : true
+ 43,86 : true
+ 33,86 : true
+ 23,86 : true
+ 13,86 : true
+ 198,50 : true
+ 186,22 : true
+ 198,49 : true
+ 13,64 : true
+ 22,88 : false
+ 32,88 : true
+ 110,68 : true
+ 12,88 : true
+ 62,88 : false
+ 72,88 : true
+ 42,88 : true
+ 52,88 : false
+ 198,47 : true
+ 154,7 : true
+ 82,88 : false
+ 92,88 : true
+ 135,96 : true
+ 110,81 : true
+ 198,46 : true
+ 198,44 : true
+ 194,34 : true
+ 198,43 : true
+ 107,79 : true
+ 198,42 : true
+ 198,41 : true
+ 114,35 : false
+ 198,39 : true
+ 126,11 : true
+ 198,38 : true
+ 198,37 : true
+ 113,99 : true
+ 198,36 : true
+ 196,22 : true
+ 148,6 : true
+ 198,34 : true
+ 198,33 : true
+ 31,88 : true
+ 21,88 : true
+ 11,88 : true
+ 107,98 : false
+ 71,88 : true
+ 61,88 : true
+ 51,88 : true
+ 41,88 : true
+ 198,32 : true
+ 87,56 : false
+ 91,88 : true
+ 81,88 : true
+ 120,81 : true
+ 1,81 : true
+ 198,29 : true
+ 116,31 : false
+ 198,26 : true
+ 102,91 : true
+ 198,25 : true
+ 198,24 : true
+ 126,50 : false
+ 198,23 : true
+ 148,37 : true
+ 198,22 : true
+ 109,38 : true
+ 151,33 : true
+ 14,143 : true
+ 24,143 : true
+ 198,21 : true
+ 180,18 : true
+ 106,75 : true
+ 126,70 : true
+ 78,79 : true
+ 68,79 : true
+ 58,79 : true
+ 43,143 : true
+ 101,13 : true
+ 198,18 : true
+ 98,79 : true
+ 88,79 : true
+ 110,17 : true
+ 198,15 : true
+ 143,10 : true
+ 184,49 : true
+ 144,25 : false
+ 139,98 : true
+ 147,16 : true
+ 85,77 : true
+ 142,86 : true
+ 48,132 : true
+ 198,11 : true
+ 198,10 : true
+ 120,57 : true
+ 198,9 : true
+ 198,8 : true
+ 158,37 : true
+ 161,33 : true
+ 119,38 : false
+ 105,6 : true
+ 107,90 : true
+ 38,79 : true
+ 28,79 : true
+ 18,79 : true
+ 198,7 : true
+ 69,79 : true
+ 79,79 : true
+ 49,79 : true
+ 59,79 : true
+ 169,48 : true
+ 125,58 : true
+ 89,79 : false
+ 99,79 : true
+ 140,60 : true
+ 198,4 : true
+ 174,49 : true
+ 50,112 : false
+ 18,132 : true
+ 30,112 : true
+ 20,112 : true
+ 10,112 : true
+ 49,132 : true
+ 192,23 : false
+ 150,57 : false
+ 198,2 : true
+ 128,37 : true
+ 161,30 : true
+ 106,50 : true
+ 197,50 : true
+ 16,143 : true
+ 26,143 : true
+ 19,100 : true
+ 29,100 : true
+ 197,49 : true
+ 197,47 : true
+ 197,46 : true
+ 109,20 : true
+ 197,45 : true
+ 153,1 : false
+ 197,43 : true
+ 197,42 : false
+ 45,143 : true
+ 35,143 : true
+ 105,3 : true
+ 197,41 : true
+ 109,80 : true
+ 130,60 : true
+ 119,93 : true
+ 197,40 : true
+ 192,16 : true
+ 19,132 : true
+ 29,132 : true
+ 39,132 : true
+ 46,132 : true
+ 36,132 : true
+ 26,132 : true
+ 16,132 : true
+ 31,114 : true
+ 138,37 : true
+ 100,57 : true
+ 197,38 : true
+ 125,6 : true
+ 127,90 : true
+ 25,143 : true
+ 15,143 : true
+ 197,37 : true
+ 197,36 : true
+ 197,35 : true
+ 186,39 : true
+ 107,88 : true
+ 197,34 : true
+ 137,77 : true
+ 106,7 : true
+ 34,143 : true
+ 44,143 : true
+ 119,85 : true
+ 197,30 : true
+ 194,49 : true
+ 138,52 : true
+ 197,29 : true
+ 119,80 : true
+ 173,10 : true
+ 154,25 : true
+ 116,68 : false
+ 197,28 : true
+ 37,132 : true
+ 47,132 : true
+ 17,132 : true
+ 27,132 : false
+ 105,50 : true
+ 197,26 : true
+ 197,25 : true
+ 18,143 : true
+ 17,100 : true
+ 27,100 : true
+ 129,20 : true
+ 197,24 : true
+ 135,6 : true
+ 101,62 : true
+ 176,39 : true
+ 149,38 : true
+ 178,50 : true
+ 184,25 : true
+ 80,90 : true
+ 141,13 : true
+ 166,34 : true
+ 166,24 : true
+ 47,143 : true
+ 37,143 : true
+ 197,20 : true
+ 116,98 : true
+ 129,80 : true
+ 146,81 : true
+ 13,112 : false
+ 23,112 : true
+ 33,112 : true
+ 43,112 : true
+ 24,132 : true
+ 14,132 : true
+ 44,132 : true
+ 34,132 : true
+ 127,15 : true
+ 166,11 : true
+ 197,15 : true
+ 77,62 : false
+ 27,143 : true
+ 17,143 : true
+ 197,13 : true
+ 197,12 : true
+ 147,90 : true
+ 145,6 : true
+ 119,20 : true
+ 191,28 : true
+ 79,100 : true
+ 89,100 : true
+ 99,100 : true
+ 153,17 : true
+ 39,100 : true
+ 49,100 : true
+ 59,100 : true
+ 69,100 : false
+ 149,93 : true
+ 1,136 : true
+ 27,70 : true
+ 197,7 : false
+ 145,69 : true
+ 182,16 : true
+ 139,80 : true
+ 159,12 : true
+ 15,132 : true
+ 25,132 : false
+ 35,132 : true
+ 45,132 : false
+ 130,65 : true
+ 197,4 : true
+ 197,3 : true
+ 197,2 : true
+ 149,20 : true
+ 103,83 : true
+ 129,38 : true
+ 131,33 : true
+ 156,39 : true
+ 106,70 : true
+ 155,6 : true
+ 197,1 : true
+ 113,73 : true
+ 9,101 : true
+ 88,100 : true
+ 78,100 : true
+ 6,101 : false
+ 5,101 : true
+ 48,100 : true
+ 38,100 : true
+ 39,143 : true
+ 19,114 : true
+ 49,114 : true
+ 39,114 : true
+ 31,112 : true
+ 41,112 : false
+ 11,112 : true
+ 21,112 : true
+ 12,132 : true
+ 140,57 : true
+ 196,50 : true
+ 196,49 : true
+ 196,47 : true
+ 42,132 : true
+ 19,143 : true
+ 22,132 : true
+ 28,100 : true
+ 18,100 : true
+ 141,33 : true
+ 139,20 : true
+ 116,70 : false
+ 21,93 : true
+ 196,45 : true
+ 165,6 : true
+ 97,100 : true
+ 196,44 : true
+ 77,100 : true
+ 87,100 : true
+ 57,100 : true
+ 67,100 : true
+ 37,100 : true
+ 47,100 : true
+ 28,143 : true
+ 38,143 : true
+ 48,143 : true
+ 196,43 : true
+ 22,112 : true
+ 12,112 : false
+ 42,112 : true
+ 32,112 : true
+ 92,77 : false
+ 13,132 : true
+ 189,38 : true
+ 196,41 : true
+ 43,132 : true
+ 140,59 : true
+ 23,132 : true
+ 33,132 : false
+ 76,100 : true
+ 66,100 : true
+ 96,100 : true
+ 86,100 : false
+ 144,12 : true
+ 145,59 : true
+ 196,37 : true
+ 196,36 : true
+ 126,66 : true
+ 13,100 : true
+ 196,35 : true
+ 172,16 : false
+ 43,100 : true
+ 53,100 : true
+ 23,100 : true
+ 33,100 : true
+ 196,34 : true
+ 196,33 : true
+ 181,13 : true
+ 139,93 : true
+ 141,76 : true
+ 140,62 : true
+ 140,45 : true
+ 141,25 : true
+ 196,27 : true
+ 196,26 : false
+ 10,132 : true
+ 199,38 : true
+ 30,132 : false
+ 16,114 : true
+ 26,114 : false
+ 40,132 : true
+ 46,114 : true
+ 75,100 : false
+ 85,100 : true
+ 95,100 : false
+ 196,24 : true
+ 155,18 : true
+ 196,21 : true
+ 196,20 : false
+ 142,16 : true
+ 136,66 : true
+ 16,100 : true
+ 130,17 : true
+ 36,100 : true
+ 26,100 : true
+ 56,100 : true
+ 46,100 : false
+ 95,77 : true
+ 99,94 : true
+ 196,15 : true
+ 171,13 : true
+ 130,62 : true
+ 75,95 : true
+ 53,71 : true
+ 196,12 : true
+ 117,36 : true
+ 128,39 : true
+ 89,93 : true
+ 11,132 : false
+ 15,114 : true
+ 31,132 : true
+ 41,132 : true
+ 25,114 : true
+ 94,100 : true
+ 45,114 : true
+ 74,100 : true
+ 64,100 : true
+ 12,128 : true
+ 169,38 : true
+ 32,128 : true
+ 22,128 : true
+ 41,128 : true
+ 21,100 : true
+ 31,100 : true
+ 41,100 : true
+ 121,17 : true
+ 196,6 : true
+ 112,16 : true
+ 196,39 : true
+ 34,114 : false
+ 124,25 : true
+ 134,90 : true
+ 196,2 : true
+ 196,1 : true
+ 170,43 : true
+ 117,88 : true
+ 195,49 : true
+ 195,48 : true
+ 127,36 : true
+ 130,40 : true
+ 69,78 : true
+ 28,114 : true
+ 38,114 : true
+ 129,37 : true
+ 18,114 : true
+ 83,100 : false
+ 93,100 : true
+ 63,100 : true
+ 73,100 : true
+ 179,38 : true
+ 11,128 : true
+ 21,128 : true
+ 31,128 : true
+ 14,100 : true
+ 195,43 : true
+ 114,49 : true
+ 171,46 : true
+ 54,100 : true
+ 44,100 : true
+ 34,100 : true
+ 24,100 : true
+ 195,42 : true
+ 195,41 : true
+ 162,24 : true
+ 195,39 : true
+ 195,38 : true
+ 76,54 : true
+ 195,36 : true
+ 119,53 : true
+ 195,34 : true
+ 195,33 : true
+ 195,32 : true
+ 142,72 : true
+ 37,114 : true
+ 27,114 : true
+ 17,114 : true
+ 159,14 : true
+ 169,25 : true
+ 92,100 : true
+ 195,30 : true
+ 47,114 : true
+ 62,100 : true
+ 52,100 : true
+ 82,100 : true
+ 72,100 : false
+ 195,27 : true
+ 195,26 : true
+ 181,46 : true
+ 146,3 : true
+ 132,16 : true
+ 195,24 : true
+ 139,77 : true
+ 103,10 : true
+ 44,106 : true
+ 195,22 : true
+ 144,91 : true
+ 104,25 : true
+ 137,88 : true
+ 195,20 : true
+ 195,19 : true
+ 112,48 : false
+ 3,107 : true
+ 2,107 : false
+ 12,114 : true
+ 4,107 : true
+ 7,107 : true
+ 6,107 : true
+ 9,107 : true
+ 8,107 : true
+ 91,100 : true
+ 195,18 : true
+ 187,40 : true
+ 23,139 : true
+ 51,100 : true
+ 61,100 : true
+ 71,100 : false
+ 81,100 : true
+ 22,100 : true
+ 12,100 : true
+ 42,100 : true
+ 32,100 : true
+ 170,17 : true
+ 131,52 : true
+ 151,46 : true
+ 101,76 : true
+ 134,25 : true
+ 113,10 : true
+ 103,55 : true
+ 195,14 : true
+ 195,12 : true
+ 176,36 : true
+ 122,48 : true
+ 127,88 : true
+ 111,70 : false
+ 62,72 : true
+ 21,114 : true
+ 11,114 : true
+ 37,105 : true
+ 200,40 : true
+ 36,131 : true
+ 195,6 : true
+ 195,5 : true
+ 6,91 : true
+ 142,64 : true
+ 90,100 : true
+ 41,114 : true
+ 70,100 : true
+ 60,100 : true
+ 50,100 : true
+ 195,3 : true
+ 195,2 : true
+ 146,66 : true
+ 195,1 : true
+ 119,77 : false
+ 160,17 : true
+ 194,50 : true
+ 161,46 : true
+ 123,10 : true
+ 194,47 : false
+ 116,13 : true
+ 194,45 : true
+ 122,23 : true
+ 145,53 : true
+ 164,25 : false
+ 2,123 : true
+ 14,114 : true
+ 24,114 : true
+ 132,68 : true
+ 129,19 : true
+ 194,39 : true
+ 116,50 : true
+ 99,97 : false
+ 91,78 : true
+ 79,97 : true
+ 89,97 : true
+ 59,97 : true
+ 69,97 : true
+ 39,97 : true
+ 49,97 : false
+ 19,97 : true
+ 44,114 : true
+ 40,100 : true
+ 30,100 : true
+ 20,100 : true
+ 10,100 : true
+ 131,46 : true
+ 122,16 : true
+ 147,83 : true
+ 167,31 : true
+ 18,70 : true
+ 191,13 : true
+ 114,25 : true
+ 133,10 : true
+ 102,48 : true
+ 147,88 : true
+ 150,62 : true
+ 194,33 : true
+ 23,114 : true
+ 13,114 : true
+ 194,32 : true
+ 163,7 : true
+ 194,31 : true
+ 138,84 : true
+ 194,30 : false
+ 133,24 : true
+ 89,78 : true
+ 194,28 : true
+ 132,83 : true
+ 194,27 : true
+ 194,26 : true
+ 172,9 : false
+ 43,114 : true
+ 33,114 : true
+ 194,25 : true
+ 194,24 : true
+ 147,36 : true
+ 16,55 : true
+ 26,55 : false
+ 36,55 : true
+ 46,55 : true
+ 56,55 : true
+ 194,23 : false
+ 194,22 : true
+ 194,21 : true
+ 194,20 : false
+ 164,47 : false
+ 194,19 : false
+ 173,1 : true
+ 154,19 : true
+ 194,16 : true
+ 139,75 : true
+ 173,7 : true
+ 155,48 : true
+ 68,84 : true
+ 44,130 : true
+ 123,24 : true
+ 23,91 : true
+ 194,11 : false
+ 142,83 : true
+ 86,77 : true
+ 191,25 : true
+ 182,9 : true
+ 194,9 : true
+ 194,8 : true
+ 175,20 : true
+ 194,6 : true
+ 194,5 : true
+ 194,4 : true
+ 137,36 : true
+ 134,47 : true
+ 133,41 : true
+ 194,3 : true
+ 143,55 : true
+ 194,2 : true
+ 186,6 : true
+ 193,50 : true
+ 193,49 : true
+ 193,48 : false
+ 34,139 : true
+ 193,46 : true
+ 193,45 : true
+ 193,44 : true
+ 143,7 : false
+ 153,24 : true
+ 193,43 : true
+ 193,42 : true
+ 191,9 : true
+ 193,40 : true
+ 118,84 : true
+ 75,55 : true
+ 65,55 : true
+ 95,55 : true
+ 85,55 : true
+ 193,39 : true
+ 102,64 : true
+ 185,20 : true
+ 141,53 : true
+ 117,11 : true
+ 14,55 : true
+ 120,33 : true
+ 66,83 : true
+ 44,55 : true
+ 54,55 : true
+ 24,55 : false
+ 34,55 : true
+ 102,3 : true
+ 64,92 : true
+ 193,35 : true
+ 128,49 : true
+ 43,78 : true
+ 193,32 : true
+ 184,47 : true
+ 193,31 : true
+ 40,114 : true
+ 50,114 : true
+ 20,114 : true
+ 30,114 : true
+ 148,84 : false
+ 193,30 : true
+ 193,29 : true
+ 38,87 : true
+ 66,55 : true
+ 76,55 : true
+ 86,55 : true
+ 96,55 : true
+ 77,68 : true
+ 10,114 : true
+ 105,56 : true
+ 7,114 : true
+ 193,24 : true
+ 193,23 : true
+ 15,55 : false
+ 110,33 : true
+ 35,55 : true
+ 25,55 : true
+ 55,55 : true
+ 45,55 : true
+ 193,22 : true
+ 112,3 : true
+ 193,21 : true
+ 193,20 : true
+ 104,76 : true
+ 154,47 : true
+ 193,19 : true
+ 193,18 : true
+ 6,52 : true
+ 5,52 : true
+ 8,52 : true
+ 7,52 : true
+ 2,52 : true
+ 1,52 : true
+ 4,52 : false
+ 3,52 : true
+ 93,55 : false
+ 83,55 : false
+ 73,55 : true
+ 63,55 : false
+ 90,59 : true
+ 193,16 : true
+ 193,15 : true
+ 103,41 : true
+ 12,55 : true
+ 3,63 : true
+ 6,63 : false
+ 13,79 : true
+ 23,79 : true
+ 33,79 : true
+ 43,79 : true
+ 1,63 : true
+ 193,14 : true
+ 193,13 : true
+ 133,58 : true
+ 188,3 : true
+ 8,63 : true
+ 7,63 : false
+ 193,11 : true
+ 9,63 : true
+ 193,10 : true
+ 15,88 : false
+ 193,7 : true
+ 193,6 : true
+ 135,20 : true
+ 45,144 : true
+ 128,84 : true
+ 193,3 : true
+ 84,55 : true
+ 94,55 : false
+ 64,55 : true
+ 74,55 : false
+ 36,90 : true
+ 193,1 : true
+ 192,50 : true
+ 192,49 : true
+ 13,55 : true
+ 100,60 : true
+ 192,48 : false
+ 119,15 : true
+ 53,55 : true
+ 43,55 : true
+ 33,55 : true
+ 23,55 : false
+ 136,93 : false
+ 192,45 : true
+ 107,15 : true
+ 192,44 : true
+ 46,146 : true
+ 9,52 : true
+ 108,64 : true
+ 174,47 : true
+ 9,64 : true
+ 192,42 : true
+ 136,92 : true
+ 157,41 : true
+ 5,64 : true
+ 6,64 : false
+ 7,64 : true
+ 8,64 : true
+ 1,64 : true
+ 62,79 : true
+ 3,64 : true
+ 4,64 : true
+ 61,55 : true
+ 51,55 : true
+ 81,55 : true
+ 71,55 : true
+ 30,55 : false
+ 40,55 : true
+ 10,55 : true
+ 15,100 : true
+ 41,79 : true
+ 51,79 : true
+ 45,100 : true
+ 31,79 : true
+ 192,40 : true
+ 192,39 : true
+ 192,38 : false
+ 117,15 : true
+ 192,37 : false
+ 101,23 : true
+ 192,36 : true
+ 115,69 : true
+ 192,34 : true
+ 192,33 : true
+ 192,32 : true
+ 192,31 : true
+ 103,24 : true
+ 1,88 : true
+ 2,88 : true
+ 3,88 : true
+ 4,88 : true
+ 5,88 : true
+ 6,88 : true
+ 7,88 : true
+ 52,55 : false
+ 62,55 : true
+ 72,55 : true
+ 82,55 : true
+ 21,55 : true
+ 11,55 : true
+ 41,55 : false
+ 31,55 : true
+ 32,79 : true
+ 22,79 : true
+ 52,79 : true
+ 42,79 : true
+ 192,30 : true
+ 192,29 : true
+ 192,28 : true
+ 192,27 : true
+ 134,12 : true
+ 192,25 : true
+ 183,5 : true
+ 198,3 : true
+ 116,92 : true
+ 192,22 : true
+ 110,94 : false
+ 192,20 : true
+ 140,96 : true
+ 192,19 : true
+ 192,18 : true
+ 165,20 : true
+ 90,79 : true
+ 80,79 : true
+ 70,79 : true
+ 60,79 : true
+ 115,6 : true
+ 137,65 : true
+ 47,86 : true
+ 131,76 : true
+ 17,79 : true
+ 27,79 : true
+ 37,79 : false
+ 47,79 : true
+ 192,14 : false
+ 192,11 : true
+ 148,3 : true
+ 165,41 : true
+ 121,23 : true
+ 192,9 : true
+ 107,52 : true
+ 137,11 : true
+ 133,34 : true
+ 140,61 : true
+ 192,7 : true
+ 32,131 : true
+ 78,76 : true
+ 192,3 : true
+ 148,91 : true
+ 120,94 : true
+ 191,50 : true
+ 131,26 : true
+ 191,49 : true
+ 150,96 : true
+ 81,79 : true
+ 91,79 : true
+ 61,79 : true
+ 71,79 : true
+ 70,55 : true
+ 80,55 : true
+ 50,55 : true
+ 60,55 : true
+ 10,79 : true
+ 103,73 : true
+ 191,48 : true
+ 147,15 : true
+ 50,79 : true
+ 40,79 : true
+ 30,79 : true
+ 20,79 : true
+ 147,11 : true
+ 111,23 : true
+ 184,22 : true
+ 191,46 : true
+ 132,7 : true
+ 123,34 : true
+ 166,5 : true
+ 168,37 : false
+ 130,94 : true
+ 191,43 : true
+ 191,41 : true
+ 148,46 : true
+ 30,139 : false
+ 20,139 : true
+ 10,139 : true
+ 191,38 : true
+ 191,37 : true
+ 96,79 : true
+ 50,139 : true
+ 40,139 : true
+ 66,79 : true
+ 56,79 : true
+ 86,79 : true
+ 76,79 : true
+ 35,79 : true
+ 45,79 : false
+ 15,79 : false
+ 25,79 : true
+ 191,36 : true
+ 191,35 : false
+ 191,34 : true
+ 191,33 : true
+ 44,86 : true
+ 168,3 : true
+ 141,23 : true
+ 191,31 : true
+ 191,30 : true
+ 197,31 : true
+ 197,11 : true
+ 157,11 : true
+ 191,26 : true
+ 106,92 : true
+ 191,24 : true
+ 191,23 : true
+ 191,22 : true
+ 191,20 : true
+ 191,19 : true
+ 151,26 : true
+ 97,79 : true
+ 191,18 : true
+ 191,17 : true
+ 86,92 : true
+ 57,79 : true
+ 67,79 : false
+ 77,79 : true
+ 87,79 : true
+ 26,79 : true
+ 16,79 : true
+ 46,79 : true
+ 36,79 : true
+ 191,15 : true
+ 18,91 : true
+ 167,15 : true
+ 191,11 : true
+ 158,3 : true
+ 191,10 : true
+ 127,11 : true
+ 131,23 : true
+ 187,31 : true
+ 193,41 : true
+ 191,8 : true
+ 156,33 : true
+ 173,24 : true
+ 124,1 : true
+ 191,4 : true
+ 100,96 : true
+ 162,23 : true
+ 150,94 : true
+ 161,26 : true
+ 191,3 : false
+ 191,2 : true
+ 191,1 : false
+ 121,53 : true
+ 94,79 : true
+ 84,79 : true
+ 10,143 : false
+ 64,79 : true
+ 54,79 : true
+ 190,50 : true
+ 190,49 : true
+ 174,23 : true
+ 190,47 : false
+ 133,91 : true
+ 190,46 : true
+ 190,45 : true
+ 124,47 : true
+ 144,49 : true
+ 183,41 : false
+ 122,3 : true
+ 173,34 : true
+ 177,11 : true
+ 104,7 : true
+ 190,43 : true
+ 190,42 : true
+ 110,96 : true
+ 163,24 : true
+ 190,41 : true
+ 190,40 : true
+ 64,52 : true
+ 152,23 : true
+ 190,37 : true
+ 190,35 : true
+ 190,34 : true
+ 182,30 : true
+ 95,79 : true
+ 131,53 : false
+ 75,79 : false
+ 85,79 : true
+ 55,79 : true
+ 65,79 : true
+ 44,79 : true
+ 34,79 : true
+ 24,79 : true
+ 14,79 : true
+ 187,15 : true
+ 143,91 : true
+ 190,32 : false
+ 41,89 : true
+ 173,41 : true
+ 134,49 : true
+ 163,34 : true
+ 132,3 : true
+ 114,7 : true
+ 190,30 : true
+ 190,29 : true
+ 187,11 : true
+ 120,55 : true
+ 120,96 : true
+ 190,27 : true
+ 101,26 : true
+ 190,26 : true
+ 190,24 : true
+ 182,23 : false
+ 83,57 : true
+ 18,55 : true
+ 28,55 : true
+ 116,76 : true
+ 122,74 : true
+ 22,143 : false
+ 39,79 : false
+ 190,20 : true
+ 19,79 : true
+ 89,55 : true
+ 41,143 : true
+ 190,19 : true
+ 99,55 : true
+ 49,55 : true
+ 39,55 : true
+ 69,55 : true
+ 59,55 : true
+ 127,52 : true
+ 190,18 : true
+ 164,49 : true
+ 107,81 : true
+ 190,17 : true
+ 190,16 : true
+ 153,34 : false
+ 124,7 : true
+ 111,26 : true
+ 43,140 : true
+ 190,14 : true
+ 190,13 : true
+ 190,12 : true
+ 11,99 : true
+ 190,10 : true
+ 172,23 : true
+ 177,20 : true
+ 108,84 : true
+ 29,55 : true
+ 19,55 : true
+ 11,143 : true
+ 136,21 : false
+ 31,143 : true
+ 21,143 : true
+ 40,143 : true
+ 50,143 : true
+ 190,7 : true
+ 190,6 : true
+ 190,4 : true
+ 118,3 : true
+ 114,47 : true
+ 44,139 : true
+ 172,37 : true
+ 117,52 : true
+ 117,81 : true
+ 154,49 : true
+ 190,1 : true
+ 167,11 : true
+ 134,7 : false
+ 143,34 : false
+ 127,81 : true
+ 139,83 : false
+ 189,50 : true
+ 189,49 : true
+ 189,48 : true
+ 135,68 : true
+ 125,70 : true
+ 13,59 : true
+ 103,91 : true
+ 189,47 : true
+ 169,21 : true
+ 136,39 : true
+ 22,124 : true
+ 12,124 : true
+ 42,124 : true
+ 32,124 : true
+ 37,78 : false
+ 47,78 : true
+ 57,78 : true
+ 67,78 : true
+ 17,83 : true
+ 27,83 : true
+ 17,78 : true
+ 27,78 : true
+ 16,112 : true
+ 189,46 : true
+ 16,139 : true
+ 26,112 : false
+ 36,139 : true
+ 26,139 : false
+ 97,78 : true
+ 46,139 : true
+ 129,83 : true
+ 137,81 : true
+ 139,14 : true
+ 189,43 : true
+ 189,42 : true
+ 189,41 : true
+ 125,68 : true
+ 127,31 : true
+ 126,39 : true
+ 171,34 : true
+ 189,40 : true
+ 177,29 : true
+ 11,124 : true
+ 21,124 : true
+ 31,124 : true
+ 41,124 : true
+ 48,78 : true
+ 56,83 : true
+ 68,78 : true
+ 58,78 : false
+ 26,83 : true
+ 16,83 : true
+ 46,83 : true
+ 36,83 : true
+ 145,35 : true
+ 17,139 : true
+ 27,112 : true
+ 37,112 : true
+ 47,139 : true
+ 78,78 : true
+ 27,139 : true
+ 37,139 : true
+ 133,21 : true
+ 172,34 : true
+ 147,81 : true
+ 117,31 : true
+ 153,35 : true
+ 15,59 : false
+ 189,34 : true
+ 120,3 : true
+ 149,21 : true
+ 44,124 : true
+ 34,124 : true
+ 24,124 : true
+ 115,17 : true
+ 189,32 : true
+ 111,57 : true
+ 189,31 : true
+ 41,83 : true
+ 51,83 : true
+ 21,83 : true
+ 45,78 : true
+ 14,124 : true
+ 25,78 : false
+ 61,83 : true
+ 71,83 : true
+ 34,112 : false
+ 24,59 : true
+ 35,138 : true
+ 25,138 : true
+ 74,59 : true
+ 45,138 : true
+ 38,139 : true
+ 44,112 : true
+ 104,16 : true
+ 189,29 : true
+ 107,31 : true
+ 56,61 : false
+ 145,68 : true
+ 123,6 : false
+ 14,59 : true
+ 35,140 : false
+ 43,124 : true
+ 157,29 : true
+ 23,124 : true
+ 33,124 : true
+ 118,37 : true
+ 93,72 : true
+ 181,30 : true
+ 105,17 : true
+ 50,83 : true
+ 56,78 : true
+ 30,83 : true
+ 20,83 : true
+ 26,78 : true
+ 13,124 : true
+ 70,83 : true
+ 60,83 : true
+ 23,59 : true
+ 35,112 : true
+ 26,138 : true
+ 15,112 : true
+ 46,138 : true
+ 73,59 : true
+ 45,112 : true
+ 76,78 : true
+ 189,22 : true
+ 149,52 : true
+ 188,44 : true
+ 189,20 : true
+ 100,62 : false
+ 187,29 : true
+ 185,16 : true
+ 170,33 : true
+ 92,61 : false
+ 116,73 : true
+ 184,10 : true
+ 118,36 : true
+ 189,17 : true
+ 189,15 : true
+ 189,14 : true
+ 189,13 : true
+ 144,74 : true
+ 104,28 : true
+ 156,20 : true
+ 189,11 : true
+ 125,1 : false
+ 155,39 : true
+ 189,10 : true
+ 86,64 : true
+ 56,59 : true
+ 12,139 : true
+ 42,139 : true
+ 32,139 : true
+ 96,59 : true
+ 86,59 : true
+ 76,59 : true
+ 66,59 : true
+ 139,52 : true
+ 189,7 : true
+ 189,6 : true
+ 189,5 : true
+ 16,59 : false
+ 189,4 : true
+ 180,33 : true
+ 195,16 : false
+ 126,73 : false
+ 159,21 : true
+ 128,36 : true
+ 189,2 : false
+ 123,47 : true
+ 188,50 : false
+ 188,49 : true
+ 188,48 : true
+ 102,83 : true
+ 134,74 : true
+ 188,47 : true
+ 146,20 : true
+ 147,67 : true
+ 115,1 : true
+ 185,39 : false
+ 138,6 : true
+ 45,59 : false
+ 43,139 : true
+ 25,59 : true
+ 35,59 : true
+ 85,59 : true
+ 95,59 : true
+ 65,59 : true
+ 75,59 : true
+ 188,46 : true
+ 188,45 : true
+ 150,33 : true
+ 119,83 : false
+ 105,70 : true
+ 189,21 : true
+ 188,43 : true
+ 154,4 : true
+ 115,51 : true
+ 41,126 : true
+ 16,67 : true
+ 50,124 : true
+ 40,124 : true
+ 30,124 : true
+ 20,124 : true
+ 10,124 : true
+ 29,78 : true
+ 39,78 : true
+ 55,83 : true
+ 19,78 : true
+ 35,83 : false
+ 45,83 : true
+ 49,78 : true
+ 59,78 : true
+ 60,59 : true
+ 50,59 : true
+ 24,139 : true
+ 14,139 : true
+ 20,59 : true
+ 10,59 : true
+ 40,59 : true
+ 30,59 : true
+ 5,78 : true
+ 4,78 : true
+ 7,78 : true
+ 6,78 : true
+ 9,78 : true
+ 8,78 : true
+ 98,93 : true
+ 188,38 : true
+ 145,17 : true
+ 105,51 : true
+ 106,73 : true
+ 188,37 : true
+ 143,27 : true
+ 104,1 : true
+ 146,91 : true
+ 94,83 : true
+ 84,83 : true
+ 74,83 : true
+ 64,83 : false
+ 54,83 : true
+ 44,83 : true
+ 34,83 : true
+ 24,83 : true
+ 14,83 : true
+ 188,34 : true
+ 188,33 : false
+ 118,14 : true
+ 183,48 : true
+ 1,78 : true
+ 158,19 : true
+ 3,78 : true
+ 2,78 : true
+ 188,30 : true
+ 145,64 : true
+ 129,22 : true
+ 135,51 : true
+ 188,29 : true
+ 188,28 : true
+ 120,5 : false
+ 188,27 : true
+ 135,66 : true
+ 188,26 : true
+ 150,76 : true
+ 145,16 : false
+ 148,70 : true
+ 188,22 : true
+ 178,2 : true
+ 180,35 : true
+ 46,109 : true
+ 188,17 : true
+ 131,56 : true
+ 188,16 : true
+ 107,87 : true
+ 177,19 : true
+ 188,14 : true
+ 92,59 : true
+ 82,59 : false
+ 50,136 : true
+ 43,138 : true
+ 30,136 : true
+ 20,136 : true
+ 13,138 : true
+ 22,59 : true
+ 12,59 : true
+ 135,64 : true
+ 188,13 : true
+ 125,51 : true
+ 143,11 : true
+ 199,21 : true
+ 188,10 : true
+ 188,9 : true
+ 110,5 : false
+ 188,7 : true
+ 171,37 : true
+ 155,16 : true
+ 108,94 : true
+ 40,110 : false
+ 188,2 : false
+ 188,1 : true
+ 187,50 : true
+ 187,49 : true
+ 187,47 : true
+ 187,46 : true
+ 187,45 : true
+ 25,116 : true
+ 187,43 : false
+ 91,59 : true
+ 101,43 : true
+ 71,59 : true
+ 81,59 : true
+ 51,59 : true
+ 44,138 : true
+ 31,59 : true
+ 24,138 : true
+ 11,59 : true
+ 21,59 : true
+ 109,22 : true
+ 11,57 : true
+ 195,17 : true
+ 140,5 : true
+ 187,39 : true
+ 31,99 : true
+ 187,37 : true
+ 186,36 : true
+ 187,35 : true
+ 145,70 : true
+ 1,102 : true
+ 187,33 : true
+ 187,32 : true
+ 127,29 : true
+ 199,15 : true
+ 187,28 : false
+ 136,20 : true
+ 105,26 : false
+ 16,136 : true
+ 140,58 : true
+ 36,136 : true
+ 26,136 : true
+ 187,25 : true
+ 46,136 : true
+ 187,23 : true
+ 187,22 : true
+ 105,49 : true
+ 131,99 : true
+ 133,45 : true
+ 187,20 : false
+ 27,147 : true
+ 187,18 : true
+ 145,51 : true
+ 185,17 : true
+ 130,5 : true
+ 187,17 : true
+ 166,31 : true
+ 149,83 : true
+ 187,14 : true
+ 187,13 : true
+ 108,36 : true
+ 125,66 : true
+ 187,12 : true
+ 187,10 : true
+ 187,9 : true
+ 116,93 : true
+ 102,76 : true
+ 187,8 : true
+ 39,139 : false
+ 49,139 : true
+ 187,7 : true
+ 17,136 : true
+ 27,136 : true
+ 37,136 : true
+ 47,136 : true
+ 29,139 : true
+ 159,28 : true
+ 153,27 : true
+ 141,99 : true
+ 129,86 : false
+ 187,4 : true
+ 187,3 : true
+ 187,2 : true
+ 163,46 : true
+ 175,17 : true
+ 169,22 : true
+ 187,1 : true
+ 186,50 : true
+ 186,49 : true
+ 186,48 : true
+ 105,64 : true
+ 186,47 : true
+ 23,57 : true
+ 174,1 : true
+ 186,45 : true
+ 127,78 : true
+ 105,16 : true
+ 186,43 : true
+ 186,42 : true
+ 107,29 : true
+ 112,68 : true
+ 110,59 : true
+ 186,38 : true
+ 147,87 : true
+ 186,37 : true
+ 187,36 : true
+ 113,48 : true
+ 186,35 : true
+ 37,138 : true
+ 27,138 : true
+ 17,138 : false
+ 139,86 : true
+ 186,34 : true
+ 186,33 : true
+ 142,9 : true
+ 47,138 : false
+ 108,99 : true
+ 186,30 : true
+ 139,22 : true
+ 186,27 : false
+ 172,35 : true
+ 109,91 : false
+ 186,24 : true
+ 186,23 : false
+ 164,1 : false
+ 186,21 : true
+ 186,19 : true
+ 145,66 : true
+ 137,29 : true
+ 115,16 : false
+ 150,77 : true
+ 62,93 : true
+ 100,59 : true
+ 186,16 : true
+ 137,87 : true
+ 104,55 : false
+ 177,36 : true
+ 186,15 : true
+ 186,14 : true
+ 123,48 : true
+ 28,138 : true
+ 38,138 : true
+ 149,86 : true
+ 18,138 : true
+ 186,13 : true
+ 186,12 : true
+ 48,138 : true
+ 186,11 : true
+ 128,81 : true
+ 41,110 : true
+ 8,90 : true
+ 9,90 : true
+ 186,8 : true
+ 200,5 : true
+ 194,1 : true
+ 115,68 : true
+ 186,5 : true
+ 186,4 : true
+ 167,29 : true
+ 186,3 : true
+ 101,74 : true
+ 125,50 : true
+ 106,93 : true
+ 159,32 : true
+ 185,50 : true
+ 185,49 : true
+ 185,48 : true
+ 130,59 : true
+ 185,47 : true
+ 185,46 : true
+ 127,87 : true
+ 139,4 : true
+ 42,136 : true
+ 31,138 : true
+ 168,48 : true
+ 185,44 : true
+ 185,43 : true
+ 185,42 : true
+ 21,138 : true
+ 12,136 : true
+ 123,78 : true
+ 185,40 : true
+ 146,85 : true
+ 26,52 : false
+ 185,36 : true
+ 120,41 : true
+ 49,143 : true
+ 184,1 : true
+ 185,33 : true
+ 185,32 : true
+ 185,31 : true
+ 185,30 : false
+ 137,94 : true
+ 185,26 : false
+ 117,29 : true
+ 135,16 : true
+ 146,90 : true
+ 185,24 : true
+ 120,59 : true
+ 147,96 : true
+ 12,76 : true
+ 103,48 : true
+ 185,18 : true
+ 117,87 : true
+ 2,90 : true
+ 3,90 : true
+ 131,75 : true
+ 1,90 : true
+ 6,90 : true
+ 7,90 : true
+ 12,138 : true
+ 22,138 : true
+ 33,97 : true
+ 43,97 : true
+ 53,97 : true
+ 63,97 : true
+ 121,47 : true
+ 185,14 : false
+ 13,97 : true
+ 23,97 : true
+ 185,13 : true
+ 116,24 : false
+ 10,116 : true
+ 185,10 : true
+ 30,116 : true
+ 20,116 : false
+ 50,116 : true
+ 40,116 : true
+ 69,67 : true
+ 185,8 : true
+ 185,7 : true
+ 185,6 : false
+ 185,5 : true
+ 119,4 : true
+ 21,77 : true
+ 117,96 : true
+ 152,48 : true
+ 185,3 : true
+ 185,2 : true
+ 185,1 : true
+ 109,66 : true
+ 149,84 : true
+ 98,59 : true
+ 134,55 : true
+ 44,97 : true
+ 34,97 : false
+ 64,97 : true
+ 54,97 : true
+ 181,2 : true
+ 131,47 : true
+ 24,97 : true
+ 14,97 : true
+ 184,44 : true
+ 13,116 : true
+ 146,26 : true
+ 118,8 : true
+ 43,116 : true
+ 74,97 : true
+ 23,116 : true
+ 33,116 : true
+ 132,35 : true
+ 143,35 : true
+ 105,66 : false
+ 184,39 : true
+ 184,38 : true
+ 107,67 : true
+ 129,4 : false
+ 184,37 : true
+ 5,59 : false
+ 4,59 : true
+ 3,59 : true
+ 2,59 : true
+ 9,59 : true
+ 8,59 : true
+ 7,59 : false
+ 6,59 : true
+ 25,97 : true
+ 35,97 : true
+ 9,114 : true
+ 8,114 : true
+ 65,97 : true
+ 19,63 : false
+ 45,97 : false
+ 55,97 : true
+ 184,36 : true
+ 43,150 : true
+ 1,114 : true
+ 95,97 : true
+ 3,114 : true
+ 2,114 : true
+ 5,114 : true
+ 4,114 : true
+ 184,34 : true
+ 184,33 : true
+ 184,32 : true
+ 124,9 : true
+ 111,76 : true
+ 184,30 : true
+ 35,56 : true
+ 184,28 : true
+ 184,27 : true
+ 184,26 : true
+ 132,48 : true
+ 184,23 : true
+ 191,47 : true
+ 114,55 : true
+ 200,4 : true
+ 127,21 : true
+ 36,97 : true
+ 26,97 : true
+ 16,97 : true
+ 110,4 : true
+ 76,97 : true
+ 66,97 : true
+ 56,97 : true
+ 46,97 : true
+ 32,65 : true
+ 184,17 : false
+ 96,97 : true
+ 11,116 : true
+ 21,116 : true
+ 31,116 : true
+ 41,116 : true
+ 138,15 : true
+ 178,34 : true
+ 96,62 : true
+ 7,60 : true
+ 184,13 : false
+ 109,4 : false
+ 121,76 : true
+ 70,58 : true
+ 184,11 : true
+ 108,11 : true
+ 189,18 : false
+ 184,9 : false
+ 142,48 : true
+ 124,55 : true
+ 184,8 : true
+ 184,6 : true
+ 184,5 : true
+ 184,4 : true
+ 184,3 : true
+ 120,4 : true
+ 184,2 : true
+ 110,6 : true
+ 28,139 : true
+ 121,82 : true
+ 144,23 : true
+ 183,46 : true
+ 9,74 : true
+ 183,45 : true
+ 183,44 : true
+ 6,74 : true
+ 5,74 : true
+ 8,74 : true
+ 7,74 : true
+ 183,43 : true
+ 183,42 : true
+ 113,1 : true
+ 183,39 : true
+ 183,38 : true
+ 183,37 : true
+ 116,53 : true
+ 183,36 : true
+ 5,53 : false
+ 6,53 : true
+ 3,53 : true
+ 4,53 : true
+ 1,53 : true
+ 2,53 : true
+ 183,35 : false
+ 183,34 : true
+ 70,97 : true
+ 60,97 : true
+ 90,97 : true
+ 80,97 : true
+ 134,23 : true
+ 37,53 : true
+ 183,32 : true
+ 131,82 : true
+ 149,46 : true
+ 194,36 : true
+ 10,97 : false
+ 183,29 : true
+ 30,97 : true
+ 20,97 : true
+ 50,97 : true
+ 40,97 : true
+ 2,74 : true
+ 1,74 : true
+ 4,74 : true
+ 3,74 : true
+ 55,78 : true
+ 42,61 : true
+ 183,26 : true
+ 126,53 : true
+ 49,63 : true
+ 59,63 : true
+ 29,63 : true
+ 39,63 : true
+ 89,63 : false
+ 99,63 : true
+ 69,63 : true
+ 79,63 : true
+ 51,97 : false
+ 61,97 : true
+ 31,97 : true
+ 41,97 : true
+ 1,59 : true
+ 21,97 : true
+ 141,47 : true
+ 183,25 : true
+ 183,24 : true
+ 183,23 : true
+ 109,74 : true
+ 168,15 : true
+ 91,97 : true
+ 183,22 : true
+ 71,97 : true
+ 81,97 : true
+ 183,21 : true
+ 39,93 : true
+ 183,19 : true
+ 142,77 : false
+ 183,17 : true
+ 98,63 : true
+ 130,54 : true
+ 183,15 : true
+ 68,63 : true
+ 58,63 : true
+ 88,63 : true
+ 78,63 : false
+ 28,63 : true
+ 18,63 : false
+ 48,63 : true
+ 38,63 : true
+ 62,97 : true
+ 52,97 : true
+ 42,97 : true
+ 32,97 : true
+ 22,97 : true
+ 12,97 : false
+ 7,53 : false
+ 8,53 : true
+ 178,15 : false
+ 183,14 : true
+ 127,92 : true
+ 170,40 : true
+ 183,13 : true
+ 92,97 : true
+ 82,97 : true
+ 72,97 : true
+ 183,12 : true
+ 67,86 : true
+ 183,10 : true
+ 183,9 : true
+ 97,63 : true
+ 106,53 : true
+ 25,131 : true
+ 183,7 : true
+ 57,63 : true
+ 67,63 : true
+ 77,63 : true
+ 87,63 : true
+ 17,63 : true
+ 27,63 : true
+ 37,63 : false
+ 47,63 : true
+ 104,23 : true
+ 134,45 : true
+ 168,20 : true
+ 139,7 : true
+ 192,24 : true
+ 183,4 : true
+ 183,2 : true
+ 183,1 : true
+ 182,50 : false
+ 135,17 : true
+ 182,49 : false
+ 137,92 : true
+ 182,48 : true
+ 127,3 : false
+ 182,47 : true
+ 109,73 : true
+ 158,11 : true
+ 182,45 : true
+ 91,83 : true
+ 128,52 : true
+ 83,68 : true
+ 126,34 : false
+ 150,91 : true
+ 96,63 : false
+ 86,63 : true
+ 76,63 : true
+ 66,63 : false
+ 56,63 : true
+ 46,63 : false
+ 36,63 : true
+ 26,63 : true
+ 16,63 : true
+ 158,50 : true
+ 44,77 : true
+ 170,4 : true
+ 178,20 : true
+ 182,39 : true
+ 128,65 : true
+ 182,38 : true
+ 182,37 : true
+ 4,75 : true
+ 5,75 : true
+ 2,75 : true
+ 3,75 : true
+ 8,75 : true
+ 9,75 : true
+ 6,75 : true
+ 7,75 : true
+ 182,36 : true
+ 182,35 : true
+ 118,52 : true
+ 128,11 : true
+ 116,34 : true
+ 1,75 : true
+ 95,63 : true
+ 182,34 : true
+ 75,63 : true
+ 85,63 : true
+ 55,63 : true
+ 65,63 : true
+ 35,63 : true
+ 45,63 : true
+ 15,63 : true
+ 25,63 : true
+ 34,146 : true
+ 182,32 : true
+ 63,76 : true
+ 180,4 : true
+ 101,82 : true
+ 190,33 : true
+ 120,62 : true
+ 147,74 : false
+ 182,28 : true
+ 117,92 : true
+ 182,27 : true
+ 134,58 : true
+ 112,30 : true
+ 182,25 : true
+ 137,96 : true
+ 182,24 : true
+ 35,139 : true
+ 182,20 : true
+ 138,11 : true
+ 136,53 : true
+ 11,129 : true
+ 182,18 : true
+ 136,64 : true
+ 182,15 : true
+ 182,14 : true
+ 182,13 : true
+ 182,11 : true
+ 167,39 : false
+ 117,94 : true
+ 179,18 : true
+ 182,8 : true
+ 182,7 : true
+ 36,113 : true
+ 114,23 : true
+ 112,88 : true
+ 182,3 : false
+ 122,30 : true
+ 111,82 : true
+ 152,14 : true
+ 108,65 : true
+ 181,50 : true
+ 181,49 : true
+ 181,48 : true
+ 180,39 : true
+ 181,45 : true
+ 106,39 : true
+ 165,30 : true
+ 181,43 : false
+ 181,42 : true
+ 171,5 : true
+ 146,53 : true
+ 181,39 : true
+ 34,150 : true
+ 181,37 : true
+ 188,11 : true
+ 181,35 : true
+ 181,33 : true
+ 181,32 : true
+ 181,31 : true
+ 177,15 : true
+ 181,28 : true
+ 127,94 : true
+ 156,47 : false
+ 181,26 : false
+ 167,3 : false
+ 181,25 : true
+ 181,24 : true
+ 181,23 : true
+ 181,22 : false
+ 132,30 : true
+ 118,65 : true
+ 181,20 : true
+ 36,124 : true
+ 26,124 : true
+ 181,19 : true
+ 46,124 : true
+ 174,45 : true
+ 110,91 : true
+ 41,51 : true
+ 148,31 : true
+ 23,83 : true
+ 33,83 : true
+ 43,83 : true
+ 53,83 : true
+ 63,83 : true
+ 73,83 : true
+ 16,124 : false
+ 93,83 : true
+ 93,88 : true
+ 181,14 : true
+ 181,11 : true
+ 19,53 : true
+ 151,23 : true
+ 181,8 : false
+ 171,47 : false
+ 13,83 : true
+ 181,6 : true
+ 105,47 : true
+ 181,5 : true
+ 181,4 : true
+ 184,45 : false
+ 181,1 : true
+ 136,50 : true
+ 15,93 : false
+ 25,124 : true
+ 35,124 : true
+ 45,124 : true
+ 180,49 : true
+ 120,91 : true
+ 175,2 : true
+ 180,47 : true
+ 180,46 : true
+ 32,83 : true
+ 22,83 : true
+ 52,83 : true
+ 42,83 : true
+ 72,83 : true
+ 62,83 : true
+ 92,83 : false
+ 15,124 : true
+ 180,45 : true
+ 109,37 : true
+ 180,42 : true
+ 180,41 : true
+ 180,40 : true
+ 181,47 : true
+ 12,83 : true
+ 180,37 : true
+ 188,20 : true
+ 180,34 : true
+ 180,32 : false
+ 180,31 : true
+ 180,30 : true
+ 110,57 : false
+ 180,29 : true
+ 146,50 : true
+ 121,5 : true
+ 141,82 : true
+ 180,27 : true
+ 180,26 : true
+ 180,25 : true
+ 154,45 : true
+ 180,23 : true
+ 109,21 : true
+ 144,4 : false
+ 107,28 : true
+ 160,12 : true
+ 115,66 : true
+ 103,7 : false
+ 178,11 : true
+ 132,76 : true
+ 106,34 : true
+ 135,69 : true
+ 180,20 : true
+ 48,112 : false
+ 38,112 : true
+ 28,112 : true
+ 18,112 : true
+ 171,23 : true
+ 180,19 : true
+ 148,65 : true
+ 198,20 : true
+ 180,17 : true
+ 101,65 : true
+ 138,71 : true
+ 93,58 : false
+ 180,14 : true
+ 180,13 : false
+ 180,12 : true
+ 180,11 : true
+ 146,39 : true
+ 144,7 : true
+ 139,21 : false
+ 180,9 : true
+ 137,3 : true
+ 125,99 : true
+ 54,59 : true
+ 49,111 : true
+ 135,49 : true
+ 59,94 : true
+ 172,29 : true
+ 113,7 : true
+ 107,96 : true
+ 127,67 : true
+ 180,1 : true
+ 125,69 : true
+ 39,112 : true
+ 49,112 : true
+ 19,112 : true
+ 29,112 : false
+ 179,50 : true
+ 161,47 : true
+ 179,49 : false
+ 117,89 : true
+ 101,29 : true
+ 179,48 : true
+ 179,47 : true
+ 179,46 : true
+ 128,21 : true
+ 41,150 : true
+ 179,43 : false
+ 179,42 : true
+ 122,75 : true
+ 6,125 : true
+ 140,46 : true
+ 176,25 : true
+ 179,40 : true
+ 144,88 : true
+ 131,37 : true
+ 150,72 : true
+ 22,130 : true
+ 12,130 : true
+ 179,36 : true
+ 140,88 : true
+ 122,57 : true
+ 118,50 : true
+ 107,6 : true
+ 18,149 : true
+ 179,35 : false
+ 59,65 : true
+ 42,130 : true
+ 32,130 : false
+ 28,149 : false
+ 38,149 : true
+ 9,110 : true
+ 67,80 : true
+ 158,21 : true
+ 179,32 : true
+ 5,110 : true
+ 6,110 : false
+ 7,110 : true
+ 8,110 : true
+ 1,110 : true
+ 2,110 : false
+ 3,110 : true
+ 4,110 : true
+ 166,25 : true
+ 179,31 : true
+ 59,67 : false
+ 150,46 : true
+ 13,130 : true
+ 23,130 : true
+ 179,29 : false
+ 179,28 : true
+ 130,88 : true
+ 179,27 : true
+ 128,50 : true
+ 112,57 : true
+ 17,149 : true
+ 123,30 : false
+ 179,25 : true
+ 117,6 : true
+ 47,146 : true
+ 47,149 : true
+ 33,130 : false
+ 43,130 : true
+ 108,8 : true
+ 179,22 : true
+ 105,88 : true
+ 136,67 : true
+ 112,52 : true
+ 131,55 : true
+ 179,21 : true
+ 124,78 : true
+ 2,95 : false
+ 1,95 : true
+ 100,65 : true
+ 179,17 : true
+ 179,16 : true
+ 126,1 : true
+ 160,46 : true
+ 130,91 : true
+ 116,65 : false
+ 179,15 : true
+ 119,36 : true
+ 179,14 : true
+ 38,130 : true
+ 28,130 : true
+ 18,130 : true
+ 179,13 : false
+ 16,149 : true
+ 26,149 : true
+ 36,149 : true
+ 46,149 : true
+ 145,25 : true
+ 22,81 : true
+ 179,10 : true
+ 179,9 : true
+ 178,21 : true
+ 179,7 : true
+ 126,67 : true
+ 179,5 : true
+ 179,4 : true
+ 102,52 : true
+ 27,87 : true
+ 179,2 : true
+ 131,42 : true
+ 197,23 : true
+ 170,46 : true
+ 132,75 : true
+ 116,1 : false
+ 147,89 : true
+ 140,91 : true
+ 178,49 : true
+ 178,48 : false
+ 126,65 : true
+ 11,130 : true
+ 21,130 : true
+ 105,5 : true
+ 178,47 : true
+ 178,46 : true
+ 178,44 : true
+ 25,149 : true
+ 15,149 : true
+ 45,149 : true
+ 35,149 : true
+ 31,130 : true
+ 41,130 : true
+ 137,6 : true
+ 178,43 : false
+ 17,105 : true
+ 168,21 : true
+ 9,148 : true
+ 118,55 : true
+ 92,84 : true
+ 2,55 : false
+ 72,84 : true
+ 82,84 : true
+ 178,38 : true
+ 178,37 : true
+ 134,81 : true
+ 104,82 : true
+ 178,36 : true
+ 147,23 : true
+ 135,33 : true
+ 184,16 : true
+ 108,83 : true
+ 178,32 : false
+ 100,88 : true
+ 161,27 : true
+ 16,130 : true
+ 178,30 : true
+ 36,130 : true
+ 26,130 : true
+ 63,84 : true
+ 46,130 : true
+ 43,84 : true
+ 33,84 : false
+ 23,84 : true
+ 13,84 : true
+ 178,29 : false
+ 147,6 : true
+ 110,26 : true
+ 178,26 : true
+ 178,25 : true
+ 178,24 : true
+ 85,84 : true
+ 9,143 : true
+ 178,23 : true
+ 95,84 : true
+ 6,143 : false
+ 5,143 : true
+ 8,143 : true
+ 7,143 : false
+ 2,143 : true
+ 1,143 : true
+ 4,143 : true
+ 3,143 : true
+ 3,111 : false
+ 4,111 : true
+ 5,111 : true
+ 6,111 : true
+ 27,130 : true
+ 37,130 : true
+ 1,111 : true
+ 2,111 : true
+ 52,84 : true
+ 62,84 : true
+ 32,84 : true
+ 42,84 : false
+ 12,84 : true
+ 8,111 : true
+ 9,111 : true
+ 101,90 : true
+ 178,22 : true
+ 108,24 : true
+ 196,25 : true
+ 178,14 : true
+ 178,13 : true
+ 144,55 : true
+ 178,9 : true
+ 178,8 : false
+ 178,7 : true
+ 124,82 : true
+ 178,6 : true
+ 178,5 : true
+ 178,4 : true
+ 178,3 : true
+ 188,21 : true
+ 167,23 : true
+ 178,1 : false
+ 177,50 : true
+ 82,67 : true
+ 142,57 : true
+ 177,47 : true
+ 177,46 : true
+ 177,45 : true
+ 156,37 : true
+ 137,1 : true
+ 3,126 : true
+ 177,41 : true
+ 143,74 : true
+ 199,10 : true
+ 111,27 : true
+ 138,50 : true
+ 106,31 : true
+ 24,89 : true
+ 177,35 : true
+ 130,33 : false
+ 186,25 : false
+ 177,32 : true
+ 93,84 : true
+ 83,84 : true
+ 73,84 : true
+ 142,52 : true
+ 177,31 : false
+ 177,30 : true
+ 124,81 : true
+ 177,28 : true
+ 191,29 : true
+ 157,23 : true
+ 24,76 : true
+ 130,92 : true
+ 148,11 : false
+ 132,57 : true
+ 177,24 : true
+ 177,23 : true
+ 15,130 : true
+ 25,130 : true
+ 35,130 : false
+ 45,130 : true
+ 145,5 : true
+ 19,149 : true
+ 177,22 : true
+ 39,149 : false
+ 29,149 : true
+ 177,21 : true
+ 49,149 : true
+ 8,89 : true
+ 7,89 : true
+ 6,89 : true
+ 5,89 : true
+ 4,89 : true
+ 3,89 : true
+ 2,89 : true
+ 1,89 : true
+ 151,39 : true
+ 188,15 : true
+ 94,78 : true
+ 167,2 : true
+ 181,29 : true
+ 160,48 : true
+ 117,85 : true
+ 136,79 : false
+ 46,131 : true
+ 177,12 : true
+ 177,10 : true
+ 6,79 : true
+ 108,71 : true
+ 177,7 : true
+ 177,6 : true
+ 177,5 : false
+ 135,5 : true
+ 119,29 : true
+ 177,3 : true
+ 177,2 : false
+ 177,1 : true
+ 108,23 : true
+ 176,50 : true
+ 148,51 : true
+ 130,97 : true
+ 176,49 : true
+ 176,48 : true
+ 106,49 : true
+ 39,118 : true
+ 29,118 : true
+ 19,118 : true
+ 176,47 : true
+ 176,46 : true
+ 141,39 : true
+ 176,44 : true
+ 49,118 : false
+ 170,48 : true
+ 129,76 : false
+ 41,144 : true
+ 171,29 : true
+ 41,81 : true
+ 139,25 : true
+ 176,37 : true
+ 176,35 : true
+ 176,34 : true
+ 176,33 : true
+ 141,1 : true
+ 176,31 : true
+ 176,30 : true
+ 133,9 : true
+ 176,26 : true
+ 125,5 : true
+ 130,2 : true
+ 176,24 : false
+ 138,51 : true
+ 9,89 : true
+ 100,97 : true
+ 176,23 : false
+ 18,118 : true
+ 28,118 : true
+ 176,21 : true
+ 127,93 : true
+ 127,82 : true
+ 176,19 : true
+ 133,96 : true
+ 131,39 : true
+ 26,116 : true
+ 110,100 : true
+ 38,118 : true
+ 48,118 : true
+ 161,29 : true
+ 140,48 : true
+ 120,88 : true
+ 176,15 : true
+ 176,14 : true
+ 104,47 : true
+ 22,84 : true
+ 176,11 : true
+ 151,27 : true
+ 176,10 : true
+ 88,75 : true
+ 176,8 : true
+ 115,5 : true
+ 176,7 : true
+ 176,6 : true
+ 128,51 : true
+ 87,92 : true
+ 104,64 : true
+ 11,100 : true
+ 110,97 : true
+ 27,118 : true
+ 17,118 : true
+ 176,3 : true
+ 122,12 : true
+ 159,15 : true
+ 137,82 : true
+ 19,130 : true
+ 29,130 : true
+ 39,130 : true
+ 49,130 : true
+ 47,118 : true
+ 37,118 : false
+ 150,48 : true
+ 175,50 : false
+ 175,49 : true
+ 110,88 : true
+ 175,47 : true
+ 175,46 : true
+ 175,45 : true
+ 154,1 : true
+ 175,42 : false
+ 141,27 : true
+ 175,41 : true
+ 175,40 : true
+ 175,39 : true
+ 150,86 : true
+ 118,51 : true
+ 175,38 : true
+ 110,2 : true
+ 175,37 : true
+ 175,36 : true
+ 17,97 : true
+ 27,97 : true
+ 37,97 : true
+ 47,97 : true
+ 57,97 : true
+ 67,97 : true
+ 77,97 : true
+ 87,97 : true
+ 97,97 : true
+ 136,25 : true
+ 141,29 : true
+ 175,35 : true
+ 125,88 : true
+ 148,47 : true
+ 175,33 : true
+ 175,32 : true
+ 175,31 : false
+ 175,30 : true
+ 138,65 : true
+ 52,52 : true
+ 191,39 : true
+ 175,24 : false
+ 200,2 : true
+ 34,149 : true
+ 44,149 : true
+ 14,149 : true
+ 24,149 : true
+ 110,72 : false
+ 175,22 : true
+ 23,65 : true
+ 175,5 : true
+ 18,97 : true
+ 175,19 : true
+ 38,97 : true
+ 28,97 : true
+ 58,97 : true
+ 48,97 : true
+ 78,97 : true
+ 68,97 : true
+ 98,97 : true
+ 88,97 : true
+ 120,100 : true
+ 126,25 : true
+ 115,88 : true
+ 175,18 : true
+ 175,16 : true
+ 101,57 : true
+ 155,33 : true
+ 109,36 : true
+ 175,13 : true
+ 114,64 : true
+ 100,72 : true
+ 175,10 : false
+ 175,9 : true
+ 175,8 : true
+ 43,149 : true
+ 33,149 : true
+ 23,149 : true
+ 13,149 : true
+ 165,5 : true
+ 175,7 : true
+ 175,6 : true
+ 115,59 : false
+ 98,100 : true
+ 175,3 : true
+ 180,48 : true
+ 123,45 : true
+ 175,1 : true
+ 174,50 : false
+ 174,46 : true
+ 124,16 : true
+ 116,25 : true
+ 121,29 : true
+ 171,39 : true
+ 121,62 : true
+ 145,100 : true
+ 117,64 : true
+ 174,41 : true
+ 145,88 : true
+ 174,40 : false
+ 174,39 : true
+ 59,57 : false
+ 174,37 : true
+ 174,36 : true
+ 167,35 : true
+ 108,41 : true
+ 174,32 : false
+ 134,98 : true
+ 131,90 : true
+ 123,82 : true
+ 174,30 : true
+ 174,29 : true
+ 155,5 : true
+ 130,72 : true
+ 130,30 : true
+ 114,27 : true
+ 174,25 : true
+ 113,45 : true
+ 190,48 : true
+ 174,22 : true
+ 135,37 : true
+ 134,16 : true
+ 174,20 : true
+ 100,100 : true
+ 106,25 : true
+ 174,19 : true
+ 161,39 : true
+ 174,18 : false
+ 174,17 : true
+ 135,88 : true
+ 174,16 : true
+ 140,40 : true
+ 91,55 : true
+ 174,13 : true
+ 97,53 : true
+ 1,145 : true
+ 174,11 : true
+ 3,145 : true
+ 2,145 : false
+ 5,145 : true
+ 4,145 : true
+ 7,145 : false
+ 6,145 : true
+ 9,145 : true
+ 8,145 : true
+ 174,10 : true
+ 53,59 : true
+ 42,118 : false
+ 174,8 : true
+ 22,118 : true
+ 32,118 : true
+ 17,84 : true
+ 129,15 : true
+ 174,6 : false
+ 174,5 : true
+ 174,4 : true
+ 134,61 : false
+ 173,50 : true
+ 173,49 : true
+ 173,48 : true
+ 12,118 : true
+ 157,12 : true
+ 173,47 : true
+ 173,46 : true
+ 153,48 : true
+ 173,45 : false
+ 173,44 : true
+ 8,105 : false
+ 30,86 : false
+ 101,24 : true
+ 173,39 : true
+ 46,84 : true
+ 56,84 : true
+ 26,84 : true
+ 36,84 : true
+ 86,84 : true
+ 96,84 : true
+ 66,84 : true
+ 76,84 : true
+ 3,136 : true
+ 41,118 : true
+ 31,118 : true
+ 21,118 : true
+ 7,136 : true
+ 16,84 : true
+ 5,136 : true
+ 4,136 : true
+ 124,3 : true
+ 32,132 : true
+ 9,136 : true
+ 8,136 : true
+ 11,118 : true
+ 121,11 : true
+ 190,39 : true
+ 173,35 : true
+ 163,48 : true
+ 43,94 : true
+ 171,24 : true
+ 173,32 : true
+ 149,98 : true
+ 173,30 : true
+ 13,101 : true
+ 142,6 : true
+ 39,84 : true
+ 29,84 : true
+ 59,84 : true
+ 49,84 : true
+ 79,84 : true
+ 69,84 : true
+ 99,84 : true
+ 89,84 : true
+ 50,118 : true
+ 166,26 : true
+ 133,61 : true
+ 173,26 : true
+ 10,118 : true
+ 20,118 : false
+ 30,118 : true
+ 40,118 : true
+ 172,49 : true
+ 146,93 : true
+ 173,23 : true
+ 94,92 : true
+ 127,35 : true
+ 173,21 : true
+ 92,75 : false
+ 173,19 : true
+ 141,75 : true
+ 173,17 : true
+ 117,63 : false
+ 133,48 : false
+ 121,24 : true
+ 173,15 : true
+ 173,14 : true
+ 173,12 : false
+ 16,146 : true
+ 26,146 : true
+ 173,11 : true
+ 54,78 : true
+ 173,6 : true
+ 120,50 : true
+ 125,59 : true
+ 49,70 : true
+ 194,18 : true
+ 172,50 : true
+ 147,85 : true
+ 143,61 : false
+ 49,146 : true
+ 39,146 : true
+ 173,25 : true
+ 172,48 : true
+ 134,100 : false
+ 63,52 : true
+ 172,45 : true
+ 102,27 : true
+ 172,43 : false
+ 172,42 : true
+ 123,88 : true
+ 101,11 : true
+ 172,40 : true
+ 172,39 : true
+ 143,48 : true
+ 30,92 : true
+ 190,2 : true
+ 148,54 : true
+ 172,36 : true
+ 111,24 : false
+ 57,84 : true
+ 47,84 : true
+ 29,146 : true
+ 27,84 : true
+ 97,84 : true
+ 87,84 : true
+ 77,84 : true
+ 67,84 : true
+ 16,118 : true
+ 26,118 : true
+ 169,15 : true
+ 186,26 : true
+ 38,146 : true
+ 48,146 : true
+ 141,41 : true
+ 189,36 : true
+ 172,33 : true
+ 172,32 : true
+ 115,45 : true
+ 172,31 : true
+ 172,30 : true
+ 112,76 : true
+ 36,118 : true
+ 46,118 : true
+ 180,2 : false
+ 138,54 : true
+ 172,28 : true
+ 132,84 : true
+ 168,47 : true
+ 172,26 : true
+ 172,24 : true
+ 172,22 : true
+ 172,21 : true
+ 172,20 : true
+ 18,146 : true
+ 28,146 : true
+ 38,57 : true
+ 124,64 : true
+ 75,97 : true
+ 172,17 : true
+ 25,118 : true
+ 15,118 : true
+ 51,52 : true
+ 43,146 : true
+ 100,89 : true
+ 172,14 : true
+ 139,15 : true
+ 131,41 : true
+ 172,11 : true
+ 108,25 : true
+ 172,8 : true
+ 172,7 : true
+ 122,76 : true
+ 127,85 : true
+ 45,118 : true
+ 35,118 : false
+ 8,72 : true
+ 7,72 : true
+ 6,72 : true
+ 5,72 : true
+ 4,72 : true
+ 3,72 : true
+ 2,72 : true
+ 1,72 : true
+ 172,6 : true
+ 193,25 : true
+ 172,4 : true
+ 172,3 : true
+ 33,146 : true
+ 23,146 : false
+ 13,146 : false
+ 151,38 : true
+ 24,118 : true
+ 34,118 : true
+ 42,146 : true
+ 172,1 : true
+ 121,41 : true
+ 171,50 : true
+ 19,84 : true
+ 171,49 : false
+ 135,45 : true
+ 171,48 : true
+ 171,45 : true
+ 145,82 : true
+ 137,85 : false
+ 171,44 : true
+ 184,18 : true
+ 14,118 : true
+ 171,42 : true
+ 171,41 : true
+ 160,2 : true
+ 118,54 : true
+ 148,92 : true
+ 171,40 : true
+ 171,38 : false
+ 188,6 : true
+ 28,84 : true
+ 38,84 : true
+ 48,84 : true
+ 58,84 : false
+ 22,146 : false
+ 32,146 : true
+ 88,84 : true
+ 12,146 : true
+ 33,118 : true
+ 23,118 : true
+ 23,120 : true
+ 43,118 : true
+ 171,35 : true
+ 111,41 : false
+ 171,33 : true
+ 18,84 : true
+ 117,35 : true
+ 106,71 : true
+ 171,31 : false
+ 105,45 : true
+ 171,30 : true
+ 154,18 : false
+ 13,118 : false
+ 107,85 : true
+ 12,64 : true
+ 171,27 : true
+ 108,54 : true
+ 150,2 : true
+ 171,26 : true
+ 171,25 : true
+ 171,22 : true
+ 171,20 : false
+ 44,99 : false
+ 41,121 : true
+ 171,16 : true
+ 55,53 : true
+ 15,146 : true
+ 42,90 : true
+ 35,146 : true
+ 25,146 : true
+ 110,89 : true
+ 171,11 : true
+ 171,10 : true
+ 101,73 : true
+ 171,8 : true
+ 111,30 : true
+ 165,31 : true
+ 155,45 : true
+ 109,52 : true
+ 129,10 : false
+ 152,49 : true
+ 181,41 : true
+ 164,18 : true
+ 171,4 : true
+ 105,34 : true
+ 171,3 : true
+ 171,2 : true
+ 128,92 : true
+ 171,1 : false
+ 136,69 : true
+ 170,50 : true
+ 170,49 : true
+ 161,3 : true
+ 132,96 : true
+ 170,47 : true
+ 13,63 : true
+ 23,63 : true
+ 33,63 : true
+ 43,63 : true
+ 53,63 : true
+ 63,63 : true
+ 73,63 : true
+ 123,75 : true
+ 143,92 : true
+ 111,73 : true
+ 140,89 : false
+ 134,18 : true
+ 170,44 : true
+ 195,50 : true
+ 155,31 : true
+ 139,10 : true
+ 125,45 : true
+ 135,82 : true
+ 170,41 : true
+ 170,39 : true
+ 170,37 : true
+ 170,35 : true
+ 14,131 : true
+ 138,92 : true
+ 170,32 : true
+ 126,69 : true
+ 121,33 : true
+ 170,30 : true
+ 170,29 : false
+ 142,96 : true
+ 170,28 : true
+ 170,27 : true
+ 170,26 : false
+ 159,29 : true
+ 169,20 : true
+ 30,65 : true
+ 145,65 : true
+ 170,22 : false
+ 170,21 : true
+ 6,77 : true
+ 7,77 : true
+ 8,77 : true
+ 9,77 : true
+ 170,20 : true
+ 144,18 : true
+ 149,10 : true
+ 170,18 : true
+ 139,1 : true
+ 105,81 : true
+ 106,20 : true
+ 1,77 : true
+ 2,77 : false
+ 3,77 : true
+ 4,77 : true
+ 5,77 : true
+ 170,13 : true
+ 170,12 : false
+ 170,11 : true
+ 108,92 : true
+ 141,3 : true
+ 170,10 : true
+ 145,1 : true
+ 170,9 : false
+ 21,63 : true
+ 31,63 : true
+ 179,20 : false
+ 11,63 : true
+ 61,63 : true
+ 71,63 : true
+ 41,63 : false
+ 51,63 : true
+ 83,63 : true
+ 93,63 : false
+ 107,12 : true
+ 123,92 : true
+ 101,30 : true
+ 35,116 : true
+ 114,18 : true
+ 159,10 : true
+ 115,81 : true
+ 170,6 : true
+ 55,95 : true
+ 170,2 : true
+ 21,146 : false
+ 11,146 : true
+ 41,146 : false
+ 31,146 : true
+ 170,1 : true
+ 169,50 : true
+ 118,92 : true
+ 169,49 : true
+ 198,6 : true
+ 169,47 : true
+ 108,98 : true
+ 135,1 : true
+ 14,63 : true
+ 136,31 : true
+ 34,63 : true
+ 24,63 : true
+ 54,63 : true
+ 44,63 : true
+ 74,63 : true
+ 64,63 : true
+ 113,61 : false
+ 22,131 : true
+ 92,63 : true
+ 82,63 : true
+ 169,44 : true
+ 149,40 : true
+ 136,47 : false
+ 124,18 : true
+ 50,146 : true
+ 156,49 : true
+ 136,89 : true
+ 114,3 : true
+ 10,146 : true
+ 20,146 : false
+ 30,146 : true
+ 40,146 : true
+ 169,42 : true
+ 141,24 : true
+ 169,41 : true
+ 128,35 : true
+ 144,64 : true
+ 131,69 : true
+ 169,36 : true
+ 118,98 : true
+ 199,20 : true
+ 87,62 : true
+ 147,76 : true
+ 113,53 : true
+ 120,85 : true
+ 106,26 : true
+ 150,73 : true
+ 169,32 : true
+ 127,12 : false
+ 123,61 : true
+ 81,63 : true
+ 91,63 : true
+ 165,45 : false
+ 118,21 : true
+ 47,62 : true
+ 146,47 : true
+ 169,29 : false
+ 169,27 : true
+ 146,49 : true
+ 122,65 : true
+ 195,31 : true
+ 15,142 : true
+ 169,23 : true
+ 169,19 : true
+ 169,18 : true
+ 102,96 : true
+ 11,103 : true
+ 169,14 : true
+ 169,13 : true
+ 151,3 : false
+ 169,12 : true
+ 42,110 : true
+ 32,63 : true
+ 22,63 : true
+ 12,63 : false
+ 169,10 : true
+ 72,63 : false
+ 62,63 : true
+ 52,63 : true
+ 42,63 : true
+ 141,52 : true
+ 137,12 : true
+ 126,26 : true
+ 169,7 : true
+ 80,63 : true
+ 70,63 : false
+ 169,5 : true
+ 90,63 : true
+ 102,75 : true
+ 134,3 : true
+ 109,15 : true
+ 109,10 : true
+ 125,34 : true
+ 136,26 : true
+ 82,79 : true
+ 169,2 : true
+ 1,80 : true
+ 108,6 : true
+ 3,80 : false
+ 2,80 : true
+ 5,80 : true
+ 4,80 : true
+ 7,80 : true
+ 6,80 : true
+ 9,80 : true
+ 8,80 : true
+ 169,1 : true
+ 168,50 : true
+ 168,49 : true
+ 185,45 : true
+ 172,27 : true
+ 135,50 : true
+ 5,144 : true
+ 6,144 : true
+ 3,144 : true
+ 4,144 : true
+ 1,144 : true
+ 2,144 : true
+ 117,49 : true
+ 138,21 : true
+ 166,49 : true
+ 50,119 : true
+ 40,119 : true
+ 30,119 : true
+ 20,119 : true
+ 10,119 : true
+ 7,144 : true
+ 8,144 : true
+ 106,69 : false
+ 168,44 : true
+ 109,49 : true
+ 122,96 : true
+ 168,42 : false
+ 88,61 : false
+ 119,69 : true
+ 63,92 : false
+ 40,63 : true
+ 30,63 : true
+ 60,63 : true
+ 50,63 : false
+ 195,45 : true
+ 168,36 : true
+ 20,63 : true
+ 10,63 : false
+ 129,90 : true
+ 101,75 : true
+ 168,34 : true
+ 136,90 : true
+ 24,86 : true
+ 124,52 : true
+ 149,67 : true
+ 160,49 : true
+ 168,30 : true
+ 108,88 : true
+ 101,78 : false
+ 168,29 : true
+ 168,28 : true
+ 168,27 : true
+ 168,26 : true
+ 155,1 : true
+ 116,46 : true
+ 97,55 : true
+ 87,55 : true
+ 77,55 : false
+ 67,55 : true
+ 57,55 : true
+ 47,55 : false
+ 37,55 : true
+ 168,23 : true
+ 1,133 : true
+ 2,133 : true
+ 3,133 : true
+ 4,133 : true
+ 5,133 : true
+ 6,133 : false
+ 7,133 : true
+ 168,22 : true
+ 108,68 : true
+ 126,90 : true
+ 78,80 : true
+ 168,16 : true
+ 133,11 : true
+ 168,13 : true
+ 139,67 : true
+ 27,55 : true
+ 17,55 : true
+ 20,80 : true
+ 168,11 : false
+ 168,10 : true
+ 43,136 : true
+ 168,8 : true
+ 111,46 : true
+ 4,97 : true
+ 3,97 : true
+ 6,97 : true
+ 5,97 : true
+ 58,55 : true
+ 68,55 : true
+ 2,97 : true
+ 1,97 : true
+ 168,7 : false
+ 168,6 : true
+ 124,73 : true
+ 168,5 : true
+ 8,97 : true
+ 7,97 : true
+ 114,63 : true
+ 9,97 : true
+ 108,85 : true
+ 116,90 : true
+ 168,2 : true
+ 121,75 : false
+ 147,1 : true
+ 127,50 : true
+ 141,72 : true
+ 167,50 : true
+ 167,49 : true
+ 167,47 : true
+ 167,46 : true
+ 167,45 : true
+ 152,31 : true
+ 125,85 : true
+ 121,46 : true
+ 45,128 : true
+ 107,95 : true
+ 143,52 : true
+ 167,41 : true
+ 167,40 : true
+ 182,10 : true
+ 130,80 : true
+ 40,72 : true
+ 90,89 : false
+ 167,36 : true
+ 193,34 : true
+ 120,64 : true
+ 167,32 : true
+ 183,30 : true
+ 167,30 : true
+ 167,28 : false
+ 124,63 : true
+ 8,133 : true
+ 9,133 : true
+ 69,58 : true
+ 79,58 : true
+ 89,58 : true
+ 99,58 : true
+ 106,48 : true
+ 118,20 : true
+ 167,26 : true
+ 167,25 : true
+ 167,24 : false
+ 111,78 : true
+ 167,22 : true
+ 122,55 : true
+ 167,21 : true
+ 167,20 : true
+ 193,17 : false
+ 167,18 : true
+ 116,47 : true
+ 117,95 : true
+ 105,40 : true
+ 167,16 : true
+ 167,14 : true
+ 152,10 : true
+ 104,73 : true
+ 167,13 : true
+ 167,12 : true
+ 140,80 : true
+ 134,63 : true
+ 19,58 : true
+ 29,58 : true
+ 39,58 : true
+ 167,10 : true
+ 98,58 : true
+ 88,58 : true
+ 78,58 : true
+ 68,58 : false
+ 58,58 : true
+ 48,58 : true
+ 38,58 : true
+ 33,77 : false
+ 167,8 : true
+ 167,7 : true
+ 167,6 : true
+ 101,46 : true
+ 152,47 : true
+ 167,4 : true
+ 177,16 : true
+ 167,1 : true
+ 166,50 : true
+ 125,81 : false
+ 120,39 : false
+ 166,48 : true
+ 166,47 : true
+ 102,14 : true
+ 166,45 : true
+ 28,58 : true
+ 18,58 : true
+ 150,80 : false
+ 166,44 : true
+ 166,43 : true
+ 144,63 : true
+ 166,42 : false
+ 86,67 : false
+ 97,58 : true
+ 166,39 : true
+ 77,58 : false
+ 87,58 : true
+ 57,58 : true
+ 67,58 : false
+ 37,58 : true
+ 47,58 : true
+ 147,51 : true
+ 166,37 : true
+ 166,36 : true
+ 166,35 : true
+ 130,89 : true
+ 141,20 : true
+ 187,16 : true
+ 102,55 : true
+ 166,30 : true
+ 166,29 : true
+ 115,31 : true
+ 135,81 : true
+ 166,28 : true
+ 172,10 : true
+ 197,21 : true
+ 166,23 : true
+ 17,58 : true
+ 27,58 : true
+ 109,63 : true
+ 166,21 : false
+ 166,18 : true
+ 90,57 : true
+ 166,15 : true
+ 166,14 : true
+ 3,125 : true
+ 2,125 : false
+ 1,125 : false
+ 96,58 : false
+ 7,125 : true
+ 36,58 : true
+ 5,125 : true
+ 4,125 : true
+ 101,6 : true
+ 107,1 : true
+ 9,125 : true
+ 8,125 : true
+ 48,60 : true
+ 197,16 : true
+ 112,55 : true
+ 129,16 : true
+ 145,81 : true
+ 16,56 : true
+ 166,8 : true
+ 129,98 : true
+ 191,44 : true
+ 166,4 : true
+ 105,31 : true
+ 187,21 : true
+ 116,8 : true
+ 166,1 : true
+ 26,58 : false
+ 16,58 : true
+ 165,50 : true
+ 130,27 : true
+ 165,49 : true
+ 165,48 : true
+ 75,58 : true
+ 85,58 : true
+ 95,58 : true
+ 129,27 : true
+ 35,58 : true
+ 45,58 : true
+ 55,58 : true
+ 65,58 : true
+ 165,44 : true
+ 43,102 : true
+ 192,10 : true
+ 165,40 : true
+ 165,39 : true
+ 146,25 : true
+ 165,37 : true
+ 165,36 : true
+ 121,27 : true
+ 144,62 : true
+ 130,39 : true
+ 165,33 : true
+ 165,32 : true
+ 181,44 : true
+ 199,29 : true
+ 165,28 : true
+ 165,27 : true
+ 145,40 : true
+ 15,58 : true
+ 25,58 : true
+ 120,27 : true
+ 46,54 : true
+ 145,22 : true
+ 165,23 : true
+ 11,106 : true
+ 49,124 : true
+ 165,22 : false
+ 141,21 : true
+ 161,48 : true
+ 41,106 : true
+ 19,124 : true
+ 29,124 : true
+ 121,97 : true
+ 19,150 : true
+ 200,20 : true
+ 165,17 : true
+ 49,150 : true
+ 165,16 : true
+ 29,150 : true
+ 39,150 : true
+ 28,51 : true
+ 38,51 : true
+ 48,51 : true
+ 58,51 : true
+ 68,51 : true
+ 78,51 : true
+ 88,51 : true
+ 98,51 : true
+ 135,40 : true
+ 132,61 : true
+ 137,66 : true
+ 103,17 : true
+ 43,59 : true
+ 14,146 : true
+ 24,146 : true
+ 18,51 : true
+ 165,13 : true
+ 10,106 : false
+ 113,17 : true
+ 165,11 : true
+ 40,106 : true
+ 50,106 : true
+ 20,106 : true
+ 30,106 : true
+ 120,90 : true
+ 131,97 : true
+ 110,20 : false
+ 165,8 : true
+ 165,7 : true
+ 9,92 : true
+ 165,3 : true
+ 165,2 : true
+ 37,51 : true
+ 27,51 : true
+ 57,51 : true
+ 47,51 : false
+ 77,51 : true
+ 67,51 : true
+ 97,51 : true
+ 87,51 : false
+ 133,17 : true
+ 147,66 : false
+ 165,1 : true
+ 125,40 : true
+ 164,50 : true
+ 101,72 : true
+ 17,51 : true
+ 100,86 : true
+ 164,48 : true
+ 164,46 : true
+ 164,45 : true
+ 164,44 : true
+ 108,43 : true
+ 146,82 : true
+ 141,48 : false
+ 117,37 : true
+ 133,55 : true
+ 101,97 : true
+ 38,105 : true
+ 164,39 : true
+ 164,38 : true
+ 164,37 : true
+ 164,35 : true
+ 113,34 : true
+ 164,34 : true
+ 164,32 : true
+ 140,39 : true
+ 151,44 : true
+ 69,80 : true
+ 164,30 : true
+ 127,23 : true
+ 25,93 : true
+ 164,28 : true
+ 164,27 : true
+ 115,40 : true
+ 164,26 : true
+ 157,16 : true
+ 164,23 : true
+ 102,10 : false
+ 118,23 : true
+ 138,67 : true
+ 164,20 : true
+ 164,19 : true
+ 164,17 : true
+ 199,36 : true
+ 140,71 : true
+ 27,53 : true
+ 138,43 : true
+ 111,97 : true
+ 164,13 : false
+ 106,24 : true
+ 164,11 : true
+ 164,10 : true
+ 101,58 : true
+ 103,34 : true
+ 108,44 : true
+ 29,51 : true
+ 19,51 : true
+ 141,44 : true
+ 131,25 : true
+ 164,8 : true
+ 164,7 : true
+ 164,6 : false
+ 117,23 : true
+ 164,3 : true
+ 99,51 : true
+ 89,51 : true
+ 79,51 : true
+ 69,51 : true
+ 59,51 : true
+ 49,51 : true
+ 39,51 : true
+ 45,106 : true
+ 35,106 : true
+ 25,106 : true
+ 15,106 : false
+ 121,72 : true
+ 164,2 : true
+ 128,43 : true
+ 163,50 : true
+ 35,150 : true
+ 45,150 : true
+ 15,150 : true
+ 25,150 : true
+ 94,51 : true
+ 60,51 : true
+ 163,45 : true
+ 163,44 : true
+ 54,51 : true
+ 64,51 : true
+ 74,51 : true
+ 84,51 : true
+ 14,51 : true
+ 24,51 : true
+ 34,51 : true
+ 44,51 : false
+ 36,80 : true
+ 163,41 : true
+ 40,95 : true
+ 163,39 : true
+ 130,86 : true
+ 73,79 : true
+ 163,37 : true
+ 114,93 : true
+ 4,54 : true
+ 3,54 : true
+ 14,106 : true
+ 24,106 : true
+ 138,16 : true
+ 111,72 : true
+ 163,35 : true
+ 163,33 : false
+ 46,150 : true
+ 36,150 : false
+ 26,150 : false
+ 16,150 : true
+ 26,61 : true
+ 93,51 : true
+ 149,29 : true
+ 163,30 : true
+ 63,51 : true
+ 53,51 : true
+ 83,51 : true
+ 73,51 : true
+ 23,51 : true
+ 13,51 : true
+ 43,51 : true
+ 33,51 : true
+ 107,16 : true
+ 163,29 : true
+ 110,21 : true
+ 9,54 : false
+ 8,54 : true
+ 7,54 : true
+ 6,54 : true
+ 5,54 : true
+ 23,106 : true
+ 13,106 : true
+ 37,124 : true
+ 33,106 : true
+ 17,124 : false
+ 27,124 : true
+ 128,88 : true
+ 163,28 : true
+ 17,150 : true
+ 27,150 : true
+ 2,70 : true
+ 3,70 : true
+ 4,70 : true
+ 5,70 : true
+ 6,70 : true
+ 7,70 : true
+ 8,70 : true
+ 9,70 : true
+ 26,51 : false
+ 36,51 : true
+ 86,51 : true
+ 96,51 : true
+ 66,51 : true
+ 76,51 : false
+ 141,74 : true
+ 147,95 : true
+ 200,21 : true
+ 117,16 : true
+ 163,25 : true
+ 16,51 : true
+ 110,86 : false
+ 101,25 : false
+ 12,106 : true
+ 22,106 : true
+ 32,106 : true
+ 38,124 : true
+ 28,124 : true
+ 18,124 : true
+ 163,23 : true
+ 118,88 : true
+ 28,150 : true
+ 18,150 : true
+ 48,150 : true
+ 38,150 : true
+ 97,70 : true
+ 130,75 : true
+ 88,62 : true
+ 143,36 : false
+ 55,51 : false
+ 45,51 : true
+ 35,51 : true
+ 25,51 : true
+ 95,51 : true
+ 85,51 : true
+ 75,51 : true
+ 65,51 : true
+ 163,17 : true
+ 36,87 : true
+ 127,16 : true
+ 150,97 : true
+ 15,51 : true
+ 120,86 : true
+ 163,14 : false
+ 134,1 : true
+ 147,93 : true
+ 168,43 : true
+ 163,10 : false
+ 163,9 : true
+ 1,147 : true
+ 126,35 : false
+ 111,9 : true
+ 163,5 : true
+ 39,106 : true
+ 29,106 : true
+ 19,106 : true
+ 163,3 : true
+ 106,1 : true
+ 163,1 : true
+ 162,50 : false
+ 49,106 : true
+ 120,21 : true
+ 16,102 : false
+ 123,83 : true
+ 162,49 : true
+ 46,102 : true
+ 162,48 : true
+ 26,102 : true
+ 36,102 : false
+ 131,57 : true
+ 137,56 : false
+ 98,78 : true
+ 146,36 : true
+ 86,54 : true
+ 109,29 : true
+ 117,76 : true
+ 162,42 : false
+ 162,41 : true
+ 65,65 : true
+ 162,38 : true
+ 162,37 : true
+ 129,75 : true
+ 125,93 : true
+ 162,33 : true
+ 106,37 : false
+ 28,106 : true
+ 10,51 : true
+ 20,51 : true
+ 30,51 : true
+ 40,51 : true
+ 50,51 : true
+ 48,106 : true
+ 70,51 : true
+ 80,51 : true
+ 90,51 : true
+ 19,102 : false
+ 133,83 : true
+ 39,102 : true
+ 29,102 : false
+ 162,31 : true
+ 49,102 : true
+ 162,30 : true
+ 162,29 : true
+ 136,36 : true
+ 41,65 : true
+ 162,27 : true
+ 127,76 : true
+ 160,24 : true
+ 2,138 : true
+ 195,40 : true
+ 162,22 : true
+ 162,21 : true
+ 109,33 : false
+ 162,20 : true
+ 129,67 : true
+ 102,41 : true
+ 112,11 : true
+ 17,106 : true
+ 162,19 : true
+ 37,106 : true
+ 27,106 : false
+ 162,18 : true
+ 47,106 : true
+ 92,51 : true
+ 106,29 : false
+ 72,51 : true
+ 82,51 : true
+ 52,51 : true
+ 62,51 : true
+ 32,51 : true
+ 42,51 : true
+ 12,51 : true
+ 22,51 : true
+ 29,128 : true
+ 39,128 : true
+ 49,128 : true
+ 162,16 : true
+ 55,84 : true
+ 111,62 : true
+ 162,12 : true
+ 150,24 : true
+ 162,11 : true
+ 137,93 : true
+ 162,10 : true
+ 162,9 : true
+ 119,67 : true
+ 162,8 : true
+ 162,7 : true
+ 19,128 : true
+ 30,143 : true
+ 16,106 : true
+ 26,106 : true
+ 36,106 : true
+ 46,106 : true
+ 101,89 : true
+ 35,144 : true
+ 9,105 : false
+ 17,102 : true
+ 7,105 : true
+ 6,105 : true
+ 5,105 : true
+ 4,105 : false
+ 31,51 : true
+ 21,51 : false
+ 27,102 : true
+ 162,4 : true
+ 162,3 : true
+ 151,25 : true
+ 161,50 : true
+ 140,24 : true
+ 161,49 : true
+ 24,53 : true
+ 107,76 : true
+ 161,44 : true
+ 161,43 : false
+ 147,73 : true
+ 107,82 : false
+ 161,42 : false
+ 138,85 : true
+ 161,41 : true
+ 161,40 : true
+ 28,105 : true
+ 161,37 : true
+ 120,48 : true
+ 17,52 : true
+ 30,128 : true
+ 20,128 : true
+ 10,128 : true
+ 122,41 : true
+ 161,35 : true
+ 161,34 : true
+ 109,87 : true
+ 130,32 : false
+ 198,1 : true
+ 111,7 : true
+ 178,31 : true
+ 160,21 : true
+ 161,25 : true
+ 161,24 : true
+ 161,23 : true
+ 161,22 : true
+ 161,21 : true
+ 130,24 : true
+ 161,20 : true
+ 78,92 : false
+ 161,18 : true
+ 161,17 : true
+ 117,82 : true
+ 137,73 : true
+ 148,61 : true
+ 18,93 : true
+ 102,11 : true
+ 161,14 : true
+ 161,13 : true
+ 161,11 : false
+ 29,65 : true
+ 130,48 : true
+ 161,9 : true
+ 109,47 : true
+ 112,41 : true
+ 161,7 : true
+ 156,21 : true
+ 42,128 : true
+ 161,5 : true
+ 161,4 : true
+ 190,21 : true
+ 161,1 : true
+ 8,142 : true
+ 168,31 : true
+ 160,47 : true
+ 103,20 : true
+ 160,44 : true
+ 109,90 : true
+ 160,42 : true
+ 160,41 : true
+ 160,40 : true
+ 160,39 : true
+ 106,35 : true
+ 160,37 : true
+ 10,137 : true
+ 160,33 : true
+ 160,32 : true
+ 160,31 : true
+ 160,30 : true
+ 118,85 : true
+ 160,29 : true
+ 1,66 : false
+ 160,27 : true
+ 200,48 : true
+ 160,25 : true
+ 142,41 : true
+ 160,23 : true
+ 160,22 : true
+ 160,20 : true
+ 160,18 : true
+ 139,35 : true
+ 160,15 : true
+ 102,23 : true
+ 180,21 : true
+ 20,101 : true
+ 144,59 : true
+ 160,9 : false
+ 123,17 : true
+ 125,14 : true
+ 160,7 : true
+ 137,76 : true
+ 149,92 : false
+ 5,113 : true
+ 160,5 : true
+ 160,4 : false
+ 97,72 : true
+ 160,1 : true
+ 134,82 : true
+ 128,85 : true
+ 101,94 : false
+ 159,49 : true
+ 159,48 : true
+ 3,73 : true
+ 4,73 : true
+ 5,73 : true
+ 6,73 : true
+ 132,41 : true
+ 159,47 : true
+ 1,73 : true
+ 2,73 : false
+ 159,46 : true
+ 29,97 : true
+ 50,128 : true
+ 40,128 : true
+ 7,73 : true
+ 8,73 : true
+ 9,73 : true
+ 117,39 : true
+ 156,36 : true
+ 159,42 : true
+ 159,41 : true
+ 127,66 : true
+ 127,95 : true
+ 15,105 : true
+ 109,32 : true
+ 159,38 : true
+ 159,37 : true
+ 113,84 : true
+ 106,81 : false
+ 159,36 : true
+ 159,35 : true
+ 159,34 : true
+ 121,30 : true
+ 128,34 : true
+ 186,1 : true
+ 159,31 : true
+ 159,30 : true
+ 111,94 : true
+ 170,24 : true
+ 140,26 : true
+ 187,6 : true
+ 159,27 : true
+ 20,149 : true
+ 30,149 : true
+ 122,83 : true
+ 10,149 : true
+ 159,25 : true
+ 136,65 : true
+ 40,149 : true
+ 50,149 : true
+ 129,92 : true
+ 159,24 : true
+ 119,22 : true
+ 159,22 : true
+ 33,128 : false
+ 43,128 : true
+ 13,128 : true
+ 23,128 : true
+ 91,84 : true
+ 81,84 : true
+ 159,20 : true
+ 116,81 : true
+ 15,57 : true
+ 159,18 : true
+ 118,34 : true
+ 159,17 : true
+ 121,89 : true
+ 176,1 : true
+ 121,94 : true
+ 118,53 : true
+ 131,96 : true
+ 197,6 : false
+ 89,94 : true
+ 136,34 : true
+ 112,23 : true
+ 104,67 : true
+ 159,8 : true
+ 137,90 : true
+ 146,65 : true
+ 159,5 : true
+ 132,58 : true
+ 108,51 : true
+ 159,3 : true
+ 139,92 : true
+ 159,2 : true
+ 159,1 : false
+ 26,128 : true
+ 16,128 : true
+ 46,128 : true
+ 36,128 : false
+ 182,41 : true
+ 158,49 : false
+ 1,87 : true
+ 158,48 : true
+ 3,87 : false
+ 2,87 : true
+ 5,87 : true
+ 4,87 : false
+ 158,47 : true
+ 111,89 : true
+ 101,96 : true
+ 121,78 : true
+ 158,46 : false
+ 158,44 : false
+ 158,43 : true
+ 160,26 : true
+ 50,130 : true
+ 40,130 : true
+ 30,130 : true
+ 20,130 : true
+ 198,31 : true
+ 158,40 : true
+ 103,74 : true
+ 122,58 : true
+ 7,87 : true
+ 6,87 : true
+ 9,87 : true
+ 8,87 : false
+ 10,130 : true
+ 42,55 : true
+ 25,84 : false
+ 15,84 : true
+ 158,38 : true
+ 172,41 : true
+ 144,79 : true
+ 149,32 : false
+ 158,34 : true
+ 107,99 : true
+ 120,32 : true
+ 158,31 : true
+ 141,94 : true
+ 158,30 : true
+ 158,29 : true
+ 158,27 : true
+ 130,26 : true
+ 158,26 : true
+ 154,43 : true
+ 158,24 : true
+ 124,67 : true
+ 158,23 : false
+ 132,23 : true
+ 158,22 : true
+ 158,20 : true
+ 188,31 : true
+ 158,18 : true
+ 158,17 : true
+ 34,84 : false
+ 44,84 : true
+ 54,84 : false
+ 64,84 : true
+ 44,128 : true
+ 34,128 : true
+ 14,84 : true
+ 14,128 : true
+ 158,15 : true
+ 158,14 : true
+ 139,32 : false
+ 120,53 : true
+ 18,128 : true
+ 158,13 : false
+ 132,52 : true
+ 109,67 : true
+ 121,96 : true
+ 112,61 : true
+ 48,130 : false
+ 200,26 : true
+ 158,7 : true
+ 158,6 : true
+ 158,5 : true
+ 146,1 : true
+ 158,4 : false
+ 110,69 : true
+ 158,2 : true
+ 141,85 : true
+ 157,50 : true
+ 150,89 : true
+ 124,30 : true
+ 157,49 : true
+ 47,128 : true
+ 157,48 : true
+ 27,128 : true
+ 37,128 : true
+ 42,92 : true
+ 157,46 : true
+ 157,45 : true
+ 157,44 : true
+ 157,43 : true
+ 129,32 : true
+ 127,89 : true
+ 157,42 : true
+ 192,41 : true
+ 17,128 : true
+ 157,39 : true
+ 122,52 : false
+ 122,61 : true
+ 45,84 : true
+ 131,78 : true
+ 116,89 : true
+ 157,36 : true
+ 157,35 : true
+ 136,1 : true
+ 118,91 : true
+ 157,33 : true
+ 9,95 : true
+ 8,95 : false
+ 7,95 : true
+ 6,95 : true
+ 5,95 : true
+ 4,95 : true
+ 3,95 : true
+ 46,145 : true
+ 120,24 : true
+ 157,31 : true
+ 157,30 : true
+ 157,28 : true
+ 119,16 : true
+ 139,29 : true
+ 100,69 : true
+ 80,84 : true
+ 90,84 : true
+ 157,26 : true
+ 137,89 : true
+ 127,41 : true
+ 108,34 : true
+ 56,92 : true
+ 157,21 : true
+ 120,26 : true
+ 138,55 : true
+ 152,11 : true
+ 157,19 : true
+ 123,50 : true
+ 157,15 : true
+ 157,14 : true
+ 83,65 : true
+ 24,130 : true
+ 14,130 : true
+ 22,149 : true
+ 18,102 : false
+ 42,149 : true
+ 38,102 : true
+ 48,102 : false
+ 191,27 : true
+ 11,84 : true
+ 138,42 : false
+ 31,84 : false
+ 21,84 : true
+ 15,128 : true
+ 41,84 : true
+ 35,128 : false
+ 34,130 : true
+ 107,89 : true
+ 37,52 : true
+ 157,8 : true
+ 148,76 : true
+ 112,10 : true
+ 157,6 : true
+ 157,5 : true
+ 102,61 : true
+ 118,49 : true
+ 111,96 : true
+ 157,3 : true
+ 156,1 : true
+ 157,2 : false
+ 130,46 : true
+ 157,1 : false
+ 156,50 : true
+ 11,149 : true
+ 130,21 : true
+ 31,149 : true
+ 21,149 : true
+ 156,48 : true
+ 41,149 : true
+ 181,27 : false
+ 156,46 : false
+ 156,45 : true
+ 10,84 : true
+ 20,84 : true
+ 28,128 : true
+ 40,84 : true
+ 50,84 : true
+ 60,84 : true
+ 70,84 : false
+ 156,44 : true
+ 41,101 : true
+ 31,101 : true
+ 21,101 : false
+ 156,43 : true
+ 156,42 : true
+ 156,41 : false
+ 115,63 : true
+ 146,73 : true
+ 177,44 : false
+ 156,35 : true
+ 156,34 : true
+ 11,101 : true
+ 93,66 : false
+ 136,86 : true
+ 191,6 : true
+ 63,66 : true
+ 105,46 : true
+ 83,66 : true
+ 73,66 : true
+ 23,66 : true
+ 13,66 : true
+ 43,66 : true
+ 33,66 : false
+ 156,32 : true
+ 156,31 : true
+ 33,108 : true
+ 43,108 : true
+ 13,108 : true
+ 23,108 : true
+ 156,30 : true
+ 129,43 : true
+ 156,29 : true
+ 134,40 : true
+ 156,28 : false
+ 106,30 : true
+ 41,86 : false
+ 132,88 : true
+ 125,63 : true
+ 156,26 : true
+ 156,25 : false
+ 156,24 : true
+ 106,86 : true
+ 156,23 : true
+ 161,6 : true
+ 104,31 : true
+ 92,66 : true
+ 156,18 : true
+ 72,66 : true
+ 82,66 : true
+ 52,66 : false
+ 62,66 : true
+ 32,66 : true
+ 42,66 : true
+ 12,66 : false
+ 22,66 : true
+ 46,108 : true
+ 36,108 : false
+ 4,82 : true
+ 138,25 : true
+ 119,43 : true
+ 109,69 : true
+ 26,108 : true
+ 16,108 : true
+ 116,30 : true
+ 156,16 : true
+ 124,27 : false
+ 13,53 : true
+ 115,14 : true
+ 23,90 : true
+ 37,67 : true
+ 156,11 : true
+ 156,10 : true
+ 156,9 : true
+ 156,8 : true
+ 116,86 : true
+ 156,7 : true
+ 156,6 : true
+ 156,5 : true
+ 17,122 : false
+ 55,66 : true
+ 45,66 : true
+ 35,66 : true
+ 25,66 : true
+ 95,66 : false
+ 85,66 : true
+ 75,66 : true
+ 65,66 : true
+ 156,3 : true
+ 117,55 : true
+ 115,53 : true
+ 155,50 : true
+ 15,66 : true
+ 109,43 : true
+ 155,49 : true
+ 128,25 : true
+ 149,25 : true
+ 126,30 : true
+ 155,44 : false
+ 105,63 : true
+ 2,113 : true
+ 3,113 : true
+ 155,43 : true
+ 1,113 : true
+ 6,113 : true
+ 7,113 : true
+ 45,126 : true
+ 35,126 : true
+ 25,126 : true
+ 15,126 : true
+ 8,113 : false
+ 9,113 : true
+ 106,21 : true
+ 64,66 : true
+ 74,66 : true
+ 84,66 : true
+ 14,66 : true
+ 24,66 : true
+ 34,66 : true
+ 44,66 : true
+ 155,42 : true
+ 155,41 : true
+ 44,108 : true
+ 34,108 : true
+ 24,108 : true
+ 14,108 : true
+ 108,42 : true
+ 155,40 : true
+ 146,42 : true
+ 114,57 : true
+ 155,37 : true
+ 108,63 : true
+ 155,35 : true
+ 136,30 : true
+ 102,88 : true
+ 148,21 : true
+ 175,14 : true
+ 150,65 : false
+ 34,126 : true
+ 44,126 : true
+ 14,126 : true
+ 10,89 : false
+ 20,89 : true
+ 30,89 : true
+ 37,66 : true
+ 27,66 : true
+ 57,66 : true
+ 47,66 : true
+ 77,66 : true
+ 67,66 : true
+ 105,80 : true
+ 87,66 : true
+ 121,79 : true
+ 100,71 : true
+ 155,30 : true
+ 138,9 : true
+ 115,43 : true
+ 155,28 : true
+ 17,66 : true
+ 138,18 : true
+ 104,57 : true
+ 47,102 : true
+ 118,63 : true
+ 144,81 : true
+ 118,99 : true
+ 155,24 : true
+ 150,93 : false
+ 140,100 : true
+ 43,126 : true
+ 33,126 : true
+ 144,31 : true
+ 155,20 : true
+ 155,19 : true
+ 196,23 : true
+ 23,126 : true
+ 13,126 : true
+ 46,66 : true
+ 56,66 : true
+ 26,66 : true
+ 36,66 : true
+ 86,66 : true
+ 96,66 : true
+ 66,66 : true
+ 76,66 : true
+ 148,9 : true
+ 102,82 : true
+ 110,71 : true
+ 155,17 : true
+ 155,15 : true
+ 16,66 : true
+ 140,17 : true
+ 155,12 : false
+ 155,10 : true
+ 128,63 : true
+ 121,31 : true
+ 155,8 : true
+ 24,56 : true
+ 128,99 : true
+ 97,82 : true
+ 122,50 : true
+ 32,126 : true
+ 42,126 : true
+ 125,49 : true
+ 134,31 : true
+ 22,89 : true
+ 102,85 : true
+ 12,126 : true
+ 22,126 : true
+ 29,66 : true
+ 19,66 : true
+ 71,89 : true
+ 61,89 : true
+ 91,89 : true
+ 81,89 : true
+ 104,17 : true
+ 155,2 : true
+ 168,25 : true
+ 99,66 : true
+ 89,66 : true
+ 79,66 : true
+ 69,66 : true
+ 59,66 : true
+ 49,66 : true
+ 39,66 : true
+ 10,141 : true
+ 154,50 : false
+ 154,48 : true
+ 148,42 : true
+ 50,141 : true
+ 40,141 : true
+ 30,141 : false
+ 20,141 : true
+ 31,126 : true
+ 21,126 : true
+ 11,126 : true
+ 140,99 : false
+ 11,89 : true
+ 180,24 : true
+ 103,27 : true
+ 21,89 : true
+ 28,66 : true
+ 50,89 : true
+ 48,66 : false
+ 58,66 : true
+ 68,66 : false
+ 78,66 : true
+ 88,66 : true
+ 98,66 : true
+ 121,4 : true
+ 158,25 : true
+ 128,9 : true
+ 122,82 : true
+ 119,90 : true
+ 125,43 : true
+ 133,35 : true
+ 18,66 : true
+ 101,71 : false
+ 142,88 : true
+ 106,72 : true
+ 154,40 : false
+ 138,4 : true
+ 144,40 : true
+ 165,43 : false
+ 148,99 : true
+ 20,126 : true
+ 30,126 : true
+ 14,89 : true
+ 10,126 : true
+ 154,37 : true
+ 145,80 : true
+ 102,2 : true
+ 50,126 : true
+ 73,89 : false
+ 63,89 : true
+ 53,89 : true
+ 43,89 : true
+ 147,10 : true
+ 154,36 : true
+ 93,89 : true
+ 83,89 : true
+ 49,109 : true
+ 39,109 : true
+ 154,35 : false
+ 154,33 : true
+ 154,32 : true
+ 154,31 : true
+ 29,109 : true
+ 19,109 : true
+ 154,30 : true
+ 116,35 : true
+ 12,141 : true
+ 154,29 : true
+ 32,141 : true
+ 22,141 : false
+ 102,90 : true
+ 42,141 : true
+ 154,28 : true
+ 154,27 : true
+ 137,5 : true
+ 154,26 : true
+ 33,89 : false
+ 23,89 : true
+ 13,89 : true
+ 154,23 : true
+ 62,89 : true
+ 72,89 : true
+ 42,89 : false
+ 52,89 : true
+ 117,4 : true
+ 157,10 : true
+ 82,89 : true
+ 92,89 : true
+ 38,109 : true
+ 48,109 : true
+ 154,20 : true
+ 194,17 : true
+ 154,17 : true
+ 169,35 : true
+ 18,109 : true
+ 28,109 : true
+ 118,42 : true
+ 141,5 : true
+ 154,14 : true
+ 11,141 : true
+ 21,141 : true
+ 31,141 : true
+ 41,141 : true
+ 164,40 : true
+ 3,106 : true
+ 4,106 : false
+ 5,106 : true
+ 6,106 : true
+ 48,79 : true
+ 154,11 : true
+ 1,106 : true
+ 2,106 : true
+ 85,89 : true
+ 75,89 : true
+ 154,10 : true
+ 95,89 : true
+ 45,89 : true
+ 8,106 : true
+ 65,89 : true
+ 55,89 : true
+ 108,89 : true
+ 19,108 : true
+ 29,108 : true
+ 39,108 : true
+ 49,108 : true
+ 154,8 : true
+ 131,40 : true
+ 154,5 : true
+ 188,42 : true
+ 116,72 : true
+ 124,57 : true
+ 65,62 : true
+ 152,2 : true
+ 175,43 : false
+ 153,50 : false
+ 101,47 : true
+ 117,5 : true
+ 153,47 : true
+ 25,89 : true
+ 15,89 : true
+ 153,46 : true
+ 153,45 : true
+ 153,44 : true
+ 17,69 : true
+ 74,89 : true
+ 84,89 : true
+ 94,89 : true
+ 153,42 : true
+ 34,89 : true
+ 44,89 : false
+ 54,89 : true
+ 64,89 : true
+ 131,79 : true
+ 153,41 : true
+ 78,62 : true
+ 153,39 : false
+ 153,38 : true
+ 153,37 : true
+ 132,33 : true
+ 189,35 : true
+ 153,33 : true
+ 178,42 : true
+ 104,40 : true
+ 141,71 : true
+ 111,95 : true
+ 142,2 : false
+ 133,27 : false
+ 18,89 : false
+ 117,18 : true
+ 153,31 : true
+ 153,30 : true
+ 153,28 : true
+ 187,5 : true
+ 104,66 : true
+ 153,25 : true
+ 118,67 : true
+ 112,97 : true
+ 97,89 : true
+ 87,89 : true
+ 77,89 : true
+ 67,89 : true
+ 57,89 : true
+ 47,89 : true
+ 37,89 : false
+ 15,109 : true
+ 37,108 : true
+ 35,109 : true
+ 17,108 : true
+ 153,22 : true
+ 45,109 : true
+ 47,108 : true
+ 153,21 : true
+ 49,64 : true
+ 39,64 : true
+ 69,64 : true
+ 59,64 : false
+ 136,72 : true
+ 121,95 : true
+ 29,64 : false
+ 19,64 : true
+ 27,89 : false
+ 107,18 : true
+ 187,44 : true
+ 153,18 : true
+ 89,64 : true
+ 79,64 : true
+ 197,10 : true
+ 99,64 : true
+ 96,89 : true
+ 122,97 : true
+ 76,89 : true
+ 86,89 : true
+ 56,89 : true
+ 66,89 : false
+ 36,89 : true
+ 46,89 : true
+ 153,16 : true
+ 14,109 : true
+ 24,109 : true
+ 34,109 : true
+ 44,109 : true
+ 151,14 : true
+ 153,14 : true
+ 120,19 : true
+ 124,40 : true
+ 153,11 : true
+ 153,10 : true
+ 158,42 : false
+ 153,7 : true
+ 153,6 : true
+ 131,95 : true
+ 122,2 : true
+ 109,96 : true
+ 153,4 : true
+ 153,2 : true
+ 197,44 : true
+ 152,50 : true
+ 171,6 : true
+ 167,5 : true
+ 125,80 : true
+ 152,46 : true
+ 56,64 : true
+ 122,66 : true
+ 66,92 : true
+ 152,41 : true
+ 101,27 : true
+ 184,46 : true
+ 152,37 : true
+ 37,109 : true
+ 45,108 : true
+ 17,109 : true
+ 49,89 : true
+ 79,89 : true
+ 69,89 : true
+ 15,108 : true
+ 47,109 : true
+ 129,47 : true
+ 51,90 : true
+ 152,34 : false
+ 114,40 : true
+ 22,123 : true
+ 152,32 : true
+ 19,89 : true
+ 141,95 : true
+ 167,44 : false
+ 152,30 : true
+ 152,29 : true
+ 46,52 : true
+ 194,37 : true
+ 152,26 : true
+ 128,67 : true
+ 126,86 : true
+ 102,97 : true
+ 132,66 : false
+ 152,24 : true
+ 152,22 : true
+ 152,21 : true
+ 102,92 : true
+ 3,118 : true
+ 194,46 : true
+ 38,108 : true
+ 38,89 : false
+ 48,89 : true
+ 58,89 : true
+ 68,89 : true
+ 78,89 : true
+ 88,89 : true
+ 98,89 : true
+ 138,99 : true
+ 105,32 : true
+ 152,16 : true
+ 19,139 : false
+ 182,2 : true
+ 152,13 : true
+ 152,12 : true
+ 146,54 : true
+ 48,126 : true
+ 32,127 : true
+ 28,126 : true
+ 38,126 : true
+ 148,77 : true
+ 102,66 : true
+ 141,84 : true
+ 152,7 : true
+ 149,14 : true
+ 83,61 : false
+ 148,26 : true
+ 152,4 : true
+ 33,135 : true
+ 18,126 : true
+ 13,135 : true
+ 23,135 : true
+ 133,15 : true
+ 152,3 : true
+ 152,1 : true
+ 151,50 : true
+ 145,23 : true
+ 109,35 : true
+ 151,49 : true
+ 151,48 : true
+ 115,32 : false
+ 151,47 : true
+ 104,94 : true
+ 161,8 : true
+ 151,43 : true
+ 151,41 : true
+ 107,94 : true
+ 172,2 : true
+ 37,126 : true
+ 27,126 : true
+ 151,37 : true
+ 47,126 : true
+ 151,36 : false
+ 151,35 : true
+ 151,34 : true
+ 106,94 : true
+ 151,31 : false
+ 108,9 : true
+ 111,61 : true
+ 112,66 : false
+ 44,135 : false
+ 34,135 : true
+ 17,126 : true
+ 14,135 : true
+ 151,30 : true
+ 143,15 : true
+ 151,29 : true
+ 113,12 : true
+ 41,140 : true
+ 31,140 : true
+ 21,140 : true
+ 11,140 : true
+ 58,64 : true
+ 68,64 : true
+ 38,64 : true
+ 48,64 : true
+ 18,64 : true
+ 50,127 : true
+ 162,2 : true
+ 11,108 : true
+ 20,127 : true
+ 10,127 : true
+ 40,127 : true
+ 30,127 : true
+ 98,64 : false
+ 151,24 : true
+ 78,64 : true
+ 88,64 : true
+ 151,22 : true
+ 151,20 : true
+ 25,144 : true
+ 10,83 : true
+ 11,135 : true
+ 21,135 : true
+ 31,135 : true
+ 41,135 : false
+ 148,13 : true
+ 151,15 : true
+ 153,15 : true
+ 151,13 : true
+ 151,12 : true
+ 151,11 : true
+ 151,10 : true
+ 151,8 : false
+ 67,64 : true
+ 57,64 : true
+ 47,64 : true
+ 37,64 : true
+ 27,64 : true
+ 17,64 : true
+ 139,63 : true
+ 151,5 : false
+ 33,127 : true
+ 43,127 : true
+ 13,127 : true
+ 23,127 : true
+ 151,4 : true
+ 97,64 : true
+ 87,64 : true
+ 77,64 : true
+ 8,138 : true
+ 7,138 : true
+ 197,5 : false
+ 9,138 : true
+ 22,135 : true
+ 12,135 : true
+ 42,135 : true
+ 5,138 : true
+ 150,100 : true
+ 150,99 : false
+ 150,98 : true
+ 163,15 : true
+ 33,76 : true
+ 155,23 : true
+ 34,56 : false
+ 150,88 : true
+ 106,54 : true
+ 134,94 : true
+ 150,87 : true
+ 121,48 : true
+ 150,85 : true
+ 112,90 : true
+ 145,32 : true
+ 150,84 : true
+ 30,135 : true
+ 20,135 : true
+ 10,135 : true
+ 150,83 : true
+ 150,82 : false
+ 150,81 : true
+ 50,135 : true
+ 40,135 : true
+ 150,79 : true
+ 150,78 : true
+ 186,18 : true
+ 188,25 : true
+ 150,75 : true
+ 150,74 : true
+ 150,71 : true
+ 150,70 : false
+ 50,140 : true
+ 22,108 : true
+ 149,35 : true
+ 42,108 : true
+ 10,140 : true
+ 20,140 : true
+ 30,140 : true
+ 40,140 : true
+ 121,8 : true
+ 150,69 : true
+ 131,48 : true
+ 111,71 : true
+ 150,68 : true
+ 32,92 : true
+ 12,108 : true
+ 155,32 : true
+ 11,127 : true
+ 21,127 : true
+ 31,127 : true
+ 41,127 : false
+ 146,74 : true
+ 135,91 : false
+ 150,63 : true
+ 144,94 : true
+ 7,129 : false
+ 8,129 : true
+ 9,129 : true
+ 196,18 : true
+ 3,129 : true
+ 4,129 : true
+ 5,129 : false
+ 6,129 : true
+ 21,108 : false
+ 45,140 : true
+ 41,108 : true
+ 25,140 : true
+ 150,60 : true
+ 150,59 : true
+ 32,115 : true
+ 150,55 : true
+ 150,54 : true
+ 101,48 : true
+ 121,71 : true
+ 125,32 : true
+ 150,53 : true
+ 150,52 : true
+ 6,69 : true
+ 150,50 : true
+ 1,122 : true
+ 150,47 : true
+ 27,149 : true
+ 150,44 : true
+ 150,43 : true
+ 150,42 : true
+ 150,41 : true
+ 150,40 : true
+ 3,65 : false
+ 2,65 : false
+ 5,65 : true
+ 4,65 : true
+ 7,65 : true
+ 6,65 : true
+ 9,65 : false
+ 8,65 : true
+ 50,108 : true
+ 40,108 : true
+ 30,108 : true
+ 20,108 : true
+ 32,140 : true
+ 42,140 : true
+ 12,140 : true
+ 22,140 : true
+ 111,48 : true
+ 116,54 : true
+ 135,32 : true
+ 150,39 : true
+ 10,108 : true
+ 150,38 : true
+ 150,37 : true
+ 50,129 : true
+ 120,46 : true
+ 106,44 : true
+ 150,30 : true
+ 123,39 : true
+ 104,63 : true
+ 150,27 : true
+ 150,26 : true
+ 112,2 : true
+ 150,23 : true
+ 150,22 : true
+ 150,21 : true
+ 118,75 : true
+ 150,20 : true
+ 150,19 : true
+ 176,18 : true
+ 150,17 : true
+ 150,16 : true
+ 3,138 : true
+ 137,10 : true
+ 150,13 : true
+ 150,12 : true
+ 104,91 : true
+ 142,40 : true
+ 150,9 : true
+ 137,27 : true
+ 134,69 : false
+ 150,7 : true
+ 107,55 : true
+ 101,85 : true
+ 150,5 : true
+ 13,140 : true
+ 150,4 : true
+ 54,58 : true
+ 44,58 : true
+ 34,58 : true
+ 24,58 : true
+ 94,58 : true
+ 84,58 : true
+ 74,58 : true
+ 64,58 : true
+ 4,92 : false
+ 150,1 : true
+ 108,75 : true
+ 138,63 : true
+ 14,58 : true
+ 129,3 : true
+ 36,73 : true
+ 173,31 : true
+ 24,140 : true
+ 34,140 : true
+ 44,140 : true
+ 9,88 : false
+ 101,61 : true
+ 148,67 : true
+ 24,87 : true
+ 149,94 : true
+ 124,69 : true
+ 24,96 : true
+ 149,89 : true
+ 149,87 : true
+ 149,82 : true
+ 130,34 : true
+ 149,80 : true
+ 14,140 : true
+ 43,58 : true
+ 53,58 : true
+ 23,58 : true
+ 33,58 : true
+ 83,58 : true
+ 102,6 : true
+ 63,58 : true
+ 73,58 : true
+ 8,57 : true
+ 9,57 : true
+ 6,57 : true
+ 7,57 : false
+ 127,24 : true
+ 13,58 : true
+ 138,75 : false
+ 149,77 : true
+ 149,76 : true
+ 1,57 : true
+ 149,75 : true
+ 149,74 : true
+ 4,57 : true
+ 5,57 : false
+ 2,57 : true
+ 3,57 : true
+ 22,90 : true
+ 149,72 : true
+ 149,71 : true
+ 149,70 : true
+ 15,140 : true
+ 28,76 : true
+ 37,111 : true
+ 149,64 : false
+ 32,58 : true
+ 22,58 : true
+ 52,58 : true
+ 42,58 : true
+ 72,58 : true
+ 62,58 : true
+ 92,58 : true
+ 82,58 : true
+ 149,63 : true
+ 144,17 : true
+ 19,135 : true
+ 29,135 : false
+ 149,62 : true
+ 109,70 : true
+ 103,30 : true
+ 128,75 : true
+ 46,140 : true
+ 149,61 : false
+ 26,140 : true
+ 36,140 : true
+ 39,135 : true
+ 49,135 : true
+ 149,60 : true
+ 117,34 : true
+ 149,59 : true
+ 149,58 : false
+ 149,57 : true
+ 149,56 : true
+ 122,6 : true
+ 16,140 : true
+ 87,87 : false
+ 144,48 : true
+ 21,58 : true
+ 31,58 : true
+ 41,58 : true
+ 51,58 : true
+ 61,58 : true
+ 71,58 : true
+ 81,58 : true
+ 91,58 : true
+ 134,17 : true
+ 149,53 : true
+ 146,5 : true
+ 16,99 : true
+ 139,3 : true
+ 149,47 : true
+ 183,31 : false
+ 11,58 : true
+ 33,140 : true
+ 23,140 : true
+ 149,45 : false
+ 101,8 : true
+ 107,34 : true
+ 168,9 : true
+ 148,100 : true
+ 149,42 : true
+ 43,95 : true
+ 19,99 : true
+ 29,99 : true
+ 39,99 : true
+ 49,99 : true
+ 59,99 : true
+ 69,99 : true
+ 90,58 : true
+ 89,99 : true
+ 99,99 : true
+ 60,58 : false
+ 50,58 : true
+ 40,58 : true
+ 30,58 : true
+ 20,58 : true
+ 10,58 : true
+ 47,135 : true
+ 141,61 : false
+ 10,56 : false
+ 37,135 : true
+ 30,56 : true
+ 20,56 : true
+ 50,56 : true
+ 40,56 : true
+ 169,43 : true
+ 149,39 : false
+ 111,8 : true
+ 104,89 : false
+ 129,70 : true
+ 17,135 : true
+ 149,37 : true
+ 149,36 : true
+ 18,99 : true
+ 30,101 : true
+ 40,101 : false
+ 50,101 : true
+ 58,99 : true
+ 92,56 : true
+ 82,56 : true
+ 68,99 : true
+ 98,99 : true
+ 88,99 : true
+ 149,34 : true
+ 149,33 : true
+ 149,31 : true
+ 149,30 : false
+ 106,14 : false
+ 10,101 : true
+ 103,15 : true
+ 9,115 : true
+ 6,115 : true
+ 28,135 : true
+ 163,31 : true
+ 149,27 : true
+ 126,92 : true
+ 155,46 : true
+ 62,52 : true
+ 1,115 : false
+ 114,89 : true
+ 159,43 : true
+ 4,115 : true
+ 5,115 : true
+ 2,115 : true
+ 3,115 : true
+ 149,22 : true
+ 121,85 : true
+ 149,19 : true
+ 114,69 : false
+ 149,18 : true
+ 144,83 : false
+ 149,15 : false
+ 152,6 : true
+ 149,13 : true
+ 149,12 : true
+ 156,14 : true
+ 149,9 : true
+ 149,8 : true
+ 137,50 : true
+ 128,77 : true
+ 138,66 : true
+ 25,135 : true
+ 35,135 : false
+ 45,135 : true
+ 113,15 : true
+ 125,46 : true
+ 149,5 : true
+ 135,43 : true
+ 149,3 : true
+ 149,2 : true
+ 122,68 : true
+ 149,43 : true
+ 148,98 : true
+ 50,72 : true
+ 148,96 : true
+ 125,23 : true
+ 15,135 : true
+ 42,101 : true
+ 110,39 : true
+ 104,69 : true
+ 32,101 : true
+ 129,96 : true
+ 192,2 : true
+ 147,35 : true
+ 148,89 : true
+ 70,56 : true
+ 60,56 : false
+ 90,56 : true
+ 80,56 : true
+ 147,50 : true
+ 12,101 : false
+ 148,88 : true
+ 148,87 : true
+ 36,135 : true
+ 26,135 : true
+ 123,15 : true
+ 46,135 : true
+ 101,39 : true
+ 135,46 : true
+ 148,85 : true
+ 148,81 : true
+ 129,9 : true
+ 148,79 : true
+ 115,23 : true
+ 148,78 : true
+ 148,75 : true
+ 119,70 : true
+ 16,135 : true
+ 148,74 : true
+ 33,78 : true
+ 33,64 : true
+ 105,25 : true
+ 188,23 : false
+ 185,34 : false
+ 148,68 : true
+ 148,66 : true
+ 148,63 : true
+ 121,13 : true
+ 105,21 : false
+ 161,16 : true
+ 132,73 : true
+ 44,56 : true
+ 119,75 : true
+ 136,63 : true
+ 148,58 : true
+ 96,68 : true
+ 148,57 : true
+ 142,29 : true
+ 124,98 : false
+ 56,68 : true
+ 66,68 : true
+ 76,68 : true
+ 86,68 : true
+ 16,68 : true
+ 26,68 : true
+ 36,68 : true
+ 46,68 : true
+ 142,20 : false
+ 148,53 : true
+ 148,52 : true
+ 148,50 : true
+ 148,49 : true
+ 49,134 : true
+ 39,134 : true
+ 29,134 : true
+ 148,48 : true
+ 175,34 : true
+ 175,25 : true
+ 148,45 : true
+ 129,12 : true
+ 106,89 : true
+ 105,30 : true
+ 148,44 : true
+ 19,134 : true
+ 148,43 : true
+ 14,52 : true
+ 146,63 : false
+ 148,40 : true
+ 95,68 : true
+ 72,79 : false
+ 118,90 : true
+ 65,68 : true
+ 37,141 : true
+ 85,68 : true
+ 75,68 : true
+ 25,68 : true
+ 15,68 : true
+ 47,141 : true
+ 35,68 : true
+ 148,38 : true
+ 144,51 : true
+ 124,37 : true
+ 148,34 : true
+ 125,25 : true
+ 109,68 : true
+ 105,82 : true
+ 148,32 : true
+ 18,134 : true
+ 28,134 : true
+ 38,134 : true
+ 48,134 : true
+ 181,16 : false
+ 112,73 : true
+ 199,17 : true
+ 139,12 : true
+ 148,29 : true
+ 148,27 : true
+ 148,25 : true
+ 148,24 : true
+ 136,38 : true
+ 148,23 : true
+ 98,68 : true
+ 148,22 : true
+ 78,68 : true
+ 88,68 : true
+ 58,68 : true
+ 68,68 : true
+ 38,68 : true
+ 48,68 : true
+ 18,68 : true
+ 28,68 : true
+ 155,34 : true
+ 148,20 : false
+ 26,89 : true
+ 148,18 : true
+ 135,38 : false
+ 118,18 : true
+ 148,15 : true
+ 115,25 : true
+ 103,31 : false
+ 17,134 : true
+ 47,134 : true
+ 37,134 : true
+ 125,30 : true
+ 148,14 : true
+ 122,73 : true
+ 151,16 : true
+ 144,27 : true
+ 46,116 : true
+ 198,35 : false
+ 148,5 : true
+ 148,4 : true
+ 108,55 : false
+ 148,2 : false
+ 97,68 : true
+ 87,68 : true
+ 19,141 : true
+ 67,68 : true
+ 57,68 : true
+ 49,141 : true
+ 37,68 : true
+ 27,68 : true
+ 104,43 : true
+ 148,1 : true
+ 147,100 : true
+ 124,29 : true
+ 147,98 : true
+ 125,82 : true
+ 145,38 : true
+ 133,31 : true
+ 16,111 : true
+ 124,43 : true
+ 185,23 : true
+ 147,94 : true
+ 121,16 : false
+ 135,57 : true
+ 147,92 : true
+ 86,57 : true
+ 126,19 : true
+ 135,30 : true
+ 152,27 : true
+ 145,21 : true
+ 147,82 : true
+ 159,9 : true
+ 147,78 : true
+ 116,38 : true
+ 147,77 : true
+ 141,6 : true
+ 182,29 : true
+ 146,13 : true
+ 147,71 : true
+ 147,68 : true
+ 147,65 : false
+ 36,57 : true
+ 106,88 : false
+ 137,80 : true
+ 139,60 : true
+ 108,50 : true
+ 106,80 : true
+ 147,61 : true
+ 135,25 : true
+ 115,38 : true
+ 111,31 : true
+ 146,89 : false
+ 114,43 : true
+ 175,23 : true
+ 147,57 : true
+ 102,73 : true
+ 125,57 : false
+ 75,83 : true
+ 147,55 : true
+ 142,27 : true
+ 145,30 : true
+ 42,94 : true
+ 135,21 : true
+ 79,68 : true
+ 69,68 : true
+ 99,68 : true
+ 89,68 : true
+ 147,53 : true
+ 147,52 : true
+ 166,38 : true
+ 147,49 : true
+ 119,1 : false
+ 147,48 : true
+ 19,68 : true
+ 147,47 : false
+ 39,68 : true
+ 29,68 : true
+ 59,68 : true
+ 49,68 : true
+ 113,31 : true
+ 147,46 : false
+ 147,45 : true
+ 125,38 : true
+ 147,44 : true
+ 119,51 : true
+ 144,43 : true
+ 147,43 : false
+ 104,46 : true
+ 13,150 : false
+ 147,41 : true
+ 125,21 : true
+ 116,63 : true
+ 106,5 : true
+ 121,50 : false
+ 147,40 : true
+ 147,39 : true
+ 137,17 : true
+ 139,9 : true
+ 133,8 : true
+ 113,52 : true
+ 148,90 : true
+ 127,54 : true
+ 176,38 : true
+ 147,32 : true
+ 109,1 : true
+ 147,31 : true
+ 147,30 : true
+ 147,29 : true
+ 147,28 : true
+ 147,27 : true
+ 147,26 : true
+ 131,13 : true
+ 115,82 : true
+ 147,24 : true
+ 143,31 : true
+ 195,23 : true
+ 111,85 : true
+ 111,16 : true
+ 134,43 : true
+ 147,21 : true
+ 109,12 : true
+ 115,21 : true
+ 109,51 : true
+ 147,20 : true
+ 126,63 : true
+ 147,19 : true
+ 131,50 : true
+ 147,17 : true
+ 198,14 : true
+ 147,14 : true
+ 147,13 : false
+ 146,38 : true
+ 147,12 : true
+ 189,9 : true
+ 109,44 : true
+ 147,7 : false
+ 147,5 : true
+ 147,4 : true
+ 147,3 : false
+ 147,2 : true
+ 67,82 : true
+ 146,99 : true
+ 146,98 : false
+ 116,96 : false
+ 139,17 : true
+ 121,64 : true
+ 199,12 : true
+ 146,94 : true
+ 146,92 : true
+ 188,35 : true
+ 139,51 : true
+ 185,25 : true
+ 146,72 : true
+ 146,87 : true
+ 146,86 : true
+ 185,38 : true
+ 106,41 : true
+ 146,83 : true
+ 164,43 : true
+ 146,76 : true
+ 128,74 : true
+ 114,70 : true
+ 146,77 : true
+ 146,80 : true
+ 156,38 : true
+ 146,88 : true
+ 146,71 : false
+ 146,70 : true
+ 146,69 : true
+ 146,68 : false
+ 146,64 : true
+ 102,47 : true
+ 110,62 : true
+ 175,21 : true
+ 146,60 : true
+ 129,17 : true
+ 146,59 : true
+ 136,45 : true
+ 116,5 : false
+ 129,51 : true
+ 146,56 : true
+ 146,55 : true
+ 178,35 : true
+ 146,51 : false
+ 146,48 : true
+ 146,46 : false
+ 146,45 : false
+ 146,44 : false
+ 146,43 : true
+ 99,56 : true
+ 155,38 : true
+ 79,56 : true
+ 89,56 : true
+ 59,56 : false
+ 69,56 : false
+ 39,56 : true
+ 49,56 : true
+ 8,109 : true
+ 7,109 : true
+ 2,109 : true
+ 8,99 : true
+ 5,99 : true
+ 3,109 : true
+ 3,99 : true
+ 4,99 : true
+ 1,99 : false
+ 2,99 : true
+ 101,64 : true
+ 106,6 : true
+ 146,37 : true
+ 146,35 : true
+ 146,34 : true
+ 130,53 : true
+ 143,26 : true
+ 200,10 : true
+ 146,30 : true
+ 146,28 : true
+ 115,57 : true
+ 132,98 : true
+ 109,8 : true
+ 184,43 : true
+ 165,38 : true
+ 132,27 : true
+ 146,24 : true
+ 126,45 : true
+ 146,22 : true
+ 108,74 : true
+ 126,88 : true
+ 146,21 : true
+ 146,18 : false
+ 98,53 : true
+ 129,35 : true
+ 146,16 : true
+ 123,49 : true
+ 146,14 : true
+ 147,72 : true
+ 15,97 : true
+ 146,11 : true
+ 129,77 : true
+ 87,82 : true
+ 109,17 : true
+ 146,8 : false
+ 131,64 : true
+ 146,7 : true
+ 146,6 : true
+ 149,51 : true
+ 110,10 : true
+ 146,4 : true
+ 195,25 : true
+ 146,2 : false
+ 105,57 : true
+ 174,43 : true
+ 145,98 : false
+ 122,27 : true
+ 145,97 : true
+ 138,74 : false
+ 145,95 : true
+ 124,87 : true
+ 109,99 : true
+ 145,92 : true
+ 116,88 : true
+ 145,90 : true
+ 145,89 : true
+ 145,87 : true
+ 119,35 : true
+ 112,29 : true
+ 70,78 : true
+ 113,35 : true
+ 112,47 : true
+ 145,84 : true
+ 185,21 : true
+ 29,90 : true
+ 116,18 : true
+ 60,90 : true
+ 145,77 : true
+ 36,134 : true
+ 46,134 : true
+ 16,134 : true
+ 26,134 : true
+ 131,66 : true
+ 112,98 : false
+ 145,76 : true
+ 145,75 : true
+ 145,74 : true
+ 145,73 : true
+ 128,90 : true
+ 145,71 : true
+ 38,140 : true
+ 48,140 : true
+ 145,67 : true
+ 145,63 : true
+ 113,91 : true
+ 27,119 : true
+ 18,140 : true
+ 28,140 : true
+ 196,38 : true
+ 113,97 : false
+ 145,58 : false
+ 102,29 : true
+ 47,99 : true
+ 199,39 : true
+ 135,34 : true
+ 131,54 : true
+ 106,18 : true
+ 111,64 : true
+ 145,54 : true
+ 194,43 : true
+ 45,134 : true
+ 35,134 : true
+ 25,134 : true
+ 15,134 : true
+ 106,63 : true
+ 141,66 : true
+ 122,98 : true
+ 145,52 : true
+ 145,50 : true
+ 145,49 : true
+ 145,48 : true
+ 145,46 : true
+ 47,140 : true
+ 37,140 : true
+ 118,74 : true
+ 145,45 : true
+ 145,43 : false
+ 145,41 : true
+ 27,140 : true
+ 17,140 : true
+ 117,72 : true
+ 145,39 : true
+ 145,37 : true
+ 145,36 : true
+ 189,39 : true
+ 165,34 : true
+ 101,16 : true
+ 145,33 : true
+ 145,31 : true
+ 145,29 : true
+ 84,62 : true
+ 140,22 : false
+ 168,35 : true
+ 145,26 : true
+ 179,12 : true
+ 165,25 : true
+ 145,20 : true
+ 145,18 : true
+ 145,15 : true
+ 141,78 : false
+ 114,9 : true
+ 145,10 : true
+ 120,2 : true
+ 81,94 : true
+ 24,136 : true
+ 46,126 : true
+ 145,3 : true
+ 11,54 : true
+ 144,100 : true
+ 144,99 : true
+ 126,80 : true
+ 144,98 : true
+ 3,105 : false
+ 144,96 : true
+ 13,65 : true
+ 107,72 : true
+ 195,21 : true
+ 144,90 : true
+ 117,51 : true
+ 179,39 : false
+ 144,86 : true
+ 144,84 : true
+ 149,17 : true
+ 144,82 : true
+ 155,25 : true
+ 158,35 : false
+ 176,5 : true
+ 189,12 : false
+ 102,98 : false
+ 49,126 : true
+ 39,126 : true
+ 29,126 : true
+ 145,57 : true
+ 144,75 : true
+ 141,59 : true
+ 144,73 : true
+ 136,8 : true
+ 138,90 : true
+ 49,140 : true
+ 39,140 : true
+ 19,126 : true
+ 19,140 : true
+ 144,71 : true
+ 136,80 : true
+ 144,70 : true
+ 103,97 : true
+ 144,69 : true
+ 10,62 : true
+ 144,67 : true
+ 134,10 : true
+ 169,39 : true
+ 145,34 : true
+ 105,38 : true
+ 144,60 : true
+ 160,10 : true
+ 144,57 : true
+ 144,56 : true
+ 178,12 : false
+ 144,54 : true
+ 144,52 : true
+ 106,32 : true
+ 148,36 : true
+ 130,100 : true
+ 144,50 : true
+ 149,54 : true
+ 144,47 : true
+ 2,105 : true
+ 144,45 : false
+ 119,21 : true
+ 144,42 : true
+ 129,56 : true
+ 144,41 : false
+ 108,35 : true
+ 144,39 : true
+ 144,38 : true
+ 144,37 : true
+ 144,36 : false
+ 119,9 : true
+ 120,61 : true
+ 144,35 : true
+ 144,34 : true
+ 115,4 : true
+ 144,33 : true
+ 53,92 : true
+ 8,150 : true
+ 9,150 : true
+ 6,150 : true
+ 7,150 : true
+ 144,30 : true
+ 144,29 : true
+ 148,12 : true
+ 144,26 : true
+ 138,36 : true
+ 1,150 : true
+ 39,73 : true
+ 144,21 : false
+ 4,150 : true
+ 5,150 : true
+ 2,150 : true
+ 3,150 : true
+ 124,58 : true
+ 139,56 : true
+ 144,19 : true
+ 105,86 : true
+ 101,66 : true
+ 144,16 : true
+ 144,15 : true
+ 144,14 : true
+ 144,13 : true
+ 196,5 : true
+ 117,26 : true
+ 144,11 : true
+ 125,4 : true
+ 52,94 : true
+ 44,150 : true
+ 144,8 : true
+ 180,10 : true
+ 131,70 : true
+ 125,77 : true
+ 136,18 : true
+ 180,22 : true
+ 144,3 : true
+ 144,2 : true
+ 144,1 : true
+ 129,14 : true
+ 143,99 : true
+ 111,66 : true
+ 143,98 : true
+ 143,97 : true
+ 109,56 : true
+ 4,93 : true
+ 143,93 : true
+ 129,62 : true
+ 143,89 : true
+ 115,86 : true
+ 143,88 : true
+ 101,45 : true
+ 7,69 : true
+ 143,86 : true
+ 143,83 : true
+ 143,82 : true
+ 115,50 : true
+ 1,123 : true
+ 127,26 : false
+ 143,77 : true
+ 143,76 : true
+ 103,75 : true
+ 123,35 : false
+ 143,72 : true
+ 115,77 : true
+ 102,8 : true
+ 143,71 : true
+ 168,12 : true
+ 190,22 : true
+ 143,68 : true
+ 95,95 : true
+ 143,65 : true
+ 143,64 : true
+ 119,54 : false
+ 121,66 : true
+ 143,63 : true
+ 32,114 : true
+ 55,100 : true
+ 143,58 : false
+ 143,57 : false
+ 143,56 : true
+ 77,82 : true
+ 119,56 : true
+ 143,53 : true
+ 35,64 : true
+ 125,86 : false
+ 143,50 : true
+ 143,47 : true
+ 143,46 : true
+ 143,45 : true
+ 143,44 : true
+ 150,61 : true
+ 143,41 : true
+ 105,4 : false
+ 143,40 : true
+ 105,77 : true
+ 143,39 : false
+ 143,38 : true
+ 112,8 : true
+ 107,26 : true
+ 120,10 : true
+ 143,37 : true
+ 163,18 : true
+ 184,40 : false
+ 35,67 : true
+ 94,69 : true
+ 109,54 : true
+ 143,30 : true
+ 90,68 : true
+ 188,36 : true
+ 146,32 : true
+ 143,25 : true
+ 121,45 : false
+ 143,24 : true
+ 148,35 : true
+ 142,68 : true
+ 123,14 : true
+ 22,87 : true
+ 135,86 : true
+ 143,18 : true
+ 143,17 : true
+ 143,16 : true
+ 25,145 : true
+ 143,12 : true
+ 188,12 : true
+ 143,9 : true
+ 9,91 : false
+ 107,44 : true
+ 24,81 : true
+ 143,6 : true
+ 121,6 : true
+ 130,10 : true
+ 143,4 : true
+ 9,62 : true
+ 143,3 : true
+ 7,62 : true
+ 8,62 : true
+ 5,62 : true
+ 6,62 : true
+ 3,62 : true
+ 4,62 : true
+ 1,62 : true
+ 2,62 : true
+ 111,45 : true
+ 31,83 : false
+ 138,35 : false
+ 118,86 : true
+ 145,86 : true
+ 142,97 : true
+ 142,95 : true
+ 43,145 : true
+ 142,91 : true
+ 142,90 : true
+ 142,89 : true
+ 142,87 : true
+ 198,12 : true
+ 70,82 : true
+ 142,84 : true
+ 141,60 : true
+ 142,81 : true
+ 104,15 : false
+ 142,80 : true
+ 14,70 : true
+ 142,78 : true
+ 183,18 : true
+ 142,76 : true
+ 140,10 : true
+ 142,75 : true
+ 129,54 : true
+ 126,32 : true
+ 113,68 : true
+ 142,74 : true
+ 142,73 : true
+ 44,59 : true
+ 6,138 : true
+ 142,66 : true
+ 142,65 : true
+ 4,128 : true
+ 141,45 : true
+ 142,62 : true
+ 142,61 : true
+ 142,60 : false
+ 142,59 : true
+ 142,58 : true
+ 142,55 : true
+ 142,54 : true
+ 107,75 : false
+ 142,53 : true
+ 142,51 : true
+ 142,50 : true
+ 142,49 : true
+ 114,15 : true
+ 132,10 : true
+ 142,46 : true
+ 142,44 : true
+ 38,78 : true
+ 142,42 : true
+ 150,10 : false
+ 142,38 : false
+ 142,37 : true
+ 194,40 : true
+ 158,36 : false
+ 136,32 : true
+ 142,34 : false
+ 142,33 : true
+ 142,32 : true
+ 138,64 : true
+ 142,30 : true
+ 142,28 : true
+ 131,45 : true
+ 142,26 : true
+ 142,25 : true
+ 142,24 : true
+ 142,23 : true
+ 93,79 : true
+ 148,55 : true
+ 142,19 : true
+ 142,18 : true
+ 142,17 : true
+ 33,105 : true
+ 142,13 : true
+ 142,12 : true
+ 142,11 : true
+ 142,10 : true
+ 135,14 : true
+ 186,32 : true
+ 142,8 : true
+ 102,50 : true
+ 111,6 : true
+ 142,7 : true
+ 173,27 : true
+ 82,74 : true
+ 133,68 : true
+ 124,15 : false
+ 33,94 : true
+ 141,98 : true
+ 124,46 : true
+ 141,97 : true
+ 141,96 : true
+ 141,93 : true
+ 132,82 : true
+ 41,117 : true
+ 141,91 : true
+ 141,90 : true
+ 141,89 : true
+ 141,88 : true
+ 199,9 : true
+ 141,86 : true
+ 158,1 : true
+ 152,8 : true
+ 141,83 : true
+ 141,81 : true
+ 93,76 : true
+ 127,75 : true
+ 141,79 : true
+ 145,14 : true
+ 123,31 : true
+ 141,77 : true
+ 196,32 : true
+ 173,18 : true
+ 112,50 : true
+ 163,27 : false
+ 141,73 : true
+ 16,61 : true
+ 49,93 : true
+ 103,68 : true
+ 134,15 : true
+ 134,46 : true
+ 141,64 : true
+ 141,63 : true
+ 141,62 : true
+ 142,82 : true
+ 141,57 : true
+ 141,56 : true
+ 141,55 : true
+ 169,9 : false
+ 141,50 : true
+ 75,78 : true
+ 141,46 : true
+ 118,39 : true
+ 122,8 : false
+ 117,75 : true
+ 141,42 : true
+ 28,70 : true
+ 186,31 : true
+ 141,37 : true
+ 143,96 : true
+ 141,35 : false
+ 44,92 : true
+ 141,31 : true
+ 141,30 : true
+ 111,75 : true
+ 141,26 : true
+ 196,30 : true
+ 118,100 : true
+ 9,67 : true
+ 8,67 : true
+ 7,67 : true
+ 6,67 : true
+ 165,21 : true
+ 166,32 : true
+ 81,66 : true
+ 144,46 : true
+ 24,141 : true
+ 14,141 : true
+ 141,16 : true
+ 96,57 : true
+ 141,14 : true
+ 100,61 : true
+ 141,12 : false
+ 141,11 : true
+ 132,8 : true
+ 62,53 : true
+ 141,8 : true
+ 139,69 : true
+ 147,75 : false
+ 113,18 : false
+ 44,141 : true
+ 34,141 : true
+ 8,91 : true
+ 3,135 : true
+ 4,135 : true
+ 5,91 : true
+ 4,91 : false
+ 7,135 : true
+ 8,135 : true
+ 9,135 : true
+ 123,68 : true
+ 154,15 : false
+ 141,4 : true
+ 130,47 : true
+ 176,32 : false
+ 155,21 : true
+ 154,46 : true
+ 1,135 : true
+ 1,67 : true
+ 122,53 : false
+ 140,98 : true
+ 140,97 : false
+ 5,67 : true
+ 4,67 : true
+ 3,67 : true
+ 2,67 : true
+ 168,1 : true
+ 140,94 : true
+ 140,93 : true
+ 177,26 : true
+ 123,18 : true
+ 140,90 : true
+ 111,18 : true
+ 137,75 : false
+ 140,86 : true
+ 140,85 : true
+ 140,84 : true
+ 140,83 : true
+ 140,81 : true
+ 140,79 : true
+ 140,77 : true
+ 65,84 : true
+ 138,12 : true
+ 140,75 : true
+ 140,74 : true
+ 140,73 : true
+ 140,72 : true
+ 164,15 : true
+ 127,34 : true
+ 140,69 : false
+ 132,53 : true
+ 140,68 : true
+ 26,141 : true
+ 16,141 : true
+ 140,67 : true
+ 140,66 : true
+ 140,65 : true
+ 140,64 : true
+ 140,63 : true
+ 192,8 : true
+ 187,26 : true
+ 140,54 : false
+ 46,141 : true
+ 36,141 : true
+ 118,1 : true
+ 133,18 : true
+ 140,53 : true
+ 140,51 : true
+ 140,50 : true
+ 120,80 : true
+ 140,47 : false
+ 196,31 : true
+ 140,44 : false
+ 105,14 : false
+ 140,43 : true
+ 169,17 : false
+ 140,41 : true
+ 108,12 : true
+ 174,15 : true
+ 140,38 : true
+ 140,37 : true
+ 140,34 : true
+ 13,141 : true
+ 23,141 : true
+ 140,33 : true
+ 102,53 : true
+ 140,32 : true
+ 140,31 : true
+ 140,30 : true
+ 140,29 : true
+ 103,96 : true
+ 130,61 : true
+ 149,69 : true
+ 140,27 : true
+ 131,6 : true
+ 140,21 : true
+ 33,141 : true
+ 43,141 : true
+ 140,20 : true
+ 140,19 : true
+ 134,35 : true
+ 155,14 : true
+ 137,48 : true
+ 193,27 : true
+ 140,14 : true
+ 158,12 : false
+ 140,11 : true
+ 140,9 : true
+ 127,17 : true
+ 104,38 : true
+ 140,7 : true
+ 10,102 : true
+ 140,4 : true
+ 184,15 : true
+ 122,29 : true
+ 140,2 : true
+ 1,119 : true
+ 2,119 : true
+ 38,141 : true
+ 28,141 : true
+ 18,141 : true
+ 137,22 : true
+ 7,119 : true
+ 8,119 : true
+ 9,119 : true
+ 48,141 : true
+ 3,119 : true
+ 4,119 : true
+ 5,119 : true
+ 6,119 : true
+ 23,73 : true
+ 31,92 : true
+ 165,14 : true
+ 111,29 : true
+ 183,27 : true
+ 139,91 : true
+ 139,89 : true
+ 139,88 : true
+ 139,87 : true
+ 128,12 : true
+ 139,84 : true
+ 48,128 : true
+ 191,16 : true
+ 139,76 : true
+ 194,15 : true
+ 117,33 : true
+ 139,74 : true
+ 139,73 : true
+ 15,141 : true
+ 25,141 : false
+ 29,79 : true
+ 139,71 : true
+ 139,70 : false
+ 139,65 : false
+ 109,9 : true
+ 139,64 : true
+ 123,96 : true
+ 110,61 : true
+ 35,141 : true
+ 45,141 : true
+ 151,6 : true
+ 128,1 : true
+ 115,39 : true
+ 139,62 : true
+ 139,58 : true
+ 124,97 : true
+ 8,127 : true
+ 7,127 : true
+ 18,131 : true
+ 9,127 : true
+ 37,62 : true
+ 25,64 : true
+ 57,62 : true
+ 45,64 : true
+ 75,64 : true
+ 67,62 : false
+ 95,64 : true
+ 85,64 : true
+ 42,77 : true
+ 52,77 : true
+ 62,77 : true
+ 72,77 : true
+ 82,77 : true
+ 78,74 : true
+ 17,62 : true
+ 58,74 : true
+ 48,74 : true
+ 38,74 : true
+ 28,74 : true
+ 18,74 : true
+ 117,20 : true
+ 139,54 : true
+ 163,6 : true
+ 139,50 : true
+ 7,123 : true
+ 6,123 : true
+ 9,123 : false
+ 8,123 : true
+ 139,49 : true
+ 139,48 : true
+ 139,47 : true
+ 139,46 : true
+ 28,62 : false
+ 36,64 : true
+ 48,62 : true
+ 58,62 : true
+ 66,64 : true
+ 12,77 : true
+ 22,77 : true
+ 32,77 : true
+ 184,50 : true
+ 139,43 : true
+ 132,31 : true
+ 3,117 : true
+ 127,63 : true
+ 11,123 : true
+ 116,66 : true
+ 18,62 : true
+ 4,127 : true
+ 3,127 : true
+ 6,127 : true
+ 5,127 : true
+ 74,57 : true
+ 107,20 : true
+ 2,127 : true
+ 1,127 : true
+ 139,38 : true
+ 139,37 : true
+ 139,36 : true
+ 160,16 : true
+ 2,128 : true
+ 139,33 : true
+ 139,31 : true
+ 162,17 : true
+ 111,5 : true
+ 139,28 : true
+ 139,27 : true
+ 139,26 : true
+ 147,33 : true
+ 32,135 : true
+ 116,95 : true
+ 45,117 : true
+ 60,77 : true
+ 70,77 : true
+ 40,77 : true
+ 50,77 : true
+ 139,18 : true
+ 124,2 : false
+ 80,77 : true
+ 90,77 : true
+ 189,44 : true
+ 120,60 : true
+ 10,113 : false
+ 117,38 : true
+ 183,6 : true
+ 139,6 : true
+ 115,27 : true
+ 139,5 : true
+ 170,16 : true
+ 125,39 : true
+ 138,100 : true
+ 136,33 : false
+ 152,17 : false
+ 138,98 : true
+ 99,92 : true
+ 113,39 : true
+ 105,55 : true
+ 101,5 : true
+ 146,62 : true
+ 138,93 : true
+ 20,77 : true
+ 30,77 : true
+ 124,35 : true
+ 10,77 : true
+ 51,77 : true
+ 41,77 : true
+ 71,77 : true
+ 61,77 : true
+ 91,77 : true
+ 81,77 : true
+ 154,2 : true
+ 138,88 : true
+ 127,38 : true
+ 199,44 : true
+ 138,83 : true
+ 138,81 : true
+ 129,36 : false
+ 145,27 : true
+ 138,77 : true
+ 138,73 : true
+ 138,72 : true
+ 180,16 : true
+ 102,17 : true
+ 138,70 : true
+ 10,136 : true
+ 91,64 : true
+ 138,68 : false
+ 164,21 : true
+ 61,64 : true
+ 53,62 : true
+ 83,62 : true
+ 71,64 : true
+ 23,62 : true
+ 11,64 : true
+ 43,62 : true
+ 33,62 : true
+ 149,7 : true
+ 175,27 : true
+ 142,31 : false
+ 149,100 : true
+ 134,50 : false
+ 167,33 : true
+ 109,2 : true
+ 117,17 : true
+ 138,58 : true
+ 138,57 : true
+ 138,56 : true
+ 157,20 : true
+ 104,2 : true
+ 138,53 : true
+ 177,38 : false
+ 138,49 : true
+ 47,124 : true
+ 116,33 : false
+ 9,106 : true
+ 138,45 : true
+ 92,64 : false
+ 138,44 : true
+ 154,21 : true
+ 21,61 : true
+ 54,62 : true
+ 64,62 : true
+ 72,64 : false
+ 82,64 : true
+ 14,62 : true
+ 24,62 : false
+ 32,64 : true
+ 44,62 : true
+ 138,40 : true
+ 136,57 : true
+ 28,108 : true
+ 138,38 : true
+ 134,2 : true
+ 138,34 : false
+ 177,33 : true
+ 138,30 : false
+ 197,14 : false
+ 138,31 : true
+ 107,38 : true
+ 138,29 : true
+ 138,28 : true
+ 111,35 : true
+ 138,26 : true
+ 125,27 : true
+ 106,33 : true
+ 138,23 : true
+ 104,21 : true
+ 138,22 : true
+ 138,20 : false
+ 117,80 : true
+ 138,19 : false
+ 1,55 : true
+ 59,62 : true
+ 49,62 : true
+ 39,62 : true
+ 23,64 : true
+ 93,64 : false
+ 89,62 : true
+ 79,62 : true
+ 69,62 : true
+ 126,57 : true
+ 129,100 : true
+ 129,7 : true
+ 155,27 : true
+ 19,62 : true
+ 138,17 : false
+ 163,36 : true
+ 137,63 : true
+ 104,20 : true
+ 122,49 : true
+ 138,13 : true
+ 138,10 : true
+ 157,38 : true
+ 127,44 : true
+ 154,39 : true
+ 110,18 : true
+ 138,3 : true
+ 45,87 : true
+ 138,1 : true
+ 112,17 : true
+ 137,99 : true
+ 137,98 : true
+ 29,80 : true
+ 137,95 : true
+ 44,64 : true
+ 54,64 : true
+ 24,64 : false
+ 34,64 : true
+ 84,64 : true
+ 94,64 : true
+ 64,64 : true
+ 74,64 : true
+ 185,27 : true
+ 159,7 : true
+ 193,36 : false
+ 116,57 : true
+ 167,43 : true
+ 14,64 : true
+ 147,63 : true
+ 137,78 : true
+ 132,49 : true
+ 197,33 : true
+ 177,14 : true
+ 137,72 : true
+ 137,71 : true
+ 114,2 : true
+ 137,70 : false
+ 167,38 : true
+ 137,67 : true
+ 51,93 : true
+ 109,39 : false
+ 137,61 : true
+ 128,79 : true
+ 137,57 : true
+ 162,46 : true
+ 199,4 : false
+ 137,54 : true
+ 137,53 : true
+ 40,70 : true
+ 137,49 : true
+ 140,16 : true
+ 137,47 : true
+ 137,46 : false
+ 116,74 : false
+ 137,44 : true
+ 137,43 : true
+ 33,107 : true
+ 43,107 : true
+ 13,107 : true
+ 3,68 : true
+ 16,86 : true
+ 1,68 : true
+ 6,68 : true
+ 7,68 : false
+ 4,68 : true
+ 5,68 : true
+ 22,53 : true
+ 137,40 : true
+ 8,68 : true
+ 9,68 : true
+ 137,39 : true
+ 137,38 : true
+ 113,100 : false
+ 137,35 : true
+ 107,80 : true
+ 131,24 : true
+ 137,33 : true
+ 172,46 : true
+ 137,31 : true
+ 137,30 : true
+ 137,28 : true
+ 150,8 : true
+ 137,26 : false
+ 137,25 : true
+ 137,24 : true
+ 137,23 : true
+ 139,100 : true
+ 137,21 : true
+ 42,107 : true
+ 32,107 : true
+ 22,107 : true
+ 12,107 : true
+ 104,72 : true
+ 173,36 : true
+ 110,64 : true
+ 117,74 : true
+ 137,19 : true
+ 123,22 : true
+ 137,18 : true
+ 147,38 : true
+ 137,16 : true
+ 137,15 : true
+ 137,14 : true
+ 101,92 : true
+ 104,97 : true
+ 137,9 : true
+ 182,46 : true
+ 42,106 : true
+ 117,97 : true
+ 95,62 : true
+ 85,62 : false
+ 4,94 : false
+ 5,94 : true
+ 6,94 : true
+ 45,62 : true
+ 35,62 : true
+ 1,94 : false
+ 2,94 : true
+ 6,100 : true
+ 5,100 : true
+ 4,100 : false
+ 3,100 : true
+ 7,94 : true
+ 8,94 : true
+ 9,94 : true
+ 177,43 : true
+ 107,74 : true
+ 137,20 : true
+ 134,54 : true
+ 15,107 : true
+ 25,107 : true
+ 35,107 : true
+ 45,107 : true
+ 7,100 : false
+ 24,84 : true
+ 136,98 : true
+ 98,74 : false
+ 136,96 : true
+ 136,95 : true
+ 192,46 : true
+ 90,64 : true
+ 136,88 : true
+ 70,64 : true
+ 80,64 : true
+ 50,64 : false
+ 60,64 : true
+ 36,62 : true
+ 46,62 : false
+ 16,62 : true
+ 20,64 : true
+ 118,35 : true
+ 107,63 : true
+ 136,85 : true
+ 119,44 : true
+ 124,72 : true
+ 153,36 : true
+ 136,83 : true
+ 136,81 : true
+ 127,20 : true
+ 124,54 : true
+ 14,107 : true
+ 137,74 : true
+ 34,107 : true
+ 24,107 : true
+ 103,22 : true
+ 44,107 : true
+ 159,4 : true
+ 114,66 : false
+ 136,77 : true
+ 136,76 : true
+ 69,70 : true
+ 136,70 : true
+ 200,16 : false
+ 123,76 : true
+ 182,17 : true
+ 134,36 : false
+ 136,62 : true
+ 136,52 : true
+ 104,50 : true
+ 12,99 : true
+ 136,59 : true
+ 136,56 : false
+ 136,55 : true
+ 136,54 : false
+ 136,49 : true
+ 136,48 : true
+ 63,79 : true
+ 146,57 : true
+ 136,44 : true
+ 136,43 : false
+ 114,54 : true
+ 136,42 : true
+ 127,74 : true
+ 136,41 : true
+ 136,40 : true
+ 136,37 : true
+ 136,35 : true
+ 147,80 : true
+ 124,66 : true
+ 136,28 : true
+ 136,27 : true
+ 169,4 : true
+ 136,24 : true
+ 136,23 : true
+ 190,8 : true
+ 24,67 : true
+ 136,16 : true
+ 136,15 : true
+ 104,36 : false
+ 136,14 : true
+ 136,13 : true
+ 19,146 : true
+ 136,11 : true
+ 136,10 : true
+ 187,38 : true
+ 144,72 : true
+ 136,6 : true
+ 136,5 : true
+ 25,100 : true
+ 136,3 : true
+ 110,90 : true
+ 135,100 : true
+ 104,54 : true
+ 135,99 : true
+ 135,98 : false
+ 179,44 : true
+ 27,111 : true
+ 135,94 : true
+ 135,92 : true
+ 150,64 : true
+ 135,89 : true
+ 144,97 : true
+ 135,84 : true
+ 135,80 : true
+ 184,21 : true
+ 103,76 : true
+ 11,138 : true
+ 135,77 : true
+ 135,76 : false
+ 135,75 : true
+ 135,74 : true
+ 129,60 : true
+ 120,76 : true
+ 135,70 : true
+ 135,67 : true
+ 135,65 : true
+ 31,107 : true
+ 41,107 : true
+ 135,63 : false
+ 122,31 : true
+ 116,59 : true
+ 100,83 : true
+ 11,107 : false
+ 21,107 : true
+ 133,22 : true
+ 135,59 : true
+ 135,58 : true
+ 135,56 : true
+ 31,72 : true
+ 55,68 : true
+ 135,48 : true
+ 135,47 : true
+ 135,44 : true
+ 149,4 : true
+ 114,97 : false
+ 115,62 : true
+ 135,39 : true
+ 174,21 : true
+ 113,76 : false
+ 135,36 : true
+ 124,36 : true
+ 192,17 : true
+ 146,52 : true
+ 135,31 : true
+ 135,29 : true
+ 3,132 : true
+ 135,27 : true
+ 135,26 : true
+ 40,107 : true
+ 30,107 : true
+ 135,24 : true
+ 50,107 : true
+ 135,23 : false
+ 135,22 : true
+ 20,107 : true
+ 10,107 : true
+ 135,19 : true
+ 143,22 : true
+ 135,15 : true
+ 135,13 : true
+ 112,96 : true
+ 135,10 : false
+ 120,37 : true
+ 135,8 : true
+ 35,87 : true
+ 55,59 : true
+ 135,3 : true
+ 162,26 : true
+ 133,12 : true
+ 172,47 : true
+ 119,96 : true
+ 134,97 : true
+ 134,96 : true
+ 12,81 : true
+ 134,93 : false
+ 134,92 : false
+ 134,91 : true
+ 196,3 : true
+ 134,89 : false
+ 134,88 : true
+ 48,136 : true
+ 38,136 : true
+ 28,136 : true
+ 18,136 : true
+ 134,87 : true
+ 134,86 : true
+ 134,84 : true
+ 134,83 : true
+ 134,78 : true
+ 14,69 : true
+ 128,44 : true
+ 122,88 : true
+ 134,75 : true
+ 134,73 : true
+ 134,72 : true
+ 109,7 : true
+ 49,52 : true
+ 59,52 : true
+ 69,52 : true
+ 79,52 : true
+ 89,52 : true
+ 49,53 : true
+ 84,87 : true
+ 74,87 : true
+ 99,53 : true
+ 89,53 : true
+ 134,70 : true
+ 134,68 : true
+ 134,67 : true
+ 128,78 : true
+ 11,65 : true
+ 134,64 : true
+ 39,136 : true
+ 49,136 : true
+ 19,136 : true
+ 29,136 : false
+ 134,62 : true
+ 174,2 : true
+ 46,120 : true
+ 93,77 : true
+ 83,77 : true
+ 73,77 : false
+ 63,77 : true
+ 53,77 : true
+ 43,77 : true
+ 19,52 : true
+ 29,52 : true
+ 39,52 : true
+ 134,59 : true
+ 182,26 : true
+ 134,57 : true
+ 134,66 : true
+ 134,51 : true
+ 134,48 : true
+ 153,12 : true
+ 192,47 : true
+ 18,121 : true
+ 28,121 : false
+ 126,95 : true
+ 134,39 : true
+ 118,78 : true
+ 12,75 : true
+ 134,37 : true
+ 140,18 : true
+ 137,32 : false
+ 134,30 : true
+ 117,61 : true
+ 134,29 : true
+ 49,121 : true
+ 39,121 : false
+ 124,88 : true
+ 134,28 : true
+ 131,11 : true
+ 134,26 : true
+ 134,24 : true
+ 107,21 : true
+ 200,45 : true
+ 134,20 : true
+ 36,111 : true
+ 84,97 : true
+ 192,26 : false
+ 134,11 : true
+ 144,66 : true
+ 45,70 : false
+ 134,8 : false
+ 120,71 : true
+ 134,4 : true
+ 163,12 : true
+ 133,100 : true
+ 133,99 : true
+ 29,121 : true
+ 19,121 : true
+ 133,98 : true
+ 133,97 : true
+ 150,18 : true
+ 108,78 : true
+ 133,94 : true
+ 133,92 : true
+ 133,90 : true
+ 107,32 : true
+ 105,39 : false
+ 133,87 : true
+ 133,86 : true
+ 133,84 : false
+ 133,82 : true
+ 116,9 : true
+ 133,79 : true
+ 55,87 : true
+ 133,76 : true
+ 133,75 : true
+ 133,74 : false
+ 133,73 : true
+ 86,52 : false
+ 46,53 : true
+ 56,53 : true
+ 66,53 : true
+ 75,87 : true
+ 85,87 : true
+ 16,53 : true
+ 26,53 : false
+ 30,99 : true
+ 20,99 : true
+ 50,99 : true
+ 40,99 : true
+ 76,53 : true
+ 86,53 : true
+ 90,99 : true
+ 80,99 : true
+ 14,136 : true
+ 133,71 : true
+ 117,32 : true
+ 31,56 : true
+ 33,120 : true
+ 44,136 : true
+ 47,121 : true
+ 37,121 : true
+ 56,77 : true
+ 66,77 : true
+ 66,87 : false
+ 56,87 : true
+ 16,77 : true
+ 26,77 : false
+ 36,77 : true
+ 16,87 : true
+ 75,52 : false
+ 85,52 : true
+ 65,53 : true
+ 88,87 : false
+ 35,52 : true
+ 45,52 : true
+ 55,52 : true
+ 65,52 : true
+ 27,121 : true
+ 17,121 : true
+ 41,99 : true
+ 51,99 : true
+ 85,53 : false
+ 71,99 : true
+ 81,99 : true
+ 91,99 : true
+ 116,21 : true
+ 15,136 : true
+ 125,73 : true
+ 133,65 : true
+ 45,136 : true
+ 50,138 : true
+ 25,136 : false
+ 35,136 : true
+ 57,77 : true
+ 47,77 : false
+ 37,77 : true
+ 27,77 : true
+ 97,77 : true
+ 87,77 : true
+ 77,77 : true
+ 25,87 : true
+ 78,52 : true
+ 68,52 : true
+ 58,52 : true
+ 48,52 : false
+ 93,87 : true
+ 133,63 : true
+ 73,87 : true
+ 83,87 : true
+ 26,120 : true
+ 16,120 : true
+ 129,34 : true
+ 133,60 : false
+ 59,92 : true
+ 193,12 : true
+ 71,94 : true
+ 133,56 : false
+ 164,41 : true
+ 133,54 : true
+ 133,53 : true
+ 34,101 : true
+ 133,50 : false
+ 1,105 : true
+ 35,120 : true
+ 45,120 : true
+ 64,87 : true
+ 84,77 : true
+ 54,77 : true
+ 64,77 : true
+ 38,52 : true
+ 28,52 : false
+ 18,52 : true
+ 24,77 : true
+ 67,52 : true
+ 77,52 : true
+ 47,52 : true
+ 57,52 : false
+ 86,87 : true
+ 76,87 : false
+ 87,52 : true
+ 96,87 : true
+ 15,120 : true
+ 25,120 : true
+ 117,22 : true
+ 166,3 : true
+ 133,44 : true
+ 41,64 : true
+ 76,73 : false
+ 133,39 : true
+ 82,83 : true
+ 133,37 : true
+ 113,80 : true
+ 154,41 : true
+ 44,120 : true
+ 34,120 : true
+ 27,116 : true
+ 133,30 : true
+ 65,77 : true
+ 63,87 : true
+ 33,87 : false
+ 75,77 : true
+ 27,52 : true
+ 15,77 : true
+ 45,77 : true
+ 35,77 : true
+ 89,87 : true
+ 72,53 : true
+ 82,53 : true
+ 92,53 : true
+ 161,45 : true
+ 94,99 : true
+ 19,77 : true
+ 116,3 : true
+ 64,99 : true
+ 54,99 : true
+ 84,99 : true
+ 12,53 : true
+ 24,99 : true
+ 32,53 : true
+ 38,120 : true
+ 34,99 : true
+ 47,120 : true
+ 31,90 : true
+ 48,105 : false
+ 133,23 : false
+ 189,37 : true
+ 157,32 : true
+ 127,96 : true
+ 63,64 : true
+ 133,13 : false
+ 168,14 : true
+ 176,27 : true
+ 133,7 : true
+ 111,50 : true
+ 133,6 : true
+ 133,5 : true
+ 133,3 : true
+ 71,53 : true
+ 61,53 : true
+ 91,53 : true
+ 81,53 : true
+ 95,99 : true
+ 151,45 : true
+ 54,53 : true
+ 125,55 : false
+ 55,99 : true
+ 65,99 : true
+ 75,99 : true
+ 85,99 : true
+ 31,53 : true
+ 17,120 : true
+ 35,99 : true
+ 37,120 : true
+ 132,97 : true
+ 49,105 : true
+ 117,78 : true
+ 93,78 : false
+ 132,91 : true
+ 199,37 : true
+ 132,89 : true
+ 132,87 : true
+ 132,86 : true
+ 19,87 : true
+ 29,87 : false
+ 39,87 : true
+ 49,87 : true
+ 59,87 : true
+ 69,87 : true
+ 79,87 : true
+ 58,53 : true
+ 68,53 : true
+ 38,53 : false
+ 48,53 : true
+ 17,77 : true
+ 28,53 : true
+ 44,52 : true
+ 34,52 : true
+ 52,99 : true
+ 42,99 : true
+ 32,99 : true
+ 22,99 : true
+ 1,85 : true
+ 82,99 : true
+ 72,99 : true
+ 88,53 : true
+ 149,1 : true
+ 132,80 : true
+ 49,120 : true
+ 69,86 : true
+ 36,105 : true
+ 46,105 : true
+ 132,78 : true
+ 132,74 : true
+ 24,52 : true
+ 58,77 : false
+ 18,87 : true
+ 38,77 : true
+ 78,87 : true
+ 68,87 : true
+ 68,77 : true
+ 78,77 : true
+ 67,53 : false
+ 57,53 : true
+ 47,53 : true
+ 83,52 : true
+ 53,52 : true
+ 17,53 : true
+ 33,52 : true
+ 43,52 : true
+ 43,99 : true
+ 53,99 : false
+ 23,99 : true
+ 33,99 : true
+ 29,120 : true
+ 93,99 : true
+ 87,53 : true
+ 73,99 : true
+ 132,72 : true
+ 48,120 : true
+ 54,52 : true
+ 47,105 : true
+ 194,41 : true
+ 13,99 : true
+ 146,84 : true
+ 132,65 : true
+ 39,77 : true
+ 37,87 : false
+ 59,77 : true
+ 17,87 : false
+ 67,87 : true
+ 77,87 : true
+ 47,87 : true
+ 89,77 : false
+ 122,26 : true
+ 132,64 : true
+ 132,63 : true
+ 26,65 : true
+ 165,15 : true
+ 132,59 : true
+ 132,55 : true
+ 133,46 : true
+ 10,95 : true
+ 132,50 : true
+ 132,43 : true
+ 132,46 : true
+ 132,44 : true
+ 120,18 : true
+ 132,47 : true
+ 50,65 : false
+ 132,39 : true
+ 121,9 : true
+ 129,1 : true
+ 132,37 : true
+ 116,99 : true
+ 184,41 : true
+ 124,6 : true
+ 136,84 : true
+ 197,32 : true
+ 132,29 : true
+ 132,28 : true
+ 15,116 : true
+ 102,49 : true
+ 119,65 : true
+ 128,14 : true
+ 132,25 : true
+ 132,24 : true
+ 132,26 : true
+ 132,21 : true
+ 103,63 : true
+ 103,12 : true
+ 175,15 : true
+ 132,18 : true
+ 132,17 : true
+ 36,78 : true
+ 132,14 : true
+ 132,12 : true
+ 132,11 : true
+ 130,18 : true
+ 142,47 : true
+ 191,45 : true
+ 132,6 : true
+ 14,71 : true
+ 132,2 : true
+ 114,22 : true
+ 131,98 : true
+ 126,84 : true
+ 131,94 : true
+ 199,1 : true
+ 134,6 : true
+ 131,89 : true
+ 131,88 : true
+ 138,14 : true
+ 131,86 : true
+ 131,85 : true
+ 112,49 : true
+ 131,84 : true
+ 131,81 : true
+ 84,53 : true
+ 94,53 : true
+ 64,53 : true
+ 74,53 : true
+ 135,55 : true
+ 131,77 : true
+ 185,15 : true
+ 96,99 : true
+ 86,99 : false
+ 76,99 : false
+ 66,99 : true
+ 56,99 : false
+ 44,53 : true
+ 36,99 : true
+ 26,99 : true
+ 34,53 : true
+ 95,65 : true
+ 131,73 : true
+ 131,72 : false
+ 131,71 : true
+ 144,6 : true
+ 116,84 : false
+ 169,37 : true
+ 189,1 : true
+ 119,60 : true
+ 19,75 : true
+ 131,65 : true
+ 119,89 : false
+ 108,14 : true
+ 131,62 : false
+ 131,61 : true
+ 131,59 : true
+ 1,83 : true
+ 83,53 : true
+ 73,53 : true
+ 63,53 : true
+ 162,47 : true
+ 145,55 : true
+ 97,99 : true
+ 195,15 : true
+ 77,99 : true
+ 87,99 : true
+ 57,99 : true
+ 67,99 : true
+ 37,99 : true
+ 43,53 : false
+ 17,99 : true
+ 27,99 : true
+ 109,3 : true
+ 127,61 : true
+ 131,44 : true
+ 110,13 : true
+ 179,1 : true
+ 154,6 : true
+ 79,67 : true
+ 179,37 : true
+ 9,83 : false
+ 109,60 : false
+ 22,72 : true
+ 106,84 : true
+ 5,83 : true
+ 6,83 : true
+ 7,83 : true
+ 8,83 : false
+ 131,35 : true
+ 108,38 : true
+ 131,34 : false
+ 37,146 : true
+ 73,56 : true
+ 83,56 : true
+ 12,87 : true
+ 127,33 : true
+ 131,30 : true
+ 131,29 : true
+ 13,147 : true
+ 131,27 : true
+ 137,34 : true
+ 131,22 : true
+ 131,20 : true
+ 82,93 : true
+ 131,18 : true
+ 131,17 : true
+ 131,16 : true
+ 118,93 : true
+ 127,68 : true
+ 94,76 : true
+ 144,89 : true
+ 147,25 : false
+ 21,87 : true
+ 31,87 : true
+ 64,56 : true
+ 54,56 : true
+ 61,87 : true
+ 71,87 : true
+ 81,87 : true
+ 14,56 : true
+ 41,129 : true
+ 31,129 : true
+ 21,129 : false
+ 86,56 : false
+ 131,12 : true
+ 134,27 : true
+ 13,120 : true
+ 11,87 : true
+ 131,9 : true
+ 131,8 : false
+ 131,5 : true
+ 115,97 : true
+ 131,4 : true
+ 131,3 : true
+ 131,1 : true
+ 131,2 : true
+ 8,60 : true
+ 130,96 : true
+ 128,15 : true
+ 192,35 : true
+ 177,25 : true
+ 117,68 : true
+ 130,90 : true
+ 166,33 : true
+ 33,56 : false
+ 43,56 : true
+ 53,56 : false
+ 63,56 : true
+ 20,137 : true
+ 30,137 : true
+ 40,137 : true
+ 50,137 : true
+ 32,129 : true
+ 42,129 : true
+ 12,129 : true
+ 22,129 : true
+ 70,53 : true
+ 80,53 : true
+ 50,53 : true
+ 60,53 : true
+ 30,53 : true
+ 40,53 : true
+ 10,53 : true
+ 20,53 : true
+ 130,87 : true
+ 130,84 : true
+ 121,2 : true
+ 130,83 : true
+ 129,81 : false
+ 7,108 : true
+ 130,78 : true
+ 75,80 : false
+ 29,138 : true
+ 19,138 : true
+ 49,138 : true
+ 39,138 : true
+ 62,56 : true
+ 52,56 : true
+ 42,56 : true
+ 32,56 : false
+ 31,137 : true
+ 12,56 : true
+ 163,21 : true
+ 41,137 : true
+ 130,74 : true
+ 106,55 : true
+ 120,29 : true
+ 100,95 : true
+ 84,56 : true
+ 74,56 : true
+ 147,99 : true
+ 94,56 : true
+ 130,71 : true
+ 130,70 : true
+ 130,69 : true
+ 130,68 : true
+ 20,57 : true
+ 151,2 : true
+ 130,64 : true
+ 128,100 : true
+ 130,58 : true
+ 130,57 : true
+ 108,93 : true
+ 130,55 : true
+ 183,16 : true
+ 146,33 : true
+ 187,34 : true
+ 137,68 : true
+ 51,56 : true
+ 61,56 : true
+ 52,87 : true
+ 42,87 : true
+ 72,87 : true
+ 62,87 : true
+ 92,87 : true
+ 82,87 : true
+ 29,60 : true
+ 20,129 : true
+ 30,129 : true
+ 40,129 : true
+ 69,60 : true
+ 79,60 : true
+ 49,60 : true
+ 59,60 : true
+ 117,44 : true
+ 105,33 : true
+ 89,60 : true
+ 99,60 : true
+ 141,2 : true
+ 130,45 : false
+ 130,43 : true
+ 80,94 : true
+ 130,41 : true
+ 130,36 : true
+ 149,81 : true
+ 16,121 : true
+ 26,121 : true
+ 36,121 : true
+ 46,121 : true
+ 177,34 : true
+ 18,56 : true
+ 161,31 : true
+ 38,56 : true
+ 28,56 : false
+ 58,56 : true
+ 48,56 : false
+ 78,56 : true
+ 68,56 : true
+ 15,129 : true
+ 28,60 : true
+ 18,60 : true
+ 122,47 : true
+ 78,60 : true
+ 68,60 : true
+ 58,60 : true
+ 25,129 : true
+ 174,27 : true
+ 130,29 : false
+ 98,60 : true
+ 88,60 : true
+ 115,64 : true
+ 130,22 : true
+ 130,20 : true
+ 130,16 : false
+ 103,82 : true
+ 18,101 : true
+ 28,101 : false
+ 38,101 : true
+ 48,101 : true
+ 106,91 : true
+ 126,43 : true
+ 130,14 : true
+ 14,137 : false
+ 24,137 : true
+ 34,137 : true
+ 44,137 : true
+ 47,56 : true
+ 57,56 : true
+ 67,56 : true
+ 77,56 : true
+ 130,13 : true
+ 16,129 : true
+ 85,56 : true
+ 95,56 : true
+ 46,129 : true
+ 14,112 : true
+ 26,129 : true
+ 36,129 : true
+ 130,11 : true
+ 19,76 : true
+ 130,7 : true
+ 38,66 : false
+ 130,4 : true
+ 107,68 : true
+ 95,83 : false
+ 130,1 : true
+ 17,101 : true
+ 14,121 : true
+ 37,101 : true
+ 27,101 : true
+ 44,121 : true
+ 47,101 : false
+ 24,121 : true
+ 34,121 : true
+ 36,56 : true
+ 26,56 : true
+ 45,137 : true
+ 35,137 : true
+ 76,56 : true
+ 66,56 : false
+ 56,56 : true
+ 46,56 : false
+ 98,56 : true
+ 88,56 : true
+ 13,129 : true
+ 72,86 : true
+ 33,129 : true
+ 23,129 : true
+ 166,6 : true
+ 43,129 : true
+ 5,148 : true
+ 6,148 : true
+ 7,148 : true
+ 8,148 : true
+ 1,148 : true
+ 2,148 : true
+ 3,148 : true
+ 4,148 : false
+ 129,97 : true
+ 148,93 : true
+ 15,121 : true
+ 139,81 : true
+ 35,121 : true
+ 25,121 : true
+ 111,2 : true
+ 45,121 : true
+ 32,137 : true
+ 42,137 : true
+ 12,137 : true
+ 22,137 : true
+ 65,56 : true
+ 75,56 : true
+ 45,56 : true
+ 55,56 : false
+ 4,84 : true
+ 3,84 : true
+ 6,84 : true
+ 5,84 : true
+ 129,93 : true
+ 129,91 : true
+ 2,84 : true
+ 1,84 : true
+ 110,29 : true
+ 138,78 : true
+ 150,95 : true
+ 105,97 : false
+ 8,84 : true
+ 7,84 : true
+ 113,90 : true
+ 9,84 : false
+ 39,101 : true
+ 29,101 : true
+ 32,121 : true
+ 42,121 : true
+ 129,84 : true
+ 129,82 : true
+ 129,79 : true
+ 49,101 : true
+ 43,137 : false
+ 33,137 : true
+ 23,137 : true
+ 13,137 : true
+ 139,40 : true
+ 146,10 : true
+ 176,43 : true
+ 162,36 : true
+ 129,74 : true
+ 129,73 : true
+ 129,72 : true
+ 129,69 : true
+ 128,80 : true
+ 129,66 : true
+ 49,129 : true
+ 39,129 : true
+ 200,29 : true
+ 129,63 : true
+ 143,90 : true
+ 129,61 : true
+ 135,72 : true
+ 129,59 : true
+ 195,46 : true
+ 129,57 : true
+ 13,121 : true
+ 44,101 : false
+ 177,17 : true
+ 128,93 : true
+ 147,59 : true
+ 43,121 : true
+ 33,121 : true
+ 23,121 : true
+ 29,129 : true
+ 19,129 : true
+ 129,52 : true
+ 163,16 : true
+ 152,36 : true
+ 129,40 : false
+ 129,46 : true
+ 129,45 : true
+ 127,5 : true
+ 74,79 : true
+ 75,84 : false
+ 3,83 : true
+ 168,38 : true
+ 138,80 : true
+ 122,20 : true
+ 129,30 : true
+ 20,144 : true
+ 30,144 : true
+ 129,29 : false
+ 10,144 : true
+ 129,28 : true
+ 165,46 : true
+ 40,144 : true
+ 50,144 : true
+ 30,121 : true
+ 33,101 : true
+ 10,121 : true
+ 4,58 : true
+ 126,28 : true
+ 188,5 : true
+ 23,101 : true
+ 8,58 : true
+ 113,66 : true
+ 120,63 : true
+ 173,16 : true
+ 129,23 : true
+ 129,21 : true
+ 142,36 : true
+ 129,18 : true
+ 166,10 : true
+ 143,100 : true
+ 129,13 : true
+ 27,56 : true
+ 123,36 : true
+ 47,129 : true
+ 37,129 : true
+ 148,80 : true
+ 129,8 : true
+ 11,144 : true
+ 129,6 : true
+ 31,144 : true
+ 21,144 : true
+ 3,58 : true
+ 2,58 : true
+ 1,58 : true
+ 129,5 : true
+ 6,60 : true
+ 11,121 : true
+ 36,101 : false
+ 46,101 : true
+ 16,101 : true
+ 26,101 : true
+ 127,59 : true
+ 129,2 : true
+ 130,63 : true
+ 123,66 : true
+ 27,129 : true
+ 1,60 : false
+ 2,60 : true
+ 3,60 : true
+ 4,60 : true
+ 5,60 : true
+ 128,98 : true
+ 7,91 : true
+ 133,36 : true
+ 128,95 : true
+ 38,129 : true
+ 48,129 : false
+ 113,4 : true
+ 123,8 : true
+ 145,72 : true
+ 12,144 : true
+ 22,144 : true
+ 32,144 : true
+ 42,144 : true
+ 110,95 : true
+ 111,81 : true
+ 128,86 : true
+ 107,25 : true
+ 128,83 : true
+ 45,101 : true
+ 35,101 : true
+ 25,101 : true
+ 15,101 : false
+ 186,10 : false
+ 137,59 : true
+ 128,73 : true
+ 128,72 : true
+ 18,129 : true
+ 28,129 : true
+ 128,71 : true
+ 128,70 : true
+ 21,122 : true
+ 113,16 : true
+ 128,68 : true
+ 103,36 : true
+ 128,66 : true
+ 128,64 : true
+ 120,22 : true
+ 112,32 : true
+ 117,47 : true
+ 128,58 : true
+ 82,92 : false
+ 125,9 : true
+ 128,55 : true
+ 128,54 : true
+ 120,95 : true
+ 128,53 : true
+ 50,121 : true
+ 167,34 : true
+ 50,110 : true
+ 118,5 : true
+ 137,52 : true
+ 108,13 : true
+ 128,42 : true
+ 98,75 : true
+ 128,40 : true
+ 196,10 : true
+ 120,70 : true
+ 128,38 : true
+ 169,40 : true
+ 128,33 : true
+ 43,109 : true
+ 33,109 : false
+ 23,109 : true
+ 13,109 : true
+ 113,36 : true
+ 128,32 : true
+ 128,31 : true
+ 128,30 : true
+ 128,29 : true
+ 128,28 : true
+ 112,86 : true
+ 128,26 : false
+ 128,23 : false
+ 128,22 : true
+ 125,97 : false
+ 128,20 : true
+ 109,77 : true
+ 128,18 : true
+ 157,34 : true
+ 130,95 : true
+ 128,13 : true
+ 128,10 : true
+ 127,25 : false
+ 50,115 : true
+ 128,6 : true
+ 128,5 : false
+ 128,4 : true
+ 128,3 : true
+ 9,58 : true
+ 127,100 : true
+ 127,99 : true
+ 127,98 : true
+ 105,8 : true
+ 133,16 : true
+ 159,40 : true
+ 127,91 : true
+ 20,143 : true
+ 127,84 : true
+ 127,80 : true
+ 186,44 : false
+ 123,7 : true
+ 127,72 : true
+ 127,71 : true
+ 127,65 : true
+ 100,80 : true
+ 135,97 : true
+ 127,57 : true
+ 73,61 : true
+ 127,55 : true
+ 147,34 : true
+ 140,95 : true
+ 127,49 : true
+ 197,17 : false
+ 127,46 : true
+ 110,1 : true
+ 138,5 : true
+ 127,43 : true
+ 107,58 : true
+ 157,25 : true
+ 127,40 : true
+ 127,39 : true
+ 118,29 : false
+ 140,70 : true
+ 131,31 : true
+ 127,32 : false
+ 127,30 : true
+ 127,28 : true
+ 104,27 : true
+ 16,144 : true
+ 26,144 : true
+ 36,144 : true
+ 46,144 : true
+ 127,27 : true
+ 149,78 : true
+ 127,22 : true
+ 184,20 : true
+ 127,19 : true
+ 127,18 : true
+ 115,94 : true
+ 140,8 : false
+ 127,47 : true
+ 127,14 : false
+ 127,13 : true
+ 127,10 : true
+ 84,72 : true
+ 114,51 : false
+ 127,6 : true
+ 129,44 : true
+ 11,83 : true
+ 127,2 : true
+ 127,1 : true
+ 126,23 : true
+ 50,109 : true
+ 138,32 : true
+ 73,57 : true
+ 116,61 : false
+ 10,109 : true
+ 20,109 : true
+ 30,109 : false
+ 40,109 : true
+ 17,144 : true
+ 126,98 : true
+ 119,27 : true
+ 126,96 : true
+ 134,41 : true
+ 47,144 : false
+ 37,144 : true
+ 27,144 : true
+ 9,117 : true
+ 126,94 : true
+ 126,93 : true
+ 149,26 : true
+ 5,117 : true
+ 6,117 : true
+ 7,117 : false
+ 8,117 : true
+ 126,89 : true
+ 126,87 : true
+ 139,44 : true
+ 126,83 : true
+ 121,28 : true
+ 126,82 : true
+ 126,81 : true
+ 126,79 : true
+ 126,61 : true
+ 113,58 : false
+ 126,77 : true
+ 126,76 : false
+ 66,58 : true
+ 126,72 : true
+ 126,71 : false
+ 126,68 : true
+ 126,64 : true
+ 18,144 : true
+ 126,62 : true
+ 126,60 : true
+ 48,144 : true
+ 124,41 : true
+ 28,144 : true
+ 38,144 : false
+ 119,26 : false
+ 120,8 : true
+ 126,59 : true
+ 96,53 : true
+ 117,84 : true
+ 122,37 : true
+ 124,10 : true
+ 126,54 : false
+ 126,52 : true
+ 126,49 : false
+ 126,48 : true
+ 126,47 : true
+ 126,46 : true
+ 146,23 : true
+ 126,44 : true
+ 126,42 : true
+ 101,50 : true
+ 19,103 : true
+ 126,38 : true
+ 118,32 : true
+ 49,103 : true
+ 42,109 : true
+ 29,103 : true
+ 39,103 : true
+ 49,80 : true
+ 126,36 : true
+ 19,144 : true
+ 126,33 : true
+ 39,144 : true
+ 29,144 : false
+ 114,41 : true
+ 49,144 : true
+ 126,31 : true
+ 129,26 : true
+ 130,8 : true
+ 105,94 : true
+ 126,24 : true
+ 126,21 : true
+ 126,20 : true
+ 147,84 : true
+ 126,18 : true
+ 27,85 : true
+ 126,16 : true
+ 126,15 : false
+ 83,93 : true
+ 126,13 : true
+ 157,47 : true
+ 126,10 : true
+ 18,103 : true
+ 19,92 : true
+ 106,61 : true
+ 126,8 : true
+ 21,109 : true
+ 48,103 : true
+ 41,109 : true
+ 31,109 : true
+ 126,6 : true
+ 126,5 : true
+ 109,78 : true
+ 95,57 : true
+ 126,3 : true
+ 108,70 : true
+ 125,100 : true
+ 104,41 : true
+ 180,8 : true
+ 125,95 : true
+ 116,83 : true
+ 162,35 : true
+ 125,92 : true
+ 125,89 : true
+ 137,84 : false
+ 125,84 : true
+ 37,103 : false
+ 47,103 : true
+ 116,15 : true
+ 125,83 : true
+ 125,79 : true
+ 17,112 : true
+ 17,103 : true
+ 27,103 : true
+ 125,74 : true
+ 17,107 : false
+ 133,66 : true
+ 128,56 : true
+ 47,107 : true
+ 38,67 : true
+ 27,107 : true
+ 37,107 : true
+ 5,116 : true
+ 4,116 : true
+ 7,116 : true
+ 6,116 : true
+ 9,116 : true
+ 8,116 : true
+ 125,65 : true
+ 125,64 : true
+ 110,8 : true
+ 125,94 : true
+ 152,35 : false
+ 198,5 : true
+ 125,56 : true
+ 103,90 : true
+ 107,5 : true
+ 125,53 : true
+ 46,103 : true
+ 36,103 : true
+ 125,52 : false
+ 155,3 : true
+ 125,48 : true
+ 125,47 : true
+ 26,103 : true
+ 16,103 : true
+ 16,107 : true
+ 115,10 : true
+ 108,32 : false
+ 143,66 : true
+ 1,116 : true
+ 46,107 : true
+ 36,107 : true
+ 2,116 : true
+ 129,78 : true
+ 125,33 : true
+ 125,31 : true
+ 125,28 : true
+ 125,26 : true
+ 125,20 : true
+ 125,18 : true
+ 125,17 : true
+ 125,16 : true
+ 125,15 : false
+ 160,8 : false
+ 56,62 : true
+ 125,10 : false
+ 125,72 : true
+ 118,48 : true
+ 14,99 : true
+ 124,21 : true
+ 149,44 : true
+ 35,103 : true
+ 45,103 : true
+ 15,103 : true
+ 25,103 : true
+ 124,100 : true
+ 114,50 : true
+ 19,107 : true
+ 29,107 : false
+ 39,107 : true
+ 49,107 : true
+ 158,32 : false
+ 121,88 : true
+ 148,56 : true
+ 1,100 : true
+ 124,94 : true
+ 124,93 : true
+ 124,91 : true
+ 119,78 : true
+ 124,90 : true
+ 124,89 : true
+ 145,94 : true
+ 124,85 : true
+ 124,79 : true
+ 170,8 : true
+ 124,77 : true
+ 124,76 : true
+ 115,85 : true
+ 124,74 : true
+ 16,70 : true
+ 123,90 : true
+ 159,44 : true
+ 124,68 : true
+ 44,103 : true
+ 34,103 : true
+ 24,103 : true
+ 14,103 : true
+ 124,62 : true
+ 124,61 : true
+ 28,107 : true
+ 18,107 : true
+ 48,107 : true
+ 38,107 : true
+ 144,20 : true
+ 146,61 : true
+ 124,53 : true
+ 168,32 : true
+ 124,51 : true
+ 124,50 : true
+ 124,49 : false
+ 14,129 : true
+ 24,129 : false
+ 34,129 : true
+ 44,129 : true
+ 124,45 : true
+ 122,35 : true
+ 111,68 : true
+ 47,112 : true
+ 124,39 : true
+ 124,38 : true
+ 135,18 : true
+ 138,91 : true
+ 116,55 : true
+ 124,33 : true
+ 13,103 : true
+ 23,103 : true
+ 33,103 : true
+ 43,103 : false
+ 52,75 : true
+ 124,31 : true
+ 101,2 : true
+ 101,68 : true
+ 130,73 : true
+ 124,28 : false
+ 156,15 : true
+ 150,45 : true
+ 124,23 : false
+ 147,54 : true
+ 125,3 : true
+ 40,62 : true
+ 50,62 : true
+ 60,62 : true
+ 70,62 : true
+ 80,62 : true
+ 90,62 : true
+ 124,20 : true
+ 124,17 : true
+ 105,65 : true
+ 112,35 : true
+ 37,84 : true
+ 102,86 : true
+ 112,85 : true
+ 117,93 : true
+ 126,55 : true
+ 184,31 : true
+ 73,68 : true
+ 63,68 : true
+ 32,103 : true
+ 43,68 : true
+ 6,93 : true
+ 42,103 : true
+ 8,93 : true
+ 7,93 : true
+ 2,93 : true
+ 1,93 : true
+ 4,55 : true
+ 5,55 : true
+ 6,55 : true
+ 7,55 : true
+ 20,62 : true
+ 30,62 : true
+ 116,52 : true
+ 17,146 : true
+ 191,5 : true
+ 123,100 : true
+ 123,99 : true
+ 123,98 : true
+ 199,26 : true
+ 123,91 : false
+ 123,89 : true
+ 142,35 : true
+ 142,85 : true
+ 123,86 : false
+ 123,85 : true
+ 123,84 : true
+ 174,31 : true
+ 119,40 : true
+ 21,103 : true
+ 31,103 : true
+ 70,68 : true
+ 80,68 : true
+ 50,68 : true
+ 60,68 : true
+ 41,103 : true
+ 40,68 : true
+ 167,17 : true
+ 22,75 : true
+ 121,68 : true
+ 110,73 : true
+ 185,41 : true
+ 53,84 : true
+ 170,45 : false
+ 123,74 : true
+ 123,73 : true
+ 123,71 : true
+ 123,70 : true
+ 106,52 : true
+ 108,91 : true
+ 115,65 : true
+ 123,65 : true
+ 123,64 : true
+ 10,68 : true
+ 20,68 : true
+ 123,63 : true
+ 48,139 : true
+ 123,59 : true
+ 164,31 : true
+ 109,40 : true
+ 123,55 : true
+ 30,103 : true
+ 20,103 : true
+ 10,103 : true
+ 100,70 : true
+ 198,30 : true
+ 165,18 : true
+ 50,103 : false
+ 40,103 : true
+ 199,7 : true
+ 157,17 : true
+ 146,15 : true
+ 131,68 : true
+ 123,46 : true
+ 160,45 : true
+ 123,43 : true
+ 123,41 : true
+ 123,40 : true
+ 150,29 : true
+ 79,55 : true
+ 123,37 : true
+ 143,73 : true
+ 123,33 : true
+ 117,77 : true
+ 80,83 : true
+ 122,85 : true
+ 179,26 : false
+ 123,28 : true
+ 123,27 : true
+ 11,68 : true
+ 81,56 : true
+ 31,68 : true
+ 21,68 : true
+ 42,68 : true
+ 52,68 : true
+ 62,68 : true
+ 72,68 : true
+ 82,68 : true
+ 92,68 : false
+ 123,25 : true
+ 111,28 : true
+ 123,21 : true
+ 198,13 : true
+ 123,19 : true
+ 123,16 : true
+ 143,21 : true
+ 123,13 : true
+ 123,12 : true
+ 104,39 : true
+ 43,144 : true
+ 33,144 : true
+ 23,144 : true
+ 13,144 : true
+ 9,126 : false
+ 123,9 : false
+ 128,91 : true
+ 127,77 : true
+ 189,26 : true
+ 117,45 : true
+ 123,3 : true
+ 53,66 : true
+ 50,117 : true
+ 12,68 : false
+ 22,68 : true
+ 32,68 : true
+ 188,32 : true
+ 122,94 : true
+ 122,93 : true
+ 116,23 : true
+ 121,60 : true
+ 122,90 : true
+ 117,14 : true
+ 122,89 : true
+ 50,87 : true
+ 40,87 : true
+ 30,87 : true
+ 20,87 : true
+ 90,87 : true
+ 80,87 : true
+ 70,87 : true
+ 60,87 : true
+ 34,144 : true
+ 61,62 : true
+ 51,62 : true
+ 41,62 : false
+ 134,76 : true
+ 18,116 : true
+ 91,62 : true
+ 81,62 : true
+ 122,11 : true
+ 122,84 : true
+ 102,35 : true
+ 159,26 : true
+ 33,68 : true
+ 23,68 : true
+ 13,68 : true
+ 109,98 : true
+ 64,68 : true
+ 74,68 : true
+ 44,68 : true
+ 54,68 : true
+ 122,81 : true
+ 131,28 : true
+ 84,68 : true
+ 94,68 : false
+ 107,77 : true
+ 136,61 : true
+ 122,78 : true
+ 115,100 : true
+ 31,62 : true
+ 21,62 : true
+ 11,62 : true
+ 161,2 : true
+ 62,62 : true
+ 72,62 : true
+ 42,62 : true
+ 52,62 : true
+ 122,72 : true
+ 144,76 : true
+ 82,62 : true
+ 92,62 : true
+ 122,70 : true
+ 132,85 : true
+ 169,26 : true
+ 122,64 : true
+ 24,68 : true
+ 34,68 : true
+ 119,98 : true
+ 14,68 : false
+ 51,68 : true
+ 41,68 : true
+ 71,68 : true
+ 61,68 : true
+ 91,68 : true
+ 81,68 : true
+ 101,28 : true
+ 122,63 : true
+ 122,62 : true
+ 122,59 : true
+ 122,56 : true
+ 122,54 : true
+ 22,62 : true
+ 32,62 : true
+ 108,3 : true
+ 12,62 : true
+ 130,31 : true
+ 122,46 : true
+ 91,96 : true
+ 81,96 : true
+ 88,67 : true
+ 2,64 : false
+ 186,2 : true
+ 122,38 : true
+ 111,14 : false
+ 126,56 : true
+ 130,49 : true
+ 97,93 : true
+ 92,98 : true
+ 142,98 : true
+ 3,85 : true
+ 122,24 : true
+ 52,98 : true
+ 62,98 : false
+ 72,98 : true
+ 82,98 : true
+ 12,98 : true
+ 22,98 : true
+ 32,98 : true
+ 42,98 : true
+ 109,13 : true
+ 194,44 : true
+ 37,150 : true
+ 103,5 : true
+ 129,33 : false
+ 171,43 : true
+ 122,18 : true
+ 108,62 : true
+ 122,17 : true
+ 120,31 : true
+ 82,96 : true
+ 92,96 : true
+ 9,85 : true
+ 101,63 : true
+ 122,14 : true
+ 176,2 : true
+ 121,14 : true
+ 122,86 : true
+ 122,10 : true
+ 85,73 : true
+ 47,68 : true
+ 91,98 : true
+ 121,98 : true
+ 121,93 : true
+ 61,98 : true
+ 51,98 : true
+ 81,98 : true
+ 71,98 : true
+ 21,98 : false
+ 11,98 : true
+ 41,98 : true
+ 31,98 : true
+ 31,96 : true
+ 21,96 : true
+ 11,96 : true
+ 121,92 : true
+ 71,96 : true
+ 61,96 : false
+ 51,96 : true
+ 41,96 : true
+ 121,90 : true
+ 74,77 : true
+ 110,31 : true
+ 121,86 : true
+ 111,63 : true
+ 71,65 : true
+ 121,81 : false
+ 8,56 : true
+ 150,49 : true
+ 121,20 : true
+ 118,57 : true
+ 121,73 : true
+ 17,133 : true
+ 121,70 : true
+ 37,133 : true
+ 27,133 : true
+ 46,133 : false
+ 54,98 : true
+ 24,98 : true
+ 34,98 : true
+ 84,98 : true
+ 94,98 : true
+ 64,98 : true
+ 74,98 : true
+ 189,23 : true
+ 121,65 : true
+ 103,45 : false
+ 174,44 : false
+ 121,61 : true
+ 14,98 : true
+ 122,91 : true
+ 102,95 : false
+ 121,59 : true
+ 105,9 : true
+ 121,57 : true
+ 121,56 : true
+ 200,31 : true
+ 121,54 : true
+ 121,51 : false
+ 121,49 : true
+ 119,7 : false
+ 101,14 : true
+ 121,42 : true
+ 120,49 : true
+ 121,40 : true
+ 16,133 : true
+ 26,133 : true
+ 36,133 : true
+ 53,98 : true
+ 43,98 : true
+ 33,98 : true
+ 23,98 : true
+ 93,98 : true
+ 83,98 : true
+ 73,98 : true
+ 63,98 : true
+ 121,39 : true
+ 179,23 : true
+ 113,5 : true
+ 105,85 : true
+ 13,98 : true
+ 119,33 : true
+ 112,95 : true
+ 121,37 : true
+ 93,93 : true
+ 121,35 : false
+ 121,34 : true
+ 170,31 : true
+ 111,21 : true
+ 155,9 : true
+ 159,33 : true
+ 165,35 : true
+ 121,26 : true
+ 109,24 : true
+ 121,25 : true
+ 118,31 : true
+ 121,21 : false
+ 121,74 : true
+ 83,79 : true
+ 125,71 : true
+ 107,39 : true
+ 196,8 : false
+ 167,19 : true
+ 18,96 : true
+ 28,96 : true
+ 38,96 : true
+ 48,96 : true
+ 58,96 : true
+ 148,62 : true
+ 114,42 : true
+ 60,99 : true
+ 132,38 : true
+ 143,5 : true
+ 180,28 : true
+ 154,44 : true
+ 17,131 : true
+ 120,97 : true
+ 114,14 : false
+ 105,43 : true
+ 120,92 : true
+ 165,9 : true
+ 120,89 : true
+ 112,18 : true
+ 169,33 : true
+ 120,83 : true
+ 140,49 : true
+ 102,18 : true
+ 128,57 : false
+ 120,78 : true
+ 120,77 : true
+ 135,71 : true
+ 120,74 : true
+ 120,73 : true
+ 120,72 : true
+ 131,92 : true
+ 119,46 : true
+ 120,69 : true
+ 120,68 : true
+ 120,66 : true
+ 120,65 : true
+ 104,42 : true
+ 138,62 : true
+ 139,13 : false
+ 52,59 : true
+ 190,28 : true
+ 120,54 : true
+ 120,51 : true
+ 173,5 : true
+ 120,47 : true
+ 150,31 : true
+ 120,45 : true
+ 120,43 : true
+ 179,33 : false
+ 185,35 : true
+ 120,40 : true
+ 135,9 : true
+ 77,96 : true
+ 67,96 : true
+ 97,96 : true
+ 87,96 : false
+ 120,35 : true
+ 120,34 : true
+ 90,98 : true
+ 124,99 : true
+ 70,98 : true
+ 80,98 : false
+ 50,98 : true
+ 60,98 : true
+ 30,98 : false
+ 40,98 : true
+ 10,98 : true
+ 20,98 : true
+ 110,70 : true
+ 112,38 : true
+ 128,62 : true
+ 120,20 : true
+ 134,44 : true
+ 120,17 : false
+ 108,27 : true
+ 120,16 : true
+ 121,63 : true
+ 56,58 : true
+ 120,11 : true
+ 120,7 : true
+ 120,6 : true
+ 189,33 : true
+ 145,9 : true
+ 20,148 : false
+ 68,96 : true
+ 78,96 : true
+ 88,96 : true
+ 98,96 : false
+ 131,74 : true
+ 5,107 : true
+ 134,99 : true
+ 119,94 : true
+ 51,92 : true
+ 61,92 : true
+ 17,96 : false
+ 41,92 : true
+ 11,92 : true
+ 21,92 : true
+ 57,96 : true
+ 47,96 : true
+ 119,13 : true
+ 118,17 : true
+ 119,92 : true
+ 118,62 : false
+ 91,92 : true
+ 153,5 : true
+ 71,92 : true
+ 81,92 : false
+ 154,42 : true
+ 131,63 : false
+ 119,86 : true
+ 177,27 : true
+ 119,84 : true
+ 119,82 : true
+ 119,81 : true
+ 119,79 : true
+ 99,96 : true
+ 89,96 : true
+ 79,96 : true
+ 69,96 : true
+ 119,76 : false
+ 148,59 : true
+ 119,74 : true
+ 119,73 : true
+ 60,92 : true
+ 50,92 : true
+ 34,96 : true
+ 44,96 : true
+ 20,92 : true
+ 10,92 : true
+ 172,38 : true
+ 168,40 : true
+ 108,17 : true
+ 119,68 : true
+ 119,63 : true
+ 116,97 : true
+ 72,92 : true
+ 90,92 : true
+ 80,92 : true
+ 70,92 : false
+ 167,27 : true
+ 139,78 : true
+ 119,57 : true
+ 29,140 : true
+ 195,35 : true
+ 119,52 : true
+ 119,50 : true
+ 119,49 : true
+ 119,48 : true
+ 119,47 : true
+ 112,54 : true
+ 77,73 : true
+ 74,84 : false
+ 119,39 : false
+ 119,37 : true
+ 91,70 : true
+ 19,96 : true
+ 119,32 : true
+ 119,30 : true
+ 177,4 : true
+ 59,96 : true
+ 49,96 : true
+ 39,96 : true
+ 29,96 : true
+ 126,97 : true
+ 108,47 : true
+ 119,24 : true
+ 119,23 : true
+ 159,23 : true
+ 144,44 : true
+ 10,78 : true
+ 119,18 : true
+ 119,17 : true
+ 157,27 : true
+ 134,42 : true
+ 119,14 : true
+ 119,12 : true
+ 169,24 : true
+ 119,10 : true
+ 121,43 : true
+ 119,3 : true
+ 93,96 : true
+ 119,2 : true
+ 141,22 : true
+ 63,96 : true
+ 53,96 : true
+ 83,96 : false
+ 73,96 : true
+ 36,96 : true
+ 46,96 : true
+ 16,96 : true
+ 26,96 : true
+ 152,38 : true
+ 188,40 : true
+ 115,8 : true
+ 118,95 : true
+ 114,94 : true
+ 128,17 : true
+ 95,78 : true
+ 142,100 : true
+ 118,83 : true
+ 118,81 : true
+ 118,80 : true
+ 118,77 : true
+ 118,72 : true
+ 118,71 : false
+ 118,70 : true
+ 124,42 : true
+ 118,68 : false
+ 118,66 : false
+ 118,64 : true
+ 64,71 : true
+ 94,96 : true
+ 118,59 : true
+ 118,58 : true
+ 118,56 : true
+ 54,96 : true
+ 64,96 : true
+ 74,96 : false
+ 84,96 : true
+ 9,141 : true
+ 13,96 : true
+ 43,96 : true
+ 6,141 : true
+ 178,40 : true
+ 159,13 : true
+ 157,4 : true
+ 125,8 : true
+ 1,141 : false
+ 118,47 : true
+ 106,97 : true
+ 19,110 : true
+ 5,141 : true
+ 4,141 : true
+ 3,141 : true
+ 2,141 : true
+ 118,44 : true
+ 118,43 : true
+ 101,77 : true
+ 194,42 : true
+ 118,40 : true
+ 141,43 : false
+ 118,38 : true
+ 189,24 : true
+ 118,33 : true
+ 121,22 : true
+ 118,30 : true
+ 95,96 : true
+ 39,133 : true
+ 29,133 : true
+ 65,96 : true
+ 55,96 : true
+ 127,37 : true
+ 112,37 : true
+ 48,133 : true
+ 118,26 : true
+ 114,11 : true
+ 118,25 : true
+ 118,24 : false
+ 164,22 : true
+ 102,36 : true
+ 118,22 : true
+ 29,70 : true
+ 148,17 : true
+ 118,15 : true
+ 122,95 : true
+ 118,13 : true
+ 118,12 : false
+ 118,11 : true
+ 118,9 : true
+ 184,42 : true
+ 113,26 : true
+ 179,24 : true
+ 118,6 : false
+ 131,43 : false
+ 118,2 : true
+ 108,58 : false
+ 76,92 : false
+ 96,96 : true
+ 117,98 : true
+ 28,133 : true
+ 38,133 : true
+ 56,96 : true
+ 66,96 : true
+ 45,96 : true
+ 47,133 : true
+ 25,96 : false
+ 15,96 : true
+ 137,4 : true
+ 124,11 : true
+ 117,91 : true
+ 117,90 : true
+ 18,69 : true
+ 112,36 : true
+ 117,83 : true
+ 199,23 : false
+ 132,95 : true
+ 117,73 : true
+ 117,67 : false
+ 117,66 : true
+ 117,65 : true
+ 174,42 : true
+ 129,24 : false
+ 109,6 : true
+ 117,59 : true
+ 117,58 : true
+ 7,104 : true
+ 117,54 : true
+ 117,53 : true
+ 131,14 : true
+ 117,50 : true
+ 106,56 : true
+ 117,27 : true
+ 9,69 : true
+ 168,46 : true
+ 128,59 : false
+ 6,108 : true
+ 5,69 : true
+ 8,69 : true
+ 5,108 : true
+ 2,69 : true
+ 1,69 : true
+ 4,69 : true
+ 3,69 : true
+ 17,117 : true
+ 123,5 : true
+ 122,36 : true
+ 117,43 : true
+ 92,70 : true
+ 187,19 : true
+ 117,40 : true
+ 149,23 : true
+ 164,42 : true
+ 117,30 : true
+ 117,28 : true
+ 107,7 : true
+ 107,27 : true
+ 117,25 : false
+ 199,24 : false
+ 104,80 : false
+ 132,54 : true
+ 117,21 : false
+ 108,57 : true
+ 117,19 : true
+ 2,108 : true
+ 3,108 : true
+ 138,59 : true
+ 1,108 : true
+ 42,52 : true
+ 117,12 : true
+ 199,13 : true
+ 49,133 : true
+ 21,136 : true
+ 113,98 : true
+ 154,22 : true
+ 117,3 : false
+ 117,1 : true
+ 116,100 : false
+ 104,11 : true
+ 132,36 : true
+ 197,19 : true
+ 146,97 : true
+ 139,23 : true
+ 116,94 : true
+ 157,37 : true
+ 9,139 : true
+ 161,32 : true
+ 125,61 : true
+ 6,139 : true
+ 5,139 : true
+ 8,139 : true
+ 7,139 : true
+ 2,139 : true
+ 1,139 : true
+ 4,139 : true
+ 3,139 : true
+ 116,80 : true
+ 116,79 : true
+ 9,137 : true
+ 53,64 : true
+ 7,137 : true
+ 8,137 : true
+ 5,137 : true
+ 6,137 : true
+ 3,137 : true
+ 29,148 : true
+ 1,137 : true
+ 2,137 : true
+ 116,77 : true
+ 143,69 : true
+ 137,45 : true
+ 116,71 : true
+ 116,69 : true
+ 106,78 : true
+ 125,35 : true
+ 116,64 : true
+ 116,62 : true
+ 167,37 : true
+ 135,61 : true
+ 116,58 : false
+ 116,56 : true
+ 116,49 : true
+ 116,48 : true
+ 123,80 : true
+ 168,24 : true
+ 116,45 : true
+ 116,44 : true
+ 116,43 : true
+ 116,42 : true
+ 36,126 : true
+ 116,39 : true
+ 6,76 : true
+ 116,32 : true
+ 198,27 : true
+ 116,29 : true
+ 116,28 : true
+ 109,28 : true
+ 116,26 : true
+ 185,12 : true
+ 116,22 : true
+ 133,69 : true
+ 116,20 : true
+ 115,35 : true
+ 116,19 : true
+ 102,30 : true
+ 116,16 : true
+ 65,78 : true
+ 152,18 : true
+ 141,32 : true
+ 105,61 : true
+ 116,11 : false
+ 116,10 : true
+ 133,80 : true
+ 166,2 : true
+ 116,6 : true
+ 116,4 : true
+ 64,57 : true
+ 122,77 : false
+ 102,54 : true
+ 115,99 : true
+ 45,147 : true
+ 115,93 : true
+ 115,92 : true
+ 115,89 : false
+ 115,87 : true
+ 124,75 : true
+ 115,80 : true
+ 121,100 : true
+ 115,78 : true
+ 115,74 : true
+ 115,72 : false
+ 115,71 : true
+ 115,70 : true
+ 130,93 : true
+ 115,67 : true
+ 123,69 : true
+ 130,28 : true
+ 135,41 : true
+ 115,58 : true
+ 18,76 : true
+ 115,61 : true
+ 115,56 : true
+ 115,55 : true
+ 151,32 : true
+ 156,2 : true
+ 143,80 : true
+ 115,49 : true
+ 115,48 : true
+ 112,77 : true
+ 115,47 : true
+ 115,46 : true
+ 115,42 : true
+ 114,62 : true
+ 102,74 : true
+ 115,36 : true
+ 115,34 : true
+ 114,75 : true
+ 115,33 : true
+ 115,30 : true
+ 115,28 : true
+ 115,26 : true
+ 115,24 : true
+ 115,20 : true
+ 115,18 : true
+ 115,15 : true
+ 115,13 : true
+ 113,69 : true
+ 115,12 : false
+ 125,41 : true
+ 115,9 : true
+ 20,78 : true
+ 135,35 : true
+ 115,3 : true
+ 137,7 : true
+ 105,42 : true
+ 114,67 : true
+ 114,98 : false
+ 114,96 : true
+ 96,56 : true
+ 118,94 : true
+ 114,91 : true
+ 98,57 : true
+ 114,88 : true
+ 114,86 : true
+ 114,85 : true
+ 114,83 : true
+ 114,82 : true
+ 114,81 : true
+ 111,42 : true
+ 101,100 : false
+ 114,78 : true
+ 13,87 : true
+ 103,69 : true
+ 114,76 : false
+ 114,74 : true
+ 114,73 : true
+ 114,72 : true
+ 109,64 : true
+ 146,78 : true
+ 110,93 : true
+ 114,68 : false
+ 114,99 : true
+ 175,12 : true
+ 115,41 : true
+ 146,41 : true
+ 131,32 : true
+ 127,7 : true
+ 114,48 : false
+ 114,46 : true
+ 114,45 : false
+ 128,94 : true
+ 114,39 : true
+ 38,62 : false
+ 114,37 : true
+ 114,36 : true
+ 198,40 : true
+ 41,138 : true
+ 114,31 : true
+ 114,30 : true
+ 118,96 : true
+ 174,26 : true
+ 65,95 : false
+ 131,100 : true
+ 114,21 : true
+ 114,20 : true
+ 114,19 : true
+ 114,17 : true
+ 114,16 : true
+ 120,93 : true
+ 114,13 : true
+ 17,119 : true
+ 136,78 : true
+ 104,99 : true
+ 145,12 : true
+ 105,41 : true
+ 27,120 : false
+ 114,6 : true
+ 114,1 : true
+ 137,37 : true
+ 117,7 : true
+ 113,96 : true
+ 113,92 : true
+ 145,61 : true
+ 113,89 : true
+ 12,58 : true
+ 32,54 : true
+ 113,85 : false
+ 113,83 : true
+ 101,22 : true
+ 113,82 : true
+ 128,96 : true
+ 101,87 : true
+ 37,148 : true
+ 47,148 : true
+ 113,78 : true
+ 135,85 : false
+ 105,92 : true
+ 113,74 : true
+ 17,148 : true
+ 27,148 : true
+ 113,71 : true
+ 136,97 : true
+ 113,65 : true
+ 113,64 : true
+ 113,63 : true
+ 113,60 : true
+ 113,59 : true
+ 126,78 : true
+ 36,114 : true
+ 113,55 : true
+ 34,117 : true
+ 147,37 : true
+ 60,65 : true
+ 113,50 : true
+ 113,49 : true
+ 113,47 : true
+ 113,46 : true
+ 113,44 : true
+ 113,43 : true
+ 113,41 : true
+ 79,80 : true
+ 138,96 : true
+ 4,117 : true
+ 103,50 : true
+ 48,148 : false
+ 38,148 : true
+ 145,85 : true
+ 113,33 : true
+ 13,77 : true
+ 113,30 : true
+ 28,148 : true
+ 18,148 : true
+ 113,28 : true
+ 113,27 : true
+ 100,93 : true
+ 113,24 : true
+ 113,22 : true
+ 113,21 : true
+ 116,78 : true
+ 165,12 : true
+ 106,2 : true
+ 113,14 : false
+ 151,28 : true
+ 148,60 : true
+ 36,52 : true
+ 113,6 : true
+ 9,81 : true
+ 114,44 : true
+ 7,81 : true
+ 8,81 : true
+ 5,81 : true
+ 6,81 : false
+ 27,142 : true
+ 37,142 : true
+ 47,142 : true
+ 2,81 : true
+ 98,84 : false
+ 183,40 : true
+ 124,26 : true
+ 135,12 : true
+ 100,87 : false
+ 112,94 : true
+ 112,91 : true
+ 109,46 : true
+ 112,89 : true
+ 104,79 : true
+ 182,5 : true
+ 29,62 : true
+ 128,27 : true
+ 112,84 : true
+ 112,83 : true
+ 112,82 : true
+ 112,81 : true
+ 112,80 : true
+ 138,60 : false
+ 112,75 : false
+ 112,74 : true
+ 112,72 : true
+ 149,91 : true
+ 186,41 : true
+ 171,32 : true
+ 112,65 : true
+ 16,142 : true
+ 112,64 : true
+ 36,142 : true
+ 26,142 : true
+ 112,63 : true
+ 46,142 : true
+ 105,12 : true
+ 18,137 : true
+ 28,137 : true
+ 38,137 : true
+ 48,137 : true
+ 33,119 : true
+ 112,58 : true
+ 112,53 : true
+ 14,86 : true
+ 112,46 : true
+ 112,45 : true
+ 87,70 : true
+ 112,43 : true
+ 112,42 : false
+ 118,89 : true
+ 118,27 : true
+ 171,28 : true
+ 128,60 : true
+ 112,31 : true
+ 176,41 : true
+ 112,27 : true
+ 107,46 : true
+ 112,25 : true
+ 112,24 : true
+ 87,61 : true
+ 13,117 : true
+ 1,56 : true
+ 120,87 : true
+ 35,84 : true
+ 112,14 : true
+ 157,7 : true
+ 112,6 : false
+ 19,137 : true
+ 64,93 : true
+ 39,137 : true
+ 29,137 : true
+ 111,100 : true
+ 49,137 : true
+ 111,93 : true
+ 111,92 : true
+ 111,91 : true
+ 111,90 : true
+ 111,88 : true
+ 9,99 : true
+ 107,92 : true
+ 27,105 : true
+ 111,83 : true
+ 128,89 : true
+ 118,60 : true
+ 111,79 : true
+ 166,41 : true
+ 141,28 : true
+ 105,69 : true
+ 195,11 : true
+ 124,44 : true
+ 111,67 : true
+ 162,14 : true
+ 111,59 : true
+ 111,58 : true
+ 111,56 : true
+ 111,55 : true
+ 111,54 : true
+ 111,53 : true
+ 111,51 : true
+ 26,137 : true
+ 36,137 : true
+ 125,12 : false
+ 16,137 : true
+ 111,47 : true
+ 111,44 : true
+ 46,137 : true
+ 111,43 : true
+ 114,79 : true
+ 111,40 : true
+ 111,39 : true
+ 111,38 : true
+ 111,36 : true
+ 138,27 : true
+ 111,34 : true
+ 111,33 : true
+ 110,40 : true
+ 129,53 : true
+ 111,25 : true
+ 111,22 : true
+ 108,60 : true
+ 121,32 : true
+ 111,20 : true
+ 108,96 : true
+ 10,122 : true
+ 140,87 : true
+ 111,17 : true
+ 28,87 : true
+ 111,13 : true
+ 111,12 : true
+ 111,11 : true
+ 111,10 : true
+ 26,98 : true
+ 27,137 : false
+ 46,98 : true
+ 56,98 : true
+ 66,98 : true
+ 76,98 : true
+ 86,98 : true
+ 47,137 : true
+ 108,33 : true
+ 10,96 : true
+ 20,96 : true
+ 30,96 : true
+ 40,96 : true
+ 50,96 : true
+ 60,96 : true
+ 16,98 : true
+ 139,53 : true
+ 161,28 : true
+ 111,4 : true
+ 110,98 : true
+ 104,44 : true
+ 110,92 : false
+ 136,2 : true
+ 110,83 : true
+ 110,85 : true
+ 110,84 : true
+ 110,87 : true
+ 110,82 : true
+ 110,80 : true
+ 81,83 : true
+ 110,78 : true
+ 110,77 : true
+ 35,98 : true
+ 25,98 : true
+ 55,98 : true
+ 45,98 : true
+ 75,98 : false
+ 65,98 : true
+ 95,98 : true
+ 85,98 : true
+ 194,10 : true
+ 107,45 : true
+ 110,75 : true
+ 110,74 : true
+ 108,59 : true
+ 120,28 : true
+ 15,98 : true
+ 110,67 : false
+ 109,53 : true
+ 110,66 : true
+ 126,2 : true
+ 110,63 : true
+ 138,94 : true
+ 110,60 : true
+ 110,58 : true
+ 101,32 : true
+ 110,55 : true
+ 19,142 : true
+ 10,72 : true
+ 110,53 : false
+ 49,142 : true
+ 110,52 : true
+ 29,142 : true
+ 39,142 : true
+ 168,17 : true
+ 108,77 : true
+ 15,139 : true
+ 110,49 : true
+ 110,48 : true
+ 108,4 : true
+ 75,62 : true
+ 110,46 : true
+ 22,96 : true
+ 32,96 : true
+ 110,45 : false
+ 12,96 : true
+ 62,96 : true
+ 72,96 : true
+ 42,96 : true
+ 52,96 : true
+ 80,96 : true
+ 90,96 : true
+ 10,90 : true
+ 116,2 : true
+ 111,32 : true
+ 148,94 : true
+ 110,38 : true
+ 110,37 : true
+ 18,142 : true
+ 110,35 : true
+ 110,34 : true
+ 110,28 : true
+ 110,27 : true
+ 48,142 : false
+ 38,142 : true
+ 28,142 : true
+ 178,27 : true
+ 110,24 : true
+ 110,22 : false
+ 198,17 : true
+ 110,16 : true
+ 4,109 : true
+ 118,4 : true
+ 110,11 : true
+ 110,7 : true
+ 183,50 : true
+ 110,3 : true
+ 127,45 : true
+ 109,100 : false
+ 172,18 : true
+ 119,91 : false
+ 109,94 : true
+ 36,122 : true
+ 46,122 : false
+ 109,93 : true
+ 109,92 : true
+ 138,33 : true
+ 160,43 : true
+ 14,115 : true
+ 26,122 : true
+ 84,60 : false
+ 74,60 : true
+ 64,60 : true
+ 54,60 : false
+ 44,60 : true
+ 34,60 : true
+ 24,60 : true
+ 14,60 : true
+ 17,76 : true
+ 116,85 : true
+ 109,86 : true
+ 104,71 : true
+ 109,85 : true
+ 109,84 : true
+ 109,83 : true
+ 109,81 : true
+ 23,115 : true
+ 33,115 : true
+ 43,115 : true
+ 109,79 : true
+ 128,19 : true
+ 47,61 : true
+ 143,2 : false
+ 137,8 : true
+ 47,122 : true
+ 37,122 : false
+ 141,49 : true
+ 109,71 : true
+ 107,62 : true
+ 148,33 : true
+ 27,122 : true
+ 13,115 : false
+ 75,60 : true
+ 85,60 : true
+ 55,60 : true
+ 65,60 : true
+ 35,60 : false
+ 45,60 : false
+ 15,60 : true
+ 25,60 : true
+ 126,85 : true
+ 109,65 : true
+ 114,71 : true
+ 86,73 : true
+ 126,27 : true
+ 66,78 : true
+ 46,115 : true
+ 36,115 : true
+ 109,57 : true
+ 41,59 : false
+ 109,50 : true
+ 163,11 : true
+ 75,65 : true
+ 133,2 : true
+ 147,8 : true
+ 23,136 : true
+ 24,122 : false
+ 34,122 : false
+ 137,62 : true
+ 14,122 : true
+ 12,115 : true
+ 96,60 : true
+ 44,122 : true
+ 180,43 : true
+ 66,60 : true
+ 56,60 : true
+ 86,60 : false
+ 76,60 : true
+ 26,60 : true
+ 16,60 : true
+ 46,60 : true
+ 36,60 : false
+ 13,61 : true
+ 23,61 : true
+ 18,83 : true
+ 109,31 : true
+ 106,3 : true
+ 116,27 : true
+ 124,71 : true
+ 109,26 : true
+ 41,115 : true
+ 107,73 : true
+ 21,115 : true
+ 31,115 : true
+ 53,61 : true
+ 63,61 : true
+ 33,61 : false
+ 43,61 : true
+ 35,122 : true
+ 25,122 : false
+ 15,122 : true
+ 122,79 : true
+ 97,60 : true
+ 11,115 : true
+ 109,19 : true
+ 45,122 : false
+ 57,60 : true
+ 67,60 : true
+ 77,60 : false
+ 87,60 : true
+ 17,60 : true
+ 27,60 : true
+ 37,60 : true
+ 47,60 : true
+ 24,61 : true
+ 14,61 : true
+ 106,85 : true
+ 109,18 : true
+ 109,14 : true
+ 21,121 : true
+ 146,27 : true
+ 134,71 : true
+ 34,115 : true
+ 24,115 : true
+ 84,61 : true
+ 44,115 : false
+ 64,61 : true
+ 54,61 : false
+ 44,61 : true
+ 34,61 : true
+ 117,62 : true
+ 131,49 : true
+ 112,79 : true
+ 141,38 : true
+ 113,2 : true
+ 107,42 : true
+ 129,25 : true
+ 108,90 : true
+ 23,105 : true
+ 13,105 : true
+ 28,115 : true
+ 18,115 : true
+ 154,9 : true
+ 119,99 : true
+ 168,4 : true
+ 178,33 : true
+ 108,82 : true
+ 108,81 : true
+ 108,80 : true
+ 108,72 : true
+ 37,115 : true
+ 47,115 : true
+ 34,105 : true
+ 44,105 : false
+ 177,8 : true
+ 110,65 : true
+ 108,69 : true
+ 168,19 : true
+ 108,67 : true
+ 108,66 : true
+ 108,56 : true
+ 108,53 : true
+ 108,52 : true
+ 102,79 : true
+ 114,10 : true
+ 147,62 : true
+ 108,49 : true
+ 103,2 : true
+ 108,48 : true
+ 119,25 : true
+ 14,105 : true
+ 24,105 : true
+ 17,115 : true
+ 27,115 : true
+ 129,99 : true
+ 164,9 : false
+ 102,63 : true
+ 174,35 : true
+ 108,40 : true
+ 84,100 : true
+ 108,37 : true
+ 108,31 : true
+ 45,105 : true
+ 35,105 : true
+ 108,30 : false
+ 108,29 : true
+ 108,26 : true
+ 166,27 : true
+ 178,19 : true
+ 108,22 : true
+ 108,21 : true
+ 108,20 : true
+ 26,110 : true
+ 108,18 : true
+ 108,15 : false
+ 121,38 : true
+ 38,122 : true
+ 48,122 : false
+ 18,122 : true
+ 28,122 : true
+ 22,60 : true
+ 108,5 : true
+ 26,115 : true
+ 16,115 : true
+ 122,51 : true
+ 188,4 : true
+ 108,1 : true
+ 158,33 : true
+ 134,9 : false
+ 151,40 : true
+ 107,93 : true
+ 111,86 : true
+ 104,14 : true
+ 51,86 : true
+ 21,86 : true
+ 37,70 : false
+ 35,115 : true
+ 45,115 : true
+ 156,27 : true
+ 31,86 : true
+ 197,8 : true
+ 38,80 : true
+ 123,2 : true
+ 36,104 : true
+ 108,19 : true
+ 107,91 : false
+ 131,38 : true
+ 127,62 : true
+ 49,122 : true
+ 39,122 : true
+ 29,122 : true
+ 19,122 : true
+ 74,86 : false
+ 38,70 : true
+ 15,115 : true
+ 25,115 : true
+ 191,32 : true
+ 112,51 : true
+ 168,33 : true
+ 194,35 : true
+ 141,40 : true
+ 144,9 : true
+ 50,61 : true
+ 40,61 : true
+ 30,61 : true
+ 20,61 : true
+ 90,61 : true
+ 38,115 : true
+ 43,105 : false
+ 60,61 : true
+ 77,86 : true
+ 183,11 : false
+ 76,62 : true
+ 149,65 : true
+ 10,61 : true
+ 92,94 : true
+ 17,86 : true
+ 118,19 : true
+ 19,70 : false
+ 144,10 : true
+ 124,22 : true
+ 38,92 : true
+ 28,92 : true
+ 12,94 : true
+ 38,110 : false
+ 28,83 : true
+ 109,34 : true
+ 14,150 : true
+ 181,38 : true
+ 24,150 : false
+ 184,35 : true
+ 107,84 : true
+ 108,46 : true
+ 22,86 : true
+ 137,97 : true
+ 160,6 : true
+ 141,100 : true
+ 23,94 : false
+ 54,66 : false
+ 29,83 : true
+ 39,83 : true
+ 17,110 : true
+ 147,42 : true
+ 23,150 : true
+ 33,150 : true
+ 13,70 : true
+ 36,119 : true
+ 24,126 : true
+ 97,66 : true
+ 73,70 : true
+ 63,70 : true
+ 93,70 : false
+ 142,79 : true
+ 135,54 : true
+ 7,128 : true
+ 23,104 : true
+ 33,104 : true
+ 6,128 : true
+ 3,128 : true
+ 142,63 : true
+ 118,46 : true
+ 139,34 : true
+ 39,110 : false
+ 29,110 : false
+ 49,110 : false
+ 107,78 : true
+ 80,89 : true
+ 4,104 : true
+ 50,150 : true
+ 107,97 : true
+ 35,70 : true
+ 25,70 : true
+ 32,89 : false
+ 12,89 : true
+ 36,70 : true
+ 137,42 : true
+ 26,86 : true
+ 36,86 : true
+ 31,89 : true
+ 25,80 : true
+ 40,89 : true
+ 130,6 : true
+ 144,22 : true
+ 19,73 : true
+ 49,86 : true
+ 132,79 : true
+ 109,25 : true
+ 177,37 : true
+ 40,126 : true
+ 169,34 : true
+ 161,38 : true
+ 107,69 : true
+ 9,76 : true
+ 128,46 : true
+ 107,66 : true
+ 107,65 : true
+ 7,92 : true
+ 139,99 : false
+ 29,111 : true
+ 39,111 : true
+ 49,115 : true
+ 180,6 : false
+ 107,61 : true
+ 13,73 : true
+ 81,64 : true
+ 21,120 : true
+ 16,89 : true
+ 148,19 : true
+ 127,42 : true
+ 102,26 : true
+ 16,73 : true
+ 35,100 : true
+ 7,106 : true
+ 102,20 : true
+ 9,131 : true
+ 35,89 : true
+ 7,131 : true
+ 8,131 : true
+ 5,131 : true
+ 6,131 : true
+ 3,131 : false
+ 4,131 : true
+ 138,46 : true
+ 119,34 : false
+ 22,117 : true
+ 32,117 : true
+ 29,115 : true
+ 39,115 : true
+ 149,99 : true
+ 19,115 : true
+ 150,6 : true
+ 107,54 : true
+ 107,53 : false
+ 28,64 : true
+ 107,50 : true
+ 107,49 : false
+ 107,48 : true
+ 107,47 : true
+ 1,131 : true
+ 2,131 : true
+ 112,26 : true
+ 117,42 : true
+ 112,20 : true
+ 72,70 : false
+ 33,117 : true
+ 23,117 : true
+ 35,73 : true
+ 105,54 : true
+ 34,92 : true
+ 101,31 : true
+ 90,65 : true
+ 115,95 : true
+ 107,40 : true
+ 78,67 : true
+ 50,60 : true
+ 40,60 : true
+ 30,60 : false
+ 20,60 : true
+ 90,60 : true
+ 80,60 : true
+ 70,60 : true
+ 60,60 : true
+ 107,37 : true
+ 107,36 : true
+ 107,35 : true
+ 124,14 : true
+ 10,60 : true
+ 27,108 : true
+ 25,109 : true
+ 107,30 : true
+ 17,89 : true
+ 126,37 : true
+ 73,92 : true
+ 187,42 : true
+ 45,111 : true
+ 113,11 : true
+ 163,22 : true
+ 107,23 : true
+ 132,51 : true
+ 134,22 : true
+ 107,19 : true
+ 107,17 : false
+ 34,76 : true
+ 107,14 : true
+ 179,34 : true
+ 107,11 : true
+ 41,60 : true
+ 51,60 : true
+ 21,60 : true
+ 31,60 : true
+ 81,60 : true
+ 91,60 : true
+ 61,60 : true
+ 71,60 : true
+ 107,10 : true
+ 42,73 : true
+ 134,14 : true
+ 26,111 : true
+ 147,97 : false
+ 11,60 : true
+ 35,108 : true
+ 29,89 : true
+ 116,37 : true
+ 25,108 : true
+ 177,42 : true
+ 8,126 : true
+ 123,11 : true
+ 173,22 : true
+ 73,94 : true
+ 154,12 : true
+ 125,54 : true
+ 32,71 : true
+ 107,3 : false
+ 100,51 : true
+ 21,73 : true
+ 17,111 : true
+ 50,122 : true
+ 135,95 : true
+ 30,122 : true
+ 40,122 : true
+ 52,60 : true
+ 42,60 : true
+ 72,60 : true
+ 62,60 : true
+ 92,60 : true
+ 82,60 : true
+ 28,89 : true
+ 36,109 : false
+ 18,108 : true
+ 16,109 : true
+ 188,19 : true
+ 48,108 : true
+ 12,60 : true
+ 37,81 : true
+ 24,95 : true
+ 167,42 : true
+ 106,98 : true
+ 105,35 : true
+ 55,75 : true
+ 42,127 : true
+ 103,80 : false
+ 22,127 : true
+ 12,127 : true
+ 115,54 : true
+ 65,100 : false
+ 130,15 : true
+ 105,95 : true
+ 106,90 : false
+ 18,111 : false
+ 106,87 : true
+ 41,122 : true
+ 31,122 : true
+ 43,60 : true
+ 53,60 : true
+ 63,60 : true
+ 73,60 : true
+ 83,60 : true
+ 93,60 : true
+ 68,93 : true
+ 106,79 : true
+ 73,52 : true
+ 103,11 : true
+ 106,77 : true
+ 198,19 : true
+ 77,53 : true
+ 9,121 : true
+ 8,121 : true
+ 7,121 : true
+ 6,121 : false
+ 5,121 : true
+ 4,121 : false
+ 3,121 : true
+ 2,121 : true
+ 1,121 : false
+ 149,24 : true
+ 112,67 : true
+ 140,15 : true
+ 39,89 : true
+ 106,68 : true
+ 24,135 : true
+ 106,66 : true
+ 106,65 : true
+ 18,72 : true
+ 106,64 : true
+ 38,72 : true
+ 28,72 : true
+ 58,72 : true
+ 48,72 : true
+ 78,72 : true
+ 68,72 : true
+ 98,72 : true
+ 88,72 : true
+ 104,35 : false
+ 26,126 : true
+ 116,41 : true
+ 1,129 : true
+ 2,129 : true
+ 106,62 : true
+ 42,75 : true
+ 16,126 : true
+ 22,142 : true
+ 106,57 : true
+ 34,133 : true
+ 44,133 : true
+ 14,133 : true
+ 24,133 : true
+ 4,138 : true
+ 150,15 : true
+ 142,67 : true
+ 139,24 : true
+ 79,57 : true
+ 34,136 : false
+ 119,59 : true
+ 106,47 : false
+ 43,106 : false
+ 17,72 : true
+ 27,72 : true
+ 37,72 : true
+ 47,72 : true
+ 57,72 : true
+ 67,72 : true
+ 77,72 : true
+ 87,72 : false
+ 15,74 : true
+ 25,74 : true
+ 35,74 : false
+ 45,74 : true
+ 55,74 : true
+ 65,74 : false
+ 75,74 : true
+ 85,74 : false
+ 95,74 : true
+ 106,45 : true
+ 106,43 : true
+ 23,133 : true
+ 13,133 : true
+ 43,133 : true
+ 33,133 : true
+ 121,77 : true
+ 2,122 : false
+ 106,42 : true
+ 132,67 : true
+ 32,108 : true
+ 4,122 : true
+ 6,122 : true
+ 106,38 : true
+ 104,61 : false
+ 31,108 : true
+ 189,25 : true
+ 162,32 : true
+ 173,2 : true
+ 102,46 : true
+ 46,78 : true
+ 139,30 : true
+ 16,74 : true
+ 106,28 : true
+ 36,74 : true
+ 26,74 : true
+ 56,74 : true
+ 46,74 : true
+ 76,74 : false
+ 66,74 : true
+ 96,74 : true
+ 86,74 : true
+ 106,27 : false
+ 1,65 : true
+ 39,81 : true
+ 42,114 : true
+ 164,12 : true
+ 106,23 : true
+ 170,15 : true
+ 111,77 : true
+ 46,112 : true
+ 106,15 : true
+ 106,13 : true
+ 106,10 : true
+ 106,9 : false
+ 106,8 : true
+ 132,32 : true
+ 114,61 : false
+ 104,32 : true
+ 119,100 : false
+ 109,30 : true
+ 163,2 : true
+ 98,81 : true
+ 105,99 : true
+ 23,74 : true
+ 33,74 : false
+ 100,64 : true
+ 13,74 : false
+ 63,74 : true
+ 73,74 : true
+ 43,74 : true
+ 53,74 : true
+ 105,93 : false
+ 113,75 : true
+ 83,74 : true
+ 93,74 : true
+ 45,133 : true
+ 35,133 : true
+ 25,133 : true
+ 15,133 : true
+ 96,93 : true
+ 180,15 : true
+ 105,89 : true
+ 105,87 : true
+ 11,133 : true
+ 105,84 : true
+ 174,12 : false
+ 84,67 : true
+ 44,72 : true
+ 34,72 : false
+ 64,72 : true
+ 54,72 : true
+ 113,88 : true
+ 105,74 : true
+ 24,72 : true
+ 14,72 : true
+ 34,74 : true
+ 24,74 : true
+ 14,74 : true
+ 98,67 : true
+ 74,74 : true
+ 64,74 : true
+ 54,74 : true
+ 44,74 : true
+ 40,133 : false
+ 50,133 : true
+ 20,133 : true
+ 30,133 : true
+ 105,72 : true
+ 105,71 : true
+ 33,85 : true
+ 111,74 : true
+ 105,68 : true
+ 105,67 : true
+ 190,15 : true
+ 72,56 : true
+ 79,99 : false
+ 10,133 : true
+ 80,58 : true
+ 184,12 : true
+ 33,72 : true
+ 43,72 : true
+ 53,72 : true
+ 63,72 : true
+ 27,135 : true
+ 103,88 : true
+ 13,72 : true
+ 23,72 : true
+ 31,74 : true
+ 41,74 : true
+ 51,74 : true
+ 61,74 : true
+ 73,72 : true
+ 83,72 : true
+ 11,74 : true
+ 21,74 : true
+ 105,58 : true
+ 193,26 : true
+ 150,66 : true
+ 160,11 : true
+ 71,74 : true
+ 81,74 : true
+ 91,74 : true
+ 38,99 : true
+ 28,99 : true
+ 48,99 : true
+ 78,99 : true
+ 8,115 : true
+ 194,12 : true
+ 7,115 : true
+ 197,27 : false
+ 104,22 : true
+ 179,30 : true
+ 105,48 : true
+ 18,135 : true
+ 114,100 : true
+ 23,143 : true
+ 38,60 : false
+ 133,88 : true
+ 144,61 : true
+ 42,74 : true
+ 32,74 : true
+ 62,74 : true
+ 52,74 : false
+ 52,64 : true
+ 105,36 : true
+ 22,74 : true
+ 12,74 : false
+ 5,102 : true
+ 6,102 : true
+ 3,102 : true
+ 4,102 : true
+ 12,133 : true
+ 22,133 : true
+ 32,133 : true
+ 92,74 : false
+ 105,28 : true
+ 105,27 : true
+ 187,27 : true
+ 105,24 : true
+ 105,23 : true
+ 22,101 : true
+ 105,20 : true
+ 105,18 : true
+ 29,72 : true
+ 39,72 : true
+ 104,100 : true
+ 19,72 : true
+ 69,72 : true
+ 79,72 : true
+ 49,72 : true
+ 59,72 : true
+ 105,15 : true
+ 127,97 : true
+ 89,72 : true
+ 99,72 : true
+ 42,57 : true
+ 79,70 : true
+ 47,83 : true
+ 126,41 : true
+ 105,2 : true
+ 41,133 : true
+ 31,133 : true
+ 21,133 : true
+ 105,1 : false
+ 31,119 : true
+ 41,119 : true
+ 130,66 : true
+ 145,83 : true
+ 52,92 : true
+ 191,14 : true
+ 104,98 : true
+ 195,9 : true
+ 104,96 : true
+ 43,101 : true
+ 199,30 : true
+ 104,93 : true
+ 104,92 : true
+ 27,141 : true
+ 17,141 : true
+ 33,90 : false
+ 156,13 : true
+ 53,76 : true
+ 182,31 : true
+ 60,74 : true
+ 50,74 : true
+ 40,74 : true
+ 30,74 : true
+ 20,74 : true
+ 10,74 : true
+ 129,89 : true
+ 43,76 : true
+ 150,11 : true
+ 38,76 : true
+ 140,28 : true
+ 115,60 : true
+ 110,43 : true
+ 90,74 : true
+ 80,74 : true
+ 70,74 : true
+ 20,90 : true
+ 104,88 : true
+ 97,52 : true
+ 104,85 : true
+ 9,102 : true
+ 27,134 : true
+ 7,102 : true
+ 8,102 : true
+ 104,83 : true
+ 169,30 : true
+ 104,81 : true
+ 68,74 : true
+ 109,76 : true
+ 104,77 : true
+ 187,41 : true
+ 29,141 : true
+ 39,141 : true
+ 115,79 : true
+ 17,68 : true
+ 41,76 : true
+ 4,81 : true
+ 104,75 : true
+ 104,74 : false
+ 12,143 : true
+ 145,60 : true
+ 104,68 : true
+ 153,26 : true
+ 150,28 : false
+ 104,62 : true
+ 55,70 : true
+ 149,73 : true
+ 32,90 : true
+ 171,14 : true
+ 52,90 : true
+ 62,90 : true
+ 72,90 : true
+ 42,133 : true
+ 57,80 : true
+ 109,23 : true
+ 104,49 : true
+ 66,72 : true
+ 56,72 : true
+ 46,72 : true
+ 36,72 : true
+ 26,72 : true
+ 16,72 : true
+ 104,48 : true
+ 176,13 : false
+ 105,79 : true
+ 104,45 : true
+ 27,76 : false
+ 37,76 : true
+ 109,89 : true
+ 96,72 : false
+ 86,72 : true
+ 76,72 : true
+ 65,91 : true
+ 123,26 : false
+ 65,92 : true
+ 56,52 : true
+ 104,30 : true
+ 101,4 : true
+ 144,77 : true
+ 104,26 : true
+ 74,99 : true
+ 52,72 : true
+ 53,68 : true
+ 131,87 : true
+ 104,19 : true
+ 104,18 : true
+ 189,30 : true
+ 185,9 : false
+ 55,72 : true
+ 65,72 : true
+ 35,72 : true
+ 45,72 : true
+ 15,72 : false
+ 25,72 : true
+ 166,13 : true
+ 49,123 : true
+ 193,5 : true
+ 104,10 : false
+ 104,9 : true
+ 21,64 : false
+ 95,72 : false
+ 104,6 : true
+ 75,72 : true
+ 85,72 : false
+ 133,26 : true
+ 21,90 : true
+ 125,60 : true
+ 41,90 : true
+ 200,43 : true
+ 61,90 : true
+ 104,3 : true
+ 69,57 : true
+ 196,13 : true
+ 12,122 : true
+ 22,122 : false
+ 32,122 : true
+ 42,122 : true
+ 103,100 : true
+ 103,98 : true
+ 102,24 : false
+ 200,15 : true
+ 15,90 : false
+ 103,94 : true
+ 30,76 : false
+ 103,92 : true
+ 84,92 : true
+ 193,2 : true
+ 16,119 : true
+ 46,119 : true
+ 107,33 : true
+ 103,89 : true
+ 45,139 : true
+ 103,86 : false
+ 103,85 : true
+ 103,84 : true
+ 46,59 : false
+ 103,78 : true
+ 58,100 : true
+ 143,75 : true
+ 190,11 : true
+ 103,70 : true
+ 9,109 : true
+ 6,109 : true
+ 5,109 : true
+ 13,122 : true
+ 111,87 : false
+ 33,122 : true
+ 23,122 : true
+ 29,56 : true
+ 43,122 : true
+ 7,99 : false
+ 1,109 : true
+ 110,15 : true
+ 6,99 : false
+ 100,75 : true
+ 103,66 : true
+ 103,65 : true
+ 104,12 : true
+ 103,64 : true
+ 132,20 : true
+ 99,74 : true
+ 103,61 : true
+ 103,60 : true
+ 103,59 : true
+ 59,74 : true
+ 69,74 : true
+ 79,74 : true
+ 89,74 : true
+ 19,74 : true
+ 29,74 : true
+ 39,74 : true
+ 49,74 : true
+ 103,58 : true
+ 34,119 : true
+ 24,119 : true
+ 105,60 : true
+ 121,87 : true
+ 103,53 : true
+ 103,51 : true
+ 87,73 : true
+ 111,49 : true
+ 103,47 : true
+ 103,46 : true
+ 109,59 : true
+ 29,76 : true
+ 120,15 : true
+ 103,44 : true
+ 103,43 : true
+ 122,32 : true
+ 103,40 : true
+ 114,12 : true
+ 37,119 : true
+ 47,119 : true
+ 103,39 : true
+ 26,113 : true
+ 103,35 : true
+ 103,33 : true
+ 38,131 : true
+ 103,28 : true
+ 145,79 : true
+ 160,28 : false
+ 3,66 : true
+ 103,26 : true
+ 46,113 : true
+ 103,21 : true
+ 123,44 : true
+ 103,19 : true
+ 103,18 : true
+ 103,16 : true
+ 31,95 : true
+ 96,77 : true
+ 56,65 : true
+ 101,15 : true
+ 103,8 : true
+ 49,77 : true
+ 103,6 : true
+ 79,90 : true
+ 103,4 : true
+ 38,128 : true
+ 49,116 : true
+ 28,77 : true
+ 152,20 : true
+ 102,87 : true
+ 124,12 : true
+ 102,84 : false
+ 195,10 : true
+ 97,74 : true
+ 102,81 : true
+ 77,74 : true
+ 87,74 : true
+ 57,74 : true
+ 67,74 : true
+ 37,74 : true
+ 47,74 : true
+ 17,74 : true
+ 27,74 : true
+ 20,115 : true
+ 10,115 : true
+ 40,115 : true
+ 30,115 : true
+ 43,135 : true
+ 102,77 : true
+ 39,120 : true
+ 115,37 : true
+ 102,72 : true
+ 30,148 : true
+ 126,17 : true
+ 102,68 : true
+ 182,44 : true
+ 23,119 : true
+ 112,62 : true
+ 119,55 : true
+ 27,109 : true
+ 71,93 : true
+ 134,95 : true
+ 173,43 : true
+ 69,82 : true
+ 59,82 : true
+ 49,82 : false
+ 39,82 : true
+ 29,82 : true
+ 19,82 : true
+ 88,52 : true
+ 102,58 : true
+ 102,57 : true
+ 99,62 : true
+ 102,51 : false
+ 102,43 : true
+ 136,99 : true
+ 99,82 : true
+ 89,82 : true
+ 79,82 : true
+ 102,40 : true
+ 102,38 : true
+ 102,37 : true
+ 75,53 : true
+ 102,32 : true
+ 101,84 : true
+ 102,31 : true
+ 116,17 : false
+ 126,9 : true
+ 172,44 : true
+ 107,13 : true
+ 102,62 : false
+ 17,116 : true
+ 59,58 : true
+ 163,43 : true
+ 97,62 : false
+ 107,43 : false
+ 70,65 : true
+ 113,51 : true
+ 132,40 : true
+ 40,65 : true
+ 170,23 : true
+ 49,117 : true
+ 39,117 : true
+ 29,117 : true
+ 19,117 : true
+ 102,16 : true
+ 78,53 : true
+ 166,46 : true
+ 17,71 : false
+ 102,9 : true
+ 101,83 : true
+ 39,67 : true
+ 94,52 : true
+ 101,99 : true
+ 146,17 : false
+ 119,19 : true
+ 101,95 : true
+ 111,84 : true
+ 101,93 : true
+ 137,13 : true
+ 136,9 : true
+ 101,88 : true
+ 113,79 : false
+ 101,86 : true
+ 152,28 : true
+ 91,82 : true
+ 101,80 : true
+ 101,79 : true
+ 74,82 : true
+ 122,40 : true
+ 4,108 : true
+ 101,67 : true
+ 79,77 : true
+ 101,53 : true
+ 101,59 : true
+ 143,14 : true
+ 132,19 : true
+ 101,56 : true
+ 101,55 : true
+ 101,49 : true
+ 101,41 : true
+ 101,40 : true
+ 148,86 : true
+ 101,38 : true
+ 96,98 : true
+ 136,17 : true
+ 14,67 : true
+ 83,64 : true
+ 101,34 : false
+ 101,33 : true
+ 121,84 : true
+ 81,65 : true
+ 91,65 : true
+ 109,55 : true
+ 33,67 : true
+ 162,28 : true
+ 51,65 : true
+ 61,65 : true
+ 14,57 : true
+ 24,57 : true
+ 34,57 : true
+ 44,57 : true
+ 10,75 : true
+ 30,75 : true
+ 48,115 : true
+ 152,40 : false
+ 49,148 : true
+ 20,121 : true
+ 134,56 : false
+ 21,65 : true
+ 64,65 : true
+ 190,23 : true
+ 126,99 : true
+ 186,46 : true
+ 13,57 : true
+ 81,67 : true
+ 91,67 : true
+ 61,67 : true
+ 71,67 : true
+ 35,75 : true
+ 33,57 : true
+ 139,19 : true
+ 35,117 : true
+ 25,117 : true
+ 11,67 : true
+ 117,13 : true
+ 1,134 : true
+ 41,67 : true
+ 51,67 : true
+ 21,67 : true
+ 31,67 : true
+ 101,18 : true
+ 101,17 : true
+ 26,67 : true
+ 114,29 : true
+ 28,123 : true
+ 18,123 : true
+ 48,123 : true
+ 38,123 : true
+ 101,10 : true
+ 6,118 : true
+ 4,118 : true
+ 152,19 : true
+ 2,118 : true
+ 1,118 : true
+ 143,33 : true
+ 45,67 : true
+ 3,96 : true
+ 4,96 : true
+ 1,96 : true
+ 2,96 : true
+ 147,64 : true
+ 26,117 : true
+ 16,57 : true
+ 26,57 : true
+ 12,67 : false
+ 134,38 : false
+ 123,79 : true
+ 76,61 : true
+ 52,67 : false
+ 42,67 : true
+ 32,67 : true
+ 22,67 : false
+ 104,29 : true
+ 98,87 : true
+ 42,115 : true
+ 25,67 : true
+ 160,50 : true
+ 9,142 : true
+ 92,65 : true
+ 42,65 : true
+ 122,19 : true
+ 62,65 : true
+ 9,96 : true
+ 52,65 : false
+ 7,96 : true
+ 8,96 : true
+ 5,96 : true
+ 6,96 : true
+ 27,117 : true
+ 117,46 : true
+ 25,57 : true
+ 159,19 : true
+ 106,17 : false
+ 177,13 : true
+ 45,68 : true
+ 137,64 : false
+ 100,94 : true
+ 68,100 : false
+ 100,91 : true
+ 70,86 : true
+ 68,80 : true
+ 18,67 : true
+ 30,117 : true
+ 132,62 : true
+ 45,65 : true
+ 46,123 : true
+ 36,123 : true
+ 26,123 : true
+ 55,65 : true
+ 162,40 : true
+ 109,48 : true
+ 85,65 : true
+ 108,86 : true
+ 135,60 : true
+ 18,57 : true
+ 103,14 : true
+ 16,123 : true
+ 28,57 : true
+ 172,19 : true
+ 48,57 : true
+ 70,67 : true
+ 60,67 : true
+ 90,67 : true
+ 80,67 : true
+ 58,57 : false
+ 100,82 : true
+ 127,64 : true
+ 26,59 : true
+ 103,79 : true
+ 100,77 : true
+ 10,67 : true
+ 114,38 : true
+ 30,67 : true
+ 20,67 : true
+ 50,67 : true
+ 40,67 : false
+ 100,73 : true
+ 15,65 : true
+ 90,82 : true
+ 25,65 : true
+ 19,123 : true
+ 29,123 : true
+ 39,123 : true
+ 60,82 : false
+ 30,82 : true
+ 40,82 : true
+ 10,82 : true
+ 20,82 : true
+ 31,117 : true
+ 173,33 : true
+ 10,138 : true
+ 5,58 : false
+ 100,66 : true
+ 179,19 : true
+ 100,63 : true
+ 195,4 : true
+ 57,83 : true
+ 100,58 : false
+ 43,65 : true
+ 157,13 : true
+ 93,65 : true
+ 2,135 : true
+ 128,97 : true
+ 5,135 : true
+ 6,135 : true
+ 2,91 : false
+ 106,99 : false
+ 1,91 : true
+ 22,134 : true
+ 32,134 : true
+ 110,50 : true
+ 44,123 : true
+ 81,82 : true
+ 71,82 : true
+ 42,134 : true
+ 51,82 : true
+ 41,82 : true
+ 31,82 : true
+ 21,82 : true
+ 11,82 : true
+ 100,53 : true
+ 124,56 : true
+ 14,123 : false
+ 77,93 : true
+ 144,95 : true
+ 46,65 : true
+ 66,65 : true
+ 19,57 : true
+ 174,38 : true
+ 49,57 : true
+ 39,57 : true
+ 29,57 : true
+ 62,67 : true
+ 196,17 : true
+ 99,93 : false
+ 138,97 : true
+ 99,89 : true
+ 99,87 : false
+ 13,143 : true
+ 189,19 : false
+ 31,134 : true
+ 21,134 : false
+ 11,134 : true
+ 37,123 : true
+ 99,80 : true
+ 99,78 : true
+ 99,77 : true
+ 41,134 : true
+ 94,62 : true
+ 99,71 : true
+ 95,52 : true
+ 99,59 : true
+ 114,56 : true
+ 17,123 : true
+ 34,131 : true
+ 99,52 : true
+ 4,90 : true
+ 175,4 : true
+ 18,78 : true
+ 98,95 : true
+ 22,105 : true
+ 32,105 : true
+ 9,53 : true
+ 188,39 : true
+ 108,97 : true
+ 18,120 : true
+ 11,105 : true
+ 41,105 : false
+ 105,100 : true
+ 162,44 : false
+ 199,19 : true
+ 128,41 : true
+ 30,134 : true
+ 40,134 : true
+ 50,134 : true
+ 113,70 : true
+ 123,20 : true
+ 52,93 : true
+ 10,134 : true
+ 20,134 : true
+ 143,51 : true
+ 27,62 : true
+ 55,64 : true
+ 11,77 : false
+ 65,64 : true
+ 31,77 : true
+ 42,123 : true
+ 32,123 : true
+ 185,4 : true
+ 23,102 : true
+ 29,81 : true
+ 44,93 : true
+ 15,64 : true
+ 98,62 : true
+ 154,38 : true
+ 33,102 : true
+ 98,61 : false
+ 118,97 : true
+ 26,64 : true
+ 143,79 : true
+ 152,44 : true
+ 3,123 : true
+ 118,41 : true
+ 5,123 : true
+ 25,123 : true
+ 35,123 : true
+ 45,123 : true
+ 4,123 : true
+ 16,81 : true
+ 164,29 : true
+ 180,50 : true
+ 114,90 : true
+ 98,55 : true
+ 133,51 : true
+ 98,52 : true
+ 36,71 : true
+ 90,83 : true
+ 24,101 : true
+ 28,82 : true
+ 15,123 : true
+ 122,33 : true
+ 97,92 : false
+ 97,87 : true
+ 97,83 : true
+ 155,4 : true
+ 168,39 : true
+ 97,75 : true
+ 25,77 : true
+ 28,81 : true
+ 22,102 : true
+ 97,73 : true
+ 160,3 : true
+ 97,69 : true
+ 97,65 : true
+ 97,61 : true
+ 63,71 : true
+ 51,64 : false
+ 13,62 : true
+ 20,123 : true
+ 10,123 : true
+ 133,43 : true
+ 102,80 : false
+ 31,64 : true
+ 20,93 : true
+ 30,93 : true
+ 97,56 : true
+ 106,58 : true
+ 12,142 : false
+ 40,123 : true
+ 30,123 : true
+ 54,80 : true
+ 50,123 : true
+ 105,37 : true
+ 112,33 : true
+ 22,64 : false
+ 34,62 : true
+ 42,64 : true
+ 165,4 : true
+ 196,46 : true
+ 11,93 : true
+ 8,92 : true
+ 6,92 : true
+ 150,3 : true
+ 29,105 : true
+ 13,142 : true
+ 104,95 : true
+ 23,142 : true
+ 96,92 : false
+ 13,123 : false
+ 23,123 : true
+ 26,107 : true
+ 176,42 : true
+ 96,83 : true
+ 113,20 : true
+ 43,64 : true
+ 148,72 : true
+ 112,87 : true
+ 101,36 : true
+ 73,64 : true
+ 133,14 : true
+ 138,86 : true
+ 16,93 : true
+ 33,123 : true
+ 43,123 : true
+ 21,102 : true
+ 67,77 : true
+ 102,33 : true
+ 30,142 : true
+ 20,142 : true
+ 96,78 : true
+ 135,4 : true
+ 96,64 : true
+ 21,142 : true
+ 140,3 : true
+ 186,17 : true
+ 141,15 : true
+ 114,95 : true
+ 30,72 : false
+ 20,72 : true
+ 148,97 : true
+ 130,50 : true
+ 14,134 : true
+ 24,134 : true
+ 34,134 : true
+ 44,134 : true
+ 27,69 : true
+ 153,43 : true
+ 96,54 : true
+ 126,58 : true
+ 122,87 : true
+ 23,107 : true
+ 110,54 : true
+ 122,80 : true
+ 96,52 : false
+ 34,67 : false
+ 104,56 : true
+ 50,131 : true
+ 194,38 : false
+ 125,37 : true
+ 109,11 : true
+ 178,39 : true
+ 95,88 : true
+ 95,87 : true
+ 145,4 : true
+ 130,3 : true
+ 3,94 : true
+ 21,69 : true
+ 176,17 : true
+ 25,62 : true
+ 15,62 : true
+ 2,100 : true
+ 124,95 : true
+ 13,134 : true
+ 112,40 : true
+ 33,134 : true
+ 23,134 : true
+ 24,142 : true
+ 43,134 : true
+ 14,142 : true
+ 143,43 : false
+ 9,100 : true
+ 8,100 : false
+ 100,54 : true
+ 88,93 : true
+ 31,123 : true
+ 41,123 : true
+ 30,64 : true
+ 40,64 : true
+ 10,64 : true
+ 26,62 : false
+ 119,11 : true
+ 95,60 : true
+ 141,36 : true
+ 126,4 : true
+ 95,53 : true
+ 68,75 : true
+ 106,59 : true
+ 161,15 : true
+ 19,65 : true
+ 161,10 : true
+ 28,93 : true
+ 117,41 : true
+ 76,52 : true
+ 94,97 : true
+ 122,22 : true
+ 105,7 : true
+ 112,19 : true
+ 133,32 : true
+ 9,56 : false
+ 121,80 : true
+ 67,75 : true
+ 57,75 : true
+ 94,87 : false
+ 19,93 : true
+ 59,93 : true
+ 141,67 : true
+ 183,20 : true
+ 29,93 : true
+ 94,84 : true
+ 40,94 : true
+ 66,52 : true
+ 129,55 : true
+ 12,116 : true
+ 42,72 : true
+ 32,72 : true
+ 131,36 : true
+ 25,69 : true
+ 15,69 : true
+ 32,116 : true
+ 94,77 : true
+ 131,15 : true
+ 35,147 : true
+ 107,41 : true
+ 15,147 : true
+ 25,147 : true
+ 94,74 : true
+ 94,72 : true
+ 86,58 : true
+ 143,32 : true
+ 132,22 : true
+ 153,20 : true
+ 21,72 : false
+ 131,80 : true
+ 102,28 : true
+ 134,77 : true
+ 24,69 : true
+ 131,67 : false
+ 94,66 : true
+ 94,63 : true
+ 26,147 : false
+ 16,147 : true
+ 94,61 : true
+ 94,60 : true
+ 94,59 : true
+ 94,57 : true
+ 26,87 : true
+ 93,97 : true
+ 79,94 : true
+ 121,36 : true
+ 93,92 : true
+ 181,15 : true
+ 181,10 : true
+ 39,53 : true
+ 29,53 : true
+ 59,53 : true
+ 79,53 : true
+ 18,145 : true
+ 46,64 : true
+ 18,92 : true
+ 76,58 : true
+ 142,22 : true
+ 132,94 : true
+ 200,6 : true
+ 23,77 : true
+ 113,32 : false
+ 141,80 : false
+ 54,71 : true
+ 121,67 : true
+ 93,71 : true
+ 93,68 : true
+ 93,62 : true
+ 93,61 : true
+ 56,71 : false
+ 93,59 : true
+ 93,56 : true
+ 92,54 : true
+ 82,54 : true
+ 72,54 : true
+ 2,124 : true
+ 3,124 : true
+ 42,54 : true
+ 1,124 : true
+ 6,124 : true
+ 7,124 : true
+ 4,124 : true
+ 5,124 : true
+ 40,120 : true
+ 93,53 : true
+ 8,124 : true
+ 9,124 : true
+ 102,94 : true
+ 93,52 : true
+ 92,99 : true
+ 102,19 : false
+ 10,86 : true
+ 92,93 : true
+ 92,92 : true
+ 123,32 : true
+ 22,54 : true
+ 12,54 : true
+ 114,77 : true
+ 92,79 : true
+ 196,42 : true
+ 173,20 : true
+ 70,96 : true
+ 92,67 : true
+ 91,54 : true
+ 36,53 : true
+ 71,54 : true
+ 81,54 : true
+ 51,54 : false
+ 61,54 : true
+ 31,54 : true
+ 41,54 : true
+ 113,8 : true
+ 24,120 : true
+ 14,120 : true
+ 70,99 : true
+ 121,10 : true
+ 40,83 : true
+ 43,120 : true
+ 181,36 : true
+ 1,71 : true
+ 2,71 : true
+ 145,7 : true
+ 46,87 : true
+ 104,90 : true
+ 129,48 : true
+ 185,37 : false
+ 16,52 : true
+ 9,71 : true
+ 21,54 : true
+ 7,71 : true
+ 8,71 : true
+ 5,71 : true
+ 6,71 : true
+ 3,71 : true
+ 4,71 : true
+ 80,54 : true
+ 70,54 : true
+ 45,53 : true
+ 90,54 : true
+ 40,54 : true
+ 30,54 : true
+ 60,54 : true
+ 50,54 : true
+ 35,53 : true
+ 171,15 : true
+ 25,53 : true
+ 15,53 : false
+ 21,99 : true
+ 131,10 : true
+ 171,36 : true
+ 61,99 : true
+ 40,138 : true
+ 20,138 : true
+ 103,71 : true
+ 135,7 : true
+ 138,2 : true
+ 15,52 : true
+ 25,52 : true
+ 15,87 : true
+ 39,69 : true
+ 92,57 : true
+ 20,54 : false
+ 10,54 : true
+ 92,55 : true
+ 92,52 : true
+ 1,120 : true
+ 174,9 : true
+ 80,59 : true
+ 54,87 : false
+ 200,34 : false
+ 34,87 : true
+ 14,87 : false
+ 14,77 : true
+ 91,94 : true
+ 80,66 : true
+ 91,87 : true
+ 53,87 : true
+ 55,77 : true
+ 43,87 : true
+ 23,87 : true
+ 161,36 : false
+ 141,10 : true
+ 137,41 : true
+ 125,7 : true
+ 153,32 : true
+ 28,120 : true
+ 31,81 : true
+ 112,28 : true
+ 102,22 : true
+ 51,81 : true
+ 61,81 : true
+ 91,76 : true
+ 91,75 : true
+ 11,53 : true
+ 15,99 : true
+ 18,105 : true
+ 141,68 : true
+ 140,6 : true
+ 20,102 : true
+ 1,140 : true
+ 66,54 : true
+ 3,140 : true
+ 2,140 : true
+ 5,140 : true
+ 4,140 : true
+ 7,140 : true
+ 6,140 : true
+ 9,140 : true
+ 3,130 : true
+ 4,130 : true
+ 5,130 : true
+ 6,130 : true
+ 7,130 : true
+ 8,130 : true
+ 9,130 : true
+ 163,32 : false
+ 115,7 : true
+ 30,78 : true
+ 5,85 : true
+ 4,85 : true
+ 122,28 : true
+ 2,85 : true
+ 1,130 : true
+ 18,53 : true
+ 8,85 : true
+ 7,85 : false
+ 6,85 : true
+ 36,54 : false
+ 26,54 : true
+ 16,54 : true
+ 25,105 : true
+ 65,54 : true
+ 75,54 : true
+ 45,54 : true
+ 55,54 : true
+ 159,39 : true
+ 62,99 : true
+ 85,54 : true
+ 95,54 : true
+ 12,93 : true
+ 22,93 : true
+ 20,76 : true
+ 9,112 : true
+ 8,112 : true
+ 7,112 : true
+ 6,112 : true
+ 5,112 : true
+ 136,60 : true
+ 153,8 : true
+ 108,2 : true
+ 193,28 : true
+ 148,41 : true
+ 10,76 : true
+ 102,44 : false
+ 58,87 : true
+ 48,87 : true
+ 183,33 : true
+ 164,14 : true
+ 18,77 : true
+ 25,54 : true
+ 35,54 : true
+ 16,105 : true
+ 15,54 : true
+ 54,54 : true
+ 44,54 : true
+ 74,54 : true
+ 64,54 : true
+ 94,54 : true
+ 84,54 : true
+ 26,105 : true
+ 63,99 : true
+ 19,120 : false
+ 13,52 : true
+ 23,52 : true
+ 69,77 : true
+ 91,66 : false
+ 34,106 : true
+ 57,87 : true
+ 169,11 : false
+ 4,112 : true
+ 3,112 : true
+ 2,112 : true
+ 1,112 : true
+ 11,61 : true
+ 138,41 : true
+ 23,78 : false
+ 148,73 : true
+ 193,33 : false
+ 53,78 : true
+ 91,56 : true
+ 174,14 : true
+ 14,54 : true
+ 91,51 : true
+ 34,54 : true
+ 24,54 : true
+ 43,54 : false
+ 53,54 : true
+ 63,54 : true
+ 73,54 : true
+ 83,54 : true
+ 93,54 : false
+ 139,39 : true
+ 3,81 : true
+ 12,61 : true
+ 90,94 : false
+ 90,91 : true
+ 62,81 : false
+ 52,81 : true
+ 14,78 : true
+ 179,11 : true
+ 24,78 : true
+ 173,8 : true
+ 44,78 : true
+ 116,60 : true
+ 83,59 : false
+ 14,53 : true
+ 19,105 : true
+ 133,28 : true
+ 149,48 : true
+ 140,92 : true
+ 14,76 : true
+ 44,110 : true
+ 27,61 : true
+ 37,61 : true
+ 13,54 : true
+ 23,54 : true
+ 33,54 : true
+ 11,78 : true
+ 104,78 : true
+ 57,61 : true
+ 41,78 : true
+ 51,78 : true
+ 21,78 : true
+ 2,83 : true
+ 129,39 : true
+ 4,83 : true
+ 34,123 : true
+ 149,11 : true
+ 33,53 : true
+ 23,53 : true
+ 186,9 : true
+ 14,81 : true
+ 34,81 : false
+ 143,8 : true
+ 18,61 : false
+ 12,78 : true
+ 90,76 : false
+ 90,75 : false
+ 84,59 : true
+ 106,60 : true
+ 143,28 : true
+ 46,71 : true
+ 150,92 : true
+ 41,87 : true
+ 51,87 : true
+ 155,7 : true
+ 182,19 : true
+ 90,66 : true
+ 58,69 : true
+ 121,15 : true
+ 166,17 : true
+ 90,55 : true
+ 90,53 : true
+ 72,82 : true
+ 160,34 : true
+ 13,56 : true
+ 23,56 : true
+ 10,87 : true
+ 14,148 : true
+ 62,75 : true
+ 159,11 : true
+ 196,9 : true
+ 89,92 : true
+ 11,137 : true
+ 22,56 : true
+ 21,137 : true
+ 89,89 : true
+ 193,8 : true
+ 188,41 : false
+ 89,80 : true
+ 194,29 : true
+ 32,87 : true
+ 143,20 : false
+ 133,70 : true
+ 41,56 : true
+ 11,56 : true
+ 21,56 : true
+ 19,60 : true
+ 8,82 : true
+ 7,82 : true
+ 5,82 : true
+ 156,17 : true
+ 3,82 : true
+ 8,140 : true
+ 89,71 : true
+ 150,34 : true
+ 45,129 : true
+ 53,80 : true
+ 17,56 : true
+ 129,11 : true
+ 37,56 : true
+ 89,59 : true
+ 89,57 : true
+ 47,67 : true
+ 25,137 : true
+ 15,137 : true
+ 166,9 : true
+ 2,147 : true
+ 163,8 : true
+ 178,41 : true
+ 19,88 : false
+ 25,56 : true
+ 103,32 : false
+ 184,29 : true
+ 15,56 : true
+ 120,98 : true
+ 143,70 : true
+ 12,121 : true
+ 22,121 : true
+ 19,101 : true
+ 11,148 : true
+ 11,113 : true
+ 88,92 : true
+ 139,55 : true
+ 25,71 : false
+ 45,71 : true
+ 41,72 : true
+ 26,92 : true
+ 14,101 : true
+ 88,80 : true
+ 106,4 : true
+ 10,148 : true
+ 139,11 : true
+ 88,78 : true
+ 88,77 : true
+ 7,58 : true
+ 6,58 : true
+ 176,9 : true
+ 88,74 : true
+ 128,2 : true
+ 173,28 : true
+ 56,54 : true
+ 87,80 : true
+ 122,44 : true
+ 163,20 : true
+ 168,41 : true
+ 88,59 : true
+ 184,14 : true
+ 130,98 : true
+ 9,60 : true
+ 100,92 : true
+ 88,57 : true
+ 88,55 : true
+ 17,129 : true
+ 16,148 : true
+ 12,71 : false
+ 111,15 : true
+ 144,78 : true
+ 149,55 : true
+ 15,148 : true
+ 21,71 : true
+ 170,34 : true
+ 41,71 : true
+ 32,52 : true
+ 87,83 : true
+ 146,9 : true
+ 24,148 : true
+ 29,145 : true
+ 87,78 : false
+ 48,124 : true
+ 18,71 : true
+ 183,28 : true
+ 112,22 : true
+ 45,131 : true
+ 183,8 : true
+ 35,131 : true
+ 112,44 : true
+ 133,20 : true
+ 158,41 : false
+ 39,65 : false
+ 194,14 : true
+ 100,98 : true
+ 195,7 : true
+ 26,131 : true
+ 142,94 : true
+ 86,97 : true
+ 86,96 : true
+ 119,58 : true
+ 86,83 : true
+ 86,80 : true
+ 90,95 : true
+ 9,79 : false
+ 70,95 : true
+ 60,95 : true
+ 50,95 : true
+ 5,79 : true
+ 30,95 : true
+ 7,79 : true
+ 8,79 : true
+ 1,79 : true
+ 2,79 : true
+ 3,79 : true
+ 4,79 : true
+ 102,5 : true
+ 48,121 : true
+ 86,78 : true
+ 110,76 : true
+ 9,98 : true
+ 15,83 : true
+ 109,62 : true
+ 50,132 : true
+ 5,98 : true
+ 6,98 : true
+ 7,98 : true
+ 8,98 : true
+ 1,98 : true
+ 2,98 : true
+ 3,98 : true
+ 4,98 : true
+ 6,104 : true
+ 117,56 : true
+ 9,104 : true
+ 147,9 : true
+ 86,62 : true
+ 62,92 : true
+ 147,86 : true
+ 182,6 : true
+ 5,103 : true
+ 4,103 : true
+ 3,103 : true
+ 2,103 : true
+ 9,103 : true
+ 8,103 : true
+ 7,103 : true
+ 6,103 : true
+ 103,38 : true
+ 31,131 : true
+ 41,131 : true
+ 132,5 : true
+ 1,103 : true
+ 21,131 : true
+ 71,62 : true
+ 162,43 : true
+ 133,40 : true
+ 104,13 : true
+ 85,97 : true
+ 85,96 : true
+ 85,95 : true
+ 32,109 : true
+ 12,109 : true
+ 22,109 : true
+ 117,86 : true
+ 2,132 : true
+ 1,132 : true
+ 4,132 : true
+ 135,28 : true
+ 42,131 : true
+ 192,6 : true
+ 169,46 : true
+ 195,8 : true
+ 13,136 : true
+ 25,139 : true
+ 85,83 : true
+ 85,80 : false
+ 116,14 : true
+ 85,78 : true
+ 11,109 : true
+ 38,103 : false
+ 28,103 : true
+ 122,5 : false
+ 51,66 : true
+ 192,43 : true
+ 62,64 : true
+ 189,3 : true
+ 85,57 : true
+ 113,57 : true
+ 108,39 : true
+ 134,13 : true
+ 37,149 : false
+ 23,96 : true
+ 84,84 : true
+ 163,40 : true
+ 3,116 : true
+ 84,74 : true
+ 127,9 : true
+ 84,71 : true
+ 84,70 : true
+ 84,63 : true
+ 145,28 : true
+ 84,57 : true
+ 84,52 : true
+ 83,99 : true
+ 83,97 : true
+ 46,61 : true
+ 83,94 : true
+ 126,14 : true
+ 83,92 : true
+ 76,77 : true
+ 83,83 : true
+ 16,64 : true
+ 121,19 : true
+ 100,76 : true
+ 53,82 : true
+ 83,71 : true
+ 182,43 : true
+ 152,5 : true
+ 50,148 : true
+ 40,121 : true
+ 103,57 : false
+ 113,40 : true
+ 124,13 : false
+ 12,103 : true
+ 9,93 : true
+ 22,103 : true
+ 5,93 : true
+ 94,95 : true
+ 84,95 : true
+ 74,95 : false
+ 64,95 : true
+ 3,55 : true
+ 3,93 : true
+ 144,68 : true
+ 8,55 : true
+ 14,95 : true
+ 11,120 : true
+ 9,55 : true
+ 82,94 : true
+ 41,120 : true
+ 44,95 : true
+ 34,95 : true
+ 31,120 : true
+ 131,19 : true
+ 120,79 : true
+ 133,38 : true
+ 15,138 : true
+ 169,3 : false
+ 82,76 : true
+ 82,75 : true
+ 142,5 : true
+ 12,125 : true
+ 22,125 : true
+ 32,125 : false
+ 42,125 : true
+ 140,42 : true
+ 30,68 : true
+ 82,72 : true
+ 82,69 : true
+ 177,49 : true
+ 107,86 : true
+ 26,109 : true
+ 80,78 : true
+ 34,138 : true
+ 27,92 : true
+ 82,57 : true
+ 69,53 : true
+ 12,120 : true
+ 4,113 : false
+ 82,52 : true
+ 32,55 : true
+ 145,8 : true
+ 42,120 : true
+ 32,120 : true
+ 22,120 : true
+ 110,79 : true
+ 35,129 : true
+ 31,121 : true
+ 141,19 : true
+ 172,5 : true
+ 81,51 : true
+ 80,100 : true
+ 109,42 : true
+ 21,125 : false
+ 11,125 : true
+ 41,125 : true
+ 31,125 : true
+ 80,95 : true
+ 130,42 : true
+ 20,86 : true
+ 173,40 : true
+ 72,95 : true
+ 62,95 : true
+ 92,95 : true
+ 82,95 : true
+ 44,144 : true
+ 14,144 : true
+ 24,144 : false
+ 197,22 : true
+ 1,117 : true
+ 2,117 : true
+ 12,95 : true
+ 139,42 : true
+ 32,95 : true
+ 22,95 : true
+ 52,95 : true
+ 42,95 : true
+ 113,38 : true
+ 80,82 : true
+ 151,19 : true
+ 100,79 : true
+ 15,144 : true
+ 162,5 : true
+ 50,125 : true
+ 46,70 : true
+ 30,125 : true
+ 40,125 : true
+ 10,125 : true
+ 20,125 : true
+ 39,124 : true
+ 80,61 : true
+ 148,39 : true
+ 23,92 : true
+ 83,95 : true
+ 93,95 : true
+ 63,95 : false
+ 73,95 : true
+ 79,92 : true
+ 79,78 : true
+ 33,143 : true
+ 42,143 : true
+ 40,112 : true
+ 13,95 : true
+ 10,120 : true
+ 38,132 : true
+ 30,120 : true
+ 20,120 : true
+ 23,95 : true
+ 33,95 : true
+ 28,132 : true
+ 123,38 : true
+ 119,62 : true
+ 44,98 : true
+ 182,33 : true
+ 179,3 : true
+ 161,19 : true
+ 78,84 : true
+ 10,94 : true
+ 110,51 : true
+ 136,46 : true
+ 192,5 : true
+ 78,75 : false
+ 153,40 : true
+ 78,57 : true
+ 78,55 : false
+ 2,86 : false
+ 3,86 : true
+ 70,89 : true
+ 1,86 : true
+ 6,86 : true
+ 7,86 : true
+ 4,86 : true
+ 5,86 : false
+ 142,71 : true
+ 119,42 : false
+ 8,86 : true
+ 9,86 : true
+ 77,92 : true
+ 36,143 : true
+ 46,143 : true
+ 77,83 : true
+ 143,54 : true
+ 77,80 : false
+ 38,69 : false
+ 77,78 : true
+ 8,101 : true
+ 7,101 : true
+ 29,114 : true
+ 1,101 : true
+ 4,101 : true
+ 3,101 : true
+ 126,100 : true
+ 16,125 : true
+ 26,125 : true
+ 36,125 : true
+ 46,125 : true
+ 173,38 : true
+ 68,92 : false
+ 106,74 : true
+ 139,97 : true
+ 37,96 : true
+ 27,96 : true
+ 76,96 : true
+ 117,99 : false
+ 14,96 : true
+ 112,71 : true
+ 40,92 : true
+ 119,72 : true
+ 76,83 : true
+ 55,62 : true
+ 20,132 : true
+ 76,64 : true
+ 51,94 : true
+ 61,52 : true
+ 71,52 : true
+ 81,52 : true
+ 91,52 : true
+ 76,57 : true
+ 195,37 : true
+ 21,132 : true
+ 35,114 : true
+ 176,4 : true
+ 104,70 : true
+ 15,125 : true
+ 11,52 : true
+ 35,125 : true
+ 31,52 : true
+ 41,52 : false
+ 45,125 : true
+ 34,59 : true
+ 109,97 : true
+ 75,96 : true
+ 196,14 : false
+ 75,92 : true
+ 106,100 : true
+ 129,41 : true
+ 147,56 : true
+ 130,76 : true
+ 109,72 : true
+ 48,114 : true
+ 8,141 : true
+ 7,141 : true
+ 33,96 : true
+ 50,82 : true
+ 110,47 : true
+ 5,149 : true
+ 6,149 : true
+ 3,149 : true
+ 4,149 : true
+ 1,149 : true
+ 2,149 : true
+ 19,133 : true
+ 13,139 : true
+ 200,7 : true
+ 14,125 : true
+ 12,52 : true
+ 33,136 : true
+ 9,149 : true
+ 22,52 : true
+ 7,149 : true
+ 8,149 : false
+ 119,97 : true
+ 22,114 : true
+ 74,92 : true
+ 143,60 : true
+ 1,107 : true
+ 18,133 : true
+ 35,96 : true
+ 119,41 : false
+ 129,42 : true
+ 132,71 : false
+ 74,72 : false
+ 74,71 : true
+ 74,67 : false
+ 74,62 : true
+ 74,61 : true
+ 197,39 : false
+ 150,51 : true
+ 130,79 : true
+ 143,87 : true
+ 8,108 : false
+ 9,108 : true
+ 21,53 : true
+ 74,52 : true
+ 73,97 : true
+ 13,125 : true
+ 19,148 : true
+ 196,4 : true
+ 124,70 : true
+ 163,38 : true
+ 43,125 : true
+ 33,125 : true
+ 23,125 : true
+ 73,71 : true
+ 73,62 : true
+ 127,56 : true
+ 39,148 : true
+ 4,137 : true
+ 137,86 : false
+ 99,54 : true
+ 72,93 : true
+ 79,54 : true
+ 89,54 : true
+ 59,54 : true
+ 69,54 : true
+ 39,54 : true
+ 49,54 : true
+ 19,54 : true
+ 29,54 : true
+ 90,52 : true
+ 80,52 : true
+ 70,52 : true
+ 60,52 : true
+ 72,75 : true
+ 72,74 : true
+ 72,67 : false
+ 72,59 : true
+ 10,52 : true
+ 72,52 : true
+ 133,57 : true
+ 71,84 : true
+ 50,52 : true
+ 40,52 : true
+ 30,52 : true
+ 20,52 : true
+ 53,79 : true
+ 71,66 : true
+ 71,56 : true
+ 129,58 : true
+ 37,137 : true
+ 98,54 : true
+ 71,51 : true
+ 53,94 : true
+ 68,54 : true
+ 58,54 : true
+ 88,54 : true
+ 78,54 : true
+ 28,54 : true
+ 18,54 : true
+ 48,54 : true
+ 38,54 : true
+ 123,87 : true
+ 4,63 : true
+ 22,55 : true
+ 5,63 : true
+ 2,63 : true
+ 46,77 : false
+ 70,66 : true
+ 70,61 : false
+ 70,59 : true
+ 69,94 : true
+ 69,92 : true
+ 123,57 : true
+ 122,43 : true
+ 11,79 : true
+ 20,55 : true
+ 136,4 : true
+ 107,56 : true
+ 21,79 : true
+ 136,74 : true
+ 69,65 : true
+ 97,54 : true
+ 8,88 : false
+ 149,97 : true
+ 12,79 : true
+ 57,54 : true
+ 67,54 : true
+ 77,54 : true
+ 87,54 : true
+ 17,54 : true
+ 27,54 : true
+ 37,54 : true
+ 47,54 : true
+ 17,92 : false
+ 17,142 : false
+ 123,54 : true
+ 68,62 : true
+ 28,67 : true
+ 24,128 : false
+ 67,92 : true
+ 67,83 : true
+ 146,100 : true
+ 120,42 : false
+ 193,38 : false
+ 63,94 : true
+ 37,102 : true
+ 11,94 : true
+ 42,53 : true
+ 152,43 : true
+ 11,86 : false
+ 109,58 : true
+ 66,62 : true
+ 126,74 : true
+ 127,86 : true
+ 162,6 : true
+ 36,98 : true
+ 17,137 : true
+ 114,26 : true
+ 104,37 : true
+ 65,87 : true
+ 140,76 : true
+ 65,83 : true
+ 138,89 : true
+ 65,57 : true
+ 139,72 : true
+ 32,143 : true
+ 112,5 : true
+ 64,82 : false
+ 113,54 : true
+ 111,80 : true
+ 64,69 : false
+ 36,146 : true
+ 64,59 : true
+ 110,42 : true
+ 136,100 : true
+ 16,122 : true
+ 37,83 : true
+ 36,112 : false
+ 156,4 : true
+ 142,43 : true
+ 28,78 : true
+ 58,94 : true
+ 48,94 : false
+ 78,94 : true
+ 68,94 : true
+ 98,94 : true
+ 88,94 : true
+ 125,78 : true
+ 118,69 : true
+ 35,78 : true
+ 109,75 : true
+ 15,78 : true
+ 18,139 : true
+ 24,112 : true
+ 130,12 : false
+ 127,4 : true
+ 183,47 : true
+ 123,77 : true
+ 132,15 : true
+ 16,78 : false
+ 25,112 : true
+ 21,139 : true
+ 31,139 : true
+ 36,138 : true
+ 151,18 : true
+ 63,62 : true
+ 63,59 : true
+ 134,32 : true
+ 22,139 : true
+ 18,94 : true
+ 36,59 : true
+ 38,94 : true
+ 28,94 : true
+ 49,94 : true
+ 19,95 : true
+ 29,95 : false
+ 39,95 : true
+ 49,95 : true
+ 59,95 : false
+ 69,95 : true
+ 79,95 : true
+ 89,95 : true
+ 99,95 : true
+ 33,139 : true
+ 62,59 : false
+ 25,83 : true
+ 190,3 : true
+ 193,47 : true
+ 62,54 : true
+ 142,15 : true
+ 61,94 : true
+ 61,84 : true
+ 61,82 : true
+ 61,70 : true
+ 61,66 : true
+ 57,86 : true
+ 61,59 : false
+ 107,22 : true
+ 61,51 : true
+ 101,19 : false
+ 144,32 : true
+ 40,136 : true
+ 19,94 : true
+ 29,94 : true
+ 39,94 : true
+ 33,138 : true
+ 23,138 : false
+ 138,69 : true
+ 145,78 : true
+ 60,89 : true
+ 60,75 : true
+ 60,66 : true
+ 39,80 : true
+ 199,27 : true
+ 41,136 : true
+ 11,136 : false
+ 117,9 : false
+ 107,4 : true
+ 163,47 : true
+ 180,3 : true
+ 133,59 : false
+ 59,89 : true
+ 59,70 : true
+ 103,77 : true
+ 152,15 : true
+ 58,76 : true
+ 21,106 : false
+ 21,123 : true
+ 57,92 : true
+ 170,7 : true
+ 32,60 : true
+ 108,7 : true
+ 111,19 : true
+ 20,122 : true
+ 25,128 : true
+ 157,22 : true
+ 114,32 : true
+ 32,136 : true
+ 22,136 : true
+ 135,78 : true
+ 22,92 : true
+ 23,60 : false
+ 33,60 : true
+ 128,69 : true
+ 11,122 : false
+ 51,89 : true
+ 189,27 : true
+ 13,60 : true
+ 5,90 : true
+ 120,12 : true
+ 56,51 : true
+ 143,59 : false
+ 170,3 : true
+ 19,56 : true
+ 133,77 : true
+ 162,15 : true
+ 200,50 : true
+ 146,12 : true
+ 55,57 : true
+ 54,95 : true
+ 2,68 : true
+ 54,93 : true
+ 180,7 : true
+ 54,57 : true
+ 132,100 : true
+ 53,95 : true
+ 11,97 : true
+ 124,32 : true
+ 120,58 : true
+ 52,54 : false
+ 9,61 : true
+ 8,61 : true
+ 7,61 : true
+ 6,61 : true
+ 5,61 : true
+ 4,61 : true
+ 3,61 : true
+ 52,53 : true
+ 175,26 : true
+ 113,87 : false
+ 102,71 : true
+ 51,84 : false
+ 15,127 : true
+ 25,127 : true
+ 35,127 : true
+ 104,8 : true
+ 51,53 : true
+ 172,15 : true
+ 103,54 : true
+ 51,51 : true
+ 156,12 : true
+ 50,120 : true
+ 37,92 : true
+ 2,61 : true
+ 1,61 : true
+ 122,100 : true
+ 128,7 : true
+ 128,48 : true
+ 29,143 : true
+ 50,94 : false
+ 50,80 : true
+ 2,54 : true
+ 3,91 : true
+ 32,59 : true
+ 148,69 : true
+ 49,125 : true
+ 150,58 : true
+ 22,115 : false
+ 33,59 : true
+ 49,65 : true
+ 49,58 : true
+ 107,9 : true
+ 48,149 : true
+ 123,60 : true
+ 48,135 : false
+ 140,12 : true
+ 129,94 : true
+ 44,146 : true
+ 114,8 : true
+ 130,51 : true
+ 113,77 : true
+ 48,77 : true
+ 48,69 : true
+ 166,12 : true
+ 48,55 : true
+ 47,150 : true
+ 112,100 : false
+ 118,7 : true
+ 47,130 : true
+ 47,127 : true
+ 138,48 : true
+ 47,123 : true
+ 147,22 : true
+ 76,94 : true
+ 66,94 : true
+ 56,94 : true
+ 46,94 : false
+ 105,78 : true
+ 149,96 : true
+ 96,94 : true
+ 86,94 : true
+ 155,26 : true
+ 122,71 : true
+ 24,125 : true
+ 28,102 : true
+ 27,127 : true
+ 37,127 : true
+ 47,92 : true
+ 17,127 : true
+ 192,15 : true
+ 44,127 : true
+ 21,52 : true
+ 39,60 : true
+ 23,131 : true
+ 17,130 : false
+ 7,111 : true
+ 176,12 : true
+ 102,100 : true
+ 148,7 : true
+ 22,94 : true
+ 46,99 : false
+ 36,94 : true
+ 26,94 : true
+ 16,94 : true
+ 46,92 : true
+ 67,94 : false
+ 77,94 : true
+ 47,94 : true
+ 57,94 : true
+ 46,86 : true
+ 46,58 : true
+ 87,94 : true
+ 97,94 : true
+ 165,26 : true
+ 46,51 : true
+ 45,146 : false
+ 103,87 : true
+ 14,127 : true
+ 28,69 : true
+ 34,127 : true
+ 24,127 : true
+ 45,127 : true
+ 24,123 : true
+ 12,134 : false
+ 45,116 : false
+ 45,104 : true
+ 45,99 : true
+ 11,51 : true
+ 27,123 : true
+ 138,7 : true
+ 106,12 : true
+ 10,129 : true
+ 45,80 : true
+ 27,94 : true
+ 37,94 : true
+ 2,102 : false
+ 17,94 : true
+ 68,95 : true
+ 58,95 : true
+ 48,95 : false
+ 38,95 : true
+ 28,95 : true
+ 18,95 : true
+ 30,138 : true
+ 43,131 : true
+ 30,94 : true
+ 20,94 : true
+ 19,127 : true
+ 29,127 : true
+ 70,94 : true
+ 60,94 : true
+ 88,95 : true
+ 78,95 : true
+ 152,33 : true
+ 12,123 : true
+ 194,13 : true
+ 46,127 : true
+ 44,125 : false
+ 44,118 : true
+ 12,92 : true
+ 171,19 : true
+ 116,12 : true
+ 9,144 : true
+ 182,40 : false
+ 125,2 : true
+ 106,46 : true
+ 149,41 : true
+ 43,92 : false
+ 43,82 : true
+ 61,95 : true
+ 71,95 : false
+ 81,95 : true
+ 91,95 : true
+ 139,96 : true
+ 107,64 : true
+ 34,77 : true
+ 42,138 : true
+ 21,94 : true
+ 31,94 : true
+ 41,94 : true
+ 11,95 : true
+ 21,95 : true
+ 26,127 : true
+ 16,127 : true
+ 51,95 : true
+ 2,130 : true
+ 12,82 : false
+ 22,82 : true
+ 32,82 : false
+ 42,82 : true
+ 52,82 : true
+ 62,82 : true
+ 13,92 : true
+ 82,82 : true
+ 92,82 : true
+ 115,2 : true
+ 126,12 : true
+ 139,41 : true
+ 139,94 : true
+ 42,59 : false
+ 158,39 : true
+ 46,95 : true
+ 36,95 : true
+ 66,95 : true
+ 56,95 : true
+ 2,136 : false
+ 197,9 : true
+ 26,95 : true
+ 16,95 : true
+ 6,136 : true
+ 41,139 : true
+ 27,146 : true
+ 124,8 : true
+ 86,95 : false
+ 76,95 : true
+ 171,18 : true
+ 96,95 : true
+ 13,82 : false
+ 141,92 : true
+ 33,82 : false
+ 23,82 : true
+ 48,127 : true
+ 38,127 : true
+ 73,82 : true
+ 63,82 : true
+ 93,82 : false
+ 83,82 : true
+ 136,12 : true
+ 41,95 : true
+ 190,31 : true
+ 9,128 : true
+ 145,2 : true
+ 9,72 : true
+ 57,95 : true
+ 67,95 : true
+ 37,95 : true
+ 47,95 : true
+ 17,95 : true
+ 27,95 : true
+ 2,101 : true
+ 109,27 : true
+ 41,66 : false
+ 41,53 : true
+ 28,127 : true
+ 18,127 : true
+ 97,95 : false
+ 181,18 : true
+ 77,95 : true
+ 87,95 : true
+ 24,82 : true
+ 34,82 : true
+ 27,131 : true
+ 14,82 : true
+ 39,127 : true
+ 49,127 : false
+ 44,82 : true
+ 54,82 : true
+ 32,149 : true
+ 25,99 : true
+ 84,82 : true
+ 94,82 : true
+ 16,92 : false
+ 138,39 : true
+ 32,138 : true
+ 135,2 : true
+ 1,138 : true
+ 29,77 : true
+ 7,122 : true
+ 39,125 : true
+ 5,122 : true
+ 94,94 : true
+ 39,105 : true
+ 177,9 : true
+ 64,94 : true
+ 54,94 : true
+ 84,94 : false
+ 74,94 : false
+ 24,94 : true
+ 14,94 : true
+ 44,94 : true
+ 34,94 : true
+ 35,82 : true
+ 25,82 : true
+ 15,82 : true
+ 20,95 : true
+ 75,82 : true
+ 65,82 : true
+ 55,82 : true
+ 45,82 : false
+ 38,55 : true
+ 38,135 : true
+ 95,82 : true
+ 85,82 : true
+ 14,138 : true
+ 38,121 : true
+ 38,106 : true
+ 154,13 : true
+ 35,95 : true
+ 45,95 : true
+ 29,125 : false
+ 19,125 : true
+ 95,94 : true
+ 12,149 : true
+ 15,95 : true
+ 25,95 : true
+ 55,94 : true
+ 65,94 : true
+ 75,94 : true
+ 85,94 : false
+ 15,94 : true
+ 25,94 : false
+ 35,94 : false
+ 45,94 : true
+ 36,82 : true
+ 46,82 : true
+ 56,82 : true
+ 66,82 : true
+ 121,18 : true
+ 107,59 : true
+ 16,82 : true
+ 26,82 : true
+ 11,139 : true
+ 102,15 : true
+ 16,138 : true
+ 179,41 : true
+ 76,82 : true
+ 86,82 : false
+ 96,82 : false
+ 25,125 : true
+ 18,125 : true
+ 28,125 : true
+ 157,9 : false
+ 34,125 : true
+ 36,127 : true
+ 36,92 : true
+ 31,106 : true
+ 182,22 : true
+ 54,92 : true
+ 10,66 : true
+ 20,66 : true
+ 24,92 : true
+ 40,66 : true
+ 50,66 : true
+ 38,125 : true
+ 48,125 : true
+ 47,82 : true
+ 37,82 : true
+ 2,120 : true
+ 57,82 : true
+ 14,92 : true
+ 31,66 : true
+ 21,66 : true
+ 11,66 : true
+ 8,120 : true
+ 7,120 : true
+ 112,15 : true
+ 9,120 : true
+ 4,120 : true
+ 3,120 : true
+ 6,120 : true
+ 5,120 : true
+ 27,125 : true
+ 17,125 : true
+ 1,54 : true
+ 33,92 : true
+ 1,70 : false
+ 17,82 : true
+ 167,9 : true
+ 18,106 : true
+ 45,92 : true
+ 55,92 : false
+ 25,92 : true
+ 35,92 : true
+ 85,92 : true
+ 95,92 : true
+ 47,125 : true
+ 37,125 : true
+ 58,82 : true
+ 68,82 : false
+ 38,82 : true
+ 48,82 : true
+ 18,82 : true
+ 15,92 : true
+ 141,18 : true
+ 133,47 : false
+ 198,48 : true
+ 30,84 : true
+ 30,66 : true
+ 122,15 : true
+ 98,82 : false
+ 27,82 : true
+ 78,82 : true
+ 88,82 : true
+}
+Starting state: {
+ location : 1,51
+ direction : 0
+}
+Checking 1,51
+Finding loop location from 1,51 dir up
+1->11
+Returning 200,1
+Finding loop location from 200,1 dir left
+11->1
+Returning 1,51
+Checking that 2,51 is the same as 1,51
diff --git a/22/sample.txt b/22/sample.txt
new file mode 100644
index 0000000..8bc2e1e
--- /dev/null
+++ b/22/sample.txt
@@ -0,0 +1,14 @@
+ ...#
+ .#..
+ #...
+ ....
+...#.......#
+........#...
+..#....#....
+..........#.
+ ...#....
+ .....#..
+ .#......
+ ......#.
+
+10R5L5R10L4R5L5
diff --git a/23/1.lua b/23/1.lua
new file mode 100644
index 0000000..b3f570f
--- /dev/null
+++ b/23/1.lua
@@ -0,0 +1,173 @@
+require "ext"
+local map = {}
+local row, col = 0,0
+local function fmt_location(row, col)
+ return string.format("%d,%d",row,col)
+end
+for line in io.lines() do
+ row = row + 1
+ col = 0
+ for char in line:gmatch("(.)") do
+ col = col + 1
+ local locf = fmt_location(row,col)
+ if char == "#" then
+ map[locf] = true
+ end
+ end
+end
+
+local directions = {
+ N = {-1,0},
+ S = {1,0},
+ E = {0,1},
+ W = {0,-1},
+ NE = {-1,1},
+ NW = {-1,-1},
+ SE = {1,1},
+ SW = {1,-1}
+}
+local dir_order = {
+ {"N","NE","NW"},
+ {"S","SE","SW"},
+ {"W","NW","SW"},
+ {"E","NE","SE"}
+}
+
+print(map)
+
+local function parse_location(location)
+ local trow,tcol = location:match("([%d-]+),([%d-]+)")
+ return tonumber(trow), tonumber(tcol)
+end
+local function round(map, order_dir)
+ --print("Directions:",order_dir)
+ --first half, propose
+ local propositions = {}
+ for location, elf in pairs(map) do
+ local elf_nearby = false
+ local trow, tcol = parse_location(location)
+ for _, dir in pairs(directions) do
+ local nrow, ncol = trow + dir[1], tcol + dir[2]
+ local nloc = fmt_location(nrow,ncol)
+ if map[nloc] then
+ elf_nearby = true
+ break
+ end
+ end
+ if not elf_nearby then
+ propositions[location] = {location}
+ goto nextelf
+ end
+ assert(elf_nearby)
+ for _,dset in ipairs(dir_order) do
+ local dir_empty = true
+ for _,d in ipairs(dset) do
+ local dir = directions[d]
+ local nrow, ncol = trow + dir[1], tcol + dir[2]
+ local nloc = fmt_location(nrow,ncol)
+ if map[nloc] then
+ dir_empty = false
+ break
+ end
+ end
+ if dir_empty then
+ local dir = directions[dset[1]]
+ local nrow, ncol = trow + dir[1], tcol + dir[2]
+ local nloc = fmt_location(nrow,ncol)
+ if not propositions[nloc] then
+ propositions[nloc] = {location}
+ else
+ table.insert(propositions[nloc],location)
+ end
+ goto nextelf
+ end
+ end
+ -- no new location proposed, sit tight
+ propositions[location] = {location}
+ ::nextelf::
+ end
+
+ --print("Propositions:",propositions)
+ --second half, move if we were the only ones that want to go there
+ local any_moved = false
+ for location, elftbl in pairs(propositions) do
+ if #elftbl == 1 and elftbl[1] ~= location then
+ any_moved = true
+ end
+ end
+ if not any_moved then
+ os.exit(0)
+ end
+ local newmap = {}
+ for location, elftbl in pairs(propositions) do
+ if #elftbl == 1 then
+ newmap[location] = true
+ else
+ for _,oloc in pairs(elftbl) do
+ newmap[oloc] = true
+ end
+ end
+ end
+ return newmap
+end
+
+local function aabb(map)
+ local minrow,mincol,maxrow,maxcol= math.huge, math.huge, -math.huge, -math.huge
+ for location,_ in pairs(map) do
+ local row,col = parse_location(location)
+ minrow = math.min(minrow,row)
+ maxrow = math.max(maxrow,row)
+ mincol = math.min(mincol,col)
+ maxcol = math.max(maxcol,col)
+ end
+ return minrow, mincol, maxrow, maxcol
+end
+
+local function print_puzzle(map)
+ local minrow, mincol, maxrow, maxcol = aabb(map)
+ io.write(" ")
+ for col = mincol - 1, maxcol + 1 do
+ io.write(col)
+ end
+ io.write("\n")
+ for row = minrow - 1, maxrow + 1 do
+ io.write(string.format("%3d|",row))
+ for col = mincol - 1,maxcol + 1 do
+ local loc = fmt_location(row,col)
+ if map[loc] then
+ io.write("#")
+ else
+ io.write(".")
+ end
+ end
+ io.write("\n")
+ end
+end
+
+local function emptyaabb(map)
+ local minrow, mincol, maxrow, maxcol = aabb(map)
+ local count = 0
+ for row = minrow, maxrow do
+ for col = mincol ,maxcol do
+ local loc = fmt_location(row,col)
+ if not map[loc] then
+ count = count + 1
+ end
+ end
+ end
+ return count
+end
+
+print_puzzle(map)
+print("==========")
+local i = 0
+while true do
+ i = i + 1
+ print(i)
+ map = round(map,dir_order)
+ table.insert(dir_order,table.remove(dir_order,1))
+
+ --print_puzzle(map)
+ --print("==========")
+end
+print(emptyaabb(map))
diff --git a/23/ext.lua b/23/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/23/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/23/input.txt b/23/input.txt
new file mode 100644
index 0000000..c930006
--- /dev/null
+++ b/23/input.txt
@@ -0,0 +1,72 @@
+####.##.#..#..#...#..#.#..#..#.##.##.####.#..#.#....###.....####..#.#..#
+.##.#..#...#...#....#...#..#.##....#.#..#.#..#.####.........#.#....####.
+#.#..#.#..#....###..#.#.#.....####.##....#.##...#.##..#..#..#..######.##
+.#.##......#.#..#...###..###.#....####..##..####.#..##.###..#..##.##.#.#
+#####.####.####.###.###.###..###...#.##......##...###.####.....##.#.##..
+.....####.#..###.##.###.###.....###.#.##.#..##..##.#...#.#..#.##.#...#.#
+###..#..#..#..#.#..#...#..#.##..#..#.....#....##.########..##.###.#....#
+..#....###..##.####.#..#......##.#..####...#.....#..###..###......#.#...
+####.....#..##....##...#..##..#.#####..####.####....##.####.#...###...#.
+######.....##..#..#...#..###.#.#..#.##..#..#.....########..#....#.#.###.
+##...####.###.####.##.###.#..###.#####....##..###......#....###...##...#
+....#...#.#.##...#.#.###...##.#.#.#.##.#.##.###.#####.#.####.##.#####.#.
+.#.##.####.#.....#.##.##.#......#.#.#.##..#.##.####...#.#..#.#######.#.#
+#..#.#..##......#....#..##.#...####.#.#...#....#..####...#.#.##..#.###.#
+#.##..#.###..###..##.###..#..###.#....#.#.########..##..#.##.###.##..#.#
+.######.#.......#.##....#.###....##.##.#..##.#....#..##...#..#..#.##...#
+...#.###..###.######...####.##..###.#...####.######.#.#.##..###.#.#..##.
+....##....#...###..#...#.#.#.##.#..###.###...#..#..#.#.#..####...##...##
+.##.##.##..#.##......###....#.###.#...#..##.#.#####...############......
+.#..#.#..###.####.#..#.##..###.###.##.#.#.#.##.###......#.##..###.#.#.##
+#..#....#.##..#.#.##.##.##....##..###.###..####..#.#.....#..#......##.##
+#...####...##..#....#.#.#.##.....#.......##...#....#.##....##..##...##.#
+####.#.#..#.##.#######.###....###..#....#.##.####..##.#...#.####.#.#.#..
+............##..#..#.###...#.#.##....#######..#....#..###.....#.###...#.
+##.##..##....####..#######.##.#..#....####....#.###.#.#...###....#.##.#.
+.##.#..#.##.###..##.#.#.#..#...##.#...#.##.#...#.###.#...#.##....##.#...
+.#.########.##.####.#.#...#....#.###..##.##.#.##.#..#.###......###..#..#
+..#.#....#.#.#..##.#..###.#.###.##.##.##..#.#.#..##....#.##.#.....#.###.
+..#...#.###..##..###.##..##.#..#....#.###...###...#..#.#.#.#..###.####..
+###...#.#..###...##.##.###....#.#......##..............#..##.#####.##.##
+###..#.##.#.########.##.####..####...##.#.#.###...##.###.#.####.#.##.###
+..##.###.#.#.#.##.#.####....#.####.#.##....###.###.##.##....#..##..##...
+##..##.#.#......##..#.######...##..#...#.###..#.#.##...#....#.###.##.#.#
+..####...##..#..#.#...#.#.###.##..#.#.#..##.##..#..##.#######...##...##.
+....#..#..#.#...##.#.##.####..#..#..#..#...###..#.####.#.##.###.###..#..
+.##...#.#.##.##..###.#.#..#.#.#.....##......##.#........#####.#......##.
+###.####.#...##...#.#......####.#..#......##.....#..#####...#.###.##.#.#
+...##.#..#.#.###....#####..#..###.#..#..#.#..#.#.#.#####.#..####..#..###
+.##.##....#.#.#.#..#######..#..#.#..#....#.####...#...#..##..#..#...#.##
+#.##.#.....#...#...###.##.##.##.#..#..#.###....##.#.#..##.##.###.##..##.
+#.##..#....########.#.#.....##.###.#..##.####.#.##..###.##...#.....#.#.#
+#..#..##.#....##...#.....#######.###########.#...####.#...####.#.#...##.
+####.#..#..#...##..##.###.#.#.##..##.##.###.####..#.##.#.#....#..#.#.#..
+#..#########...##..####..###..##.#..##....#..#.#.#..##.#..#.##.#.###.#.#
+#....#..#.##.##.....#####.#.......###..#.#.#...###..#...##.#..##.#..#.##
+#...####..#.#...#......#....#.#.#.#.##.....#.#.##..#...#.##........#....
+###........#.###..#....##.##......#..##..##...##.#.####...#.#..##..##.#.
+.#.#.##.#....##.#.#.#.#.#...##.#...##..#####.##.##.###..##..#.#...##...#
+###.####...#......######.###..##..##.....###...#.......#..##.#..#.#.##..
+####.#..#.#.##.#####.#.#..#..####..##...#.###.##.##.##..#.###..#.#..###.
+#..###..#.#.###.#.#.##.#.##....#..#.#.###.##.#.##..###..#.##.....#..##..
+.#..#.##.#####..#.....#....##......#.##.##.##....##.#...#.#.##.#..#..#.#
+..#...##...#..####.##..#.##.#.##..#.##.#..####.#.#####......########..##
+.##.....##.##.######..#.##..#....#..#####.#.##..##..#.#.#.#..#...##..##.
+##.#...###.##..##..#.#....#..#.#.#.#.##.#..#..#.#####.##.#####..##.#.#..
+#.####.#..##..##...##..##.#.#......#.#####.#..####..#..########.##.###..
+#.##.##.#.##...#..#..#.#...#.##.##..##......##.#####..##.#.#.#.##.##.#.#
+..#....##....#..###.#####....##.#######..##..#####...#...#####.###.....#
+#.#.##..####.##.#......###..##.####.#...####.#..#.#.##.#..#.###.##.#####
+.##..####...###...#.##.#..#.##.######.#.##...#.##...##..##.##########...
+#.##.####..######...###.##.###.####.#.#..#..#.#.#..##....#......##....#.
+.###......##.##.####.#...##...#..#.#..####..#.#.##.###.#.....#.#....#.#.
+#..#..#.####.#.#.#..##..#..##.##..#.#..##.#########.###.######......#.##
+..#.#.#.#..#######...#.#.....######.#.#.##.#..#...#..#####..##.###.#.##.
+..#.#.#..##...####.#.###.##..#.#.##.#.#....##.#####.####...##..####....#
+....#.##.....##...#.##.#.###..#.#...#####....##.###..#..########.....#..
+#.#.#..#.#...###...##...#..#.##..#.#..#.....###.#####.##...#.#.#...##.#.
+..#.#####..##....##...##.#.##.#..#..##.#...#.##..###..#.##...#..##..##..
+#.###..##.#...####....###........#...###.#..##.#......###..####.#......#
+#..#.#.#....#...##.##.....#..##..#.####.##.....##.#.....#.#.#....##....#
+########.#.##.#..##..#...####.#.###.#.#.#.##.#.######.##.#.##....####..#
+###.#...##.###.##....#..##.##..#######..###.###...#..###.##...#...#..##.
diff --git a/23/sample.txt b/23/sample.txt
new file mode 100644
index 0000000..14005cf
--- /dev/null
+++ b/23/sample.txt
@@ -0,0 +1,7 @@
+....#..
+..###.#
+#...#.#
+.#...##
+#.###..
+##.#.##
+.#..#..
diff --git a/23/sample2.txt b/23/sample2.txt
new file mode 100644
index 0000000..57a5784
--- /dev/null
+++ b/23/sample2.txt
@@ -0,0 +1,6 @@
+.....
+..##.
+..#..
+.....
+..##.
+.....
diff --git a/24/1.lua b/24/1.lua
new file mode 100644
index 0000000..3d7dfa0
--- /dev/null
+++ b/24/1.lua
@@ -0,0 +1,196 @@
+require "ext"
+local directions = {
+ right = {0,1},
+ down = {1,0},
+ left = {0,-1},
+ up = {-1,0},
+ wait = {0,0},
+}
+local tiles = {
+ wall = {rep="#"},
+ lbliz = {rep="<",move=directions.left},
+ rbliz = {rep=">",move=directions.right},
+ ubliz = {rep="^",move=directions.up},
+ dbliz = {rep="v",move=directions.down},
+ empty = {rep="."}
+}
+local map = {}
+local row,col = 0,0
+local start,finish
+local function place(map,row,col,ent)
+ map[row] = map[row] or {}
+ map[row][col] = map[row][col] or {}
+ table.insert(map[row][col],ent)
+end
+for line in io.lines() do
+ map[#map+1] = {}
+ row = row + 1
+ col = 0
+ for char in line:gmatch("(.)") do
+ col = col + 1
+ if char == "." then
+ if row == 1 then
+ start = col
+ else
+ finish = col
+ end
+ end
+ for name,tile in pairs(tiles) do
+ if char == tile.rep and name ~= "empty" then
+ place(map,row,col,{r=row,c=col,t=tile})
+ break
+ end
+ end
+ end
+end
+local w,h = col,row
+local function print_puzzle(map)
+ for row = 1,h do
+ for col = 1,w do
+ if map[row] and map[row][col] then
+ local elist = map[row][col]
+ if #elist == 1 then
+ io.write(elist[1].t.rep)
+ else
+ io.write(#elist)
+ end
+ else
+ io.write(".")
+ end
+ end
+ io.write("\n")
+ end
+end
+
+local h,w = #map, #map[1]
+local min_walk = math.abs(finish - start) + h
+
+print_puzzle(map)
+
+local function step_map(map)
+ local newmap = {}
+ for row = 1,h do
+ for col = 1,w do
+ if map[row] and map[row][col] then
+ for _, ent in pairs(map[row][col]) do
+ if ent.t.move then
+ local dir = ent.t.move
+ ent.r = ent.r + dir[1]
+ ent.c = ent.c + dir[2]
+ --loop
+ if ent.r == 1 then
+ ent.r = h-1
+ elseif ent.r == h then
+ ent.r = 2
+ elseif ent.c == 1 then
+ ent.c = w-1
+ elseif ent.c == w then
+ ent.c = 2
+ end
+ place(newmap,ent.r,ent.c,ent)
+ else
+ place(newmap,ent.r,ent.c,ent)
+ end
+ end
+ end
+ end
+ end
+ return newmap
+end
+local function could_move(map,row,col)
+ local ret = (
+ row >= 1 and
+ col > 1 and
+ row <= h and
+ col < w and
+ map[row] and
+ map[row][col] == nil
+ )
+ --print(ret)
+ return ret
+end
+
+--map doesn't change, no matter what we do, we can store the blizzard simulation
+local map_mem, mapat = {}, {[0] = map}
+setmetatable(mapat,{__index=function(self,key)
+ if map_mem[key] then return map_mem[key] end
+ map_mem[key] = step_map(mapat[key-1])
+ return map_mem[key]
+end})
+
+local state = {
+ location = {1,start},
+ minute = 0,
+ speculative_goal = min_walk
+}
+local function copy_state(state)
+ return {
+ location = {state.location[1],state.location[2]},
+ minute = state.minute,
+ speculative_goal = state.speculative_goal
+ }
+end
+local spec_tbl = {
+ [directions.right] = -1,
+ [directions.down] = -1,
+ [directions.left] = 2,
+ [directions.up] = 2,
+ [directions.wait] = 0
+}
+local branches = {state}
+local min_path = 147
+local nbranches = 0
+while #branches > 0 do
+ --print(#branches)
+ local tbranch = table.remove(branches)
+ nbranches = nbranches + 1
+ if nbranches % 100000 == 0 then
+ print("Analyzed",nbranches,"branches",#branches,"active")
+ end
+ if tbranch.minute > min_path then
+ goto nextbranch
+ end
+ if tbranch.speculative_goal > min_path then
+ goto nextbranch
+ end
+ local nloc = tbranch.location
+ if nloc[1] == h and nloc[2] == finish then
+ print("Found a working branch:",tbranch)
+ print("Branches remaining:",#branches)
+ if tbranch.minute < min_path then
+ min_path = tbranch.minute
+ end
+ goto nextbranch
+ end
+ local ctime = tbranch.minute
+ local nmap = mapat[ctime + 1]
+ --print_puzzle(nmap)
+ for name, direction in pairs(directions) do
+ local nrow, ncol = nloc[1] + direction[1], nloc[2] + direction[2]
+ if could_move(nmap,nrow,ncol) then
+ if nrow == h then
+ assert(ncol == finish)
+ end
+ local sc = copy_state(tbranch)
+ sc.location = {nrow,ncol}
+ sc.speculative_goal = sc.speculative_goal + spec_tbl[direction]
+ if sc.speculative_goal < min_path and sc.minute < min_path then
+ sc.minute = sc.minute + 1
+ table.insert(branches,sc)
+ end
+ end
+ end
+ --[[
+ --It's actually faster if we don't do this, and all states fit into one memory page
+ --Once in a while, sort the branhces to prioritize promising paths
+ if nbranches % 100000 == 0 then
+ table.sort(branches,function(a,b)
+ return (a.minute + a.speculative_goal) > (b.minute + b.speculative_goal)
+ end)
+ end
+ ]]
+ ::nextbranch::
+end
+print(nbranches)
+print("Out of branches")
+print(min_path)
diff --git a/24/1_1.lua b/24/1_1.lua
new file mode 100644
index 0000000..586835a
--- /dev/null
+++ b/24/1_1.lua
@@ -0,0 +1,192 @@
+require "ext"
+local directions = {
+ right = {0,1},
+ down = {1,0},
+ left = {0,-1},
+ up = {-1,0},
+ wait = {0,0},
+}
+local tiles = {
+ wall = {rep="#"},
+ lbliz = {rep="<",move=directions.left},
+ rbliz = {rep=">",move=directions.right},
+ ubliz = {rep="^",move=directions.up},
+ dbliz = {rep="v",move=directions.down},
+ empty = {rep="."}
+}
+local map = {}
+local row,col = 0,0
+local start,finish
+local function place(map,row,col,ent)
+ map[row] = map[row] or {}
+ map[row][col] = map[row][col] or {}
+ table.insert(map[row][col],ent)
+end
+for line in io.lines() do
+ map[#map+1] = {}
+ row = row + 1
+ col = 0
+ for char in line:gmatch("(.)") do
+ col = col + 1
+ if char == "." then
+ if row == 1 then
+ start = col
+ else
+ finish = col
+ end
+ end
+ for name,tile in pairs(tiles) do
+ if char == tile.rep and name ~= "empty" then
+ place(map,row,col,{r=row,c=col,t=tile})
+ break
+ end
+ end
+ end
+end
+local w,h = col,row
+local function print_puzzle(map,flood)
+ for row = 1,h do
+ for col = 1,w do
+ if map[row] and map[row][col] then
+ local elist = map[row][col]
+ if #elist == 1 then
+ io.write(elist[1].t.rep .. " ")
+ else
+ io.write("* ")
+ end
+ else
+ if flood and flood[row] and flood[row][col] then
+ io.write(string.format("%-2d",flood[row][col]))
+ else
+ io.write(" ")
+ end
+ end
+ end
+ io.write("\n")
+ end
+end
+
+local h,w = #map, #map[1]
+local min_walk = math.abs(finish - start) + h
+
+print_puzzle(map)
+
+local function step_map(map)
+ local newmap = {}
+ for row = 1,h do
+ for col = 1,w do
+ if map[row] and map[row][col] then
+ for _, ent in pairs(map[row][col]) do
+ if ent.t.move then
+ local dir = ent.t.move
+ ent.r = ent.r + dir[1]
+ ent.c = ent.c + dir[2]
+ --loop
+ if ent.r == 1 then
+ ent.r = h-1
+ elseif ent.r == h then
+ ent.r = 2
+ elseif ent.c == 1 then
+ ent.c = w-1
+ elseif ent.c == w then
+ ent.c = 2
+ end
+ place(newmap,ent.r,ent.c,ent)
+ else
+ place(newmap,ent.r,ent.c,ent)
+ end
+ end
+ end
+ end
+ end
+ return newmap
+end
+local function could_move(map,row,col)
+ local ret = (
+ row >= 1 and
+ col > 1 and
+ row <= h and
+ col < w and
+ (map[row] == nil or
+ map[row][col] == nil or
+ map[row][col].t ~= tiles.wall)
+ )
+ --print(ret)
+ return ret
+end
+
+--map doesn't change, no matter what we do, we can store the blizzard simulation
+local map_mem, mapat = {}, {[0] = map}
+setmetatable(mapat,{__index=function(self,key)
+ if map_mem[key] then return map_mem[key] end
+ map_mem[key] = step_map(mapat[key-1])
+ return map_mem[key]
+end})
+
+local state = {
+ location = {1,start},
+ minute = 0,
+ speculative_goal = min_walk
+}
+local function copy_state(state)
+ return {
+ location = {state.location[1],state.location[2]},
+ minute = state.minute,
+ speculative_goal = state.speculative_goal
+ }
+end
+local spec_tbl = {
+ [directions.right] = -1,
+ [directions.down] = -1,
+ [directions.left] = 2,
+ [directions.up] = 2,
+ [directions.wait] = 0
+}
+local flood = {}
+for row = 1,h do
+ flood[row] = {}
+end
+flood[1][2] = 0
+local min = 0
+while flood[h][w-1] == nil do
+ min = min + 1
+ print("Min",min)
+ local nmap = mapat[min-1]
+ local toins = {}
+ --[[
+ print("Before flooding 1:")
+ print_puzzle(nmap,flood)
+ ]]
+ --flood outward
+ for rn,row in pairs(flood) do
+ for cn,col in pairs(row) do
+ if flood[rn][cn] then
+ for name, direction in pairs(directions) do
+ --print("Flooding",rn,cn,name)
+ local trow = rn + direction[1]
+ local tcol = cn + direction[2]
+ if could_move(nmap,trow,tcol) and flood[trow][tcol] == nil then
+ table.insert(toins,{trow,tcol})
+ end
+ end
+ end
+ end
+ end
+ for _,v in pairs(toins) do
+ flood[v[1]][v[2]] = min
+ end
+ --[[
+ print("After flooding 1:")
+ print_puzzle(nmap,flood)
+ ]]
+ nmap = mapat[min]
+ --clean up where blizzards pass
+ for rn,row in pairs(nmap) do
+ for cn, col in pairs(row) do
+ flood[rn][cn] = nil
+ end
+ end
+ print("After cleaning:")
+ print_puzzle(nmap,flood)
+end
+print(flood[h][w-1])
diff --git a/24/2.lua b/24/2.lua
new file mode 100644
index 0000000..6243cf0
--- /dev/null
+++ b/24/2.lua
@@ -0,0 +1,289 @@
+require "ext"
+local directions = {
+ right = {0,1},
+ down = {1,0},
+ left = {0,-1},
+ up = {-1,0},
+ wait = {0,0},
+}
+local tiles = {
+ wall = {rep="#"},
+ lbliz = {rep="<",move=directions.left},
+ rbliz = {rep=">",move=directions.right},
+ ubliz = {rep="^",move=directions.up},
+ dbliz = {rep="v",move=directions.down},
+ empty = {rep="."}
+}
+local map = {}
+local row,col = 0,0
+local start,finish
+local function place(map,row,col,ent)
+ map[row] = map[row] or {}
+ map[row][col] = map[row][col] or {}
+ table.insert(map[row][col],ent)
+end
+for line in io.lines() do
+ map[#map+1] = {}
+ row = row + 1
+ col = 0
+ for char in line:gmatch("(.)") do
+ col = col + 1
+ if char == "." then
+ if row == 1 then
+ start = col
+ else
+ finish = col
+ end
+ end
+ for name,tile in pairs(tiles) do
+ if char == tile.rep and name ~= "empty" then
+ place(map,row,col,{r=row,c=col,t=tile})
+ break
+ end
+ end
+ end
+end
+local w,h = col,row
+local function print_puzzle(map,flood)
+ for row = 1,h do
+ for col = 1,w do
+ if map[row] and map[row][col] then
+ local elist = map[row][col]
+ if #elist == 1 then
+ io.write(elist[1].t.rep .. " ")
+ else
+ io.write("* ")
+ end
+ else
+ if flood and flood[row] and flood[row][col] then
+ io.write(string.format("%-2d",flood[row][col]))
+ else
+ io.write(" ")
+ end
+ end
+ end
+ io.write("\n")
+ end
+end
+
+local h,w = #map, #map[1]
+local min_walk = math.abs(finish - start) + h
+
+print_puzzle(map)
+
+local function step_map(map)
+ local newmap = {}
+ for row = 1,h do
+ for col = 1,w do
+ if map[row] and map[row][col] then
+ for _, ent in pairs(map[row][col]) do
+ if ent.t.move then
+ local dir = ent.t.move
+ ent.r = ent.r + dir[1]
+ ent.c = ent.c + dir[2]
+ --loop
+ if ent.r == 1 then
+ ent.r = h-1
+ elseif ent.r == h then
+ ent.r = 2
+ elseif ent.c == 1 then
+ ent.c = w-1
+ elseif ent.c == w then
+ ent.c = 2
+ end
+ place(newmap,ent.r,ent.c,ent)
+ else
+ place(newmap,ent.r,ent.c,ent)
+ end
+ end
+ end
+ end
+ end
+ return newmap
+end
+local function could_move(map,row,col)
+ local ret = (
+ row >= 1 and
+ col > 1 and
+ row <= h and
+ col < w and
+ (map[row] == nil or
+ map[row][col] == nil or
+ map[row][col].t ~= tiles.wall)
+ )
+ --print(ret)
+ return ret
+end
+
+--map doesn't change, no matter what we do, we can store the blizzard simulation
+local map_mem, mapat = {}, {[0] = map}
+setmetatable(mapat,{__index=function(self,key)
+ if map_mem[key] then return map_mem[key] end
+ map_mem[key] = step_map(mapat[key-1])
+ return map_mem[key]
+end})
+
+local state = {
+ location = {1,start},
+ minute = 0,
+ speculative_goal = min_walk
+}
+local function copy_state(state)
+ return {
+ location = {state.location[1],state.location[2]},
+ minute = state.minute,
+ speculative_goal = state.speculative_goal
+ }
+end
+local spec_tbl = {
+ [directions.right] = -1,
+ [directions.down] = -1,
+ [directions.left] = 2,
+ [directions.up] = 2,
+ [directions.wait] = 0
+}
+
+local flood = {}
+for row = 1,h do
+ flood[row] = {}
+end
+flood[1][2] = 0
+local min = 0
+while flood[h][w-1] == nil do
+ min = min + 1
+ print("Min",min)
+ local nmap = mapat[min-1]
+ local toins = {}
+ --[[
+ print("Before flooding 1:")
+ print_puzzle(nmap,flood)
+ ]]
+ --flood outward
+ for rn,row in pairs(flood) do
+ for cn,col in pairs(row) do
+ if flood[rn][cn] then
+ for name, direction in pairs(directions) do
+ --print("Flooding",rn,cn,name)
+ local trow = rn + direction[1]
+ local tcol = cn + direction[2]
+ if could_move(nmap,trow,tcol) and flood[trow][tcol] == nil then
+ table.insert(toins,{trow,tcol})
+ end
+ end
+ end
+ end
+ end
+ for _,v in pairs(toins) do
+ flood[v[1]][v[2]] = min
+ end
+ --[[
+ print("After flooding 1:")
+ print_puzzle(nmap,flood)
+ ]]
+ nmap = mapat[min]
+ --clean up where blizzards pass
+ for rn,row in pairs(nmap) do
+ for cn, col in pairs(row) do
+ flood[rn][cn] = nil
+ end
+ end
+ --[[
+ print("After cleaning:")
+ print_puzzle(nmap,flood)
+ ]]
+end
+print("First goal reached after:",min)
+flood = {}
+for row = 1,h do
+ flood[row] = {}
+end
+flood[h][w-1] = min
+while flood[1][2] == nil do
+ min = min + 1
+ print("Min",min)
+ local nmap = mapat[min-1]
+ local toins = {}
+ --[[
+ print("Before flooding 1:")
+ print_puzzle(nmap,flood)
+ ]]
+ --flood outward
+ for rn,row in pairs(flood) do
+ for cn,col in pairs(row) do
+ if flood[rn][cn] then
+ for name, direction in pairs(directions) do
+ --print("Flooding",rn,cn,name)
+ local trow = rn + direction[1]
+ local tcol = cn + direction[2]
+ if could_move(nmap,trow,tcol) and flood[trow][tcol] == nil then
+ table.insert(toins,{trow,tcol})
+ end
+ end
+ end
+ end
+ end
+ for _,v in pairs(toins) do
+ flood[v[1]][v[2]] = min
+ end
+ --[[
+ print("After flooding 1:")
+ print_puzzle(nmap,flood)
+ ]]
+ nmap = mapat[min]
+ --clean up where blizzards pass
+ for rn,row in pairs(nmap) do
+ for cn, col in pairs(row) do
+ flood[rn][cn] = nil
+ end
+ end
+ print("After cleaning:")
+ print_puzzle(nmap,flood)
+end
+print("back to start reached after:",min)
+flood = {}
+for row = 1,h do
+ flood[row] = {}
+end
+flood[1][2] = min
+while flood[h][w-1] == nil do
+ min = min + 1
+ print("Min",min)
+ local nmap = mapat[min-1]
+ local toins = {}
+ --[[
+ print("Before flooding 1:")
+ print_puzzle(nmap,flood)
+ ]]
+ --flood outward
+ for rn,row in pairs(flood) do
+ for cn,col in pairs(row) do
+ if flood[rn][cn] then
+ for name, direction in pairs(directions) do
+ --print("Flooding",rn,cn,name)
+ local trow = rn + direction[1]
+ local tcol = cn + direction[2]
+ if could_move(nmap,trow,tcol) and flood[trow][tcol] == nil then
+ table.insert(toins,{trow,tcol})
+ end
+ end
+ end
+ end
+ end
+ for _,v in pairs(toins) do
+ flood[v[1]][v[2]] = min
+ end
+ --[[
+ print("After flooding 1:")
+ print_puzzle(nmap,flood)
+ ]]
+ nmap = mapat[min]
+ --clean up where blizzards pass
+ for rn,row in pairs(nmap) do
+ for cn, col in pairs(row) do
+ flood[rn][cn] = nil
+ end
+ end
+ print("After cleaning:")
+ print_puzzle(nmap,flood)
+end
+print("Back to goal reached after",min)
diff --git a/24/ext.lua b/24/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/24/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/24/input.txt b/24/input.txt
new file mode 100644
index 0000000..285925a
--- /dev/null
+++ b/24/input.txt
@@ -0,0 +1,27 @@
+#.########################################################################################################################
+#<>v^<vv<v<><.^v><<.>v><<^^<v..<>.v^>^v<^><vv>.>^v>^>>v^v>><^><><<^><^>.^>^<vv>v>^>>^<^v.^<^v<.><.v><<.^v^.^<v^v<<vv><<v>#
+#<>.vv^^vv<^v.^><^v<>>.<<<.^<^<>v<v<<>v>^vv..<<.^>^>>>.<>>^.^<^<<<^<>vv>.<<><^>.^>.vv^^v..v^<v^<vv.^.>v<^<^.<>^^v>^>v^<^>#
+#<<>v>v>v.^<><^><>^>.v<<>.^v.v<<v<^^v>v<^^<<>^>vv<vvv>^v^.<>>^^^^<><vvv<v^>^<vv.><..><^>^<<^><^.v>>^>>>v>v>>vv^v<<.<v^<^>#
+#<^.vv><^>^^>v<.>^vvv>v^v>><v>><v<><^.>v^v<v<<<>v.^>>^>v>^.>><<<v.^^^v^.v>^^vv^<<.v^<^v.v<<>><><vv.vv<^..<vv^.^<>>>.<<^^>#
+#<^<v<.>vvvvvv^>>.^v>.<<v^^^><^<^^<^>v><>>><>>vv^v><^>v>>v.^>>>v^v^^^.^^>^v<.v^>^^v<vv.<.<^v>vv^v>^v>>v<^^>>^^<><^>v<v>.>#
+#<vvvv<<^<v^vvv<.^<vv>.>v<v><<^v>^^<^v<^>vv^.<^vvv<^>^^vv^.v.^^..><<>^.>...^<<^>^^<^vvv>.^<>>^.v^v.^<>v^<vvvv>^.<>v>><v<>#
+#>.^>.vv^<^^<v><><<>>>vv>.<><^^<>>v><<>>v^vv.>^.>v^^<^<^.>>v<<<vv<<>>.<^<><.<<^v^><>.<>^<<.^>^v<>^^>><<>vv.v<>v^^>>>>>v><#
+#<.^<>.>.^>v><.^<>>>^^<^v^>^<^.>^^^v.<>vv><>v^v^v^^<^>^<<.v^>^v.<>.<^.>v><>>.<<v<^>>v>>>.^<><v<vv.<^^>^v<<<^^.<v<^>v>v^<<#
+#><^>.<<<^..>>>^>.>^<vv.<.v^><>>>^<.v<^^^><>v.>.v^v<^^v><^.^.><^^<>^^v<>><^<.v>><>>>>.>^v<^v^<<^v>>.v<^<>vv<>v>vv.^<<<v.<#
+#>.^^<<><v.>^^>>.^>^v>^>..>>>^v^<v^^^>v>>v>>v.^<>vv><>.<>vvvvv.vvv..><>v.vv<^v^v>^>^vv^<v<.^>>.>v^><<v>^v^>>.>^v><<^^^<v<#
+#.^<>>.v<>vv<vvv^^>vv><<.^>><^.v>>^v<.v^<^v^.<vvv^^>^^>^>>>.^.>vvv>>^^^^<^^v>^>v^<v><v^<><><<^v<<<><><<v^.vv><^vv^v<<vv<>#
+#<..vvv>><.v<^><v.v^^^v>^^v<<^v<>^><^v>^vvv^<^v>>^>>^<v>^<<^v^v.^vv>^><^v<^v^v>vv>^<^^^v>^^^<.>^v.v^<^>>^>^^^^^^vv<.v^^><#
+#<v><<v>>^v<>>v^^v<^v<<><<^><^<<^^>.<.^v>^>>v<>^><.^<<<.>^^v^vvv><<^>>^^<^^<><v.^v<<^..v^.<v>>^v.>^<^^v<<vvv^v<^<<<<<v>^>#
+#<v<<v^<^<^^v^vv<<<.>v<<><<^v^.^>><.v<^<v<^<<<<.<v^^vvv^>^^^>.><<><><<<^>v.>>>vv<.<v.><>^v^>^^^^.>v^<>.v>^.<v>v<^.v>vv<>>#
+#>v<v..<^v^<<<>><>>^<^v>>v>v^>vv^v<^.vv^vv>v<<<vv.v^.>^v><<v<vv>>^<.>vvv...v<^><>>.^v>v<^^>v^v<<>v>.^>><<<><<v^<v^.^v^>v>#
+#<<>^v>v>v<<<vvvv^^>v^..>..>^<>^>>><><<><v><^vv.>^v>v^v<<<vv><<.>><<<<<.<<<>^><v><vv^^v>^>>>><.^.^^>v<^<^>>.^>>^v.<>^>v>>#
+#>v<<<>^^>..^>>v.v^<><^>^^<<vv<<>>^<<>v^.<^><.v>>vv^v<v<^^v..>>^^^>^v>^v^^v^>^.<^>>>v^<><v>^.<>>^^<vv>>>^><^>>.<<>>v>vv<>#
+#<^^^..>>><>v>v>.>^.<.vv.vv<>v^vv<<^^>>v<^^<vv><^>><v>>>^^^><^^<.<^^>v>^^><v<vv^>vvv<^<..^>>>^v^v^^v>^^^.<.>v<^v><><>^^.>#
+#>^^>^^^^.<<.v^.><v<^^.<<<.><<><>.<<<^^><.>>..<>v^^^>^v<^>>.>v><^^vvv^>>^<v>v><^<>^<>>^^v>^.v>v<<>>>^v^vv<<<^..<>^><>>^>.#
+#.^<<<^^vv<.>v<.<>.>v.^..^^.>.vv.v>^>v.^.v<>v>>^^<^<^^^>>^>vvv.<^>><^>><^^>^>..^><.<v>.<^>^^v^v.>v<v^^><<>>vv^vv><v<>v^<>#
+#<vvv><<>v<^<^.>..^<.<v^v^v>.^<^vv^v>v<vvv<>><>vv.vvv<^><^^>><>vv>^^^><>^<^^><^>.>v<>^.vv<v<<v^^>v<v.^^^><>^<v^<>.>.^^v^>#
+#>v.^>..^>v>v>^^<^v>..>..^<.^..>>v<>.<>.<v>>>vv^<<>>>v<v^v^^vv<^vvvv<^v<^v<^^>>v>v><v><<v><v><^v<v>^>^^<>v.v<<^<.<><<<>.>#
+#>>v><..^^^.<v<^^<v<><<<<<^^^<>^^v^.>vv<v><<>>^^^<v^vv^v^<>...>^.<v><<^^v^..><>vv>v^>^v>.vv<v<^.<<<v^<^v^<<v^.<.^<.>v^<><#
+#>^v<..<>>v^v>v>v^v^<^<^^<..><v>^^>><<><>.^v.v<^>^<v><.^vv^.>v^>^v>^^v^>v<v^...><<<>><>>>^<vv<<^^^.<^vv^^^.v<vv<<<>>^><^<#
+#>><<v<>>>vv>>^^^v^^^>^>><v<>><^vv><>>>^.v^>^>^vv<>>..^v.^^^vvvv<><^><^v>vv<<^vv>^>v..<><.>^^^v.v>vvvv>>>><<vv<>.<v^<vv>>#
+########################################################################################################################.#
diff --git a/24/sample.txt b/24/sample.txt
new file mode 100644
index 0000000..158014b
--- /dev/null
+++ b/24/sample.txt
@@ -0,0 +1,7 @@
+#.#####
+#.....#
+#>....#
+#.....#
+#...v.#
+#.....#
+#####.#
diff --git a/24/sample2.txt b/24/sample2.txt
new file mode 100644
index 0000000..685dc4f
--- /dev/null
+++ b/24/sample2.txt
@@ -0,0 +1,6 @@
+#.######
+#>>.<^<#
+#.<..<<#
+#>v.><>#
+#<^v^^>#
+######.#
diff --git a/24/scratch b/24/scratch
new file mode 100644
index 0000000..a2f43da
--- /dev/null
+++ b/24/scratch
@@ -0,0 +1,7 @@
+146 - too low
+322
+330
+345
+346 - too high
+358
+381
diff --git a/25/1.lua b/25/1.lua
new file mode 100644
index 0000000..53d8794
--- /dev/null
+++ b/25/1.lua
@@ -0,0 +1,74 @@
+require "ext"
+
+local snafu = {
+ ["0"] = 0,
+ ["1"] = 1,
+ ["2"] = 2,
+ ["-"] = -1,
+ ["="] = -2,
+}
+local snafu_rev = {}
+for k,v in pairs(snafu) do
+ snafu_rev[v] = k
+end
+
+local function decode(s)
+ local t = {}
+ for c in s:gmatch("(.)") do
+ table.insert(t,c)
+ end
+ local cursor = 1
+ local n = 0
+ while #t > 0 do
+ local val = table.remove(t)
+ n = n + (snafu[val] * cursor)
+ cursor = cursor * 5
+ end
+ return n
+end
+
+-- 4 8 9 0
+local function encode(n,location)
+ --print("Encoding",n)
+ if snafu_rev[n] then
+ --print("Snafu of",n,"is",snafu_rev[n])
+ return snafu_rev[n]
+ end
+ local rem = n % 5
+ if rem == 0 or rem == 1 or rem == 2 then
+ return encode(math.floor(n/5)) .. snafu_rev[rem]
+ elseif rem == 3 or rem == 4 then
+ return encode(math.floor(n/5)+1) .. snafu_rev[rem - 5]
+ end
+
+end
+
+local sum = 0
+for line in io.lines() do
+ sum = sum + decode(line)
+end
+print(encode(sum))
+--[[
+print(encode(6))
+local encodings = {
+ [1]="1",
+ [2]="2",
+ [3]="1=",
+ [4]="1-",
+ [5]="10",
+ [6]="11",
+ [7]="12",
+ [8]="2=",
+ [9]="2-",
+ [10]="20",
+ [15]="1=0",
+ [20]="1-0",
+ [2022]="1=11-2",
+ [12345]="1-0---0",
+ [314159265]="1121-1110-1=0",
+}
+for k,v in pairs(encodings) do
+ local fe = encode(k)
+ print("Finished encoding of",k,"is",fe)
+ assert(fe == v)
+end]]
diff --git a/25/ext.lua b/25/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/25/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/25/input.txt b/25/input.txt
new file mode 100644
index 0000000..d5b8e5d
--- /dev/null
+++ b/25/input.txt
@@ -0,0 +1,119 @@
+2=--111020=02-=222
+20111==-2001-10
+1211=0020-
+1==2==0-20=1-
+10-=00220--0==1===2
+20
+2==--1---=221
+102=1
+2=1-==-1-211
+2-2100=1000-01-00=
+12=0--
+12=-0=0=11=
+20=1111=22-21-1-=2
+12-00-==1
+21=12222==2-11-
+1-02
+11101=12-
+2002=0--=
+111-20100100=122=2
+10=
+1-===0-12-021==0
+22202212--2-12
+20=1-1
+1=1
+10=-11=0-=12
+111--21=000
+1022-0=1=02=-
+1==2==000=-202--2020
+1==10-==10200001=-
+101=10--01=102
+1-220-2=-000222-
+1=221=2--=1-20
+2--=--0=-=01210-
+1021=21=0=110121=-
+1-11=212=-2-11-
+10=1=0120-0-012-1
+1-0-=11
+11=2==
+10-1--
+1-110--=1-=2--
+21212===010=0-1
+2-2=
+1-10100
+2--0-2---1=002--2=
+12-212=-2=2021
+22211=-=-2
+1-2112
+1=101-111=-1121
+21
+1=10-0=2002-22-2
+1=-2==12=01222-
+112221---=12==0011
+1--1==01
+102-0-
+2-2=0==
+20=
+1=-=-0---00
+1-=00==0--0
+1-----2-
+1=0
+2--2-==0--=2=2=1=22
+20===
+2=-21=012=2
+20-=11=
+1=--102=-
+10-=--=1
+1--1-210
+1011-11-=
+2=-0112-=2-01002--
+111=1-==10=0101--=
+1=-20002--=-22-210
+1---=0-02-100
+2122001012001=02-
+1==--0-0000-
+1=
+22==
+1010=10--100
+2111
+1=2=-
+1-2=2121-1----=-2
+1==11=-201=--=1
+1=2=
+112=1--1-=1
+1-112=2010--1
+2121-0--1010==-
+1=0=0
+112=-00=1-=-=-01
+112=10--20-201=2
+21-210-1
+1==02==120=0=
+1==-0
+2=10-2=2
+11=0=--2-0---
+122=21-=22=2
+111
+1002-102=1-01
+1-1-20-12--
+1=1-=020-
+100=201-1000
+2=-
+1==111-2001
+1==222=122-=0
+1-00=211-2
+12=-0
+1-0=22-02===11-1-
+1--201-120-01
+10
+20=-
+2=2==00--2=121-
+11022120=-=-
+100
+11--2--=12000=1
+201=2==210-
+1200221-=2=-22220
+10220=2-021-1=
+1-=0202=0122-2
+2012-121-02--011
+22=122
+1==-==-120-2-22
diff --git a/25/sample.txt b/25/sample.txt
new file mode 100644
index 0000000..027aeec
--- /dev/null
+++ b/25/sample.txt
@@ -0,0 +1,13 @@
+1=-0-2
+12111
+2=0=
+21
+2=01
+111
+20012
+112
+1=-1=
+1-12
+12
+1=
+122