skip to navigation
skip to content

feed icon RSS хранилка

Четвърта задача

Публикувано на 24.04.2008 20:05 от николай
Последна промяна на 06.05.2008 13:51
Тази публикация е от предишно издание на курса, моля не разчитайте на актуалността на информацията.

Брой точки, които дава задачата: 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,)
  • Може да разчитате, че тези условия ще бъдат изпълнени и няма нужда да ги проверявате.

Правила на играта:

За атрибути по-надолу (за всички правила) ще смятаме само тези реални атрибути на модулите, които не започват с _ (долна черта, подчертавка)

  1. Всеки модул получава по една точка за всяко просто число в него. Числата в един модул включват както целочислените му атрибути, така и целите числа в речниците, списъците, списъците в списъците, списъците в списъците в списъците и т.н. Ето пример за модул, който получава 3 точки:
    s = "baba"
    l = [6, (511,), [99, 63, [18, 70], 7907]]
    n = (2, (4, (6, (9, (2,)))))
    
  2. Всеки модул получава по три точки за всеки модул в него, който се казва antigravity или soul.
  3. Всеки модул получава по една точка за всеки речник в него, чието име е анаграма на името на функция в модула. Пример, който получава една точка по това правило:
    mary = {}
    lalala = [9, 11, 2, 3, 4]
    army = lambda: "Complain to pop@armenia.com"
    def llaalla():
        print "i > u > i"
    
  4. Всеки модул получава толкова точки, колкото е закръглената надолу разлика между броя атрибути, отговарящи на 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 точки, съответно.

  5. Всеки модул получава -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%, но поне ще ви гарантира, че не сте допуснали глупава грешка, която да ви коства всички точки.