Imagem Mandelbrot em todos os idiomas


91

Eu sempre usei uma imagem de Mandelbrot como a versão 'gráfica' do Hello World em qualquer aplicativo gráfico em que consegui minhas mãos. Agora é a vez de vocês.

  • O idioma deve ser capaz de gerar gráficos ou desenhar gráficos (salvar arquivos não permitidos)
  • Renderize uma imagem ou gráfico quadrado. O tamanho de pelo menos 128 e 640 no máximo *
  • As coordenadas fractais variam de aproximadamente -2-2i a 2 + 2i
  • Os pixels fora do conjunto de Mandelbrot devem ser coloridos de acordo com o número de iterações antes que a magnitude exceda 2 (excluindo * preto e branco)
  • Cada contagem de iteração deve ter uma cor única *, e as cores vizinhas devem, de preferência, ser facilmente distinguíveis pelo olho
  • Os outros pixels (presumivelmente dentro do conjunto Mandelbrot) devem ser coloridos em preto ou branco
  • Pelo menos 99 iterações
  • Arte ASCII não permitida

* a menos que limitado pela plataforma, por exemplo , calculadora gráfica

Permitido:
Permitido
Não permitido:
Não permitido
(imagens reduzidas)

Condições vencedoras:

A versão mais curta (tamanho em bytes) para cada idioma receberá uma menção neste post, ordenada por tamanho.
Nenhuma resposta será 'aceita' com o botão.

Entre os melhores:


8
"Facilmente distinguido pelo olho" é difícil de ser objetivo. ... Além de sua associação pessoal dos dois, o conjunto de Mandelbrot não tem nada a ver com o Hello World, então é melhor omitir isso do título, a menos que você esteja deliberadamente vasculhando os mecanismos de pesquisa.
Jonathan Van Matre

1
Relacionado: ASCII Mandelbrot (embora algumas das respostas postadas não sejam ASCII e provavelmente possam se encaixar melhor como respostas a esta pergunta).
Peter Taylor

3
Eu já vi algumas pessoas mencionando que renderizam o Mandelbrot como um "Olá Mundo". Eu também fiz isso por cerca de 30 anos. O Mandelbrot é o "Hello World" perfeito, porque mostra que você tem acesso em pixels à tela e oferece uma boa sensação do desempenho vinculado à computação na nova plataforma.
Roger Dahl

6
É uma ótima idéia fazer uma pergunta que exija uma combinação de sensibilidades matemáticas e estéticas e, em seguida, imponha todas as decisões de design com antecedência.
GTC

3
Qualquer um consegue fazer um no WINS cerebral, eu diria: D
MadTux

Respostas:


94

Calculadora gráfica Sharp EL-9300, 296 bytes

Esta foi a minha calculadora gráfica da escola secundária, iniciada há 20 anos! Lembro-me de escrever um gerador de mandelbrot para ele na época. E com certeza, ele ainda está lá na memória 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

Demorou cerca de 90 minutos para renderizar.

Isso é totalmente não-destruído. Tenho certeza de que poderia economizar um pouco de espaço, mas só queria compartilhar essa curiosidade histórica!

Eu amo que as únicas declarações de controle disponíveis são gotos.

Aqui está uma foto. Não tenho outros meios para obter a saída gráfica: insira a descrição da imagem aqui


1
Eu também, mas minha memória NV ficou em branco após anos de prateleira.
Mark Jeronimus

2
zx²+zy²>4não poderia ser isso Abs(x)>2?
Mark Jeronimus

1
Talvez você deve obter uma nova bateria ...
NothingsImpossible

25
Interessante. Então você é um nerd há um bom tempo.
devnull

4
Nice "Screenshot"
meawoppl

83

Me deparei com isso outro dia. Eu não aceito crédito por isso, mas caramba, é incrível:

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

insira a descrição da imagem aqui http://preshing.com/20110926/high-resolution-mandelbrot-in-obfuscated-python/


