Riporto la soluzione al problema 6 in F#:

#light

(*Somma dei quadrati: “mappa” la funzione quadrato sui numeri da 1 a 100, e poi ne fa la somma
passando il risultato a List.sum*)
let sumofsquares = List.map (fun x -> x*x) [1 .. 100] |> List.sum

// Quadrato della somma: eleva al quadrato la somma.
let squareofsum = List.sum [1 .. 100]* List.sum [1 .. 100]

// Differenza tra quadrato della somma e somma dei quadrati
printf “%A” (squareofsum – sumofsquares)

Mentre ecco una versione in Haskell:

sommaquadrati = sum [(x*x)|x<-[1..100]]

quadratosomma = (sum [1..100])*(sum[1..100])

result = quadratosomma – sommaquadrati

Come al solito, se ci sono domande basta chiedere.

Ecco il testo del problema:

The sum of the squares of the first ten natural numbers is,

12 + 22 + … + 102 = 385^()^()^()

The square of the sum of the first ten natural numbers is,

(1 + 2 + … + 10)2 = 552 = 3025^()^()

Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 − 385 = 2640.

Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.

Riporto la soluzione in F# elaborata da me per questo problema:

// Sintassi semplificata
#light

// Funzione filtro, che rimuoverà i multipli di 5 dai multipli di 3
let filter x =
if(x%5<>0) then true
else false

// Lista con i multipli di 3 (sintassi tipica di F#)
let n3 = List.filter filter [3 .. 3 .. 999]
// Lista con i multipli di 5 (sintassi tipica di F#)
let n5 = [5 .. 5 .. 999]

(* Unione delle due liste (quella dei multipli di 3 è già “epurata” dai multipli di 5)*)
let n = List.append n3 n5

// Somma di tutti gli elementi della lista
let sum = List.sum n

(* Stampa a schermo del risultato (%A è il marcatore generico per qualunque tipo di dato)*)
printf “%A” sum

Se il codice dovesse aver bisogno di ulteriori spiegazioni, non esitate a chiedere.

Aggiornamento 27-08-2009:

In seguito a un interessamento verso Haskell come linguaggio di programmazione funzionale puro (almeno un po’ più di F#) sono riuscito a riscrivere il programma in questione in una sola riga, sfruttando la capacità di generare liste da regole.

main = print ( sum [x | x<-[1..999], (x `mod` 3 ==0) || (x `mod` 5 ==0)] )

Bisogna poi aggiungere l’istruzione print per visualizzare il risultato, ma comunque resta un grande passo avanti dalla prima versione del programma, che non era del tutto in “paradigma funzionale”. Comunque per correttezza ho rivisto anche la versione in F#, equivalente a quella in Haskell già riportata:

let n = [for x in [1..999] do if (x%3=0) || (x%5=0)then yield x]

// Stampa a schermo del risultato (%A è il marcatore generico per qualunque tipo di dato)
printf “%A” (List.sum n)

Ecco il testo del problema:

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

Leggendo l’articolo su Wikipedia riguardo Visual Studio 2010, ho scoperto che nella prossima versione verrà incluso questo nuovo linguaggio di programmazione (F#)  che proviene dalla divisione Research della Microsoft.

Questo linguaggio si propone come l’anello di congiunzione mancante tra la programmazione imperativa, ad oggetti e funzionale. Inoltre è costruito sul .Net, quindi ha una vasta e solida libreria di supporto (anche per quanto riguarda il comparto grafico).

Mi sono avvicinato a questo linguaggio per via del suo aspetto funzionale, e inizio a scorgere le sue potenzialità (per esempio la gestione delle liste, un altro pianeta rispetto a linguaggi come il C). Sto cercando di impararlo con un approccio pratico, risolvendo i problemi del progetto Euler.

Secondo me questo linguaggio avrà un valore inestimabile in ambito scientifico (vedi libri come F# for sicentists), ma avrà poca diffusione in ambito gestionale (per costruire applicazioni “Office-like” C# resta ancora il migliore). D’altronde il paradigma funzionale secondo me non si presta benissimo alla costruzione di GUI.

Project Euler

18 Gennaio 2009

Su questo sito è possibile trovare interessanti quesiti matematici che richiedono l’ausilio di un linguaggio di programmazione per essere risolti.

Si tratta di implementare dei programmi che possano trovare il risultato delle operazioni descrittte, possibilmente nella maniere più diretta ed efficiente. Qualunque linguaggio può essere usato, dal C al Python, passando per i vari Visual Basic & co. Alla fine viene verificato soltanto la correttezza del risultato, perciò non importa come viene implementato il programma.

Per adesso sto utilizzando F#, perchè è mia intenzione imparare un po’ di programmazione funzionale. Questo linguaggio si presta particolarmente alla risoluzione di questi problemi, essendo appunto orientato alle funzioni e dotato di un supporto intrinseco alle liste, gestibili molto flessibilmente (almeno rispetto a linguaggi come il C).

Pubblicherò alcune soluzioni di questi problemi, ma la rete è già comunque piena di soluzioni a questi problemi in molti linguaggi (e molto più sofisticate delle mie),

Riporto alcuni versi dal primo libro dell’opera “Paradise Lost” (221-270) che ritengo particolarmente significativi:

Be it so, since he
Who now is Sovran can dispose and bid
What shall be right: fardest from him is best
Whom reason hath equald, force hath made supream
Above his equals.

(…)

The mind is its own place, and in it self
Can make a Heav’n of Hell, a Hell of Heav’n.

Riporto qui un metodo per ricordarsi il nome di tre tra i più importanti autori di teatro della grecia antica, metodo insegnatomi da una mia ex-professoressa di storia (prima media).

Si tratta di Eschilo, Sofocle ed Euripide. Essendo collegati tutti al mondo del teatro, ci si può immaginare che un teatro sia in fiamme, e per evacuare qualcuno dica: “Eschilo (uscite, ndc), eschilo signori, che qui si Sofocle (soffoca, ndc), e attenti, che le scale sono Euripide (ripide, ndc)”.

Ovviamente su Internet se ne trovano versioni di tutti i tipi, che includono anche Pericle (il pericolo), ma questa è la versione originale che ho sentito io.

Il significato dei nomi era ovvio, ma li ho specificati solo perchè avevo voglia di scriverci ndc a fianco (nota del curatore).