0
0

More than 1 year has passed since last update.

【Project Euler】Problem 11: マトリクスの中の最大積

Posted at
  • 本記事はProjectEulerの「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

問題 11.マトリクスの中の最大積

原文 Problem 11: Largest product in a grid

問題の要約:マトリクスの中の隣り合う(縦・横・斜め)4つの数の積の最大値を求めよ

Pythonのnumpyマトリクスはちょっと癖があるので慣れが必要ですね。マトリクスの定義は長いので下に書きました。4x4のマトリクスを切り出して上辺、左辺、2つの斜めの積を計算して最大値を求める関数がmaxProdArrです。

import itertools
import numpy as np

# return max product of left-vertical, top-horizontal, diagonal lines
def maxProdArr(mtx):     
  return max(np.prod(mtx[0,:]), 
             np.prod(mtx[:,0]), 
             np.prod(np.diag(mtx)),
             np.prod(np.diag(np.fliplr(mtx))))

sizeMtx, sizeWin = 20, 4
maxprod = 0
for y, x in itertools.product(range(sizeMtx-sizeWin), repeat=2):
  m  = Mtx[y:y+sizeWin,x:x+sizeWin]   # extract small matrix
  maxp = maxProdArr(m)
  if maxp > maxprod:
    maxprod, pos, maxarr = maxp, (y,x), m

print(f"Answer : {maxprod} at {pos}  \n{maxarr}")
import numpy as np
s = '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'
Mtx = np.array(list(map(int,s.split()))).reshape(20,20)
print(Mtx, Mtx.shape, Mtx[2][4])
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0