ภาพ Mandelbrot ในทุกภาษา


91

ฉันมักจะใช้รูปMandelbrotเป็น Hello World ในรูปแบบกราฟิกในแอปพลิเคชันกราฟิกใด ๆ ที่ฉันได้รับ ตอนนี้ก็ถึงตาคุณแล้ว

  • ภาษาต้องมีความสามารถในการแสดงผลกราฟิกหรือแผนภูมิรูปวาด (ไม่อนุญาตให้บันทึกไฟล์)
  • แสดงรูปภาพสี่เหลี่ยมหรือกราฟ ขนาดอย่างน้อย 128 และสูงสุด 640 ทั่วทุกมุม *
  • พิกัดเศษส่วนอยู่ในช่วงประมาณ -2-2i ถึง 2 + 2i
  • พิกเซลด้านนอกของชุด Mandelbrot ควรเป็นสีตามจำนวนการวนซ้ำก่อนขนาดเกิน 2 (ไม่รวม * ขาวดำ)
  • การนับซ้ำแต่ละครั้งจะต้องมีสีที่ไม่ซ้ำกัน * และสีที่อยู่ใกล้เคียงควรแยกแยะได้ง่ายกว่าด้วยตา
  • พิกเซลอื่น ๆ (น่าจะเป็นภายในชุด Mandelbrot) จะต้องเป็นสีดำหรือขาว
  • ซ้ำอย่างน้อย 99 ครั้ง
  • ไม่อนุญาตให้ใช้ศิลปะ ASCII

* ยกเว้นในบางแพลตฟอร์มเท่านั้นเช่นเครื่องคิดเลขแบบกราฟิก

อนุญาต:
ได้รับอนุญาต
ไม่อนุญาต:
ไม่ได้รับอนุญาต
(ภาพหด)

เงื่อนไขการชนะ:

รุ่นที่สั้นที่สุด (ขนาดเป็นไบต์) สำหรับแต่ละภาษาจะได้รับการกล่าวถึงในโพสต์นี้เรียงตามขนาด
ไม่มีคำตอบที่จะ 'ยอมรับ' ด้วยปุ่ม

ลีดเดอร์บอร์ด:


8
"แยกความแตกต่างได้ง่ายด้วยตา" เป็นการยากที่จะทำให้วัตถุประสงค์ ... นอกจากนี้นอกเหนือจากความสัมพันธ์ส่วนตัวของคุณทั้งสองชุด Mandelbrot ไม่มีส่วนเกี่ยวข้องกับ Hello World ดังนั้นจึงเป็นการดีที่สุดที่จะละเว้นสิ่งนั้นจากชื่อเรื่องเว้นแต่คุณจะหลอกหลอนเครื่องมือค้นหาโดยเจตนา
Jonathan Van Matre

1
ที่เกี่ยวข้อง: ASCII Mandelbrot (แม้ว่าบางคำตอบที่โพสต์นั้นจะไม่มี ASCII และน่าจะเหมาะสมกว่าสำหรับคำตอบของคำถามนี้)
Peter Taylor

3
ฉันเคยเห็นบางคนพูดถึงว่าพวกเขาทำให้ Mandelbrot เป็น "Hello World" ฉันก็ทำอย่างนั้นมา 30 ปีแล้ว Mandelbrot เป็น "Hello World" ที่สมบูรณ์แบบเพราะมันแสดงให้เห็นว่าคุณมีการเข้าถึงพิกเซลในการแสดงผลและให้ความรู้สึกที่ดีในการคำนวณประสิทธิภาพที่ถูกผูกไว้บนแพลตฟอร์มใหม่
Roger Dahl

6
ความคิดที่ดีในการถามคำถามที่ต้องมีการผสมผสานระหว่างความไวทางคณิตศาสตร์และสุนทรียศาสตร์จากนั้นจึงกำหนดการตัดสินใจการออกแบบล่วงหน้าทั้งหมด
jwg

3
ทุกคนสามารถสร้างหนึ่งใน brainfuck WINS ได้ฉันจะบอกว่า: D
MadTux

คำตอบ:


94

Sharp EL-9300 เครื่องคิดเลขกราฟิก, 296 ไบต์

นี่คือเครื่องคิดเลขกราฟของโรงเรียนมัธยมของฉันเริ่มขึ้นเมื่อ 20 ปีก่อน! ฉันจำได้ว่าเขียนตัวสร้างแมนเดอร์บอตสำหรับมันย้อนกลับไปแล้ว และแน่นอนมันยังอยู่ในหน่วยความจำ NV:

ClrG
DispG
Range -2.35,2.35,.5,-1.55,1.55,0.5
y=-1.55
Label ly
x=-2.35
Label lx
n=1
zx=0
zy=0
Label ln
tzx=zx²-zy²+x
zy=(2*zx*zy)+y
zx=tzx
If zx²+zy²>4Goto esc
n=n+1
If n<20Goto ln
Label esc
If fpart (n/2)=0Goto npl
Plot x,y
Label npl
x=x+.05
If x<=2.35Goto lx
y=y+.05
If y<=1.55Goto ly
Wait

การแสดงผลใช้เวลาประมาณ 90 นาที

นี่คือ ungolfed โดยสิ้นเชิง ฉันแน่ใจว่าฉันสามารถประหยัดพื้นที่ได้นิดหน่อย แต่ฉันแค่อยากแบ่งปันความอยากรู้ทางประวัติศาสตร์นี้!

ฉันชอบที่งบการควบคุมเดียวที่มีให้คือgotos

นี่คือภาพถ่าย ฉันไม่มีวิธีอื่นใดเพื่อให้ได้ผลลัพธ์กราฟิก: ป้อนคำอธิบายรูปภาพที่นี่


1
ฉันด้วย แต่หน่วยความจำ NV ของฉันว่างเปล่าหลังจากผ่านไปหลายปี
Mark Jeronimus

2
zx²+zy²>4เป็นไปไม่ได้Abs(x)>2เหรอ
Mark Jeronimus

1
บางทีคุณควรจะได้รับแบตเตอรี่ใหม่ ...
NothingsImpossible

25
น่าสนใจ ดังนั้นคุณเคยเบื่อหน่ายมาพักหนึ่งแล้ว
devnull

4
Nice "ภาพหน้าจอ"
meawoppl

83

ฉันเจอสิ่งนี้เมื่อวันก่อน ฉันไม่ได้เครดิต แต่มันน่ากลัว:

Python 2:

_                                      =   (
                                        255,
                                      lambda
                               V       ,B,c
                             :c   and Y(V*V+B,B,  c
                               -1)if(abs(V)<6)else
               (              2+c-4*abs(V)**-0.4)/i
                 )  ;v,      x=1500,1000;C=range(v*x
                  );import  struct;P=struct.pack;M,\
            j  ='<QIIHHHH',open('M.bmp','wb').write
for X in j('BM'+P(M,v*x*3+26,26,12,v,x,1,24))or C:
            i  ,Y=_;j(P('BBB',*(lambda T:(T*80+T**9
                  *i-950*T  **99,T*70-880*T**18+701*
                 T  **9     ,T*i**(1-T**45*2)))(sum(
               [              Y(0,(A%3/3.+X%v+(X/v+
                               A/3/3.-x/2)/1j)*2.5
                             /x   -2.7,i)**2 for  \
                               A       in C
                                      [:9]])
                                        /9)
                                       )   )

ป้อนคำอธิบายรูปภาพที่นี่ http://preshing.com/20110926/high-resolution-mandelbrot-in-obfuscated-python/


12
ดูเหมือนจะไม่ได้รับอนุญาต: ภูมิภาคนั้นไม่สามารถแยกแยะได้ง่ายหรือแม้แต่ทั้งหมด
primo

5
นอกจากนี้สิ่งนี้เขียนไปยังไฟล์
Lie Ryan

40
ไม่ได้รับอนุญาตหรือไม่นี่เป็นสิ่งที่ยอดเยี่ยมมาก: D
Navin

18
@ DigitalTrauma ห่า +1 สำหรับการป้อนข้อมูลที่สวยที่สุด!
Brian S

19
สิ่งนี้นับว่าเป็นควินหรือไม่? ;-)
Blazemonger

47

LaTeX, 673 ไบต์

\countdef\!1\!129\documentclass{article}\usepackage[margin=0pt,papersize=\!bp]{geometry}\usepackage{xcolor,pgf}\topskip0pt\offinterlineskip\def~{99}\let\rangeHsb~\countdef\c2\countdef\d3\countdef\e4\begin{document}\let\a\advance\let\p\pgfmathsetmacro\makeatletter\def\x#1#2#3{#10
\@whilenum#1<#2\do{#3\a#11}}\d0\x\c{\numexpr~+1}{\expandafter\edef\csname\the\c\endcsname{\hbox{\noexpand\color[Hsb]{\the\d,1,1}\/}}\a\d23
\ifnum\d>~\a\d-~\fi}\def\/{\rule{1bp}{1bp}}\x\c\!{\hbox{\x\d\!{\p\k{4*\d/(\!-1)-2}\p\K{2-4*\c/(\!-1)}\def\z{0}\def\Z{0}\x\e~{\p\:{\z*\z-\Z*\Z+\k}\p\Z{2*\z*\Z+\K}\let\z\:\p\:{\z*\z+\Z*\Z}\ifdim\:pt>4pt\csname\the\e\endcsname\e~\fi}\ifnum\e=~\/\fi}}}\stop

