Imagen de Mandelbrot en todos los idiomas.

91

Siempre usé una imagen de Mandelbrot como la versión 'gráfica' de Hello World en cualquier aplicación gráfica que tuviera en mis manos. Ahora es el turno de tus muchachos.

  • El lenguaje debe ser capaz de generar gráficos o dibujar gráficos (guardar archivos no permitidos)
  • Renderiza una imagen cuadrada o un gráfico. El tamaño de al menos 128 y como máximo 640 de ancho *
  • Las coordenadas fractales varían de aproximadamente -2-2i a 2 + 2i
  • Los píxeles fuera del conjunto de Mandelbrot deben colorearse de acuerdo con el número de iteraciones antes de que la magnitud exceda de 2 (excluyendo * blanco y negro)
  • Cada recuento de iteraciones debe tener un color único *, y los colores vecinos deben ser fácilmente distinguibles por el ojo
  • Los otros píxeles (presumiblemente dentro del conjunto Mandelbrot) deben ser de color negro o blanco.
  • Al menos 99 iteraciones
  • Arte ASCII no permitido

* a menos que esté limitado por la plataforma, por ejemplo , calculadora gráfica

Permitido:
Permitido
No permitido:
No permitido
(imágenes reducidas)

Condiciones ganadoras:

La versión más corta (tamaño en bytes) para cada idioma recibirá una mención en esta publicación, ordenada por tamaño.
Ninguna respuesta será 'aceptada' con el botón.

Tabla de clasificación:

Mark Jeronimus
fuente
8
"Fácilmente distinguible por el ojo" es difícil de hacer objetivo. ... Además, aparte de su asociación personal de los dos, el conjunto de Mandelbrot no tiene nada que ver con Hello World, por lo que es mejor omitir eso del título a menos que esté buscando deliberadamente los motores de búsqueda.
Jonathan Van Matre
1
Relacionado: ASCII Mandelbrot (aunque algunas de las respuestas publicadas allí no son ASCII y probablemente podrían encajar mejor como respuestas a esta pregunta).
Peter Taylor
3
He visto algunas personas que ahora mencionan que representan el Mandelbrot como un "Hola Mundo". Lo he hecho también, por algo así como 30 años. El Mandelbrot es el "Hello World" perfecto, ya que muestra que tiene acceso de píxeles a la pantalla y ofrece una buena sensación de rendimiento en la nueva plataforma.
Roger Dahl
66
Es una gran idea hacer una pregunta que requiera una combinación de sensibilidades matemáticas y estéticas, luego imponer todas las decisiones de diseño por adelantado.
jwg
3
Cualquiera se las arregla para hacer uno en brainfuck WINS, yo diría: D
MadTux

Respuestas:

94

Calculadora gráfica Sharp EL-9300, 296 bytes

¡Esta era mi calculadora gráfica de secundaria , que funcionaba hace 20 años! Recuerdo haber escrito un generador de Mandelbrot para ese entonces. Y efectivamente, todavía está ahí en la 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

Tardó unos 90 minutos en renderizar.

Esto no tiene nada de golf. Estoy seguro de que podría ahorrar un poco de espacio, ¡pero solo quería compartir esta curiosidad histórica!

Me encanta que las únicas declaraciones de control disponibles son gotos.

Aquí hay una foto. No tengo ningún otro medio para obtener la salida gráfica: ingrese la descripción de la imagen aquí

Trauma digital
fuente
1
Yo también, pero mi memoria NV se quedó en blanco después de años de tiempo de almacenamiento.
Mark Jeronimus
2
zx²+zy²>4no podría ser eso Abs(x)>2?
Mark Jeronimus
1
Tal vez deberías comprar una batería nueva ...
Nada imposible el
25
Interesante. Así que has sido un nerd durante bastante tiempo.
devnull
44
Bonita "
captura de
83

Me encontré con esto el otro día. No me tomo el crédito por eso, pero maldición, es increíble:

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

ingrese la descripción de la imagen aquí http://preshing.com/20110926/high-resolution-mandelbrot-in-obfuscated-python/

ɐɔıʇǝɥʇuʎs
fuente
12
Parece que no se permite: las regiones no se distinguen fácilmente, ni siquiera se distinguen.
primo
55
Además, esto escribe en un archivo.
Mentira Ryan
40
no permitido o no, esto es bastante impresionante: D
Navin
18
@DigitalTrauma, diablos, +1 para la entrada más bella!
Brian S
19
¿Cuenta esto como una 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

Resultado 129x129 (129 × 129)

La imagen PDF consta de unidades cuadradas de color con un tamaño de 1 pb × 1 pb.

Sin golf

% 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
fuente
36

86 Asamblea DOS, 208 177 173 bytes

El binario completo, en HEX, que creé a mano, es:

DBE3BE00A0B81300CD1056BA640007BF87F9FDBDC7008BCDE81A008AC3AA4979F7B9C70083EF784D79EE33C0CD16B80300CD10CD208BC12BC289441CDF441CDF06A701DEF9D95C088BC52BC289441CDF441CDF06A701DEF9D95C0CD9EED914D95404D95410D95C14B301D904D84C04DE0EA901D8440CD95404D94410D86414D84408D914D80CD95C10D84C04D95414D84410DF06AB01DED99BDFE09B9E7207433ADA72C632DBC3320002000400

La imagen de muestra es:

Captura de pantalla de Mandlebrot con negro recortado

La fuente completa en ASM legible es bastante larga (usé esto para descubrir cómo estaba codificando este tonto):

.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

Está diseñado para compilar con TASM, se ejecuta en MCGA y espera que se presione una tecla antes de finalizar el programa. Los colores son solo la paleta MCGA predeterminada.

EDITAR: ¡Lo optimicé, ahora dibuja hacia atrás (misma imagen) y ahorró 31 bytes!

EDIT 2: para calmar el OP, he recreado el binario a mano. Al hacerlo, también eliminé otros 4 bytes. Documenté cada paso del proceso, mostrando todo mi trabajo para que cualquiera pueda seguirlo si realmente lo desea, aquí (advertencia, es aburrido y muy largo): http://lightning.memso.com/media/perm/ mandelbrot2.txt

Usé un par de expresiones regulares en EditPadPro, para encontrar todas las ; Final: ...entradas en el archivo y volcarlas como binario hexadecimal en un archivo .com. El binario resultante es lo que ves en la parte superior de esta publicación.

Mark Ormston
fuente
1
El código de máquina no cuenta. Si eso cuenta, entonces cualquier lenguaje que produzca código de bytes o código de máquina debería ser más corto. Cuento 820 después de cambiar todo a nombres largos de 1 carácter.
Mark Jeronimus
3
Podría codificar todo en binario si te resulta más fácil, pero eso sería como pedirle a alguien que use un lenguaje de alto nivel que evite el uso de construcciones automáticas, macros, etc. Eso es TODO ese ensamblaje realmente es, solo un montón de macros El binario resultante para ejecutar un JavaScript completo, Perl, etc. incluye el binario de la biblioteca. Con ASM, el valor hexadecimal final es todo, bibliotecas, TODO CÓDIGO, incluido.
Mark Ormston
55
No. Puedo convertir ASM a binario a mano si es realmente necesario. Saldrá con exactamente los mismos 177 bytes con los que ayudó mi ensamblador. Cualquiera con un editor binario puede pegar el código resultante en un nuevo archivo, guardado, 177 bytes, y funcionará como se espera. Aparentemente, SO está dividido en los envíos de ASM, por lo que tal vez debería aclarar si considera que no cuenta: meta.codegolf.stackexchange.com/questions/260/…
Mark Ormston
66
Muy bien, entonces, para probar que esta es una entrada válida, pasé el tiempo necesario para traducir esto a binario. He actualizado mi respuesta en consecuencia.
Mark Ormston
77
El caso es que no hay compilador con ensamblaje. Solo usas macros. Decir que no cuenta es como decir que no puede usar ninguna #definedeclaración predefinida en C. Solo lleva mucho tiempo reemplazarlo manualmente.
Mark Ormston
28

Java, 505 405 324 bytes

Solo un cálculo estándar, con golfitude ahora con golfitude adicional.

ingrese la descripción de la imagen aquí

