एक चक्रीय टैग प्रणाली का अनुकरण करें


14

एक चक्रीय टैग प्रणाली एक दो प्रतीक वर्णमाला (मैं इस्तेमाल करेंगे से मिलकर एक छोटे से, ट्यूरिंग-पूर्ण कम्प्यूटेशनल मॉडल है {0,1}), एक सीमित, के अरिक्त चक्रीय सूची प्रस्तुतियों कि उन दो प्रतीकों से मिलकर बनता है, और एक असीम शब्द जो भी होते हैं उन दो प्रतीकों।

प्रत्येक चरण पर:

  • शब्द में पहला तत्व हटा दिया गया है
  • अगर यह 0वर्तमान उत्पादन छोड़ दिया गया था
  • यदि यह 1वर्तमान उत्पादन था तो शब्द के अंत में जोड़ा जाता है ।
  • अगला उत्पादन सक्रिय हो जाता है। यदि यह अंतिम उत्पादन था, तो पहले वाले पर वापस जाएं।

शब्द खाली हो जाने पर सिस्टम रुक जाता है।

एक उदाहरण (विकिपीडिया से):

Productions: (010, 000, 1111)
Initial word: 11001

Generation  Production   Word (before)            Word (after)
   0           010           11001             →     1001010       
   1           000            1001010          →      001010000
   2           1111            001010000       →       01010000
   3           010              01010000       →        1010000
   4           000               1010000       →         010000000
   5           1111               010000000    →          10000000
   6           010                 10000000    →           0000000010
   7           000                  0000000010 →            000000010
   8           1111                  000000010 →             00000010
   9           010                    00000010 →              0000010

आपका कार्य, यदि आप इसे स्वीकार करना चुनते हैं, तो एक प्रोग्राम या फ़ंक्शन लिखना है:

  • प्रस्तुतियों की एक सूची,
  • प्रारंभिक शब्द, और
  • एक पीढ़ी,

और उस पीढ़ी में शब्द प्रिंट या वापस करता है

उदाहरण के लिए,

cyclic_tag(
      prod=[[0,1,0],[0,0,0],[1,1,1,1]], 
      word=[1,1,0,0,1], 
      gen=4) => [1,0,1,0,0,0,0]

कार्यान्वयन विवरण:

  • वर्णमाला कोई मायने नहीं रखती। आप उपयोग कर सकते हैं 0और 1, Trueऔर False, Tऔर NIL, Aऔर B, या यहाँ तक 1और 0, या जो कुछ भी कहीं भी आप के साथ, जब तक कि आप संगत कर रहे हैं हो सकता है। सभी इनपुट और आउटपुट को एक ही वर्णमाला का उपयोग करना चाहिए, और आपको यह इंगित करना होगा कि आप 0क्या और किस लिए उपयोग कर रहे हैं 1

  • शब्द की लंबाई सैद्धांतिक रूप से अनबाउंड होनी चाहिए। यानी, आप अधिकतम शब्द लंबाई हार्डकोड नहीं कर सकते हैं। यदि मैं आपके प्रोग्राम को एक आदर्श कंप्यूटर पर असीम मेमोरी के साथ चलाता हूं, तो आपका प्रोग्राम सैद्धांतिक रूप से इसका उपयोग करने में सक्षम होना चाहिए। (आप अपने दुभाषिया / संकलक की सीमाओं की उपेक्षा कर सकते हैं।)

  • यदि दिए गए सिस्टम तक पहुंचने से पहले दिया गया सिस्टम रुक जाता है, तो आपको खाली शब्द वापस करना होगा या प्रिंट करना होगा।

  • खाली उत्पादन मौजूद है, और आपको इसे संभालने में सक्षम होना चाहिए। यदि आप एक पूर्ण कार्यक्रम लिखते हैं, तो आपका I / O भी इसे संभालने में सक्षम होना चाहिए।

