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ô»
Masukkan dalam format [day, month, year]. Output dengan leading 0s untuk hari satu digit, dan huruf kecil momelalui su(+1 byte dapat ditambahkan jika titlecase wajib).
Cobalah secara online atau verifikasi semua kasus uji .
Sial .. Ini mungkin rekor baru saya untuk jawaban 05AB1E terpanjang, dan kemudian saya sertakan beberapa tantangan ascii-art yang sangat rumit yang saya lakukan ...>.> EDIT: Hmm ok, hampir ..; p
Catatan penting: 05AB1E tidak memiliki builtin untuk objek atau perhitungan Date. Satu-satunya bawaan tentang tanggal yang dimilikinya adalah tahun / bulan / hari / jam / menit / detik / hari ini hari ini.
Jadi karena itu, hampir semua kode yang Anda lihat adalah perhitungan manual untuk menghitung hari-hari sebelumnya dan berikutnya (termasuk transisi dari tahun ke tahun dan mengingat tahun kabisat), dan menghitung hari dalam seminggu dengan menggunakan kongruensi Zeller .
Sebagian besar kode disalin dari jawaban saya sebelumnya 05AB1E , yang juga akan relevan untuk penjelasan di bawah ini.
Penjelasan:
Kami mulai dengan pergi ke hari pertama bulan sebelumnya:
¦ # 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`
Lalu saya menggunakan tanggal itu sebagai tanggal mulai, dan menghitung 100 hari berikutnya:
т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
Kemudian, dengan tanggal input sebagai tengah, saya hanya meninggalkan tanggal 17 sebelum dan 17 setelah tanggal input tersebut dari daftar:
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
Sekarang kami memiliki 35 hari. Langkah selanjutnya adalah menghitung hari dalam seminggu, dan membuat header dari tabel 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
Lihat ini 05AB1E ujung tambang (bagian Cara string kompres bukan bagian dari kamus? ) Untuk memahami mengapa .•4ιõ÷‡o‹ƶ¸•adalah "sasumotuwethfr".
Lalu kami membuat hari untuk mengisi tabel itu sendiri berdasarkan daftar tanggal yang kami buat sebelumnya. Yang akan kita gabungkan bersama dengan tajuknya. Setelah itu kita dapat mencetak hasil akhir:
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)