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" / >
2011-10-26 08:49:00 +00:00
< meta name = "keywords" content = "mandelbrot, haskell, ASCII, golfed" >
2011-07-10 11:06:37 +00:00
< 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/yannespositocomfr" / >
< 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]-->
< title > Mandelbrot avec haskell< / title >
< / head >
2011-10-18 22:30:00 +00:00
< body lang = "fr" class = "article" >
2011-07-10 11:06:37 +00:00
< script type = "text/javascript" > / / < ! [ C D A T A [
document.write('< div id = "blackpage" > < img src = "/Scratch/img/loading.gif" alt = "Chargement en cours..." / > < / div > ');
// ]]>
< / script >
< div id = "content" >
< div id = "choix" >
< div class = "return" > < a href = "#entete" > ↓ Menu ↓ < / a > < / div >
< div id = "choixlang" >
< a href = "/Scratch/en/blog/Haskell-Mandelbrot/" onclick = "setLanguage('en')" > in English< / a >
< / div >
2011-09-28 16:05:55 +00:00
< div class = "flush" > < / div >
2011-07-10 11:06:37 +00:00
< / div >
< div id = "titre" >
< h1 >
Mandelbrot avec haskell
< / h1 >
< / div >
< div class = "flush" > < / div >
< div class = "flush" > < / div >
< div id = "afterheader" >
< div class = "corps" >
2012-01-20 13:41:44 +00:00
< p > Voici le code “obfusqué” :< / p >
2011-07-10 11:06:37 +00:00
< div class = "code" > < div class = "file" > < a href = "/Scratch/fr/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)
2012-01-11 20:40:22 +00:00
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
2011-07-30 23:44:55 +00:00
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 > Pour le lancer, < a href = "http://haskell.org" > haskell< / a > doit être installé. Puis vous devez écrire dans un terminal :< / p >
< pre class = "twilight" > ghc --make animandel.hs < span class = "Keyword" > & & < / span > animandel
< / pre >
< p > Voici le résultat après 50 itérations.< / 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&
2012-01-11 20:40:22 +00:00
$$$$$$$$$& & & & & & & WWWOUbw ; oobCbl jUWW&
2011-07-30 23:44:55 +00:00
$$$$$$$& & & & & & & WWWWOcbi ij jUW& &
$$$$$& & WWWWWWWOwUUCbw WW& &
WWWOWWWWWWWWWUUbo UWWW& &
: wbUOWW& & &
WWWOWWWWWWWWWUUbo UWWW& &
$$$$$& & WWWWWWWOwUUCbw WW& &
$$$$$$$& & & & & & & WWWWOcbi ij jUW& &
2012-01-11 20:40:22 +00:00
$$$$$$$$$& & & & & & & WWWOUbw ; oobCbl jUWW&
2011-07-30 23:44:55 +00:00
$$$$$$$$$$$& & & & & 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)
2012-01-11 20:40:22 +00:00
< span class = "Entity" > real< / span > :: < span class = "Constant" > Complex< / span > -> < span class = "Constant" > Float< / span >
2011-07-30 23:44:55 +00:00
real (< span class = "Constant" > C< / span > (x,y)) = x
2012-01-11 20:40:22 +00:00
< span class = "Entity" > im< / span > :: < span class = "Constant" > Complex< / span > -> < span class = "Constant" > Float< / span >
2011-07-30 23:44:55 +00:00
im (< span class = "Constant" > C< / span > (x,y)) = y
2012-01-11 20:40:22 +00:00
< span class = "Entity" > cabs< / span > :: < span class = "Constant" > Complex< / span > -> < span class = "Constant" > Float< / span >
2011-07-30 23:44:55 +00:00
cabs = real.< span class = "Entity" > abs< / span >
2012-01-11 20:40:22 +00:00
< 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
2012-01-11 20:40:22 +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]]
2011-07-30 23:44:55 +00:00
< 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
2012-01-11 20:40:22 +00:00
< span class = "Entity" > mandel< / span > :: (< span class = "Constant" > Complex,Complex< / span > ) -> < span class = "Constant" > String< / span >
2011-07-30 23:44:55 +00:00
mandel (bottomleft,topright) = < span class = "Entity" > concat< / span > $ < span class = "Entity" > map< / span > treat $ bmandel bottomleft topright
< span class = "Keyword" > where< / span >
2012-01-11 20:40:22 +00:00
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
2011-07-30 23:44:55 +00:00
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
2012-01-11 20:40:22 +00:00
< span class = "Entity" > cdiv< / span > :: < span class = "Constant" > Complex< / span > -> < span class = "Constant" > Float< / span > -> < span class = "Constant" > Complex< / span >
2011-07-30 23:44:55 +00:00
cdiv (< span class = "Constant" > C< / span > (x,y)) r = < span class = "Constant" > C< / span > (x/r, y/r)
2012-01-11 20:40:22 +00:00
< span class = "Entity" > cmul< / span > :: < span class = "Constant" > Complex< / span > -> < span class = "Constant" > Float< / span > -> < span class = "Constant" > Complex< / span >
2011-07-30 23:44:55 +00:00
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
2012-01-11 20:40:22 +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 >
2012-01-11 20:40:22 +00:00
x < - < span class = "Entity" > getContents< / span >
2011-07-30 23:44:55 +00:00
< 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/yannespositocomfr" >
s'abonner
< / 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" > Commentaires< / div > ');
< / script >
< div class = "flush" > < / div >
< div class = "corps" id = "comment" >
< h2 class = "first" > commentaires< / h2 >
< noscript >
Vous devez activer javascript pour commenter.
< / noscript >
< script type = "text/javascript" >
var idcomments_acct = 'a307f0044511ff1b5cfca573fc0a52e7';
var idcomments_post_id = '/Scratch/fr/blog/Haskell-Mandelbrot/';
var idcomments_post_url = 'http://yannesposito.com/Scratch/fr/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/fr/" > Bienvenue< / a > < / li >
< li > < a href = "/Scratch/fr/blog/" > Blog< / a > < / li >
< li > < a href = "/Scratch/fr/softwares/" > Softwares< / a > < / li >
< li > < a href = "/Scratch/fr/about/" > À propos< / a > < / li > < / ul >
< / div >
< div class = "flush" > < / div >
< hr / >
< div id = "next_before_articles" >
< div id = "previous_articles" >
articles précédents
< div class = "previous_article" >
< a href = "/Scratch/fr/blog/Password-Management/" > < span class = "nicer" > «< / span > Password Management< / a >
< / div >
< div class = "previous_article" >
< a href = "/Scratch/fr/blog/2011-04-20-Now-hosted-on-github/" > < span class = "nicer" > «< / span > Hébergement github< / a >
< / div >
< div class = "previous_article" >
< a href = "/Scratch/fr/blog/2011-01-03-Why-I-sadly-won-t-use-coffeescript/" > < span class = "nicer" > «< / span > Pourquoi je n'utiliserai pas CoffeeScript (malheureusement)< / a >
< / div >
< / div >
< div id = "next_articles" >
articles suivants
2011-08-17 12:26:41 +00:00
< div class = "next_article" >
< a href = "/Scratch/fr/blog/A-more-convenient-diff/" > Un diff plus pratique < span class = "nicer" > »< / span > < / a >
< / div >
2011-07-10 11:06:37 +00:00
2011-08-24 22:33:06 +00:00
< div class = "next_article" >
2011-08-26 14:42:13 +00:00
< a href = "/Scratch/fr/blog/Learn-Vim-Progressively/" > Apprenez Vim Progressivement < span class = "nicer" > »< / span > < / a >
2011-08-24 22:33:06 +00:00
< / div >
2011-07-10 11:06:37 +00:00
2011-09-06 06:59:30 +00:00
< div class = "next_article" >
2011-09-30 08:16:57 +00:00
< a href = "/Scratch/fr/blog/programming-language-experience/" > Mon expérience avec les languages de programmation < span class = "nicer" > »< / span > < / a >
2011-09-06 06:59:30 +00:00
< / 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/deed.fr" > Droits de reproduction ©, Yann Esposito< / a >
< / div >
< div id = "lastmod" >
Écrit le : 10/07/2011
2011-11-16 12:14:39 +00:00
modifié le : 26/10/2011
2011-07-10 11:06:37 +00:00
< / div >
< div >
Site entièrement réalisé avec
< a href = "http://www.vim.org" > Vim< / a >
et
< a href = "http://nanoc.stoneship.org" > nanoc< / a >
< / div >
< div >
< a href = "/Scratch/fr/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/fr/blog/feed/feed.xml" > [rss]< / a >
< / div >
< / div >
< div class = "clear" > < / div >
< / div >
< / body >
< / html >