Đi bộ qua bàn phím


21

Đưa ra một từ (hoặc bất kỳ chuỗi chữ cái nào) làm đầu vào, bạn phải nội suy giữa mỗi chữ cái sao cho mỗi cặp chữ cái liền kề trong kết quả cũng liền kề trên bàn phím QWERTY, như thể bạn gõ đầu vào bằng cách đi trên bàn phím khổng lồ. Ví dụ: ' ' có thể trở thành ' y tr es ', ' mèo ' có thể trở thành ' c xz a wer t '.

Quy tắc:

  • Đây là định dạng bàn phím bạn nên sử dụng:

    qwertyuiop
    asdfghjkl
      zxcvbnm

    Bất kỳ cặp phím nào chạm vào bố cục này đều được coi là liền kề. Chẳng hạn, 's' và 'e' gần nhau, nhưng 's' và 'r' thì không.

  • "Từ" đầu vào sẽ bao gồm bất kỳ chuỗi chữ cái nào. Nó sẽ chỉ có các chữ cái, vì vậy bạn không phải đối phó với các ký tự đặc biệt.
  • Đầu vào có thể ở bất kỳ dạng thuận tiện nào: stdin, chuỗi, danh sách, v.v ... Trường hợp chữ cái không quan trọng; bạn có thể lấy bất cứ điều gì thuận tiện hơn.
  • Đầu ra có thể ở bất kỳ dạng thuận tiện nào: stdout, chuỗi, danh sách, v.v ... Trường hợp chữ cái không quan trọng, và nó không cần phải nhất quán.
  • Bất kỳ đường dẫn nào trên bàn phím đều hợp lệ, ngoại trừ việc bạn không thể vượt qua chữ cái trước đó một lần nữa trước khi đến chữ cái tiếp theo. Ví dụ: ' hi ' có thể trở thành ' h j i ' hoặc ' h jnbgyu i ', nhưng không phải là ' h b h u i '.
  • Một lá thư không liền kề với chính nó, vì vậy ' cuộc thăm dò ' không thể trở thành ' cuộc thăm dò '. Thay vào đó, nó sẽ cần phải trở thành một cái gì đó như ' pol k l '.
  • Không có chữ cái đầu ra được cho phép trước hoặc sau từ. Ví dụ: ' was ' không thể trở thành 'tre was ' hoặc ' was dfg'.

Đây là mã golf, câu trả lời ngắn nhất trong byte thắng.


Vì vậy, chúng tôi xuất ra bất kỳ 'đi bộ' hợp lệ cho mỗi đầu vào? Điều này có vẻ như sẽ tốt hơn khi được đưa ra hai đầu vào, xác định xem đó có phải là một bước đi hợp lệ hay không.
Veskah

Có vẻ như dewqwertylà một con đường hợp lệ cho dy. Bạn có thể xác nhận điều đó?
Arnauld

@Arnauld vâng, đúng vậy.
Vaelus

@Veskah Đúng vậy; đầu ra bất kỳ đi bộ hợp lệ cho một đầu vào. Điều này là để cho phép tối ưu hóa mà có thể không thể nếu, ví dụ, nó phải đi bộ ngắn nhất.
Vaelus

Câu trả lời:


6

Japt -g , 23 byte

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

Hãy thử trực tuyến!

Đưa đầu vào như một mảng các chữ in hoa. Rất giống với các câu trả lời khác.

Giải trình:

;                          :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 byte

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

Hãy thử trực tuyến!

Đi bộ toàn bộ bàn phím cho đến khi từ được viết.


2
Làm thế nào đến import resau mã, không phải trước?
BruceWayne

@BruceWayne re.findallSẽ được đánh giá khi lambda chạy, vì vậy nhập sau định nghĩa của lambda là ok. Điều đó đang được nói, rõ ràng là nhập khẩu trước đây, không cần phải
Pushkin

@pushkin ah, tôi không biết cảm ơn vì đã làm rõ! Bạn đã nhập sau khi chỉ là một sở thích / lựa chọn cá nhân hay nó có giúp ích gì cho việc đếm byte không?
BruceWayne

2
@BruceWayne Đó là một chút quy ước cho diễn đàn này. Nó chỉ để nó hoạt động với cách trang web TiO tổ chức mã. Hãy thử nhấp vào "Thử trực tuyến!" liên kết để xem những gì tôi có ý nghĩa.
mypetlion

8

Python 2 , 274 byte (giải pháp tối ưu)

296 300 302 308 315 319 324 327 328 430 432 432 byte

-4 byte nhờ vào 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

Hãy thử trực tuyến!

Giải pháp này cho đầu ra ngắn nhất có thể. Bàn phím được chuyển thành biểu đồ được sử dụng để tìm đường đi ngắn nhất để tính chuỗi đầu ra:

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


1
@mypetlion u đã thực hiện một giảm quan trọng, bạn có thể cập nhật câu trả lời :)
mdahmoune


3

05AB1E , 43 byte

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

Không phải ngôn ngữ phù hợp cho thử thách này, vì nó không thể sử dụng regex như các câu trả lời khác đã làm ..

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

ü)               # 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

Than , 48 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

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

Lấy chuỗi qwertyuioplkmjnhbgvfcdxsza.

≔⌕η§θ⁰ζ

Tìm vị trí của ký tự đầu tiên của từ. Chỉ mục này thường là một trong quá khứ mà ký tự vừa đạt được, nhưng giá trị này tạo ra lần lặp đầu tiên của vòng lặp để in ký tự đầu tiên của từ.

Fθ

Vòng qua từng nhân vật.

F⊕﹪⁻⌕ηιζ²⁶«

Tính toán có bao nhiêu ký tự để in để bao gồm ký tự tiếp theo của từ và vòng lặp đó nhiều lần.

§ηζ≦⊕ζ

In ký tự tiếp theo được lập chỉ mục theo chu kỳ và tăng chỉ mục.


Bạn đã thử xoay chuỗi dây qwertyuioplkmjnhbgvfcdxsza và xem liệu có bất kỳ sự quay nào xảy ra để có thể nén hơn không? Tôi không quen với nén than; có lẽ điều này là không thể
Vaelus

@Vaelus Tôi cũng không biết nên tôi đã thử tất cả 26 phép quay nhưng tất cả chúng đều nén đến 20 byte. Tất nhiên, đó không phải là tất cả những bước đi có thể ...
Neil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.