La multiplication entre 2 entiers peut être réduite en une série d'addition comme ça
3 * 5 = 3 + 3 + 3 + 3 + 3 = 5 + 5 + 5
L'exponentiation (élevant a à la puissance b ) peut également être réduite en une série de multiplications:
5 ^ 3 = 5 * 5 * 5
Par conséquent, l'exponentiation peut être réduite en une série d'additions, en créant une expression de multiplication, puis en une série d'additions. Par exemple, 5 ^ 3
(5 cubes) peut être réécrit en
5 ^ 3 = 5 * 5 * 5
= (5 + 5 + 5 + 5 + 5) * 5
= (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5) + (5 + 5 + 5 + 5 + 5)
= 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5
Votre tâche consiste, compte tenu des expressions additionnées consistant en l'exponentiation, la multiplication et l'addition, à la réduire à la plus courte série d'additions. L'expression "la plus courte" est définie comme l'expression avec le moins de +
symboles, en utilisant toujours un seul des deux nombres dans l'expression d'origine. Par exemple, l'expression la plus courte de 10 * 2
est 10 + 10
.
Les nombres impliqués dans l'entrée seront tous des entiers positifs, et l'expression consistera uniquement en +
(addition), *
(multiplication) et ^
(exponentiation), ainsi que des entiers et des crochets ( ()
) pour indiquer la priorité.
La sortie doit être constituée +
uniquement d' entiers positifs et de symboles. Vous ne devez pas sortir les étapes individuelles des réductions, juste la sortie finale. La sortie peut ne pas être composée de chiffres qui n'apparaissent pas dans l'entrée. Cependant, vous pouvez utiliser 3 symboles distincts au lieu de +*^
, mais veuillez indiquer de quels symboles il s'agit.
Les espaces séparant les entrées et les sorties peuvent ou non être utilisés dans vos programmes, c'est-à-dire qu'ils 3 * 5
peuvent être sortis en tant que 5 + 5 + 5
ou 5+5+5
.
Notez que dans la plupart des cas, l'ajout n'est pas réellement effectué. Le seul cas où l'addition doit être effectuée est lorsque vous avez quelque chose comme 5 ^ (1 + 2)
, auquel cas, l'addition est nécessaire pour continuer -> 5 ^ 3 -> 5 * 5 * 5 -> ...
. Voir le cas de test n ° 4.
Votre code n'a pas besoin de gérer les entrées qui arrivent à une expression ambiguë. Par exemple (2 + 2) * (4 + 1)
,. En raison des règles énoncées jusqu'à présent, l'objectif n'est pas de calculer la réponse, l'objectif est de simplifier les ajouts. Ainsi, le résultat pourrait être différent selon l'ordre dans lequel les expressions sont résolues ou commutées (quels ajouts simplifier, lesquels laisser?). Un autre exemple invalide: ((3 + 2) ^ 2) ^ 3 -> ((3 + 2) * (3 + 2)) ^ 3 -> ???
.
C'est le code-golf donc le code le plus court gagne
Cas de test
Input => output
5 ^ 3 + 4 * 1 ^ 5 => 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 4
2 ^ 1 * 2 + 3 + 9 => 2 + 2 + 3 + 9
2 ^ 1 * (2 + 3) + 9 => 2 + 3 + 2 + 3 + 9
2 ^ (1 * (2 + 3)) + 9 => 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 9
10 + 3 * 2 + 33 ^ 2 => 10 + 3 + 3 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33 + 33
100 * 3 => 100 + 100 + 100
2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1 => 2 + 2 + 2 + 2 + 8
(1 + 2 + 5 * 8 + 2 ^ 4) * 2 => 1 + 2 + 8 + 8 + 8 + 8 + 8 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 1 + 2 + 8 + 8 + 8 + 8 + 8 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2
la source
**
place de^
?using only one of the two numbers in the original expression.
mais l'expression originale peut avoir plus de deux nombres. Je ne comprends pas pourquoi8 + 8
n'est pas une sortie valide pour2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1
. Cette question n'est toujours pas très claire pour moi.Réponses:
Rétine , 302 octets
Je suis sûr que cela peut être joué au golf, mais à ce stade, je suis juste content que cela fonctionne. Les sections d'exponentiation et de multiplication sont toutes deux très similaires, mais comme l'ordre des opérations est important, je ne sais pas comment les combiner.
y
- Exponentiationx
- Multiplicationp
- AdditionEssayez-le en ligne - tous les cas de test
Convertisseur de cas de test
Explication
Vous pouvez également remarquer que le groupe le plus utilisé est
(\(\w+\)|1+)
. Cela correspond à une expression interne avec des parenthèses ou un entier. J'ai choisi d'utiliser les symboles que j'ai faits pour pouvoir utiliser\w
plutôt qu'une classe de caractères. Je ne sais pas s'il serait préférable d'utiliser des symboles autres que des mots et de remplacer certains contournements par des bordures de mots (\b
).la source
Mathematica,
250218183170 octetsÇa marche! Finalement!
Définit la fonction dans
f
.L'entrée est une expression mathématique simple. (c'est-à-dire
1 + 2
non"1 + 2"
).Essayez-le en ligne!
Notez que le lien TIO a un code légèrement différent, comme TIO (qui, je suppose, utilise le noyau Mathematica) n'aime pas
Infix
. J'ai utilisé à laRiffle
place pour obtenir la même apparence que Mathematica REPL.Non golfé
la source
Mathematica,
405406 octetsNon golfé et expliqué
Je suis allé à beaucoup de mal pour obtenir l'effet suivant: cette fonction prend en entrée une expression standard Mathematica, avec l'habitude
+
,*
et les^
opérations (et entre parenthèses) en elle, et les sorties ce qui ressemble à une expression classique Mathematica (mais avec "désactivé" plus signes) comme réponse.La fonction ci-dessus commence par désactiver toutes les opérations dans l'entrée. Ensuite, il applique les règles d'extension à plusieurs reprises jusqu'à ce que rien ne puisse plus être simplifié. Chaque fois qu'il rencontre un produit tel que
2 * 3 * 4
, qui peut être étendu de plusieurs façons, il fait une liste des extensions possibles et continue. À la fin, nous obtenons une liste de réponses finales possibles, et la plus courte est choisie.la source