Programming Quiz
-
Richard Deeming wrote:
Now make it work for cultures whose week doesn't start on Sunday.
I wonder if there are any cultures that don't have a 7 day week? Or even the concept of a week?
Latest Articles:
16 Days: A TypeScript application from concept to implementationIs the 7 day week universal? : NoStupidQuestions[^]
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
OK, reformatted to protect the guilty. Write a function in your favorite language to create a "day view" in an array for a month, like 11/2019. So for that month/year, the array should look like this, where the day numbers not in the month are null or undefined:
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30My solution in C#, which uses an extension method:
int?[] days = new int?[6 * 7];
var dow = (int)new DateTime(2019, 11, 1).DayOfWeek;
Enumerable.Range(1, DateTime.DaysInMonth(2019, 11)).ForEachWithIndex((idx, n) => days[dow + idx] = n);And the output function:
days.ForEachWithIndex((idx, n) => Console.Write(((idx % 7 == 0) ? "\r\n" : "") + (n?.ToString()?.PadLeft(5) ?? " ")));
Which of course generates a leading CRLF, but oh well, that wasn't specifically indicated not to do so in the spec. :laugh: For the curious, this came up in a conversation with a coworker.
Latest Articles:
16 Days: A TypeScript application from concept to implementationPfft... I've been using an MS Word template with a macro to create calendars since the mid-90s. With weeks beginning on Monday as per ISO and ISO week numbers as well.
-
Now make it work for cultures whose week doesn't start on Sunday. ;P
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
Took this a step further and extended the code, and it should work with culture:
void Main()
{
StringBuilder builder = new StringBuilder();Enumerable.Range(1, 12) .ToList() .ForEach(e => PopulateDayOfMonth(2021, e, builder)); Console.WriteLine(builder.ToString().Trim());
}
static void PopulateDayOfMonth(int year, int month, StringBuilder builder)
{
builder.AppendLine();
int space = 6;
int dashLine = 1 + (space * 7);IEnumerable days = Enumerable.Range(1, DateTime.DaysInMonth(year, month)) .Select(d => new DateTime(year, month, d)); builder.AppendLine(days.First().ToString("MMMMM")); builder.Append('-', dashLine); builder.AppendLine(); builder.AppendLine($"|{string.Join("|", Enum.GetNames(typeof(DayOfWeek)).Select(d => $" {d.Substring(0, 3)} "))}|" ); builder.Append('-', dashLine); builder.AppendLine(); DayOfWeek dow = days.First().DayOfWeek; while (dow != 0) { builder.Append(' ', space); dow--; } bool first = true; foreach (var d in days) { if (!first && d.DayOfWeek == 0) { builder.AppendLine("|"); builder.Append('-', dashLine); builder.AppendLine(); } builder.Append($"|{d.Day.ToString().PadLeft(space - 2)} "); first = false; } builder.AppendLine("|"); builder.Append('-', dashLine); builder.AppendLine();
}
With the following output:
January
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
| 1 | 2 |
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
February
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
| 1 | 2 | 3 | 4 | 5 | 6 |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
-
Now make it work for cultures whose week doesn't start on Sunday. ;P
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
Sunday is part of the weekend. That's a clue as to the correct day that a week starts on
-
Took this a step further and extended the code, and it should work with culture:
void Main()
{
StringBuilder builder = new StringBuilder();Enumerable.Range(1, 12) .ToList() .ForEach(e => PopulateDayOfMonth(2021, e, builder)); Console.WriteLine(builder.ToString().Trim());
}
static void PopulateDayOfMonth(int year, int month, StringBuilder builder)
{
builder.AppendLine();
int space = 6;
int dashLine = 1 + (space * 7);IEnumerable days = Enumerable.Range(1, DateTime.DaysInMonth(year, month)) .Select(d => new DateTime(year, month, d)); builder.AppendLine(days.First().ToString("MMMMM")); builder.Append('-', dashLine); builder.AppendLine(); builder.AppendLine($"|{string.Join("|", Enum.GetNames(typeof(DayOfWeek)).Select(d => $" {d.Substring(0, 3)} "))}|" ); builder.Append('-', dashLine); builder.AppendLine(); DayOfWeek dow = days.First().DayOfWeek; while (dow != 0) { builder.Append(' ', space); dow--; } bool first = true; foreach (var d in days) { if (!first && d.DayOfWeek == 0) { builder.AppendLine("|"); builder.Append('-', dashLine); builder.AppendLine(); } builder.Append($"|{d.Day.ToString().PadLeft(space - 2)} "); first = false; } builder.AppendLine("|"); builder.Append('-', dashLine); builder.AppendLine();
}
With the following output:
January
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
| 1 | 2 |
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
February
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
| 1 | 2 | 3 | 4 | 5 | 6 |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
:thumbsup:
«One day it will have to be officially admitted that what we have christened reality is an even greater illusion than the world of dreams.» Salvador Dali
-
OK, reformatted to protect the guilty. Write a function in your favorite language to create a "day view" in an array for a month, like 11/2019. So for that month/year, the array should look like this, where the day numbers not in the month are null or undefined:
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30My solution in C#, which uses an extension method:
int?[] days = new int?[6 * 7];
var dow = (int)new DateTime(2019, 11, 1).DayOfWeek;
Enumerable.Range(1, DateTime.DaysInMonth(2019, 11)).ForEachWithIndex((idx, n) => days[dow + idx] = n);And the output function:
days.ForEachWithIndex((idx, n) => Console.Write(((idx % 7 == 0) ? "\r\n" : "") + (n?.ToString()?.PadLeft(5) ?? " ")));
Which of course generates a leading CRLF, but oh well, that wasn't specifically indicated not to do so in the spec. :laugh: For the curious, this came up in a conversation with a coworker.
Latest Articles:
16 Days: A TypeScript application from concept to implementationThis could be a fun little puzzle. I just get tired thinking about solving it, i would have to search for a time library in javascript/php, and then format the output nicely. Just not in the mood for a little puzzle, does anyone identify with this feeling sometimes? Nice quiz though.
-
Sunday is part of the weekend. That's a clue as to the correct day that a week starts on
Member 11005478 wrote:
weekend. That's a clue as to the correct day that a week starts on
Just like bookends are all on one side. :laugh:
Social Media - A platform that makes it easier for the crazies to find each other. Everyone is born right handed. Only the strongest overcome it. Fight for left-handed rights and hand equality.
-
OK, reformatted to protect the guilty. Write a function in your favorite language to create a "day view" in an array for a month, like 11/2019. So for that month/year, the array should look like this, where the day numbers not in the month are null or undefined:
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30My solution in C#, which uses an extension method:
int?[] days = new int?[6 * 7];
var dow = (int)new DateTime(2019, 11, 1).DayOfWeek;
Enumerable.Range(1, DateTime.DaysInMonth(2019, 11)).ForEachWithIndex((idx, n) => days[dow + idx] = n);And the output function:
days.ForEachWithIndex((idx, n) => Console.Write(((idx % 7 == 0) ? "\r\n" : "") + (n?.ToString()?.PadLeft(5) ?? " ")));
Which of course generates a leading CRLF, but oh well, that wasn't specifically indicated not to do so in the spec. :laugh: For the curious, this came up in a conversation with a coworker.
Latest Articles:
16 Days: A TypeScript application from concept to implementationIn Haskell (because, of course Haskell!): ```haskell import Data.List.Split import Data.Time.Calendar; import Data.Time.Calendar.Compat; import Data.Time.Calendar.Julian; import Text.Printf printMonth :: Integer -> Int -> IO () printMonth year month = printWeeks entriesInMonth where -- printWeeks chunks the month's entries into weeks & prints each week on a new line printWeeks days = mapM_ (putStrLn.unwords) (chunksOf 7 days) -- entriesInMonth concatenates the empty entries at the start of the month with the days entriesInMonth = startPadding ++ daysOfMonth -- daysOfMonth generates a list of days of the month as strings daysOfMonth = map (printf "%2d") [1..(julianMonthLength year month)] -- startPadding generates blank strings for each empty entry before day '1' startPadding = replicate blanksBeforeDay1 " " -- blanksBeforeDay1 is the number of empty entries before day '1' blanksBeforeDay1 = (fromEnum $ dayOfWeek (fromJulian year month 1)) `mod` 7 ``` which gives: ``` > printMonth 2019 12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 > printMonth 20190 12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 > printMonth 20190 11 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ``` [ETA] That's using the Julian calendar - the standard Gregorian calendar can be used by replacing the word 'julian' or 'Julian' with 'gregorian'/'Gregorian'. And yes, I should be able to remember which calendar we use :-O [/ETA]
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
-
In Haskell (because, of course Haskell!): ```haskell import Data.List.Split import Data.Time.Calendar; import Data.Time.Calendar.Compat; import Data.Time.Calendar.Julian; import Text.Printf printMonth :: Integer -> Int -> IO () printMonth year month = printWeeks entriesInMonth where -- printWeeks chunks the month's entries into weeks & prints each week on a new line printWeeks days = mapM_ (putStrLn.unwords) (chunksOf 7 days) -- entriesInMonth concatenates the empty entries at the start of the month with the days entriesInMonth = startPadding ++ daysOfMonth -- daysOfMonth generates a list of days of the month as strings daysOfMonth = map (printf "%2d") [1..(julianMonthLength year month)] -- startPadding generates blank strings for each empty entry before day '1' startPadding = replicate blanksBeforeDay1 " " -- blanksBeforeDay1 is the number of empty entries before day '1' blanksBeforeDay1 = (fromEnum $ dayOfWeek (fromJulian year month 1)) `mod` 7 ``` which gives: ``` > printMonth 2019 12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 > printMonth 20190 12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 > printMonth 20190 11 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ``` [ETA] That's using the Julian calendar - the standard Gregorian calendar can be used by replacing the word 'julian' or 'Julian' with 'gregorian'/'Gregorian'. And yes, I should be able to remember which calendar we use :-O [/ETA]
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
So, I don't know shit about Haskell, but shouldn't it be Data.Time.Calendar.Gregorian instead of Data.Time.Calendar.Julian? Unless you're living in Russia that is.
Wrong is evil and must be defeated. - Jeff Ello
-
Member 11005478 wrote:
weekend. That's a clue as to the correct day that a week starts on
Just like bookends are all on one side. :laugh:
Social Media - A platform that makes it easier for the crazies to find each other. Everyone is born right handed. Only the strongest overcome it. Fight for left-handed rights and hand equality.
Otherwise you could use Genesis 2.2 as a reference.
Wrong is evil and must be defeated. - Jeff Ello
-
Otherwise you could use Genesis 2.2 as a reference.
Wrong is evil and must be defeated. - Jeff Ello
Jörgen Andersson wrote:
Otherwise you could use Genesis 2.2 as a reference.
Correct. The Old Testament week.
Social Media - A platform that makes it easier for the crazies to find each other. Everyone is born right handed. Only the strongest overcome it. Fight for left-handed rights and hand equality.
-
So, I don't know shit about Haskell, but shouldn't it be Data.Time.Calendar.Gregorian instead of Data.Time.Calendar.Julian? Unless you're living in Russia that is.
Wrong is evil and must be defeated. - Jeff Ello
>
Jörgen Andersson wrote:
shouldn't it be Data.Time.Calendar.Gregorian instead of Data.Time.Calendar.Julian You're quite right - and that's my mistake, getting Gregorian/Julian mixed up! Gregorian is actually the default, baked into `Data.Time.Calendar`, while Julian is the add-on... ```haskell import Data.List.Split import Data.Time.Calendar; import Data.Time.Calendar.Compat; import Text.Printf printMonth :: Integer -> Int -> IO () printMonth year month = printWeeks entriesInMonth where -- printWeeks chunks the month's entries into weeks & prints each week on a new line printWeeks days = mapM_ (putStrLn.unwords) (chunksOf 7 days) -- entriesInMonth concatenates the empty entries at the start of the month with the days entriesInMonth = startPadding ++ daysOfMonth -- daysOfMonth generates a list of days of the month as strings daysOfMonth = map (printf "%2d") [1..(gregorianMonthLength year month)] -- startPadding generates blank strings for each empty entry before day '1' startPadding = replicate blanksBeforeDay1 " " -- blanksBeforeDay1 is the number of empty entries before day '1' blanksBeforeDay1 = (fromEnum $ dayOfWeek (fromGregorian year month 1)) `mod` 7 ``` Being able to use `Data.Time.Calendar` rather than `Data.Time.Calendar.Julian` should have been a giveaway, shouldn't it :-O
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
-
OK, reformatted to protect the guilty. Write a function in your favorite language to create a "day view" in an array for a month, like 11/2019. So for that month/year, the array should look like this, where the day numbers not in the month are null or undefined:
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30My solution in C#, which uses an extension method:
int?[] days = new int?[6 * 7];
var dow = (int)new DateTime(2019, 11, 1).DayOfWeek;
Enumerable.Range(1, DateTime.DaysInMonth(2019, 11)).ForEachWithIndex((idx, n) => days[dow + idx] = n);And the output function:
days.ForEachWithIndex((idx, n) => Console.Write(((idx % 7 == 0) ? "\r\n" : "") + (n?.ToString()?.PadLeft(5) ?? " ")));
Which of course generates a leading CRLF, but oh well, that wasn't specifically indicated not to do so in the spec. :laugh: For the curious, this came up in a conversation with a coworker.
Latest Articles:
16 Days: A TypeScript application from concept to implementation -
>
Jörgen Andersson wrote:
shouldn't it be Data.Time.Calendar.Gregorian instead of Data.Time.Calendar.Julian You're quite right - and that's my mistake, getting Gregorian/Julian mixed up! Gregorian is actually the default, baked into `Data.Time.Calendar`, while Julian is the add-on... ```haskell import Data.List.Split import Data.Time.Calendar; import Data.Time.Calendar.Compat; import Text.Printf printMonth :: Integer -> Int -> IO () printMonth year month = printWeeks entriesInMonth where -- printWeeks chunks the month's entries into weeks & prints each week on a new line printWeeks days = mapM_ (putStrLn.unwords) (chunksOf 7 days) -- entriesInMonth concatenates the empty entries at the start of the month with the days entriesInMonth = startPadding ++ daysOfMonth -- daysOfMonth generates a list of days of the month as strings daysOfMonth = map (printf "%2d") [1..(gregorianMonthLength year month)] -- startPadding generates blank strings for each empty entry before day '1' startPadding = replicate blanksBeforeDay1 " " -- blanksBeforeDay1 is the number of empty entries before day '1' blanksBeforeDay1 = (fromEnum $ dayOfWeek (fromGregorian year month 1)) `mod` 7 ``` Being able to use `Data.Time.Calendar` rather than `Data.Time.Calendar.Julian` should have been a giveaway, shouldn't it :-O
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
Stuart Dootson wrote:
Being able to use
Data.Time.Calendar
rather thanData.Time.Calendar.Julian
should have been a giveaway, shouldn't it :OI wouldn't have known. :doh: :-O
Wrong is evil and must be defeated. - Jeff Ello
-
Took this a step further and extended the code, and it should work with culture:
void Main()
{
StringBuilder builder = new StringBuilder();Enumerable.Range(1, 12) .ToList() .ForEach(e => PopulateDayOfMonth(2021, e, builder)); Console.WriteLine(builder.ToString().Trim());
}
static void PopulateDayOfMonth(int year, int month, StringBuilder builder)
{
builder.AppendLine();
int space = 6;
int dashLine = 1 + (space * 7);IEnumerable days = Enumerable.Range(1, DateTime.DaysInMonth(year, month)) .Select(d => new DateTime(year, month, d)); builder.AppendLine(days.First().ToString("MMMMM")); builder.Append('-', dashLine); builder.AppendLine(); builder.AppendLine($"|{string.Join("|", Enum.GetNames(typeof(DayOfWeek)).Select(d => $" {d.Substring(0, 3)} "))}|" ); builder.Append('-', dashLine); builder.AppendLine(); DayOfWeek dow = days.First().DayOfWeek; while (dow != 0) { builder.Append(' ', space); dow--; } bool first = true; foreach (var d in days) { if (!first && d.DayOfWeek == 0) { builder.AppendLine("|"); builder.Append('-', dashLine); builder.AppendLine(); } builder.Append($"|{d.Day.ToString().PadLeft(space - 2)} "); first = false; } builder.AppendLine("|"); builder.Append('-', dashLine); builder.AppendLine();
}
With the following output:
January
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
| 1 | 2 |
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
February
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
| 1 | 2 | 3 | 4 | 5 | 6 |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
Unfortunately, that still assumes the first day of the week is Sunday. :)
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
Now make it work for cultures whose week doesn't start on Sunday. ;P
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
The first thing that I thought as well...here in Poland, the week starts on Monday. Almost two years here and this still throws me off.
-
Richard Deeming wrote:
Now make it work for cultures whose week doesn't start on Sunday.
I wonder if there are any cultures that don't have a 7 day week? Or even the concept of a week?
Latest Articles:
16 Days: A TypeScript application from concept to implementationFor bonus points, on the management/sales side: - convince a culture with a different week size to adopt the 7 days week. - convince a culture without the concept of calendar to adopt a 10 days week calendar (or 5 day, for the impatient), and then apply previous step.
-
Richard Deeming wrote:
cultures whose week doesn't start on Sunday.
That's easy - NUKE 'EM !
"The difference between genius and stupidity is that genius has its limits." - Albert Einstein
"If you are searching for perfection in others, then you seek disappointment. If you seek perfection in yourself, then you will find failure." - Balboos HaGadol Mar 2010
Slow down there Donald.
-
Otherwise you could use Genesis 2.2 as a reference.
Wrong is evil and must be defeated. - Jeff Ello
Hold up, this is implying that we need to start working Saturdays, a six work-day week.
-
Slow down there Donald.
Not at all - as a humanitarian, I prefer to make in quick and painless. . . . at least I won't feel a thing . . .
"The difference between genius and stupidity is that genius has its limits." - Albert Einstein
"If you are searching for perfection in others, then you seek disappointment. If you seek perfection in yourself, then you will find failure." - Balboos HaGadol Mar 2010