Можно сказать, что функция (или программа), которая принимает входные данные и обеспечивает выходные данные, имеет цикл, если повторный вызов функции на ее собственном выходе в конечном итоге достигает исходного числа. Например, возьмите следующую функцию:
Input: n 1 2 3 4 5 6
Output: f(n) 5 7 1 3 4 9
Если мы начинаем с n=1
, f(n)=5
, f(f(n))=f(5)=4
, f(f(f(n)))=f(4)=3
, f(f(f(f(n))))=f(3)=1
.
Это написано (1 5 4 3)
. Поскольку в этом цикле 4 уникальных числа, это цикл длины 4.
Ваша задача - написать программу или функцию с циклами любой возможной длины. То есть должен быть цикл длины 1, длины 2 и так далее.
Кроме того, ваша функция / программа должна быть от положительных целых чисел до положительных целых чисел, и она должна быть биективной , то есть для каждого возможного выходного значения должно быть ровно одно входное значение по всем положительным целым числам. Другими словами, функция / программа должна вычислять перестановку натуральных чисел.
Подробности: разрешена любая стандартная система ввода / вывода, включая STDIN, STDOUT, аргумент функции, возврат и т. Д. Стандартные лазейки запрещены.
Вам не нужно беспокоиться об ограничениях типов данных - перечисленные выше свойства нужно хранить только в предположении, что, например, int
или float
может содержать любое значение.
Нет ограничений на поведение функции на входах, которые не являются положительными целыми числами, и эти входы / выходы будут игнорироваться.
Подсчет очков - это код в байтах, самый короткий код выигрывает.
источник
Ответы:
Pyth,
118 байтНамного скучнее, чем мой предыдущий ответ.
Каждое число, которое содержит 0 цифр, отображается на себя. Любое другое число отображается на число, цифры которого повернуты на 1. Так, например:
источник
Python 2,
565554 байтаВот первые 21 вывод:
Шаблон очевиден, если разбить список на куски примерно так:
источник
Pyth, 25 байт
Это та же последовательность, что и у @ Sp3000, но с закрытой формой. Закрытая форма:
источник
Python3, 40 байт
Каждое число, которое содержит 0 цифр, отображается на себя. Любое другое число отображается на число, цифры которого повернуты на 1. Так, например:
источник
Рубин, 22 + 1 = 23
С флагом командной строки
-p
запуститеКогда задано в качестве входных данных строковое представление числа (без завершающего символа новой строки), оно сохраняет первую цифру постоянной, а затем поворачивает остаток влево, таким образом,
1234
становится1342
.Это может быть уменьшено до 21 символа
$_=$1+$'+$2if/(.)(.)/
, но выводит предупреждение.источник
Рубин, 16 + 1 = 17
С флагом командной строки
-p
запуститеЭто более сложная функция, чем мой другой ответ, но, оказывается, она более пригодна для игры в гольф (и терпима к последующим переводам строки). Он берет последнюю ненулевую цифру ввода, плюс любые завершающие нули, и перемещает ее в начало числа. Так
9010300
становится3009010
. Любое число с n ненулевыми цифрами будет частью цикла n длины.Ввод - это строка в любой базе через STDIN, вывод - это строка в этой базе.
источник
Python, 43
Обратная функция Sp3000 в , реализовано рекурсивно.
Функция представляет собой один цикл, за которым следует два цикла, за которыми следует три цикла ...
Операция
n%k+1
действует какk
цикл на числах1..k
. Чтобы найти подходящийk
для использования, сдвиньте все внизk=1
, затемk=2
, и так далее, до тех пор, покаn<=k
.источник
Pyth, 15 байт
Самый короткий ответ, который использует числовые операции, а не строковые.
Влияние этой функции на двоичное представление заключается в расширении самого правого блока 1 с до следующего 0; или, если нет 0, чтобы сбросить его обратно до одного 1:
Pyth, 26 байтов, забавный вариант
Выполняет вышеуказанную операцию одновременно со всеми блоками 1 с, а не только с самым правым, все еще используя только побитовые и арифметические операции.
источник
Swift 1.2, 66 байт
источник
Брахилог , 5 байт
Попробуйте онлайн!
Порт ответа @ orlp's Pyth. Получается просто и аккуратно:
Первоначально я хотел портировать решение Python @ Sp3000, но это заняло колоссальные 23 байта :
Попробуйте онлайн!
источник
JavaScript (ES6), 43 байта
источник
Matlab (189)
Функция:
Отображает любое целое число в соответствии с его простыми множителями, если число равно нулю или разложено на 2 или 1, число сопоставляется с самим собой, в противном случае мы выбираем самый большой простой множитель из этого числа, затем мы увеличиваем оставшиеся различные простые простые множители на ближайший большего простого множителя, пока мы не достигнем числа,
biggest_prime^n
гдеn
есть сумма всех показателей всех факторов, как только мы достигнем этого количества, мы обращаемсяmax_prime*2^(n-1)
и воспроизводим тот же цикл снова.источник
Matlab (137)
2
до тех пор, пока мы не наткнемся на показатель степени,2
который делится на сумму показателей других простых факторов. затем мы переходим к началу цикла деления на2^(sum of exponents of other primes)
. другие онемели отображаются на себя.источник