मैं सेलुलर ऑटोमेटन के साथ खेल रहा था और मैंने पाया कि कुछ दिलचस्प व्यवहार था। यहां देखिए यह कैसे काम करता है:
यह बायीं से दाईं ओर एक बाइनरी स्ट्रिंग को पढ़ता है, अगर यह अन्य मूल्यों का 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
? मुझे लगता है कि कुछ और परीक्षण मामले मददगार होंगे