Calcule el número de día del año.

13

Parece que todavía no tenemos este, así que aquí vamos:

El reto

Escriba un programa o función que tome una fecha como entrada y genere el número de día del año. ¡No puedes usar ningún incorporado para eso!

Reglas

  • Como de costumbre, puede escribir un programa completo o una función.
  • El formato de la entrada depende de usted, pero debe contener un año, un mes y un día. ¡Deje claro cuál usa su solución!
  • ¡No se permiten construcciones relacionadas con la fecha! Tienes que hacer el trabajo tú solo. Las construcciones que no están relacionadas con las operaciones de fecha están bien.
  • La base para el cálculo es el calendario gregoriano.
  • Tienes que tener en cuenta los años bisiestos.
  • Solo necesita manejar años en el rango [1, 9999]
  • Las lagunas estándar están prohibidas.
  • ¡El conteo de bytes más bajo gana!

Casos de prueba

El formato de entrada aquí es AAAA / 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

¡Feliz codificación!

Denker
fuente
¿Podemos usar builtins durante días desde una fecha determinada? ¿Qué pasa si un año es bisiesto?
lirtosiast
@Thomas No se permiten construcciones relacionadas con la fecha. Voy a aclarar que en el desafío, ¡gracias por el comentario! :)
Denker
@DenkerAffe ¿Por qué prohibiste todas las incorporaciones?
aloisdg se muda a codidact.com el

Respuestas:

2

Pyth, 31 bytes

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

Gracias a @Dennis y @Jakube por la porción del año bisiesto . La entrada es AAAA, MM, DD en líneas separadas.

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

Banco de pruebas .

lirtosiast
fuente
8

JavaScript ES6, 81 69 bytes

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

Suponiendo que los meses estén basados ​​en 1, de lo contrario podría ahorrar 2 bytes.

Editar: guardado 12 bytes con la sugerencia de @ user81655.

Neil
fuente
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
fuente
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)

Toma fechas en el formato "MD AAAA".

Steve Eckert
fuente
1
Debe usar Python 2, a menos que necesite características específicas de Python 3. Porque entonces no necesita corchetes en sus impresiones, lo que le permite guardar un byte escribiendo su impresión comoprint n[m-1]+d
Denker
En la primera línea, podría escribir y% 4 == 0yy% 100! = 0, creo
Mega Man
2

Python 2, 100 82 bytes

Un puerto de Python con la respuesta de @ Neil :

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

Al igual que con la respuesta anterior, agregar 17 bytes (99 bytes en total) generará un programa completo:

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

Respuesta anterior:

Como una lambda anónima:

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)

Se puede convertir a una lambda con nombre para una penalización de 2 bytes. Alternativamente, D,M,Yse puede lograr un programa completo (que toma la entrada en el formato ) para 117 bytes:

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
fuente
Unos pequeños campos de golf obtiene 76 bytes
Restablecer 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())))

Otro enfoque para este problema. El código aprovecha las prioridades de ejecución de álgebra booleana de Python y, dado que notes la última operación, la conversión a booleana es automática. Cuando se realiza la suma, el booleano se trata como 1 o 0. El formato de entrada es la cadena "YY MM DDDD". Sistema de entrada inspirado en el similar de @ SteveEckert .

Otra forma como función, 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

En este caso, la entrada es de tres enteros, el mes está entre 0-11. Esto también funcionaría en Python 2.

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

Toma entrada en tres celdas A1= Año, B1= Mes, C1= Día.


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

1 si LeapYear, de lo contrario 0

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

Múltiple de 30, ELIJA por días adicionales, más días en el mes


Evolución:

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