Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 9412130

Browse files
Merge branch 'master' into project-euler-021
2 parents 959b0b6 + 3caad5c commit 9412130

24 files changed

+759
-248
lines changed

‎.github/workflows/Ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
- uses: actions/checkout@v3
1515
- uses: actions/setup-node@v3
1616
with:
17-
node-version: "16.x"
17+
node-version: 16
1818
cache: npm
1919

2020
- name: 📦 Install dependencies

‎.github/workflows/UpdateDirectory.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ jobs:
1010
updateDirectory:
1111
runs-on: ubuntu-latest
1212
steps:
13-
- uses: actions/checkout@v2
14-
- uses: actions/setup-node@v2
13+
- uses: actions/checkout@v3
14+
- uses: actions/setup-node@v3
1515
with:
16-
node-version: "14"
16+
node-version: 16
1717
cache: npm
1818

1919
- name: 📦 Install dependencies

‎Backtracking/NQueen.js renamed to ‎Backtracking/NQueens.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
class NQueen {
1+
class NQueens {
22
constructor (size) {
3+
if (size < 0) {
4+
throw RangeError('Invalid board size')
5+
}
36
this.board = new Array(size).fill('.').map(() => new Array(size).fill('.'))
47
this.size = size
58
this.solutionCount = 0
@@ -61,4 +64,4 @@ class NQueen {
6164
}
6265
}
6366

64-
export { NQueen }
67+
export { NQueens }

‎Backtracking/tests/NQueen.test.js

Lines changed: 0 additions & 15 deletions
This file was deleted.

‎Backtracking/tests/NQueens.test.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { NQueens } from '../NQueens'
2+
3+
describe('NQueens', () => {
4+
it('should return 2 solutions for 4x4 size board', () => {
5+
const _4Queens = new NQueens(4)
6+
_4Queens.solve()
7+
expect(_4Queens.solutionCount).toEqual(2)
8+
})
9+
10+
it('should return 92 solutions for 8x8 size board', () => {
11+
const _8Queens = new NQueens(8)
12+
_8Queens.solve()
13+
expect(_8Queens.solutionCount).toEqual(92)
14+
})
15+
16+
it('should throw RangeError for negative size board', () => {
17+
expect(() => { return new NQueens(-1) }).toThrow(RangeError)
18+
})
19+
})

‎DIRECTORY.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@
182182
* [Mandelbrot](Maths/Mandelbrot.js)
183183
* [MatrixExponentiationRecursive](Maths/MatrixExponentiationRecursive.js)
184184
* [MatrixMultiplication](Maths/MatrixMultiplication.js)
185+
* [MeanAbsoluteDeviation](Maths/MeanAbsoluteDeviation.js)
185186
* [MeanSquareError](Maths/MeanSquareError.js)
186187
* [MidpointIntegration](Maths/MidpointIntegration.js)
187188
* [MobiusFunction](Maths/MobiusFunction.js)
@@ -227,9 +228,11 @@
227228
* [Problem009](Project-Euler/Problem009.js)
228229
* [Problem010](Project-Euler/Problem010.js)
229230
* [Problem012](Project-Euler/Problem012.js)
231+
* [Problem013](Project-Euler/Problem013.js)
230232
* [Problem014](Project-Euler/Problem014.js)
231233
* [Problem015](Project-Euler/Problem015.js)
232234
* [Problem016](Project-Euler/Problem016.js)
235+
* [Problem017](Project-Euler/Problem017.js)
233236
* [Problem018](Project-Euler/Problem018.js)
234237
* [Problem020](Project-Euler/Problem020.js)
235238
* [Problem021](Project-Euler/Problem021.js)

‎Maths/CountNumbersDivisible.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/**
2+
* Count the numbers divisible by ‘M’ in a given range
3+
*
4+
* @see {@link https://www.tutorialspoint.com/count-the-numbers-divisible-by-m-in-a-given-range-in-cplusplus}
5+
*
6+
* We have 3 numbers A, B, M as inputs, A and B defines the numbers range [A, B]
7+
* Count the total number of divisibles in that range by number M
8+
*
9+
* @author Chetan07j
10+
*/
11+
12+
/**
13+
* Function to find total divisibles in given range
14+
*
15+
* @param {number} num1
16+
* @param {number} num2
17+
* @param {number} divider
18+
*
19+
* @returns {number} count of total number of divisibles
20+
*/
21+
const countNumbersDivisible = (num1, num2, divider) => {
22+
if (typeof num1 !== 'number' || typeof num2 !== 'number' || typeof divider !== 'number') {
23+
throw new Error('Invalid input, please pass only numbers')
24+
}
25+
26+
// Valid number range is num1 < num2, otherwise throw error
27+
if (num1 > num2) {
28+
throw new Error('Invalid number range, please provide numbers such that num1 < num2')
29+
}
30+
31+
// if divider is out of range then return 0
32+
// as in such case no divisible exists
33+
if (divider > num2) {
34+
return 0
35+
}
36+
37+
// Find the number of multiples of divider for num1 and num2
38+
// integer division part
39+
const num1Multiplier = num1 / divider
40+
const num2Multiplier = num2 / divider
41+
42+
// The count of numbers divisibles by divider between num1 and num2
43+
let divisibleCount = num2Multiplier - num1Multiplier
44+
45+
// If num1 is divisible by divider then, edge case for num1 is ignored
46+
// which results in 1 less count
47+
// to fix that we add +1 in this case
48+
if (num1 % divider === 0) {
49+
divisibleCount++
50+
}
51+
52+
// As it includes integer division meaning floating values
53+
// to get exact count Math.round() is added
54+
return Math.round(divisibleCount)
55+
}
56+
57+
export { countNumbersDivisible }

‎Maths/MeanAbsoluteDeviation.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { mean } from './AverageMean.js'
2+
/**
3+
*@function meanAbsoluteDeviation
4+
*@description Calculates the mean absolute deviation of list of numbers
5+
* @param {Integer} data
6+
* @returns meanAbsoluteDeviation([2,34,5,0,-2]) = 10.480
7+
* @url https://en.wikipedia.org/wiki/Average_absolute_deviation
8+
*/
9+
function meanAbsoluteDeviation (data) {
10+
if (!Array.isArray(data)) {
11+
throw new TypeError('Invalid Input')
12+
}
13+
let absoluteSum = 0
14+
const meanValue = mean(data)
15+
for (const dataPoint of data) {
16+
absoluteSum += Math.abs(dataPoint - meanValue)
17+
}
18+
return absoluteSum / data.length
19+
}
20+
21+
export {
22+
meanAbsoluteDeviation
23+
}

‎Maths/isPalindromeIntegerNumber.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* @function isPalindromeIntegerNumber
3+
* @param { Number } x
4+
* @returns {boolean} - input integer is palindrome or not
5+
*
6+
* time complexity : O(log_10(N))
7+
* space complexity : O(1)
8+
*/
9+
export function isPalindromeIntegerNumber (x) {
10+
if (typeof x !== 'number') {
11+
throw new TypeError('Input must be a integer number')
12+
}
13+
// check x is integer
14+
if (!Number.isInteger(x)) {
15+
return false
16+
}
17+
18+
// if it has '-' it cannot be palindrome
19+
if (x < 0) return false
20+
21+
// make x reverse
22+
let reversed = 0
23+
let num = x
24+
25+
while (num > 0) {
26+
const lastDigit = num % 10
27+
reversed = reversed * 10 + lastDigit
28+
num = Math.floor(num / 10)
29+
}
30+
31+
// compare origin x and reversed are same
32+
return x === reversed
33+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { countNumbersDivisible } from '../CountNumbersDivisible'
2+
3+
describe('Count the numbers divisible', () => {
4+
test.each([
5+
[1, 20, 6, 3],
6+
[6, 15, 3, 4],
7+
[25, 100, 30, 3],
8+
[25, 70, 10, 5],
9+
[1, 23, 30, 0]
10+
])('Total number(s) divisible between %i to %i by %i is/are %i', (n1, n2, m, expected) => {
11+
expect(countNumbersDivisible(n1, n2, m)).toBe(expected)
12+
})
13+
14+
test.each([
15+
['test', 23, 10, 'Invalid input, please pass only numbers'],
16+
[44, 30, 10, 'Invalid number range, please provide numbers such that num1 < num2']
17+
])('Should throw an error for input %i, %i, %i, %i', (n1, n2, m, expected) => {
18+
expect(() => countNumbersDivisible(n1, n2, m)).toThrowError(expected)
19+
})
20+
})

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /