给定一个月的文本表示形式(不区分大小写的全名或3个字符的缩写),请返回该月的天数。
例如,december
,DEC
,和dec
都应该返回31。
2月可以有28天或29天。
假设输入的是正确格式之一的月份。
december
,DEC
和dec
应全部归还31” -那是用意何在?
给定一个月的文本表示形式(不区分大小写的全名或3个字符的缩写),请返回该月的天数。
例如,december
,DEC
,和dec
都应该返回31。
2月可以有28天或29天。
假设输入的是正确格式之一的月份。
december
,DEC
和dec
应全部归还31” -那是用意何在?
Answers:
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]
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]
FEB
。
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
.substr(0,3)
不是必需的。因此,再三考虑,这可能不是最佳方法。
substr
?slice
!
-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
31
。例如,它似乎可以在Chrome中new Date("feb31")
运行。
+31
总共可以节省三个字节。但是,这些都不在Firefox中起作用。
cal $1|xargs|tail -c3
将输入作为命令行参数,并在输出后加上换行符。2月的天数取决于当年的天数
需要的util-linux 2.29版本cal
,这是TIO上可用的版本。同样取决于语言环境,因此必须更改LC_TIME在非英语系统上(感谢@Dennis进行说明)。
通过管道xargs
来调整cal
输出的想法是从这个SO答案中得出的。
k=>31-((e=k.lower()[1to3])in"eprunov")-3*(e=="eb")
-14个字节,感谢乔纳森·弗雷希(Jonathan Frech)
九月,四月,六月和十一月有三十天。其余的人都吃花生酱。除我祖母外;她有一点红色的三轮车,但我偷了。哈哈哈哈哈哈
(我一直在等待在这个站点上讲那个笑话(来源:我的数学教授):D:D:D)
'sepaprjunnov'
而不是字符串列表。
m=>D.DaysInMonth(1,D.Parse(1+m).Month)
+24 using D=System.DateTime;
-3个字节,感谢GrzegorzPuławski。
using System;
吗?还是可以从字节数中排除这一点?
using D=System.DateTime;
和m=>D.DaysInMonth(1,D.Parse(1+m).Month)
喜欢这里:tio.run/##jc5BSwMxEAXgs/...
x=input().lower()[1:3];print(31-(x in"eprunov")-3*(x=="eb"))
移植我的Proton解决方案
-10字节归功于totalhuman
答案的变体(显示时间的进展,以及每个时间的字节,带有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
在不同数量的月度测试用例中如何处理这些值的证明。
import ...,calendar as c
而不必两次键入“ calendar”,因此进一步向下修订。
($_)=/.(..)/;
代替$_=substr$_,1,2;
和()
周围"eprunov"=~/$_/i
可以被移除。
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字节感谢狮子座
f s|let i#n=n<mod(fromEnum$s!!i)32=sum$29:[2|2#2]++[-1|2#13,1#3]
c<3
而不是保存字节a==6
(2月是第一个月,如果您按字母顺序订购,则紧随其后的是12月)
隐式前缀功能。假设⎕IO
(I ndex O rigin)0
,这在许多系统上都是默认设置。
31 28 30⊃⍨∘⊃'.p|un|no|f'⎕S 1⍠1
⍠1
不区分大小写
1
返回的长度
⎕S
PCRE 小号王永立,地球的
'.p|un|no|f'
任何字符,“ p”或“ un”或“ no”或“ f”
⊃⍨∘⊃
并使用该元素的第一个元素(如果没有则为0)从中选择
31 28 30
这个清单
从而:
Ap r,S ep,J un和No v将选择索引2处的数字,即30
F eb将选择索引1处的数字,即28
其他任何东西都会选择索引0处的数字,即31
*使用经典并计算⍠
为⎕OPT
。
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
#~NextDate~"Month"~DayCount~#&
将给28
或29
根据当前年份是否为 2月 2月。
Mathematica中所有日期的命令将演绎输入这样April
,APR
,ApRiL
,等为相应月份的当前年度的第一天。(作为奖励,输入"February 2016"
或{2016,2}
也可以按预期工作。)
#~NextDate~"Month"
给出之后的月份的第一天,并DayCount
给出两个参数之间的天数。4月1日至5月1日之间的天数为30,即4月的天数。
m->31-new java.util.Date(m+"31 1").getDate()%31
最终使用了与赫尔曼·劳恩斯坦(Herman Lauenstein)的JS答案相同的想法,其中将日期设置为第31天,直到下个月。Java确实需要一年,因此已设置为1
。
解:
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
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
d=DateValue(["1 "&A1&" 1"]):?DateAdd("m",1,d)-d
Saved 5 bytes thanks to Titus
<?=date(t,strtotime("$argn 1"));
Run as pipe with -nF
.' 1'
, it seems to work on TIO without it!
<?=date(t,strtotime($argn));
(run as pipe with -nF
)
.' 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.
'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). :)
s->{for(java.time.Month m:java.time.Month.values())if(m.name().startsWith(s.toUpperCase()))System.out.print(m.length(false));}
false
to a boolean expression like 1<0
to save a couple bytes.
?31-(instr(@aprjunsepnov feb`,;)%3)
Significantly shorter with some trickery.
? 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)
->m{((Date.parse(m)>>1)-1).day}
require'date'
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.
val d={m:String->arrayOf(0,31,30,30,31,30,31,28,31,0,30)[(m[1].toInt()+m[2].toInt())%32%11]}