Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805

Минимизация списка кортежей

29.12.2021, 16:41. Показов 759. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите минимизировать список кортежей.

Имеется два списка двухэлементных кортежей. Каждый элемент первого списка можно сопоставить с любым элементом второго списка на ваш выбор, при этом первое значение первого кортежа вычитается из второго значения второго кортежа, а из второго значения первого кортежа вычитается первое значение второго кортежа. Если второе значение кортежа уменьшается до 0 или менее, он удаляется из списка. Цель - минимизировать количество кортежей во втором списке, сохранив при этом как можно больше значений в первом списке. Подскажите алгоритм.

Добавлено через 13 минут
И чтобы в первом списке сумма по первым и вторым значениям кортежей была как можно больше.
Например, если для того, чтобы убрать кортеж из второго списка, нужно в любом случае отдать из первого списка либо кортеж (3, 1), либо (1, 2), то отдаем (1, 2), поскольку он "дешевле".

Добавлено через 2 часа 20 минут
Написал свой вариант функции минимизации, но он не особо мне нравится:

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import unittest
import itertools
 
def minimize(player, enemy):
    n = len(player)
    price = sum(map(sum, player))
    max_price = 0
    min_remains = 999
    best_squad = None
    for attack_squad_size in range(0, n + 1):
        for squad_indices in itertools.combinations(range(n), attack_squad_size):
            squad = [player[index] for index in squad_indices]
            squad_price = sum(map(sum, squad))
            unused_price = price - squad_price
            squad_price = 0
            enemy_copy = enemy[:]
            for dmg, hp in squad:
                if len(enemy_copy):
                    dmg2, hp2 = enemy_copy.pop(0)
                    hp2 -= dmg
                    hp -= dmg2
                    if hp2 > 0:
                        enemy_copy.insert(0, (dmg2, hp2))
                if hp > 0:
                    squad_price += dmg + hp
            total_price = unused_price + squad_price
            enemies_remain = len(enemy_copy)
            if enemies_remain < min_remains or enemies_remain == min_remains and total_price > max_price:
                min_remains = enemies_remain
                max_price = total_price
                best_squad = squad_indices
    remains = []
    for i, item in enumerate(player):
        if i in best_squad:
            dmg, hp = item
            if len(enemy):
                dmg2, hp2 = enemy.pop(0)
                hp2 -= dmg
                hp -= dmg2
                if hp2 > 0:
                        enemy.insert(0, (dmg2, hp2))
            if hp > 0:
                remains.append((dmg, hp))
        else:
            remains.append(item)
    return remains, enemy
 
class Suite(unittest.TestCase):
    def test_equal_opponents(self):
        self.assertEqual(
            ([], []),
            minimize(
              player=[(1, 1)],
              enemy=[(1, 1)]
            )
        )
    def test_dragon_vs_peasant(self):
        self.assertEqual(
            ([(100, 999)], []),
            minimize(
              player=[(100, 1000)],
              enemy=[(1, 1)]
            )
        )
    def test_peasant_vs_dragon(self):
        self.assertEqual(
            ([(1, 1)],
             [(100, 1000)]),
            minimize(
              player=[(1, 1)],
              enemy=[(100, 1000)]
            )
        )
    def test_one_one_vs_one_two(self):
        self.assertEqual(
            ([
                (1, 1),
                (1, 1),
                (1, 1),
                (1, 1),
             ], []),
            minimize(
              player=[
                (1, 1),
                (1, 1),
                (1, 2),
                (1, 2),
              ],
              enemy=[(1, 2)]
            )
        )
    def test_right_sacrifice(self):
        self.assertEqual(
            ([(3, 1)], []),
            minimize(
              player=[
                (3, 1),
                (1, 2),
              ],
              enemy=[(2, 1)]
            )
        )
    def test_save_most_health(self):
        self.assertEqual(
            ([
                (1, 1),
                (2, 5),
                (2, 3),
                (3, 3),
                (4, 1),
                (7, 1),
             ], []),
            minimize(
              player=[
                (1, 1),
                (2, 5),
                (2, 3),
                (3, 4),
                (4, 2),
                (7, 1),
              ],
              enemy=[(1, 7)]
            )
        )
 
if __name__ == '__main__':
    unittest.main()
Предложите свой плиз.

Добавлено через 2 минуты
И тестов не хватает... Придумать бы тесты, где во втором массиве более одного кортежа.

Добавлено через 1 час 10 минут
Упростил задачу: вместо конечного результата функция minimize должна выводить лишь индексы кортежа из первого списка и соответствующего ему кортежа из второго списка.

Добавил два теста, где во втором списке более одного кортежа. Моя функция minimize не справляется, помогите.

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import unittest
import itertools
 
def minimize(player, enemy):
    n = len(player)
    price = sum(map(sum, player))
    max_price = 0
    min_remains = 999
    best_squad = None
    for attack_squad_size in range(0, n + 1):
        for squad_indices in itertools.combinations(range(n), attack_squad_size):
            squad = [player[index] for index in squad_indices]
            squad_price = sum(map(sum, squad))
            unused_price = price - squad_price
            squad_price = 0
            enemy_copy = enemy[:]
            for dmg, hp in squad:
                if len(enemy_copy):
                    dmg2, hp2 = enemy_copy.pop(0)
                    hp2 -= dmg
                    hp -= dmg2
                    if hp2 > 0:
                        enemy_copy.insert(0, (dmg2, hp2))
                if hp > 0:
                    squad_price += dmg + hp
            total_price = unused_price + squad_price
            enemies_remain = len(enemy_copy)
            if enemies_remain < min_remains or enemies_remain == min_remains and total_price > max_price:
                min_remains = enemies_remain
                max_price = total_price
                best_squad = squad_indices
    enemy = [(i, dmghp[0], dmghp[1]) for (i, dmghp) in enumerate(enemy)]
    commands = []
    for i, item in enumerate(player):
        if i in best_squad:
            dmg, hp = item
            if len(enemy):
                idx, dmg2, hp2 = enemy.pop(0)
                commands.append((i, idx))
                hp2 -= dmg
                hp -= dmg2
                if hp2 > 0:
                    enemy.insert(0, (idx, dmg2, hp2))
    return commands
 
