Bei Herausforderungen wie Ausgabe mit der gleichen Länge wie der Code und Ausgabe mit der doppelten Länge des Codes erstellen dachte ich an eine separate, aber ähnliche Herausforderung.
Die Aufgabe besteht darin, eine Ausgabe zu erzeugen. Dies kann entweder eine Zeichenfolge, eine Liste von Zeichen oder das Standardausgabeformat Ihres Programms sein. Ihre Ausgabe muss jedoch unabhängig von der Eingabe immer dieselbe Länge haben. Und was noch wichtiger ist, die Ausgabe sollte für verschiedene Eingaben unterschiedlich sein .
Eingang
Eine einzelne ganze Zahl , deren Bereiche durch die Wahl der Sprache bestimmt werden. Wenn Ihre Sprache Ganzzahlen variabler Länge hat, ist der Bereich .
Ausgabe
Eine Zeichenfolge oder eine Liste von Zeichen oder ein Ausdruck auf STDOUT oder STDERR. Sie dürfen nur eine dieser Methoden anwenden. Die Länge der Ausgabe sollte unabhängig von der Eingabe gleich sein. Sie können jedoch selbst festlegen, welche Länge dies ist. Die Ausgabe darf weder Ziffern 0-9
noch Minuszeichen enthalten-
. Die Ausgabe sollte deterministisch sein .
Sie sollten in der Lage sein, zu beweisen, dass es für jede Ausgabe nur eine mögliche Eingabe gibt , entweder durch einen formalen Beweis, ein Argument oder eine Brute-Force-Suche.
Dies ist eine Code-Golf-Frage, also entfernen Sie alle überflüssigen Bytes. Alle Sprachen sind willkommen, je mehr desto besser!
Antworten:
JavaScript (ES8), 33 Byte
Erwartet die Eingabe im Bereich sicherer JS-Ganzzahlen:- 253≤ n < 253 .
Gibt eine Zeichenfolge mit 76 Zeichen zurück.
Probieren Sie es online!
Wie?
Schritt 1
Die Eingabe wird zunächst in binär umgewandelt. Dadurch bleibt das führende Minuszeichen für negative Zahlen erhalten.
Beispiele:
123
→"1111011"
-77
→"-1001101"
Schritt 2
Die resultierende Zeichenfolge ist in base-64 codiert.
Dies bedeutet, dass jeder Block mit 1 bis 3 Zeichen in einen neuen Block mit 4 Zeichen umgewandelt wird. Diese Konvertierung ist sicher, da keiner der resultierenden Blöcke die verbotenen Symbole (Ziffern oder Minuszeichen) enthält.
3-stellige Blöcke
Ein einzelner abschließender Block mit 1 oder 2 Zeichen muss codiert werden, wenn die Länge der Binärzeichenfolge kein Vielfaches von 3 ist:
1-Zeichen-Blöcke
2-stellige Blöcke
Schritt 3
Die endgültige Ausgabe wird mit Leerzeichen aufgefüllt.
quelle
Python 3 ,
4939 BytesProbieren Sie es online!
-10 Bytes dank negativer Sieben
Wandelt die Ganzzahl in Hexadezimal um und stellt Leerzeichen bis zu 9 Zeichen voran. Verdoppelt dann den ASCII-Code jedes Zeichens in der Zeichenfolge (einige erstrecken sich außerhalb von ASCII in Unicode, aber Python verarbeitet dies problemlos) und gibt eine Liste von Zeichen aus.
Dies funktioniert, weil jede Ziffer, einschließlich
-
, einem anderen ASCII-Zeichen zugeordnet ist. Keine ganzen Zahlen zwischen-2147483648
und2147483648
sind gleich. Wenn Sie sie also in hexadezimale und vorangestellte Leerzeichen konvertieren, sind sie nicht gleich. Das Zuordnen zu verschiedenen Codepunkten führt dann nicht zu Kollisionen. Es gibt also immer noch keine zwei Werte im Bereich, die zu gleichen Ausgaben führen.Python 3 ,
595647 BytesProbieren Sie es online!
-3 Bytes dank Jitse
-9 Bytes dank negativer Sieben
Gleicher Algorithmus, jedoch
map
anstelle einerfor
Schleife.quelle
map
Annäherung weg rasieren, indem Sielist( ... )
durch[* ... ]
"%9x"%i
`4e9+n`
05AB1E ,
115 Bytes-6 Bytes , die den Ansatz von @Stephen portieren , also stelle sicher, dass du ihn positiv bewertest!
Gibt eine Liste von bis zu 100 Zeichen, mit100 - ( Eingabelänge ) Menge
@
(doppelten Raum Codepoint), und allen-0123456789
abgebildetZ`bdfhjlnpr
( das Doppelte der ASCII - Codepunkte).Probieren Sie es online aus.
Erläuterung:
Ursprüngliche 11- Byte- Antwort:
Versuchen Sie es online (begrenzt auf
1000
statt2147483648
).Erläuterung:
Die Ausgabelänge beträgt immer 2.147.483.648 Zeichen. Es wird2147483648 - | n | - 1 ausgegeben n | - 1 Anzahl Leerzeichen, angefügt mit | n | Anzahl der Zeilenumbrüche, denen entweder ein 'a' angehängt wird, wenn n < 0 oder ein 'b', wenn n ≥ 0 .
quelle
Brainfuck ,
4829281613 BytesFür dieses Programm sind Zellen erforderlich, bei denencn∈ N ist. Wenn Sie jedoch konsistente Ergebnisse wünschen, müssen Sie sicherstellen, dass cn< 256
Die Ausgabe ist unabhängig von der eingegebenen Nummer eindeutig (- ∞ < n < ∞ ). Wenn die Ganzzahl kürzer ist, füllt das Programm die Ausgabe mit genau ∞ Bytes auf, sodass die Länge immer gleich ist.
Diese Antwort ist eine kleine Lücke in der Herausforderung, da sie nicht besagt, dass die Ausgabe endlich sein muss.
Probieren Sie es online!
Original, 28-Byte-Antwort:
Dieser füllt die Ausgabe auf genau28- 1 Bytes auf. Der Mechanismus zur Umrechnung von Zahlen funktioniert hier genauso. Dieses Programm setzt dasselbe wie das obige Programm voraus.
quelle
Python 3 , 39 Bytes
Probieren Sie es online!
Schaltet sie die gegebene Anzahl in eine binäre String - Darstellung (mit Leerzeichen aufgefüllt), dann die Zeichen bildet ,
(space)-01
umcaab
mit derstr.translate
Funktion.quelle
Gelee , 4 Bytes
Ein monadischer Link, der eine Ganzzahl akzeptiert, die eine Liste mit 52 Zeichen ergibt.
Der Eingabebereich kann bis zu etwas mehr als- 2223≤ n < 2223 seit 52 ! > 2224 betragen ! > 2 224 .
Probieren Sie es online!
Wie?
So...
quelle
Ruby , 27 Bytes
Probieren Sie es online!
('%34b'%n)
Wandelt eine Ganzzahl in ihre Binärdarstellung um und..1
gibt dabei eine negative Zahl an (dies soll ein unendlich langes Präfix von 1 darstellen). Füllt diese Zahl mit Leerzeichen auf 34 Zeichen auf. Dann ersetzen wir das0
s durch 'a' und das1
s durch 'h', um die Maniacal Base 2-Darstellung zu erstellen: Zeichenfolgen wie "haaahahahaaha" werden mit Leerzeichen und manchmal vorangestellt..
. Da hier jeder Schritt invertierbar ist, ist dies 1: 1.Bearbeiten: Lassen Sie den Datensatz zeigen, dass @manatwork diese identische Lösung zuerst gepostet hat. Hoppla. Ich hätte mich erfrischen sollen.
quelle
Gelee , 6 Bytes
Probieren Sie es online!
Da Jelly Ganzzahlen beliebiger Länge hat, nimmt diese monadische Verknüpfung eine Ganzzahl im Bereich von± 231 und gibt eine alphabetische Zeichenfolge der Länge 7 zurück. Es funktioniert durch Hinzufügen von 232 und anschließendes Dekomprimieren der Basis in Großbuchstaben.
quelle
C (gcc) , 38 Bytes
Probieren Sie es online!
Dies erweitert jedes Bit der Eingabe-Ganzzahl in ein Byte, das entweder 0 oder 1 ist (beides nicht druckbare Zeichen, aber es gibt keine Regel dagegen). Die Ausgabe ist also immer 32 Byte und garantiert eindeutig.
quelle
f(a){putchar(a&1);f(a/2);}
C # (Visual C # Interactive Compiler) , 35 Byte
Probieren Sie es online!
quelle
x = int.MinValue
da es nicht annulliert werden kann.Haskell, 31 Bytes
Probieren Sie es online!
Wird
2^60
zur Eingabe hinzugefügt , sodass die resultierende Zahl für den gesamten Eingabebereich die gleiche Anzahl von Ziffern enthält. Verwandle dich in eine Zeichenkette und verschiebe jedes Zeichen 10 Stellen nach rechts in der ASCII-Reihenfolge (0
->:
...9
->C
).quelle
C # (Visual C # Interactive Compiler) , 52 Byte
Probieren Sie es online!
Ein anderer Ansatz zur Lösung von ac # nutzt die Tatsache, dass der c # -Modul für negative Zahlen negativ ist. Ich nehme an, Sie könnten ein oder zwei Bytes sparen, wenn Sie nicht angezeigte Zeichen ('\ 0' usw.) zulassen, indem Sie das aktualisieren
+65...
, um den Zeichenwert nicht auf einen für Menschen lesbaren Wert zu versetzen.quelle
Perl 5
-MDigest::MD5=md5_hex -p
, 23 BytesProbieren Sie es online!
Vorher:
Perl 5
-p
, 29 BytesProbieren Sie es online!
Wandelt die Zahl seiner 64 - Bit - Binärdarstellung, dann transliterates
0
und1
zua
undb
verbunden.quelle
T-SQL,
73 7061 BytesIch ersetze nur direkt die Ziffern (und
-
) durch Buchstaben, nachdemSTR
die ganze Zahl auf 11 Zeichen aufgefüllt wurde. Es ist keine Konvertierung in hex oder binär erforderlich.TRANSLATE
wurde in SQL 2017 eingeführt.INT
BEARBEITEN : 3 Byte wurden eingespart, indem das manuelle Auffüllen durch eine Konvertierung in CHAR (11) ersetzt wurde. Hierbei handelt es sich um ein Zeichenformat mit fester Breite, bei dem automatisch Leerzeichen eingefügt werden.
BEARBEITEN 2 : 9 Bytes mit der
STR()
Funktion anstelle von gespeichertCAST
.STR
wandelt eine Zahl in eine Textzeichenfolge um, die auf die angegebene Länge aufgefüllt ist.quelle
APL (Dyalog Unicode) , 28 Byte
Probieren Sie es online!
Einfaches Dfn, wobei ein ganzzahliges Argument verwendet wird. Verwendet
⎕IO←0
.TIO verlinkt zu einem Testfall von
-2^10
bis2^10
. Der0~⍨
Teil entfernt das Duplikat0
aus den Argumenten.Wie:
quelle
Japt , 6 Bytes
Ich denke das ist richtig. Inspiriert von Stephens Python-Lösung, freut
+1
ihn das.Versuch es
quelle
Malbolge , 2708 Bytes
Probieren Sie es online!
quelle
Perl 6 , 12 Bytes
Probieren Sie es online!
Anonym Welches Lambda auch immer, das eine Zahl annimmt und mit 11
@
s ODER verknüpft . Dies ordnet die Ziffernpqrstuvwxy
und den Bindestrich zu und fülltm
dann die Zeichenkette mit@
s auf 11 Zeichen aufquelle
Perl 5 (-p), 9 Bytes
Probieren Sie es online!
Bitwxise-xor der Eingabe mit dem String
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
.quelle
Wolfram Language (Mathematica) ,
4433 BytesVersuchen Sie es mit einer kleineren Domain
-2 danke an Greg Martin
>>
Null
True
quelle
2^31
und2^32
zu13!
und14!
sind. Beim Verlust einiger "Kürze" in der Ausgabe ....Stax , 6 Bytes
Führen Sie es aus und debuggen Sie es
Verfahren:
quelle
PHP ,
6454 Bytes-10 Bytes durch Verwendung der
strtr
Funktion anstelle des manuellen Ersetzens von Zeichen.Probieren Sie es online!
Der größte int-Wert, der in PHP derzeit möglich
9223372036854775807
ist und 19 Stellen lang ist, wird unter Berücksichtigung des Minuszeichens in negativen Zahlen 20 sein. Der obige Code ersetzt das Minuszeichen (-
) durch dasA
Zeichen und jede Ziffer von0
bis9
durch ein Zeichen vonD
bisM
und füllt dann die Zeichenfolge rechts mit einem Leerzeichen auf, damit sie immer 20 Zeichen lang ist. Der Ausgang für die Eingabe beispielsweise-9876543210
ist"AMLKJIHGFED "
.Der Ausgang ist einzigartig für jeden Integer - Eingang und Sie können durch Entfernen alle Leerzeichen an den Eingang zurück und ersetzt
A
mit-
und ersetzenD
zuM
mit0
zu9
.PHP , 44 Bytes
Probieren Sie es online!
Dies ist dieselbe Idee wie Arnauld's Antwort . Konvertiert die Eingabe in Binär und konvertiert sie anschließend in Base-64. Füllt es außerdem
-9223372036854775807
mit einem Leerzeichen auf 88 Zeichen auf (die größte Länge beträgt 88 Zeichen), um in der Ausgabe immer die gleiche Länge zu erhalten.quelle
Retina 0.8.2 , 21 Bytes
Probieren Sie es online! Immer gibt 11 Zeichen aus dem Bereich
n
..z
. Erläuterung:Übersetzen Sie die druckbaren ASCII-Zeichen in Kleinbuchstaben. Diese Karten
-
zun
und0
..9
zuq
..z
. (Es ist wirklich ein Glück, dass die Ziffern die 16. bis 25. druckbaren ASCII-Zeichen sind!)10
o
s anhängen . Da die Eingabe zwischen 1 und 11 Zeichen hat, gibt es jetzt zwischen 11 und 21 Zeichen.Extrahieren Sie die ersten 11 Zeichen. Da es weniger als 22 Zeichen gibt, wird dies nur einmal zutreffen.
quelle
Kohle , 9 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Gibt immer 10 Leerzeichen und Großbuchstaben aus. Erläuterung:
quelle
R , 37 Bytes
Probieren Sie es online!
Das ist nah genug an 1 für mich.
quelle
Brainfuck ,
20 bis19 Bytes-1 Byte danke an Krzysztof Szewczyk
Probieren Sie es online!
Gibt die Zahl mit jeder Ziffer und jedem Bindestrich aus, die auf 255 abzüglich ihres Ordnungswerts abgebildet sind, und wird mit NUL-Bytes auf 255 Zeichen aufgefüllt.
quelle
-[>,[->-<]>.[-]<<-]
R ,
4037 BytesProbieren Sie es online!
Eine Alternative zu Robin Ryders Antwort ; das ist bestimmt deterministisch.
Dies wandelt die Eingabe in einen
raw
Vektor von 32 Bytes um, wobei jedes Byte eine Hex-Zahl ist00
oder01
die Bits der ganzen Zahl darstellt. Wir zwingen uns dann zu einem,logical
indem wir mit vergleichen0
, also00
wird aufFALSE
und01
auf abgebildetTRUE
. Dann müssen wir einen einzelnen Buchstaben aus jedem entfernen, um eineFALSE
Ausgabe gleicher Länge zu gewährleisten, die willkürlich ausgewählt werden sollS
. Das Ergebnis wird (mit Leerzeichen) für eine Länge von 169 gedruckt.quelle
Zsh , 43 Bytes
Probieren Sie es online!
Diese Lösung
long long
umgeht die Grenzen von Zshs ganzen Zahlen, indem nur mit Zeichen gearbeitet wird. Ich habe es aus Gründen der Lesbarkeit nur auf 30 Zeichen aufgefüllt, aber durch Ersetzen30
durch99
kann diese Methode auf alle Zahlen von-1E99+1
bis angewendet werden1E100-1
.Die Auswirkungen der Interpretation der Dezimalcodes als Hexadezimal sind wie folgt:
Zsh , 46 Bytes
Probieren Sie es online!
Deklariert x als Binärzahl, mit einer Breite von 66 aufgefüllt. Ordnet dann
0
→a
und1
→ zub
. Wir ordnen auch2
und a-
zu, da diese Zeichen in[[-]][base]#[num]
Notation gedruckt werden.$x
Überprüfen Sie die Debug-Ausgabe im TIO-Link, um zu sehen, wie es vor dem Ersetzen aussieht und welche Grenzen Zsh beim Parsen von Ganzzahltypen hat.quelle
Java (JDK) , 42 Byte
Probieren Sie es online!
Zunächst wird die hexadezimale Darstellung der Eingabe erstellt, die links mit Leerzeichen aufgefüllt ist, die die gleiche Längenbeschränkung (8 Zeichen lang) bietet, das Minuszeichen entfernt und jede Zwischenausgabe eindeutig hält.
Dies ergibt eine Zeichenkette mit 17 verschiedenen möglichen Zeichen:
0123456789abcdef
und Leerzeichen.Dann wird jedes Zeichen gestreamt und zugeordnet, indem dem Codepunkt 64 hinzugefügt werden, wenn es sich um eine Ziffer oder ein Leerzeichen handelt. Tatsächlich führt dies zu der folgenden Zuordnung:
0123456789abcdef<space>
Zupqrstuvwxyabcdef`
dieser Zuordnung gehören 17 verschiedene Zeichen, sodass keine zwei Zahlen zur gleichen Ausgabe führen.quelle
Bash , 30 Bytes
Probieren Sie es online!
quelle