Matematik ifadelerini küçültme


18

Meydan okuma

Coyote Beta adında muhteşem bir hizmetin sahibisinizKullanıcılarının internet üzerinden gönderdiği matematik sorularını sihirli bir şekilde cevaplayan .

Ama ortaya çıkıyor, bant genişliği pahalı. İki seçeneğiniz var, ya bir " Coyote Beta Pro" oluşturun ya da bunu çözmenin bir yolunu bulun. Yakın zamanda birisi sorguladı (x + 2). İstemci gönderemedi x+2ve kullanıcı hiçbir fark görmedi mi?

Görev

Senin görevin matematik ifadelerini "minimize" etmektir. Bir girdi ifadesi verildiğinde, aynı girdinin en az gösterimini sağlayana kadar boşluk ve parantezlerden kurtulmanız gerekir. İlişkisel işlemler etrafındaki parantezlerin korunması gerekmez.

Burada verilen tek operatörleri +, -, *, /, ve ^standart matematiksel çağrışımsal ve öncelik ile (üs). Girişte verilen tek boşluk gerçek boşluk karakterleri olacaktır.

Örnek Giriş / Çıkış

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

puanlama

Giriş / çıkış tercih edilen herhangi bir yöntemi kullanabilir. Bayttaki en küçük program kazanır.

Kesin bitler

Üstelleştirme doğru ilişkiseldir ve aynı zamanda (en yüksek olan) standart matematik önceliğini takip eder. Geçerli bir sayısal değişmezdir /[0-9]+/ve geçerli bir değişken değişmezdir /[a-z]+/. Tek bir değişken değişmez değeri, karakter uzunluğu 1'den uzun olsa bile tek bir değeri temsil eder.

"İlişkilendirilebilir işlemlerin etrafındaki parantezlerin korunması gerekmez" ile kastedilen, çıktının ilişkisel işlemlerin yeniden düzenlenebilmesi dışında, özdeş ayrıştırma ağacıyla sonuçlanan bir ifadeden oluşmasıdır.


Fikir, aynı ayrıştırma ağacıyla sonuçlanan minimal eşdeğer bir ifade oluşturmaktır. Böylece Coyote Beta kullanıcı bir sorgu yaptığında görsel olarak görüntüleyebilir.
TND

Geçerli bir değişken ise /[a-z]+/, bunun gibi yan yana yerleştirme ile çarpmaya abizin verilmiyor mu?
Joe Z.

1
Olarak 2+(3+4)değiştirilmek istiyorsun 2+3+4, değil mi? Bu ayrıştırma ağacını değiştirir.
feersum

2
Şu iddia ile ilgili olarak x^(y/2)=x^y/2; üslerin üst sıralarda önceliği vardır x^y/2=(x^y)/2,.
Conor O'Brien

1
Aww adam, ben Prompt X:expr(X)TI-BASIC gönderecekti ama basitleştiremezsiniz :(
DankMemes

Yanıtlar:


1

C #, 523 519 504 bayt

Nasıl çalıştığını görmek için kod içindeki yorumları kontrol edin!


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

Yan notlar

  1. Bazı yazım hataları düzeltildi ve bazı değişkenler yeniden adlandırıldı.
  2. Gereksiz bir değişkenden kurtulmak için bir anahtar iç içe. Ayrıca, Anders Kaseorg tarafından bildirilen, bazı çözümleri geçersiz kılacak bir hata düzeltildi .

Not: Bir ipucunuz varsa veya bir hata bulduysanız, lütfen yorumlarda bana bildirin ve düzeltmeye çalışacağım (daha sonra adınızla ilgili hata düzeltmesi hakkında bir not ekleyeceğim;))


Güzel cevap! : D bir açıklama eklerseniz, burada önemli cevaplar genellikle daha iyi alınır: P
cat

Kod yorumları şeklinde yapabilir miyim?
otomat

Tabii, ne olursa olsun c:
kedi

O zaman ben yaparım! Ayrıca bir yere bir özet eklemeye çalışacağım.
otomat

Bu arada, Programlama Bulmacaları ve Code Golf'e hoş geldiniz! (ilk cevabınız olmasa da)
kedi

0

C ++, 284 bayt

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

Bunun herhangi bir öncelik mantığı yoktur ve verilen test durumlarının çoğunda başarısız olur.
Anders Kaseorg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.