Estos días trabajan para mí

8

Antecedentes

Eres un golfista de código atractivo y muchas personas te invitan a salir.

No tiene tiempo para pensar qué días exactamente está disponible, por lo que decide crear una función que acepte una fecha y devuelva los días de esa semana.

Luego toma esos días de la semana, insértelo en su programa de calendario para ver si alguien más ya lo invitó a salir.

Reglas

  • Acepta una fecha en formato AAAA-MM-DD
  • Devuelve una matriz / lista de fechas de esa semana. (El domingo es el primer día)
    • Las fechas se pueden mostrar como los milisegundos entre enero 1 de 1970 y de esa fecha, en un formato de "común" fecha 1 , o los objetos de fecha.
  • El orden de las fechas debe ser ascendente.
    • (Aunque eres lo suficientemente inteligente como para incluir soporte para una lista descendente, el programa puede trabajar más rápido con una lista ascendente y ¿quién tiene unos pocos milisegundos de sobra?)
  • Debe trabajar con cualquier día desde 1993. (Sí, ¡tienes 24 años al momento de escribir!)
  • ¡Cada respuesta de Javascript obtiene un máximo de cinco!

Especificaciones

Entrada de muestra: whichDates(2017-08-29)

Salida: (el equivalente de)

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 Un formato que es bastante conocido. Tales como AAAA-MM-DD.

2 ¡ Esto es ! El código más corto por idioma gana, ¡pero el código más corto en general obtiene la marca de verificación esmeralda!

Chris feliz
fuente
2
Además, le sugiero que permita otros formatos, que no sean YYYY-MM-DD(no veo una buena razón por la que debería ser estricto).
Sr. Xcoder
55
La primera oración es la introducción más extraña y menos plausible que he visto en un desafío. Bien hecho :-)
Luis Mendo
2
@LuisMendo ¡Gracias! Pero nunca se sabe quién admira secretamente sus habilidades de programación enfermas ...
Chris Happy
1
¿Por qué cada respuesta de Javascript obtiene un máximo de cinco! ?
sergiol
1
Date.parse(2017-08-27)?? debería ser esto Date.parse('2017-08-27')?
tsh

Respuestas:

1

Japt , 15 bytes

ÐU
7Æf1X+Uf -Ue

Pruébalo


Explicación

Entrada implícita de cadena U.

ÐU

Convierta Ua un objeto de fecha y reasigne a U.

Cree una matriz de enteros de 0a 6, pasando cada uno a través de una función donde Xestá el elemento actual.

f1

Establecer la fecha de U.

X+Uf

Agregar la fecha actual de Ua X.

-Ue

Resta el día actual de la semana de U.

Salida implícita de la matriz resultante.

Lanudo
fuente
5

Perl 6 , 47 bytes

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

Pruébalo en línea!

El código es casi autoexplicativo. Primero creamos un objeto Date a $dpartir de la cadena, que resulta estar en el agradable formato ISOwhatever. Podemos realizar operaciones aritméticas con las fechas (sumar un número entero = sumar tantos días, lo mismo con restar). Así $d-$d.day-of-weekes elúltimoesto (oh, Dios mío, la semana siempre ha comenzado el lunes para mí: D) el domingo de la semana. ( .day-of-weekes 1 para el lunes a 7 para el domingo). Luego asignamos más de 0 a 6 ( ^7) y lo agregamos al domingo, obteniendo todos los días de la semana. El número que estamos mapeando aparece en el lugar de la estrella *. Esta lista se devuelve.

Ramillies
fuente
5

JavaScript (ES6), 73 63 62 Bytes

Pensé que también lo probaría en JavaScript.

Editar: Utilizando el enfoque de milisegundos, según lo permitido por el indicador, lo reduje a 62 bytes.

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

Puede realizar un .map(x=>new Date(x))en la matriz devuelta si desea convertirlo.


Mantener el enfoque de fecha ( 72 bytes )

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

Hubo un error en mi envío inicial, está solucionado. Gracias a una observación de la leche, pude eliminar el error y aún así reducir el recuento de bytes.

Jesse Daniel Mitchell
fuente
¡¡Cinco altos!!
Chris Happy
2
Bienvenido al sitio!
Luis Mendo
Es más corto simplemente escribir los números en la matriz. 60 bytes:s=>[..."0123456"].map(i=>(x=new Date(s))-(x.getDay()-i)*8e7)
leche
1
Bienvenido a PPCG, y muy bien vinculado :) Consejo 1: Elimine keysy use el índice en lugar del elemento al mapear sobre la matriz. Consejo 2: para una matriz tan pequeña, es más corto generarla de la manera que lo hice.
Shaggy
3

MATL , 22 21 bytes

7:j8XOs21Y2=f-GYO+1XO

La salida está en dd-mm-yyyyformato.

¡Pruébalo en MATL Online!

Explicación

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
fuente
3

JavaScript (ES6), 76 bytes

Creo que finalmente encontré el entorno menos propicio para el golf eficiente: ¡detrás de mi barra, mientras sirvo pintas con la otra mano!

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

Pruébelo en línea (fragmento a seguir)


Explicación

s=>

Función anónima que toma la cadena (de formato yyyy-(m)m-(d)d) como argumento a través de un parámetro s.

