Lua 언어 소스:

-- Filename: testHexView_02.lua
--
-- Execute: lua testHexView_02.lua [filename]
--
-- Date: 2013. 7. 30.
--
-- See: http://java.about.com/od/InputOutput/ss/Binary-Stream-Example-Code.htm

function printUsage()
    print "Usage: lua testHexView_02.lua [filename]"
end

function toHex(b)
    local bit = require("bit")
    local s = ""
    local x1 = bit.rshift(bit.band(b, 0xF0), 4)
    local x2 = bit.band(b, 0x0F)
    if x1 < 10 then
        s = s .. string.char(x1 + string.byte("0"))
    else
     s = s .. string.char((x1 - 10) + string.byte("A"))
    end
    if x2 < 10 then
        s = s .. string.char(x2 + string.byte("0"))
    else
        s = s .. string.char((x2 - 10) + string.byte("A"))
    end
    return s
end

function toHex8(n)
    local bit = require("bit")
    local s = ""
    local x1 = bit.rshift(bit.band(n, 0xF0000000), 28)
    local x2 = bit.rshift(bit.band(n, 0xF000000), 24)
    local x3 = bit.rshift(bit.band(n, 0xF00000), 20)
    local x4 = bit.rshift(bit.band(n, 0xF0000), 16)
    local x5 = bit.rshift(bit.band(n, 0xF000), 12)
    local x6 = bit.rshift(bit.band(n, 0xF00), 8)
    local x7 = bit.rshift(bit.band(n, 0xF0), 4)
    local x8 = bit.band(n, 0xF)
    if x1 < 10 then
        s = s .. string.char(x1 + string.byte("0"))
    else
     s = s .. string.char((x1 - 10) + string.byte("A"))
    end
    if x2 < 10 then
        s = s .. string.char(x2 + string.byte("0"))
    else
        s = s .. string.char((x2 - 10) + string.byte("A"))
    end
    if x3 < 10 then
        s = s .. string.char(x3 + string.byte("0"))
    else
        s = s .. string.char((x3 - 10) + string.byte("A"))
    end
    if x4 < 10 then
        s = s .. string.char(x4 + string.byte("0"))
    else
        s = s .. string.char((x4 - 10) + string.byte("A"))
    end
    s = s .. " "
    if x5 < 10 then
        s = s .. string.char(x5 + string.byte("0"))
    else
        s = s .. string.char((x5 - 10) + string.byte("A"))
    end
    if x6 < 10 then
        s = s .. string.char(x6 + string.byte("0"))
    else
        s = s .. string.char((x6 - 10) + string.byte("A"))
    end
    if x7 < 10 then
        s = s .. string.char(x7 + string.byte("0"))
    else
        s = s .. string.char((x7 - 10) + string.byte("A"))
    end
    if x8 < 10 then
        s = s .. string.char(x8 + string.byte("0"))
    else
        s = s .. string.char((x8 - 10) + string.byte("A"))
    end
  
    return s
end

 

local bit = require("bit")


function fsize (file)
        local current = file:seek()      -- get current position
        local size = file:seek("end")    -- get file size
        file:seek("set", current)        -- restore position
        return size
end

if #arg < 1 then
    printUsage()
    os.exit( 1 )
end

local fname = arg[1]
local file2, err = io.open(fname, "rb")     -- open a binary file
if err then
    print( err )
    os.exit( 1 )
end

local fsize1 = fsize(file2)

print( "The size of the file \"" .. fname .. " is " .. fsize1 .. ".")
print()

local a
local dum = ""
local n = 0

if file2 then
    dum = ""

    while n < fsize1 do
        if n % 16 == 0 then
            io.write( toHex8( bit.band(n, 0xFFFFFFFF) ) .. ": " )
        end
             
        if not (n % 16 == 8) then
            io.write(" ")
        else
            io.write("-")
        end

        a = file2:read(1):byte(1, 1)
        io.write( toHex(a) )

        if a <  string.byte(" ") or a > 0x7F then
            dum = dum .. "."
        else
            dum = dum .. string.char(a)
        end
               
        n = n + 1
        if n % 16 == 0 then
            io.write("  |" .. dum .. "|\n")
            dum = ""
        end             
    end

    if dum ~= "" then
        for k = 1,16-#dum do
            io.write("   ")
        end
        io.write("  |" .. dum)
        for k = 1,16-#dum do
            io.write(" ")
        end
        io.write("|\n")
        dum = ""
    end             

    file2:close()
    print()
    print()
    print("Read " .. n .. " bytes")
end

 

 

실행하기 예 1> lua testHexView_02.lua temp_1.bin
The size of the file "temp_1.bin is 12.

0000 0000:  48 65 6C 6C 6F 20 74 68-65 72 65 0A              |Hello there.    |


Read 12 bytes

 

실행하기 예 2> lua testHexView_02.lua myFile.ser
The size of the file "myFile.ser is 130.

0000 0000:  AC ED 00 05 73 72 00 06-50 65 72 73 6F 6E 07 31  |....sr..Person.1|
0000 0010:  46 DB A5 1D 44 AB 02 00-03 49 00 03 61 67 65 4C  |F...D....I..ageL|
0000 0020:  00 09 66 69 72 73 74 4E-61 6D 65 74 00 12 4C 6A  |..firstNamet..Lj|
0000 0030:  61 76 61 2F 6C 61 6E 67-2F 53 74 72 69 6E 67 3B  |ava/lang/String;|
0000 0040:  4C 00 08 6C 61 73 74 4E-61 6D 65 71 00 7E 00 01  |L..lastNameq.~..|
0000 0050:  78 70 00 00 00 13 74 00-05 4A 61 6D 65 73 74 00  |xp....t..Jamest.|
0000 0060:  04 52 79 61 6E 73 71 00-7E 00 00 00 00 00 1E 74  |.Ryansq.~......t|
0000 0070:  00 07 4F 62 69 2D 77 61-6E 74 00 06 4B 65 6E 6F  |..Obi-want..Keno|
0000 0080:  62 69                                            |bi              |


Read 130 bytes

 

 

Posted by Scripter
,

역삼각함수란 삼각함수의 역함수를 의미하고,

역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.

수학에서 sin 함수의 역함수는 arcsin 으로 표기되는데,

Lua 언어에서는 math.asin() 함수로 구현되어 있다.

 

-- Filename: testArcSine.lua
--
-- Execute: lua testArcSine.lua
--
-- Date: 2013. 1. 1.
-- Copyright (c) pkim _AT_ scripts.pe.kr

function sin(x)
    local y = math.sin(x)
    return y
end

function asin(x)
    local y = math.asin(x)
    return y
end

function sinh(x)
    local y = math.sinh(x)
    return y
end

function cosh(x)
    local y = math.cosh(x)
    return y
end

function asinh(x)
    local y = math.log(x + math.sqrt(x*x + 1))
    return y
end

