[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите рандомно вывести текст
Oggy
Надо вывести рандомно слова, нашол вот такой пример:

<?php

function
callback($matches)
{
return rand(0, 1) ? 'текст2' : $matches***91;0***93;;
}

$text="текст текст текст текст текст текст текст";
$text = preg_replace_callback("/(текст)/i", 'callback', $text);
echo $text;

?>


но я етой функцыии недоконца понимаю...помогите пожалуйста разобраться ...



Спустя 10 минут, 12 секунд (27.07.2012 - 21:01) dadli написал(а):
Oggy
Цитата
Надо вывести рандомно слова

думаю можно прошче, откуда надо рандомно слова вивести?

Спустя 2 минуты, 12 секунд (27.07.2012 - 21:04) Oggy написал(а):
Цитата (dadli @ 27.07.2012 - 18:01)
Oggy
Цитата
Надо вывести рандомно слова

думаю можно прошче, откуда надо рандомно слова вивести?

Надо сделать скрипт для «перемешивания» предложения.

Символ | является разделителем слов-вариантов. Например:

"Я {самый|очень} хороший программист, которому не составит труда {написать|сварганить|запостить} код для этого задания, в котором слова будут изменяться {быстро|мгновенно|рандомно}."

Спустя 39 минут, 34 секунды (27.07.2012 - 21:43) dadli написал(а):
Oggy
не могу точно сказать что мои пример сами оптимални варянт, но работает.


$str = "Я {самый|очень} хороший программист, которому 
не составит труда {написать|сварганить|запостить} код для этого задания, в котором слова будут изменяться {быстро|мгновенно|рандомно}."
;

preg_match_all("#\{(.*)\}#Uu",$str,$mas);

foreach ($mas[1] as &$val) {
$val = explode("|",$val);
$randKey = rand(0,count($val)-1);
$val = $val[$randKey];
$str = preg_replace("#^(.*)\{.*\}#uUs", "$1".$val, $str);
}


echo $str;

Спустя 22 минуты, 44 секунды (27.07.2012 - 22:06) Oggy написал(а):
Цитата (dadli @ 27.07.2012 - 18:43)
Oggy
не могу точно сказать что мои пример сами оптимални варянт, но работает.


$str = "Я {самый|очень} хороший программист, которому 
не составит труда {написать|сварганить|запостить} код для этого задания, в котором слова будут изменяться {быстро|мгновенно|рандомно}."
;

preg_match_all("#\{(.*)\}#Uu",$str,$mas);

foreach ($mas[1] as &$val) {
$val = explode("|",$val);
$randKey = rand(0,count($val)-1);
$val = $val[$randKey];
$str = preg_replace("#^(.*)\{.*\}#uUs", "".$val, $str);
}


echo $str;

Хорошо а как просто выводить рандомно два слова "текст" иля "текст2".Чтобы оно рандомно выводило или первои или второе слово....

Спустя 3 минуты, 41 секунда (27.07.2012 - 22:09) dadli написал(а):
Oggy

$string = "текст текст2";
$mas = explode(" ",$string);
$randKey = rand(0,count($mas) - 1);
echo $mas[$randKey];

Спустя 13 минут, 53 секунды (27.07.2012 - 22:23) Oggy написал(а):
Цитата (dadli @ 27.07.2012 - 19:09)
Oggy

$string = "текст текст2";
$mas = explode(" ",$string);
$randKey = rand(0,count($mas) - 1);
echo $mas[$randKey];

пробую так:


<?php
class
random
{
public function generateRandomString()
{
$string = "самый очень";
$string2 = "написать сварганить запостить";
$string3 = "быстро мгновенно рандомно";

$mas = explode(" ",$string);
$randKey = rand(0,count($mas) - 1);

$mas2 = explode(" ",$string2);
$randKey2 = rand(0,count($mas2) - 1);

$mas3 = explode(" ",$string3);
$randKey3 = rand(0,count($mas3) - 1);

echo "Я,".$randKey." хороший программист, которому не составит труда ".$randKey2." код для этого задания, в котором слова будут изменяться ".$randKey3.".";
}
}

$obj=new random();
$obj->generateRandomString();

?>


выводит вместо слов цыфри....почему? )))

Спустя 1 час, 43 минуты, 38 секунд (28.07.2012 - 00:07) Guest написал(а):
потому что randKey тип integer, это индекс, а не строка. вперед php учить!

Спустя 2 дня, 13 часов, 51 минута, 29 секунд (30.07.2012 - 13:58) morovins написал(а):
dadli
а если вот такой примет будет, то как сделать?

