Skip to content

Instantly share code, notes, and snippets.

@ianmustafa
Last active June 1, 2021 02:21
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ianmustafa/562fb42946d53b592bdfa9788dddb7c4 to your computer and use it in GitHub Desktop.
Save ianmustafa/562fb42946d53b592bdfa9788dddb7c4 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