Четвърта задача
Брой точки, които дава задачата: 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
,hasattr
type
,isinstance
— препоръчваме виisinstance
, макар за тази задача иtype
ще ви свърши работа- черешката на тортата:
dir
Примерен тест
Връзка: p4-sample.py
Тестът може да изпълните като свалите p4-sample.py
, заедно с него в една директория запазите своето решение, именувано p4.py
и изпълните p4-sample.py
. Крайната ви цел е да получите OK някъде из резултата.
Тестът не гарантира, че сте си решили задачата на 100%, но поне ще ви гарантира, че не сте допуснали глупава грешка, която да ви коства всички точки.