【問題】配列{"ドド","スコ"}からランダムに要素を標準出力し続け、『その並びが「ドドスコスコスコ」を3回繰り返したもの』に一致したときに「ラブ注入♡」と標準出力して終了するプログラムを作成せよ(配点:5点) https://twitter.com/Sheeeeepla/status/1554028833942441984
while true;do echo $((RANDOM%2));done | gsed ':loop;N;s/\n//;/\(0111\)\{3\}$/{s/$/ラブ注入♡/;t end;};$!b loop;:end;s/0/ドド/g;s/1/スコ/g;q'
上記は GNU sedでないと動かない。
下記、sedスクリプトにすれば、while ... | sed -f ddsc.sed で動く
#!/usr/bin/env sed -f
:loop
N
s/\n//
/\(0111\)\{3\}$/ {
    s/$/ラブ注入♡/ ; t end
}
$!b loop
:end
s/0/ドド/g
s/1/スコ/g
q
詳細
sedでランダム値を得るのは無理そうなので、そこはシェルの $RANDOM を使用し、2で除算した余りの 0 or 1 を出力させる
- :loopでラベルを定義
- Nで次行をパターンスペースへ追記
- s/\n//で改行を除去。0,1の羅列が形成される。
- /\(0111\)\{3\}$/- 0を「ドド」 1を「スコ」として、「ドドスコスコスコ」が3回繰り返されたら
- 最後に「ラブ注入♡」を追記
- endラベルへジャンプ
 
- $!b loopで最終行でなければ、- loopラベルへジャンプ- Nとの組み合わせで最終行までパターンスペースへ追記し続けるループができる
 
- :endでラベル定義
- s/0/ドド/g,- s/1/スコ/gで置換
- qスクリプト終了