Berjalan Melintasi Keyboard


21

Diberi kata (atau urutan huruf apa pun) sebagai input, Anda harus menyisipkan di antara setiap huruf sedemikian rupa sehingga setiap pasangan huruf yang berdekatan dalam hasil juga berdekatan pada keyboard QWERTY, seolah-olah Anda mengetik input dengan berjalan di keyboard raksasa. Misalnya, ' ya ' mungkin menjadi ' y tr es ', ' kucing ' mungkin menjadi ' c xz sebuah wer t '.

Aturan:

  • Ini adalah format keyboard yang harus Anda gunakan:

    qwertyuiop
    asdfghjkl
      zxcvbnm

    Setiap pasangan tombol yang menyentuh dalam tata letak ini dianggap berdekatan. Sebagai contoh, 's' dan 'e' berdekatan, tetapi 's' dan 'r' tidak.

  • Input "kata" akan terdiri dari urutan huruf apa saja. Hanya akan memiliki huruf, jadi Anda tidak harus berurusan dengan karakter khusus.
  • Masukan bisa dalam bentuk apa pun yang nyaman: stdin, string, daftar, dll. Huruf surat tidak masalah; Anda dapat mengambil apa pun yang lebih nyaman.
  • Outputnya bisa dalam bentuk apa pun: stdout, string, daftar, dll. Huruf huruf tidak masalah, dan tidak perlu konsisten.
  • Jalur apa pun di keyboard itu valid, kecuali bahwa Anda tidak dapat melewati huruf sebelumnya lagi sebelum sampai ke huruf berikutnya. Misalnya, ' hai ' bisa menjadi ' h j i ' atau ' h jnbgyu i ', tetapi bukan ' h b h u i '.
  • Surat tidak berbatasan dengan dirinya sendiri, jadi ' jajak pendapat ' tidak bisa menjadi ' jajak pendapat '. Sebaliknya itu harus menjadi sesuatu seperti ' pol k l '.
  • Tidak ada surat keluaran yang diizinkan sebelum atau setelah kata. Sebagai contoh, ' was ' tidak dapat menjadi 'tre was ' atau ' was dfg'.

Ini adalah kode golf, jawaban terpendek dalam byte menang.


Jadi kami mengeluarkan 'jalan' per input yang valid? Sepertinya ini akan lebih baik karena diberi dua input, tentukan apakah itu jalan yang valid.
Veskah

Sepertinya dewqwertyini adalah jalur yang valid untuk dy. Bisakah Anda mengonfirmasi itu?
Arnauld

@Arnauld ya, benar.
Vaelus

@ Vespa Itu benar; output setiap jalan yang valid untuk input. Ini untuk memungkinkan pengoptimalan yang tidak mungkin dilakukan jika, misalnya, harus berjalan paling singkat.
Vaelus

Jawaban:


6

Japt -g , 23 byte

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

Cobalah online!

Mengambil input sebagai array huruf kapital. Sangat mirip dengan jawaban lain sebaliknya.

Penjelasan:

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

Cobalah online!

Berjalan seluruh keyboard sampai kata itu ditulis.


2
Bagaimana bisa import resetelah kode, bukan sebelumnya?
BruceWayne

@BruceWayne The re.findallakan dievaluasi ketika lambda berjalan, jadi mengimpor setelah definisi lambda ok. Yang sedang berkata, itu lebih jelas untuk mengimpor sebelumnya, hanya tidak perlu
pushkin

@ pushkin ah, saya tidak tahu itu terima kasih telah menjelaskan! Apakah Anda mengimpor setelah hanya sebagai preferensi / pilihan pribadi atau apakah itu membantu dengan jumlah byte sama sekali?
BruceWayne

2
@BruceWayne Ini sedikit konvensi untuk forum ini. Hanya agar berfungsi dengan cara situs TiO mengatur kode. Coba klik pada "Coba online!" untuk melihat apa yang saya maksud.
mypetlion

8

Python 2 , 274 byte (solusi optimal)

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

-4 byte berkat 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

Cobalah online!

Solusi ini memberikan output sesingkat mungkin. Keyboard diubah menjadi grafik yang digunakan untuk menemukan jalur terpendek untuk menghitung string keluaran:

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


1
@mypetlion u membuat pengurangan penting, Anda dapat memperbarui jawabannya :)
mdahmoune

4

JavaScript (ES6), 70 byte

Strategi yang sama seperti TFeld.

s=>'qazsxdcfvgbhnjmklpoiuytrew'.repeat(s.length).match(s.join`.*?`)[0]

Cobalah online!


3

05AB1E , 43 byte

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

Bukan bahasa yang tepat untuk tantangan ini, karena itu tidak dapat menggunakan regex seperti jawaban lainnya.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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

Arang , 48 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

Dapatkan talinya qwertyuioplkmjnhbgvfcdxsza.

≔⌕η§θ⁰ζ

Temukan posisi karakter pertama dari kata tersebut. Indeks ini biasanya satu melewati karakter yang baru saja dicapai, tetapi nilai ini memalsukan iterasi pertama dari loop untuk mencetak karakter pertama dari kata tersebut.

Fθ

Ulangi setiap karakter.

F⊕﹪⁻⌕ηιζ²⁶«

Hitung berapa banyak karakter yang akan dicetak untuk memasukkan karakter berikutnya dari kata dan loop yang berkali-kali.

§ηζ≦⊕ζ

Cetak karakter berikutnya yang diindeks secara siklis dan tambahkan indeks.


Sudahkah Anda mencoba memutar string “qwertyuioplkmjnhbgvfcdxsza” dan melihat apakah ada rotasi yang lebih kompresif? Saya tidak terbiasa dengan kompresi arang; mungkin ini tidak mungkin.
Vaelus

@Vaelus Saya juga tidak tahu jadi saya mencoba semua 26 rotasi tetapi mereka semua kompres hingga 20 byte. Tentu saja, itu bukan jalan yang mungkin ...
Neil
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.