99(「ナインティーナイン」と発音)は、まったく新しい難解なプログラミング言語です(99と混同しないでください、イタリック体に注意してください)。このチャレンジでのあなたの仕事は、可能な限り短い99のインタープリターを書くことです。最少バイトの送信が勝ちです。Tiebreakerは、最初に投稿されたサブミッションに進みます。
この質問の深さは通常よりも少し深いため、良い答えを探しているので、お気に入りの答え(必ずしも勝者とは限りません)に対して250の報奨金を授与します。
99スペック
99は必須言語です。99プログラムの各行は1つのステートメントであり、実行中、命令ポインターは先頭行から始まり、後続の各行を順番に通過して、途中で実行します。プログラムは、最後の行が実行されると終了します。Gotoステートメントは、命令ポインターのパスを再ルーティングできます。
改行、スペース、および99のプログラム9
で重要な唯一の3文字です。他のすべての文字は完全に無視されます。さらに、各行の末尾のスペースは無視され、行の複数のスペースは1つのスペースとして読み取られます。(「改行」とは、一般的な改行エンコーディングを指します。インタープリターがどちらを使用するかは関係ありません。)
したがって、このプログラム:
9 BLAH 99 9a9bb9c9
9 this line and the next have 6 trailing spaces 9
このプログラムと同じです:
9 99 9999
9 9
変数
99の変数はすべて、1つ以上9
の(9+
正規表現で)結合された名前を持っています。たとえば、9
、99
、および9999999999
すべての異なる変数です。当然、無限に多くあります(メモリの制限がなければ)。
各変数の値は、符号付きの任意精度整数です。デフォルトでは、各変数は独自の数値表現に割り当てられます。したがって、再割り当てされていない限り、変数の値は9
9番、変数の値は99
99番などとなります。明示的に割り当てられるまで、変数を単純な数字として扱うと考えることができます。
V
以下の任意の変数名を参照するために使用します。
各インスタンスV
に置き換えることができ9
、99
、999
、9999
、など
声明
99には5つの異なるステートメントタイプがあります。99プログラムの各行には、1つのステートメントのみが含まれています。
ここで説明する構文は、無関係な文字がすべて削除され、末尾のスペースがすべて削除され、複数のスペースのシーケンスがすべて単一のスペースに置き換えられていることを前提としています。
1.操作なし
空の行は何もしません。何もしません(命令ポインタをインクリメントする以外)。
2.出力
V
行の1つの変数V
は、その変数を標準出力に出力します。
のV
奇数9
(9
、999
など)がある場合、V
9 で割った整数値が(10進数で)出力されます。
場合V
の偶数有する9
S」( 99
、9999
など)をアスキーコードで文字V
9で除算し、MOD 128が印刷されます。(つまり(V / 9) % 128
、0〜127の値です。)
例:プログラム
9
9999
印刷します1W
。1
9/9が1であるため、最初の行が印刷されますW
。9999/ 9が1111であり、1111 mod 128が87であり、87がの文字コードであるため、2行目が印刷されW
ます。
出力トークン間では改行が印刷されないことに注意してください。\n
改行のために明示的に印刷する必要があります。
3.入力
V
V
行の先頭にスペースがある単一の変数は、stdinから入力を受け取り、その変数に格納します。
のV
数が奇数9
の場合、ユーザーは任意の符号付き整数を入力でき、V
その値の9倍に設定されます。
のV
数が9
の場合、ユーザーは任意のASCII文字を入力できV
、文字コードの9倍に設定されます。
例:与えられ-57
、A
入力として、このプログラム
9
9
99
99
出力されます-57A
。内部的には、変数9
の値は-513で99
、値は585です。
インタープリターは、入力が常に構文的に有効であると想定する場合があります。
4.割り当て
このステートメントは任意に長くすることができます。1行に2つ以上の変数があり、スペースで区切られています。
V1 V2 V3 V4 V5 ...
これにより、偶数インデックスのすべてのの合計から、奇数インデックスのの合計(を除く)が差し引かれます。割り当ては、参照によるものではなく、値によるものです。V1
V
V
V1
それはほとんどの言語でとして翻訳できました。V1 = V2 - V3 + V4 - V5 + ...
したがって、変数が2つしかない場合は、通常の割り当てです。
V1 V2
→ V1 = V2
3つある場合、それは減算です。
V1 V2 V3
→ V1 = V2 - V3
また、+
/ -
記号は、追加の変数ごとに切り替えを続けます。
V1 V2 V3 V4
→ V1 = V2 - V3 + V4
例:このプログラムは以下を出力します1110123
:
999 Prints triple-nine divided by nine (111).
999 9 9 Assigns triple-nine to zero (nine minus nine).
999 Prints triple-nine divided by nine (0)
9 999 9 Assigns single-nine to negative nine (zero minus nine).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (1).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (2).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (3).
5.ジャンプ(すべてゼロの場合ジャンプ)
この文は任意に長くすることもできます。これは、スペースで区切られ、先頭にスペースが付いた 1行の2つ以上の変数です。
V1 V2 V3 V4 V5 ...
それ以外の値の一部がゼロ以外の場合、これは何もしないように動作します。命令ポインタは通常どおり次の行に移動します。V1
場合、すべての値が他にあるゼロは、命令ポインタが行番号に移動されます。行はインデックスがゼロであるため、が0の場合、ポインタは一番上の行に移動します。プログラムは、負の値であるか、可能な限り最高のインデックス(行数から1を引いた値)より大きい場合、(通常、エラーなしで)終了します。V1
V1
V1
V1
ここでは9で割られていないことに注意してください。また、変数を9の倍数でない値にすることはできないため、ジャンプできるのは9の倍数である行番号だけです。V1
例:
このプログラムはを1
永久に出力します:
9 Prints single-nine divided by nine (always 1).
99 9 9 Assigns double-nine to zero.
99 99 Jumps to line zero (top line) if double-nine is zero.
このプログラム
99999999 Print G.
999 99 Set triple-nine to ninety-nine.
9999999999 9999999999 9999999999 99 99 9 9 999 999 Set 10-nine to zero.
99999999999 9999999999 Set 11-nine to zero.
999 Print triple-nine's value divided by nine. (This is the ninth line.)
99999999 Print G.
999 999 9 Subtract nine from triple-nine.
99999 999 Jump to line 5-nines if triple-nine is zero (ends program).
9 99999999999 9999999999 Jump to line nine if 10-nine and 11-nine are zero (always jumps).
で囲まれた11から1までの数字を降順に出力しますG
:
G11G10G9G8G7G6G5G4G3G2G1G
さらなる詳細
理想的なインタープリターは、99プログラムファイル名を引数としてコマンドラインから実行されます。I / Oもコマンドラインでオンザフライで実行されます。
ただし、プログラムを文字列および入力トークンのリスト(例:)として取り込むインタープリター関数を作成することもでき["-57", "A"]
ます。関数は、出力文字列を出力または返す必要があります。
これらのオプションが使用言語で不可能な場合は、インタープリターを実行してI / Oを処理する少し異なる方法で問題ありません。
おまけ:99年にクールなものを書いてください。この投稿に例として喜んで掲載します。
99回目のチャレンジを楽しんでください。:D