第二回超絶技巧分科会。
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」
を作ってみましょう。