Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. The Lounge
  3. Programming Quiz

Programming Quiz

Scheduled Pinned Locked Moved The Lounge
csharpjavascriptcomdata-structuresquestion
29 Posts 19 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Marc Clifton

    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 30

    My 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

    A Offline
    A Offline
    agolddog
    wrote on last edited by
    #21

    Checkin rejected, hard-coded values. Just kidding, the knuckleheads I work with hard-code things all over the place, and management won't let us have any code reviews. Sigh.

    1 Reply Last reply
    0
    • S Stuart Dootson

      >

      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

      J Offline
      J Offline
      Jorgen Andersson
      wrote on last edited by
      #22

      Stuart Dootson wrote:

      Being able to use Data.Time.Calendar rather than Data.Time.Calendar.Julian should have been a giveaway, shouldn't it :O

      I wouldn't have known. :doh: :-O

      Wrong is evil and must be defeated. - Jeff Ello

      1 Reply Last reply
      0
      • A AFell2

        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 |

        Richard DeemingR Offline
        Richard DeemingR Offline
        Richard Deeming
        wrote on last edited by
        #23

        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

        "These people looked deep within my soul and assigned me a number based on the order in which I joined" - Homer

        1 Reply Last reply
        0
        • Richard DeemingR Richard Deeming

          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

          F Offline
          F Offline
          Fernando Takeshi Sato
          wrote on last edited by
          #24

          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.

          1 Reply Last reply
          0
          • M Marc Clifton

            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 implementation

            U Offline
            U Offline
            User 12817778
            wrote on last edited by
            #25

            For 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.

            1 Reply Last reply
            0
            • W W Balboos GHB

              Richard Deeming wrote:

              cultures whose week doesn't start on Sunday.

              That's easy - NUKE 'EM !

              Ravings en masse^

              "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

              F Offline
              F Offline
              F Margueirat
              wrote on last edited by
              #26

              Slow down there Donald.

              W 1 Reply Last reply
              0
              • J Jorgen Andersson

                Otherwise you could use Genesis 2.2 as a reference.

                Wrong is evil and must be defeated. - Jeff Ello

                J Offline
                J Offline
                Janes Diary
                wrote on last edited by
                #27

                Hold up, this is implying that we need to start working Saturdays, a six work-day week.

                1 Reply Last reply
                0
                • F F Margueirat

                  Slow down there Donald.

                  W Offline
                  W Offline
                  W Balboos GHB
                  wrote on last edited by
                  #28

                  Not at all - as a humanitarian, I prefer to make in quick and painless. . . . at least I won't feel a thing . . .

                  Ravings en masse^

                  "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

                  1 Reply Last reply
                  0
                  • M Marc Clifton

                    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 30

                    My 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

                    S Offline
                    S Offline
                    StarNamer work
                    wrote on last edited by
                    #29

                    I'd go with a Bash script...

                    #!/bin/sh

                    cal

                    1 Reply Last reply
                    0
                    Reply
                    • Reply as topic
                    Log in to reply
                    • Oldest to Newest
                    • Newest to Oldest
                    • Most Votes


                    • Login

                    • Don't have an account? Register

                    • Login or register to search.
                    • First post
                      Last post
                    0
                    • Categories
                    • Recent
                    • Tags
                    • Popular
                    • World
                    • Users
                    • Groups