Ich bin ein Palindrom. Bist du?

103

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 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 .

Klarstellungen

  • Obwohl trueund falseoffensichtliche 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 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).

FantaC
quelle
12
Würde jemand bitte erklären, warum () () kein Palindrom ist?
Emilio M Bumachar
58
@EmilioMBumachar Versuchen Sie, (durch aund )durch zu ersetzen b. Ist ababein Palindrom? Nein, das müsste sein abba. Dann ()()ist es auch kein Palindrom; es müsste sein ())(.
DLosc
7
Diese Lösungen, die ausschließlich Kommentare verwenden, um das Programm palindromisch zu machen, sehen für mich wie eine Lücke aus :(
kennytm
15
@kennytm Sie nicht zuzulassen wäre schlimmer, da es keine zufriedenstellende Möglichkeit gibt, dies objektiv sprachunabhängig zu tun. (Was ist ein Kommentar? Was ist mit dem Einfügen der unbenutzten Hälfte in ein Zeichenfolgenliteral, das verworfen wird? Was ist mit 2D-Sprachen, in denen Sie perfekt ausführbaren Code haben können, der einfach nie erreicht wird?)
Martin Ender
9
()() is not a palindrome, but ())( is. Glückwunsch, Sie haben es auf reddit geschafft!
numbermaniac

Antworten:

137

Brachylog (2), 3 Bytes in der Brachylog-Codepage

I↔I

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 und false.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 oder true.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
49
Und 180 grad rotationssymmetrie, es ist schön.
ATaco
7
... und Symmetrie entlang vertikaler und horizontaler Achsen :-)
Luis Mendo
13
@SteakOverflow Brachylog verwendet eine benutzerdefinierte Codepage , sodass diese Zeichen nicht in UTF-8
DJMcMayhem
4
Ich bin dieser Community beigetreten, um über dieses Programm abzustimmen. Beeindruckend.
Bill Michell
4
@ATaco Die Kombination von Links- / Rechts- und Auf- / Abwärtssymmetrie impliziert eine 180-Grad-Rotationssymmetrie. ;)
Eric Duminil
55

Pyth , 3 Bytes

_I_

Gibt True oder False zurück .

Probieren Sie es online!

Wie es funktioniert

  _  Reverse the input.
_I   Invariant-reverse; test if the reversed input is equal to its reverse.
Dennis
quelle
1
Warum brauchst du das Finale _?
Busukxuan
34
@busukxuan Aus der Frage "Zusätzlich muss das Programm oder die Funktion, die Sie schreiben, ein Palindrom selbst sein"
isaacg
1
Warum so viele Gegenstimmen ... Diese Antwort scheint nicht so schwer zu sein ...?
ghosts_in_the_code
1
Ich denke schon. Trotzdem scheint es irgendwie unfair zu sein. Bei einigen Fragen muss man viel harte Arbeit aufbringen, andere sind viel einfacher zu beantworten. Trotzdem ist die Auszahlung gleich. Übrigens habe ich auch aufgestimmt: P
ghosts_in_the_code
4
@ghosts_in_the_code Nur eine meiner Antworten mit 100+ war wirklich schwierig zu schreiben, aber es gibt Antworten, bei denen ich Tage damit verbracht habe, nur eine Handvoll positive Stimmen zu bekommen. Am Ende gleicht sich alles aus ...
Dennis
47

Python , 39 Bytes

lambda s:s[::-1]==s#s==]1-::[s:s adbmal

Probieren Sie es online!

Langweilig, aber wenn es in Python kürzer ist, wird es beeindruckend sein.

Jonathan Allan
quelle
Wow, thos (, )waren einige gute (und verwirrend) Eingänge :)
ABcDexter
33

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!

Dennis
quelle
wow, neu hinzugekommen.
Jonathan Allan
6
Ja, erst 18 Stunden alt.
Dennis
Sie haben die Codierung nicht angegeben. Ich vermute, UTF-8?
Brian Minton
1
@ BrianMinton Nein, dies wären 11 Bytes in UTF-8. Jelly verwendet diese Codepage .
Dennis
@ Tennis, danke für die Info.
Brian Minton
23

Gelee , 5 Bytes

⁼ṚaṚ⁼

