Avec des défis comme Output avec la même longueur que le code et Create output deux fois la longueur du code , j'ai pensé à un défi séparé, mais similaire.
La tâche consiste à produire une sortie. Il peut s'agir d'une chaîne, d'une liste de caractères ou du format de sortie par défaut de votre programme. Cependant, votre sortie doit toujours être de la même longueur, quelle que soit l'entrée. Et plus important encore, la sortie doit être différente pour différentes entrées .
Contribution
Un seul entier , dont les plages sont déterminées par le choix de la langue. Si votre langue a des entiers de longueur variable, la plage est .
Sortie
Une chaîne ou une liste de caractères, ou une impression vers STDOUT ou STDERR. Vous ne pouvez utiliser qu'une de ces méthodes. La sortie doit être de la même longueur quelle que soit l'entrée, mais c'est à vous de définir de quelle longueur il s'agit. La sortie peut ne pas contenir les caractères numériques 0-9
ou le signe moins-
. La sortie doit être déterministe .
Vous devriez pouvoir prouver que pour chaque sortie, il n'y a qu'une seule entrée possible , soit par une preuve formelle, un argument ou une recherche par force brute.
Ceci est une question de code de golf, donc rase tous les octets étrangers. Toutes les langues sont les bienvenues, mieux c'est!
Réponses:
JavaScript (ES8), 33 octets
Attend l'entrée dans la plage d' entiers JS sûrs :−253≤n<253 .
Renvoie une chaîne de 76 caractères.
Essayez-le en ligne!
Comment?
Étape 1
L'entrée est d'abord convertie en binaire. Cela préserve le signe moins de tête pour les nombres négatifs.
Exemples:
123
→"1111011"
-77
→"-1001101"
Étape 2
La chaîne résultante est codée en base-64.
Cela signifie que chaque bloc de 1 à 3 caractères sera transformé en un nouveau bloc de 4 caractères. Cette conversion est sûre car aucun des blocs résultants ne contient les symboles interdits (chiffres ou signe moins).
Blocs à 3 caractères
Un seul bloc final de 1 ou 2 caractères doit être codé si la longueur de la chaîne binaire n'est pas un multiple de 3:
Blocs à 1 caractère
Blocs à 2 caractères
Étape 3
La sortie finale est remplie d'espaces de fin.
la source
Python 3 ,
4939 octetsEssayez-le en ligne!
-10 octets grâce à sept négatifs
Convertit l'entier en hexadécimal et ajoute des espaces jusqu'à 9 caractères au total. Ensuite, double le code ASCII de chaque caractère de la chaîne (certains s'étendent en dehors de l'ASCII en Unicode, mais Python le gère correctement), produisant une liste de caractères.
Cela fonctionne car chaque chiffre, y compris
-
, est mappé sur un caractère ASCII différent. Aucun entier entre-2147483648
et2147483648
n'est égal, donc les convertir en espaces hexadécimaux et en préfixe ne les rendrait pas égaux. Ensuite, les mapper à différents points de code ne conduit pas à des collisions, il n'y a donc toujours pas deux valeurs dans la plage qui conduisent à des sorties égales.Python 3 ,
595647 octetsEssayez-le en ligne!
-3 octets grâce à Jitse
-9 octets grâce à sept négatifs
Même algorithme, mais en utilisant
map
au lieu d'unefor
boucle.la source
map
approche en remplaçantlist( ... )
par[* ... ]
"%9x"%i
`4e9+n`
05AB1E ,
115 octets-6 octets portant l'approche de @Stephen , alors assurez-vous de lui donner un vote positif!
Génère une liste de 100 caractères maximum, avec100−(input length) quantité de
@
(double le point de code de l'espace), et tous-0123456789
mappés surZ`bdfhjlnpr
(double les points de code ASCII).Essayez-le en ligne.
Explication:
Réponse originale de 11 octets :
Essayez-le en ligne (limité à
1000
au lieu de2147483648
).Explication:
La longueur de sortie comporte toujours 2 147 483 648 caractères. Il produira2147483648−|n|−1 nombre d'espaces, accompagné de |n| nombre de sauts de ligne, avec soit un 'a' si n<0 ou 'b' si n≥0 .
la source
enculé ,
4829281613 octetsCe programme nécessite des cellules, oùcn∈N , mais si vous voulez des résultats cohérents, assurez-vous que cn<256
La sortie sera évidemment unique quel que soit le nombre que vous entrerez (−∞<n<∞ ). Si l'entier est plus court, le programme remplira la sortie pour correspondre exactement à ∞ octets, donc la longueur est toujours la même.
Cette réponse échappe un peu au défi, car elle ne précise pas que la sortie doit être finie.
Essayez-le en ligne!
Réponse originale de 28 octets:
Celui-ci remplira la sortie à exactement28−1 octets. Le mécanisme de conversion des nombres fonctionne de la même manière ici. Ce programme suppose la même chose que le programme ci-dessus.
la source
Python 3 , 39 octets
Essayez-le en ligne!
Active le nombre donné dans une représentation de chaîne binaire (complétée par des espaces), puis mappe les caractères
(space)-01
àcaab
lastr.translate
fonction.la source
Gelée , 4 octets
Un lien monadique acceptant un entier qui donne une liste de 52 caractères.
Essayez-le en ligne!
Comment?
Alors...
la source
Rubis , 27 octets
Essayez-le en ligne!
('%34b'%n)
Convertit un entier en sa représentation binaire, en utilisant..1
pour indiquer un nombre négatif (cela est censé représenter un préfixe infiniment long de 1), et laisse ce pavé gauche à 34 caractères en utilisant des espaces. Ensuite, nous remplaçons le0
s par «a» et le1
s par «h» pour créer la représentation Maniacal Base 2: des chaînes comme «haaahahahaaha» précédées d'espaces et parfois..
. Puisque chaque étape ici est inversible, c'est 1: 1.Edit: Laissez le dossier montrer que @manatwork a publié cette solution identique en premier. Oops. J'aurais dû me rafraîchir.
la source
Gelée , 6 octets
Essayez-le en ligne!
Étant donné que Jelly a des entiers de longueur arbitraire, ce lien monadique prend un entier dans la plage± 231 et renvoie une chaîne alphabétique de longueur 7. Cela fonctionne en ajoutant232 puis décompressez la base en majuscules.
la source
C (gcc) , 38 octets
Essayez-le en ligne!
Cela étend chaque bit de l'entier d'entrée en un octet qui est soit 0 soit 1 (qui sont tous deux des caractères non imprimables, mais il n'y a pas de règle contre cela). Ainsi, la sortie est toujours de 32 octets et garantie d'être unique.
la source
f(a){putchar(a&1);f(a/2);}
C # (Visual C # Interactive Compiler) , 35 octets
Essayez-le en ligne!
la source
x = int.MinValue
car il ne peut pas être annulé.Haskell, 31 octets
Essayez-le en ligne!
Adds
2^60
to the input so that the resulting number has the same amount of digits for the whole input range. Turn into a string and shift each character 10 places to the right in the ASCII order (0
->:
...9
->C
).la source
C# (Visual C# Interactive Compiler), 52 bytes
Try it online!
Different approach to a c# solution, takes advantage of the fact that c# modulus is negative for negative numbers. I suppose you could shave off a byte or two if you allow non-display characters ('\0', and so on) by updating the
+65...
to not offset the character value to something human readable.la source
Perl 5
-MDigest::MD5=md5_hex -p
, 23 bytesTry it online!
Previously:
Perl 5
-p
, 29 bytesTry it online!
Converts the number to its 64 bit binary representation, then transliterates
0
and1
toa
andb
, respectively.la source
T-SQL,
73 7061 bytesI'm just directly replacing the digits (and
-
) with letters, afterSTR
pads the integer to 11 characters. No conversion to hex or binary is necessary.TRANSLATE
was introduced in SQL 2017.Input is via a pre-existing tablet with INT column n , per our IO rules. Range of the −231≤n<231 .
INT
datatype in SQL isEDIT: Saved 3 bytes by replacing manual padding with a conversion to CHAR(11), which is a fixed-width character format that automatically pads with spaces.
EDIT 2: Saved 9 bytes by using
STR()
function instead ofCAST
.STR
converts a number to a text string padded to the specified length.la source
APL (Dyalog Unicode), 28 bytes
Try it online!
Simple Dfn, taking an integer argument. Uses
⎕IO←0
.TIO links to a test case from
-2^10
to2^10
. The0~⍨
part removes the duplicate0
from the arguments.How:
la source
Japt, 6 bytes
I think this is right. Inspired by Stephen's Python solution so please
+1
him.Try it
la source
Malbolge, 2708 bytes
This answer is super cheaty, because it always produces the same amount of input, which is equal to∞ .
Try it online!
la source
Perl 6, 12 bytes
Try it online!
Anonymous Whatever lambda that takes a number and string ORs it with 11
@
s. This maps the digits topqrstuvwxy
and the dash tom
, then pads the string out to 11 characters with@
sla source
Perl 5 (-p), 9 bytes
Try it online!
Bitwxise-xor of the input with the string
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
.la source
Wolfram Language (Mathematica),
4433 bytesTry it with a smaller domain
-2 thanks to Greg Martin
Prints13!+n 14! , and a newline. Works on the domain [−13!,14!−13!) , which is a superset of [−231,231) .
>>
, followed by the 523069747202-character string representation of a list ofNull
s padded byTrue
s to a length ofGiven the size of the output, I've included a test case with a smaller domain of[−24,24) instead
la source
2^31
and2^32
to13!
and14!
respectively. At the loss of some "brevity" in the output....Stax, 6 bytes
Run and debug it
Procedure:
la source
PHP,
6454 bytes-10 bytes by using
strtr
function instead of manual character replacement.Try it online!
Largest int value possible in PHP as of now is
9223372036854775807
which is 19 digits long, considering the minus sign in negative numbers, it will be 20. The code above replaces minus sign (-
) with theA
character and every digit from0
to9
with a character fromD
toM
and then pads the string in the right with space character to always make it 20 characters long. For example, the output for input of-9876543210
is"AMLKJIHGFED "
.The output is unique for each integer input and you can get back to the input by removing all spaces, replacing
A
with-
and replacingD
toM
with0
to9
.PHP, 44 bytes
Try it online!
This is same idea as Arnauld's answer. Converts the input to binary, and then converts it to base-64. Also pads it to 88 characters (largest length is for
-9223372036854775807
which is 88 characters) with space character at right to always get same length in the output.la source
Retina 0.8.2, 21 bytes
Try it online! Always outputs 11 characters from the range
n
..z
. Explanation:Translate the printable ASCII characters to the lowercase letters. This maps
-
ton
and0
..9
toq
..z
. (It's really fortunate that the digits are the 16th to the 25th printable ASCII characters!)Append 10
o
s. Since the input will have between 1 and 11 characters, there are now between 11 and 21 characters.Extract the first 11 characters. Since there are fewer than 22 characters, this will only match once.
la source
Charcoal, 9 bytes
Try it online! Link is to verbose version of code. Always outputs 10 spaces and uppercase letters. Explanation:
la source
R, 37 bytes
Try it online!
Looks like the output is random, but it isn't! The input is used as the seed of the Pseudo-Random Number Generator, and we then get one of the26!=4⋅1026 permutations of the alphabet. The output is always of length 51 (26 letters + 25 spaces).
There is still the issue of insuring that all the outputs are different. We end up with232≈4⋅109 permutations (out of 4⋅1026 ). If we pretend that the permutations are distributed uniformly at random, then the probability that all the permutations are different can be computed following the same calculations as for the Birthday problem. The probability that 2 specific outputs are identical is 10−17 , so a first order approximation of the probability that all 232 outputs are distinct is
which is close enough to 1 for me.
la source
brainfuck,
2019 bytes-1 byte thanks to Krzysztof Szewczyk
Try it online!
Outputs the number with each digit and dash mapped to 255 minus their ordinal value, padded out to 255 characters with NUL bytes.
la source
-[>,[->-<]>.[-]<<-]
R,
4037 bytesTry it online!
An alternative to Robin Ryder's answer; this is certainly deterministic.
This converts the input to a
raw
vector of 32 bytes, each byte being a hex number00
or01
representing the bits of the integer. We then coerce to alogical
by comparing to0
, so00
is mapped toFALSE
and01
toTRUE
. Then we need to remove a single letter from eachFALSE
to guarantee equal-length output, arbitrarily selected to beS
. Result is printed (with space) for a length of 169.la source
Zsh, 43 bytes
Try it online!
This solution gets around the
long long
limits of Zsh's integers by working with only characters. I only padded it to 30 characters for readability, but replacing30
with99
will allow this method to work on all numbers from-1E99+1
to1E100-1
.The effect of interpreting the decimal codes as hexadecimal are as follows:
Zsh, 46 bytes
Try it online!
Declares x as a binary number, zero-padded to a width of 66. Then maps
0
→a
and1
→b
. We also map2
and-
to a, since those characters are printed in[[-]][base]#[num]
notation. To see what$x
looks like before replacement, and Zsh's limits in parsing integer types, check the Debug output in the TIO link.la source
Java (JDK), 42 bytes
Try it online!
First, this creates the hexadecimal representation of the input, left-padded with spaces which provides the same length constraint (8 characters-long), removes the minus sign, and keeps each intermediate output unique.
This gives a string with 17 different possible characters:
0123456789abcdef
and space.Then each character is streamed and mapped by adding 64 to its codepoint if it's a digit or a space. Effectively, this results in the following mapping:
0123456789abcdef<space>
topqrstuvwxyabcdef`
which has 17 different characters, so no two numbers will result in the same output.la source
Bash, 30 bytes
Try it online!
To prove that output is unique, I just googled for MD5 collisions, and found no results within the integers between−231 and 231 . To avoid having forbidden characters in the output, just translate the characters in question to be upper case letters. Output is always the same length by definition, and guaranteed to not contain any forbidden characters.
la source