diff --git a/input/10.txt b/input/10.txt index e69de29..25fdf8f 100644 --- a/input/10.txt +++ b/input/10.txt @@ -0,0 +1,146 @@ +ddx 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 diff --git a/src/day10/mod.rs b/src/day10/mod.rs index a3107b6..e29bf96 100644 --- a/src/day10/mod.rs +++ b/src/day10/mod.rs @@ -1,15 +1,74 @@ use crate::read; -use std::collections::HashSet; use itertools::Itertools; +use std::collections::HashSet; +use std::str::FromStr; + +#[derive(Debug, PartialEq, Eq, Clone, Hash)] +enum Command { + AddX(i32), + Noop, +} +impl Command { + fn from_str(s: &str) -> Self { + if s == "noop" { + Self::Noop + } else { + let sp = s.split_once(' ').unwrap(); + Self::AddX(sp.1.parse().unwrap()) + } + } +} -//#[derive(Debug, PartialEq, Eq, Default, Clone, Hash)] pub fn run() { let input = read("10"); - let lines = input.lines(); + let mut lines = input.lines(); + + let mut cycle = 1; + let mut is_busy = 0; + let mut v: i32 = 1; + let mut v_new: i32 = 1; + let mut sig_str = vec![]; + let mut pixels = [false; 40]; + 'outer: loop { + if cycle == 20 || (cycle - 20) % 40 == 0 { + sig_str.push(cycle * v); + } + if is_busy == 0 { + match lines.next() { + Some(s) => { + let cmd = Command::from_str(s); + match cmd { + Command::Noop => {} + Command::AddX(x) => { + v_new += x; + is_busy = 1; + } + } + } + _ => { + break 'outer; + } + }; + } else { + is_busy -= 1; + } + if is_busy == 0 { + v = v_new; + } + + let pixel = cycle % 40; + let is_lit = pixel - 1 == v || pixel == v || pixel + 1 == v; + pixels[pixel as usize] = is_lit; + if pixel == 0 && cycle != 0 { + let row: String = pixels.map(|l| if l { '#' } else { '.' }).iter().collect(); + println!("{}", row); + } + cycle += 1; + } #[cfg(feature = "part1")] { - println!("Day 10, Part 01: {}", "TODO"); + println!("Day 10, Part 01: {}", sig_str.iter().sum::()); } #[cfg(feature = "part2")]