Golfizado:

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 saltos de línea:

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
fuente
f.setSize(n,668);- depende en gran medida del tema utilizado, pero lo aceptaré.
Mark Jeronimus
Puede eliminar las importaciones en Java porque de todos modos se generan automáticamente.
Mark Jeronimus
También veo doubledónde floatpodría usarse si lo intentaras
Mark Jeronimus
JFrame=> Frameafeita 2 caracteres. Aunque ya no puedes cerrar la ventana. ;)
EthanB
2
Tu clase no necesita ser pública. Además, use Java 8 para deshacerse del finalmodificador. Y no debe omitir las importaciones para ser una presentación completa.
Victor Stafusa
21

JavaScript (ECMAScript 6) - 315 308 Caracteres

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)

Salida predeterminada

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

  • Cambie npara variar el tamaño de la imagen (y el número de iteraciones).
  • Cambie los valores pasados ​​en las f(87);f(0);f(0);llamadas (cerca del final) para cambiar los valores de color RGB. ( f(8);f(8);f(8);es en escala de grises)

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

ingrese la descripción de la imagen aquí

(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
fuente
2
Agradable. d=documentte ahorraría unos cuantos más. (Además, ¿hay alguna razón para crear el lienzo? ¿Codegolf supone un cierto nivel de HTML disponible?)
Matthew Wilcoxson
1
Puede escribir document.createElement`canvas` y guardar 2 bytes. Igual que el getContext`2d` .
Ismael Miguel
No asumí un lienzo HTML, ya que es una solución pura de JavaScript.
MT0
o puedes 'soltar' lienzos como aquí
Kamil Kiełczewski
19

J 73 bytes

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

conjunto mandelbrot

Editar , algunos explicando:

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
fuente
1
+1 pero, ¿sería posible explicar un poco cómo funciona ese código? En particular, tengo curiosidad por saber cómo (¿en qué parte del código) elige los colores?
plannapus
1
@ MarkJeronimus, puedo alcanzar los 70 pero mantuve algunas cosas para mayor claridad. Yo, por lo tanto, me tomé la libertad de ignorar el LF al contar.
Eelvex
@plannapus, OK, agregó algunos comentarios. La selección de color se realiza con lo (0,?$~99 3)que produce 100 tripletes rgb, uno para cada nivel. Debido a la aleatoriedad, es posible que obtenga menos de 100 trillizos, por lo que algunos niveles tendrán una transición más suave (pero aún tendrán diferentes colores).
Eelvex
17

Mathematica, 214 191 215 19 30

Desde la versión 10.0 hay un incorporado: (19 bytes)

MandelbrotSetPlot[]

Mandelbrot


Para cumplir con los requisitos del rango de coordenadas, se requieren 11 bytes adicionales. (30 bytes)

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

m2


Una caja enrollada 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

DavidC
fuente
{b, -2, 2, .01}, {a, -2, 2, .01}es más corto y más cercano a las reglas
Mark Jeronimus
@ MarkJeronimus Gracias. Usé el rango sugerido para la imagen iterativa.
DavidC
Lo tenías casi bien, luego hiciste el interior no negro. El último cuadro en el GIF es negro por dentro y una respuesta permitida. EDITAR: y cuento 195 bytes.
Mark Jeronimus
Perdí el punto de ser negro. El recuento aumentó porque algunos caracteres individuales se convirtieron en dos caracteres en cortar y pegar en SE.
DavidC
Su solución integrada utiliza una interpretación muy flexible de The fractal coordinates range from approximately -2-2i to 2+2i.
Jonathan Frech
16

Python con Pylab + Numpy, 151 bytes

No podía soportar ver una entrada de Python sin DQ, pero creo que realmente me superé en esta, ¡y logré llegar a 153 caracteres!

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

Además, notablemente, la penúltima línea genera 4 advertencias de tiempo de ejecución distintas, ¡un nuevo récord personal!

ingrese la descripción de la imagen aquí

meawoppl
fuente
Cuento 152. No se requiere espacio entre importy *, y no definir fnada debería ser más corto, a menos que haya entendido mal algo, lo cual es posible. También debe cambiarlo de manera tal que 0 iteraciones y 1 iteraciones estén diferenciadas (actualmente ambas son grises).
primo
Extraño. ¿Incluye wc el eof? Fijo y ligeramente más pequeño. Sólo un momento.
meawoppl
Tengo 151 con wc. Primero golf, así que no estoy seguro de cómo marcarlo.
meawoppl
Cuento 150, sin seguir la nueva línea. Algunos intérpretes / compiladores exigen uno, pero el intérprete de Python funciona bien sin él. No estoy seguro wc, pero tal vez intente en su stat -c %slugar. ¿Los bordes negros superior e inferior son parte de la imagen?
primo
1
Puede guardar 1 carácter utilizando en from numpy import*lugar de import numpy as ny en mgridlugar de 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()

Salida:

MSet 1

Oberon
fuente
Debe mencionar que se trata de Allegro 4 (que es bastante diferente de Allegro 5). ¿Qué versión exacta es esta?
Victor Stafusa
tiene 246 o 249 de largo
Mark Jeronimus
@Victor Allegro 4.2.2.
Oberon
1
@MarkJeronimus ¿No se supone que hay una nueva línea entre ... allegro.h>y x=-1, ...? Supongo que Notepad ++ lo cuenta como \r\n= 0D 0A.
Oberon
1
Creo que 0.01se puede escribir como .01.
Yytsi
14

Windows PowerShell (v4), 299 bytes

Imagen fractal de 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()

Instrucciones

  • Ejecute una consola PowerShell normal (ISE podría no funcionar)
  • Copie / pegue el código, presione Entrar
  • Espera: tarda un minuto o más en ejecutarse
  • La única forma de salir es cerrar la consola.

Comentario

  • Hay una pequeña prueba de reglas en curso con los colores dentro del conjunto; las reglas dicen "Los otros píxeles (presumiblemente en el interior del conjunto de Mandelbrot) debe ser de color blanco o negro '" ; el código está coloreando los píxeles completamente negro RGB (0,0,0) ... resulta ser un RGBA negro transparente (0,0,0,0). Entonces, lo que aparece es el color de fondo del formulario del tema actual de Windows, un RGB ligeramente blanquecino (240,240,240) en este caso.
TessellatingHeckler
fuente
Me gustaría cambiarlo lt2para lt4que sea un "conjunto de mandelbrot" en lugar de la imagen que tienes ahora. Muchos puntos del conjunto son absorbidos por las bandas de color.
Mark Jeronimus
Al parecer magnitud es a*a+b*bnosqrt(a*a+b*b)
Marcos Jeronimus
Pensé que he probado antes, pero me fui en busca de una respuesta a "¿dónde está la línea horizontal de la izquierda ha ido?", Y después de un poco, me encontré exactamente donde usted ha dicho, -lt4. Lo cual es bueno, gracias. He actualizado mi respuesta con código corregido e imagen. (Habrá que replantear mi comprensión de lo que está haciendo, ya que me falta algo).
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()

Salida (se abrirá en el visor * .bmp predeterminado):

primo
fuente
1
Puede eliminar 3 si se deshace del ybucle. r=range(d*d), use x/dy x%dpara x e y.
Geobits
@Geobits la idea realmente ahorró 10, ¡gracias!
primo
1
Los tipos complejos se pueden inicializar como: c = 1 + 2j, que creo que le ahorraría un par de caracteres con: z = o = x / 9e4-2 + (x% d / 150.-2) * 1j; c = 99
meawoppl
@meawoppl otro 7: D
primo
Técnicamente no permitido: esto no tiene ninguna función de salida gráfica de Python (y Image.show()guarda implícitamente un archivo temporal).
nneonneo
12

BBC Basic (228 bytes)

¿Qué pasa con los idiomas que nadie escuchó en el golf de código? Lo más probable es que pueda optimizarse, pero aún no sé dónde: posibles mejoras. Basado en http://rosettacode.org/wiki/Mandelbrot_set#BBC_BASIC , pero intenté codificar el golf lo más posible.

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

El conjunto de Mandelbrot generado

El >símbolo en la imagen es rápido y se genera automáticamente después de ejecutar el programa.

Konrad Borowski
fuente
No es necesario trazar dos veces, solo ve con una versión más ineficiente. ¿No es compatible NEXT Y,X?
Mark Jeronimus
10

APL, 194 caracteres / bytes *

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

Esto es para Dyalog APL con ⎕IO ⎕ML←1 3

Las llamadas a la API ocupan la mayor parte del espacio para mostrar un mapa de bits en una ventana (líneas 2, 3, 4)
Si hubiera un acceso directo para hacerlo, el código se reduciría a 60 caracteres (línea 1)

PLZ AYUDA PARA ENCONTRAR SHORTCUT KTHX

Versión sin golf (solo línea 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    

Captura de pantalla:

(La versión gratuita se ejecuta en OS X con Wine. Sí, soy tan barato como eso).

captura de pantalla

*: Dyalog tiene su propio conjunto de caracteres de un solo byte, con los símbolos APL asignados a los valores superiores de 128 bytes, por lo que todo el código puede almacenarse en 194 bytes. Cada declaración en esta nota al pie es posiblemente cierta. Mantén la calma y sigue jugando al golf.

Tobia
fuente
10

Mathematica 10.0, 19 caracteres

MandelbrotSetPlot[]

MandelbrotSetPlot es una nueva función en Mathematica 10.0.

ingrese la descripción de la imagen aquí

alephalpha
fuente
Qué conveniente, que esta función integrada simplemente satisfaga todos mis requisitos (excepto la ubicación, que se puede configurar con 13 caracteres más). Excepto que esta es una escapatoria estándar.
Mark Jeronimus
20
El golf de código generalmente es ganado por lenguajes especializados con tokens de un solo carácter, o por sistemas como Mathematica que tienen una gran cantidad de funciones especiales incorporadas. Usarlos no es hacer trampa, más que usar comandos de un solo carácter estaría en APL.
Michael Stern
9

R, 199 211 caracteres

Antigua solución con 199 caracteres:

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 sangría:

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)

ingrese la descripción de la imagen aquí

Editar: Solución con 211 caracteres que colorea el interior del conjunto y el exterior de la primera capa de manera diferente:

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 sangría:

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)

