Záverečný test z Programovania (1) 2017/2018

  1. Pre danú rekurzívnu funkciu pocet(pole1, pole2):

    def pocet(pole1, pole2):
        if len(pole2) == 0:
            return 0
        if len(pole2) == 1:
            return int(pole2[0] in pole1)
        stred = len(pole2) // 2
        return pocet(pole1, pole2[:stred]) + pocet(pole1, pole2[stred:])
    

    zistite výsledok volania:

    >>> pocet('a m', 'mama ma emu')
    

  1. Korytnačka t nakreslí pomocou tejto rekurzívnej funkcie binárny strom:

    def strom(d):
        t.fd(d)
        if d > 10:
            t.lt(40)
            strom(d // 2)
            t.rt(75)
            strom(d // 3)
            t.lt(35)
        t.bk(d)
    

    Pri tomto kreslení sa otáča vľavo aj vpravo. Zistite o aký celkový uhol sa otočí vľavo (súčet všetkých otočení vľavo) a o aký vpravo po zavolaní:

    >>> strom(50)
    

  1. Programovali sme funkciu zisti_dlzky(tab), ktorá zistí, či sú všetky riadky neprázdnej vstupnej tabuľky rovnako dlhé, ak áno, funkcia vráti túto dĺžku, inak vráti None:

    def zisti_dlzky(tab):
        i = 0
        while i < len(tab):
            if i == 0:
                ________________________
            elif ________________________:
                vysl, i = None, len(tab)
            i += 1
        return vysl
    

    Dopíšte vyznačené časti.


  1. Máme definované tieto dve triedy, pričom trieda FarebnyBod je odvodená od Bod:

    class Bod(object):
        def __init__(self, x, y):
            self.x, self.y = x, y
    
        def posun(self, dx=0, dy=0):
            self.x += dx
            self.y += dy
    
    class FarebnyBod(Bod):
        def __init__(self, x, y, farba='black'):
            self = Bod(x, y)
            farba = self.farba
    
        def zmen(self, farba=None, dx=0, dy=0):
            if self.farba is not None:
                farba = self.farba
            Bod.posun(dx, dy)
    

    Opravte všetky chyby. Neopravujte to, čo nie je chyba.


  1. Dopíšte funkciu ako(hodnota1, hodnota2), ktorá najprv zistí typ prvého parametra hodnota1 a potom sa pokúsi pretypovať na tento typ druhý parameter hodnota2. Ak sa toto pretypovanie úspešne podarí, funkcia vráti túto pretypovanú hodnotu, inak vráti None. Ošetrite výnimky ValueError a TypeError:

    def ako(hodnota1, hodnota2):
        typ = type(hodnota1)
        ________________________________:
            return ________________________
        ________________________________:
            return ________________________
    

  1. Prepíšte nasledovný výraz tak, aby v ňom neboli volania magických metód:

    a.__sub__(b.__mul__(c)).__add__(d.__pow__(e))
    

  1. Opravte chyby vo funkcii vsetky(postupnost), ktorá by mala vrátiť množinu všetkých dvojíc z prvkov zadanej postupnosti. Ak je v tejto množine dvojica (a, b) nemala by sa v nej objaviť dvojica (b, a). Funkcia tiež odfiltruje dvojice rovnakých hodnôt. Nedopisujte ďalší kód, len opravte chyby.

    def vsetky(postupnost):
        vysl = {}
        for prvy in postupnost:
            for druhy in set(postupnost) - prvy:
                if druhy, prvy not in vysl:
                    vysl.add(prvy, druhy)
        return vysl
    

    Napr. by malo fungovať:

    >>> vsetky('java')
    {('j', 'v'), ('j', 'a'), ('a', 'v')}
    

  1. Dopíšte funkciu dve_kocky(n), ktorá bude simulovať hody dvoch hracích kociek (s číslami od 1 do 6) a evidovať si, koľkokrát padol ktorý súčet. Zrejme súčty budú čísla od 2 do 12. Funkcia bude simulovať n takýchto hodov dvomi kockami a vráti dvojicu (sučet, počet) najčastejšieho padnutého súčtu a počet koľkokrát padol.

    from random import randint as ri
    
    def dve_kocky(n):
        pocet = {}
        for i in range(n):
            sucet = ri(1, 6) + ri(1, 6)
            pocet[sucet] = _________________________________
        naj = None
        for suc, poc in _____________________:
            if ___________________________________:
                naj = suc
        return _________________________________
    

  1. Zistite, čo sa vypíše:

    def zisti_mn(veta):
        v1, v2 = veta[:-1], veta[1:]
        z = [(v1[i], v2[i]) for i in range(len(v1))]
        return {a+b for a, b in z}
    
    >>> zisti_mn('mama_ma_emu_a_ema_ma_mamu')
    

  1. Dopíšte funkciu vyrob(n), ktorá vyrobí dvojrozmernú tabuľku veľkosti n x n, pričom všetky prvky sú očíslované po riadkoch od 1 do n*n. Napr.

    >>> vyrob(3)
    [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    

    Zapíšte to pomocou generátorovej notácie:

    def vyrob(n):
        return _______________________________