Skip to content

Instantly share code, notes, and snippets.

@ianmustafa
Created July 11, 2019 11:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ianmustafa/51ae4a6e6f6107f1000c4d3f65cb56e2 to your computer and use it in GitHub Desktop.
Save ianmustafa/51ae4a6e6f6107f1000c4d3f65cb56e2 to your computer and use it in GitHub Desktop.
Membuat Segitiga Pascal

Membuat Segitiga Pascal dalam aplikasi CLI

Ketila sedang iseng, saya suka tantangan. Kebetulan, ada sedikit tantangan yang saya temukan di grup PHPID for Student: membuat Segitiga Pascal.

Kode dibawah saya buat from scratch, tanpa strategi dan algoritma khusus selain trial-and-error (iya saya lemah di algoritma haha 😂). Alhamdulillah, berhasil jadi, dan yang terpenting, saya juga jadi paham soal cara membuat Segitiga Pascal dengan bahasa pemrograman.

Contoh di bawah saya buat menggunakan PHP 7 dalam mode command-line interface atau CLI. Jika di lain waktu saya iseng lagi, akan saya buatkan contoh dengan bahasa lain. (Sudah ada gambaran ingin buat dengan JavaScript, untuk manteman yang sudah punya Node.js terinstal di komputer.) Kode yang ditulis sudah dengan lengkap meneyrtakan komentar berisi penjelasan kode yang ada. Semoga semuanya jelas.

Ada pertanyaan?

Seperti biasa, jika ada pertanyaan, manteman bisa menghubungi saya via Telegram @ianmustafa.

<?php
// Kode ini berjalan sepenuhnya dalam command-line interface. Manteman cukup
// jalankan file ini dengan menjalankan php pascal-triangle.php. Untuk penjelasan
// lebih lengkap, silakan baca mulai dari atas. 🙏
// Baca input jumlah baris segitiga, dengan validasi untuk nilai minimum jumlah baris
$max = 0;
$max = (int) readline('Masukkan jumlah baris segitiga yang ingin dibuat, minimal 3 baris: ');
while ($max < 3) {
$max = (int) readline('Jumlah baris yang di-input kurang dari 3, silakan ulangi: ');
}
// Buat array untuk menyimpan seluruh angka segitiganya
$triangle = [];
// Buat pengulangan barisnya
foreach (range(1, $max) as $i) {
// Buat array untuk menyimpan angka segitiga dalam baris
$row = [];
// Buat pengulangan kolomnya
foreach (range(1, $i) as $j) {
// Untuk kolom pertama atau terakhir, sudah pasti nilainya 1
if ($j === 1 || $j === $i) {
$col = 1;
}
// Untuk kolom lain, kita pastikan kita ada di baris ketiga dan seterusnya,
// dan ada di kolom kedua dan seterusnya, karena baris pertama dan kedua
// serta kolom pertama dan terakhir tidak perlu ada perhitungan.
elseif ($i > 2 && $j > 1) {
// Kita perlu mengetahui nilai kolom dari baris diatas. Dalam array,
// penghitungan nomor indeks data dari 0, sehingga kita perlu
// mengurangi $i sebanyak 1 angka untuk mendapatkan nilai baris
// saat ini. Sedangkan untuk mendapatkan nilai baris sebelumnya
// kita perlu mengurangi $1 sebanyak 2 angka.
// Untuk kolomnya, kita memerlukan nilai kolom tepat diatas kolom
// saat ini ditambah nilai kolom sebelumnya. Jadi, untuk mendapatkan
// nomor indeks kolom saat ini kita perlu mengurangi $j sebanyak
// 1 angka, dan untuk nomor indeks kolom sebelumnya kita perlu
// mengurangi $j sebanyak 2 angka.
$col = $triangle[$i - 2][$j - 1] + $triangle[$i - 2][$j - 2];
}
// Masukkan nilai kolom saat ini ke baris segitiganya
$row[] = $col;
}
// Masukkan nilai baris segitiga saat ini ke segitiganya
$triangle[] = $row;
}
// Selesai 😁
// Kita bisa gunakan print_r untuk menampilkan angkanya.
// print_r($triangle);
// Tapi apa serunya? Kita bisa buat menjadi segitiga betulan kok!
// Tentu saja, bagian kode dibawah ini opsional. hanya akan saya pakai untuk
// memperindah tampilan segitiganya saja. sifatnya tidak wajib.
// Sebelum mulai menampilkan segitiga yang indah, kita perlu tahu bilangan
// terbesar dalam segitiga perlu berapa karakter dalam layar. Nah, sebelum
// kita bisa tahu butuh berapa karakter, kita perlu tahu berapa nilai bilangan
// terbesarnya. Nah bilangan terbesar dalam segitiga pascal itu sudah pasti
// ada di kolom tengah baris terakhir. Jadi kita bisa langsung tahu...
$maxval = $triangle[$max - 1][ceil($max / 2)];
// Fungsi ceil() digunakan untuk membulatkan hasil bagi yang berupa bilangan
// desimal ke bilangan bulat diatasnya. Disini saya pakai untuk membulatkan
// hasil bagi bilangan ganjil.
// Selanjutnya, tinggal dihitung saja butuh berapa karakter.
$charlen = strlen((string) $maxval);
// Setelah tahu berapa karakter yang dibutuhkan oleh tiap bilangan, kita bisa
// mulai menampilkan segitiganya.
foreach ($triangle as $i => $row) {
// Kita ganti baris di awal saja, sekaligus memberi jarak segitiga dari teks
// prompt input jumlah baris.
echo "\n";
// Supaya segitiga bisa pas rapi di tengah, kita perlu tambahkan spasi sebelum
// bilangan pertama dalam baris segitiga ditampilkan. Jumlahnya? sama dengan
// panjang karakter milik bilangan terbesar, dikalikan dengan jumlah baris
// maksimal yang sudah dikurangi oleh nomor baris. Berhubung bilangan iterasi
// array dari baris bilangan dimulai dari 0, kita perlu kurangi lagi sebanyak
// 1 angka sebelum mulai mengkalikan.
// Pastikan baris yang ditambahkan spasi bukanlah baris segitiga terakhir.
if ($i !== ($max - 1)) {
echo str_repeat(' ', $charlen * ($max - $i - 1));
}
// Setelah selesai membuat spasi, kita tampikan bilangan dalam barisnya.
foreach ($row as $j => $col) {
// Ketika menampilkan masing-masing bilangan, kita pastikan semua bilangan
// bisa makan tempat sebanyak karakter yang dibutuhkan oleh bilangan
// terbesat. Inilah alasan utama kenapa kita perlu tahu berapa panjang
// bilangan terbesar tadi, supaya semua bilangan bisa tampil secara rapi.
// Kita bisa gunakan str_pad() untuk menambahkan spasi di depan masing-
// masing bilangan yang akan ditampilkan. Oh ya, kita tambahkan spasinya
// di bagian kiri bilangan.
echo str_pad($col, $charlen, ' ', STR_PAD_LEFT);
// Lalu, jika bilangan ini bukan bilangan terakhir dalam baris, kita
// berikan spasi antar bilangan. Kita bisa tahu bilangan ini yang
// terakhir dalam baris, jika nomor kolom bilangan sama dengan
// nomor baris bilangan.
if ($i !== $j) {
echo str_repeat(' ', $charlen);
}
}
}
// Berikan baris baru di akhir supaya output CLI bisa rapi.
echo "\n";
// Yay 🎉
@FunkyFunny
Copy link

okoklahhh

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment