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

Работали мы как-то с компанией «Яндекс» в соседних бизнес-центрах. Заходили к ним в гости и удивлялись, что в то время, как сотрудники нашей редакции отливают свинцовые литеры для печатных прессов, стоя по пояс в радиоактивных отходах в непроветриваемых помещениях, сотрудники Яндекса сидят в креслах за 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

Критичный процесс. Учимся создавать и принудительно завершать критичные процессы в Windows

Часть процессов операционной системы считаются «критичными» — если завершить один из них, …