Oracle SQL, 456 bayt
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)
Çıktılar:
mmdcccxxxxviiii
Lütfen satırın gerçek boyutunun 460 bayt olduğunu unutmayın, çünkü giriş numarasını içerir (2849).
Ungolfed:
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
)
Nasıl çalışır: Her bir harften kaç tanesine ihtiyacım olduğunu hesaplarım, en yüksek değeri bir (M için sonsuz) değerine ulaşabileceğimi hesaplayarak ve sonra o mektubun değeri ile bunun sonucu arasında bir tamsayı bölüştürürüm.
2348, kaç taneye C
ihtiyacım var? trunc((2348-mod(2348,500))/100)
= 3.
Ardından, listagg
o mektubu 3 kez birlikte ( CONNECT BY
ihtiyacım olan 3 satırı oluşturmak için kullanmak ). Sonunda ben listagg
her şeyi birlikte yaparım .
Biraz hantal, ama çoğu select from dual
dönüşüm tablosundaki s ve bu konuda çok fazla şey yapamam ...
4 -> IIII
olduğu9 -> VIIII
yanı yerineIX
?