const SIZE = 20;
let free = [[0, SIZE]];
let hash = {};
function park(size, lic){
let ok = false
for(let i = 0; i < free.length; i++){
let [start, end] = free[i];
if(end - start >= size){
// if(start + size > SIZE) return false
if(start + size < end){
free[i] = [start + size, end];
} else {
free.splice(i, 1)
}
hash[lic] = [start, size];
ok = true
break;
}
}
return ok;
}
function retrieve(lic){
if(!(lic in hash)) return false;
let [pos, size] = hash[lic];
console.log(pos, pos + size)
let N = free.length;
if(pos < free[0][0]) {
if(pos + size == free[0][0]){
console.log("case 1")
free[0] = [pos, free[0][1]];
} else {
free.unshift([pos, pos + size]);
console.log("case 2")
}
} else if(pos >= free[N - 1][1]){
if(pos == free[N - 1][1]){
free[N - 1] = [free[N - 1][0], pos];
console.log("case 3")
} else {
free.push([pos, pos + size]);
console.log("case 4")
}
}
else {
for(let i = 0; i < free.length - 1; i++){
let [start, end] = free[i];
let [nextStart, nextEnd] = free[i + 1];
if(pos >= end && pos + size <= nextStart){
if(pos > end && pos + size < nextStart){
free.splice(i + 1, 0, [pos, pos + size]);
console.log("case 6")
} else if(pos == end && pos + size < nextStart){
free[i] = [start, pos + size];
console.log("case 7")
} else if(pos > end && pos + size == nextStart){
free[i + 1] = [pos, nextEnd];
console.log("case 8")
} else {
free.splice(i, 1)
free[i] = [start, nextEnd];
console.log("case 9")
}
break
}
}
}
delete hash[lic];
return true;
}
park(3, 'c')
console.log(free, hash)
park(2, 'b')
console.log(free, hash)
park(1, 'a')
console.log(free, hash)
retrieve('b')
console.log(free, hash)
park(2, 'd')
console.log(free, hash)
park(3, 'e')
console.log(free, hash)
retrieve('c')
console.log(free, hash)
retrieve('a')
console.log(free, hash)
To embed this program on your website, copy the following code and paste it into your website's HTML: