পূর্ণসংখ্যা সময়ের সাথে সাথে পিছনে যায়


17

ইনপুট:

একটি পূর্ণসংখ্যা

আউটপুট:

  1. প্রথমে পূর্ণসংখ্যাকে এর সমতুল্য রোমান সংখ্যায় রূপান্তর করুন।
  2. তারপরে সেই রোমান অঙ্কের প্রতিটি মূল অক্ষরকে তাদের ASCII / UNICODE দশমিক মানের রূপান্তর করুন।
  3. এবং এর যোগফল আউটপুট।

উদাহরণ:

1991 -> MCMXCI -> 77+67+77+88+67+73 -> 449
^ input                                ^ output

রোমান সংখ্যা: এখানে সম্ভবত একটি দরকারী রোমান অঙ্কের রূপান্তরকারী।
এখানে চিত্র বর্ণনা লিখুন

চ্যালেঞ্জ বিধি:

  • স্ট্যান্ডার্ড রোমান অংক সংক্রান্ত নিয়মগুলি প্রয়োগ করা হয়, সুতরাং এবং এর পরিবর্তে IIIIবা এর VIIIIপরিবর্তে কোনও বিকল্প ফর্ম নেই *IVIX
  • রোমান সংখ্যার উপরে 1000 টির উপরে ম্যাক্রোন লাইনগুলি ¯(ইউনিকোড এনআর। 175)। সুতরাং একটি লাইন হিসাবে হিসাবে গণনা করা হয় +175এবং দুটি হিসাবে +350
  • আপনাকে কোনও ধরণের ইনপুট এবং আউটপুট প্রকার ব্যবহার করার অনুমতি দেওয়া হচ্ছে যতক্ষণ না এটি পূর্ণসংখ্যার প্রতিনিধিত্ব করে allowed
  • পরীক্ষার কেসগুলি সীমার মধ্যে থাকবে 1 - 2,147,483,647

* রোমান সংখ্যা সংক্রান্ত নিয়ম (উইকিপিডিয়া থেকে উদ্ধৃতি):

চিহ্নগুলি সংমিশ্রণ করে এবং মানগুলি যুক্ত করে গঠিত হয়, সুতরাং IIদুটি (দুইটি) এবং XIIIতেরটি হয় (দশ এবং তিনটি)। কারণ প্রতিটি সংখ্যাটির দশ, একশত ও বহুগুণকে প্রতিনিধিত্ব করার পরিবর্তে একটি নির্দিষ্ট মান থাকে, অবস্থান অনুসারে, 207 বা 1066 এর মতো সংখ্যায় যেমন "প্লেস কিপিং" জিরো প্রয়োজন হয় না; এই সংখ্যাগুলি CCVII(দুই শত, একটি পাঁচ এবং দু'জন) এবং MLXVI(এক হাজার, পঞ্চাশ, দশ, একটি পাঁচ এবং একটি) হিসাবে লেখা হয়।

সিম্বলগুলি বৃহত্তম থেকে শুরু করে মান অনুসারে বাম থেকে ডানে স্থাপন করা হয়। তবে কয়েকটি নির্দিষ্ট ক্ষেত্রে, পর পর চারটি চরিত্রের পুনরাবৃত্তি এড়াতে (যেমন IIIIবা XXXX), বিয়োগফল স্বরলিপিটি প্রায়শই নিম্নলিখিত হিসাবে ব্যবহৃত হয়:

  • Iএর আগে স্থাপন Vবা Xএকটি কম নির্দেশ করে, সুতরাং চারটি IV(পাঁচজনের চেয়ে কম) এবং নয়টি IX(দশজনের চেয়ে কম)
  • Xদশটি আগে স্থাপন Lবা Cনির্দেশিত হয়, সুতরাং চল্লিশটি XL(পঞ্চাশের চেয়ে দশটি কম) এবং নব্বইটি XC(একশটির চেয়ে দশটি কম)
  • Cআগে স্থাপন করা হয়েছে Dবা Mএকশত কম ইঙ্গিত করা হয়েছে, সুতরাং চারশত CD(একশত পাঁচ শতাধিকের চেয়ে কম) এবং নয়শত CM(এক হাজারের চেয়ে একশত কম)
    উদাহরণস্বরূপ, MCMIVএক হাজার নয়শত ও চার, ১৯০৪ ( Mএক হাজার, CMহ'ল) নয়শ এবং IVচার)।

রোমান সংখ্যার আধুনিক ব্যবহারের কয়েকটি উদাহরণ অন্তর্ভুক্ত:
1954 হিসাবে MCMLIV; 1990 হিসাবে MCMXC; 2014 হিসাবে উত্স হিসাবেMMXIV

সাধারণ নিয়ম:

  • এটি , তাই বাইট জেতে সংক্ষিপ্ত উত্তর।
    কোড-গল্ফ ভাষাগুলি আপনাকে নন-কোডগলফিং ভাষার সাথে উত্তর পোস্ট করতে নিরুৎসাহিত করবেন না। 'যে কোনও' প্রোগ্রামিং ভাষার জন্য যতটা সম্ভব সংক্ষিপ্ত উত্তর নিয়ে আসার চেষ্টা করুন।
  • স্ট্যান্ডার্ড নিয়মগুলি আপনার উত্তরের জন্য প্রযোজ্য , সুতরাং আপনাকে সঠিক পরামিতিগুলি, সম্পূর্ণ প্রোগ্রামগুলির সাথে STDIN / STDOUT, ফাংশন / পদ্ধতি ব্যবহারের অনুমতি দেওয়া হবে। আপনার কল
  • ডিফল্ট লুফোলগুলি নিষিদ্ধ।
  • যদি সম্ভব হয় তবে আপনার কোডের জন্য একটি পরীক্ষার সাথে একটি লিঙ্ক যুক্ত করুন।
  • এছাড়াও, প্রয়োজন হলে একটি ব্যাখ্যা যোগ করুন।

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

100          ->   67
1            ->   73
4            ->   159
22           ->   322
5000         ->   261
2016         ->   401
1000000000   ->   427
1991         ->   449
9999         ->   800
1111111111   ->   2344
2147483647   ->   5362


1
@ মার্টিন 9999-> M(X)CMXCIX-> 77+263+67+77+88+67+73+88-> 800এবং 2147483647-> ((MMCXLV)MMCDLXXX)MMMDCXLVII-> 427+427+417+438+426+436 + 252+252+242+243+251+263+263+263 + 77+77+77+68+67+88+76+86+73+73-> 5362। সুতরাং আমি দ্বিতীয় সংশোধন করেছি, কিন্তু 9999সঠিক ছিল।
কেভিন ক্রুইজসেন

1
পরীক্ষার কেস 2222222222প্রদত্ত পরিসরে নেই। এছাড়াও আমি একমত 5362
নীল

1
শিরোনাম কিন্ডা স্ট্যাক ওভারফ্লো সি প্রশ্নের মতো মনে হচ্ছে।
ব্যবহারকারী 6245072

3
শিরোনামে "চতুর্থ" শব্দটি কি শ্লেষযুক্ত? যদি তা না হয় তবে এটি "এগিয়ে" হওয়া উচিত।
মন্টি হার্ডার

উত্তর:


4

গণিত, 181 173 166 151 বাইট

Golfed

(q=Select[ToCharacterCode@#,64<#<99&]&/@StringSplit[RomanNumeral[#],"_"];p=PadLeft;l=Length;Total[p[q,4]+p[{350,350*Mod[l@q,2],175,0}[[-l@q;;]],4],2])&

Ungolfed

(
q = Select[
     ToCharacterCode@#,
     64<#<99&
    ]&/@StringSplit[RomanNumeral@#,"_"];
p=PadLeft;
l=Length;
Total[
   p[q,4]+
   p[{350,350*Mod[l@q,2],175,0}[[-l@q;;]],4]
   ,2]
)&

গণিতের RomanNumeralবাস্তবায়ন 9999 এর জন্য (IX) সিএমএক্সসিআইএক্স দেয় এবং তাই প্রোগ্রামটি সেই সংখ্যার জন্য 971 দেয়।

যেমনটি লেখা হয়েছে, ((...)) (...) ... টাইপের রোমান অঙ্কগুলি 4 দৈর্ঘ্যের রোমান সংখ্যার জন্য ASCII কোডগুলির একটি নেস্টেড তালিকা প্রদান করে ... ((...)) ... দৈর্ঘ্যের 3, (...) ... 2 দৈর্ঘ্যের একটি তালিকা প্রদান করে, এবং ... দৈর্ঘ্যের একটি তালিকা প্রদান করে। চূড়ান্ত রেখাটি প্রতিটি নিয়মের জন্য যথাযথ সংখ্যায় ম্যাক্রনগুলিতে রূপান্তর করে rules তালিকা, সেই ম্যাক্রনগুলিকে এতে যুক্ত করে এবং তারপরে আউটপুট ফেরত দেওয়ার জন্য পুরো নেস্টেড তালিকাটি যোগ করে।


1
পিপিসিজিতে আপনাকে স্বাগতম!
betseg

@ বিটসেগ ধন্যবাদ! এটি একটি মজার প্রথম সমস্যা ছিল।
হিগস্টনরাইনবার্ড

10

পাইথন 3, 281 278 273 269 ​​বাইট

কোডগল্ফে আমার প্রথম প্রচেষ্টা, এখানে আমরা যাচ্ছি। লিঙ্কযুক্ত প্রশ্নটি না দেখে এটি করার চেষ্টা করেছিলেন, তাই এটি সম্ভবত ভয়াবহ :)

def f(n):d=len(str(n))-1;l=10**d;return 0if n<1else(n<l*4and[73,88,67,77,263,242,252,438,417,427][d]+f(n-l))or(l<=n//9and[161,155,144,340,505,494,690,855,844][d]+f(n-9*l))or(n<l*5and[159,164,135,338,514,485,688,864,835][d]+f(n-4*l))or[86,76,68][d%3]+(d//3*175)+f(n-5*l)

8 বাইট ছোট, গ্যাবার ফেকেটকে ধন্যবাদ

Ungolfed:

def f(n):
d = len(str(n)) - 1 # number of digits minus one
l = 10 ** d         # largest power of 10 that is not larger than parameter
if n == 0:
    return 0
elif n < 4 * l: # starts with X, C, M, ...
    return [
        ord('I'),
        ord('X'),
        ord('C'),
        ord('M'),
        ord('X') + 175, 
        ord('C') + 175, 
        ord('M') + 175, 
        ord('X') + 350, 
        ord('C') + 350, 
        ord('M') + 350
    ][d] + f(n - l)
elif n // 9 * 10 >= 10 * l: # starts with IX, XC, ...
    return [
        ord('I') + ord('X'), 
        ord('X') + ord('C'), 
        ord('C') + ord('M'),
        ord('M') + ord('X') + 175,
        ord('X') + ord('C') + 350,
        ord('C') + ord('M') + 350,
        ord('M') + ord('X') + 525,
        ord('X') + ord('C') + 700,
        ord('C') + ord('M') + 700
    ][d] + f(n - 9*l)
elif n < 5 * l: # starts with IV, XL, CD, ... 
    return [
        ord('I') + ord('V'),
        ord('X') + ord('L'),
        ord('C') + ord('D'),
        ord('M') + ord('V') + 175,
        ord('X') + ord('L') + 350,
        ord('C') + ord('D') + 350,
        ord('M') + ord('V') + 525,
        ord('X') + ord('L') + 700,
        ord('C') + ord('D') + 700
    ][d] + f(n - 4 * l)
else: # starts with V, L, D, ...
    return [
        ord('V'), 
        ord('L'), 
        ord('D'),
        ord('V') + 175, 
        ord('L') + 175, 
        ord('D') + 175,
        ord('V') + 350, 
        ord('L') + 350, 
        ord('D') + 350
    ][d] + f(n - 5 * l)

আপনি গলফ প্রতিস্থাপন করে কিছু বাইট return 0 if n==0 elseসঙ্গেreturn 0if n<1else
গাবর Fekete

আপনার গল্ফযুক্ত সংস্করণটিতে fফাংশনের নাম থাকলে তাতে কল রয়েছে g
গ্যাবার ফেকেট

আরও কিছু সংরক্ষণ n//9*10>=10*lকরতে পরিবর্তন করুন n//9>=l
গ্যাবার ফেকেট

স্থির ফাংশনটির নাম, আমি এটি সঠিকভাবে গল্ফ দিয়েছি কিনা তা যাচাই করার জন্য এটি পরিবর্তন করেছি এবং এটি আবার পরিবর্তন করতে ভুলে গিয়েছি।
jDomantas

3

রুবি, 188 বাইট

রোমান সংখ্যা রূপান্তরকরণের জন্য আমার পুরানো রুবি উত্তরের উপর ভিত্তি করে একটি অভিযোজন । এটি অনলাইন চেষ্টা করুন!

f=->x,i=0{k=0;(x<t=1e3)?"CM900D500CD400C100XC90L50XL40X10IX9V5IV4I1".gsub(/(\D+)(\d+)/){v=$2.to_i;s=x/v;x%=v;($1*s).bytes.map{|c|k+=c==73&&i>0?77+175*~-i:c+175*i}}:k=f[x/t,i+1]+f[x%t,i];k}

3

গণিত, 198 বাইট

Tr[Tr@Flatten[ToCharacterCode/@#]+Length@#*Tr@#2&@@#&/@Partition[Join[SplitBy[Select[Characters@#/."\&"->1,MemberQ[Join["A"~CharacterRange~"Z",{1}],#]&],LetterQ]/. 1->175,{{0}}],2]]&@RomanNumeral@#&

দুর্ভাগ্যক্রমে, বিল্টিনগুলি এখানে খুব বেশি সহায়তা করে না, যদিও আমি নিশ্চিত যে এটি আরও বেশি গল্ফ করা যেতে পারে।

দ্রষ্টব্য: এখানে9999 -> 971 হিসাবে মূল্যায়ন ।


2

ব্যাচ, 373 বাইট

@echo off
set/an=%1,t=0,p=1
call:l 73 159 86 161
call:l 88 164 76 155
call:l 67 135 68 144
call:l 77 338 261 340
call:l 263 514 251 505
call:l 242 485 243 494
call:l 252 688 436 690
call:l 438 864 426 855
call:l 417 835 418 844
call:l 427 0 0 0
echo %t%
exit/b
:l
set/ad=n/p%%10,p*=10,c=d+7^>^>4,d-=9*c,t+=%4*c,c=d+3^>^>3,d-=5*c,t+=%3*c+%2*(d^>^>2)+%1*(d^&3)

মান 1, 4, 5 ও 9. ব্যবহারের জন্য একটি লুকআপ সারণী অনুসারে সংখ্যা প্রতিটি অঙ্ক অনুবাদ করে কাজ করে M(V), M(X), (M(V))এবং (M(X))। যদি আপনি চান (IV), (IX), ((IV))এবং ((IX))তারপর ব্যবহার call:l 77 509 261 511এবং call:l 252 859 436 861যথাক্রমে।


1

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

f=(n,a=0)=>n<4e3?[256077,230544,128068,102535,25667,23195,12876,10404,2648,2465,1366,1183,329].map((e,i)=>(d=e>>8,c=n/d|0,n-=c*d,r+=c*(e%256+a*-~(i&1))),r=0)|r:f(n/1e3,a+175)+f(n%1e3)

নোট: না শুধুমাত্র পছন্দ (IV)করতে M(V), কিন্তু পছন্দ করে (VI)করতে (V)M; আসলে এটি কেবল সংখ্যার একেবারে শুরুতে এম ব্যবহার করবে।


1

পাইথন, 263 বাইট

def g(m):x=0;r=[73,86,88,76,67,68,77,261,263,251,242,243,252,436,438,426,417,418,427,0,0];return sum([b%5%4*r[i+(i*1)]+((b==9)*(r[i+(i*1)]+r[(i+1)*2]))+((b==4)*(r[i+(i*1)]+r[i+1+(i*1)]))+((b in [5,6,7,8])*r[i+1+(i*1)])for i,b in enumerate(map(int,str(m)[::-1]))])

পিপিসিজিতে স্বাগতম, প্রথম প্রথম উত্তর!
তামা

1

আর, 115 বাইট

সুতরাং ... আমি আমার সমাধান পোস্ট করছি কারণ আমি প্রশ্নটি বেশ আকর্ষণীয় মনে করি। প্যাকেজ ছাড়াই রোমান সংখ্যা নিয়ে কাজ করার জন্য আমি আর এর সক্ষমতা নিয়ে যথাসাধ্য চেষ্টা করেছি : আপনি কেবলমাত্র 1এবং এর মধ্যে সংখ্যার ইনপুট করতে পারবেন 3899, as.romanযেমনটির ডকুমেন্টেশন ব্যাখ্যা করে।

এটা কেন আমি মধ্যে পরিসীমা দিয়ে একটু প্রতারিত হচ্ছে 1থেকে এ লুপ: এটি দৈর্ঘ্য এর 'র আউটপুট ( ) । প্রকৃতপক্ষে, এই ওয়েবসাইট অনুসারে , দীর্ঘতম রোমান সংখ্যা (14 অক্ষর), যা এর সাথে সম্পর্কিত ।11 14foras.roman(3899)MMMDCCCXCIX
MMDCCCLXXXVIII2888

তদতিরিক্ত, আপনি lengthএই ফাংশনটির আউটপুট গণনা করতে পারবেন না ।

a=scan();v=0;for(i in 1:14){v=c(v,as.numeric(charToRaw(substring(as.character(as.roman(a)),1:14,1:14)[i])))};sum(v)

যদি কেউ উপরের সমস্যাগুলি মোকাবেলার সমাধান দেখতে পায় তবে বিনা দ্বিধায় মন্তব্য করুন।


0

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

def p(n=int(input()),r=range):return sum([f*g for f,g in zip([abs(((n-4)%5)-1)]+[t for T in zip([((n+10**g)//(10**g*5))%2for g in r(10)],[(n%(10**g*5))//(10**g*4)+max((n%(10**g*5)%(10**g*4)+10**(g-1))//(10**g),0)for g in r(1,10)])for t in T],[73,86,88,76,67,68,77,261,263,251,242,243,252,436,438,426,417,418,427])])

অবরুদ্ধ সংস্করণ:

def p(n=int(input()),r=range):
    return sum([f*g for f,g in zip(
        [abs(((n-4)%5)-1)]+
        [t for T in zip(
            [((n+10**g)//(10**g*5))%2for g in r(10)],
            [(n%(10**g*5))//(10**g*4)+max((n%(10**g*5)%(10**g*4)+10**(g-1))//(10**g),0)for g in r(1,10)]
        )for t in T],
        [73,86,88,76,67,68,77,261,263,251,242,243,252,436,438,426,417,418,427])])

ব্যাখ্যা: এই সংস্করণটি একটি পৃথক পদ্ধতির ব্যবহার করে, এটি সংখ্যায় রোমান সংখ্যার উপস্থিতি গণনা করে।

[abs(((n-4)%5)-1)]Iরোমান সংখ্যাতে s এর সংখ্যা।

[((n+10**g)//(10**g*5))%2for g in r(10)]সংখ্যায় V,L,D,(V),(L),(D),((V)),((L)),((D))s এর সংখ্যা।

[(n%(10**g*5))//(10**g*4)+max((n%(10**g*5)%(10**g*4)+10**(g-1))//(10**g),0)for g in r(1,10)]সংখ্যায় X,C,M,(X),(C),(M),((X)),((C)),((M))s এর সংখ্যা।

এরপরে এটি চরিত্রের মান দিয়ে সংখ্যাগুলি বৃদ্ধি করে এবং এর যোগফল প্রদান করে।

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