Autorské riešenie
Ú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 logoKeďž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.
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.
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 PythonKeďž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.
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.
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. |
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |