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

Тема в разделе "PHP", создана пользователем Nevep, 21 фев 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Nevep

    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($str1); 
    foreach (
    permute($tail) as $permutation) {
        
    $length strlen($permutation);
        for (
    $i 0$i <= $length$i++) {
            
    $permutations[] = substr($permutation0$i) . $str[0] . substr($permutation$i);
        }
    }

    return 
    $permutations;
    }

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

    ?>
     
  2. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    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($newstr0strlen($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);
     
    Nevep нравится это.
  3. nimnul

    nimnul Создатель

    Регистр.:
    24 мар 2008
    Сообщения:
    15
    Симпатии:
    4
    Ну наверное как-то так ;)
    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($permutation0$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";
    }
    У тебя же решение есть, только поменять функции работы со строками на функции работы с массивами.
     
    Nevep нравится это.
  4. Nevep

    Nevep Постоялец

    Регистр.:
    16 дек 2009
    Сообщения:
    59
    Симпатии:
    8
    Спасибо:yahoo:
    Оба варианта работают
     
  5. Belial

    Belial

    Регистр.:
    1 фев 2010
    Сообщения:
    236
    Симпатии:
    113
Статус темы:
Закрыта.