Wie George Orwell 1984 schrieb :
Krieg ist Frieden
Freiheit ist Sklaverei
Unwissenheit ist Stärke
Schreiben Sie ein Programm oder eine Funktion, die eines der sechs Hauptwörter aus dem Orwell-Zitat aufnimmt und dessen Gegenstück ausgibt.
Speziell:
[input] -> [output]
war -> peace
peace -> war
freedom -> slavery
slavery -> freedom
ignorance -> strength
strength -> ignorance
Es sind keine weiteren Ein- / Ausgangspaare erforderlich.
Sie sollten davon ausgehen, dass die Wörter wie oben immer vollständig in Kleinbuchstaben geschrieben sind. Alternativ können Sie die Wörter übernehmen immer vollständig groß geschrieben: WAR -> PEACE
, PEACE -> WAR
usw.
Der kürzeste Code in Bytes gewinnt.
code-golf
string
kolmogorov-complexity
Calvins Hobbys
quelle
quelle
w p f s i
) sind in keinem der Wörter anderswo zu finden. Eine faszinierende Eigenschaft.Antworten:
05AB1E , 30 Bytes
05AB1E verwendet CP-1252 .
Probieren Sie es online! oder als Testsuite
Erläuterung
Der direkte Ansatz
ignorance strength war peace freedom slavery
quelle
ignorance strength war peace freedom slavery
ich glaube, dass sie etwa ein Dutzend Schritte entfernt ist!JavaScript (ES6), 80 Byte
Wie es funktioniert
Wir verwenden eine kleine Nachschlagetabelle, die auf dem ASCII-Code des zweiten Zeichens jedes Wortes basiert und den Index seines Gegenstücks zurückgibt.
Als Randnotiz, wenn gemischte Groß- und Kleinschreibung erlaubt wäre, würde die Verwendung
war PEACE FREEDOM slavery IGNORANCE strength
von Modulo 6 zu einem perfekten Hash führen.Prüfung
Code-Snippet anzeigen
quelle
z
und komprimieren Sie dann die Zeichenfolge mitatob
8 Bytes spart?atob
Sie eine Zeichenfolge verwenden, die hauptsächlich für JavaScript gültig ist, müssen Sie möglicherweise nur das `\` und das schließende Anführungszeichen maskieren. Es kann schwierig sein, es auf dieser Site zu veröffentlichen, aber das macht die Antwort nicht ungültig. Siehe die Perl - Antwort von smisGelee , 24 Bytes
Probieren Sie es online!
Wie es funktioniert
Erstens das Token
Indexiert in Jellys Wörterbuch, um die Zeichenfolge zu erstellen
das
Ḳ
sich an Leerzeichen aufteilt, um das String-Array zu erhaltenµ
beginnt eine neue, monadische Kette mit diesem String-Array als Argument, das auch der aktuelle Rückgabewert ist.ɠ
Liest eine Eingabezeile von STDIN undi
findet den Index des vorherigen Rückgabewerts, dh des generierten String-Arrays.Nimmt nun
^1
das bitweise XOR dieses Index und 1 . Für eine noch Indizes - denken Sie daran , dass Jelly Indizes 1 -Basis und modular, so Kraft hat den Index 1 und Ignoranz hat den Index 6 / 0 - das erhöht den Index; Für ungerade Indizes werden sie dekrementiert.Ruft
ị
abschließend die Zeichenfolge an diesem Index aus dem Argument der Kette ab.quelle
Mathematica, 84 Bytes
Erläuterung
Mehr "Rechnen" mit Strings! Wie in der verknüpften Antwort basiert dies auf der Tatsache, dass Sie Zeichenfolgen in Mathematica "multiplizieren" können, wodurch sie nicht bewertet werden (ähnlich wie beim Multiplizieren von zwei nicht zugewiesenen Variablen
x*y
), Mathematica jedoch grundlegende Vereinfachungen anwendet, z. B. das Löschen von Faktoren in einer Division.So starten wir durch Speichern der drei Paare als Produkte
x
,y
,z
jeweils und multiplizieren sie alle zusammen:Dies ergibt
(Mathematica sortiert die Faktoren automatisch, aber die Reihenfolge ist uns egal.)
Wir teilen dies durch die Eingabe, um das Wort zu entfernen, mit dem wir nicht wollen
.../#
, da Mathematica die Faktoren aufhebt. Wenn die Eingabe beispielsweise"peace"
so wäre, würden wir am Ende Folgendes erhalten:Schließlich erhalten wir von den Paaren befreien wir nicht interessiert sind, die von jedem der Substitution
x
,y
undz
mit1
. Auch hier ist die Vereinfachung von Mathematica1*a
immer soa
. Dieser Teil ist erledigt mit:Das Schöne ist, dass Mathematica weiß, dass Multiplikation
Orderless
so ist, dass die beiden Faktoren unabhängig davon gefunden werden, ob sie im Produkt benachbart sind oder nicht. Nur das Wort, das der Eingabe entgegengesetzt ist, wird im Produkt nicht mehr gepaart, sodass eines nicht entfernt wird und als einzige Ausgabe verbleibt.quelle
WordList[][[<|"l"->14007,"t"->17083,"a"->25105,"r"->32106,"g"->33790,"e"->39048|>@#[[2]]]]&
.WordList
ist schön. Eine Liste von Zeichen als Eingabe zu nehmen und eine Zeichenkette zurückzugeben, scheint allerdings etwas zweifelhaft. ;) Das heißt, man kann mit 4 Bytes besser umgehenx[[7-Position[x={"war","slavery","ignorance","strength","freedom","peace"},#][[1,1]]]]&
.<|#->#2&~MapThread~{x={"war","slavery","ignorance","strength","freedom","peace"},Reverse@x}|>
für 94 BytesVim, 60 Bytes
Probieren Sie es online! im abwärtskompatiblen V-Interpreter.
Wenn wir zu V wechseln würden, könnten wir natürlich ein Byte sparen, indem wir eine bequemere Eingabemethode verwenden. Aber da dies ein so kleiner Unterschied ist, würde ich es vorziehen, die nicht-golfende Version zu verwenden.
Erläuterung:
quelle
C (GCC) ,
120107 BytesMaximaler Zeigermissbrauch! Benötigt eine Little-Endian-Maschine und 64-Bit-Longs.
Der Code enthält einige nicht druckbare Dateien, das Einfügen von Kopien sollte jedoch weiterhin funktionieren.
Probieren Sie es online!
quelle
Python, 81 Bytes
Oder gleiche Länge:
quelle
l
als optionales Argument einschleichen könnte .Perl 6 , 61 Bytes
Mit nicht druckbaren Zeichen, die als angezeigt werden (da StackExchange sie sonst entfernt):
Hier ist ein
xxd
Hex-Dump:Erweiterte Version (nicht druckbare Zeichen werden durch Escape-Sequenzen ersetzt und Leerzeichen und Kommentare hinzugefügt):
quelle
Bash ,
100878678 BytesProbieren Sie es online!
Der zweite Buchstabe jedes Wortes identifiziert dieses Wort eindeutig, daher verwende ich dieses Zeichen als Variablennamen. Der Wert dieser Variablen ist das entsprechende andere Wort.
Zum Beispiel von dem zweiten Brief
peace
iste
, und das Wort entsprechendpeace
istwar
, so dass ich eingestellte=war
.Bei einer gegebenen Eingabezeichenfolge wird das zweite Zeichen dieser Zeichenfolge als Variablenname verwendet, um das gewünschte entsprechende Wort unter Verwendung der indirekten Parametererweiterung von bash aufzurufen.
quelle
TI-Basic,
1038477 BytesDas Reduzieren auf einen Einzeiler sparte viele Bytes!Haha, wie ironisch diese Aussage war ...quelle
Perl , 63 Bytes
62 Bytes +
-p
Flag.Probieren Sie es online!
ord
Gibt den Zeichencode des ersten Zeichens des Eingabeworts zurück.Nach dem
%6
haben wir:Also haben wir
slavery
undstrength
beide geben 1 zurück (da beide mit dem gleichen Buchstaben beginnen), und keiner gibt 2 zurück. Daher addieren wir1
forstrength
(es ist das einzige passende Wort/h/
) und haben jedes Wort einem Index von 0 bis zugeordnet 5.quelle
R 86
8792BytesGeändert zu einer unbenannten Funktion und
gsub
zusub
einigen Bytes. Mit wirdgrep
festgelegt, welche der 3 Zeichenfolgen verwendet wird, und die Eingabe wird mit aus dieser Zeichenfolge entferntsub
.quelle
PHP, 70 Bytes
quelle
Befunge,
8988 BytesProbieren Sie es online!
Erläuterung
Wir beginnen damit, dass wir alle möglichen Output-Strings null-terminiert auf den Stack legen. Diese Sequenz wird von rechts nach links ausgeführt, sodass die Werte umgekehrt verschoben werden, da dies die Reihenfolge ist, in der die Zeichen benötigt werden, wenn sie schließlich ausgegeben werden.
Wir lesen dann die ersten beiden Zeichen von stdin, was alles ist, was wir brauchen, um die Eingabezeichenfolge zu identifizieren. Wenn wir den ASCII-Wert des ersten Buchstabens Mod 2 plus des zweiten Buchstabens Mod 7 nehmen, erhalten wir eine eindeutige Zahl im Bereich von 2 bis 7.
Diese Nummer kann dann als eine Art Index in die Zeichenfolgenliste auf dem Stapel verwendet werden. Wir dekrementieren den Index iterativ (das erste Mal um 2) und löschen für jede Iteration eine Zeichenfolge aus dem Stapel mit der Sequenz
>_
.Sobald der Index Null erreicht, verbleibt die richtige Ausgabezeichenfolge am oberen Rand des Stapels. Daher verwenden wir eine einfache Zeichenfolgenausgabesequenz, um das Ergebnis in stdout zu schreiben.
quelle
:-<
und@>:#
"Smileys" hier :)Pyke, 29 Bytes
Probieren Sie es hier aus!
quelle
C 93
@ Arnauld's Antwort portiert auf C
quelle
C (GCC) ,
113108 BytesAlle Instanzen von
\0
können zu Bewertungszwecken durch tatsächliche NUL-Bytes ersetzt werden.t+*--t-47
ist undefiniertes Verhalten; Dies funktioniert möglicherweise nicht mit anderen Compilern.Probieren Sie es online!
quelle
JavaScript (ES6), 71
78Soviel langweilig als Arnauld's Antwort, aber auch kürzer.
Jetzt habe ich die Kodierung mit hinzugefügt
btoa
. In der codierten Zeichenfolge befinden sich 4 Bytes, die ich nicht auf dieser Site veröffentlichen kann, selbst wenn es sich um gültige Zeichen in einer JavaScript-Zeichenfolge handelt. Also habe ich ein Fluchtsymbol in der Form verwendet\xHH
. Jedes dieser Escapes wird als 1 Byte gezählt.Die codierte Zeichenfolge lautet
strength0ignorance0peace0war0slavery0freedom
Dieser ist 82 und Groß- / Kleinschreibung wird nicht berücksichtigt
Prüfung
quelle
Jam, 52 (nur ASCII)
Probieren Sie es online aus
Hinweis: Bei den raumbezogenen Elementen handelt es sich um Tabulatorzeichen (eins vor und eins nach "EK {").
Erläuterung:
Der Teil bis "+" dekomprimiert die Zeichenfolge "slaveryjfreedomjwarjpeacejignorancejstrength" unter Verwendung der Basisumwandlung:
Zeichenfolge (behandelt als Array von Zeichencodes) → (Basis 144) Zahl → (Basis 26) Array von Zahlen → (Hinzufügen von 'a' zu jedem Zahl) Zeichenfolge
quelle
> <> (Fisch),
8478 BytesProbieren Sie es online!
Wir schwimmen von links oben nach rechts. Zuerst laden wir den Stack mit einer 0. Dann lesen wir den ersten Buchstaben von input (
i
), verwerfen ihn (~
), lesen den zweiten Buchstaben (i
) und reduzieren seinen ASCII-Wert modulo 10 (a%
). Dies ordnet a, e, r, l, g und t jeweils 7, 1, 4, 8, 3 und 6 zu - nennen wir diese Zahl N..
Ermittelt zwei Werte aus dem Stapel - N und 0 - und springt zu Zeile N, Zeichen 0.Nach einem Sprung setzt der Fisch einen Tick fort, bevor er Anweisungen ausführt, ignoriert also das erste Zeichen und schwimmt über die Linie N, die das entsprechende Wort auf den Stapel lädt. Schließlich gehen wir zu Zeile 2, die den gesamten Stapel ausgibt und beendet.
quelle
JavaScript, 78 Byte
Dies ist eine Art Port meiner Python-Antwort . Wir speichern die Wörter in einer Zeichenfolge, wobei sich jedes an der entgegengesetzten Position zu seinem Gegenstück befindet. Wir finden den Index des gegebenen Wortes
w
und erhalten diesen Index am Ende, um das Ergebnis zurückzugeben.Testschnipsel:
quelle
Pari / GP, 86 Byte
Pari / GP ist ein interaktiver Interpreter, wir brauchen kein "print" -cmd für die Ausgabe; Das Try-It_Online-Dienstprogramm benötigt jedoch ein "print" -cmd, daher habe ich dieses in die "footer" getrennt.
Wir definieren eine "Objekt-Funktion" (der Buchstabe O erinnert mich sehr an die Orwell-Funktion ... ;-)):
Rufen Sie danach an
Probieren Sie es online!
(Beachten Sie, dass die hier angegebenen Token in Pari / GP keine Zeichenfolgen, sondern zulässige Variablennamen sind! Diesen Variablen sollte niemals ein Wert zugewiesen werden.)
quelle
Gestapelt, 70 Bytes
Probieren Sie es hier aus! Übernimmt die Eingabe im Stapel und belässt die Ausgabe im Stapel. Zum Beispiel:
Dieser Code ist ziemlich selbsterklärend. Leicht modifiziert, um alle Testfälle auszuführen:
quelle
'LF
tun?@x
setzt eine Variable,'...'
ist eine Zeichenfolge undLF
ist die ZeilenvorschubvariableJolf, 35 Bytes
Es gibt viele nicht druckbare Dateien. Hier ist ein Hexdump, der allerdings nicht viel bringt:
Hier ist ein Online-Link.
Grundsätzlich sieht der Code so aus:
quelle
Eigentlich 56 Bytes
Probieren Sie es online!
Leider ist es ohne eingebaute Komprimierung kürzer, die Zeichenfolge nicht zu komprimieren und manuell zu dekomprimieren.
Erläuterung:
quelle
Haskell, 104
111BytesIdee:
fromEnum
, bewegen Sie sich 3 Schritte nach rechts (Modul 6) und konvertieren Sie es zurück in das Schlüsselwort::O
ist erforderlich, da die Typinferenz einige Probleme aufweist. Geben Sief
eine Signaturf :: O -> O
hätte den gleichen Effekt aber ist nicht so kurz.Bearbeiten:
Ersetzt
durch
danke an @Laikoni.
quelle
f
ist kürzer:f s=toEnum$mod(3+fromEnum s)6
Dyalog APL , 66 Bytes
Eines davon:
'slavery' 'freedom' 'ignorance' 'strength' 'war' 'peace'⊃⍨6|⎕UCS⊃⍞
verwendet diese Methode (erfordert,⎕IO←0
was auf vielen Systemen Standard ist).'strength' 'freedom' 'war' 'peace' 'slavery' 'ignorance'(⍳⊃(⌽⊣))⊂⍞
führt eine Suche durch und wählt dann das entsprechende Element aus der umgekehrten Liste aus.quelle
Qbasic,
13899 BytesD$
speichert alle Wörter von der linken Seite des Mantras, dann alle der rechten Seite. Jedes Wort wird mit Leerzeichen auf genau 9 Buchstaben pro Wort aufgefüllt.D$
dann wird an sich selbst angehängt.Dann
instr
wird der Index des vom Benutzer eingegebenen Wortes ermittelt. Der andere Teil des Mantras wird immer genau 9 * 3 Stellen weiter in der Zeichenkette gespeichert, also drucken wir einen Teilstring, der an dieser Stelle beginnt und 9 Zeichen benötigt.quelle
SmileBASIC, 92 Bytes
quelle
Python , 80 Bytes
Irgendwie hat xnor die Nase voll!
Dies ist eine unbenannte Lambda-Funktion, die das Ergebnis zurückgibt.
Probieren Sie es online!
Die Liste der Wörter ist so angeordnet, dass sie sich jeweils in der entgegengesetzten Position zu ihrem Gegenstück befinden. Wenn das Wort gegeben ist
w
, finden wir seinen Index in der Wortliste und dann bitweise NOT (~
). Dies kippt alle Bits, die berechnet werdenn => -n-1
. Erhält aufgrund der negativen Indizierung von Python den entgegengesetzten Index in der Liste.Als eine Art unbeabsichtigten Bonus können Sie dieser Funktion als zweites Argument eine beliebige Wortliste von Gegensätzen übergeben.
quelle