2025年11月16日 星期日

Lua, 7 kyu, 排隊問題

 7 kyu, Lost Lineup

這題很簡單,我一開始實作的方法是:

local function find_lineup(distances)
  local a, d = {}, #distances
  for i = 1, d do
    a[i] = -1
  end
  for i = 1, d do
    local n = distances[i] + 1
    if -1 == a[n] then
      a[n] = i
    else
      return {}
    end
  end
  for i = 1, d do
    if -1 == a[i] then
      return {}
    end
  end
  return a
end

return find_lineup

很來看了別人的方法,

主要有兩點,會比我簡潔:

1. 利用a = {}時,空的table, 裡面的元素預設值是nil

例如 a[2] = nil

2. 利用排隊正常時,會排完,且每個人只佔住一個號碼,

因此排隊號碼,不可能大於總人數。

由以上兩點,我改寫如下:

local function find_lineup(distances)
  local a, d = {}, #distances
  for i = 1, d do
    local n = distances[i] + 1
    if nil == a[n] and n <= d then
      a[n] = i
    else
      return {}
    end
  end
  return a
end

return find_lineup


2025年11月11日 星期二

Lua的table,不能直接比較

 今天在寫

7 kyu: [BUG] XCOM-388: Mass spectrometer crashes

這一題時,
發現empty table的變數跟empty table的值用不相等比較時,
預期會是false (非不相等),但其實會傳回true,
如下:

> a = {}

> if a ~= {} then

>>  print(a)

>> end

table: 0x600002bbc640

> if a == {} then

>>  print(a)

>> end

> 

(後記,非空table比對,也是一樣)
如果要檢查,table是否空時,
可用next檢查,next()為true時,不為空table.
寫出程設題,如下:
local spectrometer = {}

function spectrometer.get_heaviest(atomic_masses)
  if atomic_masses and next(atomic_masses)then
    if #atomic_masses < 500000 then
      return math.max(table.unpack(atomic_masses))
    else
      local m = 0
      for i = 1, #atomic_masses do
        if atomic_masses[i] > m then
          m = atomic_masses[i]
        end
      end
      return m
    end
  else
    return 0
  end
end

return spectrometer
別人寫的跟我的大致類似,
除非用第三方的API,才有比較簡潔的寫法。

用Lua算UTF-8字串的長度

 7 kyu: Count of codepoints in a UTF-8 string

題目是算UTF-8字串的長度,

這題我實在不知道啥好方法,

可能也不太了解題目,

但是想到這種格式轉換,

在實際應用上,都是直接查答案的,

因此就直接問AI了,

AI的解法如下:

local function count_codepoints(s)
    local count = 0
    for i = 1, #s do
        local b = s:byte(i)
        -- b < 128: ASCII
        -- b >= 192: UTF-8 leading byte
        if b < 128 or b >= 192 then
            count = count + 1
        end
    end
    return count
end

return count_codepoints

不過這題AI最先的解法,

其實很多餘,

Lua 5.3+Lua 5.4 裡,其實已經內建,

採用以下的解法就好:

return utf8.len


Lua, 7 kyu, 排隊問題

 7 kyu,  Lost Lineup 這題很簡單,我一開始實作的方法是: local function find_lineup ( distances ) local a , d = {}, # distances for i = 1 , d do ...