Last active
December 14, 2020 22:37
-
-
Save oxinabox/e64ec6c764b9ab367d1920626a9ece72 to your computer and use it in GitHub Desktop.
Advent of Code 2020, in DexLang
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'# Advent of Code 2020. Day 1 | |
DexLang, [Lyndon White](http://oxinabox.net) | |
## part 1 | |
From the list find two entries that sum to 2020, and compute their product. | |
list = [1567, 1223, 1758, 1842, 1933, 1898, 1409, 1058, 1533, 1417, 1032, 1634, 1477, 1394, 1888, 1972, 1237, 1390, 1677, 1546, 1302, 1070, 1369, 1455, 1065, 1924, 1593, 1131, 1064, 1346, 1914, 1129, 1830, 1450, 1278, 1740, 1809, 1176, 1734, 1102, 1807, 1982, 1603, 1736, 2008, 1980, 1905, 1633, 1732, 1350, 1865, 1988, 1805, 1998, 1152, 1046, 1870, 1557, 1789, 1766, 1945, 1359, 1002, 1126, 1719, 1497, 1296, 1560, 1936, 1929, 1464, 2005, 1281, 618, 1257, 1107, 1632, 1688, 1964, 1803, 1360, 1384, 1889, 1411, 1328, 1452, 1868, 1515, 1586, 1631, 1618, 1087, 1710, 1094, 1774, 1295, 1700, 1636, 1230, 1421, 1910, 1522, 1366, 1144, 1757, 1493, 1316, 1103, 687, 1371, 1720, 1155, 1559, 1900, 989, 1367, 1999, 1066, 1773, 1787, 1402, 1047, 1806, 1956, 1219, 1555, 1307, 1419, 1706, 1884, 1109, 1181, 2010, 1298, 1730, 1078, 1848, 1398, 1687, 2007, 1550, 1664, 1225, 1079, 1698, 350, 1222, 1377, 1977, 1510, 1571, 1630, 1029, 1379, 1942, 1949, 1249, 1829, 1297, 1530, 1607, 1324, 1069, 1476, 928, 1039, 1855, 1644, 1454, 1310, 1172, 547, 1034, 1878, 1479, 1457, 1319, 1810, 1759, 1439, 1851, 545, 1470, 2003, 1908, 1564, 1491, 1174, 1301, 1689, 1276, 1781, 1392, 1499, 1962, 1653, 1823, 1381, 1827, 1974] | |
' helper: `lastSomething` | |
Given a table of `Maybe`s, returns the last that is not `Nothing` | |
def lastSomething (xs:n=>Maybe a) : Maybe a = | |
fold Nothing \i state. (select (isNothing xs.i) state xs.i) | |
:p lastSomething [Nothing, Just 1, Just 2, Nothing] | |
' Solve the actual problem | |
lastSomething for i. lastSomething for j. | |
-- i < j as we only need to check triangle of combinations | |
(select (i<j && (list.i + list.j) == 2020) | |
(Just $ list.i * list.j) | |
Nothing | |
) | |
' ## Part 2 | |
Find 3 numbers that sum to 2020 and report their product | |
Lets not over complicate this and just copy the above | |
lastSomething for i. lastSomething for j. lastSomething for k. | |
-- i < j < k as we only need to check triangle of combinations | |
(select (i<j && j < k && (list.i + list.j + list.k) == 2020) | |
(Just $ list.i * list.j * list.k) | |
Nothing | |
) | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'# Advent of Code 2020. Day 2 | |
DexLang, [Lyndon White](http://oxinabox.net) | |
This needs [my branch](https://github.com/google-research/dex-lang/pull/306) of Dex that has Char equality support. | |
'## Part 1 | |
Check how many passwords follow the rule of letter occuring between min and max times | |
rules = [{letter='p', min=2, max=4, password=AsList _ "vpkpp"}, {letter='b', min=6, max=16, password=AsList _ "bbbbbbbbbbbbbbbpb"}, {letter='z', min=6, max=7, password=AsList _ "zzfzzdz"}, {letter='q', min=4, max=6, password=AsList _ "tfzqvqcpcmqqjqzd"}, {letter='k', min=7, max=8, password=AsList _ "rkkkknkw"}, {letter='t', min=5, max=14, password=AsList _ "ttttnttttttdttttttt"}, {letter='b', min=2, max=10, password=AsList _ "bfbbbbcbnpbbbbt"}, {letter='h', min=3, max=4, password=AsList _ "hrht"}, {letter='c', min=2, max=6, password=AsList _ "ccccccc"}, {letter='g', min=5, max=7, password=AsList _ "pmtgqgg"}, {letter='h', min=16, max=18, password=AsList _ "vhhhhhhhhhhhhphhrnh"}, {letter='k', min=8, max=10, password=AsList _ "kklxkkkqkkkkk"}, {letter='b', min=2, max=5, password=AsList _ "bcbdbbr"}, {letter='l', min=6, max=8, password=AsList _ "lllnllxb"}, {letter='t', min=2, max=13, password=AsList _ "kvdsdnbclhxntktxdwq"}, {letter='z', min=3, max=4, password=AsList _ "zjwz"}, {letter='s', min=12, max=16, password=AsList _ "ssssssssssswssss"}, {letter='h', min=1, max=5, password=AsList _ "mckhhhs"}, {letter='s', min=11, max=18, password=AsList _ "ksssssssgssssssssk"}, {letter='f', min=6, max=7, password=AsList _ "hcmxbfx"}, {letter='r', min=4, max=11, password=AsList _ "grrrcnkjfdr"}, {letter='t', min=6, max=10, password=AsList _ "tdttttrtbjl"}, {letter='h', min=8, max=10, password=AsList _ "vphrhhmhhz"}, {letter='t', min=7, max=8, password=AsList _ "tghttttt"}, {letter='h', min=2, max=11, password=AsList _ "hhhhhhhhhhhhhh"}, {letter='g', min=5, max=6, password=AsList _ "gggggq"}, {letter='p', min=4, max=6, password=AsList _ "dgpmnqv"}, {letter='v', min=5, max=9, password=AsList _ "nmfnvhtrlzhbvd"}, {letter='z', min=1, max=8, password=AsList _ "zwzqzzzz"}, {letter='l', min=10, max=12, password=AsList _ "hllllllhlklldzlmk"}, {letter='n', min=10, max=11, password=AsList _ "brnjfbnnnmnnnnw"}, {letter='d', min=1, max=3, password=AsList _ "jmscsdw"}, {letter='d', min=13, max=20, password=AsList _ "xdqcsdqdpkppddbdtdgg"}, {letter='w', min=1, max=3, password=AsList _ "wfppvkswrwmnq"}, {letter='p', min=2, max=10, password=AsList _ "xbppppmppppppc"}, {letter='r', min=1, max=4, password=AsList _ "rrrr"}, {letter='q', min=4, max=5, password=AsList _ "qqqgq"}, {letter='f', min=7, max=8, password=AsList _ "fchfwjcfpvffdfh"}, {letter='d', min=2, max=5, password=AsList _ "dtddddddgdddx"}, {letter='t', min=11, max=15, password=AsList _ "zcwngpdjtzcpfvt"}, {letter='c', min=11, max=12, password=AsList _ "ccccccccccqz"}, {letter='v', min=8, max=10, password=AsList _ "vvkbszvvwr"}, {letter='t', min=3, max=5, password=AsList _ "psttst"}, {letter='f', min=1, max=7, password=AsList _ "fffsfffffffffrftfff"}, {letter='z', min=3, max=4, password=AsList _ "zqzz"}, {letter='l', min=12, max=13, password=AsList _ "mlklllhkdmllndplj"}, {letter='x', min=11, max=17, password=AsList _ "jttxgmtmpxxxxzfpf"}, {letter='d', min=2, max=7, password=AsList _ "ddqggvrdmrgc"}, {letter='l', min=5, max=15, password=AsList _ "ckjvllsnmczlnsh"}, {letter='l', min=1, max=3, password=AsList _ "nlllllllllll"}, {letter='r', min=4, max=7, password=AsList _ "ctlrfrb"}, {letter='k', min=4, max=12, password=AsList _ "sknbxdzmnckkk"}, {letter='m', min=2, max=16, password=AsList _ "nmmgwpkncdpfglcpzj"}, {letter='n', min=4, max=5, password=AsList _ "nmnnkjn"}, {letter='h', min=3, max=6, password=AsList _ "hhhkhk"}, {letter='n', min=5, max=15, password=AsList _ "ncmnngnngbnnndjx"}, {letter='r', min=1, max=6, password=AsList _ "rrrklrh"}, {letter='j', min=7, max=16, password=AsList _ "jzjjjjdkjjjjjjjjjj"}, {letter='l', min=1, max=2, password=AsList _ "lcxdxl"}, {letter='t', min=1, max=11, password=AsList _ "gttttttttttt"}, {letter='w', min=6, max=10, password=AsList _ "cvtsdlwggwbgn"}, {letter='q', min=3, max=4, password=AsList _ "qpzhj"}, {letter='b', min=5, max=6, password=AsList _ "sbjcbx"}, {letter='h', min=4, max=5, password=AsList _ "dxjhhhpj"}, {letter='z', min=4, max=5, password=AsList _ "zbckhf"}, {letter='r', min=8, max=13, password=AsList _ "xhscjbqthpfkffjh"}, {letter='j', min=5, max=7, password=AsList _ "jjjxjcdtj"}, {letter='b', min=13, max=15, password=AsList _ "bbbbbblbbbwbtbbbbb"}, {letter='x', min=16, max=19, password=AsList _ "xxxgxxxxcwxxxxxksxx"}, {letter='s', min=2, max=5, password=AsList _ "sssss"}, {letter='s', min=11, max=12, password=AsList _ "fwgcsmxfszgs"}, {letter='m', min=1, max=3, password=AsList _ "mmbm"}, {letter='p', min=5, max=10, password=AsList _ "ppgfpzczphpp"}, {letter='r', min=11, max=13, password=AsList _ "rrrrrrrtgrrrc"}, {letter='g', min=4, max=6, password=AsList _ "nggdwbhktgjhsnrwmg"}, {letter='b', min=6, max=9, password=AsList _ "pnrtwgbwwdhmrbp"}, {letter='w', min=5, max=6, password=AsList _ "wwwqqww"}, {letter='s', min=10, max=14, password=AsList _ "ssssssssstsssss"}, {letter='k', min=1, max=9, password=AsList _ "hkkkkkkkkk"}, {letter='n', min=2, max=3, password=AsList _ "nnktnnnc"}, {letter='m', min=4, max=7, password=AsList _ "prmrmmmsj"}, {letter='t', min=13, max=15, password=AsList _ "tfqttttttkttqttttttt"}, {letter='p', min=6, max=8, password=AsList _ "ppppptpplprh"}, {letter='l', min=12, max=14, password=AsList _ "lllllllllllllll"}, {letter='g', min=11, max=12, password=AsList _ "ggggqppgkpzc"}, {letter='n', min=2, max=3, password=AsList _ "hpnnvn"}, {letter='f', min=1, max=5, password=AsList _ "gffffdfffmzf"}, {letter='w', min=9, max=18, password=AsList _ "lwjnfkwrjqtqnvjkhcw"}, {letter='x', min=6, max=7, password=AsList _ "mmxxxxn"}, {letter='j', min=12, max=14, password=AsList _ "hhpwdljfljpvxl"}, {letter='m', min=3, max=5, password=AsList _ "zxlrmrqknmv"}, {letter='l', min=6, max=9, password=AsList _ "slbllllllxlld"}, {letter='g', min=11, max=16, password=AsList _ "gggggggggglggggcg"}, {letter='h', min=1, max=6, password=AsList _ "hwhwlg"}, {letter='k', min=18, max=19, password=AsList _ "kkxvgrkkzkmkkkkkktk"}, {letter='c', min=3, max=10, password=AsList _ "cchccccccfccc"}, {letter='m', min=9, max=10, password=AsList _ "nssbtshpmmn"}, {letter='m', min=6, max=7, password=AsList _ "mtvbmpfpmm"}, {letter='t', min=4, max=13, password=AsList _ "wkmdgpwpcznlqsqtcjf"}, {letter='m', min=1, max=3, password=AsList _ "mmvm"}, {letter='p', min=2, max=11, password=AsList _ "ljvgtkpdlmpznlphxfgj"}, {letter='p', min=5, max=9, password=AsList _ "kppppcppnqpppqpzpppw"}, {letter='w', min=8, max=9, password=AsList _ "wwwwwwwwfw"}, {letter='m', min=4, max=7, password=AsList _ "bvmmlsqsh"}, {letter='v', min=2, max=5, password=AsList _ "vvrvv"}, {letter='j', min=4, max=10, password=AsList _ "jjfwjvxjjjwjj"}, {letter='f', min=5, max=6, password=AsList _ "ffffjf"}, {letter='w', min=1, max=3, password=AsList _ "pwwzd"}, {letter='v', min=4, max=6, password=AsList _ "vvvrvzvvv"}, {letter='s', min=11, max=15, password=AsList _ "ssssspsssscssssd"}, {letter='c', min=3, max=7, password=AsList _ "wrxltgcvpmc"}, {letter='p', min=2, max=3, password=AsList _ "pplp"}, {letter='f', min=3, max=5, password=AsList _ "nfnxfg"}, {letter='r', min=8, max=9, password=AsList _ "rrrsrrrhrr"}, {letter='j', min=3, max=7, password=AsList _ "dpmcvjj"}, {letter='b', min=10, max=16, password=AsList _ "bbbbbbbbbbbbbbrnbb"}, {letter='q', min=13, max=15, password=AsList _ "qqqqqxqqqqqqqqhqq"}, {letter='v', min=6, max=7, password=AsList _ "wvvvvzvv"}, {letter='j', min=2, max=7, password=AsList _ "rbtzvjhnvfznhfbskcp"}, {letter='n', min=7, max=8, password=AsList _ "nnnnncbnn"}, {letter='j', min=14, max=15, password=AsList _ "jjjjjjjgjjjjjjbjj"}, {letter='g', min=8, max=12, password=AsList _ "gggdgggghgqggggjgg"}, {letter='b', min=9, max=10, password=AsList _ "rlcbfbbbbbb"}, {letter='k', min=11, max=12, password=AsList _ "kkkkkkkkkktkk"}, {letter='k', min=11, max=12, password=AsList _ "kmkkkkkkkkqk"}, {letter='c', min=11, max=14, password=AsList _ "ccccfccccccccncccq"}, {letter='k', min=13, max=16, password=AsList _ "pkkkkkjkkkbkrkkkkzk"}, {letter='d', min=7, max=17, password=AsList _ "dhdvddzjddrwdchdd"}, {letter='z', min=1, max=8, password=AsList _ "zqlzzzzzz"}, {letter='p', min=3, max=9, password=AsList _ "ppfppsppwppbp"}, {letter='r', min=7, max=9, password=AsList _ "rrnrrrbrrrrrhrrr"}, {letter='t', min=4, max=7, password=AsList _ "tfqxtgl"}, {letter='l', min=4, max=5, password=AsList _ "ljmglll"}, {letter='d', min=5, max=6, password=AsList _ "tdvffd"}, {letter='r', min=4, max=13, password=AsList _ "rwrqbdbtbrtmrmlrgrr"}, {letter='g', min=15, max=19, password=AsList _ "gggggggggggggggggggg"}, {letter='r', min=7, max=8, password=AsList _ "lrkrfxtrrj"}, {letter='z', min=5, max=6, password=AsList _ "zkdlwzwv"}, {letter='r', min=9, max=10, password=AsList _ "rzrrrrrrfr"}, {letter='r', min=3, max=5, password=AsList _ "rrbcgrbrqrrd"}, {letter='t', min=15, max=16, password=AsList _ "cqnkntxktjwtttctt"}, {letter='p', min=9, max=12, password=AsList _ "ppppppppdpppp"}, {letter='d', min=8, max=10, password=AsList _ "tgddddgdck"}, {letter='n', min=6, max=9, password=AsList _ "nnnnncnxgpnnnnnn"}, {letter='w', min=1, max=4, password=AsList _ "wpwxtjwlwt"}, {letter='d', min=3, max=11, password=AsList _ "dclddmdkqdmf"}, {letter='w', min=5, max=7, password=AsList _ "zgwkpnwkqctwxj"}, {letter='x', min=4, max=6, password=AsList _ "phmxxhvlf"}, {letter='g', min=1, max=2, password=AsList _ "gjrvfg"}, {letter='t', min=11, max=13, password=AsList _ "ttbtptlzltttvttqttj"}, {letter='p', min=2, max=6, password=AsList _ "nmqsppqcqxntchq"}, {letter='z', min=10, max=13, password=AsList _ "dszzzzzgzzplf"}, {letter='j', min=5, max=7, password=AsList _ "kjwbjjqjjgd"}, {letter='r', min=12, max=16, password=AsList _ "rrrrrrjrrrrbrrrlrr"}, {letter='p', min=4, max=6, password=AsList _ "dppppx"}, {letter='w', min=11, max=20, password=AsList _ "wkswvxjwwzhxwwwqgqwn"}, {letter='f', min=8, max=9, password=AsList _ "qffwwmfwjf"}, {letter='g', min=3, max=4, password=AsList _ "pbgdtg"}, {letter='q', min=3, max=8, password=AsList _ "dqqqqqql"}, {letter='d', min=16, max=17, password=AsList _ "djddpdddddddddddsd"}, {letter='q', min=4, max=7, password=AsList _ "qqqqqqmq"}, {letter='r', min=13, max=14, password=AsList _ "rrlrsrrrrrrrrsrr"}, {letter='k', min=10, max=12, password=AsList _ "kkkkkkkkkhkkk"}, {letter='z', min=1, max=3, password=AsList _ "hdqwpdtmzgnpnffrh"}, {letter='g', min=2, max=4, password=AsList _ "gtgrg"}, {letter='l', min=5, max=7, password=AsList _ "lllltlllq"}, {letter='s', min=6, max=8, password=AsList _ "sqcvnsgs"}, {letter='q', min=1, max=3, password=AsList _ "qdqbqq"}, {letter='j', min=1, max=4, password=AsList _ "jknh"}, {letter='z', min=4, max=5, password=AsList _ "zzxlz"}, {letter='c', min=2, max=5, password=AsList _ "ccccjc"}, {letter='l', min=7, max=8, password=AsList _ "lllqfltlwll"}, {letter='p', min=8, max=9, password=AsList _ "pplpppppt"}, {letter='j', min=4, max=19, password=AsList _ "vkmrhblhpvfjlbwjlxjm"}, {letter='l', min=4, max=5, password=AsList _ "rlllnl"}, {letter='j', min=3, max=13, password=AsList _ "hgqcvcnjwnrnjp"}, {letter='c', min=3, max=5, password=AsList _ "cpcbbjp"}, {letter='z', min=4, max=5, password=AsList _ "jtpjzdrwcbrzhvmzz"}, {letter='s', min=4, max=8, password=AsList _ "bqsbvtrs"}, {letter='d', min=13, max=14, password=AsList _ "ddjddddddddpqddd"}, {letter='l', min=5, max=6, password=AsList _ "lllllll"}, {letter='z', min=7, max=9, password=AsList _ "zzzzzzzzpz"}, {letter='f', min=3, max=4, password=AsList _ "rpsgm"}, {letter='l', min=9, max=13, password=AsList _ "dllldlllllllb"}, {letter='h', min=16, max=17, password=AsList _ "thvclfldkhxzcqwvhp"}, {letter='z', min=8, max=9, password=AsList _ "zzzzzzzzz"}, {letter='d', min=9, max=10, password=AsList _ "dtddddddtdk"}, {letter='k', min=3, max=6, password=AsList _ "sxbvkk"}, {letter='x', min=4, max=14, password=AsList _ "xffvxhtxxnmjcxm"}, {letter='h', min=6, max=11, password=AsList _ "kthhhhfqhwf"}, {letter='z', min=3, max=5, password=AsList _ "pzzzq"}, {letter='x', min=3, max=4, password=AsList _ "xxxwxx"}, {letter='w', min=2, max=4, password=AsList _ "sqdwjg"}, {letter='t', min=5, max=6, password=AsList _ "mmgjhkqxts"}, {letter='w', min=7, max=9, password=AsList _ "wwwwwwwwkww"}, {letter='c', min=13, max=15, password=AsList _ "cccccccccccjccj"}, {letter='j', min=2, max=4, password=AsList _ "qjmhjpzbwfj"}, {letter='h', min=9, max=10, password=AsList _ "hhhjhhhhhzpwh"}, {letter='x', min=3, max=6, password=AsList _ "xxtxxlgx"}, {letter='q', min=11, max=14, password=AsList _ "qqqqqqqqqqqqqsq"}, {letter='n', min=2, max=6, password=AsList _ "kqnxcnnx"}, {letter='m', min=9, max=10, password=AsList _ "mmmmmpmmbm"}, {letter='p', min=9, max=12, password=AsList _ "pphpspzpppdp"}, {letter='j', min=4, max=5, password=AsList _ "jmndj"}, {letter='w', min=11, max=13, password=AsList _ "wgdmhwgcwlwqbwpxwkw"}, {letter='b', min=5, max=12, password=AsList _ "bdzqgjbfbbbbbqwb"}, {letter='v', min=9, max=10, password=AsList _ "kvqpggvvcvpv"}, {letter='s', min=9, max=12, password=AsList _ "lsbxnblrxfggt"}, {letter='r', min=9, max=12, password=AsList _ "rrrrrrrrrrrqrrr"}, {letter='s', min=9, max=10, password=AsList _ "nshmnkcdsz"}, {letter='z', min=1, max=2, password=AsList _ "kzzz"}, {letter='v', min=4, max=6, password=AsList _ "vsslvv"}, {letter='j', min=8, max=9, password=AsList _ "jjjjjjjjk"}, {letter='n', min=5, max=6, password=AsList _ "nnvnnn"}, {letter='k', min=3, max=5, password=AsList _ "nnjsljhcwtckqjs"}, {letter='b', min=2, max=5, password=AsList _ "cbhjxd"}, {letter='c', min=4, max=10, password=AsList _ "ccxzqktkqjsggfcckccc"}, {letter='f', min=13, max=16, password=AsList _ "ffffffffffffzffvf"}, {letter='l', min=1, max=4, password=AsList _ "slllll"}, {letter='v', min=7, max=9, password=AsList _ "vxvvvdrvnvwwklvv"}, {letter='r', min=3, max=9, password=AsList _ "rrtrrrrrrr"}, {letter='n', min=2, max=3, password=AsList _ "bnnsnf"}, {letter='b', min=9, max=12, password=AsList _ "txbxbvbtkbbbbbbbgq"}, {letter='c', min=6, max=17, password=AsList _ "ccccrcccccgcccccccc"}, {letter='d', min=3, max=7, password=AsList _ "qcddhpm"}, {letter='t', min=15, max=18, password=AsList _ "ttttttttttttttztttt"}, {letter='v', min=2, max=5, password=AsList _ "mvxcfbgzzfgrqts"}, {letter='q', min=3, max=4, password=AsList _ "vqwqqqmgk"}, {letter='k', min=3, max=8, password=AsList _ "kknkkkkkkk"}, {letter='z', min=4, max=6, password=AsList _ "skclpzmrlgzzzvzsl"}, {letter='h', min=3, max=4, password=AsList _ "hhsh"}, {letter='z', min=8, max=11, password=AsList _ "zzzzzzzzzzzznxzzzz"}, {letter='p', min=1, max=5, password=AsList _ "ppppc"}, {letter='f', min=2, max=6, password=AsList _ "nffwwj"}, {letter='g', min=5, max=7, password=AsList _ "gwtwfqmdfcgtth"}, {letter='q', min=1, max=17, password=AsList _ "wqfvwgcwcpwtgvtwf"}, {letter='c', min=6, max=16, password=AsList _ "ccccccccccccccccxccc"}, {letter='p', min=8, max=10, password=AsList _ "ppppprpppc"}, {letter='k', min=4, max=6, password=AsList _ "kqkkkkkkkkkk"}, {letter='q', min=3, max=10, password=AsList _ "cvqgjxqcrj"}, {letter='l', min=3, max=6, password=AsList _ "hcbgpfjhscfbrsfkzk"}, {letter='s', min=2, max=5, password=AsList _ "mskwssbdstsbssr"}, {letter='m', min=2, max=8, password=AsList _ "fzmfccddffc"}, {letter='v', min=6, max=8, password=AsList _ "vfmvltvv"}, {letter='w', min=3, max=4, password=AsList _ "wwwk"}, {letter='x', min=5, max=6, password=AsList _ "kxwxlxjxx"}, {letter='f', min=14, max=16, password=AsList _ "ffffffhffffffffk"}, {letter='q', min=7, max=8, password=AsList _ "lmqqlnqqpv"}, {letter='s', min=6, max=8, password=AsList _ "mzssssds"}, {letter='l', min=7, max=8, password=AsList _ "fgwtpwrltlvs"}, {letter='n', min=3, max=4, password=AsList _ "nmncnnkhnclmhdkbsv"}, {letter='f', min=8, max=9, password=AsList _ "fffffffftf"}, {letter='x', min=2, max=11, password=AsList _ "xcxfxxpxxdj"}, {letter='f', min=10, max=16, password=AsList _ "fffffffffffffffh"}, {letter='m', min=2, max=6, password=AsList _ "mjmmmm"}, {letter='g', min=5, max=7, password=AsList _ "gfgshggrhg"}, {letter='q', min=9, max=13, password=AsList _ "qqqqqqqqqqqqjq"}, {letter='x', min=11, max=14, password=AsList _ "xxxxxxxxxxxxxgxx"}, {letter='m', min=5, max=8, password=AsList _ "mmmmkkmmfx"}, {letter='n', min=3, max=4, password=AsList _ "nwdnnnn"}, {letter='x', min=1, max=7, password=AsList _ "tksssgxnlvkphdxzcsx"}, {letter='r', min=1, max=3, password=AsList _ "rrmn"}, {letter='m', min=2, max=5, password=AsList _ "mnmmmxmmmm"}, {letter='j', min=3, max=4, password=AsList _ "rcjcrjf"}, {letter='z', min=6, max=14, password=AsList _ "wnchnnzkptzfwb"}, {letter='j', min=5, max=16, password=AsList _ "jjljcjkjjmzjjjnxfjj"}, {letter='k', min=8, max=14, password=AsList _ "kkkkjkknkkkkkk"}, {letter='d', min=5, max=8, password=AsList _ "lcfpxdpdsrxhcgb"}, {letter='d', min=1, max=3, password=AsList _ "ddscmtdh"}, {letter='d', min=6, max=7, password=AsList _ "lxdddkd"}, {letter='s', min=1, max=3, password=AsList _ "wssss"}, {letter='x', min=4, max=8, password=AsList _ "xgxjflxzdxhxxcx"}, {letter='w', min=3, max=6, password=AsList _ "nxwgww"}, {letter='l', min=12, max=16, password=AsList _ "ljjglfblllllpblk"}, {letter='n', min=9, max=10, password=AsList _ "nxnnnnnnnmn"}, {letter='m', min=3, max=4, password=AsList _ "mmlgfmc"}, {letter='k', min=5, max=13, password=AsList _ "lmvxkxkbqkbxmmsxkqfc"}, {letter='c', min=10, max=11, password=AsList _ "cccccccccch"}, {letter='v', min=13, max=16, password=AsList _ "vvvvvvvvvvvvvvvvvv"}, {letter='h', min=1, max=2, password=AsList _ "hkhdbhjcf"}, {letter='l', min=16, max=17, password=AsList _ "llllllllllllllllcl"}, {letter='c', min=1, max=2, password=AsList _ "zcccccp"}, {letter='x', min=2, max=10, password=AsList _ "jsgxvxxdrxwtsftx"}, {letter='r', min=17, max=18, password=AsList _ "rrrrrrrrrxrrrrrrrh"}, {letter='w', min=4, max=5, password=AsList _ "wwwpwwwwwwwww"}, {letter='f', min=1, max=3, password=AsList _ "fzffff"}, {letter='q', min=3, max=5, password=AsList _ "rqsqq"}, {letter='b', min=4, max=7, password=AsList _ "blkxxbbrkkbjzqqd"}, {letter='s', min=5, max=6, password=AsList _ "slsssssss"}, {letter='g', min=13, max=15, password=AsList _ "xgggggggggggcrxg"}, {letter='d', min=3, max=4, password=AsList _ "ddsddddddddddddddddd"}, {letter='r', min=3, max=8, password=AsList _ "cklssrprdmgggk"}, {letter='s', min=5, max=11, password=AsList _ "ndxsssddflsbsptdzfmh"}, {letter='g', min=5, max=20, password=AsList _ "sgpdgmnsgxgghmlmgqgz"}, {letter='p', min=13, max=14, password=AsList _ "kpppmppppzbppgpp"}, {letter='f', min=10, max=11, password=AsList _ "ffffffffffvff"}, {letter='g', min=4, max=8, password=AsList _ "gpgpggcnjggqg"}, {letter='n', min=8, max=10, password=AsList _ "npxntcdndpnrq"}, {letter='q', min=9, max=13, password=AsList _ "qqqqqqqqqqqqtq"}, {letter='n', min=5, max=8, password=AsList _ "nnnnwnpnnv"}, {letter='w', min=6, max=9, password=AsList _ "wwwwwwwkcwwwwwwww"}, {letter='g', min=6, max=7, password=AsList _ "gxgghmg"}, {letter='z', min=7, max=8, password=AsList _ "spgkbchz"}, {letter='v', min=6, max=14, password=AsList _ "jdpxvvdvtvpsqm"}, {letter='d', min=2, max=7, password=AsList _ "vjbktzd"}, {letter='s', min=2, max=3, password=AsList _ "ssxv"}, {letter='j', min=2, max=4, password=AsList _ "jtch"}, {letter='r', min=3, max=5, password=AsList _ "hghhr"}, {letter='k', min=17, max=19, password=AsList _ "kkkkkkkkkknkkkkkrkq"}, {letter='v', min=4, max=13, password=AsList _ "vvvcvvvvvvvqvwvv"}, {letter='k', min=5, max=8, password=AsList _ "dkpkvkkckkwbk"}, {letter='h', min=8, max=15, password=AsList _ "qdqhqglpgbsjgnhc"}, {letter='d', min=8, max=11, password=AsList _ "fdpddxmcdkdh"}, {letter='c', min=3, max=5, password=AsList _ "ccwcccccpc"}, {letter='z', min=10, max=11, password=AsList _ "wjnzrzkzwzfgrzzl"}, {letter='m', min=12, max=14, password=AsList _ "mmmwmmmmmmmmmmmm"}, {letter='q', min=2, max=4, password=AsList _ "kqcvqxxtdbtjrjmrgr"}, {letter='f', min=12, max=14, password=AsList _ "wjsfpfhxbfvffh"}, {letter='d', min=14, max=17, password=AsList _ "dddddddddddddddddddd"}, {letter='s', min=1, max=5, password=AsList _ "dsssssdssswqns"}, {letter='h', min=6, max=8, password=AsList _ "hnlbffhh"}, {letter='k', min=4, max=5, password=AsList _ "bhssktq"}, {letter='p', min=8, max=19, password=AsList _ "pppppppfpppppppppppp"}, {letter='q', min=18, max=19, password=AsList _ "qsxllxqlzkqqmkqshqd"}, {letter='p', min=3, max=6, password=AsList _ "qbpkpm"}, {letter='z', min=1, max=3, password=AsList _ "zxnlclfzbp"}, {letter='f', min=18, max=19, password=AsList _ "ffxmfdxfdfffffhrfjf"}, {letter='w', min=2, max=5, password=AsList _ "wvpwwwf"}, {letter='l', min=13, max=17, password=AsList _ "llplltllllllmlllp"}, {letter='t', min=6, max=8, password=AsList _ "jzwtpjkcktrpqp"}, {letter='f', min=3, max=4, password=AsList _ "wfhffdnfffffvfsfffz"}, {letter='c', min=5, max=7, password=AsList _ "csctcxrcq"}, {letter='f', min=5, max=8, password=AsList _ "fffftffff"}, {letter='h', min=10, max=12, password=AsList _ "hjhmhwhzckhg"}, {letter='r', min=7, max=9, password=AsList _ "rrrrrrgrrr"}, {letter='z', min=11, max=13, password=AsList _ "zzzkzgfzzrzzrzz"}, {letter='q', min=14, max=18, password=AsList _ "hpsqffzbhqqldqrtcz"}, {letter='t', min=8, max=12, password=AsList _ "jtjttjtzvttvttptttlt"}, {letter='w', min=1, max=3, password=AsList _ "wwrwwwwwpwvwwcnf"}, {letter='d', min=2, max=6, password=AsList _ "clmpddfddhdd"}, {letter='l', min=6, max=8, password=AsList _ "lllllpfll"}, {letter='z', min=5, max=6, password=AsList _ "fhrdnz"}, {letter='n', min=3, max=7, password=AsList _ "gxjntsp"}, {letter='t', min=4, max=8, password=AsList _ "nddttttgnvt"}, {letter='l', min=2, max=4, password=AsList _ "lbxlhlllllllllllfl"}, {letter='l', min=2, max=5, password=AsList _ "llkdlbx"}, {letter='q', min=3, max=6, password=AsList _ "wqbbhnmcwplxlm"}, {letter='c', min=4, max=9, password=AsList _ "wkcccjcqrlclcgcccrc"}, {letter='h', min=3, max=4, password=AsList _ "thjh"}, {letter='s', min=2, max=6, password=AsList _ "hsbnjgjqj"}, {letter='s', min=7, max=10, password=AsList _ "sbshrhsvhnqtb"}, {letter='j', min=10, max=15, password=AsList _ "jjjjjjjjjcjjjjjjj"}, {letter='k', min=9, max=12, password=AsList _ "kkkkkkqkkkknkkkkkkkk"}, {letter='p', min=5, max=7, password=AsList _ "zrzpplx"}, {letter='v', min=7, max=12, password=AsList _ "vvvvvvvvvvvjvv"}, {letter='s', min=14, max=15, password=AsList _ "sssvssspssssswss"}, {letter='z', min=11, max=13, password=AsList _ "nzzzzzzzzfzzrzz"}, {letter='b', min=6, max=8, password=AsList _ "pwvlqbhlswggnhbwthjl"}, {letter='t', min=8, max=12, password=AsList _ "tcxpmxcbswgt"}, {letter='m', min=4, max=5, password=AsList _ "mmmxf"}, {letter='f', min=11, max=12, password=AsList _ "ffpffffwfwfk"}, {letter='r', min=3, max=8, password=AsList _ "rrrrrgrdxrr"}, {letter='f', min=6, max=7, password=AsList _ "fsfbffjfb"}, {letter='h', min=8, max=9, password=AsList _ "hhhhhhhhhhhhh"}, {letter='w', min=11, max=12, password=AsList _ "lwwwttwwkvpwwwwwc"}, {letter='s', min=1, max=14, password=AsList _ "pshssssssssssrsjs"}, {letter='x', min=4, max=6, password=AsList _ "xxxxxxxx"}, {letter='l', min=2, max=4, password=AsList _ "lldt"}, {letter='x', min=9, max=10, password=AsList _ "xxdxxxxxczxbxd"}, {letter='t', min=1, max=7, password=AsList _ "tgtttdst"}, {letter='z', min=8, max=9, password=AsList _ "zzzzqzzzd"}, {letter='g', min=11, max=12, password=AsList _ "ggggggggggdxg"}, {letter='p', min=10, max=13, password=AsList _ "ppppgppppppprppgp"}, {letter='g', min=2, max=16, password=AsList _ "qggkwxfvpcffplwg"}, {letter='n', min=17, max=18, password=AsList _ "nnnnnnnnnnnnnnnnnz"}, {letter='q', min=3, max=7, password=AsList _ "qqqqqbdqqq"}, {letter='h', min=4, max=8, password=AsList _ "hjmhrmhbvhj"}, {letter='d', min=12, max=15, password=AsList _ "bdzddppfddhpzjd"}, {letter='z', min=5, max=7, password=AsList _ "zzzzzzzzzz"}, {letter='v', min=3, max=4, password=AsList _ "vvvf"}, {letter='g', min=3, max=5, password=AsList _ "dcnwgqrvggfqbllvfgk"}, {letter='b', min=5, max=9, password=AsList _ "lsmsrwlvb"}, {letter='w', min=7, max=8, password=AsList _ "wwwwwwwsw"}, {letter='n', min=12, max=13, password=AsList _ "hrbpwjqrkhtxnnqqn"}, {letter='m', min=5, max=6, password=AsList _ "mvxqmmd"}, {letter='v', min=3, max=20, password=AsList _ "hmhjxjffzczvbwqfnngv"}, {letter='d', min=15, max=16, password=AsList _ "ddddddddddddhddd"}, {letter='x', min=4, max=7, password=AsList _ "jxxbwnxpbqrkx"}, {letter='z', min=5, max=7, password=AsList _ "zrzzzzmzt"}, {letter='c', min=16, max=20, password=AsList _ "hcdccfkcjcsxrcnccbpv"}, {letter='j', min=8, max=9, password=AsList _ "jjjqjjjjk"}, {letter='c', min=4, max=12, password=AsList _ "kszcxlswkcbvmxjsbdt"}, {letter='r', min=1, max=5, password=AsList _ "rrhnr"}, {letter='x', min=12, max=13, password=AsList _ "xxxxxbxxxxxxx"}, {letter='r', min=2, max=4, password=AsList _ "rrnl"}, {letter='m', min=1, max=8, password=AsList _ "rmmmmmvmmmmmm"}, {letter='k', min=10, max=13, password=AsList _ "kkkkkkkkkkkkbk"}, {letter='t', min=5, max=15, password=AsList _ "qtrtttxvtlxhtlpttwt"}, {letter='k', min=9, max=10, password=AsList _ "kkkkkkkkzh"}, {letter='q', min=17, max=18, password=AsList _ "qqqqqbqqqqqqqqqqwqq"}, {letter='k', min=1, max=2, password=AsList _ "jkftk"}, {letter='t', min=5, max=7, password=AsList _ "ltttktvtwtt"}, {letter='b', min=4, max=6, password=AsList _ "rbbtwb"}, {letter='w', min=1, max=5, password=AsList _ "gwwwwwmwww"}, {letter='x', min=6, max=8, password=AsList _ "txqxxtxtx"}, {letter='t', min=9, max=14, password=AsList _ "ttnttttnttttttw"}, {letter='s', min=3, max=6, password=AsList _ "spszzskl"}, {letter='x', min=4, max=9, password=AsList _ "xxxrxvxxkxx"}, {letter='r', min=11, max=14, password=AsList _ "rrrfhrbrjkrrgh"}, {letter='q', min=1, max=9, password=AsList _ "wqqqqqqqqqq"}, {letter='f', min=5, max=14, password=AsList _ "gfdjfdmfmmcgfrffsp"}, {letter='b', min=2, max=4, password=AsList _ "bvcb"}, {letter='c', min=9, max=12, password=AsList _ "ccccnccrcccccccc"}, {letter='s', min=9, max=14, password=AsList _ "ssssssssbgssssss"}, {letter='d', min=15, max=18, password=AsList _ "ddddddcdkdsddddddw"}, {letter='v', min=17, max=18, password=AsList _ "vvvvvvvvvvvvzvvvvbvv"}, {letter='k', min=3, max=7, password=AsList _ "mfkbzqnwhkgkk"}, {letter='p', min=2, max=5, password=AsList _ "cpqpp"}, {letter='r', min=7, max=10, password=AsList _ "frrrrrrrrnrrrrrqrw"}, {letter='h', min=5, max=6, password=AsList _ "fhhhxschhdpbh"}, {letter='k', min=1, max=2, password=AsList _ "kcrkkk"}, {letter='s', min=1, max=5, password=AsList _ "kssssssszsnssssssr"}, {letter='t', min=3, max=4, password=AsList _ "ztct"}, {letter='g', min=1, max=2, password=AsList _ "grkgc"}, {letter='t', min=8, max=9, password=AsList _ "tttctttcttqc"}, {letter='d', min=4, max=9, password=AsList _ "rddvdddddddddd"}, {letter='j', min=5, max=7, password=AsList _ "jjjjjjnj"}, {letter='f', min=4, max=5, password=AsList _ "ffrjd"}, {letter='x', min=14, max=16, password=AsList _ "jqvkmxlxfxbwplhxl"}, {letter='j', min=2, max=13, password=AsList _ "hkqphvkprvmjdfm"}, {letter='b', min=1, max=12, password=AsList _ "bbbbbbbbvbbjvbbbbbs"}, {letter='m', min=4, max=6, password=AsList _ "mmmnmm"}, {letter='q', min=16, max=18, password=AsList _ "rvfzkvqqmddvqfrrpq"}, {letter='c', min=7, max=14, password=AsList _ "czcccccccdpccgsc"}, {letter='z', min=1, max=8, password=AsList _ "zgzfbtzzqp"}, {letter='n', min=7, max=18, password=AsList _ "tzfktnkcpncxcsvxzv"}, {letter='x', min=2, max=3, password=AsList _ "xmxz"}, {letter='q', min=4, max=10, password=AsList _ "qqldqqqqqqql"}, {letter='f', min=2, max=6, password=AsList _ "ffvfpqfftg"}, {letter='c', min=12, max=15, password=AsList _ "cccccccccscxlccc"}, {letter='d', min=3, max=17, password=AsList _ "ddlzddghdddgwdddddd"}, {letter='g', min=11, max=13, password=AsList _ "lglgmqgcmlggbftgggd"}, {letter='q', min=12, max=13, password=AsList _ "ldjqqvqqhbfqn"}, {letter='h', min=4, max=5, password=AsList _ "hhhhp"}, {letter='f', min=9, max=11, password=AsList _ "tfkcfzcqpzfdggbpw"}, {letter='f', min=10, max=13, password=AsList _ "fffffffffkffffff"}, {letter='l', min=2, max=3, password=AsList _ "swln"}, {letter='j', min=6, max=10, password=AsList _ "kqsjnjtjmd"}, {letter='c', min=8, max=12, password=AsList _ "ccccctclccscmcc"}, {letter='r', min=10, max=18, password=AsList _ "rrrrrrrrrjrrjrrrrr"}, {letter='t', min=4, max=7, password=AsList _ "btcxktc"}, {letter='m', min=8, max=19, password=AsList _ "mmmmmmmmmmmmmmmmmmhm"}, {letter='j', min=10, max=12, password=AsList _ "jjjjjjrjjjlj"}, {letter='x', min=1, max=11, password=AsList _ "xlxxxxxxxxxxz"}, {letter='w', min=11, max=17, password=AsList _ "fblmwxqwbfdwlcqww"}, {letter='c', min=4, max=6, password=AsList _ "qchcclc"}, {letter='k', min=3, max=4, password=AsList _ "kkkkkkkbkkr"}, {letter='s', min=4, max=5, password=AsList _ "sssfssssssssw"}, {letter='m', min=4, max=6, password=AsList _ "bvmmvjrlvmzmmtsm"}, {letter='f', min=6, max=14, password=AsList _ "qftmhffffcccffsz"}, {letter='t', min=3, max=4, password=AsList _ "rzthtt"}, {letter='s', min=6, max=19, password=AsList _ "qshpkhjcsssqmzspxss"}, {letter='p', min=3, max=4, password=AsList _ "vshp"}, {letter='w', min=3, max=4, password=AsList _ "zwff"}, {letter='s', min=5, max=7, password=AsList _ "tngctss"}, {letter='g', min=11, max=14, password=AsList _ "bhshgkpgxrgkqwpprwv"}, {letter='t', min=3, max=7, password=AsList _ "ttptttt"}, {letter='q', min=1, max=3, password=AsList _ "qqzqqqvb"}, {letter='r', min=7, max=12, password=AsList _ "kvzjrmrhvxxs"}, {letter='j', min=11, max=12, password=AsList _ "jjjkjjjjjjjz"}, {letter='p', min=10, max=11, password=AsList _ "pppppppppxppp"}, {letter='s', min=1, max=10, password=AsList _ "rsssssssshsss"}, {letter='x', min=4, max=5, password=AsList _ "xxxdcx"}, {letter='n', min=3, max=4, password=AsList _ "fnlnfn"}, {letter='l', min=8, max=9, password=AsList _ "llfflqlfll"}, {letter='z', min=3, max=4, password=AsList _ "hzrz"}, {letter='f', min=15, max=16, password=AsList _ "tdzxfwjvdgsxczff"}, {letter='z', min=12, max=16, password=AsList _ "zzzzzzzvpzzzzzzzzz"}, {letter='f', min=4, max=8, password=AsList _ "fwfwffffqmfkff"}, {letter='z', min=7, max=8, password=AsList _ "zjvzzkzzzxmzz"}, {letter='r', min=7, max=8, password=AsList _ "drrcsrrg"}, {letter='z', min=7, max=8, password=AsList _ "znzzzzbzzz"}, {letter='l', min=7, max=8, password=AsList _ "llllllml"}, {letter='b', min=10, max=11, password=AsList _ "jbbbbbjbbbs"}, {letter='c', min=5, max=12, password=AsList _ "cccccccccccpc"}, {letter='n', min=9, max=13, password=AsList _ "nnnnnnnnpnnnn"}, {letter='q', min=7, max=8, password=AsList _ "rvqqqqhnrqqqjqq"}, {letter='d', min=4, max=8, password=AsList _ "xzqwgncdgqtd"}, {letter='r', min=6, max=7, password=AsList _ "rrrrrmr"}, {letter='q', min=1, max=2, password=AsList _ "rbql"}, {letter='f', min=13, max=14, password=AsList _ "ffkfjffjzqfcnfhshw"}, {letter='m', min=6, max=9, password=AsList _ "mmmhmmkmbmrlrwwmtfl"}, {letter='s', min=5, max=12, password=AsList _ "ssfsmsbwsrzssstsssss"}, {letter='m', min=6, max=14, password=AsList _ "bmpbqmjmqxmnrt"}, {letter='g', min=5, max=7, password=AsList _ "hgwgdntgwgsp"}, {letter='q', min=10, max=15, password=AsList _ "qzqqrbqmqqqqsntqqq"}, {letter='w', min=7, max=10, password=AsList _ "wwwwwwnwwwhz"}, {letter='v', min=5, max=7, password=AsList _ "vvvvrvv"}, {letter='z', min=2, max=3, password=AsList _ "zzzlz"}, {letter='r', min=5, max=9, password=AsList _ "rxqbhdrmr"}, {letter='c', min=10, max=15, password=AsList _ "bchccbcqqcrtcrj"}, {letter='g', min=8, max=10, password=AsList _ "hplggnlnbfpgfxmkgb"}, {letter='p', min=14, max=18, password=AsList _ "pwpqppdpfpppppqpph"}, {letter='t', min=8, max=9, password=AsList _ "ttlgpzmtdkzdrcstztf"}, {letter='l', min=13, max=19, password=AsList _ "slzsflllllwlllllllg"}, {letter='z', min=5, max=6, password=AsList _ "zqcnzz"}, {letter='c', min=11, max=14, password=AsList _ "ccctcccccwckch"}, {letter='v', min=3, max=5, password=AsList _ "vhblvzmvfv"}, {letter='v', min=18, max=19, password=AsList _ "vvvvvvvvbvvvvvvvvmv"}, {letter='g', min=4, max=5, password=AsList _ "gjjwgtlgjtggg"}, {letter='l', min=4, max=5, password=AsList _ "rlnvlvxllg"}, {letter='z', min=2, max=11, password=AsList _ "qzclmjsrfrsbrjtd"}, {letter='w', min=9, max=11, password=AsList _ "gwwwwwwwwsbfrbw"}, {letter='v', min=1, max=2, password=AsList _ "vzvvvvvvvvvvvvvvvvv"}, {letter='b', min=4, max=8, password=AsList _ "bzbpbpbjdfbdbqfz"}, {letter='m', min=10, max=16, password=AsList _ "wxcvdmldmzxvnxmmqb"}, {letter='c', min=4, max=11, password=AsList _ "cljrsmxwvbcx"}, {letter='n', min=12, max=17, password=AsList _ "lwzncwfjpwxbnnhnnpx"}, {letter='k', min=9, max=10, password=AsList _ "vfbbmbxwkd"}, {letter='c', min=17, max=19, password=AsList _ "ccccccccgcccccccccd"}, {letter='h', min=5, max=9, password=AsList _ "vhrhmhvsh"}, {letter='g', min=6, max=10, password=AsList _ "ggfggsggngwgpcgfvz"}, {letter='g', min=4, max=17, password=AsList _ "ccvgdkxzggzbsjvzqq"}, {letter='g', min=8, max=10, password=AsList _ "qggggggzggg"}, {letter='w', min=3, max=4, password=AsList _ "wwvh"}, {letter='r', min=4, max=5, password=AsList _ "gjrfrb"}, {letter='r', min=1, max=5, password=AsList _ "qrrrrrrr"}, {letter='k', min=11, max=15, password=AsList _ "kckkkkpjqmnkcwkkkkq"}, {letter='q', min=3, max=6, password=AsList _ "qwswqq"}, {letter='s', min=4, max=5, password=AsList _ "lsssss"}, {letter='d', min=12, max=13, password=AsList _ "mdwgdddtdfdvr"}, {letter='k', min=1, max=14, password=AsList _ "vkkkkkkkdkkkkkkk"}, {letter='t', min=1, max=6, password=AsList _ "zrgnxtt"}, {letter='d', min=8, max=9, password=AsList _ "kdqdfgndd"}, {letter='z', min=6, max=7, password=AsList _ "pfnzzzzzwjzxg"}, {letter='d', min=2, max=9, password=AsList _ "ddddddddddddkddd"}, {letter='x', min=5, max=7, password=AsList _ "krnfpjx"}, {letter='j', min=4, max=12, password=AsList _ "ksgkjzbqprvjqjxbp"}, {letter='m', min=10, max=11, password=AsList _ "hmzmmmnmmmpmmg"}, {letter='k', min=4, max=8, password=AsList _ "fxmkmppqnlckglvm"}, {letter='x', min=8, max=11, password=AsList _ "xxxxxxtrxxxdxxx"}, {letter='r', min=1, max=10, password=AsList _ "rwcrfrlhrsrhr"}, {letter='m', min=5, max=7, password=AsList _ "mmmmvmm"}, {letter='m', min=7, max=16, password=AsList _ "mmmmmjmhmmqmwmmqvfm"}, {letter='v', min=8, max=13, password=AsList _ "mdmrvvsvvmhcxknc"}, {letter='w', min=5, max=6, password=AsList _ "bwwxnw"}, {letter='g', min=11, max=12, password=AsList _ "ggggggggggwgggg"}, {letter='t', min=9, max=16, password=AsList _ "tgtttgtnttttdtttw"}, {letter='j', min=4, max=7, password=AsList _ "jjjjjvvnjj"}, {letter='p', min=12, max=17, password=AsList _ "vhbprgsmljmpzzhzn"}, {letter='v', min=4, max=13, password=AsList _ "vrcntbdvkvtdvzxnptvb"}, {letter='j', min=1, max=7, password=AsList _ "jjjjjjdjj"}, {letter='c', min=11, max=14, password=AsList _ "cjhcrkhcccccdc"}, {letter='j', min=17, max=18, password=AsList _ "jhjjjjjjjjjqjjjjjvj"}, {letter='m', min=8, max=9, password=AsList _ "jmmkmmmmdmwvmgz"}, {letter='x', min=9, max=12, password=AsList _ "dkxxxhqxxzzpcvcxgkx"}, {letter='m', min=16, max=17, password=AsList _ "mmmmmqmmmmmtmmmfmjm"}, {letter='b', min=3, max=13, password=AsList _ "mbbtrmxlzdpbt"}, {letter='g', min=1, max=5, password=AsList _ "bggggggg"}, {letter='m', min=11, max=19, password=AsList _ "dlgmdsscksdrtmmdpjrq"}, {letter='g', min=1, max=4, password=AsList _ "skgg"}, {letter='l', min=12, max=20, password=AsList _ "jcgnljnllllqftjrvnhl"}, {letter='d', min=2, max=3, password=AsList _ "drbdcl"}, {letter='t', min=2, max=3, password=AsList _ "mtwtt"}, {letter='f', min=8, max=9, password=AsList _ "fxstfnfsfffft"}, {letter='z', min=14, max=16, password=AsList _ "zzzzzzzzzzzzzzzrz"}, {letter='x', min=5, max=8, password=AsList _ "xxxxpxxxxxxt"}, {letter='t', min=10, max=11, password=AsList _ "ttttttttttv"}, {letter='r', min=5, max=16, password=AsList _ "xrwrrrqhhlqkhdlzr"}, {letter='n', min=5, max=7, password=AsList _ "nnnnnnhnnnnnnnnnnnnn"}, {letter='v', min=4, max=6, password=AsList _ "dzwfvxz"}, {letter='c', min=2, max=6, password=AsList _ "cccccccc"}, {letter='j', min=5, max=6, password=AsList _ "jjjpjkjhj"}, {letter='j', min=3, max=11, password=AsList _ "jjhnjjgjjghjjj"}, {letter='s', min=14, max=20, password=AsList _ "zskwnsmpsswctgwshxsm"}, {letter='j', min=1, max=3, password=AsList _ "tjfjj"}, {letter='d', min=2, max=8, password=AsList _ "dsdrssdwqq"}, {letter='j', min=9, max=10, password=AsList _ "rjjjjjjjqjjqjjj"}, {letter='b', min=8, max=10, password=AsList _ "clmwbzzjkb"}, {letter='k', min=4, max=9, password=AsList _ "klkdkkkkvkkkkkk"}, {letter='v', min=8, max=16, password=AsList _ "xvvsvvqqvvjvvvvv"}, {letter='d', min=4, max=5, password=AsList _ "qdrtd"}, {letter='p', min=3, max=4, password=AsList _ "pppt"}, {letter='p', min=4, max=5, password=AsList _ "ppvmp"}, {letter='g', min=5, max=13, password=AsList _ "sggmnggwtggmqggkg"}, {letter='g', min=9, max=17, password=AsList _ "ggcgggntdgjmgtgxg"}, {letter='q', min=12, max=13, password=AsList _ "jqqqqqqqqzqqqqq"}, {letter='v', min=2, max=3, password=AsList _ "tbvzcmzvn"}, {letter='m', min=1, max=5, password=AsList _ "vnmwtww"}, {letter='r', min=5, max=6, password=AsList _ "rrhkrs"}, {letter='c', min=14, max=15, password=AsList _ "cccchccccccccct"}, {letter='m', min=15, max=17, password=AsList _ "mmmmmmzmmmmmmmhmm"}, {letter='k', min=5, max=10, password=AsList _ "kqkkkkkkkkkkkkkkkkk"}, {letter='z', min=17, max=19, password=AsList _ "gxpjhhktxrlwwgqzlxzx"}, {letter='s', min=3, max=7, password=AsList _ "wsbssvscgss"}, {letter='k', min=3, max=5, password=AsList _ "kkkkf"}, {letter='m', min=4, max=7, password=AsList _ "jmmmgmbmmmv"}, {letter='p', min=2, max=7, password=AsList _ "vpchdqpxxwjpwdgr"}, {letter='w', min=3, max=6, password=AsList _ "wwwxwwdww"}, {letter='h', min=11, max=17, password=AsList _ "hhhhhhhhhhhhhhhhb"}, {letter='w', min=1, max=5, password=AsList _ "zwwwwwwwwwwwwwgw"}, {letter='m', min=2, max=5, password=AsList _ "mlmmmmk"}, {letter='p', min=10, max=11, password=AsList _ "nptppbpplpd"}, {letter='m', min=2, max=8, password=AsList _ "xcmsbqms"}, {letter='w', min=7, max=13, password=AsList _ "wjvwrwwwlxnsnw"}, {letter='r', min=3, max=9, password=AsList _ "rrrrrrrrv"}, {letter='t', min=2, max=4, password=AsList _ "nttw"}, {letter='q', min=17, max=18, password=AsList _ "ptqqpqrcrgqqqlqqmq"}, {letter='h', min=6, max=7, password=AsList _ "jhxhkchjhhrhh"}, {letter='n', min=8, max=11, password=AsList _ "nnbnnnnnnppgnnlnhbq"}, {letter='g', min=15, max=18, password=AsList _ "gggqggrsggzggggdggg"}, {letter='n', min=5, max=9, password=AsList _ "ptcnnjrnfnn"}, {letter='h', min=9, max=15, password=AsList _ "hshwhbhhxhzhhhhhw"}, {letter='x', min=1, max=3, password=AsList _ "fxxxx"}, {letter='z', min=3, max=6, password=AsList _ "zzpzqzzzqzzzzzznzzwz"}, {letter='p', min=10, max=11, password=AsList _ "lllpqpqvpppprppppp"}, {letter='n', min=13, max=15, password=AsList _ "mnnnnnnntqcpdnn"}, {letter='g', min=14, max=19, password=AsList _ "ggggggggggggggggggrg"}, {letter='w', min=3, max=11, password=AsList _ "qtlpkwswvwwww"}, {letter='g', min=3, max=8, password=AsList _ "lwgzgzml"}, {letter='w', min=1, max=4, password=AsList _ "wwsw"}, {letter='q', min=14, max=19, password=AsList _ "zcxqpjgxqfqqqqvjmklq"}, {letter='h', min=4, max=5, password=AsList _ "hrxkh"}, {letter='p', min=9, max=12, password=AsList _ "ppppgpppppppppp"}, {letter='t', min=8, max=11, password=AsList _ "pwgtdxrtwtbskjnq"}, {letter='m', min=2, max=4, password=AsList _ "pcdmkmlpwwxqw"}, {letter='r', min=1, max=4, password=AsList _ "rrrxrr"}, {letter='l', min=8, max=9, password=AsList _ "lllllwlbl"}, {letter='p', min=8, max=9, password=AsList _ "pppppppfp"}, {letter='x', min=4, max=5, password=AsList _ "jdxxs"}, {letter='h', min=3, max=5, password=AsList _ "hvwth"}, {letter='z', min=7, max=14, password=AsList _ "xkqhzztwjzzsgz"}, {letter='b', min=7, max=11, password=AsList _ "bbwbbbcbbbbb"}, {letter='f', min=2, max=4, password=AsList _ "fflf"}, {letter='m', min=4, max=9, password=AsList _ "cmmmqlmmlxmgmmmmtmpm"}, {letter='j', min=3, max=18, password=AsList _ "bnjznmljlhpfhcmnpcj"}, {letter='z', min=7, max=9, password=AsList _ "zzxzvcbzzzz"}, {letter='s', min=14, max=15, password=AsList _ "ssmssssssslssszss"}, {letter='v', min=12, max=19, password=AsList _ "vgvvvvnvsvvrzvrvvvv"}, {letter='q', min=8, max=10, password=AsList _ "qqqqcpqqqnqqqk"}, {letter='p', min=11, max=14, password=AsList _ "zzvpwltfptcszpv"}, {letter='h', min=2, max=9, password=AsList _ "khpnvdcvdh"}, {letter='q', min=8, max=12, password=AsList _ "dqqqqqqlqqqqqq"}, {letter='f', min=2, max=17, password=AsList _ "fffffffffgfgjfffxtt"}, {letter='n', min=1, max=8, password=AsList _ "jnnnnrnn"}, {letter='k', min=7, max=8, password=AsList _ "kkkhmkkdkkkk"}, {letter='j', min=10, max=11, password=AsList _ "xjwmjcjjqrpjvlbjj"}, {letter='v', min=3, max=4, password=AsList _ "vrvc"}, {letter='r', min=4, max=9, password=AsList _ "dprrlbbrsrgqzvkc"}, {letter='w', min=4, max=8, password=AsList _ "wrcwgsqghwwjw"}, {letter='r', min=11, max=12, password=AsList _ "rrzrrrrrrrrrf"}, {letter='c', min=4, max=5, password=AsList _ "rzccmcc"}, {letter='w', min=1, max=8, password=AsList _ "wqwvwcwtwww"}, {letter='f', min=7, max=9, password=AsList _ "hjfpvgffllfsfsft"}, {letter='d', min=1, max=3, password=AsList _ "nddd"}, {letter='c', min=12, max=13, password=AsList _ "ccccbccsccbbcccpcc"}, {letter='d', min=1, max=11, password=AsList _ "xdhddwddjdg"}, {letter='c', min=3, max=5, password=AsList _ "ccvcc"}, {letter='d', min=2, max=6, password=AsList _ "djddddfd"}, {letter='z', min=4, max=5, password=AsList _ "kzqszztpzz"}, {letter='s', min=2, max=5, password=AsList _ "ssssz"}, {letter='g', min=2, max=6, password=AsList _ "gdvjggrx"}, {letter='k', min=9, max=11, password=AsList _ "qzklmckckkmkkk"}, {letter='g', min=5, max=6, password=AsList _ "grjpwv"}, {letter='n', min=8, max=12, password=AsList _ "nnnnnnngnnnnnnn"}, {letter='z', min=15, max=19, password=AsList _ "zzzzzlmmczdzztgmzvzp"}, {letter='p', min=4, max=5, password=AsList _ "pprvpmpdwppbqpmpw"}, {letter='q', min=9, max=15, password=AsList _ "lfqrxjvdqnlqqtqgnqn"}, {letter='w', min=1, max=4, password=AsList _ "pwwww"}, {letter='q', min=1, max=9, password=AsList _ "qvqqqgqqfqnq"}, {letter='k', min=2, max=4, password=AsList _ "rwlkkcqxcrwd"}, {letter='q', min=2, max=12, password=AsList _ "qqdlpwqqftgjb"}, {letter='q', min=5, max=7, password=AsList _ "qqqtlfq"}, {letter='g', min=8, max=9, password=AsList _ "ggggggrgvtgg"}, {letter='l', min=6, max=13, password=AsList _ "llllllllllllklll"}, {letter='h', min=1, max=4, password=AsList _ "dhhhn"}, {letter='f', min=5, max=6, password=AsList _ "ffjjsfft"}, {letter='x', min=11, max=12, password=AsList _ "xxcxxxxxvxxxxx"}, {letter='z', min=5, max=7, password=AsList _ "zzzwzfh"}, {letter='d', min=12, max=14, password=AsList _ "vpblrhxdwrgdvkg"}, {letter='n', min=1, max=3, password=AsList _ "xwrjrjdj"}, {letter='z', min=8, max=9, password=AsList _ "zzzzdpzzghbzzzzwz"}, {letter='p', min=15, max=16, password=AsList _ "pppppppppppppppw"}, {letter='r', min=4, max=12, password=AsList _ "rrrvrrrrrrrrr"}, {letter='d', min=8, max=9, password=AsList _ "dddddddndd"}, {letter='l', min=4, max=10, password=AsList _ "llsfllllllll"}, {letter='z', min=2, max=13, password=AsList _ "kzkctzprbpkkd"}, {letter='c', min=2, max=4, password=AsList _ "qvcccd"}, {letter='q', min=6, max=7, password=AsList _ "qqqrqqfqdq"}, {letter='f', min=11, max=13, password=AsList _ "ffhffggfffgbf"}, {letter='r', min=9, max=19, password=AsList _ "wncrtrxrrrjhjcvtvsbt"}, {letter='h', min=9, max=11, password=AsList _ "hhhhhhhhlhh"}, {letter='s', min=8, max=10, password=AsList _ "ggwhksdslsp"}, {letter='h', min=3, max=13, password=AsList _ "hhhhhhhhhhhhfhhh"}, {letter='h', min=6, max=7, password=AsList _ "hwghlnh"}, {letter='r', min=7, max=10, password=AsList _ "rrrrrrjrrrr"}, {letter='f', min=9, max=10, password=AsList _ "fbjfbfffff"}, {letter='b', min=16, max=17, password=AsList _ "bbbbbbbbfbbbbbbjbbb"}, {letter='t', min=13, max=16, password=AsList _ "tttttttttttttttz"}, {letter='s', min=2, max=3, password=AsList _ "ssrsssjssss"}, {letter='b', min=1, max=3, password=AsList _ "sbbbbk"}, {letter='q', min=1, max=5, password=AsList _ "xcdbqqqdjxs"}, {letter='p', min=10, max=12, password=AsList _ "jppvpstpjjpp"}, {letter='b', min=8, max=15, password=AsList _ "bglbkmhbqbgfzfh"}, {letter='x', min=1, max=6, password=AsList _ "xxxxxfx"}, {letter='w', min=14, max=18, password=AsList _ "mwwwhtwjshwbvwrjrn"}, {letter='w', min=1, max=2, password=AsList _ "wtww"}, {letter='h', min=2, max=7, password=AsList _ "pxhntbg"}, {letter='c', min=2, max=7, password=AsList _ "ccccccs"}, {letter='z', min=2, max=5, password=AsList _ "zzzzczz"}, {letter='n', min=3, max=5, password=AsList _ "tggvn"}, {letter='h', min=13, max=14, password=AsList _ "hfhhhmthvhhwhdhhhhh"}, {letter='n', min=11, max=16, password=AsList _ "nnnnznnpnnlknnnn"}, {letter='d', min=2, max=6, password=AsList _ "dkdddddd"}, {letter='g', min=12, max=15, password=AsList _ "gxbgggggggbnggg"}, {letter='c', min=1, max=3, password=AsList _ "scxccc"}, {letter='w', min=5, max=6, password=AsList _ "wwwwwfwww"}, {letter='z', min=12, max=13, password=AsList _ "zzzzzzzzzzzczz"}, {letter='j', min=6, max=9, password=AsList _ "psjjmjrxjnrwxzjjnnf"}, {letter='h', min=15, max=16, password=AsList _ "hhhhhhhthhvhhhkhh"}, {letter='n', min=4, max=5, password=AsList _ "nnnnj"}, {letter='g', min=11, max=12, password=AsList _ "gqggdgggggggrgggm"}, {letter='n', min=2, max=5, password=AsList _ "mqnlthrtjnr"}, {letter='n', min=11, max=13, password=AsList _ "nnnnnnnnvnnnx"}, {letter='b', min=2, max=4, password=AsList _ "xbbr"}, {letter='j', min=2, max=7, password=AsList _ "rzjshrj"}, {letter='b', min=18, max=20, password=AsList _ "gzcxrqfqmlbqmvrttbbp"}, {letter='h', min=10, max=13, password=AsList _ "hhhhkhhhhrhhh"}, {letter='n', min=5, max=6, password=AsList _ "mkjnnnqbdpznlndnnd"}, {letter='w', min=5, max=6, password=AsList _ "wwwdqww"}, {letter='v', min=15, max=19, password=AsList _ "vvvvvxvvvvvvvvzvvvv"}, {letter='b', min=2, max=3, password=AsList _ "wlbhwdjwtncwpkbxvhc"}, {letter='f', min=4, max=5, password=AsList _ "ffrrf"}, {letter='v', min=15, max=16, password=AsList _ "vhvpvpvvvmckvbkvvvv"}, {letter='m', min=2, max=6, password=AsList _ "mmbnrsq"}, {letter='r', min=6, max=7, password=AsList _ "rlrqgrj"}, {letter='c', min=7, max=12, password=AsList _ "ccccccsccccmcc"}, {letter='g', min=1, max=9, password=AsList _ "kggggggglg"}, {letter='f', min=4, max=9, password=AsList _ "frfffffnfzfcfff"}, {letter='g', min=2, max=3, password=AsList _ "gcspt"}, {letter='v', min=8, max=14, password=AsList _ "dvkpxqztcqttvv"}, {letter='r', min=5, max=11, password=AsList _ "rrrrtrrrrrrrrrrrr"}, {letter='c', min=4, max=15, password=AsList _ "jdrnrvqrzckbrxmzsgl"}, {letter='t', min=3, max=5, password=AsList _ "dkttc"}, {letter='j', min=4, max=11, password=AsList _ "ppjjwjjtdjt"}, {letter='k', min=7, max=9, password=AsList _ "kkkkkkkkm"}, {letter='p', min=1, max=4, password=AsList _ "lcpp"}, {letter='w', min=3, max=6, password=AsList _ "wwwwwvw"}, {letter='h', min=3, max=13, password=AsList _ "ghhlhhhhhbhgt"}, {letter='f', min=5, max=6, password=AsList _ "ffzvft"}, {letter='p', min=1, max=2, password=AsList _ "bppp"}, {letter='m', min=6, max=12, password=AsList _ "lnnfbnmdrngmpt"}, {letter='n', min=7, max=8, password=AsList _ "blfngnngnnnn"}, {letter='s', min=5, max=8, password=AsList _ "ssssssss"}, {letter='d', min=2, max=8, password=AsList _ "ddddddds"}, {letter='x', min=6, max=11, password=AsList _ "gxnxbfxcrkjxxxhx"}, {letter='m', min=9, max=10, password=AsList _ "wzfmmmvmtfrmm"}, {letter='n', min=5, max=11, password=AsList _ "xgkpshnxwnn"}, {letter='z', min=14, max=18, password=AsList _ "ztzczzzznzzzzzzzvz"}, {letter='k', min=5, max=7, password=AsList _ "kgkkkks"}, {letter='z', min=10, max=11, password=AsList _ "zvglzzxvqzpdj"}, {letter='z', min=1, max=16, password=AsList _ "rdhsbnvmpfqpzmrzw"}, {letter='m', min=13, max=14, password=AsList _ "mmmmmmmmmmmmmxm"}, {letter='n', min=12, max=16, password=AsList _ "fsmnddnmkmjnkncn"}, {letter='l', min=2, max=5, password=AsList _ "mqlllmgb"}, {letter='k', min=2, max=4, password=AsList _ "xgmthfprbsk"}, {letter='q', min=2, max=4, password=AsList _ "qssq"}, {letter='r', min=12, max=13, password=AsList _ "rrrrrrrrrrrrq"}, {letter='v', min=1, max=19, password=AsList _ "vzdtngrnnvmnpzvbmwvg"}, {letter='m', min=7, max=11, password=AsList _ "lrjmsvmmmsjjmw"}, {letter='r', min=4, max=7, password=AsList _ "rxrbfzrtvrhdq"}, {letter='t', min=1, max=4, password=AsList _ "ltttttttt"}, {letter='k', min=5, max=16, password=AsList _ "cktfdzrxppmkjfhk"}, {letter='f', min=5, max=9, password=AsList _ "qfsfcfbtfl"}, {letter='p', min=2, max=7, password=AsList _ "pvtkpppmppppd"}, {letter='v', min=2, max=7, password=AsList _ "jkrmnjv"}, {letter='n', min=2, max=4, password=AsList _ "qnjhnnnnfnnk"}, {letter='n', min=2, max=3, password=AsList _ "ndvp"}, {letter='g', min=1, max=3, password=AsList _ "ggdgg"}, {letter='r', min=16, max=17, password=AsList _ "rrrrrbtrqrrrrrrvrrr"}, {letter='r', min=8, max=10, password=AsList _ "rbkprrrmvr"}, {letter='j', min=6, max=12, password=AsList _ "hqjwbjxjwjmjjqjhn"}, {letter='r', min=16, max=17, password=AsList _ "rzrrrrrkrrrrrrrvrrr"}, {letter='d', min=5, max=8, password=AsList _ "ddddldhdhd"}, {letter='g', min=9, max=20, password=AsList _ "ggggghgggggcggggglgq"}, {letter='c', min=7, max=9, password=AsList _ "rgmkcfctjpdccdwvtfcc"}, {letter='w', min=2, max=12, password=AsList _ "wwwswtswhwhbdww"}, {letter='t', min=4, max=10, password=AsList _ "ttdttttftt"}, {letter='g', min=2, max=9, password=AsList _ "svtkbzggg"}, {letter='r', min=4, max=7, password=AsList _ "rqrwrcwrqrr"}, {letter='s', min=9, max=15, password=AsList _ "dsssrzsksmswwsljbbs"}, {letter='d', min=5, max=13, password=AsList _ "dddhvdxhdrhddrd"}, {letter='s', min=11, max=19, password=AsList _ "zdssvpmlqxqjbsssckp"}, {letter='w', min=2, max=6, password=AsList _ "swcnwz"}, {letter='n', min=17, max=18, password=AsList _ "nnnnnnnnnnnsnnnnnlcn"}, {letter='t', min=6, max=7, password=AsList _ "tzzrcht"}, {letter='k', min=4, max=10, password=AsList _ "bdckkrckkzk"}, {letter='h', min=3, max=9, password=AsList _ "nrdrdvhhhh"}, {letter='s', min=1, max=4, password=AsList _ "gssss"}, {letter='h', min=3, max=15, password=AsList _ "jhhhtzmpvbhhjhck"}, {letter='g', min=3, max=5, password=AsList _ "xlgzfg"}, {letter='j', min=7, max=11, password=AsList _ "pmwflgjwjjrkl"}, {letter='j', min=6, max=18, password=AsList _ "jjjjjjjjjjjjjjjjjt"}, {letter='k', min=6, max=11, password=AsList _ "kkkkkskkkkkkvk"}, {letter='l', min=4, max=15, password=AsList _ "llllllllldlllllllll"}, {letter='w', min=5, max=6, password=AsList _ "rwtwfwg"}, {letter='x', min=1, max=11, password=AsList _ "xxxgxxxxxxx"}, {letter='v', min=2, max=7, password=AsList _ "vsgvvcvvv"}, {letter='r', min=12, max=14, password=AsList _ "rrgrrrrrprrjrrr"}, {letter='f', min=9, max=10, password=AsList _ "mclwdbqffzcsxqr"}, {letter='v', min=6, max=7, password=AsList _ "vvkvvvv"}, {letter='c', min=2, max=4, password=AsList _ "cczch"}, {letter='c', min=6, max=10, password=AsList _ "hcqccmccscccrck"}, {letter='v', min=1, max=4, password=AsList _ "vvvh"}, {letter='s', min=6, max=12, password=AsList _ "nwfjghlpqsks"}, {letter='p', min=4, max=5, password=AsList _ "hpcpt"}, {letter='d', min=6, max=11, password=AsList _ "rdbgvdggzsj"}, {letter='d', min=2, max=4, password=AsList _ "dddmdxx"}, {letter='n', min=1, max=14, password=AsList _ "gnnnsnpfnnnbvnnj"}, {letter='q', min=2, max=4, password=AsList _ "ckhqmjqqq"}, {letter='w', min=2, max=7, password=AsList _ "vwpmwnp"}, {letter='w', min=3, max=5, password=AsList _ "pnwwb"}, {letter='k', min=8, max=12, password=AsList _ "kckkkkkknkkkkkp"}, {letter='c', min=5, max=8, password=AsList _ "cccctcccccfcc"}, {letter='n', min=13, max=14, password=AsList _ "qnnnnmlnnwhnnx"}, {letter='f', min=3, max=4, password=AsList _ "qffb"}, {letter='w', min=11, max=12, password=AsList _ "rwwwwwwwwwjpw"}, {letter='b', min=6, max=11, password=AsList _ "pxgbbbcbbzbfbb"}, {letter='m', min=12, max=14, password=AsList _ "mmmmmmmmmmmvmmmmm"}, {letter='p', min=5, max=13, password=AsList _ "ppppxppppppppqpphh"}, {letter='l', min=5, max=10, password=AsList _ "llllwllllgll"}, {letter='c', min=1, max=8, password=AsList _ "ccfzcczscvjcc"}, {letter='m', min=2, max=4, password=AsList _ "cmlrm"}, {letter='j', min=4, max=7, password=AsList _ "szjkflj"}, {letter='p', min=6, max=9, password=AsList _ "cjnppqpsppppjpdbhpf"}, {letter='k', min=11, max=12, password=AsList _ "kkkjkkkkdkrkg"}, {letter='j', min=4, max=15, password=AsList _ "jjjqjjjjjjjjdxcjjjj"}, {letter='d', min=4, max=5, password=AsList _ "dddddd"}, {letter='l', min=4, max=5, password=AsList _ "hjlllqdwvl"}, {letter='r', min=12, max=14, password=AsList _ "rrmrrrrqrlrxrr"}, {letter='c', min=7, max=8, password=AsList _ "nbzxczcn"}, {letter='l', min=8, max=9, password=AsList _ "pgmlwccjlrg"}, {letter='z', min=6, max=8, password=AsList _ "zzzzzzbzzj"}, {letter='r', min=1, max=8, password=AsList _ "mrrrrrrrrrf"}, {letter='w', min=1, max=3, password=AsList _ "wwww"}, {letter='d', min=5, max=6, password=AsList _ "qldxdsdk"}, {letter='h', min=3, max=14, password=AsList _ "hfdhhhhhhhhhhshhh"}, {letter='q', min=9, max=10, password=AsList _ "lbvqvwfvnkmth"}, {letter='v', min=7, max=10, password=AsList _ "lvdvwnvvnvt"}, {letter='q', min=2, max=3, password=AsList _ "qqspq"}, {letter='m', min=10, max=13, password=AsList _ "mmmmmmmlmmmmcmmmm"}, {letter='w', min=4, max=6, password=AsList _ "wwwwwlw"}, {letter='h', min=1, max=9, password=AsList _ "jkkhqlhhd"}, {letter='x', min=6, max=8, password=AsList _ "xxxxxxxx"}, {letter='b', min=13, max=16, password=AsList _ "bbbbbbbbbbbbbbbs"}, {letter='m', min=17, max=18, password=AsList _ "lmmmspmmkmzmdmstvms"}, {letter='g', min=1, max=5, password=AsList _ "ncgnggglggrgggrh"}, {letter='t', min=2, max=6, password=AsList _ "sxjbjt"}, {letter='k', min=5, max=7, password=AsList _ "ktkkkkvk"}, {letter='k', min=7, max=8, password=AsList _ "kxkzkkkkks"}, {letter='p', min=7, max=11, password=AsList _ "jvrfhrjpspt"}, {letter='k', min=5, max=7, password=AsList _ "kkkkkkpk"}, {letter='h', min=3, max=6, password=AsList _ "qhthhhshhhxhhhh"}, {letter='l', min=1, max=6, password=AsList _ "llllzq"}, {letter='k', min=2, max=4, password=AsList _ "bhqk"}, {letter='m', min=2, max=3, password=AsList _ "tkfm"}, {letter='m', min=4, max=14, password=AsList _ "mlzmmxjjphrcmcn"}, {letter='w', min=15, max=19, password=AsList _ "wqwwwwwwwwwwwwfwwwlw"}, {letter='k', min=11, max=13, password=AsList _ "wzskknsplzkkpnkmk"}, {letter='g', min=3, max=4, password=AsList _ "gdgn"}, {letter='b', min=1, max=4, password=AsList _ "psdbbbbkntx"}, {letter='d', min=12, max=13, password=AsList _ "wdddddlddddfdd"}, {letter='d', min=4, max=5, password=AsList _ "dddjwdf"}, {letter='n', min=14, max=18, password=AsList _ "ntnsnnnnknrnnxnqnn"}, {letter='v', min=1, max=8, password=AsList _ "vvvvvvvtvvv"}, {letter='s', min=13, max=14, password=AsList _ "shwnbsssjwssss"}, {letter='g', min=3, max=6, password=AsList _ "dgglgfzzg"}, {letter='f', min=2, max=5, password=AsList _ "ffffmfff"}, {letter='t', min=8, max=15, password=AsList _ "dtxltcttwtttttt"}, {letter='z', min=9, max=14, password=AsList _ "zzzzzzzzzzzzznzz"}, {letter='w', min=6, max=10, password=AsList _ "swwwwwwwwbww"}, {letter='j', min=4, max=10, password=AsList _ "tqxwnppjxjbzrjppm"}, {letter='b', min=3, max=4, password=AsList _ "slbdt"}, {letter='d', min=3, max=7, password=AsList _ "bdsmhtr"}, {letter='z', min=10, max=19, password=AsList _ "gznrnzzzzzvkztzznzbl"}, {letter='t', min=8, max=12, password=AsList _ "whtztgtwtttt"}, {letter='r', min=3, max=9, password=AsList _ "rfccdfmnrpj"}, {letter='m', min=6, max=7, password=AsList _ "qhmmmpm"}, {letter='q', min=12, max=15, password=AsList _ "zrnwqblrdqlqjrlptg"}, {letter='c', min=6, max=10, password=AsList _ "ccccckccccccc"}, {letter='r', min=15, max=17, password=AsList _ "rrrrrrrrrrrrrrrrhr"}, {letter='g', min=3, max=11, password=AsList _ "ggggggggkgjgg"}, {letter='b', min=6, max=7, password=AsList _ "mxjzshbgsdjcwsbjchgk"}, {letter='h', min=10, max=11, password=AsList _ "hchghhhhhgh"}, {letter='d', min=4, max=6, password=AsList _ "qvdddctdd"}, {letter='b', min=2, max=5, password=AsList _ "qqpzfl"}, {letter='z', min=7, max=8, password=AsList _ "zztgzzzh"}, {letter='h', min=6, max=8, password=AsList _ "zmschbhh"}, {letter='b', min=7, max=15, password=AsList _ "wbbbjpbcbjbbrshp"}, {letter='n', min=1, max=10, password=AsList _ "ccnnznfnjd"}, {letter='s', min=7, max=8, password=AsList _ "snjqvsss"}, {letter='d', min=8, max=16, password=AsList _ "ddddddddddkddddcddd"}, {letter='t', min=8, max=17, password=AsList _ "tjtrttlttrtptctjr"}, {letter='d', min=5, max=7, password=AsList _ "ddddkddd"}, {letter='k', min=5, max=6, password=AsList _ "kkgkks"}, {letter='c', min=6, max=14, password=AsList _ "szcskczcftcctk"}, {letter='b', min=2, max=3, password=AsList _ "zblpbt"}, {letter='f', min=12, max=13, password=AsList _ "grpkpffxfftsf"}, {letter='s', min=6, max=14, password=AsList _ "sssssssssssssws"}, {letter='t', min=13, max=16, password=AsList _ "ttmmfcthmtcmttpn"}, {letter='h', min=1, max=4, password=AsList _ "zrhhs"}, {letter='k', min=2, max=3, password=AsList _ "krgk"}, {letter='l', min=3, max=4, password=AsList _ "lllv"}, {letter='z', min=8, max=9, password=AsList _ "zdbzzzzrzzz"}, {letter='g', min=7, max=8, password=AsList _ "njlrzggqjgg"}, {letter='c', min=4, max=5, password=AsList _ "dpcqc"}, {letter='n', min=4, max=6, password=AsList _ "nnnhnnn"}, {letter='l', min=3, max=4, password=AsList _ "lllq"}, {letter='v', min=5, max=7, password=AsList _ "jbvvvphvwnhkmjrbhcsn"}, {letter='d', min=12, max=14, password=AsList _ "kvbwfkjzdcpcjd"}, {letter='h', min=9, max=12, password=AsList _ "hrhhhhhhxhhhhhh"}, {letter='f', min=5, max=7, password=AsList _ "tffvfngffkhfff"}, {letter='v', min=2, max=7, password=AsList _ "vvvvvvhvvvvvvvvv"}, {letter='v', min=7, max=9, password=AsList _ "rcdhfnlhmwsgrzqz"}, {letter='j', min=9, max=11, password=AsList _ "pfgzjbrbmjj"}, {letter='j', min=6, max=7, password=AsList _ "ldxbbjnrjj"}, {letter='d', min=8, max=14, password=AsList _ "kdddsdqdvddqcckr"}, {letter='l', min=3, max=12, password=AsList _ "fxknndgbgdllkpzx"}, {letter='f', min=2, max=9, password=AsList _ "xffbmfnfffpqf"}, {letter='t', min=9, max=12, password=AsList _ "lttzwtgtktttkjct"}, {letter='s', min=2, max=11, password=AsList _ "zsxrcxtqwmv"}, {letter='s', min=5, max=8, password=AsList _ "ssdsspscsb"}, {letter='r', min=4, max=13, password=AsList _ "shdxtlrmzqlrrwtdnpwx"}, {letter='j', min=12, max=14, password=AsList _ "jjjlzzcvjjjvjjz"}, {letter='s', min=2, max=4, password=AsList _ "ssvsc"}, {letter='q', min=4, max=6, password=AsList _ "qkqkqqqqkq"}, {letter='z', min=9, max=11, password=AsList _ "czzmzwzbbhz"}, {letter='x', min=11, max=12, password=AsList _ "xxxxxxlxxxxpxxx"}, {letter='x', min=7, max=13, password=AsList _ "xxxxhxxxxxxxxxx"}, {letter='g', min=2, max=4, password=AsList _ "wggq"}, {letter='v', min=2, max=6, password=AsList _ "zvxpnqvqwpmbfwnrl"}, {letter='m', min=5, max=6, password=AsList _ "mmmmmc"}, {letter='v', min=1, max=4, password=AsList _ "vvccm"}, {letter='n', min=14, max=16, password=AsList _ "nngdnnnnnntxnwnn"}, {letter='q', min=6, max=14, password=AsList _ "qfdqszrcvfwcqj"}, {letter='z', min=13, max=14, password=AsList _ "zznzzszzzzzzdfz"}, {letter='p', min=2, max=4, password=AsList _ "cppp"}, {letter='q', min=3, max=7, password=AsList _ "qftqqdvh"}, {letter='t', min=4, max=6, password=AsList _ "rrqsftttxs"}, {letter='z', min=1, max=2, password=AsList _ "zzlzsz"}, {letter='g', min=3, max=4, password=AsList _ "vsbg"}, {letter='j', min=5, max=6, password=AsList _ "tzljjh"}, {letter='v', min=1, max=2, password=AsList _ "vptfbrwgvztwp"}, {letter='w', min=2, max=6, password=AsList _ "hqtnzw"}, {letter='f', min=8, max=9, password=AsList _ "ffdffhcxf"}, {letter='d', min=1, max=2, password=AsList _ "dbddddd"}, {letter='f', min=12, max=14, password=AsList _ "fffffffffsfffpff"}, {letter='t', min=12, max=13, password=AsList _ "ftwtgttttxxtbtwttt"}, {letter='k', min=6, max=8, password=AsList _ "qvpkkmkkk"}, {letter='b', min=2, max=9, password=AsList _ "tvjntzdbgmdbbbljwbmb"}, {letter='v', min=1, max=4, password=AsList _ "vfvvvc"}, {letter='v', min=8, max=12, password=AsList _ "vvvvvvvvvvvbv"}, {letter='n', min=2, max=4, password=AsList _ "wncnxnmch"}, {letter='t', min=10, max=12, password=AsList _ "tttqxrtttttvjrc"}, {letter='f', min=11, max=14, password=AsList _ "fffffffffffffpf"}, {letter='h', min=16, max=20, password=AsList _ "hhhjthhhtphchpkhmhhh"}, {letter='m', min=4, max=5, password=AsList _ "zzmml"}, {letter='c', min=6, max=7, password=AsList _ "ccccdcnclkccccck"}, {letter='c', min=15, max=17, password=AsList _ "sxzcbfcntlgccwckcd"}, {letter='t', min=9, max=17, password=AsList _ "mkfttrtvtwdsxxttf"}, {letter='t', min=2, max=3, password=AsList _ "dtzt"}, {letter='z', min=4, max=5, password=AsList _ "zzzbz"}, {letter='f', min=12, max=17, password=AsList _ "zcfftrnfwvfhnvfffsdf"}, {letter='f', min=7, max=16, password=AsList _ "ffdfxxtwffvdffjff"}, {letter='r', min=3, max=5, password=AsList _ "rrxrr"}, {letter='b', min=13, max=14, password=AsList _ "kbwbbbvbbmbwbb"}, {letter='f', min=10, max=15, password=AsList _ "zflnbhfqmhfsqnf"}, {letter='p', min=3, max=5, password=AsList _ "fwpptwzppkbhp"}, {letter='k', min=13, max=14, password=AsList _ "kkkkkkkkbkkkjkk"}, {letter='b', min=7, max=11, password=AsList _ "hqdbtbbhpht"}, {letter='f', min=1, max=6, password=AsList _ "tffffff"}, {letter='d', min=1, max=2, password=AsList _ "bddsrd"}, {letter='m', min=13, max=18, password=AsList _ "mmmmmmmmmmmmxmmmmlmm"}, {letter='x', min=3, max=4, password=AsList _ "xxkx"}, {letter='z', min=4, max=13, password=AsList _ "hzmwzszzzzlhzzxknb"}, {letter='h', min=10, max=15, password=AsList _ "hhhhhchhhbhbhhhhhk"}, {letter='h', min=3, max=4, password=AsList _ "vhhhb"}, {letter='z', min=10, max=11, password=AsList _ "zxwzzzzzllvzzzzmz"}, {letter='h', min=7, max=10, password=AsList _ "phdkrrhkmhh"}, {letter='j', min=2, max=11, password=AsList _ "jjjjjjjjjjtzjjjjg"}, {letter='g', min=3, max=4, password=AsList _ "gxfgggg"}, {letter='f', min=1, max=3, password=AsList _ "fwtdf"}, {letter='d', min=8, max=9, password=AsList _ "bjqxpvzdddx"}, {letter='c', min=7, max=15, password=AsList _ "vcccccccccccccccc"}, {letter='n', min=1, max=7, password=AsList _ "tvnpzhn"}, {letter='v', min=1, max=2, password=AsList _ "ktvv"}, {letter='g', min=2, max=3, password=AsList _ "gpggg"}, {letter='d', min=7, max=13, password=AsList _ "fddcdfgvbmpdd"}, {letter='s', min=4, max=5, password=AsList _ "rsssw"}, {letter='c', min=2, max=14, password=AsList _ "jckbwnnlkcmvnwtj"}] | |
'#### Record & length erased lists | |
We used `{letter='p', min=2, max=4, password=AsList _ "vpkpp"}` | |
to represent a rule + password. | |
The `{a=1, b=2}` gives us a record type. | |
`"abc"` in dex would become a `['a', 'b', 'c']` which is a fixed length table (array) with the length stored in the type) | |
in particular it would be a `Fin 4=>Char`. | |
But the password all have different lengths. | |
And dex requires tables to have homogeneous types. | |
So we use `AsList n x` to convert a table `x` of length `n` into a `List`. | |
And we can avoid passing in the `n` and pass in `_` which will make type inference work it out. | |
We will do the ame thing in reverse to use pattern matching to give us back an table to work with. | |
def countUses (d:Eq a) ?=> (needle:a) (haystack:n=>a) : Int = | |
fold 0 \x net. net + (BToI (haystack.x==needle)) | |
:p countUses 'a' "abcaba" | |
dat = {letter='p', min=2, max=4, password=AsList _ "vpkpp"} | |
-- Lens accessor | |
:p getAt #letter dat | |
-- Patter Matching, both to destructure the record and to get a normal table out of the list | |
{letter=letter, min=imin, max=imax , password=(AsList _ password_str)} = dat | |
:p letter | |
:p password_str | |
uses = countUses letter password_str | |
:p imin < uses && uses < imax | |
:t dat | |
def followsRule (dat:{letter: Char & max: Int32 & min: Int32 & password: List Char}):Bool = | |
{letter=letter, min=imin, max=imax , password=(AsList _ password_str)} = dat | |
uses = countUses letter password_str | |
imin <= uses && uses <= imax | |
:p sum for i. BToI $ followsRule rules.i | |
'## Part 2 | |
Actually what we need to check is the given letter occurs in either (but not both) in the `min` and in the `max` position. | |
Those record names not seem wrong but i am not going to regenerate the records. | |
What a twist | |
def hasLetterAtPos (password_str:n=>Char) (letter:Char) (pos:Int): Bool = | |
inbounds = pos <= size n | |
case inbounds of | |
False -> False | |
True -> (password_str.((pos-1)@_) == letter) | |
:p hasLetterAtPos "axb" 'x' 2 | |
:p hasLetterAtPos "axb" 'y' 3 | |
:p hasLetterAtPos "axb" 'x' 5 | |
:p hasLetterAtPos "ccccccccc" 'c' 9 | |
def xor (a:Bool) (b:Bool) : Bool = | |
(a && not b) || (not a && b) | |
:p xor False True | |
:p xor True True | |
:p xor False False | |
:p xor True False | |
def followsNewRule (dat:{letter: Char & max: Int32 & min: Int32 & password: List Char}):Bool = | |
{letter=letter, min=pos1, max=pos2 , password=(AsList _ password_str)} = dat | |
check = hasLetterAtPos password_str letter | |
(check pos1) `xor` (check pos2) | |
:p followsNewRule dat | |
:p followsNewRule {letter='a', min=1, max=3, password=AsList _ "abcde"} | |
:p followsNewRule{letter='b', min=1, max=3, password=AsList _ "cdefg"} | |
:p followsNewRule{letter='c', min=2, max=9, password=AsList _ "ccccccccc"} | |
:p sum for i. BToI $ followsNewRule rules.i |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'# Advent of Code 2020. Day 3 | |
DexLang, [Lyndon White](http://oxinabox.net) | |
This needs [my branch](https://github.com/google-research/dex-lang/pull/306) of Dex that has Char equality support. | |
https://adventofcode.com/2020/day/3 | |
Today's solution doesn't feel great as I don't feel like i am taking proper advantage of index types. | |
Since I mostly work with them by converting to ordinal. | |
But I do't think there is structs yet for wrap-aroud or stepped indexing. | |
' I had some trouble with the `.`. and `#` in the web notebook view (though not actual repl) so swapped to `o` and `x` | |
geo_char = ["oooooooooooooooxoxooooooooooooo", "xxooxooooooooooooooooooooxoooxx", "ooooooxooxoxoooooxooxoxoxxooooo", "oooooooooxoooxooooooooooooooxox", "ooooooooooooxoooooooxxooooooooo", "oooxoooooxoooooxoooxoooooxooxoo", "ooooooooooooooxooxxoxooxoooooox", "oxxoooooxoooooxooooooxxoxoooooo", "oxooooooooooxxxooooxoooxxooooxo", "oooooxooooxoxoooooooxooooooxxoo", "oxooooxooooooxoooooooxoooooooox", "ooxoxoooooooxooxxoooooxxooooooo", "oooxoxooooxoooooooxoooooooxooox", "xxoxxoooxxooxooooooxoxoooooxoox", "oxoxoooooooxooxoxooooooxoooxoxo", "xoooooooxxoooooooxoooxooooooooo", "oooooxooooooxoxoxoooooxooooxxoo", "oxoxooooooooxooooxooxooxooooooo", "oooxooooxooxxxoooooooooxoooooxo", "ooooooooxooooooooxooooooooxoooo", "ooxxooooooooooooooxoooooxoxooxo", "oxoooxxoooooooooooooxoxoooooooo", "ooooxooxoooooooooooxoooooooxooo", "ooxooooxoooooooooooooooooooooxo", "xoxooooooooooooooooooxxooooooxx", "oxoxxooooxooooooxooooooooxooooo", "oooooooooxxoooooxooooxoooxxooxo", "xooooooooooxooxoxooooooooooooox", "oooooooooxoooxoxoxoxooxxooxxooo", "xoooxoooooxooxooxooooxoooxooooo", "ooxxoooooxooooooooooooooooooxoo", "xooxxxoooooxooooxoooooooxooxooo", "oooxxoxxooxooooooooooooxoooooox", "ooooooooxxxoooooooooxxxooooooxo", "xooxxooooxoooooooooxoooooooooxo", "ooooxoooooooooooooooooooooxoooo", "xooxooxxooxooxxxxoxxooxoooooxxo", "ooxoooxoxooooxooooxxoooooxooooo", "oooxoxoooooooooxoooooxoxooooooo", "ooooxooooooooooooooooxooxoooxxo", "ooooxooxooooooooooxoooxoxoxxooo", "ooooooooxooxxooooooooooooxoooox", "oooxooooooxxooooooooooxoxxoooxo", "oooooooxxoooooooooooooooooooooo", "oooooooxxooooooooooxooooxoxooox", "ooooooxxxoxxooxxooxooooxoooxoox", "xoxoooooooooooxxoooooxoooooooox", "ooxoooooooooooxooxxxooooxoxoxoo", "ooooooooxoooooooooooxooooooxxoo", "oooooooooxoooxxoxxxoooxxxooxooo", "oooooxoooooxooxxoooooooooxxoooo", "oooxxooooooooooooooxoooooxoooxx", "oxxooooxoooooooxxxoooooxooooooo", "oxoooooooooooxxoooooooooooooxxo", "ooooooxooxooxxoxxooooooxoooooox", "ooooooooxxxooooooooxooooooxoxoo", "xoxooooxoooooxooooooooxooooooxo", "oxxooxoooooooooxxoooxxooooxoooo", "oooooxoooooooooxoooxxoooooxoooo", "oooooooooooooxooooooooxxxooooxo", "ooooooxoooooooxoxooooooooxoxooo", "ooxooooxoxoooxooooxoooxoxoooxxo", "xoooxooooooxxooxxooooooxoxxoxxx", "oooxxoxooooxoooxooooxooooooooox", "oooxooxxxxoooooxxoxooxoxoooxxoo", "xxoxooxooooxxooooooxooooooxxooo", "xxxoooooooooxoxooxoxoooooxooooo", "oooxooooooooxooxxoooxoxoxooxoxo", "oooxxxooxoxxxoxoooxoooooooooooo", "ooooooooooooooooooooxxxoooooooo", "oooooooooooxoooooooooooxooooooo", "xooooooooooooooxoxoooooooooxxxo", "ooooooooooooooooooooxxoooooxoox", "xoxoooooxoooooooxoooxoooooooooo", "oxoooxooooooxooooxxoooxoooxoooo", "oooooxoxxooooooooooooooooooxxxo", "oooooooooxoxooxoxooooooxooooooo", "oooooooxoooooxxooxoxxoxoooooooo", "ooxooooooooooxoxxxoooooxooooxoo", "ooooooxoooooooooooooxoxoooooooo", "ooooooooxxooooxooooooooxooooooo", "oooxoooooooooooooxooooxoxoooooo", "xooooooooxooxxxxoooooxoooooxoxo", "oxxooooooxxoooxooooooooxooxoxoo", "ooooxxooooxoooxoooxooxxoooxoxoo", "xoxxoooxxxooxooooxxoxoooooooooo", "ooooxoxoooxoxoooxooxxoxxxoooxoo", "xoooooxxooxooxooooxoxoooooxxooo", "oxooxooooooooooxxoxoooooxxooooo", "oxooxooooooooxoxoxoxooooooooooo", "oxooxoooooxoooooooooooxoooxoooo", "oooxooooooxxooooooooooxxooxoooo", "oooxooxooooxoxxoooxooxoooooxxxo", "xoxooooxoooooxxoooooooooooooooo", "xooxooooooxoxoxoooooooxoooooooo", "ooooooxooooxoxooooxooxxooooxoox", "oxoooooxoxooooxxxoxxoooooooooxo", "oxxxooxoooooxooooooooxoxooooooo", "oxoooxooooooxooxoxooooooxooooox", "xoooooooooooooooxxxxoooxoooooxo", "oooooooxooooooooooxxoxoooooooox", "xooooooooxxooooxxoooooxxxooxxoo", "xooxoooooxooxxoooooxooooxooxooo", "xoooooxoooooooxxooooooxoxooooox", "xoxxooxooooooxxooxooooooooooooo", "xxoooxoooooxooooooooxxooooooooo", "ooooxooxxooooxoooxoooooooxoxooo", "ooooxoooxoooxxooxooooxooxoooxoo", "ooooooooooooooxoxoooxooooxxxooo", "oooxooooxooxxoooxxooxooooxxoooo", "xoxxoxooxooxooooooxoxoxoxoooxoo", "oooooooxooxooxxooooooooxoooooox", "xxoxooooxooooxxoxooooooxxoxoooo", "oxoooxooooooooooooooxooooooooxo", "oxoxooooxoooooooooxoooooooooooo", "oxooxooxxxoooooooooooooxooooxoo", "xooooooxoooxoxooxxooxoooxooooxo", "oooooooooooooooooooooooxoooxoxo", "oooooooooooooxooxoooxxooooooooo", "ooxoxooxooooxooooxooooooooxoooo", "xooooooxoxxooxoooxoxooooooooooo", "oooooxooooxoooooooooooxxoxooxoo", "ooxoxoooooxooooooooooooooxoxooo", "xoooooooxoooooxoooooooooooooooo", "xooooooooooooooxoooxooooxoooxoo", "oooxoooxxooxooxooooooooooooxooo", "ooooooxxxooooooooooooooooooooox", "oooooooooxoooooooxxooxooooxoooo", "ooooooooxoooxoxxooxoxxooooooxoo", "ooooxxxooxoxoooxoooxooxoxoooxxx", "xxoooxoooxxoxoooxoxoooxoxooooxo", "oooooooooxoooxoooooxxxooooooooo", "oooxooooooooxxooxoooooooxxooooo", "oxoooooooxxoooooooooxoooooxxoox", "oxooooooooooooooooooxoooxoooooo", "oxxooxooxoxoooooxoxxxoooooooooo", "oooxoooooxxooxoooooooooxoooxooo", "oxooooooxoxoooooooxoxoooooooooo", "oooooooooxoxoooxooooooooooxoxoo", "xooooooooooxoxxooxoxxooooxooooo", "oxoxooooxoooooxooxxoooooxoooxoo", "ooxooooooooxxoooxxooxooxooooxoo", "xoooooooooooxxooooxooxxxooooxoo", "oooooooooooxxoooooooooxxxxoooxo", "ooxooooooooxxxoooxoxoooooooooxo", "oxoooooooooooooooxoxxoxoxoooxoo", "oxoxxooxoooooxoxoooooxxooxooooo", "oooxoooxooxoxxoxxoooxoooooooxxo", "ooxoooxoooxooooooxxoxxoxxoooxoo", "xxooooxoooxoooxooooooooooooooox", "oooxxoooooooooooxooooooxooxoxoo", "xoooooooooxooooooxoxoxxoooooxoo", "ooooooooxooxoooooooooxxoooooooo", "ooxoxooooxxxoooooxxooxoooxooooo", "oooooooooxoooxoooooooxoooooxxoo", "xxoooooooooooooooooooooxoooxxoo", "oxoxooxooooooxooooooooooooooooo", "oooooxxxooxooooooxooxxxooxooooo", "oooxoooooxxoooooooooxooooooxoox", "ooooooxxoooooxoooxooooooooxoxoo", "ooxoxoooxooooooxoooxoxxoxxooooo", "oooxooooooooooxoooxoooooooxooxx", "oxxxooooooooxooooooooxxoooooooo", "ooxoxoxooooooooooxoxoooxxoooooo", "oooooooooxooooooooxooooooxxxoox", "ooooxxooxoooooooooxooooooooooox", "ooxxxxooxooooooooooooxxooooooox", "oooooxxoxooxxoooooooooxoooxoxoo", "oooxoooooooooxoooooxoooooxooooo", "oooooooxoooxooxoooxxoooooooooxo", "oooxoooxooxoooxooooxooxoooooooo", "xooooooooooooxxoxxoooxooooooooo", "oxoxoooooxoooooooxxxxoooooxoooo", "ooooooooooooooxooooooxoxooooooo", "ooooooooooooooxoooooooooooxooox", "xoooxooooooooxxxooooxoxooooxoxo", "xxoxooxooxooooooxooooooxoxoxooo", "oxooxoooooxooxoxooxoxoooooooxxo", "ooooooxxoxoooxoooxooooooxoooxoo", "xoooooooooooxxooooxoxoooooooooo", "ooooxoooooooxxxoxoooxoooooooooo", "oooooooooooooooooooooooxoooooxo", "ooooooooxoooxooxoooxoxoxoxoxooo", "oxoxoooooooooooxooooooxxoooxooo", "oooooooooooooooooooooooooxooooo", "oooooooooooooooooxoxxoxoooxxooo", "oooxoooxxoooooxoooooxxooooxoxoo", "oooxoooxoooooooooooooooooooxooo", "oooxooxooxoooxoooxooooxoooooooo", "xooooxoooxoooooxooooooooooooooo", "oooooooxoooooooooooxoooxooooooo", "ooooxooooxoooooxxoooooooxoooooo", "oooooooxooooooooooxxooooooooooo", "oxoxooooooooxooxxooooxooooooxoo", "oooooxoooooooxoxoooooooooxoooxo", "oxooxxxxoxoxoooooooooooooooxoox", "oooooxxxooxooxooooooooooxoxooxx", "ooxoooooooxoooxoooooxxooxooxoxo", "xooooxooooooxoooooooooooooooooo", "ooooooooxoxxoxooooxooooooooooox", "ooooxoxooooxxooxoxoooooxxoooooo", "oooxooxoooooooxooooxoooooxoxoxo", "xoooxooooooxoooooxoxoooooooooox", "ooooxooooxoooooooooooooooxooooo", "ooxxxooooooooooooooooooooooxxxo", "oxxooooxooxoooooooxxxoooooxooxo", "ooxxxooooooooooooxooooooooxoxxo", "oxooooooooxooooooxoooooxooxoooo", "ooooxooxxoooxoooxoxxxoooooooxox", "oooooooxoxxoooooooooooxoxooxooo", "oooooxoooxxoooooooooooooooooooo", "ooooxooooxoooxxooooooxooooooooo", "ooxooooooooooooxxooooxxxoxoooxo", "oxooooooooxoooooooooooooooxoooo", "xooxoxoxxoooooooooxooxxooooxxoo", "xoxooooxooxoxxooooxxoooxoxooooo", "oooooxoooooxxooooxoxooooooooxoo", "xooxoooxoooxooooxooooxooooooooo", "oooxooooooooxooxoxoooooxxoooooo", "ooxoooxoooxooooooooooooooooxxoo", "xooooooooxoxoxxoooooooxoxoooxoo", "xooooooxooxxxxoxxoooooxoxooxoxo", "ooooooooooooxooxoxooooxooooooxx", "ooxoooooxxooooxoooxoxoooooooooo", "oooxoooxoooooooooxoooxoxooooooo", "oxxxooxoooooooxxoxxoooooxoxoxoo", "oooxooooxoooooooooooooooxxoxooo", "ooooxxooxooxooxoxooooooxxooooox", "xoxooooooooooooooxxoooxxoooxxxx", "oooooxoxxoooxoxooooooooooooooox", "oxxoooooxoooooooooxoooooooxoxox", "xoxooxoooooxoooooooxoooooooxoox", "oooxoxoooooxoooooxooooooxoooooo", "oooooooxooooxooxoxooooooooooxoo", "ooooooxooooooxoxxoooxoooooooooo", "oooooxoooooooxxxoooxoooxoxooooo", "xooxoxoooooooooxoooooxoxxooooxo", "ooxoxoooooooooxooxooxooxoooooxo", "oxooxxooxooxooooxooooooxoxxooxo", "oooxxooooooxxxoooooxoxxoxxooooo", "oxoooooxoooxooxoooxoooooooooooo", "xxooxxooxoxxooooxooxooooooooooo", "oooxooxxooxooxoooooooooooooxoxx", "oooooooooooooooxxooooooooooooxo", "ooxoooooxxooooooooxxoxoooxoooox", "oxoxoooxoxoxooxoxoooooxooooxooo", "oxooooxoooooooooooooooxooxooooo", "ooooxoxxooxooooxooooooxoooxxxoo", "xooooooooooooooooxxxoooxoxooooo", "oooxoooxooooooxxooxoxooooxooooo", "oxooooxooooxoxoooxxoooooooooooo", "ooooxoooxxooxooxooooooooxoxxooo", "ooxxoooooxooxooxxoooooooooooooo", "ooxooxxooxoxooxxooooxooooxoooox", "oooxxoooooooooooooxoooooooooooo", "xooooxooooxoxooooooooxoooooxxox", "oooooxooxoxoooooxxxxoooxxxooooo", "ooooooooooooooooxooooooxooooooo", "oooooxoxoxoxoxooooxooxoooooooox", "oxxoxoooxoxoooooooxxooooxooooxo", "oooooxooooooooxoooooooooooooooo", "ooxoooooxooxoooxooxooooooooooox", "oxoooooxoooxxoooooxxooxoxooooxx", "ooooooxoooooooxooxooooooxxoxooo", "xoxooooooooooxoxxoxooooooooxooo", "oooxooxoooooooooooooxoooooooooo", "xooxooxooooooooooxooxxoxooooooo", "oxooxoooooooooooooooxxxxooxoooo", "oooooooxoooooxooooooxoooooxoxoo", "oxoooooooooooooooxoooxooooooooo", "oxooxooooooooooxooxoxooxxooxoox", "ooooooxxooxoooooxooxooooooxxxoo", "ooooooooooxoooxooxoooooooxooooo", "oxoxoxooxoooooxoxxoxoooxooxoooo", "ooooooooxoooooooxoooooxoxoooooo", "ooooooxoooooxxoooooxooooxxoxooo", "oooooooooooooooxooooooxooooooox", "ooxoxoooxoooooxoxoooxxooooooxoo", "xoxoooooooooxoxoooxooooooooxxxx", "xooooooooooxxooxooxooooooooxxoo", "oooooooooooooxooxoooooooxxoxoox", "ooxooooooooxoxooooxooooooooxoxo", "oxooooooxxxxooxooxooooooooooooo", "ooooooooooooxxxoooooooxoxooxooo", "xoxxooooooxxoooxoooxoooooooooxo", "ooooxxoxoxoxooooooxooooxooxooox", "oxooxoxooooxoooxoooooooooxooooo", "xoooxoooooxxooooooooooooxoooxoo", "xoxoooxooxoooooooooooooooooxooo", "ooooooooooooxoxooxoooooxoxoxoox", "oooooooooooooooooooxooooxoxxooo", "oooooxoooxoxooooxooooxoxoooooox", "oooooooxxoxoxooooooxxoooooooooo", "oxooxoooxxoxoooxooxooooooxooooo", "ooooooxoxooxooxxxooxxooxxoooooo", "oxoxoxoxoooooxoooxxxoooooxooxoo", "oxooooxoooooxoooooooxoooooooxoo", "ooooooooooxxoooooooooxxxxoooooo", "oxoxoooooooooooooxooxoxoooxoooo", "ooooooooxooooooooxxoooxoxooooxo", "ooooooooxoooooooooooooooooooooo", "ooxoxooooxoooooooooooooooxoooxx", "oooooooxoxoooxooxoooooxxoooooox", "oxoooxooooxooooooooooxxoooooooo", "oxoooooooooxoxooooooooooooxxooo", "oooooxooooooxxoooxoooooooxooxoo", "xoxooxoooooooooooooxoooxoooxooo", "ooooooxoooooooxooooooooooooxooo", "oooooooooooxxooooxooooooxxooooo", "oxoxooxoooooooooooooooooooooxoo", "xxooxxoooooxxxooxxoxooooooooooo", "oooxxooooooxxooooxoooxxoooooxoo", "xoooxoxxoooooooooooooxooooooooo", "ooooooxooxoooooooooxxxoxoooooox", "xoxoooooxooooooooooooooooooooox", "ooooxxxxxoooooxxooooooooxoxooxo", "oooooooooooxxooxxoxxxoooooooooo", "ooooooooooxxoooooxooooooooxooox", "oooooooxooxooooooxoooooxxooxxox", "oooooxxoxooooooooxoooooooooxooo", "ooooooxxoooooooooooooooooooooox", "oxoooooooxoxoxooooooooooooxooxo", "oooooxxoxoooooooxoxooooooooxooo"] | |
geo = for i. for j. geo_char.i.j=='x' | |
'## Part 1 | |
Moving Right 3 and Down 1, how many trues encountered? | |
geo loops at end of row | |
def countTrees1 (geo:n=>m=>Bool) : Int = | |
sum for i. | |
i_ord = ordinal i | |
j_ord = mod (3*i_ord) (size m) | |
j = j_ord@m | |
BToI geo.i.j | |
:p countTrees1 geo | |
'## Part 2 | |
def countTrees (geo:n=>m=>Bool) (down:Int) (right:Int) : Int64 = | |
sum for i. | |
i_ord = ordinal i | |
keep = (i_ord `mod` down) == 0 | |
j_ord = mod (right*(i_ord `idiv` down)) (size m) | |
j = j_ord@m | |
IToI64 $ BToI $ select keep geo.i.j False | |
:p countTrees geo 1 3 | |
ctg1 = countTrees geo 1 | |
:p ctg1 1 | |
:p ctg1 3 | |
:p ctg1 5 | |
:p ctg1 7 | |
:p countTrees geo 2 1 | |
:p (prod $ map ctg1 [1, 3, 5, 7]) * (countTrees geo 2 1) | |
' This one was fiddly and an messed it up a few times so this code tells me which positions are being checked | |
def posCheck (geo:n=>m=>Bool) (down:Int) (right:Int) : n=>(Maybe (Int&Int&Bool)) = | |
for i. | |
i_ord = ordinal i | |
keep = (i_ord `mod` down) == 0 | |
j_ord = mod (right*(i_ord `idiv` down)) (size m) | |
j = j_ord@m | |
select keep (Just (i_ord+1, j_ord+1, geo.i.j)) Nothing | |
:p posCheck geo 2 1 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'# Advent of Code 2020. Day 4 | |
DexLang, [Lyndon White](http://oxinabox.net) | |
This was challenging given lack of any functions beyoud character equality for working with strings. | |
No substring, let along regex or a parse function. | |
This code is sloooow, dex makes my computer go brrrrrrr | |
https://adventofcode.com/2020/day/4 | |
-- copied from the plotting branch | |
def str (n:Int) ?-> (s:(Fin n=>Char)) : String = AsList _ s | |
batch = [str "ecl:gry pid:860033327 eyr:2020 hcl:#fffffd\nbyr:1937 iyr:2017 cid:147 hgt:183cm", str "iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884\nhcl:#cfa07d byr:1929", str "hcl:#ae17e1 iyr:2013\neyr:2024\necl:brn pid:760753108 byr:1931\nhgt:179cm", str "hcl:#cfa07d eyr:2025 pid:166559648\niyr:2011 ecl:brn hgt:59i"] | |
' This is not the fastest method of checking if one string contains another. But it is the easiest to write. | |
def contains (eqA: Eq a) ?=> (needle:n=>a) (haystack:m=>a) : Bool = | |
any for i:m. | |
nottoolong = (ordinal i) < (size m - size n + 1) | |
(all for j:n. | |
hj_true = ((ordinal i) + (ordinal j)) | |
hj = select nottoolong hj_true 0 | |
select nottoolong (haystack.(hj@_) == needle.j) False) | |
:p contains "xb" "xbc" | |
:p contains "xbz" "xbcs" | |
:p contains "xbc" "xbc" | |
:p contains "xbcd" "xbc" | |
def containsL (eqA: Eq a) ?=> (needle:n=>a) (haystackL:List a) : Bool = | |
(AsList _ haystackT) = haystackL | |
contains needle haystackT | |
:p containsL "ecl:" batch.(1@_) | |
def isValid (passport:String) : Bool = | |
required_fields = ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"] | |
all for i. containsL required_fields.i passport | |
:p isValid batch.(0@_) | |
:p isValid batch.(1@_) | |
:p isValid batch.(2@_) | |
:p isValid batch.(3@_) | |
full_batch = [str "ecl:hzl byr:1926 iyr:2010\npid:221225902 cid:61 hgt:186cm eyr:2021 hcl:H7d3b0c\n", str "hcl:Hefcc98 hgt:178 pid:433543520\neyr:2020 byr:1926\necl:blu cid:92\niyr:2010\n", str "iyr:2018\neyr:2026\nbyr:1946 ecl:brn\nhcl:Hb6652a hgt:158cm\npid:822320101\n", str "iyr:2010\nhgt:138 ecl:grn pid:21019503 eyr:1937 byr:2008 hcl:z\n", str "byr:2018 hcl:z eyr:1990 ecl:Hd06796 iyr:2019\nhgt:176in cid:75 pid:153cm\n", str "byr:1994\nhcl:Hceb3a1 hgt:176cm cid:80 pid:665071929 eyr:2024 iyr:2020 ecl:grn\n", str "cid:280 byr:1955 ecl:blu hgt:155cm hcl:H733820\neyr:2013 iyr:2011 pid:2346820632\n", str "hcl:H4a5917 hgt:61cm\npid:4772651050\niyr:2026 ecl:brn byr:2015 eyr:2026\n", str "iyr:2019 hcl:Ha97842 hgt:182cm eyr:2024 ecl:gry pid:917294399 byr:1974\n", str "ecl:H9c635c pid:830491851 hgt:175cm cid:141\niyr:2010\nhcl:z\nbyr:2026 eyr:1998\n", str "byr:1927 iyr:2011 pid:055176954 ecl:gry hcl:H7d3b0c eyr:2025 hgt:166cm\n", str "hcl:H733820 byr:2008 ecl:utc eyr:1920 pid:159cm hgt:66cm iyr:2030\n", str "pid:027609878\neyr:2022 iyr:2012\nbyr:1960 hgt:157cm\nhcl:Hb6652a\ncid:117\necl:grn\n", str "iyr:2025 pid:7190749793 ecl:grn byr:1984 hgt:71in hcl:c41681\ncid:259 eyr:1928\n", str "eyr:2029 pid:141655389 cid:52 hcl:Hcfa07d iyr:2019\necl:blu hgt:69in byr:1938\n", str "eyr:2020 hgt:166cm\necl:gry\npid:611660309 iyr:2011\nhcl:H623a2f byr:1943\n", str "hgt:190cm eyr:2022 byr:2000 cid:210 pid:728418346 hcl:Ha97842 ecl:xry iyr:2015\n", str "byr:1973 eyr:2028 iyr:2012\nhcl:Hff0ec8 pid:740554599 ecl:amb cid:58 hgt:155cm\n", str "iyr:2016 pid:922938570 ecl:oth hcl:Hfffffd hgt:154cm eyr:2021 byr:1966\n", str "ecl:amb\nbyr:1929\nhcl:Hc3bbea pid:511876219\niyr:2019\nhgt:191cm\neyr:2026\n", str "ecl:utc hgt:155cm pid:H9f0a41 iyr:2012 hcl:Hbd4141\nbyr:1998 eyr:2020\n", str "ecl:grn hgt:173cm cid:321 pid:851120816 byr:1968 hcl:Ha97842 eyr:2027\niyr:2014\n", str "hgt:155cm hcl:Hf40d77 pid:038224056 byr:1953 ecl:brn iyr:2014\neyr:2022\n", str "pid:181869721\niyr:2011 hgt:151cm hcl:H733820 cid:110 ecl:blu\nbyr:1931 eyr:2024\n", str "byr:1948\nhcl:H888785\nhgt:74in\ncid:112 ecl:hzl pid:921761213 eyr:2028\niyr:2015\n", str "ecl:gry\nbyr:1931\npid:600127430 hcl:H341e13 eyr:2027\niyr:2013 hgt:173cm\n", str "hgt:178cm pid:530791289 hcl:H6b5442\neyr:2022 byr:1979 iyr:2014 ecl:hzl\n", str "pid:412193170 hcl:Hcfa07d hgt:186cm iyr:2012 cid:284 eyr:2020 byr:1967\necl:grn\n", str "hcl:H6b5442\niyr:2015 pid:808448466 ecl:blu eyr:2022 hgt:159cm byr:1969\n", str "eyr:2020\niyr:2019 hgt:170cm pid:8964201562 hcl:H6b5442 byr:1947 ecl:amb\n", str "eyr:2029 ecl:hzl hcl:H866857 byr:1961\niyr:2017\n", str "ecl:H3456ba eyr:2013 iyr:2020 pid:378280953\nhcl:z hgt:174cm\n", str "hgt:172cm\ncid:202 ecl:oth eyr:2021 byr:1980\niyr:2012\nhcl:Hcfa07d pid:605707698\n", str "cid:281 hgt:161cm iyr:2017 pid:122936432 hcl:H602927 byr:1981 ecl:gry eyr:2021\n", str "byr:1959 hgt:193cm pid:083900241 iyr:2020 eyr:2037 hcl:H623a2f\necl:hzl\n", str "iyr:2030 hgt:153cm eyr:2022 hcl:Hefcc98 cid:131\nbyr:2016 ecl:hzl pid:64053944\n", str "hgt:172cm eyr:2025\nhcl:H866857\nbyr:1938 ecl:dne\npid:192cm iyr:2014\n", str "pid:016297574 cid:152 iyr:2015\neyr:2024 hcl:H341e13 byr:1965 hgt:175cm\necl:oth\n", str "pid:604330171 cid:125 byr:1974 hgt:160cm iyr:2014\neyr:2022 ecl:oth hcl:H6b5442\n", str "pid:59747275\nbyr:2027\nhgt:145\nhcl:1fd71f iyr:1944 eyr:2037 ecl:brn\n", str "iyr:2010\neyr:2021 byr:1953\npid:7098774146 ecl:brn hcl:98737d hgt:158cm\n", str "hcl:H602927 eyr:2039 pid:H81a5a1 iyr:2012 cid:67 byr:1951\necl:H6551f5 hgt:76cm\n", str "hgt:170cm ecl:oth\ncid:235 eyr:2022\nbyr:1929 iyr:2019\nhcl:H341e13 pid:797557745\n", str "iyr:2011\nhcl:H733820\neyr:2022 pid:830183476 ecl:blu byr:1976 cid:157 hgt:75in\n", str "hgt:164cm ecl:amb pid:653425455 hcl:H623a2f byr:1977 eyr:2020\niyr:2013\n", str "byr:2009 eyr:1953 hgt:178cm pid:H5d02f0\nhcl:Ha97842 iyr:2016\necl:amb\n", str "pid:009643210 eyr:2036 ecl:zzz\ncid:97 hcl:32e540 byr:2005 hgt:187cm iyr:2021\n", str "pid:155cm\niyr:2022 byr:2024 eyr:2031 ecl:amb cid:79\nhcl:Hcfa07d hgt:69cm\n", str "cid:176 ecl:oth\npid:688645779 byr:1933 eyr:2026 hgt:69cm\niyr:2016 hcl:H888785\n", str "hcl:H888785\neyr:2027\niyr:2020 pid:802243213 ecl:brn\nhgt:179cm byr:1976\n", str "hcl:H6cad3e hgt:164cm byr:1982 iyr:2020\necl:gry\npid:142160687 eyr:2023\n", str "hcl:H18171d\nhgt:153cm\niyr:2014 ecl:hzl cid:231 pid:167809118 byr:1997 eyr:2028\n", str "byr:1940\necl:hzl iyr:2016 cid:67 hcl:Hc800da\npid:563956960 eyr:2021\nhgt:189cm\n", str "pid:133094996 eyr:2032 hgt:60cm hcl:H623a2f byr:2030 ecl:dne iyr:2023\n", str "pid:65195409 hcl:d0d492\niyr:1956\nbyr:2019 ecl:Hbb043f eyr:2031 hgt:167in\n", str "iyr:2016 byr:2006 ecl:H35d62f eyr:2029\nhgt:186cm\nhcl:1d8307\n", str "eyr:1935 iyr:1960 pid:346667344 ecl:grn hgt:170cm hcl:cfcc36\n", str "ecl:oth byr:1979 pid:165581192\nhgt:177cm\nhcl:Hc0946f\niyr:2011\n", str "iyr:2011 eyr:2030 pid:250840477\nbyr:1934 cid:174 hgt:179cm hcl:H866857\necl:blu\n", str "hgt:157cm hcl:H7d3b0c eyr:2027 pid:979510046\necl:oth\n", str "iyr:2025\nhgt:69\necl:grt byr:1935\neyr:1928 pid:168cm\ncid:271 hcl:z\n", str "pid:998166233\niyr:2020 hgt:166cm ecl:amb byr:1995 hcl:Hfffffd\n", str "hcl:Hceb3a1 ecl:amb\niyr:2019\neyr:2024 hgt:184cm byr:1980 pid:839215481\ncid:146\n", str "byr:1967\npid:444303019 ecl:oth hgt:150cm eyr:2024\n", str "eyr:2023 byr:1960 iyr:2010\ncid:236 hcl:H733820 pid:900635506\nhgt:69in\necl:hzl\n", str "eyr:2029 pid:969574247\nhgt:150cm byr:1967\niyr:2010 ecl:blu\n", str "pid:575879605 iyr:2010\necl:hzl\nbyr:1963\nhgt:151cm\nhcl:Hc0946f cid:277\n", str "byr:1998 pid:621374275\necl:brn hcl:z iyr:2029\neyr:2024\nhgt:68cm\n", str "pid:365407169 ecl:amb hcl:H87f433 iyr:2011 eyr:2021 byr:1987\nhgt:175cm cid:201\n", str "hgt:175cm iyr:2020\necl:gry\neyr:2029 pid:806927384 cid:59\nbyr:1932 hcl:H888785\n", str "pid:589898274 cid:113 hcl:z hgt:184cm eyr:2000\necl:lzr iyr:2016 byr:2016\n", str "ecl:H2bafbb\neyr:2038 iyr:2027\nhcl:Hfffffd\nhgt:174 byr:2007\npid:093750113\n", str "eyr:2022 hgt:59in\nhcl:Hceb3a1\npid:159921662 ecl:gry\nbyr:1948 iyr:2014\ncid:50\n", str "hgt:190cm\niyr:2014 pid:480507618 hcl:Hfffffd byr:1945 eyr:2029\n", str "byr:1951 hgt:152cm ecl:brn iyr:2016 eyr:2029 cid:179 pid:027575942\nhcl:Hfffffd\n", str "cid:198 pid:728480773 eyr:2028 hgt:153cm iyr:2018\nhcl:H888785 ecl:amb byr:1983\n", str "byr:1968 hcl:Hc0946f ecl:grn eyr:2027\niyr:2013 pid:269749807\ncid:227\nhgt:178cm\n", str "eyr:2024 hgt:185cm ecl:oth\nhcl:H448ace byr:1987 iyr:2018 pid:454243136\n", str "byr:1930 ecl:grn iyr:2018 hgt:158cm\nhcl:H341e13 eyr:2021\n", str "eyr:2024 cid:194 pid:425431271\nhgt:169cm ecl:grn byr:1973\niyr:2014 hcl:Hfffffd\n", str "ecl:grn cid:110 iyr:2013 hcl:H18171d\nhgt:155cm eyr:2024 byr:1962 pid:522435225\n", str "byr:1934 ecl:hzl hgt:152cm iyr:2018\neyr:2024 pid:079740520\n", str "ecl:grn eyr:2023 hcl:c3f119 pid:468039715 iyr:2013 hgt:150cm byr:1955\n", str "pid:809357582 eyr:2025 byr:1958\nhcl:H6b5442 iyr:2013\nhgt:161cm ecl:hzl\n", str "hcl:Hb6652a pid:068979430 byr:1960 iyr:2010 ecl:grn hgt:159cm eyr:2021\n", str "cid:105 pid:495292692 byr:1965\nhcl:Hceb3a1 hgt:160cm ecl:amb\niyr:2020\n", str "iyr:2010\neyr:2024 byr:1941 ecl:grn hcl:Hb35770 hgt:171cm cid:132 pid:975699036\n", str "pid:767448421 hgt:186cm hcl:H733820\nbyr:1972 iyr:2020 eyr:2026 ecl:grn\n", str "pid:036236909 iyr:2012\nhgt:181cm hcl:H888785\neyr:2026\necl:hzl byr:1936\n", str "hgt:173cm\nbyr:1923 ecl:blu\neyr:2026 pid:570818321\nhcl:H733820 iyr:2016\ncid:59\n", str "pid:2711059768\nbyr:2024\ncid:139 ecl:blu hcl:z hgt:60cm\n", str "eyr:2025\npid:671193016\nbyr:1950 hcl:H6b4b25 iyr:2017 hgt:158cm ecl:blu\n", str "hgt:175cm iyr:2015 ecl:amb\nbyr:1984 eyr:2026 pid:342782894\ncid:140\n", str "iyr:2019 eyr:2027 byr:1972\npid:196266458\nhgt:158cm hcl:H7d3b0c cid:69\n", str "pid:604018034 iyr:2016 ecl:brn eyr:2028 hgt:172cm hcl:H6b5442 byr:1922\ncid:238\n", str "eyr:2024 ecl:gry byr:1970 pid:356551266 cid:340 hgt:162cm iyr:2013\n", str "ecl:amb\nhgt:151cm hcl:H18171d byr:1921 pid:187276410 eyr:2030 iyr:2015\n", str "eyr:2030 pid:056372924 hcl:Hd236d9 hgt:156cm\niyr:2014 ecl:blu\n", str "iyr:2014 eyr:2028 byr:1991\nhcl:Hb6652a pid:119231378 hgt:155cm ecl:blu\ncid:77\n", str "hcl:H341e13\neyr:2027\niyr:2012 ecl:grn hgt:152cm pid:405955710 byr:1970\n", str "iyr:2013 hgt:180cm eyr:1978 ecl:amb byr:1929 pid:3198111997 hcl:z\n", str "pid:32872520 ecl:H8a0dd4 iyr:1955 eyr:2036\nbyr:2027 cid:133 hcl:z hgt:184in\n", str "hgt:152cm pid:402361044\nhcl:Hefcc98 eyr:2029 ecl:grn iyr:2014\nbyr:1960\n", str "byr:1972 eyr:2026 pid:411187543 iyr:2014\nhgt:184cm cid:211 hcl:H866857 ecl:brn\n", str "ecl:brn\nhcl:Hefcc98\npid:311916712\nbyr:1957 hgt:151cm eyr:2020 iyr:2020\n", str "iyr:1968\nhcl:a28220\npid:Hed250d cid:240 eyr:2031\nhgt:181cm ecl:xry\n", str "ecl:grn byr:1946 hgt:172cm iyr:2010 hcl:Hb6652a pid:372011640 eyr:2026\n", str "ecl:brn\neyr:2026 byr:1980 hcl:Hc0946f\nhgt:151cm pid:153076317 iyr:2012\n", str "byr:1966 pid:852999809 ecl:oth\nhgt:163cm\niyr:2014 eyr:2029 hcl:H341e13\n", str "ecl:blu\nbyr:1959 hgt:191cm pid:195095631 iyr:2016 hcl:Hceb3a1 eyr:2028\n", str "byr:2001 ecl:gry hcl:H888785 iyr:2018 hgt:177cm pid:576714115\n", str "iyr:2017\nbyr:1949\necl:blu hgt:186cm cid:289 pid:859016371\nhcl:Hceb3a1 eyr:2021\n", str "byr:1999 hcl:Hb6652a eyr:2023\nhgt:175cm\necl:gry iyr:2013 cid:165 pid:194927609\n", str "hgt:70in eyr:2027 ecl:brn iyr:2012 pid:162238378 hcl:Hceb3a1 byr:1986\n", str "hgt:63in ecl:xry\nbyr:2011 iyr:2024\nhcl:5337b0\n", str "hcl:H341e13 eyr:2029\nhgt:184cm ecl:amb iyr:2012\nbyr:1970\n", str "byr:1920 pid:472914751\neyr:2028\nhgt:187cm hcl:Hcfa07d cid:290 ecl:gry\n", str "byr:1948 ecl:gry eyr:2025 hgt:151cm cid:276 hcl:H6b5442 pid:937979267\niyr:2016\n", str "byr:1934\npid:626915978 hcl:H623a2f hgt:167cm ecl:gry\niyr:2020 eyr:2023\n", str "byr:1949\nhgt:68in eyr:2027 iyr:2019 hcl:H733820 ecl:brn cid:237\npid:057797826\n", str "pid:155cm\nhgt:68cm ecl:lzr hcl:z cid:344 eyr:2028 iyr:2020 byr:2017\n", str "byr:1959\nhcl:H341e13 eyr:2022\niyr:2019 pid:728703569\nhgt:167cm\necl:oth\n", str "ecl:grn\neyr:2024 byr:1999\npid:566956828\niyr:2015 cid:293 hcl:H602927 hgt:192cm\n", str "byr:1939\necl:xry pid:929512270 hgt:66in iyr:1939 eyr:2030 hcl:Hefcc98\n", str "eyr:2026\niyr:2014\npid:176cm hcl:Hfffffd\necl:gry\nhgt:151cm byr:1933\ncid:256\n", str "ecl:oth eyr:2025 iyr:2017 hgt:159cm pid:055267863 cid:55 byr:2001 hcl:Hcfa07d\n", str "eyr:2029 byr:1954 ecl:hzl cid:123 iyr:2020 hgt:192cm hcl:H866857\npid:225593536\n", str "pid:320274514 cid:289 byr:1963\neyr:1942\necl:gmt hcl:z hgt:167in iyr:2022\n", str "byr:2013\necl:gmt\niyr:2011\nhcl:H733820 pid:He7962f\nhgt:178cm eyr:2029\n", str "pid:154cm ecl:hzl\neyr:2035 byr:2023 cid:104 iyr:2026\n", str "eyr:2024 ecl:hzl hcl:H7d3b0c iyr:2010\npid:105864164\nbyr:1955\nhgt:163cm\n", str "eyr:2021 hgt:151cm\niyr:2017 hcl:Hc0946f\necl:amb\ncid:150\npid:296798563\nbyr:1953\n", str "iyr:2012\nbyr:1990 hcl:H341e13\npid:189449931 eyr:2024 hgt:64in\n", str "hcl:z cid:79 byr:2028\neyr:2028 pid:886152432\necl:Hce0596 hgt:178cm\niyr:2029\n", str "ecl:brn\niyr:2019 hgt:151cm\nhcl:H341e13\nbyr:1969\npid:468846056\neyr:2022\n", str "ecl:grn hgt:157cm iyr:2012\neyr:2020\nhcl:Hb6652a cid:338\nbyr:1954 pid:153867580\n", str "iyr:2011\neyr:2027\nbyr:1935\nhgt:151cm\necl:blu pid:802665934 cid:276 hcl:H623a2f\n", str "hcl:Hefcc98 eyr:2026 ecl:amb\niyr:2014 pid:320160032\nhgt:157cm\nbyr:1976\n", str "eyr:2021 cid:172\niyr:2012 ecl:oth hgt:187cm\npid:432856831 byr:2001 hcl:H733820\n", str "eyr:2028 ecl:amb hcl:Hefcc98\niyr:2020 byr:1954 hgt:153cm\n", str "byr:1930 ecl:brn hcl:Hfffffd\npid:458840035 hgt:178cm eyr:2021\niyr:2011 cid:336\n", str "pid:216876576 hcl:H341e13\neyr:2028 iyr:2018 hgt:177cm byr:1938\necl:brn cid:214\n", str "byr:2029 eyr:1987\nhgt:75cm pid:193cm hcl:Hb6652a cid:246 iyr:2028\n", str "ecl:hzl hgt:151cm hcl:H7d3b0c\neyr:2030 pid:910999919\niyr:2019 byr:1956\n", str "byr:1950\ncid:95 iyr:2013 ecl:grn\neyr:2020 hcl:H623a2f\npid:603817559 hgt:159cm\n", str "pid:913791667\niyr:2018 byr:1959 hcl:Ha97842 hgt:179cm eyr:2029 ecl:gry\n", str "hgt:71in\necl:blu eyr:2028\nhcl:H18171d byr:1937 iyr:2011 pid:951572571\n", str "hcl:Hb6652a iyr:2015 hgt:170cm ecl:blu cid:292\nbyr:1977 pid:475457579 eyr:2020\n", str "ecl:amb eyr:2029\npid:530769382 iyr:2018 cid:53\nhgt:63in\nbyr:1954 hcl:H07de91\n", str "hcl:Hcfa07d hgt:185cm\nbyr:1929 iyr:2011\neyr:2027\n", str "iyr:2019 ecl:oth byr:2023 hcl:H341e13 pid:879919037\neyr:2030 hgt:174cm\n", str "hcl:z hgt:182cm ecl:grn iyr:2010 eyr:2020 pid:2063425865\ncid:182\nbyr:2019\n", str "byr:1930 hgt:185cm pid:412694897 eyr:2025 ecl:brn iyr:2020\nhcl:Ha97842\n", str "hgt:150cm byr:1955 eyr:2020 cid:149 pid:597600808\nhcl:Hceb3a1\necl:hzl\n", str "pid:209568495\neyr:2026 byr:1928 hcl:H341e13 hgt:183cm ecl:brn iyr:2011\n", str "pid:723789670 ecl:blu iyr:2013 byr:1933\ncid:239 hcl:H7d3b0c eyr:2026 hgt:151cm\n", str "byr:1978 eyr:2027 hgt:164cm\npid:009071063\nhcl:H602927 iyr:2014 ecl:blu\n", str "hcl:H18171d ecl:grn hgt:154cm cid:154 iyr:2016\nbyr:1952 pid:730027149 eyr:2024\n", str "eyr:2025 hcl:H888785 iyr:2013 cid:90\nbyr:1975 ecl:grn\npid:619198428 hgt:161cm\n", str "ecl:gry iyr:2013 pid:795604673 cid:198 byr:1962\nhcl:H6b5442 hgt:64in eyr:2021\n", str "hcl:Hceb3a1 ecl:oth iyr:2015\neyr:2021 pid:920586799 cid:302 hgt:60in\nbyr:1964\n", str "eyr:2021 ecl:gry iyr:2019\nhcl:H6b5442 hgt:192cm\nbyr:1996\npid:692698177\n", str "ecl:grn pid:141369492 byr:1956 eyr:2028 hcl:H6b5442 hgt:190cm iyr:2014\n", str "hcl:H6b5442\necl:grn iyr:2020 hgt:153cm\npid:312738382 eyr:2028\nbyr:1985\n", str "byr:1979\neyr:2021 ecl:gry hgt:175cm pid:787676021 cid:81 hcl:Hb6652a iyr:2012\n", str "cid:80 hgt:188cm byr:1964 pid:105773060 iyr:2014 hcl:H733820 ecl:gry eyr:2028\n", str "byr:1960 pid:251870522 iyr:2018 hgt:168cm ecl:blu hcl:Hc0946f eyr:2026\n", str "cid:270\npid:H5661f0 hgt:182in\necl:dne\nbyr:1930\nhcl:z iyr:2026\n", str "hcl:H888785 byr:1954 pid:170544716 eyr:2028 hgt:162cm cid:244\niyr:2014\necl:grn\n", str "iyr:2017\nhgt:69in\necl:hzl\npid:544135985 hcl:Hceb3a1 eyr:2020\n", str "hcl:92d4a1 iyr:2018 pid:178cm\ncid:347\nhgt:97 eyr:2017\necl:gmt byr:2004\n", str "ecl:oth iyr:2018 hcl:Hfffffd byr:1999 pid:853396129\ncid:119 eyr:2026 hgt:178cm\n", str "hgt:69in\nhcl:Hfffffd eyr:2026 byr:1922\niyr:2010 ecl:oth pid:664840386\n", str "hgt:178cm\nbyr:2000\niyr:2013 hcl:Hcfa07d\neyr:2028 pid:842454291\necl:amb\n", str "ecl:hzl\nhcl:H733820 pid:316835287 byr:1998\neyr:2024\niyr:2015 hgt:165cm\n", str "pid:684064750 byr:1928 ecl:gry iyr:2015 cid:343\nhgt:189cm\nhcl:H4c6cb4 eyr:2020\n", str "byr:1923 hcl:Ha97842 eyr:2024 ecl:gry\npid:095911913\nhgt:185cm iyr:2010\n", str "ecl:hzl\nbyr:1996\neyr:2023\nhgt:177cm\nhcl:Hb6652a pid:011541746\niyr:2011\n", str "hcl:Hefcc98\niyr:2014 ecl:oth byr:1942 pid:730960830\nhgt:183cm\neyr:2025\n", str "byr:1939 eyr:2029 ecl:amb hcl:Hfffffd\nhgt:188cm pid:732730418 iyr:2013 cid:313\n", str "hgt:164cm cid:217 byr:1985 hcl:H888785 eyr:2020\niyr:2014 ecl:oth\npid:071172789\n", str "eyr:2024 pid:215897274 ecl:Hc67898\nbyr:1972 hcl:H866857 iyr:2010 hgt:170cm cid:310\n", str "ecl:hzl pid:030118892 byr:1941 hgt:158cm hcl:Hb6652a\neyr:2029 iyr:2012\n", str "ecl:gry hcl:Hc0946f hgt:166cm pid:604313781\nbyr:1924 eyr:2023 iyr:2020\n", str "hcl:H602927 hgt:168cm eyr:2027 ecl:brn\npid:764635418 byr:1968 iyr:2010\n", str "pid:157933284\necl:grn\neyr:2030 byr:2000\nhgt:81 hcl:z\n", str "hcl:Hec24d1\npid:647881680 byr:1922\nhgt:178cm iyr:2020 ecl:amb eyr:2021 cid:94\n", str "ecl:hzl byr:1971 iyr:2018 pid:975690657 eyr:2027\nhgt:192in\ncid:202 hcl:Hc0946f\n", str "pid:678999378\nhgt:61in\nbyr:1981 hcl:Hcfa07d eyr:2029 iyr:2014\necl:oth\n", str "eyr:2022 iyr:2012 ecl:grn pid:883419125\nhcl:Hceb3a1\ncid:136 hgt:75in\nbyr:1952\n", str "iyr:2018 hgt:185cm\nbyr:1985 pid:119464380 eyr:2028 hcl:H623a2f ecl:gry\n", str "eyr:2025 hcl:Hceb3a1 byr:1953\ncid:277 hgt:164cm iyr:2010 pid:574253234\n", str "cid:252 ecl:amb pid:594663323\nhgt:75in hcl:Hcfa07d iyr:2019\neyr:2026 byr:1964\n", str "iyr:2026 hcl:z pid:60117235 ecl:lzr\nbyr:2016 hgt:156in eyr:1994\n", str "pid:448392350\neyr:2022 hcl:Ha97842\nhgt:157cm\necl:hzl\niyr:2018 byr:1973\n", str "ecl:brn\nbyr:1951\neyr:2028\nhcl:H7d3b0c iyr:2018 hgt:164cm\n", str "hgt:156cm\nbyr:1963\niyr:2014 eyr:2020 ecl:blu hcl:Hceb3a1\npid:Ha87d16\n", str "pid:447170366 ecl:blu hcl:H888785\niyr:2012 cid:236\nhgt:167cm\neyr:2022 byr:1942\n", str "hcl:H623a2f\neyr:2020 iyr:2017 cid:128 ecl:amb pid:279550425\nbyr:1983 hgt:154cm\n", str "byr:2014 eyr:2034 hgt:176in hcl:z\necl:Hd4e521\npid:3629053477 cid:177\niyr:1970\n", str "pid:30370825 byr:1966 eyr:2026\niyr:2026 hcl:H866857\ncid:346 ecl:Hf7c189\n", str "iyr:2010 pid:271066119 eyr:2023 hcl:Hefcc98 hgt:179cm byr:1956\n", str "byr:1966 hgt:156cm pid:977897485 cid:287 iyr:2011 hcl:Hb6652a ecl:amb eyr:2029\n", str "cid:211 ecl:gmt byr:2017\nhcl:z eyr:2029 hgt:180in iyr:2021 pid:81920053\n", str "byr:2019\npid:5229927737 hcl:75b4f1 hgt:146 iyr:2026 ecl:H92cf7d eyr:2032\n", str "eyr:2027 pid:604671573\necl:hzl\nhgt:189cm byr:1979\nhcl:Hefcc98 iyr:2020\n", str "iyr:2018 cid:192\neyr:2029 ecl:grn\npid:653764645 hgt:179cm\nhcl:H341e13 byr:1927\n", str "byr:2012\niyr:2015\nhcl:Hb6652a\npid:168500059 eyr:2038 cid:234 hgt:191cm ecl:zzz\n", str "ecl:gry hcl:H623a2f byr:1925\niyr:2016\neyr:2028 cid:157\nhgt:154cm\npid:196280865\n", str "cid:319 pid:928322396 ecl:gry\nbyr:1949\neyr:2028\nhcl:H341e13 hgt:171cm\niyr:2018\n", str "byr:2023\niyr:1953 hgt:154cm ecl:dne\nhcl:H888785\npid:066246061 eyr:1983\n", str "hcl:z\niyr:2016 byr:1986 ecl:utc\nhgt:179cm eyr:2019 pid:583251408\n", str "ecl:amb iyr:2014 pid:499004360\nbyr:1927 eyr:2021 hgt:193cm hcl:Hceb3a1\n", str "pid:631303194 ecl:gry\nhcl:H18171d cid:216 iyr:2019\neyr:2024 hgt:178cm\n", str "hcl:H341e13 cid:201\nbyr:1949 iyr:2019 ecl:gry pid:372356205\neyr:2024\n", str "hcl:H18171d\npid:867489359\nhgt:185cm\niyr:2020 ecl:amb\neyr:2030\nbyr:1955\n", str "byr:1991\necl:brn eyr:2025 hgt:184cm iyr:2016 pid:202216365\n", str "ecl:xry pid:H524139 hgt:151cm hcl:z eyr:2031 byr:2030 iyr:2005\n", str "byr:1971 hgt:178cm ecl:amb hcl:Hceb3a1\niyr:2010\neyr:2026 pid:396974525\n", str "iyr:2014\nhgt:177cm pid:928522073\neyr:2022\necl:hzl\nhcl:Hc0946f byr:1983\n", str "hgt:167cm hcl:Hceb3a1 iyr:2014\npid:172415447\neyr:2020 byr:1956\n", str "iyr:2011 hgt:188cm byr:1947 eyr:2020 pid:667108134 ecl:amb hcl:H44a86b\n", str "cid:302 ecl:brn pid:292483175 hgt:154cm\nbyr:1997\neyr:2026\niyr:2014 hcl:H623a2f\n", str "hgt:171cm\niyr:2014 hcl:z ecl:hzl pid:321513523 eyr:2027 cid:146\nbyr:2001\n", str "eyr:1956 ecl:dne hgt:75cm hcl:82e1fa\niyr:2030 byr:2027\n", str "eyr:2020\niyr:2011 pid:656669479 ecl:oth hgt:151cm hcl:Hefcc98 byr:1981\n", str "iyr:2013\nbyr:1934\npid:142890410 hgt:62in\neyr:2022\nhcl:H87cca4\necl:hzl\n", str "pid:006232726\nhgt:173cm ecl:hzl cid:110\neyr:2026 hcl:H866857 iyr:2017 byr:1992\n", str "cid:208\niyr:2014 ecl:brn eyr:2024 byr:1935 hgt:187cm\nhcl:Hb6652a\npid:770836724\n", str "iyr:2014 cid:144 hgt:169cm\neyr:2022\necl:oth\npid:117575716 hcl:Hfffffd byr:1926\n", str "byr:1971 ecl:brn\nhcl:H733820 eyr:1942 iyr:2013\npid:606274259 hgt:163cm cid:196\n", str "byr:1964\npid:997828217 eyr:2029 iyr:2017 ecl:blu hcl:H341e13\nhgt:158cm\n", str "pid:568202531 hcl:Hefcc98 hgt:154cm eyr:2029 iyr:2010\nbyr:1946\necl:blu\n", str "iyr:2011\npid:619355919\nbyr:1955\necl:brn hcl:H888785 eyr:2030 hgt:155cm\n", str "ecl:hzl pid:367152545\nhgt:162cm\ncid:221 hcl:H866857\neyr:2024\nbyr:1997 iyr:2019\n", str "hgt:157in\ncid:268 hcl:32371d byr:2020\necl:zzz pid:1081234390\n", str "ecl:hzl eyr:2026\nbyr:1969 pid:850482906 cid:166 hcl:H602927 hgt:60in\niyr:2019\n", str "hcl:Hc0946f\nhgt:176cm\necl:brn eyr:2026 iyr:2018 cid:172 byr:1986 pid:172963254\n", str "ecl:grn iyr:2016\nhgt:187cm\nbyr:1983\nhcl:Hefcc98\npid:722084344 eyr:2025\n", str "ecl:oth hcl:H341e13 pid:130312766 hgt:171cm iyr:2018 byr:1927 eyr:2024\n", str "byr:2021 hgt:152cm hcl:74dda6\neyr:1984 cid:216\niyr:2018 pid:95283942\n", str "hcl:Hb6652a pid:924778815 iyr:2017 ecl:gry\neyr:2035\nhgt:68cm\n", str "iyr:2010\nhcl:Hefcc98 ecl:brn eyr:2020 pid:801894599 hgt:163cm byr:1959\n", str "pid:798701070 eyr:2030\nhcl:H866857 ecl:hzl hgt:169cm byr:1994 cid:219 iyr:2010\n", str "pid:He9b41b\nhcl:H341e13 byr:1970\niyr:2014\necl:oth cid:266 hgt:68cm eyr:2023\n", str "byr:1931 pid:929960843 hgt:187cm hcl:H6b5442 cid:52 iyr:2010 eyr:2024 ecl:brn\n", str "iyr:2017 byr:1974\necl:hzl cid:243 pid:66053995 hgt:147 eyr:1920 hcl:z\n", str "iyr:2012 byr:1962 ecl:brn pid:773399437 hcl:H341e13\neyr:2026\n", str "pid:738442771 hgt:186cm eyr:2027 hcl:Hefcc98 iyr:2013\necl:brn byr:1928\n", str "pid:855794198\necl:oth\nhgt:67in\ncid:81\niyr:2011 hcl:Hb6652a eyr:2020\nbyr:1921\n", str "hcl:176abf hgt:161in\nbyr:2002 iyr:2016 eyr:2027 pid:639047770 ecl:brn\ncid:178\n", str "pid:335686451\nhcl:H86c240 iyr:2017 hgt:190cm byr:1968 ecl:amb\n", str "hgt:150cm\nhcl:094a87 ecl:H09c463 eyr:1926 pid:537511570 byr:2009\niyr:1998\n", str "hgt:74in\npid:927963411\neyr:2026 ecl:gry cid:323 iyr:2012 hcl:Hfffffd byr:1959\n", str "iyr:2018 byr:1978\nhcl:Hff1829 eyr:2023\npid:823129853 ecl:hzl\nhgt:65in\n", str "pid:189cm\necl:H00391e hgt:72cm hcl:11050f\nbyr:2029\neyr:1994\niyr:1935\ncid:186\n", str "ecl:grn byr:1942 pid:217290710 hgt:181cm eyr:2021 hcl:H7d3b0c iyr:2019 cid:320\n", str "byr:1983 iyr:2013 cid:122 hcl:Hceb3a1 eyr:2030 hgt:59in ecl:grn pid:946451564\n", str "ecl:amb\ncid:236 hgt:184cm\nhcl:Hcfa07d iyr:2017 pid:934730535 eyr:2021 byr:2002\n", str "byr:1950 ecl:hzl eyr:2030 hcl:H623a2f pid:742249321\nhgt:158cm iyr:2018\n", str "byr:1946 eyr:2021 hcl:Ha97842 pid:204671558 ecl:grn\niyr:2010 hgt:187cm\n", str "hcl:Hb6652a pid:528124882 hgt:162cm byr:1924 ecl:amb iyr:2027 cid:157\neyr:2028\n", str "hgt:180cm iyr:2013 byr:1926 pid:232265934 hcl:H602927 ecl:oth\n", str "byr:1984 ecl:brn\niyr:2016 pid:756596443 eyr:2030 hcl:H7d3b0c hgt:183cm\n", str "hgt:185cm\nhcl:Hfffffd byr:1991 eyr:2023 iyr:2014\necl:amb\npid:759105859\n", str "cid:82 iyr:2012 hgt:160cm eyr:2022 pid:593798464 ecl:gry hcl:H4e7571 byr:1983\n", str "pid:478427550\niyr:2010\necl:amb byr:1969 hgt:68in cid:94 eyr:2021 hcl:H866857\n", str "ecl:amb iyr:2019 byr:1986 hgt:170cm\nhcl:Hc0946f\npid:779205106 eyr:2027\n", str "ecl:brn eyr:2025 byr:1925\nhcl:H7d3b0c hgt:76in pid:576353079 iyr:2010\n", str "hgt:175cm hcl:4bf5ae ecl:amb\neyr:2029 pid:173cm cid:329\niyr:1952 byr:1972\n", str "ecl:grn\neyr:2030\niyr:2015 hcl:Hc0946f\nbyr:1989\nhgt:178cm\npid:287209519\n", str "pid:834505198 byr:1985 ecl:gry eyr:2024\ncid:295 hgt:169cm iyr:2017\n", str "hgt:170cm\npid:054644831 eyr:2023 iyr:1949 ecl:amb\nhcl:H888785\nbyr:1955\n", str "hgt:171cm\npid:947263309 iyr:2015 byr:1944 eyr:2027 ecl:grn cid:79 hcl:H341e13\n", str "eyr:1982\ncid:147\niyr:2015\nhgt:70cm hcl:a77c10 ecl:zzz byr:2007\npid:161cm\n", str "ecl:gry byr:1933\nhcl:Hc0946f pid:483275512 iyr:2012 eyr:2025 hgt:161cm\n", str "eyr:1985 hgt:176cm hcl:7b6ddc iyr:2012 cid:326 byr:1973 pid:929418396 ecl:gmt\n", str "ecl:gry\nbyr:1971\nhgt:184cm\neyr:2027 hcl:H3adf2c iyr:2017 cid:210\npid:693561862\n", str "eyr:2021 pid:779298835 byr:1921 hgt:193cm ecl:amb\niyr:2016 hcl:Hceb3a1\n", str "hcl:4a1444\nbyr:2019 iyr:2024 hgt:182in\ncid:87 ecl:H122264\npid:181cm\neyr:1927\n", str "cid:267 ecl:amb eyr:2020 byr:2000\nhcl:H18171d iyr:2012 hgt:190cm pid:18525759\n", str "ecl:oth byr:1988\niyr:2019 pid:660570833\nhcl:H866857 hgt:176cm\n", str "eyr:2030 hcl:H866857\nbyr:1967 cid:316 pid:560346474 iyr:2015\nhgt:160cm\necl:gry\n", str "ecl:hzl\niyr:2014 hgt:164cm hcl:H733820 eyr:2025\npid:106302413 byr:1920\n", str "iyr:2016 pid:515066491\necl:grn eyr:2026 hgt:179cm hcl:Hb6652a byr:1982\n", str "ecl:H7de6a0\niyr:2004 eyr:1955 hgt:154cm cid:138 byr:2004\npid:758934555\nhcl:a21980\n", str "pid:H2a21e0 ecl:H1b9b27 hgt:165in\nbyr:1998 iyr:2014 eyr:2032\n", str "eyr:2021 hgt:184cm pid:431054313 hcl:Hceb3a1 cid:109 byr:1977 ecl:blu\niyr:2011\n", str "pid:006339126 hgt:177cm\ncid:188 hcl:Ha97842\niyr:1959\necl:xry\n", str "byr:2000\necl:hzl eyr:2029\niyr:2011 hcl:H866857 hgt:74in\n"] | |
:p sum for i. BToI (isValid full_batch.i) | |
' # Part 2 | |
data Rule = | |
Exactly Char | |
Digit | |
Hex | |
Space | |
def isDigit (d:Char):Bool= | |
digits = "1234567890" | |
any for i. d == digits.i | |
:p isDigit 'a' | |
:p isDigit '2' | |
def match (rule:Rule) (char:Char):Bool = | |
case rule of | |
Exactly c -> (char == c) | |
Digit -> (isDigit char) | |
Hex -> (isDigit char || any for i. char == "abcdef".i) | |
Space -> (char == '\n' || char == ' ') | |
:p match Hex 'a' | |
:p match Hex '0' | |
:p match Hex 'z' | |
:p match (Exactly ':') 'z' | |
:p match (Exactly ':') ':' | |
def containsRuleSeq (needle:n=>Rule) (haystack:m=>Char) : Bool = | |
any for i:m. | |
nottoolong = (ordinal i) < (size m - size n + 1) | |
(all for j:n. | |
hj_true = ((ordinal i) + (ordinal j)) | |
hj = select nottoolong hj_true 0 | |
nottoolong && (match needle.j haystack.(hj@_))) | |
:p containsRuleSeq [Exactly 'b'] "a byr d" | |
:p containsRuleSeq [Exactly 'b', Exactly 'y', Exactly 'r'] "a byr d" | |
:p containsRuleSeq [Exactly 'b', Exactly 'y', Exactly 'd'] "a byr d" | |
def containsRuleSeqLL (needleL:List Rule) (haystackL:String) : Bool = | |
(AsList _ needleT) = needleL | |
(AsList _ haystackT) = haystackL | |
containsRuleSeq needleT haystackT | |
'Generate all the acceptable possibilities: | |
We don't want to have to actually extract and parse numbers so we will just make a structure of RuleSequenceAlternatives | |
valid_eg = str "eyr:2029 ecl:blu cid:129 byr:1989 iyr:2014 pid:896056539 hcl:Ha97842 hgt:165cm\n" | |
invalid_eg = str "eyr:20291 ecl:blu cid:129 byr:1919 iyr:2014 pid:8960056539 hcl:Ha7842 hgt:165cm\n" | |
-- Real show isn't defined on integers | |
-- https://github.com/google-research/dex-lang/issues/311 | |
-- This is a simple version that only handles up to 4 digits | |
-- and leftpads with 0 | |
def showInt (x:Int) : String = | |
D = "0123456789" | |
d1 = x `mod` 10 | |
d2 = ((x `mod` 100) - d1) `idiv` 10 | |
d3 = ((x `mod` 1000) -d2 - d1) `idiv` 100 | |
d4 = ((x `mod` 10000) -d3 -d2 - d1) `idiv` 1000 | |
(select (d4>0) (AsList _ $ [D.(d4@_), D.(d3@_), D.(d2@_), D.(d1@_)]) | |
(select (d3>0) (AsList _ $ [D.(d3@_), D.(d2@_), D.(d1@_)]) | |
(select (d2>0) (AsList _ $ [D.(d2@_), D.(d1@_)]) | |
(AsList _ $ [D.(d1@_)]) | |
))) | |
:p showInt 91 | |
def numSeqs (min:Int) (n:Type) : n=>List Rule = | |
for i:n. | |
(AsList _ digits) = (showInt (min + ordinal i)) | |
AsList _ $ for j. Exactly digits.j | |
:p numSeqs 1 (Fin 3) | |
:p numSeqs 97 (Fin 5) | |
aspace = (AsList _ [Space]) | |
' year | |
- byr (Birth Year) - four digits; at least 1920 and at most 2002. | |
- iyr (Issue Year) - four digits; at least 2010 and at most 2020. | |
- eyr (Expiration Year) - four digits; at least 2020 and at most 2030. | |
def validYear (code:(Fin 4)=>Char) (min:Int) (max:Int) (passport:String) : Bool = | |
field = AsList 4 $ for i. Exactly code.i | |
ndigits_s = Fin (max - min + 1) | |
digits_s = numSeqs min ndigits_s | |
any for i. | |
ruleL = field <> digits_s.i <> aspace | |
containsRuleSeqLL ruleL passport | |
validBirthYear = validYear "byr:" 1920 2002 | |
validIssueYear = validYear "iyr:" 2010 2020 | |
validEpirationYear = validYear "eyr:" 2020 2030 | |
:p validBirthYear valid_eg | |
:p validBirthYear invalid_eg | |
' - hgt (Height) - a number followed by either cm or in: | |
- If cm, the number must be at least 150 and at most 193. | |
- If in, the number must be at least 59 and at most 76. | |
def validHeight (passport:String) : Bool = | |
field = AsList 4 $ for i. Exactly "hgt:".i | |
cm = AsList _ $ [Exactly 'c', Exactly 'm'] | |
ndigits_cm = Fin (193 - 150 + 1) | |
digits_cm = numSeqs 150 ndigits_cm | |
valid_cm = any for i. | |
rule_cm = field <> digits_cm.i <> cm <> aspace | |
containsRuleSeqLL rule_cm passport | |
ndigits_in = Fin (76 - 59 + 1) | |
in = AsList _ $ [Exactly 'i', Exactly 'n'] | |
digits_in = numSeqs 59 ndigits_in | |
valid_in = any for i. | |
rule_in = field <> digits_in.i <> in <> aspace | |
containsRuleSeqLL rule_in passport | |
valid_in || valid_cm | |
:p validHeight $ str "hgt:150cm " | |
:p validHeight $ str "hgt:15cm " | |
:p validHeight $ str "hgt:76in " | |
:p validHeight $ str "hgt:77in " | |
' hcl (Hair Color) - a H followed by exactly six characters 0-9 or a-f. | |
def validHairColor (passport:String) : Bool = | |
field = AsList _ $ for i. Exactly "hcl:H".i | |
digits = (AsList _ $ for i:(Fin 6). Hex ) | |
ruleL = field <> digits <> aspace | |
containsRuleSeqLL ruleL passport | |
:p validHairColor valid_eg | |
:p validHairColor invalid_eg | |
' pid (Passport ID) - a nine-digit number, including leading zeroes. | |
def validPassportId (passport:String) : Bool = | |
field = AsList _ $ for i. Exactly "pid:".i | |
digits = (AsList _ $ for i:(Fin 9). Digit ) | |
ruleL = field <> digits <> aspace | |
containsRuleSeqLL ruleL passport | |
:p validPassportId valid_eg | |
:p validPassportId invalid_eg | |
' ecl (Eye Color) - exactly one of: amb blu brn gry grn hzl oth. | |
def validEyeColor (passport:String) : Bool = | |
colours = ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"] | |
fin = [str " ", str "\n"] | |
any for f. any for i. | |
(AsList _ needleT) = str "ecl:" <> str colours.i <> fin.f | |
containsL needleT passport | |
:p validEyeColor valid_eg | |
:p validEyeColor invalid_eg | |
def validPassport (p:String) : Bool = | |
validBirthYear p && | |
validIssueYear p && | |
validEpirationYear p && | |
validEyeColor p && | |
validPassportId p && | |
validHairColor p && | |
validHeight p | |
:p validPassport valid_eg | |
:p validPassport invalid_eg | |
:p sum $ for i. BToI $ validPassport full_batch.i | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'# Advent of Code 2020. Day 5 | |
DexLang, [Lyndon White](http://oxinabox.net) | |
https://adventofcode.com/2020/day/5 | |
This one is notable as it uses Effects in Part 2 | |
'## Binary Space Partition | |
data Partition = | |
Upper | |
Lower | |
def parsePartition (c:Char):Partition = | |
select (c=='B' || c=='R') Upper Lower | |
BoardingPass = {row:(Fin 7)=>Partition & column:(Fin 3)=>Partition} | |
def parseBoardingPass (x:(Fin 10)=>Char):BoardingPass = | |
{row=map parsePartition $ slice x 0 (Fin 7), | |
column=map parsePartition $ slice x 7 (Fin 3)} | |
x=parseBoardingPass "BFFFBBFRRR" | |
:p getAt #row x | |
:p getAt #column x | |
def part ((low,high):(Int&Int)) (side:Partition):(Int&Int) = | |
mid = low + ((high - low) `idiv` 2) | |
case side of | |
Lower -> (low,mid) | |
Upper -> (mid+1,high) | |
def (|>) (x:a) (f: a -> b) : b = f x | |
:p part (0, 127) Lower | |
:p part (0, 127) Lower |> part $ Upper | |
:p (part (0, 127) Lower |> part $ Upper) |> part $ Lower | |
:p part (44, 45) Lower | |
:p part (44, 45) Upper | |
def firstlast (d:Eq a) ?=> ((first,last):(a&a)) : a = | |
case (first==last) of | |
True -> first | |
False -> throw | |
:p firstlast (1,2) | |
:p firstlast (2,2) | |
def fullpart (bounds:(Int&Int)) (sides:n=>Partition) : Int = | |
firstlast $ fold bounds \si neobounds. part neobounds sides.si | |
:p fullpart (0, 127) $ getAt #row x | |
def getSeatId ({row=rowcode, column=columncode}:BoardingPass) : Int = | |
rowid = fullpart (0,127) rowcode | |
columnid = fullpart (0,7) columncode | |
rowid * 8 + columnid | |
:p getSeatId $ parseBoardingPass "BFFFBBFRRR" | |
:p getSeatId $ parseBoardingPass "FFFBBBFRRR" | |
:p getSeatId $ parseBoardingPass "BBFFBBFRLL" | |
full_data = ["BFFFFFFLLR", "FBBFFFFLRL", "BFFFBFFLRL", "BBBFBFFLLL", "FBBBFFFRLR", "FFBFBFFLLR", "FBFBFBBLLR", "BFBBFFFRLL", "FFFBFBBLRR", "BFFBBBBLRR", "FFBFBFBRRL", "BBFBBFFRLR", "BFBFBBFLRR", "BFFFBFFLLL", "FBBBFFFRRL", "BFFBFBBLRL", "BFBFBFFRRR", "FFBFBFBRLL", "FFFBBFBLLL", "BBFFBBBRLL", "FBFBBBFLRR", "FBFFFBFRRR", "FBFBBBBRLL", "BBBFFFFRRL", "FBFBFFBRLL", "BFBFBBFLLR", "BBFBFFBRRR", "FFFBBBFRRR", "FFBBFFBLLL", "BFBBBBBRLR", "BFBBFFFLLL", "BFFFFBFRRL", "FFFBBBFLLR", "BBFFBFBRRR", "BBFFFBFLRL", "BBFFBFBLLL", "FFBFBBFLLL", "BBBFFBFLRR", "BBFBFFFRLR", "FBFBBBBRRR", "BFBBBBBLLL", "BBBFFBBLLL", "BBFBFBFRRL", "BBFFFBFRRL", "BBFFFBBRRR", "BBBFBFFLLR", "FFBBFFBLRL", "BFBBBBFRRL", "FFBBBBBLLL", "FBBFBBBLRL", "BBFFFFBRLL", "FBFFBBBLRR", "FBBFFBFLRL", "FFFBFFBRRR", "FFFBFBBRLL", "FFBFFBBLLR", "FFFBBFBRRR", "BBFBBFFLRR", "FBBBBFBRRL", "BFBBFBFRRL", "FBBBBBBLRL", "BFBBFBFRLR", "FBBFFBBRLR", "FBBFBFFLRL", "FBBBBFFLLR", "BBBFFBBRLL", "BFFBFBBRLL", "BFFFBFBRLL", "BFBBFBFLRL", "BFBBBBFLRR", "BBFBFBBLRL", "FFBFBBFRLR", "BFBFFFBRRR", "BFFBFFBLLL", "FBFFFFFRLR", "FFBBFFFLLR", "BFFBFFFRRR", "FFFBBFBLRL", "BFFBBFBRLR", "BBFBFBBLLR", "FFFBFBFLLR", "FFBBFFFLRR", "FBBBBBFLLL", "FFBBBFBLLR", "FBFBFBFRRR", "BFBFFBBLRR", "FFBFFBBLRR", "BBFFBFFRLL", "FFFBFBFRLL", "FBBBBBBRRR", "BBBFFFFRLL", "FBFBBFFRLR", "FFBBBBFRRL", "BFBFBBFLLL", "BBFBBFBLRR", "BFBBBBBRRL", "FBBFBBBRLL", "FFBFFFFRLR", "FBFFBFFLLL", "FBFFBFFRRL", "BFFFFBBRLR", "BFFBBBFRRR", "BBFBFFBRRL", "BFBBFBFLLR", "BBBFFBBRRR", "BFBBFFFRRR", "FBBBFFFLLR", "FBBBBBBLLR", "BFBBBBFRLR", "FBBBFBBRLL", "BBBFFBBRLR", "BBFFBBFRRR", "BBBFFFBRLL", "FFFBBBBRRL", "BFFFFBBRRL", "FFBBFBFRRL", "BFFFFBFLRL", "FBBBBFBRLL", "BFFBBBBRRL", "BFFBBBBRLR", "FBBFFBBLRR", "BFBBFFBLLR", "BFBBFBFRRR", "FBFBFFFLRL", "BBFFFFBRRL", "FBFFBFFRLR", "BBFFFFFLLR", "FBFFBBBRRL", "FBBFBFFLLR", "FBBFFFFRLR", "FBBBBFBRLR", "FBFFBFFRLL", "BFBFFBFRLR", "BBFBFBBLRR", "FBBFBFBLLR", "FFBFFBFRRL", "BFFBBBFRLR", "FBFBFBBLRR", "FBFFBBBLLR", "FBFFBFBRRL", "FBBFBFFRLR", "FBBBFBBRRL", "FFFBFFBRRL", "BBFFBFFLRL", "FBBFBBFRLR", "BFFFFFBRLL", "FBBFFFFLRR", "FBBBBFFLLL", "BFBFBFFRLR", "BFFFFFBLRL", "FFBFBBFRLL", "BFBBFBBRRR", "FBFFBBFLLR", "BBFFBFBLRL", "FFFBFFBLLL", "BFBFFFFRLL", "BBFBFBFRLR", "FBBFBBFRRL", "BFBFFBBRLL", "FBFFFFBRLR", "BBFFFFFRRL", "BFFBBBBLLL", "FFBBBBFLRL", "FBFFBFBRLR", "FBBFBFFLLL", "FBBFBBFLRR", "FFBBFBFRLR", "FFBBFBBLRR", "BFFBBFFLRR", "FFFBBBBLRL", "BFFFFFFRRR", "FBFFFFBLRR", "FBFBBFBRLR", "BBFBFFFRRL", "FBBFBFBLRL", "BFFBFFBRRL", "BFFFBFBLRL", "FBBBFBFLLL", "BFFFBFFRRL", "BFFFBBBLRR", "FFFBFBFLLL", "BBFFBFBRLL", "BBBFFFFRRR", "BFFFFBBRLL", "BBFBFFBLRL", "FBFFFBBLLL", "FFBBBFBLRL", "BBFBBFBRLL", "FFFBBFBRRL", "BFFBFBFLRR", "BBFBFFBLRR", "BBFBBBBRLR", "BFBBFFBLRR", "FBBBFBBRLR", "BBFFFBFLLR", "FBFFBBFRLR", "BFBBFBBRLL", "BFBBFFBRLL", "FFBBBBBRLL", "BBFFFFBLLR", "FBFFFBBRRL", "BFBFFFBLRL", "FBBBFFBLLR", "BBFBFBBRLR", "FBFBFFFRRL", "BBFBFFFRLL", "BBFBFFFLRR", "BFBBFFFLRL", "FBFBFFFRRR", "BFBBBFBLRR", "FBBFFFFRRR", "BFBFBBBLLL", "BFFFFFBRRL", "BBFFFFBLLL", "FBFFFFFLLR", "BFBBBFBRLL", "FBBFBBFLRL", "FFFBFFFRLL", "BBFBBFBLRL", "BFFFFBFLLR", "FBBBBFBLRR", "BFBFFFBLRR", "FFFBBFFRRL", "BFBFBBFRRR", "FBFFBBBLLL", "FBFBFFBRRR", "BBFFFFBRLR", "BFFBFFFLLR", "BFBBFFBRLR", "FFBBFFFLLL", "FBBFBFFRRR", "FBFFBFBLLL", "BFFFFFFRRL", "FFFBFBBLRL", "BFBFFBBLLL", "FBBFBFBRRR", "FBBBBBFLRR", "FBFBFBFLRR", "BBBFBFFLRL", "FBBBFBFLRR", "BBFBBBFRLR", "BBFFBBBLRR", "FFBFBFFRRL", "BBBFFFBLLR", "BFBBFBFLRR", "FFBFFFBRRR", "FBFBBBBRLR", "FBBFFBFLLL", "FBBFBBFRLL", "FFFBBFBLRR", "FFBBFFBRLR", "FBFBBBFLLR", "FBFBFBBRRL", "BFFBBFBLLL", "BFBFBFBLRL", "FFBFBFBLRR", "FBFFBBFRLL", "FFBBFBBLRL", "BFBBFBBLRR", "BBFFBFFRRL", "FBBFFBFRLR", "BFBFBFBLLL", "FBFFFFBLLL", "FBFBBFBRRR", "FFFBFFBRLR", "BBFFBFFLRR", "BBFBBFBLLR", "BFFFFFBLLL", "FBBFBFBLLL", "FFBFBBFRRR", "BBFBFFFLLL", "FFBFBBFLRL", "FFFBFFBLRL", "BFFBFFBRLL", "FFFBFFBLRR", "FFBBFFBRRR", "BFBFBBBRRR", "BFBFBFFLLL", "FBFBBFFRLL", "FFBFFBFLRL", "FBBFFFBLRR", "BFBBFBBLRL", "FBFBBFBLRR", "FFBFBFFLLL", "FFFBBBFLLL", "BFBBFFFLLR", "BBFBFBFLLR", "FBFFBFBLLR", "BFBBBBFRRR", "FBBBBBFRLL", "BBFBFBBRRR", "FBBFFBBRRR", "FFFBBBBLLR", "BFFFFFBRRR", "BFFFFFBLLR", "BFFFBFBLLR", "BBFFFFFLLL", "BFBFFBBLRL", "BFFBBBFRLL", "FBFBBFBRLL", "FFFBBFFLLL", "FBBFFBBRLL", "BBFFFBBRLL", "FBBBBFBLLR", "FBBBBBBLRR", "BFFBBFFLLL", "BFFBBBFLLR", "BBFFBFBRLR", "BFFBFBFLRL", "FFBBFFBLLR", "BFFFBFFRRR", "FFBBFFFRLR", "BFFFFBFLLL", "BBFFBFFRRR", "BBBFFFBLRL", "BFFBBBFRRL", "FFBFFFFRLL", "BBBFFFFLLL", "BBFFBBBRRL", "FFFBFFFRRL", "FBFBBBFLLL", "BFFFBFBRLR", "FBBFFBFLLR", "BBFFBFBRRL", "FBFFFBFLRR", "FFBBFBFRRR", "BBFBBBFLLL", "BBFBBFBRRR", "BFBFFFFLRL", "FBBBFBBLLL", "FFBFBFFRLL", "FBFFBBFLRL", "BBFFBBFRLR", "BFFFBBBRRR", "FBFBBBFRRR", "FFBBFBBRLR", "FFBFBBBRLL", "BFBBFBFLLL", "FBFFBFFLRR", "BFBFBBFRRL", "BFFBBBFLRL", "BFBFFBBLLR", "BBBFFFBRRR", "BFFFBBFLLR", "FBBBBBFLLR", "FBFBFBFLRL", "FFBBFFFRRL", "BFBFFBFLRR", "FBFBFFFLLR", "BFFFFFBRLR", "BFBFFBBRLR", "BFBFFFBRLR", "FBBFBFBRLL", "FFBFFFBLRL", "FBFFFFBRRL", "BBBFFBBLLR", "BBFFFBBLLR", "FFBFFBFLLR", "FBFFFFBLLR", "FBFBFBBLRL", "FFBBBFFRRL", "FFBFFFFLLL", "FBFFFFBRRR", "BFBBBFBRLR", "FBBFBBFRRR", "FBBFBFBLRR", "BFBFBFBLRR", "BBBFFFBLLL", "FFBFBFBLLL", "FFFBBFBLLR", "BFBFBFFLRL", "FFFBBBBRRR", "BBFBFBBLLL", "FBBFFFBRRR", "BFBBFBBRLR", "BFFBBBBLRL", "BFBBBBFLLL", "BFBFFBFRRR", "BFFFBFFLRR", "BFBBFFBRRR", "BFFFBBFRRL", "BFFFBBFRLR", "FBBFFBBLLL", "BBFBBFBLLL", "BBBFFBFLRL", "BFBBBFBRRL", "BBFBBBFRLL", "FBFBFFBRRL", "BFBBFBBLLR", "BFFBBFBLLR", "FBBBFBFRLR", "FBBFFFBRLR", "BBFBFFBLLL", "FBBBBBFLRL", "BBFFFBFLRR", "FFFBFBBLLR", "BBFBBBFLRR", "FFFBBBBRLL", "FBBBFFFRLL", "FFBFBFFRLR", "FBBBFBBLLR", "BBBFFBFRRR", "BFFBFBFRLR", "FBBBBBBLLL", "FFBFBBBRRR", "FFBBFFBRLL", "BBBFBFFRRL", "BFFFBFFRLR", "BFFFBFFRLL", "BFBBBFBLLL", "FBFBBBBLRR", "FBBFBBFLLL", "FBBFFBBRRL", "BBFBFBFLLL", "FBBBFFBRLL", "FBBFBFBRRL", "BFFFFFFRLR", "BBFBFBFLRL", "FFBBBFFRLR", "FFFBBBFRRL", "FBFFFBBRLL", "FBBFFBBLLR", "BFBFFFFLRR", "FFBFBBBLRL", "FFBBBFBRRR", "BBFBFFBRLR", "FBBBBBFRRL", "FBFBBFBLLR", "BFBFBBFLRL", "BFBBBBBRRR", "BFBBBBFLLR", "FBBFBFFRLL", "FFBBBFFRRR", "FBFFFBFLLR", "BBFFFBFLLL", "FBFFFFFLLL", "BFFBFBBLLL", "FFBBFFBRRL", "BBFBFFBRLL", "BBFBBFBRLR", "FFFBFBFRLR", "BFFBBBBRLL", "FBFFBBFLLL", "BBFFFBFRLL", "FBFFBBFLRR", "BFBFFBFRRL", "BFFBBFBRRR", "FBFBBFFLRL", "FFFBBBBLRR", "FFBBBFFLLR", "FBFFFBFLLL", "FBFBFBBRLL", "FBFFFBFLRL", "BBFBBBBLRR", "FFBFFFBLLR", "BFFFFBFRRR", "FBFFFBBRLR", "FFBBBFBRRL", "BFFFFBFLRR", "FBBFFBFRLL", "BBFBFBFRRR", "FBFFFFBRLL", "FFBBFFFLRL", "FBFFFFFRRR", "BFFFBBFLRL", "FFBBFBFRLL", "FBBBBFFRRR", "FBFBBBBLLR", "FFBBBFBLRR", "FBFFFFFRRL", "BFBFFFFLLL", "BBFBFBBRLL", "FBBBBFFRRL", "FFBFFBFRLR", "FFBBFBBRRR", "BBFBBBBRRR", "BFFBFFFRLL", "BFFFFFFLRR", "BBFFBBFLRL", "FFBBFFFRRR", "BBFBFBFLRR", "FFBFFFFRRL", "FBFBBFFLLR", "FBBBFFBRLR", "FBFBBBFLRL", "BFBFBFFLLR", "FFFBFFFLLR", "FBFFBFBRRR", "BFBBBBBLRR", "BFFBBBBLLR", "BBFFFFFRLR", "BFFFFBBLRR", "BFFBBFFRRR", "BBFBBBBRRL", "BFBFFFFRRL", "FFBFBBBRRL", "FBFFFBFRLL", "FFBFFBBRRR", "FBBBFBBLRL", "FFFBFFFRRR", "FBFBFFBRLR", "FBFBFFFLRR", "FBFFBFFRRR", "FFFBFBFRRR", "FFBBBBBRRL", "BFBBBBFRLL", "FFFBFBBLLL", "BBBFFFBRRL", "FFBFBBFLRR", "FBBBFFFLRR", "BFFBBFBLRL", "FFBFBBBLLL", "FBFBBBFRLL", "FFBFFFFLLR", "FFBFBFFRRR", "FBBFBBBLLR", "BFBFBFBRLR", "BFBBFFFRRL", "FBFBBFBLLL", "BFFFBBBLLR", "BFFBFFBLLR", "FBBBBBFRLR", "FBBBFFBRRL", "BFBFBBBLRR", "BFFFBBBRLR", "FBFBFBBRRR", "FBFBFFFRLR", "FBBFFFFLLR", "FFBFBBBRLR", "BBFBBBBRLL", "FBBBFFFLRL", "FFBFBFBLRL", "BBFFBBFRLL", "FFBFFFBLRR", "BFFBFFFLRR", "FBFFFBBLRL", "BFBFFFBRLL", "BFBFFFBLLR", "FFFBBBFLRR", "FFBBBFBLLL", "FFBBBBBLRR", "FBBBBFFRLL", "FBFFFFFLRL", "FBBBBFFRLR", "FFFBBFFLLR", "BBFFFFFRLL", "FFBFFBBRLR", "FFFBFBFRRL", "BBFBBBFLLR", "BFBFFFFRRR", "BFFBFFFRLR", "FFBBFFFRLL", "FBFBFBBRLR", "FFBFBBBLRR", "BFBFBBBRLR", "FFBFBBBLLR", "FFBFBFBRRR", "FBBBFFBLRR", "FBFBBBFRLR", "FBBBBBBRRL", "FFBFFFBRLL", "BFBFFBFRLL", "FFBBBBBLRL", "FBBBBFBRRR", "BFFBFBFRLL", "BBBFFFBLRR", "FBBFFFBRRL", "BFBBBBBRLL", "BBFFBFFLLR", "FBFFBBBRLL", "FBBBFBFRRL", "BFFFBBBRLL", "FBBBFBFRLL", "BBFFFFBRRR", "FBBBFBFLLR", "FBBBBBFRRR", "FFBFFBFLRR", "FFBBFBFLLL", "BFFFBBFLLL", "BFBFFFBRRL", "FFBFFBBRLL", "BFBBBBBLRL", "BFBFFBFLLR", "FBFBFBFRLL", "BFFBBFFLRL", "BBFFFFBLRR", "BFBFFFFRLR", "BBFBBFFRLL", "BFBBBFFRRL", "BBFFBBBRRR", "BBBFFBBLRL", "FBBBFFBLLL", "BFFFFBBRRR", "FBFBFFBLRL", "FBBFFFBLLR", "FFBFFBFRLL", "BFFFFFFLRL", "BBFFFBBLLL", "BBFFFBBLRR", "BBBFFBFRLL", "FBFBFFFRLL", "FBBBFFFLLL", "BBFFFBBLRL", "FBBBFFBLRL", "FFBFFBBLRL", "FFBBBFFLRR", "BBFBBFFLRL", "BFFFBBBLLL", "BBFBBBBLLL", "FFBFFFFLRR", "BFBFBBBRLL", "FFBBFBBRLL", "FFBBFFBLRR", "FBFBBBBLLL", "BFBBFBBRRL", "BFFBFFBRLR", "BFFFFBFRLL", "BBFBFFFRRR", "FFBBFBBLLR", "FFBFBFFLRL", "BBFBBFFRRR", "FFFBBBFRLL", "FFBFBFBLLR", "FFBBBFBRLR", "BFBFBFBLLR", "FFFBBBBLLL", "FBBBFFFRRR", "FBFFFBFRLR", "BFFFFBBLRL", "FFFBFFFRLR", "BFBFFBFLRL", "BBBFBFFRLL", "BFFBFFFLRL", "BFFBFFBRRR", "FFBBBBFLRR", "BBFBFFFLRL", "FBFBBFFLRR", "FBFFBFBLRL", "BFFFBBFLRR", "FBFBBFFRRR", "FBFBBFFLLL", "BBFFBBFLRR", "BBBFFBFLLL", "BFFBBBFLRR", "FFBBBBFRLR", "FBFFFBBRRR", "FBFFBBBRLR", "FFFBBFFLRL", "FBFBBBBRRL", "FBBBBFFLRR", "FBBBFBBLRR", "BFFBBFBRRL", "BFBBFFBRRL", "BFBFFBBRRR", "BFBFFFFLLR", "BBFBBBBLRL", "FFBBFBFLRL", "FBFFFBBLRR", "BFFBFBFRRL", "BFFFFBBLLL", "FBBFBBBRLR", "FFBFFFBRRL", "BFFFFFFLLL", "BFFFFFBLRR", "FFBBBFFLRL", "FBBBFBFRRR", "BFBBFBBLLL", "BBFFBBBLLL", "BFBBFFFRLR", "BBFBFFFLLR", "FFBFFFBLLL", "BFBBBFBRRR", "BBFBBFFLLR", "FFBFBFBRLR", "FFFBFBBRRL", "BFFFBBBRRL", "FBBFFFFRLL", "FFBFFBBLLL", "BFBBBFFLLR", "BBBFFBFLLR", "FBBFFBFRRR", "FFBFBBFLLR", "BFFBBFFLLR", "BFFBFBBLRR", "FBBFBBBRRL", "FBBFBBBLRR", "FBFFBBBRRR", "FBBFFFBRLL", "BFFBBFFRLL", "FFBBFBFLRR", "FBFFFFBLRL", "FBFFBBFRRR", "BFFBBFFRRL", "BBBFFBBLRR", "BFFFBBBLRL", "FFBBFBFLLR", "BFFBFBBRLR", "FBFFBFBRLL", "FFFBBBFLRL", "FFBBBBBLLR", "BFBFBBFRLR", "FBFBFFBLRR", "FFFFBBBRRR", "BBFFBFBLLR", "BFFFBFBRRR", "BFFFBFBRRL", "BBFFFBBRLR", "FFBBBFFLLL", "FBBBBFBLRL", "BFBFFFBLLL", "FFFBFBFLRR", "FBBFBFFLRR", "FBBFFFBLLL", "BFFBBFBRLL", "FBFFBFFLLR", "BFFFFFFRLL", "FFFBBFFRRR", "FFFBBFBRLL", "FBFBFBFLLL", "BFBFBFBRRL", "FBFFBFBLRR", "FFFBBBBRLR", "BFFFBBFRLL", "FBBBFFBRRR", "BFBBBFFLRR", "BFBBBFFRLR", "BFBFBFFRRL", "FBBFBFFRRL", "BFFFBFFLLR", "FFBFFBFRRR", "BFBFBBBLLR", "BBFBBBFLRL", "BBFFFFBLRL", "BFFBBFFRLR", "BBBFFBFRLR", "BFFBBBFLLL", "BBFFBBBRLR", "BBFBBBFRRL", "BBFFFFFRRR", "BBFFBBFLLL", "FFFBBFFRLR", "BFFBFFBLRR", "BBFFBFBLRR", "BBBFFFFLLR", "FBBBFBFLRL", "FBBFBBBLLL", "BFFFBFBLRR", "FBBBBFBLLL", "FFFBFBBRRR", "BFFBFBFLLL", "BFBFBFBRRR", "FFBFFFFLRL", "FBBBFBBRRR", "FFBBBBFRLL", "BBFBBBBLLR", "BFBBFFBLLL", "BFBFBBBLRL", "BBBFBFFRRR", "FBBFFFBLRL", "FBFFBBFRRL", "FFFBFBBRLR", "FBFBBFFRRL", "FBFBBFBLRL", "BBFBBFFLLL", "BFFBFBBRRL", "FBFBBBBLRL", "FFFBFBFLRL", "BFFBFFFLLL", "FFBBBBFLLR", "FFBBBBFLLL", "FBFBFFFLLL", "FFBFBBFRRL", "BBBFBFFLRR", "BFFBBBBRRR", "FFBBBFBRLL", "FFFBBFFLRR", "BBFFBFFLLL", "BBBFFBFRRL", "FBBFBFBRLR", "FBBFBBFLLR", "FBBFBBBRRR", "FBFBBFBRRL", "BFFFFBFRLR", "FBBFFFFLLL", "BBFBBFBRRL", "BFBFFBFLLL", "FBBBBBBRLR", "FBFFFBFRRL", "BBFFFBBRRL", "FFBBBBBRLR", "FFFBBBFRLR", "BBFBFFBLLR", "BFFBFBFRRR", "BFFFBFBLLL", "FBFFFBBLLR", "FFBFBFFLRR", "FFFBFFFLLL", "BBFFFBFRLR", "BBBFFBBRRL", "FFBBFBBLLL", "BFFBFFBLRL", "FBFBFBFRLR", "BFFBFBFLLR", "FBBBBBBRLL", "BBFBFBBRRL", "BBBFFFFLRR", "FBFBFFBLLR", "BFBFBFFRLL", "FFBBBBBRRR", "BFBBBFFLRL", "BFFFFBBLLR", "BFBBBFBLRL", "BFBBBFFRLL", "BBFBBFFRRL", "BFBFBFFLRR", "BFBBBBFLRL", "FBBBBFFLRL", "BBFBBBFRRR", "FFBBBFFRLL", "FFFBFFFLRL", "BFBBFFFLRR", "FBFFBFFLRL", "BFBBFBFRLL", "FFBFFBFLLL", "FBFFFFFRLL", "BFFBBFBLRR", "FBFFFFFLRR", "FBFBFBFRRL", "BBBFBFFRLR", "FBFBFFBLLL", "BBFFFFFLRL", "BFBFBBBRRL", "FBBFFBFLRR", "BBBFFFFLRL", "BFBBBBBLLR", "BBFFFFFLRR", "FFFBBFFRLL", "BFBFBBFRLL", "BFBBBFFLLL", "BBFFBBBLRL", "BBFBFBFRLL", "FFBFFBBRRL", "FBFBFBBLLL", "BBFFBBBLLR", "FFBBFBBRRL", "FFFBFFBRLL", "BFBFFBBRRL", "BBBFFFBRLR", "BFBBFFBLRL", "FFFBFFBLLR", "BFFBFBBLLR", "FBFBFBFLLR", "BFFBFFFRRL", "FBBFFBBLRL", "BBFFFBFRRR", "FFBFFFFRRR", "BFFBFBBRRR", "FBFFBBBLRL", "BFFFBBFRRR", "BBBFFFFRLR", "BFBFBFBRLL", "FBBFFFFRRL", "BBFFBBFRRL", "BFBBBFBLLR", "FFBFFFBRLR", "FFFBBFBRLR", "FBFBBBFRRL", "BBFFBBFLLR", "BBFFBFFRLR", "FBBFFBFRRL", "FFFBFFFLRR", "FFBBBBFRRR"] | |
:p maximum $ for i. getSeatId $parseBoardingPass full_data.i | |
' ## Part 2 | |
Find the seat ID that doesn't occur, and isn't right at front or back | |
This would be easy if we had a set. | |
But with only an array it is too slow | |
But we can make a BitSet out of an array | |
and the SeatId tells us which bit to set. | |
But to do this we are going to need to do code with effects. | |
So that we can set elements in that bitset. | |
' This is the number of cells we will need | |
num_seats = getSeatId $ parseBoardingPass "BBBBBBBRRR" | |
all_possible_seats = for i:(Fin num_seats). False | |
taken_seats = snd $ withState all_possible_seats \takenRef. | |
for i. | |
seat_id = getSeatId $ parseBoardingPass full_data.i | |
takenRef!(seat_id@_) := True | |
' now we need to find the first false that occurs after a true | |
data SearchState = | |
NotStarted | |
Active | |
Finished | |
myseat = snd $ fold (NotStarted, -1) \i (state, found). | |
cur = taken_seats.i | |
case state of | |
NotStarted -> (select cur (Active, found) (NotStarted, found)) | |
Active -> (select cur (Active, found) (Finished, ordinal i)) | |
Finished -> (Finished, found) | |
:p myseat | |
:p taken_seats.((myseat-1)@_) | |
:p taken_seats.(myseat@_) | |
:p taken_seats.((myseat+1)@_) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'# Advent of Code 2020. Day 6 | |
DexLang, [Lyndon White](http://oxinabox.net) | |
https://adventofcode.com/2020/day/6 | |
def asindC (c:Char):Fin 26 = | |
(I8ToI ((codepoint c) - (codepoint 'a')))@(Fin 26) | |
:p asindC 'a' | |
:p asindC 'z' | |
-- copied from the plotting branch | |
def str (n:Int) ?-> (s:(Fin n=>Char)) : String = AsList _ s | |
full_data = [str "necytxmlfhsu\nuecosjvlhpmk", str "mnslbuziphawkxyg\nwhpmnesikaglzb", str "kaw\nakw", str "qurg\nhrqug\nqrgu\ngruq", str "sczomkv\nzejkhvslmucbwdo\npxsianovzcmk\ntcokmvsyz\nozskvimcr", str "tfzajkxngwsqrbleic\ntijoqnerxsplwzgabkfc\nogkezbiwqtaxrscljfn\nxsqauezwnjckbtgiryfdml", str "piz\nzip", str "tlp\nnpl\nlpt", str "idbnxuclqgw\nsxfdnlatmbhcowigj\nplzgbwdqkcinx\nydxinwgcblr", str "nbuxjwhsrlekfyzpq\nkecyiurjfvqpbxhzsn\nnkxfhpbsuyrqjezom\ntinlhkbjsuydrqpzexf\npnzraelgquxhydsbjkf", str "obvmw\neoczsqun", str "nhdxqwk\ndnzmlxwhkapq\nwhxqdnk", str "jnqdabgc\nnacqdbgj", str "buyskiwz\nuazbkwys", str "mbfxswpli\nuswalhxz\nxnq\ntdcrjgoyekv", str "fancdpkmtuqy\nzdmenqjpaxftuy", str "jkul\nd\no", str "vhpoxgqsrtce\nhgopxeqcdrstv\nxcvrqoetpsgh", str "gekpzayfux\npyegazxukf\npkxaezhgyfu\nfegypukaxz\nzxpyefugka", str "yrpfd\nydsh", str "smjqcafnug\nmnicqsu", str "tkxi\nixakt\ntfncxkmi", str "kedibluzopjhagvtxf\nafiklbvtjeoudhgpzx\nlavbxpjzgedktoifuh\ntbgpaxjqeoifvklhzud\nzghidtfplxbvkoueja", str "gtvnqyrmf\nhogpb", str "cnelsqwj\natyimdbvfxuozkg", str "lgybpaeztvhrxducjiqosmnwk\nivpaygxweszductombhljrqk", str "grli\nlrig\nsjglri\ngirl\nrigl", str "qnwmxjbpecoyztufidhsg\nynqdiwhmusgtebjfzxcpo", str "luasrtmfkgywv\nvgskmufywrat", str "ceyux\nycux", str "nurijfsovkbxdp\nayqclmthgzwe", str "xeqjdhsubiovwrg\ngobdjqwvusehrx\nweqjgvhosudrbx\nngdubsvqxejrhow", str "ywdfqpxekujbovr\nyujfdoqbkxrepvw\nowfkudjbvyrxqep\noqjvedypxukwbrf\nxufwdpebyjrqokv", str "csujqndzmw\nwznscqmjud\ncqpwjzmunda\nwjumnzcqd", str "dhsow\nohswd\nwsnogh", str "cxfltiq\nixztfq\ngtfqiux\njtqfxi\nxiftzq", str "tr\nrt\nrt", str "pnuztcbegwiksd\ncuewibkptdnm\nnvqdpcjxekiwtauhofb\npbytreinuwdkc", str "y\ny\nhejq", str "rvmwqn\nwvrmq", str "knxmwecsjlrft\nhnmwzaqt\ndmywnitg\ntmwvquonh\nbwqvtmnh", str "e\ne\ne", str "qjtywgdlek\nnhifs\nzvxinh", str "nzhroemi\ndzruoegimh\nemzoirh", str "hpfkraltbxg\ngazxlmphrt", str "jyhugbxqz\nzbnox\nepdilfaw", str "vmr\nvsfm\nfmvsr\nmnvckiaqy", str "zegpfuwtkrnoqdh\neorznfkgpduth\ntkfpzhnredguo", str "zmqkwxipctney\nncwzeqpmkiytx\nyptienwzxkcqm\nyeqwcpxtkzmin", str "csbdyzl\nejoiwtzqabm\nlzbkup\nzbvprxf", str "wvpshngbmiftuzrxoyde\nszobihvwpdtylqerc\nphbdzoikvtajyesrw", str "ymuflnrxspqvkihbe\neymxrhlfnqksuivbp", str "rktwzd\nwtdkzir\nwkmaziqdrt\ntogpzwdkr", str "uwiazbylcpojst\nlcyibajuptwzso", str "dtoqbcxhlyrpfwjnkasugvm\nwunkfstmcjhqxliogrdvpy", str "wpnk\nhdpkwuftjymv\ncpkownz\nkpwz\nrqpwnk", str "tfplznqcju\npuqlsnzfjtv\njqtfpzlun\nntqpczjflu", str "ozalwumpqv\nztheoalrwsciyk", str "wyiqbsr\nbysqwri\nyrbswiq\niqwrsyb\niwbrysq", str "elnroc\nzmjlre\nvhelbru\njyhruezflvk", str "ftyceboh\nofybh", str "jvlbdm\nnoakrg", str "dokjncqauebfpmszvtl\nsuebonpdjmflaqctkvz\ndtjzmcblsvokpunaefq\ntjzmeqkafluvpbconsd", str "qhrmvegsicnyupf\nuifknverhsg\nizlrvgefndjwasuh", str "syxvtjwfucilqogmnpk\njwkytpqofgimvcsnlxu\ndwhglcxzoqnmjfkuiyvpst\nygwntxipqlmvkufcsoj", str "hdnqaburow\nhqwadmbocsgue\nbwoqtuadh\nadqhbwuo", str "dzfohqe\nehfqzod\nfdzhoqe\nhdofzeq", str "sxmkrghyvlwzbc\nyhkmwzxbgsvlc", str "qdumkytwlfsrja\ndrfqukzymilsjaw\njkwqumylsardf", str "pcvs\nprvc\nhmbpvc\nsvrpzc", str "epkjyc\njerpoy\ngjpye\nabxepuyj\nejyopc", str "ohe\ngheo\neoh\nofehy", str "klhziowmjpyfubdsaqtgvrcn\naytbormdiksnqpzhcfvulgjw\nlhmvkafdrscjgwnyiuptqobz", str "vcrqpdxljnmgusie\ncgdwmipluoe", str "hqibentfmxyszljow\nmsozdjnibrfytxqhle\nimlyxwehznjsbft\nysifkzbljphuxcmenvt", str "vjhdmkrpecniafgqlstxyzb\nzxjrkebfvcwyqihlsmpgtd\nxrfzidgthsbklmveypqcj\nvjxytzgdlbefsirkcmpqh", str "dyxrwbngpijkt\nxtwkdipaygjr\niklrmzwpjxgdtuye\npdgrxyjkitw\nxtirhvwgdkjyp", str "zbjdt\njdat\nshouqjtxcd", str "klarpuiv\niqaxjdps\ncpnafbsi", str "xfpiourcst\novfrlutxpb\ntrgqfxjuop\nrsktucfpox\nrtufoqpx", str "g\ng\ng", str "nfutbyvj\numvwyi", str "tjniwlydzqpsxbkcmugf\nutpmixqdvzbfcwgljs", str "wetypdlnxm\ncfavwyzji\nmywgu\nlyorqkbw\nwhdeyxp", str "qsbnwozepvhkmaxdrt\nqmsopwtaznxfkehdyrv\nxnvhwrzpemkqdtsoa\nituvkrhmdegazwsobnxpq", str "fxhwdio\nhofdxi\nhivztfonxdg\nfhkoidx", str "ja\njca\najzxt\nahjy\ntajc", str "epan\npcn\nudn", str "mfowepjdlnkags\noakwgflnp\npnlzgoawfk\nkfgrowlnap", str "uw\naimwo\nwzrhcjeq\nwtf\nw", str "x\ntvx\nx", str "tigsjdufrwomv\nvjrstigqudohwkm\nvisrjodutwbmg", str "ety\nexatp\nhicfzqnb\nuvejo", str "oqlgmk\nkgvqxd\njzhgkpdqy\nikegfwatqub\nnlogqkz", str "sl\nq", str "rkpew\neqrwk\nrakwe", str "r\nr\nr\nrb", str "u\npua", str "pjmhtvd\ndrjnpuvib\ndjsplvy\ndpvj", str "caugyqs\nhxwyqst\nsougylqre", str "krfshpzjmgav\nuwrqidcotlbxhj", str "mzivctbfjgwq\nlsomkypgajiq", str "ikoamrpc\nkmociarp\nbrkmpiwycoa\nitmckrodpa\nkmipacro", str "htbpcdqx\nctpbxdq", str "gpduzcoiyxhleqrknbaw\nnirehbulapcoxkzwdy\nicuzyxopwhkalendrb\naokdrxhlcebpyiuwnz", str "yzlvptdaubjerkh\niyaoltghebpndkjszr\nkqxjtldzpbcyawh\ndbjtlavzmfhkyp", str "vg\nsv", str "cdiaynroehqw\ncqtaridyohewn\ndciornehwayq\nrwhnoaeqicdy\nwqroadniechy", str "ivstkj\nvgciqk\nqkivg\nvkgi", str "fp\npf\npf\nfp\nfp", str "xidyqnk\njbicfant\nzabfhin", str "oqtys\nstqyo\nsyqot\nyostq\nboqytws", str "gmnqxaictud\ntucidaxqnmg\npgtquxidcnma\niagdtcfmquxn", str "yfhxgw\nrgn\nnsog", str "wndrqktbmfa\nfwqadkrtbnm\nmabfntkqword\nqbwntakrmdf", str "elanoudxhbzfrtvci\nztalefiodxrubvckhn\nulvabcnthpdzxoifer", str "omdrvepliwafhjynbscu\nmblrxjsfahocwnvyu\numcjlsowatvnfybhr\nuahvcnbwlmsjzfoyr", str "n\ntn\nn", str "grk\nrgk\nkrg\ngkr\nrgkhv", str "stmlnek\npgsltne", str "alcztk\nbctvk\nkhcgtb", str "nsgevcthrpykbwfoizda\nkhneritgszvbfycaowdp\nivybwzeaogdsrnfctphk", str "e\ne\ne", str "cxkzdbgiqyawnm\nafyvkbeirtjowmcl", str "omb\np", str "lnhwcoiyafs\nsoihnyxqfc\nohncjyifsq", str "o\no\nom\noxqnsd\noaj", str "okucjhiq\nxpgwcnqjiomyfluk\nirhoukdsbjqc", str "uolgz\nnglczu\nzlngu\nzmhlgvjru", str "mhdapszf\nanmfwdvkc\ndpamf", str "aqleivtyzsogjc\nsyvbgxqpdflezoac\nilvzqsjaegokyc", str "zxndhja\nhaxzd\nxhazd", str "mo\nom\nmo\nmo", str "vfxep\nxfepv\nxevpf\nvexfp\npevfx", str "mrtkehqnjxizgp\nkbunrqytcmes", str "nz\nipneu", str "bznteo\ntbzeoqwp\nolftzbpk\ngrzvityxudohjma", str "xg\nrg", str "rdu\nurvd\nrud\nrzud", str "somnbutz\ntuosnmb\nntomsbu", str "fxsvrzqntbueoyp\neqzsvxyunbroptf\nzvypnrxfsqebuot\nzrosbxeqpunvfty\nzprtfvsnbquexoy", str "qwzknfvl\nfunqlwkj\nnqkwflz\nfgxlkwzqn", str "rzqihd\nrbz\nzr\nuzer\nrbz", str "utrq\nosa\npm", str "zgdci\nbrhu", str "bxvymlzqkpha\nvmhlakpyxq\nypxvqkmhal\nxhvpymaqkl\naplqvkhmyx", str "sjntbvyogeplwzu\nrbjqiefhapxodwk", str "frlsoptqwbc\nljrzxqntfom", str "zlhvjamtpfonk\nlcokjzdhmfvnp\nsiohzynkmbjvlrf", str "osvgwnticelpzm\njvswetpozlcg", str "npmgrvysfj\nnvqxrjfsgmp\nvofthkcjsblpmudizwr", str "oiev\nlmeiov\noiezyv\nuievodkac", str "iforupqjzykdtc\nyqfhdcxvtopz\ntzqpfdycgo\nceyqfozvtpd\ndpxqflohzyatc", str "srz\nzsrt\nstrz\nxzs\nsz", str "dgo\nodg\nogd\ndog\nqogd", str "gotwqhick\nokhqtgicw\ngsouwitkjcqh\nhctgioqwk\ntkghocwiq", str "mfnziwvxtlpubqryojasd\nmzojuctvnbriypwflskqda\npmuavqjifnlhrtbyzwods", str "ozj\njoz\nzjo\njzo", str "jzwbhrscm\nrzmhjctb\nzbrhcmj", str "sucgimtr\nmyliojcrsg\nipcsegxrmv", str "znhvi\nhvin\nwosganie", str "wptoqxmafhg\nawqfhgcozmtx", str "azbqlviyrwjc\nybxcrawv", str "qa\nvcuwbfgsl\nhkraj", str "biglkjtpoqs\nzvxcfumeywrhand", str "ske\ns\nsp\nhs", str "n\nyn\nn\nn\nn", str "lrvsmxzkgi\nzgrmkdsxl\nlzgmpakrs\nwgqtrkmsfz\nnirmkugzds", str "crewvjdqsplkibthxz\nwxjmtpirhalqsckbdz", str "iecxrbplho\nxhrpibovlce\nbrxlgchopei\ncbhioprexln\nlchxirebop", str "f\nf\nq", str "nxqkrhdi\npkhdrquxn\nynqdlxkh\nxghkndq", str "wvknrdjx\nvknxrwdm\nkfvicpwndb", str "rcqwlutsanpdz\nyoxenmkvbjf", str "izqsa\nsqzai\nzqsai\nosiazq\nizqsa", str "ysokhbpzcqanmdifw\nkdlowyusmqhbjxci\nhibkmzocndqswy", str "yjwd\nbgas\nyj\nk", str "tzruq\nuorz\nzckrvux", str "rjn\nnrj\nnrj\njrn\nnjr", str "ecu\npzus\nwokxu\nruw\ntwu", str "fcnajztduyripl\nchmpkvlynsxrauobji", str "cwfgtjre\nejwufr\nfrwje\nnewvryfjbhq\niwjextrf", str "ltqapiwhzfeoncxdg\nhndclgoxeiwtpqfz\ncwnpdogxteilfqhz", str "uerinxhsygpbzcdvfmo\nlxeihducozgqnrymb\nedmugnyxifoczrbha\nucezhnrsdybmiotgx", str "xuvfhjeyi\nztcgaqs", str "yxrospmijwvcdb\nyjpbrcosuv", str "viuhdrgnlak\nlniaruvkdgh\nkhrgdnuiavl", str "qfzxb\ngfqx", str "k\nnzyo\nkcj", str "bmi\nbmi\nimb\nimb\nubmi", str "pl\npl\npl\nlp", str "x\nv\nx", str "hgwtocs\ngdctwhoi\niczwfgtoxh", str "wrcjdaqm\nwsrlog\njrnqmcw", str "ouhmpnyskxcqafidbjvgt\ndnimvbpytfsoagucjx\njpctsmuxiaovyqnfdbg\ngzbvfwmojuyxsrdtpcna\nyxfolphstnabcmuvjgd", str "nlrdxe\nceksxuhazmjo\nywxedfgqtpr", str "ckuwoghtaxrledvzms\nmtksozduwvrehxclag\nxwvcusrmlazoetkdgh\nregwvshxkdzuctomal", str "khsnymbpjz\nhzknspmbj", str "zqc\nkpgsjrqxiyd\nwtbuhoq\nqwc\neq", str "ljewzy\nqlwjy\nwzljy\nlwyj\nljwy", str "vpodmhni\nbvryknfg\njcutez", str "wedfcoh\nwigfnjkaoz\nexwoqfm\npfuohsw", str "adyzjwgqxv\nqjwvxzagyd", str "cazpofbyd\nnodypfbcam", str "ukvrcslyqzamhteowdfibx\nktrgqpmnawdycsivhzlbefx\nfxdabuylcveksjwrmzqhtio", str "xyb\nxesy\nxdqcy\nyex\nxy", str "hotd\nodhzqt\nothd\nhtod", str "hvkc\nlzei\nasw\na\nd", str "q\nq\nq\nq\nq", str "a\na\na", str "suqbvedipgzcjykfmaxno\njzfudeoxikpbvmgynsha\niswkepmodzvfgxnylujba", str "xpqjonkzlrfhtyw\nfjqksrlozypwnmxth\npkrohjnxlfzyqtw", str "pxuhsc\nhcxsnu\nhxcse\ncxhws\nhcrsex", str "iglfosahy\nhizgfalodbs\nlgfoiahs\ngsfalhyio", str "xrgzwbdnohfeijacsmltqp\ndjpgqrimtwcafsxnlebzoh", str "qlrn\nqrn\nqrn\nqrn", str "xhbiakuzcjm\nnfpykow\nklfs", str "lcubkpfhnomgwyarjetqd\nwtcrgofdnlpbaykquevhj", str "bdqusvnyetklmwizcopxjr\ndrbxlptyeqcvjwiusmzokn\noqcjzvuwslkpedbxmrntyi\njvlnxtdpkusyczbeomqirw\nwltriuqnpzcxbysvojdmek", str "tyeorbzjdxpqn\noprlqdnwbzyx\nbrnydoqzxp", str "bupvcrylqazehoknjtf\naqfroczbylpvuejk\nubqvelyfrzoxcpagkj", str "awbzx\naxuw\nywildxoa\nuwxnba", str "mjfvro\nwmrfjov\nojvmursf", str "zwxouqy\nouzyw", str "dsxf\nsfdti\nsyrfd", str "zmibfjk\nkimbz", str "nebq\nbeqn\neqnb\nbqnpe", str "avtnckldjpeys\nscjtklpdneyav\nkytncdpsvaelj\ntkpacjysdnvle\ndycsvtjplenak", str "mkyojv\nbiwro\nbotsx", str "owxyu\nwyuxo\nyxwuo", str "qgjplcvo\nvgjqocpl\nojvlcpgq", str "xczvkuohisrfqbagp\nprbeilfzognvqws\nvoitfqpgjmrzsb\nrvlfdoqigsbpz\nipqogbrzfmsv", str "j\ns\nst\nt\npzde", str "kuwbthejxcfrzgosmn\nxwcukhrtsgzf\ntkfcguxwshrz\nhxukfzgdwsrqict\nzwucgkfqhvxtrs", str "wvthikzpgrjaf\nswdnemkqobcyx", str "lewoquaprbkxyj\nxpelwoaksubcrhqd\ngbrxmluktiwnaopqe\nepxuyczokafblwjrq", str "mcyepsvwxr\nbhe\nnqeztgd\nuaehil", str "tq\nbe\ne", str "duqgair\ndfrwuiqga\nqaugidr", str "hmofng\nhgnomf\nmofghn\ngmotfhn", str "ewhblqnsmjict\nwhmbxvpjs\nufzyaogdkr", str "jqpynazsfvklied\nsjilykvqza\nizsvjlqayk\nqiksvzlajy", str "vbps\nvbstp\nevnigorks\nvbst\njslv", str "qgdzylwkbfou\njbwygulq\nqwhxrugpeb\ngiqdfvbwu", str "jubto\naeuvgdpx\nunl\nyorqui\nuqm", str "ic\nkci\na\ni\ngyfe", str "tjxp\nxtj\nxjt", str "ldspeai\neapidul\npeiadl\nipelad", str "oymwvfriux\nmoxuywvfir\nrmvxwoujifyb\nfpvwdumgyroxzi", str "mcplvnkgjfz\nidszwngkfcvpl\nnjzfklgcpvo\nfcvokpnlzg", str "xdnsilr\nirnlsx", str "bndvimefz\natopdu\nxhswykcqgrjl", str "kvlorsye", str "vsdoq\ndvos\nvodjs", str "bxczyfeajkmloi\njcimfkaloybxze\nceijaokfzyxmlb\nfeymoacbjxikzl\nkcxmiebzyaoljf", str "lo\nol", str "etxkfsgjlqoy\nfgshieyj\nesywfgj\ngwrjsyepf", str "jtzlgakxins\ngqlznxfabskijp\nikaxgsnzljh\nlgaizhkjxns\nhgaznkjxtlis", str "urhjiycw\nrhycisw\nzrwihkcy", str "xc\ncvx\ncx\ncxgl", str "audxneqrchg\nefkmodwqplrzsiyb", str "g\nx\nx", str "ziuplaqo\nczqtihuw\nzufiq\nnqzubpixak", str "cibdku\ndbckiu\nkdciub", str "eshpjzgtwrka\ntgwpafmsjkrehz\nsekbwtnxjhpzrag", str "dj\ndm\ndj", str "trqkdpwoxjfyg\ncsu\nancv\nlui\nebhmaz", str "ljbvexnhgwfs\nhfjbxneyilwgu\nznejqblcdhfgwx", str "b\nb\nb\nb\nb", str "idxrcyjegnu\nlrhvskceg\nrozwmgafbce", str "gzasrwjlukomvdxhbpc\ncahmgzurlvpwxbdjs\nuxjzsbgmdlchvprwa\nhramvdjxslubpzgcw", str "gw\nwge", str "fpgdzy\nwpfdbz\nzpfahde\nlfdpszcorx\nzfdgbqpha", str "gfuclekqavitdxr\neuwkvdirqtcxa\nriuxvaqkcdte", str "eqaphotimfdrukcgwbyx\ndxtowkygamibqcrfeuhp\noiutpbavhdyqergfcmxws\nahcteowdfrkugpibqjymx", str "pmixjle\nuxljemp\nlkpsej", str "mzqcwxuo\nxoucwzmq\nxcumzqsow\nzcuqxmwo", str "wt\nwt", str "tyrajn\nhdtgroynjae\njrnyat", str "uqifnlv\niqnevl\nvqienl\nnavciql", str "qjxpshtuzbmfnvogcalw\nskvzqthufxcjeagrmdiwlyb", str "lvaftw\nvkfaywtl\nlfvawtq", str "wpusqdfkybg\nmghtdxkpsur\ndsgxhumpk\njmdkpzrsixug", str "qcbalvykixze\nfmrhcsadlnio\ncpautjihl\nclgainupm\nilcaft", str "pklutwg\ngdpkrl\nlrpkg", str "wbup\nbygfurw\nubw", str "xsoqjceyhunvat\njshgokqucxvlyn", str "pyk\npyk", str "l\ns", str "m\nm\nhm", str "msultwhivz\nvzitlhwmus\nhtsmluvzwi\nihszwmvult\niwthzsumvl", str "wlohkegqpb\njzguytqrncd\nigqvesfa", str "h\nhgy", str "xb\nx\nx\nx\nx", str "ij\nji\nhqdl", str "k\nk\nfkswyr\nzk", str "frvpln\nvfcnlpr\nvfnrlp\nrnpvfl", str "ouy\nyu\nuy\nyu\nyug", str "rhekb\netnxfymlgdwovqzu\ncsbheji\nbeca", str "vj\nnfpv\nv\nv", str "ruvqehmija\nmdhjqrayuie\nksqrfgjeihpmlu", str "kbsnlqxfrizjauthodp\nuxdjbqniholafzrskt\neaokjungrdfshlbtzqix\nwjlsbciontzkdqfxhuar\nqjlosubzkfitnahrdx", str "sbzcefm\nzsmb\nszmb\nmszb\nsmzb", str "xzisbpmc\nprihnxstmfzb\nklpbmszijxw\nvmepbiszxaq\nzipmjbxvs", str "qjgbnvamedwi\nqajzdoksweb", str "gtkfqwlzashcen\ngeiqzsnhkfwctv\nesnmhfzgqutpwyk\nigselxqndbfwthkz", str "obpdyswkvthxgreanmjluq\nlahobnkyxtdrqgseuvcj", str "pw\nwpe\nylp\nep", str "owrlgniy\niljkvwxyhopufzsqdc", str "wxzgdpt\nsaxprdtkf\nqdxjotpgbwl\nxtdhjpl\nutdjphxci", str "gwkrjnizdxbvc\nhfnpygvaw\nygvutnaw", str "pecfzghqxturdijsblmk\nklsxuqpfhdbctrjgemzi\ndtuzljfxhmbgciqkeprs", str "iznfycwdrh\nzwnrchiydf", str "xutwndim\nosidj", str "knwyjicb\njc\nzjgc\ncju", str "jwtep\nhjer\negj", str "khwsitfnxyep\niwkpnxeh\nwephiklnx\nhcigwzkapxremn\nnwehmapkxib", str "vuqbmineogja\ndlrpainmvugj\nravsmgijfcuhynt\nawvpiunjmg", str "zdcalubhniv\nnclhvibudaz\nvhcdbuznila", str "bzcaorhqflg\njteyvpwsuxdnik", str "icr\nrvic\ncri\nric\nric", str "bqikw\nibwqk", str "ipxdcvmfulwejyg\nnqcelgydaskrxhi", str "pkovrgdljyh\nvq\nixwv\nvsxaczn", str "ix\nxi\nix", str "hkxl\nhklx\nuxlkcsvgeh\nkhlyjx\nblkxh", str "lhgcae\nyczfas\nconasulj\nxgbflezcuayo\nmvcidtapr", str "iwaepxckbvjnzmqft\npwiancxtmufqsvzj\ncpanmiftxjwqzv\nmhftvjnxzpowciqa", str "ir\nrd\nir", str "xt\nxt\ntx\nxtk\ntx", str "rdatjzibwsu\nmdsuarwtizjb", str "rselwj\nwetbjy\npzxqjowe\nnjtgbvwmei", str "qgcazvn\ngqsvcnz\nvczgqn", str "vmufbi\nefuinvmq\nuicgmkvr\nvnmilu\nubvwmix", str "lseymvjuidhkoptazcxrw\nwnbsukhpjoedczrlavgtmf\nscmrptkhdeazojwvquly", str "qopb\nevwqyl", str "syuzojncfrliwap\nwnocfplirjzsa\nizwrhvftqbdgpcjoasln\nljiznraspxofwc\nrzcpanjowslif", str "lpebrhxtam\niyuvknwfso", str "by\nyb", str "qshtypdlocawvgjb\nxvyrnwfqezshjoka", str "xhw\nnwhx\nhwx\nwhsex", str "xelcghsquwivjydnrzkbfpa\nelviwcpnsokhjqubgadxyzfr\ndcfqxvneymsutzkrlpgbjiwah", str "ghckb\nbgh", str "rdojuvqncia\nnracovyiw\ncvryoina\nechariovn", str "rjmdqahvbplcusigfx\ncluaqvsfhmrjbpgidx\ngvchlipxjsaufrbqdm\npjdsqmvlcaubfirhxg", str "tngbc\nbtcng\nnbgct\nbcgnt", str "aonpsbqkhwclrmdyuz\nmcgubhqdokarzlspnwy\nolhybcuasmrdzqwnkp\nlkshamocyrdznwuqbp\nwlunozascybqprmhkd", str "skilqth\nqhlts\nuslvqt\nfqstl\nftshql", str "fbtxdirelcsqzu\nicsyjfltxdeurq\nrueptfdcqylixs\nusqtxfdrclei\nlwqdvtxeirsfucna", str "xphvrbl\nbthixl\nwqjmohcfxyazlsb\nvhluxb", str "kbnogjrhe\nkrbngeohj\nhnekjbrog\nrkbeognjh\nkjrohebng", str "z\nyzn", str "wslprjfqa\nregwpyqdksaci", str "glmkujvbatqwc\nmtubqgclavrjwk\nwuqmjlgcabvtk\ngaluqbvctmkjw\nckblwqujgvmat", str "kgrmfstlejw\nbdithoauynzpv", str "wvyzhfdistmqkrugx\nnzlspqermfwjahui\nufqsipwozmhr", str "fdsavukrbpcm\nzrasokjlvudmpbf\neqvbkfrswpdtumag\ndmhkfplvbarnus", str "tdorlvb\npvdhiko\nomgsjwuavycxe\npziqbovhnf", str "f\na\nu\nu\nu", str "efg\negf\nfeg\nfge", str "wsf\nlmcd\nf\nv\nve", str "mibscvfqnhoxty\nrxphcsiqbofvnw\nuexoibzljkqagcnf", str "sbmhgyqvkuoljzwrfnxietca\nocjebltaqwursipnfkmx", str "xeh\nunxmh", str "du\nud\nud\ndu", str "tvzo\nvo\novft\nvto\npovdq", str "r\ns\nlhibgo\nqny\nnwk", str "cwxfhrgjdsyamtkv\nfshogpwdinlrcjexmt\nyxvdtzfrsgmcjqwbh", str "zil\nliz\nliz", str "iygvphrujkwaxl\nikjyutlxawvgrph\nhvuliyrdjakwpxg\nrjthkylwipxgvuad\nwivxkhlausgpjyr", str "vrxkaqzgmsyon\nvorxcumswqznyag", str "vlhuwzmdq\nbsoryk\nyeka", str "eiqwuz\nuvwznpqikr\nwluozi\nxjbyizufsagdtwm\nwzhuic", str "wydkjlfzpeqtgxorhmnuci\ntuczlfqrdnyxihgjopkwem\ntdpylmxcibgkfhjzwerasnou\nzelpcrdoygnxjvfmktuhwi\ngwmehyiojukcnfxrptzdl", str "vcuizfrlhqa\nrvizlucafhqj\ncviluqfhraz", str "wmgu\nve\nsgly\nfmwx", str "ke\nek", str "elhq\nhqel\nqehl\nehql", str "hzdfnwxtjysrio\nmykgu\nvy\nkpmaqy\ngbeykc", str "pfkj\nhfkpj\nkpfj\npfjk\nkpfjd", str "z\nt\nz\nt\noxy", str "ux\nauhzoj\nxu\nu", str "gcaldiph\nlhnfapi", str "slg\nslg\nlgs\nlgs\nsgl", str "h\nh\nh", str "qodwxpmskvjbtycuzghfe\npesjgxqzbtdcoyhwmu\nylthszqpuwebodxmgcj\nchqjetzxgdyopbwmuls", str "fkgtmuyoivdehpjcxsba\nagycjmdsfirvkuowtpbhex", str "ocaw\nmsclaw\ncwm\njdwceh", str "ekfyibdncovguazhjr\njkhgzbaoyidunvfr\nvyaihouznrkgjbfd\nxghojvrbdnzfuyaki", str "jpgqlhvyi\npqihag\nhqpig\ngupqhi\nghqip", str "glatmnqesbiwzkhup\njykuqrbswnmvocx", str "ykqwxpjgcshtdbau\ndfxqwpgbjcstkyua\nxsgatjcbkwdyqup\nusqykjpbgxdcwat", str "cmevolpwiq\nmoagpqevltjiw\nfmwziqbpuvleko\ndjvspewmohiql", str "mdux\nxmkud\nxmdu", str "vptyrkjxhcmounzgaw\nwkmranuoxcjhslzytdigq\nmjcazrxkguwfhbtnoy", str "e\nz\nmr\ne", str "vrqek\nkevrq", str "wb\nvcti\nhyar", str "e\ne", str "chqesv\nvesqch\neqhvcs", str "uae\nxzecw\neyl", str "bkgftdhvn\nnbfkgdtvhj\nnhftvgpkdb", str "fwxkbouizcyjg\nkwfqjgcyxzou\ngfkdoytrjpczuwx\ngyjvzcxfuowk\nmxcjzsnuaefowyhlkg", str "itwzbp\nyhnafe", str "dtnzjkibprafm\nfnarjbkiptzdm\nnjrtpifmkbdaze\nqkndmpaufbrjtiwzx", str "eknujdxzmytriao\nerkujinftzq\neskumatjicdnryz", str "lvzhmxewbgnkuorypfai\nibnwkrfogvhaezxumpyl\nhvbarmnowygqizujxplkef\nhegopvnwrfybamkluxiz", str "rdylnbotpv\nraugkqfelbnwy", str "vk\ngnuypkw\nkvj\nkjh", str "uprylxio\nluixrp\nruxplki", str "u\ngmu", str "ugbqne\nykvzwr\ni", str "vcqosrjbuxtl\nhovtxlrbcqsu\nbequwsltvxco\nvxarnqstcbuzlo\ncvuxqpobtsjl", str "ctviybroekm\ncyrtbevimok\ntvokrbciyme\nekctbyvmoir\ntymcviebokr", str "sdmkxgfhjlpyba\npuaowzsdqthkle\nzwredloshkpca", str "fjxo\njoxf\nfjxo\njfxo\nfxoj", str "mrqtv\nrvqtwfm\nrqmnvt\nwmrvtq\nqrftvm", str "qwtjlfobuydncgzheisxr\nqwxdlcuhjbnemaorpgfyzist", str "zenwdhikljm\nnejlmiwzkdh\njndelhwzkbmi\nzelhwnijkdm", str "jofdgmy\nojqdpbfg\ngduojf", str "awsgplcxqu\nmulxgapdcjqk\nacqjhfldpxgu\nxluqipvbngact", str "scdzqhyfplnx\nnxkygdjuzbcqsmvt\nzlxsqwnpdcay\nczsxnrqyold", str "qzvlitw\nnjapdb\nxkbcf\nuaogk", str "ok\ne\niu", str "qshidleorzbgjnvpuckyawt\npiojqrtzbnaukgwvchlesd\ngduvqkcnhioepstrljwbza\nqhripvstdjznlbgwuocake\njevrwsibcqlnutgkohdapz", str "upcealv\ngmpeyv\npve\nlpkuevz", str "pbtldk\nbpqhdk\ncibzd", str "lk\nhs\nkx\nl", str "fkuirx\nsy\nzgqw\nqmv\nqv", str "gdrtbwcjlhmqk\nakdlqzjhctgm\ndchqomkjylaftg", str "vwal\nficwjzusyom\nlw", str "z\njyxo\nn", str "x\nx\nx\ntwxs\nox", str "jzhaxuflebqwsipgctr\nmgawzjihxrpcuesfbqtl\nrljqhausvigxtofwczpbe\nifwjsdcbztphlxqrkeuag\nhizafygceblrquxwtnsjp", str "ioamx\nxiaomg\noxami\naxoim\namibxo", str "dxgwsbmlnyqruckezp\nxlurgtqncpwyfbisdkejm", str "vflkdqcxbzuwmengty\nswdbuexzlqvgmf", str "ehsmravbk\nehmvrkadb", str "qh\nhq\nthqx\nqh", str "uhi\naui\nui\niu\niu", str "wlrnmb\nyblnpr\nbztijfenkola", str "y\nfgzyvds\nyoj\niyp", str "ohbiqfxzp\nfpqihobx\nxhoeiqbfp", str "cgfi\nfigc\nfgci\ncflgi\ncihgfnv", str "vytbdxlzuwarjphnogic\ngexwbnqfizmhtdjyrcolas", str "hdeowrivjq\nuzihgmjwxrve\nwijeorhlqdsuv\nryeitfhvjw\nejhawvnuir", str "siaxlobjmkvcwhernytfugd\nrmtfsolejkdxihgvbnwcyua\noxglvkinrcebswamujfhtdy\ngwsatohiknljburmdycevxf\ncwuzdbgnethrvysmxolfkaji", str "m\ngm\nbhslre", str "xonqwkzcfbmtidpyvlsheu\npylzcoxmvqkehdsnftubjwi\nnworbkczxutyedsvqfhimpl", str "uatwvlgknhrfoqi\nnwhbtokfiq\nseniqpdzfhxmcotyw\nutoiqafwhn\nnqtoifwjh", str "oxiflw\nhflwxo\nloxwbf", str "mbt\ntbm", str "ocjflngrdakuypqiwxstzhmvbe\nykdaueiczwglbtrhjqnmsfxovp", str "wtlzyrcomasqnjude\nowhqdnmkzrpjlsxc\nloqdmszxgvrjwcn", str "on\nx\nx", str "lbeyqfxkwm\njmqnfxbgwde\noezbufqrtm", str "d\ny\ny\nta", str "z\np", str "fyx\nxfiy\nfxyw\nxdfcy\nfyx", str "csjxkozmnl\nslomjxkzc", str "hqwadymfsbtlxv\nkdvbatlfshwqmxy\nlyahsxmqfwdtbvz\nwxmlyahfdstvqb\ntvqdsxfynlhamwb", str "ojmvurikheablq\nukidqhvaljobe", str "imc\ntdkjmp\nmi", str "eq\neq", str "thgulyifqobdwvecmarsjnp\nndlygcmjahefquiswbrptvo", str "sjnptmdrlc\nuvebzmlodrncp\nlmypxkcfrnsd\ncnmhdlqxiarwpg", str "nzvqlh\nhlzvn\nlzhnv", str "juq\nju\nuj", str "tjqiucmynvozxh\nkmdvwafrxtq\nexgqmtv\nftsqxmv\nqklbtmxva", str "r\nr\npj", str "pkoy\nypok\nkypo\nokyp", str "f\nfl\nf\nf\nf", str "snvqdyx\ntdsxvnqy\ndeqynxsv\ndnsxqvy", str "lzhopfimuretwvd\njqgbvakrds", str "zfbocen\nmzbnacu", str "ezyxtajrv\nwzjuxreatv", str "mrsejiyuvfz\njkuctbxpoiw", str "nyvefxqicbah\nbrgeyltxvik\nkyuvilexbs\nztvixyepb\npxiygvbe", str "nadq\nnyt", str "prmt\nysjqkmocznhda\ngmlibeu\nbxmvf", str "rm\nwm\nm\nm", str "wyfjzdlvcgreb\nemlxnkpfjav\nelijupnfvh", str "pybv\nbpvy\nyrbvp", str "zrjkxshpufec\nvindgwtqbl", str "ngmtqzfcpudhw\ntphzgcwnqdfmu\nftzgphnmcudqw\nquzpmctfngdwh\ngqpdhufwcmtzn", str "szfcnb\nfczns\nfnzcbsg\nsznvafck", str "arcezgin\negcirazn\ngezcrian\nicgnraez", str "hgqucfnt\ngqnukt\nqgncut\ntuqnhg\nunfgqit", str "w\nsetbdgv", str "lck\nlxk\nkcl\nkl", str "emaqhxorctykufp\ntigjzqhv", str "mlvow\njqwo\nghksnruxipoac", str "hxnpeqt\nhtzen\nnhte\npchtne", str "ehovjgfzaql\nqhazvjlgeof\nkfgljqhavzoe\njvlzfhgoeqa\nveolzqfjgah", str "bdlitrzuwh\nepfmuhgvstibr"] | |
'## Part 1: Any | |
def combineAns (group_ans:n=>Char) : Int = | |
falses = for i:(Fin 26). False | |
sum $ map BToI $ snd $ withState falses \mergedRef. | |
for i. | |
case (group_ans.i == '\n') of | |
True -> () | |
False -> (mergedRef!(asindC group_ans.i) := True) | |
:p combineAns "abc" | |
:p combineAns "abc\nad" | |
def combineAnsL (group_ansL:String) : Int = | |
(AsList _ group_ansT) = group_ansL | |
combineAns group_ansT | |
:p sum $ map combineAnsL full_data | |
'## Part 2: All | |
Unfortunately we did not pars this as a list of lists | |
But as a interesting and cunning trick, | |
we can check if all answer, via counting how many people (\n) there are as well as how many of each answer | |
def allAns (group_ans:n=>Char) : Int = | |
zeros = for i:(Fin 26). 0 | |
(n_ans, merged_ans) = snd $ withState (1, zeros) \stateRef. | |
ncountRef = fstRef stateRef | |
mergedRef = sndRef stateRef | |
for i. case (group_ans.i == '\n') of | |
True -> ( | |
ncountRef := (get ncountRef) + 1 | |
) | |
False -> ( | |
mergedRef!(asindC group_ans.i) := ((get mergedRef!(asindC group_ans.i)) + 1) | |
) | |
sum for i. BToI $ merged_ans.i == n_ans | |
:p allAns "abc" | |
:p allAns "abc\nad" | |
def allAnsL (group_ansL:String) : Int = | |
(AsList _ group_ansT) = group_ansL | |
allAns group_ansT | |
:p sum $ map allAnsL full_data | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'# Advent of Code 2020. Day 7 | |
DexLang, [Lyndon White](http://oxinabox.net) | |
https://adventofcode.com/2020/day/7 | |
' TODO TODO TODO TODO TODO | |
' We really [need an associative map](https://github.com/google-research/dex-lang/issues/332) | |
' but we might be able to get away without one by a encoding scheme that lets us put it into an array | |
' Probably an array of arrays, one dimension for light/bright/ etc and one dimension for color | |
' hopefully there are not too many unique descriptors | |
' still annoying to write that encoding function, but can use arrays of indexes and find first equal to input | |
'We also are going to need to implement at least a basic parser combinator, this is too much text data | |
' Might be we have preprocess it with some regex first and avoid this though. | |
' If we really wanted to cheap shot it, preprocess colors etc into numbers in regex, but thats basically cheat. | |
This is probably going to allocate a ton, maybe the compiler can avoid that though. | |
If its too slow we may need to restructure the parse results not to create new strings. | |
data ParseResult a:Type= | |
NotMatched | |
Matched n:Int m:Int match:(Fin n=>a) remainder:(Fin m=>a) | |
def parse_light (src:n=>Char) : ParseResult Char = | |
withState 0 \match | |
example = "light red bags contain 1 bright white bag, 2 muted yellow bags." | |
' al' |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'# Advent of Code 2020. Day 8 | |
DexLang, [Lyndon White](http://oxinabox.net) | |
https://adventofcode.com/2020/day/8 | |
So we are implementing an interpreter | |
data Instruction = | |
NOP Int | |
ACC Int | |
JMP Int | |
mini_data = [NOP (0), ACC (1), JMP (4), ACC (3), JMP (-3), ACC (-99), ACC (1), JMP (-4), ACC (6)] | |
full_data = [NOP (346), ACC (44), ACC (15), JMP (473), ACC (29), ACC (-13), JMP (525), ACC (22), ACC (13), NOP (265), JMP (397), JMP (39), ACC (39), NOP (-1), ACC (36), ACC (25), JMP (153), NOP (374), JMP (27), JMP (282), JMP (1), JMP (1), JMP (15), ACC (33), ACC (-3), JMP (533), ACC (25), ACC (-14), ACC (-16), JMP (245), NOP (567), ACC (7), JMP (147), ACC (26), ACC (40), ACC (-9), JMP (295), ACC (14), NOP (388), ACC (-1), JMP (-21), NOP (524), NOP (166), NOP (515), JMP (18), JMP (214), ACC (42), NOP (-35), ACC (7), JMP (492), ACC (14), ACC (48), JMP (326), ACC (48), ACC (-18), ACC (-5), JMP (343), JMP (81), ACC (18), ACC (16), ACC (21), JMP (355), ACC (48), NOP (358), ACC (49), ACC (-2), JMP (89), ACC (4), JMP (171), ACC (6), JMP (299), ACC (-8), JMP (150), ACC (41), ACC (-9), ACC (48), JMP (73), JMP (523), NOP (471), JMP (493), ACC (-16), NOP (440), ACC (2), ACC (33), JMP (117), ACC (3), ACC (34), JMP (310), ACC (8), JMP (197), ACC (26), ACC (47), JMP (194), NOP (115), JMP (259), NOP (456), JMP (420), NOP (398), JMP (235), ACC (44), ACC (47), JMP (218), JMP (1), JMP (275), ACC (12), JMP (434), ACC (50), ACC (10), NOP (361), JMP (367), ACC (-16), ACC (44), JMP (96), ACC (9), ACC (38), ACC (-15), NOP (-31), JMP (-55), NOP (421), ACC (50), ACC (12), JMP (-64), ACC (33), ACC (25), JMP (382), ACC (7), JMP (-22), JMP (95), ACC (44), ACC (32), ACC (23), JMP (1), JMP (456), ACC (49), JMP (15), JMP (312), ACC (6), JMP (216), ACC (7), JMP (458), JMP (465), NOP (372), ACC (35), ACC (32), ACC (13), JMP (-35), ACC (50), NOP (32), JMP (143), JMP (327), ACC (0), NOP (-82), NOP (-62), ACC (41), JMP (-81), ACC (-10), NOP (-106), JMP (82), ACC (1), ACC (11), JMP (124), ACC (25), ACC (17), JMP (-73), NOP (8), ACC (29), ACC (33), ACC (10), JMP (123), JMP (236), ACC (41), JMP (370), ACC (17), ACC (-13), ACC (35), JMP (-47), NOP (287), ACC (22), JMP (38), JMP (1), NOP (-52), NOP (-9), ACC (22), JMP (253), ACC (12), ACC (-18), ACC (21), NOP (-69), JMP (28), ACC (16), JMP (392), JMP (325), JMP (-74), ACC (34), ACC (47), ACC (41), JMP (201), NOP (361), ACC (50), JMP (30), JMP (-127), NOP (-171), JMP (349), ACC (11), NOP (156), ACC (1), ACC (-18), JMP (393), ACC (-8), JMP (1), ACC (-17), NOP (188), JMP (134), ACC (-9), ACC (-14), JMP (206), JMP (-209), JMP (1), ACC (49), NOP (112), ACC (-4), JMP (-20), ACC (41), JMP (-145), ACC (8), JMP (276), ACC (48), JMP (-5), JMP (-143), ACC (0), JMP (-161), JMP (238), ACC (8), JMP (-134), ACC (34), ACC (10), JMP (1), NOP (109), JMP (-100), ACC (41), ACC (-4), JMP (-12), ACC (42), ACC (46), ACC (-7), ACC (28), JMP (85), JMP (216), JMP (364), ACC (0), ACC (-6), NOP (331), ACC (33), JMP (163), ACC (37), ACC (20), ACC (33), ACC (45), JMP (-159), ACC (34), ACC (10), ACC (48), ACC (10), JMP (358), ACC (-9), JMP (276), ACC (27), ACC (45), NOP (129), ACC (32), JMP (243), ACC (0), ACC (-5), JMP (-24), ACC (44), NOP (307), ACC (-18), ACC (13), JMP (37), ACC (5), NOP (-125), NOP (-126), ACC (-18), JMP (186), JMP (-87), JMP (-262), NOP (-20), JMP (-108), ACC (26), ACC (20), JMP (193), NOP (185), JMP (129), ACC (26), JMP (122), ACC (-8), NOP (143), NOP (166), JMP (-236), ACC (33), JMP (-139), ACC (38), JMP (1), ACC (21), ACC (31), JMP (-79), ACC (-13), JMP (-78), ACC (29), JMP (160), ACC (48), ACC (-8), ACC (28), ACC (15), JMP (-284), JMP (25), ACC (24), JMP (1), JMP (-92), ACC (22), JMP (169), ACC (-15), ACC (16), ACC (4), JMP (-85), ACC (-18), ACC (-19), ACC (-2), JMP (-278), ACC (48), JMP (-195), JMP (-40), JMP (-110), ACC (47), JMP (-26), ACC (26), NOP (-187), ACC (40), ACC (42), JMP (167), ACC (50), ACC (36), ACC (-14), JMP (-313), NOP (-203), JMP (227), ACC (-15), ACC (22), JMP (-23), ACC (6), ACC (30), ACC (12), JMP (69), NOP (-212), NOP (-105), ACC (12), JMP (-155), NOP (69), ACC (-16), JMP (-68), ACC (-18), ACC (35), ACC (34), ACC (6), JMP (-80), ACC (7), ACC (19), ACC (-8), JMP (-94), ACC (12), NOP (-148), ACC (33), NOP (-41), JMP (-107), ACC (25), ACC (9), NOP (107), JMP (-44), JMP (1), JMP (-254), ACC (10), ACC (0), ACC (37), ACC (33), JMP (137), NOP (136), JMP (-225), ACC (-4), ACC (-17), ACC (39), JMP (-286), JMP (150), NOP (-380), ACC (34), ACC (16), NOP (146), JMP (105), JMP (119), JMP (-190), ACC (0), NOP (205), NOP (-302), JMP (-17), ACC (-4), JMP (-7), JMP (-14), JMP (-394), ACC (34), ACC (-1), ACC (37), ACC (-17), JMP (-312), NOP (-180), NOP (-139), ACC (21), JMP (-378), ACC (24), ACC (38), JMP (129), ACC (26), JMP (19), ACC (31), JMP (-190), ACC (29), ACC (-5), JMP (14), NOP (186), ACC (12), ACC (9), ACC (-16), JMP (9), ACC (2), NOP (-382), NOP (-284), NOP (-377), JMP (-169), JMP (129), ACC (49), JMP (-297), ACC (48), ACC (18), ACC (8), JMP (170), ACC (12), ACC (-4), ACC (28), JMP (-20), ACC (-11), JMP (-363), JMP (1), ACC (9), ACC (31), JMP (31), ACC (36), ACC (42), ACC (2), NOP (-131), JMP (-322), ACC (35), ACC (44), ACC (11), ACC (14), JMP (-213), ACC (-16), ACC (-15), ACC (-5), JMP (-277), ACC (-17), JMP (-252), ACC (-19), ACC (31), ACC (-16), ACC (-5), JMP (48), JMP (1), JMP (-97), ACC (5), JMP (-382), ACC (26), ACC (41), ACC (31), ACC (-2), JMP (-392), ACC (41), JMP (-124), ACC (45), ACC (24), ACC (10), JMP (-339), ACC (29), ACC (-10), ACC (-10), ACC (3), JMP (-456), JMP (-25), ACC (37), ACC (39), ACC (-11), ACC (-1), JMP (106), JMP (-328), JMP (-489), NOP (-111), NOP (-458), ACC (31), JMP (-100), ACC (-18), JMP (-258), ACC (-17), NOP (-46), ACC (43), ACC (45), JMP (-127), JMP (34), ACC (33), JMP (-200), NOP (-90), ACC (20), JMP (-271), ACC (41), JMP (-189), ACC (-16), NOP (-321), ACC (25), ACC (-12), JMP (-62), ACC (-1), JMP (1), ACC (35), ACC (39), JMP (-184), JMP (-236), NOP (-331), ACC (12), JMP (78), ACC (15), JMP (-30), ACC (-11), JMP (-117), JMP (-8), JMP (9), ACC (2), JMP (-497), ACC (10), ACC (0), ACC (-6), JMP (-155), JMP (-148), JMP (-95), JMP (-96), JMP (-249), NOP (-277), NOP (-411), ACC (-13), ACC (-2), JMP (-383), ACC (-13), JMP (-110), ACC (13), ACC (16), ACC (5), ACC (-2), JMP (-67), ACC (37), JMP (-491), ACC (35), ACC (34), ACC (32), ACC (-2), JMP (-546), ACC (-19), JMP (-322), ACC (48), ACC (18), ACC (35), ACC (8), JMP (-448), ACC (41), ACC (-15), ACC (34), ACC (46), JMP (-50), ACC (12), NOP (-184), ACC (14), ACC (38), JMP (-370), JMP (10), ACC (-14), ACC (-16), NOP (-259), NOP (-300), JMP (-400), ACC (38), ACC (29), ACC (27), JMP (-175), JMP (-456), ACC (30), JMP (-308), JMP (-538), JMP (1), ACC (-16), NOP (-127), JMP (-407), ACC (5), JMP (-57), ACC (21), ACC (3), ACC (42), ACC (43), JMP (-521), ACC (-9), ACC (20), NOP (-217), JMP (-15), ACC (37), ACC (-12), ACC (-18), JMP (1), JMP (-465), ACC (37), NOP (-577), ACC (8), ACC (43), JMP (1)] | |
:p mini_data | |
def runTilLoop (code:(n=>Instruction)) : Int = | |
no_hits = for i:n. False | |
fst $ fst $ snd $withState ((0, 0), no_hits) \stateRef. | |
acc_and_pc_Ref = fstRef stateRef | |
accRef = fstRef acc_and_pc_Ref | |
pcRef = sndRef acc_and_pc_Ref | |
hitsRef = sndRef stateRef | |
while (\(). (not $ get hitsRef!(get pcRef@n) | |
)) \(). | |
instruction = code.(get pcRef@n) | |
hitsRef!(get pcRef@n) := True | |
pcRef := 1 + get pcRef | |
case instruction of | |
NOP _ -> () | |
ACC v -> (accRef := v + get accRef) | |
JMP v -> (pcRef := v -1 + get pcRef) -- subtract 1 as will add it later | |
:p runTilLoop mini_data | |
-- :p runTilLoop full_data | |
' ## Part 2 fix it | |
If finishes without looping returns `Just acc` | |
def runTilLoopOrEnd (code:(n=>Instruction)) : (Maybe Int) = | |
inBounds: Int->Bool = \k. (size n > k) && k >= 0 | |
no_hits = for i:n. False | |
(acc, pc) = fst $ snd $withState ((0, 0), (True, no_hits)) \stateRef. | |
acc_and_pc_Ref = fstRef stateRef | |
accRef = fstRef acc_and_pc_Ref | |
pcRef = sndRef acc_and_pc_Ref | |
continue_and_hits = sndRef stateRef | |
continueRef = fstRef continue_and_hits | |
hitsRef = sndRef continue_and_hits | |
while (\(). get continueRef) \(). | |
instruction = code.(get pcRef@n) | |
hitsRef!(get pcRef@n) := True | |
pcRef := 1 + get pcRef | |
case instruction of | |
NOP _ -> () | |
ACC v -> (accRef := v + get accRef) | |
JMP v -> (pcRef := v -1 + get pcRef) -- subtract 1 added before | |
-- we need to do it this way rather than as using && in while const or else it will try and look out of bounds, because short circuiting doesn't seem to work to prevent the check that happens with `@n` | |
continueRef := case (inBounds $ get pcRef) of | |
True -> (not $ get hitsRef!(get pcRef@n)) | |
False -> False | |
select (pc >= size n) (Just acc) Nothing | |
:p runTilLoopOrEnd mini_data | |
def swapInstruction (inst:Instruction) : Instruction = | |
case inst of | |
NOP v -> JMP v | |
ACC v -> ACC v | |
JMP v -> NOP v | |
:p swapInstruction (NOP 0) | |
def needToCheck (inst:Instruction) : Bool = | |
case inst of | |
NOP v -> True | |
ACC v -> False | |
JMP v -> True | |
:p needToCheck (NOP 0) | |
def trial (code:(n=>Instruction)) (i:n) : (Maybe Int) = | |
newInst = swapInstruction code.i | |
case (needToCheck code.i) of | |
False -> Nothing | |
True -> (fst $ withState code \codeRef. | |
(codeRef!i := newInst) | |
runTilLoopOrEnd $ get codeRef) | |
:p trial mini_data (2@_) | |
:p trial mini_data (7@_) | |
def firstSomething (things:n=>Maybe a) : Maybe a = | |
fold Nothing $ \i state. select (isNothing state) things.i state | |
:p firstSomething [Nothing, Just 23, Nothing] | |
def doTrials (code:(n=>Instruction)) : (Maybe Int) = | |
firstSomething $ for i:n. trial code i | |
:p doTrials mini_data | |
:p doTrials full_data | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment