Có bao nhiêu ngày trong một tháng?


25

Đưa ra một đại diện bằng văn bản (tên đầy đủ không phân biệt chữ hoa chữ thường hoặc viết tắt 3 ký tự) của một tháng trả về số ngày trong tháng.

Ví dụ, december, DEC, và decnên tất cả trở lại 31.

Tháng hai có thể có 28 hoặc 29 ngày.

Giả sử đầu vào là một tháng trong một trong các hình thức chính xác.


19
Bạn có thể nên liệt kê tất cả các biến thể của tên tháng mà chúng ta có thể chấp nhận.
Giuseppe

1
Đối với bất kỳ ai có thể sử dụng nó, tổng số thứ tự ASCII của 3 ký tự đầu tiên được hạ xuống là duy nhất.
hoàn toàn là

19
Đó là rất xa, quá sớm để chấp nhận một giải pháp.
Xù xì

5
Tôi nghĩ rằng điều này sẽ đẹp hơn nếu đầu vào chỉ là tháng ở định dạng cố định, vì định dạng về cơ bản bây giờ yêu cầu chuyển đổi sang trường hợp cố định và chỉ nhìn vào 3 chữ cái đầu tiên.
xnor

4
Khi đứng có vẻ như bạn muốn câu trả lời cho xử lý tất cả các hình thức niêm yết - "Ví dụ, december, DEC, và decnên tất cả trở lại 31" - Đó có phải là ý định?
Jonathan Allan

Câu trả lời:


4

Pyke , 9 byte

l4C9@~%R@

Hãy thử nó ở đây!

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]

Hoặc 15 byte nếu tất cả các định dạng đầu vào là bắt buộc

l43<C9 3L<@~%R@

Hãy thử nó ở đây!

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
Điều này trả về 31 cho FEB.
Laikoni

2
Tôi tin rằng @ điểm Laikoni là hợp lệ (nó cũng trả về 31 cho Apr, Jun, Sep, và Nov) nhưng cũng nghĩ rằng nó đòi hỏi một chút rõ trong OP (xem tôi câu hỏi ).
Jonathan Allan

@Jonathan ALLan Vâng, OP đã chấp nhận câu trả lời này, vì vậy tôi đoán nó hợp lệ?
Erik the Outgolfer

4
@EriktheOutgolfer Tôi sẽ không đi đến kết luận đó.
Jonathan Allan

Tôi có ấn tượng rằng nó chỉ cần hoạt động cho một dạng đầu vào
Blue

33

JavaScript (ES6),  48 47 44 43  42 byte

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

Bản giới thiệu

Làm sao?

Các hoạt động này dẫn đến một bảng tra cứu gồm 8 mục, sẽ không thú vị lắm nếu các giá trị được phân phối ngẫu nhiên. Nhưng bất kỳ kết quả nào lớn hơn 2 được ánh xạ tới 31 ngày. Do đó, chỉ có 3 mục đầu tiên cần được lưu trữ rõ ràng.

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
Thành thật mà nói, làm thế nào để bạn tiếp tục thực hiện những bài nộp kỳ lạ tuyệt vời này bằng những thứ toán học điên rồ D: bạn có chương trình để tìm những thứ này không hay bạn quá tốt cho phần còn lại của chúng tôi
HyperNeutrino

1
@HyperNeutrino Điều đầu tiên tôi thử là luôn tìm một chuyển đổi cơ sở, theo sau là một phép nhân tùy chọn theo sau là một hoặc một vài thao tác modulo. Điều này đã được tìm thấy một cách nhanh chóng theo cách đó. Nhưng tôi đã đọc sai thử thách và đầu tiên nghĩ rằng điều này .substr(0,3)là không bắt buộc. Vì vậy, trên suy nghĩ thứ hai, đây có thể không phải là cách tiếp cận tốt nhất.
Arnauld

substr? slice!
Neil

Cách tiếp cận tầm thường của tôi chỉ dài hơn <s> 2 </ s> 3 byte nên có thể không còn tối ưu nữa vì điều đó, nhưng vẫn rất ấn tượng :)
HyperNeutrino

