Codepad(http://codepad.org/)を使って
「自分自身を出力するプログラム」を作ってみて下さい。
つまり、ソースと出力結果が同じになるプログラムです。
言語はCodepadで使用可能な言語であればどれでも構いません。
とりあえず完成速度第一に考えたのでひねりなくてすいません
@a=<DATA>; print @a; print "__DATA__\n"; print @a; __DATA__ @a=<DATA>; print @a; print "__DATA__\n"; print @a;
ちょっと変化球。Schemeだけど処理系依存あり: http://codepad.org/V2GaSgfk
Gaucheでは上のを走らせると出力が止まらないので注意。かわりにこれを: #0=(write/ss '#0#)
ありがとうございます。
いろいろな言語が出てきて嬉しいです。
perlで書いてみました。
($0で自身のファイル名を取得)
#!/usr/bin/perl use strict; use warnings; open(FILE,"<$0"); while(my $line = <FILE>){ chomp $line; print $line."\n"; } exit;
ありがとうございます。
Codepadで動くのかなと思って試してみたらちゃんと動きました。
サーバー上でのファイル名を取得するんですね。
// もしも引数が指定できるならそこに吐き出します
// 引数なしならそこに標準出力で出力します
#include <stdio.h>
int main(int argc, char *argv[])
{
char buf[4096];
FILE *rfd = fopen(__FILE__,"r");
FILE *wfd;
if( argc == 2 ) {
wfd = fopen( argv[1], "w" );
if( !wfd )
{
printf("Error! %s cannot output path\n", argv[1] );
return 1;
}
} else {
wfd = stdout;
}
while( fgets(buf,sizeof(buf),rfd ) ) {
fprintf(wfd,"%s",buf);
}
fclose(wfd);
fclose(rfd);
}
ありがとうございます。
c言語版ですね。
Pythonでかいてみました。
ソース:
import os
path = os.path.abspath(__file__)
for line in open(path):
print line
ありがとうございます。
ファイルをソースにする方が多いですね。
先のはほとんど検索依存だったので、こちらが自作回答です。
>|c|
#include<stdio.h>
void main(){
char*s="\\\n\""
"#include<stdio.h>%cvoid main(){%cchar*s=%c%c%c%cn%c%c%c%s%c;%cprintf(s+3,s[1],s[1],s[2],*s,*s,*s,*s,s[2],s[2],s+1,s[2],s[1],s[1]);%c}";
printf(s+3,s[1],s[1],s[2],*s,*s,*s,*s,s[2],s[2],s+1,s[2],s[1],s[1]);
}
||<
仕組みはやはりほとんど一緒になってしまうので、目新しくはないですが、
だいたい1行のものが多かったので、改行を入れる部分を工夫してみました。
この次の段階となると、Wiki の C サンプルのように解析型になってしまいそうです。
http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AF%E3%82%A4%E3%83%B...
ありがとうございます。
これはまた複雑になりましたね。
Mookさんのと方針は同じです。何をやってるか分かるようにしてみました。
不完全性定理の証明のときにこういうの使いますね。
#define p(c) putchar(c) void pr(char *x, int f) { char *y; for(y=x;*y;y++) { if(!f){p(*y);continue;} if(*y==0x58) {p(34);pr(x,0);p(34);} else if(*y==0x40)p(10); else p(*y); } } char *this="#define p(c) putchar(c)@void pr(char *x, int f)@{@ char *y;@ for(y=x;*y;y++)@ {@ if(!f){p(*y);continue;}@ if(*y==0x58) {p(34);pr(x,0);p(34);}@ else if(*y==0x40)p(10);@ else p(*y);@ }@}@char *this=X;@@void main(){pr(this,1);}@"; void main(){pr(this,1);}
ありがとうございます。
[C]
#include<stdio.h> char a[] = "#include<stdio.h>%cchar a[] = %c%s%c;int main(void){printf(a, 10, 34, a, 34, 10);return 0;}%c";int main(void){printf(a, 10, 34, a, 34, 10);return 0;}
[Perl]
my @a = ();@a = qw(print 'my @a = ();@a = '."qw(@a); @a;"); print 'my @a = ();@a = '."qw(@a); @a;";
インチキ回答ですので、ポイントは不要です。
下記のオリジナルは int でしたが、それではこのサイトではエラーが出るのでエラーが出ないように変更しました。
void main() { char *s = "void main() { char *s = %c%s%c; printf(s, 34, s, 34); }"; printf(s, 34, s, 34); }
頑張ってオリジナルを作って見ようとしましたが、断念。フェイクです。
function quine() { s = "function quine() { s = %c%s%c; printf(s, 34, s, 34); }"; printf(s, 34, s, 34); }
えーい、ここまでくればとことん。
以下、いろいろな言語のバージョンです。
#!/usr/bin/python s = "#!/usr/bin/python%cs = %c%s%c%cprint s %% (10, 34, s, 34, 10)" print s % (10, 34, s, 34, 10)
int main() { char s[] = "int main() { char s[] = %c%s%c; printf(s, 34, s, 34); }"; printf(s, 34, s, 34); }
出典:http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AF%E3%82%A4%E3%83%B...
int main() { char *s = "int main() { char *s = %c%s%c; printf(s, 34, s, 34); } return 0;"; printf(s, 34, s, 34); return 0;}
以下自分では書けなかったので、検索で探したものです。
main = putStr (s ++ [';',' ','s',' ','=',' '] ++ show s); s = "main = putStr (s ++ [';',' ','s',' ','=',' '] ++ show s)"
出典:http://www.iis.sinica.edu.tw/~scm/2007/a-haskell-quine/
s=[[io.write('s=[','[',s,']','];',s)]];io.write('s=[','[',s,']','];',s)
出典:http://lua-users.org/lists/lua-l/2008-05/msg00364.html
#! /usr/bin/env tclsh proc Quine {} { puts {#! /usr/bin/env tclsh} puts {} puts -nonewline "proc Quine {} {" puts -nonewline [info body Quine] puts "}" puts "" puts "Quine" } Quine
なんてのをいろいろ探したり考えているうちにこんなのを見つけました。
http://d.hatena.ne.jp/ku-ma-me/20090916/p1
これはこのプログラム自身を出力する Unlambda プログラム、を出力する Whitespace プログラム、 を出力する brainfuck プログラム、を出力する Java プログラム、を出力する C プログラム、 を出力する Haskell プログラム、を出力する OCaml プログラム、を出力する Lua プログラム、 を出力する Perl プログラム、を出力する Python プログラム、を出力する Ruby プログラム、です。
だそうです。
残念ながら Codepad では動きませんでしたが、脱帽です。
現在自作回答作成中ですが、締め切りまでに間に合うかな・・・。
ありがとうございます。
言語はPerlですね。