Gambar mandelbrot dalam setiap bahasa


91

Saya selalu menggunakan gambar Mandelbrot sebagai versi 'grafis' dari Hello World dalam aplikasi grafis apa pun yang saya dapatkan. Sekarang giliran kalian.

  • Bahasa harus mampu menghasilkan grafik atau menggambar grafik (menyimpan file yang tidak diizinkan)
  • Jadikan gambar atau grafik persegi. Ukuran setidaknya 128 dan paling banyak 640 di *
  • Koordinat fraktal berkisar dari sekitar -2-2i hingga 2 + 2i
  • Pixel di luar set Mandelbrot harus diwarnai sesuai dengan jumlah iterasi sebelum besarnya melebihi 2 (tidak termasuk * hitam & putih)
  • Setiap hitungan iterasi harus memiliki warna unik *, dan warna-warna tetangga sebaiknya mudah dibedakan oleh mata
  • Pixel lain (mungkin di dalam himpunan Mandelbrot) harus berwarna hitam atau putih
  • Setidaknya 99 iterasi
  • Seni ASCII tidak diizinkan

* kecuali dibatasi oleh platform, mis. kalkulator grafis

Diizinkan:
Diizinkan
Tidak diizinkan:
Dilarang
(gambar menyusut)

Kondisi menang:

Versi terpendek (ukuran dalam byte) untuk setiap bahasa akan disebutkan dalam pos ini, diurutkan berdasarkan ukuran.
Tidak ada jawaban yang akan 'diterima' dengan tombol.

Papan peringkat:


8
"Mudah dibedakan oleh mata" sulit untuk dibuat objektif. ... Selain itu, terlepas dari hubungan pribadi Anda berdua, set Mandelbrot tidak ada hubungannya dengan Hello World, jadi sebaiknya hilangkan itu dari judul kecuali Anda sengaja mengendalikan mesin pencari.
Jonathan Van Matre

1
Terkait: ASCII Mandelbrot (meskipun beberapa jawaban yang diposting tidak ada ASCII dan mungkin lebih cocok sebagai jawaban untuk pertanyaan ini).
Peter Taylor

3
Saya telah melihat beberapa orang sekarang menyebutkan bahwa mereka menjadikan Mandelbrot sebagai "Hello World". Saya sudah melakukan itu juga, selama sekitar 30 tahun. Mandelbrot adalah "Hello World" yang sempurna karena ia menunjukkan bahwa Anda memiliki akses piksel ke layar dan memberikan kesan yang baik untuk kinerja terikat komputasi pada platform baru.
Roger Dahl

6
Ide bagus untuk mengajukan pertanyaan yang membutuhkan kombinasi kepekaan matematis dan estetika, kemudian memaksakan semua keputusan desain sebelumnya.
jwg

3
Siapa pun yang berhasil membuat satu di brainfuck MENANG, saya akan mengatakan: D
MadTux

Jawaban:


94

Tajam EL-9300 Graphics Calculator, 296 byte

Ini adalah kalkulator grafik sekolah menengah saya , yang digunakan selama 20 tahun yang lalu! Saya ingat menulis generator mandelbrot untuk itu saat itu. Dan benar saja, masih tersimpan di memori 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

Butuh waktu sekitar 90 menit untuk membuatnya.

Ini benar-benar ungolfed. Saya yakin saya bisa menghemat sedikit ruang, tetapi saya hanya ingin berbagi keingintahuan sejarah ini!

Saya suka bahwa satu-satunya pernyataan kontrol yang tersedia adalah gotos.

Ini foto. Saya tidak punya cara lain untuk mengeluarkan keluaran grafis: masukkan deskripsi gambar di sini


1
Saya juga, tetapi memori NV saya menjadi kosong setelah bertahun-tahun waktu penyimpanan.
Mark Jeronimus

2
zx²+zy²>4bukankah itu bisa terjadi Abs(x)>2?
Mark Jeronimus

1
Mungkin Anda harus mendapatkan baterai baru ...
NothingsImpossible

25
Menarik. Jadi, Anda sudah menjadi kutu buku untuk sementara waktu.
devnull

