Python Challenge 25의 Url은 다음과 같다
Python challenge 25 : hhttp://www.pythonchallenge.com/pc/hex/lake.html
구성
퍼즐이다. 퍼즐이라고 하면 어릴 때 재미있게 놀았던 기억이 새록새록 떠오른다. 특별한 점이 안보이니, 주석을 살펴보자
주석에 힌트가 있다. "파도들이 보이시나요?" 라는 건데, 어떻게 풀어야 할까
해결 아이디어
일단 waves니까 wave가 여러 개 있는 거 같다. 이미지의 이름이 lake1.jpg인 것을 미루어보아, 여러 개의 파일이 있을 줄 알았는데, 웬걸?
없단다. wave라니까 wav 확장자로 한번 들어가 볼까?
정확했다. 몇 번까지 있는지 모르겠으니 다운로드하여서 wav 폴더 안에 넣어두는 코드를 작성해 보자
### 25_1.py
from requests import *
if __name__=="__main__" :
url = "http://www.pythonchallenge.com/pc/hex/lake"
cnt = 1
while(True) :
new_url = url + str(cnt) + ".wav"
res = get(new_url,auth=("butter","fly"))
if(res.status_code!=200) :
break
with open("./25_wav/"+str(cnt)+".wav","wb") as f:
f.write(res.content)
cnt += 1
성공적인 결과는 아래와 같이 25개의 음성(wav확장자) 파일을 가질 수 있다.
파일크기는 전부 동일하다. 여기서 더 나아갈 수 있는 힌트는 기존 사진인 lake1.jpg에서 찾을 수 있다.
퍼즐처럼 이렇게 들어간다는 거다. 그러면 어떻게 넣을 수 있을까?
해결 코드에 사용된 주요 함수는 다음과 같다.,
- wave.getnframe() : wave파일에 몇 개의 프레임이 들어있는지 확인
- wave.readframe(frame) : frame만큼의 크기를 읽어 .byte로 반환
- Image.frombytes(mode, size, bytes) : 새로운 이미지를 생성하는데, bytes에서 읽어 온다. 크기가 넘어가면 자른다. 아래 참조
https://www.geeksforgeeks.org/python-pil-image-frombytes-method/
* Image.frombytes(mode, size, bytes)의 사용법은 위에 링크로 올린다. 크기가 넘어가면 잘리는 example을 볼 수 있다.
이를 이용한 해결 코드는 다음과 같다.
### 25_2.py
from PIL import Image
import wave
if __name__=="__main__" :
url = "http://www.pythonchallenge.com/pc/hex/lake"
cnt = 1
wavs = [wave.open("./25_wav/"+str(x)+".wav") for x in range(1,26) ]
ans = Image.new('RGB',(300,300))
num_frames = wavs[0].getnframes()
for index, w in enumerate(wavs) :
tmp = w.readframes(num_frames)
piece = Image.frombytes('RGB',(60,60),tmp)
ans.paste(piece,(60*(index%5),60*(index//5)))
ans.save("ans.png")
결과는 다음과 같다.
찾았다. decent
Answer Url : http://www.pythonchallenge.com/pc/hex/decent.html
'Python > Python Challenge' 카테고리의 다른 글
[Python Challenge 27] 지퍼올리세요 (2) | 2021.06.26 |
---|---|
[Python Challenge 26] 과거의 행실을 돌아보세요 (0) | 2021.06.06 |
[Python Challenge 24] 보너스 타임! 기본으로 돌아갈 때 (0) | 2021.06.05 |
[Python Challenge 23] 보너스 타임! 기본으로 돌아갈 때 (0) | 2021.06.05 |
[Python Challenge 22] 조이콘은 비쌉니다. (0) | 2021.06.05 |