Какие задачи по программированию на собеседовании на автоматизатора Вам задавали?

Вот сегодня мне выслали вакансию на python разработчика в yandex.

http://company.yandex.ru/job/vacancies/dev_serv_pyth.xml

А там сразу надо решить задачи по python, что меня обрадовало, так как никто не рассказывает, а что спрашивают на собеседовании например на автоматизатора Selenium + Python.

Вопросы:

В чем ошибка?

def counter(n):
    while True:
        yield n
        n += 1
squares = [i*i for i in counter(1)][0:10]

Почему от этого класса нельзя наследоваться?

class A(object):
  def __init__(self):
      super(self.__class__, self).__init__()

Собственно, а какие задачи по автоматизации и программированию Вам задавали?

Желательно с примерами, кодом и всем остальным.

А вакансия именно на автоматизатора находится тут http://company.yandex.ru/job/vacancies/desktop_test_automation_engineer.xml и задание к нему такое:

Дана таблица размера n x m, в ячейках которой содержатся целочисленные
значения.

Последняя строка таблицы содержит итоговые суммы значений
соответствующих столбцов.

а. Напишите функцию на Python, которая принимает на вход строку,
содержащую одномерный Json-массив ячеек таблицы вида

[ { “value”: 0, “x”:1, “y”:2 }, { “value”: 4, “x”:3, “y”:2 }, {
“value”: 2, “x”:3, “y”:4 }, { “value”: 1, “x”:1, “y”:5 }, { “value”:
6, “x”:3, “y”:5 }, { “value”: 1, “x”:1, “y”:4 } ], где структура

{ “value”: 6, “x”:3, “y”:5 } описывает ячейку таблицы, содержащую
значение (value) 6, положение которой на экране определятся
координатами (x,y), и возвращает строку, содержащую одномерный
Json-массив, который состоит из структур вида

{ “x”: 1, “correct”: 1 }, где «x» определяет столбец, а ячейка
«correct» содержит 1, если итоговая сумма в столбце «x» верна, и 0 — в
противном случае.

Результат должен содержать только те столбцы «x», которые переданы в
исходном наборе данных.

3 лайка

Из последнего по Java:

  1. Чему будет равен result?

    Integer a = 128;
    Integer b = 128;
    
    boolean result = a == b;
    
  2. А в этом случае?

    Integer a = 127;
    Integer b = 127;
    
    boolean result = a == b;
    
  3. А в этом?

    String a = "123";
    String b = "123";
    
    boolean result = a == b;
    
  4. А в этом?

    String a = new String("123");
    String b = new String("123");
    
    boolean result = a == b;
    
  5. А в этом?

    String a = new String("123");
    String b = new String("123");
    
    boolean result = a.equals(b);
    
  6. Написать метод поиска 3х минимумов в целочисленном ArrayList.

3 лайка

Я лучше расскажу, что сам несколько раз на собеседовании.
Мне очень нравится сайт с головоломками по C# (VB, F#) – Pex 4 Fun.
Смысл для меня в головоломках даже не то, чтобы ее решить, а то, чтобы человек показал как он думает.

Правила игры:
Все начинается с такого несложного кода (на самом деле, все головоломки случайные, это лишь пример):

using System;

public class Program {
  public static int Puzzle(int[] a) {
    // Can you write code to solve the puzzle? Ask Pex to see how close you are.
    return 0;
  }
}

http://www.pexforfun.com/default.aspx?language=CSharp&sample=ChallengeMax

Тут на вход приходит число, а на выходе… 0?
Но, есть еще одна такая штука, как Секретная Реализация, которая принимает те же параметры, но возвращает значения, согласно своему секретному алгоритму.
Pex задаст одни и те же значения Вашей и Секретной Реализации. И если удастся разгадать алгоритм – головоломка решена.

1 лайк

А я еще вспомнил, пару задачек которые задавали на собеседовании.

  1. Необходимо написать программу для проверки правильности заполнения sudoku. Можно было использовать любой из языков программирования
  2. Написать функцию вывода чисел Фибоначчи. На вход принимается сколько необходимо показывать чисел из ряда Фибоначчи.

И тех заумных теоретиков, которые будут решать через рекурсию – сразу уволить! Т.е. не принимать. :smiley:

