Hitung jumlah hari dalam setahun

13

Sepertinya kita belum memiliki yang ini, jadi di sini kita mulai:

Tantangan

Tulis program atau fungsi yang mengambil tanggal sebagai input dan menampilkan nomor hari dalam setahun. Anda tidak boleh menggunakan builtin untuk itu!

Aturan

  • Seperti biasa Anda dapat menulis program atau fungsi lengkap.
  • Format input terserah Anda, tetapi harus mengandung satu tahun, satu bulan dan satu hari. Jelaskan solusi mana yang Anda gunakan!
  • Tidak ada bawaan terkait tanggal diizinkan! Anda harus melakukan pekerjaan sendiri. Builtin yang tidak terkait dengan operasi tanggal baik-baik saja.
  • Basis untuk perhitungan adalah kalender gregorian.
  • Anda harus memperhitungkan tahun kabisat.
  • Anda hanya perlu menangani tahun dalam kisaran [1, 9999]
  • Celah standar dilarang.
  • Hitungan byte terendah menang!

Testcases

Format input di sini adalah 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

Selamat Coding!

Denker
sumber
Bisakah kita menggunakan builtin selama berhari-hari sejak tanggal tertentu? Bagaimana dengan apakah satu tahun adalah tahun kabisat?
lirtosiast
@ Thomas Tidak ada bawaan terkait tanggal diizinkan. Akan mengklarifikasi bahwa dalam tantangan, terima kasih atas komentarnya! :)
Denker
@DenkerAffe Mengapa Anda melarang semua built-in?
aloisdg pindah ke codidact.com

Jawaban:

2

Pyth, 31 byte

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

Terima kasih kepada @Dennis dan @Jakube untuk porsi tahun kabisat . Input adalah YYYY, MM, DD pada saluran yang terpisah.

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

Suite uji .

lirtosiast
sumber
8

JavaScript ES6, 81 69 byte

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

Dengan asumsi bulan berbasis 1, kalau tidak saya bisa menghemat 2 byte.

Sunting: Disimpan 12 byte menggunakan tip @ user81655.

Neil
sumber
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);}
o79y
sumber
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)

Membawa tanggal dalam format "MD YYYY".

Steve Eckert
sumber
1
Anda harus menggunakan Python 2, kecuali jika Anda memerlukan fitur spesifik dari Python 3. Karena dengan begitu Anda tidak perlu tanda kurung dalam cetakan Anda yang memungkinkan Anda untuk menyimpan satu byte dengan menuliskan cetakan Anda sebagaiprint n[m-1]+d
Denker
Di baris pertama, Anda bisa menulis y% 4 == 0dan y% 100! = 0, saya pikir
Mega Man
2

Python 2, 100 82 byte

Port Python dari jawaban @ Neil :

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

Seperti jawaban sebelumnya, menambahkan 17 byte (total 99 byte) akan menghasilkan program lengkap:

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

Jawaban sebelumnya:

Sebagai lambda anonim:

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)

Dapat dikonversi ke nama lambda untuk penalti 2 byte. Atau, program lengkap (mengambil input dalam format D,M,Y) dapat dicapai untuk 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())
Mac
sumber
Beberapa golf kecil mendapat 76 byte
Reinstate 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())))

Pendekatan lain untuk masalah ini. Kode mengambil keuntungan dari prioritas eksekusi aljabar boolean Python dan karena notmerupakan operasi terakhir, konversi ke boolean otomatis. Ketika penjumlahan dilakukan, boolean diperlakukan sebagai 1 atau 0. Format input adalah string "YY MM DDDD". Sistem input diinspirasi oleh @ SteveEckert yang serupa.

Bentuk lain sebagai fungsi, 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

Dalam hal ini input adalah tiga bilangan bulat, bulannya antara 0-11. Ini akan bekerja di Python 2 juga.

SydB
sumber
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

Mengambil input dalam tiga sel A1= Tahun, B1= Bulan, C1= Hari.


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

1 jika LeapYear, yang lain 0

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

Banyak dari 30, PILIH untuk hari-hari tambahan, ditambah hari dalam sebulan


Evolusi:

=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
Wernisch
sumber