Помогите с алгоритмом

smkdesign

Новичок
Помогите с алгоритмом

Мозг устал, что-то никак сообразить не получается как реализовать ((

Исходные данные, есть массив повторяющихся слов входящих в текст:
PHP:
Собака
Кошка
Курица
Тигр
Заяц
и сам текст:
PHP:
Собака ... Собака ... Кошка ... Курица ... Тигр ... Тигр ... Кошка ... Курица ... Заяц ... Заяц ...
... - любой произвольный текст

Каждый элемент массива(слово) входит в текст определнное одинаковое количество раз, например 2.
Т.е. слово "Собака" и "Кошка", "Курица" встречается в тексте каждое по 2 раза.

Задача, удалить из массива слово если между двумя его повторами в тексте нет еще одного(отличного от самого себя) слова из массива.
Это значит что в тексте между двумя словами "Курица" обязательно должно быть одно из слов в массиве, например Тигр, если условие не выполняется элемент из массива нужно удалить.

Т.е. из исходного массива скрипт должен удалить слова "Собака", "Тигр", "Заяц".
Массив в результате будет иметь вид:
PHP:
Кошка
Курица
Вот такая вот задачка, плиз хелп!
 

smkdesign

Новичок
Krishna
Очень информативный ответ, а главное по теме. Как быстро вы составили характеристику, я просто поражаюсь.

Я не собираюсь Вам доказывать сколько врмемени было потрачено на решение проблемы. Есть люди которые могут помочь, а есть те кому потрындеть...

Подумайте сколько врмени только нужно потратить чтоб грамотно описать какой алгоритм не получается реализовать... Уж явно больше чем написать Вашу типовую отписку чтоб отметиться. Так и пишите "Я здесь был"...
 

SiMM

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

Adelf

Administrator
Команда форума
smkdesign
Задача решается в лоб и без проблем. strpos и переборы по массиву.
Трудности могут возникнуть, если попросят пооптимальнее решить.
 

smkdesign

Новичок
Вот код с которым экспериментирую, всеже мой алгоритм не отрабатывает правильно.
Результат:
PHP:
Array
(
    [0] => Кошка
    [1] => Курица
    [2] => Заяц
)
Заяц у нас оказался лишний.
Каким образом решить этот баг адекватным способом пока никак не получилось ((

Так что все тот же плиз хелп.

PHP:
// Исходные данные
$NCount=2;
$content='Собака текст1 Собака текст2 Кошка текст3 Курица текст4 Тигр текст5 Тигр текст6 Кошка текст7 Курица текст8 Заяц текст9 Заяц';
$result=explode(' ',$content);

// Вычисляем кол-во вхождений
$count=array_count_values($result);

// Формируем массив из элементов которые встречаются в тексте по N раз
$BaseAr=Array();
foreach ($count as $key => $value)
{
    //print_r($key);
    if ($value==$NCount) $BaseAr[]=$key;
}
// Полуаем текст от первой до последней фразы массива
$content=substr($content,strpos($content,$BaseAr[0]),strrpos($content,$BaseAr[count($BaseAr)-1])-strpos($content,$BaseAr[0])+strlen($BaseAr[0]));

// Чистим массив от фраз с неправильным вхождением
for($i=0;$i<count($BaseAr);$i++)
{
    $CurPos=strpos($content,$BaseAr[$i],strpos($content,$BaseAr[$i])+strlen($BaseAr[$i]));
    $NextPos=strpos($content,$BaseAr[$i+1]);
    if ($CurPos!==false && $CurPos<$NextPos) { unset($BaseAr[$i]); }
}
$BaseAr=array_values($BaseAr);

// Результат
echo '<pre>';
print_r($BaseAr);
echo '</pre>';
 

untied

Сдвинутый новичок
Лично я восхищаюсь преподами, которые придумывают (а точнее высир..т) подобные идиотические задачи. Какую они могут принести пользу в будущем -- х.з. Но, как говорится, олдскул форева, Ершов живее всех живых.
Автор, у тебя все получится!
 

smkdesign

Новичок
Я могу чесно признаться что это задача не препода, а реально нужный функционал при обработке текста! ;)

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

nerezus

Вселенский отказник
> Какую они могут принести пользу в будущем -- х.з.
Умение составлять простые алгоритмы - не польза ли?
 

С.

Продвинутый новичок
У тебя есть массив $result.

1. Убрать все "ненужные" слова.
2. Найти пары одинаковых слов подряд.

Куда еще проще алгоритм?
 

pilot911

Новичок
пишу навскидку, вокруг чего плясать


примерно так
PHP:
preg_match_all('/(([^\s]+).*)(\\2)(*.\\2)/', "$1$4", $text);

тут нужно дописать,чтобы сразу для всех слов работало

-~{}~ 19.01.10 23:38:

или так

PHP:
$str = 'qwe etr qwe qwe ete ert qwe';

$arr_1 = explode(' ', $str);

$arr_2 = array_count_values($arr_1);

$arr_3 = $arr_1;

$str_out = '';

foreach ($arr_1 as $k=>$val) {

     if ($arr_3[$val] != $arr_2[$val]-- && $arr_2[$val] > 1) continue;
     else $str_out .= $val;
}
 
Сверху