#!/usr/bin/env julia using Test struct Instruction cycles :: UInt add :: Int end function parse_instruction_line(line) parts = split(line, limit=2) if parts[1] == "noop" return Instruction(1, 0) elseif parts[1] == "addx" return Instruction(2, parse(Int, parts[2])) else throw(DomainError("Unknown instruction: " * line)) end end function execute_program(io; end_cycle=220) X :: Int = 1 cycle :: Int = 1 signal_strength_sum :: Int = 0 next_test_cycle = 20 for line in eachline(io) if mod(cycle - 20, 40) == 0 && cycle <= end_cycle println(cycle, " ", X) signal_strength_sum += cycle * X next_test_cycle += 40 end inst = parse_instruction_line(line) new_cycle = cycle + inst.cycles if new_cycle > next_test_cycle signal_strength_sum += next_test_cycle * X next_test_cycle += 40 end cycle = new_cycle X += inst.add end println("last inst cycle ", cycle) signal_strength_sum += X * sum(filter(x -> x >= cycle, 20:40:end_cycle)) return signal_strength_sum end function test() @testset "signal strength sum" verbose=true begin @test execute_program("example.txt") == 13140 @test execute_program("input.txt") == 13220 end end function main() if size(ARGS, 1) == 0 test() else infile = ARGS[1] println("infile = ", infile) println("signal strength sum = ", execute_program(infile)) end end main()