おしらせ:今回はjotコマンドあります

### 概要 最近流行の「ズンドコキヨシ問題」を、シェルワンライナーで解いてみました。
### 解 ```sh jot -r 0 | awk '$0=$0%3{zd=substr($0 zd, 0, 5);if($0==1){w="ズン"}else{w="ドコ"}print w, zd}' | awk '{print $1}/21111/{print "キ・ヨ・シ!";exit}'
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
</div>
<div class="section">
    ### 解説
    分解して順番に解説していきます。

</div>
<div class="section">
    ### jot -r 0
    jotコマンドは、任意の個数・任意の範囲の数値を出力するコマンド(GNUのseqみたいなもん)ですが、「-r」オプションをつけると、指定した回数だけランダムな数値を出力します。<br/>
また、回数として引数に0を指定すると、無限に値が出力されます。これを組み合わせることで、ランダムな数値を無限に出し続けることができます。こんな感じ。

$ jot -r 3 63 67 52

$ jot -r 0 65 50 49 100 74 84 38 (以下、止めるまでずっと続く…)

1
2
3
4
<div class="section">
    #### jot -r 0 | awk &#39;$0=$0%3&#39;
    awkのパターンで、$0に「3で割った余り(つまり、0~2)」を設定します。<br/>
パターンで代入結果が「0」になると出力されないので、結果的に「1」か「2」だけがアクションに渡されます。こんな感じ。

$ jot -r 0 | awk '$0=$0%3' | head -5 1 1 2 2 2

1
2
3
4
5
6
7
8
9
</div>
<div class="section">
    #### jot -r 0 | awk &#39;$0=$0%3{zd=substr($0 zd, 0, 5);if($0==1){w="ズン"}else{w="ドコ"}print w, zd}&#39;
    「ズン」とか「ドコ」とかそういう難しいことは苦手なので、数字で考えます。

<ul>
<li>$1…値が1の時は「ズン」、2のときは「ドコ」を$1に出力</li>
<li>$2…過去5回分の「1」or「2」を逆順に累積(逆順になっているのはsubstrで前からカットするため)</li>
</ul>出してみるとこんな感じ。

$ jot -r 0 | awk '$0=$0%3{zd=substr($0 zd, 0, 5);if($0==1){w="ズン”}else{w="ドコ”}print w, zd}' | head -8 ドコ 2 ドコ 22 ズン 122 ドコ 2122 ドコ 22122 ドコ 22212 ドコ 22221 ドコ 22222

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
</div>
<div class="section">
    #### jot -r 0 | awk &#39;$0=$0%3{zd=substr($0 zd, 0, 5);if($0==1){w="ズン"}else{w="ドコ"}print w, zd}&#39; | awk &#39;{print $1}/21111/{print "キ・ヨ・シ!";exit}&#39;
    最後のawkで、パターンとアクションの組が二つ出てきます。

<div class="section">
    ##### 1つめ…パターンなし、アクションは「{print $1}」
    $1、つまり「ズン」か「ドコ」を出力

</div>
<div class="section">
    ##### 2つめ…パターンは「/22221/」、アクションは「{print "キ・ヨ・シ!";exit}」
    「21111」、つまり、過去5回が「ズン ズン ズン ズン ドコ」だった行の時だけアクションが実行されます。<br/>
アクションは「キ・ヨ・シ!」を出力して終了。<br/>
<br/>
……ということで、久々のjot芸でした。

</div>
</div>
</div>