diff options
author | Jesse Luehrs <doy@tozt.net> | 2022-12-10 00:29:19 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2022-12-10 00:29:19 -0500 |
commit | cd0ce4cafedd9d0c1ff19a9e697d59df31724248 (patch) | |
tree | 7c962edc06775277dd16c409ddae6a26e2d4c9d8 | |
parent | 33a7618e7d02331edccec4841b08d6efe8272dff (diff) | |
download | advent-of-code-cd0ce4cafedd9d0c1ff19a9e697d59df31724248.tar.gz advent-of-code-cd0ce4cafedd9d0c1ff19a9e697d59df31724248.zip |
day 10
-rw-r--r-- | data/2022/10.txt | 144 | ||||
-rw-r--r-- | src/2022/10/mod.rs | 93 | ||||
-rw-r--r-- | src/2022/mod.rs | 4 |
3 files changed, 241 insertions, 0 deletions
diff --git a/data/2022/10.txt b/data/2022/10.txt new file mode 100644 index 0000000..eb4a645 --- /dev/null +++ b/data/2022/10.txt @@ -0,0 +1,144 @@ +addx 2 +addx 3 +addx 1 +noop +addx 4 +noop +noop +noop +addx 5 +noop +addx 1 +addx 4 +addx -2 +addx 3 +addx 5 +addx -1 +addx 5 +addx 3 +addx -2 +addx 4 +noop +noop +noop +addx -27 +addx -5 +addx 2 +addx -7 +addx 3 +addx 7 +addx 5 +addx 2 +addx 5 +noop +noop +addx -2 +noop +addx 3 +addx 2 +addx 5 +addx 2 +addx 3 +noop +addx 2 +addx -29 +addx 30 +addx -26 +addx -10 +noop +addx 5 +noop +addx 18 +addx -13 +noop +noop +addx 5 +noop +noop +addx 5 +noop +noop +noop +addx 1 +addx 2 +addx 7 +noop +noop +addx 3 +noop +addx 2 +addx 3 +noop +addx -37 +noop +addx 16 +addx -12 +addx 29 +addx -16 +addx -10 +addx 5 +addx 2 +addx -11 +addx 11 +addx 3 +addx 5 +addx 2 +addx 2 +addx -1 +addx 2 +addx 5 +addx 2 +noop +noop +noop +addx -37 +noop +addx 17 +addx -10 +addx -2 +noop +addx 7 +addx 3 +noop +addx 2 +addx -10 +addx 22 +addx -9 +addx 5 +addx 2 +addx -5 +addx 6 +addx 2 +addx 5 +addx 2 +addx -28 +addx -7 +noop +noop +addx 1 +addx 4 +addx 17 +addx -12 +noop +noop +noop +noop +addx 5 +addx 6 +noop +addx -1 +addx -17 +addx 18 +noop +addx 5 +noop +noop +noop +addx 5 +addx 4 +addx -2 +noop +noop +noop +noop +noop diff --git a/src/2022/10/mod.rs b/src/2022/10/mod.rs new file mode 100644 index 0000000..126a370 --- /dev/null +++ b/src/2022/10/mod.rs @@ -0,0 +1,93 @@ +#![allow(dead_code)] +#![allow(unused_variables)] + +use crate::prelude::*; + +pub struct Cpu { + x: i64, + history: Vec<i64>, +} + +impl Cpu { + fn new() -> Self { + Self { + x: 1, + history: vec![1], + } + } + + fn step(&mut self, op: Op) { + match op { + Op::Noop => { + self.history.push(self.x); + } + Op::Addx(v) => { + self.history.push(self.x); + self.x += v; + self.history.push(self.x); + } + } + } +} + +#[derive(Clone, Copy)] +pub enum Op { + Noop, + Addx(i64), +} + +pub fn parse(fh: File) -> Result<impl Iterator<Item = Op>> { + Ok(parse::lines(fh).map(|line| { + if line == "noop" { + Op::Noop + } else if let Some(v) = line.strip_prefix("addx ") { + Op::Addx(v.parse().unwrap()) + } else { + panic!("failed to parse {}", line) + } + })) +} + +pub fn part1(ops: impl Iterator<Item = Op>) -> Result<i64> { + let mut cpu = Cpu::new(); + for op in ops { + cpu.step(op); + } + + let mut total = 0; + for cycle in [20, 60, 100, 140, 180, 220] { + let strength = i64::try_from(cycle).unwrap() * cpu.history[cycle - 1]; + total += strength; + } + Ok(total) +} + +pub fn part2(ops: impl Iterator<Item = Op>) -> Result<i64> { + let mut cpu = Cpu::new(); + for op in ops { + cpu.step(op); + } + for (y, row) in cpu.history.chunks(40).enumerate() { + for (x, pos) in row.iter().enumerate() { + if i64::try_from(x).unwrap().abs_diff(*pos) <= 1 { + print!("#"); + } else { + print!("."); + } + } + println!(); + } + Ok(0) +} + +#[test] +fn test() { + assert_eq!( + part1(parse(parse::data(2022, 10).unwrap()).unwrap()).unwrap(), + 0 + ); + assert_eq!( + part2(parse(parse::data(2022, 10).unwrap()).unwrap()).unwrap(), + 0 + ); +} diff --git a/src/2022/mod.rs b/src/2022/mod.rs index 2be116a..0afa8bd 100644 --- a/src/2022/mod.rs +++ b/src/2022/mod.rs @@ -18,6 +18,8 @@ mod day7; mod day8; #[path = "9/mod.rs"] mod day9; +#[path = "10/mod.rs"] +mod day10; // NEXT MOD pub fn run(day: u8, puzzle: u8) -> Result<i64> { @@ -41,6 +43,8 @@ pub fn run(day: u8, puzzle: u8) -> Result<i64> { (8, 2) => day8::part2(day8::parse(parse::data(2022, 8)?)?), (9, 1) => day9::part1(day9::parse(parse::data(2022, 9)?)?), (9, 2) => day9::part2(day9::parse(parse::data(2022, 9)?)?), + (10, 1) => day10::part1(day10::parse(parse::data(2022, 10)?)?), + (10, 2) => day10::part2(day10::parse(parse::data(2022, 10)?)?), // NEXT PART _ => Err(anyhow!("unknown puzzle {}-{}", day, puzzle)), } |