Es gab einige frühere Versuche , diese Frage zu stellen, aber keine entspricht den modernen Standards auf dieser Site. Per Diskussion über Meta reposte ich es auf eine Art und Weise, die einen fairen Wettbewerb unter unseren modernen Regeln ermöglicht.
Hintergrund
Ein Palindrom ist eine Zeichenfolge, die "vorwärts und rückwärts gleich liest", dh die Rückseite der Zeichenfolge entspricht der Zeichenfolge selbst. Wir sprechen hier nicht von "bequemen Palindromen", sondern von einer strengen zeichenweisen Umkehrung. ist zum Beispiel ()()
kein Palindrom, ist es aber ())(
.
Die Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die einen String S (oder das entsprechende Äquivalent in Ihrer Sprache) als Eingabe verwendet und einen Ausgang Q (eines Typs Ihrer Wahl) hat. Sie können alle angemessenen Mittel verwenden , um die Eingabe zu übernehmen und die Ausgabe bereitzustellen.
- Wenn der Eingang S ein Palindrom ist, sollte der Ausgang Q einen Wert A haben (der für jeden palindromischen S der gleiche ist ).
- Wenn der Eingang S kein Palindrom ist, sollte der Ausgang Q einen Wert B haben (der für jeden nicht-palindromen S gleich ist ).
- A und B müssen voneinander verschieden sein.
Oder mit anderen Worten: Ordnen Sie alle Palindrome einem Wert und alle Nicht-Palindrome einem anderen Wert zu.
Außerdem muss das Programm oder die Funktion, die Sie schreiben, selbst ein Palindrom sein (dh der Quellcode muss palindrom sein), was dies zu einer Herausforderung mit eingeschränktem Quellcode macht .
Klarstellungen
- Obwohl
true
undfalse
offensichtliche Wahl für sind A und B können Sie zwei unterschiedliche Werte verwenden für Ihre „ist ein Palindrom“ und „kein Palindrom“ Ausgänge, die nicht booleans sein müssen. - Wir definieren hier die Zeichenfolgenumkehr auf Zeichenebene .
éé
ist palindromisch, unabhängig davon, ob das Programm in UTF-8 oder Latin-1 codiert ist, obwohl es sich nach UTF-8-Codierung nicht um eine palindromische Folge von Oktetten handelt. - Selbst wenn Ihr Programm Nicht-ASCII-Zeichen enthält, muss es nur für die ASCII-Eingabe funktionieren. Insbesondere enthält die Eingabe S nur druckbare ASCII-Zeichen (einschließlich Leerzeichen, jedoch ohne Zeilenvorschub). Dies bedeutet unter anderem, dass, wenn Sie die Eingabe als Folge von Bytes und nicht als Folge von Zeichen behandeln, Ihr Programm wahrscheinlich immer noch der Spezifikation entspricht (es sei denn, die E / A-Codierung Ihrer Sprache ist sehr seltsam). Daher ist die Definition eines Palindroms im vorherigen Aufzählungszeichen nur dann wirklich wichtig, wenn überprüft wird, ob das Programm eine korrekte Form hat.
- Es ist legal, die Hälfte des Programms in einem Kommentar oder einem String-Literal zu verstecken, obwohl es unkreativ ist. Sie werden nach Länge und nicht nach Kreativität bewertet. Sie können also auch "langweilige" Methoden anwenden, um sicherzustellen, dass Ihr Programm ein Palindrom ist. Natürlich werden Teile Ihres Programms, die nichts tun, Ihre Punktzahl verschlechtern, da Sie nach Länge bewertet werden. Wenn Sie also beide Programmhälften verwenden können, ist dies wahrscheinlich hilfreich, wenn Sie es verwalten können .
- Da das Siegeskriterium in Bytes gemessen wird, müssen Sie die Codierung angeben, in der Ihr Programm geschrieben ist, um es bewerten zu können (obwohl in vielen Fällen offensichtlich ist, welche Codierung Sie verwenden).
Siegkriterium
Obwohl das Programm auf Zeichenebene ein Palindrom sein muss, verwenden wir Bytes, um zu sehen, wer gewinnt. Je kürzer Ihr Programm, gemessen in Bytes, desto besser. Dies ist eine Code-Golf- Herausforderung. Um den Vergleich von Übermittlungen (insbesondere von Übermittlungen in derselben Sprache) zu ermöglichen, setzen Sie eine Byteanzahl für Ihr Programm in die Kopfzeile Ihrer Übermittlung (zuzüglich einer Zeichenanzahl, falls diese von der Anzahl der Bytes abweicht).
(
durcha
und)
durch zu ersetzenb
. Istabab
ein Palindrom? Nein, das müsste seinabba
. Dann()()
ist es auch kein Palindrom; es müsste sein())(
.()() is not a palindrome, but ())( is.
Glückwunsch, Sie haben es auf reddit geschafft!Antworten:
Brachylog (2), 3 Bytes in der Brachylog-Codepage
Probieren Sie es online!
Dies ist ein vollständiges Programm, das Eingaben über die Standardeingabe (unter Verwendung der Brachylog-Syntax für Konstanten, dh Zeichenfolgen sind in doppelte Anführungszeichen eingeschlossen) und Ausgaben über die Standardausgabe akzeptiert. Die Ausgaben sind
true.
für eine palindromische Eingabe undfalse.
für eine nicht-palindromische Eingabe.Dieses Programm ist nicht nur palindrom, es hat auch links / rechts (und wahrscheinlich in einigen Schriften hoch / runter) Spiegelsymmetrie.
Erläuterung
In Brachylog markieren Großbuchstaben Punkte im Programm, die identische Werte haben. Dies wird fast wie eine elektrische Schaltung verwendet, um Informationen von einem Teil des Programms zu einem anderen zu übertragen. Eine Folge davon ist, dass Sie, wenn Sie einen Befehl zwischen ein identisches Paar Großbuchstaben setzen, effektiv behaupten, dass die Eingabe und Ausgabe des Befehls identisch sind. Brachylog nimmt implizit Eingaben entgegen, sodass wir in diesem Fall auch behaupten, dass die Eingabe für den Befehl mit der Eingabe für das Programm identisch ist. In diesem Programm verwenden wir den Befehl
↔
, der die Dinge umkehrt (in diesem Fall Strings). Das Programm setzt also effektiv voraus, dass die Eingabe vorwärts und rückwärts gleich ist.Ein vollständiges Programm (im Gegensatz zu einer Funktion) in Brachylog gibt einen Booleschen Wert zurück,
false.
wenn nicht alle Zusicherungen im Programm auf einmal korrekt sind odertrue.
wenn alle Zusicherungen im Programm miteinander kompatibel sind. Wir haben hier nur eine Behauptung - dass das Umkehren der Eingabe diese nicht ändert -, sodass das Programm als Palindrom-Checker fungiert.quelle
Pyth , 3 Bytes
Gibt True oder False zurück .
Probieren Sie es online!
Wie es funktioniert
quelle
_
?Python , 39 Bytes
Probieren Sie es online!
Langweilig, aber wenn es in Python kürzer ist, wird es beeindruckend sein.
quelle
(
,)
waren einige gute (und verwirrend) Eingänge :)Gelee , 5 Bytes
Gibt 1 oder 0 zurück . Die erste Zeile ist eine nicht ausgeführte Hilfsverknüpfung, die zweite Zeile ruft den Palindromtest auf.
Probieren Sie es online!
quelle
Gelee , 5 Bytes
Probieren Sie es online!
Ist gleich umgekehrt und umgekehrt ist gleich.
Oder das effizientere und doch weniger ästhetisch ansprechende:
oder
quelle
Mathematica, 23 Bytes
Nicht sehr interessant, aber der Vollständigkeit halber ...
Das Obige ist ein,
CompoundExpression
was sichPalindromeQ
als ein eingebautes, das die Herausforderung löst, auswertet .QemordnilaP
ist einfach eine undefinierte Kennung, die wegen der ignoriert wird;
.quelle
Haskell,
87854434 BytesErklärung:
((->) a)
ist eine Instanz von Applicative (danke @faubiguy), mit<*>
definiert alsWenn man also die Argumente einsetzt, kann man sehen, warum das funktioniert.
quelle
--
ist ein Kommentar.(==)
,reverse
undid
Funktionen (id
die Identitätsfunktion).<*>
anstelle von<$>
<*>id
05AB1E , 3 Bytes
Code:
Erläuterung:
Verwendet die CP-1252- Codierung. Probieren Sie es online!
quelle
ÂQ
PHP, 55 Bytes
Außerdem ist der Name der Sprache ein Palindrom, also ... Bonuspunkte!
quelle
MATL , 7 Bytes
Probieren Sie es online!
Rückgabe [1; 1] für palindromische Eingabe und [0; 0] sonst.
quelle
Pip ,
1211 BytesJetzt ohne Kommentare!
Nimmt Eingaben als Befehlszeilenargument an; Ausgänge
1
für Palindrom,0
für Nicht-Palindrom. Probieren Sie es online!Der Kern dessen , was wir tun wollen ist
RVaQa
:reverse(a) string-equals a
. Der Codex:RVaQa
berechnet dieses Ergebnis und weist es zux
. DannVR:x
ordnet den Wertx
auf die VariableVR
. Da diese Zuweisung die letzte Anweisung im Programm ist, wird auch ihr Wert automatisch gedruckt. Voila!Eine frühere interessante Version mit undefiniertem Verhalten finden Sie im Revisionsverlauf.
quelle
Perl 6 , 25 Bytes / Zeichen utf8
Versuch es
quelle
R
111103 BytesNicht die originellste Antwort.
#
ist das Kommentarzeichen in RUngolfed:
Die Zeichenkette von
scan
wird dank dercharToRaw
Funktion in Rohbytes umgewandelt . Diese rohen Bytes werden einzeln mit ihren Gegenstücken aus derrev()
Funktion verglichen , wodurch die Reihenfolge der Argumente umgekehrt wird. Die Ausgabe dieses Teils ist ein Vektor vonTRUE
und / oderFALSE
.Die
all
Funktion gibt dann aus,TRUE
ob alle diese Elemente vorhanden sindTRUE
Hier ist
"\n"
in derscan
Funktion für Eingaben mit mehr als einem Wort erforderlich.Vorherige Antwort (byteweise): 81 Bytes
mit - 24 Bytes dank @rturnbull .
quelle
charToRaw
Konvertierung vor der Zuweisung zus
und die Einstellung dessep
Arguments wiescan
all((s<-charToRaw(scan(,"",,,"\n")))==rev(s))#))s(ver==)))"n\",,,"",(nacs(waRoTrahc-<s((lla
éé
unter einer UTF-8-Codierung, aber ich glaube nicht, dass dies gegen die Regeln der Herausforderungéé
mit einerlatin1
Kodierung getestet .RProgN , 11 Bytes
Die erste Hälfte erledigt das ganze schwere Heben, und dank RProgN ist die zweite Hälfte ein No-Op.
Probieren Sie es online!
quelle
Netzhaut , 53 Bytes
Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Probieren Sie es online!
Ich bin mir ziemlich sicher, dass dies noch nicht optimal ist (die
»
Zeile scheint besonders verschwenderisch zu sein und ich habe eine 45-Byte-Lösung, die bis auf ein Zeichen palindrom ist), aber ich denke, es ist ein Anfang.quelle
GNU sed ,
6459 + 1 (r Flag) = 60 Bytes UTF-8Es hat eine Weile gedauert, bis ich eine Antwort gefunden habe, die keinen Kommentarbereich verwendet, um den Code zu einem Palindrom zu machen. Stattdessen verwende ich den
c
Befehl, der die erste Hälfte des Codes in umgekehrter Reihenfolge ausgibt. Nur stelle ich sicher, dass diese Anweisung nicht erreicht wird.Das Skript wird gedruckt,
1
wenn die Eingabezeichenfolge kein Palindrom ist (stellen Sie sich vor, dass es einen Fehler gibt). Wenn es sich bei der Zeichenfolge um ein Palindrom handelt, wird keine Ausgabe ausgegeben (stellen Sie sich vor, dass der Vorgang erfolgreich beendet wurde).Führen Sie Beispiele aus: oder Probieren Sie es online aus!
Erläuterung:
quelle
-r
funktioniert nicht, aber Sie können das Ganze einfach in BASH verpacken. Probieren Sie es online!Alice , 19 Bytes
Probieren Sie es online!
Drucke
Jabberwocky
für Palindrome und nichts für Nicht-Palindrome. Funktioniert für beliebige UTF-8-Eingaben.Erläuterung
Da dies eine Zeichenfolgenverarbeitungsaufgabe ist, muss Alice im Ordnungsmodus arbeiten, um sie zu lösen. Dies bedeutet wiederum, dass sich der Befehlszeiger diagonal bewegen muss, und daher benötigen wir mindestens zwei Leitungen, damit die IP auf- und abspringen kann. Der Zeilenvorschub in einem solchen Programm bietet eine gute Position, um den mittleren Charakter des Palindroms zu platzieren. Das heißt, die zweite Zeile muss die Umkehrung der ersten sein. Da wir jedoch nur jedes andere Zeichen in jeder Zeile ausführen, passt die Umkehrung des Codes genau in die eigenen Lücken, wenn wir sicherstellen, dass die Zeilenlänge ungerade ist. Das einzige Zeichen, das überhaupt nicht verwendet wird, ist der Backslash, aber da es willkürlich war, habe ich es ausgewählt, damit das Programm schön und symmetrisch aussieht.
Der eigentliche relevante Code ist also:
Was im Zickzack von links nach rechts ausgeführt wird.
quelle
Haskell , 34 Bytes
Probieren Sie es online! Rufen Sie mit
f "some string"
, zurückTrue
oderFalse
.Der
=<<
Operator für Funktionen funktioniert wief=<<g = \s -> f (g s) s
folgt: Der Code ist äquivalent zuf s=s==reverse s
, was, wie ich gerade bemerkt habe, die gleiche Bytezahl zur Folge hätte.Version ohne Kommentar: (49 Bytes)
Probieren Sie es online!
Mit anrufen
p "some string"
. Diese gibt ,False
wenn die angegebene Zeichenfolge ist ein Palindrom, undTrue
wenn es nicht ein Palindrom.Erläuterung:
Ich fand dieses Kommentar-freie Palindrom, indem ich mit der Kommentar-Version anfing und den Kommentar durch eine neue Zeile ersetzte:
Die zweite Zeile schlägt fehl, weil die Klammern nicht übereinstimmen, also müssen wir sie entfernen. Wenn wir eine Funktion hätten,
e
die auf Gleichheit prüft, dannKompiliert beide mit der zweiten Zeile, die einen Infix-Operator definiert,
<<=
der zwei Argumente akzeptiertesrever
unde
die Funktion zurückgibtp
.Um
e
als Gleichheitsfunktion zu definieren, würde man normalerweise schreibene=(==)
, aber)==(=e
nicht kompilieren. Stattdessen könnten wir zwei Argumente ausdrücklich und geben sie nicht an==
:e x y=x==y
. Jetzt wird der umgekehrte Codey==x=y x e
kompiliert, aber der==
Operator wird neu definiert , wodurch die Definitione x y=x==y
fehlschlägt. Wenn wir jedoch zum Ungleichungsoperator wechseln/=
, wird die umgekehrte Definition zuy=/x=y x e
und definiert einen=/
Operator, der den ursprünglichen/=
Operator nicht beeinträchtigt .quelle
OIL , 178 Bytes
Liest eine Eingabe, explodiert sie, addiert langsam ihre Länge (durch Inkrementieren und Dekrementieren) zu der Adresse, um die Adresse nach der Zeichenfolge zu ermitteln, springt zu einem anderen Teil des Codes (in der Mitte), kehrt die Bandrichtung um und implodiert die Zeichenfolge erneut und prüft, ob es sich um die ursprüngliche Zeichenfolge handelt. TL; DR: Es ist wie immer ein Schmerz.
40
Wird ausgegeben, wenn die Zeichenfolge kein Palindrom0
ist.quelle
Javascript, 64 Bytes
Funktion
f
mit String aufrufenquelle
f
, Ihr Code weist Ihre Pfeilfunktion keiner Variablen zu und kann daher nicht aufgerufen werdenJapt ,
72 BytesStarte es
Alte Lösung:
Probieren Sie es online!
Erläuterung
Japt kann Funktionen nur entziehen, wenn eine schließende Klammer (oder ein Leerzeichen) erreicht ist.
Dies kann umgeschrieben werden:
U¥Uw(U¥U)
→U¥Uw
→U==Uw
. In Japt wird die am Anfang und Ende einer Funktion ausgelassene Klammer automatisch eingefügt.quelle
w
eine Funktion keine Argumente akzeptiert, wie trifft dies zuU
? Ist es so etwas wieU.reverse()
?U
auf die gleiche Weise um wieU.reverse()
.Bash + Unix-Dienstprogramme, 49 Byte
Die Eingabe wird als Argument übergeben.
Die Ausgabe erfolgt im Ergebniscode - 0 für ein Palindrom, 1 für ein Nicht-Palindrom.
Vielleicht kann es jemand besser machen und sich nicht nur auf einen Kommentar verlassen, um den Code selbst palindrom zu machen.
Probieren Sie es online!
quelle
[[ $1 = `rev<<<$1` ]]
ist kürzer. (Bash-[[
Syntax, kein Zitat erforderlich)rev<<<$1
werden auch in der[[...]]
Lösung benötigt. Testen Sie es mit der Eingabezeichenfolge'[$]]$['
(die ein Palindrom ist). Wenn diese Anführungszeichen hinzugefügt werden, hat Ihre Lösung dieselbe Länge wie meine Lösung.==
in[[
als eincase
ähnliches Muster interpretiert wird.> <>, 11 Bytes
Probieren Sie es hier aus!
Gibt "\ netwas riecht nach Fisch ..." für ein gültiges Palindrom zurück, keine Ausgabe für ein ungültiges Palindrom. Legen Sie das Palindrom auf den Stapel.
quelle
Java -
171169160 BytesDer Kommentar am Ende soll es zu einem Palindrom machen. Gibt zurück,
P(alindrome)
wann die Eingabe palindrom ist undN(ot)
wann nicht.Ungolfed-Version:
2 Bytes gespart dank @DLosc
Vielen Dank an @Olivier Grégoire für den Hinweis auf die falsche Anzahl von Bytes! Jetzt behoben
quelle
int
s anstelle vonchar
s zurückgeben.'P'
und 78 für zurückgeben,'N'
oder verschiedene Zeichen verwenden, um noch mehr Bytes zu sparen.new StringBuffer(s).reverse()+""
anstelle vonnew StringBuffer(s).reverse().toString()
int
stattdessen eine zurücksendenbool
?Java 8,
92-90BytesDies ist eine Kommentarversion. Wenn eine Zeichenfolge die Umkehrung enthält, ist sie ein Palindrom (
true
), andernfalls nicht (false
).Probieren Sie es online!
Aktualisieren
;
'squelle
s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s
. Probieren Sie es online 90 Bytes .Eigentlich 5 Bytes
Probieren Sie es online!
Die wahrheitsgemäße Ausgabe ist
[1]\n[1]
und die falsche Ausgabe ist[]\n[]
(in beiden Ausgaben steht sie\n
für eine wörtliche Zeilenumbruchzeile).Erläuterung:
quelle
C ++, 154 Bytes
Ich muss sagen, die umgekehrte Aussage war teuer, aber ich kann mir nicht vorstellen, wie viel ich tun kann, um das zu ändern. In der Lage zu sein, die std :: Symbole auszuschneiden, würde mich ungefähr 10 Zeichen sparen, aber "mit dem Namespace std;" ist ziemlich viele mehr.
Ich nehme an, C ++ war nicht wirklich für die Kürze gedacht.
quelle
Prolog, 44 Bytes
Dies verwendet bestimmte Klauselgrammatiken. Es ist eigentlich eine vollständige kontextfreie Grammatik:
Verwendungszweck:
quelle
CJam, 13 Bytes
Erläuterung:
Beispiel:
quelle
l_W%#e#%W_l
J, 15 Bytes, 15 Zeichen
Gibt 1 zurück, wenn es sich um Palindrom handelt, und 0, wenn nicht.
Ausgabe:
Erläuterung:
quelle