Mandelbrot-Bild in jeder Sprache

91

Ich habe immer ein Mandelbrot- Bild als 'grafische' Version von Hello World in jeder grafischen Anwendung verwendet, die ich in die Hände bekam. Jetzt sind eure Jungs dran.

  • Die Sprache muss in der Lage sein, Grafiken auszugeben oder Diagramme zu zeichnen (Speichern von Dateien nicht zulässig).
  • Rendern Sie ein quadratisches Bild oder einen Graphen. Die Größe mindestens 128 und höchstens 640 über *
  • Die fraktalen Koordinaten reichen von ungefähr -2-2i bis 2 + 2i
  • Die Pixel außerhalb des Mandelbrot-Satzes sollten entsprechend der Anzahl der Iterationen gefärbt sein, bevor die Größe 2 überschreitet (ausgenommen * Schwarzweiß).
  • Jede Iterationszahl muss eine eindeutige Farbe * haben, und benachbarte Farben sollten vorzugsweise mit dem Auge leicht zu unterscheiden sein
  • Die anderen Pixel (vermutlich innerhalb des Mandelbrot-Sets) müssen entweder schwarz oder weiß sein
  • Mindestens 99 Iterationen
  • ASCII-Kunst nicht erlaubt

* sofern nicht durch die Plattform eingeschränkt, zB Grafikrechner

Erlaubt:
Erlaubt
Nicht erlaubt:
Nicht erlaubt
(geschrumpfte Bilder)

Gewinnbedingungen:

Die kürzeste Version (Größe in Bytes) für jede Sprache wird in diesem Beitrag nach Größe sortiert erwähnt.
Keine Antwort wird jemals mit der Schaltfläche "akzeptiert".

Bestenliste:

Mark Jeronimus
quelle
8
"Vom Auge leicht zu unterscheiden" ist schwer objektiv zu machen. Abgesehen von Ihrer persönlichen Verbindung der beiden hat das Mandelbrot-Set auch nichts mit Hello World zu tun. Lassen Sie dies daher am besten aus dem Titel aus, es sei denn, Sie durchsuchen die Suchmaschinen absichtlich.
Jonathan Van Matre
1
Verwandte: ASCII-Mandelbrot (obwohl einige der dort veröffentlichten Antworten nicht ASCII sind und möglicherweise besser als Antworten auf diese Frage passen könnten).
Peter Taylor
3
Ich habe einige Leute gesehen, die jetzt erwähnen, dass sie den Mandelbrot als "Hallo Welt" rendern. Ich mache das auch, seit ungefähr 30 Jahren. Der Mandelbrot ist die perfekte "Hallo Welt", da er zeigt, dass Sie Pixelzugriff auf das Display haben und ein gutes Gefühl für die rechnergebundene Leistung auf der neuen Plattform vermittelt.
Roger Dahl
6
Tolle Idee, eine Frage zu stellen, die eine Kombination aus mathematischen und ästhetischen Sensibilitäten erfordert, und dann alle Entwurfsentscheidungen im Voraus aufzuerlegen.
Jwg
3
Jeder schafft es, einen in Brainfuck zu gewinnen, ich würde sagen: D
MadTux

Antworten:

94

Sharp EL-9300 Grafikrechner, 296 Byte

Dies war mein Grafikrechner für die Sekundarschule , der vor 20 Jahren noch funktionierte! Ich erinnere mich, dass ich damals einen Mandelbrot-Generator dafür geschrieben habe. Und ganz sicher, es befindet sich immer noch im NV-Speicher:

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

Das Rendern dauerte ungefähr 90 Minuten.

Das ist total ungolfed. Ich bin sicher, ich könnte ein bisschen Platz sparen, aber ich wollte nur diese historische Neugier teilen!

Ich liebe es, dass die einzigen verfügbaren Steueranweisungen gotos sind.

Hier ist ein Foto. Ich habe keine anderen Möglichkeiten, um die grafische Ausgabe zu erhalten: Bildbeschreibung hier eingeben

Digitales Trauma
quelle
1
Ich auch, aber mein NV-Speicher wurde nach Jahren der Lagerzeit leer.
Mark Jeronimus
2
zx²+zy²>4konnte sie nicht erfolgreich sein Abs(x)>2?
Mark Jeronimus
1
Vielleicht sollten Sie eine neue Batterie besorgen ...
NothingsImpossible
25
Interessant. Sie sind also schon eine ganze Weile ein Nerd .
Devnull
4
Nizza "Screenshot"
meawoppl
83

