加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 减少排列

发布时间:2020-12-15 22:19:31 所属栏目:安全 来源:网络整理
导读:请考虑以下字符串 abcd 我可以返回2个字符排列 (cartesian product) 像这样 $echo {a,b,c,d}{a,d}aa ab ac ad ba bb bc bd ca cb cc cd da db dc dd 但是,我想删除多余的条目,如 ba ca cb da db dc 和无效的条目 aa bb cc dd 所以我离开了 ab ac ad bc bd cd
请考虑以下字符串

abcd

我可以返回2个字符排列
(cartesian product)
像这样

$echo {a,b,c,d}{a,d}
aa ab ac ad ba bb bc bd ca cb cc cd da db dc dd

但是,我想删除多余的条目,如

ba ca cb da db dc

和无效的条目

aa bb cc dd

所以我离开了

ab ac ad bc bd cd

Example

解决方法

这是一个纯粹的狂欢:

#!/bin/bash

pool=( {a..d} )
for((i=0;i<${#pool[@]}-1;++i)); do
    for((j=i+1;j<${#pool[@]};++j)); do
        printf '%sn' "${pool[i]}${pool[j]}"
    done
 done

另一个:

#!/bin/bash

pool=( {a..d} )
while ((${#pool[@]}>1)); do
    h=${pool[0]}
    pool=("${pool[@]:1}")
    printf '%sn' "${pool[@]/#/$h}"
done

它们可以写成函数(或脚本):

get_perms_ordered() {
    local i j
    for((i=1;i<"$#";++i)); do
        for((j=i+1;j<="$#";++j)); do
            printf '%sn' "${!i}${!j}"
        done
     done
}

要么

get_perms_ordered() {
    local h
    while (("$#">1)); do
        h=$1; shift
        printf '%sn' "${@/#/$h}"
    done
}

用于:

$get_perms_ordered {a..d}
ab
ac
ad
bc
bd
cd

最后一个可以很容易地转换成递归函数以获得给定长度的有序排列(没有替换 – 我使用愚蠢的球 – 瓮概率词汇表),例如,

get_withdraws_without_replacement() {
    # $1=number of balls to withdraw
    # $2,... are the ball "colors"
    # return is in array gwwr_ret
    local n=$1 h r=()
    shift
    ((n>0)) || return
    ((n==1)) && { gwwr_ret=( "$@" ); return; }
    while (("$#">=n)); do
        h=$1; shift
        get_withdraws_without_replacement "$((n-1))" "$@"
        r+=( "${gwwr_ret[@]/#/$h}" )
    done
    gwwr_ret=( "${r[@]}" )
}

然后:

$get_withdraws_without_replacement 3 {a..d}
$echo "${gwwr_ret[@]}"
abc abd acd bcd

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读