• Партнер

  •  

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

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

     

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

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

     

    Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии