Если вы не знаете, что такое Advent of Code, обязательно ознакомьтесь с моими предыдущими сообщениями, где я объясняю, что это за событие, и мой опыт. (https://github.com/JPYamamoto/advent_of_code/#my-experience-solving-the-aoc)

Мое решение сегодняшних проблем:https://github.com/JPYamamoto/advent_of_code/blob/master/lib/advent_of_code_2018/day_05.ex

Репозиторий, где я размещаю все свои решения для Advent of Code 2018:https://github.com/JPYamamoto/advent_of_code/

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

Чтобы решить первую головоломку, вам дали цепочку из прописных и строчных букв и одно ограничение:

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

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

В моем случае я решил использовать функцию Reduce с некоторым мощным сопоставлением с образцом по списку символов. Charlists — это родное представление строк в Erlang. В Эликсире у нас определенно есть другой подход к строкам: двоичные файлы.

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

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

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

Это может показаться сложным, но это не так. Позвольте мне объяснить мой подход:

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

Следует принять во внимание, что я только что использовал слово «строка». Но помните, что для простоты в этой задаче я использую списки символов Erlang вместо строк. Но, в конце концов, вы просто адаптируете его к любой структуре данных, которую вы можете использовать в предпочитаемом вами языке.

Теперь, если вы хотите попробовать другой подход, не стесняйтесь делать это. Я думаю, что стоит попробовать вызвать рекурсивную функцию в части 1. Фактически, функция Reduce, которую я использую, внутренне работает как рекурсивная функция, но для того, чтобы сделать ее простой и избежать ввода, я пошел с уже предварительно построенная функция высшего порядка.

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

Мне очень понравилось сегодняшнее задание. 😀 Это напомнило мне о тех функциях, которые мне приходилось создавать, когда я впервые записался на курс функционального программирования, и это было на Erlang.

Если вы хотите увидеть мои решения, они находятся в начале статьи. 👆

Надеюсь, вы нашли этот пост интересным. Если да, не забудьте поставить лайк 👏 (или тридцать) и поделиться, чтобы охватить больше людей.

Если у вас есть какие-либо вопросы или вы просто хотите поболтать 💬, вы можете написать мне в личку, вот мой твиттер (JPYamamoto9).

Кроме того, если вам интересно узнать больше о Advent of Code, я предлагаю вам подписаться на меня, так как я буду ежедневно публиковать сообщения о проблемах этого года.