Skip to content

Instantly share code, notes, and snippets.

@bastomiadi
Forked from ianmustafa/0-preface.md
Created June 1, 2021 02:21
Show Gist options
  • Save bastomiadi/8003c7878cfddb756ae9e00123d95d06 to your computer and use it in GitHub Desktop.
Save bastomiadi/8003c7878cfddb756ae9e00123d95d06 to your computer and use it in GitHub Desktop.
Tantangan PHP Indonesia for Student: Algoritma Homing Pigeon

Tantangan PHP Indonesia for Student: Algoritma Homing Pigeon

Sebelumnya, terima kasih kepada om Nur Hidayat (@hidayat365, Pojok Programmer) untuk tantangannya di grup Telegram PHP Indonesia for Students. Tantangan ini kembali mengingatkan saya bahwa overthinking itu tidak perlu. πŸ˜‚

Latar Belakang

Ada seorang raja kaya memiliki wilayah kekuasaan yang luas sedang berburu sendirian, namun sayang tak sengaja dia terpelesat dan kakinya terkilir. Untungnya dia membawa seekor merpati, sehingga dikirimlah merpati itu kembali ke istana untuk meminta bantuan.

Tugas

Gambarkan perjalanan si merpati dari tempat sang raja kembali ke istana.

Ketentuan

  • Ukuran wilayah sebesar 10 Γ— 10 satuan.
  • Koordinat sang raja dan istana boleh random boleh atau input dari user. (Disini saya pilih random)
  • Merpati hanya bisa bergerak sejauh satu satuan/langkah ke segala arah.

Sedikit Curhat

Saya sempat overthinking untuk menghitung jarak terdekat antara sang raja dan istananya, menggunakan rumus Pytaghoras, bahkan sampai menghitung sudut dengan trigonometri, karena saya kira tidak mungkin membuat merpati melangkah secara diagonal tanpa menghitung jarak terdekatanya. Setelah beberapa kali iterasi dan selalu gagal, ternyata hanya dengan sedikit logika percabangan sudah cukup. πŸ˜‚πŸ˜…

Teknisnya, saya bangun dulu wilayah kerajaan dan saya tetapkan lokasi sang raja dan istananya. Lalu, saya mulai menghitung langkah yang dilakukan oleh merpati. Saya simpan dalam satu variabel untuk nantinya dipakai sebagai pembanding ketika wilayah kerajaan mulai digambar oleh program. 😊

Ada pertanyaan?

Silakan hubungi saya via Facebook @iianmustafa, Twitter @iianmustafa atau Telegram @ianmustafa.

<?php
// Kita buat wilayahnya dulu
$world = [
'x' => 10,
'y' => 10,
];
// Tentukan lokasi sang raja dan istananya
$castle = [
'x' => rand(1, $world['x']),
'y' => rand(1, $world['y']),
];
$king = [
'x' => rand(1, $world['x']),
'y' => rand(1, $world['y']),
];
// Tentukan lokasi awal merpati (sama dengan lokasi sang raja)
$pigeon = $king;
// Siapkan variabel untuk menyimpan langkah si merpati
$steps = [];
// Mulai hitung langkah si merpati. Lakukan pengulangan selama
// lokasi si merpati belum sama dengan lokasi istana
while ($pigeon['x'] !== $castle['x'] || $pigeon['y'] !== $castle['y']) {
// Jika lokasi sumbu X belum sama, lakukan satu langkah
if ($castle['x'] > $pigeon['x']) {
$pigeon['x']++;
} elseif ($castle['x'] < $pigeon['x']) {
$pigeon['x']--;
}
// Jika lokasi sumbu Y belum sama, lakukan satu langkah
if ($castle['y'] > $pigeon['y']) {
$pigeon['y']++;
} elseif ($castle['y'] < $pigeon['y']) {
$pigeon['y']--;
}
// Simpan langkah ke array yang sudah disiapkan tadi. Kita pakai
// lokasi X dan Y dalam wilayah sebagai key untuk elemen array
// yang akan dibuat; key ini akan dipakai untuk pengecekan ketika
// penggambaran wilayah sat output. Gunakan jumlah langkan saat
// ini ditambah 1 untuk nanti ditampilkan ke output.
$steps["{$pigeon['x']},{$pigeon['y']}"] = count($steps) + 1;
}
// Gambar wilayahnya sekarang
for ($wy = 1; $wy <= $world['y']; $wy++) {
for ($wx = 1; $wx <= $world['x']; $wx++) {
// Jika titik yang sedang digambar adalah lokasi sang raja,
// gambar mahkota ke titik ini...
if ($wx === $king['x'] && $wy === $king['y']) {
echo ' πŸ‘‘ '; // Oh ya, saya pakai emoji disini...
}
// Atau jika titik yang sedang digambar adalah lokasi istana,
// gambar istana ke titik ini...
elseif ($wx === $castle['x'] && $wy === $castle['y']) {
echo ' 🏯 '; // Dan disini
}
// Atau jika titik yang sedang digambar adalah titik yang pernah
// dilewati oleh merpati, gambar nomor langkahnya ke titik ini...
elseif (isset($steps["{$wx},{$wy}"])) {
echo ' ' . ($steps["{$wx},{$wy}"] < 10 ? ' ' . $steps["{$wx},{$wy}"] : $steps["{$wx},{$wy}"]) . ' ';
}
// Atau gambarkan titik ke tempat kosong
else {
// Ini bukan tanda titik biasa, tapi tanda titik
// yang secara vertikal berada di tengah (bukan di bawah)
echo ' Β·Β· ';
}
}
// Selesai satu baris, ganti baris baru
echo "\n";
} // Yay πŸŽ‰
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment