Прогулянка по клавіатурі


21

Визначаючи слово (або будь-яку послідовність літер) як введення, ви повинні інтерполювати між кожною буквою так, щоб кожна сусідня пара букв у результаті також була сусідньою на клавіатурі QWERTY, як якщо б ви ввели вхід, переходячи по гігантській клавіатурі. Наприклад, " так " може стати " y tr es ", " кішка " може стати " c xz a wer t ".

Правила:

  • Це формат клавіатури, який ви повинні використовувати:

    qwertyuiop
    asdfghjkl
      zxcvbnm

    Будь-яка пара клавіш, яка торкається в цьому макеті, вважається суміжною. Наприклад, 's' і 'e' є суміжними, але 's' і 'r' - ні.

  • Вхідне "слово" буде складатися з будь-якої послідовності літер. У ньому будуть лише букви, тож вам не доводиться мати справу зі спеціальними символами.
  • Вхід може бути в будь-якій зручній формі: stdin, рядок, список тощо. Пропис літери не має значення; ви можете взяти все, що зручніше.
  • Вихід може бути в будь-якій зручній формі: stdout, рядок, список тощо. Пропис букв не має значення, і він не повинен бути узгодженим.
  • Будь-який шлях через клавіатуру є дійсним, за винятком того, що ви не можете перекреслити попередній лист ще до того, як перейти до наступного листа. Наприклад, " привіт " може стати " h j i " або " h jnbgyu i ", але не " h b h u i ".
  • Лист сам по собі не відповідає, тому " опитування " не може стати " опитуванням ". Натомість потрібно було б стати чимось на зразок ' pol k l '.
  • Не допускаються жодні вихідні літери до або після цього слова. Наприклад, " was " не може стати "tre was " або " was dfg".

Це кодовий гольф, найкоротша відповідь у байтах виграє.


Отже, ми виводимо будь-яку дійсну «прогулянку» на вхід? Це здається, що було б краще, оскільки дано два входи, визначте, чи це дійсна прогулянка.
Веска

Здається dewqwerty, це дійсний шлях для dy. Чи можете ви це підтвердити?
Арнольд

@Arnauld так, так і є.
Ваелюс

@Veskah Правильно; вивести будь-яку дійсну прогулянку для вводу. Це передбачає оптимізацію, яка може бути неможливою, якби, наприклад, це було найкоротшою прогулянкою.
Ваелюс

Відповіді:


6

Japt -g , 23 байти

;D·ÎÔ+D·Årí)pUl)fUq".*?

Спробуйте в Інтернеті!

Вводиться як масив великих літер. Дуже схоже на інші відповіді інакше.

Пояснення:

;                          :Set D to the keyboard layout
 D·Î                       :Get the first row of keys
    Ô                      :Reversed
     +                     :Concat
      D·Å                  :The other two rows
         rí)               :Interleaved
            p              :Repeat that string
             Ul)           : A number of times equal to the length of the input
                f          :Get the substrings that match
                 U         : The input
                  q".*?    : joined with ".*?"
                           :Implicitly output just once of the matches

14

Python 2 , 83 байти

lambda s:re.findall('.*?'.join(s),'qwertyuioplkmnjhbvgfcxdsza'*len(s))[0]
import re

Спробуйте в Інтернеті!

Ходить по всій клавіатурі, поки слово не буде написано.


2
Як же import reприходить після коду, а не раніше?
BruceWayne

@BruceWayne re.findallОцінюватиметься коли працює лямбда, тому імпорт після визначення лямбда нормальний. Як сказано, раніше імпортувати зрозуміліше, просто не потрібно
пушкін

@pushkin ах, я не знав, що дякую за уточнення! Чи імпортували ви лише як особисті переваги / вибір чи це взагалі допомагає у кількості байтів?
BruceWayne

2
@BruceWayne Це трохи умова для цього форуму. Це просто так, що він працює з тим, як сайт TiO впорядковує код. Спробуйте натиснути на "Спробуйте онлайн!" посилання, щоб побачити, що я маю на увазі.
mypetlion

8

Python 2 , 274 байт (оптимальне рішення)

296 300 302 308 315 319 324 327 328 430 432 байт

-4 байти завдяки mypetlion

from networkx import*
i=input()
M,z='qwertyuiop  asdfghjkl   zxcvbnm'.center(55),i[:1]
G=from_edgelist([(M[e],M[e+h])for h in[-1,1,11,12,-11,-12]for e in range(44)if' '!=M[e]and' '!=M[e+h]])
for y,x in zip(i,i[1:]):z+=[shortest_path(G,y,x)[1:],list(G[y])[0]+y][x==y]
print z

Спробуйте в Інтернеті!

Це рішення дає найкоротший можливий вихід. Клавіатура перетворюється на графік, який використовується для пошуку найкоротшого шляху для обчислення вихідного рядка:

