본문 바로가기

PYTHON/python_challenge

Python Challenge level 2

페이지 소스에 있다고 해서 ocr.html의 페이지 소스를 보았다.

 

주석 처리된 부분에 적은 문자들을 찾으라고 하고 특수문자들로 엄청 길게 쓰여진 게 있다.

처음엔 긴 문자열을 복사 붙여 넣어서 코드를 짜야하나 싶었는데 파싱을 하면 코드를 어지럽게 하지 않아도 저 문자열을 빼올 수 있다.

url의 소스를 보기위해 urllibimport 해주고 저기 문자열 부분만 빼오기 위해 find함수로 %%$@_$^__부분을 찾는다. find함수는 괄호 안의 부분이 전체에서 몇 번째에 있는지 찾아주는 함수인데 직접 확인하는 게 더 이해가 빠르다.


일단 저기 m 부분만 출력시켜서 확인해보면 

, url 소스의 843번째 문자가 %%$@_$^__의 시작이라는 것이다.

[m:len(response)-5]843부터 url 소스의 총 길이에서 5만큼 뺀거 까지 str에 넣어 strCounter 함수 인자로 넘겨주는데 5를 빼는 이유는 주석처리된 부분의 마지막을 보면

이렇게 \n-->\n이 있는데 이 부분을 빼고 검사하기 위해 5를 한다.

Counter 함수는 collections로부터 불러 사용하는데 문자열에서 아스키코드에 존재하는 문자들을 검사해 그 개수를 예쁘게 정리해주는 함수이다.

어떻게 예쁘냐면 일단 실행시켜보면

짜란.

C언어로 구상하려면 더럽게 어려울 텐데 (내 기준에서) 간단히 Counter 함수로 깔끔히 파악이 된다.

Counter 함수 말고 isalpha라는 함수를 이용해서도 풀 수 있다.

isalpha 함수는 문자열에서 alphabetic characters를 찾아준다.

rindexrinex(str)이면 문자열에서 str들을 찾는데 뒤의 것부터 찾는다. 그런데 여기서 뒤의 것부터 찾는다고 하면 뒤에서부터 찾기를 시작한다고 이해할 오해의 소지가 있다. 그래서 코드로 직접 확인해보자.


이렇게 rindexindex, findis를 검색한 후 출력값을 비교해 볼 것이다.

실행시키면 이렇게 나온다. rindex는 문자열에서 찾은 is 중 뒤의 것의 위치를 먼저 출력시켜주고 index는 앞의 것의 위치를 출력시켜준다. find도 마찬가지인데 indexfind의 차이는 return 값에 있다. 만약 문자열에서 indexfind함수를 이용해서 특정 문자열이나 문자를 검사하는데 찾지 못했을 경우 indexreturn 값은 valueError가 뜨고 find return 값은 1이 된다.


문제 페이지 소스 부분을 보면 <!-- find rare ~ -->부분이 먼저 주석처리 되어있다. 따라서 rindex<!-- %%$@_$^__ ~ -->의 위치를 뽑아내주는 것이다.

isalpha함수를 이용해서 짠 코드를 실행시켰을 때

이렇게 바로 equality가 나온다.

Counter 함수로 확인을 하면 나온 문자를 가지고 equality를 유추해 내야했는데 isalpha 함수를 사용하니 더 깔끔하다.

'PYTHON > python_challenge' 카테고리의 다른 글

Python Challenge level 5  (0) 2016.12.22
Python Challenge level 4  (0) 2016.12.22
Python Challenge level 3  (0) 2016.11.23
Python Challenge level 1  (0) 2016.11.14
Python Challenge level 0  (0) 2016.11.14