└── problems.js /problems.js: -------------------------------------------------------------------------------- 1 | //Coding challenge #1. Coding challenge #1: Print numbers from 1 to 10 2 | for (var i = 1; i <= 10; i++) { 3 | console.log(i); 4 | } 5 | 6 | //Coding challenge #2. Coding challenge #2: Print the odd numbers less than 100 7 | for (var i = 1; i <= 100; i += 2) { 8 | console.log(i); 9 | } 10 | // Coding challenge #3: Print the multiplication table with 7 11 | for (var i = 1; i <= 10; i++) { 12 | var row = "7 * " + i + " = " + 7 * i; 13 | console.log(row); 14 | } 15 | 16 | // Coding challenge #4: Print all the multiplication tables with numbers from 1 to 10 17 | for (var i = 1; i <= 10; i++) { 18 | printTable(i); 19 | console.log(""); 20 | } 21 | 22 | function printTable(n) { 23 | for (var i = 1; i <= 10; i++) { 24 | var row = n + " * " + i + " = " + n * i; 25 | console.log(row); 26 | } 27 | } 28 | 29 | // Coding challenge #5: Calculate the sum of numbers from 1 to 10 30 | var sum = 0; 31 | 32 | for (var i = 1; i <= 10; i++) { 33 | sum += i; 34 | } 35 | 36 | console.log(sum); 37 | 38 | // Coding challenge #6: Calculate 10! 39 | var prod = 1; 40 | 41 | for (var i = 1; i <= 10; i++) { 42 | prod *= i; 43 | } 44 | 45 | console.log(prod); 46 | // Coding challenge #7: Calculate the sum of odd numbers greater than 10 and less than 30 47 | var sum = 0; 48 | 49 | for (var i = 11; i <= 30; i += 2) { 50 | sum += i; 51 | } 52 | 53 | console.log(sum); 54 | 55 | // Coding challenge #8: Create a function that will convert from Celsius to Fahrenheit 56 | function celsiusToFahrenheit(n) { 57 | return n * 1.8 + 32; 58 | } 59 | 60 | var r = celsiusToFahrenheit(20); 61 | console.log(r); 62 | 63 | // Coding challenge #9: Create a function that will convert from Fahrenheit to Celsius 64 | function fahrenheitToCelsius(n) { 65 | return (n - 32) / 1.8; 66 | } 67 | 68 | var r = fahrenheitToCelsius(68); 69 | console.log(r); 70 | 71 | // Coding challenge #10: Calculate the sum of numbers in an array of numbers 72 | function sumArray(ar) { 73 | var sum = 0; 74 | 75 | for (var i = 0; i < ar.length; i++) { 76 | sum += ar[i]; 77 | } 78 | 79 | return sum; 80 | } 81 | 82 | var ar = [2, 3, -1, 5, 7, 9, 10, 15, 95]; 83 | var sum = sumArray(ar); 84 | console.log(sum); 85 | 86 | // Coding challenge #11: Calculate the average of the numbers in an array of numbers 87 | 88 | function averageArray(ar) { 89 | var n = ar.length; 90 | var sum = 0; 91 | 92 | for (var i = 0; i < n; i++) { 93 | sum += ar[i]; 94 | } 95 | 96 | return sum / n; 97 | } 98 | 99 | var ar = [1, 3, 9, 15, 90]; 100 | var avg = averageArray(ar); 101 | 102 | console.log("Average: ", avg); 103 | 104 | // Coding challenge #12: Create a function that receives an array of numbers and returns an array containing only the positive numbers 105 | function getPositives(ar) { 106 | var ar2 = []; 107 | 108 | for (var i = 0; i < ar.length; i++) { 109 | var el = ar[i]; 110 | 111 | if (el >= 0) { 112 | ar2.push(el); 113 | } 114 | } 115 | 116 | return ar2; 117 | } 118 | 119 | var ar = [-5, 10, -3, 12, -9, 5, 90, 0, 1]; 120 | var ar2 = getPositives(ar); 121 | 122 | console.log(ar2); 123 | 124 | // Coding challenge #12: Create a function that receives an array of numbers and returns an array containing only the positive numbers 125 | function getPositives(ar) { 126 | var ar2 = []; 127 | 128 | for (var el of ar) { 129 | if (el >= 0) { 130 | ar2.push(el); 131 | } 132 | } 133 | 134 | return ar2; 135 | } 136 | 137 | var ar = [-5, 10, -3, 12, -9, 5, 90, 0, 1]; 138 | var ar2 = getPositives(ar); 139 | 140 | console.log(ar2); 141 | 142 | // Coding challenge #12: Create a function that receives an array of numbers and returns an array containing only the positive numbers 143 | function getPositives(ar) { 144 | return ar.filter(el => el >= 0); 145 | } 146 | 147 | var ar = [-5, 10, -3, 12, -9, 5, 90, 0, 1]; 148 | var ar2 = getPositives(ar); 149 | console.log(ar2); 150 | 151 | // Coding challenge #13: Find the maximum number in an array of numbers 152 | function findMax(ar) { 153 | var max = ar[0]; 154 | 155 | for (var i = 0; i < ar.length; i++) { 156 | if (ar[i] > max) { 157 | max = ar[i]; 158 | } 159 | } 160 | 161 | return max; 162 | } 163 | 164 | var ar = [-5, 10, -3, 12, -9, 5, 90, 0, 1]; 165 | var max = findMax(ar); 166 | console.log("Max: ", max); 167 | // Coding challenge #14: Print the first 10 Fibonacci numbers without recursion 168 | var f0 = 0; 169 | console.log(f0); 170 | 171 | var f1 = 1; 172 | console.log(f1); 173 | 174 | for (var i = 2; i < 10; i++) { 175 | var fi = f1 + f0; 176 | console.log(fi); 177 | 178 | f0 = f1; 179 | f1 = fi; 180 | } 181 | 182 | // Coding challenge #15: Create a function that will find the nth Fibonacci number using recursion 183 | function findFibonacci(n) { 184 | if (n == 0) 185 | return 0; 186 | 187 | if (n == 1) 188 | return 1; 189 | 190 | return findFibonacci(n - 1) + findFibonacci(n - 2); 191 | } 192 | 193 | var n = findFibonacci(10); 194 | console.log(n); 195 | 196 | // Coding challenge #16: Create a function that will return a Boolean specifying if a number is prime 197 | function isPrime(n) { 198 | if (n < 2) 199 | return false; 200 | 201 | if (n == 2) 202 | return true; 203 | 204 | var maxDiv = Math.sqrt(n); 205 | 206 | for (var i = 2; i <= maxDiv; i++) { 207 | if (n % i == 0) { 208 | return false; 209 | } 210 | } 211 | 212 | return true; 213 | } 214 | 215 | console.log(2, " is prime? ", isPrime(2)); 216 | console.log(3, " is prime? ", isPrime(3)); 217 | console.log(4, " is prime? ", isPrime(4)); 218 | console.log(5, " is prime? ", isPrime(5)); 219 | console.log(9, " is prime? ", isPrime(9)); 220 | 221 | // Coding challenge #17: Calculate the sum of digits of a positive integer number 222 | function sumDigits(n) { 223 | var s = n.toString(); 224 | var sum = 0; 225 | 226 | for (var char of s) { 227 | var digit = parseInt(char); 228 | sum += digit; 229 | } 230 | 231 | return sum; 232 | } 233 | 234 | var sum = sumDigits(1235231); 235 | console.log("Sum: ", sum); 236 | 237 | // Coding challenge #18: Print the first 100 prime numbers 238 | printPrimes(100); 239 | 240 | // Function prints the first nPrimes numbers 241 | function printPrimes(nPrimes) { 242 | var n = 0; 243 | var i = 2; 244 | 245 | while (n < nPrimes) { 246 | if (isPrime(i)) { 247 | console.log(n, " --> ", i); 248 | n++; 249 | } 250 | 251 | i++; 252 | } 253 | } 254 | 255 | 256 | // Returns true if a number is prime 257 | function isPrime(n) { 258 | if (n < 2) 259 | return false; 260 | 261 | if (n == 2) 262 | return true; 263 | 264 | var maxDiv = Math.sqrt(n); 265 | 266 | for (var i = 2; i <= maxDiv; i++) { 267 | if (n % i == 0) { 268 | return false; 269 | } 270 | } 271 | 272 | return true; 273 | } 274 | // Coding challenge #19: Create a function that will return in an array the first "nPrimes" prime numbers greater than a particular number "startAt" 275 | console.log(getPrimes(10, 100)); 276 | 277 | function getPrimes(nPrimes, startAt) { 278 | var ar = []; 279 | 280 | var i = startAt; 281 | 282 | while (ar.length < nPrimes) { 283 | if (isPrime(i)) { 284 | ar.push(i); 285 | } 286 | 287 | i++; 288 | } 289 | 290 | return ar; 291 | } 292 | 293 | // Returns true if a number is prime 294 | function isPrime(n) { 295 | if (n < 2) 296 | return false; 297 | 298 | if (n == 2) 299 | return true; 300 | 301 | var maxDiv = Math.sqrt(n); 302 | 303 | for (var i = 2; i <= maxDiv; i++) { 304 | if (n % i == 0) { 305 | return false; 306 | } 307 | } 308 | 309 | return true; 310 | } 311 | 312 | // Coding challenge #20: Rotate an array to the left 1 position 313 | var ar = [1, 2, 3]; 314 | rotateLeft(ar); 315 | console.log(ar); 316 | 317 | function rotateLeft(ar) { 318 | var first = ar.shift(); 319 | ar.push(first); 320 | } 321 | 322 | // Coding challenge #21: Rotate an array to the right 1 position 323 | var ar = [1, 2, 3]; 324 | rotateRight(ar); 325 | console.log(ar); 326 | 327 | function rotateRight(ar) { 328 | var last = ar.pop(); 329 | ar.unshift(last); 330 | } 331 | // Coding challenge #22: Reverse an array 332 | var ar = [1, 2, 3]; 333 | var ar2 = reverseArray(ar); 334 | console.log(ar2); 335 | 336 | function reverseArray(ar) { 337 | var ar2 = []; 338 | 339 | for (var i = ar.length - 1; i >= 0; i--) { 340 | ar2.push(ar[i]); 341 | } 342 | 343 | return ar2; 344 | } 345 | // Coding challenge #23: Reverse a string 346 | var s = reverseString("JavaScript"); 347 | console.log(s); 348 | 349 | function reverseString(s) { 350 | var s2 = ""; 351 | 352 | for (var i = s.length - 1; i >= 0; i--) { 353 | var char = s[i]; 354 | s2 += char; 355 | } 356 | 357 | return s2; 358 | } 359 | 360 | // Coding challenge #24: Create a function that will merge two arrays and return the result as a new array 361 | var ar1 = [1, 2, 3]; 362 | var ar2 = [4, 5, 6]; 363 | 364 | var ar = mergeArrays(ar1, ar2); 365 | console.log(ar); 366 | 367 | function mergeArrays(ar1, ar2) { 368 | var ar = []; 369 | 370 | for (let el of ar1) { 371 | ar.push(el); 372 | } 373 | 374 | for (let el of ar2) { 375 | ar.push(el); 376 | } 377 | 378 | return ar; 379 | } 380 | 381 | // Coding challenge #25: Create a function that will receive two arrays of numbers as arguments and return an array composed of all the numbers that are either in the first array or second array but not in both 382 | var ar1 = [1, 2, 3, 10, 5, 3, 14]; 383 | var ar2 = [1, 4, 5, 6, 14]; 384 | 385 | var ar = mergeExclusive(ar1, ar2); 386 | console.log(ar); 387 | 388 | function mergeExclusive(ar1, ar2) { 389 | var ar = []; 390 | 391 | for (let el of ar1) { 392 | if (!ar2.includes(el)) { 393 | ar.push(el); 394 | } 395 | } 396 | 397 | for (let el of ar2) { 398 | if (!ar1.includes(el)) { 399 | ar.push(el); 400 | } 401 | } 402 | 403 | return ar; 404 | } 405 | 406 | // Coding challenge #26: Create a function that will receive two arrays and will return an array with elements that are in the first array but not in the second 407 | var ar1 = [1, 2, 3, 10, 5, 3, 14]; 408 | var ar2 = [-1, 4, 5, 6, 14]; 409 | 410 | var ar = mergeLeft(ar1, ar2); 411 | console.log(ar); 412 | 413 | function mergeLeft(ar1, ar2) { 414 | var ar = []; 415 | 416 | for (let el of ar1) { 417 | if (!ar2.includes(el)) { 418 | ar.push(el); 419 | } 420 | } 421 | 422 | return ar; 423 | } 424 | // Coding challenge #27: Create a function that will receive an array of numbers as argument and will return a new array with distinct elements 425 | // Solution 1 426 | var ar = getDistinctElements([1, 2, 3, 6, -1, 2, 9, 7, 10, -1, 100]); 427 | console.log(ar); 428 | 429 | function getDistinctElements(ar) { 430 | var ar2 = []; 431 | 432 | for (let i = 0; i < ar.length; i++) { 433 | if (!isInArray(ar[i], ar2)) { 434 | ar2.push(ar[i]); 435 | } 436 | } 437 | 438 | return ar2; 439 | } 440 | 441 | function isInArray(n, ar) { 442 | for (let i = 0; i < ar.length; i++) { 443 | if (ar[i] === n) 444 | return true; 445 | } 446 | 447 | return false; 448 | } 449 | 450 | // Solution 2 451 | var ar = getDistinctElements([1, 2, 3, 6, -1, 2, 9, 7, 10, -1, 100]); 452 | console.log(ar); 453 | 454 | function getDistinctElements(ar) { 455 | var ar2 = []; 456 | 457 | var lastIndex = ar.length - 1; 458 | 459 | for (let i = 0; i <= lastIndex; i++) { 460 | if (!isInArray(ar[i], ar, i + 1, lastIndex)) { 461 | ar2.push(ar[i]); 462 | } 463 | } 464 | 465 | return ar2; 466 | } 467 | 468 | function isInArray(n, ar, fromIndex, toIndex) { 469 | for (var i = fromIndex; i <= toIndex; i++) { 470 | if (ar[i] === n) 471 | return true; 472 | } 473 | 474 | return false; 475 | } 476 | 477 | // Coding challenge #28: Calculate the sum of first 100 prime numbers 478 | var n = 10; 479 | console.log("Sum of first ", n, " primes is ", sumPrimes(10)); 480 | 481 | function sumPrimes(n) { 482 | var foundPrimes = 0; 483 | var i = 2; 484 | var sum = 0; 485 | 486 | while (foundPrimes < n) { 487 | if (isPrime(i)) { 488 | foundPrimes++; 489 | sum += i; 490 | } 491 | 492 | i++; 493 | } 494 | 495 | return sum; 496 | } 497 | 498 | // Returns true if number n is prime 499 | function isPrime(n) { 500 | if (n < 2) 501 | return false; 502 | 503 | if (n == 2) 504 | return true; 505 | 506 | var maxDiv = Math.sqrt(n); 507 | 508 | for (var i = 2; i <= maxDiv; i++) { 509 | if (n % i === 0) { 510 | return false; 511 | } 512 | } 513 | 514 | return true; 515 | } 516 | 517 | // Coding challenge #29: Print the distance between the first 100 prime numbers 518 | printDistances(100); 519 | 520 | // Print distances between the first n prime numbers 521 | function printDistances(n) { 522 | var lastPrime = 2; 523 | var i = lastPrime + 1; 524 | var foundPrimes = 1; 525 | 526 | while (foundPrimes < n) { 527 | if (isPrime(i)) { 528 | console.log(i - lastPrime, "\t", i, " - ", lastPrime); 529 | 530 | foundPrimes++; 531 | lastPrime = i; 532 | } 533 | 534 | i++; 535 | } 536 | } 537 | 538 | // Returns true if number n is prime 539 | function isPrime(n) { 540 | if (n < 2) 541 | return false; 542 | 543 | if (n == 2) 544 | return true; 545 | 546 | var maxDiv = Math.sqrt(n); 547 | 548 | for (var i = 2; i <= maxDiv; i++) { 549 | if (n % i === 0) { 550 | return false; 551 | } 552 | } 553 | 554 | return true; 555 | } 556 | 557 | // Coding challenge #30-a: Create a function that will add two positive numbers of indefinite size. The numbers are received as strings and the result should be also provided as string. 558 | // Solution 1 559 | var n1 = "2909034221912398942349"; 560 | var n2 = "1290923909029309499"; 561 | var sum = add(n1, n2); 562 | 563 | console.log(n1, "\n", n2, "\n", sum); 564 | 565 | function add(sNumber1, sNumber2) { 566 | var s = ""; 567 | var carry = 0; 568 | 569 | var maxSize = Math.max(sNumber1.length, sNumber2.length); 570 | 571 | for (var i = 0; i < maxSize; i++) { 572 | var digit1 = digitFromRight(sNumber1, i); 573 | var digit2 = digitFromRight(sNumber2, i); 574 | 575 | var sum = digit1 + digit2 + carry; 576 | var digitSum = sum % 10; 577 | carry = sum >= 10 ? 1 : 0; 578 | 579 | s = digitSum.toString() + s; 580 | } 581 | 582 | if (carry > 0) 583 | s = carry + s; 584 | 585 | return s; 586 | } 587 | 588 | function digitFromRight(s, digitNo) { 589 | if (digitNo >= s.length) 590 | return 0; 591 | 592 | var char = s[s.length - 1 - digitNo]; 593 | return parseInt(char); 594 | } 595 | 596 | // Solution 2 597 | 598 | var n1 = "2909034221912398942349"; 599 | var n2 = "1290923909029309499"; 600 | var sum = add(n1, n2); 601 | 602 | console.log(n1); 603 | console.log(n2); 604 | console.log(sum); 605 | 606 | function add(sNumber1, sNumber2) { 607 | var maxSize = Math.max(sNumber1.length, sNumber2.length); 608 | 609 | var s1 = sNumber1.padStart(maxSize, "0"); 610 | var s2 = sNumber2.padStart(maxSize, "0"); 611 | 612 | var s = ""; 613 | var carry = 0; 614 | 615 | for (var i = maxSize - 1; i >= 0; i--) { 616 | var digit1 = parseInt(s1[i]); 617 | var digit2 = parseInt(s2[i]); 618 | 619 | var sum = digit1 + digit2 + carry; 620 | var digitSum = sum % 10; 621 | carry = sum >= 10 ? 1 : 0; 622 | 623 | s = digitSum.toString() + s; 624 | } 625 | 626 | if (carry > 0) 627 | s = carry + s; 628 | 629 | return s; 630 | } 631 | 632 | // Coding challenge #31a. Create a function that will return the number of words in a text 633 | // Solution 1 634 | function countWords(text) { 635 | var wasSeparator = true; 636 | var words = 0; 637 | 638 | for (var c of text) { 639 | // if current character is separator then advance and 640 | // set that the previous character was separator 641 | if (isSeparator(c)) { 642 | wasSeparator = true; 643 | continue; 644 | } 645 | 646 | // if current character is not separator 647 | // ... but if previous was separator... 648 | if (wasSeparator) { 649 | words++; 650 | wasSeparator = false; 651 | } 652 | } 653 | 654 | return words; 655 | } 656 | 657 | function isSeparator(c) { 658 | var separators = [" ", "\t", "\n", "\r", ",", ";", ".", "!", "?"]; 659 | return separators.includes(c); 660 | } 661 | 662 | console.log(countWords("")); 663 | console.log(countWords(" ")); 664 | console.log(countWords("JavaScript!!! ")); 665 | console.log(countWords(" JavaScript")); 666 | console.log(countWords(" JavaScript is cool ")); 667 | console.log(countWords("I like to learn JavaScript with Lead Educare")); 668 | 669 | // Solution 2 670 | 671 | function countWords(text) { 672 | var words = 0; 673 | 674 | if (text.length > 0 && !isSeparator(text[0])) 675 | words++; 676 | 677 | for (var i = 1; i < text.length; i++) { 678 | var currChr = text[i]; 679 | var prevChr = text[i - 1]; 680 | 681 | if (!isSeparator(currChr) && isSeparator(prevChr)) { 682 | words++; 683 | } 684 | } 685 | 686 | return words; 687 | } 688 | 689 | function isSeparator(c) { 690 | var separators = [" ", "\t", "\n", "\r", ",", ";", ".", "!", "?"]; 691 | return separators.includes(c); 692 | } 693 | 694 | console.log(countWords("")); 695 | console.log(countWords(" ")); 696 | console.log(countWords("JavaScript!!! ")); 697 | console.log(countWords(" JavaScript")); 698 | console.log(countWords(" JavaScript is cool ")); 699 | console.log(countWords("I like to learn JavaScript with Lead Educare")); 700 | 701 | // Coding challenge #32. Create a function that will capitalize the first letter of each word in a text 702 | 703 | console.log(captializeWords("Create a function that will capitalize the first letter of each word in a text")); 704 | 705 | function captializeWords(text) { 706 | var text2 = ""; 707 | 708 | for (var i = 0; i < text.length; i++) { 709 | var currChr = text[i]; 710 | var prevChr = i > 0 ? text[i - 1] : " "; 711 | 712 | if (!isSeparator(currChr) && isSeparator(prevChr)) { 713 | currChr = currChr.toUpperCase(); 714 | } 715 | 716 | text2 += currChr; 717 | } 718 | 719 | return text2; 720 | } 721 | 722 | function isSeparator(c) { 723 | var separators = [" ", "\t", "\n", "\r", ",", ";", ".", "!", "?"]; 724 | return separators.includes(c); 725 | } 726 | 727 | // Coding challenge #33. Calculate the sum of numbers received in a comma delimited string 728 | console.log(sumCSV("1.5, 2.3, 3.1, 4, 5.5, 6, 7, 8, 9, 10.9")); 729 | 730 | function sumCSV(s) { 731 | var ar = s.split(","); 732 | 733 | var sum = 0; 734 | 735 | for (var n of ar) { 736 | sum += parseFloat(n); 737 | } 738 | 739 | return sum; 740 | } 741 | 742 | // Coding challenge #34. Create a function that will return an array with words inside a text 743 | 744 | var text = "Create a function, that will return an array (of string), with the words inside the text"; 745 | 746 | console.log(getWords(text)); 747 | 748 | function getWords(text) { 749 | let startWord = -1; 750 | let ar = []; 751 | 752 | for (let i = 0; i <= text.length; i++) { 753 | let c = i < text.length ? text[i] : " "; 754 | 755 | if (!isSeparator(c) && startWord < 0) { 756 | startWord = i; 757 | } 758 | 759 | if (isSeparator(c) && startWord >= 0) { 760 | let word = text.substring(startWord, i); 761 | ar.push(word); 762 | 763 | startWord = -1; 764 | } 765 | } 766 | 767 | return ar; 768 | } 769 | 770 | function isSeparator(c) { 771 | var separators = [" ", "\t", "\n", "\r", ",", ";", ".", "!", "?", "(", ")"]; 772 | return separators.includes(c); 773 | } 774 | 775 | // Coding challenge #35. Create a function to convert a CSV text to a “bi-dimensional” array 776 | 777 | var data = "John;Smith;954-000-0000\nMich;Tiger;305-000-0000\nMonique;Vasquez;103-000-0000"; 778 | 779 | var ar = csvToArray(data); 780 | console.log(JSON.stringify(ar)); 781 | 782 | function csvToArray(data) { 783 | var arLines = data.split("\n"); 784 | 785 | for (var i = 0; i < arLines.length; i++) { 786 | var arLine = arLines[i].split(";"); 787 | arLines[i] = arLine; 788 | } 789 | 790 | return arLines; 791 | } 792 | // Coding challenge #36. Create a function that converts a string to an array of characters 793 | console.log(getChars("I like JavaScript")); 794 | 795 | function getChars(s) { 796 | return Array.from(s); 797 | } 798 | 799 | // Coding challenge #37. Create a function that will convert a string in an array containing the ASCII codes of each character 800 | console.log(getCharCodes("I like JavaScript")); 801 | 802 | function getCharCodes(s) { 803 | var ar = []; 804 | 805 | for (var i = 0; i < s.length; i++) { 806 | var code = s.charCodeAt(i); 807 | ar.push(code); 808 | } 809 | 810 | return ar; 811 | } 812 | // Coding challenge #38. Create a function that will convert an array containing ASCII codes in a string 813 | console.log(codesToString([73, 32, 108, 105, 107, 101, 32, 74, 97, 118, 97, 83, 99, 114, 105, 112, 116])); 814 | 815 | function codesToString(ar) { 816 | return String.fromCharCode(...ar); 817 | } 818 | 819 | // Coding challenge #39. Implement the Caesar cypher 820 | var text = "I LOVE JAVASCRIPT"; 821 | var textEnc = encrypt(text, 13); 822 | var textDec = decrypt(textEnc, 13); 823 | 824 | console.log(text); 825 | console.log(textEnc); 826 | console.log(textDec); 827 | 828 | // Decrypt a message by using the same encrypt function 829 | // ... but using the inverse of the key (e.g. rotate in the other direction) 830 | function decrypt(msg, key) { 831 | return encrypt(msg, key * -1); 832 | } 833 | 834 | // Function will implement Caesar Cipher to 835 | // encrypt / decrypt the msg by shifting the letters 836 | // of the message acording to the key 837 | function encrypt(msg, key) { 838 | var encMsg = ""; 839 | 840 | for (var i = 0; i < msg.length; i++) { 841 | var code = msg.charCodeAt(i); 842 | 843 | // Encrypt only letters in 'A' ... 'Z' interval 844 | if (code >= 65 && code <= 65 + 26 - 1) { 845 | code -= 65; 846 | code = mod(code + key, 26); 847 | code += 65; 848 | } 849 | 850 | encMsg += String.fromCharCode(code); 851 | } 852 | 853 | return encMsg; 854 | } 855 | 856 | 857 | // Modulo function: n mod p 858 | function mod(n, p) { 859 | if (n < 0) 860 | n = p - Math.abs(n) % p; 861 | 862 | return n % p; 863 | } 864 | 865 | // Coding challenge #40. Implement the bubble sort algorithm for an array of numbers 866 | var ar = [23, 1000, 1, -1, 8, 3]; 867 | console.log(ar); 868 | bubbleSort(ar); 869 | console.log(ar); 870 | 871 | function bubbleSort(ar) { 872 | var shouldSort = true; 873 | var length = ar.length; 874 | 875 | while (shouldSort) { 876 | shouldSort = false; 877 | length--; 878 | 879 | for (var i = 0; i < length; i++) { 880 | var a = ar[i]; 881 | if (a > ar[i + 1]) { 882 | ar[i] = ar[i + 1]; 883 | ar[i + 1] = a; 884 | shouldSort = true; 885 | } 886 | } 887 | } 888 | } 889 | // Coding challenge #41. Create a function to calculate the distance between two points defined by their x, y coordinates 890 | console.log(getDistance(100, 100, 400, 300)); 891 | 892 | function getDistance(x1, y1, x2, y2) { 893 | var l1 = x2 - x1; 894 | var l2 = y2 - y1; 895 | 896 | return Math.sqrt(l1 * l1 + l2 * l2); 897 | } 898 | 899 | // Coding challenge #42. Create a function that will return a Boolean value indicating if two circles defined by center coordinates and radius are intersecting 900 | console.log(collisionCircleCircle(200, 200, 100, 300, 300, 50)); 901 | 902 | function collisionCircleCircle(circle1X, circle1Y, circle1R, circle2X, circle2Y, circle2R) { 903 | return getDistance(circle1X, circle1Y, circle2X, circle2Y) <= circle1R + circle2R; 904 | } 905 | 906 | // Calculate the distance between the two specified points 907 | function getDistance(x1, y1, x2, y2) { 908 | var l1 = x2 - x1; 909 | var l2 = y2 - y1; 910 | 911 | return Math.sqrt(l1 * l1 + l2 * l2); 912 | } 913 | 914 | // Coding challenge 43. Create a function that will receive a bi-dimensional array as argument and a number and will extract as a unidimensional array the column specified by the number 915 | var ar = [["John", 120], 916 | ["Jane", 115], 917 | ["Thomas", 123], 918 | ["Mel", 112], 919 | ["Charley", 122] 920 | ]; 921 | 922 | var numbers = extractCol(ar, 1); 923 | console.log(numbers); 924 | 925 | function extractCol(ar, colNo) { 926 | var arCol = []; 927 | 928 | for (var i = 0; i < ar.length; i++) { 929 | arCol.push(ar[i][colNo]); 930 | } 931 | 932 | return arCol; 933 | } 934 | // Coding challenge #44. Create a function that will convert a string containing a binary number into a number 935 | console.log(binaryToNumber("11111111")); 936 | 937 | function binaryToNumber(sBinary) { 938 | return parseInt(sBinary, 2); 939 | } 940 | // Coding challenge #45. Create a function to calculate the sum of all the numbers in a jagged array (array contains numbers or other arrays of numbers on an unlimited number of levels) 941 | var ar = [1, 2, [15, [23], [5, 12]], [100]]; 942 | 943 | console.log(sumArray(ar)); 944 | 945 | function sumArray(ar) { 946 | var sum = 0; 947 | 948 | for (var el of ar) { 949 | if (Array.isArray(el)) { 950 | el = sumArray(el); 951 | } 952 | 953 | sum += el; 954 | } 955 | 956 | return sum; 957 | } 958 | 959 | // Coding challenge #46-a. Find the maximum number in a jagged array of numbers or array of numbers 960 | // Solution 1 961 | 962 | var ar = [2, 4, 10, [12, 4, [100, 99], 4], [3, 2, 99], 0]; 963 | 964 | var max = findMax(ar); 965 | console.log("Max = ", max); 966 | 967 | // Use recursion to find the maximum numeric value in an array of arrays 968 | function findMax(ar) { 969 | var max = -Infinity; 970 | 971 | // Cycle through all the elements of the array 972 | for (var i = 0; i < ar.length; i++) { 973 | var el = ar[i]; 974 | 975 | // If an element is of type array then invoke the same function 976 | // to find out the maximum element of that subarray 977 | if (Array.isArray(el)) { 978 | el = findMax(el); 979 | } 980 | 981 | if (el > max) { 982 | max = el; 983 | } 984 | } 985 | return max; 986 | } 987 | 988 | // Solution 2 989 | 990 | var ar = [2, 4, 10, [12, 4, [100, 99], 4], [3, 2, 99], 0]; 991 | 992 | var max = findMax(ar); 993 | console.log("Max = ", max); 994 | 995 | // Use a stack to find the maximum numeric value in an array of arrays 996 | function findMax(arElements) { 997 | var max = -Infinity; 998 | 999 | // This is the stack on which will put the first array and then 1000 | // all the other sub-arrays that we find as we traverse an array 1001 | var arrays = []; 1002 | 1003 | arrays.push(arElements); 1004 | 1005 | // Loop as long as are arrays added to the stack for processing 1006 | while (arrays.length > 0) { 1007 | // Extract an array from the stack 1008 | ar = arrays.pop(); 1009 | 1010 | // ... and loop through its elements 1011 | for (var i = 0; i < ar.length; i++) { 1012 | var el = ar[i]; 1013 | 1014 | // If an element is of type array, we'll add it to stack 1015 | // to be processed later 1016 | if (Array.isArray(el)) { 1017 | arrays.push(el); 1018 | continue; 1019 | } 1020 | 1021 | if (el > max) { 1022 | max = el; 1023 | } 1024 | } 1025 | } 1026 | 1027 | return max; 1028 | } 1029 | 1030 | // Coding challenge #47. Deep copy a jagged array with numbers or other arrays in a new array 1031 | var ar1 = [2, 4, 10, [12, 4, [100, 99], 4], [3, 2, 99], 0]; 1032 | var ar2 = copyArray(ar1); 1033 | 1034 | console.log(ar2); 1035 | 1036 | function copyArray(ar) { 1037 | var ar2 = []; 1038 | 1039 | for (var el of ar) { 1040 | if (Array.isArray(el)) { 1041 | el = copyArray(el); 1042 | } 1043 | 1044 | ar2.push(el); 1045 | } 1046 | 1047 | return ar2; 1048 | } 1049 | 1050 | // Coding challenge #48. Create a function to return the longest word(s) in a string 1051 | 1052 | var text = "Create a function to return the longest word(s) in a sentance."; 1053 | 1054 | console.log(getLongestWords(text)); 1055 | 1056 | function getLongestWords(text) { 1057 | var words = getWords(text); 1058 | 1059 | var maxSize = 0; 1060 | var maxPositions = []; 1061 | 1062 | for (var i = 0; i < words.length; i++) { 1063 | var currWordSize = words[i].length; 1064 | 1065 | if (currWordSize > maxSize) { 1066 | maxSize = currWordSize; 1067 | maxPositions = [i]; 1068 | } 1069 | else if (currWordSize === maxSize) { 1070 | maxPositions.push(i); 1071 | } 1072 | } 1073 | 1074 | return getElements(words, maxPositions); 1075 | } 1076 | 1077 | // Get only the elements from specified positions from the array 1078 | function getElements(ar, arPositions) { 1079 | var arNew = []; 1080 | 1081 | for (var pos of arPositions) { 1082 | arNew.push(ar[pos]); 1083 | } 1084 | 1085 | return arNew; 1086 | } 1087 | 1088 | // Returns an array with the words from specified text 1089 | function getWords(text) { 1090 | let startWord = -1; 1091 | let ar = []; 1092 | 1093 | for (let i = 0; i <= text.length; i++) { 1094 | let c = i < text.length ? text[i] : " "; 1095 | 1096 | if (!isSeparator(c) && startWord < 0) { 1097 | startWord = i; 1098 | } 1099 | 1100 | if (isSeparator(c) && startWord >= 0) { 1101 | let word = text.substring(startWord, i); 1102 | ar.push(word); 1103 | 1104 | startWord = -1; 1105 | } 1106 | } 1107 | 1108 | return ar; 1109 | } 1110 | 1111 | function isSeparator(c) { 1112 | var separators = [" ", "\t", "\n", "\r", ",", ";", ".", "!", "?", "(", ")"]; 1113 | return separators.includes(c); 1114 | } 1115 | 1116 | // Coding challenge #49. Shuffle an array of strings 1117 | var ar = ["Shuffle", "an", "array", "of", "strings"]; 1118 | 1119 | console.log(shuffleArray(ar)); 1120 | 1121 | // Shuffle array implemented using Fisher–Yates shuffle algorithm 1122 | function shuffleArray(ar) { 1123 | for (var i = ar.length - 1; i > 0; i--) { 1124 | var j = randomInt(0, i - 1); 1125 | 1126 | var t = ar[i]; 1127 | ar[i] = ar[j]; 1128 | ar[j] = t; 1129 | } 1130 | 1131 | return ar; 1132 | } 1133 | 1134 | // Get a random int between min and max (both included) 1135 | function randomInt(min, max) { 1136 | return Math.floor(Math.random() * (max - min + 1)) + min; 1137 | } 1138 | 1139 | // Coding challenge #50. Create a function that will receive n as argument and return an array of n unique random numbers from 1 to n. 1140 | console.log(getRandomNumbers(10)); 1141 | 1142 | function getRandomNumbers(n) { 1143 | var ar = []; 1144 | 1145 | for (var i = 1; i <= n; i++) { 1146 | ar.push(i); 1147 | } 1148 | 1149 | shuffleArray(ar); 1150 | 1151 | return ar; 1152 | } 1153 | 1154 | // Shuffle array implemented using Fisher–Yates shuffle algorithm 1155 | function shuffleArray(ar) { 1156 | for (var i = ar.length - 1; i > 0; i--) { 1157 | var j = randomInt(0, i - 1); 1158 | 1159 | var t = ar[i]; 1160 | ar[i] = ar[j]; 1161 | ar[j] = t; 1162 | } 1163 | 1164 | return ar; 1165 | } 1166 | 1167 | // Get a random int between min and max (both included) 1168 | function randomInt(min, max) { 1169 | return Math.floor(Math.random() * (max - min + 1)) + min; 1170 | } 1171 | 1172 | // Coding challenge #51. Find the frequency of characters inside a string. Return the result as an array of objects. Each object has 2 fields: character and number of occurrences. 1173 | 1174 | var ar = getCharFrequency("Find the frequency of characters inside a string"); 1175 | console.log(JSON.stringify(ar)); 1176 | 1177 | function getCharFrequency(text) { 1178 | var ar = []; 1179 | 1180 | for (var chr of text) { 1181 | updateFrequency(ar, chr); 1182 | } 1183 | 1184 | return ar; 1185 | } 1186 | 1187 | function updateFrequency(ar, chr) { 1188 | for (var el of ar) { 1189 | if (el.chr === chr) { 1190 | el.count++; 1191 | } 1192 | } 1193 | 1194 | ar.push({ chr: chr, count: 1 }); 1195 | } 1196 | 1197 | // Coding challenge #52. Calculate Fibonacci(500) with high precision (all decimals) 1198 | console.log(fibonacci(500)); 1199 | 1200 | function fibonacci(n) { 1201 | if (n === 0) 1202 | return "0"; 1203 | 1204 | if (n === 1) 1205 | return "1"; 1206 | 1207 | var n1 = "0"; 1208 | var n2 = "1"; 1209 | 1210 | for (var i = 2; i <= n; i++) { 1211 | var sum = add(n1, n2); 1212 | 1213 | n1 = n2; 1214 | n2 = sum; 1215 | } 1216 | 1217 | return n2; 1218 | } 1219 | 1220 | function add(sNumber1, sNumber2) { 1221 | var maxSize = Math.max(sNumber1.length, sNumber2.length); 1222 | 1223 | var s1 = sNumber1.padStart(maxSize, "0"); 1224 | var s2 = sNumber2.padStart(maxSize, "0"); 1225 | 1226 | var s = ""; 1227 | var carry = 0; 1228 | 1229 | for (var i = maxSize - 1; i >= 0; i--) { 1230 | var digit1 = parseInt(s1[i]); 1231 | var digit2 = parseInt(s2[i]); 1232 | 1233 | var sum = digit1 + digit2 + carry; 1234 | var digitSum = sum % 10; 1235 | carry = sum >= 10 ? 1 : 0; 1236 | 1237 | s = digitSum.toString() + s; 1238 | } 1239 | 1240 | if (carry > 0) 1241 | s = carry + s; 1242 | 1243 | return s; 1244 | } 1245 | // Coding challenge #53. Calculate 70! with high precision (all digits) 1246 | console.log(factorial(70)); 1247 | 1248 | // Calculate factorial(n) ... using big number calculations 1249 | function factorial(n) { 1250 | var prod = "1"; 1251 | 1252 | for (var i = 2; i <= n; i++) { 1253 | prod = mult(prod, i.toString()); 1254 | } 1255 | 1256 | return prod; 1257 | } 1258 | 1259 | // Multiplies sNumber1 * sNumber2 1260 | // Each number is provided as string 1261 | function mult(sNumber1, sNumber2) { 1262 | // Calculate partial results according to multiplication algorithm 1263 | var partialResults = []; 1264 | 1265 | for (var i = sNumber2.length - 1; i >= 0; i--) { 1266 | var digit = parseInt(sNumber2[i]); 1267 | 1268 | var partialResult = multDigit(sNumber1, digit); 1269 | partialResult += "0".repeat(partialResults.length); 1270 | 1271 | partialResults.push(partialResult); 1272 | } 1273 | 1274 | // Sum partial results to obtain the product 1275 | var sum = ""; 1276 | 1277 | for (var r of partialResults) { 1278 | sum = add(sum, r); 1279 | } 1280 | 1281 | return sum; 1282 | } 1283 | 1284 | // Multiplies number sNumber (as string) with a single digit number 1285 | function multDigit(sNumber, digit) { 1286 | var p = ""; 1287 | var carry = 0; 1288 | 1289 | for (var i = sNumber.length - 1; i >= 0; i--) { 1290 | var numberDigit = parseInt(sNumber[i]); 1291 | 1292 | var prod = digit * numberDigit + carry; 1293 | var prodDigit = prod % 10; 1294 | carry = Math.floor(prod / 10); 1295 | 1296 | p = prodDigit.toString() + p; 1297 | } 1298 | 1299 | if (carry > 0) 1300 | p = carry + p; 1301 | 1302 | return p; 1303 | } 1304 | 1305 | function add(sNumber1, sNumber2) { 1306 | var maxSize = Math.max(sNumber1.length, sNumber2.length); 1307 | 1308 | var s1 = sNumber1.padStart(maxSize, "0"); 1309 | var s2 = sNumber2.padStart(maxSize, "0"); 1310 | 1311 | var s = ""; 1312 | var carry = 0; 1313 | 1314 | for (var i = maxSize - 1; i >= 0; i--) { 1315 | var digit1 = parseInt(s1[i]); 1316 | var digit2 = parseInt(s2[i]); 1317 | 1318 | var sum = digit1 + digit2 + carry; 1319 | var digitSum = sum % 10; 1320 | carry = sum >= 10 ? 1 : 0; 1321 | 1322 | s = digitSum.toString() + s; 1323 | } 1324 | 1325 | if (carry > 0) 1326 | s = carry + s; 1327 | 1328 | return s; 1329 | } 1330 | --------------------------------------------------------------------------------