day10 finished
This commit is contained in:
parent
f630ef6874
commit
54fd03233a
6 changed files with 464 additions and 2 deletions
146
data/day10/example01.txt
Normal file
146
data/day10/example01.txt
Normal 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
|
||||||
6
data/day10/expected01.txt
Normal file
6
data/day10/expected01.txt
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
## ## ## ## ## ## ## ## ## ##
|
||||||
|
### ### ### ### ### ### ###
|
||||||
|
#### #### #### #### ####
|
||||||
|
##### ##### ##### #####
|
||||||
|
###### ###### ###### ####
|
||||||
|
####### ####### #######
|
||||||
143
data/day10/input.txt
Normal file
143
data/day10/input.txt
Normal file
|
|
@ -0,0 +1,143 @@
|
||||||
|
noop
|
||||||
|
addx 26
|
||||||
|
addx -21
|
||||||
|
addx 2
|
||||||
|
addx 3
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 23
|
||||||
|
addx -17
|
||||||
|
addx -1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 7
|
||||||
|
noop
|
||||||
|
addx 3
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
addx 7
|
||||||
|
noop
|
||||||
|
addx -12
|
||||||
|
addx 13
|
||||||
|
addx -38
|
||||||
|
addx 5
|
||||||
|
addx 34
|
||||||
|
addx -2
|
||||||
|
addx -29
|
||||||
|
addx 2
|
||||||
|
addx 5
|
||||||
|
addx 2
|
||||||
|
addx 3
|
||||||
|
addx -2
|
||||||
|
addx -1
|
||||||
|
addx 8
|
||||||
|
addx 2
|
||||||
|
addx 6
|
||||||
|
addx -26
|
||||||
|
addx 23
|
||||||
|
addx -26
|
||||||
|
addx 33
|
||||||
|
addx 2
|
||||||
|
addx -37
|
||||||
|
addx -1
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 5
|
||||||
|
addx 5
|
||||||
|
addx 3
|
||||||
|
addx -2
|
||||||
|
addx 2
|
||||||
|
addx 5
|
||||||
|
addx 5
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -2
|
||||||
|
addx 4
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 3
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 7
|
||||||
|
addx -1
|
||||||
|
addx -35
|
||||||
|
addx -1
|
||||||
|
addx 5
|
||||||
|
addx 3
|
||||||
|
noop
|
||||||
|
addx 4
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 5
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -7
|
||||||
|
addx 12
|
||||||
|
addx 2
|
||||||
|
addx 7
|
||||||
|
noop
|
||||||
|
addx -2
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 7
|
||||||
|
addx 2
|
||||||
|
addx -39
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 5
|
||||||
|
addx 2
|
||||||
|
addx -4
|
||||||
|
addx 25
|
||||||
|
addx -18
|
||||||
|
addx 7
|
||||||
|
noop
|
||||||
|
addx -2
|
||||||
|
addx 5
|
||||||
|
addx 2
|
||||||
|
addx 6
|
||||||
|
addx -5
|
||||||
|
addx 2
|
||||||
|
addx -22
|
||||||
|
addx 29
|
||||||
|
addx -21
|
||||||
|
addx -7
|
||||||
|
addx 31
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
addx -36
|
||||||
|
addx 1
|
||||||
|
addx 5
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
addx 4
|
||||||
|
addx 5
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 3
|
||||||
|
noop
|
||||||
|
addx -13
|
||||||
|
addx 15
|
||||||
|
noop
|
||||||
|
addx 5
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx 3
|
||||||
|
addx 2
|
||||||
|
addx 4
|
||||||
|
addx 3
|
||||||
|
noop
|
||||||
|
addx -3
|
||||||
|
noop
|
||||||
165
src/days/day10/mod.rs
Normal file
165
src/days/day10/mod.rs
Normal file
|
|
@ -0,0 +1,165 @@
|
||||||
|
use super::template::{DayTrait, ResultType};
|
||||||
|
use std::{num::ParseIntError, slice::Iter};
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
|
const DAY_NUMBER: usize = 10;
|
||||||
|
|
||||||
|
pub struct Day;
|
||||||
|
|
||||||
|
impl DayTrait for Day {
|
||||||
|
fn get_day_number(&self) -> usize {
|
||||||
|
DAY_NUMBER
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part1(&self, lines: &[String]) -> anyhow::Result<ResultType> {
|
||||||
|
let instructions = lines
|
||||||
|
.iter()
|
||||||
|
.map(|line| Instruction::parse(line))
|
||||||
|
.collect::<Result<Vec<_>, _>>()?;
|
||||||
|
let result = CpuCycles::signal_strength(&instructions, &[20, 60, 100, 140, 180, 220]);
|
||||||
|
Ok(ResultType::Integer(result as i64))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2(&self, lines: &[String]) -> anyhow::Result<ResultType> {
|
||||||
|
let instructions = lines
|
||||||
|
.iter()
|
||||||
|
.map(|line| Instruction::parse(line))
|
||||||
|
.collect::<Result<Vec<_>, _>>()?;
|
||||||
|
let result = CpuCycles::draw(&instructions);
|
||||||
|
Ok(ResultType::Lines(result))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Error)]
|
||||||
|
enum CpuError {
|
||||||
|
#[error("unknown instruction: {0}")]
|
||||||
|
UnknownInstruction(String),
|
||||||
|
|
||||||
|
#[error("could not parse Number")]
|
||||||
|
InvalidInteger(#[from] ParseIntError),
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Instruction {
|
||||||
|
Add(i32),
|
||||||
|
Noop,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Instruction {
|
||||||
|
pub fn parse(line: &str) -> Result<Self, CpuError> {
|
||||||
|
if line == "noop" {
|
||||||
|
Ok(Instruction::Noop)
|
||||||
|
} else if line.starts_with("addx") {
|
||||||
|
let value = line[5..].parse()?;
|
||||||
|
Ok(Instruction::Add(value))
|
||||||
|
} else {
|
||||||
|
Err(CpuError::UnknownInstruction(line.to_owned()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct CpuCycles<'a> {
|
||||||
|
register: i32,
|
||||||
|
instructions: Iter<'a, Instruction>,
|
||||||
|
current: Option<i32>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> CpuCycles<'a> {
|
||||||
|
pub fn create(instructions: &'a [Instruction]) -> Self {
|
||||||
|
Self {
|
||||||
|
instructions: instructions.iter(),
|
||||||
|
register: 1,
|
||||||
|
current: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn signal_strength(instructions: &'a [Instruction], to_collect: &[usize]) -> i32 {
|
||||||
|
CpuCycles::create(instructions)
|
||||||
|
.enumerate()
|
||||||
|
.filter_map(|(cycle, register)| {
|
||||||
|
if to_collect.contains(&(cycle + 1)) {
|
||||||
|
Some(register * (cycle + 1) as i32)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.sum()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn draw(instructions: &'a [Instruction]) -> Vec<String> {
|
||||||
|
let mut result = Vec::new();
|
||||||
|
let mut line = "".to_owned();
|
||||||
|
for (cycle, sprite) in CpuCycles::create(instructions).enumerate() {
|
||||||
|
let cycle = (cycle % 40) as i32;
|
||||||
|
if (sprite - cycle).abs() <= 1 {
|
||||||
|
line.push('#');
|
||||||
|
} else {
|
||||||
|
line.push(' ');
|
||||||
|
}
|
||||||
|
if cycle == 39 {
|
||||||
|
result.push(line.to_owned());
|
||||||
|
line = "".to_owned();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Iterator for CpuCycles<'a> {
|
||||||
|
type Item = i32;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
if let Some(value) = self.current {
|
||||||
|
let start_register = self.register;
|
||||||
|
self.register += value;
|
||||||
|
self.current = None;
|
||||||
|
Some(start_register)
|
||||||
|
} else if let Some(instruction) = self.instructions.next() {
|
||||||
|
match instruction {
|
||||||
|
Instruction::Add(value) => self.current = Some(*value),
|
||||||
|
Instruction::Noop => {}
|
||||||
|
}
|
||||||
|
Some(self.register)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
use crate::common::file::read_lines;
|
||||||
|
use anyhow::Result;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_simple() -> Result<()> {
|
||||||
|
let instructions = vec![Instruction::Noop, Instruction::Add(3), Instruction::Add(-5)];
|
||||||
|
let expected = vec![1, 1, 1, 4, 4];
|
||||||
|
let result = CpuCycles::create(&instructions).collect::<Vec<_>>();
|
||||||
|
assert_eq!(result, expected);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_part1() -> Result<()> {
|
||||||
|
let day = Day {};
|
||||||
|
let lines = read_lines(day.get_day_number(), "example01.txt")?;
|
||||||
|
let expected = ResultType::Integer(13140);
|
||||||
|
let result = day.part1(&lines)?;
|
||||||
|
assert_eq!(result, expected);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_part2() -> Result<()> {
|
||||||
|
let day = Day {};
|
||||||
|
let lines = read_lines(day.get_day_number(), "example01.txt")?;
|
||||||
|
let expected = ResultType::Lines(read_lines(day.get_day_number(), "expected01.txt")?);
|
||||||
|
let result = day.part2(&lines)?;
|
||||||
|
assert_eq!(result, expected);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -7,6 +7,7 @@ mod day06;
|
||||||
mod day07;
|
mod day07;
|
||||||
mod day08;
|
mod day08;
|
||||||
mod day09;
|
mod day09;
|
||||||
|
mod day10;
|
||||||
mod template;
|
mod template;
|
||||||
|
|
||||||
pub use template::DayTrait;
|
pub use template::DayTrait;
|
||||||
|
|
@ -16,7 +17,7 @@ pub mod day_provider {
|
||||||
use super::*;
|
use super::*;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
const MAX_DAY: usize = 9;
|
const MAX_DAY: usize = 10;
|
||||||
|
|
||||||
pub fn get_day(day_num: usize) -> Result<Box<dyn DayTrait>, ProviderError> {
|
pub fn get_day(day_num: usize) -> Result<Box<dyn DayTrait>, ProviderError> {
|
||||||
match day_num {
|
match day_num {
|
||||||
|
|
@ -29,6 +30,7 @@ pub mod day_provider {
|
||||||
7 => Ok(Box::new(day07::Day)),
|
7 => Ok(Box::new(day07::Day)),
|
||||||
8 => Ok(Box::new(day08::Day)),
|
8 => Ok(Box::new(day08::Day)),
|
||||||
9 => Ok(Box::new(day09::Day)),
|
9 => Ok(Box::new(day09::Day)),
|
||||||
|
10 => Ok(Box::new(day10::Day)),
|
||||||
_ => Err(ProviderError::InvalidNumber(day_num)),
|
_ => Err(ProviderError::InvalidNumber(day_num)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ fn output(day: usize, part: usize, result: ResultType, time: Duration) {
|
||||||
time.as_secs_f32()
|
time.as_secs_f32()
|
||||||
);
|
);
|
||||||
for line in &value[1..] {
|
for line in &value[1..] {
|
||||||
println!(" part : {line}");
|
println!(" {line}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ResultType::Nothing => {}
|
ResultType::Nothing => {}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue