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!


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

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

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


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


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.


¡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

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

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]

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


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


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

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.


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

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;
    }
    

4

Lua, 56

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

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

4

Haskell, 43

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

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

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

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]

@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?"

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.

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

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

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;
}

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 .


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.


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.


¿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"

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


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!


¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.