diff --git a/Recursive/Josephus.js b/Recursive/Josephus.js new file mode 100644 index 0000000000..ca26371e82 --- /dev/null +++ b/Recursive/Josephus.js @@ -0,0 +1,25 @@ +/** + * @function Josephus + * @description recursive implementation of the Josephus function. + * @param {Integer[]} collection - The integer array. + * @param {Integer} - The step size. + * @return {Integer} - The last integer in the list. + * @see [JosephusProblem](https://en.wikipedia.org/wiki/Josephus_problem) + * @example [1,2,3,4,5,6,7] with step 3 = 4 + */ + +const josephus = (collection, step) => { + // return null for invalid steps that are less than or equal to 0 + if (step <= 0 || collection.length === 0) { + return null + } + if (collection.length === 1) { + return collection[0] + } else { + step = (step - 1) % collection.length + collection.splice(step, 1) + return josephus(collection, step + collection.length) + } +} + +export { josephus } diff --git a/Recursive/test/Josephus.test.js b/Recursive/test/Josephus.test.js new file mode 100644 index 0000000000..b0950e7e16 --- /dev/null +++ b/Recursive/test/Josephus.test.js @@ -0,0 +1,40 @@ +import { josephus } from '../Josephus' + +describe('Josephus', () => { + const collection = [1, 2, 3, 4, 5, 6, 7] + const collection1 = [1] + const collection2 = [] + + it('should return 4 for step size of 3', () => { + const step = 3 + expect(josephus([...collection], step)).toBe(4) + }) + + it('should return 4 for a step size of 10', () => { + const step = 10 + expect(josephus([...collection], step)).toBe(4) + }) + + it('should return null for a step size of 0 as it is invalid', () => { + const step = 0 + expect(josephus([...collection], step)).toBeNull() + }) + + it('should return 7 for a step size of 1000', () => { + const step = 1000 + expect(josephus([...collection], step)).toBe(7) + }) + + it('should return null for a step size of -1 as it is invalid', () => { + const step = -1 + expect(josephus([...collection], step)).toBeNull() + }) + it('should return 1 for a collection with just 1', () => { + const step = 2 + expect(josephus([...collection1], step)).toBe(1) + }) + it('should return null for an empty collection as it is invalid', () => { + const step = 3 + expect(josephus([...collection2], step)).toBeNull() + }) +})