Skip to content

Commit

Permalink
2023-08: Solve second puzzle
Browse files Browse the repository at this point in the history
  • Loading branch information
MLNW committed Dec 9, 2023
1 parent 122bd86 commit 54605ed
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 13 deletions.
15 changes: 8 additions & 7 deletions 2023-rust/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,16 @@ Solutions for [Advent of Code](https://adventofcode.com/) in [Rust](https://www.

| Day | Part 1 | Part 2 |
| :---: | :---: | :---: |
| [Day 1](./src/bin/01.rs) | `63.6µs` | `628.4µs` |
| [Day 2](./src/bin/02.rs) | `43.1µs` | `49.8µs` |
| [Day 3](./src/bin/03.rs) | `431.5µs` | `425.4µs` |
| [Day 4](./src/bin/04.rs) | `96.6µs` | `19.2ms` |
| [Day 1](./src/bin/01.rs) | `64.7µs` | `631.9µs` |
| [Day 2](./src/bin/02.rs) | `41.3µs` | `47.5µs` |
| [Day 3](./src/bin/03.rs) | `425.8µs` | `424.0µs` |
| [Day 4](./src/bin/04.rs) | `97.7µs` | `19.5ms` |
| [Day 5](./src/bin/05.rs) | `30.3µs` | `26.5s` |
| [Day 6](./src/bin/06.rs) | `544.0ns` | `40.8ms` |
| [Day 8](./src/bin/08.rs) | `259.2µs` | `-` |
| [Day 6](./src/bin/06.rs) | `603.0ns` | `42.7ms` |
| [Day 7](./src/bin/07.rs) | `202.3µs` | `-` |
| [Day 8](./src/bin/08.rs) | `256.0µs` | `1.8ms` |

**Total: 26562.00ms**
**Total: 26566.19ms**
<!--- benchmarking table --->

## Usage
Expand Down
10 changes: 10 additions & 0 deletions 2023-rust/data/examples/08-2.txt
Original file line number Diff line number Diff line change
@@ -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)
47 changes: 41 additions & 6 deletions 2023-rust/src/bin/08.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,19 @@ enum Direction {

pub fn part_one(input: &str) -> Option<u32> {
let (directions, map) = parse_input(input);
solve_part_one("AAA", &directions, &map, |node| node == "ZZZ")
}

let mut current_node = "AAA";
fn solve_part_one(
starting_node: &str,
directions: &[Direction],
map: &HashMap<&str, (&str, &str)>,
end_condition: fn(&str) -> bool,
) -> Option<u32> {
let mut current_node = starting_node;
let mut steps: u32 = 0;
for direction in directions.iter().cycle() {
if current_node == "ZZZ" {
if end_condition(current_node) {
break;
};
steps += 1;
Expand All @@ -29,8 +37,33 @@ pub fn part_one(input: &str) -> Option<u32> {
Some(steps)
}

pub fn part_two(input: &str) -> Option<u32> {
None
pub fn part_two(input: &str) -> Option<u64> {
let (directions, map) = parse_input(input);

let steps_per_ghost = map
.keys()
.filter(|key| key.ends_with('A'))
.filter_map(|node| solve_part_one(node, &directions, &map, |node| node.ends_with('Z')))
.collect_vec();

Some(
steps_per_ghost
.iter()
.map(|steps| *steps as u64)
.fold(1, lcm),
)
}

fn gcd(a: u64, b: u64) -> u64 {
if b == 0 {
a
} else {
gcd(b, a % b)
}
}

fn lcm(a: u64, b: u64) -> u64 {
a / gcd(a, b) * b
}

fn parse_input(input: &str) -> (Vec<Direction>, HashMap<&str, (&str, &str)>) {
Expand Down Expand Up @@ -72,7 +105,9 @@ mod tests {

#[test]
fn test_part_two() {
let result = part_two(&advent_of_code::template::read_file("examples", DAY));
assert_eq!(result, None);
let result = part_two(&advent_of_code::template::read_file_part(
"examples", DAY, 2,
));
assert_eq!(result, Some(6));
}
}

0 comments on commit 54605ed

Please sign in to comment.