변화하는 점


16

프로그램은 여러 개의 공백을 인쇄 한 다음 점과 줄 바꾸기를 인쇄해야합니다. 공백의 개수는 0 <x <30으로 정의 된 점의 x 위치입니다.

모든 새로운 라인은 차례입니다. 당신의 프로그램은 30 턴 동안 실행됩니다. 프로그램은 임의의 x 위치에서 시작하며 모든 회전은 정의 된 영역 내에 머무르면서이 위치를 왼쪽 또는 오른쪽으로 1 씩 임의로 이동합니다. 매 턴마다 점의 위치가 1 씩 바뀌어야합니다.

당신의 점수는 문자 수입니다. 모든 인쇄 된 줄이 정확히 30 자 (및 줄 바꿈)로 구성된 경우 10 개의 보너스 포인트가 제공됩니다. 무작위로 프로그램이 정의 된 영역의 중간에 머무르는 경우 50 보너스 포인트를 얻습니다.

편집 : 50 보너스 포인트는 중간에 점을 당기기위한 것입니다. 예를 들어, 점이 x = 20에 있고 왼쪽으로 66 %, 오른쪽으로 33 %의 기회가있는 경우에 적용됩니다. 이것은 시작점과 독립적이어야하며 왼쪽 / 오른쪽의 백분율 값을 동적으로 변경해야만 발생합니다.

어떤 종류의 입력도 허용되지 않습니다. 출력은 실행 콘솔에 있어야합니다!

이해를 돕기 위해 Java로 읽을 수있는 예제가 있습니다. 점수는 723입니다.

public class DotJumper{
    public static void main(String[] args){
        int i = (int)(Math.random()*30);
        int max = 29;
        int step = 1;
        int count = 30;
        while(count>0){
            if(i<=1){
                i+=step;
            }else if(i>=max){
                i-=step;
            }else{
                if(Math.random() > 0.5){
                    i+=step;
                }else{
                    i-=step;
                }
            }
            print(i);
            count--;
        }
    }
    public static void print(int i){
        while(i>0){
            System.out.print(' ');
            i--;
        }
        System.out.println('.');
    }
}

귀하의 예에서, 나는 대신 int i = (int)(Math.random()*30);해야 한다고 생각합니다 int i = 1 + (int)(Math.random()*29);. 있는 그대로, 0 >= x > 30대신 숫자 를 생성합니다 0 > x > 30.
Victor Stafusa

원래 코드가 정확하다고 생각합니다.
user2846289

내가 먼저 이동하고 인쇄하기 때문에 정확합니다. 따라서 임의의 값이 테두리를 초과하더라도 먼저 수정하고 인쇄합니다.
reggaemuffin

@Kostronor 그러나 이것은 시작점 위치가 균일 한 분포를 따르지 않는다는 것을 의미합니다. 첫 번째 위치는 다른 위치보다 두 배입니다. 균일하게 분배되는 OTOH도 요구 사항이 아닙니다.
Victor Stafusa

점이 더 많이 점프하는 프로그램을 만드는 것이 더 어려워 보입니다. 운동을 제한하는 데 왜 보너스가 있습니까?
Chris Laplante

답변:


18

APL, 39 – 10 – 50 = –21

0/{⎕←30↑'.',⍨⍵↑''⋄⍵+¯1*⍵>.5+?28}/31/?29

와 Dyalog에서 테스트 ⎕IO←1하고 ⎕ML←3있지만, 매우 휴대용해야합니다.

설명

                   ?29  take a random natural from 1 to 29
                31/     repeat it 31 times
              }/        reduce (right-fold) the list using the given function:
          ⍵↑''          . make a string of ⍵ (the function argument) spaces
     '.',⍨              . append a dot to its right
⎕←30↑                   . right-pad it with spaces up to length 30 and output
                ◇       . then
             ?28        . take a random natural from 1 to 28
          .5+           . add 0.5, giving a number ∊ (1.5 2.5 ... 27.5 28.5)
        ⍵>              . check whether the result is <⍵ (see explanation below)
     ¯1*                . raise -1 to the boolean result (0 1 become resp. 1 -1)
   ⍵+                   . add it to ⍵ and return it as the new accumulator value
0/{                     finally ignore the numeric result of the reduction

모든 단계에서이 코드는 (1.5 2.5 ... 27.5 28.5) 중에서 선택한 난수가 현재 도트 위치보다 작을 확률에 따라 도트를 왼쪽 또는 오른쪽으로 이동할지 여부를 결정합니다.

따라서 현재 점 위치 (왼쪽의 공백 수)가 1 인 경우 증가는 항상 +1 (모든 숫자 1.5 ... 28.5는> 1)이며 29 일 때 항상 -1 (모든 숫자) <29)이고; 그렇지 않으면 +1과 -1 사이에서 무작위로 선택되며 이러한 극단 사이의 선형 보간 가능성이 있습니다. 따라서 점은 항상 움직이고 항상 측면을 향한 것보다 중심을 향해 이동할 가능성이 높습니다. 정확히 중간에 있다면 50 % 확률로 양쪽으로 이동할 수 있습니다.

복제 된 값의 축소 (오른쪽 접음)는 값 {...}/a/b으로 a-1시작하고 b각 반복의 결과가 다음에 대한 누산기 ( ) 인수가되도록 함수 시간 을 반복하기 위해 만든 트릭 입니다. 두 번째 및 다음 입력 인수 ( )와 최종 결과는 무시됩니다. 경비원의 정기적 재귀 호출보다 훨씬 짧습니다.

예제 실행

0/{⎕←30↑'.',⍨⍵↑''⋄⍵+¯1*⍵>.5+?28}/31/?29
                   .          
                    .         
                   .          
                  .           
                 .            
                .             
               .              
                .             
               .              
                .             
               .              
              .               
             .                
              .               
             .                
              .               
               .              
              .               
               .              
                .             
                 .            
                  .           
                 .            
                  .           
                 .            
                  .           
                 .            
                .             
               .              
                .             

apl은 골프를위한 훌륭한 언어입니다. 쪽으로!
blabla999

