package main
import "fmt"
type Kamus struct {
sinonim map[string][]string
}
func NewKamus() *Kamus {
return &Kamus{sinonim: make(map[string][]string)}
}
func contains(daftar []string, kata string) bool {
for _, s := range daftar {
if s == kata {
return true
}
}
return false
}
func (k *Kamus) pastikanAda(kata string) {
if _, ok := k.sinonim[kata]; !ok {
k.sinonim[kata] = []string{}
}
}
func (k *Kamus) hubungkan(a, b string) {
if a == b {
return
}
k.pastikanAda(a)
k.pastikanAda(b)
if !contains(k.sinonim[a], b) {
k.sinonim[a] = append(k.sinonim[a], b)
}
if !contains(k.sinonim[b], a) {
k.sinonim[b] = append(k.sinonim[b], a)
}
}
func (k *Kamus) tambah(kata string, sinonim []string) {
k.pastikanAda(kata)
for _, s := range sinonim {
k.hubungkan(kata, s)
}
}
func (k *Kamus) ambilSinonim(kata string) []string {
daftar, ok := k.sinonim[kata]
if !ok {
return nil
}
hasil := make([]string, len(daftar))
copy(hasil, daftar)
return hasil
}
func tampil(hasil []string) {
if hasil == nil {
fmt.Println("null")
return
}
fmt.Println(hasil)
}
func main() {
kamus := NewKamus()
kamus.tambah("big", []string{"large", "great"})
kamus.tambah("big", []string{"huge", "fat"})
kamus.tambah("huge", []string{"enormous", "gigantic"})
tampil(kamus.ambilSinonim("big"))
tampil(kamus.ambilSinonim("huge"))
tampil(kamus.ambilSinonim("gigantic"))
tampil(kamus.ambilSinonim("colossal"))
}
cGFja2FnZSBtYWluCgppbXBvcnQgImZtdCIKCnR5cGUgS2FtdXMgc3RydWN0IHsKCXNpbm9uaW0gbWFwW3N0cmluZ11bXXN0cmluZwp9CgpmdW5jIE5ld0thbXVzKCkgKkthbXVzIHsKCXJldHVybiAmS2FtdXN7c2lub25pbTogbWFrZShtYXBbc3RyaW5nXVtdc3RyaW5nKX0KfQoKZnVuYyBjb250YWlucyhkYWZ0YXIgW11zdHJpbmcsIGthdGEgc3RyaW5nKSBib29sIHsKCWZvciBfLCBzIDo9IHJhbmdlIGRhZnRhciB7CgkJaWYgcyA9PSBrYXRhIHsKCQkJcmV0dXJuIHRydWUKCQl9Cgl9CglyZXR1cm4gZmFsc2UKfQoKZnVuYyAoayAqS2FtdXMpIHBhc3Rpa2FuQWRhKGthdGEgc3RyaW5nKSB7CglpZiBfLCBvayA6PSBrLnNpbm9uaW1ba2F0YV07ICFvayB7CgkJay5zaW5vbmltW2thdGFdID0gW11zdHJpbmd7fQoJfQp9CgpmdW5jIChrICpLYW11cykgaHVidW5na2FuKGEsIGIgc3RyaW5nKSB7CglpZiBhID09IGIgewoJCXJldHVybgoJfQoJay5wYXN0aWthbkFkYShhKQoJay5wYXN0aWthbkFkYShiKQoJaWYgIWNvbnRhaW5zKGsuc2lub25pbVthXSwgYikgewoJCWsuc2lub25pbVthXSA9IGFwcGVuZChrLnNpbm9uaW1bYV0sIGIpCgl9CglpZiAhY29udGFpbnMoay5zaW5vbmltW2JdLCBhKSB7CgkJay5zaW5vbmltW2JdID0gYXBwZW5kKGsuc2lub25pbVtiXSwgYSkKCX0KfQoKZnVuYyAoayAqS2FtdXMpIHRhbWJhaChrYXRhIHN0cmluZywgc2lub25pbSBbXXN0cmluZykgewoJay5wYXN0aWthbkFkYShrYXRhKQoJZm9yIF8sIHMgOj0gcmFuZ2Ugc2lub25pbSB7CgkJay5odWJ1bmdrYW4oa2F0YSwgcykKCX0KfQoKZnVuYyAoayAqS2FtdXMpIGFtYmlsU2lub25pbShrYXRhIHN0cmluZykgW11zdHJpbmcgewoJZGFmdGFyLCBvayA6PSBrLnNpbm9uaW1ba2F0YV0KCWlmICFvayB7CgkJcmV0dXJuIG5pbAoJfQoJaGFzaWwgOj0gbWFrZShbXXN0cmluZywgbGVuKGRhZnRhcikpCgljb3B5KGhhc2lsLCBkYWZ0YXIpCglyZXR1cm4gaGFzaWwKfQoKZnVuYyB0YW1waWwoaGFzaWwgW11zdHJpbmcpIHsKCWlmIGhhc2lsID09IG5pbCB7CgkJZm10LlByaW50bG4oIm51bGwiKQoJCXJldHVybgoJfQoJZm10LlByaW50bG4oaGFzaWwpCn0KCmZ1bmMgbWFpbigpIHsKCWthbXVzIDo9IE5ld0thbXVzKCkKCWthbXVzLnRhbWJhaCgiYmlnIiwgW11zdHJpbmd7ImxhcmdlIiwgImdyZWF0In0pCglrYW11cy50YW1iYWgoImJpZyIsIFtdc3RyaW5neyJodWdlIiwgImZhdCJ9KQoJa2FtdXMudGFtYmFoKCJodWdlIiwgW11zdHJpbmd7ImVub3Jtb3VzIiwgImdpZ2FudGljIn0pCgoJdGFtcGlsKGthbXVzLmFtYmlsU2lub25pbSgiYmlnIikpCgl0YW1waWwoa2FtdXMuYW1iaWxTaW5vbmltKCJodWdlIikpCgl0YW1waWwoa2FtdXMuYW1iaWxTaW5vbmltKCJnaWdhbnRpYyIpKQoJdGFtcGlsKGthbXVzLmFtYmlsU2lub25pbSgiY29sb3NzYWwiKSkKfQ==