Python 3, Score = 1,57
Zuerst bewegt sich unsere Schlange durch das Bild und erzeugt vertikale Linien mit gleichem Abstand voneinander.
Wir können diese Schlange erweitern, indem wir zwei Punkte in einer vertikalen Linie nebeneinander nehmen und eine Schleife erstellen, deren Endpunkte sie sind.
| |
| => +----+
| +----+
| |
Wir ordnen die Punkte paarweise an und speichern für jedes Paar die Größe und den durchschnittlichen Helligkeitswert der Schleife, die die größte durchschnittliche Helligkeit ergibt.
Bei jedem Schritt wählen wir das Paar mit dem höchsten Wert aus, erweitern seine Schleife, um die maximale durchschnittliche Helligkeit der Erweiterung zu erreichen, und berechnen die neue optimale Schleifengröße und den Helligkeitswert für das Paar.
Wir speichern die (value, size, point_pair) -Triplets in einer nach Wert sortierten Heap-Struktur, damit wir das größte Element (in O (1)) entfernen und das neue modifizierte Element (in O (log n)) effizient hinzufügen können.
Wir hören auf, wenn wir die Pixelzahlgrenze erreicht haben und diese Schlange wird die letzte Schlange sein.
Der Abstand zwischen den vertikalen Linien hat nur einen sehr geringen Einfluss auf das Ergebnis. Daher wurde eine konstante Anzahl von 40 Pixeln gewählt.
Ergebnisse
swirl 1.33084397946
chaos 1.76585674741
fractal 1.49085737611
bridge 1.42603926741
balls 1.92235115238
scream 1.48603818637
----------------------
average 1.57033111819
Hinweis: Das Originalbild "The Scream" war nicht verfügbar, daher habe ich ein anderes Bild "The Scream" mit ähnlicher Auflösung verwendet.
Gif zeigt den Vorgang der Schlangenerweiterung auf dem "Wirbel" -Bild:
Der Code nimmt einen (oder mehrere durch Leerzeichen getrennte) Dateinamen von stdin und schreibt die resultierenden Schlangenbilder in PNG-Dateien und druckt die Partituren nach 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)
.