function acosh(x)
    local y = math.log(x + math.sqrt(x*x - 1))
    return y
end


x = -0.9
y = asin(x)
print(string.format("y = asin(%g) = %.9f", x, y))
print(string.format("sin(y) = sin(%.9f) = %g", y, sin(y)))
print()

x = 1.1
u = acosh(x)
print(string.format("u = acosh(%g) = %.10f" , x, u))

v = asinh(x)
print(string.format("v = asinh(%g) = %.10f", x, v))

print(string.format("cosh(u) = cosh(%.10f) = %g", u, cosh(u)))
print(string.format("sinh(v) = sinh(%.10f) = %g", v, sinh(v)))

--[[
y = asin(-0.9) = -1.119769515
sin(y) = sin(-1.119769515) = -0.9

u = acosh(1.1) = 0.4435682544
v = asinh(1.1) = 0.9503469298
cosh(u) = cosh(0.4435682544) = 1.1
sinh(v) = sinh(0.9503469298) = 1.1
--]]

 

 

Posted by Scripter
,


[파일명:  testStringFindInList.lua]------------------------------------------------
function find(arr, s)
    for i = 1, #arr do
     if string.find(arr[i], s) ~= nil then
      return i
        end
    end
    return -1;
end

function printArray(arr)
    io.write("[")
    for i = 1, #arr - 1 do
        io.write(arr[i] .. ", ")
    end
    if #arr > 0 then
        io.write(arr[#arr])
    end
    io.write("]\n")
end

words = { "하나", "둘", "셋", "넷", "다섯", "여섯" }

io.write("list: ")
printArray(words)
where = find(words, "셋")
if where > 0 then
    io.write("발견!  ")
    print("Next word of 셋 in list: " .. words[where+1])
end

print("Sorting...")
table.sort(words)

io.write("list: ")
printArray(words)
where = find(words, "셋")
if where > 0 then
    io.write("발견!  ")
    print("Next word of 셋 in list: " .. words[where+1])
end
------------------------------------------------


실행> lua testStringFindInList.lua
list: [하나, 둘, 셋, 넷, 다섯, 여섯]
발견!  Next word of 셋 in list: 넷
Sorting...
list: [넷, 다섯, 둘, 셋, 여섯, 하나]
발견!  Next word of 셋 in list: 여섯



크리에이티브 커먼즈 라이선스
Creative Commons License

Posted by Scripter
,


[파일명:  testSort.lua]------------------------------------------------
function find(arr, s)
    for i = 1, #arr do
     if string.find(arr[i], s) ~= nil then
      return i
        end
    end
    return -1;
end

function printArray(arr)
    io.write("[")
    for i = 1, #arr - 1 do
        io.write(arr[i] .. ", ")
    end
    if #arr > 0 then
        io.write(arr[#arr])
    end
    io.write("]\n")
end

words = { "하나", "둘", "셋", "넷", "다섯", "여섯" }

io.write("list: ")
printArray(words)
where = find(words, "셋")
if where > 0 then
    io.write("발견!  ")
    print("Next word of 셋 in list: " .. words[where+1])
end

print("Sorting...")
table.sort(words)

io.write("list: ")
printArray(words)
where = find(words, "셋")
if where > 0 then
    io.write("발견!  ")
    print("Next word of 셋 in list: " .. words[where+1])
end
------------------------------------------------


실행> lua testSort.lua one two three four five
[five, four, one, three, two]

실행> lua testSort.lua 하나 둘 셋 넷 다섯
[넷, 다섯, 둘, 셋, 하나]

실행> lua testSort.lua 자전차 자전거 전동차 전차 전기자동차
[자전거, 자전차, 전기자동차, 전동차, 전차]


 

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Scripter
,


초등학교 때 배우는 두 정수의 곱셈표를 만들어 주는 Lua 소스이다.

--[[
  Filename: makeMultTable.lua

      Print a multiplication table.

      Execute: lua makeMultTable.lua 230 5100

  Date: 2009/03/06
--]]

function printUsing()
    print("Using: lua makeMultTable.lua [number1] [number2]")
    print("Print a multiplication table for the given two integers.")
end

function printMultTable(x, y)
    nx = x
    if nx < 0 then
        nx = -nx
    end
    ny = y
    if ny < 0 then
        ny = -ny
    end
    ntail1 = 0
    ntail2 = 0
    while nx % 10 == 0 do
        nx = nx / 10
        ntail1 = ntail1 + 1
    end
    while ny % 10 == 0 do
        ny = ny / 10
        ntail2 = ntail2 + 1
    end
    z = nx * ny
    strZ = "" .. z
    strX = "" .. nx
    strY = "" .. ny
    n = string.len(strY)
    zeros  = "0000000000000000000000000000000000000000"
    whites = "                                        "
    bars   = "----------------------------------------"
    loffset = "       "
    line4 = loffset .. strZ
    line1 = loffset .. string.sub(whites, 1, string.len(strZ) - string.len(strX)) .. strX
    line2 = "   x ) " ..  string.sub(whites, 1, string.len(strZ) - string.len(strY)) .. strY
    line3 = "     --" ..  string.sub(bars, 1, string.len(strZ))
    print(line1 .. string.sub(zeros, 1, ntail1))
    print(line2 .. string.sub(zeros, 1, ntail2))
    print(line3)
    if string.len(strY) > 1 then
        for i = 1, string.len(strY) do
            y1 = tonumber(string.sub(strY, string.len(strY) - i + 1, string.len(strY) - i + 1))
            if y1 ~= 0 then
                strT = "" .. (nx * y1)
                print(loffset .. string.sub(whites, 1, string.len(strZ) - string.len(strT) - i + 1) .. strT)
            end
        end
        print(line3)
    end
    print(line4 .. string.sub(zeros, 1, ntail1) ..  string.sub(zeros, 1, ntail2))
end

if #arg >= 2 then
    x = tonumber(arg[1])
    y = tonumber(arg[2])
    print()
    printMultTable(x, y)
else
    printUsing()
end



실행> lua makeMultTable.lua 230 5100
결과>

          230
   x )   5100
     ------
         23
       115
     ------
       1173000

 

크리에이티브 커먼즈 라이선스
Creative Commons License

 

Posted by Scripter
,

다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 Lua 소스 코드이다.
나눗셈 계산표를 완성하고 나서 약수, 배수 관계를 알려준다.


  1. --[[
  2.     Filename: makeDivisionTable.lua
  3.     Purpose:  Make a division table in a handy written form.
  4.     Execute: lua makeDivisionTable.lua 12345 32
  5.              lua makeDivisionTable.lua 500210 61
  6.        Date:  2008/05/15
  7.      Author:  PH Kim   [ pkim ((AT)) scripts.pe.kr ]
  8. --]]
  9. function printUsage()
  10.     -- print("Using: lua makeDivisionTable.lua [numerator] [denominator]")
  11.     -- print("Make a division table in a handy written form.")
  12.     print("사용법: lua makeDivisionTable.lua [피제수] [제수]")
  13.     print("손으로 작성한 형태의 나눗셈 표를 만들어준다.")
  14. end
  15. -- 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
  16. -- 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
  17. function simplify(v, width)
  18.     t = "" .. v
  19.     tlen = string.len(t)
  20.     if string.sub(t, tlen-2) == ".0" then
  21.         t = string.sub(t, 1, tlen-2)
  22.     end
  23.     if width ~= nil then
  24.         if tlen < width then
  25.             t = string.sub("              ", 1, width - tlen) .. t
  26.         end
  27.     end
  28.     return t
  29. end
  30. function getSuffix(v)
  31.     t = v % 10
  32.     suffix = "은"
  33.     if string.find("2459", "" .. v) then
  34.         suffix = "는"
  35.     end
  36.     return suffix
  37. end
  38. function makeTable(numer, denom, quotient)
  39.     strNumer = tostring(numer)
  40.     strDenom = tostring(denom)
  41.     strQuotient = tostring(quotient)
  42.     lenN = string.len(strNumer)
  43.     lenD = string.len(strDenom)
  44.     lenQ = string.len(strQuotient)
  45.     offsetLeft = 3 + lenD + 3
  46.     spaces = "                                                                                 "
  47.     uline  = string.rep("_", lenN + 2)
  48.     sline  = string.rep("-", lenN)
  49.     bias = lenN - lenQ
  50.     print(string.sub(spaces, 1, offsetLeft) .. string.sub(spaces, 1, bias) .. quotient)
  51.     print(string.sub(spaces, 1, offsetLeft - 2) .. uline)
  52.     io.write("   " .. strDenom .. " ) " .. strNumer)
  53.     strTmpR = string.sub(strNumer, 1, bias + 1)
  54.     tmpR = tonumber(strTmpR)
  55.     tmpSub = 0
  56.     oneDigit = nil
  57.     for i = 1, lenQ do
  58.         if string.sub(strQuotient, i, i) == "0" then
  59.             if i < lenQ then
  60.                 oneDigit = string.sub(strNumer, bias + i + 1, bias + i + 1)
  61.                 io.write(oneDigit)
  62.                 strTmpR = strTmpR .. oneDigit
  63.                 tmpR = tonumber(strTmpR)
  64.             end
  65.         else
  66.             print("")
  67.             tmpSub = tonumber(string.sub(strQuotient, i, i)) * denom
  68.             print(string.sub(spaces, 1, offsetLeft) .. simplify(tmpSub, bias + i))
  69.             print(string.sub(spaces, 1, offsetLeft) .. sline)
  70.             tmpR = tmpR - tmpSub
  71.             if tmpR == 0 and i < lenQ then
  72.                 io.write(string.sub(spaces, 1, offsetLeft - 1) .. string.sub(spaces, 1, bias + i + 1))
  73.             else
  74.                 io.write(string.sub(spaces, 1, offsetLeft - 1) .. simplify(tmpR, bias + i + 1))
  75.             end
  76.             strTmpR = tostring(tmpR)
  77.             if i < lenQ then
  78.                 oneDigit = string.sub(strNumer, bias + i + 1, bias + i + 1)
  79.                 io.write(oneDigit)
  80.                 strTmpR = strTmpR .. oneDigit
  81.                 tmpR = tonumber(strTmpR)
  82.             end
  83.         end
  84.     end
  85.    
  86.     print("")
  87.     return tmpR
  88. end
  89. if #arg < 2 then
  90.     printUsage()
  91.     os.exit(1)
  92. end
  93. a = null
  94. b = null
  95. a = tonumber(arg[1])
  96. b = tonumber(arg[2])
  97. if a <= 0 then
  98.     print("피제수: " .. a)
  99.     print("피제수는 양의 정수라야 합니다.")
  100.     os.exit(1)
  101. elseif b <= 0 then
  102.     print("제수: " .. b)
  103.     print("제수는 양의 정수라야 합니다.");
  104.     os.exit(1)
  105. end
  106. q = math.floor(a / b)
  107. r = a % b
  108. io.write("나눗셈 " .. a .. " ÷ " .. b .. " 의 결과: ")
  109. io.write("몫: " .. q .. ", ")
  110. print("나머지: " .. r)
  111. print("")
  112. k = makeTable(a, b, q)
  113. if k == r  then
  114.     print("\n나머지: " .. k)
  115. end
  116. if k == 0 then
  117.     print(a .. " = " .. b .. " x " .. q)
  118.     print(a .. getSuffix(a) .. " " .. b .. "의 배수(mupltiple)이다.")
  119.     print(b .. getSuffix(b) .. " " .. a .. "의 약수(divisor)이다.")
  120. else
  121.     print(a .. " = " .. b .. " x " .. q .. " + " .. r)
  122.     print(a .. getSuffix(a) .. " " .. b .. "의 배수(mupltiple)가 아니다.")
  123. end




실행> lua makeDivisionTable.lua 500210 61

나눗셈 500210 ÷ 61 의 결과: 몫: 8200, 나머지: 10

          8200
      ________
   61 ) 500210
        488
        ------
         122
         122
        ------
            10

나머지: 10
500210 = 61 x 8200 + 10
500210은 61의 배수(mupltiple)가 아니다.




Creative Commons License

이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

Posted by Scripter
,

Lua도 클래스 기반 객체지향 언어가 아니라 Self, Io, ECMAScript 언어들 처럼 프로토타입 기반 객체 지향 언어이다. Lua 언어에서 클래스 상속을 구현하기 위해서는 테이블과 함수가 필요하다.

아래의 소스 코드에서 inheritsFrom() 함수가 클래스 상속을 위해 구현돤 함수이다.
Lua 언어도 Java 언어 처럼 대소문자 구별을 엄격히 하므로 클래스를 선언하고 그 클래스로 객체 생성할 때 대소문자 구별을 꼭 지켜야 한다.

다음은 두 개의 클래스로 구성되어 있다.
Parent는 부모 클래스이고 Child는 Parent에서 상속 받은 자식 클래스이다.


-- Filename: testSubclassing.lua
--
-- A new inheritsFrom() function
--
function inheritsFrom( baseClass )

    local new_class = {}
    local class_mt = { __index = new_class }

    function new_class:create(name)
        local newinst = {}
        self.name = name
        setmetatable( newinst, class_mt )
        return newinst
    end

    if nil ~= baseClass then
        setmetatable( new_class, { __index = baseClass } )
    end

    -- Implementation of additional OO properties starts here --

    -- Return the class object of the instance
    function new_class:class()
        return new_class
    end

    -- Return the super class object of the instance
    function new_class:superClass()
        return baseClass
    end

    function new_class:sayName()
        print(self.name)
    end

    return new_class
end


Parent = inheritsFrom( nil )        -- pass nil because Parent has no super class
Child = inheritsFrom( Parent )    -- subclassing here

function Child:sayName()         --  Override method
    print("I am a chile, named as " .. self.name)
end

obj = Child:create("Dooly")
obj:sayName()




실행> lua testSubclassing.lua
I am a child, named as Dooly



LuaJava로 실행해도 된다.

실행> luajava testSubclassing.lua
I am a child, named as Dooly





Creative Commons License

Posted by Scripter
,

콘솔에 삼각형

         *
       * *
      *   *
     *     *
    *       *
   *         *
  *           *
 *             *
*****************


을 출력하는 Lua 소스 코드를 작성해 보자. 이런 소스 코드의 작성은 학원이나 학교에서 프로그래밍 입문자에게 과제로 많이 주어지는 것 중의 하나이다. 코끼리를 보거나 만진 사람들이 저마다 그 생김새를 말할 때 제각기 다르게 표현할 수 있듯이 이런 소스 코드의 작성도 알고 보면 얼마든지 많은 방법이 있을 것이다. 여기서는 쉬운 코드 부터 작성해 보고 차츰차츰 소스를 바꾸어 가면서 Lua 프로그래밍의 기초부분을 터득해 보기로 한다.

모든 소스 코드에서는 삼각형 출력 부분 담당 함수 printTriange()를 별도로 구현하였다.

우선 첫번 째 예제는 Lua의 컨솔 출력 함수 print()의 사용법만 알면 누구나 코딩할 수 있는 매우 단순한 소스 코드이다.


삼각형 출력 예제 1
--  Filename: printTriangle1.lua
--            Print a triangle on console.
--
--  Execute: lua printTriangle1.lua
--
--      Date:  2008/04/03
--    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]

function printTriange()
    print "        *        "
    print "       * *       "
    print "      *   *      "
    print "     *     *     "
    print "    *       *    "
    print "   *         *   "
    print "  *           *  "
    print " *             * "
    print "*****************"
end

printTriange()




위의 소스 코드는 아무 알고리즘도 없는 너무 단순한 코드이다. 이런 코드를 작성했다간 출력 모양이나 크기를 변경해야 하는 상황을 맞이하면 워드프로세서로 문서 만드는 것 이상으로 많은 수작업을 하거나 아니면 포기하는 지경에 이를 수도 있다. 그래서 다음 처럼 좀 더 나은 소스 코드를 작성하였다. Lua 언어의 출력 함수 print() 는 Python 언어의 print 처럼 새 줄 문자(newline, '\n')를 추가한다. Ruby 언어의 print(), Groovy 언어의 print(), 그리고 Java 언어의 System.out.print(), Python 언어의 sys.std.write() 처럼 새 줄 문자를 추가하지 않는 Lua 함수는 io.write() 이다.




삼각형 출력 예제 2
--  Filename: printTriangle2.lua
--            Print a triangle on console.
--
--  Execute: lua printTriangle2.lua
--
--      Date:  2008/04/03
--    Author:  PH Kim   [ pkim (AT) scripts.pe.kr

function printTriange()
    for i = 0,7 do
        for k = 0,7-i do
            io.write(" ")
        end
        for k = 0,2*i do
            if k == 0 or k == 2*i then
                io.write("*")
     else
                io.write(" ")
            end
        end
        for k = 0,7-i do
            io.write(" ")
        end
        print()
    end

    for i = 1,17 do
        io.write("*")
    end
    print()
end

printTriange()





위의 소스 코드는 Lua의 컨솔 출력 함수 print() 와  for 반복 구문을 적절히 사용하여 구현되었다. 숫자 몇 곳만 수정하면 출력되는 삼각형의 크기를 바꿀 수 있다. 한 줄에 출력될 문자를 구성하는 알고리즘은 위의 예제와 근본적으로 같지만, 그대신 스트링의 테이블(Lua 언어에서는 리스트와 맵을 모두 테이블이러고 부름)을 만들어 한 즐씩 출력하는 소스 코드를 다음 예제와 같이 작성해 보았다.
또 Ruby, Python, Groovy 언어에서 빈칸 17개의 문자로 구성된 리스트를 생성하기 위한 구문

        line2 = [" "]*17

에 해당하는 Lua 코드는

    line2 = {}
    for w in string.gfind((string.rep(" ", 17)), " ") do
        table.insert(line2, w)
    end

이다.



삼각형 출력 예제 3
--  Filename: printTriangle3.lua
--            Print a triangle on console.
--
--  Execute: lua printTriangle3.lua
--
--      Date:  2008/04/03
--    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]

function printTriange()
    local line2 = {}
    for w in string.gfind((string.rep(" ", 17)), " ") do
        table.insert(line2, w)
    end

    for i = 0,7 do
        line2 = {}
        for w in string.gfind((string.rep(" ", 17)), " ") do
            table.insert(line2, w)
        end
        line2[8-i+1] =  '*'
        line2[8+i+1] =  '*'
        print( table.concat(line2) )
    end

    for i = 1,17 do
        line2[i] =  '*'
    end
    print( table.concat(line2) )
end

printTriange()





별(*) 문자를 이용하여 삼각형을 출력하는 일은 빈칸 문자와 별 문자응 적당한 좌표(위치)에 촐력하는 일이다. 출력될 한 줄의 스트링을 완성한 후 하나의 print() 구문으로 출력하는 기법으로 소스 코드를 작성해 보았다. 소스 코드 중에

        local whites = string.rep(" ", 17)
        local stars  = string.rep("*", 17)

은 Ruby, Puthon, Groovy 언어에서 공동으로 쓰이는 코드

        whites = " "*17
        stars = "*"*17

에 대응하는 Lua 코드이다.




삼각형 출력 예제 4
--  Filename: printTriangle4.lua
--            Print a triangle on console.
--
--  Execute: lua printTriangle4.lua
--
--      Date:  2008/04/03
--    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]

