Блог разработчиков

Нехитрый вопрос на собеседовании или как не попадают в стартапы

Алексей Колупаев
Опубликовано 12.06.2008 в О работе, Разработка, Учеба

Всем привет, меня зовут Алексей Колупаев, и мне посчастливилось познакомиться с людьми, которые изменили мою профессиональную жизнь: я делаю новый стартап. Именно от меня будет зависеть вся техническая часть нового народного финансового портала. И, на данном этапе, это означает, что мне нужно собрать убийственную команду и так построить процесс, чтобы добиться суперэффективности. Есть мнение, что собрать классную команду очень нелегко. Мне довелось поработать в интересных местах, со многими интересными людьми и провести, наверное, около сотни собеседований, в основном, PHP-программистов. Пользуясь случаем, хочу поблагодарить всех, кто приходил ко мне на собеседования – вы многому меня научили. И я хочу поделиться со всеми одной из своих самых любимых задачек для собеседования.

Придумал ее, разумеется, не я, а прочитал, кажется, у Джоела Спольски. Слышал, что ее дают на собеседовании в Microsoft. В коротком варианте она звучит так: «как повернуть строку задом наперед?». Подозреваю, что в Microsoft не ожидают ее решения на PHP, а вероятно, на С или С++. Прелесть задачи состоит в том, что она мало говорит о языке и много – о программисте. В моем варианте она звучит так:

<?php
$a = 'abcdefgh';
// Напишите здесь недостающий код, чтобы результатом работы скрипта была строка $a, повернутая наоборот
echo $a;
?>

То есть, этот скрипт должен выдавать

hgfedcba

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

Нет, правда, попробуйте.

Итак, буду оглашать и комментировать варианты ответа в порядке моего личного, субъективного, наверняка в чем-то ошибочного понимания правильности решения.

5. Номер пять в моем хит-параде занимает ответ «я не знаю, и не буду это писать». Иногда с вариантом «что за дурацкая задача, в жизни такого не бывает». Слив, как говорится, засчитывается сразу.

4. Номер четыре занимает вариант «В PHP вроде должна быть такая функция…». Что ж, справедливости ради, должен сказать, что в PHP действительно есть такая функция. Названия ее, конечно же, никто не помнит. Это нормально. Но неужели вы думаете, что я задавал эту задачку, чтобы услышать такой ответ? Следом за таким ответом предлагаю реализовать эту функцию самостоятельно. То есть, как отмазка не канает, надо писать.

3. Место номер три уходит семейству решений под девизом «ну, как-то через массивы». Код при этом, разумеется, выглядит по-разному, и до победного конца (работающего и выполняющего задачу скрипта) добираются не все адепты массивных решений. Функции explode() и, соответственно, implode() приходят в голову далеко не всем, а уж что пытаются делать между ними – прямо стыдно рассказывать. Даже сортировку. Решение с массивами формально годится, задача должна быть в первую очередь решена, а потом уже можно и заняться оптимизацией, и поговорить о производительности, и так далее. Нюанс в том, что решить задачу через массивы не так уж легко, потому что массивы тут не нужны. Есть у меня подозрение, что такое решение говорит о том, что человек недостаточно работал с примитивными типами данных, а был в детстве ранен в мозг простотой и легкостью динамических массивов в PHP. Но человека, более-менее писавшего, например, на С, таким не обмануть. Так что в целом – подходу незачот.

2. Следующее решение – минимально адекватное для того, чтобы я рассматривал человека всерьез:

$b = '';
for ($i = strlen($a)-1; $i>=0; $i--)
    $b .= $a[$i];
$a = $b;

Возможны, понятно, некоторые вариации.

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

  • strlen() вынесен из тела цикла и выполняется один раз (есть ли понимание того, что это зло?)
  • минус один от длины строки (сколько шишек об это уже набито?)
  • как там с ноликом – больше или больше-равно? (те же, в принципе, шишки)

Так как часто это задание я предлагаю решить на бумажке, сразу видно, что человек учитывает сходу, а что «подтачивал» бы по результату.

1. Джедайские техники. Чемпионов видно по джедайским техникам решения задач, хочется верить, что такие люди хотя бы листали Кнута. Мне известно только две, на собеседовании я встретил их буквально один или два раза. Первая, которую я таки встречал (Вадим, привет) заключается в том, чтобы использовать цикл вдвое меньшей длины и менять местами соответствующие символы:

$b = '';
$l  = strlen($a)-1;
for ($i = 0; $i < $l/2; $i++) {
    $b = $a[$i];
    $a[$i] = $a[$l-$i];
    $a[$l-$i] = $b;
}

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

$a[$i] = $a[$l-$i]^$a[$i];
$a[$l-$i] = $a[$l-$i]^$a[$i];
$a[$i] = $a[$l-$i]^$a[$i];

Задачка, конечно, «плюшевая». Я сам могу придумать десяток причин, по которым она плоха – не отражает знание PHP, не соответствует реальной жизни, что вообще она показывает, бла, бла, бла. Как, например, понять, догадался человек о таком решении или просто читал о нем где-то еще? Неважно. Уверяю вас – пользуясь этой задачкой (и, конечно, еще многими другими) я еще ни разу серьезно не ошибся с кандидатом. Ведь формальное знание PHP в кандидате – поверьте, далеко не главное. Значительно важнее – отношение к своему занятию, стремление к развитию, способность играть в команде, видение мира, если угодно. Мне гораздо интереснее, как человек решает задачу, чем ее фактическое решение. Грань между этими вещами довольно тонка, но мне кажется – она есть, и понять, что за ней, не так уж просто.

А всем, кто дочитал до этого драматического места, я напоминаю, что наш проект ищет людей, которые обладают талантами PHP-программистов, которые в начале этой статьи все-таки решили эту задачку и ответ находится в первой или второй группе решений. Таким программистам мы хотим рассказать о прелестях работы в стартапе, о чудесах, на которые способна маленькая но мощная команда, вооруженная разносторонними знаниями, оснащенная лучшими средствами производства гениальных проектов и мотивированная нашими, украинскими, реальными рыночными целями. Если вы хороши, действительно хороши в PHP, и это не единственный ваш язык программирования, если у вас есть свое мнение относительно модели MVC и пара серьезных проектов за спиной, если вам не все равно как происходит развитие проекта, и вы болеете душой за agile, scrum и xp, если вы еще недостаточно закостенели и готовы броситься с головой в проект, где надо будет реально показать то лучшее, на что вы способны – то у нас есть к вам предложение мечты. Но задачка на собеседовании будет другая :)

