···
And(var1: String, var2: String)
Or(var1: String, var2: String)
19
-
Rshift(var: String, n: Int)
20
-
Lshift(var: String, n: Int)
20
+
Rshift(var1: String, var2: String)
21
+
Lshift(var1: String, var2: String)
25
-
pub type GetCircRes {
26
-
GetCircRes(value: Int, cache: CircuitCache)
25
+
GetRes(value: Int, cache: CircuitCache)
let get = fn(name, cache) { get_circuit_var(circuit, name, cache) }
let parsed_name = int.base_parse(name, 10)
37
-
let GetCircRes(value, cache) = case result.is_ok(parsed_name) {
38
-
True -> GetCircRes(parsed_name |> unwrap(0), cache)
36
+
case result.is_ok(parsed_name) {
37
+
True -> GetRes(parsed_name |> unwrap(0), cache)
case dict.get(cache, name) {
41
-
Ok(value) -> GetCircRes(value, cache)
43
-
case dict.get(circuit, name) |> unwrap(OpError) {
45
-
let GetCircRes(value, cache) = get(var, cache)
46
-
GetCircRes(int.bitwise_not(value), cache)
48
-
And(var1, var2) -> {
49
-
let GetCircRes(value1, cache) = get(var1, cache)
50
-
let GetCircRes(value2, cache) = get(var2, cache)
51
-
GetCircRes(int.bitwise_and(value1, value2), cache)
54
-
let GetCircRes(value1, cache) = get(var1, cache)
55
-
let GetCircRes(value2, cache) = get(var2, cache)
56
-
GetCircRes(int.bitwise_or(value1, value2), cache)
59
-
let GetCircRes(value, cache) = get(var, cache)
60
-
GetCircRes(int.bitwise_shift_right(value, n), cache)
40
+
Ok(value) -> GetRes(value, cache)
42
+
// will crash if it gets bad data
43
+
let assert Ok(op) = dict.get(circuit, name)
45
+
let #(value1, value2, cache) = case op {
46
+
Not(v) | Set(v) -> {
47
+
let GetRes(value, cache) = get(v, cache)
63
-
let GetCircRes(value, cache) = get(var, cache)
64
-
GetCircRes(int.bitwise_shift_left(value, n), cache)
50
+
And(v1, v2) | Or(v1, v2) | Rshift(v1, v2) | Lshift(v1, v2) -> {
51
+
let GetRes(value1, cache) = get(v1, cache)
52
+
let GetRes(value2, cache) = get(v2, cache)
53
+
#(value1, value2, cache)
66
-
Set(var) -> get(var, cache)
67
-
OpError -> GetCircRes(0, cache)
59
+
Not(_) -> int.bitwise_not(value1)
60
+
And(_, _) -> int.bitwise_and(value1, value2)
61
+
Or(_, _) -> int.bitwise_or(value1, value2)
62
+
Rshift(_, _) -> int.bitwise_shift_right(value1, value2)
63
+
Lshift(_, _) -> int.bitwise_shift_left(value1, value2)
65
+
GetRes(res, dict.insert(cache, name, res))
73
-
GetCircRes(value, dict.insert(cache, name, value))
···
dict.insert(circ, target, And(var1, var2))
[var1, "OR", var2, "->", target] ->
dict.insert(circ, target, Or(var1, var2))
89
-
[var, "RSHIFT", n, "->", target] ->
93
-
Rshift(var, int.base_parse(n, 10) |> unwrap(0)),
95
-
[var, "LSHIFT", n, "->", target] ->
99
-
Lshift(var, int.base_parse(n, 10) |> unwrap(0)),
85
+
[var1, "RSHIFT", var2, "->", target] ->
86
+
dict.insert(circ, target, Rshift(var1, var2))
87
+
[var1, "LSHIFT", var2, "->", target] ->
88
+
dict.insert(circ, target, Lshift(var1, var2))
[v, "->", target] -> dict.insert(circ, target, Set(v))
···
let result_part_1 = get_circuit_var(input, "a", dict.new()).value
println(result_part_1 |> to_string)
110
-
let result_part_2 =
112
-
dict.insert(input, "b", Set(int.to_string(result_part_1))),
98
+
let input_part_2 = dict.insert(input, "b", Set(int.to_string(result_part_1)))
99
+
let result_part_2 = get_circuit_var(input_part_2, "a", dict.new()).value
println(result_part_2 |> to_string)