Tính số ngày trong năm


13

Có vẻ như chúng tôi chưa có cái này, vì vậy chúng tôi đi đây:

Các thách thức

Viết chương trình hoặc hàm lấy ngày làm đầu vào và xuất số ngày trong năm. Bạn không thể sử dụng bất kỳ nội dung nào cho việc đó!

Quy tắc

  • Như thường lệ, bạn có thể viết một chương trình đầy đủ hoặc một chức năng.
  • Định dạng của đầu vào là tùy thuộc vào bạn, nhưng nó phải chứa một năm, một tháng và một ngày. Làm rõ cái nào mà giải pháp của bạn sử dụng!
  • Không cho phép xây dựng liên quan đến ngày! Bạn phải tự làm việc. Nội dung không liên quan đến hoạt động ngày là tốt.
  • Cơ sở cho việc tính toán là lịch gregorian.
  • Bạn phải tính đến năm nhuận.
  • Bạn chỉ cần xử lý nhiều năm trong phạm vi [1, 9999]
  • Sơ hở tiêu chuẩn bị cấm.
  • Số byte thấp nhất sẽ thắng!

Tủ thử

Định dạng đầu vào ở đây là 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

Chúc mừng mã hóa!


Chúng ta có thể sử dụng nội dung trong nhiều ngày kể từ một ngày nhất định không? Còn về một năm là một năm nhuận?
lirtosiast

@Thomas Không cho phép xây dựng liên quan đến ngày. Gonna làm rõ rằng trong thử thách, cảm ơn vì nhận xét! :)
Denker

@DenkerAffe Tại sao bạn cấm tất cả các tiện ích tích hợp?
aloisdg chuyển đến codidact.com

Câu trả lời:


2

Bình thường, 31 byte

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

Cảm ơn @Dennis và @Jakube cho phần năm nhuận . Đầu vào là YYYY, MM, DD trên các dòng riêng biệt.

+                          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]

Bộ thử nghiệm .


8

JavaScript ES6, 81 69 byte

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

Giả sử tháng là dựa trên 1, nếu không tôi có thể lưu 2 byte.

Chỉnh sửa: Đã lưu 12 byte bằng mẹo của @ user81655.


3

C, 96 102 89 61 byte

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 byte

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)

Có ngày ở định dạng "MD YYYY".


1
Bạn nên sử dụng Python 2, trừ khi bạn cần các tính năng cụ thể từ Python 3. Bởi vì sau đó bạn không cần dấu ngoặc trong bản in cho phép bạn lưu một byte bằng cách in bản in của bạn dưới dạngprint n[m-1]+d
Denker

Trong dòng đầu tiên, bạn có thể viết y% 4 == 0 và y% 100! = 0, tôi nghĩ
Mega Man

2

Python 2, 100 82 byte

Cổng Python của câu trả lời của @ Neil :

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

Như với câu trả lời trước, thêm 17 byte (tổng cộng 99 byte) sẽ mang lại một chương trình đầy đủ:

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

Câu trả lời trước:

Là một lambda ẩn danh:

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)

Có thể được chuyển đổi thành lambda có tên cho hình phạt 2 byte. Ngoài ra, D,M,Ycó thể đạt được một chương trình đầy đủ (lấy đầu vào ở định dạng ) cho 117 byte:

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

Một vài sân golf nhỏ nhận được 76 byte
Tái lập Monica

0

Python 3, 125 byte

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

Một cách tiếp cận khác cho vấn đề này. Mã này tận dụng các ưu tiên thực thi đại số boolean của Python và kể từ đónot là thao tác cuối cùng, chuyển đổi sang boolean là tự động. Khi tổng kết xong, boolean được coi là 1 hoặc 0. Định dạng đầu vào là chuỗi "YY MM DDDD". Hệ thống đầu vào lấy cảm hứng từ hệ thống tương tự của @ SteveEckert .

Một dạng khác như một hàm, 91 byte

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

Trong trường hợp này, đầu vào là ba số nguyên, tháng nằm trong khoảng từ 0-11. Điều này cũng sẽ làm việc trong Python 2.


0

Excel, 106 byte

=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

Lấy đầu vào trong ba ô A1= Năm, B1= Tháng, C1= Ngày.


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

1 nếu LeapYear, khác 0

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

Nhiều 30, CHỌN cho các ngày bổ sung, cộng với các ngày trong tháng


Sự phát triển:

=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
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.