- 2007-09-20 (Thu) 23:14
- プログラミング ( sed/wake/awk )
合宿のときに時間がなくて作れなかったのを思い出したので作ってみた.かなりの無駄をしているのでスコアは 38 とのこと.
; ;;; s|^|\ SSSSSS\ SSs/%yn%\ y%pS//g;h;\ s/^/S/;x;s/^\ /%P%yn/;s/^%P/\ %a%a%a%a%a%a/;:1\ ;s/%P*/%a%yn%a/;:N\ SSSSSSS/^%P/{s///;x;\ /S%y(.%y)/!{G;s/%y(.*%\ y)%yn%P.*/%y1/;s/%P%y%pS\ %yn/S/g;s/$/%p/NSSSSSSb2};\ s//%y1S/;x;b};s/^%yn/%P%P/;x\ ;s/S/%y%y%ynS/;/S$/{s/..S$/%p/\ ;b2};x;b1NSSSSS:2;s/^/;%yn;;;%yn\ s%p^%p%y%y%yn/;;:3;/%y(.*%y)%yn/!b\ 4;s//%y1%P/;s/^/S/mg;b3;:4NSSSSs/%P/\ %yn/g;s/^/SSSSSSSSS/mgp;x;s/%P*%yn%P*%\ yn//;s/$/%P/;s/%P$/%a%a%a%a%a/;:BSSS;NSS\ S/^%P%y{5%y}/{s///;bA};/^%%P%y(.*%y)/{s//%\ y1%P/;bB};/^%%s%y(.*%y)/{s//%y1%s/;bB}SS;NSS\ /^%s%y(.*%y)/{s//%y1S/;bB};/^%%%N%y(.*%y)/{s//\ %y1%N/;bB};/^%N%y(.*%y)/{s//%y1%yn/;bB};NS/^%%p%\ y(.*%y)/{s//%y1%p/;bB};/^%%y%y(.*%y)/{s//%y1%y%y/;\ bB};/^%%%%%y(.*%y)/{s//%y1%%/;bB};N/^%%a%y(.*%y)/{s/\ /%y1%y%a/;bB};/^%%i%y(.*%y)/{s//%y1/;bB};s/%y(.%y)%y(.\ *%y)/%y2%y1/;tB;:AS; | s/\n\| //g;h;s/^/ /;x;s/^/#\n/;s/^#/&&&&&&/;:1;s/#*/&\n&/;: /^#/{s///;x;/ \(.\)/!{G;s/\(.*\)\n#.*/\1/;s/#\| \n/ /g;s/$/|/ b2};s//\1 /;x;b};s/^\n/##/;x;s/ /\\\n /;/ $/{s/.. $/|/;b2};x;b1 :2;s/^/;\n;;;\ns|^|\\\n/;;:3;/\(.*\)\n/!b4;s//\1#/;s/^/ /mg;b3;:4 s/#/\n/g;s/^/ /mgp;x;s/#*\n#*\n//;s/$/#/;s/#$/&&&&&/;:B ; /^#\{5\}/{s///;bA};/^%P\(.*\)/{s//\1#/;bB};/^%s\(.*\)/{s//\1S/;bB} ; /^S\(.*\)/{s//\1 /;bB};/^%N\(.*\)/{s//\1N/;bB};/^N\(.*\)/{s//\1\n/;bB}; /^%p\(.*\)/{s//\1|/;bB};/^%y\(.*\)/{s//\1\\/;bB};/^%%\(.*\)/{s//\1%/;bB}; /^%a\(.*\)/{s//\1\&/;bB};/^%i\(.*\)/{s//\1/;bB};s/\(.\)\(.*\)/\2\1/;tB;:A ;
動かすには echo で改行だけ入れてやる必要あり.
echo | sed -f pyramid-quine.sed | diff - pyramid-quine.sed
作成メモ: 任意の文字列を改行・空白無し文字列に変換・復元するプログラムを書く.ついでに,s コマンドで特別な意味を持つ記号もエスケープしておく.ソース:expand.sed,comp.sed
次いで,エスケープされた文字列を三角に表示するプログラムを書く.ソース:formatter.sed
あとは,復元するプログラムと三角に表示するプログラムをくっつけたプログラムを作り,さらにそいつを変換して三角形に成形した文字列をそのプログラムの頭にくっつける.最後に形を微調整して出来上がり.
結構ナイーブに作ったのでいろいろと無駄が多いきがする.少なくとも,quine プログラム中では文字列が最初から三角形の形をしているので,文字列フォーマット部分を単純化することができるはず.あと,特定の文字を使わないとかいう縛りにしておくと復元部分が単純化できるはず.
- Newer: AWK - はじめ