回答編集履歴

5

妥当な文字列はtrueになるはずですよね

2018/06/20 16:23

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -184,7 +184,7 @@
184
184
 
185
185
  - `3` ← trueが連続して続いたMax回数
186
186
 
187
- - `return 3 >= 2` ← 2回以上続いたらfalseを返す
187
+ - `return 3 < 2` ← 2回以上続いたらfalseを返す
188
188
 
189
189
 
190
190
 
@@ -274,13 +274,13 @@
274
274
 
275
275
  .reduce((a, b) => Math.max(a, b), 0) // 3
276
276
 
277
- return maxLength >= 2;
277
+ return maxLength < 2;
278
-
278
+
279
- }
279
+ }
280
-
280
+
281
- checkNum(1235) // true
281
+ checkNum(1245) // true
282
-
282
+
283
- checkNum(1245) // false
283
+ checkNum(1235) // false
284
284
 
285
285
  ```
286
286
 

4

更に追記

2018/06/20 16:23

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -234,7 +234,9 @@
234
234
 
235
235
  では、早速データを加工していきましょう。
236
236
 
237
- 今回は連番している状態を1、連番ではない状態を2とします。
237
+ 今回は連番している状態を1、連番ではない状態を0として文字列変換を経由する事で実現させます。
238
+
239
+ 詳細は各行の末尾にどんな値に変換されるかをコメントで記載しました。
238
240
 
239
241
 
240
242
 

3

おまけの解説を追加

2018/06/20 16:20

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -130,6 +130,12 @@
130
130
 
131
131
 
132
132
 
133
+ 引き出しのネタとして全く違うアプローチから解いていきます。
134
+
135
+ JavaScript中級者向けの内容となっていますので、分かる部分だけ持っていってください。
136
+
137
+
138
+
133
139
  AとBは連番であるというところを抜き出しましょうか
134
140
 
135
141
  シリアルナンバーと言えばなんか別のモノを指すように思えますが、まぁいいや、isシリアルナンバーという関数を用意します。
@@ -182,13 +188,17 @@
182
188
 
183
189
 
184
190
 
185
- JavaScriptの配列中々優秀で、[map](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)や[reduce](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)といったメソッドが用意されおり、
186
-
187
- 好きなよう加工するできます。
188
-
189
-
190
-
191
- これらのメソッドは関数を引数として要するので何度も関数定義必要になり、行数が増えがちなのですが、
191
+ JavaScriptの全ての値プロトタイプといメソッドがひっついいます。
192
+
193
+ 質問文の`num.toString().split('')`はまさそれで、JSの全ての型にはStringに変換する`toString`メソッド用意されており、文字列に変換した後に`split`メソッドを利用して配列型に変換しています。
194
+
195
+
196
+
197
+ に配列型には、[map](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)や[reduce](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)といったメソッドが用意されおり、配列の各素を好きなように加工するができま
198
+
199
+
200
+
201
+ mapやreduceはメソッドは関数を引数として要求するので、何度も関数定義を書くことになり行数が増えがちなのですが、
192
202
 
193
203
  ES2015というバージョンで[アロー関数](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/arrow_functions)という書き方が使える様になりました。
194
204
 
@@ -196,6 +206,8 @@
196
206
 
197
207
  早速上記の連番判定関数をアロー関数で書き直してみます。
198
208
 
209
+ (functionが消えて`=>`という2文字の矢印を使ってるだけです、1行で値を返す場合は`{}`を省略出来たりと便利)
210
+
199
211
 
200
212
 
201
213
  ```JavaScript

2

おまけのコードが1行足りなかった

2018/06/20 16:14

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -254,7 +254,9 @@
254
254
 
255
255
  .join('') // "111"
256
256
 
257
- .split('0') // [3]
257
+ .split('0') // ["111"]
258
+
259
+ .map(it => it.length) // [3]
258
260
 
259
261
  .reduce((a, b) => Math.max(a, b), 0) // 3
260
262
 

1

エレガント方面に考えてみた

2018/06/20 16:06

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -60,13 +60,13 @@
60
60
 
61
61
  count = 1;
62
62
 
