Pátek třináctého

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:

FRI13
«
  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

  

» Bez vstupních argumentů

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


» Jeden argument


» Oba argumenty zadány


» Zachován předchozí výsledek


» Větší rozsah

Zobrazených údajů je více, než displej dovoluje zobrazit. Možnosti jsou dvě:


» Alternativní zobrazení výsledků

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


Zamyšlení

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.