Дата в пределах диапазона?

9

Учитывая MM/DDдату ( 12/24) и диапазон дат начала / окончания ( 11/01 - 06/24), выясните, находится ли дата в указанном интервале дат.

Диапазоны дат могут быть последовательными ( 05/01 - 11/01) или переходить на следующий год ( 11/01 - 05/01).

Примеры:

  • 12/24находится в 11/01 - 06/24= True
  • 06/24находится в 11/01 - 06/24= True
  • 06/24находится в 06/24 - 06/24= True
  • 06/24в 11/01 - 06/23= False
  • 07/24в 11/01 - 06/24= False
  • 07/24находится в 05/01 - 11/01= True
  • 07/24находится в 07/23 - 07/20= True

Годы не имеют значения. Предполагается, что дата и / или диапазон дат применяются к любому прошлому или будущему году.

Дата окончания всегда будет после даты начала. Если дата окончания численно меньше, чем дата начала, мы предполагаем, что мы приближаемся к следующему году.

Три входные переменные могут быть через любой метод (args, HTTP, stdin и т. Д.) И в любом формате (строка, JSON, массив и т. Д.)

Ответом может быть booleanили любая форма строки да / нет / правильно / и т.д .. Самый короткий код выигрывает.

Вы не можете просто передать аргументы во встроенную функцию.

Xeoncross
источник
Можем ли мы взять результат как массив строк? То есть ['MM', 'DD']?
г-н Xcoder
Тестовый пример:11/01 - 06/24 includes 06/24?
г-н Xcoder
@ Mr.Xcoder, ты представляешь что-то вроде того, ['06', '24']что правильно, []или что ты имеешь в виду?
Xeoncross
1
Для вашего второго контрольного примера, предположим, что мы говорим в этом 2017и следующем году 2018. Как мы должны определить, что 06/24означает 2018и, таким образом, должно быть, Trueа не 2017и, следовательно, Falseпотому что это раньше 11/01?
AdmBorkBork
1
« date > start & date < end» - Тогда некоторые из ваших тестов являются ошибочными. Я думаю, что вы имеете в виду start<=date<=end.
Лохматый

Ответы:

4

JavaScript (ES6), 26 20 байт

(a,b,c)=>b>c^b>a^a>c

Вывод, 0если aлежит в пределах диапазона b... c, 1если нет. Изменить: Сохранено 6 байтов благодаря @nwellnhof.

Нил
источник
1
Как насчет (a,b,c)=>b>c^b>a^a>c?
nwellnhof
@nwellnhof Я не могу поверить, что я пропустил это - моя самая первая попытка была b>a^a>c, но я тогда упустил простое исправление ...
Нил
Вы должны обновить количество байтов.
nwellnhof
@nwellnhof Извините, я все еще шокировался от шока!
Нил
4

Haskell , 28 байт

(a%d)e=((e<a)/=(a<d))==(e<d)

Попробуйте онлайн!

Спасибо Лео за трюк с использованием логических выражений /=.


Haskell , 33 байта

(a%d)e=show[e>=d,d>a,a>e]!!16>'a'

Попробуйте онлайн!

XNOR
источник
Ваш showтрюк классный, но вы можете XOR три элемента более прямым способом с foldl1: tio.run/…
Leo
1
@ Leo Отличная идея, она еще короче развернута.
xnor
2

JavaScript (ES6), 31 байт

Принимает ввод в виде 3 строк в MM/DDформате: date , range_from , range_to . Возвращает логическое значение.

(a,b,c)=>!(b<c?a<b|a>c:a<b&a>c)

Контрольные примеры

Arnauld
источник
Благодаря MM/DDформату вы можете просто использовать сортировку строк. Хорошая идея.
Xeoncross
2

Haskell , 38 37 байт

(b#e)d=(last$and:[or|b>e])[d>=b,d<=e]

Попробуйте онлайн!

Сохранено 1 байт благодаря Laikoni

jferard
источник
Вы можете использовать инфиксное обозначение , чтобы сохранить байты: (d#b)e=.
Лайкони
1

Perl 6 , 33 31 29 байт

{.[0]>.[2]??![>] $_!![<=] $_}

Попробуйте онлайн!

Принимает список, содержащий начало, дату и конец.

-2 байта благодаря Ramillies.

nwellnhof
источник
И здесь вы можете сохранить 2 байта, взяв вместо этого 1 аргумент списка. Тогда @_[0]можно написать как .[0]и [(whatever)] @_как [(whatever)] $_. Вам просто нужно будет назвать это как $f(($s,$d,$e)).
Ramillies