Guys I’m unable to solve this algorithm with my code but able with someone else’s code. the thing is, both code spawns the same results. i spent at least 3-4 hours analysing but couldn’t tell the difference. Would someone kindly enlighten me as why my code doesn’t work? Challenge: https://www.codewars.com/kata/a-string-of-sorts/train/javascript
My code:
function sortString(string,ordering) {
let str = "";
let unmatched = "";
let arr = [];
for ( let u = 0; u < string.length; u++) {
if (!ordering.includes(string[u]) ) {
unmatched+=string[u]
}
}
for (let i = 0; i < ordering.length; i++ ) {
let j = 0;
let incr = 0;
while ( j < string.length) {
if (!ordering.includes(string[j])) {
arr.push(string[j])
}
if (string[j] !== ordering[i]) {
j++
continue;
}
j++
incr++
}
for ( let k = 0; k < incr; k++) {
str+= ordering[i];
}
}
console.log(str)
console.log(unmatched)
console.log(arr)
let orderedStr = str+unmatched;
return orderedStr
}
sortString("foos", "of")
// sortString("foos", "of") => "oofs"
// sortString("string", "gnirts") => "gnirts"
// sortString("banana", "abn") => "aaabnn"
Someone else’s code:
function sortString(string,ordering) {
let str = "";
let arr = string.split("");
for ( let i = 0; i < ordering.length; i++) {
console.log(ordering[i])
while (arr.includes(ordering[i])) {
str+= arr.splice(arr.indexOf(ordering[i]),1);
}
}
console.log(str)
console.log(arr)
return str + arr.join("");
}
sortString("foos", "of")
in the challenge it said it should return “oofs”. now this is confusing, i removed occurences in the second parameter at the start and it didn’t work so should i remove occurences in the final string aka “orderedStr” instead?
i removed the duplicates buddy… it ain’t working. i even tried on the second parameter at the beginning before all the processing of the rest of the code
edit: sorting my final answer makes it different from the first few simpler test cases.
🤷 then the challenge tests don’t match the description. It clearly says remove duplicates, and if the tests fail you on that then the challenge is bugged. I can get yours to return “oofs” fine when I run through it in pythontutor btw
The challenge says to ignore (remove) duplicates in teh second string. If there are multiples of a character in the first string, they should be grouped, but if there are multiples of a character in teh SECOND string, only the first should be recognized.
… Hey, this sounds like a great chance to play with Maps! Ooooo… lol
dan on code wars it says 6 pass. 2 fail…
expected ‘buooliioohng’ to equal ‘buoolihng’
expected ‘bssxxsslhyhdrmukqlkdy’ to equal ‘bssxxlhyhdrmukqlkdy’
im spent hours analyzing but what does this mean?
So, in both those cases, see how there are duplicated letters (buooliioohng)? First, you want to turn the second string into a list of unique values. If the ordering string they provide you looks like “buolio”, you need to ignore that second “o”.
In that second sample you provided, they sidestep the problem by slicing the characters out of string as they get used, thus rendering them unavailable for any repeated letters in the ordering variable.
i honestly dk how to. i know how to remove all occurences except 1 like this concept of code :
let checker;
let order = ""
let splitOrdering = ordering.split("")
for ( let r = 0; r < splitOrdering.length; r++) {
if (splitOrdering[r] !== checker) {
order += splitOrdering[r]
checker = splitOrdering[r]
}
}
but can’t find out how to remove double oo at the last if there’s 2 oo at the front. i used loops with indexOf and manipulation of indexes but still to no avail.
and honestly i don’t get " they sidestep the problem by slicing the characters out of string as they get used, thus rendering them unavailable for any repeated letters in the ordering variable." can’t really visualise it right now lol
sidestep the problem? so basically it don’t work?. slicing characters of what string? the 2nd parameter? and what do u mean by “rendering them unavailable for any repeated letters in the ordering variable” lol.
So in the “someone else’s code”, they turn string into an array, using let arr = string.split("");. From that point on, their code has diverged from yours significantly.
At each pass through their ordering loop (the outer loop), they get every instance of each letter that matches, and using str += arr.splice(arr.indexOf(ordering[i]), 1) (which removes the first matching letter from arr, returns the removed character and appends it to str), they are removing that letter from arr. So, if we encounter that letter again in ordering, it won’t match anything, as we’ve already removed all the matches.
Using the String, rather than an Array, will make this a little more complicated. Not impossible, just a little more of a challenge. I strongly suggest reading up on array methods. Specifically, on either MDN or https://devdocs.io/, I would advise reading about Array.indexOf() and Array.splice()