Hình ảnh Mandelbrot trong mọi ngôn ngữ


91

Tôi luôn sử dụng hình ảnh Mandelbrot làm phiên bản 'đồ họa' của Hello World trong bất kỳ ứng dụng đồ họa nào tôi có trong tay. Giờ đến lượt các bạn.

  • Ngôn ngữ phải có khả năng xuất đồ họa hoặc vẽ biểu đồ (lưu tệp không được phép)
  • Kết xuất một hình ảnh hoặc biểu đồ vuông. Kích thước tối thiểu 128 và tối đa 640 trên *
  • Các tọa độ fractal nằm trong khoảng từ -2-2i đến 2 + 2i
  • Các pixel bên ngoài bộ Mandelbrot phải được tô màu theo số lần lặp trước khi cường độ vượt quá 2 (không bao gồm * đen & trắng)
  • Mỗi số lần lặp phải có một màu duy nhất * và các màu lân cận tốt nhất nên dễ dàng phân biệt bằng mắt
  • Các pixel khác (có lẽ bên trong bộ Mandelbrot) phải được tô màu đen hoặc trắng
  • Ít nhất 99 lần lặp
  • Nghệ thuật ASCII không được phép

* trừ khi bị giới hạn bởi nền tảng, ví dụ: máy tính đồ họa

Được phép:
Được phép
Không được phép:
Không được phép
(thu nhỏ hình ảnh)

Điều kiện chiến thắng:

Phiên bản ngắn nhất (kích thước tính theo byte) cho mỗi ngôn ngữ sẽ được đề cập trong bài đăng này, được sắp xếp theo kích thước.
Không có câu trả lời nào sẽ được 'chấp nhận' bằng nút.

Bảng xếp hạng:


8
"Dễ dàng phân biệt bằng mắt" là khó để thực hiện mục tiêu. ... Ngoài ra, ngoài sự liên kết cá nhân của bạn với hai người, bộ Mandelbrot không liên quan gì đến Hello World, vì vậy tốt nhất là bỏ qua điều đó khỏi tiêu đề trừ khi bạn cố tình troll các công cụ tìm kiếm.
Jonathan Van Matre

1
Liên quan: ASCII Mandelbrot (mặc dù một số câu trả lời được đăng ở đó không phải là ASCII và có thể phù hợp hơn với câu trả lời cho câu hỏi này).
Peter Taylor

3
Bây giờ tôi đã thấy một vài người đề cập rằng họ biến Mandelbrot thành một "Hello World". Tôi cũng đã làm điều đó, trong khoảng 30 năm. Mandelbrot là "Hello World" hoàn hảo bởi vì nó cho thấy cả hai bạn có quyền truy cập pixel vào màn hình và mang lại cảm giác tốt khi tính toán hiệu năng ràng buộc trên nền tảng mới.
Roger Dahl

6
Ý tưởng tuyệt vời để đặt một câu hỏi đòi hỏi sự kết hợp của sự nhạy cảm toán học và thẩm mỹ, sau đó áp đặt tất cả các quyết định thiết kế trước.
jwg

3
Bất cứ ai cũng có thể tạo ra một người trong Brainfuck THẮNG, tôi sẽ nói: D
MadTux

Câu trả lời:


94

Máy tính đồ họa sắc nét EL-9300, 296 byte

Đây là máy tính vẽ đồ thị trường cấp hai của tôi , bắt đầu từ 20 năm trước! Tôi nhớ đã viết một máy phát điện mandelbrot cho nó trở lại sau đó. Và chắc chắn, nó vẫn ngồi đó trong bộ nhớ 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

Mất khoảng 90 phút để kết xuất.

Điều này là hoàn toàn vô căn cứ. Tôi chắc rằng tôi có thể tiết kiệm một chút không gian, nhưng tôi chỉ muốn chia sẻ sự tò mò lịch sử này!

Tôi thích rằng các tuyên bố kiểm soát duy nhất có sẵn là gotos.

Đây là một bức ảnh. Tôi không có cách nào khác để lấy đầu ra đồ họa ra: nhập mô tả hình ảnh ở đây


1
Tôi cũng vậy, nhưng trí nhớ NV của tôi trống rỗng sau nhiều năm hạn sử dụng.
Mark Jeronimus

2
zx²+zy²>4không thể Abs(x)>2như vậy sao?
Mark Jeronimus

1
Có lẽ bạn nên lấy pin mới ...
NothingsImpossible

