class Klasemen {
constructor(klubList) {
if (!Array.isArray(klubList) || klubList.length === 0) {
throw new Error('Klub list harus berupa array dan tidak boleh kosong');
}
const uniqueKlubs = [...new Set(klubList)];
if (uniqueKlubs.length !== klubList.length) {
throw new Error('Tidak boleh ada nama klub yang duplikat');
}
this.klubs = {};
klubList.forEach(klub => {
if (typeof klub !== 'string' || klub.trim() === '') {
throw new Error('Nama klub harus berupa string dan tidak boleh kosong');
}
this.klubs[klub.trim()] = 0;
});
}
catatPermainan(klubKandang, klubTandang, skor) {
if (typeof klubKandang !== 'string' || typeof klubTandang !== 'string' || typeof skor !== 'string') {
throw new Error('Semua parameter harus berupa string');
}
klubKandang = klubKandang.trim();
klubTandang = klubTandang.trim();
skor = skor.trim();
if (klubKandang === '' || klubTandang === '' || skor === '') {
throw new Error('Parameter tidak boleh kosong');
}
if (klubKandang === klubTandang) {
throw new Error('Klub tidak bisa bermain melawan dirinya sendiri');
}
if (!this.klubs.hasOwnProperty(klubKandang)) {
this.klubs[klubKandang] = 0;
}
if (!this.klubs.hasOwnProperty(klubTandang)) {
this.klubs[klubTandang] = 0;
}
const skorRegex = /^\d+:\d+$/;
if (!skorRegex.test(skor)) {
throw new Error('Format skor tidak valid. Gunakan format "angka:angka"');
}
const [skorKandang, skorTandang] = skor.split(':').map(Number);
if (!Number.isInteger(skorKandang) || !Number.isInteger(skorTandang)) {
throw new Error('Skor harus berupa angka bulat');
}
if (skorKandang < 0 || skorTandang < 0) {
throw new Error('Skor tidak boleh negatif');
}
if (skorKandang > skorTandang) {
this.klubs[klubKandang] += 3;
} else if (skorTandang > skorKandang) {
this.klubs[klubTandang] += 3;
} else {
this.klubs[klubKandang] += 1;
this.klubs[klubTandang] += 1;
}
}
cetakKlasemen() {
const sorted = Object.entries(this.klubs)
.sort(([aName, aPoint], [bName, bPoint]) => {
if (bPoint !== aPoint) return bPoint - aPoint;
return aName.localeCompare(bName);
});
const formatted = sorted.map(([klub, poin]) => `'${klub}'=>${poin}`).join(', ');
return `[${formatted}]`;
}
ambilPeringkat(nomorPeringkat) {
if (typeof nomorPeringkat !== 'number') {
throw new Error('Nomor peringkat harus berupa number');
}
if (!Number.isInteger(nomorPeringkat) || nomorPeringkat <= 0) {
throw new Error('Nomor peringkat harus berupa integer positif');
}
const sorted = Object.entries(this.klubs)
.sort(([aName, aPoint], [bName, bPoint]) => {
if (bPoint !== aPoint) return bPoint - aPoint;
return aName.localeCompare(bName);
});
if (nomorPeringkat <= sorted.length) {
return sorted[nomorPeringkat - 1][0];
}
return null;
}
}
const klasemen = new Klasemen(['Liverpool', 'Chelsea', 'Arsenal']);
klasemen.catatPermainan('Arsenal', 'Liverpool', '2:1');
klasemen.catatPermainan('Arsenal', 'Chelsea', '1:1');
klasemen.catatPermainan('Chelsea', 'Arsenal', '0:3');
klasemen.catatPermainan('Chelsea', 'Liverpool', '3:2');
klasemen.catatPermainan('Liverpool', 'Arsenal', '2:2');
klasemen.catatPermainan('Liverpool', 'Chelsea', '0:0');
klasemen.catatPermainan('Madrid', 'Barcelona', '0:0');
console.log(klasemen.cetakKlasemen());
console.log(klasemen.ambilPeringkat(2));