реклама
разместить

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
1313
77
22
11
11
Аудиофил не мамонт
реклама
разместить
Видео выходного дня: глава Meta* Марк Цукерберг танцует и поёт в блестящем голубом комбинезоне

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

1616
33
11
11
Когда осознал, что реальная жизнь лучше виртуальной
🎙️ Бесплатная ИИ-Озвучка: Тестирую SpeechMa и делюсь впечатлениями

Голосовой контент – это боль. Либо дорого, либо долго, либо звучит так, что хочется выключить через пять секунд. Я давно искал бесплатный вариант, который бы не раздражал уши. И вот наткнулся на SpeechMa (ссылка) – сервис, который обещает конвертацию текста в речь абсолютно бесплатно. Решил проверить, стоит ли он внимания.

День 1102: ЦБ «жёстко настроен» на возвращение инфляции к цели в 4%

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

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

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

Источник фото: The Hollywood Reporter
1212
11
5 причин почему люди теряют свои Telegram каналы или гайд как убить актив в своем сообществе

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

5 причин почему люди теряют свои Telegram каналы или гайд как убить актив в своем сообществе
44
11
Где выгоднее сдавать квартиру: Москва vs регионы
Данные по оценке ДОМ.РФ
22
66 вариантов где опубликовать свою статью. В одной табличке с названиями, сайтами и описаниями. Делюсь с вами

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

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