diff options
Diffstat (limited to 'challenge-159/roger-bell-west/lua/ch-1.lua')
| -rwxr-xr-x | challenge-159/roger-bell-west/lua/ch-1.lua | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/challenge-159/roger-bell-west/lua/ch-1.lua b/challenge-159/roger-bell-west/lua/ch-1.lua new file mode 100755 index 0000000000..d10299f584 --- /dev/null +++ b/challenge-159/roger-bell-west/lua/ch-1.lua @@ -0,0 +1,104 @@ +#! /usr/bin/lua + +-- by Michael Anderson at +-- https://stackoverflow.com/questions/8722620/comparing-two-index-tables-by-index-value-in-lua +function recursive_compare(t1,t2) + -- Use usual comparison first. + if t1==t2 then return true end + -- We only support non-default behavior for tables + if (type(t1)~="table") then return false end + -- They better have the same metatables + local mt1 = getmetatable(t1) + local mt2 = getmetatable(t2) + if( not recursive_compare(mt1,mt2) ) then return false end + + -- Check each key-value pair + -- We have to do this both ways in case we miss some. + -- TODO: Could probably be smarter and not check those we've + -- already checked though! + for k1,v1 in pairs(t1) do + local v2 = t2[k1] + if( not recursive_compare(v1,v2) ) then return false end + end + for k2,v2 in pairs(t2) do + local v1 = t1[k2] + if( not recursive_compare(v1,v2) ) then return false end + end + + return true +end + +function gcd(m0,n0) + local m,n = m0,n0 + while n ~= 0 do + m,n = n,m % n + end + return m +end + +function lcm(m,n) + return m/gcd(m,n)*n +end + +function lcmseries(a,b) + local t=1 + for v = a,b do + t = lcm(t,v) + end + return t +end + +function farey(n) + local l=lcmseries(2,n) + local d={} + local s={} + for i = 1,n do + local m = l / i + for j = 0,i do + local k = m * j + if d[k] == nil then + d[k] = {j,i} + table.insert(s,k) + end + end + end + table.sort(s) + local out={} + for k,v in ipairs(s) do + table.insert(out,d[v]) + end + return out +end + +if recursive_compare(farey(5),{ + {0, 1}, {1, 5}, {1, 4}, {1, 3}, {2, 5}, + {1, 2}, {3, 5}, {2, 3}, {3, 4}, {4, 5}, + {1, 1} + }) then + io.write("Pass") +else + io.write("FAIL") +end +io.write(" ") + +if recursive_compare(farey(7),{ + {0, 1}, {1, 7}, {1, 6}, {1, 5}, {1, 4}, + {2, 7}, {1, 3}, {2, 5}, {3, 7}, {1, 2}, + {4, 7}, {3, 5}, {2, 3}, {5, 7}, {3, 4}, + {4, 5}, {5, 6}, {6, 7}, {1, 1} + }) then + io.write("Pass") +else + io.write("FAIL") +end +io.write(" ") + +if recursive_compare(farey(4),{ + {0, 1}, {1, 4}, {1, 3}, {1, 2}, {2, 3}, + {3, 4}, {1, 1} + }) then + io.write("Pass") +else + io.write("FAIL") +end +print("") |
