Публикуем очередную подборку задач и вопросов с собеседований в крупных IT-компаниях (для тех, кому мало задач из предыдущего сета :)

КДПВ

Ниже приведены вопросы и задачи для соискателей в Google, с различным уровнем сложности. Набор получился с лингвистическим уклоном, но знание языков не обязательно — задачи можно решить руководствуясь логикой и рассуждая последовательно. Надеемся, что решение этих задач принесёт интеллектуальное удовольствие и практическую пользу на собеседовании :).

Вопросы


  1. Ants in corners
    There are 3 ants sitting on three corners of a triangle. All ants randomly pick a direction and start moving along edge of the triangle. What is the probability that any two ants collide?

    Перевод
    3 муравья находятся в разных углах треугольника. Все муравьи начинают движение в случайно выбранном направлении вдоль сторон треугольника. Какова вероятность столкновения 2-х муравьёв?

  2. Red hat / blue hat
    A team of three people decide on a strategy for playing the following game. Each player walks into a room. On the way in, a fair coin is tossed for each player, deciding that player’s hat color, either red or blue. Each player can see the hat colors of the other two players, but cannot see her own hat color. After inspecting each other’s hat colors, each player decides on a response which are one of the following:
    — “I have a red hat”
    — “I had a blue hat”
    — “I pass”

    The player’s responses are recorded, but the responses are not shared until every player has recorded her response. The team wins if at least one player responds with a color and every color response correctly describes the hat color of the player making the response. In other words, the team loses if either everyone responds with “I pass” or someone responds with a color that is different from her hat color. What strategy should one use to maximize the team’s expected chance of winning?

    For example, one possible strategy is to single out one of the three players. This player will respond “I have a red hat” and the others will respond “I pass”. The expected chance of winning with this strategy is 50%. Can you do better?

    Перевод
    Команда из трёх человек выбирает стратегию для игры в следующую игру: каждый игрок заходит в комнату. На входе подкидыванием правильной монеты определяется цвет шляпы игрока — красная или синяя. Каждый игрок может видеть цвета шляп 2-х других игроков, но не своей. После ознакомления с цветами, игрок может выбрать один из вариантов ответа:
    — У меня красная шляпа
    — У меня синяя шляпа
    — Я пас
    Ответы всех игроков записываются, но не показываются другим игрокам, до того момента, пока все не ответят. Команда побеждает, если хотя бы один игрок написал цвет в ответе и если все цвета были указаны правильно. Другими словами, команда проигрывает, если все ответят «Я пас» или кто-то ошибётся с определением своего цвета. Какая стратегия может увеличить шансы команды на победу?

    Например, одним из возможных вариантов является ответ только избранного игрока. Этот игрок отвечает «У меня красная шляпа» или «У меня синяя шляпа», остальные пасуют. Ожидаемая вероятность победить при такой стратегии — 50%. Сможете ли Вы предложить лучшее решение?


