diff options
author | June McEnroe <june@causal.agency> | 2017-11-27 17:11:18 -0500 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2020-11-22 00:14:25 -0500 |
commit | 051be932a389b8bc3ea5d4626575454844639066 (patch) | |
tree | 9383502b3205624f7aee8faa014228036b5450f9 /src/bin/day18.rs | |
parent | License ISC (diff) | |
download | aoc-051be932a389b8bc3ea5d4626575454844639066.tar.gz aoc-051be932a389b8bc3ea5d4626575454844639066.zip |
Move to 2016 directory
Diffstat (limited to 'src/bin/day18.rs')
-rw-r--r-- | src/bin/day18.rs | 88 |
1 files changed, 0 insertions, 88 deletions
diff --git a/src/bin/day18.rs b/src/bin/day18.rs deleted file mode 100644 index 19f8c91..0000000 --- a/src/bin/day18.rs +++ /dev/null @@ -1,88 +0,0 @@ -use std::io::{self, Read}; - -#[derive(Clone, Copy, PartialEq, Eq)] -enum Tile { - Safe, - Trap, -} - -impl From<char> for Tile { - fn from(ch: char) -> Tile { - match ch { - '.' => Tile::Safe, - '^' => Tile::Trap, - _ => panic!("invalid tile char {}", ch), - } - } -} - -struct Map { - rows: Vec<Box<[Tile]>>, -} - -impl Map { - fn generate_row(&mut self) { - let mut next = Vec::new(); - - { - let previous = self.rows.last().unwrap(); - - for (i, ¢er) in self.rows.last().unwrap().iter().enumerate() { - let left = previous.get(i.wrapping_sub(1)).cloned().unwrap_or(Tile::Safe); - let right = previous.get(i + 1).cloned().unwrap_or(Tile::Safe); - - let tile = match (left, center, right) { - (Tile::Trap, Tile::Trap, Tile::Safe) => Tile::Trap, - (Tile::Safe, Tile::Trap, Tile::Trap) => Tile::Trap, - (Tile::Trap, Tile::Safe, Tile::Safe) => Tile::Trap, - (Tile::Safe, Tile::Safe, Tile::Trap) => Tile::Trap, - _ => Tile::Safe, - }; - next.push(tile); - } - } - - self.rows.push(next.into_boxed_slice()); - } - - fn count_safe(&self) -> usize { - self.rows.iter() - .map(|row| { - row.iter() - .filter(|&&t| t == Tile::Safe) - .count() - }) - .sum() - } -} - -impl<'a> From<&'a str> for Map { - fn from(s: &'a str) -> Map { - let rows = s.lines() - .map(|l| l.chars().map(Tile::from).collect::<Vec<_>>().into_boxed_slice()) - .collect(); - Map { rows: rows } - } -} - -fn solve(rows: u32, input: &str) -> usize { - let mut map = Map::from(input); - for _ in 1..rows { - map.generate_row(); - } - map.count_safe() -} - -fn main() { - let mut input = String::new(); - io::stdin().read_to_string(&mut input).unwrap(); - - println!("Part 1: {}", solve(40, &input)); - println!("Part 2: {}", solve(400000, &input)); -} - -#[test] -fn part1() { - assert_eq!(6, solve(3, "..^^.")); - assert_eq!(38, solve(10, ".^^.^.^^^^")); -} |