<?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; Golf Programming</title>
	<atom:link href="http://sandropaganotti.com/tag/golf-programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://sandropaganotti.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sun, 25 Jul 2010 12:45:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<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>
		<item>
		<title>L&#8217;interessante spunto del Golf Programming</title>
		<link>http://sandropaganotti.com/2009/05/01/linteressante-spunto-del-golf-programming/</link>
		<comments>http://sandropaganotti.com/2009/05/01/linteressante-spunto-del-golf-programming/#comments</comments>
		<pubDate>Fri, 01 May 2009 13:09:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Algoritmi]]></category>
		<category><![CDATA[Golf Programming]]></category>

		<guid isPermaLink="false">http://sandropaganotti.com/?p=155</guid>
		<description><![CDATA[Stavo navigando tra i miei feed RSS quando ho trovato questo interessantissimo articolo, ovviamente non ho resistito all&#8217;idea di cercare di sviluppare una soluzione usando Ruby ed il minor numero di linee di codice possibile: puts (ARGV[0]&#124;&#124;"1").scan(/(#{('0+'..'9+').to_a.join('&#124;')})/).collect{&#124;e&#124; [e[0].size,e[0][0..0]]}.to_s Mi sento sufficentemente soddisfatto dal mio codice di 100 caratteri, soprattutto ho trovato molto potente l&#8217;utilizzo del [...]]]></description>
			<content:encoded><![CDATA[<p>Stavo navigando tra i miei feed RSS quando ho trovato <a href="http://eineki.wordpress.com/2009/04/30/golf-programming-veni-vidi-dixi/">questo interessantissimo articolo</a>, ovviamente non ho resistito all&#8217;idea di cercare di sviluppare una soluzione usando Ruby ed il minor numero di linee di codice possibile:</p>
<p><span id="more-155"></span></p>
<pre><code class="ruby">
puts (ARGV[0]||"1").scan(/(#{('0+'..'9+').to_a.join('|')})/).collect{|e| [e[0].size,e[0][0..0]]}.to_s
</code></pre>
<p>Mi sento sufficentemente soddisfatto dal mio codice di 100 caratteri, soprattutto ho trovato molto potente l&#8217;utilizzo del metodo <a href="http://www.ruby-doc.org/core/classes/REXML/Source.html#M005518">scan</a> per isolare gruppi di cifre consequenziali:</p>
<pre><code class="ruby">
"1112211134".scan(/(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)/)
=> [["111"], ["22"], ["111"], ["3"], ["4"]]
</code></pre>
<p>e l&#8217;utilizzo dei range per accorciare la stesura di questa espressione regolare:</p>
<pre><code class="ruby">
('0+'..'9+').to_a
=> ["0+", "1+", "2+", "3+", "4+", "5+", "6+", "7+", "8+", "9+"]
</code></pre>
<p>Concludo con un aprezzamento verso l&#8217;autore del blog <a href="http://eineki.wordpress.com/">Experimentalia</a> che ha saputo inventarsi una sfida di programmazione divertente ed impegnativa. </p>
]]></content:encoded>
			<wfw:commentRss>http://sandropaganotti.com/2009/05/01/linteressante-spunto-del-golf-programming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
