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

質問編集履歴

8

修正

2020/12/16 00:10

投稿

apeirogon0813
apeirogon0813

スコア117

title CHANGED
File without changes
body CHANGED
@@ -4,14 +4,32 @@
4
4
  import networkx as nx
5
5
  import matplotlib.pyplot as plt
6
6
  import copy
7
+ import sys
7
8
 
8
9
  #要素が重複しているか
9
10
  def has_duplicates(seq):
10
11
  return len(seq) == len(set(seq))
11
12
 
13
+ def check(v):
14
+ vmax = 0
15
+ for i in range(N-1):
16
+ if v[i] + v[i+1] > vmax:
17
+ vmax = v[i] + v[i+1]
18
+ number = i
19
+ #print("インデックス = " + str(number))
20
+ #print(v[number])
21
+ return number
22
+
12
23
  def create_volumes(n):
13
24
  #重複しないレコードの作成
14
- V = random.sample(range(5,50), k=n)
25
+ V = random.sample(range(5,500), k=n)
26
+ Min = min(V)
27
+ ##print("最小値 = " + str(Min))
28
+ V.remove(Min)
29
+ V.insert(0,Min)
30
+ if check(V) < n/2:
31
+ return create_volumes(n)
32
+ #print("V2 = " + str(V))
15
33
  #観測されるボリューム集合の生成
16
34
  W = copy.copy(V)
17
35
  for i in range(N-1):
@@ -40,6 +58,8 @@
40
58
  else:
41
59
  return data
42
60
 
61
+
62
+
43
63
  def create_no_duplicates(n):
44
64
  data = create_volumes(n)
45
65
  #print(data[1])
@@ -49,19 +69,22 @@
49
69
  return create_duplicates(n)
50
70
 
51
71
 
72
+
73
+
74
+
52
75
  Ans = []
53
- N = 10 #攻撃者は既知
76
+ N = 20 #攻撃者は既知
77
+
54
- result = create_duplicates(N)
78
+ result = create_volumes(N)
55
- #result = create_no_duplicates(N)
56
79
  V = result[0] #復元したいレコード
57
- print("V = " + str(V))
80
+ #print("V = " + str(V))
58
- print("W = " + str(result[1]))
81
+ #print("W = " + str(result[1]))
59
82
  W = list(set(result[1])) #攻撃者が観測するボリュームの集合
60
83
 
61
-
84
+ #print("生成完了")
62
85
  #要素を昇順に
63
86
  W.sort()
64
- print("昇順W = " + str(W) + " ( |W| = " + str(len(W)) +" )")
87
+ #print("昇順W = " + str(W) + " ( |W| = " + str(len(W)) +", 重複数" + str(39-len(W)) + " )")
65
88
 
66
89
  G = nx.Graph()
67
90
  #step1 2頂点の和がボリュームに含まれているのならエッジを追加
@@ -72,39 +95,70 @@
72
95
  if W[i] + W[j] in W:
73
96
  G.add_edge(W[i], W[j])
74
97
 
98
+ #print("グラフ")
75
- print("存在する枝 = " + str(G.edges))
99
+ #print("存在する枝(" + str(len(G.edges)) + ") = " + str(G.edges))
76
- print("抽出されたボリューム(" + str(len(G.nodes)) +"/" + str(len(W)) +") = " + str(G.nodes))
100
+ #print("抽出されたボリューム(" + str(len(G.nodes)) +"/" + str(len(W)) +") = " + str(G.nodes))
77
- print(list(G.neighbors(W[0])))
101
+ #print(list(G.neighbors(W[0])))
78
102
 
79
- #step2 確定レコード選別する
80
- RNodes = [W[0], W[1]] #レコードは重複しない仮定より1,2番目に小さいボリュームはレコードである
81
- for i in range(2, N):
82
- for j in range(i):
83
- #print("W[i] - W[j] = " + str(W[i]) + " - " + str(W[j]))
84
- if W[i] - W[j] in W and W[i] != 2 * W[j] : #あるボリュームが確定レコード同士の和である時(その要素が隣同士orレコードであるor両方)
85
- break
86
- #else: 和でない場合は次に進める
87
- #最終的にそのボリュームを生成する確定レコードの2要素の和が存在しない場合、そのボリューム確定レコード
88
- if j == i-1:
89
- RNodes.append(W[i])
90
-
91
- print("確定レコード = " + str(RNodes))
92
103
 
93
-
94
-
95
104
  #step3 確定レコードである頂点を通る経路長=N-1である経路
96
105
  S = []
106
+ T = []
107
+ t = []
97
108
  #//集合の中にリストの集合
98
109
  l = list(G.neighbors(W[0]))
99
110
 
111
+ #最大値を生成するボリューム初期解
112
+ for w in W:
113
+ if W[-1] - w in W:
114
+ if w not in t:
115
+ T.append([w, W[-1]-w])
116
+ t.append(W[-1]-w)
117
+ #print("maxx = " + str(T))
118
+
119
+ #l2 = list(G.neighbors(W[-1]))
120
+
121
+ #最小ボリュームの初期解
100
122
  for i in l: #一次元配列だとループが回せないため、二次元配列にしておく
101
123
  S.append([W[0],i])
102
124
 
125
+
126
+ def right_shifts(S,G):
127
+ T = []
128
+ for s in S:#各候補解ごとに
129
+ right_num = len(s) - 1
130
+ l = list(G.neighbors(s[right_num]))#一番右の要素と隣合うノードを取得
131
+ for node in l:
132
+ if node not in s: #同じレコードは存在しないかの判定
133
+ C = copy.copy(s)
134
+ C.append(node)
135
+ if C not in T:
136
+ T.append(C)
137
+ return T
138
+
139
+ def left_shifts(S,G):
140
+ T = []
141
+ for s in S:#各候補解ごとに
142
+ left_num = 0
143
+ l = list(G.neighbors(s[left_num]))#一番右の要素と隣合うノードを取得
144
+ for node in l:
145
+ if node not in s: #同じレコードは存在しないかの判定
146
+ C = copy.copy(s)
147
+ C.insert(0,node)
148
+ if C not in T:
149
+ T.append(C)
150
+ return T
151
+
152
+
103
153
  def right_shift(S,G):
104
154
  #print("S = " + str(S))
105
155
  for i in range(N-2): #解の長さがNになるまで
156
+ #print("現時点の解の長さ = " + str(i))
106
157
  T = []
158
+ #j = 1
107
- for s in S: #解の数
159
+ for s in S: #候補解の数
160
+ #print("候補解の " + str(j) + " 番目")
161
+ #j += 1
108
162
  if len(s) != N:
109
163
  right_num = len(s) - 1
110
164
  l = list(G.neighbors(s[right_num]))#一番右の要素と隣合うノードを取得
@@ -114,7 +168,7 @@
114
168
  C.append(node)
115
169
  if C not in T:
116
170
  T.append(C)
117
- T.append(s)#右に拡張できるがそのノードが終点である可能性があるため
171
+ #T.append(s)#右に拡張できるがそのノードが終点である可能性があるため
118
172
  #print(T)
119
173
  S = copy.copy(T)
120
174
  #print("S = " + str(S))
@@ -152,30 +206,101 @@
152
206
  if i == len(RNodes)-1:
153
207
  T.append(s)
154
208
  return T
