Obraz Mandelbrota w każdym języku


91

Zawsze korzystałem z obrazu Mandelbrota jako „graficznej” wersji Hello World w każdej aplikacji graficznej, w której się znalazłem. Teraz twoja kolej.

  • Język musi mieć możliwość wyświetlania graficznego lub rysowania wykresów (niedozwolone zapisywanie plików)
  • Renderuj kwadratowy obraz lub wykres. Rozmiar co najmniej 128, a maksymalnie 640 w całym *
  • Współrzędne fraktalne mieszczą się w zakresie od około -2-2i do 2 + 2i
  • Piksele poza zestawem Mandelbrota powinny być pokolorowane zgodnie z liczbą iteracji, zanim jasność przekroczy 2 (z wyłączeniem * czarno-białego)
  • Każda liczba iteracji musi mieć unikalny kolor *, a sąsiednie kolory powinny najlepiej być łatwo rozpoznawalne przez oko
  • Pozostałe piksele (prawdopodobnie w zestawie Mandelbrota) muszą być zabarwione na czarno lub na biało
  • Co najmniej 99 iteracji
  • Grafika ASCII jest niedozwolona

* o ile nie ogranicza tego platforma, np. kalkulator graficzny

Dozwolone:
Dozwolony
niedozwolone:
Niedozwolone
(zmniejszone obrazy)

Warunki wygranej:

Najkrótsza wersja (rozmiar w bajtach) dla każdego języka otrzyma wzmiankę w tym poście, uporządkowana według rozmiaru.
Żadna odpowiedź nigdy nie zostanie „zaakceptowana” za pomocą przycisku.

Tabela liderów:


8
„Łatwo wyróżniać się okiem” jest trudny do obiektywnego. ... Poza twoim osobistym skojarzeniem, zestaw Mandelbrota nie ma nic wspólnego z Hello World, więc najlepiej pominąć go w tytule, chyba że celowo trollujesz wyszukiwarki.
Jonathan Van Matre

1
Powiązane: ASCII Mandelbrot (chociaż niektóre zamieszczone tam odpowiedzi nie są ASCII i prawdopodobnie lepiej pasowałyby jako odpowiedzi na to pytanie).
Peter Taylor,

3
Widziałem teraz kilka osób wspominających, że renderują Mandelbrota jako „Hello World”. Zrobiłem to również przez około 30 lat. Mandelbrot to idealny „Hello World”, ponieważ pokazuje zarówno, że masz dostęp do ekranu w pikselach, jak i daje dobre wyczucie wydajności obliczeniowej na nowej platformie.
Roger Dahl,

6
Świetny pomysł, aby zadać pytanie, które wymaga kombinacji wrażliwości matematycznej i estetycznej, a następnie z góry narzucić wszystkie decyzje projektowe.
jwg

3
Każdemu udaje się
wygrać w oszałamiającym

Odpowiedzi:


94

Kalkulator graficzny Sharp EL-9300, 296 bajtów

To był mój kalkulator graficzny szkoły średniej, który działał już 20 lat temu! Pamiętam, jak kiedyś pisałem do niego generator mandelbrota. I oczywiście, wciąż tam jest w pamięci 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

Renderowanie zajęło około 90 minut.

To jest całkowicie nie golfa. Jestem pewien, że mógłbym zaoszczędzić trochę miejsca, ale chciałem tylko podzielić się tą historyczną ciekawością!

Uwielbiam, że jedynymi dostępnymi stwierdzeniami kontrolnymi są gotos.

Oto zdjęcie Nie mam żadnych innych środków, aby uzyskać wyjście graficzne: wprowadź opis zdjęcia tutaj


1
Ja też, ale moja pamięć NV zgasła po latach przechowywania.
Mark Jeronimus

2
zx²+zy²>4nie mogło być Abs(x)>2?
Mark Jeronimus

1
Może powinieneś dostać nową baterię ...
NothingsImpossible

25
Ciekawy. Więc od dłuższego czasu jesteś kujonem .
devnull

4
Ładny „
zrzut

83

