| |
|
|
| | проблема такая
есть массив символов $mas=array("a","b","c","d","e","f","x","1","2","3","4","5")
есть строка из 10 символов (a..z,0..9) из которых цифр не более 4 $stroca="hfls3h5nd8"
цель скрипта найти в строке цифры и подставить вместо них символы из массива $mas, так если цифра в строке одна то разных вариантов 12, если цифры 3, то вариантов 12^3=1728.
как лутше произвести перебор? хотябы общее направление мыслей, не надо готового решения.
а то я думал задачка на 5 минут, а сам уже часа 4 сижу, ничего путнего в голову не приходит, туплю. | |
| |
|
|
| |
|
|
| |
для: adsd
(05.06.2007 в 14:16)
| | | рандомом чтоли заменить? или определенные элементы использовать? | |
| |
|
|
| |
|
|
| |
для: adsd
(05.06.2007 в 14:16)
| | | тот редкий случай, когда рекурсивное решение будет коротким и красивым, ... и вероятно, оправданным... а итеративное - длинным и ужасно запутанным. | |
| |
|
|
| |
|
|
| |
для: adsd
(05.06.2007 в 14:16)
| | | Нужно все возможные варианты? Или один случайный? Если один случайный то
<?
$mas=array("a","b","c","d","e","f","x","1","2","3","4","5");
$str="hfls3h5nd8";
while(preg_match("\d"), $str)
$str = preg_replace("/\d/", array_rand($mas), $str, 1);
?>
|
| |
| |
|
|
| |
|
|
| |
для: Temnovit
(05.06.2007 в 14:28)
| | | рандом не пойдёт.
нужны все возможные решения! или хотя бы половина :)
и вроде понимаю что рекурся будет самое то, но с рекурсией дела никогда не имел и наверное теперь она мне мстит (мозг закипает) | |
| |
|
|
| |
|
|
| |
для: adsd
(05.06.2007 в 14:48)
| | | Интересную вы задачу придумали :) Вызов прямо. Начнем с малого. Если просто тупо перебирать все возможные варианты, то можно так :
<?
$array = array('a', 'b', 'c', 'd', 'e', 'f');
//все комбинации из 2-ех символов
for($i=0; $i<count($array); $i++)
for($j=0; $j<count($array); $j++)
echo $array[$i].'/'.$array[$j].'<br>';
//все комбинации из 3-ех символов
for($i=0; $i<count($array); $i++)
for($j=0; $j<count($array); $j++)
for($k=0; $k<count($array); $k++)
echo $array[$i].'/'.$array[$j].'/'.$array[$k].'<br>';
//и т.д.
?>
|
Способ топорный и неуклюжий. Думаем как перебирать с N символами... | |
| |
|
|
| |
|
|
| |
для: Temnovit
(05.06.2007 в 15:22)
| | | можно конечно так, если сегодня ничего путнего с рекурсией не придумаю, то так и сделаю. | |
| |
|
|
| |
|
|
| |
для: adsd
(05.06.2007 в 14:16)
| | |
<?php
$mas=array("a","b","c","d","e","f","x","1","2","3","4","5");
$str="hfls3h5nd8";
$str=">>3>>>5>8>"; //строка изменена, так просто лучше видно когда заменяется :)
$i=0;
$counter=0; //глобальный счетчик
/*
*мне показалось удобнее делать с "плэйсхолдерами"
*Это когда строка $str=">>4>>>4>3>"; заменяется на $str=">>{x1}>>>{x2}>{x3}>";
*а потом уже делается перебор
*/
$s=preg_replace_callback('|\d{1}|',repl,$str);
function repl($s)
{
//это функция обратного вызова, считает число цифр в строке и заменяет их на плэйсхолдеры
GLOBAL $i;
$i++;
return "{x{$i}}";
}
function perebor($num,$s)
{
/*
*эта функция заменяет плэйсхолдер номер $num на нужное значение, при этом увеличивая счетчик
*/
GLOBAL $mas,$counter;
$arr=array();
foreach ($mas as $v)
{
$variant=str_replace("{x{$num}}",$v,$s); //замена плэйсхолдера номер $num
if ($num==1)
{
/*
*собственно, вот здесь и содержится один из многих вариантов
*в данном случаи он просто выводится на обозрение
*/
echo $variant.'<br>';
$counter++; //увеличиваем "считалку"
}
$arr[]=$variant; //для обработки других плэйсхолдеров надо записать их в массив
}
return $arr;
}
function sorting($arr,$i)
{
/*
*это рекурсивная функция, которая вызывает сама себя, пока все плэйсхолдеры не заменены
*/
$i--;
foreach ($arr as $v1)
{
$prev=perebor($i,$v1);
if ($i>1)
{
sorting($prev,$i); //рекуривный вызов
}
}
}
sorting(perebor($i,$s),$i); //начнем перебор, далее рекурсивная функция будет вызывать сама себя
echo '<h1>'.$counter.'</h1>';
?>
|
выводит пресловутое 1728, должно работать с любым числом цифр.
думаю, что можно это сделать проще... | |
| |
|
|
| |
|
|
| |
для: Disable
(05.06.2007 в 16:57)
| | | спасибо огромное! сейчас буду разбираться.
а у меня с рекурсией какие-то невообразимые массивы строк выводило.
если не секрет, сколько времени на решение вы потратили? к чему стремиться? | |
| |
|
|
| |
|
|
| |
для: adsd
(05.06.2007 в 17:06)
| | | около 30 минут, получались сначала бесконечные циклы, что очень мешает процессу :)
самый часто используемый пример рекурсии:
-обход структуры каталога с другими каталогами (любой вложенности) | |
| |
|
|