Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Посоветуйте алгоритм перебора вариантов

Сообщения:  [1-9] 

 
 автор: Владимир55   (02.10.2009 в 23:56)   письмо автору
 
   для: cheops   (02.10.2009 в 22:54)
 

Вот примерно на этом у меня все и застревало...

  Ответить  
 
 автор: cheops   (02.10.2009 в 22:54)   письмо автору
 
   для: Владимир55   (02.10.2009 в 22:37)
 

Нужно выкручиваться через рекурсию - если имеется переменное количество сумм - верный признак (можно, конечно и без рекурсии обойтись, но на мой взгляд сложнее получится)... подумать нужно как тут лучше подойти...

  Ответить  
 
 автор: Владимир55   (02.10.2009 в 22:37)   письмо автору
 
   для: cheops   (02.10.2009 в 20:46)
 

Получается, что я недостаточно четко сформулировал задачу. Не учел, что решение может пойти таким путем, когда количество групп синонимов станет элементом кода.

В реале количество групп синонимов заренее неизвестно и может быть достаточно большим. Например, одно четверостишие, а их может быть много, имеет такой вид

Пришла/Ушла/Подошла/Не дошла = пора/такая пора/такая минута/эпоха =, = чтоб/чтобы/когда/ = истинный/действительный/реальный= /мудрец/мудрый человек/философ/мыслитель*
О разуме/Про разум = поведал/рассказал= наконец/в конце концов=.*
Яви/Покажи/Предъяви = нам/всем/людям = слово/словечко/фразу = , восхваляя/нахваливая/превознося = разум/мышление =, *
И поучай/И наставляй/И научи/ = людей/людишек = своим/свойским/личным = рассказом/повествованием =.


Здесь группы синонимов разделены знаками равентства, а фразы зыездочками.

При таком представлении информации нетрудно получить массивы вида
$content[] = array(синонимы); 
столько, сколько их потребуется.

Но от количества групп синонимов в Вашем коде зависит число операторов цикла вида
for($i = 0; $i < count($content[0]); $i++)


Как тут быть?

  Ответить  
 
 автор: cheops   (02.10.2009 в 20:46)   письмо автору
 
   для: Владимир55   (02.10.2009 в 20:10)
 

Вообще-то это сумма сумм - для таких задач наиболее всего рекурсия подходит, но если отталкиваться от существующего примера, то без рекурсии двумерным массивом можно воспользоваться примерно так
<?php
  $content
[0] = array("Пришла","Ушла","Подошла","Не дошла");
  
$content[1] = array("пора","такая пора","такая минута","эпоха");
  
$content[2] = array("чтоб","что бы","когда");
  
$content[3] = array("истинный","действительный","реальный");
  
$content[4] = array("мудрец","мудрый человек","философ","мыслитель");

  for(
$i 0$i count($content[0]); $i++)
  for(
$j 0$j count($content[1]); $j++)
  for(
$k 0$k count($content[2]); $k++)
  for(
$l 0$l count($content[3]); $l++)
  for(
$n 0$n count($content[4]); $n++)
  {
    echo 
$content[0][$i]." ".$content[1][$j]." ".$content[2][$k]." ".
         
$content[3][$l]." ".$content[4][$n]."<br>";
  }
?>

  Ответить  
 
 автор: Владимир55   (02.10.2009 в 20:10)   письмо автору
 
   для: cheops   (02.10.2009 в 20:02)
 

Как интересно, cheops !

А как потом из этого массива получить набор предложений?

=============
( У меня от двумерности мозги закипают...)

  Ответить  
 
 автор: cheops   (02.10.2009 в 20:02)   письмо автору
 
   для: Владимир55   (02.10.2009 в 19:51)
 

Хм... может проще воспользоваться двумерным массивом? Т.е. создать массив файлов
<?php
  $fl
[0] = "first.txt";
  
$fl[1] = "second.txt";
  
$fl[2] = "third.txt";
  ...
?>

Поместить содержимое файла в двумерный массив $content, таким образом, что в развернутом виде получится
<?php
  $content
[0][0] = "Пришла";
  
$content[0][1] = "Ушла";
  
$content[0][2] = "Подошла";
  
$content[0][3] = "Не дошла";
  
$content[1][1] = "пора";
  
$content[1][2] = "такая пора";
  
$content[1][3] = "такая минута";
  
$content[1][4] = "эпоха";
  ...
?>

Т.е. первый индекс в массиве $content соответствует индексу файла из массива $fl, а второй - индексу слова. Тогда проблема названий отпадает сама собой - у вас будет одно название, а группы слов пронумерованы индексами из массива $fl.

  Ответить  
 
 автор: Владимир55   (02.10.2009 в 19:51)   письмо автору
 
   для: cheops   (02.10.2009 в 19:38)
 

Первое слово 4 варианта
Второе слово 4 варианта
Третье слово 3 варианта
Четвертое слово 3 варианта
Пятое слово 4 варианта.

Всего: 4*4*3*3*4 = 576 вариантов.

Я последнюю строку позже добавил и не посчитал ее варианты.

Спасибо! Очень интересный алгоритм!

====================

Однако с реализацией этого алгоритма возможны некоторые проблемы.

Информация вводится из текстового файла и заранее неизвестно количество слов.

А тут сам код зависит от количества слов!

  Ответить  
 
 автор: cheops   (02.10.2009 в 19:38)   письмо автору
 
   для: Владимир55   (02.10.2009 в 19:31)
 

Можно поступить примерно так
<?php
  $fst 
= array("Пришла","Ушла","Подошла","Не дошла");
  
$snd = array("пора","такая пора","такая минута","эпоха");
  
$thd = array("чтоб","что бы","когда");
  
$fth = array("истинный","действительный","реальный");
  
$fiv = array("мудрец","мудрый человек","философ","мыслитель");
  for(
$i 0$i count($fst); $i++)
  for(
$j 0$j count($snd); $j++)
  for(
$k 0$k count($thd); $k++)
  for(
$l 0$l count($fth); $l++)
  for(
$n 0$n count($fiv); $n++)
  echo 
$fst[$i]." ".$snd[$j]." ".$thd[$k]." ".$fth[$l]." ".$fiv[$n]."<br>";
?>

PS Только у меня получилось 576 вариантов.

  Ответить  
 
 автор: Владимир55   (02.10.2009 в 19:31)   письмо автору
 
 

Требуется сделать скрипт, составляющий фразы из синонимов.

Например, есть набор вариантов первого слова
Пришла/Ушла/Подошла/Не дошла

Набор вариантов второго слова
пора/такая пора/такая минута/эпоха

Набор вариантов третьего слова
чтоб/что бы/когда

Набор вариантов четвертого слова
истинный/действительный/реальный

Набор вариантов пятого слова
мудрец/мудрый человек/философ/мыслитель

Всего 144 комбинации, из которых можно составить 144 предложения.

Как бы это сделать?

  Ответить  

Сообщения:  [1-9] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования