Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions Uncategorized/Tower of Hanoi/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Tower of Hanoi

The Tower of Hanoi is a classic recursive puzzle involving three rods and a stack of disks of different sizes. The goal is to move the entire stack from one rod to another while obeying these rules:

- Only one disk may be moved at a time.
- A larger disk can never be placed on top of a smaller one.
- Each move must place a disk onto a rod.

This visualization demonstrates the recursive strategy used to solve the puzzle efficiently.

## References

- [Wikipedia](https://en.wikipedia.org/wiki/Tower_of_Hanoi)
66 changes: 66 additions & 0 deletions Uncategorized/Tower of Hanoi/code.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
// import visualization libraries {
const { Tracer, Array2DTracer, LogTracer, Layout, VerticalLayout } = require('algorithm-visualizer');
// }

const numberOfDisks = 5;
const towerCount = 3;
const towers = Array.from({ length: towerCount }, () => []);
for (let disk = numberOfDisks; disk >= 1; disk--) {
towers[0].push(disk);
}

// define tracer variables {
const towerTracer = new Array2DTracer('Towers');
const logger = new LogTracer();
Layout.setRoot(new VerticalLayout([towerTracer, logger]));
const display = Array.from({ length: numberOfDisks + 1 }, () => Array(towerCount).fill(' '));

function updateDisplay() {
for (let row = 0; row < numberOfDisks + 1; row++) {
for (let tower = 0; tower < towerCount; tower++) {
display[row][tower] = ' ';
}
}

for (let tower = 0; tower < towerCount; tower++) {
display[numberOfDisks][tower] = '|';
}

towers.forEach((stack, towerIndex) => {
stack.forEach((disk, stackIndex) => {
const row = numberOfDisks - 1 - stackIndex;
display[row][towerIndex] = '█'.repeat(disk);
});
});

towerTracer.set(display);
}

updateDisplay();
Tracer.delay();
// }

function moveDisks(count, source, auxiliary, target, sourceName, auxiliaryName, targetName) {
if (count === 0) {
return;
}

moveDisks(count - 1, source, target, auxiliary, sourceName, targetName, auxiliaryName);

const disk = source.pop();
target.push(disk);

// logger {
logger.println(`Move disk ${disk} from tower ${sourceName} to tower ${targetName}`);
// }
// visualize {
updateDisplay();
Tracer.delay();
// }

moveDisks(count - 1, auxiliary, source, target, auxiliaryName, sourceName, targetName);
}

logger.println(`Starting Tower of Hanoi with ${numberOfDisks} disks`);
moveDisks(numberOfDisks, towers[0], towers[1], towers[2], 'A', 'B', 'C');
logger.println('All disks have been moved to tower C');