Stratejik Ufuklar


15

Bu yayın, bu mathoverflow yayınından gevşek bir şekilde ilham aldı .

Bir Vanisher, Conway'in Hayat Oyunundaki bir adımdan sonra tamamen kaybolan herhangi bir modeldir. Örneğin, aşağıdaki desen 9 Numaralı bir Vişne'dir.

Beden 9 Vanisher

Vanishers'ın ilginç bir özelliği, herhangi bir paternin daha fazla canlı hücre ekleyerek yok olan bir desene dönüştürülebilmesidir. Örneğin, aşağıdaki örüntü tamamen bu şekilde yok olan bir örüntüye eklenebilir

Sigara Vanishingkapalı

Ancak daha az canlı hücre ekleyerek bu modeli bir Vanisher'a dönüştürebiliriz.

Daha Küçük Kasa Daha Küçük Kasa

Göreviniz bu görevi bizim için yapan bir program yazmak. Bu, girdi bulma ve çıktıyı içeren bir kaybolan desen olarak bir desen verilir. En iyi kalıbı bulmak zorunda değilsiniz, sadece çalışan bir kalıbı bulmak zorundasınız.

puanlama

Programınızı puanlamak için, tüm boyut 6 polipletlerinde (simetrik olarak eşdeğer durumlarda çift sayma değil) çalıştırmanız gerekecektir. İşte her polipleti kendi hattında içeren bir macun. Toplamda 524 tane olmalı. (x,y)Her biri canlı bir hücrenin yeri olan altı koordinat ( tuple) listesi olarak temsil edilirler .

Puanınız, tüm bu polipletleri Vanishers'a yapmak için eklenen toplam yeni hücre sayısı olacaktır.

Kravatlar

Bağlar olması durumunda, çalıştırılacak programlar için 7 boyutlu polipletlerin bir listesini vereceğim.

IO

IO'nun oldukça esnek olmasını istiyorum, giriş ve çıkışı makul formatlarda alabilir, ancak muhtemelen sağladığım ham giriş verileriyle aynı formatta girdi almak isteyeceksiniz. Biçiminiz birden fazla çalıştırmada tutarlı olmalıdır.

Zamanlama

Programınız makul bir makinede makul bir sürede (yaklaşık <1 gün) çalışmalıdır. Bunu çok fazla zorlamayacağım ama hepimiz iyi oynayıp oynamayı tercih ederim.


(elbette kendi kodunuzu
puanlayabilmeniz


Sabit kodlamayı yasaklayacak mısınız?
FlipTack

1
@FlipTack Zaten standart bir boşluk olduğuna eminim. Ayrıca iyi yazılmış bir program muhtemelen bir insan kadar iyidir.
Rock Garf Hunter Post

1
@ Οurous Sanırım üçüncü bağlantı kesiciyi kaldıracağım.
Rock Garf Avcısı

Yanıtlar:


4

Python + Z3 , skor = 3647

Sekiz çekirdekli sistemimde 14 saniye içinde çalışıyor.

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)

Tam çıktı


1
Bunun nasıl işe yarayacağına ve benim oyumu nasıl kazanacağına dair iyi bir açıklama. Polipleti çevreleyen dikdörtgen bir alana hücre eklemek için kaba bir kuvvet deniyor gibi görünüyor mu?
Level Nehri St

+Bazı durumlarda neden ana şekilden kopuk olduğu belli değildi, ancak yeni hücrelerin ortaya çıkmasını önlemek gerekiyor gibi görünüyor. Bu çözümler bu nedenle optimal mi?
Level Nehri St

Meraktan, neden z3.Orvanilya yerine kullanılıyor a or b? Tamamen performans mı yoksa farklı bir işlevi mi var?
18'de

@cairdcoinheringaahing Bu sembolik bir çözüm gibi görünüyor.
user202729

1
@AndersKaseorg 1. çözümlerinizin optimum olup olmadığını soran yorumuma cevap vermediniz. Bu, yanıt göndermeyi düşünen herkes için çok önemlidir. 2. Cevabınızda Z3'ün ne yaptığını açıklamazsanız, sadece ne olduğunu tahmin edebilirim, çünkü belgeleri okumak için zamanım olmadığından, kaba kuvvet kuvvetini rastgele tahmin ediyorum. 3 Bu cevap, kodu için bir upvote hak ediyor (aslında birçok upvotes hak ediyor), ancak cevaba yukarıdaki iki noktayı kapsayan bir açıklama eklenene kadar upvote olmaz.
Level River St
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.