118 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			118 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								id: 5a23c84252665b21eecc7e7b
							 | 
						||
| 
								 | 
							
								title: Generator/Exponential
							 | 
						||
| 
								 | 
							
								challengeType: 5
							 | 
						||
| 
								 | 
							
								forumTopicId: 302275
							 | 
						||
| 
								 | 
							
								dashedName: generatorexponential
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --description--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A generator is an executable entity (like a function or procedure) that contains code that yields a sequence of values, one at a time, so that each time you call the generator, the next value in the sequence is provided.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Generators are often built on top of coroutines or objects so that the internal state of the object is handled "naturally".
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Generators are often used in situations where a sequence is potentially infinite, and where it is possible to construct the next value of the sequence with only minimal state.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --instructions--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Write a function that uses generators to generate squares and cubes. Create a new generator that filters all cubes from the generator of squares.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The function should return the \\( n^{th} \\) value of the filtered generator.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								For example for \\(n=7\\), the function should return 81 as the sequence would be 4, 9, 16, 25, 36, 49, 81. Here 64 is filtered out, as it is a cube.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --hints--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`exponentialGenerator` should be a function.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert(typeof exponentialGenerator == 'function');
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`exponentialGenerator()` should return a number.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert(typeof exponentialGenerator(10) == 'number');
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`exponentialGenerator(10)` should return `144`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert.equal(exponentialGenerator(10), 144);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`exponentialGenerator(12)` should return `196`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert.equal(exponentialGenerator(12), 196);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`exponentialGenerator(14)` should return `256`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert.equal(exponentialGenerator(14), 256);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`exponentialGenerator(20)` should return `484`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert.equal(exponentialGenerator(20), 484);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`exponentialGenerator(25)` should return `784`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								assert.equal(exponentialGenerator(25), 784);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --seed--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## --seed-contents--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								function exponentialGenerator(n) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# --solutions--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								function exponentialGenerator(n){
							 | 
						||
| 
								 | 
							
								  function* PowersGenerator(m) {
							 | 
						||
| 
								 | 
							
								    var n=0;
							 | 
						||
| 
								 | 
							
								    while(1) {
							 | 
						||
| 
								 | 
							
								        yield Math.pow(n, m);
							 | 
						||
| 
								 | 
							
								        n += 1;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function* FilteredGenerator(g, f){
							 | 
						||
| 
								 | 
							
								    var value = g.next().value;
							 | 
						||
| 
								 | 
							
								    var filter = f.next().value;
							 | 
						||
| 
								 | 
							
								    while(1) {
							 | 
						||
| 
								 | 
							
								        if( value < filter ) {
							 | 
						||
| 
								 | 
							
								            yield value;
							 | 
						||
| 
								 | 
							
								            value = g.next().value;
							 | 
						||
| 
								 | 
							
								        } else if ( value > filter ) {
							 | 
						||
| 
								 | 
							
								            filter = f.next().value;
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            value = g.next().value;
							 | 
						||
| 
								 | 
							
								            filter = f.next().value;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var squares = PowersGenerator(2);
							 | 
						||
| 
								 | 
							
								  var cubes = PowersGenerator(3);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var filtered = FilteredGenerator(squares, cubes);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var curr=0;
							 | 
						||
| 
								 | 
							
								  for(var i=0;i<n;i++) curr=filtered.next();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return curr.value;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 |