2010-01-04 7 views
1

저는이 문자열에서 다양한 요소를 결합 할 수있는 방법을 몇 가지 파악하려고합니다.가능한 조합의 수를 결정하십시오.

"{Hello|Hi|Hey} {world|earth}{!|.|?}" 

각 항목 (파이프로 분리됨)은 각 그룹 ({})에서 임의로 선택되고 단일 문자열로 결합됩니다.

Hello world. 
Hi earth? 
Hey world. 
Hi world? 

나는이 추측하고있어이 순열의 유형입니다,하지만 난이 권리를 얻고 있는지 확인하려면 :

그래서 위의 "템플릿"생산할 수 있습니다.

"n"중첩 된 항목으로 작업하면 정말 좋을 것입니다.

"{{Hello|Hi|Hey} {world|earth}|{Goodbye|farewell} {noobs|n3wbz|n00blets}}" 

가능한 경우 대답을 얻으려면 무작위 대행 반복보다 수학/통계 기반 솔루션을 선호합니다.

감사합니다.

답변

6

첫 번째 예에서는 3 x 2 x 3 = 18 조합이 있습니다.

두 번째 예는 3 x 4 x 2 x 3 = 72 조합입니다.

{a|b}|{c|d}이 무슨 뜻인지 잘 모르겠지만 (a 또는 b) 또는 (c 또는 d) 중 하나를 선택하는 것은 4 가지 중 하나를 선택한다고 가정합니다.

here 또는 here의 조합으로 읽을 수 있습니다.


업데이트 : 예, 간단합니다. 문제는 숫자의 숫자 조합 수를 계산하는 것과 같습니다. 예를 들어, ATM PIN 번호 조합 (4 자리 10 진수)을 찾으려면 {0-9}, {0-9}, {0-9}, {0-9} 세트가 있습니다. 첫 번째 선택 (= 10)에는 10 가지 가능성이 있습니다. 각 숫자에 대해 두 번째 선택 항목에 10 가지 가능성이 있습니다 (= 10 × 10). 그 각각에 대해 세 번째 (= 10 10) 10 번째 네 번째 (1 10 = 10,000)에 10이 있습니다. 4 자리 10 진수에 대해 10,000 개의 가능성이 있다는 것이 직관적으로 분명해야합니다.

이 예에서는 숫자 집합 대신 단어 집합을 사용하지만 원칙은 동일합니다. 조합의 수는 세트에있는 항목의 설정 1 × 수있는 항목의 수를 2 × ... 등 세트 N의 항목 × 수

당신이에 제한을 가하고 시작하거나 때 그것은 더 복잡해진다 동일한 세트에서 여러 항목 선택하기 등그 숫자

그래서 곱 괄호 내에있는 각각의 괄호 쌍

  • 를 들어, vbars 내에서 분리 얼마나 많은 조합

    1. 수 :

  • +0

    정말 간단합니다. 나는 어떤 종류의 순열을 사용할 필요가 없다? (http://en.wikipedia.org/wiki/Permutation) – erikcw

    +0

    @erikcw 위의 업데이트를 참조하십시오. – Seth

    +0

    하위 선택 항목 {world | earth} | {Goodbye | Farewell}을 사용하면 구문 분석 알고리즘을 반복적으로 실행하여 하위 섹션 값을 가져 와서 처리를 계속할 수 있습니다. –

    0

    문제는 두 가지 간단한 하위 문제로 고장 1 일반 정규 표현식 + 루핑 접근 방식을 사용합니다.

    import re 
    
    def docount(thestring): 
        x = re.compile(r'{([^}]}') 
        counts = [mo.group(0).count('|')+1 for mo in x.finditer(thestring)] 
        result = 1 
        for c in counts: result *= c 
        return result 
    

    2도 포함되어 있습니다. 어쨌든 가장 사소한 부분입니다. (예를 들어, reduce을 그와 같은 목적으로 사용하고 싶다면 마지막 세 줄 대신에 OK입니다 .-)).

    관련 문제