Найти кратчайший путь Swype

12

Вступление

В последнее время я привык печатать на Swype .

Я заметил, что некоторые слова могут быть получены путем рисования прямой линии от вашего начального до конечного или пропуская повторяющиеся буквы.

Например, я могу набрать слово с balloonпомощью Swyping через следующие буквы:

b> a> l> o> n.

Вызов

Давайте определим кратчайший путь Swype , или SSP, как минимальное количество различимых отрезков линии, необходимых для ввода строки. Сегмент прямой представляет собой непрерывную прямую линию между любыми двумя или более буквами. При любом изменении направления начинается новый отрезок линии - хотя некоторые слова можно поменять местами, нарисовав только одну прямую линию.

Используйте эту простую раскладку клавиатуры QWERTY :

q w e r t y u i o p
a s d f g h j k l
  z x c v b n m

В приведенном выше примере, слово balloonбудет иметь SSPиз , 4как подробно описано в последовательности ниже:

1) Start at `b` (line segments = 0)
2) slide to `a` (line segments = 1)
3) slide to `l` (line segments = 2)
4) slide to `o` (line segments = 3)
5) slide to `n` (line segments = 4)

Строка qwertyимеет SSP= 1, так как при переключении этого слова изменение направления не требуется.

вход

Строка из одного слова, содержащая любое с a-zпомощью STDIN, аргумента функции или командной строки.

Выход

Напечатайте с помощью STDOUT, return или ваших ближайших альтернативных языков число, nпредставляющее строку SSP.

Один завершающий перевод новой строки необязателен в outut. Стандартные лазейки запрещены. Кратчайшая подача в байтах выигрывает.

Примечания

  • Изменение направления запускает новый отрезок.
  • Повторяющиеся буквы учитываются только один раз (например, bookkeeperдолжны рассматриваться как bokeper).
  • Как правило, Swpye исправляет пропущенные буквы, просматривая соседние буквы и вводя свои лучшие предположения. Для этого предположим, что нет никаких дополнений на естественном языке, предиктивного текста или исправления ошибок.
  • Прописные A-Zвводы обрабатываются как их строчные аналоги.
  • Игнорировать любые цифры 0-9на входе.
  • Диагональные дорожки разрешены - то есть, прямая линия , которая охватывает буквы o, k, n, например, считается 1сегмент. Это правило относится к любым диагональная наклона (например , буквы c, h, iв строке).

Примеры

Input          Output
---------------------
a                0
aa               0
aaaaaa           0
aaaaaabc         2
in               1
int              2
java             3
qwerty           1
chicago          5
balloon          4
BALLOON          4
typewriter       5
bookkeeper       6
stackexchange    11
2hello7          3
2HELLO7          3
CzarMatt
источник
h находится на линии от c до i, но между c и o нет букв?
Спарр
Если материалы должны поддерживать заглавные буквы, я предлагаю включить некоторые из них в контрольные примеры.
Деннис
@Sparr Правильно.
CzarMatt
@Dennis Good call - добавлены тестовые случаи.
CzarMatt
Мне нравится печатать на Swype, но я не знаю, как программировать строки ...
mbomb007

Ответы:

8

CJam, 78 76 73 68 62 байта

relA,s-:_2ew{:-},{{i"x8LÑejPG ÀÏi"225b28b=A+Ab}/.-:ma}%e`,

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

Занимая умную идею @ isaacg об использовании RLE для подсчета путей, сохраненных 6 байтов.

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

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

rel      e# Read a token from STDIN and cast it to lowercase.
A,s-     e# Remove all digits.
:_       e# Duplicate each element of the argument (string/array).
2ew      e# Push all overlapping slices of length 2.
{:-},    e# Filter out slices where both elements are equal.
{        e# For each slice:
  {      e#   For each character of the slice:
    i    e#     Push its code point.

    "x8LÑejPG ÀÏi"225b28b

         e#     Convert the string from base 225 to base 28, pushing the array
         e#     [15 7 16 17 18 27 26 8 9 0 3 11 4 6 24 1 22 5 21 10 25 23 12 2 13 14].
         e#     These are the positions on the QWERTY keyboard, starting from the
         e#     upper left corner and going right.

    =    e#     Select the element that corresponds to the code point.

         e#     Arrays wrap around in CJam. Since 'a' has code point 97, the array has
         e#     length 26 and 97 % 26 == 19, 'a' corresponds to the 20th element.

    A+Ab e#     Add 10 and convert to base 10. Example: 8 -> [1 8]
  }/     e#
  .-     e#     Vectorized subtraction. [a b] [c d] -> [a-c b-d]
  :ma    e#     atan2. Pushes the angle of the direction. [y x] -> arctan(y/x)
}%       e#
e`       e# Apply run-length encoding.
,        e# Count the runs.
Деннис
источник
Очень умно. Спасибо за объяснение.
CzarMatt
3

Pyth, 53 50 49 байтов

lrPMfT-VJm.jF.D@jC"XÖ;¿ìÇ×;¤ð$  _"28CdT@GrzZtJ8

Формат сжатия клавиатуры благодаря @Dennis.

Этот ответ содержит некоторые непечатные символы. Смотрите ссылки ниже для правильного кода.

Демонстрация . Тест Жгут.

Объяснение:

lrPMfT-VJm.jF.D@jC"..."28CdT@GrzZtJ8
                              rzZ      Convert input to lowercase.
                            @G         Take the intersection with G.
                                       This removes the numbers.
         m                             Map over the characters
                 C"..."                Treat the string as a base 256 number.
                j      28              Convert this number to base 28, giving:
                                       [15, 7, 16, 17, 18, 27, 26,  ... ]
                                       which is the character positions 
                                       from top left, rotated by 97 places.
               @         Cd            Index this list by ord(character)
             .D            T           divmod by 10, giving the x-y position.
          .jF                          Convert this to a complex number.
        J                              Save the result to J.
      -VJ                        tJ    Vectorize - over J and J[1:]. This gives
                                       pairwise diffeences between J's elements.
    fT                                 Filter the differences on being truthy.
                                       This removes letter pairs with no movement.
  PM                                   Map the remaining complex numbers to their
                                       phases, which indicates their directions.
 r                                 8   Run-length encode the result.
l                                      Print out the number of separate RLE groups.
isaacg
источник
Более чем на 20% короче! Ждем ваших объяснений.
Деннис