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

概要

最近流行の「ズンドコキヨシ問題」を、シェルワンライナーで解いてみました。

1
2
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}'

解説

分解して順番に解説していきます。

jot -r 0

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$ jot -r 3
63
67
52

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

jot -r 0 | awk '$0=$0%3'

awkのパターンで、$0に「3で割った余り(つまり、0~2)」を設定します。
パターンで代入結果が「0」になると出力されないので、結果的に「1」か「2」だけがアクションに渡されます。こんな感じ。

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

jot -r 0 | awk '$0=$0%3{zd=substr($0 zd, 0, 5);if($0==1){w="ズン”}else{w="ドコ”}print w, zd}'

「ズン」とか「ドコ」とかそういう難しいことは苦手なので、数字で考えます。

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

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}'

最後のawkで、パターンとアクションの組が二つ出てきます。

1つめ…パターンなし、アクションは「{print $1}」

$1、つまり「ズン」か「ドコ」を出力

2つめ…パターンは「/22221/」、アクションは「{print “キ・ヨ・シ!";exit}」

「21111」、つまり、過去5回が「ズン ズン ズン ズン ドコ」だった行の時だけアクションが実行されます。
アクションは「キ・ヨ・シ!」を出力して終了。

……ということで、久々のjot芸でした。