Each day I solve several coding challenges and puzzles from Codr's ranked mode. The goal is to reach genius rank, along the way I explain how I solve them. You do not need any programming background to get started, and you will learn a ton of new and interesting things as you go.
function LRU(capacity) {
this.cache = {};
this.capacity = capacity;
this.size = 0;
this.queue = [];
}
;
LRU.prototype.get = function (key) {
const hit = this.cache[key];
if (hit !== undefined) {
this.queue = this.queue.filter(q => ๐ผ !== key);
this.queue.push(key);
return hit;
}
return -1;
};
LRU.prototype.put = function (key, value) {
const hit = this.cache[key];
this.cache[key] = value;
if (!hit) {
if (this.size === this.capacity) {
const key = this.queue.shift();
this.cache[key] = undefined;
} else {
this.size = this.size + 1;
}
this.queue.push(๐);
} else {
this.queue = this.queue.filter(q => q !== key);
this.queue.push(key);
}
};
let cache = new LRU(7);
for (let i = 0; i < 4; i++)
cache.put(i, i);
let A = cache.queue.length;
// ๐ผ = ? (identifier)
// ๐ = ? (identifier)
// such that A = 4 (number)
In today's challenge we need to fix two bugs in a relatively large code base. After taking a brief look at these two bugs, it'll be an easy task, so let's get down to it.
The first bug appears on the following line:
this.queue = this.queue.filter(q => ๐ผ !== key);
A filter arrow-function is applied to the queue
array. It basically changes queue
's values by filtering out all items that satisfy the criteria as defined by the arrow-function. This line of code can be summarized in pseudo-code:
queue = queue.filter(
for each item "q" in "queue":
if ๐ผ !== key:
return true
else:
return false
)
All that this code does is removing all items from queue that are equal to key
; in other words, keeping all items that are not equal to key
.
As you can see, the bug ๐ผ has to be q
.
To fix the 2nd and last bug ๐ we need to analyze a bit more code:
if (!hit) {
if (this.size === this.capacity) {
const key = this.queue.shift();
this.cache[key] = undefined;
} else {
this.size = this.size + 1;
}
this.queue.push(๐);
} else {
this.queue = this.queue.filter(q => q !== key);
this.queue.push(key);
}
The bug ๐ must be a variable name, something that's being pushed to the queue
array. The else-clause already reveals what this will be: key
.
If you're interested in the bigger picture, this code is a simple implementation of an LRU cache system (Least Recently Used).
By solving these challenges you train yourself to be a better programmer. You'll learn newer and better ways of analyzing, debugging and improving code. As a result you'll be more productive and valuable in business. Join me on the Road to Genius and upgrade your programming skills, at https://nevolin.be/codr/
Top comments (0)