Relacionado, pero esto solo requiere enteros positivos y no tiene que ser conmutativo
La función de emparejamiento de Cantor se describe en este artículo de Wikipedia . Esencialmente, es una operación tal que cuando se aplica a dos valores X e Y, uno puede obtener los valores originales X e Y dado el resultado.
Su tarea es diseñar dos funciones: una que realiza X, Y -> Z
y otra que realiza Z -> X, Y
. Aquí está el truco: X, Y -> Z
debe ser conmutativo. Esto significa que Z -> X, Y
no podrá determinar si la entrada fue X, Y
o Y, X
.
La definición formal de este desafío sería:
Elija un conjunto infinito contable S de números.
Diseñe dos funciones que realicen las siguientes tareas:
- Dado un par de valores desordenados en S, devuelve un valor en S
- Dado un valor de retorno de la función inicial, devuelve el par de valores desordenados que se evalúa en el entero de entrada cuando se pasa por la primera función. No me importa el comportamiento de esta función inversa si la entrada no es un valor de retorno de la primera función.
Requisitos
- El resultado debe ser idéntico entre ejecuciones.
{a, a}
es un par desordenado
Nota: es más probable que reciba una respuesta positiva de usted si proporciona una prueba, pero probaré las respuestas cuando llegue a ella y la votaré una vez que esté bastante seguro de que funciona.
1,2
es uno de los pares,1,3
también puede ser un par potencial (ambos usan1
)?f
y su inversog
,sorted((x, y))
debería ser lo mismo quesorted(g(f(x, y)))
Respuestas:
Haskell , 65 + 30 = 95 bytes
Pruébalo en línea!
Pruébalo en línea!
Nota: Cuando las dos funciones pueden compartir código, esto es solo 75 bytes:
Pruébalo en línea! El dominio son los enteros positivos. La función
(#)
realiza el emparejamiento, la función(l!!)
es inversa. Ejemplo de uso: Ambos(#) 5 3
y(#) 3 5
rendimiento12
, y(l!!) 12
rendimientos(5,3)
.Esto funciona enumerando explícitamente todos los pares ordenados en una lista infinita
l
:La codificación es solo el índice en esta lista.
fuente
Pyth , 8 + 6 = 14 bytes
Pruébalo en línea!
Pruébalo en línea!
Dominio: enteros positivos.
fuente
2
y10
por ejemplo (que están en el dominio)Gelatina , 8 + 11 = 19 bytes
Retrocedió ya que el algoritmo de Rod no funcionó.
Esto funciona en el dominio de los enteros positivos.
Toma
x
yy
como 2 argumentos, no importa en qué orden, regresaz
.Pruébalo en línea!
Toma
z
y devuelve[min(x, y), max(x, y)]
Pruébalo en línea!
fuente
JavaScript (ES7), 44 bytes
Mapas de enteros no negativos a un subconjunto de los mismos.
fuente
C (gcc) , 36 + 39 = 75 bytes
Gracias a @tsh por guardar dos bytes.
El dominio es enteros no negativos.
Toma
x
yy
vuelvez
.Toma una
int
matriz de dos elementos . El segundo elemento debe establecersez
antes de la llamada. Después de la llamadar
contienex
yy
.Pruébalo en línea!
fuente
(x+1)
->-~x
Gelatina ,
1311 bytespar de enteros positivos a entero positivo, 5 bytes
Pruébalo en línea!
entero positivo a par de enteros positivos, 6 bytes
Pruébalo en línea!
Algoritmo
Si clasificamos el conjunto de todos los pares de enteros positivos no ordenados por su máximo y luego por su suma, obtenemos la siguiente secuencia.
{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}, ...
La primera función toma un par {x, y} y encuentra su índice en esta secuencia.
La segunda función toma un entero positivo z y devuelve el z th elemento de la secuencia.
Tenga en cuenta que esta asignación es la misma que en la respuesta Jelly de @ EriktheOutgolfer .
Cómo funciona
fuente
c
yŒċ
... aunque puedo estar equivocado. Por cierto, esa fue mi respuesta que superaste> _>Mathematica (35 + 53) = 78 Bytes
Esta es la única función de emparejamiento cuadrático bien conocida para Z <--> ZxZ combinada con Min y Max para hacerla sin orden.
fuente
Ruby, 66 bytes
Estoy tratando de encontrar una manera de seleccionar astutamente un conjunto infinito para hacer esto más fácil, este es el mejor que tengo hasta ahora.
Definimos f (x, y) = 2 x-1 bit a bit-o 2 y-1 . El dominio consiste en el conjunto definido recursivamente como que contiene 1,2, y todos los números que pueden producirse llamando a f en los números del conjunto (tenga en cuenta que f (1,1) = 1 yf (2,2) = 2, entonces 1 y 2 tienen inversas). Todos los números resultantes tienen uno o dos 1 en su expansión binaria, con los índices de los 1 correspondientes a los números en el conjunto. Podemos obtener el par desordenado original tomando los índices. Si solo hay un 1, eso significa que los elementos del par son iguales.
Por ejemplo, f (3,5) es 20, porque 20 es 10100 en la base 2, que tiene 1s en el 3er y 5to lugares menos significativos.
fuente
Java 8,
153146141137 +268224216205 bytesFunción de par
Pruébalo en línea!
Función de degradación
Pruébalo en línea!
fuente
int i=(""+a[0]).length()
puede serint i=(f+a[0]).length()
; el espacio entrec=0,j;i>0;
se puede quitar;a[0].parseInt
puede sernew Integer
. En la función de pérdida: los tresr.parseInt
pueden serr.decode
; y podrías hacer una variable int parat.length()
, ya que la usas dos veces.05AB1E , 6 + 11 = 17 bytes
Puerto de mi respuesta de gelatina.
Dominio: enteros positivos.
Toma una lista
[x, y]
como entrada, devuelvez
.Pruébalo en línea!
Toma un entero positivo
z
como entrada, regresa[min(x, y), max(x, y)]
.Pruébalo en línea!
-5 gracias a Emigna .
fuente
2ã€{RÙR
!JavaScript, 72 bytes
Funciona para enteros positivos (en teoría). Idea bastante simple: ordenar dos números en un orden (mágico), conectarlos como una cadena por una letra
"a"
, analizarlo como un entero hexadecimal.Mostrar fragmento de código
fuente
MATL, 6 + 8 = 14 bytes
Función de codificación, toma dos entradas n, m. Producto de salidas de nth prime y mth prime.
Pasos:
,
- Haz dos vecesi
- Entrada de empujeYq
- Pop input, push input'th prime]*
- Finalice dos veces, reviente ambos primos y empuje el productoFunción de decodificación, toma una entrada m. Emite el número de primos debajo de cada uno de los factores primos de n.
Pasos:
i
- Entrada de empujeYf
- Entrada pop, matriz de factores primos"
- Para n en la matriz@Zq
- Empujar matriz de primos debajo de nn
- Pop array, longitud de empuje de la matrizEsto es conmutativo porque la multiplicación es conmutativa e inyectiva porque las factorizaciones primas son únicas. No es que esto no esté en los enteros.
fuente
Cáscara , 5 + 3 = 8 bytes
Realmente espero tener el desafío correcto, veo algunas respuestas eliminadas que me parecen válidas ...
Parejas de enteros positivos a un solo entero positivo:
Pruébalo en línea!
Funciona tomando los números en los índices dados (indexados en 1) de la lista de números primos y multiplicándolos.
Resultado de la primera función para parejas de enteros positivos:
Pruébalo en línea!
Factorizamos el número de entrada y devolvemos el índice en la lista de primos de todos (ambos) de sus factores.
Ejemplo trabajado
Dado
(4,1)
como una pareja inicial, tomamos el cuarto y primer número primo(7,2)
y los multiplicamos →14
. Esta multiplicación es lo que hace que la función sea independiente del orden de los dos elementos.A partir de
14
, lo factorizamos(2,7)
y devolvemos los índices de2
y7
en la lista de números primos →(1,4)
.fuente
C # , 80 bytes (38 + 42)
Datos
Codificador
Int32
l
un númeroInt32
r
un númeroInt64
Ambas entradas fusionadasDescifrador
Int32
v
el valorInt32[]
Una matriz con las dos entradas originales.Golfed
Sin golf
Legible sin golf
Código completo
Lanzamientos
80 bytes
- Solución inicial.Notas
fuente
Python: 41 + 45 = 86
codificador: 41
decodificador: 45
Intento anterior:
Python: 114: 30 + 84
codificador: 30
acepta 2 enteros, devuelve una cadena
decodificador: 86
decodificador2: 120
otro intento con comprensiones de generador y suma
fuente
e=lambda*x:10**sum(x)-10**min(x);d=lambda z:map(
z.count,'09')
; TIO