Table of Contents

Cvičení 10, Stavový prostor a objekty

náplň cvičení

Úloha 1 Přelévání nádob

Mějme tři nádoby o objemu 2, 5, 9. S nádobami můžeme provádět následující akce:

Napište program, který najde nejrychlejší způsob, jak získat v poslední nádobě objem 6. Nejrychlejší znamená s nejmenším počtem kroků.

Úkol 2: Genealogie

class Person:
    def __init__(self, name, sex):
        self.name = name
        self.sex = sex   
        self.children = []  
        self.parents = []   # parents of this node
        self.partner = None   # partner (=husband/wife of this node)
 
    def addChild(self, node):
        self.children.append(node)
 
    def addParent(self, node):
        self.parents.append(node)
 
    def setPartner(self, node):
        self.partner = node
 
    def __repr__(self):
        s = "Female" if self.sex == 'F' else "Male" 
        return self.name + " " + s

Vstupní soubor family.txt:

M Jana Jan F M
P Jana Martin F M
P Jana Robert F M
P Robert Gabriel M M
P Robert Oleg M M
P Robert Ondrej M M
P Martin Jiri M M
P Martin Rudolf M M
P Jan Petra M F
P Jan Uxana M F
P Uxana Klara  F F
P Uxana Jakub F M
P Uxana Adam F M
P Petra Alex F M
P A C M M
P A D M F
P D K F F
P C J M M 
P C I M F
P C H M M
P B E F F
P B F F M 
P B G F F

Schéma rodiny ve family.txt:

Prémie navíc: zobrazení přes dot format

Uložení načtených dat do ' Dot ' souboru, který lze pak vykreslit do png nástrojem dot z balíku nástrojů Graphviz:

dot -Tpng family.dot  > family.png

Příklad family.dot:

digraph G {
Jana[ color=red];
Jana->Martin [label="child"];
Jana->Robert [label="child"];
Jana->Jan[color=blue; penwidth=4];
Jan[ color=green];
Jan->Petra [label="child"];
Jan->Uxana [label="child"];
Jan->Jana[color=blue; penwidth=4];
Martin[ color=green];
Martin->Jiri [label="child"];
Martin->Rudolf [label="child"];
Martin->Jana [style=dashed];
...
}

Úloha 3 Komentáře - rozšíření

a='b\'c#d' #e
i="j\"k'l#m" #n

def preskoc_komentare(line):
  # vytiskne obsah souboru 'f' s vynechanymi komentari
  stav=0          # počáteční stav automatu
  for c in line:  # přečti jeden znak
    if stav==0:   # počáteční stav
      if c=="#":  # začátek komentáře
        stav=1
        continue        
      elif c=='\"':
        stav=2    # začátek řetězce
    elif stav==1: # 1="komentar"
      continue
    elif stav==2:
      if c=='\"':
        stav=0
    print(c,end="") # vytiskni znak
 
i=input()
preskoc_komentare(i)  # nacti radku a preskakuj

Úloha 4 Kontrola reálného čísla

floatnumber   ::=  pointfloat | exponentfloat
pointfloat    ::=  [intpart] fraction | intpart "."
exponentfloat ::=  (intpart | pointfloat) exponent
intpart       ::=  digit+
fraction      ::=  "." digit+
exponent      ::=  ("e" | "E") ["+" | "-"] digit+
digit         ::=  "0"..."9"

Úloha 5 Obsahy závorek

aa[bb(cc)dd(ee)fff[gggg]]hhh

()cc
()ee
[]gggg
[]bbddfff

Domácí práce - Hlavolamy

Znalosti k vyřešení následujících úloh budou postupně rozebírány na cvičeních, proto je termín odevzdání úloh až do konce semestru.

Hlavolamy jsou inspirovány hrami pro Android Can you escape the 100 room I-XII, kde najdete plno podobných zajímavých hlavolamů.

Lehká varianta:

Příklad

Vstup programu je:

4 1 2 3 5 0 0

Výstupem programu bude řádka:

06 10 21 32 63
protože je to nejkratší posloupnost tahů, která složí daný hlavolam.

tah 06 tah 10 tah 21 tah 32 tah 63

Těžká varianta:

Napište program rotate.py pro úlohu HW09, který zjistí, jak složit následující hlavolam:

Protože operace tahu jsou komutativní (nezáleží na pořadí provedených rotací), tak bude program hledat jenom počet rotací spojených s jednotlivými pozicemi. Bude nás zajímat jen nejkratší řešení, tedy řešení s nejmenším počtem provedených rotací.

Vstup programu bude ze standardního vstupu:

Výstup programu bude na standardní výstup:

Příklad

Vstup programu je stav obrázku, který má horní prostřední díl otočen dolů:

0 2 0 0 0 0 0 0 0

Výstupem programu bude řádka (kontrolu si zkuste sami, řádka značí, že se bude 2x rotovat podle prostředního dílku a 2x rotovat podle všech dílků spodní řady):

0 0 0 0 2 0 2 2 2

Vstup programu je stav obrázku, který má jen levý horní roh otočen doprava, ostatní dílky jsou správně:

1 0 0 0 0 0 0 0 0

Výstupem programu bude řádka:

3 0 3 0 2 1 3 1 2