[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Предлагаю проверить свои знания решением задачи
jetistyum
Давайте не будем выкладывать в теме ответ, для того чтобы другим участникам было интересно.

итак, задание

Цитата
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.
ИЛИ любые другие



Время я тут конечно не ограничиваю, но скажу что у меня на решение ушел час.

результат можно выкладывать на Pastebin, ссылку запомнить, и думаю завтра можно будет выложить...
И предлагаю комманде экспертов определить победителей
1. Самое простое решение (даже если не очень быстро, но очень мало)
2. Самое оптимальное решение. (Код написан оптимально, работать будет быстро)
3. Самое неожиданное решение. (Не обычный подход, не стандартное решение)


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

Два решения из нашего офиса уже есть. выложу завтра!
Кто заинтересовался - оставляйте заявки в теме в произвольной форме, ну и в конце - сколько времени заняло решение.
Ещё раз повторяю, решение выложим завтра (19 мая)



Спустя 27 минут, 41 секунда (18.05.2010 - 14:30) Guest написал(а):
Подразумевается, что входное предложение 100% корректное ?

Спустя 11 минут, 20 секунд (18.05.2010 - 14:42) Гость_Michael написал(а):
А Экспертам можно участвовать ?

Спустя 1 минута, 5 секунд (18.05.2010 - 14:43) jetistyum написал(а):
что значит корректное? Если Вы говорите о количестве скобок, то да, предположим что строка заведомо верная и не содержит непарные скобки.

Спустя 54 секунды (18.05.2010 - 14:44) jetistyum написал(а):
Цитата (Гость_Michael @ 18.05.2010 - 14:42)
А Экспертам можно участвовать ?

нужно!!!
Иначе какой же он эксперт wink.gif ?

Спустя 3 минуты (18.05.2010 - 14:47) Guest написал(а):
Цитата (jetistyum @ 18.05.2010 - 11:44)
Цитата (Гость_Michael @ 18.05.2010 - 14:42)
А Экспертам можно участвовать ?

нужно!!!
Иначе какой же он эксперт wink.gif ?

с судьями опять будут проблемы ........

Спустя 34 секунды (18.05.2010 - 14:47) ApuktaChehov написал(а):
А я вообще не понял, что делать надо sad.gif

Спустя 2 минуты, 44 секунды (18.05.2010 - 14:50) jetistyum написал(а):
Цитата (Guest @ 18.05.2010 - 14:47)
с судьями опять будут проблемы ........

Ну почему же, устроим открытое голосование.
И еще, не бойтесь оказаться проигравшим/не победившим, самое ценное в таких работах - опыт.. свой и опыт других участников.
Кто боится того что его засудит, может ничего не делать, тогда точно не засудят, а завтра посмотрим на решения .


Цитата (ApuktaChehov @ 18.05.2010 - 14:47)
А я вообще не понял, что делать надо


что конкретно ты не понял?

Спустя 5 минут, 29 секунд (18.05.2010 - 14:55) ApuktaChehov написал(а):
Задание

Спустя 3 минуты, 28 секунд (18.05.2010 - 14:59) jetistyum написал(а):
задание описано довольно подробно.

Спустя 4 минуты, 45 секунд (18.05.2010 - 15:04) ApuktaChehov написал(а):
Цитата (jetistyum @ 18.05.2010 - 14:59)
задание описано довольно подробно.

На английском...

Спустя 2 минуты, 43 секунды (18.05.2010 - 15:06) jetistyum написал(а):
Ну тогда нужно было сказать: я не знаю английского, а не говорить что задание не понятно.
сейчас помещу перевод, а английский учи!

Спустя 3 минуты, 2 секунды (18.05.2010 - 15:09) ApuktaChehov написал(а):
Насколько я понял, это задание не только для экспертов но и для простых смертных. А я так думаю, я тут не один без знания английского.

Или только для экспертов?

Спустя 3 минуты, 27 секунд (18.05.2010 - 15:13) jetistyum написал(а):
Для всех, кто хочет, никаких ограничений. перевод готов.

Спустя 2 минуты, 15 секунд (18.05.2010 - 15:15) ApuktaChehov написал(а):
А исходную строку нужно самому придумать? На русском?

Спустя 2 минуты, 31 секунда (18.05.2010 - 15:18) jetistyum написал(а):
код должен быть универсальным, конечно можно smile.gif

Спустя 31 минута, 44 секунды (18.05.2010 - 15:49) jetistyum написал(а):
Да, можете кидать готовый код мне в личку.

Спустя 1 час, 18 минут, 50 секунд (18.05.2010 - 17:08) jetistyum написал(а):
хм, никто не заинтересовался, или все просто молчат ???

Спустя 17 минут, 14 секунд (18.05.2010 - 17:25) ApuktaChehov написал(а):
Я сделаю. Но если это до завтра. Сейчас не могу, я на работе, не оторваться.

Спустя 1 минута, 20 секунд (18.05.2010 - 17:27) jetistyum написал(а):
я же говорю - время есть.

Спустя 50 минут, 48 секунд (18.05.2010 - 18:17) zarafar написал(а):
P.S> отправил в личку

Спустя 51 минута, 52 секунды (18.05.2010 - 19:09) jetistyum написал(а):
Итак, есть первое решение с кодом -
выполнил zafar

Спустя 51 минута, 10 секунд (18.05.2010 - 20:01) jetistyum написал(а):
Еще три варианта от glock18!!!

Спустя 11 часов, 43 минуты, 59 секунд (19.05.2010 - 07:44) Michael написал(а):
Ну и мой вариант.

(добавил - файл с паролем)

Спустя 36 минут, 4 секунды (19.05.2010 - 08:21) Семён написал(а):
Цитата (Michael @ 19.05.2010 - 08:44)
Ну и мой вариант.

А пароль?

Спустя 3 минуты, 31 секунда (19.05.2010 - 08:24) Гость_Michael написал(а):
Цитата (Семён @ 19.05.2010 - 05:21)
Цитата (Michael @ 19.05.2010 - 08:44)
Ну и мой вариант.

А пароль?

tongue.gif

p.s. пароль - у организатора "олимпиады", к нему обращайтесь.

Спустя 2 часа, 59 минут, 38 секунд (19.05.2010 - 11:24) Michael написал(а):
Я там кстати пару классов использовал. Вот интересно посмотреть - может будет решение без ООП.

Работу на хостинг надо выставлять(чтобы люди могли поглючить) ?


Спустя 1 час, 30 минут, 9 секунд (19.05.2010 - 12:54) jetistyum написал(а):
Так, ну как и обещал, сейчас всё выложу.... чтобы можно было оценить
Настало время Ч
Теперь хочу призвать экспертов для помощи в оценке... т.к. банально моего мнения будет мало, и это будет не объективно.
Ща буду постить код..

Спустя 20 минут, 23 секунды (19.05.2010 - 13:14) jetistyum написал(а):
Мой код
http://pastebin.com/SMCyZAz0
Еще одно решение из нашего офиса
http://pastebin.com/KZ9VwLD5
Код Юзера Zarfar
http://pastebin.com/KUnZw2i7
Код Юзера glock18
http://pastebin.com/MccZ9FnH
Код Юзера Michael
http://pastebin.com/5NtXd20E


И самое "Жестяковое" решение - на MSSQL
http://pastebin.com/2By8LzNQ
К сожалению, автор не известен...

Хотелось бы услышать Ваши мнения,не важно на сколько хорошо Вы владеете языком!

Спустя 14 минут, 43 секунды (19.05.2010 - 13:29) DedMorozzz написал(а):
однозначно самое оригинальное решение - через SQL))

