Николай Г.
601 сообщение
#15 лет назад
Варианта в данном случае два.
1) регулярки, если пофик на производительность. Я не знаю, насколько хорошо в PHP реализованы(точнее свистнуты из PCRE) регулярки, по идее эта задача должна решаться за 1 прогон.

2) Самый правильный. Если производительность интересна(производительность??? На PHP??) - делайте сами. Метод конечных автоматов(если дозволено мне будет поминать имя метода этого в такой задаче). Ну реально 3 минуты это пишется, чего лениться то??

Вариант с strpos может прокатить на 2-х поисковых словах. Из за линейного ухудшения производительности при увеличении количества слов, данный метод должен быть обьявлен говнокодом и гневно выпилен как только их количество превысит 2. Так что строго говоря, для данной задачи вариант проходит, но write-only, при дальнейшем усложнении задачи такой код должен быть не модифицирован а переписан. Учитесь предвосхищать потребности заказчика, очень от многих проблем в будущем спасет...

И вообще, друзья, ну учите матчасть уже, а... Очень не хочется вас всех школьниками называть, но после такого:

Цитата ("Demiurh"):
Цитата (eXsofter):
if( в строке адреса браузера нету слова 'news' и слова 'forum'' ) echo 1;
...
Фикус в том, что в задании говорится И, а в решении ИЛИ.


В общем нет слов. Уроки информатики, лично у меня - 8 вроде бы, плохо помню, класс. Алгебра логики. Ну либо, кому не повезло, и в школе информатики не было - надо восполнять такие пробелы, прежде чем программистами себя называть...

!a & !b = !(a&b) - запомните, дети, а лучше запишите.
Прогонять две регулярки, если их можно обьединить в одну и взять отрицание - плохо. Запомните, а лучше выжгите пальцах!
Метод конечных автоматов - хорошо! В том случае, если на него потратится 3 минуты, использовать его а не пользоваться встроенными в PHP функциями - хорошо!
И не ухудшит это восприятия кода нихрена! Наоборот, если человек мало работал в PHP со строками, ему куда проще будет понять нормальный цикл, где проходятся по всем знакам строки, чем лазить по учебникам в поисках strpos!
Цитата ("Lisio"):
Программист не знающий о регулярных выражениях - не программист.

Шикарное утверждение. Люди, пишущие на ассемблере - не программисты.
Люди, которые пишут не сайтики, на которых надо много работать с текстом, а программы управления спутниками - жалкие ламеры, поскольку т.к. там текста нет - одни цифры, с регулярками они работать, по вполне понятным причинам, умеют не очень хорошо.
Да даже те, кто пишут игры(не онлайн, с нормальной графикой и физикой) - и те ламеры. Потому что там регулярки если и используются, то крайне редко....
Александр Ш.
12 сообщений
#15 лет назад
Оффтопик

Не в обиду

dervinar =
- 80% эмоций, напора и страсти;
- 10% передергивания, перемешивания фактов;
- 10% смысла;
Фрилансер У.
248 сообщений
#15 лет назад
Цитата ("dervinar"):
Метод конечных автоматов(если дозволено мне будет поминать имя метода этого в такой задаче). Ну реально 3 минуты это пишется, чего лениться то??

Ну и регулярки основаны на нем.
Код регулярок написан на Си и скомпилирован. С чего собственной реализации конечных автоматов быть быстрее.

Цитата ("dervinar"):
Вариант с strpos может прокатить на 2-х поисковых словах. Из за линейного ухудшения производительности при увеличении количества слов, данный метод должен быть обьявлен говнокодом и гневно выпилен как только их количество превысит 2.
.
Этого я не заметил.

Цитата ("dervinar"):
Наоборот, если человек мало работал в PHP со строками, ему куда проще будет понять нормальный цикл, где проходятся по всем знакам строки, чем лазить по учебникам в поисках strpos!

Напоминаю, циклы в php работают медленней аналогичных в Си.
Цитата ("dervinar"):
чем лазить по учебникам в поисках strpos!

Найти нужную функцию 2 минуты, а после она откладывается в мозгу и мануал используется исключительно для уточнения.
Николай Г.
601 сообщение
#15 лет назад
Оффтопик

Разумеется не в обиду. Не спорю, получилось несколько более эмоционально, чем хотелось - просто не могу спокойно смотреть на такие издевательства над программированием.
Если не секрет, где именно Вы увидели перемешивание фактов?
Александр Ш.
12 сообщений
#15 лет назад
Цитата ("dervinar"):
Если не секрет, где именно Вы увидели перемешивание фактов?


По сути, вы предлагаете использовать алгоритмы и логику из одной сферы применения (в которой она оправдана и работает хорошо) - в другой,
в которой более важна скорость написания, логичность и читабельность кода на более высоком уровне абстракции.
К примеру, я как PHP программист, вникая в чужой код, буду рад видеть там одну "близкую сердцу" строку с preg_match(...), чем искать смысл внутри тела незнакомого мне цикла (особенно если нет комментариев) и т.п.
Николай Г.
601 сообщение
#15 лет назад
Цитата ("werewolf"):
Цитата (dervinar):
Вариант с strpos может прокатить на 2-х поисковых словах. Из за линейного ухудшения производительности при увеличении количества слов, данный метод должен быть обьявлен говнокодом и гневно выпилен как только их количество превысит 2.
.
Этого я не заметил.

Только из за малой длины подаваемой строки. Просто циклы в PHP толи кэшируются, толи еще что-то...
Следует лишь увеличить длину строки, как все встанет на свои места:
strpos(2 word): 0.192898035049
strpos(4 word): 0.422738075256

А вот и сам код, проверьте....
$max = 100000;
$uri = strtolower(';);

$start = microtime(true);
for($i=0;$i<$max;$i++)
{
if (strpos($uri, 'forum') === false && strpos($uri,'news') === false )
{

}
}

$end1 = microtime(true)-$start;

$start = microtime(true);
for($i=0;$i<$max;$i++)
{
if (strpos($uri, 'page') === false && strpos($uri, 'guestbook') === false && strpos($uri,'news') === false )
{

}
}

$end2 = microtime(true)-$start;


echo "strpos(2 word): $end1\n";
echo "strpos(4 word): $end2\n";
Николай Г.
601 сообщение
#15 лет назад
Добавил регулярки, слова те же, длина строки та же.

strpos(2 word): 0.188319921494
strpos(4 word): 0.402966976166
preg_match(2 word): 0.162349939346
preg_match(4 word): 0.20379114151

Что и следовало ожидать.

Цитата ("AmarenoCom"):
По сути, вы предлагаете использовать алгоритмы и логику из одной сферы применения (в которой она оправдана и работает хорошо) - в другой,
в которой более важна скорость написания, логичность и читабельность кода на более высоком уровне абстракции.
К примеру, я как PHP программист, вникая в чужой код, буду рад видеть там одну "близкую сердцу" строку с preg_match(...), чем искать смысл внутри тела незнакомого мне цикла (особенно если нет комментариев) и т.п.

Как альтернативу более правильному, с моей точки зрения, и академичному подходу я предлагаю использование регулярок.
Разумеется, нелепо требовать от PHP кодеров, особенно тех, кто не желает стремиться к совершенству, оптимального кода. В настоящий момент новый сервер зачастую стоит дешевле хорошего программиста...
Александр Ш.
12 сообщений
#15 лет назад
Цитата ("dervinar"):
особенно тех, кто не желает стремиться к совершенству


Опять эмоции.
Понятие "стремиться к совершенству" у каждого свое.
Для кого то - важно быстрее сделать инет-магазин и дать старт продажам.
Для кого то - важно выиграть 1 микросекунду во времени выполнения кода.

Главное - гармония
Николай Г.
601 сообщение
#15 лет назад
Цитата ("AmarenoCom"):

Главное - гармония

Это точно=)
Но только в том случае, если стимулы такие, положительные) "Быстрее сдать", или "сделать лучше". А вот если стимул "лениво учиться", или, не дай бог "и так прокатит" - это уже никакого отношения к совершенству не имеет)
Тут М.
626 сообщений
#15 лет назад
Цитата ("dervinar"):
В общем нет слов. Уроки информатики, лично у меня - 8 вроде бы, плохо помню, класс. Алгебра логики. Ну либо, кому не повезло, и в школе информатики не было - надо восполнять такие пробелы, прежде чем программистами себя называть....


