Skip to content
Open

:) #1

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
50 changes: 50 additions & 0 deletions Answers/993112119/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hanoi DS4022</title>
<link rel="stylesheet" href="stylesheet/css/normalize.css">
<link rel="stylesheet" href="stylesheet/css/styles.css">
<link rel="stylesheet" href="stylesheet/css/responsive.css">
</head>
<body>
<div class="container">
<div class="background-text"><h1>ExHanoi</h1></div>
<div>
<div class="rods">
<div class="rod" id="A"></div>
<div class="rod" id="B"></div>
<div class="rod" id="C"></div>
<div class="rod noDisplay" id="D"></div>
</div>
<div class="base"></div>
</div>
<div class="btns">
<div class="btns-left">
<div class="btn btn-disabled">A</div>
<div class="btn btn-disabled">S</div>
<div class="btn btn-disabled">D</div>
<div class="btn btn-disabled" id="btn-space">SPACE</div>
</div>
<div class="btns-middle">
<form>
<label for="disk-numbers">Number Of Disks :</label>
<input type="number" id="disk-numbers" min="1" max="5" placeholder="min = 1 & max = 5" >
</form>
<div class="btn" id="exhanoi_1">ExHanoi 1</div>
<div class="btn" id="exhanoi_2">ExHanoi 2</div>
<div class="btn" id="exhanoi_3">ExHanoi 3</div>
</div>
<div class="btns-right">
<div class="btn btn-disabled" id="btn-prev">Prev</div>
<div class="btn btn-disabled" id="btn-start">Start</div>
<div class="btn btn-disabled" id="btn-next">Next</div>
<div class="btn btn-disabled" id="btn-end">End</div>
<div class="btn btn-disabled" id="btn-stop">Stop</div>
</div>
</div>
</div>
<script src="script.js"></script>
</body>
</html>
290 changes: 290 additions & 0 deletions Answers/993112119/script.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,290 @@
const prev = document.getElementById('btn-prev');
const start = document.getElementById('btn-start');
const stop = document.getElementById('btn-stop');
const next = document.getElementById('btn-next');
const end = document.getElementById('btn-end');
const input = document.getElementById('disk-numbers');
const exHanoi1 = document.getElementById('exhanoi_1');
const exHanoi2 = document.getElementById('exhanoi_2');
const exHanoi3 = document.getElementById('exhanoi_3');
let exHanoi;
let moves = [];
let backMoves = []
let TIME = 500;

const rods = {
A : document.getElementById('A'),
B : document.getElementById('B'),
C : document.getElementById('C'),
D : document.getElementById('D')
}

let disks = [];
function diskCreator(number, className){
for(let i = 0 ; i < number; i++){
const disk = document.createElement("div");
disk.classList.add(className);

if(window.innerWidth < 480)
disk.style.width = `calc(60px + ${(number - i*2)}px)`;
else if(window.innerWidth < 768)
disk.style.width = `calc(90px + ${(number - i*3)}px)`;
else if(window.innerWidth < 992)
disk.style.width = `calc(130px + ${(number - i*4)}px)`;
else
disk.style.width = `calc(170px + ${(number - i*5)}px)`;
disk.innerText = i + 1;
disks.push(disk);
}
}

// for Move A --> B use this: moves.push([A, B])
function hanoi(from, via, to, n) {
if (n == 0) return;
if (n == 1) {
moves.push([from, to]);
return;
}
hanoi(from, to, via, n-1);
moves.push([from, to]);
hanoi(via, from, to, n-1);
}

function exHanoi_1(A, B, C, n) {
for(let i = 0; i < n; i++) {
hanoi(A, C, B, 1);
hanoi(C, A, B, i*6);
hanoi(B, A, C, i*6 + 3);
}
}

function exHanoi_2(A, B, C, D, n) {
hanoi(A, B, D, n);
hanoi(C, B, A, n);
hanoi(D, B, C, n);
}

function exhanoi_3(A, B, C, n) {
for (let i = 0; i < n; i++) {
hanoi(A, C, B, i*3);
hanoi(B, C, A, i*3 + 2);
}
hanoi(A, B, C, 3*n);
}

function moveDisks(from, to){
const fromEl = rods[from];
const toEl = rods[to];
const disk = fromEl.firstChild;
if(TIME > 200){
disk.animate([
{bottom: "500px"},
{bottom: "0"}
], TIME-200)
}
toEl.insertBefore(disk, toEl.firstChild);
}

