Berechnen Sie die Tageszahl des Jahres

13

Scheint so, als hätten wir diesen noch nicht, also los geht's:

Die Herausforderung

Schreiben Sie ein Programm oder eine Funktion, die ein Datum als Eingabe verwendet und die Tageszahl des Jahres ausgibt. Sie dürfen dafür keine Builtins verwenden!

Regeln

  • Wie üblich können Sie ein vollständiges Programm oder eine Funktion schreiben.
  • Das Format der Eingabe liegt bei Ihnen, muss jedoch ein Jahr, einen Monat und einen Tag enthalten. Stellen Sie klar, welche Ihre Lösung verwendet!
  • Keine datumsbezogenen Buildins erlaubt! Du musst die Arbeit alleine machen. Builtins, die nicht mit Datumsoperationen zusammenhängen, sind in Ordnung.
  • Basis für die Berechnung ist der Gregorianische Kalender.
  • Sie müssen Schaltjahre berücksichtigen.
  • Sie müssen nur Jahre im Bereich [1, 9999] behandeln
  • Standardlücken sind verboten.
  • Die niedrigste Byteanzahl gewinnt!

Testfälle

Das Eingabeformat ist hier JJJJ / MM / TT

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

Viel Spaß beim Codieren!

Denker
quelle
Können wir Builtins seit einem bestimmten Datum tagelang verwenden? Was ist, wenn ein Jahr ein Schaltjahr ist?
Lirtosiast
@Thomas Keine datumsbezogenen Buildins erlaubt. Ich werde das in der Herausforderung klarstellen, danke für den Kommentar! :)
Denker
@DenkerAffe Warum haben Sie alle eingebauten Funktionen verboten?
Aloisdg Umzug zu codidact.com

Antworten:

2

Pyth, 31 Bytes

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

Vielen Dank an @Dennis und @Jakube für den Schaltjahresanteil . Die Eingabe erfolgt JJJJ, MM, TT in separaten Zeilen.

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

Testsuite .

Lirtosiast
quelle
8

JavaScript ES6, 81 69 Bytes

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

Angenommen, die Monate basieren auf 1, sonst könnte ich 2 Bytes sparen.

Bearbeiten: 12 Bytes mit dem Tipp von @ user81655 gespeichert.

Neil
quelle
3

C 96 102 89 61 Bytes

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

Python 3, 152 148 150 Bytes

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)

Nimmt Daten im Format "MD YYYY".

Steve Eckert
quelle
1
Sie sollten Python 2 verwenden, es sei denn, Sie benötigen bestimmte Funktionen von Python 3. Da Sie dann keine Klammern in Ihren Ausdrucken benötigen, können Sie ein Byte sparen, indem Sie Ihren Ausdruck alsprint n[m-1]+d
Denker
In die erste Zeile könnte man y% 4 == 0 und y% 100! = 0 schreiben, glaube ich
Mega Man
2

Python 2, 100 82 Bytes

Ein Python-Port von Neils Antwort:

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

Wie bei der vorherigen Antwort ergibt das Hinzufügen von 17 Bytes (insgesamt 99 Bytes) ein vollständiges Programm:

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

Vorherige Antwort:

Als anonymes Lambda:

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)

Kann für eine 2-Byte-Strafe in ein benanntes Lambda konvertiert werden. Alternativ kann ein vollständiges Programm (Eingabe im Format D,M,Y) für 117 Bytes erstellt werden:

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
quelle
Ein paar kleine Golfer bekommen 76 Bytes
Reinstate Monica
0

Python 3, 125 Bytes

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

Ein anderer Ansatz zu diesem Problem. Der Code nutzt die Vorteile der Ausführungsprioritäten der Booleschen Algebra von Python, und da dies notdie letzte Operation ist, erfolgt die Konvertierung in den Booleschen Wert automatisch. Wenn die Summierung abgeschlossen ist, wird der Boolesche Wert als 1 oder 0 behandelt. Das Eingabeformat lautet "JJ MM TTTT". Eingabesystem inspiriert von @ SteveEckerts ähnlichem.

Eine andere Form als Funktion, 91 Bytes

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

In diesem Fall beträgt die Eingabe drei Ganzzahlen, wobei der Monat zwischen 0 und 11 liegt. Dies würde auch in Python 2 funktionieren.

SydB
quelle
0

Excel, 106 Bytes

=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

Übernimmt die Eingabe in drei Zellen A1= Jahr, B1= Monat, C1= Tag.


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

1 wenn LeapYear, sonst 0

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

Vielfaches von 30, WÄHLEN Sie zusätzliche Tage plus Tage im Monat


Evolution:

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