Bir Klavyenin İçinde Yürü


21

Girdi olarak bir sözcük (veya herhangi bir harf sırasını) verdiğinizde, sonuçtaki her bitişik harf çiftinin de, girişi dev bir klavyede yürüyerek yazdığınız gibi QWERTY klavyesinde bitişik olacağı şekilde her harf arasına enterpolasyon yapmanız gerekir. Örneğin, ' evet ', ' y tr es ' olabilir , ' kedi ' ' c xz a wer t ' olabilir.

Kurallar:

  • Bu kullanmanız gereken klavye formatıdır:

    qwertyuiop
    asdfghjkl
      zxcvbnm

    Bu düzende dokunan herhangi bir çift anahtar bitişik olarak kabul edilir. Örneğin, 's' ve 'e' belirgindir, ancak 's' ve 'r' değildir.

  • "Word" girişi herhangi bir harf sırasından oluşacaktır. Sadece harfleri olacak, bu yüzden özel karakterlerle uğraşmak zorunda değilsin.
  • Girdi, uygun herhangi bir biçimde olabilir: stdin, bir dize, bir liste, vb. Harf durumu önemli değildir; daha uygun olanı alabilirsin.
  • Çıktı, herhangi bir uygun biçimde olabilir: stdout, bir dize, bir liste, vb. Harf durumu önemli değildir ve tutarlı olması gerekmez.
  • Bir sonraki harfe gitmeden önce önceki harfi tekrar geçememeniz dışında, klavyedeki herhangi bir yol geçerlidir. Örneğin, ' hi ' 'haline gelebilir h j i ya da' ' h jnbgyu i ', ancak ' h b h u ı '.
  • Bir mektup yüzden 'kendisiyle ajacent değildir anket ' olamaz ' anketi '. Bunun yerine ' pol k l ' gibi bir şey olması gerekir .
  • Kelimeden önce veya sonra hiçbir çıkış harfine izin verilmez. Örneğin, ' oldu ' tre olamaz ' oldu ' veya ' oldu dfg'.

Bu kod golf, bayt cinsinden en kısa cevap kazanır.


Yani girdi başına geçerli bir 'yürüyüş' çıktısı alıyoruz? Bu, iki giriş verildiği gibi daha iyi olurdu, geçerli bir yürüyüş olup olmadığını belirleyin.
Veskah

İçin dewqwertygeçerli bir yol gibi görünüyor dy. Bunu onaylar mısın?
Arnauld,

@Arnauld evet, öyle.
Vaelus,

@ Veskah Bu doğru; bir girdi için geçerli bir yürüyüşü çıktılar. Bu, örneğin en kısa bir yürüyüş yapılması gerektiğinde mümkün olamayacak optimizasyonlara izin vermek içindir.
Vaelus,

Yanıtlar:


6

Japt -g , 23 bayt

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

Çevrimiçi deneyin!

Girdiyi büyük harf dizisi olarak alır. Aksi takdirde diğer cevaplara çok benzer.

Açıklama:

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

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

Çevrimiçi deneyin!

Sözcük yazılana kadar klavyenin tamamında yürür.


2
Daha import reönce değil, koddan sonra nasıl geliyor ?
BruceWayne

@BruceWayne Bu re.findalllambda çalıştığında değerlendirilecektir, bu yüzden lambda tanımını tamamladıktan sonra ithal. Olduğu söyleniyor, daha önce ithal etmek daha açık, sadece gerek yok
17'de

@pushkin ah, açıkladığınız için teşekkürler bilmiyordum! Kişisel bir tercih / seçenek olarak mı ithal ettiniz veya bayt sayımı ile hiç yardımcı oluyor mu?
BruceWayne

2
@BruceWayne Bu forum için yapılan bir kongre biraz. Sadece, TiO sitesinin kodu düzenleme biçimiyle çalışması için. "Çevrimiçi deneyin!" Seçeneğini tıklayın. ne demek istediğimi görmek için bağlantı.
Mypetlion

8

Python 2,274 bayt (en uygun çözüm)

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

Mypetlion sayesinde -4 bayt

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

Çevrimiçi deneyin!

Bu çözüm mümkün olan en kısa verimi verir. Klavye, çıkış dizesini hesaplamak için en kısa yolu bulmak için kullanılan bir grafiğe dönüştürülür:

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


1
@ mypetlion u önemli bir azaltma yaptı, cevabı güncelleyebilirsin :)
mdahmoune


3

05AB1E , 43 bayt

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

Bu meydan okuma için doğru dil değil, çünkü diğer cevapların yaptığı gibi regex kullanamaz.

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

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

Kömür , 48 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

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

İpi al qwertyuioplkmjnhbgvfcdxsza.

≔⌕η§θ⁰ζ

Kelimenin ilk karakterinin konumunu bulun. Bu indeks normalde az önce ulaşılan karakterden bir tanesidir ancak bu değer, kelimenin ilk karakterini yazdırmak için döngünün ilk yinelemesini düzenler.

Fθ

Her karakterin üzerinde döngü.

F⊕﹪⁻⌕ηιζ²⁶«

Kelimenin bir sonraki karakterini dahil etmek için kaç karakterin yazdırılacağını hesaplayın ve bu döngüyü birçok kez çevirin.

§ηζ≦⊕ζ

Döngüsel olarak dizine eklenmiş bir sonraki karakteri yazdır ve dizini arttır.


“Qwertyuioplkmjnhbgvfcdxsza” dizisini döndürmeyi ve rotasyonlardan birinin daha sıkıştırılabilir olup olmadığını görmeyi denediniz mi? Kömürün sıkıştırılmasına aşina değilim; belki bu mümkün değildir.
Vaelus

@Vaelus Ben de bilmiyorum bu yüzden 26 rotasyon da denedim ama hepsi 20 byte'a kadar sıkıştırıyor. Tabii ki, bunlar tüm olası yürüyüşler değil ...
Neil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.