วาดการเดินสุ่มด้วยสแลช


14

เขียนโปรแกรมหรือฟังก์ชั่นที่รับจำนวนเต็มบวก N (ผ่าน stdin / command line / function arg) และพิมพ์หรือคืนค่าการแทนค่าสตริงของการเดินแบบสุ่มสองมิติที่มีความยาว N ก้าวยาวออกจากสแลช: / \(บวกช่องว่างและ บรรทัดใหม่สำหรับการเว้นวรรค)

2 มิติเดินสุ่มเริ่มต้นที่ต้นกำเนิดของอนันต์ขัดแตะจำนวนเต็ม จากนั้น N คูณซ้ำ ๆ ทิศทางที่สำคัญ (ขึ้น, ลง, ซ้าย, ขวา) จะถูกเลือกอย่างสม่ำเสมอโดยการสุ่มและวอล์คเกอร์เคลื่อนที่หนึ่งหน่วยในทิศทางนั้น เส้นทางที่เกิดขึ้นคือการเดินแบบสุ่ม

นี่คือการเดินแบบสุ่มสำหรับ N = 6 โปรดสังเกตว่ามันเคลื่อนที่ย้อนกลับไปที่ตัวเองเมื่อถึง (-1, 3)

N = 6 ตัวอย่างการเดินแบบสุ่ม

ในการวาดด้วยสแลชเราต้องหมุนทั้งหมดตามเข็มนาฬิกา 45 ° แกนและจุดเริ่มต้นและจุดสิ้นสุดไม่ถูกวาดในเวอร์ชันสแลช

/
\
 \
 /\

การเดินที่ซับซ้อนมากขึ้นเช่นนี้ (N = 20 แม้ว่าจะไม่มีทางบอก):

N = ตัวอย่างการเดินสุ่ม 20 รายการ

จะกลายเป็นสิ่งนี้:

     /
/\/ /\
\/\/
/\/
\/

โปรแกรมของคุณต้องสร้างการเดินสุ่มแบบสแลชประเภทนี้ คุณต้องสุ่มเลือกทิศทางใหม่ที่ใช้ในการเดินดังนั้นการวิ่งของโปรแกรมสำหรับ N ที่แน่นอนจะทำให้เกิดการเดินที่แตกต่างกัน (Pseudorandomness ไม่เป็นไร)

ไม่ควรมีบรรทัดว่างใด ๆ ที่อยู่ด้านบนหรือด้านล่างของเครื่องหมายทับต่ำสุดและสูงสุด (ยกเว้นบรรทัดใหม่ที่ต่อท้ายหนึ่งบรรทัด) และไม่ควรมีคอลัมน์ว่างของช่องว่างก่อนหรือหลังเครื่องหมายทับซ้ายสุดและขวาสุด

ดังนั้นสำหรับ N = 1 เอาต์พุตจะเป็นเสมอ/หรือ\แต่ไม่เหมือน:

   
 / 

อนุญาตให้เว้นวรรคต่อท้ายตราบใดที่ไม่ผ่านคอลัมน์ของเครื่องหมายทับขวาสุด

การส่งที่มีไบต์น้อยที่สุดจะเป็นผู้ชนะ นี่คือตัวนับไบต์ที่มีประโยชน์


ดังนั้นจึงเป็นไปได้ (แม้ว่าหายาก) ที่เอาต์พุตอาจเป็นเครื่องหมายทับเดียวแม้เมื่อ N = 20
DaveAlger

2
@DaveAlger แน่นอน แม้ว่าโปรแกรมของคุณจะทำสิ่งนั้นมากฉันก็คาดหวังว่ามีบางอย่างผิดปกติ
งานอดิเรกของ Calvin

คำตอบ:


3

Pyth, 74 ไบต์

K0VQJO2=GO2 XH,-ZJ-KG@"\/"xJG-=ZtyJ-=KtyG;=YmrhSdheSdCHjbclhYsmh@XkH\ k.xY

