한 줄 키보드


20

도전

이 과제의 목표는 표준 영국 QWERTY 키보드의 한 줄만 사용하여 주어진 문자열을 입력 할 수 있는지 확인하는 것입니다.

이것은 code golf바이트 단위의 최단 솔루션이 승리합니다!


IO

입력은 32-126의 ASCII 10 진수 범위에서 0 개 이상의 문자로 구성된 단일 문자열입니다. 이 과제를 위해 빈 문자열은 입력 할 필요가 없으므로 한 줄로 입력 할 수 있다고 가정 할 수 있습니다.

입력을 문자열, 문자 목록 또는 해당 언어 형식으로 사용할 수 있습니다.

출력은 단일 행을 사용하여 입력 할 수있는 모든 문자열에 대해 정확한 값이거나, 그렇지 않은 문자열에 대해서는 거짓이어야합니다.


키보드 레이아웃

아래의 표준 키보드 레이아웃에 대한 모호성을 명확히하기 위해 교대 상단 키 (shift를 사용하여 액세스)를 포함하여 각 줄에서 사용할 수있는 키 목록이 있습니다.

  • 1 호선
    • 표준: `1234567890-=
  • 2 호선
    • 표준: qwertyuiop[]
  • 3 호선
    • 표준: asdfghjkl;'#
    • 대문자 : ASDFGHJKL
    • 스페셜 : Caps Lock
  • 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 그렇습니다.
Luke Stevens

네, 둘 다 살펴보기 시작했고 여러분의 레이아웃이 미국이 아닌 영국 키보드 레이아웃을 따르는 것 같습니다. 흠 ... 내 오스트리아 사람이 어떻게 보이는지 궁금합니다.
ouflak

입력을 문자 목록으로 사용할 수 있습니까, 아니면 문자열이어야합니까?
Kevin Cruijssen

답변:


12

파이썬 (2) , 130 (123) 121 115 바이트

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

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


파이썬 3 , 111 바이트

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

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

nedla2004 덕분에 -4 바이트


1
Python 3을 기꺼이 사용하려는 경우 111 바이트 로 줄일 수 있습니다 .
nedla2004

9

레티 나 0.8.2 , 72 71 바이트

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

온라인으로 사용해보십시오! 설명 : 각 대체는 다른 키보드 행과 일치합니다. (?i)패턴의 중앙의 패턴의 전체 나머지는 유사한 경우 소문자를 구별되게한다. 편집 : @KirillL 덕분에 1 바이트가 절약되었습니다.


opqro-r-1 로 변경할 수 있습니다 . 또한 1 행의 백틱 문자를 잊었습니까?
Kirill L.

@KirillL. 복사 / 붙여 넣기를 할 때 실수로 선택을 놓친 경우가 있습니다.
Neil

nice [][...:)
mazzy

8

05AB1E , 66 47 바이트

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

입력을 문자 목록으로 가져옵니다.

@Emigna 덕분에 -19 바이트 . 우리는 qwerty-keyboard constant builtins를 완전히 잊어 버렸습니다. :디

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

ž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

자바 스크립트 (Node.js) , 99 98 95 바이트

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

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

Retina 답변의 @Kirill L.의 의견에서 -1.
-Ismael Miguel과 @Arnauld의 노력에 감사드립니다.


왜해야합니까 asdfghjkl그리고 ASDFGHJKL거기? 왜 i플래그 를 사용하지 x=>/.../i.test(x)않습니까?
Ismael Miguel

@IsmaelMiguel QWERTYUIOP은 정규식과 일치하지 않아야합니다. 추가 검사는 대문자를 직접 정규식으로 코딩하는 것보다 비용이 많이 듭니다.
Shieru Asakoto

신경 쓰지 마라. x=>/^([-`=\d]+|[wetyuio-r\[\]]+)$/.test(x)||/^([asdfghjkl;'#]+|[zxcvbnm,.\/<>?\\|]+| *)$/i.test(x)같은 길이
Ismael Miguel

@IsmaelMiguel 비트 단위를 사용 |하면 1 바이트가 저장됩니다.
Arnauld

1
@IsmaelMiguel ECMAScript 사양의 일부입니다. 문자 클래스 내에서 이스케이프 할 필요가있는 유일한 3 문자는 \ , ]그리고 -(참조 ClassAtomNoDash를 사양에서). 대시가 첫 번째 문자이거나 마지막 문자 인 경우 이스케이프 처리되지 않은 것처럼 보일 수도 있습니다 (그렇지 않으면 문자 범위 구분 기호로 해석 됨).
Arnauld

5

Perl 6 , 102101100 바이트

nwellnhof 덕분에 -1 바이트!

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

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

꽤 표준적인 구현입니다. 이것에 대한 정규식 기반 솔루션이 더 짧을 수도 있지만 Perl 6의 정규식을 잘 모릅니다.


당신이 사용할 수있는 max대신에 ?any(그리고 min대신 ?all).
nwellnhof

1
가치있는 것을 위해 정규 표현식 기반 솔루션은 Perl 5 정규 표현식을 사용하여 84 바이트 또는 80 바이트입니다 m:P5//. 그러나 둘 중 하나가 답변으로 게시 할 가치가 있다고 생각하지 않습니다.
nwellnhof

4

자바 10, 209208 바이트

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;}

