2017-09-17 5 views
1

私はまだ順列一致で作業しようとしており、誰かがそれを行うより良い方法があるのだろうかと思います。配列内のすべてのパターンを任意の順序で一致させたい、つまり、配列内のアイテム(文字列やその他のオブジェクト)の順列にマッチさせたい。たとえば、arrayが(1,2,3)の場合、文字列に1と2と3が任意の順序で含まれる場合はtrueです。つまり、文字列に(1,2,3)の順列が含まれている場合はtrueです。perl6並べ替え一致

私が今持っていることはこれです:

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; 

の問題は私の関数は、配列内のすべてのユニークワードと一致していることですが、重複した単語の順列を区別することができません。単語が一致しているかどうかを判断するためにコードを追加することはできますが、単純な考え方である "置換一致"を達成するためのコードは多くありません。助言がありますか?みんなの意見をもとに感謝

+1

達成したいことは私には分かりません。配列 'n '回に含まれるすべての要素が正確に' n'回の文字列にも現れるかどうかチェックしますか?または、他の何か? – smls

+1

あなたは見て、 'バッグ'と演算子を設定しましたか?あなたが何らかの形で2つのバッグを比較したいと思うように感じます(アイデンティティ/サブセット)。それはあなたが欲しいものですか? –

+0

両方のリストを並べ替えることはできませんでしたか? –

答えて

3

新しい答え

は、私は今、新しいソリューションに続く、それを理解するようここでの問題の修正再表示です:

テストYつまり、文字列は、すべてが含まれていますZの文字列、Bagmultiset)の文字列、正しいコピー数/多重度。

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には2つの'xxx'という単語がありますが、どちらの配列にも含まれていません。そのビットは一致できません。 @z'foo'があります。それは'xxx'であるはずですか?あなたの$yには'one'がありますが、どちらの配列も少なくとも2つ'one'があります。それは問題ですか?

私はあなたの物語も混乱していると感じました。

シンプルなアイデア、 "順列マッチ"


say so $y.words.all eq @z.any 
:私は @zが終わり xxxを持ち、キーのコメントであることを仮定しました。この答えを

soは、右側の式のブール評価(TrueまたはFalse)を返します。

soの右側の式はJunctionsです。英文の要約は、一度に1つずつ取られた$yの「すべての」単語は、少なくとも1つの要素「@z」に等しい文字列です。

これは簡単な解決策ですか?

+0

raiphありがとうございました!混乱して申し訳ありません。私の質問に言い換えると、この文字列は単語の配列の順列のどれかにマッチしますか?たとえば、文字列が「1a2」で、配列が<1,1,a,2>の場合、配列のすべての順列に2つの「1」があるため、一致しません。文字列 "x1y2zab1"は、配列の順列を含むため一致するはずです。私はこれについて考えています:$ y ~~ m/<{EVAL @ a.permutations.one}> /これはまだ動作していないので、私は個人的にはEVALを好きではありません。私のコードで明快です。ありがとう!!! – lisprogtor

+0

私は、perl6がそのような置換マッチをその基本マッチユーティリティに追加できることを願っています。私が解決しなければならない現実世界のアプリケーションはこれです。ファイルの各行には重要な単語があり、単語はスペースで区切られていてもいなくてもよく、単語の一部だけが分かっています。ありがとう! – lisprogtor

+0

素晴らしい!非常にraiphありがとう! Bag:要素数との一致はきちんとした考えでした。私は、ほとんどの人が私よりもスマートで知識豊かな世界に住んでいることをとてもうれしく思っています:-) – lisprogtor

関連する問題