Конечно приятно чувствовать себя самым крутым и умным, но:
1. Что написано в задании - если нет слова "news" И слова "forum". Это значит что одиночные слова не должны "ловиться", а только в связке.
2. В предложенном решении написано - если нет слова "news" ИЛИ слова "forum". Разницу с п.1 объяснять надо?
3. Цитата ("dervinar"):
!a & !b = !(a&b)
- это бред. Так переврать закон де Моргана... Должно быть так - !a & !b = !(a | b)
Николай Г.
601 сообщение
#15 лет назад
Цитата ("Demiurh"):
!a & !b = !(a&b)
- это бред. Так переврать закон де Моргана... Должно быть так - !a & !b = !(a | b)

да, разумеется, ошибся. В формировании условия Вы не правы.
Андрей К.
1172 сообщения
#15 лет назад
Цитата ("dervinar"):
Шикарное утверждение. Люди, пишущие на ассемблере - не программисты.

Люди, пишущие сайты на ассемблере - не люди. Это конченые мутанты. А не разбираясь в регулярках нечего вообще делать в веб-кодинге. И особенно в чужой код не надо свой нос совать, коли не понимаешь! Narod.ru для таких всегда открыт.

Цитата ("Demiurh"):
1. Что написано в задании - если нет слова "news" И слова "forum". Это значит что одиночные слова не должны "ловиться", а только в связке.
2. В предложенном решении написано - если нет слова "news" ИЛИ слова "forum". Разницу с п.1 объяснять надо?

