2011. 6. 28. 02:05

[ Problem ] - http://huge:file@www.pythonchallenge.com/pc/return/5808.html

♧ 흐릿한 이미지가 보인다. (해당 타이틀을 보면 "odd-even" 홀수/짝수에 대한 힌트가 주어진다.)
♧ 해당 이미지를 PIL의 getpixel()로 픽셀 값을 읽어 보면 홀/짝 순으로 번갈아 가며 특정한 패턴이 보인다.

   

♧ 해당 픽셀 값을 짝수로 읽어보면 다음과 같다.

# encoding=utf8
import urllib, StringIO
from PIL import Image, ImageDraw

# ① 이미지 파일 오픈.
url = 'http://huge:file@www.pythonchallenge.com/pc/return/cave.jpg'
u_img = urllib.urlopen(url).read()
im = Image.open(StringIO.StringIO(u_img))

# ② 짝수번째 픽셀을 저장할 빈 이미지 생성.
even_im = Image.new('RGB', (im.size[0], im.size[1]))

# ③ 해당 이미지의 짝수번째 픽셀값만 even_im에 변경하여 그리기.
for x in range(im.size[0]):
    for y in range(im.size[1]):
        if (x+y)%2 == 0:
            even_im.putpixel((x, y), im.getpixel((x,y)))

# ④ 해당 이미지를 반으로 출력. (320x240)
even_im.resize((320,240)).show()

   

♧ 출력 화면을 보면 오른쪽 위에 흐릿하게 'evil'이란 단어가 보인다.

  

   

[ Solution ] - http://www.pythonchallenge.com/pcc/return/evil.html

(※ 문제에 대한 다양한 해결법은 링크 참조.)

Posted by devanix
2011. 6. 27. 01:04

[ Problem ] - http://www.pythonchallenge.com/pc/return/bull.html

♧ 소스를 보면 황소에 링크(sequence.txt)가 걸려 있다.

Sequence.txt 파일을 보면 'a = [1, 11, 21, 1211, 111221,' 라는 내용이 보인다.

♧ 이것은 '보고 말하기 수열(look and say sequence)'로 우리에겐 '개미수열'

프랑스 소설가 베르나르 베르베르의 소설 [개미]로 많이 알려졌다.

♧ 위의 그림과 같이 앞에서 부터 중복되는 숫자의 개수와 그의 수를 차례로 보고 말하는 수열이다.

(※ 자세한 내용은 다음 [참조 1] [참조 2] 페이지를 참고하자.)

♧ 즉, 위의 1로 시작하는 '개미수열'의 30번째 단계의 길이(len(a[30]) = ?)
맞추는 문제이다.

(※ 해당 솔루션 문서 참조)

import re

curr = '1'
for each in range(30):
    match = re.findall("(\d)(\\1*)", curr)
    curr = ''.join([str(len(k+y))+k for k,y in match])

print len(curr)

  

   

[ Solution ] - http://www.pythonchallenge.com/pcc/return/5808.html

(※ 문제에 대한 다양한 해결법은 링크 참조.)

Posted by devanix
2011. 6. 23. 19:39

[ Problem ] - http://www.pythonchallenge.com/pc/return/good.html

♧ 그림을 보면 검은 점들이 많이 보인다.

♧ 소스를 보면 title은 connect the dots로 알 수 있듯이 점들을 연결시키는 문제이다.

♧ 주석에 first와 second은 좌표에 점들을 의미하는데

이것은 PIL의 ImageDraw Moduledraw.line(xy, options)를 이용하여 각 좌표의 점들을 연결 시킨다.

   

♧ 그럼 좌표를 연결시켜 그려 보자. 처리 순서는 다음과 같다.

from PIL import Image, ImageDraw
# encoding=utf8

# ① 소스에 있는 first와 second를 붙여 넣기 한다.
first = [146,399,163, ...[생략]...]
second = [156,141,165, ...[생략]...]

# ② 이미지 생성.
img = Image.new('RGB', (640,480))
draw = ImageDraw.Draw(img)

# ③ 첫번째 점들을 연결시키면 황소에 몸통 부분이 녹색 으로 보인다.
draw.line(first, 'green', 2)
# ④ 두번째 점들을 연결시키면 황소에 얼굴 부분이 붉은색 으로 보인다.
draw.line(second, 'red', 2)
# ⑤ 그림을 보여준다.
img.show()

(※ 해당 좌표는 길어서 생략, 소스에 있는 좌표를 붙여 넣기 하자.)

   

♧ 출력 화면

(※ 해당 그림에 뿔이 존재 하기에 젖소(cow)가 아니라 황소 (bull)를 나타낸다.)

   

[ Solution ] - http://www.pythonchallenge.com/pcc/return/bull.html

(※ 문제에 대한 다양한 해결법은 링크 참조.)

   

Posted by devanix
2011. 6. 23. 13:45

[ Problem ] - http://www.pythonchallenge.com/pc/def/integrity.html

벌(bee) 그림이 보인다. 마치 bz2 모듈을 연상 시킨다 (bee? busy. busy? busy too ? bz2?)
먼저 소스 코드를 보자.

① 링크가 걸려 있다. ("coords"에 보이는 숫자들은 벌(bee) 모양 따라 링크 하기 위함)

맨 밑의 주석에 un과 pw가 있다.

