I just finished Project Euler #13 in Swift, and since there is not any version yet on Code Review, I would like to have some comments on what I did to try to improve it.Work out the first ten digits of the sum of the following one-hundred  50-digit numbers.37107287533902102798797998220837590246510135740250  46376937677490009712648124896970078050417018260538  74324986199524741059474233309513058123726617309629  91942213363574161572522430563301811072406154908250  23067588207539346171171980310421047513778063246676  89261670696623633820136378418383684178734361726757  28112879812849979408065481931592621691275889832738  44274228917432520321923589422876796487670272189318  47451445736001306439091167216856844588711603153276  70386486105843025439939619828917593665686757934951  62176457141856560629502157223196586755079324193331  64906352462741904929101432445813822663347944758178  92575867718337217661963751590579239728245598838407  58203565325359399008402633568948830189458628227828  80181199384826282014278194139940567587151170094390  35398664372827112653829987240784473053190104293586  86515506006295864861532075273371959191420517255829  71693888707715466499115593487603532921714970056938  54370070576826684624621495650076471787294438377604  53282654108756828443191190634694037855217779295145  36123272525000296071075082563815656710885258350721  45876576172410976447339110607218265236877223636045  17423706905851860660448207621209813287860733969412  81142660418086830619328460811191061556940512689692  51934325451728388641918047049293215058642563049483  62467221648435076201727918039944693004732956340691  15732444386908125794514089057706229429197107928209  55037687525678773091862540744969844508330393682126  18336384825330154686196124348767681297534375946515  80386287592878490201521685554828717201219257766954  78182833757993103614740356856449095527097864797581  16726320100436897842553539920931837441497806860984  48403098129077791799088218795327364475675590848030  87086987551392711854517078544161852424320693150332  59959406895756536782107074926966537676326235447210  69793950679652694742597709739166693763042633987085  41052684708299085211399427365734116182760315001271  65378607361501080857009149939512557028198746004375  35829035317434717326932123578154982629742552737307  94953759765105305946966067683156574377167401875275  88902802571733229619176668713819931811048770190271  25267680276078003013678680992525463401061632866526  36270218540497705585629946580636237993140746255962  24074486908231174977792365466257246923322810917141  91430288197103288597806669760892938638285025333403  34413065578016127815921815005561868836468420090470  23053081172816430487623791969842487255036638784583  11487696932154902810424020138335124462181441773470  63783299490636259666498587618221225225512486764533  67720186971698544312419572409913959008952310058822  95548255300263520781532296796249481641953868218774  76085327132285723110424803456124867697064507995236  37774242535411291684276865538926205024910326572967  23701913275725675285653248258265463092207058596522  29798860272258331913126375147341994889534765745501  18495701454879288984856827726077713721403798879715  38298203783031473527721580348144513491373226651381  34829543829199918180278916522431027392251122869539  40957953066405232632538044100059654939159879593635  29746152185502371307642255121183693803580388584903  41698116222072977186158236678424689157993532961922  62467957194401269043877107275048102390895523597457  23189706772547915061505504953922979530901129967519  86188088225875314529584099251203829009407770775672  11306739708304724483816533873502340845647058077308  82959174767140363198008187129011875491310547126581  97623331044818386269515456334926366572897563400500  42846280183517070527831839425882145521227251250327  55121603546981200581762165212827652751691296897789  32238195734329339946437501907836945765883352399886  75506164965184775180738168837861091527357929701337  62177842752192623401942399639168044983993173312731  32924185707147349566916674687634660915035914677504  99518671430235219628894890102423325116913619626622  73267460800591547471830798392868535206946944540724  76841822524674417161514036427982273348055556214818  97142617910342598647204516893989422179826088076852  87783646182799346313767754307809363333018982642090  10848802521674670883215120185883543223812876952786  71329612474782464538636993009049310363619763878039  62184073572399794223406235393808339651327408011116  66627891981488087797941876876144230030984490851411  60661826293682836764744779239180335110989069790714  85786944089552990653640447425576083659976645795096  66024396409905389607120198219976047599490197230297  64913982680032973156037120041377903785566085089252  16730939319872750275468906903707539413042652315011  94809377245048795150954100921645863754710598436791  78639167021187492431995700641917969777599028300699  15368713711936614952811305876380278410754449733078  40789923115535562561142322423255033685442488917353  44889911501440648020369068063960672322193204149535  41503128880339536053299340368006977710650566631954  81234880673210146739058568557934581403627822703280  82616570773948327592232845941706525094512325230608  22918802058777319719839450180888072429661980811197  77158542502016545090413245809786882778948721859617  72107838435069186155435662884062257473692284509516  20849603980134001723930671666823555245252804609722  53503534226472524250874054075591789781264330331690import Foundationfunc addToResult(inout results:[Int], var addResult:Int, index:Int) {    if index == results.count {        results.append(0)    }    addResult = results[index] + addResult    var result = addResult % 10    results[index] = result    var retain = addResult / 10    if retain > 0 {        addToResult(&results, retain, index + 1)    }}func add(left:String, right:String) -> String {    let leftNumbers:[Int] = Array(left).reverse().map() { String($0).toInt()! }    let rightNumbers:[Int] = Array(right).reverse().map() { String($0).toInt()! }    var results:[Int] = [Int]()    var index = max(leftNumbers.count, rightNumbers.count)    var i = 0    while i < index {        let leftNumber = i >= leftNumbers.count ? 0 : leftNumbers[i]        let rightNumber = i >= rightNumbers.count ? 0 : rightNumbers[i]        let addResult = leftNumber + rightNumber        addToResult(&results, addResult, i)        i++    }    return .join(results.reverse().map() { String($0) } )}func largeSum(numbers:[String]) -> String {    var result =     for number in numbers {        result = add(result, number)    }    return result}func euler13() {    let numbers = [        37107287533902102798797998220837590246510135740250,        46376937677490009712648124896970078050417018260538,        74324986199524741059474233309513058123726617309629,        91942213363574161572522430563301811072406154908250,        23067588207539346171171980310421047513778063246676,        89261670696623633820136378418383684178734361726757,        28112879812849979408065481931592621691275889832738,        44274228917432520321923589422876796487670272189318,        47451445736001306439091167216856844588711603153276,        70386486105843025439939619828917593665686757934951,        62176457141856560629502157223196586755079324193331,        64906352462741904929101432445813822663347944758178,        92575867718337217661963751590579239728245598838407,        58203565325359399008402633568948830189458628227828,        80181199384826282014278194139940567587151170094390,        35398664372827112653829987240784473053190104293586,        86515506006295864861532075273371959191420517255829,        71693888707715466499115593487603532921714970056938,        54370070576826684624621495650076471787294438377604,        53282654108756828443191190634694037855217779295145,        36123272525000296071075082563815656710885258350721,        45876576172410976447339110607218265236877223636045,        17423706905851860660448207621209813287860733969412,        81142660418086830619328460811191061556940512689692,        51934325451728388641918047049293215058642563049483,        62467221648435076201727918039944693004732956340691,        15732444386908125794514089057706229429197107928209,        55037687525678773091862540744969844508330393682126,        18336384825330154686196124348767681297534375946515,        80386287592878490201521685554828717201219257766954,        78182833757993103614740356856449095527097864797581,        16726320100436897842553539920931837441497806860984,        48403098129077791799088218795327364475675590848030,        87086987551392711854517078544161852424320693150332,        59959406895756536782107074926966537676326235447210,        69793950679652694742597709739166693763042633987085,        41052684708299085211399427365734116182760315001271,        65378607361501080857009149939512557028198746004375,        35829035317434717326932123578154982629742552737307,        94953759765105305946966067683156574377167401875275,        88902802571733229619176668713819931811048770190271,        25267680276078003013678680992525463401061632866526,        36270218540497705585629946580636237993140746255962,        24074486908231174977792365466257246923322810917141,        91430288197103288597806669760892938638285025333403,        34413065578016127815921815005561868836468420090470,        23053081172816430487623791969842487255036638784583,        11487696932154902810424020138335124462181441773470,        63783299490636259666498587618221225225512486764533,        67720186971698544312419572409913959008952310058822,        95548255300263520781532296796249481641953868218774,        76085327132285723110424803456124867697064507995236,        37774242535411291684276865538926205024910326572967,        23701913275725675285653248258265463092207058596522,        29798860272258331913126375147341994889534765745501,        18495701454879288984856827726077713721403798879715,        38298203783031473527721580348144513491373226651381,        34829543829199918180278916522431027392251122869539,        40957953066405232632538044100059654939159879593635,        29746152185502371307642255121183693803580388584903,        41698116222072977186158236678424689157993532961922,        62467957194401269043877107275048102390895523597457,        23189706772547915061505504953922979530901129967519,        86188088225875314529584099251203829009407770775672,        11306739708304724483816533873502340845647058077308,        82959174767140363198008187129011875491310547126581,        97623331044818386269515456334926366572897563400500,        42846280183517070527831839425882145521227251250327,        55121603546981200581762165212827652751691296897789,        32238195734329339946437501907836945765883352399886,        75506164965184775180738168837861091527357929701337,        62177842752192623401942399639168044983993173312731,        32924185707147349566916674687634660915035914677504,        99518671430235219628894890102423325116913619626622,        73267460800591547471830798392868535206946944540724,        76841822524674417161514036427982273348055556214818,        97142617910342598647204516893989422179826088076852,        87783646182799346313767754307809363333018982642090,        10848802521674670883215120185883543223812876952786,        71329612474782464538636993009049310363619763878039,        62184073572399794223406235393808339651327408011116,        66627891981488087797941876876144230030984490851411,        60661826293682836764744779239180335110989069790714,        85786944089552990653640447425576083659976645795096,        66024396409905389607120198219976047599490197230297,        64913982680032973156037120041377903785566085089252,        16730939319872750275468906903707539413042652315011,        94809377245048795150954100921645863754710598436791,        78639167021187492431995700641917969777599028300699,        15368713711936614952811305876380278410754449733078,        40789923115535562561142322423255033685442488917353,        44889911501440648020369068063960672322193204149535,        41503128880339536053299340368006977710650566631954,        81234880673210146739058568557934581403627822703280,        82616570773948327592232845941706525094512325230608,        22918802058777319719839450180888072429661980811197,        77158542502016545090413245809786882778948721859617,        72107838435069186155435662884062257473692284509516,        20849603980134001723930671666823555245252804609722,        53503534226472524250874054075591789781264330331690    ]    let number = largeSum(numbers)    println(number)}func printTimeElapsedWhenRunningCode(operation:() -> ()) {    let startTime = CFAbsoluteTimeGetCurrent()    operation()    let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime    println(Time elapsed : \(timeElapsed) s)}printTimeElapsedWhenRunningCode(euler13)The code executes in 0.1sI'm not fan of the add function I did. Maybe storing the results in an [Int], was not the best choice, but I do not like the way String ranges/nTh character are handled.I did not find an elegant/performant way to have something like this :let str = 123str[3] // An Optional Int?str[2] // 3 as an Int
Project Euler #13 in Swift - Large sum
programming challenge;swift
The definition of the numbers array let numbers = [    37107287533902102798797998220837590246510135740250,    ...    53503534226472524250874054075591789781264330331690]takes a lot of space in the euler13() function and therefore distracts fromthe relevant code. I would store the original data from the Project Euler problem into a text file and load the data from there. That also helps to avoid copy/pasteerrors or other typos, e.g. when adding the quotation marks and commas.For an Xcode command-line project this is done by adding a Other->Empty file data.txt to the project and adding this file to the Copy Files build phase:Then you can copy/paste the given data into this file and load it at runtime,so that the main function becomesfunc euler13() {    let path = NSBundle.mainBundle().pathForResource(data, ofType: txt)!    let data = NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding, error: nil)!    let numbers = data.componentsSeparatedByString(\n) as [String]    let number = largeSum(numbers)    println(number)}Strictly speaking, your output is not correct, as the problem asks only for thefirst 10 digits of the sum. This would be done withfunc euler13() {    // ...    let number = largeSum(numbers)    println(number[number.startIndex ..< advance(number.startIndex, 10)])}Storing the numbers in an integer array is a good choice, as working on a Swiftstring directly would most probably be much slower. But I would separatethe String <-> [Int] conversions into separate functions:func stringToIntArray(str : String) -> [Int] {    return Array(str).reverse().map() { String($0).toInt()! }}func intArrayToString(num: [Int]) -> String {    return .join(num.reverse().map() { String($0) } )}Your code computes the sum of two large numbers in an integer array andthen converts that array back to a string. In the next step the string isconverted to an integer array again for the next addition.It would be more effective to use only integer arrays for all intermediateresults, and convert only the final sum back to a string.Then largeSum() would look like this:func largeSum(numbers:[String]) -> String {    var result : [Int] = []    for number in numbers {        let num = stringToIntArray1(number)        addToIntArray(&result, num)    }    return intArrayToString(result)}Your addToResult functions adds only a single digit to a large integer(represented as an [Int]) array. It is more effective to add two large integers in a single loop:func addToIntArray(inout result: [Int], num: [Int]) {    var carry = 0    let commonLength = min(result.count, num.count)    var index = 0    while index < commonLength {        let sum = result[index] + num[index] + carry        result[index] = sum % 10        carry = sum / 10        index++    }    while index < num.count {        let sum = num[index] + carry        result.append(sum % 10)        carry = sum / 10        index++    }    while index < result.count && carry > 0 {        let sum = result[index] + carry        result[index] = sum % 10        carry = sum / 10        index++    }    if carry > 0 {        result.append(carry)    }}On my computer, these changes reduced the time from 0.032 to 0.017 seconds.Now profiling showed that much of the time is spent in the stringToIntArray()function. The following version is significantly faster:func stringToIntArray(str : String) -> [Int] {    var num : [Int] = []    let unicodeDigitZero = 48    for digit in str.unicodeScalars {        num.append(Int(digit.value) - unicodeDigitZero)    }    return reverse(num)}The computation time is now 0.006 seconds.Ideas for further possible improvements:Store more than one decimal digit in each element of the [Int] array.This would make the addition faster, but the string to array conversion more complicated.Cheat. The problem asks only for the first 10 digits of the sum.That means that only a initial portion of the given numbers is actually needed.