计算一年中的天数


13

似乎我们还没有这个,所以我们开始:

挑战

编写一个以日期作为输入并输出年份的天数的程序或函数。您不能为此使用任何内置函数!

规则

  • 像往常一样,您可以编写完整的程序或函数。
  • 输入格式由您决定,但必须包含一年,一个月和一天。弄清楚您的解决方案使用哪一个!
  • 不允许与日期相关的内建函数!你得自己做。与日期操作无关的内建函数很好。
  • 公历的基础是公历。
  • 您必须考虑of年。
  • 您只需要处理[1,9999]范围内的年份
  • 标准漏洞禁止出现。
  • 最低字节数获胜!

测试用例

输入格式为YYYY / MM / DD

2016/07/05 -> 187
2000/03/28 -> 88
0666/06/06 -> 157
6789/10/11 -> 284
0004/04/04 -> 95
1337/07/13 -> 194

编码愉快!


从某个日期开始,我们可以使用几天的内建函数吗?一年是否是a年呢?
lirtosiast

@Thomas不允许与日期相关的内建函数。要在挑战中澄清这一点,谢谢您的评论!:)
Denker

@DenkerAffe为什么您禁止所有内置功能?
aloisdg移至codidact.com,2016年

Answers:


2

Pyth,31个字节

+s<X1+L28jC"3Ȕ"4!%|F_jQ*TT4tEE

感谢@Dennis和@Jakube提供的leap年部分。输入分别为YYYY,MM,DD。

+                          add [day] to
  s <                      sum of first [month]-1 values in the list
      X                    add 1 to
        1                  the second element (January)...
        +L                 \
           28              |
           j               }   lengths of all the months
             C "3Ȕ"       | 
             4             /
        ! %                ... if the year is a leap year; that is, 4 divides...
            |F _ j         fold logical OR over reversed
                   Q       the year
                   *TT     converted to base 100
            4
      t E                 [month]-1
  E                       [day]

测试套件


8

JavaScript的ES6,81个 69字节

(y,m,d)=>d+parseInt("03479cehkmpr"[--m],36)+m*28-(y%(y%25?4:16)&&m>1)

假设月份是基于1的,否则我可以节省2个字节。

编辑:使用@ user81655的技巧保存了12个字节。


3

C,96 102 89 61个字节

g(y,m,d){printf("%d",m/2*31+--m/2*30-(y%(y%25?4:16)?2:1)+d);}

2

Python 3中,152个 148 150字节

m,d,y=map(int,input().split());n=[0,31,(59,60)[(y%4==0 and y%100!=0)or y%400==0]]
for i in range(m):n+=[n[-1]+(31,30)[i in[1,3,6,8]]]
print(n[-4]+d)

采取“ MD YYYY”格式的日期。


1
除非需要Python 3的特定功能,否则应使用Python 2,因为这样您就不需要在打印中使用括号,从而可以通过将打印内容打印为print n[m-1]+d
Denker

在第一行中,您可以写y%4 == 0和y%100!= 0,我想
Mega Man

2

Python 2中,100个 82字节

@Neil的答案的Python端口:

lambda d,m,y:d+int("03479cehkmpr"[m-1],36)+(m-1)*28-(y%(4if y%25 else 16)and m>2)

与前面的答案一样,添加17个字节(总共99个字节)将产生一个完整的程序:

print(lambda d,m,y:d+int("03479cehkmpr"[m-1],36)+(m-1)*28-(y%(4if y%25 else 16)and m>2))(*input())

先前的答案:

作为匿名lambda:

lambda d,m,y:d+sum(31-(n in(3,5,8,10))for n in range(m-1))-(3if y%4 or(y%400!=0and y%100==0)else 2)

可以转换为命名的lambda以获得2个字节的罚款。另外,完整的程序(采用格式输入D,M,Y)可以实现117个字节:

print(lambda d,m,y:d+sum(31-(n in(3,5,8,10))for n in range(m-1))-(3if y%4 or(y%400!=0and y%100==0)else 2))(*input())

一些小型高尔夫球会获得76个字节
恢复莫妮卡

0

Python 3,125个字节

print((lambda d,m,y:sum([3,not(y%400 and not y%100 or y%4),3,2,3,2,3,3,2,3,2,3][:m-1])+m*28-28+d)(*map(int,input().split())))

解决此问题的另一种方法。该代码利用了Python的布尔代数执行优先级的优势,并且由于这not是最后一次操作,因此自动转换为布尔值。完成求和后,布尔值将被视为1或0。输入格式为“ YY MM DDDD”字符串。输入系统的灵感来自@SteveEckert的类似系统。

另一种形式的函数,91字节

def f(d,m,y):return sum([3,not(y%400 and not y%100 or y%4),3,2,3,2,3,3,2,3,2,3][:m])+m*28+d

在这种情况下,输入是三个整数,月份在0-11之间。这也将在Python 2中工作。


0

Excel,106个字节

=AND(C1>2,OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100))))+30*B1-31+CHOOSE(B1,1,2,0,1,1,2,2,3,4,4,5,5,6)+C1

在三个单元格中输入A1=年,B1月,C1日。


AND(C1>2,OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100))))

1 如果是LeapYear,否则 0

30*B1-31+CHOOSE(B1,1,2,0,1,1,2,2,3,4,4,5,5,6)+C1

的的倍数30,请选择另外的天数,再加上每月的天数


演化:

=IF(AND(C1>2,OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100)))),1,0)+CHOOSE(B1,0,31,59,90,120,151,181,212,243,273,304,334,365)+C1
=IF(AND(C1>2,OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100)))),1,0)+CHOOSE(B1-1,31,59,90,120,151,181,212,243,273,304,334,365)+C1
=IF(AND(C1>2,OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100)))),1,0)+30*(B1-1)+CHOOSE(B1,0,1,-1,0,0,1,1,2,3,3,4,4,5)+C1
=IF(AND(C1>2,OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100)))),1,0)+30*B1-30+CHOOSE(B1,0,1,-1,0,0,1,1,2,3,3,4,4,5)+C1
=IF(AND(C1>2,OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100)))),1,0)+30*B1-31+CHOOSE(B1,1,2,0,1,1,2,2,3,4,4,5,5,6)+C1
=AND(C1>2,OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100))))+30*B1-31+CHOOSE(B1,1,2,0,1,1,2,2,3,4,4,5,5,6)+C1
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.