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.