Hayat Oyunu


26

Arka fon

Bu zorluk, PPCG 2016'nın En İyisi kategorisinde göründüğü kadar basit değil , mücadelesiyle kazanan pilotun şerefine. 4 no'lu müzik kutum bu şarkıyı çalabilir mi? Tebrikler!

"Hakkımda" sayfasında, bu kullanıcının Game of Life hücresel otomatiği için gerçekten temiz bir simülatörü var . (Cidden, git kontrol et.) Öte yandan, aspillera kelimesi "arrowslit" için İspanyolcadır. Bu gerçeklerin ışığında, bu zorluk Yaşam Oyunu'ndaki oklarla ilgilidir.

Hayat Oyunu

GoL'da bir planör tarafından bir ok ve bir dizi blok tarafından bir duvar göstereceğiz . Tek bir planör duvara yukarıdan yaklaşır ve duvardaki bir boşluktan (oklar açıklığı) geçmeye çalışır. Göreviniz, planörün ok açıklığından geçip geçmediğini veya duvara çarptığını kontrol etmektir.

Giriş

Girişiniz bir GoL yapılandırmasını temsil eden bir bit ızgarasıdır. Herhangi bir makul formatta (herhangi iki farklı yazdırılabilir ASCII karakterinin çok satırlı dizgisi, dizgelerin listesi, 2B tamsayı dizisi, 2B boolean dizisi vb.) Alabilirsiniz. Netlik için, .#aşağıdaki karakterlerin çok satırlı dizelerini kullanacağım .

Girişin birkaç özelliğe sahip olması garanti edilir. İlk olarak, bazı N ≥ 6 için yüksekliği 2N'dir ve genişliği en az 2N + 2'dir . Giriş , ilk üç sıradaki bir yerde bir planör ve iki orta satırda bir bloklar duvarı olması haricinde, hepsi s olacaktır . Planör güneybatı veya güneydoğuya doğru ilerleyecektir ve konumu, duvarlar sökülürse, alt kenara ulaşmadan önce bir yan kenardan geçmeyecek şekildedir (ancak ızgaraların bir köşesine ulaşabilir). Planör başlangıçta en az bir adım adım ile sol ve sağ kenarlardan ayrılır . Herhangi bir aşamada olabilir...

Duvar, .en az iki sütunla ayrılacakları bir yer hariç, bir sütunla ayrılan bloklardan oluşur .. Planör gibi, en sol ve en sağdaki bloklar da kenarlardan bir adım .s ile ayrılır . Sol kenarda her zaman en az bir blok ve sağ kenarda bir blok olacaktır.

Geçerli bir giriş ızgarasının bir örneği:

....#......................
..#.#......................
...##......................
...........................
...........................
...........................
.##.##............##.##.##.
.##.##............##.##.##.
...........................
...........................
...........................
...........................
...........................
...........................

Çıktı

Belirtildiği gibi, göreviniz planörün duvara çarptığını veya güney kenarına mı geçtiğini belirlemek. Bu zorluğun amaçları doğrultusunda, konfigürasyon artık simülasyonda ne olacağına bakılmaksızın konfigürasyon artık tek bir planör ve blok duvarından oluşmuyorsa bir çökme meydana gelir. Aşağıdaki diyagramlar güneydoğu planörün iki farklı aşamada çarpışmadan yaşayabileceği en küçük boşlukları göstermektedir (güneybatı planörlerin durumu simetriktir).

...#...........
.#.#...........
..##...........
...............
...............
##...........##
##...........##

...#...........
....#..........
..###..........
...............
...............
##...........##
##...........##

Planör duvardan uçarsa, bir gerçeğe uygun değer, aksi takdirde sahte bir değer vermelisiniz. Yukarıdaki örnekte, planör duvarın sol tarafına çarpacağından doğru çıktı yanlıştır.

Bu zorluğun amaçları doğrultusunda, girişte GoL'yi 2 * (yükseklik - 3) adım için simüle ederseniz , planörün beklenen konumda alt sıralarda olduğunu ve duvarın sağlam olduğunu varsayabilirsiniz; .

Kurallar ve puanlama

Tam bir program veya bir fonksiyon yazabilirsiniz. En düşük bayt sayısı kazanır.

Test durumları

Test vakalarını GitHub deposunda topladım , çünkü oldukça büyükler. Tek tek dosyalara bağlantılar:


Girişe duvarın altındaki boş satırları dahil etmek için herhangi bir sebep var mı?
Martin Ender

@MartinEnder Girdide GoL'i gerçekte simüle ettiğiniz çözümler üretiyorlar (en azından umarım).
Zgarb

Planör her zaman en üst satırda başlayacak?
Rod

@Rod Evet, güneybatı ya da güneydoğu yönünde en üst sırada yer alacaktır.
Zgarb

Hayatın bir başka oyunu: P
Christopher

Yanıtlar:


15

Python 2 , 142 136 135 bayt

TuukkaX sayesinde ElPedro -1 byte sayesinde -6 bayt

p=input()
z=p[2].index(1)
m=(p[1][z]-p[1][z+1]<1)*2-1
k=i=0
for b in p[3:]:x=p[2][::m].index(1)+i;k|=1in b[::m][x-2:x+8];i+=1
print 1-k

Çevrimiçi deneyin! veya Tüm test durumlarını doğrula

Yön kontrolü (doğu / batı):

Batı doğu
Kullanılması z=p[2].index(1)(kırmızı kare ile temsil edilir) 3 satırda ilk kare elde etmek için, sonra m=(p[1][z]-p[1][z+1]<1)*2-1, olacak her 4 planörler devletleri bu şekilde sola (mavi) üzerine birinden (yeşil) sağdaki değeri çıkarın güneybatıya 1gidenler 0veya ile sonuçlanırken güneybatı (resimdeki en üst sıra) ile sonuçlanır -1.
Sonra dönüştürmek: 1 -> -1ve 0,-1 -> 1batı olanlar ile çalışırken listeleri tersine çevirmek için parametre üzerinde kullanılacak. Bu şekilde, günbatımına giren kanatlar güneydoğuya gidenle aynı şekilde tehdit edilir.

Planör hareketi

kayma
Bu planörün güneydoğuya doğru yaptığı hareket, “merdiven” düzenine sahip ve 3. hatta en soldaki blok her desene sabittir. Bunu başlangıç ​​noktası olarak kullanarak, çevreleyen 3 blok sol ve sağda, orta 4 blok ise 1s (duvar olacaktır) olup olmadığını kontrol eder .
arrowslits
arrowslits_path


Ben bir değişken ayarlayarak 4 bayt kaybedebilir düşünmek iiçin 0dışarıdan forher pas sonra döngü ona buna 1 eklenmesi ve böylece kurtulmak enumerate. TIO'nuzla denediğimde çalışıyor gibi görünüyor. Doğru ya da yanlış olsam serin bir cevap için +1.
ElPedro

Güzel! Beyaz alanı kaldırarak bir bayt kaydedebilirsiniz 1 in. +1.
Yytsi


4

Octave, 123 122 108 bayt

@LuisMendo sayesinde 2 bayt kaydedildi

B=A=input("");B(1:3,:)=0;do;until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5;any(A(end,:))

Çevrimiçi deneyin!

Veya

Tüm test durumlarını doğrulayın

Rod test testlerini hazırlarken teşekkürler.

B=A=input("");
B(1:3,:)=0;
do
until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5
any(A(end,:))

Önceki cevap:

B=A=input("");
B(1:3,:)=0;
while nnz(A~=B)==5
    s=conv2(A,(m=-1:1)|m','same');
    x=~A;
    A&=~A|~(s<2|s>3);
    A|=x&s==3;
end;
any(A(end,:))

İlk önce değişken olan duvar desenini çıkarın B.
Duvar deseni ve simüle edilmiş desen 5 farklı hücreden daha fazla / daha küçük olana kadar GoL simülasyonunu yapın.
Planör son satırı aldıysa, fonksiyon true değerini döndürür.


1
duvar deseni ve simüle edilmiş desen 5 farklı hücreden daha fazla / daha az olana kadar Zekice!
Luis Mendo

@LuisMendo Teşekkürler, bir bayt kurtardı
rahnema1

3

Retina , 101 93 91 bayt

Bayt sayısı, ISO 8859-1 kodlamasını varsayar.

O$#^`.(?=(.*¶)*(?<=#_.\2.+##.(.*¶)\D+))
$#1
¶(?>_(_)*#+_+¶_+¶(?<1>_+¶)*)(?>(?<-1>.)+)_{11}

Çevrimiçi deneyin!

Kesinlikle henüz en uygun değil.

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.