Matthew Kasırgası ve Şimşek


27

Meydan okuma

Bu zorluktan ve iğrenç Kasırga Matthew'dan esinlenerek , dinamik olarak bazı paratonerler üreteceğiz.

n = 15:

   \
   /\
  /  \
 /   /
/\  /\
 /  \ \
/   / /\
   /\ \
  / /  \
 /\ \  /\
  /  \ \
 /\  /  
   \
    \
    /\

Giriş

Pozitif Tamsayı nyıldırım turunun derinliğini belirler.

Kurallar ve Kısıtlamalar

  • /ve \kullanılmalı
  • Yıldırımın yönünü belirleme olasılığı aşağıdaki gibidir:
    • % 25 2 yola ayrılıyor
    • % 25 Yol çıkmaz noktasına ulaştı
    • % 25 Sola Gidiyor
    • % 25 Sağa Gidiyor
    • Örtüşen ve çıkmayanlarla ilgili birkaç istisna vardır:
  • Kod deterministik olmamalı, her seferinde rastgele yeni bir şimşek üretilmelidir.
  • Cıvatalar üst üste gelmemelidir: örneğin mevcut cıvatanın solunda zaten bir cıvata varsa, mevcut cıvata sondan veya sağdan gitmeli, fakat sola veya ayrılmamalı (olasılık hala geçerlidir, bu durumda% 50 sonlanır) /% 50 sağ)
  • Kullanılabilir başka bir bölünmüş yol yoksa, yol bitmemelidir: örneğin, yalnızca 1 yol olduğunda başlangıçta, yol ayrılmadan önce bitmemelidir, birden fazla yol olduğunda ama bir yol dışında hepsi yokken de geçerlidir , (olasılık% 33 bölünmüş /% 33 sol /% 33 sağ olur) hedefiniz en alta ulaşmak için
  • Boşluklar sol tarafa eklenebilir (ihtiyacınız olan her şey sadece yükseklik-1 olmalıdır)
  • Ancak cıvatayı üretmek istediğiniz size kalmış, aşağıdan yukarıya, soldan sağa vb. Gidebilirsiniz. Yukarıdaki tüm kurallar yerine getirildiği sürece

Başka bir örnek

n = 10

 \
 /
 \
 /\
  /\
 / /
/\ \
 / /\
 \   \
 /

Matthew Kasırgası görünüşte sprites denilen gökyüzünü kırmızı cıvata vuruyor

Güvende kalın ve eğlenin golf oynayın! Lütfen sadece güvenli bir bölgedeyken sorumlu bir şekilde golf oynayın!


7
Stay safe and have fun golfing!Belki de EAS grev yaparsa, her şeyi bırakıp emirlere uyun! Golf kodu, böyle bir durumda önceliğiniz değildir.
Outgolfer Erik,

17
@EriktheGolfer o zaman gerçek bir golfçü değilsin.
Mavi,

4
"En merkezi yolun, yere ulaşması gereken yolun olması gerektiği" ifadesinin, rastgele nesil tanımlamanın geri kalanıyla tutarlı olduğuna inanmıyorum. Örneğin, orijinal cıvatanın iki kez ayrılması ve ardından ortadaki iki cıvatanın bitmesi rastgele mümkündür; belirtilen olasılıklar korunurken bu olasılık nasıl geçersiz kılınabilir?
Greg Martin

Ayrıca, ilk iki basamağın ikisi de bölündüyse (örneğin) ne olur? Sonra ortadaki iki cıvata birbirine temas ediyor, bu sorunlu görünüyor ancak özel durumlar tarafından da göz ardı edilmiyor.
Greg Martin

