Krátký RPL program FRI13 pro HP-50g vypočítá výskyt neoblíbeného dne v průběhu časového období určeného dvěma zadanými roky. Využívá ke své činnosti dva podprogramy z opakované krádeže programu č. 20 z modulu Master Library kalkulátorů TI-58/59. Vlastně jenom jeden, ML20FAC. Ten druhý, ML20REQ, je tam pouze pro zvýšení estetické úrovně zobrazení výsledků.
Zdrojový text | ↑ ↓ |
Program je tak jednoduchý, až je blbé ho zveřejňovat. Pokud však laskavý čtenář těchto řádků dokáže odhlédnout (odborníci, kterým by to bylo málo, se klidně mohou abstrahovat :-) od cíle snažení a svou pozornost nechá zaostřenu pouze na postup, může se nakonec dostat do stavu hraničícího s mírnou pobaveností. Zdrojový text je zde:
« IF DEPTH 0. ≤ THEN DATE 100. * FP 10000. * DUP ELSE « → ord « ord EVAL IF { 0. 28. } OVER TYPE POS THEN IF DUP 1582. < THEN ord EVAL # 203h DOERR END ELSE ord EVAL # 202h DOERR END ord EVAL » » → chk « « » chk EVAL IF DEPTH 1. == THEN DUP ELSE « SWAP » chk EVAL IF DUP2 < THEN SWAP END END » END I→R SWAP I→R 0. « ←y ←m ROT 13. SWAP { ML20 } SWAP + RCL EVAL » → cnt run « FOR ←y 1. 12. FOR ←m 'ML20FAC' run EVAL IF 7. MOD 6. == THEN 'cnt' INCR DROP IF 20. FC? THEN 'ML20REQ' run EVAL ELSE ←y ←m END END NEXT NEXT cnt » IF 20. FS? THEN { 2. } + →ARRY EDITB END »
Zkušené oko jasně a na první pohled odhalí, že dvě třetiny celkového rozsahu programu tvoří všelijaké kontroly zadaných argumentů: (1) Je-li stack prázdný, vloží se aktuální rok. Pro jistotu hned dvakrát. (2) Dále je kontrolován typ argumentu v nejnižší úrovni stacku (tentokrát výrazně efektivnějším postupem, než v předchozích řešeních ML20CHK nebo EASTR) a jeho přípustná hodnota. (3) Při absenci druhého argumentu (více argumentů na stacku není) je stávající argument zduplikován. (4) Jsou-li zadány argumenty oba, ale v nevhodném pořadí ("od" > "do"), je zjednána náprava příkazem SWAP.
V bloku "jak 'sou ty dva fóry" (odborník se nedá nachytat hovorovou češtinou úrovně čtvrté cenové, a hned ví, že jde o vnořený cyklus tvořený dvěma příkazy FOR :-) se metodou brute-force procházejí všechny třinácté dny všech měsíců po celém rozsahu zadaných let. Vykazuje-li zkoumaný den "pátkovitost", zařadí se do seznamu nalezenců. V tomto vyhledávacím postupu rozhodně stojí za povšimnutí použití kompilovaných místních proměnných (viz HP 50g AUR: advanced user's reference manual, page 1-10: Compiled Local Variables). Čert ví, proč mají takové lokální proměnné přídomek compiled. Pravdou však je, že tuctové lokální proměnné to nejsou, když z pozice vnitřní proměnné cyklu FOR ... NEXT "prosáknou" až do podprogramu run, který je zde shodou náhod také lokální proměnnou. Celou dobu je samozřejmě řeč o proměnných ←y a ←m.
Závěrečnou třešničkou na (žalostně malém) dortu je alternativní výstup vytvořeného seznamu nalezených dní. Program totiž po vzoru programu ML20 reflektuje nastavení flagu č.20:
Použití programu | ↑ ↓ |
Na rozdíl od dalších ukázek zde není zachycen stav stacku před spuštění programu. Formalitám by sice bylo učiněno za dost, ale...
Zobrazených údajů je více, než displej dovoluje zobrazit. Možnosti jsou dvě:
Po nastavení flagu č.20 je zadán rozsah let a spuštěn výpočet. Po jeho skončení je výsledný seznam zobrazen ve formě matice. Po ukončení módu Matrix Writer klávesou ON (tedy CANCEL) je matice vidět jako položka v nejnižší úrovni stacku.
Kde to vzít? | ↑ ↓ |
Textový tvar | Binární forma |
---|---|
FRI13 | FRI13.hp |
Posledních pět položek seznamu skladových zásob se zabývá výhradně programy pro HP-50g. Aby ne! Okouzlení nově nabytým kalkulátorem se musí nějak projevit, nicht wahr? Pro účely zajištění rozptýlení podezření z vynucení přejmenování těchto webových stránek na RPLmania jsou zde "košer" RPN varianty.