Motto: Říká se, že opakovaný vtip není vtipem, ale odolat takovému pokušení není v lidských silách.
Ten, koho dráždí předchozí "úlety" v podobě kapitol zabývajících se různými nedorozuměními či krádežemi, bude patrně mírně podrážděn i kapitolou touto. Míra podráždění jistě nedosáhne takové úrovně, jako v případě kapitol koketujících s AOS, ale i tak - beznadějná oběť RPN logiky se v následujících řádcích možná tak úplně nenajde. Přeci jen: už to je něco jiného.
Tím avizovaným neodolatelným pokušením je opět program č. 20 z modulu Master Library kalkulátorů TI-58/59. Tentokrát v podobě pro stroje řady HP-48/49 (zde konkrétně pro HP-50g). Typ použitého kalkulátoru vysvětluje tu ohromnou záhadu, proč je to něco jiného, než v předchozích variantách. Už to není RPN a Keystroke programming, ale RPL.
Na každý pád se prudce doporučuje seznámit se s popisem předchozích řešení pro "košer" RPN kalkulátory HP-35s, HP-42s a HP-15C. Bez informací obsažených právě tam by následující řádky nedávaly smysl.
Zdrojové texty | ↑ ↓ |
Celý program je rozdělen do více souborů (v terminologii RPL mluvíme o proměnných). Ty, které mají příponu (CST.CZ, CST.DE, CST.EN, ML20.CZ, ML20.DE, ML20.EN), slouží k rozlišení jazyka, jakým na uživatele bude program "mluvit", Soubor STO3 obsahuje krátký program, který sice s výpočty nijak nesouvisí, ale uloží celý adresář ML20 na paměťovou kartu SD. Ostatní soubory/proměnné obsahují vlastní programové bloky:
ML20CHK | . . . . . | Kontrola zadání data. |
ML20DIF | . . . . . | Počet dní mezi dvěma daty. |
ML20FAC | . . . . . | Výpočet faktoru. |
ML20LNG | . . . . . | Výběr jazyka. |
ML20NOW | . . . . . | Hodnoty aktuálního data. |
ML20OUT | . . . . . | Nastavení tvaru výstupu. |
ML20REQ | . . . . . | Textový tvar zadání pro potřebu výpisu výsledků. |
ML20WKD | . . . . . | Výpočet dne v týdnu. |
Pozn.: Seznam názvů souborů/proměnných je řazen abecedně, stejně jako následující výpisy jejich obsahů. Vysvětlivky jsoucí zároveň odkazem do kapitoly Použití programu indikují ty programové bloky, které jsou prostřednictvím Soft KEYs uživatelským rozhraním. Zbývající jsou pro vnitřní potřebu ostatních bloků.
Krátké vysvětlivky ve výčtu souborů/proměnných pro tuto chvíli postačí. Detaily jsou patrné z následujících zobrazených obsahů. (Klid, to byl jenom bonmot! Z toho RPL masakru není vidět vůbec nic. Tedy, zdravý a příčetný člověk tam nic neuvidí. Bláznovi, který se takovými hloupostmi pravidelně zabývá, bude vše jasné. :-). Návodnější může být následující kapitola Použití programu.
'CST.CZ'
{ { "DEN" ML20WKD } { "POCET" ML20DIF } { "DNES" ML20NOW } { } { "JAZYK" ML20LNG } { "VYSTUP" ML20OUT } }
{ { "TAG" ML20WKD } { "ANZAHL" ML20DIF } { "HEUTE" ML20NOW } { } { "SPRACHE" ML20LNG } { "AUSGABE" ML20OUT } }
{ { "DAY" ML20WKD } { "NUMBER" ML20DIF } { "TODAY" ML20NOW } { } { "LANGUAGE" ML20LNG } { "OUTPUT" ML20OUT } }
{ "Ne" "Po" "Ut" "St" "Ct" "Pa" "So" "Pocet dni" "ML20: Jazyk" "ML20: Vystup" "Textovy tvar" "Pouze cisla" }
{ "Son" "Mon" "Die" "Mit" "Don" "Fre" "Sam" "Anzahl Tage" "ML20: Sprachauswahl" "ML20: Ausgabe" "Text-Format" "Nur zahlen" }
{ "Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat" "# of Days" "ML20: Language" "ML20: Output" "Text form" "Numbers only" }
« IF DEPTH 3. < THEN # 201h DOERR END 3. DUPN 3. →LIST { { 1582. 2999. } { 1. 12. } { 1. 31. } } ADD 1. « OBJ→ DROP → v l h « CASE v TYPE 0. == THEN END v TYPE 28. == THEN END # 202h DOERR END IF v l < v h > OR THEN # 203h DOERR END » » DOLIST »
« « 3. DUPN 3. →LIST 1. →LIST » → →req « ML20CHK →req EVAL → reql « ML20FAC IF DEPTH 4. < THEN ML20NOW ELSE 4. ROLLD END →req EVAL 'reql' STO+ ML20FAC - ABS IF 20. FC? THEN reql 1. « OBJ→ DROP ML20REQ » DOLIST OBJ→ DROP ROT END IF 20. FC? THEN ML20LTX 8. GET →TAG END » » »
« → y m d « y 365. * d + 31. DUP m * - - IF m 3. ≥ THEN m .4 * 2.3 + IP - y ELSE 'y' DECR END 4. / DUP IP ROT + SWAP 25. / IP .75 DUP ROT * + IP - » »
« « DUP SIZE 1. - 6. SWAP SUB » « ROT "'" + + OBJ→ SWAP STO » → ext2str store2var « VARS 1. « →STR IF DUP "CST." POS 2. == THEN ext2str EVAL ELSE DROP END » DOLIST SORT IF DUP SIZE 0. > THEN DUP 'CST' RCL →STR ext2str EVAL POS ML20LTX 9. GET UNROT IF CHOOSE THEN DUP 'CST' "'CST." store2var EVAL 1. MENU 'ML20LTX' "'ML20." store2var EVAL END ELSE DROP END » »
'ML20.CZ'
« DATE DUP IP SWAP FP 100. * DUP IP SWAP FP 10000. * UNROT -42. FS? « SWAP » IFT »
« ML20LTX 11. 12. SUB → lmenu « ML20LTX 10. GET lmenu 1. 20. FC? « 1. + » IFT IF CHOOSE THEN lmenu SWAP POS 1. - IF THEN 20. SF ELSE 20. CF END END » »
« « DUP IF 9. ≤ THEN SWAP "0" + SWAP END R→I →STR » → z0 « ROT R→I →STR "-" + ROT z0 EVAL "-" + + SWAP z0 EVAL + » »
« IF DEPTH 0. == THEN ML20NOW ELSE ML20CHK END IF 20. FC? THEN 3. DUPN END ML20FAC 1. - 7. MOD IF 20. FC? THEN 1. + ML20LTX SWAP GET 4. ROLLD ML20REQ →TAG END »
« PATH UPDIR 'ML20' RCL :3: "HPDIR/ml20hp50g.hp" DUP PURGE STO EVAL »
Použití programu | ↑ ↓ |
V dalším textu jsou klávesy kalkulátoru rozlišeny barvami:
ENTER | . . . . . | Přímý stisk klávesy. |
FILES | . . . . . | Levý shift před klávesou. |
CMPLX | . . . . . | Pravý shift před klávesou. |
IP (F5) | . . . . . | Soft KEY. |
Série ukázek použití jednotlivých částí programového celku předpokládá splnění těchto nezbytných podmínek:
Jako ukázková jsou použita stejná data a (pokudmožno) stejné pořadí operací jako v případě všech RPN řešení pro HP-35s, HP-42s nebo HP-15C. Sled témat ukázek použití kopíruje sled položek Soft MENU:
Pojďme zjistit, které dny v týdnu byly 4. říjen 1978 a 2. červenec 1964.
Datum je vždy reprezentováno trojicí čísel v pořadí ROK, MĚSÍC, DEN uložených na stack. Šikovné je vložit na příkazovou řádku všechna tři čísla oddělená mezerou (klávesa SPC). Zapsání data v požadovaném tvaru ukazuje první obrázek. Stisk Soft KEY DEN (F1) spustí zpracování trojice čísel na stacku a výsledek je vidět na obrázku druhém: tenkrát byla středa.
Pro zpracování dalšího zadání je postup stejný. Na následujících obrázcích je vloženo datum 2. července 1964 tak, aby bylo vidět jeho umístění na stacku. Stisk DEN (F1) opět vede k výsledku: je to čtvrtek.
Kolik dní uplynulo od 2. července 1964 do 4. října 1978.
Stejným stylem, jako v předchozím bodě, je zadána dvojice údajů typu DATUM. Čísla s významy ROK, MĚSÍC, DEN lze zadávat zvlášť (oddělovat stiskem klávesy ENTER), nebo na příkazovou řádku vložit všech šest čísel oddělených mezerou (klávesa SPC). Obě situace ilustrují první dva obrázky. Třetí obrázek zobrazuje výsledek po stisku POCET (F2). Uplynulo neuvěřitelných 5207 dní.
Klávesu POCET (F2) lze bez rizika chybového hlášení nebo neplatného výsledku stisknout i v případě, že na stacku je pouze jedna trojice čísel určující datum. Jako druhý údaj program použije datum aktuální. Vlastně místo uživatele "stiskne" DNES (F3) a tím je požadavek na dvě zadaná data splněn (viz následující obrázky z 23. července 2015).
Pokud je stack prázdný (typicky po CLEAR), stačí stisknout DEN (F1). V opačném případě by program obsah stacku pokládal za zadání a s vysokou pravděpodobností by vše skončilo chybovou hláškou. Je-li tedy stack zaplněn nějakými hodnotami z předchozí činnosti, k cíli vedou dvě stisknutí Soft KEYs: DNES (F3) DEN (F1) (viz následující obrázky z 23. července 2015).
Pokud někoho znepokojuje monolingvistické pojetí celého programu, nemusí klesat na mysli natož propadat trudomyslnosti. Po stisku JAZYK (F5) je zobrazeno menu s výběrem. Sortiment není z nejširších, ale prostým doplněním dalších dvojic souborů CST.* resp. ML20.* do adresáře ML20 lze tento sortiment rozšiřovat donekonečna.
Poslední Soft KEY VYSTU (F6) vyvolá menu pro výběr jedné ze dvou možných forem výpisu výsledků. Textový tvar je ten, který byl použit ve všech předchozích ukázkách. Volba Pouze čísla potlačí doprovodné texty ve výstupů. Výsledkem části programu spuštěné stiskem klávesy DEN (F1) je nyní (místo textového řetězce) číslo: 1..6 značí rozsah pondělí..sobota, 0 je neděle. Následující obrázky ukazují předchozí výpočty v módu Pouze čísla.
Mód Pouze čísla by našel použití v případě, že výstup obou hlavních bloků programu (viz Soft KEYs DEN (F1) a POCET (F2)) bude zpracovávat jiný program, který by s odstraňováním doprovodných textů měl práci navíc. V takovém případě se pro nastavení tohoto módu nepoužije podprogram zastoupený VYSTU (F6), ale programová sekvence « 20 SF ».
Kde to vzít? | ↑ ↓ |
Připusťme, že se najde ten výše zmíněný blázen, který se takovými hloupostmi pravidelně zabývá, a bude chtít tuhle volovinu na svém kalkulátoru provozovat. Pravděpodobnost uskutečnění takového přírodního úkazu se sice limitně blíží nule, přesto je potřeba s ním počítat.
Vlastně to nemusí být pouze klinicky diagnostikovaný blázen. Může jít o zcela normálního chlapa, který bude zdravě zvědavý, co to je ("...jestli se nemýlím, hihihi!" dodal by Sam Hawkens).