読者です 読者をやめる 読者になる 読者になる

第二回超絶技巧分科会。

Quineを楽して書きたい。

Cなどの場合、自分で書く->コピペをするのはつらい。

メタプログラミングしましょう。

P124参照。

s = <<'HERE'
#include<stdio.h>
char s[1024]=@;
int main(void){
	char *p,*q;
	for(p=s;*p;p++){
		if(*p!=64)putchar(*p);
		else{
			putchar(123);
			for(q=s;*q;q++){
				printf("%d",*q);
				if(*(q+1))putchar(44);
			}
			putchar(125);
		}
	}
	return 0;
}
HERE

os = s
os = os.sub("@"){s.dump}

print os

=begin
ruby make_c_quine.rb > o.c
gcc o.c
a > o2.c
gcc o2.c
a > o3.c
diff o2.c o3.c
=end

C言語のQuineを出力するC言語のコード」を出力するRubyのコード

よい。楽。

ここで、ハタと気づく。

s = <<'HERE'
#include<stdio.h>

char bfc=0;
void tobf(char c){
	while(bfc<c){
		putchar('+');
		bfc++;
	}
	while(bfc>c){
		putchar('-');
		bfc--;
	}
	putchar('.');
}


char s[1024]=@;
int main(void){
	char *p,*q,d,b;
	for(p=s;*p;p++){
		if(*p!=64)tobf(*p);
		else{
			tobf(123);
			for(q=s;*q;q++){
				d = *q;
				if(d>=100)tobf(d/100+48);
				if(d>=10)tobf((d/10)%10+48);
				tobf(d%10+48);
				if(*(q+1))tobf(44);
			}
			tobf(125);
		}
	}
	return 0;
}
HERE

os = s
os = os.sub("@"){s.dump}

print os

=begin
ruby make_c_bf_yuine.rb > o.c
gcc o.c
a > o2.bf
inp.exe o2.bf > o3.c
gcc o3.c
a > o4.bf
diff o2.bf o4.bf
=end

C言語 <-> Brainf*ck 間で動くYuine」 を出力するRubyのコード

Yuineとは
http://shinh.skr.jp/slide/ppencode2/007.html

むしろ、BFのみでQuineを書くより楽。

ということで、「自分の好きな言語 <-> Brainf*ck 間で動くYuine」
を作ってみましょう。