Código más corto para determinar si una cadena es un palíndromo

42

Un palíndromo es una cadena que se escribe de la misma manera, tanto hacia atrás como hacia adelante. Por ejemplo, 'Eva, ¿puedo apuñalar a los murciélagos en una cueva?' es un palíndromo (EVACANISTAB | BATSINACAVE)

Para este código de golf, utilizando el idioma de su elección, determine si una cadena dada es un palíndromo o no.

Casos de borde:

  • La puntuación no se cuenta para palindrominess.
  • Los caracteres de control no se cuentan para palindrominess.
  • El espacio en blanco no se cuenta para palindrominess.
  • Los números se cuentan para palindrominess.
  • El caso en este desafío no se cuenta para palindrominess.
  • No hay límite para la longitud de las cadenas a evaluar, excepto por lo que impone su idioma de elección.
  • Para este desafío, limítese al conjunto de caracteres ASCII.

Requerimientos técnicos:

  • Solo se necesitan cuerpos de método; cosas adicionales como firmas de métodos, declaraciones de estructura de datos, etc. no cuentan para el requisito de victoria.
  • El código debe compilarse o interpretarse sin errores o excepciones en tiempo de compilación.
  • El código no debe arrojar excepciones o bloqueos no manejados. (Casi no hace falta decirlo. Casi.)
  • El código debe devolver algún valor que indique palindrominess. El tipo de datos depende del idioma que use (por ejemplo, un usuario de C # podría usar a bool, mientras que un usuario de JavaScript podría usar a var).
  • No puede escribir su propio intérprete que realice esta tarea como una capacidad 'nativa' para que pueda 'jugar' un puntaje casi ganador. (Ojalá no sea necesario decirlo).

Condición de victoria:

  • El código más corto en caracteres gana.

Líder actual: tmartin (k, 25 caracteres)

... ¿Quieres la marca de verificación verde mágica de tu respuesta? Batir la respuesta de este chico!

Andrew Gray
fuente
1
¿La E / S es parte del desafío o un organismo de funciones lo hará?
John Dvorak
1
Las "migas de pan" para mostrar cómo se refina el trabajo están disponibles en todo el sitio en todas las respuestas a través del historial de revisiones. No es necesario tener un historial completo visible en la versión actual de la respuesta.
Peter Taylor
1
@WernerCD Estoy seguro de que el OP cambiará quién obtiene la marca verde cuando regrese para verificar las nuevas respuestas.
Gareth
2
No especificar un idioma realmente trivializa este desafío para mí. Como se ve a continuación, los lenguajes interpretados con un enfoque en las funciones de manipulación de texto de alto orden siempre obtienen los resultados más cortos. Lo que me impide lanzar mi propio intérprete con una sola función, ip (). Mi algoritmo de competencia ahora es 'ip: i'. 4 personajes hecho.
Gusdor
3
@Gusdor ve a J y GolfScript absorber todo el disfrute de Code Golf and Language Handicap y las preguntas relacionadas en el meta de este sitio.
AakashM

Respuestas:

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
fuente
Parece una mezcla de Q y k: P
skeevey
Bueno, no llamaría exactamente .QA, etc. q. Son solo envoltorios de cadenas, no hay un código k real debajo de ellos. Ahora, si dijera .q.inter estaría en problemas.
tmartin
Supongo que es un caso de objeciones sobre la semántica, pero se definen en qk
skeevey
Podría decir Q para 31:{x~(|)x:(_)x inter(,/).Q`a`A`n}
tmartin
Sé que esto es muy antiguo pero ... puedes guardar 1 byte con {#|:\_x@&x in,/.Q`a`A`n}, donde 1 es verdadero y 2 es falso
garabatea el
24

Perl, 26 char

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

Evalúa a 1 cuando $_es un palíndromo ""(uno de los valores falsos de Perl) cuando no lo es.

Uso de la muestra:

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__

salida:

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
multitud
fuente
Maldición, me ganaste. Aunque esto no funcionará correctamente si hay una _cadena, ¿verdad? Y no requiere ninguna entrada, así que ¿no necesitarás usar la -popción?
Gareth
\Wen expresiones regulares excluye guiones bajos. Me temo que necesitarás [^a-z\d]en tu expresión regular. Me temo que de todos modos me golpean.
John Dvorak
3
Guardar uno con en _|\Wlugar de [_\W].
Howard
1
Puede acortar _|\Wa \Pl: ideone.com/0ufdaQ . Deberían ser solo las letras Unicode.
Kobi
En realidad, pensar de nuevo, \Plno coincidiría con los dígitos, así que supongo que _|\Wes lo mejor que puedes hacer.
Kobi
18

C # 82 solamente :)

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

No pude resistir la tentación de escribir un programa sin repeticiones en mi idioma favorito.

Una prueba está disponible aquí: http://ideone.com/8bwz7z

Cristian Lupascu
fuente
Simple ... pero elegante!
Andrew Gray
@ AndrewGray gracias por el comentario y por los requisitos técnicos permisivos. C # repetitivo se agrega seriamente al recuento de char, por lo que no es práctico para el golf de lo contrario.
Cristian Lupascu
2
No hay problema. Soy un compañero de desarrollo de C #, y me gusta escribir código conciso y eficiente. Es una pena que haya tantas repeticiones en el idioma ...
Andrew Gray
13

GolfScript, 36 34 31 30 caracteres

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

Algoritmo similar a mi solución anterior (Javascript) .

0"0:A[a{"@{>^}+/- Optimizado por Peter Taylor y Howard. Mi versión era "/9@Z"{1$<},,2%\;. Howard donó la concatenación de funciones y Peter Taylor donó XOR para el módulo-2. Básicamente es un método genérico para comparar si el valor está en una secuencia de rangos.

{.96>32*-}%(11 caracteres) no es realmente una mejora con respecto a Javascript .toUpperCase()(14 caracteres), especialmente porque altera algunas puntuaciones extrañas que siguen zen la tabla ASCII (que no importa aquí).

Sin embargo, como sugirió Peter Taylor, si primero filtramos los caracteres alfanuméricos, podemos convertirlos a minúsculas y dígitos simplemente configurando un bit en cada carácter: {32|}

.-1%=realiza todo el trabajo pesado palindrómico. Una parte que no me gusta mucho es cuánto tiempo me llevó descubrir cómo invertir una matriz. Debería haber leído los documentos. Los otros dos personajes realizan la gestión de la pila y la comparación.

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


Además, si puedo suponer que ninguno de los siguientes caracteres de control están presentes: (escape de enlace de datos, control de dispositivo 1-4, reconocimiento negativo, inactividad síncrona, final del bloque de transmisión, cancelar, final del medio) (todos estamos de acuerdo en que estos son todo bastante oscuro) o si puedo tratarlos como versiones en mayúscula de los dígitos 0-9, podemos guardar otros dos caracteres:

GolfScript, 28 caracteres

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

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

John Dvorak
fuente
2
Puede deshacerse de la limpieza y guardar dos caracteres:{"0:A["\{>}+,,2%},
Howard
@Howard Gracias. Creo que entendí mal +en los bloques. Ese es un truco genial.
John Dvorak
1
Puede guardar tres caracteres invirtiendo el filtro y la estandarización de mayúsculas y minúsculas. Debe agregar a{a la lista de caracteres del filtro para incluir las letras minúsculas, pero luego puede usar mayúsculas con solo {32|}%. El resultado final es{"0:A[a{"\{>}+,,2%},{32|}%.-1%=
Peter Taylor
También hay otro ahorro que se realizará en el filtro. El módulo de conteo 2 es xor, también lo 0"0:A[a{"@{>^}+/hace el trabajo.
Peter Taylor
@PeterTaylor Si no se me ocurre otra optimización pronto, probablemente debería convertirme al wiki de la comunidad. Gracias de nuevo :-)
John Dvorak
8

Javascript, 53 caracteres:

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

es una expresión javascript que se evalúa como verdadera si xes un palíndromo, y como falsa si no lo es. Se supone que xes una cadena. Si eso no está garantizado, antepongax+="",

Aquí hay una ruta de navegación: debido a cómo reverse()funciona,

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

falla Sin embargo,

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

Está perfectamente bien.

John Dvorak
fuente
¡Un buen dato para concatenar una cadena nula! Puntos por buena información!
Andrew Gray
3
Sugerencias: se +""convierte en una cadena, se +convierte en un número |0y se ~~convierte en un número entero, se !!convierte en un booleano.
John Dvorak
Es un char más corto con expresiones regulares/[^\W_]/g
SuperPrograman
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
plannapus
fuente
7

Golpe: 52 48 46 caracteres

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

Esto toma la picadura para verificar como primer parámetro y establece el código de salida en 0 para palíndromo y 1 para no.

Ejecución de muestra:

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
hombre trabajando
fuente
7

Python 2: 49 (sin contar la firma del método)

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

Un programa completo, con entrada y salida se puede escribir en 74 caracteres.

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

Ejemplo de uso:

$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 este palindrome de 17,826 palabras)

