Immagine di Mandelbrot in ogni lingua


91

Ho sempre usato un'immagine Mandelbrot come versione 'grafica' di Hello World in qualsiasi applicazione grafica su cui ho messo le mani. Ora tocca ai tuoi ragazzi.

  • La lingua deve essere in grado di generare grafici o disegnare grafici (salvataggio di file non consentito)
  • Rendering di un'immagine quadrata o di un grafico. La dimensione di almeno 128 e al massimo 640 attraverso *
  • Le coordinate frattali vanno da circa -2-2i a 2 + 2i
  • I pixel esterni al set di Mandelbrot devono essere colorati in base al numero di iterazioni prima che la magnitudine superi 2 (escluso * bianco e nero)
  • Ogni conteggio delle iterazioni deve avere un colore unico * e i colori vicini dovrebbero preferibilmente essere facilmente distinguibili dall'occhio
  • Gli altri pixel (presumibilmente all'interno del set di Mandelbrot) devono essere colorati in bianco o nero
  • Almeno 99 iterazioni
  • Arte ASCII non consentita

* se non limitato dalla piattaforma, ad es. calcolatrice grafica

Consentito:
Permesso
Non consentito:
Non consentito
(immagini rimpicciolite)

Condizioni vincenti:

La versione più breve (dimensione in byte) per ogni lingua verrà menzionata in questo post, ordinata per dimensione.
Nessuna risposta sarà mai "accettata" con il pulsante.

Classifica:


8
"Facilmente distinguibile dall'occhio" è difficile da rendere oggettivo. ... Inoltre, a parte la tua associazione personale dei due, il set Mandelbrot non ha nulla a che fare con Hello World, quindi è meglio ometterlo dal titolo a meno che tu non stia deliberatamente trollando i motori di ricerca.
Jonathan Van Matre,

1
Correlati: ASCII Mandelbrot (anche se alcune delle risposte pubblicate non sono ASCII e probabilmente potrebbero adattarsi meglio come risposte a questa domanda).
Peter Taylor

3
Ho visto alcune persone ora menzionare che rendono il Mandelbrot come un "Hello World". L'ho fatto anch'io, per qualcosa come 30 anni. Il Mandelbrot è il "Hello World" perfetto perché mostra sia che si ha accesso ai pixel al display sia una buona sensazione per le prestazioni legate al calcolo sulla nuova piattaforma.
Roger Dahl,

6
Ottima idea di porre una domanda che richiede una combinazione di sensibilità matematiche ed estetiche, quindi imporre tutte le decisioni di progettazione in anticipo.
jwg

3
Chiunque riesce a farne uno in vittorie con il cervello, direi: D
MadTux

Risposte:


94

Calcolatrice grafica Sharp EL-9300, 296 byte

Questa era la mia calcolatrice grafica della scuola secondaria, che andava avanti per 20 anni fa! Ricordo di aver scritto un generatore Mandelbrot per allora. E abbastanza sicuro, è ancora seduto lì nella memoria 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

Il rendering ha richiesto circa 90 minuti.

Questo è totalmente non golfato. Sono sicuro di poter risparmiare un po 'di spazio, ma volevo solo condividere questa curiosità storica!

Adoro che le uniche dichiarazioni di controllo disponibili siano gotos.

Ecco una foto Non ho altri mezzi per ottenere l'output grafico: inserisci qui la descrizione dell'immagine


1
Anche io, ma la mia memoria NV è diventata vuota dopo anni di shelf-time.
Mark Jeronimus

2
zx²+zy²>4non potrebbe essere Abs(x)>2?
Mark Jeronimus

1
Forse dovresti avere una nuova batteria ...
NothingsImpossible

25
Interessante. Quindi sei stato un secchione per un bel po '.
Devnull

4
Nice "Screenshot"
meawoppl

83

L'ho incontrato l'altro giorno. Non me lo merito, ma accidenti, è fantastico:

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

inserisci qui la descrizione dell'immagine http://preshing.com/20110926/high-resolution-mandelbrot-in-obfuscated-python/


12
Sembra essere vietato: le regioni non sono facilmente distinguibili, o addirittura affatto.
primo

5
Inoltre, questo scrive in un file.
Lie Ryan

40
non consentito o no, è davvero fantastico: D
Navin

18
@DigitalTrauma, diamine, +1 per l'input più bello!
Brian S

19
Questo conta come un quine? ;-)
Blazemonger

