空腹のイメージスネーク-穴#3


25

穴#1

ジョー・ザ・スネークはおなかがすいています。

彼は一度に1ピクセルずつ写真を食べます。

彼は本当に明るいピクセルが好きです。

チャレンジ

ジョーは上下左右にしか動かせないので、見つけられる最も明るいピクセルを食べるようにジョーをプログラムします。

仕様書

  • ジョーは画像の左上のピクセルから開始する必要があります。
  • ジョーは、水平方向または垂直方向に1移動ずつしか移動できません
  • ジョーには、写真のピクセル量の1/3を移動するのに十分な時間しかありません(ピクセルの1/3の移動)。ピクセル数が3の倍数でない場合、最も近い整数に切り捨てます。
  • ジョーは彼の道を横切るかもしれませんが、それは0の明るさとして数えます
  • 明るさはr、gとbの合計に基づいているため、rgb(0,0,0)は0の明るさを持ち、rgb(255,255,255)は最大の明るさを持ちます。

入力

好きなように画像を入力できます。

出力

  • 画像の最終結果を示す画像(黒がピクセルに食われている)。
  • 食べた明るさの量(答えの範囲を指定してください)

得点

あなたのプログラムは次の点で評価されます:

  • Joeが食べるピクセルの平均輝度/写真のピクセルの平均輝度*

*これをプログラムにハードコードすることができます

合計スコアは、次の画像のスコアの平均になります。

テスト画像:

ここに画像の説明を入力してください

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください


3
楽しいマークダウンの事実-画像を元の画像へのリンクに変換できます[![image description](SE URL for downsized image)](URL for original image)
カルビンの趣味14年

1
回答に「食べた」イメージの例を含めるように人々に依頼するのはアイデアかもしれません。
ナサニエル14年

回答:


16

C ++、スコア: 1.42042 1.46766

これは基本的に、2つの既存のソリューションのわずかに洗練されたバージョンです。4つの可能な動きのうち、明るさを最大にするものを選択します。ただし、ターゲットピクセルの明るさだけを見るのではなく、ターゲットピクセルの近くにあるピクセルの明るさの重み付き合計を調べます。ターゲットに近いピクセルほど重みが大きくなります。

編集:近傍計算で非線形の明るさを使用すると、スコアがわずかに改善されます。

でコンパイルし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を返す近傍ラムダが原因でプログラムがクラッシュします。
PlasmaHH 14年

@PlasmaHH Mindは問題の画像を共有していますか?
エル

私は休暇の画像を与えていました... 400x400の純粋な黒でも「トリック」を行います。
PlasmaHH 14年

@PlasmaHHまあ、純粋に黒の画像には未定義のスコアがあり、ゼロよりもゼロであり、NaNになります。ただし、近傍計算に影響を与えたり、プログラムをクラッシュさせたりすることはありません(ただし、これは浮動小数点環境に依存する可能性があります)
Ell

if (o_neighborhood > o_max_neighborhood) o_max = *o, o_max_neighborhood = o_neighborhood;このコードでのみ設定されるo_maxポインターを見てください。ただし、nanが関係するため、比較は常にfalseであるため、o_maxは初期化されずに設定および使用されることはありません。
PlasmaHH 14年

7

Python 3、スコア= 1.57

まず、ヘビが画像を移動して、互いに等距離の垂直線を作成します。

a

この蛇を縦線で互いに隣り合う2つの点に取り、それらの端点をループとすることで、この蛇を拡張できます。

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

ポイントをペアに編成し、ペアごとに、平均輝度が最大になるループのサイズと平均輝度値を保存します。

すべてのステップで、最大値を持つペアを選択してループを拡張し、拡張で最大平均輝度を達成し、ペアの新しい最適なループサイズと輝度値を計算します。

最大値の要素(O(1))を削除し、新しい変更された要素(O(log n))を効率的に追加できるように、(value、size、point_pair)トリプレットを値でソートされたヒープ構造に格納します。

ピクセル数の制限に達すると停止し、その蛇が最後の蛇になります。

垂直線間の距離は結果にほとんど影響しないため、一定の40ピクセルが選択されました。

結果

swirl    1.33084397946
chaos    1.76585674741
fractal  1.49085737611
bridge   1.42603926741
balls    1.92235115238
scream   1.48603818637
----------------------
average  1.57033111819

a a a a a a

注:オリジナルの「The Scream」画像は利用できなかったため、同じ解像度の別の「The Scream」画像を使用しました。

「渦巻き」画像上でのヘビ拡張プロセスを示すGif:

a

コードは、stdinから1つ(または複数のスペースで区切られた)ファイル名を取得し、結果のスネーク画像を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
あなたの得点はオフだと思います。それは全体像のための平均輝度の上に食べジョーの明るさの平均値である... Aランダムジョーはおよそ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 14年

オレンジと黒の渦巻き模様(青ではない)の場合、平均輝度は68.0846でした...これはあなたのどれとも一致しないようです。たぶんsum(getPixel(...))はあなたが望むものを返しませんか?(私はちょっとPython初心者です)。ところで、6つの写真がありますが、5つの出力しかありません。写真になんらかのラベルを付けてもらえますか?
ストレッチマニア14年

@StretchManiac明るさをどのように計算していますか?私は、R、G、およびBの値を合計するだけです。申し訳ありませんが、最後から2番目にくる渦巻き模様のもの(あなたがコメントで言及したもの)を逃しました。朝に追加します(今は寝なければなりません)。
ドアノブ

5

Java(スコア:0.6949)

現在のピクセルを囲む4つのピクセルのうち、最も明るいピクセルを食べる単純なアルゴリズム。同点の場合、食べられるピクセルはランダムであり、実行ごとに異なるスコアと結果の画像をもたらします。そのため、以下のスコアは、各画像での50回の実行の平均です。

ソースのいずれかで編集三つの引数(クラス定数として既存の)、それを実行、またはフォームで、コマンドラインを介してそれらを渡すために食べるために画像のソースファイルが、された画像(撮影を食べる回数ですすべての反復の平均スコアと最高スコアの保存)、および各反復のスコアを印刷する場合はtrue、しない場合はfalseです。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;
    }
}

50回以上の反復による画像ごとの平均スコア:

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

同じ50回の反復での画像別の最高スコア:

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

画像から明らかなように、実際に食べられるピクセルの3分の1未満は、ヘビが既に食べたピクセルの間に立ち往生しているため、その動きのランダム性がヘビをもたらすまでデッドエリア内に留まっている画像の食用部分。

また、ヘビがピクセルを繰り返し食べる結果として、死んだピクセルの明るさゼロが再び平均に組み込まれるため、スコアは下方向にバイアスされます。すべての動きではなく、新しいピクセルを食べるようになった動きの数だけで除算するようにスコアリングアルゴリズムが変更された場合(ヘビが前に食べた今死んだピクセルを食べるものを含む) )。

もちろん、より良いアプローチは、各ピクセルに対して何らかの種類の輝度ヒューリスティックを作成し、次のパスを見つけることです。 width * height / 3し、平均輝度が最も高いピクセルこのアプローチは、特に大きな画像の場合、実行時に最適になるとは思いません可能な順列の非常に大きいでしょう。後でこのアプローチの何らかの形でショットを撮り、もしそうなら別の回答に投稿するかもしれません。


私の答えがどれだけ大きいかに悩まされている場合(その中の画像のため)、私に知らせて、リンクまたは他のよりスペイシーな代替品を支持して画像を削除します。または、「食べた」画像のフル解像度のオリジナルが欲しい人は、コメントで知らせてください。
FThompson 14年

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.