Intermediate Algorithm Scripting - Challenges

 

Tantangan algoritma tingkat menengah dengan javascript ini, saya dapat dan saya terjemahkan kedalam bahasa indonesia dari website freecodecamp.org. Pada tantangan kali ini, kita akan melatih logika kita untuk menyelesaikan suatu masalah dengan bahasa pemograman javascript. Tanpa basa-basi mari kita mulai!

1. Sum All Numbers in a Range (Menjumlahkan semua angka dalam rentang array)

Tantangan pertama adalah menjumlahkan semua angka diantara dua angka yang ada di dalam sebuah array. contoh function sumAll ([4, 1]), terdapat sebuah argument yang berisi array yaitu 4 dan 1. Tugas kita adalah menjumlahkan angka pada rentang dua angka tersebut, yaitu 1+2+3+4 = 10. Bagaimana penerapannya dalam pemograman? mari kita mulai!
function sumAll(arr) {
  let sumBetween = 0;
  for (let i = Math.min(...arr); i <= Math.max(...arr); i++) {
    sumBetween += i;
  }
  return sumBetween;
}

console.log(sumAll([1, 4]));

Output Program : 

10

Penjelasan Kode:

  • Variable sumBetween untuk menyimpan jumlah elemen.
  • Melakukan pengulangan elemen dari minimal array yang diberikan, dan berhenti ketika mencapai elemen maksimal. 
  • Penggunaan spread operator (...arr)
Relevant Links:


2. Diff Two Array (Membandingkan dua buah array dan return array baru)

Tantangan kedua adalah membandingkan dua buah array, kemudian mengembalikan array baru yang berisi nilai dari hasil perbandingan tersebut.
function diffArray(arr1, arr2) {
  const newArr = arr1.concat(arr2).filter(item => !arr1.includes(item) || !arr2.includes(item));
  //console.log(newArr);
  return newArr;
}

diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);

Output Program : 

[4]

Penjelasan Kode:
  • Gabungkan dua buah array tersebut (arr1 dan arr2) dengan method concat()
  • Kemudian filter item yang telah digabungkan dengan kondisi jika arr1 dan arr2 tidak include di item tersebut. method yang digunakan filter() dan includes()

Relevant Links:


3. Seek and Destroy (Temukan dan hapus elemen dalam array)

Tantangan yang ketiga adalah mecari elemen dalam array kemudian hapus elemen yang sama. Contoh disini ada sebuah function destroyer([1,2,3,1,2,3], 2,3), function ini membawa argument yang berisi array. elemen [1,2,3,1,2,3] adalah array yang akan kita hapus elemennya, dan elemen 2,3 adalah parameter untuk menghapus elemen di dalam array tersebut.
function destroyer(arr, ...valsToRemove) {
  const newArray = arr.filter(elem => !valsToRemove.includes(elem));
  // console.log(newArray);
  return newArray;
}

destroyer([1, 2, 3, 1, 2, 3], 2, 3);

Output Program: 

[1,1]

Penjelasan kode:
  • Menggunakan spread operator (...valsToRemove) untuk mengambil argumen.
  • Kembalikan array yang difilter dengan include().

4. Wherefore art thou

Tantangan keempat, pada kali ini kita akan cek apakah dalam suatu objek itu mempunyai nilai yang sama? jika sama kembalikan nilai objek tersebut. contoh implementasi dalam pemograman:
function whatIsInAName(collection, source) {
  // parameter adalah : variable yg nilai nya dari argument yg di passing.
  // ada 2 parameter
  // parameter pertama collection : berisi array objek
  // parameter kedua source : berisi objek
  
  // ambil key dari parameter kedua
  var srcKeys = Object.keys(source);
  // console.log(srcKeys)

  // return isi dari parameter pertama, kemudian filter
  return collection.filter(function(obj) {
    // console.log(obj)
 
    return srcKeys.every(function(key) {
      // console.log(key)
      // jika objek mempunyai property key, dan value dari key itu sama dengan value yang ada di source, return objek
      return obj.hasOwnProperty(key) && obj[key] === source[key];
    });
  });
}

// function ini mengirimkan 2 argumen yang berisi array dan objek
whatIsInAName(
  [
    { first: "Romeo", last: "Montague" },
    { first: "Mercutio", last: null },
    { first: "Tybalt", last: "Capulet" }
  ],
  { last: "Capulet" }
);

Output Program : 

[ {first: 'Tybalt', last: 'Capulet'} ]

Penjelasan Kode :
  • Pertama kita memfilter collection  dengan method filter()
  • Kita return nilai Bollean (True atau False) untuk method filter()
  • Terkhir kita akan mengurangi nilai Bollean untuk return mehod every()  


5. Spinal Case (Menkonversikan huruf besar ke huruf kecil dan gabungin dengan - (dibaca dash))

