2015-01-16 5 views
-2

Я ищу это stackoverflow question для ответа на Javascript.Найти все строчные и строчные комбинации строк в Javascript

Так что, если мой вход "слово", то функция должна возвращать:

слово, Слово, WORD, WORD, WORD, WORD, и т.д ..

вот что я до сих пор, но он только производит перестановки (ничего не капитализирует)

var perm = function(str){ 
var results = []; 

var combos = function(reference, appendTo){ 
appendTo = appendTo || ""; 
if(reference.length === 0) { 
    results.push(appendTo); 
} 
for(var i = 0; i < reference.length; i++){ 
    var current = reference.splice(i, 1); 
    combos(reference, appendTo+current); 
    reference.splice(i, 0, current) 
} 
} 
combos(str.split("")); 
return results; 
} 
perm("word"); 
+0

Так где ваш код? Я не могу ничего прокомментировать. –

+0

Я собираюсь пойти и закрыть это как «порядок работы». Если это вопрос об устранении неполадок, покажите нам работу, которая у вас есть, и расскажите о трудностях, с которыми вы решаете проблему. –

+0

точно так же, как вы знаете, сделайте миллион случайных версий с верхним и нижним регистром, затем фильтруйте дубликаты – dandavis

ответ

2

Это так же просто, как генерация перестановки ns на любом языке с двоичной логикой.

В качестве простого примера ниже фрагмента кода, рассмотрим следующую таблицу, в которой левый столбец представляет собой двоичное представление текущей перестановки и правый столбец в результате капитализации:

0000 | word 
1000 | Word 
0100 | wOrd 
1100 | WOrd 
... 
1111 | WORD 

// Used to display the results 
 
const write = (msg) => { 
 
    document.body.appendChild(document.createElement('div')).innerHTML = msg; 
 
}; 
 

 
const input = "word"; 
 
const letters = input.split(""); 
 
const permCount = 1 << input.length; 
 

 
for (let perm = 0; perm < permCount; perm++) { 
 
    // Update the capitalization depending on the current permutation 
 
    letters.reduce((perm, letter, i) => { 
 
    letters[i] = (perm & 1) ? letter.toUpperCase() : letter.toLowerCase(); 
 
    return perm >> 1; 
 
    }, perm); 
 

 
    const result = letters.join(""); 
 
    write(result); 
 
}

+0

спасибо, что это хорошо работает. Можете ли вы объяснить, как работает второй цикл? В частности, мне интересно, как это выходит из цикла, я не привык видеть циклы, написанные таким образом. – user3068590

+0

Использование 'for (...; j; ...)' эквивалентно 'for (...; j! == 0; ...)'. Обратите внимание на позиционирование точек с запятой в приведенном выше коде. Мы инициализируем две переменные во внутреннем цикле, затем проверяем условие и затем выполняем две операции на каждой итерации. Хотя это не чистое по стилю, это довольно прямолинейно, если вы знакомы с концепцией бинарных перестановок. – Nit

+0

имеет смысл сейчас, спасибо! – user3068590

1

С учетом решения Nit, я хотел бы предложить немного рефакторизованное решение, которое может быть проще следовать

var perm = function(str){ 
    var results = []; 
    var arr = str.split(""); 
    var len = Math.pow(arr.length, 2); 

    for(var i = 0; i < len; i++){ 
     for(var k= 0, j = i; k < arr.length; k++, j >>=1){ 
     arr[k] = (j & 1) ? arr[k].toUpperCase() : arr[k].toLowerCase(); 
     } 
     var combo = arr.join(""); 
     results.push(combo); 
    } 
    return results; 
    } 

    perm("word"); 
0

var s = "word"; 
 
var sp = s.split(""); 
 
for (var i = 0, l = 1 << s.length; i < l; i++) { 
 
    for (var j = i, k = 0; j; j >>= 1, k++) { 
 
    sp[k] = (j & 1) ? sp[k].toUpperCase() : sp[k].toLowerCase(); 
 
    } 
 
    var st = sp.join(""); 
 
    var d = document.createElement("p"); 
 
    d.appendChild(document.createTextNode(st)); 
 
    document.body.appendChild(d); 
 
}