Форум сайта python.su
Создал своё сообщество в ВК по Python, в которое пишу авторские статьи по теме https://vk.com/snakeblog
Дело в том, что все сообщества в ВК по теме выглядят одним из следующих образов:
Офлайн
Посмотрел я на твою группу и сразу увидел не правильное решение задачи про високосные года. То что задача решена не правильно можно легко понять если посчитать разность между полученным количеством високосных годов и високосных годов в юлианском календаре:
>>> gk = len([y for y in range(2019) if (y % 400 == 0) or (y % 4 == 0) and (y % 100 != 0)]) >>> uk = len([y for y in range(2019) if (y % 4 == 0)]) >>> uk - gk 15
Отредактировано Rodegast (Июль 11, 2018 11:14:34)
Офлайн
Простите, что? Цитата из википедии. В моём коде ровно это и написано.
Отсюда следует распределение високосных годов:
год, номер которого кратен 400, — високосный;
остальные годы, номер которых кратен 100, — невисокосные;
остальные годы, номер которых кратен 4, — високосные.
Офлайн
> В моём коде ровно это и написано.
Ну вот тебе другая цитата из википедии.
Разница Период (по юлианскому календарю) Период (по григорианскому календарю)
10 5 октября 1582 — 29 февраля 1700 15 октября 1582 — 11 марта 1700
11 1 марта 1700 — 29 февраля 1800 12 марта 1700 — 12 марта 1800
12 1 марта 1800 — 29 февраля 1900 13 марта 1800 — 13 марта 1900
13 1 марта 1900 — 29 февраля 2100 14 марта 1900 — 14 марта 2100
14 1 марта 2100 — 29 февраля 2200 15 марта 2100 — 15 марта 2200
15 1 марта 2200 — 29 февраля 2300 16 марта 2200 — 16 марта 2300
Отредактировано Rodegast (Июль 12, 2018 22:44:14)
Офлайн
RodegastИз этой таблицы видно что каждые сто лет набегает один день, следовательно за 2000 лет (20 столетий) должно было бы набежать двадцать дней, но это не так. Количество високосных лет за 2019 лет можно посчитать с помощью модуля calendar:
Из этой таблицы видно что сейчас разница между юлианским и григорианским календарём должно составлять 13 дней, а не 15.
>>> import calendar >>> sum(calendar.isleap(i) for i in range(2019)) 490
>>> len([y for y in range(2019) if (y % 400 == 0) or (y % 4 == 0) and (y % 100 != 0)]) 490
>>> len([y for y in range(2019) if (y % 4 == 0)]) 505
Офлайн
И ты допускаешь туже самую ошибку как и автор темы. У тебя должно получаться 13 дней, а не 15. Иначе твои вычисления не верны.
> Из этой таблицы видно что каждые сто лет набегает один день, следовательно за 2000 лет (20 столетий) должно было бы набежать двадцать дней, но это не так
скачок, увеличивающий разницу между календарями на один день, происходит 1 марта завершающего столетие года, номер которого кратен 100 и не кратен 400.
Отредактировано Rodegast (Июль 13, 2018 11:51:53)
Офлайн
ramiЯ не обратил внимания, что в таблице не все столетние года, а только не високосные, 1600 и 2000 как и должно быть отсутствуют. Таблица правильная.
Из этой таблицы видно что каждые сто лет набегает один день, следовательно за 2000 лет (20 столетий) должно было бы набежать двадцать дней, но это не так.
RodegastЯ не знаю какую задачу решал автор темы, у меня нет регистрации в ВК.
И ты допускаешь туже самую ошибку как и автор темы. У тебя должно получаться 13 дней, а не 15. Иначе твои вычисления не верны.
Офлайн
> Я не знаю какую задачу решал автор темы, у меня нет регистрации в ВК.
У меня тоже регистрации нет, но задачу и без неё показывают. https://vk.com/snakeblog?w=wall-168602618_16
Если в двух словах, то нужно создать список всех високосных годов с 1 по 2018.
> то он считал правильно, должно получиться 15.
Разность дней в календаре это своеобразная проверка с помощью которой я показал что решение его же задачи не верное.
> Но для подсчёта текущей разницы такие расчёты не подойдут.
Не существует “теоретической” и “текущей” разности между датами.
Отредактировано Rodegast (Июль 13, 2018 18:13:01)
Офлайн
RodegastДо нашей эры високосные годы в Юлианском календаре реально были каждые три года, а не каждые четыре, потом отменили несколько високосных лет, нулевой и четвёртый не были високосными.
Не существует “теоретической” и “текущей” разности между датами.
Задача: напишите программу в 1 строчку, которая создаёт список всех високосных годов с 0 до 2018.Если условия задачи понимать буквально, то список високосных лет до 1582 года должен содержать високосные года по Юлианскому календарю, а после по Григорианскому. Фактически это все года которые делятся на 4, за исключением 0, 4, 1700, 1800, 1900 годов.
[year for year in range(8, 2018, 4) if year < 1582 or year % 100 or not year % 400]
[year for year in range(2019) if (year % 400 == 0) or (year % 4 == 0) and (year % 100 != 0)]
Отредактировано rami (Июль 13, 2018 21:33:05)
Офлайн
> До нашей эры високосные годы в Юлианском календаре реально были каждые три года, а не каждые четыре, потом отменили несколько високосных лет, нулевой и четвёртый не были високосными.
Под календарём я подразумеваю способ расчёта даты, по этому такие подробности для нас мало интересны.
> Если условия задачи понимать буквально, то список високосных лет до 1582 года должен содержать високосные года по Юлианскому календарю, а после по Григорианскому.
Ты мыслишь в правильном направлении, но почему юлианский календарь действует до 1582 года, а на пример не до 1918-го?
P.S. Нулевого года не существует.
Офлайн