Le compteur de mots très bizarre

13

INPUT: Toute chaîne composée exclusivement de lettres minuscules via un argument de fonction, un argument de ligne de commande, STDIN ou similaire.

SORTIE: Imprimez ou renvoyez un nombre qui représentera la somme des distances des lettres selon la métrique suivante:

Vous prenez la première et la deuxième lettre et comptez la distance entre elles. La distance est définie par la disposition du clavier QWERTY, où chaque lettre adjacente dans la même ligne a la distance 1 et chaque lettre adjacente dans la même colonne a la distance 2. Pour mesurer la distance entre les lettres qui ne sont pas adjacentes, vous prenez le chemin le plus court entre les deux.

Exemples:

q->w is 1 distance apart
q->e is 2 distance
q->a is 2 distance
q->s is 3 distance (q->a->s or q->w->s)
q->m is 10 distance

Ensuite, vous prenez la deuxième et la troisième lettre, puis la troisième et la quatrième, etc., jusqu'à la fin de l'entrée. La sortie est la somme de toutes ces distances.

Exemple d'entrée et de sortie:

INPUT: qwer
OUTPUT: 3

INPUT: qsx
OUTPUT: 5

INPUT: qmq
OUTPUT: 20

INPUT: tttt
OUTPUT: 0

Voici une image montrant quelles lettres sont dans la même colonne:

lettres dans la colonne

C'est le golf de code, donc le code le plus court en octets gagne!

Vajura
la source
1
Je pense que q-> m n'est que 8 touches ...
SuperJedi224
2
si vous descendez une ligne, cela compte pour 2 distances, vous ne comptez pas la distance clé
Vajura
c'est aussi là-haut :)
Vajura
Pouvons-nous supposer que la chaîne d'entrée sera toujours non vide?
Alex A.
Ceci est assez similaire à codegolf.stackexchange.com/questions/50722/… . Sauf que celui-ci utilise des lettres, tandis que l'autre utilise des chiffres.
Reto Koradi

Réponses:

2

CJam, 50 octets

r{i",ÙZ°^ªýx´|"257b27b=A+Ab}%2ew::.-::z2fb:+

Notez que le code contient des caractères non imprimables.

Essayez-le en ligne dans l' interpréteur CJam . Si le permalien ne fonctionne pas, copiez le code de cette pâte .

Contexte

Nous commençons à attribuer les positions 0 à 9 aux lettres de la ligne supérieure, 10 à 18 aux lettres de la ligne d'accueil et 20 à 26 aux lettres de la ligne inférieure.

Les positions des 26 lettres, par ordre alphabétique, sont

[10 24 22 12 2 13 14 15 7 16 17 18 26 25 8 9 0 3 11 4 6 23 1 21 5 20]

Il s'agit d'un tableau de longueur 26. Étant donné que les tableaux s'enroulent dans CJam et que le point de code de la lettre h est 104 = 4 × 26 , nous faisons pivoter le tableau de 7 unités vers la gauche, afin que la position de chaque lettre soit accessible par son point de code.

[15 7 16 17 18 26 25 8 9 0 3 11 4 6 23 1 21 5 20 10 24 22 12 2 13 14]

Maintenant, nous codons ce tableau en considérant ses chiffres d'éléments d'un nombre de base 27 et convertissons l'entier résultant en base 257.

[6 153 44 8 217 90 176 156 94 24 170 253 147 120 180 124]

En remplaçant chaque entier par le caractère Unicode correspondant, nous obtenons la chaîne du code source.

Comment ça fonctionne

r              e# Read a whitespace separated token from STDIN.
{              e# For each character:
  i            e#   Push its code point.
  ",ÙZ°^ªýx´|" e#   Push that string.
  257b27b      e#   Convert from base 257 to base 27.
  A+Ab         e#   Add 10 and convert to base 10.
               e#   Examples: 7 -> [1 7], 24 -> [3 4]
}%             e#
2ew            e# Push all overlapping slices of length 2.
::.-           e# Subtract the corresponding components of the pairs in each slice.
::z            e# Apply absolute value to the results.
2fb            e# Convert each to integer (base 2).
               e# Example: [2 5] -> 2 × 2 + 5 = 9
