2025年10月7日 星期二

Lua, 7 kyu:Circle cipher

 7 kyu:Circle cipher

這題我的寫法是:
local kata = {}

function kata.encode(s)
  local a, j = {}, 1
  for i = 1, (#s + 1) /2 do
    a[j] = string.sub(s, i, i)
    j = j + 2
  end
  j = 2
  for i = #s, #s/2 + 1, -1 do
    a[j] = string.sub(s, i, i)
    j = j + 2
  end
  return table.concat(a, "")
end

function kata.decode(s)
  local a, i = {}, 1
  for j = 1, #s, 2 do
    a[i] = string.sub(s, j, j)
    i = i + 1
  end
    i = #s
  for j = 2, #s, 2 do
    a[i] = string.sub(s, j, j)
    i = i - 1
  end
  return table.concat(a, "")
end

return kata
其中function kata.encode(s)
我想了很久,經過不斷try and error,
終於成功了,
不過function kata.decode(s)
就機乎不用想,很直覺就寫出來了。
因此我看了一下,別人function kata.encode(s)的寫法,
發現別人寫的比較直覺如下:
function kata.encode(s)
  local res = ""
  while #s > 0 do
    -- use first char
    res = res .. s:sub(1,1)
    s = s:sub(2)
    if #s > 0 then
      -- use last char
      res = res .. s:sub(-1)
      s = s:sub(1,-2)
    end
  end
  return res
end
語法說明:
s:sub(2)是返回第1個以外的字串,相當於s:sub(2, #s)
s:sub(-1)是返回最後一個字元
另外s:sub(-2)是返回倒數第2個字元和倒數第1個字元,所成的字串
s:sub(1, -2)是返回除了最後一個字元以外的字串

沒有留言:

張貼留言

Lua, 7 kyu:Circle cipher

 7 kyu: Circle cipher 這題我的寫法是: local kata = {} function kata.encode ( s ) local a , j = {}, 1 for i = 1 , (# s + 1 ) / 2 do ...