रणनीतिक लुप्त


15

यह पोस्ट इस मैथोवेटफ्लो पोस्ट से काफी प्रेरित है ।

एक वैनिशर कॉनवे के जीवन के किसी भी पैटर्न है जो एक चरण के बाद पूरी तरह से गायब हो जाता है। उदाहरण के लिए निम्न पैटर्न 9 वनीसर का आकार है।

आकार 9 लुप्त

वैनिशर्स की एक दिलचस्प संपत्ति यह है कि किसी भी पैटर्न को केवल अधिक जीवित कोशिकाओं को जोड़कर एक लुप्त हो सकता है। उदाहरण के लिए निम्न पैटर्न को पूरी तरह से एक लुप्त हो रहे पैटर्न में संलग्न किया जा सकता है

गैर लुप्तसंलग्न

हालाँकि हम उस पैटर्न को कम जीवंत कोशिकाओं को जोड़कर एक वैनिशर में बना सकते हैं।

छोटा संलग्नक यहां तक ​​कि छोटे संलग्नक

आपका कार्य एक प्रोग्राम लिखना है जो यह कार्य हमारे लिए करता है। यह इनपुट खोजने के रूप में एक पैटर्न दिया गया है और इनपुट से युक्त एक लुप्त पैटर्न को आउटपुट करता है। जरूरी नहीं कि आप केवल काम करने वाले पैटर्न को ही देखें।

स्कोरिंग

अपने कार्यक्रम को स्कोर करने के लिए आपको इसे सभी 6 पॉलीप्लेट के आकार पर चलाना होगा (डबल सममित रूप से समतुल्य मामलों की गिनती नहीं)। यहां एक पास्टबीन है जिसमें प्रत्येक पॉलीप्लेट अपनी लाइन पर है। उनमें से कुल 524 होना चाहिए। उन्हें छह निर्देशांक ( (x,y)ट्यूपल्स) की सूची के रूप में दर्शाया गया है, जिनमें से प्रत्येक एक जीवित सेल का स्थान है।

आपका स्कोर इन सभी पॉलिफ़ेट्स को वैनिशर्स में बनाने के लिए कुल नई कोशिकाओं को जोड़ा जाएगा।

संबंध

संबंधों के मामले में, मैं कार्यक्रमों को चलाने के लिए आकार 7 पॉलीप्लेट की एक सूची प्रदान करूंगा।

आईओ

मैं IO को बहुत लचीला होना चाहता हूं, आप उचित प्रारूपों में इनपुट और आउटपुट ले सकते हैं, हालांकि आप शायद उसी प्रारूप में इनपुट लेना चाहते हैं जैसे कि कच्चा इनपुट डेटा मैंने प्रदान किया था। आपका प्रारूप कई रन के अनुरूप होना चाहिए।

समय

आपका कार्यक्रम उचित समय पर (लगभग 1 दिन) उचित मशीन पर चलना चाहिए। मैं वास्तव में इसे बहुत अधिक लागू नहीं करने जा रहा हूं, लेकिन अगर हम सभी अच्छा खेलेंगे तो मैं पसंद करूंगा।


(बेशक आप अपना कोड स्कोर करने में सक्षम होना चाहिए)
user202729


क्या आप हार्डकोडिंग पर प्रतिबंध लगाने जा रहे हैं?
पलटें

1
@ फीलटैक मुझे पूरा यकीन है कि यह पहले से ही एक मानक खामी है। इसके अलावा एक अच्छी तरह से लिखा कार्यक्रम शायद वैसे भी एक इंसान के रूप में अच्छा है।
पोस्ट रॉक गार्फ हंटर

1
@ Tieurous मुझे लगता है कि मैं सिर्फ तीसरे टाई ब्रेकर को हटा दूंगा।
पोस्ट रॉक गार्फ हंटर

जवाबों:


4

पायथन + जेड 3 , स्कोर = 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? क्या यह विशुद्ध रूप से प्रदर्शन है, या इसकी एक अलग कार्यक्षमता है?
केयर्ड सिक्काहिंगाहिंग

@cairdcoinheringaahing लगता है कि यह एक प्रतीकात्मक समाधान है।
user202729

1
@AndersKaseorg 1. आपने मेरी टिप्पणी का जवाब नहीं दिया है कि क्या आपके समाधान इष्टतम हैं। उत्तर पोस्ट करने पर विचार करने के लिए किसी अन्य व्यक्ति के लिए यह बहुत महत्वपूर्ण है। 2. यदि आप यह नहीं समझाते हैं कि आपके उत्तर में Z3 क्या करता है तो मैं केवल यह अनुमान लगा सकता हूं कि यह क्या करता है, क्योंकि मेरे पास दस्तावेज़ीकरण पढ़ने का समय नहीं है, इसलिए मेरे क्रूर बल का यादृच्छिक अनुमान है। 3 यह उत्तर एक upvote का हकदार है (वास्तव में यह कई upvotes का हकदार है) अपने कोड के लिए, लेकिन मैं तब तक upvote नहीं करूंगा जब तक कि उपरोक्त दो बिंदुओं को कवर करने वाला स्पष्टीकरण उत्तर में नहीं जोड़ा जाता।
लेवल रिवर सेंट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.