키가 어느 행에 있습니까?


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 x 행 + 위치와 같이 키 누르기를 반환하는 언어를 사용했습니다.이 작업에는 완벽했을 것입니다. 아마도 어떤 형태의 기본 ...
Adám

@NBZ Blitz Basic입니까?
wizzwizz4

1
@ wizzwizz4 BlitzPlus를 사용해 보셨습니까? 무료이며 원하는 것 같습니다.
HolyBlackCat

답변:


6

Pyth, 62 66 65 바이트

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

온라인으로 사용해보십시오.

용도는 2 비트 덩어리로 다진 때를 제외한 모든 문자의 행을 나타냅니다 진수의 숫자 나타내는 압축 문자열 !3. 0의 값으로 우리는 생략 하고 !우리가하지 않아도 4를 저장하거나 가지고 이 숫자의 시작 부분에 0이 있으면을 사용하여 행 값을 추가하십시오 +,4Z. 문자열을 행 값으로 바꾼 후에는 입력의 문자 코드를 사용하여 값의 배열을 색인화 한 다음 1을 추가하기 만하면됩니다.

개행은 Pyth에서 빈 문자열로 해석되므로 문자 코드가 0이므로 개별적으로 처리됩니다.

Pyth에서 base 256을 사용하는 방법을 알아낼 수 있다면 더 짧을 수 있지만 제대로 작동하지는 않습니다.


4
o.0 Japt
nicael을

이 수치에 나를두고
JuanPotato

