2 votos

¿Cuántas veces en el futuro después del 1 de enero de 2019 ocurrirá una fecha palíndroma?

Estoy tratando de resolver el siguiente problema:

¿Cuántas veces en el futuro (antes del año 10000) ocurrirá después del 1 de enero de 2019 una fecha palíndroma? La fecha está en formato dx-my-ymxd, y sugerimos que $dx\in\{01,...,31\}$.

¿Podrías ayudarme con cómo resolver este problema? No sé por dónde empezar. Gracias.

2voto

theage Puntos 293

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);

2voto

Especially Lime Puntos 51

Para desarrollar el comentario de Daniel Mathias en una forma de obtener la misma respuesta que Axel Kemper sin una computadora:

Para cada posible valor del día y mes, al revertirlos se obtiene un año a partir de 2019 excepto por

  • todas las fechas en enero, octubre o noviembre (92 en total)
  • fechas en febrero que terminen en 0 o 1 (5 en total: 01, 10, 11, 20, 21)

Por lo tanto, cada combinación válida de día-mes excepto estas da como resultado una fecha palindrómica válida excepto posiblemente

  • 29 de febrero, donde también necesitamos que sea un año bisiesto. Sin embargo, al revertirlo se obtiene 29-02-2092, y 2092 es un año bisiesto.

Entonces la respuesta es $366-92-5=269$.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X