PostScript はなぜ code golf で割と強いのか

思いついたことを並べてみる。

  • ySas さんが参加しているから
  • 動的な型無し言語だから
    • 変数宣言がいらない
  • バイナリー化
    • 文字列を内部に持つ必要がある問題でなければ、6 割くらいに縮む。
    • 225個の命令と true と false と -128 以上 127 以下の整数が 2byte、-32768 以上 32767 以下の整数が 3byte、-2147483648 以上 2147483647 以下の整数が 5byte。
    • 標準入力から呼んで標準出力に書き出す限りでは画像関係の命令は使わないけど。
    • 四則演算が 2 byte なのは有利じゃない。
    • 論理演算や bit 演算も 2 byte。and が & で済む言語よりは不利だけど and と書かなければならない言語よりは有利。
    • 同じスタック型言語の Forth と比べると、Forth やバイナリー化していない PostScript は空白が多くなる所が不利。しかしバイナリー化すると前後の空白が削れる。
  • 出力関係の命令が短い
    • 文字列出力の print (バイナリー化で 2byte)、文字列や数値を改行つきで出力する =、文字列や数値を改行なしで出力する =only (バイナリー化できない)
    • 数値に対応する ASCII 文字を出力するのはやや苦手。c が数値だとして、( )dup c 0 put print(%stdout)(w)file c write。後者は (%stdout) と (w) が文字列でバイナリー化で縮まないため、前者の方が短い。
  • 後置なので優先順位を変更するための括弧がいらない
    • 関数呼び出しの時もいらない。
      • そのかわりにスタックの順番を入れ替えたり要素を複製したりする手間が生じる
  • 値に名前を付けずにスタックに放り込んでおけばいい
    • そのかわりにスタックの順番を入れ替えたり要素を複製したりする手間が生じる
    • 変数に代入することもできるので、短い方を選べるというのは長所か。
  • ループ関係がそれなりに豊か (loop、for、repeat、forall)。C よりは豊かだと思う。
  • 配列を動的に作れる。
    • [0 1 2 3] のようにして作る。ただし、[ はただの mark で、] は mark からスタックの一番上まで要素に持つ配列を作るという命令なので、[ と ] の間で計算ができる。forall と組み合わせると楽しい。

追記: ySasさんからツッコミが入りました。 FlateDecode での圧縮は書き忘れていました。ループに関しては、C 使いが repeat と forall に感動している状況なのでこんな書き方をしてしまいましたが、冷静になってみると、繰り返し回数が最初に決まるループが 3 種、最初に決まらないループが無条件ループ*1の loop 1 種で明らかに偏ってます。なぜでしょうか。無限ループを起こしてしまったときに原因を探しやすくするため?。あと文字列が苦手というのもそうですね。配列は特定の操作だけ得意という感じでしょうか。

*1:正しい用語かわからない