¦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ô»
Wprowadź w formacie [day, month, year]
. Wyjście z wiodących 0
s dla dni jednocyfrowe i małe litery mo
przez su
(+1 bajt może być dodany jeśli titlecase jest obowiązkowe).
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Cholera jasna ... To może być mój nowy rekord dla najdłuższej odpowiedzi 05AB1E, a potem dołączę kilka bardzo złożonych wyzwań ascii-art, które zrobiłem ...>.> EDYCJA: Hmm ok, prawie ..; p
Ważna uwaga: 05AB1E nie ma żadnych wbudowanych obiektów Data ani obliczeń. Jedynym wbudowanym pod względem dat jest dzisiejszy rok / miesiąc / dzień / godziny / minuty / sekundy / mikrosekundy.
Z tego powodu prawie cały kod, który widzisz, to ręczne obliczenia do obliczenia poprzednich i następnych dni (w tym przejście przez lata i pamiętanie lat przestępnych) oraz obliczenie dnia tygodnia przy użyciu zgodności Zellera .
Ogromne części kodu są kopiowane mojej wcześniejszej odpowiedzi 05AB1E , która będzie również istotna dla wyjaśnienia poniżej.
Wyjaśnienie:
Zaczynamy od pierwszego dnia poprzedniego miesiąca:
¦ # 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`
Następnie używam tej daty jako daty początkowej i obliczam następne 100 dni:
т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
Następnie, z datą wejścia jako środkiem, zostawiam 17 przed i 17 po tej dacie z listy:
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
Teraz mamy 35 dni. Następnym krokiem jest obliczenie dnia tygodnia i utworzenie nagłówka tabeli wyników:
¬ # 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
Zobacz moją wskazówkę 05AB1E (sekcja Jak kompresować ciągi znaków nie będące częścią słownika? ), Aby zrozumieć, dlaczego tak .•4ιõ÷‡o‹ƶ¸•
jest"sasumotuwethfr"
.
Następnie tworzymy dni do wypełnienia samej tabeli na podstawie naszej wcześniej utworzonej listy dat. Które połączymy razem z nagłówkiem. Po czym możemy wydrukować wynik końcowy:
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 bajtówZaoszczędzono 15 bajtów, pożyczając
.toUTCString().slice(0,2)
od odpowiedzi NeilaPobiera dane wejściowe jako obiekt Date.
Wypróbuj online!
źródło
JavaScript (Node.js) ,
205152145 bajtówWypróbuj online! Pobiera dane wejściowe jako obiekt daty JavaScript lub znacznik czasu. Edycja: Zapisałem 1 bajt dzięki @EmbodimentofIgnorance, co pozwoliło mi zaoszczędzić kolejne 7 bajtów, dodając końcowy znak nowej linii do wyniku. Zaoszczędziłem 52 bajty, gdy odkryłem, że pracowałem nad zachowaniem, które w rzeczywistości nie było błędne ...
źródło
padStart(2)
->padStart(3)
, usuń spację w ciągu łączenia dla -1 bajtówPerl 6 , 87 bajtów
Wypróbuj online!
Bierze
Date
obiekt, zwraca listę linii.źródło
C # (interaktywny kompilator Visual C #) ,
124120 bajtówWypróbuj online!
źródło
Wolfram Language (Mathematica) , 123 bajty
Wypróbuj online!
Nie wiem, dlaczego
Grid
nie działa na TIO, ale ten kod to wyświetla@DavidC zapisał 1 bajt
źródło
Grid
nie działa, ponieważ TIO nie może wyśrodkować elementów jak na zdjęciu?MATL ,
343331 bajtówWypróbuj online!
Wyjaśnienie
źródło
Java (JDK) , 149 bajtów
Wypróbuj online!
Kredyty
źródło
i
ij
jakoś? A może coś krótszegoj++%7<1?10:32
z odrobiną magii? Ale zostawię to tobie. Wracam do pracy, lol. ;)w
skrót? Dlaczego nieh
nagłówek?w
na „dzień wag tyg”. Także kręcenie bitów może prowadzić tylko do(i%7+6)/7*22+10
tego, że jest znacznie dłuższy.PHP ,
197189187 bajtówWypróbuj online!
Dane wejściowe są
STDIN
ciągiem daty. Uruchom zphp -nF
.Sprawdź wszystkie przypadki testowe
Lub 174 bajty z zerowanymi pojedynczymi cyframi.
źródło
Excel VBA,
190159 bajtówDzięki @TaylorScott
Pobiera dane wejściowe w postaci prawidłowego ciągu daty dla Excel VBA (np. 19 lutego 2020 r .; 2/19/2020; 19 lutego 2015 r.) I zwraca tablicę z danym kalendarzem na środku.
źródło
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
Czerwony ,
153131 bajtówWypróbuj online!
źródło
T-SQL, 203 bajty
Wersja online jest nieco inna, ta opublikowana wersja działa w MS-SQL Studio Management. To oszczędza 1 bajt w porównaniu z wersją online, ale nie daje poprawnego wyniku online
Wypróbuj online
źródło
Python 2 , 115 bajtów
Wypróbuj online!
Nie jestem pewien, czy jest to dozwolone ... pobiera dane wejściowe ze STDIN w formularzu
date(year, month, day)
. Można to również przedstawić jako__import__('datetime').date(year, month, day)
. To są naprawdę__import__('datetime').date
przedmioty.źródło