Relacionado, mas isso requer apenas números inteiros positivos e não precisa ser comutativo
A função de emparelhamento Cantor é descrita neste artigo da Wikipedia . Essencialmente, é uma operação que, quando aplicada a dois valores X e Y, é possível obter os valores originais X e Y, considerando o resultado.
Sua tarefa é projetar duas funções: uma que executa X, Y -> Z
e a outra que executa Z -> X, Y
. Aqui está o problema: X, Y -> Z
deve ser comutativo. Isso significa que Z -> X, Y
não será possível determinar se a entrada foi X, Y
ou Y, X
.
A definição formal desse desafio seria:
Escolha um conjunto infinito contável de números.
Projete duas funções que executam as seguintes tarefas:
- Dado um par não ordenado de valores em S, retorne um valor em S
- Dado um valor de retorno da função inicial, retorne o par não ordenado de valores que é avaliado para o número inteiro de entrada quando passado pela primeira função. Não me importo com o comportamento dessa função inversa se a entrada não for um valor de retorno da primeira função.
Exigências
- O resultado deve ser idêntico entre as execuções.
{a, a}
é um par não ordenado
Nota: é mais provável que a sua resposta receba um voto positivo se você fornecer uma prova, mas testarei as respostas quando chegar a ela e a votarei assim que tiver certeza de que funciona.
1,2
é um dos pares,1,3
também pode ser um par em potencial (ambos usam1
)?f
e seu inversog
,sorted((x, y))
deve ser o mesmo quesorted(g(f(x, y)))
Respostas:
Haskell , 65 + 30 = 95 bytes
Experimente online!
Experimente online!
Nota: Quando as duas funções podem compartilhar código, são apenas 75 bytes:
Experimente online! O domínio são os números inteiros positivos. A função
(#)
realiza o emparelhamento, a função(l!!)
é inversa. Exemplo de uso: Ambos(#) 5 3
e(#) 3 5
rendimento12
, e(l!!) 12
rendimentos(5,3)
.Isso funciona listando explicitamente todos os pares classificados em uma lista infinita
l
:A codificação é então apenas o índice nesta lista.
fonte
Pitão , 8 + 6 = 14 bytes
Experimente online!
Experimente online!
Domínio: números inteiros positivos.
fonte
2
e10
por exemplo (que são de domínio)Gelatina , 8 + 11 = 19 bytes
Revertida, pois o algoritmo de Rod não funcionou.
Isso funciona no domínio dos números inteiros positivos.
Toma
x
ey
como 2 argumentos, não importa em que ordem, retornaz
.Experimente online!
Toma
z
e devolve[min(x, y), max(x, y)]
Experimente online!
fonte
JavaScript (ES7), 44 bytes
Mapeia de números inteiros não negativos para um subconjunto deles.
fonte
C (gcc) , 36 + 39 = 75 bytes
Obrigado a @tsh por salvar dois bytes.
O domínio é números inteiros não negativos.
Toma
x
ey
retornaz
.Toma uma
int
matriz de dois elementos . O segundo elemento deve ser definido comoz
antes da chamada. Após a chamadar
conterx
ey
.Experimente online!
fonte
(x+1)
->-~x
Geléia ,
1311 bytespar de números inteiros positivos para número inteiro positivo, 5 bytes
Experimente online!
número inteiro positivo para par de números inteiros positivos, 6 bytes
Experimente online!
Algoritmo
Se ordenarmos o conjunto de todos os pares não ordenados de números inteiros positivos pelo seu máximo e depois pela sua soma, obteremos a seguinte sequência.
{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},…
A primeira função pega um par {x, y} e encontra seu índice nessa sequência.
A segunda função leva um número inteiro positivo z e retorna o z th produto da sequência.
Observe que esse mapeamento é o mesmo da resposta Jelly do @ EriktheOutgolfer .
Como funciona
fonte
c
eŒċ
... embora eu possa estar errado. BTW, que foi a minha resposta que você superou> _>Mathematica (35 + 53) = 78 bytes
Essa é a única função de emparelhamento quadrático conhecida para Z <--> ZxZ combinada com Min e Max para torná-la sem ordem.
fonte
Ruby, 66 bytes
Estou tentando encontrar uma maneira de selecionar astuciosamente um conjunto infinito para tornar isso mais fácil, este é o melhor que tenho até agora.
Definimos f (x, y) = 2 x-1 bit a bit ou 2 y-1 . O domínio consiste no conjunto definido recursivamente como contendo 1,2 e todos os números que podem ser produzidos chamando f nos números do conjunto (observe que f (1,1) = 1 ef (2,2) = 2, então 1 e 2 têm inversos). Todos os números resultantes têm um ou dois 1s em sua expansão binária, com os índices dos 1s correspondentes aos números no conjunto. Podemos obter o par não ordenado original retirando os índices. Se houver apenas um 1, isso significa que os elementos do par são iguais.
Por exemplo, f (3,5) é 20, porque 20 é 10100 na base 2, que possui 1s nos 3º e 5º lugares menos significativos.
fonte
Java 8,
153146141137 +268224216205 bytesFunção de par
Experimente online!
Função Depair
Experimente online!
fonte
int i=(""+a[0]).length()
pode serint i=(f+a[0]).length()
; o espaço entre elesc=0,j;i>0;
pode ser removido;a[0].parseInt
pode sernew Integer
. Na função de desespero: todos os trêsr.parseInt
podem serr.decode
; e você pode fazer uma variável int parat.length()
, desde que você a use duas vezes.05AB1E , 6 + 11 = 17 bytes
Porto da minha resposta Jelly.
Domínio: números inteiros positivos.
Pega uma lista
[x, y]
como entrada, retornaz
.Experimente online!
Pega um número inteiro positivo
z
como entrada, retorna[min(x, y), max(x, y)]
.Experimente online!
-5 graças a Emigna .
fonte
2ã€{RÙR
!JavaScript, 72 bytes
Funciona para números inteiros positivos (em teoria). Idéia bastante simples: classifique dois números em alguma ordem (mágica), conecte-os como string por uma letra
"a"
, analise-o como número inteiro hexadecimal.Mostrar snippet de código
fonte
MATL, 6 + 8 = 14 bytes
Função de codificação, aceita duas entradas n, m. Produz o produto de enésimo primo e enésimo primo.
Passos:
,
- faça duas vezesi
- Entrada pushYq
- Entrada pop, entrada push'th prime]*
- Finalize duas vezes, coloque os dois primos e empurre o produtoFunção de decodificação, leva uma entrada m. Emite o número de primos abaixo de cada um dos fatores primos de n.
Passos:
i
- Entrada pushYf
- Entrada pop, push array de fatores principais"
- Para n na matriz@Zq
- Empurre a matriz de números primos abaixo de nn
- Pop array, comprimento do push do arrayIsso é comutativo porque a multiplicação é comutativa e injetável porque as fatorações primárias são únicas. Não que isso não esteja nos números inteiros.
fonte
Casca , 5 + 3 = 8 bytes
Eu realmente espero ter acertado o desafio, vejo algumas respostas excluídas que parecem válidas para mim ...
Pares de números inteiros positivos para um único número inteiro positivo:
Experimente online!
Ele funciona pegando os números nos índices fornecidos (indexados em 1) da lista de números primos e multiplicando-os.
Resultado da primeira função para pares de números inteiros positivos:
Experimente online!
Nós fatoramos o número de entrada e retornamos o índice na lista de números primos de todos (ambos) de seus fatores.
Exemplo trabalhado
Dado
(4,1)
como um casal inicial, pegamos o quarto e o primeiro números primos(7,2)
e os multiplicamos →14
. Essa multiplicação é o que torna a função independente da ordem dos dois elementos.Começando por
14
, nós o fatoramos(2,7)
e retornamos os índices de2
e7
na lista de números primos →(1,4)
.fonte
C # , 80 bytes (38 + 42)
Dados
Codificador
Int32
l
Número de entrada AInt32
r
Número de entrada AInt64
As duas entradas se fundiramDecodificador
Int32
v
O valorInt32[]
Uma matriz com as duas entradas originais.Golfe
Ungolfed
Ungolfed legible
Código completo
Lançamentos
80 bytes
- Solução inicial.Notas
fonte
Python: 41 + 45 = 86
codificador: 41
decodificador: 45
Tentativa anterior:
Python: 114: 30 + 84
codificador: 30
aceita 2 inteiros, retorna uma string
decodificador: 86
decoder2: 120
outra tentativa com compreensão e soma de geradores
fonte
e=lambda*x:10**sum(x)-10**min(x);d=lambda z:map(
z.count,'09')
; TIO