( ※ BZh9는 bz2의 매직넘버를 나타낸다 : http://www.amiga-stuff.com/crunchers-id.html (search for BZh9))

   

벌(bee) 그림을 클릭 하면 해당 인증 창이 뜨는 것을 볼수 있다.

(위의 주석에 있는 un/pw를 bz2 모듈을 이용해 풀어서 입력)

   

bz2 모듈을 이용해서 풀어보자 (http://docs.python.org/library/bz2.html 참조)

import bz2

un = "BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02"\
"\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084"
pw = "BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ "\
"\x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08"

print bz2.BZ2Decompressor().decompress(un)
print bz2.BZ2Decompressor().decompress(pw)

(출력해 보면 username과 password 를 볼수 있다.)

huge

file

  

[ Solution ] - http://www.pythonchallenge.com/pcc/return/good.html:huge:file

(※ 문제에 대한 다양한 해결법은 링크 참조.)

Posted by devanix
2011. 6. 22. 15:24

[ Problem ] - http://www.pythonchallenge.com/pc/def/oxygen.html

가운데 회색 바가 수상해 보인다. 해당 격자를 7픽셀 단위로 RGB값을 뽑아서 ASCII문자로 변환 해야 하는데

파이썬에는 내장된 이미지 라이브러리가 없음으로 Python Imaging Library (PIL)를 사전에 설치 하자.

   

♧ 처리 순서는 아래와 같다.

import Image, urllib, StringIO, re
# coding=utf8

# ① 이미지 파일 오픈.
u_img = urllib.urlopen("http://www.pythonchallenge.com/pc/def/oxygen.png").read()
img = Image.open(StringIO.StringIO(u_img))

# ② 이미지 길이와 회색바 위치 구함.
middle =  (img.size[1]/2)
width = img.size[0]

# ③ 7픽셀 단위로 RGB값 구함
pixels = [img.getpixel((x, middle)) for x in range(0, width, 7)]

# ④ pixels값의 R,G,B가 동일한 값만을 뽑아낸다.
ords = [r for r,g,b,a in pixels if r == g == b]

# ⑤ 뽑아낸 RGB값은 ASCII값으로 문자로 변환 출력.
result = ''.join(map(chr, ords))
print result

# ⑥ 출력된 결과의 또다른 ASCII값을 찾아 int형 변환->chr변환->출력.
print ''.join(map(chr, map(int, re.findall("\d+", result))))

[ 출력 결과 ]

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

integrity

(※ 사용한 PIL의 모듈은 레퍼런스 문서를 참조)

   

[ Solution ] - http://www.pythonchallenge.com/pcc/def/integrity.html

(※ 문제에 대한 다양한 해결법은 링크 참조.)

Posted by devanix
2011. 6. 22. 11:00

[ problem ] - http://www.pythonchallenge.com/pc/def/channel.html

청바지에 zipper 사진만 덩그러니 있다. 일단 소스를 보자.

맨 위에 "zip" 주석이 보인다.

   

♧ ("http://www.pythonchallenge.com/pc/def/channel.zip") 다운을 받고 "README.txt"를
읽어 보면
아래와 같은 힌트가 보인다. ( '90052'부터 시작해라! 'zip'안에 답이 있다? )

궁금함을 뒤로 하고 'nothing'을 을 쫒아 가다 보면 "Collect the comments." 라는 문구가 보인다.

   

♧ 힌트를 종합해 보면 zip 안에 주석문을 모아야 한다. (※ zipfile 모듈을 이용)

   

♧ 다시 zipfile 모듈을 이용하여 주석을 모으면 "HOCKEY"라는 단어가 보인다.

URL을 고쳐 다시 쿼리를 보내면 "it's in the air. look at the letters." 문구가 보인다.

주석을 모은 메시지 출력문을 자세히 보면 "OXYGEY"라는 단어가 보인다.

   

[ Solution ] - http://www.pythonchallenge.com/pcc/def/oxygen.html

(※ 문제에 대한 다양한 해결법은 링크 참조.)

Posted by devanix
2011. 6. 22. 09:22

[ Problem ] - http://www.pythonchallenge.com/pc/def/peak.html

"pronounce it" 발음해라? 일단 소스를 보자!

알수 없는<peakhell> 태그에 "banner.p" 이 보인다. 일단 다운받자!

(※ "peakhell" 발음을 몇 번 큰소리로 말하면 "pickle" 모듈의 발음 소리와 비슷하다.)
 

"banner.p"를 노트패드로 열어 보면 알 수 없는 문자들이 보인다. (피클링된 객체)

이 알 수 없는 문자들을 pickle 모듈을 이용해서 unpickle 해야 한다.

( ※ 참조 : "파이썬 영속성 관리", "http://docs.python.org/library/pickle.html")
 

unpickle하면 리스트와 튜플안에 문자와 숫자가 보이는데 이것을

문자*숫자로 풀어보면 "channel"이란 단어가 보인다.

   

  

   

[ Solution ] - http://www.pythonchallenge.com/pcc/def/channel.html

(※ 문제에 대한 다양한 해결법은 링크 참조.)

Posted by devanix
2011. 6. 21. 15:26

[ problem ] - http://www.pythonchallenge.com/pc/def/linkedlist.php

소스 보기를 하면 다음과 같은 힌트가 보인다.

화면에 있는 그림을 클릭하면 화면에 get 메소드로 nothing 이라는 값에 '12345'를

넘겨주며 다음 nothing 번호를 알려준다.

이처럼 페이지에 나온 다음 nothing 값을 파싱하여 그림과 같이 nothing값에 대입하여 계속 하여 쿼리를 날려준다.

도중에 "Yes. Divide by two and keep going." 메시지가 보이면 nothing값을 2로 나눠

계속 쿼리를 날리면 마지막엔 "peak.html" 메시지 보인다.

(※ 힌트 내용 처럼 urllib 모듈을 사용하길 권장하며, 직접 친다면 손이 피곤해질 것이다.)

   

   

[ Solution ] - http://www.pythonchallenge.com/pcc/def/peak.html

(※ 문제에 대한 다양한 해결법은 링크 참조.)

Posted by devanix