Ich bin neulich darauf gestoßen. Ich nehme keine Anerkennung dafür, aber verdammt, ist es großartig:

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

Bildbeschreibung hier eingeben http://preshing.com/20110926/high-resolution-mandelbrot-in-obfuscated-python/

ɐɔıɐɔuʇǝɥʇs
quelle
12
Es scheint unzulässig zu sein: Die Regionen sind nicht oder nur schwer zu unterscheiden.
Primo
5
Dies schreibt auch in eine Datei.
Lie Ryan
40
nicht erlaubt oder nicht, das ist ziemlich genial: D
Navin
18
@DigitalTrauma, heck, +1 für schönsten Input!
Brian S
19
Zählt das als Quine? ;-)
Blazemonger
47

LaTeX, 673 Bytes

\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

Ergebnis 129x129 (129 × 129)

Das PDF-Bild besteht aus farbigen quadratischen Einheiten mit einer Größe von 1 bp × 1 bp.

Ungolfed

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

x86-DOS-Assembly, 208 177 173 Byte

Die vollständige Binärdatei in HEX, die ich von Hand erstellt habe, lautet:

DBE3BE00A0B81300CD1056BA640007BF87F9FDBDC7008BCDE81A008AC3AA4979F7B9C70083EF784D79EE33C0CD16B80300CD10CD208BC12BC289441CDF441CDF06A701DEF9D95C088BC52BC289441CDF441CDF06A701DEF9D95C0CD9EED914D95404D95410D95C14B301D904D84C04DE0EA901D8440CD95404D94410D86414D84408D914D80CD95C10D84C04D95414D84410DF06AB01DED99BDFE09B9E7207433ADA72C632DBC3320002000400

Das Beispielbild ist:

Mandlebrot-Bildschirmfoto mit schwarz beschnitten

Die vollständige Quelle in lesbarem ASM ist ziemlich lang (damit habe ich herausgefunden, wie ich diesen Trottel codiert habe):

.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

Dies ist für die Kompilierung mit TASM vorgesehen, wird in MCGA ausgeführt und wartet auf einen Tastendruck, bevor das Programm beendet wird. Die Farben sind nur die Standard-MCGA-Palette.

BEARBEITEN: Es wurde optimiert, jetzt wird rückwärts gezeichnet (obwohl das gleiche Bild) und 31 Bytes gespeichert!

EDIT 2: Um das OP abzusichern, habe ich die Binärdatei per Hand neu erstellt. Auf diese Weise habe ich auch weitere 4 Bytes gespart. Ich habe jeden einzelnen Schritt des Prozesses dokumentiert und alle meine Arbeiten gezeigt, damit jeder mitmachen kann, wenn er es wirklich möchte (Warnung, es ist langweilig und sehr langwierig): http://lightning.memso.com/media/perm/ mandelbrot2.txt

Ich habe ein paar reguläre Ausdrücke in EditPadPro verwendet, um alle ; Final: ...Einträge in der Datei zu finden und sie als Hex-Binärdatei in eine .com-Datei zu kopieren . Die resultierende Binärdatei sehen Sie oben in diesem Beitrag.

Mark Ormston
quelle
1
Maschinencode zählt nicht. Wenn das zählt, sollte jede Sprache, die Byte-Code oder Maschinencode erzeugt, kürzer sein. Ich zähle 820, nachdem ich alles in 1-stellige lange Namen geändert habe.
Mark Jeronimus
3
Ich könnte das Ganze als Binärcode übergeben, wenn es für Sie einfacher ist, aber das wäre, als würde man jemanden, der eine Hochsprache verwendet, bitten, keine automatischen Konstruktionen, Makros usw. zu verwenden. Das ist ALLES, was Assembly wirklich ist, nur ein Haufen Makros. Die resultierende Binärdatei zum Ausführen eines vollständigen JavaScript, Perl usw. enthält die Binärdatei der Bibliothek. Bei ASM ist der letzte Hex-Wert alles, einschließlich der Bibliotheken, ALL CODE.
Mark Ormston
5
Nein. Ich kann ASM bei Bedarf von Hand in eine Binärdatei konvertieren. Es werden genau die 177 Bytes ausgegeben, mit denen mein Assembler geholfen hat. Der resultierende Code kann von jedem mit einem Binäreditor in eine neue Datei eingefügt werden, die mit 177 Bytes gespeichert wurde und wie erwartet funktioniert. Anscheinend ist SO in ASM-Einsendungen geteilt, also sollten Sie vielleicht klären, ob es Ihrer Meinung nach nicht zählt: meta.codegolf.stackexchange.com/questions/260/…
Mark Ormston
6
Also gut, um zu beweisen, dass dies ein gültiger Eintrag ist, habe ich die Zeit aufgewendet, die ich gebraucht habe, um ihn in eine Binärdatei zu übersetzen. Ich habe meine Antwort entsprechend aktualisiert.
Mark Ormston
7
Die Sache ist, es gibt keinen Compiler mit Assembly. Sie verwenden nur Makros. Zu sagen, dass es nicht zählt, ist wie zu sagen, dass Sie #definein C keine vordefinierten Anweisungen verwenden können. Es ist nur zeitaufwändig, alles manuell zu ersetzen.
Mark Ormston
28

