# Python 2, Score: 1.205

I put together a quick Python solution some time ago but forgot to post it. Here it is. It finds the richest blocks in the image, then travels to each block, eating all the best blocks it comes to.

### Results

    bridge.jpg: 591.97866/515.41501 =                               1.14855 
    BallsRender.png: 493.24711/387.80635 =                          1.27189 
    Mandel_zoom_04_seehorse_tail.jpg: 792.23990/624.60579 =         1.26838 
    Red_Vortex_Apophysis_Fractal_Flame.jpg: 368.26121/323.08463 =   1.13983 
    The_Scream.jpg: 687.18565/555.05221 =                           1.23806
    swirl.jpg: 762.89469/655.73767 =                                1.16341

    AVERAGE                                                         1.205

### Example Picture

![Processed bridge picture][1]

### Python 2.7 Code

<!-- language-all: lang-python -->

    from pygame.locals import *
    import pygame, sys, random

    fn = sys.argv[1]

    screen = pygame.display.set_mode((1900,1000))
    pic = pygame.image.load(fn)
    pic.convert()
    W,H = pic.get_size()
    enough = W*H/3
    screen.blit(pic, (0,0))

    ORTH = [(-1,0), (1,0), (0,-1), (0,1)]
    def orth(p):
        return [(p[0]+dx, p[1]+dy) for dx,dy in ORTH]

    def look(p):
        x,y = p
        if 0 <= x < W and 0 <= y < H:
            return sum(pic.get_at(p))
        else:
            return -1

    # index picture
    locs = [(x,y) for x in range(W) for y in range(H)]
    grid = dict( (p,sum(pic.get_at(p))) for p in locs )
    rank = sorted( grid.values() )
    median = rank[ len(rank)/2 ]
    dark = dict( (k,v) for k,v in grid if v < median )
    good = dict( (k,v) for k,v in grid if v > median )
    pictotal = sum(rank)
    picavg = 1.0 * pictotal/(W*H)
    print('Indexed')

    # compute zone values:
    block = 16
    xblocks, yblocks = (W-1)/block, (H-1)/block
    zones = dict( ((zx,zy),0) for zx in range(xblocks) for zy in range(yblocks) )
    for x,y in locs:
        div = (x/block, y/block)
        if div in zones:
            colsum = sum( pic.get_at((x,y)) )
            zones[div] += colsum

    # choose best zones:
    zonelist = sorted( (v,k) for k,v in zones.items() )
    cut = int(xblocks * yblocks * 0.33)
    bestzones = dict( (k,v) for v,k in zonelist[-cut:] )

    # make segment paths:
    segdrop = [(0,1)] * (block-1)
    segpass = [(1,0)] * block
    segloop = [(0,-1)] * (block-1) + [(1,0)] + [(0,1)] * (block-1)
    segeat = ( segloop+[(1,0)] ) * (block/2)
    segshort = [(1,0)] * 2 + ( segloop+[(1,0)] ) * (block/2 - 1)

    def segtopath(path, seg, xdir):
        for dx,dy in seg:
            x,y = path[-1]
            newloc = (x+dx*xdir, y+dy)
            path.append(newloc)

    # design good path:
    xdir = 1
    path = [(0,0)]
    segtopath(path, segdrop, xdir)
    shortzone = True
    while True:
        x,y = path[-1]
        zone = (x/block, y/block)
        if zone in bestzones:
            if shortzone:
                seg = segshort
            else:
                seg = segeat
        else:
            seg = segpass
        segtopath(path, seg, xdir)
        shortzone = False
        # check end of x block run:
        x,y = path[-1]
        zone = (x/block, y/block)
        if not ( 0 <= x < xblocks*block ):
            del path[-1]
            segtopath(path, segdrop, xdir)
            shortzone = True
            xdir = xdir * -1
        if len(path) > enough:
            break
    print('Path Found')

    # show path on picture:
    loc = path.pop(0)
    eaten = 1
    joetotal = grid[loc]
    i = 0
    while eaten <= enough:
        loc = path[i]
        i += 1
        pic.set_at(loc, (0,0,0))
        joetotal += grid[loc]
        eaten += 1
        if i % 1000 == 0:
            screen.blit(pic, (0,0))
            pygame.display.flip()
            for event in pygame.event.get():
                if event.type == QUIT: sys.exit(0)

    # save picture and wait:
    screen.blit(pic, (0,0))
    pygame.display.flip()
    pygame.image.save(pic, 'output/'+fn)
    joeavg = 1.0 * joetotal/eaten
    print '%s: %7.5f/%7.5f = %7.5f' % (fn, joeavg, picavg, joeavg/picavg)
    while True:
        for event in pygame.event.get():
            if event.type == QUIT: sys.exit(0)


  [1]: https://i.sstatic.net/0O9G6.jpg