Table of Contents

Cvičení 7

07a

Rekurze

reverse_str.txt:

def reverze(n, s):
    if n<len(s):
        print(n)
        return reverze(n+1,s)+s[n]
    else:
        return ''
    
print(reverze(0,'ahoj'))

str = '''Babička měla syna a dvě dcery. Nejstarší žila mnoho let ve Vídni u přátel, od nichž se vdala. Druhá dcera šla pak na její místo. Syn řemeslník též byl již samostatným a přiženil se do městského domku. Babička bydlela v pohorské vesničce na slezských hranicích, žila spokojeně v malé chaloupce se starou Bětkou, která byla její vrstevnice a již u rodičů sloužila.

Nežila osamotnělá ve své chaloupce; všickni obyvatelé vesničtí byli bratřími jí a sestrami, ona jim byla matkou, rádkyní, bez ní se neskončil ani křest, ani svatba, ani pohřeb.

Tu najednou přišel babičce list z Vídně od nejstarší dcery, v němž jí vědomost dávala, že manžel její službu přijal u jedné kněžny, která má velké panství v Čechách, a sice jen několik mil vzdálenosti od pohorské vesničky, kde babička bydlí. Tam že se nyní s rodinou odstěhuje, manžel pak vždy jen přes léto že tam bude, když i paní kněžna se tam zdržuje. Ke konci listu stála vroucí prosba, aby babička k nim se odebrala navždy a živobytí svoje u dcery a vnoučat strávila, kteří se již na ni těší. Babička se rozplakala; nevěděla, co má dělat! Srdce ji táhlo k dceři a k vnoučátkům, jichž neznala ještě, dávný zvyk poutal ji k malé chaloupce a k dobrým přátelům! Ale krev není voda, touha přemohla dávný zvyk, babička se rozmyslila, že pojede. Chaloupku se vším, co v ní, odevzdala staré Bětce s doložením: „Nevím, jak se mi tam líbit bude a jestli přece zde neumřu mezi vámi." Když jednoho dne vozík u chaloupky se zastavil, naložil naň kočí Václav babiččinu malovanou truhlu, kolovrat, bez něhož být nemohla, košík, v němž byla čtyry chocholatá kuřátka, pytlík s dvěma čtverobarevnými koťaty a pak babičku, která pro pláč ani neviděla před sebe. Požehnáním přátel provázena odejela k novému domovu.'''

print(reverze(0,str))

nested_sum.py

sez=[1,2,[3,4,5],[[6,7],8],[9,[10]]]

def nested_sum(x):
    soucet=0
    for i in x:
        if type(i) == type([]):
            s = nested_sum(i)
            soucet+=s
        else:
            soucet+=i
    print("Soucet",x,"je",soucet)
    return soucet

print(nested_sum(sez))

07b

Hanoiské věže

hanoi.py

tycky = [ [20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1], [], [] ]

def hanoi(n, ze, do, pom):
    if n>0:
        hanoi(n-1, ze, pom, do)
        t = tycky[ze].pop()
        if (len(tycky[do])==0 or tycky[do][-1]>t):
            tycky[do].append(t)
        else:
            print("ERROR - Chyba davame vesti kruh na mensi")
        print("0=", tycky[0], "1=", tycky[1], "2=", tycky[2])
        hanoi(n-1, pom, do, ze)

print("0=", tycky[0], "1=", tycky[1], "2=", tycky[2])
hanoi(len(tycky[0]), 0, 2, 1)

07c

Hlavolam

hlavolam pro tisk skladacka.pdf

hlavolam.py

karty=[
    [1,0,6,4],
    [0,4,6,4],
    [5,0,7,2],
    [1,5,7,3],
    [0,5,7,3],
    [1,5,7,2],
    [2,4,7,2],
    [3,1,6,2],
    [7,5,1,2]]

def souhlas(a,b):
    if a>b:
        a,b=b,a
    return (a%2==0) and (a+1==b)

pouzit = [0]*9
jaka = [-1]*9
otoc = [0]*9

