Australijczycy uwielbiają święta i picie. Wczoraj, 26 stycznia, był dzień Australii, który jest świętem państwowym. Cieszyłem się, że nie byłem wczoraj w pracy i chętnie się dowiem, kiedy następnym razem będę mieć święto! Niestety, wypiłem trochę za dużo i nie jestem w stanie samodzielnie tego wypracować.
Napisz program, który jako dane przyjmie datę w australijskim zapisie daty / godziny (dd / mm) i wyśle liczbę dni do następnego święta. Ponieważ jestem mieszkańcem Queensland (QLD), interesują mnie tylko święta, które mają wpływ na Queenslanders :
25/03 | Wielki Piątek
26/03 | Wielkanocna sobota
28.03 Poniedziałek Wielkanocny
25/04 | Anzac Dzień
02/05 | Święto Pracy
03/10 | Urodziny Królowej
25/12 | Boże Narodzenie
26.12
Drugi dzień świąt 27/12 | Święta Bożego Narodzenia
Zwróć uwagę na następujące strony:
Święta Bożego Narodzenia
Dodatkowe święto państwowe, które należy dodać, gdy Nowy Rok, Boże Narodzenie lub drugi dzień świąt przypada w weekend.
Ponieważ dzień Bożego Narodzenia przypada w niedzielę, jest dodatkowe święto państwowe. Boże Narodzenie jest wciąż świętem państwowym.
Ponieważ jestem poranną osobą, powinieneś podać aktualną datę jako dzień (ponieważ jest to najbardziej prawdopodobny czas, kiedy sprawdzę twój program na następne święto państwowe). Oznacza to, że jeśli zostanie podana data święta państwowego, wynik powinien być 0
; jeśli dzień przed świętem państwowym jest wprowadzony, twoja produkcja będzie 1
.
Interesują mnie tylko daty od teraz (27/01) do końca roku. Ostateczna data, którą musisz wziąć pod uwagę, to 31.12, w którym będzie twoja produkcja 1
(na Nowy Rok).
Standardowe luki są zabronione.
Wejście
- Wpis zawsze będzie składał się z 5 znaków: 4 liter, oddzielonych łącznikiem
-
lub ukośnikiem/
- Dane wejściowe będą datą między 27/01 a 31/12
Wynik
- Liczba dni do następnego święta w Queensland Australia, w tym data wprowadzenia: powinna być liczbą pomiędzy
0
i153
(najdłuższa przerwa) - Brak nowych linii lub błędów
Przykłady
01-05 = 1
02-05 = 0
03-05 = 153
25/12 = 0
26-12 = 0
27/12 = 0
30/12 = 2
31-12 = 1
Mam nadzieję, że jest to jasne i nic nie umknie; jest to jednak moje drugie pytanie, więc docenię wszelkie opinie i postaram się jak najszybciej naprawić problemy.
Odpowiedzi:
Pyth ,
98846267 bajtówAktualizacja: Zapisano 14 bajtów, skracając listę liczby dni dla wszystkich 12 miesięcy do obliczenia liczby dni. Nie znalazłem dobrego sposobu na skompresowanie drugiej listy, wciąż próbując!
Aktualizacja 2: Zapisano kolejne 22 bajty, kończąc kodowanie listy liczb dziennych jako ciąg base256.
Wypróbuj online!
Ten sam algorytm jak w mojej odpowiedzi w języku Python. I nie ma wbudowanego, aby uzyskać dzień roku, więc musiałem to zrobić sam. Utworzenie tych dwóch list do obliczeń w ciągu roku i dni świątecznych jest dość kosztowne ... przejrzę je ponownie i spróbuję wygenerować je w mniejszej liczbie bajtów.
źródło
Visual Basic for Applications, 155 lub 118 bajtów
Wersja 1 - niezależna od ustawień regionalnych, 155 bajtów
Wersja 2 - zależna od ustawień regionalnych, 118 bajtów
Liczba bajtów dotyczy końcowego pliku .BAS, w tym znaków wiersza. Edytowany poza standardowym edytorem VBA (ponieważ nakłada dodatkowe spacje i pełne formy niektórych słów kluczowych) - ale importuje się i działa płynnie na dowolnej aplikacji Office (do testowania typu np.
? h("10/08")
W bezpośrednim oknie lub w programie Excel bezpośrednio w formule komórkowej).(ZMIENIONO) Początkowo zdecydowałem się użyć
DateSerial
funkcji, aby funkcja była bezpieczna dla ustawień regionalnych (wersja 1). Ponieważ mieszkam w Brazylii i dlatego mój system jest skonfigurowany do używania formatu „dd / mm / rr” dla dat (podobnie jak w Australii), mógłbym napisać jeszcze mniejszą wersję, używającCDate
zamiast tego (wersja 2).CDate
wykorzystuje informacje o ustawieniach regionalnych systemu do konwersji tekstu na datę. W tej wersji założyłem również, że kod będzie uruchamiany tylko w 2016 r. (Jeśli rok zostanie pominięty (-6 bajtów)CDate
zakłada bieżący rok według zegara systemowego).Liczba 42454 w trzecim wierszu jest sumą 42450, która jest liczbową reprezentacją 01.01.2016 na VBA, i 84, która jest dniem roku na pierwsze wakacje. Tablica zawiera datę roku dla każdego święta (w tym 01.01.2017) przesuniętą o -84, ponieważ zabiera to kilka cyfr. Użycie 16 zamiast 2016 na
DateSerial
zabiera dwa kolejne bajty.Tworzenie identycznej tablicy dziewięć razy w iteracji jest „złym” kodem, ale działa i zapisuje 3 kolejne bajty (jeden dla nazwy tablicy i jeden dla zewnętrznej pętli znaku równości, a drugi dla odniesienia do tablicy wewnątrz pętli).
„Brakujące” spacje między 0 a następującym słowem kluczowym w drugim i czwartym wierszu nie są konieczne, ponieważ są one ponownie wprowadzane automatycznie przez VBE podczas importowania modułu. Używany jako przestarzały, ale tani bajtowo,
If <...> Goto <linenumber>
aby zerwać z pętli (If <...> Then Exit For
iIf <...> Then Exit Function
użyć więcej znaków).Skorzystano również z faktu, że nazwa funkcji w VBA zachowuje się jak zmienna lokalna, a jej wartość jest automatycznie zwracana przez funkcję pod koniec wykonywania.
źródło
JavaScript (ES6),
131128 bajtówWyjaśnienie
Używa wbudowanego
Date
konstruktora JavaScript do konwersji ciągu wejściowego na liczbę milisekund od epoki, a następnie porównuje to z liczbą milisekund dla każdego święta.Odbywa się to poprzez przechowywanie dni ustawowo wolnych od pracy w tablicy jako liczby dni od daty odniesienia. Wybrałem
2016-01-29
datę referencyjną, ponieważ liczbę milisekund od epoki można skrócić najkrótszą dla tej daty. Dowolna liczba milisekund między tym dniem a następnym działa, ponieważ wynik jest zaokrąglany w dół, a utrzymywanie liczby na środku pozwala uniknąć efektów związanych z czasem letnim (chociaż strefa czasowa PO nie ma czasu letniego). Liczba tego dnia to1453986000000
i zaokrąglenie do1454000000000
(dodanie kilku godzin) oznacza, że można go zapisać jako1454e9
.Test
To rozwiązanie zależy od strefy czasowej użytkownika. Działa to w strefie czasowej PO (i mojej) (GMT +1000). Jeśli chcesz go przetestować w innej strefie czasowej, dodanie
numberOfHoursDifferentFromGMT1000 * 60 * 60 * 1000
numeru daty odniesienia powinno działać. (np. GMT +0430 byłoby-5.5 * 60 * 60 * 1000 + 1454e9+n*864e5
)Pokaż fragment kodu
źródło
separated with a hyphen - or slash /
jest nieco niejednoznaczna. Dla mnie oznacza to, że mamy do czynienia z obydwoma, ale zdecydowanie mogę zobaczyć twoją stronę. Zgadnij, że PO powinien to wyjaśnić.T-SQL,
210,206, 194 bajtów(Pierwszy post tutaj, mam nadzieję, że jest ok, ale proszę bądź miły :)
Wejście wchodzi w
@i
, służy zarówno/
i-
jako separator. Jestem w Australii, więc mój format daty jest taki sam jak @TasZaktualizuj,
varchar
abychar
zapisać 3 bajty plus usunięto spację :)Aktualizacja 2 deklaruje
@c
i przypisuje bez wyboruźródło
T-SQL, 296 bajtów
Utworzono jako funkcję wycenioną w tabeli
Używany w następujący sposób
Krótkie wyjaśnienie
źródło
JavaScript (ES6), 134 bajty
user81655 wciąż mnie pobił o 3 bajty, ale nie mogę znaleźć nigdzie indziej, żeby coś z tego wycisnąć. Działa, obliczając liczbę dni, które minęły, zamiast używać daty, a następnie porównując ją z szeregiem świątecznych przesunięć.
źródło
Python 2,
204185165166 bajtówAktualizacja: Grałem w golfa o około 20 bajtów, obliczając osobno dzień roku. Nie ma już potrzeby długiego importu :)
Aktualizacja 2: Kolejne 20 Bajtów w dół, uświadamiając sobie, że mogę traktować nowy rok jak dzień 367 i wprowadzając inne drobne poprawki.
Wypróbuj online!
Nie golfowany:
Działa poprzez zapisanie liczby dni świątecznych na liście, odfiltrowanie dni poprzedzających podaną datę, pobranie pierwszego elementu z tej filtrowanej listy i odjęcie dnia roku, który został obliczony na podstawie danych wejściowych.
źródło
PHP, 116 bajtów
Całkiem proste podejście. Przechowuje dni roku na święta i wyskakuje tak długo, jak są w przeszłości. Na koniec odejmuje się żądany dzień roku.
Pomiń wszystkie przypadki testowe. Działa z wiersza poleceń i akceptuje dane wejściowe przy użyciu łącznika, na przykład:
źródło
ruby 1.9.3,
155153 bajtówPo świętach Bożego Narodzenia potrzebujemy naszego specjalnego dnia 366! Podobny przypadek jak @DenkerAffe.
Stosowanie:
źródło
05AB1E , 45 bajtów
To może już nie być rok 2016, ale cokolwiek ...;) Nadal zakładamy, że rok 2016 jest rokiem przestępnym
29
w lutym.Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Zobacz ten 05AB1E końcówki kopalni (sekcje Jak skompresować dużych liczb całkowitych? I jak skompresować list całkowitych? ) , Aby zrozumieć, dlaczego
•9JRt€ª´Q®Ië•
jest10549819042671399072072399
;•9JRt€ª´Q®Ië•368в
jest[85,86,88,116,123,277,360,361,362,367]
; i•Σ₁t•
jest5354545
.źródło