카오스 게임


28

카오스 게임 프랙탈을 생성하는 간단한 방법입니다. 시작점, 길이 비율 r 및 2D 점 세트가 주어지면 다음을 반복적으로 수행하십시오.

  • 당신의 포인트 세트에서 무작위로 (균일하게) 하나를 선택하십시오.
  • r1-r 을 가중치로 사용하여 그 점과 마지막으로 그린 ​​점 (또는 시작점)의 평균을 구합니다 (예 : r = 0 은 시작점을 의미하고 r = 1 은 임의 점을 의미 하고 r = 0.5 는 의미합니다) 중간에 지점을 가져옵니다.)
  • 결과 점을 그립니다.

예를 들어, 정삼각형의 정점과 r = 0.5 를 선택하면 플롯 된 점이 Sierpinski 삼각형을 매핑합니다.

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

Wikipedia에서 찾은 이미지

당신은 프랙탈을 만들기 위해 혼돈 게임을 "재생"하는 프로그램이나 함수를 작성해야합니다.

입력

프로그램이나 함수를 작성하고 ARGV, STDIN 또는 함수 인수를 통해 다음 입력을받을 수 있습니다.

  • 플롯 할 포인트 수입니다.
  • 시작 좌표 (도표화해야 함).
  • 평균화 중량 R 간격의 [0,1] .
  • 선택할 포인트 목록.

산출

화면에 렌더링하거나 이미지 파일을 쓸 수 있습니다. 결과가 래스터 화 된 경우 각면에 600 픽셀 이상이어야하고 모든 점이 캔버스에 있어야하며 이미지의 가로 및 세로 범위의 75 % 이상이 점에 사용되어야합니다 (이를 피하기위한 것임) "정말 크게 축소되었습니다"라는 단일 검은 색 픽셀로 답변합니다. XY 축들은 동일한 스케일에 있어야 (즉, 0,0 (의 라인)이다 (1,1) : 45도 각도이어야 함)과 혼돈 게임 플롯 각 지점은 단일로 표현되어야 픽셀 (플로팅 방법으로 포인트 앤티 앨리어싱을 수행하는 경우 2x2 픽셀에 걸쳐 확산 될 수 있음)

색상이 선택되지만, 최소한 두 가지 구별 가능한 색상이 필요합니다. 하나는 배경색과 하나는 혼돈 게임 중에 그려진 점입니다. 입력 포인트를 플롯 할 필요는 없습니다.

주십시오 세 가지 답변의 흥미로운 예를 출력합니다.

채점

이것은 코드 골프이므로 가장 짧은 대답 (바이트)이 이깁니다.

편집 : 더 이상 입력 지점이 실제로 단일 픽셀로 표시되지 않으므로 입력 지점을 플롯 할 필요가 없습니다.


" 각 점은 하나의 픽셀로 표시되어야합니다 "는 무엇을 의미합니까? a) 앤티 앨리어싱을 사용해서는 안됩니다. 또는 b) 두 번째 색상의 포인트 수가 입력의 첫 번째 항목과 같아야합니까? b) 반복 절차에 "이 픽셀이 이전에 플롯 한 픽셀과 일치합니까?"에 대한 테스트가없는 한 보장 할 수 없습니다. 난수 선택기가 행에서 동일한 포인트를 여러 번 선택하면 위치가 수렴되기 때문입니다. 그 시점.
피터 테일러

@PeterTaylor Mathematica가 기본적으로하는 것처럼 점을 큰 점으로 그리는 사람들을 피하기위한 것이지만, 앤티 앨리어싱은 Soham의 답변에서 단일 픽셀을 보장하는 데 약간의 문제가 있음을 이미 알고 있습니다. 필자는이 문제를 "2x2 픽셀보다 크지 않아야"한다고 생각하며, 이는 앤티 앨리어싱 문제를 모두 해결해야합니다.
Martin Ender

나는 내가 잘못 이해했다고 생각합니다 : 당신은 항상 마지막으로 그린 ​​점의 '평균'과 현재 목록의 임의의 점을 취합니다. 그런 다음 해당 새 지점을 목록에 추가하십시오. 그 맞습니까? 하나의 '코너'에 많은 포인트가있는 경우 더 많은 포인트를 얻을 수 있지만 클라우드에서 벗어날 가능성은 거의 없습니다. 적어도 내 코드는 서로 너무 가까운 포인트에 항상 '수렴'합니다. 정말 사진을 향상시킵니다.
flawr

