clean up main parser
This commit is contained in:
parent
d394c3211c
commit
e5bb9f3673
1 changed files with 13 additions and 21 deletions
|
@ -5,8 +5,8 @@ use std::{
|
||||||
|
|
||||||
use winnow::{
|
use winnow::{
|
||||||
PResult, Parser,
|
PResult, Parser,
|
||||||
ascii::{newline, till_line_ending},
|
ascii::newline,
|
||||||
combinator::{alt, opt, repeat, separated},
|
combinator::{alt, opt, repeat, separated, seq},
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@ -18,7 +18,12 @@ fn main() {
|
||||||
fn pt1(input: &str) -> usize {
|
fn pt1(input: &str) -> usize {
|
||||||
let mut board = Board::new(input);
|
let mut board = Board::new(input);
|
||||||
|
|
||||||
board.run()
|
let mut locs = HashSet::new();
|
||||||
|
locs.insert(board.guard.0);
|
||||||
|
while let Some(loc) = board.step().map(|l| l.0) {
|
||||||
|
locs.insert(loc);
|
||||||
|
}
|
||||||
|
locs.len()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn pt2(input: &str) -> usize {
|
fn pt2(input: &str) -> usize {
|
||||||
|
@ -184,15 +189,6 @@ impl Board {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run(&mut self) -> usize {
|
|
||||||
let mut locs = HashSet::new();
|
|
||||||
locs.insert(self.guard.0);
|
|
||||||
while let Some(loc) = self.step().map(|l| l.0) {
|
|
||||||
locs.insert(loc);
|
|
||||||
}
|
|
||||||
locs.len()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_cell(input: &mut &str) -> PResult<Cell> {
|
fn parse_cell(input: &mut &str) -> PResult<Cell> {
|
||||||
|
@ -217,25 +213,21 @@ fn parse_floor(input: &mut &str) -> PResult<Cell> {
|
||||||
match g {
|
match g {
|
||||||
'.' => Ok(Cell::Empty),
|
'.' => Ok(Cell::Empty),
|
||||||
'#' => Ok(Cell::Obstacle),
|
'#' => Ok(Cell::Obstacle),
|
||||||
'X' => Ok(Cell::Visited),
|
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_line(input: &mut &str) -> PResult<Vec<Cell>> {
|
fn parse_line(input: &mut &str) -> PResult<Vec<Cell>> {
|
||||||
let mut line = till_line_ending.parse_next(input)?;
|
repeat(1.., parse_cell).parse_next(input)
|
||||||
repeat(1.., parse_cell).parse_next(&mut line)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse(input: &str) -> PResult<Board> {
|
fn parse(input: &str) -> PResult<Board> {
|
||||||
|
let (cells, _): (Vec<Vec<Cell>>, _) = seq!(separated(1.., parse_line, newline), opt(newline))
|
||||||
|
.parse(input)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
let mut gdir = Dir::N;
|
let mut gdir = Dir::N;
|
||||||
let mut loc = Loc(0, 0);
|
let mut loc = Loc(0, 0);
|
||||||
|
|
||||||
let (cells, _): (Vec<Vec<Cell>>, _) =
|
|
||||||
winnow::combinator::seq!(separated(1.., parse_line, newline), opt(newline))
|
|
||||||
.parse(input)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
for (row, line) in cells.iter().enumerate() {
|
for (row, line) in cells.iter().enumerate() {
|
||||||
for (col, cell) in line.iter().enumerate() {
|
for (col, cell) in line.iter().enumerate() {
|
||||||
if let Cell::Guard(d) = cell {
|
if let Cell::Guard(d) = cell {
|
||||||
|
|
Loading…
Reference in a new issue