単語は互いに隣接するキーで入力可能ですか?


13

これを読む前に、この小さなパズルを読むことをお勧めしますhttps : //puzzling.stackexchange.com/questions/11408/longest-word-with-adjacent-letters-on-a-keyboard

1つの引数、単語(小文字のみ)を取り、キーボードの隣接するキーで単語を入力できる場合は「はい」(記事を参照)、出力できる場合は「いいえ」を出力するプログラムを作成してほしい隣接する文字を入力しないでください。

このチャレンジで使用されるキーボードレイアウトは次のとおりです。

 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
 | Q | W | E | R | T | Y | U | I | O | P |
 └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┘
   | A | S | D | F | G | H | J | K | L |
   └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┘
     | Z | X | C | V | B | N | M |
     └───┴───┴───┴───┴───┴───┴───┘

覚えておいてください:これはコードゴルフですので、最短の答えが勝ちます!


入力が文字のみで構成されていると想定できますか?それらがすべて単一のケースで与えられていると仮定できますか?
マーティンエンダー

2
私はこれに混乱しています。「隣接する2つのキーは、最大で1.5 *キーの間隔を空けることができます。」確かに隣接するキーは実際に隣接しています。つまり、リンクされたパズルのように、それらの間にスペースはありませんか?
ルーク

議論の仕方は?STDIN?機能?
-theonlygusti

回答:


9

Pyth、66

?"Yes".Am>2sm^-.uk2Cm.Dx"qwertyuiopasdfghjkl*zxcvbnm"b9.5dC,ztz"No

ここで試してみてください。

Pythには斜辺機能がないことを知って驚いたので、これはおそらく他の言語に負けてしまうでしょう。斜辺関数をPythに提案するので、この残虐行為は将来起こりません。

説明

キーボードをこれに変換します:

┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
| Q | W | E | R | T | Y | U | I | O | P |
└─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┐
  | A | S | D | F | G | H | J | K | L | * |
  └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴───┘
    | Z | X | C | V | B | N | M |
    └───┴───┴───┴───┴───┴───┴───┘

次に、としてエンコードし"qwertyuiopasdfghjkl*zxcvbnm"ます。次に、9.5を法とするdivmodを使用して、すべてのキーの2D座標を計算しました。次に、連続するキー間の距離を計算し、2乗距離<2かどうかを確認します。


3

CJam、83 75 74バイト

l_1>]z["qwertyuiop asdfghjkl  zxcvbnm "[__B>]z+s_W%+_]zsf{\#)}:*"Yes""No"?

オンラインでお試しください。

説明

一般的なアプローチは、隣接するキーボード文字のすべてのペアを含む大きな隣接文字列を作成し、隣接する入力文字のすべてのペアがその文字列に含まれていることを確認することです。

非常にシンプルでコンパクトなロジックを使用する隣接文字列の作成方法に非常に満足しています。

l_1>]z          "Read a line of input and create a list of every pair of
                 adjacent input characters. There will be a trailing element
                 of just the final character, but that's okay since any single
                 lowercase letter can be found in the adjacency string.";
["qwertyuiop asdfghjkl  zxcvbnm "
              "^ Create the in-row forward adjacency string.";
[__B>]z         "Create the alternating-row forward adjacency string by
                 interleaving the in-row string with a substring of itself
                 starting with the middle row letters:
                   'q w e r t y u i o p   a s d f g h j k l  zxcvbnm '
                 + ' a s d f g h j k l     z x c v b n m  '[no interleave here]
                 -----------------------------------------------------
                   'qawsedrftgyhujikolp   azsxdcfvgbhnjmk l  zxcvbnm '";
+s              "Append the alternating-row forward adjacency string to the
                 in-row forward adjacency string.";
_W%+            "Append the reverse of the forward adjacency string (the
                 backward adjacency string) to the forward adjacency string.";
_]zs            "Double every character in the adjacency string so every
                 character is adjacent to itself.";
f{\#)}          "Map each pair of input characters to its 1-indexed location in
                 the adjacency string (0 if not found).";
:*              "Calculate the product of each pair's location in the adjacency
                 string. This will be nonzero if and only if every pair of
                 input characters are in fact adjacent.";
"Yes""No"?      "If the product is nonzero, produce 'Yes'; otherwise, produce
                 'No'.";
                "Implicitly print the result.";

それだけです、私はCJamを学んでいます。
ソハムチョードリー

しかし、@ octatoanは、Pythを学ぶ方が良いと思われます。:P
Runer112

ハハ、おそらくこの場合、はい。
ソハムチョードリー

2

J、77バイト

No`Yes{::~[:*/2>+/"1@(2|@-/\3(|,.<.@%~+-:@|)'qazwsxedcrfvtgbyhnujmikXolX'i.])

使用法:

   f=.No`Yes{::~[:*/2>+/"1@(2|@-/\3(|,.<.@%~+-:@|)'qazwsxedcrfvtgbyhnujmikXolX'i.])

   f 'redresser'
Yes
   f 'qwergy'
No
   f 'ppcg'
No

方法:

入力文字ごとに、stringのインデックスに基づいて2D座標(問題の画像に類似)を生成します'qazwsxedcrfvtgbyhnujmikXolX'。それらの座標マンハッタン距離が2よりも小さい場合はすべて、Iが出力される場合、入力中の文字のすべてのペアのために私はチェックYesNoそうでなければ( `演算子を乱用することによって)。

こちらからオンラインでお試しください。


あなたは手紙を忘れましたp
mbomb007

@ mbomb007見つからない文字の場合、i.演算子はを返すindex of the last element + 1ため、書き込みを行わずに1バイトを節約でき、p正しいインデックスを取得できます。
randomra

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.