Задачи


  1. Special keyboard
    Imagine you have a special keyboard with the following keys:
            A
            Ctrl+A
            Ctrl+C
            Ctrl+V 
    

    where CTRL+A, CTRL+C, CTRL+V each acts as one function key for “Select All”, “Copy”, and “Paste” operations respectively.
    If you can only press the keyboard for N times (with the above four keys), please write a program to produce maximum numbers of A. If possible, please also print out the sequence of keys.
    That is to say, the input parameter is N (No. of keys that you can press), the output is M (No. of As that you can produce).

    Ex:

    Input: N = 3
    Output: 3
    We can at most get 3 A's on screen by pressing following key sequence.
    A, A, A

    Input: N = 7
    Output: 9
    We can at most get 9 A's on screen by pressing following key sequence.
    A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V

    Input: N = 11
    Output: 27
    We can at most get 27 A's on screen by pressing following key sequence.
    A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V, Ctrl A, Ctrl C, Ctrl V, Ctrl V

    Перевод
    Представьте, что у Вас есть специальная клавиатура со следующим клавишами:
            A
            Ctrl+A
            Ctrl+C
            Ctrl+V 
    

    где CTRL+A, CTRL+C, CTRL+V работают как «Выбрать всё», «Скопировать», «Вставить» соответственно.
    Вы можете нажать на клавиатуру N раз (только на указанные клавиши). Напишите программу, дающую максимальное количество «A» с помощью этих операций. Если возможно, выведите также последовательность нажатий. Иначе говоря, вход — N (количество нажатий), вывод — M (количество «А», которые можно получить).
    Примеры:
    Вход: N = 3
    Выход: 3
    Можем получить максимум 3 A следующей последовательностью нажатий: A, A, A

    Вход: N = 7
    Выход: 9
    Максимум — 9 А, последовательность: A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V

    Вход: N = 11
    Выход: 27
    Максимум — 27 А, последовательность: A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V, Ctrl A, Ctrl C, Ctrl V, Ctrl V

  2. Boolean parenthesization
    Given a boolean expression with following symbols.

    Symbols
    'T' ---> true
    'F' ---> false

    And following operators filled between symbols

    Operators
    & ---> boolean AND
    | ---> boolean OR
    ^ ---> boolean XOR

    Count the number of ways we can parenthesize the expression so that the value of expression evaluates to true.

    Let the input be in form of two arrays one contains the symbols (T and F) in order and other contains operators (&, | and ^}

    Examples:

    Input: symbol[] = {T, F, T}
    operator[] = {^, &}
    Output: 2
    The given expression is «T ^ F & T», it evaluates true in two ways "((T ^ F) & T)" and "(T ^ (F & T))"

    Input: symbol[] = {T, F, F}
    operator[] = {^, |}
    Output: 2
    The given expression is «T ^ F | F», it evaluates true in two ways "( (T ^ F) | F )" and "( T ^ (F | F) )".

    Input: symbol[] = {T, T, F, T}
    operator[] = {|, &, ^}
    Output: 4
    The given expression is «T | T & F ^ T», it evaluates true in 4 ways ((T|T)&(F^T)), (T|(T&(F^T))), (((T|T)&F)^T) and (T|((T&F)^T)).

    Перевод
    Дано логическое выражение со следующими символами:

    Символы
    'T' ---> true
    'F' ---> false

    И следующие операторы, вставляемые между символами:

    Операторы
    & ---> логическое И
    | ---> логическое ИЛИ
    ^ ---> исключающее ИЛИ

    Подсчитайте количество вариантов расстановки скобок, чтобы значение выражения стало равным true.

    Допустим, вводные данные представлены в виде 2-х массивов — символов (T и F) и операторов (&, | и ^).

    Примеры:

    Вход: symbol[] = {T, F, T}
    operator[] = {^, &}
    Выход: 2
    Выражение «T ^ F & T», становится равным true в 2-х случаях: "((T ^ F) & T)" и"(T ^ (F & T))"

    Вход: symbol[] = {T, F, F}
    operator[] = {^, |}
    Выход: 2
    Выражение «T ^ F | F», становится равным true в 2-х случаях "( (T ^ F) | F )" и "( T ^ (F | F) )".

    Вход: symbol[] = {T, T, F, T}
    operator[] = {|, &, ^}
    Выход: 4
    Выражение «T | T & F ^ T», становится равным true в 4-х случаях: ((T|T)&(F^T)), (T|(T&(F^T))), (((T|T)&F)^T) and (T|((T&F)^T)).

  3. Alien language
    Given a sorted dictionary (array of words) of an alien language, find order of characters in the alien alphabet.

    Examples:

    Input: words[] = {«baa», «abcd», «abca», «cab», «cad»}
    Output: Order of characters is 'b', 'd', 'a', 'c'
    Note that words are sorted and in the given language «baa» comes before «abcd», therefore 'b' is before 'a' in output. Similarly we can find other orders.

    Input: words[] = {«caa», «aaa», «aab»}
    Output: Order of characters is 'c', 'a', 'b'

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

    Примеры:

    Вход: words[] = {«baa», «abcd», «abca», «cab», «cad»}
    Выход: Порядок букв 'b', 'd', 'a', 'c'
    Заметим, что 'baa' идёт перед 'abcd', следовательно в алфавите 'b' стоит перед 'a'. Аналогичным образом узнаем порядок других букв.

    Input: words[] = {«caa», «aaa», «aab»}
    Выход: Порядок букв 'c', 'a', 'b'.