4
Nice "Screenshot"
meawoppl

83

Saya menemukan ini beberapa hari yang lalu. Saya tidak mengambil kredit untuk itu, tapi sial, apakah itu luar biasa:

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

masukkan deskripsi gambar di sini http://preshing.com/20110926/high-resolution-mandelbrot-in-obfuscated-python/


12
Tampaknya dilarang: daerah tidak mudah dibedakan, atau bahkan tidak ada sama sekali.
Primo

5
Juga, ini menulis ke file.
Lie Ryan

40
tidak diizinkan atau tidak, ini cukup mengagumkan: D
Navin

18
@DigitalTrauma, heck, +1 untuk input paling indah!
Brian S

19
Apakah ini dianggap sebagai quine? ;-)
Blazemonger

47

LaTeX, 673 byte

\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

Hasil 129x129 (129 × 129)

Gambar PDF terdiri dari unit persegi berwarna dengan ukuran 1bp × 1bp.

Tidak disatukan

% 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 byte

Biner lengkap, dalam HEX, yang saya buat dengan tangan, adalah:

DBE3BE00A0B81300CD1056BA640007BF87F9FDBDC7008BCDE81A008AC3AA4979F7B9C70083EF784D79EE33C0CD16B80300CD10CD208BC12BC289441CDF441CDF06A701DEF9D95C088BC52BC289441CDF441CDF06A701DEF9D95C0CD9EED914D95404D95410D95C14B301D904D84C04DE0EA901D8440CD95404D94410D86414D84408D914D80CD95C10D84C04D95414D84410DF06AB01DED99BDFE09B9E7207433ADA72C632DBC3320002000400

Gambar sampel adalah:

Tangkapan layar Mandlebrot dengan potongan hitam

Sumber lengkap dalam ASM yang dapat dibaca cukup panjang (saya menggunakan ini untuk mengetahui bagaimana saya mengkodekan pengisap ini):

.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

Ini dirancang untuk dikompilasi dengan TASM, berjalan dalam MCGA, dan menunggu penekanan tombol sebelum mengakhiri program. Warnanya hanyalah palet MCGA standar.

EDIT: Dioptimalkan, sekarang gambarnya mundur (gambar yang sama), dan menyimpan 31 byte!

EDIT 2: Untuk meredakan OP, saya telah membuat ulang biner dengan tangan. Dengan melakukan itu, saya juga mencukur 4 byte lagi. Saya mendokumentasikan setiap langkah dari proses, menunjukkan semua pekerjaan saya sehingga siapa pun dapat mengikuti jika mereka benar-benar ingin, di sini (peringatan, itu membosankan dan sangat panjang): http://lightning.memso.com/media/perm/ mandelbrot2.txt

Saya menggunakan beberapa regex di EditPadPro, untuk menemukan semua ; Final: ...entri dalam file dan membuangnya sebagai hex biner ke file .com. Biner yang dihasilkan adalah apa yang Anda lihat di bagian atas posting ini.


1
Kode mesin tidak masuk hitungan. Jika itu penting, maka bahasa apa pun yang menghasilkan kode byte atau kode mesin harus lebih pendek. Saya menghitung 820 setelah mengubah segalanya menjadi nama panjang 1-karakter.
Mark Jeronimus

3
Saya bisa memberikan kode semuanya dalam biner jika membuatnya lebih mudah bagi Anda, tapi itu seperti meminta siapa pun yang menggunakan bahasa tingkat tinggi untuk menghindari penggunaan konstruksi otomatis, makro, dll. Itulah SEMUA yang sebenarnya dimiliki oleh perakitan, hanya sekelompok makro. Biner yang dihasilkan untuk menjalankan JavaScript penuh, Perl, dll. Termasuk biner perpustakaan. Dengan ASM, nilai hex akhir adalah segalanya, termasuk library, ALL CODE.
Mark Ormston

5
Tidak. Saya bisa mengonversi ASM ke biner jika perlu. Itu akan keluar dengan 177 byte yang sama persis yang membantu assembler saya. Kode yang dihasilkan dapat disisipkan oleh siapa saja dengan editor biner ke file baru, disimpan, 177 byte, dan itu akan berfungsi seperti yang diharapkan. Rupanya SO terbagi atas kiriman ASM, jadi mungkin Anda harus mengklarifikasi jika Anda merasa itu tidak masuk hitungan: meta.codegolf.stackexchange.com/questions/260/…
Mark Ormston