Java, 505 405 324 Bytes

Nur eine Standardberechnung, mit Golfstärke jetzt mit zusätzlicher Golfstärke.

Bildbeschreibung hier eingeben

Golf gespielt:

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

Mit Zeilenumbrüchen:

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();
    }
}
Geobits
quelle
f.setSize(n,668);- hängt stark vom verwendeten Theme ab, werde es aber akzeptieren.
Mark Jeronimus
Sie können die Importe in Java löschen, da sie ohnehin automatisch generiert werden.
Mark Jeronimus
Ich sehe auch, doublewo floatSie es versuchen könnten
Mark Jeronimus
JFrame=> Framerasiert 2 Zeichen ab. Obwohl Sie das Fenster nicht mehr schließen können. ;)
EthanB
2
Ihre Klasse muss nicht öffentlich sein. Verwenden Sie außerdem Java 8, um den finalModifikator zu entfernen. Und Sie dürfen die Importe nicht auslassen, um eine vollständige Einreichung zu erhalten.
Victor Stafusa
21

Javascript (ECMAScript 6) - 315 308 Zeichen

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)

Standardausgabe

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

  • Ändern Sie n, um die Bildgröße (und die Anzahl der Iterationen) zu ändern.
  • Ändern Sie die in den f(87);f(0);f(0);Aufrufen übergebenen Werte (gegen Ende), um die RGB-Farbwerte zu ändern. ( f(8);f(8);f(8);Ist Graustufen.)

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

Bildbeschreibung hier eingeben

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

MT0
quelle
2
Nett. d=documentwürde dir ein paar mehr sparen. (Gibt es auch einen Grund für die Erstellung der Zeichenfläche? Wird für Codegolf ein bestimmtes Maß an verfügbarem HTML vorausgesetzt?)
Matthew Wilcoxson
1
Sie können document.createElement`canvas` 2 Bytes schreiben und speichern. Gleich wie die getContext`2d` .
Ismael Miguel
Ich habe kein HTML Canvas angenommen, da dies eine reine JavaScript-Lösung ist.
MT0
oder Sie können Leinwand überhaupt wie hier
Kamil Kiełczewski
19

J, 73 Bytes

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

Mandelbrot gesetzt

Bearbeiten , einige erklären:

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
Eelvex
quelle
1
+1, aber könnten Sie ein wenig erklären, wie dieser Code funktioniert? Insbesondere bin ich neugierig zu wissen, wie (wo im Code) die Farben ausgewählt werden?
Plannapus
1
@ MarkJeronimus, ich kann es 70 machen, aber ich habe einige Dinge zur Klarheit aufbewahrt. Ich habe mir daher die Freiheit genommen, das LF beim Zählen zu ignorieren.
Eelvex
@plannapus, OK, hat einige Kommentare hinzugefügt. Die Farbauswahl wird durchgeführt, wobei (0,?$~99 3)100 RGB-Triplets erzeugt werden, eines für jedes Level. Aufgrund der Zufälligkeit erhalten Sie möglicherweise weniger als 100 Drillinge, sodass einige Ebenen einen weicheren Übergang haben (aber immer noch unterschiedliche Farben haben).
Eelvex
17

Mathematica, 214, 191, 215, 19, 30

Seit Version 10.0 gibt es ein eingebautes: (19 Bytes)

MandelbrotSetPlot[]

mandelbrot


Um die Koordinatenbereichsanforderungen zu erfüllen, sind 11 zusätzliche Bytes erforderlich. (30 Bytes)

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

m2


Ein handgerollter Koffer:

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

