company_banner

Программисты, ходите на собеседования


    Картинка взята из видеоролика с канала «Воинствующие Аметисты»

    Около 10 лет я работал системным программистом под Linux. Это модули ядра (kernel space), различные демоны и работа с железом из пространства пользователя (user space), различные загрузчики (u-boot и др.), прошивки контроллеров и многое другое. Даже иной раз случалось пилить web-интерфейс. Но чаще бывало, что приходилось и с паяльником посидеть, да с проектировщиками печатных плат взаимодействовать. Одна из проблем такой работы это то, что достаточно сложно оценить уровень своей компетенции, поскольку одну задачу ты можешь знать очень глубоко, а рядом можешь не знать совсем. Единственный адекватный способ понять куда идти, и какие течения сейчас есть – это ходить на собеседования.

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

    В статье будет небольшой конкурс с призами.

    Особенности профессии


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


    Типичное рабочее место системного программиста.

    На фото выше — моё типичное рабочее место в момент отладки драйверов. Логический анализатор показывает корректность передаваемых посылок, осциллограф контролирует форму фронтов сигнала. Так же в кадр не попал jtag-отладчик, который применяется тогда, когда стандартные средства отладки уже не справляются. И со всем этим парком оборудования необходимо уметь работать.

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

    Ещё особенность разработки на уровне драйверов и железа заключается в том, что гугл не помогает. Часто приходится искать информацию по своей проблеме, а там три ссылки, из которых две — это твои же вопросы на каком-то форуме. Или ещё хуже, когда встречаешь вопрос такого же бедолаги, который задавал его 5 лет назад в списке рассылки ядра, да так и не получил на него ответа. В этой работе, кроме ошибок в проектировании как аппаратной части, так и программной, сплошь и рядом встречаются ошибки документации — это наверное самые лютые и неприятные проблемы. Бывает некорректно описаны регистры, либо вообще отсутствует описание на таковые. Такие проблемы решаются только методом научного тыка случайных чисел в определённые регистры (этакий реверс). Часто бывает ещё такое, что в процессоре заложен какой-то функционал, а кроме тебя этот функционал никто не реализовывал (особенно, если процессор новый). И это хождение по полю с граблями, из которых 70% детские. Но когда есть документация, даже с ошибками — это уже прогресс. Достаточно часто бывает, что документации вообще нет, и вот там начинается хождение уже по минным полям, когда горит железо. И да, такие задачи тоже с успехом решал.

    Собеседования


    Моё мнение, что на собеседования стоит ходить где-то не реже, чем раз в пол года, даже если вы обожаете свою работу, и не хотите её менять. Собеседование позволяет понять свой уровень, как специалиста. Я считаю, что самые ценные собеседования — провальные. Именно они наиболее точно показывают какие узкие места своих знаний стоит подтянуть.

    Ещё одна интересная особенность — это качество собеседований. Это моё наблюдение, и оно не является истиной, допускаю, что мне просто так везло. Если собеседование проходит по сценарию:

    • расскажите о себе;
    • у нас такие задачи;
    • вам нравится?

    И если после этого диалога вы друг другу понравились, ты выходишь на работу, то как правило компания и задачи оказываются весьма приятными и адекватными. Если собеседование напоминает прохождение 12 кругов ада: первое собеседование с HR, потом собеседование с группой программистов, потом директор, ещё домашние задания и т.д., то как правило это были провальные организации в которых я работал не очень долго. Опять же — это личное наблюдение, но как правило слишком большая бюрократия и затянутый процесс принятия на работу показывает что такие же точно процессы протекают внутри компании. Решения принимаются медленно и неэффективно. Были и обратные ситуации, когда были круги ада собеседований, а компания оказывалась шикарной, и когда после хлопка по рукам компания оказалась болотом, но это редкости.

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

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

    В собеседованиях особенно сильно ценю программистские задачи. И те которые приходится решать прямо во время встречи, в стрессе, так и домашние задания. Первое показывает насколько ты готов быстро и точно решать задачи в стрессовой ситуации и аврале. Вторая, показывает уровень твоей компетенции и умение искать информацию и решать текущие задачи.

    Самые интересные места работы у меня были в оборонном комплексе нашей страны. В процессе работы приходилось решать просто фантастические задачи, которые коммерческим программистам даже и не снились. Суперкомпьютеры, проектирование маршрутизаторов, различных узловых боевых комплексов — это безумно увлекательно. Когда во время парада видишь комплекс, который хранит в себе твой код, это правда приятно. Как ни странно, собеседования в такие компании, как правило очень простые, буквально пришёл, понравился — принят (наверное накладывается специфика военных, которые не любят размусоливать). Задачи, с которыми мне приходилось там сталкиваться, по-настоящему интересные и сложные. С опытом пришло, что на них хорошо учиться быть качественным системным программистом. Недостатки тоже есть, и это даже не низкая оплата труда. На данный момент зарплата в оборонном комплексе вполне достойная, с бонусами и плюшками. Как правило — это большая бюрократия, ненормированный рабочий день, бесконечные авралы, работа в большом стрессе. В определённых случаях нельзя исключить секретность, которая добавляет определённые проблемы для выезда за рубеж. Плюс, конечно, самодурство начальников-сапогов, и такое, увы, тоже бывает. Хотя опыт работы именно с представителем заказчика, у меня, исключительно приятный. Это собирательное впечатление о трёх различных НИИ и компаний связанных с гособоронзаказом.

    Задачи на собеседованиях


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

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

    Вторая по полярности тема — это указатели, вот это прям должно от зубов отскакивать. Так, чтобы вас среди ночи разбудили и вы могли всё рассказать и показать.

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

    Вопросы №1
    I. На знание СИ. Что означают следующие записи:

    const char * str;
    
    char const * str;
    
    const * char str;
    
    char * const str;
    
    const char const * str;
    

    Все ли записи корректны?

    II. Почему эта программа выдаст ошибку сегментации?

    int main ()
    {
           fprintf(0,"hello\n");
           fork();
           return(0);
    }

    III. На сообразительность.

    Имеется палка длиной в один метр. На неё случайным образом падают десять муравьёв, которые ползут в разные стороны. Скорость движения одного муравья 1 м/с. В случае если муравей встречается с другим муравьём, то он разворачивается и ползёт в противоположную сторону. Какое максимальное время нужно прождать, чтобы все муравьи упали с палки.

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

    Вопросы собеседования №2

    Аппаратные вопросы.

    • Как устроены системные вызовы linux на языке ассемблера на ARM-процессоре, на х86. В чём отличие?
    • Какие средства синхронизации бывают? Какие средства синхронизации можно использовать внутри контекста прерывания, какие нет и почему?
    • Чем отличается шина i2c от spi?
    • Для чего на шине i2c стоят терминаторы и какой их номинал?
    • Может ли интерфейс RS-232 работает ТОЛЬКО по двум проводам: RX и TX? Тут дам ответ: Оказывается, что плохонько, на 9600, но может!!!
    • А теперь второй вопрос: почему?
    • Как лучше располагать сигнальные линии и питание в многослойных платах и почему? Питание внутри слоёв, или сигнальные линии внутри слоёв? (Вопрос вообще сугубо по схемотехнике).
    • Для чего у дифференциальных линий дорожки идут везде вместе?
    • Шина RS-485. Обычно на такой линии есть терминаторы. Однако, у нас схема звезда, с переменным количеством подключаемых модулей. Какие средства избежания коллизий и помех нужно использовать?
    • Что такое красное и бинарное дерево?
    • Как работать с cmake?
    • Вопросы о сборке yocto linux.

    Задачи на этом собеседовании:

    1. Написать функцию, которая инвертирует в uint32_t все биты. (работу с битами очень любят на собеседованиях, рекомендую)
    2.

    int32_t a = -200;
    uint32_t b = 200;
    return *(uint32_t) * (&a)) > b;

    Что вернёт данная функция? (решение на бумаге, без ЭВМ)

    3. Функция расчёта среднего арифметического двух чисел int32_t.

    4. Какие способы вывода в программах, в т.ч. в поток ошибок.

    Третий отбор был относительно недавно, и я не удивлюсь если там до сих пор есть такая анкета, так что не буду раскрывать компанию, чтобы не подставлять их… Но в общих чертах приведу пример возможных вопросов, и если вы узнали ваши вопросы, то передаю привет :).

    Вопросы собеседования №3
    1. Приводится пример кода обхода дерева, необходимо рассказать что делается в данном коде и указать на ошибки.
    2. Написать пример утилиты ls. С простейшей опцией “-l”.
    3. Привести пример как сделать статическую и динамическую линковку. В чём разница?
    4. Как работает RS-232? Чем отличается RS-485 от RS-232? В чём отличие RS-232 от RS-485 с точки зрения программиста?
    5. Как работает USB (с точки зрения программиста)?
    6. Перевод технического текста с русского на английский язык.

    Успешное собеседование — не залог успешной работы


    Эта глава скорее даже не для программистов(хотя и для них тоже), а больше для HR. Наиболее адекватные компании не смотрят дотошно результаты собеседований. Ошибаться нормально, чаще всего смотрят именно на то как человек умеет решать задачи и рассуждает.

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

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

    Есть и ещё один вариант собеседований: когда ты его с успехом проходишь, но по результатам собеседования понимаешь что работодатель полный неадекват. Я сразу отказываюсь от работы, если мне предлагают работать как ИП, суля большие доходы. Это форма ухода от налогов действующей организации, и почему проблемы работодателя должны волновать меня, как программиста? Другой вариант, это различные госструктуры. У меня было собеседование, по результатам которого мне предложили хорошую зарплату, но сказали что предыдущий программист уволился, заболел, умер, ушёл в запой из-за нагрузки и ваш рабочий день начинается в 8 утра. С такого места тоже бежал так, что пятки сверкали. Да, HR обратите внимание, что программисты готовы отказаться даже от самой вкусной вакансии, если рабочий день должен начинаться рано утром.

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


    Выводы


    Программисты, ходите на собеседования! Причём старайтесь идти всегда на повышение. Допустим, если вы получаете N денег, то идите на собеседование минимум на оплату N*1,2, а лучше N*1,5. Даже если вы не возьмёте эту вакансию сразу, то поймёте что же нужно для этого уровня оплаты.
    Мои наблюдения, показали что решает хорошее знание английского языка, достаточно богатый опыт работы в отрасли и уверенность в себе. Последнее — это главное качество, как и везде в жизни. Как правило, более уверенный кандидат может успешнее пройти собеседование, даже при наличии большего количества ошибок, чем отличный, но более стеснительный и инициативный соискатель. Удачи на собеседованиях!

    P/S Конкурс


    Если у вас есть интересные примеры задачек, которыми вас загрузил HR, то welcome в комментарии. Мы подготовили небольшой конкурс — условия просты: вы пишете самое необычное задание которое у вас было на интервью, читатели проводят его оценку (плюсом), а мы через неделю подводим итоги и награждаем победителя весёлыми ништяками.



    RUVDS.com
    VDS/VPS-хостинг. Скидка 10% по коду HABR

    Комментарии 366

      +6
      самое необычное задание которое у вас было на интервью
      и самое идиотское одновременно:
      нарисуйте дерево
        +1
        Самое идиотское — пояснять, почему он любимый. Я бы не осилил
        ( Про любимый мем было забавнее. С деревом просто непонятно и незабавно)
          +4
          Есть в этом логика: если корень сверху, ты — пингвин, если снизу, ботаник.
            +4
            А если я иву нарисую, это будет кривой успеха моих проектов?
            Может, она просто красивой кажется. Может, меня вдохновение вело,
            а не практичность или эффективность?
            Камыш, осока, деревня…

            если корень сверху, ты — пингвин

            Фанат AC\DC уж тогда, чтобы солиднее выглядеть)
          +2
          У меня было однажды. Это часть теста дом-дерево-человек, в психологов играются.
            +4

            Меня как-то попросили просто написать объявление бинарного дерева. Обсуждали эту задачу где-то полчаса.


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

              0

              Ого, а так можно вообще?

                +6

                Если типы зависимые, то да.


                С балансировкой чуть сложнее (особенно когда нужно гарантировать не прямое равенство глубины поддеревьев, что просто, а, скажем, отличие не более чем в два раза между наикратчайшим и наидлиннейшим путем), но гарантировать «поисковость» дерева, например, можно, если вы напишете что-то в духе


                data Tree : Nat -> Nat -> Type where
                  Leaf : (n : Nat) -> Tree n n
                  Node : (n : Nat)
                      -> Tree leftLower leftUpper
                      -> Tree rightLower lightUpper
                      -> (leftUpper `LT` n)
                      -> (n `LT` rightLower)
                      -> Tree leftLower rightUpper

                Идея в том, что мы в типе дерева храним диапазон значений (зачем и нужны завтипы), которые содержатся в этом дереве. Диапазон листа тривиален и вырождается в одну точку. Диапазон внутреннего узла — объединение диапазонов левого и правого поддерева, при этом, чтобы внутренний узел сформировать, нужно иметь доказательство, что правая граница левого поддерева меньше хранящегося в нём значения, и аналогично для левой границы правого поддерева.

              +2
              Однажды я был на собеседовании в компанию, которая делала софт для психологов. Помимо технического интервью там было интервью с главным психологом. Вопросы там были конечно соответствующие. В конце мне даже рассказали про мою личность, и всякое такое. Это было необычно… но очень не приятно, не для того всё же пришел, возможно там параллельно ещё была проверка на стрессоустойчивость. И на сколько у меня математическое мышление. И на сколько развитая у меня личность. И на работу с оценочными суждениями. И вообще.

              В общем очень сомнительно. Но запомнилось, да.
              +1
              const * char str — что то неправильное, а для char * const str надо сразу делать присвоение при объявлении, иначе ошибка компиляции может быть

              SIGSEGV будет потому что 0 будет разыменован в fprintf, у нее первым параметром идет указатель FILE *
                +4
                SIGSEGV будет потому что 0 будет разыменован в fprintf, у нее первым параметром идет указатель FILE *

                Первые три индекса обрабатываются отдельно — stdin, stdout, stderr, которые суть #define STDIN ((FILE *)0) // etc Поэтому обрушится он не от разыменования, а от попытки записи в stdin.
                  +7
                  stdin, stdout, stderr — это не индексы, это стандартные потоки ввода/вывода, по сути указатели из <stdio.h>
                  extern FILE *stdin; /* Standard input stream. */
                  extern FILE *stdout; /* Standard output stream. */
                  extern FILE *stderr; /* Standard error output stream. */
                  И они не NULL.
                  Стандартные индексы тоже есть, это
                  #define STDIN_FILENO 0 /* Standard input. */
                  #define STDOUT_FILENO 1 /* Standard output. */
                  #define STDERR_FILENO 2 /* Standard error output. */
                  из unistd.h
                  Связаны эти сущности между собой через fileno, т.е. STDOUT_FILENO = fileno(stdout) и т.д.
                  Попробуйте fprintf(1, «hello») — точно так же получите SIGSEGV, потому что передаете невалидный указатель
                    +5
                    Да, вы правы, посыпаю голову пеплом.
                      +3
                      да ладно, зачем так драматизировать)
                        +5
                        Ну было бы глупо пытаться с пеной у рта доказывать свою точку зрения, особенно с учетом того, что я скачал исходники glibc, прогрепал их и убедился, что вы правы:
                        ./libio/stdio.c:FILE *stdin = (FILE *) &_IO_2_1_stdin_;
                    +5

                    Кстати, даже если бы это было так, то из-за того, что очень часто stdin в интерактивных окружениях является просто dup() от /dev/ttyN, наряду с stdout и stderr, запись в stdin приведет к печати текста в терминал.

                    +2
                    для char * const str надо сразу делать присвоение при объявлении, иначе ошибка компиляции может быть

                    Неинициализированные константы разрешены в C, но запрещены в C++.
                    Подробнее: stackoverflow.com/questions/31003713
                    +3

                    1 секунда?

                      –1
                      Почему не 20?
                        +4
                        Можно не отражать муравьев а пропускать их друг сквозь друга?
                          0
                          А разница в чём? Условия задачи отражение.
                            +3
                            Нет никакой разницы, все муравьи идентичны.
                              +5
                              Хотя в условии задачи указано отражение муравьёв, индивидуальность муравья не имеет значения для решения. С тем же успехом муравьи могут проползать мимо и продолжать путь. Тогда решение видно сразу
                                0
                                да его и так видно сразу
                                +7
                                Добавим каждому муравью бусинку своего цвета.
                                При столкновении будем не только отражать муравья, но и менять бусинки у муравьев.
                                Тогда у каждого муравья всегда есть ровно одна бусинка.
                                Каждая бусинка двигается равномерно и прямолинейно (никуда не отражается).
                                Все бусинки упадут за 1 секунду, значит и все муравьи тоже.
                                  0

                                  Но муравьи могут не упасть, они могут перебежать на другую сторону палки, вверх ногами

                              +1
                              Надо доказать невозможность существования муравьёв, идущих к центру, находящихся от края далее чем vt в любой момент [0, len/2v] = [0, 0.5].
                              Появиться он там мог только двигаясь от центра и столкнувшись в месте X в момент T с муравьём, двигавшимся в центр, (T < 0.5) && (X < Tv). Для этого его отражатель должен был (двигаясь от центра) столкнуться в t=T-dT x=X-vdT. Суммируя много раз и доходя до t=0, x<0, что невозможно.
                                0
                                Все муравьи могут упасть на край и поползти в сторону выхода не успев столкнуться друг с другом. Тут даже меньше секунды.
                                  +1
                                  Мне кажется решение должно быть каким то таким:
                                  Муравьи падают рандомно, как по направлению, так и расстоянию до конца палки.
                                  В лучшем случае если направление движения у муравьев будет в одну сторону, то все муравьи упадут с палки за 1с.Теперь если муравей упадет на самый край палки на значение 0см а выход у нас на 100см, и мы пренебрегаем размерами самого муравья, то по окончанию 1 секунды, он будет на 100 см, и все еще будет находиться на палке. при начале 2 секунды он вылетит с палки. Тоесть в лучшем случае у нас получается чуть больше секунды.
                                  Теперь обратный случай. Тут интереснее. Муравьи падают на концы палки и смотрят в центр. За пол секнуды они достигают центра, после дружно разворачиваются и за пол секунды выходят с палки. Тоесть тоже получается одна секунда плюс минус.
                                  +2
                                  1 секунда?
                                  Да, но только если в условие задачи добавить, что муравьи ползают лишь вдоль палки, что муравей при достижении конца палки обязательно падает с нее, что муравей не падает в любом другом случае. И если пренебречь временем на разворот. Сейчас же в ответе может быть и бесконечность:
                                  Имеется палка длинной в один метр. На неё случайным образом падают десять муравьёв, которые ползут в разные стороны. Скорость движения одного муравья 1 м/с. В случае если муравей встречается с другим муравьём, то он разворачивается и ползёт в противоположную сторону. Какое максимальное время нужно прождать, чтобы все муравьи упали с палки.
                                    +1
                                    что муравей не падает в любом другом случае

                                    Это как раз необязательно добавлять.
                                      +3
                                      Если не добавить, то минимальное время — меньше секунды, чтобы схватить и встряхнуть палку. Тут, вроде бы, речь шла о собеседовании программиста, а программист обязан учитывать все возможные условия выхода из цикла и тщательно вычитывать ТЗ в поисках пробелов или двусмысленностей, поэтому таки желательно добавлять все найденные замечания.
                                        +2
                                        В логических задачах всегда есть основа для применения здравого смысла, иначе под предлогом уточнения начальных данных любая задача может быть сведена к абсурду. Вы могли потребовать определения не только времени разворота, но и коэффициента трения лапок по палке (на случай, если палка из тефлона, а муравьи на роликовых коньках), действующего ускорения свободного падения (муравьи грустно зависают на концах палки в космосе), степени упругости столкновения (пусть муравьи отлетают с разной скоростью), линейных размеров муравья (упирая на вырожденные случаи, когда они превышают метр), или вот пусть автор задачи уточняет, не набрала ли система с муравьями набрала около-световую скорость при нахождении наблюдателя на Земле.
                                          +5
                                          В логических задачах всегда есть основа для применения здравого смысла
                                          И часто там подвох именно в том, что у каждого понимание «здравого» (неявных условий) разное, как в задаче с самолётом на беговой дорожке.
                                            0
                                            Задачи на подвох, внимательность и логику, это, очевидно, задачи разного типа.
                                            В заданных рамках задачка имеет понятную логическую модель и простое решение. Чего не скажешь про смехуечки типа про взлетит-не взлелит или цвет платья.
                                              +2
                                              Задачи на подвох, внимательность и логику, это, очевидно, задачи разного типа.
                                              Не очевидно. В данном посте задача про муравьев была предварена заголовком «На сообразительность» — это исключает возможность подвоха?
                                              Не говоря уже о том, что поиск подвоха требует и внимательности, и логики, а задачи на логику не исключают возможность поиска обходных путей.

                                              Если вспомнить, что обсуждалось собеседование программиста, и рассмотреть соответствующие рабочие задачи, то обычный поиск бага — это на задача подвох, внимательность или логику?
                                                0
                                                Имхо, решая логические задачи, про рабочие можно не вспоминать (обратно тоже верно). А помнить нужно то, что умение не переусложнять задачу, а мыслить максимально простыми полными абстракциями является одним из ключевых для хорошего программиста. Принцип KISS.
                                                  +2
                                                  Где тут переусложнение? В рабочих задачах нужно понимать предметную область, а чтобы решить, что по палке муравьи будут ползти строго вдоль, да ещё и одной дорожкой, мне кажется, нужно ни разу в жизни не видеть ни палки, ни муравьёв. Тем более, что в условии чётко сказано, что все 10 муравьёв ползут в разные стороны. Если сторон всего две, то как минимум 5 из них ползут в одну и ту же (а другие 5 в другую).
                                                  Серьёзно, я пока ответы не почитал, мне и в голову такое не пришло.
                                                  (потом вспомнил, что уже встречал эту задачу в школьные годы среди олимпиадных по математике, и точно так же не понял этого странного допущения).
                                                    +1
                                                    Кстати, поискал это задачку в олимпиадных, и там формулировка намного более однозначна:
                                                    По палке бегают муравьи с одинаковой постоянной скоростью. Всю палку муравей пробегает за минуту, а когда добегает до края, падает. Но когда два муравья встречаются, они разворачиваются и бегут в противоположном направлении. Докажите, что через минуту все муравьи упадут с палки.
                                                      0
                                                      То есть в данной формулировке у вас не возникли вопросы про то, ползут ли муравьи строго вдоль да еще и по одной дорожке? И не появилось предположений, что автор никогда в жизни не видел ни палок, ни муравьев?
                                                        +1
                                                        Нет, потому что в этой формулировке муравей может хоть кругами, хоть зигзагами бегать. Главное — что за 1 секунду он добирается из конца в конец.
                                                        +1

                                                        Нашел немного усложненную.


                                                        задача

                                                        This is from one of my favorite puzzle books, "Mathematical Mind-Benders". The first is a standard interview puzzle. The rest are variations on it, each requiring a unique insight.


                                                        The set up for all puzzles is: drop 25 ants randomly on a 1 meter rod. Each ant faces left or right with probability 50/50. Ants walk with speed 1cm/s. Whenever two ants colide they reverse direction. When ants reach the end of the rod, they fall off. The middle ant is called Alice.


                                                        (A) How long until Alice is guaranteed to fall off?


                                                        (B) What's the probability that Alice falls off the end she was originally facing?


                                                        © What's the probability that Alice is the last ant to fall off the rod?


                                                        (D) What's the expected number of collisions between ants?


                                                        (E) What's the expected number of collisions with Alice?


                                                        (F) What's the probability that Alice has more collisions than any other ant?


                                                        (G) Suppose Alice has a cold, which is transmitted when ants colide. How many ants will get sick?


                                                        (H) Suppose there's now only 24 ants and they are on a 1 meter long circle. What's the probability that Alice is back where she started after 100 seconds?

                                                          0

                                                          (A) 100 секунд. Модель муравьев с бусинками-именами. У Алисы единственной есть бусинка. При столкновении двух муравьев они мгновенно проходят друг против друга но передают бусинку. Можно однозначно построить траекторию бусинки от того муравья, который ее уронит в самом конце до начального муравья. Понятно, что Алиса может быть любым из упавших муравьев, а значит может быть и последней.


                                                          (B) Вероятность — (n+1)/2n = 26/(225) = 52%. Допустим алиса k-ая по порядку и изначально и смотрит влево. Она упадет слева только если k или больше муравьев всего смотрит влево. Ведь, слева упадет ровно столько муравьев, сколько смотрит влево изначально. Но раз они не проходят друг сквозь друга, сколько-то первых упадет слева, а остальные справа. Осталось просуммировать по всем позициям и возможному количеству муравьев смотрящих влево.
                                                          Т.е. суммируем 1/(n*2^(n-1))*sum_{k=1..n} sum_{j=k-1..n-1} C(n-1, j-1). Меняем порядок суммы и там нужна будет формула суммы (i+1)
                                                          C(n,i).


                                                          © 1/n. Алиса упадет последней, если последний упавший обезличенный муравей будет держать бусинку. Это будет если один конкретный из n муравьев держал бусинку в самом начале. С вероятностью 1/n он и будет алисой.

                                                            0
                                                            Each ant faces left or right with probability 50/50.
                                                            Отлично, отлично
                                                          +1
                                                          Если сторон всего две, то как минимум 5 из них ползут в одну и ту же (а другие 5 в другую).

                                                          То, что как минимум 5 из них ползут в одну и ту же сторону — верно.
                                                          То, что другие 5 ползут в другую сторону — неверно.
                                                            0
                                                            То, что как минимум 5 из них ползут в одну и ту же сторону — верно.
                                                            То, что другие 5 ползут в другую сторону — неверно.
                                                            А в какую же сторону тогда ползут другие, если в эту — только 5? Варианта «стоят на месте» в задаче не описывалось.
                                                              +1

                                                              Не только, а минимум. Все 10 могут ползти в первую сторону

                                                                +1
                                                                О минимуме чего вы тогда говорите? Я писал про минимальный размер группы, движущейся в одном направлении. При нём 5 будут двигаться в одну сторону, а другие 5 — в другую. Во всех остальных вариантах одна из групп будет состоять более, чем из 5 муравьёв, и это уже не минимум.
                                                  0
                                                  В логических задачах всегда есть основа для применения здравого смысла
                                                  Среди задач также встречаются задачи на внимательность.

                                                  иначе под предлогом уточнения начальных данных любая задача может быть сведена к абсурду. Вы могли потребовать определения
                                                  Мог, но не потребовал, именно потому, что у меня не было задачи сведения к абсурду.

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

                                                  Ничего не рефакторить, чтобы не сломать, или переделывать всё? Со всеми соглашаться или всем отказывать? Молча принимать нечеткое ТЗ или придираться к каждой букве, бесконечно требуя пояснений? Крайности обычно являются худшим выбором из возможных вариантов.
                                                    –1
                                                    Если честно, то выглядит так, как будто вы не смогли решить простую задачку, и сейчас, досадуя, занимаетесь софистикой.
                                                      +3
                                                      Вы могли потребовать определения…
                                                      вы не смогли решить простую задачку, и сейчас, досадуя, занимаетесь софистикой...
                                                      Есть две крайности — молча принимать ТЗ с пробелами или бесконечно уточнять ТЗ. Мое мнение — обе крайности плохи, полезно выдержать баланс, заполнить ключевые пробелы и выдать решение.
                                                      Что лично я и сделал выше — 1 секунда при таких-то допущениях.
                                                      Почему Вы свели это к «не смог простое, досадует, софистика» — не знаю, но мне не интересно обсуждать меня или Вас, поэтому предлагаю закончить диалог.
                                                  +1
                                                  Если не добавить, то минимальное время — меньше секунды

                                                  Возможно, но минимальное время никого не интересует.
                                            +5
                                            Строго говоря, на шине I2C нет терминаторов — только подтягивающие резисторы. :)
                                              –1
                                              Тут скорее опечатка. Но для чего они нужны?
                                                +3
                                                Для формирования высокого логического уровня. Линии шины I2C управляются выходами с открытым коллектором/стоком, которые требуют подтяжки к питанию.
                                                  +3
                                                  Всё верно, вы приняты. Когда сможете выйти на работу?
                                                    +1
                                                    за «железки» столько не платят :)
                                                    Сам сижу в разработке под мобилки и отправляю комментарии по IOT разработчикам
                                                  0
                                                  может чтоб длину увеличить?
                                                    +1
                                                    К сожалению в нашу компанию требуются специалисты, которые не строят гипотезы, а готовы разбираться в вопросе и решать задачи.
                                                      +1
                                                      так у вас кастинг?)
                                                        +3
                                                        Нет, я просто иронизирую :)
                                                          0
                                                          я тоже)
                                                          А пример кода обхода дерева не покажете? оно там в задании 3 есть
                                                            +1
                                                            не покажу, так как могу подставить компанию.
                                                              +1
                                                              понял
                                                +3
                                                return *(uint32_t * (&a)) > b — тут вернет 1, т.к. из отрицательного числа делаем большое положительное
                                                  0
                                                  Гораздо интереснее получилась бы задачка, если бы a и b были разных размерностей. В этом случае результат зависел бы от типа процессора, точнее, от endianess :)
                                                  +3
                                                  Если бы было сформулировано «какое минимальное время нужно прождать», тогда можно было бы рассуждать, 1 сек или 20 сек. А так правильный ответ — бесконечность.
                                                    –1
                                                    Почему? Это всё пальцем в небо.
                                                      +1
                                                      Дадим каждому муравью секунду на реакцию — итого 19 секунд.
                                                        +3
                                                        В задаче не указано что делает муравей достигнув края палки. Может падает, может вверх головой по нижней стороне ползет, может просто обратно ползет, а может в ступоре замирает.

                                                        Итого имеем задачу на сообразительность при нечетко поставленном ТЗ. Вы точно всё ещё хотите работать в нашей компании?
                                                          0
                                                          То есть вы как соискатель начали собеседовать HR? Блестяще, вам скажу :)

                                                          Итого имеем задачу на сообразительность при нечетко поставленном ТЗ.

                                                          Интервью очное и ТЗ можно уточнить.
                                                            +1
                                                            Моё мнение, что на собеседования стоит ходить где-то не реже, чем раз в пол года, даже если вы обожаете свою работу, и не хотите её менять.
                                                            Соответственно при таком подходе идёт знакомство с тараканами «и на той стороне», чтобы знать куда не обращаться при поиске работы.
                                                            +2

                                                            Условие как компромисс.


                                                            ТЗ вы тоже будете согласовывать формально, начиная с определений, что для счёта используется стандартное определение натуральных чисел, удовлетворяющее аксиомам Пеано?

                                                              +1
                                                              Вот так зайдёшь в комменты к рандомной статье, а тут тебя цитируют. Приятно, честно скажу.
                                                            +7
                                                            Т.к. муравьи падают на палку случайным образом, т.е. под разными углами, то путь, пройденный муравьем, зависит не только от длины палки, но и от ее диаметра и от угла, под которым он упал (спираль же). В случае если муравей ползет перпендикулярно палке, он никогда не доползет до ее конца.

                                                            PS Если там все же подразумевается плоскость, а не палка, то одна секунда, да.
                                                              0
                                                              Скорость муравья 1 м/с. Какой траектории вы от него ожидаете на этом расстоянии, учитывая, что палка прямая?
                                                                +11

                                                                Палка — объект, а не абстракция. Хорошая модель палки — цилиндр. Соответственно, ожидаю, что в худшем случае муравей будет двигаться по окружности, в типичном- по спирали

                                                                0
                                                                А плоскость так вообще бесконечна во всех 4 направлениях.
                                                                  +1
                                                                  во всех ∞ направлениях, я бы сказал
                                                                    0
                                                                    Я имел в виду 2 оси координат.
                                                                +2
                                                                Есть более подходящие формулировки задачи.
                                                                Например, «Найдите точную нижнюю оценку максимального времени через которое муравьи упадут с палки.» © Интернет.
                                                                Или «максимальное время падения последнего муравья с палки».
                                                                  +4
                                                                  Или «максимальное время падения последнего муравья с палки».

                                                                  Это зависит от того с какой высоты он будет падать.
                                                                    0

                                                                    И какая сила тяжести в месте падения :)

                                                                      +1
                                                                      Ага: g, сопротивление атмосферы (если есть), модель муравья для вычисление этого сопротивления…
                                                                  0
                                                                  Потому что палка — не одномерное пространство, у неё есть поверхность, по которой каждый муравей может ползти в любом направлении. Например, по кругу.
                                                                    0
                                                                    Ну вообще для точного решения не хватает более развёрнутых условий.
                                                                    Например: муравьи в штатном своём состоянии вполне способны ползать по палке вверх ногами. Поэтому, нам надо принять что муравьи всё же падают с палки (или нет, так как возможно это и есть правильный ответ — они будут ползать по палке пока не помрут с голоду, в случае если эта палка левитирует над землёй).
                                                                    Длина муравьёв тоже нужна: если принять, что это сферический муравей в вакууме и его длина равна нолю, то в секунду у нас с палки свалятся все муравьи: крайних муравьёв просто некому останавливать и в худшем случае, если столкновение муравья и толпы произошло на самой границе палки, одному из конечных муравьёв как раз потребуется 1 секунда на её преодоление.
                                                                      0
                                                                      пока не помрут с голоду

                                                                      Саму эту палку пусть и едят.
                                                                      Тогда будут по ней ползать, пока она не прекратит существовать.
                                                                  +11
                                                                  Самое необычное… Мне показали программный код другого человека, не знаю был ли он специально так написан или нет, но программа явно была внутренней корпоративной, и смотрю я этот уровок кода из программы и понимаю, что здесь было бы не плохо сделать иначе, а тут место тонкое и прочие-прочие такие моменты и так увлекся всем этим, что параллельно на листке начал писать исправления, а когда обрывок кода начал заканчиваться, я начал мыслить абстрактно(ведь суть программы понял), что тут должен быть такой класс, а тут такой, связь такая и т.д. и т.п., и вот я заканчиваю данный поток мыслей, и понимаю, что человек, который здесь ведущий программист, и собеседует меня на обычного программиста — автор кода.
                                                                    +1
                                                                    Разумеется техническое интервью вы не прошли )
                                                                      +3
                                                                      Именно так с формулировкой: У Вас хорошие знания и навыки, но этого недостаточно для работы у нас. Мы Вас внесли в архив кандидатов и как только откроется менее требовательная должность, с Вами свяжутся.
                                                                      Никто не перезвонил, несколько лет прошло, сильно видимо обиделись.
                                                                    +5
                                                                    return *(uint32_t * (&a)) > b

                                                                    Я мысль понял, а компилятор — нет. Надо
                                                                    return *((uint32_t *) &a) > b;
                                                                      –1
                                                                      Ну это прям опечатка, которая была в процессе набора статьи :).
                                                                      +3
                                                                      для инвертации битов можно воспользоваться операцией ~
                                                                        +3
                                                                        Обычно имеют в виду «развернуть задом наперёд», т.е. 0b1101 <-> 0b1011
                                                                        +2
                                                                        Ну, не знаю, на сколько интересное, но абсолютно глупое задание:«Написать „Hellow, World!“ без единой ';' ». На Си.
                                                                          0
                                                                          Тут я подзавис, это как?
                                                                            +2
                                                                            Давайте дадим людям подумать! Подсказка. Именно в Вашем main.c не должно быть ';'.
                                                                              +7
                                                                              -Dsemicolon=; что ли?
                                                                                0
                                                                                hello.c:
                                                                                /* Hellow, World! */
                                                                                #include «hello.h»
                                                                                int main () {
                                                                                PRINT
                                                                                RETURN0
                                                                                }

                                                                                hello.h:
                                                                                #include <stdio.h>
                                                                                #define PRINT printf(«Hellow, World\n»);
                                                                                #define RETURN0 return(0);
                                                                              +8
                                                                              int main()
                                                                              {
                                                                                  if(printf("Hello world!")) {}
                                                                              }
                                                                              
                                                                                +2
                                                                                Верный ответ!
                                                                                  +1
                                                                                  Только return нет и нормальный компилятор должен бросить critical предупреждение.
                                                                                    +2
                                                                                    так лучше?)
                                                                                    int main()
                                                                                    {
                                                                                        if(printf("Hello world!")) {}
                                                                                        while(true) {}
                                                                                    }
                                                                                    

                                                                                    хотя не уверен что на отсутствие return в main компилятор ругается, по краней мере gcc, который у меня под рукой, для main такого предупреждения не генерит.
                                                                                      +4
                                                                                      Откуда вы взяли true без инклудов? :D
                                                                                        +2
                                                                                        Так хуже, потому что вечный цикл без побочных эффектов — это UB, и компилятор имеет право не напечатать ничего, или напечатать что-нибудь другое.
                                                                                        +3
                                                                                        void main(void)
                                                                                        {

                                                                                        }

                                                                                        В принципе, это и было мое решение.
                                                                                          +2

                                                                                          Возврат void из main не соответствует стандарту, ЕМНИП.

                                                                                            0
                                                                                            C++ его запрещает прямым текстом, но C допускает:
                                                                                            It shall be defined with a return type of int and with no parameters:
                                                                                            int main(void) { /* ... */ }
                                                                                            or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared):
                                                                                            int main(int argc, char *argv[]) { /* ... */ }
                                                                                            or equivalent; or in some other implementation-defined manner.
                                                                                              0

                                                                                              Прикольно, не знал, что плюсы от сей здесь отличаются. Спасибо.

                                                                                          +2
                                                                                          Нет, не должен.
                                                                                          C99 n1256, 5.1.2.2.3: «reaching the } that terminates the main function returns a value of 0.»
                                                                                            0
                                                                                            *нормальный* компилятор должен. Стандарт, к сожалению, адекватно не объясняет, почему:
                                                                                            I looked it up. I believe this was introduced with C99, and apparently the C99 rationale is defect. It has comments for 5.1.2.2.1 Program startup, then labels the next chapter 5.1.2.3 Program execution. It should have been 5.1.2.2. As a consequence of this, the rationale for Program termination that should have been in the real chapter 5.1.2.3, has gone missing in action. Thus, main allows no return code in C99 and there exists no rational reason why. – Lundin Oct 10 '13 at 11:03


                                                                                            main без return не просто выглядит странно, он нарушает работу парсеров и анализаторов, которые видят int f(), но не видят ret.
                                                                                              +1
                                                                                              *нормальный* компилятор должен

                                                                                              gcc не жалуется. А какой компилятор «нормальный» и жалуется, хотя бы один?
                                                                                                –3
                                                                                                А никто и не сказал, что он есть. Отсутствие return в main — это признак овнокода или какой-то неадекватности. Даже на совместимость со старым кодом это не списать, потому что C89/90 заявляет, что это *обязательное* действие. Поэтому в стандарте на C99 это выглядит глупо. Компилятор не-курильща должен предупредить что там такая лажа и собрать код.
                                                                                                  +3
                                                                                                  C89/90 заявляет, что это *обязательное* действие.

                                                                                                  Нет, не заявляет. Там было «If the main function executes a return that specifies no value, the termination status returned to the host environment is undefined.» — т.е. C99 только изменил undefined на 0, по поводу корректности программы ничего не поменялось.

                                                                                                  Ну а ваши фантазии по поводу «компиляторов не-курильща» не имеют никакого отношения к реальности. Стандарт такой, какой есть, и компиляторы такие, какие есть. Если вам не нравится Си, пользуйтесь другими языками.
                                                                                                    –2
                                                                                                    status returned to the host environment is undefined.

                                                                                                    заявляет, что это *обязательное* действие.

                                                                                                    Нет, не заявляет.

                                                                                                    Undefined behaviour — это не то, что вы хотите в программе. Поэтому стандарт заявляет, что вы должны сделать действие чтобы не получить UB.
                                                                                                      +1
                                                                                                      Undefined behaviour возникает при чтении undefined value, т.е. вне рассматриваемой программы, если её код возврата кем-то читается. На корректность самой программы это не влияет.

                                                                                                      (В качестве поясняющего примера: неинициализированная переменная имеет undefined value, но если неинициализированную переменную не читать, то undefined behaviour не происходит, и программа полностью корректна.)

                                                                                                      В любом случае, это в стандарте исправили 21 год назад.
                                                                                                  0
                                                                                                  Раньше у WatcomC это была ошибка, сейчас проверил OpenWatcom 1.9 — только варнинг.
                                                                                              +2

                                                                                              return в main не обязателен.

                                                                                              0
                                                                                              А теперь давай без фигурных скобок, чтобы уж совсем наркоманство :)
                                                                                                0
                                                                                                Уже было: habr.com/ru/post/275861
                                                                                                (Надо только заменить int[] на char[])
                                                                                                  +1
                                                                                                  В том посте испоьзуются фигурные скобки. Я имел в виду триграфы :D
                                                                                                    0
                                                                                                    В том посте испоьзуются фигурные скобки.

                                                                                                    Именно поэтому надо заменить int[] на char[]

                                                                                                    Я имел в виду триграфы :D

                                                                                                    Их удалили в C++17
                                                                                                      +1

                                                                                                      Триграфы в С ещё существуют, согласно википедии

                                                                                                        +1
                                                                                                        Понял, вместо {...} можно будет "..." написать. Тогда да, было уже.
                                                                                                        Жаль, что удалили. Теперь рекрутерам даже спросить нечего на собеседовании…
                                                                                                +1
                                                                                                gcc '-DSEMICOLON=;' main.c
                                                                                                  0
                                                                                                  int main () {
                                                                                                      switch(printf("Hello world!\n")){}
                                                                                                      while(printf("Hello world!\n") == 0){}
                                                                                                  }
                                                                                                  +1
                                                                                                  int32_t a = -200;
                                                                                                  uint32_t b = 200;
                                                                                                  return *(uint32_t * (&a)) > b


                                                                                                  Тут прикол в том, что код написан неверно? Или что приведенный к uint -200 (0x FF FF FF 38) будет больше чем 200?
                                                                                                    0
                                                                                                    Надо дать ответ что будет в результате.
                                                                                                      0
                                                                                                      Ну 1, конечно, если ошибку поправить.
                                                                                                        0

                                                                                                        Для ответа на этот вопрос необходимо обратится к стандарту. Не могу уверенно говорить на C, но в C++ такая запись приводит к неопределенному поведению, так как формат записи знаковых чисел не задан. Предположения о "two's complement" знаковых чисел может привести к очень серьезным головным болям при отладке.


                                                                                                        Поэтому правильный ответ на этот вопрос — undefined behavior или зависит от платформы.


                                                                                                        http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2218.htm#c-sign

                                                                                                          0

                                                                                                          Я ошибся. При всех вариантах записи отрицательных чисел результат будет 1, так что поведение однозначно.

                                                                                                            0

                                                                                                            Начиная с C++20, кстати, задан, и теперь это обязан быть two's complement.

                                                                                                      +1

                                                                                                      Про муравьёв 5 секунд(максимум 5.5)… каждую секунду с двух концов падает 2 муравья...(а тот движняк что между крайними нас не волнует)

                                                                                                        0
                                                                                                        Нет.
                                                                                                          0

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

                                                                                                            +1
                                                                                                            Муравьи бегают по палке пока не устанут. Или не сгорят от трения.
                                                                                                            ~70 шагов в секунду, сильно
                                                                                                              +2

                                                                                                              А чего муравьям вообще падать? Им ведь не важно положение, если поверхность достаточно не гладкая.

                                                                                                                0
                                                                                                                Выше есть готовое решение.
                                                                                                                  +2

                                                                                                                  Это где про бусинки? Не согласен… в том варианте вообще вообще количество муравьев не важно… хоть миллиард их… всегда секунда будет

                                                                                                                    +5
                                                                                                                    В этом и прелесть абстрактных задач.
                                                                                                                    Ахилл черепаху по ним тоже, извините, не обгонит)
                                                                                                                      0
                                                                                                                      Вариация решения с бусинками: выберем наихудший случай, два ползут с двух разных концов палки и встречаются в середине, отразившись ползут к краям. Шестой «Б», кто пояснит, почему этот случай наихудший?
                                                                                                                        +1

                                                                                                                        Я согласен с решением 1 секунда… просто мозг выносит, что не зависит от количества насекомых :-)

                                                                                                                          0

                                                                                                                          Дак они же параллельно все двигаются. Допустим, они все идут только в одну сторону изначально (никто ни с кем не столкнется). Понятно же, что тут время зависит только от длины палки, а не от количества муравьев? Или это тоже мозг выносит?

                                                                                                                            0
                                                                                                                            а вы возьмите на листочке в клетку начертите горизонтальный отрезок (до 10 см — нормально) и постройте две ограничивающие вертикали по его краям,
                                                                                                                            и стройте на нем траектории муравьев (по оси ординат — время) в виде линий под углом 45 градусов. Отрезок — это «палка», пересечение траектории с вертикальными линиями — это «падение»
                                                                                                                            Сразу заметно, что
                                                                                                                            1) один муравей в самом максимальном случае сможет ползать 1 секунду
                                                                                                                            2) столкновения 2х муравьев — это пересечение траекторий, оно не удлиняет и не укорачивает суммарное время (т.е. максимум из их траекторий)
                                                                                                                            3) ну и по индукции таких столкновений может быть хоть 100 (можно для эксперимента почертить пяток прямых, а потом раскрасить — как там ползал каждый муравей)
                                                                                                                              +1
                                                                                                                              Очень бородатая задача, но может кто не в курсе
                                                                                                                              Два поезда, находившиеся на расстоянии 200 км друг от друга, сближаются по одной колее, причем каждый развивает скорость 50 км/ч. С ветрового стекла одного локомотива в начальный момент движения взлетает муха и принимается летать со скоростью 75 км/ч вперед и назад между поездами, пока те, столкнувшись, не раздавят ее. Какое расстояние успевает пролететь муха до столкновения?
                                                                                                                                0
                                                                                                                                Ну эту я сразу решил, а вот с муравьями и правда как то взрыв мозга.
                                                                                                                                  0
                                                                                                                                  С муравьями напоминает интерференцию волн. Когда не важно, отталкиваются волны или проходят друг сквозь друга — картина одинаковая.
                                                                                                                          0
                                                                                                                          Погодите, погодите, меня понесло. Какой ответ в итоге, 1 секунда?
                                                                                                                            0

                                                                                                                            Да. Максимум за одну секунду они все упадут.

                                                                                                                            0
                                                                                                                            Какое максимальное время нужно прождать, чтобы все муравьи упали с палки.

                                                                                                                            Идеальные условия для эксперимента — диаметральные векторы и равноудаленность
                                                                                                                            муравьев друг от друга?

                                                                                                                            Половина расстояния между муравьями х8, это пройдут все стукалки.
                                                                                                                            Дальше они еще разок стукаются в серединке — девятое 0.55 и проходят
                                                                                                                            по половине палки — полметра.
                                                                                                                            ~0.995 очень грубо. Если бы я хотел впечатлить работодателя —
                                                                                                                            то смоделировал бы ему самую плохую ситуацию. С учетом «столкновений» — в финансовой сфере

                                                                                                                        –1
                                                                                                                        Нет. Там должна быть экспонента. По идее…
                                                                                                                        Теперь рассуждаем:
                                                                                                                        — муравьи, которые бегут от центра, если нет препятствий, упадут не позднее 0.5 секунды
                                                                                                                        — муравей, который оказался между двумя муравьями, бегущими к центру, даст им центробежный :) импульс
                                                                                                                        — а с чего я взял, что муравьи как-то взаимодействуют? максимальное время при описанных условиях — 10 секунд. Муравей падает на конец палки, проползает 1 метр и падает с другого конца. И так — 10 раз.
                                                                                                                        +1
                                                                                                                        На «бареметалл» еще такое любят: Есть очень простой контроллер, с минимальным ОЗУ, допустим, PIC16F873, он «нюхает» RS-485. По интерфейсу передается пакет, состоящий из 32х битных чисел. Формат, начало и конец пакета известны, известно, что каждое число передается четное количество раз. Так же известно, что канал 100% надежен. А поток может быть ОЧЕНЬ длинный. Но 1 число из выборки передается нечетное количество раз. Как его найти?
                                                                                                                          +6
                                                                                                                          Вопрос на знание XOR. Ответ применить XOR ко всем элементам.
                                                                                                                          Олимпиадные задачи которые можно знать но в реальной жизни применения не видел.
                                                                                                                            +1
                                                                                                                            Всем спасибо, верный ответ! Но это не олимпиада, а реально применимая вещь. Сам часто применяю, к сожалению, по соображению неразглашения не смогу сказать где…
                                                                                                                              0

                                                                                                                              Вы лучше скажите, как в последовательности целых чисел, где каждое число, кроме одного, содержится трижды, а то одно число — единожды. Тоже решаемо за константное время. Конечно, если знаешь про решение с xor, додуматься сильно проще.

                                                                                                                                0
                                                                                                                                Хм, неужели накапливать произведение всех (−½ + ½√3 i) ^ x?
                                                                                                                                  +3

                                                                                                                                  Вы, наверно, имели ввиду линейное время и константную (вернее, O(log max_int)) дополнительную память? Так-то числа все прочитать надо обязательно, поэтому быстрее чем за линию вы никак ответ не найдете. Если можно не константную дополнительную память — то можно хэш таблицей сделать.


                                                                                                                                  Логично сделать решение через обобщение xor на троичную систему счисления: тупо складываем все цифры в троичной системе счисления отдельно и берем по модулю 3. Останется только то единственное число. Переводим его назад.


                                                                                                                                  Можно делать с переводом в троичную систему счисления делением на 3. Хранить цифры в двух битах, например. Памяти будет требовать все то же O(log max_int) — ровно 2 переменные для хранения суммы в троичной системе счисления и еще 2 для текущего числа). И работать будет за линейную сложность (разрядов меньше log(max_int) — линейно от размера входных чисел).

                                                                                                                                    0
                                                                                                                                    Вы, наверно, имели ввиду линейное время и константную (вернее, O(log max_int)) дополнительную память?

                                                                                                                                    Именно, это меня что-то переклинило.


                                                                                                                                    Логично сделать решение через обобщение xor на троичную систему счисления: тупо складываем все цифры в троичной системе счисления отдельно и берем по модулю 3. Останется только то единственное число. Переводим его назад.

                                                                                                                                    Ну вот я так и сделал, да. На битовых операциях.

                                                                                                                                +1
                                                                                                                                не успел(
                                                                                                                                  +1
                                                                                                                                  Военка детект.
                                                                                                                                    0
                                                                                                                                    Отнюдь. 100% «гражданка».
                                                                                                                                      0
                                                                                                                                      В гражданке такое лично не замечал до этого момента, думал какой-то чисто сапоговый метод.
                                                                                                                                        0
                                                                                                                                        Я не про саму задачу, она — именно на XOR, а про подход. Буквально таким образом недавно искал пропавший пакет. Модули связаны по FIFO, мастер передает пакет слейву, слейв обрабатывает и возвращает респонз. И, блин, из нескольких тысяч — один респонз не прилетает. Да, все асинхронно. Слейв может тасовать пакеты, как ему удобнее. Вычленил пакет, ксоря индексы запросов и подтверждений на подготовленном наборе данных, дальше — отладка уже легче пошла. Да, аппаратно-программный дебаг — еще тот танец с бубном…
                                                                                                                                  +3
                                                                                                                                  Как работать с cmake?


                                                                                                                                  Хороший вопрос. Правильный ответ есть? ;)
                                                                                                                                    +16
                                                                                                                                    sudo rm `which cmake`
                                                                                                                                      +2
                                                                                                                                      Хороший ответ. А вы точно программист? ;)
                                                                                                                                      Заголовок спойлера
                                                                                                                                      Удалять желательно так же как ставили.
                                                                                                                                        +1

                                                                                                                                        Это да. Но, с другой стороны, в комментарии tzlom приведён единственный абсолютно портабельный способ работающий на любом *NIX. :)

                                                                                                                                          0
                                                                                                                                          Не абсолютно: sudo может быть не установлено, или права юзеру достаточные в sudo не выданы.
                                                                                                                                            +1

                                                                                                                                            А ещё может не быть и самого cmake. Но как всё это относится к портабельности?

                                                                                                                                    –6

                                                                                                                                    Встречаются достаточно часто фирмы, которые собеседуют не по теме вакансии, а потом удивляются почему за месяц человек ничего не сделал. Ну правильно! Логичнее же поиграть в американскую игру "предложите ваш оклад", а мы послушав, может и скажем сколько наша фирма модет вам заплатить. У нас же из моды американский опыт не уходит. Хотя американские программисты на порядок слабее русских!

                                                                                                                                      +7
                                                                                                                                      Хотя американские программисты на порядок слабее русских!


                                                                                                                                      Поэтому русские основали свой facebook, Microsoft, google и построили силиконовую долину.
                                                                                                                                        +10
                                                                                                                                        построили силиконовую долину.

                                                                                                                                        которая на порядок круче кремниевой
                                                                                                                                          –3
                                                                                                                                          Заголовок спойлера
                                                                                                                                          image
                                                                                                                                            +7

                                                                                                                                            Не скажу насчёт программистов, но компании основывают предприниматели

                                                                                                                                              –5
                                                                                                                                              google

                                                                                                                                              Основан русскими. Ну, или советскими.

                                                                                                                                                +2
                                                                                                                                                Простой советский парень из Саратова Ларри Пейдж?
                                                                                                                                                  0
                                                                                                                                                  + советский парень Сергей Брин
                                                                                                                                                    +6
                                                                                                                                                    Сергей Брин эмигрировал с родителями в США в возрасте шести лет. Поэтому фраза «простой советский ребёнок» подошла бы, а вот «парень» — уже нет. И тогда для корректности комментарий, начавший ветку, должен звучать так:
                                                                                                                                                    Основан советскими детьми
                                                                                                                                                    :D
                                                                                                                                              +3
                                                                                                                                              Ну, на мой взгляд, вопросы, которые автор привел, на 100% соответствуют его специальности. Но, кроме муравьев, наверное. Меня самого такие задачки бесят. Я, в принципе, на 80% вопросов сразу ответ дал. Единственное, не являюсь именно Linux системным программистом, на голом железе, по этому вещи, касательные ядра — не в курсе…
                                                                                                                                              +1
                                                                                                                                              Задачка с собеседования. Что выведет программа? Решить без запуска. В тексте незначительные ошибки, чтобы сразу не скомпилировалось.
                                                                                                                                              Самая наркоманская задачка такого рода из тех, что я видел :)
                                                                                                                                              float bon_jovi[4][4]=
                                                                                                                                               { {0,   2,    0.5,   2},
                                                                                                                                                 {1,   3,    3 ,    0},
                                                                                                                                                 {2,   0.5,  0,     1},
                                                                                                                                                 {0,   0,    0,     0}
                                                                                                                                               }
                                                                                                                                              
                                                                                                                                              #define FIRST_SONG 3
                                                                                                                                              #define LAST_SONG 1
                                                                                                                                              #define CD 0
                                                                                                                                              #define ARTIST 1
                                                                                                                                              
                                                                                                                                              void f(float *p, int jazz, int hiphop)
                                                                                                                                              {
                                                                                                                                                int high_rating=0;
                                                                                                                                                int low_rating=high_rating
                                                                                                                                                int music;
                                                                                                                                                float sum=0.0;
                                                                                                                                              
                                                                                                                                                for (music = jazz; music <= hiphop; music++)
                                                                                                                                                {
                                                                                                                                                    sum += *(p++)
                                                                                                                                                    if ( p[music])
                                                                                                                                                      high_rating++;
                                                                                                                                                    else
                                                                                                                                                      ++low_rating
                                                                                                                                                }
                                                                                                                                              
                                                                                                                                                p--;
                                                                                                                                                sum += *(--p)
                                                                                                                                              
                                                                                                                                                printf("%d %d %f", high_rating, low_rating, sum)
                                                                                                                                              }
                                                                                                                                              
                                                                                                                                              int main()
                                                                                                                                              {
                                                                                                                                                f(&bon_jovi[CD][ARTIST], LAST_SONG, FIRST_SONG)
                                                                                                                                              
                                                                                                                                                return 0;
                                                                                                                                              }
                                                                                                                                              
                                                                                                                                                +1
                                                                                                                                                Спойлер

                                                                                                                                                "2 1 5"?


                                                                                                                                                Действительно, наркоманская задачка.

                                                                                                                                                  +1
                                                                                                                                                  Получилось вручную посчитать? Круто! Я во время собеседования третье число не угадал, но провалился не из-за этого :)
                                                                                                                                                    0

                                                                                                                                                    В ручную, но сначала тоже не правильно подсчитал третье число. Проглядел второй декримент у p в конце.

                                                                                                                                                +1
                                                                                                                                                Единственный адекватный способ понять куда идти, и какие течения сейчас есть – это ходить на собеседования.

                                                                                                                                                Чтобы обойти или влиться?
                                                                                                                                                Пароход вы или плот?
                                                                                                                                                  0
                                                                                                                                                  Какое-то хайповое поветрие — ходить по собеседованиям чтоб что-то и выходить из зоны комфорта чтобы еще что-то. Понимаю, кто-то, когда-то сказал, в мантру превратилось.
                                                                                                                                                  Рандомно общаться с неадекватами, потратить свое и их время (твое ты потратил, фиг бы с ним, а вот чужое — это уже $$$), ради повышения твоего ЧСВ и возможно получения тебе же какого-то пинка, для саморазвития за чужой счет и увеличение процента неадекватов с точки зрения HR, HR звереет, руководители стонут во все стороны- «ну что вы хотите, адекватов не найти, только сегодня 1488 человек отсобеседовали», ну и прибыли владельцам hh.xx, job.xx и иже с ними?
                                                                                                                                                  Если есть ощущение, что надо развиваться- надо развиваться, курсы, петы, хобби, если не устраивается работа, уровень оплаты, график- его надо менять.
                                                                                                                                                  А вот такое хождение по собеседованиям- по мне сродни мелкой кражи, как тырить туалетную бумагу из общественного туалета, вроде мелочь, кто-то закрыл свою потребность, но в итоге кому-то от этого может стать не очень хорошо.
                                                                                                                                                    +6
                                                                                                                                                    Компания получает хорошего кандидата в архив + с большим шансом, что если собеседование прошло отлично, когда у программиста позникнет потребность — он перейдет именно в эту компанию. Так что про деньги не все так однозначно. Особенно, если вспомнить про «тестовые рабочие» задачи.
                                                                                                                                                    А разговоры про прибыль хх.ру — вообще нонсенс, так можно дойти и до покупки товара по каждой первой рекламе — а что? — компания потратилась на рекламу, сотрудники рекламной компании придумали дизайн, повесили объявления — а ты, тунеядец и просто козёл, прошел мимо и не купил.
                                                                                                                                                      –1
                                                                                                                                                      И от сюда растет букет идиотизма и злоупотреблений, от тестовых заданий на сутки и спасибо, мы вам перезвоним, ошибочные завышенные требования в стиле — о эта вакансия так популярна, Вася, за забором 50 человек стоят.
                                                                                                                                                      Для соискателя услуги рекрутерских и компаний агрегаторов объявлений вроде бы не стоят ни чего, а вот для работодателей уже ощутимо, что обратно ударяет по соискателям, просто об этом еще не говорят вслух, но рынок сильно монополизирован тот же hh уже может выставлять ценник за свои услуги почти любой.
                                                                                                                                                      Про рекламщиков- мне совершенно не нужна их услуга, и по факту она является навязанной, так как в стоимость любого изделия не малая доля уходит к ним, спам со всех сторон, даже на федеральных каналах, заклеенные подъезды и столбы — будь моя воля — запретил бы как класс.
                                                                                                                                                      +5
                                                                                                                                                      Обычно, если ты берёшь высокую планку, то ты либо устраиваешься туда и работаешь, либо понимаешь что тебе не хватает и идёшь учиться. А вот рекомендации мол «учись» — лабуда, так как непонятно чему учиться. А после собеседования сразу понятно что нужно изучать. На одном собесе мне прямо так и сказали: иди и учи QT.

                                                                                                                                                      А на счёт воровства бумаги, это не так, ибо это работа HR искать и собеседовать, и если им что-то не нравится, то работу надо менять. И я собеседовал сам, такое количество фарша насмотрелся, уууу. Поэтому эффективный способ сначала смотреть код, а потом остальное.
                                                                                                                                                        –2
                                                                                                                                                        Берешь высокую планку, находишь вакансии под нее, смотришь требования, открываешь молескин, выписываешь дифф от того, что сегодня имеешь, идешь забрить не достающее.
                                                                                                                                                        Находишь человека, работающего на интересующей должности, если ты увлекающийся и вообще тру профи, не составит труда, кстати все эти митапы, выставки, конференции и кружки по интересам, в 2020 социалки и даже боюсь этого слова- чатики- как раз инструменты для этого, а не обивание порогов HR, далее по тексту, ткнут носом и еще помогут подтянуть, а потом мимо HR проведут.
                                                                                                                                                        Сам собеседовался и собеседовал, был бы рад, если меньше народу бродило за волшебным пинком и был бы рад, не тратить часы на таких, из-за этого и возникают все эти веселые вопросы про круглые люки и деревья.
                                                                                                                                                          +1
                                                                                                                                                          Это всё херня. Всё работает для популярных направлений. Системное программирование, достаточно узкая область и вот понять что там реально нужно возможно либо работая, либо сходив на собеседование.
                                                                                                                                                          Вот реально, даже не представлял как это выглядит до.
                                                                                                                                                        +1
                                                                                                                                                        Вы тут указали почти все возможные места трения в социальных трансакциях. А некто не только их указал но и вывел институциональный подход из подобного наблюдения.
                                                                                                                                                        А по сути Вы не совсем правы. Ходя на собеседования можно легко обнаружить, что уже не помнишь как маску сети посчитать.
                                                                                                                                                          –2
                                                                                                                                                          Я пытаюсь донести, что обнаружить, что не помнишь, как посчитать маску сети можно другими, менее затратными способами и более для этого предназначенными