function printTriange()
    local whites = string.rep(" ", 17)
    local stars  = string.rep("*", 17)
    local line2 = string.format("%s%s%s", string.sub(whites, 1, 8), "*", string.sub(whites, 1, 8))
    print(line2)
    for i = 1, 7 do
        line2 = string.format("%s%s%s%s%s", string.sub(whites, 1, 8-i), "*", string.sub(whites, 8-i+1,7+i), "*", string.sub(whites, 10+i))
        print(line2)
    end
    print(stars)
end

printTriange()





string은 immutable이라 그 내용을 변경할 수 없지만, 리스트는 그 요소(item)를 아무 때 나 변경할 수 있다. 한줄에 출력될 각 문자를 테이블 타입의 변수 line2에 저장한 후, table.concat() 함수를 이용한 구문

        print(table.concat(line2))

으로 그 리스트의 모든 요소item)가 모두 이어서 출력되게 하였다. 이는 Ruby의

       print(line2,join() + "\n")

또는

        line2.each { |x| print x }
        print("\n")

에 해당하는 Lua 코드이다.





삼각형 출력 예제 5
--  Filename: printTriangle5.lua
--            Print a triangle on console.
--
--  Execute: lua printTriangle5.lua
--
--      Date:  2008/04/03
--    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]

function printTriange()
    local whites = string.rep(" ", 17)
    local stars  = string.rep("*", 17)
    local start = 8
    local line2 = {}
    for w in string.gfind(whites, " ") do
        table.insert(line2, w)
    end
    line2[start + 1] = "*"
    print(table.concat(line2))
    for i = 1,7 do
        line2 = {}
        for w in string.gfind(whites, " ") do
            table.insert(line2, w)
        end
        line2[start - i + 1] = string.sub(stars, start - i + 1, start - i + 1)
        line2[start + i + 1] = string.sub(stars, start + i + 1, start + i + 1)
        print(table.concat(line2))
    end
    print(stars)
