A bit of an overly-fussy implementation for Day 3.
This commit is contained in:
323
inputs/day3.txt
Normal file
323
inputs/day3.txt
Normal file
@@ -0,0 +1,323 @@
|
|||||||
|
.##......#.##..#..#..##....#...
|
||||||
|
...##.....#...###........###...
|
||||||
|
#....##....#.....#.....#..##.##
|
||||||
|
.......#.###.#......#..#..#..#.
|
||||||
|
##..........#....#.#...#.......
|
||||||
|
###.#.#.#......##...#..........
|
||||||
|
.#.##........#..............#..
|
||||||
|
..#..........#...##..#.......##
|
||||||
|
.........##...#...#....###.#...
|
||||||
|
#.......#.....#.#.#...###.##.#.
|
||||||
|
...#...#...#......#........#.##
|
||||||
|
....#..........#.....#..#....##
|
||||||
|
.#.#.##....#.#...#.............
|
||||||
|
#....#..#.....#.#..............
|
||||||
|
........#....#....#..#........#
|
||||||
|
..#.......#...#....##.#........
|
||||||
|
......#.........##.......#.#...
|
||||||
|
............#.......#..........
|
||||||
|
.....#..#.#..#........##...#...
|
||||||
|
....#.....................###..
|
||||||
|
..#.......#.........#..##....##
|
||||||
|
..#........#..#...#........#...
|
||||||
|
..............#....##..##....#.
|
||||||
|
....#..#.#.......#....#..#...##
|
||||||
|
.#........##......#.#..#.#.....
|
||||||
|
............#.##...##...#...##.
|
||||||
|
.......#........#.........##...
|
||||||
|
...#...........#.#...#..#......
|
||||||
|
#...#............#..####.......
|
||||||
|
..#..#..#..#.....#...#.#.#.....
|
||||||
|
....#.#..............#.....##..
|
||||||
|
#.....##........#......#.......
|
||||||
|
.....#..#................##.#..
|
||||||
|
.###.#...................#.....
|
||||||
|
....#....#...#.##..........#...
|
||||||
|
.#.....#....#.......#...#......
|
||||||
|
.....#...#.##.##............#..
|
||||||
|
..........#..#....#...#.#..#...
|
||||||
|
#...#..#..............###.#...#
|
||||||
|
......#....#.#....##....#......
|
||||||
|
............#......#......##...
|
||||||
|
.#....#...#........#.#.#..#....
|
||||||
|
..#.....#.......#.....#.#......
|
||||||
|
#....#......#.......#......#...
|
||||||
|
....#..##.....#...#........#...
|
||||||
|
.#..#......#..#................
|
||||||
|
.#...#...#....#.#...#.....#...#
|
||||||
|
......#..#...#...#..#.......##.
|
||||||
|
...#..#...#.#.......#.......#..
|
||||||
|
..#...#.........#......#......#
|
||||||
|
......#...#..#..........#......
|
||||||
|
.#..#......#....#.#.#...#....#.
|
||||||
|
.#.#....#.#.#..#..#..#........#
|
||||||
|
....###.#...##..#.#..#....#....
|
||||||
|
...#.#.#................#......
|
||||||
|
.#.....#..#..........##..#....#
|
||||||
|
..........#..#......#.........#
|
||||||
|
.....#....#...#.#..##....#.#.#.
|
||||||
|
........#.##......###..........
|
||||||
|
##......#.#..#.....#..##.#.....
|
||||||
|
.#.......#..#....##.....##.....
|
||||||
|
.....##....#...................
|
||||||
|
##......#....##........#.....#.
|
||||||
|
..##...#...........##........#.
|
||||||
|
...#....#..##.#....#......##...
|
||||||
|
#....#...##....#..........#....
|
||||||
|
......##....#...............#..
|
||||||
|
...#.#.#...#...#...#...........
|
||||||
|
....#..#...#.#....#.#......#...
|
||||||
|
.......#...#...............#...
|
||||||
|
.##..#....#...#....#.#........#
|
||||||
|
.....#..##............#......#.
|
||||||
|
...##...#.....#..........#.#..#
|
||||||
|
..#..##.............#....#.....
|
||||||
|
.....#.#.....#.........#......#
|
||||||
|
........#..........#.#.#...#..#
|
||||||
|
#........#.#...................
|
||||||
|
......#......##..............#.
|
||||||
|
......#..#.#.....#...#.#...#...
|
||||||
|
.#..##.....#...##.......#......
|
||||||
|
#.......#....#..##....#..#.#...
|
||||||
|
#..#..#....#...........#.##....
|
||||||
|
..##....#....##.....#...#...##.
|
||||||
|
.#.......#.......#....#.......#
|
||||||
|
.#..#..#...#...#...............
|
||||||
|
.#..............#.....#........
|
||||||
|
..........##...#....#.#......##
|
||||||
|
..........#..........#.......#.
|
||||||
|
..#..##....##...#.......#......
|
||||||
|
.#......#.#........##.#........
|
||||||
|
...#......#..#....#...#....#...
|
||||||
|
...............#....#..#.##...#
|
||||||
|
....#.......................#..
|
||||||
|
#....##.#......#....#..........
|
||||||
|
.......#.#......#........#..##.
|
||||||
|
..#.....#...#...........##..#..
|
||||||
|
#........#.#....#............#.
|
||||||
|
.........##..................#.
|
||||||
|
........#...#..#...#......#...#
|
||||||
|
...#.......#...####.#...#......
|
||||||
|
....#..###......###..#.........
|
||||||
|
.....#...........#......#......
|
||||||
|
.#.....#......#.....#.....##.##
|
||||||
|
.#.#...##..........#........#.#
|
||||||
|
..#....#.....##...............#
|
||||||
|
.....##.....#...##..#..........
|
||||||
|
.#......##.......#..##.##.#...#
|
||||||
|
.#..#...#.##.....#.#...........
|
||||||
|
.........#....##...#.....##....
|
||||||
|
#..........#.............#..#.#
|
||||||
|
...........#........#.#...#....
|
||||||
|
........#..###...#...........#.
|
||||||
|
#.........#...#....#..##.##....
|
||||||
|
........#....##.......#.#....#.
|
||||||
|
..........#..............#.....
|
||||||
|
....##...#...##..........#.....
|
||||||
|
...#..##.#...###..#............
|
||||||
|
...##..#####....#.............#
|
||||||
|
.#..#.......##.......#........#
|
||||||
|
....##..........#.......#.#....
|
||||||
|
......#.........####.......#...
|
||||||
|
...............#......#..#.....
|
||||||
|
...#...##...#.#.#.....##.#.#...
|
||||||
|
..#....#..#..............#....#
|
||||||
|
#..............#............#..
|
||||||
|
.#.#..#....#.....#.#.#...#.....
|
||||||
|
......#......#..#..#.....#.....
|
||||||
|
.#.#..#.##.#........#..........
|
||||||
|
..##.#......#..#.......#.......
|
||||||
|
.##...##....#..#.#.........#.##
|
||||||
|
.........#........#.#..###....#
|
||||||
|
.....#...............#.........
|
||||||
|
......##..........#.....#......
|
||||||
|
.#.....#.#.#..#.#.....#..#.####
|
||||||
|
.......###.##......#.....#.#..#
|
||||||
|
..#.....#....#.#.##......#....#
|
||||||
|
.....##..#................#..##
|
||||||
|
.#......#.....#..#.....#..#####
|
||||||
|
.........#.#.......#..##...#...
|
||||||
|
.#.#..#.......##.....#....#....
|
||||||
|
.....#...###.#...#......#....#.
|
||||||
|
.#....#....#...#..#.#........#.
|
||||||
|
......##........##.#...#..#..#.
|
||||||
|
.##.##.###..#.....#........###.
|
||||||
|
.....#..#.#.......#..#.#.......
|
||||||
|
##.#.#..............#..##......
|
||||||
|
....#.........#.......#.#......
|
||||||
|
.....#..#.....#...#.#....#.#...
|
||||||
|
...#..#.#.#..................#.
|
||||||
|
........##.#.###...............
|
||||||
|
..#...#.#.......#......#.......
|
||||||
|
.......#.##....#...#....#......
|
||||||
|
......#.#.............#........
|
||||||
|
........#......#........##.##..
|
||||||
|
.....#...#......##.............
|
||||||
|
...#.#..#.....#.#...#..........
|
||||||
|
.#.#..#.....#............#.....
|
||||||
|
.#.#..#.#.##.#...#.##..##...#..
|
||||||
|
.........##........#.##..#.....
|
||||||
|
##.#.#......###..#.##.#........
|
||||||
|
.##...#..#...#.#..#....##.....#
|
||||||
|
#......#..........#.#...#.....#
|
||||||
|
..........#......#...#.......#.
|
||||||
|
.............#..........#......
|
||||||
|
#.#....#.......##..#.....#.#...
|
||||||
|
##......#..#......#.#..#.#....#
|
||||||
|
..#.#..#.....#.#......#....#..#
|
||||||
|
...#......#......##.....#..#.#.
|
||||||
|
....#......#.....#....#.#.#..#.
|
||||||
|
.....#..#..#.....#...........##
|
||||||
|
....#.....#...#........##.#.#.#
|
||||||
|
..#......#.......#........#....
|
||||||
|
#.......##..##......#...####..#
|
||||||
|
#..........#......#.#..#..#....
|
||||||
|
.................##............
|
||||||
|
...#..#..#.#.....#.##.#.....#.#
|
||||||
|
...#....###....................
|
||||||
|
....#.......#..#.#.............
|
||||||
|
#......#................#......
|
||||||
|
..........#........#..#........
|
||||||
|
.....#......##..#......#..###..
|
||||||
|
...#....#.......#..............
|
||||||
|
.#....#.#.#........#.....#...#.
|
||||||
|
.......#.....##.#.....#....#...
|
||||||
|
.........#.#.........##..#...#.
|
||||||
|
......#......#....#.....##.#.#.
|
||||||
|
####...#.........#.....#......#
|
||||||
|
...#.#..#..#.............#.....
|
||||||
|
......#.........#....#.#..##..#
|
||||||
|
.........#.....#.#..##..##..#..
|
||||||
|
.#......##.............#.......
|
||||||
|
....#...#......#...#.....#.#.##
|
||||||
|
......#..##....#..#.....#......
|
||||||
|
......#..............#....##...
|
||||||
|
.........#.###..........#.##...
|
||||||
|
#....#..........#..#.......#...
|
||||||
|
...........#...#.....#.......#.
|
||||||
|
..#..#........#................
|
||||||
|
...###.........#...............
|
||||||
|
.....#.##...#.................#
|
||||||
|
..#.#..#...###......#........#.
|
||||||
|
#......#......#.#.............#
|
||||||
|
.........#.#.....#..#........#.
|
||||||
|
........#..#......#......##....
|
||||||
|
.....#......#...#.....##...#.##
|
||||||
|
.##...#..#....##..........###..
|
||||||
|
.......#............#........##
|
||||||
|
.##.....#.......#...#..........
|
||||||
|
..###..........#.............##
|
||||||
|
#....#....#.#....#............#
|
||||||
|
#...#......................#...
|
||||||
|
....#..#..#..#.......###....#..
|
||||||
|
#..###.#..#.....#.............#
|
||||||
|
..........#.##.....#.........##
|
||||||
|
...#.............#....#....##..
|
||||||
|
#........................#..#..
|
||||||
|
........#...#.....#.....#..##..
|
||||||
|
#........#......#....#..#....#.
|
||||||
|
.....#.#.#....#.#..#....#......
|
||||||
|
.....#....#....................
|
||||||
|
.........#..#..#....#......#...
|
||||||
|
..........#.#.#.......#........
|
||||||
|
.......#.#.....#..#.....##.....
|
||||||
|
.....#....#.#.....#.......#..#.
|
||||||
|
.#..###.......#......#..#..#...
|
||||||
|
..##.#.....#.........##.#......
|
||||||
|
.....#.......###.......##......
|
||||||
|
#...#.......##.#.#......#.....#
|
||||||
|
.##........##.#...#...#........
|
||||||
|
....#.......#....#..#.......#..
|
||||||
|
.#..#.......#..####..##........
|
||||||
|
..#..#..#..#..#..#.............
|
||||||
|
...#......#...#...#.#......##.#
|
||||||
|
........#.#..#.#.#......#...#..
|
||||||
|
#.......#..##.......##........#
|
||||||
|
..##...#...............#.#....#
|
||||||
|
.####........##..........#..#..
|
||||||
|
..#........#...##...#........#.
|
||||||
|
.#.#..........#...#...#........
|
||||||
|
....###..........#....#........
|
||||||
|
.#.#.#.###.#.##..#.#........#..
|
||||||
|
..........#....##.#..##........
|
||||||
|
.......#..#..##.......#........
|
||||||
|
..#........#....#..####.#..#...
|
||||||
|
....#.......#..##..#..........#
|
||||||
|
.....#...........#....#....#...
|
||||||
|
.#.##..#......##.........#.#...
|
||||||
|
...#......##..##......#.....#..
|
||||||
|
#........#..........#.#...#....
|
||||||
|
.#.#........###........#..#....
|
||||||
|
....#####.................##...
|
||||||
|
.........##...#......#.........
|
||||||
|
.......#....#....#.#....#...#..
|
||||||
|
......#................#...#.#.
|
||||||
|
....#.....#.....#.#.....#.....#
|
||||||
|
#.........#..#........#.....#..
|
||||||
|
....#...........#.....#.#......
|
||||||
|
##..#....................#.#...
|
||||||
|
#.#.##....#.....##....#.......#
|
||||||
|
..#..#....###.......#..##......
|
||||||
|
......##.....#.##...#....#..#..
|
||||||
|
........#..#.#..#..#.#.........
|
||||||
|
#...#.....##..........##.......
|
||||||
|
....#.....#...#.###.......#....
|
||||||
|
..........#..#...#........##..#
|
||||||
|
##..#...#.#.####.#..#..#...#...
|
||||||
|
................#......#..#....
|
||||||
|
.......#...###...#........#....
|
||||||
|
....#..##..#.#......#...#.#..##
|
||||||
|
.##......#...........#.......##
|
||||||
|
....#.#...#..#.#.......##......
|
||||||
|
....#..##..#.....#........##...
|
||||||
|
...#...#..#.#.#....#.........#.
|
||||||
|
#....##.#....#..##.............
|
||||||
|
.#......##......#.#.##.......#.
|
||||||
|
.......#...#....#.##......#....
|
||||||
|
..##..........#.....#.#......#.
|
||||||
|
#..##.....#..........##..#.#...
|
||||||
|
....#.#.......#.#.....#.....#..
|
||||||
|
##.....#..#.....##...#.....#..#
|
||||||
|
...#.#..#...#..............#...
|
||||||
|
...............#..#............
|
||||||
|
.#.......#......#........##....
|
||||||
|
..#......#..##..####.....#...#.
|
||||||
|
.#.##.#.#..#..##..##...........
|
||||||
|
...##.............#.....#..#...
|
||||||
|
.##.....#..#.#......##........#
|
||||||
|
##....#.............#...#......
|
||||||
|
......#.....###...........##...
|
||||||
|
.#.#...#.............##..#..###
|
||||||
|
..#.##.##...#.....#...........#
|
||||||
|
.....#.....##...#...#........#.
|
||||||
|
........#..##.......##.....#...
|
||||||
|
.#........####.......#.#...#...
|
||||||
|
...#..........#......##........
|
||||||
|
.......#......#..##..#...#.....
|
||||||
|
..#...........#.#.#..#.#.#.....
|
||||||
|
#..........#....#....###.#.....
|
||||||
|
....#.................#...##...
|
||||||
|
#....#.###......#..#.....#...##
|
||||||
|
.#.......##.....###.....#...#..
|
||||||
|
....##............#...........#
|
||||||
|
...#.#.#.........#...#..#..#..#
|
||||||
|
.....#..###.................#..
|
||||||
|
.#.....#.....#....###.#..#...#.
|
||||||
|
................#...#..........
|
||||||
|
..#....#..##....#.##........#..
|
||||||
|
....##....#...........#..#.....
|
||||||
|
...##......###.......#...#.....
|
||||||
|
.......##............#......#.#
|
||||||
|
#####.....#..#.###..#.#........
|
||||||
|
#.##.##..#.......#....#........
|
||||||
|
....###..#.#.#......###.#......
|
||||||
|
....#....#.....##.#..#....#...#
|
||||||
|
....#.....#.#...##.##.#.#....#.
|
||||||
|
.........#.#.###.#.....#.......
|
||||||
|
.#....#.......#..##...#....#...
|
||||||
|
...####...##.#.....#...........
|
||||||
|
#.....#.....#..........##..#...
|
||||||
|
................#.#.#......#...
|
||||||
|
.#...#.......#..#............#.
|
||||||
|
.##.#.......#..#....#.....#....
|
||||||
|
.#...#..#.....#..............#.
|
||||||
11
inputs/day3_test.txt
Normal file
11
inputs/day3_test.txt
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
..##.......
|
||||||
|
#...#...#..
|
||||||
|
.#....#..#.
|
||||||
|
..#.#...#.#
|
||||||
|
.#...##..#.
|
||||||
|
..#.##.....
|
||||||
|
.#.#.#....#
|
||||||
|
.#........#
|
||||||
|
#.##...#...
|
||||||
|
#...##....#
|
||||||
|
.#..#...#.#
|
||||||
100
src/bin/tobaggan.rs
Normal file
100
src/bin/tobaggan.rs
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
use advent2020::errors::{MapParseError, TopLevelError};
|
||||||
|
use advent2020::map::Map;
|
||||||
|
use std::convert::TryFrom;
|
||||||
|
use std::env;
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
enum Square {
|
||||||
|
Empty,
|
||||||
|
Tree,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TryFrom<char> for Square {
|
||||||
|
type Error = MapParseError;
|
||||||
|
|
||||||
|
fn try_from(c: char) -> Result<Self, Self::Error> {
|
||||||
|
match c {
|
||||||
|
'.' => Ok(Square::Empty),
|
||||||
|
'#' => Ok(Square::Tree),
|
||||||
|
_ => Err(MapParseError::UnexpectedCharacter(c)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Encounters {
|
||||||
|
trees_encountered: usize,
|
||||||
|
clear_spots_encountered: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn trail_for_slope(map: &Map<Square>, run: usize, fall: usize) -> Encounters {
|
||||||
|
let mut current_x = 0;
|
||||||
|
let mut current_y = 0;
|
||||||
|
let mut encounters = Encounters {
|
||||||
|
trees_encountered: 0,
|
||||||
|
clear_spots_encountered: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
loop {
|
||||||
|
match map.at(current_x, current_y) {
|
||||||
|
None => break,
|
||||||
|
Some(Square::Empty) => encounters.clear_spots_encountered += 1,
|
||||||
|
Some(Square::Tree) => encounters.trees_encountered += 1,
|
||||||
|
}
|
||||||
|
|
||||||
|
current_x += run;
|
||||||
|
current_y += fall;
|
||||||
|
}
|
||||||
|
|
||||||
|
encounters
|
||||||
|
}
|
||||||
|
|
||||||
|
fn real_main() -> Result<(), TopLevelError> {
|
||||||
|
let mut maybe_map = None;
|
||||||
|
|
||||||
|
for argument in env::args().skip(1) {
|
||||||
|
let fname = argument.clone();
|
||||||
|
let contents = fs::read_to_string(argument)?;
|
||||||
|
match Map::<Square>::try_from(contents.as_str()) {
|
||||||
|
Err(e) => eprintln!("Skipping file {}: Parse error: {}", fname, e),
|
||||||
|
Ok(v) => {
|
||||||
|
maybe_map = Some(v);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let map = match maybe_map {
|
||||||
|
None => return Err(TopLevelError::NoInputFound),
|
||||||
|
Some(x) => x,
|
||||||
|
};
|
||||||
|
|
||||||
|
let initial = trail_for_slope(&map, 3, 1);
|
||||||
|
println!(
|
||||||
|
"For the initial slope, encountered {} trees and {} open spaces",
|
||||||
|
initial.trees_encountered, initial.clear_spots_encountered
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut product = 1;
|
||||||
|
let slopes = [(1, 1), (3, 1), (5, 1), (7, 1), (1, 2)];
|
||||||
|
|
||||||
|
for (run, fall) in slopes.iter() {
|
||||||
|
let encounters = trail_for_slope(&map, *run, *fall);
|
||||||
|
println!(
|
||||||
|
"For slope ({},{}), encountered {} trees and {} open spaces",
|
||||||
|
run, fall, encounters.trees_encountered, encounters.clear_spots_encountered
|
||||||
|
);
|
||||||
|
product *= encounters.trees_encountered;
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("The product of the trees encountered is {}", product);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
match real_main() {
|
||||||
|
Err(e) => eprintln!("ERROR: {}", e),
|
||||||
|
Ok(_) => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,6 +15,7 @@ macro_rules! convert_error {
|
|||||||
|
|
||||||
pub enum TopLevelError {
|
pub enum TopLevelError {
|
||||||
IOError(io::Error),
|
IOError(io::Error),
|
||||||
|
NoInputFound,
|
||||||
NoSolutionFound,
|
NoSolutionFound,
|
||||||
UnknownError,
|
UnknownError,
|
||||||
}
|
}
|
||||||
@@ -23,6 +24,7 @@ impl fmt::Display for TopLevelError {
|
|||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
match self {
|
match self {
|
||||||
TopLevelError::IOError(e) => write!(f, "IO error: {}", e),
|
TopLevelError::IOError(e) => write!(f, "IO error: {}", e),
|
||||||
|
TopLevelError::NoInputFound => write!(f, "No valid inputs found"),
|
||||||
TopLevelError::NoSolutionFound => write!(f, "No solution found."),
|
TopLevelError::NoSolutionFound => write!(f, "No solution found."),
|
||||||
TopLevelError::UnknownError => {
|
TopLevelError::UnknownError => {
|
||||||
write!(f, "Unknown error occurred; this shouldn't be possible.")
|
write!(f, "Unknown error occurred; this shouldn't be possible.")
|
||||||
@@ -51,3 +53,19 @@ impl fmt::Display for PasswordParseError {
|
|||||||
|
|
||||||
convert_error!(ParseIntError, PasswordParseError, StringToIntError);
|
convert_error!(ParseIntError, PasswordParseError, StringToIntError);
|
||||||
convert_error!(nom::Err<()>, PasswordParseError, NomError);
|
convert_error!(nom::Err<()>, PasswordParseError, NomError);
|
||||||
|
|
||||||
|
pub enum MapParseError {
|
||||||
|
UnexpectedCharacter(char),
|
||||||
|
UnevenLines(usize),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for MapParseError {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
match self {
|
||||||
|
MapParseError::UnevenLines(l) => write!(f, "Map has uneven width at line {}", l),
|
||||||
|
MapParseError::UnexpectedCharacter(c) => {
|
||||||
|
write!(f, "Unexpected character parsing map: {}", c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1 +1,2 @@
|
|||||||
pub mod errors;
|
pub mod errors;
|
||||||
|
pub mod map;
|
||||||
|
|||||||
55
src/map.rs
Normal file
55
src/map.rs
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
use crate::errors::MapParseError;
|
||||||
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
|
pub struct Map<A: Clone> {
|
||||||
|
width: usize,
|
||||||
|
_height: usize,
|
||||||
|
data: Vec<Vec<A>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, E, X> TryFrom<&'a str> for Map<X>
|
||||||
|
where
|
||||||
|
X: Clone + TryFrom<char, Error = E>,
|
||||||
|
E: From<MapParseError>,
|
||||||
|
{
|
||||||
|
type Error = E;
|
||||||
|
|
||||||
|
fn try_from(s: &str) -> Result<Map<X>, E> {
|
||||||
|
let mut width = 0;
|
||||||
|
let mut _height = 0;
|
||||||
|
let mut data = Vec::new();
|
||||||
|
|
||||||
|
for line in s.lines() {
|
||||||
|
let mut current_line = Vec::with_capacity(width);
|
||||||
|
|
||||||
|
for char in line.chars() {
|
||||||
|
let item = X::try_from(char)?;
|
||||||
|
current_line.push(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
_height += 1;
|
||||||
|
if width == 0 {
|
||||||
|
width = current_line.len();
|
||||||
|
} else {
|
||||||
|
if width != current_line.len() {
|
||||||
|
return Err(E::from(MapParseError::UnevenLines(_height)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data.push(current_line);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(Map {
|
||||||
|
width,
|
||||||
|
_height,
|
||||||
|
data,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<X: Clone> Map<X> {
|
||||||
|
pub fn at(&self, x: usize, y: usize) -> Option<X> {
|
||||||
|
let row = self.data.get(y)?;
|
||||||
|
let wrapped_x = x % self.width;
|
||||||
|
Some(row[wrapped_x].clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user