Advent of Code 2022: Day 7
Мои взаимоотношения с этой загадкой можно описать примерно такой фразой (по мотивам анекдотов):
— Дерево — подумал Штирлиц\
— Дерево — поняло дерево
Всё началось с того, что мне совершенно не хотелось строить это дерево (забегая вперёд — всё же пришлось).
После пары неудачных попыток (о которых ниже) — решил хранить эту псевдо-ФС в избыточном виде — получились этакие «мангровые заросли».
Директории, помимо вложенности в свои родительские каталоги, дублируются на корневом уровне. Таким образом получается без лишних усилий посчитать результат по условиям загадки.
Этот пример запускал на Java 17, на традиционно используемой в прошлых задачах одиннадцатой версии Java он не заработает.
Неудачные попытки седьмого дня
Мы сделали ФС в твоей ФС
Первое решение — хорошо, у нас же тут «как бы файловая система» — так почему бы не сэмулировать её на файловой системе? Возможно, это сработало бы, если как следует поколдовать с find. А может — и нет.
Так или иначе, ФС создавалась (всегда успешно — на тестовом пример и не всегда — на реальном)
И на тестовом же примере получался прекрасный и верный ответ с помощью
Увы, заставить это сработать на реальных данных мне не удалось.
За деревьями леса не видно
Вторая попытка — ладно, придётся всё же создать дерево. Максимально простой узел в виде:
И не менее простое заполнение дерева этим узлами:
Отличное получилось дерево! Оно красиво распечатывалось в правильном виде
и замечательно считало результат на тестовом примере! Жаль только, что на рабочих данных это дерево безбожно врало :) Либо я окончательно разучился в рекурсию…
В общем, безуспешно повозившись с деревьями некоторое время, я понял, что лес — это нечто большее, чем одни лишь деревья, и в итоге пришел к решению, описанному в начале заметки.
С этого дня начались для меня сложности, ибо нормально в классы я плохо умею ((
Я в целом стараюсь наоборот обойтись без тру-ООП подхода, почаще на циклах или ФП сделать. Морально готовлюсь к "задрачиванию литкода" :)
Ту же змейку, в принципе, на двух вложенных циклах можно норм сделать, будет она вся в массиве лежать. Правда, с java-синтаксисом читаться это будет не очень, конечно. С классами гораздо легче для восприятия.