require "ext" local cave = {} local lowest = 0 for line in io.lines() do print("line:",line) local cursor = nil for pair in line:gmatch("([0-9,]+)") do local col,row = pair:match("(%d+),(%d+)") col,row = tonumber(col),tonumber(row) if cursor then for rown = math.min(cursor[1],row), math.max(cursor[1],row) do for coln = math.min(cursor[2],col), math.max(cursor[2],col) do cave[rown] = cave[rown] or {} printf("Setting %d %d to true",rown,coln) cave[rown][coln] = true end end end lowest = math.max(row,lowest) cursor = {row,col} end end local sand = {} function print_puzzle() for row = 0, 11 do for col = 480,520 do local data = cave[row] and cave[row][col] if data == "s" then io.write("O") elseif data then io.write("#") else io.write(".") end end io.write("\n") end for _,row in pairs(cave) do for _,col in pairs(row) do end end end print_puzzle() print("lowest:",lowest) local floor = lowest + 2 cave[floor] = {} for i = -(500 - floor), (500 + floor) do cave[floor][i] = true end local sandpoint = {0,500} local movement = { {1,0}, {1,-1}, {1,1} } local x = 0 while true do for k,v in pairs(sandpoint) do sand[k] = v end local could_move = false repeat could_move = false for _,move in ipairs(movement) do local drow, dcol = sand[1] + move[1], sand[2] + move[2] if not cave[drow] or cave[drow][dcol] == nil then could_move = true sand[1] = drow sand[2] = dcol break end end until not could_move or sand[1] == floor if not could_move then cave[sand[1]] = cave[sand[1]] or {} cave[sand[1]][sand[2]] = "s" end if sand[1] == 0 then print("sand stopped falling") break end x = x + 1 end print_puzzle() print(x + 1)