summaryrefslogtreecommitdiff
path: root/factors
diff options
context:
space:
mode:
authorAdrien Hopkins <adrien.p.hopkins@gmail.com>2023-08-15 19:39:51 -0500
committerAdrien Hopkins <adrien.p.hopkins@gmail.com>2023-08-21 09:56:06 -0500
commit58df2b08f57076800745009aa4d562ef77ba6f9c (patch)
tree9bb5b52a3daac689d965634002c08a2fe68e6c03 /factors
parent564e53cdd4d6fc8b611d59c2c19af42864e6ece4 (diff)
Add 2345 Score to output
Diffstat (limited to 'factors')
-rw-r--r--factors/factors_test.go17
-rw-r--r--factors/score.go39
2 files changed, 56 insertions, 0 deletions
diff --git a/factors/factors_test.go b/factors/factors_test.go
index ceaf4d1..f14dd31 100644
--- a/factors/factors_test.go
+++ b/factors/factors_test.go
@@ -105,6 +105,23 @@ func TestFactorScore(t *testing.T) {
}
}
+var basicRankCases = map[uint]string{
+ 2: "D-", 3: "E-", 4: "C~", 5: "F+", 6: "B~",
+ 7: "F-", 8: "C-", 9: "E~", 10: "D+", 11: "F~", 12: "A-",
+ 14: "D~", 15: "E+", 18: "B-", 20: "C+", 24: "A~", 30: "B+", 60: "A+",
+}
+
+func TestBasicRank (t *testing.T) {
+ for i, expected := range basicRankCases {
+ t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
+ actual := BasicRank(i)
+ if expected != actual {
+ t.Errorf("BasicRank(%d) = %s, want %s", i, actual, expected)
+ }
+ })
+ }
+}
+
func mapEquals[K comparable, V comparable](a, b map[K]V) bool {
for k := range a {
if a[k] != b[k] {
diff --git a/factors/score.go b/factors/score.go
index 707120d..b47aac4 100644
--- a/factors/score.go
+++ b/factors/score.go
@@ -26,3 +26,42 @@ func Score(n uint) float64 {
}
return float64(factorSum) / float64(n)
}
+
+// BasicRank returns a rank describing how well a base handles the simplest
+// fractions (1/2, 1/3, 1/4 and 1/5)
+// also known as 2345 Rank
+func BasicRank(n uint) string {
+ var firstRank, secondRank string
+ if n%2 == 0 {
+ if n%3 == 0 {
+ if n%4 == 0 {
+ firstRank = "A"
+ } else {
+ firstRank = "B"
+ }
+ } else {
+ if n%4 == 0 {
+ firstRank = "C"
+ } else {
+ firstRank = "D"
+ }
+ }
+ } else {
+ if n%3 == 0 {
+ firstRank = "E"
+ } else {
+ firstRank = "F"
+ }
+ }
+
+ switch n % 5 {
+ case 0:
+ secondRank = "+"
+ case 1, 4:
+ secondRank = "~"
+ case 2, 3:
+ secondRank = "-"
+ }
+
+ return firstRank + secondRank
+}