Rust Day 10
This commit is contained in:
parent
100a8c3a6a
commit
252f9d9515
6 changed files with 481 additions and 0 deletions
|
@ -59,6 +59,10 @@ path = "src/day08/main.rs"
|
||||||
name = "day09"
|
name = "day09"
|
||||||
path = "src/day09/main.rs"
|
path = "src/day09/main.rs"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "day10"
|
||||||
|
path = "src/day10/main.rs"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
# Required for one of the day06 solutions (commented out)
|
# Required for one of the day06 solutions (commented out)
|
||||||
# phf = { version = "0.11.1", features = ["macros"] }
|
# phf = { version = "0.11.1", features = ["macros"] }
|
137
rust/src/day10/input.txt
Normal file
137
rust/src/day10/input.txt
Normal 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
|
56
rust/src/day10/main.rs
Normal file
56
rust/src/day10/main.rs
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
const INPUT: &str = include_str!("input.txt");
|
||||||
|
|
||||||
|
mod part_1;
|
||||||
|
use part_1::part_1;
|
||||||
|
mod part_2;
|
||||||
|
use part_2::part_2;
|
||||||
|
|
||||||
|
#[non_exhaustive]
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
|
pub(crate) enum Op {
|
||||||
|
Noop,
|
||||||
|
AddX(i64),
|
||||||
|
}
|
||||||
|
|
||||||
|
// Represents the cycle count
|
||||||
|
impl From<Op> for i64 {
|
||||||
|
fn from(op: Op) -> Self {
|
||||||
|
match op {
|
||||||
|
Op::Noop => 1,
|
||||||
|
Op::AddX(_) => 2,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl From<&Op> for i64 {
|
||||||
|
fn from(op: &Op) -> Self {
|
||||||
|
match op {
|
||||||
|
Op::Noop => 1,
|
||||||
|
Op::AddX(_) => 2,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&'static str> for Op {
|
||||||
|
fn from(s: &'static str) -> Self {
|
||||||
|
let bits = s.split(' ').collect::<Vec<_>>();
|
||||||
|
match bits[0] {
|
||||||
|
"noop" => Self::Noop,
|
||||||
|
"addx" => Self::AddX(
|
||||||
|
bits[1]
|
||||||
|
.parse::<i64>()
|
||||||
|
.expect("Non-numerical addx instruction"),
|
||||||
|
),
|
||||||
|
_ => unreachable!("Unknown operation {:?}", bits),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(input: &'static str) -> Vec<Op> {
|
||||||
|
input.lines().map(Op::from).collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
let input = parse_input(INPUT);
|
||||||
|
part_1(&input);
|
||||||
|
part_2(&input);
|
||||||
|
}
|
49
rust/src/day10/part_1.rs
Normal file
49
rust/src/day10/part_1.rs
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
use crate::Op;
|
||||||
|
|
||||||
|
pub(crate) fn part_1(input: &[Op]) -> i64 {
|
||||||
|
let mut cycle = 0i64;
|
||||||
|
let mut register_x = 1;
|
||||||
|
|
||||||
|
let mut values = [0; 6];
|
||||||
|
for op in input {
|
||||||
|
for _ in 0..i64::from(op) {
|
||||||
|
cycle += 1;
|
||||||
|
match cycle {
|
||||||
|
20 => values[0] = register_x * cycle,
|
||||||
|
60 => values[1] = register_x * cycle,
|
||||||
|
100 => values[2] = register_x * cycle,
|
||||||
|
140 => values[3] = register_x * cycle,
|
||||||
|
180 => values[4] = register_x * cycle,
|
||||||
|
220 => values[5] = register_x * cycle,
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
match op {
|
||||||
|
Op::Noop => {}
|
||||||
|
Op::AddX(x) => {
|
||||||
|
register_x += x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let result = values.iter().sum();
|
||||||
|
println!("Part 1: {result}");
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
const SAMPLE_INPUT: &str = include_str!("sample_input.txt");
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_with_solution() {
|
||||||
|
assert_eq!(super::part_1(&crate::parse_input(crate::INPUT)), 14860);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_with_sample_solution() {
|
||||||
|
assert_eq!(super::part_1(&crate::parse_input(SAMPLE_INPUT)), 13140);
|
||||||
|
}
|
||||||
|
}
|
89
rust/src/day10/part_2.rs
Normal file
89
rust/src/day10/part_2.rs
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
use crate::Op;
|
||||||
|
|
||||||
|
const SCREEN_WIDTH: usize = 40;
|
||||||
|
const SCREEN_HEIGHT: usize = 6;
|
||||||
|
|
||||||
|
pub(crate) fn part_2(input: &[Op]) -> [String; SCREEN_HEIGHT] {
|
||||||
|
let mut cycle = 0i64;
|
||||||
|
let mut register_x = 1;
|
||||||
|
let mut current_line = 0;
|
||||||
|
|
||||||
|
let mut result = [
|
||||||
|
String::new(),
|
||||||
|
String::new(),
|
||||||
|
String::new(),
|
||||||
|
String::new(),
|
||||||
|
String::new(),
|
||||||
|
String::new(),
|
||||||
|
];
|
||||||
|
|
||||||
|
for op in input {
|
||||||
|
for _ in 0..i64::from(op) {
|
||||||
|
match cycle {
|
||||||
|
40 => current_line += 1,
|
||||||
|
80 => current_line += 1,
|
||||||
|
120 => current_line += 1,
|
||||||
|
160 => current_line += 1,
|
||||||
|
200 => current_line += 1,
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
cycle += 1;
|
||||||
|
|
||||||
|
let corrected_x = (cycle - 1) - register_x - (current_line * SCREEN_WIDTH) as i64;
|
||||||
|
// println!(
|
||||||
|
// "cycle = {cycle}, register_x = {register_x}, current_line = {current_line}, corrected_x = {corrected_x}",
|
||||||
|
// );
|
||||||
|
|
||||||
|
result[current_line].push(match corrected_x {
|
||||||
|
-1 | 0 | 1 => '#',
|
||||||
|
_ => '.',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
match op {
|
||||||
|
Op::Noop => {}
|
||||||
|
Op::AddX(x) => {
|
||||||
|
register_x += x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("Part2:\n{}", result.join("\n"));
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
const SAMPLE_INPUT: &str = include_str!("sample_input.txt");
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_with_solution() {
|
||||||
|
assert_eq!(
|
||||||
|
super::part_2(&crate::parse_input(crate::INPUT)),
|
||||||
|
[
|
||||||
|
"###...##..####.####.#..#.#..#.###..#..#.",
|
||||||
|
"#..#.#..#....#.#....#..#.#..#.#..#.#.#..",
|
||||||
|
"#..#.#......#..###..####.#..#.#..#.##...",
|
||||||
|
"###..#.##..#...#....#..#.#..#.###..#.#..",
|
||||||
|
"#.#..#..#.#....#....#..#.#..#.#.#..#.#..",
|
||||||
|
"#..#..###.####.####.#..#..##..#..#.#..#.",
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_with_sample_solution() {
|
||||||
|
assert_eq!(
|
||||||
|
super::part_2(&crate::parse_input(SAMPLE_INPUT)),
|
||||||
|
[
|
||||||
|
"##..##..##..##..##..##..##..##..##..##..",
|
||||||
|
"###...###...###...###...###...###...###.",
|
||||||
|
"####....####....####....####....####....",
|
||||||
|
"#####.....#####.....#####.....#####.....",
|
||||||
|
"######......######......######......####",
|
||||||
|
"#######.......#######.......#######.....",
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
146
rust/src/day10/sample_input.txt
Normal file
146
rust/src/day10/sample_input.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
|
Loading…
Reference in a new issue