गणित कथन को न्यूनतम करना


18

चुनौती

आप कोयोट बीटा नामक एक अद्भुत सेवा के मालिक हैं , जो अपने उपयोगकर्ताओं को इंटरनेट पर भेजे गए गणित के सवालों का जादुई जवाब देता है।

लेकिन यह पता चला है, बैंडविड्थ महंगा है। आपके पास दो विकल्प हैं, या तो एक " कोयोट बीटा प्रो" बनाएं या इसे हल करने का कोई तरीका खोजें। अभी हाल ही में, किसी ने झगड़ा किया (x + 2)। क्या ग्राहक नहीं भेज सकता है x+2, और उपयोगकर्ता को कोई अंतर नहीं दिखाई देगा?

काम

आपका कार्य गणित के भावों को "छोटा" करना है। एक इनपुट अभिव्यक्ति को देखते हुए, आपको व्हाट्सएप और कोष्ठक से छुटकारा पाना चाहिए, जब तक कि यह एक ही इनपुट का न्यूनतम प्रतिनिधित्व न दे। सहयोगी संचालन के आसपास के कोष्ठकों को संरक्षित करने की आवश्यकता नहीं है।

यहां दिए गए केवल ऑपरेटर हैं +, -, *, /, और ^(घातांक), मानक गणितीय संबद्धता और वरीयता के साथ। इनपुट में दिया गया एकमात्र व्हाट्सएप वास्तविक अंतरिक्ष वर्ण होगा।

नमूना इनपुट / आउटपुट

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

स्कोरिंग

इनपुट / आउटपुट किसी भी पसंदीदा विधि का उपयोग कर सकते हैं। बाइट्स में सबसे छोटा कार्यक्रम जीत जाता है।

सटीक बिट्स

एक्सपट्रिएशन सही एसोसिएटिव है और स्टैंडर्ड मैथ प्रीएडेंस (सबसे ज्यादा होने) के बाद भी है। एक मान्य संख्यात्मक शाब्दिक है /[0-9]+/, और एक वैध चर शाब्दिक है /[a-z]+/। एक एकल परिवर्तनीय शाब्दिक एकल मान का प्रतिनिधित्व करता है, तब भी जब इसकी वर्ण लंबाई 1 से अधिक हो।

"साहचर्य संचालन के आसपास के कोष्ठकों को संरक्षित किए जाने की आवश्यकता नहीं है" का अर्थ यह है कि आउटपुट में एक अभिव्यक्ति होनी चाहिए जो समान पार्स ट्री में परिणत होती है, इस अपवाद के साथ कि सहयोगी संचालन को फिर से व्यवस्थित किया जा सकता है।


यह विचार एक न्यूनतम समतुल्य कथन बनाने के लिए है, जिसके परिणामस्वरूप एक ही पार्स ट्री होता है। ऐसा इसलिए है कि जब उपयोगकर्ता कोई क्वेरी करता है तो कोयोट बीटा इसे नेत्रहीन प्रदर्शित कर सकता है।
TND

यदि एक वैध वैरिएबल है /[a-z]+/, तो इसका मतलब है कि इस तरह के बहिष्करण द्वारा गुणा को रोक abदिया जाता है?
जो जेड।

1
आप के 2+(3+4)लिए 2+3+4, सही बदला जाना चाहते हैं ? इससे पार्स ट्री बदल जाता है।
feersum

2
मैं इस दावे के साथ मुद्दा लेता हूं कि x^(y/2)=x^y/2; घातांक एक उच्च आदेश पूर्वता है, एर्गो x^y/2=(x^y)/2,।
कॉनर ओ'ब्रायन

1
Aww man, मैं Prompt X:expr(X)TI-BASIC में सबमिट करने जा रहा था, लेकिन आप इसे सरल नहीं कर सकते :(
DankMemes

जवाबों:


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. एक अनावश्यक चर से छुटकारा पाने के लिए एक स्विच नेस्टेड। इसके अलावा, एक बग को ठीक किया गया जो एंडर्स कसेग द्वारा सूचित कुछ समाधानों को अमान्य कर देगा

पुनश्च: यदि आपके पास कोई टिप है या बग मिला है, तो कृपया मुझे टिप्पणियों में बताएं और मैं इसे ठीक करने का प्रयास करूंगा (मैं आपके नाम के साथ बग फिक्स के बारे में एक नोट जोड़ूंगा;))


अच्छा उत्तर! : डी पर्याप्त जवाब यहां आम तौर पर बेहतर होते हैं यदि आप एक स्पष्टीकरण शामिल करते हैं: पी
बिल्ली

क्या मैं इसे कोड टिप्पणियों के रूप में कर सकता हूं?
अनुगमन

ज़रूर, जो भी काम करता है c:
बिल्ली

तब मैं ऐसा करूँगा! मैं एक सारांश भी जोड़ने की कोशिश करूँगा।
अनुगमन

प्रोग्रामिंग पहेलियाँ और कोड गोल्फ में आपका स्वागत है, वैसे! (हालांकि यह आपका पहला जवाब नहीं है)
बिल्ली

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;
}

इसका कोई पूर्ववर्ती तर्क नहीं है और दिए गए कई परीक्षण मामलों में विफल रहता है।
एंडर्स कासोर्ग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.