Código mais curto para determinar se uma sequência é um palíndromo

42

Um palíndromo é uma cadeia que é soletrada da mesma maneira para trás e para frente. Por exemplo, 'Eva, posso esfaquear morcegos em uma caverna?' é um palíndromo (EVACANISTAB | BATSINACAVE)

Para esse código de golfe, usando o idioma de sua escolha, determine se uma determinada sequência é um palíndromo ou não.

Casos de borda:

  • A pontuação não é contada na palindrominess.
  • Os caracteres de controle não são contados na palindrominess.
  • Espaço em branco não é contado para palindrominess.
  • Os números são contados para palindrominess.
  • Caso neste desafio não é contado para palindrominess.
  • Não há limite para o tamanho das strings a serem avaliadas, exceto o imposto pelo seu idioma de escolha.
  • Para esse desafio, limite-se ao conjunto de caracteres ASCII.

Requerimentos técnicos:

  • Somente corpos de métodos são necessários; coisas adicionais, como assinaturas de método, declarações de estrutura de dados, etc. não contam para o requisito de vitória.
  • O código deve compilar ou interpretar sem erros ou exceções em tempo de compilação.
  • O código não deve gerar exceções não tratadas ou travar. (Quase desnecessário dizer. Quase.)
  • O código deve retornar algum valor indicando palindrominess. O tipo de dados depende do idioma que você usa (por exemplo, um usuário C # pode usar a bool, enquanto um usuário JavaScript pode usar a var.)
  • Você não pode escrever seu próprio intérprete que executa essa tarefa como um recurso 'nativo' para poder 'jogar golfe' com uma pontuação quase vencedora. (Esperamos que seja desnecessário dizer.)

Condição da vitória:

  • O código mais curto em caracteres vence.

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

... Deseja a marca de seleção verde mágica por sua resposta? Bata a resposta desse cara!

Andrew Gray
fonte
1
A E / S faz parte do desafio ou o corpo de uma função fará?
John Dvorak
1
As "trilhas de navegação" para mostrar como o trabalho é refinado estão disponíveis em todo o site em todas as respostas através do histórico de revisões. Não há necessidade de ter um histórico completo visível na versão atual da resposta.
Peter Taylor
1
@WernerCD Tenho certeza de que o OP mudará quem recebe o visto verde quando ele voltar para verificar as novas respostas.
Gareth
2
Não especificar um idioma realmente banaliza esse desafio para mim. Como visto abaixo, os idiomas interpretados com foco nas funções de manipulação de texto de alta ordem sempre obtêm os resultados mais curtos. O que é para me impedir de juntar meu próprio intérprete com uma única função, ip (). Meu algoritmo de competição agora é 'ip: i'. 4 caracteres. feito.
Gusdor #
3
@Gusdor vê J e GolfScript sugam todo o prazer do Code Golf e Language Handicap e questões relacionadas na meta deste site.
precisa saber é o seguinte

Respostas:

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
fonte
Parece com uma mistura de Q e k: P
skeevey
Bem, eu não chamaria exatamente .QA etc q. Eles são apenas invólucros de string, não há código k real embaixo deles. Agora, se eu dissesse .q.inter, estaria em apuros.
tmartin
Eu acho que é um caso de tergiversações sobre semântica, mas eles são definidos no qk
skeevey
Poderia apenas dizer Q para 31:{x~(|)x:(_)x inter(,/).Q`a`A`n}
tmartin 9/04/2013
Eu sei que isso é muito antigo, mas ... você pode salvar 1 byte {#|:\_x@&x in,/.Q`a`A`n}, onde 1 é verdadeiro e 2 é falso
scrawl
24

Perl, 26 caracteres

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

Avalia como 1 quando $_é um palíndromo ""(um dos valores falsos de Perl) quando não é.

Uso da amostra:

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__

saída:

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
multidão
fonte
Droga, você me venceu. Embora isso não funcione corretamente se houver um _na cadeia, não é? E não requer nenhuma entrada, então você não precisará usar a -popção?
Gareth
\Wem regexes exclui sublinhado. Receio que você precise [^a-z\d]do seu regex. Eu tenho medo de ser derrotado de qualquer maneira.
John Dvorak
3
Salve um com em _|\Wvez de [_\W].
Howard
1
Você pode abreviar _|\Wpara \Pl: ideone.com/0ufdaQ . Devem ser apenas as letras Unicode.
Kobi
Na verdade, pensando novamente - \Plnão corresponderia a dígitos, então acho que _|\Wé o melhor que você poderia fazer.
Kobi
18

Somente C # 82 :)

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

Não resisti à tentação de escrever um programa sem clichês no meu idioma favorito.

Um teste está disponível aqui: http://ideone.com/8bwz7z

Cristian Lupascu
fonte
Simples ... mas elegante!
Andrew Gray
@AndrewGray, obrigado pelo comentário e pelos requisitos técnicos permissivos. O clichê C # aumenta seriamente a contagem de caracteres, tornando impraticável o golfe.
Cristian Lupascu
2
Sem problemas. Sou um colega de desenvolvimento C # e gosto de escrever códigos concisos e eficientes. É uma pena há muito clichê na língua ...
Andrew Gray
13

GolfScript, 36 34 31 30 caracteres

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

Algoritmo semelhante ao da minha solução anterior (Javascript) .

0"0:A[a{"@{>^}+/- Otimizado por Peter Taylor e Howard. Minha versão foi "/9@Z"{1$<},,2%\;. Howard doou concatenação de funções e Peter Taylor doou XOR para o módulo-2. É basicamente um método genérico de comparar se o valor está em uma sequência de intervalos.

{.96>32*-}%(11 caracteres) não é realmente uma melhoria em relação ao Javascript .toUpperCase()(14 caracteres), especialmente porque manipula algumas pontuações estranhas que se seguem zna tabela ASCII (o que não importa aqui).

como sugeriu Peter Taylor, no entanto, se filtrarmos os alfanuméricos primeiro, poderemos converter em letras minúsculas e dígitos apenas definindo um bit em cada caractere: {32|}

.-1%=faz todo o trabalho pesado palindrômico. Uma parte da qual não gosto muito é de quanto tempo levei para descobrir como reverter uma matriz. Eu deveria ter lido os documentos. Os outros dois caracteres realizam gerenciamento e comparação de pilhas.

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


Além disso, se eu puder assumir que nenhum dos seguintes caracteres de controle está presente: (escape do link de dados, controle de dispositivo 1-4, reconhecimento negativo, ociosidade síncrona, fim do bloco de transmissão, cancelamento, fim do meio) (todos concordamos que estes são tudo bastante obscuro) ou se eu puder tratá-los como versões em maiúsculas dos dígitos de 0 a 9, podemos salvar outros dois caracteres:

GolfScript, 28 caracteres

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

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

John Dvorak
fonte
2
Você pode se livrar da limpeza e salvar dois caracteres:{"0:A["\{>}+,,2%},
Howard
@ Howard Obrigado. Eu acho que não entendi direito +sobre blocos. Esse é um truque legal.
John Dvorak
1
Você pode salvar três caracteres revertendo o filtro e a padronização de maiúsculas e minúsculas. Você precisa adicionar a{à lista de caracteres do filtro para incluir as letras minúsculas, mas pode usar maiúsculas apenas {32|}%. O resultado final é{"0:A[a{"\{>}+,,2%},{32|}%.-1%=
Peter Taylor
Há também outra economia a ser feita no filtro. Contar o módulo 2 é xor, o mesmo 0"0:A[a{"@{>^}+/acontece com o trabalho.
Peter Taylor
@ PeterTaylor Se eu não apresentar outra otimização em breve, provavelmente devo converter em wiki da comunidade. Obrigado mais uma vez :-)
John Dvorak
8

Javascript, 53 caracteres:

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

é uma expressão javascript avaliada como verdadeira se xfor um palíndromo e falsa se não for. Assume que xé uma string. Se isso não for garantido, adicione antesx+="",

Aqui está uma trilha de navegação: devido a como reverse()funciona,

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

falha. Contudo,

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

está perfeitamente bem.

John Dvorak
fonte
Bom boato sobre concatenar uma string nula! Pontos por boas informações!
Andrew Gray
3
Dicas: +""lança para uma string, +lança para um número |0e ~~lança para um número inteiro, !!lança para um booleano.
John Dvorak
É um char mais curto com regex/[^\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
fonte
7

Bash: 52 48 46 caracteres

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

Isso leva a picada para verificar como primeiro parâmetro e define o código de saída como 0 para o palíndromo e 1 para não.

Exemplo de execução:

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
homem a trabalhar
fonte
7

Python 2: 49 (sem contar a assinatura do método)

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

Um programa completo, com entrada e saída, pode ser escrito em 74 caracteres.

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

Exemplo 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.txtcontém este palíndromo de 17.826 palavras)

Esta solução pode ser adaptada ao python 3, adicionando alguns caracteres:

Python 3: 55

def f(s):
 s=list(filter(str.isalnum,s.upper()))
 return s==s[::-1]
Bakuriu
fonte
sys.stdin.readé basicamente o mesmo queraw_input
CalculatorFeline
No Python 3.8, você pode reduzi-lo para 58 bytes
MilkyWay90
Além disso, sua solução Python 2 e 3 é de 61 e 67 bytes, respectivamente.
MilkyWay90 16/03
@ MilkyWay90 Você provavelmente perdeu a conta sem contar a assinatura do método . Em 2013, era costume não incluí-lo. Em outra solução nesta pergunta em outros idiomas, eles simplesmente a omitiram e assumiram que você tem a entrada em uma svariável. Decidi fornecer a definição completa, mas, como de costume em 2013, não inclua a assinatura do método no comprimento
Bakuriu
@Bakuriu Ah, entendo. Estou aqui há apenas alguns meses, então não conheço os costumes de 2013
MilkyWay90 17/03
7

JAVA (ou a linguagem mais detalhada de todos os tempos), 102 96 95 caracteres

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

Uso (com código não protegido):

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

Encurtado com a ajuda do comentarista abaixo

jsedano
fonte
1
Enquanto eu não conheço Java (eu sou um cara de C #, engraçado o suficiente), você não poderia salvar um caractere tirando as chaves no if? EG if(s==null) return 1==0;:? Ou o Java aplica curlies nas ifinstruções?
Andrew Gray
3
Você está absolutamente certo, eu tirei isso obrigado !! ... Eu não percebi que eles estavam lá, acho que sou um desenvolvedor Java que não faz c #?
jsedano
4
1) Verificar se o parâmetro é nullum bom hábito, mas não praticado no CodeGolf. Como posso dizer, ninguém mais fez isso nesta questão. Pule isso. 2) O espaço entre argumentos ajuda na legibilidade, mas não no golfe. Remova; 3) Em vez de explicitamente, toLowerCase()a cadeia usa equalsIgnoreCase()mais tarde, em vez de equals(). Dessa forma, você precisa ajustar a expressão regular, mas ainda 1 caractere menor. pastebin.com/s7H84faj
manatwork
1
replaceAll("[^A-Za-z0-9]","")=>replaceAll("\\W","")
assylias
Na verdade: replaceAll("\\W|_","");para remover _também => 95 caracteres
assylias
7

Mathematica 54 53

Um byte salvo graças ao CatsAreFluffy:

PalindromeQ@StringCases[ToUpperCase@#,WordCharacter]&

Para aqueles com versão 10.2 ou anterior:

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

Exemplo

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

Verdade

DavidC
fonte
PalindromeQé 1 byte menor que#==Reverse@#&
CalculadoraFeline
Eu me perguntava por que nunca tinha visto. Versão 10.3!
21416
PalindromeQ= #==Reverse@#&
CalculatorFeline
Sim, baixei a versão 10.4 para testá-la.
18716
Está fora? 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
fonte
6

k ( 50 48 45 38 caracteres)

Suprime todos os erros, retornando um padrão de 0b(false).

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

Exemplo:

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

edit: raspou mais três caracteres, evitando a variável intermediária. H / T, CS. -7: Não há necessidade de suprimir erros.

skeevey
fonte
1
Interessante que em apenas 3 caracteres mais, o meu código é muito mais legível :-)
John Dvorak
Um char extra entrou, eu o removi.
Skeevey
5

Ruby: 43 38 caracteres

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

Exemplo de execução:

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
homem a trabalhar
fonte
1
Você pode até escrevers.tr!('^A-Za-z0-9','').upcase!.reverse==s
Howard
Cara, quanto tempo eu combinei com o uso dos !métodos! Você continua me surpreendendo @ Howard com seus truques.
manatwork
Pequeno problema, porém, @Howard. tre tr!parece se comportar diferente quando eles não têm nada para transliterar: pastebin.com/4YThW2qN Isso faz com que o p['757']teste seja interrompido com “NoMethodError: método indefinido` upcase! ' para nil: NilClass ”.
manatwork
OPA, desculpe. Não pensei sobre esse caso.
Howard
1
pode ser reduzido ainda mais:s=s.upcase.tr('^A-Z0-9','');s==s.reverse
Cristian Lupascu
5

C ++, 107 (mal informado), 100 (citado), 81

string s;for(int c:t)if(isalnum(c))s+=c|32;return s==string(s.rbegin(),s.rend());
  • Explora padrões de bits ASCII.
  • Confia em um mal using namespace std;.
  • Usa AND e OR bit a bit em vez dos operadores lógicos.
  • Usa intporque é mais curto que charou 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
fonte
4

Lua, 56

a=io.read"*l":lower():gsub("%W","")print(a:reverse()==a)
mniip
fonte
Se %Whouver algo como \Wem regex, também exclui caracteres como sublinhado. Isso não é desejado.
John Dvorak
i marcada, %wnão inclui _( %Wobviamente, inclui-lo, então)
mniip
1
Somente o corpo da função é necessário. s=s:lower():gsub('%W','')return s:reverse()==s 46 caracteres
Egor Skriptunoff
mas e quantofunction(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
fonte
4

Haskell, 43

Usando as bibliotecas padrão Control.Monad, Control.Monad.Instancese Data.Char:

ap(==)reverse.map toLower.filter isAlphaNum
Jon Purdy
fonte
Não posso fazer isso funcionar em ghci. import Data.Char import Control.Monad ap(==)reverse.map toLower.filter isAlphaNumnem faz isso com espaços adicionando ou tal, desculpe, eu não estou muito interessada com Haskell :)
SlimJim
1
@SlimJim: Opa, você precisa Control.Monad.Instancestambém. (Eu estou usando o exemplo mônada Reader com ap, mas essa instância não é exportado por Control.Monad.)
Jon Purdy
4

Caracteres PHP 60.

Primeira tentativa no codegolf.

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

Exemplo:

$c='Eva, can I stab bats in a cave?';
echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);
//prints 1
Carlos Goce
fonte
Os parênteses em torno do primeiro operando do operador ternário não são necessários. Na verdade, nem o operador ternário é necessário - basta mostrar verdadeiro ou falso na representação do seu idioma. E evitando a declaração separada para a atribuição para $ x 1 mais caráter pode ser encurtado: echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);.
manatwork
3

Caracteres Python 2 64:

i =''.join(re.findall('[a-z0-9]+',i.lower()))
return i==i[::-1]
abhiram
fonte
@manatwork Se você substituir todos os identificadores por um caractere, obterá uma 77versão de caracteres. Não faço ideia por que o abhiram postou a versão não-destruída.
Bakuriu
@Bakuriu, não importa, eu perdi uma declaração na pergunta: “Apenas os corpos dos métodos são necessários”. Embora as linhas 2 e 3 tenham apenas 73 caracteres. Em relação à redução adicional de comprimento, não há necessidade de cadeia bruta e do grupo de captura, tornando os re.findall('[a-z0-9]+',input.lower())caracteres da parte 3 mais curtos.
manatwork
@ manatwork, editei o post e alterei um pouco as variáveis. Isso reduziu para 66. Sim, o atributo de cadeia bruta não é útil aqui.
Abhiram
Ok, mas por que você insiste no grupo de captura na expressão regular? Funciona corretamente sem: pastebin.com/JzpNRRZU
manatwork
Eu acho que me pegou depois do meu recente projeto python envolvendo re's :) Obrigado por apontar.
Abhiram
3

Haskell 48

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

usado assim:

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

Smalltalk , Squeak / Pharo sabor
116 caracteres usando a formatação tradicional com guias

Você adiciona dois métodos ao String:

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

É claro que poderíamos eliminar alguns espaços ou usar nomes de métodos mais curtos, mas não vamos trair o espírito do Smalltalk.

Além disso, isso lidará com palíndromos franceses, como em http://fr.wikipedia.org/wiki/Liste_de_palindromes_fran%C3%A7ais , poucas respostas nesta página podem.

['Léon a trop par rapport à Noël' isPalindrome] assert.
aka.nice
fonte
Resposta inteligente e útil!
Andrew Gray
3

Python 3 (51 caracteres)

e pode ser Python 2

com base na solução abhiram (com golfe mais agressivo)

from re import findall

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

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

pode ser reduzido para 46 caracteres, usando RE '\ w'

e variante com corpo de função extremamente reduzido (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
fonte
2

Windows PowerShell, 56 47 45 caracteres

Atualizado (consulte os comentários) e pode remover os colchetes ao redor da regex:

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

Original (56)

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

Original sem golfe:

$s = "Eva, can I stab bats in a cave?"
$s = $s -replace '[^\w]', ''
$rev = $s[-1..-$s.length] -join ''
$s -eq $rev
goric
fonte
Você pode jogar até 47 caracteres como este:($s=$s-replace'[\W]')-eq(-join$s[$s.length..0])
SpellingD
@SpellingD: Nice! Eu sou novo no golfe código, graças para a melhoria
Gorić
você pode remover o parêntese direito também: ($s=$s-replace'\W')-eq-join$s[$s.length..0].
Mazzy
2

C ++, 74 bytes

Na verdade, esse código é realmente elegante e fácil de entender (quando formatado corretamente). Não acredito que seja possível diminuir o tempo em C ++ e ele não usa nenhuma função de biblioteca padrão.

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

Exemplo de uso:

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

Versão bem formatada:

p(auto c)
{
    auto e=c;
    while(*e) ++e;
    --e;
    while(*e==*c & e>c)--e,++c;
    return e<=c;
}
J. Antonio Perez
fonte
1
error: ISO C++ forbids declaration of ‘p’ with no typesua função deve ter um tipo de retorno.
22816 Karl Napf
Aposto que isso não ignora maiúsculas e minúsculas e caracteres de controle.
Titus
Você pode salvar um personagem com em while(*++e);vez de while(*e)++e;. Mas, como Tito mencionou, esta resposta é inválida.
Nick Matteo
2

PHP, 26 84 80 78 62 63 bytes

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

recebe entrada do primeiro argumento da linha de comando; imprime 1para cadeia de caracteres verdadeira e vazia para falsificação.


I18n é um pouco expansivo, pois não há alternativa multibyte para strrev(110 bytes; execute com -r):

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

utf8_strrev flagrantemente roubado do manual do PHP . Você também pode dar uma olhada nesta postagem do blog .

Titus
fonte
Vamos Titus ... Isso falha nas especificações.
Christoph
1
@Christoph Sim, às vezes eu deveria ler isso completamente. Fixo.
Titus
Hm -Rcausaria problemas com quebras de linha na string para testar, não? Na especificação "-R <code> Execute o PHP <code> para cada linha de entrada". Além disso, <?=strrev($s=strtolower(preg_replace("#\W#","",$argn)))==$s;seria mais curto.
Christoph
1
@ Christoph Boa idéia, mas não há $argnsem -R.
Titus
$argv[1]="O Genie, der Herr ehre dein Ego!"; # :D
Titus
1

Ruby, 48

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

Muito simples, e feito às pressas para não jogar muito golfe. Vou jogar mais tarde.

Maçaneta da porta
fonte
1

Pylongolf2 , 24 bytes

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

cleva a entrada, ╨2para converter em minúsculas.
Em seguida, empurro um regex para a pilha e o uso -para remover todos os caracteres não alfabéticos da entrada.
_duplica a entrada.
╨1reverte e =depois os compara.
~imprime a pilha no final que imprime trueou false.


fonte
Isso ignora os caracteres de pontuação, espaço em branco e controle?
MickyT 31/03
Meu mal, esta versão não. Eu irei consertar isso.
Corrigido o problema.
1

PowerShell, 194 190 bytes

Uma implementação recursiva para mostrar como um bloco de script do PowerShell sem nome pode se chamar.

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

testes:

&$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
fonte
Não deveria ser [^a-z0-9]?
Titus
1

05AB1E , 4 bytes (não concorrente)

Não concorrente , uma vez que o idioma pós o desafio. Código:

álÂQ

Explicação:

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

Usa a codificação CP-1252 . Experimente online! .

Adnan
fonte
Tentei executá-lo através do seu link. Saída do programa é "1"
Christopher Perry
1

Gelatina, 10 caracteres (não-concorrente)

fØBŒl
UÇ⁼Ç

Retorna 1 se verdadeiro, 0 se falso

Experimente Online!

X88B88
fonte
Ignora caracteres de maiúsculas e minúsculas e caracteres de controle? Um colapso seria bom.
Titus
O estado actual de geléia permite resolver este em 7 bytes: fØBŒlŒḂ: ffiltro para manter ØBo conjunto de [a-zA-Z0-9] e Œlconvertido para minúscula, então ŒḂo teste se palindrome.
precisa saber é o seguinte