ไลบรารีตัวเลขโรมัน 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
(Nero)1.5.*
: PHP >=8.0
(กัลบา) ไลบรารีนี้สามารถใช้เป็นข้อมูลอ้างอิงสำหรับโปรเจ็กต์ได้ ทำให้การผสานรวมกับไลบรารีหรือเฟรมเวิร์กทำได้ง่ายขึ้น หากคุณต้องการเพิ่มรายการอื่นๆ ในรายการนี้ โปรดเปิดประเด็นหรือสร้างคำขอดึง โดยเพิ่มโครงการของคุณตามลำดับตัวอักษร
แพ็คเกจ Romans
ใช้วิธีการ Lexer-Parser และ Deterministic Finite Automaton (DFA) เพื่อแปลงเลขโรมันเป็น int
โดยใช้ไลบรารี 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
ตัวกรอง RomanToInt
ใช้ Lexer เพื่อสร้างโทเค็นอินพุตและ Parser เพื่อสร้างหมายเลข 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 มีหน้าที่ในการอ่านและแปลงอินพุตเป็นโทเค็น ตรวจสอบเนื้อหาที่ระดับถ่าน และ Parser มีหน้าที่รับผิดชอบในการแปลงโทเค็นเป็นตัวเลข ตรวจสอบเนื้อหาในระดับตำแหน่ง และแปลงเป็น 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 ที่อธิบายไว้ในใบอนุญาต