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

Очередная задачка(встреченная на просторах инета)

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

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

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

вариантов решения много. но есть очень компактное и "красивое"

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

сходу так и не скажешь... Через preg_replace_callback получается, но это некрасиво и долго. Через токены пока не додумался как сделать...

Интересно.)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36553053
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делал бы анализ строки, 2-3 небольших класса крассиво и аккуратно, можно через PCRE с помощью рекурсивных RE
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36553070
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anjey aka PM,

через рекурсивные там получится на каждый вложенный список выбора прогонять еще раз этот же рекурсивный паттерн, так как матчит он весь кусок выше рекурсивного субпаттерна.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36553092
Master5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
explode();
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36553096
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Master5,

бай вот?
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36553105
Master5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymMaster5,
бай вот?
Что-что???
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36553317
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymr u,

сходу так и не скажешь... Через preg_replace_callback получается, но это некрасиво и долго. Через токены пока не додумался как сделать...

Интересно.)
ну если честно, Компактность и Красивость решения - понятие растяжимое)))
я не говорил что это будет одна строка ))
хотя может и будет)) гениев хватает

через регулярки - вполне красивое получается)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36553536
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,
первое впечатление от Вашей задачки и всевозможных символов ")))" - Вы пришли либо пошутить, либо поиздеваться, но скорее всего "чужими руками жар загребать".
Уважаемый, Вы бы для начала хоть бы что-нибудь от себя предложили!
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36553572
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой жар??
самозабанься.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36553581
Фотография tarasf31
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

Вы задачу с решением с Хабра взяли или сами решили?

Судя по формулировке таки скопировали... :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36553613
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowкакой жар??
самозабанься.
А где же Ваше решение, уважаемый?
Или на "пустой крючек" клевать, что-то все-таки останавливает?
Я то знаю ответ, но Вам не скажу.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36553704
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что общего между наличием решения и моим
1) вопросом
2) предложением

Ответьте пожалуйста на вопрос про жар чужими руками. и про предложение самозабаниться, ненадо переводить разговор на меня.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36553746
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowа что общего между наличием решения и моим
1) вопросом
2) предложением

Ответьте пожалуйста на вопрос про жар чужими руками. и про предложение самозабаниться, ненадо переводить разговор на меня.
Ни Ваш вопрос, ни Ваше предложение не имеет ни какого-либо отношения к решению задачи.
Вы не уводите разговор в сторону. Предложите что-то по сути задачи.
В пративном случае с таким же успехом можно сказанное Вами Вам и переадресовать. ;)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36553761
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tarasf31r u,
Вы задачу с решением с Хабра взяли или сами решили?
Судя по формулировке таки скопировали... :)
как я и написал выше, задача не моя. да наверное на хабре она мелькала. строка точно как там была, потому что я её сохранял к себе когда пытался решить. а условие уже я тут своими словами описал.
задачка показалась мне забавной. при рутинной работе не часто такие появляются на горизонте. так что размяться может комуто будет интересно.

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

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

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

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

да я её решил через регулярки. оптимальнее и компактнее пока не смог придумать)
ps если вы мне не верите) то либо задавайте свои задачки(а я попробую решить) либо чуть позже опубликую свое решение) и можно будет обсудить.

Я Вас ни в чем не обвиняю. Когда эта задачка появилась на Хабре - я ее решыл через регулярки. Там , к стати, есть пару интересных решения на разных языках програмирования :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36553801
Master5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISВ пративном
ScareCrow-а не трошь!
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36553959
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uan0nymr u,

сходу так и не скажешь... Через preg_replace_callback получается, но это некрасиво и долго. Через токены пока не додумался как сделать...

Интересно.)
ну если честно, Компактность и Красивость решения - понятие растяжимое)))
я не говорил что это будет одна строка ))
хотя может и будет)) гениев хватает

через регулярки - вполне красивое получается)
Не, регулярки не катят. Во-первых, получается около 15 строк кода, что уже не круто. Во-вторых, очень неоптимально. Если, конечно, я правильно сделал на регулярках сам.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36553967
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые ткоа не смейтесь над моим решением и сильно не критикуйте - регулярки и индеексы в базах всегда были мои вечные проблемы:
Код: plaintext
1.
2.
3.
4.
$html_body = '{Пожалуйста|Просто} сделайте так, чтобы это {удивительное|крутое|простое} тестовое предложение '.
             '{изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}';
preg_replace("/\{([^\}]+)\}/e", 
             "explode('|','\\1')[rand(0,sizeof(explode('|','\\1'))-1)]", 
             $html_body);
ps/ мона ввести функцию катоаря это красивее сделает но это уже будет +3 строчки
2seti
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36554015
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ренат,

код бы хотя бы запустил... синтаксис даже неправилен, не говоря о алгоритме.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36554054
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
та же логика, тока строку представил в виде функции:
Код: plaintext
1.
2.
3.
4.
5.
6.
function r($x){
	$s = explode('|',$x);
	return $s[rand( 0 ,sizeof($s)- 1 )];
}
print preg_replace('/\{([^\}]+)\}/e', 
			 'r("$1")',
              $html_body);

2seti
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36554058
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Master5AISВ пративном
ScareCrow-а не трошь!
А я вообще никогда никого не трогаю, пока меня не трогают.
Лучше бы по теме красноречие проявляли.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36554117
Жортен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS r u,
Вы пришли либо пошутить, либо поиздеваться, но скорее всего "чужими руками жар загребать".
Вы впервые на этом форуме? Так зачем обижать человека не имея о нем ни малейшего представления?

ЗЫ: в следующий раз выпишу форменное предупреждение.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36554335
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РенатУважаемые ткоа не смейтесь над моим решением и сильно не критикуйте - регулярки и индеексы в базах всегда были мои вечные проблемы:
Код: plaintext
1.
2.
3.
4.
$html_body = '{Пожалуйста|Просто} сделайте так, чтобы это {удивительное|крутое|простое} тестовое предложение '.
             '{изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}';
preg_replace("/\{([^\}]+)\}/e", 
             "explode('|','\\1')[rand(0,sizeof(explode('|','\\1'))-1)]", 
             $html_body);
ps/ мона ввести функцию катоаря это красивее сделает но это уже будет +3 строчки
2seti
направление правильное )
...
Рейтинг: 0 / 0
(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
(PHP) Разминка для мозгов
    #36565098
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
select count (test_2.id_test) as rank, test_1.id_test, test_1.string
from test as test_1 inner join test as test_2 on
	test_1.id_test >= test_2.id_test
group by test_1.id_test, test_1.string
where rank %  10  =  0 
order by rank
как то так.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36565288
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow
Код: plaintext
1.
2.
3.
4.
5.
6.
select count (test_2.id_test) as rank, test_1.id_test, test_1.string
from test as test_1 inner join test as test_2 on
	test_1.id_test >= test_2.id_test
group by test_1.id_test, test_1.string
where rank %  10  =  0 
order by rank
как то так.
Если имелось в виду подобное решение, то ну его нафиг этот стандартный SQL.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36565290
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

поздравляю)
это одно из правильных решений

есть еще такое:

SELECT * FROM T E1
WHERE (SELECT COUNT(*) FROM T E2 WHERE E1.ID>=E2.ID)%10=0
ORDER BY E1.ID
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36565308
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

кстати, там вместо
where rank % 10 = 0
надо
having (count (test_2.id_test)%10)=0
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36565660
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задачка:

-Вывести список файлов в директорий (нельзя пользоваться встроенными функциям для работы с директориями и файлами)

ps ответ будет сюрпризом для тех кто не знает (я был в их числе ))
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36565991
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

glob или итератор? `ls`?
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36566010
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymr u,

glob или итератор? `ls`?
glob И итераторы нельзя
`ls` можно)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36566043
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u`ls` можно)
safe mode.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36585384
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
следующая разминка:

необходимо проверить валидность, допустимость и сложность пароля.
критерии проверки:
- хотя бы один латинский символ в нижнем регистре
- хотя бы один латинский символ в верхнем регистре
- хотя бы одна цифра
- хотя бы один спец.символ (например из готового списка)
- минимальная длина 8 символов

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

пока остановился на таком варианте

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%&]).{8,}$
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36591530
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uScareCrow,

пока остановился на таком варианте
+

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%&]).{8,}$

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

пока остановился на таком варианте
++

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%&]).{8,}$

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

всем известен классический алгоритм вычисления факториала. в любой книжке по программированию, приводится функция вычисления факториала с применением рекурсии:
Код: plaintext
1.
2.
3.
4.
5.
function fact($i) {
	if ($i< 0 ) return false;
	if ($i== 0 ) return  1 ;
	return $i*fact($i- 1 );
}
а как быстро и эффективно вычислить факториал без использования рекурсии?
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36606524
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
задача - проверить валидность IP адреса.
а вы знаете самый быстрый и короткий способ, как сделать это в php?

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

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

можно еще через filter_var - тоже быстро.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36607045
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u
а как быстро и эффективно вычислить факториал без использования рекурсии?
По формуле Стирлинга? =)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36607103
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
     function  FackToReal($f)
    {
         if  ($f <  0 )  return   false ;
        $res =  1 ;
         for  ($i =  1 ; $i <= $f; $i++) $res *= $i;
         return  $res;
    }


     function  FackToReal2($f)
    {
         if  ($f <  0 )  return   false ;
        $i =  1 ;
        $res =  1 ;
         while  ($i <= $f) $res *= $i++;
         return  $res;
    }
А в чем подвох?
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36607107
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Угадайте какая быстрее (только чур не проверять! =))
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36607139
f.future
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hett,

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

long2ip и поймать exception или ошибку или false - лень проверять, а в мане не написано, что возвращает в случае неудачи.
да. быстрее чем через long2ip незнаю)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36607629
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во всяком случае не эксепшен, я считаю)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36607631
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
f.futureHett,

я думаю первая.
Тесты показали что вторая конструкция работает чуть быстрее.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36607693
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett
Тесты показали что вторая конструкция работает чуть быстрее.
Я, кстати, тоже подумал, что первая. Решил проверить перед постингом - был удивлен. Почему?
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36607732
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наверно потому что for медленная конструкция.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36607748
WadimX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nym,

Скорее всего, потому что во втором случае алгоритм:
1. Умножение на счётчик
2. Увеличение счётчика
...
А в первом:
1. Умножение на счётчик
2. Прыжок
3. Увеличение счётчика
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36607752
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скорее всего потому что:
авторEach of the expressions can be empty or contain multiple expressions separated by commas.
и
авторIn the beginning of each iteration, expr2 is evaluated
на мое имхо оно не переводится в байт код а исполняется через внутренний аналог eval()
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36607944
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
классическая задача Quine .
Quine(Куайн) — компьютерная программа которая выдаёт на выходе точную копию своего исходного текста. при этом нельзя использовать никакие внешние данные. тоесть нельзя использовать функции чтения файла, например... при этом самый гламур - чтобы программа получилась как можно меньше.

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

PS решения типа <?php readfile(__FILE__); это не квайн
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36620340
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

раз Квайн вам не очень интересен, то другая задачка:

