Нужно получить все комбинации слов
Есть текст из нескольких слов, нужно перебрать каждое сочетание этих слов через запятую в одну строчку. Так как таких фраз для перебора около тысячи.
Исходная фраза может состоять из разного количества слов!(Исходная фраза может состоять как из 2 слов так и из 5).
Порядок слов в комбинациях тоже должен учитываться! (то есть кошка собака != собака кошка).
Перебор должен состоять по принципу abc => abc, ab, ba, ac,
ca, acb, bca, a, b, c и так далее.
Приветствуются варианты разрешения данной проблемы на любом языке программирования (JS в приоритете). Если вариант возможет в Эксель формулами, будет только лучше. За правильное решение готов отблагодарить денюжкой на карту. Пример в коде:
div {
display: block;
width: 500px;
margin: 0 auto;
border: 1px solid #000;
}
p {
text-wrap: wrap
}
* {
text-indent: 20px;
}
<div>
<h1>Исходная фраза:</h1>
<p>кошка собака дом</p>
<h1>Результативная фраза:</h1>
<p>Кошка собака дом, кошка дом собака, кошка дом, кошка собака, кошка, собака кошка, собака дом, собака, собака дом кошка, собака кошка дом, дом, дом собака, дом кошка, дом собака кошка, дом кошка собака</p>
</div>
Ответы (2 шт):
Пример рекурсивной генерации на Python. Функция берёт текущую комбинацию, и вставляет в неё очередной элемент (с номером idx) во все возможные места, а также пропускает данный элемент (второй вызов gencomb)
def gencombs(comb, lst, idx):
if idx >= len(lst):
print(comb)
else:
for i in range(len(comb),-1, -1):
gencombs(comb[:i] + [lst[idx]] + comb[i:], lst, idx + 1)
gencombs(comb, lst, idx + 1)
gencombs([],"abc", 0)
['a', 'b', 'c']
['a', 'c', 'b']
['c', 'a', 'b']
['a', 'b']
['b', 'a', 'c']
['b', 'c', 'a']
['c', 'b', 'a']
['b', 'a']
['a', 'c']
['c', 'a']
['a']
['b', 'c']
['c', 'b']
['b']
['c']
[]
let str = 'кошка, собака, дом';
function genaCrocodile(str) {
let arr = str.split(', ');
let set = new Set();
for (let i = arr.length; i > 0; i--) {
for (let j = 0; j < 100000; j++) {
let randomArr = arr.slice(0).sort(() => Math.random() - 0.5);
if (i !== arr.length) {
randomArr.length = i;
}
set.add(randomArr.join(' '));
}
}
return [...set].join(', ');
}
console.log(genaCrocodile(str));