Спецподгон: задачи от компании «Яндекс»

Работали мы как-то с компанией «Яндекс» в соседних бизнес-центрах. Заходили к ним в гости и удивлялись, что в то время, как сотрудники нашей редакции отливают свинцовые литеры для печатных прессов, стоя по пояс в радиоактивных отходах в непроветриваемых помещениях, сотрудники Яндекса сидят в креслах за 800 евро и наслаждаются теплом от обогреваемых стен-перегородок. Хочешь работать так же? Легко! По вопросам трудоустройства в нашу редакцию пиши Степану на step@glc.ru, а по поводу Яндекса… впрочем, дадим им слово.

Больше половины сотрудников Яндекса вовсе не менеджеры по руководству общими вопросами и не операторы кофейных машин, а самые что ни на есть разработчики. Яндексу как воздух нужны front-end и back-end разработчики на С++, Python, Perl, Java, JavaScript. В основном в компании используются UNIX-плафтормы, но есть и разработка под Windows. Во многих сервисах формируются команды мобильной разработки, которые пишут под iOS, Android и Windows Phone.

Самая острая потребность в разработчиках C++. При этом все чаще появляются вакансии, связанные с машинным обучением, big data, распознаванием изображений и голоса, распределенными вычислениями. Далеко не всегда опыт работы с этими технологиями требуется обязательно. Есть команды разработчиков, которые занимаются исследовательскими задачами.

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

Разработчики Яндекса подготовили читателям ][ задачи, которые могут встретиться на собеседовании в компании.

 

Кого в Яндексе ждут больше всего?

  • Разработчик поиска С++
  • Разработчик Яндекс.Диска (С++ для Windows)
  • Разработчик качества поиска Яндекс.Картинок (С++)
  • Разработчик C ++ систем распознавания речи (мобильные платформы)
  • Разработчик С++ (компьютерное зрение)
  • Разработчик распределенной системы хранения и обработки данных С++

 

Как проходит собеседование

Ольга Пономарёва, старший рекрутер группы подбора разработчиков, Яндекс

Если вы успешно справилсьи с тестовыми задачами на company.yandex.ru, мы предложим созвониться по скайпу. По сути, это будет первое знакомство, где мы немного поговорим про выбранный язык программирования и предложим пару математических или алгоритмических задачек. Для первого разговора иногда достаточно 10–15 минут, и уж точно не больше часа.

Мы друг другу понравились? Отлично, тогда приглашаем в гости: у Яндекса есть десять офисов разработки в разных городах, вместе выберем подходящий. Обычно на собеседование приходят несколько разработчиков из разных команд: кому-то вы можете понравиться больше, и тогда он будет за вас биться. Правда, не сразу. Перед этим нужно написать код для решения предложенных задач. Чем быстрее напишешь — тем быстрее можно пойти домой :). Еще на встрече бывают задачки на сообразительность. В первую очередь нам интересен ход ваших мыслей, не обязательно решить всё. Если кандидат претендует на позицию senior-разработчика, поговорим об архитектуре систем.

Иногда для того, чтобы понять, «наш» человек или нет, требуется несколько встреч. Однако если вам нужно срочно определиться с местом работы — скажите нам об этом, что-нибудь придумаем.

 

Спрашивает Андрей Плахов, руководитель службы функциональности поиска в Яндексе:

Задача 1

Дана функция на языке Python. Завершится ли когда-нибудь вызов dio()? Почему?

def dio():
   x = 1L
   while 1:
       for y in xrange(1, x):
           for z in xrange(1, y):
               if x*x == y*y + 12752041*z*z:
                   return "Found it"
       x = x + 1

 

Задача 2

Что делает эта программа на языке С++?

#include <cstdio>
struct EmptyList {
};
template <int N, class T>
struct IntList {
    static const int Head = N;
    typedef T Tail;
};
 
#define LIST1(N1) IntList<N1, EmptyList>
#define LIST2(N1,N2) IntList<N1, LIST1(N2) >
#define LIST3(N1,N2,N3) IntList<N1, LIST2(N2,N3) >
#define LIST4(N1,N2,N3,N4) IntList<N1, LIST3(N2,N3,N4) >
#define LIST5(N1,N2,N3,N4,N5) IntList<N1, LIST4(N2,N3,N4,N5) >
 