6
Baiklah, jadi, untuk membuktikan ini entri yang valid, saya menghabiskan waktu yang dibutuhkan untuk menerjemahkan ini ke biner. Saya telah memperbarui jawaban saya sesuai dengan itu.
Mark Ormston

7
Masalahnya, tidak ada kompiler dengan perakitan. Anda hanya menggunakan makro. Mengatakan bahwa itu tidak masuk hitungan adalah seperti mengatakan Anda tidak dapat menggunakan #definepernyataan yang telah ditentukan sebelumnya dalam C. Itu hanya memakan waktu untuk mengganti semuanya secara manual.
Mark Ormston

28

Java, 505 405 324 byte

Hanya perhitungan standar, dengan golfitude sekarang dengan golfitude ekstra.

masukkan deskripsi gambar di sini

Golf:

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

Dengan jeda baris:

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);- sangat tergantung pada Tema yang digunakan, tapi saya akan menerimanya.
Mark Jeronimus

Anda dapat menjatuhkan impor di Jawa karena mereka dibuat secara otomatis.
Mark Jeronimus

Saya juga melihat di doublemana floatdapat digunakan jika Anda mencoba
Mark Jeronimus

JFrame=> Framemencukur 2 karakter. Meskipun Anda tidak bisa menutup jendela lagi. ;)
EthanB

2
Kelas Anda tidak perlu bersifat publik. Selanjutnya, gunakan Java 8 untuk menyingkirkan finalpengubah. Dan Anda tidak boleh menghilangkan impor untuk menjadi pengiriman lengkap.
Victor Stafusa

21

Javascript (ECMAScript 6) - 315 308 Karakter

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)

Output Default

(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)

  • Ubah nuntuk memvariasikan ukuran gambar (dan jumlah iterasi).
  • Ubah nilai yang diteruskan dalam f(87);f(0);f(0);panggilan (dekat akhir) untuk mengubah nilai warna RGB. ( f(8);f(8);f(8);berwarna abu-abu.)

Dengan f(8);f(23);f(87);:

masukkan deskripsi gambar di sini

