summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--factors/factors_test.go17
-rw-r--r--factors/score.go39
-rw-r--r--radix_info.go1
3 files changed, 57 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
+}
diff --git a/radix_info.go b/radix_info.go
index 4194a2c..3e83aad 100644
--- a/radix_info.go
+++ b/radix_info.go
@@ -22,6 +22,7 @@ func main() {
fmt.Printf("Factors: %v (Score: %.2f)\n", n_factors, factorScore)
fmt.Printf("Totative Ratio: %03.1f%%\n",
factors.TotativeRatio(n)*100.0)
+ fmt.Printf("2345 Rank: %s\n", factors.BasicRank(n))
} else {
fmt.Println("Argument must be an integer above 1.")
}