From 3555be54c2abb8d5ece008a60dbdfbde0ffbddd7 Mon Sep 17 00:00:00 2001 From: Alex Pickering Date: Fri, 7 Feb 2025 12:49:48 -0600 Subject: inital commit --- 01/1.lua | 10 + 01/2.lua | 10 + 01/example.txt | 14 + 01/ext.lua | 62 + 01/input.txt | 2252 ++++++++ 02/1.lua | 21 + 02/2.lua | 21 + 02/example.txt | 3 + 02/ext.lua | 62 + 02/input.txt | 2500 +++++++++ 03/1.lua | 26 + 03/2.lua | 33 + 03/example.txt | 6 + 03/ext.lua | 62 + 03/input.txt | 300 ++ 04/1.lua | 11 + 04/2.lua | 16 + 04/ext.lua | 62 + 04/input.txt | 1000 ++++ 04/sample.txt | 6 + 05/1.lua | 29 + 05/2.lua | 38 + 05/ext.lua | 62 + 05/input.txt | 512 ++ 05/sample.txt | 9 + 06/1.lua | 28 + 06/2.lua | 0 06/ext.lua | 62 + 07/1.lua | 53 + 07/2.lua | 57 + 07/ext.lua | 62 + 07/input.txt | 942 ++++ 07/sample.txt | 23 + 08/1.lua | 49 + 08/2.lua | 68 + 08/ext.lua | 62 + 08/input.txt | 99 + 08/sample.txt | 5 + 09/1.lua | 48 + 09/ext.lua | 62 + 09/input.txt | 2000 +++++++ 09/sample.txt | 8 + 09/sample2.txt | 8 + 10/1.lua | 41 + 10/2.lua | 46 + 10/ext.lua | 62 + 10/input.txt | 137 + 10/sample.txt | 146 + 11/1.lua | 49 + 11/2.lua | 54 + 11/ext.lua | 62 + 11/input.txt | 55 + 11/sample.txt | 27 + 12/1.lua | 39 + 12/2.lua | 42 + 12/ext.lua | 62 + 12/input.txt | 41 + 12/sample.txt | 5 + 13/1.lua | 43 + 13/2.lua | 64 + 13/ext.lua | 62 + 13/input.txt | 449 ++ 13/sample.txt | 23 + 14/1.lua | 83 + 14/2.lua | 87 + 14/ext.lua | 62 + 14/input.txt | 148 + 14/sample.txt | 2 + 15/ext.lua | 62 + 19/1.lua | 129 + 19/1_2.lua | 172 + 19/ext.lua | 62 + 19/input.txt | 3 + 19/input2.txt | 30 + 19/sample.txt | 2 + 22/1.lua | 144 + 22/2.lua | 358 ++ 22/ext.lua | 62 + 22/input.txt | 202 + 22/input_plan.txt | 207 + 22/output.txt | 15014 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 22/sample.txt | 14 + 23/1.lua | 173 + 23/ext.lua | 62 + 23/input.txt | 72 + 23/sample.txt | 7 + 23/sample2.txt | 6 + 24/1.lua | 196 + 24/1_1.lua | 192 + 24/2.lua | 289 + 24/ext.lua | 62 + 24/input.txt | 27 + 24/sample.txt | 7 + 24/sample2.txt | 6 + 24/scratch | 7 + 25/1.lua | 74 + 25/ext.lua | 62 + 25/input.txt | 119 + 25/sample.txt | 13 + 99 files changed, 30489 insertions(+) create mode 100644 01/1.lua create mode 100644 01/2.lua create mode 100644 01/example.txt create mode 100755 01/ext.lua create mode 100644 01/input.txt create mode 100644 02/1.lua create mode 100644 02/2.lua create mode 100644 02/example.txt create mode 100755 02/ext.lua create mode 100644 02/input.txt create mode 100644 03/1.lua create mode 100644 03/2.lua create mode 100644 03/example.txt create mode 100755 03/ext.lua create mode 100644 03/input.txt create mode 100644 04/1.lua create mode 100644 04/2.lua create mode 100755 04/ext.lua create mode 100644 04/input.txt create mode 100644 04/sample.txt create mode 100644 05/1.lua create mode 100644 05/2.lua create mode 100755 05/ext.lua create mode 100644 05/input.txt create mode 100644 05/sample.txt create mode 100644 06/1.lua create mode 100644 06/2.lua create mode 100755 06/ext.lua create mode 100755 07/1.lua create mode 100644 07/2.lua create mode 100755 07/ext.lua create mode 100644 07/input.txt create mode 100644 07/sample.txt create mode 100644 08/1.lua create mode 100644 08/2.lua create mode 100755 08/ext.lua create mode 100644 08/input.txt create mode 100644 08/sample.txt create mode 100644 09/1.lua create mode 100755 09/ext.lua create mode 100644 09/input.txt create mode 100644 09/sample.txt create mode 100644 09/sample2.txt create mode 100644 10/1.lua create mode 100644 10/2.lua create mode 100755 10/ext.lua create mode 100644 10/input.txt create mode 100644 10/sample.txt create mode 100644 11/1.lua create mode 100644 11/2.lua create mode 100755 11/ext.lua create mode 100755 11/input.txt create mode 100644 11/sample.txt create mode 100644 12/1.lua create mode 100644 12/2.lua create mode 100755 12/ext.lua create mode 100644 12/input.txt create mode 100644 12/sample.txt create mode 100644 13/1.lua create mode 100644 13/2.lua create mode 100755 13/ext.lua create mode 100644 13/input.txt create mode 100644 13/sample.txt create mode 100644 14/1.lua create mode 100644 14/2.lua create mode 100755 14/ext.lua create mode 100644 14/input.txt create mode 100644 14/sample.txt create mode 100755 15/ext.lua create mode 100644 19/1.lua create mode 100644 19/1_2.lua create mode 100755 19/ext.lua create mode 100644 19/input.txt create mode 100644 19/input2.txt create mode 100644 19/sample.txt create mode 100644 22/1.lua create mode 100644 22/2.lua create mode 100755 22/ext.lua create mode 100644 22/input.txt create mode 100644 22/input_plan.txt create mode 100644 22/output.txt create mode 100644 22/sample.txt create mode 100644 23/1.lua create mode 100755 23/ext.lua create mode 100644 23/input.txt create mode 100644 23/sample.txt create mode 100644 23/sample2.txt create mode 100644 24/1.lua create mode 100644 24/1_1.lua create mode 100644 24/2.lua create mode 100755 24/ext.lua create mode 100644 24/input.txt create mode 100644 24/sample.txt create mode 100644 24/sample2.txt create mode 100644 24/scratch create mode 100644 25/1.lua create mode 100755 25/ext.lua create mode 100644 25/input.txt create mode 100644 25/sample.txt 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 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^<.^v><<.>v><<^^.v^>^v<^>.>^v>^>>v^v>><^><><<^><^>.^>^v>^>>^<^v.^<^v<.><.v><<.^v^.^<# +#<>.vv^^vv<^v.^><^v<>>.<<<.^<^<>vv>^vv..<<.^>^>>>.<>>^.^<^<<<^<>vv>.<<><^>.^>.vv^^v..v^v<^<^.<>^^v>^>v^<^># +#<<>v>v>v.^<><^><>^>.v<<>.^v.v<v<^^<<>^>vv^v^.<>>^^^^<>^<..><^>^<<^><^.v>>^>>>v>v>>vv^v<<.# +#<^.vv><^>^^>v<.>^vvv>v^v>>><^.>v^vv.^>>^>v>^.>><<^^vv^<<.v^<^v.v<<>><>>>.<<^^># +#<^vvvvvv^>>.^v>.<<^<^^<^>v><>>><>>vv^v><^>v>>v.^>>>v^v^^^.^^>^v<.v^>^^vvv^v>^v>>v<^^>>^^<><^>v.># +#.>v<<^v>^^<^v<^>vv^.<^vvv<^>^^vv^.v.^^..><<>^.>...^<<^>^^<^vvv>.^<>>^.v^v.^<>v^^.<>v>># +#>.^>.vv^<^^<><<>>>vv>.<><^^<>>v><<>>v^vv.>^.>v^^<^<^.>>v<<>.<^<><.<<^v^><>.<>^<<.^>^v<>^^>><<>vv.v<>v^^>>>>>v><# +#<.^<>.>.^>v><.^<>>>^^<^v^>^<^.>^^^v.<>vv><>v^v^v^^<^>^<<.v^>^v.<>.<^.>v><>>.<>v>>>.^<>^v<<<^^.v>v^<<# +#><^>.<<<^..>>>^>.>^<>>>^<.v<^^^><>v.>.v^v<^^v><^.^.><^^<>^^v<>><^<.v>><>>>>.>^v<^v^<<^v>>.v<^<>vv<>v>vv.^<<.^^<<>^^>>.^>^v>^>..>>>^v^v>>v>>v.^<>vv><>.<>vvvvv.vvv..><>v.vv<^v^v>^>^vv^>.>v^><^v^>>.>^v><<^^^>.v<>vvvv><<.^>><^.v>>^v<.v^<^v^.^^>^>>>.^.>vvv>>^^^^<^^v>^>v^<><<^v<<<><><<^vv^v<# +#<..vvv>><.v<^>^^v<<^v<>^><^v>^vvv^<^v>>^>>^^<<^v^v.^vv>^><^v<^v^v>vv>^<^^^v>^^^<.>^v.v^<^>>^>^^^^^^vv<.v^^><# +#<>^v<>>v^^v<^v<<><<^><^<<^^>.<.^v>^>>v<>^><.^<<<.>^^v^vvv><<^>>^^<^^<>>^v.>^<^^v<^># +#v<<><<^v^.^>><.v<^^^^>.><<><><<<^>v.>>>vv<.<>^v^>^^^^.>v^<>.v>^.v<^.v>vv<>># +#>v><>>^<^v>>v>v^>vv^v<^.vv^vv>v<<^v><>^<.>vvv...v<^><>>.^v>v<^^>v^v<<>v>.^>><<<><v># +#<<>^v>v>v<<v^..>..>^<>^>>><><<><^vv.>^v>v^v<<<<.>><<<<<.<<<>^>^>>>><.^.^^>v<^<^>>.^>>^v.<>^>v>># +#>v<<<>^^>..^>>v.v^<><^>^^<>^<<>v^.<^><.v>>vv^v>^^^>^v>^v^^v^>^.<^>>>v^<>^.<>>^^>>^><^>>.<<>>v>vv<># +#<^^^..>>><>v>v>.>^.<.vv.vv<>v^vv<<^^>>v<^^<^>>>>^^^><^^<.<^^>v>^^>vvv<^<..^>>>^v^v^^v>^^^.<.>v<^v><><>^^.># +#>^^>^^^^.<<.v^.><<><>.<<<^^><.>>..<>v^^^>^v<^>>.>v><^^vvv^>>^v><^<>^<>>^^v>^.v>v<<>>>^v^vv<<<^..<>^><>>^>.# +#.^<<<^^vv<.>v<.<>.>v.^..^^.>.vv.v>^>v.^.v<>v>>^^<^<^^^>>^>vvv.<^>><^>><^^>^>..^><..<^>^^v^v.>v<<>>vv^vv>v^<># +#<<>v<^<^.>..^<..^<^vv^v>v><>vv.vvv<^><^^>><>vv>^^^><>^<^^><^>.>v<>^.vvv<>^.>.^^v^># +#>v.^>..^>v>v>^^<^v>..>..^<.^..>>v<>.<>.>>vv^<<>>>v>v>v><<^v^>^^<>v.v<<^<.<><<<>.># +#>>v><..^^^.<<<<<^^^<>^^v^.>vv<<>>^^^...>^.<<^^v^..><>vv>v^>^v>.vvv^<><# +#>^v<..<>>v^v>v>v^v^<^<^^<..>^^>><<><>.^v.v<^>^<.^vv^.>v^>^v>^^v^>v<<<>><>>>^>^><^<# +#>><>>vv>>^^^v^^^>^>>><^vv><>>>^.v^>^>^vv<>>..^v.^^^vvvv<><^><^v>vv<<^vv>^>v..<><.>^^^v.v>vvvv>>>><.># +########################################################################################################################.# 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 -- cgit v1.2.3-70-g09d2