রোমে কখন, রোমানদের মতো গণনা?


20

পটভূমি

এই চ্যালেঞ্জটি এই ওয়েবসাইটটি দ্বারা অনুপ্রাণিত হয়েছে , যা নিম্নলিখিত চিত্রটি প্রকাশ করেছে:

এখানে চিত্র বর্ণনা লিখুন

এই চিত্রটি আমাদের দেখায় যে 250 বছরের নিচে দীর্ঘতম রোমান সংখ্যার প্রকাশটি 188 এর মত, যা প্রকাশের জন্য 9 টি সংখ্যা প্রয়োজন।

চ্যালেঞ্জ

মান সবচেয়ে রোমান সংখ্যা প্রকাশ করার জন্য ব্যবহৃত প্রতীক নিম্নলিখিত হয়: { I, V, X, L, C, D, M}, যেখানে অক্ষর 'সাংখ্যিক মান M= 1000, D= 500, C= 100, L= 50, X= 10, V= 5, I= 1।

এই প্রতিদ্বন্দ্বিতা ক্ষেত্রে, আপনার লক্ষ্য, হয় একটি ধনাত্মক পূর্ণসংখ্যা দেওয়া এন বৈধ রোমান সংখ্যা উপস্থাপনা যে concatenating মাধ্যমে গঠিত হতে পারে সংখ্যা গনা, এন মান চিহ্ন।

তারপরে, আপনার প্রোগ্রাম অবশ্যই এই গণনার ফলাফল আউটপুট!

ইনপুট : একটি ধনাত্মক পূর্ণসংখ্যা n

আউটপুট : দৈর্ঘ্য বৈধ রোমান সংখ্যা এক্সপ্রেশন সংখ্যা এন

রোমান অঙ্কের এক্সপ্রেশনগুলির জন্য বিধি

রোমান অঙ্কগুলিতে মূলত কেবল "সংযোজক" জুটি ছিল, যার অর্থ হল অঙ্কগুলি সর্বদা অবতরণ ক্রমে লেখা হত, এবং সমস্ত সংখ্যার মানগুলির যোগফল ছিল সংখ্যার মান।

পরবর্তীতে, বিয়োগমূলক জোড়, ছোট থেকে বৃহত্তর থেকে বিয়োগ করার জন্য একটি ছোট সংখ্যার সামনে রাখার ব্যবহার রোমান সংখ্যার এক্সপ্রেশনগুলি সংক্ষিপ্ত করে তোলার পক্ষে সাধারণ হয়ে ওঠে। হ্রাসমূলক জোড়া শৃঙ্খলিত করা যাবে না, নিম্নলিখিত অবৈধ এক্সপ্রেশনে মত: IXL

অ্যাডিটিভ এবং সাবটেক্টিভ পেয়ারিংয়ের জন্য নিম্নলিখিত আধুনিক নিয়মগুলি রয়েছে।

  1. বিয়োগফলের জুটির অংশে কেবলমাত্র একটি, আই, এক্স এবং সি ব্যবহার করে নেওয়া যেতে পারে n
  2. আমাকে কেবল একটি বিয়োগফল জুটিতে ভি বা এক্স এর আগে রাখা যেতে পারে।
  3. এক্সকে কেবল বিয়োগফলের জুটিতে এল বা সি এর আগে রাখা যেতে পারে।
  4. বি কেবল একটি বিয়োগক্ষত জুটিতে কেবল ডি বা এম এর আগে স্থাপন করা যেতে পারে।
  5. বিয়োগফল জোড়া ছাড়া অন্য সংখ্যাগুলি অবশ্যই অবতরণ ক্রমে থাকতে হবে (এর অর্থ যদি আপনি প্রতিটি বিয়োগকারক জোড়ার শীর্ষস্থানীয় অঙ্কটি বাদ দেন তবে অঙ্কগুলি অবতরণ ক্রমে হবে)।
  6. এম, সি এবং এক্স ছোট সংখ্যার দ্বারা সমান বা অতিক্রম করা যাবে না।
  7. ডি, এল এবং ভি প্রতিটি কেবল একবারে উপস্থিত হতে পারে।
  8. কেবল এম 4 বা তার বেশি বার পুনরাবৃত্তি করা যেতে পারে।

