গাণিতিক প্রতিস্থাপন


13

কখনও কখনও একাধিক ইনপুট দিয়ে গণিত সমস্যা চালানো দরকারী useful এই চ্যালেঞ্জের লক্ষ্য হ'ল একটি প্রোগ্রাম তৈরি করা যা এই কাজটি সহজ করে দেয়।

সংখ্যা তৈরির অভিব্যক্তি

আপনাকে অবশ্যই 3 ধরণের অভিব্যক্তি সমর্থন করতে হবে:

  • একক সংখ্যা জেনারেটর: খুব সহজ, কেবল একটি আক্ষরিক সংখ্যা
  • বহু সংখ্যা জেনারেটর: একটি বাচ্চা আরও জটিল। থিসগুলি চারদিকে বর্গাকার বন্ধনী দ্বারা আবদ্ধ ( [])। সংখ্যাগুলি কমা ( ,) দ্বারা প্রকাশিত হয়। উদাহরণ [-1,2,3.26]
  • ব্যাপ্তি জেনারেটর: এই একটিকে কোঁকড়া ধনুর্বন্ধনী ( {}) দ্বারা বেষ্টিত করা হয়েছে । এটিতে কমা দ্বারা আলাদা 3 টি সংখ্যা থাকবে। এই অভিব্যক্তিটির ফর্ম্যাটটি {start,stop,step}startএবং stopঅন্তর্ভুক্ত।

মূল্যায়নের জন্য বিধি

  • আপনাকে অবশ্যই ক্রিয়াকলাপের ক্রম সমর্থন করবে। ( https://en.wikedia.org/wiki/Order_of_operation#Difinition )
  • আপনার প্রথম বন্ধনী সমর্থন করার প্রয়োজন নেই।
  • অভিব্যক্তিতে যে কোনও স্থান ফাঁকা হতে পারে।
  • আপনাকে অবশ্যই ভাসমান পয়েন্ট সংখ্যাগুলি সমর্থন করতে হবে (আপনার ভাষার পূর্বনির্ধারিত সংক্ষিপ্ত বিবরণটি সূক্ষ্ম হয়)।
  • 0ফলাফল দ্বারা বিভাগ NaN(কোনও সংখ্যা নয়)।

আপনার প্রোগ্রামটি অবশ্যই গুণ ( *), বিভাগ ( /), সংযোজন ( +) এবং বিয়োগ ( -) কে সমর্থন করবে।

আউটপুট

আউটপুট প্রতিটি লাইন জেনারেটর সংমিশ্রণ এক। বিন্যাসটি হ'ল এক্সপ্রেশন (এতে প্রকৃত সংখ্যাগুলি প্রতিস্থাপিত হয়) এর পরে সমান চিহ্ন ( =) এবং মূল্যায়নের ফলাফল। জেনারেটরের সমস্ত সংমিশ্রণগুলি আউটপুটে অবশ্যই প্রতিনিধিত্ব করতে হবে।

উদাহরণ

( >>>ইনপুট বোঝায়)

>>>3 * [3,2]
3 * 3 = 9
3 * 2 = 6

>>>{1,2,3}
1 = 1 <-- this is because 1 + 3 > the end

>>>{0,2,1} + {0,1,1}
0 + 0 = 0
1 + 0 = 1
2 + 0 = 2
0 + 1 = 1
1 + 1 = 2
2 + 1 = 3

>>>6/[2,3]
6/2 = 3
6/3 = 2

>>>{1.5,2.5,0.5}
1.5 = 1.5
2 = 2
2.5 = 2.5

>>>3-{6,5,-1}
3-6 = -3
3-5 = -2

>>>5/{-1,1,1}
5/-1 = -5
5/0 = NaN
5/1 = 5

>>>4.4 / [1,2.2] + {0,2,1}
4.4 / 1 + 0 = 4.4
4.4 / 1 + 1 = 5.4
4.4 / 1 + 2 = 6.4
4.4 / 2.2 + 0 = 2
4.4 / 2.2 + 1 = 3
4.4 / 2.2 + 2 = 4

>>> [1,2] / 0 + 5
1 / 0 + 5 = NaN
2 / 0 + 5 = NaN

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

স্যান্ডবক্সে এই পোস্টে আমাকে সহায়তা করার জন্য @ পিটারটেলর এবং @ জোকাভেলকে ধন্যবাদ জানাই


আপনাকে অবশ্যই ভাসমান পয়েন্ট সংখ্যাগুলি সমর্থন করতে হবে (আপনার ভাষার পূর্বনির্ধারিত সংক্ষিপ্ত বিবরণটি সূক্ষ্ম হয়)। আমার ভাষা যদি কেবল পূর্ণসংখ্যার গাণিতিক সমর্থন করে? আমি কি দাবি করতে পারি যে আমার শূন্য দশমিক স্থানের যথার্থতা এফপি রয়েছে?
ডিজিটাল ট্রমা

ইনপুট মিশ্রণ ব্যাপ্তি এবং বহু সংখ্যা হতে পারে?
মালটিসেন

@ ডিজিটাল ট্রুমা আমি এই ভাষাগুলি নিয়ে ভাবি নি .... আমি না বলব।
জে আতকিন

এছাড়াও, x/0NaN এর তাত্ক্ষণিক মূল্যায়নের ফলাফল হয়, বা আমাকে NAN কে একটি মান হিসাবে বিবেচনা করতে হবে?
মালটিসেন

@ মালটিসেন হ্যাঁ, আমি কি একটি উদাহরণ অন্তর্ভুক্ত করব?
জে আতকিন

উত্তর:


4

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

f=x=>(a=0,x=x.replace(/\[.+?]|{.+?}/,r=>([i,l,n]=a=r.slice(1,-1).split`,`,r[0]>"]"&&eval(`for(a=[];n>0?i<=+l:i>=+l;i-=-n)a.push(i)`),"x")),a?a.map(n=>f(x.replace("x",n))).join``:x+` = ${r=eval(x),r<1/0?r:NaN}
`)

ব্যাখ্যা

একটি পুনরাবৃত্ত ফাংশন যা কোনও মাল্টি নাম্বার বা ব্যাপ্তি জেনারেটর না থাকলে বা এতে যদি এই জেনারেটরগুলির মধ্যে একটি থাকে তবে তার দ্বারা উত্পাদিত প্রতিটি সংখ্যার পরিবর্তে জেনারেটরের সাথে নিজেকে কল করে the

0জাভাস্ক্রিপ্ট দ্বারা বিভাজন উত্পাদন করে Infinity, তাই Infinityকেবল সঙ্গে প্রতিস্থাপন করা যেতে পারে NaN

এই পদ্ধতিটি ব্যবহার করে মাল্টি-জেনারেটরগুলি পরীক্ষার ক্ষেত্রে সামনের থেকে পিছনের পরিবর্তে ব্যাক-টু-ফ্রন্ট থেকে পার্স করা হয়। এর অর্থ হ'ল কখনও কখনও আউটপুট এক্সপ্রেশনগুলির ক্রম ভিন্ন হয়।

f=x=>(
  a=0,                                           // initialise a to false
  x=x.replace(/\[.+?]|{.+?}/,r=>(                // find the first multi-generator
    [i,l,n]=                                     // i = start, l = stop, n = step
      a=r.slice(1,-1).split`,`,                  // a = each number of generator
    r[0]>"]"&&                                   // if a range generator was found
      eval(`                                     // use eval to enable for loop here
        for(a=[];n>0?i<=+l:i>=+l;i-=-n)a.push(i) // add each number of the range to a
      `),
    "x"                                          // replace the generator with "x"
  )),
  a?                                             // if a multi-generator was found
    a.map(n=>                                    // for each number n in a
      f(x.replace("x",n))                        // call itself with n inserted
    )
    .join``                                      // combine the output of each result
  :x+` = ${r=eval(x),                            // evaluate the expression
    r<1/0?r:NaN}
`                                                // replace Infinity with NaN
)

পরীক্ষা

ব্রাউজারের সামঞ্জস্যের জন্য টেস্ট ডেস্ট্রাকচারিং অ্যাসাইনমেন্ট ব্যবহার করে না।

f=x=>(a=0,x=x.replace(/\[.+?]|{.+?}/,r=>(a=r.slice(1,-1).split`,`,r[0]>"]"&&eval(`i=a[0],l=a[1],n=a[2];for(a=[];n>0?i<=+l:i>=+l;i-=-n)a.push(i)`),"x")),a?a.map(n=>f(x.replace("x",n))).join``:x+` = ${r=eval(x),r<1/0?r:NaN}
`)
<input type="text" id="input" value="4.4 / [1,2.2] + {0,2,1}" />
<button onclick="result.textContent=f(input.value)">Go</button>
<pre id="result"></pre>


এটি আসলে আমার কল্পনা করা উত্তরের খুব কাছাকাছি।
জে আটকিন

4

হাস্কেল, 474 362 বাইট

ফাংশন এফ ইনপুট হিসাবে একটি স্ট্রিং নেয় এবং ফলাফলগুলি মুদ্রণ করে

g '+'=(+);g '-'=(-);g '*'=(*);g '/'=(\a b->a*b/b/b)
p[]=[]
p(o:x:y)=[(flip(g o)$n,' ':o:' ':show n)|n<-v]:p r where
    [f,e,s]=z;(z,h)=reads('[':y)!!0;(w,m)=reads(x:y)!!0;(v,r)|x=='['=(z,h)|x=='{'=([f,f+s..e],h)|True=([w],m)
h '}'=']';h x=x
d(a,b)=putStrLn.drop 3$foldl(++)""b++" = "++show(foldl(flip($))0a)
f t=mapM_(d.unzip)$sequence$p(filter(/=' ')$'+':map h t)

পরীক্ষা:

main=do
    f "4.4 / [1,2.2] + {0,2,1}"
    putStrLn""
    f "[1,2] / 0 + 5"
    putStrLn""
    f "{0,2,1} + {0,1,1}"

আউটপুট:

4.4 / 1.0 + 0.0 = 4.4
4.4 / 1.0 + 1.0 = 5.4
4.4 / 1.0 + 2.0 = 6.4
4.4 / 2.2 + 0.0 = 2.0
4.4 / 2.2 + 1.0 = 3.0
4.4 / 2.2 + 2.0 = 4.0

1.0 / 0.0 + 5.0 = NaN
2.0 / 0.0 + 5.0 = NaN

0.0 + 0.0 = 0.0
0.0 + 1.0 = 1.0
1.0 + 0.0 = 1.0
1.0 + 1.0 = 2.0
2.0 + 0.0 = 2.0
2.0 + 1.0 = 3.0

2

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

def a(q,d=-1,f='',g=float,h=print):
 if any((c in q)for c in'[]{}'):
  for i,b in enumerate(q):
   if d!=-1:
    if b in'}]':
     e=f.split(",")
     if b=='}':
      r=g(e[0]);s=[]
      while r<=g(e[1]):s.append(str(r));r+=g(e[2])
      e[:]=s[:]
     [a(q[:d]+n+q[i+1:])for n in e];return
    f+=b
   if b in'[{':d=i
 else:
  h(q+" = ",end='')
  try:h(str(eval(q)))
  except:h("NaN")

আপনি নিম্নলিখিত কোড দিয়ে এটি পরীক্ষা করতে পারেন:

tests=['3 * [3,2]', '{1,2,3}', '{0,2,1} + {0,1,1}',
       '6/[2,3]', '{1.5,2.5,0.5}', '3-{6,5,-1}',
       '5/{-1,1,1}', '4.4 / [1,2.2] + {0,2,1}',
       '[1,2] / 0 + 5']

for n in tests:
    print(n)
    a(n)
    print()

এখানে কোডটি নিখরচায় দেওয়া হয়েছে:

def eval_statement(query):
    left_bracket_index = -1
    inside_bracket_content = ''
    if any((bracket in query) for bracket in '[]{}'):
        for i, character in enumerate(query):
            if left_bracket_index != -1:
                if character in '}]':
                    params = inside_bracket_content.split(",")
                    if character == '}':
                        value = float(params[0])
                        values = []
                        while value <= float(params[1]):
                            values.append(str(value))
                            value += float(params[2])
                        params[:] = values[:]
                    for param in params:
                        new_query = query[:left_bracket_index] + param + query[i + 1:]
                        eval_statement(new_query)
                    return
                inside_bracket_content += character
            if character in '[{':
                left_bracket_index = i
    else:
        print(query + " = ", end='')
        try:
            print(str(eval(query)))
        except:
            print("NaN")

এটি কোনও ধরণের বন্ধনীগুলির প্রথম সেট সন্ধান করে এবং তারপরে এটির ভিতরে সমস্ত মানগুলি লুপ করে, বন্ধনী এবং এর বিষয়বস্তুকে মান দিয়ে প্রতিস্থাপন করে এবং পদ্ধতিটি পুনরাবৃত্তভাবে চালনা করে কাজ করে। evalলাইনে কোনও বন্ধনী না থাকলে এটি ব্যবহার করে। NaNব্যতিক্রম চলমান থাকলে এটি ফিরে আসে eval


(কিছুটা দেরিতে) প্রোগ্রামিং ধাঁধা ও কোড গল্ফে আপনাকে স্বাগতম!
জে আতকিন

তোমার দরকার কেন e[:]=s[:]? e[:]=sএকই কাজ করবেন না ?
সাইয়েস

1

জাভা, 874 বাইট

void E(String s)throws Exception{int i=0;String t;List<String[]>z=new ArrayList<>();List<String>x=new ArrayList<>(),y=new ArrayList<>();for(String k:s.split(" "))t+=" "+(k.matches("[0-9]+")?"["+k+"]":k);for(String k:t.split(" "))s+=" "+(k.matches("\\{[^\\}]+\\}")?"["+R(k)+"]":k);for(String k:s.split(" "))t+=" "+(k.matches("\\[[^\\]]+\\]")?"$"+(i+=z.add(k.replaceAll("[\\[\\]]","").split(","))):k);x.add(t.substring(1));while (i-->0){y.clear();for(String e:x)for(String l:z.get(i))y.add(e.replace("$"+i,l));x.clear();x.addAll(y);}for(String e:x)System.out.println(e+"="+new javax.script.ScriptEngineManager().getEngineByName("JavaScript").eval(e).replace("Infinity","NaN"));}
String R(String t){String y="",[]s=t.replaceAll("[\\{\\}]","").split(",");int i=I(s[0]);y+="["+i;while ((i+=I(s[2]))<=I(s[1]))y+=","+i;y+="]";return y;}
int I(String t){return Integer.parseInt(t);}

বিস্তারিত এখানে চেষ্টা করুন

import java.util.*;
import java.lang.*;
import java.io.*;

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;

class Ideone
{
    // single : x -> [x]
    public static String expandSingle (String input)
    {
        String out = "";
        for (String str : input.split(" "))
        {
            out += " ";
            if(str.matches("[0-9]+"))
            {
                out += "["+str+"]";
            }
            else
            {
                out += str;
            }
        }
        return out.substring(1);
    }

    // range : {start,end,step} -> [x,..,y]
    public static String expandRange (String input)
    {
        String out = "";
        int a,b,c;
        int i=0;
        for (String str : input.split(" "))
        {
            out += " ";
            if(str.matches("\\{[0-9]+,[0-9]+,[0-9]+\\}"))
            {
                str = str.replaceAll("[\\{\\}]","");
                a = Integer.parseInt(str.split(",")[0]);
                b = Integer.parseInt(str.split(",")[1]);
                c = Integer.parseInt(str.split(",")[2]);

                out += "["+a;
                while ((a+=c) <= b) out += ","+a;
                out += "]";
            }
            else
            {
                out += str;
            }
        }
        return out.substring(1);
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        String input = "3 * [3,2] + {0,2,1}";
        System.out.println(" input = "+input);
        input = expandSingle(input);
        input = expandRange(input);
        System.out.println(" expand = "+input);
        evaluate(input);
    }

    public static void evaluate (String input) throws java.lang.Exception
    {
        int i = 0;
        String t = "";
        ArrayList<String[]> set = new ArrayList<String[]>();
        ArrayList<String> in = new ArrayList<String>();
        ArrayList<String> out = new ArrayList<String>();

        // map sets
        for (String str : input.split(" "))
        {
            t += " ";
            if(str.matches("\\[.+\\]"))
            {
                str = str.replaceAll("[\\[\\]]","");
                set.add(str.split(","));
                t+= "$"+i;
                i++;
            }
            else t+=str;
        }
        in.add(t.substring(1));

        // generate expressions
        while (i-->0)
        {
            out.clear();
            for (String exp : in)
            {
                for (String sub : set.get(i))
                {
                    out.add(exp.replace("$"+i,sub));
                }
            }
            in.clear();
            in.addAll(out);
        }

        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName("JavaScript");

        // print expressions
        for (String exp : in)
        {
            System.out.println(" "+exp+" = "+engine.eval(exp).replace("Infinity","NaN"));
        }
    }
}

1

ডায়ালগ এপিএল , 164 বাইট

এই উত্তরটি আপডেট হওয়া প্রয়োজনীয়তা অনুসরণ করে না এবং তাই এটি প্রতিদ্বন্দ্বী is

{n←⊂'NaN'
R←{+\b,s/⍨⌊((2⊃⍵)-b←⊃⍵)÷s←⊃⌽⍵}
D←{0::n⋄⍺×÷⍵}
↑(∊¨(,⍎'[-+×D]'⎕R','⊢e),¨¨⊂('[-+×÷]'⎕S'\0'⊢⍵),⊂'='),¨,⍎e←'{' '}' '\[' ']' '÷' '[-+×]'⎕R'(R ' ')' '(' ')' '∘.D ' '∘.{0::n⋄⍺\0⍵}'⊢⍵}

এটি প্রদত্ত এক্সপ্রেশনটিকে সংশ্লিষ্ট এপিএলে পরিবর্তনের জন্য (এবং সমস্ত অপারেটরগুলি প্রয়োগ করতে সংশোধিত হয় NaN) এবং অপারেটরগুলি নিষ্কাশনের জন্য ব্যবহার করে ge এটি সমস্ত অপারেটরকে কেটেনেশন সহ প্রতিস্থাপন করে এবং চূড়ান্ত ইনপুট নম্বরগুলি পেতে এক্সপ্রেশনটি চালায়। এটি চূড়ান্ত আউটপুট পেতে এটি সব একসাথে বয়ন।

এপিএলের মূল্যায়নের ক্রম সংরক্ষণ করে (ডান থেকে বামে কঠোর)

প্রথম বন্ধনী সঠিকভাবে পরিচালনা করে।

পরীক্ষাগুলি ক্ষেত্রে (গণিতের মতো মৃত্যুদন্ড কার্যকর করার জন্য যুক্ত করা প্রথম বন্ধনীর সাথে):

      f '3 × [3,2]'
3 × 3 = 9
3 × 2 = 6
      f '{1,2,3}'
1 = 1
      f '{0,2,1} + {0,1,1}'
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 2
2 + 0 = 2
2 + 1 = 3
      f '6÷[2,3]'
6 ÷ 2 = 3
6 ÷ 3 = 2
      f '{1.5,2.5,0.5}'
1.5 = 1.5
2   = 2  
2.5 = 2.5
      f '3-{6,5,¯1}'
3 - 6 = ¯3
3 - 5 = ¯2
      f '5÷{¯1,1,1}'
5 ÷ ¯1 =  ¯5 
5 ÷  0 = NaN 
5 ÷  1 =   5 
      f '(4.4 ÷ [1,2.2]) + {0,2,1}'
4.4 ÷ 1   + 0 = 4.4
4.4 ÷ 1   + 1 = 5.4
4.4 ÷ 1   + 2 = 6.4
4.4 ÷ 2.2 + 0 = 2  
4.4 ÷ 2.2 + 1 = 3  
4.4 ÷ 2.2 + 2 = 4  
      f '([1,2] ÷ 0) + 5'
1 ÷ 0 + 5 = NaN 
2 ÷ 0 + 5 = NaN 

এটি কি (অশোধিত) পরীক্ষার কেস পাস করে? যদি তাই হয় তবে ঠিক আছে।
জে আতকিন

@ জ্যাটিন এখনই দেখুন।
অ্যাডাম

না, যতটা আমি বুঝতে পেরেছি তত্ক্ষণাত ক্রমের ক্রম সমর্থন করে না।
জে আতকিন

@ জ্যাটিন "আপনাকে অবশ্যই ক্রিয়াকলাপের ক্রম সমর্থন করবে support" আপনি উল্লেখ করেছেন কখনও যা অর্ডার। এই করে সমর্থন ব্যবহৃত ভাষা ক্রম। প্রতিটি ভাষার (উচ্চ-বিদ্যালয়ের গণিত অন্তর্ভুক্ত) একটি স্বেচ্ছাসেবী (তবে দুর্ভাগ্যক্রমে কখনও কখনও দ্বিধাহীন) অগ্রাধিকার নিয়মও রয়েছে। এপিএলের রুলসেটটি দ্ব্যর্থহীন।
অ্যাডম

1
গণিতের মানটি হ'ল আমি যা বোঝাতে চাইছিলাম : en.wikedia.org/wiki/Order_of_operation#Difinition । আমি এটি এখনই পোস্টে যুক্ত করব
জে আত্কিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.