Der sehr seltsame Wortzähler

13

EINGABE: Ein beliebiger String, der ausschließlich aus Kleinbuchstaben besteht (Funktionsargument, Befehlszeilenargument, STDIN oder ähnliches).

AUSGABE: Eine Zahl drucken oder zurückgeben, die die Summe der Abstände der Buchstaben gemäß der folgenden Metrik darstellt:

Sie nehmen den ersten und zweiten Buchstaben und zählen den Abstand zwischen ihnen. Der Abstand wird durch das QWERTZ-Tastaturlayout definiert. Dabei hat jeder benachbarte Buchstabe in derselben Zeile den Abstand 1 und jeder benachbarte Buchstabe in derselben Spalte den Abstand 2. Um den Abstand zwischen Buchstaben zu messen, die nicht benachbart sind, wählen Sie den kürzesten Weg zwischen den beiden.

Beispiele:

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

Dann nehmen Sie den zweiten und dritten Buchstaben, dann den dritten und vierten usw., bis Sie das Ende der Eingabe erreichen. Die Ausgabe ist die Summe aller dieser Entfernungen.

Beispiel Ein- und Ausgabe:

INPUT: qwer
OUTPUT: 3

INPUT: qsx
OUTPUT: 5

INPUT: qmq
OUTPUT: 20

INPUT: tttt
OUTPUT: 0

Hier ist ein Bild, das zeigt, welche Buchstaben sich in derselben Spalte befinden:

Buchstaben in der Spalte

Das ist Code Golf, also gewinnt der kürzeste Code in Bytes!

Vajura
quelle
1
Ich denke, q-> m ist nur 8 Tasten ...
SuperJedi224
2
Wenn Sie eine Reihe nach unten gehen, zählt dies als Distanz von 2, Sie zählen nicht die Schlüsseldistanz
Vajura
Es ist auch da oben :)
Vajura
Können wir davon ausgehen, dass die Eingabezeichenfolge immer nicht leer sein wird?
Alex A.
Dies ähnelt codegolf.stackexchange.com/questions/50722/… . Abgesehen davon, dass dies Buchstaben verwendet, während der andere Zahlen verwendet.
Reto Koradi

Antworten:

2

CJam, 50 Bytes

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

Beachten Sie, dass der Code nicht druckbare Zeichen enthält.

Probieren Sie es online im CJam-Interpreter aus . Wenn der Permalink nicht funktioniert, kopieren Sie den Code aus dieser Paste .

Hintergrund

Wir beginnen, den Buchstaben in der oberen Reihe die Positionen 0 bis 9 zuzuweisen , den Buchstaben in der Ausgangsreihe die Positionen 10 bis 18 und den Buchstaben in der unteren Reihe die Positionen 20 bis 26 .

Die Positionen aller 26 Buchstaben in alphabetischer Reihenfolge sind

[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]

Dies ist ein Array mit der Länge 26. Da Arrays in CJam umschlingen, und der Codepunkt des Buchstaben H ist 104 = 4 × 26 , wir die Array 7 Einheiten nach links zu drehen, so dass jede Position des Buchstaben kann durch seine zugegriffen werden Codepunkt.

[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]

Jetzt codieren wir dieses Array, indem wir die Ziffern der Elemente einer Zahl zur Basis 27 betrachten und die resultierende Ganzzahl in die Zahl zur Basis 257 konvertieren.

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

Durch Ersetzen der einzelnen Ganzzahlen durch das entsprechende Unicode-Zeichen erhalten wir die Zeichenfolge aus dem Quellcode.

Wie es funktioniert

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
quelle
1
Mann, wie funktioniert das überhaupt
Vajura
@Vajura Dennis fügt normalerweise Erklärungen hinzu, wenn Sie warten, wird er wahrscheinlich eine hinzufügen .
Kade,
@ Vajura: Ich habe meine Antwort bearbeitet.
Dennis
7

Python 2, 220 ... 124 119 Bytes

Ein großes Dankeschön an Sp3000 für das Speichern vieler Bytes.

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:]))

Verwendung:

g("tttt") -> 0

Schau es dir hier an.

Leicht ungolfed + Erklärung:

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
quelle
5

Java, 266 Bytes

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;}

Ungolfed-Version:

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
quelle
Sie können ein paar Bytes speichern, indem Sieint v=0,l=q.length(),p[][]=new int[l][2];
Ypnypn
3

SWI-Prolog, 162 Bytes

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)).

Beispiel: a(`qmq`) Outputs 20(und truedanach kann ich nichts mehr dagegen tun).

Bearbeiten: musste 3 weitere Bytes verwenden. Mein ursprüngliches Programm hat die angegebenen Testfälle bestanden, war aber tatsächlich falsch (absolute Werte wurden verlegt / fehlen)

Hinweis: Wenn Sie Ideone verwenden möchten , müssen Sie alle Anführungszeichen `durch doppelte Anführungszeichen ersetzen ". In meinem Fall stellen Anführungszeichen (der derzeitige Standard in SWI-Prolog) eine Codeliste für Zeichenfolgen und Zeichenfolgen in doppelten Anführungszeichen dar. Dies ist jedoch in älteren Versionen von SWI-Prolog anders.

Tödlich
quelle