Experimentalia

Appunti raminghi

Golf programming: veni vidi dixi

with 8 comments

Se le mie reminiscenze di latino non mi ingannano veni, vidi, dixi dovrebbe essere la parafrasi del ben più famoso detto di Giulio Cesare.

Proseguiamo con il golf programming con un nuovo problema da risolvere. Le regole sono uguali a quelle dell’altra volta:

  1. Scrivere un programma, il più breve possibile, che risolva il problema enunciato prima e riportato meglio qui sotto;
  2. per ogni linguaggio utilizzato è considerato vincitore il programma scritto usando meno di caratteri;
  3. l’efficienza dell’algoritmo non è un fattore fondamentale ma il programma deve terminare senza errori;
  4. si può optare, se più concisa, per una funzione, piuttosto che un programma intero;
  5. ovviamente non di vince niente se non la soddisfazione di aver accettato una sfida ed averla vinta.

L’algoritmo

L’algoritmo da implementare deve, dato un numero, calcolare il successivo termine della sequenza look and say, una particolare successione matematica costruita descrivendo i diversi termini. Un esempio servirà a chiarire tutto meglio di una descrizione formale; scriviamo i primi cinque membri della successione che comincia con 1:

1, 11, 21, 1211, 111221, …

il primo termine è il seme della sequenza ed è scelto senza nessun vincolo. Il secondo termine descrive il primo, in questo caso abbiamo un numero uno e quindi otteniamo 11. Il terzo termine descrive (si tratta di due cifre 1) il secondo ottenendo 21, il quarto 1211 “legge” il terzo che contiene un due ed un uno e, seguitando, il quinto termine, è 111221. Il sesto, ovviamente, corrisponde a 312211.

Partenza

La sfida consiste nello scrivere una funzione che preso in input un termine qualunque della sequenza, ne restituisca il successivo.

Come al solito aspetterò fino alla fine della settimana per postare la mia versione. Chi volesse cimentarsi non ha altro da fare che postare la propria soluzione tra i commenti.

Eineki

Written by Eineki

aprile 30, 2009 a 13:25 pm

8 Risposte

Subscribe to comments with RSS.

  1. Ciao,

    ho utilizzato ruby per la soluzione, ecco il codice, sono 100 caratteri (incluso lo spazio):

    puts (ARGV[0]||”1″).scan(/(#{(‘0+’..’9+’).to_a.join(‘|’)})/).collect{|e|[e[0].size,e[0][0..0]]}.to_s

    Per eseguirlo è sufficiente salvarlo in un file ‘.rb’ (esempio: look_and_say.rb) e da riga di comando lanciare:

    >> ruby look_and_say.rb 1121304444
    >> 211211131044

    Sandro

    Sandro

    maggio 1, 2009 at 13:05 pm

  2. mmh.. la formattazione di wordpress ha distrutto il mio codice nel precedente messaggio, provo a ripostarlo con il tag pre

    puts (ARGV[0]||"1").scan(/(#{('0+'..'9+').to_a.join('|')})/).collect{|e| [e[0].size,e[0][0..0]]}.to_s
    

    Vediamo se funziona meglio…

    Sandro

    maggio 1, 2009 at 13:18 pm

  3. […] navigando tra i miei feed RSS quando ho trovato questo interessantissimo articolo, ovviamente non ho resistito all’idea di cercare di sviluppare una soluzione usando Ruby ed […]

  4. La mia soluzione, in php, conta ben 107 caratteri. Non so se sia migliorabile se non cambiando linguaggio (come Sandro ha già dimostrato).

    function y($l,$n,$c,$r){$t=$l[0]==$n;$s=$r.$c.$n;
    return $l[0]?y(substr($l,1),$l[0],$t?$c+1:1,$t?$r:$s):$s;}

    eineki

    maggio 4, 2009 at 10:47 am

  5. @ Sandro
    Non mi funziona la form dei commenti sul tuo blog. AJAX non apre la form.

    Se usi #map invece di #collect risparmi 4 chrs.😉

    Simone Carletti

    maggio 4, 2009 at 11:08 am

  6. @Simone
    Grande ! Non avevo pensato al map !!
    si.. la form dei commenti è in TDB … vorrei usare qualcosa di extra-sito tipo friend connect ma devo ancora rifletterci…

    Sandro

    maggio 4, 2009 at 12:53 pm

  7. Io invece ho provato in C# (v3.5), anche se non è esattamente un linguaggio che si presta a questo tipo di cose. Ovviamente vi risparmio la classe base di partenza (il main per intenderci) anche perché solo quella supera i 200 caratteri!

    Questa funzione invece arriva a 151 caratteri… di + ninzò!😀

    string L(string s){
    var l="";s.ToList().ForEach(c=>{int i=0,p=l.Length-2;if(p>-1)i=l[p]-48;
    l=(l==""||l[p+1]!=c)?l+"1"+c:l.Remove(p)+ ++i+c;});return l;}
    

    Maxoly

    maggio 5, 2009 at 10:40 am

  8. Sebbene ci siano cose che farebbero accapponare la pelle a Douglas Crockford, ecco una soluzione in JavaScript di 112 caratteri:

    function l(t){var c=1,f=t[0],s='';
    for(i=1;i<t.length;i++){if(f==t[i]){c++}
    else{s+=c+f;f=t[i];c=1}}return s+c+f}

    Nota: i ritorni a capo non sono necessari, servono solo a non creare una riga troppo lunga e difficile da leggere.

    unwiredbrain

    luglio 2, 2009 at 10:52 am


Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: