RosettaCodeData/Task/Cistercian-numerals/Lua/cistercian-numerals.lua
2023-07-01 13:44:08 -04:00

120 lines
3.3 KiB
Lua

function initN()
local n = {}
for i=1,15 do
n[i] = {}
for j=1,11 do
n[i][j] = " "
end
n[i][6] = "x"
end
return n
end
function horiz(n, c1, c2, r)
for c=c1,c2 do
n[r+1][c+1] = "x"
end
end
function verti(n, r1, r2, c)
for r=r1,r2 do
n[r+1][c+1] = "x"
end
end
function diagd(n, c1, c2, r)
for c=c1,c2 do
n[r+c-c1+1][c+1] = "x"
end
end
function diagu(n, c1, c2, r)
for c=c1,c2 do
n[r-c+c1+1][c+1] = "x"
end
end
function initDraw()
local draw = {}
draw[1] = function(n) horiz(n, 6, 10, 0) end
draw[2] = function(n) horiz(n, 6, 10, 4) end
draw[3] = function(n) diagd(n, 6, 10, 0) end
draw[4] = function(n) diagu(n, 6, 10, 4) end
draw[5] = function(n) draw[1](n) draw[4](n) end
draw[6] = function(n) verti(n, 0, 4, 10) end
draw[7] = function(n) draw[1](n) draw[6](n) end
draw[8] = function(n) draw[2](n) draw[6](n) end
draw[9] = function(n) draw[1](n) draw[8](n) end
draw[10] = function(n) horiz(n, 0, 4, 0) end
draw[20] = function(n) horiz(n, 0, 4, 4) end
draw[30] = function(n) diagu(n, 0, 4, 4) end
draw[40] = function(n) diagd(n, 0, 4, 0) end
draw[50] = function(n) draw[10](n) draw[40](n) end
draw[60] = function(n) verti(n, 0, 4, 0) end
draw[70] = function(n) draw[10](n) draw[60](n) end
draw[80] = function(n) draw[20](n) draw[60](n) end
draw[90] = function(n) draw[10](n) draw[80](n) end
draw[100] = function(n) horiz(n, 6, 10, 14) end
draw[200] = function(n) horiz(n, 6, 10, 10) end
draw[300] = function(n) diagu(n, 6, 10, 14) end
draw[400] = function(n) diagd(n, 6, 10, 10) end
draw[500] = function(n) draw[100](n) draw[400](n) end
draw[600] = function(n) verti(n, 10, 14, 10) end
draw[700] = function(n) draw[100](n) draw[600](n) end
draw[800] = function(n) draw[200](n) draw[600](n) end
draw[900] = function(n) draw[100](n) draw[800](n) end
draw[1000] = function(n) horiz(n, 0, 4, 14) end
draw[2000] = function(n) horiz(n, 0, 4, 10) end
draw[3000] = function(n) diagd(n, 0, 4, 10) end
draw[4000] = function(n) diagu(n, 0, 4, 14) end
draw[5000] = function(n) draw[1000](n) draw[4000](n) end
draw[6000] = function(n) verti(n, 10, 14, 0) end
draw[7000] = function(n) draw[1000](n) draw[6000](n) end
draw[8000] = function(n) draw[2000](n) draw[6000](n) end
draw[9000] = function(n) draw[1000](n) draw[8000](n) end
return draw
end
function printNumeral(n)
for i,v in pairs(n) do
for j,w in pairs(v) do
io.write(w .. " ")
end
print()
end
print()
end
function main()
local draw = initDraw()
for i,number in pairs({0, 1, 20, 300, 4000, 5555, 6789, 9999}) do
local n = initN()
print(number..":")
local thousands = math.floor(number / 1000)
number = number % 1000
local hundreds = math.floor(number / 100)
number = number % 100
local tens = math.floor(number / 10)
local ones = number % 10
if thousands > 0 then
draw[thousands * 1000](n)
end
if hundreds > 0 then
draw[hundreds * 100](n)
end
if tens > 0 then
draw[tens * 10](n)
end
if ones > 0 then
draw[ones](n)
end
printNumeral(n)
end
end
main()