25
Hấp dẫn. Vì vậy, bạn đã là một mọt sách trong một thời gian dài.
devnull

4
"Ảnh chụp màn hình" đẹp
meawoppl

83

Tôi đã đi qua điều này một ngày khác. Tôi không lấy tín dụng cho nó, nhưng chết tiệt, nó thật tuyệt vời:

Con trăn 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)
                                       )   )

nhập mô tả hình ảnh ở đây http://preshing.com/20110926/high-resolution-mandelbrot-in-obfuscated-python/


12
Có vẻ như không được phép: các khu vực không dễ phân biệt, hoặc thậm chí là không có.
Primo

5
Ngoài ra, điều này ghi vào một tập tin.
Lie Ryan

40
không được phép hay không, điều này khá tuyệt vời: D
Navin

18
@DigitalTrauma, heck, +1 cho đầu vào đẹp nhất!
Brian S

19
Điều này có được tính là một quine không? ;-)
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

Kết quả 129x129 (129 × 129)

Hình ảnh PDF bao gồm các đơn vị hình vuông màu với kích thước 1bp × 1bp.

Bị đánh cắp

% 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

Hội x86 DOS, 208 177 173 byte

Nhị phân đầy đủ, trong HEX, mà tôi tạo bằng tay, là:

DBE3BE00A0B81300CD1056BA640007BF87F9FDBDC7008BCDE81A008AC3AA4979F7B9C70083EF784D79EE33C0CD16B80300CD10CD208BC12BC289441CDF441CDF06A701DEF9D95C088BC52BC289441CDF441CDF06A701DEF9D95C0CD9EED914D95404D95410D95C14B301D904D84C04DE0EA901D8440CD95404D94410D86414D84408D914D80CD95C10D84C04D95414D84410DF06AB01DED99BDFE09B9E7207433ADA72C632DBC3320002000400

Hình ảnh mẫu là:

Chụp màn hình Mandlebrot với cắt đen

Nguồn đầy đủ trong ASM có thể đọc được khá dài (tôi đã sử dụng nó để tìm ra cách tôi mã hóa trình hút này):

.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

Điều này được thiết kế để biên dịch với TASM, chạy trong MCGA và chờ nhấn phím trước khi kết thúc chương trình. Các màu chỉ là bảng màu MCGA mặc định.

EDIT: Tối ưu hóa nó, bây giờ nó vẽ ngược (mặc dù cùng một hình ảnh) và lưu 31 byte!

EDIT 2: Để làm dịu OP, tôi đã tạo lại nhị phân bằng tay. Bằng cách đó, tôi cũng cạo đi 4 byte khác. Tôi đã ghi lại từng bước của quy trình, hiển thị tất cả công việc của tôi để bất kỳ ai cũng có thể làm theo nếu họ thực sự muốn, ở đây (cảnh báo, nó nhàm chán và rất dài): http://lightning.memso.com/media/perm/ mandelbrot2.txt

Tôi đã sử dụng một vài regex trong EditPadPro, để tìm tất cả các ; Final: ...mục trong tệp và kết xuất chúng dưới dạng nhị phân hex thành tệp .com. Nhị phân kết quả là những gì bạn nhìn thấy ở đầu bài này.


1
Mã máy không được tính. Nếu tính như vậy, thì bất kỳ ngôn ngữ nào tạo mã byte hoặc mã máy phải ngắn hơn. Tôi đếm 820 sau khi thay đổi mọi thứ thành tên dài 1 ký tự.
Mark Jeronimus

3
Tôi có thể viết mã toàn bộ thứ nhị phân nếu nó giúp bạn dễ dàng hơn, nhưng điều đó sẽ giống như yêu cầu bất kỳ ai sử dụng ngôn ngữ cấp cao để tránh sử dụng các cấu trúc tự động, macro, v.v ... Đó là TẤT CẢ sự lắp ráp đó, chỉ là một bó macro. Hệ nhị phân kết quả để chạy JavaScript đầy đủ, Perl, v.v. bao gồm nhị phân của thư viện. Với ASM, giá trị hex cuối cùng là mọi thứ, thư viện, TẤT CẢ MÃ, bao gồm.
Đánh dấu Ormston

