पर्ल, 92 90 89 84 बाइट्स
के लिए +1 शामिल है -n
STDIN पर ऊंचाई दें:
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$_
व्याख्या
यदि आप शुरुआती बिंदु 0 की ऑफसेट कहते हैं (एक बिंदु एक चरित्र बॉक्स के कोने पर है), तो अगली पंक्ति पर आप बाएं या दाएं (या नहीं) जा सकते हैं और ऑफसेट पर बिंदुओं के साथ समाप्त हो सकते हैं -1,1
। अगली पंक्ति -2,0,2
जितना संभव हो उतने ऑफसेट इत्यादि देती हैं । वे सभी 2 से भिन्न होते हैं। यदि आप चरित्र को एक बिंदु के निचले बाएँ और यहां तक कि वर्ण को दाईं ओर विषम कहते हैं, तो आप उसे विस्तारित कर सकते हैं और प्रत्येक वर्ण स्थिति में विषम को भी निर्दिष्ट कर सकते हैं। इस तरह की एक पंक्ति पर, यहां तक कि और विषम वैकल्पिक (वास्तव में पूरे विमान को एक बिसात के पैटर्न में टाइल किया गया है)। यहां तक कि स्थिति में एक /
या
, एक विषम स्थिति हो सकती है \
या हो सकती है
।
चरित्र /
एक विषम स्थिति में होने से ठीक पहले है इसलिए यह \
या तो हो सकता है
, लेकिन \/
निषिद्ध है इसलिए केवल
संभव है। इसी तरह चरित्र के बाद एक \
होना चाहिए
(यह मानते हुए कि पंक्ति बाईं और दाईं ओर पर्याप्त रिक्त स्थान के साथ गद्देदार है, इसलिए पंक्ति की सीमाएं कोई समस्या नहीं हैं)। तो एक बिजली का बोल्ट अगली पंक्ति पर हमेशा सीधे एक \
या नीचे एक के नीचे जारी रहता है /
। या तो मामले में कम बिंदु बीच में है और अगली पंक्ति में से एक हो सकता है
, /
, \
या /\
सीधे शीर्ष 2 वर्ण नीचे। तो अगली पंक्ति उत्पन्न करने के लिए मैं बस किसी भी \
या को बदल सकता हूं/
समान संभावना वाले इन 4 विस्तारों में से किसी के द्वारा (आप स्वतंत्र रूप से पहले चरित्र को
या /
दूसरे वर्ण को
या इसके द्वारा प्रतिस्थापित कर सकते हैं \
)। पर्ल में आप ऐसा कुछ कर सकते हैं:
s#\\ | /#(" "," \\","/ ","/\\")[rand 4]#eg
यदि परिणामी पंक्ति में फिर भी शामिल \/
(निषिद्ध सम्मिलित ) या नहीं /
या \
बिल्कुल (बोल्ट मर जाता है और नीचे नहीं पहुंचता है) तो परिणाम अमान्य है। उस स्थिति में मैं पूरी पंक्ति को फेंक देता हूं और बस फिर से कोशिश करता हूं। एक वैध निरंतरता हमेशा मौजूद रहती है और यदि आप अक्सर प्रयास करते हैं तो एक पर्याप्त मिल जाएगा (जैसे 1 प्रवाह को छोड़कर सब कुछ मर जाता है)। यह सुझाए गए एंटी-ओवरलैप एल्गोरिथ्म से थोड़ा अलग संभावना वितरण है, लेकिन मुझे लगता है कि यह वास्तव में बेहतर है क्योंकि इसका कोई प्रत्यक्ष पूर्वाग्रह नहीं है। वैधता का उपयोग करके एक गोल्फ तरीके से परीक्षण किया जा सकता है
m#\\|/#>m#\\/#
यहाँ समस्या यह है कि रैंडम प्रतिस्थापन इतना लूपोन्ग है और ये सभी \
पलायन बाइट भी खाते हैं। इसलिए मैंने अपनी पंक्तियों को अंकों के तारों का उपयोग करके बनाने का फैसला किया और उपयुक्त अंकों को प्रतिस्थापित किया
, /
और \
छपाई से ठीक पहले। मूल यादृच्छिक प्रतिस्थापन है
53|16*rand
जिनमें से एक देता है 53
, 55
, 61
या 63
बराबर संभावना के साथ। मैं तो व्याख्या 5
और के 1
रूप में
, के 3
रूप में \
और के 6
रूप में /
। पंक्ति प्रिंट की व्याख्या करता है:
say y|3615|\\/ |r
एक गंभीर गोल्फ प्रतियोगिता में मैं अब वैकल्पिक रूप से वैकल्पिक मैजिक फॉर्मूले तलाशना शुरू करूंगा, लेकिन यह बहुत अच्छा होना चाहिए (3 बाइट्स में से इष्टतम)
कार्यक्रम के बाकी घटक:
1x$_.6
यह आरंभिक स्थान $_
(अगला नक्शा देखें) के बाद ऊंचाई वाले स्थानों पर जाता है /
। यह पहली पंक्ति के ऊपर एक अदृश्य पंक्ति है जिसे मुद्रित किया जाता है और सुनिश्चित करता है कि क्षेत्र पर्याप्त चौड़ा है इसलिए बोल्ट कभी भी बाईं ओर अंतरिक्ष से बाहर नहीं निकल सकता है
map{ ... ; say ...}(1x$_.6)x$_
मैं प्रत्येक बार एक ही पंक्ति को प्रिंट करने के लिए इसी प्रारंभिक स्ट्रिंग ऊंचाई बार संसाधित करेगा
$_=$;until$;=$_,...
में वर्तमान पंक्ति सहेजें $;
। यदि प्रतिस्थापन अमान्य पुनर्स्थापना $_
से बदल जाता है$;
s/.6|3.?/53|16*rand/eg
वास्तविक प्रतिस्थापन करें। मुझे यह जांचने की ज़रूरत नहीं है कि यह पहले से /
या बाद में है \
क्योंकि यह एक स्थान होना चाहिए। यह सुविधाजनक है क्योंकि अंतरिक्ष 1
या तो द्वारा प्रतिनिधित्व किया जा सकता है 5
। चूँकि मैंने केवल स्ट्रिंग को बाईं जगह पर छोड़ दिया था, जो \
अभी भी अनुपस्थित हो सकता है, इसलिए उस चरित्र को वैकल्पिक बनाएं
/3|6/>/36/
जांचें कि क्या नई पंक्ति मान्य है
Stay safe and have fun golfing!
शायद यह भी निर्दिष्ट करें कि यदि ईएएस हड़ताल करता है, तो सब कुछ त्यागें और आदेशों का पालन करें! ऐसी स्थिति में गोल्फ कोड आपकी प्राथमिकता नहीं है।