Grün

DavidC
quelle
{b, -2, 2, .01}, {a, -2, 2, .01}ist kürzer und näher an den Regeln
Mark Jeronimus
@ MarkJeronimus Danke. Ich habe den vorgeschlagenen Bereich für das iterierende Bild verwendet.
DavidC
Sie hatten es fast richtig, dann haben Sie die Innenseite nicht schwarz gemacht. Das letzte Bild im GIF ist innen schwarz und eine erlaubte Antwort. EDIT: und ich zähle 195 Bytes.
Mark Jeronimus
Ich habe den Gedanken daran, schwarz zu sein, verpasst. Die Anzahl wurde erhöht, da einige einzelne Zeichen beim Ausschneiden und Einfügen in SE zu zwei Zeichen wurden.
DavidC
Ihre integrierte Lösung verwendet eine sehr lockere Interpretation von The fractal coordinates range from approximately -2-2i to 2+2i.
Jonathan Frech
16

Python mit Pylab + Numpy, 151 Bytes

Ich konnte es nicht ertragen, einen nicht-DQ'ed Python-Eintrag zu sehen, aber ich glaube, ich habe mich bei diesem wirklich übertroffen und es auf 153 Zeichen reduziert!

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

Insbesondere die vorletzte Zeile wirft 4 verschiedene Laufzeitwarnungen auf, ein neuer persönlicher Rekord!

Bildbeschreibung hier eingeben

meawoppl
quelle
Ich zähle 152. Zwischen importund ist kein Leerzeichen erforderlich *, und die Definition fsollte überhaupt nicht kürzer sein, es sei denn, ich habe etwas falsch verstanden, was möglich ist. Sie sollten es auch so ändern, dass 0 Iterationen und 1 Iterationen voneinander getrennt sind (sie sind derzeit beide grau).
Primo
Seltsam. Beinhaltet wc das eof? Fest und etwas kleiner. Einen Augenblick.
Meawoppl
Ich bekomme 151 mit wc. Erste Golf, also nicht sicher, wie es punkten soll.
Meawoppl
Ich zähle 150, ohne Zeilenvorschub. Einige Interpreter / Compiler verlangen einen, aber der Python-Interpreter kommt ohne aus. Ich bin mir nicht sicher wc, aber vielleicht versuche ich es stat -c %sstattdessen. Sind die schwarzen oberen und unteren Ränder Teil des Bildes?
Primo
1
Sie können 1 Zeichen speichern, indem Sie from numpy import*anstelle von import numpy as nund mgridanstelle von verwenden n.mgrid.
nyuszika7h
15

C + Allegro 4.2.2 - 248 Bytes

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

Ausgabe:

MSet 1

Oberon
quelle
Sie sollten erwähnen, dass dies Allegro 4 ist (was sich sehr von Allegro 5 unterscheidet). Welche genaue Version ist das?
Victor Stafusa
Es ist entweder 246 oder 249 lang
Mark Jeronimus
@ Victor Allegro 4.2.2.
Oberon
1
@MarkJeronimus Soll es zwischen ... allegro.h>und keinen Zeilenumbruch geben x=-1, ...? Ich nehme an, Notepad ++ zählt es als \r\n= 0D 0A.
Oberon
1
Ich denke, 0.01kann als getippt werden .01.
Yytsi
14

Windows PowerShell (v4), 299 Byte

Mandelbrot-Fractalbild

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

Anleitung

  • Führen Sie eine normale PowerShell-Konsole aus (ISE funktioniert möglicherweise nicht)
  • Kopieren Sie den Code, und drücken Sie die Eingabetaste
  • Warten Sie - die Ausführung dauert mindestens eine Minute
  • Sie können das Programm nur beenden, indem Sie die Konsole schließen

Kommentar

  • Mit den Farben im Set wird ein winziges Stück Regelprüfung durchgeführt. die Regeln besagen "Die anderen Pixel (vermutlich innerhalb des Mandelbrot-Sets) müssen entweder schwarz oder weiß gefärbt sein" ; Der Code färbt die Pixel komplett schwarz RGB (0,0,0) ... es handelt sich einfach um ein transparentes schwarzes RGBA (0,0,0,0). Was sich also zeigt, ist die Formularhintergrundfarbe des aktuellen Windows-Designs, in diesem Fall ein leicht cremefarbenes RGB (240.240.240).
