(Zainspirowany przez Riddlera z zeszłego tygodnia na FiveThirtyEight.com. Wpis w piaskownicy .)
Biorąc pod uwagę rok między 2001 a 2099, oblicz i zwróć liczbę dni w tym roku kalendarzowym, gdzie mm * dd = yy
(gdzie yy
jest 2-cyfrowa rok).
Na przykład 2018 ma 5:
- 18 stycznia (1 * 18 = 18)
- 9 lutego (2 * 9 = 18)
- 6 marca (3 * 6 = 18)
- 3 czerwca (6 * 3 = 18)
- 2 września (9 * 2 = 18)
Dane wejściowe mogą być dwu- lub czterocyfrowe rokiem numerycznym.
Wyjście powinno być liczbą całkowitą. Opcjonalne końcowe miejsce lub zwrot jest w porządku.
Pełna lista wejść / wyjść:
Input = Output
2001 = 1 2021 = 3 2041 = 0 2061 = 0 2081 = 2
2002 = 2 2022 = 3 2042 = 4 2062 = 0 2082 = 0
2003 = 2 2023 = 1 2043 = 0 2063 = 3 2083 = 0
2004 = 3 2024 = 7 2044 = 3 2064 = 2 2084 = 5
2005 = 2 2025 = 2 2045 = 3 2065 = 1 2085 = 1
2006 = 4 2026 = 2 2046 = 1 2066 = 3 2086 = 0
2007 = 2 2027 = 3 2047 = 0 2067 = 0 2087 = 1
2008 = 4 2028 = 4 2048 = 6 2068 = 1 2088 = 3
2009 = 3 2029 = 1 2049 = 1 2069 = 1 2089 = 0
2010 = 4 2030 = 6 2050 = 3 2070 = 3 2090 = 5
2011 = 2 2031 = 1 2051 = 1 2071 = 0 2091 = 1
2012 = 6 2032 = 3 2052 = 2 2072 = 6 2092 = 1
2013 = 1 2033 = 2 2053 = 0 2073 = 0 2093 = 1
2014 = 3 2034 = 1 2054 = 4 2074 = 0 2094 = 0
2015 = 3 2035 = 2 2055 = 2 2075 = 2 2095 = 1
2016 = 4 2036 = 6 2056 = 4 2076 = 1 2096 = 4
2017 = 1 2037 = 0 2057 = 1 2077 = 2 2097 = 0
2018 = 5 2038 = 1 2058 = 0 2078 = 2 2098 = 1
2019 = 1 2039 = 1 2059 = 0 2079 = 0 2099 = 2
2020 = 5 2040 = 5 2060 = 6 2080 = 4
To jest golf golfowy wyzwanie polegające na , wygrywa najniższa liczba bajtów w każdym języku.
Wstępne obliczanie i po prostu wyszukiwanie odpowiedzi jest zwykle wykluczone zgodnie z naszymi zasadami dotyczącymi luk , ale wyraźnie zezwalam na to wyzwanie. Pozwala na kilka interesujących alternatywnych strategii, chociaż prawdopodobnie nie będzie ona najkrótsza na liście 98 99 elementów.
Odpowiedzi:
Excel, 48 bajtów
Brawo! Wreszcie coś, w czym Excel jest naprawdę dobry.
Pobiera dane z A1 w postaci liczb całkowitych 1-99 reprezentujących rok i wypisuje je tam, gdzie wprowadzasz tę formułę. Jest to formuła tablicowa, więc użyj Ctrl-Shift-Enter zamiast Enter, aby ją wprowadzić.
Wykorzystuje to fakt, że
COUNT
ignoruje błędy, więc wszelkie błędy spowodowane przez miesiąc niepodzielący roku (prowadzące Excel do analizowania czegoś podobnego2/12.5/25
lub przez niepoprawną datę2/29/58
, są po prostu dyskretnie ignorowane.źródło
A1
. Wprowadzenie 4-cyfrowego roku po prostu powraca0
.Python 2 , 44 bajty
Wypróbuj online!
Anonimowa funkcja podana jako obiekt metody. Wytwarza wszystkie produkty
(month, day)
par(m, d)
jak zakodowanyk=32*m+d
w0≤m≤12
,0≤d≤31
, owijając się. Eliminuje 29-31 lutego, wykluczając je z zasięgu.źródło
Java (JDK 10) , 65 bajtów
Wypróbuj online!
Kredyty
źródło
29*n
, więc nie trzeba sprawdzać(m==2?29:32)
na29+m%2*3
nadal wydaje się dawać wszystkieOK
wyniki. Kredyt dla @AsoneTuhid „s Ruby odpowiedź .PowerShell , 94 bajty
Wypróbuj online!
Pobiera dane wejściowe jako dwucyfrowy rok, a następnie konstruuje
for
pętlę od1/1/year
do12/9/year
(ponieważ 12/10 i kolejne nigdy się nie liczą, a to oszczędza bajt). Każdą iterację zwiększamy o$z
ile.Month
razy.Day
jest równa naszemu rokowi wejściowemu. Poza pętlą$z
pozostaje w potoku, a dane wyjściowe są niejawne.Edytuj - to zależy od kultury. Powyższy kod działa dla
en-us
. Format daty może wymagać zmiany w przypadku innych kultur.źródło
Rubinowy ,
4642 bajtówWypróbuj online!
źródło
JavaScript (Node.js) ,
484443 bajtyWypróbuj online!
JavaScript (Node.js) ,
5958 bajtówWypróbuj online!
źródło
Galaretka , 15 bajtów
Wypróbuj online!
Weź liczbę z zakresu
[0,100[
jako dane wejściowe.źródło
JavaScript (ES6), 91 bajtów
Byłem ciekawy, jak kodowanie twarde porównałoby się do obliczeń iteracyjnych. Jest zdecydowanie dłuższy (patrz odpowiedź @ Shaggy ), ale nie strasznie dłużej.
Edycja : Jest to jednak znacznie dłużej niż bardziej bezpośrednia formuła (patrz odpowiedź @ l4m2 ).
Pobiera dane wejściowe jako liczbę całkowitą w [1..99] .
Wypróbuj online!
W jaki sposób?
Lata nieparzyste mają znacznie mniejsze szanse, że mm * dd = rr niż lata. Konkretniej, nieparzyste lata mają od 0 do 3 meczów, podczas gdy parzyste lata mają od 0 do 7 meczów. To pozwala nam kodować każdą parę lat za pomocą zaledwie 5 bitów, które można wygodnie przedstawić jako pojedynczy znak w bazie 36.
źródło
Perl 6 , 40 bajtów
Wypróbuj online!
źródło
Python 2 i 3 ,
5552 bajtówWypróbuj online!
źródło
Narzędzia Bash + GNU , 57
Zauważ, że
seq
polecenie zawsze tworzy listę 366 dat - dla lat bez przestępstwa zostanie włączony 1 stycznia następnego roku. Jednak w zakresie dat 2001..2099, MM * DD nigdy nie będzie YY dla 1 stycznia następnego roku dla żadnego z tych lat, więc ten dodatkowy dzień nie wpłynie na wynik.Wypróbuj online!
źródło
date
, że podczas matematyki zrobię taką randkę.seq
nie potrzebuje spacji po-f
, więc możesz zapisać tam bajt.T-SQL,
123121 bajtówZgodnie z naszymi regułami IO dane wejściowe są pobierane za pomocą istniejącej tabeli t z polem całkowitym y , które zawiera 2-cyfrowy rok.
Podział linii służy wyłącznie do odczytu. Zainspirowany głównie rozwiązaniem Excela Sophii .
CONCAT()
, który dokonuje niejawnejvarchar
konwersji typu danych. W przeciwnym razie musiałbym zrobić kilka instrukcjiCAST
lubCONVERT
oświadczeń.ISDATE()
, która zwraca 1 dla prawidłowych dat i 0 dla nieprawidłowych dat.y%m=0
) doWHERE
klauzuli, aby zaoszczędzić 2 bajty, dzięki @RazvanSocol.Niestety, nie jest on dużo krótszy niż wersja tabeli odnośników (używając ciągu z wersji osdavison ):
Wyszukiwanie T-SQL, 129 bajtów
EDYTOWAĆ : Pozostawiając mój oryginał powyżej, ale możemy zaoszczędzić kilka bajtów, używając kilku nowych funkcji:
STRING_SPLIT
jest dostępny w MS SQL 2016 i nowszych wersjach.CONCAT_WS
jest dostępny w MS SQL 2017 i nowszych wersjach.IIF
przezWHERE
MS-SQL 2017,
121118 bajtówMS-SQL 2017, dodatkowa oszustwa edycja: 109 bajtów
Wymaga bycia w
master
bazie danych, która zawiera tabelę systemową,spt_values
która (po przefiltrowaniuTYPE='P'
) daje zliczanie liczb od 0 do 2048.źródło
m/d/y
), zależy od ustawień lokalizacji instancji SQL. Inne lokalizacje mogą wymagać innej kolejności lub innego separatora, ale nie sądzę, żeby wpłynęło to na długość kodu.SPLIT_STRING
zamiast CTE sprowadza go do 120 bajtów. UżycieCONCAT_WS
zamiastCONCAT
zapisuje inny znak, doprowadzając go do 119 bajtów.IIF
sięWHERE
.Julia 0,6 ,
494442 bajtówWypróbuj online!
-5 bajtów inspirowanych Rubinową odpowiedzią Asone Tuhid.
-2 bajty zastępujące licznik sumą
Wyjaśnienie:
Dla każdego miesiąca
i
od 1 do 12 obliczy/i
i sprawdź, czy jest to jeden z dni tego miesiąca. Miesięcy z 31 dni to 1, 3, 5, 7, 8, 10, 12 - tak oni dziwne poniżej 8, a nawet i powyżej 8. Więc alboi%2
alboi÷8
(co jest 0 dla i <8 i 1 dla I> = 8 tutaj) powinno wynosić 1, ale nie oba - więc XOR je. Jeśli wynik xor jest prawdą, możemy sprawdzić terminy1:28+3
tj1:31
, w przeciwnym razie możemy sprawdzić tylko dat1:28
.1:28
wystarcza na resztę miesięcy (ta poprawka zainspirowana Rubinową odpowiedzią Asone Tuhid ), ponieważ:w lutym jedyną możliwością byłoby
2*29 = 58
, ale2058
nie jest to rok przestępny, więc możemy założyć, że luty zawsze ma 28 dni.pozostałe miesiące z 30 dniami to miesiąc 4 i więcej - dla których
i*29
(ii*30
) byłoby powyżej 100, co można zignorować.Na koniec odliczamy, ile razy
y/i
należy do tej listy dni (używającsum
tutaj boolean ), i zwracamy to.źródło
JavaScript,
9185828177 bajtówPobiera dane wejściowe jako 2-cyfrowy ciąg (lub 1 lub 2 cyfrową liczbę całkowitą).
Wykorzystuje fakt, że
new Date
przejdzie do następnego miesiąca i będzie to kontynuował, jeśli przekażesz mu wartość dzienną przekraczającą liczbę dni w miesiącu, w którym ją przekazałeś, więc przy pierwszej iteracji próbuje zbudować data,yyyy-01-345
która staje sięyyyy-12-11
lubyyyy-12-10
w latach przestępnych. Po tym terminie nie musimy sprawdzać dat, ponieważ12*11+
otrzymujemy trzycyfrową liczbę.3 bajty zapisane dzięki Arnauldowi .
Sprawdź to
źródło
Python 2 ,
89846858 bajtówWypróbuj online!
źródło
Excel, 83 bajty
Dane wejściowe są w komórce
A1
w formacieyyyy
. Jest to formuła tablicowa i jest wprowadzana za pomocą Ctrl+ Shift+, Enteraby uzyskać nawiasy klamrowe{}
. Jest to dość proste i bez sprytu.W formule tablicowej
DATE(A1,1,0)+ROW(1:366)
daje nam tablicę 366 wartości dat. W latach bez przestępstwa będzie to obejmowało 1 stycznia następnego roku, ale nie stanowi to problemu, ponieważ1*1=1
i byłoby liczone jako fałszywie dodatnie, jeśli następny rok będzie,2001
ale ponieważ wymagany zakres roczny jest2001 - 2099
, nigdy nie powstanie jako kwestia.Jeśli zwędziłeś ten kawałek na prosty
~
, formuła jest o wiele łatwiejsza do naśladowania:Próbowałem użyć
COUNTIF()
zamiast,SUM(IF())
ale Excel nawet nie pozwolił mi wprowadzić go jako formuły tablicowej, a tym bardziej dać mi wynik. I tak znaleźć Arkusze Google rozwiązanie używającCountIf()
ale ten sam sposób poza tym, że okazał się być 91 bajtów, głównie dlatego, że używaArrayFormula()
zamiast po prostu{ }
.źródło
Retina 0.8.2 , 55 bajtów
Wypróbuj online! Trwa dwucyfrowy rok; dodaj 1 bajt, aby obsługiwać 4-cyfrowe lata. Objaśnienie: Pierwszy etap po prostu przekształca się w jednoosobowy. Drugi etap rozpoczyna się od dopasowania od 1 do 12 znaków przed pozycją dopasowania, reprezentującą miesiąc, a następnie próbuje się spodziewać całej liczby powtórzeń tego miesiąca. Jednak lookahead zawiera warunek, który wybiera od 27 do 30 kolejnych powtórzeń w zależności od miesiąca. Liczba pasujących pozycji jest wówczas pożądanym wynikiem.
źródło
R ,
22122 bajtyWypróbuj online!
Zdecydowałem się na podejście oparte na tabeli odnośników. Rok wprowadzenia musi składać się z 2 cyfr.
źródło
if
, ponieważ wejście może być albo 2-cyfrowy lub 4-cyfrowy do wyboru (dzięki czemu można wybrać, aby zaakceptować tylko 2-cyfrowe wejście). Ale wygląda na to, że kod uważa, że każdy miesiąc zawiera 31 dni, więc np. 62 (dla 2062) zwraca 1, gdzie powinien zwrócić 0.C (gcc),
656059 bajtówPort odpowiedzi Java użytkownika user202729 . Wypróbuj online tutaj . Podziękowania dla Jonathana Frecha za grę w golfa 1 bajt.
źródło
a=0,m=13;for(;
~>for(a=0,m=13;
.J , 29 bajtów
Wypróbuj online!
Jak to działa
Próbowałem ciężko dostać 2 razy rozwiązanie Jelly :)
Dygresja
Jeśli ktoś naprawdę chce zakodować 99-cyfrowe dane, oto trochę informacji:
Podziel 99-cyfrową część na 2 cyfry. Następnie pierwsza cyfra to
<4
druga<8
, co oznacza, że pięć bitów może zakodować dwie liczby. Następnie całe dane mogą być kodowane w 250 bitach lub 32 bajtach.źródło
Python 3 , 158
162215241bajtówUsunięto 4 Dzięki Stephen za grę w golfa w warunkach warunkowych.
Usunięto 53 podziękowania dla Stephena za wskazanie białej przestrzeni
Usunięto 26 dzięki linkowi udostępnionemu przez Caira
Jestem w tym całkiem nowy. Nie mogłem wymyślić, jak to zrobić bez opisania dni w miesiącu.
Wypróbuj online!
źródło
(28if Y%4else 29)
można skrócić do[29,28][Y%4>0]
. Można także skrócić długą listę[a,...]+2*[a,b,a,b,a]
.a,b,c
można dodać do listy parametrów, aby zapisać linię.int(str(Y)[2:])
można skrócić doY%100
. Wreszcie, zmienne przeciwne można przeważnie skrócić dolen
s wyrażeń listowych, co pozwala równieżn
na wykonanielambda
. To daje 118 .Naprzód (gforth) ,
6059 bajtówWypróbuj online!
Ta wersja korzysta z faktu, że nie może być więcej niż 1 pasujący dzień na miesiąc, a rok musi być podzielny przez miesiąc, aby się zgadzał.
Wyjaśnienie
Iteruje po miesiącach, sprawdza, czy rok jest podzielny przez miesiąc i czy iloraz wynosi <31 (28 lutego) Miesiące po marcu nie mogą się zgadzać dla dni większych niż 25, więc możemy po prostu założyć wszystkie miesiące (inne niż luty) mają 31 dni na przeznaczenie układanki.
Objaśnienie kodu
[1] - Forth ma pojęcie liczb o podwójnej długości, które są przechowywane na stosie jako dwie liczby o pojedynczej długości (w postaci xy, gdzie wartość podwójnej =
y * 2^(l) + x
gdzie l jest rozmiarem w bitach pojedynczego w czwarta implementacja, nad którą pracujesz).W tym przypadku porównałem iloraz i resztę do 32 (lub 29) 0. Jeśli reszta była większa niż 0 (rok niepodzielny przez miesiąc), pierwsze podwójne byłoby automatycznie większe niż 32 (lub 29) 0, a wynik byłoby fałszywe. Jeśli reszta to 0, oznacza to skuteczne regularne sprawdzanie ilorazu <= 32 (lub 29)
Dalej (gforth) , 61 bajtów
Wypróbuj online!
Zaoszczędzono kilka bajtów, zdając sobie sprawę, że tylko luty ma znaczenie pod względem posiadania prawidłowej liczby dni w miesiącu
Wyjaśnienie
Czwarte (przynajmniej gforth) porównania zwracają -1 dla true i 0 dla false
źródło
Java (JDK 10) ,
797270 bajtówWypróbuj online!
źródło
d
&&
na&
to ta sama odpowiedź, co odpowiedź Javy Oliviera Grégoire'a, chociaż odpowiedział 19 minut wcześniej.JavaScript (Node.js) , 108 bajtów
źródło
Perl 5 , 68 bajtów
Wypróbuj online!
źródło
Python 3, 132 bajty
To naprawdę dość długi program, ale pomyślałem, że może być interesujący.
Wszystkie wartości mieszczą się w zakresie od 0 do 7, więc koduję każdą liczbę 3 bitami w długim ciągu binarnym. Próbowałem wkleić nieprzetworzony ciąg binarny do mojego programu python, ale nie mogłem go uruchomić, więc zdecydowałem się na base64 w pliku.
Użyłem następującego ciągu jako tabeli odnośników (końcówka 7 została użyta do wypełnienia):
01223242434261334151533172234161321260115040331061312042410060032130113060021220420051013051110140127
Program pobiera ten ciąg i dekoduje go jako liczbę, a następnie używa przesunięcia bitowego w celu wyodrębnienia wyniku.
66 bajtów + plik 37 bajtów = 103 bajty
Czyta to plik binarny o nazwie
e
i unika korzystania z base64.Oto zrzut heksowy odczytanego pliku (bez wypełniania):
źródło
Haskell ,
6151 bajtówWypróbuj online!
Zainspirowany odpowiedzią xnor na Python 2 i Laikoni.
źródło
f y=sum[1|i<-[1..12],mod y i<1,div y i<29+mod i 2*3]
Wypróbuj online!Oracle SQL, 115 bajtów
Możemy zauważyć, że tak naprawdę nie ma znaczenia, ile dni w kwietniu (i późniejszych miesiącach), ponieważ 100/4 <28. Również nie trzeba sprawdzać, czy rok jest przestępny, czy nie. Musimy tylko określić, że w lutym jest 28 dni (nie 29, ponieważ ta walidacja zostanie wykonana tylko dla 2058, co nie jest skokiem), w przeciwnym razie może to być tylko 31 na dowolny miesiąc.
Inne podejścia
Oracle SQL (12c wydanie 2 i nowsze), 151 bajtów
Oracle SQL (12c wydanie 2 i nowsze), 137 bajtów
Zarówno rozwiązanie mogło 8 bajtów krótszy, jeśli wymienimy
(select level l from dual connect by level<=12)
sięxmltable('1to 12'columns l int path'.')
jednak Oracle zgłasza wyjątek z powodu błędu (testowane na wersji 12.2.0.1.0, 18.3.0.0.0).Jedynym przypadkiem w obu rozwiązaniach, gdy rok ma znaczenie, jest rok 2058, który nie jest skokowy, dlatego dosłowne „-1” zostało użyte do określenia roku nieskokowego.
Oracle SQL, 128 bajtów
Oracle SQL, 126 bajtów
Aktualizacja
Oracle SQL, 110 bajtów
Oracle SQL, 108 bajtów
Spark SQL, 137 bajtów
Spark 2.3+ SQL, 126 bajtów
(
replace
funkcja staje się dostępna)źródło
PHP , 73 bajty
Korzystanie z wprowadzania potoku i
php -nR
:Wypróbuj online!
PHP , 76 bajtów
Za pomocą wprowadzania arg wiersza poleceń
php dm.php 18
:Wypróbuj online!
Podejście iteracyjne. Ponieważ jedynym rokiem przestępnym jest 2 * 29 = 58, a rok 2058 nie jest rokiem przestępnym, nie trzeba brać pod uwagę roku przestępnego w dniach lutowych. A ponieważ owijanie nie stanowi problemu - od kwietnia każdy dzień większy niż 25 przekroczy 100, po prostu mówimy, że reszta miesięcy ma tylko 25 dni.
Dane wejściowe to 2-cyfrowy rok za pomocą wiersza poleceń (-10 bajtów jako program, dzięki za sugestię z @Titus).
LUB:
PHP , 101 bajtów
Wypróbuj online!
Wciąż iteracyjny, ale przy użyciu funkcji znaczników czasu PHP. Akceptuje rok jako czterocyfrowy numer. Dziękujemy za @Titus za sugestię użycia
strtotime()
zamiastmktime()
.źródło
$m<5?$m-2?31:28:25
pierwszego i$d=strtotime("$y-1")
drugiegoy
ewaluację w cudzysłów?strtotime()
zamiastmktime()
i ponownie zaimplementowano jako program, -7 bajtów. Spojrzałem również na większość zgłoszeń, w tym te, które uzyskały najwyższy głos, będą przyjmować rok jako 2 lub 4 cyfry, więc przyjmę, że to zależy od autora. Jeszcze raz dziękuję za sugestie!PHP,
7470 bajtówakceptuje tylko dwucyfrowe lata.
I przyjął gwaugh's rozważania i grałem je; moje pierwsze podejście było dłuższe niż jego (92 bajty):
%100
pozwala na użycie 4-cyfrowych lat.Uruchom jako potok z
-nR
lub wypróbuj je online .źródło