Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 21.03.2024
Сообщений: 2

Составить расписание стирки глажки и уборки волшебного дома

21.03.2024, 17:35. Показов 1096. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Чармейн некоторое время глядела на опустевшую дорожку, а потом с треском захлопнула дверь.
– Ну и что мне теперь прикажете делать? – спросила она у гулкой заплесневелой комнаты.
– К сожалению, душенька, вам надо навести порядок в кухне, – раздался в воздухе усталый добрый голос дедушки Вильяма. – Приношу извинения за то, что оставил вам столько стирки. Прошу вас, откройте мой чемодан, там вы найдете более подробные указания.

Стирку, и глажку, и уборку волшебного дома нужно производить в заданном порядке и в определенные дни. Стирку (washing) можно делать только по понедельникам, глажку (ironing) – по средам, а уборку (cleaning) – по четвергам. Напишите программу, которая составит расписание этих дел.

Формат ввода
Первой строкой вводится начальная дата.
Вводятся строки с делами в виде
<дело> <количество этой работы> <сколько можно выполнить за один раз>
Одно дело выполняется только в один день недели.

Формат вывода
Начиная с введенной даты, запишите дни, в которые нужно стирать, гладить и убирать дом, пока не будет выполнена вся работа. Даты вводятся и выводятся в формате: DD.MM.YYYY; после даты через пробел вывести дело и сколько его выполнено в этот день (в последний раз число может оказаться меньше, чем в другие дни).

Примечание
Понедельник – это 0. Даты выводятся в календарном порядке.


Пример 1
Ввод Вывод
08.12.2008
cleaning 120 48
washing 250 50
ironing 19 20
08.12.2008 washing 50
10.12.2008 ironing 19
11.12.2008 cleaning 48
15.12.2008 washing 50
18.12.2008 cleaning 48
22.12.2008 washing 50
25.12.2008 cleaning 24
29.12.2008 washing 50
05.01.2009 washing 50
Пример 2
Ввод Вывод
23.01.2021
washing 1100 300
ironing 920 400
25.01.2021 washing 300
27.01.2021 ironing 400
01.02.2021 washing 300
03.02.2021 ironing 400
08.02.2021 washing 300
10.02.2021 ironing 120
15.02.2021 washing 200
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.03.2024, 17:35
Ответы с готовыми решениями:

Составить расписание самолетов
Ребята, помогите пожалуйста! Нужно составить расписание самолетов. Хранится оно в файле &quot;Расписание.txt&quot;, каждой строке...

Составить расписание в паскале
Задано время занятий(в часах, минутах), продолжительность пары и длительность перерыва ( в минутах). Составить расписание звонков для 4 пар.

Составить штатное расписание
Штатное расписание Составить штатное расписание небольшой частной больницы, то есть определить, сколько сотрудников, с каким окладом и ...

10
 Аватар для mirasmatras
4 / 5 / 0
Регистрация: 21.03.2024
Сообщений: 5
21.03.2024, 21:06
Python
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
import sys
from datetime import datetime, timedelta
 
start_date = datetime.strptime(input(), "%d.%m.%Y")
work = {}
for line in sys.stdin:
    task, remaining_time, required_time = line.strip().split()
    if task not in work:
        work[task] = []
    work[task].append((int(remaining_time), int(required_time)))
 
done_work = []
 
current_date = start_date
while work:
    if current_date.weekday() == 0 and 'washing' in work:
        for i in range(len(work['washing'])):
            remaining_time, required_time = work['washing'][i]
            if remaining_time >= required_time:
                done_work.append((current_date, 'washing', required_time))
                work['washing'][i] = (remaining_time - required_time, required_time)
            else:
                done_work.append((current_date, 'washing', remaining_time))
                del work['washing'][i]
                break
 
    elif current_date.weekday() == 2 and 'ironing' in work:
        for i in range(len(work['ironing'])):
            remaining_time, required_time = work['ironing'][i]
            if remaining_time >= required_time:
                done_work.append((current_date, 'ironing', required_time))
                work['ironing'][i] = (remaining_time - required_time, required_time)
            else:
                done_work.append((current_date, 'ironing', remaining_time))
                del work['ironing'][i]
                break
 
    elif current_date.weekday() == 3 and 'cleaning' in work:
        for i in range(len(work['cleaning'])):
            remaining_time, required_time = work['cleaning'][i]
            if remaining_time >= required_time:
                done_work.append((current_date, 'cleaning', required_time))
                work['cleaning'][i] = (remaining_time - required_time, required_time)
            else:
                done_work.append((current_date, 'cleaning', remaining_time))
                del work['cleaning'][i]
                break
 
    for task in list(work.keys()):
        if not work[task]:
            del work[task]
 
    current_date += timedelta(days=1)
 
done_work.sort(key=lambda x: x[0])
for date, task, time in done_work:
    if time != 0 and time != '0':
        print(date.strftime('%d.%m.%Y'), task, time)
Яндекс зачёл на максимум баллов, если что.

Добавлено через 8 минут

Не по теме:


Если хочешь, могу и решение для задачи с окном дать. Там нужен модуль PIL, она у меня тоже зачтена полностью. Скорее всего, у нас один вариант. Создай новую тему и я сразу дам решение.

1
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
22.03.2024, 08:34
Ну или так:
Python
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
from datetime import datetime, timedelta
import sys
 
FORMAT = '%d.%m.%Y'
start_date = datetime.strptime(input(), FORMAT)
cases_set = set()
data_of_case = {}
for case_str in sys.stdin:
    if not case_str:
        break
    case, count, count_at_time = case_str.split()
    count = int(count)
    if count > 0:
        count_at_time = int(count_at_time)
        if count_at_time > 0:
            cases_set.add(case)
            n, rem = divmod(count, count_at_time)
            data_of_case[case] = [rem] * bool(rem) + [count_at_time] * n
 
