Голодна Змія Зображення - отвір №3


25

Отвір №1

Джо змія голодний.

Він їсть фотографії, по одному пікселю за раз.

Йому дуже подобаються яскраві пікселі.

Змагання

Програмуйте Джо їсти найяскравіші пікселі, які він може знайти, враховуючи, що він може рухатись лише вгору, вниз, вліво або вправо.

Технічні умови

  • Джо повинен починатися з лівого верхнього пікселя зображення.
  • Джо може рухатись лише горизонтально або вертикально по 1 ходу
  • Джо має лише достатньо часу, щоб перемістити 1/3 кількості пікселів на зображенні (1/3 стільки ходів, скільки пікселів). Якщо кількість пікселів не кратна 3, округніть до найближчого цілого числа.
  • Джо може перетнути його шлях, хоча це вважається 0 яскравістю
  • Яскравість базується на сумі r, g і b, тому rgb (0,0,0) має яскравість 0, тоді як rgb (255,255,255) має максимальну яскравість.

Вхідні дані

Ви можете вводити зображення, скільки завгодно.

Вихідні дані

  • зображення, що показує кінцевий результат вашої картини (з чорним з’їденим пікселями).
  • Кількість з'їденої яскравості (вкажіть, будь-який діапазон у своїй відповіді)

Оцінка балів

Ваша програма буде класифікована за:

  • Середня яскравість пікселів, яку Джо з'їдає / Середня яскравість пікселів на зображенні *

* ви можете жорстко кодувати це у своїй програмі

Ваш загальний бал буде середнім балом для наступних зображень:

Тестові зображення:

введіть тут опис зображення

введіть тут опис зображення

http://upload.wikimedia.org/wikipedia/en/thumb/f/f4/The_Scream.jpg/800px-The_Scream.jpg

введіть тут опис зображення

введіть тут опис зображення

введіть тут опис зображення


3
Fun Markdown факт - Ви можете включити зображення в посилання на їх оригінал: [![image description](SE URL for downsized image)](URL for original image).
Захоплення Кальвіна

1
Можливо, попросити людей включити у свої відповіді приклад "з'їденого" зображення.
Натаніель

Відповіді:


16

C ++, оцінка: 1.42042 1.46766

Це, по суті, трохи більш досконала версія двох існуючих рішень: З чотирьох можливих кроків він вибирає той, що забезпечує максимальну яскравість. Однак, замість того, щоб дивитись лише на яскравість цільового пікселя, він дивиться на зважену суму яскравості пікселя в околиці цільового пікселя, де пікселі, наближені до цілі, мають більшу вагу.

EDIT: Використання нелінійної яскравості для обчислення мікрорайону дещо покращує бал.

Компілювати з g++ joe.cpp -ojoe -std=c++11 -O3 -lcairo. Потрібен каїр.

Бігайте з joe <image-file> [<radius>]. <image-file>- це вхідне зображення PNG. <radius>(необов’язковий аргумент) - радіус сумарного сусіднього округу, в пікселях (менший швидше, більший (приблизно) кращий). Виводить бал та зображення, яке називається out.<image-file>.

#include <cairo/cairo.h>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <string>

using namespace std;

