day-09.jl (2887B)
1 function computer(program, input) 2 program = Dict(enumerate(copy(program))) 3 output = [] 4 pc = 1 5 relative_base = 0 6 function get_param(loc, mode) 7 # Loc is gauranteed to exist. 8 if mode == 0 9 # Position mode. 10 get(program, program[loc] + 1, 0) 11 elseif mode == 1 12 # Immediate mode. 13 program[loc] 14 else 15 # Relative mode. 16 get(program, relative_base + program[loc] + 1, 0) 17 end 18 end 19 function get_res_loc(loc, mode) 20 # Loc is gauranteed to exist. 21 if mode == 0 22 # Position mode. 23 program[loc] + 1 24 else 25 # Relative mode. 26 relative_base + program[loc] + 1 27 end 28 end 29 while true 30 op_code = program[pc] % 100 31 mode_1 = (program[pc] % 1000) ÷ 100 32 mode_2 = (program[pc] % 10000) ÷ 1000 33 mode_3 = (program[pc] % 100000) ÷ 10000 34 if op_code == 1 35 program[get_res_loc(pc + 3, mode_3)] = ( 36 get_param(pc + 1, mode_1) 37 + get_param(pc + 2, mode_2) 38 ) 39 pc += 4 40 elseif op_code == 2 41 program[get_res_loc(pc + 3, mode_3)] = ( 42 get_param(pc + 1, mode_1) 43 * get_param(pc + 2, mode_2) 44 ) 45 pc += 4 46 elseif op_code == 3 47 program[get_res_loc(pc + 1, mode_1)] = input 48 pc += 2 49 elseif op_code == 4 50 push!(output, get_param(pc + 1, mode_1)) 51 pc += 2 52 elseif op_code == 5 53 if get_param(pc + 1, mode_1) != 0 54 pc = get_param(pc + 2, mode_2) + 1 55 else 56 pc += 3 57 end 58 elseif op_code == 6 59 if get_param(pc + 1, mode_1) == 0 60 pc = get_param(pc + 2, mode_2) + 1 61 else 62 pc += 3 63 end 64 elseif op_code == 7 65 program[get_res_loc(pc + 3, mode_3)] = ( 66 get_param(pc + 1, mode_1) 67 < get_param(pc + 2, mode_2) 68 ) ? 1 : 0 69 pc += 4 70 elseif op_code == 8 71 program[get_res_loc(pc + 3, mode_3)] = ( 72 get_param(pc + 1, mode_1) 73 == get_param(pc + 2, mode_2) 74 ) ? 1 : 0 75 pc += 4 76 elseif op_code == 9 77 relative_base += get_param(pc + 1, mode_1) 78 pc += 2 79 elseif op_code == 99 80 break 81 else 82 println("Unknown op code: ", op_code) 83 break 84 end 85 end 86 output 87 end 88 89 function part_1(input) 90 computer(input, 1)[end] 91 end 92 93 function part_2(input) 94 computer(input, 2)[end] 95 end 96 97 input = map(x -> parse(Int128, x), split(readlines(open("input.txt"))[1], ',')) 98 99 println("Julia:") 100 println("Part 1: ", part_1(input)) 101 println("Part 2: ", part_2(input))