end

printTriange()





출력되는 삼각형이 좌우 대칭이라는 사실에 착안하여, 다음 소스 코드에서는  각 줄을 처음 8자, 중앙 한 문자, 끝 8자(처음 8자의 역순)로 string을 만들어 출력하였다.



삼각형 출력 예제 6
--  Filename: printTriangle6.lua
--            Print a triangle on console.
--
--  Execute: lua printTriangle6.lua
--
--      Date:  2008/04/03
--    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]

function printTriange()
    local whites = string.rep(" ", 8)
    local stars  = string.rep("*", 8)
    local start = 8
    line = whites .. '*' .. whites
    print(line)
    for i = 2,8 do
        line = string.sub(whites, 1, -i) .. '*' .. string.sub(whites, -i+1, -2)
        print( line .. ' ' .. string.reverse(line) )
    end
    line = stars .. '*' .. stars
    print( line )
end

printTriange()





다음 소스 코드는 한 줄에 출력될 문자열의 데이터를 17비트 이진법 수로 구성하고, 이 이진법수의 비트가 0인 곳에는 빈칸을, 1인 곳에는 별(*)을 출력하는 기법으로 작성되었다. Lua 언어가 구문에서 비트 연산을 지원하지 않는 관계로, 순수 Lua 코드로 작성된 LuaBit 라이브러리를 이용하였다. 압축 파일을 플고 bit.lua 파일을 printTriangle7.lua 가 있는 폴더에 저장하면 다음을 실행시킬 수 있다.




