Skip to content

Commit

Permalink
feat: add new Josephus file in Recursive directory
Browse files Browse the repository at this point in the history
  • Loading branch information
Lonercode committed Oct 10, 2024
1 parent ff314a2 commit 483f181
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 0 deletions.
25 changes: 25 additions & 0 deletions Recursive/Josephus.js
Original file line number Diff line number Diff line change
@@ -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 }
40 changes: 40 additions & 0 deletions Recursive/test/Josephus.test.js
Original file line number Diff line number Diff line change
@@ -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()
})
})

0 comments on commit 483f181

Please sign in to comment.