LINUX.ORG.RU

[взрыв мозга] Пятница 13-го :)


0

0

Пришла в голову интересная задачка:
Максимально просто выяснить год в котором больше всего пятниц 13-го :)
Ну естественно этот год будет периодичен....
Какие мысли ?

★★★★★

Интересная задача. Надо подумать :)

power
()
Ответ на: Ну почему же ? от jreznot

Сдается мне, что Питон вы не знаете.

from __future__ import print_function

import datetime
import itertools
import operator

def friday_13_gen():
	one_day = datetime.timedelta(days=1)
	date = datetime.date.min
	while True:
		if date.day == 13 and date.weekday() == 4:
			yield date
		if date < datetime.date.max:
			date += one_day
		else:
			break

fridays_by_year = itertools.groupby(friday_13_gen(), operator.attrgetter('year'))
fridays_counted = ((year, len(list(fridays))) for year, fridays in fridays_by_year)
fridays_sorted = sorted(fridays_counted, key=operator.itemgetter(1), reverse=True)

map(print, fridays_sorted)
ntp
()
Ответ на: комментарий от Sova777

Плохие годы: Високосный, начинающийся в воскресенье Невисокосный, начинующийся в четверг

Sova777
()
Ответ на: комментарий от ntp

Я писал от скуки за чашкой чаю. А не чтобы понты вывалить. У тебя ЧСВ из щелей вылезло, заправь обратно

jreznot
()
Ответ на: комментарий от static_lab

Не совсем. Если год кратен 100, но не кратен 400, то он не високосный.

friday ★★★
()
Ответ на: комментарий от jreznot

> Ну ещё повредничаю: break в цикле с условием - верх неприличия.

Ну что ли покажите ваш вариант аналогичного цикла.

ntp
()
Ответ на: комментарий от ntp

Посмотри мой код же внимательно!
while date < datetime.date.max:
...
Уже никак ? А ведь в плюсах это был бы фор, жалко в питоне нет нормальных инкрементных циклов.

jreznot
()
Ответ на: комментарий от jreznot

> while date < datetime.date.max

Последний день не будет обработан. Сишный цикл for(;;) здесь тоже не поможет.

Думайте дальше.

ntp
()
Ответ на: комментарий от ntp

Уродливы циклы с постусловием в питоне, без бряка люди не живут.

C# for style:
for (date = datetime.date.min; date <= datetime.date.max; date = date + one_day)

Если можно без прыжков - надо писать без них. А то потом оказывается что у цикла тонна условий выхода с бряками :(

jreznot
()
Ответ на: комментарий от jreznot

for (date = datetime.date.min; date <= datetime.date.max; date = date + one_day)

Перепишем через явный while:

date = datetime.date.min
while date <= datetime.date.max:
	...  # Тут тело цикла
	date += one_day  # Отдельная НЕНАВИСТЬ за date = date + one_day

И получим exception. Думайте дальше.

Но сдается мне, что у вас не только с питоном плохо, но и вообще с основами программирования. Например с циклами.

ntp
()
Ответ на: комментарий от jreznot

Я повторюсь, что использовать перебор нельзя :)
И неважно перебор это с помошью питона или сирешотка

Jetty ★★★★★
() автор топика
Ответ на: комментарий от Jetty

Эх, просто народ уже перебрал, и думать над математическим решением уже не интересно.

Теорема: в году может быть не больше 3ёх пятниц 13 ого

Доказательство: Итак, есть год в котором есть 3 пятницы. Он есть, доказывать не надо. Докажем, что не может быть их больше.
От противного. Допустим есть год в котором больше 3х пятниц 13ого. Выстроим их в порядке возрастания месяца. Рассмотри первые 4 из них. То, что их 4ре означает, что между каждыми двумя расположено число дней кратное 7.
Количества дней в месяцах: 31, {28, 29}, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31. Утверждается, что на этом массиве нельзя расставить 4ре тринадцатых числа так, что между ними число дней кратное 7ми. Дальше всё просто.

jreznot
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.