Spotkałem to innego dnia. Nie biorę za to uznania, ale cholera, czy to niesamowite:

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

wprowadź opis zdjęcia tutaj http://preshing.com/20110926/high-resolution-mandelbrot-in-obfuscated-python/


12
Wydaje się być niedozwolony: regiony nie są łatwe do odróżnienia, a nawet wcale.
primo

5
Zapisuje to również w pliku.
Lie Ryan

40
niedozwolone czy nie, to jest całkiem niesamowite: D
Navin

18
@DigitalTrauma, cholera, +1 za najpiękniejszy wkład!
Brian S,

19
Czy to się liczy jako quine? ;-)
Blazemonger

47

LaTeX, 673 bajty

\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

Wynik 129 x 129 (129 × 129)

Obraz PDF składa się z kolorowych kwadratowych jednostek o rozmiarze 1 pz × 1 pz.

Nie golfił

% 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

Zestaw DOS x86, 208 177 173 bajtów

Pełny plik binarny w formacie HEX, który utworzyłem ręcznie, to:

DBE3BE00A0B81300CD1056BA640007BF87F9FDBDC7008BCDE81A008AC3AA4979F7B9C70083EF784D79EE33C0CD16B80300CD10CD208BC12BC289441CDF441CDF06A701DEF9D95C088BC52BC289441CDF441CDF06A701DEF9D95C0CD9EED914D95404D95410D95C14B301D904D84C04DE0EA901D8440CD95404D94410D86414D84408D914D80CD95C10D84C04D95414D84410DF06AB01DED99BDFE09B9E7207433ADA72C632DBC3320002000400

Przykładowy obraz to:

Zrzut ekranu Mandlebrota z przyciętym czarnym kolorem

Pełne źródło w czytelnym ASM jest dość długie (wykorzystałem to, aby dowiedzieć się, jak kodowałem tego frajera):

.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

Jest przeznaczony do kompilacji z TASM, działa w MCGA i czeka na naciśnięcie klawisza przed zakończeniem programu. Kolory to tylko domyślna paleta MCGA.

EDYCJA: Zoptymalizowana, teraz rysuje do tyłu (choć ten sam obraz) i zapisuje 31 bajtów!

EDYCJA 2: Aby zapewnić OP, odtworzyłem plik binarny ręcznie. W ten sposób ogoliłem jeszcze 4 bajty. Udokumentowałem każdy krok procesu, pokazując całą moją pracę, aby każdy mógł śledzić, jeśli naprawdę chce, tutaj (ostrzeżenie, jest nudne i bardzo długie): http://lightning.memso.com/media/perm/ mandelbrot2.txt

Użyłem kilku wyrażeń regularnych w EditPadPro, aby znaleźć wszystkie ; Final: ...wpisy w pliku i zrzucić je jako plik binarny hex do pliku .com. Wynikowy plik binarny znajduje się na początku tego postu.


1
Kod maszynowy się nie liczy. Jeśli to się liczy, to każdy język generujący kod bajtowy lub kod maszynowy powinien być krótszy. Liczę 820 po zmianie wszystkiego na długie 1-znakowe nazwiska.
Mark Jeronimus

3
Mógłbym ręcznie napisać kod w całości w formacie binarnym, jeśli to ci ułatwi, ale byłoby to tak, jakby poprosić każdego, kto używa języka wysokiego poziomu, aby unikał używania automatycznych konstrukcji, makr itp. To wszystko, czym tak naprawdę jest asembler, tylko kilka makra. Wynikowy plik binarny do uruchomienia pełnego kodu JavaScript, Perla itp. Zawiera plik binarny biblioteki. W ASM końcową wartością szesnastkową jest wszystko, łącznie z bibliotekami, WSZYSTKIM KODEM.
Mark Ormston,

5
Nie. Mogę ręcznie przekonwertować ASM na binarny, jeśli to naprawdę konieczne. Wyjdzie z dokładnie tymi samymi 177 bajtami, z którymi pomógł mój asembler. Otrzymany kod może być wklejony przez każdego z edytorem binarnym do nowego pliku, zapisany, 177 bajtów, i będzie działał zgodnie z oczekiwaniami. Najwyraźniej SO jest podzielone na zgłoszenia ASM, więc może powinieneś wyjaśnić, jeśli uważasz, że to się nie liczy: meta.codegolf.stackexchange.com/questions/260/…
Mark