Спустя 10 минут, 8 секунд (19.05.2010 - 13:39) Семён написал(а):
Всё работы хороши, правда у Glock-a есть недочёты:
У меня пример:
{Please|Just} make this {cool|awesome|random with {my|good}} test sentence
{rotate {quickly|fast} and random|spin and be random}


Работает некорректно. (3 вложенности)

Спустя 2 минуты, 39 секунд (19.05.2010 - 13:42) Семён написал(а):
Скажу честно у меня нехватило мозга сделать более 2-ух вложенностей.
А так вот один из способов (если не более 2-ух):

<?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);

?>


Спустя 2 минуты, 3 секунды (19.05.2010 - 13:44) netruxa написал(а):
самое лучшее решение - вариант http://pastebin.com/ahrPcimZ .
тоже думал такую функцию написать, да вот смущало вложение во вложении ({...{....}....})
Последнее и предпоследнее решение просто выносят мозг smile.gif

Спустя 13 минут, 59 секунд (19.05.2010 - 13:58) jetistyum написал(а):
Лучшее .. это понятие растяжимое, возможно самый компактный код... ну а на счет скорости работы нужно потестить, кто хочет заняться???
у меня сейчас рабочий день, и к сожалению не могу тратить много времени...

Спустя 7 минут, 54 секунды (19.05.2010 - 14:06) glock18 написал(а):
Цитата (Семён @ 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}


