Perl, 293 ไบต์
-9 ไบต์ขอบคุณ @Dom Hastings
{$==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'
ลองออนไลน์!
คำอธิบาย
{# ใส่บล็อก (ซึ่งใช้เป็นวง) # enter บล็อก (ซึ่งใช้เป็นลูป)
{$ == 7 + แรนด์ 30; # สุ่มเลือกความกว้างของแผนที่ -2{ $ == 7 + แรนด์30 ; # สุ่มเลือกความกว้างของแผนที่ -2
# (-2 เพราะเรายังไม่รวมเขตแดน)# (-2 เพราะเรายังไม่รวมเขตแดน)
@r = $ "= (); # reset @r และตั้ง $" เป็น undef@r = $ "= (); # reset @r และตั้ง $" เป็นundef
@ a = (# สร้างรายการของตัวละครที่สามารถอยู่บนกระดาน@a = ( # สร้างรายการของตัวละครที่สามารถอยู่บนกระดานได้
(C) x4, # 4 เหรียญ 'C'( C ) x4 , # 4 เหรียญ 'C'
(E) x3, # 3 ศัตรู 'E'( E ) x3 , # 3 ศัตรู 'E'
("#") x1369, # 37 * 37 '#'( "#" ) x1369 , # 37 * 37 '#'
("") x1369); # 37 * 37 ช่องว่าง( "" ) x1369 ); # 37 * 37 ช่องว่าง
สำหรับ $ i (0..7 + แรนด์ 30) # สร้างแผนที่ 2D (7 + แรนด์ 30 คือความสูงซึ่งเพิ่งสร้างขึ้นในขณะนี้)สำหรับ$ i ( 0..7 + แรนด์30 ) # สร้างแผนที่ 2D (7 + แรนด์ 30 คือความสูงซึ่งเพิ่งสร้างขึ้นในขณะนี้)
ราคา $ _ (0 .. $ = - 1) {สำหรับ$ _ ( 0. . $ = - 1 ) {
$ r [$ i] [$ _] = # index [$ i] [$ _] ได้รับ ...[ $ i ] [ $ _ ] = # index [$ i] [$ _] ได้รับ ...
splice @ a, rand @ a, 1 # .. อักขระแบบสุ่มจากรายการที่สร้างไว้ก่อนหน้านี้, rand @ a , 1 # .. อักขระแบบสุ่มจากรายการที่สร้างไว้ก่อนหน้านี้
# (ตัวละครจะถูกลบออกจากรายการด้วย 'splice')# (ตัวละครจะถูกลบออกจากรายการด้วย 'splice')
}}
}}
$ R [0] [$ =] = F; # เพิ่มเซลล์ที่เสร็จสิ้น[ 0 ] [ $ =] = F ; # เพิ่มเซลล์ที่เสร็จสิ้น
$ R [-1] [0] = p; # เพิ่มเซลล์เริ่มต้น[- 1 ] [ 0 ] = P ; # เพิ่มเซลล์เริ่มต้น
$ _ = $ r = # ที่นี่เราสร้างการแสดงสตริงของแผนที่= $ r = # ที่นี่เราสร้างการแสดงสตริงของแผนที่
เข้าร่วม $ /, # เข้าร่วมองค์ประกอบต่อไปนี้ด้วยการขึ้นบรรทัดใหม่/, # เข้าร่วมองค์ประกอบต่อไปนี้ด้วยการขึ้นบรรทัดใหม่
$ v = "#" x ($ = + = 3), # บรรทัดแรกของ # เท่านั้น= "#" x ( $ = + = 3 ), # บรรทัดแรกของ # เท่านั้น
(แผนที่ "# @ $ _ #", @ r), # เพิ่ม # ไปยังจุดเริ่มต้นและจุดสิ้นสุดของแต่ละบรรทัด( แผนที่"# @ $ _ #" , @r ), # เพิ่ม # ไปยังจุดเริ่มต้นและจุดสิ้นสุดของแต่ละบรรทัด
$ V; # บรรทัดสุดท้ายของ #; # บรรทัดสุดท้ายของ #
1 ในขณะที่ # regex ต่อไปนี้จะแทนที่เซลล์ที่เข้าถึงได้ด้วย F1 ในขณะที่# regex ต่อไปนี้จะแทนที่เซลล์ที่เข้าถึงได้ด้วย F
$ r = ~ s / F (. {$ =})? [^ # F] / F $ 1F / s # เซลล์ทางด้านขวาหรือด้านล่างของเซลล์ F ถูกแทนที่ = ~ s / F (. { $ =})? [^ # F ] / F $ 1F / s # เซลล์ทางด้านขวาหรือด้านล่างของเซลล์ F จะถูกแทนที่
|| # หรือ|| # หรือ
$ r = ~ s / [^ # F] F / f $ 1F / s ({$ =}.); # เซลล์ทางด้านซ้ายหรือด้านบนของเซลล์ F ถูกแทนที่= ~ s / [^ # F ] (. { $ =})? F / F $ 1F / s ; # เซลล์ทางด้านซ้ายหรือด้านบนของเซลล์ F ถูกแทนที่
$ r! ~ / [CEP] / # ถ้าไม่มี C, E หรือ P บนแผนที่ (หมายถึงพวกเขาเข้าถึงได้ทั้งหมด)! ~ / [CEP] / # หากไม่มี C, E หรือ P บนแผนที่ (หมายถึงพวกเขาเข้าถึงได้ทั้งหมด)
&& /C.*C/s # และมีอย่างน้อย 2 เหรียญ&& /C.*C/ s # และมีอย่างน้อย 2 เหรียญ
&& / E /? # และ 1 ศัตรู&& / E / ? # และ 1 ศัตรู
สุดท้าย: # แผนที่นั้นถูกต้องเราออกจากลูปสุดท้าย: # แผนที่นั้นถูกต้องเราออกจากลูป
ทำซ้ำ # else เริ่มต้นใหม่ทำซ้ำ# else เริ่มต้นใหม่
}}
พูด # และพิมพ์กระดาน# และพิมพ์บอร์ด
ใช้เวลานานในการรันเนื่องจากรายการที่เราสุ่มเลือกตัวละครที่จะนำไปวางบนกระดาน ( @a
) มีช่องว่าง 1,369 ช่อง#
และมีเพียง 4 เหรียญและ 3 ศัตรู ดังนั้นหากขนาดของความกว้างและความสูงมีขนาดเล็กมีช่องว่างมากมายและ#
เมื่อเทียบกับเหรียญและศัตรูดังนั้นจึงค่อนข้างเป็นไปได้ที่แผนที่แบบสุ่มจะไม่ถูกต้อง นั่นเป็นสาเหตุที่รุ่น "ปรับให้เหมาะสม" เร็วกว่า: รายการที่เราเลือกตัวอักษรนั้นใหญ่กว่าแผนที่เล็กน้อย (รายการคือ@a=((C)x4,(E)x3,("#")x($v=rand $=*$%),($")x($=*$%-$v))
: ตัวเลขสุ่ม$v
ของ#
(ด้อยกว่าขนาดของแผนที่) และsize of the map - $v
ช่องว่าง)