Skip to content

Commit 645e656

Browse files
committed
Add Module 9 Chapter 6 solutions
1 parent 398b544 commit 645e656

File tree

2 files changed

+144
-9
lines changed

2 files changed

+144
-9
lines changed

src/module_9.py

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,3 +303,126 @@ def m_9_5_15():
303303
set_numbers_A = set(map(int, input()))
304304
set_numbers_B = set(map(int, input()))
305305
print(set_numbers_A == set_numbers_B)
306+
307+
308+
# === 9.6 Задачи II ===
309+
310+
311+
def m_9_6_1():
312+
"""
313+
Анализ текста
314+
-------------------------------------
315+
Напишите программу, которая анализирует текст и выводит
316+
уникальные слова в нем, игнорируя знаки препинания и регистр.
317+
318+
**На вход** поступает строка, представляющая из себя предложение.
319+
320+
Ваша задача перевести все символы в нижний регистр, убрать знаки,
321+
такие как " ?!,.:;".
322+
323+
Также может встретиться тире с пробелами до и после слова " - ",
324+
его предлагаю заменить на пробел.
325+
326+
Отсортировать получившееся множество слов в лексикографическом порядке
327+
в порядке возрастания. В качестве результата вывести все отсортированные
328+
слова по порядку, каждое слово с новой строки.
329+
"""
330+
string = input()
331+
chrs = " ?!,.:;"
332+
words = set(word.strip(chrs) for word in string.lower().split() if word != "-")
333+
print(*sorted(words), sep="\n")
334+
335+
336+
def m_9_6_2():
337+
"""
338+
Музыкальные предпочтения
339+
-------------------------------------
340+
Вася и Петя решили поделиться каждый своими музыкальными предпочтениями,
341+
а потом решили проанализировать, какие же группы нравятся и Васе и Пете,
342+
а потом проанализировать, которые нравятся только Вася и только Пете.
343+
344+
Необходимо найти общие, Васины и Петины уникальные музыкальные группы.
345+
346+
- Вводятся две строки музыкальных групп: сперва Васи, потом Пети.
347+
- Группы разделены между собой пробелами.
348+
- Результат необходимо представить в виде отсортированных
349+
в лексикографическом порядке списков.
350+
"""
351+
vasya, petya = set(input().split()), set(input().split())
352+
print(sorted(vasya & petya), sorted(vasya - petya), sorted(petya - vasya), sep="\n")
353+
354+
355+
def m_9_6_3():
356+
"""
357+
Панграммы
358+
-------------------------------------
359+
На вход поступают строка, предложение из какого либо текста
360+
на русском языке.
361+
362+
Ваша задача определить, является ли данное предложение панграммой.
363+
Но давайте условимся, регистр не имеет значения!
364+
365+
Если текст является панграммой, то вывести True, иначе False.
366+
367+
Примечание: Панграмма - это предложение, в котором каждая буква
368+
данного алфавита используется по крайней мере один раз.
369+
"""
370+
alphabet_ru = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
371+
string = input()
372+
print(set(ch for ch in string.lower() if ch in alphabet_ru) == set(alphabet_ru))
373+
374+
375+
def m_9_6_4():
376+
"""
377+
Одинаковые наборы букв у слов
378+
-------------------------------------
379+
На вход подаётся целое число n. Затем n слов, каждое с новой строки.
380+
381+
Ваша задача если все слова состоят из одних и тех же наборов букв,
382+
то вывести True, иначе False.
383+
384+
Интересные заметки на полях: Если мы поместим в обычное множество
385+
замороженные множества букв из слов,
386+
то дубликаты замороженных множеств будут удалены.
387+
Хмм, что же нам тогда даст длина len() такого множества?
388+
Как будто ответ где-то прям рядом?
389+
"""
390+
n = int(input())
391+
words = set(frozenset(input()) for _ in range(n))
392+
print(len(words) == 1)
393+
394+
395+
def m_9_6_5():
396+
"""
397+
Группы учащихся
398+
-------------------------------------
399+
Как мы с Вами помним, Вася у нас поступил в шарагу. где его одногруппники
400+
посещают два дополнительных курса: информатику и физику.
401+
402+
Вася решил проанализировать, кто из студентов:
403+
404+
- посещает оба курса,
405+
- изучает только информатику,
406+
- изучает только физику,
407+
- учится только на одном из курсов (информатика или физика).
408+
409+
Формат вывода следующий:
410+
411+
- Выводим через запятую учащихся на курсе по информатике и физике
412+
- Выводим через запятую учащихся на курсе по информатике, но не физике
413+
- Выводим через запятую учащихся на курсе по физике, но не информатике
414+
- Выводим через запятую учащихся которые только на одном из курсов
415+
(вывести всех участников с двух курсов)
416+
417+
Примечание: Все списки отсортированы в лексикографическом порядке.
418+
Если список пуст - вместо перечисления ставится прочерк (`-`).
419+
"""
420+
inform_students, physics_students = set(input().split()), set(input().split())
421+
result = [
422+
(inform_students & physics_students),
423+
(inform_students - physics_students),
424+
(physics_students - inform_students),
425+
(physics_students ^ inform_students),
426+
]
427+
for res in result:
428+
print(*sorted(res) if res else "-", sep=", ")

