Acht opgaven met antwoorden (Albert Nijhof) OPGAVE 1 Hoe kun je de waarde van BASE bepalen zonder hem te veranderen? :.BASE ( -- ) BASE @ 1-.." + 1 " :.BASE ( -- ) BASE @ DUP 2/ DUP.." + " -. :.BASE ( -- ) BASE @ 1 2* 2* 1 + 2* /MOD [CHAR] 0 TUCK + EMIT + EMIT OPGAVE 2 Maak het woord : BIT? ( bitpatroon bit# -- vlag )??? De vlag (true of false) geeft aan of dat bit gezet is. Gebruik hierbij o.a. RSHIFT AND = : BIT? RSHIFT 1 AND 1 = : BIT? RSHIFT 1 AND 0<> : BIT? RSHIFT 1 AND NEGATE : BIT? RSHIFT 1 TUCK AND = : BIT? 1 SWAP LSHIFT AND 0<> OPGAVE 3 Programmeeroefening voor IF ELSE EXIT Maak het woord : LAMPEN ( bitpatroon -- )??? Lamp S zit op bit 0 Lamp T zit op bit 7 Bit gezet betekent: lamp is aan. Het woord LAMPEN moet LETTERLIJK een van deze 4 reacties geven: S en T zijn aan S en T zijn uit Alleen S is aan Alleen T is aan Gebruik hierbij BIT? uit de vorige opgave.
Voor het vaderland weg DUP 0 BIT? IF DUP 7 BIT? IF." S en T zijn aan " DUP 0 BIT? 0= IF DUP 7 BIT? 0= IF." S en T zijn uit " DUP 0 BIT? IF DUP 7 BIT? 0= IF." Alleen S is aan " DUP 0 BIT? 0= IF DUP 7 BIT? IF." Alleen T is aan " DROP Eerst de vlaggen 2DUP AND IF." S en T zijn aan " 2DUP OR 0= IF." S en T zijn uit " 2DUP < IF." Alleen S is aan " 2DUP > IF." Alleen T is aan " 2DROP Strakker op de stack 2DUP AND IF." S en T zijn aan " 2DUP + 0= IF." S en T zijn uit " 2DUP < IF." Alleen S is aan " > IF." Alleen T is aan " Scheef genest (case-achtig) 2DUP AND IF." S en T zijn aan " ELSE 2DUP = IF." S en T zijn uit " ELSE 2DUP < IF." Alleen S is aan " ELSE." Alleen T is aan " 2DROP
Evenwichtig genest : TAAN ( S? -- ) IF." S en T zijn aan " ELSE." Alleen T is aan " : TUIT ( S? -- ) IF." Alleen S is aan " ELSE." S en T zijn uit " IF TAAN ELSE TUIT Alles in een woord IF IF." S en T zijn aan " ELSE." Alleen T is aan " ELSE IF." Alleen S is aan " ELSE." S en T zijn uit " Verlaat het woord zodra je klaar bent IF IF." S en T zijn aan " EXIT." Alleen T is aan " EXIT IF." Alleen S is aan " EXIT." S en T zijn uit " Anders gegroepeerd DUP 0 BIT? SWAP 7 BIT? OVER = ( S? S=T? ) IF IF." S en T zijn aan " EXIT." S en T zijn uit " EXIT IF." Alleen S is aan " EXIT." Alleen T is aan " Met tekstanalyse : SENT ( S? -- )." S en T zijn " IF." aan " ELSE." uit " : SOFT ( S? -- )." Alleen " IF." S" ELSE." T"." is aan " DUP 0 BIT? SWAP 7 BIT? OVER = ( S? S=T? ) IF SENT ELSE SOFT
Verlaat het woord zodra je klaar bent DUP 0 BIT? SWAP 7 BIT? OVER = ( S? S=T? ) IF." S en T zijn " IF." aan " EXIT." uit " EXIT." Alleen " [CHAR] T + EMIT." is aan " S-vlag T-vlag 2* + NEGATE 0 0 wordt 0-1 0» 1 0-1» 2-1 -1» 3 Zonder IF : STAAN." S en T zijn aan " : TAAN." Alleen T is aan " : SAAN." Alleen S is aan " : STUIT." S en T zijn uit " CREATE REACTIES ' STUIT, ' SAAN, ' TAAN, ' STAAN, 2* + NEGATE ( Volgnummer ) CELLS REACTIES + @ EXECUTE Gestroomlijnd :NONAME." S en T zijn aan " \ 3 :NONAME." Alleen T is aan " \ 2 :NONAME." Alleen S is aan " \ 1 :NONAME." S en T zijn uit " \ 0 CREATE REACTIES,,,, 2* + NEGATE ( Volgnummer ) CELLS REACTIES + @ EXECUTE Rekenen aan een string DUP 0 BIT? SWAP 7 BIT? 2* + NEGATE ( Nr ) S" S en T zijn uit Alleen S is aan Alleen T is aan S en T zijn aan " 4 / >R SWAP ( Stringadres Volgnummer ) R@ * + R> TYPE
OPGAVE 4 Bedenk wat dit op zal leveren: (a) HEX 0F0F 0FF0 AND. (b) HEX 1111 2222 AND. (c) HEX 1234 1111 AND. (d) DECIMAL TRUE 12345 AND. (e) HEX ABCD 8 RSHIFT. (a) F00 (b) 0 (c) 1010 (d) 12345 (e) AB OPGAVE 5 Maak :.BP16 ( 16b -- )??? dat alle bits van het 16-bitspatroon afdrukt. Gebruik hierbij.bp uit het cursusboek. :.BP16 DUP 8 RSHIFT.BP SPACE.BP :.BP16 DUP 8 RSHIFT.BP.".".BP OPGAVE 6 Hersengymnastiek Bij elke regel uit het eerste rijtje is er een in het tweede rijtje die hetzelfde doet. Welke letter hoort bij welk cijfer? (a) DUP 0<> AND (1) DROP 0 (b) DUP 0= AND (2) 0 DROP (c) DUP 0< AND (3) DUP 0< IF DROP 0 (d) DUP 0> AND (4) DUP 0> IF DROP 0 a2 b1 c4 d3
OPGAVE 7 De Teamworkwet van Nijhof: X = A/N + (N-1)*(N-1) De formule geeft aan dat een karwei, waar 1 persoon A uren over doet, door een team van N personen in X uren geklaard zou kunnen worden. 1. Maak een woord : T ( N -- X )??? dat berekent hoelang een team van N personen erover doet. Definiëer voor A een value. 2. Het produceren van een nieuw nummer van het Vijgeblaadje kost 1 persoon 24 uur werk (A=24). Hoe groot is het team dat dat in de kortste tijd zou kunnen? En hoe zit dat met een 6-uurs-karwei (A=6)? Programmeer hiervoor: TEAMS ( -- )??? dat een overzichtje van de tijden geeft voor teams van 1 t/m 20 leden. Dat overzichtje moet op het scherm passen. Gebruik hierbij.r 3. Voor een besluit waar je als teamleider 10 minuten (A=10) over hebt moeten nadenken, moet je een draagvlak creëren van 20 personen (N=20). Hoeveel minuten zal je dat kosten? Ook hier geldt de Teamworkwet van Nijhof: 1. 24 VALUE A : T ( N -- X ) A OVER / SWAP 1- DUP * + X = A/N + (N-1)*(N-1) 2. :.KOP ( -- )." Teamleden Tijd" :.T ( N -- ) DUP 10.R T 5.R : TEAMS ( -- ) CR.KOP.KOP 11 1 DO CR I.T I 10 +.T LOOP Het Vijgeblaadje gaat het snelst met 3 mensen, in 12 uur. Het 6-uurs-karwei gaat het snelst met zijn tweeën, in 4 uur. 3. Het draagvlak van 20 personen kan in 6 uur en 1 minuut tot stand komen. OPGAVE 8 SLOT met PINCODE Met SLOT kun je een programma op slot zetten. Alleen iemand die de code kent krijgt toegang.
marker -PIN 4 constant AANTAL (lengte van de pincode) create PINCODE ( -- adres ) aantal allot create POGING ( -- adres ) aantal allot 0 value GELUKT? align align *** : VASTLEGGEN ( adr -- )??? *** : VERGELIJKEN ( adr1 adr2 -- )??? : SLOT ( -- ) begin poging vastleggen poging pincode vergelijken gelukt? until SLOT pas uitproberen als je VASTLEGGEN en VERGELIJKEN getest hebt! (Waarom?) Waarschuwing: altijd eerst PINCODE VASTLEGGEN OPGAVE: Programmeer de woorden VASTLEGGEN en VERGELIJKEN 1. Beschrijving van : VASTLEGGEN ( adr -- )??? PINCODE VASTLEGGEN -> Zet de in te typen code in PINCODE POGING VASTLEGGEN -> Zet de in te typen code in POGING Bij het intypen van een teken verschijnt er een sterretje op het scherm. Gebruik DO-LOOP I KEY en C! Controleer met PINCODE AANTAL DUMP 2. Beschrijving van : VERGELIJKEN ( adr1 adr2 -- )??? POGING PINCODE VERGELIJKEN -> Controleer of de beide ingetypte codes aan elkaar gelijk zijn. Vergelijk de tekens stuk voor stuk en zet het eindoordeel in GELUKT? Gebruik hierbij C@ : VASTLEGGEN ( adr -- ) SPACE AANTAL 0 DO KEY." *" OVER I + C! LOOP DROP SPACE : VERGELIJKEN ( adr1 adr2 -- ) TRUE TO GELUKT? AANTAL 0 DO OVER I + C@ OVER I + C@ = GELUKT? AND TO GELUKT? LOOP 2DROP