Search code examples
javaloopsmathmultiplication

Project Euler #11


I recently started these projects to test my skills with Java. I got to problem 11, getting all the previous ones right. There is something wrong with my code. The answer that is returned seems to be correct, but it isn't when I check it on the official website: The problem is at Project Euler #11.

Here is my code. I have several commented out debugging lines. Just ignore them.

static String source = "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48";
//  static String source = "02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00";
static int[] numList = new int[400];
static int answer;

public static void main(String args[]){
    int counter = 1;
    int numListCounter = 0;
    //convert source to array
    for(int x = 0; x < source.length(); x++){
        char[] c = new char[2];
        String s;

        if(counter == 1){
            c[0] = source.charAt(x);
            c[1] = source.charAt(x+1);
            s = new String(c,0,2);
            numList[numListCounter] = Integer.parseInt(s);
        }
        if(counter == 3){
            numListCounter++;
            counter = 0;
        }
        counter++;
    }
    //convert array to grid
    int[][] grid = new int[20][20];
    int c = 0;
    for(int x = 0; x < 20; x++){
        for(int y = 0; y < 20; y++){

            grid[y][x] = numList[c];
            c++;
        }
    }

    //Prints the array. used for testing.
    /*
    for(int y = 0; y < 20; y++){
        for(int x = 0; x < 16; x++){
            System.out.print(grid[x][y] + "\t");
        }
        System.out.println();
    }
    */

    //check horizontal
    int hAnswer = 0;
    for(int y = 0; y < 20; y++){
        for(int x = 0; x < 16; x++){
            if(grid[x][y]*grid[x+1][y]*grid[x+2][y]*grid[x+3][y] > hAnswer){

                hAnswer = grid[x][y]*grid[x+1][y]*grid[x+2][y]*grid[x+3][y];

                //  System.out.println(x + " , " + y);
                //  System.out.println(answer);
            }
        }
    }
    if(hAnswer > answer){
        answer = hAnswer;
    }
    System.out.println(hAnswer + " - Horizontal Answer");

    //check vertical
    int vAnswer = 0;
    for(int x = 0; x < 20; x++){
        for(int y = 0; y < 16; y++){
            if(grid[x][y]*grid[x][y+1]*grid[x][y+2]*grid[x][y+3] > vAnswer){

                vAnswer = grid[x][y]*grid[x][y+1]*grid[x][y+2]*grid[x][y+3];

        //      System.out.println(x + " , " + y);
        //      System.out.println(answer); 
            }
        }
    }
    if(vAnswer > answer){
        answer = vAnswer;
    }
    System.out.println(vAnswer + " - Vertical Answer");

    //check diagonal \
    int d1answer = 0;
    for(int y = 0; y < 16; y++){
        for(int x = 0; x < 16; x++){
            if(grid[x][y]*grid[x+1][y+1]*grid[x+2][y+2]*grid[x+3][y+3] > d1answer){

                d1answer = grid[x][y]*grid[x+1][y+1]*grid[x+2][y+2]*grid[x+3][y+3];

        //      System.out.println(x + " , " + y);
        //      System.out.println(answer);

            }
        }
    }

    if(d1answer > answer){
        answer = d1answer;
    }

    System.out.println(d1answer + " - Diagonal \"\\\" Answer");

    //check diagonal /
    int d2answer = 0;
    for(int y = 3; y < 20; y++){
        for(int x = 3; x < 20; x++){
            if(grid[x][y]*grid[x-1][y-1]*grid[x-2][y-2]*grid[x-3][y-3] > d2answer){

                d2answer = grid[x][y]*grid[x-1][y-1]*grid[x-2][y-2]*grid[x-3][y-3];

        //      System.out.println(x + " , " + y);
        //      System.out.println(answer);
            }
        }
    }
    if(d2answer > answer){
        answer = d2answer;
    }

System.out.println(d2answer + " - Diagonal \"/\" Answer");
System.out.println();
System.out.println(answer + " - Final Answer");
}

This is compile-able if put into a class. I just don't know why it is wrong.

Output:

48477312 - Horizontal Answer
51267216 - Vertical Answer
32719995 - Diagonal "\" Answer
40304286 - Diagonal "/" Answer

51267216 - Final Answer

Solution

  • You are checking the same diagonal lines both times. Draw the lines you are checking in the grid (on paper), to see this easily.

    Change one of them to add from X and subtract from Y (or the other way around).