একটি সর্বজনীন ক্যালকুলেটর তৈরি করুন


16

প্রেরণা. ইনভার্স।

প্রদত্ত সর্বজনগ্রাহ্য এক্সপ্রেশন মূল্যায়ন করুন।

অ্যামনিফিক্স হ'ল সাধারণ গণিতের ইনফিক্স নোটেশনের মতো তবে যুক্তির চারপাশে প্রতিটি প্রতীকের অতিরিক্ত কপি সহ। বাইরের প্রতীকগুলি প্রথম বন্ধনীগুলির স্থান নেয় এবং অতএব অতিরিক্ত বন্ধনীগুলির প্রয়োজন নেই।

-0-n-আপনার ভাষার জন্য যুক্তিসঙ্গত পরিসরের মধ্যে আপনাকে অবশ্যই সংযোজন, বিয়োগ, গুণ, বিভাগ এবং ইতিবাচক আসল সংখ্যাগুলি (নেতিবাচকগুলি লিখতে পারে ) সমর্থন করতে হবে ।

প্লাস এবং মাইনাস হতে হবে +এবং -, কিন্তু আপনি ব্যবহার করতে পারেন *বা ×বার জন্য এবং /বা ÷ডিভাইড জন্য। অনুরোধের ভিত্তিতে অন্যান্য যুক্তিসঙ্গত প্রতীক অনুমোদিত হবে।

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

যদি সম্ভব হয় তবে আপনার সমাধানটি পরীক্ষা করার জন্য একটি লিঙ্ক সরবরাহ করুন।

উদাহরণ

স্পষ্টতার জন্য, নীচের ব্যাখ্যাগুলি ¯নেতিবাচক সংখ্যাগুলি নির্দেশ করতে উচ্চ বিয়োগ ( ) ব্যবহার করে। যে কোনও যুক্তিসঙ্গত ফর্ম্যাট ব্যবহার করে আপনি নেতিবাচক সংখ্যাগুলি ফিরিয়ে দিতে পারেন।

-5-2-3

+2+×3×2×+8 ( +2+×3×2×++2+6+8)

-14--3-1--12 ( -4--3-1---14-2-12)

+2.1+×3.5×2.2×+9.8 ( +2.1+×3.5×2.2×++2.1+7.7+9.8)

×3×÷-0-6-÷2÷×-9 ( ×3×÷-0-6-÷2÷××3×÷¯6÷2÷××3ׯ3ׯ9)

÷4÷-3-÷1÷2÷-÷1.6 ( ÷4÷-3-÷1÷2÷-÷÷4÷-3-0.5-÷÷4÷2.5÷1.6)


1
The explanations below use high minus (`¯`) to indicate negative numbers.আপনি অবশ্যই এপিএলকে ভালবাসেন।
এরিক আউটগল্ফার

@ এরিকথ আউটগল্ফার আপনার কাছে আরও ভাল পরামর্শ আছে? এছাড়াও, টিআই-বেসিক উচ্চ বিয়োগ ব্যবহার করে।
অ্যাডম

আসলে যেহেতু -s গুলি -এর সাথে বিভ্রান্ত হতে পারে সেহেতু s এর সাথে বিভ্রান্ত হতে ¯পারে না -
এরিক আউটগল্ফার

বাহ, আমি কেবল আসল সংখ্যার প্রয়োজনীয়তা লক্ষ্য করেছি। আমার 290-বাইট পূর্ণসংখ্যার গাণিতিক রেটিনা সমাধানের জন্য অনেক কিছু ...
নীল

@ নীল আপনি উত্তর হিসাবে পোস্ট করেন না কেন?
অ্যাডম

উত্তর:


4

সি # (.নেট কোর) , 198 197 188 বাইট

float O(string s){try{return float.Parse(s);}catch{var f=s[0];int i=s.IndexOf(f,1);float a=O(s.Substring(1,i-1)),b=O(s.Substring(i+1,s.Length-i-2));return f<43?a*b:f<44?a+b:f<46?a-b:a/b;}}

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

ব্যবহার *এবং /

একটি পুনরাবৃত্তি ফাংশন। এটি প্রথমে একটি হিসাবে ইনপুট স্ট্রিংটিকে বিশ্লেষণ করার চেষ্টা করে float। যদি এটি ব্যর্থ হয়, এটি নিজেকে প্রথম এবং দ্বিতীয় অপারেন্ডস হিসাবে আর্গুমেন্ট হিসাবে পুনরাবৃত্তভাবে পাস করার আহ্বান জানায় এবং তারপরে ফলাফলগুলিতে নির্বাচিত ক্রিয়াকলাপটি সম্পাদন করে।

  • মিঃ এক্সকোডারকে ধন্যবাদ 1 বাইট!
  • 9 বাইট সংরক্ষিত হয়েছে TheLethalCoder ধন্যবাদ!

