Stackylogicは、私がそのテイクアップ作られたロジックベースのプログラミング言語である0
のと1
、入力用のを単一出力0
または1
上に完了したことを。
Stackylogicプログラムは、3文字01?
だけでなく<
、1行の最後に1 文字だけを含むことができる行で構成されます。行は空ではないかもしれないとして行が<
少なくとも一つ持っている必要があります0
、1
または?
それ以前に。
これは(説明しますが)2ビットのNANDを計算するサンプルプログラムです。
1
?<
11
?
0
Stackylogicプログラムのすべての行はスタックと見なされ、下が左、上が右になります。暗黙的に、プログラムの最初の行の前と最後の行の後に空のスタック(空の行)があります。
<
我々は呼んでよこれ、カーソルを Stackylogicプログラムが実行されたときに起動するマークスタック。Stackylogicプログラムの実行は次のように進行します。
カーソルが現在指しているスタックから一番上の文字をポップします。
- キャラクターがの場合、
?
ユーザーに0
またはのプロンプトを表示し、それがキャラクターであるかのよう1
に振る舞います。 - 文字がの場合、
0
カーソルを1スタック上に(現在の行の上の行に)移動します。 - 文字がの場合、
1
カーソルを1スタック下に(現在の行の下の行に)移動します。
- キャラクターがの場合、
カーソルの移動先のスタックが空の場合、スタックからポップされた最後の値(常にa
0
または1
)を出力し、プログラムを終了します。それ以外の場合、カーソルの移動先のスタックが空でない場合は、手順1に戻ってプロセスを繰り返します。
Stackylogicプログラムは常にスタックを使い果たすため、常に終了することに注意してください。
NANDの例
NANDプログラムでは、カーソルは次の位置から始まります?
。
1
?<
11
?
0
私たちは、入力、ユーザーを仮定します1
一度?
カーソルがこのようなプログラムを見て作り、下に移動することを意味している、ポップされます。
1
11<
?
0
これ1
で、カーソルスタックの最上部にプレーンが表示されます。適切にポップされ、カーソルが再び移動します。
1
1
?<
0
今、ユーザ入力仮定0
のための?
カーソルが上に移動することを意味し、:
1
1<
0
再び、a 1
がカーソルスタック上にあるため、カーソルがポップして下に移動します。
1
<
0
最後に、カーソルスタックは空なので、最後にポップされた値が1
出力され、プログラムが終了します。
であるため、これはNANDゲートに対して正確1 NAND 0
です1
。もちろん、これは他の3つの2ビット入力でも確認できます。
または例
このStackylogicプログラムはORゲートをシミュレートします。
?
?<
の最初の入力により1
、カーソルが最後の行の下にある暗黙の空のスタックにプッシュされ、プログラムが終了し、1
入力されたばかりの出力が出力されることが簡単にわかります。
00
一方、入力の場合、カーソルは最上部の暗黙的な空のスタックに移動し、プログラムを終了し、0
入力する最後のスタックを出力します。
チャレンジ
Stackylogicプログラムを文字列として取り込んで実行するプログラムまたは関数を作成し、結果の0
orを出力または返し1
ます。
際?
の、あなたがのためにユーザーに促すことができる0
か、1
入力、またはのプリセット文字列から値を読み取る0
さんと1
あなたはまた、入力として取ることの。(これは、プログラム/関数への別の文字列入力であるか、プログラム文字列の最初または最後の行が入力ストリームであると仮定することができます)。
プログラムと入力が常に適切な形式であると想定できます。オプションで、入力プログラムに単一の末尾改行が付いていると想定することもできます(ただし、末尾には常に暗黙的な空のスタックがあることに注意してください)。
バイト単位の最短コードが優先されます。
その他のサンプルプログラム
ZERO
0<
ONE
1<
BUFFER
?<
NOT
1
?<
0
AND
?<
?
NAND
1
?<
11
?
0
OR
?
?<
NOR
1
?
00
?<
0
XOR(v1)
?
0
1?<
?
0
XOR(v2)
?
?<
11
?
0
XNOR(v1)
1
?
0?<
1
?
XNOR(v2)
1
?
00
?<
?
MEDIAN(v1)
1
???<
0
MEDIAN(v2)
?
1?<
??
1\???<\0
。
111\???????<\000
です。
?\1?<\??
。また、ここでは対称5行の実装です:?\?0\?<\?1\?