@GregMartin Orta kısımda iyi bir nokta, başlangıçta dengeli bir cıvata üretmeyi umuyordum, ama şimdi ortada bir yerde bitmesi gereken zamanın% 50'sinde bir kısıtlama olmadan bile düşünüyorum. 15 kişiden sadece% 1-2'si, sağ ya da sol yolun karaya indiği yerde şansa sahip olacak. Bu kuralı kaldıracağım. Ve parçayı bölen 2 adım için, önlenecek tek şey 2 yolun 2 yolun birleştirilmemesi gerektiğidir: \/herhangi bir noktada.
Zukaberg

Yanıtlar:


6

Perl, 92 90 89 84 bayt

İçin +1 içerir -n

STDIN üzerinde yükseklik ver:

perl -M5.010 bolt.pl <<< 15

bolt.pl:

#!/usr/bin/perl -n
map{$_=$;until$;=$_,s/.6|3.?/53|16*rand/eg,/3|6/>/36/;say y|3615|\\/ |r}(1x$_.6)x$_

açıklama

0 başlangıç ​​noktasının ofsetini çağırırsanız (bir nokta bir karakter kutusunun köşesindedir), sonra bir sonraki satırda sola veya sağa gidebilirsiniz (veya değil) ve ofsetlerde noktalarla sonuçlanabilir -1,1. Bir sonraki satır -2,0,2mümkün olan en az ofsetleri vb. Verir . Hepsi 2'ye göre farklılık gösterir. Daha sonra karakteri bir noktanın sol alt kısmına çağırırsanız ve sağ alt sıranın karakterini çağırırsanız, bunu her karakter pozisyonuna eşit veya tek atamak için genişletebilirsiniz. düz ve tuhaf bir alternatif olarak (aslında tüm düzlem bir dama tahtası şeklinde döşenmiştir). Düz bir pozisyonda bir /veya olabilir , tek bir pozisyonda \veya olabilir .

Sadece bir önceki karakter /olması ya böylece garip bir konumda \ya , ama \/böylece sadece yasaktır mümkündür. Benzer bir sonraki karakter \ olmalıdır bir olmak (satır sınırları hiçbir sorun böylece satır varsayarak solunda ve sağında yeterli boşluklarla takviye edilir). Böylece bir şimşek, bir sonraki sırada her zaman a \veya altında bir doğrudan devam eder /. Her iki durumda da alt nokta ortada ve sonraki satır birine sahip olabilir , /, \ya da /\doğrudan üst 2 karakterin altında. Sonraki satırı oluşturmak için Yani basitçe herhangi değiştirebilir \veya/Bu 4 genişlemenin herhangi biriyle eşit olasılıkla (ilk karakteri bağımsız olarak veya /ikinci karakteri de veya ile değiştirebilirsiniz \). Perl'de bunu şöyle bir şey yapabilirsin:

s#\\ | /#("  "," \\","/ ","/\\")[rand 4]#eg

Sonuçta ortaya çıkan satırda \/(yasak birleştirme) veya hiç /veya \hiç (cıvata ölür ve tabana ulaşmaz) bulunursa sonuç geçersizdir. Bu durumda bütün sırayı atar ve tekrar denerim. Geçerli bir devamı her zaman vardır ve yeterince sık denerseniz bir tane bulunacaktır (örneğin, 1 akış hariç her şey ölür). Bu, önerilen örtüşme önleme algoritmasından biraz farklı bir olasılık dağılımıdır, ancak bunun yönelimli bir önyargısı olmadığı için aslında daha iyi olduğunu düşünüyorum. Geçerlilik kullanarak bir golfçü şekilde test olabilir

m#\\|/#>m#\\/#

Buradaki sorun, rastgele sübstitüsyonun looooong olmasıdır ve tüm bu \kaçmalar da bayt yer. Bu yüzden basamak dizeleri kullanarak sıra inşa ve tarafından uygun numarayı değiştirmek için karar , /ve \sadece yazdırmadan önce. Temel rastgele yerine koyma

53|16*rand

bu gruptan olan bir verir 53, 55, 61ya da 63eşit olasılıkla. Sonra yorumlamak 5ve 1yanı , 3sıra \ve 6sıra /. Bu satır baskısını açıklar:

