Nesse desafio, você será solicitado a implementar qualquer função (ou programa completo) que cumpra duas propriedades. Essas propriedades são:
Sua função deve ser uma função injetável (reversível) dos polinômios com coeficientes inteiros não negativos para os inteiros não negativos. Isso significa que não há duas entradas desiguais que podem ser mapeadas para uma saída igual.
Sua função deve preservar o número total de "em bits" desde a entrada até a saída. Isso significa que, se você contar os 1 bits de cada coeficiente do polinômio, sua soma deverá ser igual ao número de 1 bits na representação binária da saída. Por exemplo,
9
está1001
em binário, por isso tem 21
bits.
IO
Um polinômio inteiro não negativo é igual a uma lista infinita de números inteiros não negativos, de modo que após um certo ponto todos os números inteiros sejam zero. Assim, os polinômios podem ser representados por listas infinitas (embora isso provavelmente seja indesejável) ou por listas finitas com zeros implícitos após o final da lista.
A principal distinção entre polinômios e listas finitas é que adicionar um zero ao final de uma lista mudará a lista:
A adição de um zero ao final de um polinômio não altera seu valor:
Portanto, se sua função usa uma lista finita representando um polinômio como entrada, adicionar um zero não deve alterar o resultado.
Ao representar polinômios como listas, você pode representá-los com a primeira ou a última entrada representando o termo constante. Por exemplo, você pode ter uma das seguintes possibilidades:
No primeiro caso, adicionar zeros ao final da lista não deve alterar o resultado; no segundo caso, adicionar zeros à frente da lista não deve alterar o resultado.
Obviamente, se o seu idioma suportar polinômios, você poderá considerá-los como entradas.
A saída deve ser uma saída inteira não negativa através de qualquer método padrão.
Isso é código-golfe, então as respostas serão pontuadas em bytes, com menos bytes sendo melhores.
[]
ou[0]
uma entrada válida?Respostas:
Gelatina , 8 bytes
Experimente online!
Inverso esquerdo, 5 bytes
Experimente online!
Como funciona
fonte
Wolfram Language (Mathematica) ,
3620 bytesExperimente online!
Toma um polinômio f (x) como entrada. Avalia y * f (y), onde y = 2 ^ (f (2)!). Lamentavelmente, isso significa que as saídas ficam muito grandes.
A avaliação de y * f (y) preservará o número de 1 bits sempre que y for uma potência 2 maior que qualquer coeficiente, o que é verdade para o valor escolhido acima. Escolhemos y = 2 ^ (f (2)!) Para tornar o resultado injetivo:
fonte
Wolfram Language (Mathematica) , 61 bytes
Experimente online!
Dois números inteiros positivos podem ser mapeados para um único número inteiro positivo. Let
a, b
Ser dois inteiros positivos. Entãoa, b -> (2a - 1) 2^(b-1)
é uma bijeção de NxN a N.Esta função encontra a posição de todos os
1
bits na entrada (do lugar 1s) e aplica uma variante somente injetiva do mapa acima a cada posição. Então, cada número resultante é elevado à potência de dois e todos os números são somados (o que é aceitável, pois aplicamos um mapa NxN -> N injetivo).Por exemplo:
Função inversa (124 bytes)
Aqui está uma função inversa para testar a injetividade.
Experimente online!
fonte
Python 2 ,
118117114103100 bytes100 bytes de Jonathan Frech:
Experimente online!
103 bytes com possibilidade de golfe 1
Experimente online!
-15 bytes graças a Jonathan Frech
Ele cria um número que primeiro contém os "em bits" e depois a representação unária da matriz, interpretada como um número trinário.
O número trinário é criado convertendo os números em cadeias binárias (
0bNNN
) e substituindob
por2
.1 Eu poderia ter economizado 14 bytes convertendo-o em um número de base 12, mas o TIO ficou sem memória e decidi usá-lo.
fonte
05AB1E , 14 bytes
Experimente online!
Produz os mesmos resultados que a solução de Dennis 'Jelly, mas a técnica é um pouco diferente.
Quão?
Vamos tentar a entrada
[1, 2, 3]
:fonte
Python 2 , 74 bytes
Experimente online!
fonte
JavaScript 6,
9683 bytesgera uma expressão binária
fonte
replace(/0|2/g,0)
parece também funcionar, mas mais difícil de decodificarx=>(t=x.map(k=>(x[0]+=k)&&2+k.toString(2)).join``).replace(/2/g,'0'.repeat(t))
. Sinta-se bem, mas não pode provar