Oracle SQL, 456 byte
select listagg((select listagg(l)within group(order by 1)from dual start with trunc((n-nvl(n-mod(n,p),0))/v)>0 connect by level<=trunc((n-nvl(n-mod(n,p),0))/v)))within group(order by v desc)from (select 2849n from dual)cross join(select 1000v,null p,'m'l from dual union select 500,1000,'d'from dual union select 100,500,'c'from dual union select 50,100,'l'from dual union select 10,50,'x'from dual union select 5,10,'v'from dual union select 1,5,'i'from dual)
Đầu ra:
mmdcccxxxxviiii
Xin lưu ý kích thước thực tế của dòng là 460byte, vì nó bao gồm số đầu vào (2849).
Ung dung:
select listagg(
(select listagg(l, '') within group(order by 1)
from dual
start with trunc((n-nvl(p*trunc(n/p),0))/v) > 0
connect by level <= trunc((n-nvl(p*trunc(n/p),0))/v) )
) within group(order by v desc)
from (select 2348 n
from dual
) cross join (
select 1000v, null p, 'm' l from dual union
select 500, 1000, 'd' from dual union
select 100, 500, 'c' from dual union
select 50, 100, 'l' from dual union
select 10, 50, 'x' from dual union
select 5, 10, 'v' from dual union
select 1, 5, 'i' from dual
)
Cách thức hoạt động: Tôi tính toán tôi cần bao nhiêu chữ cái, bằng cách tính toán nhiều nhất tôi có thể nhận được với giá trị cao hơn (vô cùng cho M), và sau đó thực hiện phép chia số nguyên giữa giá trị của chữ cái hiện tại và kết quả của chữ cái đó.
Ví dụ 2348, C
tôi cần bao nhiêu s? trunc((2348-mod(2348,500))/100)
= 3.
Sau đó, tôi listagg
viết thư đó 3 lần (khai thác CONNECT BY
để tạo 3 hàng tôi cần). Cuối cùng tôilistagg
mọi thứ cùng nhau.
Hơi cồng kềnh, nhưng hầu hết là select from dual
s trong bảng chuyển đổi và tôi thực sự không thể làm gì nhiều về điều đó ...
4 -> IIII
là9 -> VIIII
tốt thay vìIX
?