年の日数を計算する


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

ハッピーコーディング!


特定の日付以降の組み込み関数を使用できますか?年がうるう年かどうかはどうですか?
リルトシアスト

@Thomas日付関連のビルトインは許可されていません。チャレンジでそれを明確にして、コメントをありがとう!:)
デンカー

@DenkerAffeなぜすべてのビルトインを禁止したのですか?
aloisdgがcodidact.comに移動する16

回答:


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バイト節約できます。

編集:@ 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

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 3から特定の機能を必要としない限り、あなたはあなたのようにあなたのプリントをwrintingことにより、1バイトを保存することができますあなたの印刷物でブラケットを必要としないので、あなたは、Python 2を、使用する必要がありますprint n[m-1]+d
Denker

最初の行では、Y%4 == 0andのy%100を書くことができ= 0を、私は思います!
ロックマン

2

Python 2、100 82バイト

@Neilの答えのPythonポート:

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バイトを
モニカを復活させる

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

この場合、入力は3つの整数で、月は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

3つのセル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.