Python/Python Challenge

[Python Challenge 1] 문자열 변환

Python Challenge 1의 url은 다음과 같다.

Python challenge 1 : http://www.pythonchallenge.com/pc/def/map.html

 

What about making trans?

everybody thinks twice before solving this. g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.

www.pythonchallenge.com


구성

화면의 글자는 다음과 같다.

 

모두들 이걸 풀기 전에 한 번 더 생각하세요

 

g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.

 

일반적인 TIP

* 힌트를 사용하세요, 보통 유용하답니다

* 당신에게 주어진 데이터를 조사하세요

* 스포일러를 조심하세요

 

으흠;; 핑크색 글자의 K를 M으로 O를 Q로, E를 G로 바꾸면 될라나? 다음과 같은 코드를 작성해 보았다.

def change(letters,src,dst) :
    return letters.replace(src,dst)

if __name__=="__main__" :
    string = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."

    string = change(string,"k","m")
    string = change(string,"o","q")
    string = change(string,"e","g")

    print(string)
    
출력결과 : 
g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr ammnsrcpq ypc dmp. bmglg gr gl 
zw fylb gq glcddgagclr ylb rfyr q ufw rfgq rcvr gq qm jmlg. sqglg qrpglg.myicrpylq() 
gq pcammmclbcb. lmu ynnjw ml rfc spj.

어? 그래도 틀리다. 조금더 세밀하게 규칙을 보면 패턴을 찾을 수 있다.

맞다 눈치챈사람들도 있겠지만 이는 ROT2의 Shifting 암호이다.

문제는 우리에게 일부 항목만을 보여 주었을 뿐이다. 프로그램을 조금 수정하자 

if __name__=="__main__" :
    string = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
    new_string = ""
    
    for i in range(len(string)) :
        ### ord('a')가 97이고, ord('z')가 122이다.
        if(ord(string[i]) >= 97 and ord(string[i]) <= 122) :
            new_string += chr(97+(ord(string[i])-95)%26)
        else :
            new_string += string[i]

    print(new_string)

두 칸씩 밀릴 수 있게 소문자 ascii 값을 2씩 더해주면서 새로운 new_string을 생성했다. 출력은 다음과 같다.

i hope you didnt translate it by hand. 
thats what computers are for. doing it in by hand is inefficient and that's why this text 
is so long. using string.maketrans() is recommended. now apply on the url.

?? 그렇다 사실 string.maketrans()라는 함수가 있다고 한다. 뭐 어떤가 이런 방법 저런 방법 있는 거지 

그런데 이제 어떻게 다음문제를 넘어갈 수 있을까?? 이번 문제의 소스는 map.html이다 map이라는 문자열을 ROT2 하면 OCR이다. 자 넘어가자

 

Answer Url : http://www.pythonchallenge.com/pc/def/ocr.html