2020: day08: refacto before part 2
This commit is contained in:
parent
71a100179e
commit
bdef7fcbe4
|
@ -21,17 +21,10 @@ fn part1(input: &str) -> aoc::Result<i64> {
|
||||||
|
|
||||||
let mut interpreter = Interpreter::new(instructions);
|
let mut interpreter = Interpreter::new(instructions);
|
||||||
|
|
||||||
let mut set = HashSet::new();
|
Ok(match interpreter.run() {
|
||||||
|
ExitStatus::InfiniteLoop(value) => value,
|
||||||
loop {
|
ExitStatus::End(_) => return Err(err!("interpreter doesn't have an infinite loop")),
|
||||||
if !set.insert(interpreter.idx) {
|
})
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
interpreter.step();
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(interpreter.accumulator)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Interpreter {
|
struct Interpreter {
|
||||||
|
@ -40,6 +33,11 @@ struct Interpreter {
|
||||||
memory: Vec<Instruction>,
|
memory: Vec<Instruction>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum ExitStatus {
|
||||||
|
InfiniteLoop(i64),
|
||||||
|
End(i64),
|
||||||
|
}
|
||||||
|
|
||||||
impl Interpreter {
|
impl Interpreter {
|
||||||
fn new(instructions: Vec<Instruction>) -> Self {
|
fn new(instructions: Vec<Instruction>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
@ -59,6 +57,20 @@ impl Interpreter {
|
||||||
Instruction::Nop => self.idx += 1,
|
Instruction::Nop => self.idx += 1,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn run(&mut self) -> ExitStatus {
|
||||||
|
let mut set = HashSet::new();
|
||||||
|
|
||||||
|
while self.idx < self.memory.len() {
|
||||||
|
if !set.insert(self.idx) {
|
||||||
|
return ExitStatus::InfiniteLoop(self.accumulator);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.step();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ExitStatus::End(self.accumulator);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum Instruction {
|
enum Instruction {
|
||||||
|
|
Loading…
Reference in a new issue