ゴルフ的観点からプログラミング言語を比べて思ったことを並べてみた。

比較対象が偏っているのは仕様です。しょうがないことなのです。

C

  • Cというか、C の親族の言語なのだが、条件分岐演算子が強力な気がする
    • ループを一つにまとめるて短くするなんていうのは、条件分岐演算子があればこその技だと思う
    • それでも使い過ぎはよろしくないのだけど
  • 私の中での基準点なのであまり言うことが無い

PostScript

  • id:yshl:20070910 でも書いたような事だけど。
  • やっぱりバイナリートークエンコードが強い。
  • 意外と if のコストが大きい。
    • {}が必須なのと、真偽値に整数や null が使えないためかな。
    • C の条件分岐のコストが小さすぎるという気もする。
  • printf 的なものが無くて時々困る。
  • 浮動小数点数が単精度なせいで、一部の計算結果だけ埋め込みが必要になると悲しい。
  • 多倍長整数がない。
    • C なら力づくで計算できても PostScript だと実行時間が問題になる。

D

  • 私が解くと、つい C を翻訳した感じのコードになってしまう。RubyJavascript に慣れている人だとどうなるのだろう。
  • C に比べて型を真面目に扱わなければならない。
    • 条件分岐演算子 ?: で真の場合と偽の場合の型を合わせなければならないとか。
    • 関数定義も長くなってしまう。その結果 anarchy golf - Tak z _FIXED_ のような事が起こる。
    • C より、ポインタが使いにくい。int[10]a;int*p; の時 p=a; とできない。p=&*a; などとなる。
    • まあ、anarchy golf - ieee754 のように、C の関数という抜け道もありますが。
  • 標準入力から読むだけでも import が要るのが不利。
  • 配列の演算や文字列の連結が多用されると C に勝つ可能性がある。
  • import 無しで printf を使えるバージョンでは、多倍長整数の演算にバグがあるとか、ぬか喜びだ。

Erlang

  • module と export のせいで、単純な問題で非常に不利。
  • ループはなるべくリスト内包表記で。
  • 比較演算子が数値でも配列でも atom でも比較できるというのは結構重要。
  • 条件分岐を if でやるか、case でやるか、短絡演算子(andalso, orelse)でやるか、関数のパターンマッチでやるか迷いどころ。
    • if は条件部分の制限のせいで使いづらい印象がある。
  • ゴルフだとプロセス使わないんだよな……。
  • クロージャもなかなか使いどころが見つからない。
  • なんでリストの差分演算子 -- が 右結合なの?
  • 整数の除算演算子が div(/ で割ると浮動小数点数になる)で剰余演算子が rem。OcamlFortran なら N mod M=0 を N/M*M=N とするテクニックがあるのだけど、Erlang では意味がない。
  • 出力する分にはフォーマット出力 io:format はいろいろできる。
  • でも、フォーマット入力 io:fread で浮動小数点数を読もうとして、io:fread('',"~f") とすると、整数が来たときにエラーになるのはいかがなものか。
  • 今回挙げた中で、まともに多倍長整数が扱えるのはこれだけ。でも冪乗演算子が無い。

Forth

  • 空白が多くなるのがつらい。
  • ループが C と同じくらい単純なのしかない。
  • ポインタを数値として扱えたり、読んだ文字列のバイト列を数値として扱えたりと C 並に低レベルな真似ができる。
  • フォーマット入出力がないのがやっぱり困る。
  • 配列をバリバリ使う系の問題を解いてないので、その辺りはよくわからない。

m4

  • 入力文字列に ( や ) や , が含まれていると解ける気がしなくなる。
  • ついマクロの再帰呼び出しでいろいろと処理してしまうのだけど、正規表現を使いこなせれば違った世界が見えてくるのかもしれない。
    • 私の脳内では D compile time に近い場所にある。
  • 浮動小数点数が扱えない。
    • m4 ならしょうがないという気もする。