使用 bash 脚本查找数字的排列

使用 bash 脚本查找数字的排列

是否可以编写一个 bash 脚本,将一个 4 位数字作为命令行参数,并仅使用纯 bash 生成该数字的所有排列?

答案1

这是可能的。这里有一个函数可以完成你要求的事情。

function permutate {
    if [ "${#1}" = 1 ]; then
        echo "${2}${1}"
    else
        for i in $(seq 0 $((${#1}-1)) ); do
            pre="${2}${1:$i:1}"
            seg1="${1:0:$i}"
            seg2="${1:$((i+1))}"
            seg="${seg1}${seg2}"
            permutate "$seg" "$pre"
        done
    fi
}

像这样运行:

$ permutate 1234

它通过使用递归来工作。每次调用该函数都会从字符串中取出一个字符,并以递归方式将其余部分传递给自身。因此,如果输入是 1234,它会被分解为前缀和剩余段四次,如下所示:1 234 2 134 3 124 4 123。然后,三个字符段得到相同的处理,然后是两个字符段,然后当段只有一个字符时,递归停止。

答案2

大量滥用该shuf命令,我意识到这使得它不是纯粹的 bash:

damson$ cat shell-combinations 
#!/bin/bash

R=1000
PERM_OR_COMB=perm 

if [ $PERM_OR_COMB = perm ]; then
    C_RANGE=$#
else
    C_RANGE=$(seq 0 $#)
fi
for C in $C_RANGE; do
    for I in $(seq 1 $R); do
        echo "$(for X in "$@"; do echo "$X"; done | shuf -n $C | paste -s -d' ')"
    done | sort -u
done
damson$ ./shell-combinations 1 2 3 4  
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1
damson$ 

显然它很慢,而且理论上也不可靠,但根据您的使用情况以及与R相比的大小$#,它可能会满足您的需求。更改PERM_OR_COMB=permPERM_OR_COMB=comb以获取所有组合而不是所有排列。

相关内容