Вот блин, а я только так делал всегда…

Я тоже :smiley:

Ну, конечно, проблему можно немного решить, если к рекурсии добавить кэширование результатов вызова. Т.е. чтобы fub(17) не высчитывал два раза значение fib(15) с нуля, а брал его из кэша.
Без кэша, рекурсивный подход захлебывается уже на fib(100), а через цикл – вернет результат достаточно быстро.

на python это отлично вписывается в концепцию генераторов и с памятью проблем не будет

def fib(n):
    a, b = 0, 1
    for _ in xrange(n):
        yield b
        a, b = b, b + a

print list(fib(10))

Так он и не высчитывает два раза. Это что же по вашему он каждый раз пробегается по всему n раз? :slight_smile: Насколько я помню там, в зависимости от компилятора, либо создается ещё один экземпляр метода и ему передаётся результат предыдущего выполнения, либо, создаётся промежуточная область памяти для хранения результатов вывода и ввода, а дёргается один и тот же метод (по сути ссылка на адрес начала метода).
У меня Фибоначи вылетали только тогда, когда очередной член превышал ограничение размера типа.

Кстати, по поводу Яндекса. Мне давали ещё две задачки.

  1. Есть три отрезка. Надо написать Unit-test, который проверяет могут ли они составлять треугольник.
  2. Есть односвязный список. Оооооочень большой. Ну очень. Будем считать, что несколько петабайт занимает. :smile: Так вот, нужно написать программу, которая за один проход его перевязывает с конца в начало.

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

Я предлагаю – JavaScript, потому что он похож на такие языки как Perl, C#, Java и работать будет по одному принципу.

Следующий код – рекурсивная реализация. И для fib(11) – делает 177 вызовов, вместо 10.
А для fib(12) – 287 вызовов.
Для fib(20)… эмм…. Тут у меня браузер сломался.

var ol = document.getElementById("fib");

function fib(n) {
    ol.innerHTML += ("<li>STARTED Fib <b>" + n + "</b></li>\n");
    if (n <= 0) return 0;
    if (n == 1 || n == 2) return 1;
    
    return fib(n - 1) + fib(n - 2);
}

var h1 = document.getElementById("result");
h1.innerHTML = fib(11);

Вот по поводу Java и С# не уверен, что также работает. Хотя бы потому, что Java язык со строгой типизацией. И я, кстати, именно на джаве и писал Фибаноччи. :slight_smile: Может проблема в реализации движка JS у вас?

А может у вас машина слишком производительная :smiley:

Да, Java работает быстрее чем JavaScript.

Тем не менее, на fib(100) – уже заметны тормоза, которых нет при вычислении числа через цикл.

Запустить код можно через этот замечательный сервис:

http://www.compileonline.com/compile_java_online.php

Для fib(11) у меня получилось все тоже количество вызовов.

public class HelloWorld{

    public static int executions = 0;
    
    public static int fibonacci(int n)  {
        executions++;
        System.out.println(executions + " BEGIN FIB=" + n);
        
        if(n <= 0) return 0;
        if(n == 1)  return 1;
        if(n == 2)  return 1;
    
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
     
     
     public static void main(String []args){
        System.out.println("Hello World");
        
        fibonacci(11);
        
     }
}
1 лайк

Хм… Ну ребят, я даже не знаю…
Вы же явно сами имеете большой опыт интервьюирования…
Разве вам было бы приятно если бы все ваши любимые задачи кто то сразу после интервью выложил в паблик?

На самом деле я сам часто задавал такие вопросы… Но сейчас мне кажеться что лучше побыстрее набить шишки и взяться за ум, и учиться програмированию вообще а не просто “решению” стандартных задач - я это не только о “задачах на собеседовании”, а вообще…
Мне грустно особенно от того что автоматизаторы обычно как раз учат в програмировании только то что им надо для решения каких то конкретных задач на конкретном проэкте…
И тогда получается так, что ты уже начинаеш становиться узкопрофильным, и допустим если ты и синьйор но с селениумом тем же опыта не имел - тебя уже как синьйора на такой проект могут и не взять…

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

Если говорить о задачах все таки ближе к “тем что задают на собеседовании”, то можно поколбаситься на таких примерах:

ЗЫ

Кстати, по поводу Яндекса. Мне давали ещё две задачки.

Есть три отрезка. Надо написать Unit-test, который проверяет могут ли
они составлять треугольник. Есть односвязный список. Оооооочень
большой. Ну очень. Будем считать, что несколько петабайт занимает.
smile Так вот, нужно написать программу, которая за один проход его
перевязывает с конца в начало.

Мне прям неловко… Я понимаю что все равно все рассказывают ответы… Но ведь на самом деле - знания таких вопросов все равно не помогут стать “лучшим тестировщиком”, зато помогут сделать жызнь итервьюверов сложнее в случае если им попадется очень хороший “актер”…

ЗЫ2

Хех… Вы, ребят главное не “нападайте”, Мне бы хотелось не поспорить здесь, а скорее подискутировать… Я и сам с собой не полностью согласен, просто с собой же подискутировать - это уже к диагнозу близко)))

