지퍼가 달린 옷 사진이 하나 주어진다.
HTML 파일 이름은 channel이고 title은 now there are pairs이다. 아직까지는 도움이 될 만한 힌트가 없어서 page source를 살펴봤다.
HTML 주석에 zip이라고 적혀 있다.
<!-- <-- zip -->
지퍼가 달린 옷 사진 밑에는 PayPal 링크가 하나 있는데 이건 문제풀이와는 상관이 없다고 한다. The Python Challenge를 만든 사람이 기부를 해주면 매우 고맙겠다는 멘트를 남기고 싶어서 적은 것 같다.
<!-- The following has nothing to do with the riddle itself. I just
thought it would be the right point to offer you to donate to the
Python Challenge project. Any amount will be greatly appreciated.
-thesamet
-->
위에서 zip이라는 힌트를 줘서 url 을 zip으로 바꿔 봤다.
http://www.pythonchallenge.com/pc/def/channel.zip
URL을 바꿨더니 zip 파일을 받을 수 있었다.
file channel.zip
channel.zip: Zip archive data, at least v2.0 to extract, compression method=deflate
zip 파일의 압축을 푸니 엄청난 양의 숫자.txt 파일들이 나왔다. readme.txt가 있어서 읽어보니 90052부터 시작하라는 힌트와 답은 zip 파일 안에 있다는 힌트를 주었다.
cat readme.txt
welcome to my zipped list.
hint1: start from 90052
hint2: answer is inside the zip
문제와 연관된 90052가 90052.txt밖에 없어서 90052.txt 파일을 읽어보니 next nothing 값을 알려준다. Level4에서 풀었던 문제와 비슷한 것 같다.
cat 90052.txt
Next nothing is 94191
cat 94191.txt
Next nothing is 85503
더 이상 손으로 모든 txt 파일들을 읽는 것은 어렵다고 생각이 들어서 Python 코드를 작성했다.
number=90052
while True:
with open(f'{number}.txt','r') as f:
content=f.read()
print(content)
number=content.split()[-1]
print(number)
if 'Next nothing is ' not in content:
break
코드를 실행하고 나니 맨 끝에 주석을 모으라고 한다. 주석은 zip 파일에 주석을 모으라는 뜻이 아닌가 싶다.
Collect the comments.
comments.
Python은 zip 파일을 다루는 zipfile module이 있다. zipfile은 built-in module이기 때문에 특별한 설치 없이 import zipfile로 사용할 수 있다.
zipfile.ZipFile Object로 zip 파일을 열 수 있다. ZipFile.getinfo 함수는 zip archive member(zip으로 압축 된 파일)에 대한 정보를 알려준다. ZipFile.comment는 zip 파일의 comment를 bytes로 보여준다. 65535 bytes 보다 긴 comment들은 잘린다고 한다.
참고로 Python에서 with open 으로 파일을 열면 자동으로 close 해주기 때문에 open 함수로 파일을 여는 것보다 with open으로 코드를 작성하는 게 더 Pythonic 하다고 한다.
import zipfile
number=90052
comments=[]
while True:
with open(f'{number}.txt','r') as f:
content=f.read()
print(content)
number=content.split()[-1]
print(number)
if number=='comments.':
break
with zipfile.ZipFile('channel.zip', 'r') as zipf:
print(zipf.getinfo(f'{number}.txt').comment.decode())
comments.append(zipf.getinfo(f'{number}.txt').comment.decode())
print(*comments)
https://stackoverflow.com/questions/31334061/file-read-using-open-vs-with-open
File read using "open()" vs "with open()"
I know there are plenty of articles and questions answered regarding reading files in python. But still I'm wondering what made python to have multiple ways to do the same task. Simply what I want to
stackoverflow.com
https://www.reddit.com/r/learnpython/comments/nfszml/with_open_vs_open_in_python/
From the learnpython community on Reddit
Explore this post and more from the learnpython community
www.reddit.com
각 txt 파일에서 '*'이 comment로 한개씩 나왔는데 comment를 하나씩 모으다 보니 HOCKEY라고 써져 있는 ascii art가 완성되었다.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * *
* * O O O O X X Y Y Y Y G G G G E E E E E E N N N N * *
* * O O O O X X X X X X Y Y Y Y Y Y G G G G E E E E E E N N N N * *
* * O O O O X X X X X X Y Y Y Y Y G G G G E E N N N N * *
* * O O O O O O O O X X X X Y Y G G G E E E E E N N N N * *
* * O O O O O O O O X X X X Y Y G G G E E E E E N N * *
* * O O O O X X X X X X Y Y Y Y Y G G G G E E N N * *
* * O O O O X X X X X X Y Y Y Y Y Y G G G G E E E E E E N N * *
* * O O O O X X Y Y Y Y G G G G E E E E E E N N * *
* * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
URL을 hockey로 바꿨더니 답은 나오지 않았다. 그러나 공기중에 있고 글자를 살펴보라고 한다.
http://www.pythonchallenge.com/pc/def/hockey.html
it's in the air. look at the letters.
자세히 보면 HOCKEY의 각 글자가 글자로 이루어진 것을 볼 수 있다. 불필요한 '*'를 제거하고 살펴보니 O, X, Y, G, E, N으로 이루어져 있다.
In [1]: ascii='''* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
...: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
...: * * * *
...: * * O O O O X X Y Y Y Y G G G G E E E E E E N N N N * *
...: * * O O O O X X X X X X Y Y Y Y Y Y G G G G E E E E E E N N N N * *
...: * * O O O O X X X X X X Y Y Y Y Y G G G G E E N N N N * *
...: * * O O O O O O O O X X X X Y Y G G G E E E E E N N N N * *
...: * * O O O O O O O O X X X X Y Y G G G E E E E E N N * *
...: * * O O O O X X X X X X Y Y Y Y Y G G G G E E N N * *
...: * * O O O O X X X X X X Y Y Y Y Y Y G G G G E E E E E E N N * *
...: * * O O O O X X Y Y Y Y G G G G E E E E E E N N * *
...: * * * *
...: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
...: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '''
In [2]: print(ascii.replace('*',''))
O O O O X X Y Y Y Y G G G G E E E E E E N N N N
O O O O X X X X X X Y Y Y Y Y Y G G G G E E E E E E N N N N
O O O O X X X X X X Y Y Y Y Y G G G G E E N N N N
O O O O O O O O X X X X Y Y G G G E E E E E N N N N
O O O O O O O O X X X X Y Y G G G E E E E E N N
O O O O X X X X X X Y Y Y Y Y G G G G E E N N
O O O O X X X X X X Y Y Y Y Y Y G G G G E E E E E E N N
O O O O X X Y Y Y Y G G G G E E E E E E N N
OXYGEN은 산소, 그래서 공기 중에 있다고 한 거였다. URL을 oxygen으로 바꿔보면 다음 레벨로 넘어간다.
http://www.pythonchallenge.com/pc/def/oxygen.html
smarty
www.pythonchallenge.com
이 문제는 이전 레벨들에 비해서 상대적으로 Python 이외의 외적인 지식을 많이 물어보지 않아서 그래도 조금 풀기 수월하지 않았나 싶다. 이번 기회를 통해서 zipfile module을 익히고 잘 사용해 보자.
'Python > The Python Challenge' 카테고리의 다른 글
Level 8 (1) | 2024.11.28 |
---|---|
Level 0 (0) | 2024.11.22 |