回答編集履歴

10

テキスト修正

2019/06/07 12:38

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -190,17 +190,19 @@
190
190
 
191
191
 
192
192
 
193
- 先の[追記1に挙げたコード](https://jsfiddle.net/jun68ykt/78s9eabq/3/) を、以下の4点につき、修正しました。
193
+ 先の[追記1に挙げたコード](https://jsfiddle.net/jun68ykt/78s9eabq/3/) を、以下の5点につき、修正しました。
194
+
195
+
196
+
194
-
197
+ 1. 関数名を `divide` とした。
195
-
196
-
198
+
197
- 1. `if (len <= 1){ return [ary]; }` は不要だったので削除
199
+ 2. `if (len <= 1){ return [ary]; }` は不要だったので削除
198
-
200
+
199
- 2. 配列を連結するのに、`concat` のかわりにスプレッド構文を使用
201
+ 3. 配列を連結するのに、`concat` のかわりにスプレッド構文を使用
200
-
202
+
201
- 3. 処理対象の上限を判定するために、引数の配列の長さではなく再帰の深さでチェックするように修正
203
+ 4. 処理対象の上限を判定するために、引数の配列の長さではなく再帰の深さでチェックするように修正
202
-
204
+
203
- 4. 変数名 `i` が、一行の中の異なる2カ所で使われていたので修正
205
+ 5. 変数名 `i` が、一行の中の異なる2カ所で使われていたので修正
204
206
 
205
207
 
206
208
 
@@ -214,7 +216,7 @@
214
216
 
215
217
 
216
218
 
217
- const f = (ary, depth=0) => {
219
+ const divide = (ary, depth=0) => {
218
220
 
219
221
 
220
222
 
@@ -236,7 +238,7 @@
236
238
 
237
239
  [ary.slice(0, endOfSeries),
238
240
 
239
- ...f(ary.slice(endOfSeries), depth+1)];
241
+ ...divide(ary.slice(endOfSeries), depth+1)];
240
242
 
241
243
  };
242
244
 
@@ -244,4 +246,4 @@
244
246
 
245
247
 
246
248
 
247
- - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/78s9eabq/8/](https://jsfiddle.net/jun68ykt/78s9eabq/8/)
249
+ - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/78s9eabq/9/](https://jsfiddle.net/jun68ykt/78s9eabq/9/)

9

テキスト修正

2019/06/07 12:38

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -220,7 +220,7 @@
220
220
 
221
221
  if (depth > MAX_RECURSIVE_DEPTH) {
222
222
 
223
- throw new Error(`Recursive depth is over.`);
223
+ throw new Error('Recursive depth is over the limit.');
224
224
 
225
225
  }
226
226
 
@@ -244,4 +244,4 @@
244
244
 
245
245
 
246
246
 
247
- - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/78s9eabq/7/](https://jsfiddle.net/jun68ykt/78s9eabq/7/)
247
+ - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/78s9eabq/8/](https://jsfiddle.net/jun68ykt/78s9eabq/8/)

8

テキスト修正

2019/06/01 07:08

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -200,7 +200,7 @@
200
200
 
201
201
  3. 処理対象の上限を判定するために、引数の配列の長さではなく再帰の深さでチェックするように修正
202
202
 
203
- 4. 変数名 `i` が2カ所で使われていたので修正
203
+ 4. 変数名 `i` が、一行の中の異なる2カ所で使われていたので修正
204
204
 
205
205
 
206
206
 

7

テキスト修正

2019/06/01 05:55

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -190,7 +190,7 @@
190
190
 
191
191
 
192
192
 
193
- 先の[追記1に挙げたコード](https://jsfiddle.net/jun68ykt/78s9eabq/3/) を、以下の修正しました。
193
+ 先の[追記1に挙げたコード](https://jsfiddle.net/jun68ykt/78s9eabq/3/) を、以下の4につき、修正しました。
194
194
 
195
195
 
196
196
 

6

テキスト修正

2019/06/01 05:53

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -200,6 +200,8 @@
200
200
 
201
201
  3. 処理対象の上限を判定するために、引数の配列の長さではなく再帰の深さでチェックするように修正
202
202
 
203
+ 4. 変数名 `i` が2カ所で使われていたので修正
204
+
203
205
 
204
206
 
205
207
  上記の修正後のものが以下です。
@@ -224,13 +226,17 @@
224
226
 
225
227
 
226
228
 
227
- const i = ary.findIndex((e, i) => i>=1 && ary[i-1]+1 !== e);
229
+ const endOfSeries = ary.findIndex((e, i) => i>=1 && ary[i-1]+1 !== e);
228
-
229
-
230
-
230
+
231
+
232
+
231
- return i < 0 ? [ary]
233
+ return endOfSeries < 0 ?
234
+
232
-
235
+ [ary] :
236
+
237
+ [ary.slice(0, endOfSeries),
238
+
233
- : [ary.slice(0, i) , ...f(ary.slice(i), depth+1)];
239
+ ...f(ary.slice(endOfSeries), depth+1)];
234
240
 
235
241
  };
236
242
 
@@ -238,4 +244,4 @@
238
244
 
239
245
 
240
246
 
241
- - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/78s9eabq/6/](https://jsfiddle.net/jun68ykt/78s9eabq/6/)
247
+ - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/78s9eabq/7/](https://jsfiddle.net/jun68ykt/78s9eabq/7/)

5

テキスト修正

2019/06/01 05:50

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -120,7 +120,7 @@
120
120
 
121
121
 
122
122
 
123
- ### 追記
123
+ ### 追記1
124
124
 
125
125
 
126
126
 
@@ -179,3 +179,63 @@
179
179
 
180
180
 
181
181
  上記で回答した関数 `f(ary)` は、引数に空の配列 `[]` を渡されると `[[]]` を返します。これが質問者さまにとって望ましいのかどうか不明ではありますが、このままにしておきます。
182
+
183
+
184
+
185
+ ### 追記3
186
+
187
+
188
+
189
+ すでに解決済みとなっていますが、少し修正したものを挙げておきます。
190
+
191
+
192
+
193
+ 先の[追記1に挙げたコード](https://jsfiddle.net/jun68ykt/78s9eabq/3/) を、以下の3点で修正しました。
194
+
195
+
196
+
197
+ 1. `if (len <= 1){ return [ary]; }` は不要だったので削除
198
+
199
+ 2. 配列を連結するのに、`concat` のかわりにスプレッド構文を使用
200
+
201
+ 3. 処理対象の上限を判定するために、引数の配列の長さではなく再帰の深さでチェックするように修正
202
+
203
+
204
+
205
+ 上記の修正後のものが以下です。
206
+
207
+
208
+
209
+ ```javascript
210
+
211
+ const MAX_RECURSIVE_DEPTH = 1000;
212
+
213
+
214
+
215
+ const f = (ary, depth=0) => {
216
+
217
+
218
+
219
+ if (depth > MAX_RECURSIVE_DEPTH) {
220
+
221
+ throw new Error(`Recursive depth is over.`);
222
+
223
+ }
224
+
225
+
226
+
227
+ const i = ary.findIndex((e, i) => i>=1 && ary[i-1]+1 !== e);
228
+
229
+
230
+
231
+ return i < 0 ? [ary]
232
+
233
+ : [ary.slice(0, i) , ...f(ary.slice(i), depth+1)];
234
+
235
+ };
236
+
237
+ ```
238
+
239
+
240
+
241
+ - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/78s9eabq/6/](https://jsfiddle.net/jun68ykt/78s9eabq/6/)

4

テキスト修正

2019/06/01 05:39

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -171,3 +171,11 @@
171
171
 
172
172
 
173
173
  - **上記の動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/78s9eabq/3/](https://jsfiddle.net/jun68ykt/78s9eabq/3/)
174
+
175
+
176
+
177
+ ### 追記2
178
+
179
+
180
+
181
+ 上記で回答した関数 `f(ary)` は、引数に空の配列 `[]` を渡されると `[[]]` を返します。これが質問者さまにとって望ましいのかどうか不明ではありますが、このままにしておきます。

3

テキスト修正

2019/05/30 02:29

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -170,4 +170,4 @@
170
170
 
171
171
 
172
172
 
173
- - **上記の動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/78s9eabq/2/](https://jsfiddle.net/jun68ykt/78s9eabq/2/)
173
+ - **上記の動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/78s9eabq/3/](https://jsfiddle.net/jun68ykt/78s9eabq/3/)

2

テキスト修正

2019/05/29 23:57

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -117,3 +117,57 @@
117
117
 
118
118
 
119
119
  以上参考になれば幸いです。
120
+
121
+
122
+
123
+ ### 追記
124
+
125
+
126
+
127
+ 上記の `f()` を、 forループのかわりに`findIndex` を使って修正したものが以下です。
128
+
129
+
130
+
131
+ ```javascript
132
+
133
+ const MAX_LENGTH = 100000;
134
+
135
+
136
+
137
+ const f = ary => {
138
+
139
+ const len = ary.length;
140
+
141
+
142
+
143
+ if (len > MAX_LENGTH) {
144
+
145
+ throw new Error('too long !');
146
+
147
+ }
148
+
149
+
150
+
151
+ if (len <= 1){
152
+
153
+ return [ary];
154
+
155
+ }
156
+
157
+
158
+
159
+ const i = ary.findIndex((e, i) => i>=1 && ary[i-1]+1 !== e);
160
+
161
+
162
+
163
+ return i < 0 ? [ ary ] : [ary.slice(0, i)].concat(f(ary.slice(i)));
164
+
165
+ };
166
+
167
+
168
+
169
+ ```
170
+
171
+
172
+
173
+ - **上記の動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/78s9eabq/2/](https://jsfiddle.net/jun68ykt/78s9eabq/2/)

1

テキスト修正

2019/05/29 23:56

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -68,11 +68,11 @@
68
68
 
69
69
 
70
70
 
71
- - 処理対象の配列の長さの上限 `MAX_LENGTH`を(とりあえず) 10000 としています。
71
+ 処理対象の配列の長さの上限 `MAX_LENGTH`を(とりあえず) 100000 としています。
72
72
 
73
+   
73
74
 
74
-
75
- - 以下、上記の `f()` を使った例です。
75
+ 以下、上記の `f()` を使った例です。
76
76
 
77
77
 
78
78