密钥在哪一行上?


39

给定以下任何字符(或换行符):

`1234567890-=~!@#$%^&*()_+qwertyuiop[]\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:"zxcvbnm,./ZXCVBNM<>?

您的程序必须输出它在键盘上的行


由于我的键盘(几乎)没电了,因此您的代码必须尽可能短


您的程序应使用的键盘(用于行查找),应类似于:


Row 1:~` !1@2 #3$4 %5^6 &7*8 (9)0 _-+=                          

Row 2:                         Q W E R T Y U I O P {[ }]    |\   
Row 3:                              A S D F G H J K L :; "' return  
Row 4:                                 Z X C V B N M <, >. ?/                 
Row 5:                                                    space                                                   

  return换行符在哪里。空键没有任何意义。

例子

"$"
1

"R"
2

"a"
3

"?"
4

"\n"
3

" "
5

\n换行符在哪里。

技术指标

  • 您的程序应不区分大小写
  • 您的程序只需要处理显示的键盘上的字符

3
也许分类
lirtosiast

3
那是双重嵌套kbd吗?
科纳·奥布莱恩

记得几年前,我使用某种语言将按键返回为100×row + position。这本来很完美的,但是不幸的是我不记得它是什么。也许某种形式的BASIC的...
亚当

@NBZ是Blitz Basic吗?
wizzwizz4 2016年

1
@ wizzwizz4您是否尝试过BlitzPlus?它是免费的,看起来像是您想要的。
HolyBlackCat

Answers:


6

Pyth,62 66 65字节

?zh@+,4Zmid2c.Bi."0fÀÓ¸[9Ѷ¤KïLäHÉðbÀ`]ü©¬vS"16 2-CzCd3

在线尝试。

使用一个以十六进制表示的数字的打包字符串,当将其切成两位的块时,表示每个字符的行,除了!作为0到3之间的值。我们省去了!因此我们不必存储4或在此数字的开头为0,然后使用将其行值相加+,4Z。一旦将字符串转换为行值,我们要做的就是使用输入的字符代码索引值数组,然后加1。

换行符是分开处理的,因为Pyth会将换行符解释为空字符串,因此字符代码为0。

如果我能弄清楚如何在Pyth中使用base 256,这会更短一些,但是我不能完全使它起作用。


4
o.0 开始挤压Japt
nicael's

这让我感到羞耻
JuanPotato 2016年

:(我忘了换行了!@nicael您又回到了顶端。–
路加福音

现在我们甚至死了!
路加福音

您需要在Pyth中转义空字节。
lirtosiast

12

的JavaScript(ES6),105个 102 101字节

c=>/[~`0-9!@#-&^(-+_=-]/.test(c)+/[asdfghjkl;:'"\n]/i.test(c)*3+/[zxcvbnm,<.>/?]/i.test(c)*4||++c*7^2

说明

在JavaScript中test返回作用相同的布尔作为10让我乘他们通过自己的行。第2行的测试占用了最多的字节,因此如果没有其他字节匹配,我将其中一个作为默认字节。

c=>
  /[~`0-9!@#-&^(-+_=-]/.test(c)   // row 1 regex
  +/[asdfghjkl;:'"\n]/i.test(c)*3 // row 3 regex
  +/[zxcvbnm,<.>/?]/i.test(c)*4   // row 4 regex
  ||++c                           // space ++ = 1, any character on row 2 ++ = NaN
    *7^2                          // 7 XOR 2 = 5, NaN XOR 2 = 2

测试


1
> NaN XOR 2 = 2-???
lirtosiast

1
@ThomasKwa这就是JS的工作原理。如果c="q"++c= NaNNaN*7= NaNNaN^2将操作数转换为整数(不可转换的像NaN变为00 XOR 2,则为2
user81655'1

5

Glava 1.5,164字节

Glava是Java的一种方言,可使Java代码更短。不幸的是,此代码不具有竞争力,因为在挑战之后进行了提交(延迟2小时……),该提交解决了一些重要的错误,这些错误使程序无法运行。

p(A[0].matches("[`0-9-=~!@#$%^&*()_+]")?1:A[0].replace("\\n","\n").matches("(?i)[asdfghjkl;':\"\n]")?3:A[0].matches("(?i)[zxcvbnm,.\\/<>?]")?4:A[0].matches(" ")?5:2

这是一个完整的程序,需要通过命令行参数进行输入。通过简单地测试匹配的行正则表达式来工作,然后输出相应的数字。


Glava =番石榴+ Java?
Downgoat

2
@DoᴡɴɢᴏᴀᴛGlava =高尔夫+ Java(这是Conor的想法)
GamrCorps,2016年

确实!@Doᴡɴɢᴏᴀᴛ
康纳尔奥布莱恩

4

Python 3、142

print(int(("~`!1@2#3$4%5^6&7*8(9)0_-+=""qwertyuiop{[}\|"+"]"*11+'asdfghjkl;:"\n'"'"*13+"zxcvbnm,<.>/""?"*14+" ").index(input().lower())/26)+1)

我可能忽略了一个更简短的方法¯\ _(ツ)_ /¯


4

珀斯 98

|+++l:"~`0123456789!@#$%^&*()_-=+"z1*l:"asdfghjkl;:'\"\n"rz0 1 3*l:"zxcvbnm,<.>/? "rz0 1 4 l:dz1 2

不确定由于某种原因如何使0-9范围正常工作:|,受user81655的回答启发


您可以使用jkUT0到9范围内的字符串,不确定是否有更短的方法。您还可以使用打包字符串来保存一些字节,例如."!~WÏù¹_(<]úÝ"用于"~`!@#$%^&*()_-=+"
路加福音


4

重击108

没有Bash的答案?重击答案。grep -Fin绝对是这项工作的正确工具。

该程序位于两个文件中。

k,73字节

`1234567890-=~!@#$%^&*()_+
qwertyuiop[]\{}|
asdfghjkl;':"
zxcvbnm,./<>?

有5行,最后一行是空格。如果您在复制文件时遇到问题,则base64为:

YDEyMzQ1Njc4OTAtPX4hQCMkJV4mKigpXysKcXdlcnR5dWlvcFtdXHt9fAphc2RmZ2hqa2w7JzoiCnp4Y3Zibm0sLi88Pj8KIA==

b,34个字节

这是程序本身,它将输入作为唯一的命令行参数。

grep -Fin "$1" k|tail -n3|head -c1

得分:34 + 73 + 1(对于k的文件名)= 108字节

不打高尔夫球

grep --fixed-strings --ignore-case --line-number "$1" k|tail --lines=3|head --bytes=1

说明

  • grep -在文件中搜索与字符串或正则表达式匹配的行,仅输出那些行
  • -Faka- --fixed-strings禁用正则表达式,以便[正确处理等
  • -iaka -yaka- --ignore-case不区分大小写的匹配
  • -naka- --line-number在每行之前显示行号和::(例如4:zxcvbnm,./<>?
  • "$1" -搜索脚本的第一个命令行参数,引号对于处理换行符和空格是必需的
  • k -在文件中搜索 k
  • grep如果输入是换行符,则此命令将匹配所有五行,否则匹配一行。
  • | -管道,将一个命令的标准输出发送到下一命令的标准输入
  • tail -输出标准输入的最后N行或字符
  • -n3aka- --lines=3输出最后3行
  • 如果输入不是换行符,则仅处理一行,由于-n标记为on ,所以以行号开头grep。否则,此命令仅占用第3、4和5行(最后3行)。
  • | -管道
  • head -输出标准输入的前N行或字符
  • -c1aka- --bytes=1输出第一个字符
  • 如果输入不是换行符,它将采用第一个字符,即找到输入的行号。如果输入是换行符,它将合并第3、4和5行的第一个字符,即3,这恰好是换行符的正确行号。

4

Japt,73 70 66字节

2+`qØÆyuiop\{}[]|\\1dfghjkl;:
'1zxcvbnm,.<>?/\"1 `q1 ®bUv)<0} b!1

在线尝试!(在示例中,输入实际上是换行符)


不错,到目前为止最短!
ETHproductions 2016年

@Eth是的,至少一次,我应该发布一些简短的内容:D
nicael


@Eth Heh,!1是与“ false”匹配的东西,最后我知道该怎么做了,谢谢:)
nicael

@Eth halp,需要5个字节才能击败Pyth。
nicael

4

Java,300字节

import java.util.Scanner;public class A{public static void main(String[] args){String g="~`!1@2#3$4%5^6&7*8(9)0_-+=qQwWeErRtTyYuUiIoOpP[{]}\\|aAsSdDfFgGhHjJkKlL;:\'\"\r";Scanner i=new Scanner(System.in);int f=g.indexOf((i.nextLine().charAt(0)));System.out.print(f<0?4:(f<26?1:(f<53?2:(f<76?3:5))));}}

我不是专家,这是我第一次打高尔夫球,但我想知道,怎么了?为什么不呢?以上是完整的程序版本,其中包含的实际代码很可能会占用相当数量的字符。


只是注意到它以空输入(新行/回车)崩溃了。将修复时,我可以
安德鲁

欢迎来到社区!
暴民埃里克

欢迎(自从您在一月份发布xD以来有点晚)。您可以在不改变当前方法的情况下进行很多操作:class A{public static void main(String[]a){int f="~'!1@2#3$4%5^6&7*8(9)0_-+=qQwWeErRtTyYuUiIoOpP[{]}\\|aAsSdDfFgGhHjJkKlL;:\'\"\r".indexOf(new java.util.Scanner(System.in).nextLine().charAt(0));System.out.print(f<0?4:f<26?1:f<53?2:f<76?3:5);}}243字节)我删除了一些不必要的括号;缩短args; 删除public ; 直接使用String和Scanner;并删除了java.util.Scanner一次使用的导入。
凯文·克鲁伊森

您不需要为此使用扫描器的 219字节
PrincePolka

3

Pyth,105个字节

J?<l-c".^$*+?{}[]\|()"1]z14+\\zrz0?qJd5?:"qwertyuiop[]\|"J)2?:"asdfghjkl;':\"\n"J)3?:"zxcvbnm,./<>?"J)4 1