#define NUM2(x,y) 10*(x) + (y)
#define NUM3(x,y,z) 100*(x) + 10*(y) + (z)
#define NUM4(w,x,y,z) 1000*(w) + 100*(x) + 10*(y) + (z)
#define NUM5(v,w,x,y,z) 10000*(v) + 1000*(w) + 100*(x) + 10*(y) + (z)
 
#define DIFFER3(x,y,z) ((x) != (y) && (x) != (z) && (y) != (z))
#define DIFFER4(x,y,z,w) ((x) != (y) && (x) != (z) && (x) != (w) && DIFFER3(y,z,w))
#define DIFFER5(x,y,z,w,v) ((x) != (y) && (x) != (z) && (x) != (w) && (x) != (v) && DIFFER4(y,z,w,v))
 
template <class T> struct LSolve {
    static const int Answer0 = LSolve<IntList<0, T> >::Answer;
    static const int Answer1 = LSolve<IntList<1, T> >::Answer;
    static const int Answer2 = LSolve<IntList<2, T> >::Answer;
    static const int Answer3 = LSolve<IntList<3, T> >::Answer;
    static const int Answer4 = LSolve<IntList<4, T> >::Answer;
    static const int Answer5 = LSolve<IntList<5, T> >::Answer;
    static const int Answer6 = LSolve<IntList<6, T> >::Answer;
    static const int Answer7 = LSolve<IntList<7, T> >::Answer;
    static const int Answer8 = LSolve<IntList<8, T> >::Answer;
    static const int Answer9 = LSolve<IntList<9, T> >::Answer;
    static const int Answer = Answer0 + Answer1 + Answer2 + Answer3 + Answer4 + Answer5 + Answer6 + Answer7 + Answer8 + Answer9;
};
 
template <int U, int D, int A, int R, int K> struct LSolve<LIST5(U,D,A,R,K) > {
    static const int Answer =  
       NUM4(U,D,A,R) + NUM4(U,D,A,R) == NUM5(D,R,A,K,A) && (U != 0) && (D != 0) && DIFFER5(U,D,A,R,K) ?
        NUM5(D,U,R,A,K) : 0;
};
 
typedef LSolve<EmptyList> Solve;
 
int main(int argc, const char* argv[]) {
    printf("ДУРАК=%d\n", Solve::Answer);
}
 

Спрашивает Кирилл Сюзев, руководитель группы разработки Яндекс.Картинок

Задача 3

Есть исходный код программы:

#include <iostream>
#include <unistd.h>
#include <stdlib.h>
int main() {
std::cout << 1;
fork();
exit(0);
}

Что напечатается на экране и почему? Как изменится вывод, если заменить cout на cerr?

Задача 4

В программировании есть понятие LRU-кеша.

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

LRU-кеш таким образом выбирает: если места под элементы больше нет, он выбрасывает элемент, к которому дольше всего не обращались, и вместо него кладет новый.

Задача — написать такой кеш в виде С++ класса/классов.

 

Мы ждем ваших задачек!

IT-компании, шлите нам свои задачки! Интересные и оригинальные задачки мы совершенно безвозмездно поставим перед нашими читателями. То есть для того, чтобы опубликовать свои программерские и просто логические задания в этой рубрике, не нужно никакой бюрократии! Не нужны переписки с инстанциями и отделами, акты приема-передачи работ, подписи, счета и визы. Достаточно написать на lozovsky@glc.ru и установить близкий контакт третьей степени с редактором рубрики. Вы шлете задачки, мы их публикуем. Взаимовыгодно! Да, и про бонусы читателям-решателям не забывайте!

 

А еще мы ждем ваших решений!

Задачки сами собой не решатся! Шли нам свои ответы, а айтишные компании будут дарить тебе бесплатные айфоны.

 

Check Also

DDoS на Bluetooth. Разбираем трюк, который поможет отключить чужую колонку

На свете существует не так много вещей, которые бесят практически всех без исключения. Это…

Оставить мнение