Salutations.
I'm posting Codewars challenges and my thought process in this series. I'm using JS and Node 18 whenever possible. Just for the sake of clarity, I'm making fair use of them.
For the "Counting duplicates" challenge, I'll start with this:
function duplicateCount(text){
text = text.toString();
let countTotal = {"max":0};
let letter = '';
for (let i=0 ; i < text.length ; i++){
letter = text.at(i).toLowerCase();
if (letter){
countTotal[letter] = countTotal[letter] ? countTotal[letter]++ : 1;
if (countTotal[letter] > countTotal["max"]){
countTotal["max"] = countTotal[letter];
}
}
}
return countTotal["max"];
}
Seems... wordy. Wonder if this many words are actually aiming in the right direction. I'll give you a bit of time if you'd like to think for yourself.
3...
2...
1...
1/2...
1/4...
Ok, I think that's enough. No. Slang from the Bay Area made its way onto the web, so if I may: It's hella wrong.
The thing is, I was trying to find how many duplicates of the most duplicated letter are there. Turns out we need to answer how many duplicate types are there. Case insensitive.
AbC -> 0 -> no letter repeats
AbCC -> 1 -> "C" repeats, we don't care how many times
AbBCC -> 2 -> "b" and "c" repeat, we don't care how many times or the casing
We can take advantage of object literals in JS to create a counter for each letter. Then, one property could be "repetitions", which would be a counter that goes up ONLY whenever a letter shows up two times.
if (countTotal[letter]==2){
countTotal.repetitions++;
}
Full solution:
function duplicateCount(text){
text = text.toString();
let countTotal = {"repetitions": 0};
let letter = '';
for (let i=0 ; i < text.length ; i++){
letter = text.at(i).toLowerCase();
if (letter){
(countTotal[letter] === undefined) ? countTotal[letter] = 0 : null;
countTotal[letter]++;
if (countTotal[letter]==2){
countTotal.repetitions++;
}
}
}
return countTotal["repetitions"];
}
Took a while, it can be improved.
Take care. Drink water 💧💧💧.
Top comments (0)