从切割中找到最小值 table Lua 5.1.5

finding minimum values from a cut table Lua 5.1.5

我有一个 Lua 脚本,可以将 table 变成片段:

function tablecut(t, n)
    local result = {}
    local j = 0
    for i = 1, #t do
        if (i-1) % n == 0 then
            j = j + 1
            result[j] = {}
        end
        result[j][#result[j]+1] = t[i]
    end
    return result
end

output = tablecut({'15', '62', '14', '91', '33', '55', '29', '4'}, 4)
for i = 1, #output do
    for j = 1, #output[i] do
        io.write(tostring(output[i][j])..'  ')
    end
    print()
end

输出:

15  62  14  91  
33  55  29  4

我正在尝试从切割列表中找到最小值,因此输出将如下所示:

15  62  14  91  
min = 14
33  55  29  4
min = 4

编辑:如果它有任何重要性,这就是我在 Lua 5.3 上使用它的方式,但在 Lua 5.1 上没有 table.move 功能。我不记得写这段代码时我的思维功能是如何工作的。

function indexOf(array, value)
  for i, v in ipairs(array) do
      if v == value then
          return i
      end
  end
  return nil
end


Indicies = {}
Answers = {}

function chunks(lst, size)
  local i = 1
  local count = 0
  return function()
    if i > #lst then return end
    local chunk = table.move(lst, i, i + size -1, 1, {})
    i = i + size
    count = count + 1
    return count, chunk
  end
end

local a = {91,52,19,59,38,29,58,11,717,91,456,49,30,62,43,8,17,15,26,22,13,10,2,23} --Test list
for i, chunk in chunks(a, 4) do
    x=math.min(a)
    print(string.format("#%d: %s", i, table.concat(chunk, ",")))
    table.sort(chunk)
    print(math.min(chunk[1]))
    table.insert(Answers, chunk[1])
    table.insert(Indicies, (indexOf(a, chunk[1])))

输出:

#1: 91,52,19,59
19
#2: 38,29,58,11
11
#3: 717,91,456,49
49

您的 table cut 函数可以简化,如果您想要像在 5.3 脚本中那样简单地获得输出,则循环输出需要使用迭代器。

function cuttable(t,n)
  local binned = {}
  
  for i=1,#t,n do
      local bin = {}
        for j=1,n do
            table.insert(bin, t[i + ((j - 1) % n)])
        end
      table.insert(binned, bin)
  end
  
  return binned
end

对于 for 循环,我们可以在 cuttable 的输出上使用 ipairs 让事情变得非常简单,然后我们只需执行与 concat 相同的步骤,然后排序并打印出我们的结果。

for k, bin in ipairs(cuttable(a,4)) do
    local output = "#" .. k .. ":" .. table.concat(bin, ",")
    table.sort(bin)
    print(output)
    print(bin[1])
end

输出

#1:91,52,19,59
19
#2:38,29,58,11
11
#3:717,91,456,49
49
#4:30,62,43,8
8
#5:17,15,26,22
15
#6:13,10,2,23
2

实现切割的一种方法是使用 for 循环 & unpack。我已经处理了 for 循环后长度不能被 4 整除的情况,以 (1) 最大化性能(不需要每次迭代都进行检查)和 (2) 能够直接将值传递给 math.min,它不接受 nils.

for i = 1, math.floor(#t / 4), 4 do
  print(unpack(t, i, i+4))
  print("min = " .. math.min(unpack(t, i, i+4)))
end
-- If #t is not divisible by 4, deal with the remaining elements
local remaining = #t % 4
if remaining > 0 then
  print(unpack(t, #t - remaining, remaining))
  print("min = " .. math.min(unpack(t, #t - remaining, remaining)))
end