[pythonchallenge] 7번 문제 풀이

1 분 소요

💡 pythonchallenge.com 7번 문제에 대한 풀이입니다.

문제

image

문제 풀이

이번 문제는 소스코드에 힌트도 없이 문제에 있는 사진이 전부입니다. 사진을 보면, 검정과 회색줄로 쭉 그어져 있는 부분이 있습니다. 이미지 분석 라이브러리인 PIL(Python Imaging Library)을 이용하여 분석해 봅니다.

우선 그림에서 회색으로 칠해져 있는 부분을 찾기 위해서 이미지의 첫 열들을 모두 출력해보면 다른 픽셀들과 다르게 연속적으로(155,155,155)인 부분이 있습니다.

img = Image.open("oxygen.png")

width,height = img.size

# img[x][y]
for y in range(height):
        print(y,img.getpixel((0,y)))

image

회색이 있는 부분은 43-51번째 행인것을 알 수 있습니다. 그 중 45번째 행을 모두 출력해봅니다.

for x in range(width):
    print(x,img.getpixel((x,45)))

image

그림을 보면 7번씩 동일한 값이 반복되어 값이 출력됨을 볼 수 있습니다. 숫자의 범위를 보면 ascii로 출력이 가능한 범위임을 알 수 있습니다. 따라서 7번째 숫자마다 ascii로 출력을 해봅니다.

for x in range(0,width,7):
    print(chr(img.getpixel((x,45))[0]),end='')

image

smart guy, you made it. the next level is [105, 110, 116, 101, 103, 114, 105, 116, 121]vse

끝에 있는 vse 같은 경우는 이미지 파일을 보면 회색선이 그림의 끝까지 있는게 아닌 마지막부분에서 조금 부족한 것을 알 수 있습니다. 따라서 해당 부분은 이미지의 진짜 픽셀임을 알 수 있습니다. 해당부분을 제외한 메시지에 나와있는 값들도 아스키로 출력을 해보면 답이 나옵니다.

message = [105, 110, 116, 101, 103, 114, 105, 116, 121]
for character in message:
    print(chr(character),end='')
# Integrity

다음문제의 답은 integrity입니다.

전체 코드

from PIL import Image
import requests

url = "http://www.pythonchallenge.com/pc/def/oxygen.png"
response = requests.get(url)

with open("oxygen.png","wb") as fw:
    fw.write(response.content)

img = Image.open("oxygen.png")
#img.show()

width,height = img.size
# (629,95)

# img[x][y]
for y in range(height):
        print(y,img.getpixel((0,y)))


for x in range(width):
    print(x,img.getpixel((x,45)))

for x in range(0,width,7):
    print(chr(img.getpixel((x,45))[0]),end='')
# smart guy, you made it. the next level is [105, 110, 116, 101, 103, 114, 105, 116, 121]vse


message = [105, 110, 116, 101, 103, 114, 105, 116, 121]
for character in message:
    print(chr(character),end='')

# Integrity

다음 문제

http://www.pythonchallenge.com/pc/def/integrity.html

댓글남기기