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