Код: plaintext
1.
2.
3.
4.
5.
// есть  2  переменные $a и $b (не объекты!)
var_dump($a==FALSE); // выводит bool(true)
var_dump($b==TRUE);  // выведет bool(true)
var_dump($a==$b);    // выведет bool(true)
// Это возможно? если да, то что хранится в переменных? )
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36620382
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

null
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36620384
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, ИМХО, поведение неправильно. Должно быть везде FALSE.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36620411
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymr u,

null
нет
null не равно TRUE
одно из условия не выполнится
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36620421
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymКстати, ИМХО, поведение неправильно. Должно быть везде FALSE.
моя имха - NULL...
такая логика реализована в РСУБД и в этом есть смысл
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36620437
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

хм, действительно, неправильно переписал. :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36621365
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгенийan0nymКстати, ИМХО, поведение неправильно. Должно быть везде FALSE.
моя имха - NULL...
такая логика реализована в РСУБД и в этом есть смыслващет согласно стандарту

NULL = NULL -- ложь
NULL IS NOT DISTINCT FROM NULL -- истина
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36621394
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений
моя имха - NULL...

NULL это неправильный ответ. как уже написали.
или вы о другом?
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36621488
phpTeach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
$a =  0 ;
$b = 'Some text';
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36621529
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
phpTeach,

правильно. а объяснить механизм можете?
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36621604
phpTeach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uphpTeach,

правильно. а объяснить механизм можете? Происходит неявное приведение типов при сравнении, что то вроде:

var_dump((bool)$a==FALSE);
var_dump((bool)$b==TRUE);
var_dump((int)$a==(int)$b);
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36621649
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
phpTeach,

точно)
причем это описано в доках
If you compare an integer with a string, the string is converted to a number.
за такие вот "особенности" поведения - очень часто и ругают php
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36640658
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

пока нет интересных задач, очередная неоднозначная "особенность" PHP )

в документации сказано что Имя переменной НЕ может начинаться с цифры. и действительно:
$1 = 2; вызовет ошибку интерпретатора.

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

возвращаясь к квайну (программа которая выводит свой код)
один из вариантов
Код: plaintext
1.
<?php printf($a='<?php printf($a=%c%s%c,39,$a,39);', 39 ,$a, 39 );
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36849575
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даешь еще задачки =)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #36850209
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anjey aka PM,

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

очередная разминка) навеяно вчерашним холиваром на тему ООП в php )

Дано:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class passwords {
	private $p = 'system_password';
	public function showP(){
		echo $this->p;
	}
}
$p = new passwords;
$p->showP(); // напечатает system_password
/*
 Напишите тут код, который заставит следующий вызов $p->showP(); печатать слово 'HACK'
*/
$p->showP();
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029098
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вариант по-проще

Код: plaintext
1.
2.
3.
4.
5.
6.
 classkit_method_redefine (
    'passwords',
    'showP',
    '',
    'echo "HACK";',
    CLASSKIT_ACC_PUBLIC
);

как вариант по-сложнее через Reflection API
Код: plaintext
1.
2.
3.
4.
$ro =  new  ReflectionObject($p); 
$rp = $ro->getProperty('p'); 
$rp->setAccessible( true ); 
$rp->setValue('HACK');
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029100
Хоббит маг
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u, против лома нет приёма

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 class  passwords_hacked
{
  public   function  showP()
 {
    echo  'HACK';
 }
}
$p =  new  passwords_hacked;
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029104
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anjey aka PM,

$rp->setValue($p, 'HACK');
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029142
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anjey aka PM,
1) classkit и другие сторонние модули расматривать не будем. так можно и свой написать тогда)
2) setAccessible появилось только в php 5.3, к томуже нужно изменить только значение, поле должно оставаться private.

Хоббит маг
Класс должен остаться темже.
тоесть например var_dump($p); до и после - должен отличаться только значением поля $this->p.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029153
Хоббит маг
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u, жаль, у меня такого глубокого опыта работы с классами нет. =)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029154
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uAnjey aka PM,
1) classkit и другие сторонние модули расматривать не будем. так можно и свой написать тогда)
2) setAccessible появилось только в php 5.3, к томуже нужно изменить только значение, поле должно оставаться private.

Хоббит маг
Класс должен остаться темже.
тоесть например var_dump($p); до и после - должен отличаться только значением поля $this->p.это дополнительные условия, которые не были озвучены раньше посему не имеют силы =)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029180
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anjey aka PM,

согласен, моя вина, наверное.
Просто тут речь про чистый PHP, сторонние модули и дополнения оставим в стороне.

Класс очень примитивен специально, в реальности он может быть очень большим и сложным.
И нужно подменить значение, но так чтобы ниже, имея этот объект нельзя было выявить что значение было изменено)

Итак, уточняем задачу)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class passwords {
	private $p = 'system_password';
	public function showP(){
		echo $this->p;
	}
}
$p = new passwords;
$p->showP(); // напечатает system_password
/*
 - Напишите тут код, который заставит следующий вызов $p->showP(); печатать слово 'HACK'
 - Нужно обойтись чистым php, из коробки )
 - класс изменять или заменять другим нельзя
*/
$p->showP();
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029235
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

Код: plaintext
$p = unserialize(strtr(serialize($p), array('s:15:"system_password";' => 's:4:"HACK";')));
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029245
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nym,

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

на самом деле я надеялся будет что-то более изящное, типа $p->showP = function() {echo "HACK";};, но не сработало. :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029281
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nym,

куда уж изящнее. уже php6 на подходе, а тут в реализации ООП такая дыра. и далеко не одна.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029286
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

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

Знает, просто не люблю не элегантных решений =)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029497
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторуже php6 на подходе, а тут в реализации ООП такая дыра. и далеко не одна.
процедурный язык с добавлеными ОО возможностями (гибридный) будет изобиловать подобным до тех пор, пока его не перепишут под использование исключительно в ООП (создадут чистый ОО ЯП) (пример VB 6 -> VB.NET), в силу своей природной сущности. Вопрос в другом, кому он, после этого понадобится?! ;)
ЗЫ задачка была забавной!
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029512
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrig,

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

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

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

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

А мне ни холодно ни жарко от этого.
Я от vladgrig не видел ни одного логически законченного и обоснованного опровержения ни одного из моих аргументов в наших спорах.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029663
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЯ от vladgrig не видел ни одного логически законченного и обоснованного опровержения ни одного из моих аргументов в наших спорах.
хм...
авторскажите, что мне помешает сделать тот же финт с сериализуемым объектом в C#? Отвечаю: ничего.
авторДа и с рефлекшн-апи тот же финт проходит как в джава так и в с#. Его конечно можно отключить или ограничить в правах , но далеко не все это делают.
внимание вопрос!

каким образом в PHP можно сделать объект не сериализуемым, либо как ограничить\отключить рефлекшн-апи?
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029677
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrig каким образом в PHP можно сделать объект не сериализуемым, либо как ограничить\отключить рефлекшн-апи?
Реализовав методы wakeup и sleep?

Но проблема то не в запрете, а в том что возможность такого финта к качеству ОО ЯП не имеет абсолютно никакого отношения.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029684
coffeesnake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r uan0nym,

куда уж изящнее. уже php6 на подходе, а тут в реализации ООП такая дыра. и далеко не одна.

это не дыра.

спецификаторы доступа позволяют вам грамотно организовать инкапсуляцию и отловить потенциальных ошибки на уровне интерпретатора, а не пытаются от вас что-то "спрятать" или "утаить". так что если вам сильно хочется наговнокодить, чтобы вытащить или поменять какую-то приватную переменную, то никто вас останавливать не будет, это касается не только пхп.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029701
coffeesnake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
продолжая дискуссию. ЗАЧЕМ "отключать рефлекшн, ограничивать в правах", делать несериализуемым и т.д.? от несанкционированного доступа нужно защищаться абсолютно другими средствами, но никак не приватными переменными :) если заводите такого рода дискуссию, то путаете назначение этого механизма.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029707
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coffeesnake,

дело в том, что некоторые персонажи считают такие обслуживающие механизмы чуть ли не фундаментальными признаками поддержки ОО в ЯП и на этом основании говорят, что PHP неполноценный ОО язык, в отличие от Java, C# etc.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029724
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторРеализовав методы wakeup и sleep?
спс. посмотрю! остальное было неинтересно.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029733
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrigостальное было неинтересно.
Мы скорбим по поводу того, что из многих упомянутых важных вещей, вам интересна только самая очевидная. :(
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029746
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
<OFF>
авторМы скорбим по поводу того, что из многих упомянутых важных вещей, вам интересна только самая очевидная. :(
это ваша проблема!
</OFF>
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029749
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrig<OFF>
авторМы скорбим по поводу того, что из многих упомянутых важных вещей, вам интересна только самая очевидная. :(
это ваша проблема!
</OFF>
Дык прискорбно вдвойне!
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029760
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to an0nym смирись с этим - или заведи себе skype для обсуждения подобного рода вопросов!
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029873
Anjey aka PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrig каким образом в PHP можно сделать объект не сериализуемым, либо как ограничить\отключить рефлекшн-апи? на первую часть вопроса вам уже ответили.
Рефлекшн АПИ отключается элементарно. Думаю, если вы действительно специалист высокого уровня, коим себя хотите представить, найти ответ на вопрос КАК это сделать вы без затруднения сможете в документации.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37029941
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrig
to an0nym смирись с этим - или заведи себе skype для обсуждения подобного рода вопросов!

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

Да тут чтобы понять в чем дело, достаточно почитать хотя бы это . Нет, почему же, подход вполне себе имеет право на жизнь, но аргументация... дак нету ее.
// http://kotishka.homeip.net/mvc-php/validate Ещё один пример - ИМХО более изысканный! У меня на сервере каталог товаров. Хочу, что бы выборка происходила по урл-у - категория, подмножество, наименование.

* http://domain_name/category
* http://domain_name/category/article
* http://domain_name/category/article/name

Ничего умнее в голову не приходит, как прописать такое же правило в корневом .htaccess, назвав хвост - catalog и, разбирать, разбирать, разбирать пришедший параметр на составные части, пытаясь выделить из него категорию, подмножество, наименование в скрипте пыха!

Создай правила и не парься
и дальше "аргументация"
// http://kotishka.homeip.net/mvc-php/validate Нет! Нехочу зависеть от корневого .htaccess (придурок - юзая modrewrite ты уже от него зависишь! прим. автора) Нехочу по каждому чиху править правила modrewrite - вдруг понадобиться добавить свойство товара или ещё что ( а для чего же тогда предназначен modrewrite, как не для создания\правки его правил! прим. автора ) - хочу всё выполнять в скрипте PHP!
Во-первых, называть потенциального оппонента придурком -- как минимум недостаток воспитания, в худшем случае способ отстоять свою точку зрения, не будучи заведомо уверенным в том, что оппонент не сможет ее опровергнуть.
Во-вторых, автор по видимому не слышал ничего о динамическом роутинге запросов, который на чистом .htaccess не делается: либо все на один скрипт спихать либо пользовать RewriteMap (о котором, судя по статье автор тоже не имеет ни малейшего понятия).

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

(м)дааа.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37030456
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПРОШУ НЕ ХОЛИВАРИТЬ ТУТ!

а то и эту тему закроют модеры)))
а ведь тема ни в чем не виновата, пока)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37030495
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uПРОШУ НЕ ХОЛИВАРИТЬ ТУТ!

