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 104 105 106 107
//! # Day 19: Monster Messages
//!
//! You land in an airport surrounded by dense forest. As you walk to your high-speed train, the
//! Elves at the Mythical Information Bureau contact you again. They think their satellite has
//! collected an image of a **sea monster**! Unfortunately, the connection to the satellite is
//! having problems, and many of the messages sent back from the satellite have been corrupted.
//!
//! They sent you a list of **the rules valid messages should obey** and a list of **received
//! messages** they've collected so far (your puzzle input).
//!
//! The **rules for valid messages** (the top part of your puzzle input) are numbered and build upon
//! each other. For example:
//!
//! ```txt
//! 0: 1 2
//! 1: "a"
//! 2: 1 3 | 3 1
//! 3: "b"
//! ```
//!
//! Some rules, like `3: "b"`, simply match a single character (in this case, `b`).
//!
//! The remaining rules list the sub-rules that must be followed; for example, the rule `0: 1 2`
//! means that to match rule `0`, the text being checked must match rule `1`, and the text after the
//! part that matched rule `1` must then match rule `2`.
//!
//! Some of the rules have multiple lists of sub-rules separated by a pipe (`|`). This means that
//! **at least one** list of sub-rules must match. (The ones that match might be different each time
//! the rule is encountered.) For example, the rule `2: 1 3 | 3 1` means that to match rule `2`, the
//! text being checked must match rule `1` followed by rule `3` **or** it must match rule `3`
//! followed by rule `1`.
//!
//! Fortunately, there are no loops in the rules, so the list of possible matches will be finite.
//! Since rule `1` matches `a` and rule `3` matches `b`, rule `2` matches either `ab` or `ba`.
//! Therefore, rule `0` matches `aab` or `aba`.
//!
//! Here's a more interesting example:
//!
//! ```txt
//! 0: 4 1 5
//! 1: 2 3 | 3 2
//! 2: 4 4 | 5 5
//! 3: 4 5 | 5 4
//! 4: "a"
//! 5: "b"
//! ```
//!
//! Here, because rule `4` matches `a` and rule `5` matches `b`, rule `2` matches two letters that
//! are the same (`aa` or `bb`), and rule `3` matches two letters that are different (`ab` or `ba`).
//!
//! Since rule `1` matches rules `2` and `3` once each in either order, it must match two pairs of
//! letters, one pair with matching letters and one pair with different letters. This leaves eight
//! possibilities: `aaab`, `aaba`, `bbab`, `bbba`, `abaa`, `abbb`, `baaa`, or `babb`.
//!
//! Rule `0`, therefore, matches `a` (rule `4`), then any of the eight options from rule `1`, then
//! `b` (rule `5`): `aaaabb`, `aaabab`, `abbabb`, `abbbab`, `aabaab`, `aabbbb`, `abaaab`, or
//! `ababbb`.
//!
//! The **received messages** (the bottom part of your puzzle input) need to be checked against the
//! rules so you can determine which are valid and which are corrupted. Including the rules and the
//! messages together, this might look like:
//!
//! ```txt
//! 0: 4 1 5
//! 1: 2 3 | 3 2
//! 2: 4 4 | 5 5
//! 3: 4 5 | 5 4
//! 4: "a"
//! 5: "b"
//!
//! ababbb
//! bababa
//! abbbab
//! aaabbb
//! aaaabbb
//! ```
//!
//! Your goal is to determine **the number of messages that completely match rule `0`**. In the
//! above example, `ababbb` and `abbbab` match, but `bababa`, `aaabbb`, and `aaaabbb` do not,
//! producing the answer **`2`**. The whole message must match all of rule `0`; there can't be extra
//! unmatched characters in the message. (For example, `aaaabbb` might appear to match rule `0`
//! above, but it has an extra unmatched `b` on the end.)
//!
//! **How many messages completely match rule `0`?**
use anyhow::Result;
pub const INPUT: &str = include_str!("d19.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() {}
}