Cette tâche est assez simple et utilise trois caractères "d'opérateur" distincts. Votre tâche est, étant donné une simple séquence de lettres, effectuer la tâche suivante pour encoder en utilisant <
, >
, *
. Vous pouvez choisir d'utiliser des lettres majuscules ou minuscules, vous n'avez pas à gérer les deux.
Explication du chiffre
Le chiffrement est simple, vous utilisez des opérations d'incrémentation et de décrémentation pour passer de la lettre 1 à la lettre de fin, en *
étant votre fonction "soumettre". L'opérateur pour "incrémenter" sera >
et "décrémenter" sera <
.
Un exemple utilisant le mot adbc
:
- Commencez par la première lettre du mot, sortez cette lettre.
a
- Ensuite, utilisez
>
et<
(comme brainfuck) pour "naviguer" de la lettre actuelle à la suivante.a>
entraînerait une «augmentation»a
de 1 à la lettreb
.a<
entraîneraitz
parce que vous abaissez la lettre (il encapsule, vous devez toujours choisir la direction résultant dans le nombre MOINS d'opérations). - Après avoir sorti la combinaison minimisée correcte de
<
et>
sorti un*
pour indiquer que nous avons atteint la lettre suivante.
Les étapes à coder adbc
seraient les suivantes:
a # a
a>>>* # ad
a>>>*<<* # adb
a>>>*<<*>* # adbc
Exemples
Les étapes à coder aza
seraient les suivantes:
a # a
a<* # az
a<*>* # aza
Plus d'exemples:
"abcdef" = "a>*>*>*>*>*"
"zyaf" = "z<*>>*>>>>>*"
"zzzzzz" = "z*****"
"z" = "z"
"zm" = "z<<<<<<<<<<<<<*" or "z>>>>>>>>>>>>>*" (equidistant)
"zl" = "z>>>>>>>>>>>>*"
"alphabet" = "a>>>>>>>>>>>*>>>>*<<<<<<<<*<<<<<<<*>*>>>*<<<<<<<<<<<*"
"banana" = "b<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*" OR "b<*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*"
"abcdefghijklmnopqrstuvwxyz" = "a>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*"
"abcdefz" = "a>*>*>*>*>*<<<<<<*"
Règles
- Nous n'encodons pas, nous ne décodons donc pas.
- Vous pouvez supposer que le message contiendra des lettres
[A-Z]
ou[a-z]
, votre choix. - Vous pouvez utiliser n'importe quel caractère non-lettre / numérique / réservé pour indiquer
*
(EG$
). - Vous devez avoir la fin
*
, ce n'est pas implicite sur les répétitions. - Vous ne pouvez supposer aucune chaîne vide, mais un seul caractère est possible.
- S'il est équidistant dans un sens ou dans l'autre jusqu'à la lettre suivante, vous pouvez choisir une direction.
- Il s'agit du code-golf , le plus petit nombre de victoires d'octets.
Veuillez expliquer votre réponse, cela aide les autres à apprendre de cette façon.
abcdefghijklmnopqrstuvwxyz
et n'est pas sa propre entrée?zl
devrait utiliser>
.alphabet
est à mon avisa>>>>>>>>>>>*>>>>*<<<<<<<<*<<<<<<<*>*>>>*<<<<<<<<<<<*
etzl
devrait êtrez>>>>>>>>>>>>*
et pourbanana
si une deuxième solution existeb<*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*
zm
. @jorg de bonnes captures, toutes corrigées, était un effort manuel.Réponses:
Gelée , 17 octets
Utilise un caractère espace à la place de
*
(un espace⁶
, ou une nouvelle ligne⁷
, enregistre un octet de plus”*
).Fonctionne avec une entrée en majuscules uniquement ou en minuscules uniquement.
Essayez-le en ligne! ou consultez une suite de tests (où ces espaces sont post-remplacés par
*
pour faciliter la lecture).Comment?
la source
8086 code machine,
70 6867 octetsComment ça fonctionne:
la source
Python 3 , 87 octets
Essayez-le en ligne!
Fonctionne avec des minuscules ou des majuscules.
Le programme crée la chaîne de sortie
r
en itérant sur les caractères de la chaîne d'entrée. Il stocke le caractère précédent sous la formep
et calcule l'opération d'incrémentation pour passer dup
nouveau caractèrec
.L'intervalle entre les caractères est
ord(c)-ord(p)
, et le(ord(c)-ord(p)-13)%26-13
prend modulo 26 à l'intervalle[-13..12]
. Un résultat négatif signifie qu'il est plus court de démissionner, et un résultat positif signifie de passer à l'étape supérieure. Cela doit être converti en une chaîne de>
ou en<
fonction du signe. Plutôt que d'utiliserabs
ou un conditionnel, nous profitons de la multiplication de chaînes de Pythons*n
donnant la chaîne vide quandn
est négatif. Dans l'expression'<'*-d+'>'*d
, la partie mal signée ne contribue pas.L'état initial est géré en divisant l'entrée en son premier caractère et le reste avec le déballage de Python 3
r,*s=input()
. Le caractère initial est utilisé pour commencer la construction de la chaîne, ainsi que le caractère "précédent" initial.Merci aux ovs d'avoir suggéré de passer à Python 3 pour faire ce déballage.
la source
Python 3 ,
11093 octetsEssayez-le en ligne!
la source
JavaScript (ES6),
118109107 octetsLa chaîne d'entrée n'est pas sensible à la casse.
Comment ça fonctionne
Contrairement à Python, l'opérateur JS modulo renvoie un nombre ayant le même signe que le dividende plutôt que le diviseur. En outre, la
repeat()
méthode JS génère une erreur lorsqu'elle reçoit un nombre négatif, plutôt que de renvoyer une chaîne vide (et c'est de toute façon beaucoup plus long qu'une simple*
).Ce sont des comportements plutôt défavorables pour ce défi. Donc, nous ferions mieux d'identifier dans quel cas exact nous sommes plutôt que de compter sur des astuces mathématiques. (Ce qui ne signifie pas que de telles astuces n'existent pas, mais plutôt que je n'ai pas réussi à les trouver.)
Ci-dessous un tableau décrivant les 4 cas possibles, où
d
est la distance signée entre le caractère actuel et le précédent:Cas de test
Afficher l'extrait de code
la source
PHP, 127 octets
Cas de test
PHP, 137 octets
Cas de test
la source
JavaScript (ES6),
111103 octetsVersion à l'origine qui prenait 111 octets avant que j'adapte l'astuce de configuration @ Arnauld
n
lors du calculp
, je pense qu'il y a probablement une autre astuce à utiliser à las
place,n
mais il se fait tard, donc je ne m'embêterai pas .:la source
Haskell (lambdabot),
161153 octetsEssayez-le en ligne!
Explication:
la source
EXCEL VBA 130 octets
Exécutez-le à partir de la fenêtre Excel VBA Immediate.
Explication:
Simple pour la boucle qui, avec la fonction String, répète le nombre ">" ou "<" n de fois où n est la différence ascii entre la chaîne de caractères i et i + 1.
la source
Java 7, 232 octets
À peu près la solution triviale. Non golfé et commenté:
la source
C, 170 octets
Live détaillée
la source
#define x q<14?q:q+26 e(c){putchar(c);}i,q;m(a,b){q=b-a;i=q?(a>b?x:-x):0;while(i>0)e('>'),i--;while(i<0)e('<'),i++;}f(char*l){e(*l);while(*(l+1))m(*l,*(l+1)),e('*'),l++;}
JavaScript (ES6),
140128129111113 octetsJ'ai emprunté une voie différente vers les autres solutions JS mais cela n'a pas trop bien fonctionné - voici ce que j'ai jusqu'à présent:
Original, 131 octets
Afficher l'extrait de code
la source
([x,...s])=>x+s.map(...)
enregistre 12 octets. Notez que vous devez également ajouter un caractère d'impression à la fin. Je suggère d'utiliser un nombre, qui ne coûtera que 2 octets`1`+1
au lieu de`*`
.join
aurait entraîné une sortie non valide pour les entrées à lettre unique. Cependant, le déplacement du caractère d'impression dans lamap
méthode ne coûte qu'un octet.([x,...s])=>x+s.map(y=>'<><>'[r=(d=y[c='charCodeAt']()-x[c](x=y))/13+2|0].repeat([d+26,-d,d,26-d][r])+0).join``
pour 111 octetsreduce
solution de golf , mais cela s'est avéré être de 115 octets.C ++,
210190 octetsMon premier essai au golf!
k stocke lequel de <,> ou * à imprimer. Au début, il imprime simplement le premier élément du tableau, puis exécute une boucle pour un du premier au dernier élément du tableau. j stocke l'élément précédent puis en comparant si j plus proche de * a en <ou> définissez k sur <,> respectivement, puis imprimons k puis exécutez cette boucle jusqu'à ce que j devienne égal à p. Ensuite, après chaque fin de la deuxième boucle, imprimez *.
la source
*p!=0
peut être remplacé par*p
. Je suis sûr que l'espacechar *a
n'est pas nécessaire non plus. Vous devrez également#include <iostream>
etusing namespace std;
(bien que je pense qu'il serait peut-être moins cher d'ajouter simplementstd::
) pour en faire une réponse complète.std::
ouusing namespace std;
vous aurez probablement aussi besoin#include <iostream>
de votre nombre d'octets.05AB1E , 17 octets
Essayez-le en ligne!
Explication
Utilise
>
,<
et<space>
pour indiquer incrémenter , décrémenter , soumettrela source
Haskell ,
167168126 octetsNous utilisons maintenant la solution arithmétique de xnor. Appelez avec
e str
oùstr :: String
est la chaîne à encoder.la source
Haskell , 109 octets
Essayez-le en ligne! Utilise l'approche de xnor . Appelez avec
f "somestring"
.la source