回答編集履歴
8
テキスト修正
test
CHANGED
@@ -106,7 +106,7 @@
|
|
106
106
|
|
107
107
|
})
|
108
108
|
|
109
|
-
if (
|
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 (
|
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/
|
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
テキスト修正
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
|
-
|
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
|
-
|
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/
|
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
テキスト修正
test
CHANGED
@@ -146,15 +146,15 @@
|
|
146
146
|
|
147
147
|
|
148
148
|
|
149
|
-
以下、別解です。
|
150
|
-
|
151
|
-
>
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
を作ることは変わりありません
|
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
テキスト修正
test
CHANGED
@@ -146,7 +146,15 @@
|
|
146
146
|
|
147
147
|
|
148
148
|
|
149
|
+
以下、別解です。ご質問にある、
|
150
|
+
|
151
|
+
> 0からnまでを要素として含む同じ3つの配列
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
|
156
|
+
|
149
|
-
|
157
|
+
を作ることは変わりありません。配列をシャッフルするために lodash の [_.shuffle](https://lodash.com/docs/#shuffle) を使い、配列を回転(rotate)させる関数を、stackoverflow の[この回答](https://stackoverflow.com/a/23368052)から拝借しています。
|
150
158
|
|
151
159
|
|
152
160
|
|
4
テキスト修正
test
CHANGED
@@ -186,9 +186,15 @@
|
|
186
186
|
|
187
187
|
|
188
188
|
|
189
|
-
// ar1, ar2, ar3 の同じ位置の要素を集めた配列を要素とした配列
|
189
|
+
// ar1, ar2, ar3 の同じ位置の要素を集めた配列を要素とした配列を得る
|
190
|
-
|
190
|
+
|
191
|
-
|
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
テキスト修正
test
CHANGED
@@ -68,7 +68,7 @@
|
|
68
68
|
|
69
69
|
以下は上記の各ステップをそのまま書いたものです。
|
70
70
|
|
71
|
-
__(※下記のコードは、kichirb3からコメントでご指摘頂いたように、常に期待される出力を得ることができません。修正案を検討中です。)__
|
71
|
+
__(※下記のコードは、kichirb3さんからコメントでご指摘頂いたように、常に期待される出力を得ることができません。修正案を検討中です。)__
|
72
72
|
|
73
73
|
|
74
74
|
|
2
テキスト修正
test
CHANGED
@@ -67,6 +67,8 @@
|
|
67
67
|
|
68
68
|
|
69
69
|
以下は上記の各ステップをそのまま書いたものです。
|
70
|
+
|
71
|
+
__(※下記のコードは、kichirb3からコメントでご指摘頂いたように、常に期待される出力を得ることができません。修正案を検討中です。)__
|
70
72
|
|
71
73
|
|
72
74
|
|
1
テキスト修正
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)
|