1
Chỉnh sửa của ai đó đã loại bỏ phần đó, nhưng một trong những lý do ban đầu tôi không cho phép đó là tôi muốn xem câu trả lời như thế này. Tôi thích việc sử dụng cơ sở 34 để vượt qua vấn đề viết hoa và các định dạng khác nhau.
qw3n

15

Javascript (ES6), 36 33 byte

-3 byte nhờ @JustinMariner và @Neil

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

Xin lỗi @Arnauld, lạm dụng tính lạ của JavaScript ngắn hơn chuyển đổi cơ sở ưa thích của bạn.

Làm thế nào nó hoạt động

Vì một số lý do, JavaScript cho phép nhập ngày ngoài tháng được chỉ định. Mã này đếm xem có bao nhiêu ngày ngoài tháng để xác định có bao nhiêu ngày trong tháng. Ví dụ:
"FEB31"Thu Mar 02 200031 - 2 % 3129
"October31"Tue Oct 31 200031 - 31 % 3131

Các trường hợp thử nghiệm


MS Excel cũng thực hiện việc này .. 0 tháng 1 luôn luôn là tháng 12 Ngày cuối cùng, vì vậy = NGÀY ("00ÀI") sẽ có kết quả vào ngày 31
DavChana

Có vẻ như Javascript chỉ cho phép các chuỗi ngày trong đó ngày lên tới 31. Nếu bạn cố gắng nhập "feb 32", nó sẽ dịch thành 2032-02-01 và nếu bạn cố ép nó bằng "0-feb-32" (hoặc một chuỗi tương tự), nó chỉ nói "Ngày không hợp lệ". Thật kỳ lạ, nếu bạn đặt ngày thành 0 ("feb 0"), nó sẽ chuyển thành 2000 / 02-01 thay vì 2000-01-31.
TehPers

Bạn có thể lưu một byte bằng cách bỏ khoảng trống trước đó 31. Nó dường như hoạt động trong Chrome new Date("feb31")chẳng hạn.
Justin Mariner

Trong thực tế, bạn có thể sử dụng +31tiết kiệm ba byte tổng thể. Không ai trong số này hoạt động trong Firefox.
Neil


7

Bash , 21 byte

cal $1|xargs|tail -c3

Hãy thử trực tuyến!

Lấy đầu vào làm đối số dòng lệnh và đầu ra với một dòng mới. Số ngày trong tháng 2 phụ thuộc vào năm hiện tại

Yêu cầu 2,29 util-linux phiên bản cal, đó là một trong có sẵn trên TIO . Cũng phụ thuộc vào địa phương, do đó LC_TIME phải được thay đổi trên các hệ thống không phải tiếng Anh (cảm ơn @Dennis đã làm rõ).

Ý tưởng về đường ống xuyên qua xargsđể cắt calđầu ra là từ câu trả lời SO này .


2
Đây không chỉ là bash. Nói chung là sh, nhưng có lẽ hầu như mọi triển khai hệ vỏ hỗ trợ tra cứu đường dẫn và đường ống, trên một hệ thống có cal, đuôi và xargs.
kojiro

5

Proton , 50 byte

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

Hãy thử trực tuyến!

-14 byte nhờ Jonathan Frech

Ba mươi ngày có tháng chín, tháng tư, tháng sáu và tháng mười một. Tất cả những người còn lại có bơ đậu phộng. Tất cả ngoại trừ bà tôi; Cô ấy có một chút màu đỏ, nhưng tôi đã đánh cắp nó. muahahahahaha

(Tôi đã chờ đợi để kể câu chuyện đùa đó (nguồn: giáo sư toán học của tôi) từ lâu trên trang web này: D: D: D)


@Riker oh whoops đã không ở đó khi tôi bắt đầu viết bài này: /
HyperNeutrino

1
Có một quy tắc mới mà bạn phải kiểm tra không phải là tháng hợp lệ và trả về 0. Tôi hy vọng nó sẽ bị xóa
Level River St

1
Không bao giờ thay đổi Tôi đang xóa phần đó
qw3n

Tôi nghĩ bạn có thể sử dụng một chuỗi 'sepaprjunnov'thay vì danh sách các chuỗi.
Jonathan Frech