(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
Bagus. d=documentakan menghemat lebih banyak. (Juga, Apakah ada alasan untuk membuat kanvas? Apakah codegolf mengasumsikan tingkat HTML tertentu tersedia?)
Matthew Wilcoxson

1
Anda dapat menulis document.createElement`canvas` dan menyimpan 2 byte. Sama seperti getContext`2d` .
Ismael Miguel

Saya tidak menganggap Kanvas HTML karena ini adalah solusi JavaScript murni.
MT0

atau Anda dapat 'menjatuhkan' kanvas sama sekali seperti di sini
Kamil Kiełczewski

19

J, 73 byte

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

set mandelbrot

Edit , beberapa penjelasan:

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 tetapi apakah mungkin bagi Anda untuk menjelaskan sedikit bagaimana kode itu bekerja? Khususnya saya penasaran ingin tahu bagaimana (di mana dalam kode) apakah itu memilih warna?
plannapus

1
@ MarkJeronimus, saya bisa membuatnya 70 tetapi saya menyimpan beberapa hal untuk kejelasan. Saya, dengan demikian, mengambil kebebasan untuk mengabaikan LF saat menghitung.
Eelvex

@plannapus, OK, menambahkan beberapa komentar. Pengambilan warna dilakukan dengan (0,?$~99 3)yang menghasilkan triplet 100 rgb, satu untuk setiap level. Karena keacakan, Anda mungkin mendapatkan kurang dari 100 kembar tiga sehingga beberapa level akan memiliki transisi yang lebih mulus (tetapi masih memiliki warna yang berbeda).
Eelvex

17

Mathematica, 214 191 215 19 30

Sejak versi 10.0 ada built-in: (19 byte)

MandelbrotSetPlot[]

mandelbrot


Untuk menyesuaikan dengan persyaratan rentang koordinat, 11 byte tambahan diperlukan. (30 byte)

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

m2


Kasing linting tangan:

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,#]]&)]

hijau


{b, -2, 2, .01}, {a, -2, 2, .01}lebih pendek dan lebih dekat dengan aturan
Mark Jeronimus

@MarkJeronimus Terima kasih. Saya menggunakan rentang yang disarankan untuk gambar iterasi.
DavidC

Anda sudah hampir benar, maka Anda membuat bagian dalamnya menjadi tidak hitam. Bingkai terakhir di GIF berwarna hitam di dalam dan jawaban yang diizinkan. EDIT: dan saya menghitung 195 byte.
Mark Jeronimus

Saya melewatkan poin tentang menjadi hitam. Hitungan meningkat karena beberapa karakter tunggal menjadi dua karakter di cut-and-paste ke SE.
DavidC

Solusi bawaan Anda menggunakan interpretasi yang sangat longgar The fractal coordinates range from approximately -2-2i to 2+2i.
Jonathan Frech

16

Python dengan Pylab + Numpy, 151 byte

Saya tidak tahan melihat entri Python non-DQ'ed, tapi saya pikir saya benar-benar kalah dalam hal ini, dan saya membuatnya menjadi 153 karakter!

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

Juga, terutama, baris kedua hingga terakhir memunculkan 4 peringatan runtime yang berbeda, sebuah catatan pribadi baru!

masukkan deskripsi gambar di sini


Saya menghitung 152. Tidak ada ruang yang diperlukan antara importdan *, dan tidak mendefinisikan fsama sekali harus lebih pendek, kecuali saya telah salah mengerti sesuatu, yang mungkin. Anda juga harus mengubahnya di sekitar sehingga 0 iterasi dan 1 iterasi dibedakan (keduanya sama-sama berwarna abu-abu).
Primo

Aneh. Apakah kita memasukkan bukti? Diperbaiki dan sedikit lebih kecil. Sebentar.
meawoppl

Saya mendapat 151 dengan wc. Golf pertama, jadi tidak yakin bagaimana cara mencetaknya.
meawoppl

Saya menghitung 150, tanpa tertinggal baris baru. Beberapa penerjemah / kompiler menuntut satu, tetapi interpreter python tidak apa-apa tanpa. Tidak yakin tentang itu wc, tapi mungkin coba stat -c %ssaja. Apakah batas atas dan bawah hitam bagian dari gambar?
Primo

1
Anda dapat menyimpan 1 karakter dengan menggunakan from numpy import*bukan import numpy as ndan mgridbukan n.mgrid.
nyuszika7h

15

C + Allegro 4.2.2 - 248 byte

#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()

Keluaran:

MSet 1


Anda harus menyebutkan bahwa ini adalah Allegro 4 (yang sangat berbeda dari Allegro 5). Versi mana tepatnya ini?
Victor Stafusa

panjangnya 246 atau 249
Mark Jeronimus

@Victor Allegro 4.2.2.
Oberon

1
@ MarkJeronimus Bukankah seharusnya ada baris baru antara ... allegro.h>dan x=-1, ...? Saya kira Notepad ++ menghitungnya sebagai \r\n= 0D 0A.
Oberon

1
Saya pikir 0.01bisa diketik sebagai .01.
Yytsi

14

Windows PowerShell (v4), 299 byte

Gambar fraktal 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()

Instruksi

  • Jalankan konsol PowerShell yang normal (ISE mungkin tidak berfungsi)
  • Salin / rekatkan kode, tekan Enter
  • Tunggu - dibutuhkan satu menit atau lebih untuk berjalan
  • Satu-satunya cara untuk berhenti adalah menutup konsol

Komentar

  • Ada sedikit pengujian aturan yang terjadi dengan warna di dalam set; aturan mengatakan "Pixel lain (mungkin di dalam set Mandelbrot) harus berwarna hitam atau putih '" ; kode ini mewarnai piksel RGB sepenuhnya hitam (0,0,0) ... itu hanya menjadi RGBA hitam transparan (0,0,0,0). Jadi yang muncul adalah warna latar belakang form dari tema Windows saat ini, RGB yang sedikit putih (240.240.240) dalam kasus ini.

Saya akan mengubahnya lt2untuk lt4menjadikannya "set mandelbrot" alih-alih gambar yang Anda miliki sekarang, Banyak titik set yang tertelan oleh pita warna.
Mark Jeronimus

Rupanya Magnitude a*a+b*btidaksqrt(a*a+b*b)
Mark Jeronimus

Saya pikir saya menguji itu sebelumnya, tetapi saya mencari jawaban untuk "di mana garis horizontal di sebelah kiri hilang?", Dan setelah sedikit, saya menemukannya tepat di mana Anda berkata -lt4,. Itu bagus - terima kasih. Saya telah memperbarui jawaban saya dengan kode yang diperbaiki, dan gambar. (Harus memikirkan kembali pemahaman saya tentang apa yang dilakukannya, karena saya kehilangan sesuatu).
TessellatingHeckler

14

Python + PIL , 166 byte

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()

Output (akan terbuka di penampil * .bmp default):


1
Anda dapat mengurangi 3 jika Anda menghilangkan yloop. r=range(d*d), gunakan x/ddan x%duntuk x dan y.
Geobits

@ Ingat ide itu benar-benar menyelamatkan 10, terima kasih!
primo

1
Tipe kompleks dapat diinisialisasi seperti: c = 1 + 2j, yang saya pikir akan menyelamatkan Anda beberapa karakter dengan: z = o = x / 9e4-2 + (x% d / 150.-2) * 1j; c = 99
meawoppl

@meawoppl 7 lainnya: D
primo

Secara teknis tidak diizinkan: ini bukan fitur keluaran grafis dari Python itu sendiri (dan Image.show()secara implisit menyimpan file sementara).
nneonneo

12

BBC Basic (228 byte)

Bagaimana dengan bahasa yang tidak pernah didengar orang dalam kode golf? Kemungkinan besar bisa dioptimalkan, tapi saya tidak tahu di mana - perbaikan mungkin. Berbasis di http://rosettacode.org/wiki/Mandelbrot_set#BBC_BASIC , tapi saya mencoba kode golf sebanyak mungkin.

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

Set Mandelbrot yang dihasilkan

The >simbol pada gambar prompt, dan itu secara otomatis setelah menjalankan program.


Tidak perlu merencanakan dua kali, cukup gunakan versi yang lebih tidak efisien. Apakah itu tidak mendukung NEXT Y,X?
Mark Jeronimus

10

APL, 194 karakter / byte *

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')

Ini untuk Dyalog APL dengan ⎕IO ⎕ML←1 3

Sebagian besar ruang diambil oleh panggilan API untuk menampilkan bitmap di jendela (baris 2, 3, 4)
Jika ada jalan pintas untuk melakukannya, kode akan turun hingga 60 karakter (baris 1)

PLZ BANTUAN TEMUKAN SHORTCUT KTHX

Versi tidak digabungkan (hanya baris 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    

Tangkapan layar:

(Versi freeware dijalankan di OS X di bawah Wine. Ya saya murah seperti itu.)

tangkapan layar

*: Dyalog memiliki charset byte tunggal sendiri, dengan simbol APL dipetakan ke nilai 128 byte atas, sehingga seluruh kode dapat disimpan dalam 194 byte. Setiap pernyataan dalam catatan kaki ini mungkin benar. Tetap tenang dan terus bermain golf.


10

Mathematica 10.0, 19 karakter

MandelbrotSetPlot[]

MandelbrotSetPlot adalah fungsi baru di Mathematica 10.0.

masukkan deskripsi gambar di sini


Betapa nyamannya, bahwa fungsi bawaan ini kebetulan memenuhi semua persyaratan saya (kecuali lokasi, yang dapat diatur dengan 13 karakter lainnya). Kecuali ini adalah celah standar.
Mark Jeronimus

19
Golf kode umumnya dimenangkan oleh bahasa spesialis dengan token satu karakter, atau oleh sistem seperti Mathematica yang memiliki sejumlah besar fungsi khusus bawaan. Untuk menggunakannya tidak curang, lebih dari menggunakan perintah karakter tunggal akan di APL.
Michael Stern

9

R, 199 211 karakter

Solusi lama dengan 199 karakter:

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)

Dengan lekukan:

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)

