Pour une période donnée, obtenir la plus petite liste de dates, en utilisant des jokers

13

Considérez une date formatée en YYYY-MM-DD. Vous pouvez utiliser le joker *à la fin de la chaîne de date. Par exemple, 2016-07-2*décrit toutes les dates du 2016-07-20au 2016-07-29.

Considérons maintenant une période représentée par une date de début et une date de fin.

L'algorithme doit trouver la plus petite liste possible de dates représentant la période.

Prenons un exemple. Pour la période suivante:

  • date de début: 2014-11-29
  • date de fin: 2016-10-13

L'algorithme doit renvoyer un tableau contenant la liste de dates suivante:

  • 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
Raphael
la source
1
Le ou les objectifs gagnants sont ambigus. Je suggère de le changer en codegolf (c'est-à-dire de résoudre la tâche dans le moins d'octets possible) et de toujours exiger des réponses pour produire la plus petite liste de dates.
Billywob
Ce n'est peut-être tout simplement pas le meilleur site pour cela, c'est plus une question (c'est-à-dire "Je ne trouve pas cet algorithme dans Ruby on Rails") qu'un défi "pour le plaisir". Je suis plutôt nouveau ici ...
Raphael
Je vous suggère d'essayer stackoverflow puis de le poser comme une question plutôt que comme un défi. S'il est reformulé, le challenge est toujours intéressant selon moi et mérite une chance (comme le code golf).
Billywob
6
Oui, je pense que trouver l'algorithme est toujours amusant et difficile, mais je n'étais pas intéressé par le côté code-golf ... Eh bien, je l'ai reformulé, changé les balises, et maintenant je vais demander stackoverflow tout en suivant ce post. Merci!
Raphael
1
Suivi: J'ai posté sur Stackoverflow hier, mais aujourd'hui, j'avais un code de travail en Ruby (il ne "jokerize" pas, mais presque là-bas): stackoverflow.com/questions/40506639/…
Raphael

Réponses:

1

PHP, 541 343 octets

Je voulais que l'algorithme fonctionne en premier lieu; mais jouer au golf était en fait beaucoup plus amusant que ce à quoi je m'attendais (en particulier en parcourant les formats de date et d'heure pris en charge ).

Trois actions majeures ont permis d'économiser environ 130 octets; mais les 70 octets de golfs mineurs
(qui ont également rendu obsolète l'une des grandes étapes) ont apporté beaucoup de plaisir.

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),"
";}

prend l'entrée des arguments de ligne de commande. Exécutez-le -nrou testez-le en ligne .

Remarques

  • impressions Y-m-3*pour Y-m-30; ajouter 7 octets pour corriger: insérer |$a==$taprès 777600)).
  • lance des avertissements en PHP 7.1; ajouter 5 octets pour corriger: remplacer +$ppar +!$p.
  • Une ventilation et certains golfs expliqués sont prêts à être affichés;
    mais j'attendrai un peu pour voir si quelqu'un d'autre soumet avant de me gâter.
Titus
la source