Находит меня хеадхантерша из другой страны и предлагает попробовать пройти собеседование в Яндекс. Работы почти нет, зарплаты, судя по рассылкам, там большие. Немножко не тот профиль вообще, но в частности в требуемой теме полгода опыта есть. Сказала, что там задачи решать.
Интервьюер почти ничего не спросил, выдал ссылку на общий вебовский редактор, где первым заданием было написать структуру односвязного списка с данными. А затем было предложено написать функцию, где на входе два таких списка, а на выходе один, отсортированный по данным из первых двух и без всякого копирования.
Реализованная задумка скорее всего получалась бы такой:
Сразу скажу, что писать так нельзя (или можно для себя, какой-нибудь тест).
Вкратце было так: мне дан какой-то неудобный вебовский редактор, с подсказками и подсветками не в тему. Плюс переговариваюсь я на маке и там не программирую. Много опечаток, раздражаюсь.
Интуитивно хочу поменьше писать и поместить все в два цикла (из соображений сложности алгоритма).
Смастерив тот вложенный for(для двух списков разом), я выдаю замечание, что суть задачи неадекватна предложенной форме исполнения. На что получаю ответ, что он, опытный мастер, наблюдая за моими руками, никакой осмысленности в моем черновом коде не видит. И предлагает на этом завершиться.
Выбесило, но что есть, то есть. Над задачей стоило подумать прежде, чем начать что-то писать. Там все просто, этот for надо дублировать для каждого из списков, пренебрегая тем, что дублируется и тело цикла один к одному. В процессе дальнейшего кодирования, возможно, я бы это увидел, но это сослагательное наклонение.
Правда, остаются вопросы.
Человек из Яндекса не может прочесть код с оператором “запятая”? В чем глубокий смысл требовать написать код в крайне неестественных условиях (без компилятора и в неиспользованном ранее редакторе)? Не предложив изначально оценить трудоемкость, не давая время на дизайн в минимальной форме? Я вот играю в блиц на класс ниже, чем в обычные шахматы — в Яндекс нужны скорострелы?
Короче, кто туда собирается, должен иметь эти вещи ввиду. Хорошо оплачиваемые работы всегда с каким-нибудь подвохом, им выбраковывать много кандидатов надо :)
PS: 29.12 Не могу отвечать в комментах, в свое впемя был забанен (за программисткий разбор писания:), разбанили — статья в неделю, коммент в день(даже на свою статью). Не суть.
Откликаюсь под катом:
Интервьюер почти ничего не спросил, выдал ссылку на общий вебовский редактор, где первым заданием было написать структуру односвязного списка с данными. А затем было предложено написать функцию, где на входе два таких списка, а на выходе один, отсортированный по данным из первых двух и без всякого копирования.
Реализованная задумка скорее всего получалась бы такой:
struct list { struct list* next; int my; }; list* joint(list* a, list* b) { list fst = { a }; list scd = { b }; list trd = {0}; list* res = &trd; while (fst.next || scd.next) { int ref = 0; list* dst = 0; bool flg = 0; for (list* src = fst.next? &fst:&scd; src->next; src = src->next->next || flg? src->next : (flg = 1, &scd) ) { if (src->next->my > ref) { ref = src->next->my; dst = src; } } res->next = dst->next; dst->next = res->next->next; res = res->next; } return trd.next; }
Сразу скажу, что писать так нельзя (или можно для себя, какой-нибудь тест).
Вкратце было так: мне дан какой-то неудобный вебовский редактор, с подсказками и подсветками не в тему. Плюс переговариваюсь я на маке и там не программирую. Много опечаток, раздражаюсь.
Интуитивно хочу поменьше писать и поместить все в два цикла (из соображений сложности алгоритма).
Смастерив тот вложенный for(для двух списков разом), я выдаю замечание, что суть задачи неадекватна предложенной форме исполнения. На что получаю ответ, что он, опытный мастер, наблюдая за моими руками, никакой осмысленности в моем черновом коде не видит. И предлагает на этом завершиться.
Выбесило, но что есть, то есть. Над задачей стоило подумать прежде, чем начать что-то писать. Там все просто, этот for надо дублировать для каждого из списков, пренебрегая тем, что дублируется и тело цикла один к одному. В процессе дальнейшего кодирования, возможно, я бы это увидел, но это сослагательное наклонение.
Правда, остаются вопросы.
Человек из Яндекса не может прочесть код с оператором “запятая”? В чем глубокий смысл требовать написать код в крайне неестественных условиях (без компилятора и в неиспользованном ранее редакторе)? Не предложив изначально оценить трудоемкость, не давая время на дизайн в минимальной форме? Я вот играю в блиц на класс ниже, чем в обычные шахматы — в Яндекс нужны скорострелы?
Короче, кто туда собирается, должен иметь эти вещи ввиду. Хорошо оплачиваемые работы всегда с каким-нибудь подвохом, им выбраковывать много кандидатов надо :)
PS: 29.12 Не могу отвечать в комментах, в свое впемя был забанен (за программисткий разбор писания:), разбанили — статья в неделю, коммент в день(даже на свою статью). Не суть.
Откликаюсь под катом:
про код как надо
Разговор у многих выходит на требования, где додумываются дополнительные. Но фактически в таких оказиях требование одно — время. Я даже узнал здесь (и соглашусь), что не обязательно, что бы работало (но себе к сожалению при собеседовании ставил).
Да, практически трое спросили некий код «как надо». Тоже надо понимать, что правильных кодов не бывает, код зависит от требований. Интервьюер не ставил и не мог ставить цели читабельности с таким временем, с таким подходом и инструментарием. Форумская общественность ставит — я уже писал про запатченный bool-ем for, который интервюер не понял. Разлагаю его на два цикла + читаемые имена.
Не сильно тестированный вариант:
Да, практически трое спросили некий код «как надо». Тоже надо понимать, что правильных кодов не бывает, код зависит от требований. Интервьюер не ставил и не мог ставить цели читабельности с таким временем, с таким подходом и инструментарием. Форумская общественность ставит — я уже писал про запатченный bool-ем for, который интервюер не понял. Разлагаю его на два цикла + читаемые имена.
Не сильно тестированный вариант:
struct list { struct list* next; int my_number; }; list* joint(list* a, list* b) { list pseudo_headers[] = { {0}, {a}, {b} }; // trick: first element of array is [pseudo]header of result list list* res_ptr = &pseudo_headers[0]; while (pseudo_headers[1].next || pseudo_headers[2].next) { list* ahead_max; int cur_max_data = 0; for (int i = 1; i < sizeof(pseudo_headers)/sizeof(pseudo_headers[0]); i++) { for (list* ahead = &pseudo_headers[i]; ahead->next; ahead = ahead->next) { if (ahead->next->my_number >= cur_max_data) { cur_max_data = ahead->next->my_number; ahead_max = ahead; } } } res_ptr->next = ahead_max->next; ahead_max->next = res_ptr->next->next; res_ptr = res_ptr->next; } return pseudo_headers[0].next; }
