파이썬 3, 점수 = 1.57
먼저 뱀이 이미지를 이동하여 서로 같은 거리에있는 세로선을 만듭니다.
세로줄에서 서로 옆에 두 개의 점을 찍고 끝 점이 그들 인 루프를 만들어이 뱀을 확장 할 수 있습니다.
| |
| => +----+
| +----+
| |
점을 쌍으로 구성하고 모든 쌍에 대해 루프의 크기와 평균 밝기 값을 저장하여 평균 밝기가 가장 높습니다.
모든 단계에서 우리는 가장 높은 값을 가진 쌍을 선택하여 루프에서 확장하여 최대 평균 밝기를 얻도록하고 새로운 최적의 루프 크기와 밝기 값을 계산합니다.
(value, size, point_pair) 삼중 항을 값으로 정렬 된 힙 구조에 저장하므로 가장 큰 요소 (O (1))를 제거하고 새로운 수정 된 요소 (O (log n))를 효율적으로 추가 할 수 있습니다.
픽셀 수 제한에 도달하면 그 뱀이 마지막 뱀이됩니다.
수직선 사이의 거리는 결과에 거의 영향을 미치지 않으므로 일정한 40 픽셀이 선택되었습니다.
결과
swirl 1.33084397946
chaos 1.76585674741
fractal 1.49085737611
bridge 1.42603926741
balls 1.92235115238
scream 1.48603818637
----------------------
average 1.57033111819
참고 : 원본 "Scream"그림을 사용할 수 없었으므로 비슷한 해상도의 다른 "Scream"그림을 사용했습니다.
"소용돌이"이미지에서 뱀 확장 과정을 보여주는 GIF :
이 코드는 stdin에서 하나 이상의 공백으로 구분 된 파일 이름을 가져 와서 결과 뱀 이미지를 png 파일에 기록하고 점수를 stdout에 인쇄합니다.
from PIL import Image
import numpy as np
import heapq as hq
def upd_sp(p,st):
vs,c=0,0
mv,mp=-1,0
for i in range(st,gap):
if p[1]+i<h:
vs+=v[p[0],p[1]+i]+v[p[0]+1,p[1]+i]
c+=2
if vs/c>mv:
mv=vs/c
mp=i
return (-mv,mp)
mrl=[]
bf=input().split()
for bfe in bf:
mr,mg=0,0
for gap in range(40,90,1500):
im=Image.open(bfe)
im_d=np.asarray(im).astype(int)
v=im_d[:,:,0]+im_d[:,:,1]+im_d[:,:,2]
w,h=v.shape
fp=[]
sp=[]
x,y=0,0
d=1
go=True
while go:
if 0<=x+2*d<w:
fp+=[(x,y)]
fp+=[(x+d,y)]
sp+=[(x-(d<0),y)]
x+=2*d
continue
if y+gap<h:
for k in range(gap):
fp+=[(x,y+k)]
y+=gap
d=-d
continue
go=False
sh=[]
px=im.load()
pl=[]
for p in fp:
pl+=[v[p[0],p[1]]]
px[p[1],p[0]]=(0,127,0)
for p in sp:
mv,mp=upd_sp(p,1)
if mv<=0:
hq.heappush(sh,(mv,1,mp+1,p))
empty=False
pleft=h*w//3
pleft-=len(fp)
while pleft>gap*2 and not empty:
if len(sh)>0:
es,eb,ee,p=hq.heappop(sh)
else:
empty=True
pleft-=(ee-eb)*2
mv,mp=upd_sp(p,ee)
if mv<=0:
hq.heappush(sh,(mv,ee,mp+1,p))
for o in range(eb,ee):
pl+=[v[p[0],p[1]+o]]
pl+=[v[p[0]+1,p[1]+o]]
px[p[1]+o,p[0]]=(0,127,0)
px[p[1]+o,p[0]+1]=(0,127,0)
pl+=[0]*pleft
sb=sum(pl)/len(pl)
ob=np.sum(v)/(h*w)
im.save(bfe[:-4]+'snaked.png')
if sb/ob>mr:
mr=sb/ob
mg=gap
print(bfe,mr)
mrl+=[mr]
print(sum(mrl)/len(mrl))
[![image description](SE URL for downsized image)](URL for original image)
.