Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите решить задачу по питону из степика

nbv python Ученик (122), на голосовании 3 дня назад
В чем проблема моего кода?

Выходит ошибка Failed test #2 of 13. Wrong answer


На вход программе подаются два целых числа, записанных через пробел. Необходимо прочитать эти числа по порядку в переменные m (порядковый номер месяца) и n (число, день месяца). Затем, по переменным m и n определить:

а) дату предыдущего дня (принять, что m и n не могут являться 1 января);
б) дату следующего дня (принять, что m и n не могут являться 31 декабря).

В задаче принять, что год не является високосным. Вывести предыдущую дату и следующую дату (в формате: mm.dd, где m - число месяца; d - номер дня) в одну строчку через пробел.

P.S. Число дней в месяцах не високосного года, начиная с января: 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31




a, b = map(int, input().split())
a1 = "0" + str(a)
a2 = "0" + str(a-1)
a3 = "0" + str(a+1)
b1 = "0" + str(b+1)

if a == 2 and b == 28:
print(f'{a1}.{b-1} {a3}.{ "0" + str(b-27)}')

elif a == 2 and b == 1:
print(f'{a2}.{30+b} {a1}.{b1}')

elif a == 3 and b == 1:
print(f'{a2}.{29-b} {a1}.{b1}')

elif a == 1 or a == 3 or a == 5 or a == 7 or a == 8 or a == 10 and b == 31:
print(f'{a1}.{b-1} {a3}.{"0" + str(b-30)}')
elif a == 2 or a == 1 or a == 3 or a == 5 or a == 7 or a == 8 or a == 10 or a == 12 and b > 1 and b < 31:
print(f'{a1}.{b-1} {a1}.{b+1}')

elif a == 5 or a == 7 or a == 8 or a == 10 and b == 1:
print(f'{a2}.{b+29} {a1}.{b1}')

elif a == 4 or a == 6 or a == 9 or a == 11 and b > 1 and b < 30:
print(f'{a1}.{b-1} {a1}.{b+1}')

elif a == 4 or a == 6 or a == 9 or a == 11 and b == 30:
print(f'{a1}.{b-1} {a3}.{"0" + str(b-29)}')

elif a == 4 or a == 6 or a == 9 or a == 11 and b == 1:
print(f'{a2}.{b+30} {a1}.{b1}')
Голосование за лучший ответ
Павел Никитин Гуру (4553) 1 месяц назад
В вашем коде есть несколько проблем, которые могут вызывать ошибку, особенно с обработкой входных данных и проверкой условий. Вот основные замечания:

Ошибки и недочеты:
Сложные и неясные условия:

Условия с большим количеством or и and выглядят громоздко и могут содержать логические ошибки. Например, a == 1 or a == 3 or a == 5 or a == 7 or a == 8 or a == 10 and b == 31 будет неправильно работать из-за приоритета операций (логическое and выполняется раньше, чем or).
Форматирование дат:

Вы добавляете префикс "0" вручную ("0" + str(...)), но это не учитывает ситуации, когда число уже двухзначное. Для форматирования следует использовать встроенные средства, такие как zfill или f-строки.
Избыточный код:

Много повторяющихся фрагментов с похожей логикой, которые можно объединить или упростить.
Недостаточная обработка всех возможных случаев:

Например, переход с декабря на январь или с января на декабрь не обрабатывается корректно.
Логические ошибки в выводе:

У вас есть случаи, где, например, a3 используется для вывода следующего месяца, но значение переменной не всегда корректно.

 m, n = map(int, input().split()) 

# Количество дней в каждом месяце не високосного года
days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

# Вычисляем предыдущий день
if n > 1:
prev_m = m
prev_d = n - 1
else:
prev_m = m - 1
prev_d = days_in_month[prev_m - 1]

# Вычисляем следующий день
if n < days_in_month[m - 1]:
next_m = m
next_d = n + 1
else:
next_m = m + 1
next_d = 1

# Форматируем вывод
prev_date = f"{str(prev_m).zfill(2)}.{str(prev_d).zfill(2)}"
next_date = f"{str(next_m).zfill(2)}.{str(next_d).zfill(2)}"

print(f"{prev_date} {next_date}")
Вот так правильно.
Павел НикитинГуру (4553) 1 месяц назад
Объяснение:
Массив days_in_month:

Содержит количество дней в каждом месяце, что упрощает обработку дат.
Обработка предыдущего дня:

Если n > 1, то просто вычитаем 1 день.
Если n == 1, переходим на предыдущий месяц и берем последний день этого месяца.
Обработка следующего дня:

Если n < days_in_month[m - 1], то добавляем 1 день.
Если n == days_in_month[m - 1], переходим на следующий месяц и устанавливаем день равным 1.
Форматирование:

Используем zfill(2) для добавления ведущих нулей (например, 02 вместо 2).
nbv python Ученик (122) Павел Никитин, спасибо большое очень кратко и ясно благодарю вас
nbv pythonУченик (122) 1 месяц назад
Кто вы такой?
Павел Никитин Гуру (4553) nbv python, что-то не так?
Похожие вопросы