Kürzester Code, um festzustellen, ob eine Zeichenfolge ein Palindrom ist

42

Ein Palindrom ist eine Zeichenfolge, die vorwärts und rückwärts gleich geschrieben wird. Zum Beispiel: "Eva, kann ich Fledermäuse in eine Höhle stechen?" ist ein Palindrom (EVACANISTAB | BATSINACAVE)

Bestimmen Sie für diesen Code Golf in der Sprache Ihrer Wahl, ob eine bestimmte Zeichenfolge ein Palindrom ist oder nicht.

Edge Cases:

  • Interpunktion wird nicht zur Palindromie gezählt.
  • Steuerzeichen werden nicht zur Palindromie gezählt.
  • Leerzeichen werden nicht zur Palindromie gezählt.
  • Zahlen werden zur Palindromie gezählt.
  • Der Fall in dieser Herausforderung wird nicht auf die Palindromie angerechnet.
  • Die Länge der auszuwertenden Zeichenfolgen ist unbegrenzt, es sei denn, die Sprache Ihrer Wahl schreibt dies vor.
  • Beschränken Sie sich für diese Herausforderung auf den ASCII-Zeichensatz.

Technische Voraussetzungen:

  • Es werden nur Methodenkörper benötigt. Zusätzliche Dinge wie Methodensignaturen, Datenstrukturdeklarationen usw. zählen nicht zur Siegbedingung.
  • Code muss ohne Fehler oder Ausnahmen zur Kompilierungszeit kompiliert oder interpretiert werden.
  • Code darf keine unbehandelten Ausnahmen oder Abstürze auslösen. (Fast unnötig zu sagen. Fast.)
  • Der Code muss einen Wert zurückgeben, der auf Palindromie hinweist. Der Datentyp hängt von der Sprache ab, die Sie verwenden (z. B. könnte ein C # -Benutzer a verwenden bool, während ein JavaScript-Benutzer a verwenden könnte var.)
  • Möglicherweise schreiben Sie keinen eigenen Dolmetscher, der diese Aufgabe als "native" Fähigkeit ausführt, sodass Sie eine fast gewinnbringende Punktzahl "golfen" können. (Hoffentlich unnötig zu sagen.)

Siegbedingung:

  • Der kürzeste Code in Zeichen gewinnt.

Aktueller Anführer: tmartin (k, 25 Zeichen)

... Möchten Sie das magische grüne Häkchen bei Ihrer Antwort sehen? Schlage die Antwort dieses Typen!

Andrew Gray
quelle
1
Ist I / O ein Teil der Herausforderung, oder wird es ein Funktionskörper tun?
John Dvorak
1
Die "Breadcrumbs" zur Veranschaulichung der Verfeinerung der Arbeit sind in allen Antworten über den Revisionsverlauf standortweit verfügbar. In der aktuellen Version der Antwort muss kein vollständiger Verlauf sichtbar sein.
Peter Taylor
1
@WernerCD Ich bin sicher, dass das OP ändern wird, wer das grüne Häkchen bekommt, wenn er zurückkommt, um die neuen Antworten zu überprüfen.
Gareth
2
Wenn ich keine Sprache spezifiziere, ist diese Herausforderung für mich trivial. Wie weiter unten zu sehen ist, erzielen interpretierte Sprachen mit Schwerpunkt auf Textmanipulationsfunktionen höherer Ordnung immer die kürzesten Ergebnisse. Was soll mich davon abhalten, meinen eigenen Interpreter mit einer einzigen Funktion, ip (), zusammen zu werfen? Mein Wettkampfalgorithmus ist jetzt 'ip: i'. 4 Zeichen. getan.
Gusdor
3
@ Gusdor siehe J und GolfScript saugen den ganzen Spaß aus Code Golf und Language Handicap und verwandten Fragen auf der Meta dieser Website.
AakashM

Antworten:

29

K 25

{x~|x:_x@&x in,/.Q`a`A`n}

.

k){x~|x:_x@&x in,/.Q`a`A`n}"Eva, can I stab bats in a cave?"
1b
tmartin
quelle
Sieht aus wie eine Mischung aus Q und k: P
skeevey
Nun, ich würde nicht genau .QA etc q anrufen. Sie sind nur String-Wrapper, unter ihnen befindet sich kein echter K-Code. Wenn ich jetzt .q.inter sage, stecke ich in Schwierigkeiten.
tmartin
Ich denke, es ist ein Streit über die Semantik, aber sie sind in qk
skeevey,
Könnte nur Q für 31 sagen:{x~(|)x:(_)x inter(,/).Q`a`A`n}
tmartin
Ich weiß, das ist sehr alt, aber ... Sie können 1 Byte mit speichern {#|:\_x@&x in,/.Q`a`A`n}, wobei 1 wahr und 2 falsch ist
Scrawl
24

Perl, 26 char

s/_|\W//g;uc eq reverse uc

Wird zu 1 ausgewertet, wenn $_es sich um ein Palindrom handelt ""(einer der falschen Werte von Perl), wenn dies nicht der Fall ist.

Beispielnutzung:

sub palin {
    s/_|\W//g;uc eq reverse uc
}
while (<DATA>) {
    chomp;
    print "$_ => ",palin()?"yes":"no","\n";
}
__DATA__
Eva, can I stab bats in a cave?
A man, a plan, a canal. Panama!
Madam, I'm Adam Corolla.
757
Boeing 757
A man, a plan, a big shovel, a canal. Panama!
A man, a plan, a canoe, pasta, heros, rajahs, a coloratura, maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag, a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash, a jar, sore hats, a peon, a canal >> __Panama__

Ausgabe:

Eva, can I stab bats in a cave? => yes
A man, a plan, a canal. Panama! => yes
Madam, I'm Adam Corolla. => no
757 => yes
Boeing 757 => no
A man, a plan, a big shovel, a canal. Panama! => no
A man, a plan, a canoe, pasta, heros, rajahs, a coloratura, maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag, a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash, a jar, sore hats, a peon, a canal >> __Panama__ => yes
Mob
quelle
Verdammt, du hast mich geschlagen. Obwohl dies nicht richtig funktioniert, wenn es eine _in der Zeichenfolge gibt, nicht wahr? Und es sind keine Eingaben erforderlich. Müssen Sie die -pOption nicht verwenden?
Gareth
\WIn regulären Ausdrücken wird der Unterstrich ausgeschlossen. Ich fürchte, Sie werden [^a-z\d]in Ihrer Regex brauchen . Ich fürchte, ich bin sowieso geschlagen.
John Dvorak
3
Speichern Sie eine mit _|\Wanstelle von [_\W].
Howard
1
Sie können verkürzen _|\Wauf \Pl: ideone.com/0ufdaQ . Sollte nur die Unicode-Buchstaben sein.
Kobi
Wenn Sie noch einmal darüber nachdenken, \Plstimmen die Ziffern nicht überein. Ich denke, _|\Wdas Beste, was Sie tun können.
Kobi
18

Nur C # 82 :)

var x=s.ToLower().Where(char.IsLetterOrDigit);return x.SequenceEqual(x.Reverse());

Ich konnte der Versuchung nicht widerstehen, ein Programm ohne Boilerplate in meiner Lieblingssprache zu schreiben.

Ein Test ist hier verfügbar: http://ideone.com/8bwz7z

Cristian Lupascu
quelle
Einfach ... aber elegant!
Andrew Gray
@ AndrewGray Vielen Dank für den Kommentar und für die zulässigen technischen Anforderungen. C # Boilerplate erhöht die Zeichenanzahl erheblich, was es für das Golfen ansonsten unpraktisch macht.
Cristian Lupascu
2
Kein Problem. Ich bin ein C # -Entwicklungskollege und schreibe gerne prägnanten, effizienten Code. Es ist eine Schande, dass die Sprache so viel Aufsehen erregt ...
Andrew Gray
13

GolfScript, 36 34 31 30 Zeichen

{0"0:A[a{"@{>^}+/},{32|}%.-1%=

Ähnlicher Algorithmus zu meiner vorherigen (Javascript) Lösung .

0"0:A[a{"@{>^}+/- Optimiert von Peter Taylor und Howard. Meine Version war "/9@Z"{1$<},,2%\;. Howard spendete Verkettung von Funktionen und Peter Taylor spendete XOR für Modulo-2. Dies ist im Grunde eine generische Methode zum Vergleichen, wenn sich der Wert in einer Folge von Bereichen befindet.

{.96>32*-}%(11 Zeichen) ist keine wirkliche Verbesserung gegenüber Javascript .toUpperCase()(14 Zeichen), zumal es einige seltsame Satzzeichen zin der ASCII-Tabelle (die hier keine Rolle spielen) verstümmelt.

Wenn wir jedoch zuerst die alphanumerischen Zeichen herausfiltern, können wir, wie von Peter Taylor vorgeschlagen, in Kleinbuchstaben und Ziffern konvertieren, indem wir in jedem Zeichen ein Bit setzen: {32|}

.-1%=macht das ganze palindromische schwere Heben. Ein Teil, den ich nicht besonders mag, ist, wie lange ich gebraucht habe, um herauszufinden, wie ich ein Array umkehren kann. Ich hätte die Dokumentation lesen sollen. Die anderen beiden Zeichen führen die Stapelverwaltung und den Vergleich durch.

Test: http://golfscript.apphb.com/?c=IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEgY2F2ZT8iCgp7IjA6QVtheyJcez59KywsMiV9LHszMnx9JS4tMSU9


Wenn ich davon ausgehen kann, dass keines der folgenden Steuerzeichen vorhanden ist: (Escape-Datenverbindung, Gerätesteuerung 1-4, negative Bestätigung, synchroner Leerlauf, Ende des Übertragungsblocks, Abbrechen, Ende des Mediums) (wir sind uns alle einig, dass dies der Fall ist alle ziemlich dunkel) oder wenn ich sie als Großbuchstaben der Ziffern 0-9 behandeln kann, können wir zwei weitere Zeichen speichern:

GolfScript, 28 Zeichen

{32|}%{0"0:a{"@{>^}+/},.-1%=

Test: http://golfscript.apphb.com/?c=IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEgY2F2ZT8iCgp7MzJ8fSV7MCIwOmF7IkB7Pl59Ky99LC4tMSU9

John Dvorak
quelle
2
Sie können die Bereinigung loswerden und zwei Zeichen speichern:{"0:A["\{>}+,,2%},
Howard
@ Howard Danke. Ich glaube, ich habe +auf Blöcken falsch verstanden . Das ist ein cooler Trick.
John Dvorak
1
Sie können drei Zeichen sparen, indem Sie den Filter und die Standardisierung der Groß- und Kleinschreibung umkehren. Sie müssen zur Zeichenliste a{des Filters hinzufügen , um die Kleinbuchstaben einzuschließen, aber Sie können dann mit nur in Großbuchstaben schreiben {32|}%. Das Endergebnis ist{"0:A[a{"\{>}+,,2%},{32|}%.-1%=
Peter Taylor
Dort kann auch noch eine Einsparung am Filter vorgenommen werden. Modulo 2 zu zählen ist xoder, genau 0"0:A[a{"@{>^}+/wie der Job.
Peter Taylor
@PeterTaylor Wenn ich mir nicht bald eine andere Optimierung einfallen lasse, sollte ich wahrscheinlich auf Community-Wiki umsteigen. Nochmals vielen Dank :-)
John Dvorak
8

Javascript, 53 Zeichen:

(x=x.toLowerCase().match(/[a-z\d]/g))+""==x.reverse()

ist ein Javascript-Ausdruck, der als wahr ausgewertet wird, wenn xes sich um ein Palindrom handelt, und als falsch, wenn dies nicht der Fall ist. Es wird davon ausgegangen, dass xes sich um eine Zeichenfolge handelt. Wenn dies nicht garantiert ist, müssen Sie voranstellenx+="",

Hier ist ein Breadcrumb: Aufgrund der Funktionsweise reverse(),

(x=x.toLowerCase().match(/[a-z\d]/g))==""+x.reverse()

scheitert. Jedoch,

""+(x=x.toLowerCase().match(/[a-z\d]/g))==x.reverse()

ist vollkommen in Ordnung.

John Dvorak
quelle
Netter Leckerbissen beim Verketten eines Null-Strings! Punkte für gute Infos!
Andrew Gray
3
Hinweise: +""Wirft in einen String, +wirft in eine Zahl |0und ~~wirft in eine Ganzzahl, !!wirft in einen Booleschen Wert.
John Dvorak
Ist ein Zeichen kürzer mit Regex/[^\W_]/g
SuperPrograman
7

R: 66

w=grep("[a-z0-9]",strsplit(tolower(s),"")[[1]],v=T);all(w==rev(w))

Verwendungszweck:

f=function(s){w=grep("[a-z0-9]",strsplit(tolower(s),"")[[1]],v=T);all(w==rev(w))}

f("Eva, can I stab bats in a cave?")
[1] TRUE
Plannapus
quelle
7

Bash: 52 48 46 Zeichen

s=${1,,};s=${s//[^a-z0-9]};[ $s = `rev<<<$s` ]

Dies nimmt die Stichprobe als ersten Parameter und setzt den Exit-Code auf 0 für Palindrome und 1 für nicht.

Probelauf:

bash-4.2$ p() { s=${1,,};s=${s//[^a-z0-9]};[ $s = `rev<<<$s` ]; }

bash-4.2$ p 'Eva, can I stab bats in a cave?'; echo $?
0

bash-4.2$ p 'A man, a plan, a canal. Panama!'; echo $?
0

bash-4.2$ p "Madam, I'm Adam Corolla."; echo $?
1

bash-4.2$ p '757'; echo $?
0

bash-4.2$ p 'Boeing 757'; echo $?
1

bash-4.2$ p 'A man, a plan, a shovel, a canal. Panama!'; echo $?
1

bash-4.2$ p 'A_man,_a_plan, a_caremer, a canal:_Panama!'; echo $?
0
Mann bei der Arbeit
quelle
7

Python 2: 49 (ohne die Methodensignatur zu zählen)

def f(s):
 s=filter(str.isalnum,s.upper())
 return s==s[::-1]

Ein komplettes Programm mit Ein- und Ausgabe kann in 74 Zeichen geschrieben werden.

import sys
s=filter(str.isalnum,sys.stdin.read().upper())
print s==s[::-1]

Anwendungsbeispiel:

$echo 'Eva,can I stab bats in a cave?' | python palindrome.py
True 
$ cat huge_palindrome.txt | python palindrome.py
True
$echo 'Able was I ere i SaW elBa' | python palindrome.py                                                                   
True                                         

( huge_palindrome.txtenthält dieses 17.826 Wort Palindrom)

Diese Lösung kann an Python 3 angepasst werden und einige Zeichen hinzufügen:

Python 3: 55

def f(s):
 s=list(filter(str.isalnum,s.upper()))
 return s==s[::-1]
Bakuriu
quelle
sys.stdin.readist im Grunde das gleiche wieraw_input
CalculatorFeline
In Python 3.8 können Sie dies auf 58 Bytes
MilkyWay90
Außerdem umfasst Ihre Python 2- und 3-Lösung 61 Bytes bzw. 67 Bytes.
MilkyWay90
@ MilkyWay90 Du hast das wohl verpasst, ohne die Methodensignatur zu zählen . Im Jahr 2013 war es üblich, sie nicht einzubeziehen. Bei einer anderen Lösung dieser Frage in anderen Sprachen wurde sie einfach weggelassen und angenommen, dass Sie die Eingabe in einer sVariablen haben. Ich habe mich für die vollständige Definition entschieden, aber, wie im Jahr 2013 üblich, die Methodensignatur nicht in die Länge aufgenommen
Bakuriu
@ Bakuriu Ah, ich verstehe. Ich bin erst seit ein paar Monaten hier, daher kenne ich die Bräuche seit 2013 nicht mehr
MilkyWay90
7

JAVA (oder die ausführlichste Sprache aller Zeiten), 102 96 95 Zeichen

s=s.replaceAll("\\W|_","");return s.equalsIgnoreCase(new StringBuffer(s).reverse().toString());

Verwendung (mit ungolfed Code):

static boolean q(String s) {
    s=s.replaceAll("\\W|_","");
    return s.equalsIgnoreCase(new StringBuffer(s).reverse().toString());
}

public static void main(String[] args) {
    System.out.println(q("'A man, a plan, a canal - Panama!'"));
}

Mit Hilfe des Kommentators unten gekürzt

jsedano
quelle
1
Ich kenne Java zwar nicht (ich bin ein C # -Typ, witzig genug), aber könntest du nicht 1 Charakter retten, indem du die geschweiften Klammern am if entfernst? EG if(s==null) return 1==0;:? Oder erzwingt Java Curlies auf ifAnweisungen?
Andrew Gray
3
Sie haben vollkommen recht, das habe ich rausgenommen, danke !! ... Ich habe nicht bemerkt, dass sie da waren, ich schätze, ich bin ein Java-Entwickler, der nicht C #?
Jsedano
4
1) Überprüfen, ob der Parameter nulleine gute Gewohnheit ist, aber nicht in CodeGolf geübt. Wie ich sehen kann, hat es in dieser Frage niemand anders getan. Überspring es. 2) Der Abstand zwischen den Argumenten erleichtert die Lesbarkeit, nicht jedoch das Golfen. Entfernen Sie es; 3) Anstelle von explizit wird toLowerCase()der String equalsIgnoreCase()später anstelle von verwendet equals(). Auf diese Weise müssen Sie den regulären Ausdruck anpassen, aber immer noch 1 Zeichen kürzer. pastebin.com/s7H84faj
Manatwork
1
replaceAll("[^A-Za-z0-9]","")=>replaceAll("\\W","")
Assylias
Eigentlich: auch replaceAll("\\W|_","");zu entfernen _=> 95 Zeichen
Assylias
7

Mathematica 54 53

Ein Byte gespart dank CatsAreFluffy:

PalindromeQ@StringCases[ToUpperCase@#,WordCharacter]&

Für diejenigen mit Version 10.2 oder früher:

#==Reverse@#&@StringCases[ToUpperCase@#,WordCharacter]&

Beispiel

PalindromeQ@StringCases[ToUpperCase@#, WordCharacter]&["Eva,can I stab bats in a cave?"]

Wahr

DavidC
quelle
PalindromeQist 1 Byte kürzer als#==Reverse@#&
CalculatorFeline
Ich fragte mich, warum ich es nie gesehen hatte. Version 10.3!
DavidC
PalindromeQ= #==Reverse@#&
CalculatorFeline
Ja, ich habe Version 10.4 heruntergeladen, um es auszuprobieren.
DavidC
Das ist raus? OHNO
CalculatorFeline
6

J 30 Zeichen

*/(=|.)tolower(#~'[^_\W]'rxE])

Verwendungszweck:

   */(=|.)tolower(#~'[^_\W]'rxE])'A man, a plan, a canal - Panama!'
1
   */(=|.)tolower(#~'[^_\W]'rxE])'Doc, note: I dissent. A fast never prevents a fatness. I diet on cod'
1
Gareth
quelle
6

k ( 50 48 45 38 Zeichen)

Unterdrückt alle Fehler und gibt den Standardwert 0b(false) zurück.

{X~|X@:&(X:_:x)in 10h$(48+!10),97+!26}

Beispiel:

k){X~|X@:&(X:_:x)in 10h$(48+!10),97+!26} "Eva, can I stab bats in a cave?"
1b

bearbeiten: drei weitere Zeichen durch Vermeiden von Zwischenvariablen rasiert. H / T, CS. -7: Keine Notwendigkeit, Fehler zu unterdrücken.

Skeevey
quelle
1
Interessanterweise ist mein Code mit nur 3 Zeichen besser lesbar :-)
John Dvorak
Ein extra Char ist reingeschlüpft, ich habe es entfernt.
Skeevey
5

Ruby: 43 38 Zeichen

s=s.upcase.tr'^A-Z0-9','';s==s.reverse

Probelauf:

irb(main):001:0> p=->s{s=s.upcase.tr'^A-Z0-9','';s==s.reverse}
=> #<Proc:0x854592c@(irb):1 (lambda)>

irb(main):002:0> p['Eva, can I stab bats in a cave?']
=> true

irb(main):003:0> p['A man, a plan, a canal. Panama!']
=> true

irb(main):004:0> p["Madam, I'm Adam Corolla."]
=> false

irb(main):005:0> p['757']
=> true

irb(main):006:0> p['Boeing 757']
=> false

irb(main):007:0> p['A man, a plan, a shovel, a canal. Panama!']
=> false

irb(main):009:0> p['A_man,_a_plan, a_caremer, a canal:_Panama!']
=> true
Mann bei der Arbeit
quelle
1
Sie können sogar schreibens.tr!('^A-Za-z0-9','').upcase!.reverse==s
Howard
Mann, wie lange habe ich mich um den Einsatz der !Methoden gekümmert! Sie halten mich @Howard mit Ihren Tricks erstaunlich.
Manatwork
Kleines Problem, @Howard. trund tr!scheint anders zu verhalten , wenn sie nichts zu transkribieren haben: pastebin.com/4YThW2qN , dass die machen p['757']Test mit „NoMethodError zum Absturz zu bringen: nicht definierte Methode` upcase‘ für nil: NilClass ”Fehler.
Manatwork
Ups, tut mir Leid. Ich habe nicht über diesen Fall nachgedacht.
Howard
1
kann weiter gekürzt werden:s=s.upcase.tr('^A-Z0-9','');s==s.reverse
Cristian Lupascu
5

C ++, 107 (falsch gezählt), 100 (falsch gezählt), 81

string s;for(int c:t)if(isalnum(c))s+=c|32;return s==string(s.rbegin(),s.rend());
  • Nutzt ASCII-Bitmuster.
  • Verlässt sich auf ein Übel using namespace std;.
  • Verwendet bitweises UND und ODER anstelle der logischen Operatoren.
  • Wird verwendet, intweil es kürzer als charoder ist auto.

    #include <string>
    using namespace std;
    
    bool IsPalindrome(const string & t) {
    string s;for(int c:t)if(isalnum(c))s+=c|32;return s==string(s.rbegin(),s.rend());
    }
    
    #include <cassert>
    
    int main() {
        assert(!IsPalindrome("gorilla"));  // simple failure
        assert( IsPalindrome("racecar"));  // simple success
        assert( IsPalindrome("Hannah"));   // case blind
        assert(!IsPalindrome("1999"));     // digit failure
        assert( IsPalindrome("2002"));     // digit success
        // Ignore spacing, punctuation, and case:
        assert( IsPalindrome(" \t09AZ/:@[`{za90"));  // boundaries
        assert( IsPalindrome("A man, a plan, a canal: Panama."));
        assert( IsPalindrome("Eva, can I stab bats in a cave?"));
        assert( IsPalindrome(""));  // empty string
        return 0;
    }
    
Adrian McCarthy
quelle
4

Lua, 56

a=io.read"*l":lower():gsub("%W","")print(a:reverse()==a)
mniip
quelle
Wenn %Wes sich um etwas \Win Regex handelt, werden auch Zeichen wie Unterstriche ausgeschlossen. Das ist unerwünscht.
John Dvorak
Ich überprüfte, %wnicht enthalten _( %Woffensichtlich enthält es dann)
Mniip
1
Es wird nur der Funktionskörper benötigt. s=s:lower():gsub('%W','')return s:reverse()==s 46 Zeichen
Egor Skriptunoff
aber was ist mitfunction(s)
Mniip
4

Python 3/2 59 Zeichen:

def pld(i):
   p=[c for c in i.lower() if c.isalnum()]
   return(p == p[::-1])
Amith KK
quelle
4

Haskell, 43

Mit den Standard - Bibliotheken Control.Monad, Control.Monad.Instancesund Data.Char:

ap(==)reverse.map toLower.filter isAlphaNum
Jon Purdy
quelle
Ich kann das nicht in Ghci zum Laufen bringen. import Data.Char import Control.Monad ap(==)reverse.map toLower.filter isAlphaNumWeder tut es mit dem Hinzufügen von Leerzeichen oder dergleichen, tut mir leid, ich bin nicht so begeistert von Haskell :)
SlimJim
1
@SlimJim: Hoppla, das brauchst du Control.Monad.Instancesauch. (Ich verwende die Reader-Monad-Instanz mit ap, aber diese Instanz wird nicht von exportiert Control.Monad.)
Jon Purdy
4

PHP 60 Zeichen.

Versuchen Sie zuerst Codegolf.

//thank you manatwork
echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x); 

Beispiel:

$c='Eva, can I stab bats in a cave?';
echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);
//prints 1
Carlos Goce
quelle
Die Klammer um den ersten Operanden des ternären Operators wird nicht benötigt. Tatsächlich wird weder der ternäre Operator benötigt - nur wahr oder falsch in der Darstellung Ihrer Sprache ausgeben. Und durch die gesonderte Erklärung für die Zuordnung zu $ x 1 mehr Charakter zu vermeiden , kann verkürzt werden echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);.
Handarbeit
3

Python 2 64-Zeichen:

i =''.join(re.findall('[a-z0-9]+',i.lower()))
return i==i[::-1]
abhiram
quelle
@manatwork Wenn Sie alle Bezeichner durch Ein-Zeichen-Bezeichner ersetzen, erhalten Sie eine 77Zeichenversion. Keine Ahnung, warum abhiram die ungolfed version gepostet hat.
Bakuriu
@ Bakuriu, egal, ich habe eine Aussage in der Frage verpasst: "Nur Methodenkörper werden benötigt". Obwohl mir die Zeilen 2 und 3 nur 73 Zeichen geben. In Bezug auf die weitere Längenreduzierung sind keine Rohzeichenfolge und die Erfassungsgruppe erforderlich, wodurch die re.findall('[a-z0-9]+',input.lower())Zeichen von Teil 3 kürzer werden.
Manatwork
@manatwork, ich habe den Beitrag bearbeitet und die Variablen ein wenig geändert. Das hat den Wert auf 66 gesenkt. Ja, das Attribut raw string ist hier nicht von Nutzen.
Abhiram
Ok, aber warum bestehen Sie darauf, dass die Gruppe im regulären Ausdruck erfasst wird? Funktioniert einwandfrei ohne: pastebin.com/JzpNRRZU
Manatwork
Ich denke, es hat mich nach meinem jüngsten Python-Projekt mit re's erwischt :) Vielen Dank, dass Sie darauf hingewiesen haben.
Abhiram
3

Haskell 48

(\x->x==reverse x).map toLower.filter isAlphaNum

wie folgt verwendet:

(\x->x==reverse x).map toLower.filter isAlphaNum$"Eva, can I stab bats in a cave?"
Dünner Jim
quelle
3

Smalltalk , Squeak / Pharo-Geschmack
116 Zeichen mit traditioneller Formatierung mit Tabulatoren

Sie fügen String zwei Methoden hinzu:

selffles
    ^self = self reverse
isPalindrome
    ^(self asUppercase asDecomposedUnicode select: #isAlphaNumeric) selffles

Wir könnten natürlich einige Leerzeichen entfernen oder kürzere Methodennamen verwenden, aber wir sollten den Geist von Smalltalk nicht verraten.

Darüber hinaus werden hiermit französische Palindrome behandelt, wie dies in http://fr.wikipedia.org/wiki/Liste_de_palindromes_fran%C3%A7ais der Fall ist , und es können nicht viele Antworten auf dieser Seite gefunden werden.

['Léon a trop par rapport à Noël' isPalindrome] assert.
aka.nice
quelle
Clevere und nützliche Antwort!
Andrew Gray
3

Python 3 (51 Zeichen)

und kann Python 2 sein

basierend auf Abhiram- Lösung (mit aggressiverem Golfen)

from re import findall

def palindrome(i):
 i=findall('[a-z\d]',i.lower())
 return i==i[::-1]

print(palindrome(input('Phrase: ')))

kann mit RE '\ w' auf 46 Zeichen gekürzt werden

und Variante mit extrem verkürztem Funktionskörper (27 Zeichen)

import re
l=str.lower
f=re.compile('[a-z\d]').findall

def palindrome(i):i=f(l(i));return i==i[::-1]

print(palindrome(input('Phrase: ')))
AMK
quelle
2

Windows PowerShell, 56 47 45 Zeichen

Aktualisiert (siehe Kommentare) und kann die Klammern um den regulären Ausdruck entfernen:

($s=$s-replace'\W')-eq(-join$s[$s.length..0])

Original (56)

$s=$s-replace'[^\w]','';$s-eq($s[-1..-$s.length]-join'')

Original ohne Golf:

$s = "Eva, can I stab bats in a cave?"
$s = $s -replace '[^\w]', ''
$rev = $s[-1..-$s.length] -join ''
$s -eq $rev
goric
quelle
Sie können dies bis zu 47 Zeichen wie ($s=$s-replace'[\W]')-eq(-join$s[$s.length..0])
Rechtschreibung
@SpellingD: Schön! Ich bin neu im Code-Golfen, danke für die Verbesserung
goric
Sie können die rechte Klammer entfernen auch: ($s=$s-replace'\W')-eq-join$s[$s.length..0].
mazzy
2

C ++, 74 Bytes

Dieser Code ist eigentlich sehr elegant und leicht zu verstehen (wenn er richtig formatiert ist). Ich glaube nicht, dass es möglich ist, in C ++ kürzer zu werden, und es werden keine Standardbibliotheksfunktionen verwendet.

p(auto c){auto e=c;while(*e)++e;--e;while(*e==*c&e>c)--e,++c;return e<=c;}

Anwendungsbeispiel:

p("Hello"); //Outputs 0
p(""); //Outputs 1
p("a"); //Outputs 1
p("HellolleH"); //Outputs 1

Schön formatierte Version:

p(auto c)
{
    auto e=c;
    while(*e) ++e;
    --e;
    while(*e==*c & e>c)--e,++c;
    return e<=c;
}
J. Antonio Perez
quelle
1
error: ISO C++ forbids declaration of ‘p’ with no typeIhre Funktion sollte einen Rückgabetyp haben.
Karl Napf
Ich wette, dies ignoriert Groß- und Kleinschreibung, Leerzeichen und Steuerzeichen nicht.
Titus
Sie können ein Zeichen mit while(*++e);anstelle von speichern while(*e)++e;. Aber wie Titus sagte, ist diese Antwort ungültig.
Nick Matteo
2

PHP, 26 84 80 78 62 63 Bytes

<?=strrev($s=strtolower(preg_replace("#\W#","",$argv[1])))==$s;

Nimmt Eingaben vom ersten Befehlszeilenargument entgegen; druckt 1für wahrheitsgemäße, leere Zeichenfolge für falsch.


I18n ist ein wenig expansiv, da es keine Multibyte-Alternative für strrev(110 Bytes; laufe mit -r) gibt:

preg_match_all("#.#us",$s=strtolower(preg_replace("#\W#u","",$argv[1])),$m);echo$s==join(array_reverse($m[0]);

utf8_strrev krass aus dem PHP-Handbuch gestohlen . Vielleicht möchten Sie auch einen Blick auf diesen Blogeintrag werfen .

Titus
quelle
Komm schon Titus ... Das entspricht nicht der Spezifikation.
Christoph
1
@Christoph Ja, ich sollte das manchmal vollständig lesen. Fest.
Titus
Hm -Rwürde Probleme mit Zeilenumbrüchen in der Zeichenkette verursachen, oder? Aus der Spezifikation "-R <code> Führe PHP <code> für jede Eingabezeile aus". Darüber hinaus <?=strrev($s=strtolower(preg_replace("#\W#","",$argn)))==$s;wäre kürzer.
Christoph
1
@Christoph Schöne Idee, aber $argnohne geht es nicht -R.
Titus
$argv[1]="O Genie, der Herr ehre dein Ego!"; # :D
Titus
1

Rubin, 48

p((g=gets.upcase.gsub /[^A-Z\d]/,'')==g.reverse)

Ganz einfach und hastig gemacht, also nicht zu viel golfen. Ich werde später mehr Golf spielen.

Türknauf
quelle
1

Pylongolf2 , 24 Bytes

c╨2"[^a-zA-Z]"-_╨1=~

cNimmt die Eingabe, ╨2um in Kleinbuchstaben umzuwandeln.
Ich drücke dann einen regulären Ausdruck auf den Stapel und -entferne damit alle nicht alphabetischen Zeichen in der Eingabe.
_dupliziert die Eingabe.
╨1kehrt es um und =vergleicht sie dann.
~druckt den Stapel am Ende, der entweder trueoder druckt false.


quelle
Ignoriert dies die Interpunktion, Leerzeichen und Steuerzeichen?
MickyT
Mein schlechtes tut diese Version nicht. Ich werde es reparieren.
Problem behoben.
1

PowerShell, 194 190 Bytes

Eine rekursive Implementierung, um zu zeigen, wie sich ein unbenannter PowerShell-Skriptblock selbst aufrufen kann.

$P={param([string]$s)$s=($s-replace'[^a-z]').tolower();if(!$s){return $true};if($s.length-lt4){return $s[0]-eq$s[-1]};$s[0]-eq$s[-1]-and(&$MyInvocation.MyCommand.ScriptBlock $s.trim($s[0]))}

ungolfed:

$P={
param([string]$s)
$s=($s-replace'[^a-z]').tolower();
if(!$s){return $true};
if($s.length-lt4){return $s[0]-eq$s[-1]};
$s[0]-eq$s[-1]-and(&$MyInvocation.MyCommand.ScriptBlock $s.trim($s[0]))
}

Tests:

&$P "Eva, can I stab bats in a cave?"
&$P "Eva, can I stab cats in a cave?"
&$P "A man, a plan, a canal. Panama!"
&$P "A man, a plan, a big shovel, a canal. Panama!"
&$P "Madam, I'm Adam."
&$P "Madam, I'm Adam Corolla."
&$P "757"
&$P "Boeing 757"
Bevo
quelle
Sollte das nicht sein [^a-z0-9]?
Titus
1

05AB1E , 4 Bytes (nicht konkurrierend)

Nicht konkurrierend , da die Sprache die Herausforderung datiert. Code:

álÂQ

Erläuterung:

á     # Only keep the alphabetic characters.
 l    # Lowercase the characters.
  Â   # Bifurcate, which duplicates the letters and reverses the duplicate.
   Q  # Check if they are equal.

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

Adnan
quelle
Versucht, es über Ihren Link auszuführen. Die Programmausgabe ist "1"
Christopher Perry
1

Jelly, 10 Charaktere (nicht konkurrierend)

fØBŒl
UÇ⁼Ç

Gibt 1 zurück, wenn wahr, 0, wenn falsch

Probieren Sie es online!

X88B88
quelle
Ignoriert es Groß- und Kleinschreibung, Leerzeichen und Steuerzeichen? Eine Panne wäre schön.
Titus
Der aktuelle Stand der Jelly ermöglicht dies in 7 Bytes für die Lösung von : fØBŒlŒḂ: fFilter zu halten , ØBder Menge [a-zA-Z0-9] und ŒlUmrechnen in Kleinbuchstaben, dann ŒḂtesten , ob Palindrom.
Steenbergh