Образ Мандельброта на всіх мовах


91

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

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

* за винятком обмежень платформи, наприклад графічного калькулятора

Дозволено:
Дозволено
заборонено:
Заборонено
(зменшені зображення)

Умови виграшу:

Найкоротша версія (розмір у байтах) для кожної мови отримає згадку в цій публікації, упорядковану за розміром.
Жодна відповідь ніколи не буде прийнята кнопкою.

Табло:


8
"Легко розрізнити око" важко поставити об'єктивний характер. ... Крім того, крім вашої особистої асоціації цих двох, набір Мандельброта не має нічого спільного з Hello World, тому найкраще опустити це з назви, якщо ви навмисно не обробляєте пошукові системи.
Джонатан Ван Матре

1
Пов’язано: ASCII Мандельброт (хоча деякі відповіді, розміщені там, не є ASCII і, ймовірно, можуть відповідати краще як відповіді на це запитання).
Пітер Тейлор

3
Зараз я бачив, як декілька людей згадують, що вони вважають Мандельброта "Привіт Світом". Я теж це робив протягом 30 років. Mandelbrot - це ідеальний "Hello World", тому що він показує, що ви маєте піксельний доступ до дисплея і дає гарне відчуття для обчисленої продуктивності на новій платформі.
Роджер Даль

6
Чудова ідея задати питання, яке вимагає поєднання математичної та естетичної чутливості, а потім накласти всі проектні рішення заздалегідь.
jwg

3
Комусь вдасться зробити його у виграшному виграші, я б сказав: D
MadTux

Відповіді:


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.

Ось фото. У мене немає інших засобів, щоб вивести графічний вихід: enter image description here


1
Я теж, але моя пам’ять NV випорожнилася через роки зберігання.
Марк Єронімус

2
zx²+zy²>4не могло бути Abs(x)>2?
Марк Єронімус

1
Можливо, вам доведеться придбати новий акумулятор ...
Nothings неможливо

25
Цікаво. Тож ти вже довгий час був оленяком .
devnull

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

83

Я натрапив на це днями. Я не беру на це кредиту, але чорт, це дивовижно:

Пітон 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)
                                       )   )

enter image description here http://preshing.com/20110926/high-resolution-mandelbrot-in-obfuscated-python/


12
Здається, це заборонено: регіони не легко розрізнити, або навіть зовсім.
примо

5
Також це записується у файл.
Лі Лі Раян

40
заборонено чи ні, це досить приголомшливо: D
Навін

18
@DigitalTrauma, чорт, +1 для найкрасивішого введення!
Брайан S

19
Чи вважає це квіном? ;-)
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

Result 129x129 (129 × 129)

Зображення PDF складається з кольорових квадратних одиниць розміром 1bp × 1bp.

Безумовно

% 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

Зразок зображення:

Mandlebrot screen shot with black cropped

Повне джерело в читабельному 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 байт!

EDIT 2: Щоб переконатись в роботі ОП, я відтворив бінарний вручну. Тим самим я також поголив ще 4 байти. Я задокументував кожен крок процесу, показавши всю свою роботу, щоб будь-хто міг продовжувати, якщо вони дійсно хочуть, ось тут (попередження, це нудно і дуже довго): http://lightning.memso.com/media/perm/ mandelbrot2.txt

Я використав пару регексів в EditPadPro, щоб знайти всі ; Final: ...записи у файлі та скинути їх у вигляді шістнадцяткових файлів у файл .com. Отриманий двійковий файл - це те, що ви бачите вгорі цієї публікації.


1
Машинний код не враховується. Якщо це враховується, будь-яка мова, що створює байт-код або машинний код, повинна бути коротшою. Я рахую 820, змінивши все на 1-символьні довгі імена.
Марк Єронімус

3
Я міг би передати код усією справою у двійковій формі, якщо це полегшить вам, але це було б як би попросити когось, хто використовує мову високого рівня, щоб не використовувати автоматичні конструкції, макроси і т. Д. Це ВСЕ, що ця збірка насправді є, лише купа макроси Отриманий бінарний файл для запуску повного JavaScript, Perl тощо включає бінарну бібліотеку. З ASM, кінцеве шістнадцяткове значення - все, бібліотеки, ВСІ КОДИ, включені.
Марк Ормстон

5
Ні. Я можу вручну перетворити ASM у бінарний, якщо це дійсно необхідно. Він вийде з тими самими 177 байтами, з якими допоміг мій асемблер. Отриманий код може бути вставлений будь-ким із двійковим редактором у новий файл, збережений 177 байт, і він буде працювати, як очікувалося. Мабуть, ТАК розділений на подання ASM, тому, можливо, вам слід уточнити, чи вважаєте ви, що це не враховується: meta.codegolf.stackexchange.com/questions/260/…
Марк

6
Добре, тож, щоб довести це дійсним записом, я витратив час, необхідний для перекладу цього на бінарне. Я відповідно оновив свою відповідь.
Марк Ормстон

7
Річ у тім, що немає компілятора з складанням. Ви просто використовуєте макроси. Скажіть, що це не враховується, це як сказати, що ви не можете використовувати жодних заздалегідь визначених #defineвисловлювань у C. Це просто забирає багато часу, щоб все вручну замінити.
Марк Ормстон

28

Ява, 505 405 324 байт

Просто стандартний розрахунок, а тепер гольф із додатковою гольфністю.

enter image description here

Гольф:

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)

Default Output

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

enter image description here

(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врятувало б вас ще кілька. (Також, чи є причина для створення полотна? Чи передбачає кодегольф певний рівень HTML?)
Меттью Вілкокссон

1
Ви можете записати document.createElement`canvas` і зберегти 2 байти. Те саме, що і getContext`2d` .
Ісмаїл Мігель

Я не припускав HTML Canvas, оскільки це чисте рішення JavaScript.
MT0

або ви можете "скинути" полотно взагалі, як тут,
Каміль Киечевський

19

J, 73 байти

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

mandelbrot set

Редагуйте , дещо пояснюючи:

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, але чи можна було б вам трохи пояснити, як працює цей код? Зокрема, мені цікаво знати, як (де в коді) він підбирає кольори?
планнапус

1
@MarkJeronimus, я можу зробити це 70, але я щось зберіг для ясності. Я, таким чином, взяв на себе ігнорувати НЧ під час підрахунку.
Ельвакс

@plannapus, добре, додав кілька коментарів. Вибір кольорів проводиться за допомогою (0,?$~99 3)якого виробляється 100 ргб трійників, по одному для кожного рівня. Через випадковість ви можете отримати менше 100 трійок, тому деякі рівні матимуть більш плавний перехід (але все-таки мають різні кольори).
Ельвекс

17

Математика, 214 191 215 19 30

З версії 10.0 є вбудований: (19 байт)

MandelbrotSetPlot[]

mandelbrot


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

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

m2


Ручний прокат:

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

green


{b, -2, 2, .01}, {a, -2, 2, .01}коротше і ближче до правил
Марк Єронімус

@MarkJeronimus Дякую Я використав запропонований діапазон для ітераційного зображення.
DavidC

У вас це було майже правильно, тоді ви зробили нутро не чорним. Останній кадр у GIF - всередині чорного кольору та дозволена відповідь. EDIT: і я рахую 195 байт.
Марк Єронімус

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

У вашому вбудованому рішенні використовується дуже вільна інтерпретація The fractal coordinates range from approximately -2-2i to 2+2i.
Джонатан Фрех

16

Python з Pylab + Numpy, 151 байт

Я не міг терпіти побачити не-DQ'ed Python запис, але я думаю, що я дійсно перевершив себе на цьому, і я знизив це до 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 чіткі попередження часу виконання, новий особистий рекорд!

enter image description here


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

Дивно. Чи включає 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). Яка саме ця версія?
Віктор Стафуса

це або 246, або 249
Марк Єронімус

@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 байт

Mandelbrot fractal picture

# 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 ідея фактично зберегла 10, дякую!
примо

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

@meawoppl ще 7: D
primo

Технічно заборонено: це не має жодної функції графічного виведення самого 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

The generated Mandelbrot set

>Символ на зображення стрімкий, і це автоматично після запуску програми.


Не потрібно складати сюжет двічі, просто перейдіть з більш неефективною версією. Не підтримує 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 ДОПОМОГАЄТЬ ЗНАЙТИ 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. Так, я такий дешевий.)

screenshot

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


10

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

MandelbrotSetPlot[]

MandelbrotSetPlot є новою функцією в Mathematica 10.0.

enter image description here


Як зручно, що ця вбудована функція просто відповідає всім моїм вимогам (крім місця розташування, яке можна встановити ще 13 символами). За винятком цього є стандартна лазівка.
Марк Єронімус

19
Код гольфу, як правило, виграють спеціалізовані мови з одно символьними лексемами або системами типу 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)

enter image description here

Редагувати: рішення на 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)

enter image description here


технічно чорний ззовні заборонений. Ви пропустили це чи це важко здійснити?
Марк Єронімус

@MarkJeronimus і те й інше :) Я спробую поглянути, як це зробити, але я не на 100% впевнений, що знайду спосіб зробити це чисто.
планнапус

@MarkJeronimus Готово!
планнапус

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

Розширено:

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


О, мааааан, я хотів це зробити. +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

Mandelbrot Golf

Для цього потрібна відповідна текстура палітри 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

Так, зараз набагато краще.
aschepler

+1 приємне і стисле рішення. Але співвідношення сторін не 1: 1 (пор. Правило № 2: вихід повинен бути квадратним).
планнапус

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

я думаю, що це був просто я, коли я нітрохаю :), ОП, здається, не має проблем з цим, оскільки він нічого не сказав.
планнапус

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 годин:

        b & w

Версія, яка буде працювати в 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 днів тому. Я не думаю, що я можу дозволити собі це повільніше: P
MD XF

5

gnuplot 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

неозорений:

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}повинен бути найсумнішим існуючим способом побудови складного числа.

На жаль, зображення: gnuplot mandelbrot

Встановіть ізопроби вище для кращої роздільної здатності. Можна сказати unset ticsі unset colorboxпро чистий образ, але я думаю, що ця версія кваліфікується просто чудово.


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

1
Ні, це не копіювальна паста. Це дуже пряма формула, і її навіть не потрібно було шукати. Однак я знайшов сторінки, які ви отримуєте під час пошуку, коли шукав кращий спосіб ініціалізації складних чисел (їх реалізація відрізняється, ну, настільки ж різною, як це може бути в цьому випадку). Дякую за пораду про реальну частину, вона працює. Закріплення.
Оріон

5

Матлаб (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)])це, можливо, прийнятно, але iffy.
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 байт завдяки скловолоконному коду Збережено 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.
стельовий кот

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

1
@ TaylorScott Я пам’ятаю RowHeightтрюк з повідомлення про рекомендації VBA і мав намір інтегрувати його після того, як я отримав усі мої гарні фотографії. Це був приємний шматочок, спасибі.
Інженер Тост

Я вважаю , що ви можете піти з видаленням інших байт шляхом заміни 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.