def pasuje(n, k, o):
    if (n==0):
        return True
    elif (n==1 or n==2):
        #test vlevo
        return souhlas(karty[jaka[n-1]][(1-otoc[n-1])%4], karty[k][(3-o)%4])
    elif (n==3 or n==6):
        #test nahore
        return souhlas(karty[jaka[n-3]][(2-otoc[n-3])%4], karty[k][(0-o)%4])
    else:
        #test vlevo i nahore
        return souhlas(karty[jaka[n-1]][(1-otoc[n-1])%4], karty[k][(3-o)%4]) and souhlas(karty[jaka[n-3]][(2-otoc[n-3])%4], karty[k][(0-o)%4])

def najdi(n):
    if (n>=9):
        for l in range(9):
            print("Karta",l,"je",jaka[l],"otoceni",otoc[l])
        print("-------------------------------------")
    else:
        k=0
        while (k<9):
            if pouzit[k]==0:
                o=0
                while (o<4):
                    if pasuje(n,k,o):
                        pouzit[k]=1
                        otoc[n]=o
                        jaka[n]=k
                        najdi(n+1)
                        pouzit[k]=0
                    o+=1
            k+=1

najdi(0)

hlavolam_animace.py (potřebuje instalované opencv z https://opencv.org/)

Také potřebujete obrázky skládačky ve stejném adresáři, ze kterého python spouštíte parts.tgz

import cv2
import numpy as np
import time

karty=[
    [1,0,6,4],
    [0,4,6,4],
    [5,0,7,2],
    [1,5,7,3],
    [0,5,7,3],
    [1,5,7,2],
    [2,4,7,2],
    [3,1,6,2],
    [7,5,1,2]]

def souhlas(a,b):
    if a>b:
        a,b=b,a
    return (a%2==0) and (a+1==b)


parts=[]
for i in range(9):
  parts.append(cv2.imread("part"+str(i)+".png"))

img = np.zeros((3*235, 3*235, 3), np.uint8);
  
def print_img():
    img.fill(255)
    for r in range(3):
     for s in range(3):
      if jaka[r*3+s]>=0:
        i=parts[jaka[r*3+s]]
        if otoc[r*3+s]==1:
          i=cv2.rotate(parts[jaka[r*3+s]], cv2.ROTATE_90_CLOCKWISE)
        elif otoc[r*3+s]==2:
          i=cv2.rotate(parts[jaka[r*3+s]], cv2.ROTATE_180)
        elif otoc[r*3+s]==3:
          i=cv2.rotate(parts[jaka[r*3+s]], cv2.ROTATE_90_COUNTERCLOCKWISE)
        img[235*r:235*r+i.shape[0],235*s:235*s+i.shape[1]] = i
    cv2.imshow("Animation", img)
    cv2.waitKey(10)


pouzit = [0]*9
jaka = [-1]*9
otoc = [0]*9

def pasuje(n, k, o):
    if (n==0):
        return True
    elif (n==1 or n==2):
        #test vlevo
        return souhlas(karty[jaka[n-1]][(1-otoc[n-1])%4], karty[k][(3-o)%4])
    elif (n==3 or n==6):
        #test nahore
        return souhlas(karty[jaka[n-3]][(2-otoc[n-3])%4], karty[k][(0-o)%4])
    else:
        #test vlevo i nahore
        return souhlas(karty[jaka[n-1]][(1-otoc[n-1])%4], karty[k][(3-o)%4]) and souhlas(karty[jaka[n-3]][(2-otoc[n-3])%4], karty[k][(0-o)%4])

def najdi(n):
    if (n>=9):
        for l in range(9):
            print("Karta",l,"je",jaka[l],"otoceni",otoc[l])
        print("-------------------------------------")
        time.sleep(5)
    else:
        k=0
        while (k<9):
            if pouzit[k]==0:
                o=0
                while (o<4):
                    if pasuje(n,k,o):
                        pouzit[k]=1
                        otoc[n]=o
                        jaka[n]=k
                        print_img()
                        najdi(n+1)
                        pouzit[k]=0
                        jaka[n]=-1
                    o+=1
            k+=1

najdi(0)

courses/b3b33alp/cviceni/kratka_videa/c07.txt · Last modified: 2022/01/25 16:33 by stepan