Ce défi mais avec une meilleure spécification.
Spec
Votre programme prendra une équation linéaire contenant une seule variable x
et affichera la valeur de x
.
Entrée / analyse
- L'entrée ne contiendra que des nombres, des opérateurs, des parenthèses (
()
)x
et un=
signe (cela signifie qu'il n'y a pas d'espaces). - Les parenthèses seront toujours équilibrées.
- Il y en aura toujours au moins 1
x
. Unx
peut être précédé d'un nombre. - Toutes les équations auront exactement un résultat.
Un nombre peut être défini en suivant ces étapes. Un certain nombre peut être défini par l'expression rationnelle: -?(\d+(\.\d+)?|\.\d+)
.
Si vous ne parlez pas d'expression régulière: un chiffre est défini comme 0-9
- Il peut y avoir
-
au début un signe négatif - Ensuite, il peut y avoir quelques chiffres. S'il n'y a pas de chiffres, il y aura un point décimal
- S'il existe un point décimal, au moins un chiffre le suivra
Le plus grand nombre / valeur sera défini par les capacités de votre langue.
Un opérateur est l'un des:, +-*/
ils apparaîtront toujours entre les nombres et ou entre parenthèses
cela signifie que ce (5)(5)
n'est pas une entrée valide pour des raisons de simplicité.
Les parenthèses contiendront toujours une expression valide (une combinaison valide de nombres et / ou d'opérateurs) à l'intérieur. La parenthèse "équilibrée" est définie comme chaque (
aura une fermeture associée)
Évaluation
- L'ordre des opérations doit être suivi et les priorités sont (du plus élevé au plus bas):
- Parenthèses (les plus profondément imbriquées en premier)
- Multiplication et division
- Addition soustraction
- Si deux opérateurs avec la même priorité se sont produits, vous devriez préférer aller à gauche -> à droite
Production
Vous devez sortir le résultat d'une manière ou d'une autre. Si vous ne sortez pas simplement le résultat numérique, clarifiez dans votre réponse comment la sortie est sortie. Votre format de sortie doit être cohérent. La sortie peut être une décimale, mais elle sera toujours rationnelle, la précision est limitée à la précision de votre langue. Seulement si votre langue ne prend pas en charge l'arithmétique à virgule flottante, vous n'avez pas besoin de la prendre en charge.
Règles
- Les fonctions intégrées banalisant cette tâche sont autorisées, mais vous devez clairement ajouter
[uses built-in]
clairement à l'en-tête de la réponse. Cela exempte votre réponse de gagner - Un "Built-ins banalisant cette tâche" est l'un des:
- Quelque chose qui prend une équation et génère la valeur pour une / la variable
- Quelque chose qui simplifiera complètement une équation
- Utiliser
eval
ou une fonction associée pour effectuer une quantité importante d'analyse. L'utilisationeval
et les fonctions associées sont interdites si elles sont utilisées (avec une modification minimale de l'entrée) pour résoudre des équations linéaires. - En cas de doute, il suffit de demander dans un commentaire.
- Les éléments intégrés qui analysent l'équation sont autorisés
Exemples
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
Entrées non valides :
(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
la source
eval
compte pour banaliser le défi? En outre, les formes denew Function(...)
comptage seraient- ellesRéponses:
JavaScript ES6, 246 octets
Encore du golf à faire, mais au moins c'est une solution!
Nommez la fonction
n=>{n=n.split("=")...
pour l'utiliser.Hyper-non golfé:
Cela utilise une approche pivot. (Je ne sais pas si c'est ainsi que s'appelle l'algorithme, juste un nom que j'ai inventé.) Il recueille d'abord la direction à rechercher à partir de zéro (c'est-à-dire, de quelle manière les pentes des deux côtés des équations vont se croiser) et recherche la valeur. Une fois qu'il trouve un point de différence minimale, il va à ce point et diminue l'incrément de recherche. Cela donne finalement aussi précis d'une solution dont nous avons besoin.
la source
JavaScript (Node.js) ,
10693 octetsEssayez-le en ligne!
-13 octets grâce à @tsh
Non golfé:
Explication:
Cette solution fonctionne selon la méthode de Newton pour trouver des racines. Le code soustrait le côté droit de l'équation du côté gauche, de telle sorte que, quand
f(x)=0
,x
sera égal à la valeur pour laquelle nous résolvons. Par conséquent, lorsque nous trouverons la racine de cette nouvelle fonction, ce sera notrex
valeur souhaitée . Il trouve ensuite la dérivéef'(x)
en trouvant la pente entre deux points sur la fonction. Ensuite, les valeurs sont simplement insérées dans la méthode de Newton qui indique pour une approximation de la racinex
,x=x-(f(x)/f'(x))
(dans le code, nous utilisons 0 commex
valeur initiale ). Puisque cela trouve ses racines, il trouve notrex
valeur. Et puisque l'équation est garantie d'être linéaire, l'approximation sera exacte.la source
Mathcad, [utilise intégré]
Mathcad a deux méthodes intégrées pour résoudre de telles équations:
Le solveur symbolique est assez satisfait de y = x et renvoie la solution x = y.
Pour ceux qui ne connaissent pas Mathcad, l'image ci-dessous est prise directement à partir du classeur WYSIWYGish Mathcad 15. Si vous modifiez l'une des expressions où elles sont écrites, Mathcad réévaluera sa réponse et mettra à jour l'affichage en conséquence.
la source
Axiom, 214 octets [utilise intégré]
Pour une erreur qui retournerait% i, pour un autre type d'erreur, la fonction est arrêtée par le système, autre chose comme 1--2 semble hors de la langue ... test:
la source