삼각형 출력 예제 7
--  Filename: printTriangle7.lua
--            Print a triangle on console.
--
--  Execute: lua printTriangle7.lua
--
--      Date:  2008/04/03
--    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]

require 'bit'

local BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

function convertItoA(num, radix)
    local isNegative = false
    if num < 0 then
        isNegative = true
        num = -num
    end

    local arr = ""

    local q = num
    local r = 0

    while q >= radix do
        r = math.fmod(q, radix)
        q = math.floor(q / radix)
        arr = arr .. string.sub(BASE36, r+1, r+1)
    end

    arr = arr .. string.sub(BASE36, q+1, q+1)
    if isNegative then
        arr = arr .. "-"
    end

    local n = string.len(arr)
    local ret = ""
    for i = 1, n do
        ret = ret .. string.sub(arr, n - i + 1, n - i + 1)
    end

    return ret
end

function convertAtoI(srcStr, radix)
    local isNegative = false
    local ret = 0
    local len = string.len(srcStr)
    local val = 0
    local c

    c = string.sub(srcStr, 1, 1)
    if c == '-' then
        isNegative = true
    elseif c >= '0' and c <= '9' then
        ret = string.byte(c) - string.byte('0')
    elseif c >= 'A' and c <= 'Z' then
        ret = string.byte(c) - string.byte('A') + 10
    elseif c >= 'a' and c <= 'z' then
        ret = string.byte(c) - string.byte('a') + 10
    end

    if ret >= radix then
        println("        Invalid character!")
        return ret
    end

    for i = 2, len do
        c = string.sub(srcStr, i, i)
        ret = ret * radix
        if c >= '0' and c <= '9' then
            val = string.byte(c) - string.byte('0')
        elseif c >= 'A' and c <= 'Z' then
            val = string.byte(c) - string.byte('A') + 10
        elseif c >= 'a' and c <= 'z' then
            val = string.byte(c) - string.byte('a') + 10
        end

        if val >= radix then
            println("        Invalid character!")
            return ret
        end

        ret = ret + val
    end

    return ret
end

function printTriange()
    local start = 0x100
    local total = 0
    local val = start
    local data = ""
    for k = 0, 7 do
        val = bit.bor(bit.blshift(start, k), bit.brshift(start, k))
        data = convertItoA(val, 2)
        for i = 1, 17-#data do
            io.write(" ")
        end
        for i = 1, #data do
            if string.sub(data, i, i) == "0" then
                io.write(" ")
            else
                io.write("*")
            end
        end
        print()
        total = bit.bor(total, val)
    end

    val = start*math.pow(2,8) + math.floor(start/math.pow(2,8))
    total = bit.bor(total, val)
    data = convertItoA(total, 2)
    for i = 1, 17-#data do
        io.write(" ")
    end
    for i = 1, #data do
        if string.sub(data, i, i) == "0" then
            io.write(" ")
        else
            io.write("*")
        end
    end
    print()
end

printTriange()



위와 마찬가지로 LuaBit 라이브러리를 이용하였다.
기본적인 원리는 위의 소스 코드와 같지만 이진법수의 한 비트 마다 한 문자씩 츨력하는 대신에 출력될 한 줄의 string을 완성하여 이를 print 구문으로 출력하는 기법으로 재작성한 것이 다음의 소스 코드이다. anotherString = string.sub(스트링, 원본, 타겟) 을 이용하여 모든 0을 빈칸으로, 모든 1을 별(*) 문자로 바꾸었으며, 별(*) 문자만으로 이루어진 마지막 줄 출력을 위해 변수 total을 준비하였다. for 반복 구문의 블럭 내에서 구문

            total = bit.bor(total, val)

은 Ruby, Python, Groovy 코드의 구문

            total |= val

에 해당하는데 이 구문이 하는 일이 무엇인지 이해할 수 있으면 좋겠다.





삼각형 출력 예제 8
--  Filename: printTriangle8.lua
--            Print a triangle on console.
--
--  Execute: lua printTriangle8.lua
--
--      Date:  2008/04/03
--    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]

require 'bit'

local BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

function convertItoA(num, radix)
    local isNegative = false
    if num < 0 then
        isNegative = true
        num = -num
    end

    local arr = ""

    local q = num
    local r = 0

    while q >= radix do
        r = math.fmod(q, radix)
        q = math.floor(q / radix)
        arr = arr .. string.sub(BASE36, r+1, r+1)
    end

    arr = arr .. string.sub(BASE36, q+1, q+1)
    if isNegative then
        arr = arr .. "-"
    end

    local n = string.len(arr)
    local ret = ""
    for i = 1, n do
        ret = ret .. string.sub(arr, n - i + 1, n - i + 1)
    end

    return ret
