Introdução
Forte é uma linguagem esotérica muito peculiar, baseada no conceito de modificação dos valores dos números. Em números fortes, não são constantes, mas variáveis, você pode usar a LET
instrução para atribuir novos valores a eles.
Por exemplo, depois de executar a LET 2=4-1
partir de agora 2
assume o valor de 3
, o que significa que sempre que o valor 2
aparece em uma expressão, ele é "substituído" por 3
. A expressão (1+1)*2
agora seria avaliada como 9
.
Esta instrução em Forte é usada tanto para armazenar informações quanto para controle de fluxo (as linhas são numeradas e, alterando o valor de seus números, você pode determinar a ordem de sua execução). Neste desafio, não trataremos desse segundo aspecto.
O desafio
Você precisa escrever um intérprete para um subconjunto simplificado das LET
expressões de Forte .
Você receberá como entrada uma série de linhas seguindo esta gramática:
<line>::= <number>=<expression>
<expression>::= <number>|<expression>+<number>
Nota: esta gramática não é válida Forte porque não possui números de linhas, LET e parênteses (que são sempre obrigatórios)
Ou seja, você só precisará lidar com somas de computação e atribuir valores a números. Parênteses não estarão presentes na entrada e cada expressão precisará ser avaliada da esquerda para a direita: cuidado para que resultados parciais sejam afetados por redefinições!
Os números sempre serão números inteiros não negativos, até o limite do tipo inteiro nativo do seu idioma (ou 2 ^ 32, o que for maior).
Para cada linha, você deve exibir o resultado da expressão e atribuir esse resultado ao valor (possivelmente reatribuído) do primeiro número, o que afetará como as linhas a seguir serão interpretadas.
Este é o código-golfe , o código mais curto (em bytes) vence!
Outras regras
- O formato de entrada é flexível, você pode, por exemplo, pegar uma única string com novas linhas, uma lista de strings, uma lista de listas de números ... O mesmo vale para a saída, desde que fique claro qual é o resultado de cada expressão em a entrada.
- Você pode enviar uma função, um programa completo ou uma solução para ser executada em um ambiente REPL, chamando-o uma vez para cada linha.
- As brechas padrão são proibidas, em particular você não pode chamar um intérprete externo Forte no seu código.
Exemplos
Tudo isso faz parte da mesma entrada. Após cada linha, a saída esperada em relação a essa linha é mostrada, às vezes com um comentário indicando redesignações relevantes (não parte da saída necessária).
5=4
4
6=5
4 # 5 -> 4
7=1+2+5
7
7=5+2+1
4 # Order of operations matters! 5+2 -> 4+2 -> 6 -> 4
18=5+6+7
12
5=3
3 # Remember: 5 -> 4
10=6+4
3 # 6 -> 4 -> 3, 3+3 = 6 -> 3
0
é válido ("Os números sempre serão números inteiros não negativos")
0
um número válido?