2010-06-29 4 views
6

Je fais mon chemin à travers le projet Euler et j'essaie d'écrire le code le plus concis possible. Je sais que c'est possible, alors comment pourrais-je simplifier le code suivant? De préférence, je voudrais que ce soit une ligne et n'utilisez pas la conversion int-> string-> int. Question: Quelle est la somme des chiffres du nombre 2 ?Simplification du code Python? Une ligne, ajouter tout dans la liste

Ma réponse:

>>> i=0 
>>> for item in [int(n) for n in str(2**1000)];i+=item 
+2

D'où vient le '2 ** 1000'? –

+2

Pourquoi une ligne, qui essayez-vous d'impressionner? –

+0

@Michael Mrozek http://projecteuler.net/index.php?section=problems&id=16 @PreludeAndFugue: moi-même – Backus

Répondre

16
sum(int(n) for n in str(2**1000)) 
+3

Pour le fun, c'est exactement la même chose: 'sum (int (n) pour n dans str (1 << 1000)) ' – jcao219

+0

mieux pour documenter le code, cos la prochaine personne qui lit ce serait comme" WTF? " –

+0

comment 'sum (foo)' est-il moins lisible que 'x = 0; pour item dans foo: x + = item; x'? – Jimmy

0

simple int str conversion pour obtenir la longueur:

int(sum(map(lambda x:2**1000/x % 10, (10**x for x in xrange(len(str(2**1000))))))) 
+0

Expression de générateur? –

3

Pas une doublure, mais une solution génératrice plus propre à la recherche, en évitant aussi la int-> string-> int conversion:

def asDigits(n): 
    while n: 
     n,d = divmod(n,10) 
     yield d 

print sum(asDigits(2**1000)) 

Donne 1366.

Fait intéressant, la somme des chiffres 2 ** 10000 est 13561, dont les chiffres jusqu'à si elles sont exprimées en binaire la même valeur que 1366.

Bien sûr, la somme des chiffres dans 2 ** 1000 est 1. (Je l'ai même fait dans ma tête!)

Questions connexes