у меня норм. ты обрати внимание, что первый вариант вообще вложенностей не поддерживает, зато занимает 7 строк. эта строка нормально отработала и во 2, и в 3. третий завис на такой

Цитата
{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}}


а второй и его нормально отработал. скорее всего опечатка где-то в 3м, потом гляну возможно

Спустя 55 минут, 22 секунды (19.05.2010 - 15:01) ApuktaChehov написал(а):
А у меня вообще не хватило мозга сделать это. Да и времени тоже не было совсем. sad.gif

А почему все используютя функцию rand? Нужно было в случайном порядке делать? blink.gif

А я пытался реализовать обработку всевозможных вариантов по порядку.
Придумал, алгоритм, но вот реализовать его в код не вышло, жаль. sad.gif

Спустя 8 минут, 10 секунд (19.05.2010 - 15:09) ApuktaChehov написал(а):
А и в правду, в случайном порядке если, это сделать довольно не сложно.

Спустя 26 минут, 10 секунд (19.05.2010 - 15:35) Michael написал(а):
Итак, мой отчет о скорости.
Красным - предложение:
Свернутый текст
"{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  
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

Спустя 7 минут, 34 секунды (19.05.2010 - 15:43) Семён написал(а):
Цитата (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  
2.(max) 13.6, 15.0
3.(Zarfar) 3.0, ошибка
4.(glock18)
вариант 2: 2.37, 3.44
вариант 3: 3.25, висим
5.(Michael) 2.32, 2.14

А то что я опубликовал посчитай. smile.gif

Спустя 17 минут, 19 секунд (19.05.2010 - 16:00) glock18 написал(а):
Цитата (DedMorozzz @ 19.05.2010 - 10:29)
однозначно самое оригинальное решение - через SQL))


спорно вообще то, потому что sql такой же язык как и другие. и в нем есть те же функции а-ля substr, strpos (в mysql locate кажется).

Спустя 8 минут, 27 секунд (19.05.2010 - 16:09) glock18 написал(а):
Самый верный подход к лексическому разбору у Michael. По-моему, бесспорно. Молоток! smile.gif

Спустя 2 минуты, 18 секунд (19.05.2010 - 16:11) Michael написал(а):
Цитата (Семён @ 19.05.2010 - 14:43)
А то что я опубликовал посчитай. smile.gif

Посчитал. Делаешь через глобальную переменную - я так и прикрутил вызовы. Для чистоты эксперимента оформи, как все, функцией - передача параметра функции то же что то значит.

Спустя 59 минут, 38 секунд (19.05.2010 - 17:11) Семён написал(а):
Цитата (Michael @ 19.05.2010 - 17:11)
Цитата (Семён @ 19.05.2010 - 14:43)
А то что я опубликовал посчитай. smile.gif

Посчитал. Делаешь через глобальную переменную - я так и прикрутил вызовы. Для чистоты эксперимента оформи, как все, функцией - передача параметра функции то же что то значит.

Ладно, что с тобой спорить
Перед тобой наверно нада ещё сплясать? smile.gif

Спустя 2 часа, 2 минуты, 33 секунды (19.05.2010 - 19:13) zarafar написал(а):
Цитата (Michael @ 19.05.2010 - 12:35)

3.(Zarfar) 3.0, ошибка 

У меня во втором случае ошибка, потому что в строке присутствуют символы, которых не было в исходной строке задания.

Нужно изменить паттерн регулярки, просто добавив точку и цифры.
$pattern = "/{([a-zA-Z0-9| \.]+)}/iu";


И мой ник пишется Zarafar, не Zafar И не Zarfar. Ctrl+C рулит.

Спустя 13 минут, 4 секунды (19.05.2010 - 19:26) Семён написал(а):
Если не секрет как ты проводишь замеры? на какой ОС, какой сервер? Какая приоритетность? Установлены ли моды? Сомневаюсь, что код jetistyum будет выполнятся некое значение ~6

Спустя 16 минут, 43 секунды (19.05.2010 - 19:43) Guest написал(а):
потрясающе)

Спустя 30 минут, 50 секунд (19.05.2010 - 20:14) DedMorozzz написал(а):
Всё равно, приз зрительских симпатий - работе на SQL wink.gif

