코드 골프 : 자신의 애완 동물 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가 반환하면 총 줄 길이 2930, 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.