Ile dni w miesiącu?


25

Podana reprezentacja tekstowa (pełna nazwa bez rozróżniania wielkości liter lub skrót 3 znaków) miesiąca zwraca liczbę dni w miesiącu.

Na przykład december, DECi decpowinno wszystko wrócić 31.

Luty może mieć 28 lub 29 dni.

Załóżmy, że dane wejściowe to miesiąc w jednej z poprawnych formularzy.


19
Prawdopodobnie powinieneś wymienić wszystkie odmiany nazw miesięcy, które powinniśmy być w stanie zaakceptować.
Giuseppe,

1
Dla każdego, kto może go użyć, sumy porządkowe ASCII pierwszych 3 znaków obniżonych są unikalne.
całkowicie ludzki,

19
To było zdecydowanie za wcześnie, aby zaakceptować rozwiązanie.
Kudłaty

5
myślę, że byłoby ładniej, gdyby dane wejściowe były tylko miesiącem w ustalonym formacie, ponieważ format ten wymaga w zasadzie konwersji do stałej wielkości liter i patrzenia tylko na pierwsze 3 litery.
xnor

4
W obecnej formie wygląda jak chcesz odpowiedzi obsłużyć wszystkich wymienionych formach - „Na przykład december, DECi decpowinno wszystko zwrot 31” - to, że zamiarem?
Jonathan Allan

Odpowiedzi:


4

Pyke , 9 bajtów

l4C9@~%R@

Wypróbuj tutaj!

