Изображение Мандельброта на каждом языке


91

Я всегда использовал изображение Мандельброта как «графическую» версию Hello World в любом графическом приложении, которое мне досталось. Теперь очередь твоих парней.

  • Язык должен иметь возможность графического вывода или рисования диаграмм (сохранение файлов запрещено)
  • Визуализируйте квадратное изображение или график. Размер не менее 128 и не более 640 по ширине *
  • Координаты фракталов варьируются от -2-2i до 2 + 2i
  • Пиксели за пределами набора Мандельброта должны быть окрашены в соответствии с количеством итераций, прежде чем величина превысит 2 (исключая * черно-белые)
  • Каждый счетчик итераций должен иметь уникальный цвет *, а соседние цвета предпочтительно должны легко различаться на глаз
  • Другие пиксели (предположительно внутри набора Мандельброта) должны быть окрашены либо в черный, либо в белый цвет.
  • Не менее 99 итераций
  • ASCII искусство не допускается

* если не ограничено платформой, например, графический калькулятор

Разрешено:
Разрешается
Запрещено:
Недопустимый
(уменьшенные изображения)

Условия выигрыша:

Кратчайшая версия (размер в байтах) для каждого языка будет упоминаться в этом посте, упорядоченная по размеру.
Ни один ответ никогда не будет «принят» с помощью кнопки.

Leaderboard:


8
«Легко различить на глаз» сложно сделать объективным. ... Кроме того, помимо вашей личной связи с ними, набор Мандельброта не имеет ничего общего с Hello World, поэтому лучше не указывать это в названии, если вы не намеренно управляете поисковыми системами.
Джонатан Ван Матре

1
Связанный: ASCII Mandelbrot (хотя некоторые ответы, опубликованные там, не являются ASCII и, вероятно, могли бы подойти лучше как ответы на этот вопрос).
Питер Тейлор

3
Я видел несколько людей, которые сейчас упоминают, что они изображают Мандельброта как «Hello World». Я тоже так делал около 30 лет. Mandelbrot - это идеальный «Hello World», поскольку он показывает, что у вас есть пиксельный доступ к дисплею, и дает хорошее представление о производительности вычислений с привязкой к новой платформе.
Роджер Даль

6
Отличная идея задать вопрос, который требует сочетания математической и эстетической чувствительности, а затем навязать все проектные решения заранее.
JWG

3
Кому-нибудь удастся заработать один в
головокружительном выигрыше

Ответы:


94

Графический калькулятор Sharp EL-9300, 296 байт

Это был мой графический калькулятор для средней школы , который лет 20 назад! Я помню, как писал для этого генератор Мандельброта. И конечно же, он все еще находится в памяти 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

Рендеринг занял около 90 минут.

Это совершенно безвкусно. Я уверен, что смогу сэкономить немного места, но я просто хотел поделиться этим историческим любопытством!

Мне нравится, что единственными доступными управляющими утверждениями являются gotos.

Вот фото. У меня нет других способов получить графический вывод: введите описание изображения здесь


1
Я тоже, но моя NV память стала пустой после многих лет хранения.
Марк Иеронимус

2
zx²+zy²>4не может ли это быть Abs(x)>2?
Марк Иеронимус

1
Может быть, вы должны получить новую батарею ...
NothingsImpossible

25
Интересно. Итак, ты был ботаником довольно долгое время.
devnull

4
Хороший "Скриншот"
meawoppl

83

Я столкнулся с этим на днях. Я не беру на себя ответственность, но, черт возьми, это круто

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

введите описание изображения здесь http://preshing.com/20110926/high-resolution-mandelbrot-in-obfuscated-python/


12
Кажется, запрещено: регионы не легко различимы, или даже вообще.
Примо

5
Кроме того, это записывает в файл.
Ли Райан

40
запрещено или нет, это довольно круто: D
Navin

18
@DigitalTrauma, черт возьми, +1 за самый красивый вход!
Брайан С

19
Это считается как Quine? ;-)
Blazemonger

47

LaTeX, 673 байта

\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

Результат 129x129 (129 × 129)

PDF-изображение состоит из цветных квадратных блоков размером 1 бп × 1 бп.

