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ô»
Nhập theo định dạng [day, month, year]
. Đầu ra với 0
s hàng đầu cho các ngày có một chữ số và chữ thường mo
thông qua su
(có thể thêm byte 1 nếu bắt buộc là Titlecase).
Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .
Holy shit .. Đây có thể là bản ghi mới của tôi cho câu trả lời dài nhất 05AB1E, và sau đó tôi bao gồm một số thử thách nghệ thuật ascii rất phức tạp tôi đã làm ...>.> EDIT: Hmm ok, gần như ..; p
Lưu ý quan trọng: 05AB1E không có bất kỳ nội dung nào cho các đối tượng hoặc tính toán Ngày. Nội dung duy nhất liên quan đến ngày mà nó có là năm / tháng / ngày / giờ / phút / giây / giây / giây.
Do đó, gần như tất cả các mã bạn thấy là các tính toán thủ công để tính toán các ngày trước và ngày tiếp theo (bao gồm cả chuyển đổi qua các năm và ghi nhớ các năm nhuận) và tính toán ngày trong tuần bằng cách sử dụng đồng quy của Zeller .
Phần lớn của mã được sao chép từ câu trả lời 05AB1E trước đó của tôi , cũng sẽ có liên quan để giải thích bên dưới.
Giải trình:
Chúng tôi bắt đầu bằng cách đi đến ngày đầu tiên của tháng trước:
¦ # 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`
Sau đó, tôi sử dụng ngày đó làm ngày bắt đầu và tính 100 ngày tiếp theo:
т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
Sau đó, với ngày đầu vào là giữa, tôi chỉ để lại 17 trước và 17 sau ngày đầu vào đó từ danh sách:
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
Bây giờ chúng tôi có 35 ngày của chúng tôi. Bước tiếp theo là tính ngày trong tuần và tạo tiêu đề của bảng đầu ra:
¬ # 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
Xem 05AB1E mẹo này của tôi (phần Làm thế nào để chuỗi nén không nằm trong từ điển? ) Để hiểu tại sao .•4ιõ÷‡o‹ƶ¸•
là "sasumotuwethfr"
.
Sau đó, chúng tôi tạo các ngày để điền vào bảng dựa trên danh sách ngày được tạo trước đó của chúng tôi. Mà chúng ta sẽ hợp nhất với tiêu đề. Sau đó chúng ta có thể in kết quả cuối cùng:
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)