Problem
Ich habe ein GROSSARTIGES neues Programm, das die Art und Weise verändern wird, wie wir über Mathematik im Computer denken, algebraische Funktionen aufnehmen und ERSTAUNLICHE Dinge damit machen! Das einzige Problem ist, dass ich nur bestimmte Algebra analysieren kann, sonst faltet sich das Universum in sich zusammen, was schlecht ist. Glücklicherweise brauche ich nur ein paar grundlegende Operationen in der Eingabe dieses erstaunlichen neuen Programms, aber ich brauche es immer noch erweitert!
Regeln
Eine Antwort muss die folgenden Ausdrücke vereinfachen können
2+2
sollte auf reduzieren4
(5+x)+6
sollte auf reduzierenx+11
(x+2)^2
sollte auf reduzierenx^2+4*x+4
(x-5)*(3+7*x)
sollte auf reduzieren7*x^2-32*x-15
5*x+9*x
sollte auf reduzieren14*x
(2*x^2)*x^3
sollte auf reduzieren2*x^5
Antworten müssen in der Lage sein, Klammern VOLLSTÄNDIG zu entfernen, was bedeutet, dass die gesamte Verteilung stattfinden muss.
Answers sollte in der Lage sein, alle folgenden Operatoren und Standard-Token zu verarbeiten:
+
(Die Additionsfunktion)-
(Die Subtraktionsfunktion)*
(Die Multiplikationsfunktion)(
(Die linke Klammer zur Angabe einer Gruppe))
(Die rechte Klammer gibt das Ende der zuletzt gestarteten Gruppe an.)x
(Die Standardvariable)[0-9]+
(wörtliche nichtnegative Zahlen)
Die Antworten müssen mindestens quadrieren können, wobei die Notation expr ^ 2 einschließlich (expr) ^ 2 rekursiv verwendet wird, da (expr) selbst ein Ausdruck ist;)
Eine Lösung muss in einer Standard-Infix-Notation vorliegen, kein RPN-Unsinn!
Keine Bibliotheksfunktionen wie Mathematica
Simplify
erledigen dies für Sie.Die Lösung sollte eine Funktion sein, die ein einzelnes Argument aufnimmt und die erweiterte Version zurückgibt
Da dies Code-Golf ist, gewinnt die Antwort mit den wenigsten (Schlüssel-) Schlägen, 1 Woche nach OP.
Anmerkungen
Natürlich gibt es in dieser Welt der Mathematik keine Räume! Nur Klammern.
Es ist also keine Division erforderlich, um vor dem Factoring zu sparen
Es gilt die Standardreihenfolge.
Ich bin mir bewusst , dass einige , was ich frage Vereinfachung ist (zB 2+2=4
) , wo andere Teile eigentlich das Gegenteil sind, wie zum Beispiel den Ausbau (x+1)^2
zu sein x^2+2x+1
. Dies ist beabsichtigt. :) :)
-25 Striche für eine Lösung, die (Ausdruck) ^ n anstelle von nur (Ausdruck) ^ 2 ausführen kann
-15 Striche für eine Lösung, die in der Lage ist, nebeneinander stehende Multiplikationen zu bewerten, z. B. 4x+5x
== 9x
oder 4(x+1)
=4x+4
-5 Striche für eine Lösung, die mehrere Variablen verarbeiten kann (Eine Variable ist genau ein Kleinbuchstaben)
-5 Striche für eine Lösung, die führende Nullen entfernen kann ( 007
nur 7
[Nicht heute, Bond!] [Herrgott, jetzt habe ich das Gefühl, ich schreibe Lisp])
Antworten:
J - 350 Zeichen - 25 = 325 Punkte
Vergib mir, Roger Hui, denn ich habe gesündigt.
Die obige Monstrosität definiert eine Anzahl von Variablen, von denen die Variable
f
eine Funktion ist, die die Einschränkungen in der obigen Frage erfüllt. Ich beanspruche den "Ausdruck" -Bonus für 25 Punkte.Hier ist der Golf in Aktion bei der J REPL.
Hier ist der Kern dessen, was los ist.
'()'...@([-.~;@]<@(p^:(1<#));.1~1,0=2*/\[:+/\(*0,}:@)1 _1 0{~i.)&;:
- Zerlegen Sie den Ausdruck rekursiv anhand seiner in Klammern gesetzten Unterausdrücke und werten Sie sie (das...
unten zu beschreibende Bit) aus, sobald sie fertig sind.;:
führt die Tokenisierung durch.(([^:(''-:])". ::])&.>)
- Atome auswerten. Wenn das Atom numerisch ist, wird es in eine skalare Zahl umgewandelt. Wenn das Atom ein Operator ist, bleibt es wie es ist. Wenn das Atom die Variable istx
, wird es in den Vektor umgewandelt0 1
. (Deshalb definieren wirx=:0 1
zu Beginn.) Im Allgemeinen speichern wir das Polynoma*x^n + b*x^(n-1) + ... + c*x + d
alsn+1
-item-Listed c ... b a
.e=:2 :'(<@; ::({:u/&.>{.)/.~i.@#([->+>:){.@i.&(<,v))^:_'
- Diese merkwürdige Konjunktion nimmt links ein Verb und rechts ein Zeichen. Es findet die erste Instanz dieses Zeichens in seiner tokenisierten, parenlosen Eingabe und wertet sie mit den Argumenten um sie herum aus und wiederholt sie, bis keine solchen Zeichen mehr zu finden sind. Daher vereinfachen wir den Ausdruck iterativ, wobei die Reihenfolge der Operationen durch die Reihenfolge der Anwendung von gesteuert wirde
.rplc
ist eine Standardbibliotheksfunktion zum Ersetzen von Teilzeichenfolgen. Wir können weitere drei Zeichen speichern, wenn wir die Begriffe mit dem niedrigsten Grad anstelle der höchsten zuerst setzen dürfen, indem wir die entfernen@|.
.Ich bin mir ehrlich gesagt nicht sicher, ob ich noch mehr Charaktere aus diesem Golf herausholen kann. Ich kann mir keinen anderen Ansatz vorstellen, der kein ähnliches Maß an Überentwicklung erfordert, aber das bedeutet nicht, dass es keinen gibt. Auf jeden Fall bin ich mir ziemlich sicher, dass ich alle offensichtlichen Charaktere aus dieser Version herausgepresst habe.
quelle
-
Token nur als Subtraktionsfunktion notiert wird. :)(2*x+3)^(2+3)*2^3
sollte geben256x^5+1920x^4+5760x^3+8640x^2+6480x+1944
oder mir fehlt etwas?JavaScript (EcmaScript 6) 698 (748-50 Bonus)
725 780 1951Golfen. Aber ich bin stolz, dass es funktioniert.(Edit: Bugfix, Probleme mit Klammern und Minus)
(Edit2: mehr Golf gespielt, Fehler in der Ausgabe
behoben ) (Edit3: noch einmal Golf gespielt, letztes Mal verspreche ich)
Kommentar
Grundsätzlich ist die Funktion X ein Infix-Rechner, der mit wörtlichen Polynomen arbeitet.
Jedes Polynom wird als js-Objekt gespeichert, wobei der Schlüssel der Term (x ^ 3y ^ 2) und der Wert der numerische Koeffizient ist. Funktion A, M und E sind Addition, Multiplikation und Exponent.
Golfed Code
(Es kann wahrscheinlich nicht mehr Golf gespielt werden ...) Hinweis: Für die Lesbarkeit (ehm ...) wurden keine Zeilenumbrüche berücksichtigt
Test In FireFox Konsole
Ausgabe
Boni
Ungolfed Code
quelle
for(i1,i2,i3; c1,c2; s1,s2,s3)
. Ich habe nur ein Semikolon in Golf Colde, um eine Anweisung in einer for (Funktion O) zu schließen. Warum Kommas? Zwei Staubblätter müssen mit {} gruppiert werden, während zwei oder mehr Ausdrücke einfach aufgelistet werden können.Mathematica: 56 - 25 - 15 - 5 - 5 = 6
Natürlich fungiert keine Bibliothek als
Expand
oderDistribute
, nur das Ersetzen von Mustern. Mathematica macht fast alles für uns (hax!), Was bleibt, sind nur Regeln für die Verteilung und Leistungserweiterung. Die einzigen nicht trivialen Beispiele sind daher(x-5)*(3+7*x)
und(x+2)^2
.Beispiele
quelle