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,2
mü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
, 61
ya da 63
eşit olasılıkla. Sonra yorumlamak 5
ve 1
yanı
, 3
sıra \
ve 6
sı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 1
da 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
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.