ingrese la descripción de la imagen aquí

plannapus
fuente
técnicamente negro en el exterior no está permitido. ¿Te lo perdiste o es difícil de implementar?
Mark Jeronimus
@MarkJeronimus ambos en realidad :) Trataré de ver cómo hacerlo, pero no estoy 100% seguro de que encuentre la manera de hacerlo limpiamente.
plannapus
@MarkJeronimus Hecho!
plannapus
55
Segundo lugar en la horrible división de colores.
meawoppl
1
@meawoppl culpa rainbow():)
plannapus
9

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

Expandido:

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
fuente
Aw, maaaaan, quería hacer esto. +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

Basado en la respuesta de Digital Trauma. ingrese la descripción de la imagen aquí

12Me21
fuente
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);}

Definición de variables en el código (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);}

Véalo en ShaderToy

Mandelbrot Golf

Esto requiere que se cargue una textura de paleta adecuada como iChannel0. (El color aquí es de la textura de "píxel aleatorio" en ShaderToy).

nneonneo
fuente
Las declaraciones de variables también deben contarse, a menos que puedan generarse automáticamente a partir del código. (la combinación de colores está bien si solo está disponible como configuración externa)
Mark Jeronimus
@ MarkJeronimus: para el entorno ShaderToy, estas variables son fijas. De lo contrario, para sombreadores estándar, habría elegido nombres de variables más cortos.
nneonneo
¿Es este el más rápido de todos?
Demi el
6

