从切割中找到最小值 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
,它不接受 nil
s.
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
我有一个 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
,它不接受 nil
s.
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