@JonathanFrech có thể; Tôi sẽ thử điều đó, cảm ơn
HyperNeutrino

4

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

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

Hãy thử trực tuyến!

+24 cho using D=System.DateTime;

Lời cảm ơn

-3 byte nhờ Grzegorz Puławski.


Cái này có hoạt động không using System;? Hoặc bạn có thể cảm thán điều đó từ số byte?
Matty

@Matty Đó là một điểm tốt; bây giờ được thêm vào.
Ayb4btu

Cuối tip, nhưng -3 byte: using D=System.DateTime;m=>D.DaysInMonth(1,D.Parse(1+m).Month)như ở đây: tio.run/##jc5BSwMxEAXgs/...
Grzegorz Puławski




2

Python 3 - 93 86 84 82 byte

Các biến thể của câu trả lời (hiển thị sự tiến triển của thời gian và byte cho mỗi, với các liên kết TIO):

Câu trả lời gốc (93 byte)

-7 byte nhờ Jonathan Frech. (86 byte)

Thêm 2 byte nhờ vào việc kiểm tra thêm monthrangekết quả của riêng tôi , với giá trị thứ hai luôn là giá trị cao hơn. (84 byte) 1

-2 nhiều hơn bằng cách sử dụng import calendar as cvà tham khảo nó với c.monthrange. (82 byte, sửa đổi hiện tại )


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

Rõ ràng là không hay như câu trả lời của HyperNeutrino không sử dụng tích hợp sẵn, nhưng điều này vẫn hoạt động.


Chú thích

1 : Các trường hợp thử nghiệm thông qua TIO.run cho thấy bằng chứng về cách tôi xử lý các monthrangegiá trị đó, cho một số trường hợp thử nghiệm tháng khác nhau.



@JonathanFrech Cảm ơn. Sửa đổi thêm xuống bằng cách tôi đã kiểm tra nhiều hơn về cách thức hoạt động của tháng, và cũng bằng cách sử dụng import ...,calendar as cđể không phải nhập "lịch" hai lần.
Thomas phường


2

Haskell , 65 63 62 byte

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

Hãy thử trực tuyến!

Cách tiếp cận khớp mẫu. Dòng đầu tiên là để xử lý trường hợp không nhạy cảm. Sau đó, chúng tôi trả về 28nếu chữ cái thứ ba nhỏ hơn C (số 3), 30nếu chữ cái thứ hai lớn hơn C và chữ cái thứ ba lớn hơn M, hoặc 31nếu không.

Chỉnh sửa: -1 byte nhờ Leo


Thay thế ( 65 64 byte)

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

Hãy thử trực tuyến!


1
Khéo một cái! Bạn có thể lưu một byte bằng cách kiểm tra c<3thay vì a==6(Tháng hai là tháng đầu tiên nếu bạn đặt hàng chúng bằng chữ cái thứ ba của họ, tiếp theo là tháng 12)
Leo

2

APL (Dyalog) , 32 byte *

Hàm tiền tố ngầm. Giả sử ⎕IO( I ndex O rigin) 0, được mặc định trên nhiều hệ thống.

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

Hãy thử trực tuyến!

⍠1 trường hợp vô cảm

1 trả lại chiều dài của

⎕S PCRE S đang tìm kiếm

'.p|un|no|f' any-char, "p" hoặc "un" hoặc "no" hoặc "f"

⊃⍨∘⊃ và sử dụng phần tử đầu tiên của số đó (0 nếu không có) để chọn từ

31 28 30 danh sách này

Như vậy:

  • Ap r, S ep , J unNo v sẽ chọn số ở chỉ số 2, cụ thể là 30

  • F eb sẽ chọn số tại chỉ số 1, cụ thể là 28

  • bất cứ điều gì khác sẽ chọn số tại chỉ số 0, cụ thể là 31


* Sử dụng Cổ điển và tính ⎕OPT.


2

Mẫu Mediawiki, 19 byte

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

1

MATL , 22 byte

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

Hãy thử trực tuyến!

Giải trình

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

