回答編集履歴

5

先にmenu1をシャッフルしてmenu2が取り出し順で同じ値にならなくなるまでシャッフルを繰り返す方法を追記

2015/08/23 13:19

投稿

KiKiKi_KiKi
KiKiKi_KiKi

スコア596

test CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  各処理をわかり易く書こうと思ったら、
20
20
 
21
- すごく冗長なコードになってしまったので、もう少しリファクタリング出来ると思います。
21
+ すごく冗長なコードになってしまったので、かなりリファクタリング出来ると思います。
22
22
 
23
23
  ```javascript
24
24
 
@@ -355,3 +355,125 @@
355
355
  }();
356
356
 
357
357
  ```
358
+
359
+
360
+
361
+ ---
362
+
363
+
364
+
365
+ **追記**
366
+
367
+ 下記の手順で取り出す方法を追記します。
368
+
369
+ 0. menu1をシャッフルするして順番を入れ替える
370
+
371
+ 0. menu2をシャッフルする
372
+
373
+ 0. インデックス順に各配列の要素を取り出してチェック。1回でも値が同じ場合があると2をやり直し
374
+
375
+ 0. インデックス順に各配列の要素を取り出す
376
+
377
+
378
+
379
+ ```javascript
380
+
381
+ var menu1 = ["ジュース","チョコ","アメ"];
382
+
383
+ var menu2 = ["ジュース","チョコ","アメ"];
384
+
385
+ var sameFlg = true;
386
+
387
+
388
+
389
+ // fisher-yates アルゴリズム
390
+
391
+ // katoyさんの書かれている配列をシャッフルする方法
392
+
393
+ var shuffle = function(arg) {
394
+
395
+ var i, j, l, tmp;
396
+
397
+ for(l=arg.length, i=l-1; i>0; i-=1) {
398
+
399
+ j = Math.floor(Math.random() * (i+1));
400
+
401
+ tmp = arg[i];
402
+
403
+ arg[i] = arg[j];
404
+
405
+ arg[j] = tmp;
406
+
407
+ }
408
+
409
+ return arg;
410
+
411
+ };
412
+
413
+
414
+
415
+ // menu1をシャッフル
416
+
417
+ menu1 = shuffle(menu1);
418
+
419
+
420
+
421
+ while(sameFlg) {
422
+
423
+ // menu2をシャッフル
424
+
425
+ menu2 = shuffle(menu2);
426
+
427
+ // 順番に取り出して同じ値が出てくる時はmenu2のシャッフルをやり直す
428
+
429
+ sameFlg = false;
430
+
431
+ for(var i = 0, l = menu1.length; i<l; i+=1) {
432
+
433
+ if(menu1[i] === menu2[i]) {
434
+
435
+ sameFlg = true;
436
+
437
+ break;
438
+
439
+ }
440
+
441
+ }
442
+
443
+ }
444
+
445
+
446
+
447
+ console.log('▼ menu1, menu2 それぞれの取り出し順 ▼');
448
+
449
+ console.log(menu1, menu2);
450
+
451
+ for(var i = 0, l = menu1.length; i<l; i+=1) {
452
+
453
+ console.log(menu1[i] + " と " + menu2[i]);
454
+
455
+ }
456
+
457
+ ```
458
+
459
+
460
+
461
+ ---
462
+
463
+
464
+
465
+ いずれにせよ
466
+
467
+ A. menu1の`ジュース`とmenu2の`ジュース`を区別する
468
+
469
+   = それぞれの袋の中から1つづつ取り出しす かつ 取り出されたモノ(の種類)が被らないようにする
470
+
471
+ B. `ジュース`というも区別できないモノのが2つ有るとする
472
+
473
+   = 大きな袋に全部入れてランダムに2つ取り出して、取り出されたモノが被らないようにする
474
+
475
+
476
+
477
+ のどちらかによってコードは変わってくると思います。
478
+
479
+ 私が書いたのはいずれも、A. の考え方の場合です。

4

変数名がわかりにくい箇所を修正

2015/08/23 13:19

投稿

KiKiKi_KiKi
KiKiKi_KiKi

スコア596

test CHANGED
@@ -238,7 +238,7 @@
238
238
 
