Implemention day 11

This commit is contained in:
2020-12-11 08:20:27 +01:00
parent 190a7e7423
commit 7649d628e7
3 changed files with 258 additions and 2 deletions

93
2020/inputs/11.txt Normal file
View File

@@ -0,0 +1,93 @@
LLLLLLLLLLLLLLL.L..LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLL.LLLLLL.LLLLLLLLL.LLLL...LLLLLLLLLLL
LLLLLL.LLL.LLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLL.LL.LLLLLL..LLLLLLL.LLLLL.LLLL.LLLLLLLLLLLLL
LLLLL.LL.LLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL
LLLLLLLL.LLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLL.L.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLL.LLLL.LLLLLLLLLLLLL
.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL
LLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLL..LLLLLLL.L.LLLLLLLLLLLLLLLLLLL.LL.LLLLLLLLLL.LLLLLLLLLLLLL
.LL.LLLL..LLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LL.LLLLLLLLLLLLLLL
LLLLLLLL.LLLLLLLLL.L.LLLL.LLLLLLLLL...LLL.LL.L.LLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLL.LL.L
LLL.LLLL.LLLLLLLLL.LLLLLL.LLLL.LLLL.LLLLLLLL..LLLL.LLLLLLLLL.LLLLLLLLLLLL.L.LLLL.LLLLLLLLLLLLL
.LLLLLLL.LLLLLLL.L.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL.L..LLLLLLL.LLLLLLLLLLLLL
..L......L.L..L.LL.LL....L......L.L.L..LL....L............L..L.LLL..L..LL.LL...............L..
LLLL.LLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLL.LLLLL.L.LLLL.LL.LLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL
LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.L..LLLLLL..LLLLLLLL.LLLLLLLLLLL.LLL.LLLLL.LLL.LLLL.LLLLLLLLL
LLLLLLLLLLLLLLL.LL.LLLLLL.LLLL.LLLL.LLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LL.L..LLLLLLLLLLLL
LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLL.LLLLLLLLLLLLL
LLLLLLLL.LLLLLLL.L.LLLL.LLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL..LLLLL.LLL.LLLLLLLLLLLL.L
LLLLLLLL.LLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LL.LLLLLL.LL.LLL.LLLL.LLLLLLLLLL.LLLLLLLLLL.LL
LL.LLLLLLLLLLLLLL..LLLLLL.LLLLLLLLLLLLLLLLLL.LLL.L.LLLLLLLLLLLLLLLL.LL.LLLL.LLLL.LLLL.LLLLLLLL
..L......L....L...L..LLL..L.LL.....LLL.LL.L..LLLLLL...L.LL.LL...L....L..LLL.LLL..L...L........
LLLLLLLLLLLLLLLL.L.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLL.LL.LLLLL.LLLLLLLLLL.LL.LL.LLLLLLL
LLLLLLLL.LLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLL.LLLLL.LLL.LLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLL
L.LLLLLLLLLLLLLLLL.L.LLLL.LLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLL
LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLL.LLLLLLL.L.LLLLLL.LL.LL.LLLL.LLLLLLLLLLLLL
LL...........L..L.....L..L.....L......L..L.LL.L....LL..L.L...L..LLLL....LL.LL.......LLL......L
LLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LL.LLLLLLLLLLL..LLL.LLLLLLLLLLLLL
LLLLLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL
LLLL.LLL.LLL.LLLLLLLLLL.L..LL.LLLLLLLLLLLLLL.LLL.L.L.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL
LLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLL.LLLLLLLL.L.LLLL.LLLLLLLLLL.LL
LLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLLLL..LLLLLLL..LLLLLL.LLLLLLLLLLLLLLL.L.LLLLLLLLLL..LLLLLLLLLLLL
.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL.L.LLL.LLLLLLLLLLLLLLLLLL
LLLLLLLL.L.LLLLLL.LLLLLLLLLLLL.LLLL..LLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLL
L.L..LLLL..L...L.L..L..L.LL.L..L....LL.L...L..L.L.LL......LLL.L.L..L.......L...LL...LLLL....L.
LL.LLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLL.LL.L..LLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLL
.LLLLLLLLLLLLLLLLL..LLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLL..LLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLL
LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LL.LLLLL.LLLLLLLL.LL..LLLLLLLLL.L.LLLLLLLLLLLLLLLLLL
LLLLLLLL..LLLLLLLL.LLL.LL.LLLLLLLLL.LLLLLLLL.LL.LL.LLLLLLLLL.LLLLLLLL.LLLLL.LLLL.LLLLLLLLLLLLL
LLLLLLLLLLLLLLLLL..LLLLLL..LLLLLLLL.LLLLLLLL..LLLL..LLLLLLLL.L.LLLLLL.L.LLLLLLLL.LLLLLLLLLLLLL
L.LL...LL..L......L..L..L..L.LL...LL...L....LL..L..........L..L.L.LL.L......L.........L.L.L...
LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLL.LLLLLLLLLLLLL
LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLL
LLLLLLLLLLLLLLLLL.LLL.LLLLLLLLLLLL..LL.LLL.LLLLLLLLLLLLLLLLL.LLL.L.LL.LLLLLLLLLL.LLLLLLLLLLLLL
LLLLLLL..LLLLLLLLL.LLL.LL.LLLLLLLLL.LLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LL.L.LLLL.LLLLLLLL
LLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLL..LLLLL.LLLLLLLLL.LLLLLLLL.L.LLL.LLLL.LLLLLLLLLLLLL
LLLLLLLL.LLLLLLLLLLLLLL...LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL..LLL.LLLLLLLLLL.LLL.LLLLLLLLLLLLLL
LLLLL.LL.LLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLLL.LLLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LL.LLLLL.LLLL.LLLLLLL.LLLLLLLLLLL.LLLL.LLLLL.LLLLLLL
LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLL.L.LLLL.LLL..LL.LLLLLLLLLL..LLLLLLLLLLLLLLLLLL
.L.L..LL....L.LLLL.....LL.L...L.L..LL..LL........LL..L.L..L....L.LLL....L..L.L..L.LL..L.....L.
LLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLL.LL.LLLLLLLLLL.LLLLLLLL.LLLL..LLLL.LLLLL.LLLL.LL
LLLLLLLL.LLLLL.L.L.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LL.L.LLLLLLLL.LLLL
LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLLLLLLL.LLL.LLLLL.LLLL.LLLLLLLLLLL.L
LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLLL.LLL.LLLLL.LLL..LLLLLLLLLLLLL
LLLLLLLL.LLLLLLLLL.LLL.L.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLL
LLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLL.L.LLLLLLLLLLLLL.LLLLLLLL.LL.LL.LLLLLLLLLLLL
LLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL
LL.LL..L.LL.....LL..L.LLLL..........L.....L.L..LL..LLLL....L.........L.L...L...L....L...LL...L
LLLLLLLL.LLLLLLLL..LLLLL..LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLL..LLL..LLLLLLLLLLLL
LLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.L.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLL.LL.L.L.LLLLLLLLLLL
LLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL..LLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLL
L.LLLLLL.LLLL.LLLL.LLLLLL.LLLLLLLLL.LL.LLLLL.LLLLL.LLLLLLLLL.LLL.LLL.LLLL.LLLLLL.LLLLLLLLLLLLL
....L........L.....L.L.............L.L..L..LLLL.......L......LL.........L....L...L.LL..LL.LL.L
LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLL..LLLLLLL.LLLLL.LLLL.LLLLLLLLLL.LL
LLLLLLLL.LLLLLLL.L.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLL.L.LLLLLLLLLLLL.LLLL.LLLLLLLLLL.LL
LLLLLLLLLLLLLLLL.L.LLLLLL..LLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLL..LLLLLLLL.LLLLL.LLL.LLLLLLLLLLLLLL
LLLL.LLL.L.LLLLLLL.LLLLL.LLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLL.LLLLLLLLLLLLL
LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL
.L..LL.LL...LLL..L..L..L.L..LL......LLLL......L...LLL...L..L...LL....LL....LL.LLLLL...L.L.L..L
LLLLLLLL.LLL.LLLLL.LLL.LL.L.LLLLLLL.LLLLLLL.LL.LLLLLLLLLLLLL.LLLLLLLLLL.LLL.LLLL.LLLLLLLLLLLL.
LL.LLL.L...LLLLL.L.LLLL.L.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.L.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL
LLLLLLLL.LLLL.LL.L.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLL.LLLLL.LLLLL.LL.LLLLLL.LLLLLL.LLLLLLLLLL.LLL
LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLL.LLLLL..LLLLLL
LLLLLLLL..LLLLLLL..LLLL.L.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.L.LLL..LLL.LLLLLLLLLLLL.
LLLLLLL..LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLLL
LLLLLLL..LLLLL.LLL.LLLLLL.LLLLLLLLL..LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLLLLLL.LLLLL
LLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLL..LLL.LLLLLLLLLLLLL
LLLLLLLLLLLLLLLLLL.LL.LLLLLLL.LLLLL.L.LLLLLLLLLLL..LLLLL.LLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLL.LL
.....LLL..L..L...LL..L.LL.LLLL....L.L.LL.L.L......LLLL..L..LL.L......L.LL.....L...L...L..LLL..
.LLLLLLL.LLLLLLLLLLLLLL.L.LLLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLL.LLLLL.LL.LLLLL.LLLL.LLLLLLLLLLLLL
LLLL.LLL.LL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.L.LLL.L.LLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL
LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL
LLLLLLLL.LLLLLLLL..LLLLLL.LLLLLLLLL.LLLLLLLLLLL.LL.LLLLLLLLLLLLLLLLLLLL.LLL.LLLLL.LLLLLLLLLLLL
LLLLLLLL.LLLLL.LLL.LLLLLLLLLLLLLL.L.LLLLLLLL.L.LLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLL
LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LL.LL.LL.LLLLLLLLLLLL.LL
LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLL.LLLLL.L.LL.LLLLLLLLLLLLL
L.L.L.......L.LLL.L.L..L.LLL.L..L...LLLL.L.L.....L...L..L........L...LL...L..L...LLLL..L..L...
LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLL..LLLLLLLLLLLLL.LLLLL..LLL
LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLL.LLL..LLL.LLLLLLL.LLLLL
LLLLL.LL.LLLL.LL.L.LLL.LL.LLLL.LLLL.LLLLLLLL.LLLLL.LLLLLL.LL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL
LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLL.L.LLLLLLLLLL.LLLLLLLLLLLLL
LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLL.L.LLLL.LLLLLLLLLLLLL
.LLLLL.L.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLL.L.LLLLLLLL.LLLLLLL.L.LLL.LLLLLLLLLLL.LLLLLL
LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLLL
LLLLLLLL..LLLLLLLL.LLLLL..LL.LLLLLL.LLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLL..LLL.LLLLLLLLLLLLL

