সেই লোভী রোমানরা!


30

একটি কঠোর ইতিবাচক পূর্ণসংখ্যার দেওয়া, শুধুমাত্র সংযোজনীয় নিয়ম ব্যবহার করে সবচেয়ে সংক্ষিপ্ততম রোমান অঙ্কটি ফিরিয়ে দিন। আউটপুট অবশ্যই শৃঙ্খলে প্রতিটি অক্ষরের শূন্য বা তার বেশি থাকতে হবে MDCLXVI। সংখ্যাটি বরং পরিবর্তে 14দিতে হবে ।XIIIIXIV

বর্ণগুলির সংখ্যাগত মানগুলি M= 1000, D= 500, C= 100, L= 50, X= 10, V= 5, I= 1।

উদাহরণ

3III

4 → IIII

9VIIII

42XXXXII

796DCCLXXXXVI

2017MMXVII

16807MMMMMMMMMMMMMMMMDCCCVII


1
আপনি অনুমতি দেয় একটি হিতৈষী প্রশ্নকারী করছি 4 -> IIIIহয় 9 -> VIIIIহিসেবে ভাল পরিবর্তে IX?
ম্যাজিক অক্টোপাস উর্ন


@ ম্যাজিক অ্যাক্টোপাসউর্ন VIIII9 এর একমাত্র অনুমোদিত আউটপুট
অ্যাডাম

@ অ্যাডাম কেবল ইঙ্গিত করছিলেন যে আপনি এটি উদাহরণ হিসাবেও যুক্ত করতে চাইতে পারেন কারণ 4 এবং 9 এর নিয়ম একই।
যাদু অক্টোপাস উরন

উত্তর:


12

সরল ইংলিশ , 1059 1025 678 641 451 399 বাইট

একটি ত্রুটি ফাঁদটি সরিয়ে 34 বাইট সংরক্ষণ করা হয়েছে। তারপরে গল্ফ করে 384 বাইট সংরক্ষণ করুন তারপরে অ্যাডেন্ড অপারেশন ("জেড") এর সাথে বিভাগ অপারেশনকে একটি নতুন অপারেশন ("পি") এর সাথে সংযুক্ত করে 190 বাইট সংরক্ষণ করা হয়েছে। তারপর গল্ফ করে 52 বাইট সংরক্ষণ করুন

A s is a string.
To p a r remainder a s a x string a n number:
If the x is "", exit.
Divide the r by the n giving a q quotient and the r.
Fill a t s with the x's first's target given the q.
Append the t to the s.
To convert a r number to a s:
p the r the s "M" 1000.
p the r the s "D" 500.
p the r the s "C" 100.
p the r the s "L" 50.
p the r the s "X" 10.
p the r the s "V" 5.
p the r the s "I" 1.

এখানে চূড়ান্ত কোডটির অরোগল্ফড সংস্করণ, প্লাস aণাত্মক সংখ্যার জন্য একটি ত্রুটি জাল রয়েছে:

A roman numeral is a string.

To process a remainder given a roman numeral and a letter string is a number:
  If the letter is "", exit.
  Divide the remainder by the number giving a quotient and the remainder.
  Fill a temp string with the letter's first's target given the quotient.
  Append the temp string to the roman numeral.

To convert a number to a roman numeral:
  If the number is negative, exit.
  Put the number in a remainder.
  Process the remainder given the roman numeral and "M" is 1000.
  Process the remainder given the roman numeral and "D" is  500.
  Process the remainder given the roman numeral and "C" is  100.
  Process the remainder given the roman numeral and "L" is   50.
  Process the remainder given the roman numeral and "X" is   10.
  Process the remainder given the roman numeral and "V" is    5.
  Process the remainder given the roman numeral and "I" is    1.

10
অপেক্ষা করুন, এটি কি প্রোগ্রামিংয়ের ভাষা?
অ্যাডম

3
@ অ্যাডাম - হ্যাঁ সরল ইংলিশ সংকলন করে, এবং রান করে এবং সমস্ত কিছু। উত্স কোড এবং আইডিই github.com/ ফোল্ডস
জ্যাস্পার

1
যদিও এটি গল্ফ করুন - সর্বোপরি, এটি কোড গল্ফ, কোনও ভাষা শোকেস নয়।
সানচাইজস

2
আপনি আপনার কাজ আউটসোর্স না চাইলে আপনি এটি যে ভাষাটি ব্যবহার করেন তা আমি গ্রহণ করি?
কর্সিকা

@ করসিকা - লোল! কেবলমাত্র যদি আমাদের মধ্যে এটির ব্যবহার শুরু হয় (এবং এর লাইব্রেরিতে যুক্ত করা হয়) যা এটি সমালোচনামূলক ভর অর্জন করে।
জ্যাস্পার

5

ভাল, এবং মূলত আমার মনে যে সমাধান ছিল তা। তবে আপনি /পুনরায় আকার ( ) পরিবর্তে প্রতিলিপি ( ) ব্যবহার করতে পারেন যাতে আপনি প্রতিটি এবং কাটেনেট-হ্রাস ( ¨এবং ,/) কেটে ফেলতে পারেন ।
অ্যাডম

এছাড়াও, আপনি ট্রেডফেন বডিতে রূপান্তর করতে পারেন এবং ইনপুট ( ) নিতে পারেন এবং প্যারেন্স এবং রচনা ( ) রচনা করতে কমিট ( ) ব্যবহার করতে পারেন ।
অ্যাডম

ধন্যবাদ, তবে আপনার দ্বিতীয় মন্তব্যে আপনি কী বোঝাতে চাইছেন? আমি বাইট গণনা না বাড়িয়ে তা করার কোনও
উপায়ের কথা


1
আপনি যদি ফাংশনটি চারপাশে বা তার চারপাশে গণনা না করেন তবে এটি একটি স্নিপেট হবে{}∇f∇
টুইটনাট

5

রেটিনা , 57 42 বাইট

অ্যানারিতে রূপান্তরিত হয়, তারপরে লোভজনকভাবে গুলিগুলির গোছাগুলি Iউচ্চতর সংখ্যার সাথে ক্রম প্রতিস্থাপন করে।

.*
$*I
I{5}
V
VV
X
X{5}
L
LL
C
C{5}
D
DD
M

এটি অনলাইনে চেষ্টা করুন

মার্টিনকে ধন্যবাদ 15 বাইট সংরক্ষণ করা


খুব চালাক।
অ্যাডম

7
অন্য পথে যেতে এটি অনেক ছোট: tio.run/##K0otycxL/…
মার্টিন

আপনি Iইউনিট হিসাবে unary ইনপুট নিতে পারেন না ?
অ্যাডম

2
@ অ্যাডম বিবেচনা করে যে রেটিনা এখন সহজেই পূর্ণসংখ্যার ইনপুট পরিচালনা করতে পারে, আমি মনে করি এটি করা এক ধরণের সস্তা।
mbomb007

5

পাইথন 2 , 64 বাইট

f=lambda n,d=5,r='IVXLCD':r and f(n/d,7-d,r[1:])+n%d*r[0]or'M'*n

এটি অনলাইন চেষ্টা করুন!

লোভের সাথে বৃহত্তম অংশ নিয়ে শুরু থেকে আউটপুট স্ট্রিং তৈরি করার পরিবর্তে এটি এটিকে শেষ থেকে তৈরি করে। উদাহরণস্বরূপ, সংখ্যা I's হয় n%5, তারপর সংখ্যা V' s হয় n/5%2, ইত্যাদি। এটি 5 এবং 2 পর্যায়ক্রমে অনুপাতের সাথে মিশ্র বেস রূপান্তর।

এখানে একটি পুনরাবৃত্তি সমতুল্য:

পাইথন 2 , 68 বাইট

n=input();s='';d=5
for c in'IVXLCD':s=n%d*c+s;n/=d;d^=7
print'M'*n+s

এটি অনলাইন চেষ্টা করুন!

Mএর প্রয়োজন আলাদাভাবে পরিচালনা করা কারণ তাদের যে কোন সংখ্যার উপহার হিসেবে কোন বৃহত্তর অঙ্ক এর হতে পারে। সুতরাং, অন্য জায়গাগুলির মান নির্ধারিত হওয়ার পরে, বাকী মানগুলি M'র' তে রূপান্তরিত হয় ।

তুলনার জন্য, একটি লোভী কৌশল (69 বাইট):

পাইথন 2 , 69 বাইট

f=lambda n,d=1000,r='MDCLXVI':r and n/d*r[0]+f(n%d,d/(d%3*3-1),r[1:])

এটি অনলাইন চেষ্টা করুন!

বর্তমান অঙ্কের মানটি dপরবর্তী অঙ্কটি তৈরি করতে 2 বা 5 দ্বারা বিভক্ত হয়। d%3কোনটি আমাদের বলার মান : যদি d%3==1, দ্বারা বিভক্ত হয় 2; এবং যদি d%3==2, 5 দ্বারা বিভক্ত।


4

গণিত, 81 বাইট

