กลยุทธ์ Vanishers


15

โพสต์นี้เป็นแรงบันดาลใจอย่างอิสระโดยการโพสต์ mathoverflow นี้

Vanisher เป็นรูปแบบใด ๆ ในเกมแห่งชีวิตของ Conway ที่หายไปอย่างสมบูรณ์หลังจากผ่านไปหนึ่งก้าว ตัวอย่างเช่นรูปแบบต่อไปนี้คือขนาด 9 Vanisher

ขนาด 9 Vanisher

คุณสมบัติที่น่าสนใจของ Vanishers คือรูปแบบใด ๆ ที่สามารถทำให้หายไปได้โดยเพิ่มเซลล์ที่มีชีวิตเพิ่มขึ้น ตัวอย่างเช่นรูปแบบต่อไปนี้สามารถถูกปิดล้อมอย่างสมบูรณ์ในรูปแบบที่หายไปเช่นนั้น

ที่ไม่ใช่ยาสิ่งที่ส่งมา

อย่างไรก็ตามเราสามารถสร้างรูปแบบนั้นให้เป็น Vanisher ได้โดยการเพิ่มเซลล์ที่มีชีวิตน้อยลง

ตู้ขนาดเล็ก แม้แต่ตู้ที่เล็กกว่า

งานของคุณคือการเขียนโปรแกรมที่ทำงานนี้ให้เรา ที่ได้รับรูปแบบเป็นอินพุตค้นหาและส่งออกรูปแบบการหายไปที่มีอินพุต คุณไม่จำเป็นต้องค้นหารูปแบบที่ดีที่สุดเพียงแค่รูปแบบที่ใช้งานได้

เกณฑ์การให้คะแนน

ในการให้คะแนนโปรแกรมของคุณคุณจะต้องเรียกใช้งานบนโพลิปต์ขนาด 6 (ไม่นับกรณีที่เท่ากันแบบสมมาตร) นี่คือ pastebin ที่บรรจุ polyplet แต่ละอันในบรรทัดของมันเอง ควรมีทั้งหมด 524 ของพวกเขาทั้งหมด พวกเขาจะแสดงเป็นรายการของหกพิกัด ( (x,y)tuples) แต่ละคนเป็นที่ตั้งของเซลล์สด

คะแนนของคุณจะเป็นจำนวนเซลล์ใหม่ที่เพิ่มเข้ามาเพื่อทำให้โพลีต์เหล่านี้ทั้งหมดเป็น Vanishers

ความสัมพันธ์

ในกรณีของความสัมพันธ์ฉันจะจัดทำรายการขนาดโพลิลี 7 ขนาดสำหรับโปรแกรมที่จะทำงาน

IO

ฉันต้องการให้ IO มีความยืดหยุ่นค่อนข้างคุณสามารถรับอินพุตและเอาต์พุตในรูปแบบที่เหมาะสม แต่คุณอาจต้องการใช้อินพุตในรูปแบบเดียวกับข้อมูลอินพุตดิบที่ฉันให้ไว้ รูปแบบของคุณควรสอดคล้องกันในการวิ่งหลายครั้ง

การจับเวลา

โปรแกรมของคุณควรทำงานในระยะเวลาที่เหมาะสม (ประมาณ <1 วัน) ในเครื่องที่เหมาะสม ฉันจะไม่บังคับใช้สิ่งนี้มากเกินไป แต่ฉันต้องการถ้าเราทุกคนเล่นได้ดี


(แน่นอนคุณต้องสามารถให้คะแนนรหัสของคุณเองได้)
user202729


คุณจะสั่งห้ามฮาร์ดโค้ดหรือไม่
FlipTack

1
@FlipTack ฉันค่อนข้างแน่ใจว่ามันเป็นช่องโหว่มาตรฐานอยู่แล้ว รวมทั้งโปรแกรมที่เขียนได้ดีอาจเป็นมนุษย์ที่ดีอยู่ดี
โพสต์ร็อค Garf Hunter

1
@ Οurousฉันคิดว่าฉันจะเอาเบรกเกอร์ที่สาม
โพสต์ Rock Garf Hunter

คำตอบ:


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
คำอธิบายที่ดีเกี่ยวกับวิธีการทำงานนี้จะดีและจะชนะ upvote ของฉัน ดูเหมือนว่ามันจะพยายามอย่างยิ่งยวดในการเพิ่มเซลล์ไปยังพื้นที่สี่เหลี่ยมล้อมรอบ polyplet หรือไม่?
เลเวลริเวอร์เซนต์

มันไม่ชัดเจนสำหรับฉันว่าทำไมมี+การตัดการเชื่อมต่อจากรูปร่างหลักในบางกรณี แต่ดูเหมือนว่าพวกเขาจำเป็นต้องหลีกเลี่ยงการวางไข่เซลล์ใหม่ โซลูชั่นเหล่านี้ดีที่สุดหรือไม่
เลเวลริเวอร์เซนต์

จากความอยากรู้ว่าทำไมใช้z3.Orแทนของวานิลลาa or b? มันมีประสิทธิภาพหมดจดหรือมีฟังก์ชั่นที่แตกต่างกันหรือไม่?
caird coinheringaahing

@cairdcoinheringaahing ดูเหมือนว่าเป็นวิธีแก้ปัญหาเชิงสัญลักษณ์
user202729

1
@AndersKaseorg 1. คุณยังไม่ได้ตอบความคิดเห็นของฉันถามว่าโซลูชันของคุณเหมาะสมหรือไม่ นี่เป็นเรื่องสำคัญอย่างยิ่งสำหรับผู้ที่กำลังพิจารณาที่จะโพสต์คำตอบ 2. ถ้าคุณไม่อธิบายว่า Z3 ทำอะไรในคำตอบของคุณฉันสามารถเดาได้ว่ามันทำอะไรเพราะฉันไม่มีเวลาอ่านเอกสารดังนั้นฉันจึงเดาได้ว่ากำลังดุร้าย 3 คำตอบนี้สมควรได้รับ upvote (อันที่จริงมันสมควรได้รับ upvote จำนวนมาก) สำหรับรหัสของมัน แต่ฉันจะไม่ upvote จนกว่าคำอธิบายที่ครอบคลุมสองจุดข้างต้นจะถูกเพิ่มเข้าไปในคำตอบ
ระดับแม่น้ำ St
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.