fundo
Você é um jogador de código atraente e muitas pessoas estão convidando você para sair.
Você não tem tempo para pensar em quais dias exatamente você está disponível, então decide criar uma função que aceita uma data e retorna os dias da semana.
Você pega esses dias da semana, insira-o no seu programa de calendário para ver se alguém já o convidou para sair.
Regras
- Aceita uma data no formato AAAA-MM-DD
- Retorna uma matriz / lista de datas dessa semana. (Domingo é o primeiro dia)
- As datas podem ser exibidas como milissegundos entre 1 de janeiro de 1970 e essa data, em um formato de data "comum" 1 ou em objetos de data.
- A ordem das datas deve ser crescente.
- (Embora você seja inteligente o suficiente para incluir suporte para uma lista descendente, o programa pode trabalhar mais rapidamente com uma lista ascendente e quem tem alguns milissegundos de sobra?)
- Deve trabalhar com qualquer dia desde 1993. (Sim, você tem 24 anos no momento da redação!)
- Toda resposta Javascript recebe cinco!
Especificações
Entrada de amostra: whichDates(2017-08-29)
Saída: (o equivalente a)
console.log([
Date.parse('2017-08-27'),
Date.parse('2017-08-28'),
Date.parse('2017-08-29'),
Date.parse('2017-08-30'),
Date.parse('2017-08-31'),
Date.parse('2017-09-01'),
Date.parse('2017-09-02'),
]);
1 Um formato bastante conhecido. Como AAAA-MM-DD.
2 Isso é código-golfe ! O código mais curto por idioma vence, mas o código mais curto em geral recebe a marca de esmeralda!
YYYY-MM-DD
(não vejo uma boa razão para que isso seja rigoroso).Date.parse(2017-08-27)
?? deveria ser issoDate.parse('2017-08-27')
?Respostas:
Japonês , 15 bytes
Teste-o
Explicação
Entrada implícita da sequência
U
.Converta
U
em um objeto de data e reatribua aU
.Crie uma matriz de números inteiros de
0
para6
, passando cada um por uma função em queX
está o elemento atual.Defina a data de
U
.Adicione a data atual de
U
paraX
.Subtraia o dia atual da semana de
U
.Saída implícita da matriz resultante.
fonte
Perl 6 , 47 bytes
Experimente online!
O código é quase auto-explicativo. Primeiro, criamos um objeto Date a
$d
partir da string, que está no bom formato ISO, seja qual for. Podemos executar aritmética com as datas (adicionando um número inteiro = adicionando muitos dias, o mesmo com subtração). Então$d-$d.day-of-week
é oúltimoeste (oh meu deus, a semana sempre começou com segunda-feira para mim: D) o domingo da semana. (.day-of-week
é 1 para segunda-feira a 7 para domingo.) Em seguida, mapeamos de 0 a 6 (^7
) e adicionamos isso ao domingo, obtendo todos os dias da semana. O número sobre o qual estamos mapeando aparece no lugar da estrela*
. Esta lista é então retornada.fonte
JavaScript (ES6),
736362 bytesEu pensei que também iria tentar isso em JavaScript.
Edit: Usando a abordagem de milissegundos, conforme permitido pelo prompt, eu a reduzi para 62 bytes.
Você pode executar um
.map(x=>new Date(x))
na matriz retornada se quiser convertê-lo.Mantendo a abordagem de data ( 72 bytes )
Houve um erro no meu envio inicial, ele foi corrigido. Graças a uma observação feita pelo leite, pude remover o bug e ainda diminuir a contagem de bytes.
fonte
s=>[..."0123456"].map(i=>(x=new Date(s))-(x.getDay()-i)*8e7)
keys
e use o índice em vez do elemento ao mapear sobre a matriz. Dica 2: para uma matriz tão pequena, é mais curto gerá-la da maneira que eu fiz.MATL ,
2221 bytesA saída está no
dd-mm-yyyy
formato.Experimente no MATL Online!
Explicação
fonte
JavaScript (ES6), 76 bytes
Acho que finalmente achei o ambiente menos propício ao golfe eficiente: por trás do meu bar, enquanto servia copos com a outra mão!
Experimente online (Snippet a seguir)
Explicação
Função anônima que toma a string (de formato
yyyy-(m)m-(d)d
) como argumento via parâmetros
.Crie uma matriz de 7 elementos convertendo
8000000
em notação científica em uma string e destruindo-a, que é menor que[...Array(7)]
.Mapeie a matriz, passando cada elemento por uma função em que
_
está o elemento atual, que não será usado, ex
é o índice atual, baseado em 0.Converter
s
em umDate
objeto e atribuí-lo à variáveld
Defina a data de
d
.Obter a data atual de
d
.Subtraia o número atual do dia da semana, indexado a 0, para obter o domingo.
Adicionar
x
.fonte
Bash + utilitários comuns, 53
Experimente online .
Isso pressupõe que a saída da data GNU seja um formato de data "comum", por exemplo
Fri Sep 1 00:00:00 UTC 2017
.Explicação
fonte
Python 3,
133124126112 bytes-9 bytes graças ao Sr. Xcoder
+2 bytes porque a semana começa com domingo
-14 bytes graças a notjagan
Isso não foi tão bem quanto eu esperava.
fonte
raw_input()
vez deinput()
acima. (+4 bytes).range
ainda funciona em Python2 para essa pequena coisa também. Semraw_input
você obter erros.Mathematica 20 bytes?
O Mathematica expressa a lista de dias como um único objeto de data. Se esse objeto de data for uma saída aceitável, a seguinte função pura de 20 bytes funcionará:
Exemplo
fonte
Java 8 (
161154123122 122102 +1936 bytes)Experimente online!
fonte
l
e substituindo referências porLocalDate.parse(e)
.i
o corpo do loop para economizar 1 byte. Ah, e ajava.util.function.*
importação não é usada pelo lambda, portanto você não precisa contá-lo como parte da solução.Python 2, 115 bytes ou 111 bytes, dependendo do formato de entrada.
Basicamente, esse é quase o mesmo código na resposta para o Python3 escrito por Sobsz , mas feito para funcionar no Python 2.
Se a entrada estiver no formato
YYYY-MM-DD
:(Isso pressupõe que a entrada não esteja entre aspas simples para indicar uma string como entrada)
A principal diferença é que precisamos, em
raw_input
vez deinput
, a menos que especifiquemos explicitamente a data nos'YYYY-MM-DD'
apóstrofos para identificá-la como uma string literal. Sem a entrada literal da string, obtemos um Erro de sintaxe, portanto, o uso deraw_input
para aceitar datasYYYY-MM-DD
diretamente sem colocá-lo em literais da string.Isto, obviamente, pressupõe que a entrada é colocar em assim:
2017-08-29
.+4 da resposta de Sobsz, depois -1, porque não precisamos de parênteses para a
print
declaração e salvamos um byte dos parênteses de fechamento que não existe; diferença total de +3 bytes.Experimente Online!
Se a entrada estiver no formato
'YYYY-MM-DD'
:(Observe que precisamos ter a data fornecida entre aspas para que esta resposta funcione)
Conseguimos salvar 4 bytes porque não precisamos da
raw_
e essa é efetivamente a mesma resposta que Sobsz fornece, menos um byte porque não precisamos dos parênteses em torno doprint
comando.Agradeço ao Sr. Xcoder por apontar esta questão, embora essa seja tecnicamente uma duplicata exata, menos um byte, da resposta de Sobsz .
fonte
raw_input()
por entrada e colocar a entrada entre aspas para economizar 4 bytes. Obviamente, isso transforma sua solução em uma duplicata: P