80 lines
1.4 KiB
Rust
80 lines
1.4 KiB
Rust
|
|
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);
|
|
|
|
} |