Výpočet data velikonoční neděle

Téma zabývající se Výpočtem dne v týdnu a počtu dní mezi dvěma daty je nejprve zpracováno pro ryzí RPN kalkulátory. Navazujícím tématem je varianta výpočtu pro HP-50g, tedy kalkulátor RPL. Stejnou situaci přináší i toto téma. Výpočet data velikonoční neděle pro RPN kalkulátor HP-35s je zde řešen pro kalkulátor RPL, kterým je opět HP-50g (nebo jiný z řady HP-48/49).


Zdrojový text

  

Textový výpis programu (jeho výkonná část bez úvodních kontrol) nemá obvyklou strukturovanou podobu, jak ji nabízí kalkulátor. Dalo by se říci, že níže vyobrazený text je krokem zpět, neboť se podobá spíše RPN programu. Důvod je ale zřejmý - komentáře tvoří sloupce obsahů jednotlivých úrovní stacku. Názvy proměnných g, c, x, z, d, e, n, m, f, h a jediného argumentu y funkce easter() v původním řešení pro HP-35s jsou použity i zde. Lze tedy snadno konfrontovat obě verze programu: HP-35s vs. HP-50g.

EASTR
«
IF DEPTH 0. ≤
THEN
	DATE 100. * FP 10000. *
END
1. → y g
«
CASE	y TYPE 0. ==
	THEN END
	y TYPE 28. ==
	THEN END
	y # 202h DOERR
END
IF y 1582. <
THEN
	y # 203h DOERR
END
y IP 'y' STO
y		@ y
19.		@ 19			y
MOD		@ y % 19
'g'		@ 'g'			y % 19
STO+
y		@ y
100.		@ 100			y
/		@ y/100
IP		@ intg(y/100)
1.		@ 1			intg(y/100)
+		@ c=intg(y/100)+1;
DUP		@ c			c
0.75		@ 0.75			c		c
*		@ 0.75c			c
IP		@ intg(0.75c)		c
2.		@ 2			intg(0.75 c)	c
-		@ x=intg(0.75c)-2;	c
SWAP		@ c			x
0.32		@ 0.32			c		x
*		@ 0.32c			x
0.2		@ 0.2			0.32 c		x
+		@ 0.32c+0.2		x
IP		@ z=intg(0.32c+0.2);	x
SWAP		@ x			z
DUP		@ x			x		z
y		@ y			x		x		z
1.25		@ 1.25			y		x		x		z
*		@ 1.25y			x		x		z
IP		@ intg(1.25y)		x		x		z
SWAP		@ x			intg(1.25y)	x		z
-		@ d=intg(1.25y)-x;	x		z
UNROT		@ x			z		d
11.		@ 11			x		z		d
g		@ g			11		x		z		d
*		@ 11g			x		z		d
25.		@ 25			11g		x		z		d
+		@ 11g+25		x		z		d
SWAP		@ x			11g+25		z		d
-		@ 11g+25-x		z		d
+		@ 11g+25+z-x		d
30.		@ 30			11g+25+z-x	d
MOD		@ e=(11g+25+z-x)%30;	d
24.		@ 24.			e		d
-		@ f=e-24		d
IF
	DUP	@ f			f		d
THEN
	11.	@ 11			f		d
	g	@ g			11		f		d
	-	@ 11-g			f		d
	SIGN	@ sign(11-g)		f		d
	2.	@ 2			sign(11-g)	f		d
	/	@ sign(11-g)/2		f		d
	IP	@ intg(sign(11-g)/2)	f		d
	NEG	@ h=-intg(sign(11-g)/2)	f		d
	OVER	@ f			h		f		d
	==	@ 1nebo0		f		d
ELSE
	1.	@ 1			f		d
END
+		@ f=f+1nebo0;		d
NEG		@ n=-f;			d
DUP		@ n			n		d
IF
	0	@ 0			n		n		d
@ 1nebo0		n		d
THEN
	30.	@ 30			n		d
	+	@ n=n+30;		d
END
20.		@ 20			n		d
+		@ n=n+20;		d
DUP		@ n			n		d
7.		@ 7			n		n		d
+		@ n+7			n		d
UNROT		@ n			d		n+7
+		@ d+n			n+7
7.		@ 7			d+n		n+7
MOD		@ (d+n)%7		n+7
-		@ m=n+7-(d+n)%7;
DUP		@ m			m
y		@ y			m		m
UNROT		@ m			m		y
IF
	31.	@ 31			m		m		y
	>	@ 1nebo0		m		y
THEN
	31.	@ 31			m		y
	-	@ m=m-31;		y
	4.	@ 4=duben		m		y
ELSE
	3.	@ 3=brezen		m		y
END
SWAP		@ m			3nebo4		y
IFERR
{ HOME PRGM ML20 ML20REQ }
		@ path			m		3nebo4		y
	RCL	@ << >>			m		3nebo4		y
THEN
	DROP	@ m			3nebo4		y
ELSE
	EVAL	@ "YYYY-MM-DD"
END
»
»

Použití programu

  

Tady je jakékoliv povídání ztrátou času. Použití je nehorázně snadné. Stačí:

Pozn.: Pokud někoho matou barvy podkladu vyjmenovaných kláves, vysvětlivky jsou k nahlédnutí zde.

Celý postup s možnými tvary výsledků ukazují následující obrázky.

Program využívá pro zobrazení výsledku v notaci "YYYY-MM-DD" podprogram ML20REQ (kompletní cesta je { HOME PRGM ML20 ML20REQ }). Pokud podprogram z nějakých důvodů není k mání, výstupem jsou tři hodnoty v pořadí ROK, MĚSÍC, DEN uložené na stack.


Kde to vzít?

  

Textový tvar Binární forma
EASTR EASTR.hp