diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..03f4879 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,2 @@ +[build] +rustflags = ["-Ctarget-cpu=native"] diff --git a/Cargo.toml b/Cargo.toml index 1fd5041..f936d74 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,3 +9,4 @@ edition = "2018" [dependencies] aoc-runner = "0.3.0" aoc-runner-derive = "0.3.0" +nom = "6.0.1" diff --git a/input/2020/day17.txt b/input/2020/day17.txt new file mode 100644 index 0000000..8e1cf1a --- /dev/null +++ b/input/2020/day17.txt @@ -0,0 +1,8 @@ +#.#.#.## +.####..# +#####.#. +#####..# +#....### +###...## +...#.#.# +#.##..## diff --git a/input/2020/day18.txt b/input/2020/day18.txt new file mode 100644 index 0000000..ed81407 --- /dev/null +++ b/input/2020/day18.txt @@ -0,0 +1,373 @@ +5 + (6 + 3 + (4 + 7 * 3 + 6 + 4 + 2) * 9) * 7 + 7 +5 * 8 + 3 * ((5 + 9 * 9) * (3 * 5 + 7 * 2 * 3) + 3 * 6) + 8 +5 + 5 * (6 + 7) * 5 + 4 * (3 * 3 * 8 + 2) +(6 + 2 + 9 + 9) * 6 + (2 + (5 * 3 + 4 * 5 * 8 + 5) + 6 + (5 + 9 * 8 + 2 + 2)) +3 + (5 * 4 * 6 + 5 * (9 + 7 * 9)) * 5 + ((2 + 8 * 2) * 6) +3 * (9 + 9) * 4 +5 * 6 + ((2 + 8 * 5) + (5 * 7 + 4 * 9 + 2 + 3) + 5 * 4 * 5) * 4 * 4 +8 + 5 + 5 * ((9 + 9 * 2 * 3 + 3 * 9) + (7 * 4 + 2)) +((2 * 5 * 5 + 6) * 6) + 3 * 9 * (8 * 3 + 4) * 7 * (3 + 9 + 8 * (8 * 8 * 5) + 8 * 3) +9 + (6 + (4 + 2 * 3 + 4) * 7 + 6 * 7) * 8 + 6 +6 * 9 * (9 * 9) + 5 + 8 + 9 +3 + 4 * 5 * 7 * ((3 + 9 * 9) + 2 + (5 + 3 + 5 + 2 + 8 + 4) * 6 * 6 + (2 * 5 * 8 * 6)) * (7 + 3 * 7 * 2 * 5 + 6) +9 + 6 + 5 * 2 * (2 + 4 + 9 * 4) +(2 * 4 * (9 + 8 + 8) + 6 * 2 + 8) + 4 +(5 + 4 * (9 + 2 * 2 + 6 * 9 * 5) * 5 * 7) + (6 * 8 + 7) +3 + 8 * 4 + 2 + (7 * (7 * 5)) + 2 +3 + 4 * ((2 + 5 * 6) + 2 + 5 * 4 * (9 * 8 * 6 + 9) * (9 * 5 * 4 + 9 + 2)) + 6 +(6 * 4 + 2) * 7 * 6 * 5 * ((4 + 5 * 8) + 6 + 7) * 7 +(3 * 5 * 4 * 5 + 9) + 6 + 6 * (6 + 2 * 5 + 7 * 4) +5 * ((5 + 3 + 6 + 9 + 7) + 5) * 6 * (9 + 9 * 3 + 4 + 3) * (5 * (3 * 5 * 2)) +9 * (8 * 9 * 2 + 2) * 7 * 9 * 7 + 4 +3 * 2 * 8 * 9 + 6 * ((5 + 8 + 2 + 2) * 7) +7 * 7 * (5 * 8 + 9 * 2 + 8) + 3 + 2 + 5 +9 * 2 + (6 + 8 + (2 + 3 + 7 + 4 + 5 * 6) + 5 + 8) +8 + (6 * 2 + 4 + 7 * 9) + 5 * ((7 * 6 * 6) * (9 + 8 * 2 * 8) + 9 + 8 * 5) * 2 +(5 + 5 + 6 + 6 * (4 + 9 * 3 + 8 + 5) * 2) + (6 + 6) * (7 * 2 * 8 + 2) + 8 * 3 + 4 +7 + 9 + ((9 * 5 + 6 * 6 * 6) * (6 + 7 + 8 * 7 * 4 + 6) + 8 + 4 + 9) + (9 + 3 * 4) +5 + (9 + 4 * (7 + 4 * 5 + 5) + (6 + 8 * 7) + (8 + 2)) + 3 + 8 + (7 * 7 + 6 * 9 + 5) +(3 * 5 * 8 * 9) + 9 * 3 * (5 + (4 * 7 * 7 + 5 * 7) * 8 * 5 + 4 + (3 * 5 + 4)) + 2 * 6 +((6 * 7 + 6) + 5 * 8 * (9 * 2 * 4)) * (4 + 6 + 3 * 9 + 7) +3 + 5 * 5 + 8 + 9 +5 + (7 * (2 * 4 + 5 * 2 + 7 + 6) + 2 * 7) + 3 + 9 + (2 * 4 * 4) +(5 + 6 * (6 + 9 * 2)) * 4 + 3 + 7 * 3 +9 * 5 * ((5 * 9 + 5 * 4) * 3 + 5 + 4 + 2) * 3 + 9 +7 + 7 * 9 * (7 * 3) * 5 * 8 +4 + (5 * 2 + 9 + 6) * 2 * 3 * 3 +9 * 9 * 5 * ((9 * 5 * 9 + 3 * 7 + 4) * 9 * 5) + 5 + 3 +(7 + 8 + (2 + 9 + 6 * 6 + 9 + 6)) + 6 * 7 + 9 + 9 +8 * (3 * 8 + 5 * 4 + 5 + (5 + 5 + 9)) + 9 * 5 * 4 +(6 + 5) + 9 * 2 * 8 +(8 * 5) + 6 * 6 * 6 * ((3 + 7 + 3) * 9) +4 * (3 * 2 * 5 + (6 * 2) * (8 * 8 * 4 * 8 + 3 + 3) * 6) + 2 + 3 + 9 * 8 +((8 * 6 + 4 + 5 + 6 * 3) + (8 * 8 * 7) * 2 * 6 * 3 * 7) * (4 + 7 * 4) + 4 + 2 + 3 * 9 +7 * 4 + 5 + 3 + (4 * 3 + (6 * 8 * 5 * 5 + 4) + 9 * 3 * 8) * 9 +2 + (3 + 3 + 6 + 2) * 5 +9 + 8 + 9 + 4 * ((2 * 2 * 4 * 9 * 4) * (3 + 5 * 7 + 9) + (7 + 9 * 2 * 7 * 3) + 7) +8 + 3 + 2 * (2 * (7 * 5)) +(8 + 5 * 8) * 8 + 4 * (3 * (5 * 3)) * 7 +(3 * 9) * 8 + (3 * (9 + 3 * 2 * 7 * 9) + 8 * 9) * 4 * 7 +8 * 7 * (3 + 4 + (5 + 7 * 4 + 2 + 7) * 7 + 8 + 9) + ((8 + 3) + 3) * (9 * 2 + (7 * 6 + 3 + 3 * 2) + (8 * 6 + 8 * 8 * 4 * 9)) * 4 +5 * (3 + 5) + 5 * 7 * 4 +(5 * 5) * (5 * 4 + 8 + 6 + (2 + 6 + 2 + 6 * 4 * 8) * 6) * 7 + 3 +(6 * 9 + 8 + (9 + 8 + 2 * 4 * 2 + 3) * (8 + 6 * 9 + 9)) + 9 * 5 +(3 + (2 + 6 * 5 + 9 * 4) * (2 * 4) + 2 * 3) + 4 + 6 + (7 + 2) * 6 + 4 +5 + (4 * 2 + 7 * 6 + 6 + 3) + (7 + 7 * (8 * 3 + 8 * 4 + 4 * 2) + 7 * (8 + 2 + 9 * 6 + 4)) +(7 * 4 + 7) + ((6 + 7 * 3 + 7) * 9 + (9 + 6 + 3) * 9 + 9) * 2 +8 + (5 * (3 * 2 + 7 + 2) + (7 + 6)) * 9 +8 * (6 + 5 + 8 * 3 * 8 * 6) * 8 * 9 * ((4 * 5) * 2 * (2 * 3 * 8)) + 5 +5 + 5 + 5 * 2 * 2 + 4 +(3 + 3 * 5 * 3 * (2 + 9 * 4 + 2 + 2 * 6)) + 4 + (8 * 9 + (9 * 8) + 9 + 7) +(9 * (3 + 2) * (8 * 8 * 5 * 4) * (9 * 4 + 8)) + 8 + 6 + 3 * 8 +(2 * 2 + 9) + 5 * 8 * (3 * 4) +6 * 9 + 3 * (9 + 8 + 7 * (6 * 9 * 4 * 2)) + 4 +((6 + 9 + 9 + 6) * 2 * 8) * 3 +4 * (4 * (8 + 5 * 2 * 2 + 3 + 4) * (8 + 3 * 5 * 5)) * 9 + 3 * (6 + (9 + 2) + 8 + (2 + 3) + 7 * 6) + (4 * 4) +(8 * 8 * 5 + 2) * 9 * 8 + 8 * 4 * 2 +4 * 9 + 8 + 4 * 6 +4 * ((6 + 2 * 8) * 9 * 9) + 7 + 5 + 9 + 8 +(4 * 6 * 2 + 9 + 6 + 6) + (4 + 2) + 6 + 3 + (6 + (5 + 7 + 8 + 3) * 7 + (4 * 5 + 6 + 9 * 7 * 4)) +9 * 7 + ((2 * 7 + 3 * 9 + 3 + 9) + (6 * 8)) +(7 + 6) + 9 * 8 * 9 + 6 +3 * 3 * 4 + (2 * 9 * (6 + 2 * 4 + 9 * 8) + (7 * 9 + 4 + 4 * 4 * 6) * 8 + 8) + 5 + ((7 + 7 * 9 * 8) * 4 + 4 + (5 + 5 + 6 + 6) + 4 + 8) +(4 * 9 + 8 + (4 * 2 + 5 * 3 * 7 * 2) * 5 * 2) * (4 + (8 + 5) + 9 + 3 * (9 * 4 * 5 + 4 + 2)) * 3 * 3 * 9 +(5 * (7 * 2 + 9 * 2) * 6) + 9 +((3 * 2 * 6 + 3 * 7) * 6 * (9 + 6 * 7 + 4 * 5) + 6 * 9 * 3) + ((6 + 3) * 3 + (5 * 5 + 7 + 5 + 4) + 2 + (9 + 2 + 9 * 2) + 2) + 6 + (6 * 7 + (7 * 3 * 5) * 2 + 3 * 7) * (6 + (8 * 6 + 4 + 6 + 2 * 8)) +8 * 3 + 2 * (6 + (2 + 9 * 8) * 2 * 9) +(9 * (7 + 3 * 8 * 5) + 7 + 3 + (4 * 2 * 3) + (7 + 2 + 2 + 3 * 7)) + 5 * ((6 * 5) * (9 * 4 * 8 * 2 * 2 * 5) * 9 * 2) +5 + ((2 * 4 * 9) * 6) + (9 + 7 + 2 * (2 + 5 + 6 + 2)) * 9 +9 * 6 * (9 + 5) * 2 +9 * 2 * 2 + 6 + (8 + (5 * 5 * 6 * 6 + 4 + 7) + 6) + ((3 * 7) * 4 * (2 * 6 + 9 + 2)) +(2 + 4) * 5 + 5 +(7 + 8 * 2 + 5 + 3 + (3 + 4 * 9 * 9 + 4)) + 2 * 8 + 3 +3 + 9 + 5 + (8 + 3 + (9 + 8 * 6)) * 8 +8 * (6 * (2 * 3 + 5 + 9 * 7 * 8) * 2 * 5 + 5) + 7 * 2 +3 * (3 + 3 + 2) * 6 * (8 * 6 + 5) +6 + (8 + 2 + 5) + (5 + 4 * (3 + 3) + 3) + 4 + 9 +(5 * 5 * 3) + ((4 * 4 * 9 + 8) + 9) * 2 +2 * (4 * 3) * 2 + 3 +7 * 2 * 5 + 4 + 5 + (8 * 7) +3 + (4 * 6 + 4 * 8 * (6 + 7 * 7 * 7 + 5)) +3 * (8 + 5 + (6 + 6 * 8 * 7 + 6 * 8) + 3 + 2 * 5) + 3 + 9 + 6 + 5 +6 + (2 * 6 * 4 * 9 + 4) * (9 * (7 * 4 + 4 * 5 + 2)) +(7 * 3) * (5 * 6 + 9 * 6) * 2 * (9 * 7 + 7 + (2 * 4 * 6 + 9) + 9 + 9) * 4 * 4 +(4 * (8 * 3 + 3 * 2) * 7) * 2 * 3 * 9 * 5 * (3 + (2 + 9) * 5 + 7 * (6 + 9 * 2 * 2 + 9) * 9) +3 + 9 * 7 + ((3 + 4) + (4 * 3 * 4 * 2 + 2) + 9 * 4) +3 + 6 + 2 + ((2 * 9 * 4) + 5 + 5 * 5 + 8 + 4) * (7 * (9 + 5 + 7 + 5 * 2 + 7)) * 3 +5 * ((2 * 9 + 8) + 4 * 7 * 5) * (5 + 5 + (9 + 8 + 7 + 5 + 5) + 2 + 8) + 7 * 6 +9 + ((7 * 3 + 4 + 3 * 3 + 7) * 5) + (8 + 2 * 6 * (8 * 9) * 4 * 7) +4 + 3 + 6 + 3 * 5 + (8 * 4 * 2) +(9 + (2 * 4 + 6 * 3) + 7 * (4 + 6) + 3 + (6 + 2 + 8 + 9 + 5 * 7)) + (9 + 3 + 4) * 3 + (8 * 4) + 9 +8 + 8 * (6 + 9 + 2) * 6 +4 + 7 + (3 + 4 + 5 + 7) + (5 + (9 + 6 + 8 + 7 * 3) * 3 * 7 * (2 * 4 + 3 + 6) + (8 * 9 * 2 + 6 * 6 * 5)) +(2 * 7 + 4 + 8 * 8) + 3 + 7 +(4 * 3 * 4 + 3 + 8 + 5) + (8 * 6 * 5) * 9 * 7 * 7 * ((7 * 5 + 8 * 4 + 2) * 8) +4 + ((9 * 9) + (6 + 2)) + 9 +((8 * 3 + 3 * 6 + 5) * 5) * 6 * 8 + 5 * (3 + 9 + 5) +8 * ((9 + 6 + 3 * 2 + 4) * 9 * 3 * (6 + 7 * 6 * 2)) + (3 * 4 * (3 * 9) + (9 + 9)) + 2 +8 * (6 + (6 * 6 + 5 * 4 * 2) + 7 + 5 * 5 + (8 + 9)) + 3 * (4 * (9 + 4 * 9) * (2 * 6 * 4 + 3 + 2) + (7 + 3 + 5 + 6)) * 5 + (3 + 9 * 6 + (3 * 4 * 8 + 7 * 7)) +5 + 8 * 3 * 8 + 9 +3 + (4 * 8 + (5 + 5 + 3 + 9 + 2 + 6)) + ((4 + 9) + (8 * 7 + 3 + 6 * 6) + 7) +(2 * 2 + 7 + 2 * (9 * 2)) * 3 +7 * 3 + 2 + 9 * ((2 + 2 + 3 * 4 + 2) + (4 * 9 * 5 + 9 + 8) * 3) +(8 * 6 + 4) + (7 + 8 + 3) + 4 + 9 +(4 * 6 * 5 * 6) + (2 * 4 * (5 * 9 * 8 + 7) * 2 * 3 + 6) +(6 * 5) * (3 + 2 * 3 * 9 * 4) +9 + 4 + (3 + 3 * (7 + 2) * 5) * (5 + 8 + 5 * 8 * 2) +(3 * 4) + ((3 + 4 * 9 * 7 * 5) * 6 * 8 + 6) * 5 +3 + (8 * (8 * 7 * 2) * 8 * 3 + (9 + 9 + 5) * (3 * 4 + 3)) + 5 * 7 +6 * 3 + 8 + (7 * (5 + 8 + 9 + 5 * 6 * 3) * 3 * 8 * 6 + 5) + 6 +7 * 8 +3 + 7 * (7 + 9 * 4 * 2 + 9 * 7) +(4 * 7 * 4) * (3 + 5 * 6 * 6 * 2 + 6) * 8 +8 * 5 +(7 * 8 + 4 + 8 * (4 + 7 * 5 + 7 * 5)) * 3 + 3 * 8 + 9 + 6 +8 * (8 + (5 * 5 * 5 + 9) * (8 + 6)) * (6 + 2 * 9) * 2 * 3 + 6 +(6 * 8 * (5 + 2)) + (3 + 6 + (9 + 9 * 2) * 3) * 8 * 4 * 7 + 8 +(3 * 9 * 2 + (8 + 8) + 9) + 2 +(8 * 2) * (8 * 6 * 4 + 6 + 3 + 3) +7 + 5 + (3 + 2 * 2) + 5 + (6 * 8) * (7 + 6 + 6 * 9) +(3 * (2 + 9 * 5 * 8 * 7) + 9 + 4) + 9 * 5 +5 + 3 + (5 + 8 + 4 * 5 + 8 + (5 * 3 + 7 * 6 + 3 * 8)) * 2 + 7 + 3 +(5 + 6 + 7 * (9 * 7 * 2 + 3 + 8) * 8) * 4 + 2 +6 + (2 + 5 + 2 * 7 * 7 + 6) * 8 +8 * 8 + (7 * 4 + 2 * (6 + 5 + 2) + (3 * 2 + 8 + 9 * 7)) * (3 * (2 + 9 + 9 * 4 + 2 * 9) * 4) +(5 + 8 + 8 * 8 * 9 * 6) * 3 + 5 + 7 +8 + 5 + 6 * ((6 + 7) * 5 * 2 * 9 * 3 + 2) + 2 * 4 +(8 * 4 + 5 * 7 * (7 + 7 + 3 + 7 + 9) + 9) + (3 * 2 + (7 * 7)) * 2 * 6 * 2 +4 * 6 +(9 + 8 + 2 * (9 + 7)) * 4 + 2 + ((6 + 9 * 3) + 5 + 5 + 4 + 2 + 8) * 2 * 6 +(8 + (4 + 9 + 9) * (7 + 6 * 4 * 5 + 7) + 3 * 2 * 5) * (9 * 5 * (2 * 7 + 2 * 6)) + 3 + 8 + 3 +3 + (7 * (4 * 2) + 7 * 5 + 8 + 6) * 4 +8 * 7 * 5 * 4 + (2 * 7 * 6) +8 * 9 * 5 * ((6 * 4 * 5) + 4 + 2 * 5 * (4 * 4 * 7 + 4 * 6 * 6)) +8 + 8 +4 * 3 * 7 + 8 + (8 * 7 + 5 + 7 * 3) +(9 + 4 * (6 * 2 + 5 * 6)) + 7 + 7 * 6 +3 * (8 * 6 + 3) + 2 +9 + ((7 * 8) + 6 + 5 + (4 * 4 * 9 * 5) * 8) +7 * (9 + 8 * 3 * 3) +2 + ((6 + 7 + 8) * 4 * 4 * 3) + 6 + (7 * 2 * 4 + 4 * 6) +2 + 2 + 6 + 9 * (8 * 2 + 2 + (7 * 8 * 5 + 5) * 7 * 3) + 8 +(5 + 6 + (9 * 8 + 7 + 2 * 3 * 2) + (9 + 9) * (3 * 3 * 6 * 2 * 3 + 6)) + ((9 + 3) + 2 * 4) * 7 + 2 + 2 +(4 * (6 * 8 * 5) + (9 + 2)) * (2 + 8 + (2 + 9 * 7 * 5 * 2) + 6 + 8) + 8 + 2 * 4 +9 + 3 * 7 * 8 +(6 + 4 + 7 * 6 + 9) + 4 * 4 + 9 * 9 +(8 + 9 + 9) * (5 * 6) +7 + (9 + 4 * 2) * 6 + (9 * (4 + 2)) * 7 * (2 * 7 + 5 + 2 * 6 + 2) +4 + 5 * 4 + 5 * 7 * (8 * 5 + 5 + (4 * 8 * 7 + 8) * 3) +8 + 5 * (8 * 3 * 5) * 9 * (4 + 6 + 6 * (5 * 9 * 9 + 5 * 7 + 2)) * 8 +(7 * (6 * 9 * 8) + (8 + 4 * 7 * 2 + 4) + 8 * 3 + (6 + 6 * 3)) * (4 + 4 * 8) * 8 * 7 * 2 * 4 +(9 + 5 * 5 + 6 + 3) * 9 +8 * (7 + 6 * 9 + 4 + 9) * 2 +((9 + 6 * 4 + 7 + 3 + 7) + 5 * 9 + (3 * 9)) + 3 + 7 * (7 + (4 + 5 + 3 * 5)) * 9 +2 * 6 + 4 +(6 + 6 + 5) * (5 * 8 + 6 * 5) + (9 * (7 * 6 + 3 * 3 * 4 + 7) + 7) * 4 * 4 +8 + 6 * 4 +(3 + 3 + (4 * 6 + 5 + 9 + 7) + (8 + 6) + 8 + 2) * 5 * 6 + 7 * 7 * (9 * 5 * 8 * 7 * 3) +((2 + 6 * 8) * 2) + 7 +6 * 2 * 3 + (4 * 5 * 4 + 2) +6 + 4 * (4 + 3 + 2 + 8) * 5 * 4 * 5 +2 * 4 * 2 + 7 * 4 + (5 + 7 + 3 + (7 * 6 + 8 * 8 + 7) + 4 + 3) +8 + 8 * 7 * (4 * 9 + (9 + 4 * 7 * 6)) * 7 + (4 + 4 * (3 * 2)) +9 + 6 + (8 * (2 + 8) + (3 + 2 + 2 * 4)) +(4 + 4) + 3 * (9 * (6 * 6 * 4 * 8) + (3 * 8 * 5 + 2 * 2 + 3) * 9 + (8 * 5 + 4 + 8 + 2 + 9)) * 4 +(3 + 8 * (2 + 2) + (9 + 6 * 3 + 3 * 7 + 5) + 7 + 2) + 8 * 6 + 7 +7 * 9 + (7 * 3 + (9 * 4)) + 5 +((9 + 7 + 3 * 6 + 9 + 3) + 9 + (4 * 8)) + 9 + (3 + 8 + (7 * 4) + 3 + 9 * 4) * 9 +(4 * 8 * 5 * (5 * 5 + 7 * 6 + 2 * 7) * (9 * 6 + 4 * 2 * 2 + 8) + 7) + (4 + 6 + 9 * 8 + 2) + 9 +8 * (9 + 9 * 6 + 2 * 5 + 2) + 7 + (9 * 8 * 9 * (6 + 5 * 6)) * ((6 * 9 + 2 * 8) * 6 + 5 + 6) + 2 +(9 + (2 + 2 * 4 * 6) * (6 * 4 * 4 * 7) + (6 * 7 + 9 * 9 * 6 * 8) + 4) * (5 + 5) + 5 + 5 + ((6 + 8 * 2) + 8) + 6 +8 + (6 + (3 * 7 * 3 + 5 + 4 + 5) * (4 * 7 + 5 + 5 * 4) * 4) * 8 * 7 + 5 +6 * 2 * 7 * 4 * (3 * 9 * 7 * 2 + 7) + 5 +9 * ((6 * 2 * 4 + 3 + 8) * 8) * 2 + 7 +(7 + (7 * 6 * 3 * 6 * 6 * 7) + 8 + 9 * 7 + 6) + 5 * 5 + (3 * (5 * 3 * 5 + 6 * 2 * 6) + (2 + 9)) * 3 +((6 * 7) * 6) + 4 +6 + 6 + 9 + 7 * (8 * 2 * (7 * 7 + 9) + 2 * 4) + 6 +2 + 4 * (2 * 8 + 2) + 3 + (3 * 9 * 2 + 5 + 5 * (3 * 3)) +6 + 8 + (6 + 6) * 3 + ((6 + 7 + 4 * 5) * (9 + 3 + 3)) + (3 * (3 * 8 * 4 * 7) * 6 * 2 * 4 + 6) +3 * 9 + (3 * 6 + (2 * 9 * 7 * 5 * 8) * (6 * 9 * 7 * 7 * 3) + 6) +7 + (8 + (3 + 3 + 2 + 4) + (8 * 7 + 8) + 9) +4 * ((7 * 4 + 3) + 9 * 4 * (3 + 5 * 6) + 8 + 6) * 8 * 8 +9 + 9 * 2 + 2 * 6 +(5 + (9 + 4 * 5) * 9) * 7 + 8 * 7 + 5 * 8 +(3 * (6 + 8 * 7 * 8 + 3) + 9 * 7 + 6) + 9 + 3 * 3 * ((3 + 5 + 3 + 4 + 8) + 2 * 4) +((4 + 4 + 4 + 9 * 7) * 7 + 9 + 2 * 7 + 9) * 5 * 5 * 8 * (4 * 8 * 4 + 8) +(5 + 5) + 3 +4 * ((5 * 8 + 9) + 8 * 9 * (2 + 4 * 9 + 5 + 8 * 2) * 2 + 6) * 5 * 8 +5 * (7 + 7 + 7 * (6 + 5 * 5 + 2)) + 3 + 3 * 3 +4 * (9 * (3 + 3 * 9 * 2) * (8 * 3 + 6 + 3 + 3) * 5 + 5 * 8) + (3 * 4 + 8 + 2) + 8 +(4 * 8) + 9 * (6 + 2) * 3 +9 * 7 + (2 + 3 + 4 + (2 * 2) * (5 * 4 * 5 * 3)) +5 + ((4 + 8) * 9) * 9 * 5 +9 + (5 + 8 + 9) + 5 + 4 +(6 + 6 + (6 + 4 + 7 * 7) + 9) + 9 + (5 * 6 + 9 + 4 + (4 + 2 + 5 + 2) + 7) * 4 + 6 +(4 * (6 + 5 * 6 * 5) * 5 * 3) + 5 * 6 * 9 + 4 * 8 +(8 + 2 * 2 + 8) + 2 + ((2 + 9 + 3 + 7) + 8) * (3 * 9 + 3 + 8) + 2 +2 * 2 * 4 * 5 * 6 * 8 +2 + 8 * 7 + 3 * (5 * 8 + 6 + 3 + 4 + 7) * 5 +3 * (4 * 3 + 5 + 8 + 8) + 2 * 9 * 9 * 4 +((7 * 4 + 5 + 8 * 5) * (2 * 8 + 3 + 5) + (7 * 2 + 9) + 9) * 3 + 9 + 9 * 9 +4 + 9 + (7 * 7) + 5 + (8 + 2) +((8 + 2 * 3 * 2 * 4) + 8 * 8) + 2 + 3 * ((7 * 6 + 6 * 4) + 9 + 9 * 8) * 5 +(5 * 7 * 7) + 5 + (4 + 7 + 5 + (4 + 7 * 9) + 9 * 9) * 2 +5 * 9 * (8 + 6 * (5 + 5 + 6 * 8) + 8 * 4) + (7 * 8) * 8 +4 * (2 * (7 + 7 * 7 + 8 * 9 * 2) + 8 * 2 + 6) +((5 + 2 * 3 * 4) + (2 + 5 + 3 + 3) * (2 * 5 + 8) * 8) + 4 + 8 + 7 * 9 +(9 + 7) + 8 * 9 * (9 + 2 * 6 + 8) + 4 +(9 + 7) * 5 * 7 * (4 + 6 * 4 * (6 * 7 + 5 * 3)) * 8 + 3 +7 * (3 + 2) * 2 + 9 * (8 + 9 + (8 + 9 + 6)) * 8 +(5 * 8 * 9 * 9) + 4 +7 * 5 + ((3 * 2 + 4) * 5 + 7) + ((7 * 3 * 8) * 4 * 7) +(9 + 9) + (6 * 6 * 7) + 6 * 3 +3 + 9 + 9 * 5 * (7 + 3 * (4 * 5 + 9) * 5) +3 * 8 + 9 * (2 + (2 * 3 * 7 + 8 * 4) + 9 * 8 + 7) * 7 * 4 +4 + 9 * (7 * 9 + (5 * 9 + 8)) +(2 * (7 * 5 + 6 * 6 + 5 * 2) * 5) * 5 +((8 + 2 + 6) * (5 * 3) + 8) + 7 + 7 + 7 * 9 +(3 * 3 * 8 + 9 + 3 * 3) + 4 +7 * 8 * 6 + 3 * 2 + 3 +7 * 3 + (2 * 3) * 5 + 6 +9 * (6 * (4 + 2 * 8 + 6) + 5 * 2 * 2) +(4 * (4 * 6 + 9) * (4 * 2 * 4) + 3 + 3) + ((4 + 8) * 2 + 6 * 9) * 6 + 9 +5 + (4 * (5 + 7 + 5 + 7) * (9 * 3 * 9 * 7)) +6 * (5 + 9 * 8 + 5 + 8) * (8 + 2) +(8 + 3) * 6 + (8 + 2 * 5 * 2) +(6 + 6 * (8 * 6)) + ((2 * 5 + 3 + 5 + 5 + 8) * 8 * 4 * (6 * 8 + 7 * 9 + 5) * 8) +5 * 4 * 5 * 9 + 2 * 4 +8 * 7 * (5 * (6 + 7 + 9 + 3 + 9 + 5) + (6 * 3 * 3) * 4 * 6) +2 + (8 * 6 + 9 * (7 * 8 + 6 * 3 * 6 + 5) + 6 + (7 * 4 + 4 * 7)) + 9 + 5 +7 + 9 * 6 + (5 + 8 * 6 + 9) + 6 +(2 + 4 * (5 * 9) + 5) * 8 * 4 * 5 * 8 +8 + 7 + 5 + 9 * 7 +3 * 4 * 5 * 8 * (4 * 3) +(4 + 8 + 4 * 5 * (2 + 5 + 9 * 7 * 2 + 7)) * 3 * 5 * 2 + 5 +7 + (4 * 8 + 9 * 3) + 6 * 3 * (6 + 5 + 7 * 3) * 5 +((9 * 6) + 8 * 6) + (9 + 9 * 6 + 9) + (8 * 6 + 5 * 4 + 3) + 5 * 4 * (6 + 5 * 3 * 9 + 6 + (5 + 8 * 2 + 7)) +(7 + (5 + 8 * 2) + (4 + 8 * 7 + 9 * 5) * 9 * 5 * (2 + 8 * 9 + 3 * 2 + 5)) * 9 + 5 +(7 + 8 * 7 + 7 * 8 * 9) + 7 + 6 * 5 * (5 * 4 + 5) +4 * (2 + 4 + 4) +(3 * (9 * 8 + 6 * 4 + 6)) + 5 * 3 + 2 + (4 + 5 + 8) +6 + 6 * 6 + ((7 * 4 + 7) * 6 + 9) +6 + 6 + (2 + 4 + 5 + 5 * 9) * 2 * 4 + (3 * 8 * 6 + 9) +(2 + 7 + (5 * 5 * 7 + 8) * 5) + 4 + 3 +(7 * 7 + 8 + 9) * 2 + 5 +5 * (5 * 2 + 2 * 9 * 5) + (2 + 8 * 3 * 4 + 2 * 8) * 8 +2 * 6 * 4 + (8 * 9 * 8 * 4 * 3) + 7 + 3 +(9 * 4 * 8) * 5 * (5 * 7 * (3 + 3 * 6 * 2) * 5 + 7 * 2) + (2 + 8 * 2) * 2 + 5 +5 * (7 * 2 + 6 * 9 * 3 + (3 + 2 + 6 + 7)) +(2 * (4 * 2) * 7) + 3 +5 * (3 + 2 * 5) * 5 + 8 + 3 +(5 + 6 + 6 * 2) * 5 * (5 + 8 + (9 * 8 * 4) + 9) + 9 * 7 * (3 * 8 * 8 * 3 * 8) +((7 * 9 + 8) + 6) * ((9 + 7 * 8 + 6) * (4 * 4 * 4 * 8 + 5 + 6) * 8 * 7 + 4 * (2 * 2 + 3)) +(5 + (4 + 7 + 8 + 6 * 8 + 5)) + (8 * (7 + 4 * 7) * (8 + 8 * 5 * 6 * 4) + 9 + (3 + 4 * 6)) + 3 + 2 + 3 +8 + (8 * 7 + 5 + 3) + 7 + (8 + (5 * 5)) * 6 +2 + 4 + 4 * 9 +7 * 4 * 2 + 4 + 3 + (8 * 6 * 6 + (5 * 2 * 6 * 9 * 7) + 7) +8 * (5 * 3 + 2 * 6 + (6 * 5 * 4)) * 8 + (4 * (2 + 7 * 3 + 9) + (2 * 3)) + (4 * 3 + 6 * 3 * 7 * 3) +9 + 6 * (3 * 9 + 2 + 3 + 6) + 5 +(9 * 6 + 8 + 8) + 8 + 6 * 9 +((6 * 9 + 2 + 8 + 4) + 6 * 7 + 8 + (2 + 5 + 7 + 5 + 3 * 8) * 5) * 6 + (2 + 4) * 7 + (3 + 2 * (4 * 8 * 5) * 2 + 7 * 9) +(2 + (5 + 9 * 7 + 6) * 2 + 7 * (4 * 6)) * 9 * (7 + (8 + 5 * 3) + 3) * 5 * 3 * 5 +(7 + (8 + 5 * 7 * 2)) + 2 * 7 + (2 * 5 + 7) * 8 +4 + 8 + (2 + 9 + 4) +((3 + 7) + 7 + 5) + 2 +6 + 8 + 9 * 2 + 9 + (6 + 4 + 3 * 4) +(9 + 2) * 7 + 7 + (3 + 4) + (8 + 3 + 3 + 5) + (2 * 7 + 5 + 4 + 3 + 8) +3 * ((7 + 9) + 5 + 9 * (9 + 6) * 3 * (9 + 2)) +(7 * 3 * (5 + 2 + 5 + 8 * 3 + 7) * 3 * 3 * 6) * 4 + 8 + 3 * 5 +4 * (5 + 7 * 6 * 5 * 2) + 6 + 3 +7 * 6 +9 + (2 * 7 * (8 + 2 + 5) * 8) + (7 * 8 + 9 * 7) +(4 + (8 * 5 * 9) * 2 + 8 * 4 + 4) + ((3 * 9) + 6 * 3 * (3 + 9 + 6 * 2 + 5) * 7) * (2 * (5 * 5 * 2 * 6 * 9)) * 6 * 9 +(7 + (4 + 9 * 2 + 8)) * 6 * 8 + 7 +8 + (8 + 5) * (3 + 3) +5 + 3 * 9 + 2 * (3 + 7 * (6 + 2 * 4 + 3 + 3) * 5) +5 * 9 * (3 + 9 * (4 * 6 + 2 + 3 + 3) * 4 + 8 * 4) * 8 +3 * (9 * 8 + 4 + 5) + ((2 * 6) * 2 * (3 + 6 + 6) + 3) * 7 +8 * (6 + 4 * 8 * 8 * 4) +(6 + 8 * 8 * 2 * (2 * 9 * 3 + 3) + 7) * 5 +4 * 5 * (3 + (9 + 3 * 6 + 9 + 7) * 5 * (2 * 4 * 8 * 2) + 6 + 2) + 5 +2 * 5 * (8 * 5 * 4) + (7 * 2) * (7 + 5 + 6 * 6) +5 + 3 * 3 * 7 +9 * (3 + 7 * 3 + 7) * 2 * (6 * 7 + 3) + 4 + 5 +4 + 6 + 7 +9 + 2 * (6 + 5 * 5 + 4) * 6 +5 * 7 * (5 * 9 + 4 * 3 * (7 * 6 + 3 + 3 * 6 * 9)) +9 + ((3 * 7 * 9 * 6 * 5) * 6 + 9 * 4 * 8 + (6 * 5 + 7 + 9 * 3)) + 3 * (9 + 2) + 3 +7 + 3 + 6 * 6 * (7 * 4 + 9 + 7) + 4 +6 + 8 * (7 + 2 + 2 * 7 + (8 * 9 * 2 * 7)) * 2 * 9 + 7 +(9 * 6 + 7 + 2) + 3 * (4 * 2 * (3 * 6 + 5 + 3 * 8 + 6) * (3 + 4 + 9 * 7 * 2) * 7 * 9) + (6 * 6 + 4) + 5 +8 * (3 * 9) * 6 + (5 * 2 + 9 * 3) * 4 + (5 * 7) +7 + 4 + (7 + 6 * 7 * 8) * (8 * 3 + (4 + 5 + 3 * 9 + 6 + 5) + 8 * 5 + 5) * 3 +4 * (4 + 9) + (7 + 5) + 3 + 7 + 9 +3 + (8 * 9 * 3) * 9 + 2 * (7 * 4 * 3) +6 * 2 + ((2 + 4 + 5 + 8 + 2 + 6) + 8 * 9) * 9 * 5 + 7 +6 + ((3 + 2 + 9 + 9) + 8 * 2 * 6 + 4) + 3 * 6 + 4 * 9 +(3 * 5 + 7) + ((7 * 7 + 5 + 8 * 3 * 2) + 9 * (9 + 4 * 3 + 7) + 6) + 7 + 3 +(4 * (3 * 7 + 9 * 2 + 6)) * 5 + 9 + 7 + 4 + 7 +8 * 5 * 4 + 7 * (4 + 7 * (9 + 6 + 2 + 9)) + 9 +8 + 4 * 3 +7 + 2 + (4 * 3 * 9 + 9 * 7 * 9) * 7 +3 * 6 * 9 + (4 + 9 * 4 + 3) * 3 + 6 +3 * (3 + 7 * 6 + 4 * 4) * (9 + 5 * 5 + 6 + 7 * 5) * (3 + 7) + 4 +9 + 6 * ((3 + 7 * 6 + 9 * 4 * 4) + 5 + 5 * 3 + (4 * 6 + 3 * 5)) * 8 +9 + (5 * 9 + 2 * 4) + ((9 * 8 * 5 * 5 + 8) + 5 * 6 * 6) +(4 * (8 + 5 * 4) * 9 * 9 + 5 + 5) + 4 * 7 * 8 +3 * 5 + (5 * 4 + 9 * 8 * (6 + 4 * 9 + 4 * 7) * 9) +((4 + 4) + (6 * 2 + 9 + 3 + 5 + 7)) * 3 +6 * (9 + 8) +6 + 8 + 5 * 7 + (2 * 6 * (6 * 5 * 4 * 6 + 8 * 9) * (9 + 6 * 5 * 9 + 7 * 8) * 8) +((9 * 3 + 8 * 4) * 2 * 9 + 7) + 3 + 7 + 6 * 3 * 7 +(2 + 8 + 7 + 5 + 6 * (8 * 4 + 2)) + 8 + 4 * 4 * (3 + (2 * 6 + 6 * 9 * 8) * 9 + 9 * 5 * (4 + 6 + 3 + 5 * 9)) * 4 +9 + 4 * (5 + 4 + 7 * (8 + 8 * 2 * 8 * 2 + 3)) + 6 * 3 * (6 * 7) +(7 + 9 * 6 * (9 + 7 + 6 + 4 + 4 + 5)) * 4 + 5 +8 + (8 + 2 * (4 + 5 + 5 + 5 * 3 * 8) + (5 * 6) + 3 + 2) * (7 * (4 * 5) + 3 * 5 * 4) +3 * ((4 * 9) + 3 + 8 * 7 * 4) * 4 +5 * 9 + 8 * 4 + 2 * 3 +2 * 9 * 4 + 2 * ((3 + 8 + 7 * 9) + 7) +(7 * 3 * (8 + 3 + 2 * 5 * 9) * 9 + (7 + 2 * 9 + 5 + 2) * 6) * (9 + 6 + 4 * 9 * 6 + 6) +7 * 5 * 5 +(4 * 7 * 6 * 5) * ((7 + 5 * 3 + 4 * 2) * 5 * 9 + 5 * 6) + 3 * 8 * 5 + 9 +6 * 6 * (4 + 5 + 6 + 9 + 6 * 3) + 4 + ((7 + 5 + 6 * 7) * 9) * 5 +3 + 6 * 9 * 5 + 3 * ((9 * 7) * (6 + 8 + 5 + 7 * 8 * 7) + 4 + 4 + 4 + (6 * 7 + 4 + 2 + 5 + 9)) +9 * ((4 * 2 * 6) * 7 + 4 + 6) + 4 * 4 +6 + 8 + 5 * 4 * ((2 + 2) * 6 * 9) + 4 +(8 * 4 + 8) + 3 * 4 + 7 * 9 + (5 * (8 * 7 + 2 + 3 * 4) + 2 + 3 * 8 * 8) +7 * 9 + ((2 * 9 * 6 * 6) + (6 * 2) * 7 + (8 + 3 * 6 + 4 * 5)) + 8 * 9 +8 + ((3 + 3) + 7) * (4 + 3 * 3 * 7 * 7 + 9) +(9 + (4 + 6 + 7) + (4 + 4 * 4) + 6 + 4) * 3 +4 * 6 * ((8 + 3 * 3) + 7 * (5 * 7 * 3) * 3 * 8) * 5 + 2 * 3 +((6 * 5) + (7 + 6 + 7)) + 2 * 3 * 2 +5 + 3 * 8 + 4 * (9 + (2 + 7 + 7 * 3 + 8 * 2) + 2 + (3 + 6 * 7 + 5)) +2 + 7 * 4 * 7 * (7 + 3 + 9 * 5 * (5 + 6 * 6)) + 3 +((2 * 2 + 7 + 2 + 4) * 7) + 2 +6 + 4 + 3 + ((9 + 5 + 2) * 4) + 9 +8 + ((3 * 8 * 7 + 6) * 3 + 6 * 2) * (4 + (2 * 8 * 2 + 9) * (7 + 4 + 7 * 5 + 7) + 3) * 4 * 5 +4 * (8 * 2 + 8) + ((5 + 5 + 3) * 6 + 5) * (7 * 9 + 7) * (9 * 5) +2 + (9 * 4) + ((7 * 3) + 8) + 7 +4 + 6 * (9 * 2) +(8 + 6 + (7 * 2) * 3 + (9 * 2)) + 5 + 8 * 3 +7 + (4 + 5 * 2 + 8 * 7 + 5) * 4 * 4 +4 * 4 * 6 + (7 * 3) +(9 * 6 + 4 * 6 + (3 * 5 * 2 + 5) * 9) * 2 * (8 * (4 + 9 * 7 + 8 * 2 + 2)) + 5 +8 + 2 * 7 + 5 * (4 + (8 * 9 + 5 * 5 + 6) + 4 + 3) +5 * (3 + (8 + 5 * 2) + 2 + 6 + 7) + (7 * (9 + 4) + 8 + (8 + 9) + 6) + (7 * 6 * 5 + 6 * (9 * 3 * 9 + 4) * 8) * 4 * 4 +2 + 7 * 8 + ((5 * 3 + 6 + 5 + 4 + 4) + 2 + 9 + 4) * (8 * 2) + 8 +8 * 9 * 2 + 4 * (7 * 5 + 8 * 5 * 4 + 5) +(3 + 9) + ((3 * 2) + 5 + 4 * 8) + 3 * 9 + (3 + 7 + 7 + (5 * 7 * 7 * 9) + 5 * 8) * 5 +3 * 6 + 3 + 7 + (8 + 7) + 7 +6 + (7 + 5 + (2 + 8 + 3 * 4 * 3) + (9 + 6 + 4 * 2)) * 4 + (9 + 9 + 3 + 7 + 4 * 4) + 6 * (9 + (7 * 8 * 2)) +8 + (7 * 6 * 5) + (4 + 3 + 2 + 9) * 6 +6 + 7 * (7 + 3 + 3 + 9 * 2) +(8 * (4 + 3 + 5 + 9 + 3) * 3 + 3 + (9 * 7 + 9 + 9 + 4 + 7)) * (3 * 3 * 3 + 6 * 9) + 2 +(2 + (4 + 8 + 6 + 9 * 3)) + 2 * 2 * 7 +4 + 5 + ((5 * 7) * 6 + 9 * 4 * 5 * 6) + 6 + 3 * 8 +8 * 7 + 5 + 5 +(3 + (7 * 4 + 3) * 9 + 4 + 7 * 5) + (6 + (3 + 3 * 5) + (6 * 6 * 7)) +4 * 8 * (7 * 7 * 6) + 6 * (2 * 5 + (6 * 4 * 9 + 2 + 5 * 5) * 7 * 5) * (6 * 6 * 7 * 6) +(4 * 4 + 5 + 9 * 9) + 2 + 2 + 9 * 3 * 5 +((9 + 7 + 6 + 8 + 8) + 4 + 4 * (2 * 5 * 8)) * 4 + 7 * 7 + 4 * (6 + 2 + 7 + 5 * 6) +9 + 5 + 9 + 3 +4 * 6 * 5 + 3 + (7 * (2 + 5 + 2 * 5 + 9) + (2 + 9 + 8 * 9 + 3 * 3)) * 5 +(3 * 5 * (4 + 2 + 8 + 4 + 7) + 7 * 7) * (6 * 7 + 9 * 7 + 7 + 9) diff --git a/input/2020/day19.txt b/input/2020/day19.txt new file mode 100644 index 0000000..2dd9263 --- /dev/null +++ b/input/2020/day19.txt @@ -0,0 +1,562 @@ +72: "b" +45: 46 52 | 9 72 +85: 9 52 | 9 72 +82: 52 87 | 72 77 +133: 52 30 | 72 56 +118: 7 52 | 70 72 +18: 52 113 | 72 52 +119: 72 46 | 52 18 +25: 19 72 | 103 52 +32: 90 52 | 78 72 +50: 113 113 +71: 72 106 | 52 128 +3: 103 72 | 18 52 +41: 86 72 | 19 52 +96: 86 72 | 108 52 +33: 44 52 | 104 72 +127: 52 36 | 72 50 +51: 72 79 | 52 38 +43: 72 50 | 52 106 +14: 32 72 | 129 52 +6: 2 72 | 33 52 +108: 52 72 | 72 52 +129: 6 52 | 82 72 +34: 127 72 | 3 52 +74: 128 52 | 9 72 +80: 52 103 | 72 19 +2: 134 72 | 13 52 +54: 128 72 | 114 52 +19: 72 72 | 113 52 +0: 8 11 +30: 132 72 | 39 52 +60: 72 64 | 52 5 +4: 18 52 | 114 72 +57: 72 71 | 52 54 +111: 52 27 | 72 102 +76: 122 52 | 75 72 +134: 86 52 | 9 72 +49: 17 52 | 81 72 +124: 103 72 | 86 52 +123: 72 28 | 52 121 +117: 18 52 | 86 72 +26: 51 72 | 58 52 +62: 85 52 | 44 72 +55: 126 52 | 92 72 +115: 72 13 | 52 67 +109: 128 72 | 106 52 +52: "a" +93: 60 52 | 133 72 +64: 67 72 | 84 52 +102: 52 128 | 72 48 +84: 86 52 | 46 72 +77: 41 72 | 21 52 +27: 52 9 | 72 108 +95: 89 72 | 105 52 +36: 52 72 +110: 72 50 | 52 9 +9: 72 72 +120: 72 19 | 52 18 +67: 52 48 +112: 65 72 | 119 52 +75: 62 52 | 123 72 +23: 15 72 | 119 52 +42: 131 52 | 61 72 +94: 52 91 | 72 18 +66: 52 128 | 72 103 +10: 113 108 +37: 52 18 | 72 50 +98: 72 69 | 52 94 +126: 115 52 | 29 72 +79: 59 52 | 94 72 +104: 19 72 | 36 52 +125: 96 72 | 4 52 +122: 52 73 | 72 112 +130: 52 20 | 72 45 +90: 72 40 | 52 88 +132: 103 52 +121: 91 52 | 46 72 +7: 52 114 | 72 128 +5: 52 66 | 72 41 +97: 52 18 | 72 91 +89: 72 109 | 52 116 +53: 52 108 | 72 128 +114: 52 113 | 72 72 +16: 1 52 | 110 72 +113: 72 | 52 +31: 52 14 | 72 12 +69: 52 103 | 72 48 +128: 72 52 +40: 72 3 | 52 83 +101: 63 52 | 127 72 +1: 72 91 | 52 114 +58: 52 111 | 72 99 +13: 19 72 | 9 52 +35: 22 72 | 125 52 +65: 72 114 | 52 91 +12: 52 24 | 72 93 +46: 72 72 | 52 52 +20: 9 72 +73: 72 37 | 52 43 +15: 52 50 | 72 108 +103: 52 52 +106: 72 52 | 72 72 +21: 36 72 +28: 72 50 | 52 46 +78: 72 16 | 52 23 +70: 36 72 | 19 52 +87: 72 107 | 52 47 +116: 19 52 | 106 72 +29: 72 68 | 52 65 +8: 42 +68: 9 52 | 128 72 +99: 110 72 | 25 52 +17: 52 118 | 72 130 +11: 42 31 +48: 52 52 | 72 52 +83: 48 113 +105: 52 100 | 72 80 +61: 55 52 | 26 72 +100: 48 52 | 108 72 +56: 52 53 | 72 74 +63: 52 106 | 72 9 +44: 72 114 | 52 128 +47: 52 50 | 72 36 +107: 52 36 | 72 91 +39: 114 72 | 86 52 +86: 52 72 | 52 52 +24: 52 95 | 72 35 +81: 98 72 | 34 52 +131: 49 52 | 76 72 +92: 52 101 | 72 57 +59: 52 114 | 72 50 +38: 52 74 | 72 124 +88: 97 72 | 10 52 +22: 117 72 | 120 52 +91: 72 72 | 52 72 + +bbabbaabaabaaaababbbbabaabbaabab +baaabaaabaaababbabababaabababaaa +aaabbbabaabbbbbbbbabaaba +aaababbbaaabaabbabbbbabbaaaabbbb +ababaabbaabbbaabbbabbababbabbbbbbaaabbbbaaaabbbabbbaaabbaaaabbaa +bbbbaabaababaaabbbaaaaabbbbabbabaaabaabaabbaaaba +bbaababbbbbbaabbbbbaaaabbbbbabaaaabbbabaabbbaaaa +aaaaaaaaaababaaaabaaababaabbbbaababaaaaaaaaabaaabbaabbbaaabaabababbbbaaabbbbbabb +bbbbabbbbbbbbbbababbabbabbbabbbaaabbbbbaabbbbbaa +bbabaaababbbaabababbabbbabaabbbbbaaabbaaaaabbbaaaaabaabbaabbabba +babbbabaaabbaaaabaaaaabbbabaaaaa +ababaabbaaabbabbbbbbbaaaaabaabaabaaaababbaaaaaaa +baaaababaaaaaaababaaabba +bbaabbbaaabababbbaaaaabbbbbbbaaaaabbaabaabaaabaabbbaabaaaaaababbababbbbb +bbababbbaaabbabababbbabaaabbaababbbaaabaaabbbabbabababab +babbabbabbbaabbbbaabaaabbabababbbbbbbbaa +abbaaaaaabbabbaabbabbabababbaabaabbbaaaa +ababaabbabbbbbabbabbbaaaabbbaabbabbbbabb +aaabbbbaabbbababaabaaaaa +babbbaaaabaaabaaabbabbabbabaabab +aaabbaabaabbabaaaaaaaabb +ababbbabaabbaabbabaababababbbbaa +babbabaaabbbababbbababaaaaaabbaaababaaab +bbaababbbabaaababbaaabab +aabababbbbaabbbbabaabaababababaaabababab +baaaaabbbbbaabbbbbababbbbbbabbab +baaaabaaabaabaaabbabaaaababaaaab +aabbbabababaaabababbaaaa +ababbbaaabababbaaabaaababbaaaabaabbbbbab +ababbbaaaabaaaababababba +aaabbbabaabbaababbbbabbbbbabbabaababbabb +aabbabaaaabbaababbabbabbaaabaabababaaabaaaaaabab +abaaabbbabbaaababaaababa +bbaaabbbbababbababaababb +aaabbabababaaabaabbabaab +bbabbaaaabbbaabbaaabbbbbbbbabaabbbbbabbbbabbaabaabbaababaaabaabb +babbabbabbbbababaaaaabaababbbabbaabaabbbabaaaabb +bbabbaababababbabaaababb +babaaabaaabababbaabababbabbababaabbaaabbbababaaaababbbbbaaaabbbbabbbbaaa +aaabaabaaabbbaabbbabbbbbbbababba +aabaababbbaaaababbabaaaa +aaaabaaabbabababbabbbaab +baaabaabbaaaababbbaabaaaaabbabaaabaaabaabbbbbabbbabaabababaabbaaabbaaababbabbbbb +aabaabbbababbbababaababaabbbaaaa +aabaabbaaaabaabaabaaaaaabababbaababaaabbabbbbabbbaaaaaaabababbabbbbbabaa +baaabbbaaaaaabbbbbaaaaabbabbaabaaaaabbba +baaabaaaabbbbaaaaabbaababbabbababaaaabbbbabbaaabaabbbaabbaaaabbb +baaabbbabaabbabaabbabaaabaaabbbaabbaaabbabaaabab +abbaaabbaaabbabbabaaabba +aaaaaaabbabbbabababbbaaaababaabbabbaaabaabbaabab +aabababaaabbaabbbbaabbbababbaaaa +aabbbabaaabaabbbbbbabaabababbbbb +bbbababbbabbbbbbbabaaabaaaabbabaaabbbbabbabababaaabaaaaa +abaabbaabbbabaabbabaaabbaaabbaaaaabbaaabbaaabbbbbabbaabb +abbbbbabaabaabababababbaaabababbaabbbababbaabaaa +aaabbaabaabaaaabbbbabbbbbabaababaaaaabab +aabbbaabbbbbababaabbbbbbaababbbb +bbababbbaabaaaabbaaaaabbbaababaabbaabaab +aabaababaabbbbbbbabbbbab +aaaaabaababbbabbabbbaabbbbabbaaa +baaaabababbbabbbbaaababbbbbababaaaaaaabb +baaaabaabaaabbaaabbbbbbaabaabbaabbbbbbabbbbbbbbbbabaabababbbbabbaababbbb +bababbabaaabaaaaaaababbbbbabbbaabaaabbbb +bbbbbbbabbabaaabaaaaaaabaabaaabaaaaaaaaababbaaabbaabbaaababaaabbabaaaaaa +abbaaababbbabaabbaaabbab +aabaabbbabaaaababaaabbbabaaaabbbbabbbababbbbabaaaaaababbaaabaabbbbbaabababbaabbb +abaaabaabbabaabbaabbaabaababaaaa +babbabaabaaaaababaaaabba +bbabbbbaaabbbabaaaaabbbb +abbabababbabbbbbaaabaaabaaaaabbaabbabbababbaabbaaabbbabbabbaabbbaabbabaaabaabbab +baabaaabbbbbaabbbaaababa +bbaaabbabbbbabbabbaabbaabaaaaabbabaabbba +babbbabaaabbbaaababababb +abaabbbbbbbbbababaaabbbabbababaaabaaaabababaaaab +bbbbbabbbabbbbbababbabaaabbbaabbbbabbbbbabbabababababaabaaabaaabbaaabaaaaaabbaaa +bababababbbbbbaaaabbbbaabbaaabaababbbbaaabbabbab +ababbaabababaababbbbbabbbbabbababaaabbbabaaaabbbaaaaaaba +abaabababbbbabbbbabbaaab +bbaaaaaaabbababaabbbababbabbbabbbaabaaaabbabbaba +abbbaabbabbabaabbbbbbbaabaaaaabbbbaaaabbbbbbabba +aabbbbbbaaabbaabaababbbababbabaaaaabbaaa +abaabbaaaabababbabbabbabbbaaaaab +babbbababbbbbbbababaaaaa +baabbbbbaabbbaabbabbababbbbbbbbb +bbaaabbbbbbabaabaaaaabaa +bbababaaabbabbabbabbbaaabbabbbab +bbbbabbababbababaababbaa +bbababaabbabaabaabbaabab +aabbbaabbbbaababbabababa +ababaaababbbbaaaabbbbaaaaaababbb +baaaababbbaabaaabbabbbabaababbabbaaaaaaabbaaaaaa +abbbababbaababbbbbaabbbbababbbaabaaababaabaababbbabbbbab +bbabaaabbaabbaaabbbaaabaaaaabbabbaaaabaaabbbbabbbaabbbbbabbabaababaaaaab +bbbbabbabbbbbbaaaaaabbbbabaabababbabbbbbbabaabbaaabbbbbbbbbbaaaa +baababaaaaabbbaaabaabbba +bbbbababbbabbaabbbabaaababbaaaababababaa +aaaaaaaaaaaaaababaaababbabbbabaa +aaabbabababbbaaabaabbbbbababbbbaaabbbabb +aabaaaabbbbbaaaaababbaabaaabbbbabbaaaaaabbababbbaababaaabaabbaabbabaaaaa +aaaabaaabbaabbaaaabbabba +bbbbaaabbaababaaababbabb +abbbbababbbbabbbbbbbababbaabbbbbaaabaabaabababbabaaabaaa +baabbabaabbbaababbabbaba +bbbbaabbbabbabaaaabaaaaababbaababaaabaabbbaaabaaaaababab +abbbbbbababbabbbbaababababbabbabababbbbb +aaabbbabbbbaaaaaabbbabaababababb +aabbaaabaaabaaabbbaaabaaaabbaaaaaaabababbbaabaab +babaababbaabaaaababaaaaa +aaabbbaaaabaabbbaaabbbbb +abaabaabbaabbabaaaabbbbaaabbbbabaabbbabb +baaababbabaaababaaababbababbbbba +aabbaaaabbabaabbbabaaabaaaaaaaabbbbaaaaa +bbbabbbbaabbbbaabbbaaaabbbbaaabb +abaaabababbabababbaabbbabaaabaaaaaaaaaabaabbbaaaaabbbbbbabbabbaaabaaaaaa +bbbbbbbabbabbaabbabbbaaabaabbaaa +bababbabbaabaabbaaabbbbabaabbbbaaabaaabb +bbbbbababaaaaabbabbbbbbabaaaabab +babbabaabbbbaaabaaabbbbaababaabbaabbaabb +ababaabbbbbaaababaabbaaaabbabbbbaaabbaaa +ababbaabbbbbbaaaaaabbbbb +babbabaababbabbabaabbbab +bbaabbaabbbbaabbabbbbbbaabbbaabaaaababbbbaaabbbbbaabbaaa +aabaabbbbabbbbbbabbabbaaabaabababbbbbabbbbaabaaa +abbbbbbaaabbbbaaabbabbbb +aaaaaaaaababbbabaaabbaabababbbba +baaabbaabaaaabaaabaabaaabbaabbbbaaaaaaababaababb +ababbbaababbbbabbabaaaaabababbba +aaaaabaaaaabbbababaaabbbabbbabba +bbbabbbaaaaaaaaaaaabbbbb +abbbbbbabbabbabbabababaa +baaaaabaaaaabaaabbaabbba +baaaabbbaababbbaaaaaaabb +bbbabaabbabbabbbabaabbbbaabbaababaaabaaababaabbb +bbbabbaabbbaabbbbbbabbbabbababababbabbbb +baabaabbbbbaabbaaaababab +bbabbaabbababbabbbabaabbbabbbbbaaaabbabaabbbbbbbababbaba +babbabbaabbaaabbbbabbbbabaaaaaaabbbaaaaa +abaabbaabbbabbbaabbabaaaaababaaaaaaaabbb +aababbabbbabbaabbabaaabbabbabaabbbbaaababbabbaaabbaaaababbbaaabbbaabaabaabababaa +abbabababbaaabbbbaababbaabaabbbbbbbbbbaa +bbbabbbabbabbbbabaaabaaababaaababbbaababbbbabababbabbbabaaabaaaaaabaabbb +baaaaaababbabaabbbabaabaabbbbbabaaababab +baabaabababbbbbabbbbaabaaaaabbbb +baabbabaababbbabbabbbbab +bbbbaabbbbbaaaabbbbbaaaa +bbbbaababaabaaababbbbbaa +bbbbbabbaaabaababbbaaaababaaabba +ababbbabbbbaaaababaaaabbbbaabbbaaaaaababababbbbababbbbbaababbbabaaaaaaababaabbababbbaaaa +aabaababbbbbababbaabbbab +baaaaababbbababbababaaab +baabaabbaaabbaaaabaabbbabbabbbbababbbbab +abbbbbbababbbabaaabababbbbaabbbabbbbababaabaaabb +bbabbabbabbabababaaaabba +abbabbbabbbbbababaaabaaa +bbbbbaabbabbbbaaabaaaaaabbbabbabaabbbabbabbabaaaabaababbbbbaaabb +baaabbbaaabaabaababaabab +baabaababaaaaabaabaabbaababbbbbabaaabbababbaabab +bbabbbbabaaaabaaaabababbabbabaab +babbaababaaaaaabbbaabaab +abaabbabaaabbbabaaaaabbbbbabababbbbaabbabbbabbbbabaaaaab +ababbbabaababababaabaaaa +abaaabaaababbbabbaababaabaabbaab +aaabbbbabbbaabbabbabaabbbaabbbaa +aaabbbaaaabaabaaabbbbbbb +abbbbabbababaabbbbaababbaabaabbbabbbbabbababbbab +baabaabbbbaaaababbabaabbbbabbaaaabbbaaaaaaababaaaabaabbbbbaaaaabbbbaaaaaaaaabbababbabbba +abbaababbbaaaaabbaabbaaa +babbbbabbbaababaaaaaaaaaabbbbaabbbababbbabbaaaaabababbaabaabbaaaaabaabbbaaaaaaaaababbbbbabbaabaa +abbbabababbabaaaababaaaaababbbbaabaabbbababbaabb +abbaaabaaabbabaaababbaab +bbaabbbabaabbbbbabbabbbaaabbaaaabbaaabbbabbaabbababbbbababbaabab +abaaabbbbbabaababbabaaaa +bbababbbbbbababbaaaaaaabbabaaabb +bbbaabbbaabbbbaaabbabbaabaabaabbbababaaa +babbbaaaaabaabbbabbbbbaa +abaabbaabaabbbbbabbbaabbaaabbaaa +abbbaabaababbbabaaaaaaaabbbabbbabbbaabab +aaaabbaabbabbaabbbaababaabbabbbbabaaabbaabbbbbbbaababbbbbbaabbabaabbbaaabbaabbba +abababbabbabbabbbbabbbab +bbbababbaaaabaaabaabbbba +bbbbaababbbbbbabbbbbabbaababaabaaababaab +bbaaaaaaaabbbaaabaaabaab +babbbbbbbbbbbaaabbaaabbaaabbabbaaaabbaaa +abaabbabaaabaababbbaaabb +abaababaaaaaaabbbababaabaaaababaabbabaabababbbba +aaabbabaabaababaababbbba +bbaaaaaababaaababababaaa +abbabaaabaabaaabbabbaaba +abbabababbabaabbabbabababbbaaaaa +aabaaabaababbbaaababaaab +bbabbbbaabaaabbbabbaaaab +bbbbababbbbaaababbbaaaba +bbbbbbababbbbbbaaaaaabab +bbababbbabaaabaabaabbaaaabbbabbabbbbbbaaabbabbbb +baababbbaaabbbaaaabaabbbaabaaabb +abaabbabbaaaabababbaabbb +bbbabaababbbbbbabaabaaabbabbbbbbbbbaabaabbabbbaaabbababb +babbabbbbbbbbabbbaaaababbbbbbbbababababa +baabababaabbaabbaabbabba +baabaababaaaaabbbabaabbbababbbaaabbaaaba +bbbbabbbbaabbbababbbaabaabaabaaaaaaaabaaabbaaaaa +bbabababbaabbabaabbabbaabaababaabaaaabba +abbbbbbaaaaabbaabbbbbaabaabbabbbaabababaaaababbbbabbbbbabaaabbab +bbbbaaabaaaabaaaaabbbaab +aabbaabbaaaaaaaaabbbbababaabababbabbabbbbbbbababaaabaabb +bbabababbabbabbbbaaaabaaaabbaababbbaaaaaabbbaaaa +bbabbabbaaabababbabbbbababaabbabbbbabbbababbaaab +abaaaaaabbbaabaaaabbbbabbababaab +aabababbbabbabbabbaabaaa +ababbbaaaaabbabaaaabbabbaaaaaabb +baaaababbbaaaababbbbbabbbbbaaabaabbabaaabbbbbabaaaaaaaababbbababaabbbbbbaabbbbaa +baabbbbbbbbbaabaabbababb +bababbababaabbbbababaaab +baababbbbabbaabbabbabbaabababbabaaaabbbaabaabaaa +aabaabababaaaabaabababbbbaaabaaaabaaabab +abbaaaaababbabbabaaaabbbbaaaabba +babbbaaabaaaaabbbabbbbab +ababbbabbaabbabaabbbabba +abaabbabaaaabaabbaaabbbbbbbabbaaaaabaabb +bbbaabbaaabbbaabbaabaabaababbaab +ababbbaabbbbbbbabaababaaabbabbabaababaaabbbaaababaabbaab +bbbbbbbabbaaaaaaaaabbbababbbbbbb +aabaaababbabbabaaaaabaaabbabbaabaabbbbbbababaaaa +baabaaabaaabbbabbababbabababbaba +abbbabbbababbabbbbbbaaaababbabbbaaaaaaaaabbaabbabbaaaaabbbabaaaabababbbaaabbabbb +baabaaabbabbababbbbaabbaaaabbaabbbbbabbbabbbaaabbbbabaaa +abaaabbbabaabaaaabbbbbabaaabbbbabababbbbbabbbbabaabaaaaa +aaaaaaaaabaaaababbbaaabababababa +bbbbaabbbababaaaaaaaaaab +aaabaaaabaaaababbabbbbbbaaaabbababbbabaa +babaaababbbbbbbaabbbbabb +baaabbaaaabbbbaabbbababa +baababbbaababbbabbbaabbbbbbbabaaaabbaaab +baaaabaabaabaabbbababbababbbaabbaaabbaabbaaaabba +baabaababbbaabbbabbabababaaaaaaa +bbbababbaabbababaaaaabbb +bbbabaaaaaaaaaaabbbaabbbbabaabbaabaaabbbabbaabbbbabbbbab +aaaaaaabbaababaaaaabaaaababbbaab +abababbaababbbabaabbbbaaaaaabaaaabbaaaba +baababbaaabaabbbbbbaabbabbbbaabbaabbabaabbabbbabaabbabba +abaaabbbbabbbaaabbbbaabaabaabababbaaabbbaabbbbabbababbbabaabbaaabaaabaaa +aabaaabaababbaabbbbbbbabbaaaaabbaaaabbba +aabbabaaabbbbabababbbbbbbaaabbbabaabbaaababbbbabbbbabaaa +abaabbbbbbbbabbbabbaaaaabbaaaaaaabbabbbbabababaa +ababaabbbbbbabaaabbaabba +bbbbababaababaaaaaaabbaabaabaaaa +abbbababbbbbaaababaaaabb +aabbbbbbaababbbaababbbabbaabbabaabaababaaaabaaab +aabaababaaabbbaabbaababababbbaaaabababaa +abaabaabbabbbababbaaaabaabaaabaabaabaabbabbababbaaabaaababaaabba +baaaaabbbbbaaaabbbbbbabb +abbbababbbbbbbbaabbaaaaababbbabbabababbaabaababb +aabbaababbabbaabbbbbaabaaaabbabbababbaba +ababbbaababbbbbabbbabaaa +abaaabbbabababbaabaaabbb +abababbabbabbababbbaabbaababbbaaaabbaaab +abbbbabbbaabaabbbaaaabbbbaaabbbbbbbabbbaababbababbbabbab +bbbbbaabbbaababbabbbaaaababbbabaaaababaaabaabbaa +ababbbaababababaaabaabbbabaaabbbbaabababbabbbbbaababbaaa +baababaabbbabbbbaaabaabb +babaabbbbbaabbbbbbabbabaabbbaaaaabbaabbabbbbaabaabbabbbbbbabbbaa +baabbabaaabbbababbaaaaba +abbbbbabbaaabbbabbaabbaaaabbbbaaaabbabbabaabbbba +aaaaaaabbaaabbbaaaaabbab +baabbbbbbaaabbbbaabbabaaaababbabbbaababaaabbbbbaabaaaaaabaabaabababbbaaa +aabbaaaaabbabaaaabbbbbaa +bbbabaabbbaaaaaaaabbbabaababaaab +babbabaaaaabbbababaaaaaa +baabbabaabaaabbbaabaaaaa +aabbaababbababbbbababaabaabbbbba +abbbbabaaabaaababbbbbaaaaaabaaab +bbbabaabbbbbabbaaababaaa +bbbbbabaabbaaabaaaabbbaaabbbbbbabaabbbaaabbbbbbbbaabbaaa +bbbbaaaabaabaabbbbabbabbbbbbbabaaaaabaaabbabbbbbbaabbbabaaabaabb +bbbbbaaabbbbabaabbabbbbbbaabaaabbabbbbbaabbbabbaabbbbbaa +aaabbbabbabbabbbbabaaaaaabbbbbaaaaababaaaaaaabbaabbabababababaaabbbababaabbaaaabbaaabaaababbaabb +abbaaaaaabbababaaababababaaaaabbaaabbaaa +aaaabaaaaabbabaaaaaabbaa +bbbbbbbabaababbbbbbbaaaabbbbbaab +ababaaaababbabbabbbababaabbaaabbabbbbbbbaabbababbbabbaba +bbbbbbbaaaaaababbaabbaaaaaababbbabaaabab +baabbbaaaaabbbbabbababbaaaaababaabbababaaaabbbbbbbbaaaababbbbbaababaaabb +bbbabbbaaabbbaabaaababbaaaabbaaa +baabaababbbbbaaabbbbabaaaabbabbaaaabaabb +abbbaabbabbabbabbbbaabbbbbabbbab +babbabaaabbabbbabaababaabbabaaba +baababbbbaaaabaaabbbaabbbbbaaaaa +bbaababbaaabbbbabbbabaaa +babababaaabbababbbbbabbbbbbababbabbbabbaaabbabbbabbaaaabbabbbabbaabbaaba +bbbbaaaabaaaaaaabbaaabaabaaaababaabaababbbbabababbabbbbaabbaaaabbbbaaababbbabbababaababb +babaaabbaabaaabbbabbbaabaaaabbbaaaaaabababababbabbababba +aaaabaaabbabaaabaabbbaaabbbbabaa +abbababaabaabbaabbbababbbbabbbbbaabbaaaaaaaabbabaaababbbbbabbbaa +aababbbababbabaabbbbabbaaabaaababbbbabababaaabaaaababaaaaabbaaab +ababbbaaaababbbaabbbbabaabaaabaabbbaabbaabbbbbaabbbaaaaabaabbabb +bbbabbaabaabababaabbababaababaaa +aaaaaaabbbbbbbabbabaabaa +abaabaaaaabbaaaabbbbaabaaabaabaabbbaabaa +aabbabaabaaabbaaaaaabbbb +abbabbaabaabababaabbbaabbbbbaababbbbabbbabbbaaab +abbaaabbabaaaabaaaaaabaaaababbbbbaabaaabaaabaabbbbabbabbbbbaaabababbabbabbbbbaaa +abaaabbbbabaaaaaabbaaababaaaaabaababbaababaabaaaabaaaaabbbaaaaab +aababababbbbbbbaabaabbabbbbbbaaaabbbaaaa +aabbaabaaabbaaaaaabaababaabbbbab +aabaaababbaaaaaabbababababaaaaabbababaab +baababaababbabbbabbaabaababbaabbaabaabbabbbbbaab +abaaabaaaaabbbaaabbababababbbabaaababaaa +aabaaababbbbbabbbaabbabb +aaabbabbaaabbbaabbbbbbababbababb +aabaaaabaabbbbaaaaaabaaabbaabbbaabbbbbbb +bbbbabaaaabbababbbabaaabbabaabba +baabaabaaabababababbabbbbbababaaaaababab +aabbbaaaaabbbbaaababbaaaababbbbaababaaaabbbabaab +abbaaabbbaabbbbabababbbabaabbbbaaabbabaabbaaaaba +aaaaaaabbbabaabbaabbbabaabbababaabbbbbbaabbbbaaaabababaaaaaabbbbaabbabba +abbbbabaabaabaabbbabbbbaabbbbabaabababbbbbaabbabbaabaaaa +abaabababbbbbabbbabaaaab +bababbabbbbabaaabbaaaabb +abbabaaabbbababbbbbaabbaaabbbbaababbaaba +bbbbaabaaabbbbbbabaabaaaaabaababbabbabbbabaaabab +babbabbbbbbabbaabbbabaabbbbbbbbb +babaabaaababbbbaabaabbbaababaaabbbabbbaaaaaaaaaabaababbbbaabbaaa +bbbbaabaabbabbaaabaabaaababababa +abbaababbbbabbabaabbbbbaababaaabaaabbbaaabaababbbbbaabaa +aabbaaaabbbbababaaaabbab +aabaababbabbbabaaabababaabaaabbaabaaaabb +bbabbabbbbaabbbbabaabaaaaaaaaaababaaabba +aaababbaabababaabababaaababaabaaabaaaabb +baaabbbabbaaaaabbaabbbab +bababaabbabbbababaaaababbabbaabbbbbaababbabbabbb +bbababaaabbbaabbaaabbbabaaabbbaabbbaaaaa +aabbbbaaabbbbbabaabaaababbaabbaaaabbbbbaabaaababbbbaabab +aaaaaaabaaaababbabababbaaababaabaabaaaaaabbaaaaaabaabbbaaaaabaaa +abaabbbbbbbabbaaaababbab +bbaaaaaaababaabbbaabaaabaababaaa +aabbbababaabababbabbbaab +abaabbbbbbaaaaaabbbbbbbabbbbabbbbabbaabb +aabbbbaabbababaabababbba +bababbabaaaabaaabaababaaaaaaaabb +bbbbaababbbabbaabbaabbaaabbbaabbbbabbaabaaaaaabb +bbbbabbabbbbaabaaaabaaaabaaaaabbaaabbbbaabaabbbaaabaaaaaabbaabbb +abbabaaabbaababbaabaaabbbbabbaabbbaabbbb +bbaaabbabbbbbababababaababaaaaaababaaaaaaabbbbab +aababbbaabbbbabaabbabaab +bbbaabbbaaaaabaabbaaaaab +bbabbabbbbaaabbbbbaaaaaababaabbaababbabbabaabbbabbaaaabb +aaabbabaaabaabbbbbaababbbaaaaaababbabaab +abbabbabbbaabbaabbaaabaa +abaabbabaaaabaaaaaaaabab +abbbbaabaabbabbbaabaaabbbaaaaaaa +abbabbaaaababbbabbabbababbaababaabbabaabbbbaaabb +aabaaaaabbbababbbaaababbabbbbababababaaabbabbbba +aaabbabababbbababbbaabbbbaabbbbaaababaaa +aabababbaaabaaaabbababaaaaaababb +abbaaaaaabababbaabaabaababbaaababaababbbaaaababbbabbaaabaabbabbaabbaabba +bbaaaabaaaabbaabbbaaaabaababbbbb +ababbbabbaababbbabaabaababbbababbbaabbaaabaababbabaaaaab +aabaaabaababaabaababaaaa +baabbbbbbaaaaabbbaabbbaa +abbabbabbabbabbbabbbbabaabbbabbb +ababbaabaabbababbbbababbbbbbabaabbabbbabbabbbbaa +bbbabaabbababbabbbabbbaa +aabaabbbaaabbababaabaaababababbbaabababbabaabbbabaaabaabbababbba +abaabaabababaababaabbabb +bbaabbbaaaabbbabaaababaa +bbbbabbbaabbaaaaabaaabba +baaaabbbbbbbaaabbaaaaabbabaabbabaabaabbbbaabbbabaababbaa +bbabaabbbaababbabbaabbaaaaabbbababaabbbaaaaabbab +babaaababbbabbbbabaabaaababaabbb +baaabbaabaaaabaaaaabaabaaaaabaaaaaabababababaaab +bbbbbabbbbaaaaaabaababbababbaaaaabbaabbb +abaaabbbabbbaabbbaaabaab +bbbabbaaaaabaabaaabababaaaabbbabbbbbabbbaababaab +bbbbabbbbaabbabbaabbbbbbabaaababbbbaaabaaaaabaabaabbaaab +baaaabbaaaaababbbbaaaaabbbbbbbaababbbabb +bbaabbbaababbaabbabbabababbbaababaabaaaa +bbbabbbbbaaaabbbabbbbbbaabaabbabbababaab +baababbbaabaabaabbaababaabaaabbbbbbababbbaaaabba +babbabababbbbbabababbbba +aabbbaaabbaaabbaabaaabab +bbbbbbbaabaaabaabbbbbabaabaababbabbabaab +bbaabbbbaaabbaababaaabbabababbbaaaabababbababaaaaabaaaab +babbbabaaabbabaaaabbbaabbabaabab +bbaaaabaaaaaaabbababbaaaababbbbbabaabaaababbabbbabbaaaaaaaaaababaaabbabbbbbbabaa +ababaabbaabbaaaabaaaaabbababbbba +baaaababbbbbaabbbaaabaaa +aababababbbaabbabbaabbbb +baababbaaaabbabbababbaba +babbabaabbbbbbbaaabbbabb +bbbbbbabbbbbbbabbbbbbabbabaaaabb +bbbaabbbbbbbbababababbbb +aabbaaaabbabbabbbbbaabaa +bbababababbbbaabaaabaababbbbaaabaaaabbab +ababbaabaabbbaababbbaababbabbabbaaabbababaabbaabababaaaaaabaaaaa +aabaababbabbbaaaabababbaaaaabbab +abbaaabbaabbaababbbabbbaababaaaa +aabaabaabbbbbabbaabbaabaaabaabaabaabaabbaaaabaaababbaabb +aabaaaabbbbbaaaabaaabbbbbbbbaaabababaaabababbaabbbaabaabaababbaabaaaabab +bbbabbabaaabaaaabababbaabaaabbbabbaabbba +bbaaaabababbbbaabaaabbaababbabbaaabbbababaaaabaaabbbbbbb +bbaabbaaaaaaabaaaaabbbbabbbbbabbbaabaabaaabbbabb +bbaabbbaabbaaaaaaaabaabababababbaabaaaaa +babbababbaabaababaababbabbbbbbabbbbbaabbbaabbbbbbabaabab +ababaabbaabbbaabaaaabbba +aaaabaaaabbabbbabbbbababbbaabbab +aaabaaaaaaabbabaaaaaabbb +bbbbabbaababbaabbbabbabbabaaaabbabaaabba +ababbaabbbabbbbbaaaabbba +abbbbabaaabbbaabbbbaaaabababaaaa +aaabaabaaabbbbbbaaabaababbabbabbbbbabbab +aaabaababaaaaaabbababbabbabaabbaabababbabaabaabaaaababbabbaabbaa +baaabbbabbabbaababbbaaab +aabbabababaabbabaaaaaaba +aabbbabaabbaaaaaaababbaa +bbbbbbabbaaaabaaabbabbabbaaaababbbababaa +aababababaaaaabbaaaaabaabbabbabbabbbabba +bbbbaaababbbbabaabbbaaaa +babababbbabababaabaabbabbbbbbbbbaaaabbaaaababababbabaaab +abaaabbbaabbbaabbbbaaaba +aabbaabbbabaaabaabbabaaabbbbbaba +bbbbaaabaaabaabaababbaabbbababbbabaaabbbabbaabaababaabababbbbabbbababbba +abaaabbbaabbaabbabbabbbabbbaaaaabaaabaabbbbbaabbaaabbbbaabababab +bbabbbbaaabbbabaababbbaaababaabb +aabababbbaabbabaaaaaabab +abaababaabbababaaabbaabbbbbaabbaaaaababa +aaabbbabaababbbabbbaaaabbabbbbaabaaabaaa diff --git a/src/day16.rs b/src/day16.rs index 2d9e98a..82497cf 100644 --- a/src/day16.rs +++ b/src/day16.rs @@ -1,15 +1,11 @@ use aoc_runner_derive::aoc; use std::ops::RangeInclusive; - -fn split_once<'a>(input: &'a str, delimeter: &str) -> Option<(&'a str, &'a str)> { - let idx = input.find(delimeter)?; - Some((&input[..idx], &input[idx + delimeter.len()..])) -} +use crate::split_once; struct Rule<'a> { name: &'a str, - a: RangeInclusive, - b: RangeInclusive, + a: RangeInclusive, + b: RangeInclusive, } impl<'a> Rule<'a> { fn parse(input: &'a str) -> Option { @@ -17,22 +13,22 @@ impl<'a> Rule<'a> { let (a, b) = split_once(rem, " or ")?; let a = { let (start, end) = split_once(a, "-")?; - RangeInclusive::::new(start.parse().ok()?, end.parse().ok()?) + RangeInclusive::::new(start.parse().ok()?, end.parse().ok()?) }; let b = { let (start, end) = split_once(b, "-")?; - RangeInclusive::::new(start.parse().ok()?, end.parse().ok()?) + RangeInclusive::::new(start.parse().ok()?, end.parse().ok()?) }; Some(Rule { name, a, b }) } - fn matches(&self, value: usize) -> bool { + fn matches(&self, value: u16) -> bool { self.a.contains(&value) || self.b.contains(&value) } } #[aoc(day16, part1)] -fn solve_d16_p1(input: &str) -> usize { +fn solve_d16_p1(input: &str) -> u16 { let (rules, rem) = split_once(input, "\n\nyour ticket:\n").unwrap(); let (_your_ticket, nearby_tickets) = split_once(rem, "\n\nnearby tickets:\n").unwrap(); @@ -41,7 +37,7 @@ fn solve_d16_p1(input: &str) -> usize { .split('\n') .flat_map(|line| line.split(',')) .filter_map(|x| { - let value: usize = x.parse().unwrap(); + let value: u16 = x.parse().unwrap(); if rules.iter().any(|rule| rule.matches(value)) { None } else { @@ -112,18 +108,196 @@ fn solve_d16_p2(input: &str) -> usize { .product() } -#[test] -fn test_foo() { - const INPUT: &str = "class: 0-1 or 4-19 -row: 0-5 or 8-19 -seat: 0-13 or 16-19 - -your ticket: -11,12,13 - -nearby tickets: -3,9,18 -15,1,5 -5,14,9"; - solve_d16_p2(INPUT); +#[aoc(day16, part2, avx2)] +fn solve_d16_p2_avx2(input: &str) -> usize { + unsafe { avx2::solve_d16_p2(input) } +} + +#[cfg(all(target_arch = "x86_64", target_feature = "avx2"))] +mod avx2 { + use super::{split_once, Rule}; + use std::arch::x86_64::*; + + struct RuleEval { + lo_start: [__m256i; 2], + lo_end: [__m256i; 2], + hi_start: [__m256i; 2], + hi_end: [__m256i; 2], + } + + impl RuleEval { + #[target_feature(enable = "avx2")] + unsafe fn new(rules: &[Rule]) -> Option { + if rules.len() > 31 { + return None; + } + let lo_start = { + let mut lo_start = [_mm256_setzero_si256(); 2]; + let lo_start_16 = &mut *(&mut lo_start as *mut [__m256i; 2] as *mut [i16; 32]); + let mut rules_iter = rules.iter(); + for (idx, rule) in rules_iter.by_ref().take(8).enumerate() { + lo_start_16[idx] = *rule.a.start() as i16 - 1; + } + for (idx, rule) in rules_iter.by_ref().take(8).enumerate() { + lo_start_16[idx + 16] = *rule.a.start() as i16 - 1; + } + for (idx, rule) in rules_iter.by_ref().take(8).enumerate() { + lo_start_16[idx + 8] = *rule.a.start() as i16 - 1; + } + for (idx, rule) in rules_iter.by_ref().take(8).enumerate() { + lo_start_16[idx + 24] = *rule.a.start() as i16 - 1; + } + lo_start + }; + let lo_end = { + let mut lo_end = [_mm256_setzero_si256(); 2]; + let lo_end_16 = &mut *(&mut lo_end as *mut [__m256i; 2] as *mut [i16; 32]); + let mut rules_iter = rules.iter(); + for (idx, rule) in rules_iter.by_ref().take(8).enumerate() { + lo_end_16[idx] = *rule.a.end() as i16 + 1; + } + for (idx, rule) in rules_iter.by_ref().take(8).enumerate() { + lo_end_16[idx + 16] = *rule.a.end() as i16 + 1; + } + for (idx, rule) in rules_iter.by_ref().take(8).enumerate() { + lo_end_16[idx + 8] = *rule.a.end() as i16 + 1; + } + for (idx, rule) in rules_iter.by_ref().take(8).enumerate() { + lo_end_16[idx + 24] = *rule.a.end() as i16 + 1; + } + lo_end + }; + let hi_start = { + let mut hi_start = [_mm256_setzero_si256(); 2]; + let hi_start_16 = &mut *(&mut hi_start as *mut [__m256i; 2] as *mut [i16; 32]); + let mut rules_iter = rules.iter(); + for (idx, rule) in rules_iter.by_ref().take(8).enumerate() { + hi_start_16[idx] = *rule.b.start() as i16 - 1; + } + for (idx, rule) in rules_iter.by_ref().take(8).enumerate() { + hi_start_16[idx + 16] = *rule.b.start() as i16 - 1; + } + for (idx, rule) in rules_iter.by_ref().take(8).enumerate() { + hi_start_16[idx + 8] = *rule.b.start() as i16 - 1; + } + for (idx, rule) in rules_iter.by_ref().take(8).enumerate() { + hi_start_16[idx + 24] = *rule.b.start() as i16 - 1; + } + hi_start + }; + let hi_end = { + let mut hi_end = [_mm256_setzero_si256(); 2]; + let hi_end_16 = &mut *(&mut hi_end as *mut [__m256i; 2] as *mut [i16; 32]); + let mut rules_iter = rules.iter(); + for (idx, rule) in rules_iter.by_ref().take(8).enumerate() { + hi_end_16[idx] = *rule.b.end() as i16 + 1; + } + for (idx, rule) in rules_iter.by_ref().take(8).enumerate() { + hi_end_16[idx + 16] = *rule.b.end() as i16 + 1; + } + for (idx, rule) in rules_iter.by_ref().take(8).enumerate() { + hi_end_16[idx + 8] = *rule.b.end() as i16 + 1; + } + for (idx, rule) in rules_iter.by_ref().take(8).enumerate() { + hi_end_16[idx + 24] = *rule.b.end() as i16 + 1; + } + hi_end + }; + Some(RuleEval { + lo_start, + lo_end, + hi_start, + hi_end, + }) + } + + #[target_feature(enable = "avx2")] + unsafe fn eval(&self, value: u16) -> u32 { + let value = _mm256_set1_epi16(value as i16); + let within_lo = [ + _mm256_and_si256( + _mm256_cmpgt_epi16(self.lo_end[0], value), + _mm256_cmpgt_epi16(value, self.lo_start[0]), + ), + _mm256_and_si256( + _mm256_cmpgt_epi16(self.lo_end[1], value), + _mm256_cmpgt_epi16(value, self.lo_start[1]), + ), + ]; + let within_hi = [ + _mm256_and_si256( + _mm256_cmpgt_epi16(self.hi_end[0], value), + _mm256_cmpgt_epi16(value, self.hi_start[0]), + ), + _mm256_and_si256( + _mm256_cmpgt_epi16(self.hi_end[1], value), + _mm256_cmpgt_epi16(value, self.hi_start[1]), + ), + ]; + let valid = [ + _mm256_or_si256(within_lo[0], within_hi[0]), + _mm256_or_si256(within_lo[1], within_hi[1]), + ]; + let packed = _mm256_packs_epi16(valid[0], valid[1]); + _mm256_movemask_epi8(packed) as u32 + } + } + + #[target_feature(enable = "avx2")] + pub unsafe fn solve_d16_p2(input: &str) -> usize { + let (rules, rem) = split_once(input, "\n\nyour ticket:\n").unwrap(); + let (my_ticket, nearby_tickets) = split_once(rem, "\n\nnearby tickets:\n").unwrap(); + + let rules: Vec<_> = rules.split('\n').map(|x| Rule::parse(x).unwrap()).collect(); + assert!(rules.len() < 32); + let rule_eval = RuleEval::new(&rules).unwrap(); + let mut candidates = [_mm256_set1_epi32((1i32 << rules.len()) - 1); 4]; + let mut scratch_space = [_mm256_set1_epi32(1); 4]; + for line in nearby_tickets.split('\n') { + let scratch_slice = &mut *(&mut scratch_space as *mut _ as *mut [u32; 32]); + for (field, scratch) in line.split(',').zip(scratch_slice.iter_mut()) { + let field = field.parse().unwrap(); + *scratch = rule_eval.eval(field); + } + + if scratch_space.iter().copied().any(|elem| { + _mm256_movemask_epi8(_mm256_cmpeq_epi32(elem, _mm256_set1_epi32(0))) != 0 + }) { + continue; + } + + for (candidate, valid_bitmask) in candidates.iter_mut().zip(scratch_space.iter()) { + *candidate = _mm256_and_si256(*candidate, *valid_bitmask); + } + } + + let candidates = &mut *(&mut candidates as *mut _ as *mut [u32; 32]); + let candidates = &mut candidates[..rules.len()]; + while candidates.iter().copied().any(|x| x.count_ones() > 1) { + for idx in 0..candidates.len() { + let candidate = candidates[idx]; + if candidate.count_ones() == 1 { + let mask = !candidate; + for before in &mut candidates[..idx] { + *before &= mask; + } + for after in &mut candidates[idx + 1..] { + *after &= mask; + } + } + } + } + my_ticket + .split(',') + .map(|x| x.parse::().unwrap()) + .zip(candidates.into_iter().map(|x| x.trailing_zeros() as usize)) + .filter_map(|(field, rule_idx)| { + if rules[rule_idx].name.starts_with("departure") { + Some(field) + } else { + None + } + }) + .product() + } } diff --git a/src/day17.rs b/src/day17.rs new file mode 100644 index 0000000..bfbba8e --- /dev/null +++ b/src/day17.rs @@ -0,0 +1,101 @@ +use aoc_runner_derive::aoc; +use std::collections::HashSet; + +#[aoc(day17, part1)] +fn solve_d17_p1(input: &str) -> usize { + let mut world = HashSet::new(); + for (y, line) in input.split('\n').enumerate() { + for (x, _) in line + .as_bytes() + .iter() + .copied() + .enumerate() + .filter(|&(_, byte)| byte == b'#') + { + world.insert((x as isize, y as isize, 0isize, 0isize)); + } + } + for _ in 0..6 { + world = step(world); + } + world.len() +} + +fn neighbors( + world: &HashSet<(isize, isize, isize, isize)>, + (x, y, z, w): (isize, isize, isize, isize), +) -> usize { + let mut count = 0; + for xa in x - 1..=x + 1 { + for ya in y - 1..=y + 1 { + for za in z - 1..=z + 1 { + for wa in w - 1..=w + 1 { + count += world.contains(&(xa, ya, za, wa)) as usize; + } + } + } + } + count - world.contains(&(x, y, z, w)) as usize +} + +fn step(world: HashSet<(isize, isize, isize, isize)>) -> HashSet<(isize, isize, isize, isize)> { + struct MinMax { + x_min: isize, + x_max: isize, + y_min: isize, + y_max: isize, + z_min: isize, + z_max: isize, + w_min: isize, + w_max: isize, + } + let MinMax { + x_min, + x_max, + y_min, + y_max, + z_min, + z_max, + w_min, + w_max, + } = world.iter().fold( + MinMax { + x_min: isize::MAX, + x_max: isize::MIN, + y_min: isize::MAX, + y_max: isize::MIN, + z_min: isize::MAX, + z_max: isize::MIN, + w_min: isize::MAX, + w_max: isize::MIN, + }, + |minmax, &(x, y, z, w)| MinMax { + x_min: std::cmp::min(minmax.x_min, x), + x_max: std::cmp::max(minmax.x_max, x), + y_min: std::cmp::min(minmax.y_min, y), + y_max: std::cmp::max(minmax.y_max, y), + z_min: std::cmp::min(minmax.z_min, z), + z_max: std::cmp::max(minmax.z_max, z), + w_min: std::cmp::min(minmax.w_min, w), + w_max: std::cmp::max(minmax.w_max, w), + }, + ); + let mut new_world = HashSet::new(); + for x in x_min - 1..=x_max + 1 { + for y in y_min - 1..=y_max + 1 { + for z in z_min - 1..=z_max + 1 { + for w in w_min - 1..=w_max + 1 { + let active = world.contains(&(x, y, z, w)); + let n = neighbors(&world, (x, y, z, w)); + if active && (n == 2 || n == 3) { + new_world.insert((x, y, z, w)); + } + if !active && n == 3 { + new_world.insert((x, y, z, w)); + } + } + } + } + } + new_world +} diff --git a/src/day18.rs b/src/day18.rs new file mode 100644 index 0000000..4af5be4 --- /dev/null +++ b/src/day18.rs @@ -0,0 +1,65 @@ +use aoc_runner_derive::aoc; +use nom::branch::alt; +use nom::bytes::complete::tag; +use nom::character::complete::{char, digit1, space0}; +use nom::combinator::map_res; +use nom::multi::fold_many0; +use nom::sequence::{delimited, preceded}; +use nom::IResult; +use std::str::FromStr; + +fn num(i: &str) -> IResult<&str, usize> { + map_res(delimited(space0, digit1, space0), FromStr::from_str)(i) +} + +fn paren(i: &str) -> IResult<&str, usize> { + delimited(space0, delimited(tag("("), expr, tag(")")), space0)(i) +} + +fn num_or_paren(i: &str) -> IResult<&str, usize> { + alt((num, paren))(i) +} + +fn add_or_paren(i: &str) -> IResult<&str, usize> { + let (i, lhs) = num_or_paren(i)?; + + fold_many0(preceded(char('+'), num_or_paren), lhs, |lhs, rhs| lhs + rhs)(i) +} + +fn expr(i: &str) -> IResult<&str, usize> { + let (i, lhs) = add_or_paren(i)?; + + fold_many0(preceded(char('*'), add_or_paren), lhs, |lhs, rhs| lhs * rhs)(i) +} + +#[aoc(day18, part1)] +fn solve_d18_p1(input: &str) -> usize { + input.split('\n').map(|line| expr(line).unwrap().1).sum() +} + +#[aoc(day18, part2)] +fn solve_d18_p2(input: &str) -> usize { + input.split('\n').map(|line| expr(line).unwrap().1).sum() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_expr() { + assert_eq!(expr("2+2"), Ok(("", 4))); + assert_eq!(expr("1 + 2 * 3 + 4 * 5 + 6"), Ok(("", 231))); + assert_eq!(expr("1 + (2 * 3) + (4 * (5 + 6))"), Ok(("", 51))); + assert_eq!(expr("2 * 3 + (4 * 5)"), Ok(("", 46))); + assert_eq!(expr("5 + (8 * 3 + 9 + 3 * 4 * 3)"), Ok(("", 1445))); + assert_eq!( + expr("5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))"), + Ok(("", 669060)) + ); + assert_eq!( + expr("((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2"), + Ok(("", 23340)) + ); + } +} diff --git a/src/day19.rs b/src/day19.rs new file mode 100644 index 0000000..3d2b8af --- /dev/null +++ b/src/day19.rs @@ -0,0 +1,103 @@ +use crate::split_once; +use aoc_runner_derive::aoc; +use std::collections::HashMap; + +#[derive(Debug)] +enum Parser<'a> { + Lit(&'a str), + Seq(Vec), + Alt(Vec, Vec), +} + +impl<'a> Parser<'a> { + fn new(parser_def: &'a str) -> Option<(usize, Self)> { + let (idx, def) = split_once(parser_def, ": ")?; + let idx = idx.parse().ok()?; + if let Some((a, b)) = split_once(def, " | ") { + let a = a + .split(' ') + .map(|x| x.parse().ok()) + .collect::>>()?; + let b = b + .split(' ') + .map(|x| x.parse().ok()) + .collect::>>()?; + Some((idx, Parser::Alt(a, b))) + } else if let Some(_) = def.find('"') { + Some((idx, Parser::Lit(&def[1..def.len() - 1]))) + } else { + let seq = def + .split(' ') + .map(|x| x.parse().ok()) + .collect::>>()?; + Some((idx, Parser::Seq(seq))) + } + } + + // returns Some(remaining_input) when valid, None when doesn't match. + fn parse<'b>(&self, parsers: &HashMap, input: &'b str) -> Option<&'b str> { + match self { + &Parser::Lit(s) => { + if input.is_empty() || &input[..s.len()] != s { + None + } else { + Some(&input[s.len()..]) + } + } + Parser::Seq(a) => { + let mut input = input; + let mut iter = a.iter().copied(); + while let Some(parser_idx) = iter.next() { + input = parsers + .get(&parser_idx) + .and_then(|p| p.parse(parsers, input))?; + } + Some(input) + } + Parser::Alt(a, b) => { + let parser_a = Parser::Seq(a.clone()); + match parser_a.parse(parsers, input) { + Some(input) => Some(input), + None => { + let parser_b = Parser::Seq(b.clone()); + parser_b.parse(parsers, input) + } + } + } + } + } +} + +#[aoc(day19, part1)] +fn solve_d19_p1(input: &str) -> usize { + let (parser_input, pattern_input) = split_once(input, "\n\n").unwrap(); + let parsers: HashMap = parser_input + .split('\n') + .map(|parser_def| Parser::new(parser_def).unwrap()) + .collect(); + + let rule0 = parsers.get(&0).unwrap(); + pattern_input + .split('\n') + .filter(|pattern| rule0.parse(&parsers, pattern) == Some("")) + .count() +} + +#[aoc(day19, part2)] +fn solve_d19_p2(input: &str) -> usize { + let (parser_input, pattern_input) = split_once(input, "\n\n").unwrap(); + let mut parsers: HashMap = parser_input + .split('\n') + .map(|parser_def| Parser::new(parser_def).unwrap()) + .collect(); + + parsers.insert(8, Parser::Alt(vec![42], vec![42, 8])); + parsers.insert(11, Parser::Alt(vec![42, 31], vec![42, 11, 31])); + + let rule0 = parsers.get(&0).unwrap(); + + pattern_input + .split('\n') + .filter(|pattern| rule0.parse(&parsers, pattern) == Some("")) + .count() +} diff --git a/src/lib.rs b/src/lib.rs index 7cbb22b..a475345 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,6 +6,9 @@ pub mod day13; pub mod day14; pub mod day15; pub mod day16; +pub mod day17; +pub mod day18; +pub mod day19; pub mod day2; pub mod day3; pub mod day4; @@ -16,3 +19,8 @@ pub mod day8; pub mod day9; aoc_runner_derive::aoc_lib! { year = 2020 } + +fn split_once<'a>(input: &'a str, delimeter: &str) -> Option<(&'a str, &'a str)> { + let idx = input.find(delimeter)?; + Some((&input[..idx], &input[idx + delimeter.len()..])) +} \ No newline at end of file