Coding Challenges - Dlang or Generic

Salih Dincer salihdb at hotmail.com
Thu Jan 12 19:06:49 UTC 2023


On Tuesday, 10 January 2023 at 01:22:33 UTC, H. S. Teoh wrote:
> Here's a challenge.  Given an input year, for example, "2023", 
> write a program that outputs (for the corresponding year):

Now, I wrote a nested class using range and copying from Matheus' 
code. Of course not as comprehensive as [your 
dcal](https://github.com/quickfur/dcal/blob/master/dcal.d). I 
like this one and even thought of a new challenge!

```d
void main()
{
   import std.stdio, std.string : cp = capitalize;
   import std.range, std.conv : to;

   with(new MyCalendar(2023, 12))
   {
     const title = dowToStr!2;
     foreach(month; range.take(6))
     {
       const mName = date.month.to!string;
       year.write(" ");           // current year
       mName.cp.writefln!"%s:";   // name of the month
       title.writefln!"%-(%s %)"; // days of week
       month.writeln;             // formatted days
     }
   }

class MyCalendar
{
   import std.array, std.datetime, std.conv : to;
   import std.string : capitalize;

   Range range;
   Date date;
   int year, month;

   this(int year, int month)
   {
     this.month = month;
     this.year = year;
     this.date = Date(year, month, 1);
     this.range = new Range();
   }

   class Range
   {
     enum empty = false;

     string front()
     {
       import std.format : fw = formattedWrite;
       auto res = appender!string;
       int day, dow = date.dayOfWeek;
       res.fw("%s", replicated(dow * 3)); // skip days

       for(day = 1; day <= date.daysInMonth; ++day)
       {
         if(++dow % 7) res.fw("%2s ", day);
         else res.fw("%2s\n", day);
       }
       if(dow % 7) res.put("\n");
       return res.data;
     }

     void popFront()
     {
       month++;
       if(month > 12)
       {
         ++year;
         month = 1;
       }
       date = Date(year, month, 1);
     }
   }

   auto dowToStr(size_t len = 0)()
   {
     alias E = DayOfWeek;
     string[] result;
     for(E x = E.min; x <= E.max; x++)
     {
       result ~= len ? x.to!string[0..len]
                     : x.to!string;
     }
     return result;
   }
}
```

SDB at 79


More information about the Digitalmars-d-learn mailing list