Python 3, pontuação = 1,57
Primeiro, nossa cobra viaja pela imagem, criando linhas verticais com a mesma distância uma da outra.
Podemos estender essa cobra colocando dois pontos próximos um do outro em uma linha vertical e criando um loop cujos pontos finais são eles.
| |
| => +----+
| +----+
| |
Organizamos os pontos em pares e, para cada par, armazenamos o tamanho e o valor médio de brilho do loop, que fornece o maior brilho médio.
A cada passo, escolhemos o par com o valor mais alto, estendendo seu loop para obter o brilho médio máximo na extensão e calculando o novo tamanho de loop e valor de brilho ideais para o par.
Armazenamos os trigêmeos (value, size, point_pair) em uma estrutura de heap classificada por valor, para que possamos remover o elemento maior (em O (1)) e adicionar o novo elemento modificado (em O (log n)) com eficiência.
Paramos quando atingimos o limite de contagem de pixels e essa cobra será a cobra final.
A distância entre as linhas verticais tem muito pouco efeito nos resultados, portanto, uma constante de 40 pixels foi escolhida.
Resultados
swirl 1.33084397946
chaos 1.76585674741
fractal 1.49085737611
bridge 1.42603926741
balls 1.92235115238
scream 1.48603818637
----------------------
average 1.57033111819
Nota: a imagem original "The Scream" não estava disponível, então usei outra imagem "The Scream" com resolução semelhante.
Gif mostrando o processo de extensão da cobra na imagem "redemoinho":
O código pega um (ou mais espaços) nome do arquivo stdin e grava as imagens de cobra resultantes em arquivos png e imprime as pontuações no 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)
.