fork download
  1. class Klasemen {
  2. constructor(klubList) {
  3. if (!Array.isArray(klubList) || klubList.length === 0) {
  4. throw new Error('Klub list harus berupa array dan tidak boleh kosong');
  5. }
  6.  
  7. const uniqueKlubs = [...new Set(klubList)];
  8. if (uniqueKlubs.length !== klubList.length) {
  9. throw new Error('Tidak boleh ada nama klub yang duplikat');
  10. }
  11.  
  12. this.klubs = {};
  13.  
  14. klubList.forEach(klub => {
  15. if (typeof klub !== 'string' || klub.trim() === '') {
  16. throw new Error('Nama klub harus berupa string dan tidak boleh kosong');
  17. }
  18. this.klubs[klub.trim()] = 0;
  19. });
  20. }
  21.  
  22. catatPermainan(klubKandang, klubTandang, skor) {
  23. if (typeof klubKandang !== 'string' || typeof klubTandang !== 'string' || typeof skor !== 'string') {
  24. throw new Error('Semua parameter harus berupa string');
  25. }
  26.  
  27. klubKandang = klubKandang.trim();
  28. klubTandang = klubTandang.trim();
  29. skor = skor.trim();
  30.  
  31. if (klubKandang === '' || klubTandang === '' || skor === '') {
  32. throw new Error('Parameter tidak boleh kosong');
  33. }
  34.  
  35. if (klubKandang === klubTandang) {
  36. throw new Error('Klub tidak bisa bermain melawan dirinya sendiri');
  37. }
  38.  
  39. if (!this.klubs.hasOwnProperty(klubKandang)) {
  40. this.klubs[klubKandang] = 0;
  41. }
  42. if (!this.klubs.hasOwnProperty(klubTandang)) {
  43. this.klubs[klubTandang] = 0;
  44. }
  45.  
  46. const skorRegex = /^\d+:\d+$/;
  47. if (!skorRegex.test(skor)) {
  48. throw new Error('Format skor tidak valid. Gunakan format "angka:angka"');
  49. }
  50.  
  51. const [skorKandang, skorTandang] = skor.split(':').map(Number);
  52.  
  53. if (!Number.isInteger(skorKandang) || !Number.isInteger(skorTandang)) {
  54. throw new Error('Skor harus berupa angka bulat');
  55. }
  56.  
  57. if (skorKandang < 0 || skorTandang < 0) {
  58. throw new Error('Skor tidak boleh negatif');
  59. }
  60.  
  61. if (skorKandang > skorTandang) {
  62. this.klubs[klubKandang] += 3;
  63. } else if (skorTandang > skorKandang) {
  64. this.klubs[klubTandang] += 3;
  65. } else {
  66. this.klubs[klubKandang] += 1;
  67. this.klubs[klubTandang] += 1;
  68. }
  69. }
  70.  
  71. cetakKlasemen() {
  72. const sorted = Object.entries(this.klubs)
  73. .sort(([aName, aPoint], [bName, bPoint]) => {
  74. if (bPoint !== aPoint) return bPoint - aPoint;
  75. return aName.localeCompare(bName);
  76. });
  77.  
  78. const formatted = sorted.map(([klub, poin]) => `'${klub}'=>${poin}`).join(', ');
  79. return `[${formatted}]`;
  80. }
  81.  
  82. ambilPeringkat(nomorPeringkat) {
  83. if (typeof nomorPeringkat !== 'number') {
  84. throw new Error('Nomor peringkat harus berupa number');
  85. }
  86.  
  87. if (!Number.isInteger(nomorPeringkat) || nomorPeringkat <= 0) {
  88. throw new Error('Nomor peringkat harus berupa integer positif');
  89. }
  90.  
  91. const sorted = Object.entries(this.klubs)
  92. .sort(([aName, aPoint], [bName, bPoint]) => {
  93. if (bPoint !== aPoint) return bPoint - aPoint;
  94. return aName.localeCompare(bName);
  95. });
  96.  
  97. if (nomorPeringkat <= sorted.length) {
  98. return sorted[nomorPeringkat - 1][0];
  99. }
  100.  
  101. return null;
  102. }
  103. }
  104.  
  105. const klasemen = new Klasemen(['Liverpool', 'Chelsea', 'Arsenal']);
  106. klasemen.catatPermainan('Arsenal', 'Liverpool', '2:1');
  107. klasemen.catatPermainan('Arsenal', 'Chelsea', '1:1');
  108. klasemen.catatPermainan('Chelsea', 'Arsenal', '0:3');
  109. klasemen.catatPermainan('Chelsea', 'Liverpool', '3:2');
  110. klasemen.catatPermainan('Liverpool', 'Arsenal', '2:2');
  111. klasemen.catatPermainan('Liverpool', 'Chelsea', '0:0');
  112. klasemen.catatPermainan('Madrid', 'Barcelona', '0:0');
  113.  
  114. console.log(klasemen.cetakKlasemen());
  115. console.log(klasemen.ambilPeringkat(2));
Success #stdin #stdout 0.06s 23632KB
stdin
Standard input is empty
stdout
['Arsenal'=>8, 'Chelsea'=>5, 'Liverpool'=>2, 'Barcelona'=>1, 'Madrid'=>1]
Chelsea