可能なテトリスシーケンス


11

公式のTetrisアルゴリズムで一連のTetrisピースを生成できるかどうかを把握するためのコードを記述します。少ないバイトが勝ちます。


公式のテトリスゲームは、特別な方法で落下ピースのシーケンスを生成します。7つのピースIJLOSTZはランダムな順序でドロップされ、次に別のランダムな順列がドロップされます。

JTLOISZ STJOLIZ LISJOTZ ...

この例には、連続したピースの実行が含まれています

SZSTJOLIZLIS

7つのグループの境界を越えてカットすることに注意してください。

SZOTLZSOJSIT

テトリスシーケンスの部分文字列にすることはできないため、公式のテトリスゲームでは決して見ることができません。


入力:空ではない文字列IJLOSTZ

出力: A TruthyまたはFalsey 7文字の順列の連結の入力は公式テトリス乱数生成器によって生成することができるシーケンスの部分文字列であるかどうかの値、すなわち。

テストケース:

正しい:

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

リーダーボード

マーティン・ブットナーの厚意により掲載

回答:


6

Pyth、16 15バイト

sm*F.{Mc+>Gdz7T

falseの場合は0、trueの場合は正の整数を出力します。


6

CJam、23 20 16バイト

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

4バイトを削減するためのSp3000のクレジット!

それは真実の値として数字の束を印刷するか、偽の値として何も印刷しません(これらを印刷する前に、実際には空ではない、または空のリストです。

ここでテストしてください。

説明

これは、入力の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.+))*

このビットは、可変長の一意の文字のプレフィックスを消費します。つまり、潜在的に不完全な先頭のチャンクと一致します。後読みにより、このビットで一致した文字が以前に文字列に現れていないことが保証されます。

次に、残りの入力について、文字を繰り返さずに7つのチャンクを一致させます。このようなチャンクを次のように一致させることができます。

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

つまり、別の6文字が表示されない文字と一致し、さらに別の5文字が表示されない文字と一致します。ただし、これにはかなり恐ろしいコードの繰り返しが必要であり、末尾の(潜在的に不完全な)チャンクを個別に一致させる必要があります。

救助のためのグループのバランスをとる!一致する別の方法

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

5つの空の一致をキャプチャスタックにプッシュし、空にしてみます。

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

*同じように、ゼロの繰り返しの最小値を可能に{0,5}し、我々は5つのキャプチャをプッシュしたので、どちらか5回以上をポップすることができません。これは、このパターンの1つのインスタンスではより長くなりますが、はるかに再利用可能です。ネガティブルックアヘッドでポップを行うため、ルックアヘッドが完了すると、実際のスタックには影響しません。先読みの後、スタック内に何が起こったとしても、スタックにはまだ5つの要素があります。さらに、各先読みの前にスタックから1つの要素をポップし、コードをループで実行して、先読みの幅を5から0に自動的にデクリメントします。

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

(2つの違いに気付くかもしれません。5の代わりに7をプッシュしています。1つ追加のキャプチャは、反復ではなく各反復のにポップするためです。もう1つは実際に必要です。ループを7回実行し\1ます)、スタックに少なくとも1つの要素が残っていることを確認することで、先読み内のオフバイワンエラーを修正できます。

これの長所は、7回繰り返す必要がないため、後続の不完全なチャンクにも一致することです(それ以上の頻度でスタックからポップできないため、必要な最大値です)。必要なのは、これを別のループでラップし、文字列の最後に到達して取得することです

^((.)(?<!\2.+))*((){7}((?<-4>)(.)(?!(?<-4>.)*\4\6))*)*$
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.