Ngôn ngữ Wolfram (Mathicala) , 46 30 byte

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

Hãy thử trực tuyến!

Sẽ cung cấp cho 28hoặc 29cho tháng hai tùy thuộc vào năm hiện tại là năm nhuận.

Làm thế nào nó hoạt động

Tất cả các lệnh ngày trong Mathematica sẽ giải thích đầu vào như vậy April, APR, ApRiL, và như vậy là ngày đầu tiên của tháng tương ứng trong năm nay. (Như một phần thưởng, đầu vào như "February 2016"hoặc {2016,2}cũng hoạt động như mong đợi.)

#~NextDate~"Month"đưa ra ngày đầu tiên của tháng sau đó và DayCountđưa ra số ngày giữa hai đối số của nó. Số ngày trong khoảng từ ngày 1 tháng 4 đến ngày 1 tháng 5 là 30, số ngày trong tháng tư.




1

q / kdb +, 36 byte

Dung dịch:

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

Ví dụ:

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

Giải trình:

Có một triệu cách để lột da một con mèo. Tôi nghĩ là hơi khác với những người khác. Lấy chữ cái thứ 2 và thứ 3 của đầu vào, viết thường chúng, sau đó tra chúng trong chuỗi "ebeprunov". Nếu họ ở vị trí 0, thì đây là tháng hai, nếu họ ở vị trí> 0 thì họ là một người 30 ngày, nếu họ không ở trong chuỗi, họ là một người 31 ngày.

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

VBA Excel, 47 43 byte

Hàm cửa sổ tức thời VBE ẩn danh nhận đầu vào, như tên tháng, chữ viết tắt hoặc số, từ phạm vi [A1]và xuất độ dài của tháng đó trong năm 2001 sang chức năng cửa sổ ngay lập tức VBE.

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

Phiên bản cũ

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

1

PHP, 38 33 + 1 32 + 1 byte

Đã lưu 5 byte nhờ Titus

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

Chạy như ống với -nF

Hãy thử trực tuyến!


1
Hey, tôi không nghĩ rằng bạn cần .' 1', nó dường như hoạt động trên TIO mà không có nó!
Dom Hastings

1
28 + 1 byte: <?=date(t,strtotime($argn));(chạy như đường ống với -nF)
Titus

3
@DomHastings - vì vậy, trước khi tôi đăng bài, tôi đã thử nghiệm xem nó có hoạt động mà không có .' 1', nhưng nó không hoạt động. Sau khi xem bình luận của bạn, tôi đã cố gắng tìm ra những gì tôi đã làm sai. Bởi vì tôi đã chạy nó vào ngày 31 của tháng, nên tôi đã lấy ngày thứ 31 (hiện tại) cho bất kỳ tháng nào tôi đặt, sẽ đưa nó vượt quá tháng hiện tại. Ngày 31 tháng 2 biến thành ngày 3 tháng 3, vì vậy mã trả về 31 (số ngày trong tháng 3). Bởi vì điều này, mỗi tháng đã trở lại 31. Vì vậy, nó hoạt động mà không cần .' 1'vào bất kỳ ngày nào <= 28 của tháng.
Jo.

Ahhh, tôi quên mất làm thế nào PHP điền vào chỗ trống! Cảm ơn vì đã giải thích!
Dom Hastings

@Titus Cảm ơn bạn. Tôi là một người mới chơi golf! Tôi không biết tại sao tôi không nhận ra 't'-> t. Ngoài ra, tôi đã phải thực hiện một loạt các tìm kiếm để tìm ra cách "chạy như ống với -nF" nhưng tôi đã hiểu ra (tôi nghĩ). :)
Jo.


0

QBIC , 49 35 byte

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

Ngắn hơn đáng kể với một số mánh khóe.

Giải trình

?                          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 byte

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

Hãy thử trực tuyến!

Ruby's tự Date.parsechấp nhận tên tháng. Những gì thường sẽ là một sự thay đổi bên phải ( >>) thực sự thêm vào tháng của Dateđối tượng. Phép trừ ảnh hưởng đến ngày của tháng, sẽ quay ngược về ngày cuối cùng của tháng trước.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.