l4        -   input.title()
    @     -  v.index(^)
  C9      -   ['PADDING', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
        @ - v[^]
     ~%R  -  ['Padding', 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

Lub 15 bajtów, jeśli wszystkie formaty wejściowe są wymagane

l43<C9 3L<@~%R@

Wypróbuj tutaj!

l43<            -   input.title()[:3]
          @     -  v.index(^)
    C9 3L<      -   ['PAD', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
              @ - v[^]
           ~%R  -  ['Padding', 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

6
Zwraca 31 dla FEB.
Laikoni

2
Wierzę @ punkt Laikoni jest ważna (również zwraca 31. Apr, Jun, Sep, i Nov), ale też myślę, że to wymaga trochę wyjaśnień w PO (patrz moje pytanie ).
Jonathan Allan

@JonathanAllan Cóż, OP zaakceptował tę odpowiedź, więc myślę, że jest poprawna?
Erik the Outgolfer

4
@EriktheOutgolfer Nie doszedłbym do tego wniosku osobiście.
Jonathan Allan

Miałem wrażenie, że wystarczyło pracować tylko dla jednego rodzaju danych wejściowych
Blue

33

JavaScript (ES6),  48 47 44 43  42 bajty

m=>31^'311'[parseInt(m[1]+m[2],34)*3%49%8]

Próbny

W jaki sposób?

Operacje te prowadzą do tabeli przeglądowej zawierającej 8 wpisów, co nie byłoby bardzo interesujące, gdyby wartości były losowo rozmieszczone. Ale każdy wynik większy niż 2 jest odwzorowany na 31 dni. Dlatego tylko 3 pierwsze wpisy muszą być przechowywane jawnie.

Month | [1:2] | Base 34 -> dec. | * 3  | % 49 | % 8 | Days
------+-------+-----------------+------+------+-----+-----
  JAN |    AN |             363 | 1089 |   11 |   3 |  31
  FEB |    EB |             487 | 1461 |   40 |   0 |  28
  MAR |    AR |             367 | 1101 |   23 |   7 |  31
  APR |    PR |             877 | 2631 |   34 |   2 |  30
  MAY |    AY |              10 |   30 |   30 |   6 |  31
  JUN |    UN |            1043 | 3129 |   42 |   2 |  30
  JUL |    UL |            1041 | 3123 |   36 |   4 |  31
  AUG |    UG |            1036 | 3108 |   21 |   5 |  31
  SEP |    EP |             501 | 1503 |   33 |   1 |  30
  OCT |    CT |             437 | 1311 |   37 |   5 |  31
  NOV |    OV |             847 | 2541 |   42 |   2 |  30
  DEC |    EC |             488 | 1464 |   43 |   3 |  31

14
szczerze mówiąc, jak, u licha, ciągle robisz te niesamowite dziwne prace z szalonymi matematykami D: czy masz program, aby je znaleźć, czy też jesteś po prostu zbyt dobry dla reszty z nas
HyperNeutrino

1
@HyperNeutrino Pierwszą rzeczą, której próbuję, jest zawsze znalezienie konwersji podstawowej, a następnie opcjonalne pomnożenie, po którym następuje jedna lub kilka operacji modulo. Ten został szybko znaleziony. Ale źle odczytałem wyzwanie i najpierw pomyślałem, że .substr(0,3)nie jest to wymagane. Tak więc, po namyśle, może to nie być najlepsze podejście.
Arnauld

substr? slice!
Neil

Moje trywialne podejście jest tylko <s> 2 </s> 3 bajty dłuższe, więc może nie być już optymalne z tego powodu, ale wciąż bardzo imponujące :)
HyperNeutrino

1
Ktoś zmodyfikował tę część, ale jednym z powodów, dla których pierwotnie ją nie wyraziłem, jest to, że chciałem zobaczyć takie odpowiedzi. Uwielbiam use base 34 do omijania kwestii wielkich liter i różnych formatów.
qw3n

15

JavaScript (ES6), 36 33 bajtów

-3 bajty dzięki @JustinMariner i @Neil

m=>31-new Date(m+31).getDate()%31

Przepraszamy @Arnauld, nadużywanie dziwactwa JavaScript jest krótsze niż twoje fantazyjne konwersje podstawowe.

Jak to działa

Z jakiegoś powodu JavaScript umożliwia wprowadzanie dat poza określonym miesiącem. Kod zlicza, ile dni poza miesiącem jest data, aby określić liczbę dni w miesiącu. Przykłady:
"FEB31"Thu Mar 02 200031 - 2 % 3129
"October31"Tue Oct 31 200031 - 31 % 3131

Przypadki testowe


MS Excel również to robi. 0 stycznia to zawsze ostatni dzień grudnia, więc = DZIEŃ („00/01/2017”) spowoduje 31
DavChana

Wygląda na to, że JavaScript zezwala tylko na ciągi dat, dla których dzień ma długość do 31. Jeśli spróbujesz wpisać „feb 32”, to zostanie przetłumaczone na 2032-02-01 i jeśli spróbujesz wymusić to z „0-feb-32” (lub podobny ciąg), po prostu mówi „Nieprawidłowa data”. O dziwo, jeśli ustawisz dzień na 0 („0 lutego”), to znaczy, że jest to 2000-02-01 zamiast 2000-01-31.
TehPers

Możesz być w stanie zapisać bajt, upuszczając wcześniej miejsce 31. Wygląda na to, że działa new Date("feb31")na przykład w Chrome .
Justin Mariner

W rzeczywistości prawdopodobnie można by +31zaoszczędzić trzy bajty. Jednak to wszystko nie działa w przeglądarce Firefox.
Neil


7

Bash , 21 bajtów

cal $1|xargs|tail -c3

Wypróbuj online!

Pobiera dane wejściowe jako argument wiersza polecenia i wyświetla końcowy znak nowej linii. Liczba dni w lutym zależy od bieżącego roku

Wymaga util-linux 2,29 wersję cal, która jest jednym dostępny na TIO . Jest również zależny od ustawień regionalnych, więc LC_TIME musi zostać zmieniony w systemach nieanglojęzycznych (dziękuję @Dennis za wyjaśnienie).

Pomysł przepuszczenia xargsdo calwyjścia trymowania pochodzi z tej SO odpowiedzi .


2
To nie tylko bzdura. Generalnie jest to sh, ale prawdopodobnie prawie każda implementacja powłoki obsługuje wyszukiwanie ścieżek i potoki w systemie z cal, tail i xargs.
kojiro

5

Proton , 50 bajtów

k=>31-((e=k.lower()[1to3])in"eprunov")-3*(e=="eb")

Wypróbuj online!

-14 bajtów dzięki Jonathanowi Frechowi

Trzydzieści dni to wrzesień, kwiecień, czerwiec i listopad. Cała reszta miała masło orzechowe. Wszyscy oprócz mojej babci; miała mały czerwony trike, ale ja go ukradłem. muahahahahaha

(Czekałem, aby powiedzieć ten żart (źródło: mój profesor matematyki) od wieków na tej stronie: D: D: D)


@Riker, och, nie było tam, kiedy zacząłem pisać: /
HyperNeutrino,

1
Jest nowa zasada, że ​​musisz sprawdzić, czy nie jest prawidłowy miesiąc i zwrócić 0. Mam nadzieję, że zostanie usunięty
Level River St

1
Bez względu na zmiany
Usuwam

Myślę, że możesz użyć pojedynczego ciągu 'sepaprjunnov'zamiast listy ciągów.
Jonathan Frech

@JonathanFrech może; Spróbuję tego, dzięki
HyperNeutrino

4

C # (.NET Core) , 52 + 13 = 65 38 + 24 = 62 bajty

m=>D.DaysInMonth(1,D.Parse(1+m).Month)

Wypróbuj online!

+24 dla using D=System.DateTime;

Podziękowanie

-3 bajty dzięki Grzegorzowi Puławskiemu.


Czy to działa bez using System;? Czy możesz to wytłumaczyć z liczby bajtów?
Matty,

@Matty To dobra uwaga; teraz dodane.
Ayb4btu

Późna wskazówka, ale -3 bajty: using D=System.DateTime;i m=>D.DaysInMonth(1,D.Parse(1+m).Month)jak tutaj: tio.run/##jc5BSwMxEAXgs/…
Grzegorz Puławski




2

Python 3 - 93 86 84 82 bajtów

Warianty odpowiedzi (pokazujące przebieg czasu i bajty dla każdego z linkami TIO):

Oryginalna odpowiedź (93 bajty)

-7 bajtów dzięki Jonathanowi Frechowi. (86 bajtów)

-2 więcej bajtów dzięki własnemu dalszemu testowaniu monthrangewyników, przy czym druga wartość jest zawsze wartością wyższą. (84 bajtów) 1

-2 więcej, używając import calendar as ci odwołując się do niego c.monthrange. (82 bajty, aktualna wersja )


lambda x:c.monthrange(1,time.strptime(x[:3],'%b')[1])[1];import time,calendar as c

Oczywiście nie tak miła, jak odpowiedź HyperNeutrino, która nie używa wbudowanych, ale i tak działa.


Przypisy

1 : Przypadki testowe za pośrednictwem TIO.run, pokazujące dowód na to, jak radzę sobie z tymi monthrangewartościami, dla różnej liczby miesięcznych przypadków testowych.



@JonathanFrech Thanks. Dalsza korekta w dół, ponieważ przetestowałem więcej, jak działa zakres miesięczny, a także wykorzystując import ...,calendar as cto, że nie muszę dwukrotnie wpisywać „kalendarz”.
Thomas Ward


2

Haskell , 65 63 62 bajtów

f.map((`mod`32).fromEnum)
f(_:b:c:_)|c<3=28|c>13,b>3=30
f _=31

Wypróbuj online!

Podejście do dopasowywania wzorców. Pierwszy wiersz dotyczy obsługi bez rozróżniania wielkości liter. Następnie zwracamy, 28jeśli trzecia litera jest mniejsza niż C (cyfra 3), 30jeśli druga litera jest większa niż C, a trzecia większa niż M, lub w 31inny sposób.

Edycja: -1 bajt dzięki Leo


Alternatywa ( 65 64 bajtów)

f s|let i#n=n<mod(fromEnum$s!!i)32=sum$29:[2|2#2]++[-1|2#13,1#3]

Wypróbuj online!


1
Sprytny! Możesz zapisać bajt, zaznaczając c<3zamiast a==6(luty jest pierwszym miesiącem, jeśli zamówisz je za pomocą trzeciego listu, a następnie w grudniu)
Leo

2

APL (Dyalog) , 32 bajty *

Funkcja ukrytego przedrostka. Zakłada ⎕IO( I ndex O rigin) 0, co jest domyślne w wielu systemach.

31 28 30⊃⍨∘⊃'.p|un|no|f'S 11

Wypróbuj online!

⍠1 wielkość liter nie ma znaczenia

1 zwraca długość

⎕S PCRE S. earch dla

'.p|un|no|f' any-char, „p” lub „un” lub „no” lub „f”

⊃⍨∘⊃ i użyj pierwszego tego elementu (0, jeśli nie ma), aby wybrać

31 28 30 ta lista

A zatem:

  • Apr , S ep , J un i No v wybiorą liczbę o indeksie 2, a mianowicie 30

  • F eb wybierze liczbę o indeksie 1, a mianowicie 28

  • wszystko inne wybierze liczbę o indeksie 0, a mianowicie 31


* Używanie klasycznego i liczenie jako ⎕OPT.


2

Szablon Mediawiki, 19 bajtów

{{#time:t|{{{1}}}}}

1

MATL , 22 bajty

14L22Y2c3:Z)Z{kj3:)km)

Wypróbuj online!

Wyjaśnienie

14L    % Push numeric array of month lengths: [31 28 ... 31]
22Y2   % Push cell array of strings with month names: {'January', ..., 'December'}
c      % Convert to 2D char array, right-padding with spaces
3:Z)   % Keep first 3 columns
Z{     % Split into cell array of strings, one each row
k      % Convert to lower case
j      % Input string
3:)    % Keep first 3 characcters
k      % Convert to lower case
m      % Ismember: gives a logical index with one match
)      % Use that as index into array of month lengths. Implicit display

1

Wolfram Language (Mathematica) , 46 30 bajtów

#~NextDate~"Month"~DayCount~#&

Wypróbuj online!

Da albo 28czy 29w lutym w zależności od tego, czy obecny rok jest rokiem przestępnym.

Jak to działa

Wszystkie polecenia data w Mathematica zinterpretuje takie wejście April, APR, ApRiL, i tak dalej, jak pierwszego dnia miesiąca odpowiadającego w bieżącym roku. (Jako bonus wprowadź dane takie jak "February 2016"lub{2016,2} działa również zgodnie z oczekiwaniami.)

#~NextDate~"Month"podaje pierwszy dzień następnego miesiąca i DayCountpodaje liczbę dni między dwoma argumentami. Liczba dni między 1 kwietnia a 1 maja wynosi 30, liczba dni w kwietniu.




1

q / kdb +, 36 bajtów

Rozwiązanie:

28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#

Przykłady:

q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"January"
31
q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"FEB"
28
q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"jun"
30

Wyjaśnienie:

Istnieje milion sposobów na skórowanie kota. Myślę, że różni się nieco od innych. Weź drugą i trzecią literę wpisu, małe litery, a następnie odszukaj je w ciągu "ebeprunov". Jeśli są w lokalizacji 0, to jest luty, jeśli są w lokalizacji> 0, są 30-dniowi, jeśli nie są w ciągu, są 31-dniowi.

28 30 31@2^1&first"ebeprunov"ss lower 1_3# / ungolfed solution
                                        3# / take first 3 items from list, January => Jan
                                      1_   / drop the first item from the list, Jan => an
                                lower      / lower-case, an => an
                  "ebeprunov"ss            / string-search in "ebeprunov", an => ,0N (enlisted null)
             first                         / take the first, ,0N => 0N
           1&                              / take max (&) with 1, 0N => 0N
         2^                                / fill nulls with 2, 0N => 2
        @                                  / index into
28 30 31                                   / list 28,30,31

1

Excel VBA, 47 43 bajtów

Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane wejściowe, takie jak nazwa miesiąca, skrót lub numer, z zakresu [A1]i podaje długość tego miesiąca w roku 2001 do funkcji bezpośredniego okna VBE.

?31-Day(DateValue("1 "&[A1]&" 1")+30)Mod 31

Stara wersja

d=DateValue(["1 "&A1&" 1"]):?DateAdd("m",1,d)-d

1

PHP, 38 33 + 1 32 + 1 bajtów

Zaoszczędzono 5 bajtów dzięki Tytusowi

<?=date(t,strtotime("$argn 1"));

Uruchom jako potok z -nF

Wypróbuj online!


1
Hej, nie sądzę, że potrzebujesz .' 1', wydaje się, że bez TIO działa na TIO!
Dom Hastings,

1
28+1 bytes: <?=date(t,strtotime($argn)); (run as pipe with -nF)
Titus

3
@DomHastings - so, before I posted, I had tested to see if it would work without the .' 1', but it wasn't working. After seeing your comment, I tried to figure out what I had done wrong. Because I was running it on the 31st of the month, it was taking the 31st (current) day for any month I put in, which would put it beyond the current month. Feb 31st turns into March 3rd, so the code returns 31 (the number of days in March). Because of this, every month was returning 31. So, it works without the .' 1' on any day <= 28th of the month.
Jo.

Ahhh, I forget about how PHP fills in the blanks! Thanks for explaining!
Dom Hastings

@Titus Thank you. I'm such a golf newbie! I don't know why I didn't realize the 't' -> t. Also, I had to do a bunch of searching to figure out how to "run as pipe with -nF" but I got it figured out (I think). :)
Jo.


0

QBIC, 49 35 bytes

?31-(instr(@aprjunsepnov feb`,;)%3)

Significantly shorter with some trickery.

Explanation

?                          PRINT
31-(                       31 minus
  instr(                   the position of
                      ,;   our input string
    @aprjunsepnov feb`  )  in the string cntaining all non-31 months                                
    %3)                    modulo 3 (this yields a 1 for each month except feb=2)


0

Ruby, 45 bytes

->m{((Date.parse(m)>>1)-1).day}
require'date'

Try it online!

Ruby's Date.parse accepts a month name on its own. What would normally be a right-shift (>>) actually adds to the month of the Date object. Subtraction affects the day of the month, which will wrap backwards to the last day of the previous month.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.