संपादित करें : मैंने मूल रूप से पीढ़ी के 0लिए इनपुट शब्द ही होने का इरादा किया था , और पीढ़ी 1पहले चरण का परिणाम थी। यानी, मैंने आपके लिए पहले वाले कॉलम को वापस करने का इरादा किया था । हालांकि , जैसा कि मैंने यह बताते हुए पर्याप्त स्पष्ट नहीं किया है, मैं दोनों विकल्पों को स्वीकार करूंगा ; प्रत्येक पीढ़ी के लिए आप पहले या बाद वाले कॉलम में मान वापस कर सकते हैं । आपको यह बताना होगा कि यदि आप ऐसा कर रहे हैं, तो आप कॉलम के बाद चल रहे हैं। आपको यह भी अनुरूप होना चाहिए कि आप किस कॉलम को चुनते हैं।

मैं अब (10/27/2014) से एक हफ्ते में सबसे छोटे कोड का पुरस्कार दूंगा।


उम, क्या आप सुनिश्चित हैं कि उदाहरण में आपका आउटपुट सही है? आपके द्वारा दिए गए अन्य उदाहरण के आधार पर, मुझे लगता है कि यह जीन 5 है ...
FryAmTheEggman

क्या हम एक अलग क्रम में इनपुट ले सकते हैं?
मार्टिन एंडर

1
@FryAmTheEggman: यह सही है, मेरा मतलब था 'पहले' कॉलम। यदि अधिक लोगों ने यह गलती की है, तो मैं अपने प्रश्न को स्वीकार करने के लिए बदल दूंगा। मैं मानता हूं कि मैं बहुत स्पष्ट नहीं था।
मारिनस

@ मार्टिनबटनर: जब तक आप आदेश को निर्दिष्ट करते हैं, तब तक कोई फर्क नहीं पड़ता।
मारिनस

जवाबों:


4

गोल्फस्क्रिप्ट (इनपुट प्रारूप और स्वीकृत आउटपुट प्रारूप के आधार पर 17 से 19 बाइट्स)

18 बाइट्स:

~.@*<{\1,or(@*+}/`

फॉर्म में इनपुट लेता है [1 1 0 0 1] [[0 1 0] [0 0 0] [1 1 1 1]] 4और फॉर्म में आउटपुट देता है [1 0 1 0 0 0 0]। ( अंतिम के बिना 17 बाइट्स हो सकते हैं `यदि आउटपुट 1010000स्वीकार्य है)।

ऑनलाइन डेमो

19 बाइट्स:

~.@*<{\0`or(1&@*+}/

फॉर्म में इनपुट लेता है "11001" ["010" "000" "1111"] 4

ऑनलाइन डेमो

विच्छेदन

~        # Evaluate input: stack: word productions gen
.@*<     # Produce a list of the right number of productions with suitable repetition
{        # For each of those productions:
  \      #   Bring the word to the top
  0`or   #   Ensure that we don't get an error if the word is empty
  (1&    #   Pop the first char from the word and evaluate it
  @*     #   Repeat the production that many times
  +      #   Concatenate 0 or 1 copies of the production to the rest of the word
}/       # Endforeach

करने के लिए क्रेडिट मार्टिन Büttner के CJam समाधान पुनरावृत्ति और काट-छांट से प्रस्तुतियों की सूची तैयार करने के विचार के लिए।


आप CJam समाधान के साथ बंधे हुए हैं जिसका आप हवाला देते हैं, इसलिए मैंने वह उत्तर चुना है। यदि आप एक और बाइट काटते हैं तो मैं पुनर्विचार करूँगा :)
मैरिनस

@marinus, क्या आप 17 बाइट संस्करण स्वीकार करते हैं जिन्हें मैं अपने उत्तर के पाठ में संदर्भित करता हूं?
पीटर टेलर

नहीं देखा था, लेकिन यह मान्य दिखता है। आपको शायद इसे थोड़ा और स्पष्ट रूप से चिह्नित करना चाहिए।
marinus

5

हास्केल, 55 53 51

(t:w)%p|t=w++p|0<1=w
x%_=x
e w=(!!).scanl(%)w.cycle

यह उपयोग Trueकरता है 1और Falseजैसे ही 0। उदाहरण रन:

*Main> let t=True ; f=False
*Main> e [t,f,t] [[f,f,f],[t,t,t]] 4
[False,False,False,False,False]

3

CJam, 31 30 28 27 24 18 बाइट्स

