Skip to content

Commit 3d6fb2d

Browse files
authored
Merge pull request #432 from sir-gon/feature/ctci_recursive_staircase
[REFACTOR] [Hacker Rank] Interview Preparation Kit: Recursion: Davis'…
2 parents 48a3785 + b60f163 commit 3d6fb2d

File tree

4 files changed

+90
-92
lines changed

4 files changed

+90
-92
lines changed

src/hackerrank/interview_preparation_kit/recursion_and_backtracking/ctci_recursive_staircase.test.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import { describe, expect, it } from '@jest/globals';
22
import { logger as console } from '../../../logger';
33

4-
import {
5-
stepPerms,
6-
step_perms_comput_with_cache
7-
} from './ctci_recursive_staircase';
4+
import { stepPerms, StepPerms } from './ctci_recursive_staircase';
85
import TEST_CASES from './ctci_recursive_staircase.testcases.json';
96
import TEST_CASES_GENERALIZED from './ctci_recursive_staircase_generalized.testcases.json';
107

@@ -14,9 +11,9 @@ describe('ctci_recursive_staircase', () => {
1411

1512
TEST_CASES.forEach((testSet) => {
1613
testSet?.tests.forEach((test) => {
17-
const answer = stepPerms(test.input);
14+
const answer = stepPerms(test.n_steps);
1815

19-
console.debug(`stepPerms(${test.input}) solution found: ${answer}`);
16+
console.debug(`stepPerms(${test.n_steps}) solution found: ${answer}`);
2017

2118
expect(answer).toStrictEqual(test.expected);
2219
});
@@ -26,17 +23,16 @@ describe('ctci_recursive_staircase', () => {
2623
it('step_perms_comput_with_cache test cases', () => {
2724
expect.assertions(3);
2825

26+
const TOP_LIMIT = 10 ** 10 + 7;
27+
2928
TEST_CASES_GENERALIZED.forEach((testSet) => {
3029
testSet?.tests.forEach((test) => {
31-
const initial_cache: Record<number, number> = {};
32-
const answer = step_perms_comput_with_cache(
33-
test.input,
34-
initial_cache,
35-
test.limit
36-
);
30+
const stairs = new StepPerms(TOP_LIMIT, test.steps_limit);
31+
32+
const answer = stairs.step_perms_comput_with_cache(test.n_steps);
3733

3834
console.debug(
39-
`step_perms_comput_with_cache(${test.input}, ${initial_cache}, ${test.limit}) solution found: ${answer}`
35+
`step_perms_comput_with_cache(${test.n_steps}, ${test.steps_limit}) solution found: ${answer}`
4036
);
4137

4238
expect(answer).toStrictEqual(test.expected);
Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,49 @@
11
[
2-
{
3-
"title": "Sample Test case 0",
4-
"tests": [
5-
{
6-
"input": 1,
7-
"expected": 1
8-
},
9-
{
10-
"input": 3,
11-
"expected": 4
12-
},
13-
{
14-
"input": 7,
15-
"expected": 44
16-
}
17-
]
18-
},
19-
{
20-
"title": "Sample Test case 9",
21-
"tests": [
22-
{
23-
"input": 5,
24-
"expected": 13
25-
},
26-
{
27-
"input": 8,
28-
"expected": 81
29-
}
30-
]
31-
},
32-
{
33-
"title": "Sample Test case 10",
34-
"tests": [
35-
{
36-
"input": 15,
37-
"expected": 5768
38-
},
39-
{
40-
"input": 20,
41-
"expected": 121415
42-
},
43-
{
44-
"input": 27,
45-
"expected": 8646064
46-
}
47-
]
48-
}
2+
{
3+
"title": "Sample Test case 0",
4+
"tests": [
5+
{
6+
"n_steps": 1,
7+
"expected": 1
8+
},
9+
{
10+
"n_steps": 3,
11+
"expected": 4
12+
},
13+
{
14+
"n_steps": 7,
15+
"expected": 44
16+
}
17+
]
18+
},
19+
{
20+
"title": "Sample Test case 9",
21+
"tests": [
22+
{
23+
"n_steps": 5,
24+
"expected": 13
25+
},
26+
{
27+
"n_steps": 8,
28+
"expected": 81
29+
}
30+
]
31+
},
32+
{
33+
"title": "Sample Test case 10",
34+
"tests": [
35+
{
36+
"n_steps": 15,
37+
"expected": 5768
38+
},
39+
{
40+
"n_steps": 20,
41+
"expected": 121415
42+
},
43+
{
44+
"n_steps": 27,
45+
"expected": 8646064
46+
}
47+
]
48+
}
4949
]

src/hackerrank/interview_preparation_kit/recursion_and_backtracking/ctci_recursive_staircase.ts

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,41 @@
66
const TOP_LIMIT = 10 ** 10 + 7;
77
const STEPS_LIMIT = 3;
88

9-
export function step_perms_comput_with_cache(
10-
n_steps: number,
11-
cache: Record<number, number>,
12-
steps_limit: number
13-
): number {
14-
if (0 <= n_steps && n_steps <= 2) {
15-
return n_steps;
9+
export class StepPerms {
10+
TOP_LIMIT = 1;
11+
STEPS_LIMIT = 1;
12+
CACHE: Record<number, number> = {};
13+
14+
constructor(top_limit: number, steps_limit: number) {
15+
this.TOP_LIMIT = top_limit;
16+
this.STEPS_LIMIT = steps_limit;
1617
}
1718

18-
const keys = new Set(Object.values(cache));
19-
let result = 0;
20-
21-
for (let i = 1; i <= Math.min(steps_limit, n_steps); i++) {
22-
const searchKey = n_steps - i;
23-
if (!keys.has(searchKey)) {
24-
cache[searchKey] = step_perms_comput_with_cache(
25-
searchKey,
26-
cache,
27-
steps_limit
28-
);
19+
step_perms_comput_with_cache(n_steps: number): number {
20+
if (0 <= n_steps && n_steps <= 2) {
21+
return n_steps;
2922
}
3023

31-
result += cache[searchKey];
32-
}
24+
const keys = new Set(Object.keys(this.CACHE));
25+
let result = 0;
26+
27+
for (let i = 1; i <= Math.min(this.STEPS_LIMIT, n_steps); i++) {
28+
const searchKey = n_steps - i;
29+
if (!keys.has(searchKey.toString())) {
30+
this.CACHE[searchKey] = this.step_perms_comput_with_cache(searchKey);
31+
}
32+
33+
result += this.CACHE[searchKey];
34+
}
3335

34-
return result + (n_steps <= steps_limit ? 1 : 0);
36+
return result + (n_steps <= this.STEPS_LIMIT ? 1 : 0);
37+
}
3538
}
3639

3740
export function stepPerms(n: number): number {
38-
const initial_cache: Record<number, number> = {};
39-
return (
40-
step_perms_comput_with_cache(n, initial_cache, STEPS_LIMIT) % TOP_LIMIT
41-
);
41+
const stairs = new StepPerms(TOP_LIMIT, STEPS_LIMIT);
42+
43+
return stairs.step_perms_comput_with_cache(n) % TOP_LIMIT;
4244
}
4345

44-
export default { stepPerms, step_perms_comput_with_cache };
46+
export default { stepPerms, StepPerms };

src/hackerrank/interview_preparation_kit/recursion_and_backtracking/ctci_recursive_staircase_generalized.testcases.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
"title": "Own sample 1",
44
"tests": [
55
{
6-
"input": 4,
7-
"limit": 3,
6+
"n_steps": 4,
7+
"steps_limit": 3,
88
"expected": 7
99
}
1010
]
@@ -13,8 +13,8 @@
1313
"title": "Own sample 2",
1414
"tests": [
1515
{
16-
"input": 5,
17-
"limit": 4,
16+
"n_steps": 5,
17+
"steps_limit": 4,
1818
"expected": 15
1919
}
2020
]
@@ -23,8 +23,8 @@
2323
"title": "Own sample 3",
2424
"tests": [
2525
{
26-
"input": 6,
27-
"limit": 2,
26+
"n_steps": 6,
27+
"steps_limit": 2,
2828
"expected": 13
2929
}
3030
]

0 commit comments

Comments
 (0)