Descripción
El lenguaje de programación imaginario (IPL) utiliza la notación inversa polaca. Tiene los siguientes comandos:
- i - ingrese el número y empújelo a la pila
- o - salida no destructiva en la parte superior de la pila (el número permanece en la pila)
- d - descartar la parte superior de la pila
- número entero : empuje este número a la pila
- + - * - saca dos números de la pila, realiza la operación correspondiente y retrasa el resultado. No hay división en IPL.
IPL funciona solo con enteros y se utiliza para cálculos simples. Un programa de IPL se escribe en una línea y se separa por espacios. La cadena vacía es un programa de IPL válido.
Programa de IPL:
i i + o
Introduce dos números, los suma y genera el resultado.
Los números de entrada y los enteros que se pueden empujar a la pila están en el rango [-999, 999], sin embargo, la salida puede ser cualquiera. Sin embargo, si su idioma no admite números grandes, está bien.
Formato de entrada / salida
Puede elegir cualquier formato de entrada / salida siempre que sea claro para entender y leer / escribir: cadena, lista, tokens, etc.
Tarea
Le dan algún programa de IPL, necesita optimizarlo (reducir la longitud):
i 12 + 3 + o d 2 3 + d
Después de la optimización se convertirá
i 15 + o
No tiene que conservar el estado de la pila, pero la cantidad de entradas y salidas y su orden deben coincidir con el programa original y optimizado.
Entonces, el programa IPL:
-40 i * 2 * o i + 3 1 + o i 2 *
Después de la optimización se convertirá
i -80 * o i 4 o i
o
-80 i * o i 4 o i
(tenga en cuenta que debe guardar todas las entradas, incluso si son irrelevantes).
No debe haber una codificación rígida para los casos de prueba, el código debe funcionar en cualquier programa de IPL arbitrario y producir el programa de IPL más corto posible que cumpla con los requisitos.
Tanteo
Código predeterminado de puntuación de golf.
ACTUALIZACIÓN: cambió la puntuación a puntuación de golf de código puro, según la sugerencia de @Sanchises.
Casos de prueba:
Entrada:
(empty string)
Salida posible:
(empty string)
Entrada:
i 4 * 2 + 3 * 6 - o
Salida posible:
i 12 * o
Entrada:
1 1 + o
Salida posible:
2 o
Entrada:
i 2 + 3 + o d 2 3 + d
Salida posible:
i 5 + o
Entrada:
-40 i * 2 * o i + 3 1 + o i 2 *
Salida posible:
-80 i * o i 4 o i
Entrada:
i i 1 + i 1 + i 1 + i 1 + d d d d o
Salida posible:
i i i i i d d d d o
Entrada:
i i i 0 * * * o
Salida posible:
i i i 0 o
Entrada:
i i i 1 * * * o
Salida posible:
i i i * * o
Entrada:
i 222 + i 222 - + o
Salida posible:
i i + o
Entrada:
i 2 + 3 * 2 + 3 * 2 + 3 * i * d i 2 + 3 * i + d i o 2 + 2 - 0 * 1 o
Salida posible:
i i i i i o 1 o
Entrada:
i 1 + 2 * 1 + o
Salida posible:
i 2 * 3 + o
Entrada:
1 1 + o i 2 + 3 + o d 2 3 + d 4 i * 2 * o i + 3 1 + o i 2 * i i 1 + i 1 + i 1 + i 1 + d d d d o i i i 0 * * * o i i i 1 * * * o i 2 + i 2 - + o i 2 + 3 * 2 + 3 * 2 + 3 * i * d i 2 + 3 * i + d i o 2 + 2 - 0 * 1 o
Salida posible:
2 o i 5 + o 8 i * o i 4 o i i i i i i d d d d o i i i 0 o i i i * * * o i i + o i i i i i o 1 o
i i d o
ai o i
(la entrada está en orden y la salida está en orden) o no debe simplificarlo? (el conjunto de entradas y salidas debe estar en orden)