{Пожалуйста,|Просто|Если сможете,} сделайте так, чтобы это {удивительное|крутое|простое|важное|бесполезное} тестовое предложение {изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}.

Спустя 1 час, 16 минут, 57 секунд (30.07.2012 - 15:15) Oggy написал(а):
Цитата (morovins @ 30.07.2012 - 11:58)
dadli
а если вот такой примет будет, то как сделать?

{Пожалуйста,|Просто|Если сможете,} сделайте так, чтобы это {удивительное|крутое|простое|важное|бесполезное} тестовое предложение {изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}.

готовый пример кода за +1 мне в карму ) ....

Спустя 1 минута, 29 секунд (30.07.2012 - 15:17) morovins написал(а):
аааа, я не могу тебе дать +1 к карме, моей группе запрещено...

Спустя 3 минуты, 28 секунд (30.07.2012 - 15:20) inpost написал(а):
Устраиваетесь на работу и хотите на халяву пройти тестирование?! Это задание многие дают smile.gif И моя реализация есть в оцените этого задания smile.gif

Спустя 4 минуты (30.07.2012 - 15:24) Oggy написал(а):
Цитата (inpost @ 30.07.2012 - 13:20)
Устраиваетесь на работу и хотите на халяву пройти тестирование?! Это задание многие дают :) И моя реализация есть в оцените этого задания :)

палево )))
вот....но думаю его можно оптимизировать...

<?php
function
RandomString()
{
$string = "самый|очень";
$string2 = "написать|сварганить|запостить";
$string3 = "быстро|мгновенно|рандомно";

$mas = explode("|",$string);
$randKey = $mas[array_rand($mas, 1)];

$mas2 = explode("|",$string2);
$randKey2 = $mas2[array_rand($mas2, 1)];

$mas3 = explode("|",$string3);
$randKey3 = $mas3[array_rand($mas3, 1)];
echo "Я,".$randKey." хороший программист, которому не составит труда ".$randKey2." код для этого задания, в котором слова будут изменяться ".$randKey3.".";

}
RandomString();
?>

Спустя 7 минут, 8 секунд (30.07.2012 - 15:32) morovins написал(а):
Oggy
спасибо, а в таком виде, как написал dadli можно

$str = "Я {самый|очень} хороший программист, которому
не составит труда {написать|сварганить|запостить} код для этого задания, в котором слова будут изменяться {быстро|мгновенно|рандомно}."
;

preg_match_all("#\{(.*)\}#Uu",$str,$mas);

foreach ($mas[1] as &$val) {
$val = explode("|",$val);
$randKey = rand(0,count($val)-1);
$val = $val[$randKey];
$str = preg_replace("#^(.*)\{.*\}#uUs", "".$val, $str);
}


echo $str;


inpost
нет я не устраиваюсь на работу, потому как уже имею работу и не связанную с php, просто интересно...

Спустя 7 минут, 54 секунды (30.07.2012 - 15:39) morovins написал(а):
я вот так пробывал

$s = '{Пожалуйста,|Просто|Если сможете,} сделайте так, чтобы это {удивительное|крутое|простое|важное|бесполезное} тестовое предложение {изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}.';

$pattern = "#\{(.*)\}#iusU";
$res = preg_match_all($pattern, $s, $out_variables);
foreach ($out_variables[0] as $k => $v) {
$w = explode('|', substr($v, 1, strlen($v) - 2));
$s = str_replace($v, $w[round(mt_rand(0, count($w) - 1))], $s);
}
echo $s;

результат вот такой
Цитата
Если сможете, сделайте так, чтобы это бесполезное тестовое предложение изменялось {быстро случайным образом|менялось каждый раз}. 

Спустя 9 минут, 55 секунд (30.07.2012 - 15:49) inpost написал(а):
Oggy
Код основан на том, что должна быть множественная вложенность, как это показал morovins

Спустя 16 часов, 41 минута, 17 секунд (31.07.2012 - 08:31) morovins написал(а):
Ни у кого нет идей как это реализовать или нет желания помогать?

Спустя 2 часа, 33 минуты, 39 секунд (31.07.2012 - 11:04) inpost написал(а):
ну для начала я говорил, что ответ есть на форуме мой, его просто надо поиском искать.
Дополнительно я помогать не буду по той причине, что я не хочу, чтобы на должность программиста шли люди, которые сами не могут решать поставленные задачи.

