Pull to refresh

Comments 84

Вот не понимаю я этой любви к всяким "хитрым" задачкам.
В 1, я бы сказал, что gmp/bcmath — единственно верное решение. Но проще было бы просто спросить работал ли человек с большими числами.
Во 2, ну ок… Надеюсь, никогда такого писать не придется в реальной работе.
3 — да, что-то уже близкое к жизни.

В 1 я бы написал что-то вроде


if (function_exists('bcadd')) {
    return bcadd($a, $b);
} else if (function_exists('gmp_add')) {
    return gmp_strval(gmp_add($a, $b));
} else {
    return my_bigint_sum($a, $b);
}

2 — что-то подобное в смысле "конечный автомат со стеком" писать приходится нередко

Но проще было бы просто спросить работал ли человек с большими числами.

Это не совсем то, что мы хотим проверить. Для нас работал ли человек с большими числами или нет — не так важно. Важно, сможет ли он сориентироваться, если работать придётся.


Во 2, ну ок… Надеюсь, никогда такого писать не придется в реальной работе.

Зависит от конкретной области.
Например, некоторые могут не знать о существовании pcntl_fork() в PHP и успешно решать большие крутые задачи, некоторым fork может быть жизненно необходим в повседневной работе.

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

Это если знаешь, что гуглить. Часто люди пытаются решить её регэкспами с печальным результатом.

Да можно и регулярками PCRE-шными.


/^(\((?1)*\)|\[(?1)*\]|{(?1)*})(?1)*$/

Другое дело, что с pcre-рекурсией наверняка похуже O(N) будет.

10^9 это не большое число.
Нужны не задроты библиотек, а шарящие в решении задач. Библиотеку можно вызубрить за неделю. А мозг — нет.

а вот если ко второй задаче добавить еще и между скобками текст и причем еще добавить escape charter чтобы можно было писать (\{) и это было сбалансированно, то задачку мы усложним и тут уже можно ее решение к автоматам сводить, но только зачем это в пхп ?


и еще почему во второй задаче цикл написан будто бы задачи решали программисты С


 for($i = 0; $i < strlen($str); $i++) 

Может быть заменено на


foreach ($str as $char)
Ну как минимум нужно сделать так
$str = '12345678';
$strSplitted = str_split($str);
foreach ($strSplitted as $char) {}

а потом уже foreach.

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

Ну тоже вопрос :) в for() длина строки каждый раз считаться будет.

Переходите на современные версии PHP, у нас есть плюшки!

"Считаться" — слишком громко сказано. Это же не сишный null-terminated с O(N), длина строки в PHP — O(1).


(Дикий случай с mbstring overload я, конечно, не рассматриваю).

Чтобы не считалась на каждой итерации, можно так делать:
for($i = 0, $length = strlen($str); $i < $length; $i++) 

Тогда функция strlen() будет вызвана только один раз.

Можно, только в PHP смысла в этом не особо много. Оба варианта условия выхода из цикла — O(1). В вашем варианте единичка, правда, поменьше будет немножко :-) но все равно это бессмысленная микрооптимизация.

Интереса ради проверил на строке в миллион символов. Средние результаты 0.29 сек и 2.51 сек — видимо микрооптимизация не совсем бессмысленная.

Ну я и говорю — единички разные. O(1) still sucks for large values of 1, %username%. :-)


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

Так же, как и вариант с постраничным скачиванием страниц:


  • если алгоритм достаточно объяснён и даны обоснованные расчёты, то максимально
  • если в задаче просто написано "скачаю дамп", то это плохое объяснение

Под "достаточно объяснён" я подразумеваю, что, например, в случае с дампом отсюда https://dumps.wikimedia.org/enwiki/latest/ ещё требуется пояснение, как из XML-файла с разметкой в Wiki-формате будут воссозданы исходные страницы в HTML-разметке, какие мы видим на сайте Википедии.

А меня, как википедиста, другое улыбнуло: автор предлагает «узнать число всех страниц английского раздела». Страница Википедии и статья Википедии — это не одно и то же! Страниц в английской вике сейчас 43 975 482. Подробнее см. en.wikipedia.org/wiki/Special:Statistics.

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

Не переживайте! Если кто-то написал 43 975 482 млн, он так же мог получить максимальный балл.
Само число для решения не играет никакой роли, как я писал выше: важно то, как будет объяснён порядок действий и необходимое время.


Зануда mode

