Code le plus court pour déterminer si une chaîne est un palindrome


42

Un palindrome est une chaîne épelée de la même manière, à l’avant comme à l’avant. Par exemple, 'Eva, puis-je poignarder des chauves-souris dans une grotte?' est un palindrome (EVACANISTAB | BATSINACAVE)

Pour ce code golf, en utilisant la langue de votre choix, déterminez si une chaîne donnée est un palindrome ou non.

Cas Edge:

  • La ponctuation ne compte pas dans la palindromie.
  • Les caractères de contrôle ne sont pas pris en compte dans la palindromie
  • Les espaces blancs ne comptent pas pour la palindromie.
  • Les nombres sont comptés en fonction de la palindromie.
  • Le cas dans ce défi ne compte pas pour la palindromie.
  • Il n'y a pas de limite à la longueur des chaînes à évaluer, à l'exception de ce qui est imposé par la langue de votre choix.
  • Pour ce défi, limitez-vous au jeu de caractères ASCII.

Les pré-requis techniques:

  • Seuls les corps de méthodes sont nécessaires; des éléments supplémentaires tels que les signatures de méthode, les déclarations de structure de données, etc. ne comptent pas pour l'exigence de victoire.
  • Le code doit être compilé ou interprété sans erreurs ou exceptions lors de la compilation.
  • Le code ne doit pas renvoyer d'exceptions non gérées ou de crash. (Presque inutile de dire. Presque.)
  • Le code doit renvoyer une valeur indiquant le palindrominess. Le type de données dépend de la langue que vous utilisez (par exemple, un utilisateur C # peut utiliser un bool, alors qu'un utilisateur JavaScript peut utiliser un var.)
  • Vous ne pouvez pas écrire votre propre interprète qui effectue cette tâche en tant que capacité «native» afin de pouvoir «jouer» un score presque gagnant. (J'espère inutile de le dire.)

Condition de victoire:

  • Le code le plus court en caractères gagne.

Chef actuel: tmartin (k, 25 caractères)

... Voulez-vous la coche verte verte par votre réponse? Battez la réponse de ce type!


1
Est-ce que les E / S font partie du défi ou est-ce qu'un corps fonctionnel fera l'affaire?
John Dvorak

1
Le "fil d'Ariane" pour montrer comment le travail est affiné est disponible dans tout le site dans toutes les réponses via l'historique des révisions. Il n'est pas nécessaire d'avoir un historique complet visible dans la version actuelle de la réponse.
Peter Taylor

1
@WernerCD Je suis sûr que le PO changera l'identité de la coche verte à son retour pour vérifier les nouvelles réponses.
Gareth

2
Ne pas spécifier une langue banalise vraiment ce défi pour moi. Comme on le voit ci-dessous, les langages interprétés mettant l'accent sur les fonctions de manipulation de texte d'ordre élevé obtiennent toujours les résultats les plus courts. Qu'est-ce qui m'empêche de lancer mon propre interprète avec une seule fonction, ip (). Mon algorithme de compétition est maintenant "ip: i". 4 personnages. terminé.
Gusdor

3
@Gusdor voit que J et GolfScript aspirent au plaisir de Code Golf et de Handicap Linguistique et de questions connexes sur la méta de ce site.
AakashM

Réponses:


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

On dirait un mélange de Q et k: P
skeevey

Eh bien, je n’appellerais pas exactement .QA etc. q. Ce ne sont que des wrappers de chaînes, il n'y a pas de vrai code k en dessous. Maintenant, si je disais .q.inter, je serais en difficulté.
tmartin

Je suppose que c'est un cas de chicane sur la sémantique mais elles sont définies dans qk
skeevey

Pourrait juste dire Q pour 31:{x~(|)x:(_)x inter(,/).Q`a`A`n}
tmartin

Je sais que c'est très vieux, mais ... vous pouvez économiser 1 octet avec {#|:\_x@&x in,/.Q`a`A`n}, où 1 est vrai et 2 est faux
griffonner

24

Perl, 26 caractères

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

Evalue à 1 quand $_est un palindrome ""(une des fausses valeurs de Perl) quand ce n'est pas le cas.

Exemple d'utilisation:

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__

sortie:

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

Bon sang, vous m'avez battu. Bien que cela ne fonctionne pas correctement s'il y a une _chaîne dans la chaîne, est-ce que ça va? Et cela ne nécessite aucune entrée, vous n’avez donc pas besoin d’utiliser cette -poption?
Gareth

\Wdans les expressions rationnelles exclut le trait de soulignement. Je crains que vous ayez besoin [^a-z\d]de votre regex. J'ai peur d'être battu de toute façon.
John Dvorak

3
Enregistrer un avec _|\Wau lieu de [_\W].
Howard

1
Vous pouvez raccourcir _|\Wà \Pl: ideone.com/0ufdaQ . Devrait être juste les lettres Unicode.
Kobi

En fait, y penser à nouveau - \Plne correspondrait pas aux chiffres, alors je suppose que _|\Wc'est le mieux que vous puissiez faire.
Kobi

18

C # 82 seulement :)

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

Impossible de résister à la tentation d'écrire un programme sans passe-partout dans ma langue préférée.

Un test est disponible ici: http://ideone.com/8bwz7z


Simple ... mais élégant!
Andrew Gray

@ AndrewGray merci pour le commentaire et pour les exigences techniques permissives. C # warmplate ajoute sérieusement au nombre de personnages, le rendant ainsi impossible pour le golf autrement.
Cristian Lupascu

2
Pas de problème. Je suis un collègue C # dev et j'aime écrire du code concis et efficace. C'est dommage qu'il y ait tellement de choses dans la langue ...
Andrew Gray

13

GolfScript, 36 34 31 30 caractères

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

Algorithme similaire à ma solution précédente (Javascript) .

0"0:A[a{"@{>^}+/- Optimisé par Peter Taylor et Howard. Ma version était "/9@Z"{1$<},,2%\;. Howard a fait don de la concaténation de fonctions et Peter Taylor a fait don de XOR pour modulo-2. C'est fondamentalement une méthode générique de comparaison si la valeur est dans une séquence de plages.

{.96>32*-}%(11 caractères) n’est pas vraiment une amélioration par rapport à Javascript .toUpperCase()(14 caractères), d’autant plus qu’il modifie quelques signes de ponctuation étranges qui suivent zdans la table ASCII (ce qui n’importe pas ici).

comme l'a suggéré Peter Taylor, cependant, si nous filtrons d'abord les caractères alphanumériques, nous pouvons convertir en minuscules et en chiffres simplement en définissant un bit dans chaque caractère: {32|}

.-1%=fait tout le levage palindromique lourd. Une partie que je n’apprécie pas vraiment, c’est combien de temps il m’a fallu pour savoir comment inverser un tableau. J'aurais dû lire la documentation. Les deux autres personnages effectuent la gestion et la comparaison des piles.

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


De plus, si je peux supposer qu’aucun des caractères de contrôle suivants n’est présent: (échappement de liaison de données, contrôle de périphérique 1-4, accusé de réception négatif, repos synchrone, bloc de fin de transmission, annulation, fin de support) (nous sommes tous d’accord pour dire que tous assez obscurs) ou si je peux les traiter comme des versions majuscules des chiffres 0 à 9, nous pouvons enregistrer deux autres caractères:

GolfScript, 28 caractères

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

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


2
Vous pouvez vous débarrasser du nettoyage et économiser deux personnages:{"0:A["\{>}+,,2%},
Howard

@ Howard Merci. Je pense que j'ai mal compris +sur des blocs. C'est un truc cool.
John Dvorak

1
Vous pouvez enregistrer trois caractères en inversant le filtre et la standardisation de cas. Vous devez ajouter a{à la liste de caractères du filtre pour inclure les lettres minuscules, mais vous pouvez ensuite utiliser des majuscules {32|}%. Le résultat final est{"0:A[a{"\{>}+,,2%},{32|}%.-1%=
Peter Taylor

Là aussi une autre économie à faire sur le filtre. Compter modulo 2 est xor, 0"0:A[a{"@{>^}+/le travail aussi.
Peter Taylor

@PeterTaylor Si je ne propose pas une autre optimisation bientôt, je devrais probablement me convertir au wiki de la communauté. Merci encore :-)
John Dvorak

8

Javascript, 53 caractères:

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

est une expression javascript qui vaut true si xest un palindrome, false si ce n'est pas le cas. Il suppose que xc'est une chaîne. Si ce n'est pas garanti, préférezx+="",

Voici un fil d'Ariane: En raison de la façon dont reverse()fonctionne,

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

échoue. cependant,

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

est parfaitement bien.


Bonne nouvelle sur la concaténation d'une chaîne nulle! Points pour bons infoz!
Andrew Gray

3
Conseils: +""attribue à une chaîne, +attribue à un nombre |0et ~~attribue à un entier, !!attribue à un booléen.
John Dvorak

Est un personnage plus court avec regex/[^\W_]/g
SuperPrograman

7

R: 66

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

Usage:

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 caractères

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

Cela prend la piqûre à vérifier en tant que premier paramètre et définit le code de sortie à 0 pour palindrome et à 1 pour non.

Échantillon échantillon:

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 (sans compter la signature de la méthode)

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

Un programme complet, avec entrée et sortie, peut être écrit en 74 caractères.

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

Exemple d'utilisation:

$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.txtcontient ces 17 826 mots palindrome)

Cette solution peut être adaptée au python 3 en ajoutant quelques caractères:

Python 3: 55

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

sys.stdin.readest fondamentalement la même chose queraw_input
CalculatorFeline

En Python 3.8, vous pouvez réduire ce nombre à 58 octets.
MilkyWay90

En outre, votre solution Python 2 et 3 est respectivement de 61 et 67 octets.
MilkyWay90

@ MilkyWay90 Vous avez probablement manqué le sans compter la signature de la méthode . En 2013, il était d'usage de ne pas l'inclure. Dans une autre solution, dans cette question, dans d'autres langues, ils l'ont simplement omis et ont supposé que vous aviez une entrée dans une svariable. J'ai décidé de fournir la définition complète mais, comme à l'accoutumée en 2013,
n'inclut

@ Bakuriu Ah, je vois. Cela fait seulement quelques mois que je suis ici, donc je ne connais pas les douanes de 2013
MilkyWay90

7

JAVA (ou la langue la plus prolixe de tous les temps), 102 96 95 car.

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

Utilisation (avec du code non-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!'"));
}

Raccourci avec l'aide du commentaire ci-dessous


1
Bien que je ne connaisse pas Java (je suis assez marrant en C #), ne pourriez-vous pas sauvegarder un personnage en supprimant les accolades du if? EG: if(s==null) return 1==0;? Ou bien Java applique-t-il les curlies sur les ifinstructions?
Andrew Gray

3
Tu as tout à fait raison, j'ai pris ça merci !! ... Je n'ai pas remarqué qu'ils étaient là, je suppose que je suis un développeur Java qui n'a pas C #?
Jsedano

4
1) Vérifier si le paramètre est nullune bonne habitude, mais non pratiquée dans CodeGolf. Comme je peux le constater, personne d'autre ne l'a fait dans cette question. Sauter. 2) L'espace entre les arguments facilite la lisibilité, mais pas le golf. Le retirer; 3) Au lieu de explicitement toLowerCase()utiliser la chaîne equalsIgnoreCase()plus tard au lieu de equals(). De cette façon, vous devez ajuster l'expression régulière, mais toujours 1 caractère plus court. pastebin.com/s7H84faj
manatwork

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