5
Không. Tôi có thể chuyển đổi ASM sang nhị phân nếu thực sự cần thiết. Nó sẽ đi ra với chính xác 177 byte mà trình biên dịch của tôi đã trợ giúp. Mã kết quả có thể được dán bởi bất kỳ ai có trình soạn thảo nhị phân vào một tệp mới, được lưu, 177 byte và nó sẽ hoạt động như mong đợi. Rõ ràng SO được chia cho các lần gửi ASM, vì vậy có lẽ bạn nên làm rõ nếu bạn cảm thấy nó không được tính: meta.codegolf.stackexchange.com/questions/260/ Lỗi
Mark Ormston

6
Được rồi, vì vậy, để chứng minh đây là một mục hợp lệ, tôi đã dành thời gian để chuyển nó sang dạng nhị phân. Tôi đã cập nhật câu trả lời của tôi cho phù hợp.
Đánh dấu Ormston

7
Điều này là, không có trình biên dịch với lắp ráp. Bạn chỉ cần sử dụng macro. Nói rằng nó không được tính giống như nói rằng bạn không thể sử dụng bất kỳ #definecâu lệnh được xác định trước nào trong C. Chỉ mất thời gian để thay thế tất cả bằng tay.
Đánh dấu Ormston

28

Java, 505 405 324 byte

Chỉ cần một tính toán tiêu chuẩn, với sân golf bây giờ có thêm sân gôn.

nhập mô tả hình ảnh ở đây

Chơi gôn

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

Với ngắt dòng:

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);- phụ thuộc nhiều vào Theme đã sử dụng, nhưng tôi sẽ chấp nhận nó.
Mark Jeronimus

Bạn có thể bỏ nhập khẩu trong Java vì dù sao chúng cũng được tạo tự động.
Mark Jeronimus

Tôi cũng thấy doublenơi floatcó thể được sử dụng nếu bạn đã thử
Mark Jeronimus

JFrame=> Framecạo 2 ký tự. Mặc dù bạn không thể đóng cửa sổ nữa. ;)
EthanB

2
Lớp học của bạn không cần phải công khai. Hơn nữa, sử dụng Java 8 để thoát khỏi công cụ finalsửa đổi. Và bạn không được bỏ qua việc nhập khẩu để được gửi hoàn chỉnh.
Victor Stafusa

21

Javascript (ECMAScript 6) - 315 308 Ký tự

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)

Đầu ra mặc định

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

  • Thay đổi nđể thay đổi kích thước hình ảnh (và số lần lặp).
  • Thay đổi các giá trị được truyền trong các f(87);f(0);f(0);cuộc gọi (gần cuối) để thay đổi các giá trị màu RGB. ( f(8);f(8);f(8);là thang độ xám.)

Với f(8);f(23);f(87);:

nhập mô tả hình ảnh ở đây

