Complete day 10 part 1

This commit is contained in:
Timothy Warren 2022-12-13 21:22:56 -05:00
parent 4ad9f14894
commit 0f5449c3da

View File

@ -1,5 +1,3 @@
use std::collections::HashMap;
#[derive(Debug)] #[derive(Debug)]
enum Instruction { enum Instruction {
Addx(isize), Addx(isize),
@ -33,17 +31,21 @@ impl CPU {
CPU { x: 1 } CPU { x: 1 }
} }
fn noop(&self) -> (usize, Option<isize>) { fn noop(&self) -> usize {
(1, None) 1
} }
fn addx(&mut self, i: isize) -> (usize, Option<isize>) { fn addx(&mut self, i: isize) -> usize {
self.x += i; self.x += i;
(2, Some(self.x)) 2
} }
pub fn run(&mut self, command: Instruction) -> (usize, Option<isize>) { pub fn get_x(&self) -> isize {
self.x
}
pub fn run(&mut self, command: Instruction) -> usize {
match command { match command {
Addx(i) => self.addx(i), Addx(i) => self.addx(i),
Noop => self.noop(), Noop => self.noop(),
@ -56,7 +58,7 @@ impl CPU {
#[derive(Debug)] #[derive(Debug)]
struct CycleCounter { struct CycleCounter {
cpu: CPU, cpu: CPU,
log: HashMap<usize, isize>, log: Vec<isize>,
cycle: usize, cycle: usize,
} }
@ -64,20 +66,63 @@ impl CycleCounter {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
cpu: CPU::new(), cpu: CPU::new(),
log: HashMap::new(), log: vec![1, 1],
cycle: 1, cycle: 1,
} }
} }
fn run_line(&mut self, line: &str) {
let x = self.cpu.get_x();
let cycles = self.cpu.run(Instruction::from_line(line));
for _ in 0..(cycles - 1) {
self.cycle += 1;
self.log.push(x);
}
self.cycle += 1;
self.log.push(self.cpu.get_x());
}
pub fn get_signal_strength(&self, cycle: usize) -> usize {
let x = self.log.get(cycle).unwrap();
(*x as usize) * cycle
}
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
fn main() { fn main() {
let file_str = include_str!("input.txt"); let file_str = include_str!("input.txt");
let instructions: Vec<Instruction> = file_str.lines().map(Instruction::from_line).collect(); let mut cc = CycleCounter::new();
file_str.lines().for_each(|line| cc.run_line(line));
let sum: usize = [20usize, 60, 100, 140, 180, 220]
.into_iter()
.map(|n| cc.get_signal_strength(n))
.sum();
println!("Part 1: sum of signal strength: {}", sum);
} }
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
#[test]
fn test_get_signal_strength() {
let file_str = include_str!("test-input.txt");
let mut cc = CycleCounter::new();
file_str.lines().for_each(|line| cc.run_line(line));
assert_eq!(cc.get_signal_strength(20), 420);
assert_eq!(cc.get_signal_strength(60), 1140);
assert_eq!(cc.get_signal_strength(100), 1800);
assert_eq!(cc.get_signal_strength(140), 2940);
assert_eq!(cc.get_signal_strength(180), 2880);
assert_eq!(cc.get_signal_strength(220), 3960);
}
} }