47

LaTeX, 673 byte

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

Risultato 129x129 (129 × 129)

L'immagine PDF è composta da unità quadrate colorate con dimensioni 1bp × 1bp.

Ungolfed

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

36

x86 DOS Assembly, 208 177 173 byte

Il file binario completo, in HEX, che ho creato a mano, è:

DBE3BE00A0B81300CD1056BA640007BF87F9FDBDC7008BCDE81A008AC3AA4979F7B9C70083EF784D79EE33C0CD16B80300CD10CD208BC12BC289441CDF441CDF06A701DEF9D95C088BC52BC289441CDF441CDF06A701DEF9D95C0CD9EED914D95404D95410D95C14B301D904D84C04DE0EA901D8440CD95404D94410D86414D84408D914D80CD95C10D84C04D95414D84410DF06AB01DED99BDFE09B9E7207433ADA72C632DBC3320002000400

L'immagine di esempio è:

Mandlebrot schermata con nero ritagliato

La fonte completa in ASM leggibile è piuttosto lunga (l'ho usata per capire come stavo codificando questa ventosa):

.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

È progettato per la compilazione con TASM, viene eseguito in MCGA e attende la pressione di un tasto prima di terminare il programma. I colori sono solo la tavolozza MCGA predefinita.

EDIT: ottimizzato, ora disegna all'indietro (stessa immagine) e risparmiato 31 byte!

EDIT 2: Per attenuare l'OP, ho ricreato il binario a mano. In questo modo, ho anche rasato altri 4 byte. Ho documentato ogni singolo passaggio del processo, mostrando tutto il mio lavoro in modo che chiunque possa seguirlo se lo vuole davvero, qui (attenzione, è noioso e molto lungo): http://lightning.memso.com/media/perm/ mandelbrot2.txt

Ho usato un paio di regex in EditPadPro, per trovare tutte le ; Final: ...voci nel file e scaricarle come file binario esadecimale in un file .com. Il binario risultante è quello che vedi all'inizio di questo post.


1
Il codice macchina non conta. Se ciò conta, allora qualsiasi linguaggio che produca byte-code o machine-code dovrebbe essere più breve. Conto 820 dopo aver cambiato tutto in nomi lunghi di 1 carattere.
Segna Jeronimus il

3
Potrei codificare a mano l'intera cosa in binario se ti rende più semplice, ma sarebbe come chiedere a chiunque utilizzi un linguaggio di alto livello per evitare l'uso di costrutti automatici, macro, ecc. Questo è TUTTO quel gruppo davvero, solo un mucchio di macro. Il binario risultante per eseguire un JavaScript completo, Perl, ecc. Include il binario della libreria. Con ASM, il valore esadecimale finale è tutto, librerie, TUTTO IL CODICE, inclusi.
Mark Ormston,

5
No. Posso convertire a mano ASM in binario se veramente necessario. Uscirà con gli stessi 177 byte con cui il mio assemblatore mi ha aiutato. Il codice risultante può essere incollato da chiunque abbia un editor binario in un nuovo file, salvato, 177 byte, e funzionerà come previsto. Apparentemente SO è diviso sulle richieste di ASM, quindi forse dovresti chiarire se ritieni che non conti: meta.codegolf.stackexchange.com/questions/260/…
Mark Ormston

6
Va bene, quindi, per dimostrare che questa è una voce valida, ho trascorso il tempo necessario a tradurre questo in binario. Ho aggiornato la mia risposta di conseguenza.
Mark Ormston,

7
Il fatto è che non esiste un compilatore con assembly. Usa solo le macro. Dire che non conta è come dire che non è possibile utilizzare alcuna #defineistruzione predefinita in C. È solo tempo per sostituire manualmente tutto.
Mark Ormston,

28

Java, 505 405 324 byte

Solo un calcolo standard, con golfitude ora con golfitude extra.

inserisci qui la descrizione dell'immagine

golfed:

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

Con interruzioni di riga:

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);- dipende fortemente dal tema utilizzato, ma lo accetterò.
Mark Jeronimus

Puoi eliminare le importazioni in Java perché sono comunque generate automaticamente.
Mark Jeronimus

Vedo anche doubledove floatpotrebbe essere usato se ci provassi
Mark Jeronimus

JFrame=> Framerade 2 caratteri. Anche se non puoi più chiudere la finestra. ;)
EthanB

2
La tua classe non deve essere pubblica. Inoltre, utilizzare Java 8 per sbarazzarsi del finalmodificatore. E non devi omettere le importazioni per essere una presentazione completa.
Victor Stafusa,

21

Javascript (ECMAScript 6) - 315 308 caratteri

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)

Uscita predefinita

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

  • Cambia nper variare la dimensione dell'immagine (e il numero di iterazioni).
  • Modificare i valori passati nelle f(87);f(0);f(0);chiamate (vicino alla fine) per modificare i valori di colore RGB. ( f(8);f(8);f(8);è in scala di grigi.)

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

inserisci qui la descrizione dell'immagine

(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
Bello. d=documentti farebbe risparmiare qualche altro. (Inoltre, c'è un motivo per creare la tela? Codegolf assume un certo livello di HTML disponibile?)
Matthew Wilcoxson

1
È possibile scrivere document.createElement`canvas` e salvare 2 byte. Come il getContext`2d` .
Ismael Miguel,

Non ho assunto una tela HTML in quanto questa è una soluzione JavaScript pura.
MT0

oppure puoi "lasciar cadere" la tela come qui
Kamil Kiełczewski il

19

J, 73 byte

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

set mandelbrot

Modifica , alcuni spiegando:

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 ma sarebbe possibile per te spiegare un po 'come funziona quel codice? In particolare sono curioso di sapere come (dove nel codice) sceglie i colori?
plannapus,

1
@MarkJeronimus, riesco a fare 70 ma ho mantenuto alcune cose per chiarezza. Così, mi sono preso la libertà di ignorare l'LF quando conta.
Eelvex,

@plannapus, OK, ha aggiunto alcuni commenti. La selezione del colore viene eseguita con la (0,?$~99 3)quale produce triplette da 100 rgb, una per ogni livello. A causa della casualità, potresti ottenere meno di 100 terzine, quindi alcuni livelli avranno una transizione più regolare (ma hanno comunque colori diversi).
Eelvex,

17

Mathematica, 214 191 215 19 30

Dalla versione 10.0 è integrato: (19 byte)

MandelbrotSetPlot[]

mandelbrot


Per conformarsi ai requisiti dell'intervallo di coordinate, sono necessari 11 byte aggiuntivi. (30 byte)

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

m2


Una custodia arrotolata a mano:

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

verde


{b, -2, 2, .01}, {a, -2, 2, .01}è più breve e più vicino alle regole
Mark Jeronimus

@MarkJeronimus Grazie. Ho usato l'intervallo suggerito per l'immagine ripetuta.
DavidC

Hai avuto quasi ragione, quindi hai reso l'interno non nero. L'ultimo fotogramma nella GIF è nero all'interno e una risposta consentita. EDIT: e conto 195 byte.
Mark Jeronimus

Mi mancava il punto di essere nero. Il conteggio è aumentato perché alcuni singoli personaggi sono diventati due personaggi nel taglia e incolla in SE.
DavidC

La tua soluzione integrata utilizza un'interpretazione molto ampia di The fractal coordinates range from approximately -2-2i to 2+2i.
Jonathan Frech,

16

Python con Pylab + Numpy, 151 byte

Non potevo sopportare di vedere una voce Python non DQ, ma penso di essermi davvero superato di questo, e sono arrivato a 153 caratteri!

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

Inoltre, in particolare, la penultima riga genera 4 avvisi di runtime distinti, un nuovo record personale!

inserisci qui la descrizione dell'immagine


Conto 152. Non è richiesto spazio tra importe *, e non definire faffatto dovrebbe essere più breve, a meno che non abbia frainteso qualcosa, il che è possibile. Dovresti anche cambiarlo in modo tale che 0 iterazioni e 1 iterazioni siano distinte (attualmente sono entrambe grigie).
primo

Strano. Il wc include l'eof? Fisso e leggermente più piccolo. Solo un momento.
meawoppl

Ottengo 151 con wc. Primo golf, quindi non so come segnarlo.
meawoppl

Conto 150, senza trascinare newline. Alcuni interpreti / compilatori ne richiedono uno, ma l'interprete Python va bene senza. Non sono sicuro wc, ma forse prova stat -c %sinvece. I bordi superiore e inferiore neri fanno parte dell'immagine?
primo

1
Puoi salvare 1 carattere usando from numpy import*invece di import numpy as ne mgridinvece di n.mgrid.
nyuszika7h,

15

C + Allegro 4.2.2 - 248 byte

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

Produzione:

MSet 1


Dovresti dire che questo è Allegro 4 (che è abbastanza diverso da Allegro 5). Quale versione esatta è questa?
Victor Stafusa,

è lungo 246 o 249
Mark Jeronimus

@Victor Allegro 4.2.2.
Oberon,

1
@MarkJeronimus Non dovrebbe esserci una nuova riga tra ... allegro.h>e x=-1, ...? Suppongo che Notepad ++ lo conti come \r\n= 0D 0A.
Oberon,

1
Penso che 0.01possa essere digitato come .01.
Yytsi,

14

Windows PowerShell (v4), 299 byte

Foto frattale di Mandelbrot

# Linewrapped here for show:

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


# The single line 299 char entry version:

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

Istruzioni

  • Esegui una normale console PowerShell (ISE potrebbe non funzionare)
  • Copia / incolla il codice, premi Invio
  • Aspetta: l'esecuzione richiede almeno un minuto
  • L'unico modo per uscire è chiudere la console

Commento

  • C'è un po 'di test delle regole in corso con i colori all'interno del set; le regole dicono "Gli altri pixel (presumibilmente all'interno del set di Mandelbrot) devono essere colorati in bianco o nero" ; il codice colora i pixel RGB completamente nero (0,0,0) ... sembra essere un RGBA nero trasparente (0,0,0,0). Quindi ciò che appare è il colore di sfondo del modulo dell'attuale tema di Windows, un RGB leggermente bianco sporco (240.240.240) in questo caso.

Vorrei cambiare lt2per lt4renderlo un "set di mandelbrot" invece dell'immagine che hai ora, molti punti del set sono inghiottiti dalle bande di colore.
Mark Jeronimus,

Apparentemente Magnitudo a*a+b*bnon lo èsqrt(a*a+b*b)
Mark Jeronimus,

Pensavo di averlo provato prima, ma sono andato alla ricerca di una risposta a "dov'è finita la linea orizzontale a sinistra?", E dopo un po 'l'ho trovata esattamente dove hai detto -lt4. Il che è buono, grazie. Ho aggiornato la mia risposta con il codice corretto e l'immagine. (Dovrò ripensare alla mia comprensione di ciò che sta facendo, poiché mi manca qualcosa).
TessellatingHeckler,

14

Python + PIL , 166 byte

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

Output (si aprirà nel visualizzatore * .bmp predefinito):


1
Puoi radere 3 se ti sbarazzi del yciclo. r=range(d*d), utilizzare x/de x%dper xey.
Geobits

@Geobits l'idea ha effettivamente salvato 10, grazie!
primo

1
I tipi complessi possono essere inizializzati come: c = 1 + 2j, che penso ti salverebbe un paio di caratteri con: z = o = x / 9e4-2 + (x% d / 150.-2) * 1j; c = 99
meawoppl

@meawoppl altro 7: D
primo

Tecnicamente non consentito: non ha alcuna caratteristica grafica di output di Python stesso (e Image.show()salva implicitamente un file temporaneo).
nneonneo,

12

BBC Basic (228 byte)

Che dire delle lingue di cui nessuno ha mai sentito parlare nel code golf? Molto probabilmente potrebbe essere ottimizzato, ma non sono proprio dove - possibili miglioramenti. Basato su http://rosettacode.org/wiki/Mandelbrot_set#BBC_BASIC , ma ho cercato di codificarlo il più possibile.

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

Il set di Mandelbrot generato

Il >simbolo sull'immagine è rapido ed è generato automaticamente dopo aver eseguito il programma.


Non c'è bisogno di tracciare due volte, basta andare con una versione più inefficiente. Non supporta NEXT Y,X?
Mark Jeronimus,

10

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

Questo è per Dyalog APL con ⎕IO ⎕ML←1 3

La maggior parte dello spazio è occupato dalle chiamate API per mostrare una bitmap in una finestra (righe 2, 3, 4)
Se fosse presente un collegamento per farlo, il codice sarebbe fino a 60 caratteri (riga 1)

AIUTO PLZ TROVA SHORTCUT KTHX

Versione non golfata (solo riga 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    

Immagine dello schermo:

(La versione freeware funziona su OS X con Wine. Sì, sono così economica.)

immagine dello schermo

*: Dyalog ha il suo set di caratteri a byte singolo, con i simboli APL associati ai valori superiori di 128 byte, quindi l'intero codice può essere memorizzato in 194 byte. Ogni affermazione in questa nota è probabilmente vera. Mantieni la calma e continua a giocare a golf.


10

Mathematica 10.0, 19 caratteri

MandelbrotSetPlot[]

MandelbrotSetPlot è una nuova funzione in Mathematica 10.0.

inserisci qui la descrizione dell'immagine


È molto comodo che questa funzione integrata soddisfi tutti i miei requisiti (tranne la posizione, che può essere impostata con altri 13 caratteri). Solo che questa è una scappatoia standard.
Mark Jeronimus,

20
Il golf di codice è generalmente vinto da linguaggi specializzati con token a carattere singolo o da sistemi come Mathematica che hanno un numero enorme di funzioni speciali integrate. Usarli non è barare, non più che usare comandi a carattere singolo sarebbe in APL.
Michael Stern,

9

R, 199 211 caratteri

Vecchia soluzione a 199 caratteri:

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)

Con rientro:

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)