Octava ( 212 136 bytes)

(Ahora incluye algunas ideas debido 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 espacios en blanco:

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

Salida:

Pasos de Mandelbrot a abs (z)> 2

Para convertir a Matlab, cambie " m+=abs(z)<2" a " m=m+(abs(z)<2)". [+3 bytes]

Para hacer la relación de aspecto 1: 1, agregue " ;axis image". [+11 bytes]

Mi primera respuesta (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
fuente
Probablemente haya una forma más corta de obtener un mapa de
colores
Sí, mucho mejor ahora.
Aschepler
+1 solución agradable y concisa. Pero su relación de aspecto no es 1: 1 (véase la regla n ° 2: la salida debe ser cuadrada).
plannapus
La fijación de la relación de aspecto tomará 11 bytes más: agregue " ;axis image". ¿Se requiere eso para calificar?
aschepler
Creo que era solo yo, quisquilloso :), el OP no parece tener un problema, ya que no dijo nada.
plannapus
6

Applesoft BASIC, 302 286 280 bytes

Esto selecciona puntos aleatorios para dibujar, por lo que se ejecutará para siempre y es posible que nunca llene el plano completo.

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

Resulta que Applesoft BASIC realmente perdona la falta de espacios. Solo se necesita un espacio en todo el programa.

Salida después de 14 horas:

        salida

GIF:

        gif

Antes de jugar al 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(en Applesoft BASIC) pone la máquina en modo gráfico completo.

Una versión optimizada para pantallas en blanco y negro:

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

Salida después de 12 horas:

        b & w

Una versión que funcionará en 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
MD XF
fuente
Sería más pequeño (y más lento) si no trazara dos píxeles a la vez, pero eligiera un píxel aleatorio en toda la pantalla.
Mark Jeronimus
1
@MarkJeronimus Ya es tan lento que la versión en color aún no ha terminado, después de publicar esto hace 5 días. No creo que pueda permitirme que sea más lento: P
MD XF
5

gnuplot 110 (105 sin líneas nuevas)

Entrada obligatoria a gnuplot. Se ha hecho innumerables veces, pero esta es desde cero (no es que sea difícil). Me gusta cómo gnuplotgolf sus comandos intrínsecamente :)

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