12
Parece não ser permitido: as regiões não são facilmente distinguíveis, ou mesmo nem são.
Primo

5
Além disso, isso grava em um arquivo.
Lie Ryan

40
anulado ou não, isso é bastante impressionante: D
Navin

18
@DigitalTrauma, heck, +1 para a mais bela contribuição!
Brian S

19
Isso conta como uma solução? ;-)
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)

A imagem PDF consiste em unidades quadradas coloridas com tamanho 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

Montagem do DOS x86, 208 177 173 bytes

O binário completo, em HEX, que eu criei manualmente, é:

DBE3BE00A0B81300CD1056BA640007BF87F9FDBDC7008BCDE81A008AC3AA4979F7B9C70083EF784D79EE33C0CD16B80300CD10CD208BC12BC289441CDF441CDF06A701DEF9D95C088BC52BC289441CDF441CDF06A701DEF9D95C0CD9EED914D95404D95410D95C14B301D904D84C04DE0EA901D8440CD95404D94410D86414D84408D914D80CD95C10D84C04D95414D84410DF06AB01DED99BDFE09B9E7207433ADA72C632DBC3320002000400

A imagem de exemplo é:

Captura de tela Mandlebrot com preto cortado

A fonte completa no ASM legível é bastante longa (usei isso para descobrir como estava codificando esse otário):

.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

Ele foi projetado para compilar com o TASM, é executado no MCGA e aguarda um pressionamento de tecla antes de finalizar o programa. As cores são apenas a paleta padrão do MCGA.

EDIT: Otimizado, agora ele retrocede (mesma imagem) e salva 31 bytes!

EDIÇÃO 2: Para atenuar o OP, recriei o binário manualmente. Ao fazer isso, eu também raspei outros 4 bytes. Eu documentei cada etapa do processo, mostrando todo o meu trabalho para que qualquer pessoa possa acompanhar se realmente quiser, aqui (aviso, é chato e muito longo): http://lightning.memso.com/media/perm/ mandelbrot2.txt

Eu usei algumas regexs no EditPadPro, para encontrar todas as ; Final: ...entradas no arquivo e despejá-las como hexadecimais em um arquivo .com. O binário resultante é o que você vê na parte superior desta postagem.


1
O código da máquina não conta. Se isso conta, qualquer idioma que produza código de bytes ou código de máquina deve ser mais curto. Conto 820 depois de alterar tudo para nomes longos de 1 caractere.
21813 Mark Jeronimus

3
Eu poderia codificar a coisa toda em binário, se isso tornar mais fácil para você, mas seria como pedir a alguém que usa uma linguagem de alto nível para evitar o uso de construções automáticas, macros, etc. Isso é tudo o que o assembly realmente é, apenas um monte de macros. O binário resultante para executar um JavaScript completo, Perl etc. inclui o binário da biblioteca. Com o ASM, o valor final hexadecimal é tudo, incluindo bibliotecas, TODOS OS CÓDIGOS.
Mark Ormston

5
Não. Posso converter ASM para binário manualmente, se realmente necessário. Ele sairá exatamente com os mesmos 177 bytes que meu montador ajudou. O código resultante pode ser colado por qualquer pessoa com um editor binário em um novo arquivo, salvo 177 bytes, e funcionará conforme o esperado. Aparentemente SO é dividido em submissões ASM, então talvez você deve esclarecer se você sente que não conta: meta.codegolf.stackexchange.com/questions/260/...
Mark Ormston

6
Tudo bem, então, para provar que essa entrada é válida, passei o tempo que levou para traduzir manualmente para binário. Atualizei minha resposta de acordo.
Mark Ormston

7
O problema é que não há compilador com montagem. Você acabou de usar macros. Dizer que não conta é como dizer que você não pode usar nenhuma #defineinstrução predefinida em C. É apenas demorado substituir manualmente tudo.
Mark Ormston

28

Java, 505 405 324 bytes

Apenas um cálculo padrão, com golfitude agora com golfitude extra.