Хоть это и не играет никакой роли, справедливости ради, изначально в задании подразумевались именно статьи(Content pages из вашей ссылки), которых сейчас 5.5 млн. Оригинальный текст из задания: "download English version of Wikipedia (only pages with articles)"

Решил попробовать тест для интереса, оставил фейк данные, кроме email.
В итоге прорешал все задачи, стесняюсь спросить, ничего страшного что только email реальный? =)

В таком случае мы свяжемся с вами по email.
Для надёжности можете скинуть мне в Хабрапочту недостающие данные, по телефону всё же оперативнее.

Первую и вторую задачу решал еще на Codewars пару лет назад. Причем в те времена не думал, что это может быть полезным для получения работы, но уже во второй раз вижу, как кто-то их использует. Возможно стоит дорешать остальные :)
Зарегистрировался и сразу время пошло…
Как только получили ТЗ время пошло )
Наверное, я как многие, зашел посмотреть и потом понял, что пошло время(
Ответил на первых три вопроса и приходится уезжать(
Я только на один успел ответить :) 5 минут было) Думал зарегистрируюсь, а потом посмотрю :)

Если не хватило пару минут на последнюю задачу, то никто и не напишет? Нужно было решить все?

Сейчас пока рано об этом говорить.
Возможно вы хорошо решили остальное и по сумме баллов окажетесь в списке лучших.


Напишем что-то в любом случае, даже если это "отказ".

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

Пришлите, пожалуйста, в личку E-Mail, с которым вы проходили тест, проверим.

А я вообще не понимаю, почему я должен решать эти тесты при приёме на работу? Это хитрый ход работодателей за дёшево получить решение своих проблем. Вкладываться не хотят или что? Первые две задачи типовые. Решения есть. Третья задача по оценке производительности и пропускной способности сети действительно нетривиальная. Здесь всё зависит от личных предпочтений. Можно взять первое попавшееся решение, и пусть задача молотится, к примеру три дня. А можно начать поиск оптимизационного метода, отлаживать его, тратить на это время. Пусть задача после этого вычисляется за два часа, но время потраченное на это, тоже денег стоит. И работодатель не всегда готов платить за это. Так что…
Тут вообще вспоминаются и довольно курьёзные и смешные случаи, когда народ возится, находит оптимальное решение, когда задача решается мгновенно или достаточно быстро. Но начальству нужны солидные временные затраты. Так ребятам пришлось в основном цикле вычислений выполнять временные задержки. Тогда боссы уходили с проверки с чувством «глубокого удовлетворения». Вот так.
Кстати, последние, скандальные новости про какие-то версии iPhone, где производительность аппаратов специально занижалась, как раз из этой серии
Это хитрый ход работодателей за дёшево отсеять тех, кто вообще не понимает, почему он должен решать эти тесты при приёме на работу.
Насколько я понял, когда регистрировался здесь, что тут площадка для освещения технических, технологических проблем. А тут который раз пишут, как они хорошо отсеивают народ. Причём не стесняясь пишут, что двести претендентов отсекли или даже больше. Я лично уже давно не участвую в этих тестах. Работодатель зачастую действует просто. Задают к примеру вопрос, знаешь ли ты какой-то там интерфейс в какой-то библиотеке (которых зачастую сотни). Не знаешь — всё, ты нам не подходишь! Т.е. вопрос не ставится, сможешь ли ты решить задачу и сколько времени тебе потребуется. Всё ставится с ног на голову!
Работодатель зачастую действует просто. Задают к примеру вопрос, знаешь ли ты какой-то там интерфейс в какой-то библиотеке (которых зачастую сотни). Не знаешь — всё, ты нам не подходишь! Т.е. вопрос не ставится, сможешь ли ты решить задачу и сколько времени тебе потребуется. Всё ставится с ног на голову!

Если с вами так поступил работодатель — приходите к нам. :) У нас противоположные ценности: мы впервую очередь обращаем внимание на способность адекватно мыслить, а не на специфические теоретические знания.


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

Технический разбор технических задач — разве это не техническое?

Спасибо за предложение. Но я сам по себе. Не люблю, когда вокруг меня бегают счетоводы и оценивают тебя штангенциркулем. Мне больших заграничных зарплат не нужно. Со своими заказчиками я сам разберусь. ;-)
Расскажите пожалуйста, как оценивать кандидатов не давая им решать задачи?
В трех местах мне давали сделать какие-то элементы сайта или даже несколько полноценных разделов. Это как бы не совсем задачки на время. Зато ты делаешь реальный функционал, который понадобится пилить на работе потом.

Эти три задания — это полный набор фильтров кандидатов или это толко нулевой этап "проверки на адекватность"?

Смотря что вы подразумеваете под "нулевым этапом проверки на адекватность".
Это 3 задания из онлайн-теста. Всего в онлайн-тесте их было 6.


Те, кто успешно прошёл тест, попадали на очное интервью, на котором так же были разнообразные задачи и вопросы.

О, а почему @fisher-овский тест (http://php.feedme.ru/) не используете? Он, как по мне, явно намного более адекватен вашим требованиям, чем очень простые задачки из пп.1,2 (хотя третья нормальная). Или его уже никто пройти не может? :-)

Те, кто его круто прошёл, уже были на наших интервью. Но сам тест никто особо не пиарит, потому потока кандидатов с него нет и, как мне кажется, никогда и не было.

Те, кто его круто прошёл, уже были на наших интервью.

А, ну хорошо если так. Я как-то раз в топе помимо основного ника засветился левым именем (просто так, смотрел новые вопросы), и никакого фидбэка не было. Уж не знаю, ваш косяк это был, или просто меня спалили. :-)

Скажу наверно ересь, за которую меня закидают тапками. Но когда я вижу подобные задачки, то понимаю, коллектив состоит из вчерашних студентов, для которых не существует другого паттерна проверки кандидатов кроме как по школьновузовскому принципу. Т.е. решить их удачно, в рамках ограниченного времени, может только сам бывший студент. Сейчас бы еще бухгалтеров теоремы спрашивать при приеме. Сам работал около 6 лет на крупную соцсеть, распределенная система (около 100 серверов) — мне задали ровно один вопрос, очень похожий на 3-ий только про нагрузку системы. По поводу других задачек — решение в принципе понятное чисто алгоритмически, но вот некоторые функции, я за 8 лет в пхп ни разу не видел.
но вот некоторые функции, я за 8 лет в пхп ни разу не видел

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

strrev — что-то ни разу не пригодилась (пришлось гуглить), как и rtrim, хотя trim часто. intval как то попадалось Касательно фидбека, хорошо когда задание позволяет увидеть логику кандидата, а не энциклопедические знания фунций. И если не изменяет маразм, в универе, вроде давали задание на сложение больших чисел, правда на С++.

Не проблема!
Можно было, например, прислать такое решение без strrev(), rtrim() и intval(). Мы бы его оценили максимальным баллом.
Для нас всё именно так, как вы говорите: в первую очередь важно умение решать задачи, а не энциклопедические знания.


Решение
function sum_str($str)
{
    list($s1, $s2) = explode(' ', $str); 
    $l1 = strlen($s1);
    $l2 = strlen($s2);

    $result = "";
    $rest = 0;

    for($i = 1; $i <= max($l1, $l2); $i++) {
        $d1 = $s1[$l1 - $i] ?? 0;
        $d2 = $s2[$l2 - $i] ?? 0;

        $sum = $d1 + $d2 + $rest;
        $rest = $sum > 9 ? 1 : 0;

        $result = ($sum % 10) . $result;
    }

    if ($rest > 0) {
        $result = $rest . $result;
    }

    return $result;
}
Поддерживаю, коллега. Вообще публикация шуму наделала. Народ зацепили своими подходами поизголяться.

А можно ли так просто делить задержки на 1000 — что с производительностью самой Википедии?

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

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

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

Мне не нужно. :-)


А градации — вещь относительная. Обычное дело — в одном месте ты сеньор, а в другом на джуниора еле тянешь.


Мне самому привычнее мыслить почасовой ставкой.

Всегда считал, что программирование это прежде всего мыслительный процесс

Не нужно ничего считать. Покажите ваши проекты. Не намыслили еще? Очень жаль, мы вам перезвоним.

Разместите вакансию, может и покажу. А может и нет. Уж больно вы агрессивны и заносчивы.
Не только вы выбираете, но и вас выбирают. Не забывайте об этом.

Фикс. Перепутал темы. Прошу извинения.

haskell
  1. Prelude> sum . map read $ words 
  2.  go [] string where
      go [] [] = True
      go acc (x:xs)
        | x elem "([{" = go (x:acc) xs
        | x elem ")]}" && not (null acc) && head acc == x = go (tail acc) xs
        | otherwise = False 
  3. Database_download


Это задачи на 3-4 часа. С учетом того, что вы их видите впервые.
Лидер мирового рынка по виртуализации и автор самой популярной в мире виртуальной машины — Parallels. Они на собеседовании специально уточняют видел ли кандидат ту или иную задачу раньше. Им важно проверит ькак работает мозг, а не зубрежка.

Мы в Баду, кстати, тоже так делаем. Это, правда, не отменяет того факта что после простых задач мы обычно спрашиваем задачи на посложнее, в обсуждении которых можно подчас сильно отойти от темы и даже если кандидат её уже решал, обсуждал или видел решение в интернете, это не гарантирует 100% успех.

А можно на Perl решить задачи?
И вообще, реально ли опытному перловику получить оффер?

На Perl проходить тест, к сожалению, нельзя.
В новом тесте на написание PHP-кода всего 2 задачи. Если вы пишете на PHP хотя бы на базовом уровне и имеете хороший опыт с Perl, то у вас есть все шансы. Каких-то сильно специфичных для PHP вещей мы не спрашиваем в тесте.

Ой! А я увидел в дропдауне с выбором языка Python, и засабмитил код как раз на нём. Это была фатальная ошибка? (Если да, то в будущих тестах вам стоит убрать возможность выбрать «запрещённые» языки.)

Это было сделано намеренно: мы решили оставить "близкие" к PHP языки, чтобы была возможность для прохождения тем, кто программирует на чём-то другом, но готов перейти на PHP.
На каком-то этапе Perl выпал из поля зрения, сейчас уже сложно сказать почему.


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

Мне одному кажется, что эти задачи легко гуглятся, а 90% php разработчиков занимаются совершенно другим?
Описание вопроса про анаграммы очень плохое (ИМХО). я и так эту задачу крутил и сяк, пока не понял, что надо было делать (и то не факт). Пока крутил время кончилось) описательную задачу даже посмотреть не успел)
UFO just landed and posted this here
Неудобно, что нельзя переключаться с одной задачи на другую в ходе решения. В итоге на последнюю (простой sql-запрос) просто не осталось времени.
Можно было бы переключаться, проще было бы пробежаться, сразу написать решения для простых, и сосредоточиться на чуть более сложных. А так, увы. Жалко немного.
Вообще-то можно, слева по кружочкам можно было щелкать.

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

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


Если там один набор задач на всех — это fail.

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

А смысл так делать, дальше же будет очный этап.

Кстати, в PHP 7.1 добавили поддержку отрицательных индексов в строках. Из-за этого пример кода первой задачи работает неправильно в этом месте:
$d1 = $s1[$l1 - $i] ?? 0;
$d2 = $s2[$l2 - $i] ?? 0;

Условие всегда будет выполняться. Нужно добавить проверку отрицательных индексов. Например так:
$o1 = $l1 - $i;
$d1 = $o1 >= 0 && $s1[$o1] ? $s1[$o1] : 0;
$o2 = $l2 - $i;
$d2 = $o2 >= 0 && $s2[$o2] ? $s2[$o2] : 0;

Задачи конечно простые очень, от этого вдвойне жаль что не хватило времени на оптимальные решения (т.е. все 4 задачи тесты проходят, но решения самые не оптимальные).
Описательная задача интересная, но на описание всех проблем и продумывание решений времени не оставалось.
Поэтому совет тем кто давно в таком режиме ничего не решал: набейте руку на hackerrank сначала немного, чтобы привыкнуть и потом не паниковать в условиях нехватки времени. Тогда 4 задачи с тестами решите быстро и останется достаточно времени на обдумывание описательной задачи.
А для слоупоков вроде меня можно выложить где вопросы? Просто почитать интереса ради.

Пока нет, но возможно мы передумаем в будущем.
Можно, например, просто порешать задания с hackerrank — у нас часть была из стандартного пула.

Добрый день. Скажите, когда будут оглашены результаты теста?

В связи с большим количеством участников, процесс затянулся, не успеваем всем дать ответ. Вынуждены взять ещё несколько дней.
Планируем закончить до середины следующей недели: 7-8 февраля.

Спасибо товарищам из баду за прекрасный евент!
Не вдаваясь в бытовые подробности (логистика, питание), скажу что все было на хорошем уровне. Впечатления от общения с работниками и ребятами которые проводили собеседования исключительно положительные. В общем, хоть и прошел все круги но оффер не получил (а второе место, как известно, самое обидное) о проделанном пути не жалею, было здорово! Вспоминая негативные комменты о собеседованиях в баду прочитанные ранее, можно сказать испытал легкое недоумение :)
Единственный минус — фидбек почему то так и не получил, ну и ладно, обязательно попробую свои силы через пол года!
Sign up to leave a comment.

Articles