单词可以彼此相邻键入吗?


13

在阅读此书之前,我建议阅读这个小难题:https : //puzzling.stackexchange.com/questions/11408/longest-word-with-adjacent-letters-on-a-keyboard

我希望您编写一个程序,该程序带有一个参数,一个单词(仅小写字母),如果可以用键盘上的相邻键键入该单词,则输出“是”(请参见文章),如果该单词可以,则输出“否”不能用相邻的字母键入。

这是此挑战中使用的键盘布局:

 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
 | 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 |
     └───┴───┴───┴───┴───┴───┴───┘

请记住:这是codegolf,所以最短的答案就是成功!


我们可以假设输入仅包含字母吗?我们可以假设它们都是在单个案例中给出的吗?
马丁·恩德

2
我对此感到困惑:“两个相邻的键之间最多可以有1.5 *键的间隔。” 当然,相邻的键实际上是相邻的,也就是说,它们之间没有空格,就像在链接的拼图中一样吗?
路加福音

如何争论?STDIN?有功能吗?
theonlygusti 2015年

Answers:


9

佩斯66

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

在这里尝试。

我惊讶地发现Pyth没有斜边功能,因此很可能会被另一种语言击败。我将为Pyth提出一个斜边函数,这样将来就不会发生这种a亵行为。

说明

我将键盘转换为:

┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
| 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"然后,我使用divmod模9.5来计算每个键的2D坐标。然后,我计算连续键之间的距离,并检查平方距离是否小于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。
Soham Chowdhury

@octatoan看起来我们俩最好都学习Pyth。:P
Runer112

哈哈,也许在这种情况下,是的。
Soham Chowdhury

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

方法:

我为每个输入字母基于其在字符串中的索引生成2D坐标(类似于问题中的图像)'qazwsxedcrfvtgbyhnujmikXolX'。对于输入中的每对字母,我检查其坐标的“曼哈顿距离”是否小于2。如果全部相同,则输出YesNo否则(通过滥用`运算符)。

在这里在线尝试。


你忘了这封信p
mbomb007'2013-4-3

@ mbomb007对于找不到字符,i.操作员返回,index of the last element + 1这样我可以通过不写来节省1个字节,p并仍然得到正确的索引。
randomra 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.