Помогите, пожалуйста, решить одну задачку на Python 3. Название: Грибники
Помогите с задачей, надо использовать множества. Если можно, не импортируйте никакие модули, пожалуйста. Заранее Спасибо!
ТЕКСТ ЗАДАЧИ:
Лето в этом году было очень дождливым. Зато грибов — завались! Компания друзей решила порадовать себя тихой охотой и отправилась в лес. Грибов каждый собрал много, а потом они решили узнать, у кого получилась самая разнообразная корзинка — у кого больше всех видов грибов.
Формат ввода:
Целое число — количество друзей (не меньше 2). Затем для каждого из них вводится имя, а потом перечисляются все собранные грибы, пока не будет введено слово ВСЕ.
Формат вывода:
Нужно вывести имена двух грибников, у которых в корзинке оказалось больше всего различных грибов. Если таких несколько, то вывести имена с наименьшими значениями в порядке возрастания (по алфавиту). Затем сравнить виды грибов в корзинках. Если количество видов одинаково, но они не совпадают, или различное количество видов, вывести РАЗНЫЕ, если и количество одинаково, и виды одни и те же, вывести ОДИНАКОВЫЕ.
Пример 1:
Ввод:
3
Василий
сыроежка
сыроежка
белый гриб
лисичка
ВСЕ
Павел
волнушка
сыроежка
мухомор
ВСЕ
Иннокентий
белый гриб
подосиновик
подберезовик
сыроежка
ВСЕ
Вывод:
Иннокентий
Василий
РАЗНЫЕ
Пример 2:
**Ввод:**
2
Татьяна
мухомор
мухомор
поганка
ВСЕ
Алина
мухомор
поганка
поганка
мухомор
мухомор
поганка
мухомор
ВСЕ
Вывод:
Алина
Татьяна
ОДИНАКОВЫЕ
Я сначала Решил попробовать разобраться без множеств, и, от части, мой код даже работал, но проблема состоит в том, что он перестаёт нормально функционировать, если длина получившихся вложенных списков вот такая: [5, 4, 4, 3] или такая: [6, 4, 4, 4]. Надо отдельно всё сортировать по условию задачи, я не знаю, как это реализовать.
Вот код:
a = []
c = []
e = []
u = []
h = []
g = []
for i in range(int(input())):
d = []
b = input()
a.append(b)
while b != 'ВСЕ':
b = input()
if b != 'ВСЕ':
d.append(b)
c.append(d)
for i in c:
f = []
for j in i:
if i.count(j) > 1 and j not in f:
f.append(j)
elif i.count(j) == 1:
f.append(j)
u.append(f)
for i in range(len(u) - 1):
for j in range(len(u) - i - 1):
if len(u[j]) < len(u[j + 1]):
u[j], u[j + 1] = u[j + 1], u[j]
a[j], a[j + 1] = a[j + 1], a[j]
for i in u:
e.append(len(i))
if e.count(max(e)) > 2:
for i in range(len(u) - 1):
for j in range(len(u) - i - 1):
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
u[j], u[j + 1] = u[j + 1], u[j]
a = a[:2]
u = u[:2]
for i in u:
i.sort()
h.append(i)
if h[0] == h[1]:
for i in a:
print(i)
print('ОДИНАКОВЫЕ')
elif h[0] != h[1] and len(h[0]) == len(h[1]):
a.sort()
for i in a:
print(i)
print('РАЗНЫЕ')
else:
for i in a:
print(i)
print('РАЗНЫЕ')
else:
a = a[:2]
u = u[:2]
for i in range(len(u) - 1):
for j in range(len(u) - i - 1):
if len(u[j]) < len(u[j + 1]):
u[j], u[j + 1] = u[j + 1], u[j]
a[j], a[j + 1] = a[j + 1], a[j]
for i in u:
i.sort()
h.append(i)
if h[0] == h[1]:
a.sort()
for i in a:
print(i)
print('ОДИНАКОВЫЕ')
elif h[0] != h[1] and len(h[0]) == len(h[1]):
a.sort()
for i in a:
print(i)
print('РАЗНЫЕ')
else:
for i in a:
print(i)
print('РАЗНЫЕ')
Ответы (1 шт):
Сперва замечания по вашему коду:
- Нечитаемый - однобуквенные имена переменных.
- Не разделяете код на функции.
Моё решение
Так как из текста задачи не вполне понятно, как требуется выводить имена грибников, делал так, чтобы сошлось с примерами вывода.
def fill_friend_basket(baskets, stop_word):
friend = input()
baskets[friend] = {}
while True:
mushroom = input()
if mushroom == stop_word:
break
if mushroom not in baskets[friend]:
baskets[friend][mushroom] = 0
baskets[friend][mushroom] += 1
def ordered_friends(baskets):
species_num_friends = {}
for friend, basket in baskets.items():
num = len(set(basket.keys()))
if num not in species_num_friends:
species_num_friends[num] = []
species_num_friends[num].append(friend)
return [
friend
for num in sorted(species_num_friends.keys(), reverse=True)
for friend in sorted(species_num_friends[num])
]
def unique_baskets(baskets):
return set(frozenset(basket) for basket in baskets.values())
def solve():
stop_word = "ВСЕ"
baskets = {}
friends_num_print = 2
friends_num = int(input())
for _ in range(friends_num):
fill_friend_basket(baskets, stop_word)
for friend in ordered_friends(baskets)[:friends_num_print]:
print(friend)
if len(unique_baskets(baskets)) > 1:
print("РАЗНЫЕ")
else:
print("ОДИНАКОВЫЕ")
solve()
Input 1
3
Василий
сыроежка
сыроежка
белый гриб
лисичка
ВСЕ
Павел
волнушка
сыроежка
мухомор
ВСЕ
Иннокентий
белый гриб
подосиновик
подберезовик
сыроежка
ВСЕ
Output 1
Иннокентий
Василий
РАЗНЫЕ
Input 2
2
Татьяна
мухомор
мухомор
поганка
ВСЕ
Алина
мухомор
поганка
поганка
мухомор
мухомор
поганка
мухомор
ВСЕ
Output 2
Алина
Татьяна
ОДИНАКОВЫЕ