├── 10 ├── README.md ├── input └── main.nim ├── 11 ├── input └── main.nim ├── 12 ├── input └── main.nim ├── 19 ├── input └── main.nim ├── 20 ├── input └── main.nim ├── 21 ├── input └── main.nim ├── 24 ├── input └── main.nim ├── 25 └── main.nim ├── 01 ├── input └── main.nim ├── 02 ├── input └── main.nim ├── 03 ├── input └── main.nim ├── 04 ├── README.md ├── input └── main.nim ├── 05 ├── input └── main.nim ├── 06 ├── README.md ├── input └── main.nim ├── 07 ├── README.md ├── input └── main.nim ├── 08 ├── README.md ├── input └── main.nim ├── 09 ├── README.md ├── input ├── input2 └── main.nim ├── README.md ├── lib └── sparsemap.nim └── runall /01/input: -------------------------------------------------------------------------------- 1 | 1655 2 | 1384 3 | 1752 4 | 1919 5 | 1972 6 | 1766 7 | 1852 8 | 1835 9 | 1408 10 | 1721 11 | 1879 12 | 1846 13 | 1394 14 | 1577 15 | 1588 16 | 1097 17 | 1748 18 | 1585 19 | 765 20 | 1375 21 | 1806 22 | 1785 23 | 1824 24 | 1847 25 | 1037 26 | 1531 27 | 1989 28 | 1570 29 | 1625 30 | 1600 31 | 1832 32 | 1927 33 | 1691 34 | 1593 35 | 1936 36 | 1812 37 | 570 38 | 1391 39 | 1883 40 | 1592 41 | 1875 42 | 1185 43 | 1903 44 | 855 45 | 1331 46 | 1742 47 | 1884 48 | 1356 49 | 1944 50 | 1994 51 | 1556 52 | 1271 53 | 1572 54 | 1661 55 | 1914 56 | 1905 57 | 1581 58 | 1634 59 | 1252 60 | 1657 61 | 989 62 | 1907 63 | 1998 64 | 1040 65 | 1833 66 | 1612 67 | 1725 68 | 1680 69 | 1869 70 | 1900 71 | 1550 72 | 1768 73 | 1727 74 | 1930 75 | 1810 76 | 1841 77 | 734 78 | 1779 79 | 1774 80 | 1825 81 | 1446 82 | 1259 83 | 1552 84 | 1310 85 | 1885 86 | 1689 87 | 1929 88 | 1959 89 | 787 90 | 1642 91 | 1890 92 | 1164 93 | 1986 94 | 1796 95 | 1465 96 | 1217 97 | 1741 98 | 1480 99 | 1683 100 | 1808 101 | 1058 102 | 1970 103 | 1361 104 | 2003 105 | 1898 106 | 1668 107 | 1754 108 | 1773 109 | 1235 110 | 1158 111 | 1975 112 | 1479 113 | 1995 114 | 1648 115 | 1023 116 | 883 117 | 1553 118 | 1658 119 | 1794 120 | 1747 121 | 1978 122 | 1268 123 | 1966 124 | 1192 125 | 1886 126 | 1471 127 | 1548 128 | 1819 129 | 1551 130 | 1958 131 | 1732 132 | 1676 133 | 1745 134 | 1501 135 | 1858 136 | 1652 137 | 1596 138 | 473 139 | 1314 140 | 1814 141 | 1409 142 | 1877 143 | 1344 144 | 1735 145 | 1635 146 | 1273 147 | 871 148 | 1643 149 | 1599 150 | 1565 151 | 1695 152 | 1803 153 | 1764 154 | 1778 155 | 1823 156 | 1831 157 | 1701 158 | 282 159 | 1089 160 | 1623 161 | 1639 162 | 1568 163 | 1469 164 | 1674 165 | 1818 166 | 1992 167 | 1597 168 | 1711 169 | 1359 170 | 1851 171 | 1496 172 | 1630 173 | 1755 174 | 1529 175 | 1881 176 | 1718 177 | 1916 178 | 1325 179 | 1578 180 | 1441 181 | 1722 182 | 1545 183 | 1472 184 | 1783 185 | 1497 186 | 1791 187 | 1183 188 | 1926 189 | 1937 190 | 1255 191 | 1095 192 | 1451 193 | 1395 194 | 1665 195 | 1432 196 | 1693 197 | 1821 198 | 1938 199 | 1941 200 | 2002 201 | -------------------------------------------------------------------------------- /01/main.nim: -------------------------------------------------------------------------------- 1 | 2 | import strutils, math, sequtils 3 | 4 | let vs = toSeq(lines("input")).map(parseInt) 5 | 6 | proc test(l: string, ts: openArray[int]) = 7 | if sum(ts) == 2020: 8 | echo l, prod(ts) 9 | 10 | for i1 in 0..+Digit * "-" * >+Digit * " " * >Alpha * ": " * >+Alpha * '\n': 8 | let (v1, v2, letter, pwd) = (parseInt($1), parseInt($2), ($3)[0], $4) 9 | 10 | if pwd.count(letter) in v1..v2: 11 | inc part1 12 | 13 | if pwd[v1-1] == letter xor pwd[v2-1] == letter: 14 | inc part2 15 | 16 | if p.matchfile("input").ok: 17 | echo "part1: ", part1 18 | echo "part2: ", part2 19 | -------------------------------------------------------------------------------- /03/input: -------------------------------------------------------------------------------- 1 | .##......#.##..#..#..##....#... 2 | ...##.....#...###........###... 3 | #....##....#.....#.....#..##.## 4 | .......#.###.#......#..#..#..#. 5 | ##..........#....#.#...#....... 6 | ###.#.#.#......##...#.......... 7 | .#.##........#..............#.. 8 | ..#..........#...##..#.......## 9 | .........##...#...#....###.#... 10 | #.......#.....#.#.#...###.##.#. 11 | ...#...#...#......#........#.## 12 | ....#..........#.....#..#....## 13 | .#.#.##....#.#...#............. 14 | #....#..#.....#.#.............. 15 | ........#....#....#..#........# 16 | ..#.......#...#....##.#........ 17 | ......#.........##.......#.#... 18 | ............#.......#.......... 19 | .....#..#.#..#........##...#... 20 | ....#.....................###.. 21 | ..#.......#.........#..##....## 22 | ..#........#..#...#........#... 23 | ..............#....##..##....#. 24 | ....#..#.#.......#....#..#...## 25 | .#........##......#.#..#.#..... 26 | ............#.##...##...#...##. 27 | .......#........#.........##... 28 | ...#...........#.#...#..#...... 29 | #...#............#..####....... 30 | ..#..#..#..#.....#...#.#.#..... 31 | ....#.#..............#.....##.. 32 | #.....##........#......#....... 33 | .....#..#................##.#.. 34 | .###.#...................#..... 35 | ....#....#...#.##..........#... 36 | .#.....#....#.......#...#...... 37 | .....#...#.##.##............#.. 38 | ..........#..#....#...#.#..#... 39 | #...#..#..............###.#...# 40 | ......#....#.#....##....#...... 41 | ............#......#......##... 42 | .#....#...#........#.#.#..#.... 43 | ..#.....#.......#.....#.#...... 44 | #....#......#.......#......#... 45 | ....#..##.....#...#........#... 46 | .#..#......#..#................ 47 | .#...#...#....#.#...#.....#...# 48 | ......#..#...#...#..#.......##. 49 | ...#..#...#.#.......#.......#.. 50 | ..#...#.........#......#......# 51 | ......#...#..#..........#...... 52 | .#..#......#....#.#.#...#....#. 53 | .#.#....#.#.#..#..#..#........# 54 | ....###.#...##..#.#..#....#.... 55 | ...#.#.#................#...... 56 | .#.....#..#..........##..#....# 57 | ..........#..#......#.........# 58 | .....#....#...#.#..##....#.#.#. 59 | ........#.##......###.......... 60 | ##......#.#..#.....#..##.#..... 61 | .#.......#..#....##.....##..... 62 | .....##....#................... 63 | ##......#....##........#.....#. 64 | ..##...#...........##........#. 65 | ...#....#..##.#....#......##... 66 | #....#...##....#..........#.... 67 | ......##....#...............#.. 68 | ...#.#.#...#...#...#........... 69 | ....#..#...#.#....#.#......#... 70 | .......#...#...............#... 71 | .##..#....#...#....#.#........# 72 | .....#..##............#......#. 73 | ...##...#.....#..........#.#..# 74 | ..#..##.............#....#..... 75 | .....#.#.....#.........#......# 76 | ........#..........#.#.#...#..# 77 | #........#.#................... 78 | ......#......##..............#. 79 | ......#..#.#.....#...#.#...#... 80 | .#..##.....#...##.......#...... 81 | #.......#....#..##....#..#.#... 82 | #..#..#....#...........#.##.... 83 | ..##....#....##.....#...#...##. 84 | .#.......#.......#....#.......# 85 | .#..#..#...#...#............... 86 | .#..............#.....#........ 87 | ..........##...#....#.#......## 88 | ..........#..........#.......#. 89 | ..#..##....##...#.......#...... 90 | .#......#.#........##.#........ 91 | ...#......#..#....#...#....#... 92 | ...............#....#..#.##...# 93 | ....#.......................#.. 94 | #....##.#......#....#.......... 95 | .......#.#......#........#..##. 96 | ..#.....#...#...........##..#.. 97 | #........#.#....#............#. 98 | .........##..................#. 99 | ........#...#..#...#......#...# 100 | ...#.......#...####.#...#...... 101 | ....#..###......###..#......... 102 | .....#...........#......#...... 103 | .#.....#......#.....#.....##.## 104 | .#.#...##..........#........#.# 105 | ..#....#.....##...............# 106 | .....##.....#...##..#.......... 107 | .#......##.......#..##.##.#...# 108 | .#..#...#.##.....#.#........... 109 | .........#....##...#.....##.... 110 | #..........#.............#..#.# 111 | ...........#........#.#...#.... 112 | ........#..###...#...........#. 113 | #.........#...#....#..##.##.... 114 | ........#....##.......#.#....#. 115 | ..........#..............#..... 116 | ....##...#...##..........#..... 117 | ...#..##.#...###..#............ 118 | ...##..#####....#.............# 119 | .#..#.......##.......#........# 120 | ....##..........#.......#.#.... 121 | ......#.........####.......#... 122 | ...............#......#..#..... 123 | ...#...##...#.#.#.....##.#.#... 124 | ..#....#..#..............#....# 125 | #..............#............#.. 126 | .#.#..#....#.....#.#.#...#..... 127 | ......#......#..#..#.....#..... 128 | .#.#..#.##.#........#.......... 129 | ..##.#......#..#.......#....... 130 | .##...##....#..#.#.........#.## 131 | .........#........#.#..###....# 132 | .....#...............#......... 133 | ......##..........#.....#...... 134 | .#.....#.#.#..#.#.....#..#.#### 135 | .......###.##......#.....#.#..# 136 | ..#.....#....#.#.##......#....# 137 | .....##..#................#..## 138 | .#......#.....#..#.....#..##### 139 | .........#.#.......#..##...#... 140 | .#.#..#.......##.....#....#.... 141 | .....#...###.#...#......#....#. 142 | .#....#....#...#..#.#........#. 143 | ......##........##.#...#..#..#. 144 | .##.##.###..#.....#........###. 145 | .....#..#.#.......#..#.#....... 146 | ##.#.#..............#..##...... 147 | ....#.........#.......#.#...... 148 | .....#..#.....#...#.#....#.#... 149 | ...#..#.#.#..................#. 150 | ........##.#.###............... 151 | ..#...#.#.......#......#....... 152 | .......#.##....#...#....#...... 153 | ......#.#.............#........ 154 | ........#......#........##.##.. 155 | .....#...#......##............. 156 | ...#.#..#.....#.#...#.......... 157 | .#.#..#.....#............#..... 158 | .#.#..#.#.##.#...#.##..##...#.. 159 | .........##........#.##..#..... 160 | ##.#.#......###..#.##.#........ 161 | .##...#..#...#.#..#....##.....# 162 | #......#..........#.#...#.....# 163 | ..........#......#...#.......#. 164 | .............#..........#...... 165 | #.#....#.......##..#.....#.#... 166 | ##......#..#......#.#..#.#....# 167 | ..#.#..#.....#.#......#....#..# 168 | ...#......#......##.....#..#.#. 169 | ....#......#.....#....#.#.#..#. 170 | .....#..#..#.....#...........## 171 | ....#.....#...#........##.#.#.# 172 | ..#......#.......#........#.... 173 | #.......##..##......#...####..# 174 | #..........#......#.#..#..#.... 175 | .................##............ 176 | ...#..#..#.#.....#.##.#.....#.# 177 | ...#....###.................... 178 | ....#.......#..#.#............. 179 | #......#................#...... 180 | ..........#........#..#........ 181 | .....#......##..#......#..###.. 182 | ...#....#.......#.............. 183 | .#....#.#.#........#.....#...#. 184 | .......#.....##.#.....#....#... 185 | .........#.#.........##..#...#. 186 | ......#......#....#.....##.#.#. 187 | ####...#.........#.....#......# 188 | ...#.#..#..#.............#..... 189 | ......#.........#....#.#..##..# 190 | .........#.....#.#..##..##..#.. 191 | .#......##.............#....... 192 | ....#...#......#...#.....#.#.## 193 | ......#..##....#..#.....#...... 194 | ......#..............#....##... 195 | .........#.###..........#.##... 196 | #....#..........#..#.......#... 197 | ...........#...#.....#.......#. 198 | ..#..#........#................ 199 | ...###.........#............... 200 | .....#.##...#.................# 201 | ..#.#..#...###......#........#. 202 | #......#......#.#.............# 203 | .........#.#.....#..#........#. 204 | ........#..#......#......##.... 205 | .....#......#...#.....##...#.## 206 | .##...#..#....##..........###.. 207 | .......#............#........## 208 | .##.....#.......#...#.......... 209 | ..###..........#.............## 210 | #....#....#.#....#............# 211 | #...#......................#... 212 | ....#..#..#..#.......###....#.. 213 | #..###.#..#.....#.............# 214 | ..........#.##.....#.........## 215 | ...#.............#....#....##.. 216 | #........................#..#.. 217 | ........#...#.....#.....#..##.. 218 | #........#......#....#..#....#. 219 | .....#.#.#....#.#..#....#...... 220 | .....#....#.................... 221 | .........#..#..#....#......#... 222 | ..........#.#.#.......#........ 223 | .......#.#.....#..#.....##..... 224 | .....#....#.#.....#.......#..#. 225 | .#..###.......#......#..#..#... 226 | ..##.#.....#.........##.#...... 227 | .....#.......###.......##...... 228 | #...#.......##.#.#......#.....# 229 | .##........##.#...#...#........ 230 | ....#.......#....#..#.......#.. 231 | .#..#.......#..####..##........ 232 | ..#..#..#..#..#..#............. 233 | ...#......#...#...#.#......##.# 234 | ........#.#..#.#.#......#...#.. 235 | #.......#..##.......##........# 236 | ..##...#...............#.#....# 237 | .####........##..........#..#.. 238 | ..#........#...##...#........#. 239 | .#.#..........#...#...#........ 240 | ....###..........#....#........ 241 | .#.#.#.###.#.##..#.#........#.. 242 | ..........#....##.#..##........ 243 | .......#..#..##.......#........ 244 | ..#........#....#..####.#..#... 245 | ....#.......#..##..#..........# 246 | .....#...........#....#....#... 247 | .#.##..#......##.........#.#... 248 | ...#......##..##......#.....#.. 249 | #........#..........#.#...#.... 250 | .#.#........###........#..#.... 251 | ....#####.................##... 252 | .........##...#......#......... 253 | .......#....#....#.#....#...#.. 254 | ......#................#...#.#. 255 | ....#.....#.....#.#.....#.....# 256 | #.........#..#........#.....#.. 257 | ....#...........#.....#.#...... 258 | ##..#....................#.#... 259 | #.#.##....#.....##....#.......# 260 | ..#..#....###.......#..##...... 261 | ......##.....#.##...#....#..#.. 262 | ........#..#.#..#..#.#......... 263 | #...#.....##..........##....... 264 | ....#.....#...#.###.......#.... 265 | ..........#..#...#........##..# 266 | ##..#...#.#.####.#..#..#...#... 267 | ................#......#..#.... 268 | .......#...###...#........#.... 269 | ....#..##..#.#......#...#.#..## 270 | .##......#...........#.......## 271 | ....#.#...#..#.#.......##...... 272 | ....#..##..#.....#........##... 273 | ...#...#..#.#.#....#.........#. 274 | #....##.#....#..##............. 275 | .#......##......#.#.##.......#. 276 | .......#...#....#.##......#.... 277 | ..##..........#.....#.#......#. 278 | #..##.....#..........##..#.#... 279 | ....#.#.......#.#.....#.....#.. 280 | ##.....#..#.....##...#.....#..# 281 | ...#.#..#...#..............#... 282 | ...............#..#............ 283 | .#.......#......#........##.... 284 | ..#......#..##..####.....#...#. 285 | .#.##.#.#..#..##..##........... 286 | ...##.............#.....#..#... 287 | .##.....#..#.#......##........# 288 | ##....#.............#...#...... 289 | ......#.....###...........##... 290 | .#.#...#.............##..#..### 291 | ..#.##.##...#.....#...........# 292 | .....#.....##...#...#........#. 293 | ........#..##.......##.....#... 294 | .#........####.......#.#...#... 295 | ...#..........#......##........ 296 | .......#......#..##..#...#..... 297 | ..#...........#.#.#..#.#.#..... 298 | #..........#....#....###.#..... 299 | ....#.................#...##... 300 | #....#.###......#..#.....#...## 301 | .#.......##.....###.....#...#.. 302 | ....##............#...........# 303 | ...#.#.#.........#...#..#..#..# 304 | .....#..###.................#.. 305 | .#.....#.....#....###.#..#...#. 306 | ................#...#.......... 307 | ..#....#..##....#.##........#.. 308 | ....##....#...........#..#..... 309 | ...##......###.......#...#..... 310 | .......##............#......#.# 311 | #####.....#..#.###..#.#........ 312 | #.##.##..#.......#....#........ 313 | ....###..#.#.#......###.#...... 314 | ....#....#.....##.#..#....#...# 315 | ....#.....#.#...##.##.#.#....#. 316 | .........#.#.###.#.....#....... 317 | .#....#.......#..##...#....#... 318 | ...####...##.#.....#........... 319 | #.....#.....#..........##..#... 320 | ................#.#.#......#... 321 | .#...#.......#..#............#. 322 | .##.#.......#..#....#.....#.... 323 | .#...#..#.....#..............#. 324 | -------------------------------------------------------------------------------- /03/main.nim: -------------------------------------------------------------------------------- 1 | import sequtils, math 2 | 3 | const 4 | m = slurp "input" 5 | h = m.count('\n') 6 | w = m.find('\n') 7 | ss = [(1,1), (3,1), (5,1), (7,1), (1,2)] 8 | 9 | proc isTree(s: tuple[x, y: int]): bool = 10 | m[s.y * (w+1) + (s.x mod w)] == '#' 11 | 12 | proc run(s: tuple[dx, dy: int]): int = 13 | var x, y: int 14 | while y < h: 15 | x += s.dx 16 | y += y.dy 17 | if isTree (x, y): 18 | inc result 19 | 20 | echo "part1: ", run (3, 1) 21 | echo "part2: ", ss.map(run).prod 22 | -------------------------------------------------------------------------------- /04/README.md: -------------------------------------------------------------------------------- 1 | 2 | > "_If all you have is a parser, everything looks like a grammar_" 3 | 4 | This one is a natural fit for NPeg, as it is basically just about parsing and 5 | validating a grammar. The code basically defines the grammar for a sequence of 6 | invalid or valid passports, and checks the password fields for the given ranges 7 | and restrictions. Each valid field adds `1` to the `n` variable, and at the end 8 | of a passport `n` is added to the list of `vs`. The answer of the puzzle is the 9 | number of passports which have exactly 7 valid fields. 10 | 11 | This is what the resulting grammar looks like, generated with `-d:npegGrap`: 12 | 13 | ``` 14 | passports o─┬─┬─[valid]───┬─┬─o 15 | │ ╰─[invalid]─╯ │ 16 | ╰───────«───────╯ 17 | 18 | valid o─┬─[field]─»─[Space]─┬»─[Space]──o 19 | ╰─────────«─────────╯ 20 | 21 | ╭──────»───────╮ 22 | │ ━━━━━━ │ 23 | invalid o─┴┬─"\n\n"─»─1─┬┴»─"\n\n"──o 24 | ╰─────«──────╯ 25 | 26 | field o──┬─[byr]────┬──o 27 | ├─[iyr]────┤ 28 | ├─[eyr]────┤ 29 | ├─[hgt_cm]─┤ 30 | ├─[hgt_in]─┤ 31 | ├─[hcl]────┤ 32 | ├─[ecl]────┤ 33 | ├─[pid]────┤ 34 | ╰─[cid]────╯ 35 | 36 | ╭╶╶╶╶╶╶╶╶╶╶╶╮ 37 | byr o──"byr:"─»──┬─[Digit]─┬───o 38 | ┆╰────«────╯┆ 39 | ╰╶╶╶╶╶╶╶╶╶╶╶╯ 40 | 41 | ╭╶╶╶╶╶╶╶╶╶╶╶╮ 42 | iyr o──"iyr:"─»──┬─[Digit]─┬───o 43 | ┆╰────«────╯┆ 44 | ╰╶╶╶╶╶╶╶╶╶╶╶╯ 45 | 46 | ╭╶╶╶╶╶╶╶╶╶╶╶╮ 47 | eyr o──"eyr:"─»──┬─[Digit]─┬───o 48 | ┆╰────«────╯┆ 49 | ╰╶╶╶╶╶╶╶╶╶╶╶╯ 50 | 51 | ╭╶╶╶╶╶╶╶╶╶╶╶╮ 52 | hgt_cm o──"hgt:"─»──┬─[Digit]─┬──»─"cm"──o 53 | ┆╰────«────╯┆ 54 | ╰╶╶╶╶╶╶╶╶╶╶╶╯ 55 | 56 | ╭╶╶╶╶╶╶╶╶╶╶╶╮ 57 | hgt_in o──"hgt:"─»──┬─[Digit]─┬──»─"in"──o 58 | ┆╰────«────╯┆ 59 | ╰╶╶╶╶╶╶╶╶╶╶╶╯ 60 | 61 | hcl o──"hcl:"─»─'#'─»─[Xdigit]─»─[Xdigit]─»─[Xdigit]─»─[Xdigit]─»─[Xdigit]─»─[Xdigit]──o 62 | 63 | ecl o──"ecl:"─»─┬─"amb"─┬──o 64 | ├─"blu"─┤ 65 | ├─"brn"─┤ 66 | ├─"gry"─┤ 67 | ├─"grn"─┤ 68 | ├─"hzl"─┤ 69 | ╰─"oth"─╯ 70 | 71 | pid o──"pid:"─»─[Digit]─»─[Digit]─»─[Digit]─»─[Digit]─»─[Digit]─»─[Digit]─»─[Digit]─»─[Digit]─»─[Digit]──o 72 | 73 | cid o──"cid:"─»┬─[Graph]─┬─o 74 | ╰────«────╯ 75 | 76 | ``` 77 | -------------------------------------------------------------------------------- /04/input: -------------------------------------------------------------------------------- 1 | eyr:2029 byr:1931 hcl:z cid:128 2 | ecl:amb hgt:150cm iyr:2015 pid:148714704 3 | 4 | byr:2013 hgt:70cm pid:76982670 ecl:#4f9a1c 5 | hcl:9e724b eyr:1981 iyr:2027 6 | 7 | pid:261384974 iyr:2015 8 | hgt:172cm eyr:2020 9 | byr:2001 hcl:#59c2d9 ecl:amb cid:163 10 | 11 | eyr:2024 hcl:#b6652a 12 | cid:340 13 | byr:1929 ecl:oth iyr:2014 pid:186640193 14 | hgt:193in 15 | 16 | iyr:2015 eyr:2024 hgt:184cm 17 | ecl:blu hcl:#a97842 byr:1959 pid:932817398 18 | 19 | iyr:1933 hcl:7c63aa cid:72 eyr:2028 20 | ecl:hzl 21 | byr:2009 hgt:164cm pid:104496116 22 | 23 | byr:1980 24 | hgt:181cm pid:192793676 hcl:8f6ae6 iyr:2021 eyr:1978 25 | 26 | pid:#63f479 hgt:75cm 27 | hcl:z iyr:1956 28 | byr:2024 ecl:#051344 29 | 30 | byr:2014 pid:159cm 31 | hgt:161cm 32 | ecl:#b4eef2 33 | iyr:2027 eyr:1933 hcl:743b1a 34 | 35 | cid:79 hgt:172cm byr:1932 eyr:2020 pid:127319843 hcl:#6b5442 iyr:2017 ecl:brn 36 | 37 | ecl:gry eyr:2020 byr:1976 38 | pid:093137171 iyr:2012 hgt:178cm hcl:#733820 39 | 40 | byr:1933 hcl:#733820 hgt:165cm eyr:2027 iyr:2018 ecl:oth pid:0952910465 41 | 42 | iyr:2014 43 | byr:1965 pid:304542033 44 | eyr:2032 45 | ecl:brn hgt:153in cid:259 hcl:z 46 | 47 | byr:2004 ecl:amb iyr:2013 48 | hcl:#a97842 49 | hgt:68in 50 | pid:248926471 eyr:1930 51 | 52 | pid:048596900 iyr:2021 byr:2021 eyr:2021 cid:104 53 | hcl:c3c9e0 ecl:hzl 54 | hgt:75cm 55 | 56 | pid:590195280 cid:159 byr:1951 hcl:#ceb3a1 ecl:brn iyr:2012 hgt:189cm eyr:2024 57 | 58 | iyr:2015 pid:639647361 hcl:#b6652a 59 | hgt:151cm byr:1957 cid:284 60 | ecl:gry 61 | eyr:2026 62 | 63 | ecl:blu hgt:175cm pid:462959720 hcl:#602927 iyr:2014 byr:1972 64 | eyr:2023 65 | 66 | ecl:blu eyr:2023 hgt:175cm 67 | pid:090406335 hcl:#b6652a iyr:2012 byr:1921 68 | 69 | eyr:2025 hcl:#733820 70 | pid:775468504 ecl:hzl byr:1934 hgt:187cm iyr:2019 71 | 72 | ecl:#b35d5b hgt:121 hcl:z iyr:2002 eyr:2034 73 | byr:2014 74 | 75 | ecl:hzl byr:2026 hgt:77 iyr:1952 76 | hcl:#a97842 pid:#1461ed 77 | eyr:1921 78 | 79 | iyr:2019 80 | hgt:171in eyr:2040 pid:788162609 ecl:grn byr:2023 81 | 82 | hcl:#efcc98 eyr:2039 hgt:158cm byr:2026 pid:216112069 83 | 84 | ecl:blu hcl:#fffffd eyr:2020 pid:496018604 85 | byr:1982 hgt:168cm 86 | cid:70 iyr:2016 87 | 88 | eyr:2031 iyr:1958 89 | hcl:#c0946f hgt:181in ecl:#f88f2c pid:7896132641 90 | 91 | byr:1933 cid:118 eyr:2037 hcl:#cfa07d iyr:2030 92 | ecl:#686f76 hgt:170 93 | 94 | iyr:2010 95 | hgt:161cm ecl:grn byr:1958 hcl:#7d3b0c 96 | pid:523557068 97 | 98 | hcl:ba3af2 pid:157cm eyr:2037 cid:135 ecl:zzz hgt:153 byr:2030 99 | 100 | ecl:grn byr:1967 cid:191 101 | iyr:2012 hcl:#866857 102 | pid:822899368 hgt:152cm eyr:2024 103 | 104 | iyr:2015 105 | cid:343 hcl:#6b5442 pid:119981062 hgt:67in eyr:2027 106 | ecl:gry 107 | byr:2001 108 | 109 | pid:#c68245 ecl:blu hgt:107 hcl:74f3fb eyr:1996 iyr:1955 byr:2025 110 | 111 | hgt:63cm eyr:1925 112 | iyr:2019 byr:2013 pid:#3ab227 ecl:#e33d1d hcl:#efcc98 113 | 114 | byr:1941 eyr:2029 iyr:2011 hgt:159cm 115 | hcl:#602927 116 | ecl:brn cid:245 pid:977877701 117 | 118 | pid:575539099 119 | eyr:2031 byr:1987 ecl:oth hcl:#cfa07d 120 | iyr:2017 121 | hgt:69cm 122 | 123 | pid:563180951 hgt:153cm ecl:amb iyr:2016 124 | byr:1951 hcl:#341e13 eyr:2029 125 | cid:277 126 | 127 | hcl:#623a2f iyr:2011 hgt:171cm byr:1929 ecl:oth 128 | eyr:2024 pid:959212059 129 | 130 | byr:1943 ecl:#3925f3 hgt:68cm pid:155cm cid:127 eyr:2011 131 | hcl:2a53fd 132 | iyr:2030 133 | 134 | hgt:160in byr:2014 pid:7846412647 135 | hcl:2d18c8 136 | ecl:#8655df eyr:2034 iyr:2023 137 | 138 | byr:1932 hgt:170cm cid:331 eyr:2020 pid:52551410 ecl:gry 139 | iyr:2013 140 | hcl:#c6944c 141 | 142 | hcl:#888785 pid:177cm ecl:oth 143 | hgt:160cm eyr:2021 byr:1957 144 | iyr:2013 145 | 146 | iyr:2020 pid:6245137 eyr:2027 cid:111 hgt:181cm 147 | byr:2024 ecl:gmt hcl:fe8828 148 | 149 | pid:648300488 cid:230 hcl:#efcc98 150 | byr:1989 hgt:159cm 151 | ecl:gry iyr:2015 152 | eyr:2030 153 | 154 | iyr:1929 cid:144 hgt:168in pid:185cm 155 | byr:2017 hcl:z eyr:1960 ecl:#d406d2 156 | 157 | hcl:3a4933 158 | hgt:155cm 159 | pid:337576945 byr:1925 iyr:2014 ecl:brn eyr:2026 160 | 161 | pid:170cm cid:291 eyr:2017 iyr:2017 hgt:177cm hcl:z ecl:gmt 162 | 163 | pid:271148544 hgt:163cm 164 | byr:1926 hcl:#fffffd iyr:2013 165 | eyr:2022 166 | 167 | hgt:64in iyr:2030 ecl:#15c6b5 eyr:2028 byr:2025 168 | pid:3426144 169 | 170 | eyr:1923 byr:1943 hcl:#64d609 iyr:2017 pid:154cm hgt:160cm ecl:brn 171 | 172 | hcl:#602927 hgt:170cm ecl:utc iyr:1954 pid:370180054 173 | byr:1925 cid:162 174 | eyr:1983 175 | 176 | hcl:#888785 byr:1932 hgt:163cm 177 | eyr:2026 178 | ecl:grn pid:799844918 179 | 180 | eyr:2029 181 | ecl:blu cid:231 hgt:157cm 182 | pid:609233861 183 | hcl:#462640 184 | byr:1940 iyr:2012 185 | 186 | iyr:2025 187 | byr:2004 pid:#e92a77 188 | eyr:2014 cid:78 189 | ecl:zzz hgt:187in hcl:76be6e 190 | 191 | eyr:2027 iyr:2012 ecl:brn byr:1955 pid:128923308 192 | cid:313 hgt:156cm hcl:#623a2f 193 | 194 | hcl:#ceb3a1 195 | hgt:178cm byr:1984 196 | pid:121442385 eyr:2036 iyr:2014 ecl:hzl 197 | 198 | eyr:2038 ecl:#c6149f iyr:1983 199 | cid:304 hgt:193 byr:2019 200 | hcl:z pid:5871630079 201 | 202 | iyr:2028 eyr:2002 203 | hgt:146 204 | hcl:#623a2f 205 | pid:390145814 206 | byr:1937 207 | 208 | pid:923652966 ecl:amb 209 | eyr:2027 hgt:174cm byr:1932 iyr:2014 210 | hcl:#fffffd 211 | 212 | iyr:2026 cid:202 byr:1995 hcl:69c01a 213 | hgt:164cm eyr:2020 ecl:hzl 214 | 215 | hgt:156cm 216 | byr:2004 217 | pid:537532371 218 | hcl:z iyr:1988 219 | eyr:2024 220 | ecl:utc 221 | 222 | iyr:2018 byr:1924 hcl:#602927 cid:132 pid:947815343 eyr:2030 ecl:grn 223 | 224 | byr:1978 hcl:#c0946f iyr:2012 hgt:67cm 225 | eyr:2032 pid:929470763 ecl:amb 226 | 227 | eyr:2028 228 | pid:545502229 ecl:gry 229 | hcl:#866857 hgt:182cm 230 | byr:1964 iyr:2016 231 | 232 | hcl:z cid:82 hgt:108 byr:2010 pid:#1650b3 eyr:2020 iyr:2017 ecl:hzl 233 | 234 | iyr:2018 235 | hgt:61cm 236 | ecl:lzr byr:1980 hcl:1d4bc2 cid:306 237 | pid:763925614 eyr:2006 238 | 239 | byr:2021 eyr:2029 240 | pid:610596568 241 | ecl:oth 242 | hcl:#7d3b0c 243 | iyr:2010 cid:83 hgt:156cm 244 | 245 | cid:181 ecl:hzl 246 | hcl:#8d79d2 247 | hgt:192cm 248 | byr:1958 iyr:2014 eyr:2026 pid:118367138 249 | 250 | byr:1978 251 | eyr:2020 252 | iyr:2025 hgt:176cm 253 | ecl:grn hcl:faedc2 254 | 255 | hgt:156cm eyr:1989 pid:#7acc45 cid:235 hcl:1332ba 256 | ecl:#2b7525 iyr:1950 byr:1943 257 | 258 | pid:147647267 hcl:#341e13 259 | ecl:hzl 260 | iyr:2019 261 | byr:1975 262 | hgt:153cm eyr:2020 263 | 264 | iyr:2026 hgt:170cm ecl:oth 265 | byr:2017 pid:047129729 266 | eyr:2024 hcl:#733820 267 | 268 | hcl:#fffffd byr:1960 ecl:gry eyr:2023 269 | iyr:2013 hgt:186cm pid:145757697 270 | 271 | hgt:64in 272 | ecl:amb 273 | byr:1930 pid:808797855 iyr:2019 274 | hcl:#b6652a eyr:2022 275 | 276 | eyr:2030 277 | hcl:z iyr:2013 hgt:165cm ecl:#5ba775 278 | pid:168306092 byr:1988 279 | 280 | eyr:2026 ecl:gry iyr:2020 hcl:#b6652a hgt:177cm 281 | byr:1991 pid:780666689 282 | 283 | iyr:2020 284 | pid:#d08e64 eyr:2010 hcl:411b04 cid:140 hgt:76cm ecl:grn byr:2005 285 | 286 | iyr:1945 287 | pid:973836167 ecl:zzz 288 | hcl:z hgt:181in byr:2008 eyr:1993 289 | 290 | cid:58 eyr:2024 hgt:159cm byr:1977 ecl:hzl pid:402427328 291 | hcl:#888785 292 | iyr:2012 293 | 294 | pid:533381616 byr:2027 295 | eyr:2040 hgt:60cm iyr:2023 hcl:z 296 | ecl:gmt 297 | 298 | pid:229044973 cid:149 hgt:178in eyr:2029 299 | byr:2006 ecl:dne iyr:2012 300 | hcl:bf4bc2 301 | 302 | hgt:161cm byr:1973 ecl:oth iyr:2015 hcl:#341e13 pid:658452720 303 | eyr:2024 304 | 305 | hcl:#efcc98 hgt:156cm 306 | byr:1931 iyr:1997 pid:0548175409 ecl:utc 307 | 308 | pid:575623915 iyr:2017 eyr:2023 hcl:#733820 byr:1938 309 | ecl:blu 310 | hgt:185cm 311 | 312 | hcl:#55ebaa 313 | hgt:157cm ecl:blu byr:1945 314 | pid:946614649 315 | eyr:2020 iyr:2012 316 | 317 | hgt:158cm hcl:#b80425 iyr:2017 eyr:2025 ecl:gry 318 | byr:1944 pid:838975683 319 | 320 | hcl:#41731c iyr:2020 byr:1971 ecl:oth 321 | hgt:186cm 322 | eyr:2030 pid:495358045 323 | 324 | pid:3884291521 325 | eyr:2037 hgt:74cm byr:2003 ecl:hzl iyr:2022 hcl:#888785 cid:124 326 | 327 | hgt:175cm cid:340 byr:1921 328 | pid:183491348 329 | iyr:2017 ecl:brn hcl:#602927 eyr:2028 330 | 331 | hcl:#cfa07d 332 | hgt:161cm byr:2006 333 | eyr:2024 334 | pid:109854634 335 | ecl:xry iyr:2024 336 | 337 | ecl:#ec6311 hcl:z iyr:2015 338 | pid:#783693 339 | eyr:1932 340 | cid:271 341 | hgt:82 342 | 343 | ecl:grn 344 | hgt:164cm hcl:#efcc98 eyr:2020 pid:824236769 345 | byr:1952 iyr:2014 346 | 347 | eyr:1964 pid:85558869 byr:2017 hcl:c81d94 348 | iyr:2028 349 | hgt:63cm 350 | ecl:#c00640 cid:115 351 | 352 | byr:2010 353 | pid:431600716 354 | hcl:z hgt:112 ecl:#3057e9 eyr:2027 iyr:2017 cid:91 355 | 356 | byr:2026 357 | eyr:2037 358 | pid:3800489571 ecl:grn 359 | cid:91 hcl:94b4d1 hgt:59cm 360 | 361 | cid:199 byr:2030 362 | iyr:2021 363 | hcl:c55653 364 | hgt:168cm 365 | pid:160cm 366 | 367 | hgt:68cm 368 | byr:2025 iyr:2023 eyr:1983 369 | hcl:0004d4 ecl:#19fca6 pid:89901951 370 | 371 | hgt:170cm byr:2012 372 | eyr:1981 hcl:c95b58 373 | pid:#d28b3f cid:302 iyr:1953 ecl:#151ea4 374 | 375 | hcl:#6b5442 eyr:2024 hgt:161cm 376 | cid:210 ecl:#793ac0 377 | pid:480283173 378 | iyr:2019 byr:1967 379 | 380 | cid:82 ecl:amb iyr:2017 eyr:2023 byr:1980 hgt:59in hcl:#888785 pid:323524654 381 | 382 | hcl:#341e13 hgt:154cm 383 | iyr:2015 eyr:2023 384 | byr:1953 ecl:blu pid:872964523 385 | 386 | iyr:2019 387 | byr:1945 hcl:#efcc98 388 | hgt:155in 389 | ecl:#1608c7 eyr:2030 pid:406045604 390 | 391 | ecl:lzr byr:2015 iyr:1938 392 | eyr:2026 hcl:z 393 | pid:542894703 hgt:185 394 | 395 | eyr:2021 hcl:#cfa07d ecl:hzl hgt:82 396 | iyr:2018 byr:1932 397 | pid:661993261 398 | 399 | ecl:brn hcl:#602927 400 | hgt:193cm pid:572216250 401 | byr:1929 eyr:2020 iyr:2010 cid:206 402 | 403 | ecl:amb 404 | eyr:2025 405 | pid:932260335 byr:1978 iyr:2012 406 | hcl:#cfa07d 407 | cid:260 hgt:67in 408 | 409 | pid:635410614 410 | byr:1948 hgt:156cm hcl:#071bc0 eyr:2026 411 | ecl:grn 412 | cid:275 413 | iyr:2014 414 | 415 | hcl:#8a4888 byr:1986 416 | iyr:2010 ecl:amb cid:113 417 | pid:974757414 hgt:174cm 418 | eyr:2024 419 | 420 | byr:1934 ecl:amb iyr:2016 421 | pid:280206549 hgt:176cm 422 | eyr:2020 hcl:#fffffd 423 | 424 | pid:544634927 425 | eyr:2021 hgt:188cm byr:1947 iyr:2020 426 | hcl:#008716 ecl:oth 427 | cid:97 428 | 429 | eyr:2026 pid:863010622 430 | byr:1978 hcl:#b6652a hgt:157cm cid:323 iyr:2020 ecl:blu 431 | 432 | cid:105 433 | byr:1926 434 | hcl:#6b5442 pid:049198636 eyr:2026 hgt:75in 435 | iyr:2018 ecl:blu 436 | 437 | eyr:2038 hgt:76cm byr:2020 pid:9036865757 iyr:2025 438 | ecl:#a2c975 439 | hcl:z 440 | cid:340 441 | 442 | pid:425619875 cid:263 byr:1935 443 | eyr:2028 hgt:192cm iyr:2010 hcl:#a6ddfc ecl:hzl 444 | 445 | cid:107 hgt:189cm 446 | hcl:#733820 ecl:blu 447 | eyr:2028 iyr:2020 pid:814895947 448 | 449 | cid:96 hgt:74in 450 | hcl:z 451 | pid:170cm ecl:#0240fd byr:2004 iyr:2013 eyr:1936 452 | 453 | ecl:blu 454 | eyr:2027 hcl:#341e13 455 | iyr:2020 456 | cid:94 457 | hgt:174cm 458 | 459 | iyr:2013 ecl:amb 460 | eyr:2030 hcl:#b6652a 461 | byr:1964 462 | pid:329942894 463 | 464 | byr:1995 ecl:hzl eyr:2030 465 | hgt:177cm hcl:#341e13 466 | cid:64 467 | 468 | eyr:2027 pid:708191313 469 | ecl:#390609 byr:2022 iyr:2010 cid:292 hgt:129 470 | hcl:#733820 471 | 472 | hcl:#733820 ecl:hzl eyr:2030 473 | iyr:2011 474 | hgt:156cm 475 | byr:2002 pid:932464949 476 | 477 | iyr:1941 478 | byr:2027 ecl:xry eyr:1949 pid:82479270 479 | hgt:175 hcl:z 480 | cid:157 481 | 482 | byr:1927 pid:708954312 eyr:2028 ecl:oth hgt:167cm hcl:#602927 iyr:2011 483 | 484 | cid:125 eyr:2034 iyr:2030 485 | hgt:116 byr:2030 486 | hcl:f773ce pid:#d24ed1 ecl:lzr 487 | 488 | hcl:#efcc98 byr:1947 pid:423105162 ecl:brn iyr:2019 hgt:154cm 489 | eyr:2026 490 | cid:174 491 | 492 | iyr:2017 493 | ecl:gry 494 | hcl:#341e13 495 | pid:314487906 eyr:2038 hgt:171cm byr:2014 496 | 497 | pid:630479640 ecl:brn hgt:163cm 498 | iyr:2013 eyr:2028 byr:1998 hcl:#866857 499 | 500 | iyr:2013 hcl:z byr:2016 501 | ecl:#43d879 pid:996281170 502 | cid:200 hgt:153 eyr:2030 503 | 504 | byr:2023 505 | pid:081908248 iyr:2020 506 | eyr:2035 507 | hgt:175in ecl:grt hcl:30ab42 508 | 509 | iyr:2018 byr:1995 eyr:2029 ecl:grn pid:882123182 hgt:62cm hcl:#fffffd 510 | 511 | byr:1978 hcl:z 512 | iyr:1923 ecl:blu eyr:2037 pid:#1f3467 hgt:186cm 513 | 514 | cid:264 ecl:#ab07c5 iyr:1927 hcl:2d6f9c 515 | hgt:74cm byr:2008 pid:874594495 eyr:2035 516 | 517 | ecl:lzr hgt:69cm 518 | hcl:76854c cid:336 pid:7830555583 519 | iyr:1920 520 | byr:2021 eyr:2038 521 | 522 | hgt:160cm byr:2029 ecl:#7f9d1b hcl:z iyr:1975 523 | pid:652466273 524 | eyr:2031 525 | 526 | ecl:oth 527 | eyr:2027 iyr:2019 pid:544347482 528 | byr:1988 hgt:182cm hcl:#cfa07d 529 | 530 | hgt:176cm iyr:2016 hcl:ec1dc3 531 | pid:521230755 byr:2030 ecl:amb eyr:2025 532 | 533 | pid:005216805 byr:1951 534 | ecl:hzl hcl:#efcc98 eyr:2022 535 | iyr:2016 536 | hgt:154cm 537 | 538 | byr:1943 hcl:#866857 539 | eyr:1984 hgt:64cm 540 | pid:3105984 iyr:1997 541 | ecl:lzr 542 | 543 | eyr:2024 544 | byr:1931 pid:929699878 hgt:169cm cid:81 hcl:#efcc98 545 | 546 | iyr:2011 pid:558972589 547 | hgt:163cm cid:155 eyr:2025 byr:1952 ecl:oth 548 | hcl:#c0946f 549 | 550 | pid:787560595 eyr:2036 551 | hcl:#888785 byr:1999 iyr:1971 ecl:blu 552 | 553 | hgt:165in pid:032310066 554 | eyr:1926 byr:1954 ecl:brn hcl:41964f iyr:2023 555 | 556 | hcl:#733820 557 | pid:563740385 558 | hgt:184cm 559 | iyr:1959 560 | ecl:gmt cid:242 byr:1999 561 | 562 | pid:4949046383 byr:2011 hcl:fcf63b 563 | ecl:hzl 564 | hgt:174in 565 | iyr:2023 eyr:1939 566 | 567 | cid:331 568 | ecl:grt hcl:z eyr:2003 hgt:172in byr:2012 iyr:1954 pid:#9f4663 569 | 570 | cid:223 byr:1939 eyr:2025 571 | ecl:oth hgt:161cm iyr:2015 pid:214576789 hcl:#866857 572 | 573 | ecl:oth pid:912009529 byr:1968 hgt:161cm 574 | hcl:#ceb3a1 eyr:2023 iyr:2017 575 | 576 | pid:858541281 hgt:150cm eyr:2021 577 | iyr:2013 ecl:gry 578 | hcl:#fffffd byr:1959 579 | 580 | ecl:#0024e0 byr:2006 cid:107 581 | iyr:2015 hcl:684416 hgt:94 pid:152cm eyr:2031 582 | 583 | byr:1987 hcl:z 584 | ecl:gry pid:#246fe1 hgt:65cm eyr:1992 iyr:2020 585 | 586 | pid:426999585 587 | ecl:hzl byr:1949 hcl:#888785 hgt:191cm 588 | iyr:2020 eyr:2020 589 | 590 | byr:1951 hcl:#623a2f 591 | cid:308 ecl:hzl 592 | hgt:174cm pid:226138254 593 | eyr:2028 594 | iyr:2018 595 | 596 | ecl:brn hgt:62in 597 | eyr:2020 hcl:#ceb3a1 pid:650916481 598 | byr:1940 599 | iyr:2018 600 | 601 | hcl:#efcc98 ecl:brn 602 | byr:1940 eyr:2024 pid:#68d3ab 603 | hgt:177cm cid:83 604 | iyr:2017 605 | 606 | pid:9704738756 hcl:#fffffd eyr:1925 607 | iyr:2019 byr:1929 ecl:blu hgt:191cm 608 | 609 | ecl:brn hgt:151cm hcl:#c0946f iyr:2018 pid:602505609 eyr:2020 610 | byr:1974 611 | 612 | hgt:178cm 613 | eyr:2023 byr:1922 614 | iyr:2013 615 | hcl:#fffffd pid:205291054 ecl:blu 616 | 617 | byr:1985 618 | iyr:2016 hcl:#ceb3a1 hgt:161cm eyr:2030 ecl:amb 619 | pid:871809978 620 | 621 | iyr:2027 ecl:#d9c9cb hgt:110 622 | eyr:2034 623 | hcl:99d4ee pid:13355969 cid:168 624 | 625 | ecl:utc byr:2019 626 | iyr:2016 hgt:173in cid:266 627 | hcl:z eyr:2033 628 | pid:1835189643 629 | 630 | pid:364874100 ecl:amb hcl:#6b5442 hgt:184cm 631 | iyr:2017 eyr:2026 byr:1920 cid:127 632 | 633 | ecl:dne eyr:2020 634 | byr:2018 cid:262 635 | iyr:2010 hgt:60cm 636 | pid:95409983 hcl:z 637 | 638 | eyr:2026 639 | pid:135963889 iyr:2018 hcl:#ceb3a1 640 | ecl:amb 641 | 642 | hcl:#341e13 eyr:2028 iyr:2014 byr:1978 643 | cid:309 644 | pid:503628987 645 | ecl:oth hgt:159cm 646 | 647 | hcl:#a97842 648 | pid:171194014 hgt:193cm eyr:2023 649 | byr:1945 ecl:grt 650 | iyr:2019 651 | 652 | eyr:1967 cid:135 hcl:z 653 | ecl:gmt 654 | iyr:2024 pid:#a87744 655 | byr:2023 hgt:168cm 656 | 657 | pid:169cm 658 | cid:337 ecl:hzl hcl:#888785 byr:1927 hgt:153cm 659 | iyr:2022 eyr:2020 660 | 661 | byr:1963 hcl:#fffffd eyr:2021 662 | hgt:62in pid:702188504 iyr:2013 663 | ecl:hzl 664 | 665 | iyr:2024 ecl:amb hcl:#ceb3a1 666 | eyr:2017 pid:49752568 hgt:179cm byr:1938 667 | 668 | byr:2006 669 | ecl:#08021a 670 | eyr:2022 pid:520309937 671 | hgt:61in hcl:#ceb3a1 672 | iyr:2013 673 | 674 | hgt:150cm hcl:#733820 byr:1971 ecl:zzz cid:347 675 | iyr:2020 eyr:2020 pid:6028818045 676 | 677 | byr:2005 hgt:69cm 678 | ecl:lzr hcl:z iyr:2009 eyr:2038 pid:79626157 679 | 680 | iyr:2020 byr:2015 pid:882923693 hcl:#888785 eyr:2030 681 | ecl:xry hgt:65in 682 | 683 | hcl:z hgt:187cm pid:4397913655 iyr:1973 eyr:1925 684 | ecl:#93ae1a 685 | 686 | hgt:169cm 687 | iyr:2019 eyr:2023 pid:678937529 688 | ecl:blu byr:1998 hcl:#fffffd 689 | 690 | cid:87 hcl:#efcc98 691 | ecl:#e56390 692 | iyr:2013 hgt:191in 693 | eyr:2027 pid:923358773 byr:1960 694 | 695 | hgt:190cm byr:1939 696 | cid:55 eyr:2026 ecl:blu hcl:#623a2f pid:363917612 697 | iyr:2012 698 | 699 | pid:177cm hgt:165cm cid:276 eyr:2002 byr:2010 hcl:#7bea4c iyr:2017 700 | ecl:grt 701 | 702 | byr:2023 eyr:2031 703 | iyr:1987 hgt:172 hcl:z 704 | pid:4973557135 ecl:#7517e2 705 | 706 | eyr:2036 iyr:1989 ecl:#ef5492 hgt:188in pid:#b50065 707 | hcl:92e9ee byr:2015 708 | 709 | pid:873654822 iyr:2016 cid:310 710 | hgt:76in 711 | eyr:2029 hcl:#888785 byr:1958 712 | ecl:brn 713 | 714 | iyr:2013 ecl:amb byr:2024 715 | hgt:166cm 716 | cid:221 eyr:2040 pid:358648642 hcl:#733820 717 | 718 | hgt:181cm cid:295 ecl:blu eyr:2027 719 | iyr:2016 720 | byr:1932 721 | hcl:#2502ba 722 | pid:177357899 723 | 724 | pid:154588649 eyr:2028 725 | byr:1945 iyr:2020 726 | ecl:amb cid:220 727 | hgt:189cm hcl:#a97842 728 | 729 | iyr:2011 730 | eyr:2030 cid:143 byr:1998 pid:403108989 731 | ecl:oth hcl:#6b5442 732 | hgt:151cm 733 | 734 | pid:071042426 cid:217 iyr:2017 ecl:grn byr:1989 eyr:2026 hgt:193cm hcl:#7d3b0c 735 | 736 | eyr:2025 737 | iyr:2025 pid:3942412883 hcl:#cfa07d cid:237 ecl:utc hgt:182 738 | 739 | iyr:2012 eyr:1982 byr:2029 pid:8573047090 740 | hgt:159in ecl:#1e0124 hcl:#b6652a 741 | 742 | hcl:53c64f ecl:gmt iyr:1984 byr:2029 743 | hgt:59cm 744 | pid:#106076 eyr:2031 745 | 746 | hcl:#733820 iyr:2019 747 | eyr:2031 748 | pid:706963298 749 | hgt:134 750 | byr:2004 751 | 752 | byr:2012 cid:161 753 | eyr:2039 ecl:gry hgt:61cm iyr:1949 pid:870113802 hcl:z 754 | 755 | byr:1961 eyr:2023 pid:353075198 iyr:2020 hcl:#888785 ecl:oth 756 | hgt:163cm 757 | 758 | byr:2001 iyr:2015 759 | hgt:159cm hcl:#623a2f ecl:#3303fc 760 | pid:86352609 eyr:2030 761 | 762 | pid:392475721 ecl:brn byr:1927 iyr:2014 eyr:2024 hcl:#fffffd 763 | 764 | hgt:160cm eyr:2022 byr:1979 iyr:2010 765 | pid:974489456 766 | hcl:#efcc98 767 | 768 | ecl:grn eyr:2024 769 | hgt:166cm byr:1961 770 | pid:221051556 771 | hcl:#6b5442 772 | iyr:2028 773 | 774 | iyr:2010 cid:156 775 | byr:2005 hgt:155cm ecl:amb eyr:1988 776 | hcl:#866857 777 | pid:169cm 778 | 779 | eyr:2038 byr:1991 pid:#9b82ce 780 | iyr:2027 hcl:z 781 | cid:278 hgt:59cm ecl:#179d81 782 | 783 | ecl:blu hgt:151cm 784 | iyr:2013 785 | cid:117 pid:129843687 hcl:#c429e7 byr:1961 786 | eyr:2022 787 | 788 | hcl:#602927 byr:1996 pid:507775673 eyr:2020 hgt:153cm ecl:oth 789 | cid:251 iyr:2010 790 | 791 | hgt:170cm ecl:oth iyr:2010 eyr:2025 hcl:#602927 byr:1983 pid:113809908 792 | 793 | hcl:#c0946f pid:172142380 794 | iyr:2017 byr:1926 795 | hgt:190cm eyr:2028 796 | ecl:brn 797 | 798 | pid:812443511 hcl:#6b5442 eyr:2021 ecl:amb 799 | cid:60 iyr:2017 hgt:157cm byr:1926 800 | 801 | hgt:177cm 802 | ecl:gry eyr:2022 hcl:#888785 pid:570572334 byr:1943 iyr:2017 803 | 804 | pid:#967cbc hcl:z byr:2020 ecl:oth eyr:2035 iyr:2015 805 | cid:99 hgt:65cm 806 | 807 | iyr:2019 pid:285935311 hcl:#4c1ee4 byr:1954 eyr:2028 hgt:157cm 808 | 809 | ecl:xry eyr:1939 810 | pid:192cm 811 | hgt:114 812 | hcl:b97555 byr:2004 iyr:1970 813 | 814 | ecl:grn byr:2021 iyr:2030 815 | hcl:z pid:305489303 hgt:61cm eyr:2020 816 | 817 | eyr:2036 hgt:179cm 818 | pid:#8be5f5 byr:1981 819 | hcl:#cb5848 iyr:2015 820 | 821 | iyr:2011 ecl:oth hgt:176cm cid:344 pid:539941547 hcl:#efcc98 822 | 823 | eyr:1987 ecl:amb 824 | byr:2029 pid:046017350 825 | cid:182 iyr:2011 hcl:z hgt:191cm 826 | 827 | iyr:2019 byr:1948 eyr:2020 ecl:hzl hgt:176cm hcl:#733820 pid:235101182 828 | 829 | ecl:hzl 830 | eyr:2029 pid:262843012 hgt:76in hcl:#efcc98 iyr:2015 byr:1931 831 | 832 | iyr:2011 ecl:blu hgt:184cm 833 | byr:1945 834 | hcl:#c0946f pid:105042852 835 | 836 | iyr:2010 837 | pid:485638522 hcl:949a37 eyr:2030 838 | hgt:193cm 839 | ecl:gry byr:2021 840 | 841 | pid:565896801 eyr:2029 hcl:#fffffd ecl:amb iyr:2016 byr:1977 842 | hgt:170cm 843 | 844 | byr:1987 845 | hcl:#c0946f pid:931311386 846 | iyr:2010 eyr:2022 847 | 848 | eyr:2030 849 | hgt:177cm hcl:#a97842 byr:1978 850 | ecl:hzl pid:358177000 851 | iyr:2014 852 | 853 | iyr:2025 854 | pid:3639383157 cid:82 hcl:f2aec0 hgt:179cm 855 | eyr:1944 byr:1969 856 | ecl:#e167d3 857 | 858 | hgt:107 ecl:gmt iyr:2030 hcl:#866857 byr:2026 eyr:1990 pid:#87773e 859 | 860 | cid:220 hcl:z iyr:1921 hgt:65cm byr:1998 ecl:#34397f eyr:2035 861 | 862 | hcl:44e552 pid:#6f341e ecl:#59aeb1 863 | eyr:1926 hgt:187 iyr:1988 864 | byr:1991 865 | 866 | hcl:z hgt:70cm pid:653386115 iyr:1964 byr:2026 cid:103 867 | ecl:#b81c45 eyr:2034 868 | 869 | hcl:#623a2f cid:307 pid:204266921 hgt:172cm 870 | iyr:2012 871 | ecl:hzl 872 | eyr:2021 873 | byr:1984 874 | 875 | hgt:192cm 876 | byr:1930 pid:39349843 hcl:#866857 iyr:2013 cid:130 ecl:blu eyr:1962 877 | 878 | cid:97 eyr:2036 pid:#279c0b ecl:dne hgt:186in iyr:1973 hcl:691266 879 | 880 | byr:2026 hgt:185cm hcl:z ecl:grt pid:#562f7a eyr:1986 iyr:2029 881 | 882 | ecl:brn 883 | hcl:#b6652a eyr:2028 884 | pid:570023672 885 | byr:1988 hgt:162cm iyr:2015 886 | 887 | hgt:180in ecl:zzz hcl:5b1477 byr:2024 888 | eyr:2028 889 | pid:#b03174 890 | 891 | pid:157cm eyr:1989 hgt:188cm 892 | iyr:2015 893 | hcl:3362a9 ecl:gry byr:2027 894 | 895 | pid:111584950 896 | byr:1941 ecl:grn iyr:2013 hgt:179cm hcl:#866857 897 | eyr:2024 898 | 899 | ecl:#7f4baa 900 | iyr:2015 hcl:de1367 901 | eyr:2024 byr:1959 902 | pid:#cf4e78 hgt:60cm 903 | 904 | byr:2024 eyr:1953 pid:21579220 905 | hgt:179 906 | cid:94 907 | hcl:#a97842 908 | iyr:1977 ecl:xry 909 | 910 | hgt:179cm eyr:2020 911 | ecl:hzl hcl:#efcc98 912 | pid:905622096 byr:1929 913 | 914 | ecl:oth 915 | byr:2001 eyr:2008 iyr:2020 916 | hcl:#ceb3a1 pid:244298637 hgt:160cm 917 | 918 | eyr:2030 919 | byr:1972 hcl:#341e13 920 | ecl:grn iyr:2014 pid:274475554 hgt:71in 921 | 922 | byr:1938 hcl:z iyr:1956 pid:153cm hgt:62cm ecl:grt 923 | eyr:2036 924 | 925 | hgt:177cm cid:276 iyr:1921 hcl:19aa96 pid:843799864 eyr:2033 926 | ecl:#812d68 927 | 928 | pid:686496844 929 | ecl:brn hcl:#733820 930 | byr:1948 iyr:2010 eyr:2020 931 | hgt:164cm 932 | 933 | pid:39436322 ecl:blu hcl:25b3d4 hgt:185in 934 | iyr:2019 byr:1959 eyr:2022 935 | 936 | pid:119603708 hcl:#866857 byr:1983 hgt:157cm iyr:1978 ecl:hzl eyr:1945 937 | 938 | cid:331 hcl:z iyr:2017 939 | pid:255988517 940 | byr:2015 941 | eyr:2020 ecl:amb 942 | hgt:171 943 | 944 | hgt:180cm iyr:2013 ecl:brn 945 | hcl:#602927 byr:1943 946 | pid:898265221 eyr:2025 947 | 948 | eyr:2024 949 | hgt:163cm 950 | pid:892793767 byr:1971 ecl:oth iyr:2013 cid:119 hcl:#02f6b3 951 | 952 | byr:1920 cid:221 953 | pid:#7515a7 hgt:160in 954 | eyr:1921 iyr:1983 hcl:z 955 | 956 | byr:2029 hcl:z hgt:75cm eyr:1975 pid:184cm iyr:1992 ecl:dne 957 | 958 | iyr:1990 959 | hgt:174in eyr:1961 ecl:brn 960 | hcl:#a3313e byr:2029 961 | 962 | hgt:191cm eyr:2026 iyr:2019 ecl:brn 963 | byr:1930 hcl:#7d3b0c cid:174 964 | 965 | ecl:amb iyr:2015 hgt:163cm 966 | pid:664966673 hcl:#602927 eyr:2026 cid:229 byr:1941 967 | 968 | pid:3123244013 eyr:2037 iyr:2022 hcl:103dfa 969 | hgt:156cm byr:2027 ecl:gmt cid:195 970 | 971 | cid:151 ecl:blu pid:693382940 972 | iyr:2011 byr:1954 973 | hgt:170cm eyr:2030 hcl:#866857 974 | 975 | hcl:#341e13 eyr:2023 byr:1948 iyr:2010 pid:607929427 976 | ecl:oth hgt:160cm 977 | 978 | hcl:#c0946f 979 | ecl:brn 980 | hgt:189cm 981 | cid:116 iyr:2013 pid:277606931 982 | byr:1975 983 | 984 | eyr:2027 985 | cid:206 ecl:gry iyr:2010 hcl:#866857 byr:1997 hgt:190cm pid:687577894 986 | 987 | eyr:2029 iyr:2015 pid:681485527 988 | byr:1925 hgt:152cm 989 | ecl:amb hcl:#341e13 990 | 991 | eyr:2030 992 | hcl:#c396d9 993 | hgt:159cm pid:686268817 994 | ecl:brn byr:1983 995 | iyr:2017 996 | 997 | eyr:2038 byr:2012 998 | cid:303 999 | iyr:1941 hcl:z ecl:utc pid:203595168 1000 | hgt:71cm 1001 | 1002 | pid:863355278 hcl:#888785 1003 | iyr:2018 1004 | byr:1953 eyr:2022 hgt:167cm 1005 | ecl:amb 1006 | 1007 | pid:141244310 eyr:2025 hcl:#733820 ecl:amb hgt:154cm cid:61 iyr:2017 1008 | byr:1929 1009 | 1010 | pid:361065637 1011 | hcl:#623a2f byr:1964 iyr:2015 eyr:2027 ecl:gry hgt:67in 1012 | 1013 | cid:117 ecl:brn iyr:2025 byr:1982 1014 | hcl:#ceb3a1 hgt:185cm 1015 | pid:34652522 1016 | 1017 | cid:275 ecl:#7a4722 eyr:2001 byr:2018 iyr:1995 1018 | hgt:105 1019 | pid:95250112 hcl:z 1020 | 1021 | iyr:2017 ecl:amb hgt:152cm hcl:#733820 cid:57 eyr:2020 pid:701621326 1022 | byr:1944 1023 | 1024 | hcl:#18171d 1025 | ecl:brn iyr:2015 hgt:175cm eyr:2028 pid:311636591 cid:113 1026 | byr:1979 1027 | 1028 | ecl:grn 1029 | hgt:185cm 1030 | pid:920998407 iyr:2016 byr:1930 eyr:2029 hcl:#7d3b0c 1031 | 1032 | iyr:2021 eyr:1931 1033 | hcl:z byr:2010 1034 | hgt:177in 1035 | pid:#cfb659 ecl:zzz 1036 | 1037 | cid:171 hcl:#888785 iyr:2010 byr:1970 ecl:hzl 1038 | pid:141430645 hgt:160cm 1039 | eyr:2026 1040 | 1041 | hgt:172cm ecl:gry 1042 | pid:428207256 cid:237 hcl:#733820 iyr:2012 1043 | eyr:2027 byr:1951 1044 | 1045 | hgt:70cm cid:76 ecl:#c544c3 byr:2019 1046 | pid:6133497812 1047 | hcl:#efcc98 1048 | eyr:2037 iyr:2015 1049 | 1050 | hgt:176in pid:582383714 byr:1980 ecl:amb hcl:08097e iyr:2020 eyr:2021 1051 | 1052 | ecl:oth 1053 | eyr:2024 1054 | hgt:176cm byr:1923 1055 | iyr:2014 pid:737058734 1056 | hcl:#b6652a cid:203 1057 | 1058 | ecl:amb 1059 | eyr:2029 1060 | hgt:186cm 1061 | pid:440986981 iyr:2010 hcl:#cfa07d 1062 | byr:1967 1063 | 1064 | pid:8729818647 hcl:z 1065 | ecl:#ae70eb cid:168 hgt:161cm iyr:2030 1066 | eyr:2020 byr:2022 1067 | 1068 | hcl:#43a092 hgt:165cm byr:1961 1069 | pid:026098019 1070 | iyr:2019 eyr:2020 ecl:amb 1071 | 1072 | cid:154 hgt:192cm 1073 | eyr:2016 iyr:2030 1074 | ecl:brn pid:#8e0762 byr:2020 1075 | 1076 | hgt:175cm ecl:brn byr:1944 1077 | pid:553456151 iyr:2016 eyr:2027 hcl:#085f41 1078 | 1079 | ecl:gry 1080 | byr:1975 eyr:2025 cid:122 pid:111078821 1081 | hcl:#b6652a iyr:2015 1082 | hgt:151cm 1083 | 1084 | hgt:159cm pid:946458516 eyr:2020 hcl:#a97842 byr:1972 1085 | iyr:2016 cid:88 ecl:oth 1086 | 1087 | eyr:2023 1088 | cid:156 1089 | byr:1999 1090 | hgt:186cm hcl:#fffffd pid:499141155 1091 | ecl:grn 1092 | 1093 | hcl:#888785 hgt:165cm pid:864544116 1094 | ecl:gry byr:1937 1095 | iyr:2020 eyr:2026 1096 | 1097 | hgt:155cm 1098 | iyr:2018 ecl:blu 1099 | hcl:#a97842 1100 | byr:1994 eyr:2024 1101 | 1102 | eyr:2021 iyr:2019 hgt:175cm cid:127 byr:1982 hcl:#888785 ecl:amb 1103 | 1104 | eyr:2022 iyr:2011 ecl:blu 1105 | pid:202081532 hcl:z hgt:177in byr:1923 1106 | 1107 | iyr:2017 cid:213 hcl:#fffffd 1108 | ecl:hzl 1109 | hgt:193cm pid:564823661 byr:1966 eyr:2030 1110 | 1111 | hcl:#623a2f iyr:2014 hgt:177cm byr:1950 ecl:amb 1112 | cid:290 eyr:2025 pid:669369557 1113 | 1114 | hgt:67cm 1115 | eyr:2028 ecl:brn 1116 | hcl:411b18 pid:222472243 1117 | 1118 | byr:1981 ecl:gry hcl:#b6652a eyr:2033 iyr:1943 pid:832989613 hgt:167cm 1119 | 1120 | byr:1970 1121 | cid:172 hcl:#64fbcb eyr:2007 1122 | ecl:hzl pid:982450142 1123 | hgt:61cm iyr:2019 1124 | 1125 | eyr:2025 1126 | hgt:161cm iyr:1962 1127 | pid:394421140 1128 | ecl:gry 1129 | cid:209 hcl:#efcc98 byr:2001 1130 | -------------------------------------------------------------------------------- /04/main.nim: -------------------------------------------------------------------------------- 1 | import npeg, strutils, sequtils 2 | 3 | var 4 | vs: seq[int] 5 | n: int 6 | 7 | template check(result=true) = 8 | if result: inc n 9 | 10 | template checkInt(r: typed) = 11 | check parseInt(capture[1].s) in r 12 | 13 | let p = peg passports: 14 | passports <- +(valid | invalid) 15 | valid <- +(field * Space) * Space: vs.add n; n = 0 16 | invalid <- @"\n\n": n = 0 17 | field <- byr | iyr | eyr | hgt_cm | hgt_in | hcl | ecl | pid | cid 18 | byr <- "byr:" * >+Digit: checkInt 1920..2002 19 | iyr <- "iyr:" * >+Digit: checkInt 2010..2020 20 | eyr <- "eyr:" * >+Digit: checkInt 2020..2030 21 | hgt_cm <- "hgt:" * >+Digit * "cm": checkInt 150..193 22 | hgt_in <- "hgt:" * >+Digit * "in": checkInt 59..76 23 | hcl <- "hcl:" * '#' * Xdigit[6]: check 24 | ecl <- "ecl:" * ("amb" | "blu" | "brn" | "gry" | "grn" | "hzl" | "oth"): check 25 | pid <- "pid:" * Digit[9]: check 26 | cid <- "cid:" * +Graph 27 | 28 | if p.match(readFile("input")).ok: 29 | echo "part2: ", vs.count(7) 30 | -------------------------------------------------------------------------------- /05/input: -------------------------------------------------------------------------------- 1 | FBBBBBBRRL 2 | BBFFFBBLRL 3 | FBFFBFFLRL 4 | FFBBBFBLRR 5 | FFBFBFFLLL 6 | BFBBBBFLLL 7 | FFBFFFFLLR 8 | FBBFBFBLRR 9 | BBBFFFFRRR 10 | BFBFFFBLLR 11 | BFFBBFBLLL 12 | FBBFFBFLRL 13 | FBBBFBFRLR 14 | BFBBBBBRRL 15 | BBFFBBFLLR 16 | FFBBBFBRRL 17 | FFBBFFBLLL 18 | BFFFFBFLLR 19 | FBBFBBBLRR 20 | FBBBFFFRRR 21 | BFBFFFFLRL 22 | BBFFFBBLRR 23 | FBFBBFBLRR 24 | FBBBBBFLLR 25 | FFBBBFBRRR 26 | BBBFFBBLLL 27 | FFFBBBBLLR 28 | FBBFBBFLLL 29 | FBFFBFFRLL 30 | BFBBFBFLLL 31 | FFBBBBFRLR 32 | BFBBFFBLLL 33 | FFBFFBFLLR 34 | BFBBBBFRLL 35 | BBBBFFFRLR 36 | FBFFFBBRRR 37 | BBBFFBFRLR 38 | BBFBFBFLRL 39 | FBBBBBBRLR 40 | FBBFFFBRRL 41 | BBFBFBBLLL 42 | BBFBFBFLLL 43 | BBFBBBBRRL 44 | BBBFFBFRRL 45 | FBFBBBBLLR 46 | BFFBFFFLLR 47 | FBBBBFFRRR 48 | BBFBFBFRLR 49 | BFFFBBFLLR 50 | BFBFFBFRLL 51 | FFBFFFBRLL 52 | BFFFFFBLRL 53 | BFBFBFBLLR 54 | BBFBBBBLLR 55 | BFFBFBBRRL 56 | FBFBBFBRRR 57 | FBBBFBFRRR 58 | FBFFFBBLLL 59 | FBBFFFFLRL 60 | FFBFFBBLLL 61 | BFBBBFBRLL 62 | BBBBFBFRRL 63 | FFBBFFBRRR 64 | FFFBBBFRRR 65 | FFBBFBFRRR 66 | BBFBBBFRLR 67 | BBBFFFBRRL 68 | FBBFBBFRRL 69 | BFFBFFFRRR 70 | BBFFBFBRRL 71 | BFBBBFBLRL 72 | FFFBBBBRLL 73 | FFBFFFFRLR 74 | BBFBFBFLLR 75 | FBBBFBFLLR 76 | BFFBBFFRRL 77 | BFFFBFBLLR 78 | FFBFFBFRLL 79 | FFBBBBFLLL 80 | FFFBBFFRRR 81 | FBFFBBBLRR 82 | FFFBBBBRLR 83 | FBFBBBBRRL 84 | FBFBBFBRLR 85 | BBFFBBFLRR 86 | BBBFFFBLRR 87 | BBFBFFBLRL 88 | FBFBFBBRLL 89 | BFBFBBFRRR 90 | BBFFBFFLLR 91 | FBFFFBBLRL 92 | FBFFFBBRLR 93 | FBFFBFBLLR 94 | FBBFFFFRLR 95 | FBFBFFBRRL 96 | BBFBFFBRLR 97 | FBBBBBFRRR 98 | FBFBFBFLLL 99 | BFBFFFBRLR 100 | FFFBBBBLLL 101 | FFBFFFFLRL 102 | BFFFFBFRRR 103 | BBBFFFFLLR 104 | BFBFBBFRLL 105 | FFBBBBFRRL 106 | BFBBBFFRLL 107 | FBFFFFBRRR 108 | FBFFBBFRRR 109 | BBFBFFFLLR 110 | FFBFFBBRLL 111 | FBBFBFFRLL 112 | FFBBFFBLRR 113 | FBBFBFFRRL 114 | FBFFFFFLRL 115 | BBBFBFBRLR 116 | FBBBBFBLLL 117 | BFFFFBBRLL 118 | FBBFBFBRLL 119 | BBBFBFFRRL 120 | BBBFFFBLLL 121 | FBBBBBBRLL 122 | FBFBBBBLLL 123 | BBBFFFBRLR 124 | BFFFBBFRLL 125 | BFFBFFBLRL 126 | BFBBBBBLLR 127 | FBBFFBBRRR 128 | FBBFFFFLLR 129 | BFBBFFFRLR 130 | FBFFFBBLRR 131 | BBFBBFFRLR 132 | BFFFFBFLRL 133 | FFBBBFFRRR 134 | FBFFFFFRLL 135 | BBFFBFFRLR 136 | FFBBBBBRRR 137 | FFBBBBFRLL 138 | FBFFFFFLRR 139 | FFBFFBFLRR 140 | BBFBBFFRRR 141 | BFBFBBBRRL 142 | FBBFBFFLRL 143 | FBBFFBBLLR 144 | BFFFFBBLLL 145 | BBFBBBBLRR 146 | BFBBFBFRRL 147 | BFBBFFFLRL 148 | FFBBFFBLRL 149 | BBFFBBFLLL 150 | BBBFBBBRLL 151 | BBFBFBBLRR 152 | BFFBFBBRLR 153 | FBFFBFBRLL 154 | FBFBBFFRLL 155 | BBFBBBBLRL 156 | BBFBFFBLLR 157 | FBBFFBFRRL 158 | FFBBFBFRRL 159 | BFFBBBBRRR 160 | BFFBBFFLRR 161 | BFFFFBFLLL 162 | FBFBBFFLRL 163 | FBFBFFFLRL 164 | FFBBFFFLRL 165 | FBBFBFFLRR 166 | BBFFFFBLLL 167 | BFBBBFFLLL 168 | BFFBBBBLLR 169 | BBBFBFFRLL 170 | BBFFFBFRLR 171 | FFBBFFFRLR 172 | FFFBBFBRLR 173 | BFBFBFFRRR 174 | BBFFFBBRLR 175 | BBBFFBBRRR 176 | FFBFFBFRRR 177 | BFBBBBBLRR 178 | FBBFBFBRRR 179 | BBFFFFFLLR 180 | FFBFBBBLRR 181 | BBFFFFFRRR 182 | FBFBBFFLLR 183 | BFBFFBFLLR 184 | FFBFBFBRLL 185 | BBBFFBBRLR 186 | FBBBBBFRLL 187 | FBFBBBFLLL 188 | BBBBFBBLRR 189 | BBBBFFBLRL 190 | BFBFBFBLLL 191 | BBFFBBBRLL 192 | BFBBFFFRLL 193 | BBBBFBFLRL 194 | FFBFBBFLLR 195 | BFBFFBFRRR 196 | BBFFFBFLLL 197 | FFBFBBBRRL 198 | FBFBFFFLLR 199 | FFBFBBFLRL 200 | BFFFBFFRLL 201 | FBFBFBFRLL 202 | FBBBFFBLLR 203 | FFBBBFFLRR 204 | BFFFFFFLRL 205 | FFBFBFFRLL 206 | BBBFBBFRRR 207 | FFBBFFBRLR 208 | BBFBBFBRLL 209 | FBBFBBBRLR 210 | FBFBFFBLRL 211 | FBBBFFFRRL 212 | BBBFBFFLRR 213 | FBFBBFBRRL 214 | BFBFBBFRLR 215 | BFFFFBBLLR 216 | BBBFBBBLRR 217 | FFBBBFFRRL 218 | FBFBFBBRRL 219 | FFFBBBFLLR 220 | BFFFFFFRRR 221 | FBFBFBBLRR 222 | BFFFBFFRRL 223 | FBBFBBFRRR 224 | FBFBFFBLRR 225 | FBBBBFBLLR 226 | BBBBFBBLRL 227 | BFFFBBFLRL 228 | BFBBBFBRRL 229 | BFBFBFBLRR 230 | FBBBBBBRRR 231 | FFBFBBBRLR 232 | FBFFFBBRRL 233 | BFFFFBFLRR 234 | BBFBFFFRRR 235 | FFBBFFFLRR 236 | BFBBBBFRRR 237 | FBFBFBFRRL 238 | BBFFFBFRRR 239 | BBBBFFBLLL 240 | BFFBBFBLLR 241 | FBFFFFBRRL 242 | FBBBFBFLRR 243 | FBBFFBFRLR 244 | FFBBBBFLRR 245 | BBFFFBBLLR 246 | FFBFBFFLLR 247 | BFFBFFBLLL 248 | BFFFBBFRLR 249 | BBFFFFBRRL 250 | BBFBFBFRLL 251 | FBFFFBFLRL 252 | BBFFBBBLRR 253 | BFBFBBFRRL 254 | BBBFFBFLRR 255 | BFFFBFBRLL 256 | BBBFBBBLRL 257 | BBFBBFFLLR 258 | BFBBBBFRRL 259 | FBBFFFBRLL 260 | BBBFBFFLRL 261 | BFBFFFBLRR 262 | BBBFBBFRLR 263 | BFBFBBBRLL 264 | FBBFBFFLLL 265 | FFBFBBFLRR 266 | BFBBFFFLRR 267 | BFFBBBFRRL 268 | FFFBBFBLRL 269 | FBFFBBFLRL 270 | FBFFFBFLLL 271 | FFBBBBBLRL 272 | FFFBBFFRLL 273 | BBFFBBBRRR 274 | BFBBFBBLRR 275 | BFBBBFFRRR 276 | BFBFFBFLLL 277 | BBBFFBFLRL 278 | BBFFFFBLRL 279 | FBFBBBFLRR 280 | FBFFBBBLLL 281 | FBBBBFFRRL 282 | BBBFFBFLLR 283 | BFFBFBFRRL 284 | BFFFBFFRRR 285 | BFBFBFBLRL 286 | BFBFBFFLLL 287 | FBFFBFBRRR 288 | BFFBFFBRLL 289 | BBBFBBBRRR 290 | FBFBFFBRRR 291 | FBFFFFFLLR 292 | FFBFBFFRRL 293 | BBFBBBFLLR 294 | FBFFBBBLRL 295 | BBFFFFBLRR 296 | FFFBBBBRRL 297 | FBFBFBBRLR 298 | FFBBBBFLLR 299 | FBFBBFBLRL 300 | FBFFBFFRRL 301 | FBBBFBBLLR 302 | FBFBBFFRRR 303 | BFBFBBBRLR 304 | BBFBBBBRRR 305 | FBFBBBFRRL 306 | BBFBBBBRLR 307 | FBFFBFFLLL 308 | FBBBFFBRLR 309 | FBFFFBFLRR 310 | BBFBFFFLRR 311 | FBFFFFBLRR 312 | FBFFBBFRLR 313 | FFFBBBFLLL 314 | BFFFBFBLRL 315 | FFBFFFFRRL 316 | BBFFBFBRLL 317 | BBFBBFFLRL 318 | BBBBFFFLRR 319 | FBBBBBBLRL 320 | BFBFBFBRRL 321 | BBBFFBBRRL 322 | FBBFBBBLLL 323 | FFBBFFFRLL 324 | FBFFFFFLLL 325 | FBBFBBFRLR 326 | FBFFBFFRRR 327 | BBFFFBBRLL 328 | FFFBBFFLLR 329 | BFFBFFBLRR 330 | BFBBBBBLRL 331 | FBBBFBFRRL 332 | BFFFFFFLRR 333 | FBFBFBBLRL 334 | BFBFFFBLRL 335 | FBBFFFBLRR 336 | BFFBFBFLRR 337 | FFBFBFBLLL 338 | BFBFFBFLRL 339 | FBBBFFBRLL 340 | FFBBBFBLLL 341 | FBFFFFFRLR 342 | BBBFFFFRRL 343 | FBFFBFFLRR 344 | BFBFFBBLLR 345 | BFBFFBFLRR 346 | BBBBFBFRRR 347 | FBFBBBFRRR 348 | FBFFBBBRLR 349 | BBFBFBBLLR 350 | FBFBBBBLRR 351 | BBBFBFBLLL 352 | BFFFBBBLLR 353 | BFFFBFFLLL 354 | BFFFFFBLLL 355 | FBFFBBBLLR 356 | FBBFFBFRRR 357 | FBFBFFBRLR 358 | BBBFFFFLRR 359 | FFBFFBBLRL 360 | FBBFBBBLRL 361 | FBFFFFFRRR 362 | FFBBBFBRLR 363 | BFBFFFFRRL 364 | FFBFBFBLLR 365 | BBFFFBFLLR 366 | BBFFBBFRRL 367 | BFBFBFBRRR 368 | BFBFBFFLRR 369 | BFFFFFBLLR 370 | FBBBBBFLRL 371 | FBBBFFBLRR 372 | BBFFBBFLRL 373 | BFBFBFFRLR 374 | BFBFBBFLLR 375 | BFFFBBBRLR 376 | BFBBFBFRLL 377 | BFFBBBBLRL 378 | BBBFBBBRLR 379 | BFFFBFFLRR 380 | FFBBBBBRLR 381 | BBFBFBBRRL 382 | BFBBBFBLLL 383 | FBFBBFFRLR 384 | FFBFBFFRLR 385 | FFBBFBBRLL 386 | FBFFBBFLLR 387 | BBBBFBFLRR 388 | FFFBBFBLLL 389 | BFFFBBFLLL 390 | FFBFFFFRLL 391 | FBBFBFBLRL 392 | FFBBFBFLLR 393 | BFBFBFBRLL 394 | BFFBFBFRRR 395 | BBFBFBFRRL 396 | FFBFBFFRRR 397 | BBBFFBBLRL 398 | FBFFBFBLRL 399 | BBFFBFFLRL 400 | FBFFBFBLLL 401 | BFFFBBBLRL 402 | BFBFBFFLRL 403 | FBBBBFFLLR 404 | BBFFBBFRLL 405 | BBFFBFBRLR 406 | BFBBFFBLRR 407 | BBFBBFBRRL 408 | FBFFBBBRRL 409 | FFBFBBBLLL 410 | FFBFBFFLRR 411 | BBBBFFBLLR 412 | BBFFBBBLLL 413 | BBFBBFFLRR 414 | FBBBFBFLLL 415 | FFFBBBBLRR 416 | FFBBFBFLLL 417 | BBFBBFBLRL 418 | BFFBFBFLRL 419 | BFFFBBBLRR 420 | FBFBFBBRRR 421 | FBBBFFFRLL 422 | FBBBBBBLLL 423 | BFFBFBBLLL 424 | BBFFFBFRRL 425 | FBBFBBBLLR 426 | BFFBBBFLRR 427 | FFFBBFBLLR 428 | FBFFFBFRRL 429 | BFBFBBBRRR 430 | FBFBFFFRLL 431 | BFFFBFBLRR 432 | FBBBFBBLLL 433 | BBBFBFFRLR 434 | BFBBBFFLRR 435 | BFFBBBFLLR 436 | BBBBFFFRRL 437 | BBFBBFFRRL 438 | BFBBFBBRRL 439 | FBBBBBFRRL 440 | BFFBFBBRLL 441 | FFBFFFBLLL 442 | FFFBBBFLRR 443 | FFBBBFBRLL 444 | FBBFFBBRRL 445 | BFFFBFBRRL 446 | BFBBFBBLLL 447 | BFFFFFFRRL 448 | FFBFFFBRRR 449 | BFFBFBFRLL 450 | FBBFBBFLRR 451 | BBFFFFBRRR 452 | BFBFFFFLLL 453 | FBBFFFBLLR 454 | BBFFBFBLLL 455 | BBFBFFBRLL 456 | BBFBFFFLRL 457 | FBBBFFFLLL 458 | FFBFFBFRLR 459 | FBFBFFFLLL 460 | FBBBFBBLRL 461 | FFBFBBFRLL 462 | BFBFFFFRRR 463 | FBFFFFBLLR 464 | BFBBFBBLLR 465 | FBFFBBFLRR 466 | FBFBFFFRRL 467 | BFBFFBFRLR 468 | BBBBFFFLLR 469 | BFBBBFFRRL 470 | FBFBFFBRLL 471 | FBBBBFBLRR 472 | BBFFFFFRRL 473 | BFFFFFFLLR 474 | FBFFBBFLLL 475 | BBFBBBFRRL 476 | FBFFFFBRLR 477 | FFBBBBBLLR 478 | BBBBFBBLLR 479 | BBFBFBBRLL 480 | FBFFFBFRRR 481 | FBBFBFBLLL 482 | FBBFFFFLRR 483 | FFFBBFFLRL 484 | FBBBBFFRLR 485 | FFBBBFFLRL 486 | FBBBBBFLRR 487 | FBBBBBFLLL 488 | BFFFBFBLLL 489 | BFBBBBBRLL 490 | FBBBFBBRRR 491 | FBFFBBFRRL 492 | BFFBFFBRLR 493 | BBFBBFBRRR 494 | BBFFFBFLRL 495 | FFBFFFBRLR 496 | BFBFFFFRLR 497 | FBBBBFFLRR 498 | BFBFFBFRRL 499 | BFFFFBBRLR 500 | BFFBBBFRLL 501 | BBFFFFFLLL 502 | FBBFFFBRRR 503 | BFBFBBFLRR 504 | BFFBFBBLLR 505 | BFFFBBFLRR 506 | FFBBFFFLLR 507 | FBFFFFFRRL 508 | FBBBFFBLRL 509 | FBFBBFBRLL 510 | BFBBFBFLLR 511 | BBBBFBFLLL 512 | FBBFFFBRLR 513 | BFFBFFFLRL 514 | BBBFBFBRLL 515 | FBBBBFBRRR 516 | BBBFBBFLRR 517 | BBFFBFFRRL 518 | FBFBFBFRRR 519 | BFBBBFFRLR 520 | BBBFBBBLLR 521 | FBFBBBBRRR 522 | BFFBBBFLRL 523 | FFBFFFFLLL 524 | FBFFBFBRRL 525 | FBFFFFBLLL 526 | BFFFFFBRRR 527 | BBBFFBFRRR 528 | BFFFFFFRLL 529 | BFBFFBBRRL 530 | FBBBBBFRLR 531 | BBFFBBBRLR 532 | FFBFFBBLLR 533 | BBFFBBBLRL 534 | BBBFFBFLLL 535 | BBBBFFBRRR 536 | BBBFBBFLLL 537 | FBFFFBFRLR 538 | FBBFBBFRLL 539 | FFBBBFFLLL 540 | FFBBBBFLRL 541 | FFBBBBFRRR 542 | FFBBFBBLRL 543 | FBFBBBFLLR 544 | BFFFBBFRRL 545 | BBBFBBFRLL 546 | BFBBFFBRLL 547 | BBFBBBFLLL 548 | FFBBBBBLRR 549 | BFFFFBBRRR 550 | BBFFFFFRLL 551 | FBBBFBBRLR 552 | FFBFBBBLLR 553 | BFFFFFFLLL 554 | FBBFBBBRRR 555 | FBFBFBFLRL 556 | BFBFFFFLLR 557 | BFFFFFBLRR 558 | FBFBFFFRLR 559 | BBBBFBFLLR 560 | BBBBFFBRLR 561 | BFFFFBFRLL 562 | BFBFBBFLLL 563 | FFBBBFFRLL 564 | FFBBBBBRLL 565 | BFBBFBFLRL 566 | FFBBFBBLRR 567 | BFBBBFBRLR 568 | BBFFBFBRRR 569 | BFFFBFFRLR 570 | FFBFBFBRRR 571 | BBFFFBFRLL 572 | BFBBFFBRRR 573 | FBFBBFFLLL 574 | FBBFFBFLLR 575 | BBFBBBFLRR 576 | BFFBFFFRLR 577 | BFFBFFBLLR 578 | BFFBBFBRRL 579 | BBBFFBBLRR 580 | BFFFBFBRRR 581 | FBFFFFBLRL 582 | BBFFFFFLRR 583 | FFBFFBBRLR 584 | BBFBFBFRRR 585 | BFBBFBBLRL 586 | BFFBFFBRRL 587 | FFBFFBBLRR 588 | BFBBFFFRRR 589 | BFBBBFFLLR 590 | BBFBFFBRRR 591 | BBBFBFBLRR 592 | FFBFFFBLRR 593 | BFFBBBBRLR 594 | BFBFFBBLLL 595 | BFBFBBBLLL 596 | BBBFBFBLRL 597 | FBBFBFBRRL 598 | FBBBFFFLLR 599 | BFFFFBFRRL 600 | BFBBFBFLRR 601 | BBFBFFBLLL 602 | BBFBFFFRLL 603 | BBBFFFFLRL 604 | BFFBBBBLLL 605 | FBFBBFFRRL 606 | FBFFBFFRLR 607 | BBBBFFFLRL 608 | BFBFBFBRLR 609 | BFBBBBFLLR 610 | BBFFFFFLRL 611 | BBBBFFFRLL 612 | FFFBBBFRRL 613 | FFBFFBFLRL 614 | BBFBFFBRRL 615 | BFFFFBFRLR 616 | BFBBBBBRRR 617 | BFFFBBBRRL 618 | BBFBFFFLLL 619 | FFBBFBFLRR 620 | BFFBFBBRRR 621 | FFBFFBFRRL 622 | FBFFBFBLRR 623 | FFBFFFBLLR 624 | BFBFBBBLRR 625 | BFFFFFBRLL 626 | FBBFFBBLLL 627 | BFFBBBFRRR 628 | FBFBBBBLRL 629 | BFBBBBFRLR 630 | FBFFBBFRLL 631 | BFBBBFBLRR 632 | FBBFBFFRRR 633 | FBBFFBFRLL 634 | FFBFBBFRLR 635 | BBBFFBBRLL 636 | BBFFBFBLLR 637 | BFBBFBFRRR 638 | FBBFBBBRLL 639 | FBBFFFFLLL 640 | BFFBBFBRLR 641 | FBBFBBBRRL 642 | FBBFFFBLLL 643 | BBFBBFFRLL 644 | BBBBFBFRLL 645 | BFFFFFBRRL 646 | FBBBFBFRLL 647 | BFFBBFFRLL 648 | BBFFFFFRLR 649 | FFBFBFFLRL 650 | BFBBFBBRLL 651 | FBBBFFBRRL 652 | FFBFBBFLLL 653 | BFBFFFFRLL 654 | BBBFBBFLLR 655 | BFBBFFBRLR 656 | BBFFBFFLRR 657 | FFBFBBFRRR 658 | BBBFBFFLLL 659 | FBBFFFFRRL 660 | FFFBBFFLLL 661 | FBBBFBBLRR 662 | BFBFBBBLLR 663 | FBFBBBFLRL 664 | FFBBBFFLLR 665 | BFBFBFFRLL 666 | BFBBFFFRRL 667 | BBBBFBFRLR 668 | BFFBFFFRLL 669 | FBFBBBBRLL 670 | BBFBFFFRLR 671 | FBBFBFFLLR 672 | BFBBFFFLLR 673 | BBFBBFFLLL 674 | BFFBBFBRRR 675 | FBBBFBFLRL 676 | FFBBBFFRLR 677 | BFBBBBBRLR 678 | BBFBBFBLRR 679 | FFBFFFFRRR 680 | BFBFBFFRRL 681 | FFBFBBBLRL 682 | BBBFFFFRLR 683 | FBBBFFBRRR 684 | BFBFBBFLRL 685 | BFBBBFBRRR 686 | BFFBBFFRLR 687 | FFBFFBBRRR 688 | BBFFBFFRLL 689 | BFBFFBBLRR 690 | BBFBBBBLLL 691 | BBFFBBFRLR 692 | BFFBFFFRRL 693 | BFBBFBBRLR 694 | BBBBFFBLRR 695 | FBFBFFFLRR 696 | BFFFFBBLRR 697 | BBBFFFBLRL 698 | BBBFBBBRRL 699 | FFBBFBFRLR 700 | BBFBBFBRLR 701 | BFFFBBBLLL 702 | BFFBBBFRLR 703 | BFBBBBBLLL 704 | FBBFBFFRLR 705 | BFFFFFBRLR 706 | BBFBBFBLLL 707 | BBFFBBBRRL 708 | FFBFBFBLRR 709 | BBFBFBBLRL 710 | FBBBBFBLRL 711 | BBFFFBBRRL 712 | FBBBBFBRLR 713 | FFBBBBBLLL 714 | FBFBBFBLLR 715 | BBFFBBFRRR 716 | BFFFBBBRLL 717 | BFBBFBBRRR 718 | BBFBFBFLRR 719 | FFBFBFBRRL 720 | FFBBBFBLRL 721 | BFFFBBBRRR 722 | BFFBBFFRRR 723 | FBBFFBBRLL 724 | FBBFFBBRLR 725 | FBBFFBFLRR 726 | BBBBFFFRRR 727 | BFFFFFFRLR 728 | FBBBFFFRLR 729 | BBBFBFBLLR 730 | BFFBBFFLRL 731 | FBFBBBFRLL 732 | BFBFBBBLRL 733 | BFBFFFBRRL 734 | FBBBFFFLRR 735 | BBFFBFFRRR 736 | BBFBBBFLRL 737 | FBBFBBFLRL 738 | FBFBFBBLLL 739 | FFBBFBFRLL 740 | FBFFFBFRLL 741 | BBFBFFBLRR 742 | BFBBBFBLLR 743 | FBFBFBFRLR 744 | BFFFFBBLRL 745 | FFBFFFFLRR 746 | FBBFFFBLRL 747 | BFFFBFBRLR 748 | BBBBFFFLLL 749 | BBFBBFBLLR 750 | FFBBFBBLLL 751 | FFBBFFFRRL 752 | FFBFBFBRLR 753 | BFFBBBFLLL 754 | BBBFFFBLLR 755 | BFFBFFBRRR 756 | FFFBBFBRRR 757 | FFFBBFFRRL 758 | BBFBFFFRRL 759 | FBBFBFBRLR 760 | FBFBBFFLRR 761 | BBFFBBBLLR 762 | FFFBBFBRLL 763 | FBBFFBBLRR 764 | FFFBBBFRLL 765 | FFBBFFFRRR 766 | FBFBFBFLRR 767 | FBFFFBBLLR 768 | FBFFFFBRLL 769 | BBFBBBFRRR 770 | BFFBBBBRLL 771 | FBFFFBBRLL 772 | FFBBBBBRRL 773 | FFBBFBBRLR 774 | BFFBFBFLLL 775 | FFBBBFBLLR 776 | BFFBFBBLRL 777 | FBBFFFFRRR 778 | FBBBFBBRRL 779 | FBFFBFFLLR 780 | FFBBFFBRRL 781 | BBFBBBFRLL 782 | FFBFFFBRRL 783 | BBFBFBBRLR 784 | FBFFBBBRLL 785 | BFFFBFFLRL 786 | BFFBBBBLRR 787 | BFBFFFBRLL 788 | FFBFBBFRRL 789 | BBBBFBBLLL 790 | FBBBBFFLLL 791 | FBFBBBBRLR 792 | BFBBBBFLRL 793 | FFFBBFFLRR 794 | BFFBFBFLLR 795 | BBFFFBBLLL 796 | FBFBFFFRRR 797 | FBBFFBFLLL 798 | BFBFFFFLRR 799 | BBBFFFBRRR 800 | FBBBBFFLRL 801 | FFBFBBBRRR 802 | BFFBBFFLLL 803 | FFBBFBBRRR 804 | FBBBFBBRLL 805 | BBBFBFBRRL 806 | FBBBBFBRRL 807 | FFBFBBBRLL 808 | FBFBFBFLLR 809 | BBFFBFBLRR 810 | BFFBFBFRLR 811 | BBBFBBFRRL 812 | BBBFBBFLRL 813 | FBFBFFBLLR 814 | BFBFFBBRRR 815 | FBFFFBFLLR 816 | BBBFBFBRRR 817 | BBBFFFFLLL 818 | BBBFFBFRLL 819 | BFBFFBBRLR 820 | BFFFBBFRRR 821 | BBBFFBBLLR 822 | BFBFFFBLLL 823 | FFFBBFBLRR 824 | FBBFFBBLRL 825 | FBBBBFFRLL 826 | BFBFFBBRLL 827 | BFFBBFBLRL 828 | BBBBFFBRLL 829 | BBFFFFBLLR 830 | FFFBBBFLRL 831 | FFFBBBBLRL 832 | BBFFFFBRLL 833 | FFFBBBFRLR 834 | BBBFFFBRLL 835 | FFBBFFBLLR 836 | FFFBBBBRRR 837 | BBFFBFFLLL 838 | BFBBFBFRLR 839 | BBBFBFFRRR 840 | BFFBFFFLLL 841 | BFBBFFBLLR 842 | BBBFBBBLLL 843 | FBBBBBBLLR 844 | BBBFFFFRLL 845 | FFBBFFBRLL 846 | FBFBBBFRLR 847 | BBFFFBFLRR 848 | BBFBFBBRRR 849 | BFBBFFFLLL 850 | FBBFBBFLLR 851 | FBFBBFBLLL 852 | BFBBBBFLRR 853 | BBBFBFFLLR 854 | BFFBBBBRRL 855 | BFBFFBBLRL 856 | FFBFFBFLLL 857 | FFBBFFFLLL 858 | BFBBBFFLRL 859 | BFFFFBBRRL 860 | FFBBFBFLRL 861 | FBBBBBBLRR 862 | FFBFFBBRRL 863 | BFFBBFBLRR 864 | BBBBFFBRRL 865 | BFFBBFFLLR 866 | BFBBFFBRRL 867 | FFFBBFBRRL 868 | BFBBFFBLRL 869 | FFBBFBBLLR 870 | BFFFBFFLLR 871 | BBFFBFBLRL 872 | FBBBBFBRLL 873 | FBBFBFBLLR 874 | FFBFFFBLRL 875 | FFBBFBBRRL 876 | BBFFFFBRLR 877 | FBFBFFBLLL 878 | BFFBFFFLRR 879 | BFBFBFFLLR 880 | FFBFBFBLRL 881 | BBFFFBBRRR 882 | FBFBFBBLLR 883 | FBFFBFBRLR 884 | FBFFBBBRRR 885 | FBBBFFBLLL 886 | BBFBBBBRLL 887 | FBBBFFFLRL 888 | FFFBBFFRLR 889 | BFBFFFBRRR 890 | BFFBBFBRLL 891 | FBBFFFFRLL 892 | -------------------------------------------------------------------------------- /05/main.nim: -------------------------------------------------------------------------------- 1 | import parseutils, strutils, sequtils, algorithm, sets 2 | 3 | proc toBit(c: char): int = 4 | if c in {'R','B'}: 1 else: 0 5 | 6 | proc toId(s: string): int = 7 | s.foldl(a*2 or b.toBit, 0) 8 | 9 | let vs = toSeq(lines("input")).map(toId) 10 | 11 | echo "part1: ", vs.max() 12 | echo "part2: ", (vs.min..vs.max).toSeq.toSet - vs.toSet 13 | -------------------------------------------------------------------------------- /06/README.md: -------------------------------------------------------------------------------- 1 | Just because I can: 2 | 3 | 4 | ``` 5 | answer o──[Alpha]──o 6 | 7 | person o─┬─[answer]─┬»─'\n'──o 8 | ╰────«─────╯ 9 | 10 | group o─┬─[person]─┬»─┬─'\n'─┬──o 11 | ╰────«─────╯ │ ━ │ 12 | ╰─1────╯ 13 | 14 | groups o─┬─[group]─┬─o 15 | ╰────«────╯ 16 | ``` 17 | -------------------------------------------------------------------------------- /06/main.nim: -------------------------------------------------------------------------------- 1 | import npeg, sequtils 2 | 3 | var answer: set[char] 4 | var answers: seq[set[char]] 5 | var part1, part2 = 0 6 | 7 | let p = peg groups: 8 | answer <- Alpha: 9 | answer.incl ($0)[0] 10 | person <- +answer * '\n': 11 | answers.add answer 12 | answer = {} 13 | group <- +person * ('\n' | !1): 14 | part1 += answers.foldl(a + b).len 15 | part2 += answers.foldl(a * b).len 16 | answers.setlen(0) 17 | groups <- +group: 18 | echo "part1: ", part1 19 | echo "part2: ", part2 20 | 21 | discard p.matchFile("input") 22 | -------------------------------------------------------------------------------- /07/README.md: -------------------------------------------------------------------------------- 1 | 2 | one PEG a day keeps the doctor away: 3 | 4 | ``` 5 | ━ 6 | rules o─┬─[rule]─┬»─1──o 7 | ╰───«────╯ 8 | 9 | rule o──[container]─»─" contain "─»─[contains]─»─".\n"──o 10 | 11 | container o──[bags]──o 12 | 13 | ╭──────────»──────────╮ 14 | contains o──┬─[contents]─»┴┬─", "─»─[contents]─┬┴┬──o 15 | │ ╰─────────«─────────╯ │ 16 | ╰─"no other bags"────────────────────╯ 17 | 18 | ╭╶╶╶╶╶╶╶╶╶╶╶╮ 19 | contents o───┬─[Digit]─┬──»─" "─»─[bags]──o 20 | ┆╰────«────╯┆ 21 | ╰╶╶╶╶╶╶╶╶╶╶╶╯ 22 | 23 | ╭╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╮ ╭──»──╮ 24 | bags o───┬─[Alpha]─┬»─" "─»┬─[Alpha]─┬──»─" bag"─»┴─"s"─┴─o 25 | ┆╰────«────╯ ╰────«────╯┆ 26 | ╰╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶╯ 27 | ``` 28 | -------------------------------------------------------------------------------- /07/main.nim: -------------------------------------------------------------------------------- 1 | 2 | import npeg, tables, sets, strutils 3 | 4 | type Bag = ref object 5 | color: string 6 | kids: Table[string, int] 7 | 8 | var 9 | bag: Bag 10 | bags: Table[string, Bag] 11 | 12 | let p = peg rules: 13 | rules <- +rule * !1 14 | rule <- container * " contain " * contains * ".\n" 15 | container <- bags: 16 | bag = Bag(color: $1) 17 | bags[$1] = bag 18 | contains <- contents * *(", " * contents) | "no other bags" 19 | contents <- >+Digit * " " * bags: 20 | bag.kids[$2] = parseInt($1) 21 | bags <- >(+Alpha * " " * +Alpha) * " bag" * ?"s" 22 | 23 | if p.matchfile("input").ok: 24 | 25 | var part1 = ["shiny gold"].toHashSet 26 | for i in 1..10: 27 | for color, bag in bags: 28 | for kidColor, n in bag.kids: 29 | if kidColor in part1: 30 | part1.incl color 31 | 32 | proc part2(bag: Bag): int = 33 | inc result 34 | for kidColor, n in bag.kids: 35 | inc result, n * part2(bags[kidColor]) 36 | 37 | echo "part1: ", part1.card 38 | echo "part2: ", part2(bags["shiny gold"]) 39 | -------------------------------------------------------------------------------- /08/README.md: -------------------------------------------------------------------------------- 1 | 2 | I guess the rest of the week we're extending a CPU VM again... 3 | -------------------------------------------------------------------------------- /08/input: -------------------------------------------------------------------------------- 1 | acc +8 2 | nop +139 3 | nop +383 4 | jmp +628 5 | acc -6 6 | acc +29 7 | acc +9 8 | jmp +457 9 | acc +29 10 | acc +38 11 | nop +451 12 | jmp +44 13 | acc +24 14 | nop +260 15 | acc +20 16 | jmp +24 17 | acc +36 18 | acc +41 19 | acc +31 20 | acc +42 21 | jmp +35 22 | acc +21 23 | nop +216 24 | acc +7 25 | jmp +42 26 | nop +408 27 | acc +18 28 | acc -4 29 | jmp +532 30 | acc -8 31 | acc +13 32 | jmp +529 33 | acc +36 34 | jmp +257 35 | acc +26 36 | acc +24 37 | acc -11 38 | nop +508 39 | jmp +249 40 | acc +44 41 | acc +25 42 | jmp +464 43 | acc +47 44 | jmp +318 45 | acc -6 46 | acc -1 47 | jmp +175 48 | acc +19 49 | acc +25 50 | acc +24 51 | jmp +523 52 | acc -7 53 | acc +45 54 | jmp +353 55 | jmp +67 56 | acc -1 57 | jmp -17 58 | acc -9 59 | jmp +180 60 | acc +19 61 | acc -15 62 | acc +5 63 | jmp +52 64 | nop +312 65 | acc +38 66 | jmp -6 67 | acc +6 68 | acc -11 69 | acc -6 70 | jmp +357 71 | jmp +455 72 | acc +27 73 | acc +29 74 | acc +9 75 | nop +414 76 | jmp +380 77 | jmp +1 78 | acc +33 79 | jmp +47 80 | acc +12 81 | acc +34 82 | acc -9 83 | acc +17 84 | jmp +214 85 | jmp +125 86 | acc +38 87 | acc +38 88 | acc +16 89 | jmp +310 90 | acc +9 91 | acc +10 92 | acc -2 93 | nop -84 94 | jmp +329 95 | nop +120 96 | nop -70 97 | jmp -88 98 | jmp +1 99 | jmp +1 100 | acc +23 101 | jmp -34 102 | nop +372 103 | acc +18 104 | acc +3 105 | acc +24 106 | jmp -50 107 | acc -11 108 | acc +27 109 | nop +441 110 | jmp +443 111 | acc +44 112 | acc -3 113 | acc +7 114 | jmp +389 115 | acc -5 116 | acc +36 117 | acc -17 118 | acc +15 119 | jmp +13 120 | acc +39 121 | jmp +407 122 | acc +8 123 | acc +21 124 | jmp +360 125 | jmp +425 126 | acc +7 127 | acc +29 128 | acc +6 129 | jmp +10 130 | jmp +1 131 | jmp +426 132 | acc +23 133 | jmp +3 134 | nop +2 135 | jmp +1 136 | jmp +240 137 | acc +16 138 | jmp -2 139 | jmp +47 140 | jmp +488 141 | jmp +1 142 | acc +45 143 | jmp +1 144 | acc +20 145 | jmp +344 146 | jmp +407 147 | acc +2 148 | acc +3 149 | jmp +117 150 | acc +50 151 | jmp -134 152 | acc +1 153 | jmp +238 154 | acc +27 155 | acc -11 156 | acc +16 157 | nop +134 158 | jmp +116 159 | acc -16 160 | nop +393 161 | jmp +2 162 | jmp +24 163 | nop +98 164 | acc +36 165 | acc +0 166 | nop +268 167 | jmp +131 168 | nop +294 169 | acc +23 170 | acc +26 171 | acc +43 172 | jmp +358 173 | nop +316 174 | jmp +300 175 | acc +22 176 | acc +47 177 | acc +19 178 | acc +2 179 | jmp +228 180 | jmp +176 181 | acc -4 182 | acc +20 183 | nop +83 184 | acc -19 185 | jmp -99 186 | acc +39 187 | nop +374 188 | acc +3 189 | jmp +57 190 | jmp +1 191 | acc +42 192 | jmp +404 193 | acc +4 194 | acc -4 195 | acc -10 196 | nop +293 197 | jmp +349 198 | acc -9 199 | acc +33 200 | jmp +284 201 | nop +1 202 | acc +18 203 | acc -1 204 | acc -5 205 | jmp +411 206 | acc +4 207 | acc -6 208 | acc +16 209 | jmp +313 210 | acc +0 211 | acc +39 212 | jmp +3 213 | acc -13 214 | jmp +148 215 | nop +51 216 | nop -207 217 | nop +357 218 | acc -19 219 | jmp +409 220 | acc +32 221 | jmp +103 222 | acc +5 223 | jmp +116 224 | nop +399 225 | acc +19 226 | acc +39 227 | nop +78 228 | jmp +298 229 | acc -16 230 | acc +31 231 | jmp +1 232 | acc +45 233 | jmp -207 234 | acc +6 235 | acc +36 236 | acc +34 237 | acc +47 238 | jmp -112 239 | acc +23 240 | acc +4 241 | jmp +289 242 | acc -17 243 | nop +307 244 | nop -92 245 | jmp -146 246 | jmp +293 247 | nop +44 248 | acc +5 249 | acc +2 250 | acc -19 251 | jmp +172 252 | acc +10 253 | acc +49 254 | acc -2 255 | jmp +6 256 | acc +3 257 | jmp +1 258 | acc -19 259 | acc +35 260 | jmp +328 261 | acc +38 262 | acc -5 263 | nop -83 264 | jmp -138 265 | jmp -55 266 | acc +35 267 | jmp +1 268 | jmp -216 269 | nop +220 270 | jmp +116 271 | jmp -78 272 | nop +331 273 | jmp +118 274 | jmp +287 275 | jmp -258 276 | jmp -181 277 | nop +85 278 | acc +31 279 | acc +10 280 | acc -13 281 | jmp +175 282 | jmp +66 283 | acc +34 284 | acc +6 285 | nop -126 286 | acc +38 287 | jmp +4 288 | acc +18 289 | jmp -13 290 | jmp -8 291 | jmp +1 292 | acc -9 293 | acc +31 294 | nop +92 295 | jmp +118 296 | nop +21 297 | jmp +110 298 | acc +20 299 | acc +20 300 | jmp +280 301 | jmp -142 302 | jmp +8 303 | nop -286 304 | jmp +170 305 | acc +22 306 | acc +29 307 | nop -127 308 | jmp +36 309 | jmp +328 310 | acc +27 311 | jmp -110 312 | acc +28 313 | acc +44 314 | acc +34 315 | acc +43 316 | jmp -42 317 | acc -19 318 | jmp +185 319 | acc -8 320 | nop -3 321 | acc +31 322 | acc -11 323 | jmp +142 324 | acc +49 325 | acc -2 326 | acc +28 327 | acc +17 328 | jmp +167 329 | acc +16 330 | jmp +165 331 | jmp -190 332 | jmp -117 333 | acc +0 334 | acc +16 335 | jmp +1 336 | acc -10 337 | jmp -39 338 | jmp +69 339 | jmp -187 340 | nop -101 341 | jmp +1 342 | acc +12 343 | jmp +218 344 | acc -6 345 | jmp -300 346 | acc +10 347 | jmp +104 348 | jmp +1 349 | acc +36 350 | jmp -243 351 | nop +138 352 | acc -15 353 | acc +13 354 | nop +278 355 | jmp -192 356 | acc +13 357 | jmp +275 358 | acc +0 359 | nop +92 360 | nop +214 361 | jmp -90 362 | acc +44 363 | nop +225 364 | acc +9 365 | jmp -348 366 | acc +16 367 | jmp -334 368 | nop -335 369 | acc -16 370 | acc -9 371 | jmp -89 372 | acc +35 373 | acc +2 374 | acc +26 375 | jmp +68 376 | acc -19 377 | acc +14 378 | acc -19 379 | acc -19 380 | jmp +262 381 | acc -16 382 | nop -246 383 | nop -251 384 | acc +26 385 | jmp +143 386 | nop +48 387 | acc +48 388 | jmp +249 389 | acc -8 390 | jmp +9 391 | acc +42 392 | acc +12 393 | acc +19 394 | acc -4 395 | jmp +213 396 | acc +1 397 | acc +29 398 | jmp -259 399 | acc +3 400 | acc +17 401 | acc -13 402 | jmp -131 403 | acc +16 404 | acc -9 405 | acc +28 406 | jmp +222 407 | acc +42 408 | acc +20 409 | acc -3 410 | acc +50 411 | jmp -339 412 | jmp +1 413 | acc +1 414 | nop -315 415 | acc +44 416 | acc +50 417 | jmp -143 418 | nop -87 419 | nop +155 420 | jmp +1 421 | nop +44 422 | jmp +158 423 | nop -10 424 | acc +9 425 | jmp +90 426 | jmp +89 427 | acc +27 428 | acc -5 429 | acc -8 430 | acc +40 431 | jmp +3 432 | nop -360 433 | jmp +117 434 | acc -14 435 | acc -16 436 | nop -184 437 | acc +20 438 | jmp +185 439 | acc -2 440 | acc +36 441 | nop +24 442 | jmp +195 443 | acc -8 444 | acc -3 445 | acc +7 446 | jmp -84 447 | acc +0 448 | acc -12 449 | acc +43 450 | jmp -270 451 | nop -434 452 | acc -15 453 | jmp +163 454 | acc +14 455 | jmp +29 456 | acc +32 457 | acc +26 458 | acc +13 459 | jmp -91 460 | acc +30 461 | jmp -163 462 | nop +175 463 | jmp -175 464 | jmp +20 465 | acc +0 466 | nop -426 467 | acc +22 468 | acc -6 469 | jmp -83 470 | acc +12 471 | acc +43 472 | acc +31 473 | jmp -46 474 | acc +27 475 | acc +26 476 | acc +24 477 | acc -12 478 | jmp +118 479 | nop -88 480 | nop -251 481 | acc -15 482 | acc +3 483 | jmp -450 484 | acc +11 485 | acc +19 486 | jmp -406 487 | acc +39 488 | jmp -45 489 | acc +40 490 | acc -7 491 | acc +22 492 | nop -329 493 | jmp -160 494 | jmp +80 495 | acc +0 496 | acc -4 497 | jmp +31 498 | acc +11 499 | acc -2 500 | acc +3 501 | acc +48 502 | jmp -366 503 | acc -16 504 | jmp -345 505 | jmp -259 506 | acc -8 507 | acc +29 508 | acc +4 509 | acc +2 510 | jmp -208 511 | acc -6 512 | acc +48 513 | acc -3 514 | jmp +82 515 | acc +1 516 | acc +47 517 | acc +40 518 | acc +31 519 | jmp -214 520 | acc +10 521 | jmp -328 522 | acc -18 523 | acc +39 524 | jmp +2 525 | jmp -403 526 | jmp +48 527 | jmp +19 528 | jmp -468 529 | jmp -397 530 | acc +40 531 | acc +39 532 | acc +22 533 | jmp +1 534 | jmp -305 535 | acc +22 536 | acc -5 537 | acc +23 538 | jmp -399 539 | acc +21 540 | jmp +17 541 | nop -239 542 | acc +0 543 | acc +29 544 | acc +2 545 | jmp -56 546 | acc -14 547 | acc +23 548 | jmp -375 549 | jmp -450 550 | nop +1 551 | jmp -29 552 | jmp -208 553 | nop +50 554 | jmp -468 555 | acc +3 556 | jmp +5 557 | jmp -347 558 | acc +21 559 | acc +35 560 | jmp -527 561 | acc -4 562 | acc -14 563 | acc -5 564 | nop +24 565 | jmp -418 566 | jmp +66 567 | acc +8 568 | acc -16 569 | jmp -447 570 | nop -324 571 | acc +27 572 | acc +4 573 | jmp -393 574 | jmp -276 575 | jmp +1 576 | acc +37 577 | acc +15 578 | nop -304 579 | jmp -534 580 | acc -16 581 | nop -514 582 | acc +11 583 | jmp -331 584 | nop -69 585 | acc +14 586 | acc +44 587 | jmp -125 588 | acc +3 589 | acc +5 590 | acc +0 591 | nop -381 592 | jmp -440 593 | acc +48 594 | nop -561 595 | jmp -543 596 | acc -10 597 | acc +44 598 | acc -16 599 | acc +45 600 | jmp -177 601 | acc +36 602 | jmp -576 603 | acc +36 604 | acc +14 605 | nop -323 606 | jmp -163 607 | jmp -118 608 | acc -1 609 | acc -14 610 | acc +7 611 | acc +7 612 | jmp +11 613 | acc +31 614 | nop -309 615 | jmp -109 616 | acc +41 617 | acc +11 618 | acc +4 619 | jmp -52 620 | acc +9 621 | acc +16 622 | jmp -481 623 | jmp -161 624 | acc -8 625 | acc +13 626 | acc +16 627 | jmp -488 628 | acc +30 629 | jmp -390 630 | nop -313 631 | jmp -333 632 | jmp -44 633 | acc +38 634 | acc +33 635 | acc +38 636 | jmp -619 637 | jmp -186 638 | acc +49 639 | acc -5 640 | acc -16 641 | jmp -214 642 | acc +16 643 | acc +35 644 | nop -584 645 | acc -12 646 | jmp +1 647 | -------------------------------------------------------------------------------- /08/main.nim: -------------------------------------------------------------------------------- 1 | import npeg, strutils, tables 2 | 3 | type 4 | 5 | Op = enum 6 | opNop, opJmp, opAcc 7 | 8 | Inst = object 9 | op: Op 10 | arg: int 11 | 12 | Program = seq[Inst] 13 | 14 | Cpu = ref object 15 | prog: Program 16 | ip: int 17 | acc: int 18 | count: CountTable[int] 19 | 20 | let p = peg("program", prog: Program): 21 | program <- *inst * !1 22 | op <- +Alpha 23 | arg <- {'+','-'} * +Digit 24 | inst <- >op * ' ' * >arg * '\n': 25 | prog.add Inst( 26 | op: parseEnum[Op]("op" & $1), 27 | arg: parseInt($2) 28 | ) 29 | 30 | proc load(cpu: Cpu, source: string) = 31 | doAssert p.matchFile("input", cpu.prog).ok 32 | 33 | proc run(c: Cpu): bool = 34 | 35 | reset c.ip 36 | reset c.acc 37 | reset c.count 38 | 39 | while true: 40 | 41 | # Normal termination: ip is after program 42 | if c.ip == c.prog.len: 43 | return true 44 | 45 | # Abnormal termination: loop detection 46 | c.count.inc c.ip 47 | if c.count[c.ip] > 1: 48 | return false 49 | 50 | # Execute instruction 51 | let i = c.prog[c.ip] 52 | case i.op 53 | of opNop: discard 54 | of opAcc: c.acc += i.arg 55 | of opJmp: c.ip += i.arg - 1 56 | inc c.ip 57 | 58 | 59 | var cpu = Cpu() 60 | cpu.load("input") 61 | 62 | if not cpu.run(): 63 | echo "part1: ", cpu.acc 64 | 65 | for i, inst in cpu.prog.mpairs: 66 | let op = inst.op 67 | if op == opNop: inst.op = opJmp 68 | if op == opJmp: inst.op = opNop 69 | if cpu.run(): 70 | echo "part2: ", cpu.acc 71 | inst.op = op 72 | -------------------------------------------------------------------------------- /09/README.md: -------------------------------------------------------------------------------- 1 | Nothing smart today, just brute force searching 2 | -------------------------------------------------------------------------------- /09/input: -------------------------------------------------------------------------------- 1 | 17 2 | 7 3 | 12 4 | 45 5 | 41 6 | 21 7 | 29 8 | 23 9 | 5 10 | 39 11 | 1 12 | 16 13 | 3 14 | 22 15 | 36 16 | 32 17 | 13 18 | 14 19 | 10 20 | 47 21 | 11 22 | 27 23 | 19 24 | 9 25 | 35 26 | 38 27 | 17 28 | 15 29 | 4 30 | 6 31 | 7 32 | 8 33 | 28 34 | 12 35 | 5 36 | 20 37 | 21 38 | 18 39 | 66 40 | 53 41 | 16 42 | 22 43 | 50 44 | 14 45 | 23 46 | 13 47 | 41 48 | 10 49 | 11 50 | 71 51 | 19 52 | 24 53 | 17 54 | 9 55 | 15 56 | 29 57 | 26 58 | 25 59 | 27 60 | 28 61 | 30 62 | 20 63 | 31 64 | 21 65 | 32 66 | 40 67 | 33 68 | 38 69 | 39 70 | 50 71 | 34 72 | 37 73 | 51 74 | 72 75 | 100 76 | 36 77 | 65 78 | 53 79 | 24 80 | 42 81 | 57 82 | 41 83 | 44 84 | 74 85 | 45 86 | 81 87 | 54 88 | 52 89 | 55 90 | 88 91 | 105 92 | 70 93 | 60 94 | 58 95 | 61 96 | 91 97 | 66 98 | 68 99 | 77 100 | 89 101 | 69 102 | 94 103 | 65 104 | 113 105 | 83 106 | 164 107 | 85 108 | 96 109 | 106 110 | 97 111 | 120 112 | 117 113 | 180 114 | 115 115 | 118 116 | 119 117 | 157 118 | 131 119 | 123 120 | 138 121 | 133 122 | 281 123 | 137 124 | 134 125 | 154 126 | 148 127 | 150 128 | 161 129 | 179 130 | 211 131 | 181 132 | 182 133 | 215 134 | 203 135 | 217 136 | 232 137 | 233 138 | 237 139 | 234 140 | 241 141 | 267 142 | 254 143 | 256 144 | 257 145 | 270 146 | 403 147 | 271 148 | 282 149 | 284 150 | 298 151 | 384 152 | 311 153 | 340 154 | 360 155 | 398 156 | 416 157 | 385 158 | 418 159 | 834 160 | 569 161 | 465 162 | 702 163 | 491 164 | 511 165 | 524 166 | 1403 167 | 510 168 | 513 169 | 624 170 | 541 171 | 714 172 | 1037 173 | 566 174 | 582 175 | 2237 176 | 651 177 | 671 178 | 700 179 | 1079 180 | 881 181 | 942 182 | 803 183 | 909 184 | 1082 185 | 1466 186 | 956 187 | 1524 188 | 1001 189 | 1619 190 | 1023 191 | 1051 192 | 1054 193 | 1095 194 | 1107 195 | 1123 196 | 1148 197 | 1217 198 | 1253 199 | 1233 200 | 1322 201 | 1351 202 | 1503 203 | 1609 204 | 1684 205 | 1745 206 | 1943 207 | 1712 208 | 1865 209 | 1957 210 | 1979 211 | 2118 212 | 2243 213 | 2376 214 | 2539 215 | 2417 216 | 2105 217 | 4361 218 | 6479 219 | 2381 220 | 4097 221 | 4060 222 | 3609 223 | 2486 224 | 2825 225 | 4956 226 | 2854 227 | 3922 228 | 3293 229 | 4075 230 | 3457 231 | 3577 232 | 3669 233 | 3822 234 | 4062 235 | 4084 236 | 7637 237 | 7390 238 | 4793 239 | 4522 240 | 6118 241 | 4486 242 | 5311 243 | 4867 244 | 5206 245 | 6095 246 | 5340 247 | 5679 248 | 7906 249 | 6147 250 | 7379 251 | 10911 252 | 6750 253 | 11272 254 | 14140 255 | 7034 256 | 10812 257 | 7491 258 | 8929 259 | 8146 260 | 8570 261 | 12701 262 | 9008 263 | 12013 264 | 9353 265 | 9692 266 | 9826 267 | 11014 268 | 10073 269 | 14001 270 | 15604 271 | 11826 272 | 12429 273 | 12897 274 | 16103 275 | 13784 276 | 24912 277 | 18262 278 | 17154 279 | 22825 280 | 16844 281 | 30316 282 | 15637 283 | 25296 284 | 33998 285 | 17578 286 | 18361 287 | 35840 288 | 19179 289 | 19045 290 | 19518 291 | 29583 292 | 22840 293 | 24074 294 | 24255 295 | 24723 296 | 36757 297 | 26213 298 | 26681 299 | 39669 300 | 33302 301 | 33899 302 | 32481 303 | 43657 304 | 33215 305 | 35889 306 | 40360 307 | 50842 308 | 35939 309 | 37879 310 | 36623 311 | 37406 312 | 42019 313 | 55668 314 | 43119 315 | 59515 316 | 46914 317 | 47095 318 | 48329 319 | 48978 320 | 51404 321 | 64087 322 | 52894 323 | 68420 324 | 72841 325 | 65696 326 | 66380 327 | 68370 328 | 69104 329 | 69154 330 | 74029 331 | 72562 332 | 73818 333 | 79742 334 | 74502 335 | 78642 336 | 84501 337 | 85138 338 | 116937 339 | 90033 340 | 94009 341 | 95243 342 | 139725 343 | 97307 344 | 100382 345 | 146903 346 | 116981 347 | 118590 348 | 134066 349 | 132076 350 | 138258 351 | 134750 352 | 178510 353 | 141666 354 | 141716 355 | 146591 356 | 173885 357 | 148320 358 | 153144 359 | 195623 360 | 275782 361 | 169639 362 | 175171 363 | 184042 364 | 187340 365 | 229993 366 | 286316 367 | 235132 368 | 215897 369 | 521448 370 | 235571 371 | 249057 372 | 250666 373 | 266142 374 | 266826 375 | 273008 376 | 276416 377 | 289986 378 | 321762 379 | 288307 380 | 294911 381 | 463478 382 | 362511 383 | 322783 384 | 470358 385 | 465157 386 | 344810 387 | 425837 388 | 371382 389 | 501958 390 | 445890 391 | 516808 392 | 583218 393 | 501713 394 | 484628 395 | 715823 396 | 499723 397 | 517492 398 | 992239 399 | 539834 400 | 617694 401 | 564723 402 | 644545 403 | 610069 404 | 611090 405 | 657422 406 | 667593 407 | 685294 408 | 694165 409 | 716192 410 | 770647 411 | 790700 412 | 797219 413 | 871105 414 | 1103312 415 | 945613 416 | 984351 417 | 1067846 418 | 986341 419 | 1002120 420 | 1017215 421 | 1039557 422 | 1057326 423 | 1381737 424 | 1157528 425 | 1254614 426 | 1209268 427 | 1267491 428 | 1221159 429 | 1268512 430 | 1325015 431 | 1458293 432 | 1567866 433 | 1410357 434 | 1486839 435 | 1561347 436 | 1783560 437 | 2255512 438 | 1857446 439 | 1929964 440 | 1986471 441 | 2270632 442 | 2392861 443 | 2238374 444 | 2041677 445 | 2197085 446 | 3816859 447 | 2412142 448 | 2426040 449 | 2366796 450 | 2677848 451 | 3250945 452 | 2488650 453 | 2489671 454 | 2593527 455 | 3975489 456 | 2868650 457 | 2897196 458 | 2971704 459 | 3048186 460 | 3344907 461 | 3641006 462 | 4269588 463 | 3787410 464 | 3971641 465 | 4353267 466 | 4685735 467 | 8502594 468 | 4238762 469 | 6053148 470 | 5840354 471 | 4838182 472 | 4792836 473 | 4915711 474 | 5167519 475 | 6947436 476 | 9627764 477 | 7132317 478 | 5083198 479 | 6868837 480 | 5765846 481 | 5868900 482 | 8064715 483 | 8870608 484 | 6393093 485 | 6985913 486 | 7428416 487 | 7759051 488 | 15739445 489 | 11078828 490 | 11785618 491 | 8924497 492 | 14555742 493 | 11186198 494 | 9631018 495 | 12551887 496 | 22620457 497 | 9708547 498 | 9998909 499 | 10250717 500 | 10849044 501 | 14457808 502 | 10952098 503 | 11476291 504 | 28291332 505 | 11634746 506 | 12261993 507 | 15050628 508 | 35277245 509 | 18711149 510 | 16683548 511 | 15187467 512 | 17390069 513 | 19175214 514 | 18555515 515 | 26190488 516 | 21727008 517 | 19339565 518 | 19629927 519 | 19707456 520 | 19959264 521 | 21202815 522 | 20249626 523 | 20847953 524 | 30190261 525 | 21801142 526 | 22586844 527 | 23111037 528 | 36390282 529 | 23896739 530 | 26685374 531 | 40832742 532 | 30238095 533 | 33898616 534 | 31871015 535 | 35945584 536 | 32577536 537 | 64729481 538 | 38805141 539 | 37895080 540 | 39337383 541 | 41508598 542 | 53073830 543 | 39666720 544 | 41452441 545 | 40208890 546 | 52039237 547 | 41097579 548 | 43434797 549 | 45697881 550 | 44912179 551 | 68808918 552 | 62815631 553 | 50582113 554 | 62109110 555 | 66022757 556 | 85906771 557 | 71335674 558 | 73323456 559 | 64448551 560 | 72244256 561 | 70472616 562 | 86009758 563 | 79004103 564 | 77232463 565 | 79546273 566 | 79875610 567 | 80764299 568 | 96951416 569 | 86364620 570 | 81306469 571 | 123310407 572 | 84532376 573 | 129444555 574 | 90610060 575 | 143255220 576 | 112691223 577 | 206070851 578 | 138267013 579 | 126557661 580 | 149476719 581 | 134921167 582 | 159688076 583 | 136692807 584 | 170485670 585 | 150348226 586 | 209675027 587 | 157108073 588 | 163536479 589 | 156778736 590 | 243472693 591 | 160639909 592 | 162070768 593 | 165838845 594 | 167671089 595 | 171916529 596 | 175142436 597 | 247612390 598 | 203301283 599 | 306791699 600 | 306837696 601 | 249384030 602 | 261478828 603 | 263250468 604 | 271613974 605 | 284397886 606 | 327909613 607 | 317418645 608 | 300229286 609 | 307126962 610 | 310988135 611 | 317747982 612 | 400580766 613 | 318849504 614 | 322617581 615 | 322710677 616 | 326478754 617 | 329741857 618 | 333509934 619 | 347058965 620 | 378443719 621 | 574091144 622 | 450913673 623 | 526011960 624 | 512634498 625 | 520998004 626 | 656220611 627 | 1056801377 628 | 534864442 629 | 556011860 630 | 684978652 631 | 607356248 632 | 617977268 633 | 611217421 634 | 629837639 635 | 779024485 636 | 976925633 637 | 900569898 638 | 641467085 639 | 645328258 640 | 1180192700 641 | 1077009864 642 | 663251791 643 | 797972638 644 | 725502684 645 | 1173989128 646 | 985778115 647 | 963548171 648 | 1082023820 649 | 1033632502 650 | 1237193887 651 | 1090876302 652 | 1241055060 653 | 1142220690 654 | 1163368108 655 | 1922172539 656 | 1370830942 657 | 1427810277 658 | 1252684506 659 | 1408862124 660 | 1286795343 661 | 1388754475 662 | 1304718876 663 | 1124361034 664 | 1308580049 665 | 1461224429 666 | 1523475322 667 | 1783750753 668 | 1867723374 669 | 1759135186 670 | 2172900122 671 | 2019410617 672 | 2695657467 673 | 2591178385 674 | 2197000610 675 | 2215237336 676 | 2233096992 677 | 2266581724 678 | 2287729142 679 | 3070546096 680 | 2513115509 681 | 2377045540 682 | 2411156377 683 | 3092330802 684 | 2429079910 685 | 3974372522 686 | 2432941083 687 | 2585585463 688 | 3894165512 689 | 3244975182 690 | 2984699751 691 | 5677916265 692 | 5570285214 693 | 3626858560 694 | 3778545803 695 | 4192310739 696 | 4484729752 697 | 4412237946 698 | 4430097602 699 | 4448334328 700 | 4481819060 701 | 4520826134 702 | 4643627264 703 | 4664774682 704 | 7726794242 705 | 7819169299 706 | 4809986623 707 | 4840236287 708 | 7023520985 709 | 4862020993 710 | 6881275411 711 | 5018526546 712 | 7067404523 713 | 8039096506 714 | 6763245554 715 | 7414797353 716 | 7405404363 717 | 8190783749 718 | 15132198605 719 | 14954029303 720 | 9032547026 721 | 19972434892 722 | 8930153388 723 | 8878431930 724 | 9505648257 725 | 9526795675 726 | 9164453398 727 | 9308401946 728 | 18197000424 729 | 11885541978 730 | 14286679774 731 | 12901117499 732 | 12042047531 733 | 9880547539 734 | 14388816668 735 | 11781772100 736 | 19109452054 737 | 13830650077 738 | 21779549429 739 | 14168649917 740 | 17696432006 741 | 22359433666 742 | 17069215679 743 | 17910978956 744 | 22760803465 745 | 17808585318 746 | 21206500929 747 | 18042885328 748 | 18186833876 749 | 27361453822 750 | 25716192055 751 | 25612422177 752 | 21193943924 753 | 21662319639 754 | 22781665038 755 | 36097812832 756 | 32017483953 757 | 21922595070 758 | 25950422017 759 | 43759007335 760 | 38275716608 761 | 36091244987 762 | 31527082083 763 | 31237865596 764 | 35256049555 765 | 34765647685 766 | 39236829252 767 | 49928462909 768 | 35719564274 769 | 35851470646 770 | 35995419194 771 | 36229719204 772 | 39380777800 773 | 39849153515 774 | 53311875839 775 | 72225138398 776 | 43584914709 777 | 67378552729 778 | 44443984677 779 | 96896790548 780 | 47873017087 781 | 58152314274 782 | 65799575532 783 | 61945841211 784 | 92692653639 785 | 62764947679 786 | 71087019111 787 | 66003513281 788 | 66957429870 789 | 88028899386 790 | 101794994726 791 | 132472884063 792 | 71571034920 793 | 71714983468 794 | 71846889840 795 | 75376196994 796 | 75610497004 797 | 79229931315 798 | 160254037784 799 | 91457931796 800 | 92317001764 801 | 124155827555 802 | 113876530368 803 | 106025331361 804 | 176126721863 805 | 167927498768 806 | 131803088813 807 | 134335982599 808 | 137574548201 809 | 128768460960 810 | 137718496749 811 | 200339495880 812 | 338057992629 813 | 138528464790 814 | 159743882854 815 | 143286018388 816 | 143417924760 817 | 251201814650 818 | 154840428319 819 | 203385758870 820 | 150986693998 821 | 171546933079 822 | 170687863111 823 | 183774933560 824 | 229891549965 825 | 265769214215 826 | 289800264921 827 | 219901861729 828 | 293368893109 829 | 471103676379 830 | 277622000987 831 | 310730576852 832 | 263104443559 833 | 266343009161 834 | 266486957709 835 | 276246961539 836 | 355179924199 837 | 281946389550 838 | 281814483178 839 | 346671777258 840 | 286703943148 841 | 691005538108 842 | 380878243963 843 | 305827122317 844 | 440786958919 845 | 321674557109 846 | 342234796190 847 | 354462796671 848 | 465721323110 849 | 513270754838 850 | 562950904687 851 | 483006305288 852 | 619856797177 853 | 529447452720 854 | 1076221659525 855 | 558061444717 856 | 529591401268 857 | 532829966870 858 | 542589970700 859 | 542733919248 860 | 558193351089 861 | 563760872728 862 | 592531065465 863 | 587641605495 864 | 1178050148266 865 | 641166739819 866 | 723113040153 867 | 660289918988 868 | 762461516028 869 | 998551289980 870 | 663909353299 871 | 696697592861 872 | 1025740224536 873 | 1122122466733 874 | 996277060126 875 | 1091023317959 876 | 1012453758008 877 | 1087652845985 878 | 1556612734697 879 | 1062421368138 880 | 1183756710519 881 | 1072325320516 882 | 1085323889948 883 | 1100783321789 884 | 1100927270337 885 | 1121954223817 886 | 1151402478223 887 | 1301456658807 888 | 1583918665621 889 | 2011005047988 890 | 1305076093118 891 | 1324199272287 892 | 1747942764973 893 | 1754932671258 894 | 1676363111307 895 | 1360606946160 896 | 1692974652987 897 | 2097060381915 898 | 2113237079797 899 | 2113381028345 900 | 2074875126146 901 | 2084779078524 902 | 2172976735933 903 | 2157649210464 904 | 3309051688687 905 | 2201710592126 906 | 3478052829051 907 | 2186107211737 908 | 2222737545606 909 | 2222881494154 910 | 2827765589530 911 | 2456478571341 912 | 2606532751925 913 | 2629275365405 914 | 5531933182841 915 | 2684806218447 916 | 3000562383594 917 | 3036970057467 918 | 3053581599147 919 | 3369337764294 920 | 3473987974505 921 | 4679216116947 922 | 4159654204670 923 | 4188112205943 924 | 5121749135991 925 | 4257755814457 926 | 6644590777284 927 | 8532495566435 928 | 5255292191273 929 | 4424592086280 930 | 8568903240308 931 | 4445619039760 932 | 4408844757343 933 | 5998613129699 934 | 4679360065495 935 | 5063011323266 936 | 8099981380733 937 | 5235808117330 938 | 5314081583852 939 | 5685368602041 940 | 5721776275914 941 | 8870211126040 942 | 6090551656614 943 | 7241693805090 944 | 7627093578751 945 | 9320767137723 946 | 9934652256768 947 | 8605273244430 948 | 8445868020400 949 | 8703374854217 950 | 10348307471071 951 | 8833436843623 952 | 8854463797103 953 | 9681427157090 954 | 9088204822838 955 | 9471856080609 956 | 9508630363026 957 | 9644652874673 958 | 9915168182825 959 | 10377092907118 960 | 10298819440596 961 | 10549889701182 962 | 10921176719371 963 | 16481557375854 964 | 11407144877955 965 | 11812327932528 966 | 14793926510831 967 | 14868787383841 968 | 18384802011307 969 | 19465297729956 970 | 33178728522138 971 | 17149242874617 972 | 18077129325039 973 | 18618543037042 974 | 17942668619941 975 | 17921641666461 976 | 18478089718296 977 | 18326319877712 978 | 25418677085023 979 | 18560060903447 980 | 18980486443635 981 | 19153283237699 982 | 19559821057498 983 | 20213987623421 984 | 21219996159967 985 | 36247961544173 986 | 21471066420553 987 | 22328321597326 988 | 26275932261796 989 | 41481604835025 990 | 26606254443359 991 | 40031127324000 992 | 32018030258458 993 | 35709303778064 994 | 35070884541078 995 | 39413735040494 996 | 35091911494558 997 | 37771826274741 998 | 37713344141146 999 | 43978737988470 1000 | 36399731384757 1001 | -------------------------------------------------------------------------------- /09/input2: -------------------------------------------------------------------------------- 1 | 35 2 | 20 3 | 15 4 | 25 5 | 47 6 | 40 7 | 62 8 | 55 9 | 65 10 | 95 11 | 102 12 | 117 13 | 150 14 | 182 15 | 127 16 | 219 17 | 299 18 | 277 19 | 309 20 | 576 21 | -------------------------------------------------------------------------------- /09/main.nim: -------------------------------------------------------------------------------- 1 | import strutils, sequtils, math 2 | 3 | var part1, part2: int 4 | var vs: seq[int] 5 | let n = 25 6 | 7 | proc isSum(v: int): bool = 8 | if vs.len < n: 9 | return true 10 | for i in vs.len-n ..< vs.len: 11 | for j in vs.len-n ..< i: 12 | if v == vs[i] + vs[j]: 13 | return true 14 | 15 | for l in lines("input"): 16 | let v = l.parseInt 17 | if not isSum(v): 18 | part1 = v 19 | vs.add v 20 | 21 | block done: 22 | for l in 2..= part + 3: 36 | result[y][x] = 'L' 37 | 38 | for part in 1..2: 39 | var map = readFile("input")[0..^2].splitLines() 40 | while true: 41 | let map2 = map.run(part) 42 | if hash(map) == hash(map2): 43 | break 44 | map = map2 45 | echo "part", part, ": ", ($map).count('#') 46 | -------------------------------------------------------------------------------- /12/input: -------------------------------------------------------------------------------- 1 | S2 2 | W5 3 | F20 4 | E3 5 | S5 6 | R90 7 | W5 8 | F48 9 | R180 10 | E3 11 | S3 12 | E5 13 | S3 14 | F83 15 | S1 16 | W5 17 | F81 18 | W3 19 | R90 20 | F88 21 | S2 22 | R90 23 | E2 24 | L90 25 | W4 26 | F77 27 | E1 28 | R90 29 | S4 30 | E2 31 | F89 32 | N2 33 | L90 34 | N2 35 | N2 36 | E3 37 | L180 38 | N1 39 | F82 40 | R90 41 | S3 42 | F64 43 | W1 44 | R180 45 | S2 46 | R180 47 | F28 48 | L180 49 | S3 50 | F100 51 | E1 52 | S4 53 | S5 54 | R90 55 | F3 56 | W5 57 | N4 58 | F9 59 | N5 60 | E4 61 | R90 62 | F83 63 | L180 64 | W3 65 | N5 66 | W2 67 | R180 68 | W1 69 | S4 70 | L90 71 | S5 72 | R90 73 | R90 74 | F36 75 | L180 76 | W1 77 | F88 78 | E3 79 | R90 80 | F13 81 | W1 82 | F13 83 | W4 84 | R90 85 | E3 86 | F98 87 | S4 88 | E5 89 | R90 90 | F77 91 | E5 92 | L180 93 | N5 94 | R90 95 | E1 96 | F70 97 | L180 98 | F54 99 | E5 100 | F9 101 | L180 102 | N3 103 | F77 104 | E2 105 | F81 106 | E2 107 | S1 108 | F41 109 | L90 110 | F32 111 | S3 112 | F66 113 | N2 114 | E4 115 | R90 116 | F80 117 | R90 118 | W1 119 | R90 120 | S3 121 | F65 122 | S4 123 | R90 124 | W4 125 | S4 126 | R90 127 | W4 128 | S2 129 | E1 130 | F44 131 | R90 132 | F53 133 | E3 134 | F67 135 | S5 136 | L90 137 | R90 138 | W2 139 | S2 140 | E3 141 | N5 142 | F97 143 | N3 144 | E1 145 | R90 146 | W4 147 | N5 148 | S4 149 | F38 150 | N5 151 | N1 152 | W4 153 | S3 154 | E1 155 | S3 156 | F87 157 | E1 158 | R90 159 | E2 160 | L180 161 | S1 162 | L90 163 | F29 164 | R90 165 | S2 166 | F95 167 | N2 168 | E5 169 | F24 170 | W1 171 | F71 172 | E3 173 | L90 174 | F16 175 | L90 176 | S5 177 | L90 178 | W1 179 | F95 180 | L90 181 | W2 182 | F97 183 | E4 184 | R90 185 | N5 186 | F77 187 | E2 188 | L90 189 | F71 190 | L90 191 | W2 192 | R90 193 | F75 194 | E1 195 | S1 196 | F28 197 | F86 198 | R90 199 | E3 200 | F9 201 | N2 202 | W4 203 | S1 204 | L90 205 | F10 206 | W4 207 | L90 208 | S5 209 | E1 210 | L90 211 | W2 212 | S3 213 | F41 214 | L90 215 | S5 216 | F73 217 | L90 218 | S4 219 | F80 220 | W4 221 | R180 222 | S4 223 | E3 224 | F89 225 | E5 226 | N5 227 | L90 228 | F66 229 | N4 230 | W1 231 | F93 232 | W1 233 | F27 234 | F68 235 | N4 236 | F23 237 | L90 238 | F14 239 | S3 240 | F74 241 | N2 242 | E2 243 | R90 244 | S4 245 | F85 246 | N2 247 | L180 248 | L180 249 | F55 250 | S5 251 | E5 252 | F42 253 | N2 254 | R90 255 | F53 256 | S4 257 | F70 258 | E2 259 | F73 260 | S4 261 | F71 262 | L90 263 | E1 264 | S3 265 | E5 266 | N3 267 | E2 268 | N5 269 | L270 270 | F69 271 | E5 272 | F30 273 | N1 274 | R90 275 | N4 276 | F15 277 | E4 278 | R180 279 | F12 280 | E2 281 | F95 282 | E2 283 | S4 284 | F13 285 | S1 286 | E1 287 | N4 288 | E3 289 | L270 290 | E4 291 | S5 292 | E3 293 | N2 294 | R180 295 | S2 296 | W2 297 | L90 298 | S3 299 | W4 300 | R90 301 | E1 302 | L180 303 | W5 304 | F23 305 | E5 306 | F67 307 | R90 308 | N2 309 | W4 310 | L90 311 | S1 312 | L90 313 | F17 314 | W2 315 | F80 316 | E1 317 | F13 318 | S2 319 | E3 320 | S4 321 | F46 322 | F70 323 | R180 324 | E3 325 | L90 326 | E4 327 | L90 328 | S3 329 | F31 330 | W5 331 | R90 332 | F21 333 | S5 334 | L90 335 | F12 336 | L90 337 | F70 338 | S1 339 | R180 340 | W5 341 | F14 342 | S5 343 | W5 344 | S1 345 | F56 346 | L90 347 | F43 348 | S4 349 | N4 350 | E1 351 | R180 352 | S1 353 | R90 354 | E3 355 | N4 356 | R90 357 | S2 358 | E5 359 | S4 360 | W4 361 | R90 362 | F88 363 | S4 364 | R90 365 | F79 366 | L90 367 | N2 368 | E3 369 | F74 370 | L90 371 | F72 372 | W1 373 | N3 374 | R90 375 | E2 376 | F38 377 | W3 378 | L90 379 | E3 380 | N2 381 | R90 382 | E2 383 | L90 384 | N3 385 | E1 386 | F96 387 | E3 388 | S4 389 | R180 390 | F28 391 | S2 392 | F93 393 | L270 394 | N3 395 | R90 396 | N2 397 | E4 398 | S1 399 | F47 400 | L270 401 | F9 402 | N2 403 | F80 404 | S4 405 | L180 406 | N5 407 | W2 408 | L90 409 | W4 410 | N5 411 | L90 412 | F82 413 | R90 414 | N3 415 | F4 416 | R90 417 | F96 418 | W5 419 | R90 420 | F28 421 | W2 422 | S2 423 | F16 424 | S4 425 | R90 426 | F9 427 | N5 428 | W4 429 | F78 430 | E3 431 | F84 432 | L90 433 | F42 434 | W2 435 | F43 436 | W4 437 | L90 438 | F95 439 | E1 440 | R90 441 | F59 442 | L90 443 | F82 444 | W1 445 | F17 446 | S4 447 | R180 448 | F91 449 | L180 450 | N1 451 | R90 452 | N3 453 | F57 454 | L90 455 | F90 456 | N3 457 | R90 458 | F98 459 | N5 460 | R90 461 | N2 462 | R90 463 | F4 464 | S2 465 | F80 466 | S2 467 | N2 468 | W4 469 | L90 470 | E2 471 | F67 472 | R90 473 | W4 474 | L180 475 | F22 476 | L90 477 | S3 478 | F9 479 | N5 480 | W2 481 | L180 482 | S3 483 | F23 484 | S4 485 | W4 486 | F90 487 | S2 488 | F32 489 | S3 490 | E5 491 | R90 492 | E1 493 | F64 494 | R180 495 | F17 496 | E3 497 | R90 498 | N2 499 | E1 500 | F90 501 | W3 502 | N5 503 | F19 504 | S5 505 | E4 506 | N5 507 | R90 508 | W1 509 | F18 510 | R180 511 | E2 512 | R90 513 | F76 514 | L90 515 | N2 516 | F96 517 | F38 518 | R180 519 | F94 520 | S4 521 | W4 522 | S4 523 | F63 524 | E4 525 | L90 526 | F69 527 | S2 528 | W3 529 | N1 530 | L270 531 | N1 532 | L90 533 | N4 534 | R90 535 | E5 536 | F67 537 | F85 538 | S1 539 | F2 540 | F68 541 | W2 542 | R90 543 | E4 544 | R90 545 | S3 546 | W4 547 | S2 548 | N5 549 | F13 550 | R180 551 | W1 552 | F31 553 | S1 554 | F23 555 | S1 556 | R90 557 | F86 558 | L90 559 | N5 560 | W3 561 | F47 562 | R90 563 | R270 564 | S1 565 | L90 566 | S1 567 | F40 568 | N4 569 | R180 570 | N1 571 | L180 572 | W3 573 | S1 574 | W5 575 | L90 576 | W5 577 | F41 578 | S4 579 | E2 580 | N5 581 | E4 582 | N1 583 | F97 584 | L90 585 | F62 586 | N5 587 | R90 588 | F98 589 | R180 590 | S5 591 | L270 592 | N5 593 | W5 594 | N4 595 | E3 596 | F38 597 | L90 598 | S2 599 | F79 600 | R270 601 | E1 602 | F14 603 | W1 604 | F38 605 | E3 606 | L180 607 | N4 608 | L90 609 | S5 610 | F90 611 | S1 612 | F7 613 | N1 614 | F11 615 | W4 616 | R180 617 | F73 618 | L90 619 | F54 620 | F25 621 | W5 622 | S3 623 | F39 624 | E2 625 | F37 626 | E2 627 | S4 628 | F94 629 | W5 630 | S2 631 | L180 632 | W3 633 | F70 634 | S3 635 | R180 636 | W1 637 | N5 638 | R90 639 | S4 640 | F12 641 | S3 642 | F45 643 | E1 644 | N3 645 | R90 646 | S2 647 | L180 648 | E4 649 | S3 650 | W5 651 | F9 652 | S4 653 | R90 654 | F19 655 | W3 656 | N4 657 | W5 658 | R90 659 | F16 660 | W3 661 | S4 662 | W1 663 | S3 664 | R180 665 | S4 666 | E4 667 | N1 668 | W3 669 | F10 670 | N5 671 | E2 672 | F61 673 | E4 674 | S1 675 | W3 676 | N5 677 | W2 678 | L90 679 | W5 680 | N2 681 | W1 682 | F8 683 | W4 684 | S5 685 | L180 686 | F76 687 | N1 688 | R180 689 | S3 690 | R180 691 | S3 692 | E1 693 | R90 694 | W1 695 | F38 696 | R90 697 | F74 698 | N2 699 | F60 700 | L90 701 | E2 702 | S3 703 | F78 704 | W1 705 | F57 706 | R90 707 | F39 708 | N5 709 | F2 710 | E3 711 | R90 712 | F81 713 | E2 714 | F2 715 | S3 716 | R90 717 | F95 718 | S4 719 | F1 720 | E2 721 | N5 722 | L270 723 | F59 724 | W2 725 | R90 726 | S1 727 | F42 728 | E2 729 | N5 730 | E4 731 | L90 732 | W1 733 | F17 734 | E2 735 | F91 736 | R90 737 | E3 738 | F30 739 | S1 740 | R90 741 | W5 742 | F74 743 | W5 744 | N1 745 | N4 746 | R180 747 | S5 748 | R180 749 | F92 750 | N4 751 | N3 752 | E3 753 | R90 754 | F60 755 | S4 756 | L90 757 | E4 758 | R270 759 | F3 760 | E1 761 | L180 762 | E1 763 | S5 764 | F84 765 | E3 766 | L90 767 | N3 768 | F27 769 | W1 770 | F58 771 | N1 772 | F93 773 | N2 774 | F30 775 | L90 776 | N2 777 | L90 778 | N2 779 | F99 780 | W4 781 | S2 782 | F13 783 | L90 784 | N3 785 | W4 786 | F100 787 | -------------------------------------------------------------------------------- /12/main.nim: -------------------------------------------------------------------------------- 1 | import strutils, math 2 | 3 | let 4 | cos = [1, 0, -1, 0] 5 | sin = [0, 1, 0, -1] 6 | 7 | block: 8 | var x, y, d: int 9 | 10 | for l in lines("input"): 11 | let n = parseInt l[1..^1] 12 | case l[0] 13 | of 'N': y -= n 14 | of 'S': y += n 15 | of 'E': x += n 16 | of 'W': x -= n 17 | of 'L': d -= n div 90 18 | of 'R': d += n div 90 19 | of 'F': 20 | y += n * cos[d %% 4] 21 | x += n * sin[d %% 4] 22 | else: discard 23 | 24 | echo "part1: ", x.abs + y.abs 25 | 26 | 27 | block: 28 | var wx = 10 29 | var wy = -1 30 | var sx, sy: int 31 | 32 | proc rot(n: int): (int, int) = 33 | (wx * cos[n] - wy * sin[n], 34 | wy * cos[n] + wx * sin[n]) 35 | 36 | for l in lines("input"): 37 | let n = parseInt l[1..^1] 38 | case l[0] 39 | of 'N': wy -= n 40 | of 'S': wy += n 41 | of 'E': wx += n 42 | of 'W': wx -= n 43 | of 'L': (wx, wy) = rot (-n div 90) %% 4 44 | of 'R': (wx, wy) = rot ( n div 90) %% 4 45 | of 'F': 46 | sx += n * wx 47 | sy += n * wy 48 | else: discard 49 | 50 | echo "part2: ", sx.abs + sy.abs 51 | -------------------------------------------------------------------------------- /19/input: -------------------------------------------------------------------------------- 1 | baabbabbbabbaaabababaabbbaaaaababaaaabab 2 | bbabbbaaababaaaaaaabaaab 3 | aabbbbbababbbbbbbbbbababbbabbbbb 4 | bbaaaabbaabbaabaaaaababa 5 | bbbbababbabbbbbaaaabbbab 6 | aaaaaaaaaabababbaaaaaaabbbbabbbbbbabbabbababbbbabbbbabaabbaabbaa 7 | babababaabbabbabbabbbaaa 8 | abaaaaababaaaabbbabababaabbbbbbaaabbbbaa 9 | aaaaaaabbbbabaaababbbaabaabbabbabbbbbbba 10 | bbabbbbaaaaaaabaaaaabaabaaabbaaaababaabbbbabaabbabbbbabaabaaaabbbbbbabab 11 | abbabaabababaababaabbbaa 12 | aaababbaaaaabaaabbbababbabbaabbbbbabbbabbaaaabaa 13 | abbbbaaaaababababbaabbaa 14 | bbabbaaaaabbbbbababbaababbbabbaa 15 | bbaaabbbbaaababbbabbabbb 16 | abbaaaaaababbaaabaababaa 17 | aaaaabbbbabbbbbbabbbbabb 18 | aaaabbaaaabababaabaabbaa 19 | aaabbababbbaaababbaaaaab 20 | abaaaabaabaaaabbaabbaabb 21 | bbbabbbaaaaabaabbabbbabbbbbbabbbabaaaabbabababba 22 | bbbbaabaaaabbbbbaaaaabab 23 | aabaaabbaababbbbbbabababbabbbaababbaaaaaabbaaababbaabbbaaabaaabbaaaababa 24 | abbabaabaabbbabababbbaba 25 | ababaaabbabbaabababbbbab 26 | abaaaababbbabaaabbabaaaa 27 | aabaaababbabbbabaaabaabb 28 | aaaabaaabbbbbaaababaabaaabaababbabaababb 29 | bbbabababbabbababbaaaaab 30 | abaaaaaabbbabbbbbbaabbab 31 | aaaabbaabaababababbbabab 32 | bbaaaaaababbaaababbbaabb 33 | babaaaaabaaaaaaaabbbabbb 34 | ababbaaaaabaaabbbbbaabbbbabbabaaababbbab 35 | baaabbabbbbabaaaabaaabab 36 | bbbabbbbaaababbbbaaaaaaaabbabbabaaabaaba 37 | babaabbabaabbabbbbaaabbbbbbbbabbbbbbbbbbbabbbaab 38 | aabbbbbaaaaabaaabbbbabba 39 | bbbbaababbaaaabbaaabaaaa 40 | abbaaabaaabaababbbbaaaaa 41 | babaaaaaaaababbaaaabaabb 42 | baababbbaabababaaaaaabab 43 | bbbbbbaabbbbabbbaaabaaaa 44 | baabbabbaaaaabbabbbaabaabaaaabaaababbbaaabaabbab 45 | baababbbbbbbaabaaaabaaba 46 | baaaabbabbbaaabaaaababab 47 | abbaabbbaaaabbaaaabaaaaa 48 | aabbababaabbabbbababbbbbbaabbabababaabab 49 | bbbababbbababaabbabbbaba 50 | bbbabaaabbbabbaaaabaaaaa 51 | babbbbbbbaababbbaabbbbab 52 | aaaaabbbababaaababbbaaab 53 | bbbaaababbaaabbbabbaababbbbaababbaaabbababaabbbbbbababbabbbabbba 54 | abbaabbabaaaabbabababbba 55 | abbbbaaaababbbbbbaabbbaa 56 | bbbbabababbaaabaaaaaabbbbababbaaaabbbaab 57 | aaaabbaaabaabababbaababa 58 | bbaaabbbababaaabaaaabbba 59 | bbbbabaababaaaaaaabababbbbabbabbabaaabba 60 | abbaaaaaaaabbabbabbaaaab 61 | aaaabaaaaababbabbaabbbba 62 | aabbbbbabababaaabbbababbabaababb 63 | baaabbabbbaababbabababba 64 | babaabbaaababaabbaabaaaaababaabaaaabaaab 65 | abaaaaababbbbbabaabaaaaa 66 | abbbbbabbaabbaababbbbabaabbbaaba 67 | baababbbaabaabbbbbbbaaaabbaabaab 68 | bbbbbbabbaaabbbabaabbabbabbaaaab 69 | abaaaababbbaabbabbaabbaa 70 | abababbbbabbbbbaaaabaaab 71 | bbbaabbbbbaaaaabaabbabaabbbbaaaaaaababbbaaabababbbbbbbba 72 | aaaaabbbbbbaabbaabaabaab 73 | aabbaababaaabbbaabaabbab 74 | abbabbaaabaaabaabaabbbbb 75 | bbbaaabbaabaaababbbaabaa 76 | bbaabbbbbbbaaaaabaabbaaa 77 | ababaabbaabaabbbbbabaaaa 78 | ababaaaaaaaabbbbbabbabbbabbaaaaaaabbbaaaaabbabbabbabbaaabaabbbaabaaabbabaabaaabaabbababa 79 | abbaaabababbbababbbaaaabaaaaabab 80 | abbbbbabbababbbbbabbbbab 81 | baabbaabbbbbababbbbaaaab 82 | abbbbbaababbaabbbaabaaba 83 | aabbaaababaaabaaaaabbbab 84 | bbbbbbaabbababaabbbabbaabbababbaaaaababa 85 | abaabababbaabbbbabbbbbba 86 | bbabbbaabbbbbbabaaaaabbbabbaaabaabbbbbaaabbababaaaabaaaa 87 | aabbababaabbbabbbabaaaab 88 | bababaaabbbbbaaaaaaaabaaaaabaabbababaabababbababaaabbbaaabbbaaaa 89 | bbbbbbaaaabaaabaabbbbabaaaabbbbb 90 | bababaababbbbbaabbaaabab 91 | babaabbabbbbbbaababbabba 92 | ababaaabaabbbbbababaaabb 93 | bbbbabaaabbabbabbabbaaaa 94 | ababbaabbabbaababbbaaababaabbaaa 95 | abaaaaabbaaaaababbabbabb 96 | bbaababbbaabbaababaababaabbaaababaabbabbbbbbbbbbaaabbbbbbbaababaabaabbbb 97 | bbbbbbaaabaaabaaabbbabbb 98 | aabbbababaaababbaaaaaaba 99 | abbabaaaaabbaababbbaaabbabababba 100 | babbababaabaabbbaaabbbbbbbbbaabbababbbab 101 | bababbaaabaaabaabbbabbaabbababaabbbbbaaabaabbbbbbbbbbbbbaaabbaab 102 | ababbaaabbbbbaaabababbba 103 | aabbaaababaabaaaabaabaab 104 | bbaabaaabbabaabaabbababbabaababababbbbaabbbaababaabbabab 105 | aababaababaaabaaabbbbbba 106 | ababbbaababbabababbaaabbaaaaaaaaabaabababbaabaaabaababababaaaaabababbabababbbabaaaabbbbabaaabaab 107 | baabaabbbaaaaabbaaabbaab 108 | aaaabaaaabaabaaabbabaaab 109 | bbabbaaaaaababbaabbbbaaaaaaabaaabbabbbbb 110 | ababbaabaababbbaaabbbbaa 111 | bababbbbbbbabaabbbbabaaaabaaaaaaaabbabaa 112 | aaabbbbbabbbabbaabbabaaaaabbbabbbababbabbbababbaabababaa 113 | babaabbbabbaaaaabaaabbbaaaabbbaabaababaa 114 | aabbaababbabbbabbaaaabaa 115 | abbbbaaabababbbbbbabbaaaababaaabbbbbbbbb 116 | baaaaaaababbaaabaabbabba 117 | abbbaaaabbaaaaaaabbaaaab 118 | bbabbbbbbaaababbabaabababbbaabababbabbbaabbabbaaabbababbaabbbabbbbbabbba 119 | abbaaaaaabbabaaaabbaabbbababbaaaaaaaaabbaabbbaaaabaaabba 120 | aabaabaaababaabbbaaabaababaabbaabaabbbbbaabbbabbbbaaabaa 121 | aaaababbaababbabaaaaabaaabbbbaaaaabbaaaa 122 | bbbabaaaabaaaaaaaaabaaaa 123 | aababbbaabbbbababbbabbbbaaabaaaa 124 | aaaaabbabbabbabaaaabbbba 125 | aabaababababbbbbbaaaaababaabbabbbababaaaaabababb 126 | babbbbbaaabbbabbabaabbbb 127 | bbabbbaaabaaaaabbbaabbbbbabaaaab 128 | bbbbaabbabbaaaaabababbbbababaaaa 129 | abaaabaaabbaabbaabaaabbb 130 | aaababbaababaabbaaababab 131 | bbabbaaabaaabbabaaaaabbaaababaaa 132 | aabbabbbbbbbababbbbbbaabbabbabaa 133 | aaaaabaabbbbbabbaaaaabaabbbaabbbbaabaabaabbbaaabbaabbabaaabbbbbabaaaabaaabaaabbb 134 | abbabbaabbbababbbabbabba 135 | babbbaababbaaabaaaabaaab 136 | bbabbaaaabbaaabaaaaabbaaaaababaaabbaabba 137 | abaabababaababababababba 138 | aabbbaabbaaaaabaaabbaaba 139 | abbaaabbbbbababaabbbaabbbabbababbbbbbbaabbbbbaabbabaabaaababbbbabbbabbaaabaabbaa 140 | aabbbaaaabbbaabaabaabbbbabbabbaa 141 | bbbbabaababababaabababaabbabbbbbaaaaababaababbbaaabbbbabbabbbabb 142 | babaaababaabbabbbbaabbbbbaababbaaabbbbaa 143 | aaabbbbbaaaaabbbaabbabba 144 | baaabbbaaabbababbababbbbabbbaaaabbabaabbabaabbba 145 | baaabaabaabaabbbbaababba 146 | aaababbbbabbbbaaaaaaabbbababaaaabbabaabbbaaaabababbaabaa 147 | bbbbbaaabaaabaabbbbaaabbaabbbababbbaabbbbaaaabbb 148 | baaaaaaabaaabbabbabbabaa 149 | abbaabbaabbaabbbabababab 150 | aaaaabbaaabaaabbbbaaabab 151 | bababbaaaaaaabaaaaaababa 152 | aabbbabbbbbbaaaaabbbaaaabaabbbbb 153 | aabaabbbbbbbbbaabaaaaaab 154 | bbabbababbbbabbbbbbbabaaaaaaabbbbaaaabbb 155 | aabaababbbbbbbaaaabbaabb 156 | aabbaabaababbbbabbababab 157 | bbababaabbbaaabaabbbabaa 158 | aaaababbabaaaabbabbbaabb 159 | abbbbbababbbbbaaaaabbbaa 160 | ababaabbaabbababbbaaabaa 161 | bbbbababbabbbbbbbbbbabbbaaaabaabbaaabaaa 162 | bbbabaaabaabbabbbaaabaaa 163 | abbaaaaaabaabbabbbaaabbaabbbabababaaabab 164 | aaabaabaaabaaabbabbbbbbabaabbaaabaabbbbabbbbbbbbabababaaaaababababababab 165 | babbbaababbbbbaaabaaaaabaaabababaabbaabb 166 | bbbaaabbbbbbaaaaabbbbababababbaabababaaaabbabbbaaaabbbab 167 | babaaabaabaaaaabababbbaa 168 | abaaaaababbbaaaaaaabbaab 169 | bbbaaabaaabaabababaaabba 170 | bbbababbaabbaaabbbaabbaa 171 | babaaabaabbabaaaaabbbbbb 172 | bbbbababbbbabbababaaabba 173 | aabbaabaababaabbababaabbbabaabbbabbbbabbbaaabaaa 174 | bbbaaabaaabbbabbabbababb 175 | ababaaabbabbbbbababbbaba 176 | bbbbabbbaaaaaaababababaa 177 | ababaaabbbbbabaabaaabaaa 178 | bababababbbabbabbaaaabab 179 | baabbaababbbbaaabbbabbba 180 | bbabbababbbbabababbbaaab 181 | aaabbababaabaaaaababbbab 182 | aababababbbaaabaabbbbbba 183 | baaabbaabaabaaabaaaabbaabbaaabbababaabbbaababaabaabbabaaababaaaaaabbbbaabbaabbbabbabbaaa 184 | bbbaaababbbababbaabbbbbb 185 | bbabbbaabbbbbbbbabbbbbaaabbaaabbbbbbababbbaaaabbbababaabbbbaaaaaababbaba 186 | abaaaaaabbabbabbaaaaaabb 187 | bbbabbaaaaabbbbbbbbbbaba 188 | aaabbabbaaaaabbbaabaabaa 189 | bababababaababbbaabbaabb 190 | abbbbabaabbbbabaabaabbaa 191 | bbaabbbbbbbabbaaaaabbbab 192 | abaabababbbaaabbaaaabbab 193 | bbbababaabaaaababbabbbbaaaaabbbabbabaaab 194 | aabaaabbbbabbaaaabbbabaa 195 | ababaabbaabbbaabbbabaaba 196 | ababbabbaabbaaabaababbbb 197 | aabbaababaabbabaabaaabab 198 | babbababbabbaaabaaaaabbabbabbbaababaaaab 199 | baabbaabaabababaabababab 200 | bbabbbabababbaabaabbbaaa 201 | bababbaaaabaaabbaabbabaa 202 | abbabaabbbbbababbbbaaabaabaaabaabbabaabbbabbbaba 203 | abbbbababbaabbbbababbbaa 204 | aaabbbbbaaabbbbbabbbbaab 205 | aabbababababbbbabbaababbaabaabbaabaababb 206 | babababaaabbabbbbbaabaab 207 | abbbabbababbaabbaabbbaaa 208 | bababbabbbaababbaababbaa 209 | abababbbababbbbbaabaabaa 210 | bbbabaaabaabbaababaaaabbaaaaaaababababbaaabbbbaaabbaaaab 211 | baaabbabababaaaababaabab 212 | bababaaabaaabbaabaaaabab 213 | babbbbaabaaaabbabaabababaaabbabbbabbbaabbaaabbbb 214 | baabaabbbbbbaababbababaabbbababbbabbbbaabaaababa 215 | bbbababbbaaabbaababababaababbaba 216 | abaaaabaabbaabbabbaaabbbabbabaababaabababaaabbbbbbaaaaab 217 | bbabbbaabbaababbbbaaabba 218 | baabbaabababbabbaababaaa 219 | aaaaabbaaabbbabbaabbabbbbababbababbabbabaaabaaaa 220 | aaaabaaababbbbbaaaabbabbbbbbabba 221 | aabbbbbabababaaaaababbaa 222 | aaabbabbabbabaaaabbaaabb 223 | bbbaabbababaaabaaaaabaab 224 | abbbbbabaabbababaabbbbbb 225 | aabababaaaababbbabaaabab 226 | abbabaaabbbabbbbaabbaaaa 227 | bbbabaabbaaaaabbabbabbababbababb 228 | abbbbbaababbbbaabbbaababbbbbaaabbbbbaaab 229 | bbbabaabbabaabbbabaaaaaabababababaabbbbaaaaababa 230 | bbbbaabaabbaaababbabaaaa 231 | abbbbabaaaaaabbaababaaaabaaaababbabbaaaa 232 | abaaaabababaabbbaaabbaab 233 | bbbaababbbaabbbbbbaaabba 234 | aababbabbbbaabababbbaaab 235 | aababbababaaabaaaaaaaaabaabbbbbb 236 | baaaaabaabbbbaaaabbbaaba 237 | abbaaabababbbbbaabbbbbaabababaaaaaaabbaaaaabbbbabbbaaaaaababbbabaaaaaabb 238 | bbbababbbbaaaabaabaababb 239 | bbbaaabbbababbbbabaabbbb 240 | baababbbbaaabbababbbbbbb 241 | abbbaabbbabbabaaaaababbabbbbabbbaabbbbabbbabbaaa 242 | aaabbabaabaaabaaabbbabbabaabbaaa 243 | bbbaabbbbbabbaaaaaaabaab 244 | baabbaabbbaaaabbbaabbbba 245 | ababbaaababaabbbbbabaabbabbbabbbabbbbabbbbbbabbaabbaaaabbbabababbaabaaaa 246 | abbabbaabaababbbabbabbba 247 | bbababaaababababbbababbabaaaabaaaabbabaaaaabbabaaaababab 248 | aaaaabbaababbaaababbbabb 249 | babaaabababaabaaaaababaa 250 | baababbbaabbbbbaababbaba 251 | bbbabababbbaabbabbabaaba 252 | bbbaabbabbaaaabbabbababb 253 | bbababaaaaababbaaaababaa 254 | aabbababbabaaabaaababbaa 255 | abbbbbaabbbaababaaabaaaa 256 | abaaaababbabbababaaabbabababaaabbbaaaabbbbaaababbbaabaab 257 | abbbbaaabbaaabbbaaaababa 258 | ababaaaababbababbabababb 259 | bbbbababbaaaaababaaabbbaaabbaabaabaabaabaabbabaa 260 | aabaaababaababbbbaabbbaa 261 | abbbaaaaabbaababaabaaaabbbbbaabbaabaabbbabbbaaababbbbaabbbbabaabaabaabba 262 | bbbabababaabbabbbbabaaaa 263 | aaaaababaabaabaabbaabaabbaabbbbbbbababab 264 | ababaaabaababaababbbaaab 265 | aaabbaabbabbbabaabbaababbaaaaaaababaaabbbbbbbbabbbbaabaa 266 | abbabbabbaabaababbaaabab 267 | bbababaaabbaaababbbbbaaaabbaabbabbaababbaabbbbbbabaaabab 268 | bbbbaaaaabaaaaaaaabababaabbababbaaaaaabbbbbbaaaabbbabbbb 269 | baababbbbbbbaabbbabaaabb 270 | baaaaabbaaabbaabbaabbbbbbbaabbbbbbbaabbbbbbababbabbaabaabbbbbbbabaaabaabaabbaabb 271 | baababbbbabbaaabbabbbbaabbaaaaaabbbaaaaabbbaabaa 272 | baaabaabaabbbaabbabbaaaa 273 | aaababbbaaaaabbabbabaaab 274 | babaabbaababbaabaabaaabababbabbb 275 | abbaaaaaabbaabbbabaabbaa 276 | bababbababaaaabbabaabbba 277 | babaabaaabaaaaaaaabbbaaa 278 | abbabbaababaabbabbaababa 279 | bbaaabbbbabbababaababaabbabbaabb 280 | ababbbbbbaabbaabaaaaabab 281 | bbbaaabbbabaabaabaababba 282 | abbbaaaabbababaababaaaab 283 | bbbbbbaabbbabbaabbbaabaa 284 | aabaaabaabababbbbaabaaab 285 | bbbaababaaaabbbaabaabbbbbbabaabbbbaaabbabbabbabb 286 | aabbaaababaaaaaaabababba 287 | bbbbabbbbaabaaaaabbbbbbb 288 | bbbbaabaaaababbabaabbaba 289 | baaababbbbbbbaaabbbbbbbb 290 | bbbababbbbbbbaaaababaaaababaabaaabbaaabb 291 | abbabaaaabbaabbbaaaababbbbbaaaababaabaab 292 | aabaababbbbabaaabaaabbaaaabaabbbaaaababa 293 | babaaaaababbaababbbbaabbaabbaabb 294 | aabbababbabaabaabbbaaaab 295 | abbabbabbaaababbaaaabbab 296 | baaabbaabbabbbabaaabaabb 297 | aabbaabaaaaaabbaaaaaaabb 298 | bbbabaaabbbabbaabbaaabba 299 | bbbaaabbbbbbaabaabbaaababaaaaaaababaaaab 300 | abbaaababbabbbabbbabbbaabbabbbaabbaabbba 301 | abaaaabaababaaaaababbaba 302 | bababbbbbbbbabbbaabaaabbbaabbaabbababbbababaabab 303 | bbaaaabbaaaaabaababaabbaaaaabbbbabaabbba 304 | baaabbaabbbaabbbbaaaabab 305 | aabbbabbbbbaaabababbbbab 306 | baaaaabbaababbabaabaaaaa 307 | babbaabbbbababaaaaaaabab 308 | baababbbbabaaaaababbabbb 309 | abaaaaabaaabbabaaabbaabb 310 | ababbbbababbaabaabbabbaaabbabbaaaaababbabbaaabaa 311 | ababaabbbabaaaaabbababbb 312 | bbbbaabbbabbaabbbabbaaaa 313 | bbbbbaaaaabbabbbbbbbbaba 314 | bbbbabbbaababaabbbaababa 315 | babaaaaabbbaabbbabbabaabbbabbabbbaaabbbb 316 | aababbbaaabbbababababbabaabaabababbababa 317 | baaaabbabababaaaababbbaa 318 | babbaabaaaaaabbbaaabbbababbbbbba 319 | bbaaaabbbbbaababbbabaaaa 320 | aaababbbaababaababbbaaba 321 | baaaaaaababbbbaabbbaababbbbaabbaaaaabbaaabababaabaaaabaaaaababaa 322 | bbbbababababaabbbabaabbaaaabaabbbbbaabaa 323 | baabaabbabbbbbabbbbbbaaaabbbbabb 324 | bababababaabaaaaaabbaaabaababbbabbbaaaaa 325 | abbabaabbaababbbabaabbab 326 | aaaaabbbaabaaabaabbbbaaabbbaabbbbababaaaabbbbbbaaabababbaababaaa 327 | bbababbbbaaaabaaabbababaabaaababbabaabab 328 | abbbbababbaaaababaabbbab 329 | aabbaababababbabbababbba 330 | bababbbbababbaababbbabaa 331 | bbbaabbbaababaabbbbbaaab 332 | babbaaabababbaabbbabbabb 333 | ababbbbbbabbbbbabbbabaaaababaaabaaababbabbbabbabbabababb 334 | aabaaabbabaaaabbbaaaaaab 335 | abaaaabbabaaaabbaababbababbaabaabbaaabaa 336 | baaaaabbabbbaaaaaaabbbaa 337 | bababbaaaabbbabbbaabaaba 338 | bbbbaabaababbaaaaaabbbba 339 | bbbbaabaaabbaaabbbbabbbbababbaba 340 | abababbbabbaaaabaaabaabb 341 | baaaaabbbabbbaababbbaaab 342 | bbbbabaaaaaababbbaabbbab 343 | bbbaaabaaabaababbaababaa 344 | abaabababaaaabbabaaaaababababbbbbbaabbabbbbaaaaa 345 | abaaaaabbbbaaabaabbbbbba 346 | abbbbbaaaaaaaaababbbbbaaabaaaaababbbaaaaabbbaaba 347 | aababbaabaabbabababbbbab 348 | baabbaaabbbaaabaaabbbbaabbbabbabbbababababbbbabbaabaaaba 349 | bababbbbaaabbababaabbaabbabbabbb 350 | babaaabaaaababbbaaaaaaabbaaabbbaaabbabaa 351 | aaaababbbbbbabbbabaaaabbabbbbabb 352 | abbbbaaaabbbbbaaaaaababbaabbbabbbaabbaababbbabbabbbbabbaabaaabba 353 | abbbbbabbaabaaaabbaabbba 354 | aabbbaabaabaabbbbbabbbababbabbbabaabaaba 355 | babaaabaababbbbbbbbaabbababaababbaaababaabbbabbbbabbabba 356 | baabaaaabababaabbaababaa 357 | abaaabaabaabbabbabbaabbababbaaaa 358 | bbbbababaaabbbbbbabaaabb 359 | bbbbaabaaabaababbbaaabba 360 | ababbaaabaaaabbaaaaaabbaaaaaabaaaabaaabbabbbabbb 361 | aabbbaabaaaabbaaabbbbabababbabaa 362 | aababbbabaababbbbbababba 363 | bbbabbbbbaaaaabbbabbaaaa 364 | bbbbbaaaabaaabaaaababbbb 365 | aaababbabbabbbababaabbba 366 | bbabbbababbbaaaabaaaaaab 367 | babbbaabaaaabaaababaabbbaabbabbbbabbabbabbbbbbbb 368 | aaabababbbbaaaaaaaabaaba 369 | aababbabaaaabaaaabbaaaab 370 | baaabbabbbbababbaabaabbbbbabbabaaaaaaababaaababa 371 | bababbabbbababaabbbbbaaabbababab 372 | baabababbabbaabbbbaabaaa 373 | baaababbabbbaaaaaaabaabb 374 | bbbbbaabaaaababbabbbabbb 375 | babbababbaaaaaaabbabbababaabbaabbbbbbbbabbaabaaabbaaaaab 376 | abbabbaababbbbbabbaabbba 377 | bbbbbaabbaaaaabaabbabaaaaababbaa 378 | babaabbaaaaaaaabaaabaaaa 379 | abbbabaaabaabbbbabbaaabbababababbbababab 380 | bbbbabbbabbbaaaaababbabbbbbbabba 381 | aabbbbbbabaabbbbabbaaaabbaababaabbaaabaa 382 | abbbaaaabababababaabaabbbbbaabbbbabbbaabbaababaa 383 | abaaabaabbbababbababaaabaabbbabbabbabaab 384 | aababaabbaaababbbaabbaaa 385 | babaaaaababaaaaabaaababbbbbbbbaaabbbbbbabbaabbbaaabbaabb 386 | abbbabbaaabaaabaaaabbaab 387 | bbabbabababbaaabbababaaaaaaabbabbbabaaba 388 | abbbbabaaaaababbabbbbbba 389 | baaaaaaaabbaabbbaabaabaa 390 | bababbaabbbbababbbabbaab 391 | abbbabbabababbaaaababbbabbaababa 392 | baaabaabbbbabbaabaababaa 393 | bbbabbabaaababbbbaabaaab 394 | ababbaabbbabbbabaaaaabab 395 | bababbaabbaababbbbbababaababbbaaaaabababbbaabbbabaababbaaabaaaaaaababaaa 396 | abaaaaabbbbaabbbbabbaabbabaaabaabbaaaabbabaabbab 397 | abbbabbabaaabbabbabaaaaaaabbaaabbbbbabba 398 | bbaaaaaabbabbbabbbbbbbbb 399 | baababbbabaaaabaaaaaabbbaaaaabab 400 | baaaaababbababaaabbbbbba 401 | bbaababbabbabaaabaabbbab 402 | baaabbabbbbbbaabbaabbbbb 403 | abbaabbbbbbaaabaabbabbba 404 | aaaabaaaabbbbbabbababbba 405 | bbbbbbaaababaababbbaaaab 406 | baabaaaabbbbbbaaaaaaabbbbabaabbabbbababaaaaababa 407 | babbababaabbaabababaabab 408 | aaaaaaababaaaabbbaaababa 409 | aabaaabaabbbbaaababbabbb 410 | ababbabbbababababaaabbbabbbaabaa 411 | babaaaaabbbbabbbabbbaaaabbabbbaabbbaaaaa 412 | bbaaaababbbababbbbbaabbaabbababaaaaabaab 413 | bababbaaabbbbbaabaababaa 414 | aaabbabbababaaabbababaabaababaabaabbaabb 415 | ababbaaabbababbbbbbaabaaaabababaabbbbababaaabbbaabbbbaaaaababbba 416 | bbbbbbaabaabbaabaaaaaabb 417 | aaaabbabaaaabaabbbabbabbbbaabaaaabbaabbaaababbaa 418 | bbbababbbbbaabbaabaabbbb 419 | ababbabbbababbaaaabaabba 420 | babbaaabbbaaaabbabbabbba 421 | abaabaaabbbabaaaabbababa 422 | ababbbabbaaabaaaaaaabaabbabaaababbaaabbaaababbbbabbababb 423 | bbbabaaaabaabaaabbabbaab 424 | baabbabbbbaaaabbaaabbbab 425 | babaaaaaaaaaabbaaaabaabb 426 | abbabaabababbabbabbaaabaaaabbbabbbaabaab 427 | aaabababbabaabbababbbabbbaaababbbaababbabbbbbababbbabababababbabababaabb 428 | bbaaaababaaabaabbbbaaaaa 429 | aaabbbbbbbbbbbabababbaba 430 | aaababbaaababaabaaabbaab 431 | bbbbabbbabbbabbabbbabbba 432 | bbbababbabbaababababbaba 433 | bbbabbababbbaaaaabaaaabbbbbaabaa 434 | bbbbbaabababaabbbbababab 435 | abababbbbaabbabbabbbbabaaabaabaa 436 | baaabbabbababbababaabbaa 437 | aabbbabbbaaaaaaaaaababbbaaaababa 438 | bbaaabbabaabbaaabaababbaabaabbbb 439 | baaaaababbaaaabbbbaababbbbababbaabbaaabbbbaabbababbabbbabaabaabaaabbabba 440 | abbbbabaabbaabbbabbbabab 441 | bbbbaaaaaabababaababaabaababbaba 442 | bbabbbababaaaaabbbaaaaaaabbbbbba 443 | aaaaabbaabbbbaaaaaaaaabb 444 | babbbbaaaaaabaaaaabbbbaa 445 | bbbabababababbabbaaaaabaaaabaaaaaaaabaab 446 | abaaaaaaabbaabbaabababbbaabaabba 447 | abbabaababaabaaabbaabaab 448 | bbaaaabaaababaababaabbba 449 | abaaabaaabbaabbabaaaabbb 450 | bbbaabbbbbbbabaaababbbab 451 | ababaabbbabbbbaaabbabaaababbbaaa 452 | abbaaaaabbaaabbbbbaaabaa 453 | baabaabbbaaaabbabaaaabaa 454 | abaaaababbabbbbabbbabbba 455 | bbaababbbababababbbbaabaaabbbbbbaabbbbab 456 | bbbbaabababaaababbbbaaab 457 | abbabbaabaaabbbabaaabbbb 458 | bbabbaaaababbbbaabbaaabaabaabababbbabaaaabbbabab 459 | abababbbaababbbabbbaabba 460 | baaabaabababaaaabbaaabaa 461 | abbaaababaabbaaabababaaaaabaaaabbbabaabababbababbabbaaaabaaababbbabaabab 462 | bbbbabbbaabbaaabbbaabbab 463 | aabbabaaaabbbabbabbabbbbaabbaaaabbaabbaabaaaabbabaaabbbababbbabaaaabbbabaaaaabbabbbbaaaa 464 | baaaaaaababbbbaababababb 465 | bbbabbbbaaaabaaababbbbbb 466 | abbbbbaaaabbababbbbabaaaabababbbbbbaabbaaaaababaaaaaaabb 467 | aaabbabababababaababbbbbabaababb 468 | baaabbaababbabbbbbaaabab 469 | baababbbbbabaabbbaabbbbbbaaabbbbbbaaababaaaabaabbbbbbabbbababbabaabaabbbaaaabbba 470 | aaaababbbbaaabbbaaaabbab 471 | aabbbabbaaaaaaabaabbbbaa 472 | babbaabbabbbbabaaabaaaab 473 | bababaabbbbaaabbaabbbbba 474 | aababbbaabbabaaabbabbbbb 475 | aabaaabbaaaababbbabbbabb 476 | bbbaaabaabbabaaabbbbbabb 477 | aabbaabaababaabaaabaaabaabbbbaaabaabbbab 478 | ababaababaababbbaabbbaaa 479 | abbaaaaaabbabbabbaabaaba 480 | abbbbbaabaaaaabbaaaaaabb 481 | -------------------------------------------------------------------------------- /19/main.nim: -------------------------------------------------------------------------------- 1 | 2 | import npeg 3 | 4 | 5 | let p = peg r0: 6 | #r8 <- r42 7 | #r11 <- r42 * r31 8 | 9 | r8 <- r42 | r42 * 8 10 | r11 <- r42 * r31 | r42 * r11 * r31 11 | 12 | r0 <- r8 * r11 * !1 13 | r1 <- r5 * r24 | r92 * r70 14 | r2 <- r5 * r5 | r92 * r44 15 | r3 <- r1 * r5 | r97 * r92 16 | r4 <- r92 * r5 | r5 * r5 17 | r5 <- "a" 18 | r6 <- r78 * r5 | r88 * r92 19 | r7 <- r5 * r36 | r92 * r106 20 | r9 <- r16 * r92 | r50 * r5 21 | r10 <- r5 * r70 | r92 * r48 22 | r12 <- r92 * r117 | r5 * r21 23 | r13 <- r92 * r88 | r5 * r117 24 | r14 <- r55 * r5 | r4 * r92 25 | r15 <- r92 * r51 | r5 * r105 26 | r16 <- r117 * r5 | r111 * r92 27 | r17 <- r65 * r5 | r77 * r92 28 | r18 <- r125 * r5 | r58 * r92 29 | r19 <- r64 * r5 | r1 * r92 30 | r20 <- r92 * r103 | r5 * r21 31 | r21 <- r5 * r92 | r5 * r5 32 | r22 <- r103 * r92 | r88 * r5 33 | r23 <- r44 * r70 34 | r24 <- r5 * r5 35 | r25 <- r92 * r111 | r5 * r4 36 | r26 <- r5 * r34 | r92 * r61 37 | r27 <- r92 * r12 | r5 * r109 38 | r28 <- r92 * r30 | r5 * r109 39 | r29 <- r94 * r5 | r65 * r92 40 | r30 <- r92 * r24 | r5 * r117 41 | r31 <- r92 * r114 | r5 * r87 42 | r32 <- r40 * r5 | r13 * r92 43 | r33 <- r5 * r92 44 | r34 <- r92 * r9 | r5 * r134 45 | r35 <- r104 * r5 | r10 * r92 46 | r36 <- r92 * r71 | r5 * r43 47 | r37 <- r88 * r92 | r68 * r5 48 | r38 <- r27 * r5 | r17 * r92 49 | r39 <- r5 * r4 | r92 * r21 50 | r40 <- r24 * r5 | r24 * r92 51 | r41 <- r5 * r70 | r92 * r4 52 | r42 <- r7 * r92 | r86 * r5 53 | r43 <- r120 * r92 | r122 * r5 54 | r44 <- r5 | r92 55 | r45 <- r108 * r5 | r119 * r92 56 | r46 <- r98 * r92 | r19 * r5 57 | r47 <- r78 * r5 | r4 * r92 58 | r48 <- r92 * r92 | r92 * r5 59 | r49 <- r33 * r5 | r21 * r92 60 | r50 <- r53 * r92 | r48 * r5 61 | r51 <- r5 * r111 | r92 * r117 62 | r52 <- r92 * r15 | r5 * r101 63 | r53 <- r92 * r5 64 | r54 <- r5 * r4 | r92 * r78 65 | r55 <- r92 * r92 | r5 * r92 66 | r56 <- r74 * r92 | r62 * r5 67 | r57 <- r33 * r5 | r70 * r92 68 | r58 <- r28 * r92 | r133 * r5 69 | r59 <- r5 * r88 | r92 * r24 70 | r60 <- r5 * r21 | r92 * r4 71 | r61 <- r92 * r32 | r5 * r102 72 | r62 <- r128 * r5 | r60 * r92 73 | r63 <- r92 * r91 | r5 * r64 74 | r64 <- r92 * r70 75 | r65 <- r53 * r5 | r48 * r92 76 | r66 <- r5 * r24 77 | r67 <- r4 * r92 78 | r68 <- r5 * r5 | r44 * r92 79 | r69 <- r2 * r5 | r111 * r92 80 | r70 <- r44 * r44 81 | r71 <- r29 * r5 | r96 * r92 82 | r72 <- r92 * r55 | r5 * r24 83 | r73 <- r24 * r92 84 | r74 <- r92 * r20 | r5 * r82 85 | r75 <- r63 * r92 | r112 * r5 86 | r76 <- r92 * r70 | r5 * r53 87 | r77 <- r21 * r92 | r78 * r5 88 | r78 <- r92 * r92 | r5 * r5 89 | r79 <- r92 * r75 | r5 * r38 90 | r80 <- r5 * r39 | r92 * r6 91 | r81 <- r21 * r5 | r68 * r92 92 | r82 <- r5 * r53 | r92 * r68 93 | r83 <- r5 * r48 | r92 * r111 94 | r84 <- r92 * r100 | r5 * r57 95 | r85 <- r92 * r55 | r5 * r33 96 | r86 <- r5 * r115 | r92 * r18 97 | r87 <- r130 * r5 | r126 * r92 98 | r88 <- r44 * r92 | r92 * r5 99 | r89 <- r5 * r54 | r92 * r47 100 | r90 <- r92 * r70 | r5 * r117 101 | r91 <- r117 * r5 | r117 * r92 102 | r92 <- "b" 103 | r93 <- r92 * r89 | r5 * r107 104 | r94 <- r21 * r5 | r111 * r92 105 | r95 <- r37 * r92 | r105 * r5 106 | r96 <- r92 * r73 | r5 * r1 107 | r97 <- r92 * r78 | r5 * r2 108 | r98 <- r5 * r40 | r92 * r72 109 | r99 <- r67 * r92 | r23 * r5 110 | r100 <- r53 * r92 | r2 * r5 111 | r101 <- r92 * r83 | r5 * r127 112 | r102 <- r59 * r5 | r131 * r92 113 | r103 <- r5 * r44 | r92 * r5 114 | r104 <- r5 * r117 115 | r105 <- r5 * r53 | r92 * r55 116 | r106 <- r110 * r5 | r56 * r92 117 | r107 <- r124 * r92 | r90 * r5 118 | r108 <- r59 * r5 | r81 * r92 119 | r109 <- r5 * r21 | r92 * r78 120 | r110 <- r121 * r92 | r35 * r5 121 | r111 <- r92 * r5 | r5 * r92 122 | r112 <- r41 * r5 | r132 * r92 123 | r113 <- r118 * r92 | r84 * r5 124 | r114 <- r79 * r92 | r26 * r5 125 | r115 <- r46 * r5 | r93 * r92 126 | r116 <- r92 * r70 | r5 * r2 127 | r117 <- r92 * r92 128 | r118 <- r92 * r116 | r5 * r49 129 | r119 <- r25 * r5 | r85 * r92 130 | r120 <- r5 * r129 | r92 * r47 131 | r121 <- r92 * r90 | r5 * r14 132 | r122 <- r5 * r66 | r92 * r22 133 | r123 <- r5 * r3 | r92 * r99 134 | r124 <- r92 * r55 | r5 * r4 135 | r125 <- r95 * r92 | r80 * r5 136 | r126 <- r5 * r45 | r92 * r113 137 | r127 <- r117 * r5 | r55 * r92 138 | r128 <- r92 * r2 | r5 * r68 139 | r129 <- r5 * r111 | r92 * r88 140 | r130 <- r92 * r52 | r5 * r123 141 | r131 <- r103 * r92 | r111 * r5 142 | r132 <- r21 * r5 | r24 * r92 143 | r133 <- r5 * r100 | r92 * r69 144 | r134 <- r129 * r5 | r76 * r92 145 | 146 | 147 | var ans = 0 148 | 149 | for l in lines("input"): 150 | echo l 151 | if p.match(l).ok: 152 | inc ans 153 | 154 | echo ans 155 | 156 | 157 | -------------------------------------------------------------------------------- /20/input: -------------------------------------------------------------------------------- 1 | Tile 1171: 2 | .##...#... 3 | .........# 4 | ....##.... 5 | #.#...##.# 6 | .....#.... 7 | .#...#...# 8 | ###....... 9 | .#........ 10 | #........# 11 | #..##.##.# 12 | 13 | Tile 3331: 14 | ..##.#.... 15 | #....#...# 16 | #......... 17 | #...#..##. 18 | #.#...#..# 19 | ..#...##.# 20 | .......#.# 21 | .....#.### 22 | ##..##.... 23 | .#.#.###.. 24 | 25 | Tile 2273: 26 | .###.#.... 27 | ........## 28 | #..##..... 29 | ...#..#.## 30 | #......... 31 | ..#....... 32 | .........# 33 | ##.......# 34 | .##..#...# 35 | .##.#.#.#. 36 | 37 | Tile 2179: 38 | .#..#.#... 39 | ##.#.#..#. 40 | #...##.#.# 41 | #......... 42 | #..#...#.# 43 | ###.##...# 44 | ...##....# 45 | .......#.. 46 | #.##.....# 47 | #.#####.#. 48 | 49 | Tile 2579: 50 | .#...#.... 51 | ##.....### 52 | #######..# 53 | #.......#. 54 | ###.....## 55 | ..#..#.... 56 | ..#......# 57 | .#...#...# 58 | #.......## 59 | #.####..## 60 | 61 | Tile 1153: 62 | .##.#..... 63 | #.......#. 64 | #...###.#. 65 | ..#....#.# 66 | #...#...#. 67 | #...##.### 68 | #..#....#. 69 | #.#......# 70 | #..#.#...# 71 | .##.###... 72 | 73 | Tile 2311: 74 | ####.#..#. 75 | #.#...#.## 76 | #.......## 77 | ##.##.##.# 78 | .......#.# 79 | ...#.....# 80 | ....##.#.# 81 | #.##....#. 82 | #.#...##.# 83 | .##.####.. 84 | 85 | Tile 1579: 86 | #..##.##.. 87 | .#.##..### 88 | #...##.#.# 89 | ###.....#. 90 | #.#......# 91 | ....#.#... 92 | #.#..###.. 93 | ......#.## 94 | .#...#.#.. 95 | ##.....##. 96 | 97 | Tile 2351: 98 | .##..###.. 99 | #.#..#..#. 100 | #.......## 101 | ....#..... 102 | #.....#... 103 | ......##.. 104 | ...###.... 105 | #.##..#... 106 | ..#.##.#.# 107 | .#.##..... 108 | 109 | Tile 3761: 110 | #..#.###.. 111 | .#...#.... 112 | .....##.#. 113 | #..####... 114 | #.##...#.. 115 | ###..#.#.# 116 | .#..#.#... 117 | ....#...#. 118 | ##..##.#.# 119 | ####.#.... 120 | 121 | Tile 1783: 122 | ##.####.#. 123 | ###..#.##. 124 | #...#.#..# 125 | ##........ 126 | .#.....#.# 127 | #.#...##.# 128 | #..#..#### 129 | #..#...#.. 130 | #...#.#.#. 131 | ##.#...### 132 | 133 | Tile 3259: 134 | #.....#... 135 | ..###..#.. 136 | #.##...#.# 137 | ###.....## 138 | ####.#..#. 139 | .......... 140 | #.....#... 141 | ###...#..# 142 | #...#..... 143 | .#..##.### 144 | 145 | Tile 1721: 146 | .#..#...#. 147 | .#...#...# 148 | #.....#... 149 | #..#...... 150 | ..#####... 151 | #.#..#.... 152 | ...#.#.... 153 | #...#.#... 154 | .#.#..#..# 155 | ##...#..## 156 | 157 | Tile 2749: 158 | #...#.##.. 159 | ##....#.## 160 | ..#....#.# 161 | #...##.... 162 | ...#.##.## 163 | #..#...#.# 164 | #.#...#..# 165 | #......... 166 | #..#...##. 167 | ..#...#.## 168 | 169 | Tile 1259: 170 | ###.#..##. 171 | .#..#...## 172 | #.#.##..## 173 | ..#..#...# 174 | .#..#.#.#. 175 | #......... 176 | ##......#. 177 | .####.#... 178 | .##....#.# 179 | ....##.#.. 180 | 181 | Tile 2683: 182 | .#.######. 183 | #...##...# 184 | ##.#..#... 185 | ..#.##...# 186 | .....#.#.# 187 | #..#.#.... 188 | #.###..... 189 | #.....#.## 190 | #......... 191 | ..#...#.#. 192 | 193 | Tile 1217: 194 | .##..#.### 195 | #.....#.#. 196 | #.......#. 197 | #...##..## 198 | #...##.#.. 199 | ...#.###.# 200 | ##.#....## 201 | .....#.... 202 | .#.#...#.# 203 | ....##...# 204 | 205 | Tile 2251: 206 | ##.##..... 207 | #.#.....#. 208 | ##..#..#.. 209 | ###..##.#. 210 | #.##...#.# 211 | .........# 212 | ####..#... 213 | ..#..##.## 214 | .##.##.#.. 215 | .##......# 216 | 217 | Tile 2791: 218 | ##.#.###.# 219 | #.......## 220 | #....#...# 221 | ##....##.. 222 | #...##..#. 223 | #..#..#... 224 | ###..#.... 225 | ....###### 226 | ##.#.#..## 227 | .....#.... 228 | 229 | Tile 1879: 230 | ##..###.## 231 | ##.......# 232 | .#..#.##.. 233 | .##....... 234 | .#..#....# 235 | #.#......# 236 | ##......## 237 | ...#....## 238 | #.##..#### 239 | .##...###. 240 | 241 | Tile 2029: 242 | ..#...##.. 243 | ..##..#.## 244 | .##....#.. 245 | #...#...#. 246 | #.......## 247 | ......#.## 248 | ........#. 249 | ##.#..#... 250 | ..#....... 251 | ...#...### 252 | 253 | Tile 1451: 254 | .........# 255 | ....#...#. 256 | ##..#....# 257 | .....#.... 258 | .....#.... 259 | ....#..... 260 | #......... 261 | ...#.#...# 262 | .......#.# 263 | .#####.#.# 264 | 265 | Tile 1091: 266 | #...#.#..# 267 | #.#......# 268 | #........# 269 | ....##...# 270 | #..#.#.... 271 | #.......## 272 | ...#.....# 273 | #......... 274 | ##.....##. 275 | ..#.#..##. 276 | 277 | Tile 3343: 278 | #.#.#...## 279 | #..#...... 280 | #......#.. 281 | ..#..#..## 282 | ##.##.#### 283 | #...#.#..# 284 | .......... 285 | .##..#...# 286 | ..#...#..# 287 | ..######.# 288 | 289 | Tile 3299: 290 | ##.#..#..# 291 | ..##..#... 292 | ....##...# 293 | ##.....#.. 294 | #.#.#..#.. 295 | ........## 296 | ##........ 297 | ##.##.#..# 298 | ####.#.#.. 299 | ........## 300 | 301 | Tile 1873: 302 | #..#...#.# 303 | ##..##.... 304 | #...##.#.# 305 | ..##.###.. 306 | .##....#.. 307 | .#.......# 308 | #.......#. 309 | .#......## 310 | #........# 311 | #..#..#... 312 | 313 | Tile 2741: 314 | .#...##.#. 315 | #......#.. 316 | ##........ 317 | ..#..#.... 318 | .####.##.. 319 | ......#... 320 | ...#..#..# 321 | .......... 322 | #......... 323 | .#####.#.# 324 | 325 | Tile 1907: 326 | #...##.#.. 327 | ....#...#. 328 | ...#..#... 329 | ..##..#.#. 330 | .#.#...... 331 | ###......# 332 | #........# 333 | ..##..#### 334 | ...#.....# 335 | ##..#..##. 336 | 337 | Tile 1019: 338 | .###.#..#. 339 | ##........ 340 | .###....## 341 | ...#..#.#. 342 | ....###..# 343 | .#.#.#..## 344 | ..##...... 345 | #.#....#.. 346 | ..#..#...# 347 | #.#.##..## 348 | 349 | Tile 3469: 350 | .#.#.###.# 351 | ###....... 352 | ..#..#..#. 353 | .#.#.....# 354 | .#.##.##.. 355 | ##.##...#. 356 | .###.....# 357 | .##..#...# 358 | #.##.#..#. 359 | .###.##### 360 | 361 | Tile 3067: 362 | ...#.####. 363 | #...#.#... 364 | .#.....#.. 365 | ....#.#... 366 | #....##..# 367 | #......... 368 | #.#..##..# 369 | #......... 370 | #........# 371 | .....##.## 372 | 373 | Tile 3121: 374 | #.####..## 375 | #..#....#. 376 | .#........ 377 | #.#...#.#. 378 | #.#.#....# 379 | ##.......# 380 | ...#.#...# 381 | #...##.#.. 382 | .#......#. 383 | #...#.#.## 384 | 385 | Tile 1543: 386 | #.####.##. 387 | .#..#...## 388 | ###.#...#. 389 | ##.#.#...# 390 | #.##...#.# 391 | .......#.# 392 | .....#..## 393 | ..#.....#. 394 | .......... 395 | ..#..###.# 396 | 397 | Tile 2089: 398 | ##.......# 399 | ..#..##.## 400 | ##...#.... 401 | ......#..# 402 | #...###..# 403 | #...#....# 404 | ##..##.#.. 405 | .....##..# 406 | #.......## 407 | #...###### 408 | 409 | Tile 2153: 410 | ###..#...# 411 | ##.#.#.... 412 | .#........ 413 | ###.##.#.. 414 | .##..#.... 415 | ##....#.#. 416 | #..#..#... 417 | ...#.##... 418 | .........# 419 | .#..#..... 420 | 421 | Tile 2347: 422 | ..##.####. 423 | #.#.##.... 424 | .##....#.# 425 | ##...#.... 426 | .#...#...# 427 | ..#....... 428 | .........# 429 | #......... 430 | .....####. 431 | .##...#.#. 432 | 433 | Tile 1087: 434 | ..#.##..## 435 | #...#.#..# 436 | #.####...# 437 | #....#..## 438 | #...#....# 439 | #.....#... 440 | ........#. 441 | .###...... 442 | ..##.....# 443 | #..#.#..#. 444 | 445 | Tile 2423: 446 | ..####.### 447 | ...#..#..# 448 | ....####.# 449 | #...##...# 450 | #..##....# 451 | #..#.#..## 452 | ##..#.#.## 453 | ..#...#... 454 | ###..##.#. 455 | ...##.#..# 456 | 457 | Tile 3923: 458 | ......###. 459 | #..#....#. 460 | #.##..#..# 461 | ##.....#.. 462 | .#...#..## 463 | ....#..#.. 464 | #...#....# 465 | ..#......# 466 | ##..#.#... 467 | .#....#..# 468 | 469 | Tile 3947: 470 | .#.###...# 471 | #...#....# 472 | ..#..#...# 473 | ...##..... 474 | ...#.....# 475 | #..##....# 476 | .......#.. 477 | #........# 478 | #.....#... 479 | #..######. 480 | 481 | Tile 3833: 482 | ....##.##. 483 | ...#.##..# 484 | ##....##.# 485 | #....#.... 486 | #...#..... 487 | #..#..#..# 488 | ..#..#.... 489 | #.....#..# 490 | .#....###. 491 | #.#.###### 492 | 493 | Tile 2339: 494 | .##.#.##.. 495 | #.#....... 496 | #.#....#.. 497 | .#.#...#.. 498 | #.###...## 499 | #.##....## 500 | ...#.....# 501 | ...##..#.# 502 | ###.....#. 503 | ##.#..##.# 504 | 505 | Tile 2221: 506 | #.##.##..# 507 | ..#....... 508 | #.......#. 509 | #.....#..# 510 | ...#..#### 511 | ..#....#.. 512 | #..#...... 513 | #......#.# 514 | #.#.#.#..# 515 | ...##.##.# 516 | 517 | Tile 3319: 518 | ....#..##. 519 | ...##..### 520 | #........# 521 | ##.##..#.. 522 | ..##..#.#. 523 | #...#..... 524 | ......#... 525 | ##.#...... 526 | .#.##..#.# 527 | #...#.#.#. 528 | 529 | Tile 3511: 530 | #..##.#### 531 | ..#....... 532 | #..##..... 533 | #.#..#..#. 534 | ...##.#.#. 535 | ##......#. 536 | ...#...#.# 537 | #..##.##.# 538 | .###....#. 539 | #.######.. 540 | 541 | Tile 3677: 542 | #.....##.. 543 | ..#..##... 544 | #.##.#..## 545 | ##.#...#.# 546 | .#......#. 547 | ..#..#.... 548 | .#.#.#...# 549 | ..#....... 550 | ..#......# 551 | ......#.#. 552 | 553 | Tile 3919: 554 | ##...##.#. 555 | ..#.##..#. 556 | #...#....# 557 | .#..#.#... 558 | #.#...#... 559 | ......###. 560 | .....###.# 561 | #.#.....## 562 | .###.#...# 563 | #....##### 564 | 565 | Tile 2879: 566 | #....##..# 567 | .#.##...#. 568 | ####.#.##. 569 | ##...###.. 570 | .#......#. 571 | #..###...# 572 | #........# 573 | ......#.## 574 | ..#.#....# 575 | ...###..#. 576 | 577 | Tile 3613: 578 | .####....# 579 | ....#...## 580 | #.##.#.... 581 | #.#....#.. 582 | ##....#..# 583 | ##...###.# 584 | .#....#..# 585 | #.....#... 586 | ##........ 587 | #.#...##.. 588 | 589 | Tile 1523: 590 | .#.##.#.## 591 | #.####.### 592 | ......#... 593 | #.....##.# 594 | ###.##.... 595 | ..#...###. 596 | ......#.## 597 | #....#.... 598 | #...#.##.. 599 | ##....#... 600 | 601 | Tile 2111: 602 | ##..##..#. 603 | .##......# 604 | ...#.##... 605 | ......#..# 606 | #.####..## 607 | #.####...# 608 | #......##. 609 | ...#.#.### 610 | #..##....# 611 | ....#.#.#. 612 | 613 | Tile 2539: 614 | ..##.##.#. 615 | #.....#... 616 | ....#.#.#. 617 | .....#..#. 618 | ..#..####. 619 | ...####..# 620 | .......... 621 | ......#..# 622 | ...#####.# 623 | ..##..#### 624 | 625 | Tile 1459: 626 | ....#.#..# 627 | #...##...# 628 | ...##.#... 629 | .##..#.### 630 | .#...##..# 631 | ....#.#..# 632 | #..#..#... 633 | #.#.#..#.. 634 | #.#....... 635 | #.##....## 636 | 637 | Tile 1193: 638 | ..#.#..#.. 639 | .#....#... 640 | #..#.....# 641 | .......... 642 | .....#.#.# 643 | #.#..#.#.# 644 | ........#. 645 | .......##. 646 | #.#...#... 647 | .#####.##. 648 | 649 | Tile 2591: 650 | .###...##. 651 | .###....## 652 | ###...#.## 653 | ..##.....# 654 | ........## 655 | .........# 656 | #..#..#..# 657 | ..#.....## 658 | ..#.#..##. 659 | #########. 660 | 661 | Tile 3571: 662 | ##.......# 663 | ....#..... 664 | ##.##..#.. 665 | .#...#...# 666 | ...##..### 667 | ##.##...## 668 | .....#.#.. 669 | ...##.#... 670 | #..##.#... 671 | #..#..#.#. 672 | 673 | Tile 3203: 674 | .#...#.### 675 | .#.#.#...# 676 | .#......## 677 | #.#..#..#. 678 | ##.##.#.#. 679 | .#..#.#... 680 | ...##..... 681 | .#..#..### 682 | #.##....## 683 | #.#...###. 684 | 685 | Tile 3739: 686 | #...##.#.# 687 | ...##..#.# 688 | ..#....... 689 | ##........ 690 | ##......#. 691 | #....#.##. 692 | .#..####.. 693 | ...#...#.# 694 | .....##..# 695 | #..####... 696 | 697 | Tile 3109: 698 | ...####..# 699 | #.#..#...# 700 | ..#....#.# 701 | ##.#.....# 702 | #....#.#.. 703 | ..#.....## 704 | .....#.#.. 705 | ...##....# 706 | .#.....#.# 707 | .#....#.#. 708 | 709 | Tile 3019: 710 | ##.##..### 711 | .#.....#.# 712 | .#....#..# 713 | #.#.#....# 714 | ....#..... 715 | #.....#... 716 | ...#.#.... 717 | ####.##.## 718 | ....#..... 719 | ##.....### 720 | 721 | Tile 3467: 722 | #.#####.#. 723 | #...#....# 724 | .....###.. 725 | .#.#.##.## 726 | #...#...#. 727 | ....##...# 728 | .#..#..... 729 | #...#...## 730 | ....##...# 731 | .#...#.#.# 732 | 733 | Tile 3709: 734 | .#..#.##.. 735 | ..#....... 736 | #.....#... 737 | ..##..#... 738 | ...#...### 739 | #.....#### 740 | #..#.....# 741 | #...#..#.. 742 | #..#.....# 743 | ##.#.#..#. 744 | 745 | Tile 2843: 746 | #...#..#.# 747 | ##.##.#... 748 | ....#..... 749 | #...#...## 750 | #......#.. 751 | #.#......# 752 | #.....###. 753 | #.#......# 754 | ...##..... 755 | #.###.#... 756 | 757 | Tile 3061: 758 | #...#.##.# 759 | #..#....## 760 | ..#.....## 761 | .#.#..#..# 762 | #......#.. 763 | ##....#..# 764 | ##.#.....# 765 | .....#.##. 766 | .#.##.#..# 767 | ##.##.#..# 768 | 769 | Tile 2731: 770 | ..#....##. 771 | .#..##.... 772 | ##.....#.# 773 | ........#. 774 | .#.......# 775 | #...#..... 776 | #..#...... 777 | .#..#####. 778 | #..###.#.# 779 | ##.####### 780 | 781 | Tile 1291: 782 | ###...##.. 783 | ....#....# 784 | ..#.##.### 785 | ##....##.. 786 | ...#.#...# 787 | #..#.#...# 788 | ##..#.#... 789 | #..#..##.# 790 | .....#..#. 791 | ###.#..#.. 792 | 793 | Tile 1237: 794 | ...#...#.. 795 | #####..... 796 | ....#....# 797 | #.#..##... 798 | ...##....# 799 | #.#......# 800 | .##....... 801 | .##.....## 802 | .....##.## 803 | ##.#.#.#.# 804 | 805 | Tile 2797: 806 | .#..#.##.# 807 | .####....# 808 | ####.....# 809 | #.##...#.. 810 | #...#...## 811 | ...#.....# 812 | ...###.... 813 | .#....#..# 814 | .........# 815 | .###.#.#.. 816 | 817 | Tile 3209: 818 | ##..##.### 819 | .......### 820 | ##.....#.# 821 | #.#.....#. 822 | .#...#...# 823 | #...###.## 824 | .#..##..## 825 | ....#.###. 826 | ..#...#### 827 | .#####..#. 828 | 829 | Tile 2657: 830 | ##..##.#.# 831 | ....#.#... 832 | ....#.#... 833 | ..##..##.# 834 | .##...#### 835 | .#.#.##..# 836 | .......... 837 | #........# 838 | .......### 839 | .##...#..# 840 | 841 | Tile 2903: 842 | #.#.###### 843 | .###..#... 844 | ..##...#.# 845 | ...#...... 846 | ..#.....## 847 | .#....#... 848 | .#..#...#. 849 | ##..##...# 850 | #.#......# 851 | ..###.##.# 852 | 853 | Tile 1361: 854 | ..#.##.#.# 855 | .#...#...# 856 | ...#...#.. 857 | ....#...#. 858 | ...#.#.#.# 859 | ...#..#... 860 | .#.##.##.# 861 | .......... 862 | ##.#...### 863 | ...#..#.#. 864 | 865 | Tile 3863: 866 | ...#....## 867 | ...##...#. 868 | .......### 869 | ....#..... 870 | ...##...#. 871 | ##.....#.. 872 | #.......## 873 | .......#.# 874 | .....#.#.# 875 | ..#..####. 876 | 877 | Tile 1013: 878 | ....#..... 879 | #.##.##... 880 | #..##.#... 881 | #....#.... 882 | ####...### 883 | .........# 884 | ..#.....#. 885 | #..#.#.... 886 | ...###.#.# 887 | .##...#### 888 | 889 | Tile 2267: 890 | #......#.. 891 | #.#####... 892 | ####....#. 893 | #...#..... 894 | #...#...#. 895 | ..#.###..# 896 | ..#....... 897 | ..#..#...# 898 | #.##.##... 899 | .#...#.... 900 | 901 | Tile 3581: 902 | #..#.#.### 903 | ...###.#.# 904 | .........# 905 | #..#....## 906 | ........#. 907 | ...#.#.... 908 | ......#.## 909 | ##..#..#.. 910 | ...#.###.# 911 | ###..##.## 912 | 913 | Tile 3797: 914 | ...##.#..# 915 | .....#.#.. 916 | .....#...# 917 | #.....#.## 918 | ##....##.# 919 | #.....#... 920 | #..#..##.. 921 | #.....#.## 922 | #.#...###. 923 | ..#.##..#. 924 | 925 | Tile 2521: 926 | #.#.###.#. 927 | .#.....#.# 928 | #...#..... 929 | ..#....... 930 | .#.....#.. 931 | #.###.#... 932 | #....##... 933 | .#....##.. 934 | ..#.#.#.#. 935 | ##.#.#..## 936 | 937 | Tile 2927: 938 | ..###..#.. 939 | #...#..... 940 | #.##.#.... 941 | ##....#.#. 942 | #.#...##.# 943 | ###....### 944 | #...#....# 945 | ..#.#.#.## 946 | ..#......# 947 | ...#.##... 948 | 949 | Tile 3499: 950 | ##..###.## 951 | #.#.#...## 952 | ....#..... 953 | ....#.#... 954 | ...#.#.#.# 955 | .....##.#. 956 | .....#.#.. 957 | ...#.###.# 958 | ......#.#. 959 | ..#.#####. 960 | 961 | Tile 2053: 962 | .#.##.##.. 963 | ###.##.#.. 964 | #.#####..# 965 | ....#..... 966 | #..##.#..# 967 | .#...#...# 968 | ....##...# 969 | #.....#... 970 | ###..##... 971 | .#.#...##. 972 | 973 | Tile 1033: 974 | ######.#.. 975 | #...##...# 976 | #.....#.#. 977 | #.#.#....# 978 | ...#...#.# 979 | ###..#...# 980 | .#..#...#. 981 | ...##.#..# 982 | ....#.#... 983 | .#..###.#. 984 | 985 | Tile 1109: 986 | ###.#.#..# 987 | ##..##.... 988 | .....#..#. 989 | #....#..## 990 | .#.#.##..# 991 | #...###..# 992 | #...#..... 993 | ###.##...# 994 | #.#.#.#... 995 | ####..#.#. 996 | 997 | Tile 2333: 998 | ##.#.#..#. 999 | #..##...## 1000 | .....##..# 1001 | .#.##..#.. 1002 | .##.#.#### 1003 | ...#..##.# 1004 | .........# 1005 | ###..#.... 1006 | #.#...##.# 1007 | #...####.. 1008 | 1009 | Tile 2713: 1010 | .###.####. 1011 | ...#...#.# 1012 | ....#...## 1013 | #..#...#.# 1014 | #.#....... 1015 | ....###.#. 1016 | ##.#...#.# 1017 | #..##.#..# 1018 | #.#.#..... 1019 | ..#.##.#.# 1020 | 1021 | Tile 2141: 1022 | #####..#.. 1023 | ..#..#.... 1024 | #.......#. 1025 | .#......#. 1026 | #...##.... 1027 | ......##.# 1028 | #.#...#..# 1029 | .#......## 1030 | ...#....## 1031 | ##....#.#. 1032 | 1033 | Tile 3607: 1034 | ...#.##..# 1035 | #......##. 1036 | .##.##.#.# 1037 | ..##....## 1038 | ...##..### 1039 | ...#...... 1040 | ...#..#.## 1041 | ##..#...#. 1042 | .#.#..#.## 1043 | .#..#.#.#. 1044 | 1045 | Tile 3691: 1046 | .#.####..# 1047 | ###..#..#. 1048 | ...#...... 1049 | #..#...#.# 1050 | #..#..#..# 1051 | ..#.#....# 1052 | #.#......# 1053 | ....#....# 1054 | #....##..# 1055 | .#..##.### 1056 | 1057 | Tile 2237: 1058 | #.#.#...#. 1059 | #.#.##.... 1060 | .#..##...# 1061 | ...#..#..# 1062 | .#.....#.. 1063 | ##..###... 1064 | .#..#..#.. 1065 | #.###..... 1066 | .#..#....# 1067 | .#.#.###.. 1068 | 1069 | Tile 1483: 1070 | ...####.## 1071 | #....###.. 1072 | ....#.#..# 1073 | .###...... 1074 | #..#.#.#.. 1075 | .#...#.... 1076 | .#.......# 1077 | .#..#..#.. 1078 | #.#..###.# 1079 | #...####.. 1080 | 1081 | Tile 1697: 1082 | .#.####... 1083 | ......#.## 1084 | .......##. 1085 | ##.##.##.. 1086 | ..##..#.## 1087 | ##.##....# 1088 | #..#.#..## 1089 | ...#....#. 1090 | ..##...#.. 1091 | .###.####. 1092 | 1093 | Tile 1949: 1094 | ...#.##..# 1095 | #....#.... 1096 | .........# 1097 | ..#..#...# 1098 | .......... 1099 | ...#....#. 1100 | #.#.#....# 1101 | .###....#. 1102 | ##..#.###. 1103 | ..#.#..... 1104 | 1105 | Tile 2269: 1106 | .#...##... 1107 | .##...#... 1108 | .#.......# 1109 | .#.#...#.. 1110 | .#.##.#... 1111 | #..####### 1112 | ##.#.#...# 1113 | ###....... 1114 | .....#.#.. 1115 | .##.#.##.. 1116 | 1117 | Tile 1097: 1118 | .##..##.#. 1119 | .#........ 1120 | ....#...## 1121 | #...#....# 1122 | ....#....# 1123 | ......#..# 1124 | ..####.... 1125 | #..#..#..# 1126 | #.#..##..# 1127 | .....##... 1128 | 1129 | Tile 1307: 1130 | #.#..##..# 1131 | ##..#..#.. 1132 | #.#..##..# 1133 | ..#......# 1134 | #.#..##..# 1135 | #..#.#.#.. 1136 | ..#.#.#..# 1137 | ......#..# 1138 | ##.......# 1139 | ####.###.. 1140 | 1141 | Tile 3323: 1142 | ..##.##..# 1143 | ##....#### 1144 | ##.....### 1145 | ..#......# 1146 | .#.#.#..#. 1147 | #......#.# 1148 | ......##.# 1149 | ..##..##.# 1150 | ##........ 1151 | ...#..#..# 1152 | 1153 | Tile 2467: 1154 | .#####.#.. 1155 | ...#....## 1156 | #...###... 1157 | ##........ 1158 | .........# 1159 | ....#....# 1160 | .#.#..#.#. 1161 | ...#.....# 1162 | #...##..## 1163 | ...#.###.. 1164 | 1165 | Tile 2389: 1166 | ..##.#...# 1167 | ....#....# 1168 | ..##.###.. 1169 | .###...### 1170 | #.#.....#. 1171 | ......##.. 1172 | ..#.#...## 1173 | #....#.#.# 1174 | .......#.. 1175 | #..#..#.## 1176 | 1177 | Tile 2633: 1178 | ####...#.. 1179 | .#..#..#.# 1180 | #.#.#.#..# 1181 | .##.#...## 1182 | ...#....## 1183 | ##.#.#...# 1184 | #####...## 1185 | #....###.# 1186 | #.....#... 1187 | .##.##.#.. 1188 | 1189 | Tile 2473: 1190 | ...##...## 1191 | ....#.#..# 1192 | ..####.#.# 1193 | ..#.#..#.. 1194 | #...#...#. 1195 | ...#....## 1196 | #.#.....## 1197 | .....#.... 1198 | #..#..##.# 1199 | .#.###.... 1200 | 1201 | Tile 2243: 1202 | .#.##.#.#. 1203 | ......#.#. 1204 | .#.......# 1205 | #.#..#...# 1206 | ....#..#.# 1207 | .##..#.#.. 1208 | .#....#..# 1209 | .....#...# 1210 | ##.......# 1211 | ..##.#..## 1212 | 1213 | Tile 3547: 1214 | ####.###.# 1215 | #...#....# 1216 | #...#.#..# 1217 | .#.....#.# 1218 | ##.....### 1219 | .....###.. 1220 | .....#..## 1221 | #..#.....# 1222 | ..#...#..# 1223 | .######### 1224 | 1225 | Tile 2837: 1226 | #.##.#...# 1227 | #.#..#...# 1228 | ..#......# 1229 | #..###.#.# 1230 | ##.......# 1231 | #.#......# 1232 | #......##. 1233 | #..##.#.## 1234 | #.#....... 1235 | ###.#.#.#. 1236 | 1237 | Tile 3727: 1238 | .###.#...# 1239 | ..#..#.#.. 1240 | .#..#....# 1241 | ...#...#.# 1242 | ####...... 1243 | .#...#..## 1244 | ##.....### 1245 | .....#...# 1246 | ....###.#. 1247 | ..#..#.... 1248 | 1249 | Tile 3391: 1250 | .##..###.. 1251 | ####..##.# 1252 | #...##.... 1253 | .#...#..## 1254 | ......#... 1255 | #.##.#.#.# 1256 | ..#.#..... 1257 | ..#.#....# 1258 | #......... 1259 | ...##.##.. 1260 | 1261 | Tile 3529: 1262 | .#.###..#. 1263 | ##.##..... 1264 | ..#.....#. 1265 | #...###..# 1266 | #.#.#....# 1267 | .#.#.##... 1268 | ###..#...# 1269 | .#..#...#. 1270 | ...##..#.# 1271 | .#.#..#### 1272 | 1273 | Tile 3181: 1274 | .#.#####.. 1275 | #..#..#... 1276 | #..#..##.. 1277 | #.#.....## 1278 | ##....##.. 1279 | .#.....### 1280 | ..##....## 1281 | #.#......# 1282 | ....##.... 1283 | ###.##...# 1284 | 1285 | Tile 1429: 1286 | ..######## 1287 | #..##.#... 1288 | ...#.#..## 1289 | ..#......# 1290 | .....#.... 1291 | #......#.. 1292 | #....#.#.. 1293 | .#...#..#. 1294 | #....#..#. 1295 | ..###...#. 1296 | 1297 | Tile 3907: 1298 | ##....##.. 1299 | ..#.#.##.# 1300 | .###....## 1301 | ....#..#.# 1302 | #.##...... 1303 | ...#...... 1304 | ###...#.## 1305 | ...##....# 1306 | ..#.#...#. 1307 | ##.#.#.#.. 1308 | 1309 | Tile 2609: 1310 | ..##.##... 1311 | #.##...### 1312 | .#.......# 1313 | .#........ 1314 | #.##.##.## 1315 | ...#....#. 1316 | ........#. 1317 | ......##.# 1318 | ####...... 1319 | #.#...#### 1320 | 1321 | Tile 1597: 1322 | ##....##.# 1323 | #..#...### 1324 | .##......# 1325 | #.#...##.. 1326 | ......#### 1327 | #..#.....# 1328 | ...#...#.. 1329 | ##...#.... 1330 | ##........ 1331 | .#.#..##.. 1332 | 1333 | Tile 1567: 1334 | #.#.##.... 1335 | ........#. 1336 | #......#.. 1337 | ......#... 1338 | ##.....#.# 1339 | #...##.... 1340 | #........# 1341 | #...##...# 1342 | .#...#.#.. 1343 | ..##.#..## 1344 | 1345 | Tile 3671: 1346 | .###..#### 1347 | #..#..##.. 1348 | #....#...# 1349 | ..##.#...# 1350 | ##...#...# 1351 | #..###...# 1352 | #..#.#..## 1353 | .......... 1354 | .........# 1355 | ###..#..## 1356 | 1357 | Tile 2909: 1358 | #...###### 1359 | #..#.#.... 1360 | .#...#..## 1361 | ...##..#.# 1362 | ....#.#... 1363 | #.##..#.## 1364 | ##.......# 1365 | ##.#...... 1366 | #.......## 1367 | .#..#.#..# 1368 | 1369 | Tile 2297: 1370 | ...#.#.... 1371 | .#......#. 1372 | ###...##.. 1373 | .###.....# 1374 | ##.#.#.... 1375 | ..#....... 1376 | #......#.. 1377 | ##......#. 1378 | .#........ 1379 | #..#.####. 1380 | 1381 | Tile 2129: 1382 | #......... 1383 | ..#.#....# 1384 | ##.......# 1385 | #........# 1386 | ...#.#.#.# 1387 | #........# 1388 | .#.#.#...# 1389 | ...##.##.. 1390 | #......... 1391 | ##.#.###.# 1392 | 1393 | Tile 2383: 1394 | ##...#..## 1395 | ##.###.... 1396 | ..#...#..# 1397 | ##........ 1398 | ....#.#.#. 1399 | #.#....#.. 1400 | ...#.....# 1401 | ##..##.#.. 1402 | .....##.## 1403 | ##..##..#. 1404 | 1405 | Tile 1327: 1406 | .#.##..##. 1407 | ##.....#.# 1408 | #..#.#.... 1409 | ........## 1410 | ..#....... 1411 | #.......#. 1412 | #..#...#.# 1413 | #.#...#... 1414 | #.#....... 1415 | ...###.#.. 1416 | 1417 | Tile 3313: 1418 | #.#.....#. 1419 | #...#.#... 1420 | .....###.. 1421 | .....#.... 1422 | ......#..# 1423 | #........# 1424 | .#.......# 1425 | #...#.#... 1426 | .....#..#. 1427 | ####....#. 1428 | 1429 | Tile 3041: 1430 | ##..#.#.## 1431 | #.......#. 1432 | #.#.#.#... 1433 | .#.##..##. 1434 | #..#...... 1435 | ..##..###. 1436 | #.##....## 1437 | #.....#... 1438 | ..#....... 1439 | .......##. 1440 | 1441 | Tile 1951: 1442 | #..##.###. 1443 | .#..#.##.# 1444 | ###.....#. 1445 | #.#....... 1446 | ##....##.# 1447 | #.....#.## 1448 | ........#. 1449 | .#.....#.# 1450 | .###.....# 1451 | ..#...##.. 1452 | 1453 | Tile 1861: 1454 | .##..#..## 1455 | #..#.#...# 1456 | ..#.#..... 1457 | ......#... 1458 | .......#.# 1459 | #.#...#..# 1460 | .#...#..## 1461 | #.#....... 1462 | #..##.##.. 1463 | .......##. 1464 | 1465 | Tile 3361: 1466 | ####.##.## 1467 | ##.#.##... 1468 | .........# 1469 | #.....#... 1470 | ##....#.#. 1471 | ..#......# 1472 | .#.#....## 1473 | ##.#.#.#.. 1474 | ......#... 1475 | .....#.##. 1476 | 1477 | Tile 3449: 1478 | ..##.#.#.. 1479 | #..#...#.. 1480 | .....##... 1481 | #........# 1482 | .......##. 1483 | .##.#....# 1484 | #..##..#.# 1485 | ........#. 1486 | .........# 1487 | #.#..#...# 1488 | 1489 | Tile 3217: 1490 | #..#...#.. 1491 | #..#.#.#.# 1492 | .......#.. 1493 | #....#..#. 1494 | #........# 1495 | #...#...#. 1496 | ##...#...# 1497 | .##....... 1498 | ##........ 1499 | ...#.##.#. 1500 | 1501 | Tile 3187: 1502 | ...#.###.. 1503 | ..#.##.### 1504 | #.#....... 1505 | #..##..#.. 1506 | #.##....## 1507 | #.###.#### 1508 | ...#.#.... 1509 | .......... 1510 | #......... 1511 | .##....#.# 1512 | 1513 | Tile 3719: 1514 | .####.#.## 1515 | .#...#...# 1516 | ##....###. 1517 | #.##..#... 1518 | ....##...# 1519 | ..#.#.##.# 1520 | .......#.. 1521 | .....##.## 1522 | #.....##.# 1523 | #.##.#..#. 1524 | 1525 | Tile 3967: 1526 | .#..#.#.#. 1527 | #.#.#....# 1528 | .#....#... 1529 | #.....#... 1530 | .......#.. 1531 | #......... 1532 | .#..#..... 1533 | #..#...... 1534 | ..#..#.### 1535 | ...####.## 1536 | 1537 | Tile 1373: 1538 | ...#.##.## 1539 | #.......## 1540 | ##........ 1541 | ......###. 1542 | #....#...# 1543 | ...#...#.. 1544 | #.#.###... 1545 | #.#.....## 1546 | #...#....# 1547 | ...#.#...# 1548 | 1549 | Tile 2833: 1550 | ...#.#...# 1551 | ...#..#..# 1552 | .##.#.##.. 1553 | #..#...#.# 1554 | ##.##.#... 1555 | .......... 1556 | ....#..#.. 1557 | #.#..##..# 1558 | #......#.. 1559 | ..##..###. 1560 | 1561 | Tile 2543: 1562 | #.#..#.... 1563 | .........# 1564 | ...#....## 1565 | ..#......# 1566 | ...#.#.... 1567 | #....#.#.. 1568 | #.....##.# 1569 | #..#...### 1570 | ###.....## 1571 | ###.##...# 1572 | 1573 | Tile 3389: 1574 | ......###. 1575 | #.###.##.. 1576 | ..##.....# 1577 | #.#..#..#. 1578 | ##....#.#. 1579 | ##.#...#.# 1580 | .##.....#. 1581 | .#.#...#.. 1582 | #..##..#.. 1583 | #####.#... 1584 | 1585 | Tile 2039: 1586 | ....##...# 1587 | #......##. 1588 | .##....#.. 1589 | #.....#..# 1590 | #####...#. 1591 | #..##...## 1592 | .....##.## 1593 | #..#.##..# 1594 | #..####.#. 1595 | #.#.###.#. 1596 | 1597 | Tile 3701: 1598 | ########.. 1599 | #....#...# 1600 | #..#..#.## 1601 | #......#.. 1602 | .....####. 1603 | #.....#..# 1604 | #......... 1605 | ...#.#.#.. 1606 | ......#.#. 1607 | #####.###. 1608 | 1609 | Tile 3407: 1610 | #...##.#.. 1611 | ##.###..## 1612 | #.#..#..#. 1613 | .#..#..... 1614 | ..##.....# 1615 | #..##..... 1616 | #...#..#.# 1617 | .....#.#.# 1618 | .#.#...... 1619 | ##.#.##.#. 1620 | 1621 | Tile 3793: 1622 | .##.####.# 1623 | .#.#.#...# 1624 | .#...#.#.# 1625 | #...#.#.## 1626 | .#....#.#. 1627 | ..#..#...# 1628 | .##....... 1629 | .##.....## 1630 | ##..##.... 1631 | ....##.##. 1632 | 1633 | Tile 2851: 1634 | ....#####. 1635 | ......##.. 1636 | ..#.....#. 1637 | #.....#..# 1638 | ###...#### 1639 | #......... 1640 | #..##...## 1641 | #..###..## 1642 | #.###.#.## 1643 | ####..##.. 1644 | 1645 | Tile 1913: 1646 | ##.#.#...# 1647 | .....#.#.. 1648 | #...#.##.# 1649 | .#...###.. 1650 | ...##..... 1651 | .#.#.#.### 1652 | .#.#...... 1653 | ......#... 1654 | .#...#...# 1655 | ..#.#.#..# 1656 | 1657 | Tile 3457: 1658 | #.#.#.##.# 1659 | .#..#...#. 1660 | .###..#..# 1661 | #.#....#.# 1662 | .#.....##. 1663 | ....#..#.. 1664 | ..#...##.# 1665 | ##........ 1666 | ###....#.. 1667 | ...#..##.# 1668 | 1669 | Tile 2969: 1670 | ##.#..#### 1671 | ####...##. 1672 | ......#... 1673 | ..##..#.## 1674 | ..#....#.# 1675 | ..#..#..#. 1676 | #......#.. 1677 | .....#..## 1678 | #.#....... 1679 | .#...#.##. 1680 | 1681 | Tile 1303: 1682 | ##.#.##### 1683 | ..##.##..# 1684 | ....#..#.# 1685 | ##........ 1686 | #..#....#. 1687 | ..##..#.## 1688 | ..##...##. 1689 | #...#..... 1690 | ..###..#.. 1691 | ..##.#.### 1692 | 1693 | Tile 1279: 1694 | .##.#.#... 1695 | .....##.#. 1696 | #..#.....# 1697 | .....#..#. 1698 | ....##.#.. 1699 | ........#. 1700 | #....#.... 1701 | #...#....# 1702 | #......#.# 1703 | .####...#. 1704 | 1705 | Tile 3593: 1706 | #...##.#.# 1707 | ..#.....## 1708 | ##..#....# 1709 | ....#.#... 1710 | ..#....... 1711 | .#.#...#.. 1712 | ..#....#.# 1713 | ..##.....# 1714 | .#...#.... 1715 | ..#####.#. 1716 | 1717 | Tile 1231: 1718 | .#.###..## 1719 | #...##.#.# 1720 | ..#....#.. 1721 | #........# 1722 | ..##..#.#. 1723 | #........# 1724 | ........#. 1725 | #.......#. 1726 | #.#.#..#.. 1727 | .#....###. 1728 | 1729 | -------------------------------------------------------------------------------- /20/main.nim: -------------------------------------------------------------------------------- 1 | import npeg, tables, strutils, sequtils, math, sets 2 | 3 | type 4 | Tile = object 5 | id: int 6 | edges: HashSet[string] 7 | used: bool 8 | rows: seq[string] 9 | neighbours: int 10 | 11 | proc calcEdges(rows: seq[string]): seq[string] = 12 | result.setlen 8 13 | for i in 0..9: 14 | let j = 9-i 15 | result[0].add rows[0][i] 16 | result[1].add rows[9][i] 17 | result[2].add rows[i][0] 18 | result[3].add rows[i][9] 19 | result[4].add rows[0][j] 20 | result[5].add rows[9][j] 21 | result[6].add rows[j][0] 22 | result[7].add rows[j][9] 23 | 24 | var tiles: seq[Tile] 25 | var rows: seq[string] 26 | 27 | let p = peg input: 28 | input <- +tile * !1 29 | tile <- header * '\n' * +row * '\n': 30 | tiles.add Tile(id: parseInt($1), edges: calcEdges(rows).toSet, rows: rows) 31 | rows.reset 32 | header <- "Tile " * >+Digit * ':' 33 | row <- >+{'#','.'} * '\n': 34 | rows.add $1 35 | 36 | if p.matchFile("input").ok: 37 | for t1 in tiles.mItems: 38 | for t2 in tiles: 39 | if t1 != t2: 40 | t1.neighbours += card(t1.edges * t2.edges) 41 | echo tiles.filterIt(it.neighbours == 4).mapIt(it.id).prod() 42 | -------------------------------------------------------------------------------- /21/input: -------------------------------------------------------------------------------- 1 | gjqt bxfbb dcqtc xbbcnx bsjqq zzjt svzg gnrpml pmm shh vmhqr fgngbms tbmn djdgk mlmf snxvqf fnks cqkrlq zchcj vfvtj rdffqv mkrf xgftsb xrmxxvn txrjf vqxtr rxqd sqsmc qjcn spmsczc vqjct fhcpkt lvn vcpk mlxh xfhbfvp vrxp zjptr shltgt vmftt mhbxmfq jzs bgclkbpr lcpkxl lnjrvsz lhpgn nd xvn rfqqg mnjlf hhst vs fxbx jpfq ptjhk pnm vdgj dcj nvfkp zhtq xqvz hvllxq rdfr qxfzc jcb vtrf jxh pqxx vtrqn xntpv dcxncsm vjqr bfncxv frbq hkhkjm khpdjv ldgs nkff bdvkpj vgbz cbmvcj (contains peanuts) 2 | rszfj qblrk lnjrvsz qfffx shh ttrjb bdvkpj lmfr jpb rgx jxxgtl qxfzc mlxh vrxp jxh fhcpkt rdfr spmsczc gnrpml xrmxxvn jncbh hvllxq vspsdz zbjjnvn qtz jpfq nd khpdjv xgftsb pbpgl xhqh vdgj qjkng lrlgmm nvfkp pxjhvr bxfbb ffgkmhh lpgvh nhqljxg xcx dltgm snxvqf ljgmg vmhqr gnvg vmftt vqxtr (contains peanuts, nuts, dairy) 3 | xrmxxvn cqkrlq mlmf gnrpml dcqkt rdfr jxxgtl xgftsb bksvfq vs kpmnz pxjhvr rfmvh jpb vmhqr szztlx vdgj lkbnjx lpxc qjcn qjkng ctbjc qblrk fxbx rpsnkz xrqrlb ldgs jxh lpgvh mlxh shh zbjjnvn hqmkj lnjrvsz vqxtr zjptr qfffx rlqgq qvtfr frbq txrjf vmftt bdvkpj dcqtc vfvtj lxcxp jncbh vrxp xcx gknhqs knhvxg hfkxc nvfkp tbmn vspsdz ltrzm jndzl prdtb tpgtm qxfzc nktph jpfq pnm kjhdl vgldq qslbqf djdgk xntpv ttrjb qmzn thgljm znrb nd gjqt (contains eggs) 4 | qjcn rmhh dcj hvllxq czn ffgkmhh rdfr mlmf rfmvh jncbh qdtfkcls vgldq gnrpml snxvqf shh rbcp bgclkbpr rzddk qfnhsjj dlr cmzz xqvz jxh fnks lhpgn vmhqr ntqss tzkf nktph mnjlf frbq txrjf qxfzc pkmbb qtz dltgm bsjqq qblrk lmfr xrmxxvn cbmvcj vdgj rlqgq kfttq tdmfz ttrjb bxfbb tbmn qvtfr vjqr pnm rszfj lvn fhcpkt xbbcnx sqsmc nd nxs xcx qgvhn rxvc (contains nuts, sesame, wheat) 5 | zqrg tbmn kjhdl vqjct vtrqn xqvz dclkt vqxtr zdrptcx bgfc ffgkmhh rfmvh nktph vrjh lhpgn vdgj kdxs rdffqv jpb lmfr nd jxxgtl tdmfz bsjqq jpfq qslbqf rfqqg gjqt shltgt gksqg jzs ljgmg vxcdsr dcj cqkrlq jxh gckzr qgvhn zzjt xrmxxvn vcpk mltp lcpkxl gnrpml bfncxv dcqkt cpcxj spmsczc rzddk qjcn rdfr gknhqs qxfzc qvtfr gbxsxs pgkm txrjf vs tppnl bkls svzg pxctl ptjhk khpdjv zhtq qfnhsjj tdvzl jcb lxcxp xhqh qblrk pqxx bxfbb lpxc dcqtc (contains fish, wheat) 6 | xrmxxvn pxjhvr vjqr bvvkd gnrpml jndzl bcpks vqjct dcqkt vgbz rdfr hrxjrg lmfr gjqt sqsmc xfhbfvp qgvhn rxvc hfkxc mfqrl mlxh rgx ljgmg fnks szztlx lpgvh tzkf jxh rszfj rxqd qxfzc qjkng skzxjnc vmftt dclkt vmhqr bsjqq zhtq vfvtj jncbh vspsdz qtz mrffh plpl rfmvh gknhqs (contains dairy) 7 | vfvtj dvd svzg dbvqq fhcpkt lkbnjx rfmvh vqjct gbxsxs gckzr mhbxmfq gnrpml pbpgl mltp qslbqf jvcjhg sqsmc hqmkj jzs mrffh rdfr gnvg tbmn xcx vmhqr czn nd bsjqq bgclkbpr rpsnkz lxcxp rxvc vqxtr fgngbms ntqss xfhbfvp tkg khpdjv vs jrr dclkt cddpfxx hvllxq xrmxxvn rgx lpgvh mlmf flr ctbjc bkls rrtlfh cpcxj xqvz zhtq tpgtm jxh vjqr pxjgxr bxfbb shrnc zdrptcx dcxncsm jpfq gxlzr mnjlf (contains wheat, soy) 8 | pkmbb qkggr plpl tpgtm mkrf hrxjrg szztlx mfqrl qgvhn rzddk gbxsxs fgngbms xcx xhqh rxvc rpsnkz lkbnjx zjptr cqkrlq spmsczc nvfkp pnm rblnlnk nktph khpdjv bqt shrnc mzdlxl dclkt jvcjhg jxxgtl vcpk vtrf vdgj lmfr rmhh rfmvh gnrpml bxfbb hhst xrmxxvn tzkf jpfq dcqkt bvvkd fxbk vs rdfr gknhqs nkff hfkxc djmfxp pbpgl jcb shltgt tlrpk hvllxq rbcp qxfzc zchcj dltgm gpg cbmvcj mlmf dbvqq dcxncsm shh vqjct vmhqr ltrzm nnsnh qmzn tkg fnks vjqr tdmfz vgldq (contains sesame, dairy, peanuts) 9 | rdffqv mrffh thgljm dcxncsm qkggr qblrk dcqtc bgclkbpr nxs tppnl hkhkjm gpg tpgtm xfhbfvp nktph bqt qslbqf ldgs jxxgtl qfnhsjj jxh lkbnjx xrmxxvn qxfzc khpdjv dcj knhvxg pxjhvr djmfxp gksqg vmftt sqsmc jncbh hfkxc fnks gnrpml pxjgxr zhtq txrjf mhbxmfq rgx lhpgn vspsdz vqjct svzg qfffx frbq lrlgmm nkff zhxvv vqxtr ptjhk bdvkpj vgldq nhqljxg xrqrlb cmzz dltgm rpsnkz bfncxv flr fgngbms tkg fxbk cqkrlq qgvhn qdtfkcls rdfr rfmvh xcx gnvg snxvqf kpmnz tdmfz mltp (contains wheat, nuts) 10 | hkhkjm rfmvh dbvqq fxbx bgfc gbxsxs vmhqr lkbnjx hvllxq pbpgl rxqd frbq vjqr bxfbb ffgkmhh ctbjc xqvz bdvkpj mlmf rmhh lhpgn rzddk cpcxj jpfq vfvtj rpsnkz dltgm vgbz bpkh svzg gnrpml fxbk vrjh czn vrxp vspsdz gckzr szztlx shrnc hrxjrg lmfr pxctl bcpks xvn nd ldgs ldpkn xfhbfvp mfqrl qgvhn khpdjv pnm xrmxxvn nktph mnjlf mrffh rdfr rblnlnk kdxs sqsmc gpg prdtb mhbxmfq bgclkbpr gjqt kpmnz ttrjb vgldq pkmbb shltgt dlr tdmfz nhqljxg zhxvv zhtq jxh thgljm gnvg dvd fsfhp vs rlqgq (contains peanuts) 11 | djdgk jpb vmhqr tbmn vgldq vtrqn lrlgmm lhpgn rlqgq rblnlnk xntpv mrffh dltgm zchcj xrqrlb kfttq rxvc rdfr qmzn qblrk gxlzr fxbx bxfbb lxcxp xrmxxvn qfffx khpdjv plpl tdmfz qslbqf pxjhvr lpxc pbpgl mkrf gksqg vqxtr zhtq jzs dlr dbvqq bcpks cddpfxx hkhkjm gnrpml qtz rzddk mnjlf qgvhn bpkh hhnxvg jxh pgkm pkmbb frbq pmm dcxncsm vs jpfq nhqljxg xfhbfvp cqkrlq mhbxmfq qjkng qxfzc rrtlfh qvtfr djmfxp zhxvv jndzl xbbcnx (contains eggs, soy) 12 | rxvc fgngbms jxh plpl qxfzc vtrqn qjcn lkbnjx mlxh ntqss xvn nnsnh tbmn gxlzr rdfr dcqtc xfhbfvp dlr txrjf gnrpml rfmvh vdgj rdffqv ldgs jpfq rmhh gpg hhnxvg dclkt vxcdsr vmhqr cddpfxx vspsdz jndzl qgvhn zchcj ldpkn sqsmc zqrg mlmf bgclkbpr rxqd lmfr rgx nxs snxvqf nhqljxg dvd jxxgtl qtz tlrpk nvfkp qjkng fxbx qkggr xrmxxvn (contains sesame, nuts) 13 | xrmxxvn jndzl szztlx cpcxj rfmvh rzddk vmhqr sqsmc xhqh zhxvv hqmkj rdfr zzjt xntpv tzkf tdvzl jpfq nd gckzr lpgvh bfncxv lnjrvsz fnks jxh ffnq jxxgtl gxlzr ttrjb shh spmsczc ldpkn hvllxq fhcpkt gnrpml mfqrl dltgm hhnxvg qdtfkcls dbvqq kjhdl thgljm czn vqjct knhvxg dvd rpsnkz rxvc khpdjv vgbz kpmnz lkbnjx (contains nuts, dairy) 14 | fsfhp thgljm jxxgtl xfhbfvp rdfr ldpkn vrxp tpgtm hfkxc rblnlnk jpb rlqgq qxfzc djmfxp dbvqq mhbxmfq gckzr lnjrvsz pgkm bpkh gnrpml vmftt vmhqr rzddk rfmvh pkmbb tzkf tdvzl qvtfr ffgkmhh xgftsb bkls hkhkjm vfvtj skzxjnc mlmf rmhh rdffqv qtz knhvxg vtrqn qblrk ptjhk dcxncsm ntqss fgngbms jvcjhg svzg mzdlxl rrtlfh lkbnjx sqsmc bvvkd xntpv lxcxp mrffh jxh frbq khpdjv nkff fxbk jndzl gksqg hvllxq bgclkbpr qfnhsjj kjhdl jrr nvfkp dvd mfqrl qkggr mnjlf nd bcpks hhnxvg nnsnh vrjh xhqh qmzn (contains wheat, dairy, eggs) 15 | rblnlnk spmsczc tlrpk nxs xntpv hhst mzdlxl lxcxp qkggr dbvqq gnrpml sqsmc bpkh rdfr knhvxg skzxjnc mfqrl rpsnkz lpgvh rlqgq nd tkg hkhkjm bxfbb zchcj zzjt nvfkp dcqkt vfvtj dltgm xrmxxvn vmhqr xbbcnx rszfj lkbnjx mlxh khpdjv fxbk jncbh bcpks qvtfr rfmvh vqxtr rgx pgkm rmhh fnks jcb vgbz cqkrlq lmfr zjptr cpcxj djmfxp kdxs hrxjrg dvd vtrqn kjhdl kfttq qxfzc bkls dlr qfffx xhqh qslbqf flr ptjhk fgngbms gckzr shh (contains soy, eggs, nuts) 16 | bfncxv snxvqf hfkxc prdtb khpdjv pxctl dcj plpl xhqh lmfr tlrpk ptjhk vgbz ffnq mkrf hkhkjm lxcxp gxlzr zhtq dclkt qblrk vspsdz pnm zchcj rfmvh tbmn rxqd rrtlfh hvllxq nktph qfffx rmhh bdvkpj nhqljxg vxcdsr mzdlxl gksqg gbxsxs xqvz vgldq vmhqr mnjlf gnrpml xrmxxvn txrjf ljgmg bkls lrlgmm jndzl rpsnkz jxh thgljm djdgk qxfzc shh dcqkt ntqss (contains fish, nuts, peanuts) 17 | tpgtm qgvhn pnm vmftt rszfj bkls hhnxvg mlxh gksqg ttrjb ljgmg rxqd pxjgxr djmfxp sqsmc tbmn qdtfkcls dcj jvcjhg mlmf czn qxfzc snxvqf hhst vqxtr mkrf fxbk zchcj gnrpml nhqljxg nvfkp tdmfz nnsnh nd shltgt xrmxxvn vtrf bsjqq lvn gknhqs dcqtc qblrk dlr zhxvv jzs shrnc svzg rfmvh dclkt bksvfq rbcp cddpfxx jcb vmhqr jxh dbvqq bgclkbpr skzxjnc rdfr (contains soy) 18 | flr vtrqn mkrf jcb jxh xcx nvfkp lrlgmm pkmbb dcxncsm rxvc vtrf xqvz rzddk vcpk rdfr vmhqr ldpkn tdmfz fsfhp lpxc dbvqq rfmvh zjptr vqjct gnrpml gckzr gnvg khpdjv mltp mnjlf hqmkj lkbnjx rszfj gbxsxs vgbz pmm gksqg vspsdz qfnhsjj mlxh tbmn shltgt lxcxp pqxx ptjhk mzdlxl dvd tppnl bvvkd ltrzm qxfzc nhqljxg (contains dairy, nuts) 19 | rrtlfh nxs xhqh hkhkjm tbmn jzs dltgm bgfc pnm gjqt cqkrlq zhxvv jrr kjhdl vjqr qslbqf khpdjv ctbjc xcx mzdlxl hfkxc vqxtr jvcjhg qmzn jndzl frbq fxbx shrnc zjptr lpgvh vxcdsr qfnhsjj lkbnjx plpl gnrpml fhcpkt pxctl qvtfr qdtfkcls gbxsxs mfqrl rfmvh fnks dbvqq shltgt vfvtj pmm lmfr vtrqn rdfr ntqss zdrptcx lhpgn nhqljxg xgftsb xrqrlb bfncxv kfttq bkls lcpkxl mrffh xrmxxvn bgclkbpr dcqkt szztlx dclkt vmhqr qxfzc snxvqf dcqtc bqt rblnlnk pxjgxr gpg jncbh xntpv kdxs dvd xvn (contains eggs, fish, nuts) 20 | shh dcxncsm vqxtr vxcdsr gjqt zjptr vqjct xntpv zhxvv bsjqq rbcp snxvqf vmhqr rfqqg khpdjv rblnlnk lmfr fnks lkbnjx mltp shrnc mfqrl jpb skzxjnc dcj ntqss gnrpml rlqgq jzs bpkh vjqr cddpfxx jcb lpxc pgkm xrmxxvn rdfr pkmbb dltgm qjkng zbjjnvn xrqrlb rpsnkz gksqg vtrf jrr gpg knhvxg plpl jvcjhg bgfc vdgj tlrpk znrb vmftt tzkf jxh nd xcx lcpkxl fgngbms vspsdz mhbxmfq bxfbb qxfzc thgljm (contains wheat, peanuts) 21 | bvvkd bfncxv qfnhsjj vqxtr lrlgmm rbcp rfmvh tdvzl spmsczc lxcxp lhpgn dcxncsm qdtfkcls rdfr nvfkp vs kpmnz jxh rpsnkz pxctl gckzr zhtq ltrzm qslbqf khpdjv vtrf tlrpk vmhqr rzddk qtz rfqqg hqmkj mzdlxl vxcdsr sqsmc qxfzc bksvfq zjptr qfffx bsjqq bkls fxbx dcqtc hfkxc vcpk qblrk fgngbms jndzl pkmbb lpgvh qjcn fxbk ttrjb zdrptcx lpxc lcpkxl gbxsxs bdvkpj jncbh xvn xfhbfvp gnvg pnm lmfr bqt kjhdl hvllxq xrmxxvn (contains eggs, sesame) 22 | jpb jxh tbmn spmsczc vmhqr zchcj xhqh jvcjhg zhxvv qmzn xntpv vfvtj knhvxg dcxncsm mlmf nvfkp djmfxp sqsmc rdfr bsjqq tdvzl rbcp tpgtm xcx dbvqq ptjhk cqkrlq cbmvcj flr shrnc qslbqf tkg rfmvh ffnq gnrpml lpxc rxvc ltrzm qfffx qxfzc rxqd gksqg khpdjv ttrjb (contains sesame, wheat, dairy) 23 | kpmnz zdrptcx vfvtj rlqgq gbxsxs djdgk rdfr ptjhk nkff gksqg rfqqg tbmn dlr mfqrl qxfzc nxs djmfxp vmhqr dcqtc lhpgn skzxjnc pxjgxr kfttq lmfr fxbk svzg szztlx vqxtr dltgm snxvqf gnrpml kdxs ctbjc ltrzm pkmbb xfhbfvp xrqrlb nktph fsfhp ntqss rfmvh pnm tdmfz nhqljxg vcpk vrxp thgljm xrmxxvn lkbnjx hqmkj flr rxvc nvfkp khpdjv qvtfr vqjct bcpks qdtfkcls vgbz vtrqn (contains sesame) 24 | dclkt zchcj khpdjv rzddk bcpks jzs dlr qdtfkcls pbpgl pnm sqsmc vs nhqljxg xrmxxvn qtz tdmfz nnsnh snxvqf gnrpml qfffx pxjhvr jcb cddpfxx gksqg rdffqv mnjlf rrtlfh gknhqs rfmvh vspsdz zhtq tkg qjkng gbxsxs jxh mhbxmfq fxbx fsfhp fxbk cbmvcj rfqqg nd dvd vqxtr zzjt spmsczc tdvzl hrxjrg ctbjc vmhqr vcpk hhst qmzn frbq qgvhn tbmn lpxc kpmnz rdfr ffnq znrb bvvkd szztlx zdrptcx (contains nuts) 25 | nxs pbpgl qblrk ldpkn jcb svzg dltgm gxlzr lxcxp dcqkt dclkt jxh khpdjv bgfc ljgmg tdvzl vs qfffx hqmkj hvllxq lrlgmm lpxc ptjhk pxctl prdtb lhpgn pxjhvr spmsczc cqkrlq mltp vjqr rgx qkggr gpg mnjlf nvfkp fsfhp xvn dcj vtrf rlqgq vgldq fhcpkt fxbx dcqtc qjcn kpmnz jpb czn thgljm vxcdsr qdtfkcls ldgs frbq vrxp bcpks qjkng xrmxxvn pgkm fgngbms gknhqs ntqss tkg qxfzc rszfj rxvc qvtfr rzddk rfmvh lcpkxl xqvz gnrpml bpkh bqt rdfr jxxgtl lnjrvsz mlmf (contains eggs, soy) 26 | gjqt vfvtj rgx shltgt dvd tpgtm xqvz bfncxv lmfr fnks ltrzm sqsmc qmzn jncbh hkhkjm lvn pxjgxr jndzl qxfzc rxvc tbmn xgftsb gnrpml pbpgl qtz fxbk nkff szztlx rdffqv txrjf bksvfq rdfr mrffh vspsdz gknhqs jxh vmhqr rfmvh xrmxxvn xntpv dbvqq xbbcnx ntqss mltp nnsnh lhpgn tdmfz mkrf rlqgq lpgvh xhqh zchcj tppnl (contains nuts) 27 | xqvz zzjt gxlzr zdrptcx qdtfkcls qblrk hqmkj qxfzc fnks hfkxc vmftt rfmvh pxjgxr rblnlnk gnrpml xcx rxvc mnjlf vrxp bqt fhcpkt dcqkt pbpgl dcxncsm bgclkbpr vmhqr xrmxxvn rdfr tlrpk khpdjv rgx kpmnz mkrf gckzr mrffh fxbx jzs (contains nuts) 28 | pnm mlmf jxh zhtq lmfr hfkxc fxbx bvvkd zhxvv qmzn qxfzc gjqt vdgj lpxc bpkh sqsmc lrlgmm vfvtj vjqr rzddk vmhqr qjkng spmsczc dltgm tkg cpcxj rblnlnk mlxh svzg mnjlf vxcdsr gnrpml khpdjv qblrk rdffqv bsjqq rmhh rgx mhbxmfq bgfc rszfj qslbqf lhpgn pxjgxr lpgvh shh xrmxxvn gckzr kdxs tpgtm snxvqf kjhdl dcxncsm hrxjrg pgkm jzs vspsdz czn djmfxp xrqrlb rfmvh ctbjc lvn jpfq xfhbfvp zdrptcx qdtfkcls bxfbb nvfkp qvtfr pxjhvr (contains fish, wheat) 29 | mrffh prdtb vqxtr pqxx hrxjrg vgbz vmhqr jxh kfttq znrb rfmvh bkls pgkm bdvkpj qxfzc ldgs lnjrvsz pkmbb dcxncsm lpxc jpb shh pxjhvr qmzn lmfr skzxjnc lrlgmm vtrf mlmf bgclkbpr khpdjv gnrpml fnks zqrg ffnq bksvfq ntqss vqjct cmzz gknhqs tpgtm dcqkt vcpk knhvxg hqmkj hkhkjm snxvqf mfqrl tppnl jndzl bcpks dclkt rdfr bqt mltp frbq xvn djmfxp tdmfz bgfc jrr gckzr rbcp qjkng fhcpkt mhbxmfq ldpkn qfffx czn fgngbms jcb (contains fish, soy, dairy) 30 | zjptr rfmvh xntpv lxcxp znrb djdgk lpxc pgkm khpdjv fsfhp rmhh hfkxc pbpgl hhnxvg gknhqs qfffx gjqt nktph vgbz gksqg zbjjnvn cmzz qgvhn fxbk bdvkpj lkbnjx vjqr rrtlfh zchcj vcpk vrjh qblrk gbxsxs fxbx rdfr xhqh bcpks bsjqq pkmbb tdvzl hkhkjm xrqrlb dcqkt qslbqf jvcjhg zhxvv rgx thgljm mlxh bksvfq zqrg rxqd dbvqq bgfc ljgmg pxjgxr dcj shh mlmf xcx dcqtc ffnq rbcp vdgj dvd jncbh gpg tkg qfnhsjj jpfq pxctl qxfzc xrmxxvn jzs gnrpml vmhqr fnks tppnl ldpkn (contains peanuts) 31 | szztlx tdvzl rszfj jxxgtl nd pxjgxr gpg bgfc mfqrl qxfzc fhcpkt ltrzm bpkh jpb dcxncsm ldgs jxh pbpgl sqsmc lhpgn zdrptcx rfqqg bgclkbpr tdmfz bvvkd xgftsb hfkxc vrxp lvn rfmvh cbmvcj ljgmg rxqd gnrpml xbbcnx fgngbms qslbqf vqjct rbcp pxctl cmzz dcj zbjjnvn bcpks dclkt cpcxj mhbxmfq vcpk rxvc mzdlxl qgvhn gckzr fnks rdfr snxvqf qvtfr bfncxv vqxtr rlqgq kjhdl lmfr xrmxxvn dvd mkrf khpdjv mlxh gnvg hhnxvg flr vrjh lnjrvsz kfttq (contains nuts, peanuts, sesame) 32 | vxcdsr pmm dcj vmftt bgfc rxqd ttrjb nxs xrmxxvn kfttq qslbqf djmfxp dlr bgclkbpr cbmvcj xntpv bpkh gjqt shh kdxs xcx gckzr hvllxq rblnlnk jncbh jxh khpdjv flr dctqb cpcxj lcpkxl qxfzc zjptr xvn vtrf gknhqs qjkng kjhdl rfmvh tdvzl gnrpml nnsnh zchcj pxctl vrxp lxcxp fnks czn qvtfr gbxsxs bxfbb djdgk ffnq rdfr bsjqq pqxx jpb vqjct plpl (contains fish, soy) 33 | qmzn rfmvh rfqqg hvllxq lcpkxl dcqkt mlmf vtrqn kdxs gckzr rlqgq shrnc jncbh zzjt lpgvh rdfr frbq tdmfz vs vqxtr zhtq nktph ffgkmhh vqjct rrtlfh xcx vdgj zhxvv cmzz thgljm jpfq kpmnz gnrpml xrmxxvn vmhqr fhcpkt rpsnkz pgkm ntqss txrjf fnks nnsnh hqmkj tpgtm vgbz ctbjc xqvz lxcxp qvtfr qxfzc zqrg khpdjv lrlgmm jrr cbmvcj ldpkn rbcp vjqr (contains soy) 34 | rlqgq rblnlnk bxfbb xcx bkls mlxh ljgmg zbjjnvn mkrf ffgkmhh svzg cmzz dcqkt qslbqf mlmf vgbz prdtb tlrpk nnsnh qfffx lpgvh txrjf cqkrlq bqt tdmfz rfmvh rdffqv jrr jzs fhcpkt fsfhp qxfzc vmhqr shrnc bsjqq ldpkn lcpkxl vjqr vqjct jndzl skzxjnc bvvkd pgkm bdvkpj gnrpml bcpks rdfr bksvfq qtz gjqt qkggr dlr pxctl xrmxxvn kjhdl jxh (contains nuts) 35 | gjqt vtrf vrjh djmfxp rdfr hhst mnjlf vrxp pmm rdffqv bcpks ctbjc lpgvh vxcdsr qfnhsjj jncbh xqvz dctqb kjhdl nnsnh gnrpml zjptr hvllxq cmzz lmfr qxfzc nd vmhqr ptjhk hrxjrg qfffx lnjrvsz cddpfxx ljgmg xfhbfvp qkggr hhnxvg tdmfz qgvhn khpdjv plpl jxxgtl rlqgq dbvqq szztlx nvfkp mhbxmfq knhvxg cpcxj rpsnkz mzdlxl jxh bfncxv xrmxxvn jpfq mlxh nkff vtrqn fhcpkt bsjqq prdtb jzs flr (contains soy, eggs) 36 | rzddk mnjlf djmfxp bxfbb vrjh xrmxxvn gnrpml rfqqg mlxh dcxncsm xvn czn hhst jpfq qxfzc vqjct vdgj lnjrvsz mrffh rszfj vrxp rdfr shh cbmvcj frbq shrnc xcx khpdjv djdgk dctqb hvllxq ntqss dltgm shltgt spmsczc nktph tppnl bksvfq gknhqs mzdlxl tpgtm hrxjrg ldgs nxs pkmbb xqvz vfvtj rfmvh hfkxc sqsmc knhvxg lmfr tzkf jxh tkg vcpk rbcp nkff nhqljxg hkhkjm xhqh lvn pbpgl mltp qblrk pgkm (contains peanuts) 37 | cmzz qfnhsjj kdxs gpg ldgs vxcdsr znrb qdtfkcls dctqb svzg gbxsxs jxh kjhdl vtrqn ffgkmhh mnjlf nnsnh pqxx zdrptcx bxfbb lnjrvsz xrmxxvn rpsnkz dcqkt dcj cpcxj rfmvh qgvhn bqt pgkm ptjhk jpfq jzs rmhh fhcpkt qxfzc nktph qmzn mlmf qblrk nxs nkff xbbcnx djmfxp gnrpml mzdlxl bksvfq tlrpk thgljm rgx vrxp rdfr dcqtc mlxh vqjct nhqljxg ctbjc lhpgn xhqh ldpkn pbpgl fnks jvcjhg bvvkd vmhqr jrr nvfkp hvllxq (contains eggs, peanuts) 38 | xhqh cbmvcj hhnxvg dcqtc khpdjv vmhqr nvfkp flr gpg ntqss rxqd bgclkbpr bsjqq mrffh thgljm jpb gjqt lnjrvsz txrjf lpgvh rdfr vfvtj bgfc bksvfq gnvg rdffqv fhcpkt pbpgl gckzr jxh tlrpk xrmxxvn ltrzm jndzl czn ctbjc qvtfr bdvkpj gnrpml pgkm vgbz qxfzc bqt tpgtm szztlx ffgkmhh dcqkt qtz qmzn zqrg rblnlnk mfqrl plpl mltp hkhkjm vgldq pqxx zjptr rmhh xbbcnx qkggr djmfxp (contains dairy, soy) 39 | rfqqg pbpgl vqjct lhpgn khpdjv cddpfxx gnvg xgftsb mltp xntpv kdxs sqsmc gjqt fhcpkt vmhqr nd pnm mnjlf mlmf szztlx fxbk qjkng snxvqf hvllxq xcx frbq bkls skzxjnc gnrpml zhtq ffgkmhh svzg ntqss xrmxxvn vtrqn qxfzc fgngbms rdfr rfmvh dcqkt hrxjrg thgljm gksqg (contains fish, sesame) 40 | vtrf tkg xrmxxvn tzkf rlqgq lnjrvsz bxfbb vcpk rgx pnm nd rfmvh lhpgn vxcdsr fhcpkt qtz lcpkxl jxh nkff gnrpml vrjh rdfr vdgj jvcjhg jcb fxbk rbcp gjqt bfncxv dclkt ffgkmhh zhtq gksqg sqsmc vmhqr mhbxmfq knhvxg ttrjb qblrk bkls gknhqs zzjt zjptr pkmbb gpg lkbnjx mkrf xhqh vgldq rxvc ptjhk skzxjnc czn lrlgmm ltrzm mfqrl qjkng rszfj bgclkbpr bqt jndzl hkhkjm bdvkpj pxjhvr rxqd mlmf vtrqn lmfr bcpks mrffh qvtfr shltgt cpcxj djmfxp ctbjc hhnxvg pbpgl zhxvv kfttq pqxx xbbcnx nhqljxg nxs znrb dcxncsm qxfzc vmftt jxxgtl xfhbfvp (contains wheat) 41 | mkrf znrb pkmbb kpmnz gckzr mnjlf pxjgxr fsfhp shrnc jncbh txrjf nktph rdfr gxlzr xqvz kjhdl gjqt dltgm qxfzc plpl vgbz xgftsb qfffx fxbk rpsnkz frbq rbcp cddpfxx prdtb jxh vjqr tdvzl bcpks dcxncsm vspsdz gknhqs tkg qkggr gnvg rxvc khpdjv rfqqg qvtfr dbvqq hvllxq ltrzm xntpv bpkh gnrpml kfttq lcpkxl rfmvh xrmxxvn vxcdsr cmzz rmhh ptjhk ljgmg (contains soy) 42 | gxlzr qxfzc ltrzm jxh hhst qgvhn bgfc rzddk rfmvh tppnl vmhqr lvn vqjct rdfr lhpgn gjqt xgftsb cqkrlq vdgj lnjrvsz vgldq qjcn rszfj qfffx pxjhvr gnrpml ttrjb xrmxxvn lcpkxl djdgk dctqb ldgs rxqd qfnhsjj zqrg qmzn vtrqn bdvkpj pkmbb mfqrl pnm bfncxv mzdlxl zzjt dclkt xrqrlb shrnc ffnq mrffh shh knhvxg hfkxc pxctl mnjlf djmfxp fgngbms znrb fxbx tzkf cmzz svzg vcpk rblnlnk (contains sesame, dairy) 43 | xrmxxvn rdfr czn zhxvv gnrpml qfffx lxcxp lrlgmm pqxx txrjf khpdjv vdgj pgkm mltp vtrf cqkrlq kdxs vmhqr xntpv rrtlfh tzkf qxfzc tkg dltgm vgbz bgclkbpr bdvkpj qkggr qslbqf jrr pkmbb ltrzm rfmvh fxbx ptjhk ldpkn tlrpk bvvkd hfkxc nvfkp (contains sesame, fish, nuts) 44 | skzxjnc lkbnjx mlmf lpgvh rpsnkz thgljm dlr vmhqr tzkf tppnl jpfq pgkm rdfr mlxh vjqr qmzn rblnlnk vqxtr dcj bqt gckzr ljgmg nd czn tdvzl rfmvh gnrpml gbxsxs hhst xbbcnx pkmbb jxh lrlgmm rgx ldpkn djmfxp qxfzc tkg bcpks jzs zzjt kdxs qkggr tpgtm vspsdz zbjjnvn bdvkpj xrmxxvn qvtfr bfncxv mhbxmfq mnjlf dbvqq rmhh gxlzr (contains eggs, sesame) 45 | gksqg qxfzc lxcxp kfttq dvd frbq vtrqn cbmvcj qvtfr tbmn rmhh vcpk rrtlfh qgvhn khpdjv jxh lhpgn gpg rpsnkz vfvtj ntqss zqrg bksvfq zzjt kdxs cqkrlq jzs thgljm shh hhnxvg dcqtc zchcj sqsmc dclkt bqt fgngbms vmhqr tpgtm nhqljxg bkls jxxgtl tppnl bpkh kpmnz vjqr bdvkpj flr ffnq skzxjnc xcx ptjhk zbjjnvn hkhkjm bxfbb jncbh lmfr nvfkp lkbnjx dcxncsm rdffqv rdfr pkmbb vqjct rlqgq mrffh jvcjhg jcb nkff rfmvh rzddk vrxp vspsdz cpcxj pnm gnrpml mlmf vtrf ltrzm rxvc fhcpkt xbbcnx (contains fish) 46 | -------------------------------------------------------------------------------- /21/main.nim: -------------------------------------------------------------------------------- 1 | 2 | import npeg, strutils, sets, tables, sequtils, algorithm, sugar 3 | 4 | var 5 | ingredientsByAllergen: Table[string, seq[HashSet[string]]] 6 | curIngredients: HashSet[string] 7 | dict: Table[string, string] 8 | allIngredients: seq[string] 9 | 10 | let p = peg foods: 11 | s <- *' ' 12 | foods <- +food * !1 13 | food <- +ingredients * allergens * "\n": 14 | curIngredients.reset 15 | ingredients <- +ingredient 16 | ingredient <- >+Alpha * s: 17 | curIngredients.incl $1 18 | allIngredients.add $1 19 | allergens <- "(contains " * allergen * *("," * s * allergen) * ")" 20 | allergen <- >+Alpha * s: 21 | if $1 notin ingredientsByAllergen: 22 | ingredientsByAllergen[$1] = @[] 23 | ingredientsByAllergen[$1].add curIngredients 24 | 25 | if p.matchFile("input").ok: 26 | for i in 0..42: 27 | for a, l in ingredientsByAllergen: 28 | let prospects = l.foldl(a * b) - toSeq(dict.keys).toSet 29 | if prospects.len == 1: 30 | for k in prospects: 31 | dict[k] = a 32 | 33 | echo "part1: ", allIngredients.countIt(it notin dict) 34 | echo "part2: ", toseq(dict.keys).sorted(proc(a, b: string): int = cmp(dict[a], dict[b])).join(",") 35 | 36 | -------------------------------------------------------------------------------- /24/input: -------------------------------------------------------------------------------- 1 | neseewneneseneewnenenwwewewnwew 2 | newswswnewwsewswwswsww 3 | nwwwwnwnwsenwwwwwnwwwnw 4 | swswswswswswswswswwseswswnewneswsweswne 5 | swswwswwswseswswwswwwswswwnenwwneesw 6 | neswnesewseseseswswseswenesewnwseseswse 7 | wswswwwwwsenwwwwwwww 8 | eneneneneneneneeneneseenewene 9 | eneeswweswneeeneneneneeenenenwsee 10 | nwneneneenenenwnwnwswnenw 11 | eneswsweneeneneenenwnenee 12 | swwswswwweseswswwweswwwneswnew 13 | enwnwnwnwnwnwnwnwnwnwswnenenwnwswnwnenwe 14 | swswwnewwwnwwewwwwwwwwnew 15 | swneswnwnwseswswseseneneneswwswswwnee 16 | wnwwnwwwnwnwnwwwse 17 | swwwnwswwswswwswee 18 | nwseneswseeewnenenenwneswnenwwnene 19 | nwseneswenwnwnwnwnwnwnenwnwnwsenw 20 | nwnwenwseenewnwswewsewswnwsenwnwnwnw 21 | nwneewswwnwswnwnewwnwwewsenweswnw 22 | neswswneswsesewseneseswswseswswswwsww 23 | sewwwnwswsewenwnewewswwwwnenesew 24 | nwwswnewnwwewnw 25 | sesesesenwswneeseswseswswsw 26 | swwsewsenwnwnwnwnwswnewnwwwewwnwne 27 | neswnenenwswnenwwnwsewnwnwneseenwnenenw 28 | seswnwneseswswswswsw 29 | nwewwwwwesewwwneswseenwnwewe 30 | eeseeseeneeeenweseeseeeewe 31 | seswsewseseseswseneseseeseswnwsese 32 | wwnwnwwnwwnewwwwwwwsww 33 | neeseeseseseeenweseeeewseewseesw 34 | newnwswwnwnwwwnwsenwee 35 | swwswneseswswnwwwswswseneswewenww 36 | sesesesenwseseseseseneeswwneseeese 37 | nwnwnwnwnwnwnwnwnwwnwwwsenenwswnwnw 38 | nwseesesesewwseeeneewneenesewnwe 39 | nwnwwnwwwnweenwswnwnwswnweenwnwwnw 40 | nwsesenewwnwsewnwnwnwwwnwnweneww 41 | wnesesenwneenwsenwnewnenenwnwsenesesw 42 | eeeenweseseeewseweeee 43 | eeswseseseweneseeseswseneeesesesenw 44 | senweeswenweswenweeeenweseewne 45 | eeeeneeseeneeeeeew 46 | swwseswsweswnwswswswswswswneswswseswswe 47 | sesenwneeneswnwnwnwnwenwsenewwnwnenwnw 48 | swweswnwswseseswswswswswswswswsweswsw 49 | ewseewswnwnwnwwnwwneswsenwnwnenwwse 50 | wnenesenweswnenenweenenwnenwnwnwnwnwnwsw 51 | newwwswwnenewsenewnewwsewswswswww 52 | nwswsenenwnwnwnwseeseneneswwnenwswnwnw 53 | wswwwswwwwwwneseeswsewneswwwsw 54 | wwwwswneewsenwseswnwwwwswwnww 55 | wswswswwwswneswneswwwswsenwseswwese 56 | eneweswswneneswneneneneeneeeenene 57 | eneenenenenweeseneeswnwneeeneene 58 | eseeeeeeseeeeeweee 59 | seesenenwwnwswnwneswneeswenwwnwnwne 60 | wnewwnwwwnwnwsww 61 | esesenwswseenwseneneswseseneeswesesewsw 62 | wnwseseswneswswwneswswswswwseneswswsw 63 | nwnwnwnwnwwnwnenwnesenwnenw 64 | swnwseneswneswseswwswswswseswsesw 65 | nesesewseseneseseseseseswnwesesewsesee 66 | eeswseewswnwneesenenwse 67 | swswswnesenesweswseswswnwswsweseswwnwswnw 68 | eewswsewneswnwsesenw 69 | newnenewneeneneneswnenenwneeswnenwnene 70 | nwnweneeeeeesewsewsesesweneeewnw 71 | seseswnesweswseswswseswwnwsewse 72 | nwnwwsenesewenwswwwsenwwnw 73 | seseseseseseseswseesenesewne 74 | wwwwwswwewnwswsewwwnewwswnew 75 | sesesesenesewesesesesenesesesesesewse 76 | eswwnenenwswneenwewnenenwswswnwnwnene 77 | eseeeeweeeeweseeeswsenesenee 78 | weneneneneneesweenwneneneneeeee 79 | neenenwnesesenenenewwnenesenwne 80 | swesweswseseswswsenwswseseseswswwswse 81 | neswnenenwseneneene 82 | nenwnwnwnwnwnwnwsesenwnwnwnwnwwswnwnwnenw 83 | nwnwnwnwwnwnwneenwsesewnwnwnwwsenwnwnw 84 | enwnesenwsenewseewewswnwnewseswswe 85 | eeeesweneenwnene 86 | senwnwnwnwwneswenenenenwsenwswenwnenwww 87 | enenenenwseesweneweeeeeenewsenw 88 | swenwswswswswswnwsweswswswwswswswswsesw 89 | wnwwnwnenwsenwnwwwnwnwwwsenwnwnwnw 90 | swnwsesewswseeswswswenwswne 91 | eeeewneneeeneswewnesenesenee 92 | swwwseseneneswenewseswswseneswsewnwnwse 93 | weneeeeeneneenenenenenee 94 | senwnwnwseswwneneseneneseenenenwnenwsw 95 | eeeseseeseewewswenenweeseee 96 | swsesenwnwewswseswseeswswse 97 | ewswswseswswwswseswwewewnwnwwswne 98 | swnwnenwnwnenenwnenwnwnwnenwnwnwnw 99 | eeseeswewweseenweswenewewene 100 | swwwswwnwnenwsenwnenwnwnwewwswnwwnw 101 | neeenwenwseeeeeneneneneswe 102 | nwwwwseswswwwswswwwenewwswwnew 103 | nwnewwwseswsesenwneswewnwewwwe 104 | swswsenwnweswswenwnwnwnwwnwneewwnewnw 105 | seeseeseseseseswsenesesesesewnwswsese 106 | nwnwnwneseneseenwnwsenwwnwnenenwwnwnwnw 107 | sesenwwswseswseswseswseswseeseswseesw 108 | nwnwnwnenwnwnwnwnwnwneswnwnwnwnw 109 | seseeeseeweeeewswneee 110 | neswneswswwswnwswwseswswswweswneswsw 111 | nwnenwswwsenwnenwsenenenenwnenenwnenenw 112 | nwsenwswsewswneswswwnenenwwsee 113 | swwseswswseseseswswswswne 114 | nenenenwneneneneneseenenenesewneneenenw 115 | eesewesesesewnwsesenwee 116 | seswswnesesesesesesenwwswseseseneswesene 117 | eeeeeenweseseewewsweeneseee 118 | seseeeeewseseneeseeesesesewwe 119 | swsewweswswneswswseneswseswswswseswsew 120 | seeseeeeseseneeeeewseesewese 121 | neneeneswneneneswnwneneneswenenwnenese 122 | nenenenewsenenenenenenewnesenwnenenesenwne 123 | newneswnwswnwewnwsenenwswwnwsenenwswwne 124 | seswsesenwseswenwnwswsesewsesewne 125 | swnwnenwnwnwsenwswnwnwwewwnwnewswwne 126 | neseseneswnewwnenenenwnenwnwnwnwnwnesenene 127 | swnwsenwneenwnewne 128 | eswseswseseeswesesenwnwswsewswseswsese 129 | enewneenenwswneneweeeseswnwenwe 130 | nenenesweeeeeeeee 131 | swnenwnwenwnwneneneneneneswnwnwnenwnwsw 132 | nwnwwnwnwwenwwnewnwswsewnwewswewnw 133 | sewneseseswseneseswseseswswswseseswsenesw 134 | nenwnenesenenenwnenenenwwnenwsesenenenwwnw 135 | wsenwswweeeeseeswneeeenwnwwnee 136 | eeneenenweeneseneeneeene 137 | swswswwswwwesenenenwswsw 138 | nwnwnenwseneswwenwnwsenwwnwnwenwswse 139 | sesweneeeeeeeeeneeeewsee 140 | eswswwswswwswswswswnewswsewswswwne 141 | nweewswneeeneweeeee 142 | nwsenwseswsenenwnwweneswenenwseesenew 143 | seenwwseswsenenwseneseswnwnwnenewewnwnw 144 | eesweenwneenwsw 145 | nenenenwneneewneenenesweweneneese 146 | seswseswneseswswseswsewse 147 | neswswnwnwswswsweswswswswswswwsewswswsw 148 | neneneeneeeswnesweneneenenenwnenene 149 | nwnwnwwsweenwwsenw 150 | swwswswswswwwwsweseswneswswswsw 151 | seeeseeseseseeenwseseseswee 152 | wwwenewseswnewnwsewweenewww 153 | swneswewswnwnwneeneseseeswewswsee 154 | wsenewseeswnwneswnweneenenwneeswne 155 | eweenwnwswsesweenwneseseswseesenw 156 | neenesenenenenenenewnenenesenwneneww 157 | nesenenewnenesenenenenenenenenewwnesenene 158 | swswswseswswswseswswswswnwsw 159 | sewwwnwwwswwwwnewwwwnewww 160 | swswswsewseswwwswnewwwwswwwnew 161 | wwnwwnewwwwwnwnwwseenw 162 | swnwsenewenweeesweeeeweeenenw 163 | swseseswsesewseswseseswsenwwsweswsee 164 | wwwwwwswnwneswwnesenesweswwwwww 165 | eeeneeeeeswneeneneneneee 166 | seseseseneseseseseswsesewsesesese 167 | neseneesesewseseseenewwseswseswnee 168 | neeneswneneeneeenenenenene 169 | neeenweswnweneeeswesweeeeeenee 170 | wswswneswswsenesenwneswwsenwswswewne 171 | nenwneneeeeneeeswwswswsesenewenene 172 | enwsesweenweeneee 173 | neswwswswswnewwseswwswwwww 174 | nesenenenenenwnenwnwwnwnenenwsenwnenwne 175 | nenesenesenwwwneeeeneneenewnenesw 176 | eseesesenwseswseeeeseseneeseewsee 177 | senwnwewnesenwnwnwsenwwnwnwnewnwwnwnw 178 | nesenenenwnwnwnwnwnwnewwnenwseswswsene 179 | ewenwewsweswswnenewsenenenwneee 180 | wswewenwswwswswwswswneeswnwswnww 181 | sesenwwswsweesesweswswwswswnwswnesw 182 | wewwsesewwnwwnwwwwnewnwnwsesenw 183 | wewswseweseeeeeneesweweenenee 184 | seneneswswswswwswswswswswswnewswswswnew 185 | swwweswwwnesewswnwwswwswswwswswsw 186 | wwnwwswwwweswwswwwswwwne 187 | weeeseeeenenenweseeweneene 188 | wsenenwsenewewswnwsenesewwwnwnenw 189 | wwwswnewwwnwnwnwwnwswsesenwenew 190 | swswswswwswwnewwswwwwsw 191 | swwwseswswwwswneswwswneswswwswswe 192 | sesesesesesenwseseseswsw 193 | nenenewnenenwnenewenenwenwnwne 194 | seeswnwseseseseneseseseseneseseswsesesesesw 195 | wewewwwswswnwnenwwwwewwwww 196 | wsenweseeseseseswnwesewswnweswwse 197 | nweenwswnweneswneeeeeesweswe 198 | nwnwnweenwneseswnwnwwnwwnwswnwnwwsew 199 | wwnwswweewnwwswwnwenwwwnwwwnww 200 | swnweweeeswenwwseeseneeeswee 201 | ewnweweeeenewswwseeswesewnw 202 | wnwnwwwswwnwnwnwwwnwnwnwwsewene 203 | nenwnwnwewsewwwswsesewnenwnwnwnwnw 204 | swnenwnwwnwwwnwwnewnwnwnwnwewnwse 205 | neeneneenwenewneseeeweeseneneswew 206 | nenenenenwnwnenwsenenwne 207 | swswswnenweewseeswwswneswwwswseswnw 208 | swswseneesewneeeeeeenwswenenwse 209 | nenwnewnenenewneseneeneeenwswnenene 210 | swnenenenenesenenenenenwnenenenenene 211 | nwseswsewswsesesesenwseneseneswnwswesw 212 | swseswsenwseswnesesw 213 | eseeneseseseseswsesesesesesenesesewse 214 | esenwswswsesenwsenwseeswseseeeseswwse 215 | nwwseeseeewswswnwswswnwwswnenwswe 216 | eeseenwseeeswneeseweeesewwse 217 | seneswswseswneseseswseesewwseseseswsw 218 | wnesenwwsewswnesenwnenenwwwsewnwnwnw 219 | nwnwnwnwnenwnwnwnenenenesweswnwnenwnenw 220 | seenwseeseeeewnweseesweeseewsee 221 | wneseeeeeeeeeeeeeweeenwsw 222 | neeneswseneeneswneswneeswwnenwneenee 223 | nwnwnenenenenenwnesewnwneneswenenenwne 224 | wneenwnwwwwewswsenewseswwwnww 225 | nwsweswnwseseenwwneswewnwwsenweesene 226 | wwnwswsesewnwwswweewnwewewse 227 | newnewwwneswswswswwwsenewsewswswsw 228 | seseseseeweseseesewseseswsesenwese 229 | nenwswneswnwnwnwnwnwsewnwwesenwwwnwnw 230 | esewseseseswseseseseswsesenwenwwse 231 | swswswnweswswswswneswswwwswseswswswswswnw 232 | enwsenwewwsewwnwnwwseeswwwswww 233 | wsewwwnwwneseneswwwwswwe 234 | nwneesewwnwwseeneseeeseeseeese 235 | nwswwwwwewnwwnwwewwnwwwnwswwe 236 | swwswsweneswenenwwseseseesenwsenesewse 237 | eeneneeeeeseeeeewee 238 | swswswswneswnewswswswswswnewseswswswsw 239 | seswseswswseseseswwnwswswseswswswnewesw 240 | nwnwneswwwwwnwswnwwwnwsenwwsewnene 241 | swseseswswseneswswseneswswswnwswsewswsenw 242 | wswseswseswswneeswsenwseswswseswseswse 243 | neeeeeeeneeeeswweenweneeswe 244 | nenweneneenenweneesweesweenenwwsw 245 | neeswnwneswnwseeenwswswnwnweseswnwnesw 246 | nwnweenwenwenwnwwwneswswsw 247 | wewnwnwwnwwwwwwwwwsww 248 | nwswwwswneswswneswswwwwwswweeswnw 249 | enenewnenenwnenenenenw 250 | enweeneeseseeswenenwseeneeenww 251 | eswnwwwneewenwnenwsenwsesesenwwse 252 | wsesewwnwwsenewnewwnwnw 253 | swseseseneesesenwwsesenesewesesenesese 254 | nesenwswwsesesenenewsesese 255 | enwnwwnwneseswnwseswnwnwnenwnwwswneenw 256 | eneneenewnewnwswswnwnwsenwnenenwewe 257 | nenwswnwwweseeswnweswse 258 | senwwwnewsewnwwnenewwwwsesewe 259 | nwnwnwneneseswswnenenwnwneseneseenesewwsw 260 | wnwswenweswnewnenwswneneneneneseenenw 261 | enwwwsenwswnwenwwneneenwnwnwnwwswnw 262 | sewwnwnwnwnwwnwnwwnwwnwnwnw 263 | wwswwseweewwnwwwwnwwwwwwsw 264 | sewswswseswseswneseswseewseseneswsesw 265 | swneenwwswswsewsweneswsenwsewnee 266 | nenwewswswnwnwnwnwnenwwnwwneeeenwne 267 | swnwneeseseswwnwenwneseneneneeswsenwwnw 268 | nwnwnwwnwnwnwnwnwnenesenwnwwsenenwnwnwnw 269 | newneswnewseneenwnwneseswnewenenese 270 | sewwwswnwnwwwnewnwwenenwnwnwnww 271 | eenenesewneweneswneneneneneneeswene 272 | nweeesesewseeeeenwseseeseeesee 273 | nenenwneswnwneswnwneneenenwenenenenene 274 | swswswswswseswneswsw 275 | neneswnwnenwsenwnenwnwnwnenwnenwnwnw 276 | senwseseeenwseeeeswewenwsee 277 | nwnwwswnenwswwnwwnwwnwenwnwnenwnwse 278 | seeenwewseswnesweeeeeeewsenewe 279 | seesesesewsesesewsesenweneseeeseseese 280 | eeenwsweeeeenwnwweswneseeeee 281 | seneeseseswsesweswswnwwnweseeewene 282 | swswswswnwswsweseswswswswswswsesw 283 | wnwsenwneewnwwnenwwwnwnwsenwswnwnesw 284 | swwwwwwwseneewswsewnewwwwswwsw 285 | wwnwnwwnwnwwnwnwwsesewwnenwnenwwnw 286 | esewnwswswnwsenwewnwesweeswwnene 287 | swswseseesesenwesesewseseswsenwsesese 288 | nenenenwwneseneneneneswswnene 289 | nwnenwwnenewenwnwnwnwnenwneenwwnesenwnw 290 | swnwsewwwwewswewnwwweweewnww 291 | neswneneneneenenenenenenenewnenesenenwne 292 | nwnwnenenwneseneswnwsenenewenewnenenee 293 | ewwsewneswnwnwsenwnenwnenese 294 | enwswnwwswwnwseeswswwswswswnwneseseswne 295 | swwnwwewwwswswwswwwwwsewnew 296 | nwwnwnwswnwnwwwnwnwnwwwnwe 297 | swenenenwnenenwwneneswenenenenwnenenwne 298 | wwwwnwwwwwnwwnwswwenw 299 | ewseeswneswneneswseneeenwnwswnwneswne 300 | newnenewnewsenenwseeenenenewneese 301 | seseseswswseseswswsesenenwswsesesesewe 302 | enwnwswnwnenwwneneneneneswneneenwnene 303 | wwseswwwswsewnwswwnewwwswwww 304 | neewswnwswwwnwwnwwwwnwwnwswewne 305 | swswewwnwwnwswswewswwswwnewww 306 | swneneneenenenenwnwnenwnenwnwnenwne 307 | sewseseswseswswswnenwseseseseswnwnwswse 308 | swsweswnwswseswnweswnwwwswesewnwsw 309 | ewseswnwswesenenenenenwsweewnwnenwnesw 310 | sesesesenwsenwseseseseseseneswseswseesese 311 | nwnwnwnwnwnwnwswswnweesenwwnwnwnwnww 312 | sweswswswswnweswswswnwswsenwenwswswsw 313 | wsesesenwsesesenesenesesesenweseseew 314 | neseenesewnenewsesenewwneweneneene 315 | wnesweswswwswswseew 316 | eseseseesewswseeneseeeeesee 317 | enwweeseeseeeeswseseeeeeewe 318 | newneeseeeenwweseseswenesee 319 | swneneneneneneneneswneneenee 320 | wwnwnwneenwnenwnwnwnwnwseswnwnwnwnwenw 321 | neswseenwswseswseenwswswneneeeseeesee 322 | eseseeseswneneseesewweewseseeneese 323 | swseseswsewsenesenwneeneseewnwwseesw 324 | wwwsewwnwwnweewswsweswwewnwsw 325 | sewneeeeeeswseesenweeeenwew 326 | swswseseseseseewswswswswsewneseswseswnwsw 327 | seswnwneeewswnwswswwnwwwnwnwnwnenwnw 328 | nwnwnwnwswnwnenwnwnwnwnenwnwenwnenw 329 | nwswsweswswwwwwsweswswswswnwsw 330 | wwswneeneneswswwswneseswwsewwsenww 331 | nwneswnenwnwsewsenenwnenenwnwseneneswnwsw 332 | nesewwnwnwswwnwnwnewnwnwenwswnwnwnwnwnw 333 | neenenenenwnweneneeseneeneseneene 334 | wwwwnwweswwwwwwwwwewww 335 | nwnwnwnwnenenwnwnwnwnenwnwnwswnwnw 336 | nwnwnwnwnwwwwnwwsenwnww 337 | eeswneneneweeneeeneeneesenenene 338 | wnwwwewwswwwwewwwwnwwwnw 339 | wenwwswnwswswsweswswseswwwwnweswsw 340 | wswwneewswwwneswswwsewnew 341 | nwswseeseswswswnenwseneswswseswsesewswsesw 342 | nwwwwwsewwwwnewnwwwnewwnwsw 343 | wswsweswnwswswswsesweswswsese 344 | swsenweeeeeeeesweeenwnwee 345 | nenwswnwsweneswswnenwnese 346 | eenwsweswnwswseswnenenwneenwsewsenw 347 | neseesesewsenesesesewseeswnwseesesese 348 | nwenwnwwswnwnwnwenwsenwnwnwnw 349 | seswswnwwswwswswseswneswswswswenwswwe 350 | sewweswwnweneswewwswnwwweswww 351 | esewnwswnewwswswwswneenwenwwswww 352 | swewswnwwwsenewnwwwwswweseww 353 | neweenweswsweweeseeweenenesw 354 | nweswewswswwwwwnwsenwseswwswwwww 355 | seeseseeseesewe 356 | nenwsenwwsewnwwwenwwnwwwswne 357 | sweswswewswnwswswwswwwwewwswsw 358 | eswnenenwsenwnwnwnwnenwwnwnwnwnwnwnwnw 359 | newneneseeeenenwweeneeseeswwewne 360 | nweswswswenwswnwsweeswswnwsw 361 | swwwenwewnwnewese 362 | swnwswswswswsweswswswseswswwsw 363 | nweneswnenwwewseseseswswewseesee 364 | wwwwwwwnweswsewnewwwswsw 365 | seswnwneenenwnwsewewseneneneswnwnenwse 366 | eeweeeeeeeswenee 367 | seswswneswswswneswswswnewswsenw 368 | nwnenenenenenesesenenenwnwnenenewnenenw 369 | swswswswswswsweseswwswseswswswse 370 | neseswswseseseseseseswsenwnwwsesesesese 371 | swweenwwwseswweswswweswwswnwsw 372 | senenwneneneneeneneswnwnenenwnenenewnee 373 | ewsenwseenwwnewwnwwwewwnewnese 374 | nesesenenenenenenenenenenewwnenenenenenesw 375 | wwswwneswweswsewwwwswnwswwswswnww 376 | wswwswswwenwswswwsw 377 | swenwswsenwnwwwneseesesese 378 | wswwwwwwwswwseenwwwenwwwswsw 379 | neswseeneseswnewsewswnenwswnwwsenenewsw 380 | swswwwwwswwswswwenwswwww 381 | neeweesweeeenenew 382 | swsenenwenwnewwswenwswesw 383 | weseseswneeenenweeeeeewneswnee 384 | esesweeneneenwwnenwnesenweneneneneee 385 | seneneswweneseswswnweneenwswneeneew 386 | neswneenweeesenweswne 387 | wsenenwwewwwwnesenewwswesesene 388 | eneeeneenweeewswwnewenwseeee 389 | neneneneswnenenenwneenenenw 390 | wwsweswwwnwswenwnwnwwseew 391 | swnenwenenenenenenene 392 | swnwnwnenenwenwnwnwwnwnwnesewnenwnwnenw 393 | swesesenwnesesesewnesewswnenesewee 394 | newswsenewswnewswswwsewsww 395 | swswswswswneswwswswswswswswswswnesewsw 396 | nwwnwsesenesesweenwnenwwneswwwswwnw 397 | neneswnenenenenenenenene 398 | -------------------------------------------------------------------------------- /24/main.nim: -------------------------------------------------------------------------------- 1 | import npeg, sets, tables 2 | 3 | let ds = { 4 | "e": ( +1, 0, -1), "se": ( 0, 1, -1), "sw": ( -1, 1, 0), 5 | "w": ( -1, 0, +1), "nw": ( 0,-1, +1), "ne": ( +1,-1, 0), 6 | }.toTable() 7 | 8 | type 9 | Tile = tuple[x:int, y:int, z:int] 10 | Floor = HashSet[Tile] 11 | 12 | proc `+`(a, b: Tile): Tile = 13 | (a.x + b.x, a.y + b.y, a.z + b.z) 14 | 15 | proc neighbours(m: Floor, t: Tile): int = 16 | for _, d in ds: 17 | if (t+d) in m: 18 | inc result 19 | 20 | proc run(m: Floor): Floor = 21 | result = m 22 | let r = 100 23 | for x in -r .. r: 24 | for y in max(-r, -x-r) .. min(r, -x+r): 25 | let tile = (x, y, -x-y) 26 | let n = m.neighbours tile 27 | 28 | if tile in m and (n == 0 or n > 2): 29 | result.excl tile 30 | 31 | if tile notin m and n == 2: 32 | result.incl tile 33 | 34 | var cur: Tile 35 | var floor: Floor 36 | 37 | let p = peg list: 38 | list <- +line 39 | line <- +dir * '\n': 40 | if cur notin floor: 41 | floor.incl cur 42 | else: 43 | floor.excl cur 44 | cur.reset 45 | dir <- ?{'s','n'} * {'e','w'}: 46 | cur = cur + ds[$0] 47 | 48 | if p.matchFile("input").ok: 49 | echo "part1: ", floor.card 50 | for i in 1..100: 51 | floor = floor.run 52 | echo "part2: ", floor.card() 53 | -------------------------------------------------------------------------------- /25/main.nim: -------------------------------------------------------------------------------- 1 | 2 | proc xfrm(sn: int, loops = int.high, find = -1): int = 3 | result = 1 4 | for i in 1..loops: 5 | result = (result * sn) mod 20201227 6 | if result == find: 7 | return i 8 | 9 | let cpk = 335121 10 | let dpk = 363891 11 | 12 | let cl = xfrm(7, find=cpk) 13 | let dl = xfrm(7, find=dpk) 14 | 15 | echo xfrm(dpk, cl) 16 | echo xfrm(cpk, dl) 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | Advent of Code 2020 in Nim. 3 | 4 | -------------------------------------------------------------------------------- /lib/sparsemap.nim: -------------------------------------------------------------------------------- 1 | 2 | import tables, strutils, hashes 3 | 4 | type 5 | 6 | Point = object 7 | x, y: int 8 | 9 | SparseMap*[T] = Table[Point, T] 10 | TileGen*[T] = proc(v: T): char 11 | 12 | 13 | proc posmap(n: int): int = 14 | if n >= 0: 15 | n * 2 16 | else: 17 | n * -2 - 1 18 | 19 | proc cantor(x, y: int): Hash = 20 | result = (x+y) * (x+y+1) /% 2 + y 21 | 22 | proc hash(p: Point): Hash = 23 | when true: 24 | cantor(posmap(p.x), posmap(p.y)) 25 | else: 26 | !$(p.x !& p.y * 500) 27 | 28 | proc set*[T](m: var SparseMap[T], x, y: int, v: T) = 29 | let p = Point(x: x, y: y) 30 | m[p] = v 31 | 32 | proc clear*[T](m: var SparseMap[T], x, y: int) = 33 | if y notin m: 34 | m[y] = SparseRow[T]() 35 | if x in m[y]: 36 | m[y].del x 37 | 38 | proc get*[T](m: SparseMap[T], x, y: int): T = 39 | let p = Point(x: x, y: y) 40 | m.getOrDefault(p, T.default) 41 | 42 | iterator items*[T](m: SparseMap[T]): (int, int, T) = 43 | for p, v in m.pairs: 44 | yield (p.x, p.y, v) 45 | 46 | proc draw*[T](m: SparseMap[T], fn: TileGen): string = 47 | let normal = "\e[0m" 48 | let border = "\e[33m" 49 | let grid = "\e[1;30m" 50 | var xs, ys: seq[int] 51 | for (x, y, v) in m: 52 | xs.add x; ys.add y 53 | let (xmin, xmax, ymin, ymax) = (xs.min, xs.max, ys.min, ys.max) 54 | result.add border & "╭" & repeat("─", xmax-xmin+1) & "╮" & normal & "\n" 55 | for y in ymin..ymax: 56 | result.add border & "│" & normal 57 | for x in xmin..xmax: 58 | var c = $fn(m.get(x, y)) 59 | if c == " ": 60 | c = if x == 0: grid & "┆" & normal elif y == 0: grid & "╌" & normal else: " " 61 | result.add c 62 | result.add border & "│" & normal & "\n" 63 | result.add border & "╰" & repeat("─", xmax-xmin+1) & "╯" & normal & "\n" 64 | 65 | proc `$`*[T](m: SparseMap[T]): string = 66 | m.draw(proc(v: T): char = 67 | if v == T.default: ' ' else: '#') 68 | 69 | proc `$`*(m: SparseMap[char]): string = 70 | m.draw(proc(v: char): char = 71 | if v.char > '\0': v.char else: ' ') 72 | 73 | proc count*[T](m: SparseMap[T]): int = 74 | for y, l in m: 75 | for x, v in l: 76 | inc result 77 | 78 | proc count*[T](m: SparseMap[T], w: T): int = 79 | for y, l in m: 80 | for x, v in l: 81 | if v == w: 82 | inc result 83 | 84 | proc slice*[T](m: SparseMap[T], x1, y1, x2, y2: int): seq[seq[T]] = 85 | for y in y1..y2: 86 | var row: seq[T] 87 | for x in x1..x2: 88 | row.add m.get(x, y) 89 | result.add row 90 | -------------------------------------------------------------------------------- /runall: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | for a in [0-9]*; do 6 | echo "==== " $a 7 | cd $a 8 | nim r -f --hints:off main.nim 9 | cd .. 10 | done 11 | --------------------------------------------------------------------------------