IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: úkol v Řešené úlohy k 9. a 10. lekci Pythonu

V předchozím kvízu, Online test znalostí Python 2.7, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Alexandr Saveljev:14.7.2023 12:36

Dobrý den!
Zkusil jsem napsat kó pro úkol šifraci textu pomocí Vigenerovy šifry.
Neuspěl.
Studuji vaše řešeni.
Došel jsem do x tady:

print("Zadejte text k zašifrování: ")
vstup = input()
print("Zadejte heslo: ")
heslo = input()
vystup = ""
# průchod všemi znaky ve vstupu
for i, znak in enumerate(vstup):
    # výpočet posunu v abecedě
    x = ord(heslo[i % len(heslo)]) - (ord("a") - 1)
... atd.

a mám dvě otázky:

1. proč, pro co v kodu

x = ord(heslo[i % len(heslo)]) - (ord("a") - 1)

odečítáš (ord("a") a pak ještě i 1?
2. otázka: podle kódu

x = ord(heslo[i % len(heslo)]) - (ord("a") - 1)

spočítáme první písmeno, tj. písmeno a hesla ahoj.
Podle

ord(heslo[i % len(heslo)])

to bude: 97 - 97 - 1 mělo by být -1.
Ale když zadáváme slovo moribundus a heslo ahoj i děláme print pro:

x = ord(heslo[i % len(heslo)]) - (ord("a") - 1)
print(x, end=" ")

výsledkem bude: `1 8 15 10 1 8 15 10 1 8 `.
Otázkou je: proč 1, když mělo by být -1?
Předem děkuji!

Zkusil jsem: Zkoušel jsem kód napsat několikrát, nefungovalo to.
I tak:

seznam = []
i = ""
slovo = input("Zadejte text k zašifrování: ")
if slovo != "":
    slovo.lower()
heslo = input("Zadejte heslo k zašifrování: ")
if heslo != "":
    heslo.lower()
if len(slovo) > len(heslo):
    k = len(slovo) / len(heslo)    # k = koeficient = 2.5
    koef = len(slovo) // len(heslo)  # koef = koeficient celý = 2
    z = len(slovo) % len(heslo)   # z = zustatek = 2

i tak:

slovo = input("Zadejte text k zašifrování: ")
if slovo != "":
    slovo.lower()
heslo = input("Zadejte heslo k zašifrování: ")
if heslo != "":
    heslo.lower()

for j in list(slovo):    # kód pro šifrování
    n = ord(j)
for k in list(heslo):
    m = ord(k)

bln = (n + m - 96)  #
if (bln > ord("z")):
    bln = (bln - 26)
print(chr(bln), end=" ")

Chci docílit: Musím pochopit co, proč a jak funguje.

 
Odpovědět
14.7.2023 12:36
Avatar
Pavel
Člen
Avatar
Odpovídá na Alexandr Saveljev
Pavel:14.7.2023 13:18

Zřejmě chceme začínat jedničkou.

heslo[i % len(heslo)]   # toto zajistí, že heslo indexujeme vždy 0 do délky hesla
(ord("a") - 1)  # odečítáme 96 (resp 97 - 1), tak aby v šifře mělo 'a' číslo 1
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
14.7.2023 13:18
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:14.7.2023 14:14
x = ord(heslo[i % len(heslo)]) - (ord("a") - 1)

V předchozím úryvku kódu dochází k neshodě mezi programátorským zápisem a algoritmem.

Podívej se na závorky v daném příkazu. Celý příkaz se skládá ze dvou částí, nikoli ze tří:

  • získání kódu znaku v hesle
  • získání kódu prvního znaku s nevhodně aplikovaným posunem.

Pokud bychom měli heslo ahoj, pak první hodnota bude jedna protože 97 - (97 - 1).
Ač je výsledná hodnota správná, je provedení matoucí.

Celý příkaz se musí skládat ze tří částí:

  • získání kódu znaku v hesle
  • získání kódu prvního znaku
  • posun

Takový zápis by vypadal takto:

x = ord(heslo[i % len(heslo)]) - ord("a") + 1

Výsledek je 97 - 97 + 1 = 1

Takže posun pro a je 1, pro b 2, pro c 3, atd.

Jak málo stačí aby byl i tak jednoduchý algoritmus obtížně pochopitelný..

Nyní by Ti mělo být vše jasné.

Nahoru Odpovědět
14.7.2023 14:14
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Alexandr Saveljev:15.7.2023 9:16

Teď jasně, ale bohužel pouze po Tvém vysvětlení.
Pojdu dál.
Děkuji!

 
Nahoru Odpovědět
15.7.2023 9:16
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:15.7.2023 9:34

Nemáš zač. Když budeš označovat příspěvky, které Ti nejvíce pomohou, jako řešení, přispěješ tím na pomoc druhým tam kam mají ostatní omezený přístup..

Nahoru Odpovědět
15.7.2023 9:34
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Pavel
Člen
Avatar
Pavel:15.7.2023 9:36

Ona tam ta jednička je vlastně blbost, protože 'a' má mít posun 0. Takže v dalším kroku, tj. získání nového znaku do výstupu, člověk musí stejně tu jedničku zase odečíst. Takže v dalším kroku bude např. místo:

vystup += chr(ord(znak) + x)

toto

vystup += chr(ord(znak) + x - 1)
 
Nahoru Odpovědět
15.7.2023 9:36
Avatar
Odpovídá na Pavel
Alexandr Saveljev:15.7.2023 10:55

Chapu, ale nesouhlasím. Ano, máte právdu, a mělo by mít č. 0. V tomto případě poslední, z, mělo by být č. `25. Ale pokud všechny zná, že alfabet má 26 písmen, to pro komfortní počet v úkolu uvedli podmínku, že a = 1.

 
Nahoru Odpovědět
15.7.2023 10:55
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.