一线键盘


20

挑战

这项挑战的目标是确定是否只能使用标准UK QWERTY键盘的一行来键入给定的String。

这是code golf,所以最短的解决方案以字节为单位获胜!


IO

输入将是零个或多个字符的单个字符串,且在ASCII十进制范围(包括32-126)中。您可能会为这个挑战假设一个空的String不需要键入,因此可以使用一行来键入。

您可以将输入作为字符串,字符列表或您语言的等效形式。

对于可以使用单行键入的任何字符串,输出应为真值,否则为false。


键盘布局

为了澄清以下标准键盘布局的任何歧义,每一行上都有可用的键列表,包括备用的上键(使用shift访问)。

  • 1号线
    • 标准: `1234567890-=
  • 2号线
    • 标准: qwertyuiop[]
  • 3号线
    • 标准: asdfghjkl;'#
    • 大写: ASDFGHJKL
    • 特别:大写锁定
  • 4号线
    • 标准: \zxcvbnm,./
    • 备用: |<>?
    • 大写: ZXCVBNM
    • 特别:班次
  • 5号线
    • 特别:空格键

如果Shift也在同一行上,则只能按下备用的上键,并且只能通过Caps Lock或Shift来访问大写键。您实际上只能使用一根键盘线!


测试用例

            -> true     (empty string)
45-2=43     -> true     (line 1)
qwerty      -> true     (line 2)
tryitout    -> true     (line 2)
Qwerty      -> false    (no shift or caps on line 2)
#sad        -> true     (line 3)
AsDf        -> true     (caps lock used)
@sDF        -> false    (no shift for alternate upper)
zxcvbn?     -> true     (line 4)
zxc vbn     -> false    (spacebar on separate line)
123abc      -> false    (multiple lines)
            -> true     (just space bar)
!!!         -> false    (exclamation marks cannot be printed by a single line)

因此,这严格是美国键盘布局吗?(我有一个英国的布局)。
ouflak

2
@ouflak相反,严格来说,它仅是英国QWERTY键盘布局
Luke Stevens

@ Arnauld是的,谢谢。
路加·史蒂文斯

是的,我开始同时考虑两者,并注意到您的布局似乎遵循我的英国键盘布局,而不是我的美国键盘布局。嗯...不知道我的奥地利人是什么样子的。
ouflak

是允许我们将输入作为字符列表还是必须是字符串?
凯文·克鲁伊森

Answers:


12

Python 2中130个 123 121 115字节

lambda s:any(set(s)<=set(l+l.lower())for l in["`1234567890-=","eqwrtyuiop[]","ASDFGHJKL;'#","ZXCVBNM\,./|<>?"," "])

在线尝试!


Python 3,111字节

lambda s:any({*s}<={*l+l.lower()}for l in["`1234567890-=","eqwrtyuiop[]","ASDFGHJKL;'#","ZXCVBNM\,./|<>?"," "])

在线尝试!

-4个字节,感谢nedla2004


1
如果您愿意使用Python 3,则可以将其缩减为111个字节
nedla2004 '18 -10-10

9

视网膜0.8.272 71个字节

`^([-=\d`]+|[][eio-rtuwy]+|(?i)[adfghjkls;'#]+|[\\bcnmvxz,./|<>?]+| *)$

在线尝试!说明:每个交替匹配键盘的不同行。的(?i)图案中的中间导致图案的整个其余部分被不区分大小写匹配。编辑:由于@KirillL,节省了1个字节。


opqr可以更改o-r为-1。另外,您是否忘记了第1行的反引号字符,我看不到吗?
基里尔

@KirillL。糟糕,在复制/粘贴时一定不小心错过了选择它的功能,感谢您的发现。
尼尔,

不错[][...:)
mazzy

8

05AB1E66 47 字节

žh…`-=«žS„[]«žTDu…;'#««žUDu"\,./|<>?"««ð)εISåP}O

将输入作为字符列表。

-19个字节,感谢@Emigna。完全忘记了我们有qwerty-keyboard常量内置函数。:D

在线尝试验证所有测试用例

说明:

žh                # Push "0123456789"
  …`-=            # Push "`-="
      «           # Merge them together
žS                # Push "qwertyuiop"
  „[]             # Push "[]"
     «            # Merge them togeter
žT                # Push "asdfghjkl"
  Du              # Duplicate, and toUppercase the copy
    …;'#          # Push ";'#"
        ««        # Merge all three together
žU                # Push "zxcvbnm"
  Du              # Duplicate, and toUppercase the copy
    "\,./|<>?"    # Push "\,./|<>?"
              ««  # Merge all three together
ð                 # Push a space
 )                # Wrap all string in an array
  ε   }           # Map each to:
   I              #  Take the input (list of characters)
    å             #  Check for each if it's in the current string of the map-iteration
     P            #  Take the product (1 if all are truthy, 0 otherwise)
       O          # Take the sum (either 1 or 0, so truthy/falsey), and output implicitly



