Samstag, 29. Dezember 2012

Das erste Problem

Die Aufgabenstellung zum ersten Problem bei Projekt Euler lautet, dass die Summe aller natürlichen Zahlen < 1000 gefunden werden soll, die ein Vielfaches von 3 oder 5 ist. Das Problem habe ich bereits vor einiger Zeit gelöst und kann inzwischen auch eine einzeilige Lösung formulieren:
print(sum([i for i in range(1000) if i % 3 == 0 or i % 5 == 0]))
Da gibt es noch ganz viele - sehr schöne - Probleme, die gelöst werden wollen.

3 Kommentare:

  1. Bei einer halbwegs aktuellen Python-Version kann man die eckigen Klammern weg lassen — also aus der „list comprehension” einen Generatorausdruck machen.

    Dieser Ansatz ist zwar auf modernen Rechnern schnell, in BASIC 2.0 auf dem C64 hat der bei mir aber cirka 21 Sekunden gebraucht. Man kann das auch als geschlossene Formel, also ohne eine Schleife formulieren. Damit war auch der C64 in einem Bruchteil einer Sekunde fertig, und das unabhängig davon ob man nun 1.000 oder 100.000 als Obergrenze verwendet. :-)

    AntwortenLöschen
    Antworten
    1. Ich hab mit Generatoren (Weigend (4. Aufl.) 2010, S. 206-209) noch nicht gearbeitet. Ich darf rückfragen: Wo liegt der Vorteil hier einen Generatorausdruck einzusetzen? Geschwindigkeit? Performanz? Kann mir unter Generatoren noch nicht viel vorstellen.

      Löschen
    2. Eine „list comprehension” erzeugt eine Liste und übergibt die an `sum()`. Ein Generatorausdruck erzeugt ein iterierbares Objekt, das die einzelnen Elemente erst dann generiert wenn sie gebraucht werden. Also immer dann wenn `next()` auf dem Iterator aufgerufen wird. Zum Beispiel innerhalb der `sum()`-Funktion.

      In diesem konkreten Fall wird als Zwischenergebnis keine Liste mit 467 Elementen angelegt.

      Löschen