Befungeは2次元の難解なプログラミング言語です。基本的な考え方は、(1文字の)コマンドが2次元グリッドに配置されるということです。制御フローはグリッド上を移動し、通過するコマンドを実行し、矢印にヒットすると方向を変更します(>^<v
)。コマンドはスタックベースです。このリストを参照してください。http://esolangs.org/wiki/Befungeも参照してください。
Befunge-98の仕様が利用可能です。
問題
Befungeプログラムをよりコンパクトな表現に変換するプログラムを作成します。たとえば、次のプログラムは印刷します0
:
> 0 v
> @ .
^ <
この場合、スペースの行を削除することにより、プログラムの動作を変更せずに圧縮できます。
>0v
>@.
^ <
より洗練された変換は、コマンドのシーケンスを回転またはミラー化し、プログラムを圧縮するために不要な制御フローコマンドを排除できます。たとえば、このプログラムでは:
>12345v
6
v....7<
.
.
.
@
プログラムの終わりを穴に押し込むかもしれません。
>12345v
>...@ 6
^....7<
最初の例では、可能な限り最もコンパクトなプログラムは
>0.@
出力プログラムで同じ結果が得られる限り、任意の変換を使用できます。
入力プログラム
入力プログラムは有効なBefunge-98プログラムです。
入力プログラムが決定論的であると仮定することができます。つまり、外部状態を読み取るコマンドは使用しません。ユーザー入力コマンド&
と~
、ランダマイザー?
、および自己修正コードコマンドp
とg
です。
入力プログラムが終了することを想定できます。
得点
これはコードゴルフではありませんが、コードゴルフを実行するプログラムを作成する問題です。
入力はテストケースのセットです(上記の入力制限を満たすBefungeプログラム)。合計スコアは、テストケースのスコアの合計です。
各テストケースのスコア
スコアは、出力プログラムの空でないセルの凸包の面積です。各セルは、4つの角がデカルト平面の格子点である正方形として扱われます。たとえば、
> v
@ <
9.5のスコアを取得します。
プログラムが特定の入力で妥当な時間とメモリで終了しない場合、スコアは入力プログラムのスコアです。(これは、プログラムが時間内に終了しない場合、入力プログラムを変更せずに出力する時間制限ラッパーを簡単に追加できるためです。)
プログラムで処理した後、テストケースプログラムの結果が異なる(または終了しない)場合、スコアは入力プログラムのスコアに100ポイントのペナルティを加えたものです。
.
出力整数を意味しますが、左上から開始する場合、スタックに出力する整数はありません。
.
整数を出力します。しかし、スタックに十分なパラメーターがない場合、befungeは代わりに十分な量のゼロがあるふりをします。したがって、2番目の例は出力されます000
。
g
そしてp
許可されていません(申し訳ありませんが、それらを忘れて、編集しました)。