а то и эту тему закроют модеры)))
а ведь тема ни в чем не виновата, пока)
Чтобы не холиварить нужны новые задачи!
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37030768
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЧтобы не холиварить нужны новые задачи!
используя чистый ОО подход (всё == объекты), написать работоспособный! (исполняемый) PHP скрипт.

в идеале, это перевести на PHP! Незабываем условие - всё == объекты!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 namespace  Sharp_console
{
     class  Program
    {
         public  static  System .String val = @"I am a Program class field - my name is 'val'";

        static void Main(string[] args)
        {       
            AnoterClass.callProgramClassField();
             System .Console.ReadLine();
        } 
    }

     class  AnoterClass
    {
         public  static void callProgramClassField()
        {
             System .Console.WriteLine(Program.val);
        }
    }
}
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37030880
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrig,

а найуха, простите, городить два класса ради одних только статических методов? Вы в курсе, что у вас в коде нет ни одного объекта?.. Ууу, да вы оказывается вообще про ОО ничего не знаете... Ну если вам так угодно...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<?php
namespace Sharp_console;
class Program {
	public static $val = "I am a Program class field - my name is 'val'";

	static function Main(array $args) {
		AnoterClass::callProgramClassField();
		$h = fopen("php://stdin", "r");
		while (!fread($h,  1 ))
			sleep( 1 );
	}
}
class AnoterClass {
	public static function callProgramClassField() {
		echo Program::$val, "\r\n";
	}
}
call_user_func(array("Sharp_console\Program", "Main"), array());
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37030887
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymВы в курсе, что у вас в коде нет ни одного объекта?..
Кроме строчки текста :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37030912
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
 call_user_func ( array ("Sharp_console\Program", "Main"),  array ());
нарушает парадигму ООП - т.к. не является объектом - незачёт!
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37030972
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrig,

точка входа указанная в ГУЕ и процедурно вкомпиленная в результирующий exeшник - тоже. :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37031379
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to an0nymОбсуждение внутренней реализации высокоуровневых языков программирования неимеет никакого отношения к поставленной задаче.

- имеем PHP и ОО парадигму - это всё!

внимательно изучив маны не обнаружил указания на то что конструкции
Код: plaintext
1.
2.
3.
4.
 fopen ();
 fread ();
 sleep ();
 echo ;
являются методами объектов, либо самими объектами - явное нарушение ОО парадигмы и поставленной задачи - незачёт!
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37031388
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrig,

в PHP просто методы объекта System резольвятся без добавления System. Примерно как в C# можно не писать this.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37116953
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очередная разминка для желающих(по мотивам хабра).

Дано: переменная $s хранит строку конечной длины.
Задание: Написать функцию определяющую есть ли в этой строке цифры[0-9] или нет. возвращать либо true Либо false;
Ограничения: нельзя использовать встроенные в php строковые функции, preg_ и ereg_ .... в общем обойтись без готовых функций.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37117242
Hoba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r u,

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

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

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

на вход системы приходит строка с датой в формате DD.MM.YYYY
написать регулярное выражение максимально точно проверяющее эту строку на валидность)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37119486
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чем подвох?
Код: plaintext
\d{ 2 }\.\d{ 2 }\.\d{ 4 }
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37119528
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettА в чем подвох?
Код: plaintext
\d{ 2 }\.\d{ 2 }\.\d{ 4 }

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

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

задача больше академическая, чем практическая.
моя регулярка 113 символов получилась) учитывает что в феврале максимум 29 число.
28 февраля для високосных годов учитывать трудоемко очень, а в остальном все прекрасно
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37119733
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

я про
Единственный день, отсутствующий в невисокосном году, в основном бывает раз в четыре года (кроме периодов 1697—1703, 1797—1803, 1897—1903 годов, так как 1700, 1800 и 1900 годы были невисокосными).
30 февраля — по григорианскому календарю в феврале 28 дней (в високосном году — 29 дней). Однако, три раза в истории в некоторых странах в феврале было 30 дней.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37119746
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nym,

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

вот реально лень. :) Не для того регулярки.

ИМХО, задачка поинтереснее: используя любой функционал PHP (кроме написания расширения на C с ассемблерными вставками :D и всех функций и классов раздела datetime) написать функцию, возвращающую true или false в зависимости от соответствия даты некоторым условиям (четко оговорить условия) и чтобы она была быстрее остальных реализаций на 10 миллионах итераций по рандомным входным данным (распределение - ~50% соответствуют, ~50% не соответствуют из-за передачи совершенно не даты, но строки или передачи невалидной даты).
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37119866
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

У меня на 137 символов получилась. А ты группировку какими скобками делал?)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37119896
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А алиасов в PCRE нет?
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37119943
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hettr u,

У меня на 137 символов получилась. А ты группировку какими скобками делал?)
ну так давай что получилось. посмотрим) обсудим
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37120026
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<form action="" method="post">
    <label  for ="date"> Date : </label>
    <input name="date" id="date" value="<?=isset($_POST['date'])? $_POST['date'] : '';?>">
    <input type="submit">
</form>

<?

$p = '#^(?:(?:01|03|05|07|08|10|12)\.(?:0[1-9]|[1-2][0-9]|30|31)|'.
      '(?:04|06|09|11)\.(?:0[1-9]|[1-2][0-9]|30)|'.
      '(?:02\.(?:0[1-9]|1[0-9]|2[0-8])))'.
      '\.\d{4}$#';


 if ( isset ($_POST['date']))
{
     echo ( preg_match ($p, $_POST['date']))? 'Yes' : 'No';
}
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37120471
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

-непонял если честно что такое например (?:01|03|05|07|08|10|12)
-непропускает много дат, например 28.02.2010, 30.05.2010 ну и тд тоесть надо пилить дальше)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37120838
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, конечно, у меня формат даты получился ММ.ДД.ГГГГ , сплю на ходу

Код: plaintext
1.
2.
3.
$p = '#^(?:(?:0[1-9]|[1-2][0-9]|30|31)\.(?:01|03|05|07|08|10|12)|'.
      '(?:(?:0[1-9]|[1-2][0-9]|30)\.04|06|09|11)|'.
      '(?:(?:0[1-9]|1[0-9]|2[0-8])\.02))'.
      '\.\d{4}$#';
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37121045
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

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

у меня получились шаблоны:
- просто матчит - 87 символов
- с расставленными ?: чтоб запоминал и возвращал только значимые сегменты dd mm yyyy - 111 символов
кто меньше? )
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37122135
авторИМХО, задачка поинтереснее: используя любой функционал PHP (кроме написания расширения на C с ассемблерными вставками :D и всех функций и классов раздела datetime) написать функцию, возвращающую true или false в зависимости от соответствия даты некоторым условиям (четко оговорить условия) и чтобы она была быстрее остальных реализаций на 10 миллионах итераций по рандомным входным данным (распределение - ~50% соответствуют, ~50% не соответствуют из-за передачи совершенно не даты, но строки или передачи невалидной даты).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
            $str = '01.02.2011'; // DD.MM.YYYY
            
            $matches =  NULL ;
            $pattern = "/(\d{2}).(\d{2}).(\d{4})/i";
            $arr =  array ( 1  =>  31 ,
                 2  =>  28 ,
                 3  =>  31 ,
                 4  =>  30 ,
                 5  =>  31 ,
                 6  =>  30 ,
                 7  =>  31 ,
                 8  =>  31 ,
                 9  =>  30 ,
                 10  =>  31 ,
                 11  =>  30 ,
                 12  =>  31 );

             preg_match ($pattern, $str, $matches);
             if  ( $matches && 
                    (int)$matches[ 1 ] <= $arr[(int)$matches[ 2 ]] )  return   true ;
            
             return   false ;
LeapYear and etc. сам придумай! ;)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37122185
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как-то так...,

пропустит 0000000000.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37122374
авторпропустит 0000000000.
хм... м.б. - пробовать влом! + значит в регулярках пыха не всё шоколадно! ;)
ИМХО, просто, нужно подобрать необходимый регексп, а так, вполне!
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37122390
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как меня смешат такие постеры: неправильную ремарку на иностранном языке и смайлик в конце вставить умудрился, а за свой код не в ответе. С регэкспами всё ОК, просто у кого-то логика не работает в голове, соответственно это логику он не может перенести в код. . (точка) в регэкспе принимает любой символ и много людей до тебя УЖЕ показали, что вместо неё надо использовать \. (эскейп-точка). Мало того, если сматчится 00, то очевидно он будет <28 <30 <31 etc, не хватает условия > 0. Ну и чисто субъективно даже с такой простой регуляркой обогнать любую простенькую реализацию без регулярок вовсе ты на 10 млн. итераций не сможешь.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37122394
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще посмешил модификатор /i. :) У нас есть заглавные и строчные цифры (\d)?
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37122513
авторЕще посмешил модификатор /i. :) У нас есть заглавные и строчные цифры (\d)?
честно, мне плевать на ваши заглавные и строчные! я предложил вариант, до которого, судя по всему, ты не додумался ;)
а уж как я, там реализовал регулярку, вместо меня подумаешь ты!
авторНу и чисто субъективно даже с такой простой регуляркой обогнать любую простенькую реализацию без регулярок вовсе ты на 10 млн. итераций не сможешь.
вдвойне - плевать! понадобиться др. исполнение - придумаю другое решение
авторпропустит 0000000000.
Код: plaintext
1.
2.
3.
 if  ( $matches && 
                     array_key_exists ((int)$matches[ 2 ], $arr) &&
                    (int)$matches[ 1 ] <= $arr[(int)$matches[ 2 ]] )  return   true ;

LOL - относись к форуму, как к форуму - а не как к способу реализации собственных амбиций - настроение сразу улучшиться! ;)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37122546
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
 return  ( $matches && 
                     array_key_exists ((int)$matches[ 2 ], $arr) &&
                    (int)$matches[ 1 ] <= $arr[(int)$matches[ 2 ]] );
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37122554
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как-то так...,

я тут решение еще не выкладывал, чтобы тешить свои амбиции. :) А сагрить тролля всегда пожалуйста. Про isset, как и про \. вы не в курсе? :) Ваш последний вариант пропустит 0100100000.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37122560
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще бред, сначала составить не верную регулярку, а потом пытаться исправить это уже на уровне остальной логики, при этом преследуя основной целью - максимальную производительность.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37122565
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

да ладно, пускай малыш учится - язык-то тяжелый, думать много надо. :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37122701
авторя тут решение еще не выкладывал, чтобы тешить свои амбиции. :)
выложишь обсосём!
авторда ладно, пускай малыш учится - язык-то тяжелый, думать много надо. :)
угу - 9873673
авторА вообще бред, сначала составить не верную регулярку, а потом пытаться исправить это уже на уровне остальной логики, при этом преследуя основной целью - максимальную производительность.
бред - не использовать встроенные функции (datetime)!!! ну, это так - лирическое отступление.
авторВаш последний вариант пропустит 0100100000.
Код: plaintext
1.
$pattern = '/(\d{2})\.(\d{2})\.(\d{4})/';
что-то ещё, относительно регулярного выражения?! ;)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37122734
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторчто-то ещё, относительно регулярного выражения?! ;)

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

к сожалению (вашему :DDDDDDDDDDDDDDDD), да. Регулярка пропустит aaa01.01.0000aaa. :DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD

как-то так...честно, мне плевать на ваши заглавные и строчные! я предложил вариант, до которого, судя по всему, ты не додумался ;)
а уж как я, там реализовал регулярку, вместо меня подумаешь ты!
вдвойне - плевать! понадобиться др. исполнение - придумаю другое решение
LOL - относись к форуму, как к форуму - а не как к способу реализации собственных амбиций - настроение сразу улучшиться! ;)
Так вот. Если тебе плевать, не правь ошибки - тебе же плевать?! Вместо тебя думать я не буду, не расплатишься за такие услуги. Вдвойне плевать тем более не надо, так как может получиться, что через пару страниц ты будешь думать над другим исполнением (если текущие весомые правки не считать таковыми).

Относись к форуму и людям, которые хотят помочь твоему обучению, с уважением, а не так, как сейчас. Люди к тебе тоже начнут относиться хорошо (в том числе я). В подтверждение к этому ты сам же привел ссылку моего адекватного поведения [msg 9873673]. Если я чего-то не знаю и меня люди поправляют, я свою ошибку признаю и пытаюсь в будущем её исправить, а не агриться, чего и тебе советую.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37122758
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

черт. Зря я показал, что регулярка с двух сторон пропустит лишние символы. :) Надо было как вы.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37122762
авторТо что он будет считать валидной строку 00.00.000000000 )
так или иначе, тебе придётся проверить, не будет ли год высокосным - так, что не заморачивайся! ;)
ну, или заморочся! ;)))
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37122805
<жёсткий OFF>
авторОтносись к форуму и людям, которые хотят помочь твоему обучению, с уважением, а не так, как, сейчас.
1 - самое главное - я здесь ни у кого ничего не спрашивал - просто предложил вариант решения задачи - почему ты записался в мои преподаватели, я так и непонял?! + как сейчас?! тоже не совсем понятно ;)

2 - прочти 10251857 10251869 в последовательности твоих\моих ответов + подумай над состоятельностью своего совета
автора не агриться, чего и тебе советую.
3 - авторВместо тебя думать я не буду, не расплатишься за такие услуги.
ты уже это делаешь (причём абсолютно бесплатно ;) - спс. тебе "добрый человек" !
<OFF>
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37122823
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как-то так...,

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

Код: plaintext
/^((( 0 [ 1 - 9 ]|[ 12 ]\d)\.( 0 [ 1 - 9 ]| 1 [ 012 ]))|( 30 \.( 0 [ 469 ]| 11 ))|( 31 \.( 0 [ 13578 ]| 1 [ 02 ])))\.( 19 | 20 )\d\d$/
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37127716
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задачка:
Перевести число из шестнадцатеричной системы счисления в десятичную с пом. SQL запроса.
Диалект любой: Mysql,Oracle,Postgress.
Нельзя использовать готовые функции преобразования или пользоваться расширенными возможностями - типа своих функций, триггеров, пакетов и т.д.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37127845
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

в смысле надо реализовать, чтобы во всех трех диалектах работало или в любом?
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37127900
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymr u,

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

А циклы while можно? Это не везде работает.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37127956
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSerger u,

А циклы while можно? Это не везде работает.
циклы внутри SQL запроса? - да можно

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

в Оракле элементарно делается через иерархические запросы, но думаю, это не то что вам нужно? Какая цель этой задачи?
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128034
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В MySQL область входных (и соответственно выходных) значений будет ограничена.
Про Postgres сходу сказать не могу, но по моему там не будет ограничения.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128054
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymr u,

в Оракле элементарно делается через иерархические запросы, но думаю, это не то что вам нужно? Какая цель этой задачи?
да почему не то? ) решение есть решение.
цель в том - чтобы научиться решить на SQL задачи отличающиеся от выборки по ключу или джойнов. подобные выкрутасы в обычной жизни бывают нужны редко - но иногда полезны, особенно когда нужно одним запросом получить сразу много всякой информации да еще и обработать по максимуму значения на стороне БД.

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

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

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SELECT t.hex in_hex, t.result in_result, @result out_result
FROM (
    SELECT BENCHMARK(
        CHAR_LENGTH(i.hex), 
        (
          SELECT LEAST(@result := @result + 
              CASE MID(i.hex, CHAR_LENGTH(i.hex) - @rownum,  1 )
                WHEN 'f' THEN  15 
                WHEN 'e' THEN  14 
                WHEN 'd' THEN  13 
                WHEN 'c' THEN  12 
                WHEN 'b' THEN  11 
                WHEN 'a' THEN  10 
                         ELSE MID(i.hex, CHAR_LENGTH(i.hex) - @rownum,  1 ) +  0 
              END * POW( 16 , @rownum),
              @rownum := @rownum +  1 
            )
        )
      ), i.result, i.hex
    FROM (SELECT @rownum :=  0  rownum, @result :=  0  result) v,
      (SELECT HEX( 2174861921 ) hex, CONV(HEX( 2174861921 ),  16 ,  10 ) result) i
  ) t;
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128168
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для чисел произвольного размера надо реализовать сложение в столбик. :D
Для преобразования более одного числа за раз придется извращаться с переменными, но тоже возможно.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128206
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nym,

да подобное решение я и имел в виду) у меня правда немного отличается но идея таже)

для Оракла я такое смог родить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT h hexval, SUM(d) decval FROM(
 SELECT h
  ,decode(ch,'A', 10 
   ,decode(ch,'B', 11 
    ,decode(ch,'C', 12 
     ,decode(ch,'D', 13 
      ,decode(ch,'E', 14 
       ,decode(ch,'F', 15 
        ,to_number(ch)
  ))))))*power( 16 ,exp) d 
 FROM(
  SELECT h, length(h)-level exp, substr(h,level, 1 ) ch
  FROM (SELECT 'DEADBEAF' h FROM dual)
  CONNECT BY rownum<=LENGTH(h)
 ) 
) GROUP BY h
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128223
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

у меня вот так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT SUM(CASE SUBSTR(i.hex, LENGTH(i.hex) - LEVEL +  1 ,  1 ) 
    WHEN 'F' THEN  15 
    WHEN 'E' THEN  14 
    WHEN 'D' THEN  13 
    WHEN 'C' THEN  12 
    WHEN 'B' THEN  11 
    WHEN 'A' THEN  10 
             ELSE SUBSTR(i.hex, LENGTH(i.hex) - LEVEL +  1 ,  1 ) +  0 
  END * POWER( 16 , LEVEL -  1 )) result
FROM (SELECT '81A1C261' hex,  2174861921  result FROM dual) i
CONNECT BY LEVEL <= LENGTH(i.hex);
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128250
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не интересно преобразовать 16-ричную строчку в число (а вовсе не в десятичную строку). Работайте, товарищи, работайте.
То же самое на MS SQL, но с произвольным основанием, заданным строкой символов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
DECLARE @v varchar( 255 ),@numbers varchar( 16 ),@i int,@num int
SELECT @numbers='0123456789ABCDEF',@v=REVERSE('123ABC'),@i= 0 ,@num= 0 
WHILE LEN(@v)> 0  BEGIN
	SELECT @num=@num+(CHARINDEX(SUBSTRING(@v, 1 , 1 ),@numbers)- 1 )*POWER( 16 ,@i)
	SELECT @v=SUBSTRING(@v, 2 ,LEN(@v)- 1 ),@i=@i+ 1 
END
SELECT @num
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128285
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSerge,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT t.input i_input, t.output i_output, @result output
FROM (
    SELECT BENCHMARK(
        CHAR_LENGTH(i.input), 
        (
          SELECT GREATEST(@result := @result + 
              (INSTR(i.abc, MID(i.input, CHAR_LENGTH(i.input) - @rownum,  1 )) -  1 ) * POW(CHAR_LENGTH(i.abc), @rownum),
              LEAST( 0 , @rownum := @rownum +  1 )
            )
        )
      ), i.output, i.input
    FROM (SELECT @rownum :=  0  rownum, @result :=  0  result) v,
      (SELECT HEX( 2174861921 ) input, '0123456789abcdef' abc, CONV(HEX( 2174861921 ),  16 ,  10 ) output) i
  ) t;
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37129529
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSerge,

хотя ваш вариант подходит под условие задачи, всеже более интересны решения не использующие такие алгоритмические высокоуровневые возможности как цикоы, функции и т.д.
а так можно и на PL\SQL было написать, и вообще без запросов)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37195364
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаю всем решить задачку http://habrahabr.ru/blogs/php/116686/, не смотря в комментарии.

Своё решение выложу после нескольких ответов, у меня уже готово.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37195367
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильная ссылка http://habrahabr.ru/blogs/php/116686/
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37195536
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подумалось
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 private   function  addKey( $value, $keys, &$array )
    {
        $max =  count ( $keys );

         for  ( $i =  0 ; $i < $max; $i++ )
        {
             if  ( $i ==  0  )
                $a = & $array[ $keys[ $i ] ];
             else 
                $a = & $a[ $keys[ $i ] ];
        }
        $a = $value;
    }
Вызов
Код: plaintext
1.
2.
3.
4.
5.
6.
$array =  array ( );

//нужно считывать по строкам и парсить по '=' - т.к. было не интересно - код не привожу!
$this->addKey( <значение после '=' в подстроке>, \ explode ( '.', <значение до '=' в подстроке> ), $array );

\ var_dump ( $array );
вообще было интересно
- как раз думал над этим вопросом недавно - немог решить, плюнул - и тут, вдруг, вышло! ;)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37195712
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrig
Код: plaintext
1.
//нужно считывать по строкам и парсить по '=' - т.к. было не интересно - код не привожу!

Это как раз самое интересное. :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37195794
AraGnom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r u,

3 массива + строка + rand()
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37195811
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для затравки
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
an0nym's implementation returns right result: 0 3632 0 688 2.2
Ackrite@habr's implementation returns right result:  0   2248   0   0   2 . 96 
Ference@habr's implementation returns right result: 0 0 0 0 5.98
0lympian@habr's implementation returns right result:  0   0   0   0   2 . 42 
iSage@habr's implementation does not return right result
MaxHero@habr's implementation returns right result:  0   0   0   0   3 . 26 
yadeveloper@habr's implementation returns right result: 0 0 0 0 3.83
alexxz@habr's implementation returns right result:  0   0   0   0   2 . 73 
panandy@habr's implementation returns right result: 0 0 0 0 2.11
bogus92@habr's implementation returns right result:  0   192   0   0   4 . 16 
Zayaz@habr's implementation returns right result: 0 0 0 0 3.03
sectronix@habr's implementation returns right result:  0   632   0   0   3 . 26 
Azilot@habr's implementation does not return right result
mcdb@habr's implementation returns right result:  112459776   60092016   112459776   60091960   3 . 92 
mcdb@habr: 2 's implementation returns right result: 0 14336 0 6008 3.8
tzlom@habr's implementation returns right result:  0   88   0   0   2 . 58 
nik1550@habr's implementation returns right result: 0 80 0 0 3.23
BVadim@habr's implementation returns right result:  0   0   0   0   2 . 72 
(части пришлось исправить помарки в реализации; там, где до сих пор does not return right result - не помарки, а полноценные ошибки, надо полностью переписывать).

Был сильно удивлен, что реализация panandy обгоняет мою. :) Кто-нибудь сможет обогнать его?

как были сгенерированы результаты
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
error_reporting(- 1 );
ini_set("display_errors", true);
$input = "config.txt";
$output_right = array(
    "id" => "www",
    "session" => array(
        "timeout" => "120",
        "server" => array(
             0  => array(
                "host" => "127.0.0.1",
                "port" => "1111",
                "id" => "session1"
            ),
             1  => array(
                "host" => "127.0.0.1",
                "port" => "1111",
                "id" => "session2"
            )
        )
    ),
    "image" => array(
        "width" => "640",
        "height" => "480",
        "watermark" => array(
            "small" => "wsmall.png",
            "normal" => "wnormal.png"
        )
    )
);

/* Здесь реализация функций разными людьми. */

foreach ($implementations as $implementator => $implementation) {
    $output = $implementation($input);
    if ($output == $output_right) {
        list($memory_peak_real_before, $memory_peak_before, $memory_real_before, $memory_before)
            = array(memory_get_peak_usage(true), memory_get_peak_usage(), memory_get_usage(true), memory_get_usage());
        $start = microtime(true);
        for ($i =  0 , $n = $argv[ 1 ]; $i < $n; ++$i)
            $output = $implementation($input);
        $end = microtime(true);
        list($memory_peak_real_after, $memory_peak_after, $memory_real_after, $memory_after)
            = array(memory_get_peak_usage(true), memory_get_peak_usage(), memory_get_usage(true), memory_get_usage());

        echo $implementator, "'s implementation returns right result: ",
            $memory_peak_real_after - $memory_peak_real_before, " ",
            $memory_peak_after - $memory_peak_before, " ",
            $memory_real_after - $memory_real_before, " ",
            $memory_after - $memory_before, " ",
            round($end - $start, 2), "\r\n";
    } else
        echo $implementator, "'s implementation does not return right result\r\n";
}
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37195985
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nym ,

А прогони еще такие варианты:
- разбор регуляркой,
- создание
а) eval-ом,
б) код panandy.

Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
<?php

 function  read_conf_a($file_name)
{
	$matches =  null ;
	 if (($size =  preg_match_all ('/^([^=]+)=(.*)$/m',  file_get_contents ($file_name), $matches)) ===  false )  return   array ();

	$result =  array ();
	$var =  null ;
	 for ($i =  0 ; $i < $size; ++$i)
	{
		 eval ('$var = &$result[\''.preg_replace('/\./', '\'][\'', $matches[1][$i]).'\'];');
		$var = $matches[ 2 ][$i];
	}

	 return  $result;
}

 function  read_conf_b($file_name)
{
	$matches =  null ;
	 if (($size =  preg_match_all ('/^([^=]+)=(.*)$/m',  file_get_contents ($file_name), $matches)) ===  false )  return   array ();

	$result =  array ();
	 for ($i =  0 ; $i < $size; ++$i)
	{
		$path =  explode ('.', $matches[ 1 ][$i]);
		$r = &$result;
		 foreach ($path  as  $key)
		{
			$r = &$r[$key];
		}
		$r = $matches[ 2 ][$i];
	}

	 return  $result;
}

$res = read_conf_b('config.txt');
 echo  '<pre>';
 var_dump ($res);
 echo  '</pre>';

?>
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37195997
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, запустил код panandy , получил так:

Код: plaintext
1.
2.
3.
4.
5.
6.
        ["port"]=>
        string( 6 ) "1111
"
        ["id"]=>
        string( 10 ) "session1
"

А мои выдают:

Код: plaintext
1.
2.
3.
4.
5.
6.
        ["port"]=>
        string( 5 ) "1111
"
        ["id"]=>
        string( 9 ) "session1
"

Т.е. explode тянет перевод строки, если конфиг с виндовыми \n, а регулярки не тянут, т.е. выходит предпочтительнее.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196015
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет. Если быть точнее, при UNIX EOL получаю регулярками:
Код: plaintext
1.
        ["id"]=>
        string( 8 ) "session1"

При WIN EOL регулярками:
Код: plaintext
1.
2.
        ["id"]=>
        string( 9 ) "session1
"

Ну а при построчной обработке - 9 и 10 соответственно.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196022
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. при любом EOL-е при построчной обработке получаем захват EOL-а в данные
А с регулярками, либо правильно, либо пол-EOL-а )))
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196046
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Затестил так:

Код: 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.
26.
27.
28.
29.
30.
$count =  10000 ;
$text  =  file_get_contents ('config.txt');
$lines =  file ('config.txt');


 sleep ( 1 );
$time_a =  microtime ( true );
 for ($i =  0 ; $i < $count; ++$i)
{
	$res = read_conf_a($text);
}
$time_a =  microtime ( true ) - $time_a;


 sleep ( 1 );
$time_b =  microtime ( true );
 for ($i =  0 ; $i < $count; ++$i)
{
	$res = read_conf_b($text);
}
$time_b =  microtime ( true ) - $time_b;


 sleep ( 1 );
$time_c =  microtime ( true );
 for ($i =  0 ; $i < $count; ++$i)
{
	$res = read_conf_c($lines);
}
$time_c =  microtime ( true ) - $time_c;

Где read_conf_c - это его код. Увы. eval вообще никакой критики не выдерживает. А регулярка чуть медленее вышла (иногда одинаковые результы показывает):

Код: plaintext
1.
2.
3.
4.
 count = 10000 
time_a =  1 . 96526193619 
time_b =  0 . 995101928711 
time_c =  0 . 893173933029 
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196049
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА регулярка чуть медленее вышла
В смысле, регулярка и там, и там. А имелось ввиду "регулярка без eval-a, а с циклом.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196130
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.Dragon,

вот такие вот косяки я считал за помарки и исправлял в коде у хабровцев (у 4 или 5 была такая помарка).
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196135
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.Dragon,

меня чуть-чуть обогнал (на самом деле между запусками ты или на несколько сотых быстрее моего или на несколько сотых медленнее; panandy всегда обгоняет и тебя и меня )
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
php test.php  10000 
an0nym's implementation returns right result: 0 7384 0 688 2.33
Ackrite@habr's implementation returns right result:  0   2248   0   0   3 . 11 
Ference@habr's implementation returns right result: 0 0 0 0 6.25
0lympian@habr's implementation returns right result:  0   0   0   0   2 . 49 
iSage@habr's implementation does not return right result
MaxHero@habr's implementation returns right result:  0   0   0   0   3 . 29 
yadeveloper@habr's implementation returns right result: 0 0 0 0 4.07
alexxz@habr's implementation returns right result:  0   0   0   0   2 . 9 
panandy@habr's implementation returns right result: 0 0 0 0 2.2
bogus92@habr's implementation returns right result:  0   192   0   0   4 . 31 
Zayaz@habr's implementation returns right result: 0 0 0 0 3.01
sectronix@habr's implementation returns right result:  0   656   0   0   3 . 39 
Azilot@habr's implementation does not return right result
mcdb@habr's implementation returns right result:  112459776   60092320   112459776   60092280   4 . 08 
mcdb@habr: 2 's implementation returns right result: 262144 92704 262144 84128 3.78
tzlom@habr's implementation returns right result:  0   88   0   0   2 . 66 
nik1550@habr's implementation returns right result: 0 80 0 0 3.18
BVadim@habr's implementation returns right result:  0   0   0   0   2 . 58 
Edd.Dragon's implementation returns right result: 0 824 0 0 4.34
Edd.Dragon:2's implementation returns right result:  0   376   0   0   2 . 29 
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196138
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
<?php
error_reporting(- 1 );
ini_set("display_errors", true);
$input = "config.txt";
$output_right = array(
    "id" => "www",
    "session" => array(
        "timeout" => "120",
        "server" => array(
             0  => array(
                "host" => "127.0.0.1",
                "port" => "1111",
                "id" => "session1"
            ),
             1  => array(
                "host" => "127.0.0.1",
                "port" => "1111",
                "id" => "session2"
            )
        )
    ),
    "image" => array(
        "width" => "640",
        "height" => "480",
        "watermark" => array(
            "small" => "wsmall.png",
            "normal" => "wnormal.png"
        )
    )
);

$implementations["an0nym"] = function ($filename) {
    $result = array();
    foreach (file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line) {
        $route_value = explode("=", $line);
        $last = strtok($route_value[ 0 ], ".");
        $reference = &$result[$last];
        while (($last = strtok(".")) !== false)
            $reference = &$reference[$last];
        $reference = $route_value[ 1 ];
    }
    return $result;
};

$implementations["Ackrite@habr"] = function ($filename) {
    $str = file($filename);
    $result = array();
    foreach ($str as $line) {
        $line = trim($line);
        if ($line == '') {
            continue;
        }
        list($k, $v) = explode("=", $line,  2 ) + array("", "");
        $k = explode('.', $k);
        $cc = &$result;
        for ($i =  0 ; $i < count($k); $i++) {
            if (!isset($c[$k[$i]]))
                $c[$k[$i]] =  0 ;
            $cc = &$cc[$k[$i]];
        }
        $cc = $v;
        unset($cc);
    }
    return $result;
};

function array_merge_recursive_distinct() {
    $arrays = func_get_args();
    $base = array_shift($arrays);
    if (!is_array($base))
        $base = empty($base) ? array() : array($base);
    foreach ($arrays as $append) {
        if (!is_array($append))
            $append = array($append);
        foreach ($append as $key => $value) {
            if (!array_key_exists($key, $base) and !is_numeric($key)) {
                $base[$key] = $append[$key];
                continue;
            }
            if (is_array($value) or is_array($base[$key])) {
                $base[$key] = array_merge_recursive_distinct(isset($base[$key]) ? $base[$key] : null, $append[$key]);
            } else if (is_numeric($key)) {
                if (!in_array($value, $base))
                    $base[] = $value;
            } else {
                $base[$key] = $value;
            }
        }
    }
    return $base;
}
$implementations["Ference@habr"] = function ($path) {
    $output = array();
    $file = fopen($path, 'r');
    while ($row = fgets($file)) {
        $row = rtrim($row, "\n");
        list($key, $value) = explode('=', $row);
        $path = explode('.', $key);
        $path = array_reverse($path);
        $tmp = $value;
        foreach ($path as $v) {
            $tmp = array($v => $tmp);
        }
        $output = array_merge_recursive_distinct($output, $tmp);
    }
    fclose($file);
    return $output;
};

function parseline($conf, $line) {
    list($key, $val) = explode('=', $line,  2 );
    $keypath = explode('.', $key);
    $cconf = &$conf;
    foreach ($keypath as $k)
        $cconf = &$cconf[$k];
    $cconf = $val;
}
$implementations["0lympian@habr"] = function ($filename) {
    $conf = array();
    $configtext = file_get_contents($filename);
    foreach (explode("\n", $configtext) as $l) {
        $l = trim($l);
        if ($l)
            parseline(&$conf, $l);
    }
    return $conf;
};

