Software Engineering

Sums of Parts in Kotlin

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))

}
}
``````