AWK幂集实现
AWK power set implementation
This page provides a power set 在 shell 中实现,这是我的看法:
pa() {
if [ "$#" = 0 ]
then echo
else (
shift
pa "$@"
) | while read qu
do printf '%s %s\n%s\n' "" "$qu" "$qu"
done
fi
}
pa x y z
我觉得上面页面的作者发表这个评论很有趣:
no nice AWK solution. You are welcome to email me one: <his email>
这不能在 AWK 中完成,还是 shell 在这里做得更好?
这是改编自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
这是另一种 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
。
在 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
This page provides a power set 在 shell 中实现,这是我的看法:
pa() {
if [ "$#" = 0 ]
then echo
else (
shift
pa "$@"
) | while read qu
do printf '%s %s\n%s\n' "" "$qu" "$qu"
done
fi
}
pa x y z
我觉得上面页面的作者发表这个评论很有趣:
no nice AWK solution. You are welcome to email me one: <his email>
这不能在 AWK 中完成,还是 shell 在这里做得更好?
这是改编自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
这是另一种 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
。
在 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