6
W porządku, więc aby udowodnić, że jest to poprawny wpis, poświęciłem czas na przetłumaczenie go na binarny. Odpowiednio zaktualizowałem swoją odpowiedź.
Mark Ormston,

7
Chodzi o to, że nie ma kompilatora z asemblerem. Po prostu używasz makr. Powiedzenie, że to się nie liczy, jest jak powiedzenie, że nie można używać żadnych predefiniowanych #defineinstrukcji w C. Ręczne zastąpienie wszystkiego jest czasochłonne.
Mark Ormston,

28

Java, 505 405 324 bajtów

Tylko standardowe obliczenia z golfitude teraz z dodatkowym golfitude.

wprowadź opis zdjęcia tutaj

Gra w golfa:

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

Z podziałami linii:

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);- zależy w dużej mierze od użytego motywu, ale zaakceptuję go.
Mark Jeronimus

Możesz upuścić import w Javie, ponieważ i tak są one generowane automatycznie.
Mark Jeronimus

Widzę też, doublegdzie floatmożna by użyć, gdybyś próbował
Mark Jeronimus

JFrame=> Framegoli 2 znaki. Chociaż nie można już zamknąć okna. ;)
EthanB

2
Twoja klasa nie musi być publiczna. Ponadto użyj Java 8, aby pozbyć się finalmodyfikatora. I nie można pominąć importu, aby być kompletnym zgłoszeniem.
Victor Stafusa,

21

JavaScript (ECMAScript 6) - 315 308 znaków

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)

Domyślne wyjście

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

  • Zmień, naby zmienić rozmiar obrazu (i liczbę iteracji).
  • Zmień wartości przekazywane w f(87);f(0);f(0);połączeniach (pod koniec), aby zmienić wartości kolorów RGB. ( f(8);f(8);f(8);jest w skali szarości.)

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

wprowadź opis zdjęcia tutaj

