Day 8 puzzle solutions
This commit is contained in:
parent
8c7567b21b
commit
7817b74d35
37
src/08part1.rs
Normal file
37
src/08part1.rs
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
use std::{fs, collections::HashMap};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Node {
|
||||||
|
left: String,
|
||||||
|
right: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let file_path = "input/08input.txt";
|
||||||
|
let contents = fs::read_to_string(file_path).expect("should read file");
|
||||||
|
let mut lines = contents.lines();
|
||||||
|
let instructions: Vec<char> = lines.next().unwrap().chars().collect();
|
||||||
|
let mut node_map = HashMap::new();
|
||||||
|
lines.next();
|
||||||
|
loop {
|
||||||
|
let line = lines.next();
|
||||||
|
if line.is_none() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
let line_components = line.unwrap().split_at(4);
|
||||||
|
let lhs = line_components.0.get(0..3);
|
||||||
|
let rhs = line_components.1.split_at(7);
|
||||||
|
node_map.insert(lhs.unwrap(), Node{left: rhs.0.get(3..6).unwrap().to_owned(), right: rhs.1.get(1..4).unwrap().to_owned()});
|
||||||
|
}
|
||||||
|
let mut current_node = "AAA";
|
||||||
|
let mut count = 0;
|
||||||
|
while current_node != "ZZZ" {
|
||||||
|
if instructions[count % instructions.len()] == 'L' {
|
||||||
|
current_node = &node_map[current_node].left;
|
||||||
|
} else {
|
||||||
|
current_node = &node_map[current_node].right;
|
||||||
|
}
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
println!("{}", count);
|
||||||
|
}
|
93
src/08part2.rs
Normal file
93
src/08part2.rs
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
use std::{fs, collections::HashMap};
|
||||||
|
|
||||||
|
struct Node {
|
||||||
|
left: String,
|
||||||
|
right: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Eq, Hash, Debug)]
|
||||||
|
struct NodeInstruction {
|
||||||
|
node: String,
|
||||||
|
instruction: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PartialEq for NodeInstruction {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
return self.node == other.node && self.instruction == other.instruction;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let file_path = "input/08input.txt";
|
||||||
|
let contents = fs::read_to_string(file_path).expect("should read file");
|
||||||
|
let mut lines = contents.lines();
|
||||||
|
let instructions: Vec<char> = lines.next().unwrap().chars().collect();
|
||||||
|
let mut nodes: HashMap<String, Node> = HashMap::new();
|
||||||
|
lines.next();
|
||||||
|
let mut current_nodes = Vec::new();
|
||||||
|
loop {
|
||||||
|
let line = lines.next();
|
||||||
|
if line.is_none() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
let line_components = line.unwrap().split_at(4);
|
||||||
|
let lhs = line_components.0.get(0..3);
|
||||||
|
if lhs.unwrap().chars().collect::<Vec<char>>()[2] == 'A' {
|
||||||
|
current_nodes.push(lhs.unwrap().to_string());
|
||||||
|
}
|
||||||
|
let rhs = line_components.1.split_at(7);
|
||||||
|
let rhs_left = rhs.0.get(3..6).unwrap();
|
||||||
|
let rhs_right = rhs.1.get(1..4).unwrap();
|
||||||
|
nodes.insert(lhs.unwrap().to_string(), Node {left: rhs_left.to_string(), right: rhs_right.to_string()});
|
||||||
|
}
|
||||||
|
let mut count = 0;
|
||||||
|
let mut cycles: Vec<usize> = Vec::new();
|
||||||
|
println!("{}", current_nodes.len());
|
||||||
|
loop {
|
||||||
|
if current_nodes.len() == 0 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if current_nodes[0].chars().collect::<Vec<char>>()[2] == 'Z' {
|
||||||
|
cycles.push(count);
|
||||||
|
current_nodes.remove(0);
|
||||||
|
count = 0;
|
||||||
|
} else {
|
||||||
|
if instructions[count % instructions.len()] == 'L'{
|
||||||
|
current_nodes[0] = nodes[¤t_nodes[0]].left.to_owned();
|
||||||
|
} else {
|
||||||
|
current_nodes[0] = nodes[¤t_nodes[0]].right.to_owned();
|
||||||
|
}
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while cycles.len() > 1 {
|
||||||
|
let a = cycles.pop().unwrap();
|
||||||
|
let b = cycles.pop().unwrap();
|
||||||
|
cycles.push(lcm(a, b));
|
||||||
|
}
|
||||||
|
println!("{}", cycles[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn lcm(first: usize, second: usize) -> usize {
|
||||||
|
first * second / gcd(first, second)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn gcd(first: usize, second: usize) -> usize {
|
||||||
|
let mut max = first;
|
||||||
|
let mut min = second;
|
||||||
|
if min > max {
|
||||||
|
let val = max;
|
||||||
|
max = min;
|
||||||
|
min = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let res = max % min;
|
||||||
|
if res == 0 {
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
|
||||||
|
max = min;
|
||||||
|
min = res;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user