10
2020/samples/11.txt Normal file
View File

@@ -0,0 +1,10 @@
L.LL.LL.LL
LLLLLLL.LL
L.L.L..L..
LLLL.LL.LL
L.LL.LL.LL
L.LLLLL.LL
..L.L.....
LLLLLLLLLL
L.LLLLLL.L
L.LLLLL.LL

View File

@@ -1,12 +1,165 @@
use std::io::Read;
use std::mem::swap;
use crate::common::read_char_grid;
use crate::Solution;
fn neighbours(grid: &[Vec<u8>], r: usize, c: usize) -> usize {
let mut n = 0;
if r > 0 {
let range = c.saturating_sub(1)..grid[r - 1].len().min(c + 2);
n += grid[r - 1][range].iter().filter(|&&s| s == b'#').count();
}
if r < grid.len() - 1 {
let range = c.saturating_sub(1)..grid[r + 1].len().min(c + 2);
n += grid[r + 1][range].iter().filter(|&&s| s == b'#').count();
}
if c > 0 && grid[r][c - 1] == b'#' {
n += 1;
}
if c < grid[r].len() - 1 && grid[r][c + 1] == b'#' {
n += 1;
}
n
}
fn neighbours2(grid: &[Vec<u8>], r: usize, c: usize) -> usize {
let mut n = 0;
let directions = [
(-1, -1),
(-1, 0),
(-1, 1),
(0, -1),
(0, 1),
(1, -1),
(1, 0),
(1, 1),
];
let r = r as isize;
let c = c as isize;
for &(dr, dc) in &directions {
let mut nr = r + dr;
let mut nc = c + dc;
// Don't write conditions like this kids
while nr >= 0
&& nr < (grid.len() as isize)
&& nc >= 0
&& nc < (grid[nr as usize].len() as isize)
{
match grid[nr as usize][nc as usize] {
b'#' => {
n += 1;
break;
}
b'L' => break,
_ => {
nr += dr;
nc += dc;
}
}
}
}
n
}
#[allow(unused)]
fn print(grid: &[Vec<u8>]) {
for line in grid {
let s: String = line.iter().map(|&c| c as char).collect();
println!("{}", s);
}
}
#[derive(Default)]
pub struct Day11;
impl Solution for Day11 {
fn part1(&mut self, _input: &mut dyn Read) -> String {
todo!()
fn part1(&mut self, input: &mut dyn Read) -> String {
let mut state = read_char_grid(input);
let mut next = state.clone();
loop {
for (r, row) in state.iter().enumerate() {
for (c, s) in row.iter().enumerate() {
let e = match *s {
b'#' if neighbours(&state, r, c) >= 4 => b'L',
b'L' if neighbours(&state, r, c) == 0 => b'#',
s => s,
};
next[r][c] = e;
}
}
if state == next {
return state
.iter()
.flatten()
.filter(|&&s| s == b'#')
.count()
.to_string();
}
swap(&mut state, &mut next);
}
}
fn part2(&mut self, input: &mut dyn Read) -> String {
let mut state = read_char_grid(input);
let mut next = state.clone();
loop {
for (r, row) in state.iter().enumerate() {
for (c, s) in row.iter().enumerate() {
let e = match *s {
b'#' if neighbours2(&state, r, c) >= 5 => b'L',
b'L' if neighbours2(&state, r, c) == 0 => b'#',
s => s,
};
next[r][c] = e;
}
}
if state == next {
return state
.iter()
.flatten()
.filter(|&&s| s == b'#')
.count()
.to_string();
}
swap(&mut state, &mut next);
}
}
}
#[cfg(test)]
mod tests {
use crate::test_implementation;
use super::*;
const SAMPLE: &[u8] = include_bytes!("../samples/11.txt");
#[test]
fn sample_part1() {
test_implementation!(Day11, 1, SAMPLE, 37);
}
#[test]
fn sample_part2() {
test_implementation!(Day11, 2, SAMPLE, 26);
}
}