summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2022-12-10 00:29:19 -0500
committerJesse Luehrs <doy@tozt.net>2022-12-10 00:29:19 -0500
commitcd0ce4cafedd9d0c1ff19a9e697d59df31724248 (patch)
tree7c962edc06775277dd16c409ddae6a26e2d4c9d8
parent33a7618e7d02331edccec4841b08d6efe8272dff (diff)
downloadadvent-of-code-cd0ce4cafedd9d0c1ff19a9e697d59df31724248.tar.gz
advent-of-code-cd0ce4cafedd9d0c1ff19a9e697d59df31724248.zip
day 10
-rw-r--r--data/2022/10.txt144
-rw-r--r--src/2022/10/mod.rs93
-rw-r--r--src/2022/mod.rs4
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)),
}