63
- } else if (parseInt(it) == parseInt(last) + 1) {
63
+ } else if (parseInt(it) === parseInt(last) + 1) {
64
64
 
65
65
  // 取得文字が前回の文字より1多い場合、連番カウントを加算
66
66
 
67
67
  count++;
68
68
 
69
- } else if (last == '9' && it == 0) {
69
+ } else if (last === '9' && it === '0') {
70
70
 
71
71
  // 取得文字0、前回の文字9の場合は連番とみなしてカウントを加算
72
72
 
@@ -119,3 +119,161 @@
119
119
  質問文から素直にコードにするとこんな感じのところがゴールになります。
120
120
 
121
121
  もう少し発展させてエレガントなコードにするとkeiさんのコードになるでしょう。
122
+
123
+
124
+
125
+ ---
126
+
127
+
128
+
129
+ おまけ: コードを洗練させていく
130
+
131
+
132
+
133
+ AとBは連番であるというところを抜き出しましょうか
134
+
135
+ シリアルナンバーと言えばなんか別のモノを指すように思えますが、まぁいいや、isシリアルナンバーという関数を用意します。
136
+
137
+
138
+
139
+ ```JavaScript
140
+
141
+ function isSerialNumber (a, b) {
142
+
143
+ if (a === 9 && b === 0) return true;
144
+
145
+ if (b === a + 1) return true;
146
+
147
+ return false;
148
+
149
+ }
150
+
151
+ isSerialNumber(1, 2) // true
152
+
153
+ isSerialNumber(9, 0) // true
154
+
155
+ isSerialNumber(1, 3) // false
156
+
157
+ ```
158
+
159
+
160
+
161
+ 続いて、`1234`という数字列の判定をしていきます。
162
+
163
+ これは左の数字と、右の数字が連結…つまり`1と2`、`2と3``3と4`文字目の連結を確認して、
164
+
165
+ 2つの連結が同時に起こっている場合は3文字連番が続いているので不正と判断出来ます。
166
+
167
+
168
+
169
+ 従って下記のような順序でデータを加工できれば判別が可能となります。
170
+
171
+
172
+
173
+ - `["1", "2", "3", "4"]`
174
+
175
+ - `[[1, 2], [2, 3], [3, 4]]`
176
+
177
+ - `[true, true, true]`
178
+
179
+ - `3` ← trueが連続して続いたMax回数
180
+
181
+ - `return 3 >= 2` ← 2回以上続いたらfalseを返す
182
+
183
+
184
+
185
+ JavaScriptの配列は中々優秀で、[map](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)や[reduce](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)といったメソッドが用意されており、
186
+
187
+ 好きなように加工する事ができます。
188
+
189
+
190
+
191
+ これらのメソッドは関数を引数として要求するので何度も関数定義が必要になり、行数が増えがちなのですが、
192
+
193
+ ES2015というバージョンで[アロー関数](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/arrow_functions)という書き方が使える様になりました。
194
+
195
+ モダンブラウザではIE11以外のほぼ全てのブラウザで利用可能です。
196
+
197
+ 早速上記の連番判定関数をアロー関数で書き直してみます。
198
+
199
+
200
+
201
+ ```JavaScript
202
+
203
+ var isSerialNumber = (a, b) => {
204
+
205
+ if (a === 9 && b === 0) return true;
206
+
207
+ if (b === a + 1) return true;
208
+
209
+ return false;
210
+
211
+ }
212
+
213
+ isSerialNumber(1, 2) // true
214
+
215
+ isSerialNumber(9, 0) // true
216
+
217
+ isSerialNumber(1, 3) // false
218
+
219
+ ```
220
+
221
+
222
+
223
+ では、早速データを加工していきましょう。
224
+
225
+ 今回は連番している状態を1、連番ではない状態を2とします。
226
+
227
+
228
+
229
+ ```JavaScript
230
+
231
+ var isSerialNumber = (a, b) => {
232
+
233
+ if (a === 9 && b === 0) return true;
234
+
235
+ if (b === a + 1) return true;
236
+
237
+ return false;
238
+
239
+ }
240
+
241
+ function checkNum(num){
242
+
243
+ var arr = num.toString().split('') // ["1", "2", "3", "4"]
244
+
245
+ var maxLength = arr
246
+
247
+ .map((it, i) => i === 0 ? null : [parseInt(arr[i - 1]), parseInt(it)]) // [null, [1, 2], [2, 3], [3, 4]]
248
+
249
+ .slice(1) // [[1, 2], [2, 3], [3, 4]]
250
+
251
+ .map(it => isSerialNumber(it[0], it[1])) // [true, true, true]
252
+
253
+ .map(it => it ? "1" : "0") // ["1", "1", "1"]
254
+
255
+ .join('') // "111"
256
+
257
+ .split('0') // [3]
258
+
259
+ .reduce((a, b) => Math.max(a, b), 0) // 3
260
+
261
+ return maxLength >= 2;
262
+
263
+ }
264
+
265
+ checkNum(1235) // true
266
+
267
+ checkNum(1245) // false
268
+
269
+ ```
270
+
271
+
272
+
273
+ そこそこ難解なので興味が出てきたらという感じで学習してみてください。
274
+
275
+
276
+
277
+ メソッドチェインを覚えるとこんな感じで値を転がしていけるようになるので慣れたら楽です。
278
+
279
+ 最初はとっつきにくいと思いますので、1行ずつ実行していってみてください。