2022 - Day 10

This commit is contained in:
Dreaded_X 2022-12-10 17:11:13 +01:00
parent e1a993e56b
commit 068b675982
3 changed files with 420 additions and 0 deletions

137
2022/input/10/input Normal file
View File

@ -0,0 +1,137 @@
noop
noop
addx 5
addx 3
addx -2
noop
addx 5
addx 4
noop
addx 3
noop
addx 2
addx -17
addx 18
addx 3
addx 1
noop
addx 5
noop
addx 1
addx 2
addx 5
addx -40
noop
addx 5
addx 2
addx 3
noop
addx 2
addx 3
addx -2
addx 2
addx 2
noop
addx 3
addx 5
addx 2
addx 3
addx -2
addx 2
addx -24
addx 31
addx 2
addx -33
addx -6
addx 5
addx 2
addx 3
noop
addx 2
addx 3
noop
addx 2
addx -1
addx 6
noop
noop
addx 1
addx 4
noop
noop
addx -15
addx 20
noop
addx -23
addx 27
noop
addx -35
addx 1
noop
noop
addx 5
addx 11
addx -10
addx 4
addx 1
noop
addx 2
addx 2
noop
addx 3
noop
addx 3
addx 2
noop
addx 3
addx 2
addx 11
addx -4
addx 2
addx -38
addx -1
addx 2
noop
addx 3
addx 5
addx 2
addx -7
addx 8
addx 2
addx 2
noop
addx 3
addx 5
addx 2
addx -25
addx 26
addx 2
addx 8
addx -1
addx 2
addx -2
addx -37
addx 5
addx 3
addx -1
addx 5
noop
addx 22
addx -21
addx 2
addx 5
addx 2
addx 13
addx -12
addx 4
noop
noop
addx 5
addx 1
noop
noop
addx 2
noop
addx 3
noop
noop

146
2022/input/10/test-1 Normal file
View File

@ -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

137
2022/src/bin/day10.rs Normal file
View File

@ -0,0 +1,137 @@
#![feature(test)]
use anyhow::Result;
use aoc::Solver;
// -- Runners --
fn main() -> Result<()> {
Day::solve()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn part1_test1() -> Result<()> {
Day::test(aoc::Part::ONE, "test-1", 13140)
}
#[test]
fn part1_solution() -> Result<()> {
Day::test(aoc::Part::ONE, "input", 13220)
}
#[test]
fn part2_test1() -> Result<()> {
Day::test(aoc::Part::TWO, "test-1", -1)
}
// Benchmarks
extern crate test;
#[bench]
#[ignore]
fn part1_bench(b: &mut test::Bencher) {
Day::benchmark(aoc::Part::ONE, b)
}
#[bench]
#[ignore]
fn part2_bench(b: &mut test::Bencher) {
Day::benchmark(aoc::Part::TWO, b)
}
}
enum Instruction {
NoOp,
AddX(isize),
}
struct CPU {
x: isize
}
impl CPU {
fn new() -> Self {
Self { x: 1 }
}
// Executes the given instruction
// Returns the number of cycles that it took to execute the instruction
// Also returns the value of x during the execution (SO NOT THE FINAL VALUE)
fn execute(&mut self, instruction: &Instruction) -> (isize, isize) {
match instruction {
Instruction::NoOp => (1, self.x),
Instruction::AddX(value) => {
let state = (2, self.x);
self.x += value;
return state;
}
}
}
}
fn parse(input: &str) -> Vec<Instruction> {
input.lines()
.map(|line| line.split(" ").collect::<Vec<_>>())
.map(|line| match line.as_slice() {
["noop"] => Instruction::NoOp,
["addx", value] => Instruction::AddX(value.parse().unwrap()),
_ => panic!("Unknown instruction")
})
.collect::<Vec<_>>()
}
// -- Solution --
pub struct Day;
impl aoc::Solver for Day {
type Output = isize;
fn day() -> u8 {
10
}
fn part1(input: &str) -> Self::Output {
let instructions = parse(input);
let mut cpu = CPU::new();
let mut cycle = 1;
let mut sum = 0;
for instruction in instructions {
let (cycle_count, x) = cpu.execute(&instruction);
for c in 0..cycle_count {
let cc = cycle + c;
if (cc+ 20) % 40 == 0 {
sum += x * cc;
}
}
cycle += cycle_count;
}
sum
}
fn part2(input: &str) -> Self::Output {
let instructions = parse(input);
let mut cpu = CPU::new();
let mut cycle = 1;
for instruction in instructions {
let (cycle_count, x) = cpu.execute(&instruction);
for c in 0..cycle_count {
let ccm = (cycle + c - 1) % 40;
let mut sign = ' ';
if ccm-1 == x || ccm == x || ccm+1 == x {
sign = '#';
}
print!("{}", sign);
if ccm == 39 {
println!("");
}
}
cycle += cycle_count;
}
// @TODO Figure out how we return this
0
}
}