@TFeld 덕분에 -1 바이트 .

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

설명:

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

좋은 해결책이지만 !!!느낌표를 한 줄로 인쇄 할 수 없어도 마찬가지입니다 . 방금 테스트 사례로 추가했습니다
Luke Stevens

@LukeStevens 아, 입력이 항상 다섯 줄 중 하나에 유효하다고 잘못 가정했습니다. 솔루션을 수정하겠습니다. 그것은 간단한 수정입니다 (하지만 일부 바이트를 추가합니다 ..)
케빈 Cruijssen

(?i)다른 대문자로 사용하지 않겠습니까?
Neil

@Neil 슬래시에 필요한 이스케이프 때문에 209 바이트이기도합니다 .
Kevin Cruijssen

p==" "대신 추천p.equals(" ")
천장 고양이

4

파워 쉘, 87 바이트

닐 포트의 레티 나 정규식 .

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

4

젤리 , 55 바이트

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

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

첫 번째 줄은 키보드 줄 목록을 생성하고 두 번째 줄은 프로그램 입력이 단일 (또는 0) 줄에 포함되어 있고 입력 할 수없는 문자가 없는지 확인합니다 (예 : 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 . 우리는 문자열에서 각 문자의 값을 비트 단위로 OR하고 결과가 만족하는지 확인합니다.이 값이 2 또는 0의 힘일 때, 즉 최대 1 비트 세트가 있을 때마다 x&(x-1) == 0참 입니다.xx


2

LUA , 282 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 바이트) 대신 사용
하거나 -nRPHP <7에서 다음 123 바이트를 사용하십시오 .

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

2

AWK , 163 119 113 바이트

이것은 AWK 답변이며, true는 숫자 1 문자열, false는 0 문자열을 반환합니다. (AWK로 작성하면 대화식 사용을 위해 awk -f 파일로 호출됩니다.)

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

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

그러나 TAB 문자를 스펙의 일부가 아닌 작성된 (사소한 확장)로 처리하지 마십시오.


4
"챌린지에 대한 모든 솔루션은 다음과 같아야합니다. (…) 사용중인 우승 기준에 대해 진지한 경쟁자가되어야합니다. 예를 들어, 코드 골프 대회에 참가하려면 골프 대회에 참가해야하며, 속도 대회에는 참가해야합니다. " – help center 이 두 변수를 선언 할 필요가없고 문자열로 만들 필요가 없습니다. 그리고 하나만 print으로 충분합니다 : 온라인으로 사용해보십시오!
manatwork

솔루션이 심각해야한다는 귀하의 의견은 유효하지만 수정 된 05AB1E 이후 솔루션은 결과와 일치하지 않거나 더 나은 결과를 얻을 수 없기 때문에 관련이 없다고 주장합니다. 인쇄를 두 번 사용하여 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.