adilepomakova написа:Задача 1. Атанасов, Борисов, Велев и Ганев са от състава на един и същи оркестър, но свирят на различни инструменти: пиано, цигулка, виолончело и кларнет и живеят в различни общини: Средец, Витоша, Люлин, Триадица. Известно е, че:
1) Кларнетистът е от Триадица;
2) Атанасов и Борисов не свирят нито на цигулка, нито на виолончело и не живеят в Средец, а Атанасов не свири и на пиано;
3)Жителят на Люлин свири на виолончело;
4) Велев не свири на цигулка и не е от Витоша.
Да се опитаме да накараме компютъра да реши тази задача с операции върху множества. Нашия подход ще е от всички възможности да махаме случите които са невъзможни и да видим какво ще остане:
- Код: Избери целия код
from itertools import product
имена = "Атанасов,Борисов,Велев,Ганев".split(",")
инструменти = "пиано,цигулка,виолончело,кларнет".split(",")
общини = "Средец,Витоша,Люлин,Триадица".split(",")
S = set( x for x in product(имена,инструменти,общини))
#1) Кларнетистът е от Триадица;
S -= set( x for x in S if ("кларнет" in x and not "Триадица" in x) or ("кларнет" not in x and "Триадица" in x))
#2) Атанасов и Борисов не свирят нито на цигулка, нито на виолончело и не живеят в Средец,
S -= set( x for x in S if ("Атанасов" in x or "Борисов" in x)
and ("цигулка" in x or "виолончело" in x or "Средец" in x))
#а Атанасов не свири и на пиано;
S -= set( x for x in S if ("Атанасов" in x and "пиано" in x) )
#3)Жителят на Люлин свири на виолончело;
S -= set( x for x in S if ("Люлин" in x and "виолончело" not in x) or ("Люлин" not in x and "виолончело" in x))
#4) Велев не свири на цигулка и не е от Витоша.
S -= set( x for x in S if ("Велев" in x and ("цигулка" in x or "Витоша" in x)))
S
Резултата е:
{('Атанасов', 'кларнет', 'Триадица'),
('Борисов', 'кларнет', 'Триадица'),
('Борисов', 'пиано', 'Витоша'),
('Велев', 'виолончело', 'Люлин'),
('Велев', 'кларнет', 'Триадица'),
('Велев', 'пиано', 'Средец'),
('Ганев', 'виолончело', 'Люлин'),
('Ганев', 'кларнет', 'Триадица'),
('Ганев', 'пиано', 'Витоша'),
('Ганев', 'пиано', 'Средец'),
('Ганев', 'цигулка', 'Витоша'),
('Ганев', 'цигулка', 'Средец')}
Хм... Добре, виждаме, че за Атанасов има само една възможност ('Атанасов', 'кларнет', 'Триадица')
Можем да махнем всички останали 'кларнет', 'Триадица'. Остават:
('Борисов', 'пиано', 'Витоша'),
('Велев', 'виолончело', 'Люлин'),
('Велев', 'пиано', 'Средец'),
('Ганев', 'виолончело', 'Люлин'),
('Ганев', 'пиано', 'Витоша'),
('Ганев', 'пиано', 'Средец'),
('Ганев', 'цигулка', 'Витоша'),
('Ганев', 'цигулка', 'Средец')
Остана пак само един Борисов: ('Борисов', 'пиано', 'Витоша'), пак махаме и остават:
('Велев', 'виолончело', 'Люлин'),
('Ганев', 'виолончело', 'Люлин'),
('Ганев', 'цигулка', 'Средец')
Значи ('Велев', 'виолончело', 'Люлин'), остава
('Ганев', 'цигулка', 'Средец')
И крайния отговор е:
('Атанасов', 'кларнет', 'Триадица')
('Борисов', 'пиано', 'Витоша')
('Велев', 'виолончело', 'Люлин')
('Ганев', 'цигулка', 'Средец')
Последните ръчни операции можехме да си ги спестим като напишем функция, която ги прави, но в случая е по-бързо да ги направим на ръка.