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个字符排列 $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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |