Day of the week of Christmas and New Year: Difference between revisions
Not a robot (talk | contribs) (Add BASIC) |
Not a robot (talk | contribs) (Add BCPL) |
||
Line 128:
<pre>12/25/2021 is a Saturday
1/ 1/2022 is a Saturday</pre>
=={{header|BCPL}}==
<lang bcpl>get "libhdr"
let dayofweek(y,m,d) = valof
$( let j, k = ?, ?
if m<=2
$( m := m+12
y := y-1
$)
j := y/100
k := y rem 100
d := (d + ((m+1)*26)/10 + k + k/4 + j/4 + 5*j) rem 7
switchon d into
$( case 0: resultis "Saturday"
case 1: resultis "Sunday"
case 2: resultis "Monday"
case 3: resultis "Tuesday"
case 4: resultis "Wednesday"
case 5: resultis "Thursday"
case 6: resultis "Friday"
$)
$)
let show(y,m,d) be
writef("%N/%N/%N is a %S*N", m, d, y, dayofweek(y, m, d))
let start() be
$( show(2021,12,25)
show(2022,1,1)
$)</lang>
{{out}}
<pre>12/25/2021 is a Saturday
1/1/2022 is a Saturday</pre>
=={{header|CLU}}==
|
Revision as of 21:07, 12 January 2022
- Task
Determine programatically and show on this page on what weekday Christmas Day, 2021 and New Year's Day, 2022 will fall or did fall.
11l
<lang 11l>V weekDays = [‘Sunday’, ‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’, ‘Saturday’] V thisXMas = Time(2021, 12, 25) V thisXMasDay = Int(thisXMas.strftime(‘%w’)) V thisXMasDayAsString = weekDays[thisXMasDay] print(‘This year's Christmas is on a ’thisXMasDayAsString)
V nextNewYear = Time(2022, 1, 1) V nextNewYearDay = Int(nextNewYear.strftime(‘%w’)) V nextNewYearDayAsString = weekDays[nextNewYearDay] print(‘Next new year is on a ’nextNewYearDayAsString)</lang>
- Output:
This year's Christmas is on a Saturday Next new year is on a Saturday
Ada
<lang Ada>with Ada.Text_Io; with Ada.Calendar.Formatting;
procedure Weekdays is
use Ada.Text_Io; use Ada.Calendar.Formatting;
subtype Time is Ada.Calendar.Time;
procedure Info (Date : Time) is begin Put (Image (Date)); Put (" is a "); Put (Day_Name'Image (Day_Of_Week (Date))); Put ("."); New_Line; end Info;
Christmas_Day : constant Time := Time_Of (Year => 2021, Month => 12, Day => 25); New_Years_Day : constant Time := Time_Of (Year => 2022, Month => 01, Day => 01);
begin
Info (Christmas_Day); Info (New_Years_Day);
end Weekdays;</lang>
- Output:
2021-12-25 00:00:00 is a SATURDAY. 2022-01-01 00:00:00 is a SATURDAY.
ALGOL W
Re-using code from the Day of the week task. <lang algolw>begin % find the day of the week 25/12/2021 and 01/01/2022 fall on %
string(10) array dayName( 0 :: 6 ); integer procedure Day_of_week ( integer value d, m, y ); begin integer j, k, mm, yy; mm := m; yy := y; if mm <= 2 then begin mm := mm + 12; yy := yy - 1; end if_m_le_2; j := yy div 100; k := yy rem 100; (d + ( ( mm + 1 ) * 26 ) div 10 + k + k div 4 + j div 4 + 5 * j ) rem 7 end Day_of_week; dayName( 0 ) := "Saturday"; dayName( 1 ) := "Sunday"; dayName( 2 ) := "Monday"; dayName( 3 ) := "Tuesday"; dayName( 4 ) := "Wednesday"; dayName( 5 ) := "Thursday"; dayName( 6 ) := "Friday"; write( "25th of December 2021 is a ", dayName( Day_of_week( 25, 12, 2021 ) ) ); write( " 1st of January 2022 is a ", dayName( Day_of_week( 1, 1, 2022 ) ) )
end.</lang>
- Output:
25th of December 2021 is a Saturday 1st of January 2022 is a Saturday
AWK
<lang AWK>
- syntax: GAWK -f WHAT_WEEKDAYS_WILL_CHRISTMAS_AND_NEW_YEAR.AWK
BEGIN {
fmt = "%Y-%m-%d is a %A" print(strftime(fmt,mktime("2021 12 25 0 0 0"))) print(strftime(fmt,mktime("2022 01 01 0 0 0"))) print("") fmt = "%d %b %Y is %A" print(strftime(fmt,mktime("2021 12 25 0 0 0"))) print(strftime(fmt,mktime("2022 01 01 0 0 0"))) exit(0)
} </lang>
- Output:
2021-12-25 is a Saturday 2022-01-01 is a Saturday 25 Dec 2021 is Saturday 01 Jan 2022 is Saturday
BASIC
<lang gwbasic>10 DEFINT A-Z 20 DIM D$(6) 30 FOR I=0 TO 6: READ D$(I): NEXT 40 FOR I=1 TO 2 50 READ Y,M,D 60 PRINT USING "##/##/#### is a ";M;D;Y; 70 IF M<=2 THEN M=M+12: Y=Y-1 80 J=Y\100 90 K=Y MOD 100 100 D=(D+((M+1)*26)\10+K+K\4+J\4+5*J) MOD 7 110 PRINT D$(D) 120 NEXT 130 DATA Saturday,Sunday,Monday,Tuesday,Wednesday,Thursday,Friday 140 DATA 2021,12,25 150 DATA 2022,1,1</lang>
- Output:
12/25/2021 is a Saturday 1/ 1/2022 is a Saturday
BCPL
<lang bcpl>get "libhdr"
let dayofweek(y,m,d) = valof $( let j, k = ?, ?
if m<=2 $( m := m+12 y := y-1 $) j := y/100 k := y rem 100 d := (d + ((m+1)*26)/10 + k + k/4 + j/4 + 5*j) rem 7 switchon d into $( case 0: resultis "Saturday" case 1: resultis "Sunday" case 2: resultis "Monday" case 3: resultis "Tuesday" case 4: resultis "Wednesday" case 5: resultis "Thursday" case 6: resultis "Friday" $)
$)
let show(y,m,d) be
writef("%N/%N/%N is a %S*N", m, d, y, dayofweek(y, m, d))
let start() be $( show(2021,12,25)
show(2022,1,1)
$)</lang>
- Output:
12/25/2021 is a Saturday 1/1/2022 is a Saturday
CLU
<lang clu>day_of_week = proc (d: date) returns (string)
own days: array[string] := array[string]$ [0:"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"] m: int := d.month y: int := d.year if m <= 2 then m := m + 12 y := y - 1 end j: int := y/100 k: int := y//100 dn: int := (d.day + ((m+1)*26)/10 + k + k/4 + j/4 + 5*j)//7 return(days[dn])
end day_of_week
start_up = proc ()
po: stream := stream$primary_output() days: array[date] := array[date]$ [date$create(25, 12, 2021, 0, 0, 0), date$create( 1, 1, 2022, 0, 0, 0)] for d: date in array[date]$elements(days) do stream$putl(po, date$unparse_date(d) || " is a " || day_of_week(d)) end
end start_up</lang>
- Output:
25 December 2021 is a Saturday 1 January 2022 is a Saturday
F#
<lang fsharp> // Show day of week for Christmas Day, 2021 and New Year's Day, 2022. Nigel Galloway: December 1st., 2021 printfn $"Christmas Day 2021 is a %s{string(System.DateTime(2021,12,25).DayOfWeek)}. New Years Day 2022 is a %s{string(System.DateTime(2022,1,1).DayOfWeek)}." </lang>
- Output:
Christmas Day 2021 is a Saturday. New Years Day 2022 is a Saturday.
Factor
<lang factor>USING: calendar calendar.english calendar.holidays.us formatting kernel sequences ;
CONSTANT: msg
"In %d, New Years is on a %s, and Christmas is on a %s.\n"
- day-name ( ts -- str ) day-of-week day-names nth ;
- christmas ( n -- str ) christmas-day day-name ;
- new-years ( n -- str ) new-years-day day-name ;
- holidays ( n -- ny ch ) [ new-years ] [ christmas ] bi ;
- .holidays ( seq -- ) [ dup holidays msg printf ] each ;
{ 1578 1590 1642 1957 2020 2021 2022 2242 2245 2393 } .holidays</lang>
- Output:
In 1578, New Years is on a Sunday, and Christmas is on a Monday. In 1590, New Years is on a Monday, and Christmas is on a Tuesday. In 1642, New Years is on a Wednesday, and Christmas is on a Thursday. In 1957, New Years is on a Tuesday, and Christmas is on a Wednesday. In 2020, New Years is on a Wednesday, and Christmas is on a Friday. In 2021, New Years is on a Friday, and Christmas is on a Saturday. In 2022, New Years is on a Saturday, and Christmas is on a Sunday. In 2242, New Years is on a Saturday, and Christmas is on a Sunday. In 2245, New Years is on a Wednesday, and Christmas is on a Thursday. In 2393, New Years is on a Friday, and Christmas is on a Saturday.
FreeBASIC
<lang freebasic>#include "vbcompat.bi" 'contains functions for dealing with dates and times
- include "string.bi" 'contains functions for formatting text strings
dim as double christmas = DateSerial(2021, 12, 25) 'enter the dates of the two holidays dim as double newyears = DateSerial(2022, 01, 01)
print "Christmas Day 2021 is on a "; format(christmas,"dddd") print "New Year's Day 2022 is on a "; format(newyears, "dddd")</lang>
- Output:
Christmas Day 2021 is on a Saturday New Year's Day 2022 is on a Saturday
jq
Works with gojq, the Go implementation of jq
Years, output format, and output are exactly as for Wren.
<lang jq>def weekdaynames:
["Sunday", "Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
- example: weekday(1999; 12; 25)
def weekday($year; $month; $day):
"\($year)-\($month)-\($day)" | strptime("%Y-%m-%d") | weekdaynames[.[-2]];
1578, 1590, 1642, 1957, 2020, 2021, 2022, 2242, 2245, 2393 | "In \(.), New year's day is on a \(weekday(.;1;1)), and Christmas day on \(weekday(.;12;25))."</lang>
- Output:
As for #Wren
Julia
See also https://docs.julialang.org/en/v1/stdlib/Dates/#Dates.format-Tuple{TimeType,%20AbstractString} <lang julia>using Dates
for year in [1578, 1590, 1642, 1957, 2020, 2021, 2022, 2242, 2245, 2393]
println("Year $year, New Years's Day: ", Dates.format(DateTime(year, 1, 1), "E, U d, Y"), " and Christmas: ", Dates.format(DateTime(year, 12, 25), "E, U d, Y"))
end
</lang>
- Output:
Year 1578, New Years's Day: Sunday, January 1, 1578 and Christmas: Monday, December 25, 1578 Year 1590, New Years's Day: Monday, January 1, 1590 and Christmas: Tuesday, December 25, 1590 Year 1642, New Years's Day: Wednesday, January 1, 1642 and Christmas: Thursday, December 25, 1642 Year 1957, New Years's Day: Tuesday, January 1, 1957 and Christmas: Wednesday, December 25, 1957 Year 2020, New Years's Day: Wednesday, January 1, 2020 and Christmas: Friday, December 25, 2020 Year 2021, New Years's Day: Friday, January 1, 2021 and Christmas: Saturday, December 25, 2021 Year 2022, New Years's Day: Saturday, January 1, 2022 and Christmas: Sunday, December 25, 2022 Year 2242, New Years's Day: Saturday, January 1, 2242 and Christmas: Sunday, December 25, 2242 Year 2245, New Years's Day: Wednesday, January 1, 2245 and Christmas: Thursday, December 25, 2245 Year 2393, New Years's Day: Friday, January 1, 2393 and Christmas: Saturday, December 25, 2393
ooRexx
<lang oorexx>/* REXX */ Call wkd 2021,12,25 Call wkd 2022,01,01 Exit wkd: Parse Arg y,m,d wd=.Array~of('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday') dt=.DateTime~new(y,m,d) say d'.'m'.'y 'is a' wd[dt~weekday]
Return</lang>
- Output:
25.12.2021 is a Saturday 01.01.2022 is a Saturday<
Perl
<lang perl>#!/usr/bin/perl
use strict; # https://rosettacode.org/wiki/What_weekdays_will_Christmas_and_New_Year use warnings; use Time::Local;
for (
['Christmas 2021', 25, 11, 2021 ], ['New Years 2022', 1, 0, 2022 ], ) { print "$_->[0] ", qw( Sunday Monday Tuesday Wednesday Thursday Fridat Saturday ) [(localtime timelocal(0, 0, 12, @{$_}[1..3]))[6]], "\n"; }</lang>
- Output:
Christmas 2021 Saturday New Years 2022 Saturday
Phix
with javascript_semantics include timedate.e procedure nyc(integer year) string ny = format_timedate({year,1,1,0,0,0},"Dddd"), cd = format_timedate({year,12,25,0,0,0},"Dddd") printf(1,"In %d, New year's day is on a %s, and Christmas day on a %s.\n",{year,ny,cd}) end procedure papply({1578, 1590, 1642, 1957, 2020, 2021, 2022, 2242, 2245, 2393},nyc)
Note the builtin timedate type does not officially support dates prior to 1752... the fact that the first three lines agree with other entries on this page is pure luck.
- Output:
In 1578, New year's day is on a Sunday, and Christmas day on a Monday. In 1590, New year's day is on a Monday, and Christmas day on a Tuesday. In 1642, New year's day is on a Wednesday, and Christmas day on a Thursday. In 1957, New year's day is on a Tuesday, and Christmas day on a Wednesday. In 2020, New year's day is on a Wednesday, and Christmas day on a Friday. In 2021, New year's day is on a Friday, and Christmas day on a Saturday. In 2022, New year's day is on a Saturday, and Christmas day on a Sunday. In 2242, New year's day is on a Saturday, and Christmas day on a Sunday. In 2245, New year's day is on a Wednesday, and Christmas day on a Thursday. In 2393, New year's day is on a Friday, and Christmas day on a Saturday.
Python
<lang python> import datetime
weekDays = ("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday") thisXMas = datetime.date(2021,12,25) thisXMasDay = thisXMas.weekday() thisXMasDayAsString = weekDays[thisXMasDay] print("This year's Christmas is on a {}".format(thisXMasDayAsString))
nextNewYear = datetime.date(2022,1,1) nextNewYearDay = nextNewYear.weekday() nextNewYearDayAsString = weekDays[nextNewYearDay] print("Next new year is on a {}".format(nextNewYearDayAsString)) </lang>
- Output:
This year's Christmas is on a Saturday Next new year is on a Saturday
Raku
<lang perl6>my @d-o-w = < Sunday Monday Tuesday Wednesday Thursday Friday Saturday >;
.say for (flat 2020..2022, (1500 .. 2500).roll(7)).sort.map: {
"In {$_}, New Years is on a { @d-o-w[Date.new($_, 1, 1).day-of-week % 7] }, " ~ "and Christmas on a { @d-o-w[Date.new($_, 12, 25).day-of-week % 7] }."
}</lang>
- Sample output:
In 1578, New Years is on a Sunday, and Christmas on a Monday. In 1590, New Years is on a Monday, and Christmas on a Tuesday. In 1642, New Years is on a Wednesday, and Christmas on a Thursday. In 1957, New Years is on a Tuesday, and Christmas on a Wednesday. In 2020, New Years is on a Wednesday, and Christmas on a Friday. In 2021, New Years is on a Friday, and Christmas on a Saturday. In 2022, New Years is on a Saturday, and Christmas on a Sunday. In 2242, New Years is on a Saturday, and Christmas on a Sunday. In 2245, New Years is on a Wednesday, and Christmas on a Thursday. In 2393, New Years is on a Friday, and Christmas on a Saturday.
Ring
<lang ring>? "working..." weekdays = ["Mon","Tues","Wednes","Thurs","Fri","Satur","Sun"] dow = timelist()[15] today = date() tycd = "25/12/" + substr(today, 7, 4) nnyd = "01/01/" + string(number(substr(today, 7, 4)) + 1) for day = 0 to 366
anotherday = adddays(today, day) if anotherday = tycd ? "This year's Christmas day is on a " + nameof(day) + "." ok if anotherday = nnyd ? "The next New Year's day is on a " + nameof(day) + "." exit ok
next put "done..."
func nameof day
return weekdays[((day + today - 1) % 7) + 1] + "day"</lang>
- Output:
working... This year's Christmas day is on a Saturday. The next New Year's day is on a Saturday. done...
Ruby
This uses the same years as the Raku example. The Ruby Date class does however take the calendar reform (default 1582) into account, so the days for 1578 differ from all other languages so far. <lang ruby>require 'date'
years = [1578, 1590, 1642, 1957, 2020, 2021, 2022, 2242, 2245, 2393] years.each do |year|
xmas = Date.new(year,12,25).strftime("%A") ny = Date.new(year, 1, 1).strftime("%A") puts "In #{year}, New year's day is on a #{ny}, and Christmas day on #{xmas}."
end </lang>
- Output:
In 1578, New year's day is on a Wednesday, and Christmas day on Thursday. In 1590, New year's day is on a Monday, and Christmas day on Tuesday. In 1642, New year's day is on a Wednesday, and Christmas day on Thursday. In 1957, New year's day is on a Tuesday, and Christmas day on Wednesday. In 2020, New year's day is on a Wednesday, and Christmas day on Friday. In 2021, New year's day is on a Friday, and Christmas day on Saturday. In 2022, New year's day is on a Saturday, and Christmas day on Sunday. In 2242, New year's day is on a Saturday, and Christmas day on Sunday. In 2245, New year's day is on a Wednesday, and Christmas day on Thursday. In 2393, New year's day is on a Friday, and Christmas day on Saturday.
Wren
This uses the same years as the Raku example.
The actual days for 1578 may have been different as the Gregorian calendar didn't start until 1582. <lang ecmascript>import "./date" for Date
var years = [1578, 1590, 1642, 1957, 2020, 2021, 2022, 2242, 2245, 2393] for (year in years) {
var newYear = Date.new(year, 1, 1).weekDay var xmas = Date.new(year, 12, 25).weekDay System.print("In %(year), New year's day is on a %(newYear), and Christmas day on %(xmas).")
}</lang>
- Output:
In 1578, New year's day is on a Sunday, and Christmas day on Monday. In 1590, New year's day is on a Monday, and Christmas day on Tuesday. In 1642, New year's day is on a Wednesday, and Christmas day on Thursday. In 1957, New year's day is on a Tuesday, and Christmas day on Wednesday. In 2020, New year's day is on a Wednesday, and Christmas day on Friday. In 2021, New year's day is on a Friday, and Christmas day on Saturday. In 2022, New year's day is on a Saturday, and Christmas day on Sunday. In 2242, New year's day is on a Saturday, and Christmas day on Sunday. In 2245, New year's day is on a Wednesday, and Christmas day on Thursday. In 2393, New year's day is on a Friday, and Christmas day on Saturday.
XPL0
<lang XPL0>func WeekDay(Year, Month, Day); \Return address of day of week int Year, Month, Day; \Works for years 1583 onward int DayOfWeek, Names; [if Month<=2 then [Month:= Month+12; Year:= Year-1]; DayOfWeek:= rem((Day-1 + (Month+1)*26/10 + Year + Year/4 + Year/100*6 + Year/400)/7); Names:= ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; return Names(DayOfWeek); ]; \WeekDay
[Text(0, "This Christmas is on a "); Text(0, WeekDay(2021, 12, 25)); CrLf(0); Text(0, "This New Year's Day is on a "); Text(0, WeekDay(2022, 1, 1)); CrLf(0); ]</lang>
- Output:
This Christmas is on a Saturday This New Year's Day is on a Saturday