เล่นเกม Chaos


28

ความโกลาหลเกมเป็นวิธีที่ง่ายในการสร้าง fractals เมื่อกำหนดจุดเริ่มต้นอัตราส่วนความยาวrและชุดของจุด 2D ให้ทำดังนี้:

  • จากชุดคะแนนของคุณเลือกหนึ่งโดยการสุ่ม (เหมือนกัน)
  • ค่าเฉลี่ยจุดนั้นและจุดดึงสุดท้าย (หรือจุดเริ่มต้น) โดยใช้rและ1 - rเป็นน้ำหนัก (เช่นr = 0หมายถึงคุณได้รับจุดเริ่มต้นr = 1หมายถึงคุณได้รับจุดสุ่มและr = 0.5หมายความว่าคุณ รับจุดกึ่งกลางในระหว่าง.)
  • วาดจุดผลลัพธ์

ตัวอย่างเช่นหากคุณเลือกจุดยอดของรูปสามเหลี่ยมด้านเท่าและr = 0.5จุดที่พล็อตจะแมปสามเหลี่ยม Sierpinski:

ป้อนคำอธิบายรูปภาพที่นี่

พบรูปภาพใน Wikipedia

คุณต้องเขียนโปรแกรมหรือฟังก์ชั่นที่ "เล่น" เกมความโกลาหลเพื่อสร้างเศษส่วน

อินพุต

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นและรับอินพุตต่อไปนี้ผ่าน ARGV, STDIN หรืออาร์กิวเมนต์ของฟังก์ชัน:

  • จำนวนคะแนนที่จะพล็อต
  • พิกัดเริ่มต้น (ซึ่งต้องมีการพล็อตด้วย!)
  • น้ำหนักเฉลี่ยRในช่วง[0,1]
  • รายการคะแนนที่จะเลือก

เอาท์พุต

คุณสามารถแสดงผลบนหน้าจอหรือเขียนไฟล์ภาพ หากผลเป็น rasterised จะต้องมีอย่างน้อย 600 พิกเซลในแต่ละด้านทุกจุดจะต้องอยู่บนผืนผ้าใบและอย่างน้อย 75% ของขอบเขตแนวนอนและแนวตั้งของภาพจะต้องใช้สำหรับจุด (เพื่อหลีกเลี่ยง คำตอบด้วยพิกเซลสีดำเดียวบอกว่า "มันซูมออกไปไกลมาก") xและy ที่แกนจะต้องอยู่ในระดับเดียวกัน (นั่นคือเส้นจาก (0,0) ถึง (1,1) จะต้องมีที่มุม 45 องศา) และจุดที่พล็อตในเกมวุ่นวายแต่ละคนจะต้องแสดงเป็นหนึ่งเดียว พิกเซล (หากวิธีการวางแผนของคุณต่อต้านจุดแทนนามแฝงอาจมีการแพร่กระจายเกิน 2x2 พิกเซล)

สีเป็นตัวเลือกของคุณ แต่คุณต้องการอย่างน้อยสองสีที่แตกต่าง: หนึ่งสำหรับพื้นหลังและหนึ่งสำหรับจุดที่พล็อตระหว่างเกมความโกลาหล คุณอาจ แต่ไม่ต้องพล็อตจุดป้อนข้อมูล

โปรดใส่ตัวอย่างผลลัพธ์ที่น่าสนใจสามข้อในคำตอบของคุณ

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ

แก้ไข:คุณไม่จำเป็นต้องพล็อตจุดอินพุตอีกต่อไปเนื่องจากไม่สามารถมองเห็นเป็นพิกเซลเดียว


" แต่ละจุดที่พล็อต ... ต้องแสดงเป็นพิกเซลเดียว " หมายความว่าอะไร a) ไม่ควรใช้ anti-aliasing หรือ b) จำนวนคะแนนในสีที่สองจะต้องเท่ากับรายการแรกจากการป้อนข้อมูลหรือไม่ โปรดทราบว่า b) เป็นไปไม่ได้ที่จะรับประกันเว้นแต่ว่าขั้นตอนการทำซ้ำมีการทดสอบสำหรับ "พิกเซลนี้ไม่ตรงกับที่วางแผนไว้ก่อนหน้าหรือไม่" เพราะถ้าตัวเลือกตัวเลขสุ่มเลือกจุดเดียวกันเวลาในแถวจากนั้นตำแหน่งจะมาบรรจบกัน จุดนั้น
Peter Taylor

