Add day 10
This commit is contained in:
parent
e76573b78c
commit
c447b7fc71
@ -45,4 +45,8 @@ path = "src/day8/main.rs"
|
||||
name = "day9"
|
||||
path = "src/day9/main.rs"
|
||||
|
||||
[[bin]]
|
||||
name = "day10"
|
||||
path = "src/day10/main.rs"
|
||||
|
||||
[dependencies]
|
||||
|
137
day10.txt
Normal file
137
day10.txt
Normal 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
day10_test.txt
Normal file
146
day10_test.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
|
131
src/day10/main.rs
Normal file
131
src/day10/main.rs
Normal file
@ -0,0 +1,131 @@
|
||||
use base::read_file;
|
||||
|
||||
struct CRT {
|
||||
display: [[char; 40]; 6],
|
||||
row_idx: usize,
|
||||
col_idx: usize,
|
||||
}
|
||||
|
||||
impl CRT {
|
||||
fn new() -> Self {
|
||||
Self {
|
||||
display: [['\0'; 40]; 6],
|
||||
col_idx: 0,
|
||||
row_idx: 0,
|
||||
}
|
||||
}
|
||||
|
||||
fn clock(&mut self, register: i32) {
|
||||
if self.col_idx >= 6 || self.row_idx >= 40 {
|
||||
return;
|
||||
}
|
||||
let range = ((register - 1).max(0))..=((register + 1).min(39));
|
||||
self.display[self.col_idx][self.row_idx] = if range.contains(&(self.row_idx as i32)) { '⭐' } else { '🌲' };
|
||||
|
||||
self.row_idx += 1;
|
||||
if self.row_idx % 40 == 0 {
|
||||
self.row_idx = 0;
|
||||
self.col_idx += 1;
|
||||
};
|
||||
}
|
||||
|
||||
fn display(&self) {
|
||||
for col in 0..6 {
|
||||
for row in 0..40 {
|
||||
print!("{}", self.display[col][row]);
|
||||
}
|
||||
println!();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
enum Op {
|
||||
NOOP,
|
||||
ADD {
|
||||
amount: i32
|
||||
},
|
||||
}
|
||||
|
||||
struct Machine {
|
||||
program: Vec<Op>,
|
||||
register: i32,
|
||||
register_next: i32,
|
||||
instruction_counter: usize,
|
||||
instruction_left_counter: u32,
|
||||
current_option: Option<Op>,
|
||||
}
|
||||
|
||||
impl Machine {
|
||||
fn new(program: Vec<Op>) -> Self {
|
||||
Self {
|
||||
program,
|
||||
register: 1,
|
||||
register_next: 1,
|
||||
instruction_counter: 0,
|
||||
instruction_left_counter: 0,
|
||||
current_option: None,
|
||||
}
|
||||
}
|
||||
|
||||
fn clock(&mut self, crt: &mut CRT) {
|
||||
self.register = self.register_next;
|
||||
crt.clock(self.register);
|
||||
if self.instruction_left_counter == 0 {
|
||||
if self.instruction_counter >= self.program.len() {
|
||||
self.current_option = None;
|
||||
self.instruction_left_counter = 0;
|
||||
return;
|
||||
}
|
||||
let next_op = self.program[self.instruction_counter];
|
||||
self.instruction_counter += 1;
|
||||
match next_op {
|
||||
Op::NOOP => {
|
||||
self.instruction_left_counter = 0;
|
||||
}
|
||||
Op::ADD { .. } => {
|
||||
self.instruction_left_counter = 1;
|
||||
}
|
||||
}
|
||||
self.current_option = Some(next_op);
|
||||
} else {
|
||||
if let Some(current_op) = self.current_option {
|
||||
match current_op {
|
||||
Op::NOOP => {}
|
||||
Op::ADD { amount } => { self.register_next = self.register + amount; }
|
||||
}
|
||||
}
|
||||
self.instruction_left_counter -= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let lines = read_file("day10.txt");
|
||||
let mut ops = vec![];
|
||||
for line in lines {
|
||||
if line.starts_with("noop") { ops.push(Op::NOOP); } else if line.starts_with("addx") {
|
||||
let amount = line.split_whitespace().collect::<Vec<_>>()[1].parse::<i32>().unwrap();
|
||||
ops.push(Op::ADD { amount });
|
||||
}
|
||||
}
|
||||
|
||||
let mut crt = CRT::new();
|
||||
let mut machine = Machine::new(ops);
|
||||
|
||||
let mut signals = vec![];
|
||||
|
||||
for cycle in 0..2220 {
|
||||
machine.clock(&mut crt);
|
||||
let cycle = cycle + 1;
|
||||
match cycle {
|
||||
20 | 60 | 100 | 140 | 180 | 220 => {
|
||||
signals.push(cycle * machine.register);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
println!("Sum: {}", signals.iter().sum::<i32>());
|
||||
crt.display();
|
||||
}
|
Loading…
Reference in New Issue
Block a user