Если задано положительное целое k > 1
и неотрицательное целое число i
, k
создайте кортеж (или k
-мерный вектор) неотрицательных целых чисел. Для каждого k
, отображение из ℕ в ℕ к , должно быть биективен . То есть каждый вход i
должен создавать отдельный кортеж, а каждый возможный кортеж должен создаваться каким-либо вводом i
.
Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и выводя результат через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).
Вы можете использовать любой удобный, однозначный, плоский формат списка для вывода.
Ваше решение не должно налагать никаких искусственных ограничений на k
и , i
но вы можете предположить , что они вписываются в родной размер целого вашего языка. По крайней мере, вы должны поддерживать значения вплоть до 255
, хотя даже ваш собственный целочисленный размер меньше этого.
В любом случае 1 < k < 32
, ваш код должен дать результат в считанные секунды (конечно, если ваш ответ не поддерживает такой большой размер из-за предыдущего правила, ограничение корректируется соответствующим образом). Это не должно быть проблемой: это можно решить эту проблему таким образом, что он работает до 2 128 в течение нескольких секунд, но предел есть , чтобы избежать ответов , которые на самом деле итерации от до , чтобы найти результат.i < 231
i
0
i
Пожалуйста, включите в свой ответ описание выбранного вами отображения и обоснование его биективности (это не обязательно должно быть формальным доказательством).
Это код гольф, самый короткий ответ (в байтах) выигрывает.
Связанные проблемы
источник
q~2bW%1$Te]/zWf%2fbp
(обратный порядок ввода)CJam, 18 байт
Он использует более глупую формулу.
Попробуй это здесь .
объяснение
Таким образом, он отображает положительное целое число на:
источник
Python 2, 62
Этот код уродлив и пригоден для игры в гольф, но идея очень проста.
Упакуйте
k
двоичные расширения в одно, читая каждуюk
цифру с разными смещениями. Например, сk=3
, вход357
отображается в(3,0,7)
:Сжатие чисел обратно вместе меняет его, так что это биекция. При этом думайте о двоичных разложениях как о бесконечном числе ведущих нулей.
источник
J
382827 байтЭто молчаливый диадический глагол, который принимает i и k как левый и правый аргументы. Попробуйте его в Интернете с J.js .
идея
Определим отображение F: N → N K по F (I) = (а 1 , ... & alpha ; K-1 , р 1 α к ... р 2 & alpha ; K + 1 ... - 1) , где ⟨p п ⟩ является последовательность простых чисел и i + 1 = p 1 α 1 p 2 α 2 … .
По основной арифметической теореме отображение g: N → N ω, определяемое как g (i): = (α 1 , α 2 ,…) (показатели простой факторизации i + 1 ), биективно.
Поскольку f (i) = (g 1 (i),… g k-1 (i), g -1 (g k (i), g k + 1 (i),…)) , отображение f биективно как Что ж.
Код
источник
Python 2, 72
Функция
q
действует на двоичные числа, беря каждый второй бит, начиная с конца. В результатеq(z), q(z>>1)
приводятся два числа, чьи двоичные цифры перемежаются, чтобы датьz
. Например, 594 разбивается на 12 и 17.Это биекция, потому что мы можем сжать числа вместе, чтобы восстановить исходное число.
Функция
g
применяет этоk-1
время биекции , расширяясь от одного элемента к паре к тройке ... кk
-тупле. Каждый раз последний элемент расширяется до двух элементов. Это делается рекурсивно, сопоставляя входные данные с парой через биекцию, беря первый элемент пары для первой записи выходных данных и рекурсивно применяя функциюk-1
ко второму элементу для получения оставшихся записей.источник