সংখ্যাসূচক সংক্ষিপ্তসার সঙ্গে অভিব্যক্তি মূল্যায়ন


10

আপনি একটি কোম্পানী একটি ব্যবহারকারী বান্ধব ক্যালকুলেটর করতে চাইছে যে জন্য কাজ, এবং এইভাবে আপনি ব্যবহারকারীদের "সংখ্যাসূচক shorthands 'অর্থাৎ, অক্ষর যে যেমন সংখ্যাসূচক মান, প্রতিনিধিত্ব ব্যবহার করার জন্য ক্ষমতা যোগ সঙ্গে tasked হয়েছে kজন্য 1000। আপনার সংস্থাটি ক্যালকুলেটরগুলিতে স্টোরেজে অর্থ সঞ্চয় করতে চায় বলে স্টোরেজের ব্যয় হ্রাস করতে আপনার কোডটি যথাসম্ভব কমিয়ে আনতে হবে।


তোমার কাজ

আপনাকে এমন একটি ফাংশন তৈরি করতে হবে যা হয় হয় STDIN থেকে ইনপুট হিসাবে কোনও এক্সপ্রেশনটি পড়ে বা এটি একটি প্যারামিটার হিসাবে গ্রহণ করে এবং তার মূল্যায়ন ফেরত দেয় বা এটি STDOUT এ প্রিন্ট করে।

কিছু স্পষ্টতা

আমাকে কিছু সংজ্ঞা দেওয়া যাক। প্রথম বন্ধ, আমাদের ইনপুট আছে, যা আমি একটি এক্সপ্রেশন কল। এটি নিম্নলিখিতগুলির মতো কিছু হতে পারে:

x + y / z

এই মত প্রকাশের মধ্যে আমরা তিন নম্বর আছে: x, y, এবং z, অপারেটর (দ্বারা পৃথক +এবং /)। এই সংখ্যাগুলি ইতিবাচক পূর্ণসংখ্যার (বা এমনকি পূর্ণসংখ্যার) নয়। জিনিসগুলিকে কী জটিল করে তোলে তা হ'ল যখন আমাদের সংখ্যার মধ্যে থাকা সংক্ষিপ্তসারগুলি মূল্যায়ন করতে হবে। উদাহরণস্বরূপ, সাথে

2k15

মূল্যায়ন উদ্দেশ্যে, আমরা এই তিন নম্বর মধ্যে আপ বিভক্ত: 2, 1000(যা k), এবং 15। তারপরে, নিয়ম অনুসারে, আমরা সেগুলি সংগ্রহের জন্য তাদের একত্রিত করি

2*1000 + 15 = 2015

আশা করি নিম্নলিখিত নিয়মগুলি বুঝতে এটি কিছুটা সহজ করে তোলে।

বিধি

এনবি অন্যথায় নির্দিষ্ট না করাতে আপনি শর্টহ্যান্ডগুলি অন্তর্ভুক্ত করতে "সংখ্যা" শব্দ বা এর সমার্থক শব্দটির ব্যাখ্যা করতে পারেন।

  1. নিম্নলিখিত সংখ্যাসূচক shorthands আপনার ফাংশন প্রক্রিয়া করতে সক্ষম হতে হবে গঠন: k, m, b, t, and e। যথাক্রমে k, m, b, and tমানগুলির সাথে 1000, 1000000, 1000000000, and 1000000000000মিল (এক হাজার, এক মিলিয়ন, এক বিলিয়ন এবং এক ট্রিলিয়ন)। eসাধারণভাবে সংক্ষেপে সবসময় অন্য একটি নম্বর দ্বারা অনুসরণ করা হবে n, এবং প্রতিনিধিত্ব করে 10^n। আপনাকে অবশ্যই সংখ্যার শর্টহ্যান্ডগুলি উপস্থিত nএবং আগে উপস্থিত থাকতে হবে e। উদাহরণস্বরূপ, kekমূল্যায়ন 1000*10^1000

  2. সরলতার জন্য, যদি কোনও সংখ্যার মধ্যে শর্টহ্যান্ড eথাকে তবে এটি কেবল একবার ব্যবহার করা হবে।

  3. শর্টহ্যান্ড এর দ্বারা বহুগুণ হওয়ার আগে যে কোনও সংখ্যা ( শর্টহ্যান্ডস অন্তর্ভুক্ত )। যেমন 120kkহিসাবে মূল্যায়ন করা হবে 120 * 1000 * 1000। যদি এর আগে কোনও সংখ্যা না থাকে তবে আপনাকে অবশ্যই ধরে নিতে হবে যে সংখ্যাটি 1 (যেমন আপনি কীভাবে গণিতের ক্ষেত্রে কোনও পরিবর্তনশীলকে xস্পষ্টভাবে আচরণ করতে পারেন 1x)। যেমন e10মূল্যায়ন 10^10। আর একটি উদাহরণ: 2m2kমূল্যায়ন 2*1000000*2*1000(এতে কোনও কিছুই যুক্ত হয় না)।

  4. শর্টহ্যান্ড যুক্ত সংখ্যায় শেষ শর্টহ্যান্ডের পরে যে কোনও সংখ্যা (শর্টহ্যান্ডগুলি প্রয়োগ হয় না) এতে যুক্ত হয়। যেমন 2k12হিসাবে মূল্যায়ন করা হবে 2*1000 + 12। এর ব্যতিক্রম হ'ল শর্টহ্যান্ড eব্যবহার করা হয়, সেক্ষেত্রে নিম্নলিখিত সংখ্যার ( শর্টহ্যান্ডস অন্তর্ভুক্ত ) eহিসাবে বিবেচনা করা হবে nএবং 10^n(প্রথম নিয়মটি দেখুন) হিসাবে মূল্যায়ন করা হবে ।

  5. আপনার ফাংশনটি অবশ্যই অপারেটরগুলিকে প্রক্রিয়া করতে সক্ষম হবে +, -, *, and /যা যথাক্রমে সংযোজন, বিয়োগ, গুণ এবং বিভাগ। আপনি যদি ইচ্ছা করেন তবে এটি আরও প্রক্রিয়াজাত করতে পারে।

  6. অপারেশনগুলির ক্রম অনুসারে অপারেশনগুলি মূল্যায়ন করা হয়

  7. শর্টহ্যান্ডের সংখ্যাগুলি কেবল পূর্ণসংখ্যা নয়। 3.5b1.2বৈধ এবং হিসাবে মূল্যায়ন করা হয়3.5*1000000000 + 1.2 = 3500000001.2

  8. বিল্ট-ইনগুলি অনুমোদিত নয়, যদি তারা এই ধরণের জিনিসটির জন্য থাকে। আমি যে ব্যতিক্রম যুক্ত করব তা হ'ল যদি আপনার ভাষা স্বয়ংক্রিয়ভাবে বিপুল সংখ্যাকে বৈজ্ঞানিক স্বরলিপিতে রূপান্তর করে, এমন ক্ষেত্রে এটি আপনার আউটপুটটির জন্য গ্রহণযোগ্য।

  9. বাইট জেতে সংক্ষিপ্ততম কোড, স্ট্যান্ডার্ড লুফোলগুলি প্রয়োগ করা।

ইনপুট

ইনপুটটি প্রতিটি নম্বর এবং অপারেটরকে স্পেস দিয়ে পৃথক করে একটি অভিব্যক্তি হবে। সংখ্যায় শর্টহ্যান্ড থাকতে পারে বা নাও থাকতে পারে। একটি নমুনা নীচে দেখানো হয়েছে:

10 + 1b - 2k

আউটপুট

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

পরীক্ষার কেস

ইনপুট

t

আউটপুট

1000000000000

ইনপুট

1 + 4b / 10k11

আউটপুট

399561.483

ইনপুট

e2 + k2ke-1 - b12

আউটপুট

-999799912

অথবা

-999799912.000

ইনপুট

142ek12

আউটপুট

142e1012

অথবা

142.000e1012

ইনপুট:

1.2m5.25

আউটপুট:

1200005.25

চূড়ান্ত নোটস

এটি পোস্ট করা আমার প্রথম চ্যালেঞ্জ (স্যান্ডবক্সের ব্যবহারকারীদের কাছ থেকে কিছু সাহায্য নিয়ে)। যদি কিছু অস্পষ্ট থাকে তবে তা আমার কাছে জানিয়ে দিন এবং আমি পরিষ্কার করার জন্য যথাসাধ্য চেষ্টা করব।


1
ভাল প্রথম চ্যালেঞ্জ
ডিজিটাল ট্রমা

@ ডিজিটালট্রামা অনেক ধন্যবাদ! আমি উত্তরগুলি দেখার অপেক্ষায় রয়েছি
কোলে

আমি দ্বিতীয় উদাহরণ বুঝতে পারি না। আমি মনে করি মধ্যবর্তী শব্দটি ব্যাখ্যা করা হয়েছিল 1000 + 2000 * 10 ^ -1, তবে এটি একটি চূড়ান্ত উত্তর দিয়েছে -999998712। (এছাড়াও, আমার ব্যাখ্যাটি নিয়ম 4 এর " শেষের শর্টহ্যান্ড ," দিয়ে মজা করে বলে মনে হচ্ছে না তবে অনুক্রমটি কীভাবে বুঝতে হবে তা আমি নিশ্চিত নই k2k।) আপনি কি দয়া করে এটি মূল্যায়নের পদক্ষেপগুলি ব্যাখ্যা করতে পারেন?
ডিএলকস

@ থ্রিচোপ্লেক্স হ্যাঁ, এটি কেবল একটি সংখ্যা হওয়া উচিত; ভালো বল ধরা.
কোলে