:+             e# Add the distances.
Dennis
la source
1
l'homme comment ça marche même
Vajura
@Vajura Dennis arrive généralement à ajouter des explications, si vous attendez, il en ajoutera probablement une :) Si vous voulez une explication plus vague / basique, usandfriends a fait un explicateur CJam que vous pouvez utiliser ici.
Kade
@Vajura: J'ai modifié ma réponse.
Dennis
7

Python 2, 220 ... 124 119 Octets

Un grand merci à Sp3000 pour avoir économisé beaucoup d'octets.

f='qwertyuiopasdfghjkl zxcvbnm'.find
g=lambda i:sum(abs(f(x)%10-f(y)%10)+2*abs(f(x)/10-f(y)/10)for x,y in zip(i,i[1:]))

Usage:

g("tttt") -> 0

Vérifiez le ici.

Légèrement non golfé + explication:

f='qwertyuiopasdfghjkl zxcvbnm'.find  # Defining keyboard rows and aliasing find
g=lambda i:                           # Defining a function g which takes variable i
    sum(                              # Sum of 
        abs(f(x)%10-f(y)%10)          # horizontal distance, and
        + 2*abs(f(x)/10-f(y)/10)      # vertical distance,
        for x,y in zip(i,i[1:]))      # for each pair in the zipped list

# Example of zipping for those unaware:
# Let i = asksis, therefore i[1:] = sksis, and zip would make
# the list of pairs [(a,s),(s,k),(k,s),(s,i),(i,s)].
Kade
la source
5

Java, 266 octets

int c(String q){String[]r={"qwertyuiop","asdfghjkl","zxcvbnm"};int v=0,l=q.length();int[][]p=new int[l][2];for(int i=0;i<l;i++){while(p[i][0]<1)p[i][0]=r[p[i][1]++].indexOf(q.charAt(i))+1;v+=i<1?0:Math.abs(p[i][0]-p[i-1][0])+2*Math.abs(p[i][1]-p[i-1][1]);}return v;}

Version non golfée:

int c(String q) {
    String[] r = {
        "qwertyuiop",
        "asdfghjkl",
        "zxcvbnm"
    };
    int v = 0, l = q.length(); // v=return value, l = a shorter way to refer to input length
    int[][] p = new int[l][2]; // an array containing two values for each
                               // letter in the input: first its position
                               // within the row, then its row number (both
                               // 1 indexed for golfy reasons)
    for(int i = 0; i<l; i++) { // loops through each letter of the input
        while (p[i][0] < 1) // this loop populates both values of p[i]
            p[i][0] = r[p[i][1]++].indexOf(q.charAt(i))+1;
        v += (i<1) ? 0 : Math.abs(p[i][0]-p[i-1][0])+2*Math.abs(p[i][1]-p[i-1][1]); // adds onto return value
    }
    return v;
}
vijrox
la source
Vous pouvez économiser quelques octets en utilisantint v=0,l=q.length(),p[][]=new int[l][2];
Ypnypn
3

SWI-prolog, 162 octets

a(A):-a(A,0).
a([A,B|C],T):-Z=`qwertyuiopasdfghjkl0zxcvbnm`,nth0(X,Z,A),nth0(Y,Z,B),R is T+(2*abs(Y//10-X//10)+abs(Y mod 10-X mod 10)),(C=[],print(R);a([B|C],R)).

Exemple: a(`qmq`)sorties 20(Et trueaprès, mais je ne peux rien y faire).

Edit: a dû utiliser 3 octets de plus. Mon programme d'origine a réussi les cas de test donnés mais était en fait incorrect (les valeurs absolues étaient mal placées / manquantes)

Remarque: si vous voulez l'utiliser sur disons Ideone , vous devez remplacer tous les backquotes `par des guillemets doubles ". Les guillemets dans mon cas (qui est la norme actuelle dans SWI-Prolog) représentent la liste des codes pour les chaînes et les guillemets doubles, mais cela est différent dans les anciennes versions de SWI-Prolog.

Fatalize
la source