fork download
  1. <?php
  2.  
  3. class Kamus
  4. {
  5.  
  6. private $daftar = array();
  7.  
  8. public function __construct()
  9. {
  10. $this->daftar = array();
  11. }
  12.  
  13. public function tambah($kata, array $sinonim)
  14. {
  15. // Kata utama tetap didaftarkan walau array sinonimnya kosong.
  16. $this->daftarkanKata($kata);
  17.  
  18. foreach ($sinonim as $pasangan) {
  19. $this->daftarkanKata($pasangan);
  20.  
  21. // Relasi dua arah: kunci agar ambilSinonim('gigantic')
  22. // mengembalikan array berisi 'huge'.
  23. $this->buatRelasi($kata, $pasangan);
  24. $this->buatRelasi($pasangan, $kata);
  25. }
  26. }
  27.  
  28. public function ambilSinonim($kata)
  29. {
  30. if (!array_key_exists($kata, $this->daftar)) {
  31. return null;
  32. }
  33.  
  34. return $this->daftar[$kata];
  35. }
  36.  
  37. private function daftarkanKata($kata)
  38. {
  39. if (!array_key_exists($kata, $this->daftar)) {
  40. $this->daftar[$kata] = array();
  41. }
  42. }
  43.  
  44. private function buatRelasi($dari, $ke)
  45. {
  46. if ($dari === $ke) {
  47. return; // sebuah kata bukan sinonim bagi dirinya sendiri
  48. }
  49.  
  50. if (!in_array($ke, $this->daftar[$dari], true)) {
  51. $this->daftar[$dari][] = $ke;
  52. }
  53. }
  54. }
  55.  
  56.  
  57. /* ===================== PENGUJIAN ===================== */
  58.  
  59. function cetak($label, $hasil)
  60. {
  61. echo str_pad($label, 28) . ' => '
  62. . ($hasil === null ? 'null' : json_encode($hasil)) . PHP_EOL;
  63. }
  64.  
  65. $kamus = new Kamus();
  66. $kamus->tambah('big', array('large', 'great'));
  67. $kamus->tambah('big', array('huge', 'fat'));
  68. $kamus->tambah('huge', array('enormous', 'gigantic'));
  69.  
  70. cetak("ambilSinonim('big')", $kamus->ambilSinonim('big'));
  71. cetak("ambilSinonim('huge')", $kamus->ambilSinonim('huge'));
  72. cetak("ambilSinonim('gigantic')", $kamus->ambilSinonim('gigantic'));
  73. cetak("ambilSinonim('colossal')", $kamus->ambilSinonim('colossal'));
  74.  
  75. echo PHP_EOL . "--- Kasus tepi tambahan ---" . PHP_EOL;
  76.  
  77. $kamus->tambah('big', array('large', 'big')); // duplikat + self-loop
  78. cetak("ambilSinonim('big') [ulang]", $kamus->ambilSinonim('big'));
  79.  
  80. $kamus->tambah('solo', array()); // kata tanpa sinonim
  81. cetak("ambilSinonim('solo')", $kamus->ambilSinonim('solo'));
  82. cetak("ambilSinonim('fat')", $kamus->ambilSinonim('fat'));
Success #stdin #stdout 0.02s 25496KB
stdin
Standard input is empty
stdout
ambilSinonim('big')          => ["large","great","huge","fat"]
ambilSinonim('huge')         => ["big","enormous","gigantic"]
ambilSinonim('gigantic')     => ["huge"]
ambilSinonim('colossal')     => null

--- Kasus tepi tambahan ---
ambilSinonim('big') [ulang]  => ["large","great","huge","fat"]
ambilSinonim('solo')         => []
ambilSinonim('fat')          => ["big"]