Все возможные вариации (PHP)

Тема в разделе "PHP", создана пользователем trooll, 8 окт 2009.

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

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Доброго времени суток.
    В общем прошу помощи в решении одной задачи.
    Задача сгенерировать все возможные вариации, допустим с цифры 2232, при этом значения не должны повторяться. Но результат генерации не должен быть просто диапазоном от 0 до 2232, в результат генерации должны входить только те значения которые такой же длины как и начальное вхождение, так же каждая цифра в результате генерации не должна быть меньше нуля или больше начального значения.
    То есть если разбить начальное значение на составные части:
    2232 >>> "2" "2" "3" "2"
    мы получим четыре отдельные цифры. Так вот в сгенерированном числе допустим 1 цифра не может меньше 0 или больше цифры начального значении и так далее.
    пример:
    начальное значение:
    2232
    результат генерации:
    1111
    1211
    1121
    1112
    2111
    2121
    2112
    2222
    1131
    2131
    1231
    1132
     
  2. potuga

    potuga

    Регистр.:
    22 сен 2009
    Сообщения:
    376
    Симпатии:
    91
    Если скорость не важна, то можно решать в лоб - забить все цифры в массив и начиная с 111...111 увеличивать в циклах сначала последнее значение (конечно, учитывая ограничение из исходного числа). Далее увеличиваешь предпоследнее и опять прогоняешь последнее. И так до первой цифры.

    Естественно, работать будет довольно медленно.
     
  3. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Нет, этот вариант был отклонен сразу. Сильно долгая обработка.
    Тут дело такое, черт с ним если начальное число 4 значное а, если 9, то тут вообще засада получается.
     
  4. IntenT

    IntenT Создатель

    Регистр.:
    28 янв 2008
    Сообщения:
    40
    Симпатии:
    5
    4 вложенных цикла делай, для каждой позиции в числе, от 1 до этого числа

    Код:
    for($i1=1; $i1<2; $i1++){
    for($i2=1; $i2<2; $i2++){
    for($i3=1; $i3<3; $i3++){
    for($i4=1; $i4<2; $i4++){
    echo $i1.$i2.$i3.$i4."<br>";
    }
    }
    }
    }
    [CODE]
     
  5. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Вариант интересный, но генерирует всего 2 варианта с 4 значного числа.

    Допустим с 2232 генерит 1111 и 1121, что не есть гуд.
    Так как вариантов с этого числа на много больше (смотри первый пост).
     
  6. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    генерит только два, потому что строгое условие
    PHP:
    <?php
    for($i1=1$i1<=2$i1++){
    for(
    $i2=1$i2<=2$i2++){
    for(
    $i3=1$i3<=3$i3++){
    for(
    $i4=1$i4<=2$i4++){
    echo 
    $i1.$i2.$i3.$i4."<br>";
    }
    }
    }
    }
    ?>
     
  7. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Зарание извеняюсь

    Не сочтите за фдуд но, чего то не догоняю...
    Как надо сделать? Что бы нормально генерил?
     
  8. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    PHP:
    $x '2232';
    $num '';
    $lenght strlen($x);
    $pow 0;
    $max 0;
    $arr = array();
    $needle = array();

    for(
    $i=0;$i<$lenght;$i++)
    {
        if(
    $max $x[$i]) $max $x[$i];
    }

    $pow pow($max,$lenght);

    while(
    count($arr)<$pow)
    {
        for(
    $j=0;$j<$lenght;$j++)
        {
            
    $num .= mt_rand(1,$max);
        }
        if(!
    in_array($num,$arr)) $arr[] = $num;
        
    $num '';
    }

    foreach(
    $arr as $y)
    {
        if(
    $y <= $x$needle[] = $y;
    }

    var_dump($needle);
     
  9. tlittle

    tlittle Постоялец

    Регистр.:
    26 мар 2009
    Сообщения:
    74
    Симпатии:
    13
    PHP:
    $str="2232";

    function 
    get_all($str) {
        
        if (
    strlen($str)>1) {
            
    $prev_array=get_all(substr($str,1,strlen($str)-1));
        } else 
    $prev_array=Array('');

        for (
    $ch=0;$ch<=$str[0];$ch++) {
            for (
    $i=0;$i<count($prev_array);$i++) {
                
    $cur_array[]=$ch.$prev_array[$i];
            }
        }
        return (
    $cur_array);
    }

    print_r(get_all($str));

     
    trooll нравится это.
  10. oraculseed

    oraculseed Постоялец

    Регистр.:
    1 янв 2009
    Сообщения:
    152
    Симпатии:
    10
    PHP:
    $k 2222;
    $z'';
    for(
    $i=0$i<=strlen($k); $i++) {
    $z .= rand(0,$k{$i}));
    }
    ... эх сорри немного не то
     
Статус темы:
Закрыта.