Probieren Sie es online!

Ist gleich umgekehrt und umgekehrt ist gleich.

Oder das effizientere und doch weniger ästhetisch ansprechende:

⁼Ṛ
Ṛ⁼

oder

Ṛ⁼
⁼Ṛ
Jonathan Allan
quelle
23

Mathematica, 23 Bytes

QemordnilaP;PalindromeQ

Nicht sehr interessant, aber der Vollständigkeit halber ...

Das Obige ist ein, CompoundExpressionwas sich PalindromeQals ein eingebautes, das die Herausforderung löst, auswertet . QemordnilaPist einfach eine undefinierte Kennung, die wegen der ignoriert wird ;.

Martin Ender
quelle
21

Haskell, 87 85 44 34 Bytes

p=(==)<*>reverse--esrever>*<)==(=p

Erklärung: ((->) a)ist eine Instanz von Applicative (danke @faubiguy), mit <*>definiert als

(<*>) f g x = f x (g x)

Wenn man also die Argumente einsetzt, kann man sehen, warum das funktioniert.

Programm Mann
quelle
1
Kannst du den Code erklären?
bli
1
@bli alles nach dem --ist ein Kommentar.
theonlygusti
3
@theonlygusti Haskell ist so fremd, dass nur die Hälfte hilft.
Yakk
@Yakk Es ist eine Art Kombination aus dem (==), reverseund idFunktionen ( iddie Identitätsfunktion).
Dienstag,
Sie können 10 Bytes sparen, indem Sie <*>anstelle von<$><*>id
faubi
20

05AB1E , 3 Bytes

Code:

ÂQÂ

Erläuterung:

     # Bifurcate (duplicate and reverse the duplicate) implicit input
 Q    # Check if equal
  Â   # Bifurcate the result

Verwendet die CP-1252- Codierung. Probieren Sie es online!

Adnan
quelle
Warum nicht einfachÂQ
Neil A.
1
@NeilA. Der Code selbst muss ebenfalls ein Palindrom sein.
Adnan
17

PHP, 55 Bytes

<?=strrev($s=$_GET[s])==$s;#;s$==)]s[TEG_$=s$(verrts=?<

Außerdem ist der Name der Sprache ein Palindrom, also ... Bonuspunkte!

Kodos Johnson
quelle
Hinterhältige Lösung.
Martijn
16

MATL , 7 Bytes

tPX=XPt

Probieren Sie es online!

Rückgabe [1; 1] für palindromische Eingabe und [0; 0] sonst.

t       % duplicate the input
P       % reverse the second string
X=      % check the two strings are exactly equal (returns 0 or 1)
XP      % flip array (does nothing)
t       % duplicate the answer, giving either [1;1] or [0;0]
        % (implicit) convert to string and display
B. Mehta
quelle
15

Pip , 12 11 Bytes

Jetzt ohne Kommentare!

x:RVaQaVR:x

Nimmt Eingaben als Befehlszeilenargument an; Ausgänge 1für Palindrom, 0für Nicht-Palindrom. Probieren Sie es online!

Der Kern dessen , was wir tun wollen ist RVaQa: reverse(a) string-equals a. Der Code x:RVaQaberechnet dieses Ergebnis und weist es zu x. Dann VR:xordnet den Wert xauf die Variable VR. 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.

DLosc
quelle
12

Perl 6 , 25 Bytes / Zeichen utf8

{.flip eq$_}#}_$qe pilf.{

Versuch es

Brad Gilbert b2gills
quelle
9

R 111 103 Bytes

all((s<-el(strsplit(scan(,"",,,"\n"),"")))==rev(s))#))s(ver==)))"",)"n\",,,"",(nacs(tilpsrts(le-<s((lla

Nicht die originellste Antwort. #ist das Kommentarzeichen in R

Ungolfed:

all((s<-el(strsplit(scan(,"",,,"\n"),"")))==rev(s))
#
))s(ver==)))"",)"n\",,,"",(nacs(tilpsrts(le-<s((lla

