2011. 11. 21. 17:36

[ Problem ]

http://huge:file@www.pythonchallenge.com/pc/return/uzi.html

§ 그림에 1월 26에 표시된 달력이 보입니다.

하지만 년도는 구멍이 나있어 정확한 년도는 보이지 않고 1xx6년 이라는 추측만 할수 있습니다.

또한 우측하단에 12월과 2월이 보이는데 정확한 숫자는 알수 없으나 2월에 29칸에 차있으므로,

이해는 윤년(leap year)임을 짐작할 수 있습니다.

 

즉, 1xx6년 1월 26일이 월요일 이며 윤년인 해로 요약할 수 있습니다

그럼 해당하는 해를 찾아 봅시다.

 

♧ 필요 메소드

 

calendar.isleap(year)

- 해당 년도가 윤년(leapyear)인지 판별 합니다.

calendar.weekday(year, month, day)

- year(1970-...), month(1-12), day(1-31)에 해당하는 요일을 반환합니다.

- 해당 요일은 월요일(0) ~ 일요일(6)로 0~6까지 'int'형을 반환.

 

♧ Source

 

[출력 결과]

 

출력결과를 보면 5개의 년도가 출력 되었다.(1176, 1356, 1576, 1756, 1976)

해당 HTML 페이지 소스에서 실마리를 찾아보자.

 

§ HTML 페이지 소스에서 힌트 찾기

 

힌트를 주석을 보면...

<!-- he ain't the youngest, he is the second -->

- 그는 최연소가 아니며 두 번째 이다?

즉 해당 년도중 가장 작은수가 아니고 끝에서 두번째인 1756년.

<!-- todo: buy flowers for tomorrow -->

- 내일을 위해 꽃을 사라? (내일... 27일)

 

해당 결과와 힌트를 조합해 보면 1756년 1월 27일이 된다.

▷ 검색해 보면 모차르트(mozart) 탄생일 이라는것을 알수 있다.

 

next challenge : mozart.html

[ Solution ]

http://huge:file@www.pythonchallenge.com/pcc/return/mozart.html

 

Posted by devanix
2011. 11. 21. 13:33

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

♧ 타이틀은 walk around 이고 빵 한 개와 바코드와 비슷하게 보이는 사진이 있다.

   

▷ 소스를 보자!

   

▷ 소스를 보면 'italy.jpg'는 빵 사진이고 'wire.png'는 바코드처럼 보이는 사진이다.

'wire.png'를 클릭해보면 '10000 x 1 pixels' 이라 아무것도 보이지 않는데

이것을 잠시 size를 '100 x 100'로 바꿔 보면 (크롬의 개발자 모드)

메인과 같은 바코드와 같은 그림이 보이는 것을 알 수 있다.

   

위에 소스에서 remember 주석을 참조해 보면 아래의 그림과 같이

바깥에서 부터 100+99+99+98+98+97...과 같이 2회당 1씩 감소한다.

즉, 위의 바코드 이미지를 아래와 같이 Pixel값을 회전하면서 재배치 한다.

   

w 이를 바탕으로 소스를 짜보면 다음과 같습니다.

   

[결과 이미지]

[ 'cat.html' 접속 화면 ]

   

▷ 마지막으로 'uzi.html' 접속하면 끝.

   

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

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

Posted by devanix
2011. 7. 1. 23:22

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

♧ 타이틀은 'call him', 'phone that evil' 이란 힌트와 함께 전화기 그림이 보인다.

즉, 악마에게 전화를 걸어야 하는데 그 악마가 누구인지 어떻게 호출해야 될지 모른다.

   

▷ 그림의 숫자'5'에는 링크가 걸려 있는데 클릭해 들어가 보면 XML형식의 코드가 보인다.

   

▷ 이는 XML-RPC Fault 형식과 유사한데 XML-RPC란,

인코딩 형식은 XML을 채택하고, HTTP를 통한 간단하고 이식성 높은 원격 프로시저 호출 방법을 제공하는

RPC 프로토콜의 일종이다.

   

   

▷ 파이썬 2.2부터 XML-RPC가 표준 모듈(xmlrpclib)로 포함되어 있으므로 따로 설치할 필요는 없다.

▷ 주요 함수는 다음과 같다.

♧ 주요 함수

ServerProxy.system.listMethods

