\当サイトではリンク広告を利用しています。/
クワインとは、プログラミングにおいて自分自身を出力するコードのことです。ここでは、各言語でのクワインを10言語、一覧で表記していきます。
また、すぐに実行する方法も解説していきます。
クワイン(Quine)とは、自分自身のソースコードを出力するプログラムのことです。
つまり、実行すると自分のプログラムそのものが表示される、ちょっと不思議で面白いコードです。
コーディングの技術を使った遊びの一つでもあります。
プログラミング言語の仕組みや文字列処理の理解にも役立ちます。
クワインは各言語の開発環境がなくても、ブラウザだけですぐに試すことができます。
paiza.ioなど、ブラウザ上で様々なコーディングができるツールで実行して試すことができます。
やり方は、各言語のコードをそのまま貼り付けて、実行ボタンを押すだけです。
ブラウザ上で動かせるので、すぐに確認可能です。
上図はPythonのクワインを実行してみた実例です。ソースコードがそのまま出力されているのがわかります。
ここでは代表的な5言語に加えて、様々な言語でのクワイン例を紹介します。
基本的な構造は、文字列を変数に入れ、それを呼び出すことで自己出力を実現しています。
#include <stdio.h>
char *s = "#include <stdio.h>%cchar *s=%c%s%c;%cint main(){printf(s,10,34,s,34,10);return 0;}";
int main() {
printf(s,10,34,s,34,10);
return 0;
} 解説
s に自分のコードを文字列として格納printf で %s として表示10、ダブルクオート 34)を使って構文を維持s='s=%r\nprint(s%%s)'
print(s%s) 解説
%r を使って文字列をエスケープ付きで出力s % s で文字列自身を出力public class Quine {
public static void main(String[] args) {
String s = "public class Quine {%n public static void main(String[] args) {%n String s = %c%s%c;%n System.out.printf(s,10,34,s,34);%n }%n}";
System.out.printf(s,10,34,s,34);
}
} 解説
System.out.printf で書式付き出力%n とダブルクオート %c を組み合わせて文字列を出力<!DOCTYPE html>
<html>
<body>
<script>
var s = '<script>var s=%s;document.write(s.replace(/%s/,JSON.stringify(s)))<\/script>';
document.write(s.replace(/%s/,JSON.stringify(s)))
</script>
</body>
</html> 解説
JSON.stringify で特殊文字をエスケープdocument.write でHTML上に表示s='s=%p;puts s%%s';puts s%s 解説
%p でエスケープ済み文字列を出力s % s で自分自身を表示s="s=%o;console.log(s,s)";console.log(s,s) 解説
%o でオブジェクト(文字列)を出力console.log(s,s) で自己出力<?php
$s='<?php $s=%s; printf($s, var_export($s,true)); ?>';
printf($s, var_export($s,true));
?> 解説
var_export で文字列をエスケープして表示printf で自己出力$_='$_=%q|%s|;printf $_,$_';printf $_,$_ 解説
%q|…| で文字列リテラル化printf で文字列自身を出力package main
import "fmt"
func main() {
s:="package main\nimport \"fmt\"\nfunc main() {\n\ts:=%q\n\tfmt.Printf(s,s)\n}"
fmt.Printf(s,s)
} 解説
%q でGo用文字列としてエスケープfmt.Printf で出力let s = "let s = %c%@%c\nprint(String(format: s, 34, s, 34))"
print(String(format: s, 34, s, 34)) 解説
%@ で文字列を挿入String(format:) で自己出力ほとんどの言語で、基本構造は次の通りです:
これにより、実行すると自分のコードそのものが表示されるという現象が起こります。
ぜひ、上記の10言語の例を実際に試して、自分のクワインを作ってみましょう!
プログラミングの奥深さを感じられる楽しいチャレンジです。