回答編集履歴

8

テキスト修正

2019/10/02 18:51

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -106,7 +106,7 @@
106
106
 
107
107
  })
108
108
 
109
- if (ar2.every(x => typeof x !== 'undefined'))
109
+ if (typeof ar2[n] !== 'undefined')
110
110
 
111
111
  break
112
112
 
@@ -130,7 +130,7 @@
130
130
 
131
131
  })
132
132
 
133
- if (ar3.every(x => typeof x !== 'undefined'))
133
+ if (typeof ar3[n] !== 'undefined')
134
134
 
135
135
  break
136
136
 
@@ -150,7 +150,7 @@
150
150
 
151
151
 
152
152
 
153
- - **動作確認用CodePen: ** [https://codepen.io/jun68ykt/pen/LYPwgMN?editors=0012](https://codepen.io/jun68ykt/pen/LYPwgMN?editors=0012)
153
+ - **動作確認用CodePen: ** [https://codepen.io/jun68ykt/pen/oNvKQKd?editors=0012](https://codepen.io/jun68ykt/pen/oNvKQKd?editors=0012)
154
154
 
155
155
 
156
156
 

7

テキスト修正

2019/10/02 18:51

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -66,9 +66,7 @@
66
66
 
67
67
 
68
68
 
69
- 以下は上記の各ステップをそのまま書いたものです。
69
+ 以下は上記の各ステップをコードにしたものです。
70
-
71
- __(※下記のコードは、kichirb3さんからコメントでご指摘頂いたように、常に期待される出力を得ることができません。修正案を検討中です。)__
72
70
 
73
71
 
74
72
 
@@ -94,29 +92,49 @@
94
92
 
95
93
  // ar1 と同じ位置に同じ要素を持たない配列 ar2 を作成
96
94
 
95
+ let ar2
96
+
97
+ while(true) {
98
+
97
- const ar2 = []
99
+ ar2 = []
98
-
100
+
99
- ar1.forEach((_, i) => {
101
+ ar1.forEach((_, i) => {
100
-
102
+
101
- const candidates = ar1.filter(e => e !== ar1[i] && !ar2.includes(e))
103
+ const candidates = ar1.filter(e => e !== ar1[i] && !ar2.includes(e))
102
-
104
+
103
- ar2.push(sample(candidates))
105
+ ar2.push(sample(candidates))
104
-
106
+
105
- })
107
+ })
108
+
109
+ if (ar2.every(x => typeof x !== 'undefined'))
110
+
111
+ break
112
+
113
+ }
106
114
 
107
115
 
108
116
 
109
117
  // ar1, ar2 と同じ位置に同じ要素を持たない配列 ar3 を作成
110
118
 
119
+ let ar3
120
+
121
+ while(true) {
122
+
111
- const ar3 = []
123
+ ar3 = []
112
-
124
+
113
- ar1.forEach((_, i) => {
125
+ ar1.forEach((_, i) => {
114
-
126
+
115
- const candidates = ar1.filter(e => e !== ar1[i] && e !== ar2[i] && !ar3.includes(e))
127
+ const candidates = ar1.filter(e => e !== ar1[i] && e !== ar2[i] && !ar3.includes(e))
116
-
128
+
117
- ar3.push(sample(candidates))
129
+ ar3.push(sample(candidates))
118
-
130
+
119
- })
131
+ })
132
+
133
+ if (ar3.every(x => typeof x !== 'undefined'))
134
+
135
+ break
136
+
137
+ }
120
138
 
121
139
 
122
140
 
@@ -132,7 +150,7 @@
132
150
 
133
151
 
134
152
 
135
- - **動作確認用CodePen: ** [https://codepen.io/jun68ykt/pen/xxKvYYx?editors=0012](https://codepen.io/jun68ykt/pen/xxKvYYx?editors=0012)
153
+ - **動作確認用CodePen: ** [https://codepen.io/jun68ykt/pen/LYPwgMN?editors=0012](https://codepen.io/jun68ykt/pen/LYPwgMN?editors=0012)
136
154
 
137
155
 
138
156
 

6

テキスト修正

2019/10/02 18:32

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -146,15 +146,15 @@
146
146
 
147
147
 
148
148
 
149
- 以下、別解です。ご質問にある、
150
-
151
- > 0からnまでを要素として含む同じ3つの配列
152
-
153
-
154
-
155
-
156
-
157
- を作ることは変わりありません配列をシャッフルするために lodash の [_.shuffle](https://lodash.com/docs/#shuffle) を使い、配列を回転(rotate)させる関数を、stackoverflow の[この回答](https://stackoverflow.com/a/23368052)から拝借しています。
149
+ 以下、別解です。
150
+
151
+ > 3つの配列
152
+
153
+
154
+
155
+
156
+
157
+ 、 `ar1`, `ar2`, `ar3` として作ることは先の回答と変わりありませんが、配列をシャッフルするために lodash の [_.shuffle](https://lodash.com/docs/#shuffle) を使い、配列を回転(rotate)させる関数を、stackoverflow の[この回答](https://stackoverflow.com/a/23368052)から拝借します。
158
158
 
159
159
 
160
160
 

5

テキスト修正

2019/10/02 15:59

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -146,7 +146,15 @@
146
146
 
147
147
 
148
148
 
149
+ 以下、別解です。ご質問にある、
150
+
151
+ > 0からnまでを要素として含む同じ3つの配列
152
+
153
+
154
+
155
+
156
+
149
- 以下、別解です。配列をシャッフルするために lodash の [_.shuffle](https://lodash.com/docs/#shuffle) を使い、配列を回転(rotate)させる関数を、stackoverflow の[この回答](https://stackoverflow.com/a/23368052)から拝借しています。
157
+ を作ることは変わりありません。配列をシャッフルするために lodash の [_.shuffle](https://lodash.com/docs/#shuffle) を使い、配列を回転(rotate)させる関数を、stackoverflow の[この回答](https://stackoverflow.com/a/23368052)から拝借しています。
150
158
 
151
159
 
152
160
 

4

テキスト修正

2019/10/02 15:43

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -186,9 +186,15 @@
186
186
 
187
187
 
188
188
 
189
- // ar1, ar2, ar3 の同じ位置の要素を集めた配列を要素とした配列に変換
189
+ // ar1, ar2, ar3 の同じ位置の要素を集めた配列を要素とした配列を得る
190
-
190
+
191
- return ar1.map((_, i) => [ar1[i], ar2[i], ar3[i]])
191
+ const ar = ar1.map((_, i) => [ar1[i], ar2[i], ar3[i]])
192
+
193
+
194
+
195
+ // 上記で得られた配列をシャッフルした配列を返す
196
+
197
+ return _.shuffle(ar)
192
198
 
193
199
  }
194
200
 

3

テキスト修正

2019/10/02 15:32

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -68,7 +68,7 @@
68
68
 
69
69
  以下は上記の各ステップをそのまま書いたものです。
70
70
 
71
- __(※下記のコードは、kichirb3からコメントでご指摘頂いたように、常に期待される出力を得ることができません。修正案を検討中です。)__
71
+ __(※下記のコードは、kichirb3さんからコメントでご指摘頂いたように、常に期待される出力を得ることができません。修正案を検討中です。)__
72
72
 
73
73
 
74
74
 

2

テキスト修正

2019/10/02 15:10

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -67,6 +67,8 @@
67
67
 
68
68
 
69
69
  以下は上記の各ステップをそのまま書いたものです。
70
+
71
+ __(※下記のコードは、kichirb3からコメントでご指摘頂いたように、常に期待される出力を得ることができません。修正案を検討中です。)__
70
72
 
71
73
 
72
74
 

1

テキスト修正

2019/10/02 15:09

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -137,3 +137,59 @@
137
137
 
138
138
 
139
139
  以上、参考になれば幸いです。
140
+
141
+
142
+
143
+ ### 追記
144
+
145
+
146
+
147
+ 以下、別解です。配列をシャッフルするために lodash の [_.shuffle](https://lodash.com/docs/#shuffle) を使い、配列を回転(rotate)させる関数を、stackoverflow の[この回答](https://stackoverflow.com/a/23368052)から拝借しています。
148
+
149
+
150
+
151
+ ```javascript
152
+
153
+ function arrayRotate(arr, reverse) {
154
+
155
+ if (reverse) arr.unshift(arr.pop());
156
+
157
+ else arr.push(arr.shift());
158
+
159
+ return arr;
160
+
161
+ }
162
+
163
+
164
+
165
+ function make3Array (n) {
166
+
167
+
168
+
169
+ // 0 から n までをランダムな順番で含む配列を作成する。
170
+
171
+ const ar1 = _.shuffle([...Array(n+1)].map((_, i) => i))
172
+
173
+
174
+
175
+ // ar1 をローテートした配列を得る
176
+
177
+  const ar2 = arrayRotate([...ar1])
178
+
179
+
180
+
181
+ // ar2 をローテートした配列を得る
182
+
183
+  const ar3 = arrayRotate([...ar2])
184
+
185
+
186
+
187
+ // ar1, ar2, ar3 の同じ位置の要素を集めた配列を要素とした配列に変換
188
+
189
+ return ar1.map((_, i) => [ar1[i], ar2[i], ar3[i]])
190
+
191
+ }
192
+
193
+ ```
194
+
195
+ - **動作確認用CodePen: ** [https://codepen.io/jun68ykt/pen/pozMLXy?editors=0012](https://codepen.io/jun68ykt/pen/pozMLXy?editors=0012)