powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Разминка для мозгов
25 сообщений из 271, страница 2 из 11
(PHP) Разминка для мозгов
    #36554361
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

на всякий случай, вот что у меня получилось:

Код: plaintext
1.
2.
while (preg_match("/\{([^{}]+?)\}/", $str)) 
 $str= preg_replace_callback("/\{([^{}]+?)\}/",create_function('$s','$a=explode("|",$s[1]);return $a[rand(0,count($a)-1)];'),$str);
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36554765
Репослав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С помощью регулярок не интересно.
Вот мое решение:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
function StrCharPosBack($haystack, $needle) // ищет последнее вхождение символа
{
	for ($i = strlen($haystack) ; $i>= 0  ; $i--)
	{
		if (substr($haystack, $i,  1 ) === $needle)
			return $i;
	}
	
	return false;
}

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

while (strpos($str, "{") !== false)
{
	$pos1 = strpos($str, "}");
	$buf_mas = substr($str,  0 , $pos1);
	$pos2 = StrCharPosBack ($buf_mas, "{");
	$buf_mas = substr($buf_mas, $pos2+ 1 );
	$exploded_buf_mas = explode ("|", $buf_mas);
	$rnd = rand( 0 , count($exploded_buf_mas)- 1 );
	$str = substr_replace($str, $exploded_buf_mas[$rnd], $pos2, $pos1+ 1 -$pos2);
}

echo $str;
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36554779
Репослав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это решение не оптимально, его еще можно доработать. В частности, у меня сначала ищется первое вхождение "}", а потом последне вхождение "{". А надо наоборот, тогда лишних шагов шикла не будет.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36554895
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Репослав,

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

В процессе анализа собирается структура для обработки и потом в один проход формируется результат.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36554934
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anjey aka PMРепослав,

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

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

но до конца я это не доделал, так как объем кода получался совсем не маленький и я бросил)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36554963
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

Если дома не впадло будет включить домашний комп покажу решение аналогичной задачи на сишке, а так писать впадло =)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36554969
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РепославС помощью регулярок не интересно.
Вот мое решение:

мало того что оно у вас неоптимально, так еще оно перестает работать если в строке, вне блоков, появляются символы { и }
да, в условии задачи это не оговорено, но не оговорено и обратное. так что алгоритм должен быть универсальным и устойчивым к таким ситуациям)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36555018
Репослав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r u,
Да, действительно, с левыми { и } варианта я не учел.=)
Хотя с другой стороны, получается, что в исходной строке определенный формат. А в нормальных форматах специальные символы должны экранироваться. Не подумайте, это я не отмазываюсь=)

*ушел дорабатывать скрипт*
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36555199
Репослав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, в случае с "не специальными" не экранированными { и } возникают неоднозначности: какой из символов является "не специальным"?

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

или

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

В данном случае, конечно, очевидно. Но ведь строка в рабочей программе может быть совсем другой. ИМХО, "не специальные" { и } нужно экранировать. А если в строке не равное количество неэкранированных знаков { и }, то программа должна выдавать ошибку.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36555253
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Репослав,

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

типа:
1. если } скобка до {, то игнор
2. если { не закрыта, то тоже игнор
3. блоком считать от { и до ближайшей справа }, при этом если встречена { то блок сдвигается
4. для вложенных блоков повторять пункт 3. рекурсивно
и т.д.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36556889
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот еще что у меня получилось, без регулярок:

Код: plaintext
1.
2.
3.
4.
5.
$p1=$p2=false;
while (($p2 = strpos($str,'}'))!==false && ($p1 = strrpos(substr($str, 0 ,$p2),'{'))!==false) {
    $a = explode('|', substr($str, $p1+ 1 ,$p2-$p1- 1 ));
    $str = substr_replace($str, $a[rand( 0 ,count($a)- 1 )], $p1, $p2+ 1 -$p1);
}
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36556919
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
самопроверка.

что напечатает скрипт? и почему
Код: plaintext
1.
echo  08 ;
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36557318
Репослав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r u, у вас получился очень компактный вариант=) У меня, правда, глаза на лоб полезли от сложночти восприятия(

автор
Код: plaintext
echo  08 ;

В восьмиричной системе счисления нет знака "8". Что выведет - сейчас проверю)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36557679
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Репославr u, у вас получился очень компактный вариант=) У меня, правда, глаза на лоб полезли от сложночти восприятия(

автор
Код: plaintext
echo  08 ;


правда у него тоже проблемы с непарными символами }.
насчет сложности тоже согласен. если разбить на атомарные операции то строки на 3 будет больше. но суть не изменится
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36560774
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что выведет скрипт? и почему, как вы думаете.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
class My {
    private $value =  1 ;
    public function &getValue() { return $this->value; }
}
$obj = new My;
$my = &$obj->getValue();
$my =  666 ;

echo $obj->getValue();
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36561222
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

ну очевидно, что 666, потому что всё по референсу по цепочке.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36562902
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не секрет, что уважающий себя веб программист должен знать SQL, поэтому следующая задачка именно по нему:
Код: plaintext
1.
2.
Есть таблица Email(id, address).
Написать запрос, на "чистом SQL", который выберет каждую  10  строку
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36563925
Репослав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
Есть таблица Email(id, address).
Написать запрос, на "чистом SQL", который выберет каждую  10  строку
Ответ, который получился у меня:
SET @i=0; SELECT* FROM (SELECT `id`, `address`, @i:=@i+1 as `i` FROM `Email`) WHERE NOT `i`%10;
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36563928
Репослав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, здесь сообщения редактировать нельзя.

SET @i=0; SELECT* FROM (SELECT `id`, `address`, @i:=@i+1 as `i` FROM `Email`) AS res WHERE NOT `i`%10;
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36563933
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Репослав,

это не чистый SQL
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36563950
Репослав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anjey aka PM, если можно, укажите, что здесь не подходит под стандарт? Я плохо знаю SQL, но достаточно хорошо знаю MySQL. Я думал, что "чистый SQL" - имеется в виду без постобработки результатов в скрипте.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36564071
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Репослав,

Просто на другом сервере ваш запрос работать не будет, только на мускуле
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36564168
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anjey aka PM,

видимо я плохо знаю SQL, но без переменных, ИМХО, никак.

Другой вопрос, что "правильнее", наверное,
Код: plaintext
1.
2.
SELECT id, address, @i: = @i +  1  row 
FROM email e, (SELECT @i :=  0 ) r
HAVING i %  10  =  0 
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36564209
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nym,

на FB можно генераторами, на постгре сиквенсами помойму тоже можно, это все-таки ближе к стандарту нежели переменные.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36564738
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пока нет близкого решения )

p.s. задачу можно решить, например, с помощью % и count()
...
Рейтинг: 0 / 0
25 сообщений из 271, страница 2 из 11
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Разминка для мозгов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]