package main
import (
"errors"
"fmt"
"sort"
"strconv"
"strings"
)
type KlasemenEntry struct {
Club string
Points int
}
type Klasemen struct {
Points map[string]int
}
func NewKlasemen(initialClubs []string) *Klasemen {
k := &Klasemen{
Points: make(map[string]int),
}
// Inisialisasi semua klub dengan 0 poin
for _, club := range initialClubs {
k.Points[club] = 0
}
return k
}
func (k *Klasemen) catatPermainan(klubKandang, klubTandang, skor string) error {
// Memastikan klub-klub yang terlibat sudah terdaftar di klasemen
if _, ok := k.Points[klubKandang]; !ok {
return fmt.Errorf("klub '%s' tidak terdaftar dalam klasemen", klubKandang)
}
if _, ok := k.Points[klubTandang]; !ok {
return fmt.Errorf("klub '%s' tidak terdaftar dalam klasemen", klubTandang)
}
// Parsing skor
skorParts := strings.Split(skor, ":")
if len(skorParts) != 2 {
return fmt.Errorf("format skor tidak valid: '%s'. Contoh: '2:1'", skor)
}
skorKandang, err := strconv.Atoi(skorParts[0])
if err != nil {
return fmt.Errorf("skor kandang tidak valid: %w", err)
}
skorTandang, err := strconv.Atoi(skorParts[1])
if err != nil {
return fmt.Errorf("skor tandang tidak valid: %w", err)
}
// Menghitung poin berdasarkan hasil pertandingan
if skorKandang > skorTandang {
// Klub kandang menang
k.Points[klubKandang] += 3
} else if skorTandang > skorKandang {
// Klub tandang menang
k.Points[klubTandang] += 3
} else {
// Seri
k.Points[klubKandang] += 1
k.Points[klubTandang] += 1
}
return nil // Tidak ada error
}
// untuk cetakklasemen
func (k *Klasemen) cetakKlasemen() []KlasemenEntry {
// Mengubah map menjadi slice of KlasemenEntry
entries := make([]KlasemenEntry, 0, len(k.Points))
for club, points := range k.Points {
entries = append(entries, KlasemenEntry{Club: club, Points: points})
}
// Mengurutkan slice
sort.Slice(entries, func(i, j int) bool {
// Urutan utama: Poin (menurun)
if entries[i].Points != entries[j].Points {
return entries[i].Points > entries[j].Points
}
// Urutan kedua (tie-breaker): Nama klub (menaik/alfabetis)
return entries[i].Club < entries[j].Club
})
return entries
}
// ambil peringkat dengan
func (k *Klasemen) ambilPeringkat(nomorPeringkat int) (string, error) {
if nomorPeringkat <= 0 {
return "", errors.New("nomorPeringkat harus lebih besar dari 0")
}
sortedKlasemen := k.cetakKlasemen() // Dapatkan klasemen yang sudah terurut
if nomorPeringkat > len(sortedKlasemen) {
return "", fmt.Errorf("nomorPeringkat %d melebihi jumlah klub (%d)", nomorPeringkat, len(sortedKlasemen))
}
// Karena slice berbasis 0-indeks, kurangi 1 dari nomor peringkat
return sortedKlasemen[nomorPeringkat-1].Club, nil
}
func main() {
// buat data baru untuk 3 club dengan array
klasemen := NewKlasemen([]string{"Liverpool", "Chelsea", "Arsenal"})
// Catat permainan sederhana
fmt.Println("Mencatat permainan...")
catatErr := klasemen.catatPermainan("Arsenal", "Liverpool", "2:1")
if catatErr != nil {
fmt.Println("Error mencatat permainan:", catatErr)
}
catatErr = klasemen.catatPermainan("Arsenal", "Chelsea", "1:1")
if catatErr != nil {
fmt.Println("Error mencatat permainan:", catatErr)
}
catatErr = klasemen.catatPermainan("Chelsea", "Arsenal", "0:3")
if catatErr != nil {
fmt.Println("Error mencatat permainan:", catatErr)
}
catatErr = klasemen.catatPermainan("Chelsea", "Liverpool", "3:2")
if catatErr != nil {
fmt.Println("Error mencatat permainan:", catatErr)
}
catatErr = klasemen.catatPermainan("Liverpool", "Arsenal", "2:2")
if catatErr != nil {
fmt.Println("Error mencatat permainan:", catatErr)
}
catatErr = klasemen.catatPermainan("Liverpool", "Chelsea", "0:0")
if catatErr != nil {
fmt.Println("Error mencatat permainan:", catatErr)
}
fmt.Println("\n--- Hasil Klasemen ---")
sortedKlasemen := klasemen.cetakKlasemen()
outputMap := make(map[string]int)
for _, entry := range sortedKlasemen {
outputMap[entry.Club] = entry.Points
}
fmt.Println(outputMap)
fmt.Println("\nKlasemen (terurut):")
for i, entry := range sortedKlasemen {
fmt.Printf("%d. %s: %d poin\n", i+1, entry.Club, entry.Points)
}
fmt.Println("\n--- Ambil Peringkat ---")
// returns 'Chelsea' test untuk peringkat 2
peringkat2, err := klasemen.ambilPeringkat(2)
if err != nil {
fmt.Println("Error mengambil peringkat 2:", err)
} else {
fmt.Printf("Peringkat 2: '%s'\n", peringkat2)
}
}