Défi
Étant donné l'entrée d'une chaîne entièrement en minuscules [a-z]
, affichez la distance totale entre les lettres.
Exemple
Input: golf
Distance from g to o : 8
Distance from o to l : 3
Distance from l to f : 6
Output: 17
Règles
- Failles standard interdites
- C'est le code-golf - la réponse la plus courte en octets gagne.
- L'alphabet peut être parcouru dans les deux sens. Vous devez toujours utiliser le chemin le plus court. (ie la distance entre
x
etc
est 5).
Cas de test
Input: aa
Output: 0
Input: stack
Output: 18
Input: zaza
Output: 3
Input: valleys
Output: 35
code-golf
string
number
arithmetic
Daniel
la source
la source
æ%
l'autre jour en lisant les modules intégrés, et c'était à peu près fait pour ce (type de) problème:OIæ%13AS
æ
soit deux).Haskell,
5756 octetsExemple d'utilisation:
sum.q.q.(zipWith(-)=<<tail).map fromEnum $ "valleys"
->35
.Comment ça marche:
Modifier: @Damien a enregistré un octet. Merci!
la source
q.q
)map
la définition deq
pour un octet de moinsMATL ,
14, 10 octetsEssayez-le en ligne!
Merci @Suever d' avoir économisé 4 octets!
Explication:
La version précédente:
la source
Python 3,
6968 octetsPanne:
la source
for
f=lambda a,b,*s:13-abs(13-abs(ord(a)-ord(b)))+(s and f(b,*s)or 0)
Java,
126120117 octetsMerci à @KevinCruijssen d'avoir signalé un bug dans la version originale et suggéré de rendre la boucle for vide.
L'utilisation de
(26 + z[i] - z[i - 1]) % 26)
est inspirée d'un commentaire de @Neil sur une autre réponse.(26 + ...)%26
sert le même but qu'enMath.abs(...)
raison de...? e : 26 - e
.Non golfé :
la source
[edit] those details into the top of your post, with this markdown:
#Langue, n octets`-
avant une
dans votre version non golfée.e=z[i]-z[i-1];
Donc, vous avez besoin d'un transtypage en(byte)
ou changez lee
enint
. En outre, vous pouvez supprimer les en plaçant tout à l' intérieur de la boucle for, entre parenthèses pour boucle comme ceci:int f(String s){byte[]z=s.getBytes();int r=0,i=0,e;for(;++i<z.length;r+=(e=z[i]-z[i-1])>0?e<14?e:26-e:-e<14?-e:e+26);return r;}
(PS: Le inversé la boucle for est malheureusement la même longueur:int f(String s){byte[]z=s.getBytes();int r=0,i=z.length-1,e;for(;i>0;r+=(e=z[i]-z[--i])>0?e<14?e:26-e:-e<14?-e:e+26);return r;}
.JavaScript (ES6),
848279 octets3 octets enregistrés grâce à Cyoce:
Explication:
Exemple:
Appel:
f('golf')
Sortie:
17
Solutions précédentes:
82 octets grâce à Neil:
84 octets:
la source
Math.abs(...)
vous pouvez utiliser(26+...)%26
; cela fonctionne parce que vous inversez les valeurs supérieures à 13 de toute façon. (Je pense que c'est ainsi que fonctionne la réponse MATL.)p=parseInt;
puis en utilisant à lap()
place deparseInt()
Rubis, 73 octets
la source
PHP, 93 octets
la source
05AB1E , 12 octets
Explication
Essayez-le en ligne!
la source
Perl, 46 octets
Comprend +3 pour
-p
(le code contient'
)Donnez votre avis sur STDIN sans nouvelle ligne finale:
stringd.pl
:la source
Raquette 119 octets
Essai:
Sortie:
Version détaillée:
la source
(define(f s)
par(lambda(s)
, 2 octets plus court (les fonctions anonymes sont très bien).(λ(s)
aussi, ce qui si dans utf8 est de 6 octets je penseC #,
8785 octetsSolution améliorée - remplacé Math.Abs () par l'astuce add & modulo pour économiser 2 octets:
Solution initiale :
Essayez-le en ligne!
Source complète, y compris les cas de test:
la source
En fait, 21 octets
Basé en partie sur la réponse Ruby de cia_rana .
Il y avait un bogue avec
O
(dans ce cas, map ord () sur une chaîne) où cela ne fonctionnerait pas avecd
(retirer l'élément du bas) etp
(pop premier élément) sans d'abord convertir la carte en une liste avec#
. Ce bug a été corrigé, mais comme ce correctif est plus récent que ce défi, j'ai donc continué#
.Edit: Et le nombre d'octets est erroné depuis septembre. Oups.
Suggestions de golf bienvenues. Essayez-le en ligne!
Ungolfing
la source
Java 7,128 octets
Non golfé
la source
Pyth, 20 octets
Un programme qui prend l'entrée d'une chaîne entre guillemets sur STDIN et imprime le résultat.
Essayez-le en ligne
Comment ça marche
la source
dc + od, 65 octets
Explication:
Parce qu'en DC, vous ne pouvez pas accéder aux caractères d'une chaîne, j'ai utilisé od pour obtenir les valeurs ASCII. Celles-ci seront traitées dans l'ordre inverse de la pile (conteneur LIFO) comme suit:
Courir:
Sortie:
la source
C,
82 86 8376 octetsSuppose que la chaîne d'entrée comporte au moins un caractère. Cela ne nécessite pas
#include<stdlib.h>
Edit: Argh, séquence de points!
Essayez-le sur Ideone
la source
C, 70 octets
76 octetsla source
Scala, 68 octets
La critique est la bienvenue.
la source
C #, 217 octets
Golfé:
Non golfé:
Sortie:
'a' vaut 97 lorsqu'il est converti en octets, donc 97 est soustrait de chacun. Si la différence est supérieure à 13 (c.-à-d. La moitié de l'alphabet), soustrayez les différences entre chaque caractère (valeur d'octet) de 26. Un ajout de dernière minute de "rendement de retour" m'a fait économiser quelques octets!
la source
Python 3, 126 octets
Avec liste en compréhension.
la source
abs(x-y)
pary-x
depuis l'appel àsorted
effectuerx < y
.PHP, 79 octets
la source
Java, 109 octets
la source