Знайдіть найкоротший Шлейф-шлях


12

Вступ

Останнім часом я звикаю друкувати з Swype .

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

Наприклад, я можу набрати слово balloon, перебираючи через наступні літери:

b> a> l> o> n.

Виклик

Давайте визначимо найкоротший Шлейп Шлях або 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 , так як ніяких змін напрямку не потрібно , коли Swyping цього слова.

Вхідні дані

Одне слово-рядок, що містить будь-який a-zчерез STDIN, аргумент функції або командний рядок.

Вихідні дані

Роздрукуйте через STDOUT, поверніть або найближчу альтернативу мовам, число, що 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

h знаходиться на лінії від c до i, але між c і o немає літер?
Спарр

Якщо матеріали також повинні підтримувати великі літери, пропоную включити деякі в тестові випадки.
Денніс

@Sparr Правильно.
CzarMatt

@Dennis Хороший дзвінок - додано тестові випадки.
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.

На 20% коротше! З нетерпінням чекаю Вашого пояснення.
Денніс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.