Table@@@Thread@{r=Characters@"MDCLXVI",#~NumberDecompose~FromRomanNumeral@r}<>""&

স্পষ্টভাবে মানগুলি ব্যবহার করে এবং সম্পর্কিত সংখ্যাগুলি প্রাপ্ত করা আরও এক বাইট বলে মনে হয়:

Table@@@Thread@{RomanNumeral[n={1000,500,100,50,10,5,1}],#~NumberDecompose~n}<>""&

1
ভাল !:FromRomanNumeral@r
ডেভিডসি

4

এক্সেল, 236 193 161 বাইট

43 ব্রাইট @ ব্র্যাডসিকে ধন্যবাদ রক্ষা করেছে

এই মুহুর্তে, উত্তরটি সত্যিই সম্পূর্ণরূপে @ ব্র্যাডসির অন্তর্গত । অন্য 32 বাইট সংরক্ষণ করা হয়েছে।

=REPT("M",A1/1E3)&REPT("D",MOD(A1,1E3)/500)&REPT("C",MOD(A1,500)/100)&REPT("L",MOD(A1,100)/50)&REPT("X",MOD(A1,50)/10)&REPT("V",MOD(A1,10)/5)&REPT("I",MOD(A1,5))

বিন্যাসকৃত:

=REPT("M",A1/1E3)
    &REPT("D",MOD(A1,1E3)/500)
    &REPT("C",MOD(A1,500)/100)
    &REPT("L",MOD(A1,100)/50)
    &REPT("X",MOD(A1,50)/10)
    &REPT("V",MOD(A1,10)/5)
    &REPT("I",MOD(A1,5))

আপনি প্রতিস্থাপন করে কিছু সংরক্ষণ করব CONCATENATEসঙ্গে &প্রতিটি উপাদান মধ্যে, এবং QUOTIENTসঙ্গে INT(A/B)
ব্র্যাডিসি

আরও 2 টি সঞ্চয়: দেখা যাচ্ছে REPT ইতিমধ্যে সংখ্যাটি সংখ্যায় ছেঁটে ফেলেছে যদি এটি কোনও পূর্ণসংখ্যার হয় না , তাই আপনি প্রতিটি অপসারণ করে আরও 30 টি বাইট সংরক্ষণ করতে পারেন INT()। উভয় 1000দিয়ে প্রতিস্থাপন করে আরও 2 টি সংরক্ষণ করুন 1E3(যদিও এক্সেলটি একবার প্রবেশ করার পরে এটি সেভাবে রাখতে চাইবে না)।
ব্র্যাডিসি

হ্যাঁ, 1E3আচরণটি দেখেছি । উত্তর আপডেট হয়েছে।
ওয়ার্নিশ

3

পার্ল 5 , 66 বাইট

65 বাইট কোড + -pপতাকা।

$s=1e3;for$@(MDCLXVI=~/./g){$\.=$@x($_/$s);$_%=$s;$s/=--$|?2:5}}{

এটি অনলাইন চেষ্টা করুন!

বাইট গণনা পরিবর্তন না করে, MDCLXVI=~/./gপ্রতিস্থাপন করা যেতে পারে M,D,C,L,X,V,I; এবং --$|?2:5দ্বারা $|--*3+2

অনেক দীর্ঘ ( 99 বাইট ), রয়েছে:

$_=M x($_/1e3).D x($_%1e3/500).C x($_%500/100).L x($_%100/50).X x($_%50/10).V x($_%10/5).I x($_%5)

3

সিজেম , 35 28 বাইট

-7 বাইটস মার্টিন ইন্ডারকে ধন্যবাদ

q~{5md\2md\}3*]W%"MDCLXVI".*

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

q~         e# Read and eval input (push the input as an integer).
{          e# Open a block:
 5md\      e#  Divmod the top value by 5, and bring the quotient to the top.
 2md\      e#  Divmod that by 2, and bring the quotient to the top.
}3*        e# Run this block 3 times.
]W%        e# Wrap the stack in an array and reverse it. Now we've performed the mixed-base
           e# conversion.
"MDCLXVI"  e# Push this string.
.*         e# Element-wise repetition of each character by the numbers in the other array.
           e# Implicitly join and print.

3

সি #, 127 বাইট

f=n=>n>999?"M"+f(n-1000):n>499?"D"+f(n-500):n>99?"C"+f(n-100):n>49?"L"+f(n-50):n>9?"X"+f(n-10):n>4?"V"+f(n-5):n>0?"I"+f(n-1):""