insira a descrição da imagem aqui

Golfe:

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

Com quebras de linha:

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);- depende muito do tema usado, mas eu aceito.
Mark Jeronimus

Você pode descartar as importações em Java porque elas são geradas automaticamente de qualquer maneira.
22813 Mark Jeronimus

Eu também ver doubleonde floatpoderia ser usado se você tentou
Mark Jeronimus

JFrame=> Frameraspa 2 caracteres. Embora você não possa mais fechar a janela. ;)
EthanB

2
Sua turma não precisa ser pública. Além disso, use o Java 8 para se livrar do finalmodificador. E você não deve omitir as importações para ser um envio completo.
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)

Saída padrão

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

  • Altere npara variar o tamanho da imagem (e o número de iterações).
  • Altere os valores transmitidos nas f(87);f(0);f(0);chamadas (próximo ao final) para alterar os valores de cores RGB. ( f(8);f(8);f(8);está em escala de cinza.)

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

insira a descrição da imagem aqui

(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
Agradável. d=documenteconomizaria um pouco mais. (? Além disso, existe uma razão para criar a tela faz codegolf assumir um certo nível de HTML disponíveis?)
Matthew Wilcoxson

1
Você pode escrever document.createElement`canvas` e salvar 2 bytes. O mesmo que o getContext`2d` .
Ismael Miguel

Eu não assumi uma tela HTML, pois esta é uma solução JavaScript pura.
MT0 7/10

ou você pode 'soltar' a tela como aqui
Kamil Kiełczewski

19

J, 73 bytes

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

conjunto de mandelbrot

Edite , alguns 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

1
+1, mas seria possível explicar um pouco como esse código funciona? Em particular, estou curioso para saber como (em que parte do código) ele escolhe as cores?
plannapus

1
@ MarkJeronimus, posso fazer 70, mas guardei algumas coisas para maior clareza. Assim, tomei a liberdade de ignorar a LF ao contar.
Eelvex

@ plannapus, OK, adicionou alguns comentários. A seleção de cores é feita com a (0,?$~99 3)qual produz 100 trigêmeos rgb, um para cada nível. Por causa da aleatoriedade, você pode obter menos de 100 trigêmeos, então alguns níveis terão uma transição mais suave (mas ainda terão cores diferentes).
Eelvex

17

Mathematica, 214 191 215 19 30

Desde a versão 10.0, há um built-in: (19 bytes)

MandelbrotSetPlot[]

mandelbrot


Para estar em conformidade com os requisitos do intervalo de coordenadas, são necessários 11 bytes adicionais. (30 bytes)

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

m2


Um estojo enrolado à mão:

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}é mais curto e mais perto das regras
Mark Jeronimus

@MarkJeronimus Thanks. Usei o intervalo sugerido para a imagem iterativa.
21820

Você acertou quase tudo e depois tornou o interior não preto. O último quadro no GIF é preto por dentro e é uma resposta permitida. EDIT: e eu conto 195 bytes.
Mark Jeronimus

Perdi o ponto de ser negra. A contagem aumentou porque alguns caracteres únicos se tornaram dois caracteres no recortar e colar para SE.
21420

Sua solução interna usa uma interpretação muito simples de The fractal coordinates range from approximately -2-2i to 2+2i.
Jonathan Frech 25/09

16

Python com Pylab + Numpy, 151 bytes

Eu não aguentava ver uma entrada em Python sem DQ, mas acho que realmente me superei nessa e reduzi para 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))

Além disso, notavelmente, a penúltima linha gera quatro avisos de tempo de execução distintos, um novo recorde pessoal!

insira a descrição da imagem aqui


Conto 152. Não é necessário espaço entre importe *, e não definir fnada, deve ser menor, a menos que eu tenha entendido algo errado, o que é possível. Você também deve alterá-lo para que 0 iterações e 1 iterações sejam distintas (atualmente elas são cinza).
Primo

Esquisito. Wc inclui o eof? Fixo e um pouco menor. Um momento.
meawoppl

Recebo 151 com wc. Primeiro golfe, então não sei como pontuá-lo.
meawoppl

Conto 150, sem seguir a nova linha. Alguns intérpretes / compiladores exigem um, mas o intérprete python se sai bem. Não tenho certeza wc, mas talvez tente stat -c %s. As margens superior e inferior pretas fazem parte da imagem?
Primo

1
Você pode salvar 1 caractere usando em from numpy import*vez de import numpy as ne em mgridvez 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()

Resultado:

MSet 1


Você deve mencionar que esse é o Allegro 4 (que é bem diferente do Allegro 5). Qual versão exata é essa?
Victor Stafusa

ela quer 246 ou 249 longa
Mark Jeronimus

@Victor Allegro 4.2.2.
Oberon

1
@ MarkJeronimus Não deveria haver uma nova linha entre ... allegro.h>e x=-1, ...? Suponho que o Notepad ++ conte como \r\n= 0D 0A.
Oberon

1
Eu acho que 0.01pode ser digitado como .01.
Yytsi

14

Windows PowerShell (v4), 299 bytes

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

Instruções

  • Execute um console normal do PowerShell (o ISE pode não funcionar)
  • Copie / cole o código, pressione Enter
  • Aguarde - demora um minuto ou mais para ser executado
  • A única maneira de sair é fechar o console

Comente

  • Há um pouquinho de teste de regras acontecendo com as cores dentro do conjunto; as regras dizem "Os outros pixels (presumivelmente dentro do conjunto de Mandelbrot) devem ser coloridos em preto ou branco" ; o código está colorindo os pixels RGB completamente preto (0,0,0) ... é um RGBA preto transparente (0,0,0,0). Então, o que aparece é a cor de fundo do formulário do tema atual do Windows, um RGB ligeiramente esbranquiçado (240.240.240) nesse caso.

Eu mudaria lt2para lt4torná-lo um "conjunto de mandelbrot" em vez da imagem que você tem agora. Muitos pontos do conjunto são engolidos pelas faixas coloridas.
Mark Jeronimus

Aparentemente, a magnitude a*a+b*bnão é #sqrt(a*a+b*b)
Mark Jeronimus

Eu pensei que tinha testado isso antes, mas procurei uma resposta para "onde está a linha horizontal à esquerda?" E, depois de um tempo, encontrei exatamente onde você disse -lt4. O que é bom - obrigado. Atualizei minha resposta com código e imagem corrigidos. (Terá que repensar minha compreensão do que está fazendo, já que estou perdendo alguma coisa).
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()

Saída (será aberta no visualizador * .bmp padrão):


1
Você pode raspar 3 se livrar-se do ylaço. r=range(d*d), use x/de x%dpara x e y.
Geobits

@ Geobits a idéia realmente salvou 10, obrigado!
Primo

1
Tipos complexos podem ser inicializados como: c = 1 + 2j, o que acho que pouparia alguns caracteres com: z = o = x / 9e4-2 + (x% d / 150.-2) * 1j; c = 99
precisa saber é

@meawoppl another 7: D
primo

Tecnicamente proibido: isso não possui nenhum recurso gráfico de saída do próprio Python (e Image.show()salva implicitamente um arquivo temporário).
Nneonneo 9/03

12

BBC Basic (228 bytes)

E os idiomas que ninguém nunca ouviu falar no código de golfe? Provavelmente poderia ser otimizado, mas não estou exatamente onde - melhorias possíveis. Baseado em http://rosettacode.org/wiki/Mandelbrot_set#BBC_BASIC , mas tentei codificá-lo o máximo possível.

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

O conjunto Mandelbrot gerado

O >símbolo na imagem é rápido e é gerado automaticamente após a execução do programa.


Não há necessidade de plotar duas vezes, basta ir com uma versão mais ineficiente. Não suporta NEXT Y,X?
21413 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')

