Autorské riešenie
[stiahni imp : py]

  • Počet riešiteľov: 10 / 10 = 100 %

  • Úspešnosť riešenia: 4,3 / 6 = 72 %

Úlohou bolo vytvoriť program, ktorý bude šifrovať správy posielané korytnačou poštou. Zašifrovaný text vznikne z pôvodného textu tak, že pôvodný text rozdelíme na dve časti tak, aby sa počet znakov v prvej časti čo najmenej líšil od počtu znakov v druhej časti. To znamená, že ak je počet znakov v pôvodnej správe párny, obe časti budú mať rovnaký počet znakov. V opačnom prípade bude mať jedna časť o jeden znak viac. Keďže začíname znaky vyberať z prvej časti a znaky sa majú do šifrovanej správe vyberať na striedačku, dlhšia o jeden znak bude prvá časť.

Pôvodnú správu nemusíme rozdeľovať na dve časti. Stačí, ak si pamätáme pozíciu znaku, ktorý berieme z prvej časti a pozíciu znaku, ktorý berieme z druhej časti.

Imagine logo čísluje znaky textu od 1, Python od 0. Pri opakovaní cyklu čísluje Imagine logo iterácie cyklu od 1, Python od 0. Aby sme sa nepoplietli, ukážme si riešenie pre Imagine logo a pre Python zvlášť.

Imagine logo

Keďže Imagine logo čísluje znaky v reťazcoch od 1, je výhodné vypočítať si index, kde končí prvá časť.

Pozíciu konca prvej časti správy vypočítame nasledovne:

urobTu "koniec1 cPodiel (1 + pocet :sprava) 2

Ak z prvej časti zoberieme znak na pozícii i, tak z druhej časti zoberieme znak na pozícii koniec1 + i.

sifrovany retazec

Pozorný čitateľ si isto všimne, že problém nastane, ak počet znakov je nepárne číslo. Posledný znak z prvej časti nebude mať svoj pár z druhej časti. 

sifrovany text

Túto situáciu vyriešime tak, že si vypočítame počet dvojíc znakov. Jeden znak z prvej časti a druhý znak z druhej časti. Prípadný, zvyšujúci sa znak z prvej časti vyriešime individuálne. Táto situácia nastane, ak počet znakov je nepárny. Počet dvojíc znakov vypočítame:

urobTu "pocetDvojic cPodiel pocet :sprava 2

Výsledná procedúra môže vyzerať nasledovne:

;Imagine logo
viem sifruj :sprava
  urobTu "pocetDvojic cPodiel pocet :sprava 2
  urobTu "koniec1 cPodiel (1 + pocet :sprava) 2
  urobTu "sifra "
  opakuj :pocetDvojic [
    urobTu "sifra slovo :sifra prvok pocitadlo :sprava
    urobTu "sifra slovo :sifra prvok (:koniec1 + pocitadlo) :sprava
  ]
  ak zvysok pocet :sprava 2 = 1[
    vy slovo :sifra prvok :koniec1 :sprava
  ]
  vy :sifra
koniec

Python

Keďže Python čísluje znaky v reťazcoch od 0, je výhodné vypočítať si index, kde začína druhá časť.

Pozíciu začiatku druhej časti správy vypočítame nasledovne:

zaciatok2 = (1 + len(sprava)) // 2

Ak z prvej časti zoberieme znak na pozícii i, tak z druhej časti zoberieme znak na pozícii zaciatok2 + i.

sifrovany text

Pozorný čitateľ si isto všimne, že problém nastane, ak počet znakov je nepárne číslo. Posledný znak z prvej časti nebude mať svoj pár z druhej časti.  

sifrovany text

Túto situáciu vyriešime tak, že si vypočítame počet dvojíc znakov. Jeden znak z prvej časti a druhý znak z druhej časti. Prípadný, zvyšujúci sa znak z prvej časti vyriešime individuálne. Táto situácia nastane, ak počet znakov je nepárny. Počet dvojíc znakov vypočítame:

pocet_dvojic = len(sprava) // 2

Výsledná funkcia môže vyzerať nasledovne: 

#Python
def sifruj(sprava):
    pocet_dvojic = len(sprava) // 2
    zaciatok2 = (1 + len(sprava)) // 2
    sifra = ''
    for i in range(pocet_dvojic):
        sifra += sprava[i]
        sifra += sprava[zaciatok2 + i]
    if len(sprava) % 2 == 1:
        return sifra + sprava[zaciatok2 - 1]
    return sifra

Vaše zaujímavé riešenia a najčastejšie chyby

Najčastejšou chybou bolo, že ste neuvažovali o tom, že zadaný text môže mať párnu alebo nepárnu dĺžku. Niektorí nesprávne vypočítali index stredu, t.j. konca prvej resp. začiatku druhej časti.