:( 나는 개행을 잊었다! @nicael 당신은 정상에 다시 돌아온다.
Luke

이제 우리는 죽었다!
Luke

Pyth에서 널 바이트를 이스케이프해야합니다.
lirtosiast

12

자바 스크립트 (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에서 부울을 반환합니다.이 부울과 동일 1하거나 0그에 따라 행을 곱합니다. 행 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= NaN, NaN*7= NaN, NaN^2(uncastables 같은 정수 피연산자 변환 NaN되고 0후) 수행 0 XOR 2이다 2.
user81655

5

글 라바 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

명령 줄 인수를 통해 입력을받는 전체 프로그램입니다. 일치하는 행 정규식을 테스트 한 다음 해당 숫자를 출력하여 작동합니다.


글 라바 = 구아바 + 자바?
Downgoat

2
@ Doᴡɴɢᴏᴀᴛ Glava = 골프 + 자바 (Conor 's idea)
GamrCorps

과연! @ Doᴡɴɢᴏᴀᴛ
코너 오브라이언

4

파이썬 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Ïù¹_(<]úÝ"for) "~`!@#$%^&*()_-=+".
Luke


4

배쉬, 108

배쉬 답변이 없습니까? 배쉬 답변. 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 -문자열 또는 정규식과 일치하는 줄을 파일에서 검색하고 해당 줄만 출력
  • -F일명 --fixed-strings-정규 표현식을 비활성화하여 [등을 올바르게 처리합니다.
  • -i일명 -y일명 --ignore-case-대소 문자를 구분하지 않는 일치
  • -n일명 --line-number- 행 번호를 표시하고 : 모든 라인 전에 (예를 들어 4:zxcvbnm,./<>?)
  • "$1" -스크립트의 첫 번째 명령 줄 인수를 검색합니다. 줄 바꿈과 공백을 처리하려면 따옴표가 필요합니다.
  • k -파일에서 검색 k
  • grep명령은 입력이 줄 바꿈이면 다섯 줄과 모두 일치하고 그렇지 않으면 한 줄만 일치합니다.
  • | -파이프, 한 명령의 표준 출력을 다음 명령의 표준 입력으로 전송
  • tail -표준 입력의 마지막 N 줄 또는 문자를 출력
  • -n3일명 --lines=3-마지막 3 줄을 출력
  • 입력이 개행 문자가 아닌 경우 처리 할 행은 한 개 뿐이며 이는 -non 플래그로 인해 행 번호로 시작 합니다 grep. 그렇지 않으면이 명령은 3, 4 및 5 행 (마지막 3 행) 만 사용합니다.
  • | -파이프
  • head -표준 입력의 첫 N 줄 또는 문자를 출력
  • -c1일명 --bytes=1-첫 번째 문자를 출력
  • 입력이 개행 문자가 아닌 경우 입력을 찾은 행 번호 인 첫 번째 문자를 사용합니다. 입력이 줄 바꿈 인 경우 줄 3, 4 및 5의 첫 번째 문자 인 3을 취합니다. 3은 줄 바꿈의 올바른 행 번호입니다.

4

Japt, 73 70 66 바이트

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

온라인으로 사용해보십시오! (이 예에서 입력은 문자 그대로 개행입니다)


지금까지 가장 짧았습니다.
ETHproductions

@Eth yup, 적어도 한 번은 짧은 글을 게시해야합니다 : D
nicael


@Eth Heh !1는 "false"와 일치하는 것입니다. 마침내 나는 그것을 수행하는 방법을 알고 있습니다. 감사합니다 :)
nicael

@Eth halp, Pyth를이기려면 5 바이트가 필요합니다.
nicael

4

자바, 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))));}}

나는 전문가가 아니며, 이것이 골프를 처음 시도한 것이지만, 도대체 어떻게 되었습니까? 위의 전체 프로그램 버전은 실제 코드로 인해 상당한 양의 문자가 제거 될 수 있습니다.


빈 입력 (새 라인 / 캐리지 리턴)으로 충돌하는 것을 알았습니다. 때 내가 할 수있는 해결됩니다
앤드류

커뮤니티에 오신 것을 환영합니다!
Outgolfer Erik

환영합니다 (1 월 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 bytes ) 불필요한 괄호를 제거했습니다. 단축 args; 제거 public ; 문자열과 스캐너를 직접 사용했습니다. java.util.Scanner한 번 사용 된 가져 오기를 제거했습니다 .
Kevin Cruijssen

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.

나는 골프를 타신 후에도 가장 많은 바이트를 필요로했기 때문에 첫 번째 행을 "아무것도하지 말아야합니다"행으로 선택했습니다.


프로그래밍 퍼즐과 코드 골프에 오신 것을 환영합니다! @JuanPotato가 그것을 얻을 수 있도록 의견을 사용하십시오. 그러나 50 담당자가 필요합니다. 따라서 일해야합니다.
user48538

3

펄 6, 128 바이트

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

문자열 리터럴 공간과 함께 문자 클래스를 포함하는 정규식 목록을 만듭니다. 그런 다음 smartmatch를 사용하여 first목록 의 메서드를 목록 first의 현재 항목과 비교하기 위해 smartmatch를 사용하여 메서드를 호출합니다. smartmatch는 정규 표현식과 문자열 리터럴 모두에 대해 "올바른 일"을 수행합니다. :k에 선택적 매개 first방법 원인 그때 통해 출력에 1을 추가하는리스트에 일치하는 항목의 인덱스를 반환한다 say.

이 프로그램을 사용할 때는`와 셸의 공백과 같은 특정 문자를 올바르게 이스케이프해야합니다. 예를 들면 : perl6 keyboard.p6 \`


아직 아무도 말하지 않았으므로 Programming Puzzles & Code Golf에 오신 것을 환영합니다!
Outgolfer Erik

2

자바 스크립트 ES6, 114 바이트

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

또 다른 JavaScript 솔루션. 원칙은 행의 배열에 2를 더한 2의 입력 문자 색인을 리턴하는 것입니다 (0-9 행이 -1을 리턴하므로 존재하지 않음 -1 + 2 = 1 q이 배열의 첫 번째 문자열에 있음) 따라서 0 + 2 = 두 번째 행을 반환합니다).


2

펄, 96 77 76 바이트

를 사용하여 실행하십시오 perl -p. 한 문자 만 먹이고 있는지 확인하십시오. 예를 들어, 파일에서 파일을 실행 key.pl하려면 (쉘 이스케이프 시퀀스를 사용하지 않아야합니다) echo -n q|perl -p key.pl.

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

정규식 범위 기능을 사용하는 것은 재미 있습니다.


나에게 이것은 작동하지 않으며, 실행하면 행 + 3의 인덱스를 얻습니다 (예 : 0 대신 3, 4 대신 7).
ChatterOne

입력을 제공하는 방법에 민감합니다. 당신은 아마 문자 다음에 줄 바꿈을 제공하고 있습니다. echo입력을 정확하게 제어하는 ​​데 사용 합니다 (예 : echo -n q|perl -n key.pl을 올바르게 생성합니다 2.
Mark

아, 알겠습니다 글쎄, 그것은 왜 chomp입력 을하지 않는지를 설명합니다 .
ChatterOne

1
내가하면 chomp입력 에드, 나는 리턴 키를 '3'을 반환 할 수 없습니다.
Mark

1
이봐, @ 마크, 당신은 $_=~일치하는 m//(이것이 무엇인지 /.../) $_자동으로 작동 하지 않습니다 ! 또한 -p대신 대신 -n사용 하면 몇 바이트를 더 절약하는 $_=대신 사용할 수 있습니다 print. 대신 리터럴 개행을 사용 \n하면 다른 바이트도 절약 할 수 있습니다! 코드가 상당히 줄어들 것입니다! 누구나 테스트를 사용할 필요가 알고 아니라, 그래서 같은 가치는 예를 들어 사용을 추가 할 수 있음 echo -n:
돔 헤이스팅스

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

파이썬 3, 89 바이트

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

아직 언급 할 수 없으므로 현재 Python 3 답변에 대한 개선 사항을 별도로 게시하고 있습니다.

편집 : 모든 코드가 print지금 수정되었습니다.


이것은 스 니펫 일뿐이므로 올바른 대답이 아닙니다. 인쇄 문으로 감싸거나 (전체 프로그램으로 작성) 기능으로 바꿔야합니다.
FlipTack

@FlipTack : 네 말이 맞아. 나는 당신의 제안을 통합했습니다.
creativecoding

PPCG에 오신 것을 환영합니다!
Martin Ender

@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

@AshBurlaczenko 감사합니다! 나는 그 열쇠를 놓쳤다. 내 점수를 변경하지 않고 수정했습니다.
Hand-E-Food

0

파이썬 2, 146 바이트

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

0

엑셀, 132 바이트

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

시도에 민감한 사건을 사용하는 SEARCH()대신 FIND()Excel이 일치하는지 밝혀 ~, *그리고 ?(tick). The matching of? means we can't useSEARCH ()`는 엄청난 5 바이트를 면도했습니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.