TessellatingHeckler
quelle
Ich würde ändern lt2, lt4um es zu einem "Mandelbrot-Set" zu machen, anstelle des Bildes, das Sie jetzt haben. Viele Punkte des Sets werden von den Farbbändern verschluckt.
Mark Jeronimus
Anscheinend ist Magnitude a*a+b*bnichtsqrt(a*a+b*b)
Mark Jeronimus
Ich dachte ich , dass früher getestet, aber ich ging auf der Suche nach einer Antwort auf „wo ist die horizontale Linie auf der linken Seite weg?“, Und nach einer Weile fand ich es genau dort , wo Sie gesagt hat , -lt4. Welches ist gut - danke. Ich habe meine Antwort mit korrigiertem Code und Bild aktualisiert. (Muss mein Verständnis überdenken, was es tut, da mir etwas fehlt).
TessellatingHeckler
14

Python + PIL , 166 Bytes

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

Ausgabe (wird im standardmäßigen * .bmp-Viewer geöffnet):

primo
quelle
1
Sie können 3 abschneiden, wenn Sie die ySchleife loswerden . r=range(d*d), benutze x/dund x%dfür x und y.
Geobits
@Geobits die idee tatsächlich 10 gespart, danke!
Primo
1
Komplexe Typen können wie folgt initialisiert werden: c = 1 + 2j. Ich denke, Sie sparen ein paar Zeichen mit: z = o = x / 9e4-2 + (x% d / 150.-2) * 1j; c = 99
Meawoppl
@meawoppl weitere 7: D
Primo
Technisch nicht erlaubt: Dies ist keine grafische Ausgabefunktion von Python selbst (und Image.show()speichert implizit eine temporäre Datei).
Nneonneo
12

BBC Basic (228 Bytes)

Was ist mit Sprachen, von denen noch niemand im Codegolf gehört hat? Höchstwahrscheinlich könnte optimiert werden, aber ich bin nicht ganz wo - Verbesserungen möglich. Basierend auf http://rosettacode.org/wiki/Mandelbrot_set#BBC_BASIC , aber ich habe versucht, Golf so weit wie möglich zu codieren.

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

Das generierte Mandelbrot-Set

Das >Symbol auf dem Bild ist eine Eingabeaufforderung und wird nach dem Ausführen des Programms automatisch generiert.

Konrad Borowski
quelle
Sie müssen nicht zweimal plotten, sondern entscheiden sich für eine ineffizientere Version. Unterstützt es nicht NEXT Y,X?
Mark Jeronimus
10

APL, 194 Zeichen / 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')

Dies ist für Dyalog APL mit ⎕IO ⎕ML←1 3

Der größte Teil des Speicherplatzes wird von API-Aufrufen beansprucht, um eine Bitmap in einem Fenster anzuzeigen (Zeilen 2, 3, 4).
Wenn eine Verknüpfung vorhanden wäre, wäre der Code auf 60 Zeichen begrenzt (Zeile 1).

PLZ HELP SHORTCUT KTHX FINDEN

Ungolfed version (nur zeile 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    

Bildschirmfoto:

(Freeware-Version läuft unter OS X unter Wine. Ja ich bin so günstig.)

Bildschirmfoto

*: Dyalog hat einen eigenen Einzelbyte-Zeichensatz, wobei die APL-Symbole den oberen 128-Byte-Werten zugeordnet sind, sodass der gesamte Code in 194 Byte gespeichert werden kann. Jede Aussage in dieser Fußnote ist möglicherweise richtig. Bleib ruhig und spiele weiter Golf.

Tobia
quelle
10

Mathematica 10.0, 19 Zeichen

MandelbrotSetPlot[]

MandelbrotSetPlot ist eine neue Funktion in Mathematica 10.0.

Bildbeschreibung hier eingeben

Alephalpha
quelle
Wie praktisch, dass diese eingebaute Funktion all meine Anforderungen erfüllt (außer dem Ort, der mit 13 weiteren Zeichen festgelegt werden kann). Ausgenommen, dies ist eine Standardlücke.
Mark Jeronimus
19
Codegolf wird im Allgemeinen von Fachsprachen mit Einzelzeichen-Token oder von Systemen wie Mathematica mit einer großen Anzahl integrierter Sonderfunktionen gewonnen. Sie zu verwenden ist kein Betrug, ebenso wenig wie die Verwendung von Einzelzeichenbefehlen in APL.
Michael Stern
9

R 199 211 Zeichen

Alte Lösung mit 199 Zeichen:

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)