$implementations["iSage@habr"] = function ($fname) {
    $data = file($fname, FILE_IGNORE_NEW_LINES);
    $conf = array();
    foreach ($data as $line) {
        $value = explode('=', $line,  2 );
        $name = $value[ 0 ];
        $value = $value[ 1 ];
        $path = array_reverse(explode('.', $name));
        $end = $value;
        foreach ($path as $path_part) {
            $tmp = array();
            $tmp[$path_part] = $end;
            $end = $tmp;
        }
        $conf = array_merge_recursive($end, $conf);
    }
    return $conf;
};

function addToDictionary(&$array, $keyArray, $value) {
    if (count($keyArray) >  1 ) {
        /*if (!isset($array[$keyArray[0]])) {
            $array[$keyArray[0]] = array();
        }*/
        $partOfKey = array_shift($keyArray);
        addToDictionary($array[$partOfKey], $keyArray, $value);
    } else {
        $array[$keyArray[ 0 ]] = $value;
    }
}
$implementations["MaxHero@habr"] = function ($filename) {
    $result = array();
    $fp = fopen($filename, "r");
    while (!feof($fp)) {
        $line = fgets($fp); //Считываем новую строку конфига
        $line = rtrim($line, "\n");
        if ($line) {
            $keyValueArray = explode("=", $line); //Отделяем ключ от значения
            $keyArray = explode(".", $keyValueArray[ 0 ]); //Отделяем части ключа
            addToDictionary($result, $keyArray, $keyValueArray[ 1 ]); //Добавляем в массив
        }
    }
    fclose($fp);
    return $result;
};

$implementations["yadeveloper@habr"] = function ($filename) {
    foreach (parse_ini_file($filename) as $key => $value) {
        $key = vsprintf('$result["%s"] = "%s";', array(str_replace('.', '"]["', $key), $value,));
        eval($key);
    }
    return $result;
};

$implementations["alexxz@habr"] = function ($f) {
    $lines = file($f);
    $result = array();
    foreach ($lines as $line) {
        $line = trim($line);
        $eqpos = strpos($line, '=');
        if ($eqpos === false || $eqpos ===  0 )
            continue;
        list($key, $value) = explode('=', $line);
        $key = trim($key);
        $value = trim($value);
        $parts = explode('.', $key);
        $iterator = &$result;
        foreach ($parts as $part) {
            if (!isset($iterator[$part])) {
                $iterator[$part] = array();
            }
            $iterator = &$iterator[$part];
        }
        $iterator = $value;
    }
    return $result;
};

$implementations["panandy@habr"] = function ($filename) {
    $lines = file($filename, FILE_IGNORE_NEW_LINES);
    $result = array();
    foreach ($lines as $line) {
        $parts = explode('=', $line,  2 );
        $path = explode('.', $parts[ 0 ]);
        $r = &$result;
        foreach ($path as $q) {
            $r = &$r[$q];
        }
        $r = $parts[ 1 ];
    }
    return $result;
};

$implementations["bogus92@habr"] = function ($fn) {
    $file = file($fn);
    $config = array();
    foreach ($file as $line) {
        $line = explode("=", $line);
        $key = $line[ 0 ];
        unset($line[ 0 ]);
        $value = trim(implode("=", $line));
        $key = explode(".", $key);
        $str = '$config';
        foreach ($key as $l) {
            $str .= "['$l']";
        }
        $str .= " = '$value';";
        eval($str);
    }
    return $config;
};

$implementations["Zayaz@habr"] = function ($file_name) {
    parse_str(implode("&", array_map(function($line) {
        return preg_replace('/\.([^\.=]+)/i', '[\\1]', substr($line,  0 , strpos($line, '='))) . substr($line, strpos($line, '='));
    }, file($file_name, FILE_IGNORE_NEW_LINES))), $data);
    return $data;
};

$implementations["sectronix@habr"] = function ($file_name) {
    return eval(preg_replace_callback('/(.+?)=(.+)/', function($m) {
        return '$r["' . str_replace('.', '"]["', $m[ 1 ]) . '"]="' . $m[ 2 ] . '";';
    }, file_get_contents($file_name)) . 'return $r;');
};

$implementations["Azilot@habr"] = function ($fname) {
    $result = array();
    $fp = fopen($fname, "r");
    while ($line = fgets($fp)) {
        if (trim($line) == '')
            continue;
        list($keys, $value) = explode("=", trim($line));
        $akeys = explode(".", $keys);
        $temp = $value;
        for ($i = count($akeys) -  1 ; $i >=  0 ; $i--)
            $temp = array($akeys[$i] => $temp);
        $result = array_merge_recursive($result, $temp);
    }
    return $result;
};

$implementations["mcdb@habr"] = function ($confFile) {
    $content = file($confFile, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
    array_walk($content, function(&$item) {
        $item = sprintf("\$ar['%s'] = '%s';" . PHP_EOL, str_replace('.', "']['", substr($item,  0 , $pos = strpos($item, '='))), substr($item, $pos +  1 ));
    });
    $content = implode(null, $content);
    $fnc = create_function(null, "{$content}; return \$ar;");
    return $fnc ();
};

$implementations["mcdb@habr:2"] = function ($confFile) {
    eval('$f = function () {' . PHP_EOL . implode(null, array_map(function(&$x) {
        return sprintf("\$ar['%s'] = '%s';" . PHP_EOL, str_replace('.', "']['", substr($x,  0 , $o = strpos($x, '='))), substr($x, $o +  1 ));
    }, file($confFile, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES))) . 'return $ar;' . PHP_EOL . "};");
    return $f();
};

$implementations["tzlom@habr"] = function ($filename) {
    $data = file_get_contents($filename);
    $rows = explode("\n", $data);
    $dict = array();
    foreach ($rows as $row) {
        if ($row == '')
            continue;
        list($key, $value) = explode('=', $row,  2 );
        $key = explode('.', $key);
        $addTo = &$dict;
        while (count($key) >  1 ) {
            $addTo = &$addTo[array_shift($key)];
        }
        $addTo[$key[ 0 ]] = $value;
    }
    return $dict;
};

$implementations["nik1550@habr"] = function ($filename) {
    $config = file_get_contents($filename);
    $config_array = explode("\n", $config);
    sort($config_array);
    $result = array();
    foreach ($config_array as $config_item) {
        if ($config_item != NULL) {
            $value = substr($config_item, strpos($config_item, "=") +  1 , strlen($config_item));
            $key = substr($config_item,  0 , strpos($config_item, "="));
            $key_arr = explode(".", $key);
            $tmp = &$result;
            for ($i =  0 ; $i < count($key_arr); $i++) {
                if (!isset($tmp[$key_arr[$i]]))
                    $tmp[$key_arr[$i]] = "";
                $tmp = &$tmp[$key_arr[$i]];
            }
            $tmp = $value;
        }
    }
    return $result;
};

$implementations["BVadim@habr"] = function ($file) {
    $lines = file($file);
    $result = array();
    foreach ($lines as &$line) {
        $line = trim($line);
        if (empty($line))
            continue;
        $lineParts = explode("=", $line);
        $path = explode(".", $lineParts[ 0 ]);
        $current = &$result;
        $pathSize = sizeof($path) -  1 ;
        for ($i =  0 ; $i <= $pathSize; $i++) {
            if ($i == $pathSize) {
                $current[$path[$i]] = $lineParts[ 1 ];
            } else {
                if (!isset($current[$path[$i]]))
                    $current[$path[$i]] = array();
                $current = &$current[$path[$i]];
            }
        }
        unset($current);
    }
    return $result;
};

$implementations["Edd.Dragon"] = function ($file_name) {
    $matches = null;
    if (($size = preg_match_all('/^([^=]+)=(.*)$/m', file_get_contents($file_name), $matches)) === false)
        return array();
    $result = array();
    $var = null;
    for ($i =  0 ; $i < $size; ++$i) {
        eval('$var = &$result[\'' . preg_replace('/\./', '\'][\'', $matches[1][$i]) . '\'];');
        $var = $matches[ 2 ][$i];
    }
    return $result;
};

$implementations["Edd.Dragon:2"] = function ($file_name) {
    $matches = null;
    if (($size = preg_match_all('/^([^=]+)=(.*)$/m', file_get_contents($file_name), $matches)) === false)
        return array();
    $result = array();
    for ($i =  0 ; $i < $size; ++$i) {
        $path = explode('.', $matches[ 1 ][$i]);
        $r = &$result;
        foreach ($path as $key) {
            $r = &$r[$key];
        }
        $r = $matches[ 2 ][$i];
    }
    return $result;
};

foreach ($implementations as $implementator => $implementation) {
    $output = $implementation($input);
    if ($output == $output_right) {
        list($memory_peak_real_before, $memory_peak_before, $memory_real_before, $memory_before)
            = array(memory_get_peak_usage(true), memory_get_peak_usage(), memory_get_usage(true), memory_get_usage());
        $start = microtime(true);
        for ($i =  0 , $n = $argv[ 1 ]; $i < $n; ++$i)
            $output = $implementation($input);
        $end = microtime(true);
        list($memory_peak_real_after, $memory_peak_after, $memory_real_after, $memory_after)
            = array(memory_get_peak_usage(true), memory_get_peak_usage(), memory_get_usage(true), memory_get_usage());

        echo $implementator, "'s implementation returns right result: ",
            $memory_peak_real_after - $memory_peak_real_before, " ",
            $memory_peak_after - $memory_peak_before, " ",
            $memory_real_after - $memory_real_before, " ",
            $memory_after - $memory_before, " ",
            round($end - $start, 2), "\r\n";
    } else
        echo $implementator, "'s implementation does not return right result\r\n";
}
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196150
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymEdd.Dragon,

меня чуть-чуть обогнал (на самом деле между запусками ты или на несколько сотых быстрее моего или на несколько сотых медленнее; panandy всегда обгоняет и тебя и меня )

То я не тебя обогнал, а код пандани немного подпортил )))
Если бы полностью иной код - другое дело
А так, свежая и смелая идея с эвалом не прошла
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37196151
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.Dragon,

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

Ну то мелочь. Основные вопросы6
- как быстрее обработать текст, т.е. получить пары строк;
- как быстрее из этих пар строк создать ассоц. массив.

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

незнаю актуально или нет))

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 function  read_conf($fn) {
	$a =  array ();
	 foreach ( file ($fn)  as  $v) {
		 list ($keys,$value) =  explode ('=',$v);
		$r=&$a;
		 foreach ( explode ('.',$keys)  as  $k) {
			 if  (! isset ($r[$k]))
				$r[$k]= array ();
			$r=&$r[$k];
		}
		$r = $value;
	}
	 return  $a;
}
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37197127
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

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

чуть дольше panandy. Можете сами протестить. :)