Спустя 20 минут, 55 секунд (19.05.2010 - 20:35) Michael написал(а):
zarafar, пересчитал.

Цитата (Семён)
Если не секрет как ты проводишь замеры?

Вот так:
Свернутый текст

$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);
}


Из всех скриптов только твой выбивается для подсчета, т.к. завязан на глоб. переменную и не удобен для многократной генерации строк. ОС и все остальное - у всех проверялось на одной машине и одной конфигурации.

Цитата (Семён)
Перед тобой наверно нада ещё сплясать?

это не обязательно laugh.gif т.к. это всего лишь мой тест и очень даже желательно, чтобы еще кто-то посчитал. Это не возбраняется wink.gif .

Спустя 7 минут, 18 секунд (19.05.2010 - 20:42) Michael написал(а):
Цитата (DedMorozzz @ 19.05.2010 - 19:14)
Всё равно, приз зрительских симпатий - работе на SQL wink.gif

да, прикольно. Плохо, что проверить в работе, погонять не могу. Может автор на хостинг выставит ?

Спустя 1 час, 30 минут, 11 секунд (19.05.2010 - 22:12) netruxa написал(а):
Ребята, вот еще одна задачка. http://www.askdev.ru/question/1969/Code-Golf-игра-в-города/
Там и приз реальный есть. Давайте здесь парралельно решать ее, завтра выложу свой вариант

Спустя 1 минута, 46 секунд (19.05.2010 - 22:14) DedMorozzz написал(а):
вах, я за, если выдастца завтра свободные пол часика. Идея супер =)

Спустя 21 минута, 9 секунд (19.05.2010 - 22:35) twin написал(а):
Блин, жаль я окарал. Ведь даже начал писать... Хотя ни на какое место претендовать бы не смог, если чесно. Делать начал по классической схеме - посимвольный анализ со стеком. Наверняка не самое оптимальное решение, но хотелось без регулярок.
Так что наверное и правильно, что не стал. Нового ничего)))

А вот кстати с SQL решение хоть и оригинальное, но условиям задачи не отвечает.
Там не было упоминаний о возможности использования (собственно даже о наличии) сервера, использующего SQL.
Это не умоляет заслуг, так, мысли вслух.

Обидно конечно, тихо мои кони скачут(((


Спустя 10 часов, 33 минуты, 7 секунд (20.05.2010 - 09:08) Michael написал(а):
Обновил рейтинг скоростей (на вкладке 3) - сам переделал Семёна работу под функцию (2 действия), а то он не считает нужным blink.gif .
Все, теперь все скрипты в равных условиях.

Спустя 42 минуты, 10 секунд (20.05.2010 - 09:50) zarafar написал(а):
А я посмотрел еще раз свой код и понял, что понаписал лишнего. Если убрать всё, оставить цикл и регулярку, то все так же работает laugh.gif rolleyes.gif Не буду уже исправлять и выкладывать, смысла наверно нет. Получается так же, как у glock18 в первом варианте, только работает для любой вложенности. Скорость увеличивается, но не принципиально.

Спустя 2 часа, 46 минут, 31 секунда (20.05.2010 - 12:37) jetistyum написал(а):
Ну почему же, можно дальше заниматься оптимизацией, никто не сказал что на этом можно ставить точку, я думал что у меня код получился довольно простой и шустрый, но нет, многие меня сделали, и Семён вообще всех сделал smile.gif
но у меня был жесткий таймлимит - час, из которого я потратил полчаса на другое решение, от которого потом отказался..
Кстати не понял, что означает данная фраза?
Цитата (Семён @ 19.05.2010 - 19:26)
Сомневаюсь, что код jetistyum будет выполнятся некое значение ~6

Спустя 8 минут, 4 секунды (20.05.2010 - 12:45) Семён написал(а):
Это означало, что я сомневаюсь что результаты производительности на 100% не до коцна действительны если проводились на томже Denwere (WINDOWS)
Поэтому ведь и спрашивал Miсhael, как он замерял скорость smile.gif))
"А некая цифра шесть" - сразу не увидел по тупости, что он указал (в секундах)

Спустя 1 час, 2 минуты, 23 секунды (20.05.2010 - 13:47) jetistyum написал(а):
Ну теперь всё понятно! я уж думал что сомневаешься что код будет работать впринципе...
блин, со временем жестко совсем sad.gif... никак не доберусь до потестить ... посмотреть код.... заняться рефакторингом и оптимизацией производительности...
Понравился код glock18, даже не код (в код пока не вникал), а серьёзный подход, основательный!
Понравилось решение Семёна - очень простое, и при этом очень быстрое, кстати вот я уж думал что регулярные выражения будут работать медленнее сравнительно...
ну теперь можно заняться оптимизацией своих решений, и посмотреть какое в итоге будет самым шустрым!

Спустя 6 минут, 7 секунд (20.05.2010 - 13:53) Семён написал(а):
Цитата (jetistyum @ 20.05.2010 - 14:47)
Понравился код glock18, даже не код (в код пока не вникал), а серьёзный подход, основательный!

Да мне тоже так показалось)

