diff --git a/requirement-sets/1-reading-writing-files/answer.txt b/requirement-sets/1-reading-writing-files/answer.txt new file mode 100644 index 0000000..dc34aa9 --- /dev/null +++ b/requirement-sets/1-reading-writing-files/answer.txt @@ -0,0 +1 @@ +count: 3 \ No newline at end of file diff --git a/requirement-sets/1-reading-writing-files/src/index.js b/requirement-sets/1-reading-writing-files/src/index.js index ed849f4..5827354 100644 --- a/requirement-sets/1-reading-writing-files/src/index.js +++ b/requirement-sets/1-reading-writing-files/src/index.js @@ -1 +1,23 @@ -// run the program +const fs = require('fs'); + +const data = fs.readFileSync('../input.txt'); +const dataArray = data.toString().toUpperCase().trim().split('\r\n'); +console.log(dataArray); + +function checkPosition(data) { + let count = 0; + dataArray.forEach((el) => { + const counts = { W: 0, E: 0, N: 0, S: 0 }; + el.split('').forEach((letter) => (counts[letter] += 1)); + if (counts.W === counts.E && counts.S === counts.N) count += 1; + }); + const output = `count: ${count}`; + fs.writeFile('../answer.txt', output, (err) => { + if (err) { + console.error(err); + } + }); + return count; +} + +console.log(checkPosition(data)); diff --git a/requirement-sets/2-coding-tests/.eslintrc.js b/requirement-sets/2-coding-tests/.eslintrc.js index 022b148..e2aae0e 100644 --- a/requirement-sets/2-coding-tests/.eslintrc.js +++ b/requirement-sets/2-coding-tests/.eslintrc.js @@ -2,14 +2,12 @@ module.exports = { env: { commonjs: true, es2021: true, - node: true + node: true, + jasmine: true, }, - extends: [ - 'standard' - ], + extends: ['standard'], parserOptions: { - ecmaVersion: 'latest' + ecmaVersion: 'latest', }, - rules: { - } -} + rules: {}, +}; diff --git a/requirement-sets/2-coding-tests/package-lock.json b/requirement-sets/2-coding-tests/package-lock.json index c4e3e7a..32d6cb0 100644 --- a/requirement-sets/2-coding-tests/package-lock.json +++ b/requirement-sets/2-coding-tests/package-lock.json @@ -12,13 +12,23 @@ "jasmine": "^4.2.1" }, "devDependencies": { + "@boolean-uk/boolean-prettier-config": "^1.0.2", "eslint": "^8.18.0", + "eslint-config-prettier": "^8.5.0", "eslint-config-standard": "^17.0.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-n": "^15.2.3", - "eslint-plugin-promise": "^6.0.0" + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-promise": "^6.0.0", + "prettier": "^2.6.1" } }, + "node_modules/@boolean-uk/boolean-prettier-config": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@boolean-uk/boolean-prettier-config/-/boolean-prettier-config-1.0.2.tgz", + "integrity": "sha512-I2Bv0GNk5vFcLgY9XLAoILkZ4EgEOclYmpy2dL/kgNG2ZZ7iuvPtY9Oaw5xWM2rc9L4LPWiATKdrESHYebOQ9w==", + "dev": true + }, "node_modules/@eslint/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -445,6 +455,18 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-config-standard": { "version": "17.0.0", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz", @@ -634,6 +656,27 @@ "eslint": ">=7.0.0" } }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, "node_modules/eslint-plugin-promise": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz", @@ -757,6 +800,12 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -1544,6 +1593,33 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -1883,6 +1959,12 @@ } }, "dependencies": { + "@boolean-uk/boolean-prettier-config": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@boolean-uk/boolean-prettier-config/-/boolean-prettier-config-1.0.2.tgz", + "integrity": "sha512-I2Bv0GNk5vFcLgY9XLAoILkZ4EgEOclYmpy2dL/kgNG2ZZ7iuvPtY9Oaw5xWM2rc9L4LPWiATKdrESHYebOQ9w==", + "dev": true + }, "@eslint/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -2208,6 +2290,13 @@ "v8-compile-cache": "^2.0.3" } }, + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "requires": {} + }, "eslint-config-standard": { "version": "17.0.0", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz", @@ -2347,6 +2436,15 @@ "semver": "^7.3.7" } }, + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, "eslint-plugin-promise": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz", @@ -2434,6 +2532,12 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -3008,6 +3112,21 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", diff --git a/requirement-sets/2-coding-tests/spec/longest-sequence.spec.js b/requirement-sets/2-coding-tests/spec/longest-sequence.spec.js new file mode 100644 index 0000000..da99217 --- /dev/null +++ b/requirement-sets/2-coding-tests/spec/longest-sequence.spec.js @@ -0,0 +1,21 @@ +const longestSequence = require('../src/longest-sequence.js'); + +describe('Longest sequence', () => { + it('scenario 1', () => { + expect(longestSequence('dghhhmhmx')).toEqual({ h: 3 }); + }); + it('scenario 2', () => { + expect(longestSequence('dhkkhhKKKt')).toEqual({ k: 3 }); + }); + it('scenario 3', () => { + expect(longestSequence('aBbBadddadd')).toEqual({ b: 3 }); + }); + it('scenario 4', () => { + expect(longestSequence('gggttrfdesdcxzzzzzzzzzz')).toEqual({ z: 10 }); + }); + it('scenario 5', () => { + expect(longestSequence('jshetdrefdddesawwesdcxzwwwwwwwwww')).toEqual({ + w: 10, + }); + }); +}); diff --git a/requirement-sets/2-coding-tests/src/longest-sequence.js b/requirement-sets/2-coding-tests/src/longest-sequence.js new file mode 100644 index 0000000..a6b5a38 --- /dev/null +++ b/requirement-sets/2-coding-tests/src/longest-sequence.js @@ -0,0 +1,30 @@ +const longestSequence = (str) => { + let longestSequence = { a: 0 } + let currentSequence = {} + + for (let i = 0; i < str.length - 1; i++) { + const char = str[i].toLowerCase() + const nextChar = str[i + 1].toLowerCase() + + if (!currentSequence[char]) { + currentSequence = {} + currentSequence[char] = 1 + } + + if (char === nextChar) { + currentSequence[char] += 1 + } + if (Object.values(currentSequence)[0] > Object.values(longestSequence)[0]) { + longestSequence = { ...currentSequence } + } else if ( + Object.values(currentSequence)[0] === Object.values(longestSequence)[0] + ) { + if (Object.keys(currentSequence)[0] < Object.keys(longestSequence)[0]) { + longestSequence = { ...currentSequence } + } + } + } + return longestSequence +} + +module.exports = longestSequence diff --git a/requirement-sets/3-test-js-grad/src/01-count-major-versions-above-10/index.js b/requirement-sets/3-test-js-grad/src/01-count-major-versions-above-10/index.js index c6de991..30c6e1e 100644 --- a/requirement-sets/3-test-js-grad/src/01-count-major-versions-above-10/index.js +++ b/requirement-sets/3-test-js-grad/src/01-count-major-versions-above-10/index.js @@ -12,8 +12,19 @@ GET https://api.npms.io/v2/search/suggestions?q=react */ +const axios = require('axios'); + module.exports = async function countMajorVersionsAbove10() { - // TODO + try { + const { data } = await axios.get( + 'https://api.npms.io/v2/search/suggestions?q=react' + ); + const answer = data + .map((el) => el.package.version.split('.')[0]) + .filter((el) => Number(el) >= 10).length; - return number + return answer; + } catch (err) { + console.log(err); + } }; diff --git a/requirement-sets/3-test-js-grad/src/02-oldest-package-name/index.js b/requirement-sets/3-test-js-grad/src/02-oldest-package-name/index.js index 93d773f..2205915 100644 --- a/requirement-sets/3-test-js-grad/src/02-oldest-package-name/index.js +++ b/requirement-sets/3-test-js-grad/src/02-oldest-package-name/index.js @@ -10,9 +10,22 @@ GET https://api.npms.io/v2/search/suggestions?q=react * the "name" of the package that has the oldest "date" value */ +const axios = require('axios'); module.exports = async function oldestPackageName() { - // TODO + try { + const { data } = await axios.get( + 'https://api.npms.io/v2/search/suggestions?q=react' + ); - return name + const name = data + .map((el) => [el.package.date, el.package.name]) + .reduce((previous, current) => { + return previous[0] < current[0] ? previous : current; + })[1]; + + return name; + } catch (err) { + console.log(err); + } }; diff --git a/requirement-sets/3-test-js-grad/src/03-organise-maintainers/index.js b/requirement-sets/3-test-js-grad/src/03-organise-maintainers/index.js index ed17e1d..b4fbbaa 100644 --- a/requirement-sets/3-test-js-grad/src/03-organise-maintainers/index.js +++ b/requirement-sets/3-test-js-grad/src/03-organise-maintainers/index.js @@ -2,6 +2,10 @@ * Make the following HTTP request with either axios or node-fetch: +/* + +* Make the following HTTP request with either axios or node-fetch: + GET https://api.npms.io/v2/search/suggestions?q=react ****** @@ -23,8 +27,32 @@ GET https://api.npms.io/v2/search/suggestions?q=react */ -module.exports = async function organiseMaintainers() { - // TODO +const axios = require('axios'); - return maintainers +module.exports = async function organiseMaintainers() { + let maintainers = []; + + const { data } = await axios.get( + 'https://api.npms.io/v2/search/suggestions?q=react' + ); + + data.forEach((dep) => { + dep.package.maintainers.forEach((maintainer) => { + const record = maintainers.find((obj) => { + return obj.username === maintainer.username; + }); + if (!record) { + const newRecord = { + username: maintainer.username, + packageNames: [dep.package.name], + }; + maintainers.push(newRecord); + } else { + record.packageNames.push(dep.package.name); + } + }); + }); + + // console.log('DATA : ', JSON.stringify(data[0], null, 2)); + return maintainers; };