From 7544d586a052dd92d6239bb01fa6d76a1867cb80 Mon Sep 17 00:00:00 2001 From: No-one-you-know Date: Fri, 19 Feb 2021 05:15:00 +0000 Subject: [PATCH] Added Lua towers_of_hanoi example --- towers_of_hanoi/lua/MaximumGeeker/hanoi.lua | 42 ++++++++++++ .../lua/MaximumGeeker/hanoi_stack.lua | 68 +++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 towers_of_hanoi/lua/MaximumGeeker/hanoi.lua create mode 100644 towers_of_hanoi/lua/MaximumGeeker/hanoi_stack.lua diff --git a/towers_of_hanoi/lua/MaximumGeeker/hanoi.lua b/towers_of_hanoi/lua/MaximumGeeker/hanoi.lua new file mode 100644 index 0000000..95771f1 --- /dev/null +++ b/towers_of_hanoi/lua/MaximumGeeker/hanoi.lua @@ -0,0 +1,42 @@ +--[[ 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') diff --git a/towers_of_hanoi/lua/MaximumGeeker/hanoi_stack.lua b/towers_of_hanoi/lua/MaximumGeeker/hanoi_stack.lua new file mode 100644 index 0000000..faea574 --- /dev/null +++ b/towers_of_hanoi/lua/MaximumGeeker/hanoi_stack.lua @@ -0,0 +1,68 @@ +--[[ 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 -- 2.25.1