Třetí série prvního ročníku KSP
Tyto úlohy pocházejí z desetileté ročenky KSP. Jejich řešení bohužel nemáme v elektronické podobě, takže na ně budete muset přijít sami.Zadání úloh
1-3-1 Pokrytí matice
Nechť A je celočíselná matice velikosti m ×n obsahující nuly a jedničky. Nechť linie je společný název pro řádky a sloupce. Množinu linií P nazveme pokrytím matice A, jestliže každý nenulový prvek matice A leží alespoň v jedné linii množiny P. Napište program, který vytiskne velikost nejmenšího pokrytí zadané matice.
Příklad: Pro matici
( | 1 | 0 | 0 | ) |
1 | 1 | 1 | ||
1 | 0 | 0 |
program vytiskne 2.
1-3-2 Král a dáma
Zadavatel hry postaví na některé pole šachovnice 8×8 černého krále. Řešitel, který na šachovnici nevidí, v každém kroku zvolí jedno pole. Zadavatel na toto pole na okamžik postaví bílou dámu a ohlásí:
- král je v šachu
- král není v šachu
- dáma stojí na témže poli jako král.
Napište program umožňující hrát tuto hru v obsazení: zadavatel=člověk, řešitel=počítač.
1-3-3 Yaghobiánská osmička
Nechť A je matice velikosti 3×3 obsahující právě jednou každé z čísel 1, 2, … , 9. Tahem rozumíme takovou záměnu obsahu prvků Ai,j, Ak,l, pro kterou platí:
- Ai,j=9 a zároveň
- i=k ∧ |j-l |= 1 nebo j=l ∧ |i-k |= 1.
Napište program, jenž k zadané matici najde posloupnost tahů, které tuto matici převedou na seřazenou, a vytiskne indexy k, l všech tahů posloupnosti.
1-3-4 Interpret jazyka ZÁLIBY
Programovací jazyk ZÁLIBY pracuje s celými čísly z rozsahu 0 až
32767. Programy v něm napsané používají zásobník celých čísel.
Zásobník je datová struktura se dvěma operacemi: přidání prvku
a odebrání nejnovějšího prvku. Nejnovější prvek v zásobníku
budeme označovat TOS
, druhý nejnovější NOS
. Program (posloupnost
znaků) se skládá z následujících příkazů:
- Posloupnost číslic – uloží na zásobník hodnotu celého čísla daného touto posloupností číslic (dvě čísla vedle sebe se oddělují mezerou)
- Některý ze znaků
+
,-
,*
,/
odebere ze zásobníkuTOS
aNOS
a jejich součet (rozdíl, součin, podíl) uloží na zásobník, tzn.NOS
+TOS
→TOS
,NOS
-TOS
→TOS
,NOS
·TOS
→TOS
,NOS
/TOS
→TOS
, kde / znamená celočíselné dělení. =
odebereTOS
aNOS
, porovná je a rovnají-li se, uloží na zásobník číslo 1, jinak 0.<
odebereTOS
aNOS
, porovná je a je-liNOS
<TOS
, uloží na zásobník číslo 1, jinak 0.;
odebereTOS
a dvakrát ho uloží na zásobník.?:!
(obdoba příkazuIF
) se smí vyskytnout jen v kontextu:Odebere?
posloupnost příkazů:
posloupnost příkazů!
TOS
a je-li nenulový, provede posloupnost příkazů mezi?
a:
, je-liTOS
nulový, provede posloupnost příkazů mezi:
a!
. Poté provádění programu pokračuje za!
. Jsou-li příkazy?:!
vnořeny, vztahují se:
a!
k nejbližšímu předcházejícímu?
.[@]
(obdoba cyklu while) se smí vyskytnout pouze v kontextu:Provede posloupnost příkazů mezi[
posloupnost příkazů@
posloupnost příkazů]
[
a@
a pak odebere ze zásobníkuTOS
. Je-li nenulový, provede posloupnost příkazů mezi@
a]
a provádění programu pokračuje opět od[
. Je-liTOS
nulový, výpočet pokračuje za]
. Jsou-li příkazy[@]
vnořeny, vztahují se@
a]
k nejbližšímu předcházejícímu znaku[
..
odebereTOS
a jeho hodnotu vytiskne.
Příkazy mohou (ale nemusí) být odděleny mezerami.
Příklad: Program 10[;@;;*.1-]
vytiskne druhé mocniny celých čísel 10, 9, … , 1.
Úlohy:
- Napište program (tzv. interpret), který načte ze vstupu program v jazyce ZÁLIBY a provede ho. Zásobník je na začátku výpočtu prázdný. Interpret by měl rozpoznat nejrůznější druhy chyb, jako neznámý příkaz, výsledek aritmetické operace mimo stanovený rozsah apod.
- Zkuste jazyk ZÁLIBY rozšířit tak, aby se v něm už dalo něco naprogramovat.