Isto é para Dyalog APL com ⎕IO ⎕ML←1 3

A maior parte do espaço é ocupada por chamadas da API para mostrar um bitmap em uma janela (linhas 2, 3, 4)
Se houvesse um atalho para isso, o código seria reduzido para 60 caracteres (linha 1)

PLZ AJUDA A ENCONTRAR ATALHO KTHX

Versão não destruída (apenas linha 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 tela:

(A versão freeware é executada no OS X no Wine. Sim, eu sou barato assim.)

captura de tela

*: O Dyalog possui seu próprio conjunto de caracteres de byte, com os símbolos da APL mapeados para os valores superiores de 128 bytes, para que todo o código possa ser armazenado em 194 bytes. Todas as afirmações nesta nota de rodapé são possivelmente verdadeiras. Mantenha a calma e continue jogando golfe.


10

Mathematica 10.0, 19 caracteres

MandelbrotSetPlot[]

MandelbrotSetPlot é uma nova função no Mathematica 10.0.

insira a descrição da imagem aqui


Quão conveniente é que essa função incorporada satisfaça todos os meus requisitos (exceto a localização, que pode ser definida com mais 13 caracteres). Exceto que essa é uma brecha padrão.
precisa

19
O código de golfe geralmente é conquistado por idiomas especializados com tokens de um caractere ou por sistemas como o Mathematica que possuem um grande número de funções especiais integradas. Usá-los não é trapaça, assim como o uso de comandos de caractere único seria no APL.
Michael Stern

9

R, 199 211 caracteres

Solução antiga com 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)

Com recuo:

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)

insira a descrição da imagem aqui

Edit: Solução com 211 caracteres que colore a parte interna do conjunto e a parte externa da primeira camada de maneira 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)

Com recuo:

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)

insira a descrição da imagem aqui


tecnicamente preto por fora não é permitido. Você sentiu falta disso ou é difícil de implementar?
21813 Mark Jeronimus

@ MarkJeronimus, na verdade :) Vou tentar dar uma olhada em como fazer isso, mas não estou 100% confiante de que vou encontrar uma maneira de fazer isso de forma limpa.
plannapus

@MarkJeronimus Done!
plannapus

5
Segundo lugar na divisão de cores hediondas.
meawoppl

1
@meawoppl blame rainbow():)
plannapus

9

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


Ah, maaaaan, eu queria fazer isso. +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

Baseado na resposta do Digital Trauma. insira a descrição da imagem aqui


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

Definindo variáveis ​​no 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);}

Veja-o no ShaderToy

Mandelbrot Golf

Isso requer que uma textura de paleta adequada seja carregada como iChannel0. (A coloração aqui é da textura "pixel aleatório" no ShaderToy).


As declarações de variáveis ​​também devem ser contadas, a menos que possam ser geradas automaticamente a partir do código. (esquema de cores é bom se ele só está disponível como um ambiente externo)
Mark Jeronimus

@ MarkJeronimus: Para o ambiente ShaderToy, essas variáveis ​​são corrigidas. Caso contrário, para shaders padrão, eu teria escolhido nomes de variáveis ​​mais curtos.
nneonneo

É o mais rápido de todos?
Demi

6

Oitava ( 212 136 bytes)

(Agora, incluindo algumas idéias devido 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])

Com espaço em branco:

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

Resultado:

Etapas de Mandelbrot para abs (z)> 2

Para converter para o Matlab, altere " m+=abs(z)<2" para " m=m+(abs(z)<2)". [+3 bytes]

Para fazer a proporção 1: 1, adicione " ;axis image". [+11 bytes]

Minha primeira resposta (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])

Há provavelmente um caminho mais curto para obter um mapa de cores descontínua ....
aschepler

Sim, muito melhor agora.
aschepler

+1 solução agradável e concisa. Mas sua proporção não é de 1: 1 (consulte a regra n ° 2: a saída deve ser quadrada).
plannapus

