2011-07-10 11:06:37 +00:00
<?xml version="1.0" encoding="utf-8"?>
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" lang = "fr" xml:lang = "fr" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" / >
< link rel = "shortcut icon" type = "image/x-icon" href = "/Scratch/img/favicon.ico" / >
< link rel = "stylesheet" type = "text/css" href = "/Scratch/assets/css/main.css" / >
< link rel = "stylesheet" type = "text/css" href = "/Scratch/css/twilight.css" / >
< link rel = "stylesheet" type = "text/css" href = "/Scratch/css/idc.css" / >
< link rel = "alternate" type = "application/rss+xml" title = "RSS" href = "http://feeds.feedburner.com/yannespositocomen" / >
< link rel = "alternate" lang = "fr" xml:lang = "fr" title = "Mandelbrot avec haskell" type = "text/html" hreflang = "fr" href = "/Scratch/fr/blog/Haskell-Mandelbrot/" / >
< link rel = "alternate" lang = "en" xml:lang = "en" title = "ASCII Haskell Mandelbrot" type = "text/html" hreflang = "en" href = "/Scratch/en/blog/Haskell-Mandelbrot/" / >
< script type = "text/javascript" src = "/Scratch/js/jquery-1.3.1.min.js" > < / script >
< script type = "text/javascript" src = "/Scratch/js/jquery.cookie.js" > < / script >
< script type = "text/javascript" src = "/Scratch/js/index.js" > < / script >
<!-- [if lt IE 9]>
< script src = "http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js" > < / script >
<![endif]-->
<!-- < % if containMaths %>
< script type = "text/javascript" src = "/Scratch/js/MathJax/MathJax.js" > < / script >
< % end %>
-->
< title > ASCII Haskell Mandelbrot< / title >
< / head >
< body lang = "en" >
< script type = "text/javascript" > / / < ! [ C D A T A [
document.write('< div id = "blackpage" > < img src = "/Scratch/img/loading.gif" alt = "loading..." / > < / div > ');
// ]]>
< / script >
< div id = "content" >
< div id = "choix" >
< div class = "return" > < a href = "#entete" > ↓ Menu ↓ < / a > < / div >
< div id = "choixlang" >
< a href = "/Scratch/fr/blog/Haskell-Mandelbrot/" onclick = "setLanguage('fr')" > en Français< / a >
< / div >
< / div >
< div id = "titre" >
< h1 >
ASCII Haskell Mandelbrot
< / h1 >
< / div >
< div class = "flush" > < / div >
< div class = "flush" > < / div >
< div id = "afterheader" >
< div class = "corps" >
< p > Here is the obfuscated code:< / p >
< div class = "code" > < div class = "file" > < a href = "/Scratch/en/blog/Haskell-Mandelbrot/code/animandel.hs" > ➥ animandel.hs < / a > < / div > < div class = "withfile" >
< pre class = "twilight" >
2011-07-30 23:44:55 +00:00
a=27;b=79;c=< span class = "Constant" > C< / span > (-2.0,-1.0);d=< span class = "Constant" > C< / span > (1.0,1.0);e=< span class = "Constant" > C< / span > (-2.501,-1.003)
< span class = "Keyword" > newtype< / span > < span class = "Constant" > C< / span > = < span class = "Constant" > C< / span > (< span class = "Constant" > Double< / span > ,< span class = "Constant" > Double< / span > ) < span class = "Keyword" > deriving< / span > (< span class = "Constant" > Show< / span > ,< span class = "Constant" > Eq< / span > )
< span class = "Keyword" > instance< / span > < span class = "Constant" > Num< / span > < span class = "Constant" > C< / span > < span class = "Keyword" > where< / span > < span class = "Constant" > C< / span > (x,y)*< span class = "Constant" > C< / span > (z,t)=< span class = "Constant" > C< / span > (z*x-y*t,y*z+x*t);< span class = "Constant" > C< / span > (x,y)+< span class = "Constant" > C< / span > (z,t)=< span class = "Constant" > C< / span > (x+z,y+t);< span class = "Entity" > abs< / span > (< span class = "Constant" > C< / span > (x,y))=< span class = "Constant" > C< / span > (< span class = "Entity" > sqrt< / span > (x*x+y*y),0.0)
r(< span class = "Constant" > C< / span > (x,y))=x;i(< span class = "Constant" > C< / span > (x,y))=y
f c z 0=0;f c z n=< span class = "Keyword" > if< / span > (r(< span class = "Entity" > abs< / span > (z))> 2)< span class = "Keyword" > then< / span > n < span class = "Keyword" > else< / span > f c ((z*z)+c) (n-1)
h j k = < span class = "Entity" > map< / span > (\z→ (f (< span class = "Constant" > C< / span > z) (< span class = "Constant" > C< / span > (0,0)) 32,(< span class = "Entity" > fst< / span > z> l - q/2))) [(x,y)|y← [p,(p+((o-p)/a))..o],x← [m,(m + q)..l]] < span class = "Keyword" > where< / span > o=i k;p=i j;m=r j;l=r k;q=(l-m)/b
u j k = < span class = "Entity" > concat< / span > $ < span class = "Entity" > map< / span > v $ h j k < span class = "Keyword" > where< / span > v (i,p)=(< span class = "String" > < span class = "String" > " < / span > .,`'°< span class = "StringConstant" > \" < / span > :;-+oO0123456789=!%*§& $@#< span class = "String" > " < / span > < / span > !!i):rst p;rst < span class = "Constant" > True< / span > =< span class = "String" > < span class = "String" > " < / span > < span class = "StringConstant" > \n< / span > < span class = "String" > " < / span > < / span > ;rst < span class = "Constant" > False< / span > =< span class = "String" > < span class = "String" > " < / span > < span class = "String" > " < / span > < / span >
main = < span class = "Entity" > putStrLn< / span > $ im 0 < span class = "Keyword" > where< / span > cl n (< span class = "Constant" > C< / span > (x,y))=< span class = "Keyword" > let< / span > cs=(1.1**n-1) < span class = "Keyword" > in< / span > < span class = "Constant" > C< / span > ((x+cs*(r e))/cs+1,(y+cs*(i e))/cs+1);bl n=cl n c;tr n=cl n d;im n=u (bl n) (tr n)++< span class = "String" > < span class = "String" > " < / span > < span class = "StringConstant" > \x< / span > 1b[H< span class = "StringConstant" > \x< / span > 1b[25A< span class = "String" > " < / span > < / span > ++im (n+1)
2011-07-10 11:06:37 +00:00
< / pre >
< / div > < / div >
< p > To launch it, you’ ll need to have < a href = "http://haskell.org" > haskell< / a > installed and to run:< / p >
< pre class = "twilight" > ghc --make animandel.hs < span class = "Keyword" > & & < / span > animandel
< / pre >
< p > Here is some image after 50 iterations:< / p >
2011-07-30 23:44:55 +00:00
< pre >
###@@@@@@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$& & & & & WWOOClbUOWW& & $$$$$$$$$$$$$$
##@@@@@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$& & & & &WWUCUb; ,jUOWW& & & $$$$$$$$$$$$
#@@@@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$& & & WWWWWUb ooCWW& & & & & & $$$$$$$$
@@@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$& & WWWWWWWWOU uUOWWWW& & & & & & $$$$$
@@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$& & & WOUObUOOOUUUCbi rbCUUUOWWWWWOUW& $$$
@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$& & & & & & WWWUcr,iiCb o wUUUUUC;OW& $$
$$$$$$$$$$$$$$$$$$$$$$$$$$& & & & & & & & & & WWWWOUC, j llW& & $
$$$$$$$$$$$$$$$$$$$$$& & & & & & & & & & & & WWWWWWOCCbi bWWW& &
$$$$$$$$$$$$$$$$$& & WWWWWWW& & & WWWWWWWWOUo jUOWW& &
$$$$$$$$$$$$$$& & & WWOwOOWWWOUUOWWWWWOOUbw j.blW&
$$$$$$$$$$$& & & & & WWWObiijbUCl bCiUUUUUCj, bOW&
$$$$$$$$$& & & & & & & WWWOUbw ; oobCbl jUWW&
$$$$$$$& & & & & & & WWWWOcbi ij jUW& &
$$$$$& & WWWWWWWOwUUCbw WW& &
WWWOWWWWWWWWWUUbo UWWW& &
: wbUOWW& & &
WWWOWWWWWWWWWUUbo UWWW& &
$$$$$& & WWWWWWWOwUUCbw WW& &
$$$$$$$& & & & & & & WWWWOcbi ij jUW& &
$$$$$$$$$& & & & & & & WWWOUbw ; oobCbl jUWW&
$$$$$$$$$$$& & & & & WWWObiijbUCl bCiUUUUUCj, bOW&
$$$$$$$$$$$$$$& & & WWOwOOWWWOUUOWWWWWOOUbw j.blW&
$$$$$$$$$$$$$$$$$& & WWWWWWW& & & WWWWWWWWOUo jUOWW& &
$$$$$$$$$$$$$$$$$$$$$& & & & & & & & & & & & WWWWWWOCCbi bWWW& &
$$$$$$$$$$$$$$$$$$$$$$$$$$& & & & & & & & & & WWWWOUC, j llW& & $
@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$& & & & & & WWWUcr,iiCb o wUUUUUC;OW& $$
2011-07-10 11:06:37 +00:00
< / pre >
< p > Here is the more readable version. I believe with this far more readable version, no more explanation is needed.< / p >
< pre class = "twilight" >
2011-07-12 14:52:43 +00:00
nbvert = 30
2011-07-10 11:06:37 +00:00
nbhor = 79
2011-07-12 14:52:43 +00:00
zoomfactor = 1.01
2011-07-30 23:44:55 +00:00
init_bottom_left = < span class = "Constant" > C< / span > (-2.0,-2.0)
init_top_right = < span class = "Constant" > C< / span > (3.0,2.0)
interrest = < span class = "Constant" > C< / span > (-1.713,-0.000)
< span class = "Keyword" > newtype< / span > < span class = "Constant" > Complex< / span > = < span class = "Constant" > C< / span > (< span class = "Constant" > Float< / span > ,< span class = "Constant" > Float< / span > ) < span class = "Keyword" > deriving< / span > (< span class = "Constant" > Show< / span > ,< span class = "Constant" > Eq< / span > )
< span class = "Keyword" > instance< / span > < span class = "Constant" > Num< / span > < span class = "Constant" > Complex< / span > < span class = "Keyword" > where< / span >
< span class = "Entity" > fromInteger< / span > n = < span class = "Constant" > C< / span > (< span class = "Entity" > fromIntegral< / span > n,0.0)
< span class = "Constant" > C< / span > (x,y) * < span class = "Constant" > C< / span > (z,t) = < span class = "Constant" > C< / span > (z*x - y*t, y*z + x*t)
< span class = "Constant" > C< / span > (x,y) + < span class = "Constant" > C< / span > (z,t) = < span class = "Constant" > C< / span > (x+z, y+t)
< span class = "Entity" > abs< / span > (< span class = "Constant" > C< / span > (x,y)) = < span class = "Constant" > C< / span > (< span class = "Entity" > sqrt< / span > (x*x + y*y),0.0)
< span class = "Entity" > signum< / span > (< span class = "Constant" > C< / span > (x,y)) = < span class = "Constant" > C< / span > (< span class = "Entity" > signum< / span > x , 0.0)
< span class = "Entity" > real< / span > :: < span class = "Constant" > Complex< / span > → < span class = "Constant" > Float< / span >
real (< span class = "Constant" > C< / span > (x,y)) = x
< span class = "Entity" > im< / span > :: < span class = "Constant" > Complex< / span > → < span class = "Constant" > Float< / span >
im (< span class = "Constant" > C< / span > (x,y)) = y
< span class = "Entity" > cabs< / span > :: < span class = "Constant" > Complex< / span > → < span class = "Constant" > Float< / span >
cabs = real.< span class = "Entity" > abs< / span >
< span class = "Entity" > f< / span > :: < span class = "Constant" > Complex< / span > → < span class = "Constant" > Complex< / span > → < span class = "Constant" > Int< / span > → < span class = "Constant" > Int< / span >
2011-07-12 14:52:43 +00:00
f c z 0 = 0
2011-07-30 23:44:55 +00:00
f c z n = < span class = "Keyword" > if< / span > (cabs z > 2) < span class = "Keyword" > then< / span > n < span class = "Keyword" > else< / span > f c ((z*z)+c) (n-1)
2011-07-12 14:52:43 +00:00
2011-07-10 11:06:37 +00:00
2011-07-30 23:44:55 +00:00
bmandel bottomleft topright = < span class = "Entity" > map< / span > (\z → (f (< span class = "Constant" > C< / span > z) (< span class = "Constant" > C< / span > (0,0)) 32, (< span class = "Entity" > fst< / span > z > right - hstep/2 ))) [(x,y) | y ← [bottom,(bottom + vstep)..top], x← [left,(left + hstep)..right]]
< span class = "Keyword" > where< / span >
2011-07-10 11:06:37 +00:00
top = im topright
bottom = im bottomleft
left = real bottomleft
right = real topright
vstep=(top-bottom)/nbvert
hstep=(right-left)/nbhor
2011-07-30 23:44:55 +00:00
< span class = "Entity" > mandel< / span > :: (< span class = "Constant" > Complex,Complex< / span > ) → < span class = "Constant" > String< / span >
mandel (bottomleft,topright) = < span class = "Entity" > concat< / span > $ < span class = "Entity" > map< / span > treat $ bmandel bottomleft topright
< span class = "Keyword" > where< / span >
treat (i,jump) = < span class = "String" > < span class = "String" > " < / span > .,:;rcuowijlbCUOW& $@#< span class = "String" > " < / span > < / span > !! (< span class = "Entity" > div< / span > (i*22) 32):rst jump
rst < span class = "Constant" > True< / span > = < span class = "String" > < span class = "String" > " < / span > < span class = "StringConstant" > \n< / span > < span class = "String" > " < / span > < / span >
rst < span class = "Constant" > False< / span > = < span class = "String" > < span class = "String" > " < / span > < span class = "String" > " < / span > < / span >
2011-07-10 11:06:37 +00:00
2011-07-30 23:44:55 +00:00
< span class = "Entity" > cdiv< / span > :: < span class = "Constant" > Complex< / span > → < span class = "Constant" > Float< / span > → < span class = "Constant" > Complex< / span >
cdiv (< span class = "Constant" > C< / span > (x,y)) r = < span class = "Constant" > C< / span > (x/r, y/r)
< span class = "Entity" > cmul< / span > :: < span class = "Constant" > Complex< / span > → < span class = "Constant" > Float< / span > → < span class = "Constant" > Complex< / span >
cmul (< span class = "Constant" > C< / span > (x,y)) r = < span class = "Constant" > C< / span > (x*r, y*r)
2011-07-12 14:52:43 +00:00
2011-07-30 23:44:55 +00:00
< span class = "Entity" > zoom< / span > :: < span class = "Constant" > Complex< / span > → < span class = "Constant" > Complex< / span > → < span class = "Constant" > Complex< / span > → < span class = "Constant" > Float< / span > → (< span class = "Constant" > Complex,Complex< / span > )
2011-07-12 14:52:43 +00:00
zoom bl tr center magn = (f bl, f tr)
2011-07-30 23:44:55 +00:00
< span class = "Keyword" > where< / span >
f point = ((center < span class = "Entity" > < span class = "Entity" > `< / span > cmul` magn) + point ) `cdiv< span class = "Entity" > `< / span > < / span > (magn + 1)
2011-07-12 14:52:43 +00:00
2011-07-10 11:06:37 +00:00
main = < span class = "Keyword" > do< / span >
2011-07-30 23:44:55 +00:00
x ← < span class = "Entity" > getContents< / span >
< span class = "Entity" > putStrLn< / span > $ infinitemandel 0
< span class = "Keyword" > where< / span >
2011-07-12 14:52:43 +00:00
window n = zoom init_bottom_left init_top_right interrest (zoomfactor**n)
2011-07-30 23:44:55 +00:00
infinitemandel n = mandel (window n) ++ < span class = "String" > < span class = "String" > " < / span > < span class = "StringConstant" > \x< / span > 1b[H< span class = "StringConstant" > \x< / span > 1b[25A< span class = "String" > " < / span > < / span > ++ infinitemandel (n+1)
2011-07-10 11:06:37 +00:00
< / pre >
< / div >
< div id = "choixrss" >
< a id = "rss" href = "http://feeds.feedburner.com/yannespositocomen" >
Subscribe
< / a >
< / div >
< script type = "text/javascript" >
$(document).ready(function(){
$('#comment').hide();
$('#clickcomment').click(showComments);
});
function showComments() {
$('#comment').show();
$('#clickcomment').fadeOut();
}
document.write('< div id = "clickcomment" > Comments< / div > ');
< / script >
< div class = "flush" > < / div >
< div class = "corps" id = "comment" >
< h2 class = "first" > comments< / h2 >
< noscript >
You must enable javascript to comment.
< / noscript >
< script type = "text/javascript" >
var idcomments_acct = 'a307f0044511ff1b5cfca573fc0a52e7';
var idcomments_post_id = '/Scratch/en/blog/Haskell-Mandelbrot/';
var idcomments_post_url = 'http://yannesposito.com/Scratch/en/blog/Haskell-Mandelbrot/';
< / script >
< span id = "IDCommentsPostTitle" style = "display:none" > < / span >
< script type = 'text/javascript' src = '/Scratch/js/genericCommentWrapperV2.js' > < / script >
< / div >
< div id = "entete" class = "corps_spaced" >
< div id = "liens" >
< ul > < li > < a href = "/Scratch/en/" > Home< / a > < / li >
< li > < a href = "/Scratch/en/blog/" > Blog< / a > < / li >
< li > < a href = "/Scratch/en/softwares/" > Softwares< / a > < / li >
< li > < a href = "/Scratch/en/about/" > About< / a > < / li > < / ul >
< / div >
< div class = "flush" > < / div >
< hr / >
< div id = "next_before_articles" >
< div id = "previous_articles" >
previous entries
< div class = "previous_article" >
< a href = "/Scratch/en/blog/Password-Management/" > < span class = "nicer" > «< / span > 40 character's passwords< / a >
< / div >
< div class = "previous_article" >
< a href = "/Scratch/en/blog/2011-04-20-Now-hosted-on-github/" > < span class = "nicer" > «< / span > Now hosted on github< / a >
< / div >
< div class = "previous_article" >
< a href = "/Scratch/en/blog/2011-01-03-Why-I-sadly-won-t-use-coffeescript/" > < span class = "nicer" > «< / span > Why I won't use CoffeeScript (sadly)< / a >
< / div >
< / div >
< div id = "next_articles" >
next entries
2011-08-17 12:26:41 +00:00
< div class = "next_article" >
< a href = "/Scratch/en/blog/A-more-convenient-diff/" > A more convenient diff < span class = "nicer" > »< / span > < / a >
< / div >
2011-07-10 11:06:37 +00:00
< / div >
< div class = "flush" > < / div >
< / div >
< / div >
< div id = "bottom" >
< div >
< a rel = "license" href = "http://creativecommons.org/licenses/by-sa/3.0/" > Copyright ©, Yann Esposito< / a >
< / div >
< div id = "lastmod" >
Created: 07/10/2011
2011-07-30 23:46:33 +00:00
Modified: 07/31/2011
2011-07-10 11:06:37 +00:00
< / div >
< div >
Entirely done with
< a href = "http://www.vim.org" > Vim< / a >
and
< a href = "http://nanoc.stoneship.org" > nanoc< / a >
< / div >
< div >
< a href = "/Scratch/en/validation/" > Validation< / a >
< a href = "http://validator.w3.org/check?uri=referer" > [xhtml] < / a >
.
< a href = "http://jigsaw.w3.org/css-validator/check/referer?profile=css3" > [css] < / a >
.
< a href = "http://validator.w3.org/feed/check.cgi?url=http%3A//yannesposito.com/Scratch/en/blog/feed/feed.xml" > [rss]< / a >
< / div >
< / div >
< div class = "clear" > < / div >
< / div >
< script type = "text/javascript" >
var clicky = { log: function(){ return; }, goal: function(){ return; }};
var clicky_site_id = 66374971;
(function() {
var s = document.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = ( document.location.protocol == 'https:' ? 'https://static.getclicky.com/js' : 'http://static.getclicky.com/js' );
( document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0] ).appendChild( s );
})();
< / script >
< noscript > < p > < img alt = "Clicky" width = "1" height = "1" src = "http://in.getclicky.com/66374971ns.gif" / > < / p > < / noscript >
< / body >
< / html >