BlockScript-535
{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;
BlockScriptは、このチャレンジのために特別に作成した、単純なスパゲッティスタックベースの言語です。基本インタープリターはblockscript.cです。
サンプルプログラム(最初の15個のフィボナッチ数を印刷):
{[B?B10/A!B10%d&:0}
{[B0<?'-.0B-A!:{B?Bh!{[B?B[A]A!B[B]'0+.:}!:'0.}!10.}
{[B?Dd!DC+B1-CecA!:}
0 1 15d!
;
インタープリターは、標準入力からソースコードとプログラム入力の両方をこの順序で読み取ります。つまり、インタープリター内のインタープリター内でインタープリターを実行するには、単にコピーして貼り付けます。
# Level 1
{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;
# Level 2
{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;
# Level 3
{[B?B10/A!B10%d&:0}
{[B0<?'-.0B-A!:{B?Bh!{[B?B[A]A!B[B]'0+.:}!:'0.}!10.}
{[B?Dd!DC+B1-CecA!:}
0 1 15d!
;
映画Inceptionのように、3レベルよりも深く進むことはほとんどできません。時間の問題ではなく、スペースの問題です。BlockScriptはメモリを大量にリークしますが、これは言語自体の設計方法に関係しています。
言語リファレンス:
通訳はこちら
BlockScriptでは、「スタック」はあなたが慣れているような後続の操作によって上書きされる配列ではありません。実際には不変のリンクリストとして実装され、スタックはプログラムの期間中持続します。また、(演算子を除く@
)演算子はスタックから値を削除しません。ただし、スタックの変更は、それらが発生するブロックにのみ影響します。
値の選択
a
を通して z
スタックから0〜25番目のアイテムを取得し、スタックにプッシュします。 a
スタックの先頭、または最後にプッシュされたアイテムを指します。
A
を通して Z
現在のフレームの0〜25番目のアイテムを取得し、スタックにプッシュします。
[
「フレーム」を開いて、スタックの先頭にあるスタック参照(以下を参照)からアイテムを選択します。 [
マッチングは必要ありませんが、]
フレームはレキシカルにスコープされます。BlockScriptでは、「スコープ」はブロックを形成する中括弧({
... }
)によって決定されます。したがって、ブロック内でフレームを開いても、ブロック外のコードには影響しません。
]
現在のフレームを閉じて、前のフレーム(存在する場合)に戻ります。
ブロック
{
... }
「ブロック」を作成し、スタックにプッシュします。ブロック内では、スタックはブロックの前から始まりますが、呼び出し元のスタックは一番上にプッシュされます。スタックはBlockScriptでは永続的で不変なので、ブロックはクロージャーです。イディオムの{[
手段は、次に(使用引数を選択開始するフレームを開き、ブロックを開きA
介してZ
)。ブロックの戻り値は、}
到達したときのスタックの先頭です。
例:
'3 '2 '1 {[ b. d. f. B. C. D. A! } 'D 'C 'B d!;
これは印刷され123BCD123DCB123BCD123DCB…
ます。小文字はスタック値を参照し、大文字は引数を参照します(フレームは呼び出し元のスタックに設定されているため)。 A!
呼び出し元のヘッド(呼び出されるブロックであることが保証されています)を取得して呼び出します。なぜそれがBCD
1回おきに反転するのか疑問に思っているのならB. C. D.
、ブロックが自分自身を呼び出す直前にそれらの引数を逆順にプッシュするからです。
!
ブロックを呼び出します。戻り値をスタックにプッシュします。
スタック参照
&
スタック参照を作成し、スタックにプッシュします。これを「スーパーコン」と考えてください。スタック上のすべてのアイテムを効果的に取り出し、そこから「タプル」を形成するからです。イディオム&[
こと何らかの手段a
、b
、c
と呼ばが前に今でアクセス可能なA
、B
、C
(ブロックの残りの部分またはまで]
遭遇しました)。
1 &
つには、通常必要とされるよりも多くの値をキャプチャするため、BlockScriptは設計上メモリをリークします。
@
スタック参照が指すスタックに切り替えますa
。この演算子はかなり奇妙ですが、BlockScriptのセルフインタープリターは、同じ引数を2回プッシュする必要がないように、数回使用します。効果@
(または、スタック操作)は、それが呼び出されたブロックに限定されます。また、フレームはの影響を受けない@
ため、スタックを切り替えた後に必要な値を取得するためにフレームを使用できます。
条件式
I / O
注:入力および出力はUTF-8で行われます。「文字」は、Unicodeインデックスに対応する整数です。
整数/文字リテラル
注:整数と文字は、BlockScriptで同じものです。
'c
文字cをプッシュします。
[0-9] +
10進整数をプッシュします。
算術
これらの演算子は整数値でのみ機能します。
+
計算b
+ a
(結果をプッシュしますが、どちらの値も破棄しません)。
-
計算b
- a
。
*
計算b
* a
。
/
計算b
/ a
(整数除算。負の無限大に向かって丸めます)。
%
b
%を計算しa
ます(整数モジュラス。負の無限大に向かって丸めます)。
関係演算子
これらの演算子は整数値でのみ機能します。
<
b
が未満の場合a
、1をプッシュし、そうでない場合は0をプッシュします。
>
=
その他
#
行末へのコメント
- プログラムは次で終わる必要があります
;
- 他のすべての文字は無視されます。
/usr/bin/cat
)チューリング完全性はどうですか?