পার্ল, 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 = ( # তৈরি বোর্ডে ( সি ) x4 , # 4 কয়েন 'সি' ( ই ) x3 , # 3 শত্রু 'ই' ( "#" ) x1369 , # 37 * 37 '#' ( বোর্ডে থাকা চরিত্রের একটি তালিকা
"" ) x1369 ); # 37 * 37 শূণ্যস্থান জন্য $ i এর ( 0..7 + + রান্ড 30 ) # 2D মানচিত্র তৈরি (7 + + রান্ড 30 উচ্চতা, যা এইমাত্র উৎপন্ন হয় হয়) জন্য $: _ ( 0. । $ = - 1 ) {
$ r [ $ i ] [ $ _ ] = # সূচক [$ i] [$ _] প্রাপ্ত ...
স্প্লাইস @ এ , র্যান্ড @ এ , 1 # .. আগে উত্পন্ন তালিকা থেকে একটি এলোমেলো চরিত্র # (চরিত্রটি হ'ল তারপরে তালিকা থেকে অপসারণ করা হয়েছে 'স্প্লাইস' এর জন্য ধন্যবাদ) } }
$ r [
0 ] [ $ =] = এফ ; # সমাপ্ত সেলটি যোগ করুন -
r [- 1 ] [ 0 ] = পি ; # শুরুর ঘরটি যোগ করুন
$ _ = $ আর = # এখানে আমরা মানচিত্রের একটি স্ট্রিং উপস্থাপনা উত্পন্ন করি
$ /, # নতুন উপাদানগুলির সাথে নিম্নলিখিত উপাদানগুলিতে যোগদান করুন
$ v = "#" x ( $ = + = 3 ), # প্রথম # লাইন শুধুমাত্র ( ম্যাপ "# @ $: _ #" , @r ), # শুরুতে এবং প্রতিটি লাইনে শেষে একটি # যোগ
$ v ; # শেষ লাইন
1 ততক্ষণে # নীচের রেজেক্স প্রতিটি অ্যাক্সেসযোগ্য কক্ষকে F
$ r = ~ s / F (। { $ = =}) দিয়ে প্রতিস্থাপন করবে ? [^ # F ] / F $ 1F / s # একটি ঘর ডান বা নীচে একটি ঘর এফ সেল প্রতিস্থাপন করা হয়েছে || # বা
$ আর = ~ এস / [^ # এফ ] (। { $ =})? এফ / এফ $ 1 এফ / এস ; # বামে বা একটি এফ কোষের শীর্ষে একটি ঘর replaced
r ! ~ / [সিইপি] / # প্রতিস্থাপন করা হয়েছে যদি মানচিত্রে সি, ই বা পি না থাকে (যার অর্থ তারা সকলেই অ্যাক্সেসযোগ্য ছিল) &&
/ সি.এ.সি.সি / এস # এবং কমপক্ষে 2 টি মুদ্রা && / ই / আছে ? # এবং 1 শত্রু শেষ : # মানচিত্রটি বৈধ, আমরা লুপটি আবারও প্রস্থান করব # আবার শুরু করুন }
বলুন # এবং বোর্ডটি মুদ্রণ করুন
এটি চালাতে দীর্ঘ সময় লাগে, কারণ আমরা যে তালিকা থেকে এলোমেলোভাবে বোর্ডে রাখার জন্য অক্ষরগুলি বেছে নিয়েছি ( @a
) এতে 1369 হোয়াইটস্পেস #
এবং কেবল 4 টি মুদ্রা এবং 3 শত্রু রয়েছে। সুতরাং প্রস্থ এবং উচ্চতার আকার যদি ছোট হয় তবে প্রচুর জায়গা রয়েছে এবং #
মুদ্রা এবং শত্রুদের সাথে তুলনা করা যায়, তাই সম্ভবত এটি সম্ভবত এলোমেলো মানচিত্র বৈধ হবে না likely (তালিকা হল: কেন "অপ্টিমাইজ" সংস্করণ দ্রুততর এটা তালিকা যেখান থেকে আমরা অক্ষর বাছাই শুধু একটু মানচিত্র চেয়ে বড় @a=((C)x4,(E)x3,("#")x($v=rand $=*$%),($")x($=*$%-$v))
: একটি র্যান্ডম সংখ্যা $v
এর #
(মানচিত্রে আকার নিকৃষ্ট), এবং size of the map - $v
অনুসরণকারী শূণ্যস্থান)।