Un changement de César est probablement quelque chose que nous connaissons tous.
(Vous pourriez même le faire comme devoir. Si c'est le cas, veuillez ne pas copier ces réponses, votre professeur ne veut certainement pas quelque chose comme les réponses ici.)
Au cas où vous ne le seriez pas, un changement de César est une forme de chiffrement très simple. Il faut une chaîne à chiffrer et un entier. Ensuite, pour chaque caractère alphabétique de la chaîne, effectuez la transformation suivante:
- Déterminez la position du personnage dans l'alphabet (basé sur 0).
- Ajoutez à ce nombre l'entier reçu au début.
- Alors que le nombre est supérieur à 25, soustrayez-en 26.
- Déterminez la position de l'alphabet dans lequel il se trouve.
Laissez le reste des personnages inchangé.
Les majuscules doivent être respectées car qu'est-ce que l'anglais sans majuscules?
Exemples:
abcdefghijklmnopqrstuvwxyz 1 -> bcdefghijklmnopqrstuvwxyza
Spam spam spam sausage and spam! 13 -> Fcnz fcnz fcnz fnhfntr naq fcnz!
abcdefghijklmnopqrstuvwxyz 52 -> abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz -1 -> zabcdefghijklmnopqrstuvwxy
ABCxyz 3 -> DEFabc
Hypothèses
- Vous pouvez recevoir n'importe quel caractère ASCII imprimable
- Le nombre d'entrée peut être négatif et sera toujours supérieur à -128 et inférieur à 128 (
-128<x<128
)
- Vous devez être en mesure de coder les majuscules et les lettres non majuscules de manière réversible.
- Vous devez créer un programme complet, pas seulement une fonction ou un extrait
- Vous obtiendrez votre contribution de STDIN ou de son remplaçant le plus proche
- Vous pouvez choisir le format de votre contribution, veuillez l'indiquer dans votre réponse
Les caractères qui doivent être réorientées sont codepoints ASCII 0x41 - 0x5A
et 0x61-0x7A
- majuscules et minuscules
- Les lettres majuscules doivent rester en haut
- Les lettres minuscules doivent rester plus basses
- Les caractères ne se trouvant pas dans cette plage doivent être laissés tels quels
Remarque pour ce défi, vous n'avez qu'à chiffrer les chaînes, vous n'avez pas à être en mesure de les résoudre automatiquement (mais donner -x
inversera le chiffrement)
Puisqu'il s'agit d'un catalogue, les langues créées après ce défi sont autorisées à concourir. Notez qu'il doit y avoir un interprète pour que la soumission puisse être testée. Il est permis (et même encouragé) d'écrire cet interprète vous-même pour une langue non implémentée auparavant. En dehors de cela, toutes les règles standard du code-golf doivent être respectées. Les soumissions dans la plupart des langues seront notées en octets dans un codage préexistant approprié (généralement UTF-8).
Catalogue
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 s'affiche, 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:
## [<><](https://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><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="language-list"> <h2>Shortest Solution 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> <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> <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><script>var QUESTION_ID = 67044; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 32686; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Réponses:
Pyth, 13 octets
Suite de tests
Fondamentalement, nous commençons par les deux chaînes que nous voulons déplacer par césar, les alphabets minuscules et majuscules. La liste contenant ces deux éléments est générée par
rBG1
, bifurquer en majuscules. Ensuite, nous réduisons cette liste, en commençant par la chaîne d'entrée et en traduisant d'abord les lettres minuscules, puis les lettres majuscules par le décalage approprié.la source
Pyth, 16
Essayez-le en ligne ou exécutez une suite de tests
la source
Forfait Bash + BSD-Games, 21
Builtins FTW! Ressemble presque à Mathematica. Les réponses Pyth sont cependant encore plus courtes.
Chaîne d'entrée lue depuis STDIN et entier depuis la ligne de commande. par exemple:
Ou si vous n'aimez pas la fonction intégrée:
Bash + coreutils, 63
la source
JavaScript (ES6),
122118114111 octets4 octets enregistrés grâce à @Neil !
Explication
La première invite prend la chaîne d'entrée. Le second est le nombre de décalage de chaque lettre.
la source
"abcdefg", -26
. Cela peut être résolu en modifiant la formule en(x-a+n+130)%26
.a=x&96,(x-a+n+129)%26+a+1
aide?CJam,
34222120 octetsMerci à FryAmTheEggman pour avoir économisé 1 octet.
Testez-le ici.
L'entrée est la chaîne à changer sur la première ligne et le décalage sur la seconde.
Explication
la source
'[,_el^
est un conseil de Dennis. Je ne sais pas ce que vous voulez diref
cependant, cela semble être une utilisation assez normale?@
. :)Java, 249 octets
C'est aussi court que possible. La lecture de stdin consomme une tonne d'octets. Une solution utilisant des arguments de ligne de commande est sensiblement plus courte mais, cette tâche a spécifié stdin pour l'entrée.
Le format d'entrée est la chaîne d'abord suivie du numéro de décalage sur une nouvelle ligne.
En utilisant des arguments de ligne de commande, cette solution ne fait que 188 octets. L'entrée est la chaîne comme premier argument et le décalage comme deuxième.
la source
R, 111 octets
code
non golfé
Ce programme prend l'entrée utilisateur de STDIN, d'abord le shifter entier puis la chaîne, caractère par caractère.
la source
Perl, 81 octets
(+1 pour le
-p
drapeau)Toujours en train de jouer au golf ...
Tester:
la source
Japt,
4543 octetsEssayez-le en ligne!
la source
Python 2,
163160 octetsJe ne sais pas si je peux encore jouer au golf.
Puisqu'il est assez illisible, voici une version non golfée:
Concernant l'entrée: Il attend deux arguments, le premier doit être une chaîne et le second un entier (la quantité de décalage). Exemples (le fichier est appelé
csr.py
):Remarque: Dans le deuxième exemple, un caractère d'échappement et
""
sont nécessairesla source
Python 2,
118116 octetsla source
if/else
instances ( codegolf.stackexchange.com/a/62/36885 ). Par exemple,print''.join([[c,chr((ord(c)-97+n)%26+97)]['~'<c<'{'],chr((ord(c)-65+n)%26+65)]['@'<c<'[']for c in s)
est un peu plus court et devrait fonctionner de la même manière. (Sauf changer le tilde en un backtick comme vous l'avez fait auparavant - je n'ai pas pu obtenir le backtick pour qu'il s'affiche correctement.)Mathematica, 117 octets
Prend la chaîne, suivie d'une nouvelle ligne, suivie du facteur de décalage. Pourrait encore être golfable ...
la source
Perl 6 , 73 + 1 = 74 octets
La première ligne de saisie est le nombre de caractères pour déplacer les lettres vers le haut.
Usage:
la source
C ++,
163154152 octetsUsage:
la source
k4, 80 octets
Le programme accepte le numéro de décalage comme argument de ligne de commande et lit le texte de stdin.
En raison d'une contrainte technique, les décalages négatifs doivent être codés avec un trait de soulignement au lieu d'un trait d'union moins. (Sans l'analyseur pour interpréter ce codage, la solution serait de 64 octets.)
Voici les exemples exécutés:
Et voici un petit harnais de test stupide qui vérifie à la fois l'encodage et le décodage. (C'est
zsh
; pourbash
ouksh
, changez l'for
indexation de boucle en((i=0;i<5;i++))
. Tableaux à base unique, ugh ....)la source