Derse geri dön
Bu materyal sadece English, Español, Français, Indonesia, Italiano, 日本語, 한국어, Русский, 简体中文 dillerinde mevcuttur. Lütfen Türkçe diline çevirmek için bize yardım edin.

Anagram Filtresi

önem: 4

Anagramlar aynı sayıda harfi olan aynı harflere sahip kelime demektir. Dizilimleri farklı olmalıdır.

Örneğin:

aks, ask, kas, sak
alim, amil, ilam, imal, imla, mail, mali
açlık, akçıl, çakıl, çalık, çalkı, kaçlı, kalıç, lakç

atemiz(dizi) adında bir fonksiyon yazın ve bu fonksiyon diziyi anagramlardan temizlesin.

Örneğin:

let arr = ["aks", "alim", "açlık", "ask", "ilam", "çalık"];

alert( aclean(arr) ); // "aks,alim,açlık" veya "ask,ilam,çalık"

Hangisi olduğuna bakılmaksızın her anagram grubunda bir tane kelime kalmalıdır. Hangisinin olduğu önemli değildir.

Testler ile korunaklı olan aç.

Tüm anagramları bulmak için öncelikle kelimeleri harflerine ayırıp sonrasında sıralamak gerekmektedir.

Örneğin:

aks, ask, kas, sak
alim, amil, ilam, imal, imla, mail, mali
açlık, akçıl, çakıl, çalık, çalkı, kaçlı, kalıç, lakç
...

Harf sıralı tipler map anahtarları olacak şekilde kaydedilir.

function atemiz(dizi) {
  let map = new Map();

  for(let word of dizi) {
    // kelimeyi harflere ayır, sonrasında birleştir.
    let sorted = word.toLowerCase().split('').sort().join(''); // (*)
    map.set(sorted, word);
  }

  return Array.from(map.values());
}

let arr = ["aks", "alim", "açlık", "ask", "ilam", "çalık"];

alert( atemiz(arr) );

Harflerin sıralanması (*)'da gösterilen zincirleme çağrılar ile yapılır.

Daha kolay anlaşılabilmesi için bunu satırlara ayıralım:

let sorted = arr[i] // AKS
  .toLowerCase() // aks
  .split('') // ['a','k','s']
  .sort() // ['a','k','s']
  .join(''); // aks

İki farklı kelime 'AKS' ve 'ASK' sıralandığında ikisi de 'AKS' olmaktadır.

Bir sonraki satır bu kelimeleri map’e eklemeye yarar:

map.set(sorted, word);

Eğer aynı karakterlere sahip kelime ile tekrar karşılaşılırsa, map olduğundan dolayı bir öncekinin üzerine yazılacaktır. Bundan dolayı her zaman bir karakter-form’u için maksimum bir tane kelimeye sahip olacağız.

Sonunda Array.from(map.values()) bu map değerleri üzerinden döngü yapılmasını sağlar.

Burada Map yerine normal obje de kullanılabilirdi. Çünkü anahtarlar karakter dizisi olacak.

Bu durumda çözüm şu şekilde olabilir:

function atemiz(dizi) {
  let obj = {};

  for (let i = 0; i < dizi.length; i++) {
    let sorted = dizi[i].toLowerCase().split("").sort().join("");
    obj[sorted] = dizi[i];
  }

  return Array.from(Object.values(obj));
}

let arr = ["aks", "alim", "açlık", "ask", "ilam", "çalık"];

alert( atemiz(arr) );
function aclean(arr) {
  let map = new Map();

  for(let word of arr) {
    let sorted = word.toLowerCase().split("").sort().join("");
    map.set(sorted, word);
  }

  return Array.from(map.values());
}

Çözümü testler korunaklı alanda olacak şekilde aç.