シェル芸で部分集合を全通り求める方法(別解求む)

Sun Mar 29 21:52:43 JST 2015 (modified: Fri Sep 29 21:38:45 JST 2017)
views: 1785, keywords:CLI,シェル芸,集合 この記事は最終更新日が7年以上前のものです。

ちょっと質問というかお題なのですが、ある集合の部分集合を全通り求める(意味がわからなかったらブログの一番下の出力を見てみてください)必要があって、シェル芸でできないかと考えてみました。

私の解はこんな感じです。{a,b,c,d}の部分集合を全て求めてみます。a,b,c,dにはアルファベット一文字でなくて数文字入ることもあるとします。

まず、とりあえず要素をechoしてみます。

uedambp:~ ueda$ echo a b c d
   a b c d

次にこうやって・・・

uedambp:~ ueda$ echo a b c d | gsed 's;[^ ]*;\\{,&\\},;g' | tr -d ' ' |
    awk '{print "echo",$0}'
   echo {,a},{,b},{,c},{,d},

bashに突っ込みます。

uedambp:~ ueda$ echo a b c d | gsed 's;[^ ]*;\\{,&\\},;g' | tr -d ' ' |
    awk '{print "echo",$0}' | bash
   ,,,, ,,,d, ,,c,, ,,c,d, ,b,,, ,b,,d, ,b,c,, ,b,c,d, a,,,, a,,,d, a,,c,, a,,c,d, a,b,,, a,b,,d, a,b,c,, a,b,c,d,

あとは適当に整形して終わり。

uedambp:~ ueda$ echo a b c d | gsed 's;[^ ]*;\\{,&\\},;g' | tr -d ' ' | awk '{print "echo",$0}' | bash | sed 's/,,*/,/g' | tr ' ' '\\n' | sed 's/,$/}/' | sed 's/^/{/'
   {}
   {,d}
   {,c}
   {,c,d}
   {,b}
   {,b,d}
   {,b,c}
   {,b,c,d}
   {a}
   {a,d}
   {a,c}
   {a,c,d}
   {a,b}
   {a,b,d}
   {a,b,c}
   {a,b,c,d}

なーんかもっと簡単な方法があるように思うのですが、思いつきません。シェル芸的にはできたからいいんですけど、もし別解があれば教えていただきたく。

寝る。

ノート   このエントリーをはてなブックマークに追加 
 

prev:GlueLangのif文相当の処理をまたいじったがこれで最後にしたい next:【エイプリルフールは終了しました】シェル芸が実写化されました

やり散らかし一覧

記事いろいろ