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 |
,where r |
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
