Python/Python Challenge

[Python Challenge 25] 퍼즐맞추기

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/

 

Python PIL | Image.frombytes() Method - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

* 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