回答編集履歴

2

関数名が適当でないと思った。けどほかに良いのも思いつかなかった

2018/06/19 05:44

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -78,7 +78,7 @@
78
78
 
79
79
 
80
80
 
81
- def fillz(data):
81
+ def f(data):
82
82
 
83
83
  result = []
84
84
 
@@ -114,9 +114,9 @@
114
114
 
115
115
 
116
116
 
117
- print(fillz(data1))
117
+ print(f(data1))
118
118
 
119
- print(fillz(data2))
119
+ print(f(data2))
120
120
 
121
121
  """ =>
122
122
 

1

追記

2018/06/19 05:44

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -47,3 +47,83 @@
47
47
  zipでlistを転置する方法を利用しています。参考:
48
48
 
49
49
  [Python標準で転置行列](https://qiita.com/mas9612/items/821fbb4c881b7a836451)
50
+
51
+
52
+
53
+ ### 追記
54
+
55
+ 作ってみました。上のコードを多少書き換えただけ。ヘンなデータが入ってきたときのことはまったく考えていません。
56
+
57
+
58
+
59
+ ```python
60
+
61
+ data1 = [[8,7,6,5],
62
+
63
+ [1,0,3,4],
64
+
65
+ [16,15,14,13],
66
+
67
+ [9,10,0,12]]
68
+
69
+
70
+
71
+ data2 = [[8,7,6,5],
72
+
73
+ [1,2,0,4],
74
+
75
+ [16,15,14,13],
76
+
77
+ [9,10,0,12]]
78
+
79
+
80
+
81
+ def fillz(data):
82
+
83
+ result = []
84
+
85
+ for col in zip(*data):
86
+
87
+ if sum(col) == 34:
88
+
89
+ result.append(col)
90
+
91
+ else:
92
+
93
+ if col.count(0) == 1:
94
+
95
+ # 一列に0が1つのとき
96
+
97
+ tmp = list(col)
98
+
99
+ tmp[tmp.index(0)] = 34 - sum(col)
100
+
101
+ result.append(tmp)
102
+
103
+ else:
104
+
105
+ # 一列に2つあるとき
106
+
107
+ fillvals = [i for i in range(1, 17) if i not in sum(data, [])]
108
+
109
+ result.append([fillvals.pop() if e == 0 else e for e in col])
110
+
111
+
112
+
113
+ return list(map(list, zip(*result)))
114
+
115
+
116
+
117
+ print(fillz(data1))
118
+
119
+ print(fillz(data2))
120
+
121
+ """ =>
122
+
123
+ [[8, 7, 6, 5], [1, 2, 3, 4], [16, 15, 14, 13], [9, 10, 11, 12]]
124
+
125
+ [[8, 7, 6, 5], [1, 2, 11, 4], [16, 15, 14, 13], [9, 10, 3, 12]]
126
+
127
+ """
128
+
129
+ ```