sin golf:

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

Sin embargo, estoy profundamente decepcionado por la entrada de números complejos. x*{1,0}+y*{0,1}debe ser la forma más triste de construir un número complejo.

Vaya, la imagen: gnuplot mandelbrot

Establecer isosamples más alto para una mejor resolución. También podríamos decir unset ticsy unset colorboxpara una imagen pura, pero creo que esta versión califica muy bien.

Orión
fuente
Apuesto a que es copia / pasta del primer hit de Google "gnuplot mandel". Para empezar, *{1,0}es la unidad y se parece más a una forma de decir de bolos de código *1, y probablemente se puede descartar. (no probado)
Mark Jeronimus
1
No, no es una copia y pega. Es una fórmula muy sencilla y ni siquiera era necesario buscarla. Sin embargo, encontré las páginas que obtienes con esa búsqueda cuando buscaba una mejor manera de inicializar números complejos (su implementación es diferente, bueno, tan diferente como puede ser en este caso). Gracias por el consejo sobre la parte real, funciona. Fijación.
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)

Salida -

ingrese la descripción de la imagen aquí

No satisface el requisito de que las celdas internas deben ser blancas o negras, pero eso puede satisfacerse (1) usando en imshow(K)lugar de imagesc(K)(requiere 1 byte menos pero necesita la caja de herramientas de procesamiento de imágenes) o (2) agregando colormap hot(requiere 12 más bytes).

Versión sin golf -

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
fuente
Usar una biblioteca está bien si está empaquetado en Matlab de manera predeterminada y cualquier usuario puede adivinar que se está utilizando desde el código o los mensajes de error.
Mark Jeronimus
Bien, me ganaste. Me gusta el C-Cen lugar de mi 0*e(401). Además, no estás usando N. Y podemos acortarnos un poco usando mi m+=abs(z)<2idea en lugar de la tuya K(~K&abs(Z)>2)=j.
aschepler
Sin embargo, los valores predeterminados colormap jety colormap hotambos son incorrectos: solo tienen 64 colores distintos. colormap(hot(101))No me parece visualmente distinguible. colormap([0,0,0;jet(100)])es quizás aceptable pero dudoso.
aschepler
¿Eso funciona? En Octave, K=K+abs(Z)<2significa K=((K+abs(Z))<2). (Así que estaba equivocado acerca de la estimación de un byte para eliminar +=)
Aschepler
2
El conjunto de Mandelbrot girado 90 grados sigue siendo el conjunto de Mandelbrot.
Chris Taylor
4

JavaScript + HTML5 (356B)

(Nota: las líneas que terminan con '//' se agregan aquí para facilitar la lectura)

Versión de rendimiento (375B):

<body onload='var
w,h=w=C.width=C.height=500,X=C.getContext("2d"),I=X.createImageData(w,h),D=I.data, //
y=0,f=255,T=setInterval(function(x,i,j,k,l,c,o){for(x=0;x<w;){                     //
for(i=x*4/w-2,j=y*4/h-2,k=l=0,c=f;--c&&k*k+l*l<4;)t=k*k-l*l+i,l=2*k*l+j,k=t
D[o=(y*w+x++)*4]=(c*=0xc0ffeeee)&f
D[++o]=c>>8&f
D[++o]=c>>16&f
D[++o]=f}X.putImageData(I,0,0)
++y-h||clearInterval(T)},0)'><canvas id=C>