En fait: replaceAll("\\W|_","");supprimer _aussi => 95 caractères
assylias

7

Mathematica 54 53

Un octet enregistré grâce à CatsAreFluffy:

PalindromeQ@StringCases[ToUpperCase@#,WordCharacter]&

Pour ceux avec la version 10.2 ou antérieure:

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

Exemple

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

Vrai


PalindromeQest 1 octet de moins que#==Reverse@#&
CalculatorFeline

Je me demandais pourquoi je ne l'avais jamais vu. Version 10.3!
DavidC

PalindromeQ= #==Reverse@#&
CalculatriceFeline

Oui, j'ai téléchargé la version 10.4 pour l'essayer.
DavidC

C'est dehors? OHNO
CalculatriceFeline

6

J, 30 caractères

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

Usage:

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

Supprime toutes les erreurs et renvoie la valeur par défaut 0b(false).

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

Exemple:

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

edit: rasé trois autres caractères en évitant la variable intermédiaire. H / T, CS. -7: Pas besoin de supprimer les erreurs.


1
intéressant que, avec seulement 3 caractères de plus, mon code soit beaucoup plus lisible :-)
John Dvorak

Un personnage supplémentaire est entré, je l'ai enlevé.
Skeevey

5

Ruby: 43 38 caractères

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