Надо понимать не только дословно, а что человеку действительно надо. В данном случае не должно встречаться даже одно из вышеперечисленных слов. Зная только одни точные науки нормально с людьми общаться не получится. Особенно во фрилэнсе, где от этого зависит твой доход.
Фрилансер У.
248 сообщений
#15 лет назад
Цитата ("Lisio"):
Люди, пишущие сайты на ассемблере - не люди. Это конченые мутанты.

Про таких людей никто речь не вел.
Цитата ("Lisio"):
А не разбираясь в регулярках нечего вообще делать в веб-кодинге.

Можно много чего.
Андрей К.
1172 сообщения
#15 лет назад
Цитата ("werewolf"):
Можно много чего.

Но мало чего хорошего. Потом за такими "много чего" сидишь и выбрасываешь 3/4 кода ненужного.

Вот такое условие if(strpos($uri,'news'===false && strpos($uri,'forum'===false && strpos($uri,'guestbook'===false && strpos($uri,'pages'===false) выглядит более чем глупо.
Николай Г.
601 сообщение
#15 лет назад
Цитата ("Lisio"):
Но мало чего хорошего. Потом за такими "много чего" сидишь и выбрасываешь 3/4 кода ненужного.

Тут момент такой... Регулярки, разумеется, отдавая дань Perl'у знать надо, и применять везде, где нужно тоже надо.
Более того, как я показал - тут они будут более производительны, чем strpos.
Но применять их следует не бездумно.
Фрилансер У.
248 сообщений
#15 лет назад
Цитата ("dervinar"):
Но применять их следует не бездумно

Правильно.

В тех тестах REQUEST_URI была очень короткой, как и бывает обычно, условий было мало и strpos оправдан.
На это сообщение можете не отвечать.
Николай Г.
601 сообщение
#15 лет назад
Цитата ("werewolf"):
В тех тестах REQUEST_URI была очень короткой, как и бывает обычно, условий было мало и strpos оправдан.

Оправдан? Чем?
Код с strpos менее компактен, труднее читаем, труднее модифицируется. Я еще могу согласиться, что по производительности strpos практически не отличается от регулярок, и на это можно забить. Но по всему остальному регулярки лучше...
Цитата ("werewolf"):
На это сообщение можете не отвечать.

Спасибо за заботу, мне, в общем то не трудно...