Esta solución se puede adaptar a Python 3 agregando algunos caracteres:

Pitón 3: 55

def f(s):
 s=list(filter(str.isalnum,s.upper()))
 return s==s[::-1]
Bakuriu
fuente
sys.stdin.reades básicamente lo mismo queraw_input
CalculatorFeline
En Python 3.8 puede acortar esto a 58 bytes
MilkyWay90
Además, su solución Python 2 y 3 tiene 61 bytes y 67 bytes, respectivamente.
MilkyWay90
@ MilkyWay90 Probablemente te perdiste sin contar la firma del método . En 2013 era costumbre no incluirlo. En otra solución en esta pregunta en otros idiomas, simplemente lo omitieron y asumieron que tiene la entrada en una svariable. Decidí proporcionar la definición completa pero, como era habitual en 2013, no incluir la firma del método en la duración
Bakuriu
@Bakuriu Ah, ya veo. Solo llevo aquí unos meses, así que no conozco las costumbres de 2013
MilkyWay90
7

JAVA (o el lenguaje más detallado de todos) 102 96 95 char

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

Uso (con código sin golf):

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

Acortado con la ayuda del comentarista a continuación

jsedano
fuente
1
Si bien no conozco Java (soy un chico de C #, lo suficientemente divertido), ¿no podrías salvar 1 personaje quitando las llaves en el if? EG if(s==null) return 1==0;:? ¿O Java impone curlies en las ifdeclaraciones?
Andrew Gray
3
¡Tienes toda la razón, lo saqué gracias! ... No he notado que estaban allí, supongo que soy un desarrollador de Java que no tiene C #.
jsedano
44
1) Verificar si el parámetro es nullun buen hábito, pero no se practica en CodeGolf. Como puedo ver, nadie más lo hizo en esta pregunta. Saltarlo. 2) El espacio entre argumentos ayuda a la legibilidad, pero no al golf. Eliminarlo; 3) En lugar de explícitamente, toLowerCase()la cadena se usa equalsIgnoreCase()más tarde en lugar de equals(). De esta manera, debe ajustar la expresión regular, pero aún 1 carácter más corto. pastebin.com/s7H84faj
manatwork
1
replaceAll("[^A-Za-z0-9]","")=>replaceAll("\\W","")
assylias
En realidad: replaceAll("\\W|_","");para eliminar _también => 95 caracteres
asilias
7