ผลลัพธ์ 129x129 (129 × 129)

รูปภาพ PDF ประกอบด้วยหน่วยสี่เหลี่ยมสีที่มีขนาด 1bp × 1bp

Ungolfed

% count register \size contains the width and height of the square
\countdef\size=1
\size=31
\documentclass{article}
\usepackage[margin=0pt,papersize=\size bp]{geometry}
\usepackage{xcolor,pgf}
\topskip0pt
\offinterlineskip
\def\iterations{99}
\let\rangeHsb\iterations
\countdef\c2
\countdef\d3
\countdef\e4
\begin{document}
\let\p\pgfmathsetmacro
\makeatletter
% \Loop: for (#1 = 0; #1 < #2; #1++) {#3}
\def\Loop#1#2#3{%
  #1=0
  \@whilenum#1<#2\do{#3\advance#11}%
}
\d0%
\Loop\c{\numexpr\iterations+1\relax}{%
  \expandafter\edef\csname\the\c\endcsname{%
    \hbox{\noexpand\color[Hsb]{\the\d,1,1}\noexpand\pixel}%
  }%
  \advance\d23 \ifnum\d>\iterations\advance\d-\iterations\fi
}
\def\pixel{\rule{1bp}{1bp}}
% \c: row
% \d: column
% \e: iteration
\Loop\c\size{%
  \typeout{c: \the\c}%
  \hbox{%
    \Loop\d\size{%
      \pgfmathsetmacro\k@re{4*\d/(\size-1)-2}%
      \pgfmathsetmacro\K@im{2-4*\c/(\size-1)}%
      \def\z@re{0}%
      \def\Z@im{0}%
      \Loop\e\iterations{%
         % calculate z(n+1) = z^2(n) + k
         \pgfmathsetmacro\temp{\z@re*\z@re-\Z@im*\Z@im+\k@re}%
         \pgfmathsetmacro\Z@im{2*\z@re*\Z@im+\K@im}%
         \let\z@re\temp
         % calculate abs(z)^2
         \pgfmathsetmacro\temp{\z@re*\z@re+\Z@im*\Z@im}%
         \ifdim\temp pt>4pt\csname\the\e\endcsname\e\iterations\fi
      }%   
      \ifnum\e=\iterations\pixel\fi
    }%
  }%
}
\stop

36

x86 DOS Assembly, 208 177 173 ไบต์

เลขฐานสองเต็มใน HEX ที่ฉันสร้างขึ้นด้วยมือคือ:

DBE3BE00A0B81300CD1056BA640007BF87F9FDBDC7008BCDE81A008AC3AA4979F7B9C70083EF784D79EE33C0CD16B80300CD10CD208BC12BC289441CDF441CDF06A701DEF9D95C088BC52BC289441CDF441CDF06A701DEF9D95C0CD9EED914D95404D95410D95C14B301D904D84C04DE0EA901D8440CD95404D94410D86414D84408D914D80CD95C10D84C04D95414D84410DF06AB01DED99BDFE09B9E7207433ADA72C632DBC3320002000400

ภาพตัวอย่างคือ:

ภาพหน้าจอ Mandlebrot ถูกตัดด้วยสีดำ

แหล่งที่มาเต็มรูปแบบใน ASM ที่อ่านได้นั้นมีความยาวพอสมควร (ฉันใช้สิ่งนี้เพื่อหาวิธีที่ฉันเข้ารหัสรหัสตัวดูดนี้):

.286
CODE SEGMENT
ASSUME CS:code, DS:code
ORG 0100h

; *****************************************************************************
start:
  ; Mandlebrot coordinates
  zr   = DWORD PTR [SI+0]
  zi   = DWORD PTR [SI+4]
  cr   = DWORD PTR [SI+8]
  ci   = DWORD PTR [SI+12]
  zrsq = DWORD PTR [SI+16]
  zisq = DWORD PTR [SI+20]

  ; Temp int
  Temp = WORD PTR  [SI+28]

  ; ===========================================================================
  ; Initialize

  ; Initialize the FPU
  FNINIT

  ; SI points to our memory
  mov si, 0A000h ; So we can push it

  ; Shave off some bytes by reusing 100
  mov dx, 100

  ; Switch to MCGA
  mov ax, 013h
  int 010h

  ; ES:DI is the end of our drawing area
  push si
  pop es
  mov di, 63879
  std ; We're using stosb backwards

  ; Initialize our X and Y
  mov bp, 199
  mov cx, bp


  ; ===========================================================================
  ; Main draw loop

MainLoop:
  ; Get our next mandelbrot value
  call GMV

  ; Store it
  mov al, bl
  stosb

  ; Decrement our X
  dec cx
  jns MainLoop

  ; Decrement our Y
  mov cx, 199
  sub di, 120
  dec bp
  jns MainLoop


  ; ===========================================================================
  ; Done

  ; Wait for a key press
  xor ax, ax
  int 016h

  ; Change back to text mode
  mov ax, 3
  int 010h

  ; Exit to DOS
  int 020h



; *****************************************************************************
; GMV: Get Mandelbrot Value
; Gets the value for the next Mandelbrot pixel
; Returns:
;   BL - The color to use
GMV:
  ; ===========================================================================
  ; Initialize

  ; cr = (x - 100) / 50;
  mov ax, cx
  sub ax, dx                  ; \
  mov Temp, ax                ;  > ST0 = Current X - 100
  FILD Temp                   ; /
  FILD Divisor                ; ST0 = 50, ST1 = Current X - 100
  FDIVP                       ; ST0 = (Current X - 100) / 50
  FSTP cr                     ; Store the result in cr

  ; ci = (y - 100) / 50;
  mov ax, bp
  sub ax, dx                  ; \
  mov Temp, ax                ;  > ST0 = Current Y - 100
  FILD Temp                   ; /
  FILD Divisor                ; ST0 = 50, ST1 = Current Y - 100
  FDIVP                       ; ST0 = (Current Y - 100) / 50
  FSTP ci                     ; Store the result in ci

  ; zr = zi = zrsq = zisq = 0;
  FLDZ
  FST zr
  FST zi
  FST zrsq
  FSTP zisq

  ; numiteration = 1;
  mov bl, 1

  ; ===========================================================================
  ; Our main loop

  ; do {
GMVLoop:

  ; zi = 2 * zr * zi + ci;
  FLD zr
  FMUL zi
  FIMUL TwoValue
  FADD ci
  FST zi ; Reusing this later

  ; zr = zrsq - zisq + cr;
  FLD zrsq
  FSUB zisq
  FADD cr
  FST zr ; Reusing this since it already is zr

  ; zrsq = zr * zr;
  ;FLD zr ; Reused from above
  FMUL zr
  FSTP zrsq

  ; zisq = zi * zi;
  ;FLD zi ; Reused from above
  FMUL zi
  FST zisq ; Reusing this for our comparison

  ; if ((zrsq + zisq) < 4)
  ;   return numiteration;
  FADD zrsq
  FILD FourValue
  FCOMPP
  FSTSW ax
  FWAIT
  sahf
  jb GMVDone

  ;} while (numiteration++ < 200);
  inc bx
  cmp bl, dl
  jb GMVLoop

  ;return 0;
  xor bl, bl

GMVDone:  
  ret
;GMV



; *****************************************************************************
; Data

; Divisor
Divisor DW 50
; Two Value
TwoValue DW 2
; 4 Value
FourValue DW 4

CODE ENDS
END start

สิ่งนี้ถูกออกแบบมาสำหรับการคอมไพล์ด้วย TASM, รันใน MCGA, และรอการกดปุ่มก่อนที่จะจบโปรแกรม สีเป็นเพียงจานสีเริ่มต้นของ MCGA

แก้ไข:ปรับให้เหมาะสมแล้วตอนนี้ก็ดึงไปข้างหลัง (รูปภาพเดียวกัน) และบันทึก 31 ไบต์!

แก้ไข 2:เพื่อระงับ OP ฉันได้สร้างไบนารีด้วยมือ เมื่อทำเช่นนั้นฉันก็โกนออกไปอีก 4 ไบต์ ฉันบันทึกทุกขั้นตอนของกระบวนการแสดงงานทั้งหมดของฉันเพื่อให้ทุกคนสามารถติดตามได้หากพวกเขาต้องการที่นี่จริงๆ (เตือนมันน่าเบื่อและยาวมาก): http://lightning.memso.com/media/perm/ mandelbrot2.txt

ฉันใช้ regex คู่ใน EditPadPro เพื่อค้นหา; Final: ...รายการทั้งหมดในไฟล์และดัมพ์มันเป็นเลขฐานสิบหกไปยังไฟล์. com ไบนารีผลลัพธ์คือสิ่งที่คุณเห็นที่ด้านบนของโพสต์นี้


1
รหัสเครื่องไม่นับ หากนับจำนวนนั้นภาษาใด ๆ ที่ผลิตรหัสไบต์หรือรหัสเครื่องควรสั้นลง ฉันนับ 820 หลังจากเปลี่ยนทุกอย่างเป็นชื่อยาว 1 ตัว
Mark Jeronimus

