From 0dbb8d49e919e1f2f2cff83eb17a6ac3eed00ce8 Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Sun, 18 Aug 2024 12:23:00 +0200 Subject: [PATCH] =?UTF-8?q?go:=20add=20=C2=AB264.=20Ugly=20Number=20II?= =?UTF-8?q?=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Matej Focko --- go/ugly-number-ii.go | 50 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 go/ugly-number-ii.go diff --git a/go/ugly-number-ii.go b/go/ugly-number-ii.go new file mode 100644 index 0000000..34bd08e --- /dev/null +++ b/go/ugly-number-ii.go @@ -0,0 +1,50 @@ +package main + +import ( + "cmp" + "slices" +) + +type Factor struct { + factor int + index int + next int +} + +func MakeFactor(factor int) Factor { + return Factor{ + factor: factor, + index: 0, + next: factor, + } +} + +func (f *Factor) Update(ugly []int, last int) { + if last != f.next { + return + } + + f.index++ + f.next = f.factor * ugly[f.index] +} + +func nthUglyNumber(n int) int { + ugly := make([]int, n) + ugly[0] = 1 + + factors := []Factor{ + MakeFactor(2), MakeFactor(3), MakeFactor(5), + } + + for i := 1; i < n; i++ { + ugly[i] = slices.MinFunc(factors, func(a, b Factor) int { + return cmp.Compare(a.next, b.next) + }).next + + for j, _ := range factors { + factors[j].Update(ugly, ugly[i]) + } + } + + return ugly[n-1] +}