Data dentro do intervalo?

9

Dada uma MM/DDdata ( 12/24) e um período de início / fim ( 11/01 - 06/24), descubra se a data está dentro do período listado.

Os períodos podem ser seqüenciais ( 05/01 - 11/01) ou agrupados até o próximo ano ( 11/01 - 05/01).

Exemplos:

  • 12/24está em 11/01 - 06/24= True
  • 06/24está em 11/01 - 06/24= True
  • 06/24está em 06/24 - 06/24= True
  • 06/24está em 11/01 - 06/23= Falso
  • 07/24está em 11/01 - 06/24= Falso
  • 07/24está em 05/01 - 11/01= True
  • 07/24está em 07/23 - 07/20= True

Os anos não são importantes. Presume-se que a data e / ou o período se apliquem a qualquer ano passado ou futuro.

A data final será sempre posterior à data de início. Se a data de término for numericamente menor que a data de início, presumimos que estamos concluindo o próximo ano.

As três variáveis ​​de entrada podem ser via qualquer método (args, HTTP, stdin, etc.) e em qualquer formato (string, JSON, array, etc.)

A resposta pode ser booleanou qualquer forma de uma sequência sim / não / correta / etc. O menor código vence.

Você não pode simplesmente passar argumentos para uma função interna.

Xeoncross
fonte
Podemos considerar o resultado como uma matriz de seqüências de caracteres? Ou seja ['MM', 'DD']?
Mr. Xcoder
Sugestão de caso de teste:11/01 - 06/24 includes 06/24?
Mr. Xcoder
@ Mr.Xcoder, você está imaginando algo como ['06', '24']se estivesse certo []ou o que você quer dizer?
Xeoncross
11
Para o seu segundo caso de teste, suponha que estejamos falando este ano 2017e no próximo ano 2018. Como é que vamos determinar que 06/24meios 2018e, portanto, deve ser Truemais do que 2017e, assim, Falseporque é antes 11/01?
AdmBorkBork
11
" date > start & date < end" - Alguns dos seus casos de teste estão errados. Eu acho que o que você quer dizer é start<=date<=end.
Shaggy

Respostas:

4

JavaScript (ES6), 26 20 bytes

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

A saída é 0se aestiver dentro do intervalo b... c, 1se não. Editar: salvou 6 bytes graças a @nwellnhof.

Neil
fonte
11
Que tal (a,b,c)=>b>c^b>a^a>c?
Nwellnhof 11/09
@nwellnhof Eu não posso acreditar que eu perdi isso - a minha primeira tentativa foi b>a^a>c, mas eu então negligenciado a correção simples ...
Neil
Você deve atualizar a contagem de bytes.
Nwellnhof 11/09/17
@nwellnhof Desculpe, eu ainda estava sofrendo com o choque!
Neil
4

Haskell , 28 bytes

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

Experimente online!

Obrigado a Leo pelo truque de xor'ing com os booleanos /=.


Haskell , 33 bytes

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

Experimente online!

xnor
fonte
Seu showtruque é legal, mas você pode XOR os três elementos de uma forma mais direta com foldl1: tio.run/...
Leo
11
@ Leo Boa ideia, é ainda mais curto expandido.
xnor
2

JavaScript (ES6), 31 bytes

Aceita entrada como três strings no MM/DDformato: data , intervalo_de , intervalo_para . Retorna um booleano.

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

Casos de teste

Arnauld
fonte
Graças ao MM/DDformato, você pode apenas usar a classificação de cadeias. Boa ideia.
Xeoncross
2

Haskell , 38 37 bytes

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

Experimente online!

Guardado 1 byte graças a Laikoni

jferard
fonte
Você pode usar a notação de infix para salvar um byte: (d#b)e=.
Laikoni 11/09/17
1

Perl 6 , 33 31 29 bytes

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

Experimente online!

Leva uma lista que contém início, data e fim.

-2 bytes graças a Ramillies.

Nwellnhof
fonte
E aqui, você pode salvar 2 bytes usando 1 argumento de lista. Então @_[0]pode ser escrito como .[0]e [(whatever)] @_como [(whatever)] $_. Você só precisa chamar assim $f(($s,$d,$e)).
Ramillies
1

Perl 5 , 60 bytes

59 bytes de código + 1 -a

$F[1]=~s/./2/if$F[1]le$F[0];say($F[2]le$F[1]&&$F[2]ge$F[0])

Experimente online!

Entrada: start_date end_date target_date

Xcali
fonte