From fda311a7ee9889403b31657d376af31742bb8961 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 20 Dec 2020 22:33:42 +0100 Subject: [PATCH] 2020: day20: part 1 --- .../aoc2020_bench/benches/aoc2020_bench.rs | 2 + aoc2020/input/day20.txt | 1727 +++++++++++++++++ aoc2020/input/day20_provided.txt | 107 + aoc2020/src/day20.rs | 135 ++ aoc2020/src/lib.rs | 1 + aoc2020/src/main.rs | 2 + 6 files changed, 1974 insertions(+) create mode 100644 aoc2020/input/day20.txt create mode 100644 aoc2020/input/day20_provided.txt create mode 100644 aoc2020/src/day20.rs diff --git a/aoc2020/aoc2020_bench/benches/aoc2020_bench.rs b/aoc2020/aoc2020_bench/benches/aoc2020_bench.rs index 5644cd8..6e04bee 100644 --- a/aoc2020/aoc2020_bench/benches/aoc2020_bench.rs +++ b/aoc2020/aoc2020_bench/benches/aoc2020_bench.rs @@ -19,6 +19,7 @@ use aoc2020::day16; use aoc2020::day17; use aoc2020::day18; use aoc2020::day19; +use aoc2020::day20; use aoc2020::day21; use aoc2020::day22; use aoc2020::day23; @@ -44,6 +45,7 @@ fn aoc2020_all(c: &mut Criterion) { c.bench_function("day17", |b| b.iter(|| day17::run().unwrap())); c.bench_function("day18", |b| b.iter(|| day18::run().unwrap())); c.bench_function("day19", |b| b.iter(|| day19::run().unwrap())); + c.bench_function("day20", |b| b.iter(|| day20::run().unwrap())); c.bench_function("day21", |b| b.iter(|| day21::run().unwrap())); c.bench_function("day22", |b| b.iter(|| day22::run().unwrap())); c.bench_function("day23", |b| b.iter(|| day23::run().unwrap())); diff --git a/aoc2020/input/day20.txt b/aoc2020/input/day20.txt new file mode 100644 index 0000000..2b00cba --- /dev/null +++ b/aoc2020/input/day20.txt @@ -0,0 +1,1727 @@ +Tile 3001: +##...#..## +.##...#.## +###....... +#...##..## +...#..#..# +#..#...#.. +#......#.. +....#.##.. +#......#.# +..##.#...# + +Tile 2069: +###..##..# +....##.### +###..##..# +..#..#.#.# +#......... +##.#...#.# +.........# +....#..#.# +#......... +###.#...#. + +Tile 3023: +.##..##... +......##.# +#......#.. +..#....#.. +#.....#.#. +#.....#... +...#...#.. +......#### +....###..# +.#.#.#...# + +Tile 3389: +....#..#.# +##...#.... +.....#.... +.....#..#. +.#...##... +##..#...## +##.##..#.. +#...##.... +.#....#... +..#....... + +Tile 2693: +#.#.###.#. +....#..... +...#.##.#. +.###.....# +.#..#..#.. +#..#....#. +#......... +......#..# +#..#...... +...#.###.. + +Tile 1987: +####.#..#. +##.#.....# +#.#..###.. +.#.#..###. +#.....#... +#..#...... +.....##..# +....##.... +#....#.#.# +.###...#.# + +Tile 2113: +...#.###.# +#.#.##.#.. +.....##..# +#.#..#.... +#........# +#.#.#.###. +#.##.###.. +..#.###..# +......#.## +#..#.#...# + +Tile 1999: +#.####..## +#.##..#... +.#..####.. +.#..#.#... +......#.#. +.......#.. +.#........ +##..#.#..# +......#... +.#####..## + +Tile 1973: +#..#.###.# +.......#.# +#..##....# +..#.#..... +.##.....#. +#....#.#.# +...#.###.# +#......#.# +......#.## +#.#.#...#. + +Tile 1801: +######.#.# +#..###...# +.#.##..#.. +.##..#.#.# +.......... +..#...#.#. +..#......# +##.......# +#....#...# +#..#.#.#.. + +Tile 3881: +#.###...#. +#......#.. +#.....#..# +......#..# +#.......#. +#.#..#..#. +##....##.. +#..#.#...# +#.#......# +.#...#.### + +Tile 1823: +####..#.## +##.......# +.......#.. +....#.#### +.#.#.#..#. +#....#.... +#......... +#..#...... +.####.#..# +#.###.#... + +Tile 1031: +..##.##.#. +#.#....... +#...#....# +.....#.#.# +#.....#... +#.#.#..... +....#....# +#......... +..#....... +##.###.### + +Tile 1361: +.#.####..# +##..#..#.. +.#........ +.##......# +#..#...... +.#.......# +#..#..#... +#..#...... +#........# +#..##.#.#. + +Tile 1483: +.###....## +...#....#. +.......... +#..##....# +#......#.# +#......... +##.#...... +.....#.### +#...#..... +#..#.##..# + +Tile 2381: +.#.#...##. +#...#..... +...#.#...# +...##.##.. +...##..... +..##...... +........## +#..##..##. +..##.#..#. +#####..#.. + +Tile 2447: +.##.##..#. +.#....##.# +.#..#..### +...##....# +#.....###. +......#..# +#.......## +.......#.. +.....#.#.# +.#.####.## + +Tile 2633: +..##.#...# +.........# +#..##..... +.#.#...### +..#....##. +#.#.#...## +#.##.....# +#........# +....#..... +..##..##.# + +Tile 1861: +.###.###.# +.##.#..#.. +##..#..#.# +##..#..#.# +.###..#.#. +.......... +.....#.... +....###.## +.#...#.... +.#.##..##. + +Tile 1453: +#....#...# +#..#.....# +..#..#...# +#.#..#...# +#.#......# +##..##...# +...#...#.. +#..#...### +....#..#.. +#.#.#..... + +Tile 3719: +.#...##### +.##..#.... +.#...#...# +.......#.# +#....#...# +....###... +..#..##... +..#..##... +##......#. +#####.#..# + +Tile 3167: +.......#.. +#........# +.#...#..## +.#.#.#...# +#..#..##.# +#......... +.#....#... +##..#....# +....#....# +#.###..#.# + +Tile 2521: +.#.#.##... +#...#.#.#. +#........# +.......#.. +..#....... +#....#..## +.#..#.#... +#.....##.# +....#.##.# +..#######. + +Tile 1601: +....##.#.# +...##...#. +#..##....# +#.###...#. +#.......## +..#....### +...#..#.## +....#..### +##..#..##. +#......#.. + +Tile 1657: +.##...#... +##.....#.# +##.#.##.#. +#.#...#..# +.......#.# +........#. +#.#......# +##..#..#.# +.#....#..# +..#..##.## + +Tile 3919: +##....#.## +....#..#.# +#..#.....# +#......#.# +#.....#... +#...#...#. +..###....# +#..##..... +..##.#..## +####..#..# + +Tile 3851: +###.#####. +##.......# +#..#.....# +#......### +......#.#. +#.##..##.. +#...#....# +.....##.#. +#...##.#.. +........## + +Tile 3821: +.###.##### +.....#.... +...##....# +##........ +#.#..#.... +#..#..##.. +...#.###.. +#....#.... +#...#....# +..#..###.. + +Tile 3499: +#######..# +#...##...# +##...#...# +......##.# +#.##...... +#......... +...#..#..# +.....#.#.. +....##.... +.###...#.# + +Tile 3191: +##.#.#..#. +....##.... +...#...#.# +...##..#.. +#..##..... +#...#.#..# +.#.#...#.. +#####...#. +##.....##. +..###....# + +Tile 3137: +.#...#.... +##........ +#..#...#.. +#..#..#... +..#...#... +.##......# +..#..###.. +#.#..###.. +#..#.#.... +.#......## + +Tile 2551: +#.#####.## +..#.#..#.. +#......... +#..#.##.## +...###.##. +..####..## +#.#..#...# +#.....#... +#.#......# +#.##.#.### + +Tile 3217: +#.####...# +.........# +..#......# +##.#..#.## +#..##..#.. +.#.#....## +#.#......# +.........# +.#.##.#..# +....##.#.# + +Tile 3491: +###.###..# +.#........ +..#....#.. +...#..#..# +##.#....#. +#....#.... +#.....#... +.##......# +.#.......# +#....#.##. + +Tile 3181: +#.#.#####. +##.#.....# +#..#.#..#. +##..#..#.. +#..#....#. +........#. +#...##..## +#.##.##..# +.#.#.#...# +#.#.###.#. + +Tile 2819: +..#.#.#.#. +.....#.#.. +..#.#..#.. +#..#.#.#.# +#.#.#..##. +##.....##. +##......## +##.###.#.. +...#...#.# +..#.#..#.# + +Tile 2857: +###.#....# +####.....# +#....#..#. +#....##... +...#.##... +#....#...# +.#...#...# +##.......# +#..####.#. +...###.### + +Tile 1783: +#..##....# +#.....##.# +#......### +....###### +...####.## +#.......#. +...#.....# +.......... +#........# +.#.##.##.. + +Tile 2297: +.###.####. +.....##.## +...#...#.. +##........ +.......##. +##.#.#.##. +##.#.#..#. +##........ +...#.##..# +.###...### + +Tile 3727: +...#..#.#. +###.##.#.. +#.##..#.#. +.#......#. +##........ +.#....#### +#...#..#.# +########.# +....#####. +####.#.#.# + +Tile 2237: +.####.##.. +#....##... +.......#.. +#......#.. +...#...#.. +.........# +#....#.#.. +#...#.#... +.........# +#####..... + +Tile 2281: +####..###. +#...#.#..# +#........# +#.#.#.##.# +#........# +.###.#.... +#.....#... +...##..#.. +##......## +###.....#. + +Tile 1321: +.....##..# +.#.#...... +#..#....## +....##.... +#...#...#. +#.....#..# +..#.....## +..#....... +.##...#... +.#.###.... + +Tile 1489: +##..#..... +.......... +#........# +###......# +###......# +#....#.... +.......... +...#..#..# +....#....# +#.#.#....# + +Tile 2251: +#..#...#.. +##..#....# +........#. +##.......# +##..#.#... +#..#.#...# +....##...# +....###.#. +#...#..##. +#..##.###. + +Tile 3467: +#.##...#.# +#...#..... +#.#....##. +###....#.. +#..#####.. +...#...... +...#...... +.#.#.....# +#..#.....# +.#.######. + +Tile 2677: +.#....##.# +#.#.#..... +#.#....#.# +.......#.# +###.#....# +#..##..... +#.###..... +#..###.... +.......... +#.#.#...## + +Tile 3457: +.#.#.#.### +#..#..#... +###......# +#...#....# +#.#...#### +#.......## +...#.##... +#......#.# +#...#..... +.###.....# + +Tile 3307: +#....#.### +#....##.#. +..#.###... +##.##....# +...#...... +....#.#..# +..#.....## +.....#.#.. +#...#..##. +#.#...#.#. + +Tile 3187: +.###.#.#.# +..#..#...# +#.....#..# +#.......## +...#.#..#. +#........# +.#.....#.. +.#...#.#.# +#.....#..# +......#### + +Tile 2357: +.#...##..# +..#.#...## +......#..# +.#....#..# +#.....#### +##.....##. +#.###..... +#......#.# +...##.#... +.#....###. + +Tile 3529: +.##...###. +.......#.. +.......#.# +.........# +##..#...#. +##..#..#.# +#....##.## +.........# +#........# +###....#.# + +Tile 1069: +...##..... +##.#...#.. +#..#.#...# +..#..#.#.. +##.#..##.# +#.#..#.##. +#..#.....# +#..#.#.... +.........# +.###..##.. + +Tile 2393: +.#.#.....# +.......### +.......... +..##...#.. +.....#.... +.........# +#.##.....# +...##..#.. +..#...#..# +####..#... + +Tile 2389: +.#####...# +#........# +#.#....... +.#........ +........#. +#......... +.....#.#.# +...###...# +#.......#. +#####.#### + +Tile 3673: +#######..# +#..#..##.. +....#...#. +#....#.... +...#..#.#. +#.#..##... +....###..# +#.....#..# +#........# +.##..###.. + +Tile 1907: +.###...... +#.....##.. +#.#...#... +#....##### +.....#..## +#.#......# +#....##... +#.....##.# +##.#.##... +....###.## + +Tile 2963: +.#.######. +......#... +#.....##.. +.#.......# +.....#.... +.#...#...# +#.#......# +###....... +###....##. +#..##.##.. + +Tile 3583: +.....##... +#.....#.## +##.......# +.#.......# +#........# +#....#.... +.#.##....# +#.......## +#..####... +#....###.. + +Tile 3251: +.####.#... +###.#....# +....#.#### +#.#...#### +.#........ +##.#.....# +..##..#... +.#...#.#.# +..#.....#. +#.###.##.. + +Tile 2939: +.###...#.. +.......#.. +#...##.#.# +.#.....### +.#.##..... +#......#.# +#..####.## +##.##....# +....##...# +#.##.##.## + +Tile 2557: +..##.#.#.. +#.#..#...# +..#......# +..#...#... +#.#...#.#. +#........# +##....#### +#.#..#..#. +#......... +.#.###.##. + +Tile 2753: +.#.##....# +#......#.# +#........# +#.....#..# +.....#...# +.........# +.##.#..... +....#.#..# +........## +.##..####. + +Tile 2971: +...#.##..# +#..#....## +.#.##..... +.......... +........## +#..##..... +..##.....# +...#.#...# +#....#.... +...#.#.#.. + +Tile 2539: +#....#..#. +..###..... +###.#....# +........## +#..#..#... +..#.##.#.# +#..##...## +####...... +#.#....##. +###.#.##.# + +Tile 1913: +##..#....# +#....#..## +#..##...## +#...##...# +##..#..... +##..#..... +....##...# +#..##..... +#..#..#### +#..##..##. + +Tile 2153: +...#...... +#.#.....#. +#......... +.#........ +..#......# +..##.#..#. +#.#..##.#. +##....##.. +..#....#.# +.###...#.. + +Tile 1559: +..#...##.. +...#....## +#....#..#. +##.##..#.# +..#..#.#.. +#.#.#..... +..#......# +##........ +.#.......# +.....##..# + +Tile 2999: +#...#..##. +##....#... +#....#..#. +....#...## +#...##..## +....##..## +##.##..... +#...#..#.. +#...#....# +#...#.#..# + +Tile 2039: +#.##.##.#. +.#....#..# +.#.......# +.....#.... +.#..##...# +..#....#.# +###..###.# +##...###.. +#....#.... +####....#. + +Tile 2129: +##.######. +#.#..#..## +#.###..... +#.....#.## +....#..### +..#......# +......#... +..#....... +##......#. +....####.# + +Tile 3407: +#..##.#..# +#.#...#... +#....#...# +#...#.#..# +#...#..... +..#...##.# +#..###...# +....#..... +..#.#..... +##....#### + +Tile 1093: +.##..#.### +#.....#.## +.......#.. +.....#.#.. +...#...##. +........## +.##....... +.#......## +..#.....## +....#####. + +Tile 3623: +##..###.## +..#......# +#.#..##.#. +.....#.... +.#........ +.##.#..#.. +#.#..#..#. +#.....#..# +...#..#..# +#.##....#. + +Tile 3931: +.##..#.### +#....#.... +#....##... +..##..###. +........#. +.#.......# +#......#.. +.##.....## +.####..... +##.##.###. + +Tile 3371: +.#...#...# +#.#....#.# +#.#...#... +.....#..#. +###....... +#........# +#.##.#..#. +#......... +#......... +.#####...# + +Tile 1381: +####...#.. +##........ +#.......#. +#.#....#.. +..#......# +.......... +##........ +##........ +.........# +#..##..#.# + +Tile 2011: +.#.#...#.. +#.....##.# +#.....##.. +....#..#.# +##..#...#. +.....#.#.# +#....##..# +....#.#.#. +.......#.. +.#.###..## + +Tile 2341: +###....#.. +#........# +.#...#...# +.........# +#......#.# +......#... +##....#..# +#....#..#. +###..#...# +#.#.##..#. + +Tile 3677: +.#..###.## +...#..#.#. +#..#.##.#. +.##.##..## +......#..# +#.....#..# +....#..... +#..##....# +#..#.#.### +...####.#. + +Tile 1373: +####.#...# +.........# +##.......# +.......... +.........# +#...#...## +#.#..##.## +....#..... +......#... +.#.####.## + +Tile 2591: +..##.....# +..#....... +##.##.#.## +.#####..#. +.....#..## +#..#.....# +........## +..#..#...# +.#....##.# +#..#.####. + +Tile 2707: +.#.#...#.# +......#..# +#...#.#..# +#.#....#.. +#........# +#...#..... +....###..# +#......... +...#.....# +##..#..##. + +Tile 2917: +...####### +.#...#.... +.#........ +.....#...# +..#...#.## +#.......## +#....##... +.##.#..#.. +#.##...... +.#..##...# + +Tile 3229: +..##.###.. +....#..... +......##.# +#.###.#..# +#....###.# +.........# +......#..# +....##.##. +#.#.##.#.# +#.#..##.#. + +Tile 2459: +..###.##.. +#.......## +...#...### +.........# +#..#....## +...##..... +##........ +##..#....# +..##.....# +...##.##.. + +Tile 3631: +..##.#..## +.........# +..##...... +....#..... +#.#.....## +#......... +###....... +#......... +#.#.#.#... +....#.##.. + +Tile 3733: +..#..###.# +.......### +.....##.#. +##.....#.. +##.#....#. +#.##...#.# +###.#.#..# +#.#..#...# +##...#..#. +.#..#...#. + +Tile 2953: +##..#.#... +........#. +..#......# +#.....#... +.........# +##.......# +#..#...... +#.....#.#. +.....#.### +.###..#.## + +Tile 1153: +#.##.##.## +..####.... +.........# +.#..#..... +.....####. +.#.#..##.# +.......#.. +#......... +....#..#.. +...##.#..# + +Tile 3833: +####..#... +##.......# +.........# +.#........ +##..#.###. +#.#..#.#.. +#.#..##... +#........# +#...#..... +......##.. + +Tile 1597: +#...#...## +.....##..# +#.....#..# +#.#.#....# +.###..##.# +##.......# +.......#.. +...#....## +...#...... +.#.##.#.#. + +Tile 3793: +#......#.# +#..#..#.#. +...#...... +##......## +##..#..#.. +.#..#..... +..#.....#. +.#....#... +.....##... +.#..#####. + +Tile 3373: +.#.#.#.... +##.#...... +#...#....# +.......### +#.#.#..#.# +####..#### +..##...... +#..#..#..# +........## +#.##..#.#. + +Tile 1439: +..#####... +.#.....#.# +....#...## +.......... +#....##..# +#....#...# +##........ +#....##..# +.#..##.### +.####.#..# + +Tile 1867: +#..##....# +......#..# +.#.##....# +#...#..... +.#.....#.. +..##...#.. +.#..##.... +#..###.#.. +.#..#.#... +#..#.###.. + +Tile 3343: +..###..... +..#..#..#. +#..####.#. +#......... +.........# +#.#....##. +.#..#....# +#....#...# +.........# +#.....#### + +Tile 2089: +....##.### +#..#.#.#.. +##..#..... +#...#..#.. +#......#.# +.......##. +#.......## +#....##.## +#........# +###.#.#... + +Tile 1747: +...#.....# +#........# +........## +#......##. +#......... +#...##.... +#...#..... +#.#....... +...#....#. +......#### + +Tile 2383: +.#.###...# +#.#....### +..###..#.. +..##...#.# +.......##. +##.....#.. +##...#...# +#......... +.......#.. +##.##..#.. + +Tile 2843: +###......# +..##...... +...#....#. +#....#.... +#........# +#.#.....#. +#.#.#.#... +......#.## +##..#..#.# +#..###.##. + +Tile 3593: +...###..## +###.#.#... +.......#.. +##....#.## +#.......#. +##..#....# +#....#.... +...#...... +.#.#.....# +.#.##..#.. + +Tile 1699: +#.#.#....# +.##.#.#... +#....#...# +#....#..## +...#....#. +.....#...# +..##.#.... +.......#.. +##...##..# +#.##.#.... + +Tile 1579: +##.....### +#..#....#. +#..#.#..#. +#.......## +#.#....#.. +.......... +........## +.#...#...# +#...#.#..# +####.###.. + +Tile 1789: +.#.#...#.. +.......... +##.......# +....##.... +#.#.#..... +#........# +##.#....## +#...#.#... +....#..#.# +..#######. + +Tile 1091: +#.###.##.. +#.##.#..#. +...#....#. +#....#.... +....##.... +##.......# +##....#... +#......#.# +##.......# +#...####.. + +Tile 3607: +#.#.#.##.. +#......#.# +........## +.#.....#.. +.......#.. +#.#..#..## +.#..#.#..# +...#.#.#.. +##..#...## +##.....#.. + +Tile 1367: +#...##.##. +.......... +......#.#. +.#.#..#... +..#...#.#. +#.#......# +.....#.... +...#...... +........## +.#.#.####. + +Tile 1607: +.##.#..#.# +#......... +.......### +##....#..# +##.....##. +#.#.#..... +#......... +##...#.... +#......... +##..##.#.# + +Tile 3739: +...#.##... +#........# +..#..#.#.# +#......#.. +....#..... +##......## +##....#.## +#........# +.......... +##.####..# + +Tile 3989: +#.##..##.. +.....#..## +#......... +.#.##..#.# +..##.##... +........#. +#......... +.##.....## +#.###..#.# +###...###. + +Tile 1723: +..#.#..### +.....##.#. +.##..##... +#..#.##... +..#....##. +...#.#...# +.....#..#. +..#..#..#. +..#..#..## +#.###..##. + +Tile 2029: +##...##... +.......#.# +....##.### +#..#...... +##...#...# +#...#....# +.#.......# +#..#..#.## +....##...# +#####.##.# + +Tile 3637: +.####...#. +.#.#..#..# +#..#..#.## +.....##.#. +...#.#...# +#..#....## +.....##.## +...#...#.. +##....#..# +#.....#.#. + +Tile 3701: +.#.#.#.... +#.###....# +..#..#.### +#.....#.#. +........#. +#.....#... +#...##.### +####..#... +#.....#.#. +#..#....#. + +Tile 1087: +.#..##...# +#...##.... +...#...... +....#..... +#.##....## +#....#.... +#.##.....# +.#..###.## +#..#.....# +.#.#..#.## + +Tile 2617: +#.#..#...# +..###.##.# +##....#### +.........# +.#....#... +......#.## +.......##. +#...#....# +#.......## +#.#.#.#... + +Tile 3581: +...###.### +#....##... +......##.# +......##.. +##....#..# +.###....#. +.#.#..#... +#..#..#..# +.....#...# +.###.#.#.# + +Tile 3697: +..####.### +.#.##..... +.#....#..# +.......... +.###...... +#..#..#.## +#.#..#..## +#..##...#. +..#......# +###..#.#.. + +Tile 2399: +##.###.### +#......... +#..#.##..# +##.#....## +#...#....# +..##..#... +..#..#..## +..##.#.#.# +...##...#. +..#....### + +Tile 2767: +###..##### +.......#.. +#........# +....#..### +.#####..#. +#.#....#.. +....###... +#........# +##........ +.....###.. + +Tile 3463: +....#.#### +#.#......# +..##.#.... +#.#......# +#.##....## +#...#..#.# +#...#.#### +##..#....# +#.#.....## +###...##.. + +Tile 3163: +.##..#.##. +.........# +#.....#... +..#......# +#..#.....# +...#...... +..#......# +.#...#.#.. +.##..###.. +.#.###..#. + +Tile 3709: +##...##.## +#...#..#.. +#..##.#.## +#..##....# +#.#..##..# +#........# +#..#...... +##.###.##. +##.###...# +..##.##.## + +Tile 1571: +#.##.#.##. +##..#..#.# +.......... +#.#.....#. +#.....##.. +..#.#..#.# +###.....## +.......### +...#...... +#.#.#...#. + +Tile 1201: +#...###... +#........# +#.#......# +#..#...#.# +#.....#..# +##..#....# +#........# +......#... +....#..#.. +.##...##.. + +Tile 3121: +..#.#.#..# +.#..#.##.# +..###...#. +...##..... +.....#.... +.#.....##. +..#....... +#.....#... +#......... +#..#....#. + +Tile 1049: +##...#.#.# +#...#..... +.#...#...# +..#...#..# +......##.# +......#### +#..#.....# +#.#....... +#.#..#..#. +##..#.##.# + +Tile 1997: +##.#.#.##. +.......#.# +....#.#..# +..###..... +#.#####.#. +.##...##.# +#.#...#..# +#.#....... +####...... +.#..##..## + +Tile 3329: +.#.##..... +...#.#..#. +...#..##.. +#.#....#.# +...#####.. +#......#.. +#.#..#..#. +...###..#. +#..##..#.. +.###.##.#. + +Tile 1433: +..#...##.. +....#..#.. +.#...#.... +..#.##.... +....##..#. +#...#....# +#.#...#... +.##.#...## +#..#.#.#.. +##.##.##.. + +Tile 1103: +#########. +###.#....# +..#.##..## +##.#..##.. +.....#.... +#...#..#.# +#....#.... +###.#....# +.#..##.#.# +#.#.##.#.. + +Tile 3359: +..#.##.#.# +#......... +#...#....# +##..##.##. +.#......#. +##..#..#.. +#........# +.######... +#...##...# +.....#...# + +Tile 2143: +..#.#####. +#.#.#....# +....#.#... +#....#.... +..#......# +.....#.... +##..##...# +.#.####.#. +..#.#....# +....#..#.# + +Tile 2003: +#.#..#.#.. +......##.# +#.....#.#. +##...#.#.. +#......... +##..#....# +.#####.#.# +......#... +...#..#... +.###.##### + +Tile 3461: +#...#...#. +.#.#.#.#.. +.#.......# +....##.#.# +#...#.#..# +.......... +..#.#..#.. +.#.#....## +.........# +####..#.#. + +Tile 3067: +....###.#. +.#.....#.# +.....#..## +#.#.....## +.##......# +#.#....... +.##......# +.....#.... +....#..... +.#.....#.. + +Tile 2027: +.##.#....# +#....#.#.. +.......##. +.......##. +.........# +..#.....## +..#......# +.#.....#.. +.....#.... +..#.#.#... + +Tile 1951: +#.#.#..#.# +##...#.#.. +.........# +#.####...# +#.....#..# +#..##....# +#...##...# +###......# +...#...... +##....###. + +Tile 1129: +#..###.#.# +#...#..... +#..#..#... +...#...... +#.#.#..#.. +#....#..#. +#........# +#........# +.....#.... +..#.#####. + +Tile 3257: +####.####. +#...#...## +....##.#.. +....#..#.. +......#.## +#.....#..# +......##.. +......#.## +##.....#.# +.#.###..## + +Tile 1223: +#.###.#.#. +#..####..# +.....#...# +##.#.##... +#.....#... +##..#..#.. +...#.###.. +...#..#... +##.....##. +.###.##..# + +Tile 1709: +#.##...... +#.#....... +......##.. +......#... +#.#....... +.##....#.. +.......#.# +.#.#...#.. +.###...#.# +##.###.#.# + +Tile 1019: +...##.##.. +..#.....#. +#......##. +..#....#.# +..#......# +#........# +.##...#... +.......#.# +#..#...... +...#.#.#.# diff --git a/aoc2020/input/day20_provided.txt b/aoc2020/input/day20_provided.txt new file mode 100644 index 0000000..b07aa4b --- /dev/null +++ b/aoc2020/input/day20_provided.txt @@ -0,0 +1,107 @@ +Tile 2311: +..##.#..#. +##..#..... +#...##..#. +####.#...# +##.##.###. +##...#.### +.#.#.#..## +..#....#.. +###...#.#. +..###..### + +Tile 1951: +#.##...##. +#.####...# +.....#..## +#...###### +.##.#....# +.###.##### +###.##.##. +.###....#. +..#.#..#.# +#...##.#.. + +Tile 1171: +####...##. +#..##.#..# +##.#..#.#. +.###.####. +..###.#### +.##....##. +.#...####. +#.##.####. +####..#... +.....##... + +Tile 1427: +###.##.#.. +.#..#.##.. +.#.##.#..# +#.#.#.##.# +....#...## +...##..##. +...#.##### +.#.####.#. +..#..###.# +..##.#..#. + +Tile 1489: +##.#.#.... +..##...#.. +.##..##... +..#...#... +#####...#. +#..#.#.#.# +...#.#.#.. +##.#...##. +..##.##.## +###.##.#.. + +Tile 2473: +#....####. +#..#.##... +#.##..#... +######.#.# +.#...#.#.# +.######### +.###.#..#. +########.# +##...##.#. +..###.#.#. + +Tile 2971: +..#.#....# +#...###... +#.#.###... +##.##..#.. +.#####..## +.#..####.# +#..#.#..#. +..####.### +..#.#.###. +...#.#.#.# + +Tile 2729: +...#.#.#.# +####.#.... +..#.#..... +....#..#.# +.##..##.#. +.#.####... +####.#.#.. +##.####... +##..#.##.. +#.##...##. + +Tile 3079: +#.#.#####. +.#..###### +..#....... +######.... +####.#..#. +.#...#.##. +#.#####.## +..#.###... +..#....... +..#.###... diff --git a/aoc2020/src/day20.rs b/aoc2020/src/day20.rs new file mode 100644 index 0000000..6fca696 --- /dev/null +++ b/aoc2020/src/day20.rs @@ -0,0 +1,135 @@ +use std::fmt::Write; + +use anyhow::{anyhow, Context, Result}; + +const INPUT: &str = include_str!("../input/day20.txt"); + +pub fn run() -> Result { + let mut res = String::with_capacity(128); + + writeln!(res, "part 1: {}", part1(INPUT)?)?; + + Ok(res) +} + +fn part1(input: &str) -> Result { + let tiles: Vec = input.split("\n\n").map(str::parse).collect::>()?; + + Ok(tiles + .iter() + .filter_map(|tile| { + let mut count = 0; + for other in &tiles { + if tile == other { + continue; + } + + count += tile + .edges + .iter() + .filter(|e| other.edges.contains(e)) + .count(); + + count += tile + .reversed_edges + .iter() + .filter(|e| other.edges.contains(e)) + .count(); + } + + // corners have 2 edges in common + if count == 2 { + Some(tile.id) + } else { + None + } + }) + .product()) +} + +#[derive(Debug)] +struct Tile { + id: u64, + edges: [Vec; 4], + reversed_edges: [Vec; 4], +} + +impl std::cmp::PartialEq for Tile { + fn eq(&self, other: &Self) -> bool { + self.id == other.id + } +} + +impl std::str::FromStr for Tile { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result { + const LINE_LENGTH: usize = 10; + + let mut lines = s.lines(); + + let title = lines.next().context("couldn't find line with tile ID")?; + let space = title.find(' ').unwrap(); + let colon = title.find(':').unwrap(); + let id = title[(space + 1)..colon].parse()?; + + let mut edges = [vec![], vec![], vec![], vec![]]; + + lines + .enumerate() + .try_for_each::<_, Result<()>>(|(i, line)| { + line.chars().enumerate().try_for_each(|(j, c)| { + let c = match c { + '#' => true, + '.' => false, + _ => return Err(anyhow!("unknown char `{}` while parsing tile", c)), + }; + + if i == 0 { + edges[0].push(c); + } + if j == 0 { + edges[1].push(c); + } + if i == (LINE_LENGTH - 1) { + edges[2].push(c); + } + if j == (LINE_LENGTH - 1) { + edges[3].push(c); + } + + Ok(()) + })?; + + Ok(()) + })?; + + let mut reversed_edges = [vec![], vec![], vec![], vec![]]; + for (i, edge) in edges.iter().enumerate() { + reversed_edges[i] = edge.iter().copied().rev().collect(); + } + + Ok(Tile { + id, + edges, + reversed_edges, + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + const PROVIDED: &str = include_str!("../input/day20_provided.txt"); + + #[test] + fn part1_provided() { + assert_eq!(part1(PROVIDED).unwrap(), 20_899_048_083_289); + } + + #[test] + fn part1_real() { + assert_eq!(part1(INPUT).unwrap(), 5_775_714_912_743); + } +} diff --git a/aoc2020/src/lib.rs b/aoc2020/src/lib.rs index 017ba88..0ec7fd3 100644 --- a/aoc2020/src/lib.rs +++ b/aoc2020/src/lib.rs @@ -19,6 +19,7 @@ pub mod day16; pub mod day17; pub mod day18; pub mod day19; +pub mod day20; pub mod day21; pub mod day22; pub mod day23; diff --git a/aoc2020/src/main.rs b/aoc2020/src/main.rs index 610b152..6b1ca8e 100644 --- a/aoc2020/src/main.rs +++ b/aoc2020/src/main.rs @@ -21,6 +21,7 @@ use aoc2020::day16; use aoc2020::day17; use aoc2020::day18; use aoc2020::day19; +use aoc2020::day20; use aoc2020::day21; use aoc2020::day22; use aoc2020::day23; @@ -47,6 +48,7 @@ fn main() -> Result<()> { day17::run, day18::run, day19::run, + day20::run, day21::run, day22::run, day23::run,