Encontre a Data mais próxima de uma TargetDate para um determinado dia da semana.
Por exemplo, com uma data 20161219
e um dia da semana de Friday (6)
, a resposta é 20161216
.
Outro exemplo, dada a data 20161219
e o dia da semana de Wednesday (4)
, a resposta é 20161221
.
Um exemplo final, dada a data 20161219
e o dia da semana de Monday (2)
, a resposta é 20161219
.
Regras:
- O formato da data para entrada e saída deve corresponder. Nos exemplos, usei
yyyymmdd
, mas você pode usar qualquer formato, desde que o ano (pelo menos dois dígitos), o mês e o dia do mês sejam "legíveis por humanos". - O dia da semana é inserido como um número inteiro. No meu exemplo, domingo é o primeiro dia da semana, portanto, é o número do dia da semana
1
. Você pode ter qualquer numeração do dia da semana, contanto que ela seja diferente do exemplo. - Os anos de 1970 a 2030 devem ser acomodados.
- Ferramentas e bibliotecas comuns para a data do idioma são permitidas, mas o crédito de rua é concedido àqueles que optam por não usá-los.
- Menor número de bytes ganhos.
Respostas:
Perl 6 , 46 bytes
Um lambda que aceita dois argumentos: uma sequência de datas no
yyyy-mm-dd
formato e um número de dia da semana entre1
= Segunda e7
= Domingo.Explicação:
Usando o formato de data e dia da semana usado nos exemplos, seriam 88 bytes:
fonte
Perl 6 , 83 bytes
Tente
Expandido
fonte
JavaScript (ES6), 93 bytes
Usa o
%Y-%m-%d
formato da data. Se%a %b %d %Y
é um formato de data aceitável, então para 82 bytes:Eu poderia salvar mais 2 bytes exigindo domingo = 10 a sábado = 16, mas esse é um mapeamento tolo do dia da semana. Versão anterior
142141 bytes (graças a @Guedes) que usava o formato de data AAAAMMDD específico, com sua explicação:Isso parece muito longo. Explicação: Primeiro, insere
-
s na data para obtê-la no formato ISO, quenew Date
pode ser analisada. Em seguida, compare o dia desejado com o dia real para obter um valor entre-3
e3
para o deslocamento real. A mágica9
vem de7
(porque%
é o módulo da CPU, não é o módulo verdadeiro) mais3
(para o-3
deslocamento) menos1
(porquen
é indexado em 1 e indexado emgetDay
0). A data é convertida novamente no formato ISO e os caracteres indesejados removidos.fonte
.replace(/(?=..(..)?$)/g,'-')
Python,
150149 bytesOouuf, 149. repl.it
Função sem nome que aceita uma string
s
, a data especificada (usando a string de formatot='%Y%m%d'
para entrada e saída) e um número em [1,7]n
,.Inspeciona os sete dias, de três dias antes a três dias após o dado para o dia da semana solicitado.
A semana
datetime
começa na segunda-feira e é zero, portanto o teste é(n-2)%7==d.weekday()
.fonte
Bash + coreutils, 50
Experimente online .
date -d$1 +%u
dá o dia da semana (1..7); 1 é segunda-feira3 + 7 - 1
. O 3 ajusta a faixa de entrada para a faixa [-3, 3] e é subtraído novamente após o módulo. O 7 é necessário porque o módulo bash é o mesmo que o módulo da CPU e pode fornecer resultados positivos - adicionando 7 ajustes na faixa correta. O -1 é porque na entrada, 1 é domingo, mas com a saída% u, 1 é segunda-feira.date
analisa<input date> + <magic factor>days
e apresenta no formato AAAAMMDD.fonte
Linguagem de macro SAS, 110 bytes
Uma linguagem de golfe terrível, mas aqui está a explicação (de dentro para fora):
Crie uma macro
s
que aceite uma entrada de datad
e um dia da semana numéricoa
. Em seguida,%eval(%sysfunc(putn(&d,8.))-4)
converte a data em uma data numérica do SAS e a diminui em 4 dias. Aintnx
função retorna a próxima ocorrência do dia da semana especificado.putn
depois formata a data de volta para aaaammdd e%put
imprime a saída no log.fonte
Mathematica,
8549 bytesO formato de entrada para datas é uma lista como
{2016, 12, 16}
uma realDateObject
(acho que algumas outras funcionam também, mas as testei). Nos dois casos, o formato de saída corresponderá automaticamente. A numeração do dia começa1
às segundas-feiras.A idéia é calcular a diferença entre o dia da semana de entrada e o dia da semana de destino com
#2-#~DateValue~"ISOWeekDay"
e depois mapeá-lo[-3, 3]
usando um módulo com deslocamento (ou sejaMod[...,7,-3]
). O resultado é simplesmente adicionado à data de entrada (a unidade padrão para a adição de objetos de data é dias).fonte
R,
119 7756 bytesFunção sem nome que recebe duas entradas, a data
D
(string) e o diad
(numérico).Usa a função
wday()
dolubridate
pacote. Ele pode convenientemente converterDate
objetos em dias da semana,1
sendo tratado como domingo por padrão.Edit: I / O agora é o padrão da
as.Date()
função:"YYYY-mm-dd"
Ungolfed e Explained
Editar: Agora cria uma sequência de
+-3
dias para a qual qualquer dia da semana é garantido. Subseqüentemente, precisamos apenas corresponder um dia que facilitou o problema.fonte