diff --git a/2024/bonus/day05/is_correct/main.tf b/2024/bonus/day05/is_correct/main.tf new file mode 100644 index 0000000..cde3103 --- /dev/null +++ b/2024/bonus/day05/is_correct/main.tf @@ -0,0 +1,21 @@ +variable "update" { + type = list(number) +} + +variable "disallow_rules" { + type = map(list(number)) +} + +locals { + not_disallowed = alltrue([ + for i in range(1, length(var.update)) : + !contains( + flatten([for j in range(i) : lookup(var.disallow_rules, var.update[j], [])]), + var.update[i] + ) + ]) +} + +output "valid" { + value = local.not_disallowed ? var.update[floor(length(var.update) / 2)] : 0 +} diff --git a/2024/bonus/day05/main.tf b/2024/bonus/day05/main.tf new file mode 100644 index 0000000..f553da5 --- /dev/null +++ b/2024/bonus/day05/main.tf @@ -0,0 +1,23 @@ +variable "input" { + type = string +} + +locals { + parts = split("\n\n", chomp(var.input)) + rules = [for rule_line in split("\n", local.parts[0]) : [for v in split("|", rule_line) : tonumber(v)]] + disallow_rules = { for rule in local.rules : rule[1] => rule[0]... } + + updates = [for update_line in split("\n", local.parts[1]) : [for v in split(",", update_line) : tonumber(v)]] +} + +module "is_valid" { + source = "./is_correct" + count = length(local.updates) + + update = local.updates[count.index] + disallow_rules = local.disallow_rules +} + +output "part1" { + value = sum(module.is_valid[*].valid) +} diff --git a/2024/bonus/main.tf b/2024/bonus/main.tf index 45fa707..ba870c4 100644 --- a/2024/bonus/main.tf +++ b/2024/bonus/main.tf @@ -56,3 +56,12 @@ output "day03_2" { # output "day04_2" { # value = module.day04.part2 # } + +module "day05" { + source = "./day05" + input = file("../inputs/05.txt") +} + +output "day05_1" { + value = module.day05.part1 +} diff --git a/2024/bonus/tests.tftest.hcl b/2024/bonus/tests.tftest.hcl index 4bfe25e..a4669de 100644 --- a/2024/bonus/tests.tftest.hcl +++ b/2024/bonus/tests.tftest.hcl @@ -113,3 +113,20 @@ run "day4" { error_message = "Part2 output is wrong" } } + +run "day5_1" { + command = plan + + module { + source = "./day05" + } + + variables { + input = file("../tests/samples/05.txt") + } + + assert { + condition = output.part1 == 143 + error_message = "Part1 output is wrong" + } +}