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

  • Хаскель
  • Типографический текст
  • Рубин
  • Отличный

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

Лично я начал работать с Groovy.

заводной

Я начал исследовать Groovy. Это язык для платформы Java, на котором мне очень нравится работать. Вместо того, чтобы искать туториал, чтобы начать с ним работать, мне удобнее читать документацию по языку. Как только у меня появилось немного знаний о языке, я начал проверять проблемы, которые нам нужно было решить. Проблемы были:

  • Луны и зонтики
  • Reversort Engineering
  • Медианная сортировка
  • Отдача от родительского партнерства

Луны и зонтики

Я думаю, что для этой задачи по крайней мере первые два случая было легко решить. Таким образом, мы получаем строку символов «J», «C» или «?» и две стоимости: X — стоимость каждого «CJ», появляющегося в строке, и Y — стоимость «JC». Наша задача — рассчитать окончательную стоимость строки. Это легко, когда в строке есть только буквы «J» и «C». Когда "?" появляется, нам нужно решить, какую букву использовать для заполнения этого пустого места, «J» или «C», в зависимости от стоимости комбинации, которая у нас будет, когда мы ее заполним. Первые два случая были похожи, только менялась длина строки.

Последний случай был совершенно другим, потому что теперь у нас могут быть отрицательные затраты. Например, если у нас есть X = -8, мы будем получать прибыль в размере 8 каждый раз, когда в строке появляется «CJ». Это меняет алгоритм, потому что в последних случаях нам нужно было только избегать комбинаций, а теперь нужно проверить, что удобнее, избегать комбинаций или иметь их в строке.

Решение этой проблемы можно найти здесь.

Reversort Engineering

Для этой задачи у нас есть алгоритм Reversort, который представляет собой алгоритм сортировки, основанный на операции «Обратное». Каждая итерация этого алгоритма имеет стоимость, которая вместе дает нам окончательную стоимость сортировки.

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

В этом случае имеем минимальную и максимальную стоимость в зависимости от длины списка (N), для минимума имеем N — 1, а для максимума (N * (N +1)/2) — 1. Если стоимость находится между этими двумя значениями, нам нужно было «отсортировать» список, иначе это был бы «невозможный» случай.

Решение этой проблемы можно найти здесь.

Медианная сортировка

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

Предлагаемый нами подход — это «троичный поиск», когда список делится на три части и запрашивается медиана (1/3)(i), значения и (2/3)(j) списка. Получив ответ, мы начинаем делить на три подсписка, в котором будет значение. Так будет до тех пор, пока мы не найдем позицию в списке для нового значения.

Решение этой проблемы можно найти здесь.

Отдача от родительского партнерства

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

Решение этой проблемы можно найти здесь.

Индивидуальная проблема — d1000000

В качестве второй части заданий нам нужно было сделать отдельную задачу из списка из трех:

Я выбираю задачу «d1000000». В нем говорится, что стрит — это список целых чисел x, x+1, …, x+(l−1), где l — его длина. В этой задаче у нас есть список из N игральных костей, каждая из которых имеет Sn граней. Нам нужно найти максимально возможную прямую с количеством костей и количеством граней каждой из них.

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

Решение этой проблемы можно найти здесь.

Мысли об этих неделях

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

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