バックグラウンド
Fractranは、John Conwayによって発明された難解なチューリング完全プログラミング言語です。Fractranプログラムは、分数の順序付きリストで構成されています。プログラムは、入力として単一の整数を取ることから始まります。プログラムの各反復で、最初の分数をリストで検索し、その分数で数値を乗算すると別の整数が生成されるようにします。次に、リストの先頭から新しい番号でこのプロセスを繰り返します。リストに数値と乗算できる分数がない場合、プログラムは終了し、数値を出力として提供します。
Fractranがチューリング完全である理由は、レジスタマシンをシミュレートするためです。数値の素因数分解はレジスタの内容を保存しますが、除算と乗算は条件付きでレジスタを加算および減算する方法です。ウィキペディアの記事(上記にリンク)を読むことをお勧めします。
チャレンジ
あなたのタスクは、STDINから有効なFractranプログラムを唯一の入力として取得し、Fractranプログラムをシミュレートする有効なBFプログラムをSTDOUTに生成する、可能な限り最短のプログラムを作成することです。BFを使用してFractranプログラムをシミュレートする方法は2つあります。
注:あなたの答えはBFプログラムではありません。答えは、特定のFractranプログラムからBFプログラムを生成するコードです。目標は、BFプログラムをFractranプログラムと同等にすることです。(技術的にはBFで競争することができますが、難しいでしょう)
オプション1
プログラムは、次のことを行うBFプログラムを出力する必要があります。
- 対応するASCII文字(BF入力の動作方法による)の形式で、STDINから正確に1つの番号を取得します。これは、Fractranプログラムへの入力です。
- 対応するASCII文字の形式でSTDOUTに正確に1つの数字を出力します。これはFractranプログラムからの出力です。
このオプションは、Fractran仮想マシンからの正確な入力と出力を表すことを目的としています。
オプション2
プログラムが生成するBFコードは次のことを行う必要があります。
- (プログラムを実行する前に)メモリに既にエンコードされている数の素因数分解を行うことにより、入力を取得します。入力が28(2 * 2 * 7)の場合、2番目のセルに値2があり、7番目のセルに値1があります(ポインターはセル0から始まります)。他のすべてのセルはゼロになります。
- プログラムの終了時に、出力の素因数分解をメモリにエンコードすることにより、出力を提供します。出力が10の場合、セル2と5のそれぞれに値1がなければなりません。他のすべての素数のセルの値はゼロでなければなりません。他のセルの内容は関係ありません。
このオプションは、Fractran言語の背後にあるコンピューティングモデルを表します。
ルールと要件
- 入力(プログラムの上部)は、STDINの分数のリストになります。分子と分母の間にコンマがある行ごとに1つの小数があります。空行は入力の終わりを表します。端数は常に最低の項に削減されます。
- プログラムの出力は、STDOUTに対する単一行の有効なBFプログラムでなければなりません。このプログラムは、2つのオプションのいずれかに従って、特定のFractranプログラムをシミュレートできる必要があります。入力については、生成されたBFプログラムはFractranプログラムと同じ出力を生成できるはずです。
- 選択したオプションを指定する必要があります。
- BFメモリとテープの境界、およびそれらがラッピングしているかどうかを選択できます。
- コードゴルフ。また、出力されるBFプログラムのサイズは重要ではなく、変換を行うプログラムのサイズのみが重要です。
- プログラムは印刷可能なASCIIのみで構成する必要があります
私がどこでもあいまいな場合は、askすることをaskしないでください。これは説明するのが非常に複雑な課題です。
さらに、プログラムが動作しているかどうかを簡単に確認できるように、次の入力用にプログラムで生成されたBFコードを投稿してください。
33,20
5,11
13,10
1,5
2,3
10,7
7,2
このプログラムは、数値のバイナリ展開で1の数を計算します。ただし、入力と出力は奇妙な形式になっています(すべてのFractranプログラムと同様)。入力の形式は2 ^ Aで、出力の形式は13 ^ Bです。