Simulador de Poções

1. Visão Geral do Problema e Arquitetura da Solução

O simulador funciona como um interpretador de comandos sequenciais. Você recebe um estado inicial (Estabilidade e Volume) e deve processar uma linha de texto contendo múltiplas instruções separadas por ponto e vírgula (;).

A cada instrução processada, três coisas podem acontecer:

  1. Alteração direta dos atributos da poção (Estabilidade e Volume).
  2. Ocorrência de um conflito de ingredientes (se adicionados consecutivamente sem uma ação intermediária).
  3. Violação de uma regra crítica de segurança (causando a interrupção imediata do preparo com FALHA).

2. Revisão dos Assuntos Pertinentes

Para resolver este problema de forma, vamos revisar alguns conceitos:

2.1. Manipulação e Higienização de Strings

As instruções fornecidas na entrada não seguem uma padronização exata. Podem conter espaços extras no início ou fim, além de letras maiúsculas e minúsculas misturadas (ex: aDiCiONAR AgUa Da lUa).

  • .lower(): Retorna uma cópia da string com todas as letras em minúsculo.
  • .strip(): Remove os espaços em branco no início e no final da string.
  • .split(separador): Divide uma string em uma lista de sub-strings com base em um caractere delimitador. Qual o caracter delimitador nesse caso?
  • Fatiamento (Slicing) ou Métodos de Verificação: Para saber se uma instrução é a adição de um ingrediente, você pode verificar se ela começa com um texto específico (ex: usar .startswith("alguma coisa") ou verificar o pedaço inicial da string instrucao[:10]).

2.2. Dicionários Aninhados (Dicionários de Dicionários)

O grimorio fornecido é uma estrutura de dados aninhada. Para acessar as informações de um item, você precisa navegar por múltiplos níveis de chaves.

Exemplo conceitual de acesso:

# Para acessar o tipo de um ingrediente específico:
tipo_do_item = grimorio['ingredientes'][nome_do_ingrediente]['tipo']

# Para acessar a alteração de estabilidade de uma ação:
alt_estabilidade = grimorio['acoes'][nome_da_acao]['estabilidade']

Dica: Se você tentar acessar uma chave que não existe no dicionário, o Python gerará um erro do tipo KeyError. Certifique-se de limpar a string do comando perfeitamente antes de usá-la como chave.

2.3. Controle de Fluxo e Estruturas de Repetição (Loops e Break)

Você precisará iterar sobre a lista de instruções. Como o enunciado diz que o preparo é interrompido imediatamente se uma das métricas falhar, lembre-se que você pode interromper qualquer tipo de laço utilizando o comando break.

As verificações de segurança devem ocorrer após cada modificação dos valores de estabilidade e volume da poção.

2.4. Variáveis de Estado

O simulador precisa “lembrar” do que aconteceu no passo anterior para identificar se houve conflito entre ingredientes.

  • Se o comando atual for a adição de um ingrediente, você deve verificar qual foi o tipo do último ingrediente adicionado.
  • Se o comando atual for uma Ação, o histórico de ingrediente anterior deve ser “limpo” ou “reiniciado”, pois ações quebram a consecutividade das adições.

Fique atento a alguns pontos como:

  1. Faz diferença eu adicionar reagente depois base ou base depois reagente?
  2. E no caso de reagente, organico e depois base? Há conflito?

3. Desestruturando a Lógica Passo a Passo

Planeje seu código antes de começar a escrever. Não dá certo resolver tudo em uma sentada!

Lembre-se:

  1. Entrada: quais são os valores de entrada? Você vai processar as instruções conforme lê ou guardando elas numa lista? Você vai “padronizar” a forma das instruções antes ou depois?
  2. Processamento: a cada instrução, à uma série de atributos sobre a poção que precisam ser atualizados. Lembre-se que, ao violar as condições de estabilidade ou volume, o processamento é interrompido imediatamente e a poção falha.
  3. Saída: após processar, você pode verificar se deu tudo certo (ou não) e o que precisa ser impresso.

4. Pontos de Maior Dificuldade dos Alunos

  • Casamento de Chaves de Conflito: No grimorio, as chaves de conflito estão estruturadas no formato 'tipo1+tipo2' (ex: 'reagente+base'). No entanto, a ordem em que os ingredientes são colocados pode variar. Se um aluno adicionar uma base e depois um reagente, a string montada pode acabar sendo 'base+reagente', que não existe no dicionário e causará um erro. É preciso pensar em uma forma de validar a combinação independentemente da ordem em que os dois tipos aparecem.
  • Extração do Nome do Ingrediente: Separar o texto fixo "adicionar " do nome real do ingrediente exige atenção com os índices de fatiamento ou com substituições de strings, lembrando sempre de higienizar o resultado.
  • Ordem das Operações no Conflito: O enunciado e a explicação passo a passo mostram que quando ocorre um conflito, os atributos do ingrediente atual alteram a poção, mas os efeitos do conflito também alteram a estabilidade e o volume. Fique atento à ordem correta descrita no exemplo do passo a passo (Teste 03) para garantir que as métricas não zerem antes da hora ou computem valores errados.
  • DICA! Apenas 40% dos casos de testes possuem conflitos na saída. Logo, antes de começar a se preocupar com os conflitos, tente codar desconsiderando essa parte e confira se você está passando nos casos sem Efeitos ocorridos:.

5. Problemas e Erros Comuns (O que EVITAR)

Não interromper o loop imediatamente após a falha:

Muitos alunos verificam as métricas apenas no final do programa, depois que o laço processou todas as instruções. Se a poção explodir ou evaporar no passo 2, nenhum outro comando subsequente deveria ser processado. Continuar a execução distorcerá os valores finais de Estabilidade e Volume.

Esquecer de resetar o histórico após uma Ação:

Se o aluno adicionar um ingrediente do tipo catalisador, depois executar a ação mexer e, em seguida, adicionar um ingrediente do tipo reagente, não deve ocorrer conflito. Se o seu código esquecer de limpar o “último tipo adicionado” quando uma ação acontece, o simulador acusará um conflito falso.

Iniciar o Volume Atual com o valor do Volume Máximo:

O volume máximo do caldeirão é o limite de capacidade (volume_maximo), mas o volume inicial do líquido da poção sempre começa em 0. Cuidado para não confundir as duas variáveis na hora de fazer contas.

Modificar o dicionário original do Grimório:

Não tente alterar a estrutura do dicionário grimorio fornecido no código base. Use-o estritamente para leitura e consulta de informações.

Não tratar espaços extras gerados pelo .split(';'):

Se a entrada terminar com um ponto e vírgula (ex: mexer; esfriar;), o método .split(';') gerará uma string vazia '' como último elemento da lista. Se o seu código tentar buscar essa string vazia no dicionário de ações ou ingredientes sem verificar antes se ela é válida, o programa quebrará com KeyError.


Bom trabalho no desenvolvimento do código! Testem cada comando isoladamente antes de juntar tudo no programa final e podem me mandar as dúvidas por email!