2016-12-05 4 views
-1

This page bietet eine power set Implementierung in der Schale, hier ist mein nehmen auf sie:Awk Kraft gesetzt Implementierung

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 

Was ich dachte, war dieses die der Autor der obigen Seite interessant gemacht ist Kommentar:

keine schöne awk Lösung, sind Sie willkommen, mit mir eine E-Mail an: [seine E-Mail]

Ca Das geht nicht in Awk, oder macht Shell hier einfach einen besseren Job?

Antwort

4

hier ist ein weiterer awk Ansatz

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 

wenn Ihr awk nicht and() Funktion hat, ersetzen Sie es mit int(i/(2^j))%2

+0

Sie sollten dies in Code Golf Power Set Implementierung hier einfügen: http://codegolf.stackexchange.com/question ns/9045/kürzeste-power-set-implementation ... es sei denn du kannst es noch kürzer machen ...: D –

+1

danke für den Vorschlag. Ich habe dort http://codegolf.stackexchange.com/a/103948/17581 hinzugefügt. Sie können die Initialisierung "i = 0" von der ersten Schleife löschen. – karakfa

+0

Elegant und prägnant. Beachten Sie, dass jede Ausgabezeile außer dem ersten ein Leerzeichen hat. _GNU_ Awk ist die einzige größere Awk-Implementierung, die 'und()' unterstützt. – mklement0

1

Hier ist eine Lösung von Rosetta Code angepasst:

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

Verbrauch:

echo x y z | power-set.awk 

Example

0

In Gnu awk (wegen and, lshift und dem Weg vonsplit :)

$ 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 "" 
    } 
} 

Verbrauch:

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

..., die im Wesentlichen die gleiche wie die @ karakfa-Lösung selbst für die Variablennamen war. Ich brauche neue Freunde und Variablen. –

+2

@StevenPenny: Genauer gesagt, '' '' als 'split()'s 3. (_fs_) -Argument zu verwenden, um eine Zeichenfolge in einzelne Zeichen aufzuteilen, ist _nicht POSIX-compliant_, sondern GNU Awk, BSD Awk und Mawk all unterstütze es. – mklement0

Verwandte Themen