Biorąc pod uwagę listę działań oraz ich datę / godzinę rozpoczęcia, wydrukuj kalendarz ASCII-art przedstawiający działania w odpowiednich dniach. Wszystkie działania odbywają się w tym samym miesiącu, żadne dwa działania nie będą miały tego samego dnia, a wszystkie działania mieszczą się w polu kalendarza.
Kalendarz ma datę w lewym górnym rogu każdego pola, pola mają szerokość 9 pól i wysokość 5 pól, otoczone -
i |
. Dwuliterowy skrót oznaczający dzień tygodnia jest wyśrodkowany nad pierwszym rzędem, a tygodnie rozpoczynają się od niedzieli.
Na przykład biorąc pod uwagę następujące działania:
10/5/2018 - 9:00am - Sandbox calendar challenge
10/9/2018 - 9:00am - Post challenge to main
10/10/2018 - 10:00am - Profit
10/31/2018 - 7:30pm - Halloween party
Wydrukuj ten odpowiedni kalendarz:
Su Mo Tu We Th Fr Sa
-----------------------------------------------------------------------
| |1 |2 |3 |4 |5 |6 |
| | | | | |9:00am | |
| | | | | |Sandbox | |
| | | | | |calendar | |
| | | | | |challenge| |
-----------------------------------------------------------------------
|7 |8 |9 |10 |11 |12 |13 |
| | |9:00am |10:00am | | | |
| | |Post |Profit | | | |
| | |challenge| | | | |
| | |to main | | | | |
-----------------------------------------------------------------------
|14 |15 |16 |17 |18 |19 |20 |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
-----------------------------------------------------------------------
|21 |22 |23 |24 |25 |26 |27 |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
-----------------------------------------------------------------------
|28 |29 |30 |31 | | | |
| | | |7:30pm | | | |
| | | |Halloween| | | |
| | | |party | | | |
| | | | | | | |
-----------------------------------------------------------------------
Wyjaśnienia
- Słowa harmonogramu (pasujące [A-Za-z] +) zostaną oddzielone pojedynczym odstępem między nimi (jak w przykładzie).
- Wystarczy podzielić tekst na granice słów. Nie ma potrzeby dzielenia wyrazów.
- Jeśli luty rozpocznie się w niedzielę w roku przestępnym, będziesz mieć tylko cztery wiersze kalendarza.
- Jeśli 31-dniowy miesiąc (np. Sierpień) rozpocznie się późno w tygodniu, być może trzeba wydrukować sześć wierszy kalendarza.
I / O i reguły
- Twój kod musi obsługiwać daty przynajmniej między kalendarzem gregoriańskim
0001-01-01
i9999-12-31
w nim, w tym, odpowiednio, lata przestępne. Na przykład, jeśli podano dane wejściowe2016-02-13 9:00am Test
, kalendarz wyjściowy powinien mieć 29 lutego. - Format daty wejściowej może być w dowolnym żądanym formacie. ISO 8601,
datetime
obiekt, szczególnie sformatowany ciąg znaków itp. Analiza wejściowa nie jest interesującą częścią tego wyzwania. - Wejście i wyjście może odbywać się dowolną dogodną metodą .
- Wiodące / końcowe znaki nowej linii lub inne białe znaki są opcjonalne, pod warunkiem, że znaki są odpowiednio ustawione.
- Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
- Dane wyjściowe mogą być wysyłane do konsoli, zwracane jako lista ciągów, zwracane jako pojedynczy ciąg itp.
- Standardowe luki są zabronione.
- To jest golf golfowy, więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
1752-09-02 - 09:00am - Wife's Birthday Tomorrow (14th!)
Odpowiedzi:
JavaScript (ES8),
380…321320 bajtówPobiera dane wejściowe, gdy
(y,m,e)
:y
jest rokm
jest miesiącem 0-indeksowanyme
to obiekt, którego kluczami są dni, a których wartościami są zdarzenia w[hour, task]
formacieWypróbuj online!
W jaki sposób?
Poniżej znajduje się kilka ważnych części kodu.
nagłówek
Linia nagłówka jest generowana za pomocą:
Gdy
split()
jest używana z wyrażeniem regularnym zawierającym grupę przechwytującą, ta grupa jest zawarta w tablicy wyjściowej. W takim przypadku daje:Łączymy tę tablicę z 4 spacjami, co prowadzi do:
dokładnie tego chcemy.
Struktura miesiąca
Formatowanie zdarzeń
Poniższy kod służy do formatowania zdarzenia.
źródło
Python 2 ,
326324315312307 bajtówWypróbuj online!
Taki sam wkład jak odpowiedź JS Arnaulda :
Pobiera dane wejściowe, gdy
(y,m,e)
:y
jest rokm
oznacza miesiąc zindeksowany 1e
to obiekt, którego kluczami są dni, a których wartościami są zdarzenia w(hour, task)
formacieźródło
Węgiel drzewny ,
215206 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Przyjmuje daty w formacie d / m / rrrr. Wyjaśnienie:
Wprowadź pierwsze zdarzenie.
Wyodrębnij datę i podziel na
/
s.Przelicz na miesiące od marca 1 pne. Chcę obliczyć dzień tygodnia pierwszego zarówno następnego, jak i bieżącego miesiąca, a praca w miesiącach jest łatwiejsza niż oddzielenie miesięcy i lat od siebie pod koniec roku, a także pozwala mi zacząć liczyć miesiące zaczynające się w marcu zamiast w styczniu, co jest wymagane przez zgodność Zellera.
Użyj zmodyfikowanej zgodności Zellera, aby wyodrębnić dzień tygodnia pierwszego dnia następnego miesiąca i tego miesiąca. Podstawowa część polega na tym, że liczba dni od 30 października poprzedniego roku do 1 dnia danego miesiąca, gdzie
m = 4
dla marca im = 14
stycznia następnego roku jest podana wzoremm * 153 / 5
, jednak możemy odjąć 140, ponieważ tylko dbać o dzień tygodnia. Następnie pozostaje dokonać korekt z powodu roku; każdy rok dodaje dzień, każdy 4 rok dodaje dodatkowy dzień, każdy 100 rok odejmuje dzień, a każdy 400 rok dodaje dzień ponownie. (Ponieważ pracuję od miesięcy, wszystkie te wartości są mnożone przez 12.) Raczej wygodnie to bezpośrednio daje mi odpowiedź w kategoriach tygodnia indeksowanego w niedzielę (zwykle dodaje się dzień miesiąca i zaczyna liczyć w sobotę).Neguj dzień tygodnia i zapisz go jako bieżący dzień miesiąca.
Oblicz liczbę dni w miesiącu od dnia tygodnia dwóch miesięcy.
Wyjście nagłówków dnia.
Wydrukuj górny wiersz
-
s.Pętla do ostatniego dnia miesiąca została wygenerowana.
Przesuń kursor na początek następnego wiersza.
Przetwarzaj 7 dni na raz.
Wydrukuj kolumnę
|
s po lewej stronie.Zwiększ aktualny dzień miesiąca.
Jeśli bieżącym dniem miesiąca jest dzień bieżącego wydarzenia, ...
... wypakuj pozostałe części wydarzenia, ...
... uzupełnij czas do 9 spacji i zapisz go oraz pusty ciąg jako listę, ...
... podziel opis na spacje i zapętlaj nad nimi, ...
... dodając każde słowo do poprzedniego słowa, jeśli będzie pasować; ...
... wypisuje czas i opis (
Pδ
nie działa, może to być błąd węgla drzewnego?), ...... i wprowadź następne zdarzenie.
Jeśli bieżący dzień miesiąca mieści się w przedziale od 1 do ostatniego dnia miesiąca, wyślij go, w przeciwnym razie po prostu wypuść wystarczająco dużo miejsca, aby przejść do następnego dnia.
Pod koniec tygodnia wydrukuj prawą kolumnę
|
s i dolny rząd-
s.źródło
year-1
należy użyć zamiastyear
imonth+12
należy je stosować zamiastmonth
. Czy może w jakiś sposób uprościłeś algorytm, o którym wspomniałem w tej mojej odpowiedzi 05AB1E, która jest równa tej z Wikipedii ?Java (JDK) ,
538439428425 bajtówPrawdopodobnie najdłuższe rozwiązanie Code Golf, jakie kiedykolwiek opublikowałem. Wciąż próbuję zagrać w golfa stąd, ale to walka.
Udało się wyeliminować 99 bajtów, zmieniając format wejściowy i używając parsowania wyrażeń regularnych, a kolejne 11 z różnych bitów.
3 dodatkowe bajty wyłączone dzięki Kevinowi!
Czerpiąc inspirację z innych odpowiedzi, pobiera dane wejściowe jako rok, miesiąc i mapę dni do ciągu reprezentującego czas i zdarzenie w formacie
<time>-<event>
.Wypróbuj online!
Nie golfił
źródło
&&(i=1)<2?7:0
można?7*(i=1):0
zapisać 3 bajty.b>x|i++<6?0:7*(i=1)
zamiastb<=x&++i>6?7*(i=1):0
ic*i>1|b<1|b>x?c<2&e!=null?e.split("-")[i-2]:" ":b+""
zamiastc*i<2&b>0&b<=x?b+"":c<2&e!=null?e.split("-")[i-2]:" "
Czerwony ,
674651 bajtówWypróbuj online!
Bardziej czytelny:
źródło
if e = 0[e: 7]
można usunąć, prawda? Używasze: 1 + c/weekday % 7
, więce
zawsze będzie w zasięgu[1, 7]
.1 +
Dzieje się to najpierw .. Ok, widzę mój błąd. Jestem przyzwyczajony%
i/
mam pierwszeństwo przed operatorem+
.