在指定的字符串中生成所有可能的间距?

2024-04-28 20:28:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有删除空格的莫尔斯电码串,所有长度相等。你知道吗

比如说..--.---..

我想在单独的行上生成所有可能的解决方案。你知道吗

. . - - . - - - . ... - - .- --. ...- -.- - -. .

什么是一个好的,有效的方法来做这件事?我对这种事很反感,我很难堪。你知道吗


Tags: 方法电码解决方案行上空格
2条回答

如果您想在纯bash中完成它,它可能会变得很棘手。我们的想法是利用支架扩展,这将照顾到所有的可能性。你知道吗

$ a='.. '
$ [[ $a =~ ${a//?/(.)} ]] && b=${BASH_REMATCH[*]:1} && eval printf "%s\\\n" ${b// /\{,\" \"\}})

它是如何工作的?

这个想法本质上是转变

'.. '

进入

.{," "}.{," "}-{," "}-

让bash使用brace扩展来生成所有的组合。你知道吗

  1. bash测试将尝试匹配类似于(.)(.)(.)(.)的正则表达式${a//?/(.)}。它将所有匹配项存储在变量BASH_REMATCH

  2. b=${BASH_REMATCH[*]:1}索引为0的BASH_REMATCH元素是字符串中与整个正则表达式匹配的部分。索引为BASH_REMATCHn元素是字符串中与第n个带圆括号的子表达式匹配的部分。因此,除第一部分外,我们只对所有部分感兴趣:

    $ [[ $a =~ ${a//?/(.)} ]] && echo ${BASH_REMATCH[*]}
    ..  . . - -
    $ [[ $a =~ ${a//?/(.)} ]] && echo ${BASH_REMATCH[*]:1}
    . . - -
    
  3. ${b// /\{,\" \"\}}{," "}替换所有空格。这将允许我们使用大括号展开,我们需要用eval进行计算

    $ a='.. '
    $ [[ $a =~ ${a//?/(.)} ]]
    $ b=${BASH_REMATCH[*]:1}
    $ echo "${b// /\{,\" \"\}}"
    .\{," "\}.\{," "\}-\{," "\}-
    

这是awk里的一个。当我看到这个问题并决定尝试一些东西时,我正在玩awk二进制转换。它从i=02(长度(morse)-1)-1,将i转换为二进制,并用空格替换所有1,用空值替换0,例如:

morse=-.-
length(morse)=3 -> 2^(3-1)-1=3
runs 0..3
0==00 -> -0.0- -> -.-
1==01 -> -0.1- -> -. -
2==10 -> -1.0- -> - .-
3==11 -> -1.1- -> - . -

脚本:

$ echo -..- |
  awk '
  function tobin(d,l) {
    r=""
    while(d) {
        r=d%2r
        d=int(d/2)
    }
    return sprintf("%0" l "d",r)
} 
{
    n=split($0,a,"")
    for(i=0;i<=2^(length-1)-1;i++) {
        split(tobin(i,length-1),b,"")
        for(j=1;j<=n;j++)
            printf "%s%s",a[j],(b[j]?" ":(j==n?ORS:""))
    }
}'

输出:

-..-
-.. -
-. .-
-. . -
- ..-
- .. -
- . .-
- . . -

相关问题 更多 >