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).
(
durch a
und )
durch zu ersetzen b
. Ist abab
ein Palindrom? Nein, das müsste sein abba
. Dann ()()
ist es auch kein Palindrom; es müsste sein ())(
.
()() is not a palindrome, but ())( is.
Glückwunsch, Sie haben es auf reddit geschafft!