@ blabla999 APL에는 많은 공통 기호와 이상한 기호가 있지만 일단 기능을 익힌 후에는 언어를 읽고 쓰기가 쉽습니다. ASCII가 '골프'언어의 ASCII 노이즈보다 확실히 쉽지만 일반 언어보다 훨씬 쉽다고 말하고 싶습니다. 구문은 매우 규칙적이며 규칙은 하나뿐입니다. 표현식은 오른쪽에서 왼쪽으로 실행되므로 왼쪽에서 오른쪽으로 읽을 수 있습니다.+/2×⍳9 "합계 : 두 번 : 최대 9까지"읽음 반대 방식으로 실행됩니다.
Tobia

나 또는 한 줄에 31 문자가 있습니까?
Gusdor

위의 예제에서 실행 한 줄을 편집기에 복사하여 붙여 넣고 코드를 다시 확인하여 30을 얻습니다. ⎕←30↑...문자열이 무엇이든 상관없이 30 자 및 줄 바꿈을 인쇄합니다....
Tobia

12

Mathematica 138-10-50 = 78

골프를 잘하는 것으로 생각되기 때문에 이것을 게시하지는 않지만 다른 이유가 있습니다. 공이 "중심"이되도록 설계된 전이 행렬과 함께 Markov Process 정의를 사용합니다 .

Mathematica에서 Markov 프로세스를 사용하면 아래에서 볼 수 있듯이 유용한 통계를 계산할 수 있습니다.

먼저 코드 (공백이 필요하지 않음) :

r = Range@28/28;
s = DiagonalMatrix;
ListPlot[RandomFunction[DiscreteMarkovProcess[RandomInteger@#, r~ s ~ -1 + s[29/28- r, 1]], 
                                              #], PlotRange -> #] &@{1, 29}

일부 출력 :

Mathematica graphics

내가 사용한 전환 행렬은 다음과 같습니다.

MatrixPlot[s[r, -1] + s[29/28 - r, 1]]

Mathematica graphics

그러나 내가 말했듯이, 흥미로운 부분은 사용 DiscreteMarkovProcess[]하면 현재 상황에 대한 좋은 그림을 얻을 수 있다는 것입니다.

15언제든지 볼이있을 확률을 보자t 임의의 무작위 상태에서 시작될 :

d = DiscreteMarkovProcess[RandomInteger@29, s[r, -1] + s[29/28 - r, 1]];
k[t_] := Probability[x[t] == 15, x \[Distributed] d]
ListLinePlot[Table[k[t], {t, 0, 50}], PlotRange -> All]

Mathematica graphics

시작 상태에 따라 홀수 또는 짝수 단계에서만 15에 도달 할 수 있기 때문에 0과 0.3 근처의 값 사이에서 변동하는 것을 볼 수 있습니다.

이제 동일한 작업을 수행 할 수 있지만 Mathematica에 가능한 모든 초기 상태에서 시작하는 통계를 고려하도록 지시합니다. 15시간이 지나면 확률은 얼마 입니까?t 입니까? :

d = DiscreteMarkovProcess[Array[1 &, 29]/29, s[r, -1] + s[29/28 - r, 1]];
k[t_] := Probability[x[t] == 15, x \[Distributed] d]
ListLinePlot[Table[k[t], {t, 0, 100}], PlotRange -> All]

Mathematica graphics

당신은 또한 진동하는 것을 볼 수 있습니다 ... 왜? 대답은 간단합니다 : 간격 [1, 29]에는 짝수보다 홀수입니다 :)

우리가 볼의 확률을 요구하면 진동은 거의 사라집니다. 14 OR 15 .

Mathematica graphics

그리고 국가 확률의 한계 (Cesaro 의미)를 요청할 수도 있습니다.

ListLinePlot@First@MarkovProcessProperties[d, "LimitTransitionMatrix"]

Mathematica graphics

글쎄, 아마도 나는 그런 주제를 벗어난 대답에 대해 약간의 공감대를 가질 자격이 있습니다. 부담없이


2
가장 짧지는 않지만 정말 멋집니다.
Kasra Rahjerdi

Upvoted없고, 지금 당신의 점수는 ... 더 이상 2222입니다
cormullion

@cormullion 감사합니다! 당신은 열심히 downvoting함으로써 그것을 취소 할 수 있습니다 :)
Dr. belisarius

7

배쉬, 점수 21 (81 바이트-50 보너스-10 보너스)

o=$[RANDOM%28];for i in {D..a};{ printf " %$[o+=1-2*(RANDOM%29<o)]s.%$[28-o]s
";}

이 답변에서 점은 다시 중간으로 "당겨집니다". 시작 지점을 0 또는 30으로 하드 코딩하여 테스트 할 수 있습니다.


좋은 해결책! 그러나 시작점을 하드 코딩하지 마십시오;)
reggaemuffin

1
@ Kostronor-죄송합니다-나는 그것을 놓 쳤고 이제는 고쳤습니다.
Digital Trauma

2
대체하여 문자를 저장 {1..30}하여{P..m}
제프 리디

어떤 경우 o입니다 1RANDOM%30반환 0? 그리고 다음 반복에서도?
user2846289

@VadimR-경계 조건이 수정되었다고 생각합니다.
Digital Trauma

5

루비 69 66 64-60 = 4

i=rand(30);30.times{a=' '*30;a[i]=?.;puts a;i+=rand>i/29.0?1:-1}

견본:

            .             
           .              
            .             
           .              
          .               
           .              
            .             
             .            
              .           
             .            
              .           
               .          
              .           
               .          
              .           
             .            
            .             
             .            
              .           
             .            
              .           
             .            
            .             
             .            
            .             
             .            
            .             
           .              
          .               
           .              

i=rand 30;대신에 바이트를 저장할 수 있습니다 i=rand(30);.
Jordan

5

스몰 토크 161 159 145-60 = 85

모든 열의 길이는 30 자 (변경 가능한 문자열 b에서 작동)입니다.

rnd 값을 p (rnd (0..29) -p)로 바이어스하고 부호 (-1/0/1)를 취한 다음 (-1 | 1), 이동 델타로 간주됩니다 (효과적으로 계산 : x sign <= 0 ifTrue : -1 ifFalse : 1). ST는 1 기반 인덱싱을 사용하므로 모든 문자열 참조를 +1로 조정해야합니다 (-1 | 1 비트 fiddling hack ;-) 감사합니다).

