Vẽ một lối đi ngẫu nhiên với dấu gạch chéo


14

Viết chương trình hoặc hàm nhận số nguyên dương N (thông qua stdin / dòng lệnh / hàm arg) và in hoặc trả về một chuỗi đại diện của bước đi ngẫu nhiên hai chiều dài N bước, rút ​​ra từ dấu gạch chéo: / \(cộng với dấu cách và dòng mới cho khoảng cách).

Bước đi ngẫu nhiên 2D bắt đầu từ gốc của một mạng nguyên vô hạn . Sau đó N lần lặp lại, một hướng hồng y (lên, xuống, trái, phải) được chọn thống nhất một cách ngẫu nhiên và người đi bộ di chuyển một đơn vị theo hướng đó. Con đường kết quả được thực hiện là đi bộ ngẫu nhiên.

Đây là một bước đi ngẫu nhiên cho N = 6. Lưu ý rằng nó di chuyển trở lại chính nó khi nó đạt (-1, 3).

N = 6 ví dụ đi bộ ngẫu nhiên

Để vẽ điều này bằng dấu gạch chéo, về cơ bản chúng ta cần xoay toàn bộ vật 45 ° theo chiều kim đồng hồ. Các trục và điểm bắt đầu và điểm kết thúc không được vẽ trong phiên bản gạch chéo.

/
\
 \
 /\

Một cuộc đi bộ phức tạp hơn như thế này (N = 20, mặc dù không có cách nào để nói):

N = 20 ví dụ đi bộ ngẫu nhiên

Sẽ trở thành thế này:

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

Chương trình của bạn cần tạo ra các loại phiên bản gạch chéo của các bước đi ngẫu nhiên. Bạn phải chọn ngẫu nhiên mỗi hướng đi mới, vì vậy mỗi lần chạy chương trình cho một N nhất định sẽ gần như chắc chắn tạo ra một bước đi khác nhau. (Pseudorandomness là tốt.)

Không bao giờ có bất kỳ dòng trống nào bên trên hoặc bên dưới các dấu gạch chéo thấp nhất và cao nhất (ngoại trừ một dòng mới theo dõi tùy chọn) và không bao giờ nên có các cột trống của khoảng trắng trước hoặc sau dấu gạch chéo ngoài cùng và bên phải.

Vì vậy, với N = 1, đầu ra luôn luôn /hoặc \, nhưng không bao giờ giống như:

   
 / 

Không gian lưu trữ được cho phép miễn là chúng không đi qua cột của dấu gạch chéo ngoài cùng bên phải.

Việc gửi với ít byte nhất sẽ thắng. Đây là một bộ đếm byte tiện dụng.


vì vậy có thể (mặc dù hiếm) rằng đầu ra có thể là một dấu gạch chéo ngay cả khi N = 20?
DaveAlger

2
@DaveAlger Chắc chắn rồi. Mặc dù nếu chương trình của bạn làm điều đó rất nhiều, tôi mong đợi một cái gì đó rất sai.
Sở thích của Calvin

Câu trả lời:


3

Bình thường, 74 byte

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

Một bản dịch thậm chí còn tối ưu hơn cho câu trả lời của Uri Zarfaty.


1
Tôi đã có một giải pháp Pyth tốt hơn: "\ - tất nhiên, không có sự ngẫu nhiên, nhưng đó là một bước đi hợp lệ mỗi lần!
theonlygusti

@theonlygusti Sau đó, tôi có một giải pháp tốt hơn bao giờ hết: \\.
orlp

Đừng hiểu điều đó ...
theonlygusti

@theonlygusti Backslash trong Pyth bắt đầu hằng số 1 ký tự. Đợi đã, đừng
bận tâm

5

Con trăn 2 300 285 257 246 236 byte

Một cái gì đó để khởi động mọi thứ. Nó có thể thu nhỏ điều này xuống hơn nữa. Cảm ơn @Maltysen đã cạo 10 byte.

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))

Tạo đầu ra đi bộ vào một từ điển G gồm các bộ dữ liệu đã truy cập (x, y), cập nhật vị trí của chúng tôi khi chúng tôi đi. Mỗi bước n ngẫu nhiên là cả u / d (u) và l / r (l).



1
Bạn có thể tiết kiệm rất nhiều với "".jointại j in f(1)vòng lặp và in trực tiếp.
Maltysen

1

PHP 5,5 - 209 byte

<?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;

Ung dung:

<?
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;

Bắt đầu làm việc với một câu trả lời PHP từ đầu, nhưng mã cuối cùng quá giống với công việc của @Uri Zarfaty nên tôi thực sự không đủ can đảm để đăng nó. Kết thúc porting cho biết câu trả lời với một vài sửa đổi thay thế. Đẩy các giá trị x / y vào $X$Ymảng để xác định min / max trong vòng lặp đầu ra.

Sử dụng:

php golf.php 200

1

Bình - 89

Đây về cơ bản là một bản dịch về câu trả lời của Uri Zarfaty, mặc dù tôi đã thực hiện một số tối ưu hóa.

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

Giải thích đến sớm.

Hãy thử nó ở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.