diff --git a/src/advent/util.cr b/src/advent/util.cr index e49183a..e7337ae 100644 --- a/src/advent/util.cr +++ b/src/advent/util.cr @@ -19,3 +19,33 @@ class Array(T) end end end + +struct Tuple(*T) + def add(other : Tuple(*T)) + {% begin %} + { {% for t, i in T %} self[{{i}}] + other[{{i}}], {% end %} } + {% end %} + end + + def neg + {% begin %} + { {% for t, i in T %} -self[{{i}}], {% end %} } + {% end %} + end + + def sub(other : Tuple(*T)) + add other.neg + end + + def dot(other : Tuple(*T)) + {% begin %} + {% for t, i in T %} self[{{i}}] * other[{{i}}] + {% end %} 0 + {% end %} + end + + def reduce_fraction + gcd = self[0].gcd self[1] + return self if gcd == 0 + { self[0]//gcd, self[1]//gcd} + end +end