scratch/output/Scratch/en/blog/Haskell-Mandelbrot/index.html
Yann Esposito 70314df976 Recompiled
2012-05-02 17:43:56 +02:00

302 lines
No EOL
15 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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" />
<meta name="keywords" content="mandelbrot, haskell, ASCII, golfed">
<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/solarized.css" />
<link rel="stylesheet" type="text/css" href="/Scratch/css/idc.css" />
<link href='http://fonts.googleapis.com/css?family=Inconsolata' rel='stylesheet' type='text/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>
<script type="text/javascript" src="/Scratch/js/highlight/highlight.pack.js"></script>
<script type="text/javascript" src="/Scratch/js/article.js"></script>
<!--[if lt IE 9]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js"></script>
<![endif]-->
<title>ASCII Haskell Mandelbrot</title>
</head>
<body lang="en" class="article">
<script type="text/javascript">// <![CDATA[
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">&darr; Menu &darr;</a></div>
<div id="choixlang">
<a href="/Scratch/fr/blog/Haskell-Mandelbrot/" onclick="setLanguage('fr')">en Français</a>
</div>
<div class="flush"></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="codefile"><a href="/Scratch/en/blog/Haskell-Mandelbrot/code/animandel.hs">&#x27A5; animandel.hs</a></div>
<pre><code class="haskell">a=27;b=79;c=C(-2.0,-1.0);d=C(1.0,1.0);e=C(-2.501,-1.003)
newtype C = C (Double,Double) deriving (Show,Eq)
instance Num C where C(x,y)*C(z,t)=C(z*x-y*t,y*z+x*t);C(x,y)+C(z,t)=C(x+z,y+t);abs(C(x,y))=C(sqrt(x*x+y*y),0.0)
r(C(x,y))=x;i(C(x,y))=y
f c z 0=0;f c z n=if(r(abs(z))&gt;2)then n else f c ((z*z)+c) (n-1)
h j k = map (\z-&gt;(f (C z) (C(0,0)) 32,(fst z&gt;l - q/2))) [(x,y)|y&lt;-[p,(p+((o-p)/a))..o],x&lt;-[m,(m + q)..l]] where o=i k;p=i j;m=r j;l=r k;q=(l-m)/b
u j k = concat $ map v $ h j k where v (i,p)=(" .,`'°\":;-+oO0123456789=!%*§&amp;$@#"!!i):rst p;rst True="\n";rst False=""
main = putStrLn $ im 0 where cl n (C (x,y))=let cs=(1.1**n-1) in C ((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)++"\x1b[H\x1b[25A"++im (n+1)
</code></pre>
<p>To launch it, youll need to have <a href="http://haskell.org">haskell</a> installed and to run:</p>
<pre><code class="zsh">ghc --make animandel.hs &amp;&amp; animandel</code></pre>
<p>Here is some image after 50 iterations:</p>
<pre>
###@@@@@@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&amp;&amp;&amp;&amp;&amp;WWOOClbUOWW&amp;&amp;$$$$$$$$$$$$$$
##@@@@@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&amp;&amp;&amp;&amp;&WWUCUb; ,jUOWW&amp;&amp;&amp;$$$$$$$$$$$$
#@@@@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&amp;&amp;&amp;WWWWWUb ooCWW&amp;&amp;&amp;&amp;&amp;&amp;$$$$$$$$
@@@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&amp;&amp;WWWWWWWWOU uUOWWWW&amp;&amp;&amp;&amp;&amp;&amp;$$$$$
@@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&amp;&amp;&amp;WOUObUOOOUUUCbi rbCUUUOWWWWWOUW&amp;$$$
@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&amp;&amp;&amp;&amp;&amp;&amp;WWWUcr,iiCb o wUUUUUC;OW&amp;$$
$$$$$$$$$$$$$$$$$$$$$$$$$$&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;WWWWOUC, j llW&amp;&amp;$
$$$$$$$$$$$$$$$$$$$$$&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;WWWWWWOCCbi bWWW&amp;&amp;
$$$$$$$$$$$$$$$$$&amp;&amp;WWWWWWW&amp;&amp;&amp;WWWWWWWWOUo jUOWW&amp;&amp;
$$$$$$$$$$$$$$&amp;&amp;&amp;WWOwOOWWWOUUOWWWWWOOUbw j.blW&amp;
$$$$$$$$$$$&amp;&amp;&amp;&amp;&amp;WWWObiijbUCl bCiUUUUUCj, bOW&amp;
$$$$$$$$$&amp;&amp;&amp;&amp;&amp;&amp;&amp;WWWOUbw ; oobCbl jUWW&amp;
$$$$$$$&amp;&amp;&amp;&amp;&amp;&amp;&amp;WWWWOcbi ij jUW&amp;&amp;
$$$$$&amp;&amp;WWWWWWWOwUUCbw WW&amp;&amp;
WWWOWWWWWWWWWUUbo UWWW&amp;&amp;
: wbUOWW&amp;&amp;&amp;
WWWOWWWWWWWWWUUbo UWWW&amp;&amp;
$$$$$&amp;&amp;WWWWWWWOwUUCbw WW&amp;&amp;
$$$$$$$&amp;&amp;&amp;&amp;&amp;&amp;&amp;WWWWOcbi ij jUW&amp;&amp;
$$$$$$$$$&amp;&amp;&amp;&amp;&amp;&amp;&amp;WWWOUbw ; oobCbl jUWW&amp;
$$$$$$$$$$$&amp;&amp;&amp;&amp;&amp;WWWObiijbUCl bCiUUUUUCj, bOW&amp;
$$$$$$$$$$$$$$&amp;&amp;&amp;WWOwOOWWWOUUOWWWWWOOUbw j.blW&amp;
$$$$$$$$$$$$$$$$$&amp;&amp;WWWWWWW&amp;&amp;&amp;WWWWWWWWOUo jUOWW&amp;&amp;
$$$$$$$$$$$$$$$$$$$$$&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;WWWWWWOCCbi bWWW&amp;&amp;
$$$$$$$$$$$$$$$$$$$$$$$$$$&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;WWWWOUC, j llW&amp;&amp;$
@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&amp;&amp;&amp;&amp;&amp;&amp;WWWUcr,iiCb o wUUUUUC;OW&amp;$$
</pre>
<p>Here is the more readable version. I believe with this far more readable version, no more explanation is needed.</p>
<pre><code class="haskell">nbvert = 30
nbhor = 79
zoomfactor = 1.01
init_bottom_left = C (-2.0,-2.0)
init_top_right = C (3.0,2.0)
interrest = C (-1.713,-0.000)
newtype Complex = C (Float,Float) deriving (Show,Eq)
instance Num Complex where
fromInteger n = C (fromIntegral n,0.0)
C (x,y) * C (z,t) = C (z*x - y*t, y*z + x*t)
C (x,y) + C (z,t) = C (x+z, y+t)
abs (C (x,y)) = C (sqrt (x*x + y*y),0.0)
signum (C (x,y)) = C (signum x , 0.0)
real :: Complex -&gt; Float
real (C (x,y)) = x
im :: Complex -&gt; Float
im (C (x,y)) = y
cabs :: Complex -&gt; Float
cabs = real.abs
f :: Complex -&gt; Complex -&gt; Int -&gt; Int
f c z 0 = 0
f c z n = if (cabs z &gt; 2) then n else f c ((z*z)+c) (n-1)
bmandel bottomleft topright = map (\z -&gt; (f (C z) (C(0,0)) 32, (fst z &gt; right - hstep/2 ))) [(x,y) | y &lt;- [bottom,(bottom + vstep)..top], x&lt;-[left,(left + hstep)..right]]
where
top = im topright
bottom = im bottomleft
left = real bottomleft
right = real topright
vstep=(top-bottom)/nbvert
hstep=(right-left)/nbhor
mandel :: (Complex,Complex) -&gt; String
mandel (bottomleft,topright) = concat $ map treat $ bmandel bottomleft topright
where
treat (i,jump) = " .,:;rcuowijlbCUOW&amp;$@#" !! (div (i*22) 32):rst jump
rst True = "\n"
rst False = ""
cdiv :: Complex -&gt; Float -&gt; Complex
cdiv (C(x,y)) r = C(x/r, y/r)
cmul :: Complex -&gt; Float -&gt; Complex
cmul (C(x,y)) r = C(x*r, y*r)
zoom :: Complex -&gt; Complex -&gt; Complex -&gt; Float -&gt; (Complex,Complex)
zoom bl tr center magn = (f bl, f tr)
where
f point = ((center `cmul` magn) + point ) `cdiv` (magn + 1)
main = do
x &lt;- getContents
putStrLn $ infinitemandel 0
where
window n = zoom init_bottom_left init_top_right interrest (zoomfactor**n)
infinitemandel n = mandel (window n) ++ "\x1b[H\x1b[25A" ++ infinitemandel (n+1)
</code></pre>
</div>
<div id="social">
<div class="left"> <a href="https://twitter.com/share" class="twitter-share-button" data-via="yogsototh">Tweet</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
</div>
<div class="left"> <div class="g-plusone" data-size="medium" data-annotation="inline" data-width="106"></div>
<script type="text/javascript">
(function() {
var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
po.src = 'https://apis.google.com/js/plusone.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
})();
</script>
</div>
<div class="flush"></div>
</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 &amp; Share</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>&nbsp;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>&nbsp;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>&nbsp;Why I won't use CoffeeScript (sadly)</a>
</div>
</div>
<div id="next_articles">
next entries
<div class="next_article">
<a href="/Scratch/en/blog/A-more-convenient-diff/">A more convenient diff&nbsp;<span class="nicer">»</span></a>
</div>
<div class="next_article">
<a href="/Scratch/en/blog/Learn-Vim-Progressively/">Learn Vim Progressively&nbsp;<span class="nicer">»</span></a>
</div>
<div class="next_article">
<a href="/Scratch/en/blog/programming-language-experience/">Programming Language Experience&nbsp;<span class="nicer">»</span></a>
</div>
</div>
<div class="flush"></div>
</div>
</div>
<div id="bottom">
<div>
<a href="https://twitter.com/yogsototh">Follow @yogsototh</a>
</div>
<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
Modified: 10/26/2011
</div>
<div>
Entirely done with
<a href="http://www.vim.org">Vim</a>
and
<a href="http://nanoc.stoneship.org">nanoc</a>
</div>
</div>
<div class="clear"></div>
</div>
</body>
</html>