вот чуть чуть раскочегарил)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 function  read_conf($fn) {
	$cfg =  array ();
	 foreach ( file ($fn)  as  $line){
		$parts =  explode ('=',$line, 2 );
		 if  (! isset ($parts[ 1 ]))
			 continue ;
		$ref=&$cfg;
		 foreach ( explode ('.', $parts[ 0 ])  as  $key)
				$ref=&$ref[$key];
		$ref = $parts[ 1 ];
	}
	 return  $cfg;
}
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37197196
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

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

в этом смысле наши реализации вполне подходят (с file(..., FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES)).

Проблемы начнутся только когда будет неоднозначное присвоение:
a.b=c
a.d=e
a=f.
Работать будет, но вот не обязательно, как хотелось бы.

И еще надо внести правки насчет значения по умолчанию в случае
a.b=
или просто
a.b
но это полстрочки кода, которая сильно не замедлит.

Вот если начать исключать невалидные строки (первый пример выше или, например, a..=aaa) - да, скорость сильно ухудшится. :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37197212
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т. е. я хотел сказать, что текущие самые быстрые решения полностью рабочие. :) Они умеренно правильно (на мой взгляд) съедят даже ошибочные строки.

А вот если начнутся разговоры типа "Мы в конфиг можем и что-нибудь не то написать [имею в виду не инъекцию для evalа] - надо бы защититься от этого" - то там уже начнутся тормоза и сильное усложнение. :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37246501
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дана строка:
Код: plaintext
1.
$s = '(((8/2)/2)*((2.7+1.3)+(6/3)-(16/8)+((9/3)+(2*3*(5-4)))))+6+(((16/8)/2)*(10+(3/1)-(4/2)+((8/2)+(7*8*(3-2)))))-3'; //=100
необходимо написать код который вычислит её (те калькулятор)

* Уточнения и ограничения:
- не использовать eval()
- числа в строке: десятичные int или float
- арифметические операции: + - * /
- исходить что входная строка корректна, те содержит только парные скобки и корректную вложенность(валидность входного выражения проверять ненужно)
- проверить правильность вычисления можно в поиске Гугла, там встроенный калькулятор
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37246751
artas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

Код: plaintext
1.
2.
3.
$s = '((( 8 / 2 )/ 2 )*(( 2 . 7 + 1 . 3 )+( 6 / 3 )-( 16 / 8 )+(( 9 / 3 )+( 2 * 3 *( 5 - 4 )))))+ 6 +((( 16 / 8 )/ 2 )*( 10 +( 3 / 1 )-( 4 / 2 )+(( 8 / 2 )+( 7 * 8 *( 3 - 2 )))))- 3 '; //= 100 
$result = file_get_contents('http://www.google.com.ua/#hl=ru&source=hp&biw= 1145 &bih= 685 &q=" . $s);
//тут парсим результат
а вообще пример классический, для тренировки работы со стеком на С
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37246774
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artas,

решений много. конечные автоматы, регулярки....

нагрузить для расчетов гугл - не самое лучшее решение)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37246797
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В калькуляторе Windows 7 явно не 100 получается :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37246837
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettВ калькуляторе Windows 7 явно не 100 получается :)
ну это известная фича)
там калькулятор вычисляет в порядке ввода а не в порядке приоритета операций и скобок, как я понимаю
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37246845
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2+2*2 == 6 по крайней мере
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37246846
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(2+2)*2 == 8
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37246868
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну врет то все же калькулятор винды. В пхп и mysql тоже 100 получается)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37246912
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, ясно, все дело в разделителях у вещественных чисел. Так и виндовый 100 выдает

Код: plaintext
((( 8 / 2 )/ 2 )*(( 2 , 7 + 1 , 3 )+( 6 / 3 )-( 16 / 8 )+(( 9 / 3 )+( 2 * 3 *( 5 - 4 )))))+ 6 +((( 16 / 8 )/ 2 )*( 10 +( 3 / 1 )-( 4 / 2 )+(( 8 / 2 )+( 7 * 8 *( 3 - 2 )))))- 3 
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37247135
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

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

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

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

на регэкспах имхо очень трудно будет обработать неограниченную вложенность скобок.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37251388
Vaytl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r uДана строка:
Код: plaintext
1.
$s = '(((8/2)/2)*((2.7+1.3)+(6/3)-(16/8)+((9/3)+(2*3*(5-4)))))+6+(((16/8)/2)*(10+(3/1)-(4/2)+((8/2)+(7*8*(3-2)))))-3'; //=100
необходимо написать код который вычислит её (те калькулятор)

* Уточнения и ограничения:
- не использовать eval()
- числа в строке: десятичные int или float
- арифметические операции: + - * /
- исходить что входная строка корректна, те содержит только парные скобки и корректную вложенность(валидность входного выражения проверять ненужно)
- проверить правильность вычисления можно в поиске Гугла, там встроенный калькулятор

Вот, накидал регулярками
Код: 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.
26.
27.
28.
$calc = '(((8/2)/2)*((2.7+1.3)+(6/3)-(16/8)+((9/3)+(2*3*(5-4)))))+6+(((16/8)/2)*(10+(3/1)-(4/2)+((8/2)+(7*8*(3-2)))))-3'; //=100

 function  calc($matches)  
  { 
   preg_match_all ("'([*/])'",$matches[ 1 ],$array1);
   preg_match_all ("'([+-])'",$matches[ 1 ],$array2);
 if ( preg_match ("'[*/]'", $matches[ 1 ]))  {
    for ($i =  0 ; $i <  count ($array1[ 1 ]); $i++) {
	   $matches[ 1 ] =  preg_replace_callback ("'([\d.]+)([*/])([\d.]+)'", create_function (
	   '$matches','if($matches[2] == "*") return  $matches[1] * $matches[3]; else return  $matches[1] / $matches[3];'),$matches[ 1 ]);
  }
   }
 if ( preg_match ("'[+-]'", $matches[ 1 ]))  {
    for ($i =  0 ; $i <  count ($array2[ 1 ]); $i++) {
	   $matches[ 1 ] =  preg_replace_callback ("'([\d.]+)([+-])([\d.]+)'", create_function (
	   '$matches',' if($matches[2] == "-") return  $matches[1] - $matches[3]; else return  $matches[1] + $matches[3];'),$matches[ 1 ], 1 );
 }
  }
      return  $matches[ 1 ];
  } 
   do 
  {
 echo  $calc.'<br>';
	$calc =  preg_replace_callback ("'\(([^()]+)\)'","calc", $calc);  
  }
 while  ( preg_match ("'[\(\)]'", $calc));

 echo  $calc.'<br>';
 echo   preg_replace_callback ("'(.*)'","calc", $calc);
PS. Хорошая вышла разминка для мозгов ))
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37252133
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vaytl,

да, регулярками у меня тоже подобный подход, только код немного другой)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37253540
Vaytl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r u,
Хотелось бы увидеть ваш код, для сравнения…(если можно)
Немного поправил свой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
$calc = '(((8/2)/2)*((2.7+1.3)+(6/3)-(16/8)+((9/3)+(2*3*(5-4)))))+6+(((16/8)/2)*(10+(3/1)-(4/2)+((8/2)+(7*8*(3-2)))))-3'; //=100

 function  calc($matches)  {  
 while  ( preg_match ("'[/*]'", $matches[ 1 ])) {
	   $matches[ 1 ] =  preg_replace_callback ("'([\d.]+)([*/]+)([\d.]+)'", create_function ('$matches',
	   'if(($matches[2]) == "*") return  $matches[1] * $matches[3]; else return  $matches[1] / $matches[3];'),$matches[ 1 ]);
       }
 while  ( preg_match ("'[+-]'", $matches[ 1 ])) {
	   $matches[ 1 ] =  preg_replace_callback ("'([\d.]+)([+-]+)([\d.]+)'", create_function ('$matches',
	   'if(($matches[2]) == "-") return  $matches[1] - $matches[3]; else return  $matches[1] + $matches[3];'),$matches[ 1 ], 1 );
       }
      return  $matches[ 1 ];
 } 
   do 
  {
	$calc =  preg_replace_callback ("'\(([^()]+)\)'","calc", $calc);  
 }
 while  ( preg_match ("'[()]'", $calc));

 echo   preg_replace_callback ("'(.*)'","calc", $calc);
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37253592
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vaytl,

мой вариант через регулярки

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 define ('D',    '\d+(?:\.\d+)?');
 define ('G_MDB','/(\('.D.'[-+*\/]'.D.'\)|'.D. '[*\/]'.D.')/');
 define ('G_AS', '/'.D.'[-+]'.D.'/');
 define ('G_D',  '/('.D.')([-+*\/])('.D.')/');
//
 function  opers($matches) {
	 preg_match (G_D, $matches[ 0 ], $m);
	 if  ($m[ 2 ] == '*')  return  $m[ 1 ] * $m[ 3 ];
	 if  ($m[ 2 ] == '/')  return  $m[ 1 ] / $m[ 3 ];
	 if  ($m[ 2 ] == '+')  return  $m[ 1 ] + $m[ 3 ];
	 if  ($m[ 2 ] == '-')  return  $m[ 1 ] - $m[ 3 ];
}
//
$s = '(((8/2)/(2))*((2.7+1.3)+(6/3)-(16/8)+((9/3)+(2*3*(5-4)))))+6+(((16/8)/2)*(10+(3/1)-(4/2)+((8/2)+(7*8*(3-2)))))-3';
 while  ( preg_match ('/[-+*\/]/', $s)) {
	$s =  preg_replace ('/\(('.D.')\)/', '\1', $s);
	$s =  preg_replace_callback (G_MDB,'opers', $s);
	$s =  preg_replace_callback (G_AS, 'opers', $s);
}
 echo  $s;
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37253614
Vaytl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r u,

Спасибо, очень познавательно + в 2-3 раза быстрее моего примера…
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37253620
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо, у решения через регекспы есть существенный минус - скорость работы. замеры скорости не делал, но чтобы не быть голословным решил написать решение "классически" - с пом. трансляции в польскую нотацию и последующим её вычислением(выше свой вариант приводил an0nym). только я не стал решать задачу настолько широко и универсально, получилось чтото такое
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
 function  convertToPolishNotation($s) {
	$stack = $out = $items =  array ();
	 preg_match_all ('/(\d+(\.\d+)?|[-+*\/()])/', $s, $items);
	 foreach  ($items[ 0 ]  as  $c) {
		 if  ( is_numeric ($c)) $out[] = $c;
		 else  _addPnItem($stack, $out, $c);
	}
	 if  ( sizeof ($stack))
		$out =  array_merge ($out,  array_reverse ($stack));
	 return  $out;
}
//
 function  _addPnItem(&$stack, &$out, $c) {
	static $prior =  array ('*' =>  3 , '/' =>  3 , '+' =>  2 , '-' =>  2 , '(' =>  1 );
	 if  ( sizeof ($stack) ==  0  || $c == '(') {
		$stack[] = $c;
	}  elseif  ($c == ')') {
		 for  ($i =  sizeof ($stack) -  1 ; $i >=  0 ; --$i) {
			 if  ($stack[$i] == '(') {
				 array_pop ($stack);
				 break ;
			}
			 else  $out[] =  array_pop ($stack);
		}
	}  else  { // + - * /
		 for  ($i =  sizeof ($stack) -  1 ; $i >=  0 ; --$i) {
			$oper = $stack[$i];
			 if  ($prior[$oper] >= $prior[$c]) {
				$out[] = $oper;
				 unset ($stack[$i]);
			}
			 else   break ;
		}
		$stack[] = $c;
		$stack =  array_values ($stack);
	}
}
//
 function  calculatePolishNotation( Array  $s) {
	$pair =  array ();
	 foreach  ($s  as  $v) {
		 if  ( is_numeric ($v))
			$pair[] = $v;
		 else  {
			$size =  sizeof ($pair) -  2 ;
			 if  ($v == '*') $pair[$size] *=  array_pop ($pair);
			 if  ($v == '/') $pair[$size] /=  array_pop ($pair);
			 if  ($v == '+') $pair[$size] +=  array_pop ($pair);
			 if  ($v == '-') $pair[$size] -=  array_pop ($pair);
		}
	}
	 return  $pair[ 0 ];
}