masukkan deskripsi gambar di sini

Sunting: Solusi pada 211 karakter yang mewarnai bagian dalam set dan bagian luar layer pertama berbeda:

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)

Dengan lekukan:

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)

masukkan deskripsi gambar di sini


secara teknis hitam di luar dilarang. Apakah Anda melewatkannya atau sulit untuk diterapkan?
Mark Jeronimus

@ MarkJeronimus keduanya sebenarnya :) Saya akan mencoba untuk melihat bagaimana melakukan itu tetapi saya tidak 100% yakin bahwa saya akan menemukan cara untuk melakukan itu dengan bersih.
plannapus

@MarkJeronimus Selesai!
plannapus

5
Tempat kedua di divisi warna mengerikan.
meawoppl

1
@meawoppl menyalahkan rainbow():)
plannapus

9

Java - Memproses (271 byte)

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

Diperluas:

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


Ah, maaaaan, saya ingin melakukan ini. +1 .
SIGSTACKFAULT

8

TI-80 BASIC, 125 106 byte

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

Berdasarkan jawaban Digital Trauma. masukkan deskripsi gambar di sini


6

GLSL - 225 byte:

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

Mendefinisikan variabel dalam kode (242 byte):

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

Lihat di ShaderToy

Golf Mandelbrot

Ini membutuhkan tekstur palet yang sesuai untuk dimuat iChannel0. (Pewarnaan di sini berasal dari tekstur "piksel acak" di ShaderToy).


