1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
//! # Day 18: Like a Rogue
//!
//! As you enter this room, you hear a loud click! Some of the tiles in the floor here seem to be
//! pressure plates for [traps], and the trap you just triggered has run out of... whatever it tried
//! to do to you. You doubt you'll be so lucky next time.
//!
//! Upon closer examination, the traps and safe tiles in this room seem to follow a pattern. The
//! tiles are arranged into rows that are all the same width; you take note of the safe tiles (`.`)
//! and traps (`^`) in the first row (your puzzle input).
//!
//! The type of tile (trapped or safe) in each row is based on the types of the tiles in the same
//! position, and to either side of that position, in the previous row. (If either side is off
//! either end of the row, it counts as "safe" because there isn't a trap embedded in the wall.)
//!
//! For example, suppose you know the first row (with tiles marked by letters) and want to determine
//! the next row (with tiles marked by numbers):
//!
//! ```txt
//! ABCDE
//! 12345
//! ```
//!
//! The type of tile `2` is based on the types of tiles `A`, `B`, and `C`; the type of tile `5` is
//! based on tiles `D`, `E`, and an imaginary "safe" tile. Let's call these three tiles from the
//! previous row the **left**, **center**, and **right** tiles, respectively. Then, a new tile is a
//! **trap** only in one of the following situations:
//!
//! - Its **left** and **center** tiles are traps, but its **right** tile is not.
//! - Its **center** and **right** tiles are traps, but its **left** tile is not.
//! - Only its **left** tile is a trap.
//! - Only its **right** tile is a trap.
//!
//! In any other situation, the new tile is safe.
//!
//! Then, starting with the row `..^^.`, you can determine the next row by applying those rules to
//! each new tile:
//!
//! - The leftmost character on the next row considers the left (nonexistent, so we assume "safe"),
//!   center (the first `.`, which means "safe"), and right (the second `.`, also "safe") tiles on
//!   the previous row. Because all of the trap rules require a trap in at least one of the previous
//!   three tiles, the first tile on this new row is also safe, `.`.
//! - The second character on the next row considers its left (`.`), center (`.`), and right (`^`)
//!   tiles from the previous row. This matches the fourth rule: only the right tile is a trap.
//!   Therefore, the next tile in this new row is a trap, `^`.
//! - The third character considers `.^^`, which matches the second trap rule: its center and right
//!   tiles are traps, but its left tile is not. Therefore, this tile is also a trap, `^`.
//! - The last two characters in this new row match the first and third rules, respectively, and so
//!   they are both also traps, `^`.
//!
//! After these steps, we now know the next row of tiles in the room: `.^^^^`. Then, we continue on
//! to the next row, using the same rules, and get `^^..^`. After determining two new rows, our map
//! looks like this:
//!
//! ```txt
//! ..^^.
//! .^^^^
//! ^^..^
//! ```
//!
//! Here's a larger example with ten tiles per row and ten rows:
//!
//! ```txt
//! .^^.^.^^^^
//! ^^^...^..^
//! ^.^^.^.^^.
//! ..^^...^^^
//! .^^^^.^^.^
//! ^^..^.^^..
//! ^^^^..^^^.
//! ^..^^^^.^^
//! .^^^..^.^^
//! ^^.^^^..^^
//! ```
//!
//! In ten rows, this larger example has `38` safe tiles.
//!
//! Starting with the map in your puzzle input, in a total of `40` rows (including the starting
//! row), **how many safe tiles** are there?
//!
//! [traps]: https://nethackwiki.com/wiki/Trap

use anyhow::Result;

pub const INPUT: &str = include_str!("d18.txt");

pub fn solve_part_one(input: &str) -> Result<i64> {
    Ok(0)
}

pub fn solve_part_two(input: &str) -> Result<i64> {
    Ok(0)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn part_one() {}

    #[test]
    fn part_two() {}
}