05AB1E , 175 174 172 171 160 bytes
¦WΘ1š-1šVтFY`2ô0Kθ4ÖUD2Qi\28X+ë<7%É31α}‹iY¬>0ëY1¾ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝVY})DJIJk18+£35.£¬.•4ιõ÷‡o‹ƶ¸•2ôs`UÐ3‹12*+>13*5÷s3‹Xα©т%D4÷®т÷©4÷®·()DćsćsO7%._s€нT‰J«7ô»
Entrada en el formato [day, month, year]
. Salida con 0
s iniciales para días de un solo dígito y minúsculas mo
hasta su
(se puede agregar +1 byte si titlecase es obligatorio).
Pruébelo en línea o verifique todos los casos de prueba .
Santa mierda ... Este podría ser mi nuevo récord para la respuesta más larga 05AB1E, y luego incluyo algunos desafíos de arte asiatico muy complejos que hice ...>.> EDITAR: Hmm ok, casi ...; p
Nota importante: 05AB1E no tiene ninguna función integrada para los objetos o cálculos de fecha. Lo único que incluye las fechas que tiene es el año / mes / día / horas / minutos / segundos / microsegundos de hoy.
Por eso, casi todo el código que ve son cálculos manuales para calcular los días anteriores y siguientes (incluida la transición a lo largo de los años y teniendo en cuenta los años bisiestos), y calcular el día de la semana utilizando la congruencia de Zeller .
Enormes partes del código se copian de esta respuesta anterior de 05AB1E mía , que también será relevante para la explicación a continuación.
Explicación:
Comenzamos yendo al primer día del mes anterior:
¦ # Remove the first item (the days) from the (implicit) input
W # Get the minimum (without popping the list itself)
# (since the year is guaranteed to be above 1599, this is the month)
Θ # Check if its exactly 1 (1 if 1, 0 if in the range [2,31])
1š # Prepend a 1 as list (so we now have either [1,1] or [1,0]
- # Subtract this from the month and year
1š # And prepend a 1 for the day
V # Pop and store this first day of the previous month in variable `Y`
Luego uso esa fecha como fecha de inicio y calculo los próximos 100 días:
тF # Loop 100 times:
Y`2ô0Kθ4ÖUD2Qi\28X+ë<7%É31α}‹iY¬>0ëY1¾ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝV
# Calculate the next day in line
# (see the linked challenge above for a detailed explanation of this)
Y # And leave it on the stack
}) # After the loop: wrap the entire stack into a list, which contains our 100 days
Luego, con la fecha de entrada como el medio, solo dejo de la lista el 17 antes y el 17 después de esa fecha de entrada:
DJ # Duplicate the 100 dates, and join the day/month/year together to strings
IJ # Push the input, also joined together
k # Get the 0-based index of the input in this list
# (the joins are necessary, because indexing doesn't work for 2D lists)
18+ # Add 18 to this index (18 instead of 17, because the index is 0-based)
£ # Only leave the first index+18 items from the 100 dates
35.£ # Then only leave the last 35 items
Ahora tenemos nuestros 35 días. El siguiente paso es calcular el día de la semana y crear el encabezado de la tabla de salida:
¬ # Get the first date of the list (without popping the list itself)
.•4ιõ÷‡o‹ƶ¸• # Push compressed string "sasumotuwethfr"
2ô # Split it into chunks of size 2
s # Swap to get the first date again
`UÐ3‹12*+>13*5÷s3‹Xα©т%D4÷®т÷©4÷®·()DćsćsO7%
# Calculate the day of the week (sa=0; su=1; ...; fr=6)
# (see the linked challenge above for a detailed explanation of this)
._ # Rotate the list of strings that many times
Ver este consejo 05AB1E mío (sección Cómo comprimir cadenas que no forman parte del diccionario? ) Para entender por qué .•4ιõ÷‡o‹ƶ¸•
es "sasumotuwethfr"
.
Luego creamos los días para llenar la tabla misma en función de nuestra lista de fechas creada anteriormente. Que fusionaremos junto con el encabezado. Después de lo cual podemos imprimir el resultado final:
s # Swap to get the list of dates again
€н # Only leave the first item of each date (the days)
T‰ # Take the divmod 10 of each
J # Join those divmod results together
# (we now have leading 0s for single-digit days)
« # Merge this list together with the header list
7ô # Split it into chunks of size 7
» # Join each inner list by spaces, and then each string by newlines
# (and output the result implicitly)
JavaScript (ES6),
141126bytesAhorró 15 bytes tomando prestado
.toUTCString().slice(0,2)
de la respuesta de NeilToma la entrada como un objeto de fecha.
Pruébalo en línea!
fuente
JavaScript (Node.js) ,
205152145 bytesPruébalo en línea! Toma la entrada como objeto de fecha de JavaScript o marca de tiempo. Editar: guardado 1 byte gracias a @EmbodimentofIgnorance, que luego me permitió guardar otros 7 bytes agregando una nueva línea final a la salida. Ahorré 52 bytes cuando descubrí que estaba trabajando en un comportamiento que en realidad no tenía errores en primer lugar ...
fuente
padStart(2)
->padStart(3)
, elimina el espacio en la cadena de unión para -1 bytePerl 6 , 87 bytes
Pruébalo en línea!
Toma un
Date
objeto, devuelve una lista de líneas.fuente
C # (compilador interactivo de Visual C #) ,
124120 bytesPruébalo en línea!
fuente
Wolfram Language (Mathematica) , 123 bytes
Pruébalo en línea!
No sé por qué
Grid
no funciona en TIO, pero este código genera esto@DavidC guardó 1 byte
fuente
Grid
no funciona porque TIO no puede centrar los elementos como en su imagen?MATL ,
343331 bytesPruébalo en línea!
Explicación
fuente
Java (JDK) , 149 bytes
Pruébalo en línea!
Créditos
fuente
i
y dej
alguna manera? ¿O algo más cortoj++%7<1?10:32
con algo de magia bit a bit? Pero te lo dejo a ti. Voy a volver al trabajo, jajaja. ;)w
soporte? ¿Por qué noh
para encabezado?w
para "día de W eek". Además, el giro de bits solo puede conducir a(i%7+6)/7*22+10
que sea mucho más largo.PHP ,
197189187 bytesPruébalo en línea!
La entrada es
STDIN
como una cadena de fecha. Corre conphp -nF
.Verificar todos los casos de prueba
O 174 bytes con dígitos individuales rellenos con ceros.
fuente
Excel VBA,
190159 bytesGracias @TaylorScott
Toma la entrada en forma de una cadena de fecha válida para Excel VBA (por ejemplo, 19 de febrero de 2020; 19/02/2020; 19-febrero-2019), y devuelve una matriz con el calendario dado centrado en él.
fuente
Function z(i)
Dim d(5,6)
v=DateValue(i)-17
For x=1To 5
For y=0To 6
d(0,y)=Left(WeekdayName(Weekday(v+y)),2)
d(x,y)=Day(v+y+(x-1)*7)
Next y,x
z=d()
End Function
Rojo ,
153131 bytesPruébalo en línea!
fuente
T-SQL, 203 bytes
La versión en línea es ligeramente diferente, esta versión publicada funciona en MS-SQL Studio Management. Ahorra 1 bytes en comparación con la versión en línea, pero no da el resultado correcto en línea
Pruébalo en línea
fuente
Python 2 , 115 bytes
Pruébalo en línea!
No estoy seguro si esto está permitido ... toma la entrada de STDIN en el formulario
date(year, month, day)
. Esto también se puede representar como__import__('datetime').date(year, month, day)
. Estos son realmente__import__('datetime').date
objetos.fuente