1
@flawr 아니오, 당신은 목록에 새로운 포인트를 추가하지 않습니다. 목록은 고정되어 있습니다. 알고리즘은 마지막 점이 아니라 그 이전 점만 신경 씁니다.
Nathaniel

고마워, 그것은 많은 것을 설명하고, 아마도 질문에서 분명히해야합니다.
flawr

답변:


8

매스 매 티카, 89

f[n_,s_,r_,p_]:=Graphics@{AbsolutePointSize@1,Point@NestList[#-r#+r RandomChoice@p&,s,n]}

f[10000, {0, 0}, .5, {{-(1/2), Sqrt[3]/2}, {-(1/2), -(Sqrt[3]/2)}, {1, 0}}]

Mathematica 그래픽

작동 원리

Mathematica에서이 Graphics[]기능은 확장 가능한 그래픽을 생성하고 그림 모서리를 드래그하여 원하는 크기로 렌더링합니다. 실제로, 표시된 모든 그래픽의 초기 크기는 ".ini"설정이며 600 또는 원하는 다른 값으로 설정할 수 있습니다. 따라서 600x600 요구 사항에 대해 특별한 작업을 수행 할 필요가 없습니다.

AbsolutePointSize[]것은 포인트 크기가 이미지 크기를 확대에 의해 변경되지 않음을 지정합니다.

핵심 구성은

 NestList[#-r#+r RandomChoice@p&,s,n]

또는 골프가 아닌 의사 코드에서 :

 NestList[(previous point)*(1-r) + (random vertex point)*(r), (start point), (iterations)]

(start point)첫 번째 인수에서 (벡터 순) 함수 부터 시작 하여 각 연속 점에 목록을 재귀 적으로 작성 하고 마지막으로Point[]

일부 자기 복제 예 :

Grid@Partition[Table[
   pts = N@{Re@#, Im@#} & /@ Table[E^(2 I Pi r/n), {r, 0, n - 1}];
   Framed@f[10000, {0, 0}, 1/n^(1/n), pts], {n, 3, 11}], 3]

Mathematica 그래픽


@ MartinBüttner Instructions for testing this answer without Mathematica installed:1) pastebin 에서이 파일 을 다운로드 하여 * .CDF로 저장하십시오. 2) Wolfram Research 의 무료 CDF 환경 (작은 파일 아님 )을 다운로드하여 설치하십시오 . 즐겨. 작동하는지 알려주세요!
Dr. belisarius

귀하의 golfed 버전은 (적어도 V10에) 꽤 작업을 수행 : 당신이 주변에 전환해야 #rr#공백없이 또는 도망 *사이에.
마틴 엔더

@ MartinBüttner 궁금합니다! v9의 매력처럼 작동합니다 (v10은 아직 없습니다). 어쨌든, 난 (맹목적)를 교환 #하고 r.
Dr. belisarius

아, 새로운 기능입니다. 이제 연관에 함수를 적용 할 수 있습니다.이 경우으로 액세스 할 수있는 명명 된 매개 변수가 나타납니다 #key. 나는 그것이 유용 할 것이라고 확신한다. :)
Martin Ender

8

자바 : 246 253 447

기능으로서 m():

void m(float[]a){new java.awt.Frame(){public void paint(java.awt.Graphics g){int i=0,x=i,y=i,v;for(setSize(832,864),x+=a[1],y+=a[2];i++<=a[0];v=a.length/2-2,v*=Math.random(),x+=(a[v+=v+4]-x)*a[3],y+=(a[v+1]-y)*a[3])g.drawLine(x,y,x,y);}}.show();}

줄 바꿈 (사용법을 보여주기위한 프로그램 내) :

class P{
    public static void main(String[]a){
        new P().m(new float[]{1000000,            // iterations
                              416,432,            // start
                              0.6f,               // r
                              416,32,16,432,      // point list...
                              416,832,816,432,
                              366,382,366,482,
                              466,382,466,482});
    }

    void m(float[]a){
        new java.awt.Frame(){
            public void paint(java.awt.Graphics g){
                int i=0,x=i,y=i,v;
                for(setSize(832,864),x+=a[1],y+=a[2];
                    i++<=a[0];
                    v=a.length/2-2,v*=Math.random(),
                    x+=(a[v+=v+4]-x)*a[3],
                    y+=(a[v+1]-y)*a[3])
                    g.drawLine(x,y,x,y);
            }
        }.show();
    }
}

요구 사항에서 드로잉 입력 포인트가 제거되었습니다 (예 : 80 바이트!). 그것들은 여전히 ​​아래의 오래된 스크린 샷에 표시되지만 실행하면 표시되지 않습니다. 관심이있는 경우 개정 내역을 참조하십시오.

입력은 float 배열로 제공됩니다. 첫 번째는 반복이고 다음 두 개는 시작 x y됩니다. 네 번째는 r이며 마지막은 좌표 목록입니다 x1 y1 x2 y2 ....

닌자 스타

1000000 400 400 0.6 400 0 0 400 400 800 800 400 350 350 350 450 450 350 450 450

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

십자가

1000000 400 400 0.8 300 0 500 0 500 300 800 300 800 500 500 500 500 800 300 800 300 500 0 500 0 300 300 300

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

옥토 체인

1000000 400 400 0.75 200 0 600 0 800 200 800 600 600 800 200 800 0 600 0 200

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


이것은 내 컴퓨터에서 작동 show하지 않으며 Java 불만 은 더 이상 사용되지 않습니다
자랑스런 haskeller

@proudhaskeller show() 더 이상 사용되지 않지만 여전히 작동합니다. "작동하지 않습니다"라고 말할 때 그 의미는 무엇입니까? 자바 팔이없는 경우, 당신은 추가해야합니다 finalString[]a적어도 주에.
Geobits

100 개의 문자 처리 및 잘라내기에 대한 귀하의 답변을 제공했습니다.
user12205

1
@ 에이스 니스. 그래픽 출력을 위해 거의 모든 Java 골프로 그렇게 할 수 있지만 정확히 100 자입니다 : D
Geobits

7

자바 스크립트 (E6) + HTML 173176 193

편집 : William Barbosa 덕분에 큰 상처

편집 : DocMax 덕분에 3 바이트 감소

출력을 표시하는 데 필요한 함수 및 캔버스 요소를 계산하는 173 바이트

테스트 HTML 파일과 파이어 폭스에서 열려으로 저장합니다.

JSFiddle

좋은


마스크


눈


양탄자


<canvas id=C>
<script>
F=(n,x,y,r,p)=>{
  for(t=C.getContext("2d"),C.width=C.height=600;n--;x-=(x-p[i])*r,y-=(y-p[i+1])*r)
    i=Math.random(t.fillRect(x,y,1,1))*p.length&~1      
}
F(100000, 300, 300, 0.66, [100,500, 500,100, 500,500, 100,100, 300,150, 150,300, 300,450, 450,300]) // Function call, not counted
</script>

1
<canvas id=C><script>F=(n,x,y,r,p)=>{t=C.getContext("2d"),C.width=C.height=600;for(;n--;)t.fillRect(x,y,1,1),i=Math.random()*p.length&~1,x-=(x-p[i])*r,y-=(y-p[i+1])*r}</script>176 바이트, 당신의 수를 이해하지 못했다
윌리엄 바르보사

@ WilliamBarbosa 내 대답은 내 대답을 기반으로합니다. 힌트로 더 좋아집니다-감사합니다!
edc65

1
크기 초기화 및 y 업데이트를 for호출 로 이동하면 다음 두 가지를 더 줄일 수 있습니다 .for(C.width=C.height=600;n--;y-=(y-p[i+1])*r)
DocMax

6

파이썬 -200 189

import os,random as v
def a(n,s,r,z):
    p=[255]*360000
    for i in[1]*(n+1):
        p[600*s[0]+s[1]]=0;k=v.choice(z);s=[int(k[i]*r+s[i]*(1-r))for i in(0,1)]
    os.write(1,b'P5 600 600 255 '+bytes(p))

입력을 a에 함수 인수로 사용하고 결과를 pgm 파일로 stdout에 기록합니다. n반복, s시작점, rr z이며 입력 점 목록입니다.

편집 : 더 이상 입력 포인트를 회색으로 그리지 않습니다.

흥미로운 결과 :

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

Iterations: 100000
Starting Point: (200, 200)
r: 0.8
Points: [(0, 0), (0, 599), (599, 0), (599, 599), (300, 300)]

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

Iterations: 100000
Starting Point: (100, 300)
r: 0.6
Points: [(0, 0), (0, 599), (599, 0), (300, 0), (300, 300), (0, 300)]

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

Iterations: 100000
Starting Point: (450, 599)
r: 0.75
Points: [(0, 0), (0, 300), (0, 599), (300, 0), (599, 300), (150, 450)]

몇 가지 일반적인 파이썬 문자는 다음과 같이 저장 p=[255]*360000합니다. 제어 흐름이없는 경우 for 루프의 본문은 모두 같은 줄로 갈 수 있습니다. 파렌을 다음 [1]*(n+1)과 같이 면도 할 수 있습니다 [1]*-~n. i외부 for 루프에서 사용하지 않기 때문에 코드 nexec"code;"*n) 번 실행하는 것이 더 짧습니다 . 나는 파 렌스를 for i in(0,1)제거 할 수 있다고 생각합니다 .
xnor

6

슈퍼 콜 리더-106

SuperCollider 는 음악을 생성하기위한 언어이지만 그래픽을 한 번에 할 수 있습니다.

f={|n,p,r,l|Window().front.drawHook_({{Pen.addRect(Rect(x(p=l.choose*(1-r)+(p*r)),p.y,1,1))}!n;Pen.fill})}

몇 바이트를 절약하기 위해 모호한 구문 단축키를 사용했습니다.보다 읽기 쉽고 메모리 효율적인 버전입니다.

f={|n,p,r,l|Window().front.drawHook_({n.do{Pen.addRect(Rect(p.x,p.y,1,1));p=l.choose*(1-r)+(p*r)};Pen.fill})}

109 자

Mathematica 예제와 마찬가지로 600x600 픽셀을 얻으려면 창의 크기를 수동으로 조정해야합니다. 이 작업을 수행 할 때 다시 그릴 때까지 기다려야합니다.

이것은 기본적인 Sierpinsky 삼각형을 생성합니다 (이전에 보았 기 때문에 표시되지 않음)

f.(20000,100@100,0.5,[0@600,600@600,300@0])

이것은 일종의 Sierpinsky pentagon 유형을 만듭니다.

f.(100000,100@100,1-(2/(1+sqrt(5))),{|i| (sin(i*2pi/5)+1*300)@(1-cos(i*2pi/5)*300)}!5)

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

6 포인트가있는 동일한 것은 중간에 거꾸로 된 Koch 눈송이를 남깁니다.

f.(100000,100@100,1/3,{|i| (sin(i*2pi/6)+1*300)@(1-cos(i*2pi/6)*300)}!6)

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

마지막으로 에이스의 답변에서 나온 3D 피라미드에 대한 리프가 있습니다. (쉐이딩 효과를 얻기 위해 점 중 하나를 두 번 사용했습니다.)

f.(150000,100@100,0.49,[300@180, 0@500,0@500,350@400,600@500,250@600])

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


6

파이썬 189 183 175

편집 : 반전 r 비율을 고정하고 몇 바이트를 절약하기 위해 흑백 이미지로 전환했습니다.

포인트 수를로 n, 첫 번째 포인트를로 p, 비율을로 r및 포인트 목록을 로 취합니다 l. 베개 모듈이 필요합니다.

import random,PIL.Image as I
s=850
def c(n,p,r,l):
    i=I.new('L',(s,s));x,y=p;
    for j in range(n):w,z=random.choice(l);w*=r;z*=r;x,y=x-x*r+w,y-y*r+z;i.load()[x,s-y]=s
    i.show()

예 :

이미지의 중심 주위에 원으로 점을 생성하고 있습니다

points = [(425+s*cos(a)/2, 425+s*sin(a)/2) for a in frange(.0, 2*pi, pi/2)]
c(1000000, (425, 425), 0.4, points)

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

XOXO 반복, 비율을 0.4에서 0.6으로 변경

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

스노우 플레이크의 일종

stars = [(425+s*cos(a)/2,425+s*sin(a)/2) for a in frange(.0,2*pi, pi/4)]
c(1000000, (425, 425), 0.6, stars)

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


거꾸로 r을 고치는 것에 대해서는 몰랐지만 이것을 사용하여 프로그램을 만들어서 몇 개의 문자를 저장할 수 있습니다 n,p,r,l=input(). *=작업 에서 브래킷을 제거하고 사용할 수도 있습니다 import random as R.
FryAmTheEggman

불행하게도, 내 대답의 무효화에 최적화 수정 @FryAmTheEggman *=. :( input일하기 좋은 직장에 매우 불쾌한 일이 될 것이며, 가져 오기가 현재 가능한 가장 간결한 형태 (또는이 내가 뭔가를 놓친?).
TEH internets이 이루어진다 의 catz

나는 라인이 될 수 있습니다 확신 import random as R,PIL.Image as I하고 random.choice할 수있다 R.choice. 예, 입력을 사용하는 것은 절름발이이지만 테스트를 위해 기능 버전을 사용하고 input()더 나은 점수를 얻기 위해 기능 버전을 게시 할 수 있습니다 !! 1! : P
FryAmTheEggman

아, 랜덤을 정의하면 실제로 0자를 ​​저장한다는 것을 알았습니다. 어쨌든, 나는 수학이 당신의 친구라는 것을 깨달았습니다 : y=x*(1-r)+w== y=x-x*r-w.
FryAmTheEggman

@FryAmTheEggman 내 요점은 : p. 그러나 수학 주셔서 감사합니다.
인터넷은 catz

4

자바 스크립트 (407) (190)

JS =에 익숙하지 않기 때문에 내 스크립트와 골프에 대한 피드백을 얻을 수있어서 기쁘다.)

입력 읽기 ( edc65 의 항목 과 비교하기 위해 입력을 계산하지 않습니다.) :

p=prompt;n=p();[x,y]=p().split(',');r=p();l=p().split(';').map(e=>e.split(','));

캔버스 설정 및 계산

d=document;d.body.appendChild(c=d.createElement('canvas'));c.width=c.height=1000;c=c.getContext('2d');
for(;n--;c.fillRect(x,y,2,2),[e,f]= l[Math.random()*l.length|0],x-=x*r-e*r,y-=y*r-f*r);

좀 더 ungolfed (실제 입력 promts가 방금 주석 처리 된 즉시 사용할 수있는 입력 예제 포함) :

p=prompt;
n=p('n','4000');
[x,y]=p('start','1,1').split(',');
r=p('r','0.5');
l=p('list','1,300;300,1;300,600;600,300').split(';').map(e=>e.split(','));d=document;
d.body.appendChild(c=d.createElement('canvas'));
c.width=c.height=1000;c=c.getContext('2d');
for(;n--;c.fillRect(x,y,2,2),[e,f]= l[Math.random()*l.length|0],x-=x*r-e*r,y-=y*r-f*r);

for(k = 0; k<50; k++){
rad = 10;
l.push([350+rad*k*Math.cos(6.28*k/10),350+rad*k*Math.sin(6.28*k/10)]);
}
r = 1.13;

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

r = 0.5;list = [[1,1],[300,522],[600,1],[300,177]];

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

r = 0.5
list = [[350+350*Math.sin(6.28*1/5),350+350*Math.cos(6.28*1/5)],
[350+350*Math.sin(6.28*2/5),350+350*Math.cos(6.28*2/5)],
[350+350*Math.sin(6.28*3/5),350+350*Math.cos(6.28*3/5)],
[350+350*Math.sin(6.28*4/5),350+350*Math.cos(6.28*4/5)],
[350+350*Math.sin(6.28*5/5),350+350*Math.cos(6.28*5/5)],


[350+90*Math.sin(6.28*1.5/5),350+90*Math.cos(6.28*1.5/5)],
[350+90*Math.sin(6.28*2.5/5),350+90*Math.cos(6.28*2.5/5)],
[350+90*Math.sin(6.28*3.5/5),350+90*Math.cos(6.28*3.5/5)],
[350+90*Math.sin(6.28*4.5/5),350+90*Math.cos(6.28*4.5/5)],
[350+90*Math.sin(6.28*5.5/5),350+90*Math.cos(6.28*5.5/5)]];

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


무슨 뜻인가요?
flawr

말해줘서 고마워요. 제출물을 곧 업데이트하겠습니다!
flawr

내 대답을 연결했지만 캔버스 설정을 계산합니다. 함수를 호출하는 단일 행을 계산하지 않습니다. 어쨌든 멋진 이미지, 특히 첫 번째 이미지.
edc65

아, 나는 그것을 '비교 가능하게'하고 싶었지만 JS에만 의존하려고 할 때 어렵습니다 =) @ MartinBüttner 업데이트되었습니다. 지금은 많은 것을 제거 할 수있는 올바른 방법을 이해했습니다. garbage =)
flawr

