回答編集履歴

2

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

2018/06/19 08:54

投稿

can110
can110

スコア38260

test CHANGED
@@ -68,6 +68,18 @@
68
68
 
69
69
 
70
70
 
71
+ # 8,12,14,15が0に置き換わったデータ例
72
+
73
+ l =[[ 1, 2, 3, 4],
74
+
75
+ [ 0, 7, 6, 5],
76
+
77
+ [ 9,10,11, 0],
78
+
79
+ [16, 0, 0,13]]
80
+
81
+
82
+
71
83
  a = np.array(l)
72
84
 
73
85
  print(a)
@@ -90,17 +102,19 @@
90
102
 
91
103
 
92
104
 
93
- # あとは パターンにおいて、各列計すべて34であるほうを採用する
105
+ # あとは パターンにおいて、各列計すべて34であるものを採用する
94
106
 
95
- # 縦に0が並んでいればどちらも条件を満たすので、最初のほうでよい。
107
+ # 縦に0が並んでいれば複数のケースで条件を満たすので、最初のほうでよい。
96
108
 
97
109
  for vals in itertools.permutations(s): # (8,9), (9,8)
110
+
111
+ print(vals)
98
112
 
99
113
  # 0を数値で埋める
100
114
 
101
115
  tmp = a.copy()
102
116
 
103
- for i in range(len(ps)):
117
+ for i in range(len(s)):
104
118
 
105
119
  tmp[ps[0][i],ps[1][i]] = vals[i]
106
120
 

1

コード修正

2018/06/19 08:54

投稿

can110
can110

スコア38260

test CHANGED
@@ -24,23 +24,35 @@
24
24
 
25
25
  import numpy as np
26
26
 
27
+ import itertools
28
+
27
29
 
28
30
 
29
31
  """
30
32
 
31
33
  条件を満たす行列を生成。テストデータ作成用
32
34
 
33
- import itertools
34
-
35
35
  for one in itertools.permutations(range(1,17)):
36
36
 
37
37
  a = np.array(one).reshape(4,4)
38
38
 
39
- if sum(a[:,0]) == 34 and sum(a[:,1]) == 34 and sum(a[:,2]) == 34 and sum(a[:,3]) == 34:
39
+ if all(a.sum( axis=0) == 34):
40
40
 
41
41
  print(a)
42
42
 
43
43
  """
44
+
45
+
46
+
47
+ # 15と14が0に置き換わったデータ例
48
+
49
+ l =[[ 1, 2, 3, 4],
50
+
51
+ [ 8, 7, 6, 5],
52
+
53
+ [ 9,10,11,12],
54
+
55
+ [16, 0, 0,13]]
44
56
 
45
57
 
46
58
 
@@ -54,24 +66,52 @@
54
66
 
55
67
  [12, 0, 7, 6]]
56
68
 
69
+
70
+
57
71
  a = np.array(l)
72
+
73
+ print(a)
58
74
 
59
75
 
60
76
 
61
77
  # 0になった値を特定
62
78
 
63
- s = set(range(1,17)) - set(a.flatten()) # {8,9}
79
+ s = set(range(1,17)) - set(a.flatten())
80
+
81
+ print(s) # {8,9}
64
82
 
65
83
 
66
84
 
67
85
  # 0の位置を特定
68
86
 
87
+ ps = np.where( a == 0)
88
+
69
- ps = np.where( a == 0) # (array([1, 3], dtype=int64), array([1, 1], dtype=int64))
89
+ print(ps) # (array([1, 3], dtype=int64), array([1, 1], dtype=int64))
70
90
 
71
91
 
72
92
 
73
- # あとは 8,9 または 9,8 の2パターンにおいて、各列計すべて34であるほうを採用する
93
+ # あとは 2パターンにおいて、各列計すべて34であるほうを採用する
74
94
 
75
95
  # 縦に0が並んでいればどちらも条件を満たすので、最初のほうでよい。
76
96
 
97
+ for vals in itertools.permutations(s): # (8,9), (9,8)
98
+
99
+ # 0を数値で埋める
100
+
101
+ tmp = a.copy()
102
+
103
+ for i in range(len(ps)):
104
+
105
+ tmp[ps[0][i],ps[1][i]] = vals[i]
106
+
107
+
108
+
109
+ # 条件を満たす
110
+
111
+ if all(tmp.sum( axis=0) == 34):
112
+
113
+ print(tmp)
114
+
115
+ break
116
+
77
117
  ```