Ungolfed

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

36

Сборка x86 для DOS, 208 177 173 байта

Полный бинарный файл в HEX, который я создал вручную:

DBE3BE00A0B81300CD1056BA640007BF87F9FDBDC7008BCDE81A008AC3AA4979F7B9C70083EF784D79EE33C0CD16B80300CD10CD208BC12BC289441CDF441CDF06A701DEF9D95C088BC52BC289441CDF441CDF06A701DEF9D95C0CD9EED914D95404D95410D95C14B301D904D84C04DE0EA901D8440CD95404D94410D86414D84408D914D80CD95C10D84C04D95414D84410DF06AB01DED99BDFE09B9E7207433ADA72C632DBC3320002000400

Образец изображения:

Мандлеброт снимок экрана с черным обрезанным

Полный исходный код в читаемом ASM довольно длинный (я использовал это, чтобы выяснить, как я кодировал эту присоску):

.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

Он предназначен для компиляции с TASM, запускается в MCGA и ожидает нажатия клавиши перед завершением программы. Цвета - это просто стандартная палитра MCGA.

РЕДАКТИРОВАТЬ: Оптимизировал его, теперь он рисует в обратном направлении (хотя то же изображение), и сохранил 31 байт!

РЕДАКТИРОВАТЬ 2: Чтобы смягчить ОП, я воссоздал двоичный файл вручную. Таким образом, я также сбрил еще 4 байта. Я задокументировал каждый шаг процесса, показывая всю мою работу, чтобы любой мог следовать за ней, если он действительно этого захочет, (предупреждение, это скучно и очень долго): http://lightning.memso.com/media/perm/ mandelbrot2.txt

Я использовал пару регулярных выражений в EditPadPro, чтобы найти все ; Final: ...записи в файле и вывести их как шестнадцатеричный двоичный файл в файл .com. Полученный двоичный файл - это то, что вы видите в верхней части этого поста.


1
Машинный код не считается. Если это имеет значение, то любой язык, производящий байт-код или машинный код, должен быть короче. Я считаю 820 после замены всего на 1-символьные длинные имена.
Марк Иеронимус

3
Я мог бы передать весь код в двоичном виде, если это облегчит вам задачу, но это все равно, что попросить любого, использующего язык высокого уровня, избегать использования автоматических конструкций, макросов и т. Д. макросы. Полученный двоичный файл для запуска полного JavaScript, Perl и т. Д. Включает двоичный файл библиотеки. С ASM окончательное шестнадцатеричное значение - это все, включая библиотеки, ALL CODE.
Марк Ормстон

5
Нет. Я могу вручную конвертировать ASM в двоичный файл, если это действительно необходимо. Он получит те же самые 177 байтов, с которыми помог мой ассемблер. Полученный код может быть вставлен любым пользователем с бинарным редактором в новый файл, сохранен, 177 байт, и он будет работать как положено. Очевидно, что SO разделен на представления ASM, поэтому, возможно, вам следует уточнить, если вы считаете, что он не учитывается: meta.codegolf.stackexchange.com/questions/260/…
Марк Ормстон,

6
Итак, чтобы доказать, что это правильная запись, я потратил время на то, чтобы вручную перевести это в двоичный файл. Я обновил свой ответ соответственно.
Марк Ормстон

7
Дело в том, что компилятора со сборкой нет. Вы просто используете макросы. Сказать, что это не считается, все равно, что сказать, что вы не можете использовать какие-либо предопределенные #defineоператоры в C. Это просто отнимает много времени, чтобы заменить все вручную.
Марк Ормстон

28

Java, 505 405 324 байта

Просто стандартный расчет, с Golfitude теперь с дополнительной Golfitude.

введите описание изображения здесь

Golfed:

import java.awt.*;class M{public static void main(String[]v){new Frame(){public void paint(Graphics g){for(int t,s,n=640,i=n*n;--i>0;g.setColor(new Color(s*820)),g.drawLine(i/n,i%n+28,i/n,i%n),setSize(n,668)){float c=4f/n,a=c*i/n-2,b=i%n*c-2,r=a,e=b,p;for(s=t=99;t-->0&&r*r+e*e<4;s=t,p=r*r-e*e+a,e=r*e*2+b,r=p);}}}.show();}}

