Pátek třináctého - facelifting

Pokud byla předchozí verze výpočtu pátku třináctého pro HP-50g tak jednoduchá, až bylo blbé ji zveřejňovat, těžko vybrat omluvný výrok pro zde popisovanou variantu řešící tentýž problém. Postup je totiž ještě jednodušší.


Inspirace

  

Joseph K. Horn (a podobní ranaři jeho úrovně) si v dokumentu HP 50g AUR: advanced user's reference manual na straně 3-51 povšiml nenápadného příkazu DDAYS. A to od něj bylo velmi chytré. Při výpočtu dne v týdnu se díky tomu mohl vyhnout krkolomnému postupu výpočtu faktoru a nahradit ho vložením dvou čísel na stack a spustit zmiňovaný příkaz, který returns the number of days between two dates. Tím prvním číslem je 6.133, čili pátek 13. června 3000. Druhým číslem je zkoumané datum v téže notaci. Rozdíl (počet dní) mezi nimi s nulovým zbytkem po dělení sedmi nutně musí indikovat pátek. Zde tedy Mistrův počin:

JKH13
« 1000000. / 1.13 + 13.
  FOR d 6.133 d DDAYS 7. MOD NOT d IFT
  NEXT
»

Tento krátký skvost uveřejněný v HP_Calculator_eNL_09_September_2011.pdf je autorem pojmenován FRI13. Pro odlišení od stejně pojmenovaného jsou zde první tři znaky názvu nahrazeny autorovými iniciálami.


Přípravné práce

  

Upřímně míněné pokání následující za výpisem programu FRI13 přiznává, že "dvě třetiny celkového rozsahu programu tvoří všelijaké kontroly". V řešení popisovaném těmito řádky je sekvence kontrol použita v nezměněné podobě. Hodí se proto sekvenci kontrol umístit do samostatného programu CHK13 a už jen tak ze sportu tuto výhodu zohlednit i v programu FRI13, který pro rozlišení získává nové jméno FRI13ML. Zde je výsledek úprav:

CHK13
«
  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
»
FRI13ML
« CHK13 I→R SWAP I→R 0.
  « ←y ←m ROT 13. SWAP { HOME PRGM 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
»

Provedení

  

Nově vzniklý program je k nerozeznání od toho původního ve dvou základních vlastnostech:

  1. Prochází všechny třinácté dny všech měsíců po celém rozsahu zadaných let, pátky řadí do výstupního seznamu.
  2. Má naprosto stejné ovládání.
Vše ostatní (nejen nové jméno PTK13 :-) je zbrusu nové.

Při sestavování výsledného programu byl až hystericky kladen důraz na jednoduchost. Bylo by trapné, kdyby program JKH13 s parametry 16 commands, 88.0 Bytes byl utopen v balastu o desetinásobném objemu. Co je tedy jinak a proč?

Pozn.: Za zmínku stojí drobná nedokonalost, které se Joseph K. Horn dopustil. Jeho program počítá s tím, že System Flag 42 je shozen (formát data je MM.DDYYYY). Náprava je v rámci PTK13 zjednána příkazy RCLF -42. CF resp. STOF.

PTK13
« CHK13 RCLF -42. CF → flg
  « IP SWAP IP { } UNROT
    FOR year DEPTH → num
      « year JKH13 DEPTH num -
      » →LIST IP .01 * year .0013 + ADD +
    NEXT flg STOF
  »
»

Další zjednodušení by určitě přineslo zapracování (rozpuštění) JKH13 do PTK13. Odpadl by výpočet množství nových položek stacku (viz lokální proměnná num). Také dvojí druh výstupních hodnot (MM.DDYYYY vs. YYYY.MMDD) by mohl být sjednocen. Jistě by se námětů na zlepšení našla celá řada. Všechny by však spojovala nutnost "rýpat" do programu JKH13. Navíc by z programu PTK13 zmizela posloupnost + ADD +, címž by výtvarná stránka zdrojového textu zbytečně utrpěla.


Kde to vzít?

  

Textový tvar Binární forma
ptk13.zip PTK13.hp