Nicola Ferrari - Ferro

Al mondo ci sono solo 10 tipi di persone: chi comprende il sistema binario e chi no

 

Project Euler - Problema 53

 

Erano ormai mesi e mesi che non mi concedevo un paio d'ore di svago davanti a Python; finalmente dopo un lungo periodo di completo digiuno da Python, sono riuscito a riprenderlo in mano. Destino volle che il giorno stesso in cui mi misi nuovamente a giocare con Python, lo staff di ThinkCode.TV decise di fare una superofferta nel suo corso di Python a cura di "Marco Beri" (no, non quello delle iene ;)).. decisi quindi di prendere il corso ed iniziare da capo Python.. Che dire.. non mi ricordavo fosse così efficiente e così divertente programmare in Python; dopo alcune ore di studio "full immersion", ripresi in mano una mia vecchia passione: "Project Euler". Ordinando i problemi in ordine di difficoltà mi ritrovai ad affrontare il problema numero 53, il cui enunciato diceva:

 

There are exactly ten ways of selecting three from five, 12345:

123, 124, 125, 134, 135, 145, 234, 235, 245, and 345

In combinatorics, we use the notation, 5C3 = 10.

In general,

nCr =
n!
r!(n−r)!
,where r ≤ n, n! = n×(n−1)×...×3×2×1, and 0! = 1.

It is not until n = 23, that a value exceeds one-million: 23C10 = 1144066.

How many, not necessarily distinct, values of  nCr, for 1 ≤ n ≤ 100, are greater than one-million?

 

Il problema non mi sembrava difficile, ma pensavo (sbagliandomi) :"Dubito che facendo due cicli for, possa risolvermi velocemente il tutto! Vabbè proviamo..."

 

import math
numero_elementi=0
for n in range(1,101):
    for r in range(1,n+1):
        if math.factorial(n) / (math.factorial(r) * math.factorial(n-r)) > 1000000:
            numero_elementi+=1

print "Numero elementi trovati:" , numero_elementi

 

Il tutto funzionava e la risoluzione impiegava pochissimo..decisi di provare a ridurre ulteriormente la mia riga di codice e mi ritrovai ad una soluzione di un unica riga..

 

print sum(1 for n in range(1, 101) for r in range(1, n+1) if math.factorial(n) / (math.factorial(r) * math.factorial(n-r)) > 1000000)
Questo Python è davvero COOL Cool
Penso che prossimamente mi ritaglierò un po' di tempo per proseguire con Project Euler. L'obiettivo è raggiungere il Livello 4 di Project Euler per fine anno! Diamoci dentro...