Em desafios como Saída com o mesmo tamanho do código e Criar saída com o dobro do tamanho do código , pensei em um desafio separado, mas semelhante.
A tarefa é produzir uma saída. Pode ser uma string, uma lista de caracteres ou qualquer que seja o formato de saída padrão do seu programa. No entanto, sua saída deve sempre ter o mesmo comprimento, independentemente da entrada. E mais importante, a saída deve ser diferente para diferentes entradas .
Entrada
Um único número inteiro , cujos intervalos são determinados pela escolha do idioma. Se o seu idioma tiver números inteiros de comprimento variável, o intervalo será .
Saída
Uma sequência ou uma lista de caracteres ou uma impressão em STDOUT ou STDERR. Você pode usar apenas um desses métodos. A saída deve ter o mesmo comprimento, independentemente da entrada, mas cabe a você definir qual o comprimento. A saída pode não conter os caracteres de dígito 0-9
ou o sinal de menos-
. A saída deve ser determinística .
Você deve poder provar que, para cada saída, existe apenas uma entrada possível , seja por uma prova formal, um argumento ou uma busca por força bruta.
Esta é uma questão de código de golfe, portanto, retire todos os bytes estranhos. Todos os idiomas são bem-vindos, quanto mais, melhor!
Respostas:
JavaScript (ES8), 33 bytes
Espera a entrada no intervalo de inteiros JS seguros : .- 253≤ n < 253
Retorna uma sequência de 76 caracteres.
Experimente online!
Quão?
Passo 1
A entrada é primeiro convertida em binário. Isso preserva o sinal de menos à esquerda para números negativos.
Exemplos:
123
→"1111011"
-77
→"-1001101"
Passo 2
A sequência resultante é codificada na base-64.
Isso significa que cada bloco de 1 a 3 caracteres será transformado em um novo bloco de 4 caracteres. Essa conversão é segura porque nenhum dos blocos resultantes contém os símbolos proibidos (dígitos ou sinal de menos).
Blocos de 3 caracteres
Um único bloco final de 1 ou 2 caracteres deve ser codificado se o comprimento da cadeia binária não for múltiplo de 3:
Blocos de 1 caractere
Blocos de 2 caracteres
etapa 3
A saída final é preenchida com espaços à direita.
fonte
Python 3 ,
4939 bytesExperimente online!
-10 bytes graças a sete negativos
Converte o número inteiro em hexadecimal e precede espaços com até 9 caracteres no total. Em seguida, duplica o código ASCII de cada caractere na string (alguns se estendem para fora do ASCII em Unicode, mas o Python lida com isso), produzindo uma lista de caracteres.
Isso funciona porque cada dígito, inclusive
-
, é mapeado para um caractere ASCII diferente. Nenhum número inteiro entre-2147483648
e2147483648
é igual, portanto, convertê-los em espaços hexadecimais e anteriores não os tornaria iguais. Em seguida, o mapeamento para diferentes pontos de código não leva a colisões, portanto ainda não existem dois valores no intervalo que levam a saídas iguais.Python 3 ,
595647 bytesExperimente online!
-3 bytes graças ao Jitse
-9 bytes graças a sete negativos
O mesmo algoritmo, mas usando em
map
vez de umfor
loop.fonte
map
abordagem substituindolist( ... )
por[* ... ]
"%9x"%i
`4e9+n`
05AB1E ,
115 bytes-6 bytes portando a abordagem de @Stephen , por isso não deixe de votar nele!
Produz uma lista de até 100 caracteres, com uma quantidade de100 - ( comprimento de entrada ) de
@
(o dobro do ponto de código do espaço) e todos-0123456789
mapeados paraZ`bdfhjlnpr
(o dobro dos pontos de código ASCII).Experimente online.
Explicação:
Resposta original de 11 bytes :
Experimente online (limitado a em
1000
vez de2147483648
).Explicação:
O comprimento da saída sempre tem 2.147.483.648 caracteres. Ele produzirá2147483648 - | n | - 1 quantidade de espaços, anexada com |n | quantidade de novas linhas, anexada com um 'a' se n < 0 ou 'b' se n ≥ 0 .
fonte
brainfuck ,
4829281613 bytesEste programa requer células, ondecn∈ N , mas se você deseja resultados consistentes, verifique se cn< 256
A saída será obviamente única, independentemente do número que você digitar (- ∞ < n < ∞ ). Se o número inteiro for menor, o programa preencherá a saída para corresponder exatamente a ∞ bytes, portanto o comprimento é sempre o mesmo.
Essa resposta está um pouco ultrapassando o desafio, pois não afirmava que a saída deveria ser finita.
Experimente online!
Resposta original de 28 bytes:
Este irá preencher a saída com exatamente28- 1 bytes. O mecanismo de conversão de números funciona da mesma maneira aqui. Este programa assume o mesmo que o programa acima.
fonte
Python 3 , 39 bytes
Experimente online!
Transforma o número fornecido em uma representação de sequência binária (preenchida com espaços) e mapeia os caracteres
(space)-01
paracaab
com astr.translate
funçãofonte
Gelatina , 4 bytes
Um link monádico que aceita um número inteiro que gera uma lista de 52 caracteres.
Experimente online!
Quão?
Tão...
fonte
Ruby , 27 bytes
Experimente online!
('%34b'%n)
Converte um número inteiro em sua representação binária, usando..1
para indicar um número negativo (isto significa representar um prefixo infinitamente longo de 1s), e o coloca à esquerda em 34 caracteres usando espaços. Em seguida, substituímos0
s por 'a' e1
s por 'h' para criar a representação da base maníaca 2: strings como "haaahahahaaha" são precedidos por espaços e algumas vezes..
. Como cada passo aqui é invertível, é 1: 1.Editar: deixe o registro mostrar que a @manatwork postou esta solução idêntica primeiro. Opa Eu deveria ter me refrescado.
fonte
Gelatina , 6 bytes
Experimente online!
fonte
C (gcc) , 38 bytes
Experimente online!
Isso expande cada bit do número inteiro de entrada em um byte que é 0 ou 1 (que são caracteres não imprimíveis, mas não há regra contra isso). Portanto, a saída é sempre de 32 bytes e garantida como única.
fonte
f(a){putchar(a&1);f(a/2);}
C # (compilador interativo do Visual C #) , 35 bytes
Experimente online!
fonte
x = int.MinValue
porque não pode ser negado.Haskell, 31 bytes
Experimente online!
Adiciona
2^60
à entrada para que o número resultante tenha a mesma quantidade de dígitos para todo o intervalo de entrada. Transforme-se em uma string e mude cada caractere 10 lugares para a direita na ordem ASCII (0
->:
...9
->C
).fonte
C # (compilador interativo do Visual C #) , 52 bytes
Experimente online!
Uma abordagem diferente da solução ac # aproveita o fato de que o módulo c # é negativo para números negativos. Suponho que você poderia cortar um byte ou dois se você permitir caracteres não exibidos ('\ 0' e assim por diante) atualizando o
+65...
para não compensar o valor do caractere para algo legível por humanos.fonte
Perl 5
-MDigest::MD5=md5_hex -p
, 23 bytesExperimente online!
Anteriormente:
Perl 5
-p
, 29 bytesExperimente online!
Converte o número em sua representação binária de 64 bits, depois translitera
0
e1
paraa
eb
, respectivamente.fonte
T-SQL,
73 7061 bytesEstou apenas substituindo diretamente os dígitos (e
-
) por letras, depoisSTR
o número inteiro é preenchido com 11 caracteres. Nenhuma conversão para hexadecimal ou binária é necessária.TRANSLATE
foi introduzido no SQL 2017.INT
EDIT : economizou 3 bytes substituindo o preenchimento manual por uma conversão para CHAR (11), que é um formato de caractere de largura fixa que preenche automaticamente os espaços.
EDIT 2 : salvou 9 bytes usando a
STR()
função em vez deCAST
.STR
converte um número em uma sequência de texto preenchida no comprimento especificado.fonte
APL (Dyalog Unicode) , 28 bytes
Experimente online!
Dfn simples, usando um argumento inteiro. Usos
⎕IO←0
.O TIO vincula a um caso de teste de
-2^10
para2^10
. A0~⍨
parte remove a duplicata0
dos argumentos.Quão:
fonte
Japonês , 6 bytes
Eu acho que isso está certo. Inspirado na solução Python de Stephen, então, por favor
+1
.Tente
fonte
Malbolge , 2708 bytes
Experimente online!
fonte
Perl 6 , 12 bytes
Experimente online!
Anônimo Qualquer que seja o lambda que pega um número e string ORs com 11
@
s. Isso mapeia os dígitos parapqrstuvwxy
e o traço param
, em seguida, preenche a string com 11 caracteres com@
sfonte
Perl 5 (-p), 9 bytes
Experimente online!
Bitwxise-xor da entrada com a sequência
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
.fonte
Wolfram Language (Mathematica) ,
4433 bytesExperimente com um domínio menor
-2 graças a Greg Martin
>>
Null
True
fonte
2^31
e2^32
para13!
e14!
respectivamente. Com a perda de alguma "brevidade" na saída ....Stax , 6 bytes
Execute e depure
Procedimento:
fonte
PHP ,
6454 bytes-10 bytes usando a
strtr
função em vez da substituição manual de caracteres.Experimente online!
O maior valor int possível no PHP a partir de agora é
9223372036854775807
que tem 19 dígitos, considerando o sinal de menos em números negativos, será 20. O código acima substitui o sinal de menos (-
) peloA
caractere e todos os dígitos de0
para9
com um caractere deD
atéM
e, em seguida, aperta a corda à direita com caracteres de espaço para sempre ter 20 caracteres. Por exemplo, a saída para entrada de-9876543210
é"AMLKJIHGFED "
.A saída é exclusiva para cada entrada inteira e você pode retornar à entrada removendo todos os espaços, substituindo
A
por-
e substituindoD
porM
com0
por9
.PHP , 44 bytes
Experimente online!
Essa é a mesma idéia que a resposta de Arnauld . Converte a entrada em binário e depois em base-64. Também possui 88 caracteres (o comprimento maior
-9223372036854775807
corresponde a 88 caracteres), com o caractere de espaço à direita para obter sempre o mesmo comprimento na saída.fonte
Retina 0.8.2 , 21 bytes
Experimente online! Sempre envia 11 caracteres da gama
n
..z
. Explicação:Converta os caracteres ASCII imprimíveis em letras minúsculas. Isso mapeia
-
paran
e0
..9
paraq
..z
. (É realmente uma sorte que os dígitos tenham entre 16 e 25 caracteres ASCII imprimíveis!)Acrescente 10
o
s. Como a entrada terá entre 1 e 11 caracteres, agora existem entre 11 e 21 caracteres.Extraia os 11 primeiros caracteres. Como existem menos de 22 caracteres, isso corresponderá apenas uma vez.
fonte
Carvão , 9 bytes
Experimente online! Link é a versão detalhada do código. Sempre gera 10 espaços e letras maiúsculas. Explicação:
fonte
R , 37 bytes
Experimente online!
que está perto o suficiente para 1 para mim.
fonte
brainfuck ,
2019 bytes-1 byte graças a Krzysztof Szewczyk
Experimente online!
Gera o número com cada dígito e traço mapeado para 255 menos seu valor ordinal, preenchido com 255 caracteres com bytes NUL.
fonte
-[>,[->-<]>.[-]<<-]
R ,
40bytes 37Experimente online!
Uma alternativa à resposta de Robin Ryder ; isso é certamente determinístico.
Isso converte a entrada em um
raw
vetor de 32 bytes, cada byte sendo um número hexadecimal00
ou01
representando os bits do número inteiro. Em seguida, coagimos a alogical
comparando com0
, portanto,00
é mapeado paraFALSE
e01
paraTRUE
. Em seguida, precisamos remover uma única letra de cada umaFALSE
para garantir uma saída de igual comprimento, selecionada arbitrariamente para serS
. O resultado é impresso (com espaço) para um comprimento de 169.fonte
Zsh , 43 bytes
Experimente online!
Essa solução
long long
ultrapassa os limites dos números inteiros do Zsh trabalhando apenas com caracteres. Eu preenchi apenas 30 caracteres para facilitar a leitura, mas a substituição30
por99
permitirá que esse método funcione em todos os números de-1E99+1
até1E100-1
.O efeito de interpretar os códigos decimais como hexadecimais são os seguintes:
Zsh , 46 bytes
Experimente online!
Declara x como um número binário, preenchido com zero para uma largura de 66. Em seguida, mapeia
0
→a
e1
→b
. Também mapeamos2
e-
para a, uma vez que esses caracteres são impressos em[[-]][base]#[num]
notação. Para ver a$x
aparência antes da substituição e os limites do Zsh na análise de tipos inteiros, verifique a saída Debug no link TIO.fonte
Java (JDK) , 42 bytes
Experimente online!
Primeiro, isso cria a representação hexadecimal da entrada, preenchida à esquerda com espaços que fornecem a mesma restrição de comprimento (8 caracteres), remove o sinal de menos e mantém cada saída intermediária exclusiva.
Isso fornece uma sequência com 17 caracteres possíveis diferentes:
0123456789abcdef
e espaço.Cada caractere é transmitido e mapeado adicionando 64 ao seu ponto de código, se for um dígito ou um espaço. Efetivamente, isso resulta no seguinte mapeamento:
0123456789abcdef<space>
para opqrstuvwxyabcdef`
qual possui 17 caracteres diferentes, portanto, dois números não resultarão na mesma saída.fonte
Bash , 30 bytes
Experimente online!
fonte