Étant donné une chaîne, vous devez déplacer chaque lettre (à partir de la première lettre) de sa position dans l'alphabet. Si vous atteignez la fin de la chaîne, vous devez vous envelopper. Les non-lettres n'ont pas besoin d'être déplacées.
Exemple:
Dog
D
est la quatrième lettre de l’alphabet, nous la déplaçons donc de quatre points à droite. Après avoir terminé, cela change la chaîne en oDg
. o
est la 15ème lettre, (15 mod 3) = 0, donc elle ne bouge pas. g
est la 7ème lettre - (7 mod 3) = 1, ainsi la chaîne devient goD
.
hi*bye
h
est la 8ème lettre, déplacez-la de 8 points -hi*bye
=>i*hbye
i
est la 9ème lettre, déplacez-la 9 places -i*hbye
=>*hbiye
b
est la 2e lettre, déplacez-la de 2 points -*hbiye
=>*hiybe
y
est la 25ème lettre, déplacez-la de 25 points -*hiybe
=>*hibye
e
est la 5ème lettre, déplacez-la de 5 points -*hibye
=>*hibey
Les non-lettres n'ont pas besoin d'être déplacées, mais elles prennent toujours de la place.
cat
=>tca
F.U.N
=>.F.NU
mississippi
=>msiisppssii
Réponses:
CJam,
444240 octetsLa sortie contient un retour à la ligne final.
Testez-le ici.
Explication
Au lieu de déplacer les lettres dans la chaîne, j'enlève à plusieurs reprises une lettre, la fais pivoter en conséquence, puis je réinsère la lettre. Il y a un problème pour cela: nous devons pouvoir distinguer le début de la chaîne de la fin de la chaîne (ce qui n'est pas possible après une simple rotation). C'est pourquoi nous insérons un saut de ligne à la fin en guise de garde (lettre avant le saut de ligne est la fin de la chaîne, lettre après le début). Le bonus est que cela ramène automatiquement la dernière chaîne à la bonne rotation où le saut de ligne se situe réellement à la fin de la chaîne.
Pour voir pourquoi cela aboutit dans la bonne position, considérons la dernière itération de l'
hi*bye
exemple. Après avoir traité lee
, la chaîne énumérée se trouve dans cette position:Tout d'abord, nous divisons autour du saut de ligne et concaténons les parties dans l'ordre inverse:
Le saut de ligne serait maintenant soit au début ou à la fin de cette chaîne. Mais comme le saut de ligne est juste un garde qui marque la fin de la chaîne, cela signifie que les caractères sont en fait dans le bon ordre. Maintenant, le saut de ligne n'est pas une lettre, de sorte que le tableau ne subit aucune rotation. Ainsi, lorsque nous ajoutons le saut de ligne, il se place là où il se trouve et tout est dans l'ordre que nous recherchons:
Quelques résultats supplémentaires si quelqu'un souhaite comparer des cas de test plus longs:
J'aime ce dernier. :)
la source
Ruby 125
130 132 139octetsDémo en ligne avec tests: http://ideone.com/GYJm2u
L'initiale (version non-golfée): http://ideone.com/gTNvWY
Edit: Un grand merci à manatwork pour ses suggestions!
Edition 2 : nombre de caractères fixe (je comptais initialement les fins de ligne CRLF.)
la source
c.upcase.ord-64
→c.ord%32
.a.join
??? Qui es-tu et qu'as-tu fait de w0lf? Il l'écrirait certainement commea*''
.while ... end
code dans mon code que j'ai oublié de le faire. Merci d'avoir remarqué!while ... end
en(...)while ...
?Python 3,
278275273270260258249248243238 octetsJe devrais vraiment mieux jouer au golf , mais voici ma solution, merci à katenkyo pour son aide en matière de logique et à Cyoce et Mego pour leur aide en matière de golf.
Edit: Enfin, je l'ai réduit à une déclaration de comparaison. COURTISER! (Et oui, je pourrais le déplacer
z=-z
ena,m=m,a
bits, mais cela ne sauve pas les octets et cela brouille le code plus que je ne le pensais nécessaire)Edit: Le nombre d'octets était désactivé.
Ungolfed:
la source
p[j][0]
peut être réduit en fixantJ=p[j];
au début, puis en remplaçant les occurrences dep[j][0]
avecP[0]
p
directement, et non une variable qui l'avaitp[j]
affectée. De plus, si vous examinez l'historique de mes révisions, j'avais une variablek = p[j][0]
pour lesa<=k<=m
comparaisons, mais il s'est avéré que l'abandonk
était préférable, car j'avais sauvegardé plus d'octets sur les retraits de la ligne supplémentaire à définirk
qu'en utilisantk
.