С переносами строк:

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);- сильно зависит от используемой темы, но я приму это.
Марк Иеронимус

Вы можете отбросить импорт в Java, потому что он все равно генерируется автоматически.
Марк Иеронимус

Я также вижу, doubleгде floatможно было бы использовать, если бы вы попытались
Марк Джеронимус

JFrame=> Frameсбривает 2 символа. Хотя ты больше не можешь закрыть окно. ;)
EthanB

2
Ваш класс не должен быть публичным. Далее, используйте Java 8, чтобы избавиться от finalмодификатора. И вы не должны опускать импорт, чтобы быть полным представлением.
Виктор Стафуса

21

Javascript (ECMAScript 6) - 315 308 символов

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)

Выход по умолчанию

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

  • Изменить, nчтобы изменить размер изображения (и количество итераций).
  • Измените значения, переданные в f(87);f(0);f(0);вызовах (ближе к концу), чтобы изменить значения цвета RGB. ( f(8);f(8);f(8);Оттенки серого.)

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

введите описание изображения здесь

(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
Приятно. d=documentспас бы вас еще немного. (Кроме того, есть ли причина для создания холста? Предполагает ли Codegolf определенный уровень доступного HTML?)
Мэтью Уилкоксон,

1
Вы можете написать document.createElement`canvas` и сохранить 2 байта. Так же, как getContext`2d` .
Исмаэль Мигель

Я не принимал HTML-холст, так как это чистое решение JavaScript.
MT0

или вы можете «уронить» холст, как здесь
Камиль Келчевски

19

J, 73 байта

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

набор Мандельброта

Изменить , некоторые объяснения:

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 но можно ли вам немного объяснить, как работает этот код? В частности, мне интересно знать, как (где в коде) он выбирает цвета?
plannapus

1
@MarkJeronimus, я могу сделать это 70, но я сохранил некоторые вещи для ясности. Таким образом, я взял на себя смелость игнорировать LF при подсчете.
Eelvex

@plannapus, хорошо, добавил несколько комментариев. Выполняется подбор цвета, в результате (0,?$~99 3)которого получается триплеты по 100 ГБ, по одному на каждый уровень. Из-за случайности вы можете получить менее 100 триплетов, поэтому некоторые уровни будут иметь более плавный переход (но все равно будут иметь разные цвета).
Eelvex

17

Mathematica, 214 191 215 19 30

Начиная с версии 10.0 имеется встроенное: (19 байт)

MandelbrotSetPlot[]

Мандельброт


Для соответствия требованиям диапазона координат требуется 11 дополнительных байтов. (30 байт)

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

м2


Ручной случай:

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

зеленый


{b, -2, 2, .01}, {a, -2, 2, .01}Короче и ближе к правилам
Марк Жеронимус

@MarkJeronimus Спасибо. Я использовал предложенный диапазон для повторяющейся картинки.
DavidC

Вы сделали это почти правильно, тогда вы сделали внутреннюю часть не черной. Последний кадр в GIF черный внутри и разрешенный ответ. РЕДАКТИРОВАТЬ: и я считаю 195 байтов.
Марк Иеронимус

Я упустил момент о том, чтобы быть черным. Количество увеличилось, потому что некоторые отдельные символы стали двумя символами в вырезать и вставить в SE.
DavidC

Ваше встроенное решение использует очень свободную интерпретацию The fractal coordinates range from approximately -2-2i to 2+2i.
Джонатан Фрех

16

Питон с Pylab + Numpy, 151 байт

Я не мог видеть запись Python без DQ, но я думаю, что я действительно превзошел себя в этом, и я сделал это до 153 символов!

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

Кроме того, в частности, от второй до последней строки выводятся 4 разных предупреждения во время выполнения, новый личный рекорд!

введите описание изображения здесь


Я считаю 152. Никакого пробела не требуется между, importи *, не определяя fвообще, должно быть короче, если я не понял что-то, что возможно. Вы также должны изменить это так, чтобы 0 итераций и 1 итераций были выделены (они оба серые).
Примо

Weird. Включает ли wc eof? Исправлено и немного меньше. Момент.
meawoppl

Я получаю 151 с туалетом. Первый гольф, поэтому не уверен, как его забить.
meawoppl

Я считаю 150, без трейлинга новой строки. Некоторые интерпретаторы / компиляторы требуют один, но интерпретатор Python прекрасно обходится без него. Не уверен насчет wc, но, возможно, попробую stat -c %sвместо этого. Являются ли черные верхние и нижние границы частью изображения?
Примо

1
Вы можете сохранить 1 символ, используя from numpy import*вместо import numpy as nи mgridвместо n.mgrid.
nyuszika7h

15

C + Allegro 4.2.2 - 248 байт

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

Выход:

MSet 1


Следует отметить, что это Allegro 4 (который сильно отличается от Allegro 5). Какая это точная версия?
Виктор Стафуса


@Victor Allegro 4.2.2.
Оберон

1
@MarkJeronimus Разве не должно быть новой строки между ... allegro.h>и x=-1, ...? Я полагаю, Notepad ++ считает это \r\n= 0D 0A.
Оберон

1
Я думаю, 0.01можно напечатать как .01.
Yytsi

14

Windows PowerShell (v4), 299 байт

Фрактальная картина Мандельброта

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

инструкции

  • Запустите обычную консоль PowerShell (ISE может не работать)
  • Скопируйте / вставьте код, нажмите Enter
  • Подождите, это займет минуту или больше, чтобы бежать
  • Единственный способ выйти - закрыть консоль

Комментарий

  • Есть небольшое тестирование правил с цветами внутри набора; правила гласят: «Другие пиксели (предположительно внутри множества Мандельброта) должны быть окрашены в черный или белый цвет» ; код окрашивает пиксели полностью в черный цвет RGB (0,0,0) ... это просто прозрачный черный цвет RGBA (0,0,0,0). Таким образом, появляется фоновый цвет формы текущей темы Windows, в данном случае слегка не совсем белый RGB (240 240 240).

Я бы изменил lt2его, lt4чтобы сделать его «набором Мандельброта» вместо того изображения, которое у вас есть сейчас. Многие точки набора поглощаются цветными полосами.
Марк Жеронимус

Видимо Величины a*a+b*bнетsqrt(a*a+b*b)
Марк Иероним

Я думал, что проверял это ранее, но я отправился на поиски ответа на вопрос «куда ушла горизонтальная линия слева?», И через некоторое время я нашел именно то, что вы сказали -lt4. Что хорошо - спасибо. Я обновил свой ответ с исправленным кодом и изображением. (Придется переосмыслить мое понимание того, что он делает, так как я что-то упустил).
TessellatingHeckler

14

Python + PIL , 166 байт

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

Вывод (откроется в программе просмотра * .bmp по умолчанию):


1
Вы можете сбрить 3, если вы избавитесь от yпетли. r=range(d*d), используйте x/dи x%dдля х и у.
Geobits

@ Geobits идея на самом деле спасла 10, спасибо!
Примо

1
Сложные типы могут быть инициализированы как: c = 1 + 2j, что, я думаю, сэкономит вам пару символов с: z = o = x / 9e4-2 + (x% d / 150.-2) * 1j; c = 99
meawoppl

@meawoppl еще 7: D
прим

Технически не разрешено: это не имеет никакой графической функции вывода самого Python (и Image.show()неявно сохраняет временный файл).
nneonneo

12

BBC Basic (228 байт)

А как насчет языков, о которых никто никогда не слышал в кодовом гольфе? Скорее всего, можно оптимизировать, но я не совсем там, где возможны улучшения. На основании http://rosettacode.org/wiki/Mandelbrot_set#BBC_BASIC , но я старался как можно больше кодировать в гольф.

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

Сгенерированный набор Мандельброта

>Символ на изображение стремителен, и это автоматически после запуска программы.


Не нужно строить дважды, просто используйте более неэффективную версию. Разве это не поддерживает NEXT Y,X?
Марк Иеронимус

10

APL, 194 символа / байт *

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

Это для Dyalog APL с ⎕IO ⎕ML←1 3

Большая часть пространства используется вызовами API для отображения растрового изображения в окне (строки 2, 3, 4).
Если бы был ярлык, чтобы сделать это, код был бы до 60 символов (строка 1)

PLZ HELP НАЙТИ SHORTCUT KTHX

Неуправляемая версия (только строка 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    

Скриншот:

(Бесплатная версия запускается в OS X под Wine. Да, я такой дешевый.)

Скриншот

*: Dyalog имеет свой собственный однобайтовый набор символов с символами APL, сопоставленными с верхними 128-байтовыми значениями, поэтому весь код может храниться в 194 байтах. Каждое утверждение в этой сноске, возможно, верно. Сохраняйте спокойствие и продолжайте играть в гольф.


10

Mathematica 10,0, 19 символов

MandelbrotSetPlot[]

MandelbrotSetPlot это новая функция в Mathematica 10.0.

введите описание изображения здесь


Как удобно, что эта встроенная функция просто удовлетворяет всем моим требованиям (кроме местоположения, которое можно установить еще с 13 символами). Кроме того, это стандартная лазейка.
Марк Жеронимус

20
В Code Golf обычно выигрывают специализированные языки с односимвольными токенами или такие системы, как Mathematica, которые имеют огромное количество встроенных специальных функций. Использовать их - это не обман, больше, чем использование односимвольных команд в APL.
Майкл Стерн

9

R, 199 211 символов

Старое решение на 199 символов:

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)

С отступом:

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)

