За певний період, отримуючи найменший список дат, використовуючи джокери


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.
  • Поломка та пояснення деяких гольфів готові до розміщення;
    але я зачекаю трохи, щоб побачити, чи хтось подає, перш ніж я зіпсую.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.