blogですかい

仕事、プライベートで学んだことなどを発信し、その内容がたとえ少数でも誰かの役に立ったらなら、それはとっても嬉しいなって

Restricted Words (出題者 @cielavenir 氏) 反省会 #codeiq #q431

CodeIQにて出題されていた「普通じゃないHello World」の期限が過ぎ、
問題及び解答の公開が解禁されましたので、私の解答を公開します。

課題(一部抜粋)

標準出力に
Hello World
と出力するプログラムを作成して下さい。
ただし、数値・文字・文字列リテラルを解答に含めることはできません。

CodeIQ 問題ページ
出題者 @cielavenir 氏の解答

私の回答(PHP 5.3)

<?php
class Hello {
    public function world() {
        return __CLASS__ . $this->space() . ucwords(__FUNCTION__);
    }
    private function space() {
        return chr(PHP_MINOR_VERSION . PHP_MAJOR_VERSION - PHP_MINOR_VERSION);
    }
}
$hello = new Hello;
echo $hello->world();

私の回答の解説

クラス名の入る定数__CLASS__と関数名の入る__FUNCTION__を使用して"Hello"と"World"という文字列を作成しました。
(ちなみに__METHOD__という定数も存在しますが、この定数には"ClassName::methodName()"というような値が入ります)

残す半角スペースのASCIIコードは0x20、つまり32という数値を得られれば私の勝ち・・・
運の良いことに出題者の採点環境はPHP5.3で、PHP_MINOR_VERSION(この環境では3)及びPHP_MAJOR_VERSION(この環境では5)を使用して簡単に32を作ることができました。

この解答で「評価5」をいただきました。(5点満点?)

反省点

リテラル禁止」という条件だったので定数を使用しました。
が、定数使用可だと$one = (int)TRUE;で数値が得られてしまうわけで、
それでは全く面白みがないなと今にして思ます。
定数を使用したことについて反省

こういう問題は面白くてよいですね。
また、出題者の方からフィードバックをいただけたのが嬉しかったです。