Advertisement
Guest User

Day 5 - Part 2

a guest
Dec 5th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.03 KB | None | 0 0
  1. require "importutils"
  2.  
  3. local input_p = getInput(5):split(",", true)
  4.  
  5. local dict =
  6. {
  7.     id_1    = {fn = "add",      params = 3},
  8.     id_2    = {fn = "mult",     params = 3},
  9.     id_3    = {fn = "in",       params = 1},
  10.     id_4    = {fn = "out",      params = 1},
  11.     id_5    = {fn = "jmpt",     params = 2},
  12.     id_6    = {fn = "jmpf",     params = 2},
  13.     id_7    = {fn = "tlt",      params = 3},
  14.     id_8    = {fn = "teq",      params = 3},
  15.     id_99   = {fn = "halt",     params = 0},
  16. }
  17.  
  18. local seed = 5 -- starting input
  19. local output = 0
  20.  
  21. local function operate(input, id, params)
  22.     local fn = dict[id].fn
  23.     assert(fn == "halt" or (params and #params > 0), "No parameters passed for operation : "..fn)
  24.     if fn == "out" then -- edge case
  25.         if params[1].mode == 0 then params[1].val = input[params[1].val+1] end
  26.     elseif fn:sub(1,3) == "jmp" then
  27.         for i=1, #params do -- another edge case
  28.             if params[i].mode == 0 then params[i].val = input[params[i].val+1] end
  29.         end
  30.     else
  31.         for i=1, #params-1 do -- skip last since we want to keep the write address
  32.             if params[i].mode == 0 then params[i].val = input[params[i].val+1] end
  33.         end
  34.     end
  35.     if     fn == "add"  then return params[1].val + params[2].val, params[3].val
  36.     elseif fn == "mult" then return params[1].val * params[2].val, params[3].val
  37.     elseif fn == "in"   then return seed, params[1].val
  38.     elseif fn == "out"  then return params[1].val, "out"
  39.     elseif fn == "jmpt" then
  40.         if params[1].val ~= 0 then
  41.              return params[2].val, "pnt"
  42.         else return "skip" end
  43.     elseif fn == "jmpf" then
  44.         if params[1].val == 0 then
  45.              return params[2].val, "pnt"
  46.         else return "skip" end
  47.     elseif fn == "tlt" then
  48.         if params[1].val < params[2].val then
  49.              return 1, params[3].val
  50.         else return 0, params[3].val end
  51.     elseif fn == "teq" then
  52.         if params[1].val == params[2].val then
  53.              return 1, params[3].val
  54.         else return 0, params[3].val end
  55.     elseif fn == "halt" then return "halt" end
  56. end
  57.  
  58. local p = 1 -- input address pointer
  59. function runIntcodeComp(input)
  60.     assert(type(input) == "table", "Input is not a table. Must pass a parsed table as input.")
  61.     while p < #input do
  62.         local opcode, parse = input[p]
  63.         local id = string.format("id_%d", math.floor(string.sub(opcode, -2))) --shaves off leading 0 if exists
  64.         local params = {}
  65.         if #tostring(opcode) > 2 then
  66.             parse = tostring(opcode):splitByChar()
  67.         end
  68.         assert(dict[id],  "Invalid operation is "..id.." @ entry "..p.." and "..steps.." steps")
  69.         for i=1, dict[id].params do
  70.             local t = {val=input[p+i], mode=0}
  71.             if parse and parse[#parse-(i+1)] == "1" then t.mode = 1 end
  72.             params[#params+1] = t
  73.         end
  74.         local result, pos = operate(input, id, params)
  75.         if result == "halt" then
  76.             print("Halt function has been pushed.")
  77.             break
  78.         end
  79.         if result ~= "skip" then
  80.             if pos == "out" then
  81.                 output = result
  82.                 print("Output is set to "..output)
  83.             elseif pos == "pnt" then
  84.                 p = result + 1
  85.                 print("Pointer jumped to index "..p)
  86.             else input[pos+1] = result end
  87.         end
  88.         if pos ~= "pnt" then p = p + #params + 1 end
  89.     end
  90. end
  91.  
  92. runIntcodeComp(input_p)
  93. print("\nOutput is : "..output)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement