D18 wip
This commit is contained in:
parent
f14828637f
commit
4a28ac8e8e
|
@ -0,0 +1,11 @@
|
|||
[package]
|
||||
name = "day18"
|
||||
version = "0.1.0"
|
||||
authors = ["kageru <kageru@encode.moe>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
grid = { path = "../grid" }
|
||||
lazy_static = "1.3.0"
|
|
@ -0,0 +1,81 @@
|
|||
#################################################################################
|
||||
#.........#...#....h....Q.......#.......#.#...........#...#...#.................#
|
||||
#.###.###.#.#.###.#############.#.###T#.#.#.#####.###.#.#.#.#.#####.###########.#
|
||||
#..a#.#.#...#.#...#.#...#.....#.#.#.#.#.#.......#.#...#.#.#.#.....#.#.....#.....#
|
||||
#####.#.#####.#.###.#.#.#.#.###.#.#.#.###.#######.#.#####.#.#####.#.#.###.#.###.#
|
||||
#...#.#.......#.#.....#...#.#...#...#...#.#...#...#.#.....#.#.#...#...#...#.#...#
|
||||
#.#.#.#.#######.#.#########.#.###.#####.###.#.#.###.#.#####.#.#.#######L###.#.###
|
||||
#.#...#.#.......#.#.......#...#.#.#.....#...#...#.....#.......#.....#.....#.#...#
|
||||
#.#####.#.#######.#####.#######.#.#.###.#.#.###########.#######.###.#####.#.###.#
|
||||
#...#.#.#...#.........#...#.....#.#...#.#.#.#...#.......#.....#...#...#...#.#...#
|
||||
#.#.#.#.###.#########.###.#.#.###.###.#.#.#.#.#.#.#######.###.#######.#.###.#####
|
||||
#.#.#.#.#...#...#...#...#...#.......#.#.#.#.#.#...#.#.....#.#.......#g#.#.#.....#
|
||||
###.#.#.#.###.#.#.#.###.###########.#.###.###.#####.#.#####.#######.#.#.#.#####.#
|
||||
#...#.....#...#z..#.#.#...........#.#...#.#...#.....#.#.........#...#.#.....#...#
|
||||
#.#########.#######.#.#.#########.#.###.#.#.#####.#.#.#####.###.#.###.#####.#.###
|
||||
#...#.......#.#...#.#...#...#.....#.#...#.#...#...#.#.#...#...#.......#...Z.#...#
|
||||
#.#.#.#######.#.#.#.#####.#.###.#####.#.#.###.#.###.#.#.#.#####################.#
|
||||
#.#.#...#.#.....#.#....j..#...#.....#.#.#...#...#.#.#...#.#.........#.........#.#
|
||||
###.###.#.#.#####.###########.#####.#.#.###.#####.#.#####.#.#####.#.#.#######.#.#
|
||||
#...#...#...#.....#.........#.....#...#.#.......#.#...#.#...#...#.#.#.#.......#.#
|
||||
#K###.#######.###.#.#############.#####.#.#####.#.###.#.#####.#.###.#.#.#######.#
|
||||
#.....#.......#.....#.#.......#..e#...#.#...#.......#.#.....#.#.....#.#.#.......#
|
||||
#########.#.#########.#.#####.#.###.###.#.#.#######.#.#.###.#########.#.###.#####
|
||||
#....n....#.#...#...#...#.....#.#.....#.#.#.....#.#.#.#.#...#.........#.....#...#
|
||||
#.###.#####.#.#.#.#.#####.#####.#.###.#.#.#####.#.#.#.#.#.#####.#######.#####.#.#
|
||||
#.#...#.....#.#...#d....#.#.....#...#...#.#...#.#...#...#.....#.....#...#.....#.#
|
||||
###.###.#####.#####.###.#.#.#.#####.#####.#.#.#.#.###########.#.###.#####.#####.#
|
||||
#...#.......#.#.....#.#.#.#.#.#.#...#...#...#.#.#...........#.#...#...#.......#.#
|
||||
#.###########.#.#####.#.#.#.#.#.#.#####.#######.#############.###.###.#.#######.#
|
||||
#.....#.......#.....#...#.#.#.#.#.....#.#.....#.......#.......#.....#...#...#...#
|
||||
#.###.#.###########.#.###.###.#.#####.#.#.###.#######.#.#################.#.#.#.#
|
||||
#...#...#...#.....#.#.#.#u....#...#...#.#.#..v........#.#...........#.....#r..#.#
|
||||
###.#####.#.#.#.###.#.#.#######.#.#.###.#.###.#########.#######.###.#.#########.#
|
||||
#...#.....#...#...#.#.......#...#.#.....#...#.#...#.....#.......#.D.#.......#...#
|
||||
#.###############.#.#######.#.###.#####.#.#.###.#.#.#####.#######.###.#####.#####
|
||||
#.......#.......#.#.#.........#...#.....#.#.....#.#.#...#...M.#.#.#.......#.....#
|
||||
#######.#.#####.#.#.#.#############.#####.#######.#.#.#.#####.#.#.#####.#######.#
|
||||
#.#.....#.....#...#m#.#.....#...#...#...#.#.....#.#...#.#.....#.#.....#.#.......#
|
||||
#.#.#########.###.#.###.###.#.#.#.#####.#.###.#.#.#####.#.#####.#####.###.#####.#
|
||||
#.............#...#.V.....#...#...............#.#.........#...............#.....#
|
||||
#######################################.@.#######################################
|
||||
#.....................#.............................#...#.......#.....#.#.......#
|
||||
#.#####.#.###########.###.###.#########.#.#########.###.#.###.#.###.#.#.#.#####.#
|
||||
#...#.#.#.#...#.#...#...#.#...#.......#.#.#...#.....#...#.#.#.#.....#...#.....#.#
|
||||
###.#.#.###.#.#.#.#.###.###.###.###.###.#.#.#.#.#####.###.#.#.#############.###.#
|
||||
#.....#.....#.#...#.........#.....#.....#.#.#...#.......#...#...#...#.......#...#
|
||||
#.#########.#.#.#########.#######.#######.###.###.#####.###.###.#.#.#.#######.#.#
|
||||
#.#.......#.#.#...#...#...#...#...#...#.#...#...#.#...#.....#.#...#.#...#....k#.#
|
||||
#.#.#####.###.#####.#.#####.#.#.###.#.#.###.###.#.#.#.#######.#####.#.###.#####.#
|
||||
#.#.#...#.#...#...O.#...#...#.#.....#.#.#...#...#...#.......#....o#...#...#.....#
|
||||
#.#.#.#.#.#.###.#######.#B###.#######.#.#.###.#############.#####.#####.###.#####
|
||||
#.#...#.#.#...#...#...#.#.#.#.#.....#.#.#.#...........#.....#...#.#...#.#...#...#
|
||||
#####.#.#.###.###.#.#.#.#.#.#.#####.#.#.#.###########.#####.#.#.#.#.#.#.###.###.#
|
||||
#...#.#.#.....#.#.#.#.#...#.#.#...#...#.#.#...#.......#...#...#.#...#.#...#...#.#
|
||||
#.#.###.#####.#.#.#.#.#####.#.#.#.#.###.#.#.#.#####.###.#.#####U###.#.###.###.#.#
|
||||
#.#.....#...#.#.#c..#...#.#...#.#.#...#.#...#.#...#.#...#...#.....#.#...#.#...#.#
|
||||
#.#######.###.#.#######C#.#.###E#.###.#.#####.#.#.#.###.###.#####.###.#.#.#.###.#
|
||||
#.#...#...#...#...#...#.#.#.#...#.#.....#.....#.#.#.....#.......#.....#.#.#...#.#
|
||||
#.#.#.###.#.###.#.#.#.#.#.#.###.#.#######.###.#.#.#######.#####.#####.###.###.#.#
|
||||
#...#...#.......#...#.#.#.....#.#.#.....#...#.#.#...#...#.#...#.#...#.#...#.#...#
|
||||
#.#####.###############.#####.#.#.#.###J#.#.###.###.###.#.#.#.#.#.#.#.#.###.###.#
|
||||
#.#...#...#.......I.#.#p..#.....#...#.#.#.#...#.#.#...#...#.#.#.#.#..b#.#.......#
|
||||
#.#.#.###.#.#######.#.#.#.###########.#.#.###.#.#.###.#####.###.#.#####.#.#####.#
|
||||
#...#.#...#.#.......#.#.#.....#.......#.#.#...#.#...#.......#.#t#.#...#.#.#...#.#
|
||||
#.#####.###.#.#####.#.###.###.###.###.#.###.###.#.###########.#.###.#.#.###.#.#.#
|
||||
#.#.....#...#y..#...#...#...#.P.#...#...#...#...#.#.....#.....#.....#.#...#.#.#.#
|
||||
#.#.#####.#####.#.#####W###.###.###.#####.###.###.#.#.###.#.#.#######.#.#.#.#.###
|
||||
#.#.....#i..#.#.#.#.....#...#...#.#...#.#.....#.....#...#.#.#.#.....#.#.#...#...#
|
||||
#R#####.###F#.#.###.#########.###.###.#.###############.#.#.#.#N#.###.#########.#
|
||||
#.#...#...#...#...#.#..s......#...#...#.#...............#.#.#.#.#.....#...#.....#
|
||||
###.#.###.###.###.#.#####.#######.#.###.#.#############.#.#.###.#######.#.#.###.#
|
||||
#...#.#.....#.#.#.#.#.....#.......#.#...#.....#.......#.#.#.#...#...#...#...#...#
|
||||
#.###.#.###.#.#.#Y#.#.#####.#.###.#.#.#.#.###.#######.#.#.#.#.###.#.#.#######.###
|
||||
#.#.#.#.#...#.#.#..w#...#.#.#...#.#...#.#.#.#.......#...#.#...#...#.#...#...#...#
|
||||
#.#.#.#.#####.#.#######.#A#.###.#######.#.#.#######.#####.#####.###.###H#.#####.#
|
||||
#.#.....#...#......f..S.#.#.#.#.......#.#...#...#.#.#...#...#...#.#.#...#.....#.#
|
||||
#.#######.#.#############.#.#.#######.#.###.#.#.#.#.#.#.###.#.###.#.#.###.#.#.#.#
|
||||
#...#..x#.#.......#.....#...#...#..l..#.#.#.#.#.#.#...#...#.#.#...#...#.#.#.#.#.#
|
||||
#G#.#.#.#.#####.###.#.###.#####.#.#####.#.#.#.#.#.#######.#.#.#.#.#####.#.#.###.#
|
||||
#.#...#.......#.....#...........#.......#.....#.........#..q..#.#.........#...X.#
|
||||
#################################################################################
|
|
@ -0,0 +1,11 @@
|
|||
priority:
|
||||
(closest) actually dead end with keys -> (closest) key for reachable door
|
||||
alphabetical as tiebreaker
|
||||
|
||||
for scan: set of visited positions
|
||||
|
||||
tasks:
|
||||
//scan entire map -> create dependencies (Map<Key, Set<Key>>)
|
||||
dead end detection -> also done?
|
||||
//implement pathfinding (maybe dijkstra-like?)
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
use grid::*;
|
||||
use std::char;
|
||||
use std::collections::{HashMap,HashSet};
|
||||
use std::io::{self, BufRead};
|
||||
#[macro_use]
|
||||
extern crate lazy_static;
|
||||
|
||||
lazy_static! {
|
||||
static ref MAP: HashMap<Position2D, char> = io::stdin()
|
||||
.lock()
|
||||
.lines()
|
||||
.enumerate()
|
||||
.flat_map(move |(y, l)| l
|
||||
.unwrap()
|
||||
.to_owned()
|
||||
.chars()
|
||||
.enumerate()
|
||||
.map(move |(x, c)| ((x, y).into(), c))
|
||||
.collect::<Vec<_>>())
|
||||
.collect();
|
||||
}
|
||||
|
||||
fn visit_neighbors(position: Position2D, steps: usize, distances: &mut HashMap<Position2D, usize>, dependencies: &mut HashMap<char, HashSet<char>>, mut doors: HashSet<char>) {
|
||||
let mut unvisited = Vec::new();
|
||||
// TODO: fix ownership and make this a single filter().inspect().for_each()
|
||||
for (_, p) in &position.neighbors() {
|
||||
match MAP.get(p) {
|
||||
Some(&'#') => (),
|
||||
Some(n) if n.is_alphanumeric() => {
|
||||
if n.is_lowercase() {
|
||||
dependencies.insert(*n, doors.clone());
|
||||
}
|
||||
if n.is_uppercase() {
|
||||
doors.insert(*n);
|
||||
}
|
||||
if distances.get(p).is_none() {
|
||||
unvisited.push(p.to_owned());
|
||||
}
|
||||
},
|
||||
_ => {
|
||||
if distances.get(p).is_none() {
|
||||
unvisited.push(p.to_owned());
|
||||
}
|
||||
},
|
||||
}
|
||||
if MAP.get(p) != Some(&'#') && distances.get(p).is_none() {
|
||||
unvisited.push(p.to_owned());
|
||||
}
|
||||
}
|
||||
/*
|
||||
unvisited.into_iter()
|
||||
.inspect(|p| { distances.insert(p.to_owned(), steps+1);})
|
||||
.for_each(|p| visit_neighbors(p.to_owned(), steps+1, distances));
|
||||
*/
|
||||
for p in &unvisited {
|
||||
distances.insert(p.to_owned(), steps+1);
|
||||
}
|
||||
for p in &unvisited {
|
||||
visit_neighbors(p.to_owned(), steps+1, distances, dependencies, doors.clone());
|
||||
}
|
||||
}
|
||||
|
||||
fn traverse(start: Position2D) -> (HashMap<Position2D, usize>, HashMap<char, HashSet<char>>) {
|
||||
let mut distances = HashMap::new();
|
||||
let mut dependencies = HashMap::new();
|
||||
distances.insert(start, 0usize);
|
||||
visit_neighbors(start, 0, &mut distances, &mut dependencies, HashSet::new());
|
||||
(distances, dependencies)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
//println!("{:?}", MAP.keys());
|
||||
println!("{}", draw_ascii(&MAP, ' '));
|
||||
let start = MAP.keys().find(|p| MAP.get(&p) == Some(&'@')).unwrap();
|
||||
let v = MAP.keys().find(|p| MAP.get(&p) == Some(&'v')).unwrap();
|
||||
println!("Start: {:?}", start);
|
||||
let (distances, dependencies) = traverse(start.to_owned());
|
||||
println!("{:?}", distances);
|
||||
println!("{:?}", distances.get(&v));
|
||||
println!("{:?}", distances.len());
|
||||
println!("{:?}", dependencies.get(&'m'));
|
||||
println!("{}", dependencies.len());
|
||||
}
|
Loading…
Reference in New Issue
Block a user