년의 일 수를 계산하십시오


13

우리는 아직 이것을 가지고 있지 않은 것 같습니다.

도전

날짜를 입력으로 사용하여 연도의 일수를 출력하는 프로그램 또는 함수를 작성하십시오. 당신은 그것을 위해 내장을 사용할 수 없습니다!

규칙

  • 평소와 같이 전체 프로그램이나 함수를 작성할 수 있습니다.
  • 입력 형식은 사용자에게 달려 있지만 년, 월, 일을 포함해야합니다. 어떤 솔루션을 사용하는지 명확하게하십시오!
  • 날짜 관련 내장은 허용되지 않습니다! 당신은 스스로 일을해야합니다. 날짜 작업과 관련이없는 내장은 괜찮습니다.
  • 계산의 기본은 그레고리력입니다.
  • 윤년을 고려해야합니다.
  • [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

행복한 코딩!


특정 날짜 이후 며칠 동안 내장을 사용할 수 있습니까? 1 년이 윤년인지 여부는 어떻습니까?
lirtosiast

@Thomas 날짜 관련 내장은 허용되지 않습니다. 도전에 대해 의견을 주셔서 감사합니다. :)
Denker

@DenkerAffe 왜 모든 내장 기능을 금지 했습니까?
aloisdg codidact.com으로 이동

답변:


2

Pyth, 31 바이트

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

윤년 부분에 대한 @Dennis와 @Jakube에게 감사드립니다 . 입력은 별도의 라인에서 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

자바 스크립트 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

파이썬 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를 사용해야합니다. 따라서 인쇄물에 대괄호가 필요하지 않으므로 인쇄물을 다음과 같이 작성하여 1 바이트를 절약 할 수 있습니다.print n[m-1]+d
Denker

첫 번째 줄에는 y % 4 == 0, y % 100! = 0이라고 쓸 수 있습니다.
Mega Man

2

파이썬 2, 100 82 바이트

@Neil의 대답 의 파이썬 포트 :

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 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)

2 바이트 페널티에 대해 명명 된 람다로 변환 할 수 있습니다. 또는 D,M,Y117 바이트에 대해 전체 프로그램 (포맷 입력 )을 수행 할 수 있습니다.

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 바이트를
Reinstate Monica

0

파이썬 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

이 경우 입력은 3 개의 정수이며 월은 0-11입니다. 이것은 Python 2에서도 작동합니다.


0

엑셀, 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= Year, B1= Month, C1= Day에 입력을받습니다.


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.