環状タグシステムは、 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]
実装の詳細:
アルファベットは関係ありません。あなたは使用すること
0
と1
、True
そしてFalse
、T
そしてNIL
、A
そしてB
、あるいは1
、および0
、または任意の他、あなたは限り、あなたは一貫しているとして、思い付くことがあります。すべての入力と出力は同じアルファベットを使用する必要があり、使用する対象0
と対象を指定する必要があります1
。単語の長さは理論的に無制限でなければなりません。つまり、最大語長をハードコーディングすることはできません。無限のメモリ容量を持つ理想的なコンピューターでプログラムを実行する場合、プログラムは理論的にそれを利用できる必要があります。(インタプリタ/コンパイラの制限を無視してもかまいません。)
指定された世代に達する前に指定されたシステムが停止した場合、空の単語を返すか出力する必要があります。
空のプロダクションが存在するため、それを処理できる必要があります。完全なプログラムを作成する場合、I / Oもそれを処理できる必要があります。
編集:私はもともと、生成0
が入力語そのものであり、生成1
が最初のステップの結果であることを意図していました。すなわち、私はあなたに前のコラムを返すつもりでした。ただし、これを述べるのに十分明確ではないので、両方のオプションを受け入れます。世代ごとに、before列またはafter列に値を返すことができます。あなたがそうしている場合、あなたは後の列をフォローしていることを述べなければなりません。また、どの列を選択するかについても一貫性が必要です。
今から1週間で最小のコード(10/27/2014)を授与します。