Die Zeichenkette von scanwird dank der charToRawFunktion in Rohbytes umgewandelt . Diese rohen Bytes werden einzeln mit ihren Gegenstücken aus der rev()Funktion verglichen , wodurch die Reihenfolge der Argumente umgekehrt wird. Die Ausgabe dieses Teils ist ein Vektor von TRUEund / oder FALSE.
Die allFunktion gibt dann aus, TRUEob alle diese Elemente vorhanden sindTRUE

Hier ist "\n"in der scanFunktion für Eingaben mit mehr als einem Wort erforderlich.

Vorherige Antwort (byteweise): 81 Bytes

function(s)all((s=charToRaw(s))==rev(s))#))s(ver==))s(waRoTr‌​ahc=s((lla)s(noitcnu‌​f

mit - 24 Bytes dank @rturnbull .

Frédéric
quelle
Sie können einige Bytes einsparen, indem Sie die charToRawKonvertierung vor der Zuweisung zu sund die Einstellung des sepArguments wie scanall((s<-charToRaw(scan(,"",,,"\n")))==rev(s))#))s(ver==)))"n\",,,"",(nacs(waRoTrahc-<s((lla
folgt vornehmen
(Auch dieser Ansatz funktioniert nicht für z. B. Eingaben ééunter einer UTF-8-Codierung, aber ich glaube nicht, dass dies gegen die Regeln der Herausforderung
verstößt
@rturnbull: danke für die eingaben! Ich habe ja éémit einer latin1Kodierung getestet .
Frédéric
Da der Test zeichenweise durchgeführt werden muss, verstößt das aktuelle Programm meiner Meinung nach gegen die Regeln.
Frédéric
Ich bin mir nicht sicher, ob die vorherige Version gegen die Regeln verstößt. OP besagt: "Unter anderem bedeutet dies, dass Ihr Programm, wenn Sie die Eingabe als Folge von Bytes und nicht als Folge von Zeichen behandeln, wahrscheinlich immer noch der Spezifikation entspricht (es sei denn, die E / A-Codierung Ihrer Sprache ist sehr seltsam). "
Rturnbull
8

RProgN , 11 Bytes

~]S.E E.S]~

Die erste Hälfte erledigt das ganze schwere Heben, und dank RProgN ist die zweite Hälfte ein No-Op.

~]S.E E.S]~
~           # Treat the word as a Zero Space Segment
 ]          # Duplicate the top of the stack
  S.        # Reverse the top of the stack
    E       # Compare if these values are equal
      E.S]~ # A no-op, because the ~ is at the end of the word, not the start.

Probieren Sie es online!

Ein Taco
quelle
8

Netzhaut , 53 Bytes

Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.

$
¶$`
O$^`\G.
»
D`
M$`^.+$
$+.^`$M
`D
»
.G\`^$O
`$¶
$

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.

Martin Ender
quelle
8

GNU sed , 64 59 + 1 (r Flag) = 60 Bytes UTF-8

Es 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 cBefehl, der die erste Hälfte des Codes in umgekehrter Reihenfolge ausgibt. Nur stelle ich sicher, dass diese Anweisung nicht erreicht wird.

:;s:^(.)(.*)\1$:\2:;t;/../c1
d
1c/../;t;:2\:$1\)*.().(^:s;:

Das Skript wird gedruckt, 1wenn 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!

me@LCARS:/PPCG$ sed -rf palindrome_source.sed <<< "level"
me@LCARS:/PPCG$ sed -rf palindrome_source.sed <<< "game"
1

Erläuterung:

:                              # start loop
s:^(.)(.*)\1$:\2:              # delete first and last char, if they are the same
t                              # repeat if 's' was successful
/../c1                         # if at least 2 chars are left, print 1. 'c' reads
                               #till EOL, so next command must be on a new line.
d                              # delete pattern space. This line must be a
                               #palindrome itself, and must end the script.
1c/../;t;:2\:$1\)*.().(^:s;:   # (skipped) print first half of code in reverse
                               #order. Everything after 'c' is treated as string.
Seshoumara
quelle
1
TIO hat jetzt Unterstützung für sed. -rfunktioniert nicht, aber Sie können das Ganze einfach in BASH verpacken. Probieren Sie es online!
Riley
@ Riley Gute Verwendung von Kopf- und Fußzeile bei TIO, danke. Die vorherige Problemumgehung bestand darin, den Code mit -e in die Argumentliste zu verschieben, aber Ihr Weg ist viel besser. Ich habe darauf gewartet, dass das behoben wird, aber so muss ich nicht.
Seshoumara
7

Alice , 19 Bytes

/@.nzRoi\
\ioRzn.@/

Probieren Sie es online!

Drucke Jabberwockyfü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:

/ . z o
 i R n @

Was im Zickzack von links nach rechts ausgeführt wird.

/   Reflect the IP southeast, enter Ordinal mode.
i   Read all input as a single string.
.   Duplicate the input.
R   Reverse the copy.
z   Pop the reverse Y and the original X. If X contains Y, drop everything
    up to its first occurrence. Since we know that X and Y are the same length,
    Y can only be contained in X if X=Y, which means that X is a palindrome.
    So this will result in an empty string for palindromes and in the non-empty
    input for non-palindromes.
n   Logical NOT. Replaces non-empty strings with "", and empty strings with
    "Jabberwocky", the "default" truthy string.
o   Output the result.
@   Terminate the program.
Martin Ender
quelle
6

Haskell , 34 Bytes

f=(==)=<<reverse--esrever<<=)==(=f

Probieren Sie es online! Rufen Sie mit f "some string", zurück Trueoder False.

Der =<<Operator für Funktionen funktioniert wie f=<<g = \s -> f (g s) sfolgt: Der Code ist äquivalent zu f s=s==reverse s, was, wie ich gerade bemerkt habe, die gleiche Bytezahl zur Folge hätte.


Version ohne Kommentar: (49 Bytes)

e x y=x/=y
p=e=<<reverse
esrever<<=e=p
y=/x=y x e

Probieren Sie es online!

Mit anrufen p "some string". Diese gibt , Falsewenn die angegebene Zeichenfolge ist ein Palindrom, und Truewenn 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:

p=(==)=<<reverse
esrever<<=)==(=p

Die zweite Zeile schlägt fehl, weil die Klammern nicht übereinstimmen, also müssen wir sie entfernen. Wenn wir eine Funktion hätten, edie auf Gleichheit prüft, dann

p=e=<<reverse
esrever<<=e=p

Kompiliert beide mit der zweiten Zeile, die einen Infix-Operator definiert, <<=der zwei Argumente akzeptiert esreverund edie Funktion zurückgibt p.

Um eals Gleichheitsfunktion zu definieren, würde man normalerweise schreiben e=(==), aber )==(=enicht kompilieren. Stattdessen könnten wir zwei Argumente ausdrücklich und geben sie nicht an ==: e x y=x==y. Jetzt wird der umgekehrte Code y==x=y x ekompiliert, aber der ==Operator wird neu definiert , wodurch die Definition e x y=x==yfehlschlägt. Wenn wir jedoch zum Ungleichungsoperator wechseln /=, wird die umgekehrte Definition zu y=/x=y x eund definiert einen =/Operator, der den ursprünglichen /=Operator nicht beeinträchtigt .

Laikoni
quelle
5

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.

40Wird ausgegeben, wenn die Zeichenfolge kein Palindrom 0ist.

5
0
12
0
40
1
40
2
1
40
34
10
2
3
22
16
9
2
8
35
6
11
6
37

3
4
4
27
26
0
1
10
1

40
13
2
31
04

1
01
1
0
62
72
4
4
3

73
6
11
6
53
8
2
9
61
22
3
2
01
43
04
1
2
04
1
04
0
21
0
5
L3viathan
quelle
2
Ordentliche Sprache! :)
DLosc
5

Javascript, 64 Bytes

f=s=>s==[...s].reverse().join``//``nioj.)(esrever.]s...[==s>=s=f

Funktion fmit String aufrufen

f("abba") // returns true
f("abab") // returns false
Prasanth Bendra
quelle
Ihr Quellcode ist kein Palindrom!
Seshoumara
@seshoumara Der Code wurde aktualisiert
Prasanth Bendra
Jetzt ist es gut. Erwähnen Sie möglicherweise den Rückgabewert, wenn die Zeichenfolge kein Palindrom ist, nur zur Vervollständigung.
Seshoumara
@apsillers danke Ich habe die Antwort bearbeitet.
Prasanth Bendra
Es gibt keine Funktion f, Ihr Code weist Ihre Pfeilfunktion keiner Variablen zu und kann daher nicht aufgerufen werden
spex
5

