Last Friday of each month: Difference between revisions
Content added Content deleted
(Added Algol 68) |
(Added solution for Action!) |
||
Line 126: | Line 126: | ||
2016-11-25 |
2016-11-25 |
||
2016-12-30 |
2016-12-30 |
||
</pre> |
|||
=={{header|Action!}}== |
|||
<lang Action!>;https://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week#Sakamoto.27s_methods |
|||
BYTE FUNC DayOfWeek(INT y BYTE m,d) ;1<=m<=12, y>1752 |
|||
BYTE ARRAY t=[0 3 2 5 0 3 5 1 4 6 2 4] |
|||
BYTE res |
|||
IF m<3 THEN |
|||
y==-1 |
|||
FI |
|||
res=(y+y/4-y/100+y/400+t(m-1)+d) MOD 7 |
|||
RETURN (res) |
|||
BYTE FUNC IsLeapYear(INT y) |
|||
IF y MOD 100=0 THEN |
|||
IF y MOD 400=0 THEN |
|||
RETURN (1) |
|||
ELSE |
|||
RETURN (0) |
|||
FI |
|||
FI |
|||
IF y MOD 4=0 THEN |
|||
RETURN (1) |
|||
FI |
|||
RETURN (0) |
|||
INT FUNC GetMaxDay(INT y BYTE m) |
|||
BYTE ARRAY MaxDay=[31 28 31 30 31 30 31 31 30 31 30 31] |
|||
IF m=2 AND IsLeapYear(y)=1 THEN |
|||
RETURN (29) |
|||
FI |
|||
RETURN (MaxDay(m-1)) |
|||
PROC PrintB2(BYTE x) |
|||
IF x<10 THEN |
|||
Put('0) |
|||
FI |
|||
PrintB(x) |
|||
RETURN |
|||
PROC Main() |
|||
INT MinYear=[1753],MaxYear=[9999],y |
|||
BYTE m,d,last,maxD |
|||
DO |
|||
PrintF("Input year in range %I...%I: ",MinYear,MaxYear) |
|||
y=InputI() |
|||
UNTIL y>=MinYear AND y<=MaxYear |
|||
OD |
|||
FOR m=1 TO 12 |
|||
DO |
|||
last=0 |
|||
maxD=GetMaxDay(y,m) |
|||
FOR d=1 TO maxD |
|||
DO |
|||
IF DayOfWeek(y,m,d)=5 THEN |
|||
last=d |
|||
FI |
|||
OD |
|||
PrintI(y) Put('-) |
|||
PrintB2(m) Put('-) |
|||
PrintB2(last) PutE() |
|||
OD |
|||
RETURN</lang> |
|||
{{out}} |
|||
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Last_Friday_of_each_month.png Screenshot from Atari 8-bit computer] |
|||
<pre> |
|||
Input year in range 1753...9999: 2021 |
|||
2021-01-29 |
|||
2021-02-26 |
|||
2021-03-26 |
|||
2021-04-30 |
|||
2021-05-28 |
|||
2021-06-25 |
|||
2021-07-30 |
|||
2021-08-27 |
|||
2021-09-24 |
|||
2021-10-29 |
|||
2021-11-26 |
|||
2021-12-31 |
|||
</pre> |
</pre> |
||