18 September 2013

Project Euler - Problem 11

Hello readers,
It is true that I haven't been posting for a long time. I was bothered by my university entrance preparation. Now that I managed to enter a university, which is Binus International University in Jakarta and majoring in Computer Science, I can finally post again.

I was doing a Project Euler problem earlier today.
Link to Problem 11 : http://projecteuler.net/problem=11

To solve this seemingly confusing problem, I use VB.NET.
Here is the solution.

Module Module1

    Sub Main()
        Dim list1 As String = "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 "
'create list to be processed later on
        Dim list2(400) As Integer
        Dim x, i As Integer
        i = 1
        For x = 0 To 399
            list2(x) = CInt(Mid(list1, i, 2))
            i = i + 3
        Next
        i = 1
        For x = 0 To 399
            If i = 20 Then
                Console.Write(list2(x))
                Console.WriteLine()
                i = 1
            ElseIf i < 20 Then
                i = i + 1
                Console.Write(list2(x) & " ")
            End If
        Next
        Console.WriteLine()

'processing stages
        Dim temp, largest, pos As Integer
        'horizontal
        For x = 0 To 395
            If x = 16 Then x = 20
            If x = 36 Then x = 40
            If x = 56 Then x = 60
            If x = 76 Then x = 80
            If x = 96 Then x = 100
            If x = 116 Then x = 120
            If x = 136 Then x = 140
            If x = 156 Then x = 160
            If x = 176 Then x = 180
            If x = 196 Then x = 200
            If x = 216 Then x = 220
            If x = 236 Then x = 240
            If x = 256 Then x = 260
            If x = 276 Then x = 280
            If x = 296 Then x = 300
            If x = 316 Then x = 320
            If x = 336 Then x = 340
            If x = 356 Then x = 360
            If x = 376 Then x = 380
            If x = 396 Then x = 400
            temp = list2(x) * list2(x + 1) * list2(x + 2) * list2(x + 3)
            If temp > largest Then
                largest = temp
                pos = x
            End If
        Next
        Console.WriteLine("Numbers(H) : " & list2(pos) & ", " & list2(pos + 1) & ", " & list2(pos + 2) & ", " & list2(pos + 3))
        Console.WriteLine("Product(H) : " & largest)


        'vertical
        temp = 0
        largest = 0
        For x = 0 To 319

            temp = list2(x) * list2(x + 20) * list2(x + 40) * list2(x + 60)
            If temp > largest Then
                largest = temp
                pos = x
            End If
        Next
        Console.WriteLine("Numbers(V) : " & list2(pos) & ", " & list2(pos + 20) & ", " & list2(pos + 40) & ", " & list2(pos + 60))
        Console.WriteLine("Product(V) : " & largest)

        'diagonal1
        temp = 0
        largest = 0
        For x = 0 To 336
            If x = 16 Then x = 20
            If x = 36 Then x = 40
            If x = 56 Then x = 60
            If x = 76 Then x = 80
            If x = 96 Then x = 100
            If x = 116 Then x = 120
            If x = 136 Then x = 140
            If x = 156 Then x = 160
            If x = 176 Then x = 180
            If x = 196 Then x = 200
            If x = 216 Then x = 220
            If x = 236 Then x = 240
            If x = 256 Then x = 260
            If x = 276 Then x = 280
            If x = 296 Then x = 300
            If x = 316 Then x = 320
            temp = list2(x) * list2(x + 11) * list2(x + 22) * list2(x + 33)
            If temp > largest Then
                largest = temp
                pos = x
            End If
        Next

        Console.WriteLine("Numbers(D1) : " & list2(pos) & ", " & list2(pos + 11) & ", " & list2(pos + 22) & ", " & list2(pos + 33))
        Console.WriteLine("Product(D1) : " & largest)



        'diagonal2
        temp = 0
        largest = 0
        For x = 396 To 60 Step -1
            If x = 379 Then x = 376
            If x = 359 Then x = 356
            If x = 339 Then x = 336
            If x = 319 Then x = 316
            If x = 299 Then x = 296
            If x = 279 Then x = 276
            If x = 259 Then x = 256
            If x = 239 Then x = 236
            If x = 219 Then x = 216
            If x = 199 Then x = 196
            If x = 179 Then x = 176
            If x = 159 Then x = 156
            If x = 139 Then x = 136
            If x = 119 Then x = 116
            If x = 99 Then x = 96
            If x = 79 Then x = 76
            If x = 59 Then x = 56
            temp = list2(x) * list2(x - 19) * list2(x - 38) * list2(x - 57)
            If temp > largest Then
                largest = temp
                pos = x
            End If
        Next
        Console.WriteLine("Numbers(D2) : " & list2(pos) & ", " & list2(pos - 19) & ", " & list2(pos - 38) & ", " & list2(pos - 57))
        Console.WriteLine("Product(D2) : " & largest)
 
    End Sub

End Module

That was the code, it consists of four major processes, which is to search for the largest product of four numbers :
1. Horizontally
2. Vertically
3. Diagonally from top left to bottom right
4. Diagonally from bottom left to top right

Running the code above, we will obtain the answer, which is 70600674.

Take your time to understand the code, no need to hurry.
I will be back with more solutions.


Happy Coding,
Cyber Frost 

Search