Para corrigir a proporção, serão necessários mais 11 bytes: acrescente " ;axis image". Isso é necessário para se qualificar?
aschepler

Eu acho que era só eu a comentar :), o OP não parece ter um problema com ele, pois ele não disse nada.
plannapus

6

Applesoft BASIC, 302 286 280 bytes

Isso seleciona pontos aleatórios para desenhar, para que funcione para sempre e talvez nunca preencha o 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

Acontece que o Applesoft BASIC é realmente perdoa a falta de espaço. Apenas um espaço é necessário em todo o programa.

Saída após 14 horas:

        resultado

GIF:

        gif

Antes de jogar golfe:

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 (no Applesoft BASIC) coloca a máquina no modo gráfico completo.

Uma versão otimizada para monitores em preto e branco:

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

Saída após 12 horas:

        b & w

Uma versão que funcionará em 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

Seria menor (e mais lento) se você não plotar dois pixels de uma vez, mas escolher um pixel aleatório na tela inteira.
Mark Jeronimus 31/05

1
@ MarkJeronimus Já é tão lento que a versão colorida ainda não terminou, depois de postar isso há 5 dias. Eu não acho que posso permitir que seja mais lento: P
MD XF

5

gnuplot 110 (105 sem novas linhas)

Entrada obrigatória no gnuplot. Isso já foi feito inúmeras vezes, mas este é do zero (não que seja difícil). Eu gosto de como o gnuplotgolfe comanda 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

No entanto, estou profundamente decepcionado com a entrada de números complexos. x*{1,0}+y*{0,1}deve ser a maneira mais triste existente de construir um número complexo.

Opa, a imagem: gnuplot mandelbrot

Defina amostras de amostras mais altas para obter uma melhor resolução. Também podemos dizer unset ticse unset colorboxpara uma imagem pura, mas acho que esta versão se qualifica muito bem.


Aposto que é cópia / pasta do primeiro hit do Google "gnuplot mandel". Para iniciantes, *{1,0}é a unidade e é mais uma maneira de dizer boliche *1, e provavelmente pode ser descartada. (não testado)
Mark Jeronimus

1
Não, não é um copiar e colar. É uma fórmula muito direta e nem era necessário procurá-la. No entanto, encontrei as páginas que você obtém com essa pesquisa quando procurava uma maneira melhor de inicializar números complexos (a implementação deles é diferente, bem, tão diferente quanto possível nesse caso). Obrigado pela dica sobre a parte real, funciona. Fixação.
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)

Resultado -

insira a descrição da imagem aqui

Não atende ao requisito de que as células internas devam ser pretas ou brancas, mas pode ser atendido por (1) usando em imshow(K)vez de imagesc(K)(requer 1 byte a menos, mas precisa da caixa de ferramentas de processamento de imagem) ou (2) anexandocolormap hot (requer mais 12 bytes).

Versão não destruída -

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)

Usar uma biblioteca é bom se estiver empacotado no Matlab por padrão e qualquer usuário puder adivinhar que está sendo usado no código ou nas mensagens de erro.
21813 Mark Jeronimus

Bom, você me venceu. Eu gosto do C-Clugar do meu 0*e(401). Além disso, você não está usando N. E podemos ficar um pouco mais curtos usando minha m+=abs(z)<2ideia no lugar da sua K(~K&abs(Z)>2)=j.
Aschepler # 11/14

O padrão colormap jete colormap hotambos estão incorretos - eles têm apenas 64 cores distintas. colormap(hot(101))não parece visualmente distinguível para mim. colormap([0,0,0;jet(100)])é talvez aceitável, mas duvidoso.
Aschepler # 11/14

Isso funciona? Na oitava, K=K+abs(Z)<2significa K=((K+abs(Z))<2). (Então, eu estava errado sobre a estimativa de um byte para eliminar +=.)
aschepler

2
O conjunto de Mandelbrot girado em 90 graus ainda é o conjunto de Mandelbrot.
Chris Taylor

