1. Qiita
  2. 投稿
  3. 2016-03-14

ズンドコキヨシ、UNIX系 コマンド・パイプ

  • 0
    いいね
  • 2
    コメント

    ズンドコキヨシ」とゆうのが流行ってるらしいので、シェルでやってみた。シェルって言ってもシェルスクリプトの機能は一切使ってなくて、単にコマンドをパイプしただけ。

    AWKif を素朴に使っただけで、幼稚園児でもできるような何の芸も面白みもないコードで、「シェル芸」と称するには余りにもおこがましいコード。もっとシェル芸らしい芸のあるやり方、誰か教えてっ。(´;ω;`)

    コードと実行例

    $ cat /dev/random \
    | od -An -tu1 -w1 \
    | awk '{print $1 % 2 ? "ズン" : "ドコ"}' \
    | awk '{print ; if ($1=="ズン") ++Zn ; else if (Zn<4) Zn=0 ; else {print "キ・ヨ・シ!" ; exit}}'
    ズン
    ドコ
    ドコ
    ドコ
    ズン
    ズン
    ドコ
    ドコ
    ドコ
    ズン
    ドコ
    ズン
    ドコ
    ズン
    ドコ
    ドコ
    ズン
    ズン
    ズン
    ズン
    ドコ
    キ・ヨ・シ!
    $
    

    他のと比較して

    Qiita に投稿された他のコードも幾つかみたけど、自分が見たやつのほとんどの実装が、それまでのデータを蓄積して、連結して、それが、(Java で言えば).endsWith ("ズンズンズンズンドコ") してるかどうかを見る、みたいな処理を(それぞれの言語のやり方で)してるのが多いみたいけど、上のコードの場合は、データを蓄積せずに、単純に連続する「ズン」の個数を数えるだけってところが、その意味では経済的かもね。(*´ω`*)

    データを蓄積する方式も考えるには考えたけど、ワンライナーでそれをやると、何か長ったらしくて嫌な感じになるから、もっとシンプルな方法を考えたら、こうなった。

    ちょっと驚いたのは、自分と同じ方式を使ってるだろうって期待して読んだ Verilog 版のやつ(ズンドコVerilog)でも、データ蓄積方式を使ってること。過去データをシフトレジスターに保存してるぽぃ。純粋に「ズン」をカウント・アップして、「ドコ」でリセットにするっていう仕組みで作ってるんだろなって期待してたけど、違った…。いゃ、デジタル回路での実装の場合はシフトレジスターを使う方式の方が経済的かもねっ。(・∀・)

    Swift 版(ズンドコキヨシ with Swift 〜 たまには無限ループ)が、自分が使った考え方に近いけど、やっぱり zundokoList に過去データを蓄積してるから、違う。(…てか、ランダムに生成した先行するデータを出力するかどうかの違いもあるねっ。)(´・ω・`)

    別解釈の…

    問題を別解釈できるらしくて、その解釈でもやった。

    ズンドコキヨシ、UNIX系 コマンド・パイプ -- 別解釈

    Comments Loading...