回答編集履歴
2
任意の0の個数に対応するよう修正
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
|
-
# あとは
|
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(
|
117
|
+
for i in range(len(s)):
|
104
118
|
|
105
119
|
tmp[ps[0][i],ps[1][i]] = vals[i]
|
106
120
|
|
1
コード修正
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
|
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())
|
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
|
-
p
|
89
|
+
print(ps) # (array([1, 3], dtype=int64), array([1, 1], dtype=int64))
|
70
90
|
|
71
91
|
|
72
92
|
|
73
|
-
# あとは
|
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
|
```
|