Mit Einrückung:

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)

Bildbeschreibung hier eingeben

Bearbeiten: Lösung mit 211 Zeichen, die das Innere des Sets und das Äußere der ersten Ebene unterschiedlich färbt:

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)

Mit Einrückung:

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)

Bildbeschreibung hier eingeben

Plannapus
quelle
außen technisch schwarz ist verboten. Haben Sie das verpasst oder ist es schwierig umzusetzen?
Mark Jeronimus
@MarkJeronimus eigentlich beide :) Ich werde versuchen, einen Blick darauf zu werfen, wie das geht, aber ich bin nicht zu 100% zuversichtlich, dass ich einen Weg finden werde, das sauber zu machen.
Plannapus
@MarkJeronimus Fertig!
Plannapus
5
Zweiter Platz in der schrecklichen Farbabteilung.
Meawoppl
1
@ Meawoppl Schuld rainbow():)
Plannapus
9

Java - Verarbeitung (271 Bytes)

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

Erweitert:

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

Jan K
quelle
Oh, maaaaan, ich wollte das machen. +1 .
SIGSTACKFAULT
8

TI-80 BASIC, 125 106 Bytes

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

Basierend auf der Antwort von Digital Trauma. Bildbeschreibung hier eingeben

12Me21
quelle
6

GLSL - 225 Bytes:

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

Variablen im Code definieren (242 Bytes):

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

Sehen Sie es in ShaderToy

Mandelbrot Golf

Dazu muss eine geeignete Palettentextur geladen werden iChannel0. (Die Färbung hier ist von der "zufälligen Pixel" -Textur auf ShaderToy).

nneonneo
quelle
Variablendeklarationen sollten ebenfalls gezählt werden, sofern sie nicht automatisch aus dem Code generiert werden können. (Farbschema ist in Ordnung, wenn es nur als externe Einstellung verfügbar ist)
Mark Jeronimus
@MarkJeronimus: Für die ShaderToy-Umgebung sind diese Variablen festgelegt. Andernfalls hätte ich für Standard-Shader kürzere Variablennamen ausgewählt.
Nneonneo
Ist das der schnellste von allen?
Demi
6

Oktave ( 212 136 Bytes)

(Jetzt mit ein paar Ideen von @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])

Mit Leerzeichen:

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

Ausgabe:

Mandelbrotschritte zu abs (z)> 2

Um nach Matlab zu konvertieren, ändern Sie " m+=abs(z)<2" in " m=m+(abs(z)<2)". [+3 bytes]

Fügen Sie " ;axis image" hinzu, um das Seitenverhältnis 1: 1 festzulegen . [+11 bytes]

Meine erste Antwort (212 Bytes):

[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])
aschepler
quelle
Es gibt wahrscheinlich einen kürzeren Weg, um eine diskontinuierliche Farbkarte zu erhalten ...
aschepler
Ja, jetzt viel besser.
Aschepler
+1 schöne und prägnante Lösung. Ihr Seitenverhältnis ist jedoch nicht 1: 1 (vgl. Regel Nr. 2: Ausgabe sollte quadratisch sein).
Plannapus
Für die Korrektur des Seitenverhältnisses werden 11 weitere Bytes benötigt: Fügen Sie " ;axis image" hinzu. Ist das erforderlich, um sich zu qualifizieren?
Aschepler
Ich denke, es war nur ich nitpicking :), der OP scheint kein Problem damit zu haben, da er nichts gesagt hat.
Plannapus
6

Applesoft BASIC, 302 286 280 Bytes

Dies wählt zufällige Punkte zum Zeichnen aus, so dass es für immer ausgeführt wird und möglicherweise nie die gesamte Ebene ausfüllt.

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

Es stellt sich heraus, dass Applesoft BASIC den Platzmangel wirklich verzeiht. Im gesamten Programm ist nur ein Leerzeichen erforderlich.

Ausgabe nach 14 Stunden:

        Ausgabe

GIF:

        gif

Vor dem Golfen:

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

Hinweis: POKE 49234,0(in Applesoft BASIC) versetzt das Gerät in den Vollgrafikmodus.

Eine für B & W-Displays optimierte Version:

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

Ausgabe nach 12 Stunden:

        b & w