(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
Miły. d=documentzaoszczędzi ci jeszcze kilka. (Poza tym, czy istnieje powód, by stworzyć płótno? Czy codegolf zakłada, że ​​dostępny jest pewien poziom HTML?)
Matthew Wilcoxson,

1
Możesz zapisać document.createElement`canvas` i zapisać 2 bajty. Taki sam jak getContext`2d` .
Ismael Miguel

Nie założyłem HTML Canvas, ponieważ jest to czyste rozwiązanie JavaScript.
MT0,

albo w ogóle można „upuścić” płótno jak tutaj
Kamil Kiełczewski,

19

J, 73 bajty

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

zestaw mandelbrot

Edytuj , niektóre wyjaśnienia:

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, ale czy możesz wyjaśnić trochę, jak działa ten kod? W szczególności jestem ciekawy, w jaki sposób (gdzie w kodzie) wybiera kolory?
plannapus

1
@MarkJeronimus, mogę zrobić 70, ale zachowałem kilka rzeczy dla jasności. W ten sposób mogłem zignorować LF podczas liczenia.
Eelvex

@plannapus, OK, dodał kilka komentarzy. Wybieranie kolorów odbywa się przy użyciu (0,?$~99 3)100 trypletów rgb, po jednym dla każdego poziomu. Z powodu losowości możesz otrzymać mniej niż 100 trojaczków, więc niektóre poziomy będą miały płynniejsze przejście (ale nadal będą miały różne kolory).
Eelvex

17

Mathematica, 214 191 215 19 30

Od wersji 10.0 jest wbudowany: (19 bajtów)

MandelbrotSetPlot[]

mandelbrot


Aby spełnić wymagania zakresu współrzędnych, wymagane jest 11 dodatkowych bajtów. (30 bajtów)

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

m2


Ręcznie toczona walizka:

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

Zielony


{b, -2, 2, .01}, {a, -2, 2, .01}jest krótszy i bliższy zasadom
Mark Jeronimus

@MarkJeronimus Thanks. Użyłem sugerowanego zakresu dla obrazu iteracyjnego.
DavidC

Miałeś prawie rację, a potem sprawiłeś, że wnętrze nie było czarne. Ostatnia ramka w GIF-ie jest czarna wewnątrz i dozwolona odpowiedź. EDYCJA: i liczę 195 bajtów.
Mark Jeronimus

Brakowało mi sensu bycia czarnym. Liczba ta wzrosła, ponieważ niektóre pojedyncze znaki stały się dwoma znakami w odcinku i wklej do SE.
DavidC

Wbudowane rozwiązanie używa bardzo luźnej interpretacji The fractal coordinates range from approximately -2-2i to 2+2i.
Jonathan Frech,

16

Python z Pylab + Numpy, 151 bajtów

Nie mogłem znieść widoku wpisu w Pythonie nie będącego DQ'em, ale myślę, że naprawdę prześcignąłem się w tym i zmniejszyłem liczbę do 153 znaków!

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

Co więcej, od drugiej do ostatniej linii pojawiają się 4 wyraźne ostrzeżenia w czasie wykonywania, nowy rekord osobisty!

wprowadź opis zdjęcia tutaj


Liczę 152. Pomiędzy importi *nie jest wymagane żadne miejsce , a określenie fw ogóle nie powinno być krótsze, chyba że coś źle zrozumiałem, co jest możliwe. Powinieneś także to zmienić tak, aby 0 iteracji i 1 iteracje były rozróżnione (obecnie oba są szare).
primo

Dziwne. Czy wc zawiera eof? Naprawiono i nieco mniej. Chwileczkę.
meawoppl,

Dostaję 151 z wc. Najpierw golf, więc nie wiem, jak go zdobyć.
meawoppl

Liczę 150, bez końca nowej linii. Niektóre interpretery / kompilatory wymagają jednego, ale interpreter Pythona działa bez niego. Nie jestem pewien wc, ale może spróbuj stat -c %szamiast tego. Czy czarne górne i dolne krawędzie są częścią obrazu?
primo

1
Możesz zapisać 1 postać, używając from numpy import*zamiast import numpy as ni mgridzamiast n.mgrid.
nyuszika7h

15

C + Allegro 4.2.2 - 248 bajtów

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

Wynik:

MSet 1


Należy wspomnieć, że jest to Allegro 4 (który jest zupełnie inny niż Allegro 5). Która to dokładnie wersja?
Victor Stafusa,

ma 246 lub 249 długości
Mark Jeronimus

@Victor Allegro 4.2.2.
Oberon,

1
@MarkJeronimus Czy nie powinno być nowego wiersza między ... allegro.h>i x=-1, ...? Przypuszczam, że Notepad ++ liczy to jako \r\n= 0D 0A.
Oberon,

1
Myślę, że 0.01można wpisać jako .01.
Yytsi

14

Windows PowerShell (v4), 299 bajtów

Obraz fraktalny Mandelbrota

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

Instrukcje

  • Uruchom normalną konsolę PowerShell (ISE może nie działać)
  • Skopiuj / wklej kod, naciśnij Enter
  • Poczekaj - uruchomienie zajmuje minutę lub dłużej
  • Jedynym sposobem na wyjście jest zamknięcie konsoli

Komentarz

  • Trwa trochę testowania reguł z kolorami w zestawie; zasady mówią: „Pozostałe piksele (prawdopodobnie wewnątrz zestawu Mandelbrota) muszą być w kolorze czarnym lub białym” ; kod barwi piksele całkowicie czarnym RGB (0,0,0) ... to po prostu przezroczysty czarny RGBA (0,0,0,0). Pojawia się więc kolor tła bieżącego motywu systemu Windows, w tym przypadku lekko złamana biel RGB (240,240,240).

Chciałbym zmienić lt2, aby lt4zrobić to „Mandelbrot set” zamiast obrazu już teraz, wiele punktów zbioru są pochłonięte przez zespoły kolorystycznych.
Mark Jeronimus

Najwyraźniej wielkość a*a+b*bnie jestsqrt(a*a+b*b)
Mark Jeronimus

Myślałem, że wcześniej testowałem, ale poszedłem w poszukiwaniu odpowiedzi na „gdzie jest pozioma linia po lewej stronie nie ma?”, A po trochę, znalazłem go dokładnie tam, gdzie powiedział, -lt4. Co jest dobre - dziękuję. Zaktualizowałem swoją odpowiedź poprawionym kodem i obrazem. (Będę musiał przemyśleć moje rozumienie tego, co robi, ponieważ czegoś mi brakuje).
TessellatingHeckler

14

Python + PIL , 166 bajtów

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

Dane wyjściowe (zostaną otwarte w domyślnej przeglądarce * .bmp):


1
Możesz się ogolić 3, jeśli pozbędziesz się ypętli. r=range(d*d), użyj x/di x%ddla xiy.
Geobits

@Geobits pomysł faktycznie uratował 10, dzięki!
primo

1
Typy złożone można zainicjować, np .: c = 1 + 2j, co, moim zdaniem, pozwoliłoby ci zaoszczędzić kilka znaków dzięki: z = o = x / 9e4-2 + (x% d / 150.-2) * 1j; c = 99
meawoppl

@meawoppl kolejne 7: D
primo

Technicznie niedozwolony: nie ma żadnej funkcji wyjścia graficznego samego Pythona (i Image.show()domyślnie zapisuje plik tymczasowy).
nneonneo

12

BBC Basic (228 bajtów)

Co z językami, o których nikt nigdy nie słyszał w golfie kodowym? Najprawdopodobniej można go zoptymalizować, ale nie jestem całkiem gdzie - możliwe ulepszenia. Na podstawie http://rosettacode.org/wiki/Mandelbrot_set#BBC_BASIC , ale starałem się kodować golfa w jak największym stopniu.

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

Wygenerowany zestaw Mandelbrota

>Symbol na obrazie jest szybka, a to automatycznie wygenerowany po uruchomieniu programu.


Nie musisz rysować dwa razy, po prostu idź z bardziej nieefektywną wersją. Czy to nie obsługuje NEXT Y,X?
Mark Jeronimus

10

APL, 194 znaków / bajtów *

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

To jest dla Dyalog APL z ⎕IO ⎕ML←1 3

Większość miejsca zajmują wywołania API, aby wyświetlić bitmapę w oknie (linie 2, 3, 4).
Jeśli byłby do tego skrót, kod miałby do 60 znaków (linia 1)

PLZ POMOC ZNAJDŹ SKRÓT KTHX

Wersja bez golfa (tylko linia 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    

Zrzut ekranu:

(Darmowa wersja działa w systemie OS X pod Wine. Tak, jestem taki tani.)

zrzut ekranu

*: Dyalog ma swój własny jednobajtowy zestaw znaków, z symbolami APL odwzorowanymi na górne 128 bajtów, więc cały kod można zapisać w 194 bajtach. Każde stwierdzenie w tym przypisie jest prawdopodobnie prawdziwe. Zachowaj spokój i kontynuuj grę w golfa.


10

Mathematica 10.0, 19 znaków

MandelbrotSetPlot[]

MandelbrotSetPlot jest nową funkcją w Mathematica 10.0.

wprowadź opis zdjęcia tutaj


Jak wygodne, że ta wbudowana funkcja spełnia wszystkie moje wymagania (z wyjątkiem lokalizacji, którą można ustawić za pomocą 13 dodatkowych znaków). Tyle że jest to standardowa luka.
Mark Jeronimus

19
W golfa kodowego na ogół wygrywają języki specjalistyczne z tokenami jednoznakowymi lub systemy takie jak Mathematica, które mają wbudowaną ogromną liczbę funkcji specjalnych. Korzystanie z nich nie jest oszustwem, podobnie jak używanie komend jednoznakowych byłoby w APL.
Michael Stern

9

R, 199 211 znaków

Stare rozwiązanie o długości 199 znaków:

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)

Z wcięciem:

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)

