我必须在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