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:
« 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:
« 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 »
« 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:
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.
« 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 |