2013年9月19日木曜日

Hello world maniacs !

CodeIQ の @cielavenir さんからの言語指定の問題「Restricted Words - 出力したい値をどうやって手に入れるか?」に挑戦しました。

問題は
標準出力に
Hello World
と出力するプログラムを作成して下さい。

ただし、数値、文字及び文字列リテラルを解答に含めることはできません。
Perlのqqやqw、Rubyの%Q、%q、%wなども避けたほうが評価が高くなります。
言語仕様をフル活用して下さい!
というものです。
ここで注目したいのが!!
プログラミング言語は
AppleScript(osascript)/C/C++/C#/Clojure/D/Erlang/Fortran/Go/Groovy/Haskell/
Hello Algorithm/HSP/Java/JavaScript(Node.js)/Kuin/Lisp/Lua/OCaml/Pascal/
Perl/PHP/Pike/Python/R/Ruby/Scala/Scheme/Smalltalk/VB.Net
のいずれかを使用して下さい。指定された言語以外での解答は評価されません。

Pascal キター!!!!!
いままで CodeIQ では Pascal / Delphi は全く相手にされてなかったのに!!
ということで、軽く挑戦してみることにしました。

すぐに思いついた方法は3通り

  1. brainf*ck のようなチューリングマシン的な方法
  2. リフレクションを使ってクラスやメソッド名から抽出する方法
  3. 文字コードを列挙型で表す方法

このうち、1の方法は簡単すぎてつまらないので却下。
2の方法もあくまで言語指定が Pascal なので却下。
ということで、3の方法で行くことにしました。

ここで面倒だったのが言語指定が Pascal であること。
Pure Pascal では type とか var といったブロックは位置が決まっているし、Program には input / output を付けないといけないとか、const 指定子が使えないとか色々あります。
ということで、1回 Delphi でコンパイルした後 gpc 使ってコンパイルを試しました……ところが!!
gpc は最早 Pure Pascal ではなく Borland 拡張……つまり Delphi の文法が多分に採り入れられていたのです!!
すごいすんなりコンパイルされちゃう!! \(^o^)/
といっても、これが ISO 標準であり、これこそが Pure Pascal なのかなあなんて思ったりもしたのですが、 Pure Pascal は初版の物だろう!!ファースト以外は認めない!!……ということで、僕の頭の中にある Pure Pascal 文法で書きました。
それが以下になります。

program HelloWorld(Output);
 
type
THex = (
hx00, hx01, hx02, hx03, hx04, hx05, hx06, hx07,
hx08, hx09, hx0a, hx0b, hx0c, hx0d, hx0e, hx0f,
hxCount
);
 
procedure WriteChar(h, l: THex);
begin
Write(Chr(Ord(h) * Ord(hxCount) + Ord(l)));
end;
 
begin
WriteChar(hx04, hx08); // H
WriteChar(hx06, hx05); // e
WriteChar(hx06, hx0c); // l
WriteChar(hx06, hx0c); // l
WriteChar(hx06, hx0f); // o
WriteChar(hx02, hx00); //
WriteChar(hx05, hx07); // W
WriteChar(hx06, hx0f); // o
WriteChar(hx07, hx02); // r
WriteChar(hx06, hx0c); // l
WriteChar(hx06, hx04); // d
end.

まあ、どっちにせよ、あんまり面白くはならなかったのですが……。
特筆すべき事は何もないです。
ちょっと悔やまれるのは、hxCount なんてのをつくったところ。
そうじゃなくて、shl Ord(hx04) ってすれば良かった。

出題者の @cielavenir さんのコードはこちら
その他の言語は一個上に。

1 を取得してから、それを使って他の数を取得、という方法のようですね。
それで、ちょっと疑問なのが、Delphi や gpc ではコンパイル通るんだけど、Integer を Char にキャストして値を得ていること。
Pure Pascal だと、これできないんじゃなかったかなあ……そのための Chr 関数な訳だし……。
C 系で言うところの 1byte を表す型は Byte っていう型があるんですよ-。
2013/09/19 13:10 追記
cielavenir さんに修正していただきました!

後日、解説記事がアップされるそうなので、解説記事がアップされたら、ここに追記します!