end

function convertAtoI(srcStr, radix)
    local isNegative = false
    local ret = 0
    local len = string.len(srcStr)
    local val = 0
    local c

    c = string.sub(srcStr, 1, 1)
    if c == '-' then
        isNegative = true
    elseif c >= '0' and c <= '9' then
        ret = string.byte(c) - string.byte('0')
    elseif c >= 'A' and c <= 'Z' then
        ret = string.byte(c) - string.byte('A') + 10
    elseif c >= 'a' and c <= 'z' then
        ret = string.byte(c) - string.byte('a') + 10
    end

    if ret >= radix then
        println("        Invalid character!")
        return ret
    end

    for i = 2, len do
        c = string.sub(srcStr, i, i)
        ret = ret * radix
        if c >= '0' and c <= '9' then
            val = string.byte(c) - string.byte('0')
        elseif c >= 'A' and c <= 'Z' then
            val = string.byte(c) - string.byte('A') + 10
        elseif c >= 'a' and c <= 'z' then
            val = string.byte(c) - string.byte('a') + 10
        end

        if val >= radix then
            println("        Invalid character!")
            return ret
        end

        ret = ret + val
    end

    return ret
end

function printTriange()
    local zeros  = "00000000"
    local start = 0x100
    local total = 0
    local val = start
    local line = ""
    local data = ""
    for k = 0, 7 do
        val = bit.bor(bit.blshift(start, k), bit.brshift(start, k))
        data = convertItoA(val, 2)
        line = string.sub(zeros, 1, 17-#data) .. data
        line = string.gsub(line, "0", " ")
        line = string.gsub(line, "1", "*")
        print(line)
        total = bit.bor(total, val)
    end

    val = bit.bor(bit.blshift(start, 8), bit.brshift(start, 8))
    total = bit.bor(total, val)
    data = convertItoA(total, 2)
    line = string.sub(zeros, 1, 17-#data) .. data
    line = string.gsub(line, "0", " ")
    line = string.gsub(line, "1", "*")
    print(line)
end

printTriange()





소스 코드가 처음 것 보다 매우 복잡해졌지만, Lua의 테이블을 이용해서 구현해 보았다. Lua 언어에서 말하는 테이블은 Groovy,  Python 언어에서 말하는 리스트와 맵을 합쳐 놓은 개념이다. Lua의 테이블은 갹채지향 프로그애밍을 할 때도 매우 요긴하게 쓰이는 자료형이다.
아래의 소스 코드에서

        print( table.concat(data) )

은 Ruby 언어에서 작성한 코드

        println data.join

에 해당하는 Lua 코드로서 테이블 안의 모든 요소(item)가 연이어 출력되게 한다.



삼각형 출력 예제 9
--  Filename: printTriangle9.lua
--            Print a triangle on console.
--
--  Execute: lua printTriangle9.lua
--
--      Date:  2008/04/03
--    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]

function printTriange()
    local start = 9
    local data = { }
    local last = { }
    for w in string.gfind(string.rep(" ", 17), " ") do
        table.insert(data, w)
        table.insert(last, w)
    end

    data[start] = "*"
    last[start] = "*"
    print( table.concat(data) )
    data[start] = " "

    for k = 1, 7 do
        data[start - k] = "*"
        last[start - k] = "*"
        data[start + k] = "*"
        last[start + k] = "*"
        print( table.concat(data) )
        data[start - k] = " "
        data[start + k] = " "
    end

    last[start - 8] = "*"
    last[start + 8] = "*"
    print( table.concat(last) )
end

printTriange()






다음 예제는 수학에서 xy-좌표평면에 점을 찍듯이 논리 구문

             (x + y - 8 == 0) || (y - x + 8 == 0) || (y - 8 == 0)

가 참이 되는 위치에 별(*) 문자를 표시하는 기법으로 작성된 소스 코드이다.




삼각형 출력 예제 10
--  Filename: printTriangle10.lua
--            Print a triangle on console.
--
--  Execute: lua printTriangle10.lua
--
--      Date:  2008/04/03
--    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]

function printTriange()
    for y = 0, 8 do
        for x = 0, 16 do
            if (x + y - 8 == 0) or (y - x + 8 == 0) or (y - 8 == 0) then
                a = '*'
            else
                a = ' '
            end
            io.write( a )
        end
        print()
    end
end

printTriange()





Creative Commons License

이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

Posted by Scripter
,

ASCII(애스키)란 American Standard Code for Information Interchange의 줄임글로서, 영문자에 기초한 문자 인코딩이다.  이 문자 인코딩에는 C0 제어문자(C0 control character)도 포함되어 있다.  ( 참고:  ASCII - Wikipedia, the free encyclopedia )

다음은  7bit ASCII 코드표를 만들어 보여주는 자바 소스 코드이다. 소스 코드 중에 진법변환에 필요한 함수

        convertAtoI(string, radix)
        convertItoA(number, radix)

