{% set maxRecursion = 501 %} locals { input = file("input") inputParts = split("\n\n", local.input) blocks = split("\n", local.inputParts[0]) parsedBlocks = [for s in [for s in slice(local.blocks, 0, length(local.blocks) - 1) : split("", s)] : [for j in range(1, length(s), 4) : s[j]]] stackedBlocks = [for i in range(length(local.parsedBlocks[0])) : [for j in range(length(local.parsedBlocks)) : local.parsedBlocks[j][i] if local.parsedBlocks[j][i] != " "]] instructions = split("\n", replace(replace(replace(local.inputParts[1], "move ", ""), " from ", ","), " to ", ",")) output = { "part1" = join("", [for v in module.executor-{{ maxRecursion - 1 }}.finalBlocks : v[0]]), "part2" = join("", [for v in module.executor-non-reversed-{{ maxRecursion - 1 }}.finalBlocks : v[0]]) } } # you'll have to forgive me for this blasphemy. hashicorp did everything in their power # to prevent any forms of recursion, and i can't be bothered copy and pasting this block # 1000 times. {% for i in range(maxRecursion) %} module "executor-{{ i }}" { source = "./executor" {% if i == 0 %} stackedBlocks = local.stackedBlocks instructions = local.instructions {% else %} stackedBlocks = module.executor-{{ i - 1 }}.finalBlocks instructions = module.executor-{{ i - 1 }}.remainingInstructions {% endif %} reverse = true } module "executor-non-reversed-{{ i }}" { source = "./executor" {% if i == 0 %} stackedBlocks = local.stackedBlocks instructions = local.instructions {% else %} stackedBlocks = module.executor-non-reversed-{{ i - 1 }}.finalBlocks instructions = module.executor-non-reversed-{{ i - 1 }}.remainingInstructions {% endif %} reverse = false } {% endfor %} resource "local_file" "out" { filename = var.outpath content = jsonencode(local.output) } variable "outpath" {}