inserisci qui la descrizione dell'immagine

Modifica: soluzione a 211 caratteri che colora diversamente l'interno del set e l'esterno del primo livello:

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)

Con rientro:

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)

inserisci qui la descrizione dell'immagine


tecnicamente il nero all'esterno è vietato. Ti sei perso o è difficile da implementare?
Mark Jeronimus

@MarkJeronimus entrambi in realtà :) Cercherò di dare un'occhiata a come farlo, ma non sono sicuro al 100% che troverò un modo per farlo in modo pulito.
plannapus,

@MarkJeronimus Done!
plannapus,

5
Secondo posto nella terribile divisione dei colori.
meawoppl

1
@meawoppl blame rainbow():)
plannapus

9

Java - Elaborazione (271 byte)

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

Allargato:

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


Oh, maaaaan, volevo farlo. +1 .
SIGSTACKFAULT,

8

TI-80 BASIC, 125 106 byte

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

Basato sulla risposta di Digital Trauma. inserisci qui la descrizione dell'immagine


6

GLSL - 225 byte:

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

Definizione delle variabili nel codice (242 byte):

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

Guardalo in ShaderToy

Mandelbrot Golf

Ciò richiede che sia caricata una trama della palette adatta come iChannel0. (La colorazione qui deriva dalla trama "pixel casuale" su ShaderToy).