Ответы будут даны в течение следующей недели — успейте решить. Удачи!

Комментарии (43)


  1. eandr_67
    30.03.2018 21:54
    +1

    Вопрос 1
    Всего существует 2 ** 3 = 8 вариантов движения муравьёв. Муравьи не столкнутся, если движутся в одну сторону — 2 варианта из 8.
    Ответ: (8 — 2) / 8 = 0.75


  1. hokeroid
    31.03.2018 08:14
    +1

    Муравьи
    Всего комбинаций 8, не столкнутся в 2, когда идут в одну сторону. Шанс 3/4


    1. Readme
      31.03.2018 10:33
      +1

      Шляпы
      Ответы всех игроков записываются, но не показываются другим игрокам, до того момента, пока все не ответят

      Тайминг-атака не пройдёт :)


      1. hokeroid
        31.03.2018 11:17

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


  1. Rsa97
    31.03.2018 08:14
    +1

    Вопрос 1
    Муравьи не столкнутся, если двигаются в одну и ту же сторону — по часовой стрелке или против. Вероятности таких событий P1CW ? P2CW ? P3CW и P1CCW ? P2CCW ? P3CCW.
    Значит вероятность столкновения P = 1 ? P1CW ? P2CW ? P3CW ? P1CCW ? P2CCW ? P3CCW.
    Если направления движения выбираются равновероятно, то P = 1 ? (1/2)3 ? (1/2)3 = 3/4


  1. mbait
    31.03.2018 10:04

    Есть некоторые сомнения относительно того, что эти вопросы задают в Гугле. "Alient Language" — задача с квалификационного раунда Google Code Jam 2009, а пул задач обычно держится в относительном секрете, и задачи, получившие определённую популярность или будучи замеченными на публичных ресурсах, из пула удаляются. Задачи про муравьёв или шапки и вовсе не задаются уже очень давно.


    1. reci Автор
      31.03.2018 11:01

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

      Сами же по себе задачи мне показались довольно любопытными.


  1. Vadimirk
    31.03.2018 12:28

    Муравьи.
    75% шанс столкновения, т.к.только в 2 случаях из 8 все муравьи начинают двигаться в одну и ту же сторону.


    Шляпы
    Игроки дают ответ в зависимости от цветов шляп игроков, которых они видят перед собой. Если перед игроком дающим ответ, двое других с разными шляпами, он пасует, поскольку шанс угадать всего 50% и это покрывает большую часть из возможных позиций. Если отвечающий видит перед собой игроков с 2-мя одинаковыми шляпами синими или красными, то он называет противоположный цвет. Поскольку для каждого цвета возможны всего 3 подобные позиции, шанс на выигрыш уже 66.67%.


    1. Rsa97
      31.03.2018 14:40

      Давайте посмотрим возможные комбинации и ответы игроков по вашей системе"

      Комбинации
      K-K-K => С-С-С, проигрыш
      K-K-C => X-X-C, выигрыш
      K-C-K => X-C-X, выигрыш
      K-C-C => К-X-X, выигрыш
      C-K-K => С-X-X, выигрыш
      C-K-C => X-К-X, выигрыш
      C-C-K => X-X-K, выигрыш
      C-C-C => K-K-K, проигрыш


      1. Vadimirk
        31.03.2018 14:41

        Да, я уже понял, что ошибся, не все комбинации взял в учёт :)


  1. Art_ta
    31.03.2018 12:28

    1 вопрос муравьи — 75% вероятность столкновения.
    2 вопрос шляпа — тактика на 100% — заранее договариваются: кто видит одинаковые шляпы — отвечает, кто разные — пасует. Получается кто видит синие, на нем — красная, кто видит красные — на нем синяя. Кто видит красную и синюю — на нем или красная или синяя — надо пасовать)


    1. Vadimirk
      31.03.2018 12:42

      Учитывай, что если ты видишь 2 одинаковые Шляпы, на тебе может быть так же шляпа этого цвета с вероятностью 33.3%


      1. Art_ta
        31.03.2018 13:18

        Там же в вопросе условие — «правильная монета». Значит из 3-х раз не может выпасть 3 в пользу одного и того же цвета.


        1. Vadimirk
          31.03.2018 13:21

          Правильная момента подразумевает её верную физическую форму и прочие данные, то есть шанс выпадения того или иного результата ровно 1/2. Причем тут количество этих самых результатов?


          1. Art_ta
            31.03.2018 13:23

            Вот, вот — 1/2, а не 1/3 :)


          1. Art_ta
            31.03.2018 13:25

            1/2 это значит, если первая — синяя, то вторая — красная, а третья — или синяя или красная!


            1. Vadimirk
              31.03.2018 13:43

              Точняк!


    1. apapacy
      31.03.2018 14:00

      Тактика на 75%. Обратите внимание что ответы скрываются пока не ответили все игроки. То есть стратегия не сработает если были все шляпы одинакового цвета или в двух случаях из восьми.


      1. Art_ta
        31.03.2018 14:19

        все шляпы одинакового цвета быть не могут, потому что вероятность правильной монеты 1 к 2, в не 3 к 3. И 8 случаев быть не может, потому что игроков трое )))


        1. apapacy
          31.03.2018 15:18

          Восемь это два в степени три (потому что игроков трое).
          Почему все шляпы не могут быть одинакового цвета?
          Давайте начнем так
          Если один игрок то вероятностью 1 у него шляпа одного цвета.
          Если игрока два то будет четыре варианта цветов равновероятных из них благоприятных два. То есть с вероятностью 0.5 на игроках будут шляпы одинакового цвета, потому что монета правильная. В этом правильная монета отличается от правильного бутерброда для которого вероятность 1.
          Если игроков три то вариантов равновероятных будет 8 из них неблагоприятных по прежднему два (все синие все красные).


          1. Art_ta
            31.03.2018 15:29

            правильная монета — которая выпадает в четных случаях одинаковое количество раз на обе стороны, т.е. если бросить 2 раза, будет 1 раз синяя, другой — красная. Или наоборот. А третий раз — может синяя, а может красная.Значит 3 раза 1 цвет не может выпасть ))


            1. apapacy
              31.03.2018 15:50
              +1

              Давайте уйдем от тонкостей перевода и скажем термин как в условии fair coin.
              Это монета которая в одном независимом испытании даст равную вероятность событий и все. Никакой мистики, никакой способности предугадывать последующие события и количество подбрасываний, никакой памяти монета не имеет. Каждое из подбрасываний является независимым и не исключает ни одного из событий.


              1. Art_ta
                31.03.2018 15:58

                Давайте уйдем.Но в вопросе слова «правильна монета» — это ссылка, где разъясняется, что это значит. И там другая интерпретация, чем у Вас.


                1. Rsa97
                  31.03.2018 16:18
                  +2

                  en.wikipedia.org/wiki/Fair_coin

                  In probability theory and statistics, a sequence of independent Bernoulli trials with probability 1/2 of success on each trial is metaphorically called a fair coin.
                  Сказано, что в каждом испытании вероятность успеха равняется 1/2. Где здесь вы увидели одинаковое количество выпадений?


                1. apapacy
                  31.03.2018 16:52

                  Там написано то же что и я Вам сказал выше: идеальная монета при бросании имеет равную вероятность выпадания орла или решки 0,5+0,5. В отличии от реальной монеты результат бросания который зависит от ее реальных параметров и может быть например 0,4 + 0,6.

                  При двух подряд испытаниях не гарантируется выпадание с вероятностью 100% разных результатов.


                  1. Art_ta
                    31.03.2018 17:14

                    Возможно Вы и правы, а может — я. Посмотрим ответы через неделю.


                    1. hokeroid
                      31.03.2018 22:04

                      Правильная монета — монета, у которой предел отношения количества выпавших орлов на количество бросков в бесконечности равен 1/2


                      1. Art_ta
                        01.04.2018 15:25
                        +1

                        Хорошо. Убедили.Тактика на 75%.


            1. alex_nightingale
              31.03.2018 16:39
              +1

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


          1. Art_ta
            31.03.2018 15:30

            Про правильный бутерброд — это точно!!! )))


  1. Yeah
    31.03.2018 13:21

    Муравьи

    50% — или встретятся или не встретятся


    1. apapacy
      31.03.2018 14:03

      Хотелось бы узнать ваше обоснование


      1. hokeroid
        31.03.2018 22:16

        Обоснованием является рофл)


  1. NoRegrets
    31.03.2018 14:00

    1. 0.75
    2. одинаковые шляпы отвечает иное, остальные пас
    3.…
    4. находим первый F, для каждого способа превратить его в T (что может захватить и следующий F, в том числе), рекурсивно делаем поиск вариантов по следующему незахваченному F.


    1. NoRegrets
      31.03.2018 14:38

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


      1. Rsa97
        31.03.2018 14:47

        Эта задача может не иметь однозначного решения. Например, по словарю 'аб', 'в' невозможно судить о взаимном порядке букв 'б' и 'в'.


        1. NoRegrets
          31.03.2018 16:06

          Ага, поспешил


  1. 3dcryx
    31.03.2018 14:32

    Если я правильно понимаю первую задачу то ответ на нее начиная с некоторого небольшого N будет типа
    (1+N%3)X2^(N-X-N%3)
    Просто пока можно выделяем копируем и вставляем (экспоненциальный рост кол-ва букв А), если не N не кратно трем то последнии 1 или 2 раза просто вставляем то что в текущий момент в буфере.
    Пожалуй единственный вопрос, чему равно X — сколько раз нужно нажать А вначале "выделить-копировать-вставить". Из-за экспоненциального роста это число очевидно небольшое, судя по примерам скорее всего равно 3.


    Ну а N<=10 можно и ручками посчитать.


  1. kardan2
    31.03.2018 19:51

    На этой неделе я пас.


  1. Rsa97
    31.03.2018 22:47

    Задача 3
    Можно решить через матрицу предшествия. Заводим словарь предшественников для каждой буквы. Берём слова, начиная со второго, находим совпадающие начала в предыдущих словах и по первым несовпадающим буквам добавляем в словарь для буквы текущего слова букву из предшествующего.
    Пройдя по всем словам ищем буквы, у которых нет предшественников (пустые словари), выводим их в произвольном порядке. Удаляем эти буквы из всех словарей предшествия и из общего списка. Повторяем, пока в списке есть буквы.
    {«baa», «abcd», «abca», «cab», «cad»}
    'b' => {}
    'a' => {'b', 'd'}
    'c' => {'b', 'a'}
    'd' => {'b'}
    Ответ: {'b', 'd', 'a', 'c'}


  1. smer44
    01.04.2018 01:46

    Задача 1. — там по примерам почти видно.
    до семи символов выигрывают просто А
    потом после трёх А идёт комбинация ctrl+a, ctrl+c, ctrl+v, ctrl+v, пока эти 4 символа влезут в остаток, или же в остаток влезает просто ctrl+a, ctrl+c, ctrl+v иначе остаток заполняется несколькими ctrl+v

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

    Задача 2. — бессмысленный вырвиглаз, решаемый перебором


  1. apapacy
    01.04.2018 12:28

    По первой задаче пример решение кажется неверный для 11.
    Заметим что для 6 есть два равнозначны варианта аааааа и ааа сa cc cv
    Для 11 aaa ca cc cv ca cc cv cv cv то есть 36 не 27
    То есть алгоритм такой с кратными 3 действуем тройками ааа са сс cv ca cc cv
    Если некратно то заполняем последние один или два нажатия cc


  1. Nick_mentat
    02.04.2018 15:01

    1
    1/4: выкидываем первого муравья — от его решения ничего не зависит, в силу симметрии задачи. Куда бы он не двинулся, смотрим на муравья, в угол которого он двинулся. Он может пойти навстречу, и тогда точно столкнется, значит -50%. Если же он всё-таки пойдёт в другую сторону, то третий муравей также может пойти ему на встречу с вероятностью 50%, а 50% от 100%-%50 — это -25%. Значит ответ 100%-50%-25% = 25%