El siguiente modelo MiniZinc llega a $269$ fechas:
var 0..3: d; % 1er dígito del día
var 0..1: m; % 1er dígito del mes
var 0..9: x; % 2do dígito del día
var 0..9: y; % 1er dígito del año
var bool: leapYear;
var 2019..9999: year;
% día debe estar en 01..31
constraint (d + x) > 0;
constraint (d*10+x) <= 31;
% mes debe estar en 01..12
constraint (m + y) > 0;
constraint (10*m + y) <= 12;
% 2019 o posterior
constraint (1000*y + 100*m + 10*x + d) == year;
constraint 2019 <= year;
% ciertos meses tienen menos de 31 días
constraint ((d*10+x) <= 30) \/ ((10*m+y) in {1,3,5,7,8,10,12});
% Febrero tiene 28 días en los años normales y 29 en los años bisiestos
constraint leapYear == (((year mod 4) == 0) /\
(((year mod 100) != 0) \/ ((year mod 400) == 0)));
constraint ((10*m+y) != 2) \/
((d*10+x) < 29) \/
(((d*10+x) == 29) /\ leapYear);
output ["\(d)\(x)-\(m)\(y)-\(y)\(m)\(x)\(d)"]
El número de fechas $269$ es confirmado por el siguiente código C#:
DateTime dt = new DateTime(2019, 1, 1);
DateTime lastDay = new DateTime(9999, 12, 31);
int count = 0;
for(; dt < lastDay; dt = dt.AddDays(1))
{
string s = dt.ToString("ddMMyyyy");
bool palindrome = true;
for (int i = 0; i < s.Length/2; i++)
{
if (s[i] != s[s.Length - i - 1])
{
palindrome = false;
break;
}
}
if (palindrome)
{
count++;
}
}
Console.WriteLine(count);