一个月中有几天?


25

给定一个月的文本表示形式(不区分大小写的全名或3个字符的缩写),请返回该月的天数。

例如,decemberDEC,和dec都应该返回31。

2月可以有28天或29天。

假设输入的是正确格式之一的月份。


19
您可能应该列出我们应该能够接受的月份名称的所有变体。
朱塞佩

1
对于任何可以使用它的人,被降低的前三个字符的ASCII序数和都是唯一的。
完全人类

19
接受解决方案还为时过早。
毛茸茸的

5
我认为如果输入只是固定格式的月份,效果会更好,因为该格式现在基本上需要转换为固定大小写并仅查看前3个字母。
xnor

4
目前的情况是,它看起来像你想要的答案来处理所有的上市形式- “比如decemberDECdec全部归还31” -那是用意何在?
乔纳森·艾伦

Answers:


4

派克(Pyke),9个字节

l4C9@~%R@

在这里尝试!

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]

或15个字节(如果需要所有输入格式)

l43<C9 3L<@~%R@

在这里尝试!

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
这将返回31 FEB
Laikoni '17

2
我相信@ Laikoni的观点是正确的(它也返回31 AprJunSep,和Nov),但也认为它需要澄清一下的OP(见我的问题)。
乔纳森·艾伦,

@JonathanAllan好吧,OP已经接受了这个答案,所以我想它是有效的吗?
暴民埃里克(Erik the Outgolfer)'17年

4
@EriktheOutgolfer我个人不会得出这个结论。
乔纳森·艾伦

我的印象是,它只需要为一种形式的输入工作即可
Blue Blue

33

JavaScript(ES6), 48 47 44 43  42字节

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

演示版

怎么样?

这些操作导致查找表包含8个条目,如果值是随机分布的,这将不是很有趣。但是任何大于2的结果都将映射到31天。因此,仅前3个条目需要显式存储。

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
老实说,如何在地球上你不断疯狂的数学东西d这些惊人的怪异的意见:你有一个程序来发现这些还是你只是对我们其余的人太好
HyperNeutrino

1
@HyperNeutrino我尝试做的第一件事始终是找到基本转换,然后是可选的乘法运算,再进行一个或多个模运算。这样很快就找到了。但是我误解了挑战,并首先认为这.substr(0,3)不是必需的。因此,再三考虑,这可能不是最佳方法。
Arnauld

substrslice
尼尔

我的琐碎方法只增加了<s> 2 </ s> 3个字节,因此它可能不再是最佳选择,但仍然非常令人印象深刻:)
HyperNeutrino

1
有人的编辑删除了该部分,但是我最初不允许它的原因之一是我想看到类似的答案。我喜欢使用库34来避免大写和不同格式的问题。
qw3n

15

Javascript(ES6),36 33字节

-3个字节,感谢@JustinMariner和@Neil

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

抱歉,@ Arnauld,滥用JavaScript怪异性要比您想像的基本转换短。

怎么运行的

由于某些原因,JavaScript允许输入指定月份以外的日期。该代码计算日期是在一个月中的多少天后确定该月中有多少天。例如:
"FEB31"→交通Thu Mar 02 2000→交通31 - 2 % 31→交通29
"October31"→交通Tue Oct 31 2000→交通31 - 31 % 31→交通31

测试用例


MS Excel也会这样做。.1月0始终是最后一天的12月,因此= DAY(“ 00/01/2017”)将导致31
DavChana

看起来Javascript仅允许日期字符串(最多不超过31天)。如果您尝试输入“ feb 32”,它将转换为2032-02-01,并且如果您尝试将其强制为“ 0-feb-32” (或类似的字符串),它只会显示“无效日期”。奇怪的是,如果将日期设置为0(“ 2月0日”),它将转换为2000-02-01,而不是2000-01-31。
TehPers

您可能可以通过在空格之前删除空格来节省一个字节 31。例如,它似乎可以在Chrome中new Date("feb31")运行。
贾斯汀·马里纳

实际上,您可能+31总共可以节省三个字节。但是,这些都不在Firefox中起作用。
尼尔


7

Bash,21个字节

cal $1|xargs|tail -c3

在线尝试!

将输入作为命令行参数,并在输出后加上换行符。2月的天数取决于当年的天数

需要的util-linux 2.29版本cal,这是TIO上可用的版本。同样取决于语言环境,因此必须更改LC_TIME在非英语系统上(感谢@Dennis进行说明)。

通过管道xargs来调整cal输出的想法是从这个SO答案中得出的


2
这不仅仅是猛击。通常它是sh,但在具有cal,tail和xargs的系统上,几乎所有支持路径查找和管道的Shell实现都可能是这样。
kojiro

5

质子 50字节

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

在线尝试!

-14个字节,感谢乔纳森·弗雷希(Jonathan Frech)

九月,四月,六月和十一月有三十天。其余的人都吃花生酱。除我祖母外;她有一点红色的三轮车,但我偷了。哈哈哈哈哈哈

(我一直在等待在这个站点上讲那个笑话(来源:我的数学教授):D:D:D)


@Riker哦,当我开始写这篇文章时,那还不存在:/
HyperNeutrino

1
有一条新规则,您必须检查一个无效的月份并返回0。我希望它被删除
Level River St

1
没关系,我要删除该部分
qw3n

我认为您可以使用单个字符串'sepaprjunnov'而不是字符串列表。
乔纳森·弗雷奇

@JonathanFrech也许; 我会尝试的,谢谢
HyperNeutrino

4

C#(.NET Core)52 + 13 = 65 38 + 24 = 62字节

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

在线尝试!

+24 using D=System.DateTime;

致谢

-3个字节,感谢GrzegorzPuławski。


这项工作没有using System;吗?还是可以从字节数中排除这一点?
马蒂

@Matty这是一个好点;现在添加。
Ayb4btu

晚尖,但-3字节:using D=System.DateTime;m=>D.DaysInMonth(1,D.Parse(1+m).Month)喜欢这里:tio.run/##jc5BSwMxEAXgs/...
格热戈日Puławski




2

蟒3 - 93 86 84 82字节

答案的变体(显示时间的进展,以及每个时间的字节,带有TIO链接):

原始答案(93个字节)

-7个字节感谢Jonathan Frech。(86字节)

由于我自己进一步测试了monthrange结果,因此多了-2个字节,第二个值始终是较高的值。(84字节)1

通过使用-2 import calendar as c和-2来引用它c.monthrange(82字节,当前版本


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

显然不像HyperNeutrino的答案那样好,后者不使用内置函数,但这仍然有效。


脚注

1通过TIO.run进行的测试用例显示了monthrange在不同数量的月度测试用例中如何处理这些值的证明。



@JonathanFrech谢谢。由于我已经测试了更多有关Monthrange的工作原理,并且通过使用import ...,calendar as c而不必两次键入“ calendar”,因此进一步向下修订。
托马斯·沃德,


2

Haskell65 63 62字节

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

在线尝试!

模式匹配方法。第一行是处理不区分大小写的问题。然后,28如果第三个字母小于C(数字3),30第二个字母大于C且第三个字母大于M,则返回31其他则返回。

编辑:-1字节感谢狮子座


替代(65 64字节)

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

在线尝试!


1
聪明的一个!您可以通过选中c<3而不是保存字节a==6(2月是第一个月,如果您按字母顺序订购,则紧随其后的是12月)
Leo

2

APL(Dyalog),32字节*

隐式前缀功能。假设⎕IOI ndex O rigin)0,这在许多系统上都是默认设置。

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

在线尝试!

⍠1 不区分大小写

1 返回的长度

⎕S PCRE 小号王永立,地球的

'.p|un|no|f' 任何字符,“ p”或“ un”或“ no”或“ f”

⊃⍨∘⊃ 并使用该元素的第一个元素(如果没有则为0)从中选择

31 28 30 这个清单

从而:

  • Ap r,S ep,J unNo v将选择索引2处的数字,即30

  • F eb将选择索引1处的数字,即28

  • 其他任何东西都会选择索引0处的数字,即31


*使用经典并计算⎕OPT


2

Mediawiki模板,19字节

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

1

MATL,22字节

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

在线尝试!

说明

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语言(Mathematica)46 30字节

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

在线尝试!

将给2829根据当前年份是否为 2月 2月。

怎么运行的

Mathematica中所有日期的命令将演绎输入这样AprilAPRApRiL,等为相应月份的当前年度的第一天。(作为奖励,输入"February 2016"{2016,2}也可以按预期工作。)

#~NextDate~"Month"给出之后的月份的第一天,并DayCount给出两个参数之间的天数。4月1日至5月1日之间的天数为30,即4月的天数。




1

q / kdb +,36个字节

解:

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

例子:

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

说明:

有上百万种猫皮的方法。我认为与其他人略有不同。取输入的第二个和第三个字母,将它们小写,然后在字符串中查找它们"ebeprunov"。如果它们位于位置0,则为2月;如果它们位于> 0,则为30天;如果不在字符串中,则为31天。

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字节

Anonymous VBE immediate window function that takes input, as month name, abbreviation, or number, from range [A1] and outputs the length of that month in the year 2001 to the VBE immediate window function.

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

Old Version

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

1

PHP, 38 33+1 32+1 bytes

Saved 5 bytes thanks to Titus

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

Run as pipe with -nF

Try it online!


1
Hey, I don't think you need .' 1', it seems to work on TIO without it!
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.


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.