init
This commit is contained in:
80
d10/src/a1.rs
Normal file
80
d10/src/a1.rs
Normal file
@ -0,0 +1,80 @@
|
||||
|
||||
enum COMMAND {
|
||||
ADD,
|
||||
NOP
|
||||
}
|
||||
|
||||
struct CMD {
|
||||
cmd :COMMAND,
|
||||
op :i32
|
||||
}
|
||||
|
||||
fn parse_inp(inp :&Vec<String>) -> Vec<CMD> {
|
||||
|
||||
let mut res = vec![];
|
||||
|
||||
for s in inp {
|
||||
let split = s.split(' ').collect::<Vec<&str>>();
|
||||
match split[0] {
|
||||
"addx" => {
|
||||
res.push(CMD {cmd: COMMAND::ADD, op: split[1].parse::<i32>().unwrap()});
|
||||
}
|
||||
|
||||
"noop" => {
|
||||
res.push(CMD {cmd: COMMAND::NOP, op: 0});
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
|
||||
}
|
||||
|
||||
fn check_cycle(sum :&mut i32, x_reg :&i32, cycle :&i32) {
|
||||
|
||||
|
||||
if (*cycle + 20) % 40 == 0 {
|
||||
*sum += *x_reg * *cycle;
|
||||
println!("{}, {}, {}, {}", cycle, x_reg, cycle * x_reg, sum);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pub fn run(inp :Vec<String>) {
|
||||
|
||||
let mut cycle = 0;
|
||||
|
||||
let mut sum = 0;
|
||||
|
||||
let mut x_reg = 1;
|
||||
|
||||
let parsed_inp :Vec<CMD> = parse_inp(&inp);
|
||||
|
||||
for cmd in parsed_inp {
|
||||
|
||||
match cmd.cmd {
|
||||
COMMAND::ADD => {
|
||||
cycle += 1;
|
||||
|
||||
check_cycle(&mut sum, &x_reg, &cycle);
|
||||
|
||||
cycle += 1;
|
||||
|
||||
check_cycle(&mut sum, &x_reg, &cycle);
|
||||
|
||||
x_reg += cmd.op;
|
||||
}
|
||||
|
||||
COMMAND::NOP => {
|
||||
cycle += 1;
|
||||
|
||||
check_cycle(&mut sum, &x_reg, &cycle);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
println!("a1: {}", sum);
|
||||
|
||||
}
|
96
d10/src/a2.rs
Normal file
96
d10/src/a2.rs
Normal file
@ -0,0 +1,96 @@
|
||||
|
||||
enum COMMAND {
|
||||
ADD,
|
||||
NOP
|
||||
}
|
||||
|
||||
struct CMD {
|
||||
cmd :COMMAND,
|
||||
op :i32
|
||||
}
|
||||
|
||||
fn parse_inp(inp :&Vec<String>) -> Vec<CMD> {
|
||||
|
||||
let mut res = vec![];
|
||||
|
||||
for s in inp {
|
||||
let split = s.split(' ').collect::<Vec<&str>>();
|
||||
match split[0] {
|
||||
"addx" => {
|
||||
res.push(CMD {cmd: COMMAND::ADD, op: split[1].parse::<i32>().unwrap()});
|
||||
}
|
||||
|
||||
"noop" => {
|
||||
res.push(CMD {cmd: COMMAND::NOP, op: 0});
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
|
||||
}
|
||||
|
||||
fn check_cycle(width :&usize, height :&usize, screen :&mut Vec<char>, x_reg :&i32, cycle :&i32) {
|
||||
|
||||
if (cycle-1) as usize >= width * height {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((x_reg-1)..=(x_reg+1)).contains(&((cycle-1) % (*width as i32))) {
|
||||
screen[(cycle-1) as usize] = '#';
|
||||
println!("{}, {}", cycle-1, x_reg, );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
pub fn run(inp :Vec<String>) {
|
||||
|
||||
const SCREEN_WIDTH :usize = 40;
|
||||
const SCREEN_HEIGHT :usize = 6;
|
||||
|
||||
let mut screen :Vec<char> = vec!['.'; SCREEN_HEIGHT * SCREEN_WIDTH];
|
||||
|
||||
let mut cycle = 0;
|
||||
|
||||
let mut x_reg = 1;
|
||||
|
||||
let parsed_inp :Vec<CMD> = parse_inp(&inp);
|
||||
|
||||
for cmd in parsed_inp {
|
||||
|
||||
match cmd.cmd {
|
||||
COMMAND::ADD => {
|
||||
cycle += 1;
|
||||
|
||||
check_cycle(&SCREEN_WIDTH, &SCREEN_HEIGHT, &mut screen, &x_reg, &cycle);
|
||||
|
||||
cycle += 1;
|
||||
|
||||
check_cycle(&SCREEN_WIDTH, &SCREEN_HEIGHT, &mut screen, &x_reg, &cycle);
|
||||
|
||||
x_reg += cmd.op;
|
||||
}
|
||||
|
||||
COMMAND::NOP => {
|
||||
cycle += 1;
|
||||
check_cycle(&SCREEN_WIDTH, &SCREEN_HEIGHT, &mut screen, &x_reg, &cycle);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
println!("a2:");
|
||||
|
||||
for i in 0..screen.len() {
|
||||
if i % SCREEN_WIDTH == 0 {
|
||||
println!("");
|
||||
}
|
||||
print!("{}", screen[i]);
|
||||
}
|
||||
|
||||
}
|
41
d10/src/main.rs
Normal file
41
d10/src/main.rs
Normal file
@ -0,0 +1,41 @@
|
||||
use std::io::BufRead;
|
||||
|
||||
mod a1;
|
||||
mod a2;
|
||||
|
||||
fn read_file(path :&str) -> Vec<String> {
|
||||
|
||||
let file = std::fs::File::open(path);
|
||||
|
||||
return match file {
|
||||
|
||||
Ok(handle) => {
|
||||
|
||||
let reader = std::io::BufReader::new(handle);
|
||||
|
||||
let mut vec : Vec<String> = vec![];
|
||||
|
||||
reader.lines().for_each(|elem| {
|
||||
vec.push(elem.unwrap());
|
||||
});
|
||||
|
||||
vec
|
||||
|
||||
}
|
||||
|
||||
Err(_) => vec![]
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
||||
let inp :Vec<String> = read_file("input.txt");
|
||||
|
||||
a1::run(inp.clone());
|
||||
|
||||
a2::run(inp);
|
||||
|
||||
}
|
Reference in New Issue
Block a user