Si vous avez déjà essayé d’écrire du code palindromique, vous sauriez combien de crochets ont tendance à vous gêner. ()()
n'est pas un palindrome, même si elle ressemble un peu comme il devrait être, tout ())(
et ()(
sont à la fois palindrome et à la fois très stupide regarder. Ne serait-ce pas pratique si c'était l'inverse?
Une chaîne est commodément palindromique si elle est égale à la chaîne dérivée lorsque son inverse a toutes ses parenthèses ( ()
), crochets ( []
) et accolades ( {}
) retournés. Aucun autre caractère n'est spécial et nécessite de basculer. ( <>
sont parfois jumelés mais souvent pas, ils sont donc laissés de côté.)
Votre tâche consiste à écrire, dans votre langue, un programme (prenant une entrée sur STDIN) ou une fonction (prenant un seul argument de chaîne) qui (a) donne une valeur vraie cohérente * lorsque son argument est commodément palindromique et une valeur différente, cohérente valeur autrement, et (b) est elle - même idéalement palindromique.
Par exemple, les entrées suivantes sont commodément palindromiques:
racecar
(a)(bb)(a)
void main(int argc, *char[] argv) {} (vgra []rahc* ,cgra tni)niam diov
Et ce qui suit ne sont pas:
non-palindrome
A nut for a jar of tuna?
(old [style] parens) )snerap ]elyts[ dlo(
ingirumimusnocte)etconsumimurigni
Vous ne pouvez pas vous fier à un état externe (nom de fichier spécifique, structure de répertoire, autre entrée utilisateur, accès Web, etc.) à l'exception des indicateurs interprète / compilateur.
En outre, vous ne pouvez pas utiliser "l'astuce de commentaire" pour commenter ou rendre du code inutilisé en tirant parti des fonctionnalités de commentaire de votre langue. Par exemple, tous les éléments suivants ne sont pas autorisés, car ils contiennent des parties non fonctionnelles qui peuvent être supprimées ou détruites en toute sécurité (au détriment de la perte commode-palindromique):
{some code} // {edoc emos}
{some code} NB.BN {edoc emos}
"n\" ;{edoc emos} ;"; {some code}; "\n"
Évidemment, cela ne couvrira peut-être pas tous les cas de ce genre, mais l’esprit du défi ici n’est pas d’utiliser des commentaires et du code non analysé ** pour obtenir la couleur claire, mais plutôt d’utiliser les parenthèses et parenthèses corrigées. Je te regarde, LISP, Brainfuck.
C'est un code-golf , donc le code le plus court gagne, mais toutes les longueurs de code sont les bienvenues.
* Par valeurs vraies et fausses cohérentes, je veux dire que vous pouvez renvoyer une paire de valeurs, telles que 1
vrai et 0
faux, ou False
vrai et "no"
faux, tant que ces valeurs sont différentes les unes des autres et qu'elles ne le sont pas. changez d'une exécution à l'autre de votre programme. Utilisez tout ce qui vous sauve des personnages.
** Ne pas confondre avec non exécuté : un code valide qui pourrait faire des choses étranges mais jamais appelé convient.
la source
if(false){some code}
ou des variables non utilisées? Sont-ils autorisés?(eslaf)fi
, vous devez l’utiliserif(false)
.()()
n'est pas un palindromeRéponses:
J (60)
C'est une fonction qui prend un argument:
Explication:
f :: g
exécute la fonctionf
sur l'entrée et renvoie le résultat s'il renvoie sans erreur. Sif
échoue, il s'exécute à lag
place.La
f
voici(|.-:'())([]][{}}{'&charsub)
, qui fait le travail réel:|.
: sens inverse-:
: est égal à'())([]][{}}{'&charsub
: remplacement de chaque support par son support opposég
fonction is(busrahc&'}{{}][[])(()':-.|)
, ce qui est absurde, mais syntaxiquement valide.busrahc
n'est pas défini, mais cela n'a pas d'importance, car il n'est résolu que lorsqu'il est exécuté (et il ne fonctionnera pas).la source
f :: g
eng@-@f
.g
est équivalent au crochet à(-.|)
cause des:
sorties -1 et de la liste vide pour palindromique et non, respectivement.GolfScript,
10791Les nouvelles lignes sont artistiques.
fi
,c43
etc
sont noops, mais le code entier est exécuté.Imprime
-3-1-1
pour des palindromes pratiques,-4-1-1
sinon. Essayez-le en ligne!Version alternative, 155 octets
Au prix de 64 octets, cela peut être amélioré sur:
Comme précédemment, tout le code est exécuté et chaque octet affecte la sortie.
Imprime
010
pour des palindromes pratiques,-100
sinon. Essayez-le en ligne!Tests et exemples
Comment ça marche
la source
Ruby, 110
Imprime
true
si l'entrée est un palindrome pratique etfalse
si ce n'est pas le cas. Notez que cette solution suppose que l'entrée n'est pas terminée par une nouvelle ligne. Testez-la donc avececho -n
:Ceci est un port assez simple de ma réponse à Palindromic Palindrome Checker (et pas vraiment joué au golf jusqu'à présent). L'astuce principale utilisée est que la première expression entre parenthèses est toujours renvoyée
1
. La seconde partie de l'expression booléenne n'est donc jamais évaluée (mais analysée).La seule difficulté à adapter cela consistait à trouver comment ajouter l'appel
z.tr
afin que son "retour commode" soit également valide sur le plan syntaxique - mais je pourrais simplement utiliser le même truc que celui que j'avais déjà utilisé:,*
qui est analysé comme Opérateur Splat (utiliser le contenu du tableau comme paramètres de fonction) et comme opérateur de multiplication (ou de répétition) du tableau dans la seconde moitié.Ruby, 157
297, tout code exécutéCette version (légèrement plus longue) exécute tout le code et toutes les lignes sauf deux affectent la sortie imprimée à la dernière ligne - mais toutes les lignes sont analysées et exécutées sans erreur. Cette version interprète les retours à la ligne de fond comme partie intégrante de l’entrée.
echo -n
Vous devez donc les tester ou ajouter une nouvelle ligne à vos entrées. Il imprimetrue
si l'entrée est un palindrome commode, etfalse
sinon.Explication
la source
GolfScript, 61 caractères
OK, voici une solution de base dans GolfScript. Je suis sûr que cela pourrait encore être amélioré:
Comme d'habitude pour GolfScript, ce programme lit son entrée depuis stdin. Il produit:
si l'entrée est un palindrome commode, tel que défini dans le défi ci-dessus, et:
si ce n'est pas le cas.
Explication: Ce programme s'appuie fortement sur la décision selon laquelle le code non exécuté est correct, à condition qu'il soit analysé. Il se compose de deux blocs de code, délimités par des accolades (
{ }
), qui sont des images inversées l’une de l’autre.Le premier bloc de code est exécuté de la manière
~
suivante et vérifie si l'entrée est un palindrome convenable, en indiquant1
si c'est le0
cas ou non. Le deuxième bloc de code n'est pas exécuté et reste donc simplement sur la pile jusqu'à la fin du programme et jusqu'à ce que tout ce qui est sur la pile soit automatiquement codifié et imprimé par l'interpréteur GolfScript.Il convient de noter que l’interprète GolfScript effectue très peu de vérifications de syntaxe au moment de l’analyse (ou jamais, d'ailleurs); un littéral de bloc de code GolfScript peut contenir presque tout, même s'il risque de se bloquer lorsqu'il est exécuté. Néanmoins, quelques erreurs de syntaxe, telles que des littéraux de chaîne non terminés, génèrent une erreur même dans du code non exécuté, donc je crois que cette solution relève (à peine) des règles.
Ps. En examinant le code réellement exécuté, il contient quelques éléments palindromiques pratiques, tels que
@[.]@
le littéral chaîne"([{}])"
et même la boucle%{ ... }%
. Ceci offre la suggestion alléchante qu’une solution GolfScript "intrinsèquement palindromique", dans laquelle le programme palindrome complet serait exécuté et fonctionnel, serait en réalité possible. Comme je n’ai pas encore réussi à en produire un, j’offre par la présente une prime de +100 représentants à la première personne qui parvient à en créer un!la source
"n\";X;";X;"\n"
sorte de commentaire, mais je vous donnerai le bénéfice du doute. Cependant, je cherchais avant tout de telles solutions "intrinsèquement palindromiques", ou du moins, celles où la non-exécution des blocs était un peu plus sournoise.1;
). Cela compte-t-il toujours comme totalement fonctionnel?JavaScript (ES6), 245 octets
Je voulais une réponse JS pouvant être exécutée dans le navigateur, la voici donc.
En supprimant tout le code qui n'est jamais réellement exécuté, nous obtenons ceci:
Ce qui peut être simplifié à ceci:
la source
n1=>n1==(('',n1))['nioj','split']``['esrever','map'](c=>`()[]{}`[`()[]{}`['indexOf'](c)^1]||c||[1^(c)['fOxedni']`{}[]()`]`{}[]()`>=c)['pam','reverse']``['tilps','join']((1n,''))==1n>=1n
(185 octets)Javascript (ES6) 288
S'exécute dans le shell de ligne de commande Spidermonkey . Lit une seule ligne à partir de STDIN et en sort
true
oufalse
selon que l’entrée est un palindrome commode.Ce code est syntaxiquement valide, mais tout ce qui suit
&&
n'est pas exécuté, car laprint
fonction renvoie une valeur de falsey.Vous pouvez exécuter ce code dans la console de Firefox en exécutant d'abord ce shim pour émuler les fonctions
readline
etprint
. Éditez l'entrée à l'intérieurreadline
si nécessaire:Et voici un exemple rapide de la sortie:
la source
&&
était vraiment intelligent, je vous félicite (mais cela semble un peu tricheur)05AB1E, 35 octets
Essayez-le en ligne!
Explication:
la source
"()[]{}"
vous pouvez le fairežu„<>-
q
analysé au moins après sa validité syntaxique? Sinon, je considérerais que cela revient à commenter la seconde moitié du code.CJam, 38 octets
Imprime
"=re%W_@%W_q"1
si la saisie est palindromique ou"=re%W_@%W_q"0
non.Essayez-le en ligne dans l' interprète CJam .
Comment ça marche
Après avoir exécuté le programme, CJam imprime automatiquement les trois éléments de la pile: la chaîne inspectée, le booléen de la comparaison de chaîne et la chaîne vide.
la source
Perl, 83 + 2 = 85 octets
Courir avec
-nl
Le code se ferme après avoir imprimé la véracité de l'entrée. Tout ce qui est interprété après le point-virgule est interprété (et se bloque lorsque le script atteint ce point si ce n’est pas le cas
exit
), mais n’est pas exécuté. Si je ne tenais pasexit;tixe;
compte du code, le résultat serait toujours imprimé correctement avant le crash.la source