From fa81a55b48ad38cc15440c54ac50b47f36e1f73a Mon Sep 17 00:00:00 2001 From: Yonaba Date: Sat, 22 Mar 2014 15:42:54 +0000 Subject: [PATCH] Added 100 doors problem --- 100_Doors_Problem/Lua/Yonaba/100doors.lua | 26 +++++++++++++++++ .../Lua/Yonaba/100doors_test.lua | 29 +++++++++++++++++++ 100_Doors_Problem/tags | 1 + 3 files changed, 56 insertions(+) create mode 100644 100_Doors_Problem/Lua/Yonaba/100doors.lua create mode 100644 100_Doors_Problem/Lua/Yonaba/100doors_test.lua create mode 100644 100_Doors_Problem/tags diff --git a/100_Doors_Problem/Lua/Yonaba/100doors.lua b/100_Doors_Problem/Lua/Yonaba/100doors.lua new file mode 100644 index 00000000..7a097718 --- /dev/null +++ b/100_Doors_Problem/Lua/Yonaba/100doors.lua @@ -0,0 +1,26 @@ +-- 100 doors problem implementation +-- See : http://rosettacode.org/wiki/100_doors + +-- Collects keys of values matching a predicate +local function collect(t, v) + local s = {} + for k,_v in ipairs(t) do + if _v == v then s[#s+1] = k end + end + return s +end + +-- Simulates the 100 doors problem +-- returns : a table of all open doors +-- a table of all closed doors +local function hundred_doors() + local doors = {} + for mp = 1, 100 do + for i = mp, 100, mp do + doors[i] = (doors[i] == nil and false or not doors[i]) + end + end + return collect(doors, true), collect(doors, false) +end + +return hundred_doors diff --git a/100_Doors_Problem/Lua/Yonaba/100doors_test.lua b/100_Doors_Problem/Lua/Yonaba/100doors_test.lua new file mode 100644 index 00000000..a95b0653 --- /dev/null +++ b/100_Doors_Problem/Lua/Yonaba/100doors_test.lua @@ -0,0 +1,29 @@ +-- Tests for 100doors.lua +local hundred_doors = require '100doors' + +local total, pass = 0, 0 + +local function dec(str, len) + return #str < len + and str .. (('.'):rep(len-#str)) + or str:sub(1,len) +end + +local function run(message, f) + total = total + 1 + local ok, err = pcall(f) + if ok then pass = pass + 1 end + local status = ok and 'PASSED' or 'FAILED' + print(('%02d. %68s: %s'):format(total, dec(message,68), status)) +end + +run('Open doors are perfect squares of integers', function() + local open, closed = hundred_doors() + for i, v in ipairs(open) do + assert(math.floor(math.sqrt(v)) == math.sqrt(v)) + end +end) + +print(('-'):rep(80)) +print(('Total : %02d: Pass: %02d - Failed : %02d - Success: %.2f %%') + :format(total, pass, total-pass, (pass*100/total))) diff --git a/100_Doors_Problem/tags b/100_Doors_Problem/tags new file mode 100644 index 00000000..71f5a9f7 --- /dev/null +++ b/100_Doors_Problem/tags @@ -0,0 +1 @@ +Puzzle