Помогите составить С++ тест/покритикуйте идею
inputString="aaaa",before="aaa",after="abc" -> ?
inputString="aaaa",before="aaa",after="abc" -> ?abca
Хороший вопрос - первое найденное before нужно заменить на after.
когда 1 элемент. когда элементы могут быть равны, когда искомый находится в начале/в конце. там много всего вылезает
правда правильный вариант быстро нагуглят...
мы решили составить С++ тест который должен отобрать талантливых кандидатов.
30 минут на выполнение
что-то не сходится
Пока есть 1 вопрос (из категории легкие):по мне так если это раньше не писал, то одно это задание минут 30 займет, чтобы по-нормальному реализовать
Напишите функцию replaceAll, принимающую 3 параметра - inputString, before, after. Функция должна заменить каждую подстроку before на подстроку after.
Примеры:
inputString="Test test test",before = "te", after = "ab" -> "Test abst abst"
inputString="aaaa",before="a",after="aa" -> "aaaaaaaa"
В ответ на:А на сколько тогда давать тест? Если сделать сильно длинный, может отпугнуть многих людей - т.к. этот тест будут заполнять все кто присылают резюме перед интервью, нельзя отнимать у людей много времени даже не поговорив с ними о работе.
мы решили составить С++ тест который должен отобрать талантливых кандидатов.
В ответ на:
30 минут на выполнение
что-то не сходится
И он только чтобы отсеять неквалифицированных людей и не тратить на них время на интервью, (результат теста - да/нет, и ДА+ чтобы отметить особо талантливых). Окончательное решение в любом случае по итогам интервью.
Насчет вопроса согласен, он в категорию посложнее наверное...
бинарный поиск включи. хрена с два кто на раз без багов напишетСпасибо за совет, согласен - один сложный вопрос должен быть на бинарный поиск или деревья - нужно только его как-то оформить чтобы было не очевидно что вопрос на бинарный поиск и ответ не гуглился.
когда 1 элемент. когда элементы могут быть равны, когда искомый находится в начале/в конце. там много всего вылезает
правда правильный вариант быстро нагуглят...
Тест 1.0:
1. Напишите оператор < для класса
template <class T1, class T2, class T3>
class Triplet
{
public:
T1 first;
T2 second;
T3 third;
};
Сравнивает first для двух елементов, в случае равенства сравнивает second, в случае равенства сравнивает third.
2. ------
3. Напишите функцию replaceAll, принимающую 3 параметра - inputString, before, after. Функция должна заменить каждую подстроку before на подстроку after.
Примеры:
inputString="Test test test",before = "te", after = "ab" -> "Test abst abst"
inputString="aaaa",before="a",after="aa" -> "aaaaaaaa"
inputString="aaaa",before="aaa",after="abc" -> "abca"
4. Что-то про бинарный поиск/деревья.
А стандартные библиотечные функции можно использовать (sting::find)? Если да, то действительно задача на 5 минут. Если нет, то надо реализовывать КМП, а это уже побольше времени займет.
хз, имхо чтобы отсеять неквалифицированных, лучше дать много простых вопросов на разные темы, а задачи посложнее приберечь на собеседование.
#include <iostream>
#include <string>
#include <vector>
void replaceAll(std::string &inputString, const std::string &before, const std::string &after)
{
auto pos = inputString.find(before);
while(pos != std::string::npos)
{
inputString.replace(pos,before.sizeafter);
pos = inputString.find(before,pos+after.size-before.size+1);
}
}
int main
{
const size_t NUM_INPUTS = 4;
std::vector<std::string> inputStrings(NUM_INPUTSbefore(NUM_INPUTSafter(NUM_INPUTS);
inputStrings[0] = "Test test test";before[0] = "te";after[0]="ab";
inputStrings[1] = "aaaa";before[1] = "a";after[1]="aa";
inputStrings[2] = "aaaa";before[2] = "aaa";after[2]="abc";
inputStrings[3] = "";before[3] = "a";after[3]="b";
for(size_t i=0;i<inputStrings.size;++i)
{
std::cout << "[" << inputStrings[i].c_str
<< "," << before[i].c_str << "," << after[i].c_str << "] -> ";
replaceAll(inputStrings[i],before[i],after[i]);
std::cout << inputStrings[i].c_str << std::endl;
}
return 0;
}
Нужно ещё 3-4 вопроса такого типа - проверяющих знания и стиль программирования, с коротким решением, чтобы написание ответа у квалифицированного человека занимало меньше времени чем поиск ответа в гугле.
(тест формируется так чтобы большинство людей не могли его закончить - поможет выявить гениальных программистов).Он вам поможет выявить быстро-печатающих программистов. К "гениальности" или вообще пригодности для работы над большим проектом, особенно в команде, результаты теста не будут иметь ни малейшего отношения.
Я бы посоветовал реструктурировать ваш подход в целом.
1. Мелкие но нетривиальные задачки с таймлимитом помогут отсечь не-программистов которые попытаются спросить стековерфлоу. Идея в формулировке таких задачек — что решение не должно находиться гуглом вообще, так что им реально придётся спрашивать и ждать ответа.
replaceAll дико плохая задачка в этом смысле, спросите лучше что-нибудь дичайше специализированное, ну, я не знаю, дана строка вида "key1=value1, key2=value2, ...", заполнить из неё map. Допустимость пробелов в неожиданных местах, пустых элементов, етс — по вкусу.
Или что-нибудь ещё более специализированное, типа, у нас есть логи в хитровывернутом формате из херни разделённой "|", написать прогу которая выводит строки содержащие только WARNING или ERROR в третьем по счёту поле, от процесса с номером данным в argv, который содержится в пятом поле.
Короче, любой достаточно нетривиальный one-liner на перле или питоне покатит как просьба сделать что-то достаточно геморойное в плюсах. Чтобы проверить что чувак вообще может кодить.
Идея в том, что фиг они сформулируют вопрос чтобы найти готовое решение, а на стековерфлоу никто им решения не напишет за полчаса, особенно если вопрос явно выглядит как просьба решить домашку.
А потом отсеянным таким образом кандидатам дайте полдня чтобы написать сравнительно нетривиальную полную программу (ну, возьмите любую изолированную задачу такого размера над которой недавно работали и смотрите на результаты глазами, на сам код, а не на таймлимит. Потому что вас интересует хотите ли вы работать вместе с программистом который пишет такой код, а не насколько быстро он его пишет.
написать реализацию std::array
написать shared_array
написать округление до целого
Идея в том, что фиг они сформулируют вопрос чтобы найти готовое решение, а на стековерфлоу никто им решения не напишет за полчаса, особенно если вопрос явно выглядит как просьба решить домашку.Ты слишком высокого мнения о постоянном содержимом рынка программистов. Я сейчас нанимаю людей в вялом режиме. Задаю, казалось бы, тривиальный предварительный вопрос про, применительно к C++, unordered_set: добавить три элемента, удалить один, пройти foreach и напечатать на консоль. EDIT: Ошибся, пока писал пост. Вопрос в том, что будет напечатано на консоль. 100% кандидатов ответили на этот вопрос неправильно, то есть не потрудились погуглить или зайти на стековерфлоу.
Когда я задавал задачку на реализацию алгоритма Дейкстры, из 75 кандидатов её только два человека решили с помощью binary heap, остальные упорно писали через линейный поиск в динамическом массиве. Вдвойне странно, потому что код при этом получается не только с большей алгоритмической сложностью, но и длиннее по количеству строк.
Тест должен оценивать не разработчиков с доброфорума, которые в среднем имеют больший уровень интеллекта; а фильтровать огромное стадо баранов и выбирать тех, с кем есть о чём поговорить.
Задаю, казалось бы, тривиальный предварительный вопрос про, применительно к C++, unordered_set: добавить три элемента, удалить один, пройти foreach и напечатать на консоль. 100% кандидатов ответили на этот вопрос неправильнов чем
в чем троллинг подковырка?А как бы ты ответил на этот вопрос?
А как бы ты ответил на этот вопрос?да в лоб бы и ответил (не компилял и на стековерфлоу не ходил еще, но я так понял, что надо сходить? )
using namespace std;
unordered_set<int> s;
//adding
s.emplace(2);
s.emplace(4);
s.emplace(42);
//erasing
s.erase(42);
//printing
for (const auto& x : s)
{
cout << x << end;
}
да в лоб бы и ответил (не компилял и на стековерфлоу не ходил еще, но я так понял, что надо сходить? )Бля, ошибся пока писал пост. Я его отредактировал, идея заключалась в том, что я сам пишу код и спрашиваю, что он выведет на консоль.
идея заключалась в том, что я сам пишу код и спрашиваю, что он выведет на консоль.Мы все ждем с нетерпением
Бля, ошибся пока писал постхехе, крепко я заквотировал тебя
ну а твой EDIT уже понятен и неинтересен для меня как разминка для ума, в целом хороший вопрос для первичного отсеивания
ну а твой EDIT уже понятен и неинтересен для меня как разминка для ума, в целом хороший вопрос для первичного отсеиванияДело в том, что применительно к C++ вопрос получается действительно слишком тривиальным. В C# имена коллекциям придумывали тоже бараны, поэтому там этот вопрос более уместен. Я всего лишь привожу его как пример. К основному смыслу моего поста он не имеет отношения: даже простые вопросы будут отсеивать очень много кандидатов.
идея заключалась в том, что я сам пишу код и спрашиваю, что он выведет на консользолотая работа, когда начальник пишет код, а тебя лишь спрашивают "сойдет?"
В C# имена коллекциям придумывали тоже баранылично мне не нравятся названия unordered*, заобфусцировали классические hash контейнеры
лично мне не нравятся названия unordered*, не взяли на себя обязанность использовать строго классические hash контейнеры
лично мне не нравятся названия unordered*, заобфусцировали классические hash контейнерыМожет быть, из-за этого у кого-нибудь самолёт упал или спутник? Впрочем, по мне что unordered_, что hash_ лучше, чем просто List и Dictionary. Потому что 95% кандидатов искренне верят, что List - это одно-дву-связный список; а про Dictionary я наслушался таких сказок, что страшно спать по ночам.
идея заключалась в том, что я сам пишу код и спрашиваю, что он выведет на консоль.Если ты сам пишешь код и у кандидатов есть возможность погуглить/спросить стак-оверфлоу, что им мешает откомпилировать код на любом онлайн компиляторе и тупо скопировать ответ (я бы наверное так и сделал - минимально по трудозатратам и точно не ошибешься).
Если ты сам пишешь код и у кандидатов есть возможность погуглить/спросить стак-оверфлоу, что им мешает откомпилировать код на любом онлайн компиляторе и тупо скопировать ответ (я бы наверное так и сделал - минимально по трудозатратам и точно не ошибешься).Если ты тупо скомпилируешь код и скопируешь ответ, то ошибёшься. Если ты погуглишь/спросишь и после этого дашь правильный ответ, то я готов позвать тебя на собеседование. В текущей итерации поиска программистов из 50 кандидатов ни один не прислал правильный ответ; то есть никто не погуглил, не спросил совета, вообще не почесался.
не взяли на себя обязанность использовать строго классические hash контейнерыа чем отличаются unordered от классических хеш контейнеров?
Если ты тупо скомпилируешь код и скопируешь ответ, то ошибёшься.Хм, это интересно но непонятно - если вопрос в том,что программа выведет на экран, я компилирую и запускаю программу, и присылаю результат выполнения - как я могу ошибиться? Должны быть какие-то дополнительные условия... Я отказался от подобных задач в тесте по причине того что их легко проверить компиляцией даже не читая код...
Хм, это интересно но непонятно - если вопрос в том,что программа выведет на экран, я компилирую и запускаю программу, и присылаю результат выполнения - как я могу ошибиться? Должны быть какие-то дополнительные условия...В этом случае никаких дополнительных условий нет. Но скопировать результат выполнения программы нельзя. Если ты не можешь правильно ответить на этот вопрос, то как ты собираешься проводить собеседования?
Я отказался от подобных задач в тесте по причине того что их легко проверить компиляцией даже не читая код...Эта задача не подобная.
Интересная задача, ты не против если я включу в тест ?
а чем отличаются unordered от классических хеш контейнеров?Тем, что из их названия нельзя предположить, что они непременно должны быть сделаны на хешах, ня?
Тем, что из их названия нельзя предположить, что они непременно должны быть сделаны на хешахв стандарте явно видно, что без хешей никак
http://www.cplusplus.com/reference/unordered_set/unordered_s...
Тогда предлагаю протянуть гипотезу во времени: оставили себе пространство в будущей версии стандарта уйти от конкретной реализации, сохранив неупорядоченность и еще какие-нибудь ключевые семантические свойства.
Да не, просто вроде как при названии контейнера в стл всегда руководствуются внешними свойствами контейнера, а не структурой данных, на которой он основан. Как бы и set наверно у всех реализован как красно-черное дерево, но называется тем не менее set
Да не, если ты не заметил, я тут рассуждаю на тему, зачем бы они могли придерживаться такой политики.
результат всегда должен быть
ping
pong
ping
pong
ping
...
Дано 1000 монет и 10 конвертов.
a) Придумайте способ разложить эти монеты по конвертам, чтоб можно было выдать любую сумму от 1 до 1000 не распечатывая конверты. ( простая часть)
б) Напишите программу подсчитывающую количество способов так разложить монеты. (вот тут посложнее, хотя тоже решается на бумажке)
Тогда предлагаю протянуть гипотезу во времени: оставили себе пространство в будущей версии стандарта уйти от конкретной реализации, сохранив неупорядоченность и еще какие-нибудь ключевые семантические свойства.На сколько мне известно, назвать-то хотели как раз hash_фигня, но из-за тысяч уже нестандартных существующих реализаций, решили, что будет путаница, поэтому и решили назвать по-другому
На сколько мне известно, назвать-то хотели как раз hash_фигня, но из-за тысяч уже нестандартных существующих реализаций, решили, что будет путаница, поэтому и решили назвать по-другомуНу еще, например, так:
внутренне это не обязательно хэш. Один и тот же контейнер может иметь разную private structure, в зависимости от размера и прочего времени суток.
Писали уже выше, что один из шаблонных параметров это Hash. И в конструктор можно хэш-функцию передавать.
Я считаю, то, что в конструктор можно передавать, это явный позитив!
внутренне это не обязательно хэшхватит уже ерунду морозить
http://www.cplusplus.com/reference/unordered_map/unordered_m...
ищем секции Buckets / Hash policy
SO: http://stackoverflow.com/questions/1646266/difference-betwee...
Может, ты лучше поищешь про observable behaviour?
ИМХО, лучше взять какую-то специфичную задачу из тех, которые стандартно попадаются у вас в работе, подпилить ее, избавив от лишних деталей и ее использовать в качестве теста.
ИМХО, лучше взять какую-то специфичную задачу из тех, которые стандартно попадаются у вас в работе, подпилить ее, избавив от лишних деталей и ее использовать в качестве теста.Да, мы так и делаем - на собеседовании. Идея теста в том чтобы отсеять явно некомпетентных людей, поэтому жесткий лимит по времени, и очень простые задачи чтобы проверить стиль кодирования и адекватность.
Если кому интересно и полезно, вот окончательная версия теста:
1. Напишите консольное приложение которое печатает аргументы переданные через командную строку в следующем формате:
{"аргумент1";"аргумент2";...;"аргумент3"}.
Примеры:
testApp.exe 4 5 6 - > {"4";"5";"6"}
testApp.exe - > {}
testApp.exe "C:\" 34 5.164 - > {"C:\";"34";"5.164"}
2. Напишите оператор сравения (<) для структуры
template <class T1, class T2, class T3>
struct Triplet
{
T1 elem1;
T2 elem2;
T3 elem3;
};
Оператор должен возвращать результат сравнения первых элементов, в случае равенства первых элементов - результат сравнения вторых элементов, и в случае равенства вторых элементов результат сравнения третьих элементов.
Примеры:
(3,4,5) < (1,1432,4353) -> false
(3,4,5) < (3,4,5) -> false
(3,4,5) < (3,4,6) -> true
3. Напишите функцию получающую строку вида "ключ1===значение1:ключ2===значение2:...", где ключи и значения некие строки в формате аскии, не содержащие символов : и =. Функция должна вернуть std::map<std::string,std::string> заполненную данными ключами и значениями.
Примеры:
[test===xyz:yy===abcde]
[1===John:2===Mary:3===Richard]
[123===456:new key===new value]
4. Какой результат выведет приведенная программа:
#include <iostream>
#include <string>
#include <unordered_set>
int main
{
std::unordered_set<std::string> inputSet;
inputSet.emplace("Hello world");
inputSet.emplace("Abcdef");
inputSet.emplace("This is the test string...");
for(const auto &val : inputSet)
std::cout << val.c_str << std::endl;
return 0;
}
получился слишком узкий набор заданий, вот че бы например просто не пройтись по темам в Саттере или Мейерсе и не составить вопросы по этим темам? а так чет не очень тест, чесслово
бинарный поиск включи. хрена с два кто на раз без багов напишетэлементарно. Только рекваймент на размер массива поставить так, чтобы он гарантированно за int не выходил. И никакой хитрой арифметики не нужно, о которой так много бесполезных рецептов постят.
WTF? В четвертой результат не определен, точнее определен, но с точностью до перестановки строк.
WTF? В четвертой результат не определен, точнее определен, но с точностью до перестановки строк.Поздравляю, ты прошел тест - это и есть правильный ответ! А любой ответ полученный компилированием и copy paste - неправильный
получился слишком узкий набор заданий, вот че бы например просто не пройтись по темам в Саттере или Мейерсе и не составить вопросы по этим темам? а так чет не очень тест, чессловоЭто вариант - он даст более точную оценку кандидата при условии что кандидат напишет тест сам и не будет пользоваться stackoverflow , но тогда нужно увеличить время на тест. На собеседовании мы спрашиваем о текущем проекте, в форме развернутого обсуждения - и там принимаем окончательное решение. Тест - он только чтобы отсеять совсем неквалифицированных людей - не нужно покрывать много тем, все что нужно это получить пару образцов стиля программирования и проверить общую вменяемость.
Сегодня первый кандидат писал тест - за пол-часа решил первый вопрос с ошибками, начал второй но полностью запутался в определении оператора сравнения и так его и не закончил, даже не начал последние два вопроса.
Сегодня первый кандидат писал тест - за пол-часа решил первый вопрос с ошибками, начал второй но полностью запутался в определении оператора сравнения и так его и не закончил, даже не начал последние два вопроса.О_о
а какую сумму предлагаете успешно прошедшему, если не секрет?
О_оТочно не знаю - я этот вопрос не решаю, думаю в районе 70-90 тысяч в год в зависимости от квалификации (мы в Канаде, Торонто).
а какую сумму предлагаете успешно прошедшему, если не секрет?
мы в Канаде, Торонтотрололо
наконец-то стало понятно для чего этот тест
— Может, бросить все и рвануть вУрюпинскТоронто?..
Понятно =) Там кстати вызов ".c_str" в теле цикла не нужен.
Хороший вопрос - первое найденное before нужно заменить на after.ты считаешь себя квалифицированным?
ты считаешь себя квалифицированным?Хороший вопрос - я считаю всегда есть чему учится, и что большинство форумчан намного более квалифицированы и рюхающие. В своей области я вроде справляюсь более менее, если чего не знаю - спрашиваю, всегда стараюсь узнать что-то новое. Возможно, я недостаточно подготовлен для проведения тестов и интервью - это мой первый опыт подобного рода, думаю со временем наберу опыта.
Точно не знаю - я этот вопрос не решаю, думаю в районе 70-90 тысяч в год в зависимости от квалификации (мы в Канаде, Торонто).За такой тест 90к - это щедро, очень щедро 8)
За такой тест 90к - это щедро, очень щедро 8)За такими тестами всегда следуют личные собеседования, на которых и начинается веселье.
Оставить комментарий
Julia79
С целью отбора кандидатов на интервью, мы решили составить С++ тест который должен отсеять явно неквалифицированных кандидатов, и в идеале отобрать талантливых кандидатов.Тебования к тесту следущие:
1. 30 минут на выполнение, высылается по емайл в удобное для кандидата время, ответ - тоже по емайл.
2. 4 вопроса - 2 очень простых на базовые знания С++ (10 минут на оба для квалифицированного программиста 2 - посложнее, по 20 минут на каждый (тест формируется так чтобы большинство людей не могли его закончить - поможет выявить гениальных программистов).
3. Тест должен проверить качество кода кандидата и его образ мышления, для его выполнения не дожно быть нужно никаких специальных знаний - только С++ в рамках stl и стандарта.
Собственно, я хотел обратится к доброфоруму с просьбой о помощи сгенерировать эти самые 4 вопроса, и услышать мнение об идее в целом.
Пока есть 1 вопрос (из категории легкие):
Напишите функцию replaceAll, принимающую 3 параметра - inputString, before, after. Функция должна заменить каждую подстроку before на подстроку after.
Примеры:
inputString="Test test test",before = "te", after = "ab" -> "Test abst abst"
inputString="aaaa",before="a",after="aa" -> "aaaaaaaa"
Если удастся составить удачный тест, буду не против если другие форумчане будут им пользоваться - мне кажется эта идея может помочь существенно сократить время на интервью и позволит отобрать стоящих кандидатов для беседы.