* feat(tools): add seed/solution restore script * chore(curriculum): remove empty sections' markers * chore(curriculum): add seed + solution to Chinese * chore: remove old formatter * fix: update getChallenges parse translated challenges separately, without reference to the source * chore(curriculum): add dashedName to English * chore(curriculum): add dashedName to Chinese * refactor: remove unused challenge property 'name' * fix: relax dashedName requirement * fix: stray tag Remove stray `pre` tag from challenge file. Signed-off-by: nhcarrigan <nhcarrigan@gmail.com> Co-authored-by: nhcarrigan <nhcarrigan@gmail.com>
146 lines
2.7 KiB
Markdown
146 lines
2.7 KiB
Markdown
---
|
|
id: 5a23c84252665b21eecc801d
|
|
title: Split a character string based on change of character
|
|
challengeType: 5
|
|
forumTopicId: 302322
|
|
dashedName: split-a-character-string-based-on-change-of-character
|
|
---
|
|
|
|
# --description--
|
|
|
|
Split a (character) string into comma (plus a blank) delimited strings based on a change of character (left to right). Blanks should be treated as any other character (except they are problematic to display clearly). The same applies to commas. For instance, the string:
|
|
|
|
<pre>
|
|
"gHHH5YY++///\"
|
|
</pre>
|
|
|
|
should be split as:
|
|
|
|
<pre>
|
|
["g", "HHH", "5", "YY", "++", "///", "\" ];
|
|
</pre>
|
|
|
|
# --hints--
|
|
|
|
`split` should be a function.
|
|
|
|
```js
|
|
assert(typeof split == 'function');
|
|
```
|
|
|
|
`split("hello")` should return an array.
|
|
|
|
```js
|
|
assert(Array.isArray(split('hello')));
|
|
```
|
|
|
|
`split("hello")` should return `["h", "e", "ll", "o"]`.
|
|
|
|
```js
|
|
assert.deepEqual(split('hello'), ['h', 'e', 'll', 'o']);
|
|
```
|
|
|
|
`split("commission")` should return `["c", "o", "mm", "i", "ss", "i", "o", "n"]`.
|
|
|
|
```js
|
|
assert.deepEqual(split('commission'), [
|
|
'c',
|
|
'o',
|
|
'mm',
|
|
'i',
|
|
'ss',
|
|
'i',
|
|
'o',
|
|
'n'
|
|
]);
|
|
```
|
|
|
|
`split("ssss----====llloooo")` should return `["ssss", "----", "====", "lll", "oooo"]`.
|
|
|
|
```js
|
|
assert.deepEqual(split('ssss----====llloooo'), [
|
|
'ssss',
|
|
'----',
|
|
'====',
|
|
'lll',
|
|
'oooo'
|
|
]);
|
|
```
|
|
|
|
`split("sssmmmaaammmaaat")` should return `["sss", "mmm", "aaa", "mmm", "aaa", "t"]`.
|
|
|
|
```js
|
|
assert.deepEqual(split('sssmmmaaammmaaat'), [
|
|
'sss',
|
|
'mmm',
|
|
'aaa',
|
|
'mmm',
|
|
'aaa',
|
|
't'
|
|
]);
|
|
```
|
|
|
|
`split("gHHH5YY++///\")` should return `["g", "HHH", "5", "YY", "++", "///", "\\"]`.
|
|
|
|
```js
|
|
assert.deepEqual(split('gHHH5YY++///\\'), [
|
|
'g',
|
|
'HHH',
|
|
'5',
|
|
'YY',
|
|
'++',
|
|
'///',
|
|
'\\'
|
|
]);
|
|
```
|
|
|
|
# --seed--
|
|
|
|
## --seed-contents--
|
|
|
|
```js
|
|
function split(str) {
|
|
|
|
}
|
|
```
|
|
|
|
# --solutions--
|
|
|
|
```js
|
|
function split(str) {
|
|
const concat = xs =>
|
|
xs.length > 0
|
|
? (() => {
|
|
const unit = typeof xs[0] === 'string' ? '' : [];
|
|
return unit.concat.apply(unit, xs);
|
|
})()
|
|
: [];
|
|
|
|
const group = xs => groupBy((a, b) => a === b, xs);
|
|
|
|
const groupBy = (f, xs) => {
|
|
const dct = xs.slice(1).reduce(
|
|
(a, x) => {
|
|
const h = a.active.length > 0 ? a.active[0] : undefined,
|
|
blnGroup = h !== undefined && f(h, x);
|
|
return {
|
|
active: blnGroup ? a.active.concat([x]) : [x],
|
|
sofar: blnGroup ? a.sofar : a.sofar.concat([a.active])
|
|
};
|
|
},
|
|
{
|
|
active: xs.length > 0 ? [xs[0]] : [],
|
|
sofar: []
|
|
}
|
|
);
|
|
return dct.sofar.concat(dct.active.length > 0 ? [dct.active] : []);
|
|
};
|
|
|
|
const map = (f, xs) => xs.map(f);
|
|
|
|
const stringChars = s => s.split('');
|
|
|
|
return map(concat, group(stringChars(str)));
|
|
}
|
|
```
|