p:=((r:=Random)next*29)rounded.(b:=String new:30)at:p+1put:$..0to:29do:[:i|b at:p+1put:$ .p:=(p+(((r next*29)-p)sign-1|1))min:29max:0.b at:p+1put:$..b printCR]

Ruby 버전 (thanx & Up @fipgr)에서 아이디어를 훔치면 최소 / 최대 확인을 제거 할 수 있습니다.

p:=((r:=Random)next*29)rounded.(b:=String new:30)at:p+1put:$..1to:30 do:[:i|b at:p+1put:$ .p:=p+((r next-(p/29))sign-1|1).b at:p+1put:$.;printCR]

출력 : (나중에 열 번호와 세로 막대를 수동으로 추가했습니다. 위의 코드는 생성하지 않습니다)

 012345678901234567890123456789
|                     .        |
|                    .         |
|                   .          |
|                  .           |
|                 .            |
|                  .           |
|                 .            |
|                  .           |
|                 .            |
|                .             |
|                 .            |
|                .             |
|               .              |
|                .             |
|                 .            |
|                  .           |
|                 .            |
|                  .           |
|                 .            |
|                  .           |
|                 .            |
|                .             |
|               .              |
|                .             |
|               .              |
|                .             |
|               .              |
|              .               |
|               .              |
|              .               |
 012345678901234567890123456789

4

C, 86

rand()기능 을 시딩 할 필요가 없다고 가정 합니다.

k=30;main(i){i=rand()%k;while(k--){printf("%*c\n",i+=i==30?-1:i==1||rand()%2?1:-1,46);}}

설명:

C에서의 출력의 길이가 최소 길이를 가질 것이며, 이러한 최소 길이는이 때의 함수 호출 (의 인자에 의해 결정되는 것을 의미는이다 . 수단에게 다음 인수 ("%*c"*i+=i==30?-1:i==1||rand()%2?1:-1c46 )는 문자 ( 점).

경계 점검에 대해서는 잊어 버린 것에 대해 사과드립니다. 나는 이제 15 자의 비용으로 대답에 이것을 추가했다. 삼항 연산자는 다음과 같이 작동합니다 boolean_condition?value_if_true:value_if_false. C에서 true는 1이고 false는 0입니다.


코드에서 진행중인 작업을 확장 할 수 있습니까? printf("%*c\n",i+=rand()%2?1:-1,46)공백을 인쇄하는 방법과 도트가 29을 넘어서 이동할 수 없도록하는 방법을 이해하는 데 어려움을 겪고 있습니다. 미리 감사드립니다. (죄송합니다, 저는 C 프로그래머가 아닙니다.)
Decent Dabbler

@fireeyedboy 완료, 당신이 이해 바랍니다 :)
user12205

Aaaah, 나는 당신이 조금 바람 피우고 있다는 느낌을 받았습니다. ;-) 그러나 나머지는 실제로 분명합니다. 감사합니다! 그리고 좋은 해결책! C도 rand()%2매우 예측 가능 (홀수 / 짝수)한다는 이상한 행동을 합니까? 나는 rand()%2PHP 솔루션에서 당신 을 시험해 보았고 , 매우 예측 가능한 행동을 보였다 rand(0,1). .
점잖은 물장난

@ fireeyedboy 나는 rand()기능을 시드하지 않았습니다 . C에서 rand()명시 적으로 시드되지 않으면 매번 항상 동일한 시드를 사용합니다. 그것이 예측 가능한 이유입니다. 내가 씨앗을 srand(time());
심어야한다면

그러나 이후 호출 할 때마다 홀수에서 짝수로 전환되도록 예측할 수 있습니까? PHP 주장 rand()srand()더 이상 씨를 뿌릴 필요 는 없지만 여전히 이상한 행동을 보여줍니다 .
괜찮은 Dabbler

4

자바 : 204 183 182 176 175 문자 - 10-50 = 115

class K{public static void main(String[]y){int k,j=0,i=(int)(29*Math.random());for(;j++<30;i+=Math.random()*28<i?-1:1)for(k=0;k<31;k++)System.out.print(k>29?10:k==i?'.':32);}}

먼저 도트 위치는 0 < x < 30[1-29] 여야합니다 . 이것은 0과 28 사이에 균일하게 분포 된 숫자를 생성하며이 프로그램의 목적을 위해 [0-28]은 [1-29]와 동일한 효과를 갖습니다.

i=(int)(29*Math.random());

개인적으로 14 개 정도가 일반적으로 배포되는 것을 선호하지만 제 답변은 더 길 것입니다.

i=0;for(;j<29;j++)i+=(int)(2*Math.random());

둘째,이 코드는 중간에있는 경향이 있습니다.

i+=Math.random()*28<i?-1:1

값이 작을수록 +1을 얻을 확률이 커지고 i-1과 반대입니다. 경우 i0, +1에 걸릴 확률은 100 %이고, 점점 -1 확률은 0 %이다. 경우 i28, 그 반대가 발생합니다.

셋째, 출력을 더 쉽게 볼 수 있도록 32끝에 를 바꾸면 '_'각 줄에 30 자에 새 줄이 있음을 알 수 있습니다.

__________.___________________
_________.____________________
________._____________________
_________.____________________
__________.___________________
___________.__________________
__________.___________________
_________.____________________
________._____________________
_________.____________________
________._____________________
_________.____________________
__________.___________________
_________.____________________
__________.___________________
___________.__________________
__________.___________________
_________.____________________
__________.___________________
___________.__________________
____________._________________
_____________.________________
____________._________________
_____________.________________
______________._______________
_____________.________________
______________._______________
_______________.______________
______________._______________
_____________.________________

이전 버전의 오해를 지적한 @VadimR (현재는 user2846289)에게 감사합니다.

이 답변이 처음 게시 된 후 2 년 반이 지난 후에도 6 개 문자를 줄인 @KevinCruijssen에게 감사합니다.


그러나 i가는 0것은 불법입니까?
user2846289

