2014-06-24 2 views
3

가능한 모든 문자열 조합을 생성하려고합니다.가능한 모든 문자열 조합 생성

H9, d1q5z! H9, a2q5z! H9 ... etc

중첩 된 루프를 많이 만들지 않고 MODULO로 영리한 것을 시도 할 것이라고 생각했습니다. ..하지만 벽에 부딪쳤다.

이것은 제가 생각해 낸 자바 스크립트입니다.

var c = [ 
    ['a', 'b', 'c', 'd'], 
    ['1', '2', '3', '4'], 
    ['q', 'w', 'e', 'r'], 
    ['5', '6', '7', '8'], 
    ['z', 'x', 'c', 'v'], 
    ['!', '"', '£', '$'], 
    ['H', 'J', 'K', 'L'], 
    ['9', '8', '7', '6'], 
]; 

var o = document.getElementById('output'); 
var pw = ""; 
var chars = c.length; 

for(var i = 0; i <20; i++) 
{ 
    pw = "" 
    for(var j = 0; j < chars; j++) 
    { 
     pw += c[j][i%4]; 
    } 
    op(pw); 
} 

function op(s) 
{ 
    o.innerHTML = o.innerHTML + "<br>" + s; 
} 

이것은 목록의 처음 20 개를 출력하지만 반복됩니다 ... 나는 거의 가지고 있지만 꽤 없습니다. 도움이나 조언을 주시면 감사하겠습니다.

+0

왜 'c'구조입니까? – Cerbrus

+0

그리고 나는 문자열 연결이 가장 효율적이지 않다는 것을 알고 있지만 이것은 빠르고 빠르며 최적화되지 않았습니다. – Ruskin

+0

숯의 빠르고 더러운 배열 - 마음에 처음 왔어. 데이터는 의미가 없습니다. 단지 임의의 문자입니다. – Ruskin

답변

6

매우 쉬운 재귀 함수 demo을 작성하십시오.

function permutate(abc, memo) { 
    var options; 
    memo = memo || abc.shift().slice(0); 

    if(abc.length) { 
     options = abc.shift(); 

     return permutate(abc, memo.reduce(function(all, item){ 
      return all.concat(options.map(function(option){ 
       return item + option; 
      })) 
     }, []));  
    } 

    return memo; 
}; 

console.log(permutate(c).length); //65536 items 

이상 필수적 접근 방식은

function permutate2(abc) { 
    var options, i, len, tmp, j, optionsLen, 
     memo = abc.pop().slice(0); //copy first the last array 

    while(options = abc.pop()) { //replace recursion 
     tmp = []; 
     optionsLen = options.length; 
     for(i = 0, len = memo.length; i < len; i++) { //for every element in memo 
      for(j = 0; j < optionsLen; j++) { //do cartesian product with options 
       tmp.push(options[j] + memo[i]);  
      } 
     } 
     memo = tmp; 
    } 

    return memo; 
} 
+0

문자열이 잘못된 순서 (abba가 아닌 cba)이지만 그 외의 것 ... - 와우 ... 어떻게 작동하는지 잠시 생각하겠습니다. 고마워요 – Ruskin

+1

'abc.shift'와'abc.pop' 그리고'option + item' 대'item + option'을 가지고 플레이하면 필요한 순서를 얻을 수 있습니다. –

+1

@Ruskin 문제 없음 :) 코드의 특정 라인에 대해 질문이 있으시면 언제든지 물어보십시오. 코드는 실제로 까다로워 보입니다. –

0

이것은 내가 그것을 어떻게입니다 :

어쩌구는 문자 행렬이다
string password; 
bool done = false; 

while (!done) { 
    password = string.Empty; 

    for(int a = 0; a < blah[0].Length; a++) { 
     for(int b = 0; b < blah[1].Length; b++) { 
      for (int c = 0; c < blah[2].Length; c++) { 
       for (int d= 0; d < blah[3].Length; d++) { 
        for (int e = 0; e < blah[4].Length; e++) { 
         for (int f = 0; f < blah[5].Length; f++) { 
          for (int g = 0; g < blah[6].Length; g++) { 
           for (int h = 0; h < blah[7].Length; h++) { 
            password = string.Format(
             "{0}{1}{2}{3}{4}{5}{6}{7}", 
             blah[0][a], 
             blah[1][b], 
             blah[2][c], 
             blah[3][d], 
             blah[4][e], 
             blah[5][f], 
             blah[6][g], 
             blah[7][h]); 

            Console.Out.WriteLine(password); 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

.

추악한 일이지만, Yury의 짧은 대답은 내 머리를 아프게합니다.

+0

감사합니다. Wavy - 똑똑하지만 접근하기가 쉽지 않습니다! (그리고 C#에서)) – Ruskin

+2

흠, C#은 자바 스크립트가 아닌 것처럼 보입니다 :) –

+1

은 C# 일 수 있지만 적어도 Perl처럼 보이지는 않습니다 !!! :) – wavydavy

0
function combinations(str) { 

debugger; 
var arr = []; 
for (var i = 0; i < str.length; i++) 
{ 
    // create an empty string 
    var comb = ""; 
    // loop for substring 
    for (var j = i; j < str.length; j++) 
     { 
     comb+=str[j]; 
     arr.push(comb); 
     } 
} 
    return arr; 

} 
console.log(combinations('output'));