同じアルファベットを二度使わないで Hello, world を出力する PostScript プログラム

普通に書いたら

(Hel\154o, w\157r\154d!)=

なのでしょうけど、これではつまらないのでもう少し工夫してみました。

(!
)54903217(, )29234652 6{{致}張{36(     )cvrs}探}茶

Shift_JIS で保存してからお近くの Ghostscript に読ませると、標準出力に大文字で「HELLO, WORLD!」と出力するはずです。バイナリトークエンコードは卑怯だとか「致」の 2 バイト目は v だから v が 2 回使われているじゃないかとか言う子はうちの子じゃありません。
このままでは何をやっているかわかりませんので、バイナリトークエンコードを元に戻すとこうなります。

(!
)54903217(, )29234652 6{{print}stopped{36(     )cvrs}if}repeat

もう少し解説。

  • 丸括弧に囲まれた部分は文字列。中に改行が有ってもよい。スタックに積まれる。
  • 54903217、29234652 は 36 進数で書くと WORLD、HELLO になる数。スタックに積まれる。
  • 6{...}repeat は中括弧内を 6 回繰り返す
  • {...}stopped は中括弧の中身を実行し、エラーが起きるか stop が実行されたら true を、正常に終わったら false をスタックに積む。
  • print はスタックのトップを取り出し、それが文字列であれば標準出力に出力する。文字列でなかったら取り出したものをスタックに戻してエラー。
  • bool{...}if は bool が true なら中括弧の中身を実行し、false なら実行しない。
  • 36( )cvrs はスタックトップの数を 36 進数で表した文字列に変換しスタックに積む。

なので、文字列 "!\n" から 29234652 までが順にスタックに積まれた後、6 回の繰り返しの部分で

  1. 29234652 を print しようとしてエラー、cvrs で文字列 "HELLO" に変換
  2. "HELLO" を出力。エラーじゃないので if の前の中括弧は実行されない
  3. ", " を出力。エラーじゃないので if の前の中括弧は実行されない
  4. 54903217 を print しようとしてエラー、cvrs で文字列 "WORLD" に変換
  5. "WORLD" を出力。エラーじゃないので if の前の中括弧は実行されない
  6. "!\n" を出力。エラーじゃないので if の前の中括弧は実行されない

ということが行われます。