Найти ближайшую дату TargetDate для данного дня недели.
Например, учитывая дату 20161219
и день недели Friday (6)
, ответ - 20161216
.
Другой пример, учитывая дату 20161219
и день недели Wednesday (4)
, ответ 20161221
.
Последний пример, учитывая дату 20161219
и день недели Monday (2)
, ответ 20161219
.
Правила:
- Формат даты для ввода и вывода должен совпадать. В примерах я использовал
yyyymmdd
, но вы можете использовать любой формат, если год (не менее двух цифр), месяц и день месяца «читабельны человеком». - День недели вводится как целое число. В моем примере воскресенье - это первый день недели, поэтому это номер дня недели
1
. Вы можете иметь любую нумерацию Дня недели, если вы заметите ее, если она отличается от примера. - Годы 1970-2030 должны быть учтены.
- Допускаются общедоступные инструменты для датирования языков и библиотеки, но уличная репутация предоставляется тем, кто предпочитает их не использовать.
- Наименьшее количество байтов побеждает.
Ответы:
Perl 6 , 46 байт
Лямбда, которая принимает два аргумента: строку даты в
yyyy-mm-dd
формате и номер дня недели между1
= понедельник и7
= воскресенье.Объяснение:
Используя формат даты и дня недели, использованный в примерах, это будет 88 байтов:
источник
Perl 6 , 83 байта
Попытайся
расширенный
источник
JavaScript (ES6), 93 байта
Использует
%Y-%m-%d
формат даты. Если%a %b %d %Y
допустимый формат даты, то для 82 байтов:Я мог бы сэкономить еще 2 байта, потребовав от воскресенья = 10 до субботы = 16, но это глупое отображение дня недели. Предыдущая версия
142141 байт (спасибо @Guedes), в которой использовался определенный формат даты ГГГГММДД, с пояснениями:Это слишком долго. Объяснение: Сначала вставляет
-
s в дату, чтобы перевести ее в формат ISO, которыйnew Date
затем можно проанализировать. Затем сравнивает требуемый день с фактическим днем, чтобы получить значение между-3
и3
для фактического смещения. Магия9
происходит от7
(потому что%
процессор по модулю, а не от истинного по модулю) плюс3
(для-3
смещения) минус1
(потому чтоn
индексируется 1 и индексируетсяgetDay
0). Затем дата преобразуется обратно в формат ISO, а ненужные символы удаляются.источник
.replace(/(?=..(..)?$)/g,'-')
Python,
150149 байтОууф, 149. repl.it
Без имени функция , которая принимает строку
s
, дату , как указано ( с использованием формата строкиt='%Y%m%d'
для ввода и вывода) и число в [1,7],n
.Осматривает семь дней из трех дней до трех дней после того, что указано для дня недели, о котором идет запрос.
Неделя
datetime
начинается с понедельника и начинается с нуля, поэтому тест проводится(n-2)%7==d.weekday()
.источник
Баш + кореутилс, 50
Попробуйте онлайн .
date -d$1 +%u
дает день недели (1..7); 1 понедельник3 + 7 - 1
. 3 регулирует входной диапазон для диапазона [-3, 3] и снова вычитается по модулю. 7 требуется, потому что bash modulo аналогичен CPU modulo и может давать -ve результаты - добавление 7 корректирует в нужный диапазон. -1 - потому что на входе 1 - воскресенье, но с выходом% u, 1 - понедельник.date
анализирует<input date> + <magic factor>days
и представляет его в формате ГГГГММДД.источник
Язык макросов SAS, 110 байт
Страшный язык игры в гольф, но вот объяснение (изнутри):
Создайте макрос,
s
который принимает ввод датыd
и числовой день неделиa
. Затем%eval(%sysfunc(putn(&d,8.))-4)
преобразует дату в числовую дату SAS и уменьшает ее на 4 дня. Затемintnx
функция возвращает следующее вхождение указанного дня недели.putn
затем форматирует дату обратно в ггггммдд и%put
печатает вывод в журнал.источник
Mathematica,
8549 байтовФормат ввода для дат является либо списком,
{2016, 12, 16}
либо фактическимDateObject
(я думаю, что несколько других также работают, но я проверил их). В любом случае формат вывода будет совпадать автоматически. Нумерация дня начинается с1
понедельника.Идея состоит в том, чтобы вычислить разницу между входным днем недели и целевым днем недели,
#2-#~DateValue~"ISOWeekDay"
а затем отобразить ее,[-3, 3]
используя модуль со смещением (то естьMod[...,7,-3]
). Результат просто добавляется к дате ввода (единицей по умолчанию для добавления объекта даты является дни).источник
R
119 7756 байтБезымянная функция, которая принимает два ввода: дату
D
(строка) и деньd
(числовой).Использует функцию
wday()
изlubridate
пакета. Он может легко конвертироватьDate
объекты в дни недели1
, если по умолчанию он считается воскресным.Редактировать: I / O теперь является
as.Date()
функцией по умолчанию :"YYYY-mm-dd"
Неуправляемый и объясненный
Изменить: теперь создает последовательность
+-3
дней, для которых гарантированно будет найден любой данный день недели. Впоследствии мы должны соответствовать только одному дню, что значительно облегчило проблему.источник