Anche le dichiarazioni delle variabili devono essere conteggiate, a meno che non possano essere generate automaticamente dal codice. (la combinazione di colori va bene se è disponibile solo come impostazione esterna)
Mark Jeronimus

@MarkJeronimus: per l'ambiente ShaderToy, queste variabili sono fisse. Altrimenti, per gli shader standard, avrei scelto nomi di variabili più brevi.
nneonneo,

È il più veloce di tutti?
Demi

6

Ottava ( 212136 byte)

(Ora includendo alcune idee dovute a @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])

Con spazi bianchi:

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

Produzione:

Mandelbrot passa agli addominali (z)> 2

Per convertire in Matlab, cambia " m+=abs(z)<2" in " m=m+(abs(z)<2)". [+3 byte]

Per rendere le proporzioni 1: 1, aggiungi " ;axis image". [+11 byte]

La mia prima risposta (212 byte):

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

Probabilmente c'è un modo più breve per ottenere una mappa dei colori discontinua ....
veloce l'

Sì, molto meglio ora.
aschepler

+1 soluzione simpatica e concisa. Ma le proporzioni non sono 1: 1 (cfr. Regola n ° 2: l'output deve essere quadrato).
plannapus,

La correzione delle proporzioni richiederà altri 11 byte: aggiungi " ;axis image". È necessario per qualificarsi?
aschepler

penso che sia stato solo un pignolo :), l'OP non sembra avere problemi dal momento che non ha detto nulla.
plannapus,

6

Applesoft BASIC, 302 286 280 byte

Questo seleziona punti casuali da disegnare, quindi funzionerà per sempre e potrebbe non riempire mai l'intero piano.

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

Si scopre che Applesoft BASIC perdona davvero la mancanza di spazi. È necessario solo uno spazio nell'intero programma.

Uscita dopo 14 ore:

        produzione

GIF:

        gif

Prima di giocare a golf:

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

Nota: POKE 49234,0(in Applesoft BASIC) mette la macchina in modalità grafica completa.

Una versione ottimizzata per i display B&W:

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

Uscita dopo 12 ore:

        b & w

Una versione che funzionerà in 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

Sarebbe più piccolo (e più lento) se non hai tracciato due pixel contemporaneamente ma hai scelto un pixel casuale sull'intero schermo.
Mark Jeronimus,

1
@MarkJeronimus È già così lento che la versione a colori non è ancora terminata, dopo averlo pubblicato 5 giorni fa. Non credo di potermi permettere di essere più lento: P
MD XF

5

gnuplot 110 (105 senza newline)

Iscrizione obbligatoria allo gnuplot. È stato fatto innumerevoli volte, ma questo è da zero (non che sia difficile). Mi piace come il gnuplotgolf comandi intrinsecamente :)

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

Tuttavia, sono profondamente deluso dall'immissione di numeri complessi. x*{1,0}+y*{0,1}deve essere il modo più triste esistente di costruire un numero complesso.

Oops, l'immagine: gnuplot mandelbrot

Impostare isosample più in alto per una migliore risoluzione. Potremmo anche dire unset ticse unset colorboxper un'immagine pura, ma penso che questa versione sia valida.


Scommetti che è copia / pasta dal primo hit di Google "Gnuplot Mandel". Per cominciare, *{1,0}è unità ed è più simile a un modo di dire bowling *1, e probabilmente può essere abbandonato. (non testato)
Mark Jeronimus

1
No, non è un copia-incolla. È una formula molto semplice e non era nemmeno necessario cercarla. Tuttavia, ho trovato le pagine che ottieni con quella ricerca quando stavo cercando un modo migliore di inizializzare numeri complessi (la loro implementazione è diversa, beh, così diversa come può essere in questo caso). Grazie per il suggerimento sulla parte reale, funziona. Fissaggio.
Orione,

5

Matlab (89 byte)

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

Produzione -

inserisci qui la descrizione dell'immagine

Non soddisfa il requisito secondo cui le celle interne devono essere bianche o nere, ma ciò può essere soddisfatto utilizzando (1) utilizzando imshow(K)invece di imagesc(K)(richiede 1 byte in meno ma necessita della casella degli strumenti di elaborazione delle immagini) o (2) aggiungendo colormap hot(richiede altre 12 byte).

Versione Ungolfed -

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)

L'uso di una libreria va bene se è impacchettato in Matlab per impostazione predefinita e qualsiasi utente può indovinare che viene utilizzato dal codice o dai messaggi di errore.
Mark Jeronimus,

Bene, mi hai battuto. Mi piace al C-Cposto del mio 0*e(401). Inoltre, non stai usando N. E possiamo accorciarci un po 'usando la mia m+=abs(z)<2idea al posto della tua K(~K&abs(Z)>2)=j.
aschepler

Il valore di default colormap jete colormap hotsono entrambi errati anche se - hanno solo 64 colori distinti. colormap(hot(101))non mi sembra visivamente distinguibile. colormap([0,0,0;jet(100)])è forse accettabile ma incerto.
aschepler

Funziona? On Octave, K=K+abs(Z)<2significa K=((K+abs(Z))<2). (Quindi mi sbagliavo sulla stima a un byte da eliminare +=.)
veloce

2
Il set Mandelbrot ruotato di 90 gradi è ancora il set Mandelbrot.
Chris Taylor,

4

JavaScript + HTML5 (356B)

(Nota: le righe che terminano con '//' vengono aggiunte qui per una certa leggibilità)

