Perpustakaan Angka Romawi PHP Sederhana
Pustaka ini menyertakan beberapa filter sederhana untuk mengonversi string
dengan angka Romawi menjadi int
yang mewakili input sebagai desimal dan int
desimal menjadi string
dengan angka Romawi sebagai hasilnya.
use Romans Filter RomanToInt ;
$ filter = new RomanToInt ();
$ result = $ filter -> filter ( ' MCMXCIX ' ); // 1999
use Romans Filter IntToRoman ;
$ filter = new IntToRoman ();
$ result = $ filter -> filter ( 1999 ); // MCMXCIX
Paket ini menggunakan Komposer sebagai repositori default. Anda dapat menginstalnya dengan menambahkan nama paket di bagian require
pada composer.json
, dengan menunjuk ke versi stabil terakhir.
{
"require" : {
"wandersonwhcr/romans" : " ^1.0 "
}
}
Juga, Roma menggunakan Versi Semantik. Versi paket berikut mendukung rilis PHP ini:
1.0.*
: PHP ^7.0
(Agustus)1.1.*
: PHP ^7.0
(Tiberius)1.2.*
: PHP >=7.4
(Caligula)1.3.*
: PHP >=7.4
(Claudius)1.4.*
: PHP >=7.4
(Nero)1.5.*
: PHP >=8.0
(Galba) Pustaka ini dapat digunakan sebagai ketergantungan untuk proyek, membuat integrasi dengan pustaka atau kerangka kerja menjadi lebih mudah. Jika Anda ingin menambahkan lebih banyak item dalam daftar ini, silakan buka terbitan atau buat permintaan tarik, tambahkan proyek Anda berdasarkan abjad.
Paket Romans
menggunakan pendekatan Lexer-Parser dan Deterministic Finite Automaton (DFA) untuk mengonversi bilangan Romawi menjadi int
, menggunakan pustaka Grammar Token.
use Romans Grammar Grammar ;
use Romans Lexer Lexer ;
use Romans Parser Parser ;
$ grammar = new Grammar ();
$ lexer = new Lexer ( $ grammar );
$ parser = new Parser ( $ grammar );
$ tokens = $ lexer -> tokenize ( ' MCMXCIX ' );
/*
$tokens = [
0 => 'M' // Grammar::T_M
1 => 'C', // Grammar::T_C
2 => 'M', // Grammar::T_M
3 => 'X', // Grammar::T_X
4 => 'C', // Grammar::T_C
5 => 'I', // Grammar::T_I
6 => 'X', // Grammar::T_X
];
*/
$ result = $ parser -> parse ( $ tokens ); // 1999
Filter RomanToInt
menggunakan Lexer untuk memberi token pada input dan Parser untuk membuat nomor int
. Ketika kesalahan ditemukan, Lexer atau Parser mengeluarkan Pengecualian untuk memberitahukan masalah dengan kode tertentu.
use Romans Filter RomanToInt ;
use Romans Lexer Exception as LexerException ;
use Romans Parser Exception as ParserException ;
$ filter = new RomanToInt ();
try {
$ filter -> filter ( $ input );
} catch ( LexerException $ e ) {
// Unknown Token (LexerException::UNKNOWN_TOKEN)
} catch ( ParserException $ e ) {
// Invalid Token Type (Not String) (ParserException::INVALID_TOKEN_TYPE)
// Unknown Token (ParserException::UNKNOWN_TOKEN)
// Invalid Roman (ParserException::INVALID_ROMAN)
}
Anda dapat menggunakan struktur ini untuk memvalidasi angka Romawi, menambahkan blok try..catch untuk memeriksa apakah $input
valid. Selain itu, Anda dapat memvalidasi apakah int
dapat difilter ke bahasa Romawi menggunakan filter IntToRoman
.
use Romans Filter IntToRoman ;
use Romans Filter Exception as FilterException ;
$ filter = new IntToRoman ();
try {
$ filter -> filter ( $ input );
} catch ( FilterException $ e ) {
// Invalid Integer (< 0) (FilterException::INVALID_INTEGER)
}
Nilai nol direpresentasikan sebagai string
"N"
, inisial dari nulla atau nihil , kata Latin untuk "tidak ada" (lihat referensi).
use Romans Filter RomanToInt ;
use Romans Filter IntToRoman ;
$ filter = new RomanToInt ();
$ result = $ filter -> filter ( ' N ' ); // 0 (Zero)
$ filter = new IntToRoman ();
$ result = $ filter -> filter ( 0 ); // N
Paket ini menggunakan Antarmuka Caching PSR-6 untuk meningkatkan eksekusi, terutama melalui loop (seperti while
atau foreach
) menggunakan pustaka cache. Implementasi PSR-6 apa pun dapat digunakan dan kami menyarankan paket Symfony Cache.
use Romans Filter IntToRoman ;
use Romans Filter RomanToInt ;
use Symfony Component Cache Adapter ArrayAdapter ;
$ cache = new ArrayAdapter ();
$ filter = new RomanToInt ();
$ filter -> setCache ( $ cache );
$ result = $ filter -> filter ( ' MCMXCIX ' ); // 1999
$ result = $ filter -> filter ( ' MCMXCIX ' ); // 1999 (from cache)
$ filter = new IntToRoman ();
$ filter -> setCache ( $ cache );
$ result = $ filter -> filter ( 1999 ); // MCMXCIX
$ result = $ filter -> filter ( 1999 ); // MCMXCIX (from cache)
Anda dapat menggunakan Docker Compose untuk membuat image dan menjalankan container untuk mengembangkan dan menguji paket ini.
docker-compose build
docker-compose run --rm romans composer install
docker-compose run --rm romans composer test
Bagian ini menjelaskan teknik yang digunakan oleh paket ini untuk mengubah bilangan Romawi menjadi int
dan sebaliknya.
Pendekatan Lexer-Parser dipilih karena validasi dan pembacaan angka Romawi lebih disederhanakan: Lexer bertanggung jawab untuk membaca dan mengubah masukan menjadi token, memvalidasi konten pada level char; dan Parser bertanggung jawab untuk mengubah token menjadi angka, memvalidasi konten di tingkat posisi, dan mengonversi ke int
melalui DFA.
Wikipedia mengatakan bahwa "analisis leksikal adalah proses mengubah rangkaian karakter menjadi rangkaian token", bahwa "adalah struktur yang mewakili suatu leksem yang secara eksplisit menunjukkan kategorisasinya untuk tujuan penguraian". Bahkan Wikipedia menyebutkan bahwa “parsing atau analisis sintaksis adalah proses menganalisis simbol-simbol yang sesuai dengan kaidah tata bahasa formal”.
Struktur ini mempermudah pengembangan struktur yang bertanggung jawab untuk membaca string
masukan, mengubahnya menjadi struktur lain sesuai dengan rangkaian karakter tertentu dan posisinya di dalam masukan.
DFA dikembangkan untuk memeriksa apakah string
dengan nomor Romawi valid. Teknik ini dipilih karena implementasi lain hanya mengonversi masukan tanpa memeriksa aturan, seperti empat karakter secara berurutan.
Definisi automaton saat ini dinyatakan di bawah ini.
M = (Q, Σ, δ, q0, F)
Q = { a, b, c, d, e, f, g, y, z }
Σ = { I, V, X, L, C, D, M, N }
q0 = g
F = { z }
z -> ε
y -> $z
a -> y | Iy | IIy | IIIy
b -> a | IVy | Va | IXy
c -> b | Xb | XXb | XXXb
d -> c | XLb | Lc | XCb
e -> d | Cd | CCd | CCCd
f -> e | CDd | De | CMd
g -> f | Ny | Mg
Paket ini bersifat opensource dan tersedia di bawah lisensi MIT yang dijelaskan dalam LISENSI.