Mathematica 54 53

Un byte guardado gracias a CatsAreFluffy:

PalindromeQ@StringCases[ToUpperCase@#,WordCharacter]&

Para aquellos con la versión 10.2 o anterior:

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

Ejemplo

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

Cierto

DavidC
fuente
PalindromeQes 1 byte más corto que#==Reverse@#&
CalculatorFeline
Me preguntaba por qué nunca lo había visto. Versión 10.3!
DavidC
PalindromeQ= #==Reverse@#&
CalculatorFeline
Sí, descargué la v. 10.4 para probarlo.
DavidC
¿Eso está fuera? OHNO
CalculatorFeline
6

J, 30 caracteres

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

k ( 50 48 45 38 caracteres)

Suprime todos los errores, devolviendo un valor predeterminado de 0b(falso).

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

Ejemplo:

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

editar: afeitó tres caracteres más evitando la variable intermedia. H / T, CS. -7: No es necesario suprimir errores.

skeevey
fuente
1
interesante que con solo 3 caracteres más, mi código es mucho más legible :-)
John Dvorak
Se introdujo un carbón adicional, lo he eliminado.
skeevey
5

Ruby: 43 38 caracteres

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

Ejecución de muestra:

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
hombre trabajando
fuente
1
Incluso puedes escribirs.tr!('^A-Za-z0-9','').upcase!.reverse==s
Howard
Hombre, ¡cuánto tiempo combiné alrededor del uso de los !métodos! Sigues asombrándome con tus trucos.
manatwork
Pequeño problema, sin embargo, @Howard. try tr!parece comportarse de manera diferente cuando no tienen nada que transcribir: pastebin.com/4YThW2qN Eso hace que la p['757']prueba se bloquee con "NoMethodError: método indefinido 'upcase!' for nil: NilClass ”error.
manatwork
Ups, lo siento. No pensé en ese caso.
Howard
1
se puede acortar aún más:s=s.upcase.tr('^A-Z0-9','');s==s.reverse
Cristian Lupascu
5