int main(int argc, const char* argv[]) {
    auto* img = cairo_image_surface_create_from_png(argv[1]);
    int width = cairo_image_surface_get_width(img),
        height = cairo_image_surface_get_height(img),
        stride = cairo_image_surface_get_stride(img);
    unsigned char* data = cairo_image_surface_get_data(img);

    double* brightness = new double[width * height];
    double total_brightness = 0;
    for (int y = 0; y < height; ++y) {
        for (int x = 0; x < width; ++x) {
            const unsigned char* p = data + stride * y + 4 * x;
            total_brightness += brightness[y * width + x] = p[0] + p[1] + p[2];
        }
    }

    const int r = argc > 2 ? stoi(argv[2]) : 64, R = 2 * r + 1;
    double* weight = new double[R * R];
    for (int y = -r; y <= r; ++y) {
        for (int x = -r; x <= r; ++x)
            weight[R * (y + r) + (x + r)] = 1.0 / (x*x + y*y + 1);
    }

    auto neighborhood = [&] (int x, int y) {
        double b = 0;
        int x1 = max(x - r, 0), x2 = min(x + r, width - 1);
        int y1 = max(y - r, 0), y2 = min(y + r, height - 1);
        for (int v = y1; v <= y2; ++v) {
            const double *B = brightness + width * v + x1;
            const double *W = weight + R * (v - (y - r)) + (x1 - (x - r));
            for (int u = x1; u <= x2; ++u, ++B, ++W)
                b += (*W) * (*B) * (*B);
        }
        return b;
    };

    int n = (2 * width * height + 3) / 6;
    int x = 0, y = 0;
    double path_brightness = 0;
    int O[][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    for (int i = 0; i < n; ++i) {
        if (i % 1000 == 0) cerr << (200 * i + n) / (2 * n) << "%\r";

        path_brightness += brightness[width * y + x]; brightness[width * y + x] = 0;
        unsigned char* p = data + stride * y + 4 * x;
        p[0] = p[1] = 16 * i % 255; p[2] = 0;

        auto O_end = partition(begin(O), end(O), [&] (const int* o) {
            return x + o[0] >= 0 && x + o[0] < width &&
                   y + o[1] >= 0 && y + o[1] < height;
        });
        const int* o_max; double o_max_neighborhood = -1;
        for (auto o = O; o != O_end; ++o) {
            double o_neighborhood = neighborhood(x + (*o)[0], y + (*o)[1]);
            if (o_neighborhood > o_max_neighborhood)
                o_max = *o, o_max_neighborhood = o_neighborhood;
        }
        x += o_max[0]; y += o_max[1];
    }

    cout << (path_brightness * width * height) / (n * total_brightness) << endl;

    cairo_surface_write_to_png(img, (string("out.") + argv[1]).c_str());

    delete []brightness;
    delete []weight;
    cairo_surface_destroy(img);
}

Результати

Bridge    1.39945
Balls     1.77714
Scream    1.38349
Fractal   1.31727
Vortex    1.66493
Tornado   1.26366
-----------------
Average   1.46766

Міст Кульки Кричати Фрактал Вихровий Торнадо

Більше очей-цукерки

Вихрова анімація Анімація "Торнадо"


Я просто спробував вашу програму на деяких моїх власних зразкових зображеннях, і на одному є дуже чорний лише біля початкової точки, і там ваша програма виходить з ладу через те, що лямбда, що повертається поблизу, повертається на NaN.
ПлазмаHH

@PlasmaHH Ви хочете поділитися образою?
Ell

Я годував його зображеннями відпусток ... Хоча чистий "чорний" 400x400 теж "трюк".
ПлазмаHH

@PlasmaHH Ну, чисто чорне зображення має невизначений бал, це нуль більше нуля, що було б NaN. Це, однак, не повинно впливати на обчислення мікрорайону або руйнувати програму (хоча це може залежати від середовища з плаваючою комою.)
Ell

Подивіться на вказівник o_max, if (o_neighborhood > o_max_neighborhood) o_max = *o, o_max_neighborhood = o_neighborhood;тільки цей код встановлює його. однак завдяки залученому нану порівняння завжди хибне, тому o_max ніколи не встановлюється і не використовується неініціалізовано.
ПлазмаHH

7

Python 3, оцінка = 1,57

Спочатку наша змія подорожує зображення, створюючи вертикальні лінії з однаковою відстані один від одного.

а

Ми можемо розширити цю змію, взявши дві точки поруч один з одним по вертикалі і створивши петлю, кінцевими точками якої є вони.

|      |
|  =>  +----+
|      +----+
|      |

Ми впорядковуємо точки по парах, і для кожної пари ми зберігаємо розмір і середнє значення яскравості петлі, яке дає має найбільшу середню яскравість.

На кожному кроці ми вибираємо пару з найвищим значенням розширити її цикл для досягнення максимальної середньої яскравості на розширенні та обчислимо новий оптимальний розмір циклу та значення яскравості для пари.

Ми зберігаємо триплети (значення, розмір, 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

а а а а а а

Примітка: оригінальна картина "Крик" була недоступна, тому я використав іншу картину "Крик" із подібною роздільною здатністю.

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))

5

Python 2 (оцінка: 0,0797116)

Просто дуже простий і наївний жадібний алгоритм, щоб отримати м'яч котиться.

#!/usr/bin/python

from PIL import Image

OFFSETS = [(-1, 0), (0, -1), (1, 0), (0, 1)]
def test_img(filename):
    img = Image.open(filename)

    joe, eaten = (0, 0), []
    img_w, img_h = img.size
    all_pixels = [
        sum(img.getpixel((x, y)))
        for x in xrange(img_w)
        for y in xrange(img_h)
    ]
    total_brightness = float(sum(all_pixels)) / len(all_pixels)

    for _ in xrange(0, (img_w*img_h)/3):
        max_offset, max_brightness = (0, 0), 0
        for o in OFFSETS:
            try:
                brightness = sum(img.getpixel((joe[0] + o[0], joe[1] + o[1])))
            except IndexError:
                brightness = -1
            if brightness >= max_brightness:
                max_offset = o
                max_brightness = brightness

        joe = (joe[0] + max_offset[0], joe[1] + max_offset[1])
        eaten.append(max_brightness)
        img.putpixel(joe, (0, 0, 0))

    eaten_brightness = float(sum(eaten)) / len(eaten)
    print('%d of %d (score %f)' % (eaten_brightness, total_brightness, eaten_brightness / total_brightness))
    img.show()

