2014-02-21 2 views
0

나는 13 개의 공백만큼 텍스트를 이동시키는 함수를 작성하고있다. 변환 된 문자는 대소 문자를 유지해야하며 문자가 문자가 아닌 경우에는 변경되지 않은 문자를 통과해야합니다. 나는 다음과 같은 함수를 썼다 :파이썬에서 또 다른 카이저 암호

def rot13(str): 
    result = "" 
    for c in str: 
     if 65 <= ord(c) <= 96: 
      result += chr((ord(c) - ord('A') + 13)%26 + ord('A')) 
     if 97 <= ord(c) <= 122: 
      result += chr((ord(c) - ord('a') + 13)%26 + ord('a')) 
     else: 
      result += c 
    print result 

내가 발견 한 것은 소문자와 문자가 아닌 문자가 잘 작동한다는 것이다. 그러나 함수가 대문자 chars에 적용되면 함수는 원래 char에 따라 FOLLOWED가 이동 된 문자를 반환합니다. 나는이 문제에 대한 많은 해결책을 알고 있지만,이 특정 오류는 내 논리가 잘못되었거나 궁금해서 파이썬에서 chars와 loops를 이해하고있다. 어떤 도움을 주셔서 감사합니다.

답변

2

"else"문이 누락되어 있으므로 첫 번째 문구가 "발생합니다"(c이 대문자 인 경우), 두 번째 문구의 "else"도 "발생합니다"(대문자를 연결하면 ord(c)9196 사이하지 ord('Z')==90와, 대문자 말 또한

97 사이 122)

def rot13(str): 
    result = "" 
    for c in str: 
     if 65 <= ord(c) <= 96: 
      result += chr((ord(c) - ord('A') + 13)%26 + ord('A')) 
     elif 97 <= ord(c) <= 122: 
      result += chr((ord(c) - ord('a') + 13)%26 + ord('a')) 
     else: 
      result += c 
    print result 
, ASCII 문자 하지 문자입니다입니다. 기능도 이어야합니다. 값을 반환하고 인쇄하지 마십시오 (print_rot13이라고하지 않는 한). 당신의 함수 또한 일관성이 없습니다 - 당신은 계산에 ord('A')을 사용합니다. 그러나 실제 값은 (65)이면 하나를으로 결정해야합니다.

def rot13(str): 
    a = ord('a') 
    z = ord('z') 
    A = ord('A') 
    Z = ord('Z') 
    result = "" 
    for c in str: 
     symbol = ord(c) 
     if A <= symbol <= Z: 
      result += chr((symbol - A + 13)%26 + A) 
     elif a <= symbol <= z: 
      result += chr((symbol - a + 13)%26 + a) 
     else: 
      result += symbol 
    return result 

실제 ord 값에 대한이 단지 하부 및 상부 케이스 문자가 일치하는 블록으로 배열되어 있다는 가정 방법,하지만 아무것도.

+0

확실히 문제였습니다. 감사! – carlmonday