Day 1 :: Depth Chart

input :: depth_readings

Click to see raw data
depth_readings = [182,
 188,
 204,
 203,
 205,
 206,
 208,
 216,
 217,
 218,
 219,
 225,
 226,
 207,
 204,
 205,
 217,
 255,
 254,
 270,
 261,
 262,
 264,
 265,
 255,
 257,
 249,
 248,
 249,
 250,
 265,
 286,
 308,
 309,
 317,
 326,
 328,
 316,
 318,
 333,
 330,
 293,
 292,
 294,
 321,
 313,
 307,
 301,
 296,
 291,
 295,
 297,
 304,
 314,
 331,
 330,
 342,
 325,
 324,
 354,
 360,
 368,
 371,
 372,
 373,
 374,
 381,
 384,
 387,
 389,
 390,
 392,
 393,
 382,
 361,
 350,
 356,
 357,
 359,
 363,
 371,
 391,
 398,
 402,
 403,
 397,
 394,
 397,
 396,
 398,
 399,
 393,
 411,
 417,
 428,
 429,
 456,
 446,
 451,
 459,
 456,
 460,
 458,
 451,
 455,
 452,
 446,
 451,
 448,
 444,
 476,
 478,
 480,
 503,
 502,
 504,
 496,
 511,
 518,
 531,
 543,
 544,
 516,
 512,
 511,
 514,
 524,
 522,
 523,
 535,
 558,
 576,
 589,
 584,
 580,
 582,
 581,
 580,
 571,
 570,
 578,
 616,
 609,
 610,
 603,
 604,
 614,
 615,
 616,
 614,
 612,
 604,
 601,
 606,
 604,
 600,
 599,
 600,
 609,
 614,
 607,
 631,
 629,
 631,
 637,
 653,
 661,
 660,
 661,
 705,
 721,
 719,
 722,
 707,
 720,
 725,
 721,
 729,
 730,
 729,
 730,
 718,
 728,
 733,
 709,
 712,
 699,
 670,
 671,
 670,
 655,
 641,
 658,
 661,
 659,
 648,
 649,
 644,
 643,
 642,
 643,
 636,
 656,
 660,
 670,
 677,
 679,
 676,
 658,
 659,
 651,
 656,
 637,
 632,
 625,
 624,
 585,
 590,
 591,
 594,
 595,
 596,
 607,
 584,
 586,
 587,
 597,
 589,
 588,
 589,
 599,
 597,
 606,
 592,
 612,
 614,
 608,
 602,
 601,
 574,
 567,
 557,
 535,
 533,
 534,
 535,
 509,
 520,
 525,
 539,
 535,
 546,
 551,
 566,
 571,
 564,
 567,
 556,
 566,
 567,
 566,
 579,
 610,
 613,
 620,
 621,
 598,
 599,
 626,
 633,
 659,
 641,
 642,
 643,
 641,
 642,
 646,
 661,
 662,
 668,
 674,
 676,
 681,
 689,
 690,
 689,
 677,
 697,
 700,
 712,
 702,
 704,
 707,
 708,
 705,
 706,
 709,
 704,
 705,
 706,
 705,
 698,
 694,
 693,
 694,
 692,
 689,
 686,
 688,
 694,
 720,
 721,
 733,
 732,
 716,
 702,
 704,
 710,
 701,
 698,
 703,
 704,
 702,
 703,
 723,
 713,
 722,
 724,
 739,
 740,
 741,
 743,
 741,
 727,
 724,
 704,
 699,
 715,
 710,
 699,
 698,
 691,
 694,
 682,
 683,
 684,
 682,
 656,
 657,
 662,
 664,
 668,
 662,
 665,
 649,
 667,
 666,
 667,
 639,
 637,
 639,
 620,
 618,
 621,
 617,
 604,
 605,
 606,
 601,
 603,
 606,
 609,
 610,
 611,
 615,
 617,
 615,
 621,
 619,
 621,
 612,
 602,
 601,
 617,
 618,
 631,
 626,
 633,
 609,
 607,
 610,
 611,
 610,
 615,
 619,
 622,
 621,
 622,
 626,
 637,
 613,
 603,
 612,
 614,
 611,
 607,
 628,
 639,
 643,
 644,
 643,
 642,
 641,
 642,
 641,
 642,
 648,
 649,
 652,
 654,
 657,
 659,
 682,
 687,
 688,
 689,
 678,
 697,
 699,
 703,
 720,
 711,
 712,
 714,
 713,
 699,
 698,
 707,
 710,
 702,
 694,
 684,
 682,
 676,
 680,
 679,
 662,
 666,
 668,
 681,
 671,
 665,
 666,
 662,
 629,
 641,
 632,
 633,
 632,
 641,
 644,
 641,
 647,
 643,
 641,
 642,
 643,
 645,
 647,
 646,
 645,
 648,
 649,
 648,
 637,
 604,
 605,
 600,
 601,
 599,
 598,
 597,
 591,
 592,
 590,
 591,
 565,
 576,
 577,
 578,
 581,
 583,
 586,
 587,
 598,
 604,
 607,
 604,
 602,
 609,
 606,
 609,
 620,
 621,
 629,
 622,
 620,
 618,
 620,
 632,
 654,
 660,
 661,
 658,
 657,
 656,
 680,
 682,
 688,
 680,
 673,
 663,
 665,
 668,
 663,
 669,
 670,
 662,
 668,
 665,
 672,
 678,
 676,
 679,
 680,
 673,
 674,
 677,
 678,
 679,
 680,
 681,
 659,
 664,
 662,
 657,
 664,
 663,
 666,
 696,
 712,
 708,
 709,
 710,
 725,
 729,
 735,
 731,
 732,
 749,
 746,
 726,
 727,
 732,
 741,
 734,
 733,
 723,
 722,
 720,
 722,
 719,
 711,
 695,
 696,
 699,
 700,
 701,
 724,
 725,
 722,
 723,
 715,
 716,
 717,
 714,
 715,
 717,
 716,
 715,
 723,
 728,
 729,
 733,
 734,
 735,
 736,
 748,
 788,
 794,
 795,
 793,
 792,
 803,
 805,
 804,
 805,
 804,
 806,
 805,
 784,
 792,
 778,
 777,
 787,
 799,
 794,
 808,
 811,
 813,
 815,
 812,
 809,
 833,
 859,
 863,
 864,
 866,
 865,
 863,
 850,
 845,
 844,
 854,
 860,
 861,
 865,
 869,
 851,
 850,
 853,
 874,
 875,
 876,
 875,
 876,
 875,
 879,
 880,
 888,
 891,
 890,
 902,
 904,
 892,
 893,
 892,
 900,
 905,
 918,
 925,
 924,
 923,
 914,
 924,
 925,
 926,
 952,
 953,
 951,
 947,
 957,
 971,
 968,
 982,
 971,
 974,
 975,
 958,
 943,
 950,
 934,
 940,
 949,
 947,
 941,
 972,
 971,
 967,
 969,
 968,
 964,
 972,
 966,
 976,
 975,
 962,
 959,
 962,
 967,
 965,
 966,
 963,
 959,
 960,
 959,
 961,
 962,
 949,
 950,
 956,
 957,
 961,
 953,
 949,
 956,
 954,
 955,
 919,
 921,
 913,
 925,
 921,
 945,
 947,
 948,
 963,
 976,
 974,
 980,
 981,
 982,
 978,
 982,
 988,
 985,
 995,
 994,
 981,
 985,
 980,
 984,
 999,
 1001,
 1002,
 1020,
 1021,
 1035,
 1044,
 1040,
 1060,
 1074,
 1075,
 1078,
 1056,
 1062,
 1059,
 1060,
 1058,
 1063,
 1066,
 1068,
 1069,
 1068,
 1082,
 1081,
 1082,
 1086,
 1075,
 1087,
 1085,
 1087,
 1097,
 1096,
 1098,
 1093,
 1102,
 1114,
 1119,
 1128,
 1127,
 1112,
 1113,
 1112,
 1114,
 1133,
 1138,
 1137,
 1144,
 1146,
 1144,
 1145,
 1148,
 1143,
 1150,
 1151,
 1153,
 1152,
 1153,
 1134,
 1124,
 1146,
 1145,
 1140,
 1143,
 1144,
 1143,
 1144,
 1148,
 1149,
 1151,
 1153,
 1152,
 1151,
 1155,
 1156,
 1155,
 1152,
 1187,
 1182,
 1201,
 1206,
 1211,
 1204,
 1205,
 1204,
 1203,
 1205,
 1206,
 1187,
 1188,
 1196,
 1206,
 1205,
 1208,
 1201,
 1218,
 1212,
 1220,
 1201,
 1204,
 1210,
 1228,
 1234,
 1237,
 1225,
 1224,
 1223,
 1207,
 1208,
 1207,
 1213,
 1192,
 1200,
 1198,
 1209,
 1197,
 1209,
 1215,
 1193,
 1234,
 1233,
 1216,
 1213,
 1235,
 1239,
 1237,
 1231,
 1235,
 1240,
 1253,
 1268,
 1270,
 1279,
 1278,
 1280,
 1285,
 1319,
 1323,
 1324,
 1329,
 1324,
 1330,
 1334,
 1308,
 1312,
 1308,
 1307,
 1286,
 1288,
 1294,
 1322,
 1325,
 1336,
 1324,
 1330,
 1331,
 1328,
 1342,
 1341,
 1343,
 1345,
 1351,
 1352,
 1358,
 1357,
 1363,
 1362,
 1358,
 1385,
 1384,
 1395,
 1394,
 1395,
 1402,
 1409,
 1377,
 1378,
 1340,
 1341,
 1339,
 1338,
 1335,
 1348,
 1351,
 1363,
 1358,
 1359,
 1335,
 1347,
 1337,
 1340,
 1339,
 1329,
 1340,
 1334,
 1337,
 1339,
 1340,
 1341,
 1345,
 1346,
 1349,
 1344,
 1345,
 1346,
 1354,
 1340,
 1315,
 1319,
 1321,
 1320,
 1333,
 1334,
 1328,
 1318,
 1309,
 1304,
 1324,
 1339,
 1314,
 1313,
 1310,
 1311,
 1314,
 1316,
 1317,
 1318,
 1319,
 1320,
 1328,
 1337,
 1350,
 1353,
 1347,
 1349,
 1338,
 1339,
 1336,
 1344,
 1329,
 1320,
 1322,
 1343,
 1346,
 1350,
 1306,
 1308,
 1306,
 1303,
 1320,
 1321,
 1320,
 1321,
 1320,
 1330,
 1328,
 1334,
 1350,
 1349,
 1348,
 1350,
 1347,
 1350,
 1351,
 1358,
 1356,
 1364,
 1374,
 1375,
 1354,
 1351,
 1360,
 1364,
 1348,
 1361,
 1356,
 1357,
 1354,
 1357,
 1352,
 1334,
 1335,
 1330,
 1355,
 1354,
 1353,
 1354,
 1355,
 1361,
 1360,
 1358,
 1356,
 1359,
 1371,
 1372,
 1378,
 1377,
 1376,
 1355,
 1357,
 1355,
 1356,
 1357,
 1364,
 1378,
 1379,
 1380,
 1374,
 1381,
 1389,
 1396,
 1402,
 1403,
 1384,
 1386,
 1387,
 1409,
 1413,
 1419,
 1420,
 1421,
 1427,
 1453,
 1456,
 1453,
 1425,
 1427,
 1428,
 1424,
 1420,
 1417,
 1421,
 1412,
 1413,
 1415,
 1414,
 1411,
 1412,
 1413,
 1425,
 1426,
 1440,
 1470,
 1461,
 1466,
 1457,
 1460,
 1494,
 1481,
 1483,
 1482,
 1481,
 1482,
 1481,
 1483,
 1499,
 1485,
 1486,
 1487,
 1488,
 1489,
 1468,
 1472,
 1469,
 1470,
 1479,
 1478,
 1479,
 1485,
 1461,
 1460,
 1456,
 1455,
 1456,
 1455,
 1449,
 1446,
 1448,
 1451,
 1452,
 1439,
 1440,
 1442,
 1448,
 1445,
 1432,
 1433,
 1434,
 1415,
 1420,
 1412,
 1413,
 1419,
 1420,
 1405,
 1401,
 1403,
 1377,
 1380,
 1382,
 1383,
 1379,
 1381,
 1403,
 1405,
 1428,
 1429,
 1431,
 1424,
 1415,
 1420,
 1424,
 1429,
 1439,
 1440,
 1438,
 1440,
 1448,
 1442,
 1441,
 1439,
 1441,
 1442,
 1444,
 1449,
 1450,
 1449,
 1446,
 1477,
 1466,
 1467,
 1496,
 1503,
 1529,
 1538,
 1539,
 1528,
 1558,
 1560,
 1561,
 1573,
 1587,
 1569,
 1566,
 1572,
 1577,
 1585,
 1602,
 1603,
 1606,
 1581,
 1598,
 1599,
 1593,
 1598,
 1595,
 1604,
 1607,
 1606,
 1607,
 1605,
 1614,
 1629,
 1636,
 1638,
 1656,
 1664,
 1668,
 1671,
 1687,
 1683,
 1700,
 1703,
 1706,
 1720,
 1719,
 1718,
 1720,
 1701,
 1700,
 1701,
 1702,
 1704,
 1707,
 1700,
 1712,
 1708,
 1712,
 1729,
 1728,
 1729,
 1730,
 1738,
 1741,
 1730,
 1733,
 1730,
 1729,
 1726,
 1728,
 1745,
 1755,
 1754,
 1755,
 1760,
 1753,
 1747,
 1746,
 1747,
 1749,
 1750,
 1748,
 1749,
 1743,
 1745,
 1754,
 1757,
 1763,
 1766,
 1775,
 1773,
 1774,
 1773,
 1746,
 1747,
 1732,
 1730,
 1709,
 1721,
 1727,
 1718,
 1717,
 1701,
 1700,
 1701,
 1705,
 1712,
 1723,
 1724,
 1725,
 1720,
 1727,
 1728,
 1746,
 1744,
 1760,
 1748,
 1747,
 1746,
 1771,
 1786,
 1784,
 1786,
 1783,
 1795,
 1793,
 1794,
 1808,
 1793,
 1808,
 1811,
 1807,
 1808,
 1806,
 1841,
 1860,
 1861,
 1840,
 1839,
 1831,
 1836,
 1829,
 1818,
 1816,
 1817,
 1846,
 1835,
 1827,
 1815,
 1816,
 1832,
 1831,
 1830,
 1831,
 1829,
 1828,
 1829,
 1831,
 1830,
 1838,
 1852,
 1853,
 1851,
 1865,
 1866,
 1889,
 1890,
 1888,
 1887,
 1879,
 1859,
 1860,
 1863,
 1867,
 1868,
 1860,
 1872,
 1873,
 1881,
 1895,
 1893,
 1892,
 1899,
 1901,
 1907,
 1916,
 1906,
 1916,
 1917,
 1928,
 1933,
 1921,
 1924,
 1925,
 1935,
 1952,
 1953,
 1959,
 1960,
 1958,
 1962,
 1988,
 1995,
 1985,
 1988,
 1986,
 1989,
 2003,
 2004,
 2009,
 2011,
 2020,
 2021,
 2040,
 2039,
 2024,
 2029,
 2030,
 2037,
 2038,
 2037,
 2040,
 2038,
 2042,
 2045,
 2046,
 2051,
 2046,
 2045,
 2034,
 2033,
 2011,
 2015,
 2025,
 2011,
 2012,
 2011,
 1993,
 2007,
 1999,
 1975,
 1970,
 1985,
 1990,
 1989,
 1986,
 1989,
 1991,
 1995,
 1978,
 1976,
 1956,
 1958,
 1945,
 1930,
 1933,
 1931,
 1926,
 1937,
 1936,
 1935,
 1942,
 1936,
 1934,
 1918,
 1919,
 1923,
 1929,
 1935,
 1952,
 1961,
 1959,
 1960,
 1947,
 1948,
 1949,
 1946,
 1944,
 1961,
 1929,
 1932,
 1944,
 1933,
 1928,
 1920,
 1889,
 1894,
 1886,
 1906,
 1900,
 1895,
 1890,
 1901,
 1904,
 1903,
 1898,
 1921,
 1922,
 1931,
 1933,
 1939,
 1940,
 1939,
 1927,
 1920,
 1934,
 1947,
 1946,
 1956,
 1955,
 1949,
 1951,
 1953,
 1951,
 1949,
 1952,
 1942,
 1945,
 1933,
 1934,
 1917,
 1927,
 1934,
 1913,
 1914,
 1911,
 1912,
 1920,
 1919,
 1915,
 1917,
 1943,
 1951,
 1952,
 1945,
 1950,
 1929,
 1926,
 1933,
 1935,
 1949,
 1947,
 1966,
 1967,
 1945,
 1972,
 1985,
 1962,
 1964,
 1956,
 1942,
 1943,
 1937,
 1936,
 1933,
 1941,
 1949,
 1965,
 1968,
 1969,
 1970,
 1957,
 1956,
 1957,
 1962,
 1939,
 1942,
 1957,
 1956,
 1961,
 1960,
 1959,
 1956,
 1957,
 1983,
 1981,
 1979,
 1976,
 1969,
 1974,
 1952,
 1938,
 1952,
 1955,
 1952,
 1958,
 1952,
 1964,
 1965,
 1956,
 1959,
 1960,
 1962,
 1961,
 1960,
 1967,
 1968,
 1979,
 1989,
 1990,
 1993,
 2004,
 2003,
 2012,
 2006,
 1994,
 1998,
 1988,
 1991,
 1987,
 1986,
 1987,
 1985,
 1982,
 1985,
 1988,
 1990,
 1984,
 1978,
 1967,
 1978,
 1990,
 1984,
 1985,
 1984,
 1985,
 2009,
 2007,
 2000,
 1992,
 2012,
 2011,
 2020,
 2021,
 2022,
 2017,
 2000,
 1975,
 1989,
 1988,
 1975,
 1954,
 1955,
 1947,
 1954,
 1971,
 1970,
 1973,
 1981,
 1982,
 1984,
 1996,
 1992,
 1994,
 1996,
 1997,
 2001,
 1998,
 2000,
 1998,
 1997,
 1999,
 2007,
 2001,
 2007,
 2005,
 2003,
 2001,
 2003,
 1999,
 1997,
 1980,
 1981,
 1999,
 2005,
 2011,
 2016,
 2017,
 2026,
 2027,
 2020,
 2021,
 2023,
 2024,
 2025,
 2024,
 2025,
 2029,
 2033,
 2035,
 2039,
 2051,
 2052,
 2054,
 2065,
 2082,
 2084,
 2101,
 2097,
 2096,
 2097,
 2092,
 2104,
 2105,
 2101,
 2092,
 2094,
 2100,
 2101,
 2095,
 2096,
 2093,
 2118,
 2116,
 2152,
 2161,
 2162,
 2163,
 2165,
 2174,
 2163,
 2183,
 2187,
 2155,
 2156,
 2158,
 2162,
 2155,
 2148,
 2147,
 2149,
 2148,
 2142,
 2144,
 2140,
 2129,
 2132,
 2133,
 2137,
 2143,
 2140,
 2150,
 2135,
 2134,
 2133,
 2136,
 2145,
 2136,
 2137,
 2140,
 2141,
 2118,
 2125,
 2106,
 2104,
 2089,
 2088,
 2076,
 2063,
 2060,
 2054,
 2047,
 2046,
 2047,
 2050,
 2051,
 2046,
 2051,
 2061,
 2060,
 2066,
 2068,
 2072,
 2073,
 2083,
 2098,
 2101,
 2096,
 2098,
 2099,
 2103,
 2093,
 2092,
 2111,
 2129,
 2152,
 2159,
 2155,
 2163,
 2155,
 2158,
 2163,
 2166,
 2170,
 2161,
 2155,
 2159,
 2147,
 2146,
 2154,
 2165,
 2172,
 2163,
 2179,
 2182,
 2180,
 2168,
 2172,
 2179,
 2181,
 2183,
 2176,
 2147,
 2170,
 2172,
 2173,
 2153,
 2158,
 2140,
 2135,
 2136,
 2134,
 2130,
 2134,
 2156,
 2161,
 2162,
 2163,
 2149,
 2150,
 2159,
 2160,
 2161,
 2178,
 2185,
 2183,
 2158,
 2173,
 2168,
 2170,
 2165,
 2181,
 2173,
 2175,
 2178,
 2183,
 2185,
 2184,
 2189,
 2202,
 2203,
 2191,
 2176,
 2177,
 2163,
 2150,
 2159,
 2158,
 2153,
 2139,
 2136,
 2135,
 2143,
 2155,
 2166,
 2171,
 2183,
 2190,
 2180,
 2183,
 2165,
 2166,
 2167,
 2168,
 2160,
 2161,
 2174,
 2175,
 2172,
 2176,
 2198,
 2205,
 2210,
 2211,
 2223,
 2249,
 2254,
 2267,
 2260,
 2263,
 2256,
 2258,
 2265,
 2278,
 2279,
 2278,
 2271,
 2273,
 2278,
 2279,
 2272,
 2274,
 2286,
 2273,
 2279,
 2278,
 2264,
 2263,
 2264,
 2274,
 2287,
 2308,
 2309,
 2310,
 2305,
 2304,
 2303,
 2305,
 2317,
 2316,
 2318,
 2319,
 2320,
 2322,
 2326,
 2335,
 2359,
 2351,
 2353,
 2354,
 2356,
 2341,
 2338,
 2333,
 2334,
 2333,
 2344,
 2334,
 2344,
 2323,
 2341,
 2325,
 2317,
 2327,
 2323,
 2321,
 2312,
 2297,
 2302,
 2304,
 2315,
 2308,
 2317,
 2330,
 2350,
 2360,
 2341,
 2342,
 2341,
 2342,
 2357,
 2363,
 2353,
 2355,
 2352,
 2354,
 2360,
 2361,
 2348,
 2354,
 2355,
 2345,
 2346,
 2347,
 2360,
 2358,
 2360,
 2361,
 2364,
 2365,
 2354,
 2361,
 2362,
 2373,
 2375,
 2373,
 2365,
 2346,
 2362,
 2359,
 2357,
 2373,
 2397,
 2398,
 2394,
 2396,
 2401,
 2421,
 2414,
 2420,
 2406,
 2407,
 2403,
 2402,
 2401,
 2397,
 2396,
 2420,
 2444,
 2446,
 2428,
 2427,
 2428,
 2431,
 2429,
 2433,
 2463,
 2487,
 2495,
 2524,
 2535,
 2542,
 2552,
 2575,
 2573,
 2574,
 2568,
 2576,
 2583,
]

pt 1 :: depth deltas

depth_readings
|> Enum.reduce(%{count: 0}, fn (depth, worksheet) ->
  case worksheet[:prior] do
    prior_reading when is_number(prior_reading) and depth > prior_reading ->
      Map.merge(worksheet, %{prior: depth, count: worksheet[:count] + 1})
    _ ->
      Map.merge(worksheet, %{prior: depth})
  end
end)
|> Map.get(:count)

pt 2 :: 3-reading windows

depth_readings
|> Enum.reduce(%{count: 0}, fn (a, worksheet) ->
  case worksheet do
    %{ b: b, c: c, prior: prior } when (a + b + c) > prior ->
      Map.merge(worksheet, %{b: a, c: b, prior: a + b + c, count: worksheet[:count] + 1})
    %{ b: b, c: c } ->
      Map.merge(worksheet, %{b: a, c: b, prior: a + b + c})
    %{ b: b } ->
      Map.merge(worksheet, %{b: a, c: b})
    _ ->
      Map.merge(worksheet, %{b: a})
  end
end)
|> Map.get(:count)

Day 2 :: Piloting the sub

input :: commands

Click to see raw data
commands = [
  {"forward", 7},
  {"forward", 9},
  {"forward", 3},
  {"down", 5},
  {"down", 9},
  {"forward", 6},
  {"down", 2},
  {"forward", 2},
  {"forward", 8},
  {"forward", 3},
  {"forward", 5},
  {"forward", 5},
  {"forward", 8},
  {"down", 6},
  {"forward", 8},
  {"forward", 2},
  {"up", 8},
  {"down", 8},
  {"forward", 6},
  {"down", 4},
  {"down", 5},
  {"forward", 2},
  {"down", 6},
  {"forward", 7},
  {"down", 9},
  {"forward", 9},
  {"down", 2},
  {"down", 7},
  {"up", 6},
  {"up", 3},
  {"up", 7},
  {"down", 9},
  {"forward", 1},
  {"forward", 1},
  {"down", 4},
  {"down", 9},
  {"forward", 4},
  {"up", 4},
  {"forward", 8},
  {"forward", 9},
  {"down", 7},
  {"down", 4},
  {"up", 6},
  {"down", 8},
  {"down", 2},
  {"forward", 8},
  {"forward", 6},
  {"down", 3},
  {"forward", 2},
  {"forward", 6},
  {"down", 3},
  {"forward", 1},
  {"forward", 8},
  {"down", 8},
  {"down", 9},
  {"forward", 5},
  {"forward", 4},
  {"forward", 8},
  {"down", 7},
  {"forward", 4},
  {"forward", 3},
  {"forward", 6},
  {"down", 3},
  {"forward", 6},
  {"forward", 6},
  {"down", 9},
  {"down", 9},
  {"down", 9},
  {"down", 2},
  {"down", 7},
  {"down", 4},
  {"forward", 3},
  {"up", 7},
  {"up", 3},
  {"down", 1},
  {"forward", 4},
  {"up", 9},
  {"forward", 4},
  {"forward", 2},
  {"down", 2},
  {"forward", 9},
  {"up", 4},
  {"forward", 5},
  {"down", 8},
  {"up", 7},
  {"down", 5},
  {"down", 1},
  {"up", 7},
  {"up", 4},
  {"forward", 5},
  {"up", 8},
  {"up", 3},
  {"down", 2},
  {"down", 1},
  {"down", 2},
  {"forward", 3},
  {"up", 1},
  {"forward", 1},
  {"forward", 1},
  {"down", 1},
  {"down", 6},
  {"down", 6},
  {"up", 4},
  {"down", 4},
  {"down", 4},
  {"forward", 6},
  {"down", 6},
  {"forward", 7},
  {"forward", 5},
  {"up", 7},
  {"down", 9},
  {"down", 6},
  {"forward", 5},
  {"forward", 6},
  {"forward", 2},
  {"down", 4},
  {"forward", 5},
  {"forward", 8},
  {"down", 8},
  {"down", 6},
  {"forward", 2},
  {"forward", 8},
  {"down", 3},
  {"forward", 6},
  {"down", 1},
  {"forward", 5},
  {"down", 8},
  {"up", 1},
  {"forward", 6},
  {"down", 7},
  {"forward", 4},
  {"down", 8},
  {"down", 8},
  {"forward", 8},
  {"down", 6},
  {"down", 3},
  {"forward", 2},
  {"forward", 8},
  {"forward", 9},
  {"forward", 4},
  {"forward", 3},
  {"down", 4},
  {"forward", 3},
  {"down", 9},
  {"down", 1},
  {"forward", 2},
  {"forward", 3},
  {"forward", 7},
  {"down", 1},
  {"forward", 6},
  {"forward", 8},
  {"forward", 6},
  {"forward", 2},
  {"down", 8},
  {"up", 9},
  {"forward", 6},
  {"forward", 8},
  {"down", 7},
  {"down", 5},
  {"up", 4},
  {"forward", 9},
  {"up", 7},
  {"up", 3},
  {"forward", 3},
  {"down", 6},
  {"forward", 4},
  {"forward", 2},
  {"down", 3},
  {"forward", 9},
  {"forward", 5},
  {"up", 7},
  {"down", 9},
  {"up", 4},
  {"down", 3},
  {"forward", 8},
  {"up", 1},
  {"forward", 2},
  {"forward", 8},
  {"forward", 8},
  {"forward", 5},
  {"down", 7},
  {"up", 6},
  {"down", 9},
  {"down", 4},
  {"forward", 2},
  {"down", 5},
  {"down", 2},
  {"down", 2},
  {"forward", 6},
  {"down", 2},
  {"forward", 9},
  {"forward", 1},
  {"up", 1},
  {"forward", 4},
  {"down", 1},
  {"forward", 3},
  {"down", 3},
  {"forward", 4},
  {"up", 5},
  {"up", 3},
  {"forward", 6},
  {"forward", 8},
  {"forward", 2},
  {"forward", 6},
  {"up", 5},
  {"down", 9},
  {"down", 8},
  {"forward", 3},
  {"down", 5},
  {"forward", 8},
  {"forward", 1},
  {"down", 9},
  {"up", 3},
  {"down", 2},
  {"down", 9},
  {"up", 8},
  {"down", 2},
  {"up", 7},
  {"up", 2},
  {"up", 3},
  {"down", 9},
  {"down", 1},
  {"down", 7},
  {"down", 1},
  {"forward", 1},
  {"down", 9},
  {"down", 6},
  {"forward", 3},
  {"up", 7},
  {"up", 8},
  {"down", 5},
  {"down", 6},
  {"up", 2},
  {"forward", 8},
  {"down", 4},
  {"up", 1},
  {"forward", 4},
  {"up", 4},
  {"forward", 2},
  {"down", 4},
  {"forward", 4},
  {"down", 9},
  {"up", 4},
  {"forward", 8},
  {"up", 7},
  {"forward", 1},
  {"down", 3},
  {"up", 7},
  {"forward", 5},
  {"down", 5},
  {"forward", 2},
  {"forward", 7},
  {"forward", 3},
  {"down", 8},
  {"forward", 4},
  {"forward", 9},
  {"up", 2},
  {"down", 4},
  {"down", 5},
  {"forward", 4},
  {"down", 4},
  {"up", 6},
  {"down", 8},
  {"up", 1},
  {"down", 1},
  {"up", 6},
  {"up", 6},
  {"down", 7},
  {"down", 7},
  {"forward", 2},
  {"forward", 4},
  {"forward", 8},
  {"down", 8},
  {"down", 4},
  {"down", 4},
  {"down", 7},
  {"forward", 4},
  {"down", 3},
  {"forward", 5},
  {"forward", 5},
  {"forward", 7},
  {"down", 7},
  {"forward", 1},
  {"down", 8},
  {"up", 4},
  {"up", 9},
  {"up", 3},
  {"up", 6},
  {"forward", 5},
  {"forward", 5},
  {"forward", 4},
  {"forward", 9},
  {"down", 9},
  {"forward", 4},
  {"forward", 1},
  {"up", 8},
  {"up", 2},
  {"down", 9},
  {"up", 4},
  {"forward", 2},
  {"up", 8},
  {"forward", 6},
  {"forward", 2},
  {"up", 9},
  {"down", 3},
  {"forward", 3},
  {"up", 7},
  {"down", 7},
  {"forward", 4},
  {"forward", 7},
  {"forward", 3},
  {"down", 4},
  {"down", 5},
  {"forward", 7},
  {"up", 3},
  {"up", 1},
  {"down", 4},
  {"forward", 6},
  {"down", 1},
  {"forward", 1},
  {"down", 4},
  {"down", 3},
  {"forward", 9},
  {"forward", 4},
  {"down", 9},
  {"down", 3},
  {"forward", 2},
  {"forward", 5},
  {"forward", 6},
  {"down", 3},
  {"forward", 5},
  {"down", 9},
  {"forward", 2},
  {"forward", 9},
  {"down", 7},
  {"down", 4},
  {"down", 3},
  {"down", 1},
  {"up", 2},
  {"forward", 6},
  {"forward", 4},
  {"down", 9},
  {"down", 2},
  {"forward", 2},
  {"forward", 9},
  {"down", 3},
  {"forward", 8},
  {"down", 8},
  {"forward", 5},
  {"down", 4},
  {"forward", 4},
  {"up", 6},
  {"up", 3},
  {"down", 3},
  {"down", 9},
  {"forward", 5},
  {"forward", 8},
  {"down", 2},
  {"forward", 9},
  {"forward", 5},
  {"up", 9},
  {"forward", 2},
  {"forward", 3},
  {"forward", 4},
  {"up", 8},
  {"up", 1},
  {"up", 6},
  {"down", 5},
  {"down", 8},
  {"down", 4},
  {"forward", 6},
  {"up", 2},
  {"forward", 1},
  {"forward", 7},
  {"up", 8},
  {"forward", 5},
  {"up", 9},
  {"forward", 7},
  {"down", 6},
  {"up", 5},
  {"up", 7},
  {"up", 1},
  {"down", 3},
  {"up", 6},
  {"forward", 1},
  {"up", 1},
  {"forward", 2},
  {"forward", 4},
  {"forward", 5},
  {"up", 3},
  {"up", 8},
  {"up", 1},
  {"up", 6},
  {"up", 3},
  {"down", 5},
  {"down", 4},
  {"up", 8},
  {"down", 9},
  {"up", 7},
  {"down", 6},
  {"down", 9},
  {"forward", 5},
  {"forward", 3},
  {"down", 9},
  {"down", 3},
  {"down", 6},
  {"up", 3},
  {"up", 8},
  {"down", 4},
  {"down", 1},
  {"up", 9},
  {"up", 9},
  {"forward", 8},
  {"down", 7},
  {"forward", 1},
  {"forward", 4},
  {"down", 8},
  {"forward", 2},
  {"down", 4},
  {"forward", 7},
  {"forward", 3},
  {"forward", 5},
  {"forward", 1},
  {"up", 2},
  {"down", 9},
  {"down", 5},
  {"up", 6},
  {"down", 3},
  {"forward", 1},
  {"up", 9},
  {"forward", 6},
  {"forward", 1},
  {"forward", 4},
  {"up", 7},
  {"forward", 6},
  {"down", 1},
  {"forward", 9},
  {"forward", 1},
  {"forward", 3},
  {"down", 9},
  {"down", 8},
  {"down", 5},
  {"forward", 4},
  {"down", 7},
  {"up", 1},
  {"forward", 8},
  {"up", 4},
  {"forward", 6},
  {"down", 2},
  {"forward", 4},
  {"forward", 7},
  {"down", 8},
  {"forward", 6},
  {"down", 7},
  {"forward", 7},
  {"up", 7},
  {"forward", 4},
  {"down", 8},
  {"down", 8},
  {"forward", 8},
  {"forward", 6},
  {"down", 9},
  {"down", 8},
  {"down", 6},
  {"down", 2},
  {"down", 4},
  {"forward", 7},
  {"forward", 3},
  {"down", 8},
  {"down", 5},
  {"forward", 2},
  {"down", 9},
  {"down", 7},
  {"up", 1},
  {"up", 5},
  {"forward", 6},
  {"up", 8},
  {"up", 7},
  {"up", 4},
  {"down", 6},
  {"down", 6},
  {"down", 8},
  {"down", 9},
  {"down", 2},
  {"forward", 6},
  {"forward", 6},
  {"forward", 2},
  {"up", 9},
  {"forward", 6},
  {"forward", 9},
  {"forward", 8},
  {"down", 5},
  {"down", 3},
  {"forward", 1},
  {"forward", 8},
  {"forward", 1},
  {"forward", 3},
  {"down", 4},
  {"forward", 5},
  {"forward", 1},
  {"forward", 6},
  {"down", 8},
  {"down", 9},
  {"forward", 3},
  {"forward", 2},
  {"forward", 1},
  {"forward", 3},
  {"up", 7},
  {"down", 7},
  {"down", 2},
  {"forward", 3},
  {"down", 5},
  {"down", 2},
  {"down", 7},
  {"down", 9},
  {"down", 5},
  {"down", 7},
  {"down", 9},
  {"up", 7},
  {"forward", 7},
  {"forward", 9},
  {"forward", 8},
  {"forward", 5},
  {"down", 1},
  {"up", 6},
  {"up", 6},
  {"forward", 5},
  {"up", 6},
  {"down", 8},
  {"up", 6},
  {"forward", 2},
  {"down", 9},
  {"down", 5},
  {"up", 8},
  {"up", 7},
  {"down", 8},
  {"down", 7},
  {"up", 3},
  {"down", 5},
  {"forward", 6},
  {"forward", 2},
  {"down", 6},
  {"forward", 6},
  {"forward", 1},
  {"forward", 5},
  {"forward", 3},
  {"down", 4},
  {"forward", 3},
  {"down", 1},
  {"up", 7},
  {"forward", 3},
  {"forward", 9},
  {"forward", 3},
  {"forward", 4},
  {"down", 9},
  {"forward", 6},
  {"down", 1},
  {"up", 6},
  {"forward", 2},
  {"forward", 1},
  {"down", 2},
  {"down", 1},
  {"down", 9},
  {"forward", 1},
  {"up", 8},
  {"down", 1},
  {"up", 3},
  {"forward", 3},
  {"forward", 1},
  {"up", 6},
  {"down", 1},
  {"down", 7},
  {"down", 2},
  {"forward", 5},
  {"down", 4},
  {"forward", 4},
  {"forward", 9},
  {"down", 7},
  {"forward", 6},
  {"down", 4},
  {"forward", 8},
  {"down", 5},
  {"forward", 6},
  {"down", 6},
  {"down", 6},
  {"down", 9},
  {"forward", 3},
  {"forward", 2},
  {"forward", 7},
  {"forward", 6},
  {"forward", 8},
  {"up", 6},
  {"forward", 7},
  {"down", 2},
  {"up", 4},
  {"forward", 6},
  {"forward", 3},
  {"forward", 9},
  {"down", 1},
  {"forward", 9},
  {"down", 1},
  {"forward", 6},
  {"down", 9},
  {"forward", 7},
  {"forward", 9},
  {"forward", 6},
  {"up", 3},
  {"down", 3},
  {"forward", 3},
  {"up", 1},
  {"down", 8},
  {"forward", 7},
  {"down", 4},
  {"forward", 7},
  {"forward", 7},
  {"down", 1},
  {"forward", 5},
  {"down", 6},
  {"forward", 6},
  {"down", 8},
  {"down", 2},
  {"down", 7},
  {"forward", 9},
  {"forward", 7},
  {"forward", 2},
  {"down", 5},
  {"forward", 7},
  {"forward", 8},
  {"forward", 5},
  {"forward", 5},
  {"up", 1},
  {"down", 1},
  {"up", 4},
  {"forward", 5},
  {"forward", 8},
  {"down", 4},
  {"up", 8},
  {"forward", 8},
  {"up", 2},
  {"down", 1},
  {"down", 9},
  {"up", 9},
  {"down", 9},
  {"forward", 3},
  {"forward", 1},
  {"down", 7},
  {"down", 2},
  {"forward", 5},
  {"up", 7},
  {"forward", 9},
  {"forward", 1},
  {"down", 4},
  {"down", 8},
  {"down", 2},
  {"up", 1},
  {"up", 6},
  {"forward", 9},
  {"down", 3},
  {"down", 2},
  {"forward", 5},
  {"forward", 4},
  {"down", 5},
  {"down", 4},
  {"up", 4},
  {"forward", 4},
  {"down", 3},
  {"up", 3},
  {"down", 7},
  {"down", 7},
  {"forward", 1},
  {"forward", 4},
  {"forward", 7},
  {"forward", 5},
  {"down", 4},
  {"down", 7},
  {"forward", 1},
  {"forward", 9},
  {"down", 4},
  {"forward", 8},
  {"up", 4},
  {"down", 9},
  {"down", 9},
  {"up", 6},
  {"up", 3},
  {"forward", 2},
  {"forward", 3},
  {"up", 7},
  {"forward", 7},
  {"down", 4},
  {"forward", 5},
  {"forward", 5},
  {"up", 2},
  {"down", 5},
  {"down", 9},
  {"forward", 9},
  {"forward", 7},
  {"forward", 1},
  {"up", 5},
  {"up", 5},
  {"forward", 8},
  {"forward", 3},
  {"forward", 2},
  {"down", 4},
  {"down", 6},
  {"down", 2},
  {"forward", 5},
  {"down", 3},
  {"down", 9},
  {"forward", 8},
  {"forward", 7},
  {"forward", 7},
  {"down", 1},
  {"up", 3},
  {"down", 8},
  {"down", 9},
  {"forward", 6},
  {"up", 6},
  {"down", 6},
  {"forward", 2},
  {"forward", 3},
  {"forward", 7},
  {"up", 8},
  {"down", 8},
  {"down", 7},
  {"forward", 2},
  {"down", 2},
  {"up", 7},
  {"up", 9},
  {"forward", 1},
  {"forward", 1},
  {"forward", 1},
  {"forward", 1},
  {"forward", 1},
  {"up", 8},
  {"down", 3},
  {"up", 8},
  {"down", 5},
  {"down", 3},
  {"up", 4},
  {"forward", 4},
  {"down", 3},
  {"down", 4},
  {"down", 3},
  {"up", 3},
  {"down", 3},
  {"up", 2},
  {"up", 6},
  {"down", 9},
  {"down", 6},
  {"up", 8},
  {"up", 7},
  {"down", 1},
  {"down", 7},
  {"down", 3},
  {"forward", 3},
  {"forward", 5},
  {"down", 4},
  {"down", 7},
  {"forward", 1},
  {"forward", 8},
  {"up", 9},
  {"up", 2},
  {"forward", 3},
  {"up", 1},
  {"forward", 7},
  {"down", 7},
  {"down", 5},
  {"forward", 9},
  {"up", 9},
  {"forward", 3},
  {"down", 2},
  {"up", 4},
  {"down", 2},
  {"down", 1},
  {"down", 9},
  {"down", 9},
  {"forward", 3},
  {"forward", 4},
  {"down", 2},
  {"down", 6},
  {"up", 8},
  {"down", 5},
  {"forward", 7},
  {"forward", 4},
  {"up", 3},
  {"forward", 2},
  {"down", 4},
  {"down", 8},
  {"forward", 4},
  {"forward", 6},
  {"forward", 8},
  {"down", 6},
  {"down", 8},
  {"up", 2},
  {"forward", 5},
  {"up", 7},
  {"down", 9},
  {"down", 6},
  {"forward", 7},
  {"up", 3},
  {"down", 9},
  {"forward", 2},
  {"down", 6},
  {"up", 6},
  {"down", 6},
  {"down", 3},
  {"down", 2},
  {"down", 8},
  {"down", 4},
  {"forward", 8},
  {"up", 7},
  {"forward", 9},
  {"forward", 4},
  {"down", 3},
  {"forward", 3},
  {"down", 9},
  {"down", 2},
  {"forward", 2},
  {"forward", 1},
  {"down", 4},
  {"down", 3},
  {"down", 8},
  {"up", 6},
  {"down", 4},
  {"forward", 3},
  {"down", 7},
  {"forward", 8},
  {"down", 7},
  {"forward", 6},
  {"forward", 2},
  {"forward", 7},
  {"forward", 6},
  {"forward", 4},
  {"up", 4},
  {"forward", 2},
  {"down", 4},
  {"down", 2},
  {"forward", 3},
  {"down", 2},
  {"up", 9},
  {"down", 6},
  {"forward", 5},
  {"up", 6},
  {"forward", 1},
  {"up", 1},
  {"down", 3},
  {"up", 4},
  {"forward", 1},
  {"down", 6},
  {"forward", 9},
  {"up", 2},
  {"forward", 4},
  {"up", 9},
  {"up", 5},
  {"down", 5},
  {"forward", 3},
  {"down", 9},
  {"forward", 5},
  {"down", 3},
  {"forward", 7},
  {"forward", 5},
  {"forward", 9},
  {"up", 5},
  {"down", 4},
  {"down", 2},
  {"forward", 9},
  {"down", 3},
  {"down", 8},
  {"down", 9},
  {"forward", 2},
  {"down", 8},
  {"up", 6},
  {"down", 4},
  {"down", 2},
  {"up", 9},
  {"forward", 8},
  {"forward", 8},
  {"down", 8},
  {"forward", 4},
  {"down", 7},
  {"forward", 2},
  {"up", 7},
  {"forward", 7},
  {"down", 4},
  {"forward", 4},
  {"down", 3},
  {"forward", 9},
  {"down", 9},
  {"forward", 6},
  {"down", 5},
  {"down", 9},
  {"up", 5},
  {"forward", 7},
  {"forward", 2},
  {"down", 3},
  {"down", 7},
  {"down", 2},
  {"forward", 3},
  {"down", 4},
  {"up", 3},
  {"down", 1},
  {"forward", 9},
  {"down", 4},
  {"down", 8},
  {"up", 9},
  {"forward", 7},
  {"down", 8},
  {"forward", 9},
  {"down", 2},
  {"up", 2},
  {"down", 1},
  {"down", 1},
  {"forward", 6},
  {"forward", 2},
  {"forward", 3},
  {"down", 5},
  {"down", 1},
  {"down", 1},
  {"up", 4},
  {"forward", 8},
  {"down", 3},
  {"down", 1},
  {"forward", 9},
  {"forward", 7},
  {"forward", 2},
  {"up", 8},
  {"up", 6},
  {"down", 7},
  {"down", 6},
  {"forward", 3},
  {"down", 2},
  {"down", 9},
  {"up", 7},
  {"forward", 5},
  {"up", 9},
  {"down", 9},
  {"down", 4},
  {"down", 8},
  {"down", 5},
  {"down", 8},
  {"down", 8},
  {"forward", 6},
  {"forward", 1},
  {"forward", 4},
  {"forward", 7},
  {"down", 7},
  {"down", 6},
  {"forward", 4},
  {"forward", 7},
  {"forward", 6},
  {"down", 7},
  {"forward", 4},
  {"forward", 9},
  {"up", 3},
  {"forward", 9},
  {"forward", 5},
  {"forward", 1},
  {"up", 2},
  {"down", 1},
  {"down", 5},
  {"forward", 9},
  {"up", 4},
  {"forward", 6},
  {"up", 3},
  {"up", 6},
  {"forward", 8},
  {"down", 6},
  {"forward", 5},
  {"down", 3},
  {"forward", 2},
  {"forward", 7},
  {"down", 4},
  {"up", 8},
  {"forward", 6},
  {"up", 7},
  {"up", 9},
  {"forward", 3},
  {"down", 3},
  {"down", 7},
  {"down", 7},
  {"down", 1},
  {"down", 6},
  {"down", 9},
  {"up", 1},
  {"forward", 6},
  {"forward", 6},
  {"down", 3},
  {"forward", 7},
  {"down", 8},
  {"forward", 1},
  {"down", 7},
  {"down", 4},
  {"down", 3},
  {"down", 4},
  {"down", 4},
  {"forward", 7},
  {"down", 3},
  {"forward", 6},
  {"up", 9},
  {"forward", 3}
]

