2017-09-17 1 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; 

문제점 내 함수가 배열에 모든 고유 단어를 일치하지만, 중복 단어의 순열을 구별 할 수 없습니다 :

는 내가 지금 가지고있는 것은 이것이다. 단어가 일치하는지 더 많은 코드를 추가 할 수 있지만 "순열 일치"라는 단순한 아이디어를 달성하기위한 코드는 더 이상 필요하지 않습니다. 어떤 제안? Y, 문자열, 모두 포함

테스트하는 것이 : 감사

+1

달성하고자하는 것이 분명하지 않습니다. 배열'n' 번에 포함 된 모든 요소가 정확하게'n' 번 문자열에 나타나는지 확인하고 싶습니까? 또는 다른 것? – smls

+1

당신은 보았고 '봉지'와 연산자를 설정 했습니까? 당신이 두 가지 가방을 어떤면에서 (신분/하위 집합) 비교하고 싶다는 느낌. 너가 원하는게 그거야? –

+0

두 목록을 모두 정렬 할 수 없습니까? –

답변

3

모든 사람의 의견을 바탕으로 새로운 대답

, 여기에 새로운 솔루션 뒤에 나는 지금 그것을 이해 문제의 재 작성,이다 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'이 있습니다. 그게 문제 야?

당신의 서술도 혼란 스럽습니다. 내가 @z 것으로 가정 한이 답변

은 끝에 xxx을 가지고 있으며, 키 코멘트입니다 :

간단한 아이디어, "순열 일치"


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

so 오른쪽에있는 표현식의 부울 값 (True 또는 False)을 반환합니다.

so의 표현식은 Junctions입니다.그것의 영어 산문 요약은 $y에있는 "모든 단어"가 한 번에 하나씩 취해지며 적어도 하나의 요소 인 @z '과 같습니다.

간단한 해결책인가요?

+0

raiph에 감사드립니다! 혼란스러워서 미안해. 다시 말해서 내 질문을 다시 말해 보겠습니다.이 문자열은 단어 배열의 순열과 일치합니까? 예를 들어, 문자열이 "1a2"이고 배열이 <1,1,a,2> 인 경우 배열의 모든 순열에 두 개의 "1"이 있기 때문에 일치하지 않습니다. 문자열 "x1y2zab1"은 배열의 순열을 포함하므로 일치해야합니다. 나는 이것에 대해 생각하고있다 : $ y ~~ m/<{EVAL @ a.permutations.one}>/그러나 이것은 아직 작동하지 않고 있으며 개인적으로 EVAL을 사용하기를 좋아하지 않는다. 내 코드에서 선명도. 감사 !!! – lisprogtor

+0

perl6이 기본 일치 유틸리티에 순열 일치를 추가 할 수 있기를 바랍니다. 내가 풀어야 할 현실 세계의 응용은 이것이다. 파일의 각 행은 어떤 순서로든 중요한 단어를 포함하고 있으며 단어는 공백으로 구분되거나 구분되지 않을 수 있습니다. 일부 단어의 일부만 알고 있으며 이러한 단어 부분을 포함하는 행을 원합니다. 감사 ! – lisprogtor

+0

대단한 !!! 대단히 raiph 감사합니다! 가방, : 요소 수와 일치하는 g는 깔끔한 아이디어였습니다. 나는 대부분의 사람들이 내가 가지고있는 것보다 더 똑똑하고 지식이 풍부한 세상에서 살기가 매우 행복하다. – lisprogtor