\ Euler 9 uho (VD-Heft 3/2008) 2008-08-24 \ Turbo-Forth-Adaption: beh 2008-10-10 \ Geht auch fuer ZF \ Turbo-Forth: forth [ret] include euler.fth \ ZF: zf [ret] fload euler.fth decimal \ In Turbo-Forth gibt es kein UNLOOP \ Hier eine High-Level-Definition: : (UNLOOP) ( -- ) R> R> R> R> 2DROP DROP >R ; : UNLOOP ( -- ) COMPILE (UNLOOP) ; IMMEDIATE \ COMPILE aus Turbo-Forth gibt es in ANS-Forth nicht. \ In ANS-Forth waere dafuer POSTPONE zu verwenden. \ a + b + c = 1000 : a_b_c ( a b -- a b c ) 2dup + 1000 swap - ; \ a^2 + b^2 = c^2 : pytriple? ( a b c -- flag ) >r dup um* rot dup um* d+ r> dup um* d= ; : euler9? ( a b -- flag ) a_b_c pytriple? ; : euler9 ( -- a b c ) 500 dup 1 DO dup I DO J I euler9? IF drop J I a_b_c UNLOOP UNLOOP EXIT THEN LOOP LOOP drop 0 0 0 ; : .solution ( a b c -- ) dup IF >r cr ." a=" over . ." b=" dup . ." c=" r@ . cr ." a+b+c=" 2dup + r@ + . cr ." a*b*c=" um* r@ * swap r> um* rot + d. EXIT THEN drop drop drop cr ." No solution" ; \ Schwierigkeiten macht in Turbo-Forth die Zeile mit a*b*c. \ Turbo-Forth ist nur 16-bittig und schafft die dreifache \ Multiplikation in der geforderten Breite nicht. Zwar kann \ man mit um* zwei 16-bittige Werte zu einem 32-Bit-Wert \ multiplizieren, es gibt aber in Turbo-Forth kein Wort, \ das die Multiplikation eines 32-Bit-Wertes mit einem \ 16-Bit-Wert gestattet. In ANS-Forth, also auch in jedem \ normgerechten 16-Bit-ANS-System, gibt es das Wort m*/ \ ( d1 n1 +n2 -- d2 ), das nach Setzen von +n2 = 1 genau \ das Ebenerwaehnte leistet. Ich habe hier auf die explizite \ Einfuehrung von m*/ verzichtet und mich im Forth-Wort \ .solution mit der Nachbildung der Funktion von m*/ \ speziell fuer +n2 = 1 mit den Mitteln von Turbo-Forth \ begnuegt. euler9 .solution \ Weitere Aufgaben: \ Man ersetze 1000 durch 40 . Was kommt dabei heraus? \ Genau! Es kommt genau das heraus, was man beim Durchlesen \ der Zeilen von Henry Vinerts auf Seite 7 des VD-Heftes \ 3/2008 erwartet. Merke: Berechnung ist gut, Ueberlegung \ ist besser! Man erweitere das Programm so, dass saemtliche \ Moeglichkeiten mit a+b+c = d bei d < 1000 ausgeschoepft \ werden. Wie sieht es fuer d > 1000 aus? (Man beachte auch \ die DO-Grenzen.) Wie weit kann man mit meiner \ Turbo-Forth-Programm-Version (in 16-Bit-Breite) gehen?