슬래시로 랜덤 워크 그리기


14

(표준 입력 / 명령 라인 / 함수 인수를 통해) N 정수 포지티브 취하고 인쇄 또는 반환 이차원의 문자열 표시 프로그램이나 함수 작성 랜덤 워크 : N 인 슬래시 인출 긴 단계 / \(플러스 공간 및 간격을위한 줄 바꿈).

무한 정수 격자 의 원점에서 2D 랜덤 워크가 시작됩니다 . 그런 다음 N 번 반복하여 기본 방향 (위, 아래, 왼쪽, 오른쪽)이 무작위로 균일하게 선택되고 보행자가 해당 방향으로 한 단위를 이동합니다. 결과 경로는 무작위 보행입니다.

여기에 N = 6에 대한 임의의 보행이 있습니다. (-1, 3)에 도달하면 다시 이동합니다.

N = 6 랜덤 워크 예

슬래시로 이것을 그리려면 본질적으로 모든 것을 시계 방향으로 45 ° 회전해야합니다. 축과 시작점과 끝점은 슬래시 버전에서 그려지지 않습니다.

/
\
 \
 /\

이와 같이 더 복잡한 걷기 (N = 20, 말할 방법은 없지만) :

N = 20 랜덤 워크 예

이것이 될 것입니다 :

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

프로그램은 이러한 유형의 슬래시 버전의 랜덤 워크를 생성해야합니다. 당신은 해야한다 특정 N에 대한 프로그램의 모든 실행은 거의 확실히 다른 거리를 생산 있도록 무작위로, 도보 소요 각각의 새로운 방향을 선택합니다. (의사 무작위는 괜찮습니다.)

가장 낮은 슬래시 위나 아래에는 빈 줄이 없어야하며 (선택적 후행 줄 바꿈 하나만 제외) 가장 왼쪽 슬래시와 맨 앞 슬래시 앞뒤에 빈 공간 열이 없어야합니다.

따라서 N = 1의 경우 출력은 항상 /또는 \이지만 결코 다음과 같습니다.

   
 / 

맨 오른쪽 슬래시 열을지나 가지 않는 한 후행 공백이 허용됩니다.

가장 적은 바이트를 가진 제출이 이깁니다. 다음은 편리한 바이트 카운터입니다.


N = 20 일 때도 출력이 단일 슬래시 일 수 있습니까 (드물지만) 가능합니까?
DaveAlger

2
@DaveAlger 물론입니다. 프로그램이 그렇게 많이하면 뭔가 잘못 될 것으로 기대합니다.
Calvin 's Hobbies

답변:


3

Pyth, 74 바이트

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

Uri Zarfaty의 답변에 대한 더욱 최적화 된 번역.


1
나는 더 나은 Pyth 솔루션을 가지고 있습니다 : "\ -물론, 무작위는 없지만 매번 유효한 보행입니다!
theonlygusti

@theonlygusti 그렇다면 더 나은 해결책이 있습니다 : \\.
orlp

그것을 얻지 마십시오 ...
theonlygusti

Pyth의 @theonlygusti 백 슬래시는 1 문자 상수를 시작합니다. 아 잠깐만, xD는 짧지 않다
orlp

5

파이썬 2, 300 285 257 246 236 바이트

일을 시작하는 것. 이것을 더 축소 할 수 있어야합니다. 10 바이트를 면도 해 주셔서 감사합니다 @Maltysen.

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

방문한 (x, y) 튜플의 사전 G에 보행 출력을 생성하여 위치를 업데이트합니다. 각각의 임의의 단계 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;

언 골프 드 :

<?
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어레이 출력 루프에서 최소 / 최대를 결정한다.

용법:

php golf.php 200

1

피스-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.