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)