4

JavaScript + HTML5 (356B)

(Nota: as linhas que terminam com '//' são adicionadas aqui para facilitar a leitura)

Versão com desempenho (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>

Versão lenta (356B): remova o 'var' e os parâmetros na função interna para que o escopo global seja usado.

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

insira a descrição da imagem aqui


Perdoe-me se não entender suas instruções para fazer a versão curta.
Mark Jeronimus

Sem problemas. Remova var w,no início e mude function(x,i,j,k,l,c,o)para function().
precisa saber é o seguinte

4

Javascript, 285B

Baseado no meu código e em algumas melhorias nos MT0s código , reduzi para 285B em cores:

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

em ação: http://jsfiddle.net/acLhe/7/

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

O Coffeescript deve ser legível: - / veja em ação: http://jsfiddle.net/acLhe/6/

Mandelbrot Coffeescript


O OP pede cores, a menos que sua plataforma não suporte cores. Parece ótimo, porém, e um bom código conciso. Bem-vindo ao PPCG!
31416 Jonathan Van Matre

Começo com esse tamanho 285B e o aprimoro mais nesta resposta
Kamil Kiełczewski 17/10

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 padrão do DOS:

insira a descrição da imagem aqui


4

Tcl / Tk, 316

322 324 336 348 349 351 352 353 354 355

Agora, uma versão mais curta usando trigêmeos em cores com três letras #RGB (em vez de trigêmeos #RRGGBB), o que resulta em cores diferentes.

E um pouco mais de golfe.

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

Eu acho que venceria se o critério fosse de beleza!

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

Apresentação:

fractal


1
Agradável. Você pode reduzir alguns caracteres (até 380, eu acho) adicionando rename set sno topo e substituindo todos os sets
itens

4

Excel VBA, 251 246 224 223 221 bytes

Economizou 5 bytes graças a ceilingcat Economizou 23 bytes graças 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

Resultado:

Saída com D = 99

Eu fiz uma versão que fez isso há muito tempo, mas tinha muitos extras, como deixar o usuário escolher a cor básica e a matemática fácil de seguir. Jogar golfe foi um desafio interessante. O Colormétodo usa 1E6como um meio para obter uma ampla gama de cores, desde as cores são válidos 0para 2^24. Configurando para10^6 dar boas áreas de contraste

Explicação / Formatação automática:

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

Também brinquei com D=999e j=1 to 998para obter uma imagem muito maior e mais precisa. Os resultados são irrelevantes para o desafio, porque são muito grandes, mas são arrumados.

D = 999


@ceilingcat Obrigado. Essa foi uma passagem do meu original, que tinha funções especializadas para matemática numérica complexa.
Engineer Toast

Realmente precisa ser> = 4 ou você pode se safar com> 4? Além disso, pode substituir j<99por j<D.
ceilingcat

@EngineerToast, você pode soltar o ()do subnome , deve mudar (j<99)para (j<d)e pode, com o objetivo de fazer com que as células quadradas sejam usadas apenas Cells.RowHeight=48no lugar de Cells.RowHeight=9, Cells.ColumnWidth=1- isso dificulta a mexer na sua saída, mas foi aceito como válido pela comunidade -
Taylor Scott

1
@TaylorScott Lembro-me do RowHeighttruque do post de dicas do VBA e pretendia integrá-lo depois de receber todas as minhas lindas fotos. Isso foi um bom pedaço, obrigado.
Engineer Toast

Eu acredito que você pode ir longe com a remoção de um outro byte trocando 2^20com1E6
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 Mandelbrot de Perl + GD

Golfed deste código


2
Nomeado: esquema de cores mais feio.
precisa saber é

3

Flutuador, 620 pixels

Uma língua que inventei quando me inspirei no meu próprio desafio, bem como na linguagem esotérica Piet.

insira a descrição da imagem aqui


2
Link para um idioma e descrição do código? Ou, na verdade, qual é o código?
MD XF
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.