Table of Contents

Cvičení 10, Stavový prostor a objekty

náplň cvičení

Úloha 1 Fronta

Úloha 2 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 3 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

Úloha 4 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 5: 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];
...
}

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 otáčení kruhů

1 0 1 0 0 0
1 1 1 0 1 1
je na následujícím obrázku  Výchozí pozice

1 0 0 0 0 0
1 1 0 1 1 1
v červeném kruhu jsou samé červené kuličky - 0, kromě pozice 0, v zeleném kruhu jsou samé zelené kuličky - 1, kromě pozice 2

(0,m)(1,m)

Příklad

Vstup programu je:

1 0 1 0 0 0
1 0 1 1 1 1

Výstupem programu bude řádka:

(1,p)

Vstup programu je:

1 1 1 0 0 0
1 0 1 1 1 0

Výstupem programu bude řádka:

(1,p)(0,m)

Vstup programu je:

1 0 1 1 0 1
1 1 1 0 0 0

Výstupem programu bude řádka:

(0,m)(1,p)(1,p)(0,p)(1,p)(0,p)

Těžká varianta:

 Cílový stav kruhů

1 2 0 0 0 0
1 1 0 2 1 1
1 2 2 2 2 0
v červeném kruhu jsou samé červené kuličky - 0, kromě pozice 0 a 1, v zeleném kruhu jsou samé zelené kuličky - 1, kromě pozice 2 a 3 a v modrém kruhu jsou samé modré kuličky 2 kromě pozice 0 a 5. Obrázek cílové pozice je v horní části zadání těžké úlohy.

Příklad

Vstup programu je:

1 2 2 0 0 0
1 0 2 1 1 1
0 2 1 2 2 0

Výstupem programu bude řádka:

(1,p)

Vstup programu je:

0 1 2 1 0 0
0 1 2 1 0 2
1 1 1 2 2 1

Výstupem programu bude řádka:

(0,m)(1,m)(1,m)

Vstup programu je:

2 0 1 2 1 1
2 2 1 0 0 1
2 0 0 0 2 2

Výstupem programu bude řádka:

(2,m)(0,p)(1,m)(0,p)(0,p)(2,m)(0,p)