--- /dev/null
+--[[ Towers of hanoi - Lua 5.1 ]]--
+
+local move = function(a, b)
+ print( a, '->', b )
+end
+
+local hanoi
+hanoi = function(n, orig, pivot, dest)
+ if n < 1 then
+ return
+ end
+
+ if n == 1 then
+ move( orig, dest )
+ return
+ end
+
+ if n == 2 then
+ move( orig, pivot )
+ move( orig, dest )
+ move( pivot, dest )
+ return
+ end
+
+ hanoi(n-2, orig, pivot, dest)
+ move( orig, pivot )
+ hanoi(n-2, dest, orig, pivot)
+ move( orig, dest )
+ hanoi(n-1, pivot, orig, dest)
+end
+
+io.write "Value of N: "
+local n = io.read "*n"
+
+if type(n) == 'number' then
+ n = math.floor(n)
+else
+ io.stderr "Value given is not a number.\n"
+ os.exit(1)
+end
+
+hanoi(n, 'Left', 'Center', 'Right')
--- /dev/null
+--[[ Towers of hanoi - Lua 5.1 ]]--
+
+local leftStack, centerStack, rightStack = {name = 'Left'}, {name = 'Center'}, {name = 'Right'}
+
+local visualize = function(...)
+ local z = {...}
+
+ for i = 1, 3 do
+ print(string.format("%s:\t%s", z[i].name, table.concat(z[i], ' ')))
+ end
+ print()
+end
+
+local move = function(a, b)
+ print( a.name, '->', b.name )
+ table.insert( b, table.remove(a) )
+
+ coroutine.yield(true)
+end
+
+local hanoi
+hanoi = function(n, orig, pivot, dest)
+ if n < 1 then
+ return
+ end
+
+ if n == 1 then
+ move( orig, dest )
+ return
+ end
+
+ if n == 2 then
+ move( orig, pivot )
+ move( orig, dest )
+ move( pivot, dest )
+ return
+ end
+
+ hanoi(n-2, orig, pivot, dest)
+ move( orig, pivot )
+ hanoi(n-2, dest, orig, pivot)
+ move( orig, dest )
+ hanoi(n-1, pivot, orig, dest)
+end
+
+io.write "Value of N: "
+local n = tonumber( io.read "*l", 10 )
+
+if type(n) == 'number' then
+ n = math.floor(n)
+else
+ io.stderr "Value given is not a number.\n"
+ os.exit(1)
+end
+
+for i = n, 1, -1 do
+ leftStack[ #leftStack+1 ] = i
+end
+
+local hanoiInteractive = coroutine.wrap(hanoi)
+local counter = 0
+
+repeat
+ print('#'..counter..': ')
+ counter = counter + 1
+ visualize( leftStack, centerStack, rightStack )
+ io.read()
+until hanoiInteractive(n, leftStack, centerStack, rightStack) ~= true