57 lines
1.6 KiB
Text
57 lines
1.6 KiB
Text
import "./math" for Int, Nums
|
|
|
|
var maxDepth = 5
|
|
var maxBase = 36
|
|
var c = Int.primeSieve(maxBase.pow(maxDepth), false)
|
|
var digits = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
var maxStrings = []
|
|
var mostBases = -1
|
|
|
|
var process = Fn.new { |indices|
|
|
var minBase = 2.max(Nums.max(indices) + 1)
|
|
if (maxBase - minBase + 1 < mostBases) return // can't affect results so return
|
|
var bases = []
|
|
for (b in minBase..maxBase) {
|
|
var n = 0
|
|
for (i in indices) n = n * b + i
|
|
if (!c[n]) bases.add(b)
|
|
}
|
|
var count = bases.count
|
|
if (count > mostBases) {
|
|
mostBases = count
|
|
maxStrings = [[indices.toList, bases]]
|
|
} else if (count == mostBases) {
|
|
maxStrings.add([indices.toList, bases])
|
|
}
|
|
}
|
|
|
|
var printResults = Fn.new {
|
|
System.print("%(maxStrings[0][1].count)")
|
|
for (m in maxStrings) {
|
|
var s = m[0].reduce("") { |acc, i| acc + digits[i] }
|
|
System.print("%(s) -> %(m[1])")
|
|
}
|
|
}
|
|
|
|
var nestedFor // recursive
|
|
nestedFor = Fn.new { |indices, length, level|
|
|
if (level == indices.count) {
|
|
process.call(indices)
|
|
} else {
|
|
indices[level] = (level == 0) ? 1 : 0
|
|
while (indices[level] < length) {
|
|
nestedFor.call(indices, length, level + 1)
|
|
indices[level] = indices[level] + 1
|
|
}
|
|
}
|
|
}
|
|
|
|
for (depth in 1..maxDepth) {
|
|
System.write("%(depth) character strings which are prime in most bases: ")
|
|
maxStrings = []
|
|
mostBases = -1
|
|
var indices = List.filled(depth, 0)
|
|
nestedFor.call(indices, maxBase, 0)
|
|
printResults.call()
|
|
System.print()
|
|
}
|