पर्ल, 293 बाइट्स
@ बाइट हेस्टिंग्स को -9 बाइट्स धन्यवाद
{$==7+rand 30;@r=$"=();@a=((C)x4,(E)x3,("#")x1369,(" ")x1369);for$i(0..7+rand 30){$r[$i][$_]=splice@a,rand@a,1for 0..$=}$r[0][$=]=F;$r[-1][0]=P;$_=$r=join$/,$v="#"x($=+=3),(map"#@$_#",@r),$v;1while$r=~s/F(.{$=})?[^#F]/F$1F/s||$r=~s/[^#F](.{$=})?F/F$1F/s;$r!~/[CEP]/&&/C.*C/s&&/E/?last:redo}say
-Eइसे चलाने के लिए ध्वज जोड़ें :
perl -E '{$==7+rand 30;@r=$"=();@a=((C)x4,(E)x3,("#")x1369,(" ")x1369);for$i(0..7+rand 30){$r[$i][$_]=splice@a,rand@a,1for 0..$=}$r[0][$=]=F;$r[-1][0]=P;$_=$r=join$/,$v="#"x($=+=3),(map"#@$_#",@r),$v;1while$r=~s/F(.{$=})?[^#F]/F$1F/s||$r=~s/[^#F](.{$=})?F/F$1F/s;$r!~/[CEP]/&&/C.*C/s&&/E/?last:redo}say'
हालाँकि, इसे चलाने में लंबा समय लगता है, इसलिए मैं इसके बजाय इस संस्करण का उपयोग करने की सलाह देता हूं:
perl -E '{${$_}=8+rand 30for"=","%";@r=$"=();@a=((C)x4,(E)x3,("#")x($v=rand $=*$%),(" ")x($=*$%-$v));for$i(0..$%-1){$r[$i][$_]=splice@a,rand@a,1for 0..$=-1}$r[0][$=-1]=F;$r[$%-1][0]=P;$_=$r=join$/,$v="#"x($=+=2),(map"#@$_#",@r),$v;1while$r=~s/F(.{$=})?[^#F]/F$1F/s||$r=~s/[^#F](.{$=})?F/F$1F/s;$r!~/[CEP]/&&/C.*C/s&&/E/?last:redo}say'
इसे ऑनलाइन आज़माएं!
व्याख्या
{{ एक ब्लॉक दर्ज करें (जिसे लूप के रूप में उपयोग किया जाता है) { $ == 7 + रैंड 30 ; # बेतरतीब ढंग से नक्शे की चौड़ाई -2 चयन # (-2 क्योंकि हमें अभी तक सीमाओं शामिल न करें) @r = $ , "# रीसेट @r, और सेट $ = ()" को undef @a = ( # बनाने चरित्र की एक सूची जो बोर्ड पर हो सकती है ( C ) x4 , # 4 सिक्के 'C' ( E ) x3 , # 3 शत्रु 'E' ( "#" ) x1369 , # 37 * 37 '#' (
"" ) x1369 ); # 37 * 37 रिक्त स्थान के लिए $ मैं ( 0..7 + रैंड 30 ) # 2 डी नक्शा बनाने (7 + रैंड 30 ऊंचाई है, जो अभी-अभी उत्पन्न किया जाता है) के लिए $ _ ( 0. । $ = - 1 ) {
$ r [ $ i ] [ $ _ ] = # सूचकांक [$ i] [$ _] प्राप्त करता है ...
ब्याह @ ए , रांड @ ए , १ # .. पहले से उत्पन्न सूची से एक यादृच्छिक चरित्र # (चरित्र है) फिर सूची से 'ब्याह' के लिए धन्यवाद) } }
$ r हटा दिया [
0 ] [ $ =] = एफ ; # फिनिश सेल
$ r [- 1 ] [ 0 ] = P जोड़ें ; # प्रारंभ सेल जोड़ें
$ _ = $ r = # यहां हम मानचित्र का एक स्ट्रिंग प्रतिनिधित्व उत्पन्न करते हैं
$ , # जुड़ते हैं, नए तत्वों के साथ निम्नलिखित तत्वों में शामिल होते हैं
$ v = "#" x ( $ = + = 3 ), # पहला # केवल लाइन ( मानचित्र "# # $ _ #" , @ ), # प्रत्येक पंक्ति की शुरुआत और अंत में एक # जोड़ें
$ वी ; # आखिरी लाइन #
1 योर # निम्न रीगेक्स हर एक्सेस सेल को F
$ r = ~ s / F ((। { $ =}) से बदल देगा? [^ # F ] / F $ 1F / s # सेल को दाईं ओर या नीचे a? एफ सेल को बदल दिया गया है || # या
$ r = ~ s / [^ # F ] (? { $ =})? एफ / एफ $ 1 एफ / एस ; # बाईं ओर या F सेल के शीर्ष पर स्थित एक सेल को
$ r से बदल दिया जाता है ! ~ / [CEP] / # यदि मानचित्र पर कोई C, E या P नहीं है (जिसका अर्थ है कि वे सभी सुलभ थे) और&
/C.*C / s # और कम से कम 2 सिक्के हैं && / E / ? # और 1 शत्रु अंतिम : # नक्शा वैध है, हम लूप से बाहर निकलते हैं # और, स्टार्ट ओवर }
कहते हैं # और प्रिंट बोर्ड
इसे चलाने में एक लंबा समय लगता है, क्योंकि जिस सूची से हम अक्षर को बोर्ड पर रखने के लिए यादृच्छिक रूप से चुनते हैं ( @a) में 1369 व्हाट्सएप और #, और केवल 4 सिक्के और 3 दुश्मन हैं। इसलिए यदि चौड़ाई और ऊंचाई का आकार छोटा है, तो बहुत सारे स्थान हैं और #सिक्के और दुश्मनों की तुलना में है, इसलिए यह काफी संभावना है कि एक यादृच्छिक नक्शा मान्य नहीं होगा। (सूची है: क्यों "अनुकूलित" संस्करण तेजी से होता है कि सूची जिससे हम पात्रों लेने बस थोड़ी नक्शे से बड़ा है @a=((C)x4,(E)x3,("#")x($v=rand $=*$%),($")x($=*$%-$v)): एक यादृच्छिक संख्या $vकी #(नक्शे के आकार से हीन), और size of the map - $vव्हाइटस्पेस)।