Я пытаюсь построить элегантную функцию транспонирования, используя функции mapn и zip в Lua.
Карта и почтовый индекс следующие (из книги Луа):
function map(func, array)
local new_array = {}
for i,v in ipairs(array) do
new_array[i] = func(v)
end
return new_array
end
function mapn(func, ...)
local new_array = {}
local i=1
local arg_length = table.getn(arg)
while true do
local arg_list = map(function(arr) return arr[i] end, arg)
if table.getn(arg_list) < arg_length then return new_array end
new_array[i] = func(unpack(arg_list))
i = i+1
end
end
Они работают как положено.
Затем я определяю zip и транспонирую как:
function zip(...)
return mapn(function(...) return {...} end,...)
end
function transpose(...)
return zip(unpack(...))
end
Теперь транспонирование ({{1,2}, {3,4}, {5,6}}) дает {{1,3,5}, {2,4,6}}, как и ожидалось.
Но транспонирование ({{1,2}, {3,4}, {5}}) не дает {{1,3,5}, {2,4}}. Он производит только один ряд.
Как мне получить желаемый результат?
Я просто решил вместо этого написать «неэлегантную» функцию. Кажется, что нет гладкого способа использовать mapn и друзей.
function transp(L)
local n=#L
local m,M=1e42,0
--Get the beginning and end of resultant transpose list.
for i=1,n do
for k,v in pairs(L[i]) do
if M<k then M=k end
if m>k then m=k end
end
end
local nt={}
for i=m,M do
local rt={}
for j=1,n do
rt[j]=L[j][i]
end
table.insert(nt,rt)
end
return nt
end
Пожалуйста, критикуйте и улучшайте это решение.