การแปลที่มีประสิทธิภาพยิ่งขึ้นของคำตอบของ Uri Zarfaty


1
ฉันมีวิธีแก้ปัญหา Pyth ที่ดีกว่า: "\ - แน่นอนไม่มีการสุ่ม แต่เป็นการเดินที่ถูกต้องทุกครั้ง!
theonlygusti

@theonlygusti จากนั้นฉันมีทางออกที่ดีกว่าเดิม: \\
orlp

ไม่เข้าใจ ...
theonlygusti

@theonlygusti Backslash ใน Pyth เริ่มค่าคงที่ 1 อักขระ โอ้รอไม่เป็นไรไม่สั้นลง xD
orlp

5

Python 2 300 285 257 246 236 ไบต์

บางสิ่งบางอย่างที่จะเตะออก มันควรจะเป็นไปได้ที่จะลดขนาดลงอีก ขอบคุณ @Maltysen สำหรับการโกน 10 ไบต์

from random import*
N=input()
x=y=0;G={}
exec'n=randrange(4);l=n<2;u=n&1;G[(x-l,y-u)]="\\/"[l^u];x-=2*l-1;y-=2*u-1;'*N
f=lambda i:range(min(x[i]for x in G),max(x[i]for x in G)+1)
for i in f(0):print"".join(G.get((i,j)," ")for j in f(1))

สร้างสัญญาณเดินเท้าเป็นพจนานุกรม G ของ tuples ที่เข้าชม (x, y) เพื่ออัปเดตตำแหน่งของเราเมื่อเราไป แต่ละขั้นตอนแบบสุ่ม n คือทั้ง u / d (u) และ l / r (l)



1
คุณสามารถประหยัดได้มากด้วย"".joinการj in f(1)วนซ้ำและการพิมพ์โดยตรง
Maltysen

1

PHP 5.5 - 209 ไบต์

<?for(;$X[]=$x+=1-2*$l,$Y[]=$y+=1-2*$u,$i++<$argv[1];){$m[$y-$u=$n&1][$x-$l=($n=rand(0,3))<2]='\\/'[$u^$l];}for($y=min($Y);$y<max($Y);$y++){for($x=min($X);$x<max($X);$x++)$s.=$m[$y][$x]?:' ';$s.="\n";}echo$s;

Ungolfed:

<?
for (; $X[] = $x += 1 - 2 * $l, $Y[] = $y += 1 - 2 * $u, $i++ < $argv[1];) {
    $m[$y - $u = $n & 1][$x - $l = ($n = rand(0, 3)) < 2] = '\\/'[$u ^ $l];
}
for ($y = min($Y); $y < max($Y); $y++) {
    for ($x = min($X); $x < max($X); $x++) {
        $s .= $m[$y][$x] ? : ' ';
    }
    $s .= "\n";
}
echo $s;

เริ่มทำงานกับคำตอบ PHP ตั้งแต่เริ่มต้น แต่รหัสสุดท้ายมากเกินไปคล้ายกับงานของ @Uri Zarfaty ดังนั้นฉันจึงไม่กล้าที่จะโพสต์มัน ลงเอยด้วยการย้ายคำตอบดังกล่าวพร้อมการแก้ไขเล็กน้อย ใส่ค่า x / y ลงใน$Xและ$Yอาร์เรย์เพื่อกำหนด min / max ในเอาต์พุตลูป

การใช้งาน:

php golf.php 200

1

Pyth - 89

นี่คือการแปลตามคำตอบของ Uri Zarfaty แม้ว่าฉันจะทำการปรับปรุงบางอย่าง

KZVQJO4=G<J2=b.&J1 XH,-KG-Zb@"\\/".|Gb-=KtyG-=Ztyb)LrhSm@dbHheSm@kbHFNy0jkm?@H,Nb},NbHdy1

คำอธิบายจะมาเร็ว ๆ นี้

ลองได้ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.