코드 골프 : 자신의 애완 동물 ASCII 뱀


34

그래서 콘솔에 뱀을 인쇄 한 라이너를 직접 작성했습니다. 약간 재미 있고 코드를 어떻게 압축 할 수 있을지 궁금했습니다 ...

다음은 (짧은) 예제 출력입니다.

                +
                 +
                  +
                   +
                   +
                   +
                  +
                   +
                    +
                    +
                    +
                     +
                     +
                      +
                      +
                       +
                      +
                     +
                     +
                    +

사양은 다음과 같습니다.

  • 각 줄에서 공백이 아닌 단일 문자 (원하는 문자)가 콘솔에 인쇄되며 처음에는 왼쪽에 29-31 개의 공백이 채워집니다.
  • 반복 할 때마다이 세 가지 동작간에 임의의 결정이 내려집니다.
    • 패딩 양이 1 감소
    • 패딩의 양은 동일하게 유지됩니다
    • 패딩 양이 1 씩 증가합니다

콘솔에 30 분 길이의 뱀을 인쇄하려면이 작업을 30 번 수행하십시오.

바이트 단위의 최단 답변이 이깁니다.


줄 배열을 반환 할 수 있습니까? 앞 / 뒤 공백이나 줄 바꿈이 허용됩니까?
— 얽히고 설킨

1
각 줄의 후행 공백이 허용된다고 가정합니다.
— Luis Mendo 2013

1
"무작위"는 무엇을 의미합니까? 균일하게 무작위? 세 가지 결과 각각에 대해 긍정적 인 지원을하는 분포에서 임의의 것입니까? 어떤 분포에서 무작위입니까? 프로그램을 실행할 때마다 결과가 달라야합니까?
— Nathaniel

1
기본적으로 random은 균일하게 의미하지는 않습니다 . 예를 들어, 내 brainfuck 답변 의 두 번째 부분은 대부분 직선을 생성하지만 그럼에도 불구하고 완벽하게 유효합니다.
— 조 왕

1
현재 명확하지 않은 두 가지 점이 있습니다. 1) 무작위 는 균일하게 무작위를 의미 합니까 ? ( 이 답변에 영향을 미침 ) 2) 매번 출력이 달라야합니까? (즉, 난수 생성기를 시드 할 수 없습니까? 이 답변에 영향을 미칩니다 )
— DJMcMayhem

답변:


14

05AB1E , 15 14 바이트

30DF2Ý<+ΩD0sú,

온라인으로 사용해보십시오!

사용합니다 0.

설명

30DF2Ý<+ΩD0sú,
30D            # Push 30 to the stack (One for the amount of iterations we are going to perform and one for the initial padding)
   F           # Pop one of the 30s and perform the following that many times...
    2Ý          # Push [0,1,2] ...
      <         # and create [-1,0,1] from that
       +        # Add the last padding to every entry (e.g. 30 in the beginning resulting in [29,30,31]
        Ω       # Pick one of the results at random ...
         D      # and push it to the stack twice
          0     # Push 0 (Any character will work fine here) ...
           sú   # and pad it with the randomly chosen amount of spaces in the front
             ,  # Finally print the result with a trailing newline

38
05AB1E : 0 바이트, 온라인으로 사용해보십시오! 잠깐만 요
— Magic Octopus Urn

14

랜덤 브레인 퍽 , 123 (122) 121 바이트

+[--[<]>>+<-]>+[->+>+>+<<<]++++++++++>>++<[>>[->+<<.>]>[-<+>]>?>+++<[>->+<[>]>[<+>-]<<[<]>-]>-->,<[-<<<+>>>]<<<<+.-<<.>-]

온라인으로 사용해보십시오!

Random Brainfuck은 brainfuck의 확장으로, ?명령을 추가 하여 현재 셀을 임의의 바이트로 설정합니다. 이것은 !재미있게 뱀보다 발자국처럼 보이는 s 로 만든 뱀을 인쇄합니다 .

작동 방식 :

+[--[<]>>+<-]>+ Create the value 30
[->+>+>+<<<]    Copy it three times
++++++++++      Create a newline cell
>>++<            Adds 2 to the second copy to make it a space and move to the counter
[ While counter
  >>[->+<<.>]>[-<+>] Print out the padding cell number of spaces
  ?>+++<[>->+<[>]>[<+>-]<<[<]>-] Get 3-(random byte%3)
  >-->,<[-<<<+>>>]   Add (result-2) to the padding cell
  <<<<+.-<           Print an exclamation mark
  <<.                Print a newline
  >-                 Decrement counter
] end loop

영이 아니라 질문 의 편지 를 고수하는 또 다른 해결책 .

87 바이트

+[--[<]>>+<-]>+[->+>+>+<<<]++++++++++>++>[>[->+<<<.>>]>[-<+>]?[,<+>]?[,<->]<<<+.-<.>>-]

온라인으로 사용해보십시오!

