【問題】配列{"ドド","スコ"}からランダムに要素を標準出力し続け、『その並びが「ドドスコスコスコ」を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 を出力させる

  1. :loop でラベルを定義
  2. N で次行をパターンスペースへ追記
  3. s/\n// で改行を除去。0,1の羅列が形成される。
  4. /\(0111\)\{3\}$/
    • 0を「ドド」 1を「スコ」として、「ドドスコスコスコ」が3回繰り返されたら
    • 最後に「ラブ注入♡」を追記
    • end ラベルへジャンプ
  5. $!b loop で最終行でなければ、loopラベルへジャンプ
    • Nとの組み合わせで最終行までパターンスペースへ追記し続けるループができる
  6. :end でラベル定義
  7. s/0/ドド/g, s/1/スコ/g で置換
  8. q スクリプト終了