나를 위해 @VadimR i은 [0-29] 범위에 있습니다. 이것은 [1-30] 또는 [288-317]과 동일하며 출력은 동일합니다. 중요한 것은 [0-29] 간격에 30 개의 정수가 있다는 것입니다.
Victor Stafusa

"공백 수는 0 <x <30으로 정의 된 도트의 x 위치입니다." 즉, 공간 수 (또는 0 기반 도트 위치)는 1..29입니다. i할 수 없습니다 0. 나는 그것이 재미에 관한 것이지만 여전히 슬프다는 것을 이해합니다.
user2846289

@VadimR, 감사합니다. 결정된. 이것은 점이 가장 오른쪽 포션에 있지는 않지만 어쨌든 그것이 지정된 것임을 의미합니다.
Victor Stafusa

미안하지만 아무것도 고치지 않았습니다. 상상 해봐i 도착 1초기에, 먼저 반복에 Math.random()있다 0, 그 다음 i얻는다 0. 제발 틀리지 말아주세요 . 당신의 대답 이 아닙니다 . C와 같은 언어 이외의 다른 언어를 읽을 수 없다는 점에 대해. 그런 다음 오류에 대한 반응 없이 (공개 제외) 오류가 올바른지 어떻게 알 수 있습니까?
user2846289

3

매스 매 티카 157-10-50 = 97

1-30 사이의 난수가 시작에 사용됩니다. 점에서 남은 모든 열 번호는을 통해 선택되며 다음 RandomChoice[If[c > 15, {2, 1}, {1, 2}] -> {-1, 1}] + c과 같이 해석됩니다. 1; 그렇지 않으면 가중치를 뒤집고 동일한 세트에서 선택하십시오.

ReplacePart 관심있는 열에 해당하는 30 개의 빈 공간 목록에서 요소를 대체합니다.

f@c_ := Switch[d = RandomChoice[If[c > 15, {2, 1}, {1, 2}] -> {-1, 1}] + c, 1, 2, 30, 29, d, d]
Row@ReplacePart[Array["_" &, 29], # -> "."] & /@ NestList[f, RandomInteger@29+1, 30] // TableForm

dot


잘 사용RandomChoice[]
닥터 벨리 사리우스

3

> <>, 358-10 = 348

이것은 codegolf에서 이길 수는 없지만 작동합니다. ( 이 해석 기가있는 Windows 7 에서는 esolang 페이지와 다르게 "p"명령을 구현하는 명령이 정의 함)

1v        >a"                              "v
v<      0<} vooooooooooooooooooooooooooooooo<
&  _>   v : >$" "@p1+:2f*(?v;
  |x1>  v^}!               <
  |xx2> v p
  |xxx3>v  
  |xxxx4v $
