Digital root/Multiplicative digital root: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) (Rename Perl 6 -> Raku, alphabetize, minor clean-up) |
(Added Wren) |
||
Line 2,777: | Line 2,777: | ||
8: (8, 18, 24, 29, 36) |
8: (8, 18, 24, 29, 36) |
||
9: (9, 19, 33, 91, 119) |
9: (9, 19, 33, 91, 119) |
||
</pre> |
|||
=={{header|Wren}}== |
|||
{{trans|Go}} |
|||
{{libheader|Wren-big}} |
|||
{{libheader|Wren-fmt}} |
|||
The size of some of the numbers here is such that we need to use BigInt. |
|||
<lang ecmascript>import "/big" for BigInt |
|||
import "/fmt" for Fmt |
|||
// Only valid for n > 0 && base >= 2 |
|||
var mult = Fn.new { |n, base| |
|||
var m = BigInt.one |
|||
while (m > BigInt.zero && n > BigInt.zero) { |
|||
var dm = n.divMod(base) |
|||
m = m * dm[1] |
|||
n = dm[0] |
|||
} |
|||
return m |
|||
} |
|||
// Only valid for n >= 0 && base >= 2 |
|||
var multDigitalRoot = Fn.new { |n, base| |
|||
base = BigInt.new(base) |
|||
var m = n.copy() |
|||
var mp = BigInt.zero |
|||
while (m >= base) { |
|||
m = mult.call(m, base) |
|||
mp = mp.inc |
|||
} |
|||
return [mp, m.toSmall] |
|||
} |
|||
var base = 10 |
|||
var size = 5 |
|||
var tests = [ |
|||
123321, 7739, 893, 899998,"18446743999999999999", 3778888999, "277777788888899" |
|||
] |
|||
var testFmt = "$20s $3s $3s" |
|||
Fmt.print(testFmt, "Number", "MDR", "MP") |
|||
for (test in tests) { |
|||
var n = BigInt.new(test) |
|||
var mpdr = multDigitalRoot.call(n, base) |
|||
Fmt.print(testFmt, n, mpdr[1], mpdr[0]) |
|||
} |
|||
System.print() |
|||
var list = List.filled(base, null) |
|||
for (i in 0...base) list[i] = [] |
|||
var cnt = size * base |
|||
var n = BigInt.zero |
|||
while (cnt > 0) { |
|||
var mpdr = multDigitalRoot.call(n, base) |
|||
var mdr = mpdr[1] |
|||
if (list[mdr].count < size) { |
|||
list[mdr].add(n) |
|||
cnt = cnt - 1 |
|||
} |
|||
n = n.inc |
|||
} |
|||
Fmt.print("$3s: $s", "MDR", "First") |
|||
var i = 0 |
|||
for (l in list) { |
|||
Fmt.print("$3d: $s", i, l.toString) |
|||
i = i + 1 |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
Number MDR MP |
|||
123321 8 3 |
|||
7739 8 3 |
|||
893 2 3 |
|||
899998 0 2 |
|||
18446743999999999999 0 2 |
|||
3778888999 0 10 |
|||
277777788888899 0 11 |
|||
MDR: First |
|||
0: [0, 10, 20, 25, 30] |
|||
1: [1, 11, 111, 1111, 11111] |
|||
2: [2, 12, 21, 26, 34] |
|||
3: [3, 13, 31, 113, 131] |
|||
4: [4, 14, 22, 27, 39] |
|||
5: [5, 15, 35, 51, 53] |
|||
6: [6, 16, 23, 28, 32] |
|||
7: [7, 17, 71, 117, 171] |
|||
8: [8, 18, 24, 29, 36] |
|||
9: [9, 19, 33, 91, 119] |
|||
</pre> |
</pre> |
||