Japt , 7 2 Bytes

êê

Starte es

Alte Lösung:

U¥UwU¥U

Probieren Sie es online!

Erläuterung

U¥UwU¥U
U¥        U is the input, ¥ is a shortcut for == 
  Uw      w is a reverse function.
    U¥U   This calculates U == U (always true), but the result is ignored
          because w does not look at its arguments.

Japt kann Funktionen nur entziehen, wenn eine schließende Klammer (oder ein Leerzeichen) erreicht ist.

Dies kann umgeschrieben werden: U¥Uw(U¥U)U¥UwU==Uw. In Japt wird die am Anfang und Ende einer Funktion ausgelassene Klammer automatisch eingefügt.

Oliver
quelle
Es ist alles sinnvoll, außer wenn weine Funktion keine Argumente akzeptiert, wie trifft dies zu U? Ist es so etwas wie U.reverse()?
DLosc
@ DLosc Richtig. Es kehrt sich Uauf die gleiche Weise um wie U.reverse().
Oliver
4

Bash + Unix-Dienstprogramme, 49 Byte

[ "$1" = "`rev<<<$1`" ] # ] "`1$<<<ver`" = "1$" [

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!

Mitchell Spector
quelle
[[ $1 = `rev<<<$1` ]]ist kürzer. (Bash- [[Syntax, kein Zitat erforderlich)
Arthur2e5
2
@ Arthur2e5 Ich habe deinen Vorschlag ausprobiert, aber ich denke, die Anführungszeichen rev<<<$1werden 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.
Mitchell Spector
Großer Fang! Ich habe vergessen, dass das RHS von ==in [[als ein caseähnliches Muster interpretiert wird.
Arthur2e5
@ Arthur2e5 Ich denke immer noch, dass es wahrscheinlich eine clevere Möglichkeit gibt, dies zu verkürzen.
Mitchell Spector
Funktioniert dies weiterhin, wenn die Eingabe Zeilenumbrüche enthält? Ich denke, Sie brauchen rev | tac statt nur rev.
b_jonas
4

> <>, 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.

redstarcoder
quelle
Wenn die Eingabe bereits auf dem Stapel sein muss, wird dies zu einem Snippet. Diese Herausforderung erfordert Programme oder Funktionen, keine Schnipsel.
Paprika
4

Java - 171 169 160 Bytes

int q(String s){return s.equals(new StringBuffer(s).reverse().toString())?1:2;}//};2:1?))(gnirtSot.)(esrever.)s(reffuBgnirtS wen(slauqe.s nruter{)s gnirtS(q tni

Der Kommentar am Ende soll es zu einem Palindrom machen. Gibt zurück, P(alindrome)wann die Eingabe palindrom ist und N(ot)wann nicht.

Ungolfed-Version:

int q(String s) {
    return s.equals(new StringBuffer(s).reverse().toString()) ? 'P' : 'N';
}//};'N':'P'?))(gnirtSot.)(esrever.)s(reffuBgnirtS wen(slauqe.s nruter{)s gnirtS(q tni

2 Bytes gespart dank @DLosc

Vielen Dank an @Olivier Grégoire für den Hinweis auf die falsche Anzahl von Bytes! Jetzt behoben

Plätzchen
quelle
Ich glaube, Sie können einige Bytes sparen, indem Sie ints anstelle von chars zurückgeben.
DLosc
Ich weiß nicht, wie ich Ihre Byteanzahl überprüfen soll, aber Sie haben 160 Bytes, nicht 161.
Olivier Grégoire
Sie können 2 Bytes sparen, indem Sie 80 für 'P'und 78 für zurückgeben, 'N'oder verschiedene Zeichen verwenden, um noch mehr Bytes zu sparen.
Selim
1
Sie können noch mehr Bytes einsparen, indem Sie new StringBuffer(s).reverse()+""anstelle vonnew StringBuffer(s).reverse().toString()
Selim den
1
Gibt es einen Grund, warum Sie intstattdessen eine zurücksenden bool?
CodesInChaos
4

Java 8, 92-90 Bytes

Dies ist eine Kommentarversion. Wenn eine Zeichenfolge die Umkehrung enthält, ist sie ein Palindrom ( true), andernfalls nicht ( false).

s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s

Probieren Sie es online!

Aktualisieren

  • -2 [18-04-05] Umgestellt auf enthält. Vielen Dank an Kevin Cruijssen !
  • -2 [17-02-20] entfernt ;'s
  • -16 [17-02-22] Automatisch konvertieren
NichtlinearFruit
quelle
Dieser Code ist kein Lambda-Ausdruck.
Jakob
@ Jakob Ich dachte, es war. Wenn Sie das Lambda verwenden würden, würden Sie wahrscheinlich eine führende und eine nachfolgende Newline wünschen. (Ich habe einen tio Link hinzugefügt)
NonlinearFruit
Ja, meine Beschwerde war, dass der Zeilenkommentar die Einreichung nicht nur zu einem Lambda-Ausdruck macht und daher nicht als Lambda-Lösung gültig ist. Mach dir vorerst keine Sorgen; Ich werde wahrscheinlich irgendwann einen Metapost schreiben, um einen Konsens zu erzielen.
Jakob
@ Jakob Lambda Lösungen können manchmal fremden Code haben , weshalb ich denke, dass es gültig ist. Aber wenn Sie nicht verkauft werden, würde ein Meta-Post nicht schaden.
NonlinearFruit
1
Ich weiß, dass es eine Weile her ist, aber Sie können 2 Bytes Golf spielen, indem Sie es in ändern s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s. Probieren Sie es online 90 Bytes .
Kevin Cruijssen
3

Eigentlich 5 Bytes

;R=R;

Probieren Sie es online!

Die wahrheitsgemäße Ausgabe ist [1]\n[1]und die falsche Ausgabe ist []\n[](in beiden Ausgaben steht sie \nfür eine wörtliche Zeilenumbruchzeile).

Erläuterung:

;R=R;
;R=    duplicate input, reverse one copy, test equality (the main palindrome-testing part)
   R   range(1, x+1) - if palindrome, this pushes [1], else it pushes []
    ;  duplicate
Mego
quelle
Warum gehst du nicht einfach tun dies ?
Undichte Nonne
1
@LeakyNun es muss ein Palindrom sein
Caird Coinheringaahing
3

C ++, 154 Bytes

int m(){std::string g,p="";g=p;std::reverse(p.begin(),p.end());return g==p;}//};p==g nruter;))(dne.p,)(nigeb.p(esrever::dts;p=g;""=p,g gnirts::dts{)(m tni

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.

Monkah VII
quelle
3

Prolog, 44 Bytes

p-->[]|[_]|[E],p,[E].%.]E[,p,]E[|]_[|][>--p

Dies verwendet bestimmte Klauselgrammatiken. Es ist eigentlich eine vollständige kontextfreie Grammatik:

p -->
      []            % the empty string
   |                % or
      [_]           % a one character string
   |                % or
      [E],          % one character, followed by
      p,            % a palindrome, followed by
      [E].          % that same character

Verwendungszweck:

?- phrase(p,"reliefpfeiler").
true 

?- phrase(p,"re").
false.
falsch
quelle
2

CJam, 13 Bytes

l_W%=e#e=%W_l

Erläuterung:

l_W%=e#e=%W_l
l_            e#Read input twice
  W%          e#Reverse one input
    =         e#Test for equality
     e#e=%W_l e#Comment to be a palindrome

Beispiel:

> l_W%=e#e=%W_l
l_W%=e#e=%W_l
1

> l_W%=e#e=%W_l
Hi
0

> l_W%=e#e=%W_l
hh
1
Roman Gräf
quelle
Versuchen Sie dies:l_W%#e#%W_l
Aditsu
2

J, 15 Bytes, 15 Zeichen

-:|.NB. .BN.|:-

Gibt 1 zurück, wenn es sich um Palindrom handelt, und 0, wenn nicht.

Ausgabe:

   f '())('
1
   f 'nope'
0

Erläuterung:

-:    NB. "Match" verb, checks for equality
|.    NB. Reverses the string
Blöcke
quelle