キーボードを横切る


21

入力として単語(または文字のシーケンス)が与えられた場合、QWERTYキーボードでも、巨大なキーボードを歩いて入力を入力したかのように、結果の隣接する各文字ペアが隣接するように、各文字間を補間する必要があります。たとえば、 ' はい ' 'になる可能性がありますY TR ES '、 ' 猫は ' 'になる可能性がありますC XZ A WER トン '。

ルール:

  • これは、使用すべきキーボード形式です。

    qwertyuiop
    asdfghjkl
      zxcvbnm

    このレイアウトで触れているキーのペアは、隣接していると見なされます。たとえば、「s」と「e」は隣接していますが、「s」と「r」は隣接していません。

  • 入力「単語」は、任意の文字列で構成されます。文字のみであるため、特殊文字を扱う必要はありません。
  • 入力は、stdin、文字列、リストなどの任意の便利な形式にすることができます。大文字と小文字は区別されません。より便利なものなら何でも取ることができます。
  • 出力は、stdout、文字列、リストなどの便利な形式にすることができます。大文字と小文字は区別されず、一貫している必要はありません。
  • 次の文字に到達する前に前の文字を再度横切ることができないことを除いて、キーボードを通るパスはすべて有効です。たとえば、「hi」は「h j i」または「h jnbgyu i」になりますが、「h b h u i」にはなりません。
  • 手紙はそれ自体と隣接していないため、 ' poll 'は ' poll 'になりません。代わりに、 ' pol k l 'のようなものになる必要があります。
  • 単語の前後に出力文字を含めることはできません。たとえば、「だった」は「tre だった」または「だった dfg」になることはできません。

これはコードゴルフで、バイト単位の最短回答が勝ちです。


入力ごとに有効な「ウォーク」を出力していますか?これは、2つの入力が与えられて、それが有効な歩行であるかどうかを判断する方が良いように思われます。
ヴェスカー

dewqwerty有効なパスのようですdy。確認できますか?
アルノー

@Arnauldはい、そうです。
Vaelus

@Veskahそうです。入力の有効な歩行を出力します。これは、たとえば、最短距離で歩かなければならない場合に不可能な最適化を可能にするためです。
Vaelus

回答:


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のバイト

mypetlionのおかげで-4バイト

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

≔⌕η§θ⁰ζ

単語の最初の文字の位置を見つけます。このインデックスは通常、到達した文字の1つ前ですが、この値はループの最初の反復を偽装して、単語の最初の文字を出力します。

Fθ

各文字をループします。

F⊕﹪⁻⌕ηιζ²⁶«

単語の次の文字を含めるために印刷する文字数を計算し、その回数ループします。

§ηζ≦⊕ζ

周期的にインデックス付けされた次の文字を出力し、インデックスをインクリメントします。


文字列「qwertyuioplkmjnhbgvfcdxsza」を回転させて、回転のいずれかがさらに圧縮可能かどうかを確認しましたか?私は木炭の圧縮には慣れていません。多分これは不可能です。
Vaelus

@Vaelus私も知らないので、26回転すべてを試しましたが、それらはすべて20バイトに圧縮されます。もちろん、これらはすべての可能な散歩...のではありません
ニール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.