122 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			122 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | ||
|  | id: 5a23c84252665b21eecc8046 | ||
|  | title: Symmetric difference | ||
|  | challengeType: 5 | ||
|  | forumTopicId: 16086 | ||
|  | dashedName: symmetric-difference | ||
|  | --- | ||
|  | 
 | ||
|  | # --description--
 | ||
|  | 
 | ||
|  | Given two [set](https://rosettacode.org/wiki/set)s *A* and *B*, compute $(A \\setminus B) \\cup (B \\setminus A).$ That is, enumerate the items that are in *A* or *B* but not both. This set is called the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric difference) of *A* and *B*. In other words: $(A \\cup B) \\setminus (A \\cap B)$ (the set of items that are in at least one of *A* or *B* minus the set of items that are in both *A* and *B*). | ||
|  | 
 | ||
|  | # --instructions--
 | ||
|  | 
 | ||
|  | Write a function that takes two arrays as parameters and returns the symmetric difference. Sort the resultant array before returning it. | ||
|  | 
 | ||
|  | # --hints--
 | ||
|  | 
 | ||
|  | `symmetricDifference` should be a function. | ||
|  | 
 | ||
|  | ```js | ||
|  | assert(typeof symmetricDifference == 'function'); | ||
|  | ``` | ||
|  | 
 | ||
|  | `symmetricDifference(["John", "Bob", "Mary", "Serena"], ["Jim", "Mary", "John", "Bob"])` should return an array. | ||
|  | 
 | ||
|  | ```js | ||
|  | assert( | ||
|  |   Array.isArray( | ||
|  |     symmetricDifference( | ||
|  |       ['John', 'Bob', 'Mary', 'Serena'], | ||
|  |       ['Jim', 'Mary', 'John', 'Bob'] | ||
|  |     ) | ||
|  |   ) | ||
|  | ); | ||
|  | ``` | ||
|  | 
 | ||
|  | `symmetricDifference(["John", "Bob", "Mary", "Serena"], ["Jim", "Mary", "John", "Bob"])` should return `["Jim", "Serena"]`. | ||
|  | 
 | ||
|  | ```js | ||
|  | assert.deepEqual( | ||
|  |   symmetricDifference( | ||
|  |     ['John', 'Bob', 'Mary', 'Serena'], | ||
|  |     ['Jim', 'Mary', 'John', 'Bob'] | ||
|  |   ), | ||
|  |   ['Jim', 'Serena'] | ||
|  | ); | ||
|  | ``` | ||
|  | 
 | ||
|  | `symmetricDifference([1, 2, 3], [3, 4])` should return `[1, 2, 4]`. | ||
|  | 
 | ||
|  | ```js | ||
|  | assert.deepEqual(symmetricDifference([1, 2, 3], [3, 4]), [1, 2, 4]); | ||
|  | ``` | ||
|  | 
 | ||
|  | `symmetricDifference([1, 2, 3, 4, 5], [3, 4, 8, 7])` should return `[1, 2, 5, 7, 8]`. | ||
|  | 
 | ||
|  | ```js | ||
|  | assert.deepEqual(symmetricDifference([1, 2, 3, 4, 5], [3, 4, 8, 7]), [ | ||
|  |   1, | ||
|  |   2, | ||
|  |   5, | ||
|  |   7, | ||
|  |   8 | ||
|  | ]); | ||
|  | ``` | ||
|  | 
 | ||
|  | `symmetricDifference([1, 2, 3, 4, 5, 6, 7, 8], [1, 3, 5, 6, 7, 8, 9])` should return `[2, 4, 9]`. | ||
|  | 
 | ||
|  | ```js | ||
|  | assert.deepEqual( | ||
|  |   symmetricDifference([1, 2, 3, 4, 5, 6, 7, 8], [1, 3, 5, 6, 7, 8, 9]), | ||
|  |   [2, 4, 9] | ||
|  | ); | ||
|  | ``` | ||
|  | 
 | ||
|  | `symmetricDifference([1, 2, 4, 7, 9], [2, 3, 7, 8, 9])` should return `[1, 3, 4, 8]`. | ||
|  | 
 | ||
|  | ```js | ||
|  | assert.deepEqual(symmetricDifference([1, 2, 4, 7, 9], [2, 3, 7, 8, 9]), [ | ||
|  |   1, | ||
|  |   3, | ||
|  |   4, | ||
|  |   8 | ||
|  | ]); | ||
|  | ``` | ||
|  | 
 | ||
|  | # --seed--
 | ||
|  | 
 | ||
|  | ## --seed-contents--
 | ||
|  | 
 | ||
|  | ```js | ||
|  | function symmetricDifference(A, B) { | ||
|  | 
 | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | # --solutions--
 | ||
|  | 
 | ||
|  | ```js | ||
|  | function symmetricDifference(A, B) { | ||
|  |   function relative_complement(A, B) { | ||
|  |     return A.filter(function(elem) { | ||
|  |       return B.indexOf(elem) == -1; | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   function unique(ary) { | ||
|  |     var u = ary.concat().sort(); | ||
|  |     for (var i = 1; i < u.length; ) { | ||
|  |       if (u[i - 1] === u[i]) u.splice(i, 1); | ||
|  |       else i++; | ||
|  |     } | ||
|  |     return u; | ||
|  |   } | ||
|  | 
 | ||
|  |   return unique( | ||
|  |     relative_complement(A, B).concat(relative_complement(B, A)) | ||
|  |   ).sort(); | ||
|  | } | ||
|  | ``` |