Python Forum
Task calendar problem
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Task calendar problem
#1
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:
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..
Reply
#2
To be clear:

You want to know how many weekends in each year from 2012 to 2050?

I'm not sure I understand the "that holiday automatically moves to the first working day after the holiday" bit.

Please clarify.
Reply
#3
(Aug-31-2023, 06:08 AM)Pedroski55 Wrote: Please clarify.
The problem is to create a program that optimizes the schedule of weekends and public holidays in order to maximize the number of consecutive rest days for the citizens of Flatlandia, while ensuring that no one works more than 6 consecutive days.

(Aug-31-2023, 06:08 AM)Pedroski55 Wrote: If a holiday falls on a weekend, it automatically moves to the first working day after the holiday.
For example, if we have a random holiday that happens to fall on a Sunday, then the Monday after that week will automatically become a holiday too.
Reply
#4
And where is: holidays?

It is a list, I presume??
Reply
#5
(Aug-31-2023, 02:14 PM)Pedroski55 Wrote: It is a list, I presume??
I made an algorithm, but can't realize it
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.
Reply
#6
I copied your code, so I can kind of follow what you want.

Can you post the list of holidays that those flatlanders have each year?
Reply
#7
How's the homework going?

Maybe this will help:

from datetime import date, time, datetime
from calendar import isleap

for year in range(2000, 2067):
    if isleap(year):
        print(year, 'is a leap year so there are 366 days. \n')
    else:
        print(year, 'is not a leap year, so there are 365 days')
    day = datetime.strptime(str(year) + '-01-01', '%Y-%m-%d')    
    print(day.strftime(f'The first day of January {year} was a : %a'))
    print(day.strftime('Weekday full version  : %A'))
    print(day.strftime('Weekday as a number   : %w'))
    
I would like a list of all public holidays in Flatlandia in order to finish the task!
Reply
#8
(Sep-02-2023, 10:19 AM)Pedroski55 Wrote: How's the homework going?

Maybe this will help:

from datetime import date, time, datetime
from calendar import isleap

for year in range(2000, 2067):
    if isleap(year):
        print(year, 'is a leap year so there are 366 days. \n')
    else:
        print(year, 'is not a leap year, so there are 365 days')
    day = datetime.strptime(str(year) + '-01-01', '%Y-%m-%d')    
    print(day.strftime(f'The first day of January {year} was a : %a'))
    print(day.strftime('Weekday full version  : %A'))
    print(day.strftime('Weekday as a number   : %w'))
    
I would like a list of all public holidays in Flatlandia in order to finish the task!

Flatlandia is a made up country, and a list of holidays we will get only after the input!

Input:
2012 7
1 - number of holidays
01.01 - the day, which is holiday
Output:
63

Here is my code, i guess the closest 1:
a, b = map(int, input().split())
c = int(input())
copy_c = c


def func1(dt):
    e, f = map(int, dt.split('.'))
    g = {
        1: 31,
        2: 29 if a % 4 == 0 else 28,
        3: 31,
        4: 30,
        5: 31,
        6: 30,
        7: 31,
        8: 31,
        9: 30,
        10: 31,
        11: 30,
        12: 31
    }
    return sum(g[u] for u in range(1, f)) + e


h = [func1(input()) - 1 for _ in range(c)]
i = 366 if a % 4 == 0 else 365

j = 0
for _ in range(i):
    b %= 7
    if b in {0, 6}:
        j += 1
    b += 1

k = [0] * i
for l in h:
    k[l] = 2

b = 0
for l in range(i - 1, -1, -1):
    if k[l] == 0:
        b += 1
    elif k[l] == 2:
        b = 0
    if b == 7:
        k[l] = 1
        j -= 1
        b = 0


def func2(n):
    o = p = 0
    for q in n:
        if q in {1, 2}:
            p += 1
        else:
            o = max(o, p)
            p = 0
    o = max(o, p)
    return o


r = 0
for s in range(i):
    k_copy = k.copy()
    jc = j
    b = 0
    for t in range(s):
        if k_copy[t] == 0:
            b += 1
        elif k_copy[t] == 1:
            if b < 6:
                b += 1
                k_copy[t] = 0
                jc += 1
            else:
                b = 0
        elif k_copy[t] == 2:
            b = 0
    if b == 7:
        copy_t = t
        while k_copy[copy_t] == 0:
            copy_t -= 1
        k_copy[copy_t] = 1
        jc -= 1
        b = 0
    for t in range(s, i):
        if jc == 0:
            break
        if k_copy[t] == 0:
            k_copy[t] = 1
            jc -= 1
        else:
            continue
    r = max(r, func2(k_copy))

print(r - copy_c)
Reply
#9
Aha, slowly I understand the problem.

If a public holiday falls on a weekend, that day or those days can be move to Monday or Tuesday?

Public holidays are generally fixed, except for those depending on the moon, like Chinese New Year, or Easter.

If we had a fixed list of official holidays to start with, that would be easier. Like January 11, February 13, March 14, April 15 ....

Of course, the day of the week will change, so the weekend would need to be pushed to another day.

Still not sure I understand this correctly:

Quote: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.

Assume people work Monday to Friday, they will never work more than 5 days in a row! Less if a holiday happens!

I will make a list of holidays, just for fun!
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Calendar program louienyy 2 4,989 Mar-30-2020, 01:21 PM
Last Post: louienyy
Sad [Learning] Calendar without modules or list KoFu 5 4,853 Sep-09-2019, 03:25 PM
Last Post: DeaD_EyE
  Calendar calculations frequency 10 5,607 Nov-13-2018, 07:34 PM
Last Post: frequency
  Calendar calcualtions deusvult 11 8,340 May-01-2017, 02:56 AM
Last Post: nilamo

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020