Merhaba,
Bu hafta çok şey öğrendim. İlk defa iç içe (Range'e dikkat!) sınıf yapısı kullandım. Yeni yılın şerefine olsun 😀
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", replicate(" ", 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;
}
}
Başarılar...