The challenge
Let us consider this example (array written in general format):
ls = [0, 1, 3, 6, 10]
Its following parts:
ls = [0, 1, 3, 6, 10]
ls = [1, 3, 6, 10]
ls = [3, 6, 10]
ls = [6, 10]
ls = [10]
ls = []
The corresponding sums are (put together in a list): [20, 20, 19, 16, 10, 0]
The function parts_sums
(or its variants in other languages) will take as parameter a list ls
and return a list of the sums of its parts as defined above.
Other Examples:
ls = [1, 2, 3, 4, 5, 6]
// [21, 20, 18, 15, 11, 6, 0]
parts_sums(ls)
ls = [744125, 935, 407, 454, 430, 90, 144, 6710213, 889, 810, 2579358]
// [10037855, 9293730, 9292795, 9292388, 9291934, 9291504, 9291414, 9291270, 2581057, 2580168, 2579358, 0]
parts_sums(ls)
The solution in Kotlin
Option 1:
package sumofparts
fun sumParts(ls: IntArray): IntArray {
val result = IntArray(ls.size + 1)
for (i in ls.indices.reversed()) {
result[i] = result[i + 1] + ls[i]
}
return result
}
Option 2:
package sumofparts
fun sumParts(ls: IntArray): IntArray {
val result = IntArray(ls.size + 1) {0}
ls.reverse()
for (i in 1..ls.size) {
result[i] = result[i - 1] + ls[i - 1]
}
result.reverse()
return result
}
Option 3:
package sumofparts
import java.util.*
fun sumParts(ls: IntArray): IntArray {
val totalSum = ls.sum()
var currentSum = totalSum
val link = LinkedList<Int>()
ls.forEach {
link.add(currentSum)
currentSum -= it
}
link.addLast(0)
return link.toIntArray()
}
Test cases to validate our solution
package sumofparts
import org.junit.Assert.*
import org.junit.Test
//import kotlin.test.assertEquals
class sumofpartsTest {
fun dotest(ls: IntArray, expected: IntArray) {
val actual: IntArray = sumParts(ls)
assertArrayEquals(expected, actual)
}
@Test
fun test() {
dotest(intArrayOf(), intArrayOf(0));
dotest(intArrayOf(0, 1, 3, 6, 10), intArrayOf(20, 20, 19, 16, 10, 0))
dotest(intArrayOf(1, 2, 3, 4, 5, 6), intArrayOf(21, 20, 18, 15, 11, 6, 0))
dotest(intArrayOf(744125, 935, 407, 454, 430, 90, 144, 6710213, 889, 810, 2579358),
intArrayOf(10037855, 9293730, 9292795, 9292388, 9291934, 9291504, 9291414, 9291270, 2581057, 2580168, 2579358, 0))
}
}