Erhalten Sie für einen bestimmten Zeitraum mithilfe von Jokern die kleinste Liste von Daten

13

Betrachten Sie ein Datum im Format YYYY-MM-DD. Sie können den Joker *am Ende der Datumszeichenfolge verwenden. ZB 2016-07-2*beschreibt alle Daten von 2016-07-20bis 2016-07-29.

Betrachten Sie nun einen Zeitraum, der durch ein Start- und ein Enddatum dargestellt wird.

Der Algorithmus muss die kleinstmögliche Liste von Daten finden, die den Zeitraum darstellen.

Lassen Sie uns ein Beispiel verwenden. Für den folgenden Zeitraum:

  • Anfangsdatum: 2014-11-29
  • Endtermin: 2016-10-13

Der Algorithmus muss ein Array mit der folgenden Datumsliste zurückgeben:

  • 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
quelle
1
Die Gewinnerziele sind nicht eindeutig. Ich schlage vor, es in Codegolf zu ändern (dh die Aufgabe in möglichst wenigen Bytes zu lösen) und immer Antworten zu verlangen, um die kleinste Liste von Daten auszugeben.
Billywob
Vielleicht ist es einfach nicht die beste Seite dafür, es ist eher eine Frage (dh "Ich kann diesen Algorithmus in Ruby on Rails nicht finden") als eine Herausforderung "zum Spaß". Ich bin ziemlich neu hier ...
Raphael
Ich schlage vor, Sie versuchen Stackoverflow und stellen es dann eher als eine Frage als eine Herausforderung. Wenn es anders formuliert wird, ist die Herausforderung meiner Meinung nach immer noch interessant und verdient eine Chance (als Code Golf).
Billywob
6
Ja, ich denke, es macht immer noch Spaß und ist eine Herausforderung, den Algorithmus zu finden, aber ich war nicht an der Code-Golf-Seite interessiert ... Nun, ich habe ihn umformuliert, die Tags geändert und jetzt werde ich Stackoverflow fragen, während ich noch diesem Beitrag folge. Vielen Dank!
Raphael
1
Follow-up: Ich habe gestern auf Stackoverflow gepostet, aber heute hatte ich einen Arbeitscode in Ruby (er "jokerisiert" nicht Monate, sondern fast): stackoverflow.com/questions/40506639/…
Raphael

Antworten:

1

PHP, 541 343 Bytes

Ich wollte, dass der Algorithmus überhaupt funktioniert. Aber das Golfspielen hat weitaus mehr Spaß gemacht als ich erwartet hatte (insbesondere das Durchsuchen der unterstützten Datums- und Zeitformate ).

Drei Hauptaktionen haben ungefähr 130 Bytes gespart; Aber die 70 Bytes von kleineren Golfspielen
(die auch einen der großen Schritte überflüssig machten) machten viel Spaß.

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

Nimmt Eingaben von Befehlszeilenargumenten entgegen. Laufen Sie mit -nroder testen Sie es online .

Anmerkungen

  • druckt Y-m-3*für Y-m-30; 7 Bytes hinzufügen, um das Problem zu beheben: |$a==$tNach einfügen 777600)).
  • Warnungen in PHP 7.1; Addiere 5 Bytes, um das Problem zu beheben: Ersetze +$pdurch +!$p.
  • Eine Aufschlüsselung und einige Golf-Erklärungen stehen bereit, um veröffentlicht zu werden.
    aber ich werde ein bisschen warten, um zu sehen, ob jemand anderes einreicht, bevor ich verwöhne.
Titus
quelle