IndefOf(f, 1)হতে পারেIndexOf(f,1)
মিস্টার এক্সকোডার

1
ব্যবহারের floatগুলি পরিবর্তে, গৃহস্থালির কাজ কোডগুলি ব্যবহার, আপনি আছে তাদের সম্ভবত তাদের খাটো করতে পারেন >এবং <স্থান দুয়েক হবে।
TheLethalCoder

আপনি বাইট পরিবর্তন i+1,s.Length-i-2করে গল্ফ করতে পারেন ++i,s.Length+~i
কেভিন ক্রুইজসেন

4

পাইথন 3, 159 158 152 144 136 135 132 বাইট

def t(i,a=1):
 while'-'<l[i]!='/':i+=1;a=0
 if a:l[i]='(';i=t(t(i+1));l[i-1]=')'
 return-~i
*l,=input()
t(0)
print(eval(''.join(l)))

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

নেতিবাচক সংখ্যাগুলি অনুমতি দেয় না (যদিও -0-5-এটি অবশ্যই কাজ করে) এবং পাইথন অপারেটরগুলির প্রয়োজন।


আপনি কি একটি টিআইও লিঙ্ক যুক্ত করতে পারেন?
Adám

1
while~-(l[i]in'+-*/'):i+=1;a=1এবং *l,=input()152 বাইটের জন্য
ফিলিপ নার্দি বাতিস্তা

1
সমস্ত পরীক্ষার কেসের সাথে: লিঙ্ক
ফিলিপ নারদী বাতিস্তা


1
if a:l[i]='(';i=t(t(i+1));l[i-1]=')'সঙ্গে return-~i135 বাইট জন্য: পি
ফিলিপ Nardi বাতিস্তা

3

রেটিনা , 290 287 286 বাইট

\d+
¦$&$*
¯¦
¯
{`\+([¯¦]1*)\+([¯¦]1*)\+
-$1-¯$2-
-(¯|¦)(1*)-([¯¦]+1*\2)-
-¯$3-¯$1$2-
(×|÷)¯(1*\1)([¯¦]1*\1)
$1¦$2¯$3
צ×[¯¦]1*×|¯¯¦?
¦
¯¦|¦¯
¯
+`-((¯|¦)1*)(1*)-\2\3-
$1
-([¯¦]1*)-[¯¦](1*)-
$1$2
צ1(1*)×([¯¦]1*)×
+צ$1×$2×+$2+
}`÷¦(?=1*÷(¯|¦)(1+)÷)(\2)*1*÷\1\2÷
$1$#3$*
((¯)|¦)(1*)
$2$.3

এটি অনলাইন চেষ্টা করুন! দ্রষ্টব্য: কেবলমাত্র পূর্ণসংখ্যার গাণিতিক সক্ষম, সুতরাং পরীক্ষার কয়েকটি কেস সরানো হয়েছে। ¯উপসর্গটি ব্যবহার করে নেতিবাচক সংখ্যাগুলি গ্রহণ করে এবং প্রদান করে । সম্পাদনা করুন: সংরক্ষিত 3 4 বাইট @ কউসকেউকে ধন্যবাদ। ব্যাখ্যা:

\d+
¦$&$*

আমার শূন্য পরিচালনা করার কিছু উপায় প্রয়োজন, তাই আমি ¦ইতিবাচক সংখ্যার উপসর্গ হিসাবে ব্যবহার করি । সংখ্যাগুলি তখন আনারিতে রূপান্তরিত হয়।

¯¦
¯

তবে নেতিবাচক সংখ্যাগুলির জন্য কেবল একটি ¯উপসর্গ প্রয়োজন need

{`\+([¯¦]1*)\+([¯¦]1*)\+
-$1-¯$2-

উদ্ধৃতিগুলি +কুৎসিত হয়, তাই আমি সংযোজনগুলিকে বিয়োগে পরিণত করি।

-(¯|¦)(1*)-([¯¦]+1*\2)-
-¯$3-¯$1$2-

যদি বিয়োগের এলএইচএসের নিখুঁত মান আরএইচএসের চেয়ে কম হয় তবে এগুলিকে ঘুরিয়ে ঘুরিয়ে উভয় পক্ষকে অবহেলা করুন।

(×|÷)¯(1*\1)([¯¦]1*\1)
$1¦$2¯$3

এছাড়াও যদি কোনও গুণ বা বিভাগের এলএইচএস নেতিবাচক হয় তবে উভয় পক্ষকে অবহেলা করুন।