3

가공, 153

@Geobits의 Java 답변을 Processing에 이식하고 더 많은 골프를 타면서 100자를 줄였습니다. 원래 프로세스에 애니메이션을 적용하려고했지만 입력 제약 조건이 너무 가혹합니다 (프로세싱에는 stdin 또는 argv가 없으므로 처리의 기본 draw()루프 를 사용하는 대신 자체 함수를 작성해야 함 ).

void d(float[]a){int v;size(600,600);for(float i=0,x=a[1],y=a[2];i++<a[0];v=(int)random(a.length/2-2),point(x+=(a[v*2+4]-x)*a[3],y+=(a[v*2+5]-y)*a[3]));}

줄 바꿈이있는 완전한 프로그램 :

void setup() {
  d(new float[]{100000,300,300,.7,0,600,600,0,600,600,0,0,400,400,200,200,400,200,200,400}); 
}
void d(float[]a){
  int v;
  size(600,600);
  for(float i=0,x=a[1],y=a[2];
      i++<a[0];
      v=(int)random(a.length/2-2),point(x+=(a[v*2+4]-x)*a[3],y+=(a[v*2+5]-y)*a[3]));
}

위의 프로그램은 십자가를 제공합니다 : 여기에 이미지 설명을 입력하십시오

d(new float[]{100000,300,300,.65,142,257,112,358,256,512,216,36,547,234,180,360}); 