введите описание изображения здесь

Изменить: Решение на 211 символов, которые по-разному окрашивают внутреннюю часть набора и внешнюю часть первого слоя:

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)

С отступом:

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)

введите описание изображения здесь


технически черный снаружи не допускается. Вы упустили это или это сложно реализовать?
Марк Иеронимус

@MarkJeronimus оба на самом деле :) Я постараюсь посмотреть, как это сделать, но я не уверен на 100%, что найду способ сделать это чисто.
plannapus

@MarkJeronimus Готово!
plannapus

5
Второе место в категории отвратительных красок.
meawoppl

1
@meawoppl виноват rainbow():)
plannapus

9

Java - обработка (271 байт)

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

Expanded:

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


Ой, maaaaan, я хотел сделать это. +1 .
SIGSTACKFAULT

8

TI-80 BASIC, 125 106 байт

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

Основано на ответе Digital Trauma. введите описание изображения здесь


6

GLSL - 225 байт:

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

Определение переменных в коде (242 байта):

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

Смотрите это в ShaderToy

Мандельброт Гольф

Это требует, чтобы подходящая текстура палитры была загружена как iChannel0. (Раскраска здесь из текстуры "случайный пиксель" на ShaderToy).


Объявления переменных также должны учитываться, если только они не могут быть автоматически сгенерированы из кода. (цветовая схема хороша, если она доступна только как внешняя настройка)
Марк Джеронимус

