function.system.spqr.rq Maven / Gradle / Ivy
#
# Compute the romain notation of a number
# Compute the digital notation of a romain number
# Olivier Corby - Wimmics Inria I3S - 2015
#
prefix spqr:
select
(9999 as ?n)
(spqr:romain(?n) as ?r)
(spqr:digit(?r) as ?d)
where {}
@public {
function xt:romain(n) { spqr:spqr(n) }
function xt:digit(r) { spqr:parse(r) }
function spqr:romain(n) { spqr:spqr(n) }
function spqr:digit(r) { spqr:parse(r) }
function spqr:div(aa, bb) { xsd:integer(floor(aa / bb)) }
function spqr:mod(aa, bb) { xsd:integer(aa - (bb * spqr:div(aa, bb))) }
function spqr:rep(s, n) {
if (n = 0, "",
if (n = 1, s,
concat(s, spqr:rep(s, n - 1))))
}
function spqr:r1(n) {
spqr:num(n, "I", "V", "X")
}
function spqr:r10(n) {
spqr:num(n, "X", "L", "C")
}
function spqr:r100(n) {
spqr:num(n, "C", "D", "M")
}
function spqr:r1000(n) {
spqr:rep("M", n)
}
function spqr:num(n, u, ff, t) {
if (n <= 3, spqr:rep(u, n),
if (n = 4, concat(u, ff),
if (n < 9, concat(ff, spqr:rep(u, n - 5)),
if (n = 9, concat(u, t), ""))))
}
function spqr:spqr(n) {
if (n < 10, spqr:r1(n),
if (n < 100,
let (cc = spqr:div(n, 10),
r = spqr:mod(n, 10)){
concat(spqr:r10(cc), spqr:spqr(r))
},
if (n < 1000,
let (cc = spqr:div(n, 100),
r = spqr:mod(n, 100)){
concat(spqr:r100(cc), spqr:spqr(r))
},
if (n < 10000,
let (cc = spqr:div(n, 1000),
r = spqr:mod(n, 1000)){
concat(spqr:r1000(cc), spqr:spqr(r))
},
n))))
}
# parse romain number
function spqr:parse(s) {
if (strlen(s) = 0, 0,
let (ff = substr(s, 1, 1)){
if (ff = "I", spqr:step(s, "I", "V", "X", 1, 5, 10),
if (ff = "V", 5 + spqr:parse(substr(s, 2)),
if (ff = "X", spqr:step(s, "X", "L", "C", 10, 50, 100),
if (ff = "L", 50 + spqr:parse(substr(s, 2)),
if (ff = "C", spqr:step(s, "C", "D", "M", 100, 500, 1000),
if (ff = "D", 500 + spqr:parse(substr(s, 2)),
if (ff = "M", 1000 + spqr:parse(substr(s, 2)),
0)))))))
}
)
}
function spqr:step(s, su, sc, sd, u, cc, dd) {
if (strlen(s) = 1, u,
let (r = substr(s, 2, 1)){
if (r = sc, cc - u + spqr:parse(substr(s, 3)),
if (r = sd, dd - u + spqr:parse(substr(s, 3)),
u + spqr:parse(substr(s, 2))))
}
)
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy