Python 3 คะแนน = 1.57
ครั้งแรกของเราเดินทางงูภาพการสร้างเส้นแนวตั้งที่มีระยะทางเท่ากันจากแต่ละอื่น ๆ
เราสามารถขยายงูนี้โดยการจับสองจุดติดกันเป็นแนวตั้งและสร้างลูปที่มีจุดปลายอยู่
| |
| => +----+
| +----+
| |
เราจัดระเบียบคะแนนให้เป็นคู่และสำหรับทุกคู่ที่เราจัดเก็บขนาดและค่าความสว่างเฉลี่ยของลูปที่ให้มีความสว่างเฉลี่ยมากที่สุด
ในทุกขั้นตอนเราเลือกคู่ที่มีค่าสูงสุดขยายลูปเพื่อให้ได้ความสว่างเฉลี่ยสูงสุดในส่วนขยายและคำนวณขนาดลูปและความสว่างที่เหมาะสมที่สุดสำหรับคู่
เราเก็บ Triplets (ค่า, ขนาด, 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
หมายเหตุ: รูปภาพต้นฉบับ "The Scream" ไม่พร้อมใช้งานดังนั้นฉันจึงใช้รูปภาพ "The 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)
คุณสามารถเปิดภาพลงในการเชื่อมโยงกับต้นฉบับของพวกเขา