আরও নোট

  • আমরা বার স্বরলিপি ব্যবহার করব না ; বরং আমরা যে কোনও সংখ্যা প্রকাশের জন্য আরও এম এস যুক্ত করব ।

  • এগুলি কেবলমাত্র আমাদের রোমান সংখ্যার জন্য অনুসরণ করব rules এর অর্থ হ'ল বিজোড় ভাবগুলি যেমন IVIআমাদের সিস্টেমে বৈধ হিসাবে বিবেচিত হবে।

  • এছাড়াও মনে রাখবেন যে আমরা সংখ্যার সংখ্যা গণনা করছি না যার দৈর্ঘ্য n এর এক্সপ্রেশন রয়েছে কারণ কিছু সংখ্যার একাধিক এক্সপ্রেশন রয়েছে। পরিবর্তে, আমরা একমাত্র বৈধ এক্সপ্রেশন সংখ্যা গণনা করা হয়।

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

17

231

3105

আমি উপরেরটি হাত দ্বারা চেক করেছি, সুতরাং দয়া করে পরীক্ষার কেসগুলি দ্বিগুণ করে নিশ্চিত করুন, এবং আপনি যদি পারেন তবে আরও যোগ করুন!

বিজয়ী মানদণ্ড

এটি একটি চ্যালেঞ্জ, তাই মজা করুন! আমি কেবল এমন সমাধান গ্রহণ করব যা 1 থেকে 9 এর মধ্যে কমপক্ষে ইনপুটগুলি পরিচালনা করতে পারে!

সম্পাদন করা

কমেন্টারদের অনুরোধ অনুসারে, নীচে খুঁজুন বা এই পেস্টবিন লিঙ্কে, 105 টি কম্বোস আমি n = 3 এর জন্য গণনা করেছি

III IVI IXI IXV IXX VII XII XIX XVI XXXXXX XX XL XLV XLX XCI XCV XCX XCL XC LII LIX LVI LXI LXV LXX CIC CDC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC CCC সিএমআই সিএমভি সিএমএক্স সিএমএল সিএমসি সিএমডি সিএমএম ডিআইআই ডিআইআইএক্স ডিভিআই ডিএক্সআই ডিএক্সভি ডিএক্সএক্স ডিএক্সএল ডিএলসি ডিএলভি ডিএলএক্স ডিসিভি ডিসিভি ডিসিএক্সএল ডিসি ডিসি এমআইআই এমআইএক্স এমভিআই এমএক্সভি এমএক্সএক্স এমসিএল এমসিএম এমসিএম এমসিএম এমসিএম এমসিএম এমসিএম এমসিএম এমসিএম এমসিএম এমসিএম এমসিএম এমএমএক্স এমএমএল এমএমসি এমএমডি এমএমএম

সম্পাদনা 2:

আপনার ফলাফলগুলি পরীক্ষা করতে জোনাথন অ্যালানকে সৌজন্যে নিম্নলিখিত অ-গল্ফযুক্ত কোডটি ব্যবহার করুন ।

সম্পাদনা 3:

এই চ্যালেঞ্জের সমস্ত ত্রুটির জন্য আমি ক্ষমা চেয়ে নিচ্ছি। আমি পরের বার আরও ভাল কাজ করা নিশ্চিত করব!


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
মেগো

উত্তর:


3

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

~(`.+
*$(CM)CDXCXCXCXLIXIXIXIVII
.(.)
.+¶$$&$¶$$&$1$¶$$&$&¶L`.{0,$+}\b¶D`¶
¶$
¶.+¶$$&$¶$$&I¶L`[A-Z]{$+}\b¶D`¶.+

এটি অনলাইন চেষ্টা করুন! আমি একটি নিয়ম ১ টি ভুল বুঝেছি বলে এটি একটি সম্পূর্ণ পুনর্লিখন is এর অর্থ হ'ল আপনি কেবল প্রতিটি বিয়োগফল ব্যবহার করতে পারেন I, Xএবং C। ব্যাখ্যা: স্ক্রিপ্টের প্রথম অংশটি ইনপুটটিকে CMজোড়াগুলির একটি স্ট্রিংয়ে প্রসারিত করে তারপরে অন্যান্য সম্ভাব্য বিয়োগফল জোড়গুলি। প্রতিটি জুটি isচ্ছিক এবং জোড়ের মধ্যে প্রতিটি জুটির প্রথম চরিত্রটিও alচ্ছিক। তৃতীয় পর্যায়ে এরপরে জোড়াদের তালিকা রেটিনা কমান্ডের তালিকায় প্রসারিত করে যা ইনপুট নেয় এবং জোড় থেকে দ্বিতীয় বা উভয় অক্ষরের বিকল্পের সাহায্যে তিনটি অনুলিপি তৈরি করে, ফলাফলগুলি ছাঁটাই করে এবং প্রতিলিপি করে। চূড়ান্ত পর্যায়ে তারপরে চূড়ান্ত কার্য সম্পাদনের জন্য কোড সংযোজন করা হয়: প্রথমে ইনপুটটি সম্ভবত একটি চূড়ান্ত যোগ করতে প্রসারিত করা হয়I, তারপরে ভুল দৈর্ঘ্যের ফলাফলগুলি ফিল্টার করতে, তারপরে ফলাফলগুলি প্রতিলিপি করা এবং শেষ পর্যন্ত ফলাফলগুলি গণনা করা। ফলস্বরূপ রেটিনা স্ক্রিপ্টটি পরে মূল্যায়ন করা হয়।

দ্রষ্টব্য: তত্ত্ব অনুসারে চতুর্থ লাইনের শেষে 15 বাইট সংরক্ষণ করা যেতে পারে তবে এটি স্ক্রিপ্টটি এমনকি টিআইওতে প্রদর্শন করতে খুব ধীর করে তোলে n=1


@ জোনাথান অ্যালান আহ, তারপরে আপনি একই শীর্ষস্থানীয় সংখ্যা সহ একাধিক বিয়োগমূলক জুটি যুক্ত করছেন, যা ভুল।
নীল

2
@ জোনাথান অ্যালান নতুন পুনর্লিখন, কাকতালীয়ভাবে একই একই বাইট গণনার জন্য!
নীল

5

পাইথন 2 , 177 168 162 বাইট

import re,itertools as q
f=lambda n:sum(None!=re.match("^M*(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$",(''.join(m)))for m in q.product('MDCLXVI',repeat=n))

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

আমি বেশ নতুন, আমাকে এই গল্ফ সাহায্য! প্রকৃত রোমান সংখ্যার জন্য এটি পরীক্ষা করে, বিজোড়কে বিজোড় ক্ষেত্রে যেমন সামঞ্জস্য করা দরকারIVI

-9 বাইটস @ ডেড পসুমকে ধন্যবাদ!

-Ov বাইটস @ ওওএসকে ধন্যবাদ


হ্যাঁ আমি মনে করি উদাহরণটিতে এন = 3 কেসটি ভুল হতে পারে। আমি মূলত সঙ্গে 93 পেয়ে ছিল^M*(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$
ইস্টন Bornemeier


1
@ জোনাথন অ্যালান আমি এই নিয়মগুলি বোধগম্য হয়েছে তা নিশ্চিত করার চেষ্টা করে প্রায় দুই দিন ম্যাথ স্ট্যাকেক্সচেঞ্জের বিষয়ে জিজ্ঞাসা করে কাটিয়েছি। অনুমান করুন আমি যথেষ্ট করিনি :(
ডন হাজার হাজার

1
@ রশভমহেতা এটি একটি খুব ভাল ফর্ম্যাটেড চ্যালেঞ্জ এবং প্রোগ্রামের জন্য মজাদার, রোমান সংখ্যার সংজ্ঞা সংকোচনের একরকম দুর্ভাগ্যজনক উপকারের জন্য খারাপ লাগবেন না। এটি আপনার চ্যালেঞ্জ, আপনি উপযুক্ত হিসাবে এটি নির্দিষ্ট করুন। এটি অন্য অর্থে
কার্যক্ষম

1
এটি 3 এর 93পরিবর্তে সঠিক উত্তর দেবে বলে মনে হচ্ছে না105
জো কিং

3

জাভাস্ক্রিপ্ট (ES7), 133 বাইট

সম্পাদনা করুন : জোনাথন অ্যালান কোড দ্বারা প্রত্যাবর্তিত ফলাফলগুলির সাথে মেলে ফিক্সড , যা ওপি দ্বারা একটি রেফারেন্স বাস্তবায়ন হিসাবে দেওয়া হয়েছিল।


n=>[...Array(m=k=7**n)].reduce(s=>s+/^1*5?4{0,3}3?2{0,3}6?0{0,3}$/.test((--k+m).toString(7).replace(/0[62]|2[34]|4[51]/g,s=>s[1])),0)

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

কিভাবে?

এন1

[...Array(m = k = 7 ** n)].reduce(s => … (--k + m).toString(7) …, 0)

এখন থেকে প্রতিটি অঙ্ক রোমান অঙ্কের প্রতীক হিসাবে ব্যাখ্যা করা হবে:

0আমি,1এম,2এক্স,3এল,4সি,5ডি,6ভী

2) আমরা ফর্মের সকল বৈধ হ্রাসমূলক জোড়া প্রতিস্থাপন ABসঙ্গে B:

.replace(/0[62]|2[34]|4[51]/g, s => s[1]))  // in the code
.replace(/I[VX]|X[LC]|C[DM]/g, s => s[1]))  // with Roman symbols

উদাহরণ:

  • XLIXIV হয়ে LXV
  • XIIVহয়ে যায় XIV, Iএমন একটি রেখে যা পরের পরীক্ষাটিকে ব্যর্থ করে দেয়
  • ICঅপরিবর্তিত রয়ে, যা একটি অবৈধ ছেড়ে Iজায়গায়

3) আমরা পরীক্ষা করে দেখি যে বাকী প্রতীকগুলি সঠিক ক্রমে রয়েছে এবং তাদের অনুমতি দেওয়ার চেয়ে বেশি বার উপস্থিত হয় না:

/^1*5?4{0,3}3?2{0,3}6?0{0,3}$/.test(…)  // in the code
/^M*D?C{0,3}L?X{0,3}V?I{0,3}$/.test(…)  // with Roman symbols

পবিত্র গরু, আমি আশা করি না যে এটি 200 বাইটেরও কম অজানা ভাষায় করা হবে! মাইন্ড বুঝিয়ে দিচ্ছে কিভাবে এটি কাজ করে?
ডন হাজার হাজার

তবে, আমি লক্ষ করেছি যে এটি টিআইও-তে * n ​​*> 4 এর জন্য কাজ করে না, যা কিছুটা দুর্ভাগ্যজনক।
ডন হাজার হাজার

@ রুশভ মেহতা আমি উচ্চতর মানগুলি পরীক্ষা করতে একটি পুনরাবৃত্ত সংস্করণ যুক্ত করেছি। আমি যখন এই গল্ফিং সম্পন্ন করব তখন আমি একটি ব্যাখ্যা যুক্ত করব।
আর্নৌল্ড

0

সি, 150 123 বাইট

আমি বিবরণটি খুব কাছাকাছিভাবে পড়িনি, সুতরাং এটি স্ট্যান্ডার্ড রোমান সংখ্যার উত্পাদন করে (যেখানে মত প্রকাশগুলি পছন্দ করা IVIহয় না)। যেহেতু আমি এতে কিছুটা চেষ্টা করেছি, তাই আমি ভেবেছি যেভাবেই ভাগ করে নেব।

#define F(X) for(X=10;X--;)
x[]={0,1,2,3,2,1,2,3,4,2};f(i,o,a,b,c){for(i++;i--;)F(a)F(b)F(c)o+=i==x[a]+x[b]+x[c];return o;}

আসল (150 বাইট):

#define F(X) for(X=10;X--;)
i,o,a,b,c,x[]={0,1,2,3,2,1,2,3,4,2};main(){scanf("%i",&i);for(i++;i--;)F(a)F(b)F(c)o+=i==x[a]+x[b]+x[c];printf("%i\n",o);}

1
আপনাকে কেবল বৈধ জমা দেওয়ার পোস্ট করার অনুমতি দেওয়া হয়েছে।
Okx

@ কার্টিসবেটেল আপনি সমাধানটি এখানে রাখতে পারেন বলে আমি মনে করি, তবে আমি চ্যালেঞ্জের নিয়মগুলি পূরণ করার জন্য এটি পরিবর্তন করার চেষ্টা করব would
ডন হাজার হাজার

1
আমি মনে করি আপনি F(X)এবং এর মধ্যে স্থানটি সরিয়ে ফেলতে পারবেনfor(X=10;X--;)
Zacharý
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.