Комбинаторика слов

Статус
В этой теме нельзя размещать новые ответы.

Nevep

Постоялец
Регистрация
16 Дек 2009
Сообщения
59
Реакции
8
Ищу скрипт комбинаторики слов в строке, который из строки "Nulled Warez Scripts" сделал бы массив:
Nulled Warez Scripts
Nulled Scripts Warez
Warez Scripts Nulled
Warez Nulled Scripts
Scripts Warez Nulled
Scripts Nulled Warez
6 элементов потому что 3! (факториал) = 3*2*1=6, подробнее тут ru.wikipedia.org/wiki/Комбинаторика
Нашёл похожий скрипт комбинаторики символов в слове. Т.е. из слова "asd" создаёт массив:
asd
ads
sad
sda
das
dsa
Код:
PHP:
<?php
function permute($str) {

if (strlen($str) < 2) {
    return array($str);
}
$permutations = array();
$tail = substr($str, 1); 
foreach (permute($tail) as $permutation) {
    $length = strlen($permutation);
    for ($i = 0; $i <= $length; $i++) {
        $permutations[] = substr($permutation, 0, $i) . $str[0] . substr($permutation, $i);
    }
}

return $permutations;
}

$er=array_unique(permute("asd"));
foreach($er as $zr){
	echo($zr."<br>");
}

?>
 
PHP:
function factorial($count, $num = 1) # Функция вычисления факториала
{
    while($count > 0)
    {
        $num *= $count;
        $count --;  
    }    
    return $num;
}

function permutate($words, $count, $num) # Функция пермутации слов
{
    $newword = "";
    $perm = array();
    
    while(count($perm) < $num)
    {       
        $newstr = "";
    
        while(str_word_count($newstr) < $count)
        {
            $newword = $words[array_rand($words)];
            if(stripos($newstr, $newword) === false)
            $newstr .= $newword." ";  
        }
    
        $newstr = substr($newstr, 0, strlen($newstr)-1);
    
        if(!in_array($newstr, $perm))
        {
            $perm[] = $newstr;
        }  
    }    
    return $perm;
}

$perm = array(); # массив, который будет содержать все возможные пермутации
$str = "Nulled Warez Scripts"; # Исходная строка
$words = split(" ",$str); # Разбиваем строку на слова
$count = count($words); # Вычисляем кол-во слов в строке

$num = factorial($count);
$perm = permutate($words, $count, $num);
 
Ну наверное как-то так ;)
PHP:
<?php
function permute($arr)
{
    if (count($arr) < 2) return array($arr);
    $permutations = array();
    $first = array_shift($arr);
    foreach (permute($arr) as $permutation) {
        for ($i = 0; $i <= count($permutation); $i++) {
            $permutations[] = array_merge(
                array_slice($permutation, 0, $i),
                array($first),
                array_slice($permutation, $i)
            );
        }
    }
    return $permutations;
}

$str   = ' Nulled, Warez Scripts ';
$words = preg_split('/[\s,]+/', trim($str));
foreach (permute($words) as $w) {
    echo join(' ', $w), "<br />\n";
}
У тебя же решение есть, только поменять функции работы со строками на функции работы с массивами.
 
Спасибо:yahoo:
Оба варианта работают
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху