랜덤 워커 프린터


24

보행기의 위치에 STDOUT n점이 포함 된 문자열을 한 번에 한 번씩 작성하는 프로그램이나 함수를 그 .립니다. 프로그램은 또한 s초 마다 한 줄씩 작성해야합니다 (또는 각 줄마다 몇 초 기다립니다 s).

랜덤 워크는 모든 새로운 스텝이 마지막 스텝에 새로운 스텝을 더한 값이 되도록 임의 의 연속 스텝 ( wiki ) 으로 구성되는 경로의 수학적 형식화입니다. 따라서 모든 t스텝 값은 모든 랜덤 값의 합입니다 ir 전 초기 값.

프로그램은 2 개의 입력을 가져야 하며 출력에 공백 " "과 점만 사용합니다 ".". 보행기의 시작 값은 2019 칸 이후에 출력이 점이되어야합니다.

                  . #19 spaces then a dot

모든 새로운 단계는 워커의 마지막 값에 이들 중 하나를 더한 값이됩니다 [-2-1,0,1,2](각 20 % 확률). 새 위치가 인쇄 된 후 프로그램은 s몇 초 동안 기다렸다가 다음 단계로 넘어갑니다. 스텝이 워커를 외부로 가져 가면 범위를 1 to 40무시하고 워커 위치가 동일하게 유지됩니다. 공백의 수는 항상 0에서 39 사이의 숫자입니다.

#input
Mywalk(s = 0.1, n = 30)

#output
                     .
                    .
                      .
                        .
                          .
                           .
                            .
                          .
                         .
                          .
                           .
                            .
                           .
                          .
                           .
                           .
                         .
                         .
                          .
                            .
                           .
                          .
                           .
                           .
                           .
                         .
                          .
                         .
                          .
                          .

고려 사항

  • 합리적인 형식으로 입력 할 수 있습니다

  • 가장 짧은 코드가 승리합니다

  • 프로그램이 초를 정수로만 받아들이면 괜찮습니다.


2
나는 n걸음 수 라고 가정 합니까?
ASCIIThenANSI

응, 고마워
Mutador

나는 1 to 40공간의 수가 항상 있기 때문에 범위가 있다고 말해야한다고 생각합니다 position-1.
geokavel

@geokavel 더 좋아 보인다!
Mutador

10
프로그램을 그리세요 ??? ;-)
Digital Trauma

답변:


6

피시스, 39

J19VEK+.d0QW<.d0K)+*d=JhtS[Z39-+O5J2)\.

취하고 s, 입력의 첫 번째 줄 및 n제있다. 명령 줄에서는 작동하지만 온라인 인터프리터에서는 작동하지 않습니다. 내 첫 번째 Pyth 프로그램! 골프 팁을 부탁드립니다.


Pyth에 오신 것을 환영합니다! 내가 볼 수있는 유일한 골프 팁은 사용 할 수 있다는 것입니다 QE대신 FO 두 입력을 위해 hQ그리고 eQ당신이 입력을 분리 개행 경우.
isaacg

13

MATLAB, 112

핵심 아이디어는 가능한 다음 위치 목록을 생성 한 다음 그 중 하나를 균일하게 그리는 것입니다. 예를 들어 $ l = 1 $ 위치에있을 경우 가능한 단계는 [-1,0,1,2,3]물론 -1유효하지 않은 단계를 선택 하면 동일한 위치를 유지해야합니다. 그래서 우리는 유효하지 않은 위치를 현재 위치 [1,0,1,2,3]로 바꾸고이 업데이트 된 목록에서 임의로 요소를 선택했습니다.

OP 는 프로그램을 그릴 것을 요청 했으므로 여기로 이동하십시오.

여기에 이미지 설명을 입력하십시오

전사 :

function c(n,s);
l=19;                             %initialize position
for k=1:n;                          
    disp([ones(1,l)*32,'.']);     %print the line
    z=(-2:2)+l;                   %get vector of possible next steps (for l=1 we get [-1,0,1,2,3])
    z(z<0)=l;                     %prune invalids: here we just replace the the invalid positions with the current position
    z(z>39)=l;                    %   this ensures the same behaivour as staying in the same spot when going outside of the range
    l=z(randi(5));                %draw random sample of those
    pause(s);
end

1
-1 MathJax 비 MathJax 환경에서 사용)
코너 오브라이언

2
아시다시피, 라텍스로 쓰여 지지 않은 방정식은 믿을만한 것이 아니며 사실이 아닐 수도 있습니다! 안전한 편이 더 좋습니다.
flawr

3
그려진 프로그램은 바이트가 아닌 잉크 량으로 측정해야합니다 ...
Darrel Hoffman

8

136 128 116 106 101 90 86

$p=19;map{say$"x$p.".";sleep $ARGV[0];$x=rand(5)+$p-2;$p=$x>0&&$x<40?$x:$p}1..$ARGV[1]

초는 정수 여야합니다.

로 실행하십시오 perl <filename> <second delay> <number of steps>.

여기에는 골프 잠재력이 더 많을 수도 있지만, 솔직히 말하면 이것이 훨씬 더 놀랐습니다. (bash 응답을 이길 수있는 바이트가 6 바이트 더 있습니다 ...)

변경

  • 불필요한 괄호를 제거하고 ARGV를 철자하여 8 바이트를 절약했습니다 (실제로는 짧습니다)
  • 제거하여 12 바이트 이상을 저장 $s하고 $n그냥 평범한를 사용 $ARGV[0]하고$ARGV[1]
  • 내가 사용할 수 $"있고으로 구체적으로 정의 할 필요가 없다는 것을 깨달았을 때 10 바이트를 절약 $u했습니다 $undef.
  • 삼항을 재 배열하고 $x사용 방법 을 map대신 하여 5 바이트를 더 절약했습니다 for.
  • 더 이상 초를 소수로 받아들이지 않아 11 바이트를 절약했습니다 (도전 사양에서는 문제가 없음).
  • say대신을 사용하여 5 바이트를 더 절약했습니다 print.

6

파이썬 2, 124 119 바이트

@janrn and @Steve Eckert : 귀하의 답변에 대한 충분한 평판은 없지만 여기에 기본적으로 단축 된 버전이 있습니다. 작업은 프로그램이나 함수 를 그리는 것이므로 f(s,x)약간의 비트를 절약 max(0,min(x,39))하고 여분의 if절 을 피하는 데 사용할 수 있습니다 . 그것을 아래로 얻었다 :

import time,random as r
def f(s,x):
 n=19
 while x:print' '*n+'.';time.sleep(s);n=max(0,min(n+r.randint(-2,2),39));x-=1

5

배쉬, 81

for((s=20;i++<$1;t=s,s+=RANDOM%5-2,s=s<0|s>39?t:s)){
printf %${s}s.\\n
sleep $2
}

편집 : 단계가 워커를 1 ~ 40 범위 밖으로 나가면 무시하고 워커 위치가 올바르게 처리됩니다.

명령 행 옵션에서 입력 예 :

$ ./randwalk.sh 5 0.5
                    .
                     .
                    .
                  .
                 .
$ 

4

루비, 84

def w(s,n)q=19;n.times{puts ' '*q+'.';sleep s;q+=rand(5)-2;q=[[q,0].max,39].min};end

4

파이썬 2.7 198 162 143 133

import time,random as r;p=20;s=0;d=input();w=input()
while s<d:
 print' '*p+'.';s+=1;p=max(1,min(p+r.randint(-2,2),40));time.sleep(w)

로 스크립트를 호출 할 때 python script.py첫 번째 입력은 단계의 양이고, 두 번째 입력은 단계 사이의 시간입니다 (float 또는 int 허용). 개선을위한 제안 사항이 있습니까?

편집

  • print ' '*p+'.'@corsiKlause 덕분에을 사용하여 36 바이트 를 절약했습니다. Ho Ho Ho
  • 탭 들여 쓰기를 제거하여 다른 19 바이트를 줄이면 공간 또는 ;가능한 경우 대체
  • @Bruce_Forte 아이디어 덕분에 10 바이트가 적습니다 p=max(1,min(p+r.randint(-2,2),40))(답변에 대해서는 언급 할 수 없지만 감사합니다. 완전히 복사하고 싶지는 않습니다)

파이썬에서는 ' '*p문자열을 반복해서 갈 수 있습니까?
corsiKa

사실 그렇습니다. 지금 수정, 감사합니다
janrn December

4

처리 (150) (147)

void w(int n,int s){int x=20,i,y,c=0;for(;c<n;c++){x+=y=int(random(5)-2);if(x>40||x<0)x-=y;for(i=1;i<x;i++)print(" ");println(".");delay(s*1000);}}

용법:

void setup() {
    w(10,1);
}

참고 : 유형상의 이유로 1000변경할 수 없습니다 1e3.


3

루아, 140 바이트

참고 :이 프로그램에는 LuaSocket 패키지가 필요합니다.

require"socket"p=19 for i=1,arg[2]+0 do print((" "):rep(p)..".")p=p+math.random(-2,2)p=p<0 and 0 or p>39 and 39 or p socket.sleep(arg[1])end

3

펄 6 , 92 바이트

my (\n,\s)=@*ARGS;$/=19;for (-2..2).roll(n) {put ' 'x($/+=(40>$/+$_>=0??$_!!0)),'.';sleep s} # 92
my (\n,\s)=@*ARGS;
$/=19;
for (-2..2).roll(n) {
  put ' 'x($/+=(40>$/+$_>=0??$_!!0)),'.';
  sleep s
}

용법:

$ perl6 -e 'my (\n,\s)=@*ARGS;$/=19;for (-2..2).roll(n) {put " "x($/+=(40>$/+$_>=0??$_!!0)),".",;sleep s}' 10 0.001
                  .
                .
               .
              .
               .
                .
               .
                .
                  .
                 .

3

자바 스크립트 (ES6), 125 바이트

(s,n)=>(t=setTimeout)(c=`console.log(" ".repeat(p)+".");p+=m=Math.random()*5|0;p-=p>41|p<2?m:2;--i&&t(c,d)`,d=s*1e3,p=19,i=n)

설명

(s,n)=>
  (t=setTimeout)(                     // set inital timeout
    c=`                               // c = code for timeout to execute
      console.log(" ".repeat(p)+"."); // print the current line
      p+=m=Math.random()*5|0;         // move walker 0 - 4 positions to the right
      p-=p>41|p<2?                    // if walker was moved out of bounds (2 - 41 instead
                                      //     of 0 - 39 because the random move of 0 - 4 to
                                      //     the right has not had the 2 subtracted yet)
        m:                            // undo the move
        2;                            // else subtract 2 to make the move -2 to 2
      --i&&t(c,d)                     // while we have steps remaining schedule next one
    `,
    d=s*1e3,                          // d = milliseconds to wait between steps
    p=19,                             // p = position of walker (0 indexed)
    i=n                               // i = steps remaining (needed to make n global)
  )

테스트


3

k4, 61 자

f:{y{-1((y:1|40&y+-2+*1?5)#" "),".";."\\sleep ",$x;y}[x]\20;}

샘플 실행 :

  f[.1]30
                      .
                    .
                    .
                   .
                   .
                  .
                  .
                   .
                   .
                     .
                    .
                  .
                  .
                    .
                   .
                   .
                 .
                .
               .
               .
              .
            .
          .
         .
         .
          .
            .
              .
              .
                .

3

매쓰, 122 117 바이트

$RecursionLimit=∞;If[#2>0,Print[Indent[a=Min[#3+RandomInteger@{-2,2},39]~Max~0],"."];Pause@#;#0[#,#2-1,a]]&[##,19]&

재귀 익명 함수는 지정된 순서대로 입력합니다. 아마도 더 골프를 칠 수있을 것입니다.


2

파이썬 3, 154 바이트

import time
from random import*
w=int(input())
z=int(input())
g=19
c=6
s=" "
while c:
    c-=1
    s+=s
while z:
    z-=1
    if -1<g<40:
        print(s[:g]+'.')
    time.sleep(w)
    g+=randint(-2,2)

필요한 최대 길이보다 큰 공백 문자열을 생성 한 다음 색인 'g'의 문자까지만 해당 문자열을 인쇄 한 다음 '.'을 인쇄하십시오. [-2 : 2] 범위에서 임의의 값으로 g를 증가시켜 완료하고 반복하십시오.

누군가 내가 그 끔찍한 입력 블록을 골라 내도록 도와 줄 수 있다면 고맙겠습니다.


입력을 골프화하려면 왜 사용하지 sys.argv않습니까?
ASCIIThenANSI

1
또한, 대신 while z:, 왜 사용하지 for i in range(1,z)?
ASCIIThenANSI

궁금합니다.이 바이트가 154 바이트라는 것을 어떻게 알 수 있습니까? bytesizematters.com는 다른 수를 제공합니다 (심지어 만약 당신이 비활성화 계수 공백)
p1xel

@ ASCIIThenANSI : 흠 ... 초기 호출 sys.argv및 가져 오기 를 추가 할 때 바이트를 저장하는 방법을 알 수 없습니다. 심지어 여분의 라인을 선언 c한 후 감소 cz내 계산함으로써,이 방법을 여전히 싸다.
Steve Eckert

@ p1xel : 줄 앞의 공백을 계산했지만 공백은 앞뒤로하지 않았습니다. 내가 모르는 다른 채점 표준이 있습니까?
Steve Eckert

1

C 기능, 114

s=20,i,t;w(int n,float f){for(;i++<n;t=s,s+=rand()%5-2,s=s<0||s>39?t:s,usleep((int)(f*1e6)))printf("%*c.\n",s,0);}

내 bash 답변을 거의 직접 번역했습니다 .

전체 테스트 프로그램 :

s=20,i,t;w(int n,float f){for(;i++<n;t=s,s+=rand()%5-2,s=s<0||s>39?t:s,usleep((int)(f*1e6)))printf("%*c.\n",s,0);}

int main (int argc, char **argv) {
  w(10, 0.2);
  return 0;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.