239
239
  var patterns = [];
240
240
 
241
- var sortArg = function(arg, tmp, post, n) {
241
+ var sortArg = function(allPtns, ptnArg, post, n) {
242
242
 
243
243
  if(n > 0) {
244
244
 
@@ -250,15 +250,15 @@
250
250
 
251
251
  next = rest.splice(i, 1);
252
252
 
253
- sortArg(arg, tmp.concat(next), rest, n-1);
253
+ sortArg(allPtns, ptnArg.concat(next), rest, n-1);
254
254
 
255
255
  }
256
256
 
257
257
  } else {
258
258
 
259
- console.log(tmp);
259
+ console.log(ptnArg);
260
-
260
+
261
- arg[ arg.length ] = tmp;
261
+ allPtns[ allPtns.length ] = ptnArg;
262
262
 
263
263
  }
264
264
 

3

ちょっとイケてない記述を修正

2015/08/23 07:42

投稿

KiKiKi_KiKi
KiKiKi_KiKi

スコア596

test CHANGED
@@ -234,31 +234,41 @@
234
234
 
235
235
  // 配列の並び順のパターンを作成
236
236
 
237
+ var generatePatterns = function(arg) {
238
+
239
+ var patterns = [];
240
+
237
- var generatePatterns = function(arg, tmp, post, n) {
241
+ var sortArg = function(arg, tmp, post, n) {
238
-
242
+
239
- if(n > 0) {
243
+ if(n > 0) {
240
-
244
+
241
- var next, rest;
245
+ var next, rest;
242
-
246
+
243
- for(var i=0, l=post.length; i<l; i+=1) {
247
+ for(var i=0, l=post.length; i<l; i+=1) {
244
-
248
+
245
- rest = post.slice(0);
249
+ rest = post.slice(0);
246
-
250
+
247
- next = rest.splice(i, 1);
251
+ next = rest.splice(i, 1);
248
-
252
+
249
- generatePatterns(arg, tmp.concat(next), rest, n-1);
253
+ sortArg(arg, tmp.concat(next), rest, n-1);
250
-
254
+
251
- }
255
+ }
252
-
256
+
253
- } else {
257
+ } else {
254
-
258
+
255
- console.log(tmp);
259
+ console.log(tmp);
256
-
260
+
257
- arg[ arg.length ] = tmp;
261
+ arg[ arg.length ] = tmp;
258
-
262
+
259
- }
263
+ }
260
-
264
+
261
- }
265
+ };
266
+
267
+ sortArg(patterns, [], arg, arg.length);
268
+
269
+ return patterns;
270
+
271
+ };
262
272
 
263
273
 
264
274
 
@@ -268,9 +278,9 @@
268
278
 
269
279
  l = 0,
270
280
 
271
- allPatternsA = [],
281
+ allPatternsA,
272
-
282
+
273
- allPatternsB = [],
283
+ allPatternsB,
274
284
 
275
285
  randA,
276
286
 
@@ -288,11 +298,11 @@
288
298
 
289
299
  console.log('▼ menuAの取り出し方の全パターン ▼');
290
300
 
291
- generatePatterns(allPatternsA, [], menuA, menuA.length);
301
+ allPatternsA = generatePatterns(menuA);
292
302
 
293
303
  console.log('▼ menuBの取り出し方の全パターン ▼');
294
304
 
295
- generatePatterns(allPatternsB, [], menuB, menuB.length);
305
+ allPatternsB = generatePatterns(menuB);
296
306
 
297
307
 
298
308
 

2

変数名の間違いを修正

2015/08/23 07:37

投稿

KiKiKi_KiKi
KiKiKi_KiKi

スコア596

test CHANGED
@@ -198,9 +198,9 @@
198
198
 
199
199
  ```javascript
200
200
 
201
- var menu1 = ["ジュース","チョコ","アメ"];
201
+ var menuA = ["ジュース","チョコ","アメ"];
202
-
202
+
203
- var menu2 = ["チョコ","ジュース","アメ","バナナ"];
203
+ var menuB = ["チョコ","ジュース","アメ","バナナ"];
204
204
 
205
205
 
206
206
 

1

配列の値でチェックするパターンを追加

2015/08/23 07:13

投稿

KiKiKi_KiKi
KiKiKi_KiKi

スコア596

test CHANGED
@@ -193,3 +193,155 @@
193
193
  0. 同じ取り出し順に同じ値があったら2をやり直し
194
194
 
195
195
  0. ループで各配列の並び順に出力
196
+
197
+
198
+
199
+ ```javascript
200
+
201
+ var menu1 = ["ジュース","チョコ","アメ"];
202
+
203
+ var menu2 = ["チョコ","ジュース","アメ","バナナ"];
204
+
205
+
206
+
207
+ // 配列の長さを同じにする
208
+
209
+ var adjustLength = function(arg1, arg2) {
210
+
211
+ var l1 = arg1.length,
212
+
213
+ l2 = arg2.length,
214
+
215
+ gap = Math.abs(l1 - l2),
216
+
217
+ adjustArg;
218
+
219
+ if(gap) {
220
+
221
+ adjustArg = (l1 > l2)? arg2:arg1;
222
+
223
+ for(var i=0; i<gap; i+=1) {
224
+
225
+ adjustArg[ adjustArg.length ] = "なし!";
226
+
227
+ }
228
+
229
+ }
230
+
231
+ };
232
+
233
+
234
+
235
+ // 配列の並び順のパターンを作成
236
+
237
+ var generatePatterns = function(arg, tmp, post, n) {
238
+
239
+ if(n > 0) {
240
+
241
+ var next, rest;
242
+
243
+ for(var i=0, l=post.length; i<l; i+=1) {
244
+
245
+ rest = post.slice(0);
246
+
247
+ next = rest.splice(i, 1);
248
+
249
+ generatePatterns(arg, tmp.concat(next), rest, n-1);
250
+
251
+ }
252
+
253
+ } else {
254
+
255
+ console.log(tmp);
256
+
257
+ arg[ arg.length ] = tmp;
258
+
259
+ }
260
+
261
+ }
262
+
263
+
264
+
265
+ !function() {
266
+
267
+ var i = 0,
268
+
269
+ l = 0,
270
+
271
+ allPatternsA = [],
272
+
273
+ allPatternsB = [],
274
+
275
+ randA,
276
+
277
+ randB,
278
+
279
+ ptnA,
280
+
281
+ ptnB,
282
+
283
+ isSame = true;
284
+
285
+
286
+
287
+ adjustLength(menuA, menuB);
288
+
289
+ console.log('▼ menuAの取り出し方の全パターン ▼');
290
+
291
+ generatePatterns(allPatternsA, [], menuA, menuA.length);
292
+
293
+ console.log('▼ menuBの取り出し方の全パターン ▼');
294
+
295
+ generatePatterns(allPatternsB, [], menuB, menuB.length);
296
+
297
+
298
+
299
+ randA = Math.floor( Math.random() * allPatternsA.length );
300
+
301
+ ptnA = allPatternsA[randA];
302
+
303
+ while(isSame) {
304
+
305
+ randB = Math.floor( Math.random() * allPatternsB.length );
306
+
307
+ ptnB = allPatternsB[randB];
308
+
309
+ isSame = false;
310
+
311
+ for(i=0, l=ptnA.length; i<l; i+=1) {
312
+
313
+ // 取り出し順の値が被らないかチェック
314
+
315
+ if(ptnA[i] === ptnB[i]) {
316
+
317
+ isSame = true;
318
+
319
+ break;
320
+
321
+ }
322
+
323
+ }
324
+
325
+ }
326
+
327
+ console.log('▼ menuA, menuB それぞれの取り出し順 ▼');
328
+
329
+ console.log(ptnA, ptnB);
330
+
331
+
332
+
333
+ console.log('▼ 決まった取り出し順に基いて順番に取り出す ▼');
334
+
335
+ for(i=0, l=ptnA.length; i<l; i+=1) {
336
+
337
+ var m1 = ptnA[i],
338
+
339
+ m2 = ptnB[i];
340
+
341
+ console.log(m1 + 'と' + m2);
342
+
343
+ }
344
+
345
+ }();
346
+
347
+ ```