//
$str = '(((8/2)/(2))*((2.7+1.3)+(6/3)-(16/8)+((9/3)+(2*3*(5-4)))))+6+(((16/8)/2)*(10+(3/1)-(4/2)+((8/2)+(7*8*(3-2)))))-3';
$str_pn = convertToPolishNotation($str);
$res = calculatePolishNotation($str_pn);
 echo  $res;

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

пытался написать алгоритм вычисления налету с одним прогоном - но неосилил))
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37253645
Vaytl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r uимхо, у решения через регекспы есть существенный минус - скорость работы. замеры скорости не делал, но чтобы не быть голословным решил написать решение "классически" ....
Как ни странно, но ваш пример через регекспы, работает быстрее второго варианта на 50-100%...
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37253659
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VaytlКак ни странно, но ваш пример через регекспы, работает быстрее второго варианта на 50-100%...
странно))) думал будет наоборот
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37256229
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VaytlКак ни странно, но ваш пример через регекспы, работает быстрее второго варианта на 50-100%...
добился небольшого но выигрыша в скорости второго варианта )
избавился от регекспа и функции _addPnItem() (передача по ссылке тормозила, глобальные переменные тоже).
думаю можно оптимизировать и сам алгоритм, но это уже отдельная история)
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
 function  convertToPolishNotation($s) {
	static $prior =  array ('*' =>  3 , '/' =>  3 , '+' =>  2 , '-' =>  2 , '(' =>  1 );
	$stack = $out = $items =  array ();
	// get operators & operands
	$d= null ;
	 for ($i= 0 ,$l= strlen ($s); $i<$l; ++$i) {
		 if  ( is_numeric ($s{$i}) || $s{$i}=='.') $d.=$s{$i};
		 else  {
			 if  ($d!= null ) {
				$items[]=$d;
				$d= null ;
			}
			$items[]=$s{$i};
		}
	}
	 if  ($d!= null )
		$items[]=$d;
	//
	 for ($i= 0 ,$m= sizeof ($items); $i<$m; ++$i) {
		 if  ( is_numeric ($items[$i]))
			$out[] = $items[$i];
		 else  { // addPn
			 if  ( sizeof ($stack) ==  0  || $items[$i] == '(') {
				$stack[] = $items[$i];
			}  elseif  ($items[$i] == ')') {
				 for  ($ii =  sizeof ($stack) -  1 ; $ii >=  0 ; --$ii) {
					 if  ($stack[$ii] == '(') {
						 array_pop ($stack);
						 break ;
					}
					 else  $out[] =  array_pop ($stack);
				}
			}  else  { // + - * /
				 for  ($ii =  sizeof ($stack)- 1 ; $ii>= 0 ; --$ii) {
					$oper = $stack[$ii];
					 if  ($prior[$oper] >= $prior[$items[$i]]) {
						$out[] = $oper;
						 unset ($stack[$ii]);
					}
					 else   break ;
				}
				$stack[] = $items[$i];
				$stack =  array_values ($stack);
			}
		}
	}
	 if  ( sizeof ($stack))
		$out =  array_merge ($out,  array_reverse ($stack));
	 return  $out;
}
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37303902
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дан массив чисел:
Код: plaintext
1.
2.
3.
4.
$a =  array (
  0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 
  0 , 1 , 2 , 3 , 4 , 5 , 6 ,   8 , 9 
);
Как видно, в массиве все числа, кроме одного, встречаются 2 раза, а одно число(7) только один раз.
необходимо найти это число всего за один проход массива.

PS всякие готовые функции array_xxxxx() и т.п. использовать нельзя
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37303918
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а в чем прикол
Код: plaintext
1.
2.
3.
$rez =  array ();
 foreach  ($arr  as  $key=>$value){
   @$rez[$value]++;
}
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37303931
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowа в чем прикол
Код: plaintext
1.
2.
3.
$rez =  array ();
 foreach  ($arr  as  $key=>$value){
   @$rez[$value]++;
}

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

Дан массив чисел:
Код: plaintext
1.
2.
3.
4.
5.
$a =  array (
  0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 
  0 , 1 , 2 , 3 , 4 , 5 , 6 ,   8 , 9 
);
$n= null ;

Как видно, в массиве все числа, кроме одного, встречаются 2 раза, а одно число(7) только один раз.
необходимо найти это число, всего за один проход массива, и поместить найденное число в переменную $n .

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

$a = array(
0,1,2,3,4,5,6,7,8,9,
0,1,2,3,4,5,6, 8,9
);
$n = 0;
foreach($a as $v){
$n=$n ^ $v; //иногда исключающее или всетаки нужно
}
echo $n;
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37305166
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artas,

поздравляю)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37307630
artas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже самое задание, но....
Дан массив букаф:
Код: plaintext
1.
2.
3.
4.
$a =  array (
 'a','b','c','d','e','f','g','h','q','n', 
 'a','b','c',    'e','f','g','h','q','n',
);
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37307660
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artas,

решение тоже самое. только изначально $n="\0";
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37764907
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добейтесь появления у объекта двух свойств с одинаковым названием и разной областью видимости. :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37765651
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymДобейтесь появления у объекта двух свойств с одинаковым названием и разной областью видимости. :)
легко )

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class Obj {
	private $name = 'private var';
	public function getPrivate() {
		var_dump($this->name);
	}
}
class Obj2 extends Obj {
	protected $name = 'public var';
	public function getPublic() {
		var_dump($this->name);
	}
}
echo '<pre>';
$o = new Obj2();
$o->getPrivate();
$o->getPublic();


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

-Добейтесь появления у объекта ТРЕХ свойств с одинаковым названием и разной областью видимости.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37766142
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И я немного усложню: добейтесь появления у объекта класса без родителей и наследников двух свойств с одинаковым названием и разной областью видимости.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37766152
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и без примесей.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37766534
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uScareCrowбез прохода по второму массиву?
да.
тогда уточню немного.

Дан массив чисел:
Код: php
1.
2.
3.
4.
5.
$a = array(
 0,1,2,3,4,5,6,7,8,9, 
 0,1,2,3,4,5,6,  8,9
);
$n=null;


Как видно, в массиве все числа, кроме одного, встречаются 2 раза, а одно число(7) только один раз.
необходимо найти это число, всего за один проход массива, и поместить найденное число в переменную $n .

PS всякие готовые функции array_xxxxx() и т.п. использовать нельзяа как насчет того же самого, только с двумя "одинокими" числами? :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37767393
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymИ я немного усложню: добейтесь появления у объекта класса без родителей и наследников двух свойств с одинаковым названием и разной областью видимости.
пойдет?

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
class Obj {
	private $name = 'PRIVATE';
	private $vars = array();
	public function getPrivate() {
		return $this->name;
	}
	public function __set($k,$v) {
		$this->vars[$k]=$v;
	}
	public function __get($k) {
		if (isset($this->vars[$k]))
			return $this->vars[$k];
		return null;
	}
}

echo '<pre>';
$o = new Obj();
$o->name = 'PUBLIC';

var_dump($o->getPrivate());
var_dump($o->name);


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

не, должны быть именно два поля. Примерно как в первом варианте ответа, только без наследования.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37767595
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymr u,
не, должны быть именно два поля. Примерно как в первом варианте ответа, только без наследования.
-serialize
-modify
-unserialize
? ))
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37767872
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

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

ага.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37768034
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный Меча как насчет того же самого, только с двумя "одинокими" числами? :)
за один проход массива?
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37768139
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uЯростный Меча как насчет того же самого, только с двумя "одинокими" числами? :)
за один проход массива?да, забыл сказать, не обязательно за один.
можно несколько, пусть будет не более 5.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37768222
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный Меч,

поздно..... сделал за один ))
ну и проход по вспомогательному еще. без него не придумал как.

Код: php
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.
26.
$a = array(
	0,1,2,3,4,
	0,  2,3
);

$xor=$n=$m=null; // <- digits
$sums=array();//	sums of XOR for every bit
foreach($a as $k=>$v) {
	$xor ^= $v;
	foreach(range(1,$v) as $vv) {
		if ($v&$vv) {
			if (!isset($sums[$vv]))
				$sums[$vv]=null;
			$sums[$vv] ^= $v;
		}
	}
}
// search $m,$n
foreach($sums as $v) {
	if ($v>0 && ($v^$xor)>0){
		$n=$v;
		$m = $xor^$n;
		break;
	}
}
echo 'n='.$n.' m='.$m;


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

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

я правильно понимаю, что тут есть вложенный цикл (длина которого равна очередному числу)?
если да, то фактически сложность будет больше O(N)
есть простой, линейный вариант, без вспомогательного массива.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
$a = array(
	0,1,2,3,4,
	0,  2,3
);
$filter = $result = array();
foreach($a as $value) {
if (isset($filter[$value])) {

} else if (isset($result[$value])) {
unset($result[$value]);
$filter[$value]= true;
} else {
$result[$value]= true;
}
}
var_dump($result);


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

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

Код: plaintext
1.
[ul disc]
    
item 1[/li]

item 2[/li]

item 3[/li]

в HTML.

Дополнительная сложность в том, что нужно удалить символы перевода строки, т.к. текст потом еще обрабатывается с помощью nl2br.
Честно говоря посидев над задачей минут 15 одной регуляркой сделать это так и не получилось.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37774840
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извиняюсь, тег не закрыл, но думаю суть понята.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37774846
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а нет, тег то я видимо закрыл, тут движок воспринял это как свои теги)

Код: html
1.
2.
3.
4.
5.
[ul disc]
    [li]item 1[/li]
    [li]item 2[/li]
    [li]item 3[/li]
[/ul]
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37775347
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

а одной регуляркой тут обойтись если и можно то очень накладно будет.
я бы сделал както так
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$bb = "[ul disc]
	[li] 
	item 1[/li]
    [li]item 
    2[/li]
    [li]item 3
    [/li]
[/ul]";
$bb = str_replace(PHP_EOL,'',$bb);
$html = preg_replace("/\[(\/?(ul|li)[^\]]*)\]/i","<$1>",$bb);
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37789016
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я примерно так и сделал, точнее двумя, сначала все LI зменил в UL, а потом и сами UL
...
Рейтинг: 0 / 0
271 сообщений из 271, показаны все 11 страниц
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Разминка для мозгов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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