Day 8 rust
This commit is contained in:
parent
4793f79e79
commit
c7af8e833b
1 changed files with 130 additions and 3 deletions
133
rust/src/main.rs
133
rust/src/main.rs
|
@ -263,8 +263,131 @@ mod day05 {
|
|||
}
|
||||
}
|
||||
|
||||
mod day06 {
|
||||
use std::time::Duration;
|
||||
|
||||
pub fn run(_: bool) -> Duration {
|
||||
Duration::new(0, 0)
|
||||
}
|
||||
}
|
||||
|
||||
mod day07 {
|
||||
use std::time::Duration;
|
||||
|
||||
pub fn run(_: bool) -> Duration {
|
||||
Duration::new(0, 0)
|
||||
}
|
||||
}
|
||||
|
||||
mod day08 {
|
||||
use std::{
|
||||
collections::HashSet,
|
||||
time::{Duration, Instant},
|
||||
};
|
||||
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
enum Instruction {
|
||||
Acc(i32),
|
||||
Jmp(i32),
|
||||
Nop,
|
||||
}
|
||||
|
||||
fn part1(instructions: &[Instruction]) -> (i32, Vec<i32>) {
|
||||
let mut accumulator = 0;
|
||||
let mut pc = 0;
|
||||
let mut pc_history = HashSet::new();
|
||||
let mut jumps = Vec::new();
|
||||
|
||||
loop {
|
||||
match instructions[pc as usize] {
|
||||
Instruction::Acc(i) => accumulator += i,
|
||||
Instruction::Jmp(i) => {
|
||||
let target = pc + i - 1;
|
||||
if !pc_history.insert(target) {
|
||||
break (accumulator, jumps);
|
||||
}
|
||||
|
||||
jumps.push(pc);
|
||||
pc += i - 1
|
||||
}
|
||||
Instruction::Nop => (),
|
||||
};
|
||||
|
||||
pc += 1;
|
||||
}
|
||||
}
|
||||
|
||||
fn part2(instructions: &[Instruction], skip: i32) -> Option<i32> {
|
||||
let mut accumulator = 0;
|
||||
let mut pc = 0;
|
||||
let mut pc_history = HashSet::new();
|
||||
|
||||
loop {
|
||||
if pc != skip {
|
||||
match instructions.get(pc as usize) {
|
||||
Some(Instruction::Acc(i)) => accumulator += i,
|
||||
Some(Instruction::Jmp(i)) => {
|
||||
let target = pc + i;
|
||||
if !pc_history.insert(target) {
|
||||
break None;
|
||||
}
|
||||
|
||||
pc = target - 1;
|
||||
}
|
||||
Some(Instruction::Nop) => (),
|
||||
None => break Some(accumulator),
|
||||
};
|
||||
}
|
||||
|
||||
pc += 1;
|
||||
}
|
||||
}
|
||||
|
||||
pub fn run(print: bool) -> Duration {
|
||||
let input = std::fs::read_to_string("inputs/day08").unwrap();
|
||||
let instant = Instant::now();
|
||||
|
||||
let instructions: Vec<_> = input
|
||||
.lines()
|
||||
.map(|line| {
|
||||
let operation = &line[0..3];
|
||||
let value: i32 = line[4..].parse().unwrap();
|
||||
match operation {
|
||||
"acc" => Instruction::Acc(value),
|
||||
"jmp" => Instruction::Jmp(value),
|
||||
"nop" => Instruction::Nop,
|
||||
_ => unreachable!(operation),
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
||||
let (part1, jumps) = part1(&instructions);
|
||||
|
||||
let part2 = jumps
|
||||
.iter()
|
||||
.rev()
|
||||
.find_map(|skip_pc| part2(&instructions, *skip_pc))
|
||||
.unwrap();
|
||||
|
||||
let elapsed = instant.elapsed();
|
||||
if print {
|
||||
dbg!(elapsed, part1, part2);
|
||||
}
|
||||
elapsed
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let days = [day01::run, day02::run, day03::run, day04::run, day05::run];
|
||||
let days = [
|
||||
day01::run,
|
||||
day02::run,
|
||||
day03::run,
|
||||
day04::run,
|
||||
day05::run,
|
||||
day06::run,
|
||||
day07::run,
|
||||
day08::run,
|
||||
];
|
||||
|
||||
if let Some(day) = std::env::args().nth(1) {
|
||||
let day: usize = day.parse().expect("day not an integer");
|
||||
|
@ -276,11 +399,15 @@ fn main() {
|
|||
let mut total = Duration::new(0, 0);
|
||||
|
||||
for day in 0..days.len() {
|
||||
let mut elapsed = Duration::new(0, 0);
|
||||
for _ in 0..repetitions {
|
||||
total += days[day](false) / repetitions;
|
||||
elapsed += days[day](false) / repetitions;
|
||||
}
|
||||
println!("Day {:>2}: {:?}", day + 1, elapsed);
|
||||
total += elapsed;
|
||||
}
|
||||
|
||||
dbg!(total);
|
||||
println!("-------------------");
|
||||
println!("Total: {:?}", total);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue