From e9d130d6355fe7ec296cfdce5a718a5fc17d80a7 Mon Sep 17 00:00:00 2001 From: Aditya Poddar Date: Wed, 8 Jul 2026 13:26:58 +0000 Subject: [PATCH] Add Tower of Hanoi visualization --- Uncategorized/Tower of Hanoi/README.md | 13 +++++ Uncategorized/Tower of Hanoi/code.js | 66 ++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 Uncategorized/Tower of Hanoi/README.md create mode 100644 Uncategorized/Tower of Hanoi/code.js diff --git a/Uncategorized/Tower of Hanoi/README.md b/Uncategorized/Tower of Hanoi/README.md new file mode 100644 index 00000000..e3d7f0c5 --- /dev/null +++ b/Uncategorized/Tower of Hanoi/README.md @@ -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) diff --git a/Uncategorized/Tower of Hanoi/code.js b/Uncategorized/Tower of Hanoi/code.js new file mode 100644 index 00000000..f87c7817 --- /dev/null +++ b/Uncategorized/Tower of Hanoi/code.js @@ -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');