Versione performante (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>

Versione lenta (356B): rimuovere 'var' e parametri nella funzione interna in modo che venga utilizzato l'ambito globale.

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

inserisci qui la descrizione dell'immagine


Scusami se non capisco le tue istruzioni su come realizzare la versione breve.
Mark Jeronimus,

Nessun problema. Rimuovi var w,all'inizio e cambia function(x,i,j,k,l,c,o)in function().
ɲeuroburɳ

4

Javascript, 285B

Sulla base del mio codice e di alcuni miglioramenti sul codice di MT0 , ho ottenuto questo colore fino a 285 B:

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 azione: http://jsfiddle.net/acLhe/7/

era: 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 dovrebbe essere leggibile: - / vederlo in azione: http://jsfiddle.net/acLhe/6/

Mandelbrot Coffeescript


OP richiede il colore a meno che la tua piattaforma non supporti il ​​colore. Sembra fantastico, comunque, e un bel codice conciso. Benvenuti in PPCG!
Jonathan Van Matre,

Comincio da questa dimensione 285B e la perfeziono maggiormente in questa risposta
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

Tavolozza DOS standard:

inserisci qui la descrizione dell'immagine


4

Tcl / Tk, 316

322 324 336 348 349 351 352 353 354 355

Ora una versione più corta che utilizza le terzine di colore in stile shorthands a 3 lettere #RGB (anziché le terzine #RRGGBB), che si traduce in colori diversi.

E ancora un po 'di 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

frattale


Tcl / Tk, 325

331 333 345 357 358 360 361 362 364 365

Penso che vincerei se il criterio fosse bellezza!

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

Presentazione:

frattale


1
Bello. È possibile ridurre alcuni caratteri (fino a 380, credo) aggiungendo rename set sin alto e quindi sostituendo tutti setcons
Rolazaro Azeveires

4

Excel VBA, 251 246 224 223 221 byte

Risparmiato 5 byte grazie a ceilingcat Risparmiato 23 byte grazie a 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

Produzione:

Uscita con D = 99

Ho realizzato una versione che lo ha fatto molto tempo fa, ma aveva molti extra come consentire all'utente di scegliere il colore di base e una matematica facile da seguire. Giocare a golf fino in fondo è stata una sfida interessante. Il Colormetodo utilizza 1E6come mezzo per ottenere una vasta gamma di colori in quanto i colori validi sono 0a 2^24. Impostandolo su ha 10^6dato belle aree di contrasto.

Spiegazione / Formattazione automatica:

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

Ho anche giocato con D=999e j=1 to 998per ottenere un'immagine molto più grande e più precisa. I risultati sono irrilevanti per la sfida perché sono troppo grandi ma sono ordinati.

D = 999


@ceilingcat Grazie. Era un riporto dal mio originale che aveva funzioni specializzate per la matematica dei numeri complessi.
Ingegnere Toast,

Deve davvero essere> = 4 o puoi cavartela con> 4? Inoltre, può sostituire j<99con j<D.
ceilingcat,

@EngineerToast si può cadere il ()dal nome sub, si dovrebbe cambiare (j<99)per (j<d)e si può, al fine di rendere celle quadrate utilizzano solo Cells.RowHeight=48al posto del Cells.RowHeight=9, Cells.ColumnWidth=1- questo non fa fare in giro con la tua uscita più difficile, ma è stato accettato come valido dalla comunità -
Taylor Scott,

1
@TaylorScott Ricordo il RowHeighttrucco dal post dei suggerimenti di VBA e avevo pensato di integrarlo dopo aver ottenuto tutte le mie belle foto. Era un bel pezzo, grazie, grazie.
Ingegnere Toast,

Credo che si possa cavarsela rimuovendo un altro byte scambiando 2^20con1E6
Taylor Scott l'

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

Frattale di Mandelbrot di Perl + GD

Golfato da questo codice


2
Nominato: combinazione di colori più brutta.
meawoppl

3

Floater, 620 pixel

Un linguaggio che ho inventato quando mi sono ispirato alla mia sfida, oltre che al linguaggio esoterico Piet.

inserisci qui la descrizione dell'immagine


2
Link a una lingua e descrizione del codice? O effettivamente, qual è il codice?
MD XF,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.