Python #7

Powtórzenie pętli

import turtle
import random

zolwik = turtle.Turtle() # stworz obiekt rysujacego zolwia pod zmienna zolwik
zolwik.speed(2) # ustaw szybkosc zolwia wbudowana metoda speed
zolwik.shape("turtle") # uzyj metody shape do ustawienia wygladu kursora / zolwia
zolwik.pensize(3)

kolory = [
    "CornflowerBlue",
    "DarkOrchid",
    "IndianRed",
    "DeepSkyBlue",
    "LightSeaGreen",
    "wheat",
    "SlateGray",
    "SeaGreen",
]

fibo = [0, 1]
suma_ostatnich = fibo[-1]+fibo[-2]

gorna_granica = 77

while suma_ostatnich <= gorna_granica:
    fibo.append(suma_ostatnich)
    suma_ostatnich = fibo[-1]+fibo[-2]

print(fibo)

# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

dl_boku = 20

for mnoznik in fibo[1:]:
    zolwik.fillcolor(random.choice(kolory))
    zolwik.begin_fill()
    for _ in range(5):
        zolwik.forward(dl_boku*mnoznik)
        zolwik.left(90)
    zolwik.end_fill()
    zolwik.forward(dl_boku*mnoznik)

turtle.exitonclick()

Szyfrowanie symetryczne - przesyłany klucz może być utracony, trudno wymyślić bezpieczną metodę przekazu klucza.

Szyfrowanie asymetryczne - jeden klucz do szyfrowania a drugi do odszyfrowania.

Szyfr Cezara - wymyślamy klucz liczbowy i zamieniamy na inny "a" = 1, "b" = 2. abba - bccb ; a = 0+1;

ZNAKI = [
    "a",
    "b",
    "c",
    "d",
    "e",
    "f",
    "g",
    "h",
    "i",
    "j",
    "k",
    "l",
    "m",
    "n",
    "o",
    "p",
    "q",
    "r",
    "s",
    "t",
    "u",
    "v",
    "w",
    "x",
    "y",
    "z",
    "A",
    "B",
    "C",
    "D",
    "E",
    "F",
    "G",
    "H",
    "I",
    "J",
    "K",
    "L",
    "M",
    "N",
    "O",
    "P",
    "Q",
    "R",
    "S",
    "T",
    "U",
    "V",
    "W",
    "X",
    "Y",
    "Z",
    "Ą",
    "ą",
    "Ć",
    "ć",
    "Ę",
    "ę",
    "Ł",
    "ł",
    "Ń",
    "ń",
    "Ó",
    "ó",
    "Ś",
    "ś",
    "Ź",
    "ź",
    "Ż",
    "ż",
    " ",
    ".",
    "?",
    "!",
]

# powyższa lista znaków ułatwi stworzenie kodu odpowiedzialnego za szyfrowanie

# żeby przy bardzo dużym kluczu , lub przy zamianie znaku z końca listy nie wyjść za nią
# można skorzystać z operatora modulo (to ten od reszty z dzielenia)
# wg. schematu (indeksznaku + klucz) % len(ZNAKI)

# indeksznaku = ZNAKI.index("!")
# print(f"Indeks znaku to: {indeksznaku}")
# klucz = 3
# nowy_indeks = (indeksznaku + klucz) % len(ZNAKI)
# print(f"Po przesunieciu o {klucz} uzyskamy {nowy_indeks}")

# jeśli nie chcemy skorzystać z naszej własnej tablicy znaków,
# to można to też zrobic korzystajac z tablicy znaków Unicode.
# Przydadzą się wtedy funkcje:
# ord - zwraca nr unicode znaku
# chr - zwraca znak po podaniu nr unicode
do_zaszyfrowania = (input("wprowadz tekst: "))
klucz = int(input("wprowadź klucz: "))


for litera in do_zaszyfrowania:
    indeksznaku = ZNAKI.index(litera)
    nowy_indeks = (indeksznaku + klucz) % len(ZNAKI)
    print(ZNAKI[nowy_indeks], end="")