说明:

J?<l-c".^$*+?{}[]\|()"1]z14+\\zrz0     # Escape input if regex metachar
?qJd5                                  # Check space
?:"qwertyuiop[]\|"J)2                  # Check second row
?:"asdfghjkl;':\"\n"J)3                # Check third row
?:"zxcvbnm,./<>?"J)4                   # Check fourth row
1                                      # If none of these, must be on first row.

我决定选择第一行作为“如果没有其他条件,则必须是”行,因为即使打高尔夫球后,它也需要最多的字节来表示。


欢迎来到编程难题和Code Golf!使用注释使@JuanPotato可以使用它。但是,这需要50次重复。所以你需要工作。
user48538

3

Perl 6,128字节

say 1+(/<[-\d=~!@#$%^&*()_+/`]>/,/<[qwertyuiop[\]\\{}|]>/,/<[asdfghjkl;':"\n]>/,/<[zxcvbnm,./<>?]>/,' ').first: @*ARGS.lc~~*,:k

我列出了包含字符类和字符串文字空间的正则表达式列表。然后,我使用smartmatch将传递给程序的参数与列表中的当前项进行比较,以调用first列表中的方法(这只是first高阶函数的方法版本)。请注意,smartmatch对正则表达式和字符串文字都“正确”。所述:k任选的参数first的原因该方法返回所述匹配项的索引列表中的,这是我然后通过加1和输出say

请注意,使用此程序时,必须正确转义外壳中的某些字符,例如`和空格。例如:perl6 keyboard.p6 \`


既然没有人说过,欢迎来到“编程拼图与代码高尔夫”!
暴民埃里克

2

JavaScript ES6,114个字节

n=>[`qwertyuiop{}[]|\\`,`asdfghjkl;:
'`,`zxcvbnm,.<>?/"`,` `].map(x=>+(x.indexOf(n.toLowerCase())<0)).indexOf(0)+2

另一个JavaScript解决方案。原理是返回行数组加2的输入char的索引(因此0-9行返回-1,即不存在,-1 + 2 = 1。q在数组的第一个字符串中,因此它返回0 + 2 = 2nd行)。


2

Perl,96 77 76字节

使用运行perl -p。确保只输入单个字符;例如,从文件中运行它key.pl(以避免被外壳转义序列弄乱)echo -n q|perl -p key.pl

$_=/[\d~`!@#-&(-+_=-]/+/[adfghjkls"':;
]/i*3+/[bcnmvxz<>,.?\/]/i*4+/ /*5||2

滥用正则表达式范围功能很有趣。


对我来说这不起作用,运行它我得到行的索引+ 3(即3代替0,7代替4,依此类推)。
ChatterOne

这对您如何提供输入很敏感。您可能提供了一个字符,后跟一个换行符。我echo用来精确控制输入-例如 echo -n q|perl -n key.pl正确地产生2
2016年

哦,我懂了。好吧,这也解释了为什么您没有chomp输入。
ChatterOne

1
如果chomp输入了该输入,则无法为返回键返回“ 3”。
2016年

1
嘿@马克,你不需要$_=~的比赛,m//(这是什么/.../的)工作在$_自动!同样,如果您使用-p而不是,则-n可以使用$_=而不是print保存更多的字节。使用文字换行符代替也\n可以节省另一个字节!那应该减少您的代码很多!可能还值得添加一个示例用法,因此任何测试都知道您需要使用echo -n:)
Dom Hastings

2

PHP,173字节

这里的想法是使用正则表达式捕获组号作为行索引。正则表达式本身可能还有更多优化。

$i=$argv[1];preg_match("%([!#-&\(-+-0-9=@^-`~])|([EIO-RT-UWY[-]eio-rt-uwy{-}])|([\"':-;ADF-HJ-LSadf-hj-ls])|([,.-/<>-?B-CM-NVXZb-cm-nvxz])%",$i,$m);echo array_flip($m)[$i];

preg_match()调用将创建一个$m匹配项数组,如果我们要打印该匹配项,它将看起来像这样(假设z是输入内容):

Array ( [0] => 'z', [1] => '', [2] => '', [3] => '', [4] => 'z' )

通过交换键和值来翻转数组,从左到右移动并仅保留最后一个不同的键,因此最终得到:

Array ( 'z' => 4, '' => 3 )

然后,我们使用输入字符作为数组中的索引来获取结果。

在这里尝试


2

C,145143136132127106字节

#define c 2124850936,91714965
b[]={8<<18,0,-218071008,7796<<19,c,c};f(a){return a-32?b[a>>4]>>a%16*2&3:4;}

此功能index()从POSIX.1-2001开始使用,在POSIX.1-2008中已弃用。 假设使用ASCII和32位整数。


2

Python 3,89个字节

print("qwertyuiop{}[]\\|asdfghjkl;:\"\n'''zxcvbnm,.<>/???? ".find(input().lower())//16+2)

由于我还无法发表评论,因此我将分别发布当前Python 3答案的改进。

编辑print现在,所有代码都将进一步调整。


这只是一个摘要,因此不是有效的答案,您需要将其包装在print语句中(使其成为一个完整的程序)或将其转换为函数。
FlipTack

@FlipTack:你是对的。我已经采纳了你的建议。
creativecoding

欢迎来到PPCG!
Martin Ender's

@MartinEnder:谢谢!:-)
creativecoding


0

CJam,125个字节

q_" "={;5}{"`1234567890-=~!@#$%^&*()_+qwertyuiop[]\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:\"    zxcvbnm,./ZXCVBNM<>?    "\#26/1+}?

说明

q                          e# read input
 _" "=                     e# decide if the input is a space
      {;5}                 e# if it is, push 5
          {"..."\#26/1+}?  e# if it isn't, push the correct row

0

SpecBAS-178字节

1 a$="~`!1@2#3$4%5^6&7*8(9)0-_+=qQwWeErRtTyYuUiIoOpP{[}]|\aaaaAsSdDfFgGhHjJkKlL:;'"#34#13"zzzzzzzZxXcCvVbBnNmM<,>.?/"+" "*26
2 INPUT k$: IF k$="" THEN k$=#13
3  ?CEIL(POS(k$,a$)/26)

我使用了一个长字符串,其中每行的长度为26个字符(#34是双引号的代码,#13是返回的代码)。

然后打印舍入位置/ 26的结果。


0

C#6,201个字节

这里没什么特别的。由于字符串的固定宽度,我发现只写两种情况比使用ToUpper()便宜。

using C=System.Console;class P{static void Main(string[]a)=>C.Write("`1234567890-=~!@#$%^&*()_+qwertyuiop[]\\QWERTYUIOP{}|asdfghjkl;'\raASDFGHJKL:\"\nazxcvbnm,./zzzZXCVBNM<>?zzz ".IndexOf(a[0])/26+1);}

缩进:

using C=System.Console;
class P{
    static void Main(string[]a)=>
        C.Write("`1234567890-=~!@#$%^&*()_+qwertyuiop[]\\QWERTYUIOP{}|asdfghjkl;'\raASDFGHJKL:\"\nazxcvbnm,./zzzZXCVBNM<>?zzz ".IndexOf(a[0])/26+1);
}

1
我看不到它适用于〜或`?
Ash Burlaczenko 2016年

@AshBurlaczenko,谢谢!我错过了那把钥匙。固定,我的分数没有变化。
Hand-E-Food

0

Python 2,146字节

e="\n";lambda x:("`1234567890-=~!@#$%^&*()_+qwertyuiop[]\\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:\""+e*4+"zxcvbnm,./ZXCVBNM<>?"+e*13+" ").index(x)/26+1

0

Excel,132个字节

=INT((FIND(A1,"`1234567890-=~!@#$%^&*()_+qwertyuiop[]\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:""aaa zxcvbnm,./ZXCVBNM<>?zzzzzz ")-1)/26)+1

尝试使用不区分大小写的字母,SEARCH()而不是FIND()显示Excel与匹配~*并且?(tick). The matching ofmeans we can't useSEARCH()`,这将节省大量的5个字节...

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.