>!|xxx< v }
  |xxxx6v }
  |xxx7>v @
  |xx8> v :
  |x9v  < @>  5)?v$:67*)?vv
   _>>&?v!@^     >$:b(?v v
  v }"."< :        v+ 1<  <
  >a+b+00}^0}}${"."< <- 1<

이 언어의 이름은 검색 할 수 없으므로 호기심을 나타내는 esolang 기사 가 있습니다.


-50에 대한 요구 사항을 50 자 미만으로 코딩 할 수 있습니까?
Victor Stafusa

1
@Victor 아마도, 그러나 <<>는 코딩하기에 엄청난 고통 (재미있는 거대한 고통)이므로 그것을 벗어나야합니다.
SirCxyrtyx

@SirCxyrtyx 이것은 나를 방해했습니다. 잘 골프장 님.
Gusdor

3

PHP, 118 113 112 111 (-10 보너스 포인트 = 101)

(두 번째 시도, 끔찍하게 예측 가능 rand() 동작 및 약간의 효율성)

for($n=30,$i=rand(1,29),$t=$s=pack("A$n",'');$n--;$i+=$i<2|rand()%2&$i<28?1:-1,$t=$s){$t[$i-1]='.';echo"$t\n";}

가능한 결과 :

______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________

PHP, 130 (, -10 보너스 포인트 = 120)

(첫 시도)

이것은 아마도 훨씬 더 효율적일 수 있습니다.

for($n=30,$i=rand(1,29),$t=$s=str_repeat(' ',$n)."\n";$n--;$i=$i<2?2:($i>28?28:(rand(0,1)?$i+1:$i-1)),$t=$s){$t[$i-1]='.';echo$t;}

공백을 밑줄로 바꾸면 (표시 목적으로) 가능한 결과입니다.

________._____________________
_______.______________________
______._______________________
_______.______________________
________._____________________
_______.______________________
______._______________________
_______.______________________
______._______________________
_______.______________________
________._____________________
_______.______________________
________._____________________
_________.____________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
__________.___________________
_________.____________________
________._____________________
_________.____________________
________._____________________
_______.______________________
______._______________________
_____.________________________
____._________________________
_____.________________________
____._________________________
___.__________________________

내가 대체하면 이상하게 rand(0,1)으로 rand()%2(Windows XP에서 PHP 5.4), 임의의 결과는 항상도를 홀수로 전환하고, 그 반대의 경우도 마찬가지 만들기 다음의 각 반복에 rand()갑자기, 그 의미에서 모든 걱정 스레 예측. 이 '버그'는 2004 년 이후 알려진 것으로 보입니다 . 정확히 동일한 '버그'인지 확실하지 않습니다.


3

J 42 자-50-10 = -18

'_.'{~(|.~((I.%<:@#)*@-?@0:))^:(<@#)1=?~30

오른쪽에서 시작하여 설명 ( 기차 에 대한 일부 지식 이 유용합니다) :

init=: 0=?~30          NB. where is the 0 in the random permutation of [0,29]
rep =: ^:(<@#)         NB. repeat as many times as the array is long, showing each step

rnd =: ?@0:            NB. discards input, generates a random number between 0 and 1

signdiff =: *@-        NB. sign of the difference (because this works nicely with
                       NB. the shift later on).

left_prob =: (I.%<:@#) NB. probability of shifting left. The position of the one (I.) divided by the length -1.

shift =: |.~           NB. x shift y , shifts x by y positions to the left.

output =: {&'_.'       NB. for selecting the dots and bars.

NB. Piecing things together:
output (shift (left_prob signdiff rnd))rep init

중심 경향, -50, 예 : 1000 회 이상 :

NB. Amounts of ones in each column (sum)
   ]a=:+/ (|.~((I.%<:@#)*@-?@0:))^:(<1000)0=?30
0 0 0 0 0 0 2 6 10 12 25 60 95 121 145 161 148 99 49 27 19 13 6 1 1 0 0 0 0 0
   +/a NB. check the number of ones in total
1000
   |. |:(<.a%10) #"0 1] '*' NB. plot of those values
           *              
           *              
          ***             
          ***             
         ****             
         ****             
         ****             
        ******            
        ******            
        ******            
       *******            
       *******            
       ********           
       ********           
      **********          
    **************        

한 줄에 정확히 30 바이트를 출력하는 예제 실행

_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
______________._______________
_______________.______________
________________._____________
_________________.____________
________________._____________
_______________.______________
______________._______________
_____________.________________
____________._________________
___________.__________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
____________._________________
_____________.________________
______________._______________

아주 좋은 해결책!
레게 머핀

아주 좋은 도전!
jpjacobs

3

파이썬 2.7 : 126 109 -10-50 = 49

하드 코딩 된 시작 지점을 제거했습니다. 이제 임의 지점에서 시작합니다. 이 때문에 나는 랜싯이 필요했기 때문에 오프셋 대신에 그것을 사용하기로 결정했습니다. 이를 위해 (-1) ** bool 트릭을 사용했습니다.

from random import randint as r;p=r(0,29)
for i in range(30):
 print' '*p+'.'+' '*(29-p);p+=(-1)**(r(0,29)<p)

여기에 좋은 답변이 있습니다. 개선을 생각하면서 파이썬에서 첫 시도. 가져 오기가 필요하지 않습니다.

-10-예 30 자 + \ n 각 줄

-50-중심에서 멀어 질수록 다른 방향으로 이동할 가능성이 더 큼 (다른 수의 + / i 오프셋을 가진 목록을 작성하여 수행)

이전 시도 :

from random import choice;p,l=15,[]
for i in range(30):
 q=29-p;l+=[' '*p+'.'+' '*q];p+=choice([1]*q+[-1]*p)
print'\n'.join(l)

귀하의 for루프는 모두 한 줄에있을 수 있지만, 더 나은은 for i in[0]*30:더 나은 여전히하고 eval"..."*30.
mbomb007

2

자바 -198 183 자

이것은 당신이 질문에서 제시 한 예의 단순하고 단순하며 직접적이고 창조적이지 않은 골프 일뿐입니다.

class A{public static void main(String[]y){int c,j,i=(int)(Math.random()*30);for(c=30;c>0;c--)for(j=i+=i<2?1:i>28?-1:Math.random()>0.5?1:-1;j>=0;j--)System.out.print(j>0?" ":".\n");}}

2

배치-(288 바이트-10) 278

@echo off&setlocal enabledelayedexpansion&set/ap=%random%*30/32768+1&for /l %%b in (1,1,30)do (set/ar=!random!%%2&if !r!==1 (if !p! GTR 1 (set/ap-=1)else set/ap+=1)else if !p! LSS 30 (set/ap+=1)else set/ap-=1
for /l %%c in (1,1,30)do if %%c==!p! (set/p"=."<nul)else set/p"=_"<nul
echo.)

언 골프 :

@echo off
setlocal enabledelayedexpansion
set /a p=%random%*30/32768+1
for /l %%b in (1,1,30) do (
    set /a r=!random!%%2
    if !r!==1 (
        if !p! GTR 1 (set /a p-=1) else set /a p+=1
    ) else if !p! LSS 30 (set /a p+=1) else set /a p-=1
    for /l %%c in (1,1,30) do if %%c==!p! (set /p "=."<nul) else set /p "=_"<nul
    echo.
)

밑줄 대신 공백을 출력하려면 -372 바이트 -

@echo off&setlocal enabledelayedexpansion&for /f %%A in ('"prompt $H &echo on&for %%B in (1)do rem"')do set B=%%A
set/ap=%random%*30/32768+1&for /l %%b in (1,1,30)do (set/ar=!random!*2/32768+1&if !r!==1 (if !p! GTR 1 (set/ap-=1)else set/ap+=1)else if !p! LSS 30 (set/ap+=1)else set/ap-=1
for /l %%c in (1,1,30)do if %%c==!p! (set/p"=."<nul)else set/p"=.%B% "<nul
echo.)

다음 논리에 대한 도움을 얻으려면 이것이 가장 공간 효율적인 방법은 아닙니다 (! r!는 1 또는 2로 확장됩니다)-

if !r!==1 (
    if !p! GTR 1 (set /a p-=1) else set /a p+=1
) else if !p! LSS 30 (set /a p+=1) else set /a p-=1

그것은 아래로 골프 : if !r!==1 (if !p! GTR 1 (set/ap-=1)else set/ap+=1)else if !r! LSS 30 (set/ap+=1)else set/ap-=1


2

J, 42 자, 보너스 없음

' .'{~(i.30)=/~29<.0>.+/\(-0&=)?(,2#~<:)30

예제 실행 :

          ' .'{~(i.30)=/~29<.0>.+/\(-0&=)?(,2#~<:)30
                       .
                      .
                     .
                      .
                     .
                      .
                     .
                      .
                       .
                      .
                     .
                    .
                     .
                    .
                     .
                    .
                     .
                      .
                       .
                        .
                       .
                        .
                       .
                      .
                     .
                      .
                       .
                      .
                     .
                    .

2

Python 2.7 (126-10 (수정 길이)-50 (중심 경향) = 66)

다음 프로그램은 큰 샘플보다 중심 경향이 있습니다.

s=id(9)%30
for e in ([[0,2][s>15]]*abs(s-15)+map(lambda e:ord(e)%2*2,os.urandom(30)))[:30]:
    s+=1-e;print" "*s+"."+" "*(28-s)

데모

         .           
        .            
       .             
      .              
     .               
      .              
       .             
        .            
         .           
          .          
           .         
          .          
           .         
          .          
         .           
        .            
       .             
        .            
       .             
      .              
     .               
      .              
       .             
      .              
     .               
    .                
   .                 
    .                
   .                 
    .              

파종에 대한 s = id (9) % 30처럼. os는 가져와야합니까? 그리고 이것은 전체 1-30 범위를 다룹니까? 오 * 페이지의 상단에 ... * 다시 판독에게 불평등을 기다립니다
psion5mx

2

자바 스크립트 125 73 72 60 (120-50-10)

i=0;r=Math.random;s=r()*30|0;do{a=Array(30);a[s=s>28?28:s?r()<s/30?s-1:s+1:1]='.';console.log(a.join(' '))}while(++i<30)

편집하다: 50 포인트 보너스 및 10 포인트 보너스 수정.

편집 2 : 더 짧습니다!


당신은 50 포인트 보너스를 얻는 곳을 설명 할 수 있습니까? 나는 지금 당장 그것을 얻지 못한다 ...
레게 머핀

@ Kostronor 방금 요구 사항에 대한 편집 내용을 보았습니다. 아직 50 점을 얻지 못한 것 같습니다.
aebabis

@acbabis, 잘 했어요! 약간의 바이트 (116)를 절약 할 수 있습니다.r=Math.random;s=r()*30|0;for(i=0;i++<30;a=Array(30)){a[s=s>28?28:s?r()<s/30?s-1:s+1:1]='.';console.log(a.join(' '))}
Michael M.

@Michael 팁 주셔서 감사합니다. for그래도 작업 내부에서 배열을 초기화 할 수 없었습니다 . 잠시 동안 사용해야했습니다.
aebabis

2

D- 167, 162, 144 (154-10)

골프 :

import std.stdio,std.random;void main(){int i=uniform(1,30),j,k;for(;k<30;++k){char[30]c;c[i]='.';c.writeln;j=uniform(0,2);i+=i==29?-1:i==0?1:j==1?1:-1;}}

언 골프 :

import std.stdio, std.random;

void main()
{
    int i = uniform( 1, 30 ), j, k;

    for(; k < 30; ++k )
    {
        char[30] c;
        c[i] = '.';
        c.writeln;
        j = uniform( 0, 2 );
        i += i == 29 ? -1 : i == 0 ? 1 : j == 1 ? 1 : -1;
    }
}

편집 1- 내 코드가 -50 보너스를받을 수 있는지 확실하지 않습니다. i항상 중간에서 시작하지는 않지만 for루프 중에는 점이 3 방향 이상으로 이동 i 하지 않으므로 중간 근처에서 시작하면 모든 것이 거기에 머무르는 경향이 있습니다.

편집 2- 코드는 29 자의 배열과 LF가 한 줄에 총 30 자로 인쇄되므로 이제 -10 보너스를받을 수 있습니다.


LF가 뒤에 오는 29 자의 배열을 인쇄하므로-LF가 뒤에 오는 30 자 여야합니다.
Victor Stafusa

@ 빅터 아, 정정 주셔서 감사합니다, 나는 주요 게시물을 잘못 해석했습니다.
Tony Ellis

2

PowerShell, 77-10-50 = 17

$x=random 30
1..30|%{$x+=random(@(-1)*$x+@(1)*(29-$x))
'_'*$x+'.'+'_'*(29-$x)}

산출

_.____________________________
__.___________________________
___.__________________________
____._________________________
___.__________________________
____._________________________
_____.________________________
______._______________________
_______.______________________
______._______________________
_____.________________________
______._______________________
_______.______________________
________._____________________
_________.____________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
____________._________________
___________.__________________
__________.___________________
_________.____________________
__________.___________________
_________.____________________
________._____________________
_________.____________________
________._____________________
_________.____________________
__________.___________________

똑똑한 무작위. 당신은 골프 버전을 사용할 수 있습니다 $x=random 30;1..30|%{' '*($x+=,-1*$x+,1*(29-$x)|random)+'.'|% *ht 30}. 66 바이트
-10-50

2

R, 107 자-60 포인트 보너스 = 47

s=sample;i=s(29,1);for(j in 1:30){a=rep(' ',30);i=i+s(c(-1,1),1,p=c(i-1,29-i));a[i]='.';cat(a,'\n',sep='')}

i점의 인덱스입니다. a30 칸의 배열입니다. 시작 지점은 임의적입니다 (균일하게 1에서 29까지). 각 반복에서 우리는 무작위로 일을하기 위해 추가 -1 또는 i가중 확률로 : i-1대한 -129-i 를 위해+1 (확률로 공급 값이 하나로 합하지 않아도), 아래를 방지하면서 중심을 향해 도트를 배향하는 경향이 있음을 의미 1 이상 29 (두 경우 모두 확률이 0으로 떨어 지므로).

다음으로 실행 예 _가독성을 위해 공백 대신 :

> s=sample;i=s(1:30,1);for(j in 1:30){a=rep('_',30);i=i+s(c(-1,1),1,p=c(i-1,29-i));a[i]='.';cat(a,'\n',sep='')}
_______________________.______
______________________._______
_____________________.________
______________________._______
_____________________.________
______________________._______
_____________________.________
______________________._______
_____________________.________
____________________._________
_____________________.________
______________________._______
_____________________.________
______________________._______
_____________________.________
____________________._________
___________________.__________
____________________._________
___________________.__________
__________________.___________
_________________.____________
________________._____________
_______________.______________
______________._______________
_______________.______________
________________._____________
_________________.____________
________________._____________
_______________.______________
______________._______________

난 당신의 코드를 읽는 틀리지 않는 경우, i 가 하나 0또는 30아니오?
user2846289

그렇습니다 .30이 될 수 있습니다.
plannapus

1
이제 수정되었습니다. 1에서 0으로 또는 29에서 30으로 갈 확률은 이제 0입니다. 무작위 시작 지점은 이제 1에서 29 사이입니다.
plannapus

힌트 : 당신은 대체하여 2 개 이상의 문자를 저장할 수 있습니다 s(1:29,1)s(29,1).
Sven Hohenstein

@SvenHohenstein 당신은 맞습니다. 저는 항상 그 하나를 잊었습니다
plannapus

2

C # 184-10-50 = 123

using System;namespace d{class P{static void Main(){var r=new Random();int p=r.Next(30);for(int i=0;i<30;i++){Console.WriteLine(".".PadLeft(p+1).PadRight(29));p+=r.Next(30)<p?-1:1;}}}}

산출

space_가독성을 위해 대체되었습니다 .

____________.________________
___________._________________
__________.__________________
___________._________________
____________.________________
_____________._______________
______________.______________
_____________._______________
______________.______________
_______________._____________
______________.______________
_______________._____________
______________.______________
_______________._____________
______________.______________
_____________._______________
____________.________________
___________._________________
____________.________________
_____________._______________
______________.______________
_____________._______________
____________.________________
___________._________________
____________.________________
___________._________________
____________.________________
___________._________________
__________.__________________
___________._________________

나는 if...else if...else당신의 코드 끝에 작은 코드를 얻을 수 있어야한다고 확신합니다 . 또한 출력 결과가 중간에있는 경향이 있음을 의심하게하지만 코드가 올바른 것 같습니다.
Victor Stafusa

코드를 편집 할 때 출력을 업데이트하는 것을 잊었습니다. 이 r.Next(30)<p?-1:1;일어날 수 있습니다. if진술 로 더 작게 갈 수 있는지 확실하지 않습니다 . switch필수 사항으로 인해 크며 break/ return최종 else에는 default:{}케이스 가 필요 하며 그 길이도 길다.
Gusdor

@Victor 입력 주셔서 감사합니다. 나는 약간의 편집을했다.
Gusdor

경우 p제로의는 p+=r.Next(30)<p?-1:1;항상 일을 얻을 필요없이 그렇게 할 것이다 if(p==0). 에 대한 Ditto p==29. p30이되지 않으므로을 (를) 제거 할 수 있습니다 else if.
Victor Stafusa

@ 빅터 그랜드. 그런 변화를 고마워.
Gusdor

1

PHP

중심 보너스 포함 : 82-50 = 32

$i=rand(0,29);for($c=0;$c++<30;rand(0,28)<$i?$i--:$i++)echo pack("A$i",'').".\n";

이 버전 (이전 버전)에서는 센터링 코드에서 처리 한 최소 / 최대 검사를 제거했습니다. rand(1,28)여기서 $i++최대 29 (실제 최대)까지 밀어 넣을 수 있으므로 중요합니다 .

편집 : 불필요한 괄호, 이동 이동 코드


센팅을위한 간단한 알고리즘 : 0에서 29 사이의 새로운 숫자를 생성하여 현재 숫자와 비교합니다. 더 큰 쪽에서 숫자를 중앙으로 가져 오는 "확률"을 이용합니다.

실제 결과 : (나중에 줄 번호가 추가됨)

01|        .
02|       .
03|        .
04|         .
05|          .
06|           .
07|            .
08|           .
09|            .
10|             .
11|              .
12|             .
13|            .
14|             .
15|            .
16|             .
17|            .
18|             .
19|              .
20|               .
21|              .
22|             .
23|              .
24|               .
25|                .
26|               .
27|                .
28|                 .
29|                .
30|               .

보관 :

$i=rand(0,29);for($c=0;$c++<30;){($i<1?$j=1:($i>28?$j=28:$j=rand(0,29)));($j<$i?$i--:$i++);echo pack("A$i",'').".\n";} 119 자

$i=rand(0,29);for($c=0;$c++<30;){($i<1?$i++:($i>28?$i--:(rand(0,29)<$i?$i--:$i++)));echo pack("A$i",'').".\n";} 112 자


첫 번째 버전 이후로 49자를 깎아 낸 것에 대해 조금 감동했습니다 ...
Yoda

지금 44자를 깎았습니다. 마지막으로 39 세 였다는 뜻입니다.
Yoda

1

JavaScript ES6 125-10 (30 자)-50 (중간으로 이동) = 65

나는 리프트를 내 유닛으로 올리는 주현절을 가지고 있었기 때문에 추억을 떠나기 전에 내려 놓아야했습니다 ...

z=(j=Array(t=29).join`_`)+"."+j;x=(r=Math.random)()*t;for(i=30;i--;)console.log(z.substr(x=(x+=r()<x/t?-1:1)>t?t:x<0?0:x,30))

가변 가변 위치 셔플 링과 시프트 확률 계산에 대한 약간의 창의성 x/t... (코스트로 너가 지적 해 주셔서 감사합니다!) 이제 중간으로 이동하면 -50 보너스를 얻었고 시작 위치를 만들었습니다. 전체 범위의 라인으로 2 바이트를 면도 할 수있었습니다!

....5....0....5....0....5....0 <-- Ruler
_.____________________________
__.___________________________
___.__________________________
__.___________________________
___.__________________________
__.___________________________
_.____________________________
__.___________________________
___.__________________________
__.___________________________
___.__________________________
____._________________________
_____.________________________
______._______________________
_______.______________________
________._____________________
_______.______________________
______._______________________
_______.______________________
________._____________________
_______.______________________
________._____________________
_________.____________________
__________.___________________
_________.____________________
__________.___________________
___________.__________________
____________._________________
_____________.________________
______________._______________

여기서 초기 도트 위치의 임의성이 2 또는 3 가능성으로 제한되지 않습니까? 그리고 그것은 중간에 점을 유지하는 것입니다 (매우 짧은 횟수 = 30이기 때문에) -50의 가치는 무엇입니까?
user2846289

OP 의 텍스트 인용 : "프로그램은 임의의 x 위치로 시작하고 매번 회전 할 때 마다이 위치가 왼쪽 또는 오른쪽으로 1 씩 이동합니다." 내 코드는 처음에 15+r()*215에서 16.9999999998 정도가 될 수 있습니다. 추가 x+=r()<.5?-1:1는 14에서 18까지의 범위로 가져와 조금 더 무작위성을냅니다. 기술적으로 요청 된 것의 정의 내에있는 임의의 숫자입니다. 그 규칙을 구부리면 뒤집기 (+1, -1) 대부분의 경우 중간으로 되돌려 놓을 것입니다 ...;)
WallyWest

글쎄, 임의의 일에, 당신은 저를 얻었습니다 ... '모든 가능한 위치에서 임의의 위치'를 의미했지만 50 점이 명확하게 적용되지 않기 때문에 많은 이점을 얻지 못합니다! 이 보너스에 대한 설명을 다시 읽으십시오. 고정 된 0.5 %는 그것을 얻지 못합니다!
레게 머핀

유효한 포인트, 나는 그에 따라 내 점수를 다시 실행할 것이다 ...
WallyWest

@ Kostonor 코드는 적절한 솔루션으로 업데이트되고 그에 따라 점수가 업데이트됩니다!
WallyWest

1

k, 53-10-50 = -7

해결책 1

{{a:30#" ";a[x]:".";a}'{x+$[*x<1?!30;1;-1]}\[x;*1?x]}

용법

{{a:30#" ";a[x]:".";a}'{x+$[*x<1?!30;1;-1]}\[x;*1?x]}30

"      .                       "
"       .                      "
"      .                       "
"       .                      "
"      .                       "
"       .                      "
"        .                     "
"         .                    "
"        .                     "
"         .                    "
"        .                     "
"         .                    "
"          .                   "
"           .                  "
"            .                 "
"             .                "
"              .               "
"               .              "
"              .               "
"             .                "
"            .                 "
"           .                  "
"          .                   "
"         .                    "
"        .                     "
"       .                      "
"        .                     "
"         .                    "
"          .                   "
"         .                    "
"          .                   "

해결책 2

{r::x;{a:r#" ";a[x]:".";a}'{a:r#0b;a[x?r]:1b;x+$[a@*1?r;-1;1]}\[x;*1?x]}[30]

1

스칼라, 95-10 = 85 바이트

def r=math.random
Seq.iterate(r*30,30){n=>println(("#"*30)updated(n.toInt,'.'))
(r*2-1+n)round}

나는 아직도 50 바이트 보너스에 대해 생각하고 있습니다.

설명:

def r=math.random //define a shortcut for math.random, which returns a number 0 <= n < 1
Seq.iterate(      //build a sequence,
  r*30,             //starting with a random number bewteen 0 and 29
  30                //and containing 30 elements.
){n=>             //Calculate each element by applying this function to the previous element
  println(        //print...
    (" "*30)             //30 spaces
    updated(n.toInt,'.') //with the n-th char replaced with a dot
  )               //and a newline.
                  //The next element is
  (r*2-1+n)       //an random number between -1 and 1 plus n
  round           //rounded to the nearest integer.
}

1

자바 스크립트, 125 (135-10)

q=Math.random,p=~~(q()*31)+1;for(i=0;i++<30;){s='',d=j=1;for(;j++<31;)s+=j==p?'.':" ";p+=q()<.5?1:-1;p-=p>28?2:p<2?-2:0;console.log(s)}

의견과 조언을 환영합니다.


슬프게도, 귀하의 솔루션은 자격이 없으므로 다른 솔루션의 출력과 출력을 비교하십시오. 한 문자 씩 점을 이동하십시오.
reggaemuffin

@Kostronor 아! 오! 정말 미안해! 나는 질문의 그 부분을 읽는 것을 잊었다! 나는 곧 새로운 버전을 개발하려고 노력할 것이다. 지적 해 주셔서 감사합니다!
Gaurang Tandon

@Kostronor 프로그램이 편집되었습니다.
Gaurang Tandon

1

자바 스크립트

114 자-10 자 (30 자)-50 자 (가운데 점)

for(f=Math.random,a=[],i=30,j=k=f()*i|0;i--;a[j]='.',a[j+=29-k]='\n',j+=k+=f()>k/29?1:-1);console.log(a.join('-'))

그러나 줄을 30 자로 채우면 10 자 보상이 좋지 않을 수 있습니다. 그래서:

102 자-50 (가운데를 향한 풀 도트) = 52

for(f=Math.random,a=[],i=30,j=k=f()*i|0;i;i--,a[j]='.\n',j+=k+=f()>k/29?1:-1);console.log(a.join('-'))

단순화 된 당김 방향을 위해 @WallyWest에 대한 f()>k/29?1:-1첫 번째 초안은 두 개의 중첩 된 조건을 사용했습니다.


1

라켓 227 바이트 (30 자 -10, 미드 라인으로 이동하는 경우 -50 = 167)

각 단계에서 도트는 중간에서 멀어 질 때보 다 두 배 더 움직일 가능성이 높습니다.

(let lp((r(random 1 31))(c 0)(g(λ(n)(make-string n #\space))))(set! r
(cond[(< r 1)1][(> r 30)30][else r]))(printf"~a~a~a~n"(g r)"*"(g(- 29 r)))
(when(< c 30)(lp(+ r(first(shuffle(if(> r 15)'(-1 -1 1)'(1 1 -1)))))(add1 c)g)))

언 골프 드 :

(define (f)
    (let loop ((r (random 1 31))
               (c 0)
               (g (λ (n) (make-string n #\space))))
      (set! r (cond
                [(< r 1) 1]
                [(> r 30) 30]
                [else r] ))
      (printf "~a~a~a~n" (g r) "*" (g (- 29 r)))
      (when (< c 30)
        (loop (+ r
                 (first
                  (shuffle
                   (if (> r 15)
                       '(-1 -1 1)
                       '(1 1 -1)))))
              (add1 c)
              g))))

테스트 :

(println "012345678901234567890123456789")
(f)

산출:

"012345678901234567890123456789"
                       *       
                      *        
                       *       
                        *      
                         *     
                        *      
                       *       
                      *        
                     *         
                      *        
                     *         
                    *          
                     *         
                      *        
                     *         
                    *          
                   *           
                  *            
                 *             
                *              
               *               
                *              
                 *             
                *              
                 *             
                *              
                 *             
                *              
                 *             
                *              
               *               

좋은 해결책! 라켓은 정말 흥미 롭습니다. 당신은 자신에게 50 보너스 포인트를 제공하고 추가 10 :-)를 신청하는지 확인할 수 있습니다
레게 머핀
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.