\begingroup

键盘乒乓

这个问题是受到CaucasianJames 在 X 上的

挑战

给定一串字母,确定单词“ping-pongs”是否在键盘上。(字母在键盘两侧交替出现)

使用您想要的任何现有的

是采用 QWERTY 布局的乒乓球侧面图。左侧由最左侧的 5 个字母组成,右侧由剩余的字母组成。


测试用例(QWERTY)

skepticism      -      true
ENDOWMENT       -      true
quantity        -      true
dispel          -      true
kayaks          -      true
a               -      true
aa              -      false
test            -      false
WRONG           -      false
thiswillfail    -      false
ε               -      false

评论:

  1. 长度的字符串1应返回 true。代表一张王牌!
  2. 长度的字符串0应该返回 false。在真正的乒乓球比赛中不会得分。
  3. 应该不区分大小写

这个问题被标记为,因此以字节为单位的最短答案获胜!

\endgroup

17

  • 8
    \begingroup
    空字符串为假的说法似乎值得怀疑。请参阅
    \endgroup


    – 

  • 1
    \begingroup
    @squareroot12621 回答你的第一个问题,是的。我澄清了。至于你的第二个问题,它从哪一侧开始并不重要。我会将其添加到测试用例中。
    \endgroup


    – 

  • 6
    \begingroup
    我认为,通过排除空字符串作为可能的输入,并将键盘布局固定为 QWERTY,这个问题会得到改善。“已建立”含糊不清,“等等”甚至更含糊不清——就目前情况而言,根本不清楚哪种键盘布局能给出有效的答案。问题最好是自成体系的,所以我建议您将每种可接受布局的一半字母作为字符串包含在内,而不是链接到图形。
    \endgroup


    – 


  • 5
    \begingroup
    也许你可以这样表述这个问题:“给定一个非空的 ASCII 字母字符串,确定它是否在字母之间QWERTASDFGZXCVB和其他字母之间交替,忽略大小写。”
    \endgroup


    – 


  • 1
    \begingroup
    我投票关闭此应用,因为此应用存在多个问题:既定的键盘布局定义不明确,并且未提及可接受的输出格式。修复后我很乐意将其恢复。
    \endgroup


    – 


9 个回答
9

\begingroup

-p 5,31 字节

$_&&=!/[h-puy]{2}|[^h-puy]{2}/i

采用 QWERTY 布局。

\endgroup

\begingroup

-r,30 字节

/[^h-puy]{2}|[h-puy]{2}|^$/IQ1

答案的移植版。我原本有自己的,但我的正则表达式更糟糕。如果无效,则退出代码为 1 的错误,如果是乒乓,则正常退出

我刚刚看到我们可以使用任何我们想要的键盘,这是我的键盘,colemak:

,30 字节

/[^eh-uy]{2}|[eh-uy]{2}|^$/IQ1

这是 dvorak,最流行的替代布局:

,42 字节

/[aeijkopquxy]{2}|[^aeijkopquxy]{2}|^$/IQ1

这是工人,怪人的第三个选择:

,40 字节

/[^efi-lnopuy]{2}|[efi-lnopuy]{2}|^$/IQ1

\endgroup

1

  • \begingroup
    (如果你想知道的话,我确实浏览过该 wiki 页面上的其他键盘,但没有一个像 qwerty 和 colemak 那样短。)
    \endgroup


    – 

\begingroup

69 62 60 58 55 字节

感谢 ,减少了 7 个字节。我独立得出了一个类似的解决方案(尽管只有前 4 个字节),因为我有一段时间没有注意到他们的评论。

将输入作为字节串

lambda x,n=35782400:len({(n:=~n)>>j%32&1for j in x})==1

\endgroup

2

  • 1
    \begingroup
    使用海象
    \endgroup


    – 


  • 1
    \begingroup

    \endgroup


    – 

\begingroup

,23字节

∧θ№…01⊕Lθ⭆θ№⁺⪫…h¦qωuy↧ι

链接为代码的详细版本。输出 Charcoal 布尔值,即-如果单词是 ping-pong,则输出任何值,如果不是则不输出任何值。说明:

 θ                      Input word
∧                       Logical And
  №                     Count of
          θ             Input word
         ⭆              Map over characters and join
           №            Count of
                      ι Current letter
                     ↧  Lowercased
              …h q      In range `h`...`q` (exclusive)
             ⪫    ω     Joined
            ⁺           Concatenated with
                   uy   Literal string `uy`
    01                  In literal string `01`
   …                    Cyclically extended to length
        θ               Input word
       L                Length
      ⊕                 Incremented
                        Implicitly print

\endgroup

\begingroup

 89   83  76 字节

-6 字节,由 walrusing 提供 'yuiophjklnm'
-7 字节,由 Mukundan314 提供。

lambda x:x and all((i in(r:='yuiophjklnm'))^(j in r)for i,j in zip(x,x[1:]))

\endgroup

1

  • \begingroup

    \endgroup


    – 

\begingroup

