Programovací jazyk xKarel
Programovací jazyk Karel je takmer svetoznámy.
Učíte sa v ňom programovať pomocou robota s menom Karel.
Verzií Karlov je veľmi veľa a tak som Vám vybral jedného open source Karla pod názvom xKarel.
xKarel preto, že tento Karel je 3D a open source, funkčný pod OS Linux i Windows.
Texty zadaní sú stiahnuté priamo z domovskej stránky projektu xKarel http://xkarel.sourceforge.net.
Zadanie 01
Otočte robota Karla na západ. Robot Karel je otočen na západ, jestliže je na šachovnici otočen směrem do leva.
Predpoklady
- Robot není otočen na západ
procedure start
{
While NOT IsNorth
{
TurnLeft
}
TurnLeft
}
Zadanie 02
Na každé políčko na sloupci, na kterém Karel stojí před spuštěním
procedury start, postavte jednu cihlu. Jinýmy slovy, postarejte se, ať
na aktuálním sloupci stojí právě jedna cihla. Aktuální sloupec je
sloupec, na němž Karel stojí před vykonáním procedury start.
Predpoklady
- V místnosti nejsou žádné cihly.
- Maximální počet cihel na jednom políčku je minimálně 1.
procedure start
{
While NOT IsNorth
{
TurnLeft
}
While NOT IsWall
{
Move
}
TurnLeft
TurnLeft
While NOT IsWall
{
Put
Move
}
Put
}
Zadanie 03
Na každém políčku na sloupci, na kterém Karel stojí před spuštěním
procedury start, musí po ukončení procedury start stát právě jedna
cihla. Jinýmy slovy, postarejte se, ať na aktuálním sloupci stojí právě
jedna cihla. Aktuální sloupec je sloupec, na němž Karel stojí před
vykonáním procedury start.
Predpoklady
- Maximální počet cihel na jednom políčku je minimálně 1.
procedure start
{
While NOT IsNorth
{
TurnLeft
}
While NOT IsWall
{
Move
}
TurnLeft
TurnLeft
While NOT IsWall
{
While IsBrick
{
Take
}
Put
Move
}
While IsBrick
{
Take
}
Put
}
Zadanie 04
V místnosti se na nějakém poli nachází jedna cihla. Postavte robota
Karla na políčko, na kterém je cihla. Jinýmy slovy, ať Karel najde
políčko s cihlou a postaví se na něj.
Predpoklady
- V místnosti je jen jedna cihla.
- Maximální počet cihel na jednom políčku je minimálně 1.
procedure start
{
# Karel sa presunie domov
While NOT IsNorth
{
TurnLeft
}
TurnLeft
TurnLeft
TurnLeft
While NOT IsWall
{
Move
}
TurnLeft
TurnLeft
TurnLeft
While NOT IsWall
{
Move
}
While NOT IsNorth
{
TurnLeft
}
# Koniec Karlovho presunu domov
While NOT IsBrick
{
IsWall
{
IsNorth
{
TurnLeft
Move
TurnLeft
}
else
{
TurnLeft
TurnLeft
TurnLeft
Move
TurnLeft
TurnLeft
TurnLeft
}
}
else
{
Move
}
}
}
Zadanie 05
V místnosti jsou rozmístěny cyhly. Na každém políčku je nějaký počet
cihel. Najděte políčko s nejmenším počtem cihel a postavte na něj
Karla. S cihlami můžete libovolně hýbat. Karel ale po skončení
procedury start musí stát na políčku, na kterém bylo před zavoláním
procedury start nejméně cihel.
Predpoklady
- Místnost má rozměry 3x3 políček.
- V místnosti nejsou dvě políčka, které mají stejný počet cihel.
- Maximální počet cihel na jednom políčku je 20.
procedure domov
{
# Karel sa presunie domov
While NOT IsNorth
{
TurnLeft
}
TurnLeft
TurnLeft
TurnLeft
While NOT IsWall
{
Move
}
TurnLeft
TurnLeft
TurnLeft
While NOT IsWall
{
Move
}
While NOT IsNorth
{
TurnLeft
}
# Koniec Karlovho presunu domov
}
procedure start
{
domov
While IsBrick
{
Take
IsWall
{
IsNorth
{
TurnLeft
IsWall
{
domov
}
else
{
Move
TurnLeft
}
}
else
{
TurnLeft
TurnLeft
TurnLeft
IsWall
{
domov
}
else
{
Move
TurnLeft
TurnLeft
TurnLeft
}
}
}
else
{
Move
}
}
}
Zadanie 06
Robot stojí na políčku, na kterém je nějaký počet cihel. Počet cihel
je 0 až 99. Zajistěte, aby na tomto poli stálo tolik cihel, kolik je
zbytek po celočíselném dělení původního počtu číslem 4. Operace zbytku
po celočíselném dělení je někdy nazývána modulo, označována je mod.
Označme tedy původní počet cihel jako N. Úkolem je, aby Karel zanechal
na poli (N mod 4) cihel. Například na poli stojí 20 cihel, nezůstane
tam žádná. Protože 20 / 4 je 5 zbytek 0. Nebo například na poli stojí
41 cihel, potom tam musí zůstat jedna, protože 41 / 4 je 10 zbytek 1.
Dovoluji si připomenout, že 0 / 4 je 0 zbytek 0. Jedna z možností,
kterou ale nedoporučuji, je mít mnoho do sebe vnořených podmínek je
cihla a odchytit tak všech 100 možností. Takový zdrojový text by byl
ale velice nepraktický. Existuje jiné, lepší řešení. Všimněte si v
předpokladech, že máte k dipozici na sever od Karla dvě pole. Napovím,
že na ně můžete odkládat cihly.
Predpoklady
- Na sever od Karla jsou dvě prázdná pole.
- Maximální počet cihel na jednom políčku je 99.
procedure start
{
IsBrick
{
# Prva
Take
IsBrick
{
# Druha
Take
IsBrick
{
# Tretia
Take
IsBrick
{
# Stvrta
Take
# Rekurzia
start
}
else
{
Put
Put
Put
}
}
else
{
Put
Put
}
}
else
{
Put
}
}
}
Zadanie 07
Robot stojí na políčku, na kterém je nějaký počet cihel. Počet cihel
je 0 až 99. Na políčku severně od robota je nějaký počet cihel.
Zajistěte, aby na poli, na kterém robot stojí před zavoláním procedury
start stálo tolik cihel, kolik je zbytek po celočíselném dělení
původního počtu cihel s číslem, které udává počet cihel na sever od
Karla. Operace zbytku po celočíselném dělení je někdy nazývána modulo,
označována je mod. Označme tedy původní počet cihel na poli, kde Karel
stojí jako N. Počet cihel na poli severně od Karla označme M. Úkolem
je, aby Karel zanechal na původním poli (kde stálo N cihel) N mod M
cihel. Například na poli stojí 20 cihel, na sever od Karla stojí 4
cihly. Nezůstane tam žádná. Protože 20 / 4 je 5 zbytek 0. Nebo
například na poli stojí 41 cihel, na poli severně od Karla stojí 5.
Potom tam musí zůstat jedna, protože 41 / 5 je 8 zbytek 1. Dovoluji si
připomenout, že 0 / COKOLIV je 0 zbytek 0.
Predpoklady
- Maximální počet cihel na jednom políčku je 99.
- Na sever od Karla jsou dvě pole.
- Na sever od Karla je pole, na kterém je alespoň jedna cihla.
procedure A
{
# Priprava
While NOT IsNorth
{
TurnLeft
}
Move
Move
While IsBrick
{
Take
}
TurnLeft
TurnLeft
Move
Move
TurnLeft
TurnLeft
# Koniec pripravy
}
procedure B
{
IsBrick
{
Take
Move
While IsBrick
{
Take
Move
Put
TurnLeft
TurnLeft
Move
IsBrick
{
Move
TurnLeft
TurnLeft
IsBrick
{
Take
Move
}
}
else
{
# Vrati spat z 3. pola na 2. pole
TurnLeft
TurnLeft
Move
TurnLeft
TurnLeft
While IsBrick
{
Take
Move
Put
TurnLeft
TurnLeft
Move
TurnLeft
TurnLeft
}
Move
Move
TurnLeft
TurnLeft
# Rekurzivne volanie
B
}
}
}
}
procedure C
{
# Presunie zvysok z 3. pola na 1. pole
Move
Move
TurnLeft
TurnLeft
While IsBrick
{
Take
Move
Move
Put
TurnLeft
TurnLeft
Move
Move
TurnLeft
TurnLeft
}
Move
Move
TurnLeft
TurnLeft
}
procedure start
{
A
B
C
}