Codice più breve per determinare se una stringa è un palindromo


42

Un palindromo è una stringa che viene scritta allo stesso modo sia avanti che indietro. Ad esempio, "Eva, posso pugnalare i pipistrelli in una grotta?" è un palindromo (EVACANISTAB | BATSINACAVE)

Per questo codice golf, usando la lingua che preferisci, determina se una determinata stringa è o meno un palindromo.

Custodie per bordi:

  • La punteggiatura non viene conteggiata per la pallidezza.
  • I personaggi di controllo non vengono conteggiati per la pallidezza.
  • Lo spazio bianco non viene conteggiato per la pallidezza.
  • I numeri vengono conteggiati verso la pallidezza.
  • Il caso in questa sfida non è conteggiato per la pallidezza.
  • Non c'è limite alla lunghezza delle stringhe da valutare, ad eccezione di ciò che è imposto dalla tua lingua preferita.
  • Per questa sfida, limitati al set di caratteri ASCII.

Requisiti tecnici:

  • Sono necessari solo gli organismi metodo; cose aggiuntive come le firme dei metodi, le dichiarazioni sulla struttura dei dati, ecc. non contano ai fini del requisito di vittoria.
  • Il codice deve essere compilato o interpretato senza errori o eccezioni durante la compilazione.
  • Il codice non deve generare eccezioni o crash non gestiti. (Quasi inutile dirlo. Quasi.)
  • Il codice deve restituire un valore che indica la pallidezza. Il tipo di dati dipende dalla lingua utilizzata (ad es. Un utente C # potrebbe utilizzare a bool, mentre un utente JavaScript potrebbe utilizzare a var.)
  • Non è possibile scrivere il proprio interprete che esegue questa attività come una capacità "nativa" in modo da poter "giocare a golf" un punteggio quasi vincente. (Spero inutile dirlo.)

Condizioni di vittoria:

  • Vince il codice più breve in caratteri.

Leader attuale: tmartin (k, 25 caratteri)

... Vuoi il segno di spunta verde magico dalla tua risposta? Batti la risposta di questo ragazzo!


1
L'I / O fa parte della sfida o un corpo funzione lo farà?
John Dvorak,

1
Il "pangrattato" per mostrare come il lavoro viene perfezionato sono disponibili in tutto il sito in tutte le risposte tramite la cronologia delle revisioni. Non è necessario avere una cronologia completa visibile nella versione corrente della risposta.
Peter Taylor,

1
@WernerCD Sono sicuro che l'OP cambierà chi ottiene il segno di spunta verde quando torna per controllare le nuove risposte.
Gareth,

2
Non specificare una lingua banalizza davvero questa sfida per me. Come visto di seguito, le lingue interpretate con particolare attenzione alle funzioni di manipolazione del testo di alto ordine ottengono sempre i risultati più brevi. Cosa mi impedisce di mettere insieme il mio interprete con un'unica funzione, ip (). Il mio algoritmo di concorrenza è ora "ip: i". 4 caratteri. fatto.
Gusdor,

3
@Gusdor vede J e GolfScript succhiare tutto il divertimento con Code Golf e Language Handicap e le domande correlate sul meta di questo sito.
AakashM,

Risposte:


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

Sembra una miscela di Q e k: P
skeevey

Bene, non chiamerei esattamente .QA ecc. Q. Sono solo wrapper di stringhe, non c'è un vero codice k sotto di loro. Ora, se avessi detto .q.inter sarei nei guai.
tmartin,

Immagino sia un caso di cavilli sulla semantica, ma sono definiti in qk
skeevey,

Potrei semplicemente dire Q per 31:{x~(|)x:(_)x inter(,/).Q`a`A`n}
tmartin

lo so che è molto vecchio ma ... puoi salvare 1 byte con {#|:\_x@&x in,/.Q`a`A`n}, dove 1 è vero e 2 è falso
scarabocchio

24

Perl, 26 caratteri

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

Valuta 1 quando $_è un palindromo ""(uno dei falsi valori di Perl) quando non lo è.

Esempio di utilizzo:

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__

produzione:

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

Accidenti, mi hai battuto. Anche se questo non funzionerà correttamente se _nella stringa è presente un? E non richiede alcun input, quindi non è necessario utilizzare l' -popzione?
Gareth,

\Win regexes esclude la sottolineatura. Temo che avrai bisogno [^a-z\d]della tua regex. Temo di essere battuto comunque.
John Dvorak,

3
Salvane uno con _|\Winvece di [_\W].
Howard,

1
Puoi abbreviare _|\Wa \Pl: ideone.com/0ufdaQ . Dovrebbero essere solo le lettere Unicode.
Kobi,

In realtà, ripensandoci - \Plnon corrisponderebbe alle cifre, quindi immagino _|\Wsia il meglio che potresti fare.
Kobi,

18

Solo C # 82 :)

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

Non ho potuto resistere alla tentazione di scrivere un programma senza caldaia nella mia lingua preferita.

Un test è disponibile qui: http://ideone.com/8bwz7z


Semplice ... ma elegante!
Andrew Gray,

@AndrewGray grazie per il commento e per i Requisiti tecnici permissivi. Il boilerplate C # si aggiunge seriamente al conteggio dei caratteri, rendendolo poco pratico per il golf altrimenti.
Cristian Lupascu,

2
Nessun problema. Sono un collega sviluppatore di C # e mi piace scrivere un codice conciso ed efficiente. È un peccato che ci sia così tanta lingua nella lingua ...
Andrew Gray,

13

GolfScript, 36 34 31 30 caratteri

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

Algoritmo simile alla mia precedente soluzione (Javascript) .

0"0:A[a{"@{>^}+/- Ottimizzato da Peter Taylor e Howard. La mia versione era "/9@Z"{1$<},,2%\;. Howard ha donato la concatenazione di funzioni e Peter Taylor ha donato XOR per modulo-2. È fondamentalmente un metodo generico per confrontare se il valore è in una sequenza di intervalli.

{.96>32*-}%(11 caratteri) non è davvero un miglioramento rispetto a Javascript .toUpperCase()(14 caratteri), soprattutto perché altera una strana punteggiatura che segue znella tabella ASCII (che non ha importanza qui).

come suggerito da Peter Taylor, tuttavia, se prima filtriamo gli alfanumerici, possiamo convertire in minuscole e cifre semplicemente impostando un bit in ciascun carattere: {32|}

.-1%=fa tutto il sollevamento palindromico pesante. Una parte di cui non sono molto affezionato è il tempo impiegato a scoprire come invertire un array. Avrei dovuto leggere i documenti. Gli altri due personaggi eseguono la gestione e il confronto dello stack.

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


Inoltre, se posso presumere che non sia presente nessuno dei seguenti caratteri di controllo: (Uscita collegamento dati, controllo dispositivo 1-4, riconoscimento negativo, inattività sincrono, fine blocco di trasmissione, annullamento, fine del mezzo) (siamo tutti d'accordo che questi sono tutti piuttosto oscuri) o se posso trattarli come versioni maiuscole delle cifre 0-9, possiamo salvare altri due caratteri:

GolfScript, 28 caratteri

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

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


2
Puoi sbarazzarti della pulizia e salvare due caratteri:{"0:A["\{>}+,,2%},
Howard

@ Grazie Grazie. Penso di aver frainteso i +blocchi. È un bel trucco.
John Dvorak,

1
È possibile salvare tre caratteri invertendo il filtro e la standardizzazione del case. Devi aggiungere a{all'elenco di caratteri del filtro per includere le lettere minuscole, ma puoi quindi scrivere in maiuscolo con solo {32|}%. Il risultato finale è{"0:A[a{"\{>}+,,2%},{32|}%.-1%=
Peter Taylor,

C'è anche un altro salvataggio da effettuare sul filtro. Il conteggio del modulo 2 è xor, così 0"0:A[a{"@{>^}+/come il lavoro.
Peter Taylor,

@PeterTaylor Se non avrò presto un'altra ottimizzazione, probabilmente dovrei convertirmi in wiki della comunità. Grazie ancora :-)
John Dvorak l'

8

Javascript, 53 caratteri:

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

è un'espressione javascript che restituisce true se x è un palindromo, falso se non lo è. Presuppone xè una stringa. Se ciò non è garantito, anteporrex+="",

Ecco un pangrattato: grazie a come reverse()funziona,

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

non riesce. Tuttavia,

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

va benissimo.


Bel bocconcino sul concatenare una stringa nulla! Punti per un buon infoz!
Andrew Grey,

3
Suggerimenti: +""lancia su una stringa, +lancia su un numero |0e ~~lancia su un numero intero, !!lancia su un valore booleano.
John Dvorak,

È un personaggio più corto con regex/[^\W_]/g
SuperPrograman il

7

R: 66

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

Uso:

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

7

Bash: 52 48 46 caratteri

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

Questo richiede la puntura per verificare come primo parametro e imposta il codice di uscita su 0 per palindromo e 1 per non.

Esecuzione di esempio:

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

7

Python 2: 49 (senza contare la firma del metodo)

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

Un programma completo, con input e output può essere scritto in 74 caratteri.

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

Esempio di utilizzo:

$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.txtcontiene questo parola 17.826 palindromo)

Questa soluzione può essere adattata a Python 3 aggiungendo alcuni caratteri:

Python 3: 55

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

sys.stdin.readè praticamente lo stesso diraw_input
CalculatorFeline

In Python 3.8 puoi accorciarlo a 58 byte
MilkyWay90

Inoltre, la soluzione Python 2 e 3 è rispettivamente di 61 byte e 67 byte.
MilkyWay90

@ MilkyWay90 Probabilmente ti sei perso senza contare la firma del metodo . Nel 2013 era consuetudine non includerlo. In un'altra soluzione in questa domanda in altre lingue, l'hanno semplicemente omesso e presumevano che tu avessi l'input in una svariabile. Ho deciso di fornire la definizione completa ma, come di consueto nel 2013, non includere la firma del metodo in lunghezza
Bakuriu

@Bakuriu Ah, capisco. Sono qui da pochi mesi, quindi non conosco le abitudini del 2013
MilkyWay90,

7

JAVA (o la lingua più dettagliata di sempre), 102 96 95 caratteri

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

Utilizzo (con codice non golfizzato):

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!'"));
}

Accorciato con l'aiuto del commentatore qui sotto


1
Anche se non conosco Java (sono un tipo C #, abbastanza divertente), non potresti salvare 1 personaggio eliminando le parentesi graffe sul if? EG: if(s==null) return 1==0;? O Java impone i ricci sulle ifdichiarazioni?
Andrew Gray,

3
Hai assolutamente ragione, l'ho tolto grazie !! ... Non ho notato che erano lì, immagino di essere uno sviluppatore Java che non fa C #?
jsedano,

4
1) Controllare se il parametro è nulluna buona abitudine, ma non praticato in CodeGolf. Come posso dire, nessun altro lo ha fatto in questa domanda. Salta. 2) Lo spazio tra gli argomenti aiuta la leggibilità, ma non il golf. Rimuoverla; 3) Invece di toLowerCase()usare esplicitamente la stringa in equalsIgnoreCase()seguito invece di equals(). In questo modo devi regolare l'espressione regolare, ma ancora 1 carattere più corto. pastebin.com/s7H84faj
arte

1
replaceAll("[^A-Za-z0-9]","")=>replaceAll("\\W","")
assylias

In realtà: replaceAll("\\W|_","");rimuovere _anche => 95 caratteri
assylias

7

Mathematica 54 53

Un byte salvato grazie a CatsAreFluffy:

PalindromeQ@StringCases[ToUpperCase@#,WordCharacter]&

Per quelli con la versione 10.2 o precedente:

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

Esempio

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

Vero


PalindromeQè 1 byte più corto di#==Reverse@#&
CalculatorFeline

Mi chiedevo perché non l'avessi mai visto. Versione 10.3!
DavidC

PalindromeQ= #==Reverse@#&
Calcolatrice

Sì, ho scaricato v. 10.4 per provarlo.
DavidC

È fuori? OHNO
Calcolatrice

6

J, 30 caratteri

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

Uso:

   */(=|.)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

6

k ( 50 48 45 38 caratteri)

Elimina tutti gli errori, restituendo un valore predefinito di 0b(false).

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

Esempio:

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

modifica: rasato altri tre caratteri evitando la variabile intermedia. H / T, CS. -7: non è necessario eliminare gli errori.


1
interessante che con solo 3 caratteri in più, il mio codice è molto più leggibile :-)
John Dvorak

È entrato un personaggio extra, l'ho rimosso.
skeevey,

