From 12e06a76c310d067724a8a8d6f4706f6434b78ff Mon Sep 17 00:00:00 2001 From: RuSaG0 Date: Thu, 9 Dec 2021 18:10:42 +0300 Subject: [PATCH] findmin --- Maths/FindMin.js | 40 +++++++++++++++++++------- Maths/test/FindMin.test.js | 59 +++++++++++++++++++++++++++----------- 2 files changed, 72 insertions(+), 27 deletions(-) diff --git a/Maths/FindMin.js b/Maths/FindMin.js index 9eee78dc7e..93a178c767 100644 --- a/Maths/FindMin.js +++ b/Maths/FindMin.js @@ -1,23 +1,41 @@ /** * @function FindMin * @description Function to find the minimum number given in an array of integers. - * @param {Integer[]} nums - Array of Integers - * @return {Integer} - The minimum number of the array. */ -const findMin = (...nums) => { - if (nums.length === 0) { - throw new TypeError('Array is empty') - } +const findMin = (_iterable, _selector = undefined) => { + let min = undefined; + + const iterator = _iterable[Symbol.iterator](); + if (!_selector) { + let current = iterator.next(); + if(current.done) + return undefined; + min = current.value; - let min = nums[0] - for (let i = 1; i < nums.length; i++) { - if (nums[i] < min) { - min = nums[i] + current = iterator.next(); + while(!current.done) { + const x = current.value; + if(x < min) + min = x; + current = iterator.next(); } } + else { + let current = iterator.next(); + if(current.done) + return undefined; + min = _selector(current.value); - return min + current = iterator.next(); + while(!current.done) { + const x = _selector(current.value); + if(x < min) + min = x; + current = iterator.next(); + } + } + return min; } export { findMin } diff --git a/Maths/test/FindMin.test.js b/Maths/test/FindMin.test.js index 85381f80e8..63d87b6c01 100644 --- a/Maths/test/FindMin.test.js +++ b/Maths/test/FindMin.test.js @@ -1,18 +1,45 @@ import { findMin } from '../FindMin' -describe('FindMin', () => { - test('Should return the minimum number in the array', () => { - const min = findMin(2, 5, 1, 12, 43, 1, 9) - expect(min).toBe(1) - }) - - test('Should return the minimum number in the array', () => { - const min = findMin(21, 513, 6) - expect(min).toBe(6) - }) - - test('Should throw error', () => { - const min = () => findMin() - expect(min).toThrow('Array is empty') - }) -}) +describe('findMin', () => { + // ---------------------------------------------------------------------- + test('given empty array then min is undefined', () => { + expect(findMin([])).toBeUndefined(); + }); + // ---------------------------------------------------------------------- + test('given single value array then min is found', () => { + expect(findMin([1])).toBe(1); + expect(findMin([-1])).toBe(-1); + expect(findMin([0])).toBe(0); + }); + // ---------------------------------------------------------------------- + test('given array then min is found', () => { + expect(findMin([1,2])).toBe(1); + expect(findMin([-1,10])).toBe(-1); + expect(findMin([0,100])).toBe(0); + expect(findMin([100,0])).toBe(0); + expect(findMin([100,50,20,0,-100,0,2,30,45,99,104,23])).toBe(-100); + }); + // ---------------------------------------------------------------------- + test('given empty generator then min is undefined', () => { + const src = function*(){} + expect(findMin(src())).toBeUndefined(); + }); + // ---------------------------------------------------------------------- + test('given generator then min is found', () => { + const src = function*(){ + yield 1; + yield -1; + yield 0; + } + expect(findMin(src())).toBe(-1); + }); + // ---------------------------------------------------------------------- + test('given string generator then min string length is found', () => { + const src = function*(){ + yield "abc"; + yield "de"; + yield "qwerty"; + } + expect(findMin(src(),_x=>_x.length)).toBe(2); + }); +}); \ No newline at end of file