PythonChallenge Level 6 problem-soving
바로 전에 Level 5 문제에 대해서 풀어 보았다.
거의 3일 정도 걸린 것 같았다. 역시나 쉽지 않은 문제였다.
계속 점점 어렵고 난해한 문제가 나올 것 같지만 그래도 시간이 걸려도 계속해서 열심히 풀어봐야겠다.
자 그럼 이번에는 Level 6 문제에 대해서 풀어보도록 하자.
1. 문제 확인
Level 5 문제를 풀고 나서 확인된 Level 6 문제의 주소는 아래와 같다.
일단 문제는 확인하였고 화면에는 바지 지퍼? 이미지와 "PayPal Donate" 관련 버튼이 있었다.
자 그럼 한번 풀어보도록 하자.
2. 풀이 과정
화면을 보고 문제 관련에 대해서 무엇을 의미하는지 하나도 알 수가 없었다.
일단 이미지를 클릭해보았으나 아무런 반응이 없었고, "PayPal Donate" 버튼을 누르자 진짜 PayPal(페이팔)을 통해서 Python Challenge 쪽으로 Donation(기부)를 하도록 연결되어 있었다.
일단 기부는 모든 문제를 다 풀고 나면 공부한 대가를 치워야겠다.
결국 이전 문제들처럼 우선은 페이지 소스에 힌트가 있을까 하여 확인해보았다.
페이지 소스에서 남겨 있는 주석 중 다른 내용은 기부에 관련된 내용이고 맨 위에 HTML 태그 옆에 "zip"이라는 주석을 확인하였다.
이미지도 지퍼(zipper)가 있었기에 URL에 "zip.html"을 넣어 보았다.
"yes. find the zip(그래, zip을 찾아라)"라는 내용이었다. 결국은 아니었다.
그래서 다시 "channel.html"에서 html 확장자를 zip로 변경해보았다.
Zip 파일을 다운로드를 할 수 있었다.
그럼 이제 해당 Zip 파일을 먼저 압축 해제를 해보았다.
그랬더니 910개의 txt 파일이 존재하고 있었다.
이중 먼저 readme.txt 파일을 열어 보았다.
$ cat readme.txt
welcome to my zipped list.
hint1: start from 90052
hint2: answer is inside the zip
결국 Level 4에서 했었던 대로 여러 파일에서 나오는 값을 찾아서 따라가면 정답 혹은 힌트가 주어 지는 것 같았다.
hint1에서 처럼 90052.txt 파일을 시작으로 하면 될 것 같다.
일단 Level 4에서도 했으니 간단하게 파이썬 코드를 작성해서 확인해 보도록 하자.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
def get_file_read(file_path):
file_path = '{dir_path}/{file_path}.txt'.format(dir_path=dir_path, file_path=file_path)
with open(file_path, 'r') as f:
for line in f:
try:
ret = line.split('Next nothing is')
print(ret)
return ret[1].strip()
except IndexError:
break
if __name__ == "__main__":
n = '90052' # 처음 확인된 nothing 파라미터 값
dir_path = 'channel'
dir_len = len(os.listdir(dir_path))
try:
for i in range(dir_len):
n = get_file_read(n)
print('{i} 번째'.format(i=i+2))
print('nothing : {n}'.format(n=n))
if not n:
sys.exit()
except Exception as err:
sys.exit()
### OUTPUT ###
... 이하 생략 ...
905 번째
nothing : 8700
['', ' 45100']
906 번째
nothing : 45100
['', ' 68628']
907 번째
nothing : 68628
['', ' 67824']
908 번째
nothing : 67824
['', ' 46145']
909 번째
nothing : 46145
['Collect the comments.']
910 번째
nothing : None
910개를 다 돌고 나니 "Collect the comments.(댓글을 모아주세요.)"라는 내용을 확인하였다.
readme.txt 파일에서도 확인된 내용 중 "hint2: answer is inside the zip(힌트2: 정답은 zip 안에 있습니다.)"라는 내용을 보고 channel.zip 파일 자체안에 내용을 봐야 하는 생각이 바로 들었다.
그렇게 든 이유는 예전에 Zip을 이용해서 패스워드를 이용하여 압축하는 방법에 대해서 작성했었는데 그때 내용에는 작성하지 않았지만 zip / unzip 할 때 Comment를 넣고 확인하는 방법이 있었다.
역시나 unzip에서 l 옵션을 이용해서 보니 모든 파일은 아니지만 파일마다 Comment가 들어있는 걸 확인할 수 있었다.
- $ unzip -l channel.zip
그럼 Zip 파일 자체를 읽어서 확인하면 다른 힌트 혹은 정답이 나올 것 같았다. 한번 파이썬 코드를 이용해서 작성을 해보도록 하자.
Zip 파일을 바로 읽기 위해서는 이미 내장되어 있는 모듈 중 zipfile 모듈을 이용하면 된다.
해당 모듈에서는 Zip 파일을 바로 읽을 수도 있고 Zip 자체에 정보를 알 수 있도록 getinfo()라는 함수가 존재한다.
getinfo() 함수를 이용하면 Zip 파일 내에 있는 파일에 대한 여러 정보를 확인 가능하도록 코드를 작성할 수 있다.
zipfile 모듈에 대한 자세한 내용은 위 내용을 통해서 확인해보도록 하자.
그럼 내용을 한번 작성해 보도록 하자.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import zipfile
z = zipfile.ZipFile('channel.zip', 'r')
n = '90052' # 처음 확인된 nothing 파라미터 값
result = ''
while True:
file_path = '{nothing}.txt'.format(nothing=n)
data = z.read(file_path).decode('utf-8')
print(data)
result += z.getinfo(file_path).comment.decode('utf-8')
if data.split('Next nothing is'):
try:
n = data.split('Next nothing is')[1].strip()
except IndexError as err:
break
else:
break
print(result)
### OUTPUT ###
Next nothing is 94191
Next nothing is 85503
Next nothing is 70877
Next nothing is 15409
Next nothing is 60838
Next nothing is 80009
... 이하 생략 ...
Next nothing is 68628
Next nothing is 67824
Next nothing is 46145
Collect the comments.
****************************************************************
****************************************************************
** **
** OO OO XX YYYY GG GG EEEEEE NN NN **
** OO OO XXXXXX YYYYYY GG GG EEEEEE NN NN **
** OO OO XXX XXX YYY YY GG GG EE NN NN **
** OOOOOOOO XX XX YY GGG EEEEE NNNN **
** OOOOOOOO XX XX YY GGG EEEEE NN **
** OO OO XXX XXX YYY YY GG GG EE NN **
** OO OO XXXXXX YYYYYY GG GG EEEEEE NN **
** OO OO XX YYYY GG GG EEEEEE NN **
** **
****************************************************************
**************************************************************
Zip 파일 내에 파일마다 작성된 Comment 내용을 모았더니 위와 같이 "HOCKEY"라는 단어가 나왔다.
이제 URL에 "hockey.html"을 입력해 보도록 하자.
"it's in the air. look at the letters.(글자를 보면 공중에 떠 있다.)"라고 작성되어 있다.
정답이 아니고 힌트였다. 그러나 힌트의 의미를 정확히 파악을 하지 못해 잠시 멍 때리는 순간 "HOCKEY"라는 단어에 서로 다른 알파벳으로 작성되었음을 보게 되었다.
해당 부분을 보니 "oxygen"이라는 단어의 각 알파벳을 이용해서 "HOCKEY"라는 단어를 작성하였다.
그럼 "oxygen.html"을 한번 URL에 입력해 보도록 하자.
입력한 URL에서 Level 7 문제가 나왔다.
Level 6 문제를 해결하였다.
Level 7 문제도 보자마자 이건 어떻게 풀 수 있을까?라는 생각이 들지만 정말 Level 6 문제도 쉽지 않았다.
다행히도 Zip 파일에 대해서 Comment 항목을 알고 있어서 쉽게 유추가 되었지만, 그렇지 않았다면 며칠이 걸릴지 몰랐던 문제였다.
일단 해결을 위해서 작성한 코드에 대해서는 Github를 통해서 확인할 수 있다.
앞으로도 계속 천천히 풀어나가면서 풀었던 내용에 대해서 잘 작성해보도록 하겠다.
🌵댓글