이 패딩은 패딩 만 남겨 두는 방향으로 크게 편향되어 있지만 패딩을 늘리거나 줄일 수 있습니다. 각각은 발생 가능성이 256에서 1보다 약간 작습니다.


아주 좋아요! 나는 ?명령 을 몰랐다 . +1
— Grant Miller

@GrantMiller ?는 고전적인 brainfuck가 아닌 Random Brainfuck 에서만 사용할 수 있습니다
— Jo King

8

C (gcc) , 61 58 56 바이트

규칙 변경 사항을 반영하도록 답변이 수정되었습니다 ...

i;f(s){for(s=i=31;--i;printf("%*d\n",s+=1-rand()%3,8));}

온라인으로 사용해보십시오!


s+=1-rand()%3printf 함수 로 이동하여 바이트를 저장하십시오 . i;f(s){for(s=i=31;--i;)printf("%*c\n",s+=1-rand()%3,43);}
— Vaelus

@Vaelus 첫 번째 줄은 질문에 지정된 30 개 대신 다양한 양의 공백을 갖습니다.
— Steadybox


7

레티 나 , 24 바이트


30* +
-29{¶<`^
 
S,2@1`

온라인으로 사용해보십시오!

설명


30* +

작업 문자열을 첫 줄 (예 : 30 칸 및 a)로 초기화하십시오 +.

-29{¶<`^
 

두 번째 줄에 공백이 있습니다. -29{프로그램의 나머지 부분을 루프로 랩핑하여 29 번 실행됩니다. ¶<후행 줄 바꿈으로 각 루프 반복의 시작 부분에 작업 문자열을 인쇄합니다. 원자 단계 자체는 문자열의 시작 부분에 공백을 삽입합니다 (기본 아이디어는 하나의 공백을 삽입 한 다음 0–2 공백을 임의로 제거하는 것입니다. 삭제, 삽입 및 비 작동 중 임의로 선택하는 것보다 바이트가 짧기 때문입니다).

S,2@1`

이것은 빈 정규 표현식을 입력과 일치시켜 문자 사이의 모든 위치 (문자열의 시작과 끝)를 제공합니다. 그런 다음 ,2처음 세 개의 일치, 즉 0, 1 및 2 공백 이후의 일치 만 유지합니다. @이 세 경기 중 임의의 하나를 선택합니다. 그런 다음 분할 단계 ( S)는 해당 일치 주위의 입력을 분할합니다. 그리고 1분할의 두 번째 부분 만 유지 하도록 지시합니다. 다시 말해, 우리는 모든 것을 우리의 무작위 경기까지 버립니다.

최종 루프 반복의 결과 인 30 번째 줄은 프로그램 끝에서 암시 적으로 인쇄됩니다.


0-2 공백을 제거하는 것보다 짧은 것이 무엇인지 알고 있습니까? 뒤섞인 공간! . 그건 그렇고, 새로운 Retina는 훌륭합니다 : D
— Leo

7

VBA, 60 59 49 바이트

For l=1To 30:?Spc(30+i)"+":i=i+Sgn(Rnd()-.5):Next

직접 실행 창에 붙여넣고 Enter 키를 누르십시오. (명시 적 선언이 해제되어 있는지 확인하십시오!)

멀리 가능성 (즉, 작업이 동등하게 가중되지 않음)하지만 선에 머물보다 이동 지정된 요구 사항이 아니었다 그 (다행히!)

{EDIT} 와 사이의 공백을 제거하여 1 바이트를 절약했습니다.=1To

{EDIT2} 저장은 10 개 remoel의 의견 바이트 덕분에

이전 버전 :

'V1
i=30:For l=1 To 30:?String(i," ")&"+":i=i+Sgn(Rnd()-.5):Next
'V2
i=30:For l=1To 30:?String(i," ")&"+":i=i+Sgn(Rnd()-.5):Next

5
PPCG에 오신 것을 환영합니다!
— Martin Ender

2
당신은 대체하여 몇 바이트를 저장할 수 있습니다 String(i," ")으로 Spc(30+i)다음 제거 i=30:. 또는 -1 바이트를 제거하여 &. :)
— remoel

7

C # (.NET 코어) 112 110 106 100 99 98 바이트

v=>{var r="";for(int t=30,i=t;i-->0;r+="+\n".PadLeft(t+=new System.Random().Next(3)-1));return r;}

@raznagul 덕분에 -1 바이트 . @auhmaan
덕분에 -1 바이트 .

설명:

온라인으로 사용해보십시오.

v=>{                      // Method with empty unused parameter and no return-type
  var r="";               //  Result-string, starting empty
  for(int t=30,           //  Temp-integer, starting at 30
      i=t;i-->0;          //  Loop 30 times
    r+=                   //   Append the result-String with:
       "+\n"              //    The character and a new-line,
            .PadLeft(     //    left-padded with `t` spaces,
                     t+=new System.Random().Next(3)-1));
                          //    after `t` first has been changed with -1, 0, or 1 randomly
  return r;}              //  Return the result-string

한 가지 이상한 점 : new Random().Next()로컬에서 여러 번 호출 하면 (.net Framework 버전 4.6.1) 항상 동일한 결과를 얻습니다. Thread.Sleep(10)다른 결과를 안정적으로 얻으려면 호출 사이에 통화 를 추가해야합니다 . 수면 시간이 10ms 미만인 경우에도 여전히 동일한 결과를 얻습니다. 따라서 .net-Framework과 TIO (.net-Core)는 다른 PRNG를 갖거나 최소한 다른 시드를 사용합니다. TIO의 프로그램을 C # -mono로 전환하면 .net-Framework에서 로컬로 얻는 것과 동일한 동작을 얻습니다.
— raznagul

흠 @raznagul와 그 출력 C 번호 (모노 C # 컴파일러) 참 이상한 ..
— 케빈 Cruijssen

3
@raznagul new Random()은 시간을 씨앗으로 사용하므로 긴밀한 루프에서 시간은 동일하므로 결과는 동일합니다.
— TheLethalCoder

@ TheLethalCoder : 그렇습니다. 이상한 점은 1) .net-Core (적어도 TIO)는 다르게 동작한다는 것입니다. 2) Thread.Sleep(10)다른 결과를 얻 Thread.Sleep(1)거나 9ms로 충분하지 않다는 것.
— raznagul

@raznagul 1, 9 또는 10ms 동안 자고 있으면 다른 프로세스 실행에 따라 같은 시간 동안 모두 자야합니다.
— TheLethalCoder

7

C, 56 바이트

n;f(p){n>29?n=0:f(printf("%*d\n",n++?p-rand()%3:31,0));}

온라인으로 사용해보십시오!

설명:

n; // As a global variable, n is initialized to zero.
f(p)
{
    // Call the function recursively until n > 29.
    n > 29

        // At the end, set n back to zero.
        ? n=0

        // On the first iteration, n == 0 and p has an indeterminate value.
        // 'n++ ? p-rand()%3 : 31' returns 31 (without reading p), and thus
        // 30 spaces get printed. printf() returns the number of characters
        // printed, 32 (30 spaces + '0' + '\n').
        //    On subsequent iterations, p has the value the previous printf
        // call returned, which is the padding on last iteration + 2. Also,
        // n > 0, so the same expression now returns p-rand()%3, and thus
        // the padding changes either by -1, 0, or 1 spaces. The function
        // is again called with the value of the current line's padding + 2.
        : f(printf("%*d\n", n++ ? p-rand()%3 : 31, 0));
}

C (gcc) , 55 바이트

n;f(p){n=n<30&&f(printf("%*d\n",n++?p-rand()%3:31,0));}

에 따라 다름 F 에 할당 된 값 "반환" N 정의되지 않은 동작이지만, 더 최적화가 활성화되지 않은 경우 GCC와 함께 지속적으로 작동하는 기능에 있습니다.

온라인으로 사용해보십시오!


6

자바 스크립트 (ES8), 63 62 60 바이트

후행 줄 바꿈을 포함합니다. 1 바이트 절약 *2-1을 -.5위해 대체 할 수 있지만 각 줄이 이전 줄과 동일한 길이 일 가능성이 크게 증가합니다. 물론 "랜덤"이 챌린지에 정의되어 있지 않기 때문에 RNG 는 총 바이트 수 55 로 대체 될 수 있습니다 .new Date%3-1

f=(x=y=30)=>x?``.padEnd(y+=Math.random()*2-1)+`+
`+f(--x):``

내가 이름을 붙잡기 전에 의견을 삭제 한 사람 덕분에 바이트를 절약했습니다. 나는 실제로 그것을이 방법을 시도 것 repeat하고 padStart만하려고 생각하지 않았다 padEnd- 왜 몰라!


보너스

동일한 바이트 수의 경우 시작 공간 및 반복 수를 입력으로 사용하는 버전이 있습니다.

f=(x,y=x)=>x?``.padEnd(y)+`+
`+f(--x,y+Math.random()*2-1):``


f=(x=y=30)=>x?`+\n`.padStart(y+=Math.random()*2-1)+f(--x):``1 바이트 더 짧습니다. (참고 : SO는 주석에 줄 바꿈을 허용하지 않으므로 실제로 줄 바꿈을 사용하는 대신 \ n을 입력해야했습니다.)
— Stefnotch

감사합니다, @Stefnotch. 불행히도 초기 값이조차도 y=31첫 번째 줄이 너무 짧을 수 있습니다. tio.run/##BcFLDsIgEADQvSeZkUCs7kzQE7hyqSYzKfRjKBCYGHp6fO/…
— 얽히고 설킨

1
내가 틀렸다면 바로 수정하지만 현재 솔루션으로도 문제가 발생하지 않습니까?
— Stefnotch

1
도전 과제에 따르면 첫 번째 줄에는 정확히 30 칸 이 있어야 합니다 .
— Nit

1
@Nit, OP는 첫 번째 줄에 29-31 개의 공백 이 포함될 수 있음을 확인 했지만 반복 요청이 있었음에도 불구하고 그 사실을 도전으로 편집하지 않았습니다.
— 얽히고 설킨

6

자바 8, 89 87 바이트

첫 골프, 훨씬 나아질 거라 확신합니다 ..

편집 : Steadybox 덕분에 첫 번째 줄이 수정 되었습니다 .

l->{for(int a=31,b=a;--a>0;){System.out.printf("%"+b+"c\n",'+');b+=2-Math.random()*3;}}

온라인으로 사용해보십시오!

 l->{                                           //Begin lambda
    for(int a=31,b=a;--a>0;)                  //Initialise vars, loop through 30 lines
    {
        System.out.printf("%"+b+"c\n",'+');     //Print result
        b+=2-Math.random()*3;                   //Change padding by -1, 0, or 1
    }

5
PPCG에 오신 것을 환영합니다! :)
— 얽히고 설킨


6

파이썬 2 , 83 65 64 바이트

간단한 접근 방식 :

import os
k=30
exec"print' '*k+'+';k+=ord(os.urandom(1))%3-1;"*k

온라인으로 사용해보십시오!

바이트를 저장해 주신 @Rod에게 감사드립니다! -1 바이트에 대한 @ovs 덕분에!

편집 : 변수 이름과 출력 문자열을 문자 's'로 변경

88 바이트에 대한 더 많은 뱀형 출력 :

from random import*
s=[30,0]
exec"print' '*sum(s)+'(S)'[s[-1]+1];s+=[randint(-1,1)];"*30

1
나는 이것을 좋아한다. 정말 깔끔한 솔루션.
— linemade


5

숯 , 14 바이트

× ³⁰F³⁰«↙+M‽³→

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

× ³⁰            Print 30 spaces (forces the desired indentation)
    F³⁰«        Repeat 30 times
        ↙+      Print a `+` and move down and left one square
          M‽³→  Move right a random number of squares from 0 to 2

초기 들여 쓰기 요구 사항이 없으면 10 바이트 만됩니다.


@KevinCruijssen Hmm, Charcoal은 기본적으로 트림을 좋아하기 때문에 어색합니다.
— Neil

5

PHP, 61 바이트

