MSVC 1.51でクワイン。

実行すると自分自身のソースを表示するプログラム。BASICでLISTを忍ばせておくとか、シェルスクリプトでcat $0と書いておくとかではなくて、ちゃんとCで組んだ。16ビット環境でやってみたくなったのでPCDOS+Windows 3.1でVisual C++ 1.51を使った。

quin16.cpp

extern "C" int printf(const char*, ...);

void main() {
char* s="extern %cC%c int printf(const char*, ...);void main(){ char* s=%c%s%c; printf(s, 34, 34, 34, s, 34);}";
printf(s, 34, 34, 34, s, 34);
}

コンパイルして実行すると、こういうのを吐き出す。

q2.cpp

extern "C" int printf(const char*, ...);void main(){ char* s="extern %cC%c int printf(const char*, ...);void main(){ char* s=%c%s%c; printf(s, 34, 34, 34, s, 34);}"; printf(s, 34, 34, 34, s, 34);}

これを保存してコンパイルすると同じものを表示する。

quin16-1

quin16-2

だから何だと言われても困るが、これがクワインだ!! 本当のハイライトはPCem上で日本語版のWindows3.1が高解像度のハイカラーで動いてるとこや、DOSエクステンダー仕様のコンパイラやリンカが動いたとかそういうところだったりする。ただDOSエクステンダーのエミュ上の動作はやっぱりいまいちで、コンパイルが通らないサンプルも多い。

10年くらい前にプログラミングを話題にしたチャットルームでQuineというキーワードを知らずに『自分自身のソースを表示するプログラムをCで作れるか?』と聞いたら軒並み無理って言われて、そういうもんかなとずっと思っていたが、調べると難読プログラムの一般的な課題らしい。

WikipediaのCサンプルは初見だと意味不明。でもエスケープ文字をなんとかするパターンを理解すると、どうということも無くて簡単に理解できる。こういうのは知らない人を見て楽しむクイズみたいなもんだと思った。

 

MSVC 1.51でクワイン。」への1件のフィードバック

  1. ピンバック: の回想録

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中