Спустя 6 минут, 55 секунд (1.08.2012 - 11:11) morovins написал(а):
кажись вышло реализовать, хотя не уверен что верно
Подскажите, пожалуйста, если что не верно...


$s = '{Пожалуйста,|Просто|Если сможете,} сделайте так, чтобы это {удивительное|крутое|простое|важное|бесполезное} тестовое предложение {изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}.';

$pattern = "/\{([^\}][^\{]+?)\}/";
$res = preg_match_all($pattern, $s, $out_variables);

foreach ($out_variables[0] as $k => $v)
{
$w = explode('|', substr($v, 1, strlen($v) - 2));
$s = str_replace($v, $w[round(mt_rand(0, count($w) - 1))], $s);

$res = preg_match_all($pattern, $s, $out_variables1);

foreach ($out_variables1[0] as $k => $v)
{
$w = explode('|', substr($v, 1, strlen($v) - 2));
$s = str_replace($v, $w[round(mt_rand(0, count($w) - 1))], $s);
}
}


echo $s;

Спустя 49 минут, 4 секунды (1.08.2012 - 12:00) inpost написал(а):
morovins
Вложенность у тебя двойная, а ты сделай на 5 шагов и проверь скрипт. Если будет работать - значит ок smile.gif

Спустя 52 минуты, 59 секунд (1.08.2012 - 12:53) morovins написал(а):
Вот блин на 5 шагов не работает... Что же делать, может подскажите?

Спустя 16 минут, 43 секунды (1.08.2012 - 13:10) inpost написал(а):
morovins
функция должна быть рекурсионной, или цикличной. Каждый цикл должен открывать нижний уровень скобок (или верхний, но тогда медленнее работать будет). После следующая инерция цикла. 1 шаг = 1 уровень. И повторять до того времени, пока все скобки не будут открыты.

Спустя 47 минут, 22 секунды (1.08.2012 - 13:57) morovins написал(а):
не могу понять... не силен я в регулярных выражениях.

Спустя 3 часа, 11 минут, 50 секунд (1.08.2012 - 17:09) inpost написал(а):
У тебя частично верно. Только зациклить его надо через do-while , и использовать preg_replace_callback(). То, что результат уже не будет изменяться вернётся в 5-ом аргументе функции callback.

Итого 1 строка инициализации $text; 1 строка на вывод результата: echo $text; 4 строки на функцию и 3 строки на цикличный запуск. Всего 9 строк.

Только что за 10 минут написал.

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

Спустя 25 минут, 51 секунда (1.08.2012 - 17:35) pak написал(а):
у меня так вышло)

$s = '{Пожалуйста,|Просто|Если сможете,} сделайте так, чтобы это
{удивительное|крутое|простое|важное|бесполезное} тестовое предложение {изменялось
{быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}.'
;
$data = preg_split('#[{}]#', $s, -1, PREG_SPLIT_NO_EMPTY);
$new = '';
foreach($data as $v)
{
if(strpos($v,'|'))
{
$m = explode('|',$v);
$new .= $m[array_rand($m, 1)].' ';
}
else
$new .= $v.' ';
}

echo $new;

Спустя 14 минут, 42 секунды (1.08.2012 - 17:50) inpost написал(а):
pak
Ошибка у тебя.
Есть подстрока:
{изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}
Это имеется ввиду, что либо ЛЕВАЯ либо ПРАВАЯ часть.
Если "менялось каждый раз", значит левая часть до | не должна выводиться вообще, то есть "изменялось {} случайным образом" - не должно вывестись вообще!

Спустя 4 часа, 39 минут, 16 секунд (1.08.2012 - 22:29) xlebosol написал(а):
<?php
/**
*Класс генерирует новый текст
* Новый текст генерируется путем вставки слов полученных из
* класса "RandomWords". Вставка слов происходит в цикле, где свойство "$random_words" класса "RandomWords" путем
* конкатенации соединяется с текстом, предварительно разбитого по шаблону в массив.
*/
class Proposal
{
/**
* Исходный текст
* @var string
*/
private $_text;

/**
* Шаблон выражений разделенных знаком "|"
* @var array
*/
private $_pattern_words = array();


public function __construct($text)
{
$this->_text = $text;
}

/**
*Получаем шаблон выражений для выбора случайного слова
*/
private function _findPatternWord()
{
preg_match_all('#{(.*)}#Ui', $this->_text, $this->_pattern_words);
}


/**
* Формируем массив исходного текста, разбитого по шаблону
* @return array
*/
private function _findPatternText()
{
return preg_split('#{(.*)}#Ui', $this->_text);
}

/**
* Формирем новый текст
* @return string
*/
private function _handlerText()
{
$objRandomWords = new RandomWords();
$objRandomWords->randomWord($this->_pattern_words[1]);

$i = 0;
$proposal = '';

foreach ($this->_findPatternText() as $party_text) {
foreach ($objRandomWords as $words) {
$proposal .= $party_text . $words[$i++];
}
}

return $proposal;
}

/**
* Проверяем входные данные на корректность
* @return string
*/
public function processProposal()
{
if (!empty($this->_text)) {
$this->_findPatternWord();
return $this->_handlerText();
} else {
echo 'Отсутствует текст для обработки!';
exit();
}
}
}


/**
*Класс генерирует список случайных слов
* Замена слов происходит в классе "Proposal".
*/
class RandomWords
{
/**
* Список случайных слов
* @var array
*/
public $random_words = array();

/**
*Символ раздела выражений
*/
const SEPARATOR = '|';

/**
* Формируем список случайных слов
* @param $pattern_words
*/
public function randomWord($pattern_words)
{
if (!empty($pattern_words)) {
foreach ($pattern_words as $words) {
$exp = explode(self::SEPARATOR, $words);
$r = rand(0, count($exp) - 1);
$this->random_words[] = $exp[$r];
}
} else {
echo 'Отсутствут шаблон слов!';
exit();
}
}
}

$text = 'Я {самый|очень} хороший программист, которому не составит труда {написать|сварганить|запостить} код для этого задания, в котором слова будут изменяться {быстро|мгновенно|рандомно}.';

$objProposal = new Proposal($text);
echo $objProposal->processProposal();

?>

Мой вариант для самого хорошего и рандомного программиста.

Спустя 1 час, 1 минута, 40 секунд (1.08.2012 - 23:31) inpost написал(а):
xlebosol
ну для начала долго работать будет, а как второй - где множественная вложенность? Ты тестируешь на самой простой строке, а внутри фигурных скобок должны быть ещё фигурные. Кроме этого по тексту могут быть одна фигурная, которая нарушает код, то есть открытая, но не закрывается, его то игнорировать надо smile.gif
Я выше код такой же обвинил в том, что он не работает с множественной вложенностью. Твой работает?

Спустя 10 часов, 41 минута, 46 секунд (2.08.2012 - 10:12) morovins написал(а):
inpost большое спасибо за помощь
Я вот так сделал, кажись работает...


$s = '{Пожалуйста,|Просто|Если сможете,} сделайте так, чтобы это {удивительное|крутое|простое|важное|бесполезное} тестовое предложение {изменялось {быстро|мгновенно|оперативно {вапеапреапре|жжджщзжщ {удивительное {важное|бесполезное} |крутое|простое} |тиььтиьти} |правильно} случайным образом|менялось каждый раз}.'; //7 вложений

echo parse($s);

function parse($str) {
$count = substr_count($str, '{');
for($i=0;$i<$count;$i++) {
$str = preg_replace_callback("#{([^{}]*?)}#ms", "callback", $str);
}
return $str;
}

function callback($matches) {
$v = explode('|',$matches[1]);
return $v[mt_rand(0,count($v)-1)];
}

Спустя 2 часа, 21 минута, 9 секунд (2.08.2012 - 12:34) inpost написал(а):
morovins
Очень похож на мой код. Вот глянь:
<?php header("Content-Type: text/html; charset=utf-8"); error_reporting(E_ALL);
echo ($text = '{Пожалуйста,|Просто|Если сможете,} сделайте так, чтобы это {удивительное|крутое|простое|важное|бесполезное} тестовое предложение {изменялось {быстро|мгновенно|оперативно|правильно} случайным образом|менялось каждый раз}.').'<pre>';

function test($matches) {
$temp = explode('|',$matches[1]);
return $temp[rand(0,count($temp)-1)];
}
do {
$text = preg_replace_callback('#\{([^\{]+)\}#iusU','test',$text,-1,$count);
} while($count);

echo $text;

Спустя 24 минуты, 49 секунд (2.08.2012 - 12:58) morovins написал(а):
inpost большое спасибо за помощь.

Спустя 6 минут, 30 секунд (2.08.2012 - 13:05) inpost написал(а):
morovins
Не за что. Ты же сам почти всё реализовал. А таким людям не стыдно и помогать.

в целом
Вот и ещё одно приятное место, где использую do-while. smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.