pt 1 :: depth and distance

%{ distance: distance, depth: depth} = commands
|> Enum.reduce(%{distance: 0, depth: 0}, fn ({dir, amt}, worksheet) ->
  case dir do
    "forward" ->
      Map.merge(worksheet, %{ distance: worksheet[:distance] + amt })
    "down" ->
      Map.merge(worksheet, %{ depth: worksheet[:depth] + amt })
    "up" ->
      Map.merge(worksheet, %{ depth: worksheet[:depth] - amt })
  end
end)

distance * depth

pt 2 :: now add direction

%{ distance: distance, depth: depth} = commands
|> Enum.reduce(%{distance: 0, depth: 0, aim: 0}, fn ({dir, amt}, worksheet) ->
  case dir do
    "forward" ->
      new_distance = worksheet[:distance] + amt
      delta_depth = worksheet[:aim] * amt
      new_depth = worksheet[:depth] + delta_depth
      Map.merge(worksheet, %{ distance: new_distance, depth: new_depth })
    "down" ->
      Map.merge(worksheet, %{ aim: worksheet[:aim] + amt })
    "up" ->
      Map.merge(worksheet, %{ aim: worksheet[:aim] - amt })
  end
end)

distance * depth

Day 3 :: what the digit

input :: digits (list of strings) and zeros_and_ones (list of lists of integers)