Tantangan kelima, menggabungkan string dengan dash (-), kemudian ubah jadi huruf kecil. Implementasi dalam pemograman perhatikan contoh program dibawah ini:
function spinalCase(str) {
  // cara pertama
  // let newString = str.split(/\s|_|(?=[A-Z])/);
  // let newString2 = newString.join("-");
  // let newString3 = newString2.toLowerCase();
  // return newString3;

  // cara kedua
  return str.split(/\s|_|(?=[A-Z])/)
            .join("-")
            .toLowerCase();
}

spinalCase('This Is Spinal Tap');

Output Program : 

this-is-spinal-tap

Penjelasan Kode: 
  • Pisahkan (split) string pada salah satu kondisi berikut (dikonversi ke array)
  1. Jika ada whitespace [\s] ditemukan. 
  2. Jika ada underscore [_] ditemukan.
  3. Atau diikuti dengan huruf besar [(?=[A-Z])]
  • Join array dengan dash (-)
  • Ubah hasilnya kedalam lowercase.

6. Pig Latin 

Tantangan keenam, Pig Latin adalah cara mengubah kata yang aturannya sebagai berikut:
  • Jika sebuah kata dimulai dengan konsonan, ambil huruf pertama pindahkan di akhir kata dan tambahkan 'ay'. Contoh : consonant jadi onsonantcay
  • Jika sebuah kata dimulai dengan vokal, tambah 'way' di akhir kata. Contoh : eat menjadi eatway

Implementasi dalam pemograman sbb:
function translatePigLatin(str) {
  return str
    .replace(/^[aeiou]\w*/, "$&way")
    .replace(/(^[^aeiou]+)(\w*)/, "$2$1ay");
}

// test here
console.log(translatePigLatin("eat"));
console.log(translatePigLatin("consonant"));
console.log(translatePigLatin("pasirganting"));

Output Program :  

eatway
onsonantcay
asirgantingpay

Penjelasan Kode:
  • Gunakan replace() pada string, kemudian cek string dengan reguler expression, apakah huruf pertama adalah konsonan? jika tidak tambahkan 'way' di akhir kata.
  • Gunakan replace() lagi pada string, kemudian cek string dengan regular expression, apakah huruf pertama adalah konsonan? jika iya, ambil huruf pertama pindahkan di akhir kata dan tambahkan 'ay' di akhir kata.

7. Search and Replace

Tantangan ketujuh, Mencari kata dalam sebuah kalimat, kemudian ganti kata tersebut dengan kata yang telah disediakan dan return kalimat baru. Contoh kasus:
myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");

argument 1 : adalah kalimat untuk melakukan pencarian dan penggantian

argument 2 : adalah kata yang akan kita ganti (kata sebelumnya)

argument 3: adalah kata yang akan menggantikan kata di argument kedua (kata setelahnya)

function myReplace(str, katayangDiganti, kataPengganti) {

  // pertama kita akan mencari kata 'jumped' ada di index ke berapa
  let index = str.indexOf(katayangDiganti);
  
  // cek, apakah kata itu huruf pertamanya huruf kapital atau bukan? 
  if(str[index] === str[index].toUpperCase()){
    // jika iya, ganti huruf menjadi huruf kapital, gunakan charAt() untuk mengambil huruf pertama
    kataPengganti = kataPengganti.charAt(0).toUpperCase() + kataPengganti.slice(1);
  }else{
    // jika tidak, ganti huruf pertama menjadi huruf kecil
    kataPengganti = kataPengganti.charAt(0).toLowerCase() + kataPengganti.slice(1);
  }

  // sekarang replace kataPengganti dengan katayangDiganti, return string baru
  str = str.replace(katayangDiganti, kataPengganti);
  // console.log(str);
  return str;
}

myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");

Output Program : 

A quick brown fox leaped over the lazy dog

Penjelasan Kode:
  • Gunakan indexOf() untuk menemukan lokasi katayangDiganti dalam string
  • Cek jika huruf pertama adalah huruf besar maka ubah huruf pertama itu jadi huruf besar
  • replace katayangDiganti dengan kataPengganti
  • return string baru 

8. DNA Pairing (Pasangan DNA)

Tantangan kedelapan, mencari pasangan DNA dan return dalam bentuk array. Ada 4 karakter yang ada dalam DNA yaitu: "A", "T", "G" dan "C". 
A dan T selalu berpasangan, dan G dan C selalu berpasangan. Bagaimana cara implementasi DNA Pairing dari argumen yang di passing ke function?   
function pairElement(str) {
  //buat objek untuk pencarian pasangan
  var pasangan = {
    A : "T",
    T : "A",
    G : "C",
    C : "G"
  }

  //pisahkan (split) karakter menjadi array
  let dataArr = str.split("");

//memetakan (map) karakter ke array dan cari key di variable pasangan.
  let newArray = dataArr.map(item => [item,pasangan[item]]);

  return newArray;
}

console.log(pairElement("ATGCAG"));
Output Program :
[ [ 'A', 'T' ],
  [ 'T', 'A' ],
  [ 'G', 'C' ],
  [ 'C', 'G' ],
  [ 'A', 'T' ],
  [ 'G', 'C' ] ]


Penjelasan Kode:

  • Pertama kita akan menentukan sebuah objek dengan semua kemungkinan pasangan, ini memungkinkan kita untuk dengan mudah menemukan berdasarkan key atau value.
  • Pisahkan str menjadi array karakter, sehingga kita dapat menggunakan setiap huruf untuk menemukan pasangannya. 
  • Gunakan fungsi map(), untuk memetakan setiap karakter dalam array dan pasangannya yang cocok, dan buat array 2D.

9. Missing Letter (Menemukan huruf yang hilang)

Tantangan kesembilan, menemukan huruf yang hilang dalam rentang huruf yang ada, dan kembalikan nilainya (return). Jika semua hurufnya ada dalam rentang maka return undefined. 

function fearNotLetter(str) {
  for (var i = 0; i < str.length; i++) {
    var code = str.charCodeAt(i);
    if (code !== str.charCodeAt(0) + i) {
      return String.fromCharCode(code - 1);
    }
  }
  return undefined;
}
fearNotLetter("abce");
Output Program:
d

 

Penjelasan Kode:

  • Solusi ini menggunakan for loop
  • Kode karakter yang ditemukan disimpan di variable code
  • Jika kode karakter saat ini tidak sama dengan kode karakter pertama dari pengulangan, maka
  • return nilai karakter/huruf yang hilang
  • Jika tidak return undefined


10.  Sorted Union

Tantangan kesepuluh, Buatlah sebuah function yang berisi 2 array atau lebih. kemudian return array baru tanpa ada element yang duplikat didalam array. Dengan kata lain semua element yang ada dalam array tetap dalam urutan asli tanpa ada element yang duplikat. 
function uniteUnique(arr) {
  // set variable args
  var args = [...arguments];
  // variable result untuk store array baru
  var result = [];
  // looping argument
  for (var i = 0; i < args.length; i++){
    // looping array dalam argument
    for (var j = 0; j < args[i].length; j++ ){
      if(!result.includes(args[i][j])){
        result.push(args[i][j])
      }
    }
  }
  return result;
  
}

console.log(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]));
Output Program:
[ 1, 3, 2, 5, 4 ]


Penjelasan Kode:

  • Lihat komentar di script


11. Convert HTML Entities

Tantangan kesebelas, mengkonversi karakter &, <, >, " (tanda kutip ganda), ' (tanda kutip satu) yang ada dalam string, kemudian ubah ke entitas HTML yang sesuai.

function convertHTML(str) {
 // buat objek untuk mempermudah pencarian karakter
 const htmlEntities = {
    "&": "&amp;",
    "<": "&lt;",
    ">": "&gt;",
    '"': "&quot;",
    "'": "&apos;"
};
//gunakan replace() untuk mengganti karakter dengan regex
str = str.replace(/([&<>\"'])/g, match => htmlEntities[match]);
// return str
return str;
}
console.log(convertHTML("Dolce & Gabbana"));
Output Program:
Dolce &amp; Gabbana


 Penjelasan Kode: Lihat komentar di script!


12. Sum All Odd Fibonacci Numbers (Jumlahkan angka fibonacci yang ganjil)

Tantangan keduabelas, menjumlahkan bilangan yang ganjil dalam deretan fibonacci. Bilangan fibonacci adalah penjumlahan angka sebelumnya dengan angka yang sekarang sama dengan angka berikutnya. Contoh: 
angka pertama = 0
angka kedua = 1
angka ketiga = 1
angka keempat = 2
angkat kelima = 3
angka keenam = 5
angka ketujuh = 8
angka kedelapan = 13
dan seterusnya ....
Dari deretan angka fibonacci tersebut, bagaimana caranya kita menjumlahkan angka yang ganjil saja? 
function sumFibs(num) {
  let prevNumber = 0; // angka sebelumnya
  let currNumber = 1; // angka sekarang
  let result = 0;     // hasil

  while(currNumber <= num){
    // cek jika angka sekarang, modulus 2 !== 0, maka jumlahkan angka 
    if(currNumber % 2 !== 0){
      result += currNumber;
    }
    
    currNumber = currNumber + prevNumber; // set angka sekarang
    prevNumber = currNumber - prevNumber; // set angka sebelumnya
  }

 return result;
}

console.log(sumFibs(13));
Output Progam:
23

Penjelasan Kode: Lihat komentar di script!


Posting Komentar

0 Komentar