前書き
Kippleは、2003年3月にRune Bergによって発明されたスタックベースの難解なプログラミング言語です。
Kippleには、27のスタック、4つの演算子、および制御構造があります。
スタック
スタックは命名されているa
- z
と32ビット符号付き整数を含んでいます。また@
、数値の出力をより便利にするための特別なスタックがあります。数字がにプッシュされる@
と、その数字の数字のASCII値が実際にプッシュされます。(たとえば、12を@
に押した場合、49を押し、次に50を押し@
ます。)
i
プログラムが実行される前に、入力が入力スタックにプッシュされます。インタープリターは、i
実行前に保存する値を要求します。実行が終了すると、出力スタック上のすべてo
がポップされ、ASCII文字として出力されます。これはKippleの唯一のIOメカニズムであるため、Kippleプログラムとの対話は不可能です。
オペレーター
オペランドは、スタック識別子または符号付き32ビット整数のいずれかです。
プッシュ:>
または<
構文:Operand>StackIndentifier
またはStackIndentifier<Operand
Push演算子は、オペランドを左に取り、指定されたスタックにプッシュします。たとえば12>a
、値12をstackにプッシュしますa
。a>b
stackから一番上の値をポップし、stack a
にプッシュしますb
。空のスタックをポップすると常に0 a<b
が返されb>a
ます。これはと同等です。a<b>c
最上位から値ポップb
の両方にとプッシュをc
してa
。
追加: +
構文: StackIndentifier+Operand
追加演算子は、スタックの一番上の項目とオペランドの合計をスタックにプッシュします。オペランドがスタックの場合、値はそこからポップされます。たとえば、スタックの最上位の値a
が1の場合、a+2
3をプッシュします。a
が空の場合、a+2
2をプッシュします。スタックの一番上の値場合a
とb
がある1と2は、a+b
スタックから値2をポップアップ表示されますb
し、スタックに3を押しますa
。
減算: -
構文: StackIndentifier-Operand
Subtract演算子は、Add演算子とまったく同じように機能しますが、加算ではなく減算する点が異なります。
晴れ: ?
構文: StackIndentifier?
Clear演算子は、最上位のアイテムが0の場合、スタックを空にします。
インタープリターは演算子の隣にないものをすべて無視するため、次のプログラムが機能しますa+2 this will be ignored c<i
。ただし、コメントを追加する適切な方法は、#
文字を使用することです。a #
と行末文字の間のすべてのものは、実行前に削除されます。ASCII文字#10は、Kippleの行末として定義されています。
オペランドは2つの演算子で共有a>b c>b c?
できますa>b<c?
。たとえば、と書くことができます。
プログラム1>a<2 a+a
はa
、値を[1 4]
(下から上へ)含むようになり、ではありません[1 3]
。-
オペレーターも同様です。
制御構造
Kippleには、ループという制御構造が1つしかありません。
構文: (StackIndentifier code )
指定されたスタックが空でない限り、一致する括弧内のコードが繰り返されます。ループには他のループが含まれる場合があります。たとえば(a a>b)
、stackのすべての値をstackにa
移動しますb
が、順序は逆になります。機能的には同じですが、これを行うよりエレガントな方法は(a>b)
です。
例
100>@ (@>o)
これは出力されます 100
33>o 100>o 108>o 114>o 111>o 87>o 32>o 111>o 108>o 108>o 101>o 72>o
これは印刷されます"Hello World!"
。o
スタックが出力されているとき、スタックの一番上から一番下まで文字をポップし始めます。
#prime.k by Jannis Harder
u<200
#change 200
k<2>m
u-2
(u-1 u>t u>z u<t
(k>e e+0 e>r)
(e>k)
m+1
m>t
m>z
m<t
t<0>z? t?
1>g
(r>b
m+0 m>a
b+0 b>w
(a-1
b+0 b>j
j?
1>s
(j<0>s j?)
s?
(s<0 w+0 w>b s?)
a>t
a>z
t>a
b-1
b>t
b>z
t>b
z<0>t? z?
a?)
b?
1>p
(b<0 b? 0>p)
p?
(p 0>r? 0>p? 0>g)
)
g?
(g m+0 m>k 0>g?)
u?)
(k>@
10>o
(@>o)
)
これは素数ジェネレータですが、どのように機能するのかわかりません。
ルール
Kippleを解釈するプログラム/関数を作成する必要があります。このプログラム/関数は、ソースファイルを介してKippleプログラムを取得するか、STDINを介してユーザーから直接取得します。STDINが使用できない場合は、キーボード入力から取得し、特定の印刷できない文字が入力されるまで入力を取得する必要があります。たとえば、インタプリタがx86マシンコードで記述されている場合、キーボードから文字ごとにKippleプログラムを取得し、それが行われるまで続けますesc(または印刷可能な文字を出力しない他のキー)が押されるます。
構文エラーやスタックオーバーフローなどのエラーが発生した場合、何らかの方法で確認する必要があります。たとえば、0の代わりに10を返すか、インタープリター/コンパイラーによって生成されたエラーメッセージを返さなければなりません。
コードゴルフのその他の規則は、このチャレンジに適用されます。
コードは、Kippleのサンプルアーカイブのいくつかの例でテストされます
これはコードゴルフです。バイト単位の最短コードが優先されます。幸運を!
Kippleにはオプションの演算子があります"
が、これは仕様の一部ではなく、公式インタープリターの単なる追加機能です。ここでは言及していませんので、提出する際にサポートする必要はありません。
仕様の一部に疑問がある場合は、Javaで書かれた公式のインタープリターで調べることができます。これにより、コンパイルされたプログラムとソースコードを含むzipファイルがダウンロードされます。GPLの下でライセンスされています。
i
stdinからソースプログラムを取得する場合、どのように入力を要求できますか?