Wprowadzenie
Niektóre miesiące są całkowicie symetryczne , co oznacza, że mają symetrię centralną oraz symetrię odbicia , na przykład February of 2010
:
February 2010
┌──┬──┬──┬──┬──┬──┬──┐
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
└──┴──┴──┴──┴──┴──┴──┘
Niektóre miesiące mają tylko centralną symetrię, taką jak February of 1996
lub bieżący, a April of 2018
:
February 1996
┌──┬──┬──┬──┐
│ │ │ │ │
┌──┬──┬──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┴──┴──┘
│ │ │ │ │
└──┴──┴──┴──┘
April 2018 ┌──┐
│ │
┌──┬──┬──┬──┬──┬──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┴──┴──┴──┴──┴──┘
│ │
└──┘
Niektóre są asymetryczne , jak w poprzednim miesiącu March of 2018
:
March 2018
┌──┬──┬──┬──┐
│ │ │ │ │
┌──┬──┬──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┘
│ │ │ │ │ │ │
└──┴──┴──┴──┴──┴──┘
Zadanie
Wprowadź dane w postaci daty , np .:
2018.04
2018.03
2010.02
1996.02
Wyprowadź odpowiednią symetrię , np
2018.04
->centrally symmetric
2018.03
->asymmetric
2010.02
->symmetric
1996.02
->centrally symmetric
Zasady
- To jest kod golfowy, więc wygrywa najmniejsza liczba bajtów.
- Standardowe luki są oczywiście niedozwolone.
- Załóżmy, że tydzień zaczyna się od poniedziałku (dzięki Angs i Arnauld za sugestie).
- Rozważ tylko lata od 1900 do 2100 ( włącznie ).
- Reguły formatowania danych wejściowych i wyjściowych są dozwolone , co oznacza, że można użyć dowolnego równoważnego formatu rodzimego dla wybranego języka.
- Oprzyj swoje rozwiązanie na kalendarzu gregoriańskim .
f(x)
dla każdegox
na liście”. Co powiesz na „weź dane w formie daty”?Odpowiedzi:
JavaScript (ES6), 55 bajtów
Zaoszczędź 6 bajtów dzięki @Neil
Pobiera dane wejściowe w składni curry
(year)(month)
. Zwraca wartośćfalse
asymetryczną,true
centralnie symetryczną i0
całkowicie symetryczną.Wypróbuj online!
W jaki sposób?
Definiujemy funkcję g (), która zwraca dzień tygodnia rrrr / mm / 01 , jako liczbę całkowitą od 0 = poniedziałek do 6 = niedziela.
Ponieważ metoda getDay () natywnie zwraca wartość 0 = niedziela do 6 = sobota, przesuwamy wynik do oczekiwanego zakresu, wysyłając zapytanie dla 7. dnia.
Następnie definiujemy:
Ponieważ konstruktor Date oczekuje miesiąca o indeksie 0 i ponieważ g () zmniejsza m po przekazaniu go do Date , w rzeczywistości najpierw obliczamy dzień tygodnia pierwszego dnia następnego miesiąca, a następnie dodajemy go do bieżącego.
Całkowicie symetryczne miesiące
Całkowicie symetryczne miesiące zaczynają się od poniedziałku, a po nich następuje miesiąc, który również zaczyna się od poniedziałku. Jest to możliwe tylko w lutym roku bez przeskoku.
Prowadzi to do n = 0 .
Centralnie symetryczne miesiące
Centralnie symetryczne miesiące to miesiące, dla których suma dnia tygodnia pierwszego i następnego miesiąca wynosi 7 .
Stąd drugi test: n == 7 .
Brak wbudowanych, 93 bajtów
Wykorzystuje zgodność Zellera . Ten sam format we / wy, co w innej wersji.
Wypróbuj online!
źródło
true
,false
ifilenotfound
zamiast0
…g=m=>new Date(y,m,7).getDay()
oszczędza 6 bajtów.T-SQL , 213 bajtów (ścisłe reguły we / wy)
Powyższe zapytanie uwzględnia ścisłe reguły formatowania wejścia / wyjścia.
Dane wejściowe pochodzą z kolumny
s
tabeli o nazwiet
:Nie golfowany:
SQLFiddle 1
T-SQL , 128 bajtów (dopuszczalne reguły We / Wy)
Jeśli format danych wejściowych i wyjściowych można zmienić, wybrałbym wprowadzenie pierwszego dnia miesiąca w
datetime
kolumnie o nazwied
:Wynik będzie wynosił 1 dla asymetrycznego, 0 dla symetrycznego, NULL dla centralnie symetrycznego.
Jeśli możemy uruchomić go na serwerze (lub z loginem) skonfigurowanym dla języka BRYTYJSKIEGO, możemy usunąć
SET DATEFIRST 1
oszczędność 15 dodatkowych bajtów.SQLFiddle 2
źródło
CONVERT(DATETIME,s+'.01')
zamiastREPLACE
. Możesz również upuścić to miejsce wFROM (SELECT
DATEFORMAT
ustawienia. Na przykład, jeśli użyjemySET LANGUAGE BRITISH
, toCONVERT(DATETIME,'2018.02.01')
będzie 2 stycznia zamiast 1 lutego.Haskell, 170 bajtów
Zwraca 2 dla centralnie symetrycznego, 1 dla symetrycznego i 0 dla asymetrycznego
źródło
Python 2,
118104 bajtówDzięki Jonathan Allan i Dead Possum za ulepszenia!
Python 3,
122105 bajtówWkład
Wydajność
źródło
Y
lubM
), więc jest to obecnie fragment kodu i jest on nieprawidłowy. Jeśli zmienisz zmienne na wywołaniainput()
, będzie to jednak w porządku._[0]+_[-1]
->sum(..)
Czerwony ,
199, 168161 bajtówWypróbuj online!
0 - asymetryczny
1 - symetryczny
2 - centralnie symetryczny
Bardziej czytelny:
źródło
Mathematica, 137 bajtów
Czysta funkcja. Przyjmuje rok i miesiąc jako dane wejściowe i zwroty
-1
dla miesięcy asymetrycznych,0
dla miesięcy centralnie symetrycznych i1
dla miesięcy w pełni symetrycznych. Nie jestem pewien, dlaczego ten język nie może domyślnie przekonwertować z dnia tygodnia na liczbę ...źródło
Narzędzia Bash + GNU, 70
Dane wejściowe są sformatowane jako
YYYY/MM
.Dane wyjściowe są numeryczne, jak następuje:
Zakładam, że ten format wyjściowy jest akceptowalny dla tego pytania.
Wypróbuj online!
źródło
C, 111 bajtów
Wywołaj
f(year, month)
, 0 dla całkowicie symetrycznego, 1 dla asymetrycznego, 2 dla centralnie symetrycznego.źródło
return
zy=
(pierwszy parametr) i wypadnięcie funkcji.Perl 6 , 74 bajtów
Goły blok, domyślnie funkcja 1 argumentu, podobny do łańcucha
"2012-02"
. Zwroty:Gdy wzorzec jest symetryczny, ponieważ liczba dni w tygodniu wzrasta o 1, dni w miesiącu musiałyby zostać przesunięte o 2, aby nadal pasowały (miesiąc zaczynałby się dzień później, ale musiałby zakończyć dzień wcześniej ), więc
2 * .day-of-week + .days-in-month
daje nam miarę tej luki. Modulo 7 powinno uzyskać 1, aby uzyskać symetrię, ale możemy najpierw tanio sprawdzić, czy luty nie przeskakuje, sprawdzając tę sumę przed modulo (poniedziałek i 28 dni w miesiącu to minimalna możliwa kombinacja).Dziwię się, że zajmuje to tak wiele bajtów, ale w pełni potrzeba 36 bajtów na samą datę i uzyskanie dnia tygodnia i dni w tym miesiącu.
źródło