গণিতের বিবৃতি মাইন করা হচ্ছে


18

চ্যালেঞ্জ

আপনি কোয়েট বিটা নামে একটি আশ্চর্যজনক পরিষেবাটির মালিক , যা ব্যবহারকারীরা ইন্টারনেটে তার কাছে পাঠানো গণিত প্রশ্নের জাদুর উত্তর দেয়।

তবে দেখা যাচ্ছে, ব্যান্ডউইথ ব্যয়বহুল। আপনার দুটি পছন্দ আছে, হয় একটি " কোयोোট বিটা প্রো" তৈরি করুন বা এটি সমাধানের জন্য কোনও উপায় সন্ধান করুন। সম্প্রতি, কেউ জিজ্ঞাসা করেছে (x + 2)। ক্লায়েন্ট প্রেরণ করতে পারে না x+2, এবং ব্যবহারকারী কোনও পার্থক্য দেখতে পাবে না?

কাজটি

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

এখানে দেওয়া শুধুমাত্র অপারেটার হয় +, -, *, /, এবং ^(exponentiation), মান গাণিতিক associativity এবং প্রাধান্য দিয়ে। ইনপুটটিতে প্রদত্ত একমাত্র শ্বেতস্থানটি আসল স্থানের অক্ষর হবে।

নমুনা ইনপুট / আউটপুট

Input       | Output
------------|--------------
(2+x) + 3   | 2+x+3
((4+5))*x   | (4+5)*x
z^(x+42)    | z^(x+42)
x - ((y)+2) | x-(y+2)
(z - y) - x | z-y-x
x^(y^2)     | x^y^2
x^2 / z     | x^2/z
- (x + 5)+3 | -(x+5)+3

স্কোরিং

ইনপুট / আউটপুট যে কোনও পছন্দসই পদ্ধতি ব্যবহার করতে পারে। বাইটের মধ্যে ক্ষুদ্রতম প্রোগ্রামটি জিতল।

ঠিক বিট

Exponentiation সঠিক সাহচর্যমূলক এবং মান গণিতের অগ্রাধিকার অনুসরণ করে (সর্বোচ্চ হচ্ছে) being একটি বৈধ সংখ্যাগত আক্ষরিক হয় /[0-9]+/, এবং একটি বৈধ পরিবর্তনশীল আক্ষরিক হয় /[a-z]+/। অক্ষরের দৈর্ঘ্য 1-এর বেশি হওয়া সত্ত্বেও একটি একক ভেরিয়েবল আক্ষরিক একটি একক মানকে উপস্থাপন করে।

"সহযোগী ক্রিয়াকলাপগুলির আশেপাশের প্রথম বন্ধনীগুলি সংরক্ষণ করা দরকার না" এর অর্থ যা আউটপুটটিতে এমন একটি অভিব্যক্তি থাকা উচিত যা ফলস্বরূপ একটি অভিন্ন গাছের ফলস্বরূপ, সংযোজনীয় ক্রিয়াকলাপগুলি পুনরায় সাজানো যেতে পারে exception


ধারণাটি হ'ল ন্যূনতম সমতুল্য বক্তব্য তৈরি করা যাতে একই পার্স গাছের ফলাফল হয়। এটি এমনটি যাতে ব্যবহারকারী কোনও জিজ্ঞাসা করার সময় কোয়েট বিটা দৃশ্যত এটি প্রদর্শন করতে পারে।
TND

যদি কোনও বৈধ পরিবর্তনশীল হয় তবে এর /[a-z]+/অর্থ হল যে জংশন পজিশনের দ্বারা গুণনটি abনিষিদ্ধ করা হয়েছে?
জো জেড।

1
আপনি ঠিক 2+(3+4)আছে 2+3+4, পরিবর্তন করতে চান ? এটি পার্স গাছ পরিবর্তন করে।
feersum

2
আমি দাবি নিয়ে ইস্যু গ্রহণ করি x^(y/2)=x^y/2; exponentiation একটি উচ্চতর অর্ডার অগ্রাধিকার আছে, আগে x^y/2=(x^y)/2,।
কনর ও'ব্রায়েন