say y|3615|\\/ |r

Ciddi bir golf yarışmasında, şimdi alternatif sihirli formülleri sistematik olarak araştırmaya başlayacağım, ancak bu oldukça iyi olmalı (en iyi 3 byte içinde)

Programın bileşenlerinin geri kalanı:

1x$_.6

Bu $_(sonraki haritaya bakınız) yükseklik boşluklarını başlatır ve ardından a /. Bu, basılan ilk satırın üstündeki görünmez bir satırdır ve alanın yeterince geniş olduğundan emin olun; böylece cıvata solda hiç boşluk kalmaz

map{ ... ; say ...}(1x$_.6)x$_

Her seferinde yeni bir satır basarken bu aynı ilk dize yüksekliği kez işleyeceğim

$_=$;until$;=$_,...

Geçerli satırı içine kaydedin $;. Değişimin geçersiz olduğu ortaya çıkarsa $_,$;

s/.6|3.?/53|16*rand/eg

Asıl ikameyi yapın. Daha önce ne olduğunu kontrol etmek gerekmez /ve sonrasında \o zamandan beri gerekir bir uzay olsun. Bu, alan ya 1da ile gösterilebildiği için uygundur 5. Dizgiyi yalnızca sola doğru doldurduğumdan sonra, \hala devamsızlıktan sonra, bu karakteri isteğe bağlı yapın

/3|6/>/36/

Yeni satırın geçerli olup olmadığını kontrol edin


+1 Düzgün! Bu çevrimiçi test cihazını eklemelisin, perl -M5.010 main.pl <<< 25bazı güzel çıktılar alıyorum!
Zukaberg

Nasıl çalıştığını biraz açıklamak ister misiniz? Onları haha ​​üretmekten çok eğleniyorum, dürüstçe böyle iyi sonuçlar beklemiyordum.
Zukaberg

Ne yazık ki, boşluk ve çizgi de sayıldığından, için 3 bayt eklemeniz gerekir-n . Aynı kural komut satırı argümanları için de geçerlidir. Bkz. "Özel Davetiyeler", ikinci madde işareti noktası: Bunları, karakter sayımlarındaki farkı, onlarsız en kısa eşdeğer çağrıya sayıyorum.
Outgolfer Erik,

1
Bu program kullanılarak komut ile cezası çalıştığı için @EriktheGolfer Hayır, 1 Tamam -nEsadece 1 karakter daha daha -E. (Eğer başvurulan makalesine bakın. Bu aynı zamanda ihtiyaç kurtulmak alır -M5.010) Hep dosyaları olarak kodumu sunmak bunun nedeni daha kullanışlıdır, ancak daima böyle seçenekleri sayarım: Komut satırından çalıştırılabilirse, alanı ve çizgiyi saymam. O Eğer gerekir (o kullandığı için örneğin bir dosyada olması do$0) ben yapmak boşluk ve tire saymak
Ton Hospel

@TonHospel Oh, kullanıldığını bilmiyordum -E. Eğer öyleyse, sen iyisin.
Outgolfer Erik

0

JavaScript (ES6), 154 bayt

f=(n,r=[],s=" ".repeat(n)+"/",t=s.replace(/ \/|\\ |\\$/g,_=>"  /  \\/\\".substr(Math.random()*8&6,2)))=>n?/^ +$|\\\//.test(t)?f(n,r,s):f(n-1,[...r,t],t):r
<input type="number" min=1 oninput=o.textContent=f(this.value).join`\n`><pre id=o>

@ TonHospel'in cevabını görene kadar uygulama ile mücadele ettim, bu noktada sadece bir limana dönüştü. Örnek çıktı:

         /\
        / /\
       /\   \
        /\   \
         /\  /
          / /\
         / / /\
            / /\
            \   \
             \
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.