Calculez le numéro du jour de l'année

13

On dirait que nous n'avons pas encore celui-ci, alors c'est parti:

Le défi

Écrivez un programme ou une fonction qui prend une date en entrée et affiche le numéro du jour de l'année. Vous ne pouvez pas utiliser de modules intégrés pour cela!

Règles

  • Comme d'habitude, vous pouvez écrire un programme complet ou une fonction.
  • Le format de l'entrée dépend de vous, mais il doit contenir un an, un mois et un jour. Précisez laquelle utilise votre solution!
  • Aucune construction liée à la date n'est autorisée! Tu dois faire le travail par toi-même. Les valeurs intégrées qui ne sont pas liées aux opérations de date sont correctes.
  • La base du calcultion est le calendrier grégorien.
  • Vous devez tenir compte des années bissextiles.
  • Il vous suffit de gérer des années dans la plage [1, 9999]
  • Les failles standard sont interdites.
  • Le nombre d'octets le plus bas gagne!

Cas de test

Le format d'entrée ici est AAAA / MM / JJ

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

Codage heureux!

Denker
la source
Pouvons-nous utiliser des fonctions intégrées pendant des jours depuis une certaine date? Et si une année est une année bissextile?
lirtosiast
@Thomas Aucune construction liée à la date n'est autorisée. Je vais clarifier cela dans le défi, merci pour le commentaire! :)
Denker
@DenkerAffe Pourquoi avez-vous interdit toutes les fonctions intégrées?
aloisdg passe à codidact.com

Réponses:

2

Pyth, 31 octets

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

Merci à @Dennis et @Jakube pour la partie année bissextile . L'entrée est AAAA, MM, JJ sur des lignes séparées.

+                          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 de tests .

lirtosiast
la source
8

JavaScript ES6, 81 69 octets

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

En supposant que les mois sont basés sur 1, sinon je pourrais économiser 2 octets.

Edit: 12 octets enregistrés en utilisant le conseil de @ user81655.

Neil
la source
3

C, 96 102 89 61 octets

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

Python 3, 152 148 150 octets

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)

Prend des dates au format "MD YYYY".

Steve Eckert
la source
1
Vous devez utiliser Python 2, sauf si vous avez besoin de fonctionnalités spécifiques de Python 3. Parce qu'alors, vous n'avez pas besoin de crochets dans vos impressions, ce qui vous permet d'économiser un octet en écrivant votre impression commeprint n[m-1]+d
Denker
Dans la première ligne, vous pourriez écrire y% 4 == 0et y% 100! = 0, je pense
Mega Man
2

Python 2, 100 82 octets

Un port Python de la réponse de @ Neil :

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

Comme pour la réponse précédente, l'ajout de 17 octets (99 octets au total) donnera un programme complet:

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

Réponse précédente:

En tant que lambda anonyme:

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)

Peut être converti en lambda nommé pour une pénalité de 2 octets. Alternativement, un programme complet (prenant des entrées au format D,M,Y) peut être réalisé pour 117 octets:

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
la source
Quelques petits golfs obtiennent 76 octets
Rétablir Monica
0

Python 3, 125 octets

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

Une autre approche de ce problème. Le code tire parti des priorités d'exécution de l'algèbre booléenne de Python et comme notc'est la dernière opération, la conversion en booléen est automatique. Lorsque la sommation est effectuée, le booléen est traité comme 1 ou 0. Le format d'entrée est une chaîne "YY MM DDDD". Système d'entrée inspiré de celui similaire de @ SteveEckert .

Une autre forme en fonction, 91 octets

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

Dans ce cas, l'entrée est de trois entiers, le mois étant compris entre 0 et 11. Cela fonctionnerait également dans Python 2.

SydB
la source
0

Excel, 106 octets

=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

Prend la saisie dans trois cellules A1= Année, B1= Mois, C1= Jour.


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

1 si LeapYear, sinon 0

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

Multiple de 30, CHOISIR pour des jours supplémentaires, plus les jours du mois


Évolution:

=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
la source