[Squeak-ev] Re: Eulerprobleme mit Squeak

Bert Freudenberg bert at freudenbergs.de
Son Nov 7 12:59:56 UTC 2010


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 -