Прогулка по клавиатуре


21

Задавая слово (или любую последовательность букв) в качестве входных данных, вы должны интерполировать между каждой буквой так, чтобы каждая соседняя пара букв в результате также была смежной с QWERTY-клавиатурой, как если бы вы вводили ввод, гуляя по гигантской клавиатуре. Например, « yes » может стать « y tr es », « cat » может стать « c xz a wer t ».

Правила:

  • Это формат клавиатуры, который вы должны использовать:

    qwertyuiop
    asdfghjkl
      zxcvbnm

    Любая пара клавиш, которая касается этого макета, считается смежной. Например, «s» и «e» являются соседними, а «s» и «r» - нет.

  • Вводимое слово будет состоять из любой последовательности букв. В нем будут только буквы, так что вам не придется иметь дело со специальными символами.
  • Ввод может быть в любой удобной форме: стандартный ввод, строка, список и т. Д. Буквенный регистр не имеет значения; Вы можете взять все, что вам удобнее.
  • Вывод может быть в любой удобной форме: стандартный вывод, строка, список и т. Д. Буквенный регистр не имеет значения, и он не должен быть согласованным.
  • Любой путь через клавиатуру действителен, за исключением того, что вы не можете пересечь предыдущую букву снова, прежде чем перейти к следующей букве. Например, « hi » может стать « h j i » или « h jnbgyu i », но не « h b h u i ».
  • Письмо не является соседним с самим собой, поэтому « опрос » не может стать « опросом ». Вместо этого это должно было бы стать чем-то вроде ' pol k l '.
  • Никакие выходные буквы не допускаются ни до, ни после слова. Например, « был » не может стать « был » или « был 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 Значение re.findallбудет оцениваться при запуске лямбды, поэтому импорт после определения лямбды в порядке. При этом импортировать раньше проще, просто нет необходимости
pushkin

@ Пушкин ах, я не знал, что спасибо за разъяснения! Вы импортировали после того, как просто личные предпочтения / выбор или это помогает с подсчетом байтов вообще?
Брюс Уэйн

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 вы сделали важное сокращение, вы можете обновить ответ :)
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

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