3
ฉันสามารถเขียนโค้ดทั้งหมดเป็นเลขฐานสองถ้ามันทำให้คุณง่ายขึ้น แต่นั่นก็เหมือนกับการขอให้ทุกคนใช้ภาษาระดับสูงเพื่อหลีกเลี่ยงการใช้การสร้างอัตโนมัติแมโคร ฯลฯ นั่นคือทั้งหมดที่ประกอบจริงเพียงแค่กลุ่ม แมโคร ไบนารีที่เป็นผลลัพธ์เพื่อเรียกใช้ JavaScript, Perl และอื่น ๆ รวมถึงไบนารีของไลบรารี ด้วย ASM ค่าเลขฐานสิบหกสุดท้ายคือทุกอย่าง, ไลบรารี, รหัสทั้งหมด, รวมอยู่ด้วย
Mark Ormston

5
ไม่ฉันสามารถแปลง ASM เป็นไบนารี่ได้ถ้าจำเป็นจริงๆ มันจะออกมาพร้อมกับ 177 ไบต์ที่แน่นอนที่แอสเซมเบลอร์ของฉันช่วย รหัสผลลัพธ์สามารถวางได้โดยทุกคนที่มีตัวแก้ไขไบนารีลงในไฟล์ใหม่บันทึกออกมา 177 ไบต์และจะทำงานได้ตามที่คาดไว้ เห็นได้ชัดว่ามีการแบ่ง SO ตามการส่ง ASM ดังนั้นบางทีคุณควรชี้แจงหากคุณรู้สึกว่ามันไม่ได้นับ: meta.codegolf.stackexchange.com/questions/260/…
Mark Ormston

6
เอาล่ะดังนั้นเพื่อพิสูจน์ว่านี่เป็นรายการที่ถูกต้องฉันใช้เวลาในการแปลมันเป็นไบนารี่ ฉันได้อัพเดตคำตอบแล้ว
Mark Ormston

7
สิ่งนี้คือไม่มีคอมไพเลอร์พร้อมชุดประกอบ คุณใช้มาโคร การบอกว่ามันไม่นับเหมือนกับว่าคุณไม่สามารถใช้#defineคำสั่งที่กำหนดไว้ล่วงหน้าใน C. มันใช้เวลานานในการแทนที่ทั้งหมดด้วยตนเอง
Mark Ormston

28

Java, 505 405 324 ไบต์

เพียงแค่การคำนวณแบบมาตรฐานพร้อม golfitudeตอนนี้พร้อม golfitude พิเศษ

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

แข็งแรงเล่นกอล์ฟ:

import java.awt.*;class M{public static void main(String[]v){new Frame(){public void paint(Graphics g){for(int t,s,n=640,i=n*n;--i>0;g.setColor(new Color(s*820)),g.drawLine(i/n,i%n+28,i/n,i%n),setSize(n,668)){float c=4f/n,a=c*i/n-2,b=i%n*c-2,r=a,e=b,p;for(s=t=99;t-->0&&r*r+e*e<4;s=t,p=r*r-e*e+a,e=r*e*2+b,r=p);}}}.show();}}

ด้วยตัวแบ่งบรรทัด:

import java.awt.*;
class M{
    public static void main(String[]v){
        new Frame(){
            public void paint(Graphics g){
                for(int t,s,n=640,i=n*n;--i>0;g.setColor(new Color(s*820)),g.drawLine(i/n,i%n+28,i/n,i%n),setSize(n,668)){
                    float c=4f/n,a=c*i/n-2,b=i%n*c-2,r=a,e=b,p;
                    for(s=t=99;t-->0&&r*r+e*e<4;s=t,p=r*r-e*e+a,e=r*e*2+b,r=p);
                }
            }
        }.show();
    }
}

f.setSize(n,668);- ขึ้นอยู่กับธีมที่ใช้มาก แต่ฉันจะยอมรับ
Mark Jeronimus

คุณสามารถวางการนำเข้าใน Java เพราะมันสร้างขึ้นโดยอัตโนมัติ
Mark Jeronimus

ฉันยังเห็นdoubleว่าfloatสามารถใช้งานได้ที่ไหนถ้าคุณลอง
Mark Jeronimus

JFrame=> Frameโกนหนวดออก 2 ตัว แม้ว่าคุณจะไม่สามารถปิดหน้าต่างได้อีกต่อไป ;)
EthanB

2
ชั้นเรียนของคุณไม่จำเป็นต้องเป็นแบบสาธารณะ เพิ่มเติมใช้ Java 8 เพื่อกำจัดfinalตัวปรับ และคุณต้องไม่ละเว้นการนำเข้าเพื่อให้การส่งสมบูรณ์
Victor Stafusa

21

Javascript (ECMAScript 6) - 315 308 ตัวอักษร

document.body.appendChild(e=document.createElement("canvas"));v=e.getContext("2d");i=v.createImageData(e.width=e.height=n=600,n);j=0;k=i.data;f=r=>k[j++]=(n-c)*r%256;for(y=n;y--;)for(x=0;x++<n;){c=s=a=b=0;while(c++<n&&a*a+b*b<5){t=a*a-b*b;b=2*a*b+y*4/n-2;a=t+x*4/n-2}f(87);f(0);f(0);k[j++]=255}v.putImageData(i,0,0)

เอาท์พุทเริ่มต้น

(d=document).body.appendChild(e=d.createElement`canvas`);v=e.getContext`2d`;i=v.createImageData(e.width=e.height=n=600,n);j=0;k=i.data;f=r=>k[j++]=(n-c)*r%256;for(y=n;y--;)for(x=0;x++<n;){c=s=a=b=0;while(c++<n&&a*a+b*b<5){t=a*a-b*b;b=2*a*b+y*4/n-2;a=t+x*4/n-2}f(87);f(0);f(0);k[j++]=255}v.putImageData(i,0,0)

  • เปลี่ยนnเพื่อเปลี่ยนขนาดภาพ (และจำนวนการวนซ้ำ)
  • เปลี่ยนค่าที่ส่งผ่านในการf(87);f(0);f(0);โทร (ใกล้ถึงจุดสิ้นสุด) เพื่อเปลี่ยนค่าสี RGB ( f(8);f(8);f(8);คือสีเทา)

ด้วยf(8);f(23);f(87);:

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

(d=document).body.appendChild(e=d.createElement`canvas`);v=e.getContext`2d`;i=v.createImageData(e.width=e.height=n=600,n);j=0;k=i.data;f=r=>k[j++]=(n-c)*r%256;for(y=n;y--;)for(x=0;x++<n;){c=s=a=b=0;while(c++<n&&a*a+b*b<5){t=a*a-b*b;b=2*a*b+y*4/n-2;a=t+x*4/n-2}f(8);f(23);f(87);k[j++]=255}v.putImageData(i,0,0)


2
ดี d=documentจะช่วยให้คุณประหยัดอีกไม่กี่ (นอกจากนี้มีเหตุผลในการสร้างผืนผ้าใบหรือไม่ codegolf สมมติว่ามีระดับของ HTML ที่มีอยู่หรือไม่)
Matthew Wilcoxson

1
คุณสามารถเขียนdocument.createElement`canvas` และบันทึก 2 ไบต์ getContext`2d` เช่นเดียวกับ
Ismael Miguel

ฉันไม่ได้คาดเดา HTML Canvas เนื่องจากนี่เป็นโซลูชัน JavaScript ที่แท้จริง
MT0

หรือคุณสามารถ 'หล่น' ผืนผ้าใบได้ที่นี่
Kamil Kiełczewski

19

J, 73 ไบต์

load'viewmat'
(0,?$~99 3)viewmat+/2<|(j./~i:2j479)(+*:) ::(3:)"0^:(i.99)0

ชุดดอกแดนบอท

แก้ไขบางคนอธิบาย:

x (+*:) y           NB. is x + (y^2)
x (+*:) ::(3:) y    NB. returns 3 when (+*:) fails (NaNs)
j./~i:2j479         NB. a 480x480 table of complex numbers in required range
v =: (j./~i:2j479)(+*:) ::(3:)"0 ]     NB. (rewrite the above as one verb)
v z0                NB. one iteration of the mandelbrot operation (z0 = 0)
v v z0              NB. one iteration on top of the other
(v^:n) z0           NB. the result of the mandelbrot operation, after n iterations
i.99                NB. 0 1 2 3 4 ... 98
(v^:(i.99))0        NB. returns 99 tables, one for each number of iterations
2<| y               NB. returns 1 if 2 < norm(y), 0 otherwise
2<| (v^:(i.99))0    NB. 99 tables of 1s and 0s
+/...               NB. add the tables together, element by element.
NB. we now have one 480x480 table, representing how many times each element exceeded norm-2.
colors viewmat M    NB. draw table 'M' using 'colors'; 'colors' are rgb triplets for each level of 'M'.
$~99 3              NB. 99 triplets of the numbers 99,3
?$~99 3             NB. 99 random triplets in the range 0 - 98 and 0 - 2
0,?$~99 3           NB. prepend the triplet (0,0,0): black

1
+1 แต่เป็นไปได้ไหมที่คุณจะสามารถอธิบายได้ว่าโค้ดนั้นทำงานอย่างไร โดยเฉพาะอย่างยิ่งฉันอยากรู้อยากเห็นรู้ว่ามันอยู่ที่ไหนในรหัสเลือกสี?
plannapus

1
@ MarkJeronimus ฉันทำได้ 70 แต่ฉันเก็บบางอย่างไว้เพื่อความชัดเจน ฉันจึงใช้เสรีภาพในการเพิกเฉยต่อ LF เมื่อนับ
Eelvex

@plannapus, OK เพิ่มความคิดเห็น การเลือกสีทำได้ด้วยการ(0,?$~99 3)สร้าง 100 rgb triplets หนึ่งอันสำหรับแต่ละระดับ เนื่องจากการสุ่มคุณอาจได้รับน้อยกว่า 100 เท่าดังนั้นบางระดับจะมีการเปลี่ยนแปลงที่ราบรื่นขึ้น (แต่ยังคงมีสีต่างกัน)
Eelvex

17

Mathematica, 214 191 215 19 30

ตั้งแต่เวอร์ชัน 10.0 มีบิวด์อิน: (19 ไบต์)

MandelbrotSetPlot[]

ทาจิกิสถาน


เพื่อให้สอดคล้องกับข้อกำหนดช่วงพิกัดจำเป็นต้องมี 11 ไบต์เพิ่มเติม (30 ไบต์)

MandelbrotSetPlot@{-2-2I,2+2I}

m2


กรณีรีดด้วยมือ:

