AleksandrB
@AleksandrB
Совсем недавно вывел "Hello world"

Как подойти к решению задачи?

Есть задача - составить график работы 2 через 2, если рабочий день выпадает на вск, переносим его на понедельник.
Я тут наворотил
немного кода
function start($date)
{
    // Переводим в Unix
    $dateNow = strtotime($date);
    // День
    $day = 1 * 24 * 3600;
    // Дата окончания
    $dateEnd = $dateNow + (30 * $day);
    // Результат
    $result = [];
    while($dateNow < $dateEnd)
    {
        $dayOfWeek = intval(strftime("%w", $dateNow));
        if($dayOfWeek > 0 && $dayOfWeek < 6) // Пн-пт
        {
            $result[] = $dateNow;
            $dateNow += $day;
            $result[] = $dateNow;
            $dateNow += 3 * $day;
        }
        else if($dayOfWeek === 6) // Субб
        {
            $result[] = $dateNow;
            $dateNow += 2 * $day;
            $result[] = $dateNow;
            $dateNow += 3 * $day;
        }
        else // Вск
        {
            $dateNow += $day;
            $result[] = $dateNow;
            $dateNow += $day;
            $result[] = $dateNow;
            $dateNow += 3 * $day;
        }
    }
    // Запись
    insert($result);
}


Он работает в моих тестах, но в тестах олимпиадных не работает (да, это олимпиада). Можете подсказать логику решения, если эта неверна, если верна, то в чем проблема?
  • Вопрос задан
  • 84 просмотра
Пригласить эксперта
Ответы на вопрос 3
@harasaev
Работай с классом datetime, задавай интервал и высчитывай
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
магия пхп:
strtotime ('now + 1 month');
strtotime ( $someDate ' + 1 month');
strtotime ('now + 1 week');
strtotime ('now + 1 day');


а вообще для работы с датами есть набор расширений специально для таких целей.
Ответ написан
Комментировать
402d
@402d
начинал с бейсика на УКНЦ в 1988
* 1 1 0 0 1 1
0 0 1 1 0 0 1
* 1 0 0 1 1 0
всего три варианта как может выглядеть неделя
0 - вс 6 - суббота
в первой строке варианты начала работы с пн и пт
во 2ой вт и сб
в третьей чт.
если начать со среды, то 1 1 0 0 - выйти в воскресенье не можем начинаем с пн.
собираем все в одну строку начиная со среды
1100*1100110011001*100110
в зависимости от дня первого рабочего дня инитим указатель
[error,5, .......]
читаем статус дня до конца строки и опять с начала.

олимпиадное решение. В жизни тупо прокрутил цикл со счетчиками
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы