質問編集履歴

2

前提条件\(審査員の人数について\)を追加

2017/03/04 16:44

投稿

17number
17number

スコア14

test CHANGED
File without changes
test CHANGED
@@ -8,6 +8,8 @@
8
8
 
9
9
  * 複数の選手を複数の審査員が順位付けして、全ての情報を総合して順位を計算する
10
10
 
11
+ * 審査員は必ず奇数人数
12
+
11
13
 
12
14
 
13
15
  | |審査員A|審査員B|審査員C|審査員D|審査員E|

1

記載途中のコードを追加。

2017/03/04 16:44

投稿

17number
17number

スコア14

test CHANGED
File without changes
test CHANGED
@@ -99,3 +99,127 @@
99
99
  * キー : 選手名
100
100
 
101
101
  * バリュー : その選手に付けられた順位の配列(ソート済)
102
+
103
+
104
+
105
+ ####現状のコード(作りかけ)
106
+
107
+ コンソールで色々と動作確認しながら書いていっているため、関数分割したりなどは現時点では未考慮になります。
108
+
109
+
110
+
111
+ ```ruby
112
+
113
+ # 中央値を取得するためのインデックス
114
+
115
+ median_cnt = judge_num / 2 # 審査員の数(judge_num)は設定ファイルなどから取得済と思ってください
116
+
117
+
118
+
119
+ judging_infos = []
120
+
121
+ rank_hash.each do |name, ranks|
122
+
123
+ # 中央値
124
+
125
+ median = ranks[median_cnt]
126
+
127
+
128
+
129
+ # 中央値以降の順位
130
+
131
+ ranks_latter_half = ranks.drop(median_cnt)
132
+
133
+
134
+
135
+ # 中央値が後半にいくつあるかをカウント
136
+
137
+ majority_cnt = ranks_latter_half.group_by(&:itself)[median].count
138
+
139
+
140
+
141
+ # 中央値より前の順位
142
+
143
+ ranks_first_half = ranks.take(median_cnt)
144
+
145
+
146
+
147
+ # 中央値より前の合計値
148
+
149
+ upper_sum = ranks_first_half.sum
150
+
151
+
152
+
153
+ # 算出した情報をまとめて配列に保持
154
+
155
+ judging_infos << [name, median, majority_cnt, upper_sum]
156
+
157
+ end
158
+
159
+
160
+
161
+ # 算出した情報を中央値でソート
162
+
163
+ judging_infos.sort!{|a, b| a[1] <=> b[1]}
164
+
165
+
166
+
167
+ # これ以降、上記までに取得した情報を使って処理すれば良いものと思いロジックを検討中
168
+
169
+
170
+
171
+ # 先頭の要素を取得
172
+
173
+ place, name_places = 1, {}
174
+
175
+ judging_info = judging_infos.shift
176
+
177
+ while(judging_infos.present?) do
178
+
179
+ median = judging_info[1]
180
+
181
+
182
+
183
+ # 中央値が異なるので順位確定
184
+
185
+ unless median == judging_infos[0][1]
186
+
187
+ name_places.store(judging_info[0], place)
188
+
189
+ place += 1
190
+
191
+ next
192
+
193
+ end
194
+
195
+
196
+
197
+ # 中央値が同じものを処理する
198
+
199
+ # このあたりの処理が while の多重ループになりそうで頭を悩ませ中
200
+
201
+ # 一通り組み終わった後でリファクタしても良いが、そもそもコードとしてイケてない感しか無い…
202
+
203
+ compare_infos = ...
204
+
205
+ while(中央値が同じ間) do
206
+
207
+ 中央値が同じものを処理対象として抽出
208
+
209
+ end
210
+
211
+
212
+
213
+ 中央値のカウント数でソート
214
+
215
+
216
+
217
+ while(取り出した情報数) do
218
+
219
+ ...
220
+
221
+ end
222
+
223
+ end
224
+
225
+ ```