パープルインタープリターのゴルフ
紫のは2つの主な目的で設計されたエソランです。
- の最小化 Au子の、自己修正可能な1命令言語が十分にないためです。
- の可能性を認める 恐ろしく小さなゴルフ通訳者の。適度にフル機能のPython 2インタープリターでの最初のパスはわずか702バイトであり、経験豊富なゴルファーはそこからかなりの量を削ることができると確信しています。
あなたの目標は、この言語の通訳を書くことです。
紫に関する情報:
紫色のプログラムは、プログラムの最初の文字がアドレス0に配置されるように、無限のアドレス可能なメモリアレイに配置される文字のシーケンスです。配列の残りの部分(紫色のプログラムが格納される場所の前後両方)はゼロに初期化されます。
Purpleには、aおよびbおよびiと呼ばれる3つのレジスタがあり、それぞれが符号付き整数を保持でき、ゼロに初期化されます。iは命令ポインターでもあり、常に現在実行中のパープル命令を指します。
各サイクルで、インタプリタは命令ポインタによって示されたメモリ位置から始まる3つの連続した文字のシーケンスを読み取り、このシーケンスをパープル命令として実行しようとします。その後、命令ポインタは常に3ずつ増加します。
構文的には、Purple命令は、「xyz」のような3つの文字(またはそのエンコード)が連続して構成されています。
最初の文字xは次のいずれかです。
abABio
これらの記号の意味は次のとおりです。
a - Place the result in register a.
b - Place the result in register b.
A - Place the result in the location in memory referred to by register a.
B - Place the result in the location in memory referred to by register b.
i - Set the instruction pointer to the result.
o - Output the result to stdout.
他の2バイトyおよびzは、次のいずれかです。
abABio1
これらの各シンボルの意味は次のとおりです。
a - Return the contents of register a.
b - Return the contents of register b.
A - Return the contents of the memory array at the address stored in register a.
B - Return the contents of the memory array at the address stored in register b.
i - Return the contents of register i (the instruction pointer).
o - Return the value of a single character read from stdin.
1 - Return the literal numeric value 1.
命令をフェッチした後、紫インタプリタは評価され、Y、次いで、Z、結果減算Zの結果から、Y、およびその後のアクションを実行することによって示されるX差に。
3文字のシーケンス(またはそのエンコード)が有効なパープル命令ではない場合、インタープリターはエラーを出さずに直ちに停止します。
通訳者は:
- 関数ではなく、完全なプログラムであること。
- EOFが読み取られない限り、stderrに出力しない。
- 以下に示すテストプログラムを含む、非常に大きな数を含まないすべての整形式入力で、参照実装と同じように動作します。(まあ、同じタイミングまでです-実行速度は遅くなりますが、大きすぎません!)
プログラムをインタプリタに任意の形式で提供できます。ファイルから読み取るか、プログラムに文字列として埋め込むか、stdinから読み取ります。
テストケース:
プログラム
ooo
入力で実行した場合
z!
もたらすべきです
Y
プログラム
bbboobiii
入力で実行した場合
It's a cat program.
(または他の入力)は
It's a cat program.
(または受け取った入力)からやり直し、同じことをもう一度行います。
プログラム
Aoab11bi1bABoAaiba
入力で実行した場合
0
もたらすべきです
0
その後停止しますが、入力で実行すると
1
出力を続ける必要があります
1
永遠に。
プログラム
b1bbb1oAbabaa1ab1Ab1Bi1b
もたらすべきです
b1bbb1oAbabaa1ab1Ab1Bi1b
プログラム
aA1aa1bb1oAbbi1bb1bbAb1Bi1b Purple is the awesomest! Why haven't you tried it yet?
!dlroW ,olleG
もたらすべきです
Hello, World!
得点:
これはcode-golfなので、次のボーナスによって潜在的に変更される可能性があるため、バイト単位の最短ソースが勝ちます。
ボーナス:
- インタープリターが標準入力またはコマンドライン引数からファイル名を読み取り、ファイルからプログラムをロードする場合、-10%。
uint32
int型のための文字とMAXINTのために