Olası Tetris sekansları


11

Tetris parçalarının bir çalışmasının resmi Tetris algoritması tarafından üretilip üretilemeyeceğini anlamak için kod yazın. En az bayt kazanır.


Resmi Tetris oyunları , düşen parçaların sırasını özel bir şekilde üretir. Yedi parça IJLOSTZrastgele bir sırayla düşürülür, daha sonra başka bir rastgele permütasyon düşer ve böyle devam eder.

JTLOISZ STJOLIZ LISJOTZ ...

Bu örnek, bitişik parçaların çalışmasını içerir

SZSTJOLIZLIS

7 kişilik bir grubun sınırlarını aştığını unutmayın. Ancak, parçaların akışı

SZOTLZSOJSIT

herhangi bir Tetris dizisinin bir alt dizisi olamaz, bu yüzden resmi bir Tetris oyununda asla görülemez.


Girdi: Boş olmayan bir harf dizisi IJLOSTZ.

Çıktı: Girdinin resmi Tetris Random Generator tarafından oluşturulabilen bir dizinin bir alt dizesi olup olmadığı, yani yedi harfin permütasyonlarının birleşimi olup olmadığı için bir Doğruluk mu veya Falsey değeri.

Test senaryoları:

Doğru:

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)

Yanlış:

SZOTLZSOJSIT
ZZZ
ZIZJLJ
ZJLJLZITSOTLISOJT
JTLOISZSTJOLIZLISJOTZLJTSZLI
IOJZSITOJZST
LIJZTSLIJZTSL

Liderler Sıralaması

Martin Büttner'ın izniyle .

Yanıtlar:


6

Pyth, 16 15 bayt

sm*F.{Mc+>Gdz7T

False için 0, true için pozitif bir tam sayı yazdırır.


6

CJam, 23 20 16 bayt

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

4 bayt tıraş için Sp3000'e kredi!

Bir grup haneyi doğruluk değeri veya hiçbir şeyi yanlış değer olarak basar (bunlar yazdırılmadan önce aslında CJam'da gerçekten doğru ve falsy olan boş olmayan veya boş bir listedir).

Burada test edin.

açıklama

Bu sadece girdinin 7 olası bölümünün tamamını kontrol eder.

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

Retina , 61 55 bayt

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

Bu sadece tek bir regex olduğundan, Retina Eşleşme modunda çalışır ve bulduğu eşleşmelerin sayısını bildirir, bu da 1geçerli diziler için ve 0başka türlü olacaktır. Bu, golf dillerine kıyasla rekabetçi değil, ama 260 baytlık bir canavarla başladığımı görmekten oldukça memnunum.

açıklama

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

Bu bit, değişken uzunlukta benzersiz harflerin bir önekini tüketir, yani potansiyel olarak eksik olan önde gelen yığınla eşleşir. Lookbehind, bu bit ile eşleşen herhangi bir karakterin daha önce dizede görünmemesini sağlar.

Şimdi girdinin geri kalanı için, karakterleri tekrar etmeden 7 parçayı eşleştirmek istiyoruz. Böyle bir parça ile eşleşebiliriz:

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

Yani, başka bir 6 karakter için görünmeyen, daha sonra başka bir 5 karakter için görünmeyen bir karakterle eşleşiriz. Ancak bu oldukça korkunç bir kod tekrarı gerektirir ve takip eden (potansiyel olarak eksik) bir yığını ayrı olarak eşleştirmemiz gerekir.

Grupları kurtarmaya dengelemek ! Eşleşmenin farklı bir yolu

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

5 boş eşleşmeyi bir yakalama yığınına aktarıp boşaltmayı denemektir:

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

Bu *, tıpkı olduğu gibi minimum sıfır tekrarına izin verir {0,5}ve beş yakalamayı ittiğimiz için, 5 kattan daha fazla patlayamaz. Bu, bu modelin tek bir örneği için daha uzun, ancak bu çok daha fazla kullanılabilir. Haşhaşlamayı olumsuz bir ileriye doğru yaptığımızdan , bu ileriye doğru tamamlandığında gerçek yığını etkilemez. Bu yüzden, ileriye baktıktan sonra, içeride ne olursa olsun, yığın üzerinde hala 5 elementimiz var. Dahası, her bir önden okumadan önce yığındaki bir öğeyi basitçe açabiliriz ve önden okuma genişliğini otomatik olarak 5'ten 0'a düşürmek için kodu bir döngüde çalıştırabiliriz.

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

(İki fark görebilirsiniz: 5 yerine 7'yi itiyoruz. Bir ek yakalama, her yinelemeden önce değil, ondan sonra patladığımız için. Diğeri aslında gerekli. döngü 7 kez çalışacak şekilde), öbek \1üzerinde hala en az bir öğe kaldığından emin olarak, ileriye doğru bu tek tek hatayı düzeltebiliriz .)

Bunun güzelliği, takip eden eksik yığınla da eşleşebilmesidir, çünkü 7 kez tekrarlanmasını hiç talep etmedik (bu sadece gerekli maksimum, çünkü yığından daha sık çıkamıyoruz). Tek yapmamız gereken bunu başka bir döngüye sarmak ve almak için dizenin sonuna geldiğimizden emin olmaktır

^((.)(?<!\2.+))*((){7}((?<-4>)(.)(?!(?<-4>.)*\4\6))*)*$
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.