צ×[¯¦]1*×|¯¯¦?
¦

এছাড়াও যদি কোনও গুণনের এলএইচএস শূন্য হয়, তবে ফলাফলটি শূন্য। এছাড়াও, দুটি বিয়োগ একটি প্লাস তৈরি করে।

¯¦|¦¯
¯

তবে একটি বিয়োগ এবং একটি প্লাস (বা বিপরীতে) একটি বিয়োগ করে।

+`-((¯|¦)1*)(1*)-\2\3-
$1

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

-([¯¦]1*)-[¯¦](1*)-
$1$2

যদি এখনও বিয়োগফল থাকে তবে লক্ষণগুলি অবশ্যই আলাদা হতে হবে, সুতরাং সংখ্যাগুলি একসাথে যুক্ত করুন। (তবে কেবল একবার এটি করুন কারণ এটি আবার একই চিহ্নের দুটি সংখ্যার বিয়োগকে প্রকাশ করতে পারে))

צ1(1*)×([¯¦]1*)×
+צ$1×$2×+$2+

বারবার সংযোজন দ্বারা গুণ করা।

}`÷¦(?=1*÷(¯|¦)(1+)÷)(\2)*1*÷\1\2÷
$1$#3$*

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

((¯)|¦)(1*)
$2$.3

দশমিকের দিকে ফিরে রূপান্তর করুন।


বাহ, এটি - মহাকাব্য। পিপিসিজিতে বৃহত্তম রেটিনা পোস্ট? তবে সাধারণত কোয়াডআর এবং রেটিনা সমাধানগুলি একে অপরের সাথে সাদৃশ্যপূর্ণ। আমি কি অনুপ্রেরণা দিতে পারি?
অ্যাডম

