diff --git a/src/day10/1.rs b/src/day10/1.rs new file mode 100644 index 0000000..a636335 --- /dev/null +++ b/src/day10/1.rs @@ -0,0 +1,77 @@ +#![feature(test)] +extern crate test; + +const INPUTS: [&str; 2] = [include_str!("./sample.txt"), include_str!("./input.txt")]; + +#[derive(Debug)] +enum Ins { + Noop, + Addx(i32), +} + +fn parse(input: &'static str) -> Vec { + input + .trim() + .split('\n') + .flat_map(|line| { + let (a, b) = line.split_at(4); + + match a { + "noop" => vec![Ins::Noop], + "addx" => { + let b = b.trim(); + let b: i32 = b.parse::().unwrap(); + + vec![Ins::Noop, Ins::Addx(b)] + } + _ => unreachable!(), + } + }) + .collect() +} + +fn main() { + for input in INPUTS.iter() { + let output = parse(input); + let score = solution(output); + println!("{}", score); + } +} + +fn solution(input: Vec) -> i32 { + let mut register = 1i32; + let mut cycle = 0; + let mut store = [0; 220]; + + for ip in input.into_iter() { + match ip { + Ins::Noop => { + store[cycle] = register; + } + Ins::Addx(v) => { + store[cycle] = register; + register += v; + } + } + cycle += 1; + if cycle >= 220 { + break; + } + } + + store[20 - 1] * 20 + + store[60 - 1] * 60 + + store[100 - 1] * 100 + + store[140 - 1] * 140 + + store[180 - 1] * 180 + + store[220 - 1] * 220 +} + +#[bench] +fn solution_bench(b: &mut test::Bencher) { + b.iter(|| { + let input = parse(INPUTS[1]); + let result = solution(input); + test::black_box(result); + }) +} diff --git a/src/day10/2.rs b/src/day10/2.rs new file mode 100644 index 0000000..dcee1b3 --- /dev/null +++ b/src/day10/2.rs @@ -0,0 +1,126 @@ +#![feature(test)] +extern crate test; + +const INPUTS: [&[u8]; 2] = [ + include_bytes!("./sample.txt"), + include_bytes!("./input.txt"), +]; + +#[derive(Debug)] +enum Ins { + Noop, + Addx(i32), +} + +fn parse(input: &[u8]) -> Vec { + input + .split(|&c| c == b'\n') + .filter(|c| !c.is_empty()) + .map(|line| match &line[0..4] { + [b'n', b'o', b'o', b'p'] => Ins::Noop, + [b'a', b'd', b'd', b'x'] => { + let is_neg = line[5] == b'-'; + let b: i32 = line[5..] + .iter() + .filter(|&&c| (b'0'..=b'9').contains(&c)) + .fold(0, |a, &x| (a * 10) + (x - b'0') as i32); + + Ins::Addx(if is_neg { -b } else { b }) + } + _ => unreachable!(), + }) + .collect() +} + +fn main() { + for input in INPUTS.iter() { + let output = parse(input); + let score = solution(output); + println!("{}", score); + } +} + +fn solution(input: Vec) -> String { + let mut register = 1i32; + let mut cycle = 0; + let mut line: u64 = 0; + let mut sprite: u64 = 0b111 << 61; + + let mut answer = Vec::with_capacity(10); + + let mut i = 0; + for ip in input.into_iter() { + match ip { + Ins::Noop => { + if sprite & ((1 << 63) >> i) > 0 { + line |= (1 << 63) >> i; + } + + cycle += 1; + i += 1; + + if cycle % 40 == 0 { + answer.push(line); + line = 0; + i = 0; + } + } + Ins::Addx(v) => { + // Noop + if sprite & ((1 << 63) >> i) > 0 { + line |= (1 << 63) >> i; + } + + cycle += 1; + i += 1; + + if cycle % 40 == 0 { + answer.push(line); + line = 0; + i = 0; + } + + // Add + if sprite & ((1 << 63) >> i) > 0 { + line |= (1 << 63) >> i; + } + + register += v; + sprite = (0b111 << 61) >> (register - 1); + + cycle += 1; + i += 1; + + if cycle % 40 == 0 { + answer.push(line); + line = 0; + i = 0; + } + } + } + } + + let mut output = String::with_capacity(40 * 10); + + for row in answer { + for i in 0..40 { + if row & ((1 << 63) >> i) > 0 { + output.push('\u{2588}'); + } else { + output.push(' '); + } + } + output.push('\n'); + } + + output +} + +#[bench] +fn solution_bench(b: &mut test::Bencher) { + b.iter(|| { + let input = parse(INPUTS[1]); + let result = solution(input); + test::black_box(result); + }) +} diff --git a/src/day10/input.txt b/src/day10/input.txt new file mode 100644 index 0000000..e7c314b --- /dev/null +++ b/src/day10/input.txt @@ -0,0 +1,141 @@ +noop +noop +noop +addx 4 +addx 3 +addx 3 +addx 3 +noop +addx 2 +addx 1 +addx -7 +addx 10 +addx 1 +addx 5 +addx -3 +addx -7 +addx 13 +addx 5 +addx 2 +addx 1 +addx -30 +addx -8 +noop +addx 3 +addx 2 +addx 7 +noop +addx -2 +addx 5 +addx 2 +addx -7 +addx 8 +addx 2 +addx 5 +addx 2 +addx -12 +noop +addx 17 +addx 3 +addx -2 +addx 2 +noop +addx 3 +addx -38 +noop +addx 3 +addx 4 +noop +addx 5 +noop +noop +noop +addx 1 +addx 2 +addx 5 +addx 2 +addx -3 +addx 4 +addx 2 +noop +noop +addx 7 +addx -30 +addx 31 +addx 4 +noop +addx -24 +addx -12 +addx 1 +addx 5 +addx 5 +noop +noop +noop +addx -12 +addx 13 +addx 4 +noop +addx 23 +addx -19 +addx 1 +addx 5 +addx 12 +addx -28 +addx 19 +noop +addx 3 +addx 2 +addx 5 +addx -40 +addx 4 +addx 32 +addx -31 +noop +addx 13 +addx -8 +addx 5 +addx 2 +addx 5 +noop +noop +noop +addx 2 +addx -7 +addx 8 +addx -7 +addx 14 +addx 3 +addx -2 +addx 2 +addx 5 +addx -40 +noop +noop +addx 3 +addx 4 +addx 1 +noop +addx 2 +addx 5 +addx 2 +addx 21 +noop +addx -16 +addx 3 +noop +addx 2 +noop +addx 1 +noop +noop +addx 4 +addx 5 +noop +noop +noop +noop +noop +noop +noop + diff --git a/src/day10/sample.txt b/src/day10/sample.txt new file mode 100644 index 0000000..37ee8ee --- /dev/null +++ b/src/day10/sample.txt @@ -0,0 +1,146 @@ +addx 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