summaryrefslogtreecommitdiff
path: root/05/2.lua
diff options
context:
space:
mode:
Diffstat (limited to '05/2.lua')
-rw-r--r--05/2.lua38
1 files changed, 38 insertions, 0 deletions
diff --git a/05/2.lua b/05/2.lua
new file mode 100644
index 0000000..a132630
--- /dev/null
+++ b/05/2.lua
@@ -0,0 +1,38 @@
+#!/usr/bin/env lua
+
+local stacks
+for line in io.lines() do
+ if not stacks then -- first line
+ stacks = {}
+ local num_stacks = math.ceil(#line / 4)
+ for i = 1, num_stacks do
+ stacks[i] = {}
+ end
+ end
+ if line:sub(2,2) == "1" then
+ break -- end of crates
+ end
+ for i = 1, #line, 4 do
+ local letter = line:sub(i+1,i+1)
+ if letter ~= " " then
+ table.insert(stacks[math.ceil(i/4)],1,letter)
+ end
+ end
+end
+for line in io.lines() do break end -- empty line between crates and orders
+for line in io.lines() do
+ local amt, from, to = line:match("move (%d+) from (%d+) to (%d+)")
+ amt, from, to = tonumber(amt), tonumber(from), tonumber(to)
+ local crates = {}
+ for i = 1, amt do
+ table.insert(crates, table.remove(stacks[from]))
+ end
+ for i = 1, #crates do
+ table.insert(stacks[to], table.remove(crates))
+ end
+end
+local msg = {}
+for _,c in pairs(stacks) do
+ table.insert(msg,c[#c])
+end
+print(table.concat(msg))