Deklarasi variabel juga harus dihitung, kecuali mereka dapat dihasilkan secara otomatis dari kode. (skema warna baik-baik saja jika hanya tersedia sebagai pengaturan eksternal)
Mark Jeronimus

@ MarkJeronimus: Untuk lingkungan ShaderToy, variabel-variabel ini diperbaiki. Kalau tidak, untuk shader standar, saya akan memilih nama variabel yang lebih pendek.
nneonneo

Apakah ini yang tercepat di antara mereka semua?
Demi

6

Oktaf ( 212 136 byte)

(Sekarang termasuk beberapa ide karena @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])

Dengan spasi putih:

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

Keluaran:

Mandelbrot langkah ke abs (z)> 2

Untuk mengonversi ke Matlab, ubah " m+=abs(z)<2" menjadi " m=m+(abs(z)<2)". [+3 byte]

Untuk membuat rasio aspek 1: 1, tambahkan " ;axis image". [+11 byte]

Jawaban pertama saya (212 byte):

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

Mungkin ada cara yang lebih pendek untuk mendapatkan colormap yang tidak
bersambung

Ya, jauh lebih baik sekarang.
aschepler

1 solusi bagus dan ringkas. Tetapi rasio aspek Anda bukan 1: 1 (lih. Aturan n ° 2: output harus kuadrat).
plannapus

Memperbaiki rasio aspek akan membutuhkan 11 byte lagi: tambahkan " ;axis image". Apakah itu harus memenuhi syarat?
aschepler

Saya pikir itu hanya saya nitpicking :), OP tampaknya tidak punya masalah dengan itu karena dia tidak mengatakan apa-apa.
plannapus

6

Applesoft BASIC, 302 286 280 byte

Ini mengambil poin acak untuk menggambar, sehingga akan berjalan selamanya dan mungkin tidak pernah mengisi bidang penuh.

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

Ternyata Applesoft BASIC benar - benar memaafkan tentang kurangnya ruang. Hanya satu ruang yang diperlukan di seluruh program.

Output setelah 14 jam:

        keluaran

GIF:

        gif

Sebelum bermain golf:

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

Catatan: POKE 49234,0(dalam Applesoft BASIC) menempatkan mesin ke mode grafis penuh.

Versi yang dioptimalkan untuk tampilan 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

Output setelah 12 jam:

        & bb

Versi yang akan bekerja di 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