wprowadź opis zdjęcia tutaj

Edycja: Rozwiązanie składające się z 211 znaków, które inaczej koloruje wnętrze zestawu i zewnętrzną stronę pierwszej warstwy:

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)

Z wcięciem:

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)

wprowadź opis zdjęcia tutaj


technicznie czarny na zewnątrz jest niedozwolony. Tęskniłeś lub jest to trudne do wdrożenia?
Mark Jeronimus

@MarkJeronimus faktycznie oba :) Postaram się rzucić okiem, jak to zrobić, ale nie jestem w 100% pewien, że znajdę sposób, aby to zrobić czysto.
plannapus

@MarkJeronimus Gotowe!
plannapus

5
Drugie miejsce w oddziale ohydnych kolorach.
meawoppl

1
@meawoppl blame rainbow():)
plannapus

9

Java - przetwarzanie (271 bajtów)

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

Rozszerzony:

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


Och, maaaaan, chciałem to zrobić. +1 .
SIGSTACKFAULT,

8

TI-80 BASIC, 125 106 bajtów

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

Na podstawie odpowiedzi Digital Trauma. wprowadź opis zdjęcia tutaj


6

GLSL - 225 bajtów:

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

Definiowanie zmiennych w kodzie (242 bajty):

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

Zobacz to w ShaderToy