(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
Đẹp. d=documentsẽ giúp bạn tiết kiệm nhiều hơn (Ngoài ra, có lý do nào để tạo ra khung vẽ không? Liệu codegolf có thừa nhận một mức HTML nhất định không?)
Matthew Wilcoxson

1
Bạn có thể viết document.createElement`canvas` và lưu 2 byte. Tương tự như getContext`2d` .
Ismael Miguel

Tôi đã không giả sử Canvas Canvas vì đây là một giải pháp JavaScript thuần túy.
MT0

hoặc bạn có thể 'thả' bức tranh ở tất cả như ở đây
Kamil Kiełczewski

19

J, 73 byte

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

bộ đèn chùm

Chỉnh sửa , một số giải thích:

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 nhưng bạn có thể giải thích một chút về cách mã đó hoạt động không? Đặc biệt tôi tò mò muốn biết làm thế nào (nơi trong mã) nó chọn màu sắc?
plannapus

1
@MarkJeronimus, tôi có thể làm cho nó 70 nhưng tôi giữ một số điều cho rõ ràng. Tôi, do đó, đã lấy tự do để bỏ qua các LF khi đếm.
Eelvex

@plannapus, OK, thêm một số ý kiến. Việc chọn màu được thực hiện với (0,?$~99 3)việc tạo ra ba bộ ba rgb, một cho mỗi cấp độ. Do tính ngẫu nhiên, bạn có thể nhận được ít hơn 100 bộ ba nên một số cấp độ sẽ có sự chuyển tiếp mượt mà hơn (nhưng vẫn có các màu khác nhau).
E Mườix

17

Toán học, 214 191 215 19 30

Vì phiên bản 10.0 có tích hợp sẵn: (19 byte)

MandelbrotSetPlot[]

mandelbrot


Để phù hợp với các yêu cầu phạm vi tọa độ, cần thêm 11 byte. (30 byte)

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

m2


Một trường hợp cuộn tay:

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

màu xanh lá


{b, -2, 2, .01}, {a, -2, 2, .01}ngắn hơn và gần hơn với các quy tắc
Mark Jeronimus

@MarkJeronimus Cảm ơn. Tôi đã sử dụng phạm vi đề xuất cho hình ảnh lặp.
DavidC

Bạn đã có nó gần như đúng, sau đó bạn làm cho bên trong không phải màu đen. Khung cuối cùng trong GIF có màu đen bên trong và câu trả lời được phép. EDIT: và tôi đếm 195 byte.
Mark Jeronimus

Tôi đã bỏ lỡ quan điểm về màu đen. Số lượng tăng lên vì một số ký tự đơn trở thành hai ký tự trong phần cắt và dán thành SE.
DavidC

Giải pháp tích hợp của bạn sử dụng một giải thích rất lỏng lẻo The fractal coordinates range from approximately -2-2i to 2+2i.
Jonathan Frech

16

Python với Pylab + Numpy, 151 byte

Tôi không thể chịu được khi nhìn thấy một mục Python không có DQ, nhưng tôi nghĩ rằng tôi thực sự đã vượt qua chính mình trên cái này, và tôi đã làm nó xuống còn 153 ký tự!

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

Ngoài ra, đáng chú ý, dòng thứ hai đến dòng cuối cùng đưa ra 4 cảnh báo thời gian chạy riêng biệt, một kỷ lục cá nhân mới!

nhập mô tả hình ảnh ở đây


Tôi đếm 152. Không có khoảng trống được yêu cầu giữa import*, và không xác định fgì cả nên ngắn hơn, trừ khi tôi đã hiểu nhầm điều gì đó, điều này là có thể. Bạn cũng nên thay đổi nó xung quanh sao cho 0 lần lặp và 1 lần lặp bị phân biệt (hiện tại chúng đều có màu xám).
Primo

Kỳ dị. Có wc bao gồm các eof? Đã sửa và nhỏ hơn một chút. Chỉ một lát thôi.
meawoppl

Tôi nhận được 151 với wc. Golf đầu tiên, vì vậy không chắc chắn làm thế nào để ghi bàn.
meawoppl

Tôi đếm 150, không có dòng mới. Một số trình thông dịch / trình biên dịch yêu cầu một, nhưng trình thông dịch python không hoạt động tốt. Không chắc chắn về wc, nhưng có thể thử stat -c %sthay thế. Là viền đen trên và dưới là một phần của hình ảnh?
Primo

1
Bạn có thể lưu 1 ký tự bằng cách sử dụng from numpy import*thay vì import numpy as nmgridthay vì 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()

Đầu ra:

MSet 1


Bạn nên đề cập rằng đây là Allegro 4 (khá khác so với Allegro 5). Phiên bản chính xác nào đây?
Victor Stafusa

nó dài tới 246 hoặc 249
Mark Jeronimus

@Victor Allegro 4.2.2.
Oberon

1
@MarkJeronimus Không phải có một dòng mới giữa ... allegro.h>x=-1, ...? Tôi cho rằng Notepad ++ tính nó là \r\n= 0D 0A.
Oberon

1
Tôi nghĩ rằng 0.01có thể được gõ như .01.
Yytsi

14

Windows PowerShell (v4), 299 byte

Hình ảnh fractal 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()

Hướng dẫn

  • Chạy bảng điều khiển PowerShell bình thường (ISE có thể không hoạt động)
  • Sao chép / dán mã vào, nhấn Enter
  • Đợi đã - phải mất một phút hoặc hơn để chạy
  • Cách duy nhất để thoát là đóng giao diện điều khiển

Bình luận

  • Có một chút thử nghiệm quy tắc đang diễn ra với các màu bên trong bộ; các quy tắc nói "Các pixel khác (có lẽ bên trong bộ Mandelbrot) phải được tô màu đen hoặc trắng '" ; mã đang tô màu cho các pixel màu đen hoàn toàn RGB (0,0,0) ... nó chỉ là một RGBA màu đen trong suốt (0,0,0,0). Vì vậy, những gì hiển thị là màu nền của chủ đề Windows hiện tại, một màu trắng hơi nhạt (240.240.240) trong trường hợp này.

Tôi sẽ thay đổi lt2để lt4biến nó thành một "bộ mandelbrot" thay vì hình ảnh bạn có bây giờ, Nhiều điểm của bộ ảnh bị nuốt chửng bởi các dải màu.
Mark Jeronimus

Rõ ràng Tầm quan trọng a*a+b*bkhông phải làsqrt(a*a+b*b)
Mark Jeronimus

Tôi nghĩ rằng tôi đã kiểm tra điều đó trước đó, nhưng tôi đã tìm kiếm một câu trả lời cho "đường ngang bên trái đã biến mất ở đâu?", Và sau một lát, tôi tìm thấy nó chính xác như nơi bạn nói , -lt4. Điều này là tốt - cảm ơn bạn. Tôi đã cập nhật câu trả lời của mình với mã và hình ảnh được sửa. (Sẽ phải suy nghĩ lại về sự hiểu biết của tôi về những gì nó đang làm, vì tôi đang thiếu một cái gì đó).
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()

Đầu ra (sẽ mở trong trình xem * .bmp mặc định):


1
Bạn có thể cạo 3 nếu bạn thoát khỏi yvòng lặp. r=range(d*d), sử dụng x/dx%dcho x và y.
Geobits

@Geobits ý tưởng thực sự tiết kiệm 10, cảm ơn!
Primo

1
Các loại phức tạp có thể được khởi tạo như: c = 1 + 2j, mà tôi nghĩ sẽ tiết kiệm cho bạn một vài ký tự với: z = o = x / 9e4-2 + (x% d / 150.-2) * 1j; c = 99
meawoppl

@meawoppl 7: D
primo

Về mặt kỹ thuật không được phép: đây không phải là bất kỳ tính năng đầu ra đồ họa nào của Python (và Image.show()hoàn toàn lưu một tệp tạm thời).
nneonneo

12

BBC cơ bản (228 byte)

Điều gì về các ngôn ngữ mà không ai từng nghe nói về mã golf? Nhiều khả năng có thể được tối ưu hóa, nhưng tôi không hoàn toàn ở đâu - có thể cải thiện. Dựa trên http://rosettacode.org/wiki/Mandelbrot_set#BBC_BASIC , nhưng tôi đã cố gắng viết mã golf càng nhiều càng tốt.

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

Bộ Mandelbrot được tạo

Các >biểu tượng trên hình ảnh là nhanh chóng, và nó sẽ tự động tạo ra sau khi chạy chương trình.


Không cần cốt truyện hai lần, chỉ cần đi với một phiên bản không hiệu quả hơn. Nó không hỗ trợ NEXT Y,X?
Mark Jeronimus

10

APL, 194 ký tự / 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')

Đây là cho Dyalog APL với ⎕IO ⎕ML←1 3

Hầu hết không gian được lấy bởi các lệnh gọi API để hiển thị bitmap trong cửa sổ (dòng 2, 3, 4)
Nếu có một phím tắt để thực hiện, mã sẽ giảm xuống còn 60 ký tự (dòng 1)

PLZ GIÚP TÌM KIẾM KTHX

Phiên bản Ungolfed (chỉ dòng 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    

Ảnh chụp màn hình:

(Phiên bản phần mềm miễn phí chạy trong OS X dưới Wine. Có, tôi rẻ như thế.)

ảnh chụp màn hình

*: Dyalog có bộ ký tự byte riêng, với các ký hiệu APL được ánh xạ tới các giá trị 128 byte trên, do đó toàn bộ mã có thể được lưu trữ trong 194 byte. Mỗi tuyên bố trong chú thích này là có thể đúng. Giữ bình tĩnh và tiếp tục chơi golf.


10

Toán học 10.0, 19 ký tự

MandelbrotSetPlot[]

MandelbrotSetPlot là một chức năng mới trong Mathicala 10.0.

nhập mô tả hình ảnh ở đây


Thật tiện lợi, chức năng tích hợp này chỉ xảy ra để đáp ứng tất cả các yêu cầu của tôi (ngoại trừ vị trí, có thể được đặt thêm 13 ký tự). Ngoại trừ đây là một lỗ hổng tiêu chuẩn.
Mark Jeronimus

19
Code golf thường được chiến thắng bởi các ngôn ngữ chuyên gia với mã thông báo một ký tự hoặc bởi các hệ thống như Mathicala có số lượng lớn các chức năng đặc biệt được tích hợp. Để sử dụng chúng không phải là gian lận, bất kỳ việc sử dụng các lệnh một ký tự sẽ có trong APL.
Michael Stern

9

R, 199 211 ký tự

Giải pháp cũ với 199 ký tự:

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)

Với vết lõm:

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)

