On 06.11.2010, at 12:04, Enrico Schwass wrote:
> Ich erwarte deine Einsendung zu Lösung B :)

Du meinst, weil Lösung B auf unserer Website falsch ist? Demonstriert sehr 
schön die Gefahr, unnötigerweise mit Indizes rumzuhantieren.

Von diesem Fehler abgesehen kann man das auch kompakter schreiben:

(1 to: 999) inject: 0 into: [:sum :i |
        (i \\ 3 = 0) | (i \\ 5 = 0)
                ifTrue: [sum + i]
                ifFalse: [sum]]

Das vermeidet trotzdem den exorbitanten Speicherverbrauch von Lösung A.

Noch knapper:

(1 to: 999) detectSum: [:i | (i \\ 3 = 0) | (i \\ 5 = 0) ifTrue: [i] ifFalse: 
[0]]

Und wenn man Kontrollstrukturen vermeiden mag:

(1 to: 999) detectSum: [:i | i * (#(0 0 1 0 1 1 0 0 1 1 0 1 0 0 1) atWrap: i)]

Macht Spaß :)

- Bert -

Antwort per Email an