14.06.2024

Javascript, Beylik Mülakat Soruları 2

Merhaba, 

Bir başka mülakat sorusu ile karşınızdayım. Açıkçası sıkça sorulup sorulmadığından emin değilim ama her problemi çözmeye çalışmanın yazılım geliştiriciye mutlaka bir şeyler kattığını düşünüyorum. Üstelik eğlenceli bile bulabilirsiniz kim bilir! :) 

Bu konu ile ilgili yazdığım önceki yazıya buradan ulaşabilirsiniz.

Sorumuz şöyle:

Parametre olarak pozitif bir sayı (N) kabul eden bir fonksiyon yazın. Bu fonksiyon console.log ile '#' karakterlerini kullanarak N seviyeden oluşan bir piramit şekli oluşturmalı. Piramit şeklinin hem sağ hem sol tarafında boşluklar olmasına dikkat edin. Örnek: N=3 için; 

Aslında çok karmaşık bir problem değil. Öncelikle yandaki örnek görsele baktığımızda 3 seviyeli bir piramit için boşluklar dahil 3x5'lik bir dörtgen ile uğraştığımızı görebiliriz. Oluşacak piramidin en üst seviyesinde her zaman bir '#' karakteri olacak ve tam ortada yer alacak. N seviyelik piramidin içinde her satır (seviye) için sırasıyla hangi karakterin gelmesi gerektiğine karar verip satırı tek seferde yazdıracağız. İki farklı çözüm yazacağım. Biri döngülerle ikincisi ise recursive bir fonksiyonla olacak.

İlk çözüm şöyle  olabilir:

function pyramid(n) {
  const mid = Math.floor((2 * n - 1) / 2);

  for (let row = 0; row < n; row++) {
    let level = '';

    for (let column = 0; column < n * 2 - 1; column++) {
      if (column >= mid - row && column <= mid + row) {
        level += '#';
      } else {
        level += ' ';
      }
    }

    console.log(level);
  }
}

Peki neler oluyor burada?

Öncelikle NxN büyüklüğündeki karenin, satırının ortasını bulmak için bir hesaplama yapıp; mid değişkenine bu değeri atıyoruz. Sonra N kere for döngüsü içinde dönerek her satırı ekrana console.log ile yazdırıyoruz. Bu işlemi yaparken satırdaki hangi karakterlerin '#' ve ' ' olduğunu, yazacağımız sütunun bulduğumuz orta (mid) değerine olan uzaklığına bakarak belirliyoruz. Çok basit bir çözüm.

Bu probleme recursive bir çözüm getirmeniz istenirse de aşağıdaki gibi uygulanabilir: 

function pyramid(n, row = 0, level = '') {
  const mid = Math.floor((2 * n - 1) / 2);
  let add;

  if (n === row) {
    return;
  }

  if (level.length === n * 2 - 1) {
    console.log(level);
    return pyramid(n, row + 1);
  }

  if (level.length >= mid - row && level.length <= mid + row) {
    add = '#';
  } else {
    add = ' ';
  }

  pyramid(n, row, level + add);
}

Bu fonksiyonda ilk çözümdeki gibi bir döngü içerisinde satırları belirleyip yazdırmak yerine fonksiyonu yeniden çağırarak aynı sonucu elde ediyoruz.

Çözümlerle ilgili sorunuz olursa yorumlara yazmaktan çekinmeyin: )

Sonraki yazımda görüşmek üzere.

Esen Kalın.