রোমান অঙ্কের রেখাংশগুলি


10

একটি প্রোগ্রাম বা ফাংশন লিখুন যা ইনপুট হিসাবে ১.৩৯৯৯ পরিসরে কোনও পূর্ণসংখ্যাকে গ্রহণ করে এবং স্ট্যান্ডার্ড রোমান অঙ্কগুলিতে সেই পূর্ণসংখ্যাটি প্রকাশ করার জন্য প্রয়োজনীয় লাইন বিভাগগুলির সংখ্যা প্রদান করে (যাতে আপনি এক্সএল ব্যবহার করবেন তবে ভিএম নয়)। উদাহরণ:

   1 -> 1
   4 -> 3
   5 -> 2
   9 -> 3
  10 -> 2
  40 -> 4
  50 -> 2
  90 -> 3
 100 -> 1
 400 -> 3
 500 -> 2
 900 -> 5
1000 -> 4

রোমান নম্বর রূপান্তর builtins হয় অনুমতি, কিন্তু আপনি বারবার উপরে তালিকা থেকে বৃহত্তম অবশিষ্ট সংখ্যা যতবার তাদের ছাড়া সমস্যা সমাধান করতে পারে। উদাহরণ: 1234 = 4 + 1 + 1 + 2 + 2 + 2 + 3 = 15।

এটি , তাই সংক্ষিপ্ততম প্রোগ্রামটি জয়ী।


কেন চারটি পরিবর্তে 10 দুটি লাইন বিভাগ? এক্স লেখার সময়, আপনি সাধারণত দুটি লাইন লিখতেন, তবে রেখার ছেদগুলি কী চারটি খণ্ড তৈরি করে না?
অ্যালেক্স এ।

@AlexA। লাইন বিভাগের সংজ্ঞা সাধারণত এমন কিছু হয়: "দুটি পয়েন্টের মধ্যে সংক্ষিপ্ততম পথ অনুসরণ করে পয়েন্টগুলির সেট"। এর উপর ভিত্তি করে এক্স কেটে যাওয়ার কোনও কারণ বলে মনে হচ্ছে না, এটির সংজ্ঞা দেওয়ার জন্য আপনার কেবল দুটি সমাপ্তি পয়েন্টের প্রয়োজন। (ধরে নিই রোমানরা মূলত
ইউক্যালিডীয়

নিবন্ধন করুন জানা ভাল, ধন্যবাদ।
অ্যালেক্স এ।

উত্তর:


2

পাইথ, 92 76 70 বাইট

KsMc."/9hæ²z³Þ§ªW×Oû[Tnè,O¤"\/WQ=Q-Q=Nef!>TQ%2K aY@KhxKN;sY

এখানে চেষ্টা করুন!

কিছু স্ট্রিং প্যাকিং পরামর্শের জন্য @ ফ্রাইআমএইটিজিমনকে ধন্যবাদ যা আমার কিছু বাইট সংরক্ষণ করেছে!

আমি এখনও ভাবছি যে এই তালিকাটি এনকোড করার জন্য গাণিতিক উপায় আছে কিনা। কিছু বের করার চেষ্টা করবে।

ব্যাখ্যা

এটি প্রদত্ত অ্যালগরিদম ব্যবহার করে। Kপ্রদত্ত তালিকার সাথে সংখ্যায় এবং সংলগ্ন লাইনের অংশগুলির সংক্ষিপ্তসার সংখ্যার সমন্বিত তালিকা রয়েছে। এই তালিকাটি বিভাজন দ্বারা নির্মিত পরার একটি বস্তাবন্দী স্ট্রিং, যা সঙ্কেতমুক্ত পরার 0/0/1/1/4/3/5/2/9/3/10/2/40/4/50/2/90/3/100/1/400/3/500/2/900/5/1000/4, উপর /এবং একটি পূর্ণসংখ্যা প্রতিটি উপাদান ম্যাপিং।

কেএসএমসি। "..." "/ ডাব্লিউকিউ = কিউকিউ = নেফ!> টিকিউ% 2K এওয়াই @ খেক্সকেএন; এসওয়াই # কিউ = ইনপুট

   সি। "..." \ / # স্ট্রিংটি / এ বিভক্ত করুন
কেএসএম # ম্যাপ প্রতিটি সংখ্যার পূর্বে এবং কে কে নির্ধারিত করুন
            ডাব্লিউকিউ # যখন কিউ! = 0
                     f% 2K # কেবলমাত্র প্রতিটি দ্বিতীয় উপাদান কে নিয়ে টি দিয়ে ফিল্টার করে
                      !> টিকিউ # টি <= কিউ
                  = নে # এটির শেষ উপাদানটি নিন এবং এটি এনকে নির্ধারণ করুন
              = কিউকিউ # কিউ = কিউ - এন
                                   x কেএন # সূচকে কে তে এন এর প্রথম উপস্থিতি
                                  এইচ # ইনক্রিমেন্ট সেই সূচক কারণ আমরা লাইন বিভাগগুলি চাই
                              এএ @ কে # সূচকটি থেকে রেখাংশটি পান এবং এটি ওয়াইতে যুক্ত করুন
                                      ; sY # লুপটি শেষ করুন এবং Y এর মধ্যে সমস্ত রেখাংশের যোগফল মুদ্রণ করুন

3

সি, 148 129 অক্ষর

d,x,n[]={1000,900,500,400,100,90,50,40,10,9,5,4,1,4,5,2,3,1,3,2,4,2,3,2,3,1};f(c){while(d+=(c/n[x])*n[x+13],c%=n[x++]);return d;}

আমার প্রথম কোড-গল্ফ: ^)। যেহেতু প্রশ্নটিতে বলা হয়েছে যে আমি কোনও ফাংশন ব্যবহার করতে পারি, তাই কিছু অক্ষর ছাঁটাতে আমি প্রধানত একটি ফাংশনে পরিবর্তিত হয়েছি (সর্বাধিক গুরুত্বপূর্ণ: সিটিকে প্যারামিটার হিসাবে বরং স্ক্যানফ পাস করুন)

প্যাক না

d,x,n[]={1000,900,500,400,100,90,50,40,10,9,5,4,1,4,5,2,3,1,3,2,4,2,3,2,3,1};
f(c){
  while(d+=(c/n[x])*n[x+13],
        c%=n[x++]);
  return d;
}

2

গণিত, 80 72 বাইট

Tr[Characters[#~IntegerString~"Roman"]/.{"I"|"C"->1,"M"->4,_String->2}]&

বেনামে ফাংশন যা কেবলমাত্র সংখ্যাকে রোমান সংখ্যায় রূপান্তরিত করে, প্রতিটি অক্ষরকে তার বিভাগগুলির সংখ্যার সাথে প্রতিস্থাপন করে এবং মোটটি গ্রহণ করে।


2

রেটিনা, 128 বাইট

। + +
$ *
1 {1000}
T '
1 {900}
TD
1 {500}
ঘ
1 {400}
টি
1 {100}
'
1 {90}
টি
1 {50}
ঘ
1 {40}
T '
1 {10}
ঘ
1 {9}
টি
1 {5}
ঘ
1 {4}
টি
1
'
টি
ঘ '
ঘ
''
+
$ ২.0

সহজ প্রতিস্থাপন যতক্ষণ না প্রতিস্থাপনের কিছু নেই। তারপরে অ্যাস্ট্রোফেসগুলি গণনা করা হয় এবং এটি আমাদের লাইন বিভাগগুলির সংখ্যা।

যদি আনারিতে ইনপুট এবং আউটপুট অনুমোদিত হয়, তবে এটি 115 বাইট (যদিও কে 1234 টাইপ করতে চান?)।

এটি অনলাইন চেষ্টা করুন!
এটি অনলাইন চেষ্টা করুন! (অবিচ্ছিন্ন আইও)


2

পাইথন 3, 95 বাইট

def f(a,b=0):
 for e in'᝴ᔝ஺ॣəȟĮô>9 ':e=ord(e);d=e//6;b+=a//d*(e%6);a%=d
 return b

ইউনিকোড স্ট্রিংটিতে কোড পয়েন্ট রয়েছে:

6004 5405 3002 2403 601 543 302 244 62 57 32 27 7

যদি আপনি সেই স্ট্রিংটিকে একটি বাইট আক্ষরিক রূপান্তরিত করেন তবে আপনি বাদ দিতে পারেনe=ord(e);
xsot

আমি মনে করি না যে এটি আমার ক্ষেত্রে কাজ করে। আমি একটি ইউনিকোড স্ট্রিং প্রয়োজন :( অর্থাত আমি যে স্ট্রিং codepoints উপর লুপিং করছি, বাইট শেষ হয়নি।
লিন

1
আচ্ছা বুঝলাম. স্ট্রিংয়ের একটি হেক্স ডাম্প সরবরাহ করতে আপনার কি আপত্তি আছে? এটি আমার ফোনে সঠিকভাবে প্রদর্শিত হয় না।
xsot

1

জাভা, 152 বাইট

কারণ, আপনি জানেন, জাভা।

n->{int c=0;int[]r={999,4,899,5,499,2,399,3,99,1,89,3,49,2,39,4,9,2,8,3,4,2,3,3,0,1};for(int i=0;i<26;i+=2)while(n>r[i]){n-=r[i]+1;c+=r[i+1];}return c;}

প্রদত্ত অ্যালগরিদমের সহজ আক্ষরিক বাস্তবায়ন। অ্যারে রূপান্তর তথ্য প্যাক করে: এমনকি সূচকগুলি রোমান সংখ্যার চেয়ে কম এবং অদ্ভুত সূচকগুলি সেই সংখ্যার জন্য গণনা।

এই ল্যামডা যে সময় লাগে এবং একটি ফেরৎ int/ Integer। এর মধ্যে রয়েছে IntUnaryOperatorবা UnaryOperator<Integer>


1

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

n=>"0123323453"[[,a,b,c,d]=1e4+n+'',d]-(-"0246424683"[c]-"0123323455"[b])+a*4

স্ট্রিংগুলি ইউনিট, দশক এবং শত সংখ্যার জন্য লাইন বিভাগগুলির সংখ্যা উপস্থাপন করে। (হাজার হাজার সংখ্যার চেয়ে চারগুণ বেশি।) এই পদ্ধতিটি অন্যান্য বিকল্পের তুলনায় সংক্ষিপ্ত বলে মনে হয় যেমন প্রশ্নে প্রস্তাবিত অ্যালগরিদম।

সম্পাদনা করুন: @ ব্যবহারকারী81655 ধন্যবাদ 2 বাইট সংরক্ষণ করা।


এটি একটি দুর্দান্ত অ্যালগরিদম। কাস্টগুলি পুনরায় সাজানো 2 n=>"0123323453"[[,a,b,c,d]=1e4+n+'',d]-(-"0246424683"[c]-"0123323455"[b])+a*4
বাইটও

@ user81655 ওহ, চমৎকার যে: কেবল পরিবর্তন +s করা -গুলি আমাকে নেতৃস্থানীয় অপসারণ করতে পারবেন +, কিন্তু তারপর গোষ্ঠী অন্য বাইট পরিমাণ সঞ্চয় হয়।
নীল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.