원래 솔루션 : 자바 스크립트 - 261 255 228 227 개 179 153 문자
/(\d)(\1(\d|.{6}|.{9})|(\d|.{6}|.{9})\1|.{7}\1(.|.{9})|(.|.{9})\1.{7}|(.{7,9}|.{17})\1.{8}|.{8}\1(.{7,9}|.{17}))\1/.test(s.replace(/\n/g,'A'))?'yes':'no'
테스트에 문자열이 변수에 있다고 가정하면 s
(이 함수 만들려면 f
다음 추가 f=s=>
한 후 대체 프롬프트에서 입력을 위해, 그렇지 않으면 코드 나의 시작 s
과 함께 prompt()
).
출력은 콘솔입니다.
3 차 솔루션 : JavaScript (ECMAScript 6)-178 자
p=x=>parseInt(x,36);for(t="2313ab1b8a2a78188h9haj9j8iaiir9r",i=v=0;s[i];i++)for(j=0;t[j];v|=s[i]==s[i+a]&s[i]==s[i+b]&i%9<8&(b>3|(i+b-a)%9<8))a=p(t[j++]),b=p(t[j++]);v?'yes':'no'
아래 의 두 번째 솔루션 (일부 구성에서 문자를 확인하기 위해 정규 표현식을 사용함)을 사용하여 정규 표현식을 사용하지 않고 동일한 구성에서 동일한 문자의 문자열을 확인하도록 다시 작업했습니다.
Base-36 문자열 "2313ab1b8a2a78188h9haj9j8iaiir9r"
은 점검 할 오프셋 쌍을 제공합니다. 즉, 23
i 번째 문자가 (i + 2) 번째 문자 및 (i + 3) 번째 문자 (정규 표현식과 동일 함 )와 동일한 경우 쌍으로 검사합니다. (.).\1\1
-동일하지 않은 문자가 개행 문자가 아닌지 확인하기위한 몇 가지 추가 검사와 함께).
2 차 솔루션 : JavaScript (ECMAScript 6)-204 자
p=x=>parseInt(x,18);g=a=>a?a>1?"(.|\\n){"+a+"}":".":"";f=(x,a,b)=>RegExp("(.)"+g(a)+"\\1"+g(b)+"\\1").test(x);for(t="10907160789879h8",i=v=0;t[i];v|=f(s,x,y)||f(s,y,x))x=p(t[i++]),y=p(t[i++]);v?'yes':'no'
Base-18 문자열에서 가져온 값 쌍을 사용하여 여러 정규식 (자세한 내용은 아래 참조)을 작성 10907160789879h8
하고 OR
모든 테스트를 수행합니다. 더 줄이기 위해 정규 표현식은 한 쌍이 다른 사람의 "반전"인 쌍으로 나옵니다 (행에서 3 행의 정규 표현식은 OP 상태로 가로 및 세로로 무시 함). 0088
Base-18 문자열에 추가 하여 해당 테스트를 다시 추가하려는 경우 ).
설명
유효한 이동의 모든 가능한 구성을 다루는 16 개의 정규식으로 시작하십시오.
REs=[
/(\d)\1\1/, // 3-in-a-row horizontally
/(\d).\1\1/, // 3-in-a-row horizontally after left-most shifts right
/(\d)\1.\1/, // 3-in-a-row horizontally after right-most shifts left
/(\d)(?:.|\n){9}\1\1/, // 3-in-a-row horizontally after left-most shifts down
/(\d)(?:.|\n){7}\1.\1/, // 3-in-a-row horizontally after middle shifts down
/(\d)(?:.|\n){6}\1\1/, // 3-in-a-row horizontally after right-most shifts down
/(\d)\1(?:.|\n){6}\1/, // 3-in-a-row horizontally after left-most shifts up
/(\d).\1(?:.|\n){7}\1/, // 3-in-a-row horizontally after middle shifts up
/(\d)\1(?:.|\n){9}\1/, // 3-in-a-row horizontally after right-most shifts up
/(\d)(?:.|\n){7,9}\1(?:.|\n){8}\1/, // 3-in-a-row vertically (with optional top shifting left or right)
/(\d)(?:.|\n){7}\1(?:.|\n){9}\1/, // 3-in-a-row vertically after middle shifts right
/(\d)(?:.|\n){9}\1(?:.|\n){7}\1/, // 3-in-a-row vertically after middle shifts left
/(\d)(?:.|\n){8}\1(?:.|\n){7}\1/, // 3-in-a-row vertically after bottom shifts right
/(\d)(?:.|\n){8}\1(?:.|\n){9}\1/, // 3-in-a-row vertically after bottom shifts left
/(\d)(?:.|\n){17}\1(?:.|\n){8}\1/, // 3-in-a-row vertically after top shifts down
/(\d)(?:.|\n){8}\1(?:.|\n){17}\1/, // 3-in-a-row vertically after bottom shifts up
];
( 주 : 3에서 A-가로 행 (0 정규식 등에서 특정 요소를 뽑아 오기위한 제 ) 및 수직 (9)의 (일부 토륨 )이 일치하는 입력이 존재하지 않을 것이라는 OP 상태로서 부적합하다. )
입력에 대해 각각을 테스트하면 해당 구성의 유효한 이동을 찾을 수 있는지 여부가 결정됩니다.
그러나 정규식을 결합하여 다음 6 가지를 얻을 수 있습니다.
/(\d)(?:.|(?:.|\n){9}|(?:.|\n){6})?\1\1/ // Tests 0,1,3,5
/(\d)\1(?:.|(?:.|\n){9}|(?:.|\n){6})?\1/ // Tests 0,2,6,8
/(\d)(?:.|\n){7}\1(?:.|(?:.|\n){9})\1/ // Tests 4,10
/(\d)(?:.|(?:.|\n){9})\1(?:.|\n){7}\1/ // Tests 7,11
/(\d)(?:(?:.|\n){7,9}|(?:.|\n){17})\1(?:.|\n){8}\1/ // Tests 9,14
/(\d)(?:.|\n){8}\1(?:(?:.|\n){7,9}|(?:.|\n){17})\1/ // Tests 9a,12,13,15
그런 다음 단일 정규식으로 결합 할 수 있습니다.
/(\d)(?:.|(?:.|\n){9}|(?:.|\n){6})?\1\1|(\d)\2(?:.|(?:.|\n){9}|(?:.|\n){6})?\2|(\d)(?:.|\n){7}\3(?:.|(?:.|\n){9})\3|(\d)(?:.|(?:.|\n){9})\4(?:.|\n){7}\4|(\d)(?:(?:.|\n){7,9}|(?:.|\n){17})\5(?:.|\n){8}\5|(\d)(?:.|\n){8}\6(?:(?:.|\n){7,9}|(?:.|\n){17})\6/
입력에 대해 테스트해야합니다.
테스트 사례
다른 사람들이 유용하다고 생각할 수있는 일부 테스트 사례 (숫자 1-7 만 사용하는 입력 형식을 준수하지는 않지만 쉽게 수정되고 8x4 그리드 임)-모든 유효한 입력을 테스트하는 데 필요한 최소값이므로 ).
입력 문자열에서 위의 16 개의 정규식 중 하나와 일치하는 맵 형식입니다.
Tests={
"12345678\n34567812\n56781234\n78123456": -1, // No Match
"12345678\n34969912\n56781234\n78123456": 1, // 3-in-a-row horizontally after left-most shifts right
"12345678\n34567812\n59989234\n78123456": 2, // 3-in-a-row horizontally after right-most shifts left
"12345978\n34567899\n56781234\n78123456": 3, // 3-in-a-row horizontally after left-most shifts down
"12345978\n34569892\n56781234\n78123456": 4, // 3-in-a-row horizontally after middle shifts down
"12345678\n34967812\n99781234\n78123456": 5, // 3-in-a-row horizontally after right-most shifts down
"12399678\n34967812\n56781234\n78123456": 6, // 3-in-a-row horizontally after left-most shifts up
"12345678\n34597912\n56789234\n78123456": 7, // 3-in-a-row horizontally after middle shifts up
"12345998\n34567819\n56781234\n78123456": 8, // 3-in-a-row horizontally after right-most shifts up
"12945678\n34597812\n56791234\n78123456": 9, // 3-in-a-row vertically after top shifts right
"12349678\n34597812\n56791234\n78123456": 9, // 3-in-a-row vertically after top shifts left
"12345978\n34569812\n56781934\n78123456": 10, // 3-in-a-row vertically after middle shifts right
"92345678\n39567812\n96781234\n78123456": 11, // 3-in-a-row vertically after middle shifts left
"12945678\n34967812\n59781234\n78123456": 12, // 3-in-a-row vertically after bottom shifts right
"12349678\n34569812\n56781934\n78123456": 13, // 3-in-a-row vertically after bottom shifts left
"12395678\n34567812\n56791234\n78193456": 14, // 3-in-a-row vertically after top shifts down
"12345698\n34567892\n56781234\n78123496": 15, // 3-in-a-row vertically after bottom shifts up
"12345678\n34567899\n96781234\n78123456": -1, // No match - Matches (.)\1.\1 but not 3 in a row
"12345679\n99567812\n56781234\n78123456": -1, // No match - Matches (.).\1\1 but not 3 in a row
};
편집 1
를 \d
s로 교체 .
-6자를 저장합니다.
편집 2
교체 (?:.|\n)
로 [\s\S]
(의해 제안 제거 추가적인 비 - 포착 기 및 업데이트 다시 참조 및 m-BUETTNER ) 및 예 / 아니오 출력했다.
편집 3
- Base-18 문자열에서 개별 정규식을 작성하는 ECMAScript 6 솔루션을 추가했습니다.
- m-buettner가 제안한대로 가로 3 줄에 대한 테스트를 제거했습니다 .
편집 4
다른 (더 짧은) 솔루션과 두 가지 더 일치하지 않는 테스트 사례가 추가되었습니다.
편집 5
- 줄 바꿈을 숫자가 아닌 문자로 대체하여 원래 솔루션을 단축했습니다 ( VadimR에서 제안한 대로 ).
편집 6
- VadimR에서 제안한 정규식 비트를 결합하여 원래 솔루션을 단축했습니다 .