【问题标题】:Perl permutation [duplicate]Perl排列[重复]
【发布时间】:2018-01-18 12:12:01
【问题描述】:

嗨,我正在编写 perl 中的脚本,我已经看到了置换代码,但我的问题是我有一个数组,其值为 @array =(john, cena, barrack, obama, donald, trump) 在索引 0 处的值是名字,1 是姓,2 是名字,3 是姓,依此类推。所以应该是这样的

john cena
barrack obama
donald trump

我需要这个组合的排列

barrack obama
donald trump
john cena

donald trump
john cena
barrack obama

像这样 这是怎么做到的!! 我已经用硬编码做到了这一点,但我需要让它更通用!

            my $i=0;
            my @array;
            print $fh_testcases "\n${indentation}${tab}$tab'$intent_json_result': [[\n";
            while ((my $key, my $value) = each %{@{$p_phrase_recogslots}[${speech_phrase_counter}-1]}) {
                $array[$i]= $key;
                $array[$i+1]= $value;
                $i= $i+2;
            }
            if ($i == 6){
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[0]\", \"$array[1]\"),\n";
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[2]\", \"$array[3]\"),\n";
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[4]\", \"$array[5]\"),\n";
                print $fh_testcases "${indentation}${tab}$tab$tab(\"origin\", \"onboard\")\n"; #TODO handle offboard cases
                print $fh_testcases "${indentation}${tab}$tab]]\n";
                print $fh_testcases "${indentation}${tab}},\n";

                print $fh_testcases "${indentation}${tab}\{'$intent_json_result': [[\n";
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[4]\", \"$array[5]\"),\n";                    
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[2]\", \"$array[3]\"),\n";
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[0]\", \"$array[1]\"),\n";

                print $fh_testcases "${indentation}${tab}\{'$intent_json_result': [[\n";
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[4]\", \"$array[5]\"),\n";
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[0]\", \"$array[1]\"),\n";                    
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[2]\", \"$array[3]\"),\n";

                print $fh_testcases "${indentation}${tab}\{'$intent_json_result': [[\n";
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[2]\", \"$array[3]\"),\n";
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[4]\", \"$array[5]\"),\n";
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[0]\", \"$array[1]\"),\n"; 

                print $fh_testcases "${indentation}${tab}\{'$intent_json_result': [[\n";
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[2]\", \"$array[3]\"),\n";
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[0]\", \"$array[1]\"),\n";
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[4]\", \"$array[5]\"),\n";

                print $fh_testcases "${indentation}${tab}\{'$intent_json_result': [[\n";
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[0]\", \"$array[1]\"),\n";
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[4]\", \"$array[5]\"),\n";
                print $fh_testcases "${indentation}${tab}$tab$tab(\"$array[2]\", \"$array[3]\"),\n";
            }

【问题讨论】:

  • “排列”将打印这六个单词可以排列的所有可能顺序,例如“obama john donald cena barrack trump”。那是你真正想要的吗?因为我觉得它不是。
  • 只需将"john cena""barack obama""donald trump" 分别放入一个字符串中,然后将您已经拥有的置换算法应用于该三元素数组。你有一个算法,不是吗?
  • edit您的问题并包含一个工作程序。现在您缺少数据的变量定义,因此我们无法运行您的代码。有关详细信息,请参阅minimal reproducible example
  • 离题,但一般来说可能有帮助,当你编写 Perl 代码时,如果你在字符串文字中转义字符,你可能做错了。您可以使用 qq 运算符将任何定界符作为内插引号。如果你记得 print 需要一个参数列表并打印它们,你的 print 语句也可以变得不那么混乱。所以你凌乱的打印语句可以减少到print $fh $indentation, $tab x $indent_level, qq("$word_list[1]");更多信息见perldoc.perl.org/perlop.html#Quote-and-Quote-like-Operators

标签: perl permutation


【解决方案1】:
use Algorithm::Loops qw( NextPermuteNum );

my @array = ( "john cena", "barrack obama", "donald trump" );

my @i = 0..$#array;
do {
   say map { "$_\n" } @array[@i];
} while NextPermuteNum(@i);

【讨论】:

    【解决方案2】:
    use Algorithm::Permute;
    
    my @array = ( "john cena", "barrack obama", "donald trump" );
    
    my $iterator = Algorithm::Permute->new ( \@array );
    while (my @perm = $iterator->next) {
        say map { "$_\n" } @perm;
    }
    

    【讨论】:

      【解决方案3】:
      • 获取$#array 的值,加1,除以2,然后将该数字存储在变量中(称为$v
      • 获取一组数字的排列 [0 .. $v-1]
      • 对于结果排列的每个成员$iprint $array[2*$i] $array[2*$i+1]

      【讨论】:

        猜你喜欢
        • 2019-09-18
        • 2020-02-02
        • 2012-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多