function start_stop(){
if(start.classList != "btn-disabled")
start.classList.add("btn-disabled")
else
start.classList.remove("btn-disabled");

const myInterval = setInterval(() =>{
if(moves.length === 0)
return
const [from, to] = moves.shift();
backMoves.push([from, to]);
moveDisks(from, to);
if(moves.length < 1){
stop.click();
next.classList.add("btn-disabled");
start.classList.add("btn-disabled");
end.classList.add("btn-disabled");
}
console.log(`${from} -----> ${to}`);
},TIME);

stop.addEventListener("click", () => {
stop.classList.add("btn-disabled");
start.classList.remove("btn-disabled");
clearInterval(myInterval);
})
}
function nextMove(){
next.classList.remove("btn-disabeld");
prev.classList.remove("btn-disabeld");
const [from, to] = moves.shift();
backMoves.push([from, to]);
moveDisks(from, to);
console.log(`${from} -----> ${to}`);
if(moves.length < 1){
stop.click();
next.classList.add("btn-disabled");
start.classList.add("btn-disabled");
end.classList.add("btn-disabled");
}

}
function prevMove(){
if(backMoves.length < 1)
return;
const [to, from] = backMoves.pop();
moves.unshift([to, from]);
moveDisks(from, to);
console.log(`${from} -----> ${to}`);
if(backMoves.length < 1)
prev.classList.add("btn-disabled")
}
function endMoves(){
stop.click();
TIME = 1;
start.click();
}
input.addEventListener("keydown", (e) => {
if(e.key == 'Enter')
exHanoi1.click();
})
document.addEventListener("keydown", (e) => {;
switch (e.key) {
case 'a':
prev.click();
break;
case 'd':
next.click();
break;
case 's':
start.click();
break;
case ' ':
stop.click();
break;
}
})
function buttonsWorks(){
start.classList.remove("btn-disabled");
if(backMoves.length > 0)
prev.classList.remove("btn-disabled");


next.classList.remove("btn-disabled");
end.classList.remove("btn-disabled");
exHanoi1.classList.add("btn-disabled");
exHanoi2.classList.add("btn-disabled");
exHanoi3.classList.add("btn-disabled");
input.classList.add("btn-disabled");
input.disabled = true;

start.addEventListener("click", () =>{
stop.classList.remove("btn-disabled");
start_stop();
prev.classList.remove("btn-disabled");
if(moves.length < 1){
next.classList.add("btn-disabled");
end.classList.add("btn-disabled");
stop.click();
start.classList.add("btn-disabled");
}
})
next.addEventListener("click", () => {
nextMove();
prev.classList.remove("btn-disabled");
})
prev.addEventListener("click", () => {
prevMove();
next.classList.remove("btn-disabled");
start.classList.remove("btn-disabled");
end.classList.remove("btn-disabled");
})
end.addEventListener("click", () => {
endMoves();
})
}
//.............................ExHanoi Number 1..................................\\
exHanoi1.addEventListener("click", () => {
if(input.value === ""){
alert("Enter A Number First")
return
}
const number = input.value;
console.log(number);
if((number < 0) || (number > 7)){
alert("Your Number Is Not In The Range")
location.reload();
return
}

diskCreator(6*number, "disk");

let index = 6*number - 1;
while(index >= 0){
rods.A.appendChild(disks[index])
index--;
for(let j = 0; j < 2; j++){
rods.B.appendChild(disks[index])
index--;
}
for(let j = 0; j < 3; j++){
rods.C.appendChild(disks[index])
index--;
}
}
buttonsWorks()
exHanoi_1('A', 'B', 'C', number);
console.log(`Number Of Moves : ${moves.length}`);

})
//.............................ExHanoi Number 2..................................\\
exHanoi2.addEventListener("click",() => {
if(input.value === ""){
alert("Enter A Number First")
return
}
const number = input.value;
if(number === null)
return
if((number < 0) || (number > 7)){
alert("Your Number Is Not In The Range")
location.reload();
return
}

rods.D.classList.remove("noDisplay")
diskCreator(number, "disk")

for(let index = number-1; index >= 0; index--)
rods.A.appendChild(disks.pop());
diskCreator(number, "disk")
for (let index = number-1; index >= 0; index--) {
disks[index].classList.add("diskB")
rods.C.appendChild(disks.pop());
}
buttonsWorks()
exHanoi_2('A', 'B', 'C', 'D', number)
console.log(`Number Of Moves : ${moves.length}`);
})

//.............................ExHanoi Number 3..................................\\
exHanoi3.addEventListener("click", ()=> {
if(input.value === ""){
alert("Enter A Number First")
return
}
const number = input.value;
if((number < 0) || (number > 7)){
alert("Your Number Is Not In The Range")
location.reload();
return
}
diskCreator(3*number, "disk");

for(let index = 3*number - 1; index >= 0; index-= 3){
rods.B.appendChild(disks[index])
rods.B.appendChild(disks[index-1])
rods.A.appendChild(disks[index-2])
}
buttonsWorks()
exhanoi_3('A', 'B', 'C', number)
console.log(`Number Of Moves : ${moves.length}`);
})
Loading