@PeterTaylor มันมีจุดประสงค์เพื่อหลีกเลี่ยงคนที่พล็อตจุดใหญ่ตามที่กำหนด (เช่น Mathematica ทำตามค่าเริ่มต้น) แต่ฉันสังเกตเห็นแล้วว่าการลบสมนามทำให้เกิดปัญหากับการรับประกันพิกเซลเดียวในคำตอบของ Soham ฉันคิดว่าฉันจะผ่อนคลายสิ่งนี้เพื่อ "ต้องไม่ใหญ่กว่า 2x2 พิกเซล" ซึ่งควรครอบคลุมปัญหาการลบรอยหยักทั้งหมด
Martin Ender

ฉันคิดว่าฉันเข้าใจผิดบางอย่าง: คุณมักจะใช้ 'ค่าเฉลี่ย' ของจุดสุดท้ายที่คุณพล็อตและจุดสุ่มของรายการปัจจุบัน จากนั้นคุณเพิ่มจุดใหม่นั้นลงในรายการ ถูกต้องหรือไม่ ดูเหมือนว่าหากคุณมีคะแนนมากมายใน 'มุม' คุณจะได้รับมากกว่านั้น แต่ก็ไม่น่าจะหลุดออกจากคลาวด์นั้น - อย่างน้อยโค้ดของฉันมักจะ 'ลู่เข้าใกล้จุดที่ใกล้เคียงกันมากเกินไป ปรับปรุงภาพให้ดีขึ้น
ข้อบกพร่อง

1
@ ไม่ถูกต้องคุณไม่ต้องเพิ่มจุดใหม่ในรายการ รายการได้รับการแก้ไข - อัลกอริธึมใส่ใจเฉพาะจุดสุดท้ายที่ถูกพล็อตไม่ใช่สิ่งที่อยู่ก่อนหน้า
นาธาเนียล

ขอบคุณที่อธิบายได้มากอาจจะต้องอธิบายให้ชัดเจนในคำถาม
ข้อบกพร่อง

คำตอบ:


8

Mathematica, 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 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)และใช้ฟังก์ชั่น (vectorial) ในการโต้แย้งแรกไปยังจุดต่อเนื่องแต่ละจุดในที่สุดก็ส่งคืนรายการของคะแนนที่คำนวณได้ทั้งหมดที่จะถูกพล็อตโดย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]

กราฟิกทางคณิตศาสตร์


@ MartinBüttner Instructions for testing this answer without Mathematica installed:1) ดาวน์โหลดนี้จาก Pastebin และบันทึกเป็น * .CDF 2) ดาวน์โหลดและติดตั้งสภาพแวดล้อม CDF ฟรีจากวุลแฟรมวิจัยที่ (ไม่ได้เป็นไฟล์ขนาดเล็ก) สนุก. บอกฉันว่ามันใช้งานได้!
ดร. เบลิซาเรี

รุ่นที่เล่นกอล์ฟของคุณใช้งานไม่ได้ (อย่างน้อยใน V10): คุณต้องสลับ#rไปที่r#จะออกไปโดยไม่มีที่ว่างหรือ*ระหว่างนั้น
Martin Ender

@ MartinBüttnerอยากรู้อยากเห็น! มันใช้งานได้อย่างมีเสน่ห์ใน v9 (ฉันยังไม่มี v10) อย่างไรก็ตามผม (สุ่มสี่สุ่มห้า) สลับและ# r
ดร. เบลิซาเรี

มันเป็นคุณสมบัติใหม่ ตอนนี้คุณสามารถใช้ฟังก์ชั่นกับการเชื่อมโยงซึ่งในกรณีนี้คุณจะได้รับพารามิเตอร์ที่มี#keyชื่อ ฉันแน่ใจว่าจะมีประโยชน์ :)
Martin Ender

8

Java: 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();
    }
}

จุดอินพุตการวาดถูกลบออกจากข้อกำหนด (yay 80 bytes!) พวกเขายังคงแสดงในภาพหน้าจอเก่าด้านล่าง แต่จะไม่ปรากฏขึ้นหากคุณเรียกใช้ ดูประวัติการแก้ไขหากสนใจ

อินพุตถูกกำหนดเป็นอาร์เรย์ของลอย 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

ป้อนคำอธิบายรูปภาพที่นี่

Octochains

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

ป้อนคำอธิบายรูปภาพที่นี่


มันใช้งานไม่ได้ในคอมพิวเตอร์ของฉันและจาวาบ่นshowก็เลิกใช้แล้ว
ภูมิใจ haskeller

@proudhaskeller show() จะเลิก แต่ก็ยังคงทำงาน เมื่อคุณพูดว่า "ใช้งานไม่ได้" หมายความว่าอย่างไร หากคุณไม่มี Java 8 คุณจะต้องเพิ่ม a finalลงString[]aใน main อย่างน้อย
Geobits

ส่งคำตอบของคุณไปยังการประมวลผลและตัด 100 ตัวอักษร
user12205

1
@ace Nice คุณสามารถทำได้ด้วยสวยมาก ๆ กอล์ฟ Java สำหรับการส่งออกกราฟิก แต่ฉันเหมือนว่ามันเป็นตรง 100 ตัวอักษร: D
Geobits

7

JavaScript (E6) + Html 173 176 193

แก้ไข: ตัดใหญ่ขอบคุณ William Barbosa

แก้ไข: น้อยกว่า 3 ไบต์ขอบคุณ DocMax

173 ไบต์นับฟังก์ชั่นและองค์ประกอบผ้าใบที่จำเป็นในการแสดงผลลัพธ์

ทดสอบบันทึกเป็นไฟล์ html และเปิดใน FireFox

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 ไบต์ฉันไม่เข้าใจการนับของคุณ
William Barbosa

@WilliamBarbosa การนับของฉันถูกต้องตามคำตอบของฉัน ด้วยคำแนะนำของคุณมันจะดีขึ้น - ขอบคุณ!
edc65

1
คุณสามารถโกนได้อีกสองครั้งหากคุณย้ายการกำหนดค่าเริ่มต้นขนาดและอัพเดต y ไปยังการforโทร:for(C.width=C.height=600;n--;y-=(y-p[i+1])*r)
DocMax

6

Python - 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 เขียนผลลัพธ์ไปยัง stdout เป็นไฟล์ pgm nคือการวนซ้ำsจุดเริ่มต้นrคือ r และ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)]

อักขระ Python ทั่วไปบางตัวบันทึก: ค่าเริ่มต้นเช่นp=[255]*360000สามารถไปเป็นพารามิเตอร์ทางเลือกสำหรับฟังก์ชัน เนื้อความของ for loop สามารถไปบนบรรทัดเดียวกันได้หากไม่มีการควบคุมโฟลว์ คุณสามารถโกน parens จาก[1]*(n+1)เป็น[1]*-~n; เนื่องจากคุณไม่ได้ใช้งานiด้านนอกสำหรับการวนซ้ำมันจึงสั้นกว่าที่จะเรียกใช้รหัสเป็นnเวลาexec"code;"*n) ฉันคิดว่า parens in for i in(0,1)สามารถลบออกได้
xnor

6

SuperCollider - 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 ชนิดหนึ่ง:

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)

ป้อนคำอธิบายรูปภาพที่นี่

สุดท้ายนี่คือ riff ของปิรามิด 3 มิติจากคำตอบของเอซ (โปรดทราบว่าฉันใช้จุดใดจุดหนึ่งสองครั้งเพื่อรับเอฟเฟกต์การแรเงา)

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

ป้อนคำอธิบายรูปภาพที่นี่


6

Python, 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)

ป้อนคำอธิบายรูปภาพที่นี่


Dunno เกี่ยวกับการแก้ไขไปข้างหลังrสิ่ง n,p,r,l=input()แต่คุณสามารถบันทึกค่อนข้างไม่กี่ตัวอักษรโดยการนี้โปรแกรมที่ใช้ คุณยังสามารถลบวงเล็บออกจาก*=การใช้งานและการใช้งานimport random as Rได้
FryAmTheEggman

