คำนวณจำนวนวันของปี


13

ดูเหมือนว่าเรายังไม่มีนี่ดังนั้นเราไปที่นี่:

ความท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้วันที่เป็นอินพุทและเอาท์พุทจำนวนวันของปี คุณไม่สามารถใช้บิวอินได้!

กฎระเบียบ

  • ตามปกติคุณอาจเขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบ
  • รูปแบบของอินพุตนั้นขึ้นอยู่กับคุณ แต่จะต้องมีปีเดือนและวัน ชัดเจนว่าโซลูชันของคุณใช้วิธีใด!
  • ไม่อนุญาตตัวสร้างที่เกี่ยวข้องกับวันที่! คุณต้องทำงานด้วยตัวเอง Builtins ที่ไม่เกี่ยวข้องกับการดำเนินงานวันที่ได้ดี
  • ฐานสำหรับ calcultion เป็นปฏิทินเกรโกเรียน
  • คุณต้องคำนึงถึงปีอธิกสุรทิน
  • คุณจะต้องจัดการกับช่วงเวลาหลายปีในช่วง [1, 9999]
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • จำนวนไบต์ต่ำสุดชนะ!

Testcases

รูปแบบอินพุตที่นี่คือ 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

Happy Coding!


เราสามารถใช้บิวอินได้หลายวันตั้งแต่วันที่กำหนดหรือไม่? ปีหนึ่งจะเป็นปีอธิกสุรทินหรือไม่
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

JavaScript ES6, 81 69 ไบต์

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

สมมติว่าเดือนเป็นแบบ 1 มิฉะนั้นฉันสามารถบันทึก 2 ไบต์

แก้ไข: บันทึก 12 ไบต์โดยใช้เคล็ดลับของ @ user81655



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 2 เว้นเสียแต่ว่าคุณจะต้องการฟีเจอร์เฉพาะจาก Python 3 เพราะคุณไม่จำเป็นต้องใช้วงเล็บในงานพิมพ์ของคุณซึ่งช่วยให้คุณประหยัดหนึ่งไบต์ด้วยการพิมพ์งานของคุณเป็นprint n[m-1]+d
Denker

ในบรรทัดแรกคุณสามารถเขียน y% 4 == 0 และ y% 100! = 0 ฉันคิดว่า
Mega Man

2

Python 2, 100 82 ไบต์

พอร์ต Python ของคำตอบของ@ 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,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 ไบต์
Reinstate Monica

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.