## The challenge

Let us consider this example (array written in general format):

`ls = [0, 1, 3, 6, 10]`

Its following parts:

 ``````1 2 3 4 5 6 `````` ``````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:

 ``````1 2 3 4 5 6 7 8 9 `````` ``````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:

 ``````1 2 3 4 5 6 7 8 9 `````` ``````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:

 `````` 1 2 3 4 5 6 7 8 9 10 11 `````` ``````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:

 `````` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 `````` ``````package sumofparts import java.util.* fun sumParts(ls: IntArray): IntArray { val totalSum = ls.sum() var currentSum = totalSum val link = LinkedList() ls.forEach { link.add(currentSum) currentSum -= it } link.addLast(0) return link.toIntArray() } ``````

## Test cases to validate our solution

 `````` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 `````` ``````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)) } } ``````