Na dany okres, uzyskiwanie najmniejszej listy dat, przy użyciu jokerów

13

Rozważ datę sformatowaną w YYYY-MM-DD. Możesz użyć jokera *na końcu ciągu daty. Np. 2016-07-2*Opisuje wszystkie daty od 2016-07-20do 2016-07-29.

Teraz rozważ okres reprezentowany przez datę początkową i końcową.

Algorytm musi znaleźć najmniejszą możliwą listę dat reprezentujących okres.

Użyjmy przykładu. Na następujący okres:

  • Data rozpoczęcia: 2014-11-29
  • Data końcowa: 2016-10-13

Algorytm musi zwrócić tablicę zawierającą następującą listę dat:

  • 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
źródło
1
Zwycięskie cele są niejednoznaczne. Proponuję zmienić go na codegolf (tzn. Rozwiązać zadanie w jak najmniejszej liczbie bajtów) i zawsze wymagam odpowiedzi, aby uzyskać najmniejszą listę dat.
Billywob,
Może po prostu nie jest to najlepsza strona do tego, to raczej pytanie (tj. „Nie mogę znaleźć tego algorytmu w Ruby on Rails”) niż wyzwanie „dla zabawy”. Jestem tu raczej nowy ...
Raphael,
Sugeruję wypróbowanie stackoverflow, a następnie zadanie go jako pytania, a nie wyzwania. Jeśli zostanie przeformułowany, wyzwanie jest nadal moim zdaniem interesujące i zasługuje na szansę (jak na kod golfa).
Billywob,
6
Tak, myślę, że znalezienie algorytmu jest wciąż zabawne i trudne, ale nie interesowałem się stroną związaną z golfem… Cóż, przeformułowałem go, zmieniłem tagi, a teraz będę pytał o przepełnienie stosu, nadal śledząc ten post. Dzięki!
Raphael,
1
Dalsze działania: napisałem wczoraj na Stackoverflow, ale dzisiaj miałem działający kod w Ruby (nie „żartuje” miesiącom, ale prawie tam): stackoverflow.com/questions/40506639/…
Raphael

Odpowiedzi:

1

PHP, 541 343 bajtów

Chciałem przede wszystkim uruchomić algorytm; ale gra w golfa była o wiele przyjemniejsza niż się spodziewałem (zwłaszcza przeglądanie obsługiwanych formatów daty i godziny ).

Trzy główne działania pozwoliły zaoszczędzić około 130 bajtów; ale 70 bajtów z mniejszych gier w golfa
(które również sprawiły, że jeden z dużych kroków stał się przestarzały) niosło dużo zabawy.

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

pobiera dane wejściowe z argumentów wiersza poleceń. Uruchom go -nrlub przetestuj online .

notatki

  • wydruki Y-m-3*dla Y-m-30; dodaj 7 bajtów do naprawy: wstaw |$a==$tpo 777600)).
  • generuje ostrzeżenia w PHP 7.1; dodać 5 bajtów, aby naprawić: Wymień +$psię +!$p.
  • Podział i niektóre wyjaśnienia dotyczące golfa są gotowe do opublikowania;
    ale poczekam chwilę, aby sprawdzić, czy ktoś inny się podda, zanim zepsuję.
Tytus
źródło