@FryAmTheEggman แต่น่าเสียดายที่การแก้ไขคำตอบของฉันเลิกการเพิ่มประสิทธิภาพใน*=. :( inputสิ่งที่จะดีไม่เป็นที่พอใจมากที่จะทำงานด้วยและนำเข้าปัจจุบันเป็นรูปแบบที่รัดกุมมากที่สุด (หรือมีฉันพลาดอะไรบางอย่าง?).
internets Teh ทำ ของ catz

ฉันค่อนข้างมั่นใจว่าบรรทัดimport random as R,PIL.Image as Iนั้นrandom.choiceจะเป็นR.choiceไปได้ ใช่การใช้งานอินพุทเป็นง่อย แต่คุณสามารถใช้เวอร์ชั่นฟังก์ชั่นสำหรับการทดสอบและโพสต์input()หนึ่งเพื่อให้ได้คะแนนที่ดีขึ้น !! 1! : P
FryAmTheEggman

โอ้ฉันเพิ่งสังเกตเห็นการกำหนดแบบสุ่มจริง ๆ บันทึก 0 อักขระ อ๊ะ: S อย่างไรก็ตามผมยังตระหนักว่าคณิตศาสตร์เป็นเพื่อนของคุณ: ==y=x*(1-r)+w y=x-x*r-w
FryAmTheEggman

@FryAmTheEggman นั่นคือประเด็นของฉัน: p แต่ขอบคุณสำหรับคณิตศาสตร์
อินเตอร์เน็ตทำจาก catz

4

จาวาสคริปต์(407) (190)

ฉันมีความสุขที่ได้รับข้อเสนอแนะเกี่ยวกับสคริปต์ของฉันและในการเล่นกอล์ฟเนื่องจากฉันไม่สะดวกกับ JS =) (รู้สึกอิสระที่จะใช้สิ่งนี้ / เปลี่ยนมันสำหรับการส่งของคุณเอง!)

กำลังอ่านอินพุต (เปรียบได้กับedc65 's entry ฉันไม่นับอินพุต):

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

การตั้งค่าและการคำนวณ Canvas

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)]];

ป้อนคำอธิบายรูปภาพที่นี่


คุณหมายถึงอันไหน
ข้อบกพร่อง

โอ้ขอบคุณที่บอกฉันฉันจะอัปเดตการส่งเร็ว ๆ นี้!
ข้อบกพร่อง

คุณเชื่อมโยงคำตอบของฉัน แต่ฉันนับการตั้งค่าผืนผ้าใบ ฉันไม่นับบรรทัดเดียวที่เรียกใช้ฟังก์ชัน รูปภาพสวยดีโดยเฉพาะภาพแรก
edc65

ฉันไม่ได้สังเกตว่าฉันต้องการทำให้มัน 'เปรียบได้' แต่มันยากเมื่อฉันพยายามพึ่งพา JS เท่านั้น =) @ MartinBüttnerอัปเดตตอนนี้ฉันเข้าใจแล้วว่ามันถูกวิธีที่ฉันสามารถกำจัดสิ่งต่างๆ ขยะ =)
ข้อบกพร่อง

3

กำลังดำเนินการ 153

Ported @Geobits 'Java ตอบการประมวลผลและเล่นกอล์ฟเพิ่มขึ้นส่งผลให้ลด 100 chars เดิมทีฉันตั้งใจจะทำให้กระบวนการเคลื่อนไหว แต่ข้อ จำกัด ในการป้อนข้อมูลนั้นรุนแรงเกินไป (การประมวลผลไม่มี 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]));
}

โปรแกรมด้านบนให้ Crosses: ป้อนคำอธิบายรูปภาพที่นี่

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

อัปเดต : เร็วกว่ามาก (โดยคำสั่งของขนาด)

ลองดูเปลือกโต้ตอบ!

แก้ไขไฟล์และตั้งค่าinteractiveเป็นTrueจากนั้นเลือกทำอย่างใดอย่างหนึ่งต่อไปนี้:

polygon numberOfPoints numeratorOfWeight denominatorOfWeight startX startY numberOfSides สร้างบันทึกและแสดงรูปหลายเหลี่ยม

points numberOfPoints numeratorOfWeight denominatorOfWeight startX startY point1X point1Y point2X point2Y ... ทำในสิ่งที่ spec ร้องขอ

ป้อนคำอธิบายรูปภาพที่นี่

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 Reference Implementation) ในคำตอบอื่นของคุณเนื่องจากการโพสต์เฉพาะโค้ด ungolfed นั้นเป็นเทคนิค "ไม่ใช่คำตอบ"
Martin Ender

-2

Python (202 ตัวอักษร)

ใช้เวลาจำนวนจุดเป็นnน้ำหนักเฉลี่ยเป็นrจุดเริ่มต้นในฐานะtuple sและรายชื่อของจุดที่เป็นรายการของ XY ที่เรียกว่าtuplel

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.