## mandelbrot

Wed, 20 Apr 2011 11:29 categories: blogA very nice minimal code size implementation of the Mandelbrot algorithm by Ken Peril I found here

main(k){float i,j,r,x,y=-16;while(puts(""),y++<15)for(x

=0;x++<84;putchar(" .:-;!/>)|&IH%*#"[k&15]))for(i=k=r=0;

j=r*r-i*i-2+x/25,i=2*r*i+y/10,j*j+i*i<11&&k++<111;r=j);}

It is very interesting to see what techniques where applied to minimize the amount of source code bytes. When I tried out the code, not knowing what pattern it would output I was very find to see a Mandelbrot pattern printed to my terminal :)

The code translates to this which outputs the exact same bytes:

#include <stdio.h>

int main(int argc, char **argv)

{

int k,x,y;

float i,j,r;

char *chars;

chars = " .:-;!/>)|&IH%*#";

for(y=-15;y<16;y++) {

puts("");

for(x=1;x<=84;x++) {

i=0;

r=0;

for(k=0;k<112;k++) {

j=r*r-i*i-2+x/25.0f;

i=2*r*i+y/10.0f;

if (j*j+i*i>=11) {

break;

}

r=j;

}

putchar(chars[k&15]);

}

}

puts("");

return 0;

}

y and x iterate over rows and colums on the terminal. They are scaled by 1/25
and 1/10 respectively. 112 is the maximum iteration number and only has the
requirement of being divisible by 16 (the number of characters for the ascii
art). A difference to the original algorithm is the -2 in calculating j but
this is just to shift the x values to the right on output. Alternatively one
could also just iterate x eg from -50 to 34 instead from 1 to 84 which would
give a similar output. To compensate for the shift and to also draw points
close to the border 11 was chosen as a good stopping criterion for beautiful
output. Normally one would check for j*j+i*i being less than or equal to 4 but
this would mean that for border points the algorithm would terminate in the 1st
iteration, painting those points the same as the ones that do not lie in the
Mandelbrot set.