За заданный период, получив наименьший список дат, используя джокеры

13

Рассмотрим дату в формате YYYY-MM-DD. Вы можете использовать джокер *в конце строки даты. Например, 2016-07-2*описывает все даты от 2016-07-20до 2016-07-29.

Теперь рассмотрим период, представленный начальной датой и конечной датой.

Алгоритм должен найти наименьший возможный список дат, представляющих период.

Давайте использовать пример. На следующий период:

  • Дата начала: 2014-11-29
  • Дата окончания: 2016-10-13

Алгоритм должен возвращать массив, содержащий следующий список дат:

  • 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
Рафаэль
источник
1
Цели (и) победы неоднозначны. Я предлагаю изменить его на codegolf (то есть решить задачу с наименьшим возможным количеством байтов) и всегда требовать ответы для вывода наименьшего списка дат.
Billywob
Возможно, это просто не лучший сайт для этого, это скорее вопрос (т.е. «я не могу найти этот алгоритм в Ruby on Rails»), чем вызов «для удовольствия». Я довольно новичок здесь ...
Рафаэль
Я предлагаю вам попробовать stackoverflow и затем задать его как вопрос, а не как вызов. Если перефразировать, задача все еще интересна на мой взгляд и заслуживает шанса (как код гольф).
Billywob
6
Да, я думаю, что найти алгоритм по-прежнему весело и сложно, но меня не интересовала сторона кода-гольфа ... Ну, я перефразировал его, изменил теги, и теперь я собираюсь спросить stackoverflow, продолжая читать этот пост. Благодарность!
Рафаэль
1
Продолжение: вчера я писал в Stackoverflow, но сегодня у меня был рабочий код на Ruby (он не "шутит" месяцы, но почти там): stackoverflow.com/questions/40506639/…
Рафаэль

Ответы:

1

PHP, 541 343 байта

Я хотел, чтобы алгоритм работал в первую очередь; но игра в гольф на самом деле была куда веселее, чем я ожидал (особенно просмотр поддерживаемых форматов даты и времени ).

Три основных действия сэкономили около 130 байтов; но 70 байтов от незначительных игр в гольф
(которые также сделали один из больших шагов устаревшим) несут массу удовольствия.

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

принимает входные данные из аргументов командной строки. Запустите -nrили протестируйте его онлайн .

Примечания

  • печатает Y-m-3*для Y-m-30; добавить 7 байтов для исправления: Вставить |$a==$tпосле 777600)).
  • выдает предупреждения в PHP 7.1; добавить 5 байт для исправления: заменить +$pна +!$p.
  • Разбивка и некоторые объяснения игры в гольф готовы к публикации;
    но я подожду немного, чтобы увидеть, если кто-то еще подчинится, прежде чем я испортил.
Titus
источник