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 f8222ed

Browse files
committed
Add Tower of Hanoi.
1 parent 8c102a3 commit f8222ed

File tree

2 files changed

+51
-41
lines changed

2 files changed

+51
-41
lines changed
Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,62 @@
11
import hanoiTower from '../hanoiTower';
2+
import Stack from '../../../../data-structures/stack/Stack';
23

34
describe('hanoiTower', () => {
45
it('should solve tower of hanoi puzzle with 2 discs', () => {
5-
const moveCallbackMock = jest.fn();
6+
const moveCallback = jest.fn();
67
const numberOfDiscs = 2;
78

8-
hanoiTower(numberOfDiscs, moveCallbackMock);
9+
const fromPole = new Stack();
10+
const withPole = new Stack();
11+
const toPole = new Stack();
912

10-
expect(moveCallbackMock).toHaveBeenCalledTimes((2 ** numberOfDiscs) - 1);
13+
hanoiTower({
14+
numberOfDiscs,
15+
moveCallback,
16+
fromPole,
17+
withPole,
18+
toPole,
19+
});
1120

12-
expect(moveCallbackMock.mock.calls[0][0]).toBe(1);
13-
expect(moveCallbackMock.mock.calls[0][1]).toEqual([1, 2]);
14-
expect(moveCallbackMock.mock.calls[0][2]).toEqual([]);
21+
expect(moveCallback).toHaveBeenCalledTimes((2 ** numberOfDiscs) - 1);
1522

16-
expect(moveCallbackMock.mock.calls[1][0]).toBe(2);
17-
expect(moveCallbackMock.mock.calls[1][1]).toEqual([2]);
18-
expect(moveCallbackMock.mock.calls[1][2]).toEqual([]);
23+
expect(fromPole.toArray()).toEqual([]);
24+
expect(toPole.toArray()).toEqual([1, 2]);
1925

20-
expect(moveCallbackMock.mock.calls[2][0]).toBe(1);
21-
expect(moveCallbackMock.mock.calls[2][1]).toEqual([1]);
22-
expect(moveCallbackMock.mock.calls[2][2]).toEqual([2]);
26+
expect(moveCallback.mock.calls[0][0]).toBe(1);
27+
expect(moveCallback.mock.calls[0][1]).toEqual([1, 2]);
28+
expect(moveCallback.mock.calls[0][2]).toEqual([]);
29+
30+
expect(moveCallback.mock.calls[1][0]).toBe(2);
31+
expect(moveCallback.mock.calls[1][1]).toEqual([2]);
32+
expect(moveCallback.mock.calls[1][2]).toEqual([]);
33+
34+
expect(moveCallback.mock.calls[2][0]).toBe(1);
35+
expect(moveCallback.mock.calls[2][1]).toEqual([1]);
36+
expect(moveCallback.mock.calls[2][2]).toEqual([2]);
2337
});
2438

2539
it('should solve tower of hanoi puzzle with 3 discs', () => {
26-
const moveCallbackMock = jest.fn();
40+
const moveCallback = jest.fn();
2741
const numberOfDiscs = 3;
2842

29-
hanoiTower(numberOfDiscs, moveCallbackMock);
43+
hanoiTower({
44+
numberOfDiscs,
45+
moveCallback,
46+
});
3047

31-
expect(moveCallbackMock).toHaveBeenCalledTimes((2 ** numberOfDiscs) - 1);
48+
expect(moveCallback).toHaveBeenCalledTimes((2 ** numberOfDiscs) - 1);
3249
});
3350

3451
it('should solve tower of hanoi puzzle with 6 discs', () => {
35-
const moveCallbackMock = jest.fn();
52+
const moveCallback = jest.fn();
3653
const numberOfDiscs = 6;
3754

38-
hanoiTower(numberOfDiscs, moveCallbackMock);
55+
hanoiTower({
56+
numberOfDiscs,
57+
moveCallback,
58+
});
3959

40-
expect(moveCallbackMock).toHaveBeenCalledTimes((2 ** numberOfDiscs) - 1);
60+
expect(moveCallback).toHaveBeenCalledTimes((2 ** numberOfDiscs) - 1);
4161
});
4262
});

‎src/algorithms/uncategorized/hanoi-tower/hanoiTower.js

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,5 @@
11
import Stack from '../../../data-structures/stack/Stack';
22

3-
/**
4-
* @param {Stack} fromPole
5-
* @param {Stack} toPole
6-
* @param {function(disc: number, fromPole: number[], toPole: number[])} moveCallback
7-
*/
8-
function moveDisc(fromPole, toPole, moveCallback) {
9-
moveCallback(fromPole.peek(), fromPole.toArray(), toPole.toArray());
10-
11-
const disc = fromPole.pop();
12-
toPole.push(disc);
13-
}
14-
153
/**
164
* @param {number} numberOfDiscs
175
* @param {Stack} fromPole
@@ -28,7 +16,9 @@ function hanoiTowerRecursive({
2816
}) {
2917
if (numberOfDiscs === 1) {
3018
// Base case with just one disc.
31-
moveDisc(fromPole, toPole, moveCallback);
19+
moveCallback(fromPole.peek(), fromPole.toArray(), toPole.toArray());
20+
const disc = fromPole.pop();
21+
toPole.push(disc);
3222
} else {
3323
// In case if there are more discs then move them recursively.
3424

@@ -64,21 +54,21 @@ function hanoiTowerRecursive({
6454
/**
6555
* @param {number} numberOfDiscs
6656
* @param {function(disc: number, fromPole: number[], toPole: number[])} moveCallback
57+
* @param {Stack} [fromPole]
58+
* @param {Stack} [withPole]
59+
* @param {Stack} [toPole]
6760
*/
68-
export default function hanoiTower(numberOfDiscs, moveCallback) {
61+
export default function hanoiTower({
62+
numberOfDiscs,
63+
moveCallback,
64+
fromPole = new Stack(),
65+
withPole = new Stack(),
66+
toPole = new Stack(),
67+
}) {
6968
// Each of three poles of Tower of Hanoi puzzle is represented as a stack
7069
// that might contain elements (discs). Each disc is represented as a number.
7170
// Larger discs have bigger number equivalent.
7271

73-
// The pole from where the discs should be moved.
74-
const fromPole = new Stack();
75-
76-
// The middle pole that should be used as a helper.
77-
const withPole = new Stack();
78-
79-
// The destination pole where all discs need to be moved.
80-
const toPole = new Stack();
81-
8272
// Let's create the discs and put them to the fromPole.
8373
for (let discSize = numberOfDiscs; discSize > 0; discSize -= 1) {
8474
fromPole.push(discSize);

0 commit comments

Comments
(0)

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