Golf Mandelbrot

Wymaga to załadowania odpowiedniej tekstury palety jako iChannel0. (Kolorystyka tutaj pochodzi z tekstury „losowego piksela” w ShaderToy).


Deklaracje zmiennych również powinny być liczone, chyba że można je wygenerować automatycznie z kodu. (schemat kolorów jest w porządku, jeśli jest dostępny tylko jako ustawienie zewnętrzne)
Mark Jeronimus

@MarkJeronimus: W środowisku ShaderToy zmienne te są ustalone. W przeciwnym razie dla standardowych shaderów wybrałbym krótsze nazwy zmiennych.
nneonneo,

Czy to najszybszy z nich wszystkich?
Demi

6

Oktawa ( 212 136 bajtów)

(Teraz zawiera kilka pomysłów dzięki @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])

Z białymi znakami:

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

Wynik:

Mandelbrot przechodzi do abs (z)> 2

Aby przekonwertować na Matlab, zmień „ m+=abs(z)<2” na „ m=m+(abs(z)<2)”. [+3 bajty]

Aby ustawić proporcje 1: 1, dodaj „ ;axis image”. [+11 bajtów]

Moja pierwsza odpowiedź (212 bajtów):

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

Prawdopodobnie istnieje krótszy sposób na uzyskanie nieciągłej
mapy

Tak, teraz znacznie lepiej.
aschepler

+1 ładne i zwięzłe rozwiązanie. Ale twój współczynnik kształtu nie jest 1: 1 (por. Reguła nr 2: wyjście powinno być kwadratowe).
plannapus

Naprawienie współczynnika kształtu zajmie jeszcze 11 bajtów: dodaj „ ;axis image”. Czy to jest wymagane, aby się zakwalifikować?
aschepler

myślę, że to był tylko mój dupek :), OP nie wydaje się mieć z tym problemu, ponieważ nic nie powiedział.
plannapus

6

Applesoft BASIC, 302 286 280 bajtów

Wybiera losowe punkty do losowania, więc będzie działać wiecznie i może nigdy nie wypełnić pełnej płaszczyzny.

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

Okazuje się, że Applesoft BASIC naprawdę wybacza brak miejsca. W całym programie wymagana jest tylko jedna spacja.

Wyjście po 14 godzinach:

        wynik

GIF:

        gif

Przed golfem:

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

Uwaga: POKE 49234,0(w Applesoft BASIC) przełącza maszynę w tryb pełnej grafiki.

Wersja zoptymalizowana pod kątem wyświetlaczy czarno-białych:

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

Wyjście po 12 godzinach:

        b & w

Wersja, która będzie działać 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

Byłby mniejszy (i wolniejszy), gdyby nie drukować dwóch pikseli jednocześnie, ale wybrać losowy piksel na całym ekranie.
Mark Jeronimus

1
@MarkJeronimus Jest już tak wolny, że wersja kolorowa jeszcze się nie zakończyła po opublikowaniu tego 5 dni temu. Nie sądzę, że stać mnie na to, aby było wolniej: P
MD XF

5

gnuplot 110 (105 bez nowych linii)

Obowiązkowy wpis gnuplot. Robiono to niezliczoną ilość razy, ale ten jest od zera (nie jest to trudne). Podoba mi się, jak gnuplotgolf sam w sobie wydaje polecenia :)

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

bez golfa:

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

Jestem jednak głęboko rozczarowany wprowadzeniem liczb zespolonych. x*{1,0}+y*{0,1}musi być najsmutniejszym istniejącym sposobem konstruowania liczby zespolonej.

Ups, obraz: gnuplot mandelbrot

Ustaw izosamki wyżej, aby uzyskać lepszą rozdzielczość. Moglibyśmy również powiedzieć unset ticsi unset colorboxdla czystego obrazu, ale myślę, że ta wersja jest w porządku.


Założę się, że to kopia / makaron z pierwszego hitu Google „gnuplot mandel”. Na początek, *{1,0}jest jednością i jest bardziej jak sposób na powiedzenie kręgli kodu *1i prawdopodobnie może zostać porzucony. (niesprawdzony)
Mark Jeronimus

1
Nie, to nie jest kopia-wklej. Jest to bardzo prosta formuła i nawet nie trzeba było jej szukać. Znalazłem jednak strony, które otrzymałeś podczas tego wyszukiwania, kiedy szukałem lepszego sposobu inicjowania liczb zespolonych (ich implementacja jest inna, cóż, tak różna, jak to możliwe w tym przypadku). Dzięki za wskazówkę na temat prawdziwej części, to działa. Ustalenie.
Orion

5

Matlab (89 bajtów)

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

Wynik -

wprowadź opis zdjęcia tutaj

Nie spełnia wymogu, że komórki wewnętrzne muszą być czarne lub białe, ale może to być spełnione przez (1) użycie imshow(K)zamiast imagesc(K)(wymaga 1 bajtu mniej, ale wymaga zestawu narzędzi do przetwarzania obrazu) lub (2) dodanie colormap hot(wymaga 12 więcej bajty).

Wersja bez golfa -

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)

Korzystanie z biblioteki jest w porządku, jeśli jest ona domyślnie spakowana w Matlabie i każdy użytkownik może zgadywać, że jest używana na podstawie kodu lub komunikatów o błędach.
Mark Jeronimus

Fajnie, pokonałeś mnie. Podoba mi się C-Cmiejsce mojego 0*e(401). Poza tym nie używasz N. I możemy trochę skrócić, używając mojego m+=abs(z)<2pomysłu zamiast twojego K(~K&abs(Z)>2)=j.
aschepler

Domyślne colormap jeti colormap hotoba są niepoprawne - mają tylko 64 różne kolory. colormap(hot(101))nie wydaje mi się wizualnie rozpoznawalny. colormap([0,0,0;jet(100)])jest możliwe do zaakceptowania, ale niepewne.
aschepler

Czy to działa? K=K+abs(Z)<2Znaczy Oktawa K=((K+abs(Z))<2). (Więc pomyliłem się co do jednego bajtu do wyeliminowania +=.)
aschepler

2
Zestaw Mandelbrota obrócony o 90 stopni jest nadal zestawem Mandelbrota.
Chris Taylor

4

JavaScript + HTML5 (356B)

