Porting Project Euler #8 to Go

111 Views Asked by At

I am trying to learn Go, and I decided to use Project Euler to help me. I have previously solved some of the problems in Javascript. I am trying to port #8 to Go.

Here it is in Javascript

var n = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";

// Split our input into an array
n = n.split("");

// Loop through every 13 length chuck multiplying them. Keep track of the largest
var largest = 0;
for (var i = 0; i < (n.length - 12); i++) {
    var b = n.slice(i, i + 13);
    var product = b.reduce(function(prev, current) {
        return prev * Number(current);
    }, 1);
    if (product > largest) {
        largest = product;
    }
}
console.log(largest);

And here is my port in Go

import (
    "fmt"
    "strconv"
    "strings"
)

var data string = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"

func main() {
    // Get an array of ints
    var grid []int
    var stringGrid []string = strings.Split(data, "")
    for i := 0; i < 1000; i++ {
        cell, _ := strconv.Atoi(stringGrid[i])
        grid = append(grid, cell)
    }

    // Find the largest one
    largest := 0
    for i := 0; i < len(grid)-12; i++ {
        a := grid[i : i+13]
        total := 1
        for b := 0; b < len(a); b++ {
            total *= a[b]
        }
        if total > largest {
            largest = total
        }
    }
    fmt.Println(largest)
}

I can't find out what is wrong, if I add a bunch of prints to both of them, the spit out the same sequences of numbers, but the Go one doesn't seem to be doing the multiplication right?!? I double checked by hand. There must be some small thing I am missing?

1

There are 1 best solutions below

0
On BEST ANSWER

You're running into integer overflow. All javascript numbers are 64-bit doubles, and therefore have 53 bits of integer precision. In Go, the int type is either 32-bit or 64-bit depending on your processor. For you, int is 32 bit, so it cannot store a number as large as the solution. You can specify what size integers to use by using the int32 and int64 types. Below is the corrected program. See here for more info on integer overflow. here for the relevant section in the Go specification.

package main

import (
    "fmt"
    "strconv"
    "strings"
)

var data string = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"

func main() {
    // Get an array of ints
    var grid []int64
    var stringGrid = strings.Split(data, "")
    for i := 0; i < 1000; i++ {
        cell, _ := strconv.Atoi(stringGrid[i])
        grid = append(grid, int64(cell))
    }

    // Find the largest one
    var largest int64
    for i := 0; i < len(grid)-12; i++ {
        a := grid[i : i+13]
        var total int64 = 1
        for b := 0; b < len(a); b++ {
            total *= a[b]
        }
        if total > largest {
            largest = total
        }
    }
    fmt.Println(largest)
}