作者: Zazel
日時: 2002/5/09(15:34)
第3題のsed版です。

パターンスペースを区切って使うのが自分的になかなか好評だったので、
今回は同じ方法を用いスタックとして使ってます。

組合せの生成はそれほど行数を食っていませんが(実質的には4行)、
残りの足し算の部分が巨大です。ここは1回目のスクリプトを汎用化して
無関係な文字を破壊しないように変更して使ってます。その代わり
さらに遅くなりました。

使い方は echo 128 64 32 16 8 4 2 1 | sed -f dice.sed です。


-----^ dice.sed ( date:02-05-07 time:18:36:18 ) -----< cut here
s/^/=/
s/$/;/
t loop
:loop
/^[^=;]*=/!b print
s/^\([^=;]*\)= *\([0-9][0-9]*\) \([ 0-9]*\)/\1=\3;\1 \2=\3/
t loop
s/^\([^=;]*\)= *\([0-9]*\) */\1;\1 \2/

:print
/^[^0-9;][0-9]/{
    h
    s/  */ /
    s/ *;.*//
    s/^ //
    s/.*/&;&/
    b add
    :addrtn
    s/;/ : /
    p
    g
}
s/^[^;]*;//
/;/b loop
d

:add
# add.sed
#   スペースで区切られた数値(小数可、負数不可)を全部足す。
#   ただし`;'以降の文字は対象外とし破壊されない。
#   ホールドスペースは破壊されない。
#
s/^[^;]*/&=/

:addspt1
s/^/?/

t addspt2
:addspt2
s/^\([^?;]*\)? *\([0-9]*\.\)\([0-9]\)\([0-9]*\) *\([^=;]*=[^;]*\)/\1\2\4 ?\5\3/
t addspt2
s/^\([^?;]*\)? *\([0-9.][0-9.]*\) *\([^=;]*=[^;]*\)/\1\2 ?\3/
t addspt2

s/^\([^?;]*\)?/\1/
s/^[^;]*/& /
/^[^;]*\.[0-9]/b addspt1

/^[^.;]*\./{
    :addspt3
    s/^\([^.;]*\)\./\1/
    t addspt3
    s/=/=./
}

:addspt4
s/^/?/

t addspt5
:addspt5
s/^\([^?;]*\)? *\([0-9]*\)\([0-9]\) *\([^=]*=\)/\1\2 ?\4\3/
t addspt5

s/^\([^?;]*\)?/\1/
s/^[^=;]*=/& /
/^[^0-9=;]*[0-9]/b addspt4

s/ *= *//

:addcal
s/^[^ ;]/ &/

s/^\([^;]*\)00*\([0-9]\)/\1\2/
s/^\([^;]*[0-9]\)0/\1/

s/^\([^;]*\)11/\12/
s/^\([^;]*\)12/\13/
s/^\([^;]*\)13/\14/
s/^\([^;]*\)14/\15/
s/^\([^;]*\)15/\16/
s/^\([^;]*\)16/\17/
s/^\([^;]*\)17/\18/
s/^\([^;]*\)18/\19/
s/^\([^;]*\)\([ .][0-9]*\)19/\11\20/

s/^\([^;]*\)21/\13/
s/^\([^;]*\)22/\14/
s/^\([^;]*\)23/\15/
s/^\([^;]*\)24/\16/
s/^\([^;]*\)25/\17/
s/^\([^;]*\)26/\18/
s/^\([^;]*\)27/\19/
s/^\([^;]*\)\([ .][0-9]*\)28/\11\20/
s/^\([^;]*\)\([ .][0-9]*\)29/\11\21/

s/^\([^;]*\)31/\14/
s/^\([^;]*\)32/\15/
s/^\([^;]*\)33/\16/
s/^\([^;]*\)34/\17/
s/^\([^;]*\)35/\18/
s/^\([^;]*\)36/\19/
s/^\([^;]*\)\([ .][0-9]*\)37/\11\20/
s/^\([^;]*\)\([ .][0-9]*\)38/\11\21/
s/^\([^;]*\)\([ .][0-9]*\)39/\11\22/

