2010-06-29 14 views
6

robię moją drogę poprzez projekt Eulera i próbuję napisać kod najbardziej zwięzły mogę. Wiem, że to możliwe, więc jak mogłem uprościć poniższy kod. Najlepiej, aby był to jeden wiersz i nie używał konwersji int-> string-> int.Uproszczenie kodu Pythona? Jedna linia, dodać wszystko w liście

Pytanie: Jaka jest suma cyfr numeru 2 ?

Moja odpowiedź:

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

Skąd '2 ** 1000' pochodzi? –

+2

Dlaczego jedna linia, którą próbujesz zrobić wrażenie? –

+0

@Michael Mrozek http://projecteuler.net/index.php?section=problems&id=16 @ PreludeAndFugue: myself – Backus

Odpowiedz

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

Dla zabawy, to jest dokładnie to samo: 'suma (int (n) dla n STR (1 << 1000)) ' – jcao219

+0

lepiej dokumentować kod, cos następnej osoby, która czyta ten będzie jak„WTF?” –

+0

jak to 'suma (foo)' mniej czytelny niż 'x = 0; dla elementu foo: x + = pozycja; x'? – Jimmy

0

pojedyncze int do STR konwersji, aby uzyskać długość:

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

wyrażenie Generator? –

3

Ani jednego-liner, ale czystsze szuka rozwiązania generatora, także unikając int-> string-> int conversion:

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

print sum(asDigits(2**1000)) 

Daje 1366.

ciekawe, sumę cyfr 2 ** 10000 jest 13561, którego cyfry sumują się do tej samej wartości jak 1366.

oczywiście, jeśli wyrażone w binarnym, sumą cyfry w 2 ** 1000 1. (I nawet zrobił to w głowie!)