পুনরাবৃত্তি ব্যবহার করে একটি বিশুদ্ধরূপে হার্ড কোডিং টের্নারি স্টেটমেন্ট।

সম্পূর্ণ / ফর্ম্যাট সংস্করণ:

using System;

class P
{
    static void Main()
    {
        Func<int, string> f = null;
        f = n => n > 999 ? "M" + f(n - 1000)
                         : n > 499 ? "D" + f(n - 500)
                                   : n > 99 ? "C" + f(n - 100)
                                            : n > 49 ? "L" + f(n - 50)
                                                     : n > 9 ? "X" + f(n - 10)
                                                             : n > 4 ? "V" + f(n - 5)
                                                                     : n > 0 ? "I" + f(n - 1)
                                                                             : "";

        Console.WriteLine(f(3));
        Console.WriteLine(f(4));
        Console.WriteLine(f(42));
        Console.WriteLine(f(796));
        Console.WriteLine(f(2017));
        Console.WriteLine(f(16807));

        Console.ReadLine();
    }
}


@ ক্যালকুলেটরফলাইন সি # তে নেই, একটিকে স্পষ্টতই intকাস্ট করা যাবে না bool
TheLethalCoder

এটা দুর্ভাগ্যজনক.
ক্যালকুলেটরফলাইন

@ ক্যালকুলেটরফলাইন হ্যাঁ, সি # কখনও কখনও কখনও নিজের ভাল করার জন্য খুব দৃ strongly়ভাবে টাইপ করা হয়।
TheLethalCoder

3

05 এ বি 1 ই , 29 26 25 বাইট

¸5n3×Rvćy‰ì}"MDCLXVI"Ss×J

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

¸                           # wrap input in a list
 5n                         # push 5**2
   3×                       # repeat it 3 times
     Rv                     # for each digit y in its reverse
       ć                    # extract the head of the list 
                            # (div result of the previous iteration, initially input)
        y‰                  # divmod with y
          ì                 # prepend to the list
           }                # end loop
            "MDCLXVI"S      # push a list of roman numerals
                      s×    # repeat each a number of times corresponding to the result
                            # of the modulus operations
                        J   # join to string

3

জাভাস্ক্রিপ্ট (ES6), 81 75 69 বাইট

জার্গ হালসারম্যানের উত্তর পোর্টিং করার জন্য @ নীলকে ধন্যবাদ 6 বাইট সংরক্ষণ করা হয়েছে

@ শেগি ধন্যবাদ 6 বাইট সংরক্ষণ করা

n=>'MDCLXVI'.replace(/./g,(c,i)=>c.repeat(n/a,n%=a,a/=i%2?5:‌​2),a=1e3)

পরীক্ষার কেস:


1
কয়েকটি বাইট সংরক্ষণ n%=xকরার জন্য আপনার repeatপদ্ধতির অভ্যন্তরে স্থানান্তরিত করতে সক্ষম হওয়া উচিত ।
শেগি

1
এফওয়াইআই পিএইচপি উত্তরের একটি বন্দর শুধুমাত্র 69 বাইট:n=>'MDCLXVI'.replace(/./g,(c,i)=>c.repeat(n/a,n%=a,a/=i%2?5:2),a=1e3)
নীল

ধন্যবাদ @ নীল, আমি পোস্টটি আপডেট করেছি। আমি পুনরায় দেখতে চাইছিলাম এমন হার্ড কোডিং অ্যারে সরিয়ে দেয়
ক্রেগ আয়রে

2

/// , 50 বাইট

/1/I//IIIII/V//VV/X//XXXXX/L//LL/C//CCCCC/D//DD/M/

এটি অনলাইন চেষ্টা করুন!

আনারিতে ইনপুট নেয় এবং আমি (আব) টিআইও-তে ফুটের ক্ষেত্রটি ইনপুটটির জন্য ব্যবহার করি যাতে আউটপুট একটি নতুন লাইনের আগে হয়।


2