Eine Version, die in GW-BASIC (DOS) funktioniert:

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
MD XF
quelle
Wäre kleiner (und langsamer), wenn Sie nicht zwei Pixel gleichzeitig plotten, sondern ein zufälliges Pixel auf dem gesamten Bildschirm auswählen würden.
Mark Jeronimus
1
@MarkJeronimus Es ist schon so langsam, dass die Farbversion noch nicht fertig ist, nachdem dies vor 5 Tagen gepostet wurde. Ich glaube nicht, dass ich es mir leisten kann, langsamer zu werden: P
MD XF
5

Gnuplot 110 (105 ohne Zeilenumbruch)

Obligatorischer Gnuplot-Eintrag. Es wurde unzählige Male gemacht, aber dieses ist von Grund auf neu (nicht, dass es schwierig ist). Ich mag, wie gnuplotGolf seine Befehle an sich :)

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

Ich bin jedoch DEEPLY enttäuscht über die Eingabe komplexer Zahlen. x*{1,0}+y*{0,1}muss die traurigste existierende Art sein, eine komplexe Zahl zu konstruieren.

Ups, das Bild: Gnuplot-Mandelbrot

Stellen Sie Isosamples für eine bessere Auflösung höher ein. Wir könnten auch sagen unset ticsund unset colorboxfür ein reines Bild, aber ich denke, diese Version eignet sich gut.

orion
quelle
Wetten, es ist Kopie / Pasta aus dem ersten Google-Hit "Gnuplot Mandel". Für den Anfang *{1,0}ist Einheit und ist eher eine Code-Bowling-Art zu sagen *1, und kann wahrscheinlich fallengelassen werden. (ungetestet)
Mark Jeronimus
1
Nein, es ist kein Kopieren-Einfügen. Es ist eine sehr einfache Formel und es war nicht einmal nötig, danach zu suchen. Ich habe jedoch die Seiten gefunden, die Sie mit dieser Suche erhalten, als ich nach einer besseren Methode zum Initialisieren komplexer Zahlen suchte (ihre Implementierung ist unterschiedlich, so unterschiedlich es in diesem Fall auch sein kann). Danke für den Tipp zum realen Teil, es funktioniert. Festsetzung.
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)

Ausgabe -

Bildbeschreibung hier eingeben

Erfüllt nicht die Anforderung, dass die inneren Zellen schwarz oder weiß sein müssen, aber dies kann durch (1) Verwenden von imshow(K)anstelle von imagesc(K)(erfordert 1 weniger Byte, benötigt jedoch die Bildverarbeitungs-Toolbox) oder (2) Anhängen colormap hot(erfordert 12 weitere ) erfüllt werden Bytes).

