2016-12-05 54 views
-1

This page提供殼power set實現,這是我對此採取:awk中發電機組實現

pa() { 
    if [ "$#" = 0 ] 
    then echo 
    else (
    shift 
    pa "[email protected]" 
) | while read qu 
    do printf '%s %s\n%s\n' "$1" "$qu" "$qu" 
    done 
    fi 
} 
pa x y z 

我認爲是有趣的是使這個 註釋上述頁面的作者:

沒有很好的解決方案的awk,歡迎您發郵件給我一個:他的電子郵件]

鈣這不是在Awk中完成的,還是shell在這裏做得更好?

回答

4

這裏是另一個awk方法

echo a b c | awk '{for(i=0;i<2^NF;i++) { 
        for(j=0;j<NF;j++) 
         if(and(i,(2^j))) printf "%s ",$(j+1) 
        print ""}}' 

a 
b 
a b 
c 
a c 
b c 
a b c 

如果您awk沒有and()功能,具有int(i/(2^j))%2

+0

你應該把這個代碼放在這裏:http://codegolf.stackexchange.com/questio ns/9045 /最短功率設置實現...除非你能使它更短...:D –

+1

感謝您的建議。我在那裏添加了http://codegolf.stackexchange.com/a/103948/17581。您可以從第一個循環中刪除「i = 0」初始化。 – karakfa

+0

優雅和簡潔。值得注意的是,每個輸出行,但第一個將有一個尾隨空間。 _GNU_ Awk是唯一支持'和()'的主要Awk實現。 – mklement0

1

這是改編自Rosetta Code一個解決方案:

function al(br, ch, de) { 
    while (br) { 
    ch-- 
    if (br % 2) 
     de = de $(sprintf("%c", 49 + ch)) FS 
    br = int(br/2) 
    } 
    return de 
} 
{ 
    for (ec = 0; ec <= 2^NF - 1; ec++) { 
    print al(ec, NF) 
    } 
} 

用法:

echo x y z | power-set.awk 

Example

0

在了GNU AWK(由於andlshift的的split :)

$ cat program.awk 
BEGIN { 
    n=split(s,a,"") 
    for(i=1;i<2^n;i++) { 
     for(j=1;j<=n;j++) 
      if(and(lshift(1,(j-1)),i)) 
       printf "%s", a[j] 
     print "" 
    } 
} 

使用方式替換它:

$ awk -v s="abc" -f program.awk 
a 
b 
ab 
c 
ac 
bc 
abc 
+0

......這實際上與@ karakfa的解決方案基本相同,甚至是變量名稱。我需要新的朋友和變數。 –

+2

@StevenPenny:更準確地說,使用'「」'作爲split()的第三個參數(_fs_)來將字符串分割成單個字符是不符合POSIX標準的,但是GNU Awk,BSD Awk和Mawk都是支持它。 – mklement0