<?php
class Kamus
{
private $daftar = array();
public function __construct()
{
}
public function tambah
($kata, array $sinonim) {
// Kata utama tetap didaftarkan walau array sinonimnya kosong.
$this->daftarkanKata($kata);
foreach ($sinonim as $pasangan) {
$this->daftarkanKata($pasangan);
// Relasi dua arah: kunci agar ambilSinonim('gigantic')
// mengembalikan array berisi 'huge'.
$this->buatRelasi($kata, $pasangan);
$this->buatRelasi($pasangan, $kata);
}
}
public function ambilSinonim($kata)
{
return null;
}
return $this->daftar[$kata];
}
private function daftarkanKata($kata)
{
$this->daftar[$kata] = array(); }
}
private function buatRelasi($dari, $ke)
{
if ($dari === $ke) {
return; // sebuah kata bukan sinonim bagi dirinya sendiri
}
if (!in_array($ke, $this->daftar[$dari], true)) { $this->daftar[$dari][] = $ke;
}
}
}
/* ===================== PENGUJIAN ===================== */
function cetak($label, $hasil)
{
. ($hasil === null ?
'null' : json_encode($hasil)) . PHP_EOL
; }
$kamus = new Kamus();
$kamus->tambah('big', array('large', 'great')); $kamus->tambah('big', array('huge', 'fat')); $kamus->tambah('huge', array('enormous', 'gigantic'));
cetak("ambilSinonim('big')", $kamus->ambilSinonim('big'));
cetak("ambilSinonim('huge')", $kamus->ambilSinonim('huge'));
cetak("ambilSinonim('gigantic')", $kamus->ambilSinonim('gigantic'));
cetak("ambilSinonim('colossal')", $kamus->ambilSinonim('colossal'));
echo PHP_EOL . "--- Kasus tepi tambahan ---" . PHP_EOL;
$kamus->tambah('big', array('large', 'big')); // duplikat + self-loop cetak("ambilSinonim('big') [ulang]", $kamus->ambilSinonim('big'));
$kamus->tambah('solo', array()); // kata tanpa sinonim cetak("ambilSinonim('solo')", $kamus->ambilSinonim('solo'));
cetak("ambilSinonim('fat')", $kamus->ambilSinonim('fat'));
PD9waHAKCmNsYXNzIEthbXVzCnsKCiAgICBwcml2YXRlICRkYWZ0YXIgPSBhcnJheSgpOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICAgICAgJHRoaXMtPmRhZnRhciA9IGFycmF5KCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHRhbWJhaCgka2F0YSwgYXJyYXkgJHNpbm9uaW0pCiAgICB7CiAgICAgICAgLy8gS2F0YSB1dGFtYSB0ZXRhcCBkaWRhZnRhcmthbiB3YWxhdSBhcnJheSBzaW5vbmltbnlhIGtvc29uZy4KICAgICAgICAkdGhpcy0+ZGFmdGFya2FuS2F0YSgka2F0YSk7CgogICAgICAgIGZvcmVhY2ggKCRzaW5vbmltIGFzICRwYXNhbmdhbikgewogICAgICAgICAgICAkdGhpcy0+ZGFmdGFya2FuS2F0YSgkcGFzYW5nYW4pOwoKICAgICAgICAgICAgLy8gUmVsYXNpIGR1YSBhcmFoOiBrdW5jaSBhZ2FyIGFtYmlsU2lub25pbSgnZ2lnYW50aWMnKQogICAgICAgICAgICAvLyBtZW5nZW1iYWxpa2FuIGFycmF5IGJlcmlzaSAnaHVnZScuCiAgICAgICAgICAgICR0aGlzLT5idWF0UmVsYXNpKCRrYXRhLCAkcGFzYW5nYW4pOwogICAgICAgICAgICAkdGhpcy0+YnVhdFJlbGFzaSgkcGFzYW5nYW4sICRrYXRhKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFtYmlsU2lub25pbSgka2F0YSkKICAgIHsKICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJGthdGEsICR0aGlzLT5kYWZ0YXIpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5kYWZ0YXJbJGthdGFdOwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gZGFmdGFya2FuS2F0YSgka2F0YSkKICAgIHsKICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJGthdGEsICR0aGlzLT5kYWZ0YXIpKSB7CiAgICAgICAgICAgICR0aGlzLT5kYWZ0YXJbJGthdGFdID0gYXJyYXkoKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiBidWF0UmVsYXNpKCRkYXJpLCAka2UpCiAgICB7CiAgICAgICAgaWYgKCRkYXJpID09PSAka2UpIHsKICAgICAgICAgICAgcmV0dXJuOyAvLyBzZWJ1YWgga2F0YSBidWthbiBzaW5vbmltIGJhZ2kgZGlyaW55YSBzZW5kaXJpCiAgICAgICAgfQoKICAgICAgICBpZiAoIWluX2FycmF5KCRrZSwgJHRoaXMtPmRhZnRhclskZGFyaV0sIHRydWUpKSB7CiAgICAgICAgICAgICR0aGlzLT5kYWZ0YXJbJGRhcmldW10gPSAka2U7CiAgICAgICAgfQogICAgfQp9CgoKLyogPT09PT09PT09PT09PT09PT09PT09IFBFTkdVSklBTiA9PT09PT09PT09PT09PT09PT09PT0gKi8KCmZ1bmN0aW9uIGNldGFrKCRsYWJlbCwgJGhhc2lsKQp7CiAgICBlY2hvIHN0cl9wYWQoJGxhYmVsLCAyOCkgLiAnID0+ICcKICAgICAgICAuICgkaGFzaWwgPT09IG51bGwgPyAnbnVsbCcgOiBqc29uX2VuY29kZSgkaGFzaWwpKSAuIFBIUF9FT0w7Cn0KCiRrYW11cyA9IG5ldyBLYW11cygpOwoka2FtdXMtPnRhbWJhaCgnYmlnJywgIGFycmF5KCdsYXJnZScsICdncmVhdCcpKTsKJGthbXVzLT50YW1iYWgoJ2JpZycsICBhcnJheSgnaHVnZScsICdmYXQnKSk7CiRrYW11cy0+dGFtYmFoKCdodWdlJywgYXJyYXkoJ2Vub3Jtb3VzJywgJ2dpZ2FudGljJykpOwoKY2V0YWsoImFtYmlsU2lub25pbSgnYmlnJykiLCAgICAgICRrYW11cy0+YW1iaWxTaW5vbmltKCdiaWcnKSk7CmNldGFrKCJhbWJpbFNpbm9uaW0oJ2h1Z2UnKSIsICAgICAka2FtdXMtPmFtYmlsU2lub25pbSgnaHVnZScpKTsKY2V0YWsoImFtYmlsU2lub25pbSgnZ2lnYW50aWMnKSIsICRrYW11cy0+YW1iaWxTaW5vbmltKCdnaWdhbnRpYycpKTsKY2V0YWsoImFtYmlsU2lub25pbSgnY29sb3NzYWwnKSIsICRrYW11cy0+YW1iaWxTaW5vbmltKCdjb2xvc3NhbCcpKTsKCmVjaG8gUEhQX0VPTCAuICItLS0gS2FzdXMgdGVwaSB0YW1iYWhhbiAtLS0iIC4gUEhQX0VPTDsKCiRrYW11cy0+dGFtYmFoKCdiaWcnLCBhcnJheSgnbGFyZ2UnLCAnYmlnJykpOyAgIC8vIGR1cGxpa2F0ICsgc2VsZi1sb29wCmNldGFrKCJhbWJpbFNpbm9uaW0oJ2JpZycpIFt1bGFuZ10iLCAka2FtdXMtPmFtYmlsU2lub25pbSgnYmlnJykpOwoKJGthbXVzLT50YW1iYWgoJ3NvbG8nLCBhcnJheSgpKTsgICAgICAgICAgICAgICAgIC8vIGthdGEgdGFucGEgc2lub25pbQpjZXRhaygiYW1iaWxTaW5vbmltKCdzb2xvJykiLCAka2FtdXMtPmFtYmlsU2lub25pbSgnc29sbycpKTsKY2V0YWsoImFtYmlsU2lub25pbSgnZmF0JykiLCAgJGthbXVzLT5hbWJpbFNpbm9uaW0oJ2ZhdCcpKTs=
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"]