Очень странный счетчик слов

13

ВХОД: Любая строка, состоящая исключительно из строчных букв через аргумент функции, аргумент командной строки, STDIN или аналогичный.

ВЫХОД: Напечатайте или верните число, которое будет представлять сумму расстояний букв в соответствии со следующей метрикой:

Вы берете первую и вторую букву и подсчитываете расстояние между ними. Расстояние определяется раскладкой клавиатуры QWERTY, где каждая соседняя буква в той же строке имеет расстояние 1, а каждая соседняя буква в том же столбце имеет расстояние 2. Чтобы измерить расстояние между несмежными буквами, вы выбираете кратчайший путь. между двумя.

Примеры:

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

Затем вы берете вторую и третью букву, затем третью и четвертую и т. Д., Пока не дойдете до конца ввода. Выходными данными является сумма всех этих расстояний.

Пример ввода и вывода:

INPUT: qwer
OUTPUT: 3

INPUT: qsx
OUTPUT: 5

INPUT: qmq
OUTPUT: 20

INPUT: tttt
OUTPUT: 0

Вот изображение, показывающее, какие буквы находятся в одном столбце:

буквы в столбце

Это код гольф, поэтому выигрывает самый короткий код в байтах!

Vajura
источник
1
Я думаю, q-> m только 8 ключей ...
SuperJedi224
2
если вы идете вниз на один ряд, это считается как 2 расстояния, вы не учитываете ключевое расстояние
Vajura
его там тоже :)
Vajura
Можем ли мы предположить, что входная строка всегда будет непустой?
Алекс А.
Это очень похоже на codegolf.stackexchange.com/questions/50722/… . За исключением того, что для этого используются буквы, а для другого используются цифры.
Рето Коради

Ответы:

2

CJam, 50 байтов

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

Обратите внимание, что код содержит непечатаемые символы.

Попробуйте онлайн в интерпретаторе CJam . Если постоянная ссылка не работает, скопируйте код из этой вставки .

Фон

Мы начинаем присваивать позиции от 0 до 9 буквам в верхнем ряду, 10 до 18 буквам в домашнем ряду и от 20 до 26 буквам в нижнем ряду.

Позиции всех 26 букв в алфавитном порядке

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

Это массив длиной 26. Так как массивы оборачиваются в CJam, а кодовая точка буквы h равна 104 = 4 × 26 , мы поворачиваем массив на 7 единиц влево, чтобы доступ к позиции каждой буквы осуществлялся ее кодовая точка.

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

Теперь мы закодируем этот массив, рассматривая его элементы в цифрах от базового числа 27 и преобразуем полученное целое число в основание 257.

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

Заменяя каждое целое число на соответствующий символ Unicode, мы получаем строку из исходного кода.

Как это устроено

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.
Деннис
источник
1
человек, как это вообще работает
Vajura
@Vajura Деннис, как правило, находит время для добавления объяснений, если вы подождете, он, вероятно, добавит их :) Если вы хотите более расплывчатое / простое объяснение, мы с друзьями создали объяснение CJam, которое вы можете использовать здесь.
Каде
@ Ваджура: я отредактировал свой ответ.
Деннис
7

Python 2, 220 ... 124 119 байт

Огромное спасибо Sp3000 за сохранение большого количества байтов.

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

Использование:

g("tttt") -> 0

Проверьте это здесь.

Слегка разгромленный + объяснение:

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)].
Када
источник
5

Java, 266 байт

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

Безголовая версия:

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
источник
Вы можете сохранить несколько байтов с помощьюint v=0,l=q.length(),p[][]=new int[l][2];
Ypnypn
3

SWI-пролог, 162 байта

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

Пример: a(`qmq`)выходы 20true после этого, но я ничего не могу с этим поделать).

Редактировать: пришлось использовать еще 3 байта. Моя оригинальная программа прошла заданные тестовые случаи, но на самом деле была неверна (абсолютные значения были потеряны / отсутствуют)

Примечание: если вы хотите использовать его, скажем, Ideone , вы должны заменить все обратные `кавычки на двойные кавычки ". Обратные кавычки в моем случае (который является текущим стандартом в SWI-Prolog) представляют собой список кодов для строк и символьных строк в двойных кавычках, но это отличается в более старых версиях SWI-Prolog.

Fatalize
источник