From 19dd107e45fcaa2b4c1cbeefb6bd79097f920724 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 12 Dec 2021 15:25:19 +0100 Subject: [PATCH] Added day 12 --- inputs/day12.txt | 24 +++++++++++++ inputs/sample.txt | 17 ++++----- src/bin/day12.rs | 89 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+), 10 deletions(-) create mode 100644 inputs/day12.txt create mode 100644 src/bin/day12.rs diff --git a/inputs/day12.txt b/inputs/day12.txt new file mode 100644 index 0000000..bc8429c --- /dev/null +++ b/inputs/day12.txt @@ -0,0 +1,24 @@ +pg-CH +pg-yd +yd-start +fe-hv +bi-CH +CH-yd +end-bi +fe-RY +ng-CH +fe-CH +ng-pg +hv-FL +FL-fe +hv-pg +bi-hv +CH-end +hv-ng +yd-ng +pg-fe +start-ng +end-FL +fe-bi +FL-ks +pg-start diff --git a/inputs/sample.txt b/inputs/sample.txt index 03743f6..6fd8c41 100644 --- a/inputs/sample.txt +++ b/inputs/sample.txt @@ -1,10 +1,7 @@ -5483143223 -2745854711 -5264556173 -6141336146 -6357385478 -4167524645 -2176841721 -6882881134 -4846848554 -5283751526 +start-A +start-b +A-c +A-b +b-d +A-end +b-end diff --git a/src/bin/day12.rs b/src/bin/day12.rs new file mode 100644 index 0000000..0eb36ea --- /dev/null +++ b/src/bin/day12.rs @@ -0,0 +1,89 @@ +use std::collections::HashMap; +use std::collections::HashSet; +use std::error::Error; +use std::fs::File; +use std::io::{self, BufRead}; +use std::vec::Vec; + +fn enumerate_ways( + start: &str, + end: &str, + vertices: &HashMap>, + mut path: Vec, + mut allow_twice: bool, +) -> u64 { + if start == end { + return 1; + } + + if start.chars().all(|c| c.is_lowercase()) { + if path.iter().filter(|n| n == &&start).count() > 0 { + if !allow_twice { + return 0; + } else { + allow_twice = false; + } + } + } + + path.push(start.to_string()); + + let mut ways = 0; + + for neighbor in vertices[start].iter() { + if neighbor != "start" { + ways += enumerate_ways(neighbor, end, vertices, path.clone(), allow_twice); + } + } + + ways +} + +fn main() -> Result<(), Box> { + let file = File::open("inputs/day12.txt")?; + let links: Vec<(String, String)> = io::BufReader::new(file) + .lines() + .map(|l| l.unwrap()) + .map(|l| { + let mut ends = l.split('-'); + ( + ends.next().unwrap().to_string(), + ends.next().unwrap().to_string(), + ) + }) + .collect(); + + let mut vertices: HashMap> = HashMap::new(); + for link in links.iter() { + if vertices.contains_key(&link.0) { + let mut set = vertices[&link.0].clone(); + set.insert(link.1.clone()); + vertices.insert(link.0.clone(), set); + } else { + let mut set: HashSet = HashSet::new(); + set.insert(link.1.clone()); + vertices.insert(link.0.clone(), set); + } + + if vertices.contains_key(&link.1) { + let mut set = vertices[&link.1].clone(); + set.insert(link.0.clone()); + vertices.insert(link.1.clone(), set); + } else { + let mut set: HashSet = HashSet::new(); + set.insert(link.0.clone()); + vertices.insert(link.1.clone(), set); + } + } + + let ways1 = enumerate_ways("start", "end", &vertices, Vec::new(), false); + + println!("Answer1: {}", ways1); + println!(""); + + let ways2 = enumerate_ways("start", "end", &vertices, Vec::new(), true); + + println!("Answer2: {}", ways2); + + Ok(()) +}