@MarkJeronimus: для среды ShaderToy эти переменные являются фиксированными. В противном случае для стандартных шейдеров я бы выбрал более короткие имена переменных.
nneonneo

Это самый быстрый из них?
Деми

6

Октава ( 212 136 байт)

(Теперь включаем некоторые идеи из-за @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])

С пробелами:

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

Выход:

Мандельброт делает шаг в абс (z)> 2

Чтобы преобразовать в Matlab, измените " m+=abs(z)<2" на " m=m+(abs(z)<2)". [+3 байта]

Чтобы сделать соотношение сторон 1: 1, добавьте « ;axis image». [+11 байт]

Мой первый ответ (212 байт):

[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

+1 приятное и лаконичное решение. Но ваше соотношение сторон не 1: 1 (см. Правило № 2: результат должен быть квадратным).
plannapus

Исправление соотношения сторон займет еще 11 байтов: добавьте " ;axis image". Это необходимо для квалификации?
aschepler

я думаю, что это был только я придираюсь :), у ОП, кажется, нет проблем с этим, так как он ничего не сказал.
plannapus

6

Applesoft BASIC, 302 286 280 байт

Он выбирает случайные точки для рисования, поэтому он будет работать вечно и может никогда не заполнить всю плоскость.

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

Оказывается, Applesoft BASIC действительно прощает отсутствие мест. Во всей программе необходим только один пробел.

Выход через 14 часов:

        выход

GIF:

        GIF

Перед игрой в гольф:

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

Примечание: POKE 49234,0(в Applesoft BASIC) переводит аппарат в режим полной графики.

Версия, оптимизированная для черно-белых дисплеев:

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

Выход через 12 часов:

        б & ш

Версия, которая будет работать в 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

Было бы меньше (и медленнее), если бы вы не рисовали два пикселя одновременно, а выбирали случайный пиксель на весь экран.
Марк

1
@MarkJeronimus Уже так медленно, что цветная версия еще не закончена, после публикации этого 5 дней назад. Я не думаю, что могу себе позволить, чтобы это было
MD XF

5

Гнуплот 110 (105 без перевода строки)

Обязательный вступительный взнос. Это было сделано бесчисленное количество раз, но это с нуля (не то, что это сложно). Мне нравится, как gnuplotгольф его команды по своей природе :)

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

Тем не менее, я глубоко разочарован введением комплексных чисел. x*{1,0}+y*{0,1}должен быть самым печальным из существующих способов построения комплексного числа.

К сожалению, изображение: Гнуплот Мандельброт

Установите isosamples выше для лучшего разрешения. Можно также сказать unset ticsи unset colorboxо чистом изображении, но я думаю, что эта версия вполне подходит.


Держу пари, что это копия / паста из первого попадания Google "gnuplot mandel". Начнем с того, что *{1,0}это единство, оно больше похоже на боулинг-код *1, и, вероятно, его можно отбросить. (не проверено)
Марк Джеронимус

1
Нет, это не копия-паста. Это очень простая формула, и ее даже не нужно было искать. Тем не менее, я нашел страницы, которые вы получаете с помощью этого поиска, когда искал лучший способ инициализации комплексных чисел (их реализация отличается, ну, как бы ни была в этом случае). Спасибо за совет о реальной части, это работает. Закрепление.
Орион

5

Matlab (89 байт)

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

Выход -

введите описание изображения здесь

Не удовлетворяет требованию, что внутренние ячейки должны быть черными или белыми, но это может быть удовлетворено либо (1) использованием imshow(K)вместо imagesc(K)(требуется 1 байт меньше, но требуется набор инструментов для обработки изображений), либо (2) добавлением colormap hot(требуется еще 12) байт).

Безголовая версия -

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)

Использование библиотеки хорошо, если она по умолчанию упакована в Matlab, и любой пользователь может догадаться, что она используется из кода или сообщений об ошибках.
Марк Джеронимус

Хорошо, ты меня побил. Мне нравится C-Cвместо моего 0*e(401). Кроме того, вы не используете N. И мы можем стать немного короче, используя мою m+=abs(z)<2идею вместо вашей K(~K&abs(Z)>2)=j.
aschepler

По умолчанию colormap jetи colormap hotоба неверны - они имеют только 64 разных цвета. colormap(hot(101))не выглядит визуально различимым для меня. colormap([0,0,0;jet(100)])возможно приемлемо, но сомнительно.
aschepler

Это работает? На октаву K=K+abs(Z)<2значит K=((K+abs(Z))<2). (Так что я ошибся в оценке одного байта для исключения +=.)
aschepler

2
Набор Мандельброта, повернутый на 90 градусов, остается набором Мандельброта.
Крис Тейлор

4

JavaScript + HTML5 (356B)

(Примечание: строки, заканчивающиеся на «//», добавлены здесь для удобства чтения)

Исполнительская версия (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>

Медленная версия (356B): удалите 'var' и параметры из внутренней функции, чтобы использовать глобальную область.

Попробуйте это: http://jsfiddle.net/neuroburn/Bc8Rh/

введите описание изображения здесь


Простите, если я не понимаю ваши инструкции по созданию короткой версии.
Марк Иеронимус

Нет проблем. Удалите var w,в начале и измените function(x,i,j,k,l,c,o)на function().
uroeuroburɳ

4

Javascript, 285B

Основываясь на моем коде и некоторых улучшениях в коде MT0 , я получил цвет до 285B:

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

в действии: http://jsfiddle.net/acLhe/7/

был: Coffeescript, 342B

document.body.appendChild V=document.createElement 'Canvas'
N=99
Z=V.width=V.height=400
P=[]
P.push "rgba(0,0,0,"+Math.random()*i/N+')' for i in [N..0]
X=V.getContext '2d'
for x in [0..Z]
 for y in [0..Z]
  k=a=b=0
  [a,b]=[a*a-b*b+4*x/Z-3,2*a*b+4*y/Z-2] while a*a+b*b<4 and N>k++
  X.fillStyle=P[k-1]
  X.fillRect x,y,1,1

Coffeescript должен быть читаемым: - / увидеть его в действии: http://jsfiddle.net/acLhe/6/

Мандельброт


ОП запрашивает цвет, если ваша платформа не поддерживает цвет. Выглядит отлично, хотя и хороший лаконичный код. Добро пожаловать в PPCG!
Джонатан Ван Матре

Я начну с этого размера 285B и улучшу его больше в этом ответе
Камиль Килчевски

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

Стандартная палитра DOS:

введите описание изображения здесь


4

Tcl / Tk, 316

322 324 336 348 349 351 352 353 354 355

Теперь укороченная версия с использованием трехбуквенных цветовых триплетов в стиле #RGB (вместо триплетов #RRGGBB), что приводит к различным цветам.

И еще немного игры в гольф.

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

фрактальный


Tcl / Tk, 325

331 333 345 357 358 360 361 362 364 365

Думаю, я бы победил, если бы критерием была красота!

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

Презентация:

фрактальный


1
Приятно. Вы можете уменьшить несколько символов (вплоть до 380, я думаю), добавив rename set sв верхней части , а затем заменить все setВУs
Rolazaro Azeveires

4

Excel VBA, 251 246 224 223 221 байт

Сэкономлено 5 байт благодаря floorcat Сэкономлено 23 байт благодаря Тейлор Скотт

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

Выход:

Выход с D = 99

Я сделал версию, которая сделала это давным-давно, но у нее было много дополнительных возможностей, таких как предоставление пользователю возможности выбрать основной цвет и простую для понимания математику. Игра в гольф была интересной задачей. ColorМетод использует в 1E6качестве средства , чтобы получить широкий диапазон цветов , так как действительные цвета 0к 2^24. Установка его 10^6дала хорошие контрастные области.

Объяснение / Автоформатирование:

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

Я также поиграл с D=999и, j=1 to 998чтобы получить более крупное и более точное изображение. Результаты не имеют никакого отношения к проблеме , потому что они слишком большие , но они являются в чистом виде.

D = 999


@ceilingcat Спасибо. Это был перенос из моего оригинала, который имел специализированные функции для математики сложных чисел.
Тост инженера

Это действительно должно быть> = 4, или вы можете сойти с рук> 4? Также можно заменить j<99на j<D.
floorcat

@EngineerToast можно опускать ()из вспомогательного названия, вы должны изменить , (j<99)чтобы (j<d)и вы можете, с целью сделать квадратные ячейки использовать только Cells.RowHeight=48на месте Cells.RowHeight=9, Cells.ColumnWidth=1- это делает возиться с выходом более трудным , но было принято как действительные сообществом -
Тейлор Скотт

1
@TaylorScott Я помню RowHeightтрюк из поста с советами VBA и намеревался интегрировать его после того, как я получил все свои красивые картинки. Это был хороший chunk'o'bytes, спасибо.
Тост инженера

Я считаю , что вы можете уйти с удалением других байт путем замены 2^20с1E6
Тейлор Скоттом

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

Фрактал Мандельброта от Perl + GD

Гольф от этого кода


2
Номинация: самая некрасивая цветовая гамма.
Meawoppl

3

Floater, 620 пикселей

Язык, который я придумал, когда меня вдохновил мой собственный вызов, а также эзотерический язык Пита.

введите описание изображения здесь


2
Ссылка на язык и описание кода? Или на самом деле, что это за код?
MD XF
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.