Advertisement
Guest User

Untitled

a guest
Dec 14th, 2022
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.57 KB | None | 0 0
  1. local rock = {}
  2. local sand = {}
  3. local miny = 0
  4. local minx, maxx = math.huge, 0
  5. for line in io.lines(arg[1]) do
  6.     local begin = true
  7.     local x1, y1
  8.     for pair in line:gmatch("%d+,%d+") do
  9.         if begin then
  10.             x1, y1 = pair:match("(%d+),(%d+)")
  11.             x1, y1 = tonumber(x1), tonumber(y1)
  12.         else
  13.             local x2, y2 = pair:match("(%d+),(%d+)")
  14.             x2, y2 = tonumber(x2), tonumber(y2)
  15.             for y = math.min(y1, y2), math.max(y1, y2) do
  16.                 if y > miny then miny = y end
  17.                 rock[y] = rock[y] or {}
  18.                 for x = math.min(x1, x2), math.max(x1, x2) do
  19.                     if x > maxx then maxx = x end
  20.                     if x < minx then minx = x end
  21.                     rock[y][x] = true
  22.                 end
  23.             end
  24.             x1 = x2
  25.             y1 = y2
  26.         end
  27.         begin = false
  28.     end
  29. end
  30. rock[miny+2] = {}
  31. for x = minx - 1000, maxx + 1000 do rock[miny+2][x] = true end
  32. local function fall(count, part2)
  33.     local x, y = 500, 0
  34.     while true do
  35.         rock[y+1] = rock[y+1] or {}
  36.         sand[y+1] = sand[y+1] or {}
  37.         if rock[y+1][x] or sand[y+1][x] then
  38.             if rock[y+1][x-1] or sand[y+1][x-1] then
  39.                 if rock[y+1][x+1] or sand[y+1][x+1] then
  40.                     sand[y] = sand[y] or {}
  41.                     sand[y][x] = true
  42.                     return count + 1, false
  43.                 else
  44.                     y = y + 1
  45.                     x = x + 1
  46.                 end
  47.             else
  48.                 y = y + 1
  49.                 x = x - 1
  50.             end
  51.         else
  52.             y = y + 1
  53.             if (not part2) and y > miny then return count, true end
  54.         end
  55.     end
  56. end
  57.  
  58. local count = 0
  59. local stop = false
  60. while not stop do
  61.     count, stop = fall(count)
  62. end
  63. print(count)
  64. sand = {}
  65. sand[0] = {}
  66. sand[0][500] = false
  67. count = 0
  68. while true do
  69.     count = fall(count, true)
  70.     if sand[0][500] then print(count) break end
  71. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement