Project Euler – Problema 1

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.

Annunci
Project Euler – Problema 1

Rispondi

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...