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)));
 | |
| }
 | |
| ```
 |