enum COMMAND { ADD, NOP } struct CMD { cmd :COMMAND, op :i32 } fn parse_inp(inp :&Vec) -> Vec { let mut res = vec![]; for s in inp { let split = s.split(' ').collect::>(); match split[0] { "addx" => { res.push(CMD {cmd: COMMAND::ADD, op: split[1].parse::().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) { let mut cycle = 0; let mut sum = 0; let mut x_reg = 1; let parsed_inp :Vec = 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); }