Click to see raw data
digits = [
  "011111101011",
  "101001110000",
  "010010001011",
  "011111100101",
  "111110100011",
  "100000010101",
  "001110110111",
  "101101111100",
  "001101110111",
  "010101000101",
  "010001001110",
  "000010001111",
  "011111001000",
  "011011111011",
  "001101110100",
  "011101111010",
  "000101000000",
  "011010101111",
  "010001010010",
  "110010101001",
  "100000011111",
  "001100001011",
  "011100001000",
  "100101100111",
  "111011101101",
  "011001010100",
  "011110010100",
  "010001110001",
  "111001101110",
  "011001110011",
  "101110111100",
  "101101010110",
  "111111100101",
  "001011100100",
  "101000111101",
  "001101100000",
  "101011011110",
  "111110000111",
  "101101010010",
  "001110100100",
  "110010010101",
  "110000011000",
  "000000000100",
  "100101011110",
  "010101110001",
  "110111100111",
  "110110100101",
  "100110000001",
  "001111000011",
  "000100101000",
  "001100111011",
  "001011010011",
  "000110111010",
  "001110011100",
  "100010001100",
  "011010000001",
  "011100001111",
  "110111111101",
  "011100110101",
  "110111010010",
  "010111001110",
  "110100110101",
  "010010011011",
  "100111010000",
  "011100000111",
  "011100011100",
  "100111000011",
  "111111110001",
  "111011001000",
  "001111111011",
  "011001000100",
  "100110010010",
  "000000100111",
  "101011001010",
  "111111101001",
  "011100101011",
  "101110001101",
  "111111010100",
  "100100000010",
  "111100001011",
  "110000011101",
  "110111100110",
  "011100010101",
  "100111001101",
  "101101100001",
  "000101101101",
  "001001001110",
  "101001100000",
  "101010110001",
  "100001010101",
  "100100001001",
  "111101100001",
  "100000010010",
  "000001101010",
  "000110100011",
  "110011111100",
  "111010101110",
  "011110111000",
  "101011110001",
  "100100100001",
  "000000011011",
  "000100000010",
  "101011010110",
  "011001111111",
  "101111010000",
  "100001101011",
  "110111000110",
  "111000110001",
  "100000000101",
  "100010111011",
  "010100011111",
  "100000011101",
  "110011000010",
  "010111111001",
  "011011101111",
  "110011111110",
  "111011010011",
  "000011010100",
  "111010100000",
  "010100101010",
  "101000000011",
  "000101100000",
  "111101100100",
  "111101101101",
  "010000111111",
  "100001000001",
  "000011010110",
  "110001101001",
  "110100011110",
  "000100001000",
  "110010100011",
  "010000010001",
  "000010000100",
  "100001000000",
  "111110100101",
  "001100001111",
  "001001010001",
  "101011110000",
  "101101001111",
  "110001011110",
  "100011011101",
  "100000110100",
  "110011000100",
  "110101001000",
  "100010010001",
  "001011011010",
  "111000101000",
  "111000100100",
  "001001100010",
  "100100011111",
  "011101101100",
  "001011111001",
  "111000001100",
  "100001101010",
  "101001111011",
  "010101100111",
  "010111100101",
  "010000110110",
  "010011001001",
  "011000110110",
  "000000101111",
  "101110111000",
  "100010100010",
  "001101011100",
  "010010001000",
  "011011110010",
  "001001100000",
  "001110010010",
  "011011100001",
  "100101001110",
  "000100001111",
  "100100110001",
  "100100111010",
  "110000010110",
  "110010011110",
  "110100110000",
  "111011011111",
  "000100111001",
  "010111110000",
  "111001100001",
  "001010011100",
  "010000000110",
  "110010010010",
  "101000001001",
  "100111000100",
  "001001111011",
  "111000111000",
  "000110100010",
  "100001101001",
  "000100111101",
  "111111110111",
  "100001000010",
  "000111000100",
  "110101001111",
  "111101011011",
  "100101111110",
  "010110111101",
  "100010101111",
  "111010111011",
  "110000100101",
  "100111011001",
  "110110100111",
  "010011000011",
  "000011010010",
  "100011011110",
  "001000100101",
  "001001111010",
  "110011001111",
  "101010100111",
  "011111010000",
  "110001011101",
  "010010101110",
  "110011111011",
  "011011101011",
  "111110001011",
  "011001000001",
  "101111000110",
  "111100101110",
  "011011001110",
  "010011010001",
  "000101011001",
  "111100101010",
  "010000100001",
  "101010100100",
  "110110011110",
  "111000111110",
  "100111001100",
  "001000100001",
  "110110110011",
  "111110101111",
  "011110111110",
  "000101101110",
  "000011111111",
  "010101111000",
  "010000001100",
  "010111100001",
  "111010110100",
  "001110000001",
  "101100101111",
  "010110100001",
  "011100000110",
  "110001001000",
  "100110101001",
  "001000111010",
  "101100000101",
  "100110011101",
  "011110101101",
  "011100010100",
  "000011100000",
  "000011101111",
  "100100000001",
  "010001100100",
  "001111000110",
  "101001010110",
  "000011101101",
  "111110001100",
  "101011101110",
  "100001010110",
  "111110110010",
  "000101111111",
  "000111101111",
  "011000011001",
  "101101000101",
  "110110111001",
  "111010011000",
  "000100100110",
  "001110011010",
  "001001011000",
  "101001011001",
  "110111000001",
  "000101110101",
  "100001110101",
  "110010100010",
  "001000010011",
  "000011000100",
  "111100000000",
  "011000100001",
  "000111000110",
  "010101011011",
  "001110011011",
  "110011101001",
  "001111101001",
  "010100100101",
  "011111000100",
  "010000011101",
  "010101001100",
  "001011010010",
  "010001011100",
  "011011010011",
  "001000111101",
  "011011101010",
  "001010010001",
  "010101011000",
  "011110100000",
  "010010001100",
  "000010001011",
  "000000001101",
  "001111000001",
  "100111001011",
  "010000001111",
  "010111111111",
  "110000100100",
  "110111001001",
  "111010011101",
  "001000000010",
  "011110010000",
  "111111111110",
  "011011111111",
  "110010110011",
  "001100101111",
  "101011101010",
  "111111000011",
  "101011000100",
  "011001011000",
  "111001000100",
  "001011001100",
  "011010001101",
  "100100011100",
  "111000101111",
  "111010001001",
  "100110000010",
  "100011000110",
  "001101011011",
  "110000011011",
  "010101010000",
  "010100001000",
  "000011010000",
  "110110001110",
  "111001001010",
  "010011111111",
  "010011110111",
  "111100010100",
  "110101101010",
  "100100011001",
  "111101011000",
  "011000001011",
  "101011100100",
  "111011101100",
  "011010011110",
  "000100010111",
  "010101100011",
  "000001000000",
  "001000110110",
  "100000110110",
  "000100101010",
  "010111001111",
  "100100010110",
  "111000011100",
  "111100010000",
  "001100010100",
  "010001011011",
  "111101110110",
  "100011111101",
  "100001010010",
  "011111101100",
  "010110011110",
  "111100011001",
  "110110010110",
  "110011011011",
  "000100100010",
  "111110110110",
  "010110010110",
  "000000111110",
  "110010101000",
  "011100100100",
  "110011100000",
  "001011100110",
  "001000110111",
  "010011001010",
  "001011001110",
  "100010010010",
  "100011000100",
  "110010111000",
  "100010111000",
  "111010000000",
  "010101001110",
  "110100010100",
  "010011010110",
  "111111000110",
  "000110111001",
  "001011000101",
  "110111011001",
  "101001101001",
  "111001111111",
  "111100000100",
  "100100110100",
  "110100000010",
  "000100011011",
  "100101000000",
  "000000000111",
  "101010100001",
  "010011101000",
  "101101101010",
  "011011001111",
  "000001111011",
  "110100011001",
  "111101100010",
  "000001110101",
  "110011000000",
  "100101110111",
  "101000100100",
  "010110011011",
  "001001101011",
  "000100011010",
  "011011000010",
  "001111100000",
  "101111000101",
  "001101111010",
  "010000101101",
  "011100011011",
  "011001011010",
  "010010101101",
  "100101101011",
  "100111011101",
  "111011001111",
  "001010101011",
  "111101011110",
  "010100000111",
  "001101011001",
  "001101000101",
  "101111000001",
  "010100010000",
  "011011111100",
  "110101101011",
  "000000011001",
  "000000101101",
  "101100010010",
  "101110011101",
  "001110010011",
  "001011000111",
  "111101001110",
  "010101101010",
  "001100010000",
  "100101010101",
  "111101110111",
  "001101010001",
  "111001100101",
  "001101101101",
  "111100101000",
  "100001100011",
  "011000011010",
  "101111000111",
  "101000010100",
  "000011001001",
  "111010101101",
  "100110010100",
  "011001111000",
  "001001100110",
  "010100110000",
  "101100001010",
  "111100100001",
  "000110010000",
  "100100000100",
  "011100101000",
  "100111101011",
  "001111100001",
  "111001011001",
  "000000010101",
  "011000010011",
  "100111000010",
  "000100001101",
  "110100010110",
  "001110001111",
  "001101110010",
  "110110101000",
  "100111011010",
  "011001110111",
  "011111011111",
  "101111111100",
  "001100100110",
  "101101111111",
  "010000111101",
  "010000000111",
  "010110000100",
  "111101001000",
  "011101101110",
  "010011011111",
  "000000101100",
  "101011100000",
  "010111111010",
  "111001011000",
  "001000100110",
  "110000001010",
  "110101011011",
  "101001010000",
  "000000110110",
  "000100101100",
  "001000010010",
  "101010010000",
  "011100010001",
  "001100101010",
  "010110001010",
  "011000100110",
  "110001111010",
  "100001011100",
  "010001111010",
  "111101010100",
  "100001111010",
  "000100011000",
  "011110111100",
  "111110010000",
  "000011111100",
  "001010101100",
  "011100001101",
  "101100001101",
  "111010000111",
  "001110100011",
  "100001001110",
  "110011001010",
  "000101111110",
  "111101010010",
  "101000001110",
  "001100111101",
  "111110101010",
  "001101001010",
  "000011110011",
  "000001010110",
  "110111010110",
  "110011111001",
  "110111001110",
  "011100111001",
  "111101100011",
  "010110001000",
  "100100100101",
  "111001110001",
  "001101101011",
  "111000101110",
  "011000100010",
  "001100001010",
  "101001011101",
  "101001000110",
  "101001110100",
  "100010010011",
  "111011110011",
  "011100111101",
  "100110010000",
  "111110001010",
  "101011111010",
  "101110101100",
  "100010100000",
  "110101001011",
  "111001101111",
  "101010110000",
  "110011010110",
  "101001110101",
  "001011011100",
  "111100011110",
  "011000111110",
  "011100111100",
  "001101000011",
  "101110010111",
  "110011101110",
  "001100011100",
  "001100001000",
  "010000010011",
  "110011111000",
  "101010001001",
  "001001110110",
  "111000000010",
  "101110100110",
  "010000000011",
  "100100001000",
  "000000101010",
  "110000111010",
  "000101110111",
  "110101100011",
  "010111101011",
  "010110100100",
  "011010100111",
  "010110111100",
  "011010011100",
  "001110110100",
  "010110100000",
  "010010111100",
  "001001100001",
  "101010000001",
  "100010101011",
  "010011100010",
  "110010001001",
  "111110110101",
  "111001100110",
  "101010011101",
  "000100110100",
  "011000111100",
  "000001011010",
  "100100001010",
  "110010001100",
  "101111001101",
  "011101101001",
  "001011111101",
  "101001011111",
  "111011001110",
  "001000010000",
  "000000000011",
  "011100100000",
  "000101001010",
  "100101100100",
  "101000100101",
  "101011111000",
  "100101111010",
  "100011110110",
  "011110010011",
  "101111110101",
  "000000110000",
  "111101011010",
  "110001110001",
  "100000001110",
  "101101000000",
  "110110010100",
  "100011000111",
  "011000000100",
  "011010110110",
  "100100001100",
  "011000110001",
  "000011010001",
  "011010111111",
  "011110001110",
  "111111000000",
  "000111011001",
  "110100000100",
  "110101000111",
  "011001101010",
  "010000100010",
  "110010000100",
  "011011001010",
  "010100011000",
  "111000100001",
  "011001110010",
  "011111010111",
  "001000110001",
  "110010011101",
  "001110010001",
  "001011011000",
  "000111010000",
  "010010011010",
  "011110110110",
  "010010000010",
  "000000111000",
  "101110101010",
  "110111010001",
  "010010000100",
  "001110010100",
  "101011110011",
  "001000100100",
  "110000110000",
  "100011000101",
  "000011100010",
  "010101111100",
  "110110110100",
  "111110000100",
  "011010110100",
  "001111001111",
  "101010111011",
  "010010000001",
  "001011101101",
  "001001000011",
  "000111100100",
  "100111111000",
  "011111001011",
  "011110101001",
  "101011101101",
  "101110111011",
  "111111101000",
  "110000100011",
  "011101010011",
  "111100000111",
  "011110101000",
  "001000110101",
  "110101111011",
  "010101000001",
  "110111011011",
  "000100000101",
  "011010010101",
  "000111010010",
  "100011001101",
  "001011011011",
  "001001111111",
  "100100110010",
  "101100101000",
  "110111010011",
  "111000011001",
  "100000001111",
  "001001111001",
  "001010010000",
  "011010011111",
  "111100010001",
  "010101001010",
  "000100001011",
  "011110000100",
  "101101110101",
  "011100001010",
  "100110110110",
  "001110111100",
  "010010101010",
  "000101011111",
  "101101010111",
  "100110100000",
  "100110100001",
  "010110010010",
  "011010100010",
  "101001110110",
  "011110000111",
  "001001010010",
  "010011001101",
  "011000011000",
  "101001100011",
  "011111100100",
  "110111110111",
  "010010110001",
  "100111000111",
  "100001100000",
  "100101001001",
  "001010110011",
  "101111110010",
  "111100101100",
  "100011101111",
  "010010111101",
  "010001010101",
  "100011001011",
  "101111100010",
  "101011010011",
  "101111001000",
  "111111111111",
  "101001111101",
  "011111110010",
  "101111010010",
  "011000000010",
  "101110101101",
  "011011100101",
  "111110011111",
  "110101110101",
  "000001011110",
  "110110110111",
  "001001001000",
  "000100111011",
  "011101011111",
  "101110000111",
  "100011100100",
  "011000110011",
  "110100011111",
  "101010001011",
  "000000010011",
  "110101010011",
  "001101010000",
  "011011010101",
  "000101100110",
  "100110001111",
  "100011010101",
  "111100101001",
  "101111010001",
  "000011001000",
  "100110000111",
  "101001111010",
  "000110000110",
  "010100101011",
  "101011111100",
  "000111000010",
  "111000100111",
  "110010101100",
  "111000000100",
  "101101000001",
  "110101001110",
  "001100100100",
  "011000011111",
  "000010111100",
  "100010101010",
  "000001011111",
  "011001100001",
  "010010000111",
  "111100111010",
  "110100011100",
  "101000101111",
  "010110001001",
  "101111100110",
  "101101110110",
  "001010101000",
  "000101110110",
  "101101111001",
  "110000001001",
  "110101100000",
  "011100110110",
  "101110010101",
  "111001101100",
  "101000011011",
  "011001010110",
  "101111011110",
  "001110101111",
  "000100110110",
  "101110100111",
  "001010010100",
  "001000000000",
  "100100001110",
  "101011000010",
  "001011111011",
  "011111100111",
  "100001001100",
  "000001101100",
  "110001101101",
  "010101001001",
  "000000011110",
  "010100111001",
  "011111100010",
  "011000010100",
  "000001111101",
  "011110011101",
  "010001010111",
  "001100110001",
  "101111001010",
  "100100010000",
  "101011101011",
  "011110001001",
  "001101100011",
  "010010100100",
  "111010101010",
  "011010100011",
  "010100011010",
  "001000000110",
  "100011001100",
  "011111000010",
  "111011011101",
  "111101010111",
  "000101011110",
  "101011101001",
  "100111110001",
  "000000011101",
  "100010001010",
  "000000010000",
  "111001100100",
  "101100111000",
  "100011000010",
  "010011010111",
  "011110111101",
  "111000110101",
  "001000001001",
  "111001100111",
  "010001001010",
  "011101110101",
  "001111111111",
  "000101001100",
  "010011010000",
  "000111111101",
  "100101110100",
  "110011110110",
  "100110111101",
  "011011101001",
  "001111101111",
  "110010001110",
  "110100111101",
  "001111101110",
  "100110100100",
  "010011001111",
  "110001011000",
  "100101110010",
  "101101101100",
  "001010111111",
  "111000000111",
  "110100101011",
  "100100000000",
  "100100111101",
  "110110000000",
  "110010010100",
  "111100110000",
  "101110001100",
  "110001111100",
  "111001100000",
  "111011100011",
  "100100011101",
  "000111110111",
  "011011000100",
  "111001101000",
  "000001011011",
  "100000101101",
  "100011010100",
  "010111000000",
  "011111001101",
  "010000101011",
  "110001010110",
  "001101100111",
  "111101111011",
  "000100101001",
  "000000100110",
  "011011111110",
  "001011010001",
  "101110010010",
  "010101101101",
  "100111011011",
  "100001111000",
  "011110011011",
  "001001110011",
  "010100011011",
  "001001110010",
  "111101010101",
  "010111011001",
  "000001001110",
  "010111010110",
  "000000100000",
  "000001101101",
  "001110101000",
  "100100101001",
  "111100001010",
  "110110101010",
  "000101111000",
  "011010100000",
  "100111101111",
  "110000110110",
  "001001000111",
  "100110101011",
  "010011100000",
  "010110011101",
  "111110100111",
  "110000000001",
  "011101001101",
  "101110100100",
  "011110011010",
  "000111001110",
  "110100001100",
  "110011011000",
  "000001010010",
  "011111010010",
  "011111010101",
  "000101110011",
  "111001011111",
  "001111110101",
  "110111000011",
  "001011101100",
  "110010000000",
  "100001011010",
  "001111110111",
  "111110011110",
  "110111100001",
  "001010000001",
  "110111101110",
  "001100000110",
  "000110001001",
  "110001101110",
  "111110101001",
  "111101101111",
  "010110110100",
  "100101011010",
  "011111110110",
  "001110111001",
  "011000101110",
  "010001010001",
  "101000000000",
  "001010000110",
  "011110111001",
  "010000001011",
  "101110110101",
  "100011011001",
  "000100111000",
  "011000111111",
  "010010100010",
  "101100110110",
  "011001010101",
  "111000001101",
  "111101011101",
  "111011010101",
  "101100101110",
  "100101010001",
  "001011000001",
  "101110111010",
  "100010110100",
  "010011001100",
  "100001100110",
  "000101010111",
  "001110110010",
  "100100010101",
  "000100100000",
  "100101101101",
  "010101000011",
  "000100011101",
  "101000001100",
  "111111101111",
  "110000111011",
  "001011100010",
  "100100101100",
  "011011100110",
  "101010110101",
  "000111110100",
  "101111100100",
  "001001111101",
  "010000111000",
  "000000101000",
  "001000010111",
  "001011010000",
  "110010111011",
  "100111101101",
  "011100111011",
  "101100101001",
  "010010000011",
  "100110001110",
  "101000011100",
  "010111001000",
  "011111111001",
  "010100111111",
  "011000110111",
  "000001100101",
  "100101100010",
  "001111110000",
  "100000011011"
]

zeros_and_ones = digits
|> Enum.map(fn (n) ->  Enum.map(String.codepoints(n), &String.to_integer/1) end)

pt 1 :: power consumption

helpers

defmodule AOC.Diagnostics do
  def to_decimal(n) do
    n
    |> Enum.reduce("", &(&2 <> Integer.to_string(&1)))
    |> Integer.parse(2)
    |> elem(0)
  end
end

solution

halfway = Enum.count(digits) / 2

count_of_ones_by_position = zeros_and_ones
|> Enum.reduce([0,0,0,0,0,0,0,0,0,0,0,0], fn
  (digits, counts) ->
    Enum.zip_with([digits, counts], fn [x, y] -> x + y end)
end)

gamma_rate = count_of_ones_by_position
|> Enum.map(&(if &1 > halfway, do: 1, else: 0))
|> AOC.Diagnostics.to_decimal

epsilon_rate = count_of_ones_by_position
|> Enum.map(&(if &1 < halfway, do: 1, else: 0))
|> AOC.Diagnostics.to_decimal

gamma_rate * epsilon_rate

pt 2 :: is life supported?

helpers

defmodule AOC.LifeSupport do
  def winnow_by(numbers, strategy) do
    filter = filter_digit_for_index(numbers, 0, strategy)
    winnow_by(numbers, filter, 0, strategy)
  end

  # hooray, we found it
  defp winnow_by([number], _, _, _), do: number

  defp winnow_by(numbers, filter, index, strategy) do
    keepers = numbers
    |> Enum.group_by(&(Enum.at(&1, index)))
    |> Map.get(filter)

    next_index = index + 1
    next_filter = filter_digit_for_index(keepers, next_index, strategy)

    winnow_by(keepers, next_filter, next_index, strategy)
  end

  defp filter_digit_for_index([_], _, _), do: :eureka!

  defp filter_digit_for_index(numbers, index, :most_common) do
    numbers
    |> Enum.map(&(Enum.at(&1, index)))
    |> Enum.sum()
    |> then(&(if &1 >= (length(numbers) / 2), do: 1, else: 0))
  end

  defp filter_digit_for_index(numbers, index, :least_common) do
    numbers
    |> Enum.map(&(Enum.at(&1, index)))
    |> Enum.sum()
    |> then(&(if &1 >= (length(numbers) / 2), do: 0, else: 1))
  end
end

solution

oxygen_generator_rating = zeros_and_ones
|> AOC.LifeSupport.winnow_by(:most_common_bits)
|> AOC.Diagnostics.to_decimal()

co2_scrubber_rating = zeros_and_ones
|> AOC.LifeSupport.winnow_by(:least_common_bits)
|> AOC.Diagnostics.to_decimal()

oxygen_generator_rating * co2_scrubber_rating

Day 4 :: bingo

For this one I did somewhat heavy input cleaning. The cards came in as plain text matrices like this:

17 45 62 28 73
39 12 0 52 5
87 48 50 85 44
66 57 78 94 3
91 37 69 16 1

After a few vim-style keyboard macros, they had been massaged into syntactically valid lists of lists of {number, boolean} tuples (representing the number and whether it’s been called yet), like this:

[
  [{17, false}, {45, false}, {62, false}, {28, false}, {73, false}],
  [{39, false}, {12, false}, {0, false}, {52, false}, {5, false}],
  [{87, false}, {48, false}, {50, false}, {85, false}, {44, false}],
  [{66, false}, {57, false}, {78, false}, {94, false}, {3, false}],
  [{91, false}, {37, false}, {69, false}, {16, false}, {1, false}]
],

Now, onto the code.

input :: calls and cards

Click to see raw data
calls = [76,69,38,62,33,48,81,2,64,21,80,90,29,99,37,15,93,46,75,0,89,56,58,40,92,47,8,6,54,96,12,66,83,4,70,19,17,5,50,52,45,51,18,27,49,71,28,86,74,77,11,20,84,72,23,31,16,78,91,65,87,79,73,94,24,68,63,9,88,82,30,42,60,13,67,85,44,59,7,53,22,1,26,41,61,55,43,39,3,35,25,34,57,10,14,32,97,95,36,98]