{_@*<{\_0a?(@*+}/}

यह एक ब्लॉक (एक फंक्शनलियोएन के सबसे करीबी चीज) को परिभाषित करता है, जो इनपुट को इस तरह स्टैक पर निवास करने की उम्मीद करता है

[1 1 0 0 1] [[0 1 0] [0 0 0] [1 1 1 1]] 9

यह इसी तरह ढेर पर 0s और 1s की एक सरणी छोड़ देगा ।

इसका परीक्षण यहां करें। इनपुट को पहली पंक्ति, तीसरी पंक्ति के कोड को चिपकाएँ, और ~वास्तव में ब्लॉक का मूल्यांकन करने के लिए संलग्न करें । उदाहरण के लिए

[1 1 0 0 1] [[0 1 0] [0 0 0] [1 1 1 1]] 9
{_@*<{\_0a?(@*+}/}~

यदि आउटपुट में इनपुट के समान रूप नहीं है

स्पष्टीकरण:

_@*<{\_0a?(@*+}/
_@               "Duplicate the generation and pull the productions to the top.";
  *<             "Repeat the productions N times and take the first N elements.";
    {         }/ "For each element in that list, run this block.";
     \           "Swap production and current word W.";
      _0a?       "W = (W != []) ? W : [0]. This is to ensure we can unshift an element.";
          (      "Unshift the first 0 or 1 from the word.";
           @     "Rotate the stack, pulling the production to the top.";
            *    "Repeat it 0 or 1 times.";
             +   "Append to the word.";

शब्द की अंतिम स्थिति को ढेर पर छोड़ दिया जाता है।

मुझे इसे फिर से बनाने के लिए पीटर टेलर का धन्यवाद।


1
l~{_,g{('1=@(:Pa+@@P*+}*}*\;28 और अभी भी सुधार की गुंजाइश है (विशेष रूप से (:Pहिस्सा), लेकिन दोपहर के भोजन के लिए समय
ऑप्टिमाइज़र

@Optimizer आह, अच्छा विचार है। धन्यवाद। और हाँ, :Pमुझे भी परेशान कर रहा है: D
मार्टिन एंडर

l~{_,g{(si@(:Pa+@@P*+}*}*\;: 27 और इसे देखने के बाद, :Pवास्तव में कुशल है: पी
ऑप्टिमाइज़र

_,gको भी _!!उसी बाइट से बदला जा सकता है ।
ऑप्टिमाइज़र

@ ऑप्टीमाइज़र तो मैं भी इस्तेमाल कर सकता हूँ _{...}{}?
मार्टिन एंडर

2

मैथेमेटिका, 84 80 77 वर्ण

f[_,w_,_]=w;f[p_,{x_,y___},n_/;n>0]:=f[RotateLeft@p,Flatten@{y,p~Take~x},n-1]

उदाहरण:

f[{{0, 1, 0}, {0, 0, 0}, {1, 1, 1, 1}}, {1, 1, 0, 0, 1}, 4]

{, 0, 1, 1, 0, 0, 0, 0}


2

अजगर २२

अलग इनपुट के रूप में सभी 3 तर्कों की आवश्यकता है।

#Vvw=z+tz*@Q%NlQshz)zq

जैसे तर्क देता है:

11001
["010","000","1111"]
4

स्पष्टीकरण:

                        : Implicit: z = input(); Q=eval(input())
#                       : Loop until an exception is thrown
 Vvw               )    : for N in range(eval(input()))
    =z                  : assign to z
      +tz               : the sum of the tail of z and
         *@Q%NlQ        : Q[N%len(Q)] times
                shz     : the numeric value of the first character in z
                    zq  : print z then throw exception

अजगर 2 - 61 67 91 105 124

c=lambda p,w,g:g*w and c(p[1:]+p[:1],w[1:]+w[0]*p[0],g-1)or w

सुंदर जो-बेसिक जवाब। मान लिया कि खाली उत्पादन है [[]]

@Xnor के लिए धन्यवाद, यह इंगित करने के लिए कि सुबह 2 बजे गोल्फ खराब निर्णय है।

@Xnor को अतिरिक्त धन्यवाद, जिसे मैं अपने स्कोर का 50% देना चाहता हूं।

नमूना:

>>> c([[0,1,0],[0,0,0],[1,1,1,1]],[1,1,0,0,1],4)
[1, 0, 1, 0, 0, 0, 0]

1
निश्चित रूप से यह एक मेमने का उपयोग करने के लिए छोटा है और बस के लिए लिखता g and wहै x? इसके अलावा, मुझे लगता है कि g*wदोनों gको नॉनजरो होने पर एक सत्य मूल्य देने के लिए काम करना चाहिए और wगैर-रिक्त है।
xnor

इसके अलावा, मैं भीतर को नहीं समझता if x else wxहमेशा सच नहीं होगा क्योंकि यह कोड केवल चलाया जाता है if x, या मैं कुछ याद कर रहा हूं?
xnor

@ एक्सनॉर निश्चित रूप से, आप पूरी तरह से सही हैं :)
फ्रायमईएग्गमैन

1
and/ orचाल के साथ कुछ और गोल्फिंग और pवेतन वृद्धि के बजाय nc=lambda p,w,g:g*w and c(p[1:]+p[:1],w[1:]+w[0]*p[0],g-1)or w
घूमना

@xnor धन्यवाद :) इसके अलावा, अब जब आपने इसे 3 चर का कार्य कर दिया है, तो मुझे लगता है कि मैं इसे पार्थ में अनुवाद करता हूं ...
FryAmTheEggman

1

जावास्क्रिप्ट ईएस 6 - 88 बाइट्स

f=(p,w,g,n)=>g?w.replace(/(.)(.*)/,(_,a,b)=>f(p,a*1?b+p[(n=n||0)%p.length]:b,g-1,n+1)):w

फ्राय के उत्तर के समान ही लगता है जो मेरे ब्राउज़र में बस पॉप अप हुआ था। (कोई नकल नहीं, मैं पूरी तरह से शपथ लेता हूं।)

यह तब दिखाई देगा, जब मैं स्ट्रिंग / रेगेक्स मार्ग पर गया था, लेकिन वह सरणी मार्ग गया था।

विस्तारित:

f = (p,w,g,n) =>
    g ?
        w.replace( /(.)(.*)/, (_,a,b) =>
            f( p, a*1 ? b + p[(n=n||0)%p.length] : b, g-1, n+1 )
        )
    :
        w

नमूना आउटपुट

f(['010','000','1111'],'11001',4)
"1010000"

अब गोल्फ की भाषाओं को देखें और हम दोनों का कत्लेआम करें। : डी


मैंने वास्तव में अपनी पोस्ट हटा दी क्योंकि मुझे दो उदाहरणों के लिए अलग-अलग उत्तर मिल रहे थे। क्या आपने उदाहरण दिया है कि वह पीढ़ी दर पीढ़ी कहाँ जाता है? ऐसा लगता है कि उन्होंने एक पूर्ण कॉल उदाहरण की तुलना में बंद कर दिया ...
FryAmTheEggman

और चिंता न करें, मेरा मानना ​​है कि आपने मुझे कॉपी नहीं किया: P
FryAmTheEggman

@FryAmTheEggman: मेरा निरंतर क्रमांकित पीढ़ी के लिए "पहले" कॉलम बनाता है। यह ओपी में उदाहरण के अनुरूप है, और यह तर्कसंगत लगता है कि "पीढ़ी 0" केवल इनपुट को बिना प्रसंस्करण के वापस कर देगा, जो इस व्याख्या के अनुरूप है। संयोग से, मैंने "कॉपी" अस्वीकरण जोड़ दिया क्योंकि समाधान कुछ मामलों में अनजान थे। हमने एक ही तर्क नाम, एक ही मूल पुनरावर्ती संरचना का उपयोग किया, और हमने एक ही प्रेत चौथे तर्क को भी जोड़ा n। महान दिमाग, एह? : D
COTO

ठीक है, मुझे लगता है कि अगर हम दोनों में से कोई भी गलत है, तो हम दोनों गलत हैं! संयुक्त हम खड़े।
FryAmTheEggman

@FryAmTheEggman: आप श्री Peppe के बारे में गलत नहीं थे। ;)
सीओटीओ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.