의 구현도 포함되어 있다.



  1. --  Filename: makeAsciiTable.lua
  2. --            Make a table of ascii codes.
  3. --
  4. --  Execute: lua makeAsciiTable.lua
  5. --
  6. --      Date:  2008/03/28
  7. --    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  8. local BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  9. function println(s)
  10.     print(s)
  11. end
  12. function printUsage()
  13.     println("Usage: lua makeAsciiTable.lua")
  14.     println("Make a table of ascii codes.")
  15. end
  16. function convertItoA(num, radix)
  17.     local isNegative = false
  18.     if num < 0 then
  19.         isNegative = true
  20.         num = -num
  21.     end
  22.     local arr = ""
  23.     local q = num
  24.     local r = 0
  25.     while q >= radix do
  26.         r = math.fmod(q, radix)
  27.         q = math.floor(q / radix)
  28.         arr = arr .. string.sub(BASE36, r+1, r+1)
  29.     end
  30.     arr = arr .. string.sub(BASE36, q+1, q+1)
  31.     if isNegative then
  32.         arr = arr .. "-"
  33.     end
  34.     local n = string.len(arr)
  35.     local ret = ""
  36.     for i = 1, n do
  37.         ret = ret .. string.sub(arr, n - i + 1, n - i + 1)
  38.     end
  39.     return ret
  40. end
  41. function convertAtoI(srcStr, radix)
  42.     local isNegative = false
  43.     local ret = 0
  44.     local len = string.len(srcStr)
  45.     local val = 0
  46.     local c
  47.     c = string.sub(srcStr, 1, 1)
  48.     if c == '-' then
  49.         isNegative = true
  50.     elseif c >= '0' and c <= '9' then
  51.         ret = string.byte(c) - string.byte('0')
  52.     elseif c >= 'A' and c <= 'Z' then
  53.         ret = string.byte(c) - string.byte('A') + 10
  54.     elseif c >= 'a' and c <= 'z' then
  55.         ret = string.byte(c) - string.byte('a') + 10
  56.     end
  57.     if ret >= radix then
  58.         println("        Invalid character!")
  59.         return ret
  60.     end
  61.     for i = 2, len do
  62.         c = string.sub(srcStr, i, i)
  63.         ret = ret * radix
  64.         if c >= '0' and c <= '9' then
  65.             val = string.byte(c) - string.byte('0')
  66.         elseif c >= 'A' and c <= 'Z' then
  67.             val = string.byte(c) - string.byte('A') + 10
  68.         elseif c >= 'a' and c <= 'z' then
  69.             val = string.byte(c) - string.byte('a') + 10
  70.         end
  71.         if val >= radix then
  72.             println("        Invalid character!")
  73.             return ret
  74.         end
  75.         ret = ret + val
  76.     end
  77.     return ret
  78. end
  79. function makeTable()
  80.   asc = {
  81.     "NUL", "SOH", "STX", "ETX", "EOT",
  82.     "ENQ", "ACK", "BEL", "BS", "HT",
  83.     "LF", "VT", "FF", "CR", "SO",
  84.     "SI", "DLE", "DC1", "DC2", "DC3",
  85.     "DC4", "NAK", "SYN", "ETB", "CAN",
  86.     "EM", "SUB", "ESC", "FS", "GS",
  87.     "RS", "US", "Spc"
  88.   }
  89.   control = {
  90.     "NUL (null)",
  91.     "SOH (start of heading)",
  92.     "STX (start of text)",
  93.     "ETX (end of text)",
  94.     "EOT (end of transmission)",
  95.     "ENQ (enquiry)",
  96.     "ACK (acknowledge)",
  97.     "BEL (bell)",
  98.     "BS  (backspace)",
  99.     "TAB (horizontal tab)",
  100.     "LF  (line feed, NL new line)",
  101.     "VT  (vertical tab)",
  102.     "FF  (form feed, NP new page)",
  103.     "CR  (carriage return)",
  104.     "SO  (shift out)",
  105.     "SI  (shift in)",
  106.     "DLE (data link escape)",
  107.     "DC1 (device control 1)",
  108.     "DC2 (device control 2)",
  109.     "DC3 (device control 3)",
  110.     "DC4 (device control 4)",
  111.     "NAK (negative acknowledge)",
  112.     "SYN (synchronous idle)",
  113.     "ETB (end of trans. block)",
  114.     "CAN (cancel)",
  115.     "EM  (end of medium)",
  116.     "SUB (substitute, EOF end of file)",
  117.     "ESC (escape)",
  118.     "FS  (file separator)",
  119.     "GS  (group separator)",
  120.     "RS  (record separator)",
  121.     "US  (unit separator)",
  122.   }
  123.     local sbuf = ""
  124.     local abuf = ""
  125.     local tbuf = ""
  126.     local i, j
  127.     sbuf = "    "
  128.     for i = 1, 8 do
  129.         sbuf = sbuf .. "+----"
  130.     end
  131.     sbuf = sbuf .. "+"
  132.     println(sbuf)
  133.     sbuf = "    "
  134.     sbuf = sbuf .. "| 0- "
  135.     sbuf = sbuf .. "| 1- "
  136.     sbuf = sbuf .. "| 2- "
  137.     sbuf = sbuf .. "| 3- "
  138.     sbuf = sbuf .. "| 4- "
  139.     sbuf = sbuf .. "| 5- "
  140.     sbuf = sbuf .. "| 6- "
  141.     sbuf = sbuf .. "| 7- "
  142.     sbuf = sbuf .. "|"
  143.     println(sbuf)
  144.     sbuf = "+---"
  145.     for i = 1, 8 do
  146.         sbuf = sbuf .. "+----"
  147.     end
  148.     sbuf = sbuf .. "+"
  149.     println(sbuf)
  150.     for i = 0, 15 do
  151.         tbuf = ""
  152.         sbuf = convertItoA(i, 16)
  153.         tbuf = tbuf .. "| " .. sbuf .. " "
  154.         for j = 0, 7 do
  155.             if j*16 + i <= 32 then
  156.                 abuf = string.format("| %-3s", asc[j*16 + i + 1])
  157.             elseif j*16 + i == 127 then
  158.                 abuf = string.format("| %-3s", "DEL")
  159.             else
  160.                 c = j*16 + i
  161.                 abuf = string.format("| %2c ", c)
  162.             end
  163.             tbuf = tbuf .. abuf
  164.         end
  165.         tbuf = tbuf .. "|"
  166.         println(tbuf)
  167.     end
  168.     sbuf = "+---"
  169.     for i = 1, 8 do
  170.         sbuf = sbuf .. "+----"
  171.     end
  172.     sbuf = sbuf .. "+"
  173.     println(sbuf)
  174.     println("")
  175.     for i = 1, 16 do
  176.         tbuf = string.format("%-30s  %-34s", control[i], control[i+16])
  177.         println(tbuf)
  178.     end
  179. end
  180. if #arg > 0 and "-h" == arg[1] then
  181.     printUsage()
  182.     os.exit(1)
  183. end
  184. makeTable()




실행> lua makeAsciiTable.lua

    +----+----+----+----+----+----+----+----+
    | 0- | 1- | 2- | 3- | 4- | 5- | 6- | 7- |
+---+----+----+----+----+----+----+----+----+
| 0 | NUL| DLE| Spc|  0 |  @ |  P |  ` |  p |
| 1 | SOH| DC1|  ! |  1 |  A |  Q |  a |  q |
| 2 | STX| DC2|  " |  2 |  B |  R |  b |  r |
| 3 | ETX| DC3|  # |  3 |  C |  S |  c |  s |
| 4 | EOT| DC4|  $ |  4 |  D |  T |  d |  t |
| 5 | ENQ| NAK|  % |  5 |  E |  U |  e |  u |
| 6 | ACK| SYN|  & |  6 |  F |  V |  f |  v |
| 7 | BEL| ETB|  ' |  7 |  G |  W |  g |  w |
| 8 | BS | CAN|  ( |  8 |  H |  X |  h |  x |
| 9 | HT | EM |  ) |  9 |  I |  Y |  i |  y |
| A | LF | SUB|  * |  : |  J |  Z |  j |  z |
| B | VT | ESC|  + |  ; |  K |  [ |  k |  { |
| C | FF | FS |  , |  < |  L |  \ |  l |  | |
| D | CR | GS |  - |  = |  M |  ] |  m |  } |
| E | SO | RS |  . |  > |  N |  ^ |  n |  ~ |
| F | SI | US |  / |  ? |  O |  _ |  o | DEL|
+---+----+----+----+----+----+----+----+----+

NUL (null)                      DLE (data link escape)
SOH (start of heading)          DC1 (device control 1)
STX (start of text)             DC2 (device control 2)
ETX (end of text)               DC3 (device control 3)
EOT (end of transmission)       DC4 (device control 4)
ENQ (enquiry)                   NAK (negative acknowledge)
ACK (acknowledge)               SYN (synchronous idle)
BEL (bell)                      ETB (end of trans. block)
BS  (backspace)                 CAN (cancel)
TAB (horizontal tab)            EM  (end of medium)
LF  (line feed, NL new line)    SUB (substitute, EOF end of file)
VT  (vertical tab)              ESC (escape)
FF  (form feed, NP new page)    FS  (file separator)
CR  (carriage return)           GS  (group separator)
SO  (shift out)                 RS  (record separator)
SI  (shift in)                  US  (unit separator)



Creative Commons License

이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
Posted by Scripter
,

컴퓨터 프로그래밍에서 꼭 알아두어야 할 주요 진법은 당연히 10진법, 2진법, 8진법, 16진법이다.
다음은  0 에서 15 까지의 정수를 10진법, 2진법, 8진법, 16진법의 표로 만들어 보여주는 Lua 소스 코드이다. 진법 변환에 필요한 함수

        convertAtoI(string, radix)
        convertItoA(number, radix)

를 Lua 코드로 자체 작성하여 사용하였다.



  1. --  Filename: makeRadixTable.lua
  2. --            Show the radix table with 10-, 2-, 8-, 16-radices.
  3. --
  4. --  Execute: lua makeRadixTable.lua
  5. --
  6. --      Date:  2008/03/28
  7. --    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  8. BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  9. function println(s)
  10.     print(s)
  11. end
  12. function printUsage()
  13.     println("Usage: lua makeRadixTable.lua")
  14.     println("Show the radix table with 10-, 2-, 8-, 16-radices.")
  15. end
  16. function convertItoA(num, radix)
  17.     local isNegative = false
  18.     if num < 0 then
  19.         isNegative = true
  20.         num = -num
  21.     end
  22.     local arr = ""
  23.     local q = num
  24.     local r = 0
  25.     while q >= radix do
  26.         r = math.fmod(q, radix)
  27.         q = math.floor(q / radix)
  28.         arr = arr .. string.sub(BASE36, r+1, r+1)
  29.     end
  30.     arr = arr .. string.sub(BASE36, q+1, q+1)
  31.     if isNegative then
  32.         arr = arr .. "-"
  33.     end
  34.     local n = string.len(arr)
  35.     local ret = ""
  36.     for i = 1, n do
  37.         ret = ret .. string.sub(arr, n - i + 1, n - i + 1)
  38.     end
  39.     return ret
  40. end
  41. function convertAtoI(srcStr, radix)
  42.     local isNegative = false
  43.     local ret = 0
  44.     local len = string.len(srcStr)
  45.     local val = 0
  46.     local c
  47.     c = string.sub(srcStr, 1, 1)
  48.     if c == '-' then
  49.         isNegative = true
  50.     elseif c >= '0' and c <= '9' then
  51.         ret = string.byte(c) - string.byte('0')
  52.     elseif c >= 'A' and c <= 'Z' then
  53.         ret = string.byte(c) - string.byte('A') + 10
  54.     elseif c >= 'a' and c <= 'z' then
  55.         ret = string.byte(c) - string.byte('a') + 10
  56.     end
  57.     if ret >= radix then
  58.         println("        Invalid character!")
  59.         return ret
  60.     end
  61.     for i = 2, len do
  62.         c = string.sub(srcStr, i, i)
  63.         ret = ret * radix
  64.         if c >= '0' and c <= '9' then
  65.             val = string.byte(c) - string.byte('0')
  66.         elseif c >= 'A' and c <= 'Z' then
  67.             val = string.byte(c) - string.byte('A') + 10
  68.         elseif c >= 'a' and c <= 'z' then
  69.             val = string.byte(c) - string.byte('a') + 10
  70.         end
  71.         if val >= radix then
  72.             println("        Invalid character!")
  73.             return ret
  74.         end
  75.         ret = ret + val
  76.     end
  77.     return ret
  78. end
  79. function makeTable()
  80.     sbuf = ""
  81.     abuf = ""
  82.     tbuf = ""
  83.     for i = 1, 4 do
  84.         sbuf = sbuf .. "+-------"
  85.     end
  86.     sbuf = sbuf .. "+"
  87.     println(sbuf)
  88.     sbuf = "|  Dec"
  89.     sbuf = sbuf .. "\t|   Bin"
  90.     sbuf = sbuf .. "\t|  Oct"
  91.     sbuf = sbuf .. "\t|  Hex  |"
  92.     println(sbuf)
  93.     sbuf = ""
  94.     for i = 1, 4 do
  95.         sbuf = sbuf .. "+-------"
  96.     end
  97.     sbuf = sbuf .. "+"
  98.     println(sbuf)
  99.     for i = 0, 15 do
  100.         sbuf = string.format("|   %2d", i)
  101.         abuf = convertItoA(i, 2)
  102.         tbuf = string.format("\t|  %4s", abuf)
  103.         sbuf = sbuf .. tbuf
  104.         abuf = convertItoA(i, 8)
  105.         tbuf = string.format("\t|   %2s", abuf)
  106.         sbuf = sbuf .. tbuf
  107.         abuf = convertItoA(i, 16)
  108.         tbuf = string.format("\t|    %-2s |", abuf)
  109.         sbuf = sbuf .. tbuf
  110.         println(sbuf)
  111.     end
  112.     sbuf = ""
  113.     for i = 1, 4 do
  114.         sbuf = sbuf .. "+-------"
  115.     end
  116.     sbuf = sbuf .. "+"
  117.     println(sbuf)
  118. end
  119. if #arg > 0 and "-h" == arg[1] then
  120.     printUsage()
  121.     os.exit(1)
  122. end
  123. makeTable()



실행> lua makeRadixTable.lua

+-------+-------+-------+-------+
|  Dec  |   Bin |  Oct  |  Hex  |
+-------+-------+-------+-------+
|    0  |     0 |    0  |    0  |
|    1  |     1 |    1  |    1  |
|    2  |    10 |    2  |    2  |
|    3  |    11 |    3  |    3  |
|    4  |   100 |    4  |    4  |
|    5  |   101 |    5  |    5  |
|    6  |   110 |    6  |    6  |
|    7  |   111 |    7  |    7  |
|    8  |  1000 |   10  |    8  |
|    9  |  1001 |   11  |    9  |
|   10  |  1010 |   12  |    A  |
|   11  |  1011 |   13  |    B  |
|   12  |  1100 |   14  |    C  |
|   13  |  1101 |   15  |    D  |
|   14  |  1110 |   16  |    E  |
|   15  |  1111 |   17  |    F  |
+-------+-------+-------+-------+




Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
Posted by Scripter
,