Autorské riešenie
[stiahni py]

  • Počet riešiteľov: 38 / 41 = 92,68 %

  • Úspešnosť riešenia: 3,76 / 5 = 75 %

Aby sme vedeli text podľa uvedeného postupu zašifrovať, potrebujeme k tomu dve veci: samotný text, ktorý chceme zašifrovať a kľúč, podľa ktorého budeme šifrovať. Toto budú zároveň parametre funkcie sifruj

Podľa postupu, ktorý si Kory a Rory zvolili, budeme text šifrovať znak po znaku.

šifrovanie

Najskôr zistíme, či sa zadaný znak textu nachádza v kľúči.

Ak áno, nahradíme ho znakom z "opačného konca" kľúča. Takto sme na obrázku vyššie nahradili znak k znakom c.

Ak nie, ponecháme ho bez zmeny. Takto sme na obrázku vyššie ponechali bez zmeny znak a.

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

# Python
def sifruj_text(text, kluc):
    sifra = ''
    for znak in text:
        if znak in kluc:
            pozicia = kluc.index(znak)
            pozicia = len(kluc) - pozicia - 1
            sifra = sifra + kluc[pozicia]
        else:
            sifra = sifra + znak
    return sifra

Všimnime si, ako hľadáme šifru pre znak textu. Ak vieme, že znak sa v kľúči nachádza (if znak in kluc:), nájdeme jeho pozíciu (pozicia = kluc.index(znak)). Jeho šifra z opačného konca kľúča je na pozícii len(kluc) - pozicia - 1 .

Pozornejší z vás si isto uvedomili, že pri takomto spôsobe šifrovania môže byť dešifrovanie problematické. Problém nastane vtedy, ak sa rôzne znaky textu zašifrujú rovnakou šifrou. Napr. pre kľúč: "abcc" sa znaky "a" a "b" zašifrujú na znak "c". Text "abeceda" sa zašifruje na "ccebedc". Pri dešifrovaní nevieme povedať, ako dešifrovať znak "c". Toto je už ale iný problém.

Pozrime sa ešte na jedno vylepšenie. Hľadanie pozície znaku v kľúči je náročnou operáciou. V najhoršom prípade je potrebné skontrolovať všetky znaky kľúča a to opakovane, pre každý znak textu. Využime na tento preklad (znak textu ->šifra znaku) slovník. Najskôr z kľúča vytvoríme slovník a potom ho použijeme na šifrovanie znakov textu. Toto riešenie môže vyzerať nasledovne: 

# Python
def sifruj_text1(text, kluc):
    sifra = ''
    slovnik_sifier = {}
    for idx in range(len(kluc)):
        znak = kluc[idx]
        if znak not in slovnik_sifier:
            slovnik_sifier[znak] = kluc[len(kluc) - idx - 1]

    for znak in text:
        sifra = sifra + slovnik_sifier.get(znak, znak)
    return sifra

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

Túto úlohu ste zvládli pomerne dobre. Niektorým robilo problém nájsť v kľúči zodpovedajúcu šifru znaku.

Niekoľko tímov použilo slovník, vďaka čomu nachádzali šifry znakov textu omnoho efektívnejšie. Zaujalo nás riešenie tímu Šedá eminencia dodekahedrónov. Slovník si nevytvorili na začiatku z celého kľúča, ale vytvárali ho priebežne počas šifrovania. Znaky kľúča, ktoré sa nenachádzali v texte sa tak do slovníka ani nedostali.