caesar_cipher(s, shift) implementing a proper Caesar cipher: every alphabetic character is shifted by shift positions within the alphabet (wrapping from z back to a), preserving its original case. Non-alphabetic characters (spaces, punctuation, digits) pass through unchanged.s = 'Hello, World!', shift = 3
'Khoor, Zruog!'
'H'->'K', 'e'->'h', ... wrapping happens for letters near the end of the alphabet, and punctuation is untouched.
s = 'xyz', shift = 3
'abc'
'x','y','z' wrap around past 'z' back to the start of the alphabet.
For a lowercase letter: (ord(ch) - ord('a') + shift) % 26 + ord('a'), then chr() it.
Do the same with a capital-A base for uppercase letters, and leave everything else as-is.