मैं सेलुलर ऑटोमेटन के साथ खेल रहा था और मैंने पाया कि कुछ दिलचस्प व्यवहार था। यहां देखिए यह कैसे काम करता है:
यह बायीं से दाईं ओर एक बाइनरी स्ट्रिंग को पढ़ता है, अगर यह अन्य मूल्यों का 1पालन करता है तो यह परिणाम के लिए 2एक 0और पाठ को जारी रखेगा। अगर इसका सामना होता है 0(या 3 से कम मान बचे हैं) तो यह वर्तमान मूल्य और a 1को आगे बढ़ाएगा और पढ़ना जारी रखेगा। स्ट्रिंग के अंत में यह 1परिणाम के लिए एकल जोड़ देगा ।
यहां एक पीढ़ी का काम किया गया उदाहरण है
01011111
^
हम पहले मुठभेड़ करते हैं 0ताकि हम 01अपने परिणाम के लिए संलग्न हों
01011111
^
01
अब हमारा सामना होता है 1इसलिए हम एक शून्य को जोड़ते हैं और अगले दो मूल्यों को छोड़ देते हैं
01011111
^
010
हम एक और मुठभेड़ करते हैं 1तो हम भी ऐसा ही करते हैं
01011111
^
0100
अब हम एक और है 1कूदने के लिए तो हम वर्तमान सेल संलग्न लेकिन पर्याप्त नहीं अंतरिक्ष और एक 1(इस मामले में 11)
01011111
^
010011
हम अंत में हैं इसलिए हम एक एकल को जोड़ते हैं 1और इस पीढ़ी को समाप्त करते हैं
01011111
^
0100111
कार्य
किसी भी उचित प्रारूप में इनपुट को देखते हुए आपको एक फ़ंक्शन या प्रोग्राम बनाना होगा जो ऑटोमेटन की एक पीढ़ी की गणना करता है।
यह एक कोड-गोल्फ प्रश्न है, इसलिए उत्तर बाइट्स में दिए जाएंगे, कम बाइट बेहतर होने के साथ।
नमूना कार्यान्वयन
यहाँ हास्केल में एक नमूना कार्यान्वयन है (एक फ़ंक्शन को परिभाषित करता है d, लेकिन कार्यक्रम अनिश्चित काल तक प्रिंट करता है):
d('1':_:_:x) = "0" ++ d x
d(a:x) = a:'1':d x
d x = "1"
r x = x:map d(r x)
10इसका प्रिंट होना चाहिए 11011? मुझे लगता है कि कुछ और परीक्षण मामले मददगार होंगे