diff options
| author | Michael Firkins <michael@firkins> | 2023-10-03 13:49:11 +1100 |
|---|---|---|
| committer | Michael Firkins <michael@firkins> | 2023-10-03 13:49:11 +1100 |
| commit | 97f2d015bd33e12ea9c82aa5d64e7a3893e9b7ea (patch) | |
| tree | 9aa9b8c9b8bc129688dd8706cd56e4ec43fbb1bd | |
| parent | 98b832f1ff2919defd3e4fa528b60362a6caf0fc (diff) | |
| download | perlweeklychallenge-club-97f2d015bd33e12ea9c82aa5d64e7a3893e9b7ea.tar.gz perlweeklychallenge-club-97f2d015bd33e12ea9c82aa5d64e7a3893e9b7ea.tar.bz2 perlweeklychallenge-club-97f2d015bd33e12ea9c82aa5d64e7a3893e9b7ea.zip | |
pwc237 solution in go
| -rw-r--r-- | challenge-237/pokgopun/go/ch-1.go | 74 | ||||
| -rw-r--r-- | challenge-237/pokgopun/go/ch-2.go | 103 |
2 files changed, 177 insertions, 0 deletions
diff --git a/challenge-237/pokgopun/go/ch-1.go b/challenge-237/pokgopun/go/ch-1.go new file mode 100644 index 0000000000..df3cd16249 --- /dev/null +++ b/challenge-237/pokgopun/go/ch-1.go @@ -0,0 +1,74 @@ +//# https://theweeklychallenge.org/blog/perl-weekly-challenge-237/ +/*# + +Task 1: Seize The Day + +Submitted by: [44]Mark Anderson + __________________________________________________________________ + + Given a year, a month, a weekday of month, and a day of week (1 (Mon) + .. 7 (Sun)), print the day. + +Example 1 + +Input: Year = 2024, Month = 4, Weekday of month = 3, day of week = 2 +Output: 16 + +The 3rd Tue of Apr 2024 is the 16th + +Example 2 + +Input: Year = 2025, Month = 10, Weekday of month = 2, day of week = 4 +Output: 9 + +The 2nd Thu of Oct 2025 is the 9th + +Example 3 + +Input: Year = 2026, Month = 8, Weekday of month = 5, day of week = 3 +Output: 0 + +There isn't a 5th Wed in Aug 2026 + +Task 2: Maximise Greatness +#*/ +//# solution by pokgopun@gmail.com + +package main + +import ( + "fmt" + "time" +) + +func main() { + for _, data := range []struct { + mDate mDate + output int + }{ + {mDate{2024, 4, 3, 2}, 16}, + {mDate{2025, 10, 2, 4}, 9}, + {mDate{2026, 8, 5, 3}, 0}, + } { + fmt.Println(data.mDate.day() == data.output) + } +} + +type mDate struct { + y int + m time.Month + mw, wd int +} + +func (md mDate) day() int { + d := time.Date(md.y, md.m, 1, 0, 0, 0, 0, time.UTC) + wdd := (md.wd % 7) - int(d.Weekday()) + if wdd < 0 { + wdd += 7 + } + d = d.AddDate(0, 0, 7*(md.mw-1)+wdd) + if d.Month() != md.m { + return 0 + } + return d.Day() +} diff --git a/challenge-237/pokgopun/go/ch-2.go b/challenge-237/pokgopun/go/ch-2.go new file mode 100644 index 0000000000..fc9c652ddd --- /dev/null +++ b/challenge-237/pokgopun/go/ch-2.go @@ -0,0 +1,103 @@ +//# https://theweeklychallenge.org/blog/perl-weekly-challenge-237/ +/*# + +Task 2: Maximise Greatness + +Submitted by: [45]Mohammad S Anwar + __________________________________________________________________ + + You are given an array of integers. + + Write a script to permute the give array such that you get the maximum + possible greatness. + + To determine greatness, nums[i] < perm[i] where 0 <= i < nums.length + +Example 1 + +Input: @nums = (1, 3, 5, 2, 1, 3, 1) +Output: 4 + +One possible permutation: (2, 5, 1, 3, 3, 1, 1) which returns 4 greatness as bel +ow: +nums[0] < perm[0] +nums[1] < perm[1] +nums[3] < perm[3] +nums[4] < perm[4] + +Example 2 + +Input: @ints = (1, 2, 3, 4) +Output: 3 + +One possible permutation: (2, 3, 4, 1) which returns 3 greatness as below: +nums[0] < perm[0] +nums[1] < perm[1] +nums[2] < perm[2] + __________________________________________________________________ + + Last date to submit the solution 23:59 (UK Time) Sunday 8th October + 2023. + __________________________________________________________________ + +SO WHAT DO YOU THINK ? +#*/ +//# solution by pokgopun@gmail.com + +package main + +import "fmt" + +func main() { + for _, data := range []struct { + input []int + output uint + }{ + {[]int{1, 3, 5, 2, 1, 3, 1}, 4}, + {[]int{1, 2, 3, 4}, 3}, + } { + fmt.Println(mySlice(data.input).maxGreat() == data.output) + } +} + +type mySlice []int + +func (ms mySlice) maxGreat() uint { + n := uint(len(ms)) + fact := uint(1) + for i := n; i > 1; i-- { + fact *= i + } + var g, mg uint + for r := uint(0); r < fact; r++ { + g = ms.great(n, r, fact) + if mg < g { + mg = g + } + } + return mg +} + +func (ms mySlice) great(n, r, fact uint) (g uint) { + if r > fact-1 { + return 0 + } + fact /= n + digits := make([]uint, uint(n)) + for i := uint(0); i < n; i++ { + digits[i] = i + } + var q uint + for i := uint(0); i < n; i++ { + q = r / fact + r %= fact + if ms[digits[q]] > ms[i] { + g++ + } + copy(digits[q:], digits[q+1:]) + if i != n-1 { + fact /= n - 1 - i + } + } + return g +} |
