fork download
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "sort"
  6. )
  7.  
  8. type Kamus struct {
  9. data map[string][]string
  10. }
  11.  
  12. func NewKamus() *Kamus {
  13. return &Kamus{
  14. data: make(map[string][]string),
  15. }
  16. }
  17.  
  18. func (k *Kamus) Tambah(word string, synonyms []string) {
  19. k.addUnique(word, word)
  20. for _, syn := range synonyms {
  21. k.addUnique(word, syn)
  22. k.addUnique(syn, word)
  23. }
  24. }
  25.  
  26. func (k *Kamus) addUnique(word string, syn string) {
  27. found := false
  28. for _, existingSyn := range k.data[word] {
  29. if existingSyn == syn {
  30. found = true
  31. break
  32. }
  33. }
  34. if !found {
  35. k.data[word] = append(k.data[word], syn)
  36. }
  37. }
  38.  
  39. func (k *Kamus) AmbilSinonim(word string) []string {
  40. if _, ok := k.data[word]; !ok {
  41. return nil
  42. }
  43.  
  44. queue := []string{word}
  45. visited := make(map[string]bool)
  46. resultMap := make(map[string]bool)
  47.  
  48. visited[word] = true
  49. resultMap[word] = true
  50.  
  51. for len(queue) > 0 {
  52. currentWord := queue[0]
  53. queue = queue[1:]
  54.  
  55. for _, syn := range k.data[currentWord] {
  56. if !visited[syn] {
  57. visited[syn] = true
  58. resultMap[syn] = true
  59. queue = append(queue, syn)
  60. }
  61. }
  62. }
  63.  
  64. var synonyms []string
  65. for syn := range resultMap {
  66. synonyms = append(synonyms, syn)
  67. }
  68.  
  69. sort.Strings(synonyms)
  70.  
  71. return synonyms
  72. }
  73.  
  74. func main() {
  75. kamus := NewKamus()
  76.  
  77. kamus.Tambah("big", []string{"large", "great"})
  78. kamus.Tambah("big", []string{"huge", "fat"})
  79. kamus.Tambah("huge", []string{"enormous", "gigantic"})
  80.  
  81. fmt.Println(kamus.AmbilSinonim("big"))
  82. fmt.Println(kamus.AmbilSinonim("huge"))
  83. fmt.Println(kamus.AmbilSinonim("gigantic"))
  84. fmt.Println(kamus.AmbilSinonim("colossal"))
  85. }
Success #stdin #stdout 0.01s 5272KB
stdin
Standard input is empty
stdout
[big enormous fat gigantic great huge large]
[big enormous fat gigantic great huge large]
[big enormous fat gigantic great huge large]
[]