Évaluez une expression omnifix donnée.
Omnifix est comme la notation infixe des mathématiques normales, mais avec des copies supplémentaires de chaque symbole entourant les arguments. Les symboles extérieurs remplacent les parenthèses, et il n'est donc pas nécessaire d'avoir des parenthèses supplémentaires.
Vous devez prendre en charge l'addition, la soustraction, la multiplication, la division et les nombres réels positifs (des nombres négatifs peuvent être écrits -0-n-
) dans une plage raisonnable pour votre langue.
Le plus et le moins doivent être +
et -
, mais vous pouvez utiliser *
ou ×
pour des temps et /
ou ÷
pour diviser. D'autres symboles raisonnables seront autorisés sur demande.
Brownie pointe pour des explications et des fonctionnalités supplémentaires (comme des opérations supplémentaires, des nombres négatifs, des chaînes, etc.) Même si votre réponse n'a pas ces fonctionnalités, n'hésitez pas à montrer comment cela pourrait.
Veuillez fournir un lien pour tester votre solution si possible.
Exemples
Pour plus de clarté, les explications ci-dessous utilisent un signe moins élevé ( ¯
) pour indiquer des nombres négatifs. Vous pouvez renvoyer des nombres négatifs en utilisant n'importe quel format raisonnable.
-5-2-
→ 3
+2+×3×2×+
→ 8
( +2+×3×2×+
→ +2+6+
→ 8
)
-14--3-1--
→ 12
( -4--3-1--
→ -14-2-
→ 12
)
+2.1+×3.5×2.2×+
→ 9.8
( +2.1+×3.5×2.2×+
→ +2.1+7.7+
→ 9.8
)
×3×÷-0-6-÷2÷×
→ -9
( ×3×÷-0-6-÷2÷×
→ ×3×÷¯6÷2÷×
→ ×3ׯ3×
→ ¯9
)
÷4÷-3-÷1÷2÷-÷
→ 1.6
( ÷4÷-3-÷1÷2÷-÷
→ ÷4÷-3-0.5-÷
→ ÷4÷2.5÷
→ 1.6
)
The explanations below use high minus (`¯`) to indicate negative numbers.
Vous aimez vraiment APL.-
s peut être confondu avec-
s alors que¯
s ne peut pas être confondu avec-
s.Réponses:
C # (.NET Core) ,
198197188octetsEssayez-le en ligne!
Utilise
*
et/
.Une fonction récursive. Il essaie d'abord d'analyser la chaîne d'entrée en tant que
float
. S'il échoue, il s'appelle lui-même en passant récursivement comme arguments les premier et second opérandes puis effectue l'opération sélectionnée sur les résultats.la source
IndefOf(f, 1)
peut êtreIndexOf(f,1)
float
s à la place, utilisez les codes de caractères, lorsque vous les avez, vous pouvez probablement les raccourcir avec>
et<
à quelques endroits.i+1,s.Length-i-2
à++i,s.Length+~i
.Python 3,
159158152 152144136135132 octetsEssayez-le en ligne!
Ne permet pas les nombres négatifs (bien que
-0-5-
fonctionne bien sûr) et nécessite des opérateurs python.la source
while~-(l[i]in'+-*/'):i+=1;a=1
et*l,=input()
pour 152 octetsif a:l[i]='(';i=t(t(i+1));l[i-1]=')'
avecreturn-~i
pour 135 octets: PRétine ,
290287286 octetsEssayez-le en ligne! Remarque: Uniquement capable d'arithmétique entière, donc certains des cas de test ont été supprimés. Accepte et renvoie des nombres négatifs en utilisant le
¯
préfixe. Edit: enregistré34 octets grâce à @Cowsquack. Explication:J'avais besoin d'un moyen de gérer zéro, donc j'utilise
¦
comme préfixe de nombre positif. Les nombres sont ensuite convertis en unaires.Mais les nombres négatifs n'ont besoin que d'un
¯
préfixe.Citer
+
s devient moche, donc je transforme les ajouts en soustractions.Si la valeur absolue du LHS d'une soustraction est inférieure au RHS, inversez-les et annulez les deux côtés.
De plus, si le LHS d'une multiplication ou d'une division est négatif, annulez les deux côtés.
De plus, si le LHS d'une multiplication est nul, le résultat est nul. De plus, deux inconvénients font un plus.
Mais un moins et un plus (ou vice versa) font un moins.
Soustrayez deux nombres du même signe. Répétez cette opération jusqu'à ce qu'il ne reste plus de soustractions.
S'il y a encore une soustraction, les signes doivent être différents, alors additionnez les nombres. (Mais ne faites cela qu'une seule fois, car cela peut révéler une soustraction de deux nombres du même signe à nouveau.)
Effectuer la multiplication par addition répétée.
Effectuez une division entière. L'une des étapes ci-dessus aura simplifié l'expression, donc bouclez jusqu'à ce qu'il ne reste aucune opération.
Reconvertissez en décimal.
la source
+`-(([¯¦])1*)(1*)-\2\3-
,[¯¦]
peut devenir¯|¦
([×÷])
;)PHP ,
116114109 octets-5 merci à Martin Ender
Utilise
*
pour la multiplication et/
pour la division. Les nombres négatifs fonctionnent malgré que je ne fasse aucune tentative spécifique pour que ce soit le cas.Essayez-le en ligne!
Non golfé et expliqué
Je vais aussi expliquer le regex car c'est un peu magique:
Tout d'abord, nous voulons faire correspondre l'un des quatre opérateurs:
*+/-
Ensuite, nous devons faire correspondre un nombre
[\d.]+
ou une autre expression omnifix valide(?R)
.Ensuite, nous faisons correspondre le même opérateur qu'au début.
Ensuite, nous faisons la même chose que nous avons fait dans le groupe 3: faire correspondre un nombre ou une expression omnifix.
Enfin, faites correspondre à nouveau l'opérateur initial.
Tout ce qui correspond est remplacé par
($2)
. Cela prend la partie à l'intérieur des opérateurs environnants et la place entre crochets, de sorte qu'elle ressemble à la notation infixe normale.la source
QuadR ,
333227 octets-1 grâce à Cows Quack . -5 merci à Erik l'Outgolfer .
avec l'argument / drapeau
≡
Essayez-le en ligne!
Cela équivaut à la solution Dyalog APL de 40 octets:
Essayez-le en ligne!
Explication
(le texte entre parenthèses fait référence à Dyalog APL au lieu de QuadR)
(
...){2}\2
le schéma suivant deux fois, et le tout le match deux fois trop:(.)
tout caractère[
...]+
suivi par un ou plusieurs de l'ensemble des caractères suivants:\d
d igits,¯
MOINS (signe négatif)\.
période(
⎕R
Est R eplaced avec :)(
{
…}
Le résultat de la fonction anonyme suivante appliquée à l'espace de noms ⍵ :)⍵M
(⍵.Match
) le texte du M atch¯1↓
supprime le dernier caractère (le symbole+
-
×
ou÷
)1↓
supprime le premier caractère (symbole)⍎
exécute comme code APL(
⍕
stringify)≡
(⍣≡
) répéter le remplacement jusqu'à ce que plus aucun changement ne se produisela source
⍕
⎕R
ne peut pas fonctionner sur les données numériques. Merci.Haskell , 132 caractères
(134 octets, car
×
et÷
prenez deux octets en UTF-8)Essayez-le en ligne!
f
analyse autant d'entrée que possible et produit le résultat ainsi que la chaîne restante (qui est vide dans les cas de test). Si ce n'est pas conforme aux règles, supprimez la chaîne restante non analysable avecHaskell , 139 caractères
la source
Perl,
6453 octetsInclure
+1
pour-p
Accidentellement implémente également
,
(jette le premier argument) et parfois.
(ajoutez les arguments ensemble)..
ne fonctionne pas très fiable, car il interfère avec le point décimal à la fois au niveau de l'analyse et au niveau de l'évaluationla source
Java 8,
205200 octetsPort de la réponse C # de @Charlie .
-5 octets grâce à @ceilingcat .
Essayez-le en ligne.
la source