Il y a eu plusieurs tentatives précédentes pour poser cette question, mais aucune n’est conforme aux normes modernes sur ce site. Par discussion sur Meta , je le republie de manière à permettre une concurrence loyale dans le cadre de nos règles modernes.
Contexte
Un palindrome est une chaîne qui "lit la même chose en avant et en arrière", c'est-à-dire que l'inverse de la chaîne est identique à la chaîne elle-même. Nous ne parlons pas de "palindromes commodes" ici, mais d'un renversement strict caractère par caractère; par exemple, ()()
n'est pas un palindrome, mais l' ())(
est.
La tâche
Ecrivez un programme ou une fonction prenant une chaîne S (ou l’équivalent approprié dans votre langue) en entrée et ayant une sortie Q (du type de votre choix). Vous pouvez utiliser tout moyen raisonnable pour saisir l’entrée et fournir la sortie.
- Lorsque l'entrée S est un palindrome, la sortie Q doit avoir une valeur A (identique pour tous les palindromes S ).
- Lorsque l'entrée S n'est pas un palindrome, la sortie Q doit avoir une valeur B (identique pour tout S non palindromique ).
- A et B doivent être distincts l'un de l'autre.
Ou en d'autres termes: mappez tous les palindromes sur une valeur et tous les non-palindromes sur une autre.
De plus, le programme ou la fonction que vous écrivez doit être un palindrome lui-même (c'est-à-dire que son code source doit être palindrome), ce qui en fait un défi à source restreinte .
Des clarifications
- Bien que
true
etfalse
soient des choix évidents pour A et B , vous pouvez utiliser deux valeurs distinctes pour vos sorties "is a palindrome" et "not a palindrome", qui ne doivent pas nécessairement être booléennes. - Nous définissons l'inversion de chaîne au niveau du caractère ici;
éé
est palindromique, que le programme soit codé en UTF-8 ou en Latin-1, même s'il ne s'agit pas d'une séquence d'octets palindromique après le codage UTF-8. - Cependant, même si votre programme contient des caractères non-ASCII, il ne doit fonctionner que pour une entrée ASCII. Spécifiquement, l’entrée S ne contiendra que des caractères ASCII imprimables (y compris l’espace, mais pas la nouvelle ligne). Cela signifie notamment que si vous traitez l'entrée comme une séquence d'octets plutôt qu'une séquence de caractères, votre programme sera toujours conforme à la spécification (sauf si le codage d'E / S de votre langue est très étrange). En tant que tel, la définition d'un palindrome dans la puce précédente importe uniquement lorsque vous vérifiez que le programme a une forme correcte.
- Cacher la moitié du programme dans un commentaire ou un littéral de chaîne, tout en étant peu créatif, est légal; vous êtes marqué sur la longueur, pas sur la créativité, alors n'hésitez pas à utiliser des méthodes «ennuyeuses» pour vous assurer que votre programme est un palindrome. Bien sûr, étant donné que votre score est long, certaines parties de votre programme qui ne font rien vont l’aggraver. Par conséquent, être capable d’utiliser les deux moitiés de votre programme sera probablement utile si vous pouvez le gérer. .
- Le critère de victoire étant mesuré en octets, vous devez spécifier le codage dans lequel votre programme est écrit pour pouvoir le marquer (bien que dans de nombreux cas, le codage que vous utilisez sera évident).
Critère de victoire
Même si le programme doit être un palindrome au niveau du personnage, nous utilisons des octets pour voir qui gagne. Plus précisément, plus votre programme est court, mesuré en octets, mieux c'est; c'est un défi de code-golf . Pour permettre la comparaison des soumissions (en particulier des soumissions dans la même langue), placez un nombre d'octets pour votre programme dans l'en-tête de votre soumission (plus un nombre de caractères, s'il diffère du nombre d'octets).
(
para
et)
avecb
. Estabab
un palindrome? Non, il faudrait que ce soitabba
. Alors ce()()
n'est pas un palindrome non plus; il faudrait que ce soit())(
.()() is not a palindrome, but ())( is.
Félicitations, vous êtes arrivé sur reddit!Réponses:
Brachylog (2), 3 octets dans la page de codes de Brachylog
Essayez-le en ligne!
Il s'agit d'un programme complet qui prend une entrée via une entrée standard (en utilisant la syntaxe de Brachylog pour les constantes, c'est-à-dire que les chaînes sont entourées de guillemets), et une sortie via une sortie standard. Les sorties sont
true.
pour une entrée palindromique etfalse.
pour une entrée non palindromique.Non seulement ce programme est-il palindrome, mais il présente également une symétrie miroir gauche / droite (et probablement dans certaines polices haut / bas).
Explication
Dans Brachylog, les lettres majuscules marquent des points du programme qui ont des valeurs identiques; ceci est utilisé presque comme un circuit électrique pour transporter des informations d'une partie du programme à une autre. L'une des conséquences est que, si vous placez une commande entre une paire identique de lettres majuscules, vous affirmez en réalité que l'entrée et la sortie de la commande sont identiques. Brachylog prend implicitement une entrée, donc dans ce cas, nous affirmons également que l'entrée de la commande est la même que celle du programme. Dans ce programme, nous utilisons la commande
↔
, qui inverse les choses (dans ce cas, les chaînes); de sorte que le programme affirme effectivement que l'entrée est la même en avant et en arrière.Un programme complet (par opposition à une fonction) dans Brachylog renvoie un booléen,
false.
s'il n'existe aucun moyen de corriger toutes les assertions contenues dans le programme en même temps, outrue.
si les assertions du programme sont toutes compatibles les unes avec les autres. Nous n’avons ici qu’une affirmation - inverser l’entrée ne la change pas - le programme agit donc comme un vérificateur de palindrome.la source
Pyth , 3 octets
Renvoie Vrai ou Faux .
Essayez-le en ligne!
Comment ça fonctionne
la source
_
?Python , 39 octets
Essayez-le en ligne!
C'est ennuyeux, mais s'il y a plus court en Python, ce sera impressionnant.
la source
(
,)
y a quelques bonnes (et déroutantes) entrées :)Gelée , 5 octets
Retourne 1 ou 0 . La première ligne est un lien d'assistance non exécuté, la deuxième ligne appelle le test du palindrome.
Essayez-le en ligne!
la source
Gelée , 5 octets
Essayez-le en ligne!
Égale inverse et inverse égal.
Ou le plus efficace mais moins esthétique:
ou
la source
Mathematica, 23 octets
Pas très intéressant, mais dans un souci de complétude ...
Ce qui précède est un
CompoundExpression
qui évalue àPalindromeQ
, un intégré qui résout le défi.QemordnilaP
est simplement un identifiant indéfini, qui est ignoré à cause du;
.la source
Haskell,
87854434 octetsExplication:
((->) a)
est une instance de Applicative (grâce @faubiguy), avec<*>
défini commeDonc, en substituant dans les arguments, on peut voir pourquoi cela fonctionne.
la source
--
est un commentaire.(==)
,reverse
et desid
fonctions (id
est la fonction d'identité).<*>
place<$>
et en supprimant le<*>id
05AB1E , 3 octets
Code:
Explication:
Utilise le codage CP-1252 . Essayez-le en ligne!
la source
ÂQ
PHP, 55 octets
De plus, le nom de la langue est un palindrome alors ... des points bonus!
la source
MATL , 7 octets
Essayez-le en ligne!
Renvoie [1; 1] pour l'entrée palindromique et [0; 0] sinon.
la source
Pip ,
12 à11 octetsMaintenant, sans commentaire!
Prend l'entrée en tant qu'argument de ligne de commande; sorties
1
pour palindrome,0
pour non-palindrome. Essayez-le en ligne!Le noyau de ce que nous voulons faire est
RVaQa
:reverse(a) string-equals a
. Le codex:RVaQa
calcule ce résultat et l'assigne àx
.VR:x
Assigne ensuite la valeur dex
à la variableVR
. Comme cette affectation est la dernière instruction du programme, sa valeur est également imprimée automatiquement. Voila!Pour une version intéressante précédente utilisant un comportement non défini, voir l'historique des révisions.
la source
Perl 6 , 25 octets / caractères utf8
L'essayer
la source
R,
111103 octetsPas la réponse la plus originale.
#
est le caractère de commentaire dans RUngolfed:
La chaîne de caractères de
scan
est convertie en octets bruts grâce à lacharToRaw
fonction. Ces octets bruts sont comparés un par un à leurs équivalents à partir de larev()
fonction, ce qui inverse l'ordre de son argument. La sortie de cette partie est un vecteur deTRUE
et / ouFALSE
.La
all
fonction affiche alorsTRUE
si tous ces éléments sontTRUE
Ici,
"\n"
dans lascan
fonction est nécessaire pour les entrées avec plus d'un mot.Réponse précédente (en octets), 81 octets
avec - 24 octets grâce à @rturnbull .
la source
charToRaw
conversion avant l'affectations
, et en modifiant la façon dont vous définissez l'sep
argument commescan
all((s<-charToRaw(scan(,"",,,"\n")))==rev(s))#))s(ver==)))"n\",,,"",(nacs(waRoTrahc-<s((lla
éé
dans un encodage UTF-8, mais je ne pense pas que cela enfreigne les règles du défi.)éé
avec unlatin1
encodage.RProgN , 11 octets
La première moitié de ce travail fait le gros du travail, et par commodité de RProgN, la seconde moitié est un no-op.
Essayez-le en ligne!
la source
Rétine , 53 octets
Le nombre d'octets suppose un codage ISO 8859-1.
Essayez-le en ligne!
Je suis à peu près sûr que ce n'est pas encore optimal (la
»
ligne semble particulièrement inutile et j'ai une solution à 45 octets qui est palindromique à l'exception d'un caractère), mais je suppose que c'est un début.la source
GNU sed ,
6459 + 1 (indicateur r) = 60 octets UTF-8Il m'a fallu un certain temps pour trouver une réponse sed qui n'utilise pas de section de commentaire pour transformer le code en palindrome. Au lieu de cela, j'utilise la
c
commande qui imprimera la première moitié du code dans l'ordre inverse, seulement je m'assure que cette instruction n'est pas atteinte.Le script s'imprime
1
si la chaîne d'entrée n'est pas un palindrome (pensez-y comme une erreur). Si la chaîne est un palindrome, aucune sortie n'est donnée (pensez-y comme une sortie réussie).Exécuter des exemples: ou essayez-le en ligne!
Explication:
la source
-r
ne fonctionne pas, mais vous pouvez simplement envelopper le tout dans BASH. Essayez-le en ligne!Alice , 19 octets
Essayez-le en ligne!
Impressions
Jabberwocky
pour les palindromes et rien pour les non-palindromes. Fonctionne pour une entrée UTF-8 arbitraire.Explication
S'agissant d'une tâche de traitement de chaîne, Alice devra opérer en mode ordinal pour la résoudre. Cela signifie à son tour que le pointeur d'instruction doit se déplacer en diagonale et que nous avons donc besoin d'au moins deux lignes pour que l'adresse IP puisse rebondir de haut en bas. Le saut de ligne dans un tel programme constitue un bon emplacement pour placer le personnage central du palindrome. Cela signifie que la deuxième ligne doit être l'inverse de la première. Mais comme nous n'exécutons que tous les autres caractères de chaque ligne, si nous nous assurons que la longueur de la ligne est impair, l'inverse du code s'intégrera parfaitement dans ses propres espaces. Le seul caractère qui n'est pas du tout utilisé est la barre oblique inversée, mais comme c'était arbitraire, je l'ai choisi pour que le programme soit beau et symétrique.
De toute façon, le code pertinent est le suivant:
Qui est exécuté en zigzag de gauche à droite.
la source
Haskell , 34 octets
Essayez-le en ligne! Appeler avec
f "some string"
, retourneTrue
ouFalse
.L'
=<<
opérateur sur les fonctions fonctionne commef=<<g = \s -> f (g s) s
si le code était équivalentf s=s==reverse s
, ce qui, comme je viens de le remarquer, entraînerait le même nombre d'octets.Version sans commentaire: (49 octets)
Essayez-le en ligne!
Appeler avec
p "some string"
. Ceci sortFalse
si la chaîne donnée est un palindrome, etTrue
si ce n'est pas un palindrome.Explication:
J'ai trouvé ce commentaire gratuit sur palindrome en commençant par la version commentaire et en remplaçant le commentaire par une nouvelle ligne:
La deuxième ligne échoue car les parenthèses ne correspondent pas. Nous devons donc nous en débarrasser. Si nous avions une fonction
e
qui vérifie l'égalité, alorspermettra à la fois compiler avec la deuxième ligne définissant un infix-opérateur
<<=
qui prend deux argumentsesrever
ete
et renvoie la fonctionp
.Pour définir
e
la fonction d’égalité, on écrit normalemente=(==)
mais)==(=e
ne compile pas à nouveau. Au lieu de cela , nous pourrions explicitement prendre deux arguments et de les transmettre à==
:e x y=x==y
. Maintenant, le code inversé esty==x=y x e
compilé mais redéfinit l'==
opérateur, ce qui entraîne l'e x y=x==y
échec de la définition . Cependant, si nous passons à l'opérateur d'inégalité/=
, la définition inversée devienty=/x=y x e
et définit un=/
opérateur qui n'interfère pas avec l'/=
opérateur d' origine .la source
OIL , 178 octets
Lit une entrée, l'explose, ajoute lentement sa longueur (en incrémentant et en décrémentant) à l'adresse à connaître après la chaîne, saute à une partie de code différente (au milieu), inverse le sens de la bande, implode la chaîne à nouveau, et vérifie si c'est la même chose que la chaîne d'origine. TL; DR: C'est pénible, comme d'habitude.
Sortie
40
si la chaîne n'est pas un palindrome,0
si c'est le cas.la source
Javascript, 64 octets
Fonction d'appel
f
avec chaînela source
f
, votre code n'attribue pas la fonction de flèche à une variable et ne peut donc pas être appeléJapt ,
72 octetsExécuter
Ancienne solution:
Essayez-le en ligne!
Explication
Japt n'échappe pas aux fonctions sauf si une parenthèse fermante (ou un espace) est atteinte.
Cela peut être réécrit:
U¥Uw(U¥U)
→U¥Uw
→U==Uw
. Dans Japt, les parenthèses laissées au début et à la fin d'une fonction sont insérées automatiquement.la source
w
une fonction ne prend pas d'argument, comment s'applique-t-elleU
? Est-ce quelque chose commeU.reverse()
?U
de la même manière queU.reverse()
.Utilitaires Bash + Unix, 49 octets
L'entrée est passée en argument.
La sortie est renvoyée dans le code de résultat - 0 pour un palindrome, 1 pour un non-palindrome.
Peut-être que quelqu'un peut faire mieux et ne pas simplement compter sur un commentaire pour rendre le code lui-même palindromique.
Essayez-le en ligne!
la source
[[ $1 = `rev<<<$1` ]]
est plus courte. ([[
Syntaxe Bash , pas de citation nécessaire)rev<<<$1
sont nécessaires même dans la[[...]]
solution. Testez-le avec la chaîne d'entrée'[$]]$['
(qui est un palindrome). Avec ces citations ajoutées pour que cela fonctionne, votre solution a la même longueur que ma solution.==
dans[[
serait interprété comme uncase
motif semblable.> <>, 11 octets
Essayez-le ici!
Renvoie "\ nquelque chose sent le poisson ..." sur un palindrome valide, aucune sortie sur un palindrome invalide. Placez le palindrome sur la pile.
la source
Java -
171169160 octetsLe commentaire à la fin est d'en faire un palindrome. Retourne
P(alindrome)
quand l'entrée est palindrome etN(ot)
quand non.Version non-golfée:
2 octets sauvegardés grâce à @DLosc
Merci à @Olivier Grégoire pour avoir signalé le nombre incorrect d'octets! Fixé maintenant
la source
int
s au lieu dechar
s.'P'
et 78 pour,'N'
ou utiliser différents caractères pour enregistrer encore plus d'octets.new StringBuffer(s).reverse()+""
place denew StringBuffer(s).reverse().toString()
int
au lieu debool
?Java 8,
9290 octetsCeci est une version de commentaire. Si une chaîne contient son contraire, il s'agit d'un palindrome (
true
), sinon ce n'est pas le cas (false
).Essayez-le en ligne!
Mise à jour
;
« sla source
s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s
. Essayez-le en ligne 90 octets .En fait , 5 octets
Essayez-le en ligne!
La sortie vérité est
[1]\n[1]
, et la sortie falsey est[]\n[]
(dans les deux sorties,\n
représente une nouvelle ligne littérale).Explication:
la source
C ++, 154 octets
Je dois dire que la déclaration inverse était coûteuse, mais je ne peux pas imaginer grand chose à faire pour changer cela. Être capable de couper les std:: symboles me sauverait environ 10 caractères, mais "en utilisant namespace std;" est un peu plus.
Je suppose que C ++ n'était pas vraiment destiné à la brièveté.
la source
Prolog, 44 octets
Ceci utilise des grammaires à clauses définies. C'est en fait une grammaire sans contexte complet:
Usage:
la source
CJam, 13 octets
Explication:
Exemple:
la source
l_W%#e#%W_l
J, 15 octets, 15 caractères
Retourne 1 si palindrome, 0 sinon.
Sortie:
Explication:
la source