master
mitchellhansen 4 years ago
parent e238e0e9b2
commit c4a27e82e0

@ -1,21 +1,40 @@
use crate::Problem; use crate::Problem;
use std::collections::HashSet;
#[derive(Clone, Debug)]
pub struct Problem8 { pub struct Problem8 {
number_list: Vec<i32>, operations: Vec<(Op, OpAnd)>,
} }
#[derive(Clone, Copy, Debug)]
enum Op {
Nop,
Acc,
Jmp,
}
#[derive(Clone, Copy, Debug)]
struct OpAnd(i32);
impl Problem8 {} impl Problem8 {}
impl Problem for Problem8 { impl Problem for Problem8 {
fn new(input: &String) -> Self { fn new(input: &String) -> Self {
Problem8 { Problem8 {
number_list: input operations: input
.split("\n") .split("\n")
.filter_map(|s| { .filter_map(|s| {
let s = s.trim(); let s = s.trim();
if !s.is_empty() { if !s.is_empty() {
Some(s.parse::<i32>().unwrap()) let mut v = s.split(" ");
let op = match v.next().unwrap().trim() {
"nop" => {Op::Nop},
"acc" => {Op::Acc},
"jmp" => {Op::Jmp},
_ =>{println!("unsupported operand {}", s); Op::Nop}
};
Some((op, OpAnd(v.next().unwrap().trim().parse::<i32>().unwrap())))
} else { } else {
None None
} }
@ -24,11 +43,73 @@ impl Problem for Problem8 {
} }
fn run_part1(&self) { fn run_part1(&self) {
return;
println!("{:?}", self.operations);
let mut repeats : HashSet<i32> = HashSet::default();
let mut pc : i32 = 0;
let mut acc : i32 = 0;
while !repeats.contains(&pc) {
repeats.insert(pc);
match self.operations.get(pc as usize).unwrap() {
&(Op::Nop, opand) => {
pc += 1;
},
&(Op::Acc, opand) => {
acc += opand.0 as i32;
pc += 1;
},
&(Op::Jmp, opand) => {
pc += opand.0 as i32;
}
}
println!("{:?}, {:?}, {:?}", pc, acc, repeats)
}
} }
fn run_part2(&self) { fn run_part2(&self) {
println!("{:?}", self.operations);
for (i, v) in self.operations.iter().enumerate() {
let mut base_ops = self.operations.clone();
match v {
&(Op::Nop, opand) => {
base_ops[i] = (Op::Jmp, opand);
},
&(Op::Acc, opand) => {
},
&(Op::Jmp, opand) => {
base_ops[i] = (Op::Nop, opand);
}
}
let mut repeats : HashSet<i32> = HashSet::default();
let mut pc : i32 = 0;
let mut acc : i32 = 0;
while !repeats.contains(&pc) && pc < self.operations.len() as i32{
repeats.insert(pc);
match base_ops.get(pc as usize).unwrap() {
&(Op::Nop, opand) => {
pc += 1;
},
&(Op::Acc, opand) => {
acc += opand.0 as i32;
pc += 1;
},
&(Op::Jmp, opand) => {
pc += opand.0 as i32;
}
}
//println!("{:?}, {:?}, {:?}", pc, acc, repeats)
}
println!("{:?}", acc);
println!("pc {:?}, len {:?}, contains {:?}", pc, repeats.contains(&pc), self.operations.len())
}
} }
} }

Loading…
Cancel
Save