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

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

trooll

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

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

Естественно, работать будет довольно медленно.
 
Если скорость не важна, то можно решать в лоб - забить все цифры в массив и начиная с 111...111...

Нет, этот вариант был отклонен сразу. Сильно долгая обработка.
Тут дело такое, черт с ним если начальное число 4 значное а, если 9, то тут вообще засада получается.
 
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]
 
4 вложенных цикла делай, для каждой позиции в числе, от 1 до этого числа...

Вариант интересный, но генерирует всего 2 варианта с 4 значного числа.

Допустим с 2232 генерит 1111 и 1121, что не есть гуд.
Так как вариантов с этого числа на много больше (смотри первый пост).
 
генерит только два, потому что строгое условие
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>";
}
}
}
}
?>
 
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);
 
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));
 
PHP:
$k = 2222;
$z= '';
for($i=0; $i<=strlen($k); $i++) {
$z .= rand(0,$k{$i}));
}

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