বিকল্প দিক থেকে একটি গাণিতিক প্রকাশ সমাধান করুন


9

এমন একটি প্রোগ্রাম তৈরি করুন যা অভিব্যক্তির বিকল্প দিকগুলির উপাদানগুলি ব্যবহার করে একটি গাণিতিক অভিব্যক্তি সমাধান করে। এটি যেভাবে সম্পন্ন হয়েছে তা হ'ল, বাম থেকে ডানে পড়ার পরিবর্তে আপনি প্রথম অক্ষরটি পড়বেন, তারপরে শেষটি, দ্বিতীয়টি, তারপরে দ্বিতীয় থেকে শেষ ইত্যাদি This এটি আপনাকে একটি নতুন এক্সপ্রেশন দেবে যা আপনাকে মূল্যায়ন করতে হবে এবং আউটপুট দিতে হবে।

a*b/c+d-e
135798642  <-- Order you read the expression in
ae*-bd/+c  <-- Order of operation. 

উদাহরণ:

1*3/2+4-5
15*-34/+2 = -255

যদি অভিব্যক্তিটি «কাজ করে না», 1এটি কাজ করার জন্য একটি অবশ্যই প্রয়োজনীয় অবস্থানে .োকাতে হবে।

কয়েকটি উদাহরণ সম্ভবত এটি আরও ভাল চিত্রিত করবে:

Input: 1+1+1+1+1
Result: 23     // Because 1+1+1+1+1 -> 11++11++1 -> 23

Input: 1+2-3+12-5
Result: -19    // Because 1+2-3+12-5 -> 15+-22-13+ -> 15+-22-13+1 -> -19
               //                                 |
               //                                 Not valid expression

Input: 2*2*2*2*2
Result: 968    // Because 2*2*2*2*2 -> 22**22**2 -> 22*1*22*1*2 -> 968
               //                        ||  ||
               //                        Not valid, 1 must be inserted

Input: 17/2
Output: 127    // Because 17/2 = 127/ -> 127/1 -> 127

অপারেটররা অবশ্যই সমর্থিত হবে + - * /। বন্ধনী থাকবে না। সাধারণ গণিতের নিয়মাবলী এবং "সিনট্যাক্স" ব্যবহৃত হয়, সুতরাং উদাহরণস্বরূপ **ক্ষয়ক্ষতির অর্থ নয়। a++++1সমতুল্য a+1(যেমন ম্যাটল্যাব স্টাইল, সি ++ নয়)।

যদি সন্দেহ থাকে তবে কিছু বৈধ ক্রিয়াকলাপগুলি হ'ল:

-a
+a
a++b
a+-b
a*-b
a*+b
a*++b
a/b
a/-b
a/+b
-a/--b

যদিও নিম্নলিখিতগুলির সমস্তটি বৈধ নয়। এগুলির সাথে কী প্রতিস্থাপন করা উচিত তা দেখানো হয়েছে:

a+      | a+1
a-      | a-1
a++++   | a++++1   (This is equivalent to a+1)
a*+++   | a*+++1   (This is equivalent to a*1)
a**b    | a*1*b
a*/b    | a*1/b
a/*b    | a/1*b
a*      | a*1
*a      | 1*a
***a    | 1*1*1*a

নিয়মাবলী:

  • কোডটি কোনও ফাংশন বা একটি সম্পূর্ণ প্রোগ্রাম হতে পারে
  • ইনপুটটি STDIN বা ফাংশন যুক্তি হতে পারে
  • ইনপুট অবশ্যই একটি বৈধ গাণিতিক এক্সপ্রেশন হতে হবে, উদ্ধৃতি চিহ্ন ছাড়াই ''বা""
  • একটি পূর্ণসংখ্যা, দশমিক বা সরলিকৃত ভগ্নাংশ হিসাবে আউটপুটটি নতুন এক্সপ্রেশনটির উত্তর হওয়া উচিত।
  • দশমিক পয়েন্টের পরে কমপক্ষে তিনটি অঙ্ক সমর্থন করা আবশ্যক। সুতরাং 1/3 = 0.333, না 0.330.333333333গৃহীত হয়
  • ans = ... গৃহীত হয়
  • শীর্ষস্থানীয় এবং অনুসরণযোগ্য নিউলাইন এবং স্থানগুলি স্বীকৃত।
  • ইনপুটটি কেবল পূর্ণসংখ্যা হবে
  • শূন্য দ্বারা বিভাজনের ফলে ত্রুটি, নাএন, ইনফ ইত্যাদি হতে পারে a

সর্বদা হিসাবে, সংক্ষিপ্ত কোড বাইট জিতে। যেদিন চ্যালেঞ্জ পোস্ট হয়েছিল সেদিন থেকে একজন বিজয়ী নির্বাচন করা হবে। পরে পোস্ট করা উত্তরগুলি যদি বর্তমান নেতার চেয়ে কম হয় তবে জিততে পারে।


ইনপুট স্ট্রিং বা অপারেটর / পূর্ণসংখ্যার ইনপুটের গণনাতে কি সর্বোচ্চ দৈর্ঘ্য রয়েছে? এছাড়াও, আমাকে কি গণিতকে সমর্থন করতে হবে 2^64, এবং যদি আপনি উপরে যান তবে এটির ত্রুটি বা মোড়ক থাকা উচিত?
বিড়াল

"আউটপুটটি উত্তর হওয়া উচিত [ … ।] সরলিকৃত ভগ্নাংশ ..." তাই 0/0অভিব্যক্তিটি শূন্য দ্বারা পূর্ণসংখ্যা বিভাজন বা মডুলোতে প্রদর্শিত হলে আমি কেবল ফিরে আসতে পারি ?
বিড়াল

2
যদি উত্তরটি শূন্য দ্বারা বিভাজন দেয়, তবে x/0এটি একটি বৈধ আউটপুট। যতক্ষণ না এটি কোনও ভুল উত্তর আউটপুট দেয় না ঠিক আছে। ত্রুটি এবং "একটি সংখ্যা নয়" সংজ্ঞা দ্বারা সঠিক, এবং অনন্ত "যথেষ্ট সঠিক",
স্টিভি গ্রিফিন

শুধু নিশ্চিত হতে - ইওল ব্যবহার করা যায়, তাই না?
orlp

হ্যাঁ, ইভাল ঠিক আছে।
স্টিভি গ্রিফিন

উত্তর:


3

পার্ল, 108 100 বাইট

$_="";while(@F){$_.=shift@F;$_.=pop@F}s@(\*|/)\1+@\1@g;s@^[*/]@1$&@;s@\D$@$&1@;s@\D@$&@g;$_=eval

