¦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 байт может быть добавлен , если titlecase является обязательным).
Попробуйте онлайн или проверьте все тесты .
Черт возьми ... Это может быть мой новый рекорд для самого длинного ответа 05AB1E, и затем я включаю несколько очень сложных задач ascii-art, которые я сделал ...>.> РЕДАКТИРОВАТЬ: Хм хорошо, почти ..; p
Важная заметка: 05AB1E не имеет встроенных функций для объектов Date или расчетов. Единственная встроенная функция, касающаяся дат, это текущий год / месяц / день / часы / минуты / секунды / микросекунды.
Таким образом, почти весь код, который вы видите, представляет собой ручные вычисления для вычисления предыдущих и следующих дней (включая переход по годам и с учетом високосных годов) и вычисления дня недели с использованием конгруэнтности Целлера .
Огромные части кода скопированы из этого моего более раннего ответа 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)
JavaScript (ES6),
141126 байтSaved 15 bytes by borrowing
.toUTCString().slice(0,2)
from Neil's answerTakes input as a Date object.
Try it online!
источник
JavaScript (Node.js),
205152145 bytesTry it online! Takes input as JavaScript Date object or timestamp. Edit: Saved 1 byte thanks to @EmbodimentofIgnorance, which then allowed me to save a further 7 bytes by adding a trailing newline to the output. Saved 52 bytes when I discovered that I was working around behaviour that was not actually buggy in the first place...
источник
padStart(2)
->padStart(3)
, remove the space in the join string for -1 bytePerl 6, 87 bytes
Try it online!
Takes a
Date
object, returns a list of lines.источник
C# (Visual C# Interactive Compiler),
124120 bytesTry it online!
источник
Wolfram Language (Mathematica), 123 bytes
Try it online!
I don't know why
Grid
doesn't work on TIO but this code outputs this@DavidC saved 1 byte
источник
Grid
doesn't work because TIO can't center the items like in your picture?MATL,
343331 bytesTry it online!
Explanation
источник
Java (JDK), 149 bytes
Try it online!
Credits
источник
i
andj
somehow? Or something shorter forj++%7<1?10:32
with some bitwise magic? But I'll leave that to you. I'm going back to work, lol. ;)w
stand for? Why noth
for header?w
for "day of week". Also, bit twiddling can only lead to(i%7+6)/7*22+10
which is much longer.PHP,
197189187 bytesTry it online!
Input is
STDIN
as a date string. Run withphp -nF
.Verify all test cases
Or 174 bytes with zero-padded single digits.
источник
Excel VBA,
190159 bytesThanks @TaylorScott
Takes input in the form of a valid date string for Excel VBA (e.g. February 19, 2020; 2/19/2020; 19-Feb-2019), and returns an array with the given calendar centered on it.
источник
Function z(i)
Dim d(5,6)
v=DateValue(i)-17
For x=1To 5
For y=0To 6
d(0,y)=Left(WeekdayName(Weekday(v+y)),2)
d(x,y)=Day(v+y+(x-1)*7)
Next y,x
z=d()
End Function
Red,
153131 bytesTry it online!
источник
T-SQL, 203 bytes
The online version is slightly different, this posted version works in MS-SQL Studio Management. It saves 1 bytes compared with the online version, but doesn't give the correct result online
Try it online
источник
Python 2, 115 bytes
Try it online!
Not sure if this is allowed... takes input from STDIN in the form
date(year, month, day)
. This can also be represented as__import__('datetime').date(year, month, day)
. These are really__import__('datetime').date
objects.источник