Considérez la transformation Atbash :
A|B|C|D|E|F|G|H|I|J|K|L|M
Z|Y|X|W|V|U|T|S|R|Q|P|O|N
Où A ⇔ Z et L ⇔ O, par exemple Il y a une propriété intéressante que certains mots partagent. Lorsque certaines chaînes sont traduites en leur équivalent atbash, cette traduction est le mot d'origine inversé. J'appelle ces Self Palindromes Atbash .
Par exemple, traduisons WIZARD :
W → D
I → R
Z → A
A → Z
R → I
D → W
Le résultat est DRAZIW , qui est inversé par WIZARD . Ainsi, WIZARD est un auto-palindrome atbash.
Objectif Étant donné une chaîne de caractères ASCII imprimables, sortir ou renvoyer une valeur véridique si cette chaîne est un auto-palindrome atbash, et une valeur falsey sinon. (Cela se fait via STDIN, équivalent le plus proche, entrée fonctionnelle, etc. Si votre langue ne peut pas faire cela, envisagez de choisir une langue différente, vous pouvez coder en dur l'entrée.) Vous devez le faire sans tenir compte de la casse. Si l'entrée est un palindrome et n'est pas affectée par la séquence atbash, vous devez toujours afficher true, car un palindrome + lui-même est un palindrome. Il s'agit d'un code-golf , donc le programme le plus court en octets l'emporte.
Cas de test
"Input" => true, false
"WIZARD" => true
"Wizard" => true // case doesn't matter
"wIzArD" => true
"W I Z A R D" => true
"W IZ ARD" => false // the atbash of this is D RA ZIW, which is not a palindrome of W IZ ARD
"ABCXYZ" => true // ZYXCBA
"345 09%" => false // is not a palindrome
"ev" => true // ve
"AZGDFSSF IJHSDFIU HFIA" => false
"Zyba" => true
"-AZ" => false // -ZA is not a reverse of -AZ
"Tree vvig" => true // Givv eert
"$%%$" => true // palindrome
"A$&$z" => true // z$&$A
Classement
L'extrait de pile au bas de cet article génère le catalogue à partir des réponses a) en tant que liste des solutions les plus courtes par langue et b) en tant que classement général.
Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
## Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
## Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de code:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=68757,OVERRIDE_USER=44713;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
code {Comment-symbol}{Atbash'ed Comment-symbol} Atbash'ed code
...Réponses:
RX ,
98 octetsFortement inspiré par Retina, je l'ai fait il y a quelques jours. Code:
Explication:
Essayez-le ici !
la source
Pyth,
109 octetsEssayez ce violon en ligne ou vérifiez tous les cas de test à la fois.
Explication
la source
rz0
deux fois, n'est-il pas plus court de l'enregistrer dans une variable?q_Jrz0XJG
est un octet plus court.Julia, 96 octets
Il s'agit d'une fonction lambda qui accepte une chaîne et renvoie une chaîne. Pour l'appeler, affectez-le à une variable.
Non golfé:
la source
Utilitaires Bash + Linux, 56
Génère la chaîne vide pour Truthy et quelque chose comme
- /dev/fd/63 differ: byte 1, line 1
pour Falsey. Si cela n'est pas acceptable, nous pouvons ajouter-s
pour 3 octets supplémentaires et utiliser les codes de retour Unix standard de 0 pour succès (Truthy) et 1 pour échec (Falsey).la source
Rétine , 44 octets
Imprime
1
ou0
. Le nombre d'octets suppose que le fichier est codé en ISO 8859-1.Essayez-le en ligne!
Cette réponse a été largement inspirée par la réponse sed de DigitalTrauma mais là encore, je suppose qu'il n'y a pas beaucoup d'approches à ce défi en premier lieu.
Explication
Chaque fois que vous voyez un
¶
, la première chose que Retina fait après avoir divisé le code en lignes est de remplacer tous ces pilcrows par des sauts de ligne. Cela permet l'inclusion de sauts de ligne pour un seul octet même si les sauts de ligne sont le séparateur d'étape de Retina.Nous commençons par dupliquer l'entrée. Nous faisons correspondre la fin de l'entrée avec
$
et insérons un saut de ligne avec l'entrée elle-même (en utilisant$_
).Une étape de translittération. Commençons par l'expression rationnelle:
.+$
. Il correspond à la deuxième copie de l'entrée (en s'assurant que la correspondance va jusqu'à la fin de la chaîne). Ainsi, seuls les caractères de la deuxième copie seront translittérés. La translittération elle-même utilise certaines fonctionnalités très récentes.l
etL
sont des classes de caractères pour les lettres minuscules et majuscules, respectivement.o
fait référence à l'autre jeu de caractères de la translittération et l'R
inverse. Les deux jeux de caractères s'étendent donc à:Vous remarquerez que cela permute le cas tout en faisant le chiffrement Atbash, mais nous ferons quand même la comparaison finale sans tenir compte de la casse.
Maintenant, nous inversons la deuxième copie. Malheureusement, Retina n'a pas encore de moyen pratique de le faire, nous devrons donc déplacer un personnage de la fin vers l'avant. Pour ce faire, vous devez réaffecter le séparateur de saut de ligne comme marqueur dont la partie n'a pas encore été inversée. Nous faisons correspondre cette partie mais capturons le dernier caractère séparément. Ce personnage passe devant et le reste est inchangé. Le
+
dit à Retina de le faire à plusieurs reprises jusqu'à ce que ce ne soit plus possible (parce que¶
c'est à la fin de la chaîne).Enfin, nous vérifions si les deux chaînes sont identiques. Le
i
rend le modèle insensible à la casse - commodément, dans .NET, cela signifie que les références arrières sont également insensibles à la casse. Vous remarquerez peut-être que nous n'avons plus de séparateur entre l'entrée d'origine et la copie modifiée. Nous n'en avons pas besoin cependant, car ils ont la même longueur, et si la chaîne se compose maintenant exactement de la même chaîne deux fois (jusqu'au cas), alors il doit s'agir de la chaîne d'origine et de la chaîne modifiée. Si vous vous demandez ce qui est arrivé au saut de ligne arrière que nous avons utilisé comme marqueur, il est toujours là, mais dans de nombreuses saveurs d'expression régulière,$
il correspond également avant le dernier caractère de la chaîne si ce caractère est un saut de ligne.Étant donné que cette étape ne se compose que d'une seule ligne, elle est considérée comme une étape de match, qui compte le nombre de matchs. Si l'entrée est un palindrome Atbash, nous obtiendrons exactement une correspondance et la sortie est
1
. Sinon, cette expression régulière ne correspondra pas et la sortie sera0
.la source
\n
en regex et$n
en substitution, mais ce sont des octets gaspillés pour le golf. ;)GNU Sed, 105
Sorties 1 pour vérité et 0 pour falsey.
J'ai essayé de le faire dans Retina, mais je n'ai pas pu trouver comment enregistrer la chaîne avant la translittération Atbash pour une comparaison inverse avec l'after. Il y a peut-être une meilleure façon.
La
y
commande de translittération de Sed laisse beaucoup à désirer.la source
T
- je supposais qu'il s'appliquait à chaque personnage tour à tour, mais si ma compréhension est bonne, il s'applique à l'ensemble de l'espace de modèle, ce qui est beaucoup plus utile[\s\S]+
donc en l'omettant, vous translittérez tout.-r
drapeau pour les contre-obliques dans\(
et\)
. Je suis d'accord avec toi sur lay
commande!𝔼𝕊𝕄𝕚𝕟, 15 caractères / 30 octets
Try it here (Firefox only).
Explication
la source
Parenthétique, 658 octets
Fonctionne uniquement pour toutes les majuscules sans espace pour le moment, en utilisant cette version modifiée du script pour qu'il prenne en charge la lecture depuis stdin:
Explication
la source
Python 3,
9085 octetsNous convertissons l'entrée en majuscules, puis calculons la chaîne Atbashed en soustrayant toutes les ordinales de 155 si elles sont dans la plage alphabétique majuscule.
la source
Kerf , 73 octets
Kerf est un langage propriétaire de la même famille générale que APL, J et K. Il est possible d'écrire des oneliners cryptiques et compacts et d'éviter l'utilisation de boucles explicites:
Cependant, l'utilisation des alias épelés pour les commandes au lieu des symboles abrégés et l'utilisation d'identificateurs significatifs rendent le programme beaucoup plus clair et assez facile à suivre même si vous n'êtes pas familier avec Kerf:
En action:
Kerf ne va probablement pas gagner une tonne de compétitions de codegolf, en particulier contre les langages conçus à cet effet, mais cela pourrait valoir la peine d'être modifié si vous aimez l'idée des langages de la famille APL mais trouvez la syntaxe trop bizarre. ( Avertissement: je suis l'auteur du manuel de référence pour Kerf. )
la source
Prolog, 121 octets
Ceci est appelé avec un atome en entrée, par exemple
a('WIZARD').
.la source
JavaScript (ES6), 91
TESTER
la source
C,
10197 octetsComme la question spécifiait des caractères ASCII, cela ne gère aucun autre encodage.
Explication
Nous créons un pointeur
p
qui commence à la fin de la chaîne. Nous bouclons ensuite, nous déplaçant tous les deuxs
et l'unp
vers l'autres
jusqu'à la fin. Cela signifie que chaque paire de caractères sera vérifiée deux fois, mais cela économise quelques octets par rapport à l'arrêt dès que les pointeurs se croisent.À chaque itération, nous vérifions s'il
*p
s'agit d'une lettre. Si c'est le cas, vérifiez que*s
c'est dans la plage de lettres (ASCII 64 vers le haut), et que*p
et*s
ajoutez jusqu'à 27 (mod 32). Les non-lettres supérieures à 64 échoueront à ce test, nous n'avons donc pas besoin de vérifierisalpha(*s)
.S'il
*p
ne s'agit pas d'une lettre, nous testons simplement si elle est égale à*s
. Dans les deux cas, nous terminons la boucle avants
etp
traversons.Si
s
etp
ont traversé, alors chaque paire de lettres correspondait correctement, donc nous retournons vrai; sinon nous retournons faux.Programme de test
Passez les chaînes à tester comme arguments de ligne de commande. Cela produit une sortie correcte pour tous les cas de test. Il n'y a aucune exigence fournie pour la chaîne vide; mon implémentation renvoie false pour cette entrée.
la source
f
la déclaration de type pour un prototype de style K&R:f(char*s)
Perl 5, 70 octets
Un sous-programme:
Voyez-le en cours d'utilisation:
la source
MATL, 23 octets
Utilise la version actuelle .
Exemples
la source
CJam, 18 octets
Essayez-le en ligne
Fonctionne en convertissant les entrées en majuscules, en effectuant la traduction des lettres, en retournant la chaîne et en vérifiant l'égalité.
la source
Japt,
3027 octetsEssayez-le en ligne!
Comment ça marche
Ceci est basé en grande partie sur ma réponse Japt sur Swap the Alphabet.
la source
Python,
156112 octetsFondamentalement, il fait un dictionnaire de la traduction avec des lettres majuscules et l'entrée est en majuscule (si tout était en minuscule à la place, cela ajouterait 5 octets). Ensuite, pour chaque caractère de l'entrée en majuscule, effectuez la traduction et ajoutez-le à une liste à moins que le caractère ne soit pas dans l'alphabet, auquel cas ajoutez le caractère tel quel. Rejoignez la liste entière et comparez-la à la liste inversée.
Merci à @Artyer pour avoir posté presque exactement comme j'allais poster avant moi. Mais je dois confirmer, c'est mon travail et je l'ai fait indépendamment .
Basé sur la réponse de Julia par Alex A. Essayez-le ici
la source
.get(i,i)
. +1.05AB1E , 8 octets (non concurrents)
Ce langage utilise des fonctionnalités postérieures au défi et n'est donc pas concurrentiel.
Code:
Explication:
Essayez-le en ligne!
la source
Facteur,
118113octetsIl s'agit d'une fonction anonyme.
Je ne connais pas de moyen plus court pour générer un tableau associatif de l'alphabet: c
la source
Clojure, 100 octets
Il devrait être possible de le réduire à une seule fonction anonyme, coupant environ 10 octets de plus (de déclarations) mais je n'ai pas encore trouvé de moyen.
la source
Rubis,
7977 octetsAccepte le mot à tester comme argument de ligne de commande. Quitte avec le code 0 (qui est véridique pour le shell) si l'argument est un auto palindrome atbash, ou avec le code 1 sinon.
la source
puts
résultat ne serait-il pas plus court que de sortir avec un ternaire?$*
est un alias pourARGV
.Rubis, 56 octets
C'est une fonction anonyme qui prend une chaîne et retourne
true
oufalse
. C'est plutôt maladroit: pour économiser quelques octets, il utilise la variante destructrice deupcase
(avec un!
après).upcase!
renvoie malheureusementnil
si rien n'est changé (comme toutes les entrées numériques), donc certains octets sont perdus en essayant de gérer cela. Fonctionne toujours tho :)la source
MATLAB, 61 octets
Pas la solution la plus courte, mais toujours intéressante
la source