Vanishers chiến lược


15

Bài đăng này được lấy cảm hứng lỏng lẻo bởi bài viết mathoverflow này .

Vanisher là bất kỳ mô hình nào trong Trò chơi cuộc sống của Conway hoàn toàn biến mất sau một bước. Ví dụ, mẫu sau đây là cỡ 9 Vanisher.

Kích thước 9 Vanisher

Một đặc tính thú vị của Vanishers là bất kỳ mẫu nào cũng có thể được tạo thành một mẫu biến mất chỉ bằng cách thêm nhiều ô sống. Ví dụ, mẫu sau có thể được bao bọc hoàn toàn thành một mẫu biến mất như vậy

Không biến mấtKèm

Tuy nhiên, chúng ta có thể biến mô hình đó thành Vanisher bằng cách thêm các ô còn sống.

Bao vây nhỏ hơn Bao vây nhỏ hơn

Nhiệm vụ của bạn là viết một chương trình thực hiện nhiệm vụ này cho chúng tôi. Điều đó được đưa ra một mẫu khi tìm đầu vào và xuất ra một mẫu biến mất có chứa đầu vào. Bạn không nhất thiết phải tìm ra mẫu tối ưu chỉ là một mẫu hoạt động.

Chấm điểm

Để ghi điểm chương trình của bạn, bạn sẽ phải chạy nó trên tất cả các đa giác kích thước 6 (không tính gấp đôi các trường hợp tương đương đối xứng). Đây là một pastebin chứa mỗi polyplet trên dòng riêng của nó. Nên có tổng cộng 524 người trong số họ. Chúng được biểu diễn dưới dạng một danh sách gồm sáu tọa độ ( (x,y)bộ dữ liệu), mỗi tọa độ là vị trí của một ô sống.

Điểm của bạn sẽ là tổng số ô mới được thêm vào để biến tất cả các đa giác này thành Vanishers.

Cà vạt

Trong trường hợp quan hệ, tôi sẽ cung cấp một danh sách các polyplet kích thước 7 cho các chương trình được chạy.

Tôi

Tôi muốn IO khá linh hoạt, bạn có thể nhận đầu vào và đầu ra ở các định dạng hợp lý tuy nhiên có lẽ bạn sẽ muốn nhận đầu vào ở định dạng giống như dữ liệu đầu vào thô tôi cung cấp. Định dạng của bạn phải nhất quán trong nhiều lần chạy.

Thời gian

Chương trình của bạn sẽ chạy trong một khoảng thời gian hợp lý (khoảng <1 ngày) trên một máy hợp lý. Tôi sẽ không thực sự thực thi điều này quá nhiều nhưng tôi thích nếu tất cả chúng ta sẽ chơi tốt.


(tất nhiên bạn phải có khả năng ghi mã của riêng mình)
user202729


Bạn sẽ cấm mã hóa?
FlipTack

1
@FlipTack Tôi khá chắc chắn rằng nó đã là một lỗ hổng tiêu chuẩn. Cộng với một chương trình được viết tốt có lẽ cũng tốt như một con người.
Đăng Rock Garf Hunter

1
@ Οurous Tôi nghĩ rằng tôi sẽ loại bỏ bộ ngắt kết nối thứ ba.
Đăng Rock Garf Hunter

Câu trả lời:


4

Python + Z3 , điểm = 3647

Chạy trong 14 giây trên hệ thống tám lõi của tôi.

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)

Đầu ra đầy đủ


1
Một lời giải thích hợp lý về cách thức hoạt động của nó sẽ tốt và sẽ giành chiến thắng. Có vẻ như nó cố gắng mạnh mẽ thêm các tế bào vào một khu vực hình chữ nhật bao quanh polyplet?
Cấp sông St

Tôi không rõ tại sao có sự +ngắt kết nối với hình dạng chính trong một số trường hợp nhưng có vẻ như chúng là cần thiết để tránh sinh ra các tế bào mới. Do đó, những giải pháp này là tối ưu?
Cấp sông St

Vì tò mò, tại sao lại dùng z3.Orthay vì vani a or b? Là nó hoàn toàn hiệu suất, hoặc nó có một chức năng khác nhau?
caird coinheringaahing

@cairdcoinheringaahing Hình như đó là một giải pháp mang tính biểu tượng.
dùng202729

1
@AndersKaseorg 1. bạn chưa trả lời bình luận của tôi hỏi xem giải pháp của bạn có tối ưu không. Điều này có tầm quan trọng lớn đối với bất cứ ai khác xem xét đăng một câu trả lời. 2. Nếu bạn không giải thích Z3 làm gì trong câu trả lời của mình, tôi chỉ có thể đoán nó làm gì, vì tôi không có thời gian để đọc tài liệu, do đó tôi đoán ngẫu nhiên về lực lượng vũ phu. 3 Câu trả lời này xứng đáng với một upvote (thực tế nó xứng đáng với nhiều upvote) cho mã của nó, nhưng tôi sẽ không upvote cho đến khi một lời giải thích bao gồm hai điểm trên được thêm vào câu trả lời.
Cấp sông St
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.