python szyfr cezara

0

W jaki sposób zaszyfrować krótki wyraz szyfrem cezara? Proszę o pomoc

0

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.

0

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)
1

@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.

1

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1