Kunci jawaban 05 Latihan Fungsi Tingkat Tinggi.

5.1 Meratakan

let arrays = [[1, 2, 3], [4, 5], [6]];
let rata = arrays.reduce((gabung, kini) => gabung.concat(kini), []);
console.log(rata);
// → [1, 2, 3, 4, 5, 6]

Kenapa: mulai dari [], tiap langkah gabung.concat(kini) menghasilkan array baru yang lebih panjang. (JavaScript modern juga punya arrays.flat(), tapi latihan ini melatih reduce.)

→ Soal: 05 Latihan Fungsi Tingkat Tinggi > 5.1 Meratakan

5.2 Loop Sendiri

function loop(value, test, update, body) {
  for (let v = value; test(v); v = update(v)) {
    body(v);
  }
}

Kenapa: ketiga bagian for dipetakan langsung: init = nilai awal, cek = test(v), update = update(v), dan body(v) jalan tiap putaran. Ini contoh fungsi yang menyediakan “alur kontrol” sendiri.

→ Soal: 05 Latihan Fungsi Tingkat Tinggi > 5.2 Loop Sendiri

5.3 Every

// versi loop
function every(array, test) {
  for (let elemen of array) {
    if (!test(elemen)) return false;
  }
  return true;
}
 
// versi pakai some (De Morgan)
function every2(array, test) {
  return !array.some(elemen => !test(elemen));
}

Kenapa: versi loop keluar cepat begitu ada yang gagal. Versi some memanfaatkan “semua cocok” ekuivalen “tidak ada yang tidak cocok”. Array kosong menghasilkan true di keduanya: loop tak pernah masuk badannya, dan some pada array kosong false sehingga !false = true.

→ Soal: 05 Latihan Fungsi Tingkat Tinggi > 5.3 Every

5.4 Arah Tulisan Dominan

Solusinya, memakai characterScript dan countBy:

function dominantDirection(text) {
  let dihitung = countBy(text, char => {
    let skrip = characterScript(char.codePointAt(0));
    return skrip ? skrip.direction : "none";
  }).filter(({name}) => name != "none");
 
  if (dihitung.length == 0) return "ltr";
  return dihitung.reduce((a, b) => a.count > b.count ? a : b).name;
}

Kenapa: sama seperti textScripts, cuma grupnya direction bukan name. reduce tanpa nilai awal mengambil entri pertama sebagai awal lalu menyimpan yang count-nya lebih besar. Kalau gak ada karakter berskrip, jatuh ke "ltr".

Supaya bisa dijalankan di playground, ini data + fungsi pembantu mini (bukan data resmi yang besar, cukup buat menguji contoh soal):

const SCRIPTS = [
  {name: "Latin", ranges: [[65, 91], [97, 123]], direction: "ltr"},
  {name: "Arabic", ranges: [[1536, 1792]], direction: "rtl"}
];
 
function characterScript(code) {
  for (let s of SCRIPTS) {
    if (s.ranges.some(([dari, ke]) => code >= dari && code < ke)) {
      return s;
    }
  }
  return null;
}
 
function countBy(items, groupName) {
  let counts = [];
  for (let item of items) {
    let name = groupName(item);
    let known = counts.find(c => c.name == name);
    if (!known) counts.push({name, count: 1});
    else known.count++;
  }
  return counts;
}

Tempel blok data ini di atas fungsi dominantDirection di playground, lalu jalankan. Konsep codePointAt, some, find, reduce semua dari 05 Fungsi Tingkat Tinggi.

→ Soal: 05 Latihan Fungsi Tingkat Tinggi > 5.4 Arah Tulisan Dominan