nhập mô tả hình ảnh ở đây

Chỉnh sửa: Giải pháp ở 211 ký tự tô màu bên trong tập hợp và bên ngoài lớp đầu tiên khác nhau:

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)

Với vết lõm:

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)

nhập mô tả hình ảnh ở đây


kỹ thuật bên ngoài màu đen là không được phép. Bạn đã bỏ lỡ điều đó hay khó thực hiện?
Mark Jeronimus

@MarkJeronimus cả thực sự :) Tôi sẽ cố gắng xem làm thế nào để làm điều đó nhưng tôi không tự tin 100% rằng tôi sẽ tìm ra cách để làm điều đó một cách sạch sẽ.
plannapus

@MarkJeronimus Xong!
plannapus

5
Vị trí thứ hai trong phân chia màu sắc gớm ghiếc.
meawoppl

1
@meawoppl đổ lỗi rainbow():)
plannapus

9

Java - Xử lý (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();}

Mở rộng:

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


Aw, maaaaan, tôi muốn làm điều này. +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

Dựa trên câu trả lời của Digital Trauma. nhập mô tả hình ảnh ở đây


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

Xác định các biến trong mã (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);}

Xem nó trong ShaderToy

Golf Mandelbrot

Điều này đòi hỏi một kết cấu bảng màu phù hợp được tải như iChannel0. (Màu ở đây là từ kết cấu "pixel ngẫu nhiên" trên ShaderToy).


