Обчисліть число днів у році


13

Схоже, у нас цього ще немає, тож ось ми:

Змагання

Напишіть програму або функцію, яка приймає дату як вхід і виводить номер дня в році. Ви не можете використовувати будь-які вбудовані для цього!

Правила

  • Як завжди, ви можете написати повну програму або функцію.
  • Формат вводу залежить від вас, але він повинен містити рік, місяць і день. Дайте зрозуміти, яке саме рішення використовує ваше рішення!
  • Жодні вбудовані дати не дозволені! Ви повинні виконати роботу самостійно. Вбудовані, які не пов'язані з операціями на сьогоднішній день, добре.
  • Основою для обчислення є григоріанський календар.
  • Ви повинні враховувати високосні роки.
  • Вам потрібно лише обробляти роки в діапазоні [1, 9999]
  • Стандартні лазівки заборонені.
  • Виграє найменший байт!

Тестові шафи

Формат вводу тут - РРР / ММ / ДД

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

Щасливе кодування!


Чи можемо ми використовувати вбудовані дні протягом певної дати? А як щодо того, чи є рік високосним?
lirtosiast

@Thomas Не допускаються вбудовані дати, пов’язані з датою. Поясню, що у виклику, дякую за коментар! :)
Денкер

@DenkerAffe Чому ви заборонили всі вбудовані?
aloisdg переходить на codidact.com

Відповіді:


2

Pyth, 31 байт

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

Дякуємо @Dennis та @Jakube за частину високосного року . Вхід - РРРР, ММ, 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 байти.

Редагувати: збережено 12 байт за допомогою підказки @ user81655.


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 2, якщо вам не потрібні конкретні функції з Python 3. Тому що тоді вам не потрібні дужки у ваших відбитках, що дозволяє зберегти один байт, увімкнувши свій друкprint n[m-1]+d
Denker

У першому рядку ви можете написати y% 4 == 0і y% 100! = 0, я думаю
Mega Man

2

Python 2, 100 82 байт

Порт 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,Yдля 117 байт може бути досягнута повна програма (приймаючи дані у форматі ):

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

У цьому випадку вхід становить три цілих числа, місяць становить від 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

Вводить дані в три комірки 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.