Вообщем если кратко, я за то чтобы рассказывать “о типах задач” а не о конкретных задачах которые задавали в конкретной компании да еще и на конкретный проект… (А потом еще добавили адрес где живет интервьювер… ну и так, на всякий случай, код доступа к его встроеному стимулятору серца…) :smile:

2 лайка

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

Как-то я помню, тоже пытался не рассказывать своих задач для интервьюирования, но рассказывал их своим тест лидам. Они начали их массивно использовать и однажды на одном из интервью я задал задачку (а девочка оказалась честной), а кандидат сказала “мне уже рассказывали как решать такую задачу”. Так что надо обновлять свои задачи постоянно. И делиться ими в том числе, просто чтобы люди знали и понимали, что их могут спросить, а не тупо дать им ответы на вопросы чисто для запоминания.

Полная правда, согласен на все 100%.

А за ссылки спасибо!

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

1 лайк

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

а вот вопросы типа таких как для джавы написали - что вернет код - не очень люблю.

А тут вроде бы никто не писал, что дают задачу домой. Это скорее практика из-за бугра. У нас же все прямо на собеседовании задается.

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

  1. Пришел, познакомился и рассказал, что будет на интервью.
  2. Даю уже записанные задание (несложные), типа посмотреть код и сказать, что не так и тому подобное. Такие вопросы были, в общем по программированию, java, sql, xml. На минут 15.
  3. Дальше прихожу смотрю вопросы и провожу интервью исходя из того, что увидел.
  4. В ходе интервью задаются задачки и вопросы дальше.

Где-то так.

Например? Найти первый последний элемент списка? Или выбрать каждый третий элемент из списка?

В первом посте, задачки на девелопера:

В чем ошибка?

Почему от этого класса нельзя наследоваться?

  • как раз типа “домашние”…
    И в том же яндексе - их задают, причем иногда уровня “за отведенное время” “полностью решить ну очень сложно если не сказать не возможно”. Например: “достаточно” покрыть тестами какой то функционал реального приложения и автоматизировать их.

Мне кажеться задавать задачи “домой” имеет определенный смысл… Он может быть в:

  • проверить как кандидат справляется действительно с задачами “которые решить невозможно за промежуток времени скажем день-два” или с задачами “которые для него совсем новые”. Иногда бывают ситуации что человек не имеет опыта который нужен на проекте, конкретных скилов… А вопрос со временем обучения стоит остро… Таким образом можно проверить как быстро человек учиться…

  • проверить возьмется ли он вообще за задачу (особенно если сказав ему при этом что сделать в срок не обязательно, или вообще не обязательно делать) - таким образом увидев его мотивацию (как работы в компании, или же дав задачу близкую к тому чем занимаються на проекте - мотивацию работать в даном проекте). Можно понять что из себя вообще представляет кандидат, нужны ли ему суто деньги от работы, или будет видно что он “возьмется за задачу” только потому что она ему интересна, что он таких еще не делал, и ему интересно ради получения нового опыта… Мне например это довольно важно… Потому что гики и хакеры потенциально более продуктивные инженеры, и не потому что будут много перерабатывать, а потому что “на волне интереса” они сделают больше за обычное время…

в первом вопросе ведь не понадобится ни цикл, ни условия? Если есть готовые методы работы со списком :slight_smile:
второй - может подойти.

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