Из спортивного интереса решил задачку. Как я понял, там может быть несколько решений, хотелось бы найти наиболее отпимальное. У меня получился такой вариант:
^(?:(?:..)*[^a]a)*[^a]*$
Интересно, у ваших спецов такое же решение, или другое?
P.S. В условии задачи забыли указать, что имеется в виду диалект регулярных выражений, используюшийся в JS.
Это понятно, что от контракта зависит. Но автор указал, что одна из его целей использования пустых коллекций – избавиться от по его мнению лишних проверок на null. Из чего делаем закономерный вывод, что в его случае подобного контракта не предусметрено (иначе вообще не было бы смысла упоминать null).
>null vs empty
>
> Всегда старайтесь в методах вашей бизнес логики возвращать пустые коллекции вместо null значений, это избавляет от лишних null-проверок и делает код чище.
Во-первых, таким образом получится избавиться только лишь от небольшого количества проверок на null, в частности, в некоторых приватных методах. В пабликах и т.д. в любом случае придется проверки на null делать, так как заранее можете и не знать, кто и как будет их вызывать в будущем.
Во-вторых, использование пустых коллекций и прочих объектов вместо null отрицательно скажется на производительности за счет расходов на сериализацию например при ремотных вызовах, а также увеличит трафик (больший объем сериализованных данных будет передаваться), также увеличит потребление памяти, и возможно, диска, если сериализованные данные будут где-то храниться, и т.д.
В общем, я, конечно, не призываю во всех случаях использовать null, но призываю воздерживаться от вырадения «всегда старайтесь делать то-то» без указания контекста.
Так-с, написал небольшой тест и проверил. Как оказалось, наличие заглушки 0; в моем случае никак не повлияла на скорость выполнения. По крайней мере так в FF 5, я многократно проверял на цикле 100000000 итераций. Так что мой коммент выше, пожалуй, можете игнорировать. Хотя, можете и сами поставить эксперимент и проверить, мало ли, может быть я ошибся на ночь глядя.
Не уверен, что это подходит в данном случае. Дело в том, что при невыполнении условия (type a=="string") будет выполнен оператор-заглушка 0; — а это немного уменьшит производительность.
Меняем длинную и сложную конструкцию if(a)b;else c — на короткую и простую a?b:c. Выигрываем 8 байт.
Из примера автора:
if(this.j())this.d();else this.f()
->
this.j()?this.d():this.f()
Очень сомневаюсь, что это хоть как-то может уменьшить производительность, зато сокращение кода явно видно.
Кстати, после ряда этих упрощений имеет смысл приступать к избавлению от фигурных скобок в циклах и условных операторах, используя запятую. Это даст дополнительный выигрыш.
Не забываем про оператор in. При этом выигрываем несколько байт за счет того, что не нужно предварительно инициализировать переменную-индекс, и еще за счет того, что не нужно делать инкремент.
Из примера автора: l=0;for(;l<a.length;){j=a[l++];… заменяем на for(l in a)j=a[l],…
if(a){b,c} заменяем на if(a)b,c; — выигрываем 1 или 2 байта. Точнее, выигрываем 2 байта за счет фигурных скобок, и теряем один байт за счет финальной точки с запятой (или не теряем, если это в конце блока).
Из примера автора: if(typeof a==«string»){d=false;a=[a]} заменяем на if(typeof a==«string»)d=false,a=[a];
Вот еще фильм в Вашу коллекцию: «Нирвана», 1997 год.
В кратце, один из главных героев — программист, другой — персонаж созданной им компьютерной игры. Там еще есть и хакеры, и продавцы органов, и т.д., то есть в этом фильме множество весьма колоритных и ярких персонажей. Мне в свое время этот фильм очень понравился.
1) Вы уверены, что это не оплачивается? Но даже если и так, наверняка оплата лекционных часов и практических занятий по повышенному профессорскому рейту вполне способно компенсировать часы на разработку тем для рефератов.
Он же профессор, если ему некогда (хотя на поиск плагиата время есть, да...), то зачем ему самому-то задания придумывать. Достаточно поручить нескольким толковым студентам нагенерировать достаточное количество уникальных заданий. А самому останется только проревьюить получившееся.
Если нет желания напрягать студентов, всегда есть фрилансеры. Достаточно зайти например на Elance.com, и запостить проект «Нужно 500 уникальных тем для рефератов», тут же найдется сонти желающих студентов, аспирантов, доцентов и т.д. со всего мира (например из России, Украины или Индии), которые за копейку и отзыв всё сделают в лучшем виде. Да, придется заплатить… ну, может быть, 100 долларов, этого на год хватит (скорее всего, примерно столько он получает за одну-две лекции), зато сэкономит массу времени, то есть по сути за эти незначительные деньги он купит много часов жизни. Более того, эти деньги он с большой вероятностью сможет списать со своих налогов (tax return).
2) Загружены… Время на проверку плагиата и на разборки со студентами есть, а на свою специальность — нет, так что-ли?
3) Не думаю, что такие проблемы имеют место быть у американского профессора (не забываем. что профессор — это не просто какой-нибудь преподаватель). Более того, вряд ли ему дадут работать с перегрузом, неэффективно и некачественно. Репутация вуза там — это в прямом смысле деньги.
^(?:(?:..)*[^a]a)*[^a]*$
Интересно, у ваших спецов такое же решение, или другое?
P.S. В условии задачи забыли указать, что имеется в виду диалект регулярных выражений, используюшийся в JS.
Во-первых, таким образом получится избавиться только лишь от небольшого количества проверок на null, в частности, в некоторых приватных методах. В пабликах и т.д. в любом случае придется проверки на null делать, так как заранее можете и не знать, кто и как будет их вызывать в будущем.
Во-вторых, использование пустых коллекций и прочих объектов вместо null отрицательно скажется на производительности за счет расходов на сериализацию например при ремотных вызовах, а также увеличит трафик (больший объем сериализованных данных будет передаваться), также увеличит потребление памяти, и возможно, диска, если сериализованные данные будут где-то храниться, и т.д.
В общем, я, конечно, не призываю во всех случаях использовать null, но призываю воздерживаться от вырадения «всегда старайтесь делать то-то» без указания контекста.
a - ((a - b) >>> 31) * (a - b)
C: -1
PHP: -1
Perl: 1 (только тут я делал -9 >> 63, так как используются 64 разрядные числа)
my $a = -5;
my $b = 4;
print $a - (($a - $b) >> 63) * ($a - $b);
Данный код на Perl вернул правильный результат: 4.
Но в любом случае, конечно, вариант с &1 использовать предпочтительнее, так как он более универсален.
a - (((a - b) >> 31) & 1) * (a - b)
a - ((a - b) >> 31) * (a - b) = -5 - ((-5 - 4) >> 31) * (-5 - 4) = -5 - (-9 >> 31) * -9 =-5 - -9 = 4
Ответ правильный.
a — ((a — b) >> 31) * (a — b)
Из примера автора:
if(this.j())this.d();else this.f()
->
this.j()?this.d():this.f()
Очень сомневаюсь, что это хоть как-то может уменьшить производительность, зато сокращение кода явно видно.
Кстати, после ряда этих упрощений имеет смысл приступать к избавлению от фигурных скобок в циклах и условных операторах, используя запятую. Это даст дополнительный выигрыш.
Из примера автора: l=0;for(;l<a.length;){j=a[l++];… заменяем на for(l in a)j=a[l],…
Из примера автора: if(typeof a==«string»){d=false;a=[a]} заменяем на if(typeof a==«string»)d=false,a=[a];
В кратце, один из главных героев — программист, другой — персонаж созданной им компьютерной игры. Там еще есть и хакеры, и продавцы органов, и т.д., то есть в этом фильме множество весьма колоритных и ярких персонажей. Мне в свое время этот фильм очень понравился.
Он же профессор, если ему некогда (хотя на поиск плагиата время есть, да...), то зачем ему самому-то задания придумывать. Достаточно поручить нескольким толковым студентам нагенерировать достаточное количество уникальных заданий. А самому останется только проревьюить получившееся.
Если нет желания напрягать студентов, всегда есть фрилансеры. Достаточно зайти например на Elance.com, и запостить проект «Нужно 500 уникальных тем для рефератов», тут же найдется сонти желающих студентов, аспирантов, доцентов и т.д. со всего мира (например из России, Украины или Индии), которые за копейку и отзыв всё сделают в лучшем виде. Да, придется заплатить… ну, может быть, 100 долларов, этого на год хватит (скорее всего, примерно столько он получает за одну-две лекции), зато сэкономит массу времени, то есть по сути за эти незначительные деньги он купит много часов жизни. Более того, эти деньги он с большой вероятностью сможет списать со своих налогов (tax return).
2) Загружены… Время на проверку плагиата и на разборки со студентами есть, а на свою специальность — нет, так что-ли?
3) Не думаю, что такие проблемы имеют место быть у американского профессора (не забываем. что профессор — это не просто какой-нибудь преподаватель). Более того, вряд ли ему дадут работать с перегрузом, неэффективно и некачественно. Репутация вуза там — это в прямом смысле деньги.