본문 바로가기

#WarGame/Python Challenge

Python Challenge # LV.14 (spiral)

반응형

출처) http://www.pythonchallenge.com/index.php

 

The Python Challenge

What people have said about us: "These sorts of things are in my opinion the best way to learn a language.", brberg at Media Cloisters "It's the best web site of the year so far.", Andy Todd at halfcooked "Addictive way to learn the ins and outs of Python.

www.pythonchallenge.com

 

 

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

[그림1. LV14 문제]

 

  • 파이썬 챌린지 레벨14 문제!
  • 빵 사진과 밑에 바코드 같이 생긴 작은 이미지가 있다.
  • 페이지 소스를 확인해 보았다.

 

[그림2. page source]

 

  • 제목은 walk around.
  • 바코드 처럼 생긴 이미지는 wire.png였고, 크기는 100*100이라고 나와있다.
  • 중간에 주석으로 "remember: 100*100 = (100+99+99+98) + (..." 가 적혀있다.
  • 문제화면에서 바코드처럼 생긴 이미지가 나와있길래 저 형태인 줄 알았는데 저장해서 열어보니 아래와 같았다.

 

[그림3. wire.png]

 

  • 실선처럼 보이는 것 같이 가까이에서 보면 넓어진 면적이 오른쪽으로 갈 수록 점점 좁아지는 걸 볼 수 있다.
  • 처음으로 돌아와 빵사진을 보면 회오리처럼 되어있다. 즉 나선형이다.
  • wire.png의 크기를 출력해 보았다.

 

[그림4. 이미지 크기]

 

  • 10000*1이 나왔다. 
  • 페이지소스에서 wire.png의 크기는 100*100이였다. 사이즈를 길게 늘려놓은 것 같다.
  • 주석에 나온 힌트처럼 나선형모양으로 픽셀좌표를 다시 계산하여 출력하면 답이 나올 것 같다.

 

[그림5. 나선형 행렬]

 

  • 크기를 5라고 가정했을 때 위의 그림에서 빨간색 화살표 순서로 출력하면 될 것 같다.

 

from PIL import Image
img = Image.open("D:/python_challenge/wire.png")

new = Image.new('RGB',[100,100])  

wire_size = -1  #img.size[0]길이까지 커져야 한다.
count=0			#50바퀴를 돌아야 한다.
rounds=49		#50바퀴가 되면 멈추어야 한다.

while wire_size < img.size[0]:
    for i in range(count,100-count):
        wire_size += 1
        tmp = img.getpixel((wire_size,0))
        new.putpixel((i,count),tmp)			#putpixel( (x좌표, y좌표), ( R, G, B, A) )
        
        print(f'wire:{wire_size}   new1({i},{count})')
    print('-'*50)    
    
    for i in range(count+1, 100-count):
        wire_size += 1
        tmp = img.getpixel((wire_size,0))
        new.putpixel((100-count-1,i),tmp)
        
        print(f'wire:{wire_size}   new2({100-count-1},{i})')
    print('-'*50)    
    
    for i in range(100-count-2,count-1,-1):
        wire_size += 1
        tmp = img.getpixel((wire_size,0))
        new.putpixel((i,100-count-1),tmp)
        
        print(f'wire:{wire_size}   new3({i},{100-count-1})')
    print('-'*50)    
    
    for i in range(100-count-2,count,-1):
        wire_size += 1
        tmp = img.getpixel((wire_size,0))
        new.putpixel((count,i),tmp)
        
        print(f'wire:{wire_size}   new4({count},{i})')
    print('-'*50)    
    
    
    count += 1
    print(count)
    if count > rounds:
        break

new.show()
new.save("D:/python_challenge/spiral.png")

 

 

 

[그림6. 출력]

 

[그림7. 최종결과]

 

  • 코드를 실행해보면 고양이 이미지가 나온다.
  • url에 cat이라고 입력했더니 이미지에 15라는 레벨 숫자가 안 적혀있다. 
  • 고양이 이름이 uzi라고 적혀있다.

 

[그림8. 고양이]

 

 

 

 

반응형