aoc day10 part1 done
This commit is contained in:
parent
408b4d9e6f
commit
714405d466
2 changed files with 273 additions and 0 deletions
272
2022-aoc/src/d10.rs
Normal file
272
2022-aoc/src/d10.rs
Normal file
|
@ -0,0 +1,272 @@
|
||||||
|
use aoc_runner_derive::{aoc as aoc_run, aoc_generator};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
enum Instr {
|
||||||
|
Noop,
|
||||||
|
AddX(i32, u8),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Instr {
|
||||||
|
pub fn execute(&mut self) -> Option<i32> {
|
||||||
|
match self {
|
||||||
|
Instr::AddX(val, done) => {
|
||||||
|
if *done == 0 {
|
||||||
|
Some(*val)
|
||||||
|
} else {
|
||||||
|
*done -= 1;
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Instr::Noop => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn addx(val: i32) -> Self {
|
||||||
|
Instr::AddX(val, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_noop(&self) -> bool {
|
||||||
|
self == &Instr::Noop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
struct Vm {
|
||||||
|
cycle: usize,
|
||||||
|
x: i32,
|
||||||
|
ip: usize,
|
||||||
|
instrs: Vec<Instr>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Vm {
|
||||||
|
pub fn new(instrs: Vec<Instr>) -> Self {
|
||||||
|
Vm {
|
||||||
|
cycle: 1,
|
||||||
|
x: 1,
|
||||||
|
ip: 0,
|
||||||
|
instrs,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn run(&mut self) -> (usize, i32) {
|
||||||
|
let instr = self.instrs.get_mut(self.ip).unwrap();
|
||||||
|
let out = (self.cycle, self.x);
|
||||||
|
let mut incr = false;
|
||||||
|
if let Some(v) = instr.execute() {
|
||||||
|
self.x += v;
|
||||||
|
incr = true;
|
||||||
|
}
|
||||||
|
if instr.is_noop() {
|
||||||
|
incr = true;
|
||||||
|
}
|
||||||
|
if incr {
|
||||||
|
self.ninst();
|
||||||
|
}
|
||||||
|
self.cycle += 1;
|
||||||
|
out
|
||||||
|
}
|
||||||
|
|
||||||
|
fn ninst(&mut self) {
|
||||||
|
self.ip = (self.ip + 1).min(self.instrs.len() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[aoc_generator(day10)]
|
||||||
|
fn parse_input(input: &str) -> Vm {
|
||||||
|
let mut data = Vec::new();
|
||||||
|
for line in input.lines() {
|
||||||
|
match line {
|
||||||
|
"noop" => data.push(Instr::Noop),
|
||||||
|
_ => {
|
||||||
|
let (_, v) = line.split_once(' ').unwrap();
|
||||||
|
data.push(Instr::addx(v.parse().unwrap()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Vm::new(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[aoc_run(day10, part1)]
|
||||||
|
fn part1(input: &Vm) -> i32 {
|
||||||
|
let mut out = 0;
|
||||||
|
let mut vm = input.clone();
|
||||||
|
let mut samp = 20;
|
||||||
|
for _ in 0..221 {
|
||||||
|
let (cycle, x) = vm.run();
|
||||||
|
if cycle % samp == 0 {
|
||||||
|
samp += 40;
|
||||||
|
out += cycle as i32 * x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out
|
||||||
|
}
|
||||||
|
|
||||||
|
#[aoc_run(day10, part2)]
|
||||||
|
fn part2(input: &Vm) -> u32 {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
const INPUT: &str = "addx 15
|
||||||
|
addx -11
|
||||||
|
addx 6
|
||||||
|
addx -3
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx -8
|
||||||
|
addx 13
|
||||||
|
addx 4
|
||||||
|
noop
|
||||||
|
addx -1
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx -35
|
||||||
|
addx 1
|
||||||
|
addx 24
|
||||||
|
addx -19
|
||||||
|
addx 1
|
||||||
|
addx 16
|
||||||
|
addx -11
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 21
|
||||||
|
addx -15
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -3
|
||||||
|
addx 9
|
||||||
|
addx 1
|
||||||
|
addx -3
|
||||||
|
addx 8
|
||||||
|
addx 1
|
||||||
|
addx 5
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -36
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
addx 7
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
addx 6
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 7
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx -13
|
||||||
|
addx 13
|
||||||
|
addx 7
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
addx -33
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 8
|
||||||
|
noop
|
||||||
|
addx -1
|
||||||
|
addx 2
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx 17
|
||||||
|
addx -9
|
||||||
|
addx 1
|
||||||
|
addx 1
|
||||||
|
addx -3
|
||||||
|
addx 11
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -13
|
||||||
|
addx -19
|
||||||
|
addx 1
|
||||||
|
addx 3
|
||||||
|
addx 26
|
||||||
|
addx -30
|
||||||
|
addx 12
|
||||||
|
addx -1
|
||||||
|
addx 3
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -9
|
||||||
|
addx 18
|
||||||
|
addx 1
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 9
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -1
|
||||||
|
addx 2
|
||||||
|
addx -37
|
||||||
|
addx 1
|
||||||
|
addx 3
|
||||||
|
noop
|
||||||
|
addx 15
|
||||||
|
addx -21
|
||||||
|
addx 22
|
||||||
|
addx -6
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx -10
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 20
|
||||||
|
addx 1
|
||||||
|
addx 2
|
||||||
|
addx 2
|
||||||
|
addx -6
|
||||||
|
addx -11
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop";
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part1_test() {
|
||||||
|
let vm = parse_input(INPUT);
|
||||||
|
|
||||||
|
assert_eq!(part1(&vm), 13140);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part2_test() {
|
||||||
|
let vm = parse_input(INPUT);
|
||||||
|
assert_eq!(part2(&vm), 1);
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,5 +9,6 @@ mod d6;
|
||||||
mod d7;
|
mod d7;
|
||||||
mod d8;
|
mod d8;
|
||||||
mod d9;
|
mod d9;
|
||||||
|
mod d10;
|
||||||
|
|
||||||
aoc_lib! { year = 2022 }
|
aoc_lib! { year = 2022 }
|
||||||
|
|
Loading…
Reference in a new issue