Riešenie 13. cvičenia


  1. Riešenie:

    >>> modra = vyrob(7, 7, 3)
    >>> vypis(modra)
    3 3 3 3 3 3 3
    3 3 3 3 3 3 3
    3 3 3 3 3 3 3
    3 3 3 3 3 3 3
    3 3 3 3 3 3 3
    3 3 3 3 3 3 3
    3 3 3 3 3 3 3
    

  1. Riešenie:

    modra = vyrob(7, 7, 3)
    
    canvas = tkinter.Canvas()
    canvas.pack()
    vykresli(modra)
    

  1. Riešenie:

    b = [[0, 1, 1, 1, 0],
         [0, 1, 0, 0, 1],
         [0, 1, 1, 1, 0],
         [0, 1, 0, 0, 1],
         [0, 1, 1, 1, 0]]
    
    f = [[0, 2, 2, 2, 2],
         [0, 2, 0, 0, 0],
         [0, 2, 2, 2, 0],
         [0, 2, 0, 0, 0],
         [0, 2, 0, 0, 0]]
    
    g = [[0, 0, 3, 3, 3],
         [0, 3, 0, 0, 0],
         [0, 3, 0, 3, 3],
         [0, 3, 0, 0, 3],
         [0, 0, 3, 3, 0]]
    

  1. Riešenie:

    def zvys(tab, o_kolko=1):
        for riadok in tab:
            for i in range(len(riadok)):
                riadok[i] = (riadok[i] + o_kolko) % 4
    

  1. Riešenie:

    modra = vyrob(7, 7, 3)
    for i in range(2, 5):
        for j in range(2, 5):
            modra[i][j] = 0
    vykresli(modra)
    

  1. Riešenie:

    def obdlznik(tab, r1, s1, r2, s2, hodnota):
        for i in range(r1, r2 + 1):
            for j in range(s1, s2 + 1):
                tab[i][j] = hodnota
    
    modra = vyrob(7, 7, 3)
    obdlznik(modra, 2, 2, 4, 4, 0)
    vykresli(modra)
    
    test = vyrob(12, 12, 0)
    obdlznik(test, 2, 1, 4, 5, 1)
    obdlznik(test, 6, 1, 10, 5, 2)
    obdlznik(test, 1, 7, 9, 10, 3)
    vykresli(test)
    

  1. Riešenie:

    def sachovnica(n, h1, h2):
        vysl = [0] * n
        h = h1, h2
        for i in range(n):
            r = [0] * n
            for j in range(n):
                r[j] = h[(i+j) % 2]
            vysl[i] = r
        return vysl
    

  1. Riešenie:

    def mala_nasobilka(n):
        vysl = [0] * n
        for i in range(n):
            r = [0] * n
            for j in range(n):
                r[j] = (i+1)*(j+1)
            vysl[i] = r
        return vysl
    

  1. vo verzii vyrob1 sa rozkopíruje premenná riadok do všetkých riadkov štvorcovej tabuľky - všetky obsahujú čísla od 1 do n:

    1 2 3 4 5 6
    1 2 3 4 5 6
    1 2 3 4 5 6
    1 2 3 4 5 6
    1 2 3 4 5 6
    

    vo verzii vyrob2 premenná riadok má pre každý riadok štvorcovej tabuľky novú referenciu - každý ďalší riadok je o 1` dlhší od predchádzajúceho:

    1
    1 2
    1 2 3
    1 2 3 4
    1 2 3 4 5
    

  1. Riešenie:

    def vykresli(tab, vel=20):
        farby = ('white', 'black', 'red', 'blue', 'green', 'yellow')
        canvas.delete('all')
        for i, riadok in enumerate(tab):
            for j, prvok in enumerate(riadok):
                x, y = j*vel, i*vel
                farba = farby[prvok % len(farby)]
                canvas.create_rectangle(x, y, x+vel, y+vel,
                                        fill=farba, outline='light gray')
        canvas.update()
    
    tab = vyrob(50, 50, 0)
    for i in range(50):
        for j in range(50):
            tab[i][j] = random.randrange(8)
    vykresli(tab, 5)
    

  1. Riešenie:

    def otoc(tab):
        n = len(tab)
        vysl = [0] * n
        for j in range(n):
            riadok = []
            for i in reversed(range(n)):
                riadok.append(tab[i][j])
            vysl[j] = riadok
        return vysl
    
    for i in range(40):
        vykresli(b)
        canvas.after(2000)
        b = otoc(b)
    

  1. Riešenie:

    def spoj(tab1, tab2):
        vysl = []
        for i in range(len(tab2)):
            vysl.append(tab1[i] + tab2[i])
        return vysl
    

  1. Riešenie:

    def nahodne():
        tab = []
        for i in range(n):
    ##        p = []
    ##        for j in range(n):
    ##            p.append(random.randint(0, 1))
    ##        tab.append(p)
            tab.append([0] * n)
        k = 10
        for i in range(k):
            tab[n//2][(n-k)//2 + i] = 1
        return tab
    

  1. Riešenie:

    def kruh(tab, r, r1, s1, hodnota):
        n = len(tab)
        for i in range(n):
            for j in range(n):
                vzd = ((i-r1)**2 + (j-s1)**2) ** 0.5
                if vzd <= r:
                    tab[i][j] = hodnota
    
    t = vyrob(50, 50)
    kruh(t, 17, 20, 30, 2)
    kruh(t, 13, 40, 25, 3)
    kruh(t, 10, 15, 15, 1)
    kruh(t, 8, 15, 15, 0)
    vykresli(t, 5)
    

  1. Riešenie:

    def zapis(tab, meno_suboru):
        with open(meno_suboru, 'w') as subor:
            for riadok in tab:
                for prvok in riadok:
                    print(prvok, end=' ', file=subor)
                print(file=subor)
    

  1. Riešenie:

    def citaj(meno_suboru):
        vysl = []
        with open(meno_suboru) as subor:
            for riadok in subor:
                riadok = riadok.split()
                for i in range(len(riadok)):
                    riadok[i] = int(riadok[i])
                vysl.append(riadok)
        return vysl
    

  1. Riešenie:

    def do_radu(tab):
        vysl = []
        for riadok in tab:
            vysl.extend(riadok)
        return vysl
    

  1. Riešenie:

    def do_dvojrozmernej(postupnost, sirka):
        vysl = []
        riadok = []
        for prvok in postupnost:
            riadok.append(prvok)
            if len(riadok) == sirka:
                vysl.append(riadok)
                riadok = []
        if riadok:
            vysl.append(riadok)
        return vysl
    

    alebo:

    def do_dvojrozmernejx(postupnost, sirka):
        vysl = []
        zoz = list(postupnost)
        while zoz:
            vysl.append(zoz[:sirka])
            zoz = zoz[sirka:]
        return vysl