Estes dias trabalham para mim

8

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 é ! O código mais curto por idioma vence, mas o código mais curto em geral recebe a marca de esmeralda!

Chris Happy
fonte
2
Além disso, sugiro que você permita outros formatos além de YYYY-MM-DD(não vejo uma boa razão para que isso seja rigoroso).
Mr. Xcoder
5
A primeira frase é a introdução mais estranha e menos plausível que já vi em um desafio. Bem feito :-)
Luis Mendo
2
@LuisMendo Thanks! Mas você nunca sabe exatamente quem é secretamente admirando suas habilidades de programação doentes ....
Chris feliz
1
Por que cada resposta Javascript recebe cinco! ?
sergiol
1
Date.parse(2017-08-27)?? deveria ser isso Date.parse('2017-08-27')?
tsh

Respostas:

1

Japonês , 15 bytes

ÐU
7Æf1X+Uf -Ue

Teste-o


Explicação

Entrada implícita da sequência U.

ÐU

Converta Uem um objeto de data e reatribua a U.

Crie uma matriz de números inteiros de 0para 6, passando cada um por uma função em que Xestá o elemento atual.

f1

Defina a data de U.

X+Uf

Adicione a data atual de Upara X.

-Ue

Subtraia o dia atual da semana de U.

Saída implícita da matriz resultante.

Shaggy
fonte
5

Perl 6 , 47 bytes

{my$d=Date.new($_);map($d+*-$d.day-of-week,^7)}

Experimente online!

O código é quase auto-explicativo. Primeiro, criamos um objeto Date a $dpartir 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.

Ramillies
fonte
5

JavaScript (ES6), 73 63 62 bytes

Eu 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.

s=>[..."0123456"].map(i=>(x=new Date(s))-(x.getDay()-i)*864e5)

Você pode executar um .map(x=>new Date(x))na matriz retornada se quiser convertê-lo.


Mantendo a abordagem de data ( 72 bytes )

s=>[..."0123456"].map(i=>new Date((x=new Date(s))-(x.getDay()-i)*864e5))

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.

Jesse Daniel Mitchell
fonte
Toca aqui!!
Chris Happy
2
Bem vindo ao site!
Luis Mendo
É mais curto escrever apenas os números na matriz. 60 bytes:s=>[..."0123456"].map(i=>(x=new Date(s))-(x.getDay()-i)*8e7)
milk
1
Bem-vindo ao PPCG, e bem vinculado :) Dica 1: Abandone o keyse 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.
Shaggy
3

MATL , 22 21 bytes

7:j8XOs21Y2=f-GYO+1XO

A saída está no dd-mm-yyyyformato.

Experimente no MATL Online!

Explicação

7:     % Push [1 2 3 4 5 6 7]
j      % Input as a string
8XO    % Convert date to string with format 8, which is 'Mon', 'Tue' etc
s      % Sum
21Y2   % Push predefined literal [298 302 288 305 289 296 310]. The first number
       % is the sum of ASCII codes of 'Mon', the second is that of 'Tue', etc.
=      % Is equal?, element-wise
f      % Index of nonzero value. For example, if input is a Friday this gives 5
-      % Subtract, element-wise. For a Friday this gives [-4 -3 -2 -1 0 1 2]
G      % Push input again
YO     % Convert to date number: number of days from January 0, 0000
+      % Add, element-wise
1XO    % Convert to date format 1, which is 'dd-mm-yyyy'. Implicitly display
Luis Mendo
fonte
3

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!

s=>[...""+8e6].map((_,x)=>d.setDate(d.getDate()-d.getDay()+x),d=new Date(s))

Experimente online (Snippet a seguir)


Explicação

s=>

Função anônima que toma a string (de formato yyyy-(m)m-(d)d) como argumento via parâmetro s.

[...""+8e6]

Crie uma matriz de 7 elementos convertendo 8000000em notação científica em uma string e destruindo-a, que é menor que [...Array(7)].

.map((_,x)=>          )

Mapeie a matriz, passando cada elemento por uma função em que _está o elemento atual, que não será usado, e xé o índice atual, baseado em 0.

,d=new Date(s)

Converter sem um Dateobjeto e atribuí-lo à variáveld

d.setDate(     )

Defina a data de d.

d.getDate()

Obter a data atual de d.

