sed、367(ソースコードバイト)+ 532(ソースコードのマッチスティックの量)= 899
s/[^0-9a-jln-suxyz]//Ig;/^$/{s/.*/0/;b};s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/;:1;s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I;/ ;/!b1;s/;.+//;s/^/,;/;:2;s/(;[^%]*)(%+)/\2\1/;:3;s/,%{10}/%,/;s/^%/,&/;/%{10}/b3;/;.*%/b2;:4;s/,[;,]/,0,/;/,[;,]/b4;s/%{9}/9/g;s/%{8}/8/g;s/%{7}/7/g;s/%{6}/6/g;s/%{5}/5/g;s/%%%%/4/g;s/%%%/3/g;s/%%/2/g;s/%/1/g;s/[^0-9]//g
オンラインで試す
複数行バージョン:
s/[^0-9a-jln-suxyz]//Ig
/^$/{s/.*/0/;b}
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
s/;.+//
s/^/,;/
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
:4
s/,[;,]/,0,/
/,[;,]/b4
s/%{9}/9/g
s/%{8}/8/g
s/%{7}/7/g
s/%{6}/6/g
s/%{5}/5/g
s/%%%%/4/g
s/%%%/3/g
s/%%/2/g
s/%/1/g
s/[^0-9]//g
説明:
上記のスクリプトは、標準入力を1行ずつ(パターンスペースに-通常の「sed way」で)読み取り、各行について、その行のすべてのマッチスティックで表現可能な文字を表すのに必要なマッチスティックの量を出力します。入力の各行の計算は次のように行われます。
s/[^0-9a-jln-suxyz]//Ig
最初に、対応するマッチスティック表現(質問で与えられる)を持たないすべての文字をパターンスペースから削除します。つまり、「0」から「9」までの数字、「a」から「j」までの文字、「n」から「s」、「l」、「u」のいずれでもないすべての文字を削除します。 「x」、「y」または「z」。大文字と小文字は同じように扱われます。
/^$/{s/.*/0/;b}
空のパターンスペースになった場合は、0(特別なフラグを渡さない限りsedが常に行うように自動的に改行が続く)を出力し、スクリプトのすべての後行をスキップして、次の「sedサイクル」に進みます(つまり、入力の次の行を読み取り、処理する入力の行がなくなるまで最初のコマンドから処理を繰り返します。
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
そうではなく、パターンスペースが空でない場合、セミコロンで区切られた2つの「サブスペース」に分割します。 入力スペースます。入力スペースは、最初にパターンスペースから削除されなかったすべての文字によって形成されます行1の実行。次はセミコロンで、その後はマップスペースです。
マップスペースは、関連する各英数字を表すために1以外のマッチスティックがいくつ必要かを示しています。マップスペース内の英数字を表すために必要なマッチスティックの数を知りたい場合は、その文字の左側にある連続した%の最初のシーケンスを探します。答えは、%の数ですそのシーケンスに1を加えたものです。したがって、たとえば、「b」を表すのに必要なマッチスティックの数は4 + 1 = 5です。「4」を表すには、3 + 1 = 4、「y」を表すには、3 + 1 = 4。等々。
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
これはループです。入力スペースのすべての文字を%の(完全な)シーケンスで置き換えます。このシーケンスの番号は、その文字を表すために必要なマッチスティックの量を示し、そのシーケンスの後に空白文字(再び、大文字、小文字が続きます)同じ治療を与えられた)。ループを終了するかどうかを判断する基準は、パターンスペースのセミコロンのすぐ左に空白文字があるかどうかを確認することです。その条件が成立する場合、ループを終了して次の行に進みます。
s/;.+//
s/^/,;/
これらの2行は、セミコロンとその後のすべてをパターンスペースから削除し、コンマとセミコロンをパターンスペースの先頭に挿入します。これで、パターンスペースが再び2つの新しいサブスペースに分割されました。セミコロンの前のアナログ結果スペースと、その後のアナログ入力スペースです。
アナログ入力スペースは、以前は「入力スペース」と呼んでいたものですが、別の形式では、空白で区切られた%のシーケンスが含まれています。アナログ入力スペースにあるそのような%の総数は、初期入力文字列を表すのに必要なマッチスティックの数と同じです。つまり、その数が結果になります。ただし、その結果をパーセント記号のシーケンスとしてではなく、10進表記で出力する必要があります。アナログ結果空間の目的は、結果の各桁のアナログ表現を保持する一方で、アナログ入力空間で%の連続する各シーケンスを1つずつ合計することで結果を計算することです。次のループはその合計を実行します。
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
まず、ラベル2の後、セミコロンの後の次の連続した%のシーケンスをアナログ入力スペースからアナログ結果スペースのセミコロンのすぐ左に移動します。
次に、次の計算を実行するサブループ(ラベル3)に進みます。
アナログ結果スペースのコンマの後に連続する10%のシーケンスがある場合、それらの%を削除し、コンマの左側に単一の%をすぐに配置します。簡単に言えば、これは、結果の小数点以下の1つが9単位を超えていることを示しているため、その小数点から10単位を取り、次に大きい小数点に1単位を追加します。
「%」がパターンスペースの最初の文字である場合、その直前に新しいコンマを挿入します。これは、合計が、前の値よりも左側に小数点が1つ多い10進表現の値に達したことを示します。
アナログ結果スペースに10%の連続シーケンスがまだある場合は、ラベル3に戻ってこのプロセスを繰り返します。それ以外の場合は、このサブループを終了して、次の行に進みます。
ここで、アナログ入力スペース(つまり、セミコロンの後)に「%」がまだある場合、合計に追加するマッチスティックがまだあることを意味します。したがって、ラベル2に戻ります。
合計が完了すると、コードの最後のループに進みます。
:4
s/,[;,]/,0,/
/,[;,]/b4
ここでは、左側のコンマと右側のセミコロンまたはコンマのいずれかによって形成された文字のすべてのペアをチェックします。このような文字のペアはすべて、2つのコンマの内側の「0」に置き換えます。
s/%{9}/9/g
s/%{8}/8/g
s/%{7}/7/g
s/%{6}/6/g
s/%{5}/5/g
s/%%%%/4/g
s/%%%/3/g
s/%%/2/g
s/%/1/g
上記のコードは非常に単純です。アナログ結果スペースの%の連続する各シーケンスを、特定の各シーケンスの%の数に対応する10進数字文字に置き換えます。
s/[^0-9]//g
最後に、パターン空間から数字以外の文字をすべて削除します。残っているのは、使い慣れた10進表記の最終結果です。その値は標準出力に出力され、処理する入力行がさらにある場合は、次のsedサイクルが開始されます。
|_\n|_
(小文字t
)