Khai báo biến cũng nên được tính, trừ khi chúng có thể được tạo tự động từ mã. (phối màu vẫn ổn nếu nó chỉ khả dụng dưới dạng cài đặt bên ngoài)
Mark Jeronimus

@MarkJeronimus: Đối với môi trường ShaderToy, các biến này là cố định. Mặt khác, đối với các shader tiêu chuẩn, tôi đã chọn các tên biến ngắn hơn.
nneonneo

Đây có phải là nhanh nhất trong số họ?
Demi

6

Octave ( 212 136 byte)

(Bây giờ bao gồm một số ý tưởng do @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])

Với khoảng trắng:

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

Đầu ra:

Các bước Mandelbrot để abs (z)> 2

Để chuyển đổi sang Matlab, thay đổi " m+=abs(z)<2" thành " m=m+(abs(z)<2)". [+3 byte]

Để tạo tỷ lệ khung hình 1: 1, thêm " ;axis image". [+11 byte]

Câu trả lời đầu tiên của tôi (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])

Có lẽ có một cách ngắn hơn để có được một bản đồ màu không liên tục ....
aschepler

Vâng, tốt hơn nhiều bây giờ.
aschepler

+1 giải pháp hay và súc tích. Nhưng tỷ lệ khung hình của bạn không phải là 1: 1 (xem quy tắc n ° 2: đầu ra phải là hình vuông).
plannapus

Việc sửa tỷ lệ khung hình sẽ mất thêm 11 byte: chắp thêm " ;axis image". Có cần thiết để đủ điều kiện?
aschepler

Tôi nghĩ rằng đó chỉ là do tôi gây ra :), OP dường như không có vấn đề gì với nó vì anh ấy không nói gì.
plannapus

6

Applesoft BASIC, 302 286 280 byte

Điều này chọn điểm ngẫu nhiên để vẽ, vì vậy nó sẽ chạy mãi mãi và có thể không bao giờ điền vào mặt phẳng đầy đủ.

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

Hóa ra Applesoft BASIC thực sự tha thứ về việc thiếu không gian. Chỉ có một không gian là cần thiết trong toàn bộ chương trình.

Đầu ra sau 14 giờ:

        đầu ra

ẢNH ĐỘNG:

        ảnh động

Trước khi chơi 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

Lưu ý: POKE 49234,0(trong Applesoft BASIC) đưa máy vào chế độ đồ họa đầy đủ.

Một phiên bản được tối ưu hóa cho màn hình 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

Đầu ra sau 12 giờ:

        b & w

Một phiên bản sẽ hoạt động trong 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

Sẽ nhỏ hơn (và chậm hơn) nếu bạn không vẽ hai pixel cùng một lúc mà chọn một pixel ngẫu nhiên trên toàn bộ màn hình.
Mark Jeronimus

1
@MarkJeronimus Nó đã quá chậm đến nỗi phiên bản màu vẫn chưa kết thúc, sau khi đăng bài này 5 ngày trước. Tôi không nghĩ mình có thể đủ khả năng để chậm hơn nữa: P
MD XF

5

gnuplot 110 (105 không có dòng mới)

Bắt buộc nhập gnuplot. Nó đã được thực hiện vô số lần nhưng lần này là từ đầu (không khó lắm). Tôi thích cách gnuplotchơi golf của nó về bản chất :)

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

vô dụng:

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

Tuy nhiên, tôi thất vọng về việc nhập số phức. x*{1,0}+y*{0,1}phải là cách buồn nhất hiện có để xây dựng một số phức.

Rất tiếc, hình ảnh: gnuplot mandelbrot

Đặt isosamples cao hơn để có độ phân giải tốt hơn. Chúng tôi cũng có thể nói unset ticsunset colorboxcho một hình ảnh thuần túy, nhưng tôi nghĩ phiên bản này đủ điều kiện tốt.


Đặt cược đó là bản sao / mì ống từ google đầu tiên nhấn "gnuplot mandel". Đối với người mới bắt đầu, *{1,0}là sự thống nhất và giống như một cách nói về bowling-code *1, và có lẽ có thể bị loại bỏ. (chưa được kiểm tra)
Mark Jeronimus

1
Không, nó không phải là một bản sao dán. Đó là một công thức rất thẳng về phía trước và thậm chí không cần thiết phải tìm kiếm nó. Tuy nhiên, tôi đã tìm thấy các trang bạn nhận được với tìm kiếm đó khi tôi đang tìm kiếm một cách tốt hơn để khởi tạo các số phức (cách thực hiện của chúng là khác nhau, cũng như khác trong trường hợp này). Cảm ơn các mẹo về phần thực, nó hoạt động. Sửa chữa.
orion

5

Matlab (89 byte)

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

Đầu ra -

nhập mô tả hình ảnh ở đây

Không thỏa mãn yêu cầu rằng các ô bên trong phải có màu đen hoặc trắng, nhưng có thể được thỏa mãn bằng cách (1) sử dụng imshow(K)thay vì imagesc(K)(yêu cầu ít hơn 1 byte nhưng cần hộp công cụ xử lý hình ảnh) hoặc (2) nối thêm colormap hot(yêu cầu thêm 12 byte).

Phiên bản bị đánh cắp -

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)

Sử dụng một thư viện là tốt nếu nó được đóng gói trong Matlab theo mặc định và bất kỳ người dùng nào cũng có thể đoán nó đang được sử dụng từ mã hoặc các thông báo lỗi.
Mark Jeronimus

Đẹp, bạn đánh tôi. Tôi thích C-Cnơi của tôi 0*e(401). Thêm vào đó, bạn không sử dụng N. Và chúng tôi có thể rút ngắn hơn một chút bằng cách sử dụng m+=abs(z)<2ý tưởng của tôi thay cho bạn K(~K&abs(Z)>2)=j.
aschepler

Mặc định colormap jetcolormap hotcả hai đều không chính xác - chúng chỉ có 64 màu riêng biệt. colormap(hot(101))không nhìn trực quan để phân biệt với tôi. colormap([0,0,0;jet(100)])có thể chấp nhận được nhưng iffy.
aschepler

Nó có hoạt động không? Trên Octave, K=K+abs(Z)<2có nghĩa là K=((K+abs(Z))<2). (Vì vậy, tôi đã sai về ước tính một byte để loại bỏ +=.)
aschepler

2
Bộ Mandelbrot xoay 90 độ vẫn là bộ Mandelbrot.
Chris Taylor

4

JavaScript + HTML5 (356B)

(Lưu ý: các dòng kết thúc bằng '//' được thêm vào đây để dễ đọc hơn)

