Стратегічні винищувачі


15

Ця публікація натхненна цією публікацією про перегляд потоків .

Ванішер - це будь-який зразок у грі життя Конвея, який повністю зникає після одного кроку. Наприклад, наступна схема - розмір 9 ванішерів.

Розмір 9 Ванішер

Цікавою властивістю Vanishing є те, що будь-який візерунок може бути перетворений на випадок, просто додавши більше живих клітин. Наприклад, наступний зразок може бути повністю укладений у такий зниклий візерунок

Не зникаючиУкладений

Однак ми можемо перетворити цей зразок у ванішер, додавши ще менше живих клітин.

Менший корпус Навіть менший корпус

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

Оцінка балів

Щоб оцінити свою програму, вам доведеться запустити її на всіх поліплетах розміром 6 (не подвійний підрахунок симетрично еквівалентних випадків). Ось пастабін, що містить кожен поліплет у власному рядку. Всього їх має бути 524. Вони представлені у вигляді списку з шести координат ( (x,y)кортежів), кожен з яких є місцезнаходженням живої комірки.

Ваша оцінка буде загальною кількістю нових осередків, доданих для перетворення всіх цих поліплетів у Vanishing.

Краватки

У випадку зв’язків я надам перелік поліплетів розміром 7 для програм, які можна запускати.

IO

Я хотів би, щоб IO був досить гнучким, ви можете приймати введення та вихід у розумних форматах, однак, ймовірно, ви захочете взяти вхід у тому ж форматі, що і вихідні дані, які я надав. Ваш формат повинен бути узгодженим для кількох циклів.

Хронометраж

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


(звичайно, ви повинні вміти забивати власний код)
user202729


Ви збираєтесь заборонити жорстке кодування?
FlipTack

1
@FlipTack Я впевнений, що це вже стандартна лазівка. Плюс добре написана програма, напевно, так само хороша, як і людина.
Пост Рок-Гарф Мисливець

1
@ Οurous Я думаю, що я просто усуну третій вимикач краватки.
Пост Рок Гарф Мисливець

Відповіді:


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 Схоже, це символічне рішення.
користувач202729

1
@AndersKaseorg 1. Ви не відповіли на мій коментар із запитанням, чи оптимальні ваші рішення. Це має велике значення для всіх, хто розглядає можливість відповіді. 2. Якщо ви не поясните, що робить Z3 у своїй відповіді, я можу лише здогадуватися, що це робить, оскільки я не встигаю прочитати документацію, отже, моя випадкова здогадка про грубу силу. 3 Ця відповідь заслуговує на підсумок (адже він заслуговує на багато надбавок) за свій код, але я не буду подавати заявки, поки до відповіді не буде додано пояснення, що стосується двох вищезгаданих питань.
Рівень р. Св.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.