Ungolfed version -

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)
Chris Taylor
quelle
Die Verwendung einer Bibliothek ist in Ordnung, wenn sie standardmäßig in Matlab gepackt ist und jeder Benutzer anhand des Codes oder der Fehlermeldungen davon ausgehen kann, dass sie verwendet wird.
Mark Jeronimus
Schön, dass du mich geschlagen hast. Ich mag das C-Canstelle von meinem 0*e(401). Außerdem verwenden Sie nicht N. Und wir können mit meiner m+=abs(z)<2Idee etwas kürzer werden als mit deiner K(~K&abs(Z)>2)=j.
Aschepler
Der Standardwert colormap jetund colormap hotbeide sind jedoch falsch - sie haben nur 64 verschiedene Farben. colormap(hot(101))sieht für mich optisch nicht unterscheidbar aus. colormap([0,0,0;jet(100)])ist vielleicht akzeptabel aber zweifelhaft.
Aschepler
Funktioniert es? Auf Oktave K=K+abs(Z)<2bedeutet K=((K+abs(Z))<2). (Also habe ich mich geirrt, was die zu eliminierende 1-Byte-Schätzung +=
betrifft
2
Das um 90 Grad gedrehte Mandelbrot-Set ist immer noch das Mandelbrot-Set.
Chris Taylor
4

JavaScript + HTML5 (356B)

(Hinweis: Zeilen, die mit '//' enden, werden hier aus Gründen der Lesbarkeit hinzugefügt.)

Ausführende Version (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>

Langsame Version (356B): Entfernen Sie 'var' und Parameter in der inneren Funktion, damit der globale Gültigkeitsbereich verwendet wird.

Probieren Sie es aus: http://jsfiddle.net/neuroburn/Bc8Rh/

Bildbeschreibung hier eingeben

ɲeuroburɳ
quelle
Verzeihen Sie mir, wenn ich Ihre Anweisungen zum Erstellen der Kurzversion nicht verstehe.
Mark Jeronimus
Kein Problem. Entfernen Sie var w,am Anfang, und ändern function(x,i,j,k,l,c,o)zufunction() .
ɲeuroburɳ
4

Javascript, 285B

Basierend auf meinem Code und einigen Verbesserungen am MT0- Code habe ich dies auf 285B in Farbe reduziert:

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

in Aktion: http://jsfiddle.net/acLhe/7/

war: 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

Kaffeeskript soll lesbar sein: - / sehe es in Aktion: http://jsfiddle.net/acLhe/6/

Mandelbrot Coffeescript

Alexander-Brett
quelle
OP fragt nach Farbe, es sei denn, Ihre Plattform unterstützt keine Farben. Sieht aber gut aus und hat einen schönen, präzisen Code. Willkommen bei PPCG!
Jonathan Van Matre
Ich gehe von dieser Größe 285B aus und verbessere sie in dieser Antwort
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

Standard-DOS-Palette:

Bildbeschreibung hier eingeben

Mark Jeronimus
quelle
4

Tcl / Tk, 316

322 324 336 348 349 351 352 353 354 355

Jetzt eine kürzere Version mit 3-Buchstaben-Farbtripeln im #RGB-Kurzschriftstil (anstelle von #RRGGBB-Tripletts), die zu unterschiedlichen Farben führt.

Und noch mehr 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

Ich denke, ich würde gewinnen, wenn das Kriterium Schönheit wäre!

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

Präsentation:

fraktal

Sergiol
quelle
1
Nett. Sie können ein paar Zeichen (bis zu 380, glaube ich) reduzieren, indem Sie rename set soben hinzufügen und dann alle setvons
Rolazaro Azeveires
4

Excel VBA, 251 246 224 223 221 Bytes

5 Bytes dank ceilingcat gespeichert 23 Bytes dank Taylor Scott gespeichert

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

Ausgabe:

Ausgabe mit D = 99

Ich habe eine Version erstellt, die dies vor langer Zeit getan hat, aber es gab eine Menge Extras, wie den Benutzer die Grundfarbe auswählen zu lassen und leicht zu befolgende Mathematik. Golfspielen war eine interessante Herausforderung. Das ColorVerfahren verwendet 1E6als Mittel eine breite Palette von Farben zu erhalten , da die gültigen Farben 0zu 2^24. Setzen Sie es auf10^6Stellen Sie schöne Kontrastbereiche gibt.

Erklärung / Auto-Formatierung:

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

Ich habe auch herumgespielt D=999und j=1 to 998um ein viel größeres und präziseres Bild zu bekommen. Die Ergebnisse sind irrelevant für die Herausforderung , weil sie viel zu groß sind , aber sie sind ordentlich.

D = 999

Ingenieur Toast
quelle
@ceilingcat Danke. Das war eine Übertragung von meinem Original, das spezielle Funktionen für die Mathematik komplexer Zahlen hatte.
Ingenieur Toast
Muss es wirklich> = 4 sein oder kommt man mit> 4 davon? Auch kann, ersetzen j<99mit j<D.
Ceilingcat
@EngineerToast Sie die Drop können ()aus dem Unter Namen, sollten Sie ändern (j<99)zu (j<d)und Sie können zum Zwecke quadratischen Zellen nur zur Herstellung verwendet werden Cells.RowHeight=48anstelle der Cells.RowHeight=9, Cells.ColumnWidth=1- dies schwieriger mit Ihrer Ausgabe verwirren nicht machen um , aber als gültig akzeptiert wurde von der Community -
Taylor Scott
1
@TaylorScott Ich erinnere mich an den RowHeightTrick aus dem VBA-Tipps-Post und wollte ihn integrieren, nachdem ich alle meine hübschen Bilder bekommen hatte. Das war ein netter Teil, danke.
Ingenieur Toast
Ich glaube, dass Sie davonkommen können, wenn Sie ein weiteres Byte entfernen, indem Sie 2^20mit1E6
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 von Perl + GD

Golf von diesem Code

Mob
quelle
2
Nominiert: hässlichste Farbgebung.
Meawoppl
3

Floater, 620 Pixel

Eine Sprache, die ich erfunden habe, als ich mich von meiner eigenen Herausforderung inspirieren ließ, sowie von der esoterischen Sprache Piet.

Bildbeschreibung hier eingeben

Mark Jeronimus
quelle
2
Link zu einer Sprache und Beschreibung des Codes? Oder wie lautet eigentlich der Code?
MD XF