인접 문자 테스트


12

암호 강도 테스트의 한 가지 측면은 키보드에서 인접한 문자를 실행하는 것입니다. 이 과제에서는 true문자열에 인접한 문자가 포함되어 있으면 반환하는 프로그램을 만들어야합니다 .

인접한 문자의 연속으로 간주되는 것은 무엇입니까?

암호 강도 테스터의이 단순화 된 버전에서 인접한 문자는 QWERTY 키보드에서 단일 방향 (왼쪽, 오른쪽, 위 또는 아래)으로 나란히 3 개 이상의 문자입니다. 이 문제를 해결하기 위해 키보드 레이아웃은 다음과 같습니다.

1234567890
QWERTYUIOP
ASDFGHJKL
ZXCVBNM

위의 다이어그램에서 Q아래는 1아니지만 아래 2에 있으므로 문자열을 포함 1qa하거나 그 aq1안에 있는 문자열 은 프로그램을 반환 true하지만 그렇지 2qa는 않습니다.

입력

확인할 비밀번호 문자열입니다. 문자 [0-9a-z]또는 [0-9A-Z](선택) 만 포함합니다 .

산출

암호에 하나 이상의 인접한 키 실행이 포함되어 있으면 프로그램은 정확한 값을 반환하고, 그렇지 않은 경우에는 false를 반환해야합니다.

다음 입력은 true를 출력해야합니다.

  • asd
  • ytrewq
  • ju7
  • abc6yhdef

그리고 이러한 입력은 false를 출력해야합니다.

  • abc
  • aaa
  • qewretry
  • zse
  • qwdfbn
  • pas

규칙

  • 답은 완전한 프로그램이나 기능 일 수 있습니다.
  • 표준 허점은 허용되지 않습니다.
  • 이것은 이며 최저 점수 (바이트)가 이깁니다!

답변:


3

Pyth- 66 62 60 바이트

매우 간단한 접근법. 하위 문자열 len 3이 키보드의 회전에 있는지 확인합니다. 키보드에 기본 인코딩을 사용합니다.

.E}Rjb+J+Kc+jkS9"0
qwertyuiop
asdfghjkl
zxcvbnm"b.tKN_MJ.:z3

테스트 스위트 .


@ user81655는 고정 2 바이트를 저장.
Maltysen

2

apt , 78 바이트

JaptJa vaScri pt 의 단축 버전입니다 . 통역사

V=1oA ¬+`0\nqØÆyuiop\n?dfghjkl \nzxcvbnm`;1+¡Y©(((VbX -VbUgY-1)-5 a -5 %A a)bB

0잘못된 경우에 대한 출력 ; 그렇지 않으면 양의 정수입니다. 는 ?인쇄 할 수없는 유니 코드 문자 U + 0086로 대체, 또는해야 당신이 그냥 모든 문제에 가고 싶어하지 않는 경우 as.

작동 원리

V=1oA q +"0\nqwertyuiop\nasdfghjkl \nzxcvbnm";1+Um@Y&&(((VbX -VbUgY-1)-5 a -5 %A a)bB
           // Implicit: U = input string
V=1oA q    // Set variable V to the digits 1-9, plus
+"...";    // this string.
Um@        // Take U and map each character X and its index Y with this function:
Y&&        //  If Y is 0, return Y; otherwise,
VbX -      //  take the index of X in V, subtract
VbUgY-1    //  the index of (char at position Y - 1 in U) in V,
-5 a -5    //  subtract 5, take the absolute value, subtract 5 again,
%A a       //  take modulo by 10, then take the absolute value.
           //  This returns 1 for any pair of characters that is adjacent
           //  within V, horizontally or vertically.
bB +1      // Take the index of 11 in the result and add one.
           // Implicit: output last expression

2

C #, 227

int h(string k){var q="1234567890,QWERTYUIOP,ASDFGHJKL,ZXCVBNM,1QAZ,2WSX,3EDC,4RFV,5TGB,6YHN,7UJM,8IK,9OL,";int i=0,j=0;for(;i<k.Length-2;i++)if((q+String.Concat(Enumerable.Reverse(q))).Contains(k.Substring(i,3)))j=1;return j;}

0은 거짓이고 1은 진실입니다. 모든 키를 가로 및 세로로 연결하고 반대로 입력 한 3 개의 문자가 포함되어 있는지 확인합니다.

C #은 정말 장황하며 다른 언어로 뛰어 들어야합니다.


0

PHP, 173 + 1 바이트

while(~$argn[$i+2])($p=preg_match)($r=_.join(".{10}",str_split(($t=substr($argn,$i++,3))))."|$t"._,$d=_1234567890_qwertyuiop_asdfghjkl__zxcvbnm)||$p($r,strrev($d))?die(1):0;

-nR소문자 입력 으로 파이프로 실행 하거나 온라인으로 시도하십시오 .


0

클로저, 156 바이트

#(some(set(for[R[["1234567890""QWERTYUIOP""ASDFGHJKL.""ZXCVBNM..."]]R[R(apply map list R)]r R p(partition 3 1 r)p((juxt seq reverse)p)]p))(partition 3 1 %))

이것은 구현하기에 매우 흥미로운 작업이었습니다.

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