[...""+8e6]

Cree una matriz de 7 elementos mediante la conversión 8000000en notación científica a una cadena y su desestructuración, que es más corta que [...Array(7)].

.map((_,x)=>          )

Asigne sobre la matriz, pasando cada elemento a través de una función donde _está el elemento actual, que no se utilizará, y xes el índice actual, basado en 0.

,d=new Date(s)

Convertir sa un Dateobjeto y asignarlo a variabled

d.setDate(     )

Establecer la fecha de d.

d.getDate()

Obtenga la fecha actual de d.

-d.getDay()

Reste el número actual del día de la semana, indexado en 0, para obtener el domingo.

+x

Añadir x.

Lanudo
fuente
2
mientras sirvo pintas con mi otra mano! - Buenas habilidades multitarea :-)
Sr. Xcoder
Casi se me olvida ... ¡Choca esos cinco!
Chris Happy
2
@ChrisHappy si estás aprendiendo JS, no busques consejos para codificar golf: P
caird coinheringaahing
1
@ChrisHappy: Bien podría ser domingo hasta que tenga tiempo suficiente para escribir uno; atrapado detrás de la barra hasta entonces.
Shaggy
1
@ChrisHappy: Se encontró un minuto, se agregó una explicación. Debería echar un vistazo a los consejos de JS debajo de la etiqueta de consejos si está buscando más trucos para jugar golf en JS.
Shaggy
2

Bash + utilidades comunes, 53

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

Pruébalo en línea .

Esto supone que la salida de la fecha GNU es un formato de fecha "común", por ejemplo Fri Sep 1 00:00:00 UTC 2017.

Explicación

           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
fuente
2

Python 3, 133 124 126 112 bytes

-9 bytes gracias al Sr. Xcoder
+2 bytes porque la semana comienza con el domingo
-14 bytes gracias a notjagan

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

Eso no fue tan bien como esperaba.

Sobsz
fuente
127 bytes
Mr. Xcoder
1
124 bytes
Mr. Xcoder
1
110 bytes.
notjagan
Esto funciona en Python2 también si lo hacemos en raw_input()lugar de input()arriba. (+4 bytes). rangetodavía funciona en Python2 para esta pequeña cosa también. Sin raw_inputti obtienes errores.
Thomas Ward
1

Mathematica 20 bytes?

Mathematica expresa la lista de días como un único objeto de fecha. Si dicho objeto de fecha es una salida aceptable, funcionará la siguiente función pura de 20 bytes:

#~DateObject~"Week"&

Ejemplo

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

objeto de semana

DavidC
fuente
1
¡No veo ningún problema con eso! :)
Chris Happy
1

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

Pruébalo en línea!

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
fuente
No olvide incluir las importaciones en su solución y el recuento de bytes.
Jakob
También puede guardar bytes quitando ly reemplazando referencias con LocalDate.parse(e).
Jakob
@Jakob Buen grito, gracias
Roberto Graham
Y ahora puede incrementar ien el cuerpo del bucle para guardar 1 byte. Ah, y la java.util.function.*importación no es utilizada por la lambda, por lo que no tiene que contarla como parte de la solución.
Jakob
1

Python 2, 115 Bytes o 111 Bytes, dependiendo del formato de entrada.

Básicamente, este es casi el mismo código en la respuesta para Python3 escrito por Sobsz , pero hecho para funcionar en Python 2.


Si la entrada está en el formulario YYYY-MM-DD :

(Esto supone que la entrada no está entre comillas simples para denotar una cadena como entrada)

La diferencia clave es que necesitamos en raw_inputlugar de input, a menos que especifiquemos explícitamente la fecha 'YYYY-MM-DD'dentro de los apóstrofes para identificarla como un literal de cadena. Sin la entrada literal de cadena, obtenemos un error de sintaxis, de ahí el uso de raw_inputpara aceptar fechas YYYY-MM-DDdirectamente sin ponerlo en literales de cadena.

Por supuesto, esto supone que la entrada se pone en modo: 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 de la respuesta de Sobsz, luego -1 porque no necesitamos paréntesis para la printdeclaración y guardamos un byte del paréntesis de cierre que no está allí; total de +3 bytes de diferencia.

Pruébalo en línea!


Si la entrada está en la forma'YYYY-MM-DD' :

(Tenga en cuenta que debemos tener la fecha indicada entre comillas para que esta respuesta funcione)

Podemos guardar 4 bytes porque no necesitamos el raw_y esta es efectivamente la misma respuesta que proporciona Sobsz, menos un byte porque no necesitamos los paréntesis alrededor delprint comando.

Gracias al Sr. Xcoder por señalar esto, aunque técnicamente es un duplicado exacto, menos un byte, de la respuesta 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
fuente
1
Bienvenido a PPCG! Puede reemplazar raw_input()con entrada y rodear la entrada con comillas para ahorrar 4 bytes. Por supuesto, eso convierte su solución en un duplicado: P
Mr. Xcoder
@ Mr.Xcoder True, por eso me salté eso. Sin embargo, si ponemos primero la entrada entre comillas, que en realidad guardar un byte de Sobsz, y me hizo una nota de ello.
Thomas Ward