day = 0
case_of_wd = {0: 'washing', 2: 'ironing', 3: 'cleaning'}
while cases_set:
    delta = timedelta(days=day)
    cur_date = start_date + delta
    cur_wd = cur_date.weekday()
    if cur_wd in case_of_wd:
        cur_case = case_of_wd[cur_wd]
        if cur_case in cases_set:
            cur_count_at_time = data_of_case[cur_case].pop()
            print(f'{cur_date.strftime(FORMAT)} {cur_case} {cur_count_at_time}')
            if not data_of_case[cur_case]:
                cases_set.remove(cur_case)
    day += 1
2
7 / 5 / 3
Регистрация: 10.03.2024
Сообщений: 25
22.03.2024, 12:31
можешь кинуть ответ на задачу с окнами, плиз. Её-то я как раз не смог решить. Тему я сейчас создам
1
 Аватар для mirasmatras
4 / 5 / 0
Регистрация: 21.03.2024
Сообщений: 5
22.03.2024, 12:34

Не по теме:

idealist, невероятно, так мастерски уложиться всего в 33 строчки! Конечно, мне многому ещё предстоит научиться, но всё же, браво.



Добавлено через 49 секунд
Leorius_Mals, Хорошо
1
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
22.03.2024, 20:07
Цитата Сообщение от mirasmatras Посмотреть сообщение
мне многому ещё предстоит научиться
Ну, по мере практического программирования опыт неизбежно нарабатывается. У вас там сразу видно как можно сократить код - три практически одинаковых фрагмента кода в программе. Их как-то или в цикл или в функцию попытаться оформить.
1
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
23.03.2024, 05:36
Удалось еще немножко сократить:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from datetime import datetime, timedelta
import sys
 
FORMAT = '%d.%m.%Y'
start_date = datetime.strptime(input(), FORMAT)
data_of_wd = {}
for case_str in sys.stdin:
    if not case_str:
        break
    case, *count_and_count_at_time = case_str.split()
    count_and_count_at_time = [int(x) for x in count_and_count_at_time]
    if all(x > 0 for x in count_and_count_at_time):
        data_of_wd[0 if case=='washing' else 2 if case=='ironing' else 3] = [case] + count_and_count_at_time
 
start_wd = start_date.weekday()
for wd in range(start_wd, 10**10):
    if wd%7 in data_of_wd:
        case, count, count_at_time = data_of_wd[wd%7]
        if count:
            print((start_date + timedelta(days = wd - start_wd)).strftime(FORMAT), case,
                [count_at_time, count][count < count_at_time])
            data_of_wd[wd%7][1] = max(count - count_at_time, 0)
            if all(not x[1] for x in data_of_wd.values()):
                break
1
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,329
24.03.2024, 00:37
Цитата Сообщение от idealist Посмотреть сообщение
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from datetime import datetime, timedelta
import sys
FORMAT = '%d.%m.%Y'
start_date = datetime.strptime(input(), FORMAT)
data_of_wd = {}
for case_str in sys.stdin:
    if not case_str:
        break
    case, *count_and_count_at_time = case_str.split()
    count_and_count_at_time = [int(x) for x in count_and_count_at_time]
    if all(x > 0 for x in count_and_count_at_time):
        data_of_wd[0 if case=='washing' else 2 if case=='ironing' else 3] = [case] + count_and_count_at_time
start_wd = start_date.weekday()
for wd in range(start_wd, 10**10):
    if wd%7 in data_of_wd:
        case, count, count_at_time = data_of_wd[wd%7]
        if count:
            print((start_date + timedelta(days = wd - start_wd)).strftime(FORMAT), case,
                [count_at_time, count][count < count_at_time])
            data_of_wd[wd%7][1] = max(count - count_at_time, 0)
            if all(not x[1] for x in data_of_wd.values()):
                break
Не выводит результат на экран.
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
24.03.2024, 01:00
Цитата Сообщение от isaak Посмотреть сообщение
Не выводит результат на экран.
А вы как данные вводите в программу? Тут ввод через
Цитата Сообщение от isaak Посмотреть сообщение
sys.stdin
Нужно поместить вводимые данные в файл, а потом перенаправить программный ввод на ввод из этого файла.
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,329
24.03.2024, 13:36
Н
Цитата Сообщение от idealist Посмотреть сообщение
Нужно поместить вводимые данные в файл, а потом перенаправить программный ввод на ввод из этого файла.
не совсем понятно, как это реализовать?
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
24.03.2024, 13:54
Цитата Сообщение от isaak Посмотреть сообщение
не совсем понятно, как это реализовать?
Ну, для той программы, в которой вы запускаете, посмотреть в интернете как это делается.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.03.2024, 13:54
Помогаю со студенческими работами здесь

Составить расписание турнира
задача про теннисный клуб. даны 3 мальчика нужно чтобы каждый играл, но пары не повторились. расписание игр (без списков)

Составить расписание турнира
задача про теннисный клуб. даны 3 мальчика нужно чтобы каждый играл, но пары не повторились. расписание игр (без списков)

Составить расписание конференции
Вопрос в чем: есть рабочее расписание конференции. То есть имеются участники, которые выступают определенное количество времени в рамках...

Составить допустимое расписание
желательно с пояснением. до понедельника.

Составить расписание автобусного маршрута
Известно время начала и окончания работы некоторого пригородного автобусного маршрута с одним автобусом на линии, а также протяженность...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru