サイクリックタグシステムのシミュレーション


14

環状タグシステムは、 2シンボルアルファベットからなる小さな、チューリング完全な計算モデル(私は使用しますである{0,1})、有限の空ではない環状リストプロダクションそれら二つのシンボルで構成され、無限もから成りますこれらの2つのシンボル。

各ステップで:

  • 単語の最初の要素が削除されます
  • 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]

実装の詳細:

  • アルファベットは関係ありません。あなたは使用すること01TrueそしてFalseTそしてNILAそしてB、あるいは1、および0、または任意の他、あなたは限り、あなたは一貫しているとして、思い付くことがあります。すべての入力と出力は同じアルファベットを使用する必要があり、使用する対象0と対象を指定する必要があります1

  • 単語の長さは理論的に無制限でなければなりません。つまり、最大語長をハードコーディングすることはできません。無限のメモリ容量を持つ理想的なコンピューターでプログラムを実行する場合、プログラムは理論的にそれを利用できる必要があります。(インタプリタ/コンパイラの制限を無視してもかまいません。)

  • 指定された世代に達する前に指定されたシステムが停止した場合、空の単語を返すか出力する必要があります。

  • 空のプロダクションが存在するため、それを処理できる必要があります。完全なプログラムを作成する場合、I / Oもそれを処理できる必要があります。

編集:私はもともと、生成0が入力語そのものであり、生成1が最初のステップの結果であることを意図していました。すなわち、私はあなたに前のコラムを返すつもりでした。ただし、これを述べるのに十分明確ではないので、両方のオプションを受け入れます。世代ごとに、before列またはafter値を返すことができます。あなたがそうしている場合、あなたは後の列をフォローしていることを述べなければなりません。また、どの列を選択するかについても一貫性が必要です。

今から1週間で最小のコード(10/27/2014)を授与します。


ええと、例の出力が正しいと確信していますか?あなたが与えた他の例に基づいて、私は...それは第5世代だと思う
FryAmTheEggman

別の順序で入力を取得できますか?
マーティンエンダー14年

1
@FryAmTheEggman:それは正しいです、私は「前」の列を意味しました。もっと多くの人がこの間違いを犯した場合、どちらかを受け入れるように質問を変更します。私はあまりはっきりしていなかったと認めます。
マリヌス14年

@MartinBüttner:順序を指定する限り、それは重要ではありません。
マリヌス14年

回答:


4

GolfScript(入力形式と受け入れられた出力形式に応じて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üttnerCJamソリューション繰り返しと切り捨てによって制作のリストを生成するというアイデアについて。


あなたは引用したCJamソリューションに縛られているので、私はその答えを選びました。あなたが別のバイトを削る場合、私は再考します:)
マリナス14年

@marinus、私の回答のテキストで言及している17バイトのバージョンを受け入れますか?
ピーターテイラー14年

それを見なかったが、それは有効に見えます。おそらくそれをもう少し明確にマークする必要があります。
マリヌス14年

5

ハスケル、55 53 51

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

これはTrueas 1およびFalseasを使用し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?(@*+}/}

これはブロック(functioNに最も近いもの)を定義します。このブロックは、入力が次のようにスタックに常駐することを想定しています。

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

同様に、0sと1sの配列をスタックに残します。

ここでテストしてください。入力を1行目に貼り付け、3行目にコードを貼り付け、~ブロックを実際に評価するためにa を追加します。例えば

[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.";

単語の最終状態はスタックに残ります。

これを再訪させてくれたPeter Taylorに感謝します。


1
l~{_,g{('1=@(:Pa+@@P*+}*}*\;28、まだ改善の範囲(特に(:P部分)ですが、昼食の時間
オプティマイザー14年

@Optimizerああ、いいですね。ありがとうございました。そしてええ、これ:Pも私を
悩ます

l~{_,g{(si@(:Pa+@@P*+}*}*\;:27およびそれを調べた後、:P実際には効率的です:P
オプティマイザー14年

_,g_!!同じバイトで置き換えることもできます。
オプティマイザー14年

@Optimizer私もその時使用するかもしれません_{...}{}?
マーティンエンダー14年

2

Mathematica、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]

{1、0、1、0、0、0、0}


2

Pyth 22

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

Python 2-61 67 91105124

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時にゴルフをするのは悪い決断だと指摘してくれました。

私のスコアの50%を借りている@xnorにも感謝します。

サンプル:

>>> 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 14年

また、私は内部を理解していませんif x else w。ませんx。このコードはのみ実行されるため、常に真であることif x、または私は何かが足りないのですか?
XNOR

@xnor確かに、あなたは完全に正しいです:)
FryAmTheEggman 14年

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

@xnorおかげで:)また、今あなたがそれを3つの変数の関数を作ったことを、私は...私はPythにそれを翻訳考える
FryAmTheEggman

1

Javascript ES6-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

私のブラウザにポップアップ表示されたFryの答えに不気味に似ています。(コピーはできません。厳soleに誓います。)

ただし、文字列/正規表現のルートに行っている間に、彼は配列ルートに行ったように見えます。

拡張:

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"

今、ゴルフの言語が入り、私たち二人を虐殺するのを見てください。:D


2つの例で異なる回答が得られたため、実際に投稿を削除しました。彼が世代ごとに行く例を試してみましたか?...彼が与えた完全な呼び出し例と比較して、1つでオフであるように思わ
FryAmTheEggman

そして、心配しないでください、私はあなたが私をコピーしなかったと信じています:P
FryAmTheEggman 14年

@FryAmTheEggman:私は一貫して、番号付き世代の「前」列を生成します。これはOPの例と一致しており、「生成0」は入力を処理せずに単に返すだけであるように思われます。これはこの解釈と一致しています。ちなみに、ソリューションがいくつかの点で驚くほど似ているため、「コピー」免責事項を追加しました。同じ引数名、同じ基本的な再帰構造を使用し、同じファントム4番目の引数を追加しましたn。素晴らしい心、え?:D
COTO 14年

どちらかが間違っているとしたら、どちらも間違っていると思います!団結しました。
FryAmTheEggman 14年

@FryAmTheEggman:ペッペ氏については間違っていませんでした。;)
COTO 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.