class Suite(unittest.TestCase):
    def test_equal_opponents(self):
        self.assertEqual(
            [(0, 0)],
            minimize(
              player=[(1, 1)],
              enemy=[(1, 1)]
            )
        )
    def test_dragon_vs_peasant(self):
        self.assertEqual(
            [(0, 0)],
            minimize(
              player=[(100, 1000)],
              enemy=[(1, 1)]
            )
        )
    def test_peasant_vs_dragon(self):
        self.assertEqual(
            [],
            minimize(
              player=[(1, 1)],
              enemy=[(100, 1000)]
            )
        )
    def test_one_one_vs_one_two(self):
        self.assertEqual(
            frozenset([(2, 0), (3, 0)]),
            frozenset(minimize(
              player=[
                (1, 1),
                (1, 1),
                (1, 2),
                (1, 2),
              ],
              enemy=[(1, 2)]
            ))
        )
    def test_right_sacrifice(self):
        self.assertEqual(
            [(1, 0)],
            minimize(
              player=[
                (3, 1),
                (1, 2),
              ],
              enemy=[(2, 1)]
            )
        )
    def test_save_most_health(self):
        self.assertEqual(
            frozenset([(3, 0), (4, 0)]),
            frozenset(minimize(
              player=[
                (1, 1),
                (2, 5),
                (2, 3),
                (3, 4),
                (4, 2),
                (7, 1),
              ],
              enemy=[(1, 7)]
            ))
        )
    def test_choose_right_target(self):
        self.assertEqual(
            [(0, 1)],
            minimize(
              player=[(1, 2)],
              enemy=[
                (1, 2),
                (2, 1),
              ]
            )
        )
    def test_distribute_efforts(self):
        self.assertEqual(
            frozenset([
                (0, 2),
                (1, 1),
                (2, 1),
                (3, 0),
                (4, 2),
            ]),
            frozenset(minimize(
              player=[
                (2, 1),
                (3, 1),
                (4, 1),
                (5, 1),
                (8, 1),
              ],
              enemy=[
                (1, 5),
                (1, 7),
                (1, 10),
              ]
            ))
        )
 
if __name__ == '__main__':
    unittest.main()
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.12.2021, 16:41
Ответы с готовыми решениями:

Вывести все элементы списка в виде списка кортежей, упорядоченного по убыванию по значениям
Разработать класс TotalDict со следующими возможностями: class TotalDict(dict): pass 1. Объект выводит себя в консоли...

Сравнение кортежей из списка
Добрый день Получаю данные вида В списке много таких кортежей с фиксированным кол-вом значений в каждом. Нужно найти повторения...

Создание списка кортежей
Всем здравствуйте! Нужна помощь! Нужно создать список кортежей одинакового размера, причем в каждом кортеже меняется только первый...

3
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
29.12.2021, 16:45
примеры можно?
что дано, что нужно вывести.
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
29.12.2021, 18:44  [ТС]
Примеры в классе Suite, их там полно.
Что дано - второй аргумент метода assertEqual.
Что нужно вывести - первый аргумент метода.

Добавлено через 59 секунд
Сама функция, которую требуется реализовать, называется minimize.

Добавлено через 1 час 20 минут
Ушёл курить материал по двудольным графам.

Если есть другие подходы - пишите, не стесняйтесь.

Добавлено через 34 минуты
Получается вроде (1 + m)n графов. Из каждой исходной вершины либо одно ребро, либо ноль, если одно, то в любую из m вершин, верно?
Но что-то не так, невозможно такое количество графов перебрать...
0
29.12.2021, 22:06

Не по теме:

КулХацкеръ, пахнет ДП, только не видно, по каким параметрам должна быть динамика.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.12.2021, 22:06
Помогаю со студенческими работами здесь

Сортировка списка кортежей
Помогите разобраться как лучше реализовать сортировку списка кортежей с помощью сортировки по возрастанию методом Шелла. Я делал, прогоняя...

из списка кортежей изменить значение
Привет всем. когда я делаю запрос к базе данных то по некоторым полям получаю None, и этот None вставляется в поля ttk.treeview. код ...

Ввод списка кортежей от пользователя
Имеется объект с данными по успеваемости абитуриентов. Объект представляет собой список кортежей, где каждый кортеж имеет такую структуру: ...

Вывод в консоль определённых элементов списка кортежей
Здравствуйте! Я столкнулся со следующей проблемой вывода информации на экран. Допустим, у меня дан список кортежей: listOfTuples =...

Найти элементы, которые есть в каждом из кортежей и находятся в каждом из кортежей на той же позиции.
Есть три кортежа целых чисел необходимо найти элементы, которые есть в каждом из кортежей и находятся в каждом из кортежей на той же...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru