Python 3, puan = 1.57
İlk önce yılanımız görüntüyü birbirinden eşit mesafede dikey çizgiler oluşturarak hareket ettirir.
Bu yılanı, yan yana dikey bir çizgide iki nokta alarak ve uç noktaları kendileri olan bir halka oluşturarak uzatabiliriz.
| |
| => +----+
| +----+
| |
Noktaları çiftler halinde düzenliyoruz ve her çift için en yüksek ortalama parlaklığa sahip olan döngünün boyutunu ve ortalama parlaklık değerini saklıyoruz.
Her adımda, uzatmada maksimum ortalama parlaklığı elde etmek için döngüsünü uzayan en yüksek değerli çifti seçer ve çift için yeni optimal döngü boyutunu ve parlaklık değerini hesaplar.
(Value, size, point_pair) tripletlerini değere göre sıralanmış bir yığın yapısında saklıyoruz, böylece en büyük elementi (O (1)) kaldırabilir ve yeni değiştirilmiş olanı (O (log n)) verimli bir şekilde ekleyebiliriz.
Piksel sayım sınırına ulaştığımızda duruyoruz ve o yılan son yılan olacak.
Dikey çizgiler arasındaki mesafe sonuçlarda çok az etkiye sahiptir, bu yüzden sabit bir 40 piksel seçilmiştir.
Sonuçlar
swirl 1.33084397946
chaos 1.76585674741
fractal 1.49085737611
bridge 1.42603926741
balls 1.92235115238
scream 1.48603818637
----------------------
average 1.57033111819
Not: Orijinal "Çığlık" resmi mevcut değildi, bu yüzden benzer çözünürlükte başka bir "Çığlık" resmi kullandım.
Yılan genişletme işlemini "girdap" görüntüsü üzerinde gösteren GIF:
Kod, bir (veya daha fazla boşlukla ayrılmış) dosya adını stdin'den alır ve elde edilen yılan görüntülerini png dosyalarına yazar ve puanları stdout'a yazdırır.
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)
.