From 36ea4a177d8a2f34a7b7ec07a580eeb5305b37ef Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Fri, 6 Dec 2019 10:32:41 -0500 Subject: [PATCH] Intcode assembler: add data labels --- lib/intcode/assembler.ex | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/lib/intcode/assembler.ex b/lib/intcode/assembler.ex index b01e3cc..6468e78 100644 --- a/lib/intcode/assembler.ex +++ b/lib/intcode/assembler.ex @@ -1,9 +1,9 @@ defmodule Assembler do @asm """ - in #30 - clt 30 #8 #31 + in #res + clt res #8 #31 jnz 31 #lessThan - ceq 30 #8 #31 + ceq res #8 #31 jnz 31 #equal out #1001 hlt @@ -15,14 +15,16 @@ defmodule Assembler do equal: out #1000 hlt + + res: 0 """ def test do @asm |> IO.inspect() - |> assemble(32) + |> assemble() end - def assemble(asm, pad_length \\ 0) do + def assemble(asm) do {memory, labels} = asm |> String.split("\n") @@ -44,6 +46,15 @@ defmodule Assembler do Map.put(labels, String.slice(line, 0..-2), length(memory)) } + Regex.match?(~r/^\w+: \d+$/, line) -> + [name, value] = String.split(line, ": ") + value = String.to_integer(value) + + { + [value | memory], + Map.put(labels, name, length(memory)) + } + true -> IO.inspect("Ignoring line: #{line}") end @@ -55,13 +66,6 @@ defmodule Assembler do it -> it end) - memory = - if pad_length > length(memory) do - repeat(0, pad_length - length(memory)) ++ memory - else - memory - end - IO.inspect(labels) Enum.reverse(memory) end @@ -84,7 +88,7 @@ defmodule Assembler do String.to_integer(digits) _ -> - [_, name] = Regex.run(~r/^#(\w+)$/, param) + [_, name] = Regex.run(~r/^#?(\w+)$/, param) {:label, name} end