05AB1E , 175 174 172 171 160 byte
¦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ô»
Inserisci nel formato [day, month, year]
. Uscita con i principali 0
s per giorni sola cifra e minuscole mo
attraverso su
(+1 byte possono essere aggiunti, se Titlecase è obbligatorio).
Provalo online o verifica tutti i casi di test .
Merda .. Questo potrebbe essere il mio nuovo disco per la risposta 05AB1E più lunga, e poi includo alcune sfide molto complesse di arte ascii che ho fatto ...>.> EDIT: Hmm ok, quasi ..; p
Nota importante: 05AB1E non ha alcun builtin per oggetti Date o calcoli. L'unica funzione incorporata relativa alle date che ha è l'anno / mese / giorno / ore / minuti / secondi / microsecondi di oggi.
Pertanto, quasi tutto il codice che vedi sono calcoli manuali per calcolare i giorni precedenti e successivi (compresa la transizione negli anni e tenendo presente gli anni bisestili) e il calcolo del giorno della settimana utilizzando la congruenza di Zeller .
Parti enormi del codice vengono copiate da questa mia precedente risposta 05AB1E , che sarà rilevante anche per la spiegazione di seguito.
Spiegazione:
Iniziamo andando al primo giorno del mese precedente:
¦ # 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`
Quindi uso quella data come data di inizio e calcolo i prossimi 100 giorni:
т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
Quindi, con la data di input al centro, lascio solo il 17 prima e il 17 dopo quella data di input dall'elenco:
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
Ora abbiamo i nostri 35 giorni. Il prossimo passo è calcolare il giorno della settimana e creare l'intestazione della tabella di output:
¬ # 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
Vedere questo 05AB1E punta del mio (sezione Come stringhe di comprimere che non fanno parte del dizionario? ) Per capire il motivo per cui .•4ιõ÷‡o‹ƶ¸•
è "sasumotuwethfr"
.
Quindi creiamo i giorni per riempire la tabella stessa in base al nostro elenco di date creato in precedenza. Che uniremo insieme all'intestazione. Dopo di che possiamo stampare il risultato finale:
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)