C ++, 107 (mal contado), 100 (contado incorrectamente), 81

string s;for(int c:t)if(isalnum(c))s+=c|32;return s==string(s.rbegin(),s.rend());
  • Explota patrones de bits ASCII.
  • Se basa en un mal using namespace std;.
  • Utiliza AND y OR a nivel de bit en lugar de los operadores lógicos.
  • Usos intporque es más corto que 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;
    }
    
Adrian McCarthy
fuente
4

Lua, 56

a=io.read"*l":lower():gsub("%W","")print(a:reverse()==a)
mniip
fuente
Si %Wes algo así como \Wen regex, también excluye caracteres como guiones bajos. Esto no es deseado.
John Dvorak
Lo comprobé, %wno incluye _( %Wobviamente lo incluye, entonces)
mniip
1
Solo se necesita un cuerpo funcional. s=s:lower():gsub('%W','')return s:reverse()==s 46 caracteres
Egor Skriptunoff
pero que pasafunction(s)
mniip
4

Python 3/2 59 caracteres:

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

Haskell, 43

El uso de las bibliotecas estándar Control.Monad, Control.Monad.Instancesy Data.Char:

ap(==)reverse.map toLower.filter isAlphaNum
Jon Purdy
fuente
No puedo hacer que esto funcione en ghci. import Data.Char import Control.Monad ap(==)reverse.map toLower.filter isAlphaNumtampoco lo hace con la adición de espacios o algo así, lo siento, no estoy demasiado interesado en Haskell :)
SlimJim
1
@SlimJim: Vaya, también lo necesitas Control.Monad.Instances. (Estoy usando la instancia de mónada Reader con ap, pero esa instancia no se exporta Control.Monad).
Jon Purdy
4

PHP 60 caracteres.

Primero prueba Codegolf.

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

Ejemplo:

$c='Eva, can I stab bats in a cave?';
echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);
//prints 1
Carlos Goce
fuente
Los paréntesis alrededor del primer operando del operador ternario no son necesarios. En realidad, ni el operador ternario es necesario, solo genera verdadero o falso en la representación de su idioma. Y evitando la declaración por separado para la asignación de $ x 1 más carácter puede acortarse: echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);.
trabajo de
3

Python 2 64 Charecters:

i =''.join(re.findall('[a-z0-9]+',i.lower()))
return i==i[::-1]
abhiram
fuente
@manatwork Si reemplaza todos los identificadores con identificadores de un carácter, obtendrá una 77versión de caracteres. Sin embargo, no tengo idea de por qué abhiram publicó la versión sin golf.
Bakuriu
@Bakuriu, no importa, me perdí una declaración en la pregunta: "Solo se necesitan cuerpos de métodos". Aunque las líneas 2 y 3 me dan solo 73 caracteres. Con respecto a la reducción de longitud adicional, no es necesario utilizar cadenas sin procesar y el grupo de captura, lo que hace que los re.findall('[a-z0-9]+',input.lower())caracteres de la parte 3 sean más cortos.
manatwork
@manatwork, edité la publicación y cambié un poco las variables. Eso lo redujo a 66. Sí, el atributo de cadena sin formato no sirve de nada aquí.
abhiram
Ok, pero ¿por qué insistes en el grupo de captura en la expresión regular? Funciona correctamente sin: pastebin.com/JzpNRRZU
manatwork
Creo que me llamó la atención después de mi reciente proyecto de Python que involucra re's :) Gracias por señalarlo.
abhiram
3

Haskell 48

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

usado así:

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

Charla , Squeak / Pharo sabor
116 caracteres con formato tradicional con pestañas

Agrega dos métodos a String:

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

Por supuesto, podríamos eliminar algunos espacios, o usar nombres de métodos más cortos, pero no traicionemos el espíritu de Smalltalk.

Además, esto manejará los palíndromos franceses, como en http://fr.wikipedia.org/wiki/Liste_de_palindromes_fran%C3%A7ais , no hay muchas respuestas en esta página.

['Léon a trop par rapport à Noël' isPalindrome] assert.
aka.nice
fuente
¡Respuesta inteligente y útil!
Andrew Gray
3

Python 3 (51 caracteres)

y puede ser Python 2

basado en la solución abhiram (con golf más agresivo)

from re import findall

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

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

se puede acortar a 46 caracteres, usando RE '\ w'

y variante con cuerpo de función extremadamente acortado (27 caracteres)

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
fuente
2

Windows PowerShell, 56 47 45 caracteres