1
ওহ মানুষ, আমি Prompt X:expr(X)টিআই-বেসিক জমা দিতে যাচ্ছিলাম তবে আপনি সহজ করতে পারবেন না :(
ড্যাঙ্কমিমেস

উত্তর:


1

সি #, 523 519 504 বাইট

এটি কীভাবে কাজ করে তা দেখার জন্য কোড-কোড মন্তব্যগুলি দেখুন!


Golfed

using System;using System.Collections.Generic;namespace n{class p{static void Main(string[]a){foreach(String s in a){String r=s.Replace(" ","");List<int>l=new List<int>();for(int i=0;i<r.Length;i++){if(r[i]=='('){l.Add(i);continue;}if(r[i]==')'){switch(r[Math.Max(l[l.Count-1]-1,0)]){case'+':case'(':switch(r[Math.Min(i+1,r.Length-1)]){case'+':case'-':case')':r=r.Remove(Math.Max(l[l.Count-1],0),1);r=r.Remove(Math.Min(i,r.Length)-1,1);i-=2;break;}break;}l.RemoveAt(l.Count-1);}}Console.WriteLine(r);}}}}

Ungolfed

using System;
using System.Collections.Generic;

namespace n {
    class p {
        static void Main( string[] a ) {
            // Loop every String given for the program
            foreach (String s in a) {
                // Get rid of the spaces
                String r = s.Replace( " ", "" );

                // A little helper that will have the indexes of the '('
                List<int> l = new List<int>();

                // Begin the optimizatio process
                for (int i = 0; i < r.Length; i++) {
                    // If char is an '(', add the index to the helper list and continue
                    if (r[ i ] == '(') {
                        l.Add( i );
                        continue;
                    }

                    // If the char is an ')', validate the group
                    if (r[ i ] == ')') {
                        // If the char before the last '(' is an '+' or '(' ...
                        switch (r[ Math.Max( l[ l.Count - 1 ] - 1, 0 ) ]) {
                            case '+':
                            case '(':
                                // ... and the char after the ')' we're checking now is an '+', '-' or ')' ...
                                switch (r[ Math.Min( i + 1, r.Length - 1 ) ]) {
                                    case '+':
                                    case '-':
                                    case ')':
                                        // Remove the '()' since they're most likely desnecessary.
                                        r = r.Remove( Math.Max( l[ l.Count - 1 ], 0 ), 1 );
                                        r = r.Remove( Math.Min( i, r.Length ) - 1, 1 );

                                        // Go two steps back in the loop since we removed 2 chars from the String,
                                        //   otherwise we would miss some invalid inputs
                                        i -= 2;
                                        break;
                                }

                                break;
                        }

                        // Remove the last inserted index of '(' from the list,
                        //   since we matched an ')' for it.
                        l.RemoveAt( l.Count - 1 );
                    }
                }

                // Print the result
                Console.WriteLine( r );
            }
        }
    }
}

পার্শ্ব নোট

  1. কিছু টাইপস স্থির করে কিছু নাম পরিবর্তন করে।
  2. অপ্রয়োজনীয় ভেরিয়েবল থেকে মুক্তি পেতে একটি স্যুইচ নেস্ট করে। এছাড়াও, একটি ত্রুটি স্থির করে যা কিছু সমাধান অবৈধভাবে রেন্ডার করে, এন্ডারস ক্যাসের্গ দ্বারা রিপোর্ট করা ।

পিএস: আপনার কাছে যদি কোনও টিপ থাকে বা কোনও বাগ পাওয়া যায় তবে দয়া করে আমাকে মন্তব্যগুলিতে জানান এবং আমি এটি ঠিক করার চেষ্টা করব (এর পরে আমি আপনার নামের সাথে বাগ ফিক্স সম্পর্কে একটি নোট যুক্ত করব;))


চমৎকার উত্তর! : ডি যথাযথ উত্তরগুলি এখানে সাধারণত আরও ভালভাবে পাওয়া যায় যদি আপনি কোনও ব্যাখ্যা অন্তর্ভুক্ত করেন: পি
বিড়াল

আমি কি কোড মন্তব্য আকারে এটি করতে পারি?
auhmaan

অবশ্যই, যা কাজ করে সি:
বিড়াল

তাহলে আমি তা করবো! আমি কোথাও একটি সংক্ষিপ্ত যোগ করার চেষ্টা করব।
ahhmaan

প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ স্বাগতম! (যদিও এটি আপনার প্রথম উত্তর নয়)
বিড়াল

0

সি ++, 284 বাইট

Golfed

#include<iostream>
#include<algorithm>
int main(){std::string e;std::getline(std::cin,e);e.erase(std::remove_if(e.begin(),e.end(),isspace),e.end());for(int x=0;x<e.length();x++){if(e[x]=='('&&e[x+1]=='('){e.erase(x,1);}if(e[x]==')'&&e[x+1]==')'){e.erase(x,1);}}std::cout<<e;return 0;}

Ungolfed

#include<iostream>
#include<algorithm>

int main()
{
    std::string e;
    std::getline(std::cin, e);
    e.erase(std::remove_if(e.begin(), e.end(), isspace), e.end());
    for(int x = 0; x < e.length(); x++) {
        if (e[x] == '(' && e[x+1] == '('){
            e.erase(x, 1);
        }
        if (e[x] == ')' && e[x+1] == ')'){
            e.erase(x, 1);
        }
    }
    std::cout<<e;
    return 0;
}

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