From 8ec6b0413b6c6f8e6fe22e82696e0c57d804a20f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20K=C3=A4nner?= Date: Sat, 10 Dec 2022 18:54:10 +0100 Subject: [PATCH] Day 10 --- day10/Cargo.lock | 7 +++ day10/input.txt | 143 ++++++++++++++++++++++++++++++++++++++++++++++ day10/src/main.rs | 85 ++++++++++++++++++++++++++- 3 files changed, 233 insertions(+), 2 deletions(-) create mode 100644 day10/Cargo.lock create mode 100644 day10/input.txt diff --git a/day10/Cargo.lock b/day10/Cargo.lock new file mode 100644 index 0000000..5f8ea61 --- /dev/null +++ b/day10/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "day10" +version = "0.1.0" diff --git a/day10/input.txt b/day10/input.txt new file mode 100644 index 0000000..1f07fb5 --- /dev/null +++ b/day10/input.txt @@ -0,0 +1,143 @@ +addx 2 +addx 3 +noop +noop +addx 1 +addx 5 +addx -1 +addx 5 +addx 1 +noop +noop +addx 4 +noop +noop +addx 5 +addx -5 +addx 6 +addx 3 +addx 1 +addx 5 +addx 1 +noop +addx -38 +addx 41 +addx -22 +addx -14 +addx 7 +noop +noop +addx 3 +addx -2 +addx 2 +noop +addx 17 +addx -12 +addx 5 +addx 2 +addx -16 +addx 17 +addx 2 +addx 5 +addx 2 +addx -30 +noop +addx -6 +addx 1 +noop +addx 5 +noop +noop +noop +addx 5 +addx -12 +addx 17 +noop +noop +noop +noop +addx 5 +addx 10 +addx -9 +addx 2 +addx 5 +addx 2 +addx -5 +addx 6 +addx 4 +noop +noop +addx -37 +noop +noop +addx 17 +addx -12 +addx 30 +addx -23 +addx 2 +noop +addx 3 +addx -17 +addx 22 +noop +noop +noop +addx 5 +noop +addx -10 +addx 11 +addx 4 +noop +addx 5 +addx -2 +noop +addx -6 +addx -29 +addx 37 +addx -30 +addx 27 +addx -2 +addx -22 +noop +addx 3 +addx 2 +noop +addx 7 +addx -2 +addx 2 +addx 5 +addx -5 +addx 6 +addx 2 +addx 2 +addx 5 +addx -25 +noop +addx -10 +noop +addx 1 +noop +addx 2 +noop +noop +noop +noop +addx 7 +addx 1 +addx 4 +addx 1 +noop +addx 2 +noop +addx 3 +addx 5 +addx -1 +noop +addx 3 +addx 5 +addx 2 +addx 1 +noop +noop +noop +noop diff --git a/day10/src/main.rs b/day10/src/main.rs index e7a11a9..f003d20 100644 --- a/day10/src/main.rs +++ b/day10/src/main.rs @@ -1,3 +1,84 @@ -fn main() { - println!("Hello, world!"); +use std::fs::read_to_string; + +type Register = i32; + +enum Instruction { + Noop, + Addx(Register), + Addx2(Register), +} + +impl From<&str> for Instruction { + fn from(value: &str) -> Self { + match &value.split_whitespace().collect::>()[..] { + ["addx", v] => Self::Addx(v.parse::().unwrap()), + ["noop"] => Self::Noop, + _ => panic!("Invalid instruction"), + } + } +} + +struct Cpu { + instruction: Option, + x: Register, + instructions: T, +} + +impl Cpu { + fn new(instructions: T) -> Self { + Self { + instruction: Some(Instruction::Noop), + x: 1, + instructions, + } + } +} + +impl Iterator for Cpu +where + T: Iterator, +{ + type Item = Register; + + fn next(&mut self) -> Option { + match self.instruction { + Some(Instruction::Noop) => self.instruction = self.instructions.next(), + Some(Instruction::Addx(v)) => self.instruction = Some(Instruction::Addx2(v)), + Some(Instruction::Addx2(v)) => { + self.x += v; + self.instruction = self.instructions.next() + } + None => return None, + } + Some(self.x) + } +} + +fn main() { + let input = "addx 15\naddx -11\naddx 6\naddx -3\naddx 5\naddx -1\naddx -8\naddx 13\naddx 4\nnoop\naddx -1\naddx 5\naddx -1\naddx 5\naddx -1\naddx 5\naddx -1\naddx 5\naddx -1\naddx -35\naddx 1\naddx 24\naddx -19\naddx 1\naddx 16\naddx -11\nnoop\nnoop\naddx 21\naddx -15\nnoop\nnoop\naddx -3\naddx 9\naddx 1\naddx -3\naddx 8\naddx 1\naddx 5\nnoop\nnoop\nnoop\nnoop\nnoop\naddx -36\nnoop\naddx 1\naddx 7\nnoop\nnoop\nnoop\naddx 2\naddx 6\nnoop\nnoop\nnoop\nnoop\nnoop\naddx 1\nnoop\nnoop\naddx 7\naddx 1\nnoop\naddx -13\naddx 13\naddx 7\nnoop\naddx 1\naddx -33\nnoop\nnoop\nnoop\naddx 2\nnoop\nnoop\nnoop\naddx 8\nnoop\naddx -1\naddx 2\naddx 1\nnoop\naddx 17\naddx -9\naddx 1\naddx 1\naddx -3\naddx 11\nnoop\nnoop\naddx 1\nnoop\naddx 1\nnoop\nnoop\naddx -13\naddx -19\naddx 1\naddx 3\naddx 26\naddx -30\naddx 12\naddx -1\naddx 3\naddx 1\nnoop\nnoop\nnoop\naddx -9\naddx 18\naddx 1\naddx 2\nnoop\nnoop\naddx 9\nnoop\nnoop\nnoop\naddx -1\naddx 2\naddx -37\naddx 1\naddx 3\nnoop\naddx 15\naddx -21\naddx 22\naddx -6\naddx 1\nnoop\naddx 2\naddx 1\nnoop\naddx -10\nnoop\nnoop\naddx 20\naddx 1\naddx 2\naddx 2\naddx -6\naddx -11\nnoop\nnoop\nnoop"; + let input = read_to_string("input.txt").unwrap_or_else(|_| input.to_owned()); + let instructions = input.lines().map(Instruction::from); + let signal_strength: Register = Cpu::new(instructions) + .enumerate() + .map(|(i, x)| { + let i = i as Register; + let horizontal = i % 40; + print!( + "{}", + if (horizontal - x).abs() <= 1 { + '█' + } else { + ' ' + } + ); + if horizontal == 39 { + println!(); + } + (i, x) + }) + .skip(19) + .step_by(40) + .map(|(i, x)| (i + 1) * x) + .sum(); + println!("signal strength: {signal_strength}"); }