Phiên bản biểu diễn (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>

Phiên bản chậm (356B): xóa 'var' và các tham số trong hàm bên trong để phạm vi toàn cục được sử dụng.

Dùng thử: http://jsfiddle.net/neuroburn/Bc8Rh/

nhập mô tả hình ảnh ở đây


Hãy tha thứ cho tôi nếu tôi không hiểu hướng dẫn của bạn về việc tạo phiên bản ngắn.
Mark Jeronimus

Không vấn đề gì. Hủy bỏ var w,lúc đầu, và thay đổi function(x,i,j,k,l,c,o)thành function().
ɲeuroburɳ

4

Javascript, 285B

Dựa trên mã của tôi và một số cải tiến về mã của MT0 , tôi đã giảm xuống còn 285B màu:

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

đang hoạt động: http://jsfiddle.net/acLhe/7/

là: 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 được cho là có thể đọc được: - / xem nó trong hành động: http://jsfiddle.net/acLhe/6/

Mandelbrot Coffeescript


OP yêu cầu màu trừ khi nền tảng của bạn không hỗ trợ màu. Trông tuyệt vời, mặc dù, và mã ngắn gọn đẹp. Chào mừng đến với PPCG!
Jonathan Van Matre

Tôi bắt đầu từ kích thước 285B này và cải thiện nó nhiều hơn trong câu trả lời
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

Bảng màu DOS tiêu chuẩn:

nhập mô tả hình ảnh ở đây


4

Tcl / Tk, 316

322 324 336 348 349 351 352 353 354 355

Giờ đây, một phiên bản ngắn hơn sử dụng bộ ba màu theo kiểu chữ viết tắt #RGB (thay vì bộ ba #RRGGBB), dẫn đến các màu khác nhau.

Và một số golf nữa.

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

fractal


Tcl / Tk, 325

331 333 345 357 358 360 361 362 364 365

Tôi nghĩ tôi sẽ chiến thắng nếu tiêu chí là vẻ đẹp!

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

Trình bày:

fractal


1
Đẹp. Bạn có thể giảm một vài ký tự (giảm xuống còn 380, tôi nghĩ vậy) bằng cách thêm rename set sở trên cùng và sau đó thay thế tất cả setbằngs
Rolazaro Azeveires

4

VBA Excel, 251 246 224 223 221 byte

Đã lưu 5 byte nhờ vào trần nhà Đã lưu 23 byte nhờ 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

Đầu ra:

Đầu ra với D = 99

Tôi đã tạo một phiên bản đã làm điều này từ lâu nhưng nó có rất nhiều tính năng bổ sung như cho phép người dùng chọn màu cơ bản và toán dễ theo dõi. Chơi gôn xuống là một thử thách thú vị. Các Colorphương pháp sử dụng 1E6như một phương tiện để có được một loạt các màu sắc từ màu sắc hợp lệ là 0đến 2^24. Đặt nó để 10^6cho các khu vực tương phản tốt đẹp.

Giải thích / Định dạng tự động:

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

Tôi cũng chơi xung quanh D=999j=1 to 998để có được một hình ảnh lớn hơn và chính xác hơn nhiều. Các kết quả không liên quan đến các thách thức bởi vì họ đang cách quá lớn nhưng họ gọn gàng.

D = 999


@ceilingcat Cảm ơn. Đó là một chuyển giao từ bản gốc của tôi có chức năng chuyên biệt cho toán số phức.
Kỹ sư Toast

Có thực sự cần phải> = 4 hoặc bạn có thể thoát khỏi> 4 không? Ngoài ra, có thể thay thế j<99bằng j<D.
trần mèo

@EngineerToast bạn có thể bỏ ()tên phụ, bạn nên đổi (j<99)thành (j<d)và bạn có thể, với mục đích làm cho các ô vuông chỉ sử dụng Cells.RowHeight=48thay cho Cells.RowHeight=9, Cells.ColumnWidth=1- điều này làm cho việc lộn xộn với đầu ra của bạn trở nên khó khăn hơn nhưng đã được chấp nhận là hợp lệ bởi cộng đồng -
Taylor Scott

1
@TaylorScott Tôi nhớ RowHeightthủ thuật từ bài đăng mẹo VBA và có nghĩa là tích hợp nó sau khi tôi nhận được tất cả các hình ảnh đẹp của mình. Đó là một chunk'o'bytes tốt đẹp, cảm ơn.
Kỹ sư Toast

Tôi tin rằng bạn có thể thoát khỏi việc xóa một byte khác bằng cách hoán đổi 2^20với1E6
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

Fractel Mandelbrot từ Perl + GD

Đánh gôn từ mã này


2
Đề cử: phối màu xấu nhất.
meawoppl

3

Floater, 620 pixel

Một ngôn ngữ tôi tạo ra khi tôi lấy cảm hứng từ thử thách của chính mình, cũng như từ ngôn ngữ bí truyền Piet.

nhập mô tả hình ảnh ở đây


2
Liên kết đến một ngôn ngữ và mô tả của mã? Hoặc thực sự, mã là gì?
MD XF
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.