tests/test_9_6.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ def test_9_6_1(input_data, expected, mocker, capsys):
3535
[
3636
(
3737
"imagine dragons metallica\nmetallica queen pink",
38-
"common: metallica\nvasya: dragons imagine\npetya: pink queen",
38+
"['metallica']\n['dragons', 'imagine']\n['pink', 'queen']",
3939
),
40-
("a b c\nd e f", "common: -\nvasya: a b c\npetya: d e f"),
41-
("rock\nrock metal", "common: rock\nvasya: -\npetya: metal"),
42-
("abc\nabc", "common: a b c\nvasya: -\npetya: -"),
40+
("a b c\nd e f", "[]\n['a', 'b', 'c']\n['d', 'e', 'f']"),
41+
("rock\nrock metal", "['rock']\n[]\n['metal']"),
42+
("a b c\na b c", "['a', 'b', 'c']\n[]\n[]"),
4343
],
4444
)
4545
def test_9_6_2(input_data, expected, mocker, capsys):
@@ -52,7 +52,11 @@ def test_9_6_2(input_data, expected, mocker, capsys):
5252
@pytest.mark.parametrize(
5353
"input_data, expected",
5454
[
55-
("Съешь же ещё этих мягких французских булок", "True"),
55+
(
56+
"Аэрофотосъёмка ландшафта уже выявила земли богачей и процветающих крестьян.",
57+
"True",
58+
),
59+
("Съешь же ещё этих мягких французских булок, да выпей чаю", "True"),
5660
("привет мир", "False"),
5761
("абвгдеёжзийклмнопрстуфхцчшщъыьэюя", "True"),
5862
("а б в", "False"),
@@ -84,13 +88,21 @@ def test_9_6_4(input_data, expected, mocker, capsys):
8488
@pytest.mark.parametrize(
8589
"input_data, expected",
8690
[
91+
(
92+
"Arthur Peter Anna Alice Anastasia"
93+
"\nAlice Arthur Vasily Anastasia Anna Tatiana Victoria Vadim",
94+
"Alice, Anastasia, Anna, Arthur\n"
95+
"Peter\n"
96+
"Tatiana, Vadim, Vasily, Victoria\n"
97+
"Peter, Tatiana, Vadim, Vasily, Victoria",
98+
),
8799
(
88100
"ivan petya\npetya katya",
89-
"both: petya\ninform: ivan\nphysic: katya\none: ivan katya petya",
101+
"petya\nivan\nkatya\nivan, katya",
90102
),
91-
("a b c\nd e", "both: -\ninform: a b c\nphysic: d e\none: a b c d e"),
92-
("x\nx y z", "both: x\ninform: -\nphysic: y z\none: x y z"),
93-
("1\n2", "both: -\ninform: 1\nphysic: 2\none: 1 2"),
103+
("a b c\nd e", "-\na, b, c\nd, e\na, b, c, d, e"),
104+
("x\nx y z", "x\n-\ny, z\ny, z"),
105+
("1\n2", "-\n1\n2\n1, 2"),
94106
],
95107
)
96108
def test_9_6_5(input_data, expected, mocker, capsys):

0 commit comments

Comments
 (0)