50 lines
1.0 KiB
Plaintext
50 lines
1.0 KiB
Plaintext
fn piSpigot(n) {
|
|
var pi = []
|
|
val boxes = n * 10 / 3
|
|
var reminders = []
|
|
for (i in 0..<boxes) {
|
|
reminders.add(2)
|
|
}
|
|
var heldDigits = 0
|
|
for (i in 0..n) {
|
|
var carriedOver = 0
|
|
var sum = 0
|
|
for (k in 1..boxes) {
|
|
val j = boxes - k
|
|
val denom = j * 2 + 1
|
|
reminders[j] *= 10
|
|
sum = reminders[j] + carriedOver
|
|
// Keep this integer-only. Real coercion here is much slower in the hot loop.
|
|
val quotient = sum / denom
|
|
reminders[j] = sum % denom
|
|
carriedOver = quotient * j
|
|
}
|
|
reminders[0] = sum % 10
|
|
var q = sum / 10
|
|
if (q == 9) {
|
|
++heldDigits
|
|
} else if (q == 10) {
|
|
q = 0
|
|
for (k in 1..heldDigits) {
|
|
var replaced = pi[i - k]
|
|
if (replaced == 9) {
|
|
replaced = 0
|
|
} else {
|
|
++replaced
|
|
}
|
|
pi[i - k] = replaced
|
|
}
|
|
heldDigits = 1
|
|
} else {
|
|
heldDigits = 1
|
|
}
|
|
pi.add(q)
|
|
}
|
|
|
|
var suffix = ""
|
|
for (i in (n - 8)..<n) {
|
|
suffix += pi[i]
|
|
}
|
|
suffix
|
|
}
|