Na notação de prefixo, o operador vem antes dos argumentos, então você pode imaginar que o operador chama next()
que é chamado recursivamente. Na notação infix, o operador fica entre os argumentos, para que você possa imaginá-lo simplesmente como uma árvore de análise. Na notação postfix, o operador vem após os argumentos, para que você possa imaginá-lo como baseado em pilha.
Em qualquer notação de correção, o operador pode ir a qualquer lugar * . Se um operador aparecer e não houver argumentos suficientes, o operador aguardará até que haja argumentos suficientes. Para esse desafio, você deve implementar um avaliador anyfix muito básico. (Observe que anyfix é uma linguagem recreativa que eu abandonei e que você pode brincar aqui ou conferir aqui )
Você precisará suportar os seguintes comandos:
(Aridade 1)
- duplicado
- negativo
(Aridade 2)
- Adição
- multiplicação
- igualdade: retorna
0
ou1
.
Você pode optar por usar quaisquer cinco símbolos que não sejam espaços em branco para esses comandos. Para fins demonstrativos, usarei "
como duplicado, ×
como multiplicação e +
como adição.
Para literais, você precisa apenas suportar números inteiros não negativos, mas seu intérprete deve poder conter todos os números inteiros (dentro do intervalo de números inteiros (razoáveis) do seu idioma).
Vamos dar uma olhada em um exemplo: 10+5
. O armazenamento deve se comportar como uma pilha, não como uma fila. Então, primeiro, a pilha começa em []
e a lista de operadores em fila começa em []
. Em seguida, 10
é avaliado o literal que compõe a pilha [10]
. Em seguida, o operador +
é avaliado, o que requer dois argumentos. No entanto, há apenas um argumento na pilha, portanto, a lista de operadores na fila se torna ['+']
. Em seguida, 5
é avaliado o literal que compõe a pilha [10, 5]
. Nesse ponto, o operador '+'
pode ser avaliado como está, criando a pilha [15]
e a fila []
.
O resultado final deve ser [15]
de + 10 5
, 10 + 5
e 10 5 +
.
Vamos dar uma olhada em um exemplo mais difícil: 10+"
. A pilha e a fila começam como []
e []
. 10
é avaliado primeiro, o que faz a pilha [10]
. Em seguida, +
é avaliado, o que não altera a pilha (porque não há argumentos suficientes) e faz a fila ['+']
. Então, "
é avaliado. Isso pode ser executado imediatamente, criando a pilha [10, 10]
. +
agora pode ser avaliado para que a pilha se torne [20]
e a fila []
. O resultado final é [20]
.
E a ordem das operações?
Vamos dar uma olhada ×+"10 10
. A pilha e a fila iniciam como []
:
×
: A pilha permanece inalterada e a fila se torna['×']
.+
: A pilha permanece inalterada e a fila se torna['×', '+']
."
: A pilha permanece inalterada e a fila se torna['×', '+', '"']
.10
: A pilha se torna[10]
. Mesmo que×
deva ser o primeiro operador a ser avaliado desde que aparece primeiro,"
pode ser executado imediatamente e nenhum dos operadores antes, por isso é avaliado. A pilha se torna[10, 10]
e a fila['×', '+']
.×
agora pode ser avaliada, o que faz com que a pilha[100]
e a fila['+']
.10
: A pilha se torna[100, 10]
, o que permite+
ser avaliado. A pilha se torna[110]
e a fila[]
.
O resultado final é [110]
.
Os comandos usados nessas demonstrações são consistentes com os da linguagem anyfix; no entanto, o último exemplo não funcionará devido a um erro no meu intérprete. (Isenção de responsabilidade: seus envios não serão usados no intérprete anyfix)
Desafio
Selecione um conjunto de 5 caracteres que não sejam espaços em branco e que não digam dígitos e crie um interpretador anyfix de acordo com as especificações acima. Seu programa pode gerar a matriz singular ou o valor contido nela; é garantido que a pilha de valores contenha apenas um único valor no final da execução e que a fila de operadores fique vazia no final da execução.
Isso é código-golfe, portanto o código mais curto em bytes vence.
Casos de teste
Para esses casos de teste, duplicado é "
, negativo é -
, adição é +
, multiplicação é ×
e igualdade é =
.
Input -> Output
1+2×3 -> 9
1"+"+ -> 4
2"××" -> 16
3"×+" -> 18
3"+×" -> 36
123"= -> 1 ("= always gives 1)
1+2=3 -> 1
1"=2+ -> 3
1-2-+ -> -3
-1-2+ -> 3 (hehe, the `-1` becomes `+1` at the `-` rather than making the `2` a `-1`)
+×"10 10 -> 200 (after the 10 is duplicated (duplication is delayed), 10 + 10 is performed and then 20 * 10, giving 200)
Regras
- As brechas padrão se aplicam
- Você pode pegar o intérprete oficial anyfix e jogar golfe, se desejar. Espere perder terrivelmente.
A entrada será dada como uma sequência e a saída como uma matriz, um único número inteiro, fora da representação da sequência. Você pode assumir que a entrada conterá apenas espaços, dígitos e os 5 caracteres que você escolher.
* na verdade não
0
e 1
?
×+"10 10
nos casos de teste ou em qualquer outro exemplo que seja 1) usar um espaço em branco e 2) atrasar o uso do operador duplicado (duas coisas que perdi completamente).