Четвърта задача
Брой точки, които дава задачата: 5 + 3 (елегантни решения).
Краен срок: 12-и май 2008г., 19:00 часа.
Основната ви цел е да напишете функция със следните име и аргументи: module_game(predicate, *modules).
Входни данни: всички елементи на modules са модули, predicate е функция, приемаща произволен обект, и връщаща булева стойност.
Резултат: n-торка с len(modules) елемента. Всеки елемент съдържа броя точки, които е събрал съответния модул при играта, описана по-долу.
Предварително известни факти:
- Всички речници в модулите са или празни или само от цели числа. Ключовете им са винаги низове. Примери:
{} {'baba': 5} {'a': 42, 'b': -69, 'x': 4360000634} - Всички списъци/n-торки в модулите могат да съдържат само цели числа или други списъци/n-торки, за които важи същото правило. Могат и да бъдат празни, разбира се. Примери:
[] [11] ([1, 2, 3, ], 4, [5], [6,(7, 8, 9)]) (5,) - Може да разчитате, че тези условия ще бъдат изпълнени и няма нужда да ги проверявате.
Правила на играта:
За атрибути по-надолу (за всички правила) ще смятаме само тези реални атрибути на модулите, които не започват с _ (долна черта, подчертавка)
- Всеки модул получава по една точка за всяко просто число в него. Числата в един модул включват както целочислените му атрибути, така и целите числа в речниците, списъците, списъците в списъците, списъците в списъците в списъците и т.н. Ето пример за модул, който получава 3 точки:
s = "baba" l = [6, (511,), [99, 63, [18, 70], 7907]] n = (2, (4, (6, (9, (2,)))))
- Всеки модул получава по три точки за всеки модул в него, който се казва antigravity или soul.
- Всеки модул получава по една точка за всеки речник в него, чието име е анаграма на името на функция в модула. Пример, който получава една точка по това правило:
mary = {} lalala = [9, 11, 2, 3, 4] army = lambda: "Complain to pop@armenia.com" def llaalla(): print "i > u > i" - Всеки модул получава толкова точки, колкото е закръглената надолу разлика между броя атрибути, отговарящи на
predicateи медианата на броя атрибути, отговарящи наpredicateвъв всички модули. Пример:mod0.py:f = lambda: "Apricot" g = lambda: "Peach" nofunc = -11
mod1.py:f = lambda: "Apricot"
mod2.py:f = lambda: "Apricot" class G: pass def h(): pass l = [1, 2, 3] i = lambda z: (2*18 != 1*36)+'in terms of'+('man', 'women')[z]mod3.py:cool = −273.15
module_game(callable, mod0, mod1, mod2, mod3)
Четирите модула получават
0, -1, 2, -2точки, съответно. - Всеки модул получава
-2А(4,4)точки за всяко число в него, равно на A(g64, g64). За търсене на числа важат правилата от нулевото правило.
Полезни функции
callable— за проверка дали атрибут може да се сметне за функцияgetattr,hasattrtype,isinstance— препоръчваме виisinstance, макар за тази задача иtypeще ви свърши работа- черешката на тортата:
dir
Примерен тест
Връзка: p4-sample.py
Тестът може да изпълните като свалите p4-sample.py, заедно с него в една директория запазите своето решение, именувано p4.py и изпълните p4-sample.py. Крайната ви цел е да получите OK някъде из резултата.
Тестът не гарантира, че сте си решили задачата на 100%, но поне ще ви гарантира, че не сте допуснали глупава грешка, която да ви коства всички точки.