質問するログイン新規登録

回答編集履歴

2

任意の0の個数に対応するよう修正

2018/06/19 08:54

投稿

8524ba23
8524ba23

スコア38350

answer CHANGED
@@ -33,6 +33,12 @@
33
33
  [16,15,14,13],
34
34
  [12, 0, 7, 6]]
35
35
 
36
+ # 8,12,14,15が0に置き換わったデータ例
37
+ l =[[ 1, 2, 3, 4],
38
+ [ 0, 7, 6, 5],
39
+ [ 9,10,11, 0],
40
+ [16, 0, 0,13]]
41
+
36
42
  a = np.array(l)
37
43
  print(a)
38
44
 
@@ -44,12 +50,13 @@
44
50
  ps = np.where( a == 0)
45
51
  print(ps) # (array([1, 3], dtype=int64), array([1, 1], dtype=int64))
46
52
 
47
- # あとは パターンにおいて、各列計すべて34であるほうを採用する
53
+ # あとは パターンにおいて、各列計すべて34であるものを採用する
48
- # 縦に0が並んでいればどちらも条件を満たすので、最初のほうでよい。
54
+ # 縦に0が並んでいれば複数のケースで条件を満たすので、最初のほうでよい。
49
55
  for vals in itertools.permutations(s): # (8,9), (9,8)
56
+ print(vals)
50
57
  # 0を数値で埋める
51
58
  tmp = a.copy()
52
- for i in range(len(ps)):
59
+ for i in range(len(s)):
53
60
  tmp[ps[0][i],ps[1][i]] = vals[i]
54
61
 
55
62
  # 条件を満たす

1

コード修正

2018/06/19 08:54

投稿

8524ba23
8524ba23

スコア38350

answer CHANGED
@@ -11,29 +11,49 @@
11
11
 
12
12
  ```Python
13
13
  import numpy as np
14
+ import itertools
14
15
 
15
16
  """
16
17
  条件を満たす行列を生成。テストデータ作成用
17
- import itertools
18
18
  for one in itertools.permutations(range(1,17)):
19
19
  a = np.array(one).reshape(4,4)
20
- if sum(a[:,0]) == 34 and sum(a[:,1]) == 34 and sum(a[:,2]) == 34 and sum(a[:,3]) == 34:
20
+ if all(a.sum( axis=0) == 34):
21
21
  print(a)
22
22
  """
23
23
 
24
+ # 15と14が0に置き換わったデータ例
25
+ l =[[ 1, 2, 3, 4],
26
+ [ 8, 7, 6, 5],
27
+ [ 9,10,11,12],
28
+ [16, 0, 0,13]]
29
+
24
30
  # 8と9が0に置き換わったデータ例
25
31
  l = [[ 1, 2, 3, 4],
26
32
  [ 5, 0,10,11],
27
33
  [16,15,14,13],
28
34
  [12, 0, 7, 6]]
35
+
29
36
  a = np.array(l)
37
+ print(a)
30
38
 
31
39
  # 0になった値を特定
32
- s = set(range(1,17)) - set(a.flatten()) # {8,9}
40
+ s = set(range(1,17)) - set(a.flatten())
41
+ print(s) # {8,9}
33
42
 
34
43
  # 0の位置を特定
44
+ ps = np.where( a == 0)
35
- ps = np.where( a == 0) # (array([1, 3], dtype=int64), array([1, 1], dtype=int64))
45
+ print(ps) # (array([1, 3], dtype=int64), array([1, 1], dtype=int64))
36
46
 
37
- # あとは 8,9 または 9,8 の2パターンにおいて、各列計すべて34であるほうを採用する
47
+ # あとは 2パターンにおいて、各列計すべて34であるほうを採用する
38
48
  # 縦に0が並んでいればどちらも条件を満たすので、最初のほうでよい。
49
+ for vals in itertools.permutations(s): # (8,9), (9,8)
50
+ # 0を数値で埋める
51
+ tmp = a.copy()
52
+ for i in range(len(ps)):
53
+ tmp[ps[0][i],ps[1][i]] = vals[i]
54
+
55
+ # 条件を満たす
56
+ if all(tmp.sum( axis=0) == 34):
57
+ print(tmp)
58
+ break
39
59
  ```