Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local loc = "/advent/"
- local inp = loc .. "INPUT.txt"
- local doti = 0
- local data = {}
- local points = {}
- local view = {}
- local best = {min = 100}
- do
- local h = fs.open(inp,"r")
- local line = h.readLine()
- local i = 0
- repeat
- i = i + 1
- data[i] = line
- line = h.readLine()
- --if line == "" then line = false end
- until not line
- h.close()
- end
- local function dots()
- while true do
- os.sleep(1)
- io.write(".")
- doti = doti + 1
- end
- end
- local function createData()
- for i = 1,#data do
- --position=<-41933, 10711> velocity=< 4, -1>
- local a = data[i]:gmatch("-?%d+")
- local x = a()
- local y = a()
- local vX = a()
- local vY = a()
- if x ~= nil then
- points[i] = {["x"] = x,["y"] = y, ["vX"] = vX, ["vY"] = vY}
- else
- print("nil value on",i)
- end
- end
- end
- local function step()
- for i = 1,#points do
- local cur = points[i]
- cur.x = cur.x + cur.vX
- cur.y = cur.y + cur.vY
- end
- end
- local function stepBack()
- for i = 1,#points do
- local cur = points[i]
- cur.x = cur.x - cur.vX
- cur.y = cur.y - cur.vY
- end
- end
- local function stepMultiple()
- for i = 1,10000 do
- step()
- if i%100 == 0 then
- doti = doti + 1
- io.write("!")
- os.sleep()
- end
- end
- end
- local function stepWatch()
- local minX = 10000
- local minY = 10000
- local minXI = 10701
- local minYI = 10701
- for o = 1,100 do
- step()
- local minX1 = 10000
- local maxX1 = -10000
- local minY1 = 10000
- local maxY1 = -10000
- for i = 1,#points do
- local cur = points[i]
- if minX1 > cur.x then
- minX = cur.x
- end
- if maxX1 < cur.x then
- maxX1 = cur.x
- end
- if minY1 > cur.y then
- minY = cur.y
- end
- if maxY1 < cur.y then
- maxY1 = cur.y
- end
- end
- minX1 = minX1 + 10000
- maxX1 = maxX1 + 10000
- minY1 = minY1 + 10000
- maxY1 = maxY1 + 10000
- local dX = maxX1 - minX1
- local dY = maxY1 - minY1
- if minX > dX then
- minX = dX
- minXI = o
- end
- if minY > dY then
- minY = dY
- minYI = o
- end
- if o % 100 == 0 then os.sleep() end
- end
- print()
- print("MINX:",minX)
- print("MINY:",minY)
- print("MINXI:",minXI)
- print("MINYI:",minYI)
- return minX,minY,minXI,minYI
- end
- local function makeView()
- view = {}
- print("Adding X's")
- for i = 1,#points do
- local cur = points[i]
- if view[cur.y] then
- view[cur.y][cur.x] = "X"
- else
- view[cur.y] = {[cur.x] = "X"}
- end
- end
- os.sleep()
- print("Adding O's")
- for i = -6000,6000 do
- for o = -6000,6000 do
- if view[i] then
- if not view[i][o] then
- view[i][o] = "O"
- end
- else
- view[i] = {[o] = "O"}
- end
- end
- if i % 100 == 0 then
- print("+100",i)
- os.sleep()
- end
- end
- os.sleep()
- print("Done.")
- end
- local function printFrom(x,y)
- local mX,mY = term.getSize()
- for i = y,mY+y do
- for o = x,mX+x do
- term.write(view[i][o])
- end
- print()
- end
- end
- print("Building data.")
- parallel.waitForAny(dots,createData)
- print()
- doti = 0
- print("Completed.")
- --[[print("Dumping to file. Yeet.")
- local h = fs.open(loc .. "OUTPUT","w")
- h.write(textutils.serialize(points))
- h.close()]]
- print("Stepping 10000 times.")
- parallel.waitForAny(dots,stepMultiple)
- print()
- doti = 0
- print("Completed.")
- local count = 0
- while true do
- print("Stepping 100 times and finding the smallest size.")
- local x,y,xI,yI = stepWatch()
- if xI ~= 100 and yI ~= 100 then
- best = {x=x,y=y,xI=xI,yI=yI}
- break
- end
- count = count + 100
- end
- print("Steps before found:",10000+count)
- print("Found lowest.")
- print(textutils.serialize(best))
- for i = 1,82 do
- stepBack()
- end
- print("At 10518")
- print("Creating View.")
- makeView()
- for i = 5,1,-1 do
- print("Displaying preview in",i,"second(s).")
- os.sleep(1)
- end
- local coords = {x=0,y=0}
- while true do
- printFrom(coords.x,coords.y)
- local ev = {os.pullEvent("key")}
- if ev[2] == keys.up then
- coords.y = coords.y + 1
- elseif ev[2] == keys.down then
- coords.y = coords.y - 1
- elseif ev[2] == keys.left then
- coords.x = coords.x - 1
- elseif ev[2] == keys.right then
- coords.x = coords.x + 1
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement