Perl, 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 เหล่านี้ด้วยความน่าจะเป็นที่เท่ากัน (คุณสามารถแทนที่อักขระแรกโดย
หรือ/
และอักขระที่สองตาม
หรือ\
) ใน Perl คุณสามารถทำสิ่งนี้กับสิ่งที่ชอบ:
s#\\ | /#(" "," \\","/ ","/\\")[rand 4]#eg
หากแถวผลลัพธ์มี\/
(ต้องเข้าร่วมที่ต้องห้าม) หรือไม่/
หรือ\
เลย (สายฟ้าตายและไม่ถึงด้านล่าง) ผลลัพธ์จะไม่ถูกต้อง ในกรณีนี้ฉันทิ้งแถวทั้งหมดและลองอีกครั้ง มีความต่อเนื่องที่ถูกต้องอยู่เสมอและหากคุณลองพบบ่อยพอที่จะพบสิ่งใดสิ่งหนึ่ง (เช่นทุกอย่างตายไปยกเว้นการไหล 1 ครั้ง) นี่คือการกระจายความน่าจะเป็นที่แตกต่างกันเล็กน้อยจากอัลกอริทึมป้องกันการทับซ้อนที่แนะนำ แต่ฉันคิดว่านี่เป็นความจริงที่ดีกว่าเนื่องจากไม่มีอคติทิศทาง ความถูกต้องสามารถทดสอบในวิธีที่ Golfish ใช้
m#\\|/#>m#\\/#
ปัญหาที่นี่คือการทดแทนแบบสุ่มนั้นเป็น looooong และการ\
หลบหนีทั้งหมดเหล่านี้ก็กินเป็นจำนวนไบต์ด้วย ดังนั้นผมจึงตัดสินใจที่จะสร้างแถวของฉันโดยใช้สายหลักและแทนที่ตัวเลขที่เหมาะสมโดย
, /
และ\
เพียงแค่ก่อนที่จะพิมพ์ การเปลี่ยนแบบสุ่มขั้นพื้นฐานคือ
53|16*rand
ซึ่งจะช่วยให้หนึ่ง53
, 55
, 61
หรือ63
มีโอกาสที่เท่าเทียมกัน จากนั้นผมก็ตีความ5
และ1
เป็น
, 3
เป็น\
และเป็น6
/
ที่อธิบายการพิมพ์แถว:
say y|3615|\\/ |r
ในการแข่งขันกอล์ฟที่รุนแรงตอนนี้ฉันจะเริ่มสำรวจสูตรเวทย์มนตร์ทางเลือกอย่างเป็นระบบ แต่สิ่งนี้ควรจะค่อนข้างดี (ภายใน 3 ไบต์ที่เหมาะสมที่สุด)
ส่วนประกอบที่เหลือของโปรแกรม:
1x$_.6
initializes นี้$_
(ดูแผนที่ถัดไป) /
ไปที่ช่องว่างความสูงตามด้วย นี่คือแถวที่มองไม่เห็นด้านบนแถวแรกที่ถูกพิมพ์และตรวจสอบให้แน่ใจว่าฟิลด์นั้นกว้างพอที่จะทำให้โบลต์ไม่สามารถวิ่งออกจากพื้นที่ด้านซ้ายได้
map{ ... ; say ...}(1x$_.6)x$_
ฉันจะประมวลผลความสูงของสตริงเริ่มต้นเดียวกันนี้เท่าเมื่อพิมพ์แถวใหม่ในแต่ละครั้ง
$_=$;until$;=$_,...
$;
บันทึกแถวปัจจุบันใน หากการเปลี่ยนกลายเป็นการเรียกคืนที่ไม่ถูกต้อง$_
จาก$;
s/.6|3.?/53|16*rand/eg
ทำการทดแทนที่แท้จริง ฉันไม่ต้องตรวจสอบสิ่งที่เกิดขึ้นก่อน/
หรือหลัง\
เนื่องจากต้องมีพื้นที่ นี้จะสะดวกเนื่องจากพื้นที่สามารถแสดงโดยทั้งสองหรือ1
5
เนื่องจากฉันเพิ่มเฉพาะสตริงไปทางซ้ายเว้นวรรคหลังจากที่\
ยังสามารถหายไปได้
/3|6/>/36/
ตรวจสอบว่าแถวใหม่ใช้ได้หรือไม่
Stay safe and have fun golfing!
อาจระบุด้วยว่าถ้าการประท้วงของ EAS ให้ละทิ้งทุกอย่างและทำตามคำสั่ง! รหัสการเล่นกอล์ฟไม่ใช่สิ่งที่คุณให้ความสำคัญในสถานการณ์เช่นนี้