Akan lebih kecil (dan lebih lambat) jika Anda tidak merencanakan dua piksel sekaligus tetapi memilih piksel acak di seluruh layar.
Mark Jeronimus

1
@ MarkJeronimus Sudah sangat lambat bahwa versi warna belum selesai, setelah memposting ini 5 hari yang lalu. Saya kira saya tidak mampu membuatnya lebih lambat: P
MD XF

5

gnuplot 110 (105 tanpa baris baru)

Entri gnuplot wajib. Sudah dilakukan berkali-kali tetapi yang ini dari awal (bukan itu sulit). Saya suka bagaimana gnuplotgolf perintahnya secara intrinsik :)

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

Namun, saya sangat kecewa dengan masuknya bilangan kompleks. x*{1,0}+y*{0,1}harus menjadi cara paling menyedihkan yang ada untuk membangun bilangan kompleks.

Ups, gambar: gnuplot mandelbrot

Setel contoh lebih tinggi untuk resolusi yang lebih baik. Kita juga bisa mengatakan unset ticsdan unset colorboxuntuk gambar murni, tapi saya pikir versi ini memenuhi syarat.


Taruhan salinan / pasta dari hit google pertama "gnuplot mandel". Sebagai permulaan, *{1,0}persatuan dan lebih seperti cara kode-bowling mengatakan *1, dan mungkin bisa dijatuhkan. (belum diuji)
Mark Jeronimus

1
Tidak, ini bukan copy-paste. Ini formula yang sangat mudah dan bahkan tidak perlu mencarinya. Namun, saya memang menemukan halaman yang Anda dapatkan dengan pencarian itu ketika saya mencari cara yang lebih baik untuk menginisialisasi bilangan kompleks (implementasinya berbeda, well, berbeda seperti dalam kasus ini). Terima kasih atas tip tentang bagian yang sebenarnya, ini berfungsi. Pemasangan.
orion

5

Matlab (89 bytes)

[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)

Keluaran -

masukkan deskripsi gambar di sini

Tidak memenuhi persyaratan bahwa sel-sel dalam harus hitam atau putih, tetapi itu dapat dipenuhi dengan (1) menggunakan imshow(K)alih-alih imagesc(K)(memerlukan 1 byte lebih sedikit tetapi membutuhkan kotak alat pemrosesan gambar) atau (2) menambahkan colormap hot(membutuhkan 12 lebih banyak byte).

Versi tidak disatukan -

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)

Menggunakan perpustakaan baik-baik saja jika itu dikemas dalam Matlab secara default dan setiap pengguna dapat menebak itu digunakan dari kode atau pesan kesalahan.
Mark Jeronimus

Bagus, Anda mengalahkan saya. Saya suka C-Cdi tempat saya 0*e(401). Plus, Anda tidak menggunakan N. Dan kita bisa sedikit lebih pendek menggunakan m+=abs(z)<2ide saya di tempat Anda K(~K&abs(Z)>2)=j.
aschepler

Default colormap jetdan colormap hotkeduanya salah meskipun - mereka hanya memiliki 64 warna berbeda. colormap(hot(101))tidak terlihat berbeda secara visual bagi saya. colormap([0,0,0;jet(100)])mungkin dapat diterima tetapi rapuh.
aschepler

Apakah itu bekerja? Pada Oktaf, K=K+abs(Z)<2artinya K=((K+abs(Z))<2). (Jadi saya salah tentang perkiraan satu byte untuk dihilangkan +=.)
aschepler

2
Perangkat Mandelbrot yang diputar 90 derajat masih merupakan perangkat Mandelbrot.
Chris Taylor

4

JavaScript + HTML5 (356B)

(Catatan: baris yang diakhiri dengan '//' ditambahkan di sini untuk dibaca)

Versi pemain (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>

Versi lambat (356B): hapus 'var' dan parameter di fungsi bagian dalam sehingga lingkup global digunakan.

Cobalah: http://jsfiddle.net/neuroburn/Bc8Rh/

masukkan deskripsi gambar di sini


Maafkan saya jika saya tidak mengerti instruksi Anda tentang pembuatan versi pendek.
Mark Jeronimus

Tidak masalah. Hapus var w,di awal, dan ubah function(x,i,j,k,l,c,o)ke function().
ɲeuroburɳ

4

Javascript, 285B

Berdasarkan dari kode saya dan beberapa perbaikan pada kode MT0 , saya memiliki warna hingga 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);