5

JavaScript(Node.js)99 98 95字节

x=>/^([-`=\d]+|[wetyuio-r[\]]+)$/.test(x)|/^([asdfghjkl;'#]+|[zxcvbnm,./<>?\\|]+| *)$/i.test(x)

在线尝试!

@Kirill L.在视网膜答案中的评论中为-1。
-3感谢@Ismael Miguel和@Arnauld的共同努力。


你为什么asdfghjklASDFGHJKL在那里?为什么不使用i标志,例如x=>/.../i.test(x)
伊斯梅尔·米格尔

@IsmaelMiguel因为QWERTYUIOP正则表达式不应该匹配。与将这些大写字母直接编码到正则表达式中相比,额外的检查将花费更多。
Shieru Asakoto

没关系,这是越野车。x=>/^([-`=\d]+|[wetyuio-r\[\]]+)$/.test(x)||/^([asdfghjkl;'#]+|[zxcvbnm,.\/<>?\\|]+| *)$/i.test(x)长度相同
Ismael Miguel

@IsmaelMiguel按位使用可|节省1个字节。
阿纳尔德

1
@IsmaelMiguel这是ECMAScript规范的一部分。需要进行一个字符类中逃脱的只有3个字符\ ]-(见ClassAtomNoDash在规范中)。如果破折号是第一个字符或最后一个字符,它也可能显示为未转义(否则,它将被解释为字符范围分隔符)。
阿纳尔德

5

Perl 6的102个101 100字节

-1字节感谢nwellnhof!

->\a{max map {a.combcomb $_~.lc:},|<eqwrtyuiop[] ASDFGHJKL;'# ZXCVBNM\,./|<>?>,' ',"`-="~[~] ^10}

在线尝试!

相当标准的实现。可能有一个较短的基于正则表达式的解决方案,但是我对Perl 6的正则表达式不够了解,无法尝试。


您可以使用max代替?any(和min代替?all)。
nwellnhof '18 -10-10

1
就其价值而言,使用Perl 5 正则表达式的基于正则表达式的解决方案将是84字节或80字节m:P5//。但我认为他们都不值得一试。
nwellnhof '18 -10-10

4

Java的10,209个 208字节

s->{int l=0,t;for(var p:s){t=p.matches("[[0-9]`\\-=]")?1:"qwertyuiop[]".contains(p)?2:p.matches("(?i)[asdfghjkl;'#]")?3:"\\zxcvbnm,./|<>?ZXCVBNM".contains(p)?4:p.equals(" ")?5:9;l=l<1?t:l!=t?9:l;}return l<6;}

-1个字节感谢@TFeld

在线尝试。

说明:

s->{                    // Method with String-array parameter and boolean return-type
  int l=0,              //  Line-integer, starting at 0
      t;                //  Temp integer
  for(var p:s){         //  Loop over the characters
    t=p.matches("[[0-9]`\\-=]")?
                        //   If it's a character from the first line: 
       1                //    Set `t` to 1
      :"qwertyuiop[]".contains(p)?
                        //   Else-if it's a character from the second line:
       2                //    Set `t` to 2
      :p.matches("(?i)[asdfghjkl;'#]")?
                        //   Else-if it's a character from the third line
       3                //    Set `t` to 3
      :"\\zxcvbnm,./|<>?ZXCVBNM".contains(p)?
                        //   Else-if it's a character from the fourth line:
       4                //    Set `t` to 4
      :p.equals(" ")?   //   Else-if it's a space from the fifth line:
       5                //    Set `t` to 5
      :                 //   Else (invalid character):
       9;               //    Set `t` to 9
    l=l<1?              //   If `l` is still 0:
       t                //    Set it to `t`
      :l!=t?            //   Else-if `t` is a different line than `l`:
       9                //    Set `l` to 9 (non-existing line)
      :                 //   Else (`t` is the same line as `l`):
       l;}              //    Leave `l` the same
  return l<6;}          //  Return whether `l` is not 9

不错的解决方案,但是!!!尽管感叹号不能用任何一行打印,但它返回true 。我刚刚添加了它作为测试用例
卢克·史蒂文斯

@LukeStevens啊,我错误地认为输入对于五行之一始终有效。我将修改我的解决方案。这是一个简单的修复程序(但会增加一些字节。)
Kevin Cruijssen

为什么不使用(?i)其他大写字母呢?
尼尔,

@Neil因为斜杠需要转义,所以它也是209 bytes
凯文·克鲁伊森

建议p==" "而不是p.equals(" ")
ceilingcat


4

果冻,55字节

ØDW;Øq;Œu$€3,4¦;"“rɠ3“Ż²“¿µ|“aƲƘ0ÞḅzḂ»⁶ṭ
¢f€ẈṠSỊafƑ¢F¤$

在线尝试!

第一行产生键盘行列表,第二行检查程序输入是否包含在单行(或零行)中,并且没有不能键入的字符(如QWE!@#)。


3

C,150字节

x;f(char*s){for(x=0;*s;x|="@               "[*s++-32]);return!(x&x-1);}

在线尝试!

它不会赢得任何奖赏,但这是一个有趣的方法:我们将键盘五行上的字符映射到4 8 16 32 64,并将每个无效字符映射到3。我们将字符串中每个字符的值按位进行“或”运算,并检查结果是否满足x&(x-1) == 0,当x为2或0的幂时(即每当x最多设置一位)时为true 。


2

LUA282个 262 259 270字节

s=io.read()l=0
t=0
for c in s:gmatch"."do
f=c.find
t=f(c,"[0-9%`-=]")or 0|(f(c,"[qwertyuiop%[%]]")or 0)*2|(f(c,"[aAsSdDfFgGhHjJkKlL:'@#~]")or 0)*4|(f(c,"[\\zxcvbnm,./|<>?ZXCVBNM]")or 0)*8|(f(c," ")or 0)*16
t=t==0 and 17or t
l=l<1 and t or l~=t and 17or l
end
print(l<17)

在线尝试!


2

PHP,98字节

我有点难过,没有什么比正则表达式短。它可能不是最快的解决方案。

<?=preg_match("%^([`\d=-]*|[wetyuio-r[\]]*|(?i)[asdfghjkl;'#]*|[\\\zxcvbnm,./|<>?]*| *)$%",$argn);

与管道一起运行-F在线尝试


我发现的最短的非正则表达式解决方案(124字节;换行和制表符,方便阅读):

foreach(["`1234567890-=","qwertyuiop[]","asdfghjkl;'#ASDFGHJKL","zxcvbnm,./\|<>?ZXCVBNM"," "]as$d)
    trim($argn,$d)>""||die(1);

退出时会1显示真实性,0虚假性的代码。与一起作为管道运行-R
需要PHP 5.4或更高版本;对于较旧的PHP,请使用array(...)代替[...](+5字节),
或者-nR在PHP <7中使用以下123字节:

foreach(split(_,"`1234567890-=_qwertyuiop[]_asdfghjkl;'#ASDFGHJKL_zxcvbnm,./\|<>?ZXCVBNM_ ")as$d)
    trim($argn,$d)>""||die(1);

2

AWK 163个 119 113字节

这是一个AWK答案,返回数字1表示true,0表示false。(写为AWK作为awk -f文件调用以进行交互使用。)

{print/^[-`1234567890=]*$/||/^[]qwertyuiop\[]*$/||/^[asdfghjkl;'#ASDFGHJKL]*$/||/^[zxcvbnm,.\/\|<>?ZXCVBNM]*$/||/^ *$/}

在线尝试!

但是,不将TAB字符作为规范的一部分处理(简单扩展)。


4
“所有挑战的解决方案都应:(...)成为使用中获胜标准的认真竞争者。例如,参加标准高尔夫比赛需要打高尔夫,而参加速度比赛则应该尝试快速做出一些努力。” – 帮助中心无需声明这两个变量,并且绝对不需要使它们成为字符串。只需一个即可print在线试用!
manatwork '18 -10-15

您认为解决方案应为严肃的意见是正确的,但我认为,因此,在修订的05AB1E之后的任何解决方案均无关紧要,因为它们无法匹配或改善结果。我看不到如何不能两次使用print来获得true和false(肯定是在输入结束之前读取字符串的东西)。我确实说过优化不是最佳。由于您的想法,它可以减少到143个字符。
Phil F

实际上,一路前进将使它变成121个字符……
Phil F

2
总而言之,code-golf并不是针对最短代码的竞争,而是针对您所用语言的最短代码。如果您可以改善解决方案,那么我建议您这样做
Jo King

@Jo King,谢谢您的澄清。修改后的代码将/可能是: {print/^[-```1234567890=]*$/||/^[]qwertyuiop\[]*$/||/^[asdfghjkl;'#ASDFGHJKL]*$/||/^[zxcvbnm,.\/\|<>?ZXCVBNM]*$/||/^ *$/}
Phil F

1

重击,119个字节

包含回显以提供“可读”输出。如果在外壳周围放置合适的外壳包装(您的选择)以包括打印/输出,则可以节省8个字节。我对挑战的阅读表明,解决方案应输出合适的输出指示,因此我坚持使用119个字节。

[[ "$@" =~ ^[asdfghjklASDFGHJKL\;\'#]*$|^[-\`0-9=]+$|^[]qwertyuiop\[]*$|^[zxcvbnm,./\|\<\>\?ZXCVBNM]*$|^\ *$ ]];echo $?

在线尝试!


请注意,Bash解决方案还意味着my / @ manatwork AWK解决方案可能会减少到113个字节。
Phil F
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.