Алексей Колупаев,
kolupaev@gmail.com

Теги: , , ,

1 звезда2 звезды3 звезды4 звезды5 звезд (36 голосов, средний: 3.28 из 5)
Загрузка ... Загрузка ...
Распределение голосов

Понравилась статья? Подпишись на обновления по RSS/E-mail

Подписаться, не оставляя комментарий

Все комментарии (143) к “Нехитрый вопрос на собеседовании или как не попадают в стартапы” RSS

  1. ГАЙОЗ говорит:

    Прикольно, если бы мне такие задачи давали при поступлении на работу :)
    Кстати, по задаче, я бы тоже сделал вариант с половиной строки, вот как я это прокоментировал
    (не силен в PHP, балдею по С++)

    $b = ”;
    $l = strlen($a); //Не будем вычитать 1
    //посколькьу деление на 2 четного числа дает правильные результат, например если
    //строка состоит из 8 символов, 8/2=4, в условии можно поставить так:
    //for ($i = 0; $i < $l/2; $i++)
    //это даст обращение ко всем 4 символам с начала, и
    //тоже самое для нечетного числа, например 9, 9/2=4
    //тоже даст обращение к 4-рем символам, что надо, а обращение к 5-тому символу некчему,
    //т.к. одно центральное и менять местами его не к чему :)
    for ($i = 0; $i < $l/2; $i++) {
    $b=$a[$i];
    $a[$i]=$a[$l-(i+1)];
    $a[$l(i+1)]=$b;
    }

  2. Ктулху говорит:

    О, блин..
    И что, люди, которые не решали эту задачу не получали работу?

  3. ГАЙОЗ говорит:

    А я вот думаю, неужели в Microsoft дают ТАКИЕ задачи при поступлении на работу??? |)

  4. runmen говорит:

    да, особенно важно сделать это через XOR, очень повышает читаемость.

    Задачу надо было ставить как
    // Напишите здесь недостающий код, с наибольшим кол-вом выебонов, чтобы результатом работы скрипта была строка $a, повернутая наоборот

  5. alexs говорит:

    сначало вспомнил что в пхп есть функция для реверта строки, потом конечно подумал о втором варианте, но когда увидел пункт “джедайские техники” задумался как можно оптимизировать, вот мой ответ:

    $a = '1234567';
    $i=strlen($a);
    for($z=$i/2; $z>=0; --$z) $a .= ($a[$z+$z] . $a[$z+$z-1]);

    echo substr($a, $i) . “\n”;

  6. alexs говорит:

    for($z=$i/2; $z>=0; –$z) $a .= ($a[$z<<1] . $a[($z<<1)-1]);
    чтобы повысить читаемость :)))

  7. Роман П. говорит:

    $a = ‘abcdefgh’;
    $a = ‘hgfedcba’;
    echo $a;

  8. Roman Cheplyaka говорит:

    Строки в php состоят из байтов или символов? Как эти прекрасные решения будут работать с мультибайтными кодировками?

  9. ГАЙОЗ говорит:

    for($z=$i/2; $z>=0; –$z) $a .= ($a[$z<<1] . $a[($z<<1)-1]);
    чтобы повысить читаемость :)))

    Устроили конкурс на джедайкие приколы :)

    Да все всем понятно :) побитово оно даже красивей выглядит :)
    ЗЫ: Кто знает смысл этого вопроса ? Сколько будет 3 + 6

  10. Сергей Волошин говорит:

    ЗЫ: Кто знает смысл этого вопроса ? Сколько будет 3 + 6

    Это просто такая MAPTCHA

  11. Виктор говорит:

    +1 за вариант $a = ‘hgfedcba’;

  12. Steward говорит:


    $a = 'abcdefghi';
    $l = strlen($a);
    $b = '';
    for($i=0;$i<$l;$i++) {
    $b = $a[$i].$b;
    }
    $a=$b;

    а вот так сильно калично? :)

  13. Щетинин Сергей говорит:

    Много слов ни о чем - 1/5

  14. ameoba32 говорит:


    <?php
    $a = 'abcdefgh';

    # First
    $a1 = strrev($a);

    # Second
    $a2 = $a;
    $len = strlen($a);
    for($i=0;$i<$len/2;$i++) {
    $tmp = $a2[$i];
    $a2[$i] = $a2[$len-$i - 1];
    $a2[$len-$i - 1] = $tmp;
    }

    #Third
    $a3 = join(”",array_reverse(preg_split(”//”,$a,-1,PREG_SPLIT_NO_EMPTY)));

    #Fourth
    $a4 = “”;
    $len = strlen($a);
    for($i=0;$i

    кто больше ?

  15. alexsun говорит:

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

  16. Давид Мзареулян говорит:

    Ну, я не безнадёжен, наверное. Сначала подумал про «половинный» цикл, потом решил, что по сравнению с прямым (2) он всё равно особого выигрыша не даст, а прямой понимать проще.

    Но. До всего этого у меня возник вопрос — в сколькобайтной кодировке у нас строки? Последние несколько лет работаю исключительно с utf-8, а тут в условиях даже намёка нет. Подозрительно. В жизни бы спросил обязательно.

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

  17. Necromant2005 говорит:

    Хм, а спрашивали другое. А вообще люблю интересные задачи на собеседовании, только мало кто пердлагает

  18. Алексей Колупаев говорит:

    А вот и я.

    Отвечаю по порядку:
    > Прикольно, если бы мне такие задачи давали при поступлении на работу
    А какие задают?

    Смотри, зачем минус один: ты делишь количество символов (например, 9) пополам, получаешь 4.5. Условие цикла выполнится для 0, 1, 2, 3, 4, и для значения 4, получается, будешь менять символ [4] (то есть пятый в строке) на символ $l-(i+1), то естть 9-(4+1)=4, то есть на тот же самый.

    >И что, люди, которые не решали эту задачу не получали работу?

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

    > Напишите здесь недостающий код, с наибольшим кол-вом выебонов
    Я еще часто слышу аргумент “я не силен в теории, дайте мне реальную задачу - я ее решу, а вот такое вот непонятно что, программирование ради программирования - это все выебоны. А я - суровый и серьезный практик”. Мое мнение по этому поводу - есть теоретическая подготовка, есть ее применение на практике. Это не взаимозаменяемые категории. Данная задача в большей степени академическая, естественно.

    > echo substr($a, $i) . “\n”;
    Да, вариант с подстрокой тоже интересный, и мне в собеседованиях попадался несколько раз, редко.

    > $a = ‘hgfedcba’;
    5!

    > Строки в php состоят из байтов или символов? Как эти прекрасные решения будут работать с мультибайтными кодировками?
    Я подозреваю, что хреново будут работать.

    > а вот так сильно калично?
    Вполне, вариация решения группы №2

    > кто больше ?
    Кстати, вариант :) Кто сможет придумать больше решений - тот и более крутой программист. Вполне, кстати. Во всяком случае, с фантазией, что немаловажно.

    > а я как раз бы таких джидаев и не брал.
    шлите к нам, может, они как раз те люди, которые нам нужны

  19. 1mdm говорит:

    Я такой вопрос уточнил бы.

    Какая кодировка входящей строки?

    Нужно ли *написать алгоритм* переворачивания?
    Если кодировка однобайтовая, тогда, например, так:
    $b = ”;
    for ($i = strlen($a)-1; $i >= 0; $b .= $a[$i]);
    $a = $b;
    Джедайские техники — только при жесткой необходимости оптимизации, иначе предпочту более читабельный вариант.

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

    А если кодировка мультибайтная (например, UTF-8), тогда без таких библиотек как mb_string не оботись «малой кровью».

  20. 1mdm говорит:

    В моём примере опечочка закралась. Вместо $b .= $a[$i] нужно написать $b .= $a[$i--]

  21. Евгений говорит:

    Автор явно не понял Джоела Спольски. Джедайские варианты действительно на самом деле уменьшают читабельность кода. Джоел принципиально требовал написать код на С, потому что это давало гарантию, что человек понимает, насколько опасны строковые операции (в плане производительности).
    Сам Джоел Спольски писал, что С++ знать надо, но он вам врядли пригодится…

  22. Steward говорит:

    > а вот так сильно калично?
    Вполне, вариация решения группы №2

    вполне калично? :))) и немного пугает то что у вас номерация идёт начиная с пятой группы и вниз - в данном случае №2 - это вторая по-порядку или реальный номер 2 (т.е. минимально адекватное для того, чтобы я рассматривал человека всерьез) ?

  23. Алексей Колупаев говорит:

    У Спольски, понятно, другой оттенок у задачи, но задача тем не менее интересная, и я реально вижу как по-разному ее решают разные программисты. Мне нравится.

    А про читабельность - я вам так скажу, что это приемы и способы написания кода, приняте в команде. Приемы, которые знакомы всей команде называют читабельными и понятными, ведь из все “читают”, понимают. Это фактическии означает, что у более профессиональной команды код будет менее “читабельным”, чем у менее опытной. То есть, его смогут прочитать и понять меньше программистов. А что - это действительно очень нужно, чтобы код могли читать непрофессиональные программисты в больших количествах? Это реально преимущество кода? Это лишь увеличивает количество и снижает средний профессионализм программистов, которые потом смогут работать с этим кодом.

    Я, кстати, тоже считаю, что С/С++ знать надо.

  24. Алексей Колупаев говорит:

    >Steward

    Я имею в виду группу номер 2, приемлемое решение, я считаю.

  25. 1mdm говорит:

    Так как поступаем с программистом из 19-го и 20-го комментариев? :)

  26. Алексей Колупаев говорит:

    >1mdm
    Я тебе в почту написал. Давай беседовать предметно :)

  27. Щетинин Сергей говорит:

    Евгений, вопрос не только в читаемости. Из двух “джедайских” вариант с временной переменной будет быстрее и “займет” под неё аж целый регистр. Писать приведенный код с XOR и в низкоуровневых языка — дебилизм, а в PHP так вообще без комментариев.

  28. Родион Быков говорит:

    $b = $a;
    $a = ”;
    for ($i = strlen($b)-1; $i>=0; $i–) echo $b[$i];

    “В джедаи б я пошел, пусть меня научат!” :))

  29. Скакунов Александр говорит:

    $a = ‘abcdefgh’;
    $a = ‘hgfedcba’;
    echo $a;

    5 баллов :)

    Много слов ни о чем

    А мне понравился пост - и наши реалии описаны, и код есть, и философия, и авторский стиль изложения мне нравится.

  30. Алексей Колупаев говорит:

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

    Джедайские варианты говорят об искушенности ума.

  31. Steward говорит:

    2 Родион Быков
    не очень понятно чем это отличается от уже написанного (причём совсем не джедайского) варианта, и при чём тут echo $b[$i]; - задача не вывести символы строки в обратном порядке.. а перевернуть значение самой переменной.

    Вообще эта переменная $b тут зачем?
    for ($i = strlen($а)-1; $i>=0; $i–) echo $а[$i];
    работает аналогично вашему коду. только делает не то что надо :)

  32. Щетинин Сергей говорит:

    Алексей, а не говорит ли о искушенности ума «что за дурацкая задача, в жизни такого не бывает» или например “цикл, и в нем менять символы местами. давайте лучше общаться по делу”? По-моему тот кого такие детские забавы уже утомили — лучший программист.

  33. Алексей Колупаев говорит:

    Возможно, и так, Евгений. Я поэтому сразу сказал - это мой личный, субъективный подход, наверняка в чем-то слишком субъективный. Но я, тем не менее, в него верю, и поэтому делюсь опытом. Брать ли себе его на вооружение - дело ваше.

  34. Игорь говорит:

    >$a[$i] = $a[$l-$i]^$a[$i];
    >$a[$l-$i] = $a[$l-$i]^$a[$i];
    >$a[$i] = $a[$l-$i]^$a[$i];

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

  35. Родион Быков говорит:

    Steward, где Ваше чувство юмора ? Могу пояснить - единственной целью задачи является вывести перевернутую строку. Мой код это делает :) Переменная b нужна потому что внизу авторской задачи стоит echo $a — если выводить $a[i], выведется hgfedcbaabcdefgh

    Мне этот пост понравился намного больше чем пустопорожние переливания про гномов и шапки.

    Меня что удивило в этой истории: на собеседование в стартап (планка заранее поднята выше обычного) приходят люди, знания которых не доходят и до 2й позиции хитпарада. Правду говорят на западе - “русского программиста” легко отличить по завышенному самомнению.

  36. Алексей Колупаев говорит:

    >что будет если в строке на одинаковых позиция от начала и от конца будут одинаковые символы?
    И что же будет, Игорь? :)

  37. Родион Быков говорит:

    Алексей Колупаев - всякий подход субьективен, Вы набираете человеков себе в команду, в стартап - кроме Вас лично никто не может сказать брать кандидата или нет. Успех не сводится к знанию PHP, и поэтому я “за” такие субъективные методы. Спасибо за интересный опыт.

  38. serge lorich говорит:

    судя по приведенному хит-параду ответов, функцию strrev не угадал никто из претендентов ???

  39. paz0r говорит:

    вот жеж разошлись))))

    Этот, как и многие другие — афигенный пример того, как ловят людей по глазам.
    Первые две секунды после вопроса решают все. просто загляните в глаза собеседуемого.

  40. Серега говорит:

    Интересно, какое решение предлагает сам автор?

  41. Давид Мзареулян говорит:

    А, кстати, мне реально интересно, в какой кодировке будет работать Ваш стартап:)

  42. Алексей Колупаев говорит:

    вероятнее всего, в UTF-8

  43. KARPOLAN говорит:

    Помоему стартап обречен на провал…

    Объяснять не буду, все и так понятно :)

  44. Всеволод Соловьёв говорит:

    На джедайском варианте сломал глаза. Лучший вариант: a = a[::-1] (Python)

  45. Макс Ищенко говорит:

    44: собеседование на питониста ты прошел. Берем. ;)

  46. Раковець Олександр говорит:

    Урра! Я джедай! =)

  47. Vadim Voituk говорит:

    а был в детстве ранен в мозг простотой и легкостью динамических массивов в PHP

    Фраза - жесть! А вообще этого говорит о том, что в университете/школе программировать человек не учился, следовательно недостаток фундаментального образования.

    alexs:

    ($a[$z<<1] . $a[($z<<1)-1])

    Тебя ещё твой тим-лид за такое не пристрелил? Это дело времени.

    alexsun:
    +1

    , и код есть, и философия, и авторский стиль изложения

    … и громкий призыв ПРИЙДИТЕ К НАМ РАБОТАТЬ! МЫ ГА%%НА НЕ ДЕРЖИМ :)

  48. alexs говорит:

    to Vadim Voituk
    как видишь жив :)
    Что тебе не понравилось в этом коде ?

  49. Kostiantyn говорит:

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

  50. Kostiantyn говорит:

    Небольшое уточнение, чтоб исключить кривотолки. “Та” контора никакого отношения к автору поста, Алексею Колупаеву то бишь, не имеет :-)
    А то мало ли кто чего подумает еще…

  51. http://zhaber.blogspot.com/ говорит:

    а как же рекурсия? оно ж как минимум красиво ^-^

  52. TUX говорит:

    самое верное решение.

  53. Алексей Колупаев говорит:

    Рекурсию, увы, никто по своей инициативе не сделал (я иногда ставлю это в условие). А это действительно красивое решение.

  54. Serge S. говорит:

    Откровенно говоря php, C++ и C не одно и то же


    for ($i = 0, $j = strlen($s) - 1; $i < $j; ++$i, --$j) {
    $tmp = $s[i];
    $s[i] = $s[j];
    $s[j] = $tmp;
    }


    for (std::string::iterator i = s.begin(), j = s.end() - 1; i < j; ++i, --j)
    std::swap(*i, *j);


    char* i = s;
    char* j = s;
    while (*j != '')
    j++;
    j--;

    while (i < j) {
    char tmp = *i;
    *i = *j;
    *j = tmp;
    }

  55. SHARK говорит:

    //Джедайи маст дай
    //ИМХО ответ в стиле “в PHP есть\должна быть такая функция reverse, stringreverse и тд” вполне приемлимо для поиска в гугле (если уж и подзабыл такую “часто используемую” функцию :) )

  56. SHARK говорит:

    $a = ‘abcdefgh’;
    $a = strrev($a);
    echo $a;

  57. GAIOZ говорит:

    Блин, ну нефигась… вчера сдесь небыло ниодного коментария, стоило мне что то ляпнуть.. :)
    ОФТОП: Народ, кто подскажет где можна заработать на програмировании через интернет, или вообще для начинающих программистов в Москве к примеру.

  58. random говорит:

    Человек, раненый в мозг курсом функционального программирования (lisp!lisp!) в институте, мог бы решить задачу примерно так:

    function rev($str) {
    return strlen($str) ? array_merge( array(rev(substr($str,1))), array($str[0]) ) : array();
    }

    print join(”,rev(’bla’));

    Вам таких не попадалось ? %)

    Или вот еще странный (джедайский ? :) вариант:
    $ol = $l = strlen($a); while ($l) $a .= $a[--$l]; $a = substr($a,$ol);

    Ну и напоследок: Perl рулит даже когда он всего-лишь “P” в “PCRE” в PHP:

    $a = preg_replace(’/^(.)(.*)?(.)$/’,'$3$2$1′,$a);

  59. random говорит:

    fix: array() вокруг rev(substr…) не нужно

  60. r_a_n_d_0_m говорит:

    а про вывод на рекурсивном возврате никто из джедаев не вспомнил?

  61. r_a_n_d_0_m говорит:

    но ИМХО лучшее решение для PHP это strrev()
    Если напишете более быстрый код - отошлите в Zend, и вам все скажут спасибо

  62. Алексей Колупаев говорит:

    Писать весь код в одну строку - это не истинное джедайство :)
    Регэкспы как подход интересны, но в контексте “еще одного решения”.

  63. Вадим Романько говорит:

    Хотел бы обратить внимание на количество операторов, которое выполняется в цикле. В варианте 2 в цикле расположен один оператор, следовательно, количество операторов, которые выполняются в цикле равно количеству символов в строке. В варианте 1а в цикл выполняется для половины символов строки, но в цикле находится три оператора, следовательно, 3*0.5 = 1.5, количество операторов которые выполняются в цикле в полтора раза больше. Также хочу напомнить, что РНР не полноценный компилятор, как С. Так что, утверждение, что код в решении 1а, эффективней кода в решении 2, можно поставить под сомнение.
    Что касается стиля программирования, то решение 2 несомненно лучше, чем 1а.
    Что касается техники подбора кандидатов для обучения, то техника не плохая, и имеет ряд преимуществ перед тестами.

  64. Алексей Колупаев говорит:

    Я бы сказал, что количество операций интересное приближение, но вообще, я бы не стал так наивно сравнивать создание новой динамической строки и добавление к ней элементов в тремя бинарными операциями, соответствующими одному (!) такту процессора.

  65. javadev говорит:

    Решение на Java совсем не простое )

    import java.util.*;

    public class ReverseString {
    public String reverse(String string) {
    assert string != null;
    Deque stack = new ArrayDeque();
    for (String str : string.split(”")) {
    stack.push(str);
    }
    StringBuffer result = new StringBuffer();
    for (String str : stack) {
    result.append(str);
    }
    return result.toString();
    }
    public static void main(String[] args) {
    String a = “abcdefgh”;
    ReverseString rs = new ReverseString();
    System.out.println(rs.reverse(a));
    }
    }

  66. Vadim Voituk говорит:

    @javadev:
    new StringBuffer('1234567890').reverse()

    бинарными операциями, соответствующими одному (!) такту процессора

    Леша, забудь! В современных языках (тем более интерпретируемых) больше нет операций соответствующих одному такту процессора.
    IMHO мерять сложность оепраций тактами процессора стало неактуально.

    P.S.Первая, которую я таки встречал (Вадим, привет) заключается в том
    Надеюсь это не я такое сморозил?

  67. Алексей Колупаев говорит:

    >В современных языках (тем более интерпретируемых) больше нет операций соответствующих одному такту процессора.
    Да, бытует такое мнение.
    Я с ним полусогласен. В том смыле, что, конечно, это далеко не тоже самое, что и xor ax bx, однако тем не менее мы не используем наследные PDP-шные / С-шные строки с нулем в конце, и не перебираем их, каждый раз увеличивая длину, как в случае со второй строкой. Я даже не поленился и сделал тест - xor работает, как и ожидалось, быстрее.

    > Надеюсь это не я такое сморозил?
    :)

  68. Vadim Voituk говорит:

    Алексей Колупаев: Дык я же не утверждал что способ с поиском подстроки будеь быстрее. Это было к фразе про такты процессора.

  69. Алексей Колупаев говорит:

    Знаешь, я думаю, что PHP будут некоторые “накладные” расходы по адресации переменных, но в итоге, где-то там все равно будет стоять аппаратная команда xor. Ну не эмулируют же они ее, ей-богу.
    то есть, все не так просто, но и не слишком-то сложно.

  70. Bolzamo говорит:

    Чуваки, вы суровы!
    Кроме strrev() вижу адекватным решение только через массивы:

    $a=’asdfgh’;
    $b=str_split($a);
    krsort($b);
    $a=implode($b);

  71. pako говорит:

    мне 11 числа на собеседовании по С/С++ такую же задавали. Написал за минуту без предварительного обдумывания, потом понял свою ошибку и расстроился - я не изобразил напряженную работу моска, они наверняка решили, что видел эту задачу и зазубрил правильный ответ:

    char* strrev(char* s){
    int l=0, r=strlen(s)-1;
    while(l<r){
    char x=s[l];
    s[l]=s[r];
    s[r]=x;
    r–;
    l++;
    }
    return s;
    }

    Вопрос к залу - такие загадки для младших школьников только РНР программистов должны пугать, или я сильно недооцениваю свой уровень?

  72. Евгений говорит:

    pako, им мог не понравится Ваш стиль написания. Я бы написал так:
    for(;l<r;r–,l++)
    {
    char x=s[l];
    s[l]=s[r];
    s[r]=x;
    }
    Потому что в случае усложнения задачи, Вы можете незадумываясь вставить внутрь цикла continue. В Вашем же случае, необхдимо проверить, не получители Вы бесконечный цикл.
    Все это конечно мелочи, но они должны выскакивать на автомате и тогда программист огородит себя от большинства ошибок, а следовательно подымет свою производительность.
    Однако, хочу заметить, что стиль программирования - вещч субъективная и в одной команде тим лидер требует один стиль, в другой будет требовать такой как у Вас.
    Кстати, если бы Вы таки понапрягали свой моск, то могли бы оптимизировать свой алгоритм, уменьшив кво переменных на одну. Правда, я в этом не вижу смысла, так как в современном программировании преждевременная оптимизация не приветствуется.

  73. Евгений говорит:

    Ещё, хочу добавить поводу оценки производительности: С++ отличает от РНР тем что в нем более точно регламентировано способ хранения данных. Это с одной стороны дает большую свободу разработчикам РНР. С другой стороны, если разработчики изменят способ хранения или обработки строк, то алгоритм работающий эффективно на РНР4 может начать работать медленее на РНР5…

  74. pako говорит:

    ИМХО пижонство это - в такой задаче думать о супер-стиле или супер-оптимизации.
    Какие последствия того, что ты не учел возможные доп. требования? Придется при их появлении в худшем случае переписать с нуля всю функцию - а это аж целых 5-7строчек, которые заняли у тебя 2 минуты.
    Не надо путать одну функцию с диаграммой классов, которая лечится неделей рефакторинга или рестартом проекта:)
    Примерно то же и с оптимизацией.
    Думаю что статья вовсе не о том, что успешный кандидат должен в ответ на вопрос “напишите нам хелловорлд на жаве” нарисовать на бумажке тех.задание, календарный план разработки, UML-диаграммаму, юниттесты, код, описать протоколирование ошибок, администрирование доступа к приложению и т.п.

  75. Евгений говорит:

    Я не говорил о том что в “в такой задаче думать о супер-стиле или супер-оптимизации”. Я говорил, что хороший стиль должен вылетать с под пера автора на автомате.
    Может случится так что ты сначало напишешь маленькую функцию, а потом в следствие изменившихся требований она вырастет в очень большую и если придерживаться хорошего стиля изначально, то можно избежать мноих ошибок, а следовательно и увеличить производительность.
    Джоел Спольски писал, что программист подобен жанглеру с туевой хучей шариков. Только программист жонглирует не шариками, а мелкими деталями в краткосрочной памяти. Использование хорошего стиля уменьшает количество этих деталей, а значит и меньше вероятность, что какой-нибудь шар останется незамеченным и он упадет.
    Однако опять повторюсь, что хороший стиль - вещь субъективная и я не претендую на эталон хорошего стиля.

    Если бы кандидат начал писать “тех.задание, календарный план разработки, UML-диаграммаму, юниттесты, код, описать протоколирование ошибок, администрирование доступа к приложению и т.п.”, я бы его взял незадумываясь, потому что как раз это обычно некому делать.
    А тебя я бы не взял, потому что ты не принимаешь критику. В комманде это может стать ступором.

  76. Blabla говорит:

    хм .. а Паша и Веталик отказываються проводить собеседования?))

  77. Станислав Малкин говорит:

    Отвечал бы через strrev. Ну а если бы уже нужно было написать свою реализацию - то писал бы через цикл.

    Но в целом - по одной этой задаче еще мало чего можно судить. Алексей, давайте еще задачи в студию из своего арсенала, посмотрим и на них.

  78. Алексей Колупаев говорит:

    Помилуйте, господа, а что же я буду задавать на собеседовании? :)
    Их не так-то легко генерировать, как может показаться.

  79. pako говорит:

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

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

  80. Евгений говорит:

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

    “Помилуйте, господа, а что же я буду задавать на собеседовании?” А вы не оглашайте здесь свою реакцию на посты и тогда кандидатам тяжело будет играть из себя хорошего. :-)

  81. Jeka говорит:

    Гыы
    ну чем не вариант :)

    $a = ‘abcdefgh’;
    $b = str_split($a);
    $a=”;
    while($z = array_pop($b))
    {
    $a .=$z;
    }

    echo $a;

  82. Raider говорит:

    Задача в исходном виде слишком простая. В задаче нужно повышать уровни сложности:
    1 уровень. хоть как-нибудь перевернуть строку
    2. перевернуть строку, которая занимает всю оперативную память
    3. перевернуть как можно быстрее на многопроцессорной системе
    4. перевернуть в файле на диске, файл в память не влезает, memory mapping-а нету.
    5. файлы - в utf8
    6. как можно меньше использовать CPU, выполнять основную работу на GPU
    ;)

  83. n_surgeon говорит:

    думаю найбільш ефективним рішенням буде внутрішня ф-ція, а ті всі хитрості будуть повільними - інтерпретатор всетаки :))

  84. Игорь говорит:

    Ну а это чем не вариант :)

    $len = strlen($str)-1;
    for ($i = 0; $i < $len/2; ++$i) {
    list($str[$i], $str[$len-$i]) = array($str[$len-$i], $str[$i]);
    }

    ну или это :)

    function rev ($str, $len) {
    if ($len == 0) return $str;
    $len–;
    return $str[$len].rev(substr($str,0, $len), $len);
    }

  85. Андрей говорит:

    strrev нашел за 5 сек в гугле, и чего вы добиваетесь вот этими заморочками, неужели думаете, что напишите что то лучше чем функцию из стандартной библиотеки?

  86. Olexiy говорит:

    2 Андрей
    Ти не пройшов :) Люди перевіряють, чи кандидат в змозі написати два рядки тривіального коду без помилок. Цей тест відсіює набагато більший відсоток кандидатів, ніж здається на перший погляд.

  87. Алексей Колупаев говорит:

    Представьте на секунду, что вы не программист (если вы программист), а сами проводите собеседование с программистом. Взгляните на собеседование с другой стороны. Самое главное, что надо понять - подходит ли вам этот человек. Не гениален ли он, не знает ли он PHP, не сколько у него лет опыта, хотя все это и интересно. А только - подходит ли ОН ВАМ. Лично он лично вам.
    Поскольку мне с этим человеком, возможно, вместе делать проект, мне хочется понять: как он относится к разработке, к инструментам, к своей роли в проекте, как решает задачи, какими абстрактными категориями оперирует. И самое главное - совпадает ли это с моим видением идеальной команды. Сможем ли мы тянуть в одном направлении. Заметьте, в первую очередь - в одном направлении.
    Нет объективных критериев оценки. Поэтому мне на самом деле вообще не важно, как повернуть строку задом наперед. Но мне интересно, как человек делает то, что мне хотелось бы чтобы он делал в моей команде: эффективно решал проблемы сообща. Вот тут все четыре слова важны: эффективно, решал, проблемы, сообща.

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

  88. Mamay говорит:

    автору низачёт за побитовые операции
    низя работать со строками побитово в мультибайте
    а так прикольная статейка

  89. megamujik говорит:

    15:08:59 XXX
    http://www.developers.org.ua/archives/kolupaev/2008/06/12/startup-interview/

    15:10:57 YYY
    я видел
    ты предлагаешь асилить каменты?

    15:11:13 XXX
    хз, я сам не асилил

    15:11:23 YYY
    решил на мне проверить?

    15:11:24 XXX
    потому что не увидел там ничего умного
    если бы в первых 10 каментах автору сказали, что он идиот, то был бы смысл читать
    а комментаторы такие же. видимо считают круто для экономии одного байта делать 3 шаманских XOR’а

    15:13:25 YYY
    ага, типа нестандартно мыслишь

    15:13:56 ХХХ
    “нестандартно” - это выражаясь политкоректно.
    как на западе инвалидов называют- человек с нестандартными потребностями.
    вот так и эти программисты.

    15:17:36 ХХХ

    On modern (desktop) CPUs, the XOR technique is considerably slower than using a temporary variable to do swapping. One reason is that modern CPUs strive to execute commands in parallel; see Instruction pipeline . In the XOR technique, the inputs to each operation depend on the results of the previous operation, so they must be executed in strictly sequential order.

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

  90. Саня говорит:

    Без буфера можно еще так менять значения

    a = a - b
    b = a + b
    a = b - a

  91. Denis Mazourick говорит:

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

  92. илья говорит:

    $a = ‘hgfedcba’;

    Более короткое решение. И вполне отвечает условию поставленной задачи.

  93. Steward говорит:

    2 92.илья - очень умнО… просто уписяться… любой нормальный понимает что исходная строка может быть произвольного вида…

    Не понимаю смысла вообще в вашем комментарии - блеснуть?
    Да вы блеснули - только боюсь в стартап вас не возьмут.

    Удачи.

  94. Анонимно говорит:

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

  95. aRt говорит:

    сор..забыл нико поставить..))

  96. Васья говорит:

    наверное не джедай :-\ сходу в голову пришло:
    $a = ‘abcdefgh’;
    $b = ”;
    foreach(str_split($a) as $c) {
    $b = $c . $b;
    }
    echo $b;

    или, если не забывать что длина строки всегда на 1 меньше самого старшего индекса :)
    foreach(range(strlen($a)-1, 0) as $i) {
    $b .= $a[$i];
    }
    echo $b;

    джедаизм :)
    echo join(array_reverse(explode(’ ‘, chunk_split($a, 1, ‘ ‘))));

    еще один:
    array_walk(str_split($a), create_function(’$c’,'global $b; $b = $c . $b;’));
    echo $b;
    (недостатки очевидны)

  97. Илья (другой, не тот) говорит:

    2 93: Steward, разве ответ Ильи не гениальный? супер ИМХО

  98. aRt говорит:

    сколько людей хотят на работу )))))

  99. Станислав Малкин говорит:

    aRt, по-моему не на работу хотят, а “повыпендриться” и “покичиться”.

  100. aRt говорит:

    Станислав Малкин, ну а как же без этого ? ))) надо ж бляснуть ))

  101. Васья говорит:

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

  102. Sniff говорит:

    Ну, Васья, тут есть два аспекта. Первый - твой код на флешке (твой ли?) - это результат. А мне интересен процесс. Как кандидат решает задачу. Готовый код и я на сурсфордже могу скачать, что за интерес? Второй - нам же не нужно, чтобы ты писал код. Нам интересно, чтобы ты создавал проект, в команде с нами. Есть разница?

  103. Щетинин Сергей говорит:

    Код из предыдущих проектов интереснее потому что ближе к тому что получится в рабочей обстановке при реальных задачах. Решение под присмотром, на бумажке, да еще и задачи высосанной из пальца может только показать что человек вообще не понимает о чем речь, для фильтрации хорошо, но решенная задача не говорит ни о чем. В готовом коде можно увидеть есть ли документация, нормальные ли API, думает ли человек о том куда бы всунуть XOR или о том чтобы код работал корректно итд. Даже если код подсунут чужой можно сделать выводы о том какой код этот товарищ считает эталоном, хотя если есть подозрения, то зачем вообще собеседование продолжать?

  104. Sniff говорит:

    решенная-то задача, может, и не говорит ни о чем. А вот нерешенная - говорит :)

  105. Jos говорит:

    Нормальная задача, как для собеседования, только сильно простая, ИМхО. Отсеивает только самых тупых.
    А что до таких понтовых, которые “не решают задачи на собеседованиях” и “ходют с флешками”, то у меня б они и дальше пошли со своими флешками. Если я прошу человека сделать элементарную вещь, а он начинает сразу пальцы гнуть про то, что он “лоховские задачи” не решает, то я не вижу как я с этим человеком буду дальше работать.
    Что до ксоров или не ксоров, то автор вроде как сказал, что он оба варианта рассматривает как правильные и смотрит затем по другим задачам. Так что идиот не автор, а кое-кто другой. К сожалению, я не пхпшник, да и деньги мне сейчас приблизительно поровну нужны со свободным временем (очень много других увлечений), так что в стартапы к вам не пойду. :) Но вообще, всяческих успехов вам, ребята! Даёшь второй Гугль! :)

  106. Щетинин Сергей говорит:

    Всегда интересно видеть как даже из комментария к статье делают рассказ о себе любимом. бгг

  107. Anton говорит:

    Алексей Колупаев.
    Задача на самом деле бредовая. Я не знаю пхп и никогда на нем не писал, но если там есть стандартная функция, то ваша задача автоматом превращается в разряд маразма. Я бы у вас не работал. Попробуйте задать чтонить пооригинальнее.
    Если вы считаете что программист должен беспрекословно(не задумываясь) выполнять задачу, которую ему ставит какойто манагер, а не подумав, выяснить - может задача уже решена?.. То мне вас жалко. Вы ищите быдлокодеров, а не программистов. Программисты думают, а быдлокодеры пишут то, что им скажут.
    ЗЫ Моя девушка к вам ходила на собеседование, и хорошо что не устроилась на работу к вам…

  108. Sniff говорит:

    :)

  109. Vasilij говорит:

    Кстати почему-то не увидел варианта с использованием ob_start и ob_get_contents которым собрать результат echo в цикле. А кстати почем 3+6….

  110. Vic говорит:

    Излишне простая задачка.
    Задавай что-нибуть посложнее

  111. AdVv говорит:

    Не хочется обижать автора - но “Ваш вариант” дико некорректен. Я не знаю ПХП и не программировал со средней школы, но

    И боюсь для человека подбирающего сотрудников неумение ставить задачу правильно - проблема.

  112. Sniff говорит:

    Не хочется обижать комментаторов.

  113. Andrey говорит:

    зацепила эта тема. решил попробывать различные варианты. вы уж извините, за мой кривой C#

    
    using System;
    using System.Text;
    using System.Collections;
    using System.Collections.Generic;
    
    namespace ReverseString
    {
        class Program
        {
            class TestRev
            {
                private string m_str;
                public TestRev(string str)
                {
                    m_str = str;
                }
    
                public string RevStr0()
                {
                    char[] ch;
                    Array.Reverse(ch = m_str.ToCharArray());
                    return new string(ch);
                }
    
                public string RevStr1()
                {
                    string str = null;
                    for (int i = m_str.Length - 1; i >= 0; i--)
                        str += m_str[i];
                    return str;
                }
    
                public string RevStr2()
                {
                    StringBuilder str = new StringBuilder();
                    str.Append(m_str);
                    char ch;
                    int l = str.Length;
                    for (int i = 0; i < l / 2; i++)
                    {
                        ch = str[i];
                        str[i] = str[l - i - 1];
                        str[l - i - 1] = ch;
                    }
                    return str.ToString();
                }
    
                public string RevStr3()
                {
                    StringBuilder str = new StringBuilder();
                    str.Append(m_str);
                    int l = str.Length;
                    for (int i = 0; i < l / 2; i++)
                    {
                        str[l - i - 1] = (char)((byte)str[i] + (byte)str[l - i - 1]);
                        str[i] = (char)((byte)str[l - i - 1] - (byte)str[i]);
                        str[l - i - 1] = (char)((byte)str[l - i - 1] - (byte)str[i]);
                    }
                    return str.ToString();
                }
    
                public string RevStr4()
                {
                    StringBuilder str = new StringBuilder();
                    str.Append(m_str);
                    char tmp;
                    for (int i = 0, j = str.Length - 1; i < j; ++i, --j)
                    {
                        tmp = str[i];
                        str[i] = str[j];
                        str[j] = tmp;
                    }
                    return str.ToString();
                }
    
                unsafe public string RevStr5()
                {
                    StringBuilder str = new StringBuilder();
                    str.Append(m_str);
                    int l = str.Length;
    
                    for (int i = 0; i < l / 2; i++)
                    {
                        str[i] = (char)((byte)str[i] ^ (byte)str[l - i - 1]);
                        str[l - i - 1] = (char)((byte)str[i] ^ (byte)str[l - i - 1]);
                        str[i] = (char)((byte)str[i] ^ (byte)str[l - i - 1]);
                    }
                    return str.ToString();
                }
    
            }
            static void Main(string[] args)
            {
                DateTime time1, time2;
                //string str = "abcdefg";
                char[] ch = new char[100000];
                string str = new string(ch);
                TestRev test = new TestRev(str);
    
                //-----------------------------------------------------
                time1 = DateTime.Now;
                for (int i = 0; i < 1000; i++)
                    test.RevStr0();//0.9 sec
                time2 = DateTime.Now;
                Console.WriteLine("RevStr0 = {0}", time2 - time1);
                //-----------------------------------------------------
    
                /*time1 = DateTime.Now;//ну уж очень долгий способ...
                test.RevStr1();//20 sec
                time2 = DateTime.Now;
                Console.WriteLine("RevStr1 = {0}", time2 - time1);*/
    
                time1 = DateTime.Now;
                for (int i = 0; i < 1000; i++)
                    test.RevStr2();//3.76 sec
                time2 = DateTime.Now;
                Console.WriteLine("RevStr2 = {0}", time2 - time1);
    
                time1 = DateTime.Now;
                for (int i = 0; i < 1000; i++)
                    test.RevStr3();//6.5 sec
                time2 = DateTime.Now;
                Console.WriteLine("RevStr3 = {0}", time2 - time1);
    
                time1 = DateTime.Now;
                for (int i = 0; i < 1000; i++)
                    test.RevStr4();//3.65 sec
                time2 = DateTime.Now;
                Console.WriteLine("RevStr4 = {0}    ", time2 - time1);
    
                time1 = DateTime.Now;
                for (int i = 0; i < 1000; i++)
                    test.RevStr5();
                time2 = DateTime.Now;
                Console.WriteLine("RevStr5 = {0}", time2 - time1);//5.85
            }
        }
    }

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

  114. Алексей Колупаев говорит:

    А какой способ “стандартный”?

  115. Andrey говорит:

    походу если бы я такое на собеседовании по C# меня наверное бы не взяли… методы RevStr3() и public string RevStr5() эт я загнул… такое количество упаковок и распаковок это я зря. признаю не прав. если к примеру переписать так

    unsafe public string RevStr5()
                {
                    /*StringBuilder str = new StringBuilder();
                    str.Append(m_str);*/
                    char[] str;
                    str = m_str.ToCharArray();
                    int l = str.Length;
    
                    for (int i = 0; i < l / 2; i++)
                    {
                        str[i] = (char)(str[i] ^ str[l - i - 1]);
                        str[l - i - 1] = (char)(str[i] ^ str[l - i - 1]);
                        str[i] = (char)(str[i] ^ str[l - i - 1]);
                    }
                    return new string(str);
                }

    то по скорости сопоставим с тем методом, который в стандартной библиотеке

  116. Andrey говорит:

    и StringBuilder медленный. массив чаров гораздо быстрее

  117. Алексей Колупаев говорит:

    Ну правильно, хорошая джедайская техника. Зачот.

  118. Щетинин Сергей говорит:

    После комментария №44 писать на C# как-то…

    >>> import timeit
    >>> t = timeit.Timer('a[::-1]', 'a=" "*100000')
    >>> t.timeit(1000)
    0.23030971813456791

    Шарп еще и тормозней в несколько раз. Красота.

  119. Щетинин Сергей говорит:

    WP кавычки расставляет просто феерически. Еще и переносы строк размножились.

  120. Diordienko Mykhail говорит:
    <?php
    $a = "abcdefg";
    function aRevert($str, $i)
    {
        if ($str{$i}) {
            aRevert($str, $i+1);
            echo $str{$i};
        }
    }
    aRevert($a, 0);
    

    А как Вам такой вариант? Вроде такого не было.

  121. Алексей Колупаев говорит: