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
한 자릿수 일의 앞에 s가 있고 소문자를 mo
통해 출력합니다 su
(제목이 필수 인 경우 +1 바이트 추가 가능).
온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .
이런 젠장 .. 이것은 가장 긴 05AB1E 답변에 대한 나의 새로운 기록일지도 모른다. 그리고 나는 내가 한 매우 복잡한 예술적 도전을 포함한다 ...>.> 편집 : 흠, 거의 ..
중요 사항 : 05AB1E에는 Date 객체 또는 계산을위한 내장 기능이 없습니다. 날짜에 관한 유일한 내장은 오늘의 연 / 월 / 일 /시 / 분 / 초 / 마이크로 초입니다.
그 때문에, 거의 모든 코드는 이전과 다음 날을 계산하기위한 수동 계산 (연도에 따른 전환과 윤년을 염두에두고)과 Zeller의 합의 를 사용하여 요일을 계산하는 것입니다 .
코드의 상당 부분 이 이전의 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을 목록에서 그대로 둡니다.
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)