W jaki sposób zaszyfrować krótki wyraz szyfrem cezara? Proszę o pomoc
Zapisać wszystko wielkimi literami, przesunąć każdą z liter o trzy¹ w górę, zapętlając na końcu.
¹ Lub o inną stałą wartość, ale klasyczna wersja to właśnie przesunięcie o trzy.
Zdanie kończymy kropką.
Poczytaj o kodach ASCI https://pl.wikipedia.org/wiki/ASCII.
Tutaj kod w pythonie do szyfru Cezara
Zanim zadasz takie pytanie polecam skorzystać w wyszukiwarki, na większość standardowych pytań znajdziesz odpowiedź.
import sys
for line in sys.stdin:
output:str = ""
for char in list(line):
number:int = ord(char)
if ord('A')<=number<=ord('Z'):
if ord('W') < number:
number-=23
output+=chr(number)
else:
number+=3
output+=chr(number)
else:
output += char
print(output)
@Marcin Marcin:
jak już chcemy się trzymać twojej struktury kodu:
import sys
for line in sys.stdin:
output = []
for char in line:
if char.isupper():
out = ord(char) + 3
if out > ord("Z"):
out -= 26
char = chr(out)
output.append(char)
print("".join(output))
Nie ma takich brzydactw, jak wyliczanie, że musi stać tam konkretnie W
, itd. Ten kod również nie jest kwadratowy względem długości linijki.
tl;dr
def charRot13(x):
ret = ord(x)+13
return chr(ret-26 if ret > ord('z') else ret)
out = ''.join(
[charRot13(c) if c.islower() else c for c in s]
)
Ale nadal będę się upierać, że jeśli ktoś nie rozumie kodu z resztą z dzielenia to problemem nie jest programowanie...
@Marcin Marcin problem z Twoim przykładem polega na tym, że jest totalnie nieelastyczny. Jeśli OP nagle zapragnąłby przechodzić z o 5 zamiast 3 to zmienia kolejno:
linijkę 8, bo W
linijkę 9, bo 23
linijkę 12 bo 3.
Jak się jorgnie w jednym miejscu, w maliny idzie wszystko.
Jeśli zechiałby operować na większym zakresie znaków, robi się jeszcze gorzej.
Zarówno u mnie jak i @enedil potrzebna jest jedna zmiana, z 3/13 na dowolną inną liczbę, nie trzeba przeliczać które w kolejności jest W, gdzie to obrócić itd.
Przy konieczności dalszego parametryzowania nasz kod też będzie łatwiejszy do opanowania, podmieniasz 26 na span
który wyliczasz i tyle. I nie, to nie jest za wcześnie na dobre praktyki. EDIT: mogę się zgodzić, że za wcześnie (może) jest na map
i lambdę, ale z drugiej strony to chodzi o to, żeby wiedzieć, że pod spodem to wywoła fora. Ergo, jak taki nowicjusz zacznie od początku ograniczać ilość zagłębień to tylko z korzyścią dla niego to wyjdzie.