Yılın gün sayısını hesaplama


13

Henüz buna sahip değiliz, işte başlıyoruz:

Meydan okuma

Tarihi girdi olarak alan ve yılın gün numarasını veren bir program veya işlev yazın. Bunun için herhangi bir yerleşik kullanamazsınız!

kurallar

  • Her zamanki gibi tam bir program veya işlev yazabilirsiniz.
  • Girişin biçimi size kalmış, ancak bir yıl, bir ay ve bir gün içermelidir. Çözümün hangisini kullandığını netleştirin!
  • Tarihe bağlı yerleşiklere izin verilmez! İşi kendin yapmalısın. Tarih işlemleri ile ilgili olmayan yapıların durumu gayet iyi.
  • Hesaplamanın temeli gregoryen takvimdir.
  • Artık yılları hesaba katmalısınız.
  • Sadece yıl aralığını yapmanız gerekir [1, 9999]
  • Standart boşluklar yasaktır.
  • En düşük bayt sayısı kazanır!

testcases

Buradaki giriş biçimi YYYY / AA / GG

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

Mutlu Kodlama!


Yerleşikleri belirli bir tarihten bu yana günlerce kullanabilir miyiz? Bir yılın artık yıl olup olmadığı hakkında ne söylenebilir?
lirtosiast

@Thomas Tarihe bağlı yerleşik yapılara izin verilmez. Meydan okumada bunu açıklayacağım, yorum için teşekkürler! :)
Denker

@DenkerAffe Tüm yerleşik kişileri neden yasakladınız?
aloisdg taşınma codidact.com

Yanıtlar:


2

Pyth, 31 bayt

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

Artık yıl bölümü için @Dennis ve @Jakube'a teşekkürler . Giriş ayrı satırlarda YYYY, AA, GG'dir.

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

Test takımı .


8

JavaScript ES6, 81 69 bayt

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

Ayların 1 tabanlı olduğunu varsayarsak, aksi takdirde 2 bayt tasarruf edebilirim.

Düzenleme: @ user81655 ipucunu kullanarak 12 bayt kaydetti.


3

Cı, 96 102 89 61 bayt

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

2

Piton 3, 152 148 , 150 bayt

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" formatında tarih alır.


1
Python 3'ten belirli özelliklere ihtiyacınız olmadığı sürece Python 2'yi kullanmalısınız. Çünkü baskılarınızda, baskınızı şu şekilde yazarak bir bayt kaydetmenizi sağlayan parantezlere ihtiyacınız yokturprint n[m-1]+d
Denker

İlk satırda, y% 4 == 0 ve y% 100 yazabilirsiniz! = 0, sanırım
Mega Man

2

Python 2, 100 82 bayt

@ Neil'in cevabının bir Python portu :

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

Önceki yanıtta olduğu gibi, 17 bayt (toplam 99 bayt) eklemek tam bir program verecektir:

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

Önceki cevap:

Anonim bir lambda olarak:

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 baytlık bir ceza için adlandırılmış bir lambda'ya dönüştürülebilir. Alternatif olarak, D,M,Y117 bayt için tam bir program (formatta girdi alarak ) elde edilebilir:

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

Birkaç küçük golf 76 bayt
kalamar

0

Python 3, 125 bayt

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

Bu soruna başka bir yaklaşım. Kod, Python'un boole cebri yürütme önceliklerinden yararlanır ve notson işlem olduğundan, boole'ye dönüştürme otomatiktir. Toplama tamamlandığında, boole 1 veya 0 olarak kabul edilir. Giriş biçimi "YY MM DDDD" dizesidir. @ SteveEckert'in benzerlerinden esinlenen girdi sistemi .

Fonksiyon olarak başka bir form, 91 bayt

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

Bu durumda girdi üç tamsayıdır, ay 0-11 arasındadır. Bu Python 2'de de işe yarar.


0

Excel, 106 bayt

=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

Üç hücreye girdi alır A1= Yıl, B1= Ay, C1= Gün.


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

1 LeapYear ise, başka 0

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

Birden çok 30, ek günler için SEÇ ve aydaki günler için SEÇ


Evrim:

=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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.