Tato stránka je návodem pro práci s klikátkem. Klikátko je k dispozici jak samostatně (můžete zadat, co potřebujete – může se hodit pro každou úlohu), tak v každé úloze (přednastavené parametry úlohy).
Účelem klikátka je umožnit vám vyzkoušet si, jak se chová vámi vytvořený celulární automat. Celulární automat definujete vytvořením
Celulární automat funguje tak, že vždy vezme nějaký stav mřížky, aplikuje na každou buňku pravidlo (na všechny buňky zároveň), což vytvoří mřížku novou. Tento proces se opakuje pořád dokola, dokud uživatel simulaci nezastaví. Příklad pravidla: “když mám alespoň 3 zelené sousedy a jsem zelená, zůstávám zelená, jinak se stávám šedou”.
Klikátko obsahuje 3 části:
Prostor pro nastavení automatu se nachází na levé straně dole. Nastavujete v něm různé parametry automatu.
Přechodové pravidlo popisuje, jaká bude barva buňky v dalším kroku na základě barvy buňky a barev okolních osmi buněk. Přechodové pravidlo se skládá z jedné nebo více zanořených podmínek. Zápis přechodového pravidla je podobný syntaxi programovacího jazyka Python.
Příklad pravidla:
if ----r---- == 1:
g
else:
r
Toto pravidlo říká: pokud je buňka červená (r), změní se na zelenou
(g), jinak se změní na červenou (r). Význam ----r----
si
ukážeme za chvíli.
Příklad pravidla s více zanořeními:
if ((rrb------ % 2) == 1) or (------bbr >= 2):
if (bb-----bb + kk-----kk) >= 5:
b
else:
k # seda barva
else:
b
Pokud je podmínka splněna (je vyhodnocena jako pravdivá), provede se kód, který za ní následuje (začíná na následujícím řádku za odsazením). Jinak se provede kód ve větvi else – začínající na následujícím řádku za odsazením. Tímto kódem může být buďto písmeno značící barvu, nebo další podmínka.
or
(logické
nebo) a and
(logické a zároveň).<=
,
>=
, <
, >
,
==
(rovnost), !=
(nerovnost).+
,
-
, *
, /
(celočíselné dělení),
%
(zbytek po celočíselném dělení).#
se nezpracovává (včetně tohoto znaku).Podmínka se vyhodnocuje tak, jak byste čekali: výraz and
znamená logické a, <
znamená menší než atp.
Jediným zvláštním výrazem v podmínce je tzv. selektor: to je
například bbb------
nebo kk-----kk
.
Selektor se vždy skládá právě z 9 symbolů. Těmito
symboly mohou být písmena jednotlivých barev, nebo spojovník
-
. Těchto 9 symbolů popisuje po řádcích bezprostřední okolí
buňky. V našem simulátoru má každá buňka vždy právě 8
sousedů.
Příklad: zápis bbb--r--b
značí následující okolí:
b | b | b |
- | - | r |
- | - | b |
Povolené barvy jsou: r: červená, b: modrá, g: zelená, k: šedá. V konkrétních úlohách mohou být omezeny.
Selektor se v podmínce vyhodnocuje na číslo. Toto číslo značí, kolik buněk z okolí se svou barvou shoduje se selektorem. Při tomto porovnávání se ignorují spojovníky (porovnáváme tedy pouze ty buňky, na jejichž pozicích se v selektoru nachází barva). Za každou shodu se zvýší hodnota selektoru o 1.
Příklad: Máme konfiguraci velikosti 4×4:
Pokud použijeme selektor na políčko (x=2, y=2) (červené), dostáváme
číslo 5, protože okolí bbbgrrbbb
souhlasí se selektorem
bbb--r--b
ve všech 5 vybaných barvách.
rrbbbgrrr
.
if ((rrb------ % 2) == 1) or
(------bbr >= 2):
rrbbbgrrr
, tak hodnota selektoru
rrb------
je 3 (všechny 3 barvy souhlasí).rrbbbgrrr
, tak hodnota selektoru
------bbr
je 1 (pouze poslední písmeno r souhlasí).if ((3 % 2) == 1) or (1 >= 2):
. Upravíme:
if (1 == 1) or (1 >= 2):
. Tento výraz platí, takže
pokračujeme na řádek 2 zápisu pravidla.if (bb-----bb + kk-----kk) >= 5:
.if (0 + 0) >= 5:
.Tento proces opakujeme pro každou buňku mřížky.
-
(spojovník) označuje políčko libovolné barvy. Toto
políčko se do výsledné hodnoty selektoru nepočítá.if
) s libovolným počtem vnořených podmínek. Pro ty, kteří
již mají nějaké zkušenosti s programováním: větve typu elif
,
else if
zde nepoužívejte.
if bbb------ >= 1 or ------bbb >= 2:
if kkkkkkkkk >= 5:
b
else:
k
else:
b
Pravidlo zkoumá, jestli je v horním řádku alespoň 1 modrá nebo jsou alespoň 2 modré ve spodním řádku. Pokud ano (tedy platí alespoň jedna z podmínek), tak zjišťuje, jestli je celkem alespoň 5 šedých. Když platí obě podmínky, tak bude prostřední buňka modrá. Pokud platí pouze první podmínka, tak bude šedá. Pokud neplatí ani první podmínka, prostřední buňka bude modrá.
Pokud byste měli nějaké nejasnosti, můžete nahlédnout do gramatiky
jazyka pro zápis přechodového pravidla tak, jak ji akceptuje nástoj
pyparsing
.
color = Word(allowed_colors, exact=1)
integer = Word(string.digits)
selector = Word(allowed_colors + '-', exact=1) * 9
num_operation = infixNotation(
(selector | integer),
[
('*', 2, opAssoc.LEFT),
('/', 2, opAssoc.LEFT),
('+', 2, opAssoc.LEFT),
('-', 2, opAssoc.LEFT),
('%', 2, opAssoc.LEFT),
]
)
operator = oneOf('>= <= != > < ==')
comparison_token = num_operation | selector | integer
comparison = (comparison_token + operator + comparison_token)
bool_expr = infixNotation(
comparison,
[
('and', 2, opAssoc.LEFT),
('or', 2, opAssoc.LEFT),
]
)
rule = Forward()
condition = Word('if') + bool_expr + Word(':') + rule + Word('else:') + rule
rule << (condition | color)