From 884ac2c3eb901e7c8637c4af5407dbe0f2df5d25 Mon Sep 17 00:00:00 2001 From: "Hien D. Pham" Date: Sun, 19 Feb 2017 07:11:31 +0700 Subject: [PATCH 1/2] add demo testing environment --- .gitignore | 2 + .vscode/settings.json | 3 + package.json | 27 ++++++ yarn.lock | 213 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 245 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 package.json create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f3a32af --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Node +node_modules \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..44ba191 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "editor.tabSize": 2 + } \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..3c3c386 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "interview-questions-in-javascript", + "version": "0.0.1", + "description": "Interview Questions in JavaScript with testing", + "main": "index.js", + "scripts": { + "test": "node_modules/.bin/mocha 'demo/**/*.spec.js'" + }, + "repository": "git+https://github.com/kennymkchan/interview-questions-in-javascript.git", + "keywords": [ + "javascript", + "interview" + ], + "author": "Kenny Chan", + "license": "MIT", + "bugs": { + "url": "https://github.com/kennymkchan/interview-questions-in-javascript/issues" + }, + "homepage": "https://github.com/kennymkchan/interview-questions-in-javascript#readme", + "devDependencies": { + "chai": "^3.5.0", + "mocha": "^3.2.0" + }, + "engines" : { + "node" : ">= 6" + } +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..b3e122e --- /dev/null +++ b/yarn.lock @@ -0,0 +1,213 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +assertion-error@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +brace-expansion@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + +chai@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" + dependencies: + assertion-error "^1.0.1" + deep-eql "^0.1.3" + type-detect "^1.0.0" + +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +debug@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +deep-eql@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" + dependencies: + type-detect "0.1.1" + +diff@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" + +escape-string-regexp@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +glob@7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.create@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +minimatch@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +mkdirp@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mocha@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.2.0.tgz#7dc4f45e5088075171a68896814e6ae9eb7a85e3" + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.2.0" + diff "1.4.0" + escape-string-regexp "1.0.5" + glob "7.0.5" + growl "1.9.2" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +supports-color@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + +type-detect@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" + +type-detect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" From a6123dcbc504d604fa90e24a13024fca7aa22e4b Mon Sep 17 00:00:00 2001 From: "Hien D. Pham" Date: Sun, 19 Feb 2017 07:16:03 +0700 Subject: [PATCH 2/2] using modern js syntax and array compute product testing --- README.md | 28 +++++++++++++++------------- demo/array/array-product.js | 20 ++++++++++++++++++++ demo/array/array-product.spec.js | 12 ++++++++++++ 3 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 demo/array/array-product.js create mode 100644 demo/array/array-product.spec.js diff --git a/README.md b/README.md index 7ff967a..552d173 100644 --- a/README.md +++ b/README.md @@ -10,35 +10,37 @@ 1. [Javascript Specific](#javascript) 1. To Be Continued +## Want to Test Solutions ? +__[Demo and testing](demo)__ + - `npm install` or `yarn install` + - `npm test` + ## Array - **[1.1](#array--product) Given an array of integers, find the largest product yielded from three of the integers** + [Testing](demo/array/array-product.spec.js) ```javascript - var unsortedArray = [-10, 7, 29, 30, 5, -10, -70]; + const unsortedArray = [-10, 7, 29, 30, 5, -10, -70]; computeProduct(unsortedArray); // 21000 - function sortIntegers(a, b) { - return a - b; - } + const sortIntegers = (a, b) => a - b; // Greatest product is either (min1 * min2 * max1 || max1 * max2 * max3) - function computeProduct(unsorted) { - var sortedArray = unsorted.sort(sortIntegers), - product1 = 1, - product2 = 1, - array_n_element = sortedArray.length - 1; + const computeProduct = (unsorted) => { + const sortedArray = unsorted.sort(sortIntegers); + let product1 = 1; + let product2 = 1; + const array_n_element = sortedArray.length - 1; // Get the product of three largest integers in sorted array - for (var x = array_n_element; x > array_n_element - 3; x--) { + for (let x = array_n_element; x > array_n_element - 3; x--) { product1 = product1 * sortedArray[x]; } product2 = sortedArray[0] * sortedArray[1] * sortedArray[array_n_element]; - if (product1 > product2) return product1; - - return product2; + return product1 > product2 ? product1 : product2; } ``` **View on Codepen:** https://codepen.io/kennymkchan/pen/LxoMvm?editors=0012 diff --git a/demo/array/array-product.js b/demo/array/array-product.js new file mode 100644 index 0000000..4bc6171 --- /dev/null +++ b/demo/array/array-product.js @@ -0,0 +1,20 @@ +const sortIntegers = (a, b) => a - b; + +// Greatest product is either (min1 * min2 * max1 || max1 * max2 * max3) +const computeProduct = (unsorted) => { + const sortedArray = unsorted.sort(sortIntegers); + let product1 = 1; + let product2 = 1; + const array_n_element = sortedArray.length - 1; + + // Get the product of three largest integers in sorted array + for (let x = array_n_element; x > array_n_element - 3; x--) { + product1 = product1 * sortedArray[x]; + } + + product2 = sortedArray[0] * sortedArray[1] * sortedArray[array_n_element]; + + return product1 > product2 ? product1 : product2; +} + +module.exports = computeProduct; \ No newline at end of file diff --git a/demo/array/array-product.spec.js b/demo/array/array-product.spec.js new file mode 100644 index 0000000..ce40b7e --- /dev/null +++ b/demo/array/array-product.spec.js @@ -0,0 +1,12 @@ +const chai = require('chai'); +const computeProduct = require('./array-product'); +const expect = chai.expect; + +describe('computeProduct', () => { + + it('computeProduct should be 21000', () => { + const unsortedArray = [-10, 7, 29, 30, 5, -10, -70]; + expect(computeProduct(unsortedArray)).to.be.equal(21000); + }); + +}); \ No newline at end of file