209
+
210
+ def uni(R,L):
211
+ S = R
212
+ for l in L:
213
+ flag = 0
214
+ for r in R:
215
+ print("l = " + str(l))
216
+ print("r = " + str(r))
217
+ if l == r:
218
+ flag = 1
219
+ break
220
+ if flag == 0:
221
+ S.append(l)
222
+ return S
223
+
224
+ def uni2(R,L):
225
+ S = R
226
+ for l in L:
227
+ S.append(l)
228
+ return S
229
+
230
+ #これまでは、最小のボリュームが真ん中である場合を考慮して両方に拡張しないといけなかった
155
- T = copy.copy(S)
231
+ #T = copy.copy(S)
156
- T = right_shift(T,G)
232
+ #T = right_shift(T,G)
157
- T = left_shift(T,G)
233
+ #T = left_shift(T,G)
158
- S = left_shift(S,G)
234
+ #S = left_shift(S,G)
235
+ SR = []
236
+ SL = []
237
+ TR = []
238
+ TL = []
239
+ #print(N/2)
240
+ for i in range(3, int(N/2) + 1):
241
+ print("i = " + str(i), file=sys.stderr)
159
- S = right_shift(S,G)
242
+ SR = right_shifts(S,G)
243
+ SL = left_shifts(S,G)
244
+ TR = right_shifts(T,G)
245
+ TL = left_shifts(T,G)
246
+ S = uni2(SR,SL)
247
+ T = uni2(TR,TL)
248
+ print("候補解数S = " + str(len(S)), file=sys.stderr)
249
+ print("候補解数T = " + str(len(T)), file=sys.stderr)
250
+ #print("Smin = " + str(len(S)))
251
+ #print(S)
252
+ #print("Tmax = " + str(len(T)))
253
+ #print(T)
254
+ SS = []
255
+ for s in S:
256
+ for t in T:
257
+ flag = 0
258
+ for i in s:
259
+ if i in t:
260
+ flag = 1
261
+ break
262
+ if flag == 0:
263
+ if s[0] + t[0] in W:
264
+ SS.append(list(reversed(s)) + t)
265
+ if s[0] + t[-1] in W:
266
+ SS.append(t + s)
267
+ if s[-1] + t[0] in W:
268
+ SS.append(s + t)
269
+ if s[-1] + t[-1] in W:
270
+ SS.append(t + list(reversed(s)))
271
+ #print(SS)
272
+
273
+
274
+
275
+
276
+
277
+
278
+
160
279
  #print("解候補 = " + str(T))
161
- print("解の数1 = " + str(len(T)))
280
+ #print("解の数1 = " + str(len(SS)))
162
- T = confirm(T)
281
+ #T = confirm(T)
163
- S = confirm(S)
282
+ #S = confirm(S)
164
283
  #print("解候補選別T = " + str(T))
165
284
  #print("解候補選別S = " + str(S))
166
- print("解の数2 = " + str(len(T)))
285
+ #print("解の数2 = " + str(len(S)))
167
286
 
168
287
 
169
288
  #step5 解からボリュームを計算し比較
170
- G1 = compare_volumes(T, W)
289
+ #G1 = compare_volumes(T, W)
171
290
  #print("G1 = " + str(G1))
172
- G2 = compare_volumes(S, W)
291
+ G2 = compare_volumes(SS, W)
173
292
  #print("G2 = " + str(G2))
174
- G3 = G1|G2
293
+ #G3 = G1|G2
175
294
 
176
- print("候補解(" + str(len(G3)) + "個) = " + str(G3))
295
+ #print("候補解(" + str(len(G2)) + "個) = " + str(G2))
177
- print("真の解 = " + str(V))
296
+ #print("真の解 = " + str(V))
178
297
 
