2016-12-05 5 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, вы можете по электронной почте мне одно: [его электронная почта]

Ca n это не делается в Awk, или же оболочка просто лучше работает здесь?

ответ

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

Вы должны поместить это в реализацию набора мощности Code Golf здесь: http://codegolf.stackexchange.com/questio ns/9045/shortest-power-set-implementation ... если вы не можете сделать это еще короче ...: 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 (из-за and, lshift и пути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_) аргумента для разделения строки на отдельные символы _not POSIX-compliant_, но GNU Awk, BSD Awk и Mawk все поддержите его. – mklement0