Versión lenta (356B): elimine la 'var' y los parámetros en la función interna para que se use el alcance global.

Pruébelo: http://jsfiddle.net/neuroburn/Bc8Rh/

ingrese la descripción de la imagen aquí

uroeuroburɳ
fuente
Perdóname si no entiendo tus instrucciones para hacer la versión corta.
Mark Jeronimus
No hay problema. Eliminar var w,al principio y cambiar function(x,i,j,k,l,c,o)a function().
uroeuroburɳ
4

Javascript, 285B

Basado en mi código y algunas mejoras en el código MT0 , lo he reducido a 285B en color:

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

en acción: 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

Se supone que Coffeescript es legible: - / verlo en acción: http://jsfiddle.net/acLhe/6/

Mandelbrot Coffeescript

alexander-brett
fuente
OP solicita color a menos que su plataforma no admita color. Sin embargo, se ve muy bien y es un buen código conciso. Bienvenido a PPCG!
Jonathan Van Matre
Partí de este tamaño 285B y lo mejoré más en esta respuesta
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

Paleta DOS estándar:

ingrese la descripción de la imagen aquí

Mark Jeronimus
fuente
4

Tcl / Tk, 316

322 324 336 348 349 351 352 353 354 355

Ahora, una versión más corta que usa trillizos de color de estilo de mano corta #RGB de 3 letras (en lugar de trillizos #RRGGBB), lo que da como resultado diferentes colores.

Y algo más de 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

fractal


Tcl / Tk, 325

331 333 345 357 358 360 361 362 364 365

¡Creo que ganaría si el criterio fuera la belleza!

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

Presentación:

fractal

sergiol
fuente
1
Agradable. Puede reducir algunos caracteres (hasta 380, creo) agregando rename set sen la parte superior y luego reemplazando todos setpors
Rolazaro Azeveires
4

Excel VBA, 251 246 224 223 221 bytes

Guardado 5 bytes gracias a ceilingcat Guardado 23 bytes gracias 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

Salida:

Salida con D = 99

Hice una versión que hizo esto hace mucho tiempo, pero tenía muchos extras, como permitir que el usuario elija el color básico y las matemáticas fáciles de seguir. Jugar al golf fue un desafío interesante. El Colormétodo utiliza 1E6como un medio para obtener una amplia gama de colores ya que los colores son válidos 0para 2^24. Establecerlo en 10^6áreas agradables de contraste.

Explicación / Formateo automático:

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

También jugué con D=999y j=1 to 998para obtener una imagen mucho más grande y más precisa. Los resultados son irrelevantes para el desafío porque son demasiado grandes pero están limpios.

D = 999

Tostadas de ingeniero
fuente
@ceilingcat Gracias. Esa fue una transferencia de mi original que tenía funciones especializadas para matemáticas de números complejos.
Engineer Toast
¿Realmente necesita ser> = 4 o puedes salirte con> 4? Además, puede reemplazar j<99con j<D.
ceilingcat
@EngineerToast puede soltar el ()nombre secundario, debe cambiarlo y puede (j<99)hacerlo (j<d), con el fin de hacer que las celdas cuadradas se usen solo Cells.RowHeight=48en lugar de Cells.RowHeight=9, Cells.ColumnWidth=1esto hace que sea más difícil jugar con su salida, pero ha sido aceptado como válido por la comunidad -
Taylor Scott
1
@TaylorScott Recuerdo el RowHeighttruco de la publicación de consejos de VBA y tenía la intención de integrarlo después de que obtuve todas mis fotos bonitas. Eso fue un buen trozo de bytes, gracias.
Engineer Toast
Creo que puede salirse con la supresión de otro byte intercambiando 2^20con1E6
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

Fractal de Mandelbrot de Perl + GD

Golfed de este código

multitud
fuente
2
Nominado: esquema de color más feo.
meawoppl
3

Flotador, 620 píxeles

Un lenguaje que inventé cuando me inspiré en mi propio desafío, así como en el lenguaje esotérico Piet.

ingrese la descripción de la imagen aquí

Mark Jeronimus
fuente
2
¿Enlace a un idioma y descripción del código? O en realidad, ¿cuál es el código?
MD XF