Výpočet dne v týdnu a počtu dní mezi dvěma daty

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
'CST.CZ'
CST.CZ
{ { "DEN" ML20WKD } { "POCET" ML20DIF } { "DNES" ML20NOW } { } { "JAZYK" ML20LNG } { "VYSTUP" ML20OUT } }
CST.DE
{ { "TAG" ML20WKD } { "ANZAHL" ML20DIF } { "HEUTE" ML20NOW } { } { "SPRACHE" ML20LNG } { "AUSGABE" ML20OUT } }
CST.EN
{ { "DAY" ML20WKD } { "NUMBER" ML20DIF } { "TODAY" ML20NOW } { } { "LANGUAGE" ML20LNG } { "OUTPUT" ML20OUT } }
ML20.CZ
{ "Ne" "Po" "Ut" "St" "Ct" "Pa" "So" "Pocet dni" "ML20: Jazyk" "ML20: Vystup" "Textovy tvar" "Pouze cisla" }
ML20.DE
{ "Son" "Mon" "Die" "Mit" "Don" "Fre" "Sam" "Anzahl Tage" "ML20: Sprachauswahl" "ML20: Ausgabe" "Text-Format" "Nur zahlen" }
ML20.EN
{ "Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat" "# of Days" "ML20: Language" "ML20: Output" "Text form" "Numbers only" }
ML20CHK
«
  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
»
ML20DIF
«
  « 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
    »
  »
»
ML20FAC
« → 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 -
  »
»
ML20LNG
«
  « 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
  »
»
ML20LTX
'ML20.CZ'
ML20NOW
« DATE DUP IP SWAP FP 100. * DUP IP SWAP FP 10000. * UNROT -42. FS?
  « SWAP
  » IFT
»
ML20OUT
« 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
  »
»
ML20REQ
«
  « DUP
    IF 9. ≤
    THEN SWAP "0" + SWAP
    END R→I →STR
  » → z0
  « ROT R→I →STR "-" + ROT z0 EVAL "-" + + SWAP z0 EVAL +
  »
»
ML20WKD
«
  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
»
STO3
« PATH UPDIR 'ML20' RCL :3: "HPDIR/ml20hp50g.hp" DUP PURGE STO EVAL
»

Použití programu

  

» Nejprve vysvětlivky...

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.

» ...a po vysvětlivkách ukázky

Série ukázek použití jednotlivých částí programového celku předpokládá splnění těchto nezbytných podmínek:

  1. Nastavit mód RPN (není-li: MODE +/- OK (F6)).
  2. Nastavit mód Soft MENU (není-li: MODE FLAGS (F1) (nalistovat číslo 117) √CHK (F3) OK (F6)).
  3. Shodit flag č.20 (2 0 PRG TEST (F4) NXT NXT CF (F2)).
  4. Vytvořit ve vnitřní paměti kalkulátoru adresář (nejlépe pojmenovaný ML20) a umístit do něj všechny soubory/proměnné.
  5. Nově vzniklý adresář učinit adresářem aktuálním (pracovním). Snadno to jde použitím správce souborů po stisku FILES.
  6. Aktivovat obsah proměnné CST stiskem klávesy CUSTOM.
  7. Vyplatí se smazat obsah stacku stiskem CLEAR.
Po zdárném dokončení všech vyjmenovaných činností je kalkulátor připraven program provozovat a displej by měl vypadat asi takto:

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:


» Den v týdnu

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.


» Počet mezi dvěma daty

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).


» Co je dnes za den?

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).


» Výběr jazyka

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.


» Výběr tvaru výsledků

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).

Nuže, dychtivci z řad bláznů i zvědavců, sosejte zde: