Bert Freudenberg bert@freudenbergs.de writes:
Hallo Bert,
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.
Oops. Ist korrigiert. Danke für den Hinweis
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.
Das hatte ich tatsächlich zuerst auch so formuliert, fand es dann aber nicht so schön. Der hohe Speicherverbrauch von A ist mir erst später aufgefallen.
Noch knapper: (1 to: 999) detectSum: [:i | (i \ 3 = 0) | (i \ 5 = 0) ifTrue: [i] ifFalse: [0]]
Auch daran hatte ich gedacht, nur den false-Zweig vergessen, oder nicht hinbekommen. Genau weiss ich das nicht mehr. Ist schon zu lange her. Schön, das jetzt richtig formuliert zu sehen
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)]
Ich nehme die Variante mit auf. Aber ganz ehrlich, das ist mir zu kompliziert. Das hat was von Obfuscation.
Man kommt über den goldenen Schnitt noch auf die Lösung. Vielleicht hat da mal jemand Lust.
Und ja, es macht Spaß :)
Enno