가능한 테트리스 시퀀스


11

공식 테트리스 알고리즘으로 테트리스 조각을 생성 할 수 있는지 알아내는 코드를 작성하십시오. 가장 적은 바이트가 이깁니다.


공식 테트리스 게임 은 특별한 방식으로 떨어지는 조각 시퀀스를 생성합니다. 7 개의 조각 IJLOSTZ은 임의의 순서로 삭제 된 다음 다른 임의의 순열이 삭제됩니다.

JTLOISZ STJOLIZ LISJOTZ ...

이 예제는 연속 된 부분을 포함합니다.

SZSTJOLIZLIS

그것은 7 그룹의 경계를 가로 지 릅니다.

SZOTLZSOJSIT

테트리스 시퀀스의 하위 문자열이 될 수 없으므로 공식 테트리스 게임에서는 볼 수 없습니다.


입력 : 비어 있지 않은 문자열 IJLOSTZ.

: 출력 Truthy 또는 Falsey의 입력이 공식 테트리스 랜덤 생성기, 즉 일곱 글자의 순열의 연결의에 의해 발생 될 수있는 일련의 부분 문자열인지에 대한 값.

테스트 사례 :

진실:

T
JJ                        (unique breakdown: J J)
JTJ                     (possible breakdown: JT J)
LTOZIJS
SZSTJOLIZLIS            (possible breakdown: SZ STJOLIZ LIS)
JTLOISZSTJOLIZLISJOTZ   (possible breakdown: JTLOISZ STJOLIZ LISJOTZ)  
LIJZTSLIJZTS              (unique breakdown: LIJZTS LIJZTS)

그릇된:

SZOTLZSOJSIT
ZZZ
ZIZJLJ
ZJLJLZITSOTLISOJT
JTLOISZSTJOLIZLISJOTZLJTSZLI
IOJZSITOJZST
LIJZTSLIJZTSL

리더 보드

Martin Büttner의 의례 .

답변:


6

Pyth, 16 15 바이트

sm*F.{Mc+>Gdz7T

0을 false로, 양의 정수를 true로 인쇄합니다.


6

CJam, 23 20 16 바이트

q7{\+_7/_Lf|=},&

4 바이트를 깎아 낸 Sp3000의 크레딧!

그것은 진지한 값으로 많은 자릿수를 인쇄하거나 거짓 값으로 아무것도 인쇄하지 않습니다 (인쇄하기 전에 실제로는 비어 있지 않거나 비어있는 목록이며, 실제로 CJam에서는 거짓과 거짓입니다).

여기에서 테스트하십시오.

설명

이것은 단지 7 개의 가능한 입력 파티션을 청크로 검사합니다.

q      e# Read the input
7{     e# Select the numbers from 0 to 6 for which the following block is true.
  \+   e#   Prepend the number to the input. This shifts the string by one cell
       e#   without adding non-unique elements.
  _7/  e#   Make a copy and split into chunks of 7.
  _Lf| e#   Remove duplicates from each chunk.
  =    e#   Check if the last operation was a no-op, i.e. that there were no duplicates.
},
&      e# The stack now contains the input with [6 5 ... 1 0] prepended as well as a list
       e# of all possible splittings. We want to get rid of the former. To do this in one
       e# byte we take the set intersection of the two: since we've prepended all the
       e# integers to the list, this will always yield the list of splittings.

4

망막 , 61 55 바이트

^((.)(?<!\2.+))*((){7}((?<-4>)(.)(?!(?<-4>.)*\4\6))*)*$

이것은 하나의 정규 표현식이므로 Retina는 일치 모드에서 실행하고 찾은 일치 수를보고합니다. 이는 1유효한 시퀀스 및 0그렇지 않은 경우에 해당합니다. 이것은 골프 언어와 비교할 때 경쟁적이지는 않지만 260 바이트의 괴물로 시작한 것을 보면서 매우 만족합니다.

설명

^((.)(?<!\2.+))*

이 비트는 가변 길이의 고유 문자 접두어를 사용합니다. 즉 잠재적으로 불완전한 선행 청크와 일치합니다. lookbehind는이 비트와 일치하는 문자가 이전에 문자열에 나타나지 않았 음을 보장합니다.

이제 나머지 입력에 대해서는 문자를 반복하지 않고 청크 7을 일치 시키려고합니다. 우리는 다음과 같은 청크를 일치시킬 수 있습니다.

(.)(?!.{0,5}\1)(.)(?!.{0,4}\2)(.)(?!.{0,3}\3)...(.)(?!.?\5).

즉, 우리는 다른 6 문자에 표시되지 않는 문자를 일치시킨 다음 다른 5 문자에 표시되지 않는 문자와 일치시킵니다. 그러나 이것은 상당히 끔찍한 코드 반복을 필요로하며, 후행 (잠재적으로 불완전한) 덩어리를 개별적으로 일치시켜야합니다.

구조에 그룹밸런싱 ! 일치하는 다른 방법

(.)(?!.{0,5}\1)

5 개의 빈 일치 항목을 캡처 스택에 밀어 넣고 비우는 것입니다.

(){5}(.)(?!(?<-1>.)*\2)

*처럼, 제로 반복의 최소 수 있습니다 {0,5}, 우리는 다섯 캡처를 밀어했기 때문에,이 중 5 회 이상을 팝업 할 수 없습니다. 이것은이 패턴의 단일 인스턴스에 대해서는 더 길지만 훨씬 더 재사용 가능합니다. 네거티브 lookahead 에서 터지는 작업을 수행하기 때문에 lookahead가 완료된 후에는 실제 스택에 영향을 미치지 않습니다. 따라서 미리 본 후에도 내부에 무슨 일이 있어도 스택에 5 개의 요소가 있습니다. 또한 각 lookahead 전에 스택에서 하나의 요소를 팝하고 루프에서 코드를 실행하여 lookahead 너비를 5에서 0으로 자동 감소시킬 수 있습니다.

(){7}((?<-1>)(.)(?!(?<-1>.)*\1\3))*

(두 가지 차이점이 있습니다. 우리는 5 대신 7을 눌렀습니다. 하나의 추가 캡처는 반복이 아니라 각 반복 전에 튀어 나오기 때문입니다. 다른 하나는 실제로 스택에서 7 번 튀어 나오도록하기 위해 실제로 필요합니다. 루프를 7 번 실행 \1하는 경우) 스택에 하나 이상의 요소가 남아 있는지 확인하여 미리보기 내부에서 해당 오류를 수정할 수 있습니다 .)

이것의 장점은 7 번 반복 할 필요가 없기 때문에 후행의 불완전한 청크와도 일치 할 수 있다는 것입니다 (스택에서 더 자주 스택에서 팝 할 수 없기 때문에 필요한 최대 값 일뿐입니다). 그래서 우리가해야 할 일은 이것을 다른 루프로 감싸서 문자열 끝에 도달했는지 확인하는 것입니다.

^((.)(?<!\2.+))*((){7}((?<-4>)(.)(?!(?<-4>.)*\4\6))*)*$
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.