Avenious Avenious - 2 years ago 85
Swift Question

(Swift) Trying to iterate through remaining elements in array, add those elements independently, and check to see if they match random number given

Disclaimer: new to swift.

I have a simple dice game that needs to match the number shown on dice to the tiles(ints) remaining on the board. I am able to enumerate through the array for a direct match but, if the dice show a greater number than the tiles individually I need to check if those tiles(ints), in any combination, can also match the number on dice shown.

for loops, do-while, enumerations.....head is starting to explode. Example below shows a condensed version of where i think i'm going. any help would be great.

var array = [1,2,3,4]

func roundOver () {

var ran = Int(arc4random_uniform(7) % 7 + 1)

for (index,value)in enumerate(array) {
if value == ran {
} else if value != ran {
do {..........huh?

Answer Source

If I understand your question correctly, you need to solve the "Subset sum problem":

Given a set S and a number x, is there a subset of S whose sum is equal to x?

This problem can be efficiently solved with "dynamic programming", as described in the Wikipedia article. For small sets, a brute-force algorithm can be used which simply tries all possible subsets. This can be recursively written as

func isSummableTo(array: [UInt], _ value: UInt) -> Bool {
    if value == 0 {
        // We have reached the exact sum
        return true
    } else if array.count == 0 {
        // No elements left to try
        return false
    // Split into first element and remaining array:
    var array1 = array
    let first = array1.removeAtIndex(0)
    // Try to build the sum without or with the first element:
    return isSummableTo(array1, value) || (value >= first && isSummableTo(array1, value - first))

(Here I have assumed that you work only with non-negative integers.)

For example

isSummableTo([1, 3, 5, 10], 6) == true

because 1 + 5 = 6, and

isSummableTo([1, 3, 5, 10], 7) == false

because there is not subset of the numbers 1, 3, 5, 10 that sums up to 7.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download