이것은 피라미드를 제공합니다 : 여기에 이미지 설명을 입력하십시오

d(new float[]{100000,100,500,.5,100,300,500,100,500,500});

이것은 Sierpinski 삼각형을 제공합니다 : 여기에 이미지 설명을 입력하십시오


4
나는 피라미드의 3D 효과를 좋아합니다. :)
Martin Ender

1

Ungolfed "참조 구현", Python

업데이트 : 훨씬 빠르고

대화식 쉘을 확인하십시오!

파일을 편집 및 설정 interactiveTrue한 후 다음 중 하나를 수행합니다 :

polygon numberOfPoints numeratorOfWeight denominatorOfWeight startX startY numberOfSides 다각형을 생성, 저장 및 표시합니다.

points numberOfPoints numeratorOfWeight denominatorOfWeight startX startY point1X point1Y point2X point2Y ... 사양이 요구하는 것을 수행합니다.

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

import matplotlib.pyplot as plt
import numpy as np
from fractions import Fraction as F
import random
from matplotlib.colors import ColorConverter
from time import sleep
import math
import sys
import cmd
import time

def plot_saved(n, r, start, points, filetype='png', barsize=30, dpi=100, poly=True, show=False):
    printed_len = 0

    plt.figure(figsize=(6,6))
    plt.axis('off')

    start_time = time.clock()
    f = F.from_float(r).limit_denominator()

    spts = []
    for i in range(len(points)):
        spts.append(tuple([round(points[i].real,1), round(points[i].imag,1)]))

    if poly:
        s = "{}-gon ({}, r = {}|{})".format(len(points), n, f.numerator, f.denominator)
    else:
        s = "{} ({}, r = {}|{})".format(spts, n, f.numerator, f.denominator) 

    step = math.floor(n / 50)

    for i in range(len(points)):
        plt.scatter(points[i].real, points[i].imag, color='#ff2222', s=50, alpha=0.7)

    point = start
    t = time.clock()

    xs = []
    ys = []

    for i in range(n+1):
        elapsed = time.clock() - t
        #Extrapolation
        eta = (n+1-i)*(elapsed/(i+1))
        printed_len = rewrite("{:>29}: {} of {} ({:.3f}%) ETA: {:.3f}s".format(
                s, i, n, i*100/n, eta), printed_len)
        xs.append(point.real)
        ys.append(point.imag)
        point = point * r + random.choice(points) * (1 - r)

    printed_len = rewrite("{:>29}: plotting...".format(s), printed_len)
    plt.scatter(xs, ys, s=0.5, marker=',', alpha=0.3)

    presave = time.clock()
    printed_len = rewrite("{:>29}: saving...".format(s), printed_len)
    plt.savefig(s + "." + filetype, bbox_inches='tight', dpi=dpi)

    postsave = time.clock()
    printed_len = rewrite("{:>29}: done in {:.3f}s (save took {:.3f}s)".format(
                            s, postsave - start_time, postsave - presave),
                            printed_len)

    if show:
        plt.show()
    print()
    plt.clf()

