【问题标题】:perl6 Permutation matchperl6 排列匹配
【发布时间】:2017-09-17 17:20:23
【问题描述】:

我仍在尝试进行排列匹配,我想知道是否有人有更好的方法来做到这一点。我想以任何顺序匹配数组中的所有模式,即匹配数组中项目(字符串或其他对象)的排列。例如,如果数组是 (1,2,3),那么如果一个字符串以任意顺序包含 1 和 2 和 3,则为真;即,如果字符串包含 (1,2,3) 的排列,则为 true。

我现在拥有的是这样的:

my @x = < one eins uno yi two zwei dos er one one one two two two >;
my @z = < one eins uno yi two zwei dos er one one one two two two foo >;
my $y = "xxx one eins uno yi two zwei dos er xxx";

sub matchAllWords($aString, @anArray) {
    my $arraySize = @anArray.elems;
    if $arraySize == 0 { False; }
    elsif $arraySize == 1 { 
    ($aString.match(/:i "@anArray[0]" /)).Bool; 
    } else { 
    my $firstCheck = ($aString.match(/:i "@anArray[0]"/)).Bool;
    if $firstCheck {
        $firstCheck
        and
        (matchAllWords($aString, @anArray[1..*])); 
    } else {
        return False;
    }
  }
}

say matchAllWords($y, @x); 
# result is True, but it should NOT be True because $y should not 
# match permutations of @x which contains multiple identical elements
# of "one" and "two"
say matchAllWords($y, @z); # False as expected;

问题是我的函数匹配数组中的所有唯一单词,但无法区分重复单词的排列。我可以添加越来越多的代码来判断一个单词是否匹配,但是更多的代码来完成一个简单的想法,“排列匹配”,是不完美的。有什么建议么?谢谢

【问题讨论】:

  • 我不清楚你想要实现什么。你想检查数组ntimes 中包含的每个元素是否也恰好出现在字符串ntimes 中?还是别的什么?
  • 你看过Bags并设置操作符吗?感觉就像您想以某种方式(身份/子集)比较两个包。这就是你想要的吗?
  • 你不能只对两个列表进行排序吗?
  • 谢谢 smls、伊丽莎白和布拉德!抱歉不清楚。这是我想要实现的一个例子。说,我有一个字符串 $x="a1bb3dd2xyz";我想知道 $x 是否会匹配字符串数组的排列。如果我的数组@a = ,那么任何包含“1”、“a”和两个“2”的字符串都将匹配; $x 将不匹配; “xx22yy1wwa”和“wwayy2zz2mm1”应该匹配,但“xx2y1wa”不应该因为它只有一个“2”,而“z12bba1”不应该因为它有额外的“1”。所以,它并不完全像 Bag。 smls 说的和我想做的很接近。非常感谢大家!!
  • 对不起,澄清我上面的评论。 “z12bba1”不应该,因为它有额外的“1”而缺少一个“2”。

标签: match permutation raku


【解决方案1】:

新答案

根据大家的cmet,这里是我现在理解的问题的重述,然后​​是一个新的解决方案:

测试Y,一个字符串,包含Z中的所有字符串,一个Bag (multiset) 字符串,具有正确的复制计数/多重性。

my \Z = < one eins uno yi two zwei dos er two > .Bag ;

my \Y = "xxx one eins uno yi two zwei dos er two xxx" ;

sub string-matches-bag ($string, $bag) {
    for $bag.kv -> $sub-string, $copy-count {
        fail unless ($string ~~ m:g/ $sub-string /).elems == $copy-count
    }
    True
}

say string-matches-bag Y, Z

旧答案

say so $y.words.all eq @z.any

这行代码的解释在这个答案的最后部分。


我发现你的问题很令人困惑。但我希望这个答案是您想要的,或者至少足以让事情朝着正确的方向发展。

我发现您的数据令人困惑。您的 $y 中有两个 'xxx' 单词,但两个数组中都没有。所以那一点不能匹配。您的@z 中有一个'foo'。那应该是'xxx' 吗?你的$y 中有一个'one',但两个数组至少有两个 'one's。这是个问题吗?

我也发现你的叙述令人困惑。

对于这个答案,我假设@z 末尾有一个xxx,关键评论是:

一个简单的想法,“排列匹配”


say so $y.words.all eq @z.any

so 返回其右侧表达式的布尔值(TrueFalse)。

so 右侧的表达式使用Junctions。它的英文散文摘要是“$y 中的所有“单词”,一次取一个,是等于@z 的至少一个元素的字符串。

这是您要求的简单解决方案吗?

【讨论】:

  • 谢谢你!很抱歉造成混淆。让我重新表述我的问题:这个字符串是否匹配单词数组的任何排列?例如,如果字符串是“1a2”,而数组是 ,那么它将不匹配,因为数组的所有排列都有两个“1”。字符串“x1y2zab1”应该匹配,因为它包含数组的排列。我正在考虑这个:这么说 $y ~~ m/ / 但这还不行,我个人不喜欢 EVAL 因为使用 EVAL 意味着我缺乏表现力和我的代码清晰。谢谢!!!
  • 我希望 perl6 可以将这样的置换匹配添加到它的基本匹配实用程序中。我必须解决的现实世界应用程序就是这个。文件的每一行都有一些重要的单词,顺序不限,单词可能被空格分隔,也可能不被空格分隔,我只知道一些单词的一部分,我想要包含这些单词部分的行。谢谢!
  • 太棒了!!!非常感谢雷夫!!! Bag, :g 与元素计数匹配是一个好主意。我很高兴生活在一个大多数人都比我更聪明、更有知识的世界:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2011-05-21
  • 2016-05-10
相关资源
最近更新 更多