From d07bb9235be90b0ca3a2c9042fe311cd79c70293 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Fri, 27 Dec 2024 20:45:17 +0100 Subject: [PATCH] Implement 2024 day 13 in terraform --- 2024/bonus/day13/main.tf | 48 ++++++++++++++++++++++++++++++++++ 2024/bonus/day13/solve/main.tf | 34 ++++++++++++++++++++++++ 2024/bonus/main.tf | 13 +++++++++ 2024/bonus/tests.tftest.hcl | 17 ++++++++++++ 4 files changed, 112 insertions(+) create mode 100644 2024/bonus/day13/main.tf create mode 100644 2024/bonus/day13/solve/main.tf diff --git a/2024/bonus/day13/main.tf b/2024/bonus/day13/main.tf new file mode 100644 index 0000000..d50b471 --- /dev/null +++ b/2024/bonus/day13/main.tf @@ -0,0 +1,48 @@ +variable "input" { + type = string + default = <<-EOT + Button A: X+94, Y+34 + Button B: X+22, Y+67 + Prize: X=8400, Y=5400 + + Button A: X+26, Y+66 + Button B: X+67, Y+21 + Prize: X=12748, Y=12176 + + Button A: X+17, Y+86 + Button B: X+84, Y+37 + Prize: X=7870, Y=6450 + + Button A: X+69, Y+23 + Button B: X+27, Y+71 + Prize: X=18641, Y=10279 + EOT +} + +locals { + machines = regexall( + "Button A: X\\+(\\d+), Y\\+(\\d+)\nButton B: X\\+(\\d+), Y\\+(\\d+)\nPrize: X=(\\d+), Y=(\\d+)", + var.input + ) +} + +module "solve1" { + source = "./solve" + machines = local.machines +} + +module "solve2" { + source = "./solve" + machines = [ + for machine in local.machines : + [machine[0], machine[1], machine[2], machine[3], 10000000000000 + tonumber(machine[4]), 10000000000000 + tonumber(machine[5])] + ] +} + +output "part1" { + value = module.solve1.solutions +} + +output "part2" { + value = module.solve2.solutions +} diff --git a/2024/bonus/day13/solve/main.tf b/2024/bonus/day13/solve/main.tf new file mode 100644 index 0000000..1661fb0 --- /dev/null +++ b/2024/bonus/day13/solve/main.tf @@ -0,0 +1,34 @@ +variable "machines" { + type = list(list(number)) +} + +locals { + a_substitutions = [ + for machine in var.machines : + [-machine[2] / machine[0], machine[4] / machine[0]] + ] + + b_equations = [ + for i in range(length(var.machines)) : + [ + var.machines[i][3] + local.a_substitutions[i][0] * var.machines[i][1], + var.machines[i][5] - local.a_substitutions[i][1] * var.machines[i][1] + ] + ] + + b = [for eq in local.b_equations : floor(eq[1] / eq[0] + 0.5)] + + a = [ + for i in range(length(var.machines)) : + floor((var.machines[i][4] - local.b[i] * var.machines[i][2]) / var.machines[i][0] + 0.5) + ] +} + +output "solutions" { + value = sum([ + for i in range(length(var.machines)) : + 3 * local.a[i] + local.b[i] + if var.machines[i][0] * local.a[i] + var.machines[i][2] * local.b[i] == var.machines[i][4] + && var.machines[i][1] * local.a[i] + var.machines[i][3] * local.b[i] == var.machines[i][5] + ]) +} diff --git a/2024/bonus/main.tf b/2024/bonus/main.tf index ed96c52..1e3ca93 100644 --- a/2024/bonus/main.tf +++ b/2024/bonus/main.tf @@ -79,6 +79,19 @@ output "day11_2" { value = module.day11.part2 } +module "day13" { + source = "./day13" + input = file("../inputs/13.txt") +} + +output "day13_1" { + value = module.day13.part1 +} + +output "day13_2" { + value = module.day13.part2 +} + module "day19" { source = "./day19" input = file("../inputs/19.txt") diff --git a/2024/bonus/tests.tftest.hcl b/2024/bonus/tests.tftest.hcl index 3fc450b..8ec0ea1 100644 --- a/2024/bonus/tests.tftest.hcl +++ b/2024/bonus/tests.tftest.hcl @@ -148,6 +148,23 @@ run "day11" { } } +run "day13" { + command = plan + + module { + source = "./day13" + } + + variables { + input = file("../tests/samples/13.txt") + } + + assert { + condition = output.part1 == 480 + error_message = "Part1 output is wrong" + } +} + run "day19" { command = plan