Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions TypeScriptExample/RomanNumeralDecode/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Dekoder Angka Romawi

Fungsi yang mengubah Angka romawi ke digit angka

### Contoh dan ouput

```
V -> 5
X -> 10
L -> 50
C -> 100
D -> 500

IV -> 4
IX -> 9
XL -> 40
XC -> 90
CD -> 400
CM -> 900

XLIV -> 44
XCVIII -> 98
MCMXCVII -> 1997
MMXXVI -> 2026

MMMCMXCIX -> 3999
"" -> 0
```

### penjelasan

contoh XLIV => 44

```bash
# kita tau kalau :
I: 1,
V: 5,
X: 10,
L: 50,
```

1. iterasi 1 di dapat `X (10)` dan karakter selanjutnya `L (50)` , karena **L** lebih besar , maka di kurangin
` 0 = 0 - 10 = -10`
2. iterasi 2 di dapat `L (50)` dan karakter selanjutnya `I (1)`, karena **L** lebih besar dari , maka :
`-10 = -10 + 50 = 40`
3. iterasi 3 di dapat `I (1)` dan karakter selanjutnya `V(5)` ,karena **V** lebih besar, maka di kurangin :
`40 = 40 - 1 = 39`

4. iterasi terakhir karena tidak ada karacter selanjutnya maka otomatis di tambahkan :
`39 = 39 + 5 =44 `

maka hasil akhir adalah ***`44` ***

### rerefence

["code war poble"](https://www.codewars.com/kata/51b6249c4612257ac0000005)
35 changes: 35 additions & 0 deletions TypeScriptExample/RomanNumeralDecode/romanNumeralsDecode.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import rnd from './romanNumeraslDecode';

describe('Roman Numerals Decoder', () => {
test('Mengecek karakter tunggal lainnya', () => {
expect(rnd('V')).toBe(5);
expect(rnd('X')).toBe(10);
expect(rnd('L')).toBe(50);
expect(rnd('C')).toBe(100);
expect(rnd('D')).toBe(500);
});

test('Mengecek pola pengurangan ', () => {
expect(rnd('IV')).toBe(4);
expect(rnd('IX')).toBe(9);
expect(rnd('XL')).toBe(40);
expect(rnd('XC')).toBe(90);
expect(rnd('CD')).toBe(400);
expect(rnd('CM')).toBe(900);
});

test('Mengecek kombinasi angka kompleks', () => {
expect(rnd('XLIV')).toBe(44); // 40 + 4
expect(rnd('XCVIII')).toBe(98); // 90 + 5 + 3
expect(rnd('MCMXCVII')).toBe(1997); // 1000 + 900 + 90 + 7
expect(rnd('MMXXVI')).toBe(2026); // Tahun sekarang
});

test('Mengecek angka maksimum standar (3999)', () => {
expect(rnd('MMMCMXCIX')).toBe(3999);
});

test('Mengecek string kosong atau input tidak valid', () => {
expect(rnd('')).toBe(0);
});
});
47 changes: 47 additions & 0 deletions TypeScriptExample/RomanNumeralDecode/romanNumeraslDecode.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/*
* Terjemahkan angka romawi ke digit angka
* @param roman - Angka romawi
* @returns digit angka yang telah di terjemahkan
*/
export default function (roman: string): number {
// agar sesuai dengan daftarAngka
const romanBaru = roman.toUpperCase();

// daftar angka yang sudah tau nilainya
// record untuk memberi tau type untuk object nya
const daftarAngka: Record<string, number> = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000,
};

// tampung hasil terjemahan nya
// variabel dengan kunci let untuk mutable atau dapat di ubah
let hasil = 0;
// untuk mendapatkan caracter selanjutnya
let indexKarakterSelanjutnya = 1;

// iterasi untuk mengambil setiap angka dari kata
for (const karakter of romanBaru) {
// dapatkan karakter selanjutnya
const karakterSelanjutnya =
daftarAngka[romanBaru[indexKarakterSelanjutnya]];

// seleksi jika karakter selanjutnya lebih besar nilainya dari karakter sebelumnya
if (karakterSelanjutnya && daftarAngka[karakter] < karakterSelanjutnya) {
// maka kurangi hasilnya dengan digit number dari karakter sekarang
hasil -= daftarAngka[karakter];
} else {
// jika tidak maka tambahkan digit number dari karakter
hasil += daftarAngka[karakter];
}
// naikkan ke karacter sekanjutnya
indexKarakterSelanjutnya++;
}

return hasil;
}
1 change: 1 addition & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,5 @@
"dependencies": {
"typescript": "^4.4.3"
}

}
Loading