Связано, но это требует только натуральных чисел и не должно быть коммутативным
Функция сопряжения Кантора описана в этой статье Википедии . По сути, это такая операция, что, когда она применяется к двум значениям X и Y, можно получить исходные значения X и Y с учетом результата.
Ваша задача - разработать две функции: одну, которая выполняет, X, Y -> Z
а другую, которая выполняет Z -> X, Y
. Вот подвох: X, Y -> Z
должен быть коммутативным. Это означает, что Z -> X, Y
вы не сможете определить, был ли ввод X, Y
или Y, X
.
Формальное определение этого вызова будет:
Выберите счетное бесконечное множество S чисел.
Разработайте две функции, которые выполняют следующие задачи:
- Если дана неупорядоченная пара значений в S, вернуть значение в S
- Получив возвращаемое значение из исходной функции, верните неупорядоченную пару значений, которая вычисляется во входное целое число при прохождении через первую функцию. Меня не волнует поведение этой обратной функции, если входные данные не являются возвращаемым значением из первой функции.
Требования
- Результат должен быть одинаковым между пробегами.
{a, a}
неупорядоченная пара
Примечание: ваш ответ с большей вероятностью получит от меня отклик, если вы предоставите доказательство, но я проверю ответы, когда доберусь до него, и опрошу его, как только буду уверен, что это сработает.
1,2
одна из пар,1,3
также может быть потенциальной парой (обе используют1
)?f
и ее обратноеg
,sorted((x, y))
должно быть таким же, какsorted(g(f(x, y)))
Ответы:
Haskell , 65 + 30 = 95 байт
Попробуйте онлайн!
Попробуйте онлайн!
Примечание. Когда две функции могут совместно использовать код, это только 75 байтов:
Попробуйте онлайн! Домен является положительными целыми числами. Функция
(#)
выполняет сопряжение, функция(l!!)
обратная. Пример использования: Как(#) 5 3
и(#) 3 5
выход12
, и(l!!) 12
выходы(5,3)
.Это работает путем явного перечисления всех отсортированных пар в бесконечном списке
l
:Кодировка - это просто индекс в этом списке.
источник
Pyth , 8 + 6 = 14 байтов
Попробуйте онлайн!
Попробуйте онлайн!
Домен: целые положительные числа.
источник
2
и10
например (которые находятся в домене)Желе , 8 + 11 = 19 байт
Откат, так как алгоритм Рода не работал.
Это работает в области положительных целых чисел.
Принимает
x
иy
как 2 аргумента, не имеет значения, в каком порядке, возвращаетz
.Попробуйте онлайн!
Берет
z
и возвращает[min(x, y), max(x, y)]
Попробуйте онлайн!
источник
JavaScript (ES7), 44 байта
Отображает неотрицательные целые числа на их подмножество.
источник
C (gcc) , 36 + 39 = 75 байт
Спасибо @tsh за сохранение двух байтов.
Домен неотрицательных целых чисел.
Берет
x
иy
возвращаетz
.Принимает двухэлементный
int
массив. Второй элемент должен быть установленz
до вызова. После звонкаr
содержитсяx
иy
.Попробуйте онлайн!
источник
(x+1)
->-~x
Желе ,
1311 байтпара натуральных чисел в натуральное число, 5 байтов
Попробуйте онлайн!
целое положительное число в пару натуральных чисел, 6 байтов
Попробуйте онлайн!
Алгоритм
Если мы отсортируем множество всех неупорядоченных пар натуральных чисел по их максимуму, а затем по их сумме, мы получим следующую последовательность.
{1,1}, {1,2}, {2,2}, {1,3}, {2,3}, {3,3}, {1,4}, {2,4}, {3 , 4}, {4,4}, {1,5}, {2,5}, {3,5}, {4,5}, {5,5},…
Первая функция берет пару {x, y} и находит ее индекс в этой последовательности.
Вторая функция принимает положительное целое число z и возвращает z- й элемент последовательности.
Обратите внимание, что это отображение такое же, как в ответе Jelly @ EriktheOutgolfer .
Как это устроено
источник
c
иŒċ
... хотя я могу ошибаться. Кстати, это был мой ответ, что вы переиграли> _>Mathematica (35 + 53) = 78 байт
Это одна хорошо известная квадратичная функция сопряжения для Z <-> ZxZ в сочетании с Min и Max, чтобы сделать ее упорядоченной.
источник
Рубин, 66 байт
Я пытаюсь найти способ хитро выбрать бесконечный набор, чтобы сделать это проще, это лучшее, что у меня есть до сих пор.
Определим f (x, y) = 2 x-1 поразрядно или 2 y-1 . Домен состоит из набора, определенного рекурсивно как содержащего 1,2, и всех чисел, которые могут быть получены путем вызова f на числах в наборе (обратите внимание, что f (1,1) = 1 и f (2,2) = 2, поэтому 1 и 2 имеют обратные). Все получающиеся числа имеют одну или две единицы в их двоичном разложении, причем индексы единиц соответствуют числам в наборе. Мы можем получить оригинальную неупорядоченную пару, взяв индексы. Если есть только один 1, это означает, что элементы пары равны.
Например, f (3,5) равно 20, потому что 20 равно 10100 в основании 2, которое имеет 1 в 3-м и 5-м наименее значимых местах.
источник
Ява 8,
153,146,141,137 +268,224,216,205 байт.Парная функция
Попробуйте онлайн!
Функция удаления
Попробуйте онлайн!
источник
int i=(""+a[0]).length()
может бытьint i=(f+a[0]).length()
; пространство междуc=0,j;i>0;
может быть удалено;a[0].parseInt
может бытьnew Integer
. В функции deair: все триr.parseInt
могут бытьr.decode
; и вы могли бы сделать переменную int дляt.length()
, так как вы используете его дважды.05AB1E , 6 + 11 = 17 байт
Порт моего желе ответа.
Домен: целые положительные числа.
Принимает список в
[x, y]
качестве входных данных, возвращаетz
.Попробуйте онлайн!
Принимает положительное целое число в
z
качестве входных данных, возвращает[min(x, y), max(x, y)]
.Попробуйте онлайн!
-5 спасибо Эмигне .
источник
2ã€{RÙR
!JavaScript, 72 байта
Работает для натуральных чисел (в теории). Идея довольно проста: отсортировать два числа в некотором (магическом) порядке, соединить их в виде строки буквой
"a"
, проанализировать как шестнадцатеричное целое число.Показать фрагмент кода
источник
MATL, 6 + 8 = 14 байтов
Функция кодирования, принимает два входа n, m. Выводит произведение n-го простого и m-го простого.
шаги:
,
- Делай дваждыi
- Push-вводYq
- Поп-ввод, толчок ввода]*
- Конец делай дважды, вставляй оба простых числа и выдвигай товарФункция декодирования, занимает один вход м. Выводит число простых чисел ниже каждого из простых множителей n.
шаги:
i
- Push-вводYf
- Поп ввод, толчок массива простых факторов"
- для п в массиве@Zq
- толкать массив простых чисел ниже nn
- Поп массив, толчок длины массиваЭто коммутативно, потому что умножение коммутативно, и инъективно, потому что простые факторизации уникальны. Не то чтобы это не на целые числа.
источник
шелуха , 5 + 3 = 8 байт
Я действительно надеюсь, что выполнил задание правильно, я вижу некоторые удаленные ответы, которые кажутся мне действительными ...
Пары натуральных чисел в одно положительное целое число:
Попробуйте онлайн!
Он работает, беря числа по заданным индексам (1-индексированные) из списка простых чисел и умножая их.
Результат первой функции для пары натуральных чисел:
Попробуйте онлайн!
Мы разлагаем входное число и возвращаем индекс в списке простых чисел всех (обоих) его факторов.
Работал пример
В
(4,1)
качестве стартовой пары мы берем четвертое и первое простые числа(7,2)
и умножаем их →14
. Это умножение делает функцию независимой порядка двух элементов.Начиная с
14
, мы разлагаем его(2,7)
и возвращаем индексы2
и7
в списке простых чисел →(1,4)
.источник
C # , 80 байт (38 + 42)
Данные
кодировщик
Int32
l
числоInt32
r
числоInt64
Оба целых объединеныдешифратор
Int32
v
значениеInt32[]
Массив с двумя исходными целыми числами.Golfed
Ungolfed
Ungolfed читабельный
Полный код
релизы
80 bytes
- Исходное решение.Примечания
источник
Python: 41 + 45 = 86
кодировщик: 41
декодер: 45
Старая попытка:
Python: 114: 30 + 84
кодировщик: 30
принимает 2 целых числа, возвращает строку
декодер: 86
декодер2: 120
еще одна попытка с генератором пониманий и суммы
источник
e=lambda*x:10**sum(x)-10**min(x);d=lambda z:map(
z.count,'09')
; TIO