- 서버가 어떠한 프로시저를 제공하는지 문자열 이름들을 리스트 형태로 출력.
ServerProxy.system.methodSignature(name)

- 프로시저가 어떻게 호출되는지 서명(인수 전달 목록)의 리스트를 돌려준다.
ServerProxy.system.methodHelp(name)

- 프로시저를 설명하는 문서 문자열을 가져다 준다.

   

▷ 위의 주요 함수를 통하여 해당 서버(phonebook)의 프로시저에 대한 정보를 출력해보자.

#encoding=utf8
from pprint import pprint
import xmlrpclib

# ① 해당 XML-RPC를 지원하는 phonebook 서버에 접속.
url = 'http://www.pythonchallenge.com/pc/phonebook.php'
phonebook = xmlrpclib.Server(url)

# ② 서버가 어떠한 API 제공하는지 리스트 형태로 출력.
pprint (phonebook.system.listMethods())

# ③ 'phone'에 대한 도움말 정보 얻기.
print phonebook.system.methodHelp("phone")

# ④ 'phone'에 대한 인수 목록 알아내기.
print phonebook.system.methodSignature('phone')

   

[ 출력 결과 ]

['phone',

'system.listMethods',

'system.methodHelp',

'system.methodSignature',

'system.multicall',

'system.getCapabilities']

Returns the phone of a person

[['string', 'string']]

▷ 위의 마지막 methodSignature('phone')의 결과로 얻어진 [['string', 'string']] 에서

처음 'string'은 프로시저의 리턴형이고 나머지는 입력 인수의 형이다.

▷ 즉, phone은 특정 이름을 string형으로 받아 string형으로 리턴 해주는 프로시저다.

   

▷ 악마는 누구인가!

이제 악마에게 전화를 거는 방법을 알았으니 그 악마가 누구 인지만 알면 된다.

Level12에서의 기억을 상기 시켜보면 evil4.jpg 에는 빈 화면이 보이는데

이것을 편집기로 보면 'Bert is evil! go back!' 라는 메시지가 출력 되었다.

즉, Bert가 evil이다.

   

▷ Bert에게 전화를 걸어 보자. (※ 위 소스코드 마지막 줄에 추가)

# ⑤ Bert에게 전화 걸기.
print phonebook.phone('Bert')

   

[ 출력 결과 ]

555-ITALY

  

   

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

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

Posted by devanix
2011. 6. 29. 04:46

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

♧ 카드 패를 5장씩 돌리고 있습니다. (타이틀은 dealing evil)

♧ 소스를 보면 evil1.jpg 링크가 걸려 있습니다. (이번 문제에만 숫자가 붙어 있습니다)

♧ 해당 그림의 패를 돌리는 모습을 연상하여 숫자를 증가 시켜 보면('evil2.jpg', 'evil3.jpg')

다음과 같은 그림 힌트가 주어 집니다.

♧ evil2.jpg를 보면 'not jpg-_.gfx' 메시지가 보입니다.
evil2.jpg를 -> evil2.gfx로 변경해 보면 evil2.gfx 파일을 받을 수 있습니다.

(
※ 참고로 evil4.jpg에는 빈 화면이 보이는데 이것을 편집기로 보면 'Bert is evil! go back!'
라는 메시지가 보인다. 이것은 다음 문제에 관련 되어 있다.)

 

♧ 해당 타이틀과 그림의 힌트를 다시 상기시키며

다음과 같이 'evil2.gfx' 파일을 5개의 파일로 각각 한 Byte씩 나눠 저장 합니다.

# encoding=utf8
from PIL import Image
from cStringIO import StringIO

# ① 해당 gfx 파일을 오픈.
im_file = open("evil2.gfx", 'rb').read()

# ② 해당 gfx파일을 각각 한 Byte씩 5개의 파일로 나눠서 저장.
for i in range(5):
    priece = im_file[i::5]
    im = Image.open(StringIO(priece))
    f = open(("%d.%s" % (i, im.format)), 'wb')
    f.write(priece)
    f.close()

   

♧ 'evil2.gfx'를 5분할 한 결과 입니다.

   

♧ 해당 그림의 단어를 연결해 보면 'disproportionality'에서

'ity'빼면 'disproportional'이 됩니다.

   

[ Solution ] - http://huge:file@www.pythonchallenge.com/pcc/return/disproportional.html 
( 문제에 대한 다양한 해결법은 링크 참조.)

Posted by devanix
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