Day 12 solution

Okay, I had to seek some advice on this one. The orbital period + least-common-multiple solution was not coming to me naturally.
This commit is contained in:
2022-06-23 10:08:33 -05:00
parent 4cdd9c645b
commit 2178a2618d
7 changed files with 226 additions and 0 deletions

27
utilities/math.go Normal file
View File

@ -0,0 +1,27 @@
package utilities
func GCD[T Integer](a, b T) T {
if b == 0 {
return a
}
return GCD(b, a%b)
}
func LCM[T Integer](nums ...T) uint64 {
num := len(nums)
if num == 0 {
return 0
} else if num == 1 {
return uint64(nums[0])
}
ret := lcm(nums[0], nums[1])
for i := 2; i < len(nums); i++ {
ret = lcm(uint64(nums[i]), ret)
}
return ret
}
func lcm[T Integer](a, b T) uint64 {
return uint64(a*b) / uint64(GCD(a, b))
}

View File

@ -7,6 +7,12 @@ type Vec2[T Number] struct {
Y T
}
type Vec3[T Number] struct {
X T
Y T
Z T
}
func (v Vec2[T]) Dot(other Vec2[T]) T {
return (v.X * other.X) + (v.Y * other.Y)
}
@ -37,3 +43,27 @@ func VecBetween[T Number](a, b Vec2[T]) Vec2[T] {
Y: a.Y - b.Y,
}
}
func (v Vec3[T]) Dot(other Vec3[T]) T {
return (v.X * other.X) + (v.Y * other.Y) + (v.Z * other.Z)
}
func (v Vec3[T]) Len() T {
return T(math.Sqrt(float64(v.LenSquared())))
}
func (v Vec3[T]) LenSquared() T {
return (v.X * v.X) + (v.Y * v.Y) + (v.Z * v.Z)
}
func (v *Vec3[T]) Add(other Vec3[T]) {
v.X += other.X
v.Y += other.Y
v.Z += other.Z
}
func (v Vec3[T]) Equals(other Vec3[T]) bool {
return v.X == other.X &&
v.Y == other.Y &&
v.Z == other.Z
}