Actualizado (ver comentarios), y puede eliminar los corchetes alrededor de la expresión regular:

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

Original (56)

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

Original sin golf:

$s = "Eva, can I stab bats in a cave?"
$s = $s -replace '[^\w]', ''
$rev = $s[-1..-$s.length] -join ''
$s -eq $rev
goric
fuente
Puede jugar golf hasta 47 caracteres como este:($s=$s-replace'[\W]')-eq(-join$s[$s.length..0])
SpellingD
@SpellingD: ¡Qué bien! Soy nuevo en Code Golfing, gracias por la mejora
Goric
puedes eliminar el paréntesis correcto también: ($s=$s-replace'\W')-eq-join$s[$s.length..0] .
mazzy
2

C ++, 74 bytes

Este código es realmente elegante y fácil de entender (cuando está formateado correctamente). No creo que sea posible acortar más en C ++, y no utiliza ninguna función de biblioteca estándar.

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

Ejemplo de uso:

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

Versión bien formateada:

p(auto c)
{
    auto e=c;
    while(*e) ++e;
    --e;
    while(*e==*c & e>c)--e,++c;
    return e<=c;
}
J. Antonio Perez
fuente
1
error: ISO C++ forbids declaration of ‘p’ with no typeSu función debe tener un tipo de retorno.
Karl Napf
Apuesto a que esto no ignora mayúsculas, espacios en blanco y caracteres de control.
Titus
Puedes guardar un personaje con en while(*++e);lugar de while(*e)++e;. Pero como Titus mencionó, esta respuesta no es válida.
Nick Matteo
2

PHP, 26 84 80 78 62 63 bytes

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

toma la entrada del primer argumento de línea de comando; impresiones 1para la verdad, cadena vacía para la falsedad.


I18n es un poco expansivo, ya que no hay una alternativa multibyte para strrev(110 bytes; ejecutar con -r):

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

utf8_strrev robado descaradamente del manual de PHP . También es posible que desee echar un vistazo a esta publicación de blog .

Titus
fuente
Vamos Titus ... Esto falla la especificación.
Christoph
1
@ Christoph Sí, a veces debería leerlo completamente. Fijo.
Titus
Hm -Rcausaría problemas con los saltos de línea en la cadena para probar, ¿no? Desde la especificación "-R <code> Ejecute PHP <code> para cada línea de entrada". Además <?=strrev($s=strtolower(preg_replace("#\W#","",$argn)))==$s;sería más corto.
Christoph
1
@ Christoph Buena idea, pero no hay $argnsin -R.
Titus
$argv[1]="O Genie, der Herr ehre dein Ego!"; # :D
Titus
1

Rubí, 48

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

Bastante simple y apresuradamente hecho para no jugar demasiado al golf. Lo jugaré más tarde.

Pomo de la puerta
fuente
1

Pylongolf2 , 24 bytes

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

ctoma la entrada, ╨2para convertir a minúsculas.
Luego presiono una expresión regular en la pila y la uso -para eliminar todos los caracteres no alfabéticos en la entrada.
_duplica la entrada
╨1lo revierte y= luego los compara.
~imprime la pila al final que imprime trueo false.


fuente
¿Esto ignora la puntuación, los espacios en blanco y los caracteres de control?
MickyT
Mi mal, esta versión no. Yo lo arreglare.
Solucionado el problema.
1

PowerShell, 194 190 bytes

Una implementación recursiva para mostrar cómo un bloque de script PowerShell sin nombre puede llamarse a sí mismo.

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

sin golf:

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

pruebas:

&$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
fuente
¿No debería ser eso [^a-z0-9]?
Titus
1

05AB1E , 4 bytes (no competitivos)

No competitiva , ya que el lenguaje es posterior al desafío. Código:

álÂQ

Explicación:

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

Utiliza la codificación CP-1252 . Pruébalo en línea! .

Adnan
fuente
Intenté ejecutarlo a través de su enlace. La salida del programa es "1"
Christopher Perry
1

Gelatina, 10 personajes (no competitivos)

fØBŒl
UÇ⁼Ç

Devuelve 1 si es verdadero, 0 si es falso

Pruébalo en línea!

X88B88
fuente
¿Ignora mayúsculas, espacios en blanco y caracteres de control? Un desglose sería bueno.
Titus
El estado actual de la jalea permite solucionar esto en 7 bytes: fØBŒlŒḂ: ffiltro para mantener ØBel conjunto [a-zA-Z0-9] y Œlconvertir a minúsculas, y luego ŒḂprueba si palíndromo.
steenbergh