프로그램/Python

[Python Challenge] 파이썬 챌린지 - 7

naudhizb 2017. 3. 18. 14:30
반응형

페이지에 들어가면 또 불친절하게 사진 한장만이 덜렁 있다.




강가의 사진을 보여주는데 중간헤 회색 바로 색깔이 변하는 것을 알 수 있다.



직감적으로 이미지를 받아 분석하면 답을 얻을 수 있다고 생각이 든다.


이미지를 읽고 편집하기 위해서는 파이썬의 PIL 패키지를 사용하여야 한다. 




$pip install PIL 을 입력하여 패키지를 설치한다. 




urllib을 이용하여 사진을 다운로드 받는다. 





중간에 회색들을 읽기 위하여 대략적인 수도 코드를 구상해보자. 


사진 불러오기 -> 세로를 검색하며 처음 회색인 픽셀 찾기 -> 가로로 픽셀들을 읽어 색깔이 달라지는 경우를 포착하여 가로값 읽기

-> 회색이 아닌 픽셀이 아닐 때까지 읽어 값을 리스트로 정리하기 -> 데이터 분석



회색 값들을 읽기 위한 사각형의 위치를 알기 위한 코드를 작성해 보면 아래와 같다. 




코드를 실행해 보면 다음과 같은 값을 얻을 수 있다. 


43

5

43

12


처음 회색의 위치는 (0,43)부터 시작하며 첫 사각형의 가로의 길이는 5, 다음 사각형의 가로의 길이는 7이라는 것을 알 수 있다. 

(순수 코드로 하기 위해서는 처음 사각형의 가로 길이가 7이면 좋은데,, 왜 5인지는 잘 모르겠다. )


이를 통하여 값을 읽어 리스트로 저장하여 보자. 


수도 코드는 다음과 같다. 


이미지 읽어오기 -> 읽어올 단위 설정 -> 같은 회색 블럭 단위로 읽음


for 회색 가로 줄에 대하여 : 회색 값을 문자로 변환해 리스트로 저장

--> 저장후 문자열로 출력

문자열의 숫자를 정규표현식을 이용 리스트로 저장-> 숫자-> 글자로 변환

문자열 출력



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import urllib
from PIL import Image
 
file_URL = "http://www.pythonchallenge.com/pc/def/oxygen.png"
img_file = urllib.urlopen(file_URL).read()
 
import os
if not os.path.exists("oxygen.png") :
    fp = open("oxygen.png"'wb')
    fp.write(img_file)
    fp.close()
 
img = Image.open('oxygen.png')
width = img.width
height = 0
while True :
    r,g,b,a = img.getpixel((0,height))
    if r==g==b:
        break
    height += 1
 
width_interval = 7
print "image width : " + `width`
print "pixel height position : " + `height`
print "pixel width : "  + `width_interval`
 
my_list = []
for x in range(0, width, width_interval) :
        try:
            r,g,b,a = img.getpixel((x,height))
            print "read (" + `x` + "," + `height` + ")"
            if(r == g == b) :
                my_list.append(chr(r))
        except:
            break
my_str = "".join(my_list)
 
print my_str
 
import re
 
next_list_num = map(int,re.findall("\d+",my_str))
next_list_char = map(chr,next_list_num)
 
print "".join(next_list_char)
 
 
 
 
cs



결과 출력은 다음과 같다.


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

integrity



다음 스테이지는 intergrity.


반응형