مكتبة أرقام رومانية PHP بسيطة
تشتمل هذه المكتبة على مرشحين بسيطين لتحويل string
ذات رقم روماني إلى int
الذي يمثل الإدخال كرقم عشري وعشري int
إلى string
ذات رقم روماني نتيجة لذلك.
use Romans Filter RomanToInt ;
$ filter = new RomanToInt ();
$ result = $ filter -> filter ( ' MCMXCIX ' ); // 1999
use Romans Filter IntToRoman ;
$ filter = new IntToRoman ();
$ result = $ filter -> filter ( 1999 ); // MCMXCIX
تستخدم هذه الحزمة Composer كمستودع افتراضي. يمكنك تثبيته بإضافة اسم الحزمة في القسم require
من composer.json
، مع الإشارة إلى الإصدار الثابت الأخير.
{
"require" : {
"wandersonwhcr/romans" : " ^1.0 "
}
}
كما يستخدم الرومان الإصدار الدلالي. تدعم إصدارات الحزمة التالية إصدارات PHP هذه:
1.0.*
: PHP ^7.0
(أغسطس)1.1.*
: PHP ^7.0
(طبريا)1.2.*
: PHP >=7.4
(كاليغولا)1.3.*
: PHP >=7.4
(كلوديوس)1.4.*
: PHP >=7.4
(نيرون)1.5.*
: PHP >=8.0
(غالبا) يمكن استخدام هذه المكتبة كتبعية للمشاريع، مما يجعل التكامل مع المكتبات أو أطر العمل أسهل. إذا كنت ترغب في إضافة المزيد من العناصر في هذه القائمة، من فضلك، افتح مشكلة أو قم بإنشاء طلب سحب، مع إضافة مشروعك أبجديًا.
تستخدم حزمة Romans
أسلوب Lexer-Parser وأداة حتمية محددة (DFA) لتحويل الرقم الروماني إلى int
باستخدام مكتبة الرموز النحوية.
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
يستخدم عامل التصفية RomanToInt
Lexer لرمز الإدخال والمحلل لإنشاء رقم int
. عند العثور على أخطاء، يقوم Lexer أو Parser بطرح استثناءات للإبلاغ عن المشكلة باستخدام رمز محدد.
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)
}
يمكنك استخدام هذه البنية للتحقق من صحة الأرقام الرومانية، وإضافة كتلة Try..catch للتحقق مما إذا كان $input
صالحًا. يمكنك أيضًا التحقق من إمكانية تصفية int
إلى Roman باستخدام مرشح 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)
}
يتم تمثيل القيمة الصفرية string
"N"
، أول حرف من nulla أو nihil ، الكلمة اللاتينية التي تعني "لا شيء" (انظر المراجع).
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
تستخدم هذه الحزمة واجهة التخزين المؤقت PSR-6 لتحسين التنفيذ، بشكل أساسي عبر الحلقات (مثل while
أو foreach
) باستخدام مكتبات ذاكرة التخزين المؤقت. يمكن استخدام أي تطبيق PSR-6 ونقترح حزمة 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)
يمكنك استخدام Docker Compose لإنشاء صورة وتشغيل حاوية لتطوير هذه الحزمة واختبارها.
docker-compose build
docker-compose run --rm romans composer install
docker-compose run --rm romans composer test
يصف هذا القسم التقنيات المستخدمة بواسطة هذه الحزمة لتحويل الأرقام الرومانية إلى int
والعكس.
تم اختيار نهج Lexer-Parser لأن التحقق من صحة الأرقام الرومانية وقراءتها أكثر بساطة: Lexer مسؤول عن قراءة المدخلات وتحويلها إلى رموز مميزة، والتحقق من صحة المحتوى على مستوى char؛ ويكون المحلل اللغوي مسؤولاً عن تحويل الرموز المميزة إلى أرقام والتحقق من صحة المحتوى على مستوى الموضع والتحويل إلى int
من خلال DFA.
تقول ويكيبيديا أن "التحليل المعجمي هو عملية تحويل سلسلة من الأحرف إلى سلسلة من الرموز المميزة"، وهو "هيكل يمثل معجمًا يشير بوضوح إلى تصنيفه لغرض التحليل". حتى أن ويكيبيديا تقول أن "التحليل النحوي أو التحليل النحوي هو عملية تحليل الرموز المتوافقة مع قواعد النحو الرسمي".
تسهل هذه البنية تطوير البنية المسؤولة عن قراءة string
الإدخال وتحويلها إلى بنية أخرى وفقًا لمجموعة أحرف محددة وموقعها داخل الإدخال.
تم تطوير DFA للتحقق مما إذا كانت string
ذات الرقم الروماني صالحة. تم اختيار هذه التقنية لأن التطبيقات الأخرى تقوم ببساطة بتحويل الإدخال دون التحقق من القواعد، مثل أربعة أحرف بشكل تسلسلي.
تم الإعلان عن تعريف الإنسان الحالي أدناه.
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
هذه الحزمة مفتوحة المصدر ومتاحة بموجب ترخيص MIT الموضح في الترخيص.