def rewrite(s, prev):
    spaces = prev - len(s)
    sys.stdout.write('\r')
    sys.stdout.write(s + ' '*(0 if spaces < 0 else spaces))
    sys.stdout.flush()
    return len(s)

class InteractiveChaosGame(cmd.Cmd):
    def do_polygon(self, args):
        (n, num, den, sx, sy, deg) = map(int, args.split())
        plot_saved(n, (num + 0.0)/den, np.complex(sx, sy), list(np.roots([1] + [0]*(deg - 1) + [-1])), show=True)

    def do_points(self, args):
        l = list(map(int, args.split()))
        (n, num, den, sx, sy) = tuple(l[:5])
        l = l[5:]
        points = []
        for i in range(len(l)//2):
            points.append(complex(*tuple([l[2*i], l[2*i + 1]])))
        plot_saved(n, (num + 0.0)/den, np.complex(sx, sy), points, poly=False, show=True)

    def do_pointsdpi(self, args):
        l = list(map(int, args.split()))
        (dpi, n, num, den, sx, sy) = tuple(l[:6])
        l = l[6:]
        points = []
        for i in range(len(l)//2):
            points.append(complex(*tuple([l[2*i], l[2*i + 1]])))
        plot_saved(n, (num + 0.0)/den, np.complex(sx, sy), points, poly=False, show=True, dpi=dpi)

    def do_default(self, args):
        do_generate(self, args)

    def do_EOF(self):
        return True

if __name__ == '__main__':
    interactive = False
    if interactive:
        i = InteractiveChaosGame()
        i.prompt = ": "
        i.completekey='tab'
        i.cmdloop()
    else:
        rs = [1/2, 1/3, 2/3, 3/8, 5/8, 5/6, 9/10]
        for i in range(3, 15):
            for r in rs:
                plot_saved(20000, r, np.complex(0,0), 
                            list(np.roots([1] + [0] * (i - 1) + [-1])), 
                            filetype='png', dpi=300)

이것을 실행하지 않으면 멋진 것이 무엇인지 모릅니다 . 아마도 짧은 것과 다른 점을 설명하거나 그림을 보여줄 수 있습니까?
Geobits

@Geobits는 면책 조항 및 사진 :) 포함하도록 편집
Soham Chowdhury

4
ungolfed 코드 게시 하는 것은 기술적으로 "답이 아님"이므로 다른 답변에 별도의 제목 (예 : Ungolfed Reference Implementation)으로이 정보를 포함시키는 것이 좋습니다.
Martin Ender

-2

파이썬 (202 자)

점 개수를 n, 평균 가중치를 r, 시작점을 a tuple s및 점 목록을 tuple이라는 XY 목록으로 사용 l합니다.

import random as v,matplotlib.pyplot as p
def t(n,r,s,l):
 q=complex;s=q(*s);l=[q(*i)for i in l];p.figure(figsize=(6,6))
 for i in range(n):p.scatter(s.real,s.imag,s=1,marker=',');s=s*r+v.choice(l)*(1-r)
 p.show()

@ MartinBüttner 특정 유형의 입력을 사용하고 있다는 사실이 사양을 충족합니까?
Soham Chowdhury

1
또한 내 컴퓨터에서 결과는 600x600 픽셀이 아니며 x와 y의 길이 스케일이 다르며 점은 1 픽셀 이상을 차지합니다.
Martin Ender
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.