পাইথন 3 , 100 97 96 94 93 91 90 বাইট

  • 4 + 2 বাইট সংরক্ষণ করা: ব্যবহার def; ডিফল্ট পরামিতি হিসাবে অ্যারে একটি ইনডেন্টেশন স্থান হ্রাস করেছে; অযাচিত পরিবর্তনশীল ঘোষণা সরানো হয়েছে
  • @ Shooqie 1 বাইট সংরক্ষণ করেছে a%= শর্টহ্যান্ড
  • 2 বাইট সংরক্ষণ করা হয়েছে: পুনরায় সাজানো এবং ধনুর্বন্ধনী (a//i) মুছে ফেলা হয়েছে
  • @ ওয়ানড্রিকেট 1 বাইট সংরক্ষণ করেছে: ডিফল্ট প্যারামিটার থেকে অ্যারেটিকে ফাংশনের ভিতরে নিয়ে যান যা []একটি ইনডেন্টেশন স্পেসের বিনিময়ে সরানো হয় , এইভাবে 1 বাইট সংরক্ষণ করে saving
def f(a):
 b=1000,500,100,50,10,5,1
 for i in b:print(end=a//i*'MDCLXVI'[b.index(i)]);a%=i

এটি অনলাইন চেষ্টা করুন!


1
a%=iএটি একটি বাইট সংক্ষিপ্ত :)
shooqie

1
আপনি bফাংশনের মধ্যে একটি ভেরিয়েবল হিসাবে সংরক্ষণ করে একটি বাইট সংরক্ষণ করতে পারেন । এটি বন্ধনীগুলির প্রয়োজনীয়তা সরিয়ে দেয় -b=1000,500,100,50,10,5,1
ওয়ানড্রিকেট

2

কিউবিক্স , 69 74 80 বাইট

/.UI,..N&..0\0&/52"IVXLCDM"U,r%ws;rr3tu;pw..u;qrUosv!s.u\psq,!@Us(0;U

এটি অনলাইন চেষ্টা করুন!

        / . U I
        , . . N
        & . . 0
        \ 0 & /
5 2 " I V X L C D M " U , r % w
s ; r r 3 t u ; p w . . u ; q r
U o s v ! s . u \ p s q , ! @ U
s ( 0 ; U . . . . . . . . . . .
        . . . .
        . . . .
        . . . .
        . . . .

এটি চলমান দেখুন

আমি এটিকে আরও কিছুটা সঙ্কোচ করতে পেরেছি, তবে এখনও কিছু উত্সাহী নো-অপস রয়েছে, বিশেষত শীর্ষ মুখের দিকে।

  • 52"IVXLCDM"Uপ্রয়োজনীয় বিভাজক এবং অক্ষর স্ট্যাকের উপর রাখুন। 5 এবং 2 ডিভ / মোড মান হ্রাস করতে ব্যবহৃত হবে এবং অক্ষরগুলি ব্যবহারের পরে ফেলে দেওয়া হবে।
  • UIN0/&0\&,/Uইউ-টার্নগুলি শীর্ষ মুখের দিকে যায় এবং ইনপুট পেতে এবং স্ট্যাকের উপরে 1000 টি ধাক্কা দিতে দীর্ঘ সফর শুরু করে। একটি প্রাথমিক বিভাজন সম্পন্ন করা হবে এবং rপরবর্তী স্নিপেটের একটি ইউ-টার্ন । এটি এমন একটি অঞ্চল যা আমি কিছু সঞ্চয় করার জন্য তাকিয়ে ছিলাম।
  • ,r%ws;rrডিভোড লুপের শুরু। পূর্ণসংখ্যার বিভাজন, ফলাফলটি মোডের কাছাকাছি ঘোরান, তারপরে হ্রাস ইনপুট, বর্তমান বিভাজক এবং বিভাজনের ফলাফলকে স্ট্যাকের শীর্ষে পুনরায় সাজান।
  • 3tus বর্তমান চরিত্রটিকে শীর্ষে আনুন এবং বিভাজন ফলাফলের সাথে এটি স্যুপ করুন।
  • !vsoUs(0;Uএটি প্রিন্ট লুপ। ডিভ ফলাফলটি 0-র বেশি হওয়ার সাথে সাথে, অক্ষর আউটপুট দিয়ে অদলবদল করুন, পিছনে অদলবদল, হ্রাস, একটি 0 টি চাপুন এবং এটি ফেলে দিন। 0 এ পপ স্ট্যাকের উপর পুনঃনির্দেশ করুন (বিভাজনের ফলাফল সরান) এবং ঘনক্ষেত্রের চারপাশে।
  • \u;pwpsq,!@Urq;uকিছুটা পুনঃনির্দেশের সাহায্যে এটি স্ট্যাকটি থেকে চরিত্রটি সরিয়ে দেয়, 5 এবং 2 টি শীর্ষে নিয়ে আসে, এগুলিকে অদলবদল করে এবং পিছনে একদিকে ধাক্কা দেয়। বাকীটি বিভাজন কমাতে ব্যবহৃত হয়। যদি এটি 0 এ কমে যায় তবে থামান, অন্যথায় 5 বা 2 টি নীচে টিপুন এবং লুপটিতে আবার প্রবেশ করুন।

1

গণিত, ১৩০ বাইট

(f=#~NumberDecompose~{1000,500,100,50,10,5,1};""<>{Flatten@Table[Table[{"M","D","C","L","X","V","I"}[[i]],f[[i]]],{i,Length@f}]})&

1

পাইথন 2 , 109 90 বাইট

lambda n,r=[1000,500,100,50,10,5,1]:''.join(n%a/b*c for a,b,c in zip([n+1]+r,r,'MDCLXVI'))

এটি অনলাইন চেষ্টা করুন!


1000হতে পারে 1e3(যদি আপনি এটি ভাসা ভাসা মনে না করেন যা কোনও সমস্যা হওয়া উচিত নয়)
ক্যালকুলেটরফালাইন

@ ক্যালকুলেটরফ্লাইন এটি ফলাফলকে একটিতে পরিণত করবে floatএবং আপনি একটি ফ্লোট দ্বারা একটি স্ট্রিংকে গুণতে পারবেন না: সি
রড


1

টি-এসকিউএল, 164 বাইট

SELECT REPLICATE('M',n/1000)+IIF(n%1000>499,'D','')
      +REPLICATE('C',n%500/100)+IIF(n%100>49,'L','')
      +REPLICATE('X',n%50/10)+IIF(n%10>4,'V','')
      +REPLICATE('I',n%5)
FROM t

লাইন ব্রেকগুলি কেবল পঠনযোগ্যতার জন্য যুক্ত হয়েছে।

এই সংস্করণটি অনেক বেশি দীর্ঘ (২৩০ টি অক্ষর), তবে "এসকিউএল-মতো" বেশি অনুভব করে:

DECLARE @ INT,@r varchar(99)=''SELECT @=n FROM t
SELECT'I's,1v INTO m
INSERT m VALUES('V',5),('X',10),('L',50),('C',100),('D',500),('M',1000)
L:
    SELECT @-=v,@r+=s 
    FROM m WHERE v=(SELECT MAX(v)FROM m WHERE v<=@)
IF @>0GOTO L
SELECT @r

সমস্ত চর-মান ম্যাপিংয়ের সাথে একটি টেবিল এম তৈরি করে এবং তারপরে সর্বাধিক মান <= সংখ্যাটি খুঁজে বের করে মিলে যাওয়া চরিত্রটিকে যুক্ত করে তোলে ।


1

জাপট , 34 বাইট

"IVXLCD"£%(U/=Y=v *3+2Y)îXÃw i'MpU

এটি অনলাইন পরীক্ষা!

"IVXLCD"£    %(U/=Y=v  *3+2Y )îXÃ w i'MpU
"IVXLCD"mXY{U%(U/=Y=Yv *3+2,Y)îX} w i'MpU : Ungolfed
                                          : Implicit: U = input number
"IVXLCD"mXY{                    }         : Map each char X and its index Y in this string to:
                  Y=Yv *3+2               :   Set Y to 5 for even indexes, 2 for odd.
               U/=                        :   Divide U by this amount.
            U%(            ,Y)            :   Modulate the old value of U by 5.
                              îX          :   Repeat the character that many times.
                                          : This returns e.g. "IIVCCCD" for 16807.
                                  w       : Reverse the entire string.
                                    i'MpU : Prepend U copies of 'M' (remember U is now the input / 1000).
                                          : Implicit: output result of last expression

1

জাভাস্ক্রিপ্ট (ES6), 65 বাইট

একটি পুনরাবৃত্তি ফাংশন।

f=(n,a=(i=0,1e3))=>n?a>n?f(n,a/=i++&1?5:2):'MDCLXVI'[i]+f(n-a):''

কিভাবে?

দ্বিতীয় পুনরাবৃত্তি কলটি f(n-a)সত্যই হওয়া উচিত f(n-a,a)। ২ য় প্যারামিটার বাদ দিয়ে aএবংi পুনঃনির্মাণ করা হয় (যথাক্রমে 1000 এবং 0 পর্যন্ত) প্রতিবার একটি নতুন রোমান অঙ্ক চূড়ান্ত ফলাফলের সাথে যুক্ত করা হয়। এটি প্রয়োজনের তুলনায় আরও পুনরাবৃত্তি ঘটায় তবে ফাংশনটির ফলাফলকে পরিবর্তন করে না এবং 2 বাইট সংরক্ষণ করে।

পরীক্ষার মামলা


1

জে , 26 23 বাইট

3 বাইট অ্যাডমকে ধন্যবাদ রক্ষা করেছে।

'MDCLXVI'#~(_,6$2 5)&#:

এটি অনলাইন চেষ্টা করুন!

মূলত একই জিনিসটির এপিএলের উত্তরের অনুরূপ

'MDCLXVI'#~(_,6$2 5)&#:
           (       )&#:   mixed base conversion from decimal
              6$2 5       2 5 2 5 2 5
            _,            infinity 2 5 2 5 2 5
                          this gives us e.g. `0 0 0 0 1 0 4` for input `14`
'MDCLXVI'#~               shape each according to the number of times on the right
                          this is greedy roman numeral base conversion

আমি জে জানে না তার #.invবদলে কেন #:?
অ্যাডম

@ আদম আহ, ভালো কথা। আমি রীতিমত ব্যবহার #.invপরিবর্তে #:, ভালো কিছু থেকে 2 #: 4হয় 0, যখন 2 #.inv 4হয়1 0 0
কোনোর ব্রায়েন

হ্যাঁ, আমিও এপিএলে একই কাজ করি। এখন আপনার সমাধানটি সত্যই এপিএল সমাধানের সমতুল্য।
অ্যাডম

#হয় /; ~হয় ; $হয় ; &হয় ; #:হয় । পার্থক্য হ'ল আপনি অনন্ত ব্যবহার করেন _যখন আপনি 0এপিএল উত্তরের মতো ব্যবহার করতে পারেন ।
অ্যাডম

@ আদম হুহ, দুর্দান্ত
কনর ও'ব্রায়েন

1

ব্যাচ, 164 বাইট

@set/pn=
@set s=
@for %%a in (1000.M 500.D 100.C 50.L 10.X 5.V 1.I)do @call:c %%~na %%~xa
@echo %s:.=%
@exit/b
:c
@if %n% geq %1 set s=%s%%2&set/an-=%1&goto c

STDIN এ ইনপুট নেয়।


1

ওরাকল এসকিউএল, 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রূপান্তর টেবিলের মধ্যে রয়েছে এবং আমি আসলে এটি সম্পর্কে খুব বেশি কিছু করতে পারি না ...


0

জাভা (ওপেনজেডিকে 8) , 119 118 বাইট

n->{String s="";for(int v[]={1,5,10,50,100,500,1000},i=7;i-->0;)for(;n>=v[i];n-=v[i])s+="IVXLCDM".charAt(i);return s;}

এটি অনলাইন চেষ্টা করুন!

@ দ্য লেথালকোডারকে একটি বাইট ধন্যবাদ সংরক্ষণ করা হয়েছে


1
আপনি কী ঘোষণা করতে পারেন vএবং iপ্রথমটিতে কোনও বাইট সংরক্ষণ করতে চান?
TheLethalCoder

@ দ্য লেথলকোডার হ্যাঁ, অবশ্যই আমি প্রথমে একেবারে অন্য একটি ধারণায় ছিলাম যে এটি আমার অভ্যন্তরীণ পর্যালোচনাটি পাস করেনি: পি
অলিভিয়ার গ্রাগোয়ার

0

কাঠকয়লা , 61 50 46 বাইট

NνA⁰χWφ«W¬‹νφ«§MDCLXVIχA⁻νφν»A⁺¹χχA÷φ⎇﹪χ²¦²¦⁵φ

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা:

Nν                   Take input as number and assign it to ν
A⁰χ                  Let χ=0
Wφ«                  While φ>0 (φ has a predefined value of 1000)
    W¬‹νφ«               While v>=φ 
        §MDCLXVIχ             Take the char from string "MDCLXVI" at position χ
        A⁻νφν»               Let ν=ν-φ
    A⁺¹χχ                Increment χ
    A÷φ⎇﹪χ²¦²¦⁵φ        If χ is odd, divide φ by 5, else divide φ by 2
  • 4 বাইট নীলকে ধন্যবাদ রক্ষা করেছে, যখন আমি এখনও তার মন্তব্যের দ্বিতীয় অংশটি নিয়ে কীভাবে এগিয়ে যেতে পারি তা বের করার চেষ্টা করছি।

1
Nνএর চেয়ে এক বাইট কম ANν, ¬‹এটি 1 বিয়োগের চেয়ে একটি বাইট কম, এবং যদি আপনি ÷(বিভাজক) পরিবর্তে (ইন্টারডিভাইড) ব্যবহার φকরেন তবে আপনি বাহ্যিক লুপের শর্ত হিসাবে ব্যবহার করতে পারেন । তবে আমি মনে করি আপনি MDCLXVIসরাসরি এর পরিবর্তে লুপ করে 40 বাইটে নামাতে পারবেন ।
নীল

@ নিল অবশ্যই আমাকে বোকা বানাবেন, কেন যখন আমি "কম নয়" ব্যবহার করতে পারি তখন কেন "বৃহত্তর বা সমান" অপারেটর নেই কেন তা বোঝার চেষ্টা করছি। পূর্ণসংখ্যা বিভাগের ব্যবহারটি খুব চালাক trick এখন আপনার মন্তব্যের শেষ অংশটি সম্পর্কে আমাকে কিছুটা সময় ভাবার অনুমতি দিন ...
চার্লি

আমি আমার স্ট্রিং লুপ আইডিয়াকে উন্নত করেছি এবং @ xnor এর পাইথন উত্তরের একটি বন্দর সহ পৃথক উত্তর হিসাবে পোস্ট করেছি, যা একই দৈর্ঘ্যে পরিণত হয়েছিল।
নীল

0

সি ++, 272 বাইট

#include <cstdio>
#include <map>
std::map<int,char> m = {{1000,'M'},{500,'D'},{100,'C'},{50,'L'},{10,'X'},{5,'V'},{1,'I'}};
int main(){unsigned long x;scanf("%d",&x);for(auto i=m.rbegin();i!=m.rend();++i)while(x>=i->first){printf("%c", i->second);x=x-i->first;}return 0;}

0

সি, 183 বাইট

#include <stdio.h>
int v[]={1000,500,100,50,10,5,1};
char*c="MDCLXVI";
int main(){int x;scanf("%d",&x);for(int i=0;i<sizeof v/sizeof(int);i++)for(;x>=v[i];x-=v[i])putc(c[i],stdout);}

আগের মতো একই অ্যালগরিদম, একটি স্ট্যান্ড :: ম্যাপের পরিবর্তে সাদামাটা অ্যারে ব্যবহার করে, আংশিকভাবে @ xnor এর উত্তরে অনুপ্রাণিত হয়ে এবং অক্ষরগুলি সংরক্ষণ করার জন্য একটি স্ট্রিং ব্যবহার করে।



0

কমন লিস্প, 113 বাইট

এটি একটি বেনাম ফাংশন, ফলাফলটিকে স্ট্রিং হিসাবে ফিরিয়ে দেয়।

(lambda(value)(setf(values a b)(floor v 1000))(concatenate 'string(format()"~v,,,v<~>"a #\M)(format nil"~@:r"b)))

বর্ণনামূলক ভেরিয়েবলের নাম এবং মন্তব্যে অসম্পূর্ণ:

(defun format-roman (value)
  ;; Get "value integer-divided by 1000" and "value mod 1000"
  (setf (values n_thousands remainder) (floor value 1000))
  (concatenate 'string
               ;; Pad the empty string n_thousands times, using "M" as the 
               ;; padding character
               (format () "~v,,,v<~>" n_thousands #\M)
               ;; Format the remainder using "old-style" Roman numerals, i.e. 
               ;; numerals with "IIII" instead of "IV"
               (format nil "~@:r" remainder)))

সিএলে অন্তর্নির্মিত রোমান অঙ্কের ফর্ম্যাটার রয়েছে। দুঃখজনকভাবে এটি 3999 এর চেয়ে বড় সংখ্যার জন্য কাজ করে না।


0

কাঠকয়লা , 34 বাইট

NςA²ξFMDCLXVI«×ι÷ςφA﹪ςφςA÷φξφA÷χξξ

মূলত @ কার্লোস আলেগো এর উত্তরের উপর ভিত্তি করে। @ Xnor এর পাইথন দ্রবণটির একটি বন্দরটিও 34 বাইট রয়েছে:

NθA⁵ξFIVXLCD«←×ι﹪θξA÷θξθA÷χξξ»←×Mθ

সম্পাদনা: @ xnor এর অন্যান্য পাইথন সমাধানের একটি বন্দর 33 বাইটে পরিণত হয়েছে!

NθFMDCLXVI«×ι÷θφA﹪θφθA÷φ⁺׳﹪φ³±¹φ

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। দ্রষ্টব্য যে আমি এর ⁺׳﹪φ³±¹পরিবর্তে ব্যবহার করেছি ⁻׳﹪φ³¦¹কারণ ডিভেরবোসিফায়ার বর্তমানে বিভাজক সন্নিবেশ করতে ব্যর্থ হচ্ছে।


1
হু, এটাই রোমানের চেয়ে গ্রীক দেখাচ্ছে।
অ্যাডম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.