Давайте не будем выкладывать в теме ответ, для того чтобы другим участникам было интересно.
итак, задание
Цитата |
Code a simple Random Sentence Spinning Function(s) Or Class. Basically you take this following variable Where the | is a delimiter meaning either word could be shown up: $rand_sentence = "{Please|Just} make this {cool|awesome|random} test sentence {rotate {quickly|fast} and random|spin and be random}"; and the end result should be an output of the sentence like: Please make this cool test sentence rotate fast and random. OR Just make this random test sentence spin and be random. or any other random variation... |
Цитата |
Создайте код простой рандомной (случайной) генерации предложений. На входе код должен получать строку подобную этой $rand_sentence = "{Please|Just} make this {cool|awesome|random} test sentence {rotate {quickly|fast} and random|spin and be random}"; где знак | это разделитель, означающий что здесь может использоваться одна из частей и конечный результат работы должен представлять из себя случайное предложение, например: Please make this cool test sentence rotate fast and random. ИЛИ Just make this random test sentence spin and be random. ИЛИ любые другие |
Цитата (Гость_Michael @ 18.05.2010 - 14:42) |
А Экспертам можно участвовать ? |
Цитата (jetistyum @ 18.05.2010 - 11:44) | ||
нужно!!! Иначе какой же он эксперт ? |
Цитата (Guest @ 18.05.2010 - 14:47) |
с судьями опять будут проблемы ........ |
Цитата (ApuktaChehov @ 18.05.2010 - 14:47) |
А я вообще не понял, что делать надо |
Цитата (jetistyum @ 18.05.2010 - 14:59) |
задание описано довольно подробно. |
Цитата (Michael @ 19.05.2010 - 08:44) |
Ну и мой вариант. |
Цитата (Семён @ 19.05.2010 - 05:21) | ||
А пароль? |
{Please|Just} make this {cool|awesome|random with {my|good}} test sentence
{rotate {quickly|fast} and random|spin and be random}
<?php
$text='{Please|Just} make this {cool|awesome|random with {my|good}} test sentence
{rotate {quickly|fast} and random|spin and be random}';
$flag=true;
while($flag) {
$flag=false;
$text=preg_replace_callback('#{[^{}]*}#', 'Handler', $text);
}
function Handler($m) {
global $flag;
$a=explode('|', substr($m[0], 1, -1));
$flag=true;
return $a[rand(0, count($a)-1)];
}
echo($text);
?>
Цитата (Семён @ 19.05.2010 - 10:39) |
{Please|Just} make this {cool|awesome|random with {my|good}} test sentence {rotate {quickly|fast} and random|spin and be random} |
Цитата |
{Please|Just} make this {cool|awesome|{random1|random2}} test sentence {rotate {quickly|fast} {and|or} random|spin and be random {ha-ha|wuha-ha|wuha}} |
1.(jetistyum) 5.3, 6.4
2.(max) 13.6, 15.0
3.(zarafar) 3.1, 4.7
4.(glock18)
вариант 2: 2.37, 3.44
вариант 3: 3.25, ---
5.(Michael) 2.32, 2.14
6.(Семён) 1.7, 2.53
7.(gzim9x)
вариант 1: 2.10, 3.10
вариант 2: 1.65, 2.42
Цитата (Michael @ 19.05.2010 - 16:35) |
Итак, мой отчет о скорости. Красным - предложение: Свернутый текст "{Please|Just} make this {cool|awesome|random} test sentence {rotate {quickly|fast} and random|spin and be random}" Синим - более сложное предложение: Свернутый текст "{{Please|Just} make this|{NoPlease|NoJust} do not make this} XXX {{cool|cool1|cool2|{cool3.0|cool3.1}}|awesome|random}" 10000 генераций предложений на моем компе считались(в секундах): Работы: 1.(jetistyum) 5.3, 6.4 |
Цитата (DedMorozzz @ 19.05.2010 - 10:29) |
однозначно самое оригинальное решение - через SQL)) |
Цитата (Семён @ 19.05.2010 - 14:43) |
А то что я опубликовал посчитай. |
Цитата (Michael @ 19.05.2010 - 17:11) | ||
Посчитал. Делаешь через глобальную переменную - я так и прикрутил вызовы. Для чистоты эксперимента оформи, как все, функцией - передача параметра функции то же что то значит. |
Цитата (Michael @ 19.05.2010 - 12:35) |
3.(Zarfar) 3.0, ошибка |
$pattern = "/{([a-zA-Z0-9| \.]+)}/iu";
Цитата (Семён) |
Если не секрет как ты проводишь замеры? |
$myrand_sentence = "{{Please|Just} make this|{NoPlease|NoJust} do not make this}
XXX {{cool|cool1|cool2|{cool3.0|cool3.1}}|awesome|random}";
echo $myrand_sentence, '<hr/>';
$t1 = getTime();
echo $t1, '<br/>';
for ($i=0; $i < 10000; $i++) {
$newstring = str_replace_custom($myrand_sentence); // функция вернет сгенерированную строку
//echo $newstring, '<br/>';
}
$t2 = getTime();
echo $t2, '<br/>';
echo 'Разница - ', ($t2 - $t1), ' секунд<br/>';
function getTime()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
Цитата (Семён) |
Перед тобой наверно нада ещё сплясать? |
Цитата (DedMorozzz @ 19.05.2010 - 19:14) |
Всё равно, приз зрительских симпатий - работе на SQL |
Цитата (Семён @ 19.05.2010 - 19:26) |
Сомневаюсь, что код jetistyum будет выполнятся некое значение ~6 |
Цитата (jetistyum @ 20.05.2010 - 14:47) |
Понравился код glock18, даже не код (в код пока не вникал), а серьёзный подход, основательный! |
<?php
function randomSentence($string) {
preg_match_all("/\{[^{}]+\}/", $string, $out);
if (isset($out[0][0])) {
for ($i=0,$l=sizeof($out[0]);$i<$l;$i++) {
$__a=explode('|',str_replace(array('{','}'),array('',''),$out[0][$i]));
shuffle($__a);
$string=str_replace($out[0][$i],$__a[0],$string);
}
return randomSentence($string);
}
return $string;
}
print randomSentence('{Please|Just} make this {cool|awesome|random} test sentence {rotate {quickly|fast} and random|spin and be random}');
?>
function randomSentence($string) {
return (strpos($string,'{')===false)
? $string
: call_user_func(__FUNCTION__,
preg_replace_callback("/{[^{}]+\}/i",
function($out) {
return $a[array_rand($a=explode('|', trim($out[0],'{}')))];
},
$string));
}
print randomSentence('{Please|Just} make this {cool|awesome|random} test sentence {rotate {quickly|fast} and random|spin and be random}');
Цитата |
да и 5.3 требует. |
$text = '...';
function getRnd($arr) {
return stripslashes($arr[array_rand($arr, 1)]);
}
echo preg_replace('/{(.+?)}/es', "getRnd(explode('|', '$1'))", $text);
function call($out) {
return $a[array_rand($a=explode('|', trim($out[0],'{}')))];
}
function randomSentence($string) {
return (strpos($string,'{')===false)
? $string
: call_user_func(__FUNCTION__, preg_replace_callback("/{[^{}]+\}/i",'call',$string));
}
print randomSentence('{Please|Just} make this {cool|awesome|random} test sentence {rotate {quickly|fast} and random|spin and be random}');
Цитата (Lolik @ 2.07.2010 - 11:36) |
чем будет полезна эта функция? |
Цитата (Michael @ 2.07.2010 - 13:27) |
Вот конкурс сейчас идет - тоже алгоритмы чем то родственны. |
function randomSentence($string) {
return (strpos($string,'{')===false)
? $string
: ((strpos($string, '}') === false)
? exit('Syntax error!')
: call_user_func(__FUNCTION__, preg_replace_callback("/{[^{}]+\}/",'call',$string)));
}
Цитата (gzim9x @ 8.07.2010 - 02:46) |
к регуляркам относятся с некоторым необоснованным предубеждением |
<?php
error_reporting(E_ALL);
session_start();
header("Content-Type: text/html; charset=utf-8");
/**
* Functions
*/
function show($text2,$temp,$soul)
{
$result = $text2;
foreach($temp as $k => $v)
{
$result = str_replace('$array['.$k.']',$temp[$k][$soul[$k]],$result);
}
return $result;
}
function improve(&$soul,$count,$howmuch)
{
$soul[0] = 0;
$num = 1;
while(true)
{
if($num > $count)
return false;
if(++$soul[$num] <= $howmuch[$num] -1)
{
break;
}
else
{
$soul[$num++] = 0;
}
}
return $soul;
}
function makeText($tpl,$text,$delete)
{
$text2 = $text;
preg_match_all("/\{.{1}(?:[^\{]{1})+?\}/ius",$text,$matches);
$num = 0;
foreach($matches[0] as $k => $v)
{
$text2 = str_replace($v,'$array['.$num++.']',$text2);
$temp[$k] = explode('|',str_replace($delete,'',$v));
$howmuch[$k] = count($temp[$k]);
$soul[] = 0;
}
$count = count($soul)-1;
while(true)
{
if($soul[0] == 0)
{
$tpl[] = show($text2,$temp,$soul);
}
if(++$soul[0] <= $howmuch[0] - 1)
{
$tpl[] = show($text2,$temp,$soul);
continue;
}
else
{
if(!improve($soul,$count,$howmuch))
break;
}
}
return $tpl;
}
/**
* Starting text
*/
$text = "{Пожалуйста|Просто} сделайте {так чтобы|чтобы} это {удивительное|крутое|простое} тестовое {a|{b|{c|d}}} предложение {изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}.";
echo $text;
$delete = array('{','}');
$tpl = array();
/**
* Controller
*/
//Первая вложенность
$text = makeText($tpl,$text,$delete);
//Вторая вложенность
foreach($text as $v)
$text3[] = makeText($tpl,$v,$delete);
//Третья вложенность
foreach($text3 as $value)
foreach($value as $v)
$text5[] = makeText($tpl,$v,$delete);
/**
* VIEW
*/
echo '<pre>';
print_r($text5);
Цитата (inpost) |
У меня только выводит все варианты, а не берёт случайный. |
Array
(
[0] => Array
(
[0] => Пожалуйста сделайте так чтобы это удивительное тестовое a предложение изменялось быстро случайным образом.
[1] => Пожалуйста сделайте так чтобы это удивительное тестовое b предложение изменялось быстро случайным образом.
)
[1] => Array
(
[0] => Пожалуйста сделайте так чтобы это удивительное тестовое a предложение изменялось быстро случайным образом.
[1] => Пожалуйста сделайте так чтобы это удивительное тестовое c предложение изменялось быстро случайным образом.
)
[2] => Array
(
[0] => Пожалуйста сделайте так чтобы это удивительное тестовое a предложение менялось каждый раз.
[1] => Пожалуйста сделайте так чтобы это удивительное тестовое b предложение менялось каждый раз.
)
[3] => Array
(
[0] => Пожалуйста сделайте так чтобы это удивительное тестовое a предложение менялось каждый раз.
[1] => Пожалуйста сделайте так чтобы это удивительное тестовое c предложение менялось каждый раз.
)
...
<?php
$rand_sentence = '{Please|Just} make this {cool|awesome|random} test sentence
{rotate {quickly|fast} and random|spin and be random}';
do
{
preg_match_all('#\{((?>[^{}]+)*)\}#', $rand_sentence, $out);
foreach ($out[1] as &$val)
{
$val = explode('|', $val);
$val = $val[rand(0, count($val)-1)];
}
$rand_sentence = str_replace($out[0], $out[1], $rand_sentence);
}
while (count($out[0]) != 0);
echo $rand_sentence;
$rand_sentence = "{Please|Just} make this {cool|awesome|random} test sentence {rotate {quickly|fast} and random|spin and be random}";
$regexp = '#\{((?>[^{}]+)*)\}#';
while(strpos($rand_sentence, '{') !== false)
$rand_sentence = preg_replace_callback($regexp, 'replace_match_str', $rand_sentence);
echo $rand_sentence . "\n";
function replace_match_str($str)
{
$result = explode("|", $str[1]); // split string by "|" symbol
$replacement = array_rand($result); // random array ellement
return $result[$replacement];
}