Спустя 26 дней, 13 часов, 58 минут, 4 секунды (17.06.2010 - 03:52) gzim9x написал(а):
решения показались сложными...
привожу свой вариант:


<?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}');
?>



Спустя 3 часа, 32 минуты, 18 секунд (17.06.2010 - 07:24) Michael написал(а):
Неплохо gzim9x. Результаты по скорости обновил.

Спустя 16 часов, 8 минут, 11 секунд (17.06.2010 - 23:32) gzim9x написал(а):
Ок! -- благодарю за карму -- по скорости код в тройке cool.gif
Если честно, на скорость особое внимание не обращал, -- согласитесь, все-таки PHP не рекордсмен в вопросах скорости (удобен -- это да!). Иногда реально боттлнек приходится переписывать на С -- зачастую с 15-20 кратным увеличением по скорости...

Спустя 7 часов, 10 минут, 27 секунд (18.06.2010 - 06:42) Michael написал(а):
Та по скорости - это тут так: чтоб хоть как то посравнивать скрипты. Говорит мало о чем. Ну какая разница если например в моем скрипте мне надо одно предложение создать и это будет делаться 0.2 микросекунды или 0.3 ? Разница мизер.
Вот если это алгоритм какого то дорвея где за ограниченное время работы скрипта нужно сгенерить max предложений, тогда еще можно по скорости.

Больше просто никак не стали сравнивать, забыли sad.gif . Хотя конечно по простоте и наглядности алгоритма можно было бы голоснуть. Но увы - организатор олимпиады испарился.

Спустя 13 дней, 17 часов, 41 минута, 19 секунд (2.07.2010 - 00:24) gzim9x написал(а):
Michael
выдалось свободное время и не удержался -- еще один вариант той же задачи... в стиле явно не PHP-way smile.gif да и 5.3 требует.
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}');

Спустя 6 часов, 37 минут, 42 секунды (2.07.2010 - 07:02) Michael написал(а):
Цитата
да и 5.3 требует.

а у меня то и нет такого пхп smile.gif .

Спустя 16 минут, 38 секунд (2.07.2010 - 07:18) kirik написал(а):
Во блин))
Твин не успел, а я вообще тему пропустил)
Где-то полгода назад писал такой спиннер, но небыло задачи работать со вложенностями. Вот его код:

$text = '...';

function getRnd($arr) {
return stripslashes($arr[array_rand($arr, 1)]);
}
echo preg_replace('/{(.+?)}/es', "getRnd(explode('|', '$1'))", $text);


А если еще учитывать вложенности.. над подумать)
Твин, время всегда есть)

Спустя 1 час, 34 минуты, 42 секунды (2.07.2010 - 08:53) gzim9x написал(а):
Michael
для для PHP<5.3

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}');

kirik
я же тоже не успел smile.gif

Спустя 1 час, 5 минут, 21 секунда (2.07.2010 - 09:58) Michael написал(а):
Быстрее стало у тебя считать. Обновил в табличке результат.

Спустя 2 часа, 38 минут, 10 секунд (2.07.2010 - 12:36) Lolik написал(а):
чем будет полезна эта функция? dry.gif

Спустя 50 минут, 39 секунд (2.07.2010 - 13:27) Michael написал(а):
Цитата (Lolik @ 2.07.2010 - 11:36)
чем будет полезна эта функция?  dry.gif

Это больше соревнование в программировании более существенных алгоритмов чем обычные форумные 2 + 2 = 5 ( smile.gif ).
Но и польза может быть - например при построении дорвея или в онлайн игре с различными вариантами ответов. Можно наверное еще чего придумать.
Вот конкурс сейчас идет - тоже алгоритмы чем то родственны.

