This commit is contained in:
2022-12-10 12:39:51 +01:00
parent c8ea1f9fa2
commit fd764a46f1
5 changed files with 418 additions and 0 deletions

137
inputs/day10.txt Normal file
View File

@@ -0,0 +1,137 @@
noop
addx 7
addx -1
addx -1
addx 5
noop
noop
addx 1
addx 3
addx 2
noop
addx 2
addx 5
addx 2
addx 10
addx -9
addx 4
noop
noop
noop
addx 3
addx 5
addx -40
addx 26
addx -23
addx 2
addx 5
addx 26
addx -35
addx 12
addx 2
addx 17
addx -10
addx 3
noop
addx 2
addx 3
noop
addx 2
addx 3
noop
addx 2
addx 2
addx -39
noop
addx 15
addx -12
addx 2
addx 10
noop
addx -1
addx -2
noop
addx 5
noop
addx 5
noop
noop
addx 1
addx 4
addx -25
addx 26
addx 2
addx 5
addx 2
noop
addx -3
addx -32
addx 1
addx 4
addx -2
addx 3
noop
noop
addx 3
noop
addx 6
addx -17
addx 27
addx -7
addx 5
addx 2
addx 3
addx -2
addx 4
noop
noop
addx 5
addx 2
addx -39
noop
noop
addx 2
addx 5
addx 3
addx -2
addx 2
addx 11
addx -4
addx -5
noop
addx 10
addx -18
addx 19
addx 2
addx 5
addx 2
addx 2
addx 3
addx -2
addx 2
addx -37
noop
addx 5
addx 4
addx -1
noop
addx 4
noop
noop
addx 1
addx 4
noop
addx 1
addx 2
noop
addx 3
addx 5
noop
addx -3
addx 5
addx 5
addx 2
addx 3
noop
addx -32
noop

8
src/bin/day10_1.rs Normal file
View File

@@ -0,0 +1,8 @@
use std::fs;
use aoc2022::day10::process_part_1;
fn main() {
let file = fs::read_to_string("./inputs/day10.txt").unwrap();
println!("{}", process_part_1(&file));
}

8
src/bin/day10_2.rs Normal file
View File

@@ -0,0 +1,8 @@
use std::fs;
use aoc2022::day10::process_part_2;
fn main() {
let file = fs::read_to_string("./inputs/day10.txt").unwrap();
println!("{}", process_part_2(&file));
}

264
src/day10.rs Normal file
View File

@@ -0,0 +1,264 @@
use nom::branch::alt;
use nom::bytes::complete::tag;
use nom::character::complete;
use nom::character::complete::newline;
use nom::combinator::map;
use nom::multi::separated_list1;
use nom::IResult;
pub fn process_part_1(input: &str) -> i32 {
let (_, instructions) = parse_instructions(input).unwrap();
let mut x = 1;
let mut strengths: Vec<i32> = vec![];
let mut cycle = 1;
for instruction in instructions {
match instruction {
Instruction::AddX(v) => {
cycle += 1;
if (cycle + 20) % 40 == 0 {
strengths.push(cycle * x);
}
x += v;
}
Instruction::Noop => {}
}
cycle += 1;
if (cycle + 20) % 40 == 0 {
strengths.push(cycle * x);
}
}
strengths.iter().sum()
}
pub fn process_part_2(input: &str) -> String {
let window_width = 40;
let window_height = 6;
let (_, instructions) = parse_instructions(input).unwrap();
let mut x = 1;
let mut cycle = 1;
let mut buf = String::with_capacity((window_width + 1) * window_height);
for instruction in instructions {
draw(&mut buf, cycle, x);
match instruction {
Instruction::AddX(v) => {
cycle += 1;
draw(&mut buf, cycle, x);
x += v;
}
Instruction::Noop => {}
}
cycle += 1;
}
buf
}
// I've swapped the characters to something... more readable than the original '#' and '.'
fn draw(buf: &mut String, cycle: usize, x: i32) {
if x.abs_diff(((cycle - 1) % 40) as i32) < 2 {
buf.push('█');
} else {
buf.push(' ');
}
if (cycle) % 40 == 0 {
buf.push('\n');
}
}
#[derive(Debug)]
enum Instruction {
Noop,
AddX(i32),
}
fn parse_instructions(input: &str) -> IResult<&str, Vec<Instruction>> {
separated_list1(newline, parse_instruction)(input)
}
fn parse_instruction(input: &str) -> IResult<&str, Instruction> {
alt((map(tag("noop"), |_| Instruction::Noop), parse_addx))(input)
}
fn parse_addx(input: &str) -> IResult<&str, Instruction> {
let (input, _) = tag("addx ")(input)?;
let (input, value) = complete::i32(input)?;
Ok((input, Instruction::AddX(value)))
}
#[cfg(test)]
mod tests {
use super::*;
const INPUT: &str = "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";
#[test]
fn day1() {
assert_eq!(process_part_1(INPUT), 13140);
}
#[test]
fn day2() {
assert_eq!(
process_part_2(INPUT),
"██ ██ ██ ██ ██ ██ ██ ██ ██ ██
███ ███ ███ ███ ███ ███ ███
████ ████ ████ ████ ████
█████ █████ █████ █████
██████ ██████ ██████ ████
███████ ███████ ███████
"
);
}
}

View File

@@ -10,3 +10,4 @@ pub mod day06;
pub mod day07;
pub mod day08;
pub mod day09;
pub mod day10;