m=Compile[{{c,_Complex}},Length[FixedPointList[#^2+c&,0,99,SameTest→(Abs@#>=2&)]]];
ArrayPlot[Table[m[a+I b],{b,-2,2,.01},{a,-2,2,.01}],DataRange→{{-2,2},{-2,2}},
ColorRules→{100→Black},ColorFunction→(Hue[Log[34,#]]&)]

เขียว


{b, -2, 2, .01}, {a, -2, 2, .01}สั้นและใกล้กับกฎมากขึ้น
Mark Jeronimus

@ MarkJeronimus ขอบคุณ ฉันใช้ช่วงแนะนำสำหรับภาพวนซ้ำ
DavidC

คุณมีสิทธิ์เกือบแล้วคุณทำภายในไม่ใช่สีดำ เฟรมสุดท้ายใน GIF เป็นสีดำด้านในและเป็นคำตอบที่อนุญาต แก้ไข: และฉันนับ 195 ไบต์
Mark Jeronimus

ฉันพลาดประเด็นเกี่ยวกับการเป็นคนดำ จำนวนเพิ่มขึ้นเนื่องจากอักขระเดี่ยวบางตัวกลายเป็นอักขระสองตัวในการตัดและวางเพื่อ SE
DavidC

The fractal coordinates range from approximately -2-2i to 2+2iวิธีการแก้ปัญหาในตัวของคุณใช้การตีความหลวมมาก
Jonathan Frech

16

Python กับ Pylab + Numpy, 151 ไบต์

ฉันทนไม่ได้ที่จะเห็นรายการ Python ที่ไม่ใช่ DQ'ed แต่ฉันคิดว่าฉันเอาชนะตัวเองในเกมนี้และฉันทำให้มันเหลือ 153 ตัวละคร!

import numpy as n
from pylab import*
i=99
x,y=n.mgrid[-2:2:999j,-2:2:999j]
c=r=x*1j+y
x-=x
while i:x[(abs(r)>2)&(x==0)]=i;r=r*r+c;i-=1
show(imshow(x))

ยิ่งไปกว่านั้นบรรทัดที่สองไปยังบรรทัดสุดท้ายยกคำเตือนรันไทม์ที่แตกต่างกัน 4 รายการบันทึกส่วนตัวใหม่!

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


ฉันนับ 152 ไม่จำเป็นต้องมีช่องว่างระหว่างimportและ*และไม่ได้กำหนดfเลยควรสั้นกว่าเว้นแต่ฉันจะเข้าใจผิดบางสิ่งซึ่งเป็นไปได้ คุณควรเปลี่ยนมันโดยรอบเพื่อให้การทำซ้ำ 0 และ 1 ซ้ำถูกบิดเบือน (ขณะนี้ทั้งสองเป็นสีเทา)
primo

แปลก. wc รวม eof หรือไม่? คงที่และเล็กกว่าเล็กน้อย รอสักครู่.
meawoppl

ฉันได้ 151 กับ wc กอล์ฟครั้งแรกดังนั้นไม่แน่ใจว่าจะทำคะแนนได้อย่างไร
meawoppl

ฉันนับ 150 โดยไม่ขึ้นบรรทัดใหม่ ตัวแปล / คอมไพเลอร์บางตัวต้องการตัวแปลตัวหนึ่ง แต่ตัวแปลของไพ ธ อนทำงานได้ดี ไม่แน่ใจwcแต่อาจลองstat -c %sแทน ขอบสีดำบนและล่างเป็นส่วนหนึ่งของภาพหรือไม่
primo

1
คุณสามารถบันทึก 1 ตัวอักษรโดยใช้from numpy import*แทนimport numpy as nและแทนmgrid n.mgrid
nyuszika7h

15

C + Allegro 4.2.2 - 248 ไบต์

#include<allegro.h>
x=-1,y,K=400;float a,h,c,d,k;main(i){set_gfx_mode('SAFE',K,K,allegro_init(),0);while(x++<K)
for(y=0;y<K;y++){for(a=h=i=0;a*a+h*h<4&&++i<256;k=a,a=a*a-h*h+x*0.01-2,h=2*k*h+y*0.01-2);
putpixel(screen,x,y,i);}while(1);}END_OF_MAIN()

เอาท์พุท:

MSet 1


คุณควรพูดถึงว่านี่คือ Allegro 4 (ซึ่งค่อนข้างแตกต่างจาก Allegro 5) รุ่นนี้ที่แน่นอนคืออะไร?
Victor Stafusa

มันยาว 246 หรือ 249
มาร์คเจโรนิมัส

@Victor Allegro 4.2.2
Oberon

1
@ MarkJeronimus ไม่ควรมีการขึ้นบรรทัดใหม่ระหว่าง... allegro.h>และx=-1, ...? ฉันคิดว่า Notepad ++ นับเป็น=\r\n 0D 0A
Oberon

1
ผมคิดว่าสามารถนำมาพิมพ์เป็น0.01 .01
Yytsi

14

Windows PowerShell (v4), 299 ไบต์

รูปภาพเศษส่วน Mandelbrot

# Linewrapped here for show:

$M='System.Windows.Forms';nal n New-Object;Add-Type -A System.Drawing,$M;(
$a=n "$M.Form").backgroundimage=($b=n Drawing.Bitmap 300,300);0..299|%{
$r=$_;0..299|%{$i=99;$k=$C=n numerics.complex($_/75-2),($r/75-2);while(((
$k=$k*$k).Magnitude-lt4)-and$i--){$k+=$C}$b.SetPixel($_,$r,-5e6*++$i)}};$a.Show()


# The single line 299 char entry version:

$M='System.Windows.Forms';nal n New-Object;Add-Type -A System.Drawing,$M;($a=n "$M.Form").backgroundimage=($b=n Drawing.Bitmap 300,300);0..299|%{$r=$_;0..299|%{$i=99;$k=$C=n numerics.complex($_/75-2),($r/75-2);while((($k=$k*$k).Magnitude-lt4)-and$i--){$k+=$C}$b.SetPixel($_,$r,-5e6*++$i)}};$a.Show()

คำแนะนำ

  • เรียกใช้คอนโซล PowerShell ปกติ (ISE อาจไม่ทำงาน)
  • คัดลอก / วางรหัสในกด Enter
  • รอ - มันใช้เวลาหนึ่งนาทีหรือมากกว่านั้นในการทำงาน
  • วิธีเดียวที่จะออกจากคือการปิดคอนโซล

คิดเห็น

  • มีการทดสอบกฏเล็กน้อยที่เกิดขึ้นกับสีภายในชุด กฎบอกว่า"พิกเซลอื่น ๆ (น่าจะเป็นภายในชุด Mandelbrot) ต้องเป็นสีดำหรือขาว '" ; รหัสกำลังระบายสีพิกเซลสีดำทั้งหมด RGB (0,0,0) ... มันเพิ่งเกิดขึ้นเป็น RGBA สีดำโปร่งใส (0,0,0,0) ดังนั้นสิ่งที่ปรากฏคือสีพื้นหลังแบบฟอร์มของชุดรูปแบบ Windows ปัจจุบัน RGB สีขาวเล็กน้อย (240,240,240) ในกรณีนี้

ฉันเปลี่ยนlt2ไปlt4จะทำให้มันเป็น "ชุด Mandelbrot" แทนที่จะเป็นภาพที่คุณได้ในขณะนี้หลายจุดของชุดจะถูกกลืนหายไปกับวงดนตรีสี
Mark Jeronimus

เห็นได้ชัดว่าขนาดa*a+b*bไม่ได้sqrt(a*a+b*b)
Mark Jeronimus

ฉันคิดว่าฉันได้รับการทดสอบว่าก่อนหน้านี้ แต่ผมไปในการค้นหาของคำตอบ "ที่เป็นเส้นแนวนอนด้านซ้ายหายไปไหน?" -lt4และหลังจากบิตผมพบว่ามันตรงกับที่คุณกล่าวว่า อันไหนดี - ขอบคุณ ฉันได้อัปเดตคำตอบของฉันด้วยรหัสที่ถูกต้องและรูปภาพ (จะต้องคิดใหม่เกี่ยวกับความเข้าใจของฉันในสิ่งที่มันทำเพราะฉันขาดอะไรบางอย่าง)
TessellatingHeckler

14

Python + PIL , 166 ไบต์

import Image
d=600;i=Image.new('RGB',(d,d))
for x in range(d*d):
 z=o=x/9e4-2-x%d/150.j-2j;c=99
 while(abs(z)<2)*c:z=z*z+o;c-=1
 i.putpixel((x/d,x%d),5**8*c)
i.show()

เอาท์พุท (จะเปิดในโปรแกรมดู * .bmp ที่เป็นค่าเริ่มต้น):


1
คุณสามารถกำจัด 3 ถ้าคุณกำจัดการyวนซ้ำ r=range(d*d)ใช้x/dและx%dสำหรับ x และ y
Geobits

@Geobits ความคิดที่บันทึกไว้จริง 10 ขอบคุณ!
primo

1
ประเภทที่ซับซ้อนสามารถเริ่มต้นได้เช่น: c = 1 + 2j ซึ่งฉันคิดว่าจะช่วยให้คุณประหยัดตัวละครคู่ด้วย: z = o = x / 9e4-2 + (x% d / 150. -2) * 1j; c = 99
meawoppl

@meawoppl อีก 7: D
primo

ไม่อนุญาตทางเทคนิค: นี่ไม่ใช่ฟีเจอร์การแสดงผลกราฟิกของ Python เอง (และImage.show()บันทึกไฟล์ชั่วคราวโดยปริยาย)
nneonneo

12

BBC Basic (228 ไบต์)

แล้วภาษาที่ไม่มีใครเคยได้ยินในโค้ดกอล์ฟ ส่วนใหญ่มีแนวโน้มที่จะได้รับการปรับให้เหมาะสมที่สุด แต่ฉันก็ไม่ค่อยดีเท่าไหร่ - สามารถปรับปรุงได้ อ้างอิงจากhttp://rosettacode.org/wiki/Mandelbrot_set#BBC_BASICแต่ฉันพยายามที่จะเขียนรหัสกอล์ฟให้มากที่สุด

VDU23,22,300;300;8,8,8,8
ORIGIN0,300
GCOL1
FORX=0TO600STEP2
i=X/200-2
FORY=0TO300STEP2
j=Y/200
x=0
y=0
FORI=1TO128
IFx*x+y*y>4EXIT FOR
t=i+x*x-y*y
y=j+2*x*y
x=t
NEXT
COLOUR1,I*8,I*4,0
PLOTX,Y:PLOTX,-Y
NEXT
NEXT

ชุด Mandelbrot ที่สร้างขึ้น

>สัญลักษณ์บนภาพเป็นพรอมต์และก็สร้างขึ้นโดยอัตโนมัติหลังจากใช้โปรแกรม


ไม่จำเป็นต้องพล็อตสองครั้งเพียงไปกับเวอร์ชันที่ไม่มีประสิทธิภาพมากขึ้น doesn ทีได้สนับสนุนNEXT Y,X?
Mark Jeronimus

10

APL, 194 ตัวอักษร / ไบต์ *

m←{1{⍺=99:0⋄2<|⍵:⍺⋄(⍺+1)∇c+⍵*2}c←⍵}¨⍉v∘.+0j1×v←¯2+4÷s÷⍳s←640
'F'⎕WC'Form'('Coord' 'Pixel')('Size'(s s))
'B'⎕WC'Bitmap'('CMap'(0,,⍨⍪0,15+10×⍳24))('Bits'(24⌊m))
'F.I'⎕WC'Image'(0 0)('Picture' 'B')

นี่สำหรับ Dyalog APL ด้วย ⎕IO ⎕ML←1 3

พื้นที่ส่วนใหญ่ใช้การเรียก API เพื่อแสดงบิตแมปในหน้าต่าง (บรรทัด 2, 3, 4)
หากมีทางลัดที่จะทำรหัสจะลดลงเหลือ 60 ตัวอักษร (บรรทัดที่ 1)

โปรดช่วยค้นหาทางลัด KTHX

รุ่นที่ไม่ได้อัปโหลด (บรรทัดที่ 1 เท่านั้น)

s←640            ⍝ size of the bitmap
v←(4×(⍳s)÷s)-2   ⍝ vector of s reals, uniform between ¯2 and 2
m←(0j1×v)∘.+v    ⍝ square matrix of complex numbers from ¯2j¯2 to 2j2
m←{              ⍝ transform each number in matrix m according to the following
  1{             ⍝   function that takes iteration counter as ⍺ and current value as ⍵
    ⍺=99: 0      ⍝     if we have done 99 iterations, return 0
    2<|⍵: ⍺      ⍝     if |⍵| > 2 return the number of iterations done
    (⍺+1)∇c+⍵*2  ⍝     otherwise, increment the iterations and recurse with the new value
  }c←⍵           ⍝   save the initial value as c
}¨m    

ภาพหน้าจอ:

(เวอร์ชั่นฟรีแวร์ทำงานใน OS X ภายใต้ไวน์ใช่ฉันราคาถูกแบบนั้น)

ภาพหน้าจอ

*: Dyalog มีชุดอักขระไบต์เดียวพร้อมสัญลักษณ์ APL ที่แมปกับค่าสูงสุด 128 ไบต์ดังนั้นรหัสทั้งหมดจึงสามารถเก็บไว้ใน 194 ไบต์ ทุกข้อความในเชิงอรรถนี้อาจเป็นจริง รักษาความสงบและเล่นกอล์ฟต่อไป


10

Mathematica 10.0, 19 ตัวอักษร

MandelbrotSetPlot[]

MandelbrotSetPlot เป็นฟังก์ชั่นใหม่ใน Mathematica 10.0

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


สะดวกแค่ไหนฟังก์ชั่นการใช้งานในตัวนี้จะเกิดขึ้นเพื่อตอบสนองความต้องการของฉันทั้งหมด (ยกเว้นตำแหน่งซึ่งสามารถตั้งค่าได้อีก 13 ตัวอักษร) ยกเว้นนี่เป็นช่องโหว่มาตรฐาน
Mark Jeronimus

19
โดยทั่วไปแล้วรหัสภาษาจะชนะด้วยภาษาที่เชี่ยวชาญพร้อมโทเค็นอักขระเดียวหรือโดยระบบเช่น Mathematica ที่มีฟังก์ชั่นพิเศษจำนวนมากในตัว หากต้องการใช้พวกเขาจะไม่โกงมากกว่าการใช้คำสั่งอักขระเดียวจะอยู่ใน APL
Michael Stern

9

R, 199 211 ตัวอักษร

โซลูชันเก่าที่ 199 ตัวอักษร:

r=seq(-2,2,l=500);c=t(sapply(r,function(x)x+1i*r));d=z=array(0,dim(c));a=1:25e4;for(i in 1:99){z[a]=c[a]+z[a]^2;s=abs(z[a])<=2;d[a[!s]]=i;a=a[s]};image(d,b=0:99,c=c(1,sample(rainbow(98))),ax=F,asp=1)

ด้วยการเยื้อง:

r=seq(-2,2,l=500)
c=t(sapply(r,function(x)x+1i*r)) #Produces the initial imaginary number matrix
d=z=array(0,dim(c)) #empty matrices of same size as c 
a=1:25e4            #(z will store the magnitude, d the number of iterations before it reaches 2)
for(i in 1:99){     #99 iterations
    z[a]=c[a]+z[a]^2
    s=abs(z[a])<=2
    d[a[!s]]=i
    a=a[s]
    }
image(d,b=0:99,c=c(1,sample(rainbow(98))),ax=F,asp=1) #Colors are randomly ordered (except for value 0)

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

แก้ไข:วิธีแก้ปัญหาที่ 211 ตัวอักษรที่สีด้านในของชุดและด้านนอกของชั้นแรกแตกต่างกัน:

r=seq(-2,2,l=500);c=t(sapply(r,function(x)x+1i*r));d=z=array(0,dim(c));a=1:25e4;for(i in 1:99){z[a]=c[a]+z[a]^2;s=abs(z[a])<=2;d[a[!s]]=i;a=a[s]};d[a[s]]=-1;image(d,b=-1:99,c=c(1:0,sample(rainbow(98))),ax=F,asp=1)

ด้วยการเยื้อง:

r=seq(-2,2,l=500)
c=t(sapply(r,function(x)x+1i*r))
d=z=array(0,dim(c))
a=1:25e4
for(i in 1:99){
    z[a]=c[a]+z[a]^2
    s=abs(z[a])<=2
    d[a[!s]]=i
    a=a[s]
    }
d[a[s]]=-1 #Gives the inside of the set the value -1 to differenciate it from value 0.
image(d,b=-1:99,c=c(1,sample(rainbow(99))),ax=F,asp=1)

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


เทคนิคดำด้านนอกไม่ได้รับอนุญาต คุณคิดถึงสิ่งนั้นหรือยากที่จะใช้งานหรือไม่?
Mark Jeronimus

@ MarkJeronimus ทั้งคู่จริง ๆ แล้ว :) ฉันจะลองดูวิธีการทำ แต่ฉันไม่มั่นใจ 100% ว่าฉันจะหาวิธีที่จะทำสิ่งนี้ให้สะอาด
plannapus

@ MarkJeronimus เรียบร้อยแล้ว!
plannapus

5
สถานที่ที่สองในการแบ่งสีน่าเกลียด
meawoppl

1
@meawoppl ตำหนิrainbow():)
plannapus

9

Java การประมวลผล (271 ไบต์)

void setup(){int h=100,e=5*h,i;float d,v,w,a,b,c;size(e,e);colorMode(HSB,h);loadPixels();d=4./e;v=2;for(int x=1;x<=e;x++){v-=d;w=2;for(int y=0;y<e;){w-=d;a=b=c=0;i=-1;while(a*a+b*b<4&&++i<h){c=a*a-b*b+v;b=2*a*b+w;a=c;}pixels[e*++y-x]=color(i*9%h,h,h-i);}}updatePixels();}

ขยาย:

void setup(){
  int h=100, e=5*h, i; //init of size "e", max hue "h", iterator "i"
  float d,v,w,a,b,c; //init of stepwidth "d", y-coord "v", x-coord "w", Re(z) "a", Im(z) "b", temp_a "c"
  size(e,e);
  colorMode(HSB,h);
  loadPixels();
  d = 4./e;
  v = 2;
  for(int x = 1; x <= e; x++){
    v -= d;
    w = 2;
    for(int y = 0; y < e;){
      w -= d;
      a = b = c = 0;
      i = -1;
      while(a*a + b*b < 4 && ++i < h){
        c = a*a - b*b + v;
        b = 2*a*b + w;
        a = c;
      }
      pixels[e * ++y - x] = color(i*9 % h, h, h-i);
    }
  }
  updatePixels();
}


อ๊ะฉันอยากจะทำสิ่งนี้ +1
SIGSTACKFAULT

8

พื้นฐาน TI-80, 125 106 ไบต์

ZDECIMAL
FOR(Y,-2,2,.1
FOR(X,-2,2,.1
0->S
0->T
1->N
LBL N
N+1->N
IF S²+T²≥4
GOTO B
S²-T²+X->I
2ST+Y->T
I->S
IF N<20
GOTO N
LBL B
IF FPART (N/2
PT-ON(X,Y
END
END

ตามคำตอบของ Digital Trauma ป้อนคำอธิบายรูปภาพที่นี่


6

GLSL - 225 ไบต์:

void main(){vec2 c=gl_FragCoord.xy/iResolution.y*4.-2.,z=c,v;for(int i=0;i<99;i++){z=vec2(z.x*z.x-z.y*z.y,2.*z.x*z.y)+c;if(length(z)>2.&&v.y<1.)v=vec2(float(i)/99.,1.);}gl_FragColor=(v.y<1.)?vec4(v,v):texture2D(iChannel0,v);}

การกำหนดตัวแปรในรหัส (242 ไบต์):

uniform vec3 r;uniform sampler2D t;void main(){vec2 c=gl_FragCoord.xy/r.y*4.-2.,z=c,v;for(int i=0;i<99;i++){z=vec2(z.x*z.x-z.y*z.y,2.*z.x*z.y)+c;if(length(z)>2.&&v.y<1.)v=vec2(float(i)/99.,1.);}gl_FragColor=(v.y<1.)?vec4(v,v):texture2D(t,v);}

ดูใน ShaderToy

สนามกอล์ฟ Mandelbrot

iChannel0นี้ต้องใช้เนื้อจานสีที่เหมาะสมจะโหลดเป็น (สีที่นี่มาจากพื้นผิว "พิกเซลสุ่ม" บน ShaderToy)


ควรนับการประกาศตัวแปรด้วยเช่นกันเว้นแต่จะสร้างขึ้นโดยอัตโนมัติจากรหัส (โทนสีใช้ได้เมื่อมีการตั้งค่าภายนอกเท่านั้น)
Mark Jeronimus

@MarkJeronimus: สำหรับสภาพแวดล้อม ShaderToy ตัวแปรเหล่านี้จะได้รับการแก้ไข ไม่อย่างนั้นสำหรับตัวแปลงมาตรฐานฉันจะเลือกชื่อตัวแปรที่สั้นกว่า
nneonneo

นี่เป็นวิธีที่เร็วที่สุดของพวกเขาทั้งหมดหรือไม่
Demi

6

ระดับเสียง ( 212 136 ไบต์)

(ตอนนี้รวมถึงแนวคิดบางอย่างเนื่องจาก @ChrisTaylor)

[y,x]=ndgrid(-2:.01:2);z=c=x+i*y;m=c-c;for n=0:99;m+=abs(z)<2;z=z.^2+c;end;imagesc(m);colormap([hsv(128)(1+mod(0:79:7890,128),:);0,0,0])

ด้วยช่องว่าง:

[y,x] = ndgrid(-2:.01:2);
z = c = x + i*y;
m = c-c;
for n=0:99
    m += abs(z)<2;
    z = z.^2 + c;
end
imagesc(m)
colormap([hsv(128)(1+mod(0:79:7900,128),:);
          0,0,0])

เอาท์พุท:

Mandelbrot ขั้นตอนในการ abs (z)> 2

ในการแปลงเป็น Matlab ให้เปลี่ยน " m+=abs(z)<2" เป็น " m=m+(abs(z)<2)" [+3 ไบต์]

หากต้องการสร้างอัตราส่วน 1: 1 ให้เพิ่ม " ;axis image" [+11 ไบต์]

คำตอบแรกของฉัน (212 ไบต์):

[x,y]=meshgrid(-2:.01:2);z=c=x+i*y;m=0*e(401);for n=0:99;m+=abs(z)<2;z=z.^2+c;endfor;t=[0*e(1,7);2.^[6:-1:0]];[s{1:7}]=ndgrid(num2cell(t,1){:});t=1+sum(cat(8,s{:}),8);imagesc(m);colormap([hsv(128)(t(:),:);0,0,0])

อาจเป็นวิธีที่สั้นกว่าในการรับ colormap ที่ไม่ต่อเนื่อง ....
aschepler

ใช่ดีขึ้นแล้วตอนนี้
aschepler

+1 โซลูชั่นที่ดีและรัดกุม แต่อัตราส่วนของคุณไม่ใช่ 1: 1 (กฎเปรียบเทียบ n ° 2: เอาต์พุตควรเป็นสี่เหลี่ยมจัตุรัส)
plannapus

การแก้ไขอัตราส่วนภาพจะใช้เวลาอีก 11 ไบต์: ผนวก " ;axis image" จำเป็นต้องมีคุณสมบัติหรือไม่
aschepler

ฉันคิดว่ามันเป็นแค่ฉัน nitpicking :), OP ดูเหมือนจะไม่มีปัญหากับมันเพราะเขาไม่ได้พูดอะไร
plannapus

6

Applesoft BASIC, 302 286 280 bytes

วิธีนี้จะเลือกคะแนนสุ่มเพื่อวาดดังนั้นมันจะวิ่งไปตลอดกาลและอาจไม่เคยเติมเต็มระนาบ

1HGR:POKE49234,0:DIMco(10):FORc=0TO10:READd:co(c)=d:NEXT:DATA1,2,3,5,6,1,2,3,5,6,0
2x=INT(RND(1)*280):y=INT(RND(1)*96):x1=x/280*3-2:y1=y/191*2-1:i=0:s=x1:t=y1
3s1=s*s-t*t+x1:t=2*s*t+y1:s=s1:i=i+1:IFs*s+t*t<4ANDi<20THENGOTO3
4c=co(i/2):IFc THENHCOLOR=c:HPLOTx,y:HPLOTx,191-y
5GOTO2

ปรากฎว่า Applesoft BASIC นั้นให้อภัยจริง ๆเกี่ยวกับการขาดช่องว่าง จำเป็นต้องใช้พื้นที่เดียวในโปรแกรมทั้งหมด

ผลลัพธ์หลังจาก 14 ชั่วโมง:

        เอาท์พุต

GIF:

        GIF

ก่อนเล่นกอล์ฟ:

10 HGR : POKE 49234,0
20 DIM co(10) : FOR c = 0 TO 10 : READ d : co(c) = d : NEXT
30 DATA 1, 2, 3, 5, 6, 1, 2, 3, 5, 6, 0
100 x = INT(RND(1) * 280) : y = INT(RND(1) * 96)
110 x1 = x / 280 * 3 - 2 : y1 = y / 191 * 2 - 1
120 i = 0:s = x1:t = y1
130 s1 = s * s - t * t + x1
140 t = 2 * s * t + y1:s = s1: i = i + 1
150 IF s * s + t * t < 4 AND i < 20 THEN GOTO 130
160 c = co(i/2) : IF c THEN HCOLOR= c : HPLOT x,y : HPLOT x,191 - y
170 GOTO 100

หมายเหตุ: POKE 49234,0(ใน Applesoft BASIC) ทำให้เครื่องเข้าสู่โหมดกราฟิกเต็มรูปแบบ

รุ่นที่ปรับให้เหมาะกับการแสดง B&W:

110 HGR:POKE 49234,0:HCOLOR=3
120 FOR x = 0 TO 279:FOR y = 0 TO 95
130 x1 = x / 280 * 3 - 2:y1 = y / 191 * 2 - 1
140 i = 0:s = x1:t = y1:c = 0
150 s1 = s * s - t * t + x1
160 t = 2 * s * t + y1:s = s1:c = 1 - c:i = i + 1
170 IF s * s + t * t < 4 AND i < 117 THEN GOTO 150
180 IF c = 0 THEN HPLOT x,y:HPLOT x,191 - y
190 NEXT:NEXT

ผลผลิตหลังจาก 12 ชั่วโมง:

        B & W

รุ่นที่จะทำงานใน GW-BASIC (DOS):

5 CLS
6 SCREEN 1
20 DIM co(10) : FOR c = 0 TO 10 : READ d : co(c) = d : NEXT
30 DATA 1, 2, 3, 5, 6, 1, 2, 3, 5, 6, 0
100 x = INT(RND(1) * 280) : y = INT(RND(1) * 96)
110 x1 = x / 280 * 3 - 2 : y1 = y / 191 * 2 - 1
120 i = 0 : s = x1 : t = y1
130 s1 = s * s - t * t + x1
140 t = 2 * s * t + y1 : s = s1 : i = i + 1
150 IF s * s + t * t < 4 AND i < 20 THEN GOTO 130
160 c = co(i/2) : PSET (x,y),C : PSET (x,191 - y),C
170 GOTO 100

จะเล็กลง (และช้ากว่า) หากคุณไม่ได้วางแผนสองพิกเซลพร้อมกัน แต่เลือกพิกเซลสุ่มบนทั้งหน้าจอ
Mark Jeronimus

1
@MarkJeronimus มันช้าไปแล้วที่รุ่นสียังไม่เสร็จหลังจากโพสต์เมื่อ 5 วันที่แล้ว ฉันไม่คิดว่าฉันจะจ่ายได้ช้ากว่านี้: P
MD XF

5

gnuplot 110 (105 โดยไม่มีบรรทัดใหม่)

รายการ gnuplot ที่บังคับใช้ มันทำมานับครั้งไม่ถ้วน แต่อันนี้มาจากศูนย์ (ไม่ใช่ว่ามันยาก) ฉันชอบวิธีที่gnuplotคำสั่งของกอล์ฟมีอยู่จริง :)

f(z,w,n)=abs(z)>2||!n?n:f(z*z+w,w,n-1)
se vi map
se si sq
se isos 256
sp [-2:2] [-2:2] f(0,x+y*{0,1},99) w pm

ungolfed:

f(z,w,n)=abs(z)>2||n==0?n:f(z*z+w,w,n-1)
set view map
set size square
set isosamples 256
splot [-2:2] [-2:2] f(0,x*{1,0}+y*{0,1},99) with pm3d

อย่างไรก็ตามฉันผิดหวังอย่างยิ่งกับการบันทึกตัวเลขที่ซับซ้อน x*{1,0}+y*{0,1}จะต้องเป็นวิธีที่เศร้าที่สุดในการสร้างจำนวนเชิงซ้อน

อ๊ะรูปภาพ: gnuplot mandelbrot

ตั้งค่าตัวอย่างให้สูงขึ้นเพื่อให้ได้ความละเอียดที่ดีขึ้น เราสามารถพูดunset ticsและunset colorboxเพื่อภาพลักษณ์ที่บริสุทธิ์ แต่ฉันคิดว่ารุ่นนี้มีคุณสมบัติที่ดี


เดิมพันเป็นสำเนา / พาสต้าจาก google hit แรก "gnuplot mandel" สำหรับผู้เริ่ม*{1,0}มีความเป็นเอกภาพและเป็นเหมือนวิธีการพูดรหัส*1และอาจถูกทิ้งได้ (ยังไม่ได้ทดสอบ)
Mark Jeronimus

1
ไม่มันไม่ใช่การคัดลอกวาง มันเป็นสูตรที่ตรงไปตรงมามากและไม่จำเป็นต้องค้นหาด้วยซ้ำ อย่างไรก็ตามฉันได้ค้นหาหน้าเว็บที่คุณได้รับจากการค้นหานั้นเมื่อฉันกำลังมองหาวิธีที่ดีกว่าในการเริ่มต้นจำนวนเชิงซ้อน (การนำไปใช้ของพวกเขานั้นแตกต่างกัน ขอบคุณสำหรับเคล็ดลับเกี่ยวกับส่วนจริงมันใช้งานได้ เครื่องประกอบ
orion

5

Matlab (89 ไบต์)

[X,Y]=ndgrid(-2:.01:2);C=X+i*Y;Z=C-C;K=Z;
for j=1:99,Z=Z.*Z+C;K=K+(abs(Z)<2);end,imagesc(K)

ผลผลิต -

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

ไม่เป็นไปตามข้อกำหนดที่เซลล์ชั้นในจะต้องเป็นสีดำหรือสีขาว แต่สามารถทำได้โดย (1) ใช้imshow(K)แทนimagesc(K)(ต้องการ 1 ไบต์น้อยลง แต่ต้องการกล่องเครื่องมือประมวลผลภาพ) หรือ (2) ต่อท้ายcolormap hot(ต้องการ 12 เพิ่มเติม bytes)

เวอร์ชันที่ไม่ดี -

Z = zeros(N);
K = Z;

[X,Y]=ndgrid(-2:.01:2);
C = X+1i*Y;

for j = 1:99
  Z = Z.*Z + C;
  K(K==0 & abs(Z) > 2) = j;
end

imagesc(K)

การใช้ไลบรารี่เป็นเรื่องปกติถ้ามันบรรจุอยู่ใน Matlab โดยค่าเริ่มต้นและผู้ใช้สามารถเดาได้ว่ามันถูกใช้จากโค้ดหรือข้อความแสดงข้อผิดพลาด
Mark Jeronimus

เยี่ยมคุณเอาชนะฉัน ผมชอบในสถานที่ของฉันC-C นอกจากนี้คุณยังไม่ได้ใช้0*e(401) Nและเราสามารถทำให้m+=abs(z)<2ความคิดของฉันสั้นลงแทนคุณK(~K&abs(Z)>2)=jได้
aschepler

ค่าเริ่มต้นcolormap jetและcolormap hotไม่ถูกต้องทั้งคู่ - มีเพียง 64 สีที่ต่างกัน colormap(hot(101))ไม่เห็นความแตกต่างให้ฉันเห็น colormap([0,0,0;jet(100)])อาจจะเป็นที่ยอมรับ แต่ไม่แน่นอน
aschepler

มันใช้งานได้หรือไม่ บนคู่, วิธีการK=K+abs(Z)<2 K=((K+abs(Z))<2)(ดังนั้นผมจึงเป็นความผิดเกี่ยวกับการประมาณการหนึ่งไบต์เพื่อขจัด+=.)
aschepler

2
ชุด Mandelbrot หมุนได้ 90 องศายังคงเป็นชุด Mandelbrot
Chris Taylor

4

JavaScript + HTML5 (356B)

(หมายเหตุ: มีการเพิ่มบรรทัดที่ลงท้ายด้วย '//' ที่นี่เพื่อความสะดวกในการอ่าน)

รุ่นนักแสดง (375B):

<body onload='var
w,h=w=C.width=C.height=500,X=C.getContext("2d"),I=X.createImageData(w,h),D=I.data, //
y=0,f=255,T=setInterval(function(x,i,j,k,l,c,o){for(x=0;x<w;){                     //
for(i=x*4/w-2,j=y*4/h-2,k=l=0,c=f;--c&&k*k+l*l<4;)t=k*k-l*l+i,l=2*k*l+j,k=t
D[o=(y*w+x++)*4]=(c*=0xc0ffeeee)&f
D[++o]=c>>8&f
D[++o]=c>>16&f
D[++o]=f}X.putImageData(I,0,0)
++y-h||clearInterval(T)},0)'><canvas id=C>

รุ่นที่ช้า (356B): ลบ 'var' และพารามิเตอร์ในฟังก์ชั่นด้านในเพื่อใช้ขอบเขตส่วนกลาง

ลองใช้: http://jsfiddle.net/neuroburn/Bc8Rh/

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


ยกโทษให้ฉันถ้าฉันไม่เข้าใจคำแนะนำของคุณเกี่ยวกับการทำรุ่นสั้น
Mark Jeronimus

ไม่มีปัญหา. ลบvar w,ที่จุดเริ่มต้นและเปลี่ยนไปfunction(x,i,j,k,l,c,o) function()
uroeuroburɳ

4

Javascript, 285B

จากรหัสของฉันและการปรับปรุงบางอย่างเกี่ยวกับรหัสของ MT0ฉันมีสีลงถึง 285B:

document.body.appendChild(V=document.createElement('Canvas'));j=(D=(X=V.getContext('2d')).createImageData(Z=V.width=V.height=255,Z)).data;for(x=Z*Z;x--;){k=a=b=c=0;while(a*a+b*b<4&&Z>k++){c=a*a-b*b+4*(x%Z)/Z-3;b=2*a*b+4*x/(Z*Z)-2;a=c;}j[4*x]=99*k%256;j[4*x+3]=Z;}X.putImageData(D,0,0);

ในการดำเนินการ: http://jsfiddle.net/acLhe/7/

เดิมคือ Coffeescript, 342B

document.body.appendChild V=document.createElement 'Canvas'
N=99
Z=V.width=V.height=400
P=[]
P.push "rgba(0,0,0,"+Math.random()*i/N+')' for i in [N..0]
X=V.getContext '2d'
for x in [0..Z]
 for y in [0..Z]
  k=a=b=0
  [a,b]=[a*a-b*b+4*x/Z-3,2*a*b+4*y/Z-2] while a*a+b*b<4 and N>k++
  X.fillStyle=P[k-1]
  X.fillRect x,y,1,1

coffeescript ควรอ่านได้: - / ดูการทำงาน: http://jsfiddle.net/acLhe/6/

Mandelbrot กาแฟ


OP ขอสีเว้นแต่แพลตฟอร์มของคุณไม่รองรับสี ดูดี แต่รหัสที่รัดกุมและดี ยินดีต้อนรับสู่ PPCG!
Jonathan Van Matre

ฉันเริ่มจากขนาด 285B นี้และปรับปรุงให้ดีขึ้นในคำตอบ
Kamil Kiełczewski

4

QBasic, QuickBasic, QB64 - 156 153

SCREEN 13
FOR J=0TO 191
B=J/48-2
FOR I=0TO 191
A=I/48-2
X=A
Y=B
C=0
DO
U=X*X
V=Y*Y
Y=2*X*Y+B
X=U-V+A
C=C+1
LOOP UNTIL C>247OR U+V>4
PSET(I,J),C
NEXT
NEXT

จานสี DOS มาตรฐาน:

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


4

Tcl / Tk, 316

322 324 336 348 349 351 352 353 354 355

ตอนนี้เป็นเวอร์ชั่นที่สั้นกว่าโดยใช้ตัวอักษร #RGB สามสีสไตล์แบบย่อ (แทนที่ #RRGBGBB triplets) ซึ่งส่งผลให้สีต่างกัน

และเล่นกอล์ฟเพิ่มเติม

rename set s
grid [canvas .c -w 640 -he 640]
.c cr i 320 320 -i [s p [image c photo -w 640 -h 640]]
time {incr x
s y 0
time {incr y
s a 0
s b 0
s n 0
while \$n<99 {s A [expr $a*$a-$b*$b+$x[s f *4/639.-2]]
if [s b [expr 2*$a*$b+$y$f]]*$b+[s a $A]*$a>4 break
incr n}
$p p [format #%03x [expr $n*41]] -t $x $y} 640} 640

เศษส่วน


Tcl / Tk, 325

331 333 345 357 358 360 361 362 364 365

ฉันคิดว่าฉันจะชนะถ้าเกณฑ์เป็นความงาม!

rename set s
grid [canvas .c -w 640 -he 640]
.c cr i 320 320 -i [s p [image c photo -w 640 -h 640]]
time {incr x
s y 0
time {incr y
s a 0
s b 0
s n 0
while \$n<99 {s A [expr $a*$a-$b*$b+$x[s f *4/639.-2]]
if [s b [expr 2*$a*$b+$y$f]]*$b+[s a $A]*$a>4 break
incr n}
$p p [format #%06x [expr $n*16777215/99]] -t $x $y} 640} 640

ที่นำเสนอ:

เศษส่วน


1
ดี คุณสามารถลดตัวละครไม่กี่ตัว (ลดลงเหลือ 380 ฉันคิดว่า) โดยการเพิ่มrename set sที่ด้านบนแล้วแทนที่ทั้งหมดsetด้วยs
Rolazaro Azeveires

4

Excel VBA, 251 246 224 223 221 ไบต์

บันทึก 5 ไบต์ขอบคุณไปที่ catcat บันทึกไว้ 23 ไบต์ขอบคุณ Taylor Scott

Sub m
D=99
For x=1To 4*D
For y=1To 4*D
p=0
q=0
For j=1To 98
c=2*p*q
p=p^2-q^2-2+(x-1)/D
q=c+2+(1-y)/D
If p^2+q^2>=4Then Exit For
Next
j=-j*(j<D)
Cells(y,x).Interior.Color=Rnd(-j)*1E6*j/D
Next y,x
Cells.RowHeight=48
End Sub

เอาท์พุท:

เอาต์พุตด้วย D = 99

ฉันสร้างเวอร์ชันที่ทำมานานแล้ว แต่มันมีความพิเศษมากมายเช่นให้ผู้ใช้เลือกสีพื้นฐานและคณิตศาสตร์ที่ง่ายต่อการติดตาม การตีกอล์ฟลงเป็นความท้าทายที่น่าสนใจ Colorวิธีการใช้1E6เป็นวิธีการที่จะได้รับช่วงกว้างของสีตั้งแต่สีที่ถูกต้องไป0 2^24การตั้งค่า10^6ให้เป็นพื้นที่ความคมชัดที่ดี

คำอธิบาย / การจัดรูปแบบอัตโนมัติ:

Sub m()

    'D determines the number of pixels and is factored in a few times throughout
    D = 99
    For x = 1 To 4 * D
    For y = 1 To 4 * D
        'Test to see if it escapes
        'Use p for the real part and q for the imaginary
        p = 0
        q = 0
        For j = 1 To 98
            'This is a golfed down version of complex number math that started as separate generic functions for add, multiple, and modulus
            c = 2 * p * q
            p = p ^ 2 - q ^ 2 - 2 + (x - 1) / D
            q = c + 2 + (1 - y) / D
            If p ^ 2 + q ^ 2 >= 4 Then Exit For
        Next

        'Correct for no escape
        j = -j * (j < D)

        'Store the results
        'Rnd() with a negative input is deterministic
        'This is what gives us the distinct color bands
        Cells(y, x).Interior.Color = Rnd(-j) * 1000000# * j / D

    Next x, y

    'Resize for pixel art
    Cells.RowHeight = 48

End Sub

ฉันเล่นรอบ ๆD=999และj=1 to 998เพื่อให้ได้ภาพที่ใหญ่และแม่นยำยิ่งขึ้น ผลลัพธ์ที่ได้จะไม่เกี่ยวข้องกับความท้าทายเพราะพวกเขากำลังวิธีที่มีขนาดใหญ่เกินไป แต่พวกเขามีความเรียบร้อย

D = 999


@ceilingcat ขอบคุณ นั่นคือการพกพาจากต้นฉบับของฉันซึ่งมีฟังก์ชั่นพิเศษสำหรับเลขจำนวนเชิงซ้อน
Engineer Toast

จำเป็นต้องมี> = 4 หรือคุณสามารถออกไปพร้อมกับ> 4 หรือไม่ นอกจากนี้ยังสามารถแทนที่ด้วยj<99 j<D
ceilingcat

@EngineerToast คุณสามารถวาง()จากชื่อย่อยคุณควรเปลี่ยน(j<99)ไป(j<d)และคุณก็สามารถสำหรับวัตถุประสงค์ของการทำตารางเซลล์ใช้เฉพาะCells.RowHeight=48ในสถานที่ของCells.RowHeight=9, Cells.ColumnWidth=1- นี้ไม่ทำให้ messing รอบกับการส่งออกของคุณยากขึ้น แต่ได้รับการยอมรับในฐานะที่ถูกต้อง โดยชุมชน -
Taylor Scott

1
@TaylorScott ฉันจำRowHeightเคล็ดลับจากโพสต์เคล็ดลับ VBA และมีความตั้งใจที่จะรวมมันหลังจากที่ฉันได้ภาพสวยทั้งหมดของฉัน นั่นเป็น chunk'o'bytes ที่ดีขอบคุณ
Engineer Toast

ฉันเชื่อว่าคุณสามารถออกไปได้ด้วยการลบไบต์อื่นโดยการแลกเปลี่ยน2^20กับ1E6
Scott Scott

3

Perl + GD, 264

$I=new GD::Image $s=499,$s;Z(0,0,0);Z(map rand 256,1..3)for
0..99;for$x(0..$s){for$y(0..$s){for($H=$K=$c=$t=0;$c++<99&&$H*$H+$K*$K<4;){sub
Z{$I->colorAllocate(@_)}($H,$K)=($H*$H-$K*$K+4*$x/$s-2,2*$H*$K+4*$y/$s-2)}use
GD;$I->setPixel($x,$y,$c<99&&$c)}}print $I->png

เศษส่วน Mandelbrot จาก Perl + GD

Golfed จากรหัสนี้


2
เสนอชื่อเข้าชิง: โทนสีที่น่าเกลียดที่สุด
meawoppl

3

ลอยตัว, 620 พิกเซล

ภาษาที่ฉันสร้างขึ้นเมื่อฉันได้รับแรงบันดาลใจจากความท้าทายของตัวเองและจากภาษาลึกลับ Piet

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


2
เชื่อมโยงไปยังภาษาและคำอธิบายของรหัสหรือไม่ หรือที่จริงแล้วรหัสคืออะไร?
MD XF
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.