s/^\([^;]*\)41/\15/
s/^\([^;]*\)42/\16/
s/^\([^;]*\)43/\17/
s/^\([^;]*\)44/\18/
s/^\([^;]*\)45/\19/
s/^\([^;]*\)\([ .][0-9]*\)46/\11\20/
s/^\([^;]*\)\([ .][0-9]*\)47/\11\21/
s/^\([^;]*\)\([ .][0-9]*\)48/\11\22/
s/^\([^;]*\)\([ .][0-9]*\)49/\11\23/

s/^\([^;]*\)51/\16/
s/^\([^;]*\)52/\17/
s/^\([^;]*\)53/\18/
s/^\([^;]*\)54/\19/
s/^\([^;]*\)\([ .][0-9]*\)55/\11\20/
s/^\([^;]*\)\([ .][0-9]*\)56/\11\21/
s/^\([^;]*\)\([ .][0-9]*\)57/\11\22/
s/^\([^;]*\)\([ .][0-9]*\)58/\11\23/
s/^\([^;]*\)\([ .][0-9]*\)59/\11\24/

s/^\([^;]*\)61/\17/
s/^\([^;]*\)62/\18/
s/^\([^;]*\)63/\19/
s/^\([^;]*\)\([ .][0-9]*\)64/\11\20/
s/^\([^;]*\)\([ .][0-9]*\)65/\11\21/
s/^\([^;]*\)\([ .][0-9]*\)66/\11\22/
s/^\([^;]*\)\([ .][0-9]*\)67/\11\23/
s/^\([^;]*\)\([ .][0-9]*\)68/\11\24/
s/^\([^;]*\)\([ .][0-9]*\)69/\11\25/

s/^\([^;]*\)71/\18/
s/^\([^;]*\)72/\19/
s/^\([^;]*\)\([ .][0-9]*\)73/\11\20/
s/^\([^;]*\)\([ .][0-9]*\)74/\11\21/
s/^\([^;]*\)\([ .][0-9]*\)75/\11\22/
s/^\([^;]*\)\([ .][0-9]*\)76/\11\23/
s/^\([^;]*\)\([ .][0-9]*\)77/\11\24/
s/^\([^;]*\)\([ .][0-9]*\)78/\11\25/
s/^\([^;]*\)\([ .][0-9]*\)79/\11\26/

s/^\([^;]*\)81/\19/
s/^\([^;]*\)\([ .][0-9]*\)82/\11\20/
s/^\([^;]*\)\([ .][0-9]*\)83/\11\21/
s/^\([^;]*\)\([ .][0-9]*\)84/\11\22/
s/^\([^;]*\)\([ .][0-9]*\)85/\11\23/
s/^\([^;]*\)\([ .][0-9]*\)86/\11\24/
s/^\([^;]*\)\([ .][0-9]*\)87/\11\25/
s/^\([^;]*\)\([ .][0-9]*\)88/\11\26/
s/^\([^;]*\)\([ .][0-9]*\)89/\11\27/

s/^\([^;]*\)\([ .][0-9]*\)91/\11\20/
s/^\([^;]*\)\([ .][0-9]*\)92/\11\21/
s/^\([^;]*\)\([ .][0-9]*\)93/\11\22/
s/^\([^;]*\)\([ .][0-9]*\)94/\11\23/
s/^\([^;]*\)\([ .][0-9]*\)95/\11\24/
s/^\([^;]*\)\([ .][0-9]*\)96/\11\25/
s/^\([^;]*\)\([ .][0-9]*\)97/\11\26/
s/^\([^;]*\)\([ .][0-9]*\)98/\11\27/
s/^\([^;]*\)\([ .][0-9]*\)99/\11\28/

/^[^;]*[0-9][0-9]/b addcal

:addspdl
s/^\([^;]*\)  */\1/
t addspdl

# add.sed END
b addrtn
-----$ dice.sed ( lines:173 words:245 size:3737 ) ---< cut here

(* SEKI Masatoshi  /  zazel@..."jp"         *)
(*  Would you hold my hand? Softly, let's linger. *)