Skip to content

Instantly share code, notes, and snippets.

@ktprezes
Created March 18, 2019 16:26
Show Gist options
  • Save ktprezes/56a6421d546b97dbd4c6fe2978e8117f to your computer and use it in GitHub Desktop.
Save ktprezes/56a6421d546b97dbd4c6fe2978e8117f to your computer and use it in GitHub Desktop.
Python - szyfr 'gaderypoluki' - przykładowa implementacja - można podać inny klucz - z innymi parami
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# Szyfr GaDeRyPoLuKi - przykładowa implementacja
# założenie: znaki w kluczu są unikalne - nie muszą to być litery; klucz ma parzystą długość
# wymieniane są między sobą parami: klucz[0] <-> klucz[1], ..., klucz[10] <-> klucz[11], itd...
# kończy działanie po podaniu pustego tekstu - np po naciśnięciu samego 'Enter'
klucz_def:str = 'GADERYPOLUKI' # klucz default / domyślny
klucz_we :str =""
klucz :str =""
tekst_we :str =""
tekst_wy :str =""
znak :str =""
def klucz_OK(klucz: str ="", druk_kom : bool = True) -> bool:
# test, czy klucz jest OK?
if klucz =="":
if druk_kom: print("UWAGA!!! Klucz pusty!")
return False
if len(klucz) % 2 != 0: # dł nieparzysta - któraś litera nie ma pary
if druk_kom: print("UWAGA!!! Któryś znak w kluczu jest bez pary!")
return False
if len(set(klucz.upper())) != len(klucz):
if druk_kom: print("UWAGA!!! Znaki w podanym kluczu nie są unikalne!")
return False
return True
# end of def klucz_OK(klucz: str) -> bool:
def indx_pary(indx_we:int) -> int:
# zwraca indeks w kluczu tego drugiego znaku z pary
# 0->1, 1->0, ..., 6->7, 7->6, itd...
return (indx_we // 2)*2 + ((indx_we+1) % 2)
# end of def indx_pary(indx_we:int) -> int:
# początek właściwego programu
while(1):
klucz_we = input ("Podaj klucz:\n")
klucz_we = klucz_we.upper()
if klucz_OK(klucz_we):
print("Podano poprawny klucz:", klucz_we)
print("Od tej chwili to on będzie używany.")
klucz = klucz_we.upper()
else:
print("Nie podano prawidłowego klucza,\nzostanie użyty", end=' ')
if klucz =="":
klucz = klucz_def.upper()
print("klucz domyślny:", klucz)
else:
print("klucz używany wcześniej:", klucz)
# tutaj wiemy, że klucz składa się z unikalnych znaków:
# dużych liter i ewentualnych innych
tekst_we = input("Podaj tekst:\n")
if tekst_we =="":
print("Nie podano tekstu - bye bye...")
break
tekst_wy =""
for znak in tekst_we:
indx = klucz.find(znak.upper())
if indx == -1:
tekst_wy += znak # znaku nie ma w kluczu => przepisz do tekst_wy
else:
if znak.islower():
tekst_wy += klucz[indx_pary(indx)].lower()
else:
tekst_wy += klucz[indx_pary(indx)]
# nie trzeba badać, znak.isupper(), bo w kulczu same duże litery
# i ewentualnie inne znaki niż litery
print('Tekst wyjściowy:', tekst_wy, sep='\n')
# end of while(1):
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment