難解プログラミング言語を整える
専門INTERCALを整える。
= PLEASE の回数まで検査される1972年の言語 INTERCAL を実行して、変数のビットと NEXT スタックを追えます
INTERCAL が初めての方は、先に そもそも INTERCAL とは をどうぞ。言語の紹介は INTERCAL の図鑑ページ にもあります。
サンプル(クリックでエディタに入れる)
出力
「実行」を押すと、ここに出力が出ます。
ステップ実行
今の行・変数のビット・NEXT スタックを見る
文の一覧(強調=次に実行する文)
変数(10進と2進)
NEXT スタック(上が次の RESUME で戻る先)
出力(途中経過)
そもそも INTERCAL とは
礼儀の回数まで検査される、冗談として作られた言語。
INTERCAL(インターカル)は、1972年に Don Woods と James M. Lyon が作った言語です。正式名称は Compiler Language With No Pronounceable Acronym(発音できる略語を持たないコンパイラ言語)で、略しても INTERCAL にはなりません。既存のどの言語にも似ないことを目指して作られました。
文は DO か PLEASE で始めます。意味は同じですが、C-INTERCAL(現在も使われている実装)は PLEASE の数を数え、文の数の約5分の1より少ないと「礼儀が足りません」、約3分の1より多いと「丁寧すぎます」とエラーにします。実行を始める前の検査なので、プログラムは1文も動きません。
足し算や引き算の演算子もありません。あるのは、2つの数のビットを交互に並べる $(mingle)、ビットを選んで詰める ~(select)、となり合うビットの AND・OR・XOR だけです。「足し算」のサンプルは、これらと NEXT・RESUME の組み合わせで作っています。
goto の逆にあたる COME FROM は、のちに C-INTERCAL が加えた命令です(esolangs.org)。ラベルのついた文を実行し終えると、次の行へ進まずに COME FROM のある行へ制御が移ります。
対応している命令
| 命令 | 意味 |
|---|---|
| DO / PLEASE / PLEASE DO | 文の始まり。DO と PLEASE は同じ意味で、PLEASE の割合が検査される |
| NOT / N'T(DON'T) | 文を無効にする(ABSTAIN された状態で始まる) |
| %50 | 文を実行する確率(パーセント)。実行のたびに乱数で決まる |
| (n) | 行頭のラベル。NEXT・COME FROM・ABSTAIN の行き先になる |
| .n :n #n | 16ビット変数・32ビット変数・定数(65535まで) |
| .1 <- 式 | 代入。16ビット変数に 65535 を超える値を入れるとエラー |
| $ (mingle) | 16ビット2つを1ビットずつ交互に並べて32ビットにする |
| ~ (select) | 右の1が立つ位置の左のビットだけを集めて下に詰める |
| & V ? | 単項の AND・OR・XOR。となり合うビット同士(最上位は最下位と)で計算する |
| ' と " | グループ化。入れ子にするときは外側が ' 、その内側が " 、さらに内側が ' と交互に使う |
| (n) NEXT | (n) へ飛び、戻り先をスタックに積む(79段まで) |
| RESUME 式 | スタックから式の数だけ取り出し、最後に取り出した戻り先へ戻る |
| FORGET 式 | スタックから式の数だけ捨てる |
| COME FROM (n) | (n) の文を実行し終えたとき、次の行ではなくこの行へ来る |
| GIVE UP | プログラムを終える |
| READ OUT | 値をローマ数字で1行ずつ出す(変数・式を + でつなげて並べられる)。配列を渡すと文字として出す |
| WRITE IN | 入力欄の1行ぶんを数字の英単語(ONE TWO THREE)として読み、変数に入れる |
| ABSTAIN FROM / REINSTATE | ラベルの文、または動名詞(CALCULATING など)の種類ごとに無効にする・戻す |
| STASH / RETRIEVE | 変数の値を退避する・戻す |
| IGNORE / REMEMBER | 変数への書き込みを無視する・無視をやめる |
| ,n ;n | 1次元の配列(16ビット・32ビット)。,1 <- #13 で大きさを決め、,1 SUB #1 <- #238 で要素に入れる |
対応していないもの
- 多次元配列(BY)と、配列への WRITE IN(文字の入力)・STASH・IGNORE。
- C-INTERCAL の拡張(NEXT FROM、計算式による COME FROM、^ や @ などの演算子、マルチスレッド)。同じラベルへの COME FROM が2つあると、このページではエラーにします。
- エラー番号は PLEASE の検査(E079・E099)だけ載せています。ほかのエラーは日本語の説明と、マニュアルにある英語の文言を出します。
出力の読み方
- READ OUT は値をローマ数字で1行ずつ出します。4000 以上は文字の上に線を引いて「×1000」、100万以上は小文字で「×100万」を表します。0 は上線だけの「‾」です。
- 文字の出力は、配列に数値を入れて READ OUT する方式(Turing Text Model)です。1つ前の値との差をビット反転して文字にするので、サンプルの数値は Hello, world! のために並べてあります。
- WRITE IN は ZERO(OH)・ONE〜NINE(NINER)を空白で区切って1行に書きます。16ビット変数には 65535 まで入ります。
- 実行は1回につき最大100万文までで、それを超えると止まります。
参考資料: The INTERCAL Revised Reference Manual(mingle・select・単項演算の定義と例、READ OUT・WRITE IN の形式、NEXT スタック)、 esolangs.org: INTERCAL。 PLEASE の検査の割合(文のおよそ5分の1〜3分の1)は、C-INTERCAL の挙動として広く紹介されている目安です。正確な境目の公式の記述は確かめられず、このページはその目安で判定しています。原典の1972年のマニュアルには比率の記載がありません。
このツールについて
INTERCAL は「PLEASE と書く回数が少なすぎても多すぎてもエラー」という決まりを持つ、1972年生まれの言語です。基本の命令に対応していて、実行すると今の行・変数の中身(2進数つき)・NEXT スタックを1歩ずつ追えます。
INTERCAL を実行し、PLEASE の割合の検査と COME FROM、変数のビットと NEXT スタックをステップで確かめられます。
主な機能
- PLEASE の割合を実行前に検査(E079・E099)
- COME FROM・NEXT・RESUME・FORGET に対応
- mingle・select・単項 AND/OR/XOR を式で評価
- 変数を10進と2進で表示し、NEXT スタックを1文ずつ追える
- ローマ数字の出力と、配列による Hello, world!
よくある質問
Q. INTERCAL の PLEASE は何回書けばよいですか。
A. C-INTERCAL の実装では、文の数を n として、PLEASE で始まる文が n÷5(切り捨て)より少ないと『礼儀が足りません』(E079)、n÷3(切り捨て)より多いと『丁寧すぎます』(E099)でエラーになります。このページもその基準で検査します。原典の1972年のマニュアルには比率の記載はありません。
Q. INTERCAL に足し算の演算子はありますか。
A. ありません。あるのは2つの数のビットを交互に並べる mingle($)、ビットを選んで詰める select(~)、となり合うビットの AND・OR・XOR をとる単項演算だけです。サンプルの足し算は、これらと NEXT・RESUME を組み合わせて作っています。
Q. COME FROM とは何ですか。
A. goto の逆にあたる命令です。DO COME FROM (10) と書くと、ラベル (10) の文を実行し終えたとき、次の行へ進まずに COME FROM のある行へ制御が移ります。INTERCAL-72 にはなく、C-INTERCAL が加えました。
Q. このページで動かせない INTERCAL の機能はありますか。
A. 多次元配列(BY)、配列への WRITE IN(文字の入力)・STASH・IGNORE、NEXT FROM や計算式による COME FROM、^ や @ などの拡張演算子は未対応です。同じラベルへの COME FROM が2つあるプログラムもエラーにします。
Q. 入力した内容は外部に送られますか。
A. 送られません。プログラムも入力もブラウザの中だけで実行します。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。