generated from janezicmatej/aoc-template
solution: day 25
This commit is contained in:
parent
00000420f1
commit
0000043002
|
@ -0,0 +1,13 @@
|
|||
jqt: rhn xhk nvd
|
||||
rsh: frs pzl lsr
|
||||
xhk: hfx
|
||||
cmg: qnr nvd lhk bvb
|
||||
rhn: xhk bvb hfx
|
||||
bvb: xhk hfx
|
||||
pzl: lsr hfx nvd
|
||||
qnr: nvd
|
||||
ntq: jqt hfx bvb xhk
|
||||
nvd: lhk
|
||||
lsr: lhk
|
||||
rzs: qnr cmg lsr rsh
|
||||
frs: qnr lhk lsr
|
|
@ -0,0 +1,80 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
fn build_graph(input: &str, skips: &[(&str, &str)]) -> Vec<Vec<usize>> {
|
||||
let mut nodes = Vec::new();
|
||||
let mut mapper = HashMap::new();
|
||||
|
||||
for (node, neighs) in input.lines().filter_map(|x| x.split_once(": ")) {
|
||||
if !mapper.contains_key(node) {
|
||||
mapper.insert(node, nodes.len());
|
||||
nodes.push(Vec::new());
|
||||
}
|
||||
|
||||
let index_a = mapper[node];
|
||||
|
||||
for n in neighs.split(' ') {
|
||||
if !mapper.contains_key(n) {
|
||||
mapper.insert(n, nodes.len());
|
||||
nodes.push(Vec::new());
|
||||
}
|
||||
|
||||
if skips.contains(&(node, n)) || skips.contains(&(n, node)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let index_b = mapper[n];
|
||||
nodes[index_a].push(index_b);
|
||||
nodes[index_b].push(index_a);
|
||||
}
|
||||
}
|
||||
|
||||
nodes
|
||||
}
|
||||
|
||||
pub fn part_one_wrapped(input: &str, skips: &[(&str, &str)]) -> Option<usize> {
|
||||
let nodes = build_graph(input, skips);
|
||||
|
||||
let mut visited = vec![false; nodes.len()];
|
||||
let mut stack = vec![0];
|
||||
|
||||
while let Some(node) = stack.pop() {
|
||||
if visited[node] {
|
||||
continue;
|
||||
}
|
||||
visited[node] = true;
|
||||
for n in nodes[node].iter().copied() {
|
||||
if !visited[n] {
|
||||
stack.push(n);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let counter = visited.iter().copied().filter(|&x| x).count();
|
||||
Some((nodes.len() - counter) * counter)
|
||||
}
|
||||
|
||||
pub fn part_one(input: &str) -> Option<usize> {
|
||||
// to figure out which nodes to skip
|
||||
// echo "graph A {\n$(cat data/inputs/25.txt)\n}" | \
|
||||
// sed 's/\(.*\): \(.*\)$/\1 -- {\2}/' | \
|
||||
// dot -Tsvg -Kneato > graph.svg
|
||||
let skips = [("sfm", "vmt"), ("vph", "mfc"), ("fql", "rmg")];
|
||||
part_one_wrapped(input, &skips)
|
||||
}
|
||||
|
||||
pub fn part_two(_input: &str) -> Option<String> {
|
||||
Some("Happy chrismas!".into())
|
||||
}
|
||||
|
||||
aoc::solution!(25);
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
#[test]
|
||||
fn test_part_one() {
|
||||
let skips = [("pzl", "hfx"), ("bvb", "cmg"), ("nvd", "jqt")];
|
||||
let input = aoc::template::read_file("examples", 25);
|
||||
assert_eq!(part_one_wrapped(&input, &skips), Some(54));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue