No Such Blog or Diary
Pyramid-Quine@sed その3
- 2007-09-21 (Fri)
- プログラミング ( sed/wake/awk )
エスケープの仕方を変えてみたら小さくなった.スコア 17 .
;
;;;
s|^|\
DDDh;s\
/[BnD]//\
g;y/bcde/B\
BBnDE/CDDx;s\
/$/BB/mg;s/^/;\
Bn;;;BnsE^E/CD:;\
s/^[^DBn]*BnB(DB+B\
)/DB1B0/m;tCs/.$/E/p\
;x;s/[`-Bx66]/BUB0/gDD\
DD; |
h;s/[\n ]//g;y/BCDE/\\\n |/
x;s/$/\\/mg;s/^/;\n;;;\ns|^|/
:;s/^[^ \n]*\n\( \+\)/ \1\0/m;t
s/.$/|/p;x;s/[`-\x66]/\U\0/g ;
真中に空白があるのでまだ小さくなりそう.
- Comments: 0
- TrackBack (Close): -
Pyramid-Quine@sed その2
- 2007-09-21 (Fri)
- プログラミング ( sed/wake/awk )
無駄を省いて小さくしてみた.スコア 19 .
;
;;;
s|^|\
QQh;s/\
$/YY/mg;\
s/^/;Yn;;;\
YnsP^P/NQSs/\
Y([^Yn]*YnY)Y(\
SY+Y)/SY2Y1Y2/;N\
Qs//SY2Y1Y2/;s//SY\
2Y1Y2/;s/.$/P/p;NSx;\
s/YnYPS//g;s/Yx59/YY/g\
;s/Yx53/S/gNs/Yx4E/Yn/g;\
s/Yx50/P/g;s/Yx51/Q/gQ; |
h;s/$/\\/mg;s/^/;\n;;;\ns|^|/
s/\([^\n]*\n\)\( \+\)/ \2\1\2/;
s// \2\1\2/;s// \2\1\2/;s/.$/|/p;
x;s/\n\| //g;s/\x59/\\/g;s/\x53/ /g
s/\x4E/\n/g;s/\x50/|/g;s/\x51/ /g ;
ソース:pyramid-quine.19.sed 動かすには echo で改行だけ入れてやる必要あり.
echo | sed -f pyramid-quine.19.sed | diff - pyramid-quine.19.sed
- Comments: 0
- TrackBack (Close): -
Pyramid-Quine@sed
- 2007-09-20 (Thu)
- プログラミング ( 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 プログラム中では文字列が最初から三角形の形をしているので,文字列フォーマット部分を単純化することができるはず.あと,特定の文字を使わないとかいう縛りにしておくと復元部分が単純化できるはず.
- Comments: 0
- TrackBack (Close): -
ひさびさにあなごる
- 2007-08-14 (Tue)
- プログラミング ( sed/wake/awk )
print file と Look and say とをやってみた.print file の方は exec 禁止って書いてないから外部コマンドを e オプションで呼ぶ.チートといえばチートな気もするけど… 無駄がないので気にしない.Look and say は入力に 1~3 の3つ以下の連続しかないので以降も性質が保たれる.それを使って楽をすれば sed でも簡単なプログラムが書ける.任意の連続に対応したものなんて書くのが面倒なので無視しとこう.
- Comments: 0
- TrackBack (Close): -
あなごる Sierpinski Fractal@sed
- 2007-05-18 (Fri)
- プログラミング ( sed/wake/awk )
最初 214B だったものを縮めて現在 178B.同じ演算を繰り返すだけなのでsedで書けないことはないと思って書いたけど思いのほかうまく縮まってくれないコードになってしまった.埋め込んだほうが短かったりするのかなぁ?
- Comments: 0
- TrackBack (Close): -
久々にあなごる
- 2007-05-11 (Fri)
- プログラミング ( sed/wake/awk )
一ヶ月ほどあまりチェックしてなかったけど問題がいくつか増えているらしい.で,数日前に Rule 30 というのを毎度のごとく sed で書いてみたら一時間たたぬうちに shinh さんに10B以上差をつけられ… ちょっとあきらめモード.が,とりあえず時間ができたので試しに書き直してみたら 58B まで縮まった.やっぱり処理の手順をちゃんと考えて無駄な処理省かないとだめだなぁ.さて,もう少し頭をひねってみやう.
- Comments: 0
- TrackBack (Close): -