|
<?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 π |
okoklahhh