├── .gitignore ├── Cargo.toml ├── LICENSE ├── README.md ├── fetch.sh ├── notes.md ├── screenshots ├── leaderboard-day1.png └── leaderboard.png ├── src ├── bin │ ├── 01.rs │ ├── 02.rs │ ├── 03.rs │ ├── 04.rs │ ├── 05.rs │ ├── 06.rs │ ├── 07.rs │ ├── 08.rs │ ├── 09.rs │ ├── 10.rs │ ├── 11.rs │ ├── 12.rs │ ├── 13.rs │ ├── 14.rs │ ├── 15.rs │ ├── 16.rs │ ├── 17.rs │ ├── 18.rs │ ├── 19.rs │ ├── 20.rs │ ├── 21.rs │ ├── 22.rs │ ├── 23.c │ ├── 23.rs │ ├── 24.rs │ └── 25.rs ├── lib.rs └── main.rs └── timings.md /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | *.out 3 | Cargo.lock 4 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "aoc2020" 3 | version = "0.1.0" 4 | authors = ["Axel Lindeberg "] 5 | edition = "2018" 6 | default-run = "aoc2020" 7 | 8 | [dependencies] 9 | itertools = "0.9" 10 | regex = "1.4" 11 | once_cell = "1.5" 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Axel Lindeberg 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AdventOfCode2020 :crab: 2 | Solutions to all 25 AoC 2020 problems in Rust :crab: 3 | 4 | This year I went all out and went up at `5:50` every single day (except day 5 when I overslept :cry:) to do the puzzles. I tried to aim for relatively high scores on the leaderboard and got as high as [116 on day 20](./src/bin/20.rs), however competing against Python with Rust is difficult. Solved most problems in less than one hour though, and consistently hit top 1000 on a lot of the problems. This year was cool but _a lot_ easier than 2019. 5 | 6 | See [notes.md](./notes.md) for some thoughts I wrote down after completing each day. 7 | 8 | See [timings.md](./timings.md) for the execution time of each solution. 9 | 10 | Thanks for another amazing year of AoC [@ericwastl](https://twitter.com/ericwastl) :christmas_tree: 11 | 12 | ## Usage 13 | ```sh 14 | cargo run --release --bin [DAY] # run a specific day 15 | cargo run --release # run all days 16 | ``` 17 | 18 | ## All years 19 | - [2024](https://github.com/AxlLind/AdventOfCode2024/) in Rust :crab: 20 | - [2023](https://github.com/AxlLind/AdventOfCode2023/) in Rust :crab: 21 | - [2022](https://github.com/AxlLind/AdventOfCode2022/) in Rust :crab: 22 | - [2021](https://github.com/AxlLind/AdventOfCode2021/) in Rust :crab: 23 | - [2020](https://github.com/AxlLind/AdventOfCode2020/) in Rust :crab: 24 | - [2019](https://github.com/AxlLind/AdventOfCode2019/) in Rust :crab: 25 | - [2018](https://github.com/AxlLind/AdventOfCode2018/) in Python :snake: 26 | - [2017](https://github.com/AxlLind/AdventOfCode2017/) in Haskell λ 27 | - [2016](https://github.com/AxlLind/AdventOfCode2016/) in OCaml :camel: 28 | - [2015](https://github.com/AxlLind/AdventOfCode2015/) in Clojure λ 29 | 30 | ## Leaderboard 31 | ![leaderboard](./screenshots/leaderboard.png) 32 | -------------------------------------------------------------------------------- /fetch.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Fetches the input, prints to stdout and copies to clipboard. 4 | # This gives both a quick overview of what the input looks like 5 | # and makes it available on ctrl+v for use in the challenge. 6 | 7 | if [ -z "$1" ]; then 8 | echo "Please provide a day number." 9 | echo "usage: $0 DAY" 10 | exit 1 11 | fi 12 | 13 | if [ -z "$AOC_SESSION" ]; then 14 | echo "No session token." 15 | exit 1 16 | fi 17 | 18 | URL="https://adventofcode.com/2020/day/$1/input" 19 | curl $URL --cookie "session=$AOC_SESSION" -s | tee >(pbcopy) 20 | -------------------------------------------------------------------------------- /screenshots/leaderboard-day1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AxlLind/AdventOfCode2020/55ba2d8ab208f7ee0be4c6d54c74e052e47170b9/screenshots/leaderboard-day1.png -------------------------------------------------------------------------------- /screenshots/leaderboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AxlLind/AdventOfCode2020/55ba2d8ab208f7ee0be4c6d54c74e052e47170b9/screenshots/leaderboard.png -------------------------------------------------------------------------------- /src/bin/01.rs: -------------------------------------------------------------------------------- 1 | use itertools::Itertools; 2 | 3 | static INPUT: [u32; 200] = [1863,1750,1767,1986,1180,1719,1946,1866,1939,1771,1766,1941,1728,1322,1316,1775,1776,1742,1726,1994,1949,1318,1223,1741,1816,1111,1991,1406,1230,1170,1823,1792,1148,1953,1706,1724,1307,1844,1943,1862,1812,1286,1837,1785,1998,1938,1248,1822,1829,1903,1131,1826,1892,1143,1898,1981,1225,1980,1850,1885,324,289,1914,1249,1848,1995,1962,1875,1827,1931,1244,1739,1897,1687,1907,1867,1922,1972,1842,1757,1610,1945,1835,1894,1265,1872,1963,1712,891,1813,1800,1235,1879,1732,1522,1335,1936,1830,1772,1700,2005,1253,1836,1935,1137,1951,1849,1883,1192,1824,1918,1965,1759,1195,1882,1748,1168,1200,1761,1896,527,1769,1560,1947,1997,1461,1828,1801,1877,1900,1924,1782,1718,515,1814,1744,1126,1791,1149,1932,1690,1707,1808,1957,1313,1132,1942,1934,1798,2009,1708,1774,1710,1797,1747,959,1955,1717,1716,1290,1654,1857,1968,1874,1853,1175,1493,1425,1125,1973,1790,467,1804,987,1944,2001,1895,1917,1218,1147,1884,1819,1179,1859,620,1219,2008,1871,1852,1263,1751,1989,1381,1250,1754,1725,1665,1352,1805,1325]; 4 | 5 | aoc2020::main! { 6 | let part_one = INPUT.iter() 7 | .tuple_combinations() 8 | .find(|&(a,b)| a + b == 2020) 9 | .map(|(a,b)| a * b); 10 | let part_two = INPUT.iter() 11 | .tuple_combinations() 12 | .find(|&(a,b,c)| a + b + c == 2020) 13 | .map(|(a,b,c)| a * b * c); 14 | (part_one.unwrap(), part_two.unwrap()) 15 | } 16 | -------------------------------------------------------------------------------- /src/bin/03.rs: -------------------------------------------------------------------------------- 1 | const INPUT: [&[u8]; 323] = [b"...#.....#.......##......#.....",b"...#..................#........",b"....##....#.......#............",b".........#.......#.......#.....",b"..#..............#.........#..#",b".....#.........#....#....#....#",b"....##..........#.#.##.........",b"...#....##...#...#...#.#..#....",b"...#.......###..........#......",b".........#.....#....#...#.#....",b".#...###..#..##..#.........###.",b"#.#...#..........###...#....#..",b"#....#.#..#..........#.......#.",b".#..#........##.#..............",b"............#..#.#............#",b".............#..........#......",b"...#.......#...............#...",b".#...#..#..#............#..#...",b"....##.##..................#.##",b"#......#...#..##....#.....#...#",b"#..#..........##....#...###....",b"##......#.##.#......#..#......#",b"....#...#.......##.##...#.#..#.",b"##.#...#....#...#...#........#.",b"........#..#.....#....#.......#",b".#......#......#..............#",b".#.....#..#..#..#..#..#....#..#",b".......#.....#.................",b".#......#...#..#..#...#...#....",b".........#..#..#.........#.....",b".....#.........#.#..........#..",b"#......#....#....##....#.#.#...",b"................##.#...........",b".....##.....#............#.#...",b"...........#...#.#..##...#.....",b".......#....##.......#..#....#.",b".##......##....#....####.##..#.",b".....#.##.....#...#....##......",b".............#....#......#....#",b"#.#.#.###........#.#....#.#....",b".##...........#................",b"#..#..#...##..##.##...#..#.#...",b"..#......##..#.#......#..#.#.#.",b".....#..............#......#...",b"#.#..##.##...#............##...",b".#......#.............#........",b"........##....#......#..#......",b"##.........##....#..........#..",b"..#..#....#.........##....#..#.",b"........#..#..#........#...#...",b"#.........#......##.#...#.##...",b".##.............#..###....#.##.",b".##.#....#.......#.............",b"#..##.#.........#..##.#......##",b"....#..#.......................",b".#.#.........#...............#.",b"....#......#.#..##..#...#.#..#.",b"#....##...##..#.......##.....##",b"....##...##...#....#.....#..#..",b".#......#.#.#.#......##..#..#..",b".....##..#..#.....#.....#...##.",b"....###................#..#.#..",b".....#..#..#.#..........#..#...",b"...#.....#............#........",b"#.............#...#..#.....#..#",b"#........#.....#.#..#......#...",b"...#.##.....#.#..#.........#..#",b".......##...#..#.#....##.......",b"..................#..##..#.#.#.",b"..#......#..#..#.....#...#.#...",b".#.......#.....#.#....#.#......",b"##..#.#....#.###..#...#.......#",b".......................#.......",b"..###..........#..##.##.#...##.",b".....#...#....###.........#..#.",b"..#.....#....###...............",b"....#.......#........#....#..#.",b"......#................#.#...##",b"#.....#.......#..#..........##.",b"#.#....##.........#.....#.#....",b"#.#.#...#............####.##..#",b".....#....####........#...#..#.",b"....##........#.#..............",b".#......#..#..##......#....#.##",b"..#....#.#........#..#....#....",b".#...#.##...#.#.....#.....#...#",b"..........#................###.",b".....#..........##..#..........",b".....#..................#...#..",b"#......##....#.#...#..#.......#",b"..#......##....#......#.#...#..",b"###.#..###.#.#..#...#....#.....",b"#.....#.#...#.##...#........#..",b"#..........................#...",b".#.#.....#.#.#.......##.#.#....",b".#....#..##......#....#........",b".#.......#.##......#.#..#......",b"............#.....#....##.##...",b"....##........##......#........",b"....#......##....##.....#......",b"..#.#.....#......#...#.#.......",b".###.........#...#........#....",b"......#.#...##.....##..##..#...",b"...#...#.#......#..##..#.......",b".##....#.#........#.#..........",b"#....#.#......#......#.#.#.....",b"#.....#.....#................##",b"...........#....#...#...#......",b"..........##..##..#...##.......",b".##......#.......#..#.#..##....",b"..........##....#....#..#.#....",b"...............#......#.....##.",b".#...#....................#..#.",b".............###...............",b".####..............#...#.......",b"....#...#.#...#...#....#.......",b".......#.#.....................",b"...............................",b"#..#.........##.......#.#.#....",b"....##...#...........#......#..",b"........##...#......#..........",b"....#.#.....#..#......#........",b"#..#................#..#.##....",b".#........#.......#.........##.",b"#...........#...#...#......#.#.",b"..#.#.#..........##.##...#...#.",b"..#...#.##...#.#...........#...",b"##...........##...##...##......",b"....#....##...#......#..#.....#",b"#..#.#.#..#...#...#....#.......",b"............#.....#....#....#.#",b"....##.....#.........#......#..",b".....##.......#...#...#.###....",b"...##......##..###.#.#....#....",b"#.#.#.#..#.#.........#...#...##",b"..#..........#.................",b"....##....#....................",b"###.#...............##...##.#..",b"....#.......##.#..#.#..........",b"............##..#.......##.....",b"#...#.........#..#..#..#...#...",b"..#......##..#.#...##.#.......#",b"......#................#...#...",b"......#..###............#.#....",b"..#.#...###...#..#...#......##.",b"...#.##...##............#......",b"#...##........#.#..#.......#...",b"#..#.....#..#.##...............",b"..#.....#.#....#.........#.....",b".............#....#..#...#.##..",b"..#.#.....................##.#.",b"........#.......#..#.#.........",b"##..............#.....#.......#",b".#.##...###....#.....#..##.#...",b"#..#...#..#......#..........###",b"#...........#..#...#....#....#.",b"....#..#.......##......#......#",b"#...#.#...............##...#...",b"...##.#..##.......##..#........",b"...........##..........#.......",b"..#....#..##...#......#.#......",b".#.#....#.#.#...#.#............",b".#.#..#...##.......#.#.........",b"...#...#.............#.######..",b"##.#........###.......#....#.#.",b".#....#.....#.#........#......#",b"..#.#.........#..........##.#..",b".#....#.#..............#......#",b".....#..##.........#..##..#....",b"........#..#....#.......#.....#",b"#.#.......#.....#.##.#...#....#",b"...#...##...#....#.....#....#.#",b"#..##....#..........#..#.......",b".......#.#.....#...#.#.#.....##",b"#...#...#..#......##.#..#......",b"...#.......#....#...........#.#",b"##.......#####.#.........#..#..",b"....#.#...................##...",b"......#..##............#.......",b"#.........#....#####.#.#..#.#..",b"..#......#.#.##............#...",b"..#...#.....#.#....#......#....",b".#...#....#....#.#.#......#.#..",b"..#.##.....#..........#...#.#..",b".......#...#.............#...#.",b".#.........#.....#.#........##.",b"#....#..#..........##.......##.",b"...#....#.#.........#.......###",b"......#....#.#......#.......#..",b".....#...#...#.#...##..#.#.....",b"#.........##..#...##..#.#....#.",b"...#......#.#......##.....#....",b".#####.....#.#.#.#...###.##....",b"..#................#.#...#.#...",b"#.......##...#.........##..#...",b"..#.....#....##............#...",b"#............##...............#",b"..#..#.................#.......",b"...............#..#.......##...",b"..##..#....#...##..........#..#",b"#...###....##.#.......#.....#..",b"..........#.........#..#......#",b"##....#.....#...##.......#.....",b"..#..#.......#.................",b"..#..##......#.........#......#",b"...........##.#..#......#.#..#.",b"..#...##...##......#...#...#.#.",b".#..#.....#.........#..........",b"#..##...#............#..#.#....",b"..#...#...##.#........#....#.#.",b"......##..###.#....#........#..",b".....#..#....##...##..........#",b"................#.#.#.....#..#.",b"#.##...#......#.#..#.......###.",b".......#.#..#..#......#..##..#.",b".##...#...#....#....#.......#..",b"......#..#....#.#.###.....#.#.#",b"#....#.#...#......#.#.....#..#.",b".......#.#...#.#.#............#",b"#.....#..#...#.................",b".....#..........#..#.#..#.#....",b".........#......#.#.........###",b"..#.###........#....##.#.......",b".#.......#.#......#........#..#",b"............#........#.....#...",b"......#......#....#.#....#.....",b".#.......#.....#.##.#..#...#..#",b"##.....#...#..........##..#...#",b".#........#....#...#....##.#...",b"...#.#.......#.#....#.#...#...#",b"........#.#.....#.##...#.#.#...",b"...........#....#..#.........#.",b"......#.#..#..##...#.......#...",b"...#....#..#..#.##...........##",b".#..#.#.#......#....##...#.....",b"......#..#........#...##.......",b".............#...##.#.....#...#",b"....#...............##......#.#",b".#...........#.........###.##.#",b"....##........##...#.##.....#..",b"#......##........#...........#.",b"###.#.................#.....#..",b".....##..#.........#......##.#.",b"#.#.......##.#..#...#...#......",b"...#.#..##.....#....##.....#.#.",b"...##..#...#........#.#..#..#..",b"...........#....#...#...##.....",b"##.......#...#.#.##...##..#.#..",b"#....#.#..##...................",b".#...................#.#..#....",b"#.....#..........#..#...#...#..",b"...#..#............#.#.........",b"............#..##.....##......#",b"#....#.........#.#..#..........",b"...#.#................#....#.#.",b"..#..#...#...#.#.#...#.#.#.....",b"..#.......#.............##..#.#",b"#........#.#.###.#...#..#.###..",b".......#......#..#.....####...#",b"..##....#..#...................",b"....##.#....#......#.#..#..#..#",b"#...........##...#.#.##..###...",b"##.##......#...........#....#..",b".#....#....#..#..#...##...#....",b"...##.#.#......#...............",b".....##.##...#...........#.....",b"....#...#.#.........##.#....#.#",b"#..#...........#......#........",b"..#..#.....#....#.##.......#..#",b"..#.......##.....##.......#...#",b".#.##.#..#...............#....#",b".........#...........#.........",b"..........##......#.#..........",b"..#........###....#..#...#...#.",b"....#.#...#.....#..#....#......",b"..##...##...#..#..##......##..#",b"..#..#......#....#....#...#..##",b"...#...............#..#........",b"....##..#...#......#........#..",b"###.....##.......#.............",b".#.#.##........##..#...#.......",b".....###............#..#..#....",b".#....##.#...####........#.....",b"............#.#.....##....#.#..",b"....#..........#...#...........",b"........#.#...#..##...........#",b"#.......#..#.......###...#....#",b"#....#..#......#.....#...##.#..",b"..#.............#.#.###...##..#",b".#.#....#...#.....#...#.......#",b".##.#..#.........#..#......#...",b"#....#...#......#.....#.....#..",b"...........#....#.......##...#.",b"#.#..##....#....#.#.......#.#..",b"..............#.#..##.##.......",b"....#........#......#....#.#...",b"......#.....................#..",b"#..##...##.....#.........#.....",b"#.....#.....#....#...#.....#...",b"........###...........#...#....",b"............#.....#...##....#..",b".......#.......#...#.#...##....",b"..#.#..#....#...#...#....#.....",b"..........#.#....#....###....#.",b".##...#......###..#............",b"...#...#........#....#....##...",b"##.....#.##...#.#...........#.#",b"..........#.#....#...##.#...#..",b"..#....#.#...#...#....#.###....",b"......#.##..#..#.........#.###.",b"#.#.#.....#.....##.......#.....",b"...#..#..#....#.#....#....#....",b"##..#.#................#......#",b".....#...#..#......#..####.....",b".....##.....#....####......#...",b"..........##..###.#....#.....##",b"###...#.......#......##...#....",b".......##...#...#..#.##.#....##",b".....##.....##...##.....#..#..#",b"......#.#.....#...#....#...#...",b"..##........#...#..............",b"..#........#.##.........#...#..",b"#....#....#................#...",]; 2 | const W: usize = INPUT[0].len(); 3 | 4 | fn in_slope(dh: usize, dw: usize) -> usize { 5 | INPUT.iter() 6 | .step_by(dh) 7 | .zip((0..W).cycle().step_by(dw)) 8 | .filter(|&(row, c)| row[c] == b'#') 9 | .count() 10 | } 11 | 12 | aoc2020::main! { 13 | let part_one = in_slope(1,3); 14 | let part_two = [(1,1),(1,3),(1,5),(1,7),(2,1)].iter() 15 | .map(|&(dh,dw)| in_slope(dh,dw)) 16 | .product::(); 17 | (part_one, part_two) 18 | } 19 | -------------------------------------------------------------------------------- /src/bin/04.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashMap; 2 | use itertools::Itertools; 3 | 4 | static INPUT: [&str; 282] = ["ecl:grn cid:315 iyr:2012 hgt:192cm eyr:2023 pid:873355140 byr:1925 hcl:#cb2c03", "byr:2027 hcl:ec0cfd ecl:blu cid:120 eyr:1937 pid:106018766 iyr:2010 hgt:154cm", "byr:1965 eyr:2028 hgt:157cm cid:236 iyr:2018 ecl:brn hcl:#cfa07d pid:584111467", "eyr:2029 ecl:hzl iyr:1972 byr:1966 pid:2898897192 hgt:59cm hcl:z", "pid:231652013 hcl:#602927 hgt:166 ecl:grn eyr:2025 byr:2008 iyr:1986", "byr:1928 hgt:167cm hcl:#18171d iyr:2012 ecl:oth pid:237657808 eyr:1944", "hgt:73in ecl:grn byr:1931 pid:358388825 iyr:2020 hcl:#602927 eyr:2020", "hcl:#efcc98 eyr:2024 ecl:hzl byr:2030 hgt:192cm iyr:2013 pid:7479289410", "pid:053467220 iyr:2012 hgt:169cm cid:149 hcl:#866857 eyr:2030 byr:1995 ecl:oth", "hgt:162cm hcl:#efcc98 ecl:grn byr:1985 pid:419840766 eyr:2022 iyr:2020", "pid:22086957 hcl:c69235 ecl:#c458c5 eyr:1986 byr:2014 hgt:72cm iyr:1934", "hcl:#866857 ecl:brn eyr:2024 iyr:2017 pid:505225484 cid:144 byr:1980 hgt:170cm", "hcl:#866857 ecl:gry byr:1972 iyr:2019 eyr:2023 cid:234 pid:721290041 hgt:191cm", "pid:346301363 eyr:2020 hcl:#733820 iyr:2019 hgt:177cm byr:1998", "hgt:157cm byr:1963 pid:898055805 hcl:#fffffd ecl:blu iyr:2017 cid:87 eyr:2030", "pid:605900764 iyr:2011 hgt:73in ecl:hzl eyr:2024 hcl:#888785 cid:281", "iyr:2010 eyr:2026 hcl:#4f7e76 pid:883386029 byr:1946 ecl:brn", "hcl:z iyr:2020 pid:9121928466 byr:2014 ecl:zzz eyr:2025 hgt:172in", "hgt:151cm cid:163 pid:670884417 iyr:2012 ecl:oth hcl:#ceb3a1 eyr:2028", "hcl:z cid:92 hgt:69cm byr:2008 pid:492284612 eyr:2020 iyr:2023 ecl:hzl", "byr:1933 hcl:#7d3b0c eyr:2020 hgt:170cm pid:949064511 iyr:2010 ecl:oth", "eyr:2025 byr:1989 ecl:oth cid:100 hgt:182cm pid:629190040 iyr:2017 hcl:#b6652a", "ecl:hzl cid:76 hcl:#e71392 eyr:2021 iyr:2013 byr:1995 pid:762177473 hgt:179cm", "pid:198500564 eyr:2029 hcl:#733820 cid:51 iyr:2012 hgt:70in byr:1938 ecl:oth", "hgt:190cm ecl:brn byr:1952 iyr:2015 hcl:#623a2f eyr:2023", "hgt:169cm hcl:#602927 byr:2001 pid:823979592 iyr:2016 eyr:2029", "iyr:2010 ecl:gry eyr:2022 hgt:156cm byr:1953 pid:434063393 hcl:#733820", "pid:091724580 hcl:a7069e eyr:1984 ecl:#95d01e byr:2012 iyr:2005", "eyr:2022 byr:1972 hcl:#866857 ecl:hzl pid:227453248 hgt:153cm cid:324 iyr:2018", "cid:195 pid:049871343 eyr:2024 hgt:169cm byr:1952 iyr:2010 ecl:grn", "eyr:2035 pid:189cm hgt:77 iyr:1973 ecl:#dc83d5 hcl:z byr:2004", "byr:2027 pid:89338932 hcl:1de39e ecl:grn hgt:159in eyr:2034 iyr:1937", "pid:076534920 hgt:152cm byr:1969 ecl:blu hcl:#866857 iyr:2011 eyr:2024", "iyr:2019 eyr:2028 ecl:blu hgt:169cm hcl:#888785 pid:332202163 byr:1923", "hgt:65in byr:1964 iyr:2019 pid:287612987 ecl:hzl cid:213 eyr:2023 hcl:#ceb3a1", "hcl:#623a2f pid:182484027 iyr:2016 ecl:brn byr:1943 hgt:71in eyr:2021 cid:344", "hcl:#cdee64 iyr:2011 ecl:brn eyr:2026 hgt:176cm byr:1985 pid:978641227", "eyr:2029 ecl:brn hgt:173cm byr:1920 cid:211 hcl:#866857 iyr:2016 pid:289769625", "hcl:#7d3b0c pid:770938833 iyr:2010 byr:1941 ecl:oth eyr:2029 hgt:161cm", "hgt:172cm iyr:2015 ecl:gry byr:1948 eyr:2029 pid:466359109 hcl:#341e13", "cid:74 pid:405199325 ecl:blu hcl:#6b5442 eyr:1980 byr:2024 hgt:174cm iyr:2011", "hgt:183cm pid:075760048 cid:78 byr:1960 ecl:hzl eyr:2030 hcl:#6b5442 iyr:2014", "cid:264 hcl:#7d3b0c ecl:blu iyr:2011 eyr:2020 hgt:182cm byr:1929", "pid:435338286 byr:1931 hcl:z ecl:amb iyr:2013 hgt:73in cid:165 eyr:2027", "pid:511898552 eyr:2025 hgt:184cm hcl:#602927 iyr:2018 byr:1989 ecl:hzl", "iyr:2016 hgt:168in hcl:#623a2f eyr:2025 pid:310738569 ecl:#0c3039 byr:2027", "pid:158cm byr:1946 ecl:grt iyr:1920 cid:189 hcl:389bce hgt:165cm", "pid:973732906 hcl:#cfa07d iyr:2010 eyr:2020 hgt:180cm byr:1930 ecl:brn", "pid:930994364 byr:1967 hgt:151cm iyr:2011 eyr:2022", "eyr:1968 hgt:75cm cid:241 iyr:2011 pid:5493866745 ecl:grt byr:1976 hcl:#a97842", "eyr:2026 ecl:oth iyr:2016 hcl:#c0946f byr:1929 hgt:175cm pid:9421898537", "eyr:2028 iyr:2016 byr:1962 ecl:grn hgt:186cm hcl:#cfa07d pid:432962396", "iyr:2010 byr:1934 eyr:2023 hgt:180cm hcl:#cfa07d ecl:gry", "cid:168 byr:1978 eyr:2027 hgt:189cm pid:802710287 hcl:#2f980b iyr:2014 ecl:grn", "eyr:1970 pid:576329104 ecl:xry iyr:1954 hcl:#341e13 byr:2026 hgt:74in", "eyr:2027 hgt:153cm ecl:oth hcl:#866857 pid:290407832 byr:1956 iyr:2017", "iyr:2011 cid:128 ecl:amb hcl:#7d3b0c hgt:68in pid:743606119 eyr:2020", "ecl:oth hcl:#cfa07d byr:2016 pid:#de98ae iyr:1984 cid:194 hgt:170cm eyr:2034", "pid:526098672 hgt:168cm hcl:#7d3b0c cid:167 byr:1923 ecl:blu iyr:2016 eyr:2030", "pid:495569197 hcl:#866857 hgt:193cm iyr:2013 eyr:2021 byr:1921 ecl:amb", "ecl:amb hcl:#a97842 pid:862249915 iyr:2012 byr:1964 cid:325 eyr:2021", "iyr:1958 byr:2003 hgt:160 hcl:#18171d ecl:hzl eyr:2020", "iyr:2019 byr:1997 ecl:brn pid:342735713 hcl:#efcc98 hgt:181cm cid:307 eyr:2027", "pid:817121616 eyr:2020 iyr:2012 hgt:185cm hcl:#18171d byr:1969 ecl:hzl", "pid:381399203 ecl:oth byr:1930 iyr:2014 hcl:#6b5442 hgt:71in cid:156 eyr:2025", "byr:2002 hcl:#18171d iyr:2017 pid:398245854 hgt:64in ecl:gry eyr:2025 cid:127", "eyr:2028 hcl:#341e13 ecl:amb iyr:2012 pid:079796480 hgt:69cm byr:1995", "cid:315 iyr:2028 pid:775929239 hgt:162cm ecl:dne byr:1940 eyr:1952 hcl:#c0946f", "iyr:2015 hgt:154cm byr:1997 ecl:grn cid:125 eyr:2024 pid:834780229 hcl:#18171d", "ecl:hzl hcl:#a97842 pid:553710574 eyr:2028 hgt:183cm cid:196 iyr:2014", "pid:377912488 hgt:159cm ecl:amb eyr:2024 byr:1974 iyr:2014 hcl:#ceb3a1", "eyr:2024 byr:1947 hgt:63in ecl:brn cid:69 pid:185228911 hcl:#b6652a iyr:2016", "eyr:2024 hgt:168cm hcl:#602927 iyr:2013 byr:1993 pid:681091728 ecl:gry cid:203", "pid:037922164 iyr:2020 byr:1990 hgt:156cm eyr:2023 hcl:#866857 cid:97 ecl:grn", "hgt:170cm pid:980455250 iyr:2011 ecl:hzl byr:1957 eyr:2030 hcl:#cfa07d", "hgt:158cm hcl:#602927 byr:2002 ecl:hzl iyr:2013 cid:99 eyr:2020 pid:48646993", "byr:1955 pid:814033843 eyr:2030 hcl:#a97842 hgt:191cm iyr:2019", "pid:111196491 hgt:191cm iyr:2012 ecl:blu hcl:#a97842 eyr:2026 cid:131 byr:1979", "hcl:#fffffd hgt:68in cid:121 ecl:oth eyr:2024 pid:343836937 byr:1955 iyr:2020", "eyr:2025 byr:1954 pid:737517118 cid:343 hcl:#b6652a iyr:2017 ecl:hzl hgt:175cm", "ecl:brn iyr:2011 hgt:171cm cid:102 pid:066348279 byr:1981", "ecl:oth iyr:2018 byr:1975 eyr:2029 hgt:185cm cid:226 pid:978243407 hcl:#341e13", "iyr:2015 pid:918017915 hcl:#3e52b7 byr:1999 ecl:brn cid:314 eyr:2025 hgt:192cm", "hcl:#19d1fa byr:1984 ecl:dne hgt:76in iyr:2015 cid:118 pid:417075672 eyr:2020", "iyr:2019 cid:120 hgt:186cm hcl:#733820 eyr:2024 pid:423238982 ecl:brn byr:1968", "hgt:70cm cid:173 pid:767014975 hcl:#866857 eyr:2039 ecl:brn byr:1985", "pid:340424924 eyr:2027 hcl:#7d3b0c hgt:168cm ecl:hzl iyr:2016 byr:1994", "ecl:hzl byr:1933 pid:580425691 iyr:2010 hcl:#c0946f eyr:2024 hgt:64in", "hcl:#9fe6b0 pid:913184461 ecl:grn eyr:2030 cid:262 iyr:2014", "ecl:amb pid:640007768 eyr:2030 byr:2017 iyr:1988 hcl:z", "byr:1977 cid:54 eyr:1939 pid:882762394 iyr:2030 hcl:#ceb3a1 ecl:blu", "iyr:2011 hcl:#7d3b0c byr:1928 pid:340969354 cid:199 hgt:168cm eyr:2029 ecl:hzl", "pid:729464282 iyr:2012 hcl:baae60 eyr:2026 ecl:hzl hgt:166cm byr:2019", "pid:930997801 iyr:2019 eyr:2030 hcl:#866857 ecl:oth byr:1960 cid:235 hgt:73in", "ecl:brn byr:1988 hgt:179cm iyr:2017 pid:864768439 cid:305 hcl:#c0946f eyr:2029", "hcl:#7d3b0c ecl:grn hgt:182cm eyr:2021 pid:719891314 byr:1920 iyr:2017", "hgt:62cm cid:71 ecl:brn hcl:#fffffd iyr:2025 eyr:1997 pid:175cm byr:2022", "hcl:#cfa07d cid:239 eyr:2025 ecl:hzl hgt:189in byr:1980 iyr:2020 pid:703047050", "byr:1951 eyr:2030 ecl:hzl pid:130992467 hgt:157cm hcl:#341e13", "hgt:175cm hcl:#623a2f cid:68 eyr:2025 byr:2001 ecl:oth pid:253618704 iyr:2016", "hcl:#fffffd pid:379344553 ecl:grn eyr:2026 hgt:72in byr:1974 iyr:2013", "ecl:#b4e952 byr:1970 hcl:z eyr:2039 pid:6056894636 iyr:2021 hgt:165cm cid:328", "hcl:#602927 iyr:2014 pid:890429537 byr:1957 hgt:68in eyr:2020 ecl:hzl", "cid:265 byr:1961 hcl:#ceb3a1 eyr:2022 iyr:2016 hgt:184cm pid:921615309", "byr:1951 eyr:2024 hcl:#341e13 ecl:amb pid:414644982 iyr:2010 hgt:159cm", "iyr:2015 cid:319 eyr:2029 ecl:brn pid:380237898 hcl:#efcc98 hgt:157cm byr:1972", "pid:237156579 ecl:#312a91 hgt:167cm iyr:2011 hcl:#c0946f eyr:2021 byr:1953", "ecl:hzl iyr:2015 pid:10160221 eyr:2025 hgt:175cm hcl:z byr:1939", "hgt:59in hcl:#18171d byr:1962 ecl:hzl iyr:2019 eyr:2025 cid:337 pid:491938615", "ecl:utc hgt:82 pid:51674655 byr:2020 eyr:1954 iyr:2029 hcl:z", "pid:119530189 cid:103 iyr:2010 byr:1979 hgt:168cm hcl:#a97842 ecl:brn eyr:2029", "hgt:177cm ecl:brn byr:1990 pid:015089628 eyr:2028 hcl:#733820 iyr:2020", "ecl:blu iyr:2020 hgt:189cm hcl:#efcc98 byr:1982 pid:346500376 eyr:2021 cid:160", "ecl:brn hgt:173cm iyr:2011 cid:259 hcl:#6b5442 eyr:2026 byr:1995 pid:654875035", "ecl:grn eyr:2025 pid:147155222 byr:1942 cid:341 hcl:#602927 hgt:165cm iyr:2016", "pid:543171646 hgt:153cm iyr:2019 hcl:#fffffd byr:1985 cid:266 eyr:2027 ecl:hzl", "ecl:blu eyr:2022 pid:667939101 byr:1974 cid:259 hcl:#888785", "eyr:2030 byr:2016 iyr:2022 pid:86902982 ecl:zzz hgt:72 hcl:ceb867", "hcl:#fffffd ecl:grn pid:046978329 byr:1924 eyr:2025 hgt:158cm iyr:2011", "hgt:150cm eyr:2028 byr:1985 ecl:gry hcl:#866857 pid:340615189 iyr:2017 cid:50", "cid:171 hcl:#18171d pid:009562218 byr:1981 hgt:175cm eyr:2024 ecl:oth iyr:2017", "iyr:2019 eyr:2022 ecl:brn hcl:#cfa07d pid:050270380 cid:159 hgt:151cm byr:1951", "hcl:#7d3b0c hgt:176cm iyr:2015 byr:1923 pid:348188421 ecl:blu eyr:2029", "byr:1997 hgt:162cm eyr:2023 pid:445685977 iyr:2012 ecl:amb hcl:#efcc98", "iyr:2017 ecl:oth eyr:2028 pid:791977055 hgt:170cm byr:1991 hcl:#623a2f", "byr:1998 hcl:#fffffd eyr:2020 ecl:gry pid:039483695 hgt:163cm iyr:2020 cid:165", "ecl:hzl hgt:74in iyr:2016 pid:026214321 cid:152 hcl:#a1f179 eyr:2036 byr:2001", "pid:257900949 cid:80 byr:1956 iyr:2012 hgt:165cm eyr:2030", "pid:918371363 ecl:xry iyr:2012 byr:2012 hgt:65cm eyr:2029", "pid:041789006 iyr:2018 byr:1945 eyr:2024 ecl:blu hcl:#5ab31e hgt:171cm", "ecl:gry byr:1956 cid:318 iyr:2020 hcl:#623a2f eyr:2030 pid:020576506 hgt:184cm", "hgt:173cm iyr:2025 eyr:2023 ecl:amb pid:958983168 hcl:#866857 byr:1935", "byr:1974 eyr:2040 pid:57104308 iyr:1980 hcl:z hgt:192in cid:295 ecl:amb", "pid:180cm hcl:1109f7 eyr:2039 byr:2020 ecl:dne hgt:189in iyr:1921", "iyr:2013 byr:1961 hcl:#866857 eyr:2025 hgt:158cm ecl:gry", "ecl:brn iyr:2013 eyr:2021 pid:978650418 byr:1980 hcl:#ceb3a1 cid:110 hgt:166cm", "pid:864880558 ecl:hzl hcl:#c0946f byr:1955 eyr:2027 hgt:169cm iyr:2011", "eyr:2023 hgt:191cm hcl:#866857 pid:454509887 ecl:grn byr:1938 iyr:2015", "pid:793008846 eyr:2025 ecl:grn hcl:#341e13 hgt:187cm byr:1973 cid:224 iyr:2013", "hcl:#866857 eyr:2022 pid:802335395 hgt:171cm ecl:amb iyr:2015 byr:1991", "hcl:#888785 pid:768625886 hgt:180cm eyr:2026 ecl:oth cid:178 byr:1958", "pid:921387245 cid:82 hgt:190cm hcl:#c0946f ecl:grn iyr:2015 eyr:2023", "pid:0704550258 hcl:1ba8f6 iyr:2010 byr:1978 cid:130 eyr:2030 ecl:dne hgt:66cm", "pid:626293279 hcl:#7d3b0c hgt:185cm ecl:oth eyr:2020 byr:1937 iyr:2012", "hgt:175 eyr:1933 ecl:gry hcl:#7d3b0c byr:2003 pid:#5d8fcc iyr:2012", "eyr:2027 byr:1927 cid:154 ecl:gry pid:683668809 hgt:164cm hcl:#a97842 iyr:2011", "byr:1940 iyr:2014 hgt:172cm eyr:2024 pid:033678324 hcl:#10fded cid:292 ecl:oth", "iyr:1970 ecl:#201515 pid:#4cd485 eyr:2034 hgt:162 byr:2005 cid:67 hcl:#c0946f", "cid:306 byr:1948 hcl:#efcc98 eyr:2024 hgt:171cm pid:440657854 iyr:2015 ecl:brn", "hgt:172cm ecl:brn byr:1958 pid:054926969 hcl:#4b8065 iyr:2019", "pid:45977569 ecl:amb byr:2002 hgt:71cm hcl:z iyr:1983", "pid:811407848 hcl:#866857 cid:112 hgt:180cm byr:1986 ecl:brn eyr:2026", "ecl:amb byr:1992 cid:288 pid:417117245 hcl:#623a2f iyr:2011 hgt:181cm eyr:2021", "byr:1974 hgt:192cm cid:172 eyr:2022 ecl:blu hcl:#cfa07d iyr:2014", "eyr:2024 ecl:gry pid:874569675 byr:1960 iyr:2017 hgt:186cm hcl:#6b5442", "byr:1988 eyr:2024 iyr:2020 ecl:oth hcl:#866857 pid:227304269 hgt:170cm", "ecl:grn iyr:2019 byr:2002 cid:150 hcl:#efcc98 pid:600740993 hgt:167cm eyr:2027", "pid:553824537 iyr:2019 ecl:blu eyr:2025 hcl:#e21269 hgt:193cm byr:1923", "byr:2030 iyr:2019 ecl:#cb0911 hcl:#cfa07d hgt:74in eyr:2012 pid:7647207386", "cid:289 hgt:128 pid:178cm iyr:2025 ecl:#4ad977 byr:2020 eyr:2036 hcl:#efcc98", "cid:119 hgt:150in hcl:z iyr:2012 ecl:brn eyr:1975 byr:2007 pid:#0dcd32", "hcl:8a1ce7 pid:0434291854 eyr:2034 iyr:2005 hgt:62cm byr:2029 ecl:utc", "ecl:gry hcl:#ceb3a1 byr:1976 eyr:2024 iyr:2010 hgt:188cm pid:636312902", "hcl:#888785 byr:2027 hgt:178in iyr:2017 pid:973095872 eyr:1952", "hgt:179cm iyr:2015 hcl:#ceb3a1 byr:1944 pid:182079308 cid:317 eyr:2025 ecl:hzl", "hcl:#6b5442 ecl:grn eyr:2023 hgt:71in pid:829794667 byr:2000 iyr:2014 cid:192", "iyr:2014 pid:096659610 hcl:#c0946f ecl:oth byr:1991 cid:180 hgt:177cm eyr:2023", "byr:2017 eyr:2036 iyr:1933 cid:225 ecl:gmt hgt:179in hcl:b5c44d pid:99932231", "hcl:#18171d hgt:187cm eyr:2023 byr:1934 cid:286 pid:878541119 iyr:2020 ecl:amb", "hgt:185cm pid:754207134 ecl:oth eyr:2023 hcl:#a97842 cid:313 byr:1966 iyr:2015", "hcl:#ceb3a1 byr:1921 eyr:2022 pid:799265846 cid:285 hgt:67in iyr:2015", "iyr:2011 byr:1941 hcl:#341e13 cid:65 pid:413556937 hgt:169cm ecl:amb eyr:2020", "iyr:2016 hgt:158cm ecl:grn byr:1931 hcl:#7d3b0c", "pid:574299170 iyr:2013 byr:1961 ecl:hzl hcl:#866857 hgt:168cm eyr:2022", "eyr:2022 pid:245416405 iyr:2019 hgt:173cm hcl:#c0946f ecl:brn byr:1965", "byr:1980 hgt:162cm ecl:brn pid:239318191 hcl:#fffffd cid:58 eyr:2025 iyr:2020", "pid:892646915 iyr:2012 hcl:#733820 byr:1991 eyr:2021 hgt:157cm ecl:oth", "pid:310597466 eyr:2025 hcl:#cfa07d byr:1944 iyr:2018 ecl:oth hgt:183cm", "iyr:2010 hgt:187cm ecl:oth pid:975763328 hcl:#866857 eyr:2023 cid:283 byr:1997", "iyr:2020 cid:225 hcl:#efcc98 pid:424680047 ecl:blu hgt:154cm byr:1968 eyr:2027", "ecl:oth eyr:2020 hgt:183cm hcl:#623a2f pid:771851807 byr:1990 iyr:2017", "hcl:#efcc98 ecl:blu byr:1991 hgt:191cm pid:266021118 cid:124 eyr:2025", "byr:1993 ecl:hzl eyr:2020 hgt:163cm iyr:2015 pid:831538073 hcl:#18171d", "hgt:74in hcl:#420afb eyr:2028 ecl:grn pid:264469103 byr:1993", "eyr:2020 cid:79 byr:1972 pid:084953331 hcl:#a97842 ecl:brn iyr:2010 hgt:170cm", "iyr:2014 ecl:gry pid:094812116 eyr:2026 hgt:190cm byr:1965 hcl:#944667", "hcl:#fffffd byr:1953 iyr:2014 ecl:hzl hgt:164cm cid:123 eyr:2023 pid:546394433", "iyr:2012 hgt:155cm byr:1998 pid:#2c9be6 eyr:2023 hcl:#ceb3a1 ecl:gry", "eyr:2029 ecl:gry pid:752489331 iyr:2015 hgt:167cm hcl:#18171d cid:70 byr:2002", "byr:1938 ecl:gry pid:764937909 iyr:2014 hcl:#7d3b0c eyr:2022 cid:145 hgt:184cm", "cid:340 byr:1924 hgt:169cm eyr:2026 iyr:2013 ecl:amb pid:499844992 hcl:#18171d", "pid:838417672 hgt:175cm ecl:grt iyr:2017 eyr:2025 hcl:17aa1a", "eyr:2020 byr:1925 hcl:#341e13 ecl:brn cid:342 pid:047426814 hgt:156cm iyr:2012", "iyr:2011 hcl:#341e13 byr:1959 ecl:amb pid:969679865", "byr:1978 cid:320 hgt:180cm hcl:#435ceb pid:363518544 eyr:2023 iyr:2016 ecl:blu", "iyr:2010 eyr:2028 pid:183cm byr:1948 ecl:oth cid:133 hcl:#8d3298 hgt:190cm", "hcl:#6b5442 byr:1929 iyr:2019 pid:207713865 eyr:2029 hgt:166cm ecl:gry", "ecl:blu iyr:2019 byr:1985 eyr:2030 hcl:#866857 hgt:155cm pid:659180287", "ecl:hzl eyr:2020 iyr:2016 pid:440624039 cid:147 hgt:61in byr:1976 hcl:#733820", "hcl:#341e13 pid:178082907 eyr:2023 iyr:2015 byr:1956 ecl:amb hgt:163cm", "eyr:2023 iyr:2011 hcl:#cfa07d hgt:164cm pid:291621559 byr:1960 ecl:gry", "hcl:#efcc98 byr:1976 iyr:2017 pid:394566091 cid:248 hgt:176cm ecl:hzl eyr:2026", "iyr:2013 eyr:2029 hgt:152cm ecl:gry byr:1984 hcl:#623a2f pid:511780941", "pid:953716819 iyr:2010 hgt:156cm ecl:amb byr:1947 hcl:#18171d eyr:2025", "eyr:2025 ecl:amb iyr:2016 hcl:#cfa07d byr:1925 pid:322787273 hgt:168cm", "hgt:59in iyr:2012 pid:916978929 byr:1959 hcl:#c0946f eyr:2021 ecl:brn", "byr:2018 eyr:1929 hgt:187in hcl:z iyr:2003 pid:0377361331 ecl:utc", "byr:1949 hcl:#fffffd pid:071791776 eyr:2030 iyr:2015 hgt:71in ecl:hzl", "hcl:#341e13 hgt:154cm byr:1927 eyr:2023 ecl:blu iyr:2017 pid:639867283", "hcl:z pid:315276249 byr:2026 hgt:151cm iyr:2028 eyr:2020 ecl:hzl", "hcl:#341e13 eyr:2027 byr:1981 cid:342 pid:999898177 hgt:187cm ecl:blu iyr:2011", "byr:2009 hgt:73cm iyr:1921 hcl:z pid:181cm ecl:xry", "ecl:hzl byr:1925 pid:034183103 hcl:#341e13 hgt:158cm eyr:2029 iyr:2010", "byr:1976 iyr:2011 hgt:177cm pid:833479839 hcl:#dcab9d ecl:blu eyr:2020", "cid:230 hcl:#7d3b0c byr:1954 iyr:2014 eyr:2026 pid:122150889 ecl:brn hgt:182cm", "hcl:#a97842 ecl:brn hgt:187cm eyr:2028 pid:427631634 iyr:2002 byr:2004", "pid:912516995 ecl:hzl iyr:2017 hcl:#ceb3a1 byr:1929 eyr:2028 hgt:155cm", "pid:019809181 cid:128 iyr:2013 hcl:#f5b9f7 byr:1931 hgt:161cm ecl:amb", "hgt:64in byr:1924 iyr:2016 eyr:2029 ecl:hzl pid:474940085 hcl:#c0946f", "pid:172419213 ecl:grn hgt:193cm iyr:2010 byr:1973 hcl:#6b5442 eyr:2027", "ecl:#7b5cfd iyr:2019 byr:2016 eyr:2040 hgt:191in cid:187 hcl:z pid:#c61084", "eyr:2032 iyr:2014 pid:430247344 byr:1967 hcl:#ceb3a1 cid:241 ecl:brn hgt:178in", "hcl:#623a2f iyr:2017 cid:235 eyr:2020 byr:1978 ecl:blu hgt:175cm", "iyr:2013 ecl:amb hgt:174cm hcl:#866857 pid:285533942 byr:1954", "hgt:152cm ecl:blu pid:952587262 eyr:2024 iyr:2019 cid:268 hcl:#602927 byr:1947", "hgt:176in cid:245 byr:2011 iyr:2018 eyr:1987 hcl:z pid:346518170 ecl:utc", "hgt:180cm iyr:2015 ecl:brn eyr:2027 pid:807494368 cid:324 byr:1980", "byr:1936 hcl:#866857 ecl:blu eyr:2021 hgt:187cm iyr:2016 pid:244556968", "byr:1950 cid:125 iyr:2020 hgt:168cm hcl:#c0946f eyr:2030 pid:758313758 ecl:blu", "eyr:2021 pid:618915663 hcl:#cfa07d iyr:2018 byr:2002 hgt:157cm ecl:blu", "byr:1967 ecl:brn hcl:#c0946f pid:200495802 eyr:2021 iyr:2020 cid:335 hgt:181cm", "byr:1996 ecl:brn iyr:2015 eyr:2030 hcl:#fffffd cid:207 pid:022460311 hgt:158cm", "eyr:2022 hgt:59cm iyr:2023 byr:1974 pid:354098699 hcl:b244f7 ecl:#219505", "hcl:#866857 eyr:2025 pid:370874666 byr:1947 cid:162 ecl:oth hgt:186cm iyr:2011", "ecl:hzl eyr:2029 byr:1981 iyr:2012 pid:433430792 cid:252 hgt:171cm", "pid:512473844 hgt:186cm iyr:2012 eyr:2028 byr:1949 ecl:hzl hcl:#18171d", "hgt:60cm iyr:1934 ecl:#4a4017 pid:3067366202 hcl:1161df eyr:1938 byr:2008", "pid:119509757 hcl:#cfa07d eyr:2022 hgt:174cm byr:1983 iyr:2015 ecl:blu", "byr:1955 eyr:2023 cid:114 hcl:f1aa8a pid:609049659 ecl:grn hgt:177cm iyr:2015", "eyr:2027 cid:284 pid:654627982 byr:1964 iyr:2018 hgt:168cm hcl:#fffffd ecl:oth", "iyr:1988 hgt:191cm hcl:b87a62 byr:1990 ecl:xry pid:996624367 eyr:1960", "pid:641466821 eyr:2028 hcl:#7d3b0c iyr:2010 hgt:175cm ecl:gry", "hcl:#b6652a ecl:oth byr:1926 eyr:2030 iyr:2019 hgt:183cm pid:057196056", "iyr:2017 eyr:2022 pid:936841429 ecl:blu hcl:#6b5442 cid:179 byr:1927 hgt:161cm", "eyr:2021 cid:289 hgt:174cm iyr:2013 ecl:grn pid:329574701 byr:1970", "eyr:2021 byr:1939 ecl:gry pid:933505139 iyr:2014 hgt:173cm hcl:#7d3b0c", "cid:116 hcl:045bff eyr:2030 iyr:1920 ecl:brn byr:2030 pid:#38f7f3 hgt:155in", "eyr:2028 pid:225829241 byr:1928 hcl:#cfa07d iyr:2019 ecl:oth hgt:166cm", "cid:80 byr:1936 iyr:2017 hgt:94 hcl:#2e7503 ecl:oth eyr:2030 pid:597284996", "ecl:oth iyr:2019 hgt:76in byr:1956 pid:821874039", "eyr:2026 hgt:168cm pid:019015588 iyr:2010 ecl:amb byr:2009 hcl:#623a2f cid:159", "iyr:1980 hgt:167in pid:380644909 eyr:1966 ecl:blu byr:2004 hcl:z", "eyr:2020 iyr:2013 hcl:#08ad66 pid:540886868 ecl:oth byr:1980 hgt:158cm", "eyr:2026 hgt:186cm byr:1995 cid:275 hcl:z iyr:1958 ecl:blu", "eyr:2026 iyr:2012 hgt:61in byr:1936 pid:390833536 cid:298 ecl:grn hcl:#623a2f", "pid:393878498 eyr:2023 ecl:gry byr:1943 iyr:2010 hcl:#888785 hgt:158cm", "hgt:191cm cid:197 iyr:2014 byr:1945 hcl:#fffffd eyr:2020 pid:183948344 ecl:amb", "ecl:gmt hgt:88 cid:260 iyr:2024 byr:2022 eyr:2031 hcl:z pid:#532c6e", "hcl:#a97842 hgt:160cm eyr:2024 ecl:blu iyr:2015 byr:1970", "byr:1964 hgt:178cm eyr:2025 pid:813643223 ecl:brn iyr:2014 hcl:#ceb3a1", "byr:1965 eyr:2024 iyr:2018 hgt:165cm hcl:#18171d ecl:grn pid:475669993", "hgt:116 iyr:2024 eyr:1974 hcl:504345 byr:2010 cid:206 pid:166cm ecl:zzz", "iyr:2014 eyr:2020 pid:096460673 byr:1948 hgt:153cm ecl:blu hcl:#341e13", "hcl:#ceb3a1 iyr:2017 hgt:67cm pid:178cm byr:2028 ecl:brn cid:293", "hgt:157cm hcl:#602927 byr:1941 iyr:2012 pid:611003211 eyr:2029", "iyr:2019 byr:2000 pid:083917767 eyr:2024 hgt:172cm cid:248 hcl:#7e4d15", "byr:1946 hgt:160cm iyr:2020 hcl:#559278 pid:989139577 ecl:amb eyr:2020", "pid:165cm byr:1927 cid:178 hcl:#733820 iyr:2017 hgt:156in eyr:2029 ecl:brn", "hcl:#18171d hgt:163cm eyr:2022 byr:1962 pid:639124940 cid:258 ecl:hzl iyr:2015", "cid:123 pid:4542006033 eyr:1987 byr:2010 iyr:2029 ecl:amb hgt:191cm hcl:#18171d", "hcl:z byr:1928 iyr:1965 eyr:2022 hgt:75 ecl:oth pid:400765046", "hcl:#c0946f hgt:62in ecl:blu byr:1978 iyr:1923 cid:260 eyr:2021 pid:404628742", "pid:#bf1611 ecl:grn iyr:2018 cid:146 byr:1948 eyr:2025 hcl:#fffffd hgt:87", "pid:767547618 iyr:2018 hcl:#b6652a eyr:2029 hgt:165cm ecl:hzl byr:1937", "ecl:blu iyr:2019 pid:960083875 eyr:2027 hgt:71in hcl:#c0946f byr:1921", "iyr:2011 pid:9562042482 hcl:z hgt:59cm eyr:1994 cid:258 ecl:#6c1bcc byr:2025", "eyr:2028 pid:494999718 byr:1928 hgt:176cm iyr:2015 ecl:oth hcl:#733820", "cid:78 eyr:2020 hgt:160cm byr:1947 ecl:blu hcl:#b6652a iyr:2016 pid:069457741", "hcl:#6b5442 iyr:2010 byr:1971 eyr:2028 hgt:169cm ecl:brn pid:528961949", "eyr:2028 hcl:#7d3b0c byr:1952 ecl:hzl cid:317 iyr:2016 pid:832169844", "hcl:#c0946f ecl:brn iyr:2017 eyr:2028 pid:161390075 byr:1993 cid:50 hgt:171cm", "ecl:#ae12d3 hgt:74cm cid:239 hcl:z pid:345439730 iyr:1924 byr:2029 eyr:2031",]; 5 | static VALID_KEYS: [&str; 7] = ["byr","iyr","eyr","hgt","hcl","ecl","pid"]; 6 | 7 | fn parse_passport(s: &str) -> Option> { 8 | let passport = s.split_whitespace() 9 | .flat_map(|p| p.split(':')) 10 | .tuples() 11 | .collect::>(); 12 | if VALID_KEYS.iter().any(|k| !passport.contains_key(k)) { 13 | return None; 14 | } 15 | Some(passport) 16 | } 17 | 18 | fn is_valid_passport(passport: &HashMap<&str,&str>) -> bool { 19 | passport.iter().all(|(&k, v)| match k { 20 | "byr" => (1920..=2002).contains(&v.parse().unwrap_or(0)), 21 | "iyr" => (2010..=2020).contains(&v.parse().unwrap_or(0)), 22 | "eyr" => (2020..=2030).contains(&v.parse().unwrap_or(0)), 23 | "hcl" => v.starts_with('#') && v.len() == 7 && v.chars().skip(1).all(|c| c.is_ascii_hexdigit()), 24 | "ecl" => ["amb","blu","brn","gry","grn","hzl","oth"].contains(v), 25 | "pid" => v.len() == 9 && v.chars().all(|c| c.is_ascii_digit()), 26 | "cid" => true, 27 | "hgt" => { 28 | let height = v[0..(v.len() - 2)].parse().unwrap_or(0); 29 | match &v[(v.len() - 2)..] { 30 | "cm" => (150..=193).contains(&height), 31 | "in" => (59..=76).contains(&height), 32 | _ => false 33 | } 34 | }, 35 | _ => unreachable!() 36 | }) 37 | } 38 | 39 | aoc2020::main! { 40 | let passports = INPUT.iter() 41 | .filter_map(|s| parse_passport(s)) 42 | .collect::>(); 43 | let part_two = passports.iter() 44 | .filter(|p| is_valid_passport(p)) 45 | .count(); 46 | (passports.len(), part_two) 47 | } 48 | -------------------------------------------------------------------------------- /src/bin/05.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashSet; 2 | use itertools::Itertools; 3 | 4 | static INPUT: [&str; 881] = ["FFBBBFFLRL","BFFBFBFRLR","FFFBBFBRRR","BFFBBBBRRL","FFFBBFBLLR","BBFBFBFLLR","FBBFFBFLRL","BFBFBBFLLL","FBFBBFBLRR","FFFBBBBRLR","FFFFBFFRRL","BFFFBFBLRL","BBFFFBBRLL","FFBFFFBLRL","FBFBFFFRLL","BFFBBBFRRL","BFFFBBFRLR","BBBFFFBRLL","FBBBFFBRLL","FFFBFFBRLL","BBFBFBFLLL","BFFBFFFLRL","BBFBBFFLRL","FBFBBBFRRR","FBBBBFBRRL","FBBFFFFLRL","FFFBBFBLRL","BFFFFFFLLR","FFBFFBBRRR","FFFFBBBRLR","FFFBFFFLRR","FBBFBBFLLL","FBBFBBBRLR","BFFBFFFLLR","FFBFBFFRLL","FFFFBBFLRR","BBFBBBFLRR","BFBFBBBRLR","BFFBBFFLRL","BFFBFFFLLL","FBFFFBFLRR","FFFBBBFRLR","FBBFBBFRLL","BBFFFBBLLL","BBFFFFFLLL","FBFFBBBLLL","FBFFFBFLRL","FFBFBBFLLL","BFFBBFBLLR","BFBBBFFRRR","BFBBBBBLLR","FBFFFFFRLR","BBFFBFFLLR","FFBFBFFLLR","BBFBBBFRRL","FFFBFFFRLR","FBFBFFFLRL","BBFFFFBLLL","FFBBFFFLRL","BBFFBFBRRR","FBBFBBBLLR","BFFFBFBRRR","BBFFFFFLRL","FBFBBFBRRR","FFFBBBBLRR","FBBFBFFLLR","BBFBFFFRLR","BBFFFFBRLR","FBFBFFBRLR","FFFBBFFLLR","FBBFFFFLRR","BBFFBBBLLR","BBFFFFBRRL","BFBBBBBRRL","FBBBFFBRLR","FFBBBFBRLR","BFBBBBBRLR","FBFBBBFRLR","BBFBBFBRRR","FFBFFBBLRR","FFBBBBFLLR","BFFFBBBLRL","FBBFBFFLRL","FBFFBFFRRL","FBBBFFFRRR","FFBBFBFRLL","FBBFBBBLLL","FFFFBFFRLR","BBFBBBFRLR","FBFBBBBLRL","FFFFBBBLRL","BFFBBFBRRL","BBFFFBFRLR","FBFFBFFRRR","BBFBBFBRLL","FBBFBFFRRR","BFFFBFBLRR","FFFBBFBLRR","FFBFBFFRRL","FFBBBBBRLR","FBBBBBBLLR","BBFBFBBRRL","FBBFFFFRLR","BFBBBBFRRL","FBBFFBFLRR","FFFBBBBLRL","BBFFBBFLRR","BFBFFBBRLL","FFBBBBBLRR","BBBFFFFRRR","BFFFFBFRRR","FBFFFFBLRR","FBBBBBFLRR","FFBBBBFRRR","FFBFBFFLLL","FBFBFFFLLR","BFBBBBFLLL","FBBFBBFRLR","FFFBFBFLLL","FBBFBBFLLR","FBFFFFFRRL","BFFBBBBRLL","BFFBFFBLRR","FBBFFFBLLR","FBBFBFBLLL","BFFFBFBRLR","FBFBFBBRLR","FBFFFBFRRR","BFFBBFFRRR","BFBFFFBRRL","BFFBFBBRRL","BBFFBFBRRL","FBBBBFBRRR","FFFBBBBRRL","BFFFFBFLLL","FBBBFBFLLR","BBFFBFFRLR","FBBFBFFRLR","BFFFBFFLRR","FBBFFBFLLL","FFBBFFBRRR","FFBFFFBLRR","FFBFBBBRLR","BBFBBFFLLR","BBFFFBFLRR","FFFBBBFLRR","FBFFFBFLLR","BBFBFBFLRL","BFBFBBBLRR","BFFBBFFRLR","FBFBBBBRLL","BBFFBBBLRL","BBFFFBFLLR","BBFFBFFRLL","FFFFBFBRRR","BFBFFBBLRR","BFBBBBBRLL","FBBFFFFRRR","BFFFBBBRRL","BFFBFBFLRL","FFFFBFFRLL","FBFFFFBRRL","BBBFFFBRRL","BFBBFFFLLL","FFFFBBBRRL","FBFFBBBRLR","FFBFFFFRLL","BFFBBBBRRR","BBFFBBFRRL","BFBBBFBLLL","FBBBFBBLLL","FBFBFFFLLL","BFBFFFFRLR","FFBFFBFLLR","BFFBFBBRLL","BFBBBFFLLL","FBBFBFFRLL","FFBFBBFLLR","FBFBFBBRRL","BFBFBFFLRL","FFBFFFFRRL","BFFBFFFRLR","BFFFBBBLRR","BBFBFBBLLR","BFFBFBFLLR","BFBBFBFRRR","FBFBFFBLRR","BBFBBBBRRL","BFFFBFFLLR","FFFFBBFRRL","FFFBFFBRRL","FBFFFBBRRR","BFBBBBFLLR","BBFBFBFRRL","FFFBBFFLRL","BBBFFFFLRL","FFFBFFFRRL","FBFBFFFLRR","FFBFBBFLRL","BBFBFBFRLR","BBFBBFFRLR","FBBFBFBRRR","FBFFFBBRLR","BBFFBBBRLL","BFFBFFBLLR","FBBBFBBLRL","FFFBFFFRRR","BFBBBFFLLR","FBBFFFFLLL","BFBBFBFRRL","FBBFFBBRRR","BFBFFFBLRL","BBBFFBFLLL","FFBFFBFRRL","FBFFBFBRRL","BFFFFBFRLL","FFBFFFBRLL","FFBBFFBLLL","BFFBBFFLLL","FBFFFFBLRL","BFBFFBFLLR","FFFFBBBLRR","BFFBFBBRLR","FBBBFFFRRL","BBFBFBBLLL","FFBBBFBRRL","BBFBFFBLRR","FBFBFFBLRL","BBFBBFBLRL","BFBBFFBRRL","FFBBBFBLLL","FFBFBBFRLL","BFFFFBBLLL","FBBBFBBLRR","FBFBBFBLLL","FFBBBBFRRL","BBFBBBBLLL","FBFBBBBLLR","BFFFBFBLLR","FBBBFFFRLR","FFBBBFBRRR","BBFFFFBLLR","BBFFBBBLLL","BBFFBBFLRL","BBBFFFBLRR","BBBFFFFRLL","BFBFFFFRRR","BFFFBFBRRL","FBBBBBBLRL","FFBFBBBRRL","FFBFBFFLRL","FFBBFFFLLL","BBFFBFBLLR","BFBBBFBRLL","FFBBBFBRLL","FBFBBFBRRL","FBFFBFFLLR","BBBFFFBRRR","BBFBBBBLRR","BBFFBBBRLR","FBBBBFFRRR","BFFFFBBLRR","FFBFFBBRRL","FBFBBBFRLL","BBFBFBBLRL","BFBBFBBRRR","BFBBFBBRLR","FFFBFBBLLR","FFFBFFFLLR","BFFFBBFLRL","FBFBBFFLRL","BFBFBBBRRL","BBFBFBBRRR","BBFFBFBRLR","BFBFBFBRLL","FBBFBFBLRL","FFBBFBBRRL","FFBFFFBLLL","FBBBFFBRRL","BFBBFFBLRL","FFFBBBBRLL","FBFBFBFLRR","FFFBFBFLRL","BFBBBBBLRR","BBFFBFFLLL","FFFFBFFLRR","FFBBFFBRLR","FBBBFFBLRR","FBBBBFBLRL","FBFFBBFRLR","FFBFBFFRRR","FBFFFBFRLL","FFFBFBFRRR","BFFFBFFRRL","FFFBFBFLRR","BBFFBFFLRL","BBBFFBFLLR","FFFBFFBLRL","BFBBBBFRRR","BFFBFFFLRR","FBFFFFBRRR","BFFBFFFRLL","FBFFBFFRLL","FFFBBBBLLR","FFFBBBFLLR","BFBBBFFLRR","BBBFFFFRRL","FFFBBFFRRR","BBFFBBBLRR","FFBFFFBRRR","BFFBFFFRRL","BFFBFBFRRL","BBFFFBFLLL","FBFBFFBRRL","BFBFFFBLLR","FFBBBBBLRL","FBFBBBBRRL","BFFBBFBLRL","FBBFBBFLRL","FFBFFFBRLR","FBFFFBFRRL","FFFFBBFRLL","BFBBFBFLRL","FFFBFFBLLR","FBBFBFBRRL","FFBFFFBLLR","FFBBBBFLLL","BFBBBBFLRR","FBFFFBFLLL","BBFBFFBRRL","FBBBFBBRRR","FFFBBBBLLL","FBBBBBFRRL","BFBBBBFRLR","BFFBBBFRLL","FBFFFFFLRR","BFBBBBFLRL","FBFBFBBRLL","BFFBBBBLRR","BFFFFFFLLL","BBBFFFFLLL","BFBFFFFRLL","FBBFBFFLLL","BFBFFBBRLR","BBFBFFFRRL","FBFBFFBRLL","FBFBBFBLLR","FBFFBFBRLR","FBBFFBBRLR","FBBFBBFRRL","FFBBFFBRLL","FBFFBFFLLL","BBFBBFFRLL","BFFFFBFRRL","FBFBFBFRLL","FFFBBFBRRL","BFFFBBFRRR","BFFBBBFLRR","FBBFFBFRLL","BBFBFBBLRR","BBFBBFBRLR","BFBFBBFRRL","FBBBFFFLRL","FBFBFFBRRR","BFBFBBFRRR","FFBBFBBLRL","BFFBFFBRLR","BFFFFFBRRR","BBFFBBFRRR","BBFFBBFRLL","FFBFFBFRLR","BBFBBBBRLR","BBFFBBBRRL","BFFFBFFLRL","BFBBFBFRLR","FFBBBBBLLL","FBBBBFFRLR","BFBFFFBLRR","BFBFFFFRRL","BFFBBBBLLL","BFBBFFFRLL","FFFBBBFLLL","BFFBBFBLLL","BFFFBBFRRL","FBBBFBBRRL","BFFFBBFLLL","BBBFFFFLLR","BFBBFFFLRL","BFFBBBBLLR","FBBFFFBRRR","BFBFFFFLLR","FBFFBFBLLR","FFBBFFBLLR","FBFBBBFLLL","BBFFFBBRLR","BFBFBFFLLL","FBFFFBBLRL","BFFFBFFRLL","FBBFFFBRRL","BFFFFBBRLL","BFBFBBBLLL","BFBFBFBLLL","FFFBBFBLLL","BBBFFFBLRL","BFBBFBBLLR","BFBFBFFRRR","BBFFFFBLRR","BFFFBBBRRR","FBFFFFFRLL","FFBFFFFRRR","BFBBFFFRRL","BFFFBBBRLL","FFBBFBBRRR","FFBFBFBRRL","FFBFBBFRLR","BFBFFBBLRL","FBBBBBFLLR","BFBFFBBRRL","FFBFFFFLLL","FFFBBFBRLL","FBFBBFFLLR","BFBBFFBRLL","FFBBFBBLLL","FBBBFBFLRR","FFBBFBBLLR","FFBFFFFLLR","BFBBFBBLLL","BBFFBBFLLL","FFBBFFFRRL","FBFBBBBLLL","FBBBBBFLLL","FBBBBFBRLR","BBBFFFFLRR","FBFBFBFLLL","BFBBFFFLRR","FFBBFBBRLL","FBBBBFBRLL","FBFBBFFLRR","FBBBBBFRLR","BFBFBBFLRL","BFBFBFFLRR","FBFBFBFRRR","BFBFFFBRRR","FBBFFFFLLR","BFBFBFBLLR","BFFFFFFLRL","FFFBBBFRRL","BFFFBFFLLL","FFBFBBBRRR","BBFFFFBRLL","FBBBFBFLRL","BFBBBFBLRR","BBFFFBBRRR","FBFFBBFRLL","BFBBFBBLRL","FBBFBBBRLL","BBFBBBFLLR","FFBFFFBRRL","BBBFFFBLLR","FFFFBBBLLL","BFFFBFBLLL","BFFBFBBLRL","FBBFFFBRLR","BFBFFBFRRR","FBBBFBBRLL","FBBBBBFRRR","FBFFFFBRLR","BFFBBBFRLR","BFBBFBFLLR","BFBFBFFRLR","FBFFBFBRRR","FBFFFBBLLL","BFBFBFBRRL","FFFFBFBRLL","FFFBBFFRLR","FFFFBFBLRL","FFFBFFBLLL","FBFFBFFRLR","FBBBFFFLRR","FBFBFFFRLR","FFBFBBFLRR","FFFBFBBLRL","BBFFBFBLRR","BFBFFBFLRR","FBBFFFFRRL","FBFBBFBRLL","FBBBBFFLRR","FBFFFFFLRL","BFBBBFFRRL","FBFFBBBLLR","BBFFFBFRRL","FBBFFBBLRL","BBFFFFFLRR","FBBFFBBRLL","FBBFFBFRRL","FFBFFBFRRR","FBBBBFFRRL","BFBFBBBLLR","FBFFFFFRRR","FFBBFBFRRL","BFBBBFBRLR","FFBBFFBRRL","BBFFBBFRLR","FFBFBBBLRR","FFFBFFFLRL","BBFBBFBLLR","FBBBFBBLLR","BFBBFBFRLL","BBFBFFBRRR","FFBFFBBLRL","BFBFBBBRRR","FBBBFBFRRR","FFBBFFFRLR","BBFBFFBRLR","FFBFBBBLLR","BBFBFFFLRR","BBFFFBBLLR","BFFFFBBLLR","BFFBBFBRRR","BFFBBBFLRL","BFBBFFBLLL","FFFFBFFRRR","FFFBFFBLRR","BFFBFFBLRL","BFBBBBBLLL","FFBFFBFLLL","BFBFBFBRRR","BFFFFFBLRR","BFFFBBFLRR","BBFFFFFLLR","FFFBFBBRRL","FBFFBBFRRL","BBFBBBFLLL","BBFFFFBLRL","BFFFFFFLRR","FBBBBBBLRR","BFFBBBFLLR","FFBFBBFRRR","BFBFBFBLRL","FBFFBFFLRL","FBBBBBBRLL","FFBBBFFLLL","BFBFFFBLLL","FBBFFBBLLL","BBFFBFFLRR","FBBBBBBRLR","FBFFBBFLRL","FBBBBFFLLR","BFBFFFBRLR","FFFBFBBRRR","FFBBFBFLRL","BBFFBFFRRR","FBBFBFBLRR","BFBFBFBLRR","FBFBBFFLLL","FBFBBFFRLR","FBFFBBBRLL","FBBFBFBRLL","BFFFFFFRLL","FBBBBBBLLL","BFFBBFFRRL","FFBFBFBLLR","BFFFFFBRLR","FBFFFBBRRL","BFBFFBFRLR","BFFBFFFRRR","FFBFBBBLLL","BFBFFBFLLL","BFFFFBFLLR","FFBFBFBRLR","BBFBBBBRRR","BBFFFBFRRR","BFFFFFBRRL","FBFFBBFLLL","FBFFFBBLLR","BBFBFBFLRR","BFBFBFFRLL","FBFFFFFLLL","BFBBFBFLLL","FFBFBFFLRR","FBBFFFBLRR","FBBBFFBLRL","BFFFFBBRRR","FBFBBFFRLL","FFBFFBBRLR","FBFFFBBLRR","BFBBFFFLLR","BFBFBFBRLR","BFBFFBBRRR","FFBBBFFRLR","FFBFBBBLRL","FFBFBFBRLL","FFBBFBFRLR","FBFFBFBLRR","BFBBBFBRRL","FBBFFFBLLL","FBFBBBFLRL","FBFBBBFLRR","BBFBBBBLLR","BFFBBBFLLL","FFFFBBBRRR","FFBBFFFRLL","FFBBBFBLRR","FFFBFBBRLL","BBFFFFFRRR","FFBBBFBLLR","FFFBBFFLLL","FFFFBFFLRL","FFFFBBFRLR","BFBFBBFRLL","FFBFBFBLRR","FBBFFBBLLR","BBFBBBBRLL","FFFBFBFRRL","FBBFBFBRLR","FBBFBBBLRR","BFFBBBBLRL","FFFBBFFLRR","BFFFFBFRLR","FFBBBFFRLL","BFBFFFBRLL","BFBBFBFLRR","FFFFBBFRRR","FBFBBBBRLR","FBBBBBBRRL","BBFFBFBLLL","FBBFFBFLLR","BFBBBFFLRL","BBFBFFFLLR","BBFFBBBRRR","BFFBFBFRRR","FFBBBBBLLR","BBFBBBFRRR","FBBFBFFRRL","FBFFFBFRLR","BFFFBBBLLL","FBBFFBBRRL","FBBBBBFLRL","BBFBFFFLRL","FFFBFFFRLL","FFBFFBFRLL","BFFFBFFRRR","BFBBFFFRLR","BBBFFFFRLR","FBBBBFBLRR","BBFBFFBRLL","FBFFBBFLRR","BFFFBFFRLR","BFBFBBFRLR","BFFFBBBLLR","FBFBBFBRLR","FFBBBBFRLR","FBBBBFFRLL","BBFBFFBLRL","BFBFFBBLLL","FFBBFFBLRR","FBBBFFBLLL","BFFBFFBRRL","FBFFBBBRRL","FFBFBBFRRL","FBBFFBFRRR","FBBBBBFRLL","BBFBFBFRRR","FFFBBFFRRL","BFFFBBFRLL","FBFFBFBLRL","BFBBBFBLRL","FFFBBBFLRL","FFBBFBFLLL","BBFBFFBLLR","BFFFFFFRRL","BFFBFBBLRR","BFBFBBFLLR","FFBBBFFLLR","FBBFFBFRLR","FFFBBFBRLR","FBFFBFBLLL","FBBBBFBLLR","FFBBBFBLRL","BFFFFFBLLR","FBFFFFFLLR","FFFBFBBLLL","FFBBFFFLRR","BFFBFBFRLL","FBFBFBFLLR","FBFBFBBLLL","FBBFBFBLLR","BBFFFFFRRL","FBFFBFBRLL","FBBBFFFRLL","FBFBFBFRRL","BFFFFBBLRL","BBFBBFBLLL","BBFBBBBLRL","FBBBFBFRRL","FFFFBBFLLR","BFBFFFFLRL","BBFFFFBRRR","FFFFBBFLRL","BBFFFBFRLL","BFFFFBFLRL","BFFBFFBRRR","FBFBFFFRRR","FBFFBBBLRL","FFFBFBFRLR","FBBFFFFRLL","BBFBBFFRRR","FFBFFBBLLL","FFBFFFFLRL","BBFBBFFLRR","FBFBFFBLLR","FFBBFFFRRR","BBFBFFBLLL","FFFBFFFLLL","BFBFFBFRRL","FBBBFFFLLR","FBFBBBBLRR","FBFFBFFLRR","BBFFFFFRLR","FBBBFFBRRR","FFFBFFBRRR","FBFBFBBLLR","BFBBFFBRRR","BFFFFBBRLR","FBBFFBBLRR","BFFBFFBRLL","FFBBBFFRRR","BFFBFBBLLR","FBFBBFFRRL","FBFBFFBLLL","BFFFFFBLLL","BBFBBBFRLL","BFBBBBBRRR","BFFBBFBLRR","FFFFBBBLLR","BFFBFBBRRR","FBFFFFBLLL","FFBFBFBLRL","BFBFFFFLRR","BFBBFFBLRR","FFFBBBFRRR","FBBBBBBRRR","BFBFFBBLLR","FBBBFBFLLL","FBFFBBFRRR","FBBFBBBRRR","FFBFBBBRLL","BFBBBBBLRL","BFFBBFBRLR","FBFBBFBLRL","FBBFBFFLRR","BFFFFFBLRL","FFBBFFBLRL","FFFFBFFLLR","FBFBFBBRRR","FFBBFBFLLR","BFFBFFBLLL","FFFBFBBRLR","BFBFBBBLRL","BFBFFFFLLL","FFBBFBFRRR","FBFBBBBRRR","FBBBFFBLLR","BBFBFFFLLL","FBFBFBFRLR","FBFBFBBLRL","BFBBFFBLLR","FFBBBBBRRR","FFFFBFFLLL","BBFBFBBRLR","BFFBFBBLLL","BBFFBFBRLL","BFBBFBBRRL","BBBFFFBLLL","BBFFBFFRRL","FFFFBBBRLL","BFFFFFBRLL","BBFBFFFRRR","FFBFFBBRLL","BFFBBBBRLR","FFBBBBFRLL","FBBBBFBLLL","BFFFFBBRRL","BBFBBBFLRL","FBBFBBBRRL","FFFBBFFRLL","FFBBBFFLRR","FFBFFBFLRL","FFFBFFBRLR","FBFFFFBRLL","FBFFBBBLRR","FFFFBFBRLR","FBFBFBBLRR","BFBBFFFRRR","FBFBFBFLRL","FBBBFBBRLR","FFBBBFFRRL","FBFFFBBRLL","BBFFBFBLRL","BBFFFBBLRR","BFFBBBFRRR","BBFBFFFRLL","FFBBBBFLRR","FBFFBBFLLR","BFFFFBFLRR","FBFBBBFLLR","FFFBFBFLLR","FFBBFBBRLR","BBFBBFFRRL","BBFFBBFLLR","FFBFFBFLRR","FBFFBBBRRR","BFBFBBBRLL","FFBBFBFLRR","BFFBBFFRLL","BFFFFFFRLR","BBBFFFBRLR","BFBBBFBLLR","FBFFFFBLLR","FFFFBFBLRR","FBBBFBFRLL","FFBFBFBRRR","BBFFFBFLRL","FFBFFFFLRR","BBFBFBBRLL","BBFBFBFRLL","FBBBBFFLRL","BFFFBFBRLL","FFFFBFBLLR","FBBFFFBLRL","FBBBBFFLLL","BFBBFBBLRR","FBFBFFFRRL","FBBBFFFLLL","FBBBFBFRLR","BBFBBFBLRR","FBBFBBFRRR","FFBBBBBRRL","FFFBBBFRLL","BFFBBFFLLR","BFBBBFFRLL","BBFFFBBRRL","BFBBFBBRLL","BFBFBFFRRL","BFFBFBFLRR","FFBFBFBLLL","BBFFFBBLRL","BFBFBBFLRR","BBFBBFFLLL","BFFFFFFRRR","BFBBBBFRLL","FBBFBBFLRR","BFBFFBFRLL","FFBBFBBLRR","BFFBBFBRLL","BFBFFBFLRL","FFFBFBBLRR","BFBBBFBRRR","FFFFBFBLLL","FFBFBFFRLR","FFFFBBFLLL","FBFBBFFRRR","BBFFFFFRLL","BFBFBFFLLR","FFBBFFFLLR","FFBFFFFRLR","BFBBBFFRLR","BFFBBFFLRR","FBBFFFBRLL","FFBBBBBRLL","FFBFFBBLLR","FFFFBFBRRL","BFFBFBFLLL","FBBFBBBLRL","BBFBBFBRRL","FFBBBBFLRL","BFFFBBFLLR","FFFBFBFRLL","FFFBBBBRRR","FBFBBBFRRL","BFFFBBBRLR"]; 5 | 6 | fn plane_position(s: &str) -> (usize, usize) { 7 | let (mut rlow, mut rhigh) = (0, 127); 8 | let (mut clow, mut chigh) = (0, 8); 9 | for op in s.chars() { 10 | match op { 11 | 'F' => rhigh = (rhigh + rlow) / 2, 12 | 'B' => rlow = (rhigh + rlow) / 2, 13 | 'L' => chigh = (chigh + clow) / 2, 14 | 'R' => clow = (chigh + clow) / 2, 15 | _ => unreachable!(), 16 | } 17 | } 18 | (rhigh, clow) 19 | } 20 | 21 | aoc2020::main! { 22 | let seats = INPUT.iter() 23 | .map(|s| plane_position(s)) 24 | .collect::>(); 25 | let part_one = seats.iter().map(|(r,c)| r * 8 + c).max(); 26 | let part_two = (0..=127).cartesian_product(1..=6) 27 | .filter(|pos| !seats.contains(pos)) 28 | .find(|&(r,c)| seats.contains(&(r,c-1)) && seats.contains(&(r,c+1))) 29 | .map(|(r,c)| r * 8 + c); 30 | (part_one.unwrap(), part_two.unwrap()) 31 | } 32 | -------------------------------------------------------------------------------- /src/bin/06.rs: -------------------------------------------------------------------------------- 1 | use itertools::Itertools; 2 | 3 | static INPUT: [&str; 497] = ["fbqjswm qmbjwfs fmsbjwq smjbqwf hwsqmbfj", "sxpoqbueg fbhxqzjrtdkgwaepos qbepgsxo pbxvosegq giqepcobsxl", "gd pfdy", "yijwkdzvoub cifujkyvbwz", "htumjfskxapveoblncy tkvfxpejomnbhcuslya xukpmyenothacjfbsvl", "dyt hclpfxvykumo bwjyi", "ezfiytx pitkrf fpeki gbuovijdfqaw", "wyxabpekmlovhu lueyowbmvkapxh emhakvlyouwbxp obyxlewkmaphvu vmhaobxeklypwu", "qerwhnkioygzcsulbjxa wlegxsyupobaqzcnri", "awroqhfs abyfqops ikqcgzatjuen", "lnxdjmpvirbeus gazhcwfy", "jqo qonj oqjcs", "qgahfybi dbhjfwcgy zgfhyqb", "urtsfljxgc teyorfwlxgu uvrlzpkixgnmtq tardhlxjuog uxetgbrlw", "apehszymrlwjqgu mhqjgdzlswryuxa", "vnamzidfsojth ouvqmlhpbrdjfzawit", "zus muczs xuzsr puzsg", "actgknebysj cjbgesnkty uemgdkcynst stfqcgneyk", "rgxsfmiplkobquvzedntwya wyietkrnhzamxouvsbdqlfp sevfloziqnmtjrubypkxwda", "lsj sjl", "ihyvfqesulxorctjgmzpdank hycmevxlsfdugproiqztknja ujmdnqyltxvswzfhpkgoiecrab", "mynlpojwqtk hisrag", "gaw agw agw gaw wag", "pkoq dtqbypcoj loqpf eprvmoq rqepo", "bfuheqvzsjignmctwl jfszbqegvhmlcniuwt txjsgivlzcmwauehbdnqf tejwzcvlbnuqmgfish", "qutrxvl zytdmqrx rxecqta", "fayzme vazey yazj aybhzsdc", "csnjhrfyqbxiav rfvaycxqihsbn fixpvahcqsnrjy nclzsixrfvoyeatkmwhq", "quey enxuq qeup utwqe", "rbosi tirdojubs boris borsi iobsr", "mdskbhvyiqertul uqbltrykimehsv ktvmyjuchreqblis hequalkrsimybtv", "rsitupnoy fzwksemhcbq", "vkrsfmljcbzdthi tfdlkqjpmgh mkqtfhlpxajd thdkljmf", "mrfpbwyx rwfxmyb yrxwbmf fmwryxb", "rmztba uabrzmtpy", "kajxyerviqthbzcomgnsfwp wkhjetspdmblnyiqgzafcvxr egyirpvajwxmnbzqkhosctf whpcbruzkxeivftysgnjmqao", "o o o o", "vmjwhzngqtaxl ivhnfdcgtzqjwma zagqmhnwvfcjtky gjatqhwzyrnvm wckanzhvmgqtj", "azixnsjvh hxvsaj xvzhnajws lgxvhasj chqksxrevjuoaf", "wlbocnkiyjdfmvgue mychvijfbekulrgw fvymucjewsghlbki", "jczgonpt jfzibgon", "k k k k", "r v", "oeafxtjqhrdlgupwisc lvhyjegkwrfpasxcto cszalfyrtxbvwgjpeoh axhzcepjgolstwfvr", "hqfdymlisknuaejc rptnamdkobqciujxh nlgayihvumdkqcj ickfhdauznmjq niqzkcjaudmh", "zavtjyul uyaihcbjtzmnfvq yjwdaerztp tqoazjsxlymk ybjaztql", "gz qxgal", "sdhcagp scahdpg ahgdpsc adsgcph gdsfcaph", "ysud ydoxpqhesu tbsjyudn bsdvyul dsyvcut", "onizqprkeumy teckol", "fxlohzwgkebcn rznhkfocgjvde ktgefihnomzc bsmypfchqxneoazgk", "robwtniusy quisghwtdv", "mhtxubnl yhmdtwcupezvxabl kthbulmgrxs bqhutximl uxqhibtlm", "nyifbxuq ohmpfrntzdc", "aityekusrc yuecirak yricukea", "fbhntzkpalduvrjeqxg najtimzflgcdqpkyrxb", "byi puln ytdc vafzwhsjkqxge", "zngipme inzpmjsx", "sxrwd yla nf uhjzpvbme", "xpmhcy yxhpcm ychxpm ychxpm cpxhmy", "wvmspxgrf wxgsfivm", "uwcfnb caiyqxovdp jstmchku lctezs", "hy hy yh hy hy", "urepkmtblcfw ejxuiacmvonpbr pmzgbqruyech wcpkuzbrmhes", "jo oj jo oj", "gepdsrkwazxfyql equrwsaxyl ylwsxaqer lrwyqesmax", "ceist iwhudaxgreyvfbz kqeospit ienjqm", "roqikgmtubnapl rtepiyvfsouj iqrdlgtubpoc", "rgtedxo xegotdr", "tkz kzt ktz tzk", "aimcqg qagrebmic", "ra sa a a a", "djzixkqyt lhreum cgwel lamr", "dom omd mdo", "virpctxulowjq xrwlpjucqsiot", "ljxzenhfvqburo jqoenfbvhxyl vcmfbyhwnoqjel sikqfvlnebgtjho lnejfqoxhyvpwba", "ebqkrwfijg jkrgbwf ybwrfjgvk wjkqegrbfv hwjukgbflxr", "mnqukrsvfctlpbewidz coiuealptqmhwvdrskf slyjekvhmrptwcudfqi", "gdhqrenioakvfj gedaivwzxqyfoskr dckqormvbgjelhfai", "cegixsmlduz iegdslzcumx zedksiugcmxla", "aznelohvw jovendlawh uehwyvorminfa avwenoh hnwpaove", "xvbtpinmaud qxruionfedm nxigmhud uitaxznmd", "dirpsgulvjwxkqzof rmdpjuyivlwkozqfsx wzfiskheluoqxjrpvd qasjkzxilcdofvurpbw wrqhudxkfvspizjlo", "dhefy ehfyqnsdlb yhezdf heyfd", "hyla hyal lyha avlyuh", "q p ip y p", "nasejwkfdgz awegjndsfkz sdwjfgezakn neawsdzkfjg gdnzwakjesf", "vdsa asdv svad savd savd", "dqyxjwvu afxhvbgz", "yvhxzrckdmebwoistlfpaqguj qhsyupcixrwfobkjzlmvt uyftrkhwlspnzixqbcomvj", "zukomqjdtwaphyrcfb qdyhjwuzcrmfk yuhkjdcrgefmzqw jwfqmgcxrkyheudz", "m gjkar hni hs", "emc ecm cem", "bfuxtzqyrwsldgjhep ymlrtqpbosdewgaxju", "uvphrftqsaekbzxj vzhxajqfpuekrsbt tqzpvjuskrabehfx ypqrbafxksjzuevoth", "tm ap a a o", "zknhwxbclamjgvsefoy dlrfvhkyjnsexzbmagcw gxwklbjehofacnmyzsv hvajsfnzkcxemlygwb", "fmsjqhkxyw jsfmhqywxk wsqmjfyxhlk bqhjcmfyskwx mksxwqyhfj", "buxi i wh s ab", "ywjbtszuhniaopd wyibtcejfznmdohqua", "cjgstbahpzfrnqkeo ecpboaqzgnkrjftsh ztajpchkgnbvqsrofue", "vtibnfojdaxekhgmy myajhtdnbfoxvgik jnavmlytwdfshbkxrigo khiamfxngvdojtyb kidbhfmagyjvtxon", "lnupbwhodmei imelnobphdwu neipbomlduwh lumneowihbxdp hiublekowpdnm", "lypirvqzcw kziwqypxvr", "yeadtgixzn nydxeztga qdfkoagyncxtze", "otvm ilvham qrvbkxj wveoz fulicv", "leazscfdotkuhxmr eocdxshlaufrmtzk", "mdtlwyin ydnitwlm ymtwlind idmtnlyw", "zuonrg gwzxneor urznbgol qbrkzgnou roqkngz", "ywbpxicgstaufmozedqkrjv xbvgnfltorzwceiqampkyshuj", "chkmy qsbamjn", "emvlydfruaits kerixnwlbu zxwjbliepur ouzeilr", "ybiu cyru zpkv", "pqcdevnlraiwtjmfxk njtlacpbixdekv dxlykvipagctnj xkjltagcndivp suvhkcaizpdoltnxj", "cgqnapzvfwyimk qpcvzgaywmfnik zykcamvpniwqgf kyfiavmgzpcqwn", "t t", "xqhpuljcgbzyi thyndcqw ncqyhmvr dhfaqmcy", "s sgz opvswqtx s", "rikeqfvdla jqfacvosgu vfqae vbdfqrwa", "mfewqjdkcb xnogrlmah nvimla", "zcfxogw xgcpotfljw geyfaomxc", "uync dny yn ydn", "zvpuajx pquz", "q y y w", "phk hmk kdh", "ljcumvrwdsfpzixhqgantoybk lcgwubvzspqoramyetkxjdnhf uqmsdhlptyfobanvgkrczxjw uxqvyhbzkjangmtsldfprocw avgmoswrxhdjypftczknuqbl", "vyxclotkrzefghanjmipsu tvzmrcywlsoqkebdai", "gdrnybwsuxfc yrbpmnfus bvfcshmntuyr onaisrfqkbyzu", "slpetjhcvmaufd tpfvdaumjechsl ejcasvltdfpmuh shtuaepcfjlmdv", "bqwhndkeotmjcv skcwtjeymbvqdohi", "rebfqy gqeybf beqyf yfbeq", "kzoenrdtc zdwtnx nzdxgt", "cdta kjroqnldu tuvc hyegxbwfmzis", "qpdfokyxsubanv sfxkupnabvy ukbypvxafsrn srfpvxnbyauk", "wxdkupoba cdfxkpwobau obkdwnxupa qzulkwoxdhpba", "vqzxurtjcbeild qzbgklntdijvhcsxwye jtdvxqzebclmio plutvbjiqedzxc utbzcjxovliqde", "shvwemxcjlodknriy xowueychnfmsrpkvj ynewmskzjvhpqcxor wcsqkhxzjmyvoern", "tghcpi igcthp pctigh higatcp", "khnlfdogbtmqsc rstoyencgilkb ktzgljpboauncs govcnjlwbqthsk bnlkotqgcus", "clfqxtajgw wxaclufj wfjxdaucvl xwljfcia jcyplrhsowxmbfaz", "jwvuczdk ujzwvdck cdjzuvwk", "wqrpskjbzxd sqevgnkropcaxiu xhsbfrmkqzp", "g g l", "lbtvkxeuiycrwsjpad watikedxycljrupbv cypkrxtlbvomawueidj jbewavliyrdxctkup", "r jwur r r r", "fmdxyhr yrdfhxkm mhyrfxad lrdhixmfty", "rpanbukoyqmcew wdku ktluvgwi wkuf guhkjtlw", "kbfcnapuvxdme demhltfxpuinvc fcnpehixdvm nqzoxcdmpfyvejg", "qscuwkvpl uafwkqylspi zchkwfvusa shxnwyquk romjtbsudkwe", "bzorewil oebzwli", "ihzmnublpsga gpaziqbvsxnmth mnzispgaohb zshingbamp yimlhznrepgbas", "slbzwpftqcvj vfupdwrezscojyx", "ukofntijmbryecd cyejmbfnudorikt dryfiukceojnatbm enfdmjtyboickru", "ukzfgsanmldiqej zldmsqgnifjbke oylgasqfkjnmedzpi glfmqeijdzsknh ijmesznldkgfq", "fyxhmu btyvfih", "fcasuqmiborhtyw cyusmhpwrfoqae", "pvmj qmpuvd mbpvr", "fu fu", "cmsharebt tycsehablrm ebhcrsmzao ebasmxchr seacrmhbn", "phf fph fhp pfh", "x x", "cklhmiqbfrav hfivmclbqakr acvilfbqhmrk vlfahbrickqm xamcrbqifvkhld", "ldykra arkdly lrdkay aldryk dkyrla", "bf f f f f", "sja j jn hj", "syr r w", "ajitzbsk ktiasbzj bijhskazt jbiamtskz btkiazjs", "ci b x b", "jgbzatyevmdwoirh ayidemzjhrvb muzbjqfishxenyrdlav vmyjbredaihz", "nsta pvxsn", "pwe pwe pew", "skydwacovhbrq cdbhorkvywaqs avwybqkcdshro rbakdocqywsphv qowhgfcavbsrdyk", "soewtgjpcdvla gijtxwdlevpaysc todevpzwglcjas gacdfrwmpsuvebtlj wgvlcdkejtpaons", "kboigesmfr ufjo pohfjqn qozf", "jet zrejt", "ygb yug myg gnysplqjod", "kjqsrbofmeinawhlzgxtd ehdtcmjrksfziqvlabwxo", "nqdvlzregyfp wvhlpnmdzegkyf mldhexvnzpgsfy", "m m r", "yxkrzaov urvzmxaigdk sazvketrjncb", "jhmgqebw zalupkdf", "myhwf yhwfm wmyhf", "ujqmvybntwlfgrskz vufrdgszeblymkntjq vuonrfqbslxgjyzptk yzkunbfrjtlqgsv fjqyrgnluvbtzsk", "yvxrmbogtfziqeclpjwdknauhs ldwjkqzotvynuxahcpfmersgbi", "bapjknqrem qgmpnrh hnrpmocq doqurpmn", "ramwtungpzjv wzrvngmtjpua zurgmatnjwvp pgtzrmvujnaw janzpvurmtgw", "mencbuo folkueabn zqayub pusrwjd tkylhu", "x qsfmnyuow eg xbde xr", "jqiwyx wix iwx xiw", "d jilwe xgvf b", "qauwef yvbcijs", "pxykceoad k kznifl k", "rh hrm hdr", "iertpcvhdyojnsfa edchyptlnsjiaow onbpaysiuchedjt", "ulrjawfezdq dytianoelkqxwmgfju ufvawqjdhespcl", "pagzxn zangpx xnpagz", "xlksupgydimtb dgpbsxtymluik lgfubtvxcsdmypiwjz yimltngspdbuox", "phc ihpc phc cph cph", "ybumkwiegvpsfrladzjh sfajurxbncqevwkgdyptl", "gr rg rg gr rg", "hrkvgpintusxzcfbjdo habgkptcrzdfxylvui ngdctqkpuxrzvhifbo kfuztmcrhdpbxoivg", "zslmwoeh lehzswp zewlsh zswelh", "tqgwiukvmxbopradencjsylfzh tnojksulryzdehqvawbcpgxmfi iqotslzpjeyrgbxfhudwvackmn rbvxpctodlegihunyfjwzqkams", "cuzwomlixbfganhk yglfvnwzbkimorux xiqgnmkfobzwul ifkbxolngwmduz jztklouwfgibnmx", "heobpftukwcrxyngj gfhemvqxajotpz", "maektfpjqbyhz kiabmewjf abkvocefmj arkmjenfb", "xyufbcmjtlvwgp ouwcfryxvzsje hxwcaqyfuojvn fcqujheyvrxw", "lqtbuxhfwnk wynbhe zhwnvb rswdhcnib bwhnr", "wxcnqskthobyzumapgejl npcjubmkhwyolgszaeq opzhqjlyuegmwnsabkc okehynrujmapqigswzcbl", "lyjnuwtpgobavfh oawgyuhvpntfjl vgjydfopntlwahux", "vfioljdqtsz dqlvojfztwp elofzvdjtuq gqhzdfbotlvj", "ebhnvgqjct gkqulcjwze", "ugncyzxqvjmlirf xlomqekjyrdanwhfv", "tqhupz lwtjuai", "uhvk l lg", "qjy pcyjq jbqy", "duoyfsnhlc jtlpvohxsauzb", "hkoqtgyvmjdwlnpicx noxkdlhygpmvqjtcwi ojqdthcywlgxenvimkp hcxwygvdjpklmoiqnt wxtjcpdylgnmkhviqo", "jzuei eib ei eiy iez", "pujfagxbze faejixpg mgtwqevaxsfjrhp aexzycgfdkjpl", "iunmadwyvlsxtpjck ruihstgbkmqoxzfcdenw", "qkvxdctszruljmpganbho pumocnxkdlvrhtjbszaq hurqpmotnlcsfdjvxzakb bsrjuhxntkpmoqvaldzc", "suktgmbnrqfahj jqhsrkbfmntgu", "ogaxbpiwvufktecdynlz bqshpjmgr", "dbikqj kqbjdi kibjdq bdqijfkl qjdbik", "pa otd akn jsrqmvwf", "jr mr", "xdgrfvbncsjaltiqkyhm qtswydkimlnzagvxch equasoltvmyidngkpxch", "maqpjnebszkftoc rskduxejyvqg", "k k k k xark", "tiokl hnzadijvbq xi lieo", "xfjlskdabohcvzmtpur zgvlqrjoapmbtufhc", "urceayoxjsh lnzvwqmpdbt", "g g x g g", "zuwgj guzj guzqhrj zjgu", "xsjotcbfzqlkewiv ypxfhkjliuc ljrmcxkif", "ycgevt wkxhe", "a a a a ja", "imwespvrudzaqojc wvjiodspemqrzuca mwvdzqosuciapjre cpwejouzqadsirvm eirmvjqzapcwsdou", "yt i i", "ovxmc xmsczv smvxc xvmc", "ynogzuevhipsbrwt uezhvrpbontwiyg swivytbuzegrhno tbvyhoezurngiw nuvygohteirbxzw", "hvktyilwjpxdngouam tayjndpghiorzvluxkm aonsixtfpgmhlejkudyv", "hdatbcv zmyxugq", "lmajoitgubwvpf ibloytfwumjapvk alfrwiutmhvjbpeon mojdtpbaliuykwfv", "wblkycgps lkgpcyswb wsybgplcvk cublspdwgjyk ygplbkcsw", "pwyqvokde vdreypwk ypevdkwr", "lykv riz sgjwtmoub", "jobiqznpsugm czjamsyuipnklqobg bpnotjugsfzmqi bgoqnsjipuzdm gubnqozpijsm", "qukzafenwyhblosmrgvx zvlfurkwceqasohi suzeolakhvfqrwpi", "iycm ciy icy", "hmxz zxd xzl xmdz xz", "yftbrxvucjkniem dqtl tqog tphazw", "imkegrwdxybuav kneiomxygdavrwb rgoiamenwypdkxvb wrqdahgfiemkyblvx emxrkywigvbad", "zk mw d e", "ihcwvxeotpzfrkqsl syjiahxvnoebfcpgqkzmrud", "foktjcszgwhr fokqcndbyizrhaeswgl vkrfsocpgwhuzm rwhkgscxfzo", "y skt fg", "ejirwohkzfub hujfbrkozn oknucvzgfjhbr jzlormuvhfkb xfsouqjzrpbhk", "scbejldiaz jsblace hbejsal slabuje", "osfej hjsoek oejszk", "la wl al", "icquzebwdkrhs cbiukwresh ruwhkseicb", "ikcqygtvfsnaurelwd ybukjdmlecvxpawzho", "wfhyiscdpjvgktoz dvhfkowiyzts dtvysikzwoufh vesyhiqtkdzfow vtskzynhfiowd", "xszyugwmdoflejaknqibt fzoavqsumdwpgynkjltx", "lctpvbshq pslc scwlp cglpnws", "xpyteraozhluwfcj jueoaltzypcfhxrw rwycztuahoxjpelf fuhoprexjytazlcw wyapzfeohxtrculj", "xd rsxv xc x uxmle", "uh p pw", "u u u u", "qvhmxwtfrzcjolynesbkdip qvnsibxmzrdowltpkhfeyjc", "ezvopirtq vitqzope", "iewnmbouxctfadgh tgsmjucxadby daubxgctm", "b b b", "fhswi limr rhlp fihp uykdoc", "wbfhklqaug jlxvnqadzhksfw", "tunfikcwpexs gkwpmcsurtnieo akpwxstecinuo upskvwtnyjiqzech wudbengklptsric", "loedjctvbszkw pgxrlihqa", "gjwok jgowk owjgk kwogj gwojk", "f fyd", "gajmfcikbnrylhpsx mrcpingkjlbhfxysa hacxpgrifkynljmbs flajskgnbrhpixcmy fincblhsgxrakypmj", "xazukhfjyqtm makzthqyf qakymfzhlct kaihzqydfgmtb tzfjkqhyvma", "dgzlpe elqpzg ezlpg eplgz", "s r r a", "cohzy zlyv dfwuptbg", "ypjodgshuetcrlxfzv tsrzlbgdpvqojueycfai reopcljuysvtdgfmz", "n fp", "tjdbzgfs z zreuvpqy zpci", "noekg gonek eaogkn oknge", "tkmxfod domkft kdtfmo ktmdofy", "anode aoke voea", "ryhe rhey yerh hyer", "ntabgs bg bg", "huktgwiosylrpdxjbcf dfrixhluowksjbytp sjhrolybpuwzxdikft ysjhwokurbfptdlix", "bifxwln xh fwmsou hmyuqwc apkrjvegtd", "ezhytmakiwou whmyptnuasodj toruwaqmyxh vgnyualodmthfw whmuygato", "qk mq huqz lq", "bejyhfndolxqt axebjclthoqdniy tnjbqyhwxdsel lztqyfbvjkedhncx", "eqyfglxicuzdphjkvnmsoat equwiagnvpjcbyfxorhdzsm", "msjyh ymjh yhmrj uydjmhx", "xqbldatriuhm rnbczjkgyow rteib", "jkqnoawyvbreizsdp zbsxirwpynkveoaqmjf darzwpqijnbouekvsyh kjipoehwbyqszvarn ervysjwbpzanokiq", "npbehmoiswz opinhmwszdb howmbpsnzi", "rvpgdjaoc opjdracvgh cdvjgqaprno", "liegxqpjzmvrfdykbsncahwo gnfhykipdxzwcbvlqeajmors dqcjlfonayphbvkzsgrweimx oglnszmehxfriyjkdvawbpqc", "pokiwqthmvfzadbjrucxglye orzuptjqblnaedghvwciyx", "tw ocdgpm aj jhuti", "pclrgmiefodu bxvg jzhngt thgvsxnq", "duosnjqakwleh kzjendahmlworqsu suwlbjqkedonah qwsjuaheknidol lpjfaonekwiudhsq", "antqsypzmujbkihwclvg rtqwhlzkasiyjubgmncv qytmphkvbunijgzswacl qumiyzsehadnckjtvwlbg", "sbec sb", "puflvmxnwzcdqotirgejab clwoqjmsgpurezfdivnxbta qnfwizdgelvaoujspbmcxrt lozmarwqjevbpgxtcifnud adcqjwporbnvltfhgezuixm", "zfayukrmjv xkveunzar kevozrcanu zuaowvrk itvazgkrnue", "skocmigb kgsimnbco getuchifkqpbo ogbcki gvokbic", "frmzlsjgenowiuvdqka svliznoqgdufjerwkam kiyoafjmvdsnwlurzqge gwrdfniuavqejxmplzsok mwzqvaiedolksnrfhjgu", "kfluwecmzvnx mefvkqcnuzxlwp yvkeumnxlcfzw kclfnzuvwemx", "kmgerotqfv kgmevqrotf vmqtofkreg terkfvgomq rqvofketmg", "akenjtzfbycvxgu xhwnozegkubj", "tveuglsjwpfmq lphsowtduefg saeuptowfdcgl", "axqvchtd xaqbkvct taxiscvgnyq zluqpxwavctjo cvtafqx", "phowmcdy ocdmhpw pdmhowc", "ifakxsn sixfkna insxkfa iknfxas sfixkna", "jtsoef osfwt", "flm mf", "xh xh xjh xh", "yvkxuiphbl ivuxkhlpy ukpxlhivy", "hgbz z z z", "gvwfz zvw", "dvs vnesudy", "nmajxvozyhelpbt avthblepmzjyonx jzxevylaotbpnmh ehxajptmlyndovbz", "knayxrlzgoiwjvsdh lyrhgwenxsvjkiaozd vrwdstgoqkjzahxnlyi yanojxkrsvwzldihg", "ekcoubjlryfvdaqmztxnw ethkxgdwvmjsconbifzpqra", "egcibkxu bigxuekc uxeikcgb gkbcuxei begukxic", "mvhcaezgbs bmcegavh ghevzuabcm hsagcmbejvl eabgrvmchyx", "meglpzdkqrsohf yzhedarogbmql rzmioqdyhengl", "tdosc cstod otdcs", "szxwv xhns", "fsmvhdn ldvsfh hfskvd sfdvh chledfvs", "gdmwvnyqihtspbfcexrou bumficazjrpgxynwldoqvt", "dyplaojbvhmtseiczkrn zmihtdnpsbryoklcejav zidcnhvmajteplkbsroy hoyvemcnjrdbtalpzsik lvbrejikdynxuozamhpsct", "ouqbsjwxadlftyhi ofvuzqtxyihldjeswab aotxfjwduqimsyhlb bdoalxwhfjtysqiu", "ie ec se", "mnflwaopgbcvhxt boqymvanthlxwcfg faowzgvxcthbml", "jl jl jli jl", "kxdpqbcgvuimw wmpgidkxujc wmgyxrupickd kpdgwiumfxc mxwicgrdukp", "jfsvrhqwpteckmuz ltcqsdhjbauxikepwvr jqtkwfhepcvrnus hnqupekscvtrjwz", "tfzxdcs zcdkx", "wiocksjvegyptdbnaml inohseycvjpwdgtmak jodxsiwmazkqvgcypnte rigwopdtceymvasknj nytbjmkcwpsgeofriaudv", "vghoqamjewufp qevtoxkmagfdsw xaeqgmwvocf", "cfkheaivnjqp qdpnezv loubwgsryxtm", "pgsdcueklha wthpgvjf qzyxbonr", "z v", "mzlonai djcfgnrkatuxl qnlaie bnpal vanle", "qcszfvwlagrbniuo bfrqzluigncswao oacwngblqiusrzf qrzbclnfswguoeai noalwcsgfzirqbu", "bk gbks ukb", "opgkvynaqexmiublrsfwjthc mbasfctuyerhqwvxgldnozk", "cdlnpxkqsbvhgemr gdheqkmlnvbpsrwx fmdnsrvghkebqxltp rgszqbkemldxpnhv", "phociwjgq inospahluxet", "qup aln", "lk l", "s s s s", "pyucgnt ynltgc ycnugtd ctqsngimyo ycngt", "vchjzu ujczh chzju czhju jzuchi", "rdl oljzkd bdle ldvb drl", "ypaxs ycxps ysxp pxsy slypx", "dmeniwsrapqchtv rbsizl bxgrfusiyok", "qdbpuxghfelwjtzsomyiva oiqhdzluajvtswekxp xjnlaihstvpqudzweo", "tdzjxu zjutdx ztudxj xdtjzu", "xd dx dx dx", "notxgaqvpbyfje raexdhikm zalxdscewm", "tlhk clg yo gcnzot frveaxij", "riohxqt hvdqts vcqsdht", "mi fw ch", "mcfgtbsp ekpgstc", "hugfk adn st itno cod", "btkzcna czntbk zkctbn tbczkn", "yaisrtpjuhngmox psjoatrgynzduh", "jxersuyobnqkathwpid jsbeaixorpyqwhduktn eidwbvyjpurnxkhotalsq yorqhesaxiwjnudbktp kunxwsytoijdqbaephr", "gpozmvuctyaljws yfxzogtjmua efbyznatgjorimu ojgruzmqytah", "s ezj p gdnmykaxo irlp", "fakoitvqlwxumjcypnrbh xoikwhmjevcrfblqptnuy jhpixuvltyeqbokwcfrn nxorwfctihpyldbjsvkuq twrmbujavfcnxhiqolkpy", "gfcwqieompdtyluhz gwhcoqtfelmzpyiu tuyhinpflqcwomegz owlckiyfpgzuqhtje", "knpagzftyjxcs ptxakjnygf nsyxafjtgukop pkgjnrztevfya qytdmbpwkfgajn", "yjuzgsvermfhotainbckd ckbyoagrnmvfestihj bgincyhfosvtkmejra togvjersmynbfcihak", "wicho ihokc icohw", "buacxrg xurabcg uagbxrc bxugcfar uckxbgar", "fdjnxbgzky xngyajkzd yjozgnxkd njxgzkaody zodyjngxk", "pfuebk ku ku uk", "ysgf j sgy qb mhe", "oygrdsel lrysdke dpyesiflrw ydselr pieyrsfjwld", "zpewx ewxpcz wepzx", "xyredbkszaicqolv idqolxrbsyczea iyrqdxcasezlbo", "ilqd qlid idulyq", "buwdolahxfrcnjsz rfujabnwhx ufrjpxnwahb", "abulqncx ocxauqn cznuqxak", "mhnyswie omcbwyhefv", "pbrxtumijaqgdkwzvceonls mkhgzbdvxwcirnpeujoaqtls npcxyftmjzgsraoilbqekvwu", "dhiysqlbmjvoxf ovxshjmfliqdy zolsifhxvjyqmd rnxdfvahmoyptjkieqgslu", "ibvnlah lavuibnhzp bahilvn bilnhva hilbvna", "voqfmayzbektjwui iezmjtbovkwfu vkwbeozfmtiju", "jaxetsymlnr eakjrmynslx mnajeysgxrl marlnxejygs gmnjaiselxry", "pyufthdvaqxngbk nvhlbfjtwmdzsax", "icwsjyfge wyjfgeci", "dut tu ugt bhtu", "g g fgtohm g", "ozagcvu xqsfjgzouc zoucgm mzcugto", "qujrhkixfslameon ukdmpgeshrxnzj", "excbvslqhad zjotgsyenurp", "jrqiwlcz cerwlizh wlpndrbci", "gjstrhckqnw rntqjskhcwg thckgwjnrsq qcrstwkhnjg wcsknqgrtjh", "wmcfgezspqdha kgswzfdqbmcrnehp hwdztacemgfspq ywehgqcfsdmzp yhcdgpzqsfmwex", "okyxslua", "gpioxhjkdbqlzsey gkebjhyzxlqso lbejqzxhyokgs seoyjgqzlxhbrk qblxvhejygskoz", "zgl gvlzn gzl ldgz", "us us musql us us", "uhv hvu vhu hruv huv", "oaxt ptdghjq", "xgvmr vzgxemrj rvxglm xcrmgvl", "glb lgb wgble", "kngvreujcafyblwxpqi pqufgkwayxejlvnbci xcekdwlpyjqbfgvahuin ujxanebwlmrfpivqykgc slaputxbcwfgyjoevnqizk", "lyvfakznbuw olfkrsbp xojfmqlhbpk", "hax jp nmf eh awi", "q nxmch k q k", "dch dh djgh", "cmtpfzibwqkg cgkwtiqzbpm", "zksd dzekascj zhikpgru kyoz", "py tpy yp", "hkbuqicdzretsxvmgoa mdgfwnyvtlqpecrak", "jc cjv jc cj jc", "dtalrc dlct mdchlt ctld cadtlr", "ostayzjxpilrcuebngvwdmkfqh udgxyozfepsncwbhqvlikarjmt bcaiurltfjqedgpsmzvkwyxhon isawcgvmdyjhtbpnfoluxezrqk ndrtewqcbmuovigpsyzxkfhjal", "w mz z p m", "ilmdn dsilum", "swaorjlgbevdmcftqy whgxuakfpitvonqmz", "odmuanyzbjekhrl gwlzhamukeoby huoyavkmblez", "ctsauv tubvcg huczavt", "gtljuexfiopmdhnczsaw gjypnkrhsdxlumziea", "zdrsfectygwjviob qobcjzmrthpygdvewi iatxzgldynjbvkwo", "emknygaiptjlwozxc cewyziltojnphkxga xfkizjnaepytcsgwol", "cxvdkfn uxwtf", "hd d d d", "uqzhkesytb zsktbuhyieq ybhqzsekjaut hztybeuksq kubyqehtsz", "r e w", "sgqnzlp nqlfsg uengqdcl gyflsqtn fmglnq", "rokebxmfy btemfy byfkeagvt bynfdezsh ebfyir", "aqpmvyefrdwongujs jvmnwyuadefqrgsp uvgaqrfydsjwnemp lvcdbwuaesqzgmyjnpfr", "rgcbejutw gjebwr gbjrwe", "wnucbkymsxirfovhaezpltdq fqmwrtynzohbxkspdviealcu rdhseiqycpfztvlnmxboauwk drualzqxiykobhecswptnmfv sevolnphmryaxwdfqkuctbiz", "kxesgvrpfatzomncu poynusfktagrzmvxe taszrmefonwukpvgx nzvkyepsfxramuhtog", "x z", "mqf fqm fmq", "plqknez znrucvosqe ewzqnak jaqzednl", "mvfsz v su getnakyh x", "jdvrwyizulgthfacpb zkhmsyaxwoebcdpngtrfj", "zhd dhz", "vqidfwokxbhzatslcn wcbzgfutloskarvxnhe", "rhds rtp nlrfsh", "stqk owtksmq kstzq sqtk", "kjunerphs hnjskeu sehdjkoun snheujkt uknjesh", "syelrcmhftj mbvtofei bpeftmvd zfxnpteom efoztm", "ih hi hi", "ypiaz piay yapiov ypeia apiy", "lvriun vinul vlin vzldni", "rwkvyshp uwasr", "bxpgfq pyqgrbf bpfhqg qpfcbxg pbgfq", "zvtcugahijyenw lvngtcduirwjakzm", "fpqbrzjimtdlwnvchy bjpzmwytcvhildqnfr dzqmcflinbprjtvwyh whytcnjilqfvzdbprm", "iwfpka ipfwa imfwap", "hjuyc mlwjv", "ulpjhvsnbztfiqe nlhbqteupzio inzepqhbtlu hmbztrcliquenpd", "fjxgrhpeozl rholfeu rlqochfe eflroqh ofrhle", "rowfxmt f fp ijf", "zqbokvdhw zvohebqgw howvprmjztlnqbu vgqbzoewha", "dtwf wvtfd fwtd wtfd ftdw", "tdmzifqp tzpiqdmf zftpdqim", "lgv qhl ljyaxzwocmbrk nls npuld", "zuol vo oxnykdec oulmz", "uoevmcpgyixrflwtasjhqzn elpcxtgmvjiynfowzuashqr", "v l c l", "fuz ufz zuf fzu", "zgfhiodeybckqxp tiquwkmeaxcp gzieqkpjhxnc", "dlpcyjzfhekuiqgom khpgieujcfmoylqdrz uqeckojzfimyldhrgp ciyqmlapgfjduehzko fijhqmkeucgzwdploy", "odqthnlcgsu csprkbo cebzso cswbero", "fsph psh psh phsiju", "tgrwxaqibelzhm jynqdvfo cjuqopnk", "iheu uih", "rjyqhauivsoz srvcnahokuq", "i kon", "tgvukpcxnory fxuhsmeativp", "kvyha vykah hkvya hyvak", "lpahrbqe hlrpqbwe", "ndtoxjfsp tvjdeoxlp phxasrotjdn", "vcpzksneyxfo uevyhslzcpxgt", "wpxvmnghz vmxphwz hvwxzkmp", "usvdwyomecfip suweomifpvcdy csiuwmvdpfeyo mosdfwuyeivcp ycupmidwofsve", "hlqbanmtjy tdrvxcajgnfpoke jtiunkpsroa"]; 4 | 5 | aoc2020::main! { 6 | let part_one = INPUT.iter() 7 | .map(|s| s.chars() 8 | .filter(|c| !c.is_whitespace()) 9 | .unique() 10 | .count() 11 | ) 12 | .sum::(); 13 | let part_two = INPUT.iter() 14 | .map(|s| s.split_whitespace() 15 | .map(|part| part.bytes().fold(0u32, |x, b| x | 1 << (b - b'a'))) 16 | .fold(!0, |acc, x| acc & x) 17 | .count_ones() 18 | ) 19 | .sum::(); 20 | (part_one, part_two) 21 | } 22 | -------------------------------------------------------------------------------- /src/bin/08.rs: -------------------------------------------------------------------------------- 1 | // input parsed by hand 2 | static INPUT: [Op; INPUT_LEN] = [Op::Acc(13), Op::Acc(-6), Op::Acc(-8), Op::Jmp(140), Op::Acc(44), Op::Acc(21), Op::Nop(23), Op::Jmp(455), Op::Acc(-1), Op::Jmp(143), Op::Acc(9), Op::Acc(19), Op::Jmp(507), Op::Nop(513), Op::Acc(38), Op::Nop(444), Op::Jmp(560), Op::Nop(19), Op::Acc(9), Op::Acc(19), Op::Jmp(33), Op::Acc(11), Op::Acc(-11), Op::Acc(10), Op::Jmp(486), Op::Nop(-12), Op::Acc(38), Op::Acc(5), Op::Jmp(394), Op::Acc(23), Op::Jmp(236), Op::Acc(-9), Op::Acc(-10), Op::Acc(32), Op::Nop(45), Op::Jmp(562), Op::Jmp(423), Op::Acc(3), Op::Nop(340), Op::Jmp(217), Op::Acc(-14), Op::Acc(-6), Op::Jmp(397), Op::Acc(17), Op::Nop(165), Op::Acc(41), Op::Acc(-9), Op::Jmp(554), Op::Nop(7), Op::Acc(0), Op::Jmp(235), Op::Acc(32), Op::Jmp(486), Op::Jmp(280), Op::Jmp(408), Op::Jmp(73), Op::Jmp(482), Op::Acc(-17), Op::Acc(24), Op::Jmp(377), Op::Jmp(379), Op::Acc(13), Op::Jmp(277), Op::Nop(232), Op::Acc(2), Op::Acc(33), Op::Jmp(247), Op::Acc(48), Op::Acc(22), Op::Jmp(105), Op::Jmp(269), Op::Jmp(326), Op::Jmp(516), Op::Acc(32), Op::Nop(147), Op::Jmp(-27), Op::Jmp(1), Op::Acc(-8), Op::Jmp(376), Op::Acc(-13), Op::Acc(0), Op::Acc(43), Op::Nop(380), Op::Jmp(230), Op::Acc(34), Op::Jmp(130), Op::Acc(18), Op::Acc(0), Op::Jmp(402), Op::Acc(31), Op::Acc(-1), Op::Acc(-5), Op::Jmp(134), Op::Jmp(334), Op::Acc(35), Op::Acc(0), Op::Acc(5), Op::Acc(-10), Op::Jmp(-85), Op::Acc(5), Op::Nop(444), Op::Acc(10), Op::Jmp(-9), Op::Acc(46), Op::Acc(-12), Op::Nop(98), Op::Acc(29), Op::Jmp(119), Op::Acc(8), Op::Acc(21), Op::Jmp(422), Op::Acc(19), Op::Jmp(78), Op::Acc(42), Op::Acc(18), Op::Nop(344), Op::Nop(353), Op::Jmp(26), Op::Acc(-16), Op::Acc(20), Op::Jmp(370), Op::Acc(-5), Op::Acc(29), Op::Jmp(465), Op::Nop(176), Op::Acc(-13), Op::Acc(-16), Op::Jmp(300), Op::Acc(12), Op::Acc(43), Op::Acc(-1), Op::Jmp(215), Op::Nop(214), Op::Acc(13), Op::Jmp(141), Op::Acc(-3), Op::Acc(42), Op::Acc(5), Op::Jmp(49), Op::Acc(7), Op::Acc(7), Op::Nop(2), Op::Jmp(5), Op::Nop(123), Op::Nop(112), Op::Jmp(45), Op::Jmp(276), Op::Acc(4), Op::Acc(5), Op::Acc(13), Op::Jmp(-97), Op::Jmp(311), Op::Nop(347), Op::Acc(6), Op::Jmp(1), Op::Jmp(162), Op::Acc(36), Op::Acc(-6), Op::Jmp(386), Op::Acc(-10), Op::Acc(-8), Op::Jmp(163), Op::Acc(32), Op::Acc(13), Op::Jmp(1), Op::Jmp(361), Op::Acc(43), Op::Acc(6), Op::Acc(31), Op::Jmp(52), Op::Acc(23), Op::Acc(34), Op::Nop(186), Op::Jmp(268), Op::Nop(-103), Op::Acc(-17), Op::Jmp(242), Op::Acc(30), Op::Acc(-4), Op::Jmp(-32), Op::Acc(27), Op::Acc(-17), Op::Jmp(-142), Op::Acc(30), Op::Acc(17), Op::Jmp(1), Op::Jmp(415), Op::Jmp(-132), Op::Acc(15), Op::Jmp(176), Op::Acc(15), Op::Acc(12), Op::Nop(382), Op::Jmp(237), Op::Jmp(32), Op::Acc(-8), Op::Acc(40), Op::Acc(28), Op::Jmp(1), Op::Jmp(-186), Op::Acc(9), Op::Acc(49), Op::Jmp(-55), Op::Acc(-16), Op::Acc(-7), Op::Nop(240), Op::Acc(29), Op::Jmp(255), Op::Jmp(182), Op::Acc(-16), Op::Acc(9), Op::Jmp(-31), Op::Acc(-13), Op::Acc(29), Op::Jmp(387), Op::Acc(-13), Op::Nop(-180), Op::Acc(-11), Op::Jmp(77), Op::Acc(16), Op::Jmp(368), Op::Jmp(224), Op::Acc(32), Op::Nop(-187), Op::Acc(48), Op::Jmp(307), Op::Acc(11), Op::Acc(38), Op::Nop(47), Op::Jmp(-94), Op::Jmp(1), Op::Nop(-170), Op::Acc(31), Op::Jmp(-180), Op::Acc(30), Op::Acc(1), Op::Jmp(1), Op::Nop(-63), Op::Jmp(-12), Op::Acc(-4), Op::Acc(-12), Op::Acc(15), Op::Nop(-68), Op::Jmp(13), Op::Acc(24), Op::Nop(-50), Op::Acc(31), Op::Acc(-2), Op::Jmp(333), Op::Acc(39), Op::Nop(-179), Op::Jmp(158), Op::Acc(24), Op::Jmp(169), Op::Acc(-3), Op::Jmp(-207), Op::Acc(-13), Op::Jmp(-54), Op::Acc(31), Op::Jmp(-93), Op::Acc(-4), Op::Acc(40), Op::Jmp(-96), Op::Acc(-15), Op::Acc(31), Op::Jmp(68), Op::Acc(38), Op::Acc(7), Op::Acc(12), Op::Jmp(-9), Op::Acc(49), Op::Acc(33), Op::Acc(27), Op::Acc(36), Op::Jmp(50), Op::Jmp(208), Op::Jmp(1), Op::Acc(42), Op::Acc(34), Op::Jmp(-151), Op::Acc(17), Op::Jmp(-195), Op::Acc(37), Op::Acc(34), Op::Jmp(62), Op::Jmp(1), Op::Acc(9), Op::Acc(3), Op::Acc(-2), Op::Jmp(266), Op::Nop(254), Op::Nop(-170), Op::Nop(-133), Op::Acc(40), Op::Jmp(225), Op::Acc(38), Op::Acc(33), Op::Acc(39), Op::Jmp(262), Op::Jmp(-278), Op::Acc(-17), Op::Acc(16), Op::Nop(128), Op::Jmp(-116), Op::Acc(13), Op::Acc(49), Op::Acc(36), Op::Acc(33), Op::Jmp(-215), Op::Nop(-301), Op::Jmp(-197), Op::Acc(50), Op::Jmp(-37), Op::Acc(42), Op::Nop(-253), Op::Jmp(159), Op::Jmp(-142), Op::Acc(14), Op::Jmp(-123), Op::Acc(-7), Op::Acc(-13), Op::Acc(33), Op::Acc(42), Op::Jmp(232), Op::Acc(2), Op::Acc(26), Op::Acc(3), Op::Jmp(-112), Op::Acc(29), Op::Acc(-12), Op::Nop(-263), Op::Nop(114), Op::Jmp(7), Op::Jmp(157), Op::Acc(-7), Op::Acc(11), Op::Nop(245), Op::Acc(-2), Op::Jmp(-225), Op::Nop(120), Op::Jmp(-114), Op::Acc(-5), Op::Acc(22), Op::Nop(-122), Op::Acc(-11), Op::Jmp(-70), Op::Acc(1), Op::Acc(24), Op::Acc(23), Op::Acc(37), Op::Jmp(188), Op::Acc(0), Op::Acc(-10), Op::Jmp(1), Op::Jmp(-283), Op::Jmp(-80), Op::Acc(4), Op::Jmp(-183), Op::Acc(-16), Op::Nop(-306), Op::Jmp(-213), Op::Acc(10), Op::Acc(-2), Op::Nop(-17), Op::Jmp(146), Op::Acc(-8), Op::Acc(5), Op::Acc(19), Op::Acc(37), Op::Jmp(-261), Op::Acc(28), Op::Acc(49), Op::Jmp(111), Op::Acc(37), Op::Acc(44), Op::Acc(20), Op::Jmp(-11), Op::Jmp(-53), Op::Acc(25), Op::Jmp(-343), Op::Acc(7), Op::Acc(46), Op::Jmp(-187), Op::Acc(20), Op::Acc(50), Op::Acc(-8), Op::Jmp(-365), Op::Nop(-9), Op::Acc(-18), Op::Jmp(-43), Op::Nop(165), Op::Nop(78), Op::Acc(33), Op::Acc(19), Op::Jmp(-321), Op::Acc(46), Op::Jmp(-275), Op::Nop(-88), Op::Acc(4), Op::Acc(33), Op::Acc(47), Op::Jmp(-18), Op::Jmp(166), Op::Jmp(1), Op::Acc(-4), Op::Acc(-9), Op::Acc(-2), Op::Jmp(-173), Op::Jmp(54), Op::Acc(-3), Op::Acc(2), Op::Nop(16), Op::Acc(-13), Op::Jmp(184), Op::Acc(26), Op::Nop(-322), Op::Acc(-12), Op::Jmp(-362), Op::Jmp(-118), Op::Acc(7), Op::Acc(33), Op::Jmp(153), Op::Jmp(-13), Op::Acc(19), Op::Jmp(1), Op::Acc(23), Op::Jmp(-373), Op::Acc(12), Op::Jmp(-184), Op::Jmp(-185), Op::Jmp(-57), Op::Acc(48), Op::Acc(8), Op::Nop(71), Op::Acc(26), Op::Jmp(-96), Op::Jmp(-227), Op::Acc(-10), Op::Jmp(-381), Op::Jmp(75), Op::Jmp(74), Op::Jmp(-320), Op::Acc(0), Op::Nop(101), Op::Jmp(-98), Op::Acc(33), Op::Acc(-4), Op::Jmp(1), Op::Acc(-9), Op::Jmp(-197), Op::Acc(36), Op::Acc(15), Op::Acc(24), Op::Jmp(-400), Op::Acc(18), Op::Jmp(-77), Op::Acc(25), Op::Acc(1), Op::Jmp(-112), Op::Nop(-150), Op::Jmp(-381), Op::Jmp(-152), Op::Acc(38), Op::Acc(50), Op::Acc(43), Op::Jmp(103), Op::Nop(-4), Op::Acc(-6), Op::Jmp(-309), Op::Acc(34), Op::Acc(2), Op::Acc(-15), Op::Jmp(-411), Op::Jmp(-70), Op::Acc(39), Op::Acc(-3), Op::Acc(6), Op::Acc(22), Op::Jmp(-123), Op::Jmp(-89), Op::Acc(11), Op::Jmp(70), Op::Jmp(-339), Op::Acc(-4), Op::Jmp(-325), Op::Acc(44), Op::Acc(8), Op::Acc(15), Op::Acc(29), Op::Jmp(87), Op::Jmp(-411), Op::Acc(30), Op::Jmp(12), Op::Acc(-14), Op::Jmp(-14), Op::Acc(-17), Op::Jmp(1), Op::Acc(-12), Op::Jmp(-441), Op::Jmp(1), Op::Acc(0), Op::Acc(-12), Op::Jmp(108), Op::Jmp(-277), Op::Jmp(103), Op::Acc(12), Op::Nop(-427), Op::Acc(10), Op::Acc(-16), Op::Jmp(-322), Op::Acc(1), Op::Jmp(-412), Op::Acc(37), Op::Jmp(-130), Op::Nop(-474), Op::Jmp(86), Op::Acc(5), Op::Acc(-12), Op::Jmp(-461), Op::Acc(-18), Op::Acc(-12), Op::Acc(30), Op::Nop(-356), Op::Jmp(-30), Op::Nop(-207), Op::Jmp(-128), Op::Nop(-168), Op::Acc(-4), Op::Jmp(-98), Op::Acc(32), Op::Nop(-264), Op::Jmp(-5), Op::Nop(-337), Op::Acc(-10), Op::Nop(-195), Op::Nop(62), Op::Jmp(-37), Op::Jmp(-489), Op::Jmp(-148), Op::Acc(50), Op::Acc(33), Op::Acc(8), Op::Acc(49), Op::Jmp(-353), Op::Acc(1), Op::Nop(-13), Op::Acc(27), Op::Jmp(-492), Op::Jmp(1), Op::Acc(43), Op::Jmp(-46), Op::Acc(-16), Op::Jmp(-149), Op::Acc(28), Op::Jmp(-525), Op::Acc(48), Op::Jmp(-30), Op::Acc(-5), Op::Acc(21), Op::Jmp(-15), Op::Jmp(1), Op::Acc(17), Op::Acc(42), Op::Acc(36), Op::Jmp(-343), Op::Acc(-7), Op::Acc(3), Op::Jmp(-346), Op::Acc(44), Op::Acc(18), Op::Acc(-10), Op::Nop(-262), Op::Jmp(-338), Op::Jmp(-111), Op::Jmp(-105), Op::Jmp(-319), Op::Acc(-11), Op::Jmp(-297), Op::Acc(1), Op::Acc(-3), Op::Jmp(-271), Op::Acc(15), Op::Acc(6), Op::Acc(24), Op::Jmp(-80), Op::Nop(-477), Op::Acc(39), Op::Jmp(-49), Op::Nop(-62), Op::Acc(23), Op::Acc(15), Op::Jmp(-47), Op::Acc(16), Op::Acc(5), Op::Acc(11), Op::Acc(42), Op::Jmp(-430), Op::Acc(14), Op::Acc(-16), Op::Jmp(-80), Op::Jmp(-571), Op::Acc(46), Op::Acc(31), Op::Jmp(1), Op::Acc(31), Op::Jmp(13), Op::Jmp(-5), Op::Jmp(-599), Op::Acc(41), Op::Jmp(-105), Op::Jmp(1), Op::Jmp(1), Op::Nop(-360), Op::Jmp(-542), Op::Acc(-5), Op::Acc(20), Op::Nop(-595), Op::Jmp(-124), Op::Acc(14), Op::Acc(40), Op::Acc(14), Op::Acc(34), Op::Jmp(1)]; 3 | const INPUT_LEN: usize = 623; 4 | 5 | enum Op { 6 | Acc(i32), 7 | Jmp(i32), 8 | Nop(i32), 9 | } 10 | 11 | fn run_inst_changed(changed_ip: i32) -> (i32, bool) { 12 | let (mut acc, mut ip) = (0,0); 13 | let mut visited = [false; INPUT_LEN]; 14 | while !visited[ip as usize] { 15 | visited[ip as usize] = true; 16 | match (&INPUT[ip as usize], ip == changed_ip) { 17 | (Op::Acc(n), _) => acc += n, 18 | (Op::Jmp(n), false) => ip += n - 1, 19 | (Op::Nop(n), true) => ip += n - 1, 20 | _ => {}, 21 | } 22 | ip += 1; 23 | if ip == INPUT_LEN as i32 { 24 | return (acc, true); 25 | } 26 | } 27 | (acc, false) 28 | } 29 | 30 | aoc2020::main! { 31 | let part_one = run_inst_changed(-1); 32 | let part_two = (0..INPUT_LEN) 33 | .map(|i| run_inst_changed(i as i32)) 34 | .find(|&(_, found)| found) 35 | .unwrap(); 36 | (part_one.0, part_two.0) 37 | } 38 | -------------------------------------------------------------------------------- /src/bin/09.rs: -------------------------------------------------------------------------------- 1 | use itertools::Itertools; 2 | 3 | static INPUT: [usize; 1000] = [42,27,23,19,4,26,31,29,11,49,38,9,45,1,40,46,39,28,44,16,13,5,32,17,50,12,20,6,7,10,22,14,18,60,59,8,19,9,11,15,21,23,39,24,25,16,26,13,29,17,27,28,20,35,30,31,22,32,44,33,38,47,34,36,37,41,55,64,40,42,43,46,39,45,61,48,50,52,65,62,53,67,72,69,70,74,73,98,86,76,79,81,108,84,82,91,160,153,93,253,100,102,105,115,175,166,151,149,142,218,147,152,162,155,161,163,165,173,255,184,191,193,293,195,357,252,295,220,257,404,289,291,322,294,314,415,343,316,318,324,328,512,364,517,379,384,511,636,615,574,472,477,509,644,1021,605,585,608,610,800,634,640,1122,642,1255,692,841,893,981,763,1313,1586,1046,949,986,1057,1062,1094,1444,1300,2393,1193,1250,1244,1274,1475,1282,1405,1334,1533,1585,1604,1744,2467,1712,2986,2043,2193,2255,2048,3250,2338,2287,2437,3711,2443,2526,2494,2518,2556,3382,2938,2990,3527,4149,5876,4660,4993,4050,4724,4091,4236,4241,4303,4781,4625,4730,4805,4880,4937,5432,7280,9717,5074,5494,9027,5928,9505,7577,8966,8141,8286,8291,13021,12377,10162,9535,8544,13907,14235,14459,9610,9685,19222,17294,10506,18637,18683,14040,33262,22526,21882,15718,17751,16427,16432,16835,35110,28293,18079,19050,28322,34586,30339,40277,19295,26520,20191,24546,26224,26933,29758,33090,47837,34506,34914,32553,64269,34178,52868,62471,35885,37374,37129,38270,38345,96649,39486,43841,57636,70898,44737,46415,68387,66887,74155,71307,85211,66731,67059,67467,68438,110684,82300,73014,80622,74230,76615,75399,106217,77831,152678,126074,116044,91152,111624,113474,141117,133618,133790,138366,134198,173276,142668,157699,135905,158453,206696,212520,147244,157237,365198,152014,239548,168983,191305,224942,202776,254591,276458,272564,247092,267408,267816,402014,301121,292651,278573,506956,283149,293142,304481,309251,494139,565215,320997,343319,441547,371759,785529,449868,692756,457367,537740,592400,514500,761848,546389,711265,561722,1157615,585793,571715,846991,1100293,597623,874466,715078,778364,881059,784866,793187,813306,821627,907235,1452774,971867,995107,1157508,1060889,1076222,1118104,1108111,1340086,1370659,1169338,1183416,1375987,1634933,1508265,1419250,1493442,1499944,2407179,1665925,1578053,1889528,1720541,1728862,1879102,1966974,2400975,3213983,2230227,2137111,3457155,2448197,3379046,2352754,2539997,3306915,2993386,5013979,2912692,2919194,3085175,3071495,3165869,3243978,3545027,3298594,5846912,3449403,3607964,3846076,4104085,4940972,4367338,4489865,6764070,4800951,4892751,5265446,5271948,6362095,5831886,6291980,6237364,5984187,6615272,6156670,6315473,6409847,6542572,7144670,11945621,8593950,9606073,7454040,7950161,8471423,9382616,17777507,9290816,11103834,10537394,10158197,17211067,12654075,11816073,18200023,17719106,12140857,12299660,14106831,12472143,16148645,12952419,13687242,15094831,15404201,15925463,16744856,23009537,17240977,26306842,20695591,19828210,20394650,21641228,21974270,39754393,23956930,36543295,24115733,24440517,24771803,37045429,25252079,25424562,29216999,33515452,41177542,28782073,30499032,42169418,54455962,33985833,37069187,37936568,44600013,40523801,40222860,42035878,59019699,53988802,57631185,54206635,48556250,54034152,50196365,50023882,50676641,54469078,58940014,57999072,104652327,69305874,59281105,64484865,71055020,105132603,82536581,80746661,78159428,155328968,82258738,88779110,104665443,159121405,98580132,130814988,98752615,99232891,100220247,123424879,100700523,169617468,112468150,213328040,117280177,135539885,217798623,123765970,142644293,149214448,163283242,158906089,160418166,166938538,171037848,255112443,138879426,197332747,197813023,197985506,231035235,241046147,388836471,340655316,213168673,277698343,282085618,236234120,252820062,278184178,266410263,262645396,272980418,288093874,364271285,297785515,299297592,305817964,550739270,503150711,336212173,700483458,395145770,570179492,411154179,444203908,449402793,465988735,822999554,524327994,637251703,489054182,498879516,515465458,551164596,585879389,535625814,700963734,587391466,597083107,785614966,635509765,893209430,1004519640,900208361,959669366,806299949,1137043985,1229818874,1897729070,893606701,1059953808,955042917,987933698,1013382176,1014344974,1024679996,1034505330,1121505203,1336473499,1621763103,1810294962,1601602747,1497291468,1953163238,2428063052,1441809714,1959562557,1706508310,1699906650,2922409066,1819682125,1881540399,1907951675,1848649618,1906988877,1942976615,1968425093,2001315874,3927987650,2048850304,2734411980,2156010533,2618796671,2778283213,2939101182,3043412461,3148318024,4436392650,3141716364,7069704014,3555157928,3406414960,3519588775,3817074711,4098987148,5821695674,3730190017,3755638495,7572713206,6878508041,3911401708,6548131324,4779599087,5353208651,4204860837,4774807204,5095111715,7317816668,5919999577,7578109014,6191730485,10966537689,6958791075,6661305139,6926003735,6961572888,9299972552,7249778792,7485828512,10459533032,13150521560,10396591322,8979668041,9558069488,8116262545,8686208912,10128015855,13461016116,11130864572,11286842200,9869918919,11015111292,12111730062,16465496553,20419807191,20573180780,13920363963,15077835433,13587308874,14211351680,25537368465,28059009292,14735607304,15602091057,19973051112,17674332033,16802471457,17095930586,17986181464,18244278400,18556127831,19997934774,23126841354,20885030211,24605526223,21981648981,38975935022,28577226615,27507672837,27798660554,28131715643,28322916178,54053770455,35340208986,29813442737,30337698361,31831537890,41979583755,32404562514,36230459864,33898402043,41113022818,37980960797,39441158042,45108490335,79093983615,42866679192,44011871565,45490556434,46587175204,53813186871,56084899452,69435938996,55306333391,63138869540,69238611029,58660614539,70385523311,60151141098,62742260875,62169236251,65729939933,66302964557,68635022378,70128861907,73339560085,86603579252,77422118839,164025698091,86878550757,88357235626,100400362075,89502427999,233461637087,101893508595,109119520262,129587080094,113966947930,115457474489,118811755637,120829850790,121402875414,199715942001,122320377349,127899176184,128472200808,175422484819,134937986935,141974582463,143468421992,164300669596,165779354465,166924546838,187278912832,216465630851,214367310005,235369823344,191395936594,211013028857,246710931821,223086468192,232778703567,326333923529,236860349903,287182229879,242232726204,366640488839,306275252059,257258364284,522740882910,357835731997,276912569398,278406408927,332703901303,739206513761,355696606190,380146664470,354203459670,642878836069,402408965451,405763246599,414482404786,760244697448,599419192406,919791405467,459946818095,632609175588,479093076107,660478711729,499491090488,690539633300,534170933682,535664773211,679321534849,555318978325,609616470701,756612425121,812577342609,932123093709,734350124140,1140391361918,1150486451395,1851914499176,1096302879899,808172212050,820245651385,874429222881,939039894202,959437908583,1632822993994,1089489912007,1394828835869,978584166595,2611407160589,1033662024170,1069835706893,1695710340243,1687006565490,1164935449026,1289669102465,1343966594841,1490962549261,2524624573431,1972701918372,1542522336190,1628417863435,1682601434931,1694674874266,1897662124057,1747212106252,2717907775442,1813469117083,2103975343228,2661185601526,2012246190765,2048419873488,2103497731063,2859610323292,2729372364413,2198597473196,2234771155919,3338088975953,2454604551491,2508902043867,3091178701093,3868591168272,4466850742256,3170940199625,3237197210456,3225123771121,3311019298366,3377276309197,3441886980518,3560681223335,3759458297017,6921455293747,4048240273002,5490306854006,4060666064253,4871856514057,4689375707410,5536686449149,4927969837609,4433368629115,4707499517063,5325949857012,4963506595358,10092395493372,7502553044771,7878439716688,6396063970746,6536143069487,6408137410081,7820124361270,10727676815892,7070477595383,8249132823254,8268180740398,7621347287588,11115636927144,8481608902117,8108906337255,8494034693368,8750041771663,9122744336525,9140868146178,9361338466724,9396875224473,11103563487809,9671006112421,10289456452370,11359570566104,12804201380827,14414582786175,14890098664114,12932207040233,12944280479568,13478615005464,15179383932638,14691824882971,20226307824334,16115381980956,15730253624843,16102956189705,16590515239372,17231650673780,16602941030623,26282816386291,18502206612902,24030966810292,18537743370651,18758213691197,19067881336894,19960462564791,29535148070856,21649027018474,24163771946931,27983585313465,25876487519801,27834379143682,26410822045697,26422895485032,28170439888435,41102646928668,30422078507814,32705897220328,42141075670540,31833209814548,35733857286682,37192113238571,33834591704403,35105147643525,37039949983553,37295957061848,37605624707545,37826095028091,38718676255988,39028343901685,41609489583265,45812798965405,65266418875599,50040259466732,66702261569453,52287309565498,56004819032117,52833717530729,54593335373467,58592518396249,66155935794496,62255288322362,64539107034876,65667801518951,84666927345277]; 4 | 5 | fn part_one() -> usize { 6 | INPUT.windows(26) 7 | .find(|wnd| wnd[0..25].iter() 8 | .tuple_combinations() 9 | .all(|(a,b)| a + b != wnd[25]) 10 | ) 11 | .map(|wnd| wnd[25]) 12 | .unwrap() 13 | } 14 | 15 | fn part_two(target: usize) -> usize { 16 | let (mut i, mut j, mut sum) = (0,0,0); 17 | while sum != target { 18 | if sum < target { 19 | sum += INPUT[j]; 20 | j += 1; 21 | } else { 22 | sum -= INPUT[i]; 23 | i += 1; 24 | } 25 | } 26 | let min = INPUT[i..j].iter().min().unwrap(); 27 | let max = INPUT[i..j].iter().max().unwrap(); 28 | min + max 29 | } 30 | 31 | aoc2020::main! { 32 | let part_one = part_one(); 33 | (part_one, part_two(part_one)) 34 | } 35 | -------------------------------------------------------------------------------- /src/bin/10.rs: -------------------------------------------------------------------------------- 1 | use std::collections::*; 2 | use itertools::Itertools; 3 | 4 | static INPUT: [usize; 92] = [76,51,117,97,7,77,63,18,137,10,23,14,130,131,8,91,17,29,2,36,110,35,113,30,112,61,83,122,28,75,124,82,101,135,42,44,128,32,55,85,119,114,72,111,107,123,54,3,98,96,11,62,22,49,37,1,104,43,24,31,129,69,4,21,48,39,9,38,58,125,81,89,65,90,118,64,25,138,16,78,92,102,88,95,132,47,50,15,68,84,136,103]; 5 | 6 | fn part_one(v: &[usize]) -> usize { 7 | let (ones, threes) = v.iter() 8 | .tuple_windows() 9 | .fold((1,1), |(ones, threes), (a, b)| match b - a { 10 | 1 => (ones+1, threes), 11 | 3 => (ones, threes+1), 12 | _ => unreachable!(), 13 | }); 14 | ones * threes 15 | } 16 | 17 | // A recursive backtracking approach for part two. 18 | // The DP solution below is a bit simpler but I initially implemented this. 19 | #[allow(unused)] 20 | fn num_paths( 21 | cache: &mut HashMap, 22 | v: &[usize], 23 | target: usize, 24 | i: usize 25 | ) -> usize { 26 | if !v.contains(&i) { 27 | return 0; 28 | } 29 | if i == target { 30 | return 1; 31 | } 32 | 33 | if !cache.contains_key(&i) { 34 | let ans = 35 | num_paths(cache, v, target, i+1) + 36 | num_paths(cache, v, target, i+2) + 37 | num_paths(cache, v, target, i+3); 38 | cache.insert(i, ans); 39 | } 40 | cache[&i] 41 | } 42 | 43 | fn part_two(v: &[usize]) -> usize { 44 | let mut dp = HashMap::new(); 45 | dp.insert(0, 1); 46 | for &i in v { 47 | let ans = 48 | dp.get(&(i-1)).unwrap_or(&0) + 49 | dp.get(&(i-2)).unwrap_or(&0) + 50 | dp.get(&(i-3)).unwrap_or(&0); 51 | dp.insert(i, ans); 52 | } 53 | dp[v.last().unwrap()] 54 | } 55 | 56 | aoc2020::main! { 57 | let v = INPUT.iter() 58 | .cloned() 59 | .sorted() 60 | .collect::>(); 61 | (part_one(&v), part_two(&v)) 62 | } 63 | -------------------------------------------------------------------------------- /src/bin/11.rs: -------------------------------------------------------------------------------- 1 | use itertools::Itertools; 2 | 3 | static INPUT: [&str; 98] = ["LLLLL.LLLLLLL.LLLLLL.L.LLLL..LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.L.LLLLLLLLLLLLLL.LLLLLL","LLLLLLLLLLLLLLL.LLLL..LLLLLLLLLLLL.LLLLLLLL.L..LLLLLLLLLLLL.LLLL.LLL.LLLLL.LLL.LLLLLLLLLLL","LLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLL.LLL.LLLLLLLL.LLLLL.LL.LLLLL.LLLLLLLL.LLLLLL","LLLLL.LLLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLL.LLLLLLLL.LLLLLL","LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLLL","LLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLL.L.LLLLLL.LLLLLL..LLLLLL..LLLLLLLLLLLLLL.LLLLLL",".L..L.L.L.LL..LL.........L....L.L..LL.LLLL.L..L.LLLL.L.L..L.......LL...LL..LL.L..L.L.LL..L","LLL.L.LLL.LLLLL..LLL.LLLLLL.LL.L.L.LLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL.LLLLL.LLLLLLLL..LLLLL","LL.L..LLLLLLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLL","LLL.LLL.LLLL.LL.LLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLL","LLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLL.LL.LLL","LLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLL.LLLLLL","LLLLL.LLLLLLLLL.LL.LLLLLL..LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLL..LLLLLLL.LLL.LL.LLLLLLL.LLLLLL","LLLLL.LLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LL.LLLLLL","LLLLL.LLLLLLLLL.LLLL.LLLLLL.LLLL.LLLLLLLLL..LLLLLLLL.LLLLLL.L.LLLLLLLLLLLL.LLLLLLLL.LLLLLL","LLLLL.LLLLLLLLL.LLLLLLLL.LLL.LLLLL.LLLLLLLL.LLL.LLLL.LLLLLL.LLLLLL.LLLLLLL.LLLLL.LLLLLLLLL","...L..L..........L...L..LLL..L....LL......L......L.L.L...........L....L.L.LL..LL.L....LL..","LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL","LLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLL","LLLLL.LLLLLLLLL.LLLLLLLLLLL..LLLLL..LLLLLLL.LLLLLLLL..LLLLL.LLLLLLLL.LLLLLLLLLLL.LL.LLLLLL","LLLLL.LL.LLL.LL..LLLL.LLLLL.LL.LL..LLL.LLLL.LLLLLLL..LLLLLLLL.LLLLLL.LLLL..LLLLLLLL.LLLLLL","LLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLL.L.LLLLLLLL..LLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLL","LLLLL.LLLLLLLLL.LLLL.LLLLLL.LLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLLL..LLLLLLLL.LLLLLL","LLLLLLLLLLL.LLL.LLLL.LLLLLL.L.LLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLL","LL...L.LLL.....L....LL.....L...L.L....L.L.....L.LL...L..L.....L.L..LLL.L.LL.LLLL..........","LLLLL.LLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLL..LLLL.LLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL","LLLLL.LLLLLLLLL.LLLL.LLLLLL..LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLL..LLLLLLL.LLLLLL","LLLLLLLLLLLLLLL.LLL..LLLLLL.LLLLL.LL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLL","LLLLL.LLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLL..LLLLL.LLLLLLLLL.LLLLLLLL.LLLLL..LL.LLLL.LLLLLL","L..LL.L.....L...LL.....L.L........L..LL...L.....L....L..L.L...L...LL.......L.L....L.......","LLLLL..LLLLLLLL.LLLL.LLLLLL.LLLLLLLL.LLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL..LLLL.LLLLLLLL.LLLLLL","LLLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLL.LLL.LLLL.L.LLLLLLLLLLLLLLLLL.L.LLL.LLLLLL","LLLLL.LLLLLLLLL.LL.LLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL..LLLLL","LLLLLLLLLLLLLLL.LLL..LL.LLLLLLLLLLLLLLLLLLL.LLL.LLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLL.LLLLL.","LLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLL","LLLLL.LLLLLLLLLLLL.L.LLLLLL.LLLLLLLLLLLLLLL.LL.LLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLL.LLLLLL","LLLLLLLLLLLLLLL..LLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLL.LLLLLLLLLLLLLLL","LLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLL.LL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LL",".L.LLLLL.............L.LL.L.LLL.L.LL....L...L...L.....L..L...LLLL..L..L.......L.L.LLL.LLLL","LLLLL.LLLLLLLLLLLLLLLLLLLLL..LLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLL","LLLLL.LLLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLL.LLL.LL.LLLLL.LLLLL.LLLLLL.LLLLLLLL","LLLLLLLLLL.LLL.LLLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLL.LLLL","LLLLL.LLLLLLLLL.LLLL.LLLLLL.LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLL.LLLLLLLL.LLLL..LLLLL.LLLLLLLLL","LLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL..LLLLLL.LLLLLLLL.LLLLL.LLLLLLLL.LLLLLL","LLLL..LLLLLLLLL..LLL.LLLLLL.L.LLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.L..LL.LLLLLLLL.LLLLLL","LLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLL..LLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLL","LLLLL.LLLLLLLLL.LLLLLLLLLLL.LLL.LLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLL..LLLLLL","LLLLL.LLLLL.LLL..LLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLL.LL",".L.......LL...L...L.LL.LL......L..L...L...L...L....LL..L...L..LLL.....L.....L.....LLL.LL..","LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLL..LLLLL.LL.LLLLL.LLLLLLL..L.LLLL","LLLLL.LLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLLLL.L.LLL.LLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLL","LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLL","LLLLL.LLLLLLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.L.LLLLL.LL.LLLLL.LLLLLL","LLLL..LLLLLLLLL.LLLLLLLLLLL.LL.LLL.LLLLLLLL.LLLLLLLLLLLL.LL.LLLLLLLL.LLLLL.LLLLLLLL.LLLLLL",".......L......L....L....L......L...L.L..L...L.LL.....L......L.......LL.........L.L.L...LLL","L.LLL.LLLLLLLLL.LLLL.LLLLL..LLLLLL.LLLLLLLLLLLLLL.LL.LLLLLL.LLLLLL.L.LLLLL.LLLLL.LLL.LLLLL","LLLLL.LLLLLLLLLLL.LL.LLLLLL..LLLL..LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLL.LLLLLLLLLLLLLLL","LLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLL.LLLLLLLLLL.LLLLLL","LLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLL.LLLL.LLL.LLLL.LLL.L..LLL.LLL.LLLL.LLLLLLL.LLLLLLLLLLLLL","LLLL.LLLLLLLLLL.L.LL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLLL.LLLLLLLL.LLLLLL","LLLLL.LLLLLLLLL.LLLLLL.LLL..LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLL.LLLLLLLLLLLLLL.LLLLLL",".LLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLL.L.LLLLLL.LLLLLL.LLLLLLLL.LLLLL.LLL.LLL..LLLLLL","LLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL","L...L.........L....L......LL..LL.....LL.L..LLL....L.L...L..LLL.......LL.L...L..L...LL...L.","LLLLL.LLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLL.LLLLLLLLLL.LLLLLLLLL.LLLLL","LLLLL.L.LLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLL..LL.LLLLLLLLLLL","LLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL","LLLLL.LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LL.LLL","LLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL.LLLLL.LLLLLLLL..LLLLL",".L.L.L..L.L...LLLLLL.....LL...L..L..L......LLLL.L.LL.....LLLL.LL.L.....L.L...L....L...L...","LLLL..LLLLLL.LL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLL.LLLLL.LLLLLLLLL","LLLLL.LLLLLLLLL.LLLLLLLLLLL..LLLLL.L.L.LLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLL","LLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLL.LLL.LLLLLLLLLLLLLL.LLLL..LLLLL","LLLLLL.LLLLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL.LL.LL..LLLLLLL.LLLLLL","LLLLL.LLLL..LLLLL.LL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLL.LLL.LLLLLL","....L........L..L...........L.L............L.....LL..L.L.L.........LLLLLL.LL..L..L.L..L...","LL.LLLLLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.L..LLLL..LLLLLL","LLLLL.LLLLLLLLL.LLLL.LLLLLLLLLLL.L.LLLLLLLL.LLLLLLLL.LLL.LL.LLLLLLLL..LLLL.LLLL.LLLLLLLLLL","LLLL.LLLLLLLLLL.LLLL.LLLLLL.LLLLLLLLLLLLL.L.LLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLL.LLLLLL","LLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLL.LLL.LLLLLLLL.LLLLLLLLLLL.LLL.LLLLL.LLLLLLL..LLLLLL","LLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLL..LL.LLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLL","LLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLL..LLLLLLL.LLLLL.LL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLL.LLLLLL","LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL...LLLLLL.LLLL.L.LLLLL.LL.LLLLL.LLLLLLLL.L.LLLL","LLLLLLLLLLLLLLL.LLLL.L.LLLL.LLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.L.LLLLLL.LLLLLL","L.LLL......LLL....L.......L..L..L.....LL......L.LLLL...L.....L.L............L.LL....LL....","LLLLLLLLLLLLLLL.LLLLLLLLLLL.LLL.LL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLL.LLLLLL","L..LL.LLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLLLL.LLLLLL","LLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLL..LL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLL.LLLLL.LLL.LLLL.LLLLLL","LLLLL.LL.LLLLLL.LLLL.LLLLLL.LL.LLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLL","LLLLLLLLLLLLLLL.LLLLLLL..LL.LLLL.L.LLLLLLLL.L.LLLLL..LLLLLL.LLLLLLL..LLLLLLLLLLLLLL.LLLLLL","LLL...LLLLLLLLL.LLLL.LLLLL..LLLLLLL.LLLLLLL...LLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLL.LL","LLLLLLLLLLLLLLL.LLLL.LLLLLL.LLLL.LLLLLLLLLL.LLLLLLL.LLL.LLLLLLLLLL.L.LLLLLLLLLLLLLL.L.LLLL","...L.L.L.L.....LL...L...LL.L........L...LL.L...........L..L.L.L.L..L...LL.LL.L.L.L....L..L","LLL.L.LLLLLLLLL.LLLL.L.LLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL..LLLL.LLLLL.LL.LLLLLL","LLLLL.LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLL.LLLLLLLLLL.LLLLLLLLLLLLLLL","LLLLL.LLLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLLL..LLLLLLLL.LLLLLL","LLLLL.LLLLLLLLLLLLLL.L.LLLL.LLLL.L.LLLLLLLL.LLLLLLLL.LLL.LL.LLLLLLLL.LLLLL.LLLLLLLL.LLLLLL","LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLL.LLLLL.LLLLLLLL.LLLLLL"]; 4 | static DIRS: [(i64,i64); 8] = [(-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1)]; 5 | 6 | fn should_swap_p1(map: &[Vec], i: usize, j: usize) -> bool { 7 | let mut neighbours = DIRS.iter() 8 | .map(|&(dy,dx)| (i as i64 + dy, j as i64 + dx)) 9 | .filter_map(|(y,x)| map.get(y as usize).and_then(|v| v.get(x as usize))); 10 | match map[i][j] { 11 | 'L' => neighbours.all(|&c| c != '#'), 12 | '#' => neighbours.filter(|&&c| c == '#').count() >= 4, 13 | _ => unreachable!() 14 | } 15 | } 16 | 17 | fn find_neighbour( 18 | map: &[Vec], 19 | (dy, dx): (i64, i64), 20 | (i,j): (usize,usize), 21 | ) -> Option { 22 | let (mut i, mut j) = (i as i64, j as i64); 23 | loop { 24 | i += dy; 25 | j += dx; 26 | let tile = map.get(i as usize) 27 | .and_then(|row| row.get(j as usize)) 28 | .copied(); 29 | if tile != Some('.') { 30 | return tile; 31 | } 32 | } 33 | } 34 | 35 | fn should_swap_p2(map: &[Vec], i: usize, j: usize) -> bool { 36 | let mut neighbours = DIRS.iter().filter_map(|&dir| find_neighbour(&map, dir, (i,j))); 37 | match map[i][j] { 38 | 'L' => neighbours.all(|c| c != '#'), 39 | '#' => neighbours.filter(|&c| c == '#').count() >= 5, 40 | _ => unreachable!() 41 | } 42 | } 43 | 44 | fn run_simulation], usize, usize) -> bool>(should_swap: F) -> usize { 45 | let mut map = INPUT.iter() 46 | .map(|s| s.chars().collect::>()) 47 | .collect::>(); 48 | let mut to_swap = Vec::new(); 49 | loop { 50 | to_swap.clear(); 51 | for (i,j) in (0..map.len()).cartesian_product(0..map[0].len()) { 52 | if map[i][j] != '.' && should_swap(&map,i,j) { 53 | to_swap.push((i,j)); 54 | } 55 | } 56 | for &(i,j) in &to_swap { 57 | map[i][j] = if map[i][j] == 'L' {'#'} else {'L'}; 58 | } 59 | if to_swap.is_empty() { break; } 60 | } 61 | map.iter().flatten().filter(|&&c| c == '#').count() 62 | } 63 | 64 | aoc2020::main! { 65 | let part_one = run_simulation(should_swap_p1); 66 | let part_two = run_simulation(should_swap_p2); 67 | (part_one, part_two) 68 | } 69 | -------------------------------------------------------------------------------- /src/bin/12.rs: -------------------------------------------------------------------------------- 1 | static INPUT: [(char,i64); 773] = [('W',5),('F',63),('S',1),('L',90),('F',89),('W',4),('F',45),('W',4),('F',71),('R',90),('S',4),('F',16),('E',5),('R',90),('S',5),('F',94),('S',4),('W',5),('F',66),('N',3),('W',1),('R',90),('F',13),('R',180),('W',5),('F',58),('E',2),('R',270),('F',72),('L',90),('S',2),('L',90),('N',3),('W',5),('F',90),('S',2),('F',86),('L',90),('F',72),('N',4),('W',5),('N',1),('W',3),('N',2),('E',1),('S',5),('R',90),('F',11),('W',2),('R',90),('F',58),('S',5),('F',64),('R',180),('E',4),('N',5),('F',53),('R',90),('W',5),('N',3),('F',39),('S',3),('R',180),('N',2),('E',4),('L',90),('W',1),('R',90),('S',1),('R',90),('F',40),('E',1),('F',95),('W',2),('R',90),('S',5),('F',41),('L',270),('N',4),('L',90),('E',3),('S',2),('E',5),('L',180),('F',38),('S',5),('E',3),('L',90),('W',3),('S',4),('L',180),('S',5),('F',33),('W',2),('R',90),('R',90),('F',95),('E',2),('F',96),('R',90),('F',15),('L',90),('N',2),('R',90),('N',1),('F',69),('R',180),('N',5),('L',90),('F',53),('L',180),('W',1),('L',90),('S',1),('L',180),('S',2),('N',4),('N',2),('F',51),('W',1),('F',17),('W',1),('R',180),('W',5),('S',4),('R',180),('F',87),('N',2),('W',3),('F',26),('L',90),('E',4),('N',1),('F',62),('N',5),('R',90),('F',53),('N',4),('R',90),('N',3),('L',180),('W',3),('N',4),('R',90),('S',1),('W',2),('L',90),('W',2),('S',2),('R',90),('W',1),('F',50),('R',180),('F',84),('L',90),('F',12),('R',180),('F',26),('W',5),('N',3),('R',90),('S',1),('F',3),('N',4),('E',3),('R',180),('W',1),('N',5),('W',1),('W',4),('F',89),('L',270),('W',4),('L',180),('N',4),('F',83),('W',2),('F',45),('L',90),('F',79),('W',2),('R',90),('W',1),('N',4),('L',90),('W',1),('N',1),('F',56),('N',5),('W',2),('N',3),('L',90),('W',3),('N',5),('F',49),('F',4),('S',2),('F',93),('N',1),('R',90),('N',3),('W',3),('F',29),('S',1),('N',5),('F',54),('N',5),('R',180),('F',92),('E',1),('L',90),('W',3),('L',270),('E',4),('L',180),('S',5),('E',2),('F',84),('L',180),('N',4),('F',14),('F',60),('N',2),('F',98),('L',270),('F',61),('N',3),('F',39),('E',5),('L',180),('W',4),('N',2),('R',90),('F',71),('S',4),('L',90),('L',90),('S',1),('F',15),('L',90),('E',2),('F',73),('N',4),('F',92),('S',5),('W',2),('N',4),('R',90),('S',1),('F',29),('E',4),('S',4),('F',9),('E',4),('F',10),('W',3),('S',1),('F',55),('S',5),('F',88),('F',94),('L',180),('F',99),('N',2),('W',4),('F',87),('E',5),('S',1),('L',180),('S',1),('L',90),('W',3),('N',1),('W',5),('F',50),('W',2),('S',2),('F',61),('N',1),('W',3),('R',90),('F',7),('W',1),('L',90),('E',2),('R',90),('L',90),('W',5),('S',4),('R',90),('S',1),('F',70),('W',3),('F',72),('S',5),('L',90),('E',5),('F',87),('L',90),('F',64),('S',2),('F',35),('L',90),('N',5),('R',90),('N',5),('W',4),('L',90),('F',41),('L',90),('E',4),('N',2),('F',84),('R',90),('F',67),('S',4),('E',3),('F',70),('E',5),('L',90),('F',98),('N',4),('W',2),('L',90),('E',2),('F',31),('N',3),('W',2),('F',80),('S',5),('F',43),('S',1),('E',2),('L',90),('F',61),('E',2),('L',90),('F',56),('L',90),('N',4),('W',5),('L',180),('W',2),('F',19),('N',4),('F',90),('N',4),('W',2),('R',90),('F',27),('S',5),('F',3),('N',2),('R',90),('W',1),('S',1),('F',48),('S',3),('F',61),('R',270),('F',76),('S',4),('L',180),('N',4),('W',1),('F',34),('E',1),('L',90),('F',62),('W',1),('F',37),('S',1),('L',90),('N',5),('F',25),('N',4),('E',1),('L',90),('F',98),('N',4),('E',5),('R',90),('F',19),('R',180),('E',4),('F',74),('E',4),('N',3),('W',1),('F',86),('W',5),('F',85),('E',1),('E',2),('S',2),('F',79),('R',90),('W',5),('S',3),('L',90),('S',2),('F',43),('L',180),('E',4),('F',64),('L',180),('N',1),('W',1),('S',4),('E',3),('L',180),('N',2),('W',4),('R',90),('F',63),('L',90),('S',5),('W',5),('F',27),('L',90),('F',38),('L',90),('W',1),('F',18),('N',5),('S',2),('E',5),('F',54),('E',2),('F',68),('F',40),('S',5),('F',7),('N',3),('E',1),('L',90),('N',2),('W',3),('F',22),('L',90),('W',3),('R',90),('E',2),('R',180),('N',1),('L',90),('F',36),('E',5),('L',90),('E',4),('N',5),('F',62),('R',90),('E',4),('R',180),('F',70),('N',4),('F',56),('L',90),('F',96),('L',90),('N',4),('F',70),('W',3),('L',90),('F',32),('L',90),('W',2),('F',36),('S',1),('F',85),('R',90),('S',3),('R',90),('F',77),('S',2),('W',3),('R',90),('N',2),('W',5),('L',180),('F',25),('R',180),('S',2),('E',1),('L',180),('E',2),('S',1),('F',59),('N',1),('F',57),('R',90),('W',5),('L',90),('S',1),('R',90),('W',1),('R',180),('W',1),('N',2),('W',4),('F',8),('S',2),('F',40),('R',90),('F',43),('S',3),('S',1),('W',2),('F',82),('W',1),('S',4),('L',180),('F',51),('L',180),('N',2),('F',83),('L',90),('E',1),('N',5),('F',11),('W',1),('F',2),('S',3),('L',90),('W',1),('S',2),('F',48),('L',90),('E',5),('L',180),('F',25),('W',2),('F',78),('F',78),('E',1),('S',3),('W',4),('N',4),('L',90),('F',73),('S',4),('F',91),('R',180),('F',21),('N',4),('F',9),('W',1),('N',4),('L',90),('N',4),('L',180),('N',5),('E',5),('L',90),('S',3),('R',90),('W',3),('R',90),('F',65),('E',5),('E',1),('F',10),('L',270),('F',71),('E',2),('F',10),('L',180),('W',4),('S',2),('W',2),('L',90),('F',22),('W',4),('F',41),('N',4),('E',5),('R',90),('N',1),('W',4),('F',34),('R',270),('E',5),('F',77),('L',270),('R',180),('E',5),('N',3),('R',180),('E',4),('R',90),('E',2),('F',25),('F',34),('S',3),('E',4),('N',5),('W',5),('L',90),('L',90),('F',78),('L',90),('S',1),('W',4),('F',32),('E',5),('F',54),('E',2),('F',61),('E',3),('N',4),('F',60),('N',1),('R',90),('F',4),('N',1),('R',90),('E',1),('L',180),('R',90),('F',4),('E',3),('F',4),('L',90),('S',4),('W',1),('L',90),('E',1),('L',90),('S',5),('F',30),('R',90),('F',34),('N',4),('F',95),('R',180),('F',59),('R',90),('F',47),('E',4),('F',48),('L',90),('F',59),('W',1),('S',4),('F',12),('R',90),('F',59),('S',1),('F',53),('N',5),('F',15),('L',90),('F',47),('N',3),('E',2),('F',77),('R',180),('F',59),('W',3),('S',3),('F',40),('E',4),('L',90),('S',5),('F',19),('S',1),('W',5),('N',1),('L',90),('S',2),('E',1),('F',17),('L',90),('E',1),('F',93),('N',5),('F',95),('W',1),('L',90),('F',5),('E',2),('L',270),('N',3),('L',90),('E',4),('W',2),('W',2),('F',30),('W',3),('L',90),('F',87),('R',270),('N',5),('F',51),('R',270),('F',97),('E',4),('S',5),('W',1),('R',90),('W',4),('F',84),('E',5),('R',90),('W',4),('N',1),('R',90),('F',67),('L',90),('W',2),('R',90),('W',1),('S',5),('F',17),('F',83),('E',3),('L',90),('N',1),('W',3),('L',90),('F',50),('E',1),('F',70),('S',5),('F',35),('R',270),('N',4),('W',3),('S',2),('L',90),('S',1),('E',1),('L',90),('S',1),('R',180),('F',32),('W',5),('N',5),('W',3),('R',90),('S',4),('F',51),('R',180),('F',89),('S',4),('L',90),('F',14),('S',4),('L',180),('W',2),('R',90),('F',25),('W',5),('F',44),('W',3),('L',180),('F',27),('W',3),('L',180),('L',180),('F',52),('N',3),('W',1),('N',1),('F',4),('E',2),('R',90),('F',52),('L',90),('F',94),('L',90),('F',13)]; 2 | 3 | fn part_one() -> i64 { 4 | let (mut x, mut y, mut r) = (0, 0, 90); 5 | for (d, n) in &INPUT { 6 | match d { 7 | 'N' => y += n, 8 | 'S' => y -= n, 9 | 'E' => x += n, 10 | 'W' => x -= n, 11 | 'L' => r -= n, 12 | 'R' => r += n, 13 | 'F' => match r.rem_euclid(360) { 14 | 0 => y += n, 15 | 90 => x += n, 16 | 180 => y -= n, 17 | 270 => x -= n, 18 | _ => unreachable!(), 19 | } 20 | _ => unreachable!(), 21 | } 22 | } 23 | x.abs() + y.abs() 24 | } 25 | 26 | fn rot(x: i64, y: i64, d: i64) -> (i64,i64) { 27 | match d { 28 | 90 => (-y, x), 29 | 180 => (-x, -y), 30 | 270 => ( y, -x), 31 | _ => unreachable!(), 32 | } 33 | } 34 | 35 | fn part_two() -> i64 { 36 | let (mut x, mut y) = (10, 1); // waypoint 37 | let (mut i, mut j) = (0, 0); // ship 38 | for &(d,n) in &INPUT { 39 | match d { 40 | 'N' => y += n, 41 | 'S' => y -= n, 42 | 'E' => x += n, 43 | 'W' => x -= n, 44 | 'L' => { 45 | let (a,b) = rot(x, y, n); 46 | x = a; 47 | y = b; 48 | } 49 | 'R' => { 50 | let (a,b) = rot(x, y, 360 - n); 51 | x = a; 52 | y = b; 53 | } 54 | 'F' => { 55 | i += x * n; 56 | j += y * n; 57 | } 58 | _ => unreachable!(), 59 | } 60 | } 61 | i.abs() + j.abs() 62 | } 63 | 64 | aoc2020::main! { 65 | (part_one(), part_two()) 66 | } 67 | -------------------------------------------------------------------------------- /src/bin/13.rs: -------------------------------------------------------------------------------- 1 | static START: i64 = 1003240; 2 | static INPUT: &str = "19,x,x,x,x,x,x,x,x,41,x,x,x,37,x,x,x,x,x,787,x,x,x,x,x,x,x,x,x,x,x,x,13,x,x,x,x,x,x,x,x,x,23,x,x,x,x,x,29,x,571,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,17"; 3 | 4 | fn part_one(busses: &[(i64,i64)]) -> i64 { 5 | for i in START.. { 6 | if let Some((_,b)) = busses.iter().find(|(_,b)| i % b == 0) { 7 | return b * (i - START) 8 | } 9 | } 10 | unreachable!() 11 | } 12 | 13 | fn egcd(a: i64, b: i64) -> (i64, i64, i64) { 14 | if a == 0 { 15 | (b, 0, 1) 16 | } else { 17 | let (g, x, y) = egcd(b % a, a); 18 | (g, y - (b / a) * x, x) 19 | } 20 | } 21 | 22 | fn mod_inv(x: i64, n: i64) -> Option { 23 | let (g, x, _) = egcd(x, n); 24 | if g == 1 { 25 | Some((x % n + n) % n) 26 | } else { 27 | None 28 | } 29 | } 30 | 31 | // from: https://rosettacode.org/wiki/Chinese_remainder_theorem#Rust 32 | fn chinese_remainder(residues: &[i64], modulii: &[i64]) -> Option { 33 | let prod = modulii.iter().product::(); 34 | let mut sum = 0; 35 | for (&residue, &modulus) in residues.iter().zip(modulii) { 36 | let p = prod / modulus; 37 | sum += residue * mod_inv(p, modulus)? * p 38 | } 39 | Some(sum % prod) 40 | } 41 | 42 | fn part_two(busses: &[(i64, i64)]) -> i64 { 43 | let mods = busses.iter().map(|&(_,b)| b).collect::>(); 44 | let res = busses.iter().map(|&(i,b)| b-i).collect::>(); 45 | chinese_remainder(&res, &mods).unwrap() 46 | } 47 | 48 | aoc2020::main! { 49 | let busses = INPUT.split(',') 50 | .enumerate() 51 | .filter(|&(_,s)| s != "x") 52 | .map(|(i,s)| (i as i64, s.parse().unwrap())) 53 | .collect::>(); 54 | (part_one(&busses), part_two(&busses)) 55 | } 56 | -------------------------------------------------------------------------------- /src/bin/14.rs: -------------------------------------------------------------------------------- 1 | use std::collections::*; 2 | 3 | static INPUT: [Op; 560] = [Op::Mask(b"X100110110X011000101000101XX11001X11"),Op::Mem(5201,1838761),Op::Mem(32099,25747352),Op::Mem(36565,72187),Op::Mem(31494,369864),Op::Mem(17260,3138),Op::Mem(64903,91484814),Op::Mask(b"0X00100101000XX0011110X10110X100X010"),Op::Mem(54866,120526),Op::Mem(57614,430839),Op::Mem(17916,648),Op::Mem(43192,325890),Op::Mem(23626,313518443),Op::Mem(45988,50484),Op::Mask(b"01001001X0001X00XXX110X010010XX0X001"),Op::Mem(60805,1352),Op::Mem(37516,5942314),Op::Mem(63169,237020309),Op::Mem(31655,274507),Op::Mask(b"010011010001110000010000X101X0X11X01"),Op::Mem(49875,15349586),Op::Mem(6956,13765452),Op::Mem(675,886107857),Op::Mask(b"01000001X1XX11011X1111X111X000X01X11"),Op::Mem(2135,5930),Op::Mem(1861,1009),Op::Mem(62754,145160),Op::Mem(1333,1153712),Op::Mem(15455,7454),Op::Mask(b"01X01X011X0011X0X10110001X1X1000X110"),Op::Mem(53253,667716),Op::Mem(47571,745817),Op::Mem(48582,5810),Op::Mem(3620,7851685),Op::Mem(41836,14080244),Op::Mem(39150,84103),Op::Mask(b"01001X01100X100010X111111X11100XX111"),Op::Mem(249,514),Op::Mem(25687,48545),Op::Mem(62083,208926),Op::Mem(39872,2590),Op::Mem(28491,267),Op::Mem(25340,115744),Op::Mem(31101,6781),Op::Mask(b"0100100100011101000XX001XX0010100X10"),Op::Mem(6053,6291996),Op::Mem(37941,514441),Op::Mem(22984,108425255),Op::Mem(30540,127685),Op::Mask(b"000X100101011X1X1010X1011110XX10X1X0"),Op::Mem(42567,253905),Op::Mem(45241,15790),Op::Mem(57132,480344),Op::Mem(29971,22597051),Op::Mask(b"XXX0111110001100010X1X01X10X0000000X"),Op::Mem(44680,428361054),Op::Mem(17571,4884),Op::Mask(b"X1X001010X0111101X11X100X10100101100"),Op::Mem(55107,2922),Op::Mem(8605,5742),Op::Mem(63754,289191),Op::Mask(b"01101001010X11000110111X11000X01X000"),Op::Mem(48186,7310),Op::Mem(30306,413),Op::Mem(1980,538481),Op::Mask(b"010011011XX011X110011111101X01101X1X"),Op::Mem(45241,11454771),Op::Mem(65349,36152803),Op::Mem(62368,34863),Op::Mem(26794,5220),Op::Mask(b"010X10XXX1001100011101X00X0110011110"),Op::Mem(15496,898),Op::Mem(59847,32170699),Op::Mem(5411,130682),Op::Mem(27017,205172),Op::Mem(48688,3072),Op::Mask(b"001X000X111X110000110XX0010100001110"),Op::Mem(17575,12630818),Op::Mem(51454,28544),Op::Mem(52745,45251),Op::Mask(b"000000010100X110X11101X101X1011010X1"),Op::Mem(49456,637756),Op::Mem(63169,99927),Op::Mem(50318,7599616),Op::Mem(42115,48825),Op::Mem(20469,5931716),Op::Mem(56899,2884),Op::Mask(b"01XX100X0100X10001XX011111X000001XX0"),Op::Mem(45630,2305),Op::Mem(28560,118602807),Op::Mem(45644,52185),Op::Mem(3682,56264),Op::Mem(63201,237495702),Op::Mem(63572,7683),Op::Mem(24477,370),Op::Mask(b"01X0X0XX0X011100011110000X0XX00X1111"),Op::Mem(14028,3492),Op::Mem(28452,213847),Op::Mem(57663,203516),Op::Mem(24701,45071697),Op::Mem(30226,856135),Op::Mem(59279,100557),Op::Mask(b"0110100001X0X1X0010XX1XX00X100000000"),Op::Mem(4237,60693),Op::Mem(51454,56389),Op::Mem(44364,12145),Op::Mem(53190,3825966),Op::Mask(b"0X0010000X011X0011111001100010X10100"),Op::Mem(45988,84435),Op::Mem(43613,171165),Op::Mem(39150,2025),Op::Mask(b"000001010X111100111101001000X00X000X"),Op::Mem(7204,243074994),Op::Mem(30540,2829011),Op::Mem(16986,171341),Op::Mask(b"01101X0101001X101X1111110X0X01X0010X"),Op::Mem(40006,276307),Op::Mem(50601,45),Op::Mem(2907,7955),Op::Mem(61049,14014170),Op::Mem(20722,52156072),Op::Mem(12299,1701485),Op::Mem(4643,2041760),Op::Mask(b"X1101000010X110X0111X011001101000000"),Op::Mem(29309,29638912),Op::Mem(23626,127552394),Op::Mem(39357,2743410),Op::Mask(b"XXX01000000110001111101X101X1XX0XX01"),Op::Mem(32322,110798340),Op::Mem(38758,20398089),Op::Mem(62368,6402),Op::Mem(12381,125762),Op::Mem(34042,46630),Op::Mask(b"0X1X100X0X01100X11X11111101100100001"),Op::Mem(56680,52806),Op::Mem(3416,5097254),Op::Mem(21217,959),Op::Mem(11134,22705),Op::Mem(39515,607),Op::Mem(31858,527794383),Op::Mask(b"011110010100X10001110111X0XXX00110X1"),Op::Mem(37752,3783),Op::Mem(27543,180509),Op::Mem(56503,26998899),Op::Mem(33984,2996098),Op::Mem(6471,16602683),Op::Mem(18585,5056811),Op::Mem(3477,16274),Op::Mask(b"010110011XXX110X01011XX11X0100110X00"),Op::Mem(43993,784),Op::Mem(12295,412860764),Op::Mem(62707,11253),Op::Mem(27017,1813664),Op::Mask(b"1XX0X001010X1010101100X000X0100XX000"),Op::Mem(25364,640),Op::Mem(35537,489258314),Op::Mem(356,47335),Op::Mem(46814,130),Op::Mem(21071,32074),Op::Mem(23980,1969160),Op::Mem(43457,28765451),Op::Mask(b"0X0XX00110XX1X00X10111110011X01X1001"),Op::Mem(37516,3409),Op::Mem(32451,486160),Op::Mem(31704,494261),Op::Mem(64905,489121330),Op::Mask(b"10001001X101111010X010X1X11X1001010X"),Op::Mem(19927,125979),Op::Mem(16164,163616),Op::Mem(41291,11806544),Op::Mem(13074,22666),Op::Mem(65160,1102),Op::Mem(21338,53735104),Op::Mask(b"00X00101X10111XX111101XX10X111111100"),Op::Mem(44736,13061),Op::Mem(62844,31422),Op::Mem(4643,59264),Op::Mem(45417,5454),Op::Mask(b"X0001X010X001101011X11001XX000101000"),Op::Mem(33984,13200),Op::Mem(15462,316464),Op::Mem(2638,1434216),Op::Mem(29044,1370180),Op::Mem(57663,77699993),Op::Mem(39191,9595034),Op::Mask(b"100X1X0X010111X011101011111111XX1000"),Op::Mem(60509,275540),Op::Mem(65073,8066),Op::Mem(64726,78129),Op::Mem(15719,724),Op::Mem(52499,43989105),Op::Mem(57518,6805488),Op::Mem(27827,1522993),Op::Mask(b"0X010110X011X100111X00000111X1110X10"),Op::Mem(395,16602),Op::Mem(21477,62043769),Op::Mem(24630,663408947),Op::Mem(3983,31082032),Op::Mem(30545,456250),Op::Mask(b"0100XX01X000X10X10011101100X11101X10"),Op::Mem(28174,110183887),Op::Mem(9644,12911),Op::Mem(62113,145),Op::Mask(b"010010X10000100100110000101X1XX11011"),Op::Mem(63016,127052),Op::Mem(49130,37),Op::Mem(25394,187810),Op::Mem(29779,11708792),Op::Mem(36144,1033),Op::Mask(b"00101001X10XX10X11111X1100000111X001"),Op::Mem(35746,498408),Op::Mem(15462,7839193),Op::Mem(5741,168870),Op::Mask(b"0010100100X011XX1111X1001001X1X10101"),Op::Mem(2256,10474689),Op::Mem(57428,8228),Op::Mem(34062,16609889),Op::Mem(45031,106065),Op::Mem(17162,138367053),Op::Mem(23302,14262),Op::Mask(b"001100110X1X11XX110100X0010100XX1000"),Op::Mem(33186,1012027),Op::Mem(34051,148436),Op::Mem(4762,25019364),Op::Mem(41825,102071658),Op::Mem(32580,739),Op::Mem(15455,151015),Op::Mask(b"01X1XX00X10001000100011001000000XX10"),Op::Mem(31330,300785),Op::Mem(30222,206857068),Op::Mem(27739,774225),Op::Mem(47798,12155),Op::Mem(57437,440075165),Op::Mem(49892,58),Op::Mem(44723,116116),Op::Mask(b"100X1X00000X100011X1X00100101X00010X"),Op::Mem(35368,5187),Op::Mem(24769,1425443),Op::Mem(62844,277),Op::Mem(30729,11517370),Op::Mask(b"0110100X0010110111X10X111000X11011X1"),Op::Mem(63295,139),Op::Mem(60805,381899),Op::Mem(6956,3979616),Op::Mem(12295,1828),Op::Mask(b"010010X10X00X00X00X11XX00001X1001X00"),Op::Mem(39150,459766),Op::Mem(52621,1962),Op::Mem(11891,5261559),Op::Mask(b"X11011X11X00110001011X1X110010000000"),Op::Mem(48473,3539),Op::Mem(13808,331),Op::Mem(30016,676),Op::Mem(9736,3140258),Op::Mem(12233,388562584),Op::Mem(42686,1048145655),Op::Mem(26132,67723),Op::Mask(b"01001X0X010X0001001X10101111X10110X1"),Op::Mem(35042,230878861),Op::Mem(8611,488144),Op::Mem(4290,942073),Op::Mem(12381,17121117),Op::Mem(15011,225),Op::Mem(8378,9255),Op::Mask(b"00001X0XX01X11X01101001101011110101X"),Op::Mem(49708,312037855),Op::Mem(19488,93439469),Op::Mem(57113,7931),Op::Mem(29037,210754),Op::Mask(b"0100X001X0X01X0100110X11X110001110X1"),Op::Mem(8519,38940),Op::Mem(49033,10564),Op::Mem(58481,4187786),Op::Mem(5201,230275712),Op::Mem(39296,886),Op::Mask(b"1000100X010X11101X1011011X0110X11XXX"),Op::Mem(38587,50240362),Op::Mem(42581,116256847),Op::Mem(37181,4441034),Op::Mem(16281,23027479),Op::Mem(32451,71649158),Op::Mem(33316,6511),Op::Mask(b"000001X11101111011X1X10X1X001X1X1000"),Op::Mem(26168,390),Op::Mem(11548,29301),Op::Mem(2731,3188615),Op::Mask(b"1100XX00X0X110001X111X000011X0X10001"),Op::Mem(32136,6436),Op::Mem(46206,225594),Op::Mem(33132,7862942),Op::Mem(15264,198),Op::Mask(b"01001001000X1101000111011X0011XXX10X"),Op::Mem(33733,14993993),Op::Mem(9905,246637292),Op::Mem(6373,2090),Op::Mem(53539,29386),Op::Mask(b"0X1010X1X01011XX11111100100XX110X00X"),Op::Mem(41520,452041),Op::Mem(8605,43647),Op::Mem(62764,3241680),Op::Mask(b"0X1X10X1010111X0X1110XXX00000110X001"),Op::Mem(38517,3338),Op::Mem(52745,4455),Op::Mem(33218,850605),Op::Mem(20495,315451),Op::Mask(b"0XX0X001010X11X01X111X1101X11X101000"),Op::Mem(32284,615642818),Op::Mem(62844,46924),Op::Mem(31120,146622),Op::Mem(21925,518931),Op::Mem(29515,1112),Op::Mem(31241,130404),Op::Mem(9905,5469165),Op::Mask(b"01101000001X110X1101101110XX1X1XX101"),Op::Mem(46432,346428972),Op::Mem(64522,218092103),Op::Mem(42311,2316477),Op::Mem(20060,565),Op::Mem(62919,261004),Op::Mem(50103,42134),Op::Mask(b"0101100101000100X1X01XX11X0X00111010"),Op::Mem(41199,48367827),Op::Mem(40992,886149),Op::Mem(19927,93429),Op::Mask(b"01001X01X0XX110X0XX1110X011110001101"),Op::Mem(40019,187824261),Op::Mem(3416,35491),Op::Mem(51276,173825792),Op::Mask(b"X100100110001X000X11010X00001010X001"),Op::Mem(21071,3775434),Op::Mem(41466,601899),Op::Mem(29191,163888869),Op::Mem(64981,1094832),Op::Mem(36745,7560),Op::Mem(44434,3179),Op::Mem(5040,16142),Op::Mask(b"0X101X011XX011111111010100010X0X01X0"),Op::Mem(44140,22478),Op::Mem(26863,31310307),Op::Mem(56680,131716),Op::Mem(3983,22050),Op::Mask(b"1X0X10010X011X1X101X1000X1100X000010"),Op::Mem(45724,5130),Op::Mem(38747,147724),Op::Mem(39515,58764331),Op::Mask(b"0X001101X10000010X1X00010XX001010101"),Op::Mem(50201,65493),Op::Mem(44879,7688011),Op::Mem(29782,85876639),Op::Mem(63157,57556),Op::Mask(b"00X00001010111X010X1X01X0101X01010XX"),Op::Mem(37667,539),Op::Mem(65058,928398),Op::Mem(16037,2162946),Op::Mask(b"X010100000X11X001111001011011001XX11"),Op::Mem(20601,689238135),Op::Mem(62832,22132331),Op::Mem(20030,421255),Op::Mem(38454,4898563),Op::Mask(b"01101XX0000111X001111100011000X01111"),Op::Mem(40968,287372),Op::Mem(32860,121630361),Op::Mem(6956,54910),Op::Mask(b"01101001100X11X0010X0101101010001X11"),Op::Mem(52270,852273185),Op::Mem(44434,5773),Op::Mem(40591,363113),Op::Mem(31075,550),Op::Mem(1148,237482),Op::Mask(b"0110100000001100X111X111111010X00X10"),Op::Mem(9807,919),Op::Mem(10050,284353),Op::Mem(11553,99307),Op::Mask(b"11X1X0X0010001000101100X1XX10X100X10"),Op::Mem(51707,59769),Op::Mem(17916,456671254),Op::Mem(15968,74716184),Op::Mem(61681,11534),Op::Mask(b"0X0010010000110X01X1X111X001X111100X"),Op::Mem(63572,19584),Op::Mem(12382,54348210),Op::Mem(7204,62681),Op::Mem(58309,718),Op::Mask(b"XX0X0X11X0XX1100X10110111101X1000101"),Op::Mem(19172,49321),Op::Mem(3972,156574486),Op::Mem(53411,371993),Op::Mem(34118,1245490),Op::Mem(63786,28834),Op::Mem(44434,1679),Op::Mask(b"0X010XX1101111001101110X1X0X1X1000X0"),Op::Mem(65433,41829624),Op::Mem(5383,3874764),Op::Mem(58309,40586),Op::Mem(34516,1861),Op::Mask(b"0X00100X000X1100111X0011100010011100"),Op::Mem(30691,6349),Op::Mem(26045,2259746),Op::Mem(35285,2525303),Op::Mem(56918,64290918),Op::Mem(34521,495146),Op::Mem(41173,1892852),Op::Mem(62708,2610505),Op::Mask(b"X1001000010XX10001011X10101000011000"),Op::Mem(41877,606935473),Op::Mem(10746,30201),Op::Mem(7236,2402617),Op::Mem(31075,394149597),Op::Mem(62893,2808512),Op::Mem(44723,5738170),Op::Mem(61147,2124552),Op::Mask(b"01X0100X0X0X1100X1111X11X00X01X01001"),Op::Mem(9905,376),Op::Mem(56967,457904468),Op::Mem(55040,2448),Op::Mem(65513,2222),Op::Mem(25340,23079),Op::Mem(39876,4874),Op::Mem(38909,16667453),Op::Mask(b"X0001X0X01011110101X10XX1X1X10X01100"),Op::Mem(19488,3061762),Op::Mem(26132,292794),Op::Mask(b"010010X101X01001001110X000X1011X11X0"),Op::Mem(1980,12162025),Op::Mem(37165,15333747),Op::Mem(39210,152686),Op::Mask(b"01X010X0010XX100011110000X000XX00101"),Op::Mem(27917,944976),Op::Mem(25099,11114),Op::Mem(7777,577171),Op::Mem(27080,16334871),Op::Mem(14285,531),Op::Mask(b"X1X0100001X01100X10X1111100X00111010"),Op::Mem(28216,2511),Op::Mem(37165,7141),Op::Mem(55924,439753),Op::Mem(11901,464),Op::Mem(38571,407),Op::Mem(782,10823),Op::Mask(b"0XX00X01010111XX11111110XX010010000X"),Op::Mem(54749,360481),Op::Mem(20495,5280),Op::Mem(37684,6039),Op::Mem(6345,2073116),Op::Mem(63110,22301539),Op::Mask(b"X0X1010110111100110X1001100X1X100100"),Op::Mem(20722,9600365),Op::Mem(19084,76987),Op::Mem(23777,740859),Op::Mask(b"001X000111X01X000X11X000110111101100"),Op::Mem(27917,52797296),Op::Mem(57636,322),Op::Mem(11553,70582),Op::Mem(8605,30966411),Op::Mem(25394,812862),Op::Mem(48296,317),Op::Mem(60466,1411129),Op::Mask(b"X110000X0XXX11101111001X100110100000"),Op::Mem(33339,4981),Op::Mem(40073,5710720),Op::Mem(33814,13208),Op::Mem(14664,1950645),Op::Mem(35042,35994943),Op::Mask(b"10101000X0X1X0XXX1X1101011001100000X"),Op::Mem(61417,114327),Op::Mem(26863,706549),Op::Mem(5651,118955),Op::Mask(b"011X10000010110111X10111X1001100101X"),Op::Mem(7679,272716),Op::Mem(24077,12277996),Op::Mask(b"X11XX000010001X00X011X1111X001XX0000"),Op::Mem(46531,35092779),Op::Mem(1116,11777757),Op::Mem(5932,519743),Op::Mem(36187,318),Op::Mem(38758,718897339),Op::Mask(b"01001X0110001000X0010X010010X01000X0"),Op::Mem(31101,257),Op::Mem(39813,30972074),Op::Mem(23252,1761211),Op::Mask(b"0X10100X00X0110X1111X1111010X1001101"),Op::Mem(17132,2823025),Op::Mem(62368,442239906),Op::Mem(24553,339245),Op::Mem(64751,66303),Op::Mem(56967,870173),Op::Mem(15383,342572184),Op::Mem(1647,20517),Op::Mask(b"00001XX000X11X0011X110X110XX1X010101"),Op::Mem(16037,1478),Op::Mem(33316,30615219),Op::Mem(6729,209640491),Op::Mask(b"01001000X1X1X100X1110100000X1X011X01"),Op::Mem(62368,29355190),Op::Mem(48784,1522851),Op::Mem(26590,14698075),Op::Mask(b"0XX0X0011X00X0000X11011010011110X101"),Op::Mem(249,746),Op::Mem(11553,236505210),Op::Mem(38328,823888),Op::Mem(58433,125568672),Op::Mask(b"X000X0000101X1101X10110X000X00111100"),Op::Mem(37813,4058843),Op::Mem(32745,9417061),Op::Mask(b"000XX110001111X01XX1XX01X00111110100"),Op::Mem(22103,2397),Op::Mem(40229,47978173),Op::Mem(3477,14703),Op::Mem(8594,2471),Op::Mem(22603,44648051),Op::Mem(11340,25471),Op::Mask(b"000001X1010111001X11X1X1100XX0101X0X"),Op::Mem(41160,52),Op::Mem(2907,827),Op::Mem(15719,107392281),Op::Mem(43537,19084747),Op::Mem(53742,3326211),Op::Mem(46206,51870),Op::Mem(30694,6031208),Op::Mask(b"0X10100000011100111X11100010X1111X01"),Op::Mem(31885,3110667),Op::Mem(40041,30422),Op::Mask(b"00XX0XX101X111XX11X10111001101001000"),Op::Mem(2874,10110),Op::Mem(21776,28380745),Op::Mem(32004,7076),Op::Mem(9644,526),Op::Mask(b"011010110001X1000XX110X0X0110000X011"),Op::Mem(35281,4670),Op::Mem(7204,115940579),Op::Mem(58380,17616),Op::Mem(40735,46877007),Op::Mem(30986,20371),Op::Mask(b"0XX01001010010X100111010110001111X10"),Op::Mem(43046,2060276),Op::Mem(20743,553391345),Op::Mem(20821,3685352),Op::Mem(43943,39969),Op::Mask(b"0010100101010X0011XXX01XX100XXX11111"),Op::Mem(29261,60453),Op::Mem(63512,94339357),Op::Mem(34827,18871625),Op::Mem(52359,322200),Op::Mem(38003,25491),Op::Mem(24795,461240689),Op::Mask(b"0000010X01011100101X010100X1X1101010"),Op::Mem(26894,3512),Op::Mem(1023,9354),Op::Mask(b"11010XXX100011001101011X1111011001X1"),Op::Mem(45476,4571),Op::Mem(2838,7601404),Op::Mem(30540,187),Op::Mask(b"X1X01X01X000110001011X010X0111X01001"),Op::Mem(32944,381053),Op::Mem(63110,7479218),Op::Mem(59783,121082),Op::Mem(56918,1237706),Op::Mem(32355,472),Op::Mem(44080,131839645),Op::Mem(56680,38523)]; 4 | 5 | #[derive(Clone,Copy)] 6 | enum Op { 7 | Mem(usize, usize), 8 | Mask(&'static [u8]), 9 | } 10 | 11 | fn part_one() -> usize { 12 | let mut mem = HashMap::new(); 13 | let mut mask: &[u8] = b""; 14 | for &op in &INPUT { 15 | match op { 16 | Op::Mem(addr, mut v) => { 17 | for (i,c) in mask.iter().rev().enumerate() { 18 | match c { 19 | b'0' => v &= !(1 << i), 20 | b'1' => v |= 1 << i, 21 | _ => {} 22 | } 23 | } 24 | mem.insert(addr, v); 25 | } 26 | Op::Mask(m) => mask = m, 27 | } 28 | } 29 | mem.values().sum() 30 | } 31 | 32 | fn write( 33 | mem: &mut HashMap, 34 | mask: &[u8], 35 | v: usize, 36 | i: usize, 37 | addr: usize, 38 | ) { 39 | let bit = 1 << (35 - i); 40 | match mask.get(i) { 41 | Some(b'0') => write(mem, mask, v, i+1, addr), 42 | Some(b'1') => write(mem, mask, v, i+1, addr | bit), 43 | Some(b'X') => { 44 | write(mem, mask, v, i+1, addr); 45 | write(mem, mask, v, i+1, addr ^ bit); 46 | } 47 | _ => { mem.insert(addr,v); } 48 | } 49 | } 50 | 51 | fn part_two() -> usize { 52 | let mut mem = HashMap::new(); 53 | let mut mask: &[u8] = b""; 54 | for &op in &INPUT { 55 | match op { 56 | Op::Mem(addr, v) => write(&mut mem, mask, v, 0, addr), 57 | Op::Mask(m) => mask = m, 58 | } 59 | } 60 | mem.values().sum() 61 | } 62 | 63 | aoc2020::main! { 64 | (part_one(), part_two()) 65 | } 66 | -------------------------------------------------------------------------------- /src/bin/15.rs: -------------------------------------------------------------------------------- 1 | use std::collections::*; 2 | 3 | fn solve(target: u32) -> u32 { 4 | let mut seen = [9,19,1,6,0,5].iter() 5 | .enumerate() 6 | .map(|(i,&e)| (e, i as u32 + 1)) 7 | .collect::>(); 8 | (7..target).fold(4, |last, i| i - seen.insert(last, i).unwrap_or(i)) 9 | } 10 | 11 | aoc2020::main! { 12 | (solve(2020), solve(30_000_000)) 13 | } 14 | -------------------------------------------------------------------------------- /src/bin/16.rs: -------------------------------------------------------------------------------- 1 | use std::collections::*; 2 | use std::ops::RangeInclusive; 3 | 4 | static RULES: [Rule; 20] = [(25..=80, 90..=961),(41..=133, 148..=968),(48..=425, 451..=952),(25..=371, 384..=966),(49..=531, 546..=973),(45..=641, 656..=954),(43..=357, 364..=969),(40..=669, 689..=954),(40..=550, 570..=956),(49..=854, 863..=953),(48..=601, 614..=964),(27..=698, 715..=962),(38..=781, 800..=970),(47..=824, 842..=965),(45..=219, 241..=955),(47..=388, 401..=954),(42..=906, 919..=965),(40..=726, 733..=955),(27..=161, 174..=974),(48..=103, 110..=954)]; 5 | static MY_TICKET: Ticket = [181,131,61,67,151,59,113,101,79,53,71,193,179,103,149,157,127,97,73,191]; 6 | static TICKETS: [Ticket; 240] = [[522,420,365,200,585,386,904,206,275,61,185,273,550,686,352,338,294,695,503,718],[129,758,494,886,213,178,94,496,423,352,51,863,498,925,653,505,403,314,619,241],[125,766,123,196,205,847,379,480,268,887,546,62,114,209,766,248,501,696,575,76],[183,872,520,282,717,522,776,722,94,717,100,161,208,949,945,255,853,483,117,145],[283,101,290,751,617,334,885,633,767,417,733,887,192,595,62,329,688,187,736,458],[635,466,583,585,733,511,754,106,513,256,347,506,180,403,938,126,886,868,262,481],[895,166,885,272,621,205,739,724,809,777,890,345,303,764,347,253,320,114,750,517],[599,726,584,582,249,347,257,277,320,493,820,147,179,659,271,249,924,615,577,882],[821,422,630,696,938,361,487,895,692,936,160,691,155,332,195,928,357,100,62,122],[770,506,110,123,344,260,114,800,507,889,385,629,884,380,132,328,615,73,245,940],[117,78,800,219,292,527,468,844,872,366,348,410,770,927,314,586,130,621,573,610],[938,123,250,283,724,249,699,939,460,247,334,718,174,483,92,923,417,283,773,195],[698,758,174,364,898,871,74,417,770,203,763,889,510,943,58,425,812,519,63,170],[868,662,900,111,659,455,902,903,803,591,810,173,52,906,215,151,758,503,191,593],[657,161,748,66,331,802,635,411,820,815,746,939,665,923,501,800,53,596,816,680],[585,341,303,495,618,803,420,70,804,550,772,406,255,301,532,282,455,370,76,304],[814,743,411,368,737,868,900,881,418,127,201,407,419,271,321,848,739,24,120,151],[77,338,664,350,181,475,746,639,200,570,619,245,464,908,595,759,663,939,900,151],[639,632,769,8,111,509,155,588,865,324,881,306,587,845,718,205,270,526,265,780],[91,417,286,304,331,628,506,206,492,809,210,747,645,249,809,74,527,577,211,945],[617,739,197,877,774,938,660,747,768,424,695,154,634,324,507,729,503,812,264,895],[50,766,880,571,936,928,80,936,328,178,347,151,922,700,74,617,751,574,628,639],[548,267,850,815,593,627,115,596,764,466,313,68,128,103,263,876,728,282,769,463],[303,906,720,333,348,5,936,191,779,315,216,103,345,411,502,881,311,271,508,62],[895,801,411,804,724,636,118,306,495,632,593,863,729,894,128,270,466,500,510,179],[103,479,250,72,380,824,304,91,184,111,844,62,939,279,209,593,487,492,56,243],[902,617,186,938,483,842,451,213,598,330,241,266,321,854,866,57,695,631,521,545],[745,451,478,634,808,880,784,332,190,586,479,311,472,662,691,813,334,866,264,593],[161,938,725,894,889,285,895,766,78,894,531,780,129,338,987,593,100,813,457,110],[73,317,871,548,760,401,652,352,454,313,418,451,264,71,470,371,323,803,198,899],[417,749,550,177,771,944,813,520,153,760,486,518,488,992,151,753,298,261,280,191],[620,174,771,213,286,121,125,518,616,369,423,243,295,429,268,600,905,266,656,739],[252,93,948,658,473,312,757,314,364,311,882,247,761,500,914,772,690,101,694,875],[458,193,481,309,665,640,491,170,871,470,944,601,198,417,249,620,921,123,666,897],[516,932,506,619,433,726,863,103,762,459,843,194,690,53,573,77,69,158,823,505],[420,773,72,144,928,894,811,333,663,501,694,268,54,413,357,346,868,780,124,261],[488,739,348,635,516,4,269,297,91,201,882,470,460,920,875,418,91,250,277,501],[297,659,824,367,667,457,859,693,198,193,206,292,422,314,514,498,425,127,669,345],[472,466,246,201,755,85,848,804,873,357,800,598,763,592,884,201,496,574,573,264],[92,64,813,65,474,573,505,722,771,188,419,126,867,771,438,720,321,466,588,408],[900,816,866,636,814,317,316,846,9,205,252,54,334,275,181,288,252,691,667,286],[452,253,247,371,469,73,591,51,95,275,50,209,578,725,268,94,192,193,620,383],[948,941,695,939,787,923,869,805,206,267,273,197,820,925,263,101,697,76,219,870],[873,615,477,202,167,202,766,744,823,342,263,94,199,303,804,775,812,174,813,454],[98,319,284,485,209,457,251,866,549,643,183,178,582,866,278,189,592,694,320,943],[218,156,244,468,850,148,344,311,978,116,576,112,849,507,332,752,581,627,405,213],[484,96,517,74,104,253,326,886,628,882,116,526,803,667,770,80,324,306,471,289],[853,61,845,594,302,351,278,819,194,640,306,574,626,247,361,641,504,571,889,801],[405,809,293,243,879,819,215,73,184,695,462,127,198,102,860,813,204,615,245,804],[773,900,854,290,99,773,68,352,150,103,929,614,420,938,585,79,264,676,317,202],[636,666,721,446,67,571,119,97,927,742,262,411,155,591,658,636,747,53,348,201],[478,274,625,58,743,702,206,324,420,762,774,387,890,308,765,597,626,354,867,593],[357,356,290,771,944,758,581,638,701,781,461,131,406,571,482,764,158,187,121,411],[256,463,720,474,753,370,262,261,634,503,474,708,94,421,848,752,341,574,601,818],[202,922,550,670,155,100,275,57,418,769,115,807,768,523,664,579,343,299,407,151],[619,744,477,991,349,179,113,572,583,522,64,938,821,864,410,735,416,879,850,198],[95,728,725,928,588,531,129,578,451,520,722,177,769,206,97,197,660,507,945,127],[344,212,417,890,204,576,298,633,308,524,895,599,246,766,252,638,426,815,519,114],[461,477,130,369,202,520,298,920,505,542,892,203,890,176,487,813,767,640,387,115],[65,73,99,691,773,815,882,243,904,325,719,818,102,369,768,293,407,272,660,9],[204,524,290,761,484,504,351,571,419,778,632,926,577,266,351,735,715,139,808,807],[523,455,721,637,64,848,474,294,716,586,505,274,357,308,456,441,269,724,628,347],[178,666,880,151,94,842,891,591,753,404,885,618,720,86,195,65,281,110,949,851],[121,56,421,856,261,844,638,196,767,847,481,633,751,943,596,385,924,947,810,269],[318,205,415,334,118,571,133,277,323,935,321,278,209,874,184,173,323,176,461,365],[345,735,496,716,54,594,581,736,885,186,897,505,512,159,823,935,13,298,93,472],[724,366,640,207,316,383,632,656,930,493,153,474,905,65,923,765,207,520,339,177],[386,992,925,733,695,287,198,355,66,157,949,775,899,209,200,758,303,94,365,195],[323,186,282,352,638,448,940,181,50,60,473,71,259,308,191,870,293,854,320,739],[90,807,76,998,744,297,315,287,183,281,623,156,275,452,776,657,294,241,589,133],[475,401,508,924,615,206,195,727,616,500,845,131,180,742,577,657,275,118,600,615],[484,890,62,723,477,333,286,668,51,658,62,536,296,807,755,821,931,804,869,639],[351,411,745,355,253,522,944,719,301,813,510,330,69,513,171,101,929,469,347,477],[721,269,206,807,453,897,823,150,200,547,280,70,853,179,839,124,806,586,256,272],[186,942,18,531,587,119,722,906,93,876,353,210,344,496,364,847,150,750,946,802],[630,424,129,808,102,290,742,417,110,580,301,212,804,527,345,94,711,148,633,197],[641,666,640,110,508,351,110,100,345,263,80,77,204,537,751,902,876,691,455,201],[800,939,498,271,122,736,147,615,78,325,300,156,851,242,599,845,946,481,131,717],[118,188,882,349,531,341,200,279,63,776,724,174,7,628,245,574,150,864,148,750],[245,461,210,366,364,461,368,75,669,341,595,127,633,729,619,580,755,938,416,573],[779,191,659,628,259,525,488,735,883,85,185,506,640,371,735,201,354,627,494,846],[616,194,482,589,249,630,278,781,404,470,660,127,403,751,894,740,308,539,739,488],[823,645,507,371,54,733,60,590,271,662,657,508,187,716,301,131,454,272,214,65],[751,522,321,526,85,423,871,656,806,876,190,591,352,211,150,506,816,248,150,522],[821,177,689,490,656,850,390,279,194,127,302,824,412,690,75,186,817,284,661,279],[154,243,126,735,180,926,823,622,692,741,940,778,620,984,328,499,281,779,531,743],[458,276,193,508,206,414,60,770,183,150,893,813,475,121,605,66,485,99,800,885],[621,919,59,65,360,182,717,371,824,919,764,931,341,757,58,639,263,91,205,632],[325,59,161,515,125,508,571,760,351,127,20,317,666,943,804,493,816,177,482,929],[723,476,740,844,701,622,736,806,193,658,119,290,292,54,346,851,756,473,818,51],[693,527,6,932,413,694,103,282,291,809,887,721,665,894,863,306,129,587,338,157],[873,872,474,404,716,289,322,939,474,371,601,199,776,66,919,499,597,879,342,426],[870,570,79,607,411,405,627,757,863,515,892,944,193,339,202,872,926,288,178,596],[79,288,801,942,859,657,801,902,333,186,600,875,497,476,365,878,487,578,344,289],[751,723,919,209,185,586,758,534,310,631,211,810,57,940,158,157,159,254,150,71],[516,823,185,526,75,60,949,295,580,505,254,128,504,104,617,923,694,949,308,334],[758,574,495,868,338,588,342,491,355,601,323,500,497,337,791,802,519,204,745,905],[175,623,271,744,419,306,575,501,720,868,20,202,464,52,197,737,627,199,423,824],[634,100,948,656,244,407,905,178,579,292,800,177,191,315,728,723,621,71,596,889],[621,422,274,770,637,648,601,80,484,53,216,332,659,318,455,98,919,211,694,215],[583,156,348,935,511,773,193,69,112,383,719,94,407,299,179,716,853,354,370,504],[486,761,597,531,763,845,581,97,406,849,526,257,8,516,370,849,410,884,628,265],[723,176,895,457,596,525,366,743,897,371,496,188,320,364,302,57,807,296,986,883],[937,750,75,110,195,904,275,668,805,388,419,468,576,806,476,637,208,115,61,911],[893,672,306,178,898,697,330,407,663,937,296,770,762,364,905,322,204,114,252,250],[732,402,298,210,277,920,343,577,388,598,591,55,343,310,116,153,265,482,212,512],[351,937,889,70,491,269,321,693,594,256,366,331,219,250,196,487,876,632,732,940],[270,301,334,618,948,763,363,317,571,632,474,944,621,50,810,692,843,179,334,472],[822,498,933,599,292,407,873,692,617,404,692,697,882,718,926,770,592,413,980,693],[388,746,726,404,767,268,849,458,13,348,451,364,596,882,188,352,581,497,347,935],[846,521,193,813,158,519,840,386,277,735,253,179,116,599,388,850,812,628,599,940],[814,159,524,241,767,453,472,113,133,150,178,175,591,214,52,648,621,78,406,64],[508,890,843,269,697,508,604,905,666,516,947,929,891,926,283,68,806,406,494,454],[177,590,53,846,79,915,320,313,579,194,75,506,452,190,896,71,69,776,885,201],[756,713,402,103,467,409,421,424,933,921,55,345,418,753,454,148,121,735,206,402],[185,470,762,215,624,212,742,206,734,508,22,52,499,471,348,513,821,801,410,599],[522,874,750,368,588,767,308,486,256,75,510,720,275,794,324,345,178,500,656,71],[123,364,124,276,549,937,194,131,877,175,623,981,251,404,657,181,745,738,779,507],[734,813,388,872,887,461,78,469,411,878,209,445,460,320,847,851,809,261,522,274],[526,181,582,788,216,582,726,619,129,183,254,59,779,58,307,522,253,350,689,101],[985,367,318,290,937,500,509,115,91,310,326,663,251,415,255,881,368,54,284,778],[621,874,520,886,366,493,337,768,863,452,490,297,504,520,683,748,299,588,53,451],[774,854,633,131,780,55,285,419,322,91,618,178,550,596,501,690,698,666,149,783],[693,148,346,527,521,619,718,413,322,305,717,633,900,499,595,9,326,313,320,102],[809,497,771,94,192,494,809,9,601,92,925,638,695,311,258,411,133,629,940,572],[317,293,949,816,740,727,738,755,927,90,285,824,290,188,898,218,810,583,261,206],[500,333,294,501,620,253,212,774,266,156,528,812,178,339,312,884,383,264,638,401],[871,199,734,387,406,77,817,195,124,258,621,571,299,202,622,250,761,712,198,207],[260,313,205,383,218,460,124,812,843,626,921,193,531,495,254,157,927,351,491,388],[213,943,410,666,925,939,370,150,404,443,324,878,55,876,930,887,940,742,306,510],[529,333,892,801,598,294,777,323,200,263,934,219,189,697,288,51,742,996,212,637],[658,417,922,899,891,119,458,121,492,142,263,76,813,91,477,811,56,528,773,823],[805,630,201,465,599,345,513,256,921,267,63,410,631,866,382,498,926,499,465,634],[274,768,414,457,156,516,898,273,579,490,929,744,932,141,251,697,587,130,933,933],[182,410,530,516,366,329,273,280,696,736,277,478,719,62,258,637,620,280,130,862],[271,272,505,148,764,163,512,128,871,112,921,745,112,817,622,291,759,129,195,314],[349,345,901,365,283,621,53,897,67,345,287,985,740,822,898,274,80,583,116,894],[615,503,847,204,309,637,467,943,891,491,879,408,781,77,414,98,331,162,598,760],[321,332,601,244,920,765,523,891,469,471,263,183,119,521,212,854,600,817,9,750],[719,773,473,201,71,341,411,824,479,715,453,766,188,507,582,175,982,264,300,737],[745,899,734,922,526,514,453,433,863,695,364,490,661,766,820,194,187,403,547,460],[455,93,595,53,467,885,213,948,287,744,931,632,134,92,405,634,192,264,313,641],[669,816,895,217,335,149,665,260,842,69,872,328,123,347,115,863,285,316,978,370],[304,813,758,890,666,587,557,208,546,716,259,325,894,201,287,68,258,627,497,723],[69,411,686,252,368,630,319,744,459,482,425,932,624,638,206,261,813,528,691,466],[258,279,169,128,110,263,496,617,264,842,531,852,256,332,625,481,596,331,867,114],[757,669,729,669,341,277,586,122,668,98,349,384,476,767,752,571,573,510,338,665],[112,630,387,904,134,96,494,302,504,750,366,276,512,484,334,120,630,582,809,615],[756,411,470,474,755,573,583,517,599,739,206,589,818,811,564,531,337,854,937,585],[521,68,848,466,312,877,91,467,753,594,201,514,846,575,458,282,173,694,96,901],[736,344,884,844,385,214,906,355,635,900,656,872,324,550,106,470,906,948,60,503],[570,691,699,748,342,462,193,308,290,632,55,716,472,847,865,415,759,503,69,367],[77,279,295,455,726,519,727,740,524,627,734,94,579,589,752,324,904,274,570,772],[571,79,156,764,505,946,150,358,416,920,867,284,939,725,204,121,249,190,265,349],[811,921,924,749,668,534,205,631,548,889,745,280,853,546,948,158,477,578,823,341],[521,631,929,772,495,742,266,710,864,218,770,176,66,94,635,875,767,199,510,949],[578,121,469,875,132,422,614,495,246,593,460,548,745,338,919,709,817,817,334,774],[125,124,546,493,746,91,105,929,769,101,848,800,475,716,521,849,626,243,301,53],[402,341,254,361,76,365,255,345,877,635,741,156,940,755,470,513,472,263,150,883],[595,122,202,107,242,129,755,120,354,767,251,740,334,749,212,820,823,822,504,284],[66,196,876,451,634,288,257,83,498,75,738,848,300,637,721,403,121,364,213,906],[770,314,890,591,865,456,661,250,306,328,211,640,111,74,601,989,531,625,726,903],[768,883,524,578,493,866,987,845,945,595,266,292,479,366,633,724,640,876,697,903],[52,413,423,319,510,503,423,742,481,627,895,197,169,251,193,454,893,174,150,822],[599,425,51,648,364,752,246,204,194,735,937,746,353,500,55,656,518,598,476,592],[637,722,845,634,309,656,818,151,620,251,477,698,530,73,771,721,667,646,275,304],[201,218,473,760,723,178,580,373,512,755,410,348,473,69,906,753,343,847,618,813],[596,582,504,592,949,269,77,809,274,56,308,478,865,358,386,486,62,286,76,323],[347,874,498,355,816,881,738,276,987,386,248,927,516,800,661,583,412,132,262,337],[314,384,474,464,55,881,527,601,749,928,405,695,672,484,631,250,207,272,244,218],[625,119,769,461,280,109,477,297,738,203,342,495,314,150,496,401,889,697,481,180],[79,323,404,470,596,196,473,403,627,454,323,348,689,736,767,749,810,117,660,654],[522,407,814,81,408,735,454,495,182,471,691,126,949,868,597,342,853,408,733,350],[663,980,894,64,62,808,719,112,352,326,69,311,660,303,657,246,901,348,324,530],[947,267,153,893,186,418,415,524,211,102,668,595,774,343,887,94,666,427,187,490],[183,802,205,154,18,926,626,158,771,629,624,270,849,408,589,577,344,332,317,733],[875,95,423,853,588,466,58,570,120,630,599,687,484,53,930,110,96,749,748,657],[257,420,266,501,659,662,641,401,464,884,69,697,269,124,87,808,291,814,160,666],[320,942,186,942,420,76,627,319,289,634,183,132,56,52,990,201,923,266,276,549],[478,310,453,486,496,210,667,983,451,202,523,742,336,581,267,735,56,501,925,313],[487,733,289,334,672,456,570,67,385,402,853,528,501,656,454,809,200,412,760,761],[619,161,582,407,485,487,925,846,128,113,590,600,159,878,925,203,594,728,387,733],[177,492,111,97,541,111,721,414,696,96,187,198,875,636,413,496,90,506,634,622],[661,584,123,187,297,718,263,340,421,297,364,580,735,642,737,477,920,491,297,726],[509,310,781,717,285,182,773,320,595,619,723,583,718,998,295,905,184,188,118,760],[277,247,897,120,365,219,252,269,464,54,291,628,270,887,926,315,0,318,196,753],[325,664,63,526,283,632,761,326,185,54,252,584,810,60,501,180,775,505,201,104],[203,585,76,889,351,53,672,123,750,884,452,871,262,526,344,368,864,252,483,174],[204,496,202,186,276,850,130,148,730,60,722,364,852,823,131,692,185,519,528,927],[473,845,807,904,330,944,172,294,425,203,760,494,754,371,371,756,385,158,203,815],[886,261,804,457,876,680,903,323,386,79,357,505,689,192,889,546,293,462,458,697],[490,122,336,628,462,717,271,749,128,873,947,219,51,180,368,928,647,622,809,758],[209,301,693,268,402,205,850,511,156,641,251,343,328,757,850,179,669,592,125,727],[765,581,663,218,634,689,663,209,898,527,151,86,508,852,843,571,630,345,824,284],[156,660,219,880,516,529,487,128,284,630,211,729,314,589,621,886,114,254,502,98],[756,634,149,120,739,975,131,479,300,515,615,129,192,762,130,767,474,371,216,175],[129,251,219,853,214,580,210,137,325,770,305,669,627,58,496,295,324,524,311,112],[490,466,479,664,593,176,808,587,876,731,866,623,350,333,298,284,585,932,258,657],[206,488,461,162,457,124,212,853,802,743,126,342,583,313,576,339,870,478,940,80],[906,640,942,330,90,159,317,424,329,801,482,153,697,525,891,697,73,724,191,359],[401,313,878,294,384,531,917,506,156,369,622,766,54,329,280,850,71,341,938,668],[326,495,321,669,756,882,775,664,849,932,387,354,823,515,817,132,15,776,64,942],[474,404,659,250,496,614,631,528,639,820,847,259,930,93,661,136,581,582,689,884],[97,413,460,570,151,113,942,465,576,846,574,301,101,300,133,255,744,347,477,706],[423,530,500,251,600,504,899,767,751,735,425,407,747,292,135,322,843,424,819,757],[286,499,269,402,495,405,451,690,69,92,156,261,709,110,349,616,550,347,276,667],[157,717,150,880,805,484,178,615,949,872,622,653,59,870,473,657,694,696,818,298],[663,341,366,811,71,627,211,459,633,578,501,920,658,893,249,525,996,812,76,888],[413,863,278,717,728,369,800,626,871,402,842,75,175,501,724,641,774,206,756,882],[129,112,343,574,667,484,889,681,875,588,938,285,470,337,885,160,849,309,310,549],[760,300,802,284,624,847,266,760,499,95,98,106,212,480,667,260,409,325,744,503],[344,851,928,694,482,218,439,263,890,810,482,341,771,570,949,938,773,268,885,547],[246,512,591,190,740,357,545,904,851,65,581,507,574,803,336,326,346,803,249,475],[588,816,178,885,253,757,334,158,686,810,527,200,314,451,97,126,493,583,668,935],[355,589,498,126,182,264,734,304,890,487,919,999,297,346,928,876,531,948,633,420],[818,930,402,526,854,271,408,948,748,473,759,297,722,715,290,56,627,382,330,419],[128,822,619,196,869,802,697,183,405,384,202,470,209,341,712,57,322,346,846,285],[97,844,819,150,495,270,904,508,218,573,458,120,823,167,658,406,938,772,772,208],[578,350,932,936,268,464,807,258,598,706,766,66,250,265,878,319,741,388,365,574],[600,478,897,475,473,899,586,822,738,720,202,598,156,522,325,683,769,254,124,112],[519,843,850,384,177,146,157,122,64,124,871,514,895,779,157,808,346,286,244,124],[498,775,75,852,571,249,467,249,692,816,621,620,276,184,423,369,848,547,747,85],[124,938,457,773,644,854,256,822,60,480,317,76,504,751,751,530,781,285,764,323],[801,781,110,354,918,411,633,752,583,335,668,504,803,118,482,199,58,498,756,456],[294,820,600,545,257,176,186,262,482,125,893,241,662,747,352,853,324,250,592,253],[698,307,745,303,411,249,356,154,737,282,736,374,124,751,667,808,665,195,625,299],[696,60,778,736,617,817,871,981,578,384,202,270,70,295,351,852,346,248,318,339],[204,499,635,287,125,308,75,863,189,675,155,417,353,547,319,219,769,111,468,292],[249,624,59,701,283,256,280,280,293,217,414,407,419,262,127,516,872,866,667,620],[570,735,944,728,615,467,546,122,763,356,50,214,515,265,530,748,596,256,66,635],[98,161,525,69,583,663,112,653,599,423,527,817,741,778,454,664,284,664,872,525],[803,781,760,259,56,520,666,244,724,821,719,9,721,719,813,618,816,744,941,248],[869,923,312,388,937,213,86,319,770,743,693,847,283,469,806,419,947,186,279,513],[453,340,342,746,245,284,339,847,214,597,692,845,598,244,452,114,139,854,752,62],[757,186,207,250,510,151,928,256,419,757,690,321,824,127,306,823,199,630,874,828],[270,127,339,311,70,349,513,458,286,996,305,721,152,473,570,161,460,299,356,261],[411,286,852,916,763,854,412,312,842,113,345,258,289,346,869,256,453,929,468,161],[462,120,847,638,868,316,583,404,403,168,193,175,213,721,184,349,364,217,775,880],[933,266,195,584,902,322,338,930,987,494,306,309,182,150,421,870,307,100,761,304],[744,515,822,903,633,639,883,257,945,943,666,156,353,878,155,198,518,930,707,753]]; 7 | 8 | type Rule = (RangeInclusive, RangeInclusive); 9 | type Ticket = [usize; 20]; 10 | 11 | fn fits_rule((r1,r2): &Rule, v: usize) -> bool { 12 | r1.contains(&v) || r2.contains(&v) 13 | } 14 | 15 | fn part_one() -> (usize, Vec<&'static Ticket>) { 16 | let mut ans = 0; 17 | let mut tickets = Vec::new(); 18 | tickets.push(&MY_TICKET); 19 | for t in &TICKETS { 20 | match t.iter().find(|&&v| RULES.iter().all(|r| !fits_rule(r,v))) { 21 | Some(v) => ans += v, 22 | None => tickets.push(t), 23 | } 24 | } 25 | (ans, tickets) 26 | } 27 | 28 | fn get_possible_rules(tickets: &[&Ticket]) -> Vec> { 29 | (0..20).map(|i| 30 | (0..20).filter(|&j| 31 | tickets.iter().all(|t| fits_rule(&RULES[j], t[i])) 32 | ).collect() 33 | ).collect() 34 | } 35 | 36 | fn part_two(tickets: &[&Ticket]) -> usize { 37 | let mut possible_rules = get_possible_rules(&tickets); 38 | let mut assigned_rules = [0; 20]; 39 | while let Some(i) = possible_rules.iter().position(|s| s.len() == 1) { 40 | let v = *possible_rules[i].iter().next().unwrap(); 41 | assigned_rules[i] = v; 42 | for s in &mut possible_rules { s.remove(&v); } 43 | } 44 | assigned_rules.iter() 45 | .enumerate() 46 | .filter(|(_,&rule)| rule < 6) 47 | .map(|(i,_)| MY_TICKET[i]) 48 | .product() 49 | } 50 | 51 | aoc2020::main! { 52 | let (p1, tickets) = part_one(); 53 | let p2 = part_two(&tickets); 54 | (p1, p2) 55 | } 56 | -------------------------------------------------------------------------------- /src/bin/17.rs: -------------------------------------------------------------------------------- 1 | use std::collections::*; 2 | use std::hash::Hash; 3 | 4 | static INPUT: [&str; 8] = [ 5 | "#####...", 6 | ".#..##..", 7 | "##.##.##", 8 | "...####.", 9 | "#.#...##", 10 | ".##...#.", 11 | ".#.#.###", 12 | "#.#.#..#", 13 | ]; 14 | 15 | static NEIGHBOURS: [(i8,i8,i8,i8); 80] = [ 16 | (-1,-1,-1,-1), (-1,-1,-1, 0), (-1,-1,-1, 1), 17 | (-1,-1, 0,-1), (-1,-1, 0, 0), (-1,-1, 0, 1), 18 | (-1,-1, 1,-1), (-1,-1, 1, 0), (-1,-1, 1, 1), 19 | (-1, 0,-1,-1), (-1, 0,-1, 0), (-1, 0,-1, 1), 20 | (-1, 0, 0,-1), (-1, 0, 0, 0), (-1, 0, 0, 1), 21 | (-1, 0, 1,-1), (-1, 0, 1, 0), (-1, 0, 1, 1), 22 | (-1, 1,-1,-1), (-1, 1,-1, 0), (-1, 1,-1, 1), 23 | (-1, 1, 0,-1), (-1, 1, 0, 0), (-1, 1, 0, 1), 24 | (-1, 1, 1,-1), (-1, 1, 1, 0), (-1, 1, 1, 1), 25 | ( 0,-1,-1,-1), ( 0,-1,-1, 0), ( 0,-1,-1, 1), 26 | ( 0,-1, 0,-1), ( 0,-1, 0, 0), ( 0,-1, 0, 1), 27 | ( 0,-1, 1,-1), ( 0,-1, 1, 0), ( 0,-1, 1, 1), 28 | ( 0, 0,-1,-1), ( 0, 0,-1, 0), ( 0, 0,-1, 1), 29 | ( 0, 0, 0,-1), ( 0, 0, 0, 1), 30 | ( 0, 0, 1,-1), ( 0, 0, 1, 0), ( 0, 0, 1, 1), 31 | ( 0, 1,-1,-1), ( 0, 1,-1, 0), ( 0, 1,-1, 1), 32 | ( 0, 1, 0,-1), ( 0, 1, 0, 0), ( 0, 1, 0, 1), 33 | ( 0, 1, 1,-1), ( 0, 1, 1, 0), ( 0, 1, 1, 1), 34 | ( 1,-1,-1,-1), ( 1,-1,-1, 0), ( 1,-1,-1, 1), 35 | ( 1,-1, 0,-1), ( 1,-1, 0, 0), ( 1,-1, 0, 1), 36 | ( 1,-1, 1,-1), ( 1,-1, 1, 0), ( 1,-1, 1, 1), 37 | ( 1, 0,-1,-1), ( 1, 0,-1, 0), ( 1, 0,-1, 1), 38 | ( 1, 0, 0,-1), ( 1, 0, 0, 0), ( 1, 0, 0, 1), 39 | ( 1, 0, 1,-1), ( 1, 0, 1, 0), ( 1, 0, 1, 1), 40 | ( 1, 1,-1,-1), ( 1, 1,-1, 0), ( 1, 1,-1, 1), 41 | ( 1, 1, 0,-1), ( 1, 1, 0, 0), ( 1, 1, 0, 1), 42 | ( 1, 1, 1,-1), ( 1, 1, 1, 0), ( 1, 1, 1, 1), 43 | ]; 44 | 45 | fn simulate) -> HashMap>( 46 | mut active: HashSet, 47 | count_neighbours: F, 48 | ) -> usize { 49 | for _ in 0..6 { 50 | active = count_neighbours(&active).iter() 51 | .filter(|&(pos,&n)| n == 3 || (n == 2 && active.contains(pos))) 52 | .map(|(&pos,_)| pos) 53 | .collect(); 54 | } 55 | active.len() 56 | } 57 | 58 | fn count_neighbours_p1(active: &HashSet<(i8,i8,i8)>) -> HashMap<(i8,i8,i8), usize> { 59 | let mut neighbours = HashMap::new(); 60 | for (x,y,z) in active { 61 | for (_,dx,dy,dz) in &NEIGHBOURS[26..52] { 62 | *neighbours.entry((x+dx, y+dy, z+dz)).or_insert(0) += 1; 63 | } 64 | } 65 | neighbours 66 | } 67 | 68 | fn count_neighbours_p2(active: &HashSet<(i8,i8,i8,i8)>) -> HashMap<(i8,i8,i8,i8), usize> { 69 | let mut neighbours = HashMap::new(); 70 | for (x,y,z,w) in active { 71 | for (dx,dy,dz,dw) in &NEIGHBOURS { 72 | *neighbours.entry((x+dx, y+dy, z+dz, w+dw)).or_insert(0) += 1; 73 | } 74 | } 75 | neighbours 76 | } 77 | 78 | aoc2020::main! { 79 | let active1 = INPUT.iter() 80 | .enumerate() 81 | .flat_map(|(y, row)| row.chars() 82 | .enumerate() 83 | .filter(|&(_,b)| b == '#') 84 | .map(move |(x,_)| (x as i8, y as i8, 0)) 85 | ) 86 | .collect::>(); 87 | let active2 = active1.iter() 88 | .map(|&(x,y,z)| (x,y,z,0)) 89 | .collect(); 90 | let p1 = simulate(active1, count_neighbours_p1); 91 | let p2 = simulate(active2, count_neighbours_p2); 92 | (p1, p2) 93 | } 94 | -------------------------------------------------------------------------------- /src/bin/18.rs: -------------------------------------------------------------------------------- 1 | static INPUT: [&[u8]; 375] = [b"9 * 7 + ((6 + 9 * 2 + 6 + 7 + 5) * (5 + 9 + 7) * 6) * (4 + 8) + 5 * 8",b"3 * (4 * 9 + 8 + 4 * 4 + 7) + 7 * (8 * 9)",b"4 * ((6 * 5 * 9) + 2) + 9 * 4",b"((4 * 6 * 2 * 9) + 7 * 4) + 4 * 6 + 5 * 6 + 6",b"9 * 8 * ((5 + 7 * 8 * 2) * 6) + 3",b"6 + (3 * 7) * 3 + (9 * (6 * 6 + 5 + 9 + 9) * 7 * 9 + (4 * 8) + 8)",b"6 * 4 + 2 + 8 + 7",b"(5 * (9 * 8) * 6) + 2 + 8 * 5 * 4 * 3",b"(3 + 2 * 2 * 8 * 5) + (7 + 6 * 4 * 8) * (6 * 9 * 5 * 9)",b"(4 * 2 + (9 + 2 * 4) * 5 + 9) + (9 * 3)",b"7 * 6 + 6",b"4 + (8 + (5 * 9) + 9 * 8)",b"9 + 8 + 5 + 4 * 2 * 9",b"8 * (5 + (8 + 2) * 9 + 4 + 7) + 8",b"2 * 2 + 9 * 6 + (2 * (8 * 2 + 3 * 8) * (9 + 7 * 4 * 8 * 2)) * 2",b"4 + (5 * 6 + 7 * 5) + 4",b"4 + (9 * 4) + 4 * (4 + 7 + 9 * 4) * 3",b"(4 * (2 + 2) * 9 * 8 * 3) + 9 * 3",b"6 * (5 * 3 + 4 + (4 + 4 + 5 * 7 * 4)) * 4",b"8 * (6 * 9 + 3 * (6 * 6 * 2) + 4 + 9) * (4 * 8 * (9 * 4 + 8 + 7 * 7) * 5) + 4 + 7",b"(7 * 3 * 2) + 3 + 8 * (5 + 7 * 3 + 4 * 2 * (8 + 6 * 4)) * 3 * (8 + 9 + 7 * 3 * 3)",b"8 * 7 + 4 + 7 * (3 * 3 + 7 + (3 * 5 * 8 + 8 + 3 * 4))",b"(7 * (4 * 3 + 8 * 7 * 3 + 9) * 4 + (4 * 7)) * 8 + ((2 * 9) + 6 * 7 + (9 + 3) * 5 + 2) * 8 + 6",b"6 + 8 * (7 * (5 + 3 + 8 * 5 + 2 * 7) * 4 + 2 + 7 + 7)",b"(6 * 3 * 7) * 7 * (7 * 7 * 9) + 8",b"((8 * 7 + 2 + 3) * 4) + 4 * 7 * 6 + 5",b"2 * 5 * 4 * 9 + ((2 * 4 * 4) + 4 * (5 + 4))",b"((3 + 5 * 5) + (5 * 9 + 5)) * 3",b"8 * (3 * (9 * 3 * 9) + 3 + 5) * 2",b"4 * (8 * 9 * 7 * 2 + 3) + ((9 * 8) * 9) * (4 * 5 + 6 * 8) * 3",b"(5 + 2 * 9 + 5 + 8) + 9 + 6 * 2",b"(5 * 9 + 9 + 3 + (5 + 9 + 4 + 3)) + 8 * 7",b"(7 + 7 * 2 + 8) * (2 * 4 + 3 * 4) + 5 * 4",b"3 + (4 + 6) + 8 * 5",b"(6 + 5 * (8 + 2 + 6) * (2 + 9)) * ((3 + 2 * 8 + 4 * 9 * 3) * 6 * 9)",b"9 + (5 * (2 + 2 * 2) + 5 * 8) * 7 + 3 + 9",b"2 + 8 * ((2 + 2) * 2 + 4 * 3 + 3) * 5",b"(2 + 5 * 3 * (4 * 3 + 8 + 6) + 6) + ((7 + 9) + 4 * 3) + 6 * 9",b"(8 + 7 * (8 + 3 * 7 + 4 + 7) + (5 + 6)) + 4 * (9 * 2 + (8 + 7 * 4 * 6 + 3) + 7 + 2) + (3 * (2 + 2 * 3))",b"(3 * 6 * 4 * 8 + 4) + 6 + 3 * 3 + 4",b"8 + ((6 * 2) + 6 * (8 + 5 * 2 * 2 * 9 + 8)) * 5 * 7",b"7 + 3 + 5 + ((3 + 8 + 2) * 5 * 9 * 4 * 9 + 5)",b"4 * 5 * (8 + 6)",b"9 * 7 * 4 + (4 + 5) * 4",b"9 + 6 + (8 * 5 * (3 + 2 * 7 + 2 + 2 + 9) + 8 * (8 * 5 + 5 * 5 * 3 * 7) * (5 * 3 + 8 + 7 * 4)) + 7 + 2 * 5",b"6 + ((2 * 3 + 9 * 8 * 8) + 6 * (5 * 5)) * 2 + 3 * (2 + (7 * 8 * 9 * 4 + 7 * 3) * 2 * 7 * (7 + 3 + 2 * 7 + 9 + 2)) + (3 * 9 + 2 * 8 * 4 * 2)",b"(7 * 4) * 2 + 7 + 2 + 3",b"(5 + 6 + 8) + 8 + 3 + (5 + 8 * 5 + 5 + 8) + 3",b"2 * (6 * (3 + 5)) + 4 + (3 + 9 * 5 + 8 + (6 + 4 + 2 + 2 * 2 * 4)) * 3 + 8",b"(2 + 7 + 3) + 7 + 2 + 6 * (6 * (4 + 7 * 8 * 5)) * 4",b"7 * 5 + 3 + 3",b"4 * (2 + 3 + 5) * 2 * 3",b"(8 * 8 + (7 * 4 * 6 * 6 + 2 * 6) + (8 + 6 + 2) * 7 * 8) + (3 * (8 + 9 + 6) + 4 * 7) + 5 * 8",b"(7 * 8 * 2 + 3 * 9) * ((4 * 4 + 5) + (6 + 4 + 9 + 5) + 3 * 2 * (2 + 5 * 7)) + 4 + 8 * ((8 * 8 + 5 * 4 * 3 + 4) * 5 + 4 * 4 + 4 + 7)",b"(9 + 8 + (4 + 2 * 9) + 7 + 7) + 7 * 8",b"(3 * 5 + (7 + 5 * 2 + 2)) * 4",b"(5 + 8) * 6 + (6 + (7 + 4 + 3 + 2 + 6 + 9))",b"4 * 2 + 2 + 9 + 3 + (2 * 6 * (2 * 2 * 8) + 6 * (3 + 2 * 3 * 4 + 9) * 7)",b"(7 + (9 + 8 + 6 * 6 * 2)) + 6 * (8 * 9 * (5 * 7 + 6 + 3)) + 4",b"(3 * (9 + 2) + 6 + 6) + 4 * 4 * 4 * 7",b"4 * 4 + 6 * 3 * 2 * 7",b"3 + (7 + 3 + (4 + 4 * 3 + 5 + 4) * 9 + (2 + 5 + 7 * 7 * 2) * 4)",b"5 * (3 * 6 * (7 + 2 * 2) + 7 + 7) + (2 + 7 + 3 * 7 * 6) + 3 * 4 + 4",b"2 * 4 * 2 * (8 * (7 * 7) * 7 * (2 * 8 + 7)) + 5",b"4 + 6 + (8 * 9 + 4 + 8 + 4) * 3",b"5 * 9 * 9 + 4 + 2 + (3 + (5 + 9))",b"(9 + 8 + (6 * 5 + 7 * 5 * 4) + (6 + 7 * 2 + 8 + 6)) * 4 + 8 * 6 + 8",b"7 * 2 + ((7 + 3 * 7 * 7 * 2) * (9 * 9 * 8 + 7) * (7 + 9 * 4 * 2 + 3) + 6) * 6",b"8 * 4 + 9 + 7 * (6 + 9)",b"6 + 3 + 3 * 7 + ((8 + 9) * 4) * 6",b"7 + 6 * (2 * (6 + 7) * (8 * 6)) + 5 + 7",b"7 * (5 + 9 * 6 * 5) * 7 + 6 * 2 * 2",b"7 * 3 * (2 + (9 + 3 * 6) + 8 * (9 * 2 * 2 + 2) * 3 * 5)",b"6 + 5 * 7 * 9 * (8 * 2 * 6 * 5 + 9 * 6) * 2",b"5 * 3 + (8 * (9 + 3 * 2 + 9 * 4) * 2 * 7) + 2 * (2 + 8 * 6 + 5 + 7 * 3)",b"9 * 4 * (6 + (2 + 6 + 4 + 2 * 5) * 8 + 2 + 8) + 4 * 3 * (9 + 8)",b"3 * 6 + 9 + 6 * 3 + (7 + 7 * 2)",b"7 * (8 + (3 + 9 * 3) * 3 + 2 + 9 * 5) + (3 + (3 + 3 + 8 * 9))",b"2 * 2 * ((3 * 6) + 7 + 2 * (9 + 8 * 3 * 6) + 5) * (4 + (2 * 2 + 8 + 8 + 6 + 4) + (7 * 2 * 2 + 9 * 8 + 8) + 9 + 3)",b"(7 + 2 * 8 * 3) + 9",b"8 * 8 + (9 + 2 + 3 + 2)",b"(3 + 2 * 4 * 6 * 3) + 7",b"8 * 4 * 3 + (7 + 5 + 6 * 5 * 6) + 9",b"(2 * 3) + (8 * 2 * (6 * 3) * 5) * ((7 * 9 + 4 * 4) + 2 * (4 * 9 + 3) + 9 * (5 * 5) * 4)",b"2 + 6 * (3 + 5 * 7) * 2",b"(6 + (3 + 4) * 6 * 8) + 8",b"8 * 5 * 2 + (7 * (5 + 3 + 4 + 4) * 4 + 9)",b"5 * 9 * (5 + 8 + 9 * (2 + 7 * 2 * 6)) * 9",b"(5 + 9 * (6 * 7 + 9 + 6 * 8) * 8) * (3 + 7 + 2) * 2 + (9 + 6 * 4 * (9 * 3 * 4) * 5 * (7 * 4 + 3)) * 8",b"7 * 3 * 7 * 3 * ((3 + 2 * 9) + 6 * (3 * 2) + 4)",b"7 + 4 * (7 + 9 * 8) * 7 * 5 + 7",b"(7 + 9 * (2 + 4 * 9 * 4 * 7 + 4) * 3) * (8 * (2 * 4 + 6 * 2) * 6)",b"((3 * 6 + 4 * 6 * 4) * 6 * 8 * (9 * 4 + 2 + 5 + 3 + 9) * 5) * 6 + (9 + 8)",b"(3 * 3 + 4) * 4",b"(4 * (7 * 6 + 4 * 4 * 5) * 3 + 3) + 6 * 6 * (2 * 3 * (8 * 3 + 2 * 5 * 6 + 7) + 9 + 5) * 4 * 7",b"(2 * (5 * 6 + 9) * 7) + 3",b"5 + 9 + 2 * ((6 * 6) * (3 + 7 + 6 + 6) + 3 + 5)",b"4 * 2 * 9 + (3 + 4 + 5 * (4 + 8 * 5) * 9 + 5)",b"7 + 4 * 6 + 9 * 7 + 3",b"(8 * 7) + 7 * 3 * (7 * 9 * (4 + 4 + 7 * 5 + 7 * 2) + 9 * (5 * 5 * 8 + 7) * 3) + ((9 * 8 + 8) + 2 * 2) + 6",b"2 + 7 * 4 * 7 * (4 * 3 + 6 + 8 * 6) + 7",b"6 + (9 + 8 * (5 * 7) * 4) * (5 * 8 * 2 * (8 * 6 + 6) * 5 + 3) + 4 * 7",b"6 + 5 + (7 + (8 + 2) * 4 * 3 * 2 * 9) * 7",b"7 + 3 * 9",b"(5 * 5 + 8 * (9 * 4 * 3 + 6 + 8 * 2)) * (2 * 6 + 8) + 6 * 7",b"(2 + 8) * 9 + 4 + 4 * 2 + (3 * 3 + 9 + 2 + 9 + 5)",b"((5 * 4) + (3 * 4 + 3 + 4) + (8 + 3 + 3 + 9 + 2) + 4) * 9 * 7 * 9 + 6",b"9 + 3 * 4 * (9 + 6 * (9 + 8) + (8 * 4) * 5 + 2)",b"(4 + (3 + 2 * 4 + 7) + 4 + 2) * 4 * 7 * 3 * (2 * 8 * 9 * 5 + (3 * 3 + 8) * 3)",b"2 * 7 * (2 * 5 + 5 * (2 + 7 + 4)) * 7 + 2 + 4",b"4 * 2 * (6 * 6 + 2 + 2 + 6 * (2 * 2 * 8)) + 3 * 9",b"(5 * 9) + 2 + (3 * 8 * (8 + 4 * 3 + 7 * 9 * 5) * 2 * 6)",b"2 * 9",b"6 * 9 * 2 + 9 * (4 + 3) * (8 + 6 * 9 * 3 + 7 * (2 * 2 + 7 + 8 + 3 * 7))",b"3 * 8 + 9 + 4",b"9 + (4 * 9 + (6 * 9 + 6) + 2 * 6 * 9) * (2 * 4 * (3 * 5 * 2 + 2 + 8 * 6)) * 6",b"(3 * (3 * 6 + 8 + 3 + 7) * 9 * (8 * 3 * 4) + 6 + 3) + 8 * (4 + 9 + 3 + 2 + (4 + 4 * 6 + 2))",b"6 + 5 * 2 + 7 + ((9 + 2 + 4) * 6 + 5 * 8) * ((6 + 5 + 6 + 2) + (6 * 3 + 7) + 7 * 2 + (7 * 7 + 3 * 4 * 3 + 2))",b"((2 + 3 * 6 * 5) * 7 * 9 * 5 * 2 * 8) + 8 + 3 * 3 * 6",b"7 * (8 * 6) * 4 + 2 * 7 * 8",b"2 + 4 + (9 * 5 + 3)",b"5 + ((7 * 8) + 8 + 6 + 6 * 2 * 3) * 2 * 3",b"9 + (4 * 5 * (6 * 6 * 9 * 5 * 6 * 8)) * (8 + 5 + 3 * 7) + 9 * 3 * 4",b"8 + 4 * 5 * 2",b"5 + 2 + 8 + 4 * (9 * 2 * 6) * 3",b"4 * 6 * (5 * 2 + 3 + 5 + (8 + 5 * 7 * 4) + 4) * 8 + 2",b"(9 * 7 + 2 + (3 * 5 * 4 + 6 + 3 * 2) * (4 * 8)) * 3 + ((9 * 2 + 6) * 6 + 5 + 5 + 5) * 8",b"(8 + (2 + 2)) * 7 + (9 * 9 + 3) + ((5 * 4 * 9) + (2 * 6 + 9)) + 3 * 3",b"6 * 8 + 8 + 2 + 7 + (5 + 3)",b"2 + 2 * (4 + 5) * 6 + 4 * (6 * 8 + 4 + 2 * (9 + 5) * 3)",b"(5 * 5 + 6) + 8 + 3 * (2 * 3 * 3 + 6 * 7 * (6 + 7 + 8 * 6 * 4))",b"7 * 8 + 2 + 5 * (9 + 6 + (5 + 5 * 6 * 3 + 7) * 2 * 5 + (7 + 8))",b"6 * (9 + 5 * 3) * 7 * (9 * 5) + 3 + 4",b"(9 + (3 + 2 * 2) * 6) * 2 + 5 * 6 + ((9 * 2 + 4 + 5 * 7) * 2 * 7 + 5)",b"6 + (5 + 7 + 5 + 5 + 9 + 5) * (8 * 4 * 8 + 4) + 4 * 3 * 9",b"2 * 9 * 9 * (4 + 2) * 7 + (2 * (4 * 7 + 3) + 8 * 9 * 3 + 9)",b"5 * 5 * (6 * (8 * 2) + 8 * 8)",b"(4 * (5 * 9 * 2 * 8 * 5) * 8 + (6 + 3)) + (8 * 9 + 4 * (5 * 5 + 6)) * 4 + 6 * 4",b"9 * 6 + 6 + (7 * (3 + 3 * 9 + 7 * 7 + 5) + 3)",b"5 * ((5 * 3 + 5 + 7 + 2 + 3) + 8) * 6 + 9 * 7",b"(4 * 9 + 4 + 2 * (8 + 9)) * 6 * 4 + 9 + 5",b"5 * 4 + 3 + 2",b"(5 * (9 + 7 + 3 + 4) * (8 + 3 + 9 + 9 + 9) + 5 + 9) * (3 * 3) * 7 + (2 * 6) + 8",b"(7 * 6 + 7) * 7 + 9",b"((6 + 4 * 9 * 7 * 8) * 3 + 3 * 5 + 7) * 5 * 9 + (5 * 2 + (2 * 7 + 8 + 3)) + 5",b"(3 + 8 * 4 * 3 * 5 + 9) + ((8 + 3 + 9 + 3) * 8 * 5 * 5 * 3) * 4 + 9 * 6",b"4 * 3 + 2 * (9 * 6 * 3 + (9 + 3 + 4 + 8 * 4 * 4) + 3 + 6) * ((2 * 9) + 7) + 5",b"(6 * 9) * 2",b"8 * (5 * (7 * 4 * 5 * 3 + 4))",b"2 * 9 + 7 + (8 + 5 * 8 * 8)",b"8 + 5 + (2 + 3 * (7 * 8 + 3)) * 4 + 8 + 6",b"(6 * 4 + (3 * 6 + 7) + 9 + 5) + 4 + 4 + (5 * (9 * 7)) + 7 * 6",b"6 * (7 * 9 + 3 * 3 + 4) * 4 * 4 + 7 * 6",b"(2 * 5 + (5 + 5 * 9 * 3 * 4 * 9) * 7) * 8 + 9 * (6 + (9 * 4 + 3 + 2 + 9 * 3) * 4)",b"(6 + 6 * 6 + 6) + 3 + 6",b"3 + 5 * 6 + 8 * ((5 * 5 + 8 * 4) * 9 + 7 + 6)",b"8 * 9 + 5",b"4 * 3 + (8 * 2 + (3 + 5 * 4 + 9))",b"(4 + 9) * 3 * 3 + (7 * (6 + 5 + 7 + 9) * 4 * 2 * 2 + (9 * 4 + 7 + 4 + 7 * 3))",b"(2 + 8 * 6 + 2 + 8 * 6) * 2 + 7 * 5 + 3",b"8 + 3 + 4 + 7 * (5 + 8 + 3 * 8 * 2 * 3)",b"(2 * 3 + (2 * 6 * 2 + 2 + 8 + 2)) * 9 + (2 + 9) + 4 + 3 + 9",b"9 + 4 * 4 * ((4 * 6 + 2 + 8 * 7) * (3 + 8 + 6 + 3) * 3 * 3) + 4 + 6",b"(7 + 8 * 9 + 5) + (4 * 5 * 4 * 9 * 5) * 9",b"7 * (2 * 5 + 9) * 6 * 3 * 3",b"(9 * (4 * 9 * 9)) + (5 + (7 * 9 * 2 * 7 + 4) + (3 * 8 * 2 * 2 * 6 * 4) * 6 + (3 + 3 * 2 + 2)) + 2 + (5 * (2 * 5 + 3 * 3 * 4 * 7) * (8 * 4 + 7 + 8 * 5 * 2) * 3)",b"9 + ((2 * 6) * 3) + (9 * 2 * 8 * (7 + 3 * 5 * 3 * 7 * 8) * 7) + 4 * 4",b"6 + 9 * (2 + 7 + (7 + 5 + 2) * 5)",b"(7 * 2 * 4 + 8 * 2) + 8 * 4 + (7 * 3 * 2 * (5 + 8 + 6) * 3) * 6",b"5 + 9 + (4 * 4 * 3 * 5 + 9)",b"6 * 2 * 3",b"((6 + 5) + (8 * 7 + 3 + 6) + 5 + (3 + 2 + 9) + 9) * 6",b"7 * 9 + 2 + 7 + (8 * 9 * 9 + 2)",b"(8 + (7 * 4 * 2 + 5) * 8) * 3 + 8 + 2 + 9",b"((2 * 6 * 3) * (9 * 3) + (3 + 4 + 9) * 2 + (3 * 9 + 9 * 9 * 6 + 3) * (4 * 6 * 5 + 8 + 2)) * ((5 + 4 * 8) * 2 * 5) * 4",b"4 + (3 + 9 + 2 * 5 * 9) + 8 + (8 * 4 * (8 + 2 + 7 + 7 + 8 * 9) * 6 + 8 + 8) * 5",b"(4 * (7 + 5 + 8 * 4 * 4)) + 8 * 9 + 9",b"(7 + 2 * (7 * 4) * (7 * 4 + 6) + 5) + 3",b"9 * 4 * 5 + 3 + 9 + 5",b"4 * (5 + (4 * 8 + 4 * 5) * 6) + 4",b"6 + (7 + (7 * 8 * 3 * 3 * 9 * 3) + (7 + 9 * 7 * 9 + 3 * 6) * 4 + 3 + 4) + 6 + ((4 + 3 * 4 * 7 + 7) * 6 + 5) * 9",b"9 * 9 * 7 * (8 * (6 * 6 + 2 * 8 * 8 + 8) * 4 * 7 + 4)",b"(2 + 5 * 6 * (3 + 9)) * (3 + (7 + 9)) * 3 * 2",b"8 + 8 + 5 * (4 * (3 * 3) + 9 + 6 + 7 + 6) + ((5 * 4 + 7 + 5) + (6 * 9 + 9) + 5 * (9 + 9 + 2 * 4 + 6 * 4) + (4 + 5 + 7 + 8 + 6)) + 6",b"8 + (4 * (3 + 8) * 7) + 6",b"6 + 9",b"4 * (8 + 4 * 5 * 6) * 6 + 2 * 3",b"6 * 7 * 8 + 9 * 7",b"((9 * 5 * 2) + 9 * (7 + 6) + 4) + 5 + 3 + 3",b"9 + 4 * (5 + (8 * 3 + 5 * 9 + 9 * 5) * 2) + (3 + (5 + 4 * 3) * (5 + 2) + (7 * 9)) * 3",b"2 + (9 + 9 + 5 + 6 + (2 + 9 * 9) * 6) * (9 + 4 + 3 * 7 * 7 + 4)",b"3 + (8 * 9 * 6 * 2 + (2 + 9 * 3 + 9) * 5) + 7 * 6 + (8 * 5 + (8 + 3))",b"(6 * (3 + 5) * 2) + 6 * (4 * 7 * 2 + 2 + 8 * 3) + 8 + 4 * 9",b"3 * 9 * ((9 + 3 + 6 * 7 + 8) * 2 * (9 * 6 * 6 + 5 + 9 * 2)) * 6 * 2 + 3",b"9 * (6 + 8 + 6 * 6 * 2) + 5 * 3",b"(3 + 8 + 7 * 8 + 6 + (3 + 2)) * 4 + 2 + 4",b"((7 + 7 * 4 + 5) * 9 * 9 * 8) + 9 * 8 + 7",b"3 + ((4 * 9 + 4 * 5 * 2 * 7) + 7 + 2 + 8 * 2) + 5 * 6 + 8 + 5",b"(4 * 6 + 4 + 5) + 7 * ((6 + 9 * 2 + 8 * 3 * 4) * 9 * 9 + 4) + 3 + 3",b"6 + (9 * 7 + 2 * (7 + 6 + 6 + 4 * 8 * 9) + 3 * 3) * 2 + 8 * (4 * 9)",b"9 + 4 + 6 + ((6 + 8 * 2 * 7 * 2) * 8) + 8",b"(6 + 5) + 2 + 4",b"(4 * (2 + 5 * 9) + 4) + 4 + 2 + 3 * (5 + 8 + (9 + 9 + 4)) * 6",b"(7 + 8 * (9 + 8 + 8)) + 5 * 7 + 9",b"5 + 6 + (9 * 6 * (3 * 4 * 5 * 2) + (5 * 4 + 4 * 2 + 6 + 5)) + 9",b"((2 + 4) * 5) * 5 * 3 + 3 + 2",b"8 + (8 + 9 + (9 * 5 * 4)) * 8 * (6 + 8 * 2 + 6 * (3 + 6 * 9 + 2)) + 8 * (5 + (8 + 3 + 6 * 3))",b"6 * (2 * 7 * 5) + 8",b"4 * 5 + 8 * (7 + 4)",b"(7 + 4 + 8 + 4 * 4) * 8 * 5 + ((7 * 6 * 4) + 5 * 6)",b"7 * ((7 * 3 + 6 * 6 * 2 * 3) * 4 + 8 * 5 + 5) + (9 * 3 + 2 + 2 + 3 + 4) + (7 + 2 + (8 * 8 + 6 + 7 + 7)) * ((5 + 6 * 4 * 3 + 7 + 5) + 2 * 5 + 4 + 5) * 4",b"4 * (9 * 7 + (7 * 7 + 7 + 3) * 8)",b"3 + (8 * 8 * 9 + 5 * (3 * 2 + 2 + 2 * 2 + 8)) + (5 * (8 * 4) * 2 + 7 * (7 * 4 + 7 + 2 * 4 * 3) + 6) + 9 * 2 + (4 * (2 + 9 * 6 + 7 + 5 + 7) * 2 + (7 * 5 * 5 + 6 + 6) + 4 * (8 + 5))",b"((6 * 9 + 3 * 3 + 8) * (3 + 9) * 2 * 2 + 3 * 8) * 3",b"2 + 5 + (3 + 4 + 8 * 8) * 4 + 6 + 4",b"(6 * 6) + 9 * ((2 * 2 + 4) + 6 + 9 * 8 * (7 * 4 * 3 * 8 * 3)) * 7 * 2 + 3",b"9 * 4 + 2 * (3 * 6) * 8 + 3",b"(9 + 7) * 2 * 7 * 3",b"(8 * 7 + 2 + 8 * 3) * (3 * 7 * 2 * 2) + 4 * 3 * 3 + 6",b"(2 + 7 + 7) * 9 + 7 * 7",b"4 * (9 * 4 + 8 + 9 * 9) * 3 + (3 + 2 + (4 * 2 + 2 + 4 + 9 * 8) * 4) * 9 * 9",b"4 * 6 * ((4 * 7 + 4) * (2 + 8 + 7 * 5 + 2 * 7)) + 2 + 3 * 5",b"2 + 2 + 6 + (4 + (7 * 3)) + 5",b"(9 * (3 + 8 * 3 + 9) + (8 + 4 * 2 * 8 * 2 * 6) * 9 + (5 * 7 * 7) + 5) * 3 + 3",b"3 * 8 + (6 * 6 * 7 + 3 + 5 + (2 * 7 * 4 + 2 * 3 + 4)) + 8 + 7",b"7 * 7 + (6 * (3 * 4 * 4 + 7 + 4) * 7 * 7 + (7 + 4 * 4 + 6 * 9 * 7)) * 2 + 8",b"7 + 3 + 4 + (2 * 4 + 9 + 6 + 8) * 5 + 5",b"((5 * 7 + 4 + 8 + 8 * 5) + 3 * (3 + 3 + 5 * 9 + 2) * 6) + 2",b"6 * (8 * 4 + 7 + 7 * 8) * (5 * (2 + 2 + 4 + 8 + 6)) + 6 * 5",b"3 + 7 + 7 * (3 + 9 * 6 * 6) + 4 * 5",b"3 * ((4 + 3 * 9) * 4 + 2 * 5 + 6 + (5 + 2 + 2 + 4 + 8)) * 6 * 9 + 3 * (9 + 5 + (9 + 9 + 6 * 6 + 6 + 2) * 3)",b"(8 + 5 * 6 * 4 + 2 * 4) + (2 + 5 * (9 + 3 * 8 * 8) + 8 * 2 * 4) * (3 + 7 * (8 * 4 * 4 * 8)) * 9 + 8",b"6 * 6 + (6 + 3 + (8 * 8 * 8 + 5 + 3 * 6) + 7)",b"3 + 7 + ((3 * 6 + 4 + 9 * 3) * 9 * 7 + 2) + (8 + 2 * 3 * 8 * 7) * 6 + 5",b"2 + ((7 * 7 * 3) + (4 + 8 + 3 + 5) + 3 + 7 * 9 + 7)",b"9 * 9 * 7 + ((8 + 7 * 8 * 8 + 6 + 8) + 3 + 2 + 6 + 9)",b"3 + ((3 + 8 * 5) + 7 * 2) + (2 + 9)",b"((7 * 2 * 3 * 3 * 9) * 6 * 2 * (3 * 4) + 5) * 4 + 6 + 6 + 2",b"6 * 3 * 2 + 2 + 4 * 9",b"4 * 4 * ((2 * 4 * 4 * 2 + 9 + 7) + 9 + 8 + 5) * 9",b"6 + 4 * 4 * (7 + 6 + (3 * 7 * 6)) + 5",b"9 + 3 * ((7 * 9 * 7 * 7 + 5 * 4) * 6 * 3 + 3) * 7 * 5",b"3 + (8 + 6 + (7 * 3 * 9 + 4) + 9 + (3 + 8 + 9 * 8 + 5 * 6) + 8) + ((9 * 2 + 3 * 9 + 6) * 5 * 2 * 7 + 2 + 3) * (6 + (5 * 6 * 5 * 5 * 2) + 4 + 4 + 9) * 7 + (9 * (5 + 3 + 3 * 4 * 7) * 7 * 9 * 8 + 4)",b"2 * 4 * 3 + (4 + 7 * 4)",b"(4 * (6 + 4)) * 2 * 9",b"((8 + 8 + 2 + 4) + 5 * 8 + 2 + 5) * (5 + 9 * 6 + 5 + 9) * 8 * 4 + 7",b"2 + (7 * 6 * 7 * 4 * 2)",b"((7 * 5 + 4 * 8) * 5) + 4 + 7 * 8 * 8 + 3",b"4 + ((6 + 6 + 5 + 8) * 5 + 5 * 2)",b"(9 + 6 * (6 * 6 + 9 + 5) + 4) * 3 + ((6 + 5 * 2 * 7) * 2)",b"(3 * (6 * 9 + 9) * 9 * 3) + 2 + 7 + 5",b"5 * ((6 + 9 + 6) + 7)",b"2 + 5 + ((9 + 3 + 6 + 4 + 2 + 7) * 7 * 8 * 4 + 8 * 6) * 2 * 2",b"((4 * 7) + 9 + 7 + 8 + 3) + 6 * 5",b"(3 + 6 + 7 + (7 * 5)) * 6 + 8 * 9",b"9 + 5 * 6 * 9 + (8 + 6 * 6)",b"(7 * (9 + 8 * 4 * 7 + 3) + 8 * 3 * 3 * (6 * 8 * 8 * 3 + 9)) + 8 * 5 + 6 * 6",b"3 * 4 * ((9 + 2) * (7 * 4 * 9 + 5 + 7)) + (6 + 7 + 8) + 2 * 9",b"4 + 4 + 4 + 3",b"6 + 6 * 6 * ((5 + 4 + 5 * 5 + 6 * 9) * (6 * 3 * 9) + 7 + (2 * 4 + 3 * 4) + 6) + 9 + 3",b"4 * 5 + 5 * (8 + 4 * 7 + (3 * 6 + 3 * 6 + 5 + 9) * (4 + 5 + 6 * 7 + 7 * 8)) * 3",b"4 * (5 + (2 + 8 + 8 * 7 * 3 * 9) * 4 + 4 * 4) + 3",b"5 + (3 + (9 + 5 * 7) + 9) + 2",b"3 * (4 + 9)",b"9 + 5 * 7 + (7 + 5 + 8 * 3 * 7) + 8 + (2 + 3 * 9 * 4 + 3)",b"8 + (9 + 8) + 5 * 2 + 9 * ((4 * 8 + 5) * 3 * (8 + 3 + 6 + 5 + 7 * 4) * 5)",b"7 * 8 * 9 + 9 * (4 + (7 * 9 * 7 + 9))",b"7 * ((5 * 6 * 4 * 2) * 9 * 7 + 3) + 3",b"2 + 9 * 4",b"2 * 2 + (5 + 2 + 4 * 5 + 5) + 5 * 5",b"4 * 8 + 9 * (7 * 9 + 9 + 8) + 8",b"9 + ((6 + 6 + 2 * 2 * 9 * 9) * 8 * 9 * 4 * 6)",b"((2 + 8 + 9 * 4 + 7) * 7 * 5 + 3 + 9) * 4 * 3 + 7",b"(8 * 8 + (5 + 3 + 9 * 9)) + ((7 + 5 + 5) + 2 + 7) * (9 + 4 + 4) + 8 + 4 * 8",b"(9 * 6 * 3) * 3 * (6 * 2 + (3 + 4 + 2) * (7 + 9 * 5 + 5)) + 8 + 6",b"(8 + (3 + 8 * 3) * 3 * 6 + 5) + 5 + 7",b"((9 + 8) + (6 + 2) * 7) * 2 + 6 * 4 * 2",b"3 + 6 + (3 + 2 + 2 + 6 * 5 + 3)",b"(6 + 4 + (2 + 3 * 4 + 3) + 4 + (3 * 2 + 5) * 8) + 9",b"(3 + 3 + (9 * 4) * 2) + 5 * 7 * 3 * (8 + 4) + 6",b"(3 + 7) + 7 * (4 + 7 * (9 + 2 * 7) + 8 * 5 * 8) * 3",b"((2 * 4 * 5 * 4) + 3 + 3 * 7 + (8 * 2 + 6)) + 8",b"(5 + 6 + 9 + 8 + 8 + 3) * 2 + 6",b"4 + 6 + 8 + (9 * 8 * 2 + 6 * 4 + 3) * 5",b"(2 * 2 * 5 * 7 + 4) * 6 + 7 + 5 * (9 + 7)",b"5 * 9 + (7 * 4 + (9 * 7) * 5 * 7) + 5",b"(3 * 6 + 8) + 7 + 8 + 3 + 4",b"4 + 3 * 3 * 3 + 7 * (5 + 9 + 6 + 5 + 6)",b"3 + 9 + 8 * 4 + (6 * 7 * 3 + 7 * 5)",b"8 * 3 * (9 * (4 * 8 * 7 * 9 + 3 * 9) * 2 + 5 * 7) * 4 * 4",b"5 * 7 * (4 * (9 * 7 * 7 + 5) * (7 + 5 * 9 * 6 + 8) + 4 * 6 * (4 + 6 + 6)) + 3",b"4 + ((4 + 2) + 7 * (3 * 4 + 4 * 9 + 6 + 8)) + 7 * 4 + 5 * 7",b"((6 + 2 * 6) * 2) + (5 * 9 + 9 + 7) + 7 * 4 * 2",b"4 + 7 * 8 * 7 + (3 * 7 + (4 * 6 * 5 * 2)) * 5",b"6 + (9 + 6 * 4 + 6 * 6 + 3) * 5 * 2",b"8 * 3 * 7 * (6 + 3 + (7 * 6 * 5 + 9 + 4) + 6 * (2 * 7 + 5 + 6) + 3) * (6 * 4 + 2 * 9 * 7 + 6)",b"2 * (5 * (9 + 6)) * (4 + (5 * 2 + 3) + 7 * 6 * (8 * 4 * 4) * 4) * 5",b"2 * 2 * (3 + 8 + (4 * 3) + (6 + 5 + 6 + 8 * 5 * 4) + 8) + 3 * 3 + 8",b"4 * (8 * 4 * (3 * 6) + (5 + 3 + 4 * 6 + 4 + 7) * 4) + ((8 * 2) * (2 * 7) + (9 + 7 * 2 + 2))",b"3 * 4 + (7 * 8) + (5 + 7 * 8 + 9) * 9",b"(9 * 4) * 5 * 3 * 9 + 5 + 7",b"(7 * (9 * 4 + 9 + 5) * (2 + 3 * 3 + 8 + 2)) * 5",b"((9 * 2 * 9 + 8 + 8 * 3) * 5 * 7 + (2 * 2 * 3 * 2) + 6) + (7 + 8 * (4 + 2 * 9 * 6 + 3 * 9) * 4 * 2) + ((4 + 9 * 9 * 5 * 5) + 2 + 8 * 9 * 2) + 9 * 6",b"9 + 7 + 9 * (9 + 4 * 5) * 7",b"7 + 8 + ((2 + 3) * 4) * 6",b"6 * 4",b"(9 + 4 * (6 * 2 + 2 + 7 * 6) * 4) * ((6 + 8 + 7 + 4 + 9) + (7 + 9 + 8 + 6)) + (2 * (3 + 8) + 7 * (4 + 3) * 5)",b"(9 + (2 + 4 * 3 + 3 + 2 + 2) + 4 + (2 + 3) + 3) * ((6 + 6 + 7 * 6) * 2 + 3 + 9 * 4 + 8) * 2 * 2 + (9 + (5 * 6 * 8 * 3))",b"(8 * (4 + 9 * 3 + 6 + 6) * 7 * 6) * 5 + 4 + 8 * 8",b"3 * (8 * (4 * 2 + 6 * 6) * 5 + (9 * 6 * 3 + 4 * 4) + (5 * 2 + 7 + 5 + 5))",b"3 * ((6 + 7 + 7 * 9 + 4) * 6 + 8) + 8 + ((7 * 9 + 5) + 5 + 6) * (5 * 6 + 2 * 6 * 6 + 7)",b"(3 + (8 + 9) * 5 * 6 + 8) * (2 + 6 + (7 + 4 + 6) * 4 + 3) + 6 + 2 * (7 + 8 * 5 + 7)",b"5 * (2 + 2 * 6 * (6 + 2 * 4 + 8) + 4 * 5)",b"4 * 9 * 7 + 7 * 3",b"((7 + 7 * 6) * (5 * 9 * 6)) * 5 + 5 + 3 + 8 + 4",b"(4 + (5 + 7 + 7 + 7)) * 4 * (7 * 7 + 3) * 6 * 3 * ((4 * 7) + 4 * 9)",b"2 * 2 + 6 * ((8 * 9 + 7 * 7) * (5 * 9 * 6 * 6 * 7 + 6) + 5 * 4) + (8 * 7 + 5 * 5)",b"9 + 6 * ((9 + 5 + 2 + 7 + 3) * 3 * 6) + 9 + 7 * 9",b"4 * (8 * (4 + 6 * 4 + 8 + 2 + 3) * 5 + 8 * 5) * ((5 + 4 + 2 + 3 * 2 + 9) * (4 * 8 + 9 + 4 * 4 + 4)) + 2",b"9 + (3 * 3 + 4 + 5 + 6) + 3 + (5 + 7) + (3 + 5)",b"((3 * 3) + 9 + 4 + 8 + 9 + 2) * (7 * (8 + 8 * 7) * 4 + (4 * 4 + 2 * 5 * 2) * 9)",b"2 + (7 + (6 * 2 * 4 + 2 * 9 * 2) * 4 * 5) + (4 + 5)",b"2 + (4 + 3 * 5 * 3 + 3) + 5",b"6 * 6 + 4 + 8 + 4",b"((3 + 4 + 2 + 6) + 8) + 2",b"(4 + 2 * 4 + 6 + 8 * 3) + (3 * 8 + 9 + 7 * 5 + 2) + 7 * 6 * (6 * 3 * 5 * 6) * 6",b"5 * 6 + (8 * (6 + 6 * 4 + 2) * (2 + 5 + 4 * 7 + 3 * 6) + 8 + 4) * 6 * 6",b"3 * 6 * 5 * (3 + 4 + 3) * 3 * 5",b"9 * (4 * (3 * 9 * 4 * 9 + 6 * 7) * 7 + 7 * 7)",b"7 * 4 + 2 + (7 + (3 * 4) * 9 * 8) * 2",b"(3 * (9 * 3 + 4) * 3) + 2 + ((3 + 7 + 6 + 4 * 6 + 9) + (3 * 7)) * 8",b"(4 + 3 + 6 * 7) * (7 * 7 * (8 * 4 + 2 * 8 * 2 + 3) + 4 + 8 * 3) * 8 + 2",b"3 + (9 + 2 * 3)",b"7 * 7 * 5 + (2 * (3 + 8 + 2) + 7)",b"4 * (7 + 7 * 9) * ((8 + 2 * 4 * 6 + 4 + 9) * 5 * 6 + 3 + 3) + (4 + 4 * 2 * (4 + 4 + 3 + 3 + 7) + 2)",b"2 * 2 + 2 * 9 + 9",b"9 * 4 + (2 * 5) + 8 * 5",b"(8 + 9 * (2 * 2 + 3 * 9 * 3 + 3) * 8 * 8) * (9 * 4 * 6 * 7)",b"7 * (6 * 8 * 8 * (3 * 2 + 4 * 7 + 9 + 6) + (4 + 9 * 3 * 3 + 7 + 3)) + (4 * 3) * 5 * 8 * 4",b"4 * 8",b"7 * 2 * (4 + 2 * 7) + ((3 * 2 + 2 * 9 * 6 + 7) + 8 * 6 * 6 + 9) * 7 + 5",b"(4 * (2 + 4 * 4 + 4) * (8 + 7)) * 7 * 8 * 9 * 9",b"9 + 5 * 3 * (8 + (9 * 5 + 4 * 3) * 7 * 7 * (6 + 4 * 5 + 7 * 2 + 5)) + 3",b"(4 * 4 * 9 * 8 + (7 * 2 + 9 * 6 + 4)) + 5",b"(8 * 4 * 8) + 9 * (7 * 5) * 5",b"(3 * 4 * 9 * 9 + (5 * 8 * 5 + 4 + 7) + (7 * 8 * 5 + 9 + 5 + 5)) + 2",b"(8 * 3 + 2 + 9 + 2 + 2) + 3",b"8 * (9 + 7) + 7 * 2 * (8 + 3 + 5 + 7 + 6) + 2",b"2 * (2 * 6 + 8 + (7 + 6 + 2) + 3 * 6) * (5 + 8 + 7 + (9 + 9 * 3 * 7)) * 7 + 4",b"(5 + 5 + 8 * (5 + 2 + 3)) * 9 * 9 + ((2 * 6 * 6 * 9) * 5 + 4 * 6) + 5",b"5 + 3 * 4 * (3 + 4 + 8) * (3 * 9 + 9 + 7 * 8)",b"6 * 4 + ((7 + 3 * 3 + 3) + (3 * 7) * 3 + 9 * 2)",b"(5 * 3 * 7 * 2 + 6) * (2 * 6) + 6",b"7 * 4 + (6 + 2 * 3 * 9 + (8 + 9) * (5 + 2 + 2))",b"2 + 2 + ((9 * 2 * 4 + 8 + 3 * 7) * 4 + (2 + 6 + 5 * 5 * 2 + 8) + 5 * 2 * 8) + 4",b"((2 + 3 + 2 * 8 * 4 * 6) * 4 * 2 * 8 * 5 + 5) + 8 * 9",b"5 + 4 * (5 + (4 * 4 * 8) * 3 + 3)",b"4 * 3 + (7 * 4) + 8",b"4 + (9 * 8 * 5 * 4) + 2 + 4",b"4 + (7 + 9 * 6) * 5 + 4 + 4 + 6",b"(2 + 9 * 3) * 2 * (7 + (5 + 8 * 7) + 8)",b"4 * 3 + 6 + 3 + ((5 + 6 + 7) * 5 * 2)",b"9 + 8 * (4 + 3) * 4 + 6 * 9",b"4 * (6 + 5 * 5 * 8 * 6 * 6)",b"(8 + 7 * 4 + 4 + (2 + 8 * 2 + 4 + 6 + 2)) + 3",b"2 + (9 * 4) * 7",b"4 + 7",b"(9 * (2 * 2 + 4) + 3 * 3 + (7 * 4 * 6 * 4 + 5 + 4) * (8 * 8 * 7 + 8)) * 6 + 3 + 7 + (6 * 5 * 8 * 6) + 2",b"2 + 6 + (4 + 2 * 7 + 3 * 9 * 9) * ((8 + 2 * 4 * 4 * 2 + 3) + (3 + 9 + 4) * 3 * 4) + 8",b"8 + (6 * 5 + 2 * 6 * (2 * 3 + 2 * 9 * 7 * 2) + 6) * 2 * 8 + 7 + (6 * 5 * 9 * 6)",b"6 + (3 + 9 + 3 * 6)",b"(2 + 5 * 9 * 2) * 2 * 5 + ((4 * 2 * 7 + 8 + 7) + 7 + 6 * 4 * 3 * 6)",b"(7 + 3 * 6 * (2 * 7) + 7 * 8) * 7 * 2 + 4 + 5 * 2",b"(6 * 2 * 5) + (7 + 7) * 9 * 5 * 2 * 5",b"3 * (8 + 3 * 3 * 2) + 5 + (9 * (5 + 8 * 8 * 5 + 8) * 4 + 7 * 8 + 3)"]; 2 | 3 | fn find_matching_par(s: &[u8]) -> usize { 4 | let mut d = 0; 5 | for j in 0..s.len() { 6 | match s[j] { 7 | b'(' => d += 1, 8 | b')' => d -= 1, 9 | _ => {} 10 | } 11 | if d == 0 { 12 | return j; 13 | } 14 | } 15 | unreachable!() 16 | } 17 | 18 | fn eval_p1(s: &[u8]) -> usize { 19 | let (mut val, mut i) = (0,0); 20 | let mut op = '+'; 21 | while i < s.len() { 22 | match s[i] as char { 23 | '+' => op = '+', 24 | '*' => op = '*', 25 | '0'..='9' => match op { 26 | '+' => val += (s[i] - b'0') as usize, 27 | '*' => val *= (s[i] - b'0') as usize, 28 | _ => unreachable!() 29 | }, 30 | '(' => { 31 | let end = i + find_matching_par(&s[i..]); 32 | let v = eval_p1(&s[(i+1)..end]); 33 | match op { 34 | '+' => val += v, 35 | '*' => val *= v, 36 | _ => unreachable!() 37 | } 38 | i = end; 39 | } 40 | _ => unreachable!() 41 | } 42 | i += 2; 43 | } 44 | val 45 | } 46 | 47 | fn eval_term(s: &[u8]) -> (usize, usize) { 48 | if s[0] == b'(' { 49 | let j = find_matching_par(s); 50 | (eval_p2(&s[1..j]), j) 51 | } else { 52 | ((s[0] - b'0') as usize, 0) 53 | } 54 | } 55 | 56 | fn eval_p2(s: &[u8]) -> usize { 57 | let (mut val, mut i) = (1,0); 58 | while i < s.len() { 59 | let (mut v, step) = eval_term(&s[i..]); 60 | i += step; 61 | 62 | // eagerly perform all add operations! 63 | while let Some(b'+') = s.get(i+2) { 64 | let (tmp, step) = eval_term(&s[(i+4)..]); 65 | v += tmp; 66 | i += step + 4; 67 | } 68 | 69 | val *= v; 70 | i += 4; 71 | } 72 | val 73 | } 74 | 75 | aoc2020::main! { 76 | let p1 = INPUT.iter().map(|s| eval_p1(s)).sum::(); 77 | let p2 = INPUT.iter().map(|s| eval_p2(s)).sum::(); 78 | (p1,p2) 79 | } 80 | -------------------------------------------------------------------------------- /src/bin/19.rs: -------------------------------------------------------------------------------- 1 | use std::collections::*; 2 | use itertools::Itertools; 3 | use regex::Regex; 4 | 5 | static RULES: [&str; 136] = ["66: 69 116 | 9 115","91: 95 9 | 109 69","14: 110 69 | 15 9","4: 119 9 | 61 69","17: 9 23 | 69 93","37: 118 69 | 94 9","68: 9 80 | 69 19","117: 37 9 | 45 69","132: 9 109","74: 9 25 | 69 126","102: 122 9 | 6 69","98: 89 9 | 99 69","113: 83 9 | 7 69","92: 9 16 | 69 50","33: 9 39 | 69 133","134: 95 69 | 7 9","57: 9 7 | 69 110","31: 9 66 | 69 51","47: 9 3 | 69 83","21: 69 123 | 9 129","104: 9 86 | 69 7","40: 69 24 | 9 34","32: 9 44 | 69 88","45: 49 69 | 48 9","2: 69 88 | 9 23","5: 3 9 | 110 69","108: 20 86","76: 97 9 | 113 69","56: 9 121 | 69 58","29: 69 13 | 9 82","123: 86 20","46: 23 69 | 95 9","19: 7 69 | 109 9","12: 93 9 | 95 69","75: 85 9 | 128 69","127: 93 69 | 83 9","61: 9 7 | 69 23","78: 9 132 | 69 107","121: 88 69 | 23 9","60: 33 69 | 76 9","73: 26 69 | 100 9","116: 9 60 | 69 75","93: 69 9","38: 9 106 | 69 110","107: 9 7 | 69 86","82: 5 69 | 64 9","58: 44 69 | 23 9","34: 69 57 | 9 104","124: 69 106 | 9 44","109: 69 9 | 9 9","48: 69 44 | 9 83","28: 9 83 | 69 7","64: 9 93 | 69 7","54: 9 102 | 69 40","94: 83 69 | 7 9","80: 9 86 | 69 3","62: 86 69 | 83 9","42: 125 69 | 70 9","71: 69 112 | 9 114","8: 42","131: 69 44 | 9 7","88: 69 9 | 9 69","87: 15 69 | 7 9","3: 9 9 | 69 69","9: \"b\"","41: 21 69 | 78 9","65: 9 69 | 69 20","128: 134 69 | 101 9","44: 9 69 | 69 69","51: 9 18 | 69 54","55: 69 79 | 9 5","95: 69 69 | 69 9","110: 9 69","22: 92 69 | 10 9","67: 9 44 | 69 23","7: 9 20 | 69 69","90: 69 96 | 9 68","53: 111 9 | 27 69","125: 69 72 | 9 22","11: 42 31","23: 9 69 | 9 9","114: 69 105 | 9 131","81: 53 69 | 29 9","69: \"a\"","1: 86 9 | 95 69","18: 9 73 | 69 90","83: 20 20","130: 89 69 | 47 9","89: 44 9 | 93 69","15: 9 9","0: 8 11","105: 69 110","13: 135 9 | 14 69","6: 69 105 | 9 132","103: 120 69 | 71 9","85: 1 69 | 2 9","96: 89 9 | 12 69","101: 69 95 | 9 23","39: 69 15 | 9 109","133: 88 69 | 65 9","86: 69 20 | 9 9","122: 127 9 | 43 69","20: 69 | 9","52: 69 109 | 9 3","119: 15 69 | 88 9","77: 9 7 | 69 93","50: 87 9 | 61 69","129: 9 65 | 69 110","97: 69 95 | 9 93","111: 59 69 | 35 9","115: 69 84 | 9 41","84: 36 69 | 4 9","72: 117 9 | 74 69","135: 110 69","112: 62 69 | 124 9","43: 69 3 | 9 15","118: 109 9 | 93 69","49: 69 23 | 9 83","26: 69 67","63: 106 9 | 44 69","70: 103 69 | 81 9","25: 17 9 | 77 69","36: 91 9 | 32 69","10: 69 98 | 9 56","30: 9 109 | 69 3","126: 9 28 | 69 63","16: 9 38 | 69 30","99: 106 9 | 109 69","59: 23 9 | 3 69","120: 130 9 | 55 69","27: 69 91 | 9 108","24: 46 69 | 52 9","35: 9 93 | 69 109","100: 9 101 | 69 80","106: 69 69","79: 44 69 | 65 9"]; 6 | static INPUT: [&str; 343] = ["bbabbbaaaaaabbabbaabaaabbaababbbabbbabbbababbbbbbbbabbbbbbabaaaa","aabbbabbabaaaababbbaaabb","baababbbaababaaaabbaababbabbbaaabaaaabbbaaaabbaaabbaabba","abbbbaaabbaaaababbbabaaabbbabbbbbabaabab","aaabbbbbabbbbbabbabbaabbaaaaababababbbbaaaaabbbabbbbabbababbaaabaaaababa","bbbabaaaabbaaabbbababababababaaaabaabbbabaaaabbbabbabbabbbaaabbaaabaaaaa","bbaaaabbaabbbaabbabaaaba","abaabbabbaaaaabbbbbabaabbabbbababaaababb","baaaaabbbabbbbbbabababba","baaabbbaabbaabababbbaaab","baaaabaababbbbbababbbbaaabbabbaabbababababababbabbbabaab","baabbaaaaaaaaaababbaaabaaabbabaaabbababaaaabaaaaabbaabaaababaabbbaabbbaaaabbabbbabbbbbbb","ababbbaaabaabaababababbabbbaabbaaaabbbbbababbabaabbbbbaa","abaabbaabbbbbbbaaaabbbbaaaababba","ababaaabbaabbaaabbbaaaba","bababbbbbaabbabbabbabaaaabaababababababababaabab","bbaaaaababbbaababbbbbbaa","abaabababababbbaababaaaa","aabbababaaaababababbbbba","aabaababbbaaababbabbabab","baababababbbabbbbbbbbaba","bbbbaaaabbababaabbbabbabababbbab","baaabbbbbbabbbbbaaaabaaa","ababbbbabbaabbaaaababbaaaababaaabbbbaaabababbabbaababbbb","bbbbaababababbbbbabbaabbbabaaaba","abbbabbababbbaaaababbbbb","abbbbbabbabbabbbbaaabbabbaaaabbbbbaabaaabaabbaba","aabbabbabbbbbbabbbabbaaa","bbbbaaaabaababbbbabbbbab","bbababaaabbaaabbabaaaabb","bbbbbbbabaabababbbbababbbabbbaaaababaaaa","abbbbbaabbabbbaabbbababbababbaabbaaabbab","aaabaabbbbabababaaaabababababaabbbabbabb","abbabbabbbaaaabbabaaaababbbaabbabaaabaaa","babbbabbbbbabaaababaaabb","bbaaaaabaabbaaaabbbabbbb","abaaabbbbaababbaaabaaaab","bababaababbaaabbaaaabaab","bbaabaabbabaaaaabbbbbbbaaabaaabaaaabbbaabbaabbbabbaaaabaaabbabbbbbaaaaaabaabaaaaabbaaaba","abbabababbbbababbbaabaab","ababababaabbaabbbbabbaaa","bbbbbaabbbbabaaabaaaabba","aababaaabababbbabbababababaabbbaabbaaabababbaabbbaabbbaa","aabbaabaabbbbabbaabababb","aabaaaaaabbbbbbbabababbbbabaaaabbbaabbba","bbaaaaabaaabaabbaabaaaab","aaaaaaaaabbaaaaabbbbaaababaaabab","baababbaaaaaababbbbaaabb","abbbbaabaabbaabbbaaabbaaabbbbabbabbbaaaabaaaaaaaaabaabba","baabaabaaabbbabbbbaaaabaabaaaaabaaabaabbbabaabbb","abaaaaabbabbbabbbababbaaaabaaabbaabbababbabbbabababaabaabaabbbaa","aaaaaaabababbbbaaabaaabaababababababbabb","abbbabaabbabaababaaaabaa","abbbbbaabababbbbbabaaaba","aabbaabbbaabaaaabbaaabba","bbabababaaaaabaabbbbaabaaaaababb","aabbaabbbbbbbaabaaabaaba","bbbbbaabbabbbbbbabbbaaab","bbababbaabbbbabbbaabbbab","baaabbbbbababbaaaaabbbab","bbaabbbbbbbbbababaaaabbbbaaaababbbaababa","aabaabababbbbaabaaaaabba","abaabbbbaabbbaaabbbabbba","baabaaaaabbbaabaaabababb","baaabababbbababbaaaaaabb","babaababbaaaababbaabbaaaaaaabababbbbbbaabbaaabbbaaaabbabaaaaaabbaabbaaaaaabbbaaaaaabaaba","aaabaabbaaaababaaaaaaaabaabbbbbb","abbbababababbbbabaaaabab","abaabaabbbabababaaabbaaa","bbbbababaabaaaaaaabbbabbaababaabababaaabbbbabbab","bbbbaaabaabbbabbabbbabbabaababbbbababaaa","bbaabbbbaaabbabbaaababaaaabaaababbaabbba","aabaabbabbabbbaaaaaaabbb","aabbabaababbbabbaabbbbab","baababbbbbbbbbabbabbaaaababaabab","babbaababbaabbaaaaaaaaba","aaabbbbabbaaaabbaaabbaaa","aaaabbbbbaaababaababbbbabababbababaabbab","baaaaabbbaaabaababbaaabbabaabbaabbbbaaaababbaaaa","babbabaabbbbaaaababbbbaabbbbabbb","abbbbabaaabababababaabab","bbaaaaabababaababababbab","ababbaabaabbaaaabaabbaba","bbaabbaaabaababaaaabababbbbbaaba","babbbbaaaabbabbaaabbbbbb","baaabbaabababbaaabababaa","aaaabbbabaabababbabbaababbbbabbaaaabaabbaaaabababbbaabbb","bbbbbbabbaaabbaaabbbbaabbbabaababbbbbaaabbabaaabbabbbbba","baabaabaaabaabbaaabbababbabbabaabbabbaabbaaabaab","babaaaaaabbbbaabbbbbbaba","bbbaababaabbbabbaaababba","bababbbbbaaabbbbabbbabbaababbaababbbaaabbbbaaaba","abbbababbbbbaaabbabbaaab","bababaababaabbbabaaabbbbbaabababbbbaabaa","bbbaabbbaabbbbbaabaaabaaaaabbbbbaababbbbbbababbabbabababaaaababaaaabaabb","baaaaabbabaabaaaabbbbaaaaababababbbbabbb","bbbbaabbbbaaabbbbaabbbaabaaababbbbaababb","abaaaabaaabbababbbaabbba","bbabaabbbbaabbaaababbaabaaababaa","aababbbaabaabbbaaababbaabaaabaaaaabbbbba","babbaabbbbbbaabaaabbabbaaabbabaabbaabbab","aababaabbbbababbaabbbaababbabbabbaaaabaaabbaabaabbbaaabb","abaabbbbabaabbaababaaaba","aabbbaabbaaabababbaaabba","baabaaaaaaaabababaaaabab","bbaaaabbbaaabbbaabababba","bbaaaaabaabaaabbaaaaabbb","baaababaabbaaaaababbbbbbabbbbbaabbbbbbabababbbaa","abbbbabaababaabaaaaabaab","baaababaabbbabbbbaabbaab","abaabbaabababaababbaaaaaababaabb","abaababaaabbabbaabaaabba","bbaababbaabaaabbbababaabbbbabbab","babbaaaaabbabbbaabababbb","aabbaaabbabbbbaaaabbbbba","bababaaababaaababbbabbba","bababbbaabbaabababbbabbbbbababababbbbbaabaaababb","abbabbbababbbbaaaabbaabbaabbaaaaabbabbaa","aaaabababbabbbaaaabaabaaabbabbabbbbbaaaabbaaaababaabbabbbbbbbbbababbabaaaabbbaab","bbbaaaaabbaabbbaaabaabbaabaaababbabbbbbabbbabaab","bbaaaababbbaababbabbbaab","aabaaabaaaabaabbbbabbaaababbababbabaababbbbaabba","aaaabababaababbaaabaaabaababaababbaaabbbbabbbaab","bbaabbaaaaaaabababbabbbabaaaabbb","ababbababbabaababbbabbbb","bbbbbbabbbaabbbbbbbabbbbbbbbbbaaaabbbbabaaabaaba","aabaaababbaabbaababbaabaabbaabbaababbbbb","bbaaaaabbbbaabbabbabbabaabaaaaaababaabab","aababaaabbbbaabbbbababbabbabaaaabaaaababbaaaababbabbbaabbaaabaab","aabbaaaaabbbaaaaabbaaaaabbbabaab","aababbbabbbaababaabababaababbbaaabaaabab","bbbaaaababaaabaaaaaabbabaababbbaabababaaaaaabaabaaababab","abaaaabbabababbaababbbab","bbabaabbaababababaabbbbb","babbabaabbabbbbbaaabaabbbabbaaaabaaabbba","aaaaabaababbabaaabbabbbb","bbaaaabbaabaaabbbaabbaba","abaaababaaabbbbbbbabbababbaaabaa","bbbbaababbbabaaababbabab","ababababaababaaabababbbbaaabbaababbbbabababaabba","babbaabaabaabbbbbaabaaaaaaabaabbbaabbabb","aaabaaaaababbaabaabbabaaabaabbabbbbbbaaabaaabaaa","baaabbaabaabaabbbaabbbab","aaaabbbaabaabbbbabbbbbaabbbbbbbbababbbaa","bbabbbaabababaababbaabaa","bbabaabaabbababaabaaaaabaaaaaaaabbbaabba","bbaababbbaabbaaabaaaaaba","baabbabbabbababbbbbbbbaabbbaaaaabaaaabbb","babaaabaaababbabbabaaaaaaaabbaaaaabbabbabaaabbbabbaabbab","babbabaaabaaaabaabbbababbaaaabba","abbababaaabaabbaabbbaaaabbaabaababbbbbabaabbbaaaaaababbaabbbbbbb","abbabbbaabaabaaaaababaabaaaabbbbabbaaaaababababbbbabbaabaabbababaaaabaabaaabababbbabbaab","bbaababbaaaaabaaaabbbaababbbbbab","babbbabbaaabaaababaabbbabbbaaaba","aaabaaabbaababbaabbbbbaaaabbbaba","bbaaabababaaaabaababaabaaabbbabbbbbbaabbbbaabbaababbbbabbbabbabbbababbab","abbbabbabbbbaaababbbbaabbaaaaaab","babbbabbaabbaabaaabbaaabbbbbaaabbaababbbaaaaaabb","aabbaabaabaabbabbbbbbbbabbbaabbb","abaaaaabbbbbaababaaaabab","abbbbbbaaabaaaaabbabaaaa","bbbbbbbaaabababaaaabaaba","bababbaababaaaaababaaaba","abbbaababaababbbbbbbabbabbbaabaa","abbbbbaabbbababababbbbbbbaaaabaabbbaaaba","abaaaabaabaaabbbbaababaa","bbaabaaaaaaaababaabbaabbabbbbbbabaabbbbabbababba","baabbaabaaaaabaabaabaabbbbabbbab","bbaaabbaaabbabbaaaaaaabbbbbaabbabbaaaaaabaabbbaa","aaaaaaabbbbbbbabbbababaabbababbb","abbbabbbbabbbaaaabababbb","aaabaaabaaaabbabaaaabbbb","babbaaaabbbbbbabbabbabba","ababababaabbabaabbabbbbbbaabbbaa","aabbbaabaaaaaaabaaababbb","aaaaabaaaaabbbbaaaaabbababaabbababaabababaaaabaa","abbbbaabbbabaabbababaaabaaabaaabbaaaabbabbaaabba","aaabbbbabbbbaabaababababbababbbabaabaabbbbbaabbb","abbbababbaababbababaabaa","ababaaababbbbaabbbabbabb","babbbbbbbaababbbbbbabaaaabababbbbaabbabb","aabaaabbaabbaaaabaaaabab","abbbabbbbababbbbbbabababababaabbaabbbbba","bbbabaaaaababaabaaaabbaa","bbbbaaabbabbaababbbaabba","ababababbaaababababaaaaaaaabababbaaabbbbbbaaabaaaaababbabaaaabba","bababbbbbbaaababaababaabaabbababbbbbbbba","baababbaaabaabababbaabba","bbbaababbbbbbbbabbaabbab","babbbbaababbbbbbbaabbbba","aaabaabbabbbbaabbbaababa","abbbaaaaaaaaabaabbabbaab","aabababbababaabaabbbbbbbaabbaababbaaaaaaaaabbbbaaaaabbaa","bababbbbaaababababbabababbbbbbbaababaaaaaaabbaaa","bbbbaaababbabbababababaa","bbbbbaabaaaababbaabbbbba","baabbaaabbbbabbbbbabaabaaabaabbbaabbbbbb","bababbaababbbbbbbaaaaabbbbaaabab","aabbaaabbbbbbbabaababbabbbaaabaa","bbbbaaabbaababbaaababbab","ababbaabaabbababbaaaabaa","baabaabbabbbabbbbaaaabbb","abbabbbabbbaababbbbaabba","abaaabbaaaabbabbababaabbbaaaababbaaabbbbaaabaabb","baabaabbbaaaaabbbabbaaaaaabbabbbbbbaabbb","abbaabababaabababbaababbabbaabaa","bbaaaaaabbaaaabaaabbababababbbab","aabbaaabbababbaabbbbabbbbaababababbaabba","bbbbaabbaababaababbbbaabbbabbbbaababbbaaabbbbbbbbbababbb","aaaaababaaaababaabbbababaabababaabbaaabbbabbbbab","aaabbbbabbabaabbbbaaabaa","bbabababbabaaabbbbbaaaba","aabbabbabbbabababaaabaab","bbbbaabbabbbabbbaabbbbbabaabababaaabbbab","baaabbbbaabbbabbbbaaaaaaabbbaabbaababbbb","bbaaabababbbaabaabbbaababababbabbbbabbab","bbbaaaababbaaababbbabbabbbbbbaaaababaabb","abaababbbabbbbabaababbabbaaaaabbbaababaaabbaabaabbababaaabaababb","ababbaabaabaabbaabbabaaa","bababbaababbaababaabbaabaabaaaaabaabaabaaababbabbbabaaaa","babaaaaaaabbbabbaaabbbaa","abbbbaabbbbbaababbbaababaaaaaaababababbb","bbabababbababbbbbbbbbaaa","aabbbaabbababbaaaabaaababbabbabb","baababbbabbbbbbabbbbbbbaaaabababbaaabbab","bababbbbabaabbaaabbbbaaabaaaabbb","abbaabaaabababbbaaaaaaaaaabbaabbbaabaabb","bbabbbbbbbabbbbabbbbaabbabaaaabbbaabbaba","bbaabbaabbababaabbaaababbabaaabb","bbaaaabbbaabaababbbbabbaababaabb","aaaaaaababaabbbabbbbabaa","bbbbaabaabababbabbaabaaabbababbaababbbbbaaaabbaabbbabbbabbaababb","abaaabbbbbbbababbbaababa","abaaaababbbbabbaabababba","aababbbabbbbaabbbababbbbabaaaaababbbaabbbababbab","bbbbaaaaabaabaabbbbbababbaaaaaba","babbaaaabaabbaabaaaaabba","bbbbaaaabaababbabbbaabba","ababababbbaaaaaaabbabaab","bababbbabbbaababaabbabaaabbabbbabbabbbab","baabaaabbabbbbbbbbbbbaabaabababa","ababbbbaabaaaabababbbbba","aaaaababbbabbbaababaaaba","baabababbaaaaabbbbababbb","bbbbabbabaabaaaababbbbba","aababaaabbabbbabbbbbbabbbbbaabbbbaabbabb","bbabaabaabbabababbbabaaaabaabaaababaaaba","aabbbbaaabbbbabbbabbabab","abaababaababbbbbbababbab","bbbabaaaabbbbabaaaabbabb","aabbaabbabbabbabbabbabba","bbababababaabbbbbabaaaab","bbbbaaaaaabaaabbbaabbbbb","aaaababbbaababababbabbaa","abaabbaaaabaaabababbbbba","aababbaabbaaababbbbbbbbababbaabb","babbbababbbbbaabbaabbbabbaaaababbbaabbabbbbaaabbaabbbabbbaababaa","bbaaaaabbaabaabaabbaaabbababaababaabaabbabbabbaabbaaabbababbbbab","abbabbbabaabaabbabbbaaab","babbababbaabbabaabaaabbabbababbbaaababbb","baababbbbbababaaababaaaabbabbaaa","bbbabaaaaaabbbaaaaaabbabbabababbabbbbaaaaaababab","ababaaabbaaabbbbababaaabbbbbaaaababbaabaabbbbabbbbabbaaa","abaaaaababbaaaaabbabbbaabaaaabaababaaaba","abaabababaabbaabbbbaaaab","babbbbbbbaaabbaaabbbbababbaaabbbabababaabbbaaaba","baabaaabaaaaaaabbbabaabbbbabbaba","aababbaaabbbaaaaabababba","abbbbabaabaabbaaaaaaaaababbbaaaabbabbaaababaaaab","bbaaaabbaababaabaabaaabaabbabbbb","bababaabbabbbaaabbaabaaa","bbbaabababbbbaabbabbabaabbaabaaa","babaaaaaabaaabbbbbababbb","abbbbbaabaabaabababbabba","baababbaaabbababababbbaa","aaabbbbaaaabababbabaabba","abaabbbabbbaabababaaabab","babbbaaaaabaaabababbbaba","abaabaabbabbaabaabaababb","aaaaaaabbabbaabaaaabbbab","bbabbbaabaabaababbaaaaab","bbaaaabbbbbbbbabababaabb","bbaababbbaaabbbabbaabbab","aaababababbabbabbabbabab","aabbaaaababaaaaaabbbabbaabaabbbaababaaaa","aabaaaaaabbaabababaaabab","baabaaabbbbababaababbbbb","ababababbbbbaababbaabaaa","bbbababaaababbbaabaaabab","bbbababbbbababababababbb","baababbbbbbbbbabaabbbbaabbbbbaaa","ababbbbaaabbaabbbbaabbbb","baababbababababbbbbbbbbaabbbbaabbbaaaaabbbaabbab","abaabbbabaababbaabbaabaa","aabbabbabbbbaaaaabaababb","baababbaabbaababaabaaaaabbbabbba","aabaaaaabbbbababbbbbaaaabbbabaabaababbab","aaaaaaaaabbaaabababbbbab","baaabbbbabbbaaaaababbbab","abaababaaababaaabababbaaabbbababbbabbbaaaaababbaaaaaabbaaaabbbbb","aabbbaaaabaabaaabbbbbbababbbbaaabbbabbaa","babbaaaaaabbbaaaabbbbbaaaabbabbabbbaabaa","bbbababbbabbbbaaaabaabaa","babbbabbabbbbbaaabbabbbb","aababaaabbaaaaababaaaaaabbbbbbababababbbbaaaabbabaababaababbabbaabbbbaaababababa","bbbabaaabaababbaaabaaaab","baabaababbabbbbbbaabbbbb","bbbbbbabaaababbbabbabbaabaabbbba","bababbabbaabbaaabaababbbabbbaababbabbaaaaababbabbbbbaaabbabbaaaaabaabbba","abbaaabbabbababaabaaabaa","bbaaababaabbabaaabaaabaa","bbabbbaaaaaaaaaaaaaabaab","bbaaaaabbbababbabbbaaabb","aaaaaaabababbabababaaaab","abbabbabbabbbbaabbabbabb","aabaaaaaabbbaaaaaabbabababaaabbbbbabaaabbabaabaabaaaabaa","bbbbbaabbbaaaaaababbbbbbaaaabbababbaabbbabbbbbabbaaaabab","aaabaaaaabbbabaabbaaaaba","aababaabaabbaaaabaaaaaaa","aaaabbbaaaabababaabbbaababbabaaabaaaaaaa","baabbaabbaabaabbbababbbbbbbabbaa","bbbaababbbbbaaaaaaaabaab","bababaabbabbabaabbabbaaa","baabbaaababaaaaabbaaaaaabbbabbbaaabbbaaabbbabaaaaababbbbbbbaaaab","abbaababbaababababaabbaaababbaababbaabbbaaaaaabb","babbabaaaaababbaabbaabaabbbbabba","babbaabbbabbaabbaaaabaab","aababbaaaaabaaabaabbbaabaabbabbaabbbbbbabbaabbbbbababaaa","aaaabbbababaaaaaaabaabbb","bbaababbabbbaaaaababaaabbbabbbbaaabbbbaababbababbbabbabb","aababbbaaaabaaaaabaababb","baaababbabbbbbbbbabaaabbabaabaabbbabbaba","abbabbabaaaaaabbaaabbabbbbbabaababbababbbbbaabba","abbbbabaaabbababbbbaaaba","abbbaababbabbabbbaabbabbbbabaaaa","abbbbaabaabbbabbaaaabbaa","aaabbbbaaaaabbababbaaabbaaaaabbb","bbbbaaabaaabaaabbaabbbaa","babbbabbbabbabaaabbabbbb","ababbbbaabbbabbbaaabbaaa","bbabbbbbababbaabaaaabbbb","bbbababbbbbbbbbabbbabbbb","abbbabbbbababbbbabbabbbb"]; 7 | 8 | #[derive(Clone,Debug)] 9 | enum Rule { 10 | Comb(Vec>), 11 | Char(char), 12 | } 13 | 14 | fn as_regex(rules: &HashMap, id: usize) -> String { 15 | match &rules[&id] { 16 | Rule::Char(c) => c.to_string(), 17 | Rule::Comb(v) => { 18 | let re = v.iter() 19 | .map(|p| p.iter() 20 | .map(|&id| as_regex(rules, id)) 21 | .join("") 22 | ) 23 | .join("|"); 24 | format!("({})", re) 25 | } 26 | } 27 | } 28 | 29 | fn part_one(rules: &HashMap) -> usize { 30 | let re0 = as_regex(&rules, 0); 31 | let r1 = Regex::new(&format!("^{}$", re0)).unwrap(); 32 | INPUT.iter().filter(|s| r1.is_match(s)).count() 33 | } 34 | 35 | fn part_two(rules: &HashMap) -> usize { 36 | let re42 = as_regex(&rules, 42); 37 | let re31 = as_regex(&rules, 31); 38 | let rule_11 = (1..6) 39 | .map(|i| format!("{r1}{{{n}}}{r2}{{{n}}}", r1 = re42, r2 = re31, n = i)) 40 | .join("|"); 41 | let re_str = format!("^{}+({})$", re42, rule_11); 42 | let re = Regex::new(&re_str).unwrap(); 43 | INPUT.iter().filter(|s| re.is_match(s)).count() 44 | } 45 | 46 | aoc2020::main! { 47 | let rules = RULES.iter() 48 | .flat_map(|s| s.split(": ")) 49 | .tuples() 50 | .map(|(id, s)| { 51 | let id = id.parse::().unwrap(); 52 | if s.contains('"') { 53 | return (id, Rule::Char(s.as_bytes()[1] as char)); 54 | } 55 | let v = s.split(" | ") 56 | .map(|p| p.split_whitespace() 57 | .map(|i| i.parse::().unwrap()) 58 | .collect() 59 | ).collect(); 60 | (id, Rule::Comb(v)) 61 | }) 62 | .collect::>(); 63 | (part_one(&rules), part_two(&rules)) 64 | } 65 | -------------------------------------------------------------------------------- /src/bin/21.rs: -------------------------------------------------------------------------------- 1 | use std::collections::*; 2 | use itertools::Itertools; 3 | 4 | static INPUT: [(&str,&str); 38] = [("crjjvr fhpdhz jdmg nfhj sdvng drmr rdbdng jbtjbj bnjhvjm ldvmdh qrgsbb nxbtmj dvxptd nbrmxl dtlfc kxshrl xsmc vbn ncs qzjgv xltv bktzrz gxm jzdtn nxvx qcxdbh rfpzm bplvg ztkgdb psmzk ftzdbf ljmjtcz bcqbb prg sdhkr qdsqx kfkgkjf hxntcz nxksj fdddkd vrpkhg zxbfhrs fvdd xknb pxls lmghcl fvfpdf xnm qxtzl rlxgn nsjtzn mltghx srzqtccv xkjxpf ztv cmdl sblmknh vxtkg msvx qzzq bstlrlb lvmf fjms xkxvrm npcd trpclz dxtggp ptqbrz mtnx tqkc gbtmdb nxxxc rdksxt mmbbcm jxnf cqdb hfts cql mhvf tsddbt lnrsm bvgm vtbjjlg rhvppq grxqh jxr jsp xpcbp", "nuts"),("gxm zqfh nsjtzn gbtmdb hxntcz vxtkg ntkjt szjzjnbn qdsqx ljmjtcz fvfpdf grxqh lmghcl sghx xkjxpf hhlkfng fjms lbhrh mltghx tnhk vhnl jfb hcg fcrvr fzsqhg hfts bktzrz cmdl njvktm trpclz ntc flvmtng zfcmvxj mnvn rdksxt xnm mmbbcm dxtggp rfpzm srzqtccv sbjvmx nbrmxl qcxdbh xknb gpsgbp ljppc vfvvnm nxxxc xvcfsc ncs rkm", "sesame, nuts"),("ptqbrz rfpzm cbnz gmhgp szjzjnbn sghx fdddkd jklfqg qkdg vhnl gxm nxksj ttmqqkp xkjxpf hxntcz mltghx fslj grxqh mlbhm zgtnsh bstlrlb nbrmxl mdqfj tsddbt zxlvks cql krkmhc ntkjt zxbfhrs vfvvnm sxgkn fvdd tnhk pdc zmgsxd zsb vxz xbk rrzmn crjjvr lbhrh vvgfqqn hlfsfxt dmlpn sblmknh vrpkhg gbtmdb bcqbb svbmd nxxxc sbjvmx kfkgkjf lkjmpqlv dztng xpcbp cvrd ndvzt dvxptd ntc hfts rdksxt sgjkh kdlrt rkm bzknq xvcfsc rlxgn nxbtmj qdsqx mksnnv mtnx qzzq zfcmvxj xltv ztkgdb rhvppq cppld xknb trpclz bvgm jjqlc rdbdng lbbztc bktzrz qzjgv qrgsbb fvfpdf cqdb lvmf qpc", "peanuts, wheat"),("srrhv bstlrlb fdddkd fxxczb ldvmdh tsddbt lkjmpqlv xsmc lqfts sdhkr sfj zhlmsn rdksxt jsp szjzjnbn xkxvrm nxbtmj bktzrz vfvvnm qrgsbb xknb hxntcz lmghcl kxshrl bcqbb nxvx mnvn qpc gbtmdb ntkjt grxqh sdvng ljmjtcz nshgxhq hcg hvvtd mplkr gpsgbp bvgm ttmqqkp hlfsfxt zsb kfkgkjf rrzmn sxgkn jfb sghx zgtnsh zmgsxd xbk ftzdbf bgjjk rfpzm qblxkq", "fish, wheat"),("cppld spbkv tnhk qnvp qpc nxvx rdksxt xvcfsc ggbcmjmc ptqbrz ljmjtcz srzqtccv mhvf gnfnxx ldggpnn qtmnj sgjkh qrgsbb rrzmn vfvvnm pxls nxbtmj mzj cdvxz bvgm tztv ntkjt gpsgbp ckzrn njvktm crjjvr vxz qdsqx zqfh qcxdbh rkm nsjtzn jhpd cczvdhx pqtkn lkjmpqlv bktzrz jfb kdlrt nfhj vhnl zxlvks zhlmsn rfpzm sblmknh trpclz sxgkn nshgxhq bzknq psmzk hxntcz hlj mnvn fjms zsb dxtggp xknb jsp", "peanuts"),("cthrglq hhlkfng rrzmn vhnl vfvvnm jbtjbj tqkc zxlvks qrfvhh zqfh kfkgkjf qpc qzjgv srzqtccv bktzrz lbhrh jsp hl hxntcz zsb srrhv jhpd bvrdq qrgsbb ntc dmlpn xgx gbtmdb xnm rdksxt mltghx nshgxhq mcfs fvfpdf nxbtmj fkmshtk cdvxz sbjvmx prg nzll nbrmxl xsmc ljmjtcz sblmknh pqtkn drmr bstlrlb mdqfj vxz bvgm fslj jzdtn xkjxpf xrlljb kxshrl srzcq crjjvr fvdd zxbfhrs ftzdbf msvx", "soy"),("jfb xkxvrm zsb kdlrt gbtmdb sghx srzqtccv zhlmsn ldggpnn zxlvks ptqbrz prg tvdfjnqc zgtnsh scxgb gsxk cmdl cthrglq cdvxz drmr sblmknh xpcbp cqdb lqfts fvfpdf xrlljb dmlpn krkmhc mzj jxr grxqh ncs fzsqhg lxzk ntkjt gxm nxksj vhnl qnvp flvmtng bktzrz vxtkg bvgm rdksxt qzzq hxntcz pdc ldvmdh jbtjbj xvcfsc bvrdq ftzdbf dvxptd fkmshtk fhpdhz xltv vxz mnvn ztv vbn mcfs bcqbb thjnz spbkv mtnx rdbdng lvmf ntc psmzk vfvvnm crjjvr mdqfj hnk qkdg ggbcmjmc gtfhn nzll zfcmvxj", "soy, dairy, fish"),("bktzrz zqfh dmlpn xpcbp rdksxt jsp qqgv bcqbb cql hlj bplvg mplkr srrhv rkm vfvvnm fvfpdf sghx hxntcz flvmtng nxksj mdqfj trpclz jhpd nbrmxl kfkgkjf bvgm sdhkr ndvzt dbh fcppz jzdtn rlxgn xgx bstlrlb hdlkgft srzqtccv nxvx sbjvmx mzj crjjvr tvdfjnqc mlbhm cppld qzjgv rdbdng hhlkfng fslj nsjtzn bnjhvjm cmdl krkmhc sxngk qblxkq dxtggp thjnz cthrglq xknb psmzk", "soy, peanuts, fish"),("flvmtng kxshrl sfj qxtzl hzvh fhpdhz bvrdq vfvvnm hlfsfxt thjnz cbnz qnvp bvgm ggbcmjmc nxvx rdksxt xbk bktzrz sbjvmx nxxxc hxntcz lbhrh gpsgbp gbtmdb sblmknh ckzrn xknb cmdl ljmjtcz crjjvr hhlkfng ldvmdh mdjzx scxgb nzll gxm hnk", "eggs"),("ttmqqkp xltv lmghcl vfvvnm mhvf ntc gbtmdb thjnz ljppc lxzk ldvmdh qblxkq rrzmn xvcfsc xknb rlxgn mmbbcm pxls fdddkd rhvppq gtfhn ggbcmjmc rdksxt bgjjk lnrsm mtnx jxr bvrdq dxtggp kdlrt hxntcz tqkc qxtzl bvgm sdhkr gjbdb qcxdbh fxxczb ljmjtcz xnm xgx mzj rfpzm kxshrl qpc spbkv jklfqg fcppz tsddbt mdjzx zhlmsn njvktm srzqtccv", "nuts, dairy, soy"),("lbhrh szjzjnbn sbjvmx srrhv ntc xbk gbtmdb fkmshtk njvktm scxgb tsddbt crjjvr vtbjjlg ldggpnn hcg cvrd zgrclc qnvp dtlfc hfts bvgm xkxvrm tztv dbh nfhj kxshrl mplkr bstlrlb sghx hvvtd lnrsm ttmqqkp kdlrt jbtjbj npcd vxz sxngk lkjmpqlv dzlrq ztkgdb rrzmn qblxkq qdsqx jfb rkm lxzk qtmnj xknb fxxczb sxgkn mcfs jzdtn xltv slb dvxptd cbnz xkjxpf rdbdng vfvvnm nxxxc zhlmsn sgjkh bktzrz srzqtccv hxntcz ldvmdh gjbdb", "nuts, wheat"),("lbbztc cvrd hl bplvg ggbcmjmc mdqfj scxgb lkjmpqlv lxzk zhlmsn lqfts vtbjjlg cmdl zgrclc cppld qnvp gpsgbp fvfpdf bvgm crjjvr pdc fvdd vfvvnm srzqtccv gxm lbhrh ztkgdb ldggpnn bktzrz drmr jfb sblmknh dtlfc tnhk sbjvmx tztv ftzdbf mksnnv rdksxt gbtmdb nxbtmj rrzmn jdmg hlj qkrl tqkc xknb", "wheat"),("rdbdng fcppz ljmjtcz nsjtzn lbbztc lvmf zgtnsh bktzrz fcrvr cmdl jfb vxtkg npcd hdlkgft fvdd hxntcz bplvg sfj mdqfj ssnrp srzqtccv hhlkfng qcxdbh lxzk cthrglq bvgm qxtzl svbmd gbtmdb scxgb xbk mcfs mksnnv fjms ncs bgjjk qrgsbb qrfvhh crjjvr vhnl tqkc slb pdc cdvxz qqgv gxm xnm nbrmxl tnhk rdksxt qkrl qblxkq qkdg vrpkhg xknb zfcmvxj zmgsxd rfpzm sgjkh nfhj dxtggp qdsqx gtfhn zqfh", "nuts, fish, soy"),("slb bvgm zxlvks mhvf trpclz gbtmdb hlj mnvn vfvvnm xknb lnrsm fvfpdf jbtjbj zqfh dxtggp vxtkg lqfts mtnx rdksxt cbnz dbh thjnz nzll qtmnj hl nbrmxl jklfqg nxksj nxvx zhlmsn qrgsbb fslj ckzrn ptqbrz dvxptd bplvg bgjjk ftzdbf fdddkd jjqlc spbkv mmbbcm sxngk sdvng fvdd tvdfjnqc zgrclc msvx qzzq nxbtmj hxntcz scxgb fhpdhz fxxczb srzcq qpc gnfnxx lvmf zfcmvxj hhlkfng nxxxc hfts bcqbb kfkgkjf vrpkhg kxshrl dmlpn srzqtccv", "fish, wheat, dairy"),("jjqlc vxz fhpdhz mplkr xsmc mnvn hlfsfxt nbrmxl dtlfc rkm cthrglq prg szjzjnbn xnm fcrvr jhpd rrzmn qkdg lkjmpqlv jfb zqfh bktzrz scxgb zmgsxd cqdb srzqtccv jsp fcppz cdvxz xknb vxtkg zxbfhrs sdhkr hzvh bstlrlb xbk fzsqhg grxqh gpsgbp zgrclc cbnz xvcfsc gbtmdb sfj nxbtmj ldggpnn rdksxt bplvg vfvvnm ptqbrz bvgm sghx ljppc xrlljb qtmnj gnfnxx qblxkq tqkc rlxgn crjjvr qcxdbh zsb zgtnsh srrhv slb qqgv spbkv ztv fvfpdf gmhgp", "dairy, wheat, sesame"),("ptqbrz rrzmn mltghx bktzrz bcqbb nxksj vrpkhg jklfqg qzzq ckzrn xpcbp prg fjms ncs tqkc mhvf hzvh zmgsxd dmlpn nxxxc npcd cthrglq mlbhm zsb kdlrt srrhv scxgb bvrdq svbmd lbhrh srzqtccv lxzk hxntcz sdvng mmbbcm vxz xknb lqfts vfvvnm bzknq hfts dbh dtlfc nzll xltv ntc hlfsfxt jsp rdksxt bvgm szjzjnbn tztv ztkgdb nsjtzn flvmtng trpclz qqgv ljppc hnk zqfh", "eggs"),("npcd fhpdhz srzqtccv bktzrz qtmnj sdhkr tztv bvrdq nxvx bgjjk qrfvhh qxtzl nxbtmj mhvf fslj scxgb mtnx jhpd gjbdb jbtjbj vxz krkmhc lnrsm xknb pqtkn tsddbt nzll fvfpdf xkxvrm nfhj hxntcz qqgv xsmc rdksxt fcrvr zxlvks dztng ntkjt sblmknh hhlkfng drmr ckzrn dbh gb hcg crjjvr szjzjnbn vfvvnm bvgm zxbfhrs vhnl trpclz cvrd kdlrt qzjgv dtlfc mdjzx cql flvmtng fcppz sxngk bstlrlb fjms bzknq prg mksnnv mlbhm kfkgkjf ztkgdb tnhk cppld sghx tqkc grxqh", "nuts"),("sfj kdlrt dzlrq ntkjt rhvppq drmr tnhk mdjzx hfts jklfqg zxlvks gpsgbp vhnl crjjvr gjbdb vxtkg xknb bzknq qzzq bvgm qkrl pxls ndvzt mtnx bstlrlb gsxk bnjhvjm bktzrz fxxczb fkmshtk xgx dxtggp qblxkq sdhkr nbrmxl zxbfhrs fzsqhg vbn hxntcz gnfnxx ptqbrz fdddkd cql ckzrn pdc ftzdbf psmzk sdvng zsb rdksxt vtbjjlg fvdd nshgxhq xkxvrm hzvh spbkv dmlpn hcg ldggpnn gbtmdb qcxdbh mmbbcm jxnf vfvvnm fcppz fhpdhz ntc hdlkgft sxgkn cmdl kxshrl zgrclc srrhv nfhj", "dairy, sesame"),("hnk vrpkhg rdksxt jbtjbj vfvvnm zgtnsh jhpd mplkr hxntcz qblxkq cbnz xsmc nxksj qrfvhh zxbfhrs spbkv ldggpnn ckzrn zhlmsn xknb gbtmdb bvgm hzvh ntkjt nxxxc dztng hl sbjvmx ncs fhpdhz xltv gb xrlljb bktzrz ftzdbf cmdl sxgkn prg qqgv zmgsxd sghx sdhkr lvmf vxtkg npcd pxls psmzk thjnz srrhv dvxptd vbn", "dairy, wheat, sesame"),("sblmknh lbbztc dmlpn hlj cczvdhx ggbcmjmc vxtkg xltv srzqtccv qnvp nxksj qrgsbb gbtmdb nxxxc xgx hxntcz jsp drmr gjbdb vrpkhg cql nsjtzn bvgm cthrglq vfvvnm gtfhn lmghcl nxvx ckzrn mdqfj mnvn cdvxz gpsgbp jfb rhvppq jdmg jhpd qtmnj jxnf crjjvr rfpzm dztng xvcfsc bstlrlb zqfh bvrdq mmbbcm jbtjbj ttmqqkp rdksxt gsxk vtbjjlg trpclz ncs qxtzl bzknq svbmd nbrmxl dzlrq cppld flvmtng srrhv bktzrz ftzdbf hlfsfxt jxr rkm sdhkr gxm fslj hzvh", "sesame"),("bnjhvjm xbk hxntcz ptqbrz qpc zsb tsddbt qdsqx rdksxt hlj ssnrp qqgv zfcmvxj mmbbcm vbn vfvvnm msvx srzqtccv bvgm jklfqg mplkr fvfpdf ftzdbf srzcq pdc sdvng fcrvr drmr hcg mdjzx nbrmxl vtbjjlg cvrd zgrclc xkxvrm kdlrt lmghcl prg hfts hhlkfng tnhk zmgsxd mnvn nsjtzn fdddkd xknb qrgsbb xpcbp bzknq bktzrz lqfts lvmf crjjvr tztv xsmc mzj", "peanuts, nuts, dairy"),("xltv bvgm hnk qkdg vvgfqqn srzqtccv mlbhm rkm ptqbrz rdbdng tztv sgjkh srrhv xsmc nxxxc lbhrh dbh gbtmdb ntkjt crjjvr rlxgn ldggpnn fhpdhz trpclz vxtkg gsxk zhlmsn hxntcz nxksj mplkr srzcq jbtjbj jxnf mhvf zgtnsh nfhj rdksxt jfb lkjmpqlv hhlkfng qkrl jdmg qdsqx fcrvr cppld vhnl xknb fkmshtk mmbbcm ndvzt cthrglq qblxkq vtbjjlg bplvg vfvvnm npcd hlfsfxt prg zmgsxd qnvp qtmnj hlj hvvtd bnjhvjm mtnx rfpzm", "nuts, soy, wheat"),("zgtnsh xkxvrm mlbhm jklfqg nxvx mzj srrhv lqfts sxgkn bvgm thjnz mnvn prg hdlkgft gtfhn rdbdng jxr srzqtccv trpclz cdvxz rlxgn zxlvks ldggpnn slb qcxdbh dztng jhpd qzzq cql ntc zxbfhrs sghx nsjtzn ndvzt mltghx qrgsbb ljmjtcz gb xbk fcppz nxxxc grxqh ptqbrz xkjxpf qnvp bktzrz nshgxhq hfts xvcfsc fvdd ncs kfkgkjf fcrvr gbtmdb crjjvr xsmc hxntcz hlfsfxt cbnz rdksxt qblxkq nxbtmj nbrmxl lbhrh dzlrq mdqfj tnhk vfvvnm ljppc kxshrl qpc rhvppq ssnrp", "sesame, soy, peanuts"),("mnvn bcqbb xnm kdlrt lqfts lvmf ggbcmjmc qcxdbh hlj grxqh lxzk gxm trpclz fhpdhz ttmqqkp sxgkn sxngk sghx bstlrlb zgtnsh pqtkn gbtmdb mltghx vfvvnm bktzrz hvvtd bvgm qzjgv dvxptd bzknq zfcmvxj zgrclc ncs cppld fslj nzll srzqtccv lbhrh cdvxz pxls xknb nfhj ztv bgjjk xgx qdsqx gmhgp fxxczb mksnnv fdddkd tsddbt hdlkgft krkmhc psmzk sbjvmx jzdtn hcg hfts xsmc rdksxt", "eggs, fish"),("sgjkh qzzq vrpkhg qtmnj fzsqhg vbn qpc fjms fslj bgjjk zsb hxntcz vfvvnm tqkc jxnf bktzrz qrgsbb gpsgbp rfpzm nxbtmj gbtmdb vvgfqqn tnhk tsddbt prg rrzmn zfcmvxj grxqh njvktm jbtjbj ttmqqkp xnm mhvf rdbdng jjqlc cbnz mcfs rdksxt mplkr qnvp xknb lmghcl cqdb hvvtd mdqfj dtlfc dbh qcxdbh bvgm jdmg jxr gnfnxx xbk fvfpdf fkmshtk dvxptd qqgv slb hfts vxz", "wheat, dairy, peanuts"),("pqtkn zmgsxd drmr mmbbcm nfhj ckzrn dztng gb pdc fkmshtk gnfnxx vxz gbtmdb psmzk mltghx fcppz mcfs vxtkg cthrglq cvrd rhvppq nxksj cppld dtlfc bplvg bcqbb rrzmn mnvn mdqfj rkm ljppc gjbdb gsxk qqgv fhpdhz fdddkd ljmjtcz sfj tztv zgrclc bgjjk ssnrp gmhgp qcxdbh flvmtng ggbcmjmc bvgm nsjtzn rdksxt xnm rfpzm jxnf hnk cczvdhx zxlvks bktzrz qrgsbb trpclz bzknq cdvxz xltv vfvvnm lvmf hzvh bvrdq rdbdng srzqtccv thjnz ztv vrpkhg hhlkfng hvvtd xknb", "fish, eggs, wheat"),("gnfnxx nxvx vbn jxnf krkmhc hlfsfxt cvrd xknb hcg srzqtccv bnjhvjm pqtkn hnk jfb tsddbt gb mplkr nsjtzn hlj jxr qzjgv cql vtbjjlg tnhk bzknq rlxgn npcd lmghcl gmhgp qblxkq zhlmsn slb bplvg cczvdhx zsb mtnx gbtmdb tvdfjnqc ldggpnn flvmtng qkrl cdvxz hxntcz bktzrz vrpkhg nxksj msvx ljmjtcz fvdd vfvvnm qzzq jjqlc hl pdc hzvh zfcmvxj bcqbb sfj xbk mlbhm lqfts ztv dtlfc rdksxt qrfvhh ftzdbf szjzjnbn mnvn sblmknh srzcq qkdg ttmqqkp xrlljb dztng zmgsxd zgtnsh dxtggp", "fish, sesame, peanuts"),("spbkv jzdtn rhvppq vxz fdddkd cczvdhx svbmd qzjgv fhpdhz xvcfsc lmghcl ptqbrz hl bvrdq hxntcz ckzrn gbtmdb rfpzm jbtjbj crjjvr gnfnxx fxxczb qrfvhh hcg sblmknh cthrglq sgjkh hvvtd mltghx lnrsm mlbhm xgx qnvp vxtkg ldggpnn ggbcmjmc jsp zgrclc fzsqhg fvdd srzqtccv rdksxt ntc ssnrp bvgm vfvvnm srrhv nxbtmj jhpd krkmhc bktzrz ttmqqkp xnm ncs prg cbnz mtnx gb grxqh srzcq pdc gmhgp psmzk ndvzt tnhk nfhj jjqlc npcd fjms fslj rkm qtmnj msvx sxgkn gxm bnjhvjm cvrd qzzq hzvh mksnnv nxvx rrzmn nbrmxl cmdl", "soy, eggs, peanuts"),("ssnrp hxntcz mltghx rrzmn zxlvks sfj fdddkd jsp hhlkfng bnjhvjm mdjzx qnvp gb njvktm sblmknh lnrsm rhvppq dtlfc xvcfsc qpc dmlpn hnk vtbjjlg fvfpdf hzvh qzzq gjbdb rdbdng lmghcl jklfqg bstlrlb gpsgbp cbnz jhpd qtmnj bvgm qcxdbh trpclz hlfsfxt qrfvhh zgrclc vvgfqqn xrlljb sdvng mhvf jdmg vfvvnm scxgb rdksxt lbhrh krkmhc cczvdhx gnfnxx zqfh hvvtd hl vbn rfpzm xknb mnvn lkjmpqlv srzqtccv tvdfjnqc gbtmdb qzjgv", "soy, fish"),("vxz hl sdvng cczvdhx fcrvr mlbhm vvgfqqn bnjhvjm lbhrh rfpzm dtlfc mltghx dbh mhvf ndvzt rlxgn rdksxt lnrsm fhpdhz gbtmdb hhlkfng prg vtbjjlg ptqbrz hxntcz bvgm srzqtccv fslj crjjvr gjbdb lbbztc hdlkgft mzj cppld xrlljb mmbbcm ftzdbf hlfsfxt xpcbp bzknq drmr cdvxz lkjmpqlv nsjtzn bcqbb tsddbt xsmc rhvppq msvx jhpd qblxkq vhnl jbtjbj hcg bplvg gpsgbp jsp vfvvnm lvmf jklfqg bstlrlb nbrmxl dztng qkdg ztkgdb bvrdq mnvn lmghcl bktzrz pqtkn sdhkr flvmtng", "sesame, wheat, eggs"),("fxxczb fvfpdf gmhgp ldggpnn xvcfsc srzqtccv ckzrn mplkr xknb hcg dztng qrgsbb cmdl lkjmpqlv sgjkh thjnz bvgm xpcbp zgtnsh dxtggp bplvg xgx gsxk lvmf zhlmsn krkmhc qxtzl ztkgdb lbbztc jdmg mdjzx vxtkg zgrclc njvktm ldvmdh mltghx cthrglq hlj bstlrlb prg mnvn ssnrp zsb nbrmxl pxls gbtmdb nzll hhlkfng qnvp bktzrz ncs rdksxt ptqbrz nxxxc qqgv tnhk rlxgn rfpzm vfvvnm jsp sdhkr mzj mdqfj hl cppld qtmnj dmlpn gb trpclz lqfts xsmc fcrvr zxbfhrs npcd qcxdbh grxqh ljmjtcz xnm", "dairy, wheat, nuts"),("gmhgp rdksxt fcrvr vvgfqqn lvmf mtnx qrgsbb bktzrz npcd xgx cdvxz gxm qnvp qzjgv fvfpdf lxzk xbk zhlmsn nxksj ldggpnn kdlrt zfcmvxj ljmjtcz tsddbt hxntcz zxbfhrs xknb ssnrp qtmnj zmgsxd vfvvnm cczvdhx lmghcl ckzrn jsp ptqbrz ldvmdh gbtmdb ncs drmr cthrglq rdbdng vxtkg lqfts pqtkn srzcq tvdfjnqc hcg sblmknh vrpkhg dbh srzqtccv bstlrlb srrhv xsmc hdlkgft tqkc nxxxc lnrsm zsb fxxczb gb qkrl", "peanuts, soy, dairy"),("hlj qtmnj bgjjk cql srzqtccv xltv dvxptd qzjgv bktzrz spbkv nfhj krkmhc jxr jxnf gnfnxx qkdg nshgxhq cthrglq rlxgn qrgsbb prg cdvxz nxksj dmlpn vbn ggbcmjmc hfts hl ftzdbf qblxkq cvrd xgx vhnl slb gbtmdb vfvvnm srrhv npcd xrlljb psmzk srzcq qpc qqgv sblmknh xbk ncs xkjxpf qrfvhh gsxk nsjtzn dztng nxxxc ssnrp fzsqhg fjms msvx bvrdq zxbfhrs zqfh mnvn rdksxt sxngk cbnz ztv thjnz drmr tztv jhpd xknb mplkr lbhrh vtbjjlg hxntcz sfj jfb tvdfjnqc", "peanuts, sesame, soy"),("ldggpnn cmdl trpclz sbjvmx vxz dtlfc mplkr cczvdhx vvgfqqn sgjkh vxtkg ndvzt ftzdbf nxbtmj nbrmxl qxtzl dmlpn fvfpdf xknb lqfts fcppz kfkgkjf xgx sxgkn gbtmdb ssnrp fslj rdksxt nfhj svbmd zqfh hhlkfng slb jbtjbj nsjtzn cthrglq ttmqqkp psmzk bvgm lvmf jsp sghx sdhkr hzvh cql tvdfjnqc sfj crjjvr bnjhvjm fxxczb nzll qrfvhh qrgsbb qnvp vfvvnm thjnz mdjzx mksnnv hxntcz gjbdb bktzrz ztkgdb hlj xkjxpf jxnf ckzrn gmhgp mhvf", "eggs"),("gb zgtnsh kdlrt cmdl hvvtd sdvng vtbjjlg tsddbt qzzq mtnx lbbztc mcfs rrzmn kfkgkjf lmghcl dmlpn thjnz rlxgn hlj cbnz hfts dzlrq bnjhvjm ntkjt zhlmsn qpc mksnnv flvmtng gpsgbp hhlkfng tnhk sgjkh mnvn xvcfsc hnk mdjzx qkdg xbk qrfvhh svbmd ldggpnn sbjvmx xknb pxls mhvf lbhrh cdvxz ptqbrz hl rdksxt fxxczb slb sfj gxm nsjtzn xltv cczvdhx nxksj drmr qdsqx sxngk srzqtccv nshgxhq ztkgdb ndvzt bplvg nzll qnvp lkjmpqlv bktzrz ssnrp tqkc mltghx gbtmdb ftzdbf gtfhn vfvvnm pqtkn srzcq bvgm", "wheat, sesame, fish"),("sbjvmx drmr fjms zfcmvxj xknb bgjjk jxr sdhkr nshgxhq ntkjt thjnz rdksxt xnm vhnl mksnnv jbtjbj scxgb ttmqqkp pdc lkjmpqlv gmhgp lbbztc dztng qtmnj sghx ldggpnn fcrvr xgx szjzjnbn cthrglq bvgm cdvxz lnrsm mmbbcm dvxptd bstlrlb hlfsfxt mdqfj cqdb ldvmdh fkmshtk jjqlc lxzk gpsgbp spbkv sfj nsjtzn zqfh dtlfc ztkgdb tvdfjnqc rfpzm psmzk jhpd hxntcz gnfnxx hl zhlmsn srrhv msvx hhlkfng kfkgkjf rhvppq krkmhc bnjhvjm bplvg slb qkdg gjbdb rlxgn gbtmdb zmgsxd ftzdbf cczvdhx ckzrn rrzmn flvmtng sblmknh mlbhm jfb srzqtccv vxtkg srzcq vfvvnm gb", "fish, eggs, wheat"),("lvmf ljmjtcz kxshrl ggbcmjmc zsb bvgm qzjgv hlj rfpzm xltv slb thjnz nxxxc nzll srzqtccv rdksxt zgtnsh sghx fcppz tztv fvfpdf cqdb mhvf bktzrz sxgkn dzlrq jdmg qtmnj mzj gbtmdb qrgsbb vfvvnm ptqbrz tsddbt ldvmdh pxls zmgsxd sblmknh qblxkq ztkgdb hxntcz sfj ztv hnk sgjkh fzsqhg zxbfhrs lkjmpqlv hdlkgft fxxczb lmghcl jklfqg xnm", "wheat"),("zmgsxd hvvtd qqgv gsxk vbn jxr hxntcz sghx thjnz cdvxz rkm fdddkd mdjzx sdhkr pxls pdc ljmjtcz mltghx fvdd zqfh xknb kdlrt bktzrz njvktm gpsgbp mdqfj qblxkq dtlfc psmzk nfhj jklfqg zxbfhrs cqdb cvrd fxxczb qpc mmbbcm fjms mplkr ncs nzll msvx gbtmdb qrfvhh qrgsbb ckzrn hzvh gjbdb lqfts cppld fvfpdf vfvvnm bstlrlb nxbtmj qzzq hcg vhnl ftzdbf mtnx crjjvr jdmg ssnrp zsb lbhrh xnm srzqtccv ptqbrz sbjvmx jfb trpclz gtfhn xrlljb bcqbb bvgm lbbztc mnvn kfkgkjf fkmshtk", "sesame, nuts")]; 5 | 6 | aoc2020::main! { 7 | let mut candidates = HashMap::new(); 8 | for (list, allergens) in &INPUT { 9 | let ingredients = list.split_whitespace().collect::>(); 10 | for a in allergens.split(", ") { 11 | let set = candidates.entry(a).or_insert_with(|| ingredients.clone()); 12 | *set = &*set & &ingredients; 13 | } 14 | } 15 | 16 | let mut allergen_map = HashMap::new(); 17 | while let Some((&a,_)) = candidates.iter().find(|(_, s)| s.len() == 1) { 18 | let &i = candidates[a].iter().next().unwrap(); 19 | allergen_map.insert(a,i); 20 | for s in candidates.values_mut() { s.remove(&i); } 21 | } 22 | 23 | let allergens = allergen_map.values().collect::>(); 24 | let part_one = INPUT.iter() 25 | .flat_map(|(s,_)| s.split_whitespace()) 26 | .filter(|i| !allergens.contains(i)) 27 | .count(); 28 | let part_two = allergen_map.iter() 29 | .sorted() 30 | .map(|(_,i)| i) 31 | .join(","); 32 | (part_one, part_two) 33 | } 34 | -------------------------------------------------------------------------------- /src/bin/22.rs: -------------------------------------------------------------------------------- 1 | use std::collections::*; 2 | use std::hash::{Hash, Hasher}; 3 | 4 | static PLAYER1: [u8; 25] = [45,10,43,46,25,36,16,38,30,15,26,34,9,2,44,1,4,40,5,24,49,3,41,19,13]; 5 | static PLAYER2: [u8; 25] = [28,50,37,20,6,42,32,47,39,22,14,7,21,17,27,8,48,11,23,12,18,35,29,33,31]; 6 | 7 | fn hash(d1: &VecDeque, d2: &VecDeque) -> u64 { 8 | let mut hasher = hash_map::DefaultHasher::new(); 9 | d1.hash(&mut hasher); 10 | d2.hash(&mut hasher); 11 | hasher.finish() 12 | } 13 | 14 | fn score(deck: &VecDeque) -> usize { 15 | deck.iter() 16 | .rev() 17 | .enumerate() 18 | .map(|(i,&n)| (i+1) * n as usize) 19 | .sum() 20 | } 21 | 22 | fn part_one() -> usize { 23 | let mut p1 = PLAYER1.iter().copied().collect::>(); 24 | let mut p2 = PLAYER2.iter().copied().collect::>(); 25 | while !p1.is_empty() && !p2.is_empty() { 26 | let (c1,c2) = (p1.pop_front().unwrap(), p2.pop_front().unwrap()); 27 | if c1 > c2 { 28 | p1.extend(&[c1,c2]); 29 | } else { 30 | p2.extend(&[c2,c1]); 31 | } 32 | } 33 | score(if p2.is_empty() {&p1} else {&p2}) 34 | } 35 | 36 | fn game(p1: &mut VecDeque, p2: &mut VecDeque) -> usize { 37 | let mut seen = HashSet::new(); 38 | while !p1.is_empty() && !p2.is_empty() { 39 | if !seen.insert(hash(&p1, &p2)) { 40 | return 1; 41 | } 42 | 43 | let c1 = p1.pop_front().unwrap() as usize; 44 | let c2 = p2.pop_front().unwrap() as usize; 45 | let winner = if c1 <= p1.len() && c2 <= p2.len() { 46 | let mut p1 = p1.iter().take(c1).copied().collect(); 47 | let mut p2 = p2.iter().take(c2).copied().collect(); 48 | game(&mut p1, &mut p2) 49 | } else { 50 | if c1 > c2 {1} else {2} 51 | }; 52 | 53 | if winner == 1 { 54 | p1.extend(&[c1 as u8, c2 as u8]); 55 | } else { 56 | p2.extend(&[c2 as u8, c1 as u8]); 57 | } 58 | } 59 | if p2.is_empty() {1} else {2} 60 | } 61 | 62 | fn part_two() -> usize { 63 | let mut p1 = PLAYER1.iter().copied().collect(); 64 | let mut p2 = PLAYER2.iter().copied().collect(); 65 | let winner = game(&mut p1, &mut p2); 66 | score(if winner == 1 {&p1} else {&p2}) 67 | } 68 | 69 | aoc2020::main! { 70 | (part_one(), part_two()) 71 | } 72 | -------------------------------------------------------------------------------- /src/bin/23.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #define VAL(n) (n - list) // assumes the list is visible 6 | 7 | int INPUT[] = {4,6,3,5,2,8,1,7,9}; 8 | 9 | typedef struct Node { struct Node *next; } Node; 10 | 11 | Node* build_list(int size) { 12 | Node *list = malloc(sizeof(Node) * size); 13 | Node *curr = list + INPUT[0]; 14 | for (int i = 1; i < size; curr = curr->next, ++i) 15 | curr->next = list + (i < 9 ? INPUT[i] : i + 1); 16 | curr->next = list + INPUT[0]; 17 | return list; 18 | } 19 | 20 | Node* simulate_game(int size, int rounds) { 21 | Node *list = build_list(size); 22 | Node *curr = list + INPUT[0]; 23 | for (int i = 0; i < rounds; curr = curr->next, ++i) { 24 | Node *a = curr->next, *b = a->next, *c = b->next; 25 | int t = (VAL(curr) == 1 ? size : VAL(curr) - 1); 26 | while (t == VAL(a) || t == VAL(b) || t == VAL(c)) 27 | t = (t == 1 ? size : t - 1); 28 | Node *dest = list + t; 29 | 30 | curr->next = c->next; 31 | c->next = dest->next; 32 | dest->next = a; 33 | } 34 | return list; 35 | } 36 | 37 | int part_one(void) { 38 | Node *list = simulate_game(9, 100); 39 | int ans = 0; 40 | for (Node *n = list[1].next; n != list + 1; n = n->next) 41 | ans = ans * 10 + VAL(n); 42 | return ans; 43 | } 44 | 45 | long part_two(void) { 46 | Node *list = simulate_game(1000000, 10000000); 47 | return VAL(list[1].next) * VAL(list[1].next->next); 48 | } 49 | 50 | int main() { 51 | printf("Part one: %d\n", part_one()); 52 | printf("Part two: %ld\n", part_two()); 53 | printf("Time: %ldms\n", clock() / (CLOCKS_PER_SEC / 1000)); 54 | } 55 | -------------------------------------------------------------------------------- /src/bin/23.rs: -------------------------------------------------------------------------------- 1 | static INPUT: [usize; 9] = [4,6,3,5,2,8,1,7,9]; 2 | 3 | fn build_list(size: usize) -> Vec { 4 | let mut v = vec![0; size+1]; 5 | let last = (1..size).fold(INPUT[0], |curr, i| { 6 | v[curr] = if i < 9 {INPUT[i]} else {i+1}; 7 | v[curr] 8 | }); 9 | v[last] = INPUT[0]; 10 | v 11 | } 12 | 13 | fn simulate_game(size: usize, rounds: usize) -> Vec { 14 | let mut list = build_list(size); 15 | let mut curr = INPUT[0]; 16 | for _ in 0..rounds { 17 | let (a,b,c) = (list[curr], list[list[curr]], list[list[list[curr]]]); 18 | let mut t = if curr == 1 {size} else {curr-1}; 19 | while t == a || t == b || t == c { 20 | t = if t == 1 {size} else {t-1}; 21 | } 22 | list[curr] = list[c]; 23 | list[c] = list[t]; 24 | list[t] = a; 25 | curr = list[curr]; 26 | } 27 | list 28 | } 29 | 30 | fn part_one() -> usize { 31 | let list = simulate_game(9, 100); 32 | let (mut ans, mut curr) = (0, list[1]); 33 | while curr != 1 { 34 | ans = ans * 10 + curr; 35 | curr = list[curr]; 36 | } 37 | ans 38 | } 39 | 40 | fn part_two() -> usize { 41 | let list = simulate_game(1000000, 10000000); 42 | list[1] * list[list[1]] 43 | } 44 | 45 | aoc2020::main! { 46 | (part_one(), part_two()) 47 | } 48 | -------------------------------------------------------------------------------- /src/bin/24.rs: -------------------------------------------------------------------------------- 1 | use std::collections::*; 2 | 3 | static INPUT: [&[u8]; 394] = [b"swswwneswswswswseswewwswswsewseswneesw",b"nwenwnwsenwnwsewswnenw",b"swswwswswswewswswnewswsewwswswwsw",b"nwswswswswwneswsweswenwswswwsewswswswsw",b"sewnwnwwwnwenwnwsenwnwwwnw",b"sesesesweswseeseswnwswwswwseseneswnw",b"wsenweneswseseseeeeseeneeseeeese",b"neenwneneseneeneeeneseswnwnweesenene",b"swneswsewwwwwwswwswwswneswswwsw",b"swwwswswswweswswnewswwswsewnwswwsw",b"eswnweneeenwnwnenweeseeeweswswee",b"wneneseswswwseseswswnwseeeswseseswsw",b"wnwesenwswnesewnwneeswenwnwnenwnwwnw",b"swswswswswswswseswesenwseswwswweswnwne",b"nwwenwswnwnwnwwnwnwnwenenwnwsenwnwnenw",b"nwwnenwwnwnwenwwnwwwwsewnwwsew",b"wsenwwswwswesweeseneswnwswne",b"wsenwnewnwnwseenwnwsenewsesewewne",b"nwsesenwwnwsenwnwnwnwnewswenwnenwnwnwne",b"eesenwnewesenwneswseeseseeesweew",b"seseswsenenwswswswseswswswswseseeswwsw",b"nenwnenwnwenwswnwnwnwne",b"nwswsenwseewswsenwseseesweswnesenw",b"wnwwswenwsewwnwwwnwnww",b"seswnwsenwnwseswseseswseseeseseseenwse",b"esewswwwswwnewswwwwswwwwnww",b"eneseeeeeneewseneeneenweeee",b"wneswwswwswswnwwwswswswneswsewswswe",b"swswneswswsweswswswwwnwsweswswswswswsw",b"nesenenwnwnesewnwnenwswnesenwnwnenwnwne",b"neneswnweneeenwnwwnwseseeeneewswsew",b"nenwseneeseneneswneeeeeeneenwenw",b"neeswswnwseswswsesenwswswswswneseneswse",b"wswewswwswwsewnwwneswwswswsenew",b"nwnenwseswneseswswswswnwsesesweneenw",b"sesweseseseseseswnwseseseeseeesenwse",b"wneneswneenwwewnesenenweneneew",b"swswseseeneseswswswsenwswswsesesenwsesw",b"seewwwwwswwneswswswswnewwwnwnwsw",b"swwwsewwwnenewwnenwnwsewneseswe",b"neneseswsesenwseswwswsweswseswswseswswsw",b"swwnwwswswswwwswneswwwwwswewe",b"enewewneeseeeeeeeseneweesee",b"swnwnewnewswswswseswnweswswnwsene",b"swenwneeeneeesenwseesewneenwwneee",b"wnwnweswwnwwwnwswewwnwseswneew",b"swseeeeseeenewweesesenweese",b"nwsenenwnwnwsenwwsenw",b"eesewwwseeeneeseneeseeenweese",b"eeneeswneswneesweenenwneneneneenew",b"senwenenwswswseseneeswswswwwwsenwwenw",b"wwwnwnewwwenwwnwnwsewnweswsewse",b"nwnwnwnwnwnwnwnenwswnwnwsenwnenw",b"neseeenewnewsenenew",b"senwnwnwwnwnwnwswnewnwnenwwnwnwnwsenw",b"seswseeseseswnewseneswseswwnwseneswne",b"seseseseseneneseswseew",b"nwneenenwsweneeeweswseswenenenese",b"wnwnwnwnwwnwnwnwewswswnenwnwwnwww",b"wwnwswwneswswwnewwwsewseeenww",b"wnwenwsenwnenwnwnenesww",b"senewneneneneneseneswnweneneneneneee",b"sewnwsenwnwnwsenenwwnwwewwnwwnww",b"eseneswwwswswswswswswenwswsweswswsesw",b"nenewswweseeneeseeweeeeneswnwsw",b"swswnwwwsewseswswswnwwswseswwneswsw",b"nwnewnesenwnesenwwnwnwnewenwnewsenesw",b"seeswnwenwseseewseeeseneeswseesenwsw",b"swswseswswswsweseswswsenwswswnwswswseese",b"wswswwnwnwwswswseewswwweneswnwwse",b"eswseswswswwwwswnwwnwewnwwneww",b"swswsesenwneweseenweeseeswnwnweswse",b"wwwswneswwnewwswswswwwewwnwsew",b"wneswnenenewnenenenenenweswnweenew",b"enwnwnwnwnwnewnwnwnwnwenwnwnwnwwnw",b"eeeesenweeeeeesewewenwee",b"seseseeseeseseenwnwsesesesesenweswse",b"sesewnweenwnesenwnwswnwnenenwswwnesenwnw",b"swnwseswwswwwwwnenwswswsenwswewne",b"weseswsewswswseseneseseneesesesewse",b"senwwnewnwnewsenewseswswwwwswseww",b"swnwneneswswwneesenenwenwwneswneneeee",b"wswnwswnwneswswwsweswseneswsweewsenw",b"seneseseneswseweesenwseseenesewesese",b"seeesweeenwenweseseseeeeseee",b"seseseeseeenwnwseseseseswsesesewsesese",b"swnenwswenwnwnwenwnweswswweneswsenwne",b"swswnenwnenweneneseeewnenwnwswnwswnenw",b"swseseseseseseesesenenwseswseseseseseswnwsw",b"eneseeseseeseseeseseewse",b"swnenwswwswseswswswswswswswswswwswsew",b"eswnenewswswnweeeeeeeeeeseee",b"swwneswsenwnwsewnwnenewnwnwsenw",b"nweneeesweeneneneneswneeneenenee",b"eeeeseneeswew",b"nwnwnwnwnewnwnenwnwnwnenwnenwe",b"newswneswswsewnwswswswwwswswswseswsw",b"nweswswswseswseswseseswswnw",b"sesenesesesewseeseseweeesesewsew",b"swseseswswswswswneswseswsw",b"neseseswseseswsewwseneseswsenwewsesw",b"eenwwwwswswswswnenwseswswseswswww",b"seseseswseseneseeseseseee",b"esweesenweeesenenweesesweeee",b"eswseeewseeeeeeeesewewwenw",b"nwewwsewwwwsenwwnwswnewwwnwnw",b"swsewwwwswswswswnwwwwswsweesww",b"wsewswsenwneeswwwwenwwswweswswwne",b"eseswseneesesenwseesesewesesesene",b"neeeswnwseeswnweesenenwenenewene",b"seneneseeneeeneeeeenwneeenenew",b"eneenwenweneneneneneeneseswwse",b"neeesenwswswwwswnwsewnwswwwswswsw",b"swnwswswswseswswneseswswswsesenewswwswne",b"neneneeneneneneswnesenwswneneneneeneene",b"nwswnenwnwnwnwnwnwsenewnwnenwnenwnwnwnw",b"weeeeeeeeneeeesweeeeeew",b"nwnwnenwnwnwnwnwwnwswesenwnwnwnwnwnwnwnwse",b"nenwwwnwnwnwnwnwnwneswnwnwnwnenwnesee",b"wswnewneneewesewweseeswnewnwwsew",b"nwneseswnewneneneneneeneneswnenwwnenene",b"senwesenenewnwnenwnwnwnwnenwwnwnw",b"senesesweneeewneseswsewe",b"swwwwnewswwswwswswesewwswswswnw",b"weenwnwnwseneneswseenwnwnwnwnenwswnenene",b"seswnwesweeeeenweesee",b"wswwwwwwswewswsewnwswwnewwww",b"wwwwwnwsewnesewwwwnenwsewsenwwe",b"seswnewsenwwnwwesw",b"seenwsesesenwswsenwsenweswswswswnwswenw",b"seswnenwneneswsenwswwwesw",b"wnwwwwwwewnwwsw",b"swsenwsenwnwnenwwenwwswseseewsenww",b"enwswnwnwnwnwnwnwnwsewnwswsenenwneenew",b"neneseneewnenwneneenewnenenenwnenenene",b"nwnwwnewnwnwnwnwseeswswsenesenwwnwne",b"swneeswswnwswsenwnwswseneseeeswswswne",b"swweswneswswneswsesewnw",b"swwswenwneswseseswsesesesesenwseswnese",b"wnwnwseweenenwnwsenwswneenwnesenene",b"swswseseswswsewswswseesesesw",b"neseeeewwnwnenwseeeeswee",b"swnwneeswwneswswsewswewswsewswwwww",b"nenwesesesesesewwneswsweseweesesee",b"nesenesewnwwnwnwsenewnwwnenenwenwsene",b"swenwenwneeeswsweeseneeneneswe",b"swswsewneswswwswswwsww",b"nwnwnwnwnwnwnwnwsenenwnwnw",b"nwnwewnwwnwnwnwnwnwswnwenwnwnw",b"senwswnwwnesenwswneswnwwwsenwsenenee",b"neswseswenenwwnwnwnenwwnwenwnwnenwne",b"nenwnenenenenwnenenenesenwnenene",b"neesenenewnenesenenewneneeneneenenene",b"nwwnenwnwneenenenenenwnwnenenewseenene",b"senenewsenwnwnwnwnenwnenenwnwnewnenwnwnwse",b"ewnwwnwwwwsew",b"swseswwwswswwswneswenewswwswswswswswsw",b"sweneeeseeenwneseswseswseeneeswese",b"nwwnenwnwnenwnwnwnwnenwnwnwsenwnwswnwneswe",b"eeeeeeeweneeweeseeneeee",b"swenweseswenwnwswswnwnenese",b"nwwnwneeswsenwwsenwnenwenwwnwwnwnw",b"nenewseswwnenenewneseneesenenwnenenene",b"nenenwnenenenwnesenwnesenenenene",b"nenenenenewneneneneneseneneneswnenwnewse",b"wseseseseswsesesesesenwswenwseesenwne",b"eenesewneneseenenenesenewneeewne",b"seseswwseeswnwseswseweswswswswneswse",b"neeneneneneseswneneewneneneenenewene",b"eesenweesweeesesee",b"wseswwnwwwnwwnwneenenwnwswnwsenwnewe",b"wwnwewswwweswwwswswwwsweww",b"esweewweenwseswesweneeenwene",b"eewneneneewneneeeneneneneenee",b"seneseseseeseswsenwwseseseeseseseewse",b"eeneeneesenewneneneee",b"swwswenwswswswswswswsweswswswnwswswsw",b"wnwswweewwwnwwswwwwenwwnw",b"nweneseewwwwseenwenenwnwenwswwnw",b"eeesweseeweeeenwseneeewesenw",b"eenewneeeeseewseeeeeeee",b"ewseswneeeseneeenewenene",b"senwnwnwnenenwnenwnenwnwnwnwnw",b"nwnwnwnenwnwswnwwnwnwnwswnwnwnwne",b"nwnenwneswnwnewswnwseenenenwnenenenese",b"nwswnwnwnwwenwesenwswwnwnweneseswese",b"nwnwwwwsewweneswswwwsewnwnwenenw",b"esenwesesesweseseswsenwseseseseseenwsesw",b"eeeneeeseeseeeesewsweneewswe",b"ewswsweeeneeenweeneeewneseneee",b"seseseseseswsesesesesesenwsenwswswswsenw",b"neenwwsweeneswsesesesesewwseneesw",b"eseswweeseeneswnweeeeeseneese",b"swswnwswswnwseswswswnwswsweswsweswneesw",b"seseenwwnwneneweeseswseseswseswsenwse",b"seneseswswswswswswswseseseseswsw",b"eeewseseneseseseseseeeeseese",b"enwnwnwnwswnwnwnwnwnwnwnwwnwwnw",b"seseseswnwseseeseseeeeesese",b"swneswseswswwswswwneswswswswwswswsw",b"wwwsenwwwnwswnwwwswewnwwwnwe",b"seseswneneseswswneseswswsenwsesesesesesew",b"senwswswswsweeswnwse",b"senwnwenwnwneswwnweswnwnenweeswnwnww",b"neeswesewesewnwnwnewswseswseseswne",b"nwwwnwwsewnenwnwwnwnwnwsewwnwwnw",b"wwswnwwswneswwwwwwewwwwsww",b"swwseseseeseswwnewseneneswseswsw",b"eewsewseeseeneseseeneeseseeee",b"swswseneseswwseseseswne",b"swswnweswswswnwswswswswswswswswesw",b"seneseswsewseseswseswseseseswsesene",b"swsesesesesesewsesesewseeseseseenwse",b"swswnweneeeeeneenweeswenweeese",b"seeeewnweswneeeneeeeeenwneeee",b"nenwnenenwnwswesesesesewneneswwwewse",b"swswswnwnwsweswwwsweswwswswswswswswsw",b"wnwenwnenwenenwseswsesewswnw",b"neswswseswswseseswnwseswswswswswswswswswnw",b"neeseesesewseswnwesweswnewneewnwe",b"seseseewnweeseneseeseseseesesesese",b"nwneneneeswneneweeneneneesesenwne",b"neneneneneneseswnewneneseneneneneenewne",b"wwnwwewnwnenwnewwswwnwsewwnw",b"eeseeseswnenweseesenweeswesesesw",b"wswsweswswwnwswswswsw",b"eswseneneswseswswsenwswwwneswwwswse",b"enwseseseseseeswsewesenewwse",b"nenenewswseseenenenwneswwnewswneeneenw",b"swwnwneseeesweswswseeneenwnweswne",b"eeseeseenweesesesesese",b"swwenwsweneswsesweswswswswswswswnwswswnw",b"swwesenenewnwneneeswnwneeswnwswnenwe",b"swswswsesesweswswswswnwswsw",b"wnewwwsewswseeewnwwswwnewewnew",b"neeseneseswenwseseseeswswsewsesenwenw",b"swnenesewswswneswswwswswswwswswneseswsww",b"seswneneeeneneneswwneseswnenwneswnenenw",b"senweswwswswwwwwwwwnewwwswsew",b"wnwwwwsenwwnewenwwwwnwwnwwew",b"neneeseswswnenewseneneenenewnenwneneww",b"senenwnwseseneswnwswnwwwewwswnwneeww",b"sesesesesenwseseesesesesewswseseswese",b"sesesesesewneswseswswswswseswswnwseswswe",b"senwnwneneneenenenwwneswnwnenenenenwnw",b"wnwnwwwnenwwwsenw",b"seesewwweeseeeseeeseseeseee",b"swswswswseswseswsweseseswswwswewswnwne",b"eseeeeswseseenwseesesesweesesenw",b"nwnwswnwenwwewnwnwnewnwnwnenwnwswnw",b"seswnenwwenwnwnwnwnwnwnwnwnwnwnenwnwnw",b"wwseswwwswewswnwwnewneswwenwnw",b"seseswseeswswsenwsesewswneswseswseseswsw",b"swswswswnwswseseseneswseseswswswswnwneswsw",b"wwewnwwwsweseswwwwwwwwwnese",b"swswnwneweswswswswswneswswewswsw",b"wnenwewewwwnwnwnewnwsewseeswwne",b"neswsenenweenwweseeeswseeewsew",b"esesenwswsesesesenenwsewsesenwsesesee",b"swsesenwwnweeswnesewwseenw",b"eeneeneneenwneneeesesweneeeeew",b"nweseneneneswenesewnwwswswnenwnwsese",b"swnwswewwwneseswwsweswwswswswesw",b"swseseswseswseseswseneswswneswwwsesese",b"wwwwswnwnwsewwsenwnwnwswnwenwnwnwnenw",b"wsweswswwnewsweneswswswswwswswwnw",b"neeswnweneneneenwnwewwswnwnwwnwnenw",b"nwenwnwnwnwnenwnenewse",b"swewwwneeswneneseneseneneeenenwneenw",b"eenenenesenwneeseneneneswsenenewnenwne",b"wsweseeswneeweneneneeneeeeneee",b"nwnwnwsenenwnwnwnwnwswnwnwnw",b"neneenwnwneswwnenwseswesenwenewnwne",b"eswneswswwswneswswswswnwsw",b"nweeswsweseeeeeeseenweeeeenwe",b"weneswsweswswswswseswwswswseswswsww",b"senwswswswswseswsewweseswsenwswswnenesw",b"sesenwsesesesesesesesese",b"swnenweenwneeeeeseenwwswswe",b"neenenwsenwweswnenwnwnenwnenwwnenenw",b"sewseseswseneneseeseswsenwwnesesesene",b"nwwswwnwwwwswwwsewwewnewew",b"nesewwwseseewnwseeswwsesenesenene",b"weeneeseseeesweewe",b"swswswswseseseswseneeneseseswnwsw",b"neseseseweseseseseenwsesesesesesesese",b"seswswsweswswswswswwsweswswswswswnwsw",b"wwwwsewsewnewwwwnwwwwww",b"nwneswnwnenwnenwnwnenwnwnenenenw",b"seenesesewsweeneneneneenenenwnewe",b"nwwnwnwnwswwnwnwnwnwenwnwnw",b"newseneseewnwnwseneneneneeneneneswnew",b"neeeeseeeneswneswweneswnenewneene",b"nwswswnwenenwswnwnenenenenwnenwnenenwnw",b"eseeeeseeeseweeeeeeenw",b"swsenwwswnweneswewsenenesesenweese",b"seeeeseseewswsenweseneseeseeesenw",b"neseswwseseneweseseseseswsesewsesenesese",b"newesenwnwewnwnwnwwewseseswwwwnw",b"seswneswneenwswneswswwenwseswwswswwsw",b"nenwnwnenenwnesenwne",b"sewseeeseeeseee",b"esweweenweeeeseweeneneeesw",b"ewswnenwswnwsenwwwwseewewseswww",b"wwneneneseseswsesenwe",b"wswneswwswewewsenwenwnewweseswsw",b"wswwwwwnwnwnewww",b"senwnwnwnwnwnwwnwnw",b"senenenwnenwnenwnewnwnwnenwsenwnenenenwsw",b"nenwsenwnwnwnwswnwsenwnwnenwnwnwnwseenwesw",b"seseswwneseeswnwswswneeswsewswswnew",b"swwewwwseneenewswwswswsenwswswsw",b"nwnwsenweeneneneeeneweeswseneswne",b"swswnewwswswenweseswewsweswswewsw",b"wseswnwswseswnwnwswswnenweeswswneswse",b"wnenwswnwnenwenenwnwnwnwnwnwnesenenwnwne",b"eswsweswneweswenenwswnwwnwnwsenwnese",b"neeeneeeeneesweeneeweenee",b"swwneswesewswwswwnwneswseneswsenwsw",b"ewswswwswwwwwswwswseswwnewswe",b"nwsewsesweewseseseseseswseswsesesesese",b"enwnwnwswnenwwnwewnwnewswnwenwseswsw",b"wwsewwneswwwsenwwnewsewswnwnew",b"eeeneeswswnwneeseneseeneeewene",b"seseswwseeswsesewneeseseswsesenesenwsesw",b"wswswswswswwseswnwswswneswsw",b"wneswswwnwnwenewwwwwwnwswnwesenwne",b"swnwnwnwnwnwnwenwnw",b"swswnenenenenenenenenewwseneneneneenenene",b"nwwwwnwwenwnwnwwwwwweswwnww",b"swnwnwnwnwnwnwnwnwnwnwnwnwne",b"seseseseeseeesewsene",b"enwnwwnwnwnwnwnwnwnwnenwnenwnwnw",b"wswnewwwwswwweswwwwwswwew",b"sesewswswseswseseneswse",b"sesenweweeeseeneeeseesesweee",b"swswswswswswswswwweswswesenwnweenwse",b"swswswnwswwswseswseenenesweswwswwsw",b"seseeswnweseseswswsenwnwnwseesenwnwww",b"wnwnwwwwwsenewwnwwnwnwsene",b"swesenwseseswnwseseswnwswsweseseseswswsese",b"senwwenwnwnenewnwsenenwnenweewswse",b"eeenenwenesenewneweneeeeesenwe",b"senwwneseseseseseseseseesesesesesesese",b"ewnwswnwswenwswnesewseseneseswswsesw",b"nesenenweeeeeswwnenwnesweeneenene",b"neeswwewnweenwewneswsesenwwseee",b"nesenwseesenwnwswnwsenwnwswenwnwnenwnenw",b"senenenwnenenewsewnenwnenwnwnwneenewsene",b"wwwswswwnewwwswswswsenewwwww",b"neseseenweenesewswsewwseswseseseesw",b"seseseseseneseseswsesenesesesesesenewwse",b"swseswswswswswswwseeswseswswsw",b"swnewnewsesewneswwswwnw",b"seesesesenwseseswseseseseneeseswseee",b"neneneneneneseneenwwnenenenenenenwwne",b"seseewenwenwseeseseeeeseeneeneesw",b"neswsweeseeseneeesesenwswewnwe",b"seneswnwwnwwwwnwnenesewenwnwwwnwww",b"newnwnewswwwwwwwswwswwswwwsew",b"swseswwnwwwwwswsewswswenwwsw",b"wnenwnwewsenwnewsewwswnenwsewwswnw",b"nenwneswnwnesenenwnewsenenwneswnenwnwenw",b"wwswnwnwnwwwwwwnew",b"swswswnesesenwseswsewweneneswnesewse",b"swwsewwwwwwswwneswnenwwwnewsw",b"nwnwsenenenenenenenwnenenesenenwnwenwsw",b"sesesenweswswseseseswswswswswnwseswese",b"wsewwnwwwewnewwwsewwwwww",b"swseswswwnwesenwswswsenee",b"sesweseesewsewswswseseseswneseseswsesw",b"nwsenenenwnwnwwnwnwnwnwenwnenwnwnenwnwsw",b"nwwnwsesewwewneseswwwnw",b"eeseseseeseseeswenwseeeseeeenwsw",b"nwwnewwwsewwsew",b"wwnewwwwswswwneswswwwneswwwse",b"wswswswswswswswnwswwswswseneswneseswwsw",b"nenwnwwseeweswswswswnwnwwewneeswswse",b"nwnwnwenwsenweswwnenwnwsewnwwwnwnwnwne",b"eseswwnwneenwsewswsenweswwneswnenw",b"wswswswnwswneswswwswsenew",b"swwsesewnwwnwwswswwswwwswsww",b"wwswesewswswswswnenwswswswnewwwsw",b"swwwswseswswwswneswswnesweswneswswswsw",b"swnwnwswnwnenwwwwswnwwnwnwenwnwne",b"seeseseesesesenwswsesenwswsesesesesese",b"seeeseseseseseeseesenweswwseewsese",b"enenenenenewneseseswnenwswnenenenwnenene",b"swwweswesweswnwnweneenweseswene",b"senenwnenwsweweenweseneswseneswwnw",b"nesewneneswwneseneesenenenwnenwnwswse",b"swnesesewnenwwwnwnwenesewwweseew",b"nenenesesenwnwnenewnenwsenenwnwnwnenwne",b"nwseseeeseesenwewseeeseseseenwsw"]; 4 | static DIRS: [(i64,i64); 6] = [(1,0),(0,1),(-1,1),(-1,0),(0,-1),(1,-1)]; 5 | 6 | fn part_two(mut tiles: HashSet<(i64,i64)>) -> usize { 7 | let mut neighbours = HashMap::new(); 8 | for _ in 0..100 { 9 | neighbours.clear(); 10 | for (q,r) in &tiles { 11 | for (dq,dr) in &DIRS { 12 | *neighbours.entry((q+dq,r+dr)).or_insert(0) += 1; 13 | } 14 | } 15 | tiles = neighbours.iter() 16 | .filter(|(t, &n)| n == 2 || (n == 1 && tiles.contains(t))) 17 | .map(|(&t,_)| t) 18 | .collect(); 19 | } 20 | tiles.len() 21 | } 22 | 23 | fn part_one() -> HashSet<(i64,i64)> { 24 | let mut tiles = HashSet::new(); 25 | for s in &INPUT { 26 | let (mut q, mut r, mut i) = (0,0,0); 27 | while i < s.len() { 28 | let ((dq, dr), di) = match (s[i], s.get(i+1).unwrap_or(&0)) { 29 | (b'e', _) => (DIRS[0], 1), 30 | (b's', b'e') => (DIRS[1], 2), 31 | (b's', b'w') => (DIRS[2], 2), 32 | (b'w', _) => (DIRS[3], 1), 33 | (b'n', b'w') => (DIRS[4], 2), 34 | (b'n', b'e') => (DIRS[5], 2), 35 | _ => unreachable!(), 36 | }; 37 | q += dq; 38 | r += dr; 39 | i += di; 40 | } 41 | if !tiles.remove(&(q,r)) { 42 | tiles.insert((q,r)); 43 | } 44 | } 45 | tiles 46 | } 47 | 48 | aoc2020::main! { 49 | let tiles = part_one(); 50 | (tiles.len(), part_two(tiles)) 51 | } 52 | -------------------------------------------------------------------------------- /src/bin/25.rs: -------------------------------------------------------------------------------- 1 | const A: usize = 13316116; 2 | const B: usize = 13651422; 3 | 4 | aoc2020::main! { 5 | let (mut x, mut loop_size) = (1,0); 6 | while x != A && x != B { 7 | x = x * 7 % 20201227; 8 | loop_size += 1; 9 | } 10 | let y = if x == A {B} else {A}; 11 | let key = (0..loop_size).fold(1, |x,_| x * y % 20201227); 12 | (key, '🎄') 13 | } 14 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | // a macro to automatically time the solution 2 | #[macro_export] 3 | macro_rules! main { 4 | ($($body:tt)+) => { 5 | fn main() { 6 | let now = std::time::Instant::now(); 7 | let (p1,p2) = { $($body)+ }; 8 | let time = now.elapsed().as_millis(); 9 | println!("Part one: {}", p1); 10 | println!("Part two: {}", p2); 11 | println!("Time: {}ms", time); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use std::process::Command; 2 | use once_cell::sync::Lazy; 3 | use regex::Regex; 4 | 5 | static MS_REGEX: Lazy:: = Lazy::new(|| Regex::new(r"Time: (\d+)ms").unwrap()); 6 | 7 | fn extract_time(s: &str) -> u32 { 8 | let capture = MS_REGEX.captures_iter(&s).next().unwrap(); 9 | capture[1].parse().unwrap() 10 | } 11 | 12 | fn main() { 13 | let total_time = (1..=25).map(|day_num| { 14 | let day = format!("{:0>2}", day_num); 15 | let cmd = Command::new("cargo") 16 | .args(&["run", "--release", "--bin", &day]) 17 | .output() 18 | .unwrap(); 19 | let output = String::from_utf8(cmd.stdout).unwrap(); 20 | println!("Day {}:\n{}", day, output); 21 | extract_time(&output) 22 | }).sum::(); 23 | println!("Total time: {}ms", total_time); 24 | } 25 | -------------------------------------------------------------------------------- /timings.md: -------------------------------------------------------------------------------- 1 | ## Timings 2 | The following table contains wall-clock timings of all 25 solutions, as well as the produced answer to both parts. The time includes computing both parts of the problem, using the timing method in [lib.rs](src/lib.rs). It was done on a `MacBook Pro (15-inch, 2017)` with a `2,8 GHz Quad-Core Intel Core i7` CPU. 3 | 4 | | Day | Part one | Part two | Time | 5 | |-----------|-----------------|---------------------------------------------------------|----------| 6 | | 01 | 786811 | 199068980 | 1068 µs | 7 | | 02 | 591 | 335 | 24 µs | 8 | | 03 | 220 | 2138320800 | 8 µs | 9 | | 04 | 226 | 160 | 432 µs | 10 | | 05 | 913 | 717 | 128 µs | 11 | | 06 | 7120 | 3570 | 808 µs | 12 | | 07 | 164 | 7872 | 285 µs | 13 | | 08 | 1331 | 1121 | 177 µs | 14 | | 09 | 138879426 | 23761694 | 42 µs | 15 | | 10 | 1656 | 56693912375296 | 46 µs | 16 | | 11 | 2299 | 2047 | 24 ms | 17 | | 12 | 1221 | 59435 | 19 µs | 18 | | 13 | 3997 | 500033211739354 | 15 µs | 19 | | 14 | 6559449933360 | 3369767240513 | 7300 µs | 20 | | 15 | 1522 | 18234 | 2548 ms | 21 | | 16 | 27898 | 2766491048287 | 325 µs | 22 | | 17 | 313 | 2640 | 19 ms | 23 | | 18 | 510009915468 | 321176691637769 | 192 µs | 24 | | 19 | 165 | 274 | 20 ms | 25 | | 20 | 104831106565027 | 2093 | 2928 µs | 26 | | 21 | 2280 | "vfvvnm,bvgm,rdksxt,xknb,hxntcz,bktzrz,srzqtccv,gbtmdb" | 577 µs | 27 | | 22 | 33400 | 33745 | 163 ms | 28 | | 23 | 52937846 | 8456532414 | 635 ms | 29 | | 24 | 332 | 3900 | 56 ms | 30 | | 25 | 12929 | '🎄' | 4147 µs | 31 | | **Total** | | | 3483 ms | 32 | --------------------------------------------------------------------------------