5

Rubino: 43 38 caratteri

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

Esecuzione di esempio:

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

1
Puoi persino scriveres.tr!('^A-Za-z0-9','').upcase!.reverse==s
Howard il

Amico, per quanto tempo ho combinato l'uso dei !metodi! Continui a sorprendermi @Howard con i tuoi trucchi.
arte

Piccolo problema però, @Howard. tre tr!sembra comportarsi diversamente quando non hanno nulla da traslitterare: pastebin.com/4YThW2qN Questo fa sì che il p['757']test si arresti in modo anomalo con "NoMethodError: metodo indefinito` upcase! ' per zero: errore NilClass ".
arte

Oops scusa. Non ci ho pensato.
Howard,

1
può essere ulteriormente abbreviato:s=s.upcase.tr('^A-Z0-9','');s==s.reverse
Cristian Lupascu,

5

C ++, 107 (Miscounted), 100 (contato male), 81

string s;for(int c:t)if(isalnum(c))s+=c|32;return s==string(s.rbegin(),s.rend());
  • Sfrutta i pattern di bit ASCII.
  • Si affida a un male using namespace std;.
  • Utilizza AND bit OR e OR invece degli operatori logici.
  • Utilizza intperché è più breve di charo 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;
    }
    

4

Lua, 56

a=io.read"*l":lower():gsub("%W","")print(a:reverse()==a)

Se %Wè qualcosa di simile \Wa regex, esclude anche caratteri come il trattino basso. Questo è indesiderato.
John Dvorak,

ho controllato, %wnon include _( %Wovviamente lo include, quindi)
mniip

1
È necessario solo il corpo della funzione. s=s:lower():gsub('%W','')return s:reverse()==s 46 caratteri
Egor Skriptunoff il

ma che direfunction(s)
mniip

4

Python 3/2 59 caratteri:

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

4

Haskell, 43

Utilizzando le librerie standard Control.Monad, Control.Monad.Instancese Data.Char:

ap(==)reverse.map toLower.filter isAlphaNum

Non riesco a farlo funzionare in ghci. import Data.Char import Control.Monad ap(==)reverse.map toLower.filter isAlphaNumné lo fa con l'aggiunta di spazi o simili, mi dispiace non sono troppo appassionato di Haskell :)
SlimJim

1
@SlimJim: Oops, anche tu hai bisogno Control.Monad.Instances. (Sto usando l'istanza della monade Reader con ap, ma quell'istanza non viene esportata da Control.Monad.)
Jon Purdy

4

PHP 60 caratteri.

Prima prova su codegolf.

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

Esempio:

$c='Eva, can I stab bats in a cave?';
echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);
//prints 1

La parentesi attorno al primo operando dell'operatore ternario non è necessaria. In realtà non è necessario né l'operatore ternario, ma solo l'output vero o falso nella rappresentazione della tua lingua. Ed evitando la dichiarazione separata per l'assegnazione a $ x 1 più carattere può essere abbreviato: echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);.
arte

3

Personaggi Python 2 64:

i =''.join(re.findall('[a-z0-9]+',i.lower()))
return i==i[::-1]

@manatwork Se si sostituiscono tutti gli identificatori con identificatori di un carattere si ottiene una 77versione di caratteri. Non ho idea del perché Abhiram abbia pubblicato la versione non giocata.
Bakuriu,

@Bakuriu, non importa, ho perso un'affermazione nella domanda: "Sono necessari solo i corpi dei metodi". Anche se le righe 2 e 3 mi danno solo 73 caratteri. Per quanto riguarda l'ulteriore riduzione della lunghezza, non è necessaria la stringa non elaborata e il gruppo di acquisizione, rendendo re.findall('[a-z0-9]+',input.lower())più brevi i caratteri della parte 3.
arte

@manatwork, ho modificato il post e modificato leggermente le variabili. Ciò lo ha portato a 66. Sì, l'attributo stringa grezza non serve a niente qui.
Abhiram,

Ok, ma perché insisti sul gruppo di cattura nell'espressione regolare? Funziona correttamente senza: pastebin.com/JzpNRRZU
manatwork

Penso che mi abbia attirato dopo il mio recente progetto Python che coinvolge re :) Grazie per averlo sottolineato.
Abhiram,

3

Haskell 48

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

usato così:

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

3

Caratteri Smalltalk , Squeak / Pharo
116 caratteri usando la formattazione tradizionale con schede

Aggiungi due metodi a String:

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

Ovviamente potremmo eliminare alcuni spazi o usare nomi di metodi più brevi, ma non tradiamo lo spirito di Smalltalk.

Inoltre, questo gestirà i palindromi francesi, come in http://fr.wikipedia.org/wiki/Liste_de_palindromes_fran%C3%A7ais , non molte risposte in questa pagina possono.

['Léon a trop par rapport à Noël' isPalindrome] assert.

Risposta intelligente e utile!
Andrew Gray,

3

Python 3 (51 caratteri)

e potrebbe essere Python 2

basato sulla soluzione di abhiram (con golf più aggressivo)

from re import findall

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

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

può essere ridotto a 46 caratteri, usando RE '\ w'

e variante con corpo funzione estremamente ridotto (27 caratteri)

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: ')))

2

Windows PowerShell, 56 47 45 caratteri

Aggiornato (vedi commenti) e può rimuovere le parentesi attorno alla regex:

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

Originale (56)

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

Senza golf originale:

$s = "Eva, can I stab bats in a cave?"
$s = $s -replace '[^\w]', ''
$rev = $s[-1..-$s.length] -join ''
$s -eq $rev

Puoi giocare a golf fino a 47 caratteri in questo modo:($s=$s-replace'[\W]')-eq(-join$s[$s.length..0])
SpellingD

@SpellingD: Nice! Sono nuovo nel golf del codice, grazie per il miglioramento
goric

è possibile rimuovere la parentesi destra anche: ($s=$s-replace'\W')-eq-join$s[$s.length..0].
mazzy,

2

C ++, 74 byte

Questo codice è in realtà molto elegante e facile da capire (se formattato correttamente). Non credo che sia possibile abbreviare in C ++ e non utilizza alcuna funzione di libreria standard.

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

Esempio di utilizzo:

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

Versione ben formattata:

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

1
error: ISO C++ forbids declaration of ‘p’ with no typela tua funzione dovrebbe avere un tipo di ritorno.
Karl Napf,

Scommetto che questo non ignora i caratteri maiuscoli, bianchi e di controllo.
Tito

Puoi salvare un personaggio con while(*++e);invece di while(*e)++e;. Ma come ha detto Tito questa risposta non è valida.
Nick Matteo,

2

PHP, 26 84 80 78 62 63 byte

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

accetta input dal primo argomento della riga di comando; stampe 1per verità, stringa vuota per falsità.


I18n è un po 'espansivo, in quanto non esiste un'alternativa multibyte per strrev(110 byte; eseguire con -r):

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

utf8_strrev palesemente rubato dal manuale di PHP . Potresti anche dare un'occhiata a questo post sul blog .


Dai Titus ... Questo fallisce le specifiche.
Christoph,

1
@Christoph Sì, a volte dovrei leggerlo fino in fondo. Fisso.
Tito

Hm -Rprovocherebbe problemi con le interruzioni di riga nella stringa da testare, no? Dalla specifica "-R <code> Esegui PHP <code> per ogni riga di input". Inoltre <?=strrev($s=strtolower(preg_replace("#\W#","",$argn)))==$s;sarebbe più breve.
Christoph,

1
@Christoph Bella idea, ma non c'è $argnsenza -R.
Tito

$argv[1]="O Genie, der Herr ehre dein Ego!"; # :D
Tito

1

Ruby, 48

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

Abbastanza semplice e fatto in fretta, quindi non ha giocato a golf troppo. Lo golfò più tardi.


1

Pylongolf2 , 24 byte

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

caccetta l'input, ╨2per convertirlo in minuscolo.
Quindi inserisco una regex nello stack e utilizzo -per rimuovere tutti i caratteri non alfabetici nell'input.
_duplica l'input.
╨1lo inverte e =poi li confronta.
~stampa la pila alla fine che stampa trueo false.


Ciò ignora la punteggiatura, gli spazi bianchi e i caratteri di controllo?
MickyT

Mio male, questa versione no. Io lo aggiusterò.

Risolto il problema

1

PowerShell, 194 190 byte

Un'implementazione ricorsiva per mostrare come un blocco script PowerShell senza nome può chiamare se stesso.

$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]))
}

test:

&$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"

Non dovrebbe essere [^a-z0-9]?
Tito

1

05AB1E , 4 byte (non concorrenti)

Non competitiva , poiché la lingua postdatizza la sfida. Codice:

álÂQ

Spiegazione:

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

Utilizza la codifica CP-1252 . Provalo online! .


Ho provato a eseguirlo tramite il tuo link. L'output del programma è "1"
Christopher Perry,

1

Gelatina, 10 personaggi (non competitivi)

fØBŒl
UÇ⁼Ç

Restituisce 1 se vero, 0 se falso

Provalo online!


Ignora caratteri maiuscoli, bianchi e di controllo? Un guasto sarebbe bello.
Tito

Lo stato attuale della gelatina consente di risolvere questo 7 byte: fØBŒlŒḂ: ffiltro per mantenere ØBil set [a-zA-Z0-9] e Œlconvertito in lettere minuscole, quindi ŒḂprova se palindromo.
steenbergh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.