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 ให้ละทิ้งทุกอย่างและทำตามคำสั่ง! รหัสการเล่นกอล์ฟไม่ใช่สิ่งที่คุณให้ความสำคัญในสถานการณ์เช่นนี้