for($p=32;$i<30;$i++)echo str_pad("+
",$p+=rand(-1,1),' ',0);

온라인으로 사용해보십시오!


8
$i<30;$i++$i++<30;2 바이트를 절약 할 수 있습니다 .
— 케빈 크루이 ssen

2
55 바이트 : for($p=30;$i++<30;$p+=rand(-1,1))printf("%{$p}s\n",'+');( \n1 문자로 계산되며 실제 줄 바꿈으로 대체되어야 함)
— Ismael Miguel

2
경고없이 55 바이트 길이의 대안 :for($i=$p=30;$i--;$p+=rand(-1,1))printf("%{$p}s\n",'+');
— Ismael Miguel

5

자바 (8) 131 129 127 126 119 108 101 바이트

v->{String r="";for(int i=30,j,t=i;i-->0;r+="+\n")for(j=t+=Math.random()*3-1;j-->0;r+=" ");return r;}

설명:

온라인으로 사용해보십시오.

v->{                     // Method with empty unused parameter and String return-type
  String r="";           //  Result-String, starting empty
  for(int i=30,j,t=i;    //  Two index integers, and a temp integer (starting at 30)
      i-->0;             //  Loop 30 times:
      r+="+\n")          //    After every iteration: Append the character and a new-line
    for(j=t+=Math.random()*3-1;
                         //   Change `t` with -1, 0, or 1 randomly
        j-->0;r+=" ");   //    And append that many spaces to the result-String
  return r;}             //  Return the result-String

이전 119 바이트 답변 :

v->{String s="",r=s;int i=90,t=30;for(;i-->t;s+=" ");for(;i-->0;t+=Math.random()*3-1)r+=s.substring(t)+"+\n";return r;}

설명:

온라인으로 사용해보십시오.

v->{                      // Method with empty unused parameter and String return-type
  String s="",            //  Temp-String, starting empty
         r=s;             //  Result-String, starting empty
  int i=90,t=30;          //  Temp integer, starting at 30
  for(;i-->t;s+=" ");     //  Fill the temp String with 60 spaces
  for(;i-->0;             //  Loop 30 times:
      t+=Math.random()*3-1//    After every iteration: Change `t` with -1, 0, or 1 randomly
    r+=s.substring(t)     //   Append the result with `60-t` amount of spaces
       +"+\n";            //   + the character and a new-line
  return r;}              //  Return the result-String

4

R , 72 69 67 바이트

cat(sprintf(paste0("% ",cumsum(c(30,sample(3,29,T)-2)),"s"),"+\n"))

2 바이트 추가 로 Zahiro Mor 에게 감사 합니다!

온라인으로 사용해보십시오!


에서 sample(3,29,T)-2로 전환 runif(29,-1,1)하면 바이트 수가 2 감소하지만 더 이상 이동이 동일하지 않을 수 있습니다. 그리고 paste("%"대신에 전환 할 수 paste0("% "있습니까? 아니면 여기서 뭔가를 놓치고 있습니까?
— Rift

붙여 넣기를 사용하는 경우 @Rift 결과 문자열은 % 30 s대신 형식이 됩니다 % 30s. 당신이 말했듯 runif이 아기를 엉망으로 만들 것입니다.
— plannapus

로컬 sprintf("%30s"), sprintf("% 30s")그리고 sprintf("% 30 s")나를 위해 동일한 결과를 반환합니다. 그러나 TIO에서는 처음 두 개만 동일한 결과를 가지므로 paste0("%"바이트를 저장해야합니다. 그리고 모든 움직임이 같은 확률을 가질 필요는 없습니다.
— Rift

4

Japt , 13 바이트

행 배열을 반환합니다.

30ÆQù1nH±1n3ö

그것을 테스트


설명

30Æ               :Create the range [0,30) and pass each through a function
   Q              :  The " character
    ù             :  Pad start to length...
           3ö     :    Random element from the range [0,3)
         1n       :    Subtract 1
       H±         :    Add the result of that to H (inititally 32)
     1n           :    Subtract 1 to avoid the possibility of the first line being 33 characters long in total

보너스

2 바이트 이하 의 경우 시작 공간 및 반복 횟수를 입력으로 사용하는 버전이 있습니다.

U°ÆQùU±1n3ö

시도 해봐


대체 RNG

마지막 4 바이트는 다음 중 하나로 대체 될 수 있습니다.

MrJ1     :A random float between -1 and 1
Jõ ö     :Generate the range [-1,1] and return a random element
3ö É     :An alternative way of writing the method used above
½nMr     :0.5 subtracted from a random float between 0 and 1

1
와우, 우리가 지금이기는 걸 믿을 수 없어! 이것 으로 바이트를 절약 할 수 있다고 생각합니다 (모바일에서 실제로 확인할 수는 없습니다)
— ETHproductions

@ETHproductions : 하! 그것은 내가 처음 시작한 것과 동일합니다. 그러나 문제는 -1첫 번째 반복에서 RNG가 반환하면 총 줄 길이 29가 30, 31또는 이어야합니다 32.
— 얽히고 설킨

흠, 나는 당신의 버전이 어떻게 돌아가는지 혼란 스럽습니다 ... 또한, OP는 초기 반복에서 여분의 공간이 제거되거나 추가되는지에 대해서는 신경 쓰지 않는다는 의견에서 명확하게 생각합니다.
— ETHproductions

실제로 나는 "30, 31, 또는 32 여야 할 때"에 혼란을 느낍니다. 어디에 필요한가?
— ETHproductions

@ETHproductions : 우리는 시작 30후 추가 -1, 0또는 1우리를주고 29, 30 또는 31-를 추가 "하고이 우리의 총 길이를 제공 30, 31또는 32첫 번째 줄에.
— 얽히고 설킨

4

스위프트 , 101 바이트

import UIKit
var g=29;for _ in 0...g{print((0..<g).map{_ in" "}.joined(),0);g+=Int(arc4random()%3)-1}

설명

전체 프로그램. 이것은 다소 이상한 트릭을 사용합니다 : 모듈 arc4random()의 멤버 Darwin이지만 UIKit이 기능이 설치되어 제공되므로 바이트를 절약 할 수 있습니다 :) 또한 Swift 골프 팁 중 하나를 사용 하여 문자열을 임의의 횟수만큼 반복합니다.

import UIKit        // Imports the UIKit module, necessary for the RNG.
var g=29;           // Declares an integer variable g by assigning it to 30.
for _ in 0 ... g {  // Execute the code block 30 times (for each integer in [0; g]):
 print(             // Output the following:
  (0..<g).map       // For each integer in [0; g)...
   {_ in" "}        // ... return a literal space character. 
    .joined()       // ... And join the result to a single string.
             ,0     // Also print a "0" preceded by a single space (g starts from 29).
 );
g+=                 // Increment the variable g by...
   arc4random()%3   // ... A random integer, modulo 3...
   Int(...)-1       // ... Casted to an integer (yes, this is needed!) and decremented.
}

for _ in 0 ... g코드 블록을 30 대신 30 번 실행 하지 마십시오 (0에서 29까지 루프 제외)?
— Kevin Cruijssen

@KevinCruijssen 없음은 0...g모든 정수 생성 [0; g] . 내 나쁜 설명을 수정했습니다. 0..<g정수의 생성 것이다 [0; g) : P
— Mr. Xcoder

아, [0; g)당신은 [0; g]저를 혼란스럽게 편집했습니다 . :) 흠, 그러나이 경우 시작 g=30하고 반복 할 수 [1; g]없습니까?
— Kevin Cruijssen

@KevinCruijssen 루핑 중 하나를 선택 [0; g)하거나 대신 [1; g]선택하면 가능 g=30하지만 추가 (극한) 공간이 0 앞에 추가되기 때문에 print(...,0)로 변경해야합니다 print(...+"0"). 어느 쪽이든, 바이트 수는 동일하게 유지됩니다.
— Mr. Xcoder

4

펄, 36 바이트

perl -E '$#a=29;map{$#a+=rand(3)-say"@a -"}@a'

너무 좋아 나는 항상 당신이 그런 식으로 배열 길이를 설정할 수 있다는 것을 잊어 버리고 say뺄셈에 사용 합니다. 그것이 참조가 아니기 $#a때문에 증가 할 때 실행 횟수를 변경하지 않는다고 생각하는 것이 맞 습니까?
— Dom Hastings

@ DomHastings : map스택에 요소를 먼저 배치하는 것으로 사용하기 때문 입니다. for그리고 예측할 수없는 루프 길이했을 것하지 않습니다
— 톤 Hospel

정말 유용합니다. 감사!
— Dom Hastings

좋은 골프. 로 다른 바이트를 제거하려고 perl -E 'map{$#a+=rand(3)-say"@a -"}@a=1..30'했지만 때로는 (매번은 아니지만) 세그먼트 오류가 발생했습니다. Perl v5.22.1 및 v5.16.3의 버그 일 수 있습니까?
— Kjetil S.

@Kjetil 그렇습니다. 아마 수정되지 않는 잘 알려진 문제입니다. 배열을 루핑 할 때 항목은 추가 참조 횟수를 얻지 않으므로 항목을 삭제하면 루프가 항목에 도달 할 때 해제되고 해제 된 메모리에 도달합니다. 다행히도 실제 프로그램에서는이 작업을 수행하지 않습니다.
— Ton Hospel

4

아르 자형, 54 53 바이트

cat(sprintf('
%*s',cumsum(c(30,sample(3,29,T)-2)),0))

위와 비슷한 아이디어 이지만 sprintf코드가 짧고 문자열 리터럴이 짧습니다. \n(2 바이트) 대신 리터럴 줄 바꿈 (1 바이트)을 사용하고 있습니다.

Try it online!


A field width or precision (but not both) may be indicated by an asterisk *: in this case an argument specifies the desired number. 나는 sprintf수년간 사용해 왔으며 어떻게 든 항상 그 부분을 놓쳤습니다 ... 미리 알림 주셔서 감사합니다!
— plannapus

1
두 번째 줄은 때때로 한 개가 아닌 두 개의 공백으로 들여 쓰기됩니다.
— Scott Milner

@ScottMilner 고칠 시간이있었습니다.
— Konrad Rudolph

4

루비 , 45 39 바이트

x=30
x.times{puts' '*(x+=rand(3)-1)+?S}

온라인으로 사용해보십시오!

x루프 도중 수정 해도 루프 카운터에는 영향을 미치지 않습니다. 나는 특히 뱀 같은 출력 문자로 S를 선택했습니다.

-6 바이트 : rand(3)-1대신 사용하십시오 [-1,0,1].sample. 고마워, Eric Duminil !


x.map대신에 x.times리턴 값을 사용하지 않기 때문에 2 바이트를 절약 할 수 있습니다.
— RJHunter

1
죄송합니다. 저를 무시하십시오!
— RJHunter

1
좋아, 나는 더 좋은 것을 얻었다 : rand -1..15 바이트보다 짧다[-1,0,1].sample
— RJHunter

1
@RJHunter : 또는 rand(3)-16 바이트 미만.
— Eric Duminil

1
(x=30).times{puts' '*x+?+;x+=rand(3)-1}(동일한 크기) 챌린지 요청에 따라 뱀 머리에 정확히 30 칸을 인쇄합니다
— Asone Tuhid

4

SenseTalk , 237 198 바이트

이것은 내가 십 년 전에 알고 사랑했던 언어입니다. 자동화 된 테스트 도구 인 Eggplant Functional 을 구동하는 것은 스크립팅 언어입니다 . 한동안 회사에 합류하기 전에 수년간 도구를 열렬히 사용했습니다. 골프를 할 수있는 가장 언어는 아니지만 글을 쓰는 것이 매우 즐겁습니다. 골프는 언어가 장황하고 영어로되어 있기 때문에 상당히 어려워요. 237 바이트

set s to "                              +"&lf
set p to s
repeat 30
set a to random(0,2)
if a equals 0
delete first char of p
else if a equals 1
put " " before p
end if
put p after s
end repeat
put s

언 골프 / 설명

set the_snake to "                              +"&lf #assign the first line of the snake
set previous_line to the_snake                        #set up for the loop

repeat 30 times                                       #loop 30x
    set action to random(0,2)                         #random add/subtract/stay the same

    if action equals 0
        delete the first character of previous_line   #SenseTalk really shines at string manipulation
    else if action equals 1
        put " " before previous_line                  #insert a character at the beginning
    end if

    put previous_line after the_snake                 #plop the new segment into the string
end repeat                                            #close the loop

put the_snake                                         #print to standard out

편집 : @ mustachemoses 덕분에 36 바이트를 절약했습니다.


1
공백이 필요합니까?
— MustacheMoses

나는 이것을 존중합니다. 특히 읽을 수는 없지만 짧은 '골프 언어'의 배경에 반합니다. 당신이 당신의 언어로 할 수있는 일을 보여주는 예를 갖는 것이 좋습니다.
— AJFaraday

1
@MustacheMoses 님, 안녕하세요! 업데이트되었습니다.
— Allen Fisher

I합니다 (userscript 카운트 많은 잘) 198 바이트를 계산
— HyperNeutrino

@AllenFisher 당신은 가지 데모를 얻지 않고 사용할 수있는이 언어를위한 독립형 인터프리터 또는 컴파일러가 있습니까?
— MustacheMoses


3

PowerShell , 42 바이트

1..($l=30)|%{" "*$l+"x";$l+=-1,0,1|Random}

온라인으로 사용해보십시오!

에서 1로 반복 합니다 $l=30. 반복 할 때마다 우리는 넣어 $l공간 플러스를 x문자열로 파이프 라인에 다음 +=중 하나의 -1, 0, 1를 기반 Get-Random으로 $l다음 루프. 이러한 문자열은 파이프 라인에서 수집되며 암시 적 Write-Output으로 줄 바꿈으로 구분 된 목록을 무료로 제공합니다.



3

젤리 , 18 바이트

1ŒRX+
30ǒС⁶ẋ;€0Y

온라인으로 사용해보십시오!

선택한 문자는 0 입니다. 문자 목록을 리턴하는 것이 허용되면, 파일을 Y삭제하고 제출을 17 바이트 의 닐라 딕 체인으로 만들 수 있습니다 . 대안 .

작동 원리

30Ç'С⁶ẋ; € 0Y | 닐라 딕 메인 링크.
30 | 30에서 시작 ...
  Ç'С | ... 헬퍼 링크를 29 회 반복하고 결과를 목록으로 수집하십시오.
             | (이 목록에는 처음 30 개가 포함되므로 실제로 30 개 숫자가 있습니다).
      ⁶ẋ | 목록의 각 항목에 대해 공백을 여러 번 반복하십시오.
        ; € 0 | 각각에 0을 추가하십시오.
           Y | 그리고 개행으로 가입하십시오.
------------- +
1ŒRX + | 수도원 도우미 링크. 또는 Ç 대신 µ1ŒRX + µ를 사용할 수 있습니다.
1 | 문자 그대로.
 ŒR | –1에서 1까지의 대칭 범위
   X + | 그 안에 임의의 숫자를 선택하여 인수에 추가하십시오.

젤리 , 16 바이트

내, Erik과 Jonathan의 솔루션을 결합하여 16 바이트까지 골프를 낼 수 있습니다. 선택한 문자는 1 입니다.

’r‘X
30ǒСṬ€o⁶Y

온라인으로 사용해보십시오!

헤드 업을 한 Jonathan Allan에게 감사합니다 Ṭ€o⁶.


당신은 18 세가 아닌 18 세 Ṭ€o⁶대신에 ⁶ẋ;€017 세로 내려갈 수 있습니다.
— Jonathan Allan

@JonathanAllan 감사합니다! 세 가지 젤리 답변을 결합하면 실제로 16 바이트가 생겼습니다. 그러나 나는 그것이 내 것이 아니기 때문에 보조 솔루션으로 게시했습니다. :-)
— Mr. Xcoder

3

옥타브 , 53 51 50 49 바이트

printf('%*d\n',[a=31+cumsum(randi(3,1,30)-2);~a])

온라인으로 사용해보십시오!

더 이상 루핑을 수행하지 않고 1 바이트를 절약했습니다. Octave printf뿐만 아니라 다른 사람을 저장 했습니다 fprintf.

이 새로운 코드는 30 개의 임의의 정수 배열을 만듭니다 -1:1. 그런 다음 누적 배열을 합산하고 30을 더하여 원하는 시퀀스를 제공합니다.

결과는 fprintf"지정된 너비로 채워진 10 진수, 그 다음에 새 줄이있는 형식으로 인쇄 됩니다. 너비는 첫 번째 값이 입력되고 10 진수는 두 번째 값이 입력됩니다. 옥타브는 원하는 출력을 얻기 위해 자동으로 인쇄를 반복합니다.

루핑을 달성하려면 시퀀스 배열 사이에 0을 인터리브해야하므로 fprintf함수는 시퀀스의 각 값을 너비로 사용하고 각 0을 인쇄 할 숫자로 사용합니다.

다음과 같은 출력을 인쇄합니다.

                              0
                             0
                              0
                             0
                              0
                               0
                              0
                               0
                              0
                              0
                             0
                            0
                           0
                           0
                           0
                          0
                           0
                            0
                             0
                              0
                              0
                             0
                             0
                              0
                               0
                              0
                              0
                               0
                               0
                                0

위 코드는 항상 첫 줄에 정확히 30 칸을 인쇄하지는 않습니다. 이 값은 29, 30 또는 31입니다.이를 정정하려면 다음 53 바이트 버전을 사용하십시오.

x=31;for i=2:x;fprintf('%*d\n',x,0);x+=randi(3)-2;end

다음 두 바이트를 저장할 수 있습니다x=31;for i=2:x;fprintf('%*d\n',x+=randi(3)-2,0);end
— 케빈 Cruijssen

@KevinCruijssen 그것에 대해 생각했지만 작동하지 않습니다. 첫 번째 줄은 29, 30 또는 31 개의 공백으로 시작합니다.
— 톰 카펜터

1
사실 @KevinCruijssen은 신경 쓰지 않습니다. 방금 OP 의견이 허용된다는 것을 알았습니다.
— Tom Carpenter

네. 규칙에 대한 언급이 약간 성가시다 (특히 현재 도전 설명과 모순되기 때문에.). 나는 OP가 의견에 허용하는 것처럼 보이기 때문에 29, 30 또는 31로 시작할 수 있도록 도전 과제를 편집하도록 요청했습니다.
— 케빈 크루이 ssen

3

루아, 81 75 바이트

n=30;for i=1,n do print(("%-"..n.."s+"):format(" "))n=n-2+math.random(3)end

에서 to_exp 한 바이트를 저장 만 루프에 들어가기 전에 한 번 평가됩니다.for i=1,n ... n

@ user202729 덕분에 -6

온라인으로 사용해보십시오!


1
PPCG에 오신 것을 환영합니다! 사람들이 프로그램을 더 쉽게 테스트 할 수 있도록 게시물에 TIO 링크를 추가 할 수 있습니다.
— user202729

답을 76 바이트 까지 골라 낼 수 있습니다 . 페이지 외에도 Lua에서의 골프 팁 이 유용 할 수 있습니다.
— user202729


3

파이썬 3.6 , 84 73 69 바이트

from random import*
x=30
exec("print(' '*x+'+');x+=randint(-1,1);"*x)

-11 바이트의 @WheatWizard에게 감사합니다. -4 바이트에 대한 @JoKing 덕분입니다.


결국 사용하지 않기 때문에 대신 바이트를 절약 i할 수 있습니다 for i in[1]*30.
— 밀 마법사

나중에 from random import*필요하지 않도록 할 수도 있습니다 random.. 그리고 이후에 줄 바꿈 공간을 제거 할 수 있습니다 :.
— 밀 마법사

변경할 경우 30에 로 대체 할 수있다 . 29"+".rjust(x)" "*x+"+"
— 밀 마법사

실제로 내 마지막 의견에 관해서는 29 공백이 아닌 30 공백이어야합니다. 현재 답변은 29 공백 만 넣으므로 사양을 충족시키지 못합니다. 이것은 30에서 31로 변경함으로써 고칠 수 있습니다.
— 밀 마법사

1
@WheatWizard 감사합니다! 변경 사항을 추가하고 크레딧을 제공했습니다. 1 바이트 더 짧아서로 변경 [1]*30했습니다 [1]*x.
— MustacheMoses

3

ES5, 97 95 81 바이트

for(p=i=30;i--;)console.log(Array(p).join(" ",r=Math.random()*3|0,p+=r>1?-1:r)+0)

ES5, 112함수 형식이 필요한 경우 98 바이트 :

function a(){for(p=i=30;i--;)console.log(Array(p).join(" ",r=Math.random()*3|0,p+=r>1?-1:r)+0)}a()


2
PPCG에 오신 것을 환영합니다! 변수 안에서 함수 안에서 선언해야한다고 생각합니다 –_=>{p=30;for(i=0;i<p;i++){console.log(Array(p).join(" ")+"+\n");r=~~(Math.random()*3);p+=r==2?-1:r}}
— Oliver

그것은 바이트를 죽일 것입니다. ES5는 기본적으로 화살표 기능을 포함하지 않습니다. 업데이트하겠습니다
— Kyle Fairns

@Oliver, 기능 형식 : 추가
— 카일 Fairns에게

좋은! 이 도입되었을 때 잘 모르겠어요,하지만 난 당신이 바꿀 수 있다고 생각 join(" ")과join` `
— 올리버

@Oliver ES5에서 그렇게 할 수 있을지 모르겠습니다. ES6에 템플릿 리터럴이 추가되었다고 생각 했습니까?
— Kyle Fairns

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.