Последовательность Кузнецова
(I made the name up, don't bother with Wikipedia or Google)
Учитывая любое число n > 0
, позвольте r
представить обратное число n
. Итерируйте до тех пор, пока конечный результат не станет равным нулю, передавая результат каждой итерации обратно в функцию, используя рекурсию или методологию по вашему выбору, выполнив следующую операцию:
- Если
r > n
для этой итерации результат будетr % n
. - Если
n > r
для этой итерации результат будетn % r
. - Если
n % r = 0
илиr % n = 0
, вы прекращаете итерацию.
Возьмите промежуточный результат каждого выполнения и сохраните их в массиве для окончательного ответа. Начальный номер n
не является частью последовательности и не является 0
; примеры должны сделать все немного более очевидным.
Давайте пройдемся по примеру где n=32452345
.
54325423 % 32452345 = 21873078 # r > n, uses r % n
87037812 % 21873078 = 21418578 # r > n, uses r % n
87581412 % 21418578 = 1907100 # r > n, uses r % n
1907100 % 17091 = 9999 # n > r, uses n % r
9999 % 9999 = 0 # r % n = n % r = 0, terminated
Result: [21873078, 21418578, 1907100, 9999]
Другой пример n=12345678
:
87654321 % 12345678 = 1234575 # r > n, uses r % n
5754321 % 1234575 = 816021 # r > n, uses r % n
816021 % 120618 = 92313 # n > r, uses n % r
92313 % 31329 = 29655 # n > r, uses n % r
55692 % 29655 = 26037 # r > n, uses r % n
73062 % 26037 = 20988 # r > n, uses r % n
88902 % 20988 = 4950 # r > n, uses r % n
4950 % 594 = 198 # n > r, uses n % r
891 % 198 = 99 # r > n, uses r % n
99 % 99 = 0 # r % n = n % r = 0, terminated
Result: [1234575, 816021, 92313, 29655, 26037, 20988, 4950, 198, 99]
Последний пример n=11000
:
11000 % 11 = 0 # n % r = 0, terminated
Result: []
Это код-гольф с наименьшим количеством байтов.
Ответы:
05AB1E , 11 байт
Использует кодировку CP-1252 . Попробуйте онлайн!
источник
PowerShell v2 +, 89 байт
Итеративное решение. Длинный, потому что нет простого способа перевернуть массив, поэтому мы преобразуем его в строку и индексируем в обратном порядке для сохранения в
$r
. Затем псевдо-троичный, чтобы вытащить соответствующий модуль и повторно сохранить в$n
следующем раунде. Однако, если результат равен нулю, это означает, что!($n...)
будет$true
, поэтому мыexit
вместо$n
. Числа остаются в конвейере и (неявно) возвращаются в виде массива, но без инкапсуляции конвейера или сохранения результатов в переменную по умолчаниюWrite-Output
вставляется новая строка.Попробуйте онлайн! (Да, серьезно.)
PowerShell теперь на TIO! Вы должны дать ему секунду или две, потому что PowerShell - зверь для запуска, но теперь вы, да вы , можете проверить код PowerShell прямо в вашем браузере!
источник
Perl
4338 + 1 = 39 байтБеги с
-n
флагомПопробуйте онлайн! Включает два непустых примера.
Пояснительная таблица
-n
: Оборачивает всю программу вwhile(<>){ ... ;}
. Это превращает выше код в следующую строку:while(<>){say while$_=($;=reverse)>$_?$;%$_:$_%$;}
. Обратите внимание, точка с запятой была добавлена в трейлинг$
, поэтому теперь она становится экземпляром переменной$;
. В состоянииwhile
цикла<>
автоматически считывает одну строку ввода и сохраняет ее в$_
переменной. Итак, теперь давайте посмотрим, что интерпретатор читает во внешнемwhile
цикле:Исходный код, сохраненный для потомков: 43 + 1 = 44 байта
источник
$%>$_?$%%$_:$_%$%
Вы выбрали$%
переменную специально для этой строки?Pyth,
1312 байтБлагодаря @TheBikingViking.
Попробуйте онлайн: демонстрация
Мой старый код:
Попробуйте онлайн: демонстрация
Объяснение:
источник
t.u|%F_S,s_<backtick>
. ТестЖеле ,
15 1413 байтTryItOnline
Как?
источник
Желе ,
1312 байтЭто монадическая ссылка / функция, которая печатает в STDOUT.
Попробуйте онлайн!
Как это устроено
источник
Python 2,
9287817361 байтРекурсивное решение:
Попробуйте онлайн
Итеративное решение: (также 61 байт )
Попробуйте онлайн
источник
while n:
. В противном случае вы можете сделать это с 61 байтом .MATL , 16 байт
Попробуйте онлайн!
объяснение
источник
PHP, 78 байт
источник
Пакет, 140 байт
Принимает ввод в STDIN и выводит последовательность в отдельных строках. Batch имеет условные операторы (которые несколько многословны), но не содержит условных выражений, поэтому проще (несмотря на то, что нужно заключать в кавычки
%
) вычислитьr%n%r
(что равноr%n
ifn<r
или ноль ifn>r
) иn%r%n
(что равноn%r
ifn>r
или ноль ifn<r
) и добавить их вместе.источник
Mathematica, 68 байт
Спасибо Грегу Мартину за предложение использовать
FixedPointList
вместоNestWhileList
:Самое короткое, что я мог получить,
FixedPointList
- 73 байта:источник
11000
). Вы можете обойти это, переключившись на технику, описанную в вашем последнем абзаце. Но я не вижу, как избавитьсяRest
илиMost
таким образом. С другой стороны,FixedPointList[ Mod[(r = IntegerReverse@#)~Max~#, r~Min~#] &, #][[2 ;; -4]] &
только 68 байтов после удаления пробелов (бросает пару ошибок, nbd).{a,b,c,d}[[2;;-4]]
выдаст» ошибку, а не пустой список (скорее всего, я использовал запятую, а не;;
). Узнал что-то.Sort
:FixedPointList[-Mod@@Sort@-{#,IntegerReverse@#}&,#][[2;;-4]]&
JavaScript,
7270 байтОтредактировано:
-2 байта : оператор Spread ожидает объединения строк.
источник
R
126117 байтК сожалению, изменение числа (
as.double(paste(rev(el(strsplit(c(x,""),""))),collapse="")))
) довольно многословно. Отдыхать довольно легко. Используетsort
косвенную проверку, которая выше.Все остальное просто, оно продолжается до тех пор
x=0
, пока не будет напечатано все шаги.источник
C 87 байтов
t
временно для реверса. Внутренний цикл сдвигается наr
1 цифру влево и добавляет последнюю цифруt
до тех пор, пока она не будет исчерпана. Вывод идет после первой итерации и только если он ненулевой, чтобы предотвратить отображение первого и последнего элемента.Ungolfed и использование:
источник
Mathematica, 64 байта
Приведенный выше код представляет собой чистую функцию, которая принимает один вход и возвращает последовательность Кузнецова. Действительно прекрасная вещь в Mathematica состоит в том, что вы можете наносить слой на слой чистых функций ... Позвольте мне объяснить код;)
Каждый член в самой последовательности вычисляется с помощью приведенной ниже функции, которая принимает один вход и возвращает следующий член.
Код
IntegerReverse@#
только генерирует r, обратное значение. Код#2~If[#<=#2,Mod,#0]~#&
- это функция, которая принимает два входа и либо выполняет операцию мод, либо переворачивает входы и снова вызывает себя. Другой способ написать этоIf[#<=#2, Mod, #0][#2, #]&
, или это можно написать как обычную функцию, например:k[a_, b_] := If[a <= b, Mod, k][b, a]
источник
Ракетка 180 байт
Ungolfed:
Тестирование:
Ouput:
источник