<?php
class Kamus
{
private $data = [];
public function tambah($kata, $sinonim)
{
if (! isset($this->data[$kata])) { $this->data[$kata] = [];
}
foreach ($sinonim as $s) {
if (! in_array($s, $this->data[$kata])) { $this->data[$kata][] = $s;
}
if (! isset($this->data[$s])) { $this->data[$s] = [];
}
if (! in_array($kata, $this->data[$s])) { $this->data[$s][] = $kata;
}
}
}
public function ambilSinonim($kata)
{
if (! isset($this->data[$kata])) { return null;
}
$hasil = [];
$dikunjungi = [];
$antrian = [$kata];
while (! empty($antrian)) { if (isset($dikunjungi[$current])) { continue;
}
$dikunjungi[$current] = true;
if (isset($this->data[$current])) { foreach ($this->data[$current] as $s) {
if (! isset($dikunjungi[$s])) { $hasil[$s] = true;
$antrian[] = $s;
}
}
}
}
}
}
$kamus = new Kamus;
$kamus->tambah('big', ['large', 'great']);
$kamus->tambah('big', ['huge', 'fat']);
$kamus->tambah('huge', ['enormous', 'gigantic']);
echo "Sinonim dari 'big':\n";
print_r($kamus->ambilSinonim('big'));
echo "Sinonim dari 'huge':\n";
print_r($kamus->ambilSinonim('huge'));
echo "Sinonim dari 'gigantic':\n";
print_r($kamus->ambilSinonim('gigantic'));
echo "Sinonim dari 'colossal':\n";
print_r($kamus->ambilSinonim('colossal'));
PD9waHAKCmNsYXNzIEthbXVzCnsKICAgIHByaXZhdGUgJGRhdGEgPSBbXTsKCiAgICBwdWJsaWMgZnVuY3Rpb24gdGFtYmFoKCRrYXRhLCAkc2lub25pbSkKICAgIHsKICAgICAgICBpZiAoISBpc3NldCgkdGhpcy0+ZGF0YVska2F0YV0pKSB7CiAgICAgICAgICAgICR0aGlzLT5kYXRhWyRrYXRhXSA9IFtdOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJHNpbm9uaW0gYXMgJHMpIHsKICAgICAgICAgICAgaWYgKCEgaW5fYXJyYXkoJHMsICR0aGlzLT5kYXRhWyRrYXRhXSkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5kYXRhWyRrYXRhXVtdID0gJHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghIGlzc2V0KCR0aGlzLT5kYXRhWyRzXSkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5kYXRhWyRzXSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoISBpbl9hcnJheSgka2F0YSwgJHRoaXMtPmRhdGFbJHNdKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmRhdGFbJHNdW10gPSAka2F0YTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYW1iaWxTaW5vbmltKCRrYXRhKQogICAgewogICAgICAgIGlmICghIGlzc2V0KCR0aGlzLT5kYXRhWyRrYXRhXSkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkaGFzaWwgPSBbXTsKICAgICAgICAkZGlrdW5qdW5naSA9IFtdOwogICAgICAgICRhbnRyaWFuID0gWyRrYXRhXTsKCiAgICAgICAgd2hpbGUgKCEgZW1wdHkoJGFudHJpYW4pKSB7CiAgICAgICAgICAgICRjdXJyZW50ID0gYXJyYXlfc2hpZnQoJGFudHJpYW4pOwogICAgICAgICAgICBpZiAoaXNzZXQoJGRpa3VuanVuZ2lbJGN1cnJlbnRdKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRkaWt1bmp1bmdpWyRjdXJyZW50XSA9IHRydWU7CgogICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPmRhdGFbJGN1cnJlbnRdKSkgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmRhdGFbJGN1cnJlbnRdIGFzICRzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEgaXNzZXQoJGRpa3VuanVuZ2lbJHNdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkaGFzaWxbJHNdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgJGFudHJpYW5bXSA9ICRzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGFycmF5X3ZhbHVlcyhhcnJheV9kaWZmKGFycmF5X2tleXMoJGhhc2lsKSwgWyRrYXRhXSkpOwogICAgfQp9Cgoka2FtdXMgPSBuZXcgS2FtdXM7CiRrYW11cy0+dGFtYmFoKCdiaWcnLCBbJ2xhcmdlJywgJ2dyZWF0J10pOwoka2FtdXMtPnRhbWJhaCgnYmlnJywgWydodWdlJywgJ2ZhdCddKTsKJGthbXVzLT50YW1iYWgoJ2h1Z2UnLCBbJ2Vub3Jtb3VzJywgJ2dpZ2FudGljJ10pOwoKZWNobyAiU2lub25pbSBkYXJpICdiaWcnOlxuIjsKcHJpbnRfcigka2FtdXMtPmFtYmlsU2lub25pbSgnYmlnJykpOwoKZWNobyAiU2lub25pbSBkYXJpICdodWdlJzpcbiI7CnByaW50X3IoJGthbXVzLT5hbWJpbFNpbm9uaW0oJ2h1Z2UnKSk7CgplY2hvICJTaW5vbmltIGRhcmkgJ2dpZ2FudGljJzpcbiI7CnByaW50X3IoJGthbXVzLT5hbWJpbFNpbm9uaW0oJ2dpZ2FudGljJykpOwoKZWNobyAiU2lub25pbSBkYXJpICdjb2xvc3NhbCc6XG4iOwpwcmludF9yKCRrYW11cy0+YW1iaWxTaW5vbmltKCdjb2xvc3NhbCcpKTsK