ওরাকল এসকিউএল, 456 বাইট
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)
আউটপুট:
mmdcccxxxxviiii
দয়া করে নোট করুন যে লাইনের আসল আকারটি 460 বাইট, কারণ এতে ইনপুট নম্বর রয়েছে (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
)
এটি কীভাবে কাজ করে: আমি প্রতিটি অক্ষরের কতটি প্রয়োজন তা গণনা করি, সর্বাধিক গণনা করে আমি উচ্চতর মান একটি (এম এর জন্য অনন্ত) নিয়ে যেতে পারি, এবং তারপরে বর্তমান অক্ষরের মান এবং তার ফলাফলের মধ্যে একটি পূর্ণসংখ্যা বিভাগ করে।
উদাহরণস্বরূপ 2348, C
আমার কতগুলি দরকার?trunc((2348-mod(2348,500))/100)
= 3।
তারপরে, আমি listagg
সেই চিঠিটি একসাথে 3 বার করেছি ( CONNECT BY
আমার প্রয়োজনীয় 3 টি সারি উত্পন্ন করার জন্য কাজে লাগানো )। অবশেষে, আমিlistagg
একসাথে সবকিছু।
কিন্ডা ভারী, তবে এর বেশিরভাগই select from dual
রূপান্তর টেবিলের মধ্যে রয়েছে এবং আমি আসলে এটি সম্পর্কে খুব বেশি কিছু করতে পারি না ...
4 -> IIII
হয়9 -> VIIII
হিসেবে ভাল পরিবর্তেIX
?