Python 3, điểm = 1,57
Đầu tiên con rắn của chúng ta di chuyển hình ảnh tạo ra các đường thẳng đứng với khoảng cách bằng nhau.
Chúng ta có thể mở rộng con rắn này bằng cách lấy hai điểm cạnh nhau theo một đường thẳng đứng và tạo một vòng lặp có điểm cuối là chúng.
| |
| => +----+
| +----+
| |
Chúng tôi sắp xếp các điểm thành các cặp và với mỗi cặp chúng tôi lưu trữ kích thước và giá trị độ sáng trung bình của vòng lặp mang lại độ sáng trung bình lớn nhất.
Ở mỗi bước, chúng tôi chọn cặp có giá trị cao nhất mở rộng vòng lặp của nó để đạt được độ sáng trung bình tối đa trên phần mở rộng và tính toán kích thước vòng tối ưu mới và giá trị độ sáng cho cặp.
Chúng tôi lưu trữ các bộ ba (giá trị, kích thước, point_ Pair) trong cấu trúc heap được sắp xếp theo giá trị để chúng tôi có thể loại bỏ phần tử lớn nhất (trong O (1)) và thêm một phần được sửa đổi mới (trong O (log n)) một cách hiệu quả.
Chúng tôi dừng lại khi đạt đến giới hạn số pixel và con rắn đó sẽ là con rắn cuối cùng.
Khoảng cách giữa các đường thẳng đứng có rất ít ảnh hưởng đến kết quả, do đó, 40 pixel không đổi được chọn.
Các kết quả
swirl 1.33084397946
chaos 1.76585674741
fractal 1.49085737611
bridge 1.42603926741
balls 1.92235115238
scream 1.48603818637
----------------------
average 1.57033111819
Lưu ý: hình ảnh "The Scream" ban đầu không có sẵn nên tôi đã sử dụng một hình ảnh "The Scream" khác với độ phân giải tương tự.
Gif hiển thị quá trình mở rộng con rắn trên hình ảnh "xoáy":
Mã này lấy một (hoặc nhiều không gian được phân tách) tên tệp từ stdin và ghi hình ảnh con rắn thu được vào tệp png và in điểm số ra thiết bị xuất chuẩn.
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)
.