121 lines
2.6 KiB
Lua
Executable File
121 lines
2.6 KiB
Lua
Executable File
#!/usr/bin/env luajit
|
|
require("utils")
|
|
|
|
local function trunc(a)
|
|
if a < 0 then
|
|
return math.ceil(a)
|
|
else
|
|
return math.floor(a)
|
|
end
|
|
end
|
|
|
|
local map = { w=1, x=2, y=3, z=4 }
|
|
local instructions = {}
|
|
for line in io.lines(arg[3]) do
|
|
local inst, a1, a2 = unpack(split(line, " "))
|
|
if inst == "inp" then
|
|
table.insert(instructions, function(memory, input)
|
|
local i, o = 9, memory[a1]
|
|
return function()
|
|
if i > 1 then
|
|
i = i - 1
|
|
memory[a1] = i
|
|
return input * 10 + i
|
|
else
|
|
memory[a1] = o
|
|
end
|
|
end
|
|
end)
|
|
elseif inst == "add" then
|
|
table.insert(instructions, function(memory, input)
|
|
local done, o = false, memory[a1]
|
|
return function()
|
|
if not done then
|
|
memory[a1] = memory[a1] + (memory[a2] or tonumber(a2))
|
|
done = true
|
|
return input
|
|
else
|
|
memory[a1] = o
|
|
end
|
|
end
|
|
end)
|
|
elseif inst == "mul" then
|
|
table.insert(instructions, function(memory, input)
|
|
local done, o = false, memory[a1]
|
|
return function()
|
|
if not done then
|
|
memory[a1] = memory[a1] * (memory[a2] or tonumber(a2))
|
|
done = true
|
|
return input
|
|
else
|
|
memory[a1] = o
|
|
end
|
|
end
|
|
end)
|
|
elseif inst == "div" then
|
|
table.insert(instructions, function(memory, input)
|
|
local done, o = false, memory[a1]
|
|
return function()
|
|
if not done and (memory[a2] or tonumber(a2)) ~= 0 then
|
|
memory[a1] = trunc(memory[a1] / (memory[a2] or tonumber(a2)))
|
|
done = true
|
|
return input
|
|
else
|
|
memory[a1] = o
|
|
end
|
|
end
|
|
end)
|
|
elseif inst == "mod" then
|
|
table.insert(instructions, function(memory, input)
|
|
local done, o = false, memory[a1]
|
|
return function()
|
|
local v = memory[a2] or tonumber(a2)
|
|
if not done and memory[a1] >= 0 and v > 0 then
|
|
memory[a1] = memory[a1] % v
|
|
done = true
|
|
return input
|
|
else
|
|
memory[a1] = o
|
|
end
|
|
end
|
|
end)
|
|
elseif inst == "eql" then
|
|
table.insert(instructions, function(memory, input)
|
|
local done, o = false, memory[a1]
|
|
return function()
|
|
if not done then
|
|
if memory[a1] == (memory[a2] or tonumber(a2)) then
|
|
memory[a1] = 1
|
|
else
|
|
memory[a1] = 0
|
|
end
|
|
done = true
|
|
return input
|
|
else
|
|
memory[a1] = o
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
|
|
local maximum = 0
|
|
local function backtrack(i, memory, input)
|
|
if i == #instructions then
|
|
if memory.z == 0 and input > maximum then
|
|
print(input)
|
|
print(os.date())
|
|
maximum = input
|
|
end
|
|
else
|
|
-- io.write("i "..tostring(i).." ")
|
|
-- printtable(memory)
|
|
for newinput in instructions[i](memory, input) do
|
|
backtrack(i + 1, memory, newinput)
|
|
end
|
|
end
|
|
end
|
|
|
|
backtrack(1, { w=0, x=0, y=0, z=0 }, 0)
|
|
print(maximum)
|