fork download
  1. package main
  2.  
  3. import (
  4. "errors"
  5. "fmt"
  6. "sort"
  7. "strconv"
  8. "strings"
  9. )
  10.  
  11. type KlasemenEntry struct {
  12. Club string
  13. Points int
  14. }
  15.  
  16. type Klasemen struct {
  17. Points map[string]int
  18. }
  19.  
  20. func NewKlasemen(initialClubs []string) *Klasemen {
  21. k := &Klasemen{
  22. Points: make(map[string]int),
  23. }
  24. // Inisialisasi semua klub dengan 0 poin
  25. for _, club := range initialClubs {
  26. k.Points[club] = 0
  27. }
  28. return k
  29. }
  30.  
  31.  
  32. func (k *Klasemen) catatPermainan(klubKandang, klubTandang, skor string) error {
  33. // Memastikan klub-klub yang terlibat sudah terdaftar di klasemen
  34. if _, ok := k.Points[klubKandang]; !ok {
  35. return fmt.Errorf("klub '%s' tidak terdaftar dalam klasemen", klubKandang)
  36. }
  37. if _, ok := k.Points[klubTandang]; !ok {
  38. return fmt.Errorf("klub '%s' tidak terdaftar dalam klasemen", klubTandang)
  39. }
  40.  
  41. // Parsing skor
  42. skorParts := strings.Split(skor, ":")
  43. if len(skorParts) != 2 {
  44. return fmt.Errorf("format skor tidak valid: '%s'. Contoh: '2:1'", skor)
  45. }
  46.  
  47. skorKandang, err := strconv.Atoi(skorParts[0])
  48. if err != nil {
  49. return fmt.Errorf("skor kandang tidak valid: %w", err)
  50. }
  51. skorTandang, err := strconv.Atoi(skorParts[1])
  52. if err != nil {
  53. return fmt.Errorf("skor tandang tidak valid: %w", err)
  54. }
  55.  
  56. // Menghitung poin berdasarkan hasil pertandingan
  57. if skorKandang > skorTandang {
  58. // Klub kandang menang
  59. k.Points[klubKandang] += 3
  60. } else if skorTandang > skorKandang {
  61. // Klub tandang menang
  62. k.Points[klubTandang] += 3
  63. } else {
  64. // Seri
  65. k.Points[klubKandang] += 1
  66. k.Points[klubTandang] += 1
  67. }
  68.  
  69. return nil // Tidak ada error
  70. }
  71.  
  72. // untuk cetakklasemen
  73. func (k *Klasemen) cetakKlasemen() []KlasemenEntry {
  74. // Mengubah map menjadi slice of KlasemenEntry
  75. entries := make([]KlasemenEntry, 0, len(k.Points))
  76. for club, points := range k.Points {
  77. entries = append(entries, KlasemenEntry{Club: club, Points: points})
  78. }
  79.  
  80. // Mengurutkan slice
  81. sort.Slice(entries, func(i, j int) bool {
  82. // Urutan utama: Poin (menurun)
  83. if entries[i].Points != entries[j].Points {
  84. return entries[i].Points > entries[j].Points
  85. }
  86. // Urutan kedua (tie-breaker): Nama klub (menaik/alfabetis)
  87. return entries[i].Club < entries[j].Club
  88. })
  89.  
  90. return entries
  91. }
  92.  
  93. // ambil peringkat dengan
  94. func (k *Klasemen) ambilPeringkat(nomorPeringkat int) (string, error) {
  95. if nomorPeringkat <= 0 {
  96. return "", errors.New("nomorPeringkat harus lebih besar dari 0")
  97. }
  98.  
  99. sortedKlasemen := k.cetakKlasemen() // Dapatkan klasemen yang sudah terurut
  100.  
  101. if nomorPeringkat > len(sortedKlasemen) {
  102. return "", fmt.Errorf("nomorPeringkat %d melebihi jumlah klub (%d)", nomorPeringkat, len(sortedKlasemen))
  103. }
  104.  
  105. // Karena slice berbasis 0-indeks, kurangi 1 dari nomor peringkat
  106. return sortedKlasemen[nomorPeringkat-1].Club, nil
  107. }
  108.  
  109. func main() {
  110. // buat data baru untuk 3 club dengan array
  111. klasemen := NewKlasemen([]string{"Liverpool", "Chelsea", "Arsenal"})
  112.  
  113. // Catat permainan sederhana
  114. fmt.Println("Mencatat permainan...")
  115. catatErr := klasemen.catatPermainan("Arsenal", "Liverpool", "2:1")
  116. if catatErr != nil {
  117. fmt.Println("Error mencatat permainan:", catatErr)
  118. }
  119. catatErr = klasemen.catatPermainan("Arsenal", "Chelsea", "1:1")
  120. if catatErr != nil {
  121. fmt.Println("Error mencatat permainan:", catatErr)
  122. }
  123. catatErr = klasemen.catatPermainan("Chelsea", "Arsenal", "0:3")
  124. if catatErr != nil {
  125. fmt.Println("Error mencatat permainan:", catatErr)
  126. }
  127. catatErr = klasemen.catatPermainan("Chelsea", "Liverpool", "3:2")
  128. if catatErr != nil {
  129. fmt.Println("Error mencatat permainan:", catatErr)
  130. }
  131. catatErr = klasemen.catatPermainan("Liverpool", "Arsenal", "2:2")
  132. if catatErr != nil {
  133. fmt.Println("Error mencatat permainan:", catatErr)
  134. }
  135. catatErr = klasemen.catatPermainan("Liverpool", "Chelsea", "0:0")
  136. if catatErr != nil {
  137. fmt.Println("Error mencatat permainan:", catatErr)
  138. }
  139.  
  140. fmt.Println("\n--- Hasil Klasemen ---")
  141.  
  142. sortedKlasemen := klasemen.cetakKlasemen()
  143. outputMap := make(map[string]int)
  144. for _, entry := range sortedKlasemen {
  145. outputMap[entry.Club] = entry.Points
  146. }
  147. fmt.Println(outputMap)
  148.  
  149.  
  150. fmt.Println("\nKlasemen (terurut):")
  151. for i, entry := range sortedKlasemen {
  152. fmt.Printf("%d. %s: %d poin\n", i+1, entry.Club, entry.Points)
  153. }
  154.  
  155. fmt.Println("\n--- Ambil Peringkat ---")
  156.  
  157. // returns 'Chelsea' test untuk peringkat 2
  158. peringkat2, err := klasemen.ambilPeringkat(2)
  159. if err != nil {
  160. fmt.Println("Error mengambil peringkat 2:", err)
  161. } else {
  162. fmt.Printf("Peringkat 2: '%s'\n", peringkat2)
  163. }
  164.  
  165. }
  166.  
Success #stdin #stdout 0.01s 5276KB
stdin
Standard input is empty
stdout
Mencatat permainan...

--- Hasil Klasemen ---
map[Arsenal:8 Chelsea:5 Liverpool:2]

Klasemen (terurut):
1. Arsenal: 8 poin
2. Chelsea: 5 poin
3. Liverpool: 2 poin

--- Ambil Peringkat ---
Peringkat 2: 'Chelsea'