#lua
#lua
Вопрос:
Мы выполняем задачу, поскольку принимаем число в качестве начального значения для math.randomseed()
и генерируем случайное целое число (интервал [1,6]), используя math.random()
во время каждой итерации цикла, и продолжаем цикл, пока число не станет равным 6.
Для которого мы написали код как
i = io.read()
local count = 0
math.randomseed(i)
for x = 1, 4 do
value = math.random(1, 6)
print(value)
count = count 1
end
print(count)
Нам не удалось пройти тест, потому что
Input (stdin)
Run as Custom Input
0
Your Output (stdout)
3
5
5
6
2
Expected Output
3
5
5
6
4
Пожалуйста, помогите нам
Комментарии:
1. предполагается, что вы запускаете цикл до тех пор, пока случайное значение не будет равно шести. так что перестаньте менять ограничение цикла for каждые 2 минуты. не могли бы вы, пожалуйста, прочитать руководство по Lua? если вам нужно что-то повторять до тех пор, пока не будет выполнено какое-либо условие, почему бы не дать шанс оператору repeat until?
2. это окончательный код, который мы написали, и сейчас он все еще не работает как проблема…
3. i = io.read() local count = 0 local a = 6 math.randomseed(i) для x = 1, 4 делаем value = math.random(1, 6) повторяем печать (значение) до тех пор, пока значение < a count = count 1 завершает печать (количество)
4. и проверьте задачу. почему ожидаемый результат равен 3 5 5 6 4, если предполагается, что вы будете запускать его до тех пор, пока число не будет равно 6. тогда ожидаемый результат должен быть равен 3 5 5 6. но независимо от этого ваш код по-прежнему неверен
5. спасибо, мы поняли вашу точку зрения, но почти не получаем, значение равно 6, тогда как мы должны выйти
Ответ №1:
В операционном коде, похоже, возникают проблемы с циклом. Я рекомендую OP прочитать документацию Lua о структурах управления, где описаны Lua while
, repeat until
и goto
, а также следующий раздел руководства о Lua For Statement. Сложно написать любую программу на любом языке, не понимая фундаментальных управляющих структур языка.
Проблема OP может быть решена различными способами.
Использование for
-- for version
i = io.read()
math.randomseed(i)
local count
for i = 1, math.huge do
local value = math.random(1, 6)
print(value)
count = i
if value == 6 then break end
end
print(count)
Здесь math.huge
самое большое представимое число в Lua, обычно специальное значение inf
, что делает это фактически бесконечным циклом. Переменная i
отслеживает, сколько случайных чисел было сгенерировано, но поскольку i
она не будет видна вне цикла, count
переменная необходима для копирования значения i
, чтобы его можно было распечатать в конце.
Использование while
-- while version
i = io.read()
math.randomseed(i)
local value = math.random(1, 6)
local count = 1
while value < 6 do
print(value)
count = count 1
value = math.random(1, 6)
end
print(value)
print(count)
Здесь зацикливающая конструкция начинается с теста, поэтому перед началом цикла необходимо создать тестовое значение. Это означает, что count
перед началом цикла должно быть инициализировано значение 1, и это также означает, что вызов math.random
будет дублироваться. Некрасиво.
Использование repeat until
-- repeat until version
i = io.read()
math.randomseed(i)
local count = 0
repeat
local value = math.random(1, 6)
print(value)
count = count 1
until value == 6
print(count)
Здесь тест выполняется в конце построения цикла. Это позволяет вызвать код math.random
только один раз.
Использование goto
-- goto version
i = io.read()
math.randomseed(i)
local count = 0
::loop::
local value = math.random(1, 6)
print(value)
count = count 1
if value < 6 then goto loop end
print(count)
Вероятно, вам не следует использовать goto
для решения этой проблемы, но вы можете. Вы должны быть осторожны с goto
в Lua; вы не можете перейти в блок, из функции или в область видимости локальной переменной.
Как вы можете видеть, в этих циклических конструкциях есть некоторые тонкости, и их использование требует некоторого знакомства с деталями.
Все четыре версии выдают идентичные выходные данные для одних и тех же входных данных:
$ lua loops.lua
42
2
5
3
2
2
4
6
7