• Guest, before posting your code please take these rules into consideration:
    • It is required to use our BBCode feature to display your code. While within the editor click < / > or >_ and place your code within the BB Code prompt. This helps others with finding a solution by making it easier to read and easier to copy.
    • You can also use markdown to share your code. When using markdown your code will be automatically converted to BBCode. For help with markdown check out the markdown guide.
    • Don't share a wall of code. All we want is the problem area, the code related to your issue.


    To learn more about how to use our BBCode feature, please click here.

    Thank you, Code Forum.

Python Task calendar problem

snorllaxxx

New Coder
Here is the task:
Analyzing weekends and holidays around New Year's and May 1st in Russia, the president of Flatlandia has concluded that the rest of its citizens can be drastically optimized. The main goal is to ensure that citizens do not have to work more than 6 consecutive days in a calendar year. The president has instructed the Ministry of Labor to develop a schedule for transferring weekends (Saturdays and Sundays) so that citizens can have as many consecutive rest days as possible.

It is important to note that if a Flatlandian public holiday falls on a weekend (Saturday or Sunday), that holiday automatically moves to the first working day after the holiday. However, according to the president's decree, any weekend, whether it coincides with a public holiday or not, can be moved to any working day. Public holidays, however, are never moved.

Write a program that will help the Ministry of Labor create the required schedule for transferring weekends in the upcoming year. Public holidays and weekends from the previous and following year should not be considered. The objective is to maximize the number of consecutive rest days in one year.

Input Format:

The first line of input contains two numbers - the year number (Y) (2012≤Y≤2050) and the day of the week for January 1st of that year (W) (1≤W≤7, from Monday to Sunday). In this range of years, leap years are divisible by 4.

The second line contains the number of annual public holidays (N) in Flatlandia. Each of the following N lines contains the date of the next holiday in the format DD.MM. The holiday dates are listed in chronological order, and all dates are valid and correct for the given year.

Output Format:

Output a single number - the maximum possible number of consecutive days off for the residents of Flatlandia in the specified year if the weekends are moved so that the number of consecutive working days in this year does not exceed 6.

Example:

Input:

2012 7

1

01.01

Output:

63


My try:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import datetime

def is_leap_year(year):
if year % 4 == 0:
if year % 100 == 0:
if year % 400 == 0:
return True
else:
return False
else:
return True
else:
return False

def get_weekday(year, month, day):
date = datetime.date(year, month, day)
return date.weekday()

def get_weekdays_in_year(year):
weekdays = [0, 0, 0, 0, 0, 0, 0] # Sunday to Saturday
for month in range(1, 13):
days_in_month = 31
if month == 4 or month == 6 or month == 9 or month == 11:
days_in_month = 30
elif month == 2:
if is_leap_year(year):
days_in_month = 29
else:
days_in_month = 28
for day in range(1, days_in_month + 1):
weekday = get_weekday(year, month, day)
weekdays[weekday] += 1
return weekdays

def get_maximum_consecutive_holidays(year, start_weekday, holidays):
weekdays = get_weekdays_in_year(year)
consecutive_holidays = 0
current_consecutive_holidays = 0
for holiday in holidays:
day, month = map(int, holiday.split('.'))
weekday = get_weekday(year, month, day)
if weekdays[weekday] == 0: # Weekday is not already a holiday
current_consecutive_holidays += 1
else:
current_consecutive_holidays = 0
weekdays[weekday] += 1
if current_consecutive_holidays > consecutive_holidays:
consecutive_holidays = current_consecutive_holidays
return consecutive_holidays


year, start_weekday = map(int, input().split())
num_holidays = int(input())
holidays = []
for _ in range(num_holidays):
holiday = input()
holidays.append(holiday)

maximum_consecutive_holidays = get_maximum_consecutive_holidays(year, start_weekday, holidays)


print(maximum_consecutive_holidays)
But uhhh, it doesn't complete the first test, help plzz
Yah its about russia, so sorry..
 
Code:
import datetime

def is_leap_year(year):
    if year % 4 == 0:
        if year % 100 == 0:
            if year % 400 == 0:
                return True
            else:
                return False
        else:
            return True
    else:
        return False

def get_weekday(year, month, day):
    date = datetime.date(year, month, day)
    return date.weekday()

def get_weekdays_in_year(year):
    weekdays = [0, 0, 0, 0, 0, 0, 0]  # Sunday to Saturday
    for month in range(1, 13):
        days_in_month = 31
        if month == 4 or month == 6 or month == 9 or month == 11:
            days_in_month = 30
        elif month == 2:
            if is_leap_year(year):
                days_in_month = 29
            else:
                days_in_month = 28
        for day in range(1, days_in_month + 1):
            weekday = get_weekday(year, month, day)
            weekdays[weekday] += 1
    return weekdays

def get_maximum_consecutive_holidays(year, start_weekday, holidays):
    weekdays = get_weekdays_in_year(year)
    consecutive_holidays = 0
    current_consecutive_holidays = 0
    for holiday in holidays:
        day, month = map(int, holiday.split('.'))
        weekday = get_weekday(year, month, day)
        if weekdays[weekday] == 0:  # Weekday is not already a holiday
            current_consecutive_holidays += 1
        else:
            current_consecutive_holidays = 0
        weekdays[weekday] += 1
        if current_consecutive_holidays > consecutive_holidays:
            consecutive_holidays = current_consecutive_holidays
    return consecutive_holidays

# Чтение входных данных
year, start_weekday = map(int, input().split())
num_holidays = int(input())
holidays = []
for _ in range(num_holidays):
    holiday = input()
    holidays.append(holiday)

# Вычисление максимального числа непрерывных выходных дней
maximum_consecutive_holidays = get_maximum_consecutive_holidays(year, start_weekday, holidays)

# Вывод результата
print(maximum_consecutive_holidays)
 
Here is algorith, help to realize
Data Reading: The first step is to read the input data, which is the year and the day of the week of January 1, as well as the dates of all holidays.

Calendar Generation: The next step is to create a dictionary, i.e., a calendar for the given year, taking into account whether the year is a leap year or not. Weekdays are marked as 0, Sundays and Saturdays as 1.

Holiday Indication: Then, iterate through the list of holidays, and if holiday falls on a weekday, mark it as 2, replacing the corresponding element in the calendar (not 1 because it cannot be moved when creating the longest chain); if it falls on a weekend, place a one here (i.e., Sunday or Saturday), but replace the next working day after the weekend with festive (i.e., 2).

Calculations and Weekend Transposition: With this internal calendar representation, you now need to calculate how many weekends can be moved to weekdays in such a way as to maximize the number of consecutive days of rest without violating the condition "no more than 6 working days in a row". When creating a chain, swap 0 and 1. It can be seen that under a normal schedule, weekdays always go 5 in a row, so all Sundays can be boldly changed to weekdays and a chain can be built from them. Also, since 2 cannot be moved, they should be included in a chain of 2 and 1, and it is necessary to ensure that the chain includes a maximum number of twos (but they cannot be moved).

Counting the Maximum Continuity Value: Finally, walk through the resulting calendar and count the maximum number of consecutive days off (days marked '1' or '2').

Answer Output: Once the maximum duration of consecutive days off has been found, print that number.
 
Top Bottom