तूफान मैथ्यू और बिजली बोल्ट


27

चुनौती

इस चुनौती से प्रेरित और गंदा तूफान मैथ्यू , हम गतिशील रूप से कुछ बिजली के बोल्ट पैदा करेंगे।

n = 15:

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

इनपुट

सकारात्मक पूर्णांक nबिजली के दौर की गहराई निर्धारित करता है।

नियम और बाधाएँ

  • /और \इस्तेमाल किया जाना चाहिए
  • बिजली की दिशा का मार्गदर्शन करने की संभावना इस प्रकार है:
    • 2 रास्तों में 25% विभाजन
    • 25% पथ मृत अंत तक पहुँचता है
    • 25% वामपंथी
    • 25% सही है
    • नीचे दिए गए अतिव्यापी और मृत अंत के बारे में कुछ अपवाद हैं:
  • कोड नियतात्मक नहीं होना चाहिए, हर बार एक नया बिजली बोल्ट यादृच्छिक रूप से उत्पन्न होना चाहिए
  • बोल्ट को ओवरलैप नहीं करना चाहिए: जैसे कि यदि पहले से ही बोल्ट के बाईं ओर बोल्ट है, तो वर्तमान बोल्ट को या तो समाप्त होना चाहिए या दाएं जाना चाहिए, लेकिन बाएं या विभाजन में नहीं जाना चाहिए (संभावना अभी भी लागू होती है, इस मामले में यह 50% समाप्त हो जाता है। / 50% दाएं)
  • यदि कोई अन्य उपलब्ध विभाजन पथ मौजूद नहीं है, तो पथ समाप्त नहीं होना चाहिए: जैसे शुरुआत में जब केवल 1 पथ होता है, तो पथ को तब तक समाप्त नहीं होना चाहिए जब तक यह विभाजित नहीं हो जाता है, तब भी लागू होता है जब कई पथ होते हैं लेकिन एक पथ को छोड़कर सभी मर जाते हैं , (संभावना 33% विभाजित हो जाती है / 33% बाएँ / 33% दाएँ) आपका लक्ष्य नीचे तक पहुँचना है
  • व्हाट्सएप को बाईं ओर जोड़ा जा सकता है (आपको केवल आवश्यकता होगी ऊंचाई -1)
  • हालाँकि आप चाहते हैं कि बोल्ट आपके ऊपर है, आप नीचे से ऊपर, बाएँ से दाएँ, आदि तक जा सकते हैं, जब तक कि सभी नियम संतुष्ट नहीं हो जाते हैं

एक और उदाहरण

n = 10

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

तूफान मैथ्यू स्पष्ट रूप से आकाश को लाल बोल्ट मार रहा है, जिसे स्प्राइट कहा जाता है

सुरक्षित रहें और मजेदार गोल्फिंग करें! कृपया जिम्मेदारी से गोल्फ तभी लें जब आप सुरक्षित क्षेत्र में हों !!


7
Stay safe and have fun golfing!शायद यह भी निर्दिष्ट करें कि यदि ईएएस हड़ताल करता है, तो सब कुछ त्यागें और आदेशों का पालन करें! ऐसी स्थिति में गोल्फ कोड आपकी प्राथमिकता नहीं है।
आउटगॉल्फ

17
@EriktheGolfer आप एक सच्चे गोल्फ खिलाड़ी नहीं हैं।
ब्लू

4
मुझे विश्वास नहीं है कि "केंद्र-सबसे अधिक रास्ता जमीन तक पहुंचने वाला होना चाहिए" बाकी यादृच्छिक-पीढ़ी के विवरण के अनुरूप है। उदाहरण के लिए, मूल बोल्ट को दो बार विभाजित करना और फिर मध्य दो बोल्टों को समाप्त करने के लिए यह बेतरतीब ढंग से संभव है; संकेतित संभावनाओं को संरक्षित करते हुए भी इस संभावना को कैसे ओवरराइड किया जा सकता है?
ग्रेग मार्टिन

इसके अलावा, क्या होता है अगर (उदाहरण के लिए) पहले दो चरणों में दोनों विभाजन होते हैं? फिर मध्य दो बोल्ट एक दूसरे को छू रहे हैं, जो समस्याग्रस्त लगता है, लेकिन विशेष मामलों से भी इनकार नहीं किया जाता है।
ग्रेग मार्टिन

@GregMartin केंद्र-अधिकांश भाग पर अच्छा बिंदु है, मूल रूप से मैं इसे एक संतुलित बोल्ट उत्पन्न करने की उम्मीद कर रहा था, लेकिन अब जब मैं इसके बारे में सोचता हूं तो भी उस बाधा के बिना लगभग 50% समय बीच में कहीं खत्म हो जाना चाहिए, एक गहराई 15 में से केवल 1-2% ही ऐसा मौका होगा जहाँ दायीं या बायीं सबसे अधिक पथ भूमि हो। मैं उस नियम को हटा दूंगा। और बंटवारे के 2 चरणों के लिए, केवल एक ही चीज को रोकने के लिए है कि कोई भी 2 पथों में 2 पथ शामिल नहीं होने चाहिए: \/किसी भी बिंदु पर।
ज़ुकाबेर्ग

जवाबों:


6

पर्ल, 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/

जांचें कि क्या नई पंक्ति मान्य है


+1 नीट! आपको इस ऑनलाइन परीक्षक को शामिल करना चाहिए perl -M5.010 main.pl <<< 25, मुझे कुछ अच्छे आउटपुट मिल रहे हैं!
Zukaberg

मन थोड़ा समझाकर कहता है कि यह कैसे काम करता है? मुझे उन्हें हाहाकार करने में बहुत मज़ा आ रहा है, मैंने ईमानदारी से ऐसे अच्छे परिणामों की आशा नहीं की थी।
ज़ुकैबर्ग

दुर्भाग्य से, आपको 3 बाइट्स जोड़ने की आवश्यकता है-n , क्योंकि स्थान और डैश की गिनती भी है। यही नियम कमांड-लाइन तर्कों के लिए है। "विशेष आह्वान", दूसरा बुलेट-पॉइंट देखें: मैं उन लोगों को गिनता हूं जो चरित्र के अंतर में उनके बिना सबसे छोटे समकक्ष आह्वान में गिने जाते हैं।
आउटगॉल्फ

1
@EriktheGolfer नहीं, +1 ठीक है क्योंकि यह प्रोग्राम कमांडलाइन से ठीक काम करता है, -nEजिसके उपयोग से केवल 1 वर्ण अधिक है -E। (जिस लेख को आपने संदर्भित किया है। यह भी आवश्यकता से छुटकारा मिल जाता है -M5.010) मैं हमेशा अपने कोड को फ़ाइलों के रूप में प्रस्तुत करता हूं क्योंकि यह अधिक सुविधाजनक है, लेकिन मैं हमेशा इस तरह के विकल्प गिनता हूं: यदि इसे कमांडलाइन से चलाया जा सकता है तो मैं स्थान और डैश की गणना नहीं करता। यह तो होना चाहिए (उदाहरण के लिए, क्योंकि यह का उपयोग करता है एक फ़ाइल में होना do$0) मैं कर अंतरिक्ष और पानी का छींटा गिनती
टन Hospel

@ टोनहॉस्पेक्ट ओह, मुझे नहीं पता था कि आपने उपयोग किया है -E। यदि हां, तो आप अच्छे हैं।
को आउटगोल्फर

0

जावास्क्रिप्ट (ईएस 6), 154 बाइट्स

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>

मैंने कार्यान्वयन के साथ संघर्ष किया जब तक कि मैंने @ टोनहॉस्पेल का उत्तर नहीं देखा, जिस बिंदु पर यह सिर्फ एक बंदरगाह में पतित था। नमूना उत्पादन:

         /\
        / /\
       /\   \
        /\   \
         /\  /
          / /\
         / / /\
            / /\
            \   \
             \
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.