-d.getDay()

Subtraia o número atual do dia da semana, indexado a 0, para obter o domingo.

+x

Adicionar x.

Shaggy
fonte
2
enquanto serve canecas com a minha outra mão! - Bom multitarefa habilidades :-)
Mr. Xcoder
Quase esqueci ... Cinco altos!
Chris Happy #
2
@ChrisHappy se você está aprendendo JS, não olhe para golf código para dicas: P
Caird coinheringaahing
1
@ ChrisHappy: Poderia ser domingo até eu ter tempo suficiente para escrever uma; preso atrás do bar até então.
Shaggy
1
@ ChrisHappy: Encontrei um minuto, explicação adicionada. Você deve dar uma olhada nas dicas de JS, abaixo da tag tips, se estiver procurando por mais truques para jogar golfe em JS.
Shaggy
2

Bash + utilitários comuns, 53

jot -w@ 7 `date -f- +%s-%w*86400|bc` - 86400|date -f-

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

           date -f- +%s-%w*86400                       # read date from STDIN, output expression "seconds-since-epoch - (index of day in week * 60 * 60 * 24)
                                |bc                    # arithmetically evaluate generated expression - result is date of required sunday in seconds-since-epoch
jot -w@ 7 `                        ` - 86400           # output seconds-since-epoch for all 7 required days of the week, prefixed with "@"
                                            |date -f-  # convert all seconds-since-epoch dates back to regular dates
Trauma Digital
fonte
2

Python 3, 133 124 126 112 bytes

-9 bytes graças ao Sr. Xcoder
+2 bytes porque a semana começa com domingo
-14 bytes graças a notjagan

from datetime import*
a=date(*map(int,input().split('-')))
for i in range(7):print(a-timedelta(a.weekday()-i+1))

Isso não foi tão bem quanto eu esperava.

Sobsz
fonte
127 bytes
Mr. Xcoder
1
124 bytes
Sr. Xcoder
1
110 bytes.
notjagan
Isso funciona no Python2 também se o fizermos, em raw_input()vez de input()acima. (+4 bytes). rangeainda funciona em Python2 para essa pequena coisa também. Sem raw_inputvocê obter erros.
Thomas Ward
1

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á:

#~DateObject~"Week"&

Exemplo

#~DateObject~"Week"&["2017-08-29"]

objeto da semana

DavidC
fonte
1
Não vejo problema com isso! :)
Chris feliz
1

Java 8 ( 161 154 123 122 122 102 + 19 36 bytes)

Experimente online!

import static java.time.LocalDate.*;

e->{for(int i=0;i<7;System.out.println(parse(e).plusDays(i++-parse(e).getDayOfWeek().getValue()%7)));}
Roberto Graham
fonte
Não se esqueça de incluir importações em sua solução e contagem de bytes.
Jakob
Além disso, você pode salvar bytes removendo le substituindo referências por LocalDate.parse(e).
Jakob
@Jakob Bom grito, obrigado
Roberto Graham
E agora você pode incrementar io corpo do loop para economizar 1 byte. Ah, e a java.util.function.*importação não é usada pelo lambda, portanto você não precisa contá-lo como parte da solução.
Jakob
1

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_inputvez de input, 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 de raw_inputpara aceitar datas YYYY-MM-DDdiretamente sem colocá-lo em literais da string.

Isto, obviamente, pressupõe que a entrada é colocar em assim: 2017-08-29.

from datetime import*
a=date(*map(int,raw_input().split('-')))
for i in range(7):print a-timedelta(a.weekday()-i+1)

+4 da resposta de Sobsz, depois -1, porque não precisamos de parênteses para a printdeclaraçã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 .

from datetime import*
a=date(*map(int,input().split('-')))
for i in range(7):print a-timedelta(a.weekday()-i+1)
Thomas Ward
fonte
1
Bem-vindo ao PPCG! Você pode substituir raw_input()por entrada e colocar a entrada entre aspas para economizar 4 bytes. Obviamente, isso transforma sua solução em uma duplicata: P
Mr. Xcoder 02/09/19
@ Mr.Xcoder True, é por isso que eu pulei isso. Porém, se colocarmos a entrada entre aspas primeiro, na verdade salvamos um byte de Sobsz, e eu anotei isso.
Thomas Ward