Говорят, что функция имеет цикл длины n, если в ее области существует x, такой что f n (x) = x и f m (x) ≠ x при 0 <m <n , где верхний индекс n обозначает n - сложите приложение f . Обратите внимание, что цикл длины 1 является фиксированной точкой f (x) = x .
Ваша задача - реализовать биективную функцию от целых чисел до самих себя, которая имеет ровно один цикл каждой положительной длины n . Биективная функция - это взаимно-однозначное соответствие, т. Е. Каждое целое число сопоставляется ровно один раз. Наличие ровно одного цикла длины n означает, что существует ровно n различных чисел x, для которых f n (x) = x и f m (x) ≠ x при 0 <m <n .
Вот пример того, как такая функция может выглядеть вокруг x = 0 :
x ... -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 ...
f(x) ... 2 4 6 -3 -1 1 -4 0 -2 5 7 -7 -6 3 -5 ...
Этот отрывок содержит циклы длиной от 1 до 5 :
n cycle
1 0
2 -2 1
3 -4 -3 -1
4 -5 6 3 7
5 -7 2 5 -6 4
...
Обратите внимание, что выше я использую «функцию» только в математическом смысле. Вы можете написать либо функцию, либо полную программу на выбранном вами языке, если она принимает одно (подписанное) целое число в качестве входных данных и возвращает одно (подписанное) целое число. Как обычно, вы можете принимать ввод через STDIN, аргумент командной строки, аргумент функции и т. Д. И выводить через STDOUT, возвращаемое значение функции или аргумент функции (out) и т. Д.
Конечно, многие языки (легко) не поддерживают целые числа произвольной точности. Хорошо, если ваша реализация работает только с диапазоном целочисленного типа вашего языка, если он охватывает хотя бы диапазон [-127, 127], и что она будет работать для произвольных целых чисел, если целочисленный тип языка был заменен на произвольный точные целые числа.
Применяются стандартные правила игры в гольф .
источник
Ответы:
Pyth,
2718 байтПояснение (Pyth инициализируется
Q
во входное целое число):Это имеет циклы
(−1)
(0, -2)
(1, −3, −4)
(2, −5, −7, −6)
(3, −9, −13, −11, −8)
(4, - 17, -25, -21, -15, -10)
(5, -33, -49, -41, -29, -19, -12)
(6, -65, -97, -81, -57, −37, −23, −14)
(7, −129, −193, −161, −113, −73, −45, −27, −16)
(8, −257, −385, −321, −225 , -145, −89, −53, −31, −18)
(9, −513, −769, −641, −449, −289, −177, −105, −61, −35, −20)
⋮
Цикл длины n определяется как
( n - 2,
−2 ^ ( n - 2) --1 - 1,
−2 ^ ( n - 3) ⋅3 - 1,
−2 ^ ( n - 4) ⋅5 - 1,
…,
−2 ^ 2 ⋅ (2 · n - 7) - 1,
-2 ^ 1⋅ (2 · n - 5) - 1,
-2 ^ 0⋅ (2 · n - 3) - 1).
Каждое целое число k ≥ −1 появляется как первый элемент цикла ( k + 2). Для каждого целого числа k <−1 мы можем однозначно записать 1 - k = 2 ^ i ⋅ (2⋅ j + 1) для некоторого i , j ≥ 0; тогда k появляется как ( j + 2) -й элемент цикла ( i + j + 2).
источник
MATL , 47 байт
Попробуйте онлайн!
Общее объяснение
Функция 2 ниже такая же, как и в ответе @ Sp3000 на соответствующий вызов. Спасибо @ Agawa001 за то, что заметили.
Функция состоит из трех:
Функции 1 и 3 используются , потому что это проще (я думаю) , чтобы достичь желаемого поведения в N , чем в Z .
Функция 2 выглядит следующим образом: верхняя строка - домен, нижняя строка - кодомен. Запятые используются для ясности:
Первый блок (от верхнего
1
к нижнему1
) представляет собой цикл длины 1. Второй (от2 3
до3 2
) - цикл длины 2 и т. Д. В каждом блоке нижняя часть (изображение функции) - это верхняя часть, смещенная по кругу. один шаг вправо.Функция 1 выглядит следующим образом:
Функция 3 такая же, как 1 с двумя линиями поменялись местами.
Примеры
Образ
3
есть-5
. Первый3
сопоставлен7
с функцией 1; затем7
сопоставляется10
функцией 2; затем10
отображается на -5` функцией 3.Длина цикла равна 1
0
. Длина цикла - 2-1 1
. Длина цикла 3-3 2 -2
и т. Д.Код объяснил
Функции 1 и 3 просты.
Функция 2 работает путем нахождения нижней конечной точки соответствующего входного блока. Например, если вход для этой функции -
9
это находка7
(см. Блоки выше). Затем он выбирает верхнюю конечную точку, которая есть10
в примере. Круговое смещение блока достигается благодаря модульной индексации MATL на основе 1.источник
Python 2, 55 байт
59 байтов:
Создает циклы
Модифицировано из моего решения на более ранней проблеме , которая модифицирована от конструкции Sp3000 .
Функция
делает нечетные циклы неотрицательных чисел
Чтобы найти правильный размер цикла
k
, сдвигайте входn
вниз,k=1,3,5,7,...
пока результат не окажется в интервале[0,k)
. Цикл этого интервала с операциейn->(n+1)%k
, а затем отменить все вычитания, сделанные на входе. Это реализовано рекурсивноk+g(n-k,k+2)
.Теперь нам нужен негатив, чтобы сделать четные циклы. Обратите внимание, что если мы изменим,
g
чтобы начать сk=2
ing
, мы получим циклы четного размераОни связывают с негативами через битовое дополнение
~
. Итак, когдаn
отрицательно, мы просто оцениваемg(n)
как~g(~n,2)
.источник
k
кажется, что есть другой способ расчетаMath.floor(Math.sqrt(n))*2+1
.Python 3, 110 байт
Я до сих пор не понял, как получить там лямбду
если n - это номер треугольника [1,3,6,10,15,21,28 и т. д.], то f (n) - это порядок в списке, умноженный на отрицательный. если число отрицательное, присвойте ему 1 + следующий наименьший номер треугольника. иначе, приращение.
Пример: 5 не является числом треугольника, поэтому добавьте 1.
Следующая итерация, у нас есть 6. 6 - это номер треугольника, и это третье место в списке, так что получается -3.
Программа выдает эти списки
длина 1: [0]
длина 2: [1, -1]
длина 3: [2,3, -2]
длина 4: [4,5,6, -3]
длина 5: [7,8,9,10, -4]
Изменить: Еще раз спасибо @TuukkaX за удаление лишних символов.
источник
0.5
на.5
иinput('')
кinput()
.Python 3, 146 байт
Для каждого числа больше 0 существуют четные петли (len 2,4,6,8 ...), и меньше 0 - нечетные петли (1,3,5,7). 0 сопоставляется с 0.
(-3, -2, -1), (0), (1,2), (3,4,5,6)
карты для
(-2, -1, -3), (0), (2,1), (6,3,4,5)
Изменить: @TuukkaX удалил 8 байтов из предыдущего решения. И еще 3.
источник
mi
может быть изменен на что-то меньшее, напримерb
.f=lambda x:1+2*int(abs(x)**0.5)if x<1 else 2*int(x**0.5+0.5) x=int(input()) n=f(x) if x>0:b=n*(n-2)/4 else:b=-((n+1)/2)**2 print(b+1+(x-b-2)%n)
input('')
наinput()
. Кавычки бесполезны, так как нам не нужно ничего печатать на консоли, когда мы хотим просто получить ввод.f=lambda x:1+2*int(abs(x)**.5)if x<1 else 2*int(x**.5+.5) x=int(input());n=f(x) if x>0:b=n*(n-2)/4 else:b=-((n+1)/2)**2 print(b+1+(x-b-2)%n)
Matlab (423)
Неконкурентоспособен, потому что он побивает хороший рекорд того, чтобы быть близким к последнему рейтингу, в то время как я изо всех сил стараюсь сократить его, насколько это возможно.
Некоторые бессмысленные ошибки, касающиеся точности в matlab, которые я не смог найти, кроме как сделать мой код саркастически большим, с другой стороны, я выбрал отображение с точки зрения простых множителей и n-арного логарифма.
выполнение
объяснение
Прежде всего, зная, что любое число может быть записано как произведение показателей простых чисел
N=e1^x1*e2^x2...
из этой базы, я выбрал для отображения изображений циклов,C
которые извлекаются из наибольшего показателя наименьшего фактора (не обязательно простого), что N является совершенной степенью ,Проще говоря, пусть,
N=P^x
где P - наименьший совершенный корень,x
обозначает ровно два существенных члена цикла:x=Ʃ(r*P^i)
терминP
- это основание цикла, а также совершенный корень для основного числа N иk
степень циклаC=p^k
, гдеi
изменяется между 1 и k, коэффициентr
увеличивается на 1 и ограничивается P-1 для любого последующего предварительного изображения, пока все коэффициенты не будут установлены в r = 1, поэтому мы переходим к началу этого цикла.Чтобы избежать столкновений между циклами, выбор степени возведения в степень простых чисел, а не их произведений, является точным, поскольку в качестве примера можно привести два цикла оснований
3
и2
точку встречи между ними3*2
, поэтому этого избегают, поскольку цикл определяется его степенью больше, чем его база, а для точки встречи есть еще один цикл базы6
и степени 1.Отрицательные числа ставят исключение, поскольку для него я зарезервировал нечетные градусы для отрицательных чисел и четные градусы для остальных. Как же так ?
для любого числа N, встроенного в цикл
P^k
, записывается какP^(a0*P^i0+a1*P^i1+...)
, сумма(a0*P^i0+a1*P^i1+...)
переводится в P-арную базу какa0,a1,....
, чтобы прояснить этот момент, если (p = 2) последовательность должна быть в двоичной базе. Как известно предварительно без установки условия положительных / отрицательных степеней и исключения (+/- 1), число N находится на краях цикла степениk
тогда и только тогда, когда последовательностьA
записана как1111..{k+1}..10
или111..{k}..1
для всех оснований, в противном случае вращение не требуется, таким образом, при назначении отрицательного / положительного условия для соответствующих нечетных / четных степенейk/k'
для обоих получается нечетная последовательность, записанная в форме101..{k}..100
, четная последовательность записывается в форме101..{k'}..10
для начального края соответственно отрицательного / положительного числового цикла ,Пример:
Взяв число
N=2^10
,x=10=2^1+2^3
записывается последовательность AA=1010
, этот тип последовательности символизирует конечное ребро положительного числового цикла, то естьC=2^3
следующее изображение - это изображение начального ребра,A=011
которое8
, но , стандартизируя этот результат с (+ / -) 1 исключение2^10/2
сопоставляется8/2
и предыдущее изображение не должно вращаться.Взяв число
N=-3^9
,x=9=3^2
записывается последовательность AA=100
, этот тип последовательности символизирует конечное ребро отрицательного числового цикла, то естьC=3^1
следующее изображение - это изображение начального ребра,A=01
которое3
, но, адаптируя этот результат к отрицательному / положительному-3^9
карты условий для-3
.для пары
(-/+)1
я планировал внедрить его в число оснований цикла2
, при условии, что обычная последовательность циклических групп{2,4}{8,16,32,64}..
составлена в другой форме{1,2}{4,8,16,32}..
, это предотвращает любую потерю предыдущих элементов, а выполненная операция просто перемещается с появлением новый элемент в.Полученные результаты:
запустим этот маленький кодовый лист для проверки первых разумных диапазонов циклических чисел:
Это приводит к этим результатам
Последний - ошибка сегментации, но он соответствует стандартному целочисленному диапазону со знаком [-127,127].
источник
JavaScript (ES6), 73 байта
Работает, перечисляя последовательность (0, -1, 1, -2, 2, -3, 3, ...) до тех пор, пока она не найдет
n
, считая циклы по ходу.i
содержит текущую запись;j
содержит начало текущего цикла,k
индекс в цикле,l
длину текущего цикла иm
следующую запись в последовательности. Как только мы находим,n
мы берем,j
если мы находимся в конце цикла илиm
нет.источник