Diese Herausforderung aber mit einer besseren Spezifikation.
Spec
Ihr Programm nimmt eine lineare Gleichung, die eine einzelne Variable enthält, x
und gibt den Wert von aus x
.
Eingabe / Analyse
- Die Eingabe enthält nur Zahlen, Operatoren, Klammern (
()
)x
und ein=
Vorzeichen (dh kein Leerzeichen). - Klammern werden immer ausgeglichen sein.
- Es wird immer mindestens 1 geben
x
. Anx
kann eine Zahl vorangestellt werden. - Alle Gleichungen haben genau ein Ergebnis.
Eine Nummer kann folgendermaßen definiert werden. Eine Zahl kann durch den regulären Ausdruck definiert werden: -?(\d+(\.\d+)?|\.\d+)
.
Wenn Sie kein Regex sprechen: Eine Ziffer ist definiert als 0-9
- Es kann ein
-
am Anfang stehen, was negativ bedeutet - Dann kann es einige Ziffern geben. Wenn es sich nicht um Ziffern handelt, wird ein Dezimalpunkt angezeigt
- Wenn ein Dezimalpunkt vorhanden ist, folgt ihm mindestens eine Ziffer
Die größte Zahl / der größte Wert wird durch die Fähigkeiten Ihrer Sprache definiert.
Ein Operator ist einer von:, +-*/
sie werden immer zwischen Zahlen und / oder Klammern angezeigt
Dies bedeutet, dass (5)(5)
der Einfachheit halber keine gültige Eingabe ist.
Klammern enthalten immer einen gültigen Ausdruck (eine gültige Kombination von Zahlen und / oder Operatoren). "Ausgewogene" Klammern sind definiert, da jeder Klammer (
eine Schließung zugeordnet ist)
Auswertung
- Die Reihenfolge der Operationen sollte eingehalten werden und die Prioritäten lauten (von der höchsten zur niedrigsten):
- Klammer (am tiefsten verschachtelt zuerst)
- Multiplikation & Division
- Addition Subtraktion
- Wenn zwei Operatoren mit der gleichen Priorität auftreten, sollten Sie lieber nach links -> rechts gehen
Ausgabe
Sie sollten das Ergebnis auf irgendeine Weise ausgeben. Wenn Sie nicht nur Zahlenergebnisse ausgeben, erläutern Sie in Ihrer Antwort, wie die Ausgabe erfolgt. Ihr Ausgabeformat sollte konsistent sein. Die Ausgabe kann eine Dezimalzahl sein, ist jedoch immer rational. Die Genauigkeit ist auf die Genauigkeit Ihrer Sprache beschränkt. Nur wenn Ihre Sprache keine Gleitkomma-Arithmetik unterstützt, müssen Sie sie nicht unterstützen.
Regeln
- Built-In diese Aufgabe Trivialisierung sind erlaubt aber , müssen Sie deutlich hinzufügen ,
[uses built-in]
eindeutig auf die Header der Antwort. Dies befreit Ihre Antwort vom Gewinn - Ein "Built-In, das diese Aufgabe trivialisiert", ist eines von:
- Etwas, das eine Gleichung aufnimmt und den Wert für eine / die Variable ausgibt
- Etwas, das eine Gleichung völlig vereinfacht
- Verwenden
eval
oder einer verwandten Funktion, um einen wesentlichen Teil des Parsings durchzuführen. Die Verwendung voneval
und verwandte Funktionen sind nicht zulässig, wenn sie zum Lösen von linearen Gleichungen (mit minimaler Änderung der Eingabe) verwendet werden. - Wenn Sie Zweifel haben, fragen Sie einfach in einem Kommentar.
- Eingebaute, die die Gleichung analysieren, sind erlaubt
Beispiele
3+4=x
7
4+x=5
1
3+3*3=x
12
3x-4=7+2x
11
3--1=x
4
3*(2+4x)=7x-4
-2
1.2+2.3x=5.8
2
10=4x
2.5
UNGÜLTIGE Eingänge:
(5)(4)=x no operator between (5) and (4)
5(x+3)=2 no operator 5 and (...)
x=y the only variable is x
4=3 there is no x
x+3=x-7 no solution
x=x infinite solutions
+5=x + is not an unary operator. -5=x would be valid though
1/(x-3)=5 Nonlinear
3/x Nonlinear
quelle
eval
als Trivialisierung der Herausforderung? Würden auch Formennew Function(...)
zählen?Antworten:
JavaScript ES6, 246 Bytes
Es bleibt noch ein bisschen Golf zu spielen, aber es ist zumindest eine Lösung!
Benennen Sie die
n=>{n=n.split("=")...
zu verwendende Funktion .Hyper-ungolfed:
Dies verwendet einen Pivot-Ansatz. (Ich bin mir nicht sicher, ob der Algorithmus so heißt, nur ein Name, den ich erfunden habe.) Zunächst wird erfasst, nach welcher Richtung von Null aus gesucht werden soll (dh auf welche Weise sich die Steigungen der beiden Seiten der Gleichungen schneiden) und sucht den Wert. Sobald ein Punkt mit minimaler Differenz gefunden wurde, wird dieser Punkt erreicht und das Suchinkrement verringert. Dies ergibt schließlich eine so genaue Lösung, wie wir sie brauchen.
quelle
JavaScript (Node.js) ,
10693 ByteProbieren Sie es online!
-13 Bytes dank @tsh
Ungolfed:
Erklärung:
Diese Lösung funktioniert nach Newtons Methode zum Finden von Wurzeln. Der Code subtrahiert die rechte Seite der Gleichung von der linken Seite, so dass , wenn
f(x)=0
,x
wird der Wert gleich , für die wir zu lösen. Wenn wir also die Wurzel dieser neuen Funktion finden, wird dies unser gewünschterx
Wert sein. Dann findet es die Ableitung,f'(x)
indem es die Steigung zwischen zwei Punkten auf der Funktion findet. Dann werden die Werte einfach eingefügt in Newton-Verfahren , die für eine Annäherung der Wurzel heißtx
,x=x-(f(x)/f'(x))
(im Code verwenden wir 0 alsx
Anfangswert). Da dies die Wurzeln findet, findet es unserenx
Wert. Und da die Gleichung garantiert linear ist, ist die Approximation genau.quelle
Mathcad, [verwendet eingebaute]
Mathcad verfügt über zwei integrierte Methoden zum Lösen solcher Gleichungen:
Der symbolische Löser ist sehr zufrieden mit y = x und gibt die Lösung x = y zurück.
Für diejenigen, die mit Mathcad nicht vertraut sind, wird das folgende Bild direkt aus der WYSIWYGish Mathcad 15-Arbeitsmappe entnommen. Wenn Sie die Ausdrücke ändern, in denen sie geschrieben sind, bewertet Mathcad die Antwort neu und aktualisiert die Anzeige entsprechend.
quelle
Axiom, 214 Bytes [verwendet eingebaute]
Bei einem Fehler würde% i zurückgegeben, bei einem anderen Fehlertyp wird die Funktion vom System gestoppt, etwas anderes wie 1-2 scheint nicht in der Sprache zu sein ... test:
quelle