Descrição
A linguagem de programação imaginária (IPL) usa a notação reversa polonesa. Possui os seguintes comandos:
- i - insira o número e empurre-o para a pilha
- o - saída não destrutiva no topo da pilha (o número permanece na pilha)
- d - descarte o topo da pilha
- número inteiro - envie esse número para a pilha
- + - * - retira dois números da pilha, executa a operação correspondente e empurra o resultado para trás. Não há divisão no IPL.
O IPL funciona apenas com números inteiros e é usado para cálculos simples. Um programa IPL é escrito em uma linha e separado por espaços. String vazia é um programa IPL válido.
Programa IPL:
i i + o
Introduz dois números, soma-os e gera o resultado.
Os números de entrada e números inteiros que podem ser pressionados para empilhar estão no intervalo [-999, 999]; no entanto, a saída pode ser qualquer. Se o seu idioma não suportar grandes números, tudo bem.
Formato de entrada / saída
Você pode escolher qualquer formato de entrada / saída, desde que seja claro para entender e ler / gravar: string, lista, tokens etc.
Tarefa
Você recebe algum programa IPL, precisa otimizá-lo (reduzir o comprimento):
i 12 + 3 + o d 2 3 + d
Após a otimização se tornar
i 15 + o
Você não precisa preservar o estado da pilha, mas a quantidade de entradas e saídas e sua ordem devem corresponder ao programa original e otimizado.
Então, programa IPL:
-40 i * 2 * o i + 3 1 + o i 2 *
Após a otimização se tornar
i -80 * o i 4 o i
ou
-80 i * o i 4 o i
(observe que você precisa salvar todas as entradas, mesmo que sejam irrelevantes).
Não deve haver codificação para casos de teste, o código deve funcionar em qualquer programa IPL arbitrário e produzir o programa IPL mais curto possível que atenda aos requisitos.
Pontuação
Pontuação por código-golfe padrão.
UPDATE: alteração da pontuação para pontuação de código puro, conforme sugestão do @Sanchises.
Casos de teste:
Entrada:
(empty string)
Saída possível:
(empty string)
Entrada:
i 4 * 2 + 3 * 6 - o
Saída possível:
i 12 * o
Entrada:
1 1 + o
Saída possível:
2 o
Entrada:
i 2 + 3 + o d 2 3 + d
Saída possível:
i 5 + o
Entrada:
-40 i * 2 * o i + 3 1 + o i 2 *
Saída possível:
-80 i * o i 4 o i
Entrada:
i i 1 + i 1 + i 1 + i 1 + d d d d o
Saída possível:
i i i i i d d d d o
Entrada:
i i i 0 * * * o
Saída possível:
i i i 0 o
Entrada:
i i i 1 * * * o
Saída possível:
i i i * * o
Entrada:
i 222 + i 222 - + o
Saída possível:
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
Saída possível:
i i i i i o 1 o
Entrada:
i 1 + 2 * 1 + o
Saída possível:
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
Saída possível:
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
parai o i
(a entrada está em ordem e a saída está em ordem) ou não deve simplificá-la? (o conjunto de entrada e saída devem estar em ordem)