ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python Challenge] ocr #2
    Wargame/Python Challenge 2021. 1. 27. 16:55

    www.pythonchallenge.com/pc/def/ocr.html

     

    ocr

     

    www.pythonchallenge.com


     

    recognize the characters. maybe they are in the book,
    but MAYBE they are in the page source.

    문자를 알아보아라. 아마도 책에 있을 것이다.
    그러나 아마 페이지 소스안에 있을 것이다.

     

    페이지 소스 코드를 보았다.

     

     

    주석처리 된 엄청 긴 문자들이 있다.

    이것을 해석하는 것 같았는데, 처음에는 ^가 있어 XOR한 문자를 찾는 것인 줄 알았다.

    그러나, XOR 연산을 통해 문자를 찾기에는 ^가 너무 많기도 하였고 문자의 갯수도 맞지 않았다.

     

    힌트로 주어진 것 같은 find rare characters in the mess below을 보면,

    엉망인 문자들 중 희귀한 문자를 찾아야하는 문제로 생각하고 그냥 알파벳이 있는지 찾아보았다.

     

     

    엉망인 문자들 중 알파벳인 a가 하나 존재하는 것을 파악할 수 있었다.

    해당 문자들 중 존재하는 알파벳이나 숫자를 찾기 위한 python 코드를 작성하였다.

     

    [소스 코드]

    import requests
    import string
    
    def getData():
        url = "http://www.pythonchallenge.com/pc/def/ocr.html"
        r = requests.get(url)
        s = r.text.find("%%$@_$^__#)")
        data = r.text[s:-6]
    
        return data
    
    if __name__ == "__main__":
        data = getData()
    
        result = ""
        for i in data:
            if i in string.ascii_letters: result += i
    
        print("[+] Find Rare Characters:")
        print(result)

     

    [실행 결과]

     

    찾은 문자인 equality를 입력하면 다음 문제로 넘어갈 수 있다.

     

    정답은 아래에 👇

     


     

    내가 푼 방식은 알파벳을 찾는 방법이었는데,

    python에는 isalpha()라는 함수가 존재하여 더 쉽게 알파벳만을 구할 수 있다.

    또한, 다른 풀이들을 더 찾아보니 정규식과 Counter() 함수를 이용하는 방법도 있었다.

     

    - re.findall("패턴 문자열(정규식)", data)
    정규식과 매치되는 모든 문자열을 리스트 형식으로 반환.
    (단, regular expression 모듈을 사용하는 것으로 re를 import 해주어야 한다.)

    - collections.Counter(data)
    동일한 값이 몇 개인지 파악하는데 사용되며 딕셔너리 형태로 반환.
    (단, collections 모듈을 사용하는 것으로 collections를 import 해주어야 한다.)

    - str.isalpha()

    문자열이 문자로만 이루어져 있는 경우 True, 아니면 False. (공백 불포함)

    - str.isdigit()
    문자열이 숫자로만 이루어져 있는 경우 True, 아니면 False.

    - str.isalnum()
    문자열이 문자와 숫자로만 이루어져 있는 경우 True, 아니면 False.

     

    위 함수들을 이용하면 아래와 같이 코드를 작성할 수 있다.

    import requests
    import re
    import collections
    
    def printResult(func, result):
        print("[+] Result %s:" % func)
        print(result)
        print("\n")
    
    def getData():
        url = "http://www.pythonchallenge.com/pc/def/ocr.html"
        r = requests.get(url)
        s = r.text.find("%%$@_$^__#)")
        data = r.text[s:-6]
    
        return data
    
    if __name__ == "__main__":
        data = getData()
    
        ###### isalpha() ######
        result1 = ""
        for i in data:
            if i.isalpha(): result1 += i
    
        printResult("isalpha()", result1)
    
        ###### findall() ######
        printResult("findall()", re.findall("[A-Za-z]", data))
    
        ###### Counter() ######
        printResult("Counter()", collections.Counter(data))

     

    [실행 결과]

     

    Counter() 함수의 경우 값이 1 문자들을 이용하여 단어를 추측하면 답을 알아낼 수 있다.

    'Wargame > Python Challenge' 카테고리의 다른 글

    [Python Challenge] What about making trans? #1  (0) 2021.01.27
    [Python Challenge] warming up #0  (0) 2021.01.27

    댓글

@Jo Grini's Blog