Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Сильная задача на проверку логики


Автор: Master 21.5.2003, 14:00
Вобчем эта задача, которую я пока затрудняюсь решить (хотя не лапатил над этим)
Нужно сделать функцию считывающую конечную сумму элементов подмоссивов одного массива.
Массивов может быть неопределенное колличество как впрочем и элементов в каждом подмассиве.


Есть массив:

$arr = Array(
Array('1','2','3'),
Array('1','2'),
Array('1','2','3','4','5')
);

Результат:

$arr = Array(
Array('1','1','1'),
Array('1','1','2'),
Array('1','1','3'),
Array('1','1','4'),
Array('1','1','5'),
Array('1','2','1'),
Array('1','2','2'),
Array('1','2','3'),
Array('1','2','4'),
Array('1','2','5'),
Array('2','1','1'),
Array('2','1','2'),
Array('2','1','3'),
Array('2','1','4'),
Array('2','1','5'),
Array('2','2','1'),
Array('2','2','2'),
Array('2','2','3'),
Array('2','2','4'),
Array('2','2','5'),
Array('3','1','1'),
Array('3','1','2'),
Array('3','1','3'),
Array('3','1','4'),
Array('3','1','5'),
Array('3','2','1'),
Array('3','2','2'),
Array('3','2','3'),
Array('3','2','4'),
Array('3','2','5')
);


Ну как? smile.gif

Автор: Kefir 21.5.2003, 15:00
Одно мне стало ясно - функция должна быть рекурсивоной. Вот. Писать сейчас ЛЕНЬ (чтоб её!).

Автор: Master 21.5.2003, 15:03
Да какой угодно. Это исключительно ваше дело. Главное решить задачу.
Я к завтраму постараюсь её решить.

Автор: IZ@TOP 21.5.2003, 17:13
Интересная задачка ... надо бы подумать .... а сначалa такой просто показалась biggrin.gif

Автор: Master 22.5.2003, 09:28
Я вчера вечером 2 часа себе мозги ломал.

Двумя способами пытался решить задачу.
Пробывал через рекуссив, - не вышло. Запутался sad.gif
Пробывал циклами (без рекурсива), тоже загнулся sad.gif

Кто-нибудь решил задачу?
Если нет, то я сегодня вечером ещё помучаюсь smile.gif

Автор: IZ@TOP 22.5.2003, 10:31
Я знаю как ... тока код завтра выложу ...

Автор: Master 22.5.2003, 11:42
Цитата
Я знаю как ... тока код завтра выложу ...


Я тоже сначала думал, что знаю как smile.gif

Автор: Master 23.5.2003, 11:39
Ну что.
Никто не справился?

Я сегодня вечером напишу коды своих попыток с комментариями.
А вы тоже давайте ваши попытки.

Обсудим и попробуем решить коллективно.
Гуру. Тоже подключайтесь smile.gif

Автор: MuToGeN 2.6.2003, 15:40
Код
function subArray($arr)
{
 for($i=0;$i<sizeof($arr);$i++)
 {
   $total*=sizeof($arr[i]);
   $position[i]=0;
 }
 for($i=0;$i<$total;$i++)
 {
   for($j=0;$j<sizeof($arr);$j++)
     $r[i][j]=$arr[j][$position[j]];
   $positionSwitched=false;
   $p=sizeof($arr)-1;
   while(!$positionSwitched)
   {
     $position[$p]++;
     if($position[$p]>=sizeof($arr[$p])
     {
       $position[$p]=0;
       $p--;
     }
     else
       $positionSwitched=true;
   }
 }
 return $r;
}
В тексте возможны ошибки (даже синтаксические), т.к. эту функцию я вообще не проверял. Но теоретически все должно работать, хотя алгоритм и не самый лучший.

Автор: Master 3.6.2003, 10:26
Боже мой, нифига тут не работает, а ошибок синтаксических куча.

скобки не считаем:
$ не подставляем, переменные не определяем
и в итоге все загибается, караул...

ты бы хоть проверил это перед публикацией.

Автор: MuToGeN 8.6.2003, 14:42
Master, ну уж извиняюсь, PHP с Апачем только ради этого ставить и конфигурить не охота было. Т.к. последнее время перешел на C++, то от $ перед именами переменных отвык. Будет время - все подправлю и отлажу.

Автор: MuToGeN 9.6.2003, 12:17
Проанализировал я этот алгоритм. Единственная семантическая ошибка - в этом месте:
Код
  while(!$positionSwitched)
  {
    $position[$p]++;
    if($position[$p]>=sizeof($arr[$p])
    {
      $position[$p]=0;
      $p--;
    }
    else
      $positionSwitched=true;
  }

Когда $i == $total, то $p становится равным -1, а это недопустимое значение. Так что должно быть так:
Код
  while(!$positionSwitched &&$i!=$total )
  {
    $position[$p]++;
    if($position[$p]>=sizeof($arr[$p])
    {
      $position[$p]=0;
      $p--;
    }
    else
      $positionSwitched=true;
  }
Для исправления всех синтаксических ошибок времени нет, так же как и для того, чтоб детально расписать принцип работы алгоритма.

Автор: MuToGeN 9.6.2003, 12:43
Цитата
Боже мой, нифига тут не работает
Master, предложи свое. А то кроме моего кода (действительно, с кучей ошибок) никто ничего другого пока не опубликовал.

Автор: Master 9.6.2003, 12:44
неа. не работаетsmile.gif

parse error кричит на эту строку:
if ($position[$p]>=sizeof($arr[$p]) {

Автор: MuToGeN 9.6.2003, 12:51
if ($position[$p]>=sizeof($arr[$p]))
Нужна еще одна скобка

Автор: Master 9.6.2003, 12:58
и где должна определяться переменная $total и чему должна равняться?

Автор: MuToGeN 9.6.2003, 13:24
Блин, действительно, примитивнейшая ошибка.
Цитата

function subArray($arr)
{
  $total=1;
  for($i=0;$i<sizeof($arr);$i++)
  {
    $total*=sizeof($arr[i]);
    $position[i]=0;
  }
    итд...
Должна она равняться максимальному первому индексу возвращаемого массива...

Автор: Master 10.6.2003, 09:26
Код
<?php
function subArray($arr)
{
$total = 1;
for($i=0;$i<sizeof($arr);$i++)
{
  $total*=sizeof($arr[$i]);
  $position[$i]=0;
}
for($i=0;$i<$total;$i++)
{
  for($j=0;$j<sizeof($arr);$j++)
    $r[$i][$j]=$arr[$j][$position[$j]];
  $positionSwitched=false;
  $p=sizeof($arr)-1;
  while ((!$positionSwitched) && ($i!=$total) ) {
   $position[$p]++;
   if ($position[$p]>=sizeof($arr[$p])) {
     $position[$p]=0;
     $p--;
   } else {
     $positionSwitched = true;
   }
  }
 }
return $r;
}

$arr = Array (
'0' => Array ('1','2','3'),
'1' => Array ('1','2','3'),
'2' => Array ('1','2','3'),
);

print_r (subArray($arr));

?>


Вот результат:

Warning: Undefined offset: -1 in d:\dmitriy\sites\test\www\arrcomplete.php on line 17

Warning: Undefined offset: -1 in d:\dmitriy\sites\test\www\arrcomplete.php on line 18

Warning: Undefined offset: -2 in d:\dmitriy\sites\test\www\arrcomplete.php on line 17

Warning: Undefined offset: -2 in d:\dmitriy\sites\test\www\arrcomplete.php on line 18

Warning: Undefined offset: -3 in d:\dmitriy\sites\test\www\arrcomplete.php on line 17

и т.д.

Прога глючит sad.gif
Хватит, сначала проверь её хотябы на хостинге если он есть!

Автор: MuToGeN 10.6.2003, 10:42
Хостинга нет sad.gif Но обкатать ее постараюсь в ближайшее время.

Автор: MuToGeN 20.6.2003, 12:06
Код
<?php
function subArray($arr)
{
 $total=1;
 for($i=0;$i<sizeof($arr);$i++)
 {
   $total*=sizeof($arr[$i]);
   $position[$i]=0;
 }
 for($i=0;$i<$total;$i++)
 {
   for($j=0;$j<sizeof($arr);$j++)
     $r[$i][$j]=$arr[$j][$position[$j]];
   $positionSwitched=false;
   $p=sizeof($arr)-1;
   while(!$positionSwitched)
   {
     $position[$p]++;
     if($position[$p]>=sizeof($arr[$p]))
     {
       $position[$p]=0;
       $p--;
       if($p==-1)
         $positionSwitched=true;
     }
     else
       $positionSwitched=true;
   }
 }
 return $r;
}
$arr=Array (
Array('1','2','3','4','5'),
Array('a','b','c','d'),
Array('V','W','X','Y','Z'));
$arr2=subArray($arr);
echo "Исходный массив:<br/>\n".
    "<table>\n";
for($i=0;$i<sizeof($arr);$i++)
{
 echo "<tr>\n";
 for($j=0;$j<sizeof($arr[$i]);$j++)
   echo "<td>".$arr[$i][$j]."</td>\n";
 echo "</tr>\n";
}
echo "</table>\n".
    "Результат:<br/>\n".
    "<table>\n";
for($i=0;$i<sizeof($arr2);$i++)
{
 echo "<tr>\n";
 for($j=0;$j<sizeof($arr2[$i]);$j++)
   echo "<td>".$arr2[$i][$j]."</td>\n";
 echo "</tr>\n";
}
echo "</table>\n";
?>
Проверенно на людях smile.gif Работает на 100%

Автор: MuToGeN 20.6.2003, 15:22
Цитата
Вот результат:
Warning: Undefined offset: -1 in d:\dmitriy\sites\test\www\arrcomplete.php on line 17
Warning: Undefined offset: -1 in d:\dmitriy\sites\test\www\arrcomplete.php on line 18
Warning: Undefined offset: -2 in d:\dmitriy\sites\test\www\arrcomplete.php on line 17
Warning: Undefined offset: -2 in d:\dmitriy\sites\test\www\arrcomplete.php on line 18
Это все потому, что $i изменяется от 0 до $total-1, а в условии прекращения while было задано ... && ($i != $total)..... Оно так и так никогда не равно... Тоже моя ошибка. Но последний исходник точно работает.

Автор: Master 21.6.2003, 09:53
И прада работает. Respect. Код поизучаю. Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)