战略消失者


15

这篇帖子是从此mathoverflow帖子大致上受到启发的。

消失是Conway人生游戏中任何一种模式,只要经过一步,它就会完全消失。例如,下面的图案是9号Vanisher。

9号消失器

Vanishers的一个有趣特性是,只需添加更多活细胞,任何图案都可以变成一个消失的图案。例如,以下图案可以完全像这样消失在图案中

不清漆封闭的

但是,我们可以通过添加更少的活细胞来将该图案制作成Vanisher。

较小的外壳 外壳更小

您的任务是编写一个为我们完成此任务的程序。给定一个模式作为输入查找,并输出一个包含输入的消失模式。您不必仅找到有效的模式就找到最佳模式。

计分

要对您的程序评分,您将必须在所有大小为6的息肉小程序上运行该程序(不能对相等的对称情况进行两次计数)。 是一个在每个行中包含每个倍增子的pastebin。一共有524个。它们表示为六个坐标的列表((x,y)元组)每个是活动单元的位置。

您的分数将是为使所有这些息肉变成Vanishers而添加的新细胞总数。

领带

对于平局,我将提供要运行的程序的大小为7的息肉列表。

IO

我希望IO非常灵活,可以采用合理的格式进行输入和输出,但是您可能希望采用与我提供的原始输入数据相同的格式进行输入。您的格式在多次运行中应保持一致。

定时

您的程序应在合理的时间内在合理的计算机上运行(大约<1天)。我并不会真正执行太多,但是我希望我们都玩的很好。


(当然,您必须能够对自己的代码进行评分)
user202729 '18


您要禁止硬编码吗?
FlipTack

1
@FlipTack我很确定它已经是一个标准漏洞。再加上编写良好的程序无论如何都可能和人类一样好。
发布Rock Garf Hunter,

1
@好极了,我想我将删除第三个决胜局。
发布Rock Garf Hunter,

Answers:


4

Python + Z3,得分= 3647

在我的八核系统上运行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?它是纯粹的性能,还是具有不同的功能?
Caird coinheringaahing

@cairdcoinheringaahing看起来这是一个象征性的解决方案。
user202729

1
@AndersKaseorg 1.您尚未回答我的评论,询问您的解决方案是否最佳。这对于考虑发布答案的其他任何人都非常重要。2.如果您没有解释Z3在您的答案中的作用,那么我只能猜测它的作用,因为我没有时间阅读文档,因此我会随意猜测蛮力。3此答案值得其代码赞(实际上,它值得多次赞),但是直到答案中包含以上两点的说明后,我才接受。
水平河圣
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.