cards = [
  [[{17, false}, {45, false}, {62, false}, {28, false}, {73, false}],
   [{39, false}, {12, false}, {0, false}, {52, false},  {5, false}],
   [{87, false}, {48, false}, {50, false}, {85, false}, {44, false}],
   [{66, false}, {57, false}, {78, false}, {94, false}, {3, false}],
   [{91, false}, {37, false}, {69, false}, {16, false}, {1, false}]],

  [[{1, false}, {67, false}, {4, false}, {58, false}, {13, false}],
   [{25, false}, {54, false}, {34, false}, {63, false}, {87, false}],
   [{59, false}, {70, false}, {66, false}, {72, false}, {71, false}],
   [{33, false}, {17, false}, {8, false}, {20, false}, {85, false}],
   [{69, false}, {46, false}, {50, false}, {41, false}, {88, false}]],

  [[{47, false}, {63, false}, {80, false}, {15, false}, {90, false}],
   [{24, false}, {1, false}, {40, false}, {94, false}, {13, false}],
   [{56, false}, {62, false}, {74, false}, {81, false}, {95, false}],
   [{43, false}, {88, false}, {37, false}, {99, false}, {22, false}],
   [{57, false}, {52, false}, {33, false}, {84, false}, {49, false}]],

  [[{33, false}, {58, false}, {54, false}, {28, false}, {10, false}],
   [{7, false}, {82, false}, {97, false}, {66, false}, {92, false}],
   [{95, false}, {77, false}, {5, false}, {86, false}, {84, false}],
   [{85, false}, {91, false}, {94, false}, {21, false}, {69, false}],
   [{23, false}, {12, false}, {13, false}, {98, false}, {46, false}]],

  [[{1, false}, {63, false}, {58, false}, {23, false}, {0, false}],
   [{67, false}, {14, false}, {45, false}, {42, false}, {32, false}],
   [{48, false}, {64, false}, {83, false}, {10, false}, {13, false}],
   [{74, false}, {16, false}, {3, false}, {79, false}, {46, false}],
   [{44, false}, {52, false}, {95, false}, {25, false}, {6, false}]],

  [[{93, false}, {47, false}, {5, false}, {96, false}, {28, false}],
   [{88, false}, {76, false}, {70, false}, {0, false}, {72, false}],
   [{77, false}, {1, false}, {36, false}, {54, false}, {9, false}],
   [{14, false}, {17, false}, {75, false}, {64, false}, {15, false}],
   [{79, false}, {66, false}, {61, false}, {78, false}, {26, false}]],

  [[{23, false}, {75, false}, {96, false}, {71, false}, {76, false}],
   [{63, false}, {59, false}, {39, false}, {65, false}, {36, false}],
   [{95, false}, {21, false}, {67, false}, {41, false}, {74, false}],
   [{9, false}, {97, false}, {4, false}, {2, false}, {49, false}],
   [{32, false}, {17, false}, {81, false}, {0, false}, {56, false}]],

  [[{77, false}, {53, false}, {30, false}, {94, false}, {5, false}],
   [{4, false}, {42, false}, {87, false}, {25, false}, {24, false}],
   [{52, false}, {15, false}, {68, false}, {9, false}, {45, false}],
   [{56, false}, {89, false}, {98, false}, {47, false}, {34, false}],
   [{99, false}, {32, false}, {27, false}, {78, false}, {46, false}]],

  [[{75, false}, {70, false}, {99, false}, {65, false}, {41, false}],
   [{87, false}, {6, false}, {11, false}, {88, false}, {1, false}],
   [{4, false}, {42, false}, {64, false}, {98, false}, {78, false}],
   [{63, false}, {50, false}, {69, false}, {79, false}, {39, false}],
   [{67, false}, {46, false}, {17, false}, {97, false}, {26, false}]],

  [[{26, false}, {73, false}, {6, false}, {79, false}, {47, false}],
   [{67, false}, {51, false}, {64, false}, {16, false}, {60, false}],
   [{8, false}, {1, false}, {61, false}, {76, false}, {39, false}],
   [{13, false}, {57, false}, {48, false}, {65, false}, {46, false}],
   [{63, false}, {83, false}, {4, false}, {92, false}, {71, false}]],

  [[{97, false}, {93, false}, {21, false}, {88, false}, {80, false}],
   [{58, false}, {42, false}, {53, false}, {95, false}, {90, false}],
   [{49, false}, {29, false}, {30, false}, {26, false}, {22, false}],
   [{66, false}, {51, false}, {75, false}, {8, false}, {13, false}],
   [{5, false}, {39, false}, {19, false}, {4, false}, {96, false}]],

  [[{77, false}, {16, false}, {33, false}, {1, false}, {6, false}],
   [{54, false}, {91, false}, {60, false}, {56, false}, {88, false}],
   [{4, false}, {59, false}, {24, false}, {79, false}, {22, false}],
   [{36, false}, {49, false}, {17, false}, {97, false}, {27, false}],
   [{67, false}, {99, false}, {92, false}, {62, false}, {86, false}]],

  [[{78, false}, {18, false}, {59, false}, {74, false}, {54, false}],
   [{79, false}, {68, false}, {23, false}, {51, false}, {85, false}],
   [{47, false}, {42, false}, {92, false}, {58, false}, {12, false}],
   [{30, false}, {97, false}, {19, false}, {26, false}, {15, false}],
   [{1, false}, {62, false}, {94, false}, {65, false}, {70, false}]],

  [[{6, false}, {91, false}, {56, false}, {55, false}, {11, false}],
   [{58, false}, {96, false}, {21, false}, {50, false}, {53, false}],
   [{51, false}, {60, false}, {67, false}, {64, false}, {71, false}],
   [{12, false}, {25, false}, {44, false}, {47, false}, {39, false}],
   [{15, false}, {92, false}, {81, false}, {9, false}, {38, false}]],

  [[{98, false}, {16, false}, {31, false}, {21, false}, {30, false}],
   [{58, false}, {10, false}, {3, false}, {89, false}, {7, false}],
   [{79, false}, {20, false}, {60, false}, {74, false}, {26, false}],
   [{86, false}, {4, false}, {83, false}, {96, false}, {15, false}],
   [{94, false}, {29, false}, {44, false}, {41, false}, {34, false}]],

  [[{50, false}, {75, false}, {83, false}, {20, false}, {52, false}],
   [{65, false}, {85, false}, {41, false}, {78, false}, {38, false}],
   [{31, false}, {64, false}, {86, false}, {32, false}, {10, false}],
   [{25, false}, {82, false}, {13, false}, {61, false}, {22, false}],
   [{11, false}, {73, false}, {4, false}, {77, false}, {24, false}]],

  [[{56, false}, {74, false}, {26, false}, {20, false}, {62, false}],
   [{83, false}, {46, false}, {41, false}, {24, false}, {52, false}],
   [{34, false}, {28, false}, {76, false}, {80, false}, {36, false}],
   [{75, false}, {48, false}, {63, false}, {17, false}, {55, false}],
   [{69, false}, {47, false}, {22, false}, {45, false}, {60, false}]],

  [[{17, false}, {15, false}, {71, false}, {28, false}, {68, false}],
   [{12, false}, {76, false}, {27, false}, {25, false}, {14, false}],
   [{34, false}, {39, false}, {31, false}, {58, false}, {13, false}],
   [{75, false}, {67, false}, {2, false}, {26, false}, {42, false}],
   [{72, false}, {43, false}, {0, false}, {23, false}, {54, false}]],

  [[{37, false}, {43, false}, {18, false}, {76, false}, {47, false}],
   [{96, false}, {1, false}, {80, false}, {77, false}, {27, false}],
   [{13, false}, {89, false}, {16, false}, {4, false}, {6, false}],
   [{74, false}, {92, false}, {55, false}, {99, false}, {38, false}],
   [{19, false}, {75, false}, {52, false}, {85, false}, {81, false}]],

  [[{69, false}, {51, false}, {39, false}, {95, false}, {98, false}],
   [{90, false}, {61, false}, {91, false}, {6, false}, {21, false}],
   [{25, false}, {57, false}, {81, false}, {10, false}, {49, false}],
   [{67, false}, {55, false}, {43, false}, {96, false}, {17, false}],
   [{78, false}, {11, false}, {3, false}, {64, false}, {77, false}]],

  [[{51, false}, {66, false}, {8, false}, {62, false}, {60, false}],
   [{82, false}, {94, false}, {24, false}, {54, false}, {26, false}],
   [{59, false}, {91, false}, {97, false}, {37, false}, {77, false}],
   [{20, false}, {25, false}, {69, false}, {98, false}, {84, false}],
   [{38, false}, {12, false}, {65, false}, {35, false}, {61, false}]],

  [[{7, false}, {26, false}, {91, false}, {84, false}, {17, false}],
   [{23, false}, {52, false}, {86, false}, {19, false}, {24, false}],
   [{58, false}, {44, false}, {5, false}, {32, false}, {40, false}],
   [{6, false}, {27, false}, {89, false}, {76, false}, {92, false}],
   [{33, false}, {10, false}, {90, false}, {83, false}, {82, false}]],

  [[{44, false}, {61, false}, {68, false}, {70, false}, {87, false}],
   [{23, false}, {17, false}, {90, false}, {93, false}, {21, false}],
   [{92, false}, {54, false}, {95, false}, {46, false}, {14, false}],
   [{47, false}, {24, false}, {89, false}, {33, false}, {31, false}],
   [{26, false}, {80, false}, {35, false}, {42, false}, {78, false}]],

  [[{88, false}, {80, false}, {50, false}, {46, false}, {26, false}],
   [{1, false}, {97, false}, {92, false}, {51, false}, {74, false}],
   [{16, false}, {24, false}, {40, false}, {31, false}, {95, false}],
   [{47, false}, {85, false}, {61, false}, {99, false}, {12, false}],
   [{27, false}, {8, false}, {25, false}, {42, false}, {13, false}]],

  [[{8, false}, {59, false}, {37, false}, {87, false}, {44, false}],
   [{62, false}, {0, false}, {67, false}, {39, false}, {92, false}],
   [{79, false}, {81, false}, {54, false}, {24, false}, {93, false}],
   [{56, false}, {84, false}, {23, false}, {18, false}, {34, false}],
   [{72, false}, {68, false}, {29, false}, {11, false}, {91, false}]],

  [[{64, false}, {51, false}, {81, false}, {44, false}, {12, false}],
   [{49, false}, {20, false}, {23, false}, {36, false}, {53, false}],
   [{59, false}, {73, false}, {37, false}, {60, false}, {57, false}],
   [{96, false}, {65, false}, {5, false}, {43, false}, {14, false}],
   [{46, false}, {31, false}, {47, false}, {87, false}, {1, false}]],

  [[{11, false}, {13, false}, {72, false}, {30, false}, {3, false}],
   [{67, false}, {20, false}, {84, false}, {59, false}, {77, false}],
   [{52, false}, {87, false}, {97, false}, {51, false}, {16, false}],
   [{43, false}, {36, false}, {21, false}, {33, false}, {82, false}],
   [{41, false}, {96, false}, {91, false}, {93, false}, {29, false}]],

  [[{7, false}, {31, false}, {19, false}, {87, false}, {94, false}],
   [{92, false}, {68, false}, {18, false}, {57, false}, {23, false}],
   [{5, false}, {88, false}, {81, false}, {86, false}, {10, false}],
   [{99, false}, {50, false}, {37, false}, {33, false}, {25, false}],
   [{97, false}, {22, false}, {0, false}, {53, false}, {91, false}]],

  [[{78, false}, {39, false}, {41, false}, {44, false}, {89, false}],
   [{91, false}, {82, false}, {71, false}, {42, false}, {37, false}],
   [{25, false}, {93, false}, {67, false}, {53, false}, {9, false}],
   [{84, false}, {23, false}, {33, false}, {92, false}, {14, false}],
   [{74, false}, {45, false}, {57, false}, {86, false}, {50, false}]],

  [[{79, false}, {83, false}, {10, false}, {85, false}, {48, false}],
   [{51, false}, {29, false}, {93, false}, {87, false}, {21, false}],
   [{58, false}, {5, false}, {52, false}, {37, false}, {99, false}],
   [{80, false}, {1, false}, {18, false}, {46, false}, {42, false}],
   [{60, false}, {92, false}, {0, false}, {44, false}, {59, false}]],

  [[{79, false}, {76, false}, {54, false}, {14, false}, {42, false}],
   [{57, false}, {11, false}, {39, false}, {66, false}, {33, false}],
   [{86, false}, {62, false}, {27, false}, {61, false}, {26, false}],
   [{48, false}, {68, false}, {47, false}, {99, false}, {46, false}],
   [{78, false}, {90, false}, {9, false}, {36, false}, {98, false}]],

  [[{76, false}, {79, false}, {66, false}, {38, false}, {65, false}],
   [{67, false}, {91, false}, {90, false}, {41, false}, {93, false}],
   [{2, false}, {1, false}, {33, false}, {56, false}, {50, false}],
   [{46, false}, {9, false}, {0, false}, {61, false}, {62, false}],
   [{26, false}, {58, false}, {16, false}, {24, false}, {10, false}]],

  [[{20, false}, {22, false}, {86, false}, {58, false}, {14, false}],
   [{53, false}, {74, false}, {54, false}, {85, false}, {6, false}],
   [{2, false}, {96, false}, {40, false}, {72, false}, {78, false}],
   [{99, false}, {81, false}, {16, false}, {31, false}, {55, false}],
   [{11, false}, {57, false}, {62, false}, {51, false}, {32, false}]],

  [[{8, false}, {51, false}, {73, false}, {40, false}, {88, false}],
   [{83, false}, {35, false}, {37, false}, {98, false}, {27, false}],
   [{3, false}, {42, false}, {15, false}, {14, false}, {33, false}],
   [{2, false}, {38, false}, {52, false}, {82, false}, {71, false}],
   [{67, false}, {55, false}, {9, false}, {66, false}, {53, false}]],

  [[{94, false}, {99, false}, {54, false}, {18, false}, {14, false}],
   [{40, false}, {56, false}, {57, false}, {66, false}, {68, false}],
   [{28, false}, {74, false}, {48, false}, {30, false}, {0, false}],
   [{59, false}, {1, false}, {22, false}, {50, false}, {23, false}],
   [{13, false}, {71, false}, {6, false}, {26, false}, {15, false}]],

  [[{28, false}, {60, false}, {66, false}, {25, false}, {56, false}],
   [{49, false}, {68, false}, {84, false}, {10, false}, {38, false}],
   [{73, false}, {50, false}, {87, false}, {16, false}, {14, false}],
   [{79, false}, {26, false}, {29, false}, {18, false}, {2, false}],
   [{57, false}, {22, false}, {5, false}, {48, false}, {91, false}]],

  [[{61, false}, {78, false}, {3, false}, {95, false}, {87, false}],
   [{6, false}, {62, false}, {25, false}, {74, false}, {84, false}],
   [{22, false}, {71, false}, {93, false}, {57, false}, {20, false}],
   [{81, false}, {33, false}, {15, false}, {45, false}, {96, false}],
   [{38, false}, {14, false}, {19, false}, {72, false}, {26, false}]],

  [[{51, false}, {19, false}, {62, false}, {72, false}, {39, false}],
   [{36, false}, {83, false}, {6, false}, {33, false}, {9, false}],
   [{95, false}, {43, false}, {42, false}, {2, false}, {22, false}],
   [{94, false}, {99, false}, {23, false}, {97, false}, {11, false}],
   [{66, false}, {61, false}, {16, false}, {30, false}, {35, false}]],

  [[{51, false}, {38, false}, {7, false}, {24, false}, {82, false}],
   [{23, false}, {12, false}, {46, false}, {55, false}, {85, false}],
   [{43, false}, {97, false}, {45, false}, {61, false}, {67, false}],
   [{53, false}, {2, false}, {77, false}, {99, false}, {34, false}],
   [{17, false}, {93, false}, {25, false}, {9, false}, {72, false}]],

  [[{37, false}, {32, false}, {35, false}, {63, false}, {93, false}],
   [{40, false}, {16, false}, {51, false}, {99, false}, {88, false}],
   [{73, false}, {69, false}, {49, false}, {80, false}, {33, false}],
   [{56, false}, {54, false}, {18, false}, {87, false}, {71, false}],
   [{29, false}, {98, false}, {85, false}, {58, false}, {17, false}]],

  [[{38, false}, {4, false}, {55, false}, {72, false}, {33, false}],
   [{29, false}, {63, false}, {86, false}, {52, false}, {75, false}],
   [{7, false}, {47, false}, {34, false}, {53, false}, {14, false}],
   [{89, false}, {39, false}, {83, false}, {36, false}, {78, false}],
   [{6, false}, {21, false}, {15, false}, {18, false}, {96, false}]],

  [[{56, false}, {19, false}, {40, false}, {0, false}, {7, false}],
   [{61, false}, {33, false}, {50, false}, {66, false}, {54, false}],
   [{93, false}, {91, false}, {64, false}, {6, false}, {45, false}],
   [{51, false}, {90, false}, {94, false}, {18, false}, {37, false}],
   [{15, false}, {28, false}, {13, false}, {2, false}, {44, false}]],

  [[{18, false}, {79, false}, {4, false}, {56, false}, {15, false}],
   [{38, false}, {80, false}, {8, false}, {42, false}, {5, false}],
   [{60, false}, {11, false}, {53, false}, {23, false}, {27, false}],
   [{9, false}, {71, false}, {19, false}, {83, false}, {72, false}],
   [{39, false}, {97, false}, {98, false}, {99, false}, {7, false}]],

  [[{90, false}, {22, false}, {41, false}, {95, false}, {15, false}],
   [{20, false}, {18, false}, {7, false}, {70, false}, {49, false}],
   [{97, false}, {51, false}, {79, false}, {94, false}, {77, false}],
   [{31, false}, {89, false}, {50, false}, {40, false}, {9, false}],
   [{37, false}, {84, false}, {6, false}, {98, false}, {35, false}]],

  [[{38, false}, {56, false}, {94, false}, {55, false}, {0, false}],
   [{92, false}, {84, false}, {8, false}, {85, false}, {73, false}],
   [{86, false}, {81, false}, {76, false}, {35, false}, {1, false}],
   [{62, false}, {5, false}, {59, false}, {77, false}, {72, false}],
   [{79, false}, {97, false}, {60, false}, {11, false}, {70, false}]],

  [[{43, false}, {98, false}, {87, false}, {97, false}, {70, false}],
   [{53, false}, {55, false}, {35, false}, {8, false}, {64, false}],
   [{80, false}, {59, false}, {75, false}, {11, false}, {2, false}],
   [{17, false}, {95, false}, {13, false}, {38, false}, {90, false}],
   [{31, false}, {20, false}, {60, false}, {84, false}, {4, false}]],

  [[{38, false}, {19, false}, {10, false}, {73, false}, {86, false}],
   [{37, false}, {72, false}, {66, false}, {22, false}, {53, false}],
   [{6, false}, {41, false}, {20, false}, {21, false}, {92, false}],
   [{0, false}, {13, false}, {9, false}, {89, false}, {17, false}],
   [{43, false}, {61, false}, {80, false}, {60, false}, {65, false}]],

  [[{61, false}, {50, false}, {42, false}, {99, false}, {26, false}],
   [{11, false}, {51, false}, {52, false}, {83, false}, {64, false}],
   [{92, false}, {60, false}, {2, false}, {91, false}, {20, false}],
   [{95, false}, {10, false}, {14, false}, {94, false}, {98, false}],
   [{5, false}, {37, false}, {90, false}, {17, false}, {69, false}]],

  [[{82, false}, {48, false}, {51, false}, {32, false}, {78, false}],
   [{30, false}, {39, false}, {10, false}, {84, false}, {69, false}],
   [{94, false}, {5, false}, {60, false}, {92, false}, {89, false}],
   [{95, false}, {31, false}, {64, false}, {67, false}, {23, false}],
   [{96, false}, {20, false}, {33, false}, {66, false}, {61, false}]],

  [[{33, false}, {92, false}, {78, false}, {24, false}, {74, false}],
   [{45, false}, {34, false}, {73, false}, {5, false}, {57, false}],
   [{18, false}, {37, false}, {69, false}, {44, false}, {38, false}],
   [{25, false}, {30, false}, {53, false}, {87, false}, {64, false}],
   [{28, false}, {23, false}, {14, false}, {10, false}, {81, false}]],

  [[{39, false}, {82, false}, {40, false}, {64, false}, {86, false}],
   [{26, false}, {81, false}, {3, false}, {85, false}, {50, false}],
   [{71, false}, {75, false}, {91, false}, {65, false}, {96, false}],
   [{17, false}, {55, false}, {8, false}, {56, false}, {59, false}],
   [{22, false}, {36, false}, {73, false}, {90, false}, {0, false}]],

  [[{18, false}, {67, false}, {50, false}, {70, false}, {71, false}],
   [{83, false}, {8, false}, {75, false}, {55, false}, {29, false}],
   [{66, false}, {33, false}, {39, false}, {88, false}, {16, false}],
   [{32, false}, {84, false}, {78, false}, {59, false}, {0, false}],
   [{11, false}, {3, false}, {61, false}, {65, false}, {36, false}]],

  [[{1, false}, {12, false}, {66, false}, {59, false}, {9, false}],
   [{24, false}, {97, false}, {75, false}, {83, false}, {11, false}],
   [{45, false}, {16, false}, {14, false}, {31, false}, {71, false}],
   [{85, false}, {43, false}, {99, false}, {18, false}, {15, false}],
   [{61, false}, {56, false}, {80, false}, {69, false}, {29, false}]],

  [[{18, false}, {50, false}, {86, false}, {53, false}, {71, false}],
   [{67, false}, {36, false}, {14, false}, {24, false}, {55, false}],
   [{52, false}, {30, false}, {33, false}, {54, false}, {81, false}],
   [{72, false}, {51, false}, {39, false}, {28, false}, {42, false}],
   [{45, false}, {98, false}, {78, false}, {35, false}, {73, false}]],

  [[{60, false}, {86, false}, {68, false}, {58, false}, {37, false}],
   [{17, false}, {78, false}, {43, false}, {31, false}, {96, false}],
   [{33, false}, {61, false}, {34, false}, {45, false}, {36, false}],
   [{10, false}, {29, false}, {83, false}, {98, false}, {2, false}],
   [{88, false}, {73, false}, {7, false}, {84, false}, {50, false}]],

  [[{30, false}, {21, false}, {94, false}, {31, false}, {4, false}],
   [{20, false}, {68, false}, {91, false}, {55, false}, {51, false}],
   [{10, false}, {98, false}, {2, false}, {25, false}, {84, false}],
   [{64, false}, {97, false}, {29, false}, {28, false}, {58, false}],
   [{75, false}, {17, false}, {76, false}, {54, false}, {65, false}]],

  [[{17, false}, {11, false}, {88, false}, {9, false}, {66, false}],
   [{1, false}, {59, false}, {60, false}, {79, false}, {55, false}],
   [{30, false}, {46, false}, {83, false}, {67, false}, {91, false}],
   [{23, false}, {45, false}, {99, false}, {90, false}, {6, false}],
   [{81, false}, {33, false}, {8, false}, {13, false}, {76, false}]],

  [[{25, false}, {68, false}, {43, false}, {59, false}, {51, false}],
   [{56, false}, {14, false}, {41, false}, {52, false}, {16, false}],
   [{62, false}, {36, false}, {12, false}, {37, false}, {71, false}],
   [{83, false}, {90, false}, {81, false}, {91, false}, {0, false}],
   [{95, false}, {92, false}, {29, false}, {54, false}, {26, false}]],

  [[{53, false}, {84, false}, {85, false}, {18, false}, {10, false}],
   [{51, false}, {44, false}, {87, false}, {86, false}, {67, false}],
   [{4, false}, {81, false}, {82, false}, {77, false}, {30, false}],
   [{26, false}, {68, false}, {80, false}, {57, false}, {71, false}],
   [{22, false}, {83, false}, {47, false}, {61, false}, {14, false}]],

  [[{41, false}, {89, false}, {38, false}, {14, false}, {66, false}],
   [{70, false}, {92, false}, {26, false}, {97, false}, {53, false}],
   [{78, false}, {25, false}, {5, false}, {4, false}, {48, false}],
   [{54, false}, {86, false}, {31, false}, {23, false}, {0, false}],
   [{99, false}, {73, false}, {6, false}, {20, false}, {98, false}]],

  [[{18, false}, {81, false}, {96, false}, {60, false}, {47, false}],
   [{59, false}, {87, false}, {95, false}, {15, false}, {57, false}],
   [{34, false}, {17, false}, {26, false}, {7, false}, {42, false}],
   [{25, false}, {90, false}, {45, false}, {94, false}, {5, false}],
   [{10, false}, {41, false}, {32, false}, {20, false}, {98, false}]],

  [[{37, false}, {9, false}, {20, false}, {82, false}, {83, false}],
   [{84, false}, {14, false}, {62, false}, {3, false}, {76, false}],
   [{86, false}, {67, false}, {95, false}, {40, false}, {65, false}],
   [{57, false}, {26, false}, {1, false}, {19, false}, {69, false}],
   [{49, false}, {41, false}, {29, false}, {35, false}, {13, false}]],

  [[{29, false}, {74, false}, {69, false}, {92, false}, {48, false}],
   [{80, false}, {47, false}, {59, false}, {18, false}, {13, false}],
   [{98, false}, {5, false}, {64, false}, {89, false}, {83, false}],
   [{37, false}, {97, false}, {90, false}, {32, false}, {49, false}],
   [{25, false}, {87, false}, {39, false}, {21, false}, {63, false}]],

  [[{1, false}, {61, false}, {5, false}, {82, false}, {66, false}],
   [{87, false}, {75, false}, {18, false}, {23, false}, {63, false}],
   [{38, false}, {51, false}, {33, false}, {59, false}, {4, false}],
   [{21, false}, {14, false}, {17, false}, {97, false}, {92, false}],
   [{94, false}, {45, false}, {84, false}, {22, false}, {10, false}]],

  [[{86, false}, {93, false}, {8, false}, {99, false}, {54, false}],
   [{1, false}, {4, false}, {37, false}, {30, false}, {34, false}],
   [{80, false}, {17, false}, {50, false}, {74, false}, {97, false}],
   [{28, false}, {11, false}, {6, false}, {85, false}, {78, false}],
   [{94, false}, {76, false}, {92, false}, {63, false}, {79, false}]],

  [[{63, false}, {87, false}, {89, false}, {19, false}, {81, false}],
   [{72, false}, {90, false}, {71, false}, {96, false}, {16, false}],
   [{85, false}, {92, false}, {78, false}, {11, false}, {37, false}],
   [{50, false}, {17, false}, {68, false}, {82, false}, {66, false}],
   [{21, false}, {9, false}, {39, false}, {69, false}, {73, false}]],

  [[{30, false}, {63, false}, {90, false}, {5, false}, {45, false}],
   [{26, false}, {15, false}, {28, false}, {84, false}, {65, false}],
   [{1, false}, {23, false}, {0, false}, {12, false}, {17, false}],
   [{61, false}, {98, false}, {21, false}, {39, false}, {56, false}],
   [{67, false}, {51, false}, {3, false}, {8, false}, {42, false}]],

  [[{54, false}, {91, false}, {9, false}, {70, false}, {93, false}],
   [{75, false}, {58, false}, {89, false}, {53, false}, {19, false}],
   [{77, false}, {64, false}, {45, false}, {78, false}, {14, false}],
   [{7, false}, {31, false}, {99, false}, {42, false}, {51, false}],
   [{87, false}, {95, false}, {60, false}, {10, false}, {84, false}]],

  [[{98, false}, {35, false}, {66, false}, {42, false}, {85, false}],
   [{75, false}, {27, false}, {97, false}, {54, false}, {9, false}],
   [{16, false}, {15, false}, {60, false}, {44, false}, {49, false}],
   [{28, false}, {19, false}, {51, false}, {24, false}, {50, false}],
   [{59, false}, {18, false}, {37, false}, {88, false}, {39, false}]],

  [[{69, false}, {29, false}, {49, false}, {9, false}, {76, false}],
   [{4, false}, {83, false}, {64, false}, {33, false}, {2, false}],
   [{67, false}, {81, false}, {88, false}, {70, false}, {39, false}],
   [{85, false}, {73, false}, {97, false}, {15, false}, {8, false}],
   [{7, false}, {13, false}, {26, false}, {12, false}, {1, false}]],

  [[{57, false}, {3, false}, {65, false}, {28, false}, {87, false}],
   [{36, false}, {31, false}, {51, false}, {19, false}, {0, false}],
   [{56, false}, {77, false}, {41, false}, {20, false}, {76, false}],
   [{79, false}, {29, false}, {80, false}, {60, false}, {66, false}],
   [{55, false}, {61, false}, {8, false}, {30, false}, {15, false}]],

  [[{2, false}, {42, false}, {3, false}, {17, false}, {40, false}],
   [{10, false}, {56, false}, {91, false}, {52, false}, {23, false}],
   [{76, false}, {39, false}, {75, false}, {82, false}, {49, false}],
   [{50, false}, {36, false}, {99, false}, {9, false}, {53, false}],
   [{92, false}, {66, false}, {48, false}, {31, false}, {41, false}]],

  [[{16, false}, {51, false}, {80, false}, {95, false}, {23, false}],
   [{36, false}, {84, false}, {33, false}, {56, false}, {11, false}],
   [{49, false}, {46, false}, {32, false}, {78, false}, {85, false}],
   [{67, false}, {29, false}, {94, false}, {26, false}, {22, false}],
   [{76, false}, {6, false}, {30, false}, {37, false}, {0, false}]],

  [[{27, false}, {94, false}, {79, false}, {48, false}, {4, false}],
   [{55, false}, {81, false}, {22, false}, {18, false}, {88, false}],
   [{93, false}, {15, false}, {59, false}, {41, false}, {11, false}],
   [{67, false}, {43, false}, {24, false}, {92, false}, {65, false}],
   [{5, false}, {1, false}, {60, false}, {99, false}, {62, false}]],

  [[{2, false}, {51, false}, {42, false}, {84, false}, {82, false}],
   [{80, false}, {28, false}, {43, false}, {93, false}, {72, false}],
   [{81, false}, {57, false}, {13, false}, {45, false}, {66, false}],
   [{34, false}, {22, false}, {53, false}, {37, false}, {3, false}],
   [{31, false}, {46, false}, {70, false}, {77, false}, {79, false}]],

  [[{17, false}, {12, false}, {22, false}, {53, false}, {74, false}],
   [{23, false}, {49, false}, {52, false}, {60, false}, {40, false}],
   [{64, false}, {98, false}, {97, false}, {75, false}, {57, false}],
   [{58, false}, {81, false}, {85, false}, {89, false}, {92, false}],
   [{42, false}, {34, false}, {65, false}, {87, false}, {18, false}]],

  [[{13, false}, {8, false}, {54, false}, {25, false}, {11, false}],
   [{84, false}, {72, false}, {66, false}, {78, false}, {1, false}],
   [{22, false}, {82, false}, {48, false}, {85, false}, {62, false}],
   [{68, false}, {99, false}, {18, false}, {3, false}, {57, false}],
   [{64, false}, {41, false}, {80, false}, {94, false}, {71, false}]],

  [[{45, false}, {5, false}, {56, false}, {30, false}, {62, false}],
   [{10, false}, {50, false}, {78, false}, {13, false}, {34, false}],
   [{90, false}, {97, false}, {85, false}, {36, false}, {0, false}],
   [{86, false}, {35, false}, {80, false}, {55, false}, {74, false}],
   [{47, false}, {99, false}, {59, false}, {61, false}, {18, false}]],

  [[{79, false}, {87, false}, {81, false}, {45, false}, {95, false}],
   [{24, false}, {91, false}, {27, false}, {18, false}, {16, false}],
   [{51, false}, {35, false}, {34, false}, {46, false}, {48, false}],
   [{39, false}, {40, false}, {6, false}, {70, false}, {99, false}],
   [{1, false}, {82, false}, {63, false}, {32, false}, {50, false}]],

  [[{78, false}, {68, false}, {27, false}, {17, false}, {65, false}],
   [{74, false}, {15, false}, {21, false}, {38, false}, {24, false}],
   [{82, false}, {97, false}, {49, false}, {7, false}, {58, false}],
   [{19, false}, {23, false}, {87, false}, {79, false}, {22, false}],
   [{57, false}, {93, false}, {30, false}, {1, false}, {69, false}]],

  [[{64, false}, {13, false}, {40, false}, {21, false}, {89, false}],
   [{3, false}, {95, false}, {20, false}, {79, false}, {59, false}],
   [{80, false}, {46, false}, {91, false}, {54, false}, {1, false}],
   [{62, false}, {66, false}, {30, false}, {60, false}, {47, false}],
   [{26, false}, {99, false}, {55, false}, {25, false}, {2, false}]],

  [[{47, false}, {83, false}, {7, false}, {71, false}, {81, false}],
   [{9, false}, {72, false}, {12, false}, {20, false}, {96, false}],
   [{28, false}, {57, false}, {82, false}, {98, false}, {42, false}],
   [{34, false}, {59, false}, {18, false}, {69, false}, {1, false}],
   [{68, false}, {38, false}, {46, false}, {19, false}, {80, false}]],

  [[{43, false}, {39, false}, {48, false}, {84, false}, {87, false}],
   [{32, false}, {78, false}, {5, false}, {65, false}, {50, false}],
   [{86, false}, {13, false}, {20, false}, {22, false}, {70, false}],
   [{31, false}, {6, false}, {52, false}, {53, false}, {18, false}],
   [{73, false}, {25, false}, {4, false}, {60, false}, {99, false}]],

  [[{48, false}, {15, false}, {59, false}, {50, false}, {33, false}],
   [{93, false}, {99, false}, {46, false}, {70, false}, {21, false}],
   [{91, false}, {26, false}, {76, false}, {65, false}, {87, false}],
   [{10, false}, {27, false}, {78, false}, {5, false}, {96, false}],
   [{4, false}, {63, false}, {22, false}, {82, false}, {20, false}]],

  [[{88, false}, {63, false}, {66, false}, {48, false}, {37, false}],
   [{39, false}, {47, false}, {56, false}, {52, false}, {27, false}],
   [{81, false}, {18, false}, {33, false}, {12, false}, {59, false}],
   [{3, false}, {96, false}, {55, false}, {26, false}, {43, false}],
   [{42, false}, {4, false}, {7, false}, {28, false}, {22, false}]],

  [[{95, false}, {12, false}, {98, false}, {84, false}, {23, false}],
   [{37, false}, {35, false}, {78, false}, {9, false}, {61, false}],
   [{52, false}, {47, false}, {24, false}, {90, false}, {17, false}],
   [{55, false}, {87, false}, {18, false}, {80, false}, {41, false}],
   [{38, false}, {0, false}, {14, false}, {36, false}, {48, false}]],

  [[{62, false}, {72, false}, {56, false}, {78, false}, {8, false}],
   [{75, false}, {26, false}, {11, false}, {58, false}, {91, false}],
   [{38, false}, {74, false}, {52, false}, {65, false}, {45, false}],
   [{43, false}, {41, false}, {15, false}, {82, false}, {35, false}],
   [{89, false}, {27, false}, {21, false}, {54, false}, {0, false}]],

  [[{43, false}, {36, false}, {85, false}, {68, false}, {60, false}],
   [{26, false}, {89, false}, {84, false}, {10, false}, {80, false}],
   [{87, false}, {50, false}, {75, false}, {81, false}, {35, false}],
   [{12, false}, {46, false}, {6, false}, {70, false}, {59, false}],
   [{93, false}, {51, false}, {66, false}, {33, false}, {49, false}]],

  [[{68, false}, {32, false}, {0, false}, {63, false}, {54, false}],
   [{20, false}, {92, false}, {39, false}, {89, false}, {17, false}],
   [{48, false}, {60, false}, {87, false}, {36, false}, {14, false}],
   [{93, false}, {76, false}, {83, false}, {10, false}, {55, false}],
   [{64, false}, {74, false}, {80, false}, {11, false}, {41, false}]],

  [[{9, false}, {32, false}, {11, false}, {41, false}, {87, false}],
   [{78, false}, {22, false}, {8, false}, {72, false}, {75, false}],
   [{6, false}, {51, false}, {29, false}, {90, false}, {50, false}],
   [{21, false}, {68, false}, {47, false}, {2, false}, {7, false}],
   [{52, false}, {19, false}, {36, false}, {57, false}, {58, false}]],

  [[{83, false}, {36, false}, {25, false}, {31, false}, {99, false}],
   [{86, false}, {29, false}, {47, false}, {77, false}, {38, false}],
   [{13, false}, {51, false}, {20, false}, {59, false}, {27, false}],
   [{74, false}, {50, false}, {9, false}, {11, false}, {44, false}],
   [{52, false}, {95, false}, {81, false}, {2, false}, {70, false}]],

  [[{96, false}, {47, false}, {14, false}, {73, false}, {59, false}],
   [{84, false}, {87, false}, {7, false}, {4, false}, {46, false}],
   [{60, false}, {27, false}, {79, false}, {53, false}, {30, false}],
   [{58, false}, {28, false}, {55, false}, {5, false}, {43, false}],
   [{91, false}, {75, false}, {63, false}, {35, false}, {52, false}]],

  [[{41, false}, {66, false}, {27, false}, {50, false}, {56, false}],
   [{76, false}, {60, false}, {80, false}, {85, false}, {23, false}],
   [{3, false}, {21, false}, {37, false}, {74, false}, {95, false}],
   [{9, false}, {92, false}, {43, false}, {5, false}, {98, false}],
   [{79, false}, {49, false}, {88, false}, {24, false}, {70, false}]],

  [[{59, false}, {18, false}, {57, false}, {90, false}, {13, false}],
   [{79, false}, {29, false}, {12, false}, {2, false}, {0, false}],
   [{84, false}, {58, false}, {38, false}, {77, false}, {96, false}],
   [{33, false}, {89, false}, {43, false}, {11, false}, {44, false}],
   [{93, false}, {23, false}, {98, false}, {60, false}, {51, false}]],

  [[{58, false}, {86, false}, {28, false}, {17, false}, {1, false}],
   [{6, false}, {4, false}, {81, false}, {55, false}, {53, false}],
   [{84, false}, {27, false}, {38, false}, {12, false}, {83, false}],
   [{50, false}, {43, false}, {40, false}, {85, false}, {88, false}],
   [{26, false}, {72, false}, {25, false}, {41, false}, {44, false}]],

  [[{14, false}, {92, false}, {7, false}, {98, false}, {12, false}],
   [{44, false}, {11, false}, {71, false}, {64, false}, {26, false}],
   [{88, false}, {8, false}, {2, false}, {56, false}, {6, false}],
   [{59, false}, {0, false}, {15, false}, {33, false}, {51, false}],
   [{10, false}, {52, false}, {89, false}, {53, false}, {34, false}]],

  [[{52, false}, {4, false}, {5, false}, {63, false}, {50, false}],
   [{15, false}, {8, false}, {60, false}, {70, false}, {13, false}],
   [{33, false}, {79, false}, {21, false}, {39, false}, {34, false}],
   [{84, false}, {91, false}, {30, false}, {12, false}, {71, false}],
   [{61, false}, {31, false}, {41, false}, {9, false}, {66, false}]],

  [[{43, false}, {67, false}, {52, false}, {92, false}, {54, false}],
   [{17, false}, {21, false}, {71, false}, {78, false}, {60, false}],
   [{19, false}, {0, false}, {88, false}, {61, false}, {2, false}],
   [{14, false}, {66, false}, {87, false}, {12, false}, {37, false}],
   [{89, false}, {23, false}, {25, false}, {4, false}, {24, false}]],

  [[{41, false}, {62, false}, {7, false}, {66, false}, {33, false}],
   [{59, false}, {87, false}, {84, false}, {80, false}, {71, false}],
   [{73, false}, {97, false}, {25, false}, {85, false}, {60, false}],
   [{86, false}, {64, false}, {61, false}, {54, false}, {83, false}],
   [{22, false}, {18, false}, {63, false}, {81, false}, {27, false}]],

  [[{92, false}, {89, false}, {50, false}, {11, false}, {73, false}],
   [{41, false}, {48, false}, {62, false}, {80, false}, {78, false}],
   [{46, false}, {55, false}, {81, false}, {16, false}, {94, false}],
   [{97, false}, {45, false}, {5, false}, {13, false}, {40, false}],
   [{14, false}, {75, false}, {22, false}, {42, false}, {2, false}]]]

