days 7-10

This commit is contained in:
2022-12-11 23:52:03 +00:00
parent 474ad0a248
commit db450943a0
9 changed files with 355 additions and 0 deletions
+83
View File
@@ -0,0 +1,83 @@
use std::collections::VecDeque;
use std::io::{self, BufRead, Write};
#[derive(Debug)]
struct Operation {
opcode: String,
arg: Option<isize>,
cycles: usize,
}
const SIGNAL_TICK_COUNT: usize = 220;
const DRAW_CRT: usize = 240;
fn main() {
let lines = io::stdin().lock().lines().map(|l| l.unwrap());
let mut program: Vec<Operation> = vec![];
let mut queue: VecDeque<&Operation> = VecDeque::new();
for line in lines {
let cmd = line.split(' ').collect::<Vec<&str>>();
let op = cmd.first().unwrap();
let mut arg: Option<isize> = None;
if let Some(num) = cmd.get(1) {
arg = Some(num.parse::<isize>().unwrap());
}
let cycles = match op {
&"noop" => 1,
&"addx" => 2,
invalid => panic!("invalid opcode {}", invalid),
};
program.push(Operation {
opcode: op.to_string(),
arg,
cycles,
});
}
// init counters, program and queue
let mut x = 1;
let mut current_op = program.first().unwrap();
let mut cycles_remaining_for_current = current_op.cycles;
let mut signal_sum = 0;
let mut screen = [[false; 40]; 6];
for (screen_idx, i) in (1..DRAW_CRT + 1).enumerate() {
if cycles_remaining_for_current == 0 {
if current_op.opcode == "addx" {
x += current_op.arg.unwrap();
}
current_op = queue.pop_front().unwrap();
cycles_remaining_for_current = current_op.cycles;
}
let cmd = program.get(i % program.len()).unwrap();
queue.push_back(cmd);
cycles_remaining_for_current -= 1;
match i {
20 | 60 | 100 | 140 | 180 | 220 => signal_sum += x * i as isize,
_ => (),
}
let (scrx, scry): (usize, usize) = (screen_idx / 40, screen_idx % 40);
screen[scrx][scry] = x == screen_idx as isize % 40
|| x - 1 == screen_idx as isize % 40
|| x + 1 == screen_idx as isize % 40;
if i == SIGNAL_TICK_COUNT {
println!("{}", signal_sum);
}
}
draw_screen(&screen);
}
fn draw_screen(screen: &[[bool; 40]; 6]) {
let mut lock = io::stdout().lock();
for y in 0..6 {
for x in 0..40 {
write!(lock, "{}", if screen[y][x] { "#" } else { "." }).unwrap()
}
writeln!(lock).unwrap();
}
}