05AB1E , 175 174 172 171 160 ไบต์
¦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ô»
[day, month, year]
การป้อนข้อมูลในรูปแบบ เอาต์พุตที่มีการนำหน้า0
สำหรับวันหลักเดียวและตัวพิมพ์เล็กmo
ผ่านsu
(สามารถเพิ่ม +1 ไบต์ได้หากจำเป็นต้องใส่หัวเรื่อง)
ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด
อึศักดิ์สิทธิ์ .. นี่อาจเป็นบันทึกใหม่ของฉันสำหรับคำตอบที่ยาวที่สุดของ 05AB1E และจากนั้นฉันก็รวมความท้าทายทางศิลปะ ASCIIที่ซับซ้อนมากที่ฉันทำ ... >.> แก้ไข: อืมโอเคเกือบ .. ; p
หมายเหตุสำคัญ: 05AB1E ไม่มี builtins สำหรับวัตถุหรือการคำนวณ Date builtin เพียงอย่างเดียวเกี่ยวกับวันที่มีคือวันนี้ปี / เดือน / วัน / ชั่วโมง / นาที / วินาที / microseconds
ดังนั้นเนื่องจากว่าเกือบทั้งหมดของรหัสที่คุณเห็นคือการคำนวณด้วยตนเองเพื่อคำนวณวันก่อนหน้านี้และต่อไป (รวมถึงการเปลี่ยนแปลงในช่วงหลายปีและการรักษาในใจปีอธิกสุรทิน) และการคำนวณวันของสัปดาห์โดยใช้ความสอดคล้องกันของเซลเลอร์
ส่วนใหญ่ของรหัสจะถูกคัดลอกมาจากคำตอบของฉัน 05AB1E ก่อนหน้านี้ซึ่งจะเกี่ยวข้องกับคำอธิบายด้านล่าง
คำอธิบาย:
เราเริ่มต้นโดยไปที่วันแรกของเดือนก่อนหน้า:
¦ # 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`
จากนั้นฉันใช้วันที่เป็นวันที่เริ่มต้นและคำนวณ 100 วันถัดไป:
т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
จากนั้นด้วยอินพุตวันที่เป็นกึ่งกลางฉันจะเหลือเพียง 17 ก่อนและ 17 หลังจากวันที่อินพุตจากรายการ:
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
ตอนนี้เรามี 35 วันของเรา ขั้นตอนถัดไปคือการคำนวณวันในสัปดาห์และสร้างส่วนหัวของตารางผลลัพธ์:
¬ # 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
ดู 05AB1E นี้เคล็ดลับของฉัน (ส่วนวิธีการบีบอัดสตริงไม่ใช่ส่วนหนึ่งของพจนานุกรม? )จะเข้าใจว่าทำไมเป็น.•4ιõ÷‡o‹ƶ¸•
"sasumotuwethfr"
จากนั้นเราสร้างวันเพื่อเติมข้อมูลตารางตามรายการวันที่ที่สร้างไว้ก่อนหน้านี้ของเรา ซึ่งเราจะรวมเข้ากับส่วนหัว หลังจากนั้นเราสามารถพิมพ์ผลลัพธ์สุดท้าย:
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)