Day 8
This commit is contained in:
parent
1d338eea9d
commit
38ccaeef6e
8
Cargo.lock
generated
8
Cargo.lock
generated
|
@ -57,3 +57,11 @@ version = "0.1.0"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "d07t2"
|
name = "d07t2"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "d08t1"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "d08t2"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
|
@ -16,4 +16,6 @@ members = [
|
||||||
"d06t2",
|
"d06t2",
|
||||||
"d07t1",
|
"d07t1",
|
||||||
"d07t2",
|
"d07t2",
|
||||||
|
"d08t1",
|
||||||
|
"d08t2",
|
||||||
]
|
]
|
||||||
|
|
8
d08t1/Cargo.toml
Normal file
8
d08t1/Cargo.toml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[package]
|
||||||
|
name = "d08t1"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
5
d08t1/demo_input.txt
Normal file
5
d08t1/demo_input.txt
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
LLR
|
||||||
|
|
||||||
|
AAA = (BBB, BBB)
|
||||||
|
BBB = (AAA, ZZZ)
|
||||||
|
ZZZ = (ZZZ, ZZZ)
|
40
d08t1/src/main.rs
Normal file
40
d08t1/src/main.rs
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
use std::{collections::HashMap, fs::read_to_string};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let input = read_to_string("input.txt").unwrap();
|
||||||
|
println!("d08t1: {}", d08t1(&input));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
|
pub fn d08t1(input: &str) -> usize {
|
||||||
|
let mut lines = input.lines();
|
||||||
|
let mut directions = lines.next().unwrap().chars().cycle();
|
||||||
|
let mut locations: HashMap<String, (String, String)> = HashMap::new();
|
||||||
|
for line in lines.skip(1) {
|
||||||
|
let (source, destination) = line.split_once(" = ").unwrap();
|
||||||
|
let destination = &destination.replace(['(', ')'], "");
|
||||||
|
let (left, right) = destination.split_once(", ").unwrap();
|
||||||
|
locations.insert(source.to_string(), (left.to_string(), right.to_string()));
|
||||||
|
}
|
||||||
|
let mut result = 0;
|
||||||
|
let mut current_position = "AAA";
|
||||||
|
while current_position != "ZZZ" {
|
||||||
|
result += 1;
|
||||||
|
current_position = if directions.next().unwrap() == 'L' {
|
||||||
|
&locations.get(current_position).unwrap().0
|
||||||
|
} else {
|
||||||
|
&locations.get(current_position).unwrap().1
|
||||||
|
};
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
#[test]
|
||||||
|
fn test_d08t1() {
|
||||||
|
let input = include_str!("../demo_input.txt");
|
||||||
|
assert_eq!(d08t1(input), 6);
|
||||||
|
}
|
||||||
|
}
|
8
d08t2/Cargo.toml
Normal file
8
d08t2/Cargo.toml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[package]
|
||||||
|
name = "d08t2"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
10
d08t2/demo_input.txt
Normal file
10
d08t2/demo_input.txt
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
LR
|
||||||
|
|
||||||
|
11A = (11B, XXX)
|
||||||
|
11B = (XXX, 11Z)
|
||||||
|
11Z = (11B, XXX)
|
||||||
|
22A = (22B, XXX)
|
||||||
|
22B = (22C, 22C)
|
||||||
|
22C = (22Z, 22Z)
|
||||||
|
22Z = (22B, 22B)
|
||||||
|
XXX = (XXX, XXX)
|
65
d08t2/src/main.rs
Normal file
65
d08t2/src/main.rs
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
use std::{collections::HashMap, fs::read_to_string};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let input = read_to_string("input.txt").unwrap();
|
||||||
|
println!("d08t2: {}", d08t2(&input));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn d08t2(input: &str) -> usize {
|
||||||
|
let mut lines = input.lines();
|
||||||
|
let directions = lines.next().unwrap().chars().cycle();
|
||||||
|
let mut locations: HashMap<String, (String, String)> = HashMap::new();
|
||||||
|
for line in lines.skip(1) {
|
||||||
|
let (source, destination) = line.split_once(" = ").unwrap();
|
||||||
|
let destination = &destination.replace(['(', ')'], "");
|
||||||
|
let (left, right) = destination.split_once(", ").unwrap();
|
||||||
|
locations.insert(source.to_string(), (left.to_string(), right.to_string()));
|
||||||
|
}
|
||||||
|
let keys = locations.keys();
|
||||||
|
keys.filter(|k| k.ends_with('A'))
|
||||||
|
.map(Clone::clone)
|
||||||
|
.map(|start| {
|
||||||
|
let mut dirs = directions.clone();
|
||||||
|
let mut res = 0;
|
||||||
|
let mut current_position = start.clone();
|
||||||
|
while !current_position.ends_with('Z') {
|
||||||
|
res += 1;
|
||||||
|
current_position = if dirs.next().unwrap() == 'L' {
|
||||||
|
&locations.get(¤t_position).unwrap().0
|
||||||
|
} else {
|
||||||
|
&locations.get(¤t_position).unwrap().1
|
||||||
|
}
|
||||||
|
.clone();
|
||||||
|
}
|
||||||
|
res
|
||||||
|
})
|
||||||
|
.reduce(lcm)
|
||||||
|
.unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn lcm(first: usize, second: usize) -> usize {
|
||||||
|
first * second / gcd(first, second)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn gcd(first: usize, second: usize) -> usize {
|
||||||
|
let mut max = first.max(second);
|
||||||
|
let mut min = first.min(second);
|
||||||
|
loop {
|
||||||
|
let res = max % min;
|
||||||
|
if res == 0 {
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
max = min;
|
||||||
|
min = res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
#[test]
|
||||||
|
fn test_d08t2() {
|
||||||
|
let input = include_str!("../demo_input.txt");
|
||||||
|
assert_eq!(d08t2(input), 6);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue