Le but de ce défi est d'écrire la fonction / le programme le plus court pour prendre le texte saisi, le crypter en utilisant la méthode ci-dessous et renvoyer le résultat.
À titre d'exemple, je vais utiliser la chaîne hello world
.
Tout d'abord , récupérez le texte saisi.
hello world
Ensuite , convertissez la chaîne en ternaire (base 3). Utilisez cette clé:
a = 000
b = 001
c = 002
d = 010
e = 011
f = 012
g = 020
...
w = 211
x = 212
y = 220
z = 221
[space] = 222
Avec cette clé, hello world
devient 021011102102112222211112122102010
, comme indiqué ci-dessous.
h e l l o w o r l d
021 011 102 102 112 222 211 112 122 102 010
Troisièmement , déplacez le premier chiffre à la fin.
021011102102112222211112122102010
becomes
210111021021122222111121221020100
Quatrièmement , reconvertissez le nombre en chaîne à l'aide de la même clé.
210 111 021 021 122 222 111 121 221 020 100
v n h h r n q z g j
Enfin , renvoyez le texte chiffré.
vnhhr nqzgj
Voici quelques exemples de texte et leur sortie:
the turtle ==> dvo fh ego
python ==> uudwqn
code golf ==> hpjoytqgp
Comme il s'agit du code golf, l'entrée la plus courte en octets l' emporte. Les erreurs sont autorisées si certains des caractères ne sont pas des lettres minuscules ou de l'espace. C'est mon premier défi, donc toute suggestion serait plus qu'utile.
Bonne chance!
Classement:
var QUESTION_ID=54643;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
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>
la source
uint64
) en utilisant des pouvoirs croissants de27
. Le déplacement d'un chiffre équivaudrait alors à multiplier ce grand entier par3
, et l'introduction du premier chiffre à l'autre extrémité serait simplement un ajout. Mais il y a des complications, telles que l'élimination du dernier "carry" (peut-être via unemod
opération), et je n'ai pas pu le faire fonctionner avec quelques octetsRéponses:
Pyth,
2322 octetsEssayez-le en ligne: Regular Input / Test Suite
Merci à @isaacg pour un octet.
Explication:
la source
G
lieu d'utiliserN
, par exemple=+Gd
.Pyth, 26 octets
Essayez-le en ligne dans le compilateur / exécuteur Pyth: démo | cas de test
Idée
Supposons que tous les caractères d'entrée ont déjà été mappés aux entiers spécifiés à l'étape 2.
Pour chaque nombre ternaire à 3 chiffres, nous avons que xyz 3 = 9x + 3y + z , donc la division modulaire par 9 donne le quotient x et le résidu 3y + z .
Si l'entrée est abc 3 def 3 ghi 3 , l'application d'une division modulaire à chacun donne a, 3b + c, d, 3e + f, g, 3h + i .
Après avoir fait tourner la liste du dessus d'une unité vers la gauche, nous pouvons regrouper les entiers en paires. Cela donne la liste (3b + c, d), (3e + f, g), (3h + i, a) .
Maintenant, si nous convertissons (3y + z, w) de la base 3 en entier, nous obtenons 3 (3y + z) + w = 9y + 3z + w = zyw 3 .
Ainsi, l'application de la conversion de base à la liste des paires nous donne bcd 3 efg 3 hia 3 , qui est précisément le résultat de la rotation des chiffres ternaires concaténés d'une unité vers la gauche.
Il ne reste plus qu'à mapper les entiers résultants en caractères.
Code
la source
Python 2, 96
Convertit un caractère
c
en une valeurx
telle quex=(ord(c)-97)%91
, avec le modulo affectant uniquement l'espace pour le convertir en 26. La conversion inverse esti
enchr((i-26)%91+32)
, avec le modulo affectant uniquementi=26
pour le faire devenir des espaces.Nous parcourons les caractères en notant la valeur actuelle
x
et la valeur précédentey
. Nous utilisons les deux derniers chiffres ternaires dey
, trouvés commey%9
, et le premier chiffre ternaire dex
, trouvés commex/9
. La valeur de la concaténation esty%9*3+x/9
. Il y a probablement des optimisations combinant cette arithmétique avec le décalage97
et la fixation de l'espace.Nous faisons cette boucle autour, nous revenons au premier caractère de la chaîne à la fin. Nous faisons également une boucle de préparation pour écrire dans une valeur précédente
y
, en supprimant le caractère de la première boucle lorsqu'elley
n'a pas encore été initialisée.la source
CJam,
3929 octetsLa chose intéressante à propos de celui-ci est qu'il n'utilise même pas la conversion de base.
Essayez-le en ligne .
Je viens de réaliser que j'avais exactement la même idée que la réponse Python de Jakube. J'ai en fait porté ce code CJam sur Pyth avant de voir son message, se terminant par 25 octets. Étant donné que c'était mon premier golf Pyth, je suppose que ce n'est pas trop mal.
Explication
la source
CJam,
302927 octetsEssayez-le en ligne dans l' interpréteur CJam .
L'approche est la même que dans mon autre réponse , qui est un portage de ce code vers Pyth.
Comment ça marche
la source
Pyth,
3029 octets1 octet enregistré grâce à @Jakube.
Démonstration en direct et cas de test.
la source
Javascript (ES6), 175 octets
Un one-liner!
"Surutilisation de la
v
prime variable , quelqu'un?"mise à jour: utilise désormais uniquement les variables appelées
v
, pour une confusion totale!Merci @vihan d'avoir économisé 6 octets!
Merci @Neil d'avoir économisé 27 octets !!
Définit une fonction anonyme. Pour l'utiliser, ajoutez
v=
avant le code pour donner un nom à la fonction, et appelez-la commealert(v("hello world"))
la source
.slice(-3)
pour enregistrer 6 octets, auquel moment vous pouvez utiliser"00"+v
pour enregistrer un autre octet. (Vous pouvez concaténer avec un modèle mais la longueur résultante est la même.).map(v=>(v<"V"?26:v.charCodeAt()-97).toString(3)).map(v=>("000"+v).slice(v.length))
devient alors.map(v=>(v<"V"?53:v.charCodeAt()-70).toString(3).slice(1))
.Julia,
149137 octetsMon premier golf!
(partiellement) non golfé:
la source
=
plutôt quein
pour les boucles et vous pouvez utiliserb[1]
à la place deb[1:1]
. Vous n'avez pas non plus besoin d'espace entre les parenthèses fermantes etfor
.=
, maisb[1]
renvoie un caractère, qui ne peut pas être ajouté à une chaîne avec*
.for
astuce est astucieuse. Vous pouvez également l'avoir directement après un devis de clôture. Je ne savais pas que l'analyseur était si flexible.end
.Javascript (ES6),
178,172, 170Remplacement de Math.floor par un bit ou. Création d'une fonction anonyme. Si je comprends bien, cela devrait corriger quelque peu mon noobishness (merci Dennis!) Et me faire descendre encore 2 octets.
la source
Julia,
169166 octetsNon golfé + explication:
la source
Haskell, 160 octets
Ugh, cela semble beaucoup trop long, mais au moins je ... bat Python d'une manière ou d'une autre. Et Ruby.
la source
Javascript (ES6),
141124120 octetsCroyez-le ou non.... :-)
Comme pour mon autre réponse, il s'agit d'une fonction anonyme qui doit être affectée à une variable avant de pouvoir être utilisée. Essayez-le ici:
Afficher l'extrait de code
J'ai pensé que je pourrais être en mesure de raser quelques octets de ma réponse précédente en utilisant une technique différente, alors j'ai commencé avec une similaire à celle de Tekgno et j'ai commencé à jouer au golf à partir de là. J'ai initialisé certaines variables dans la section des arguments de la fonction, et encore une fois tout bourré dans une
.map
fonction. Ensuite, j'ai réalisé que ceString.fromCharCode
serait beaucoup plus efficace en dehors du.map
. Après tout a été dit et fait, j'avais rasé plus de3045 octets!Edit 1: économisé 17 octets en se débarrassant des
.replace
s, en utilisant une technique similaire à la solution Python de xnor.OK, il est peut-être temps de passer à un autre défi ...
la source
Python 2,
182180 octetsCette solution n'est pas idéale, car le remplacement est très coûteux. Essayer de comprendre comment éviter cela.
L'entrée est comme
"hello world"
.la source
Mathematica, 162 octets
(Re) Utiliser un
Rule
pour convertir les listes de chiffres en caractères et inversement.la source
Javascript (ES6), 179 octets
Props à vihan pour l'
.match
expression régulière.la source
Rubis, 177
Nécessite au moins Ruby 1.9 pour la
each_char
méthodela source
Java,
458449 octetsCela m'a rendu un peu triste de déterminer que je pouvais raser 10 octets en n'utilisant pas les flux Java 8 et la
map()
méthode.Voici la version golfée:
Voici une version beaucoup moins golfée. Il est destiné à être lisible, mais je ne donne aucune garantie.
Ce programme prend la chaîne à convertir en argument de ligne de commande. Si vous voulez avoir des espaces dans votre entrée, vous devez l'entourer de guillemets doubles.
Je voulais fournir un exemple d'utilisation de cela à partir de la ligne de commande, mais je n'ai pas réussi à faire fonctionner ce code en dehors d'Eclipse. Je n'ai jamais appris à utiliser Java à partir de la ligne de commande ^ _ ^; Vous pouvez probablement le faire fonctionner dans l'IDE de votre choix sans trop de problèmes.
la source
Javascript (ES6),
181180 octetsIl s'agit d'une fonction anonyme, il faut donc lui donner un nom avant de pouvoir l'utiliser. (Par exemple
encrypt=t=>...
) Essayez-le ici:Afficher l'extrait de code
J'ai commencé à utiliser plusieurs variables et
for
boucles au lieu de.map
. Je l'ai ensuite joué de toutes les manières possibles sans changer l'algorithme, ce qui m'a mis quelque part autour de 217 octets. Après avoir jeté un coup d'œil à la réponse de UndefinedFunction, j'ai réussi à la ramener à 195, et une inspection de la réponse de Dendrobium a abouti à 14 autres parties.Pour autant que je sache, je ne peux pas aller plus loin ou mon résultat serait pratiquement identique à celui de Dendrobium (à l'exception d'être un caractère plus court!). Quelqu'un peut-il trouver l'endroit où j'ai enregistré un personnage? :-)
Comme d'habitude, les suggestions sont les bienvenues!
la source
Matlab, 113 octets
L'entrée se fait via stdin.
Exemple:
la source
Julia -
92876154 octetsNon golfé:
L'astuce peut vous dérouter. Soustraire 6 déplace «a» vers le bas à zéro après le mod. Ajouter 9 * 65 équivaut à ajouter 65 à v1 + v2, ce qui fait partie du processus de restauration des valeurs à leurs valeurs ascii. Vous pouvez remplacer
i=t%91+579
pari=t%91-6
, puis remplacerN=(v1+v2)%91+32
parN=(v1+v2+65)%91+32
pour obtenir le même résultat, mais cela nécessite un caractère supplémentaire.la source