diff --git a/05_hash_tables/ES6/02_check_voter.js b/05_hash_tables/ES6/02_check_voter.js index d2aeeb1..1bf5d70 100644 --- a/05_hash_tables/ES6/02_check_voter.js +++ b/05_hash_tables/ES6/02_check_voter.js @@ -1,14 +1,18 @@ const voted = {}; -const checkVoter = (name) => { + +/** + * Vote check + * @param {string} name Voter name + */ +const checkVoter = name => { if (voted[name]) { - console.log('kick them out!'); + console.log("kick them out!"); } else { voted[name] = true; - console.log('let them vote!'); + console.log("let them vote!"); } }; - -checkVoter('tom'); // let them vote! -checkVoter('mike'); // let them vote! -checkVoter('mike'); // kick them out! +checkVoter("tom"); // let them vote! +checkVoter("mike"); // let them vote! +checkVoter("mike"); // kick them out! diff --git a/05_hash_tables/javascript/02_check_voter.js b/05_hash_tables/javascript/02_check_voter.js index 288eba6..4f1c2c5 100644 --- a/05_hash_tables/javascript/02_check_voter.js +++ b/05_hash_tables/javascript/02_check_voter.js @@ -1,16 +1,20 @@ -'use strict'; +"use strict"; const voted = {}; + +/** + * Vote check + * @param {string} name Voter name + */ function check_voter(name) { if (voted[name]) { - console.log('kick them out!'); + console.log("kick them out!"); } else { voted[name] = true; - console.log('let them vote!'); + console.log("let them vote!"); } } - check_voter("tom"); // let them vote! check_voter("mike"); // let them vote! check_voter("mike"); // kick them out! diff --git a/05_hash_tables/javascript/03_hashtable.js b/05_hash_tables/javascript/03_hashtable.js index 7c02d9d..ceaeebe 100644 --- a/05_hash_tables/javascript/03_hashtable.js +++ b/05_hash_tables/javascript/03_hashtable.js @@ -1,173 +1,162 @@ /** * Class HashTable - * - * @param {object} obj + * @param {Object} obj */ -let HashTable = function( obj ) { - let length = 0; - this._items = ( function( obj ) { - let items = {}; - for ( let p in obj ) { - items[p] = obj[p]; - length++; - } - return items; - }( obj ) ); +const HashTable = function(obj) { + let length = 0; + this._items = (function(obj) { + let items = {}; + for (let p in obj) { + items[p] = obj[p]; + length++; + } + return items; + })(obj); - /** - * Associates the specified value to the specified key - * - * @param {string} key The key to which associate the value - * @param {string} value The value to associate to the key - * - * @return {(undefined|object)} Undefined is object didn't exists before this call - */ - this.set = function( key, value ) { - let previous = undefined; + /** + * Associates the specified value to the specified key + * @param {string} key The key to which associate the value + * @param {string} value The value to associate to the key + * @returns {(undefined|Object)} Undefined is object didn't exists before this call + */ + this.set = function(key, value) { + let previous = undefined; - if ( this.has( key ) ) { - previous = this._items[key]; - } else { - length++; - } + if (this.has(key)) { + previous = this._items[key]; + } else { + length++; + } - this._items[key] = value; + this._items[key] = value; - return previous; - }; + return previous; + }; - /** - * Returns the value associated to the specified key - * - * @param {string} key The key from which retrieve the value - * - * @return {(undefined|string)} Undefined or associated value - */ - this.get = function( key ) { - return this._items.hasOwnProperty( key ) ? this._items[key] : undefined; - }; + /** + * Returns the value associated to the specified key + * @param {string} key The key from which retrieve the value + * @returns {(undefined|string)} Undefined or associated value + */ + this.get = function(key) { + return this._items.hasOwnProperty(key) ? this._items[key] : undefined; + }; - /** - * Returns whether the hashtable contains the specified key - * - * @param {string} key The key to check - * - * @return {boolean} - */ - this.has = function( key ) { - return this._items.hasOwnProperty( key ); - }; + /** + * Returns whether the hashtable contains the specified key + * @param {string} key The key to check + * @returns {boolean} + */ + this.has = function(key) { + return this._items.hasOwnProperty(key); + }; - /** - * Removes the specified key with its value - * - * @param {string} key The key to remove - * - * @return {(undefined|string)} Undefined if key doesn't exist and - * string (previous value) - value of deleted item - */ - this.remove = function( key ) { - if ( this.has( key ) ) { - let previous = this._items[key]; - length--; - delete this._items[key]; - return previous; - } else { - return undefined; - } - }; + /** + * Removes the specified key with its value + * @param {string} key The key to remove + * @returns {(undefined|string)} Undefined if key doesn't exist and + * string (previous value) - value of deleted item + */ + this.remove = function(key) { + if (this.has(key)) { + let previous = this._items[key]; + length--; + delete this._items[key]; + return previous; + } else { + return undefined; + } + }; - /** - * Returns an array with all the registered keys - * - * @return {array} - */ - this.getKeys = function() { - let keys = []; + /** + * Returns an array with all the registered keys + * @returns {Array} + */ + this.getKeys = function() { + let keys = []; - for ( let i in this._items ) { - if ( this.has( i ) ) { - keys.push( i ); - } - } + for (let i in this._items) { + if (this.has(i)) { + keys.push(i); + } + } - return keys; - }; + return keys; + }; - /** - * Returns an array with all the registered values - * - * @return {array} - */ - this.getValues = function() { - let values = []; + /** + * Returns an array with all the registered values + * @returns {Array} + */ + this.getValues = function() { + let values = []; - for ( let i in this._items ) { - if ( this.has( i ) ) { - values.push( this._items[i] ); - } - } + for (let i in this._items) { + if (this.has(i)) { + values.push(this._items[i]); + } + } - return values; - }; + return values; + }; - /** - * Iterates all entries in the specified iterator callback - * @param {function} callback A method with 2 parameters: key, value - */ - this.each = function( callback ) { - for ( let i in this._items ) { - if ( this.has( i ) ) { - callback( i, this._items[i] ); - } - } - }; + /** + * Iterates all entries in the specified iterator callback + * @param {function} callback A method with 2 parameters: key, value + */ + this.each = function(callback) { + for (let i in this._items) { + if (this.has(i)) { + callback(i, this._items[i]); + } + } + }; - /** - * Deletes all the key-value pairs on the hashmap - */ - this.clear = function() { - this._items = {}; - length = 0; - }; + /** + * Deletes all the key-value pairs on the hashmap + */ + this.clear = function() { + this._items = {}; + length = 0; + }; - /** - * Gets the count of the entries in the hashtable - */ - Object.defineProperty( this, 'length', { - get: function() { - return length; - }, - }); + /** + * Gets the count of the entries in the hashtable + */ + Object.defineProperty(this, "length", { + get: function() { + return length; + } + }); - /** - * Gets an array of all keys in the hashtable - */ - Object.defineProperty(this, 'keys', { - get: function() { - return this.getKeys(); - }, - }); + /** + * Gets an array of all keys in the hashtable + */ + Object.defineProperty(this, "keys", { + get: function() { + return this.getKeys(); + } + }); - /** - * Gets an array of all values in the hashtable - */ - Object.defineProperty(this, 'values', { - get: function() { - return this.getValues(); - }, - }); + /** + * Gets an array of all values in the hashtable + */ + Object.defineProperty(this, "values", { + get: function() { + return this.getValues(); + } + }); }; -let hashtable = new HashTable({'one': 1, 'two': 2, 'three': 3, 'cuatro': 4}); +const hashtable = new HashTable({ one: 1, two: 2, three: 3, cuatro: 4 }); -console.log( 'Original length: ' + hashtable.length ); // Original length: 4 -console.log( 'Value of key "one": ' + hashtable.get( 'one' ) ); // Value of key "one": 1 -console.log( 'Has key "foo"? ' + hashtable.has( 'foo' )); // Has key "foo"? false -console.log( 'Previous value of key "foo": ' + hashtable.set( 'foo', 'bar' ) ); // Previous value of key "foo": undefined -console.log( 'Length after set: ' + hashtable.length ); // Length after set: 5 -console.log( 'Value of key "foo": ' + hashtable.get( 'foo' ) ); // Value of key "foo": bar -console.log( 'Value of key "cuatro": ' + hashtable.get( 'cuatro' )); // Value of key "cuatro": 4 -console.log( 'Get keys by using property: ' + hashtable.keys ); // Get keys by using property: one,two,three,cuatro,foo +console.log("Original length: " + hashtable.length); // Original length: 4 +console.log('Value of key "one": ' + hashtable.get("one")); // Value of key "one": 1 +console.log('Has key "foo"? ' + hashtable.has("foo")); // Has key "foo"? false +console.log('Previous value of key "foo": ' + hashtable.set("foo", "bar")); // Previous value of key "foo": undefined +console.log("Length after set: " + hashtable.length); // Length after set: 5 +console.log('Value of key "foo": ' + hashtable.get("foo")); // Value of key "foo": bar +console.log('Value of key "cuatro": ' + hashtable.get("cuatro")); // Value of key "cuatro": 4 +console.log("Get keys by using property: " + hashtable.keys); // Get keys by using property: one,two,three,cuatro,foo hashtable.clear(); -console.log( 'Length after clear: ' + hashtable.length ); // Length after clear: 0 +console.log("Length after clear: " + hashtable.length); // Length after clear: 0 diff --git a/06_breadth-first_search/ES6/01_breadth-first_search.js b/06_breadth-first_search/ES6/01_breadth-first_search.js index f140373..1767cbe 100644 --- a/06_breadth-first_search/ES6/01_breadth-first_search.js +++ b/06_breadth-first_search/ES6/01_breadth-first_search.js @@ -1,18 +1,27 @@ -const personIsSeller = name => name[name.length - 1] === 'm'; - const graph = {}; -graph.you = ['alice', 'bob', 'claire']; -graph.bob = ['anuj', 'peggy']; -graph.alice = ['peggy']; -graph.claire = ['thom', 'jonny']; +graph.you = ["alice", "bob", "claire"]; +graph.bob = ["anuj", "peggy"]; +graph.alice = ["peggy"]; +graph.claire = ["thom", "jonny"]; graph.anuj = []; graph.peggy = []; graph.thom = []; graph.jonny = []; -const search = (name) => { - let searchQueue = []; - searchQueue = searchQueue.concat(graph[name]); +/** + * Determine whether a person is a seller + * @param {string} name Friend's name + * @returns {boolean} Result of checking + */ +const personIsSeller = name => name[name.length - 1] === "m"; + +/** + * Find a mango seller + * @param {string} name Friend's name + * @returns {boolean} Search results + */ +const search = name => { + let searchQueue = [...graph[name]]; // This array is how you keep track of which people you've searched before. const searched = []; while (searchQueue.length) { @@ -31,4 +40,4 @@ const search = (name) => { return false; }; -search('you'); // thom is a mango seller! +search("you"); // thom is a mango seller! diff --git a/06_breadth-first_search/ES6/02_breadth-first_search_by_Rytikov_Dmitrii.js b/06_breadth-first_search/ES6/02_breadth-first_search_by_Rytikov_Dmitrii.js index 5f3836c..75f5405 100644 --- a/06_breadth-first_search/ES6/02_breadth-first_search_by_Rytikov_Dmitrii.js +++ b/06_breadth-first_search/ES6/02_breadth-first_search_by_Rytikov_Dmitrii.js @@ -1,23 +1,35 @@ const graph = {}; -graph.you = ['alice', 'bob', 'claire']; -graph.bob = ['anuj', 'peggy']; -graph.alice = ['peggy']; -graph.claire = ['thom', 'jonny']; +graph.you = ["alice", "bob", "claire"]; +graph.bob = ["anuj", "peggy"]; +graph.alice = ["peggy"]; +graph.claire = ["thom", "jonny"]; graph.anuj = []; graph.peggy = []; graph.thom = []; -const isSeller = name => name[name.length - 1] === 'm'; +/** + * Determine whether a person is a seller + * @param {string} name Friend's name + * @returns {boolean} Result of checking + */ +const isSeller = name => name[name.length - 1] === "m"; -const search = (name, graph) => { - const iter = (waited, visited) => { - if (waited.length === 0) { - return false; - } +/** + * Find a mango seller + * @param {string} name Friend's name + * @param {Object} graph Hash table + * @returns {boolean} Search results + */ +const search = (name, graph = {}) => { + /** + * Recursive function to test people + * @param {Array} waited List of people you need to check + * @param {Set} visited List of checked people + */ + const iter = (waited = [], visited) => { + if (waited.length === 0) return false; const [current, ...rest] = waited; - if (visited.has(current)) { - return iter(rest, visited); - } + if (visited.has(current)) return iter(rest, visited); if (isSeller(current)) { console.log(`${current} is a mango seller!`); return true; @@ -29,4 +41,4 @@ const search = (name, graph) => { return iter(graph[name], new Set()); }; -search('you'); +search("you", graph); diff --git a/06_breadth-first_search/javascript/01_breadth-first_search.js b/06_breadth-first_search/javascript/01_breadth-first_search.js index c3f478f..a470065 100644 --- a/06_breadth-first_search/javascript/01_breadth-first_search.js +++ b/06_breadth-first_search/javascript/01_breadth-first_search.js @@ -1,7 +1,3 @@ -function person_is_seller(name) { - return name[name.length - 1] === "m"; -} - const graph = {}; graph["you"] = ["alice", "bob", "claire"]; graph["bob"] = ["anuj", "peggy"]; @@ -12,6 +8,20 @@ graph["peggy"] = []; graph["thom"] = []; graph["jonny"] = []; +/** + * Determine whether a person is a seller + * @param {string} name Friend's name + * @returns {boolean} Result of checking + */ +function personIsSeller(name) { + return name[name.length - 1] === "m"; +} + +/** + * Find a mango seller + * @param {string} name Friend's name + * @returns {boolean} Search results + */ function search(name) { let search_queue = []; search_queue = search_queue.concat(graph[name]); @@ -21,7 +31,7 @@ function search(name) { let person = search_queue.shift(); // Only search this person if you haven't already searched them if (searched.indexOf(person) === -1) { - if (person_is_seller(person)) { + if (personIsSeller(person)) { console.log(person + " is a mango seller!"); return true; } diff --git a/06_breadth-first_search/javascript/02_breadth-first_search_recursion.js b/06_breadth-first_search/javascript/02_breadth-first_search_recursion.js new file mode 100644 index 0000000..c08be6c --- /dev/null +++ b/06_breadth-first_search/javascript/02_breadth-first_search_recursion.js @@ -0,0 +1,48 @@ +const graph = {}; +graph["you"] = ["alice", "bob", "claire"]; +graph["bob"] = ["anuj", "peggy"]; +graph["alice"] = ["peggy"]; +graph["claire"] = ["thom", "jonny"]; +graph["anuj"] = []; +graph["peggy"] = []; +graph["thom"] = []; +graph["jonny"] = []; + +/** + * Determine whether a person is a seller + * @param {string} name Friend's name + * @returns {boolean} Result of checking + */ +function personIsSeller(name) { + return name[name.length - 1] === "m"; +} + +/** + * Find a mango seller + * @param {string} name Friend's name + * @param {Object} graph Hash table + * @returns {boolean} Search results + */ +function search(name, graph) { + graph = graph || {}; + /** + * Recursive function to check people + * @param {Array} waited List of people you need to check + * @param {Array} visited List of checked people + */ + function inner(waited, visited) { + waited = waited || []; + if (waited.length === 0) return false; + const person = waited[0]; + const waitedCloned = waited.slice(1); + if (visited.indexOf(person) !== -1) return inner(waitedCloned, visited); + if (personIsSeller(person)) { + console.log(person + " is a mango seller!"); + return true; + } + return inner(waitedCloned.concat(graph[person]), visited.concat(person)); + } + return inner(graph[name], []); +} + +search("you", graph);