Para un período determinado, obtener la lista más pequeña de fechas, utilizando comodines

13

Considere una fecha formateada en YYYY-MM-DD. Puede usar el comodín *al final de la cadena de fecha. Por ejemplo, 2016-07-2*describe todas las fechas de 2016-07-20a 2016-07-29.

Ahora, considere un período representado por una fecha de inicio y una fecha de finalización.

El algoritmo debe encontrar la lista más pequeña posible de fechas que representan el período.

Usemos un ejemplo. Para el siguiente período:

  • fecha de inicio: 2014-11-29
  • fecha final: 2016-10-13

El algoritmo debe devolver una matriz que contenga la siguiente lista de fechas:

  • 2014-11-29
  • 2014-11-30
  • 2014-12-*
  • 2015-*
  • 2016-0*
  • 2016-10-0*
  • 2016-10-10
  • 2016-10-11
  • 2016-10-12
  • 2016-10-13
Rafael
fuente
1
Los objetivos ganadores son ambiguos. Sugiero cambiarlo a codegolf (es decir, resolver la tarea en la menor cantidad de bytes posible) y siempre requerir respuestas para generar la lista más pequeña de fechas.
Billywob
Quizás simplemente no sea el mejor sitio para esto, es más una pregunta (es decir, "No puedo encontrar este algoritmo en Ruby on Rails") que un desafío "por diversión". Soy bastante nuevo aquí ...
Raphael
Le sugiero que pruebe stackoverflow y luego lo haga como una pregunta en lugar de un desafío. Si se reformula, el desafío sigue siendo interesante en mi opinión y merece una oportunidad (como el código de golf).
Billywob
66
Sí, creo que encontrar el algoritmo sigue siendo divertido y desafiante, pero no estaba interesado en el lado del código de golf ... Bueno, lo reformulé, cambié las etiquetas, y ahora voy a preguntar stackoverflow mientras sigo esta publicación. ¡Gracias!
Raphael el
1
Seguimiento: publiqué en Stackoverflow ayer, pero hoy tenía un código de trabajo en Ruby (no "jokeriza" meses, pero casi allí): stackoverflow.com/questions/40506639/…
Raphael

Respuestas:

1

PHP, 541 343 bytes

En primer lugar, quería que el algoritmo funcionara; pero jugar golf fue mucho más divertido de lo que esperaba (especialmente navegar por los formatos de fecha y hora admitidos ).

Tres acciones principales ahorraron alrededor de 130 bytes; pero los 70 bytes de golf menores
(que también dejaron obsoleto uno de los grandes pasos) fueron muy divertidos.

for($a=($f=strtotime)($argv[1]);!$p=$a>$z=$f($argv[2]);$a+=86400){$x=$z<$e=$f(Dec31,$a);(101<$q=date(md,$a))?$q-1001|$x?:$a=$e+$p="1*":($x?($t=$f(IX30,$a))>$z?:$a=$t+$p="0*":$a=$e+$p="*");$p?:($q%100>1|$z<($t=$f(date(Ymt,$a)))?$q%10>0&$q%100>1|$z<($t=min($t,$a+777600))?:$a=$t+$p="m-$q[2]*":$a=$t+$p="m-*");echo date("Y-".($p?:"m-d"),$a),"
";}

toma datos de los argumentos de la línea de comandos. Ejecutar -nro probarlo en línea .

notas

  • impresiones Y-m-3*para Y-m-30; agregue 7 bytes para corregir: inserte |$a==$tdespués 777600)).
  • lanza advertencias en PHP 7.1; agregue 5 bytes para corregir: Reemplace +$pcon +!$p.
  • Un desglose y algunos campos de golf explicados están listos para ser publicados;
    pero esperaré un poco para ver si alguien más presenta antes de que me eche a perder.
Titus
fuente