La multiplicación entre 2 enteros se puede reducir en una serie de sumas así
3 * 5 = 3 + 3 + 3 + 3 + 3 = 5 + 5 + 5
La exponenciación (elevar a a la potencia b ) también se puede reducir en una serie de multiplicaciones:
5 ^ 3 = 5 * 5 * 5
Por lo tanto, la exponenciación puede reducirse en una serie de adiciones, creando una expresión de multiplicación y luego en una serie de adiciones. Por ejemplo, 5 ^ 3
(5 cubos) se puede reescribir como
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
Su tarea es, dadas expresiones agregadas juntas que consisten en exponenciación, multiplicación y suma, reducirla a la serie más corta de adiciones. La expresión "más corta" se define como la expresión con el menor número de +
símbolos, utilizando solo uno de los dos números en la expresión original. Por ejemplo, la expresión más corta de 10 * 2
es 10 + 10
.
Los números involucrados en la entrada serán todos enteros positivos, y la expresión consistirá solo en +
(suma), *
(multiplicación) y ^
(exponenciación), junto con enteros y corchetes (()
) para indicar la precedencia.
La salida debe consistir en enteros positivos y +
símbolos solamente. No debe generar los pasos individuales de las reducciones, solo el resultado final. La salida puede no consistir en ningún número que no aparezca en la entrada. Sin embargo, puede usar 3 símbolos distintos en lugar de +*^
, pero diga qué símbolos son
Los espacios que separan las entradas y las salidas pueden o no usarse en sus programas, es decir, 3 * 5
pueden salir como 5 + 5 + 5
o 5+5+5
.
Tenga en cuenta que en la mayoría de los casos, la adición no se realiza realmente. El único caso en el que se debe realizar la suma es cuando tiene algo como 5 ^ (1 + 2)
, en cuyo caso, la adición es necesaria para continuar-> 5 ^ 3 -> 5 * 5 * 5 -> ...
. Ver caso de prueba # 4.
Su código no necesita manejar entradas que llegan a una expresión ambigua. Por ejemplo, (2 + 2) * (4 + 1)
. Debido a las reglas establecidas hasta ahora, el objetivo no es calcular la respuesta, sino simplificar las adiciones. Entonces, el resultado podría ser diferente dependiendo del orden en que las expresiones se resuelvan o conmuten (¿qué adiciones simplificar, cuáles dejar?). Otro ejemplo válido: ((3 + 2) ^ 2) ^ 3 -> ((3 + 2) * (3 + 2)) ^ 3 -> ???
.
Esto es código golf por lo que el código más corto gana
Casos de prueba
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
fuente
**
lugar de^
?using only one of the two numbers in the original expression.
pero la expresión original puede tener más de dos números. No entiendo por qué8 + 8
no es una salida válida para2 ^ 1 + 2 ^ 1 + 2 ^ 2 + 8 ^ 1
. Esta pregunta todavía no está clara para mí.Respuestas:
Retina , 302 bytes
Estoy seguro de que se puede jugar al golf, pero en este punto, me alegro de que funcione. Las secciones de exponenciación y multiplicación son muy similares, pero como el orden de las operaciones es importante, no sé cómo combinarlas.
y
- Exponenciaciónx
- Multiplicaciónp
- SumaPruébelo en línea : todos los casos de prueba
Convertidor de casos de prueba
Explicación
También puede notar que el grupo más utilizado es
(\(\w+\)|1+)
. Esto coincide con una expresión interna con paréntesis o un número entero. Elegí usar los símbolos que hice para poder usar en\w
lugar de una clase de caracteres. No estoy seguro de si sería mejor usar símbolos que no sean palabras y reemplazar algunas búsquedas con bordes de palabras (\b
).fuente
Mathematica,
250218183170 bytes¡Funciona! ¡Finalmente!
Define la función en
f
.La entrada es una expresión matemática simple. (es decir,
1 + 2
no"1 + 2"
).Pruébalo en línea!
Tenga en cuenta que el enlace TIO tiene un código ligeramente diferente, ya que TIO (que, supongo, usa el núcleo de Mathematica) no le gusta
Infix
. solíaRiffle
obtener la misma apariencia que Mathematica REPL.Sin golf
fuente
Mathematica,
405406 bytesDesengañado y explicado
Fui a una gran cantidad de problemas para obtener el siguiente efecto: esta función toma como entrada una expresión estándar de Mathematica, con el habitual
+
,*
y^
las operaciones (y entre paréntesis) en el mismo, y salidas de lo que parece ser una expresión estándar de Mathematica (pero con "desactivado" más signos) como la respuesta.La función anterior comienza desactivando todas las operaciones en la entrada. Luego, aplica las reglas de expansión repetidamente hasta que ya no se pueda simplificar nada. Cada vez que encuentra un producto como
2 * 3 * 4
, que se puede expandir de múltiples maneras, hace una lista de posibles expansiones y continúa. Al final, obtenemos una lista de posibles respuestas finales, y se elige la más corta.fuente