এই লাইনে +`-(([¯¦])1*)(1*)-\2\3-, [¯¦]হয়ে উঠতে পারে¯|¦
ক্রিতিক্সী লিথোস

@ কউসক্যাক তিনবার ঘটেছে বাস্তবে, ধন্যবাদ!
নিল

আপনার একটি মিস হয়েছে ([×÷]);)
ক্রিটসি লিথোস

1
@ জিজ্ঞাসাবাদ আপনি আরও একটি খুঁজে না ভাল, অন্যথায় আমি 4 অতিক্রম করতে হবে ...
নীল

2

পিএইচপি , 116 114 109 বাইট

-5 মার্টিন ইন্ডারকে ধন্যবাদ

for($s=$argv[$o=1];$o!=$s;)$s=preg_replace('#([*+/-])(([\d.]+|(?R))\1(?3))\1#','($2)',$o=$s);eval("echo$s;");

*গুণ এবং /বিভাগের জন্য ব্যবহার করে । নেতিবাচক সংখ্যাগুলি কাজ হয়ে যায় যদিও আমি সুনির্দিষ্ট কোনও চেষ্টা না করেও এটি হয়ে যায়।

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

অবহেলিত এবং ব্যাখ্যা

for($s=$argv[$o=1];   # Initialize with $s = input and $o = 1;
    $o!=$s;)          # While $o != $s
    # Set $o to $s and set $s to be $s after this regex replacement:
    $s=preg_replace('#([*+/-])(([\d.]+|(?R))\1(?3))\1#','($2)',$o=$s);
    # i.e., continue to do this replacement until the result is the same on two consecutive
    # steps (no replacement was made)
# Once $o == $s (i.e. no more replacement can be made), eval the result and print
eval("echo$s;"); 

আমি রেজেক্সকেও ব্যাখ্যা করব কারণ এটি কিছুটা যাদুকর:

([*+/-])(([\d.]+|(?R))\1(?3))\1


([*+/-])

প্রথমত, আমরা চারটি অপারেটরের যেকোনটির সাথে মেলে করতে চাই: *+/-

([\d.]+|(?R))

তারপরে, আমাদের একটি সংখ্যা [\d.]+বা অন্য কোনও বৈধ সর্বজনগ্রাহী এক্সপ্রেশন মেলানো দরকার (?R)

\1

তারপরে, আমরা একই অপারেটরের সাথে মেলে যা শুরুতে ছিল।

(?3)

তারপরে আমরা গ্রুপ 3 এ আমরা একই জিনিসটি করেছি: একটি সংখ্যার সাথে বা একটি সর্বজনীন প্রকাশের সাথে মেলে।

\1

শেষ অবধি, আবার প্রাথমিক অপারেটরের সাথে মেলে।

এর সাথে যা কিছু ম্যাচ প্রতিস্থাপন করা হয় ($2)। এটি পার্শ্ববর্তী অপারেটরগুলির মধ্যে অংশ নেয় এবং এটি বন্ধনীগুলির মধ্যে রাখে, তাই এটি সাধারণ ইনফিক্স নোটেশনের মতো দেখায়।


2

কোয়াডআর , 33 32 27 বাইট

-1 গরু কোয়াক ধন্যবাদ । -5 এরিক দ্য আউটগোল্ফারকে ধন্যবাদ ।

((.)[\d¯\.]+){2}\2
⍎¯11↓⍵M

যুক্তি / পতাকা সহ

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

এটি 40-বাইট ডায়ালগ এপিএল সমাধানের সমান:

'((.)[\d¯\.]+){2}\2'R{⍕⍎1↓¯1↓⍵.Match}⍣≡

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

ব্যাখ্যা

(প্রথমত টেক্সট কোয়াডআরের পরিবর্তে ডায়ালগ এপিএলকে বোঝায়)

(){2}\2 নিম্নলিখিত প্যাটার্নটি দু'বার, এবং পুরো ম্যাচটিও দু'বার:
  (.) কোনও অক্ষর
  [... ]+ নিম্নলিখিত অক্ষরের একটি বা একাধিক সংকলন:
   \dডি আইজিটস,
   ¯ উচ্চ বিয়োগ (নেতিবাচক চিহ্ন)
   \. পিরিয়ড

( ⎕R হয় আর সঙ্গে eplaced :)

( {} নেমস্পেসে প্রয়োগ করা নিম্নলিখিত বেনামী কর্মের ফলাফল ⍵ :)

⍵M ( ⍵.Match) এম আট্চের পাঠ্য
¯1↓ শেষ অক্ষরটি (চিহ্ন + - ×বা ÷)
1↓ ড্রপ করে প্রথম অক্ষর (প্রতীক)
 এপিএল কোড হিসাবে কার্যকর
 (  চালিত স্ট্রিংফাই)

 ( ⍣≡) আর কোনও পরিবর্তন না হওয়া পর্যন্ত প্রতিস্থাপনটি পুনরাবৃত্তি করুন


আমার মনে হয় আপনি ড্রপ করতে পারেন
ক্রিটিক্সী লিথোস

আপনি কিউআরডি সম্পর্কে ঠিক বলেছেন ⎕Rসংখ্যাযুক্ত ডেটাতে কাজ করতে পারে না। ধন্যবাদ।
অ্যাডম


1

হাস্কেল , ১৩২ টি চর

(134 বাইট, কারণ ×এবং ÷ইউটিএফ -8 এ দুটি বাইট নিন)

f y|(n@(_:_),r)<-span(`elem`['.'..'9'])y=(read n,r)
f(c:d)|(l,_:s)<-f d,(m,_:r)<-f s=(o[c]l m,r)
o"+"=(+)
o"-"=(-)
o"×"=(*)
o"÷"=(/)

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

fযতটা ইনপুট পারে সেটিকে পার্স করে এবং ফলাফল দেয় পাশাপাশি অবশিষ্ট স্ট্রিং (যা পরীক্ষার ক্ষেত্রে খালি থাকে)। যদি এটি নিয়ম অনুসারে না হয় তবে আনসারসিয়েবল বাকী স্ট্রিংটি দিয়ে স্ট্রিপ করুন

হাস্কেল , ১৩৯ টি চর

...
g=fst.f

0

পার্ল, 64 53 বাইট

+1জন্য অন্তর্ভুক্ত-p

perl -pe 's%([*-/])(([\d.]+|(?0))\1(?3))\1%($2)%&&redo;$_=eval' <<< "/4/-3-/1/2/-/"

ঘটনাক্রমে এছাড়াও প্রয়োগ করে ,(প্রথম যুক্তি ছুঁড়ে ফেলে) এবং কখনও কখনও .(যুক্তিগুলি একসাথে সংযোজন)। .যদিও এটি পার্সিং পর্যায়ে এবং মূল্যায়ন স্তরে উভয় দশমিক বিন্দুতে হস্তক্ষেপ করে তবে খুব নির্ভরযোগ্য কাজ করে না


0

জাভা 8, 205 200 বাইট

float O(String s){try{return new Float(s);}catch(Exception e){int f=s.charAt(0),i=s.indexOf(f,1);float a=O(s.substring(1,i)),b=O(s.substring(i+1,s.length()-1));return f<43?a*b:f<44?a+b:f<46?a-b:a/b;}}

পোর্ট অফ @Charlie এর সি # উত্তর
-৫ বাইট @ সিলিংক্যাট ধন্যবাদ ।

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

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