Lua перебор именованных элементов в строке таблицы
Мне нужно перемешать вопросы и ответы в таблице.
Для перемешивания ответов маркированных последовательностью переменных a1 a2 a3 и т.д.
мне приходится их перебирать. Поиск последнего элемента делает функция getacount.
Наверное можно сделать поиск последнего ответа на вопрос как-то более эстетично, чем у меня.
Или вообще избавится от функция getacount.
Помогите сделать код более эффективным.
tbl=tbl or {}
table.insert(tbl, {q="Вопрос-1", a1="Ответ-1", a2="Ответ-2", a3="Ответ-3", a4="Ответ-4"})
table.insert(tbl, {q="Вопрос-2", a1="Ответ-1", a2="Ответ-2", a3="Ответ-3"})
table.insert(tbl, {q="Вопрос-3", a1="Ответ-1", a2="Ответ-2"})
table.insert(tbl, {q="Вопрос-4", a1="Ответ-1", a2="Ответ-2", a3="Ответ-3", a4="Ответ-4", a5="Ответ-5"})
table.insert(tbl, {q="Вопрос-5", a1="Ответ-1", a2="Ответ-2", a3="Ответ-3", a4="Ответ-4", a5="Ответ-5", a6="Ответ-6", a7="Ответ-7"})
table.insert(tbl, {q="Вопрос-6", a1="Ответ-1", a2="Ответ-2"})
function getacount(quest)
local tmp
local j = 1
local tmp = "a" .. tostring(j);
while quest[tmp] do
j = j + 1
tmp = "a" .. tostring(j);
end
j = j - 1
return j
end
function shuffleqAns (arr)
local t = getacount(arr)
for i = 1, t - 1 do
local j = math.random(i, t)
arr["a" .. tostring(i)], arr["a" .. tostring(j)] = arr["a" .. tostring(j)], arr["a" .. tostring(i)]
end
return arr
end
function shuffleQ (arr)
for i = 1, #arr - 1 do
local j = math.random(i, #arr)
arr[i], arr[j] = arr[j], arr[i]
end
end
function shuffleA (arr)
for i = 1, #arr do
shuffleqAns(arr[i])
end
end
print("==========================")
for i,n in ipairs(tbl) do
print(i, n.q)
print("------------")
for j = 1, getacount(n) do
print(n["a" .. tostring(j)])
end
print("------------")
end
print("==========================")
print("Перемешать ответы и вопросы")
shuffleA(tbl)
shuffleQ(tbl)
print("==========================")
for i,n in ipairs(tbl) do
print(i, n.q)
print("------------")
for j = 1, getacount(n) do
print(n["a" .. tostring(j)])
end
print("------------")
end
print("==========================")
Заранее спасибо.
Ответы (1 шт):
Автор решения: Mike V.
→ Ссылка
можно переделать индексацию ответов, так будет намного проще:
math.randomseed(os.time())
tbl=tbl or {}
table.insert(tbl, {q="Вопрос-1", [1]="Ответ-1", [2]="Ответ-2", [3]="Ответ-3", [4]="Ответ-4"})
table.insert(tbl, {q="Вопрос-2", [1]="Ответ-1", [2]="Ответ-2", [3]="Ответ-3"})
table.insert(tbl, {q="Вопрос-3", [1]="Ответ-1", [2]="Ответ-2"})
table.insert(tbl, {q="Вопрос-4", [1]="Ответ-1", [2]="Ответ-2", [3]="Ответ-3", [4]="Ответ-4", [5]="Ответ-5"})
table.insert(tbl, {q="Вопрос-5", [1]="Ответ-1", [2]="Ответ-2", [3]="Ответ-3", [4]="Ответ-4", [5]="Ответ-5", [6]="Ответ-6", [7]="Ответ-7"})
table.insert(tbl, {q="Вопрос-6", [1]="Ответ-1", [2]="Ответ-2"})
function shuffle(arr)
for i = 1, #arr - 1 do
local j = math.random(i, #arr)
arr[i], arr[j] = arr[j], arr[i]
end
end
function shuffleA (arr)
for i = 1, #arr do
shuffle(arr[i])
end
end
print("==========================")
for i,n in ipairs(tbl) do
print(i, n.q)
print("------------")
for j = 1, #n do
print(n[j])
end
print("------------")
end
print("==========================")
print("Перемешать ответы и вопросы")
shuffleA(tbl)
shuffle(tbl)
print("==========================")
for i,n in ipairs(tbl) do
print(i, n.q)
print("------------")
for j = 1, #n do
print(n[j])
end
print("------------")
end
еще, перед началом использования random рекомендуется выполнить инициализацию генератора случайных чисел math.randomseed(os.time())