如何在 bash 中使用 N 进行排列!输入



我必须在bash中使用"eval"和"seq"命令进行排列。所以我必须首先进行一个可以包含相同数字的排列,然后我必须以某种方式过滤它。

老师告诉我,我必须使用两个周期/周期,一个在另一个。但我不知道该怎么做。

输入如下:

3

输出应为:

123
132
213
231
312
321

如果有人能帮助我,那就太好了!

编辑:我想知道如何使用这些命令来做到这一点,我的朋友是这样对我的:http://pastebin.com/wM2U1SuT老师告诉我太好了,不在这个水平上。我应该用 Seq 和 EVAL 来做,即使它不是那么好。第二个问题是输入是 123,而不是 3,就像 3 一样..

这是一个排列问题,所以我发现其他人已经做到了。你可以看到答案使用 bash 生成排列

所以通过答案,你可以这样写代码:

perm() {
    local items="$1"
    local out="$2"
    local i
    [[ "$items" == "" ]] && echo "$out" && return
    for (( i=0; i<${#items}; i++ )) ; do
        perm "${items:0:i}${items:i+1}" "$out${items:i:1}"
    done
}
test() {
    local number="$1"
    local iniitem="$(seq -s' ' 1 ${number} | sed -n 's/ //g;p')"
    perm "$iniitem"
}

然后你可以像这样使用函数:
test 3
输出:

123
132
213
231
312
321
我知道这不是

OP 想要的 seq+eval 解决方案,但如果将来有人正在寻找替代方案,这里是维基百科文章中描述的 generate() 函数的实现 堆算法 用awk编写来解决这个问题:

$ cat tst.awk
function generate(n,A,  i) {
    if (n == 1) {
        output(A)
    }
    else {
        for (i=0; i<(n-1); i++) {
            generate(n-1, A)
            swap(A, (n%2?0:i), n-1)
        }
        generate(n-1, A)
    }
}
BEGIN{
    if (n>0) {
        for (i=1; i<=n; i++) {
            A[i-1] = i
        }
        generate(n, A)
    }
}
function output(a, i,g) {g=length(a); for (i=0;i<g;i++) printf "%s%s",a[i],(i<(g-1)?"":ORS)}
function swap(a,x,y, t) {t=a[x]; a[x]=a[y]; a[y]=t }
$ awk -v n=3 -f tst.awk | sort
123
132
213
231
312
321

我尽可能坚持维基百科文章命名和其他约定,包括从零而不是典型的awk 1开始数组,以便于该文章和awk代码之间的比较。

如果有人好奇,这里有解决方案:

input=3
for i in $(eval echo " {1..$input}{1..$input}{1..$input} "); do
    OK=yes
    for pos1 in $(seq 0 $((x,1)) ); do
        for pos2 in $(seq 0 $((x,1)) ); do
            if [ $pos1 != $pos2 ]; then
                if [ ${i:$pos1:1} == ${i:$pos2:1} ]; then
                    OK=no
                fi
            fi
        done
    done
    if [ $OK = yes ]; then
        echo $i
    fi
done

相关内容

  • 没有找到相关文章

最新更新