0
The problem with this code is its giving the output in alphabetic order even when the input is in reverse.. Any suggestions?
function fun(str){ var arr=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','a','b','c','d','e','f','g','h','i','j','k','l','m','n']; var ptr=str.split(""); var abc=""; for(var i=0;i<arr.length;i++){ for(var j=0;j<ptr.length;j++){ if(ptr[j]===arr[i]){ abc=abc + arr[i+13]; } } } return abc; } console.log(fun("abc")); console.log(fun("cab"));
17 odpowiedzi
+ 1
Then try that:
function rot13(str) {
var alp = "abcdefghijklmnopqrstuvwxyz";
str = str.split("");
var rot = "";
for(let c of str) {
if(!alp.includes(c)) {
rot += c;
continue;
}
let i = alp.indexOf(c);
i += 13;
i %= 26;
rot += alp[i];
}
return rot;
}
+ 1
Nico Ruder your code is fine, but you doesn't help the OP by not pointing him its logical error and not correcting its own code ^^
dheeraj gupta your logic is wrong: you must first iterate over the string to be converted, then for each char iterate over your array to find it and append it converted (then you should exit the loop to avoid finding it twice) ;)
also, you must keep track of not founded char and if so append it without converting:
var abc = "";
var found;
for (var j=0; j<ptr.length; j++) {
found = false;
for (var i=0; i<arr.length; i++) {
if (ptr[j]===arr[i]) {
abc = abc + arr[i+13];
found = true;
break;
}
}
// handle not founded characters
if (!found) {
abc = abc + ptr[j];
}
}
there are some improvements you could do also (wich could shortening the code), but that's not the question ^^
+ 1
visph thats true, but its better to give a more efficient solution and helping this way, then using inefficient code. On the end I can still explain what I did and show how it to solve his problem easier and on the end he knew what he wanted and just needed a path to solve it. I think you also asked for a solution on stackoverflow, where the solution was just posted and no one cared.
+ 1
i %= 26; // i = i % 26 (i = 36 % 26 = 10)
And now we take the character of array with the index 10.
c = arr[i];
0
Do you try to make a rot13 function?
0
Yes Nico Ruder
0
Nico Ruder but it's not working with spaces
0
Nico Ruder thanks its working now
0
No problem but check if it wraps around if you have xyz
0
It's working fine until 'm'.. At 'n' it's undefined and then at 'o' it's 'a' but it should be 'b'
0
Change 27 to 26 and it works
0
Great...
But I want spaces in the output too
0
I edit it. Sorry for my mistakes
0
Nico Ruder can u please explain how i%=26; is working there
0
i %= 26 is the modulo operation on i itself.
If you write any mathamatical or logical operation in front of an equal sign, then you calculate the i with that operation. As example: i += 5 means i = i + 5 or i -= 7 means i = i - 7
The modulo operation (mostly shown as a % sign) is just division with leaving the rest. Example:
16 % 6 = 4 because if you try to subtract 6 from 16 as many times as possible, then only 4 is left or 16 / 6 = 2 rest 4.
Another example: 21 % 7 = 0
because 21 / 7 = 3 rest 0
Examples for the use of modulo: if you have a defined length of an array but you want to wrap around, if you go over the size, then you use modulo (%).
here we have the alphabet with 26 characters. But what if i have a "x" and want to rotate it with ROT13, then you take the index of "x", which is 23 and add 13.
i = array.indexOf("x"); // 23
i += 13; // i = i + 13 (i = 23 + 13 = 36)
now we need to wrap around, because there is no 36th index in the array. So modulo comes to use.
0
Nico Ruder thank you so much
0
Hey, no problem