fork download
  1. package main
  2.  
  3. import (
  4. "errors"
  5. "fmt"
  6. "sort"
  7. "strconv"
  8. "strings"
  9. )
  10.  
  11. // Struct Klasemen menyimpan data poin setiap klub
  12. type Klasemen struct {
  13. poin map[string]int
  14. urutanKlub []string
  15. }
  16.  
  17. // NewKlasemen sebagai constructor untuk menerima daftar klub
  18. func NewKlasemen(klubKlub []string) *Klasemen {
  19. k := &Klasemen{
  20. poin: make(map[string]int),
  21. }
  22. for _, nama := range klubKlub {
  23. k.poin[nama] = 0
  24. k.urutanKlub = append(k.urutanKlub, nama)
  25. }
  26. return k
  27. }
  28.  
  29. // function parseSkor untuk mengubah string skor seperti "1:0" menjadi dua angka integer
  30. func parseSkor(skor string) (int, int, error) {
  31. bagian := strings.Split(skor, ":")
  32. if len(bagian) != 2 {
  33. return 0, 0, errors.New("format skor tidak validd, gunakan format 'angka:angka'")
  34. }
  35.  
  36. skorKandang, err := strconv.Atoi(strings.TrimSpace(bagian[0]))
  37. if err != nil {
  38. return 0, 0, errors.New("skor kandang bukan angka yang valid")
  39. }
  40.  
  41. skorTandang, err := strconv.Atoi(strings.TrimSpace(bagian[1]))
  42. if err != nil {
  43. return 0, 0, errors.New("skor tandang bukan angka yang valid")
  44. }
  45.  
  46. return skorKandang, skorTandang, nil
  47. }
  48.  
  49. // function catatPermainan untuk mencatat hasil pertandingan dan menghitung poin
  50. func (k *Klasemen) catatPermainan(klubKandang, klubTandang, skor string) error {
  51. skorKandang, skorTandang, err := parseSkor(skor)
  52. if err != nil {
  53. return err
  54. }
  55.  
  56. switch {
  57. case skorKandang > skorTandang:
  58. k.poin[klubKandang] += 3
  59. case skorKandang < skorTandang:
  60. k.poin[klubTandang] += 3
  61. default: // seri
  62. k.poin[klubKandang] += 1
  63. k.poin[klubTandang] += 1
  64. }
  65.  
  66. return nil
  67. }
  68.  
  69. // struct pasanganKlub digunakan untuk menjaga urutan klub+poin saat di-sort
  70. type pasanganKlub struct {
  71. nama string
  72. poin int
  73. }
  74.  
  75. // function cetakKlasemen mengembalikan daftar klub terurut dari poin tertinggi ke terendah
  76. func (k *Klasemen) cetakKlasemen() []pasanganKlub {
  77. var hasil []pasanganKlub
  78. for _, nama := range k.urutanKlub {
  79. hasil = append(hasil, pasanganKlub{nama: nama, poin: k.poin[nama]})
  80. }
  81.  
  82. sort.SliceStable(hasil, func(i, j int) bool {
  83. return hasil[i].poin > hasil[j].poin
  84. })
  85.  
  86. return hasil
  87. }
  88.  
  89. // function ambilPeringkat untuk mengembalikan nama klub di posisi tertentu (1 = teratas)
  90. func (k *Klasemen) ambilPeringkat(nomorPeringkat int) (string, error) {
  91. klasemen := k.cetakKlasemen()
  92.  
  93. if nomorPeringkat < 1 || nomorPeringkat > len(klasemen) {
  94. return "", fmt.Errorf("peringkat %d tidak ditemukan", nomorPeringkat)
  95. }
  96.  
  97. return klasemen[nomorPeringkat-1].nama, nil
  98. }
  99.  
  100. func main() {
  101. klasemen := NewKlasemen([]string{
  102. "Persija Jakarta",
  103. "Persib Bandung",
  104. "Arema FC",
  105. "Persebaya Surabaya",
  106. })
  107.  
  108. klasemen.catatPermainan("Persija Jakarta", "Persib Bandung", "2:1")
  109. klasemen.catatPermainan("Arema FC", "Persebaya Surabaya", "2:0")
  110. klasemen.catatPermainan("Persib Bandung", "Arema FC", "3:3")
  111. klasemen.catatPermainan("Persebaya Surabaya", "Persija Jakarta", "1:2")
  112. klasemen.catatPermainan("Persija Jakarta", "Arema FC", "2:3")
  113. klasemen.catatPermainan("Persib Bandung", "Persebaya Surabaya", "4:2")
  114.  
  115. fmt.Println("Klasemen akhir:")
  116. for _, pasangan := range klasemen.cetakKlasemen() {
  117. fmt.Printf("%s -> %d\n", pasangan.nama, pasangan.poin)
  118. }
  119.  
  120. peringkat1, err := klasemen.ambilPeringkat(1)
  121. if err != nil {
  122. fmt.Println("Error:", err)
  123. } else {
  124. fmt.Println("Peringkat 1:", peringkat1)
  125. }
  126. }
Success #stdin #stdout 0s 5316KB
stdin
Standard input is empty
stdout
Klasemen akhir:
Arema FC -> 7
Persija Jakarta -> 6
Persib Bandung -> 4
Persebaya Surabaya -> 0
Peringkat 1: Arema FC