何かを書き留める何か

数学や読んだ本について書く何かです。最近は社会人として生き残りの術を学ぶ日々です。

Project Euler Problem 11

In the 20×20 grid below, four numbers along a diagonal line have been marked in red.

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

The product of these numbers is 26 × 63 × 78 × 14 = 1788696.

What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20×20 grid?

http://projecteuler.net/problem=11

 

20*20の格子の上下左右・斜め方向に連続する4つの数の列の最大値を求める問題。

Problem 8 (http://xaro.hatenablog.jp/entry/2013/01/08/003315)のときに用いたosモジュールを用いる。取り込む際にmap(int,line.rstrip().split(" "))とすることで改行文字を除き空白を元に区切り、文字から整数に変換というのを一発で行う。他にいい方法はあるかもしれないが。

積を求める部分がちょっと汚くなってしまった。多重リストとスライス両立が難しい、と言うより知らない。

----

import os
os.chdir("PATH")

target = [map(int,line.rstrip().split(" ")) for line in open('Problem_011.txt', 'r')]
print target

tatesum = max([target[tate][yoko]*target[tate][yoko+1]*target[tate][yoko+2]*target[tate][yoko+3] \
       for tate in xrange(len(target)) for yoko in xrange(len(target)-3)])

yokosum =  max([target[tate][yoko]*target[tate+1][yoko]*target[tate+2][yoko]*target[tate+3][yoko] \
           for tate in xrange(len(target)-3) for yoko in xrange(len(target))])
miginanamesum = max([target[tate][yoko]*target[tate+1][yoko+1]*target[tate+2][yoko+2]*target[tate+3][yoko+3] \
       for tate in xrange(len(target)-3) for yoko in xrange(len(target)-3)])

hidarinanamesum = max([target[tate][yoko+3]*target[tate+1][yoko+2]*target[tate+2][yoko+1]*target[tate+3][yoko] \
       for tate in xrange(len(target)-3) for yoko in xrange(len(target)-3)])
print max([tatesum,yokosum,miginanamesum,hidarinanamesum])
----