test_img('img0.jpg')
test_img('img1.png')
test_img('img2.jpg')
test_img('img3.jpg')
test_img('img4.jpg')

Вихід:

llama@llama:~/Code/python/ppcg40069hungrysnake$ ./hungrysnake.py 
15 of 260 (score 0.060699)
9 of 132 (score 0.074200)
16 of 300 (score 0.055557)
4 of 369 (score 0.010836)
79 of 400 (score 0.197266)

1
Я думаю, що ваш рахунок вимкнено. Це середня яскравість Джо, з'їдена над середньою яскравістю для всієї картини ... Випадковий Джо повинен отримати оцінку приблизно 1.
Маніяк Стретч

@StretchManiac Хм, я не бачу нічого поганого. sum of brightnesses of eaten pixels / amount of eaten pixelsправильна формула, правильна? Можливо, це просто дійсно жахливий алгоритм;)
Doorknob

@Doorknob цеThe average brightness of pixels Joe eats / The average brightness of the pixels in the picture*
hmatt1

Для помаранчевого та чорного повороту (не синього) я отримав середню яскравість 68.0846 ... Що, схоже, не відповідає жодному з вас. Можливо, сума (getPixel (...)) не повертає те, що потрібно? (Я якось новачок пітона). До речі, є 6 знімків, але у вас є лише 5 виходів. Чи можете ви також якось позначити картинки?
Стретч-маніяк

@StretchManiac Як ви обчислюєте свою яскравість? Шахта просто підсумовує значення R, G і B. Вибачте, я пропустив ту гору, що приходить другою до останньої (я думаю, що ви згадали у своєму коментарі). Я додам це вранці (зараз я повинен спати).
Дверна ручка

5

Java (оцінка: 0,6949)

Простий алгоритм, який з'їдає найяскравіший піксель із чотирьох пікселів, що оточують поточний піксель. У разі зв'язання, з'їдений піксель є випадковим, що призводить до різної оцінки та результатів зображення кожного виконання. Таким чином, наведені нижче бали - це в середньому понад 50 виконання на кожному зображенні.

Щоб запустити його, відредагуйте три аргументи (існуючі як константи класу) у джерелі, або передайте їх через командний рядок у формі, java HungryImageSnake <source> <iterations> <printScores>де <source>є вихідний файл зображення, яке потрібно з'їсти, <iterations>- кількість разів, щоб з'їсти зображення (прийняття середній бал і збереження найкращого балу за всі ітерації), і <printScores>справжнє для друку балів кожної ітерації або помилкового - ні.

import javax.imageio.ImageIO;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;

public class HungryImageSnake {

    private static final String SOURCE = "tornado.jpg";
    private static final int ITERATIONS = 50;
    private static final boolean PRINT_SCORES = true;

    public static void main(String[] args) {
        try {
            String source = args.length > 0 ? args[0] : SOURCE;
            int iterations = args.length > 1 ? Integer.parseInt(args[1]) : ITERATIONS;
            boolean printScores = args.length > 2 ? Boolean.parseBoolean(args[2]) : PRINT_SCORES;

            System.out.printf("Reading '%s'...%n", source);
            System.out.printf("Performing %d meals...%n", iterations);
            BufferedImage image = ImageIO.read(new File(source));
            double totalScore = 0;
            double bestScore = 0;
            BufferedImage bestImage = null;
            for (int i = 0; i < iterations; i++) {
                HungryImageSnake snake = new HungryImageSnake(image);
                while (snake.isHungry()) {
                    snake.eat();
                }
                double score = snake.getScore();
                if (printScores) {
                    System.out.printf("    %d: score of %.4f%n", i + 1, score);
                }
                totalScore += score;
                if (bestImage == null || score > bestScore) {
                    bestScore = score;
                    bestImage = snake.getImage();
                }
            }
            System.out.printf("Average score: %.4f%n", totalScore / iterations);
            String formattedScore = String.format("%.4f", bestScore);
            String output = source.replaceFirst("^(.*?)(\\.[^.]+)?$", "$1-b" + formattedScore + "$2");
            ImageIO.write(bestImage, source.substring(source.lastIndexOf('.') + 1), new File(output));
            System.out.printf("Wrote best image (score: %s) to '%s'.%n", bestScore, output);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private int x;
    private int y;
    private int movesLeft;
    private int maximumMoves;
    private double eatenAverageBrightness;
    private double originalAverageBrightness;
    private BufferedImage image;

    public HungryImageSnake(BufferedImage image) {
        this.image = copyImage(image);
        int size = image.getWidth() * image.getHeight();
        this.maximumMoves = size / 3;
        this.movesLeft = this.maximumMoves;
        int totalBrightness = 0;
        for (int x = 0; x < image.getWidth(); x++) {
            for (int y = 0; y < image.getHeight(); y++) {
                totalBrightness += getBrightnessAt(x, y);
            }
        }
        this.originalAverageBrightness = totalBrightness / (double) size;
    }

    public BufferedImage getImage() {
        return image;
    }

    public double getEatenAverageBrightness() {
        return eatenAverageBrightness;
    }

    public double getOriginalAverageBrightness() {
        return originalAverageBrightness;
    }

    public double getScore() {
        return eatenAverageBrightness / originalAverageBrightness;
    }

    public boolean isHungry() {
        return movesLeft > 0;
    }

    public void eat() {
        if (!isHungry()) {
            return;
        }
        int[][] options = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        shuffleArray(options); // prevent snake from getting stuck in corners
        int[] bestOption = null;
        int bestBrightness = 0;
        for (int[] option : options) {
            int optionX = this.x + option[0];
            int optionY = this.y + option[1];
            if (exists(optionX, optionY)) {
                int brightness = getBrightnessAt(optionX, optionY);
                if (bestOption == null || brightness > bestBrightness) {
                    bestOption = new int[]{ optionX, optionY };
                    bestBrightness = brightness;
                }
            }
        }

        image.setRGB(bestOption[0], bestOption[1], 0);
        this.movesLeft--;
        this.x = bestOption[0];
        this.y = bestOption[1];
        this.eatenAverageBrightness += bestBrightness / (double) maximumMoves;
    }

    private boolean exists(int x, int y) {
        return x >= 0 && x < image.getWidth() && y >= 0 && y < image.getHeight();
    }

    private int getBrightnessAt(int x, int y) {
        int rgb = image.getRGB(x, y);
        int r = (rgb >> 16) & 0xFF;
        int g = (rgb >> 8) & 0xFF;
        int b = rgb & 0xFF;
        return r + g + b;
    }

    private static <T> void shuffleArray(T[] array) {
        Random random = new Random();
        for (int i = array.length - 1; i > 0; i--) {
            int index = random.nextInt(i + 1);
            T temp = array[index];
            array[index] = array[i];
            array[i] = temp;
        }
    }

    private static BufferedImage copyImage(BufferedImage source){
        BufferedImage b = new BufferedImage(source.getWidth(), source.getHeight(), source.getType());
        Graphics g = b.getGraphics();
        g.drawImage(source, 0, 0, null);
        g.dispose();
        return b;
    }
}

Середні бали за зображенням понад п’ятдесят ітерацій:

Bridge - 0.7739
Spheres - 0.5580
Scream - 0.8197
Fractal - 0.3850
Vortex - 0.9158
Tornado - 0.7172

Найкращі результати за зображенням за ті ж п’ятдесят повторень:

Bridge - 0.8996
Spheres - 0.8741
Scream - 0.9183
Fractal - 0.5720
Vortex - 1.1520
Tornado - 0.9281

Образи найвищого балу:

Міст - 0,8996 Сфери - 0,8741 Крик - 0,9183 Фрактал - 0,5720 Вихровий - 1,1520 Торнадо - 0,9281

Як видно з зображень, набагато менше третини пікселів насправді з’їдається, оскільки змія час від часу застрягає серед з'їдених пікселів, при цьому вона залишається застряглою у мертвій зоні, поки випадковість її рухів не приведе її до їстівна частина зображення.

Крім того, як змія повторно їсть пікселі, показники зміщуються вниз, оскільки нульова яскравість мертвих пікселів знову враховується середньою. Я би сподівався побачити набагато більші бали, якби алгоритм оцінювання був змінений лише на кількість рухів, що призвели до вживання нових пікселів, а не на всі рухи (включаючи ті, де змія їсть уже мертву піксель, яку вона їла раніше ).

Звичайно, кращим підходом було б створити якусь евристичну яскравість для кожного пікселя і знайти шлях width * height / 3пікселів із найвищою середньою яскравістю, але я сумніваюся, що цей підхід буде оптимальним у часі виконання, особливо на великих зображеннях, як кількість можливих перестановок було б дуже великим. Я можу пізніше зняти певну форму такого підходу і викласти її окремою відповіддю, якщо так.


Якщо когось турбує, наскільки велика моя відповідь (через зображення в ній), дайте мені знати, і я видалю зображення на користь посилань чи іншої менш просторової альтернативи. Або, якщо хтось хотів би оригінали оригіналу будь-яких "з'їдених" зображень, повідомте мене також у коментарі.
FThompson

4

Python 2, Оцінка: 1.205

Деякий час тому я зібрав швидке рішення Python, але забув його опублікувати. Ось. Він знаходить найбагатші блоки на зображенні, а потім подорожує до кожного блоку, поїдаючи всі найкращі блоки, до яких він потрапляє.

Результати

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

Приклад малюнка

Оброблена картина мосту

Код Python 2.7

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.