Przy wyzwaniach takich jak Dane wyjściowe o tej samej długości co kod i Utwórz dane wyjściowe dwukrotnie dłuższe niż kod , pomyślałem o osobnym, ale podobnym wyzwaniu.
Zadanie polega na wytworzeniu wyniku. Może to być ciąg znaków, lista znaków lub dowolny domyślny format wyjściowy programu. Jednak dane wyjściowe muszą zawsze być tej samej długości, niezależnie od danych wejściowych. Co ważniejsze, dane wyjściowe powinny być różne dla różnych danych wejściowych .
Wkład
Pojedyncza liczba całkowita , której zakres zależy od wyboru języka. Jeśli twój język ma liczby całkowite o zmiennej długości, zakres wynosi .
Wydajność
Ciąg znaków lub lista znaków albo wydruk do STDOUT lub STDERR. Możesz użyć tylko jednej z tych metod. Dane wyjściowe powinny być tej samej długości niezależnie od danych wejściowych, ale to od Ciebie zależy, która to długość. Dane wyjściowe nie mogą zawierać cyfr 0-9
lub znaku minus-
. Wynik powinien być deterministyczny .
Powinieneś być w stanie udowodnić, że dla każdego wyjścia istnieje tylko jeden możliwy wkład , albo poprzez formalny dowód, argument lub przeszukanie brutalnej siły.
To pytanie do kodu golfowego, więc zetrzyj wszelkie zewnętrzne bajty. Wszystkie języki są mile widziane, im więcej, tym lepiej!
Odpowiedzi:
JavaScript (ES8), 33 bajty
Oczekuje danych wejściowych w zakresie bezpiecznych liczb całkowitych JS:−253≤n<253 .
Zwraca ciąg 76 znaków.
Wypróbuj online!
W jaki sposób?
Krok 1
Dane wejściowe są najpierw konwertowane na binarne. Zachowuje to wiodący znak minus dla liczb ujemnych.
Przykłady:
123
→"1111011"
-77
→"-1001101"
Krok 2
Powstały ciąg jest zakodowany w standardzie 64.
Oznacza to, że każdy blok od 1 do 3 znaków zostanie przekształcony w nowy blok 4 znaków. Ta konwersja jest bezpieczna, ponieważ żaden z powstałych bloków nie zawiera niedozwolonych symboli (cyfr lub znaku minus).
Bloki 3-znakowe
Jeden końcowy blok 1 lub 2 znaków musi zostać zakodowany, jeśli długość ciągu binarnego nie jest wielokrotnością 3:
Bloki 1-znakowe
Bloki 2-znakowe
Krok 3
Ostateczny wynik jest wypełniony końcowymi spacjami.
źródło
Python 3 ,
4939 bajtówWypróbuj online!
-10 bajtów dzięki ujemnej siódemce
Konwertuje liczbę całkowitą na szesnastkową i wstawia spacje do 9 znaków łącznie. Następnie podwaja kod ASCII każdego znaku w ciągu (niektóre wychodzą poza ASCII do Unicode, ale Python radzi sobie z tym dobrze), wyświetlając listę znaków.
Działa to, ponieważ każda cyfra, w tym
-
, jest odwzorowana na inny znak ASCII. Brak liczb całkowitych pomiędzy-2147483648
i2147483648
są równe, więc konwersja ich na spacje szesnastkowe i poprzedzające nie spowodowałoby, że byłyby równe. Następnie odwzorowanie ich na różne punkty kodowe nie prowadzi do kolizji, więc nadal nie ma dwóch wartości w zakresie, które prowadzą do równych wyników.Python 3 ,
595647 bajtówWypróbuj online!
-3 bajty dzięki Jitse
-9 bajtów dzięki ujemnej siódemce
Ten sam algorytm, ale używa
map
zamiastfor
pętli.źródło
map
podejściu, zastępująclist( ... )
je[* ... ]
"%9x"%i
`4e9+n`
05AB1E ,
115 bajtów-6 bajtów przenoszących podejście @Stephen , więc pamiętajcie o jego głosowaniu!
Wyświetla listę do 100 znaków o długości100−(input length) liczbą
@
(podwójny kodowy spacji) i wszystkie są-0123456789
mapowane naZ`bdfhjlnpr
(podwoić codepoints ASCII).Wypróbuj online.
Wyjaśnienie:
Oryginalna odpowiedź 11 bajtów :
Wypróbuj online (ograniczone do
1000
zamiast2147483648
).Wyjaśnienie:
Długość wyjściowa wynosi zawsze 2 147 483 648 znaków. Będzie wyjście2147483648−|n|−1 ilość spacji, uzupełniona o |n| ilość nowych linii, dołączonych albo z „a”, jeśli n<0 lub „b”, jeśli n≥0 .
źródło
pieprzenie mózgu ,
4829281613 bajtówTen program wymaga komórek, w którychcn∈N , ale jeśli chcesz uzyskać spójne wyniki, upewnij się, że cn<256
Wyjście będzie oczywiście unikalne bez względu na to, jaką liczbę wprowadzisz (−∞<n<∞ ). Jeśli liczba całkowita jest krótsza, program wypisze wynik tak, aby pasował dokładnie do ∞ bajtów, więc długość jest zawsze taka sama.
Ta odpowiedź jest nieco kłopotliwa, ponieważ nie stwierdzono, że dane wyjściowe muszą być skończone.
Wypróbuj online!
Oryginalna, 28-bajtowa odpowiedź:
Ten pad wyjście być dokładnie28−1 bajtów. Mechanizm konwersji liczb działa tutaj tak samo. Ten program zakłada to samo co powyżej.
źródło
Python 3 , 39 bajtów
Wypróbuj online!
Okazuje dany numer w binarnej reprezentacji smyczkowy (spacjami), a następnie odwzorowuje znaki
(space)-01
docaab
zstr.translate
funkcji.źródło
Galaretka , 4 bajty
Monadyczny link akceptujący liczbę całkowitą, która daje listę 52 znaków.
Zakres wejściowy może wynosić nawet nieco więcej niż−2223≤n<2223 od 52!>2224 .
Wypróbuj online!
W jaki sposób?
Więc...
źródło
Rubinowy , 27 bajtów
Wypróbuj online!
('%34b'%n)
Konwertuje liczbę całkowitą na jej reprezentację binarną, używając..1
do wskazania liczby ujemnej (ma to oznaczać nieskończenie długi prefiks 1s), i lewy dopełnia ją do 34 znaków za pomocą spacji. Następnie zamieniamy0
s na „a” i1
s na „h”, aby utworzyć reprezentację Maniacal Base 2: ciągi takie jak „haaahahahaaha” poprzedzone spacjami, a czasem..
. Ponieważ każdy krok tutaj jest odwracalny, jest to 1: 1.Edycja: Niech rekord pokazuje, że @manatwork opublikował najpierw to samo rozwiązanie. Ups Powinienem się odświeżyć.
źródło
Galaretka , 6 bajtów
Wypróbuj online!
źródło
C (gcc) , 38 bajtów
Wypróbuj online!
Rozwija każdy bit wejściowej liczby całkowitej do bajtu, który ma wartość 0 lub 1 (które są znakami niemożliwymi do wydrukowania, ale nie ma żadnej reguły przeciw temu). Wyjście ma więc zawsze 32 bajty i gwarantuje unikalność.
źródło
f(a){putchar(a&1);f(a/2);}
C # (interaktywny kompilator Visual C #) , 35 bajtów
Wypróbuj online!
źródło
x = int.MinValue
ponieważ nie można tego zanegować.Haskell, 31 bajtów
Wypróbuj online!
Dodaje
2^60
do danych wejściowych, aby wynikowa liczba miała taką samą liczbę cyfr dla całego zakresu wejściowego. Zamień na ciąg i przesuń każdy znak o 10 miejsc w prawo w kolejności ASCII (0
->:
...9
->C
).źródło
C # (interaktywny kompilator Visual C #) , 52 bajty
Wypróbuj online!
Inne podejście do rozwiązania ac # wykorzystuje fakt, że moduł c # jest ujemny dla liczb ujemnych. Przypuszczam, że możesz zgolić bajt lub dwa, jeśli zezwolisz na wyświetlanie znaków („\ 0” itd.), Aktualizując opcję,
+65...
aby nie kompensować wartości znaku na coś czytelnego dla człowieka.źródło
Perl 5
-MDigest::MD5=md5_hex -p
, 23 bajtówWypróbuj online!
Poprzednio:
Perl 5
-p
, 29 bajtówWypróbuj online!
Konwertuje liczbę na 64-bitową reprezentację binarną, a następnie dokonuje transliteracji
0
oraz odpowiednio1
doa
ib
.źródło
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.źródło
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:
źródło
Japt, 6 bytes
I think this is right. Inspired by Stephen's Python solution so please
+1
him.Try it
źródło
Malbolge, 2708 bytes
This answer is super cheaty, because it always produces the same amount of input, which is equal to∞ .
Try it online!
źródło
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@
sźródło
Perl 5 (-p), 9 bytes
Try it online!
Bitwxise-xor of the input with the string
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
.źródło
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
źródło
2^31
and2^32
to13!
and14!
respectively. At the loss of some "brevity" in the output....Stax, 6 bytes
Run and debug it
Procedure:
źródło
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.źródło
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.
źródło
Charcoal, 9 bytes
Try it online! Link is to verbose version of code. Always outputs 10 spaces and uppercase letters. Explanation:
źródło
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.
źródło
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.
źródło
-[>,[->-<]>.[-]<<-]
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.źródło
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.źródło
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.źródło
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.
źródło