the bingo engine

defmodule Bingo do
  def first_winning_card_and_call(cards, calls) do
    [call | next_calls] = calls
    results = Enum.map(cards, &(apply_number(&1, call)))
    case Enum.find(results, &winner?/1) do
      nil -> first_winning_card_and_call(results, next_calls)
      winner -> {winner, call}
    end
  end

  def last_winning_card_and_call(cards, calls) do
    [call | next_calls] = calls
    results = Enum.map(cards, &(apply_number(&1, call)))
    case Enum.filter(results, &(!winner?(&1))) do
      [last_at_the_party] -> first_winning_card_and_call([last_at_the_party], next_calls)
      remaining_cards -> last_winning_card_and_call(remaining_cards, next_calls)
    end
  end

  def winner?([
    [a1, a2, a3, a4, a5],
    [b1, b2, b3, b4, b5],
    [c1, c2, c3, c4, c5],
    [d1, d2, d3, d4, d5],
    [e1, e2, e3, e4, e5]
  ] = rows) do
    has_winning_row = Enum.any?(rows, &winning_line/1)
    has_winning_column = [
      [a1, b1, c1, d1, e1],
      [a2, b2, c2, d2, e2],
      [a3, b3, c3, d3, e3],
      [a4, b4, c4, d4, e4],
      [a5, b5, c5, d5, e5]
    ] |> Enum.any?(&winning_line/1)

    has_winning_row || has_winning_column
  end

  # "squares" is any row or column of five squares; however you coerce
  # it into a list is up to you, but that's the expectation.
  defp winning_line(squares) do
    Enum.all?(squares, fn {_, already_selected} -> already_selected end)
  end

  def apply_number(board, number) do
    board
    |> Enum.map(fn row ->
      Enum.map(row, fn
        {num, _} when num == number -> {num, true}
        square -> square
      end)
    end)
  end
end

pt 1 :: who won the bingo game first

{board, call} = Bingo.first_winning_card_and_call(cards, calls)
sum_of_unmarked_numbers = board
|> Enum.reduce(0, fn
  (row, sum) -> Enum.reduce(row, sum, fn
    {n, false}, sum -> sum + n
    _, sum -> sum
  end)
end)

sum_of_unmarked_numbers * call

pt 1 :: who won the bingo game last

{board, call} = Bingo.last_winning_card_and_call(cards, calls)
sum_of_unmarked_numbers = board
|> Enum.reduce(0, fn
  (row, sum) -> Enum.reduce(row, sum, fn
    {n, false}, sum -> sum + n
    _, sum -> sum
  end)
end)

sum_of_unmarked_numbers * call

Day 5 :: go ahead, vent a little

input :: vents