puzzles     --> poiuhbvcxzazxcvbhjklkiuytres
programming --> poiuytrtyuioijhgtresasdcvbnmkmkijnbg
code        --> cvbhjioijhgfde
golf        --> ghjiolkjhgf
yes         --> ytres
hi          --> hji
poll        --> polpl


1
@mypetlion u зробив важливе зменшення, ви можете оновити відповідь :)
mdahmoune


3

05AB1E , 43 байти

ü)Jε©žVćRs`.ιJ«D«Œʒg≠yн®нQyθ®θQ**}yªн¨}JIθ«

Не правильна мова для цього завдання, оскільки він не може використовувати регулярний вираз, як інші відповіді.

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

ü)               # Split the input into overlapping pairs
                 #  i.e. "poll" → ["p","o"],["o","l"],["l","l"]]
  J              # Join each inner list together
                 #  i.e. ["p","o"],["o","l"],["l","l"]] → ["po","ol","ll"]
   ε             # Map each to:
    ©            #  Store the current value in the register
    žV           #  Push ["qwertyuiop","asdfghjkl","zxcvbnm"]
    ćR           #  Extract the head, and reverse it
                 #   i.e. ["qwertyuiop","asdfghjkl","zxcvbnm"] → "poiuytrewq"
    s`           #  Swap to take the remainder, and push them to the stack
               #  And then interweave them with each other
                 #   i.e. ["asdfghjkl","zxcvbnm"]
                 #    → ["a","z","s","x","d","c","f","v","g","b","h","n","j","m","k","l"]
        J        #  Join the list to a single string
                 #   i.e. → "azsxdcfvgbhnjmkl"
         «       #  Merge them together
                 #   i.e. "qwertyuiop" and "azsxdcfvgbhnjmkl"
                 #    → "poiuytrewqazsxdcfvgbhnjmkl"
          D«     #  Duplicate it, and append it to itself
                 #   i.e. "poiuytrewqazsxdcfvgbhnjmkl"
                 #    → "poiuytrewqazsxdcfvgbhnjmklpoiuytrewqazsxdcfvgbhnjmkl"
            Π   #  Get all substrings of this strings
                 #   i.e. → ["p","po","poi",...,"k","kl","l"]
ʒ              } #  Filter this list by:
 g              #   Where the length is NOT 1 (otherwise pair "ll" would result in "l")
              *  #   and
   yн®нQ         #   Where the first character of the substring and pair are the same
             *   #   and
        yθ®θQ    #   Where the last character of the substring and pair are the same
                 #    i.e. "po" → []
                 #    i.e. "ll" → ["lazsxdcfvgbhnjmkl"]
yª               #  After filtering, append the current pair to the filtered list
                 #   i.e. [] → ["po"]
                 #   i.e. ["lazsxdcfvgbhnjmkl"] → ["lazsxdcfvgbhnjmkl","ll"]
  н              #  Get the first item
                 #   ["po"] → "po"
                 #   ["lazsxdcfvgbhnjmkl","ll"] → "lazsxdcfvgbhnjmkl"
   ¨             #  Remove the last character
                 #   i.e. "po" → "p"
                 #   i.e. "lazsxdcfvgbhnjmkl" → "lazsxdcfvgbhnjmk"
}                # Close the map
 J               # Join everything together
                 #  i.e. ["p","o","lazsxdcfvgbhnjmk"] → "polazsxdcfvgbhnjmk"
  Iθ«            # And append the last character of the input
                 # (and output the result implicitly)
                 #  i.e. "polazsxdcfvgbhnjmk" and "poll" → "polazsxdcfvgbhnjmkl"

3

Вугілля деревне , 48 байт

≔”&⌈″⌊5EWXVNa…-εW¶ζR”η≔⌕η§θ⁰ζFθF⊕﹪⁻⌕ηιζ²⁶«§ηζ≦⊕ζ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

≔”&⌈″⌊5EWXVNa…-εW¶ζR”η

Отримайте рядок qwertyuioplkmjnhbgvfcdxsza.

≔⌕η§θ⁰ζ

Знайдіть позицію першого символу слова. Цей показник, як правило, минув щойно досягнутого символу, але це значення вимикає першу ітерацію циклу для друку першого символу слова.

Fθ

Петля над кожним символом.

F⊕﹪⁻⌕ηιζ²⁶«

Обчисліть кількість символів для друку, щоб включити наступний символ слова та циклу, який багато разів.

§ηζ≦⊕ζ

Друкуйте наступний символ циклічно з індексом та збільшуйте індекс.


Ви спробували обертати рядок "qwertyuioplkmjnhbgvfcdxsza" і побачили, чи трапляється якесь із обертів більш стисливим? Я не знайомий із стисканням деревного вугілля; можливо, це неможливо.
Ваелюс

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