La description
Un changement de César est un chiffre monoalphabétique très simple où chaque lettre est remplacée par celle qui la suit dans l'alphabet. Exemple:
Hello world! -> IFMMP XPSME!
( IBSLR, EGUFV!
est la sortie pour le défi réel, c'était un exemple de décalage de 1.)
Comme vous pouvez le voir, l'espacement et la ponctuation restent sans accord. Cependant, pour éviter de deviner le message, toutes les lettres sont en majuscules. En reculant les lettres, le message a été déchiffré, pratique, mais aussi très facile à déchiffrer par d'autres personnes censées ne pas savoir ce que signifie le message.
Nous allons donc aider un peu César en utilisant une forme avancée de son chiffre: le changement César auto-changeant !
Défi
Votre tâche consiste à écrire un programme ou une fonction qui, étant donné une chaîne à chiffrer, génère la chaîne chiffrée correspondant à l'entrée. Le Caesar Shift avancé fonctionne comme ceci:
1. Compute letter differences of all adjacent letters:
1.1. Letter difference is computed like this:
Position of 2nd letter in the alphabet
-Position of 1st letter in the alphabet
=======================================
Letter difference
1.2. Example input: Hello
H - e|e - l|l - l|l - o
7 - 5|5 - 12|12 - 12|12 - 15 Letter differences: 3; -7; 0; -3
=3| =-7| =0| =-3
2. Assign the letters continously a letter difference from the list,
starting at the second letter and inverting the differences:
2.1. 2nd letter: first difference, 3rd letter: second difference, etc.
2.2. The first letter is assigned a 1.
2.3. Example input: Hello with differences 3; -7; 0; -3
Letter || Value
=======||======
H || 1
E || -3
L || 7
L || 0
O || 3
3. Shift the letters by the value x they have been assigned:
3.1. In case of a positive x, the letter is shifted x letters to the right.
3.2. In case of a negative x, the letter is shifted |x| letters to the left.
3.3. In case of x = 0, the letter is not shifted.
3.4. If the shift would surpass the limits of the alphabet, it gets wrapped around
Example: Y + Shift of 2 --> A
3.5. Example input: See the table under 2.3.
|| || Shifted
Letter || Value || Letter
=======||=======||=========
H || 1 || I
E || -3 || B Program output:
L || 7 || S IBSLR
L || 0 || L
O || 3 || R
Les espaces et autres symboles spéciaux, tels que la ponctuation, sont ignorés dans ce processus. Il est garanti que votre programme recevra une chaîne contenant uniquement des caractères ASCII imprimables. La sortie de votre fonction / programme doit être uniquement en majuscules.
Il s'agit de code-golf , donc les échappatoires standard s'appliquent, et la réponse la plus courte en octets peut gagner!
la source
E
-3
?ZEN
, par exemple.Z
décalé de 1 est ...A
? (en guise de remarque, la réponse 05AB1E se transformeZ
enA
)RELIEF
etRELIES
pour les deux chiffrer au même résultatSRSFAG
?Réponses:
05AB1E ,
282724 octetsEssayez-le en ligne!
Explication
la source
IBSLR, EGUFV!
pourHello, World!
, est - ce exact? OP a-t-il simplement gâché cet exemple?Python 3 , 100 octets
Essayez-le en ligne!
b
garde la trace du code ASCII de la dernière lettre, ou est initialement zéro; la formulec+c-(b or~-x)
signifie qu'une lettre avec un code ASCIIc
est décalée dec-b
sib
est différent de zéro etc-(c-1) == +1
sib
est nul (pour la toute première lettre).b
ne redeviendra plus jamais nul, car la chaîne est composée de caractères ASCII imprimables .Enfin,
64<c<91
vérifie s'ilc
s'agit d'une lettre ASCII majuscule et(…-65)%26+65
remet tout dans laA-Z
plage.ovs a enregistré un octet. Merci!
la source
05AB1E ,
323029 octetsEssayez-le en ligne!
la source
ES6 (Javascript), 138 octets:
http://jsbin.com/manurenasa/edit?console
la source
MATL , 27 octets
Essayez-le en ligne!
Je pense que c'est la plus courte possible, mais il existe de nombreuses variétés différentes car il y a beaucoup de réutilisation de `` variables '' (il y a 3 opérations
t
(duplication) et 2w
(permutation), le presseH
- papiers est utilisé, et même alors il y a encore un doublon1Y2
...). Malheureusement, je n'ai pas pu enregistrer d'octets avec leM
presse-papiers automatique .Plus de la moitié du programme est dédié à le rendre en majuscules et à ignorer les caractères non alphabétiques - juste le chiffre ne dépasse pas 13 octets ( Essayez-le en ligne! )
la source
Perl,
9089Bien que les langues autres que le codegolf soient rarement compétitives, nous pouvons descendre en dessous de 100;)
J'ai décidé de dé-golfer ceci:
@a = split//,<>;
Prend l'entrée de STDIN, stocke la liste des caractères (avec la nouvelle ligne!) Dans @a.say uc(++$a[0])
sortie première lettre majuscule décalée de 1. Il s'avère que vous pouvez incrémenter une lettre en perl si vous utilisez un préfixe ++. C'est un mutateur ofc.2*ord($a[$_+1])-ord($a[$_])+!$_
On nous demande de prendre le caractère en x et d'ajouter la différence + (x- (x-1)). Eh bien, c'est 2x - (x-1). Cependant: j'ai changé la première lettre! Je dois donc corriger cette erreur, ce+!$_
qui corrigera le fait d'avoir soustrait un trop à la position 0 (seul cas! $ _ N'est pas indéfini). Nous devons ensuiteuc chr
obtenir une lettre majuscule à partir de la valeur ASCII calculée.map{ ... } $#a-2
-$#a
est la position pour accéder au dernier élément du tableau. Puisque j'en ajoute un, je veux$#a-1
, mais parce que la nouvelle ligne d'entrée doit être ignorée, c'est le cas$#a-2
.Ceci est concaténé avec la première lettre, et nous avons terminé :)
la source
Perl 5
-F
,737774 octetsEssayez-le en ligne!
la source
Hello, World!
devrait aboutirIBSLR, EGUFV!
, nonIBSLR, XGUFV!
.PHP,
10698 octetsassez méchant celui-là ... si ce
base_convert
n'était pas si long (ouctype_alpha
) ...mais je l'ai eu sous 100. satisfait.
Exécuter en tant que pipe avec
-nR
ou l' essayer en ligne .la source
JavaScript (Node.js) ,
86838781 octetsEssayez-le en ligne!
la source