কমান্ড-লাইন আর্গুমেন্টের জন্য কোডটি 96 বাইট, এবং 4 হয় -pF//where

  • -pসন্নিবেশ while (<>) { .. } continue { print }এবং
  • -F//ইনপুট বিভক্ত এবং এটি রাখে @F

নোট করুন যে ইনপুটটিতে একটি ট্রেলিং করা নতুন লাইন থাকা উচিত নয়, তাই ব্যবহার করুন /bin/echo -n 'formula' | perl ...

কম গল্ফড:

$_='';              # reset $_
while(@F) {         # reorder input
   $_.=shift @F;    # take first element off of @_
   $_.=pop @F       # idem for last; if @F is empty, undef is appended
}

s@(\*|/)\1+@\1@g;   # replace 2 or more '*' or '/' with just one: *1 and /1 = nop
s@^[*/]@1$&@;       # if expression starts with * or / prepend a 1
s@\D$@$&1@;         # if expression doesn't end with a number, append 1
s@\D@$& @g;         # eval doesn't like '++1': add spaces after operators
$_ = eval           # set $_ to 3v1l, so the `-p` will print the new value

পরীক্ষামূলক

উপরেরটিকে ডাকা একটি ফাইল 114.plএবং তার পাশের একটি ফাইলে নীচের পরীক্ষা স্ক্রিপ্টটি রাখুন:

%test = (
    '1+1+1+1+1' =>   23,
    '1*3/2+4-5' => -255,
    '1+2-3+12-5'=>  -19,
    '2*2*2*2*2' =>  968,
    '17/2'      =>  127,
    '--/-1-2-'  =>   -2,
    '**2*'      =>    2,
    '++1++'     =>    1,
    '/2/'       =>  0.5,
    '10/'       =>   '',
);

printf "%-20s -> %5s: %5s\n", $_, $test{$_}, `/bin/echo -n '$_' | perl -pF// 114.pl`
for keys %test;

এটি চালানো ফলাফল:

++1++                ->     1:     1
**2*                 ->     2:     2
17/2                 ->   127:   127
10/                  ->      :
1+1+1+1+1            ->    23:    23
1*3/2+4-5            ->  -255:  -255
2*2*2*2*2            ->   968:   968
1+2-3+12-5           ->   -19:   -19
--/-1-2-             ->    -2:    -2
/2/                  ->   0.5:   0.5

নোট যে 1/0শূন্য ত্রুটি দ্বারা বিভাজন ঘটায়: evalআউটপুট undef, যা খালি স্ট্রিং দ্বারা প্রতিনিধিত্ব করা হয়।


আরও কয়েকটি পরীক্ষার মামলা! আমি তাদের ব্যবহার করতে যাচ্ছি
edc65

3

জাভাস্ক্রিপ্ট ES6, 105 106

সম্পাদনা 1 বাইট thx @ কেনে

t=>eval("for(t=[...t],p=o='';c=t.reverse().pop();p=c)o+=p<'0'?(c=='/'|c<'+'||' ')+c:c;eval(p<'0'?o+1:o)")

// Less golfed
t=>{
  for(t = [...t], p = o = '';
      c = t.reverse().pop();
      p = c)
    o += p<'0' 
     ? (c=='/' | c=='*' || ' ')+c  // '1' or ' '
     : c;
  return eval(p<'0' ? o+1 : o)
}

পরীক্ষার স্নিপেট

f=t=>eval("for(t=[...t],p=o='';c=t.reverse().pop();p=c)o+=p<'0'?(c=='/'|c<'+'||' ')+c:c;eval(p<'0'?o+1:o)")

console.log=x=>O.innerHTML+=x+'\n'

function test() { console.log(I.value + ' -> '+f(I.value)) }

;['1+1+1+1+1', '1*3/2+4-5', '1+2-3+12-5', '2*2*2*2*2',
  '17/2', '--/-1-2-', '**2*', '++1++', '/2/', '10/' ]
.forEach(t=>console.log(t+' -> '+f(t)))
Your test <input id=I><button onclick="test()">-></button>
<pre id=O></pre>


আপনি যদি একটি বাইট সংরক্ষিত হয়েছে: p < '0' ? ( c=='/' | c<'+' || ' ' )+c : c ;
কেনে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.