在Perl中,如何在所有非对角元素之前输出集的笛卡尔乘积的对角线?

在Perl中,如何在所有非对角元素之前输出集的笛卡尔乘积的对角线?,perl,Perl,我想输出两个字母的所有组合,但我想先显示相同字母之间的组合。基本上,我想得到这样的东西: 如果我有 @list = ("A", "B", "C") 我希望我的输出是: AA - BB - CC - AB AC BA BC CA CB 通常,如果我只使用两个for循环,我会得到 AA - AB AC BA BB - BC CA CB CC - 是否有任何快速(易于理解/简单)的方法来获得我想要的输出 for my $e (@list) { say $e.$e; } fo

我想输出两个字母的所有组合,但我想先显示相同字母之间的组合。基本上,我想得到这样的东西:

如果我有

@list = ("A", "B", "C")
我希望我的输出是:

AA  -
BB  -
CC  -
AB
AC
BA
BC
CA
CB
通常,如果我只使用两个for循环,我会得到

AA  -
AB
AC
BA
BB  -
BC
CA
CB
CC  -
是否有任何快速(易于理解/简单)的方法来获得我想要的输出

for my $e (@list) {
    say $e.$e;
}

for my $i (0..$#list) {
    for my $j (0..$#list) {
        say $list[$i].$list[$j] if $i != $j;
    }
}
它应该能够满足您的要求,因为它比以前提出的解决方案快3倍[1],但它仍然非常清楚


  • 另一个答案中有一个基准,但它被删除了
  • 它应该能够满足您的要求,因为它比以前提出的解决方案快3倍[1],但它仍然非常清楚


  • 另一个答案中有一个基准,但它被删除了

  • 我想不出比以下更简单的方法:

    @letters = ( 'A', 'B' );
    @list = ( $letters[0].$letters[0], $letters[1].$letters[1], $letters[0].$letters[1], $letters[1].$letters[0] );
    

    我想不出比以下更简单的方法:

    @letters = ( 'A', 'B' );
    @list = ( $letters[0].$letters[0], $letters[1].$letters[1], $letters[0].$letters[1], $letters[1].$letters[0] );
    

    这已经得到了解决,但我认为最简单的解决方案是在自定义代码中处理您的特殊情况,然后依靠标准模块完成其他所有工作

    对于组合模块,可以使用或


    这已经得到了解决,但我认为最简单的解决方案是在自定义代码中处理您的特殊情况,然后依靠标准模块完成其他所有工作

    对于组合模块,可以使用或



    不,如果你想打印所有的组合,你不能有比O(N!)更快的算法。我想打印所有的组合。所谓快速,我指的不是时间复杂性。我的意思是,如果有一个简单易懂的方法,没有太多麻烦。谢谢你的编辑,顺便说一句:你可能会喜欢尝试让你的头绕过
    排列
    子。如果你认为这很容易理解,那对你有好处!嗯,看起来不像我要找的,但这可能会让我找到正确的方向。非常感谢。1)
    @list
    的大小是否可变?2) 如果是,所需的输出仍然是一个对列表吗?不,如果你想打印所有组合,你不能比O(N!)算法更快。HMI想打印所有组合。所谓快速,我指的不是时间复杂性。我的意思是,如果有一个简单易懂的方法,没有太多麻烦。谢谢你的编辑,顺便说一句:你可能会喜欢尝试让你的头绕过
    排列
    子。如果你认为这很容易理解,那对你有好处!嗯,看起来不像我要找的,但这可能会让我找到正确的方向。非常感谢。1)
    @list
    的大小是否可变?2) 如果是,那么所需的输出仍然是一个成对的列表吗?是的,但这仅适用于两个字母。如果我再多加一些,那就太麻烦了。@user3433676:您对所需顺序的定义没有扩展到两个以上。如果您有更一般的问题,请更新您的问题,并解释您希望如何订购?是的,但这仅适用于两个字母。如果我再多加一些,那就太麻烦了。@user3433676:您对所需顺序的定义没有扩展到两个以上。如果您有更一般的问题,请更新您的问题,并解释您希望如何订购?我以为您问是否有更快的方式,但您只是要求快速方式。更新了我的答案。我对我的英语技能感到抱歉,我母语中的一些单词在翻译成英语时并没有得到相同的含义。起初,我在寻找一个我很容易理解的答案。即使这是一段非常好的代码,但如果我不能全神贯注于它,我也无法真正欣赏它。Sinan的原始答案是好的(编辑后的版本更好,提供了一个别致的选择),但我必须更同意ikegami的解决方案。它非常简单,从基准来看,效率更高。但我要感谢你们两位花时间帮助我。听着,我不知道你们之间发生了什么,但请停止编辑彼此的答案。你有更好的解决办法吗?把它写在你的答案中,不要打扰其他人。@SinanÜnür,你因为在我的答案中做出这些离题和不正确的评论而受到警告,但这些评论并不能作为对我答案的评论。我以为你问是否有更快的方法,但你只是要求更快的方法。更新了我的答案。我对我的英语技能感到抱歉,我母语中的一些单词在翻译成英语时并没有得到相同的含义。起初,我在寻找一个我很容易理解的答案。即使这是一段非常好的代码,但如果我不能全神贯注于它,我也无法真正欣赏它。Sinan的原始答案是好的(编辑后的版本更好,提供了一个别致的选择),但我必须更同意ikegami的解决方案。它非常简单,从基准来看,效率更高。但我要感谢你们两位花时间帮助我。听着,我不知道你们之间发生了什么,但请停止编辑彼此的答案。你有更好的解决办法吗?把它写在你的答案里,别管其他人。@SinanÜnür,你因为在我的答案中发表了这些离题和不正确的评论而受到警告,但作为对我答案的评论,这些评论并没有更好的效果。
    for (glob("{A,B,C}{A,B,C}")) {
      print;
      print " -" if /(.)\1/;
      print "\n";
    }