dalam aksi: http://jsfiddle.net/acLhe/7/

adalah: 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 seharusnya dapat dibaca: - / lihat dalam aksi: http://jsfiddle.net/acLhe/6/

Naskah Mandelbrot


OP meminta warna kecuali platform Anda tidak mendukung warna. Tampak hebat, dan kode ringkas yang bagus. Selamat datang di PPCG!
Jonathan Van Matre

Saya mulai dari ukuran ini 285B dan memperbaikinya lebih dalam jawaban
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

Palet DOS standar:

masukkan deskripsi gambar di sini


4

Tcl / Tk, 316

322 324 336 348 349 351 352 353 354 355

Sekarang versi yang lebih pendek dengan menggunakan 3 huruf #RGB singkatan warna kembar tiga gaya (bukan kembar tiga #RRGGBB), yang menghasilkan warna yang berbeda.

Dan lagi bermain golf.

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

fraktal


Tcl / Tk, 325

331 333 345 357 358 360 361 362 364 365

Saya pikir saya akan menang jika kriterium itu indah!

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

Presentasi:

fraktal


1
Bagus. Anda dapat mengurangi beberapa karakter (hingga 380, saya pikir) dengan menambahkan rename set sdi atas dan kemudian mengganti semua setdengans
Rolazaro Azeveires

4

Excel VBA, 251 246 224 223 221 byte

Disimpan 5 byte berkat ceilingcat Disimpan 23 byte berkat 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

Keluaran:

Output dengan D = 99

Saya membuat versi yang melakukan ini sejak lama, tetapi ada banyak tambahan seperti membiarkan pengguna memilih warna dasar dan matematika yang mudah diikuti. Bermain golf turun merupakan tantangan yang menarik. The ColorMetode menggunakan 1E6sebagai sarana untuk mendapatkan berbagai macam warna karena warna yang valid 0untuk 2^24. Mengaturnya untuk 10^6memberikan area kontras yang bagus.

Penjelasan / Pemformatan Otomatis:

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

Saya juga bermain-main dengan D=999dan j=1 to 998untuk mendapatkan gambar yang jauh lebih besar dan lebih tepat. Hasil tidak relevan dengan tantangan karena mereka terlalu besar tetapi mereka yang rapi.

D = 999


@ceilingcat Terima kasih. Itu adalah akumulasi dari asli saya yang memiliki fungsi khusus untuk matematika bilangan kompleks.
Engineer Toast

Apakah ini benar-benar harus> = 4 atau dapatkah Anda lolos dengan> 4? Juga, bisa diganti j<99dengan j<D.
ceilingcat

@ EngineerToast Anda dapat menghapus ()dari sub nama, Anda harus mengubah (j<99)ke (j<d)dan Anda bisa, untuk tujuan membuat sel-sel persegi hanya digunakan Cells.RowHeight=48di tempat Cells.RowHeight=9, Cells.ColumnWidth=1- ini memang membuat bermain-main dengan output Anda lebih sulit tetapi telah diterima sebagai valid oleh komunitas -
Taylor Scott

1
@TaylorScott Saya ingat RowHeighttrik dari pos kiat VBA dan bermaksud mengintegrasikannya setelah saya mendapatkan semua gambar cantik saya. Itu chunk'o'bytes yang bagus, terima kasih.
Engineer Toast

Saya percaya bahwa Anda dapat menghapus byte lain dengan bertukar 2^20dengan1E6
Taylor 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 fraktal dari Perl + GD

Dikutip dari kode ini


2
Nominasi: skema warna paling jelek.
meawoppl

3

Floater, 620 piksel

Bahasa yang saya buat ketika saya terinspirasi oleh tantangan saya sendiri, dan juga dari bahasa esoteris Piet.

masukkan deskripsi gambar di sini


2
Tautan ke bahasa dan deskripsi kode? Atau sebenarnya, apa kodenya?
MD XF
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.