signal = {} file = io.open(arg[1]) for num in file:read("a"):gmatch("%d") do table.insert(signal, tonumber(num)) end file:close() function calc(signal, num) local fin = #signal local cur = num local val = 0 while cur <= fin do for _, x in ipairs({1, 0, -1, 0}) do if x == 0 then cur = cur + num else local cur_val = 0 for i = 1, num do cur_val = cur_val + signal[cur] cur = cur + 1 if cur > fin then break end end val = val + cur_val * x end if cur > fin then break end end end return math.abs(val) % 10 end function calc_dumb_p2(signal, offset) local val = 0 for i = #signal, offset, -1 do val = (val + signal[i]) % 10 signal[i] = val end end function signal_tostring(signal, start, len) local str = "" for i = start, len do str = str .. string.format("%d", signal[i]) end return str end offset = signal[1] * (10 ^ 6) + signal[2] * (10 ^ 5) + signal[3] * (10 ^ 4) + signal[4] * (10 ^ 3) + signal[5] * (10 ^ 2) + signal[6] * (10 ^ 1) + signal[7] signal_p2 = {} for i = 1, 10000 do for i = 1, #signal do table.insert(signal_p2, signal[i]) end end print(offset) offset = offset % #signal_p2 print(offset) for i = 1, 100 do for i = 1, #signal do signal[i] = calc(signal, i) end end print("Part 1:", signal_tostring(signal, 1, 8)) for i = 1, 100 do calc_dumb_p2(signal_p2, offset) end print("Part 2:", signal_tostring(signal_p2, offset + 1, offset + 8))