<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Flying memes &#187; Erlang</title>
	<atom:link href="http://sandropaganotti.com/tag/erlang/feed/" rel="self" type="application/rss+xml" />
	<link>http://sandropaganotti.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sun, 08 Jan 2012 16:00:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Alcune osservazioni sull&#8217;algoritmo di copertura di un segmento</title>
		<link>http://sandropaganotti.com/2009/07/31/alcune-osservazioni-sullalgoritmo-di-copertura-di-un-segmento/</link>
		<comments>http://sandropaganotti.com/2009/07/31/alcune-osservazioni-sullalgoritmo-di-copertura-di-un-segmento/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 22:09:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Algoritmi]]></category>
		<category><![CDATA[Copertura di un segmento]]></category>
		<category><![CDATA[Erlang]]></category>

		<guid isPermaLink="false">http://sandropaganotti.com/?p=182</guid>
		<description><![CDATA[Sembra che oramai si sia instaurata una sorta di simbiosi tra questo blog e quello di Eineki; questo articolo infatti trae spunto dal suo ultimo golf programming contest e dai due algoritmi che ho analizzato come candidati alla soluzione. Il problema da risolvere è abbastanza intuitivo; dato un set di segmenti identificati da coppie di [...]]]></description>
			<content:encoded><![CDATA[<p>Sembra che oramai si sia instaurata una sorta di simbiosi tra questo blog e quello di <a href="http://eineki.wordpress.com/">Eineki</a>; questo articolo infatti trae spunto dal suo ultimo golf programming contest e dai due algoritmi che ho analizzato come candidati alla soluzione.</p>
<p>Il problema da risolvere è abbastanza intuitivo; dato un set di segmenti identificati da coppie di interi [inizio, fine] bisogna fondere tra loro i segmenti che si sovrappongono.<br />
<span id="more-182"></span></p>
<p><strong>Primo Algoritmo: </strong></p>
<p>La mia prima idea (anche se <span style="text-decoration: line-through;">alcuni</span> molti credits vanno a <a href="http://nijiart.it/">Niji</a>) è stata quella di spostare ad uno ad uno i segmenti dal set di input a quello di output;  durante questa procedura ogni segmento che si sovrappone ai rimanenti del set di input viene fuso ed il risultato spostato in output. Alla fine di un intero ciclo di spostamento nel set di output trovano posto un numero di segmenti minore o uguale a quelli presenti nel set di input a seconda del numero di fusioni.</p>
<p>Con un numero di segmenti minore rispetto a quello del set di input l&#8217;algortimo procede ad un nuovo ciclo di spostamento, se invece il numero dei segmenti è lo stesso allora significa che non vi sono più fusioni da effettuare e che quindi quanto contenuto in output rappresenta il risultato definitivo.</p>
<p>Questo algoritmo, che in un primo momento mi era sembrato di una complessità non riducibile, si è invece rivelato computazionalmente molto più impegnativo del secondo, del quale ho tentato anche un implementazione in Erlang.</p>
<p><strong>Secondo Algoritmo:</strong></p>
<p>La differenza principale di questa procedura (per la quale devo ringraziare <a href="http://www.linkedin.com/pub/fabio-oneri/7/a32/a66">Fabio</a>) rispetto alla precedente è l&#8217;introduzione di un elemento di ordinamento che riassetta il set di input organizzando i segmenti come se fossero poggiati su di una immaginaria linea retta. A questo punto avendo tutti i segmenti ordinati (supponiamo che [A,B,C,D] siano 4 segmenti) è possibile confrontarli a coppie di due ( A e B, B e C, ecc..) fondendo la coppia quando necessario (se A e B si sovrappongono in B dovrà essere riportato il risultato della fusione tra i due).</p>
<p>L&#8217;implementazione che ho sviluppato è lungi dall&#8217;essere perfetta in quanto denota tutte le mie carenze nei confronti di Erlang, del quale stò cercando di apprendere i segreti, ma dovrebbe essere sufficiente a rendere l&#8217;idea:</p>
<pre><code>
-module(coverage).
-export([sort_cover/1]).
-import(lists,[sort/2,foldl/3]).

sort_cover(A) ->  lists:foldl(
	fun([E1,E2],[[H1,H2]|T]) ->
		if
		 	((E1 >= H1) and (E1 =< H2)) or ((E2 >= H1) and (E2 =< H2)) -> [[
				if
					E1 >= H1 -> H1;
					true	 -> E1
				end,
				if
					E2 >= H2 -> E2;
					true	 -> H2
				end
			]|T];

			true	->	[[E1,E2]|[[H1,H2]] ++ T]
		end
	end, [[-1,-1]],
	lists:sort( fun([K,I],[L,M]) -> (K < L) or ((K >= L) and (I =< M)) end, A)).
</code></pre>
<p>La caratteristica migliore di questo algoritmo è sicuramente la sua bassa complessità: O(nlogn); l'operazione computazionalmente più costosa è infatti il sort.</p>
]]></content:encoded>
			<wfw:commentRss>http://sandropaganotti.com/2009/07/31/alcune-osservazioni-sullalgoritmo-di-copertura-di-un-segmento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Golf Programming: permutazioni</title>
		<link>http://sandropaganotti.com/2009/06/28/golf-programming-permutazioni/</link>
		<comments>http://sandropaganotti.com/2009/06/28/golf-programming-permutazioni/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 10:27:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Golf Programming]]></category>
		<category><![CDATA[Permutazioni]]></category>
		<category><![CDATA[Tail Recursion]]></category>

		<guid isPermaLink="false">http://sandropaganotti.com/?p=170</guid>
		<description><![CDATA[Questa volta Eineki ci propone un quiz classico che però presenta sempre interessanti spunti: le permutazioni. Ecco la mia soluzione, sono 100 caratteri: def k(l,n);l==''?n:l.split(//).map{&#124;s&#124;k(l.sub(s,''),n+s)}end;p k((ARGV[0]&#124;&#124;"abcd"),'').flatten.uniq Per questa soluzione mi sono inspirato ad una bellissima funzione scritta in Erlang: permutation([]) -&#62; [[]]; permutation(L) -&#62; [[H&#124;T] &#124;&#124; H &#60;- L, T &#60;- permutation(L--[H])]. Vediamo un pò [...]]]></description>
			<content:encoded><![CDATA[<p>Questa volta <a href="http://eineki.wordpress.com">Eineki</a> ci propone un <a href="http://eineki.wordpress.com/2009/06/16/golf-programming-permutazioni/">quiz classico</a> che però presenta sempre interessanti spunti: le permutazioni.</p>
<p><span id="more-170"></span>Ecco la mia soluzione, sono 100 caratteri:</p>
<pre><code class="ruby">def k(l,n);l==''?n:l.split(//).map{|s|k(l.sub(s,''),n+s)}end;p k((ARGV[0]||"abcd"),'').flatten.uniq</code></pre>
<p>Per questa soluzione mi sono inspirato ad una bellissima funzione scritta in Erlang:</p>
<pre><code>permutation([]) -&gt; [[]];
permutation(L)  -&gt; [[H|T] || H &lt;- L, T &lt;- permutation(L--[H])].</code></pre>
<p>Vediamo un pò di orientarci con questa  particolare sintassi: Erlang utilizza dei pattern per descrivere quale &#8216;versione&#8217; della funzione utilizzare, in questo caso abbiamo due &#8216;permutation&#8217;, una che si attiva quando il parametro è una lista vuota e una quando non lo è.</p>
<p>Concentriamoci quindi sulla seconda riga:  il nome del costrutto che stiamo osservando si chiama &#8216;<a href="http://en.wikipedia.org/wiki/List_comprehension">List Comprehension</a>&#8216; ed il suo funzionamento è tutto basato nell&#8217;eseguire l&#8217;operazione a sinistra del doppio pipe &#8216;||&#8217; utilizzando i valori specificati nella parte destra.</p>
<p>Quindi nel nostro caso stiamo costruendo una lista di liste; notiamo infatti che a sinistra del doppio pipe risiede il costrutto classico di lista in Erlang:  [H|T]  ( H stà per Head e rappresenta il primo elemento della lista, T per tail e indica i rimanenti elementi della lista). Ma come vogliamo che sia costruita ognuna di queste liste ? La risposta è nella parte destra del List Comprehension:</p>
<ul>
<li>In H si alterneranno tutti gli elementi di L</li>
<li>In T, per ogni elemento di L, si alterneranno le liste derivanti dal calcolo delle permutazioni sulla lista L privata dell&#8217;elemento che è in H.</li>
</ul>
<p>In queste sede mi sono limitato ad una veloce overview sul funzionamento della funzione &#8216;permutation&#8217; in Erlang;  per chi intenedesse approfondire la tematica consiglio vivamente <a href="http://blogs.claritycon.com/blogs/peter_miller/archive/2007/10/14/3314.aspx">questo articolo</a> di <a href="http://www.linkedin.com/pub/peter-miller/7/a1/7b1">Peter Miller</a> che riesce a illustrare in modo molto comprensibile quanto io qui ho solo sommariamente spiegato.</p>
]]></content:encoded>
			<wfw:commentRss>http://sandropaganotti.com/2009/06/28/golf-programming-permutazioni/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

