cout << "HelloWorld" << endl; // 意外と奥深い!?
cout << "HelloWorld" << endl;
2chで見つけたのだが、HelloWorldに関して挑戦者求む!【言語指定】Restricted Words by @cielavenir cielavenir│CodeIQで下記のような出題があったようだ。
標準出力に
Hello World
と出力するプログラムを作成して下さい。ただし、数値、文字及び文字列リテラルを解答に含めることはできません。
Perlのqqやqw、Rubyの%Q、%q、%wなども避けたほうが評価が高くなります。
言語仕様をフル活用して下さい!
つまり"Hello World"
、'H'
、chr(72)
、int a = 1;
などの文字列や数値を直接使わずHello World
を出力するということだ。
シンプルな回答としては何とかして0とか1を取得し「インクリメントして数値を作り出し、char型に変換」をHelloWorld分繰り返す。
だが断る
何故なら面倒だから
ということで以下サンプル
# 厳密には"Hello World"ではなく"HelloWorld"のサンプル
マクロを使って
HelloWorld1.cpp
#include <iostream> using namespace std; int zero; #define address2str(func) #func void HelloWorld1() { // nil } int main() { cout << address2str(HelloWorld1) << endl; return zero; }
実行結果
$ ./a.out HelloWorld1
デバッグマクロを使って
HelloWorld2.cpp
#include <iostream> using namespace std; int zero; const char* HelloWorld2() { return __func__; } int main() { cout << HelloWorld2() << endl; return zero; }
実行結果
$ ./a.out HelloWorld2
typeidを使って
HelloWorld3.cpp
#include <iostream> #include <typeinfo> #include <cxxabi.h> using namespace std; int zero; class HelloWorld3 { public: char* getHelloWorld() { int status; return abi::__cxa_demangle(typeid(*this).name(), (char*)zero, (size_t*)zero, &status); } }; int main() { HelloWorld3 *hw3 = new HelloWorld3(); cout << hw3->getHelloWorld() << endl; delete hw3; return zero; }
実行結果
$ ./a.out HelloWorld3
なお普通じゃないHello World問題「Restricted Words」の解説記事 #伝説 #しえる|CodeIQ MAGAZINEには他の解法も少し紹介してあるので見てみると面白いかも
ただし、いずれも役に立たないw
役に立つとすればデバッグ時のログ出力くらいではないだろうか