day11
This commit is contained in:
parent
ecc548a987
commit
00aaba5f41
94
data/day11/input
Normal file
94
data/day11/input
Normal file
@ -0,0 +1,94 @@
|
||||
LLLLLLLLLLL..LLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LL.LLLLLLLL..LLLLL
|
||||
LLLLL..L.LLL.L.LLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLL.LLLLLL..LLLL
|
||||
LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLL.LLLLL.LLLLLL.LLLLL
|
||||
LLLLLLLLLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLL
|
||||
LLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLL
|
||||
LLLLLL.LLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLL
|
||||
LLLL.L.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLL
|
||||
LLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLL.LLL..LLLLLLL
|
||||
..LLL...L....LL...LLLL.....LL.L.LL.....LL.....L...L.L....LLL..L....L......L........L...L.L..
|
||||
LLLLLL.LLLLLLLLLLLL.LLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLL..LLLLLLLLLLLLLLLLLL
|
||||
LLLLLLLLL.LL.LLLLLL.LLLLLLLLLLLLLL.LLLLLL..LLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLL.LL.LL
|
||||
LLLLLLLLL.LL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLL..LLLLLL.LLLLL.LLLLLL.LLLLL
|
||||
LLLLLL.LLLLL.LL.LLLLLLLLLLLLLLLLL..LLLLLL.LLLLLLLLL.LLL.LL.LLLLLL..LLL.LLLLLLLLLLLLLLL.LLLLL
|
||||
LLLLLLLLLLLL.LLLLLLL.LL..LLLLLLLLLLLLLL.L.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLL.LLLLL.LLLLLLLLLLLL
|
||||
LL.L.LLL.L.L..LLL....LL..L.L..LL.L.LL....LL....LL..LLL.......L....LLL...LL...L....L.....LL..
|
||||
LLLLLL.LLLLL.LLLLLL.LLL.L.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLL.LLLLL
|
||||
LLLLL..LLLL.LLLLLLL.LLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LL.LLL.L.LLL.LLLL.LLLLLLL
|
||||
LLLLL..LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLL..LLLLL.LLLLL
|
||||
LL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LL.LLLL.LL.LLL.LLLLL.LLLLLL.LLLLL
|
||||
LLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLL.LLLLL.LLLLLL.L.LLL
|
||||
....L...L.L...L..L..LL.........L.L...L.....L...LLLLL...LL.....LLL..LL..L.L...LL......LL..L..
|
||||
LLLLLL.LLLLL.LLL.LL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLL.LLLLL.LLLLLL.LLLLL
|
||||
LLLLLL.LLL.L.LLLLLL.LLLLL.LLL.L.LL.LLLLLLLLLLLLLLL..LLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLL.LLLLL
|
||||
LLLLLL.LLLLL.LLLLLLLLLLLL.LL.LLLLL.LLLLLL.LLLLLLLLL.LL.LLL.LLLLL.L.LLLLLL.LLLLLLLLLLLL.LLLLL
|
||||
LLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LL.LLL.L.LLLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL
|
||||
LLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLL.L.LLLLLLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLLL.LLLLL.LLLLLLLLLLLL
|
||||
LLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLLLL.LLLL.LLLLLLLLL.LLLL.L.LLLLLLL.LLLLLLLLLL.L.LLLLLL.LLLLL
|
||||
L..LL......L...L.L..L..LLL........LLL....L.L.L.L..........L.L...L..LL.L.......L...L.LL.LL...
|
||||
LLLLLLLLLLLL.LLL.LL.LLLLL.LLLLLLLL.LLLLLL.LL.LLLLLLLLLLLLL.LLL.LLLLLLLLLL.LLLLL.LLLLLL.LLLLL
|
||||
LLLLLLLL.LLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLL.LLLL.L.LLLLLLL.LLLLLL.LLLLL.LLLL.L.LLLLL
|
||||
LLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLL..LLLLLLLLLLLLLLL.L.LL.LL.LL.LLL.LLLLL.LLLLLLLLLLLL
|
||||
LLLLLL.LLLLL.LLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL
|
||||
LLLLLL.LLLLL.LLLL.L.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL..LLL.LLLLLLLLL.LLLLL.LLLLLL.LLLLL
|
||||
LLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLLLL.LL.LL.LLLLLLLLLLLL.L.LLLLL.LLLLLLLLLLLL
|
||||
LLLLLL.LLLL..LLLLLL.LLLLL.LLLL.LLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLL.LLLLLL.LLLLL
|
||||
.L.......L...L.LLL...LL....L...L.......L......L..L...L.....L.....LL..L...L..L.L.......L.....
|
||||
LL.LLL.LLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.L.LLLLL.LLLLLLLLLLLL
|
||||
LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLL.LLL.L
|
||||
LLLLLLLLLL.L.LLLLLL.L.LLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLL
|
||||
LLLL.L.L.LLL.LLLLLL.LLLLL.LLLLLLL..LLLLLL.LLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLL.LLLLL
|
||||
.........L..LL...L..LLL.L.L.L.LL....LLLL...L....L...L.LL....LL.LL.L......L.L.LLLLL.L.LL....L
|
||||
LLLLLL.LLLLL.LLLLLL.LLLL..LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLL.L.LLLLLLLLLLLL.LLLLL
|
||||
LL.LLL.LLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.L..LLLLLLLLL...LLL..LLLLLLL.LLLLLLLLLLLL
|
||||
L.LLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.L.LLLLLLL.LLLLLL.LLLLL.LLLLLL.LLLLL
|
||||
LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LL.LLL.LLLLL.LLLLLL.LLLLL
|
||||
LLLLLLLLLLLL.LL.LLL.LLLLL.L.LLLLLL.LLLLLL.L.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLL
|
||||
LLLLL..LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LL.LLLL.LLLLLL.LLLLLLLLLLLL.LLLLL
|
||||
LLL.LLLLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLL..LLLLLL.LL.LLLLLL.LLLLL.L..LLLLL.LLLL...LLLLLLLLLLL
|
||||
LLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLL..LLLLLLLLLLLL
|
||||
..L..........LLLL...LL....LLLLL....L...L...L...L.......L.LL..L....L....L.L..L....LL......L..
|
||||
LLLLLL.LLLLL.L.LLLL.LLLL..LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLL.LLLLLL.LLLLL
|
||||
LL.LLL.LLLLL.LLLLL..LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLL.LLLLLLL.LLLLLL.LLLLL.LLLLLL..LLLL
|
||||
LLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLL.L.LLLLLLLLLL.LLLLLL.LLL..LLLLLLLLLLLLLLLLL
|
||||
LLLL.LLLLLLL.LLLLLL.LLL.L.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL..LLLLL.LLLLL
|
||||
LL.LLL.LLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLL.LLLLLL..LLLLLL.LLLLLLLLLLLLLLLLLL
|
||||
LLLLLLLLLLLLLLLLLLLLL.L.L.LLLLLLLLLLLLLLL.LLL.LLLLL.LLLLLL.L.LLLLL...LLLL.LLLLLLLLLLLLLLLLLL
|
||||
.L...L...........L.LLL..L.......L.....LL......L.LLL........LL..L...L......L.L....L.LLL.LL..L
|
||||
LLLLLL.LLLLL.L.LLLL.LLLLL.LLLLLLLL.LL.LLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLL.LLLLL
|
||||
LLLLLL.LLLLL.LLLLLL.LL.LL.LLLLLLLL.LLL.LL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLL.LLLLLLLLLLLLLLLLLL
|
||||
LLLLLLLLLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLL.LLLLL
|
||||
LLLLLL.L.LLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLL
|
||||
LLLLLL.L.LLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.L.LLLLL.LLLLLL.LLLLLLLLLLLL.LLLLL
|
||||
LLLLLL.LLLLL..LLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLL.LLLLL
|
||||
LLLLLLLLLLLL.LLLLLL.LLLLLLLLLLL.LL.L.LLLL.LLLLLLLLLLLLLLLL..LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL
|
||||
LLLLLL.LLL.L.LLLLLL..LLLL.LLLL.LLLLLLLLLLLLLLLLLLLL.LLLLL..LLLLLLL.LLLLLLL.LLLL.LLLLLL.LLLLL
|
||||
..L..L..L...L..L.L.....LL..L..L..LLLL..L.......L.LL...L..LL..LLL...L....L..L.L.....L..LL...L
|
||||
LLLLLL.LLLLLLLLLLLL.LL.LL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLLL.LLLLL
|
||||
LLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL
|
||||
LLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLL..LLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL
|
||||
LLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLL.LLLLLL..LLLLLL.LLLLL
|
||||
LLLLLL.LL.LL.LLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL
|
||||
LLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLL.L.LLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLL.LLLLLLL.LLLLL.LLLL
|
||||
LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLL..LLLLLL.LLLLL..LLLLLLLLLLL
|
||||
LL..L.L......L.......L........L.LL.....LL......L...L..L.L...L.LL..L..L......L.L..LL...LL...L
|
||||
LLLLLL.LL.LL.LLLLLL.LLLLL.LLLLLLLL.LLLLLL.L..LLLLLL.LLLLLL.LLLLLLL.LLLLLL..L.LLLLLLLLLLLL.LL
|
||||
LLLLLL.LL.LL.LLLLLL.LLLLLLLL.LLLLL.LLLLLL.LL.LLLLLL.LLLLLL.LLL.LLL.LL.LLL..LLLLLLLLLLL.LLLLL
|
||||
LLLLLLL.LLLL.LLLLLL.LLL.LLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL..LLLLL.LLLLLLLLLLLL.LLLLL
|
||||
LLLLLL.L.LLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LL.LLL.LLLLLLL.LLLLLLLLLLLL.LLLLLL.LLLLL
|
||||
LLLLLLLLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLL..LLLLL
|
||||
LLLL.L.LLLLL..LLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLL.L.LLLLL.LLLLLL.LLLLL.LLLL.LLLLLLL
|
||||
LLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLL
|
||||
LLLLL..L.LLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL..LLLLL.LLLLLL.LLLLL
|
||||
L....L.L.L..LLL.....L....LL...LL....LLLL....LLL.L.......L.....LL.....L..L.LL..LL....L...LL.L
|
||||
LLLLLL.LLLLL.LLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLL.LLLLLL.LLLLL
|
||||
LL.LLL.L.LLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLL.LL.LLLLL.L.LLLLLL.LLLLL.LLLLLL.LLLL.
|
||||
LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.L.LL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLLL.L.LLL
|
||||
LLLLLL.LLLLL.LLLL.L.LLLLLLLLLLLLLL.LLLLLL..LLLLLLLL.L.LLLL.LLL.LLL.LLLLLL.LLLLL.LLLLLL.LLLLL
|
||||
LLLLLLLLLL.L.L.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLL
|
||||
LLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLL
|
||||
LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLL.LLLLLL.LLLLL
|
||||
LLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLL...LLLLL.L.LLLL.LLLLLLLLLLLL..LLLL
|
||||
LLLLLL.LL.LL.LLLLLLLLLLLLLLLLLL.LL.LLLLLL.LLLLLLLL..LLLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLLL.LLLLL
|
||||
LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLL
|
||||
LLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLL.LL.LLLLLL.LLLLLLLLLL.LLL.LLLLLL..LLLL.LLLLLLLLLLLL
|
200
src/bin/day11.rs
Normal file
200
src/bin/day11.rs
Normal file
@ -0,0 +1,200 @@
|
||||
const INPUT: &str = include_str!("../../data/day11/input");
|
||||
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
||||
enum Cell {
|
||||
Floor,
|
||||
Seat { occupied: bool },
|
||||
}
|
||||
|
||||
impl Cell {
|
||||
fn parse(b: u8) -> Cell {
|
||||
match b {
|
||||
b'.' => Self::Floor,
|
||||
b'L' => Self::Seat { occupied: false },
|
||||
b'#' => Self::Seat { occupied: true }, // shouldn't happen in input...
|
||||
_ => panic!("Invalid cell: {}", b),
|
||||
}
|
||||
}
|
||||
|
||||
fn as_char(self) -> char {
|
||||
match self {
|
||||
Self::Floor => '.',
|
||||
Self::Seat { occupied: false } => 'L',
|
||||
Self::Seat { occupied: true } => '#',
|
||||
}
|
||||
}
|
||||
|
||||
fn occupied(self) -> bool {
|
||||
match self {
|
||||
Self::Floor => false,
|
||||
Self::Seat { occupied: false } => false,
|
||||
Self::Seat { occupied: true } => true,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, PartialEq, Eq, Debug)]
|
||||
struct Area {
|
||||
width: usize,
|
||||
height: usize,
|
||||
cells: Vec<Cell>,
|
||||
}
|
||||
|
||||
impl Area {
|
||||
fn parse(data: &str) -> Self {
|
||||
let input_width = data.lines().next().unwrap().len();
|
||||
let width = input_width + 2;
|
||||
let mut height = 0;
|
||||
let mut cells = Vec::new();
|
||||
// use stub cells to surround everything to avoid having to check indices for overflow
|
||||
const STUB_CELL: Cell = Cell::Seat { occupied: false };
|
||||
// stub first row with floor cells
|
||||
height += 1;
|
||||
cells.resize(cells.len() + width, STUB_CELL);
|
||||
for line in data.lines() {
|
||||
assert_eq!(input_width, line.len());
|
||||
height += 1;
|
||||
cells.push(STUB_CELL);
|
||||
cells.extend(line.bytes().map(Cell::parse));
|
||||
cells.push(STUB_CELL);
|
||||
}
|
||||
height += 1;
|
||||
cells.resize(cells.len() + width, STUB_CELL);
|
||||
assert_eq!(width * height, cells.len());
|
||||
Self { width, height, cells }
|
||||
}
|
||||
|
||||
fn occupied(&self) -> usize {
|
||||
self.cells.iter().filter(|c| c.occupied()).count()
|
||||
}
|
||||
|
||||
fn step(&self, target: &mut Self) {
|
||||
assert_eq!(self.width, target.width);
|
||||
assert_eq!(self.height, target.height);
|
||||
let w = self.width as isize;
|
||||
let adjacent_offsets = [
|
||||
-w - 1, -w, -w + 1,
|
||||
-1, /* 0, */ 1,
|
||||
w - 1, w, w + 1,
|
||||
];
|
||||
for y in 1..self.height-1 {
|
||||
let row_offset = y * self.width;
|
||||
for x in 1..self.width-1 {
|
||||
let cell_offset = row_offset + x;
|
||||
let co = cell_offset as isize;
|
||||
let c = match self.cells[cell_offset] {
|
||||
Cell::Floor => Cell::Floor,
|
||||
Cell::Seat { occupied: false } => {
|
||||
if adjacent_offsets.iter().all(|&o| !self.cells[(co + o) as usize].occupied()) {
|
||||
Cell::Seat { occupied: true }
|
||||
} else {
|
||||
Cell::Seat { occupied: false }
|
||||
}
|
||||
},
|
||||
Cell::Seat { occupied: true } => {
|
||||
if adjacent_offsets.iter().filter(|&o| self.cells[(co + o) as usize].occupied()).count() < 4 {
|
||||
Cell::Seat { occupied: true }
|
||||
} else {
|
||||
Cell::Seat { occupied: false }
|
||||
}
|
||||
},
|
||||
};
|
||||
target.cells[cell_offset] = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn search_seat(&self, (mut y, mut x): (usize, usize), (diry, dirx): (isize, isize)) -> bool {
|
||||
loop {
|
||||
y = (y as isize + diry) as usize;
|
||||
x = (x as isize + dirx) as usize;
|
||||
match self[(y, x)] {
|
||||
Cell::Floor => (),
|
||||
Cell::Seat { occupied } => return occupied,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn step2(&self, target: &mut Self) {
|
||||
assert_eq!(self.width, target.width);
|
||||
assert_eq!(self.height, target.height);
|
||||
const LOOK_DIRECTIONS: [(isize, isize); 8] = [
|
||||
(-1, -1), (-1, 0), (-1, 1),
|
||||
(0, -1), /* (0, 0), */ (0, 1),
|
||||
(1, -1), (1, 0), (1, 1),
|
||||
];
|
||||
for y in 1..self.height-1 {
|
||||
let row_offset = y * self.width;
|
||||
for x in 1..self.width-1 {
|
||||
let cell_offset = row_offset + x;
|
||||
let c = match self.cells[cell_offset] {
|
||||
Cell::Floor => Cell::Floor,
|
||||
Cell::Seat { occupied: false } => {
|
||||
if LOOK_DIRECTIONS.iter().all(|&ld| !self.search_seat((y, x), ld)) {
|
||||
Cell::Seat { occupied: true }
|
||||
} else {
|
||||
Cell::Seat { occupied: false }
|
||||
}
|
||||
},
|
||||
Cell::Seat { occupied: true } => {
|
||||
if LOOK_DIRECTIONS.iter().filter(|&&ld| self.search_seat((y, x), ld)).take(5).count() < 5 {
|
||||
Cell::Seat { occupied: true }
|
||||
} else {
|
||||
Cell::Seat { occupied: false }
|
||||
}
|
||||
},
|
||||
};
|
||||
target.cells[cell_offset] = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl std::ops::Index<(usize, usize)> for Area {
|
||||
type Output = Cell;
|
||||
|
||||
fn index(&self, (y, x): (usize, usize)) -> &Self::Output {
|
||||
&self.cells[y * self.width + x]
|
||||
}
|
||||
}
|
||||
|
||||
impl std::fmt::Display for Area {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
use std::fmt::Write;
|
||||
for y in 1..self.height-1 {
|
||||
let row_offset = y * self.width;
|
||||
f.write_char(' ')?;
|
||||
for x in 1..self.width-1 {
|
||||
f.write_char(self.cells[row_offset+x].as_char())?;
|
||||
}
|
||||
f.write_str("\n")?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let input_area = Box::new(Area::parse(INPUT));
|
||||
{
|
||||
let mut area = input_area.clone();
|
||||
let mut next_area = area.clone();
|
||||
loop {
|
||||
area.step(&mut next_area);
|
||||
if area == next_area { break; }
|
||||
std::mem::swap(&mut area, &mut next_area);
|
||||
}
|
||||
// print!("{}", area);
|
||||
println!("Occupied part 1: {}", area.occupied());
|
||||
}
|
||||
{
|
||||
let mut area = input_area.clone();
|
||||
let mut next_area = area.clone();
|
||||
loop {
|
||||
area.step2(&mut next_area);
|
||||
if area == next_area { break; }
|
||||
std::mem::swap(&mut area, &mut next_area);
|
||||
}
|
||||
print!("{}", area);
|
||||
println!("Occupied part 2: {}", area.occupied());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user