298
+ if len(G2) == 1:
299
+ print("unique")
300
+ elif len(G2) > 1:
301
+ print("Ambiguous")
302
+ else:
303
+ print("候補解の数がゼロ")
179
304
  ```
180
305
  didSelectRowAt内に
181
306
  detailVC.idString = dataSets[indexPath.row].docIDとすると

7

修正

2020/12/16 00:10

投稿

apeirogon0813
apeirogon0813

スコア117

title CHANGED
File without changes
body CHANGED
@@ -1,41 +1,4 @@
1
1
  TableView上のFirebaseから読み取ったデータのセルをタップすると
2
-
3
- didSelectRowAt内に
4
- detailVC.idString = dataSets[indexPath.row].docIDとすると
5
- エラー:Fatal error: Index out of rangeとなります。
6
- (どのセルをタップしてもエラーになります。)
7
-
8
-
9
- numberOfRowsInSectionでは、
10
- return dataSets.countとしてます。
11
- なおその前にprintでdataSets.countを出力すると0ではなく, 適切な数字が出力されていました。
12
-
13
- また、didSelectRowAt内でテスト出力してみると
14
- firebaseからのデータを格納している構造体を格納する配列dastaSetsが空[]になっておりました。
15
- indecPath.rowはクリックしたセルの番号が正しく出力されていました。
16
- loadData()によって画面のセルにはFireStoreから読み込んだデータが読み込まれているのに、
17
- dataSetsが[]である原因わかりません。
18
-
19
- ご教示願います。
20
-
21
-
22
- ![イメージ説明](ce2de5a6486214bd27851444652acb8b.png)
23
- ![![イメージ説明](bcdd96b7434e3a1433c9d514560537d2.png)
24
- ![イメージ説明](98d508b712a34027f6d37501405184b3.png)
25
-
26
- 追記:
27
- どうやらセルをタップした時に、loadData()が呼ばれているのか、if文のerror != nilの
28
- print("erorrrrrr")が出力されたので、これによって、dataSetsが空のままになっていることがわかりました。
29
-
30
-
31
-
32
- loadData()はviewWillAppearのみに記載しており、viewWillAppearは始めの画面生成時にのみよばれることから、セルタップ時にloadData()が呼ばれているのは
33
-
34
- addSnapshotListnerのトリガーのようなものが関係しているのでしょうか。
35
-
36
- ご教示願います。
37
- ![イメージ説明](c02c797f43213fb92bfcf65f7df76b90.png)
38
-
39
2
  ```ここに言語を入力
40
3
  import random
41
4
  import networkx as nx
@@ -48,11 +11,7 @@
48
11
 
49
12
  def create_volumes(n):
50
13
  #重複しないレコードの作成
51
- V = random.sample(range(5,500), k=n)
14
+ V = random.sample(range(5,50), k=n)
52
- Min = min(V)
53
- print("最小値 = " + str(Min))
54
- V.remove(Min)
55
- V.insert(0,Min)
56
15
  #観測されるボリューム集合の生成
57
16
  W = copy.copy(V)
58
17
  for i in range(N-1):
@@ -91,7 +50,7 @@
91
50
 
92
51
 
93
52
  Ans = []
94
- N = 20 #攻撃者は既知
53
+ N = 10 #攻撃者は既知
95
54
  result = create_duplicates(N)
96
55
  #result = create_no_duplicates(N)
97
56
  V = result[0] #復元したいレコード
@@ -102,7 +61,7 @@
102
61
 
103
62
  #要素を昇順に
104
63
  W.sort()
105
- print("昇順W = " + str(W) + " ( |W| = " + str(len(W)) +", 重複数" + str(39-len(W)) + " )")
64
+ print("昇順W = " + str(W) + " ( |W| = " + str(len(W)) +" )")
106
65
 
107
66
  G = nx.Graph()
108
67
  #step1 2頂点の和がボリュームに含まれているのならエッジを追加
@@ -113,7 +72,7 @@
113
72
  if W[i] + W[j] in W:
114
73
  G.add_edge(W[i], W[j])
115
74
 
116
- print("存在する枝(" + str(len(G.edges)) + ") = " + str(G.edges))
75
+ print("存在する枝 = " + str(G.edges))
117
76
  print("抽出されたボリューム(" + str(len(G.nodes)) +"/" + str(len(W)) +") = " + str(G.nodes))
118
77
  print(list(G.neighbors(W[0])))
119
78
 
@@ -144,12 +103,8 @@
144
103
  def right_shift(S,G):
145
104
  #print("S = " + str(S))
146
105
  for i in range(N-2): #解の長さがNになるまで
147
- #print("現時点の解の長さ = " + str(i))
148
106
  T = []
149
- #j = 1
150
- for s in S: #候補解の数
107
+ for s in S: #解の数
151
- #print("候補解の " + str(j) + " 番目")
152
- #j += 1
153
108
  if len(s) != N:
154
109
  right_num = len(s) - 1
155
110
  l = list(G.neighbors(s[right_num]))#一番右の要素と隣合うノードを取得
@@ -159,7 +114,7 @@
159
114
  C.append(node)
160
115
  if C not in T:
161
116
  T.append(C)
162
- #T.append(s)#右に拡張できるがそのノードが終点である可能性があるため
117
+ T.append(s)#右に拡張できるがそのノードが終点である可能性があるため
163
118
  #print(T)
164
119
  S = copy.copy(T)
165
120
  #print("S = " + str(S))
@@ -197,29 +152,63 @@
197
152
  if i == len(RNodes)-1:
198
153
  T.append(s)
199
154
  return T
200
- #これまでは、最小のボリュームが真ん中である場合を考慮して両方に拡張しないといけなかった
201
- #T = copy.copy(S)
155
+ T = copy.copy(S)
202
- #T = right_shift(T,G)
156
+ T = right_shift(T,G)
203
- #T = left_shift(T,G)
157
+ T = left_shift(T,G)
204
- #S = left_shift(S,G)
158
+ S = left_shift(S,G)
205
159
  S = right_shift(S,G)
206
160
  #print("解候補 = " + str(T))
207
- print("解の数1 = " + str(len(S)))
161
+ print("解の数1 = " + str(len(T)))
208
- #T = confirm(T)
162
+ T = confirm(T)
209
163
  S = confirm(S)
210
164
  #print("解候補選別T = " + str(T))
211
165
  #print("解候補選別S = " + str(S))
212
- print("解の数2 = " + str(len(S)))
166
+ print("解の数2 = " + str(len(T)))
213
167
 
214
168
 
215
169
  #step5 解からボリュームを計算し比較
216
- #G1 = compare_volumes(T, W)
170
+ G1 = compare_volumes(T, W)
217
171
  #print("G1 = " + str(G1))
218
172
  G2 = compare_volumes(S, W)
219
173
  #print("G2 = " + str(G2))
220
- #G3 = G1|G2
174
+ G3 = G1|G2
221
175
 
222
- print("候補解(" + str(len(G2)) + "個) = " + str(G2))
176
+ print("候補解(" + str(len(G3)) + "個) = " + str(G3))
223
177
  print("真の解 = " + str(V))
224
178
 
225
- ```
179
+ ```
180
+ didSelectRowAt内に
181
+ detailVC.idString = dataSets[indexPath.row].docIDとすると
182
+ エラー:Fatal error: Index out of rangeとなります。
183
+ (どのセルをタップしてもエラーになります。)
184
+
185
+
186
+ numberOfRowsInSectionでは、
187
+ return dataSets.countとしてます。
188
+ なおその前にprintでdataSets.countを出力すると0ではなく, 適切な数字が出力されていました。
189
+
190
+ また、didSelectRowAt内でテスト出力してみると
191
+ firebaseからのデータを格納している構造体を格納する配列dastaSetsが空[]になっておりました。
192
+ indecPath.rowはクリックしたセルの番号が正しく出力されていました。
193
+ loadData()によって画面のセルにはFireStoreから読み込んだデータが読み込まれているのに、
194
+ dataSetsが[]である原因わかりません。
195
+
196
+ ご教示願います。
197
+
198
+
199
+ ![イメージ説明](ce2de5a6486214bd27851444652acb8b.png)
200
+ ![![イメージ説明](bcdd96b7434e3a1433c9d514560537d2.png)
201
+ ![イメージ説明](98d508b712a34027f6d37501405184b3.png)
202
+
203
+ 追記:
204
+ どうやらセルをタップした時に、loadData()が呼ばれているのか、if文のerror != nilの
205
+ print("erorrrrrr")が出力されたので、これによって、dataSetsが空のままになっていることがわかりました。
206
+
207
+
208
+
209
+ loadData()はviewWillAppearのみに記載しており、viewWillAppearは始めの画面生成時にのみよばれることから、セルタップ時にloadData()が呼ばれているのは
210
+
211
+ addSnapshotListnerのトリガーのようなものが関係しているのでしょうか。
212
+
213
+ ご教示願います。
214
+ ![イメージ説明](c02c797f43213fb92bfcf65f7df76b90.png)

6

修正

2020/11/20 05:00

投稿

apeirogon0813
apeirogon0813

スコア117

title CHANGED
File without changes
body CHANGED
@@ -34,4 +34,192 @@
34
34
  addSnapshotListnerのトリガーのようなものが関係しているのでしょうか。
35
35
 
36
36
  ご教示願います。
37
- ![イメージ説明](c02c797f43213fb92bfcf65f7df76b90.png)
37
+ ![イメージ説明](c02c797f43213fb92bfcf65f7df76b90.png)
38
+
39
+ ```ここに言語を入力
40
+ import random
41
+ import networkx as nx
42
+ import matplotlib.pyplot as plt
43
+ import copy
44
+
45
+ #要素が重複しているか
46
+ def has_duplicates(seq):
47
+ return len(seq) == len(set(seq))
48
+
49
+ def create_volumes(n):
50
+ #重複しないレコードの作成
51
+ V = random.sample(range(5,500), k=n)
52
+ Min = min(V)
53
+ print("最小値 = " + str(Min))
54
+ V.remove(Min)
55
+ V.insert(0,Min)
56
+ #観測されるボリューム集合の生成
57
+ W = copy.copy(V)
58
+ for i in range(N-1):
59
+ W.append(V[i]+V[i+1])
60
+ return V, W
61
+
62
+ #候補解から生成されるボリュームを観測したボリュームと比較
63
+ def compare_volumes(S, W):
64
+ T = set()
65
+ #観測されるボリューム集合の生成
66
+ for s in S:
67
+ w = copy.copy(s)
68
+ for i in range(N-1):
69
+ w.append(s[i]+s[i+1])
70
+ if set(w) == set(W):
71
+ #print(tuple(s))
72
+ T.add(tuple(s))
73
+ return T
74
+
75
+
76
+ #1つ以上重複しているボリュームを作成(レコードは重複していない)
77
+ def create_duplicates(n):
78
+ data = create_volumes(n)
79
+ if has_duplicates(data[1]): #重複していないならば
80
+ return create_duplicates(n)
81
+ else:
82
+ return data
83
+
84
+ def create_no_duplicates(n):
85
+ data = create_volumes(n)
86
+ #print(data[1])
87
+ if has_duplicates(data[1]):
88
+ return data
89
+ else:
90
+ return create_duplicates(n)
91
+
92
+
93
+ Ans = []
94
+ N = 20 #攻撃者は既知
95
+ result = create_duplicates(N)
96
+ #result = create_no_duplicates(N)
97
+ V = result[0] #復元したいレコード
98
+ print("V = " + str(V))
99
+ print("W = " + str(result[1]))
100
+ W = list(set(result[1])) #攻撃者が観測するボリュームの集合
101
+
102
+
103
+ #要素を昇順に
104
+ W.sort()
105
+ print("昇順W = " + str(W) + " ( |W| = " + str(len(W)) +", 重複数" + str(39-len(W)) + " )")
106
+
107
+ G = nx.Graph()
108
+ #step1 2頂点の和がボリュームに含まれているのならエッジを追加
109
+ #連結しているて頂点のみをエッジごと抽出
110
+ n = len(W)
111
+ for i in range(n-2):
112
+ for j in range(i+1,n-1):
113
+ if W[i] + W[j] in W:
114
+ G.add_edge(W[i], W[j])
115
+
116
+ print("存在する枝(" + str(len(G.edges)) + ") = " + str(G.edges))
117
+ print("抽出されたボリューム(" + str(len(G.nodes)) +"/" + str(len(W)) +") = " + str(G.nodes))
118
+ print(list(G.neighbors(W[0])))
119
+
120
+ #step2 確定レコード選別する
121
+ RNodes = [W[0], W[1]] #レコードは重複しない仮定より1,2番目に小さいボリュームはレコードである
122
+ for i in range(2, N):
123
+ for j in range(i):
124
+ #print("W[i] - W[j] = " + str(W[i]) + " - " + str(W[j]))
125
+ if W[i] - W[j] in W and W[i] != 2 * W[j] : #あるボリュームが確定レコード同士の和である時(その要素が隣同士orレコードであるor両方)
126
+ break
127
+ #else: 和でない場合は次に進める
128
+ #最終的にそのボリュームを生成する確定レコードの2要素の和が存在しない場合、そのボリューム確定レコード
129
+ if j == i-1:
130
+ RNodes.append(W[i])
131
+
132
+ print("確定レコード = " + str(RNodes))
133
+
134
+
135
+
136
+ #step3 確定レコードである頂点を通る経路長=N-1である経路
137
+ S = []
138
+ #//集合の中にリストの集合
139
+ l = list(G.neighbors(W[0]))
140
+
141
+ for i in l: #一次元配列だとループが回せないため、二次元配列にしておく
142
+ S.append([W[0],i])
143
+
144
+ def right_shift(S,G):
145
+ #print("S = " + str(S))
146
+ for i in range(N-2): #解の長さがNになるまで
147
+ #print("現時点の解の長さ = " + str(i))
148
+ T = []
149
+ #j = 1
150
+ for s in S: #候補解の数
151
+ #print("候補解の " + str(j) + " 番目")
152
+ #j += 1
153
+ if len(s) != N:
154
+ right_num = len(s) - 1
155
+ l = list(G.neighbors(s[right_num]))#一番右の要素と隣合うノードを取得
156
+ for node in l:
157
+ if node not in s: #同じレコードは存在しないかの判定
158
+ C = copy.copy(s)
159
+ C.append(node)
160
+ if C not in T:
161
+ T.append(C)
162
+ #T.append(s)#右に拡張できるがそのノードが終点である可能性があるため
163
+ #print(T)
164
+ S = copy.copy(T)
165
+ #print("S = " + str(S))
166
+ return S
167
+
168
+ #S = right_shift(S)
169
+
170
+ #左に拡張
171
+ def left_shift(S,G):
172
+ for i in range(N-2):
173
+ T = []
174
+ for s in S:
175
+ #print("s = " + str(s))
176
+ if len(s) != N:
177
+ l = list(G.neighbors(s[0]))
178
+ for node in l:
179
+ if node not in s: #同じレコードは存在しないかの判定
180
+ C = copy.copy(s)
181
+ C.insert(0,node) #先頭に要素を追加
182
+ if C not in T:
183
+ T.append(C)
184
+ T.append(s)
185
+ S = copy.copy(T)
186
+ #print("s = " + str(S))
187
+ return S
188
+
189
+ #step4 確定コードが解に含まれているか 現段階では確定レコードを通る効率的なアルゴリズムが考えられていないため
190
+ def confirm(S):
191
+ T = []
192
+ for s in S:
193
+ if len(s) == N:
194
+ for i in range(len(RNodes)):
195
+ if RNodes[i] not in s:
196
+ break
197
+ if i == len(RNodes)-1:
198
+ T.append(s)
199
+ return T
200
+ #これまでは、最小のボリュームが真ん中である場合を考慮して両方に拡張しないといけなかった
201
+ #T = copy.copy(S)
202
+ #T = right_shift(T,G)
203
+ #T = left_shift(T,G)
204
+ #S = left_shift(S,G)
205
+ S = right_shift(S,G)
206
+ #print("解候補 = " + str(T))
207
+ print("解の数1 = " + str(len(S)))
208
+ #T = confirm(T)
209
+ S = confirm(S)
210
+ #print("解候補選別T = " + str(T))
211
+ #print("解候補選別S = " + str(S))
212
+ print("解の数2 = " + str(len(S)))
213
+
214
+
215
+ #step5 解からボリュームを計算し比較
216
+ #G1 = compare_volumes(T, W)
217
+ #print("G1 = " + str(G1))
218
+ G2 = compare_volumes(S, W)
219
+ #print("G2 = " + str(G2))
220
+ #G3 = G1|G2
221
+
222
+ print("候補解(" + str(len(G2)) + "個) = " + str(G2))
223
+ print("真の解 = " + str(V))
224
+
225
+ ```

5

修正

2020/11/20 04:37

投稿

apeirogon0813
apeirogon0813

スコア117

title CHANGED
File without changes
body CHANGED
@@ -34,8 +34,4 @@
34
34
  addSnapshotListnerのトリガーのようなものが関係しているのでしょうか。
35
35
 
36
36
  ご教示願います。
37
- ![イメージ説明](c02c797f43213fb92bfcf65f7df76b90.png)
37
+ ![イメージ説明](c02c797f43213fb92bfcf65f7df76b90.png)
38
-
39
-
40
- PS.[ソースコードです](https://github.com/enpitut2020/LoveJudgement/tree/createPostsList)
41
- すみません、ソースコードはmasterではなくブランチのcreatePostsListです

4

修正

2020/11/02 12:55

投稿

apeirogon0813
apeirogon0813

スコア117

title CHANGED
File without changes
body CHANGED
@@ -37,4 +37,5 @@
37
37
  ![イメージ説明](c02c797f43213fb92bfcf65f7df76b90.png)
38
38
 
39
39
 
40
- PS.[ソースコードです](https://github.com/enpitut2020/LoveJudgement/tree/createPostsList)
40
+ PS.[ソースコードです](https://github.com/enpitut2020/LoveJudgement/tree/createPostsList)
41
+ すみません、ソースコードはmasterではなくブランチのcreatePostsListです

3

ソースコードの修正

2020/11/02 10:34

投稿

apeirogon0813
apeirogon0813

スコア117

title CHANGED
File without changes
body CHANGED
@@ -37,4 +37,4 @@
37
37
  ![イメージ説明](c02c797f43213fb92bfcf65f7df76b90.png)
38
38
 
39
39
 
40
- PS.[ソースコードです](https://github.com/enpitut2020/LoveJudgement.git)
40
+ PS.[ソースコードです](https://github.com/enpitut2020/LoveJudgement/tree/createPostsList)

2

追記

2020/11/02 10:34

投稿

apeirogon0813
apeirogon0813

スコア117

title CHANGED
File without changes
body CHANGED
@@ -34,4 +34,7 @@
34
34
  addSnapshotListnerのトリガーのようなものが関係しているのでしょうか。
35
35
 
36
36
  ご教示願います。
37
- ![イメージ説明](c02c797f43213fb92bfcf65f7df76b90.png)
37
+ ![イメージ説明](c02c797f43213fb92bfcf65f7df76b90.png)
38
+
39
+
40
+ PS.[ソースコードです](https://github.com/enpitut2020/LoveJudgement.git)

1

追記

2020/11/02 10:12

投稿

apeirogon0813
apeirogon0813

スコア117

title CHANGED
File without changes
body CHANGED
@@ -20,7 +20,8 @@
20
20
 
21
21
 
22
22
  ![イメージ説明](ce2de5a6486214bd27851444652acb8b.png)
23
- ![![イメージ説明](bcdd96b7434e3a1433c9d514560537d2.png)]
23
+ ![![イメージ説明](bcdd96b7434e3a1433c9d514560537d2.png)
24
+ ![イメージ説明](98d508b712a34027f6d37501405184b3.png)
24
25
 
25
26
  追記:
26
27
  どうやらセルをタップした時に、loadData()が呼ばれているのか、if文のerror != nilの