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