You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.4 KiB
64 lines
1.4 KiB
#!/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()
|