Advent of Code 2022: Day 19

Тяжело дались мне эти игры в Factorio. Хотя, вроде бы, с виду и похожи на слоновьи пляски на вентилях.

В этой задачке тоже пришлось погуглить подсказки, когда нашел варианты отсечек для рекурсии — дело пошло значительно веселее!

Виновница торжества

static int mostGeodes(int ore, int clay, int obsidian, int geode, int oreBot, int clayBot, int obsidianBot, int geodeBot, int time, int maxTime, int[] botsCost) { if (time == maxTime) { return geode; } int oreTotal = ore + oreBot; int clayTotal = clay + clayBot; int obsidianTotal = obsidian + obsidianBot; int geodeTotal = geode + geodeBot; if (ore >= botsCost[4] && obsidian >= botsCost[5]) { return mostGeodes(oreTotal - botsCost[4], clayTotal, obsidianTotal - botsCost[5], geodeTotal, oreBot, clayBot, obsidianBot, geodeBot + 1, time + 1, maxTime, botsCost); } if (clayBot >= botsCost[3] && obsidianBot < botsCost[5] && ore >= botsCost[2] && clay >= botsCost[3]) { return mostGeodes(oreTotal - botsCost[2], clayTotal - botsCost[3], obsidianTotal, geodeTotal, oreBot, clayBot, obsidianBot + 1, geodeBot, time + 1, maxTime, botsCost); } int best = 0; if (obsidianBot < botsCost[5] && ore >= botsCost[2] && clay >= botsCost[3]) { best = Math.max(best, mostGeodes(oreTotal - botsCost[2], clayTotal - botsCost[3], obsidianTotal, geodeTotal, oreBot, clayBot, obsidianBot + 1, geodeBot, time + 1, maxTime, botsCost)); } if (clayBot < botsCost[3] && ore >= botsCost[1]) { best = Math.max(best, mostGeodes(oreTotal - botsCost[1], clayTotal, obsidianTotal, geodeTotal, oreBot, clayBot + 1, obsidianBot, geodeBot, time + 1, maxTime, botsCost)); } if (oreBot < 4 && ore >= botsCost[0]) { best = Math.max(best, mostGeodes(oreTotal - botsCost[0], clayTotal, obsidianTotal, geodeTotal, oreBot + 1, clayBot, obsidianBot, geodeBot, time + 1, maxTime, botsCost)); } if (ore <= 4) { best = Math.max(best, mostGeodes(oreTotal, clayTotal, obsidianTotal, geodeTotal, oreBot, clayBot, obsidianBot, geodeBot, time + 1, maxTime, botsCost)); } return best; }

Сильно сократила решение

static void day19(String puzzleInputUri) throws IOException, InterruptedException { var blueprints = client.send(request.uri((URI.create(puzzleInputUri))).build(), BodyHandlers.ofLines()) .body() .map(blueprint -> Arrays.stream(blueprint.split("[^0-9]+")).skip(1).mapToInt(Integer::parseInt).toArray()) .collect(Collectors.toList()); int answer1 = 0; int answer2 = 1; for (int i = 0; i < blueprints.size(); i++) { int[] cost = blueprints.get(i); answer1 += cost[0] * mostGeodes(0, 0, 0, 0, 1, 0, 0, 0, 0, 24, Arrays.copyOfRange(cost, 1, cost.length)); if (i < 3) { answer2 *= mostGeodes(0, 0, 0, 0, 1, 0, 0, 0, 0, 32, Arrays.copyOfRange(cost, 1, cost.length)); } } System.out.printf("Answer 1: %d %nAnswer 2: %d", answer1, answer2); }
22
Начать дискуссию