Google 表格,76 字节

=SORT(AND(1=LEN(IFERROR(SPLIT(REGEXREPLACE(A2,"(?i)[h-puy]"," $0 ")," "))))) 

Google 表格,47 字节

使用

=REGEXMATCH(A2,"(?i)[h-puy]{2}|[^h-puy]{2}|^$")

\endgroup

\begingroup

JavaScript(ES6),51 字节

需要字符数组。如果是“乒乓”,则返回0如果是“空或非乒乓”,则返回1

a=>a<1|a.some(q=c=>q-(q=/[h-puy]/i.test(c)^(a^=1)))


JavaScript (ES6),39 字节

使用了一个更直接的解决方案,可以移植如下。需要一个字符串并返回一个布尔值(“ping-pong”false)。

s=>/^$|[h-puy]{2}|[^h-puy]{2}/i.test(s)

\endgroup

\begingroup

, 2019

žV5δôøJIlδå€üαßIgΘM

以字符列表形式输入。

使用 QWERTY 键盘。

解释:

žV       # Push ["qwertyuiop","asdfghjkl","zxcvbnm"]
   δ     # Map over each string:
  5 ô    #  Split it into parts of size 5
     ø   # Zip/transpose; swapping rows/columns
      J  # Join the inner lists together:
         #  ["qwertasdfgzxcvb","yuiophjklnm"]
I        # Push the input-list
 l       # Lowercase each inner character
  δ      # Double-vectorized over the two lists:
   å     #  Contains-check# Map over each inner list:
     ü   #  For each overlapping pair in this list:
      α  #   Take the absolute difference of the pair
       ß # Pop and push the flattened minimum
         # (1 if all are truthy; 0 if any are falsey; "" if empty)
Ig       # Push the length of the input-list
  Θ      # Check whether this length is exactly 1
M        # Push a copy of the largest value of the stack
         # (which is output implicitly as result)

\endgroup

\begingroup

,121字节

[⇩ƛk•5vẇ∑vFT;f¯AI

位串:

0110100000110010000101110000101100010110000010110110100110101011010101011111000101101010010111000001110111100000010110110

输出空格表示 true,输出空字符串表示 false。为方便起见,链接中的页脚将结果转换为01。使用 qwerty 布局。

解释

[⇩ƛk•5vẇ∑vFT;f¯AI­⁡​‎‎⁡⁠⁡‏‏​⁡⁠⁡‌⁢​‎‏​⁢⁠⁡‌⁣​‎‏​⁢⁠⁡‌⁤​‎‎⁡⁠⁢‏⁠‎⁡⁠⁣‏‏​⁡⁠⁡‌⁢⁡​‎‎⁡⁠⁤‏⁠‎⁡⁠⁢⁡‏‏​⁡⁠⁡‌⁢⁢​‎‎⁡⁠⁢⁢‏⁠‎⁡⁠⁢⁣‏⁠‎⁡⁠⁢⁤‏‏​⁡⁠⁡‌⁢⁣​‎‎⁡⁠⁣⁡‏‏​⁡⁠⁡‌⁢⁤​‎‎⁡⁠⁣⁢‏⁠‎⁡⁠⁣⁣‏⁠‎⁡⁠⁣⁤‏‏​⁡⁠⁡‌⁣⁡​‎‎⁡⁠⁣⁢‏⁠‎⁡⁠⁣⁣‏‏​⁡⁠⁡‌⁣⁣​‎‎⁡⁠⁤⁢‏⁠‎⁡⁠⁤⁣‏‏​⁡⁠⁡‌⁣⁤​‎‏​⁢⁠⁡‌⁤⁡​‎‏​⁢⁠⁡‌⁤⁢​‎‎⁡⁠⁤⁤‏‏​⁡⁠⁡‌⁤⁣​‎‎⁡⁠⁢⁡⁡‏‏​⁡⁠⁡‌­
[                  # ‎⁡Only execute the following if the input isn't the empty string.
# ‎⁢Why else do you think false is represented as the empty string? :p
# ‎⁣It was easier to special case it
 ⇩ƛ                # ‎⁤To each character in the lowercased input:
   k•              # ‎⁢⁡Push a list of each row of qwerty
     5vẇ           # ‎⁢⁢Split each into [first 5 characters, rest]
        ∑          # ‎⁢⁣And fold the list by addition. This gives a list of [left keys, right keys]
         vFT       # ‎⁢⁤Determine whether the character is a left or right key.
         vF        # ‎⁣⁡  Filter out the key from each side
             f¯    # ‎⁣⁣Flatten that and get the forward differences
# ‎⁣⁤This will be used to determine whether there's a pattern of left/right or right/left. 
# ‎⁤⁡A 0 in this list means that two characters in a row are from the same side. 
               A   # ‎⁤⁢Check whether all numbers are non-0, as per the above explanation of why. This will return either 0 or 1
                I  # ‎⁤⁣Push that many spaces. This is to be consistent with the empty string output. 
💎

的帮助下创建

\endgroup