(Uwaga: w celu zwiększenia czytelności dodano tutaj linie kończące się na „//”)

Wersja performant (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>

Wersja wolna (356B): usuń „var” i parametry w funkcji wewnętrznej, aby użyć zakresu globalnego.

Wypróbuj: http://jsfiddle.net/neuroburn/Bc8Rh/

wprowadź opis zdjęcia tutaj


Wybacz mi, jeśli nie rozumiem twoich instrukcji dotyczących tworzenia krótkiej wersji.
Mark Jeronimus

Nie ma problemu. Usuń var w,na początku i zmień function(x,i,j,k,l,c,o)na function().
ɲeuroburɳ

4

JavaScript, 285B

W oparciu o mój kod i kilka ulepszeń w kodzie MT0 , mam to do 285B w kolorze:

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

w akcji: http://jsfiddle.net/acLhe/7/

był: 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 ma być czytelny: - / zobacz go w akcji: http://jsfiddle.net/acLhe/6/

Mandelbrot Coffeescript


OP prosi o kolor, chyba że twoja platforma nie obsługuje koloru. Wygląda jednak świetnie i fajny zwięzły kod. Witamy w PPCG!
Jonathan Van Matre

Zaczynam od tego rozmiaru 285B i poprawiam go bardziej w tej odpowiedzi
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

Standardowa paleta DOS:

wprowadź opis zdjęcia tutaj


4

Tcl / Tk, 316

322 324 336 348 349 351 352 353 354 355

Teraz krótsza wersja z 3-literowymi skrótami #RGB oznacza stylowe tryplety kolorów (zamiast trypletów #RRGGBB), co daje różne kolory.

I jeszcze trochę golfa.

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

Myślę, że wygrałbym, gdyby kryterium było piękno!

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

Prezentacja:

fraktal


1
Miły. Można zmniejszyć kilka znaków (do 380, jak sądzę), dodając rename set sna górze, a następnie zastąpienie cały setBys
Rolazaro Azeveires

4

Excel VBA, 251 246 224 223 221 bajtów

Zaoszczędzono 5 bajtów dzięki pułapowi catcat Zaoszczędzono 23 bajty dzięki 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

Wynik:

Wyjście przy D = 99

Stworzyłem wersję, która zrobiła to dawno temu, ale miała wiele dodatków, takich jak pozwalanie użytkownikowi wybrać podstawowy kolor i łatwą do naśladowania matematykę. Gra w golfa w dół była interesującym wyzwaniem. ColorMetoda wykorzystuje 1E6jako środek do uzyskania szerokiej gamy kolorów, ponieważ kolory są ważne 0do 2^24. Ustawienie 10^6daje dobre kontrastowe obszary.

Objaśnienie / automatyczne formatowanie:

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

Grałem też z D=999i, j=1 to 998aby uzyskać znacznie większy i bardziej precyzyjny obraz. Wyniki nie mają znaczenia dla wyzwania, ponieważ są o wiele za duże, ale schludne.

D = 999


@ceilingcat Thanks. To było przeniesienie z mojego oryginału, który miał wyspecjalizowane funkcje matematyki złożonej liczby.
Engineer Toast

Czy to naprawdę musi być> = 4, czy możesz dostać> 4? Ponadto, można wymienić j<99z j<D.
ceilingcat

@EngineerToast możesz usunąć ()z nazwy podrzędnej, powinieneś zmienić (j<99)na (j<d)i możesz, w celu umożliwienia używania kwadratowych komórek tylko Cells.RowHeight=48zamiast Cells.RowHeight=9, Cells.ColumnWidth=1- utrudnia to bałagan z twoimi wynikami, ale został zaakceptowany jako ważny przez społeczność -
Taylor Scott

1
@TaylorScott Pamiętam RowHeightsztuczkę z postu z poradami VBA i chciałem ją zintegrować po otrzymaniu wszystkich moich pięknych zdjęć. To był niezły kawałek, dzięki.
Engineer Toast

Wierzę, że można uniknąć usuwania kolejnego bajtu, zamieniając 2^20z1E6
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

Fraktal Mandelbrota od Perla + GD

Grał w golfa z tego kodu


2
Nominowany: najbardziej brzydka kolorystyka.
meawoppl

3

Floater, 620 pikseli

Język, który wymyśliłem, gdy zainspirowało mnie moje własne wyzwanie, a także ezoteryczny język Piet.

wprowadź opis zdjęcia tutaj


2
Link do języka i opisu kodu? A właściwie jaki jest kod?
MD XF,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.