Python 3、スコア= 1.57
まず、ヘビが画像を移動して、互いに等距離の垂直線を作成します。
この蛇を縦線で互いに隣り合う2つの点に取り、それらの端点をループとすることで、この蛇を拡張できます。
| |
| => +----+
| +----+
| |
ポイントをペアに編成し、ペアごとに、平均輝度が最大になるループのサイズと平均輝度値を保存します。
すべてのステップで、最大値を持つペアを選択してループを拡張し、拡張で最大平均輝度を達成し、ペアの新しい最適なループサイズと輝度値を計算します。
最大値の要素(O(1))を削除し、新しい変更された要素(O(log n))を効率的に追加できるように、(value、size、point_pair)トリプレットを値でソートされたヒープ構造に格納します。
ピクセル数の制限に達すると停止し、その蛇が最後の蛇になります。
垂直線間の距離は結果にほとんど影響しないため、一定の40ピクセルが選択されました。
結果
swirl 1.33084397946
chaos 1.76585674741
fractal 1.49085737611
bridge 1.42603926741
balls 1.92235115238
scream 1.48603818637
----------------------
average 1.57033111819
注:オリジナルの「The Scream」画像は利用できなかったため、同じ解像度の別の「The Scream」画像を使用しました。
「渦巻き」画像上でのヘビ拡張プロセスを示すGif:
コードは、stdinから1つ(または複数のスペースで区切られた)ファイル名を取得し、結果のスネーク画像を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)
。