The Python Challenge – Level 18

http://www.pythonchallenge.com/pc/return/balloons.html

비슷한 두개의 그림이 보이며 소스를 보면 "it is more obvious that what you might think" 라는 메세지가 있다.
두 그림의 확실한 차이점은 밝기 이다. 따라서 밝기를 영어로 bright 이니 bright.html 로 접속해 보니 ness 라는 메시지가 나왔다. 따라서 아래 페이지를 확인할 수 있었다.

http://www.pythonchallenge.com/pc/return/brightness.html

이 페이지 소스에는 deltas.gz 파일이 소스에 들어 있었다. deltas.gz 파일 내용을 살펴보면 PNG 형식의 이미지 파일로 보이는 헤더가 보이므로 해당 이미지들을 추출해보면 깨진 이미지가 나온다.

고민한 결과 해당 문제의 제목이 diff 였으므로 두개의 바이너리 값들을 diff 하여 같은것, 왼쪽에만 있는것, 오른쪽에만 있는것으로 뽑아서 PNG 이미지 파일로 추출하여 보면 아래와 같은 이미지 들이 나온다.

#!c:\python26\python.exe
import gzip,difflib

def output(x, length, number):
    count = 2
    for y in range( len(length)/2 ):
        tmp = x[count:count+2]
        tmp = int(tmp, 16)
        if number == 1:
            file1.write(chr(tmp))
        elif number == 2:
            file2.write(chr(tmp))
        elif number == 3:
            file3.write(chr(tmp))
        count += 3

deltas = gzip.GzipFile('deltas.gz', 'rb').read()
deltas = deltas.split('\n')

file1 = open('output1.png', 'wb')
file2 = open('output2.png', 'wb')
file3 = open('output3.png', 'wb')

left = []
right = []
for x in deltas:
    left.append(x[:53])
    right.append(x[56:])
diff = list(difflib.ndiff(left, right))

for x in diff:
    length = x.replace(' ', '')
    if x[0] == '-':
        output(x, length, 1)
    elif x[0] == '+':
        output(x, length, 2)
    elif x[0] == ' ':
        output(x, length, 3)



이 문제를 풀면서 깨달은것 하나! difflib 모듈 사용 시 리스트 형태가 아닌 스트링 형태로 넘기게 되면 결과가 나오는데 천만년이 걸린다는 사실.... -_-

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다