Échantillon échantillon:

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
Vous pouvez même écrires.tr!('^A-Za-z0-9','').upcase!.reverse==s
Howard

Mec, combien de temps j'ai combiné autour de l'utilisation des !méthodes! Tu me tiens incroyable @Howard avec tes astuces.
manatwork

Petit problème cependant, @ Howard. tret tr!semble se comporter différemment quand ils n'ont rien à translittérer: pastebin.com/4YThW2qN Cela fait p['757']planter le test avec «NoMethodError: méthode indéfinie` upcase! ' pour nil: NilClass ”erreur.
manatwork

Oops désolé. Je n'ai pas pensé à ce cas.
Howard

1
peut être raccourci davantage:s=s.upcase.tr('^A-Z0-9','');s==s.reverse
Cristian Lupascu

5

C ++, 107 (mal compté), 100 (mal compté), 81

string s;for(int c:t)if(isalnum(c))s+=c|32;return s==string(s.rbegin(),s.rend());
  • Exploite les modèles de bits ASCII.
  • S'appuie sur un mal using namespace std;.
  • Utilise les bits AND et OR au lieu des opérateurs logiques.
  • Utilise intparce que c'est plus court 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;
    }
    

4

Lua, 56 ans

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

Si %Wquelque chose ressemble \Wà regex, il exclut également les caractères tels que le soulignement. Ceci est indésirable.
John Dvorak

J'ai vérifié, %wn'inclut pas _( %Winclut évidemment, alors)
mniip

1
Seul le corps de la fonction est nécessaire. s=s:lower():gsub('%W','')return s:reverse()==s 46 caractères
Egor Skriptunoff

mais qu'en est-ilfunction(s)
mniip

4

Python 3/2 59 caractères:

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

4

Haskell, 43 ans

En utilisant les bibliothèques standard Control.Monad, Control.Monad.Instanceset Data.Char:

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

Je ne peux pas faire en sorte que cela fonctionne dans ghci. import Data.Char import Control.Monad ap(==)reverse.map toLower.filter isAlphaNumni avec l'ajout d'espaces ou autres, désolé je ne suis pas trop enthousiaste avec Haskell :)
SlimJim

1
@SlimJim: Oups, vous en avez Control.Monad.Instancesaussi besoin . (J'utilise l'instance Reader Monad avec ap, mais cette instance n'est pas exportée par Control.Monad.)
Jon Purdy

4

PHP 60 caractères.

Essayez d'abord le codegolf.

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

Exemple:

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

Les parenthèses entourant le premier opérande de l'opérateur ternaire ne sont pas nécessaires. En réalité, ni l'opérateur ternaire n'est nécessaire, mais une valeur vraie ou fausse dans la représentation de votre langue. Et en évitant la déclaration séparée pour l'affectation à caractère plus $ x 1 peut être raccourci: echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);.
Manatwork

3

Python 2 64 caractères:

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

@manatwork Si vous remplacez tous les identifiants par des identifiants à un caractère, vous obtenez une 77version des caractères. Aucune idée de la raison pour laquelle abhiram a posté la version non-golfée.
Bakuriu

@ Bakuriu, ça ne fait rien, j'ai manqué une déclaration dans la question: «Seuls les corps de méthodes sont nécessaires». Les lignes 2 et 3 ne me donnent que 73 caractères. En ce qui concerne la réduction de longueur supplémentaire, pas besoin de chaîne brute ni du groupe de capture, ce qui re.findall('[a-z0-9]+',input.lower())raccourcit les caractères de la partie 3.
manatwork

@manatwork, j'ai édité le post et changé un peu les variables. Cela l'a ramené à 66. Oui, l'attribut de chaîne brute n'est pas utile ici.
Abhiram

Ok, mais pourquoi insistez-vous sur le groupe de capture dans l'expression régulière? Fonctionne correctement sans: pastebin.com/JzpNRRZU
manatwork

Je pense que cela m'a pris après mon récent projet Python impliquant des "re's" :) Merci de l'avoir signalé.
Abhiram

3

Haskell 48

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

utilisé comme ceci:

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

3

Smalltalk , Squeak / Pharo flavour
116 caractères en utilisant la mise en forme traditionnelle avec des onglets

Vous ajoutez deux méthodes à String:

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

Nous pourrions bien sûr éliminer certains espaces, ou utiliser des noms de méthode plus courts, mais ne trahissons pas l'esprit de Smalltalk.

De plus, cela traitera les palindromes français, comme dans http://fr.wikipedia.org/wiki/Liste_de_palindromes_fran%C3%A7ais , peu de réponses dans cette page peuvent.

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

Réponse intelligente et utile!
Andrew Gray

3

Python 3 (51 caractères)

et peut être Python 2

basé sur la solution d' abhiram (avec un golf plus agressif)

from re import findall

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

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

peut être réduit à 46 caractères, en utilisant RE '\ w'

et variante avec corps fonctionnel extrêmement raccourci (27 caractères)

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 caractères

Mis à jour (voir les commentaires), et peut supprimer les crochets autour de l'expression régulière:

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

Original (56)

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

Original non-golfé:

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

Vous pouvez jouer au golf jusqu'à 47 personnages comme celui-ci:($s=$s-replace'[\W]')-eq(-join$s[$s.length..0])
SpellingD

@SpellingD: Nice! Je suis nouveau au code golf, merci pour l'amélioration
goric

vous pouvez supprimer la parenthèse droite aussi: ($s=$s-replace'\W')-eq-join$s[$s.length..0].
mazzy

2

C ++, 74 octets

Ce code est en fait très élégant et facile à comprendre (lorsqu'il est correctement formaté). Je ne crois pas qu'il soit possible de raccourcir les choses en C ++ et il n'utilise aucune fonction de bibliothèque standard.

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

Exemple d'utilisation:

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

Version joliment formatée:

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 typevotre fonction devrait avoir un type de retour.
Karl Napf

Je parie que cela n'ignore pas la casse, les espaces et les caractères de contrôle.
Titus

Vous pouvez enregistrer un personnage avec while(*++e);au lieu de while(*e)++e;. Mais comme Titus l'a mentionné, cette réponse est invalide.
Nick Matteo

2

PHP, 26 84 80 78 62 63 octets

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

prend les entrées du premier argument de la ligne de commande; imprime 1pour la vérité, chaîne vide pour la fausseté.


I18n est un peu expansif, car il n'y a pas d'alternative multi-octets pour strrev(110 octets; exécuter avec -r):

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

utf8_strrev volé de manière flagrante dans le manuel PHP . Vous voudrez peut-être aussi jeter un coup d'œil à ce billet de blog .


Allez Titus ... Cela échoue la spécification.
Christoph

1
@Christoph Ouais, je devrais parfois bien lire cela. Fixé.
Titus

Hm -Rcauserait des problèmes avec les sauts de ligne dans la chaîne à tester, n'est-ce pas? A partir de la spécification "-R <code> Exécuter PHP <code> pour chaque ligne d'entrée". De plus <?=strrev($s=strtolower(preg_replace("#\W#","",$argn)))==$s;serait plus court.
Christoph

1
@Christoph Belle idée, mais il n'y a pas de $argnsans -R.
Titus

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

1

Ruby, 48 ans

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

Assez simple, et fait à la hâte, donc pas trop au golf. Je vais jouer au golf plus tard.


1

Pylongolf2 , 24 octets

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

cprend l’entrée, ╨2convertir en minuscule.
Je place ensuite une expression rationnelle sur la pile et l’utilise -pour supprimer tous les caractères non alphabétiques de l’entrée.
_duplique l'entrée.
╨1l'inverse et =ensuite les compare.
~imprime la pile à l'extrémité qui imprime soit trueou false.


Cela ignore-t-il la ponctuation, les espaces et les caractères de contrôle?
MickyT

Mon mauvais, cette version ne fait pas. Je le réparerai.

Correction du problème.

1

PowerShell, 194 190 octets

Une implémentation récursive pour montrer comment un script de blocage PowerShell sans nom peut s'appeler.

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

ungolfed:

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

tests:

&$P "Eva, can I stab bats in a cave?"
&$P "Eva, can I stab cats in a cave?"
&$P "A man, a plan, a canal. Panama!"
&$P "A man, a plan, a big shovel, a canal. Panama!"
&$P "Madam, I'm Adam."
&$P "Madam, I'm Adam Corolla."
&$P "757"
&$P "Boeing 757"

Ça ne devrait [^a-z0-9]pas être ça ?
Titus

1

05AB1E , 4 octets (non concurrents)

Non compétitif , car la langue post-date le défi. Code:

álÂQ

Explication:

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

Utilise le codage CP-1252 . Essayez-le en ligne! .


J'ai essayé de l'exécuter via votre lien. La sortie du programme est "1"
Christopher Perry

1

Gelée, 10 personnages (non en compétition)

fØBŒl
UÇ⁼Ç

Retourne 1 si vrai, 0 si faux

Essayez-le en ligne!


Ignore-t-il la casse, les espaces et les caractères de contrôle? Une panne serait bien.
Titus

L'état actuel de Jelly permet de résoudre ce dans 7 octets: fØBŒlŒḂ: ffiltre pour garder ØBl'ensemble [a-zA-Z0-9] et Œlconverti en minuscules, puis ŒḂtest si palindrome.
Steenbergh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.