1
স্যান্ডবক্স পোস্টে মন্তব্য দেখার পরও কি, আমি মনে করি মত একটি উদাহরণ 2m2kনিয়ম 3. এছাড়াও আলোচনা যোগ করা উচিত, এটি একটি ভিন্ন শব্দ ব্যবহার করা সর্বোত্তম হতে পারে - মত আক্ষরিক সংখ্যার জন্য - হয়তো "পূর্ণসংখ্যা" 123যে সংক্ষিপ্ত নয় । "সংখ্যা" শব্দটির এখানে প্রায় 3 টি পৃথক সংজ্ঞা রয়েছে, যেমনটি এখন দাঁড়িয়ে আছে।
ডিএলসক

উত্তর:


4

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

import sys
a=lambda i:lambda j:j*10**i
d={'k':a(3),'m':a(6),'b':a(9),'t':a(12)}
e='e'
o={'+':lambda i,j:i+j,'-':lambda i,j:i-j,'*':lambda i,j:i*j,'/':lambda i,j:i/j,e:lambda i,j:i*10**j}
r=[e,'*','/','+','-']
x=0
y=k=b=''
z=[]
q=lambda i,j:float(i or j)
for l in ''.join(sys.argv[1:]):
 if l in d:x,y=d[l](q(x,1)*q(y,1)),b
 elif l==e:z.extend([q(x+q(y,0),1),l]);x,y=0,b
 elif k==e:y+=l
 elif l in o:z.extend([x+q(y,0),l]);x,y=0,b
 else:y+=l
 k=l
z.append(x+q(y,0))
for m in r:
 while m in z:n=z.index(m);z[n-1:n+2]=[o[m](z[n-1],z[n+1])]
print repr(z[0])

এই প্রশ্নটি কিছুটা অবহেলিত এবং মজাদার মনে হয়েছিল, তাই আমি এটি একটি শট দিয়েছি। আমি এর আগে কখনও কোড গল্ফ করিনি, তাই সম্ভবত আরও অনেক কিছু উন্নত করা যেতে পারে, তবে ভাষাটির জ্ঞানের উপর ভিত্তি করে আমি এটিকে আমার সেরাটি দিয়েছিলাম। পাইথন 3 এ একটি অতিরিক্ত বাইটের ব্যয়ে একটি সমপরিমাণ সমাধান সম্ভব: print repr(z[0])-> print(repr(z[0]))

ব্যবহারের লাইন বরাবর কিছু

python2 ShorthandMath.py <equation>

অর্থাত

python2 ShorthandMath.py e2 + k2ke-1 - b12

আউটপুট

-999799912.0

কীভাবে এটি উন্নত করা যায় তার ইনপুটটি অনেক প্রশংসা হবে। যদি পর্যাপ্ত আগ্রহ থাকে তবে আমি প্রোগ্রামটি দীর্ঘায়িত করতে এবং মন্তব্য করতে পারি, তবে এর বেশিরভাগই ইতিমধ্যে সুস্পষ্টভাবে সুসংগঠিত (কোড গল্ফ সম্পর্কিত একটি বিষয়)।

এটি লক্ষ করা উচিত যে প্রোগ্রামটি উদাহরণ সহ ভেঙে যায় 142ek12কারণ সেই মানটি হাস্যকরভাবে বড় এবং প্রোগ্রামটি উপচে পড়ে।

ক্ষতিপূরণ দেওয়ার জন্য, নিম্নলিখিতটি সামান্য দীর্ঘ, তবে নির্বিচারে নির্ভুলতা গ্রন্থাগারটিতে বিল্ট ব্যবহারের কারণে তাত্ত্বিকভাবে এতে ছুঁড়ে দেওয়া কোনও কিছুই পরিচালনা করতে পারে। সিনট্যাক্স অভিন্ন।

পাইথন 2, 589 588 বাইট (নির্বিচারে নির্ভুলতা)

import sys
from decimal import*
a=lambda i:lambda j:j*10**i
d={'k':a(3),'m':a(6),'b':a(9),'t':a(12)}
e='e'
o={'+':lambda i,j:i+j,'-':lambda i,j:i-j,'*':lambda i,j:i*j,'/':lambda i,j:i/j,e:lambda i,j:i*10**j}
r=[e,'*','/','+','-']
x=c=Decimal(0)
y=k=b=''
z=[]
q=lambda i,j:Decimal(float(i or j))
for l in ''.join(sys.argv[1:]):
 if l in d:x,y=d[l](q(x,1)*q(y,1)),b
 elif l==e:z.extend([q(x+q(y,0),1),l]);x,y=c,b
 elif k==e:y+=l
 elif l in o:z.extend([x+q(y,0),l]);x,y=c,b
 else:y+=l
 k=l
z.append(x+q(y,0))
for m in r:
 while m in z:n=z.index(m);z[n-1:n+2]=[o[m](z[n-1],z[n+1])]
print z[0]

আমি বলতে যাচ্ছি যে প্রথম সংস্করণটি ভাল হওয়া উচিত এবং যদি কিছু ভুল হয় তবে চেষ্টা করব (আমি এখনই খুব সাবধানে দেখতে পারি না / ভাবতে পারি না)।
কোলে

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