戦略的消失


15

この投稿は、このmathoverflow投稿に大まかに触発されています。

Vanisherは、ConwayのGame of lifeのパターンで、1ステップ後に完全に消えます。たとえば、次のパターンはサイズ9のVanisherです。

サイズ9バニシャー

Vanishersの興味深い特性は、生きているセルを追加するだけで、任意のパターンを消失パターンにすることができることです。たとえば、次のパターンは、次のような消失パターンに完全に囲まれます。

非消失同封

ただし、さらに少ない数の生細胞を追加することで、そのパターンをVanisherにできます。

より小さいエンクロージャー さらに小さいエンクロージャー

あなたの仕事は、私たちのためにこの仕事をするプログラムを書くことです。入力としてパターンが与えられ、入力を含む消失パターンを見つけて出力します。必ずしも最適なパターンを見つける必要はありません。

得点

プログラムにスコアを付けるには、サイズ6のポリレットすべてで実行する必要があります(対称的に同等の場合を二重にカウントするのではありません)。 これは、各ポリプレットを独自の行に含むペーストビンです。合計で524個あるはずです。これらは、(x,y)それぞれが生細胞の位置である6つの座標(タプル)のリストとして表されます。

スコアは、これらすべてのポリプレットをVanishersにするために追加された新しいセルの総数になります。

ネクタイ

同点の場合、実行するプログラムのサイズ7ポリレットのリストを提供します。

IO

IOをかなり柔軟にして、適切な形式で入出力できるようにしますが、おそらく、入力した生の入力データと同じ形式で入力したいと思うでしょう。フォーマットは複数の実行で一貫している必要があります。

タイミング

プログラムは、妥当なマシンで妥当な時間(1日未満)で実行する必要があります。私はこれをあまりにも強制するつもりはありませんが、私たち全員がうまくプレイしたいなら私は好むでしょう。


(もちろん、独自のコードをスコアリングできる必要があります)
-user202729


ハードコーディングを禁止するつもりですか?
-FlipTack

1
@FlipTackすでに標準の抜け穴だと確信しています。さらに、よく書かれたプログラムは、おそらく人間と同じくらい良いでしょう。
ポストロックガーフハンター

1
@Οurous3番目のタイブレーカーを取り外すだけだと思います。
ポストロックガーフハンター

回答:


4

Python + Z3、スコア= 3647

8コアシステムで14秒で実行されます。

from __future__ import print_function

import ast
import multiprocessing
import sys
import z3

def solve(line):
    line = ast.literal_eval(line)
    x0, x1 = min(x for x, y in line) - 2, max(x for x, y in line) + 3
    y0, y1 = min(y for x, y in line) - 2, max(y for x, y in line) + 3
    a = {(x, y): z3.Bool('a_{}_{}'.format(x, y)) for x in range(x0, x1) for y in range(y0, y1)}
    o = z3.Optimize()
    for x in range(x0 - 1, x1 + 1):
        for y in range(y0 - 1, y1 + 1):
            s = z3.Sum([
                z3.If(a[i, j], 1 + ((i, j) != (x, y)), 0)
                for i in (x - 1, x, x + 1) for j in (y - 1, y, y + 1) if (i, j) in a
            ])
            o.add(z3.Or(s < 5, s > 7))
    o.add(*(a[i, j] for i, j in line))
    o.minimize(z3.Sum([z3.If(b, 1, 0) for b in a.values()]))
    assert o.check() == z3.sat
    m = o.model()
    return line, {k for k in a if z3.is_true(m[a[k]])}

total = 0
for line, cells in multiprocessing.Pool().map(solve, sys.stdin):
    added = len(cells) - len(line)
    print(line, added)
    x0, x1 = min(x for x, y in cells), max(x for x, y in cells) + 1
    y0, y1 = min(y for x, y in cells), max(y for x, y in cells) + 1
    for y in range(y0, y1):
        print(''.join('#' if (x, y) in line else '+' if (x, y) in cells else ' ' for x in range(x0, x1)))
    total += added
print('Total:', total)

フル出力


1
これがどのように機能するかについての適切な説明は良いことであり、私の賛成票を獲得するでしょう。ポリプレットを囲む長方形の領域にセルを追加する総当たりを試みているようですか?
レベルリバーセント

+いくつかのケースでメインシェイプから切断されている理由は不明でしたが、新しいセルの生成を避けるために必要なようです。したがって、これらのソリューションは最適ですか?
レベル川セント

好奇心から、なぜz3.Orバニラの代わりに使用するのa or bですか?それは純粋にパフォーマンスですか、それとも異なる機能を持っていますか?
コヒーリングコアリング

@cairdcoinheringaahingそれは象徴的な解決策のように見えます。
user202729

1
@AndersKaseorg 1.あなたは、あなたのソリューションが最適かどうかを尋ねる私のコメントに答えていません。これは、回答の投稿を検討している他の人にとって非常に重要です。2.回答でZ3の機能を説明しない場合、ドキュメントを読む時間がないため、Z3の機能を推測することしかできません。3この回答は、そのコードの賛成票に値します(実際、多くの賛成票に値します)が、上記の2つの点をカバーする説明が回答に追加されるまで、賛成票を投じません。
レベルリバーセント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.