Programovací jazyk xKarel


home

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 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 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 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 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 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 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 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
}