Vielen Dank für diese tolle Code-Kata.
Ich habe mal eine Lösung mit zwei Hash-Objekten erstellt.
- ausgehend vom Suchraum 100000 bis 166666 aufgrund der Aufgabenstellung
- in einem Loop über den Suchraum: Zerlegung der Zahl in Ziffern und Hinzufügen der Ziffern zu einem Hash-Objekt
- in einem Loop über die Multiplikatoren: Zerlegung der Vergleichszahlen (mit 2, 3, 4, 5, 6 multipliziert) in Ziffern und hinzufügen zu einem zweiten Hash-Objekt
-- Abgleich der Hash-Objekte und weitere Verarbeitung (Löschen des zweiten Hash-Objekts oder Abbruch des Vergleichs oder Ausgabe)
data test (keep = i);
/* Deklarieren von zwei Hash-Objekten für Abgleich
Multidata = yes, damit jede Ziffer ggf. mehrfach an Hash.Objekt hinzugefügt wird */
if _n_ = 1 then do;
declare hash heins(multidata: "yes");
rc = heins.defineKey('zahl');
rc = heins.defineDone();
declare hash hzwei(multidata: "yes");
rc = hzwei.defineKey('zahl');
rc = hzwei.defineDone();
end;
/* loop über mögliche Werte mit gegebenen Bedingungen:
- Zahl ist 6 stellig => daher von 100000
- Zahl ist 6 stellig und Anzahl Ziffern muss bei Multiplikation mit 6 übereinstimmen
=> daher bis 166666, ansonsten erfolgt ein Überlauf in eine 7-stellige Zahl
(alternativ bis 999999 durchlaufen; ebenfalls recht performant) */
do i = 100000 to 166666;
/* Zahl in einzelne Ziffern zerlegen und dem ersten Hash-Objekt hinzufügen */
do j = 0 to 5;
zahl = int(mod(i/(10**j),10));
rc = heins.add();
end;
/* loop für zweite Zahl, jeweils "mal 2", "mal 3", ... "mal 6" */
do k = 2 to 6;
zwei = i * k;
/* multiplizierte Zahl in Ziffern zerlegen und diese dem zweiten Hash-Objekt hinzufügen */
do j = 0 to 5;
zahl = int(mod(zwei/(10**j),10));
rc = hzwei.add();
end;
/* Prüfung, ob Hash-Objekte gleich sind (somit Ziffern der beiden Zahlen identisch) */
rc = heins.equals(hash: 'hzwei', result: equal);
if not equal then leave; /* wenn Ziffern nicht übereinstimmen gleich den Loop verlassen */
else
do;
rc = hzwei.clear(); /* wenn Ziffern übereinstimmen, Hash für nächste Zahl leeren */
if k = 6 then do; /* wenn auch die Zahl "mal 6" in Ziffern übereinstimmt Ausgabe der Zahl */
output;
put "Ergebnis: " i;
end;
end;
end;
/* Hash-Objekte leeren für nächstes i */
rc = heins.clear();
rc = hzwei.clear();
end; /* loop i */
run;
Herzliche Grüße
Michael
... View more