Карманный проектор
Полёт над Луной
Стив Джобс про смысл работы
Книжная закладка с ИИ
Xiaomi SU7 Ultra
Роботы Figure за работой
Генератор видео от Alibaba
Приложение для простакринации
AR в медицине

Advent of Code 2022: Day 12

По двенадцатому дню — сказать особо нечего. Если дни 7 и 10 запомнились (первый — неожиданными сложностями, второй — интересной в решении загадкой), то день 12 — совершенно безликий какой-то.

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

Ну да ладно, BFS — так BFS. Разве что — не «тру-ООП» — без хранения вершиной своего состояния. Работает — и хорошо.

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

class Vertex { public final int x; public final int y; public final int dist; public final char height; public Vertex(int x, int y, int dist, char height) { this.x = x; this.y = y; this.dist = dist; this.height = height; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Vertex that = (Vertex) o; return x == that.x && y == that.y; } @Override public int hashCode() { return x + y; } @Override public String toString() { return "Vertex{x=" + x + ", y=" + y + ", dist=" + dist + '}'; } } static Vertex findEndPoint(Vertex from, char[][] map) { Set<Vertex> visited = new HashSet<>(); char endMark = 'E'; char nextTraversableMarkAfter_z = '{'; int[][] directions = new int[][]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; int mapHeight = map.length; int mapWidth = map[0].length; Vertex start = new Vertex(from.x, from.y, from.dist, from.height); Queue<Vertex> queue = new ArrayDeque<>(); queue.add(start); visited.add(start); while (!queue.isEmpty()) { Vertex current = queue.poll(); for (int[] direction : directions) { int nextX = Math.max(current.x + direction[1], 0); int nextY = Math.max(current.y + direction[0], 0); if (nextX < mapWidth && nextY < mapHeight) { Vertex next = new Vertex(nextX, nextY, current.dist + 1, map[nextY][nextX]); if (!visited.contains(next) && (next.height - current.height <= 1 || current.height == 'S')) { if (next.height == endMark) { map[next.y][next.x] = nextTraversableMarkAfter_z; continue; } if (next.height == nextTraversableMarkAfter_z) { map[next.y][next.x] = endMark; return next; } queue.add(next); visited.add(next); } } } } return new Vertex(from.x, from.y, from.dist, '#'); } static void day12(String puzzleInputUri) throws IOException, InterruptedException { char[][] mapArray = client.send(request.uri((URI.create(puzzleInputUri))).build(), HttpResponse.BodyHandlers.ofLines()) .body() .map(String::toCharArray) .toArray(char[][]::new); System.out.println("Answer 1: " + findEndPoint(new Vertex(0,20,0, 'S'), mapArray)); Vertex answer2 = IntStream.range(0, mapArray.length) .mapToObj(y -> Map.entry(y, mapArray[y])) .flatMap(row -> IntStream.range(0, row.getValue().length) .mapToObj(x -> Stream.of(new Vertex(x, row.getKey(), 0, row.getValue()[x]))) ) .flatMap(Function.identity()) .filter(vertex -> Set.of('a', 'S').contains(vertex.height) && ( (vertex.x == 0 || vertex.x == mapArray[0].length - 1) || (vertex.y == 0 || vertex.y == mapArray.length - 1) ) ) .map(entrance -> findEndPoint(entrance, mapArray)) .filter(v -> v.height != '#') .min(Comparator.comparingInt(v -> v.dist)) .orElseThrow(); System.out.println("Answer 2: " + answer2); }

Для решения второй части — была мысль пойти от E в направлении ближайших a, но всё равно пришлось бы перебрать их все, чтобы сравнить длину пройденного пути.

реклама
разместить
Начать дискуссию
Французская Waiting For Ideas представила виниловый проигрыватель из цельного алюминия за €5800

PP-1 изготавливают на заказ, ждать нужно около 12 недель.

Waiting For Ideas
99
66
22
11
11
Аудиофил не мамонт
реклама
разместить
Видео выходного дня: глава Meta* Марк Цукерберг танцует и поёт в блестящем голубом комбинезоне

Предприниматель выступил на дне рождения супруги, позже написав: «Жене бывает 40 только раз».

1414
22
11
Когда осознал, что реальная жизнь лучше виртуальной
Как реклама в телевизоре влияет на наш выбор в магазине

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

Как реклама в телевизоре влияет на наш выбор в магазине
11
5 причин почему люди теряют свои Telegram каналы или гайд как убить актив в своем сообществе

Ни для кого не секрет, что Telegram из мессенджера превратился в целую экосистему, где можно не только общаться, но и зарабатывать деньги. Однако, чем больше “бизнесменов” заходят в телеграм, тем больше мертвых каналов появляется. Потратить бюджет около миллиона рублей, а вместо окупаемости через 10 месяцев получить мертвый канал. Звучит как фиаско…

5 причин почему люди теряют свои Telegram каналы или гайд как убить актив в своем сообществе
33
11
День 1102: ЦБ «жёстко настроен» на возвращение инфляции к цели в 4%

Собираем новости, события и мнения о рынках, банках и реакциях компаний.

Источник фото: РИА Новости
3030
22
11
11
11
ЦБ вечно прогнозирует и каждый раз жидко... ошибается. Но в царстве иллюзий и 2% инфляция может быть.
От $80 тысяч до $1 млн в год: Business Insider рассказало о средних зарплатах иностранных специалистов в Netflix

Тех, у кого рабочая виза или грин-карта.

Источник фото: The Hollywood Reporter
1212
11
Выставка-форум «Крым. Сезон — 2025»: успешные блогеры рассказали о новых требованиях к рекламе

20 февраля в отеле «Ялта-Интурист» в Крыму прошло открытое мероприятие — выставка-форум для предприятий туриндустрии и сегмента HoReCa «Крым.Сезон — 2025». В этом году резиденты продюсерского центра «Инсайт Люди» поделились практическими знаниями с предпринимателями и сотрудниками компаний, желающих наладить взаимодействие с блогерами в условиях но…

11
66 вариантов где опубликовать свою статью. В одной табличке с названиями, сайтами и описаниями. Делюсь с вами

Будет полезна тем, кто продвигается через контент и/или seo.

66 вариантов где опубликовать свою статью. В одной табличке с названиями, сайтами и описаниями. Делюсь с вами
5050
99
22
22
22
11
[]