Pyth , 4 байта
W
~O
Попробуйте онлайн!
Это в основном реализует алгоритм:
Q←inputRepeat1.2.3.temp←QQ←unif{0,Q−1}Print(temp)Untiltemp=0
Чтобы перевести Pyth в алгоритм, мы можем просто изучить, что означает каждый символ. Поскольку Pyth написан в префиксной нотации (то есть * + 1 2 3
есть (1 + 2) * 3
), мы можем начать слева и заполнять аргументы по мере продвижения.
W
начинается традиционный цикл while. Первый оператор после него является условием цикла, а второй оператор после него является телом цикла. Если второе утверждение пустое, оно становится неактивным . Это while работает точно так же, как Python while, поэтому оно будет оценивать ненулевые целые числа как True, а ноль - как false.
Первое утверждение через некоторое время начинается с символа новой строки. Это соответствует функции Пита «печатать и возвращать с новой строкой». Это принимает один аргумент, который затем печатается, а также возвращается без изменений. Это позволяет нам печатать промежуточные шаги, а также выполнять необходимые операции.
Аргумент, передаваемый этой функции печати, начинается с ~
чего-то особенного. Если символ сразу после ~
является переменной, он принимает два аргумента, в противном случае он принимает один. Поскольку O
переменная не ~
будет использовать только один аргумент. ~
функции +=
во многом похожи на многие обычные языки, хотя самым близким оператором будет оператор постинкремента ++
из C
. Вы можете знать, что x++
это будет похоже на использование x
в качестве текущего значения, но после этого x
будет x+1
. ~
это та же идея, но обобщенная на любой результат первого аргумента. Как он выбирает какую переменную назначить, будет рассмотрено позже.
Аргумент ~
IS , O
который очень прост. Когда его единственный аргумент является целым числом, O
возвращает значение от 0 до единицы меньше, чем это целое число, равномерно случайным образом.
Теперь вы могли заметить, O
что нет аргумента. Здесь интерпретатор Pyth любезно вводит предположение, которое здесь является переменной Q
. Q
имеет особое значение в Pyth: всякий раз, когда он присутствует в программе, программа Pyth начинается с назначения Q
входа программы. Так как это первая переменная, встречающаяся в ~
аргументе ', Q
теперь она также является переменной, которой ~
будет присвоено значение.
В итоге наша «читаемая» программа может выглядеть так:
while print_and_return( assign_variable( Q, unif(0, Q-1) ) ):
pass
И один пример «прогона» может выглядеть так:
- Q = 5
O
возвращает 3, ~
возвращает 5, \n
возвращает и печатает 5, что верно
- Q = 3
O
возвращает 0, ~
возвращает 3, \n
возвращает и печатает 3, что верно
- Q = 0
O
возвращает что-то неуместное, ~
возвращает 0, \n
возвращает и печатает 0, что является ложным
- Q = что-то не относящееся к делу
- прекратить