vents = [
  {{644, 38}, {644, 265}},
  {{941, 468}, {941, 89}},
  {{807, 552}, {618, 363}},
  {{896, 510}, {896, 744}},
  {{227, 909}, {227, 745}},
  {{24, 66}, {946, 988}},
  {{563, 529}, {563, 270}},
  {{894, 707}, {359, 172}},
  {{146, 253}, {146, 569}},
  {{544, 683}, {140, 683}},
  {{755, 612}, {755, 463}},
  {{394, 320}, {891, 320}},
  {{68, 616}, {68, 628}},
  {{801, 770}, {801, 942}},
  {{650, 290}, {580, 360}},
  {{376, 18}, {181, 213}},
  {{285, 391}, {805, 911}},
  {{57, 153}, {501, 153}},
  {{686, 301}, {686, 316}},
  {{81, 971}, {683, 369}},
  {{75, 456}, {75, 355}},
  {{769, 59}, {769, 81}},
  {{49, 958}, {49, 718}},
  {{492, 754}, {492, 256}},
  {{606, 133}, {391, 133}},
  {{134, 683}, {134, 656}},
  {{195, 463}, {658, 926}},
  {{982, 498}, {982, 927}},
  {{841, 122}, {889, 74}},
  {{968, 891}, {968, 189}},
  {{104, 941}, {104, 868}},
  {{801, 450}, {272, 979}},
  {{212, 749}, {212, 366}},
  {{880, 928}, {880, 757}},
  {{503, 483}, {283, 263}},
  {{792, 924}, {792, 540}},
  {{58, 87}, {905, 934}},
  {{275, 661}, {36, 422}},
  {{475, 654}, {466, 645}},
  {{34, 946}, {969, 11}},
  {{725, 664}, {725, 150}},
  {{837, 680}, {837, 952}},
  {{109, 987}, {644, 452}},
  {{860, 984}, {860, 691}},
  {{672, 800}, {107, 235}},
  {{216, 888}, {301, 888}},
  {{399, 676}, {718, 357}},
  {{957, 544}, {784, 544}},
  {{677, 743}, {633, 743}},
  {{491, 866}, {77, 452}},
  {{967, 949}, {45, 27}},
  {{659, 699}, {659, 27}},
  {{987, 116}, {696, 116}},
  {{465, 847}, {309, 847}},
  {{353, 19}, {353, 627}},
  {{265, 713}, {592, 386}},
  {{541, 765}, {461, 765}},
  {{21, 409}, {895, 409}},
  {{950, 149}, {766, 149}},
  {{856, 889}, {895, 889}},
  {{335, 962}, {485, 812}},
  {{425, 774}, {400, 749}},
  {{71, 932}, {989, 14}},
  {{484, 974}, {44, 974}},
  {{86, 797}, {86, 470}},
  {{876, 962}, {876, 384}},
  {{45, 631}, {169, 507}},
  {{161, 789}, {523, 427}},
  {{791, 640}, {791, 581}},
  {{415, 170}, {835, 590}},
  {{299, 275}, {988, 964}},
  {{105, 233}, {231, 359}},
  {{202, 226}, {202, 958}},
  {{814, 717}, {618, 521}},
  {{185, 442}, {559, 68}},
  {{26, 149}, {665, 149}},
  {{673, 369}, {247, 795}},
  {{171, 963}, {171, 46}},
  {{689, 801}, {94, 206}},
  {{619, 243}, {619, 637}},
  {{426, 245}, {660, 11}},
  {{47, 503}, {47, 179}},
  {{341, 363}, {487, 217}},
  {{371, 774}, {371, 871}},
  {{781, 794}, {781, 180}},
  {{391, 632}, {92, 632}},
  {{517, 150}, {517, 715}},
  {{903, 10}, {18, 895}},
  {{34, 500}, {426, 500}},
  {{82, 955}, {886, 151}},
  {{142, 297}, {142, 527}},
  {{60, 965}, {36, 965}},
  {{250, 807}, {372, 685}},
  {{227, 393}, {610, 776}},
  {{269, 893}, {269, 556}},
  {{969, 223}, {611, 223}},
  {{255, 92}, {194, 92}},
  {{220, 233}, {958, 233}},
  {{144, 209}, {144, 979}},
  {{48, 413}, {48, 195}},
  {{209, 151}, {648, 590}},
  {{867, 648}, {871, 644}},
  {{499, 555}, {807, 555}},
  {{571, 729}, {865, 435}},
  {{683, 151}, {485, 151}},
  {{803, 26}, {803, 691}},
  {{533, 921}, {300, 688}},
  {{625, 695}, {483, 553}},
  {{719, 370}, {139, 950}},
  {{981, 17}, {16, 982}},
  {{367, 617}, {367, 636}},
  {{249, 644}, {835, 644}},
  {{260, 825}, {260, 519}},
  {{275, 144}, {275, 315}},
  {{767, 314}, {962, 119}},
  {{76, 625}, {76, 166}},
  {{403, 680}, {313, 680}},
  {{977, 21}, {16, 982}},
  {{578, 753}, {271, 753}},
  {{212, 358}, {477, 623}},
  {{596, 220}, {868, 220}},
  {{67, 797}, {935, 797}},
  {{181, 107}, {181, 379}},
  {{741, 332}, {419, 10}},
  {{732, 827}, {732, 989}},
  {{835, 111}, {436, 510}},
  {{480, 328}, {480, 682}},
  {{327, 673}, {327, 70}},
  {{911, 547}, {833, 625}},
  {{944, 509}, {874, 579}},
  {{169, 340}, {731, 902}},
  {{156, 842}, {825, 173}},
  {{976, 40}, {51, 965}},
  {{199, 416}, {916, 416}},
  {{51, 970}, {792, 229}},
  {{14, 577}, {501, 577}},
  {{246, 464}, {246, 289}},
  {{641, 464}, {100, 464}},
  {{984, 11}, {43, 952}},
  {{548, 36}, {156, 428}},
  {{519, 799}, {519, 43}},
  {{332, 364}, {332, 774}},
  {{85, 123}, {85, 753}},
  {{778, 12}, {40, 750}},
  {{507, 56}, {507, 840}},
  {{973, 632}, {670, 632}},
  {{895, 928}, {37, 70}},
  {{661, 784}, {661, 718}},
  {{114, 25}, {938, 849}},
  {{428, 752}, {428, 543}},
  {{357, 270}, {957, 870}},
  {{27, 70}, {899, 942}},
  {{85, 780}, {747, 780}},
  {{717, 565}, {951, 565}},
  {{191, 748}, {651, 748}},
  {{679, 301}, {679, 417}},
  {{150, 266}, {150, 184}},
  {{774, 964}, {64, 254}},
  {{34, 248}, {34, 279}},
  {{782, 610}, {802, 610}},
  {{109, 146}, {822, 859}},
  {{825, 848}, {825, 666}},
  {{251, 718}, {615, 718}},
  {{912, 722}, {289, 722}},
  {{729, 579}, {729, 889}},
  {{214, 756}, {214, 716}},
  {{58, 497}, {58, 927}},
  {{62, 55}, {742, 55}},
  {{110, 429}, {110, 154}},
  {{55, 794}, {638, 794}},
  {{182, 96}, {676, 96}},
  {{632, 334}, {202, 764}},
  {{36, 541}, {36, 397}},
  {{191, 819}, {191, 277}},
  {{971, 491}, {839, 491}},
  {{849, 561}, {538, 250}},
  {{176, 523}, {10, 689}},
  {{162, 638}, {717, 638}},
  {{132, 843}, {646, 329}},
  {{873, 67}, {873, 389}},
  {{167, 631}, {167, 473}},
  {{49, 337}, {465, 337}},
  {{550, 429}, {438, 429}},
  {{305, 720}, {476, 720}},
  {{547, 636}, {547, 902}},
  {{21, 627}, {49, 627}},
  {{286, 70}, {989, 70}},
  {{87, 930}, {896, 121}},
  {{659, 916}, {200, 916}},
  {{234, 589}, {234, 308}},
  {{530, 962}, {90, 962}},
  {{366, 478}, {676, 788}},
  {{284, 520}, {284, 546}},
  {{580, 74}, {146, 508}},
  {{561, 977}, {561, 237}},
  {{85, 150}, {804, 869}},
  {{740, 850}, {159, 269}},
  {{458, 705}, {458, 639}},
  {{969, 563}, {381, 563}},
  {{139, 439}, {139, 263}},
  {{135, 971}, {908, 198}},
  {{440, 632}, {102, 632}},
  {{446, 549}, {446, 734}},
  {{24, 49}, {212, 237}},
  {{692, 882}, {527, 882}},
  {{156, 895}, {156, 239}},
  {{359, 246}, {359, 603}},
  {{12, 349}, {604, 941}},
  {{375, 161}, {732, 161}},
  {{674, 287}, {322, 287}},
  {{902, 957}, {328, 383}},
  {{352, 185}, {352, 766}},
  {{222, 205}, {222, 419}},
  {{769, 815}, {769, 739}},
  {{83, 147}, {880, 147}},
  {{136, 148}, {136, 279}},
  {{807, 241}, {439, 241}},
  {{464, 240}, {478, 254}},
  {{37, 839}, {646, 839}},
  {{351, 316}, {639, 604}},
  {{449, 492}, {449, 125}},
  {{69, 892}, {933, 28}},
  {{565, 161}, {598, 161}},
  {{147, 802}, {905, 44}},
  {{809, 861}, {38, 90}},
  {{34, 80}, {34, 538}},
  {{896, 405}, {582, 405}},
  {{474, 201}, {893, 201}},
  {{289, 64}, {975, 750}},
  {{378, 785}, {375, 782}},
  {{709, 472}, {357, 472}},
  {{17, 14}, {987, 984}},
  {{625, 46}, {647, 46}},
  {{20, 84}, {914, 978}},
  {{364, 811}, {397, 811}},
  {{395, 726}, {628, 726}},
  {{831, 89}, {593, 89}},
  {{370, 562}, {827, 562}},
  {{278, 371}, {609, 40}},
  {{904, 529}, {391, 16}},
  {{232, 829}, {232, 63}},
  {{927, 121}, {194, 854}},
  {{547, 280}, {547, 895}},
  {{292, 904}, {292, 897}},
  {{99, 525}, {99, 868}},
  {{371, 44}, {643, 44}},
  {{942, 74}, {986, 118}},
  {{708, 179}, {110, 179}},
  {{485, 637}, {713, 637}},
  {{477, 512}, {102, 137}},
  {{636, 657}, {727, 657}},
  {{686, 564}, {256, 564}},
  {{636, 169}, {377, 169}},
  {{627, 943}, {627, 703}},
  {{987, 795}, {987, 758}},
  {{364, 827}, {642, 827}},
  {{613, 694}, {864, 945}},
  {{910, 521}, {777, 654}},
  {{119, 394}, {22, 394}},
  {{594, 439}, {515, 360}},
  {{177, 11}, {177, 73}},
  {{456, 628}, {456, 467}},
  {{246, 214}, {594, 562}},
  {{47, 790}, {47, 491}},
  {{788, 21}, {788, 343}},
  {{136, 847}, {136, 543}},
  {{958, 302}, {733, 302}},
  {{50, 981}, {923, 108}},
  {{298, 179}, {298, 921}},
  {{962, 644}, {93, 644}},
  {{988, 671}, {988, 258}},
  {{646, 140}, {646, 852}},
  {{721, 264}, {721, 563}},
  {{972, 407}, {684, 119}},
  {{245, 422}, {401, 422}},
  {{16, 494}, {16, 16}},
  {{564, 72}, {361, 72}},
  {{436, 390}, {166, 120}},
  {{511, 571}, {241, 571}},
  {{259, 215}, {259, 975}},
  {{648, 841}, {898, 841}},
  {{918, 881}, {438, 401}},
  {{458, 561}, {752, 855}},
  {{791, 192}, {319, 192}},
  {{383, 929}, {217, 929}},
  {{733, 26}, {527, 26}},
  {{620, 160}, {620, 734}},
  {{818, 181}, {61, 181}},
  {{39, 21}, {927, 909}},
  {{952, 208}, {952, 749}},
  {{194, 55}, {304, 55}},
  {{519, 673}, {519, 875}},
  {{730, 919}, {733, 919}},
  {{963, 269}, {933, 299}},
  {{707, 112}, {178, 112}},
  {{924, 349}, {264, 349}},
  {{910, 94}, {96, 94}},
  {{747, 289}, {89, 947}},
  {{164, 956}, {164, 655}},
  {{264, 300}, {753, 789}},
  {{207, 672}, {207, 488}},
  {{243, 838}, {812, 269}},
  {{455, 320}, {425, 320}},
  {{59, 964}, {59, 841}},
  {{350, 373}, {526, 549}},
  {{604, 683}, {604, 83}},
  {{537, 281}, {537, 933}},
  {{737, 634}, {737, 28}},
  {{92, 909}, {725, 276}},
  {{859, 335}, {859, 487}},
  {{605, 495}, {371, 495}},
  {{783, 155}, {783, 930}},
  {{388, 591}, {388, 133}},
  {{374, 634}, {472, 634}},
  {{963, 914}, {64, 15}},
  {{57, 435}, {140, 435}},
  {{759, 619}, {105, 619}},
  {{326, 501}, {326, 821}},
  {{942, 136}, {414, 136}},
  {{490, 376}, {490, 260}},
  {{377, 59}, {377, 773}},
  {{894, 169}, {99, 964}},
  {{350, 511}, {726, 511}},
  {{787, 728}, {787, 750}},
  {{688, 11}, {688, 68}},
  {{107, 514}, {183, 514}},
  {{861, 12}, {22, 851}},
  {{149, 49}, {149, 713}},
  {{826, 737}, {890, 737}},
  {{299, 307}, {299, 549}},
  {{251, 648}, {862, 37}},
  {{898, 85}, {412, 85}},
  {{936, 168}, {845, 168}},
  {{278, 677}, {302, 677}},
  {{493, 878}, {493, 133}},
  {{539, 205}, {539, 522}},
  {{412, 495}, {412, 929}},
  {{334, 605}, {334, 817}},
  {{68, 462}, {462, 856}},
  {{234, 134}, {234, 942}},
  {{293, 823}, {678, 823}},
  {{852, 874}, {158, 874}},
  {{859, 612}, {435, 612}},
  {{10, 876}, {613, 273}},
  {{370, 13}, {118, 13}},
  {{616, 774}, {14, 172}},
  {{193, 543}, {81, 543}},
  {{784, 179}, {14, 949}},
  {{324, 533}, {153, 533}},
  {{15, 976}, {976, 15}},
  {{943, 52}, {20, 975}},
  {{100, 34}, {671, 605}},
  {{140, 552}, {140, 27}},
  {{448, 497}, {186, 497}},
  {{734, 355}, {734, 933}},
  {{544, 131}, {259, 131}},
  {{193, 84}, {663, 84}},
  {{190, 949}, {833, 306}},
  {{430, 34}, {328, 34}},
  {{21, 46}, {483, 508}},
  {{621, 202}, {98, 202}},
  {{196, 874}, {889, 181}},
  {{106, 217}, {850, 961}},
  {{701, 891}, {488, 678}},
  {{21, 597}, {894, 597}},
  {{249, 21}, {249, 614}},
  {{887, 808}, {887, 948}},
  {{255, 711}, {913, 53}},
  {{173, 447}, {173, 78}},
  {{956, 224}, {956, 747}},
  {{513, 882}, {48, 417}},
  {{772, 591}, {930, 591}},
  {{976, 98}, {86, 988}},
  {{264, 67}, {264, 931}},
  {{987, 982}, {48, 43}},
  {{494, 514}, {494, 416}},
  {{867, 785}, {556, 474}},
  {{350, 902}, {257, 902}},
  {{978, 977}, {978, 735}},
  {{312, 240}, {371, 240}},
  {{890, 112}, {890, 662}},
  {{753, 327}, {427, 653}},
  {{83, 888}, {927, 44}},
  {{142, 480}, {12, 480}},
  {{965, 39}, {85, 919}},
  {{158, 926}, {158, 801}},
  {{439, 22}, {439, 860}},
  {{10, 26}, {765, 781}},
  {{775, 838}, {775, 732}},
  {{871, 607}, {871, 288}},
  {{337, 850}, {337, 533}},
  {{89, 581}, {89, 582}},
  {{524, 977}, {524, 88}},
  {{473, 283}, {639, 449}},
  {{23, 324}, {23, 372}},
  {{671, 486}, {278, 879}},
  {{266, 98}, {989, 98}},
  {{51, 947}, {634, 947}},
  {{47, 18}, {47, 43}},
  {{95, 239}, {609, 753}},
  {{953, 34}, {71, 916}},
  {{243, 685}, {243, 427}},
  {{642, 537}, {304, 199}},
  {{545, 41}, {914, 41}},
  {{112, 860}, {112, 159}},
  {{12, 12}, {989, 989}},
  {{622, 907}, {648, 907}},
  {{230, 983}, {230, 941}},
  {{111, 868}, {852, 127}},
  {{315, 895}, {799, 411}},
  {{771, 533}, {584, 720}},
  {{65, 492}, {657, 492}},
  {{820, 315}, {820, 627}},
  {{710, 554}, {829, 554}},
  {{100, 967}, {877, 190}},
  {{530, 733}, {530, 202}},
  {{880, 28}, {83, 825}},
  {{914, 448}, {494, 28}},
  {{886, 344}, {966, 344}},
  {{782, 923}, {857, 848}},
  {{597, 632}, {597, 946}},
  {{366, 789}, {366, 96}},
  {{568, 834}, {187, 834}},
  {{451, 687}, {224, 687}},
  {{123, 12}, {914, 803}},
  {{734, 42}, {526, 42}},
  {{844, 116}, {844, 521}},
  {{744, 976}, {744, 792}},
  {{337, 837}, {617, 837}},
  {{848, 139}, {848, 571}},
  {{853, 264}, {112, 264}},
  {{986, 965}, {92, 71}},
  {{888, 892}, {53, 57}},
  {{150, 342}, {150, 516}},
  {{457, 264}, {796, 264}},
  {{544, 595}, {544, 406}},
  {{243, 118}, {482, 357}},
  {{138, 804}, {138, 646}},
  {{99, 80}, {99, 34}},
  {{442, 883}, {442, 165}},
  {{428, 72}, {428, 826}},
  {{450, 815}, {901, 364}},
  {{852, 516}, {852, 384}},
  {{13, 969}, {972, 10}},
  {{921, 50}, {32, 939}},
  {{969, 470}, {969, 539}},
  {{691, 238}, {763, 238}},
  {{171, 733}, {823, 81}},
  {{722, 963}, {21, 262}},
  {{849, 203}, {849, 151}},
  {{12, 99}, {884, 971}},
  {{903, 240}, {148, 240}},
  {{633, 140}, {633, 202}},
  {{194, 393}, {747, 393}},
  {{748, 43}, {126, 665}},
  {{182, 155}, {182, 298}},
  {{668, 814}, {668, 306}},
  {{619, 384}, {255, 384}},
  {{166, 341}, {795, 970}},
  {{898, 870}, {57, 29}},
  {{976, 148}, {976, 244}},
  {{386, 525}, {662, 249}},
  {{719, 67}, {131, 655}},
  {{419, 847}, {188, 847}},
  {{953, 823}, {743, 823}},
  {{307, 299}, {307, 78}},
  {{948, 253}, {756, 253}},
  {{926, 938}, {46, 58}},
  {{982, 618}, {652, 618}},
  {{539, 742}, {539, 177}},
  {{531, 974}, {531, 781}},
  {{880, 922}, {283, 325}},
  {{707, 257}, {707, 673}},
  {{327, 308}, {930, 911}},
  {{526, 170}, {980, 624}},
  {{445, 653}, {445, 986}},
  {{842, 737}, {754, 737}},
  {{847, 982}, {16, 151}},
  {{137, 426}, {292, 271}},
  {{126, 556}, {50, 556}},
  {{168, 766}, {168, 767}},
  {{152, 46}, {363, 46}},
  {{50, 381}, {760, 381}},
  {{43, 943}, {43, 374}},
  {{45, 964}, {956, 53}},
  {{37, 403}, {576, 403}},
  {{130, 317}, {576, 763}},
  {{882, 840}, {179, 137}},
  {{572, 608}, {572, 274}},
  {{874, 977}, {32, 135}},
  {{794, 56}, {730, 120}},
  {{812, 841}, {812, 440}},
  {{111, 66}, {137, 92}},
  {{255, 287}, {255, 787}},
  {{121, 137}, {121, 63}},
  {{81, 811}, {81, 586}},
  {{303, 365}, {910, 972}},
  {{177, 134}, {962, 919}},
  {{405, 41}, {405, 645}},
  {{219, 934}, {441, 934}}
]

pt 1 :: diagonals are for squares

without_diagonals = vents
|> Enum.flat_map(fn
  {{a1, a2}, {b1, b2}} when a1 == b1 -> Enum.reduce(a2..b2, [], fn i, acc -> [{a1, i} | acc] end)
  {{a1, a2}, {b1, b2}} when a2 == b2 -> Enum.reduce(a1..b1, [], fn i, acc -> [{i, a2} | acc] end)
  _ -> []
end)
|> Enum.reduce(%{}, fn coord, counts -> Map.update(counts, coord, 1, &(&1 + 1)) end)
|> Enum.filter(fn {_coord, count} -> count > 1 end)
|> Enum.count()
every_dang_one = vents
|> Enum.flat_map(fn
  {{a1, a2}, {b1, b2}} when a1 == b1 -> Enum.reduce(a2..b2, [], fn i, acc -> [{a1, i} | acc] end)
  {{a1, a2}, {b1, b2}} when a2 == b2 -> Enum.reduce(a1..b1, [], fn i, acc -> [{i, a2} | acc] end)
  {{a1, a2}, {b1, b2}} -> Enum.zip(a1..b1, a2..b2)
end)
|> Enum.reduce(%{}, fn coord, counts -> Map.update(counts, coord, 1, &(&1 + 1)) end)
|> Enum.filter(fn {_coord, count} -> count > 1 end)
|> Enum.count()