Спустя 29 минут, 44 секунды (2.07.2010 - 13:57) gzim9x написал(а):
Цитата (Michael @ 2.07.2010 - 13:27)
Вот конкурс сейчас идет -  тоже алгоритмы чем то родственны.

Очень верно подмечено! smile.gif

Спустя 5 дней, 17 часов, 10 минут, 54 секунды (8.07.2010 - 07:08) kirik написал(а):
Мда..
Посидел над задачей.. Луче чем у gzim9x не выходит. Изначально была сумасшедшая идея переделать строку в JSON массив, потом через json_decode перевести в обычный массив и уже работать с ним.. С переделкой строки в массив проблем не возникло, а вот с генерацией новой строки из массива... Скорее всего идея не жилец.

Единственное, вот немного "улучшил" функцию gzim9x:
function randomSentence($string) {
return (strpos($string,'{')===false)
?
$string
: ((strpos($string, '}') === false)
?
exit('Syntax error!')
:
call_user_func(__FUNCTION__, preg_replace_callback("/{[^{}]+\}/",'call',$string)));
}

Тоесть когда есть не закрытые скобки, функция выдаст 'Syntax error!' (на скорость почти не влияет).

Спустя 3 часа, 37 минут, 59 секунд (8.07.2010 - 10:46) gzim9x написал(а):
kirik
Для обработки синтаксиса я бы ввел и использовал параметр количества замен "count" функции preg_replace_callback. Но важна была каждая мкс smile.gif тем более что здесь на форуме к регуляркам относятся с некоторым необоснованным предубеждением wink.gif

Спустя 3 дня, 19 часов, 1 минута, 47 секунд (12.07.2010 - 05:47) kirik написал(а):
Цитата (gzim9x @ 8.07.2010 - 02:46)
к регуляркам относятся с некоторым необоснованным предубеждением

Хм)) Ну не знаю) Я очень люблю задачки по регулярным выражениям)

Спустя 7 месяцев, 5 дней, 21 час, 25 минут, 9 секунд (18.02.2011 - 04:13) inpost написал(а):
А вот моя мини-реализация. Пытался своей головой додумать, единственное запуск вложенностей ещё не успел реализовать. Сейчас как раз над этим думаю. Пока что каждая отдельная вложенность добавляется вручную в самом конце скрипта.

У меня только выводит все варианты, а не берёт случайный.

<?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);

Спустя 5 часов, 38 минут, 10 секунд (18.02.2011 - 09:51) Michael написал(а):
inpost, надо же наверное выполнить условие задачи, а не сделать что захочется. Что на входе и что на выходе. В первом сообщении ТС описано.

Цитата (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 предложение менялось каждый раз.
)
...


т.е. значение в arr[0][0] дублируется значением в arr[1][0], дальше - все тоже самое. А для случайности нужна равновозможность вариантов.

Спустя 8 часов, 11 минут, 41 секунда (18.02.2011 - 18:02) inpost написал(а):
Michael
http://phpforum.ru/index.php?showtopic=40704&hl= - тут говорится все варианты выбрать, jetistyum сказал, чтобы я в этой теме выложил своё решение на ту задачу.
Сейчас добавлю лишь случайный выбор строки сюда и всё, чтобы было по теме.

Спустя 14 дней, 17 часов, 53 минуты, 15 секунд (3.03.2011 - 11:56) Ulan написал(а):
мой вариант решения
находим самое глубокое вложение { }, обрабатываем строку и с каждым циклом поднимаемся на уровень выше.
попозже еще попробую сделать вывод всех вариантов.

<?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;

Спустя 7 месяцев, 25 дней, 12 часов, 30 минут, 10 секунд (28.10.2011 - 23:26) Гость_Я написал(а):
Вот мой вариант

Задача не сложная, нужно только знать регулярки. У меня с ними не очень хорошо :( поэтому паттерн взял с пред. страниц.
Ну а остальное уже не так интересно видимо :)

делать такого рода задача есть смысл только с помощью регулярок, иначе очень не уклюже смотрится.



$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];
}

Спустя 4 минуты, 41 секунда (28.10.2011 - 23:31) Гость_Я написал(а):
на мой взгляд мой вариант в этом стиле
http://phpforum.ru/index.php?act=Print&cli...imin=62&limit=1

однако чуть более читабельный, и автор (по ссылке) молодец, почему это только не PHP way ? все гуд!
Быстрый ответ:

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